|
|
1.1 root 1: /*
2: ---------------------------------------------------------------------------
3: Copyright (c) 2003, Dr Brian Gladman, Worcester, UK. All rights reserved.
4:
5: LICENSE TERMS
6:
7: The free distribution and use of this software in both source and binary
8: form is allowed (with or without changes) provided that:
9:
10: 1. distributions of this source code include the above copyright
11: notice, this list of conditions and the following disclaimer;
12:
13: 2. distributions in binary form include the above copyright
14: notice, this list of conditions and the following disclaimer
15: in the documentation and/or other associated materials;
16:
17: 3. the copyright holder's name is not used to endorse products
18: built using this software without specific written permission.
19:
20: ALTERNATIVELY, provided that this notice is retained in full, this product
21: may be distributed under the terms of the GNU General Public License (GPL),
22: in which case the provisions of the GPL apply INSTEAD OF those given above.
23:
24: DISCLAIMER
25:
26: This software is provided 'as is' with no explicit or implied warranties
27: in respect of its properties, including, but not limited to, correctness
28: and/or fitness for purpose.
29: ---------------------------------------------------------------------------
30: Issue 28/01/2004
31:
32: This file contains the definitions required to use AES in C. See aesopt.h
33: for optimisation details.
34: */
35:
36: #if !defined( _AES_H )
37: #define _AES_H
38:
39: /* This include is used to find 8 & 32 bit unsigned integer types */
40: #include "limits.h"
41:
42: #if defined(__cplusplus)
43: extern "C"
44: {
45: #endif
46:
47: #define AES_128 /* define if AES with 128 bit keys is needed */
48: #define AES_192 /* define if AES with 192 bit keys is needed */
49: #define AES_256 /* define if AES with 256 bit keys is needed */
50: #define AES_VAR /* define if a variable key size is needed */
51:
52: /* The following must also be set in assembler files if being used */
53:
54: #define AES_ENCRYPT /* if support for encryption is needed */
55: #define AES_DECRYPT /* if support for decryption is needed */
56: #define AES_ERR_CHK /* for parameter checks & error return codes */
57:
58: #if UCHAR_MAX == 0xff /* an unsigned 8 bit type */
59: typedef unsigned char aes_08t;
60: #else
61: # error Please define aes_08t as an 8-bit unsigned integer type in aes.h
62: #endif
63:
64: #if UINT_MAX == 4294967295 /* an unsigned 32 bit type */
65: typedef unsigned int aes_32t;
66: #elif ULONG_MAX == 4294967295ul
67: typedef unsigned long aes_32t;
68: #else
69: # error Please define aes_32t as a 32-bit unsigned integer type in aes.h
70: #endif
71:
72: #define AES_BLOCK_SIZE 16 /* the AES block size in bytes */
73: #define N_COLS 4 /* the number of columns in the state */
74:
75: /* The key schedule length is 11, 13 or 15 16-byte blocks for 128, */
76: /* 192 or 256-bit keys respectively. That is 176, 208 or 240 bytes */
77: /* or 44, 52 or 60 32-bit words. For simplicity this code allocates */
78: /* the maximum 60 word array for the key schedule for all key sizes */
79:
80: #if defined( AES_VAR ) || defined( AES_256 )
81: #define KS_LENGTH 60
82: #elif defined( AES_192 )
83: #define KS_LENGTH 52
84: #else
85: #define KS_LENGTH 44
86: #endif
87:
88: #if defined( AES_ERR_CHK )
89: #define aes_ret int
90: #define aes_good 0
91: #define aes_error -1
92: #else
93: #define aes_ret void
94: #endif
95:
96: #if !defined( AES_DLL ) /* implement normal/DLL functions */
97: #define aes_rval aes_ret
98: #else
99: #define aes_rval aes_ret __declspec(dllexport) _stdcall
100: #endif
101:
102: typedef struct
103: { aes_32t ks[KS_LENGTH];
104: aes_32t rn;
105: } aes_encrypt_ctx;
106:
107: typedef struct
108: { aes_32t ks[KS_LENGTH];
109: aes_32t rn;
110: } aes_decrypt_ctx;
111:
112: /* This routine must be called before first use if non-static */
113: /* tables are being used */
114:
115: void gen_tabs(void);
116:
117: /* The key length (klen) is input in bytes when it is in the range */
118: /* 16 <= klen <= 32 or in bits when in the range 128 <= klen <= 256 */
119:
120: #if defined( AES_ENCRYPT )
121:
122: #if defined(AES_128) || defined(AES_VAR)
123: aes_rval aes_encrypt_key128(const unsigned char *in_key, aes_encrypt_ctx cx[1]);
124: #endif
125:
126: #if defined(AES_192) || defined(AES_VAR)
127: aes_rval aes_encrypt_key192(const unsigned char *in_key, aes_encrypt_ctx cx[1]);
128: #endif
129:
130: #if defined(AES_256) || defined(AES_VAR)
131: aes_rval aes_encrypt_key256(const unsigned char *in_key, aes_encrypt_ctx cx[1]);
132: #endif
133:
134: #if defined(AES_VAR)
135: aes_rval _cdecl aes_encrypt_key(const unsigned char *in_key, int key_len, aes_encrypt_ctx cx[1]);
136: #endif
137:
138: aes_rval _cdecl aes_encrypt(const unsigned char *in_blk, unsigned char *out_blk, const aes_encrypt_ctx cx[1]);
139: #endif
140:
141: #if defined( AES_DECRYPT )
142:
143: #if defined(AES_128) || defined(AES_VAR)
144: aes_rval aes_decrypt_key128(const unsigned char *in_key, aes_decrypt_ctx cx[1]);
145: #endif
146:
147: #if defined(AES_192) || defined(AES_VAR)
148: aes_rval aes_decrypt_key192(const unsigned char *in_key, aes_decrypt_ctx cx[1]);
149: #endif
150:
151: #if defined(AES_256) || defined(AES_VAR)
152: aes_rval aes_decrypt_key256(const unsigned char *in_key, aes_decrypt_ctx cx[1]);
153: #endif
154:
155: #if defined(AES_VAR)
156: aes_rval _cdecl aes_decrypt_key(const unsigned char *in_key, int key_len, aes_decrypt_ctx cx[1]);
157: #endif
158:
159: aes_rval _cdecl aes_decrypt(const unsigned char *in_blk, unsigned char *out_blk, const aes_decrypt_ctx cx[1]);
160: #endif
161:
162: #if defined(__cplusplus)
163: }
164: #endif
165:
166: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.