增加加密
This commit is contained in:
@@ -52,6 +52,29 @@ static uint32_t pkcs7_pad(uint8_t* data, uint32_t data_len, uint32_t buffer_size
|
||||
return data_len + padding_len;
|
||||
}
|
||||
|
||||
static uint32_t pkcs7_unpad(uint8_t* data, uint32_t data_len)
|
||||
{
|
||||
uint8_t padding_len;
|
||||
uint32_t i;
|
||||
|
||||
if (data_len == 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
padding_len = data[data_len - 1];
|
||||
if (padding_len < 1 || padding_len > 16 || padding_len > data_len) {
|
||||
return data_len;
|
||||
}
|
||||
|
||||
for (i = data_len - padding_len; i < data_len; i++) {
|
||||
if (data[i] != padding_len) {
|
||||
return data_len;
|
||||
}
|
||||
}
|
||||
|
||||
return data_len - padding_len;
|
||||
}
|
||||
|
||||
uint32_t Crypto_EncryptJSON(const char* json_data, char* encrypted_output)
|
||||
{
|
||||
uint32_t json_len = strlen(json_data);
|
||||
@@ -97,3 +120,37 @@ uint32_t Crypto_EncryptJSON(const char* json_data, char* encrypted_output)
|
||||
|
||||
return encoded_len;
|
||||
}
|
||||
|
||||
uint32_t Crypto_DecryptJSON(const char* encrypted_base64, char* plain_output, uint32_t output_size)
|
||||
{
|
||||
uint32_t encrypted_len;
|
||||
uint32_t binary_len;
|
||||
uint32_t plain_len;
|
||||
uint8_t buffer[768];
|
||||
struct AES_ctx ctx;
|
||||
|
||||
if (encrypted_base64 == NULL || plain_output == NULL || output_size == 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
encrypted_len = strlen(encrypted_base64);
|
||||
if (encrypted_len == 0 || encrypted_len > BASE64_ENCODE_SIZE(sizeof(buffer))) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
binary_len = base64_decode(encrypted_base64, encrypted_len, buffer);
|
||||
if (binary_len == 0 || (binary_len % 16) != 0 || binary_len >= sizeof(buffer)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
AES_init_ctx_iv(&ctx, AES_KEY, AES_IV);
|
||||
AES_CBC_decrypt_buffer(&ctx, buffer, binary_len);
|
||||
plain_len = pkcs7_unpad(buffer, binary_len);
|
||||
if (plain_len >= output_size) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
memcpy(plain_output, buffer, plain_len);
|
||||
plain_output[plain_len] = '\0';
|
||||
return plain_len;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user