123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- #ifndef _AES_H_
- #define _AES_H_
- #include <stddef.h>
- #include <stdint.h>
- // #define the macros below to 1/0 to enable/disable the mode of operation.
- //
- // CBC enables AES encryption in CBC-mode of operation.
- // CTR enables encryption in counter-mode.
- // ECB enables the basic ECB 16-byte block algorithm. All can be enabled simultaneously.
- // The #ifndef-guard allows it to be configured before #include'ing or at compile time.
- #ifndef CBC
- #define CBC 1
- #endif
- #ifndef ECB
- #define ECB 1
- #endif
- #ifndef CTR
- #define CTR 1
- #endif
- // #define AES128 1
- #define AES192 1
- //#define AES256 1
- #define AES_BLOCKLEN 16 // Block length in bytes - AES is 128b block only
- #if defined(AES256) && (AES256 == 1)
- #define AES_KEYLEN 32
- #define AES_keyExpSize 240
- #elif defined(AES192) && (AES192 == 1)
- #define AES_KEYLEN 24
- #define AES_keyExpSize 208
- #else
- #define AES_KEYLEN 16 // Key length in bytes
- #define AES_keyExpSize 176
- #endif
- struct AES_ctx {
- uint8_t RoundKey[AES_keyExpSize];
- #if (defined(CBC) && (CBC == 1)) || (defined(CTR) && (CTR == 1))
- uint8_t Iv[AES_BLOCKLEN];
- #endif
- };
- void AES_init_ctx(struct AES_ctx* ctx, const uint8_t* key);
- #if (defined(CBC) && (CBC == 1)) || (defined(CTR) && (CTR == 1))
- void AES_init_ctx_iv(struct AES_ctx* ctx, const uint8_t* key,
- const uint8_t* iv);
- void AES_ctx_set_iv(struct AES_ctx* ctx, const uint8_t* iv);
- #endif
- #if defined(ECB) && (ECB == 1)
- // buffer size is exactly AES_BLOCKLEN bytes;
- // you need only AES_init_ctx as IV is not used in ECB
- // NB: ECB is considered insecure for most uses
- void AES_ECB_encrypt(const struct AES_ctx* ctx, uint8_t* buf);
- void AES_ECB_decrypt(const struct AES_ctx* ctx, uint8_t* buf);
- #endif // #if defined(ECB) && (ECB == !)
- #if defined(CBC) && (CBC == 1)
- // buffer size MUST be mutile of AES_BLOCKLEN;
- // Suggest https://en.wikipedia.org/wiki/Padding_(cryptography)#PKCS7 for padding scheme
- // NOTES: you need to set IV in ctx via AES_init_ctx_iv() or AES_ctx_set_iv()
- // no IV should ever be reused with the same key
- void AES_CBC_encrypt_buffer(struct AES_ctx* ctx, uint8_t* buf, size_t length);
- void AES_CBC_decrypt_buffer(struct AES_ctx* ctx, uint8_t* buf, size_t length);
- #endif // #if defined(CBC) && (CBC == 1)
- #if defined(CTR) && (CTR == 1)
- // Same function for encrypting as for decrypting.
- // IV is incremented for every block, and used after encryption as XOR-compliment for output
- // Suggesting https://en.wikipedia.org/wiki/Padding_(cryptography)#PKCS7 for padding scheme
- // NOTES: you need to set IV in ctx with AES_init_ctx_iv() or AES_ctx_set_iv()
- // no IV should ever be reused with the same key
- void AES_CTR_xcrypt_buffer(struct AES_ctx* ctx, uint8_t* buf, size_t length);
- #endif // #if defined(CTR) && (CTR == 1)
- #endif // _AES_H_
|