diff options
| author | Egor Tensin <egor@tensin.name> | 2026-07-22 18:31:50 +0200 |
|---|---|---|
| committer | Egor Tensin <egor@tensin.name> | 2026-07-22 21:07:53 +0200 |
| commit | 4720b5ac21163936fb47f524037a6f12ce6e6ce2 (patch) | |
| tree | 7b1f3f7f0e4047134048bb9b9967498b6f8ead12 /aes/src/algorithm.c | |
| parent | minor refactoring (diff) | |
| download | aes-tools-4720b5ac21163936fb47f524037a6f12ce6e6ce2.tar.gz aes-tools-4720b5ac21163936fb47f524037a6f12ce6e6ce2.zip | |
rewrite: the beginning
This a giant fuck-you to myself while I have nothing (actually, tons of
things) to do in a hospital.
* The giant screens of preprocessor code are gone, they always sucked,
fuck them.
* Switched everything to the "boxes" interface as the only one
remaining.
* Restuctured things in aes/ so that the files they're in make at least
a little bit of sense.
* Removed a bunch of cruft and prematurely generic code.
* This is half-baked at best: I just made sure that the tests pass. A
lot of cleanup awaits.
Diffstat (limited to 'aes/src/algorithm.c')
| -rw-r--r-- | aes/src/algorithm.c | 264 |
1 files changed, 264 insertions, 0 deletions
diff --git a/aes/src/algorithm.c b/aes/src/algorithm.c new file mode 100644 index 0000000..2c3e056 --- /dev/null +++ b/aes/src/algorithm.c @@ -0,0 +1,264 @@ +/* + * Copyright (c) 2026 Egor Tensin <Egor.Tensin@gmail.com> + * This file is part of the "AES tools" project. + * For details, see https://github.com/egor-tensin/aes-tools. + * Distributed under the MIT License. + */ + +#include <aes/all.h> + +#include <stdlib.h> + +#ifdef __cplusplus +extern "C" { +#endif + +static AES_StatusCode aes_parse_key_aes128( + AES_Key* dest, + const char* src, + AES_ErrorDetails* err_details +) { + if (dest == NULL) + return aes_error_null_argument(err_details, "dest"); + + return aes128_parse_key(&dest->aes128_key, src, err_details); +} + +static AES_StatusCode aes_parse_key_aes192( + AES_Key* dest, + const char* src, + AES_ErrorDetails* err_details +) { + if (dest == NULL) + return aes_error_null_argument(err_details, "dest"); + + return aes192_parse_key(&dest->aes192_key, src, err_details); +} + +static AES_StatusCode aes_parse_key_aes256( + AES_Key* dest, + const char* src, + AES_ErrorDetails* err_details +) { + if (dest == NULL) + return aes_error_null_argument(err_details, "dest"); + + return aes256_parse_key(&dest->aes256_key, src, err_details); +} + +static AES_StatusCode aes_format_key_aes128( + AES_KeyString* dest, + const AES_Key* src, + AES_ErrorDetails* err_details +) { + if (dest == NULL) + return aes_error_null_argument(err_details, "dest"); + if (src == NULL) + return aes_error_null_argument(err_details, "src"); + + return aes128_format_key(&dest->aes128, &src->aes128_key, err_details); +} + +static AES_StatusCode aes_format_key_aes192( + AES_KeyString* dest, + const AES_Key* src, + AES_ErrorDetails* err_details +) { + if (dest == NULL) + return aes_error_null_argument(err_details, "dest"); + if (src == NULL) + return aes_error_null_argument(err_details, "src"); + + return aes192_format_key(&dest->aes192, &src->aes192_key, err_details); +} + +static AES_StatusCode aes_format_key_aes256( + AES_KeyString* dest, + const AES_Key* src, + AES_ErrorDetails* err_details +) { + if (dest == NULL) + return aes_error_null_argument(err_details, "dest"); + if (src == NULL) + return aes_error_null_argument(err_details, "src"); + + return aes256_format_key(&dest->aes256, &src->aes256_key, err_details); +} + +static AES_StatusCode aes_expand_key_aes128( + const AES_Key* key, + AES_EncryptionRoundKeys* encryption_keys, + AES_DecryptionRoundKeys* decryption_keys, + AES_ErrorDetails* err_details +) { + AES_UNUSED_PARAMETER(err_details); + aes128_expand_key(&key->aes128_key, &encryption_keys->aes128_enc_keys); + aes128_derive_decryption_keys( + &encryption_keys->aes128_enc_keys, &decryption_keys->aes128_dec_keys + ); + return AES_SUCCESS; +} + +static AES_StatusCode aes_expand_key_aes192( + const AES_Key* key, + AES_EncryptionRoundKeys* encryption_keys, + AES_DecryptionRoundKeys* decryption_keys, + AES_ErrorDetails* err_details +) { + AES_UNUSED_PARAMETER(err_details); + aes192_expand_key(&key->aes192_key, &encryption_keys->aes192_enc_keys); + aes192_derive_decryption_keys( + &encryption_keys->aes192_enc_keys, &decryption_keys->aes192_dec_keys + ); + return AES_SUCCESS; +} + +static AES_StatusCode aes_expand_key_aes256( + const AES_Key* key, + AES_EncryptionRoundKeys* encryption_keys, + AES_DecryptionRoundKeys* decryption_keys, + AES_ErrorDetails* err_details +) { + AES_UNUSED_PARAMETER(err_details); + aes256_expand_key(&key->aes256_key, &encryption_keys->aes256_enc_keys); + aes256_derive_decryption_keys( + &encryption_keys->aes256_enc_keys, &decryption_keys->aes256_dec_keys + ); + return AES_SUCCESS; +} + +static AES_StatusCode aes_encrypt_block_aes128( + const AES_Block* input, + const AES_EncryptionRoundKeys* params, + AES_Block* output, + AES_ErrorDetails* err_details +) { + AES_UNUSED_PARAMETER(err_details); + *output = aes128_encrypt_block(*input, ¶ms->aes128_enc_keys); + return AES_SUCCESS; +} + +static AES_StatusCode aes_decrypt_block_aes128( + const AES_Block* input, + const AES_DecryptionRoundKeys* params, + AES_Block* output, + AES_ErrorDetails* err_details +) { + AES_UNUSED_PARAMETER(err_details); + *output = aes128_decrypt_block(*input, ¶ms->aes128_dec_keys); + return AES_SUCCESS; +} + +static AES_StatusCode aes_encrypt_block_aes192( + const AES_Block* input, + const AES_EncryptionRoundKeys* params, + AES_Block* output, + AES_ErrorDetails* err_details +) { + AES_UNUSED_PARAMETER(err_details); + *output = aes192_encrypt_block(*input, ¶ms->aes192_enc_keys); + return AES_SUCCESS; +} + +static AES_StatusCode aes_decrypt_block_aes192( + const AES_Block* input, + const AES_DecryptionRoundKeys* params, + AES_Block* output, + AES_ErrorDetails* err_details +) { + AES_UNUSED_PARAMETER(err_details); + *output = aes192_decrypt_block(*input, ¶ms->aes192_dec_keys); + return AES_SUCCESS; +} + +static AES_StatusCode aes_encrypt_block_aes256( + const AES_Block* input, + const AES_EncryptionRoundKeys* params, + AES_Block* output, + AES_ErrorDetails* err_details +) { + AES_UNUSED_PARAMETER(err_details); + *output = aes256_encrypt_block(*input, ¶ms->aes256_enc_keys); + return AES_SUCCESS; +} + +static AES_StatusCode aes_decrypt_block_aes256( + const AES_Block* input, + const AES_DecryptionRoundKeys* params, + AES_Block* output, + AES_ErrorDetails* err_details +) { + AES_UNUSED_PARAMETER(err_details); + *output = aes256_decrypt_block(*input, ¶ms->aes256_dec_keys); + return AES_SUCCESS; +} + +static AES_Ops aes128_ops = { + &aes_parse_key_aes128, + &aes_format_key_aes128, + &aes_expand_key_aes128, + &aes_encrypt_block_aes128, + &aes_decrypt_block_aes128, +}; + +static AES_Ops aes192_ops = { + &aes_parse_key_aes192, + &aes_format_key_aes192, + &aes_expand_key_aes192, + &aes_encrypt_block_aes192, + &aes_decrypt_block_aes192, +}; + +static AES_Ops aes256_ops = { + &aes_parse_key_aes256, + &aes_format_key_aes256, + &aes_expand_key_aes256, + &aes_encrypt_block_aes256, + &aes_decrypt_block_aes256, +}; + +static const AES_Ops* aes_ops_list[] = { + &aes128_ops, + &aes192_ops, + &aes256_ops, +}; + +const AES_Ops* aes_get_ops(AES_Algorithm algorithm) { + int l = 0; + size_t r = sizeof(aes_ops_list) / sizeof(aes_ops_list[0]) - 1; + + if ((int)algorithm < l || (size_t)algorithm > r) { + assert(0); + return NULL; + } + + return aes_ops_list[algorithm]; +} + +AES_StatusCode aes_parse_key( + AES_Algorithm algorithm, + AES_Key* dest, + const char* src, + AES_ErrorDetails* err_details +) { + if (dest == NULL) + return aes_error_null_argument(err_details, "dest"); + if (src == NULL) + return aes_error_null_argument(err_details, "src"); + + return aes_get_ops(algorithm)->parse_key(dest, src, err_details); +} + +AES_StatusCode aes_format_key( + AES_Algorithm algorithm, + AES_KeyString* dest, + const AES_Key* src, + AES_ErrorDetails* err_details +) { + if (dest == NULL) + return aes_error_null_argument(err_details, "dest"); + if (src == NULL) + return aes_error_null_argument(err_details, "src"); + + return aes_get_ops(algorithm)->format_key(dest, src, err_details); +} |
