diff options
-rw-r--r-- | include/aesni/box_data.h | 5 | ||||
-rw-r--r-- | src/box.c | 17 | ||||
-rw-r--r-- | src/box_aes.c | 11 |
3 files changed, 30 insertions, 3 deletions
diff --git a/include/aesni/box_data.h b/include/aesni/box_data.h index 9acd901..ecd98a9 100644 --- a/include/aesni/box_data.h +++ b/include/aesni/box_data.h @@ -87,12 +87,17 @@ typedef AesNI_StatusCode (*AesNI_BoxXorBlock)( const AesNI_BoxBlock*, AesNI_ErrorDetails*); +typedef AesNI_StatusCode (*AesNI_BoxIncCounter)( + AesNI_BoxBlock*, + AesNI_ErrorDetails*); + typedef struct { AesNI_BoxDeriveParams derive_params; AesNI_BoxEncrypt encrypt; AesNI_BoxDecrypt decrypt; AesNI_BoxXorBlock xor_block; + AesNI_BoxIncCounter inc_counter; } AesNI_BoxAlgorithmInterface; @@ -132,7 +132,19 @@ static AesNI_StatusCode aesni_box_encrypt_ctr( AesNI_BoxBlock* output, AesNI_ErrorDetails* err_details) { - return aesni_error_not_implemented(err_details, "box encryption in CTR mode"); + AesNI_StatusCode status = box->algorithm_iface->encrypt( + &box->iv, + &box->encrypt_params, + output, + err_details); + if (aesni_is_error(status)) + return status; + + status = box->algorithm_iface->xor_block(output, input, err_details); + if (aesni_is_error(status)) + return status; + + return box->algorithm_iface->inc_counter(&box->iv, err_details); } typedef AesNI_StatusCode (*AesNI_BoxEncryptMode)( @@ -219,7 +231,6 @@ static AesNI_StatusCode aesni_box_decrypt_cfb( return status; box->iv = *input; - return status; } @@ -255,7 +266,7 @@ static AesNI_StatusCode aesni_box_decrypt_ctr( AesNI_BoxBlock* output, AesNI_ErrorDetails* err_details) { - return aesni_error_not_implemented(err_details, "box decryption in CTR mode"); + return aesni_box_encrypt_ctr(box, input, output, err_details); } typedef AesNI_BoxEncryptMode AesNI_BoxDecryptMode; diff --git a/src/box_aes.c b/src/box_aes.c index fa8bece..aa2aa21 100644 --- a/src/box_aes.c +++ b/src/box_aes.c @@ -64,6 +64,14 @@ static AesNI_StatusCode aesni_box_xor_block_aes( return AESNI_SUCCESS; } +static AesNI_StatusCode aesni_box_inc_counter_aes( + AesNI_BoxBlock* ctr, + AesNI_ErrorDetails* err_details) +{ + ctr->aes_block = aesni_aes_inc_counter(ctr->aes_block); + return AESNI_SUCCESS; +} + static AesNI_StatusCode aesni_box_encrypt_aes128( const AesNI_BoxBlock* input, const AesNI_BoxEncryptionParams* params, @@ -142,6 +150,7 @@ AesNI_BoxAlgorithmInterface aesni_box_aes128_iface = &aesni_box_encrypt_aes128, &aesni_box_decrypt_aes128, &aesni_box_xor_block_aes, + &aesni_box_inc_counter_aes, }; AesNI_BoxAlgorithmInterface aesni_box_aes192_iface = @@ -150,6 +159,7 @@ AesNI_BoxAlgorithmInterface aesni_box_aes192_iface = &aesni_box_encrypt_aes192, &aesni_box_decrypt_aes192, &aesni_box_xor_block_aes, + &aesni_box_inc_counter_aes, }; AesNI_BoxAlgorithmInterface aesni_box_aes256_iface = @@ -158,4 +168,5 @@ AesNI_BoxAlgorithmInterface aesni_box_aes256_iface = &aesni_box_encrypt_aes256, &aesni_box_decrypt_aes256, &aesni_box_xor_block_aes, + &aesni_box_inc_counter_aes, }; |