{"record":{"id":"35577737bdb10c28","repo":"hyperledger/fabric","slug":"malformed-signature-format","errorCode":null,"errorMessage":"malformed signature format","messagePattern":"malformed signature format","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"orderer/consensus/smartbft/verifier.go","lineNumber":223,"sourceCode":"\n\treturn v.ReqInspector.requestIDFromSigHeader(req.sigHdr)\n}\n\n// VerifyConsenterSig verifies consenter signature\nfunc (v *Verifier) VerifyConsenterSig(signature types.Signature, prop types.Proposal) ([]byte, error) {\n\tid2Identity := v.RuntimeConfig.Load().(RuntimeConfig).ID2Identities\n\n\tidentity, exists := id2Identity[signature.ID]\n\tif !exists {\n\t\treturn nil, errors.Errorf(\"node with id of %d doesn't exist\", signature.ID)\n\t}\n\n\tsig := &Signature{}\n\tif err := sig.Unmarshal(signature.Msg); err != nil {\n\t\tv.Logger.Errorf(\"Failed unmarshaling signature from %d: %v\", signature.ID, err)\n\t\tv.Logger.Errorf(\"Offending signature Msg: %s\", base64.StdEncoding.EncodeToString(signature.Msg))\n\t\tv.Logger.Errorf(\"Offending signature Value: %s\", base64.StdEncoding.EncodeToString(signature.Value))\n\t\treturn nil, errors.Wrap(err, \"malformed signature format\")\n\t}\n\n\tif err := v.verifySignatureIsBoundToProposal(sig, signature.ID, prop); err != nil {\n\t\treturn nil, err\n\t}\n\n\texpectedMsgToBeSigned := util.ConcatenateBytes(sig.OrdererBlockMetadata, sig.IdentifierHeader, sig.BlockHeader, nil)\n\tsignedData := &protoutil.SignedData{\n\t\tSignature: signature.Value,\n\t\tData:      expectedMsgToBeSigned,\n\t\tIdentity:  identity,\n\t}\n\n\treturn nil, v.ConsenterVerifier.Evaluate([]*protoutil.SignedData{signedData})\n}\n\n// VerificationSequence returns verification sequence\nfunc (v *Verifier) VerificationSequence() uint64 {","sourceCodeStart":205,"sourceCodeEnd":241,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/orderer/consensus/smartbft/verifier.go#L205-L241","documentation":"VerifyConsenterSig unmarshals the signature message bytes into the local Signature protobuf. If those bytes do not decode into the expected Signature message, the error wraps the unmarshal failure as 'malformed signature format', indicating corrupted or non-protobuf signature data.","triggerScenarios":"signature.Msg passed to VerifyConsenterSig is not a valid protobuf encoding of the Signature message — truncated bytes, wrong serialization, or bytes produced by a different code path/version.","commonSituations":"Corrupted signature over the network or in a persisted proposal/wal file; a fork/mismatch of the smartbft signature proto between nodes running different versions; middleware re-encoding the message as base64 or JSON instead of raw protobuf.","solutions":["Re-request the signature from the originating consenter — the payload is likely corrupted","Verify all cluster nodes run compatible fabric/smartbft versions with the same Signature proto","Check any persistence (WAL/proposal store) for corruption and truncate the bad entry","Ensure no intermediary layer transforms signature.Msg before verification"],"exampleFix":"// before: sig.Msg re-encoded as base64 string bytes\nsig.Msg = []byte(base64.StdEncoding.EncodeToString(raw))\n// after: keep raw protobuf bytes\nsig.Msg = raw // protobuf-serialized Signature message","handlingStrategy":"try-catch","validationCode":"sig := &Signature{}\nif err := proto.Unmarshal(signature.Msg, sig); err != nil {\n    return fmt.Errorf(\"pre-check: invalid signature bytes from %d\", signature.ID)\n}","typeGuard":"func isWellFormedSignature(msg []byte) bool { s := &Signature{}; return proto.Unmarshal(msg, s) == nil && len(s.Value) > 0 }","tryCatchPattern":"identities, err := verifier.VerifyConsenterSig(signature, proposal)\nif err != nil && strings.Contains(err.Error(), \"malformed signature format\") {\n    logger.Warnf(\"dropping corrupted signature from %d\", signature.ID)\n    return nil\n}","preventionTips":["Never re-encode signature.Msg (e.g. base64) before verification","Keep fabric/smartbft versions identical across nodes","Validate persisted WAL/proposal entries before replay","Checksum signatures in transit to catch corruption"],"tags":["smartbft","fabric","protobuf","signature"],"backgroundTag":"malformed-signature-format","analyzedSha":"2736b63f8fd5932511d56fe68b7039d15977f7f6","analyzedAt":"2026-09-04T08:52:36.465Z","contentChangedAt":"2026-09-04T08:52:36.465Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}