| 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#endifstruct 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 usesvoid 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 keyvoid 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 keyvoid AES_CTR_xcrypt_buffer(struct AES_ctx* ctx, uint8_t* buf, size_t length);#endif  // #if defined(CTR) && (CTR == 1)#endif  // _AES_H_
 |