5a0545c81d1113c21c9ce5908d84bc3f1eda405e
[platform/upstream/nettle.git] / aes.h
1 /* aes.h
2
3    The aes/rijndael block cipher.
4
5    Copyright (C) 2001, 2013 Niels Möller
6
7    This file is part of GNU Nettle.
8
9    GNU Nettle is free software: you can redistribute it and/or
10    modify it under the terms of either:
11
12      * the GNU Lesser General Public License as published by the Free
13        Software Foundation; either version 3 of the License, or (at your
14        option) any later version.
15
16    or
17
18      * the GNU General Public License as published by the Free
19        Software Foundation; either version 2 of the License, or (at your
20        option) any later version.
21
22    or both in parallel, as here.
23
24    GNU Nettle is distributed in the hope that it will be useful,
25    but WITHOUT ANY WARRANTY; without even the implied warranty of
26    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
27    General Public License for more details.
28
29    You should have received copies of the GNU General Public License and
30    the GNU Lesser General Public License along with this program.  If
31    not, see http://www.gnu.org/licenses/.
32 */
33  
34 #ifndef NETTLE_AES_H_INCLUDED
35 #define NETTLE_AES_H_INCLUDED
36
37 #include "nettle-types.h"
38
39 #ifdef __cplusplus
40 extern "C" {
41 #endif
42
43 /* Name mangling */
44 #define aes_set_encrypt_key nettle_aes_set_encrypt_key
45 #define aes_set_decrypt_key nettle_aes_set_decrypt_key
46 #define aes_invert_key nettle_aes_invert_key
47 #define aes_encrypt nettle_aes_encrypt
48 #define aes_decrypt nettle_aes_decrypt
49 #define aes128_set_encrypt_key nettle_aes128_set_encrypt_key
50 #define aes128_set_decrypt_key nettle_aes128_set_decrypt_key
51 #define aes128_invert_key nettle_aes128_invert_key
52 #define aes128_encrypt nettle_aes128_encrypt
53 #define aes128_decrypt nettle_aes128_decrypt
54 #define aes192_set_encrypt_key nettle_aes192_set_encrypt_key
55 #define aes192_set_decrypt_key nettle_aes192_set_decrypt_key
56 #define aes192_invert_key nettle_aes192_invert_key
57 #define aes192_encrypt nettle_aes192_encrypt
58 #define aes192_decrypt nettle_aes192_decrypt
59 #define aes256_set_encrypt_key nettle_aes256_set_encrypt_key
60 #define aes256_set_decrypt_key nettle_aes256_set_decrypt_key
61 #define aes256_invert_key nettle_aes256_invert_key
62 #define aes256_encrypt nettle_aes256_encrypt
63 #define aes256_decrypt nettle_aes256_decrypt
64
65 #define AES_BLOCK_SIZE 16
66
67 #define AES128_KEY_SIZE 16
68 #define AES192_KEY_SIZE 24
69 #define AES256_KEY_SIZE 32
70 #define _AES128_ROUNDS 10
71 #define _AES192_ROUNDS 12
72 #define _AES256_ROUNDS 14
73
74 /* Variable key size between 128 and 256 bits. But the only valid
75  * values are 16 (128 bits), 24 (192 bits) and 32 (256 bits). */
76 #define AES_MIN_KEY_SIZE AES128_KEY_SIZE
77 #define AES_MAX_KEY_SIZE AES256_KEY_SIZE
78
79 /* Older nettle-2.7 interface */
80
81 #define AES_KEY_SIZE 32
82
83 struct aes_ctx
84 {
85   unsigned rounds;  /* number of rounds to use for our key size */
86   uint32_t keys[4*(_AES256_ROUNDS + 1)];  /* maximum size of key schedule */
87 };
88
89 void
90 aes_set_encrypt_key(struct aes_ctx *ctx,
91                     size_t length, const uint8_t *key);
92
93 void
94 aes_set_decrypt_key(struct aes_ctx *ctx,
95                    size_t length, const uint8_t *key);
96
97 void
98 aes_invert_key(struct aes_ctx *dst,
99                const struct aes_ctx *src);
100
101 void
102 aes_encrypt(const struct aes_ctx *ctx,
103             size_t length, uint8_t *dst,
104             const uint8_t *src);
105 void
106 aes_decrypt(const struct aes_ctx *ctx,
107             size_t length, uint8_t *dst,
108             const uint8_t *src);
109
110 struct aes128_ctx
111 {
112   uint32_t keys[4 * (_AES128_ROUNDS + 1)];
113 };
114
115 void
116 aes128_set_encrypt_key(struct aes128_ctx *ctx, const uint8_t *key);
117 void
118 aes128_set_decrypt_key(struct aes128_ctx *ctx, const uint8_t *key);
119 void
120 aes128_invert_key(struct aes128_ctx *dst,
121                   const struct aes128_ctx *src);
122 void
123 aes128_encrypt(const struct aes128_ctx *ctx,
124                size_t length, uint8_t *dst,
125                const uint8_t *src);
126 void
127 aes128_decrypt(const struct aes128_ctx *ctx,
128                size_t length, uint8_t *dst,
129                const uint8_t *src);
130
131 struct aes192_ctx
132 {
133   uint32_t keys[4 * (_AES192_ROUNDS + 1)];
134 };
135
136 void
137 aes192_set_encrypt_key(struct aes192_ctx *ctx, const uint8_t *key);
138 void
139 aes192_set_decrypt_key(struct aes192_ctx *ctx, const uint8_t *key);
140 void
141 aes192_invert_key(struct aes192_ctx *dst,
142                   const struct aes192_ctx *src);
143 void
144 aes192_encrypt(const struct aes192_ctx *ctx,
145                size_t length, uint8_t *dst,
146                const uint8_t *src);
147 void
148 aes192_decrypt(const struct aes192_ctx *ctx,
149                size_t length, uint8_t *dst,
150                const uint8_t *src);
151
152 struct aes256_ctx
153 {
154   uint32_t keys[4 * (_AES256_ROUNDS + 1)];
155 };
156
157 void
158 aes256_set_encrypt_key(struct aes256_ctx *ctx, const uint8_t *key);
159 void
160 aes256_set_decrypt_key(struct aes256_ctx *ctx, const uint8_t *key);
161 void
162 aes256_invert_key(struct aes256_ctx *dst,
163                   const struct aes256_ctx *src);
164 void
165 aes256_encrypt(const struct aes256_ctx *ctx,
166                size_t length, uint8_t *dst,
167                const uint8_t *src);
168 void
169 aes256_decrypt(const struct aes256_ctx *ctx,
170                size_t length, uint8_t *dst,
171                const uint8_t *src);
172
173 #ifdef __cplusplus
174 }
175 #endif
176
177 #endif /* NETTLE_AES_H_INCLUDED */