1 /*********************************************************************
\r
3 * Author: Brad Conte (brad AT bradconte.com)
\r
5 * Disclaimer: This code is presented "as is" without any guarantees.
\r
6 * Details: Defines the API for the corresponding AES implementation.
\r
7 *********************************************************************/
\r
12 /*************************** HEADER FILES ***************************/
\r
15 /****************************** MACROS ******************************/
\r
16 #define AES_BLOCK_SIZE 16 // AES operates on 16 bytes at a time
\r
18 /**************************** DATA TYPES ****************************/
\r
19 typedef unsigned char BYTE; // 8-bit byte
\r
20 typedef unsigned int WORD; // 32-bit word, change to "long" for 16-bit machines
\r
22 /*********************** FUNCTION DECLARATIONS **********************/
\r
26 // Key setup must be done before any AES en/de-cryption functions can be used.
\r
27 void aes_key_setup(const BYTE key[], // The key, must be 128, 192, or 256 bits
\r
28 WORD w[], // Output key schedule to be used later
\r
29 int keysize); // Bit length of the key, 128, 192, or 256
\r
31 void aes_encrypt(const BYTE in[], // 16 bytes of plaintext
\r
32 BYTE out[], // 16 bytes of ciphertext
\r
33 const WORD key[], // From the key setup
\r
34 int keysize); // Bit length of the key, 128, 192, or 256
\r
36 void aes_decrypt(const BYTE in[], // 16 bytes of ciphertext
\r
37 BYTE out[], // 16 bytes of plaintext
\r
38 const WORD key[], // From the key setup
\r
39 int keysize); // Bit length of the key, 128, 192, or 256
\r
44 int aes_encrypt_cbc(const BYTE in[], // Plaintext
\r
45 size_t in_len, // Must be a multiple of AES_BLOCK_SIZE
\r
46 BYTE out[], // Ciphertext, same length as plaintext
\r
47 const WORD key[], // From the key setup
\r
48 int keysize, // Bit length of the key, 128, 192, or 256
\r
49 const BYTE iv[]); // IV, must be AES_BLOCK_SIZE bytes long
\r
51 // Only output the CBC-MAC of the input.
\r
52 int aes_encrypt_cbc_mac(const BYTE in[], // plaintext
\r
53 size_t in_len, // Must be a multiple of AES_BLOCK_SIZE
\r
54 BYTE out[], // Output MAC
\r
55 const WORD key[], // From the key setup
\r
56 int keysize, // Bit length of the key, 128, 192, or 256
\r
57 const BYTE iv[]); // IV, must be AES_BLOCK_SIZE bytes long
\r
62 void increment_iv(BYTE iv[], // Must be a multiple of AES_BLOCK_SIZE
\r
63 int counter_size); // Bytes of the IV used for counting (low end)
\r
65 void aes_encrypt_ctr(const BYTE in[], // Plaintext
\r
66 size_t in_len, // Any byte length
\r
67 BYTE out[], // Ciphertext, same length as plaintext
\r
68 const WORD key[], // From the key setup
\r
69 int keysize, // Bit length of the key, 128, 192, or 256
\r
70 const BYTE iv[]); // IV, must be AES_BLOCK_SIZE bytes long
\r
72 void aes_decrypt_ctr(const BYTE in[], // Ciphertext
\r
73 size_t in_len, // Any byte length
\r
74 BYTE out[], // Plaintext, same length as ciphertext
\r
75 const WORD key[], // From the key setup
\r
76 int keysize, // Bit length of the key, 128, 192, or 256
\r
77 const BYTE iv[]); // IV, must be AES_BLOCK_SIZE bytes long
\r
82 // Returns True if the input parameters do not violate any constraint.
\r
83 int aes_encrypt_ccm(const BYTE plaintext[], // IN - Plaintext.
\r
84 WORD plaintext_len, // IN - Plaintext length.
\r
85 const BYTE associated_data[], // IN - Associated Data included in authentication, but not encryption.
\r
86 unsigned short associated_data_len, // IN - Associated Data length in bytes.
\r
87 const BYTE nonce[], // IN - The Nonce to be used for encryption.
\r
88 unsigned short nonce_len, // IN - Nonce length in bytes.
\r
89 BYTE ciphertext[], // OUT - Ciphertext, a concatination of the plaintext and the MAC.
\r
90 WORD *ciphertext_len, // OUT - The length of the ciphertext, always plaintext_len + mac_len.
\r
91 WORD mac_len, // IN - The desired length of the MAC, must be 4, 6, 8, 10, 12, 14, or 16.
\r
92 const BYTE key[], // IN - The AES key for encryption.
\r
93 int keysize); // IN - The length of the key in bits. Valid values are 128, 192, 256.
\r
95 // Returns True if the input parameters do not violate any constraint.
\r
96 // Use mac_auth to ensure decryption/validation was preformed correctly.
\r
97 // If authentication does not succeed, the plaintext is zeroed out. To overwride
\r
98 // this, call with mac_auth = NULL. The proper proceedure is to decrypt with
\r
99 // authentication enabled (mac_auth != NULL) and make a second call to that
\r
100 // ignores authentication explicitly if the first call failes.
\r
101 int aes_decrypt_ccm(const BYTE ciphertext[], // IN - Ciphertext, the concatination of encrypted plaintext and MAC.
\r
102 WORD ciphertext_len, // IN - Ciphertext length in bytes.
\r
103 const BYTE assoc[], // IN - The Associated Data, required for authentication.
\r
104 unsigned short assoc_len, // IN - Associated Data length in bytes.
\r
105 const BYTE nonce[], // IN - The Nonce to use for decryption, same one as for encryption.
\r
106 unsigned short nonce_len, // IN - Nonce length in bytes.
\r
107 BYTE plaintext[], // OUT - The plaintext that was decrypted. Will need to be large enough to hold ciphertext_len - mac_len.
\r
108 WORD *plaintext_len, // OUT - Length in bytes of the output plaintext, always ciphertext_len - mac_len .
\r
109 WORD mac_len, // IN - The length of the MAC that was calculated.
\r
110 int *mac_auth, // OUT - TRUE if authentication succeeded, FALSE if it did not. NULL pointer will ignore the authentication.
\r
111 const BYTE key[], // IN - The AES key for decryption.
\r
112 int keysize); // IN - The length of the key in BITS. Valid values are 128, 192, 256.
\r
114 ///////////////////
\r
116 ///////////////////
\r
118 int aes_ecb_test();
\r
119 int aes_cbc_test();
\r
120 int aes_ctr_test();
\r
121 int aes_ccm_test();
\r