@@ -84,6 +84,14 @@ int32_t EncryptModeDispatcher::encrypt(
8484 throw std::runtime_error (" Encryption key cannot be NULL" );
8585 }
8686
87+ // Handle NULL IV: pass nullptr and 0 to trigger auto-generation
88+ const char * actual_iv = iv_validity ? iv : nullptr ;
89+ int32_t actual_iv_len = iv_validity ? iv_len : 0 ;
90+
91+ // Handle NULL fifth_argument (e.g., AAD for GCM)
92+ const char * actual_fifth_arg = fifth_argument_validity ? fifth_argument : nullptr ;
93+ int32_t actual_fifth_arg_len = fifth_argument_validity ? fifth_argument_len : 0 ;
94+
8795 switch (ParseEncryptionMode (mode, mode_len, mode_validity)) {
8896 case EncryptionMode::ECB:
8997 case EncryptionMode::ECB_PKCS7:
@@ -93,13 +101,13 @@ int32_t EncryptModeDispatcher::encrypt(
93101 case EncryptionMode::CBC:
94102 case EncryptionMode::CBC_PKCS7:
95103 return aes_encrypt_cbc (plaintext, plaintext_len, key, key_len,
96- iv, iv_len , true , cipher);
104+ actual_iv, actual_iv_len , true , cipher);
97105 case EncryptionMode::CBC_NONE:
98106 return aes_encrypt_cbc (plaintext, plaintext_len, key, key_len,
99- iv, iv_len , false , cipher);
107+ actual_iv, actual_iv_len , false , cipher);
100108 case EncryptionMode::GCM:
101109 return aes_encrypt_gcm (plaintext, plaintext_len, key, key_len,
102- iv, iv_len, fifth_argument, fifth_argument_len , cipher);
110+ actual_iv, actual_iv_len, actual_fifth_arg, actual_fifth_arg_len , cipher);
103111 case EncryptionMode::NULL_VALUE:
104112 throw std::runtime_error (BuildUnsupportedModeError (" encryption" , " NULL" , 4 ));
105113 case EncryptionMode::UNKNOWN:
@@ -120,6 +128,14 @@ int32_t EncryptModeDispatcher::decrypt(
120128 throw std::runtime_error (" Decryption key cannot be NULL" );
121129 }
122130
131+ // Handle NULL IV: pass nullptr and 0 to extract IV from ciphertext
132+ const char * actual_iv = iv_validity ? iv : nullptr ;
133+ int32_t actual_iv_len = iv_validity ? iv_len : 0 ;
134+
135+ // Handle NULL fifth_argument (e.g., AAD for GCM)
136+ const char * actual_fifth_arg = fifth_argument_validity ? fifth_argument : nullptr ;
137+ int32_t actual_fifth_arg_len = fifth_argument_validity ? fifth_argument_len : 0 ;
138+
123139 switch (ParseEncryptionMode (mode, mode_len, mode_validity)) {
124140 case EncryptionMode::ECB:
125141 case EncryptionMode::ECB_PKCS7:
@@ -129,14 +145,14 @@ int32_t EncryptModeDispatcher::decrypt(
129145 case EncryptionMode::CBC:
130146 case EncryptionMode::CBC_PKCS7:
131147 return aes_decrypt_cbc (ciphertext, ciphertext_len, key, key_len,
132- iv, iv_len , true , plaintext);
148+ actual_iv, actual_iv_len , true , plaintext);
133149 case EncryptionMode::CBC_NONE:
134150 // CBC mode without padding
135151 return aes_decrypt_cbc (ciphertext, ciphertext_len, key, key_len,
136- iv, iv_len , false , plaintext);
152+ actual_iv, actual_iv_len , false , plaintext);
137153 case EncryptionMode::GCM:
138154 return aes_decrypt_gcm (ciphertext, ciphertext_len, key, key_len,
139- iv, iv_len, fifth_argument, fifth_argument_len , plaintext);
155+ actual_iv, actual_iv_len, actual_fifth_arg, actual_fifth_arg_len , plaintext);
140156 case EncryptionMode::UNKNOWN:
141157 default :
142158 if (!mode_validity) {
0 commit comments