]> cvs.zerfleddert.de Git - hmcfgusb/blame - aes.h
flash-ota: cleanup for hmuartlgw
[hmcfgusb] / aes.h
CommitLineData
ed571217
MG
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
19typedef unsigned char BYTE; // 8-bit byte\r
20typedef 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
27void 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
31void 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
36void 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
44int 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
52int 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
62void 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
65void 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
72void 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
83int 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
101int 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
117int aes_test();\r
118int aes_ecb_test();\r
119int aes_cbc_test();\r
120int aes_ctr_test();\r
121int aes_ccm_test();\r
122\r
123#endif // AES_H\r
Impressum, Datenschutz