aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/aes/src/algorithm.c
diff options
context:
space:
mode:
authorEgor Tensin <egor@tensin.name>2026-07-22 18:31:50 +0200
committerEgor Tensin <egor@tensin.name>2026-07-22 21:07:53 +0200
commit4720b5ac21163936fb47f524037a6f12ce6e6ce2 (patch)
tree7b1f3f7f0e4047134048bb9b9967498b6f8ead12 /aes/src/algorithm.c
parentminor refactoring (diff)
downloadaes-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.c264
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, &params->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, &params->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, &params->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, &params->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, &params->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, &params->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);
+}