Skip to content

Commit dbf3e88

Browse files
Checkpoint
1 parent 862be21 commit dbf3e88

2 files changed

Lines changed: 629 additions & 400 deletions

File tree

cpp/src/gandiva/encrypt_mode_dispatcher.cc

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)