{"record":{"id":"b844965cb9225254","repo":"OpenNHP/opennhp","slug":"failed-to-create-zlib-reader-v","errorCode":null,"errorMessage":"failed to create zlib reader: %v","messagePattern":"failed to create zlib reader: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"nhp/core/verifier/verifier.go","lineNumber":64,"sourceCode":"\tfallbackVerifier := &FallbackVerifier{}\n\n\terr := json.Unmarshal(evidence, fallbackVerifier)\n\tif err != nil {\n\t\treturn nil, err\n\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)","sourceCodeStart":46,"sourceCodeEnd":82,"githubUrl":"https://github.com/OpenNHP/opennhp/blob/6e04ca5ff03222a699c24205cd4bf8fee9af7ffe/nhp/core/verifier/verifier.go#L46-L82","documentation":"Raised in verifier.NewVerifier after base64-decoding the compressed evidence: zlib.NewReader over the decoded bytes failed, meaning the payload is not a valid zlib stream (wrong compression, truncated data, or plain JSON passed without compression). The evidence cannot be decompressed for appraisal.","triggerScenarios":"NewVerifier receives base64 of data that is raw JSON, gzip-compressed, or otherwise not zlib-wrapped.","commonSituations":"Producer switched compression (e.g. gzip or none) but consumer still expects zlib; hand-crafted test evidence that was base64-encoded without zlib compression; version mismatch between agent (producer) and server (consumer).","solutions":["Ensure the producer compresses with zlib.NewWriter (like engine.GetEvidenceWithCCUrl does) before base64-encoding","If the payload is gzip, switch the consumer to gzip.NewReader or change the producer to zlib","Decode the base64 first and hex-dump the first 2 bytes: a zlib stream starts with 0x78 (or similar CMF/FLG pair); 0x1f8b means gzip, '{' means raw JSON"],"exampleFix":"// before\nr, err := zlib.NewReader(bytes.NewReader(compressedEvidence)) // fails on gzip input\n// after\nif br, _ := bytes.NewReader(compressedEvidence), 0; compressedEvidence[0]==0x1f {\n    r, err = gzip.NewReader(bytes.NewReader(compressedEvidence))\n} else {\n    r, err = zlib.NewReader(bytes.NewReader(compressedEvidence))\n}","handlingStrategy":"validation","validationCode":"raw, err := base64.StdEncoding.DecodeString(s)\nif err == nil && len(raw) > 1 && raw[0] != 0x78 {\n    return fmt.Errorf(\"payload is not zlib (first byte 0x%02x)\", raw[0])\n}","typeGuard":null,"tryCatchPattern":"if v, err := verifier.NewVerifier(evidenceB64); err != nil {\n    if strings.Contains(err.Error(), \"failed to create zlib reader\") {\n        // producer used wrong compression; request zlib-wrapped evidence\n    }\n}","preventionTips":["Standardize on zlib (compress/zlib.Writer + Close) on the producer side","Sniff the first byte (0x78=zlib, 0x1f=gzip) to detect format drift early","Pin producer/consumer versions in integration tests"],"tags":["zlib","compression","attestation","go"],"backgroundTag":"invalid-argument-format","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"}