Crypto code
[iotcloud.git] / version2 / src / C / aes.h
1 /*********************************************************************\r
2 * Filename:   aes.h\r
3 * Author:     Brad Conte (brad AT bradconte.com)\r
4 * Copyright:\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
8 \r
9 #ifndef AES_H\r
10 #define AES_H\r
11 \r
12 /*************************** HEADER FILES ***************************/\r
13 #include <stddef.h>\r
14 \r
15 /****************************** MACROS ******************************/\r
16 #define AES_BLOCK_SIZE 16               // AES operates on 16 bytes at a time\r
17 \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
21 \r
22 /*********************** FUNCTION DECLARATIONS **********************/\r
23 ///////////////////\r
24 // AES\r
25 ///////////////////\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
30 \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
35 \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
40 \r
41 ///////////////////\r
42 // AES - CBC\r
43 ///////////////////\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
50 \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
58 \r
59 ///////////////////\r
60 // AES - CTR\r
61 ///////////////////\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
64 \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
71 \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
78 \r
79 ///////////////////\r
80 // AES - CCM\r
81 ///////////////////\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
94 \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
113 \r
114 ///////////////////\r
115 // Test functions\r
116 ///////////////////\r
117 int aes_test();\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
122 \r
123 #endif   // AES_H\r