{"record":{"id":"e76ef1286e35c0a0","repo":"OpenNHP/opennhp","slug":"failed-to-read-evidence-v","errorCode":null,"errorMessage":"failed to read evidence: %v","messagePattern":"failed to read evidence: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"nhp/core/verifier/verifier.go","lineNumber":69,"sourceCode":"\t}\n\n\treturn fallbackVerifier, nil\n}\n\nfunc NewVerifier(compressedEvienceBase64 string) (Verifier, error) {\n\tcompressedEvidence, err := base64.StdEncoding.DecodeString(compressedEvienceBase64)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to decode evidence: %v\", err)\n\t}\n\n\tr, err := zlib.NewReader(bytes.NewReader(compressedEvidence))\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to create zlib reader: %v\", err)\n\t}\n\tdefer r.Close()\n\tevidenceBytes, err := io.ReadAll(r)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to read evidence: %v\", err)\n\t}\n\n\tvar evidence map[string]any\n\n\terr = json.Unmarshal(evidenceBytes, &evidence)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to unmarshal evidence: %v\", err)\n\t}\n\n\tvar verifier Verifier\n\n\tif _, ok := evidence[\"test_purpose\"]; ok {\n\t\tverifier, err = NewFallbackVerifier(evidenceBytes)\n\t} else {\n\t\tverifier, err = csv.NewAttestation(string(evidenceBytes))\n\t}\n\n\tif err != nil {","sourceCodeStart":51,"sourceCodeEnd":87,"githubUrl":"https://github.com/OpenNHP/opennhp/blob/6e04ca5ff03222a699c24205cd4bf8fee9af7ffe/nhp/core/verifier/verifier.go#L51-L87","documentation":"Raised in verifier.NewVerifier when io.ReadAll on the zlib stream errors: the zlib header parsed but the stream is truncated or corrupt, so the decompressed evidence could not be read to completion (network truncation of the base64 blob or partial encoding on the producer side).","triggerScenarios":"NewVerifier gets a truncated zlib stream (partial file/network cut), or bytes were altered after compression causing a deflate checksum/structure error.","commonSituations":"Evidence written to disk incompletely before the agent crashed; message size limits truncating the base64 payload in transit; storage layer corrupting binary blobs; concurrent writes to the evidence buffer.","solutions":["Re-fetch or re-request the evidence from the agent; verify the base64 length matches the producer's output","Have the producer call zlib Writer.Close() before encoding (unclosed streams are truncated)","Add integrity protection (hash/checksum) over the compressed payload and verify before decompression"],"exampleFix":null,"handlingStrategy":"retry","validationCode":"raw, _ := base64.StdEncoding.DecodeString(s)\nif _, err := zlib.NewReader(bytes.NewReader(raw)); err != nil { return err }\n// optionally verify an upstream checksum here","typeGuard":null,"tryCatchPattern":"var v verifier.Verifier\nfor i := 0; i < 3; i++ {\n    v, err = verifier.NewVerifier(fetchEvidence())\n    if err == nil || !strings.Contains(err.Error(), \"failed to read evidence\") { break }\n    time.Sleep(200*time.Millisecond)\n}","preventionTips":["Have producers call w.Close() before base64-encoding","Include a checksum over the compressed payload","Avoid truncation by not embedding evidence in size-limited fields (e.g. UDP packets, log lines)"],"tags":["zlib","corruption","truncated-data","go"],"backgroundTag":"file-read-failed","analyzedSha":"6e04ca5ff03222a699c24205cd4bf8fee9af7ffe","analyzedAt":"2026-09-07T15:44:59.941Z","contentChangedAt":"2026-09-07T15:44:59.941Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}