[fix](function) fix AES/SM3/SM4 encrypt/ decrypt algorithm initialization vector bug (#17420)
ECB algorithm, block_encryption_mode does not take effect, it only takes effect when init vector is provided. Solved: 192/256 supports calculation without init vector For other algorithms, an error should be reported when there is no init vector Initialization Vector. The default value for the block_encryption_mode system variable is aes-128-ecb, or ECB mode, which does not require an initialization vector. The alternative permitted block encryption modes CBC, CFB1, CFB8, CFB128, and OFB all require an initialization vector. Reference: https://dev.mysql.com/doc/refman/8.0/en/encryption-functions.html#function_aes-decrypt Note: This fix does not support smooth upgrades. during upgrade process, query may report error: funciton not found
This commit is contained in:
@ -154,7 +154,8 @@ static void exectue_result(std::vector<const ColumnString::Offsets*>& offsets_li
|
||||
template <typename Impl, EncryptionMode mode, bool is_encrypt>
|
||||
struct EncryptionAndDecryptTwoImpl {
|
||||
static DataTypes get_variadic_argument_types_impl() {
|
||||
return {std::make_shared<DataTypeString>(), std::make_shared<DataTypeString>()};
|
||||
return {std::make_shared<DataTypeString>(), std::make_shared<DataTypeString>(),
|
||||
std::make_shared<DataTypeString>()};
|
||||
}
|
||||
|
||||
static Status vector_vector(std::vector<const ColumnString::Offsets*>& offsets_list,
|
||||
@ -167,6 +168,17 @@ struct EncryptionAndDecryptTwoImpl {
|
||||
continue;
|
||||
}
|
||||
EncryptionMode encryption_mode = mode;
|
||||
int mode_size = (*offsets_list[2])[i] - (*offsets_list[2])[i - 1];
|
||||
const auto mode_raw =
|
||||
reinterpret_cast<const char*>(&(*chars_list[2])[(*offsets_list[2])[i - 1]]);
|
||||
if (mode_size != 0) {
|
||||
std::string mode_str(mode_raw, mode_size);
|
||||
if (aes_mode_map.count(mode_str) == 0) {
|
||||
StringOP::push_null_string(i, result_data, result_offset, null_map);
|
||||
continue;
|
||||
}
|
||||
encryption_mode = aes_mode_map.at(mode_str);
|
||||
}
|
||||
exectue_result<Impl, is_encrypt>(offsets_list, chars_list, i, encryption_mode, nullptr,
|
||||
0, result_data, result_offset, null_map);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user