{"record":{"id":"8d3fdfdf39a3d63f","repo":"OpenNHP/opennhp","slug":"failed-to-create-aes-cipher-for-cbc-w","errorCode":null,"errorMessage":"failed to create AES cipher for CBC: %w","messagePattern":"failed to create AES cipher for CBC: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"nhp/core/crypto.go","lineNumber":195,"sourceCode":"\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to create ChaCha20-Poly1305: %w\", err)\n\t\t}\n\t\treturn aead, nil\n\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"unsupported GCM type: %d\", t)\n\t}\n}\n\nfunc CBCEncryption(t GcmTypeEnum, key *[SymmetricKeySize]byte, plaintext []byte, inPlace bool) ([]byte, error) {\n\tvar block cipher.Block\n\tvar iv []byte\n\tvar err error\n\tswitch t {\n\tcase GCM_AES256:\n\t\tblock, err = aes.NewCipher(key[:])\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to create AES cipher for CBC: %w\", err)\n\t\t}\n\t\tiv = key[8:24]\n\n\tcase GCM_SM4:\n\t\tblock, err = sm4.NewCipher(key[:16])\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to create SM4 cipher for CBC: %w\", err)\n\t\t}\n\t\tiv = key[16:]\n\n\tcase GCM_CHACHA20POLY1305:\n\t\treturn nil, ErrNotApplicable\n\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"unsupported cipher type for CBC: %d\", t)\n\t}\n\n\tvar paddedPlainText []byte","sourceCodeStart":177,"sourceCodeEnd":213,"githubUrl":"https://github.com/OpenNHP/opennhp/blob/6e04ca5ff03222a699c24205cd4bf8fee9af7ffe/nhp/core/crypto.go#L177-L213","documentation":"CBCEncryption(GCM_AES256, key, ...) wraps aes.NewCipher(key[:]) failure as this message. As with the AEAD path, Go's aes.NewCipher only fails for key lengths other than 16/24/32 bytes; with the fixed 32-byte SymmetricKeySize array this is practically unreachable and points to nil/misformed key material or dependency issues. It occurs while setting up the AES-CBC block cipher (AES-256, IV taken from key[8:24]).","triggerScenarios":"Calling CBCEncryption with a nil *[SymmetricKeySize]byte, an under-filled key array, or after changing SymmetricKeySize to a value that is not 16/24/32; also via dependency corruption.","commonSituations":"Custom bulk-encryption code paths (e.g. DHP payload encryption) that receive a key before the ECDH/KDF step completed; refactors resizing SymmetricKeySize; forks altering the crypto stack.","solutions":["Populate the key array completely via a successful key-exchange/KDF before calling CBCEncryption","Check the wrapped error for the underlying key-length complaint","Keep SymmetricKeySize at 32 (or another AES-legal 16/24/32) and re-verify all call sites after any resize","Remember ChaCha20-Poly1305 returns ErrNotApplicable for CBC — route those callers to an AEAD function instead"],"exampleFix":"// before\nvar key [core.SymmetricKeySize]byte // never filled\nciphertext, _ := core.CBCEncryption(core.GCM_AES256, &key, plaintext, false)\n// after\nshared := ecdh.SharedSecret(peerPub)\nvar key [core.SymmetricKeySize]byte\nutils.Memcpy(key[:], kdf(shared))\nciphertext, err := core.CBCEncryption(core.GCM_AES256, &key, plaintext, false)\nif err != nil {\n    return fmt.Errorf(\"cbc encrypt: %w\", err)\n}","handlingStrategy":"try-catch","validationCode":"if key == nil {\n    return errors.New(\"CBC key not initialized\")\n}\nif core.SymmetricKeySize != 16 && core.SymmetricKeySize != 24 && core.SymmetricKeySize != 32 {\n    return fmt.Errorf(\"SymmetricKeySize %d invalid for AES-CBC\", core.SymmetricKeySize)\n}","typeGuard":null,"tryCatchPattern":"ciphertext, err := core.CBCEncryption(core.GCM_AES256, &key, plaintext, false)\nif err != nil {\n    if errors.Is(err, core.ErrNotApplicable) {\n        return errors.New(\"CBC not available for this cipher - use AEAD\")\n    }\n    return fmt.Errorf(\"AES-CBC encrypt failed: %w\", err)\n}","preventionTips":["Complete key derivation before bulk CBC encryption","Keep SymmetricKeySize at an AES-legal length (16/24/32)","Use AEAD (AeadFromKey) for new code; CBC is legacy path with static IV from the key"],"tags":["crypto","aes","cbc","key-length"],"backgroundTag":"invalid-argument-value","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"}