diff options
72 files changed, 15840 insertions, 3254 deletions
diff --git a/Documentation/crypto/api-intro.txt b/Documentation/crypto/api-intro.txt index a2ac6d294793..8b49302712a8 100644 --- a/Documentation/crypto/api-intro.txt +++ b/Documentation/crypto/api-intro.txt | |||
@@ -33,9 +33,16 @@ The idea is to make the user interface and algorithm registration API | |||
33 | very simple, while hiding the core logic from both. Many good ideas | 33 | very simple, while hiding the core logic from both. Many good ideas |
34 | from existing APIs such as Cryptoapi and Nettle have been adapted for this. | 34 | from existing APIs such as Cryptoapi and Nettle have been adapted for this. |
35 | 35 | ||
36 | The API currently supports three types of transforms: Ciphers, Digests and | 36 | The API currently supports five main types of transforms: AEAD (Authenticated |
37 | Compressors. The compression algorithms especially seem to be performing | 37 | Encryption with Associated Data), Block Ciphers, Ciphers, Compressors and |
38 | very well so far. | 38 | Hashes. |
39 | |||
40 | Please note that Block Ciphers is somewhat of a misnomer. It is in fact | ||
41 | meant to support all ciphers including stream ciphers. The difference | ||
42 | between Block Ciphers and Ciphers is that the latter operates on exactly | ||
43 | one block while the former can operate on an arbitrary amount of data, | ||
44 | subject to block size requirements (i.e., non-stream ciphers can only | ||
45 | process multiples of blocks). | ||
39 | 46 | ||
40 | Support for hardware crypto devices via an asynchronous interface is | 47 | Support for hardware crypto devices via an asynchronous interface is |
41 | under development. | 48 | under development. |
@@ -69,29 +76,12 @@ Here's an example of how to use the API: | |||
69 | Many real examples are available in the regression test module (tcrypt.c). | 76 | Many real examples are available in the regression test module (tcrypt.c). |
70 | 77 | ||
71 | 78 | ||
72 | CONFIGURATION NOTES | ||
73 | |||
74 | As Triple DES is part of the DES module, for those using modular builds, | ||
75 | add the following line to /etc/modprobe.conf: | ||
76 | |||
77 | alias des3_ede des | ||
78 | |||
79 | The Null algorithms reside in the crypto_null module, so these lines | ||
80 | should also be added: | ||
81 | |||
82 | alias cipher_null crypto_null | ||
83 | alias digest_null crypto_null | ||
84 | alias compress_null crypto_null | ||
85 | |||
86 | The SHA384 algorithm shares code within the SHA512 module, so you'll | ||
87 | also need: | ||
88 | alias sha384 sha512 | ||
89 | |||
90 | |||
91 | DEVELOPER NOTES | 79 | DEVELOPER NOTES |
92 | 80 | ||
93 | Transforms may only be allocated in user context, and cryptographic | 81 | Transforms may only be allocated in user context, and cryptographic |
94 | methods may only be called from softirq and user contexts. | 82 | methods may only be called from softirq and user contexts. For |
83 | transforms with a setkey method it too should only be called from | ||
84 | user context. | ||
95 | 85 | ||
96 | When using the API for ciphers, performance will be optimal if each | 86 | When using the API for ciphers, performance will be optimal if each |
97 | scatterlist contains data which is a multiple of the cipher's block | 87 | scatterlist contains data which is a multiple of the cipher's block |
@@ -130,8 +120,9 @@ might already be working on. | |||
130 | BUGS | 120 | BUGS |
131 | 121 | ||
132 | Send bug reports to: | 122 | Send bug reports to: |
133 | Herbert Xu <herbert@gondor.apana.org.au> | 123 | linux-crypto@vger.kernel.org |
134 | Cc: David S. Miller <davem@redhat.com> | 124 | Cc: Herbert Xu <herbert@gondor.apana.org.au>, |
125 | David S. Miller <davem@redhat.com> | ||
135 | 126 | ||
136 | 127 | ||
137 | FURTHER INFORMATION | 128 | FURTHER INFORMATION |
diff --git a/arch/s390/crypto/aes_s390.c b/arch/s390/crypto/aes_s390.c index 512669691ad0..46c97058ebe1 100644 --- a/arch/s390/crypto/aes_s390.c +++ b/arch/s390/crypto/aes_s390.c | |||
@@ -6,6 +6,7 @@ | |||
6 | * s390 Version: | 6 | * s390 Version: |
7 | * Copyright IBM Corp. 2005,2007 | 7 | * Copyright IBM Corp. 2005,2007 |
8 | * Author(s): Jan Glauber (jang@de.ibm.com) | 8 | * Author(s): Jan Glauber (jang@de.ibm.com) |
9 | * Sebastian Siewior (sebastian@breakpoint.cc> SW-Fallback | ||
9 | * | 10 | * |
10 | * Derived from "crypto/aes_generic.c" | 11 | * Derived from "crypto/aes_generic.c" |
11 | * | 12 | * |
@@ -16,17 +17,13 @@ | |||
16 | * | 17 | * |
17 | */ | 18 | */ |
18 | 19 | ||
20 | #include <crypto/aes.h> | ||
19 | #include <crypto/algapi.h> | 21 | #include <crypto/algapi.h> |
22 | #include <linux/err.h> | ||
20 | #include <linux/module.h> | 23 | #include <linux/module.h> |
21 | #include <linux/init.h> | 24 | #include <linux/init.h> |
22 | #include "crypt_s390.h" | 25 | #include "crypt_s390.h" |
23 | 26 | ||
24 | #define AES_MIN_KEY_SIZE 16 | ||
25 | #define AES_MAX_KEY_SIZE 32 | ||
26 | |||
27 | /* data block size for all key lengths */ | ||
28 | #define AES_BLOCK_SIZE 16 | ||
29 | |||
30 | #define AES_KEYLEN_128 1 | 27 | #define AES_KEYLEN_128 1 |
31 | #define AES_KEYLEN_192 2 | 28 | #define AES_KEYLEN_192 2 |
32 | #define AES_KEYLEN_256 4 | 29 | #define AES_KEYLEN_256 4 |
@@ -39,45 +36,89 @@ struct s390_aes_ctx { | |||
39 | long enc; | 36 | long enc; |
40 | long dec; | 37 | long dec; |
41 | int key_len; | 38 | int key_len; |
39 | union { | ||
40 | struct crypto_blkcipher *blk; | ||
41 | struct crypto_cipher *cip; | ||
42 | } fallback; | ||
42 | }; | 43 | }; |
43 | 44 | ||
44 | static int aes_set_key(struct crypto_tfm *tfm, const u8 *in_key, | 45 | /* |
45 | unsigned int key_len) | 46 | * Check if the key_len is supported by the HW. |
47 | * Returns 0 if it is, a positive number if it is not and software fallback is | ||
48 | * required or a negative number in case the key size is not valid | ||
49 | */ | ||
50 | static int need_fallback(unsigned int key_len) | ||
46 | { | 51 | { |
47 | struct s390_aes_ctx *sctx = crypto_tfm_ctx(tfm); | ||
48 | u32 *flags = &tfm->crt_flags; | ||
49 | |||
50 | switch (key_len) { | 52 | switch (key_len) { |
51 | case 16: | 53 | case 16: |
52 | if (!(keylen_flag & AES_KEYLEN_128)) | 54 | if (!(keylen_flag & AES_KEYLEN_128)) |
53 | goto fail; | 55 | return 1; |
54 | break; | 56 | break; |
55 | case 24: | 57 | case 24: |
56 | if (!(keylen_flag & AES_KEYLEN_192)) | 58 | if (!(keylen_flag & AES_KEYLEN_192)) |
57 | goto fail; | 59 | return 1; |
58 | |||
59 | break; | 60 | break; |
60 | case 32: | 61 | case 32: |
61 | if (!(keylen_flag & AES_KEYLEN_256)) | 62 | if (!(keylen_flag & AES_KEYLEN_256)) |
62 | goto fail; | 63 | return 1; |
63 | break; | 64 | break; |
64 | default: | 65 | default: |
65 | goto fail; | 66 | return -1; |
66 | break; | 67 | break; |
67 | } | 68 | } |
69 | return 0; | ||
70 | } | ||
71 | |||
72 | static int setkey_fallback_cip(struct crypto_tfm *tfm, const u8 *in_key, | ||
73 | unsigned int key_len) | ||
74 | { | ||
75 | struct s390_aes_ctx *sctx = crypto_tfm_ctx(tfm); | ||
76 | int ret; | ||
77 | |||
78 | sctx->fallback.blk->base.crt_flags &= ~CRYPTO_TFM_REQ_MASK; | ||
79 | sctx->fallback.blk->base.crt_flags |= (tfm->crt_flags & | ||
80 | CRYPTO_TFM_REQ_MASK); | ||
81 | |||
82 | ret = crypto_cipher_setkey(sctx->fallback.cip, in_key, key_len); | ||
83 | if (ret) { | ||
84 | tfm->crt_flags &= ~CRYPTO_TFM_RES_MASK; | ||
85 | tfm->crt_flags |= (sctx->fallback.blk->base.crt_flags & | ||
86 | CRYPTO_TFM_RES_MASK); | ||
87 | } | ||
88 | return ret; | ||
89 | } | ||
90 | |||
91 | static int aes_set_key(struct crypto_tfm *tfm, const u8 *in_key, | ||
92 | unsigned int key_len) | ||
93 | { | ||
94 | struct s390_aes_ctx *sctx = crypto_tfm_ctx(tfm); | ||
95 | u32 *flags = &tfm->crt_flags; | ||
96 | int ret; | ||
97 | |||
98 | ret = need_fallback(key_len); | ||
99 | if (ret < 0) { | ||
100 | *flags |= CRYPTO_TFM_RES_BAD_KEY_LEN; | ||
101 | return -EINVAL; | ||
102 | } | ||
68 | 103 | ||
69 | sctx->key_len = key_len; | 104 | sctx->key_len = key_len; |
70 | memcpy(sctx->key, in_key, key_len); | 105 | if (!ret) { |
71 | return 0; | 106 | memcpy(sctx->key, in_key, key_len); |
72 | fail: | 107 | return 0; |
73 | *flags |= CRYPTO_TFM_RES_BAD_KEY_LEN; | 108 | } |
74 | return -EINVAL; | 109 | |
110 | return setkey_fallback_cip(tfm, in_key, key_len); | ||
75 | } | 111 | } |
76 | 112 | ||
77 | static void aes_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) | 113 | static void aes_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) |
78 | { | 114 | { |
79 | const struct s390_aes_ctx *sctx = crypto_tfm_ctx(tfm); | 115 | const struct s390_aes_ctx *sctx = crypto_tfm_ctx(tfm); |
80 | 116 | ||
117 | if (unlikely(need_fallback(sctx->key_len))) { | ||
118 | crypto_cipher_encrypt_one(sctx->fallback.cip, out, in); | ||
119 | return; | ||
120 | } | ||
121 | |||
81 | switch (sctx->key_len) { | 122 | switch (sctx->key_len) { |
82 | case 16: | 123 | case 16: |
83 | crypt_s390_km(KM_AES_128_ENCRYPT, &sctx->key, out, in, | 124 | crypt_s390_km(KM_AES_128_ENCRYPT, &sctx->key, out, in, |
@@ -98,6 +139,11 @@ static void aes_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) | |||
98 | { | 139 | { |
99 | const struct s390_aes_ctx *sctx = crypto_tfm_ctx(tfm); | 140 | const struct s390_aes_ctx *sctx = crypto_tfm_ctx(tfm); |
100 | 141 | ||
142 | if (unlikely(need_fallback(sctx->key_len))) { | ||
143 | crypto_cipher_decrypt_one(sctx->fallback.cip, out, in); | ||
144 | return; | ||
145 | } | ||
146 | |||
101 | switch (sctx->key_len) { | 147 | switch (sctx->key_len) { |
102 | case 16: | 148 | case 16: |
103 | crypt_s390_km(KM_AES_128_DECRYPT, &sctx->key, out, in, | 149 | crypt_s390_km(KM_AES_128_DECRYPT, &sctx->key, out, in, |
@@ -114,6 +160,29 @@ static void aes_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) | |||
114 | } | 160 | } |
115 | } | 161 | } |
116 | 162 | ||
163 | static int fallback_init_cip(struct crypto_tfm *tfm) | ||
164 | { | ||
165 | const char *name = tfm->__crt_alg->cra_name; | ||
166 | struct s390_aes_ctx *sctx = crypto_tfm_ctx(tfm); | ||
167 | |||
168 | sctx->fallback.cip = crypto_alloc_cipher(name, 0, | ||
169 | CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK); | ||
170 | |||
171 | if (IS_ERR(sctx->fallback.cip)) { | ||
172 | printk(KERN_ERR "Error allocating fallback algo %s\n", name); | ||
173 | return PTR_ERR(sctx->fallback.blk); | ||
174 | } | ||
175 | |||
176 | return 0; | ||
177 | } | ||
178 | |||
179 | static void fallback_exit_cip(struct crypto_tfm *tfm) | ||
180 | { | ||
181 | struct s390_aes_ctx *sctx = crypto_tfm_ctx(tfm); | ||
182 | |||
183 | crypto_free_cipher(sctx->fallback.cip); | ||
184 | sctx->fallback.cip = NULL; | ||
185 | } | ||
117 | 186 | ||
118 | static struct crypto_alg aes_alg = { | 187 | static struct crypto_alg aes_alg = { |
119 | .cra_name = "aes", | 188 | .cra_name = "aes", |
@@ -125,6 +194,8 @@ static struct crypto_alg aes_alg = { | |||
125 | .cra_ctxsize = sizeof(struct s390_aes_ctx), | 194 | .cra_ctxsize = sizeof(struct s390_aes_ctx), |
126 | .cra_module = THIS_MODULE, | 195 | .cra_module = THIS_MODULE, |
127 | .cra_list = LIST_HEAD_INIT(aes_alg.cra_list), | 196 | .cra_list = LIST_HEAD_INIT(aes_alg.cra_list), |
197 | .cra_init = fallback_init_cip, | ||
198 | .cra_exit = fallback_exit_cip, | ||
128 | .cra_u = { | 199 | .cra_u = { |
129 | .cipher = { | 200 | .cipher = { |
130 | .cia_min_keysize = AES_MIN_KEY_SIZE, | 201 | .cia_min_keysize = AES_MIN_KEY_SIZE, |
@@ -136,10 +207,70 @@ static struct crypto_alg aes_alg = { | |||
136 | } | 207 | } |
137 | }; | 208 | }; |
138 | 209 | ||
210 | static int setkey_fallback_blk(struct crypto_tfm *tfm, const u8 *key, | ||
211 | unsigned int len) | ||
212 | { | ||
213 | struct s390_aes_ctx *sctx = crypto_tfm_ctx(tfm); | ||
214 | unsigned int ret; | ||
215 | |||
216 | sctx->fallback.blk->base.crt_flags &= ~CRYPTO_TFM_REQ_MASK; | ||
217 | sctx->fallback.blk->base.crt_flags |= (tfm->crt_flags & | ||
218 | CRYPTO_TFM_REQ_MASK); | ||
219 | |||
220 | ret = crypto_blkcipher_setkey(sctx->fallback.blk, key, len); | ||
221 | if (ret) { | ||
222 | tfm->crt_flags &= ~CRYPTO_TFM_RES_MASK; | ||
223 | tfm->crt_flags |= (sctx->fallback.blk->base.crt_flags & | ||
224 | CRYPTO_TFM_RES_MASK); | ||
225 | } | ||
226 | return ret; | ||
227 | } | ||
228 | |||
229 | static int fallback_blk_dec(struct blkcipher_desc *desc, | ||
230 | struct scatterlist *dst, struct scatterlist *src, | ||
231 | unsigned int nbytes) | ||
232 | { | ||
233 | unsigned int ret; | ||
234 | struct crypto_blkcipher *tfm; | ||
235 | struct s390_aes_ctx *sctx = crypto_blkcipher_ctx(desc->tfm); | ||
236 | |||
237 | tfm = desc->tfm; | ||
238 | desc->tfm = sctx->fallback.blk; | ||
239 | |||
240 | ret = crypto_blkcipher_decrypt_iv(desc, dst, src, nbytes); | ||
241 | |||
242 | desc->tfm = tfm; | ||
243 | return ret; | ||
244 | } | ||
245 | |||
246 | static int fallback_blk_enc(struct blkcipher_desc *desc, | ||
247 | struct scatterlist *dst, struct scatterlist *src, | ||
248 | unsigned int nbytes) | ||
249 | { | ||
250 | unsigned int ret; | ||
251 | struct crypto_blkcipher *tfm; | ||
252 | struct s390_aes_ctx *sctx = crypto_blkcipher_ctx(desc->tfm); | ||
253 | |||
254 | tfm = desc->tfm; | ||
255 | desc->tfm = sctx->fallback.blk; | ||
256 | |||
257 | ret = crypto_blkcipher_encrypt_iv(desc, dst, src, nbytes); | ||
258 | |||
259 | desc->tfm = tfm; | ||
260 | return ret; | ||
261 | } | ||
262 | |||
139 | static int ecb_aes_set_key(struct crypto_tfm *tfm, const u8 *in_key, | 263 | static int ecb_aes_set_key(struct crypto_tfm *tfm, const u8 *in_key, |
140 | unsigned int key_len) | 264 | unsigned int key_len) |
141 | { | 265 | { |
142 | struct s390_aes_ctx *sctx = crypto_tfm_ctx(tfm); | 266 | struct s390_aes_ctx *sctx = crypto_tfm_ctx(tfm); |
267 | int ret; | ||
268 | |||
269 | ret = need_fallback(key_len); | ||
270 | if (ret > 0) { | ||
271 | sctx->key_len = key_len; | ||
272 | return setkey_fallback_blk(tfm, in_key, key_len); | ||
273 | } | ||
143 | 274 | ||
144 | switch (key_len) { | 275 | switch (key_len) { |
145 | case 16: | 276 | case 16: |
@@ -188,6 +319,9 @@ static int ecb_aes_encrypt(struct blkcipher_desc *desc, | |||
188 | struct s390_aes_ctx *sctx = crypto_blkcipher_ctx(desc->tfm); | 319 | struct s390_aes_ctx *sctx = crypto_blkcipher_ctx(desc->tfm); |
189 | struct blkcipher_walk walk; | 320 | struct blkcipher_walk walk; |
190 | 321 | ||
322 | if (unlikely(need_fallback(sctx->key_len))) | ||
323 | return fallback_blk_enc(desc, dst, src, nbytes); | ||
324 | |||
191 | blkcipher_walk_init(&walk, dst, src, nbytes); | 325 | blkcipher_walk_init(&walk, dst, src, nbytes); |
192 | return ecb_aes_crypt(desc, sctx->enc, sctx->key, &walk); | 326 | return ecb_aes_crypt(desc, sctx->enc, sctx->key, &walk); |
193 | } | 327 | } |
@@ -199,10 +333,37 @@ static int ecb_aes_decrypt(struct blkcipher_desc *desc, | |||
199 | struct s390_aes_ctx *sctx = crypto_blkcipher_ctx(desc->tfm); | 333 | struct s390_aes_ctx *sctx = crypto_blkcipher_ctx(desc->tfm); |
200 | struct blkcipher_walk walk; | 334 | struct blkcipher_walk walk; |
201 | 335 | ||
336 | if (unlikely(need_fallback(sctx->key_len))) | ||
337 | return fallback_blk_dec(desc, dst, src, nbytes); | ||
338 | |||
202 | blkcipher_walk_init(&walk, dst, src, nbytes); | 339 | blkcipher_walk_init(&walk, dst, src, nbytes); |
203 | return ecb_aes_crypt(desc, sctx->dec, sctx->key, &walk); | 340 | return ecb_aes_crypt(desc, sctx->dec, sctx->key, &walk); |
204 | } | 341 | } |
205 | 342 | ||
343 | static int fallback_init_blk(struct crypto_tfm *tfm) | ||
344 | { | ||
345 | const char *name = tfm->__crt_alg->cra_name; | ||
346 | struct s390_aes_ctx *sctx = crypto_tfm_ctx(tfm); | ||
347 | |||
348 | sctx->fallback.blk = crypto_alloc_blkcipher(name, 0, | ||
349 | CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK); | ||
350 | |||
351 | if (IS_ERR(sctx->fallback.blk)) { | ||
352 | printk(KERN_ERR "Error allocating fallback algo %s\n", name); | ||
353 | return PTR_ERR(sctx->fallback.blk); | ||
354 | } | ||
355 | |||
356 | return 0; | ||
357 | } | ||
358 | |||
359 | static void fallback_exit_blk(struct crypto_tfm *tfm) | ||
360 | { | ||
361 | struct s390_aes_ctx *sctx = crypto_tfm_ctx(tfm); | ||
362 | |||
363 | crypto_free_blkcipher(sctx->fallback.blk); | ||
364 | sctx->fallback.blk = NULL; | ||
365 | } | ||
366 | |||
206 | static struct crypto_alg ecb_aes_alg = { | 367 | static struct crypto_alg ecb_aes_alg = { |
207 | .cra_name = "ecb(aes)", | 368 | .cra_name = "ecb(aes)", |
208 | .cra_driver_name = "ecb-aes-s390", | 369 | .cra_driver_name = "ecb-aes-s390", |
@@ -214,6 +375,8 @@ static struct crypto_alg ecb_aes_alg = { | |||
214 | .cra_type = &crypto_blkcipher_type, | 375 | .cra_type = &crypto_blkcipher_type, |
215 | .cra_module = THIS_MODULE, | 376 | .cra_module = THIS_MODULE, |
216 | .cra_list = LIST_HEAD_INIT(ecb_aes_alg.cra_list), | 377 | .cra_list = LIST_HEAD_INIT(ecb_aes_alg.cra_list), |
378 | .cra_init = fallback_init_blk, | ||
379 | .cra_exit = fallback_exit_blk, | ||
217 | .cra_u = { | 380 | .cra_u = { |
218 | .blkcipher = { | 381 | .blkcipher = { |
219 | .min_keysize = AES_MIN_KEY_SIZE, | 382 | .min_keysize = AES_MIN_KEY_SIZE, |
@@ -229,6 +392,13 @@ static int cbc_aes_set_key(struct crypto_tfm *tfm, const u8 *in_key, | |||
229 | unsigned int key_len) | 392 | unsigned int key_len) |
230 | { | 393 | { |
231 | struct s390_aes_ctx *sctx = crypto_tfm_ctx(tfm); | 394 | struct s390_aes_ctx *sctx = crypto_tfm_ctx(tfm); |
395 | int ret; | ||
396 | |||
397 | ret = need_fallback(key_len); | ||
398 | if (ret > 0) { | ||
399 | sctx->key_len = key_len; | ||
400 | return setkey_fallback_blk(tfm, in_key, key_len); | ||
401 | } | ||
232 | 402 | ||
233 | switch (key_len) { | 403 | switch (key_len) { |
234 | case 16: | 404 | case 16: |
@@ -283,6 +453,9 @@ static int cbc_aes_encrypt(struct blkcipher_desc *desc, | |||
283 | struct s390_aes_ctx *sctx = crypto_blkcipher_ctx(desc->tfm); | 453 | struct s390_aes_ctx *sctx = crypto_blkcipher_ctx(desc->tfm); |
284 | struct blkcipher_walk walk; | 454 | struct blkcipher_walk walk; |
285 | 455 | ||
456 | if (unlikely(need_fallback(sctx->key_len))) | ||
457 | return fallback_blk_enc(desc, dst, src, nbytes); | ||
458 | |||
286 | blkcipher_walk_init(&walk, dst, src, nbytes); | 459 | blkcipher_walk_init(&walk, dst, src, nbytes); |
287 | return cbc_aes_crypt(desc, sctx->enc, sctx->iv, &walk); | 460 | return cbc_aes_crypt(desc, sctx->enc, sctx->iv, &walk); |
288 | } | 461 | } |
@@ -294,6 +467,9 @@ static int cbc_aes_decrypt(struct blkcipher_desc *desc, | |||
294 | struct s390_aes_ctx *sctx = crypto_blkcipher_ctx(desc->tfm); | 467 | struct s390_aes_ctx *sctx = crypto_blkcipher_ctx(desc->tfm); |
295 | struct blkcipher_walk walk; | 468 | struct blkcipher_walk walk; |
296 | 469 | ||
470 | if (unlikely(need_fallback(sctx->key_len))) | ||
471 | return fallback_blk_dec(desc, dst, src, nbytes); | ||
472 | |||
297 | blkcipher_walk_init(&walk, dst, src, nbytes); | 473 | blkcipher_walk_init(&walk, dst, src, nbytes); |
298 | return cbc_aes_crypt(desc, sctx->dec, sctx->iv, &walk); | 474 | return cbc_aes_crypt(desc, sctx->dec, sctx->iv, &walk); |
299 | } | 475 | } |
@@ -309,6 +485,8 @@ static struct crypto_alg cbc_aes_alg = { | |||
309 | .cra_type = &crypto_blkcipher_type, | 485 | .cra_type = &crypto_blkcipher_type, |
310 | .cra_module = THIS_MODULE, | 486 | .cra_module = THIS_MODULE, |
311 | .cra_list = LIST_HEAD_INIT(cbc_aes_alg.cra_list), | 487 | .cra_list = LIST_HEAD_INIT(cbc_aes_alg.cra_list), |
488 | .cra_init = fallback_init_blk, | ||
489 | .cra_exit = fallback_exit_blk, | ||
312 | .cra_u = { | 490 | .cra_u = { |
313 | .blkcipher = { | 491 | .blkcipher = { |
314 | .min_keysize = AES_MIN_KEY_SIZE, | 492 | .min_keysize = AES_MIN_KEY_SIZE, |
@@ -336,14 +514,10 @@ static int __init aes_init(void) | |||
336 | return -EOPNOTSUPP; | 514 | return -EOPNOTSUPP; |
337 | 515 | ||
338 | /* z9 109 and z9 BC/EC only support 128 bit key length */ | 516 | /* z9 109 and z9 BC/EC only support 128 bit key length */ |
339 | if (keylen_flag == AES_KEYLEN_128) { | 517 | if (keylen_flag == AES_KEYLEN_128) |
340 | aes_alg.cra_u.cipher.cia_max_keysize = AES_MIN_KEY_SIZE; | ||
341 | ecb_aes_alg.cra_u.blkcipher.max_keysize = AES_MIN_KEY_SIZE; | ||
342 | cbc_aes_alg.cra_u.blkcipher.max_keysize = AES_MIN_KEY_SIZE; | ||
343 | printk(KERN_INFO | 518 | printk(KERN_INFO |
344 | "aes_s390: hardware acceleration only available for" | 519 | "aes_s390: hardware acceleration only available for" |
345 | "128 bit keys\n"); | 520 | "128 bit keys\n"); |
346 | } | ||
347 | 521 | ||
348 | ret = crypto_register_alg(&aes_alg); | 522 | ret = crypto_register_alg(&aes_alg); |
349 | if (ret) | 523 | if (ret) |
@@ -382,4 +556,3 @@ MODULE_ALIAS("aes"); | |||
382 | 556 | ||
383 | MODULE_DESCRIPTION("Rijndael (AES) Cipher Algorithm"); | 557 | MODULE_DESCRIPTION("Rijndael (AES) Cipher Algorithm"); |
384 | MODULE_LICENSE("GPL"); | 558 | MODULE_LICENSE("GPL"); |
385 | |||
diff --git a/arch/x86/crypto/Makefile b/arch/x86/crypto/Makefile index 46bb609e2444..3874c2de5403 100644 --- a/arch/x86/crypto/Makefile +++ b/arch/x86/crypto/Makefile | |||
@@ -4,12 +4,16 @@ | |||
4 | 4 | ||
5 | obj-$(CONFIG_CRYPTO_AES_586) += aes-i586.o | 5 | obj-$(CONFIG_CRYPTO_AES_586) += aes-i586.o |
6 | obj-$(CONFIG_CRYPTO_TWOFISH_586) += twofish-i586.o | 6 | obj-$(CONFIG_CRYPTO_TWOFISH_586) += twofish-i586.o |
7 | obj-$(CONFIG_CRYPTO_SALSA20_586) += salsa20-i586.o | ||
7 | 8 | ||
8 | obj-$(CONFIG_CRYPTO_AES_X86_64) += aes-x86_64.o | 9 | obj-$(CONFIG_CRYPTO_AES_X86_64) += aes-x86_64.o |
9 | obj-$(CONFIG_CRYPTO_TWOFISH_X86_64) += twofish-x86_64.o | 10 | obj-$(CONFIG_CRYPTO_TWOFISH_X86_64) += twofish-x86_64.o |
11 | obj-$(CONFIG_CRYPTO_SALSA20_X86_64) += salsa20-x86_64.o | ||
10 | 12 | ||
11 | aes-i586-y := aes-i586-asm_32.o aes_32.o | 13 | aes-i586-y := aes-i586-asm_32.o aes_glue.o |
12 | twofish-i586-y := twofish-i586-asm_32.o twofish_32.o | 14 | twofish-i586-y := twofish-i586-asm_32.o twofish_glue.o |
15 | salsa20-i586-y := salsa20-i586-asm_32.o salsa20_glue.o | ||
13 | 16 | ||
14 | aes-x86_64-y := aes-x86_64-asm_64.o aes_64.o | 17 | aes-x86_64-y := aes-x86_64-asm_64.o aes_glue.o |
15 | twofish-x86_64-y := twofish-x86_64-asm_64.o twofish_64.o | 18 | twofish-x86_64-y := twofish-x86_64-asm_64.o twofish_glue.o |
19 | salsa20-x86_64-y := salsa20-x86_64-asm_64.o salsa20_glue.o | ||
diff --git a/arch/x86/crypto/aes-i586-asm_32.S b/arch/x86/crypto/aes-i586-asm_32.S index f942f0c8f630..1093bede3e0a 100644 --- a/arch/x86/crypto/aes-i586-asm_32.S +++ b/arch/x86/crypto/aes-i586-asm_32.S | |||
@@ -46,9 +46,9 @@ | |||
46 | #define in_blk 16 | 46 | #define in_blk 16 |
47 | 47 | ||
48 | /* offsets in crypto_tfm structure */ | 48 | /* offsets in crypto_tfm structure */ |
49 | #define ekey (crypto_tfm_ctx_offset + 0) | 49 | #define klen (crypto_tfm_ctx_offset + 0) |
50 | #define nrnd (crypto_tfm_ctx_offset + 256) | 50 | #define ekey (crypto_tfm_ctx_offset + 4) |
51 | #define dkey (crypto_tfm_ctx_offset + 260) | 51 | #define dkey (crypto_tfm_ctx_offset + 244) |
52 | 52 | ||
53 | // register mapping for encrypt and decrypt subroutines | 53 | // register mapping for encrypt and decrypt subroutines |
54 | 54 | ||
@@ -221,8 +221,8 @@ | |||
221 | 221 | ||
222 | .global aes_enc_blk | 222 | .global aes_enc_blk |
223 | 223 | ||
224 | .extern ft_tab | 224 | .extern crypto_ft_tab |
225 | .extern fl_tab | 225 | .extern crypto_fl_tab |
226 | 226 | ||
227 | .align 4 | 227 | .align 4 |
228 | 228 | ||
@@ -236,7 +236,7 @@ aes_enc_blk: | |||
236 | 1: push %ebx | 236 | 1: push %ebx |
237 | mov in_blk+4(%esp),%r2 | 237 | mov in_blk+4(%esp),%r2 |
238 | push %esi | 238 | push %esi |
239 | mov nrnd(%ebp),%r3 // number of rounds | 239 | mov klen(%ebp),%r3 // key size |
240 | push %edi | 240 | push %edi |
241 | #if ekey != 0 | 241 | #if ekey != 0 |
242 | lea ekey(%ebp),%ebp // key pointer | 242 | lea ekey(%ebp),%ebp // key pointer |
@@ -255,26 +255,26 @@ aes_enc_blk: | |||
255 | 255 | ||
256 | sub $8,%esp // space for register saves on stack | 256 | sub $8,%esp // space for register saves on stack |
257 | add $16,%ebp // increment to next round key | 257 | add $16,%ebp // increment to next round key |
258 | cmp $12,%r3 | 258 | cmp $24,%r3 |
259 | jb 4f // 10 rounds for 128-bit key | 259 | jb 4f // 10 rounds for 128-bit key |
260 | lea 32(%ebp),%ebp | 260 | lea 32(%ebp),%ebp |
261 | je 3f // 12 rounds for 192-bit key | 261 | je 3f // 12 rounds for 192-bit key |
262 | lea 32(%ebp),%ebp | 262 | lea 32(%ebp),%ebp |
263 | 263 | ||
264 | 2: fwd_rnd1( -64(%ebp) ,ft_tab) // 14 rounds for 256-bit key | 264 | 2: fwd_rnd1( -64(%ebp), crypto_ft_tab) // 14 rounds for 256-bit key |
265 | fwd_rnd2( -48(%ebp) ,ft_tab) | 265 | fwd_rnd2( -48(%ebp), crypto_ft_tab) |
266 | 3: fwd_rnd1( -32(%ebp) ,ft_tab) // 12 rounds for 192-bit key | 266 | 3: fwd_rnd1( -32(%ebp), crypto_ft_tab) // 12 rounds for 192-bit key |
267 | fwd_rnd2( -16(%ebp) ,ft_tab) | 267 | fwd_rnd2( -16(%ebp), crypto_ft_tab) |
268 | 4: fwd_rnd1( (%ebp) ,ft_tab) // 10 rounds for 128-bit key | 268 | 4: fwd_rnd1( (%ebp), crypto_ft_tab) // 10 rounds for 128-bit key |
269 | fwd_rnd2( +16(%ebp) ,ft_tab) | 269 | fwd_rnd2( +16(%ebp), crypto_ft_tab) |
270 | fwd_rnd1( +32(%ebp) ,ft_tab) | 270 | fwd_rnd1( +32(%ebp), crypto_ft_tab) |
271 | fwd_rnd2( +48(%ebp) ,ft_tab) | 271 | fwd_rnd2( +48(%ebp), crypto_ft_tab) |
272 | fwd_rnd1( +64(%ebp) ,ft_tab) | 272 | fwd_rnd1( +64(%ebp), crypto_ft_tab) |
273 | fwd_rnd2( +80(%ebp) ,ft_tab) | 273 | fwd_rnd2( +80(%ebp), crypto_ft_tab) |
274 | fwd_rnd1( +96(%ebp) ,ft_tab) | 274 | fwd_rnd1( +96(%ebp), crypto_ft_tab) |
275 | fwd_rnd2(+112(%ebp) ,ft_tab) | 275 | fwd_rnd2(+112(%ebp), crypto_ft_tab) |
276 | fwd_rnd1(+128(%ebp) ,ft_tab) | 276 | fwd_rnd1(+128(%ebp), crypto_ft_tab) |
277 | fwd_rnd2(+144(%ebp) ,fl_tab) // last round uses a different table | 277 | fwd_rnd2(+144(%ebp), crypto_fl_tab) // last round uses a different table |
278 | 278 | ||
279 | // move final values to the output array. CAUTION: the | 279 | // move final values to the output array. CAUTION: the |
280 | // order of these assigns rely on the register mappings | 280 | // order of these assigns rely on the register mappings |
@@ -297,8 +297,8 @@ aes_enc_blk: | |||
297 | 297 | ||
298 | .global aes_dec_blk | 298 | .global aes_dec_blk |
299 | 299 | ||
300 | .extern it_tab | 300 | .extern crypto_it_tab |
301 | .extern il_tab | 301 | .extern crypto_il_tab |
302 | 302 | ||
303 | .align 4 | 303 | .align 4 |
304 | 304 | ||
@@ -312,14 +312,11 @@ aes_dec_blk: | |||
312 | 1: push %ebx | 312 | 1: push %ebx |
313 | mov in_blk+4(%esp),%r2 | 313 | mov in_blk+4(%esp),%r2 |
314 | push %esi | 314 | push %esi |
315 | mov nrnd(%ebp),%r3 // number of rounds | 315 | mov klen(%ebp),%r3 // key size |
316 | push %edi | 316 | push %edi |
317 | #if dkey != 0 | 317 | #if dkey != 0 |
318 | lea dkey(%ebp),%ebp // key pointer | 318 | lea dkey(%ebp),%ebp // key pointer |
319 | #endif | 319 | #endif |
320 | mov %r3,%r0 | ||
321 | shl $4,%r0 | ||
322 | add %r0,%ebp | ||
323 | 320 | ||
324 | // input four columns and xor in first round key | 321 | // input four columns and xor in first round key |
325 | 322 | ||
@@ -333,27 +330,27 @@ aes_dec_blk: | |||
333 | xor 12(%ebp),%r5 | 330 | xor 12(%ebp),%r5 |
334 | 331 | ||
335 | sub $8,%esp // space for register saves on stack | 332 | sub $8,%esp // space for register saves on stack |
336 | sub $16,%ebp // increment to next round key | 333 | add $16,%ebp // increment to next round key |
337 | cmp $12,%r3 | 334 | cmp $24,%r3 |
338 | jb 4f // 10 rounds for 128-bit key | 335 | jb 4f // 10 rounds for 128-bit key |
339 | lea -32(%ebp),%ebp | 336 | lea 32(%ebp),%ebp |
340 | je 3f // 12 rounds for 192-bit key | 337 | je 3f // 12 rounds for 192-bit key |
341 | lea -32(%ebp),%ebp | 338 | lea 32(%ebp),%ebp |
342 | 339 | ||
343 | 2: inv_rnd1( +64(%ebp), it_tab) // 14 rounds for 256-bit key | 340 | 2: inv_rnd1( -64(%ebp), crypto_it_tab) // 14 rounds for 256-bit key |
344 | inv_rnd2( +48(%ebp), it_tab) | 341 | inv_rnd2( -48(%ebp), crypto_it_tab) |
345 | 3: inv_rnd1( +32(%ebp), it_tab) // 12 rounds for 192-bit key | 342 | 3: inv_rnd1( -32(%ebp), crypto_it_tab) // 12 rounds for 192-bit key |
346 | inv_rnd2( +16(%ebp), it_tab) | 343 | inv_rnd2( -16(%ebp), crypto_it_tab) |
347 | 4: inv_rnd1( (%ebp), it_tab) // 10 rounds for 128-bit key | 344 | 4: inv_rnd1( (%ebp), crypto_it_tab) // 10 rounds for 128-bit key |
348 | inv_rnd2( -16(%ebp), it_tab) | 345 | inv_rnd2( +16(%ebp), crypto_it_tab) |
349 | inv_rnd1( -32(%ebp), it_tab) | 346 | inv_rnd1( +32(%ebp), crypto_it_tab) |
350 | inv_rnd2( -48(%ebp), it_tab) | 347 | inv_rnd2( +48(%ebp), crypto_it_tab) |
351 | inv_rnd1( -64(%ebp), it_tab) | 348 | inv_rnd1( +64(%ebp), crypto_it_tab) |
352 | inv_rnd2( -80(%ebp), it_tab) | 349 | inv_rnd2( +80(%ebp), crypto_it_tab) |
353 | inv_rnd1( -96(%ebp), it_tab) | 350 | inv_rnd1( +96(%ebp), crypto_it_tab) |
354 | inv_rnd2(-112(%ebp), it_tab) | 351 | inv_rnd2(+112(%ebp), crypto_it_tab) |
355 | inv_rnd1(-128(%ebp), it_tab) | 352 | inv_rnd1(+128(%ebp), crypto_it_tab) |
356 | inv_rnd2(-144(%ebp), il_tab) // last round uses a different table | 353 | inv_rnd2(+144(%ebp), crypto_il_tab) // last round uses a different table |
357 | 354 | ||
358 | // move final values to the output array. CAUTION: the | 355 | // move final values to the output array. CAUTION: the |
359 | // order of these assigns rely on the register mappings | 356 | // order of these assigns rely on the register mappings |
diff --git a/arch/x86/crypto/aes-x86_64-asm_64.S b/arch/x86/crypto/aes-x86_64-asm_64.S index 26b40de4d0b0..a120f526c3df 100644 --- a/arch/x86/crypto/aes-x86_64-asm_64.S +++ b/arch/x86/crypto/aes-x86_64-asm_64.S | |||
@@ -8,10 +8,10 @@ | |||
8 | * including this sentence is retained in full. | 8 | * including this sentence is retained in full. |
9 | */ | 9 | */ |
10 | 10 | ||
11 | .extern aes_ft_tab | 11 | .extern crypto_ft_tab |
12 | .extern aes_it_tab | 12 | .extern crypto_it_tab |
13 | .extern aes_fl_tab | 13 | .extern crypto_fl_tab |
14 | .extern aes_il_tab | 14 | .extern crypto_il_tab |
15 | 15 | ||
16 | .text | 16 | .text |
17 | 17 | ||
@@ -56,13 +56,13 @@ | |||
56 | .align 8; \ | 56 | .align 8; \ |
57 | FUNC: movq r1,r2; \ | 57 | FUNC: movq r1,r2; \ |
58 | movq r3,r4; \ | 58 | movq r3,r4; \ |
59 | leaq BASE+KEY+52(r8),r9; \ | 59 | leaq BASE+KEY+48+4(r8),r9; \ |
60 | movq r10,r11; \ | 60 | movq r10,r11; \ |
61 | movl (r7),r5 ## E; \ | 61 | movl (r7),r5 ## E; \ |
62 | movl 4(r7),r1 ## E; \ | 62 | movl 4(r7),r1 ## E; \ |
63 | movl 8(r7),r6 ## E; \ | 63 | movl 8(r7),r6 ## E; \ |
64 | movl 12(r7),r7 ## E; \ | 64 | movl 12(r7),r7 ## E; \ |
65 | movl BASE(r8),r10 ## E; \ | 65 | movl BASE+0(r8),r10 ## E; \ |
66 | xorl -48(r9),r5 ## E; \ | 66 | xorl -48(r9),r5 ## E; \ |
67 | xorl -44(r9),r1 ## E; \ | 67 | xorl -44(r9),r1 ## E; \ |
68 | xorl -40(r9),r6 ## E; \ | 68 | xorl -40(r9),r6 ## E; \ |
@@ -154,37 +154,37 @@ FUNC: movq r1,r2; \ | |||
154 | /* void aes_enc_blk(stuct crypto_tfm *tfm, u8 *out, const u8 *in) */ | 154 | /* void aes_enc_blk(stuct crypto_tfm *tfm, u8 *out, const u8 *in) */ |
155 | 155 | ||
156 | entry(aes_enc_blk,0,enc128,enc192) | 156 | entry(aes_enc_blk,0,enc128,enc192) |
157 | encrypt_round(aes_ft_tab,-96) | 157 | encrypt_round(crypto_ft_tab,-96) |
158 | encrypt_round(aes_ft_tab,-80) | 158 | encrypt_round(crypto_ft_tab,-80) |
159 | enc192: encrypt_round(aes_ft_tab,-64) | 159 | enc192: encrypt_round(crypto_ft_tab,-64) |
160 | encrypt_round(aes_ft_tab,-48) | 160 | encrypt_round(crypto_ft_tab,-48) |
161 | enc128: encrypt_round(aes_ft_tab,-32) | 161 | enc128: encrypt_round(crypto_ft_tab,-32) |
162 | encrypt_round(aes_ft_tab,-16) | 162 | encrypt_round(crypto_ft_tab,-16) |
163 | encrypt_round(aes_ft_tab, 0) | 163 | encrypt_round(crypto_ft_tab, 0) |
164 | encrypt_round(aes_ft_tab, 16) | 164 | encrypt_round(crypto_ft_tab, 16) |
165 | encrypt_round(aes_ft_tab, 32) | 165 | encrypt_round(crypto_ft_tab, 32) |
166 | encrypt_round(aes_ft_tab, 48) | 166 | encrypt_round(crypto_ft_tab, 48) |
167 | encrypt_round(aes_ft_tab, 64) | 167 | encrypt_round(crypto_ft_tab, 64) |
168 | encrypt_round(aes_ft_tab, 80) | 168 | encrypt_round(crypto_ft_tab, 80) |
169 | encrypt_round(aes_ft_tab, 96) | 169 | encrypt_round(crypto_ft_tab, 96) |
170 | encrypt_final(aes_fl_tab,112) | 170 | encrypt_final(crypto_fl_tab,112) |
171 | return | 171 | return |
172 | 172 | ||
173 | /* void aes_dec_blk(struct crypto_tfm *tfm, u8 *out, const u8 *in) */ | 173 | /* void aes_dec_blk(struct crypto_tfm *tfm, u8 *out, const u8 *in) */ |
174 | 174 | ||
175 | entry(aes_dec_blk,240,dec128,dec192) | 175 | entry(aes_dec_blk,240,dec128,dec192) |
176 | decrypt_round(aes_it_tab,-96) | 176 | decrypt_round(crypto_it_tab,-96) |
177 | decrypt_round(aes_it_tab,-80) | 177 | decrypt_round(crypto_it_tab,-80) |
178 | dec192: decrypt_round(aes_it_tab,-64) | 178 | dec192: decrypt_round(crypto_it_tab,-64) |
179 | decrypt_round(aes_it_tab,-48) | 179 | decrypt_round(crypto_it_tab,-48) |
180 | dec128: decrypt_round(aes_it_tab,-32) | 180 | dec128: decrypt_round(crypto_it_tab,-32) |
181 | decrypt_round(aes_it_tab,-16) | 181 | decrypt_round(crypto_it_tab,-16) |
182 | decrypt_round(aes_it_tab, 0) | 182 | decrypt_round(crypto_it_tab, 0) |
183 | decrypt_round(aes_it_tab, 16) | 183 | decrypt_round(crypto_it_tab, 16) |
184 | decrypt_round(aes_it_tab, 32) | 184 | decrypt_round(crypto_it_tab, 32) |
185 | decrypt_round(aes_it_tab, 48) | 185 | decrypt_round(crypto_it_tab, 48) |
186 | decrypt_round(aes_it_tab, 64) | 186 | decrypt_round(crypto_it_tab, 64) |
187 | decrypt_round(aes_it_tab, 80) | 187 | decrypt_round(crypto_it_tab, 80) |
188 | decrypt_round(aes_it_tab, 96) | 188 | decrypt_round(crypto_it_tab, 96) |
189 | decrypt_final(aes_il_tab,112) | 189 | decrypt_final(crypto_il_tab,112) |
190 | return | 190 | return |
diff --git a/arch/x86/crypto/aes_32.c b/arch/x86/crypto/aes_32.c deleted file mode 100644 index 49aad9397f10..000000000000 --- a/arch/x86/crypto/aes_32.c +++ /dev/null | |||
@@ -1,515 +0,0 @@ | |||
1 | /* | ||
2 | * | ||
3 | * Glue Code for optimized 586 assembler version of AES | ||
4 | * | ||
5 | * Copyright (c) 2002, Dr Brian Gladman <>, Worcester, UK. | ||
6 | * All rights reserved. | ||
7 | * | ||
8 | * LICENSE TERMS | ||
9 | * | ||
10 | * The free distribution and use of this software in both source and binary | ||
11 | * form is allowed (with or without changes) provided that: | ||
12 | * | ||
13 | * 1. distributions of this source code include the above copyright | ||
14 | * notice, this list of conditions and the following disclaimer; | ||
15 | * | ||
16 | * 2. distributions in binary form include the above copyright | ||
17 | * notice, this list of conditions and the following disclaimer | ||
18 | * in the documentation and/or other associated materials; | ||
19 | * | ||
20 | * 3. the copyright holder's name is not used to endorse products | ||
21 | * built using this software without specific written permission. | ||
22 | * | ||
23 | * ALTERNATIVELY, provided that this notice is retained in full, this product | ||
24 | * may be distributed under the terms of the GNU General Public License (GPL), | ||
25 | * in which case the provisions of the GPL apply INSTEAD OF those given above. | ||
26 | * | ||
27 | * DISCLAIMER | ||
28 | * | ||
29 | * This software is provided 'as is' with no explicit or implied warranties | ||
30 | * in respect of its properties, including, but not limited to, correctness | ||
31 | * and/or fitness for purpose. | ||
32 | * | ||
33 | * Copyright (c) 2003, Adam J. Richter <adam@yggdrasil.com> (conversion to | ||
34 | * 2.5 API). | ||
35 | * Copyright (c) 2003, 2004 Fruhwirth Clemens <clemens@endorphin.org> | ||
36 | * Copyright (c) 2004 Red Hat, Inc., James Morris <jmorris@redhat.com> | ||
37 | * | ||
38 | */ | ||
39 | |||
40 | #include <asm/byteorder.h> | ||
41 | #include <linux/kernel.h> | ||
42 | #include <linux/module.h> | ||
43 | #include <linux/init.h> | ||
44 | #include <linux/types.h> | ||
45 | #include <linux/crypto.h> | ||
46 | #include <linux/linkage.h> | ||
47 | |||
48 | asmlinkage void aes_enc_blk(struct crypto_tfm *tfm, u8 *dst, const u8 *src); | ||
49 | asmlinkage void aes_dec_blk(struct crypto_tfm *tfm, u8 *dst, const u8 *src); | ||
50 | |||
51 | #define AES_MIN_KEY_SIZE 16 | ||
52 | #define AES_MAX_KEY_SIZE 32 | ||
53 | #define AES_BLOCK_SIZE 16 | ||
54 | #define AES_KS_LENGTH 4 * AES_BLOCK_SIZE | ||
55 | #define RC_LENGTH 29 | ||
56 | |||
57 | struct aes_ctx { | ||
58 | u32 ekey[AES_KS_LENGTH]; | ||
59 | u32 rounds; | ||
60 | u32 dkey[AES_KS_LENGTH]; | ||
61 | }; | ||
62 | |||
63 | #define WPOLY 0x011b | ||
64 | #define bytes2word(b0, b1, b2, b3) \ | ||
65 | (((u32)(b3) << 24) | ((u32)(b2) << 16) | ((u32)(b1) << 8) | (b0)) | ||
66 | |||
67 | /* define the finite field multiplies required for Rijndael */ | ||
68 | #define f2(x) ((x) ? pow[log[x] + 0x19] : 0) | ||
69 | #define f3(x) ((x) ? pow[log[x] + 0x01] : 0) | ||
70 | #define f9(x) ((x) ? pow[log[x] + 0xc7] : 0) | ||
71 | #define fb(x) ((x) ? pow[log[x] + 0x68] : 0) | ||
72 | #define fd(x) ((x) ? pow[log[x] + 0xee] : 0) | ||
73 | #define fe(x) ((x) ? pow[log[x] + 0xdf] : 0) | ||
74 | #define fi(x) ((x) ? pow[255 - log[x]]: 0) | ||
75 | |||
76 | static inline u32 upr(u32 x, int n) | ||
77 | { | ||
78 | return (x << 8 * n) | (x >> (32 - 8 * n)); | ||
79 | } | ||
80 | |||
81 | static inline u8 bval(u32 x, int n) | ||
82 | { | ||
83 | return x >> 8 * n; | ||
84 | } | ||
85 | |||
86 | /* The forward and inverse affine transformations used in the S-box */ | ||
87 | #define fwd_affine(x) \ | ||
88 | (w = (u32)x, w ^= (w<<1)^(w<<2)^(w<<3)^(w<<4), 0x63^(u8)(w^(w>>8))) | ||
89 | |||
90 | #define inv_affine(x) \ | ||
91 | (w = (u32)x, w = (w<<1)^(w<<3)^(w<<6), 0x05^(u8)(w^(w>>8))) | ||
92 | |||
93 | static u32 rcon_tab[RC_LENGTH]; | ||
94 | |||
95 | u32 ft_tab[4][256]; | ||
96 | u32 fl_tab[4][256]; | ||
97 | static u32 im_tab[4][256]; | ||
98 | u32 il_tab[4][256]; | ||
99 | u32 it_tab[4][256]; | ||
100 | |||
101 | static void gen_tabs(void) | ||
102 | { | ||
103 | u32 i, w; | ||
104 | u8 pow[512], log[256]; | ||
105 | |||
106 | /* | ||
107 | * log and power tables for GF(2^8) finite field with | ||
108 | * WPOLY as modular polynomial - the simplest primitive | ||
109 | * root is 0x03, used here to generate the tables. | ||
110 | */ | ||
111 | i = 0; w = 1; | ||
112 | |||
113 | do { | ||
114 | pow[i] = (u8)w; | ||
115 | pow[i + 255] = (u8)w; | ||
116 | log[w] = (u8)i++; | ||
117 | w ^= (w << 1) ^ (w & 0x80 ? WPOLY : 0); | ||
118 | } while (w != 1); | ||
119 | |||
120 | for(i = 0, w = 1; i < RC_LENGTH; ++i) { | ||
121 | rcon_tab[i] = bytes2word(w, 0, 0, 0); | ||
122 | w = f2(w); | ||
123 | } | ||
124 | |||
125 | for(i = 0; i < 256; ++i) { | ||
126 | u8 b; | ||
127 | |||
128 | b = fwd_affine(fi((u8)i)); | ||
129 | w = bytes2word(f2(b), b, b, f3(b)); | ||
130 | |||
131 | /* tables for a normal encryption round */ | ||
132 | ft_tab[0][i] = w; | ||
133 | ft_tab[1][i] = upr(w, 1); | ||
134 | ft_tab[2][i] = upr(w, 2); | ||
135 | ft_tab[3][i] = upr(w, 3); | ||
136 | w = bytes2word(b, 0, 0, 0); | ||
137 | |||
138 | /* | ||
139 | * tables for last encryption round | ||
140 | * (may also be used in the key schedule) | ||
141 | */ | ||
142 | fl_tab[0][i] = w; | ||
143 | fl_tab[1][i] = upr(w, 1); | ||
144 | fl_tab[2][i] = upr(w, 2); | ||
145 | fl_tab[3][i] = upr(w, 3); | ||
146 | |||
147 | b = fi(inv_affine((u8)i)); | ||
148 | w = bytes2word(fe(b), f9(b), fd(b), fb(b)); | ||
149 | |||
150 | /* tables for the inverse mix column operation */ | ||
151 | im_tab[0][b] = w; | ||
152 | im_tab[1][b] = upr(w, 1); | ||
153 | im_tab[2][b] = upr(w, 2); | ||
154 | im_tab[3][b] = upr(w, 3); | ||
155 | |||
156 | /* tables for a normal decryption round */ | ||
157 | it_tab[0][i] = w; | ||
158 | it_tab[1][i] = upr(w,1); | ||
159 | it_tab[2][i] = upr(w,2); | ||
160 | it_tab[3][i] = upr(w,3); | ||
161 | |||
162 | w = bytes2word(b, 0, 0, 0); | ||
163 | |||
164 | /* tables for last decryption round */ | ||
165 | il_tab[0][i] = w; | ||
166 | il_tab[1][i] = upr(w,1); | ||
167 | il_tab[2][i] = upr(w,2); | ||
168 | il_tab[3][i] = upr(w,3); | ||
169 | } | ||
170 | } | ||
171 | |||
172 | #define four_tables(x,tab,vf,rf,c) \ | ||
173 | ( tab[0][bval(vf(x,0,c),rf(0,c))] ^ \ | ||
174 | tab[1][bval(vf(x,1,c),rf(1,c))] ^ \ | ||
175 | tab[2][bval(vf(x,2,c),rf(2,c))] ^ \ | ||
176 | tab[3][bval(vf(x,3,c),rf(3,c))] \ | ||
177 | ) | ||
178 | |||
179 | #define vf1(x,r,c) (x) | ||
180 | #define rf1(r,c) (r) | ||
181 | #define rf2(r,c) ((r-c)&3) | ||
182 | |||
183 | #define inv_mcol(x) four_tables(x,im_tab,vf1,rf1,0) | ||
184 | #define ls_box(x,c) four_tables(x,fl_tab,vf1,rf2,c) | ||
185 | |||
186 | #define ff(x) inv_mcol(x) | ||
187 | |||
188 | #define ke4(k,i) \ | ||
189 | { \ | ||
190 | k[4*(i)+4] = ss[0] ^= ls_box(ss[3],3) ^ rcon_tab[i]; \ | ||
191 | k[4*(i)+5] = ss[1] ^= ss[0]; \ | ||
192 | k[4*(i)+6] = ss[2] ^= ss[1]; \ | ||
193 | k[4*(i)+7] = ss[3] ^= ss[2]; \ | ||
194 | } | ||
195 | |||
196 | #define kel4(k,i) \ | ||
197 | { \ | ||
198 | k[4*(i)+4] = ss[0] ^= ls_box(ss[3],3) ^ rcon_tab[i]; \ | ||
199 | k[4*(i)+5] = ss[1] ^= ss[0]; \ | ||
200 | k[4*(i)+6] = ss[2] ^= ss[1]; k[4*(i)+7] = ss[3] ^= ss[2]; \ | ||
201 | } | ||
202 | |||
203 | #define ke6(k,i) \ | ||
204 | { \ | ||
205 | k[6*(i)+ 6] = ss[0] ^= ls_box(ss[5],3) ^ rcon_tab[i]; \ | ||
206 | k[6*(i)+ 7] = ss[1] ^= ss[0]; \ | ||
207 | k[6*(i)+ 8] = ss[2] ^= ss[1]; \ | ||
208 | k[6*(i)+ 9] = ss[3] ^= ss[2]; \ | ||
209 | k[6*(i)+10] = ss[4] ^= ss[3]; \ | ||
210 | k[6*(i)+11] = ss[5] ^= ss[4]; \ | ||
211 | } | ||
212 | |||
213 | #define kel6(k,i) \ | ||
214 | { \ | ||
215 | k[6*(i)+ 6] = ss[0] ^= ls_box(ss[5],3) ^ rcon_tab[i]; \ | ||
216 | k[6*(i)+ 7] = ss[1] ^= ss[0]; \ | ||
217 | k[6*(i)+ 8] = ss[2] ^= ss[1]; \ | ||
218 | k[6*(i)+ 9] = ss[3] ^= ss[2]; \ | ||
219 | } | ||
220 | |||
221 | #define ke8(k,i) \ | ||
222 | { \ | ||
223 | k[8*(i)+ 8] = ss[0] ^= ls_box(ss[7],3) ^ rcon_tab[i]; \ | ||
224 | k[8*(i)+ 9] = ss[1] ^= ss[0]; \ | ||
225 | k[8*(i)+10] = ss[2] ^= ss[1]; \ | ||
226 | k[8*(i)+11] = ss[3] ^= ss[2]; \ | ||
227 | k[8*(i)+12] = ss[4] ^= ls_box(ss[3],0); \ | ||
228 | k[8*(i)+13] = ss[5] ^= ss[4]; \ | ||
229 | k[8*(i)+14] = ss[6] ^= ss[5]; \ | ||
230 | k[8*(i)+15] = ss[7] ^= ss[6]; \ | ||
231 | } | ||
232 | |||
233 | #define kel8(k,i) \ | ||
234 | { \ | ||
235 | k[8*(i)+ 8] = ss[0] ^= ls_box(ss[7],3) ^ rcon_tab[i]; \ | ||
236 | k[8*(i)+ 9] = ss[1] ^= ss[0]; \ | ||
237 | k[8*(i)+10] = ss[2] ^= ss[1]; \ | ||
238 | k[8*(i)+11] = ss[3] ^= ss[2]; \ | ||
239 | } | ||
240 | |||
241 | #define kdf4(k,i) \ | ||
242 | { \ | ||
243 | ss[0] = ss[0] ^ ss[2] ^ ss[1] ^ ss[3]; \ | ||
244 | ss[1] = ss[1] ^ ss[3]; \ | ||
245 | ss[2] = ss[2] ^ ss[3]; \ | ||
246 | ss[3] = ss[3]; \ | ||
247 | ss[4] = ls_box(ss[(i+3) % 4], 3) ^ rcon_tab[i]; \ | ||
248 | ss[i % 4] ^= ss[4]; \ | ||
249 | ss[4] ^= k[4*(i)]; \ | ||
250 | k[4*(i)+4] = ff(ss[4]); \ | ||
251 | ss[4] ^= k[4*(i)+1]; \ | ||
252 | k[4*(i)+5] = ff(ss[4]); \ | ||
253 | ss[4] ^= k[4*(i)+2]; \ | ||
254 | k[4*(i)+6] = ff(ss[4]); \ | ||
255 | ss[4] ^= k[4*(i)+3]; \ | ||
256 | k[4*(i)+7] = ff(ss[4]); \ | ||
257 | } | ||
258 | |||
259 | #define kd4(k,i) \ | ||
260 | { \ | ||
261 | ss[4] = ls_box(ss[(i+3) % 4], 3) ^ rcon_tab[i]; \ | ||
262 | ss[i % 4] ^= ss[4]; \ | ||
263 | ss[4] = ff(ss[4]); \ | ||
264 | k[4*(i)+4] = ss[4] ^= k[4*(i)]; \ | ||
265 | k[4*(i)+5] = ss[4] ^= k[4*(i)+1]; \ | ||
266 | k[4*(i)+6] = ss[4] ^= k[4*(i)+2]; \ | ||
267 | k[4*(i)+7] = ss[4] ^= k[4*(i)+3]; \ | ||
268 | } | ||
269 | |||
270 | #define kdl4(k,i) \ | ||
271 | { \ | ||
272 | ss[4] = ls_box(ss[(i+3) % 4], 3) ^ rcon_tab[i]; \ | ||
273 | ss[i % 4] ^= ss[4]; \ | ||
274 | k[4*(i)+4] = (ss[0] ^= ss[1]) ^ ss[2] ^ ss[3]; \ | ||
275 | k[4*(i)+5] = ss[1] ^ ss[3]; \ | ||
276 | k[4*(i)+6] = ss[0]; \ | ||
277 | k[4*(i)+7] = ss[1]; \ | ||
278 | } | ||
279 | |||
280 | #define kdf6(k,i) \ | ||
281 | { \ | ||
282 | ss[0] ^= ls_box(ss[5],3) ^ rcon_tab[i]; \ | ||
283 | k[6*(i)+ 6] = ff(ss[0]); \ | ||
284 | ss[1] ^= ss[0]; \ | ||
285 | k[6*(i)+ 7] = ff(ss[1]); \ | ||
286 | ss[2] ^= ss[1]; \ | ||
287 | k[6*(i)+ 8] = ff(ss[2]); \ | ||
288 | ss[3] ^= ss[2]; \ | ||
289 | k[6*(i)+ 9] = ff(ss[3]); \ | ||
290 | ss[4] ^= ss[3]; \ | ||
291 | k[6*(i)+10] = ff(ss[4]); \ | ||
292 | ss[5] ^= ss[4]; \ | ||
293 | k[6*(i)+11] = ff(ss[5]); \ | ||
294 | } | ||
295 | |||
296 | #define kd6(k,i) \ | ||
297 | { \ | ||
298 | ss[6] = ls_box(ss[5],3) ^ rcon_tab[i]; \ | ||
299 | ss[0] ^= ss[6]; ss[6] = ff(ss[6]); \ | ||
300 | k[6*(i)+ 6] = ss[6] ^= k[6*(i)]; \ | ||
301 | ss[1] ^= ss[0]; \ | ||
302 | k[6*(i)+ 7] = ss[6] ^= k[6*(i)+ 1]; \ | ||
303 | ss[2] ^= ss[1]; \ | ||
304 | k[6*(i)+ 8] = ss[6] ^= k[6*(i)+ 2]; \ | ||
305 | ss[3] ^= ss[2]; \ | ||
306 | k[6*(i)+ 9] = ss[6] ^= k[6*(i)+ 3]; \ | ||
307 | ss[4] ^= ss[3]; \ | ||
308 | k[6*(i)+10] = ss[6] ^= k[6*(i)+ 4]; \ | ||
309 | ss[5] ^= ss[4]; \ | ||
310 | k[6*(i)+11] = ss[6] ^= k[6*(i)+ 5]; \ | ||
311 | } | ||
312 | |||
313 | #define kdl6(k,i) \ | ||
314 | { \ | ||
315 | ss[0] ^= ls_box(ss[5],3) ^ rcon_tab[i]; \ | ||
316 | k[6*(i)+ 6] = ss[0]; \ | ||
317 | ss[1] ^= ss[0]; \ | ||
318 | k[6*(i)+ 7] = ss[1]; \ | ||
319 | ss[2] ^= ss[1]; \ | ||
320 | k[6*(i)+ 8] = ss[2]; \ | ||
321 | ss[3] ^= ss[2]; \ | ||
322 | k[6*(i)+ 9] = ss[3]; \ | ||
323 | } | ||
324 | |||
325 | #define kdf8(k,i) \ | ||
326 | { \ | ||
327 | ss[0] ^= ls_box(ss[7],3) ^ rcon_tab[i]; \ | ||
328 | k[8*(i)+ 8] = ff(ss[0]); \ | ||
329 | ss[1] ^= ss[0]; \ | ||
330 | k[8*(i)+ 9] = ff(ss[1]); \ | ||
331 | ss[2] ^= ss[1]; \ | ||
332 | k[8*(i)+10] = ff(ss[2]); \ | ||
333 | ss[3] ^= ss[2]; \ | ||
334 | k[8*(i)+11] = ff(ss[3]); \ | ||
335 | ss[4] ^= ls_box(ss[3],0); \ | ||
336 | k[8*(i)+12] = ff(ss[4]); \ | ||
337 | ss[5] ^= ss[4]; \ | ||
338 | k[8*(i)+13] = ff(ss[5]); \ | ||
339 | ss[6] ^= ss[5]; \ | ||
340 | k[8*(i)+14] = ff(ss[6]); \ | ||
341 | ss[7] ^= ss[6]; \ | ||
342 | k[8*(i)+15] = ff(ss[7]); \ | ||
343 | } | ||
344 | |||
345 | #define kd8(k,i) \ | ||
346 | { \ | ||
347 | u32 __g = ls_box(ss[7],3) ^ rcon_tab[i]; \ | ||
348 | ss[0] ^= __g; \ | ||
349 | __g = ff(__g); \ | ||
350 | k[8*(i)+ 8] = __g ^= k[8*(i)]; \ | ||
351 | ss[1] ^= ss[0]; \ | ||
352 | k[8*(i)+ 9] = __g ^= k[8*(i)+ 1]; \ | ||
353 | ss[2] ^= ss[1]; \ | ||
354 | k[8*(i)+10] = __g ^= k[8*(i)+ 2]; \ | ||
355 | ss[3] ^= ss[2]; \ | ||
356 | k[8*(i)+11] = __g ^= k[8*(i)+ 3]; \ | ||
357 | __g = ls_box(ss[3],0); \ | ||
358 | ss[4] ^= __g; \ | ||
359 | __g = ff(__g); \ | ||
360 | k[8*(i)+12] = __g ^= k[8*(i)+ 4]; \ | ||
361 | ss[5] ^= ss[4]; \ | ||
362 | k[8*(i)+13] = __g ^= k[8*(i)+ 5]; \ | ||
363 | ss[6] ^= ss[5]; \ | ||
364 | k[8*(i)+14] = __g ^= k[8*(i)+ 6]; \ | ||
365 | ss[7] ^= ss[6]; \ | ||
366 | k[8*(i)+15] = __g ^= k[8*(i)+ 7]; \ | ||
367 | } | ||
368 | |||
369 | #define kdl8(k,i) \ | ||
370 | { \ | ||
371 | ss[0] ^= ls_box(ss[7],3) ^ rcon_tab[i]; \ | ||
372 | k[8*(i)+ 8] = ss[0]; \ | ||
373 | ss[1] ^= ss[0]; \ | ||
374 | k[8*(i)+ 9] = ss[1]; \ | ||
375 | ss[2] ^= ss[1]; \ | ||
376 | k[8*(i)+10] = ss[2]; \ | ||
377 | ss[3] ^= ss[2]; \ | ||
378 | k[8*(i)+11] = ss[3]; \ | ||
379 | } | ||
380 | |||
381 | static int aes_set_key(struct crypto_tfm *tfm, const u8 *in_key, | ||
382 | unsigned int key_len) | ||
383 | { | ||
384 | int i; | ||
385 | u32 ss[8]; | ||
386 | struct aes_ctx *ctx = crypto_tfm_ctx(tfm); | ||
387 | const __le32 *key = (const __le32 *)in_key; | ||
388 | u32 *flags = &tfm->crt_flags; | ||
389 | |||
390 | /* encryption schedule */ | ||
391 | |||
392 | ctx->ekey[0] = ss[0] = le32_to_cpu(key[0]); | ||
393 | ctx->ekey[1] = ss[1] = le32_to_cpu(key[1]); | ||
394 | ctx->ekey[2] = ss[2] = le32_to_cpu(key[2]); | ||
395 | ctx->ekey[3] = ss[3] = le32_to_cpu(key[3]); | ||
396 | |||
397 | switch(key_len) { | ||
398 | case 16: | ||
399 | for (i = 0; i < 9; i++) | ||
400 | ke4(ctx->ekey, i); | ||
401 | kel4(ctx->ekey, 9); | ||
402 | ctx->rounds = 10; | ||
403 | break; | ||
404 | |||
405 | case 24: | ||
406 | ctx->ekey[4] = ss[4] = le32_to_cpu(key[4]); | ||
407 | ctx->ekey[5] = ss[5] = le32_to_cpu(key[5]); | ||
408 | for (i = 0; i < 7; i++) | ||
409 | ke6(ctx->ekey, i); | ||
410 | kel6(ctx->ekey, 7); | ||
411 | ctx->rounds = 12; | ||
412 | break; | ||
413 | |||
414 | case 32: | ||
415 | ctx->ekey[4] = ss[4] = le32_to_cpu(key[4]); | ||
416 | ctx->ekey[5] = ss[5] = le32_to_cpu(key[5]); | ||
417 | ctx->ekey[6] = ss[6] = le32_to_cpu(key[6]); | ||
418 | ctx->ekey[7] = ss[7] = le32_to_cpu(key[7]); | ||
419 | for (i = 0; i < 6; i++) | ||
420 | ke8(ctx->ekey, i); | ||
421 | kel8(ctx->ekey, 6); | ||
422 | ctx->rounds = 14; | ||
423 | break; | ||
424 | |||
425 | default: | ||
426 | *flags |= CRYPTO_TFM_RES_BAD_KEY_LEN; | ||
427 | return -EINVAL; | ||
428 | } | ||
429 | |||
430 | /* decryption schedule */ | ||
431 | |||
432 | ctx->dkey[0] = ss[0] = le32_to_cpu(key[0]); | ||
433 | ctx->dkey[1] = ss[1] = le32_to_cpu(key[1]); | ||
434 | ctx->dkey[2] = ss[2] = le32_to_cpu(key[2]); | ||
435 | ctx->dkey[3] = ss[3] = le32_to_cpu(key[3]); | ||
436 | |||
437 | switch (key_len) { | ||
438 | case 16: | ||
439 | kdf4(ctx->dkey, 0); | ||
440 | for (i = 1; i < 9; i++) | ||
441 | kd4(ctx->dkey, i); | ||
442 | kdl4(ctx->dkey, 9); | ||
443 | break; | ||
444 | |||
445 | case 24: | ||
446 | ctx->dkey[4] = ff(ss[4] = le32_to_cpu(key[4])); | ||
447 | ctx->dkey[5] = ff(ss[5] = le32_to_cpu(key[5])); | ||
448 | kdf6(ctx->dkey, 0); | ||
449 | for (i = 1; i < 7; i++) | ||
450 | kd6(ctx->dkey, i); | ||
451 | kdl6(ctx->dkey, 7); | ||
452 | break; | ||
453 | |||
454 | case 32: | ||
455 | ctx->dkey[4] = ff(ss[4] = le32_to_cpu(key[4])); | ||
456 | ctx->dkey[5] = ff(ss[5] = le32_to_cpu(key[5])); | ||
457 | ctx->dkey[6] = ff(ss[6] = le32_to_cpu(key[6])); | ||
458 | ctx->dkey[7] = ff(ss[7] = le32_to_cpu(key[7])); | ||
459 | kdf8(ctx->dkey, 0); | ||
460 | for (i = 1; i < 6; i++) | ||
461 | kd8(ctx->dkey, i); | ||
462 | kdl8(ctx->dkey, 6); | ||
463 | break; | ||
464 | } | ||
465 | return 0; | ||
466 | } | ||
467 | |||
468 | static void aes_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src) | ||
469 | { | ||
470 | aes_enc_blk(tfm, dst, src); | ||
471 | } | ||
472 | |||
473 | static void aes_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src) | ||
474 | { | ||
475 | aes_dec_blk(tfm, dst, src); | ||
476 | } | ||
477 | |||
478 | static struct crypto_alg aes_alg = { | ||
479 | .cra_name = "aes", | ||
480 | .cra_driver_name = "aes-i586", | ||
481 | .cra_priority = 200, | ||
482 | .cra_flags = CRYPTO_ALG_TYPE_CIPHER, | ||
483 | .cra_blocksize = AES_BLOCK_SIZE, | ||
484 | .cra_ctxsize = sizeof(struct aes_ctx), | ||
485 | .cra_module = THIS_MODULE, | ||
486 | .cra_list = LIST_HEAD_INIT(aes_alg.cra_list), | ||
487 | .cra_u = { | ||
488 | .cipher = { | ||
489 | .cia_min_keysize = AES_MIN_KEY_SIZE, | ||
490 | .cia_max_keysize = AES_MAX_KEY_SIZE, | ||
491 | .cia_setkey = aes_set_key, | ||
492 | .cia_encrypt = aes_encrypt, | ||
493 | .cia_decrypt = aes_decrypt | ||
494 | } | ||
495 | } | ||
496 | }; | ||
497 | |||
498 | static int __init aes_init(void) | ||
499 | { | ||
500 | gen_tabs(); | ||
501 | return crypto_register_alg(&aes_alg); | ||
502 | } | ||
503 | |||
504 | static void __exit aes_fini(void) | ||
505 | { | ||
506 | crypto_unregister_alg(&aes_alg); | ||
507 | } | ||
508 | |||
509 | module_init(aes_init); | ||
510 | module_exit(aes_fini); | ||
511 | |||
512 | MODULE_DESCRIPTION("Rijndael (AES) Cipher Algorithm, i586 asm optimized"); | ||
513 | MODULE_LICENSE("Dual BSD/GPL"); | ||
514 | MODULE_AUTHOR("Fruhwirth Clemens, James Morris, Brian Gladman, Adam Richter"); | ||
515 | MODULE_ALIAS("aes"); | ||
diff --git a/arch/x86/crypto/aes_64.c b/arch/x86/crypto/aes_64.c deleted file mode 100644 index 5cdb13ea5cc2..000000000000 --- a/arch/x86/crypto/aes_64.c +++ /dev/null | |||
@@ -1,336 +0,0 @@ | |||
1 | /* | ||
2 | * Cryptographic API. | ||
3 | * | ||
4 | * AES Cipher Algorithm. | ||
5 | * | ||
6 | * Based on Brian Gladman's code. | ||
7 | * | ||
8 | * Linux developers: | ||
9 | * Alexander Kjeldaas <astor@fast.no> | ||
10 | * Herbert Valerio Riedel <hvr@hvrlab.org> | ||
11 | * Kyle McMartin <kyle@debian.org> | ||
12 | * Adam J. Richter <adam@yggdrasil.com> (conversion to 2.5 API). | ||
13 | * Andreas Steinmetz <ast@domdv.de> (adapted to x86_64 assembler) | ||
14 | * | ||
15 | * This program is free software; you can redistribute it and/or modify | ||
16 | * it under the terms of the GNU General Public License as published by | ||
17 | * the Free Software Foundation; either version 2 of the License, or | ||
18 | * (at your option) any later version. | ||
19 | * | ||
20 | * --------------------------------------------------------------------------- | ||
21 | * Copyright (c) 2002, Dr Brian Gladman <brg@gladman.me.uk>, Worcester, UK. | ||
22 | * All rights reserved. | ||
23 | * | ||
24 | * LICENSE TERMS | ||
25 | * | ||
26 | * The free distribution and use of this software in both source and binary | ||
27 | * form is allowed (with or without changes) provided that: | ||
28 | * | ||
29 | * 1. distributions of this source code include the above copyright | ||
30 | * notice, this list of conditions and the following disclaimer; | ||
31 | * | ||
32 | * 2. distributions in binary form include the above copyright | ||
33 | * notice, this list of conditions and the following disclaimer | ||
34 | * in the documentation and/or other associated materials; | ||
35 | * | ||
36 | * 3. the copyright holder's name is not used to endorse products | ||
37 | * built using this software without specific written permission. | ||
38 | * | ||
39 | * ALTERNATIVELY, provided that this notice is retained in full, this product | ||
40 | * may be distributed under the terms of the GNU General Public License (GPL), | ||
41 | * in which case the provisions of the GPL apply INSTEAD OF those given above. | ||
42 | * | ||
43 | * DISCLAIMER | ||
44 | * | ||
45 | * This software is provided 'as is' with no explicit or implied warranties | ||
46 | * in respect of its properties, including, but not limited to, correctness | ||
47 | * and/or fitness for purpose. | ||
48 | * --------------------------------------------------------------------------- | ||
49 | */ | ||
50 | |||
51 | /* Some changes from the Gladman version: | ||
52 | s/RIJNDAEL(e_key)/E_KEY/g | ||
53 | s/RIJNDAEL(d_key)/D_KEY/g | ||
54 | */ | ||
55 | |||
56 | #include <asm/byteorder.h> | ||
57 | #include <linux/bitops.h> | ||
58 | #include <linux/crypto.h> | ||
59 | #include <linux/errno.h> | ||
60 | #include <linux/init.h> | ||
61 | #include <linux/module.h> | ||
62 | #include <linux/types.h> | ||
63 | |||
64 | #define AES_MIN_KEY_SIZE 16 | ||
65 | #define AES_MAX_KEY_SIZE 32 | ||
66 | |||
67 | #define AES_BLOCK_SIZE 16 | ||
68 | |||
69 | /* | ||
70 | * #define byte(x, nr) ((unsigned char)((x) >> (nr*8))) | ||
71 | */ | ||
72 | static inline u8 byte(const u32 x, const unsigned n) | ||
73 | { | ||
74 | return x >> (n << 3); | ||
75 | } | ||
76 | |||
77 | struct aes_ctx | ||
78 | { | ||
79 | u32 key_length; | ||
80 | u32 buf[120]; | ||
81 | }; | ||
82 | |||
83 | #define E_KEY (&ctx->buf[0]) | ||
84 | #define D_KEY (&ctx->buf[60]) | ||
85 | |||
86 | static u8 pow_tab[256] __initdata; | ||
87 | static u8 log_tab[256] __initdata; | ||
88 | static u8 sbx_tab[256] __initdata; | ||
89 | static u8 isb_tab[256] __initdata; | ||
90 | static u32 rco_tab[10]; | ||
91 | u32 aes_ft_tab[4][256]; | ||
92 | u32 aes_it_tab[4][256]; | ||
93 | |||
94 | u32 aes_fl_tab[4][256]; | ||
95 | u32 aes_il_tab[4][256]; | ||
96 | |||
97 | static inline u8 f_mult(u8 a, u8 b) | ||
98 | { | ||
99 | u8 aa = log_tab[a], cc = aa + log_tab[b]; | ||
100 | |||
101 | return pow_tab[cc + (cc < aa ? 1 : 0)]; | ||
102 | } | ||
103 | |||
104 | #define ff_mult(a, b) (a && b ? f_mult(a, b) : 0) | ||
105 | |||
106 | #define ls_box(x) \ | ||
107 | (aes_fl_tab[0][byte(x, 0)] ^ \ | ||
108 | aes_fl_tab[1][byte(x, 1)] ^ \ | ||
109 | aes_fl_tab[2][byte(x, 2)] ^ \ | ||
110 | aes_fl_tab[3][byte(x, 3)]) | ||
111 | |||
112 | static void __init gen_tabs(void) | ||
113 | { | ||
114 | u32 i, t; | ||
115 | u8 p, q; | ||
116 | |||
117 | /* log and power tables for GF(2**8) finite field with | ||
118 | 0x011b as modular polynomial - the simplest primitive | ||
119 | root is 0x03, used here to generate the tables */ | ||
120 | |||
121 | for (i = 0, p = 1; i < 256; ++i) { | ||
122 | pow_tab[i] = (u8)p; | ||
123 | log_tab[p] = (u8)i; | ||
124 | |||
125 | p ^= (p << 1) ^ (p & 0x80 ? 0x01b : 0); | ||
126 | } | ||
127 | |||
128 | log_tab[1] = 0; | ||
129 | |||
130 | for (i = 0, p = 1; i < 10; ++i) { | ||
131 | rco_tab[i] = p; | ||
132 | |||
133 | p = (p << 1) ^ (p & 0x80 ? 0x01b : 0); | ||
134 | } | ||
135 | |||
136 | for (i = 0; i < 256; ++i) { | ||
137 | p = (i ? pow_tab[255 - log_tab[i]] : 0); | ||
138 | q = ((p >> 7) | (p << 1)) ^ ((p >> 6) | (p << 2)); | ||
139 | p ^= 0x63 ^ q ^ ((q >> 6) | (q << 2)); | ||
140 | sbx_tab[i] = p; | ||
141 | isb_tab[p] = (u8)i; | ||
142 | } | ||
143 | |||
144 | for (i = 0; i < 256; ++i) { | ||
145 | p = sbx_tab[i]; | ||
146 | |||
147 | t = p; | ||
148 | aes_fl_tab[0][i] = t; | ||
149 | aes_fl_tab[1][i] = rol32(t, 8); | ||
150 | aes_fl_tab[2][i] = rol32(t, 16); | ||
151 | aes_fl_tab[3][i] = rol32(t, 24); | ||
152 | |||
153 | t = ((u32)ff_mult(2, p)) | | ||
154 | ((u32)p << 8) | | ||
155 | ((u32)p << 16) | ((u32)ff_mult(3, p) << 24); | ||
156 | |||
157 | aes_ft_tab[0][i] = t; | ||
158 | aes_ft_tab[1][i] = rol32(t, 8); | ||
159 | aes_ft_tab[2][i] = rol32(t, 16); | ||
160 | aes_ft_tab[3][i] = rol32(t, 24); | ||
161 | |||
162 | p = isb_tab[i]; | ||
163 | |||
164 | t = p; | ||
165 | aes_il_tab[0][i] = t; | ||
166 | aes_il_tab[1][i] = rol32(t, 8); | ||
167 | aes_il_tab[2][i] = rol32(t, 16); | ||
168 | aes_il_tab[3][i] = rol32(t, 24); | ||
169 | |||
170 | t = ((u32)ff_mult(14, p)) | | ||
171 | ((u32)ff_mult(9, p) << 8) | | ||
172 | ((u32)ff_mult(13, p) << 16) | | ||
173 | ((u32)ff_mult(11, p) << 24); | ||
174 | |||
175 | aes_it_tab[0][i] = t; | ||
176 | aes_it_tab[1][i] = rol32(t, 8); | ||
177 | aes_it_tab[2][i] = rol32(t, 16); | ||
178 | aes_it_tab[3][i] = rol32(t, 24); | ||
179 | } | ||
180 | } | ||
181 | |||
182 | #define star_x(x) (((x) & 0x7f7f7f7f) << 1) ^ ((((x) & 0x80808080) >> 7) * 0x1b) | ||
183 | |||
184 | #define imix_col(y, x) \ | ||
185 | u = star_x(x); \ | ||
186 | v = star_x(u); \ | ||
187 | w = star_x(v); \ | ||
188 | t = w ^ (x); \ | ||
189 | (y) = u ^ v ^ w; \ | ||
190 | (y) ^= ror32(u ^ t, 8) ^ \ | ||
191 | ror32(v ^ t, 16) ^ \ | ||
192 | ror32(t, 24) | ||
193 | |||
194 | /* initialise the key schedule from the user supplied key */ | ||
195 | |||
196 | #define loop4(i) \ | ||
197 | { \ | ||
198 | t = ror32(t, 8); t = ls_box(t) ^ rco_tab[i]; \ | ||
199 | t ^= E_KEY[4 * i]; E_KEY[4 * i + 4] = t; \ | ||
200 | t ^= E_KEY[4 * i + 1]; E_KEY[4 * i + 5] = t; \ | ||
201 | t ^= E_KEY[4 * i + 2]; E_KEY[4 * i + 6] = t; \ | ||
202 | t ^= E_KEY[4 * i + 3]; E_KEY[4 * i + 7] = t; \ | ||
203 | } | ||
204 | |||
205 | #define loop6(i) \ | ||
206 | { \ | ||
207 | t = ror32(t, 8); t = ls_box(t) ^ rco_tab[i]; \ | ||
208 | t ^= E_KEY[6 * i]; E_KEY[6 * i + 6] = t; \ | ||
209 | t ^= E_KEY[6 * i + 1]; E_KEY[6 * i + 7] = t; \ | ||
210 | t ^= E_KEY[6 * i + 2]; E_KEY[6 * i + 8] = t; \ | ||
211 | t ^= E_KEY[6 * i + 3]; E_KEY[6 * i + 9] = t; \ | ||
212 | t ^= E_KEY[6 * i + 4]; E_KEY[6 * i + 10] = t; \ | ||
213 | t ^= E_KEY[6 * i + 5]; E_KEY[6 * i + 11] = t; \ | ||
214 | } | ||
215 | |||
216 | #define loop8(i) \ | ||
217 | { \ | ||
218 | t = ror32(t, 8); ; t = ls_box(t) ^ rco_tab[i]; \ | ||
219 | t ^= E_KEY[8 * i]; E_KEY[8 * i + 8] = t; \ | ||
220 | t ^= E_KEY[8 * i + 1]; E_KEY[8 * i + 9] = t; \ | ||
221 | t ^= E_KEY[8 * i + 2]; E_KEY[8 * i + 10] = t; \ | ||
222 | t ^= E_KEY[8 * i + 3]; E_KEY[8 * i + 11] = t; \ | ||
223 | t = E_KEY[8 * i + 4] ^ ls_box(t); \ | ||
224 | E_KEY[8 * i + 12] = t; \ | ||
225 | t ^= E_KEY[8 * i + 5]; E_KEY[8 * i + 13] = t; \ | ||
226 | t ^= E_KEY[8 * i + 6]; E_KEY[8 * i + 14] = t; \ | ||
227 | t ^= E_KEY[8 * i + 7]; E_KEY[8 * i + 15] = t; \ | ||
228 | } | ||
229 | |||
230 | static int aes_set_key(struct crypto_tfm *tfm, const u8 *in_key, | ||
231 | unsigned int key_len) | ||
232 | { | ||
233 | struct aes_ctx *ctx = crypto_tfm_ctx(tfm); | ||
234 | const __le32 *key = (const __le32 *)in_key; | ||
235 | u32 *flags = &tfm->crt_flags; | ||
236 | u32 i, j, t, u, v, w; | ||
237 | |||
238 | if (key_len % 8) { | ||
239 | *flags |= CRYPTO_TFM_RES_BAD_KEY_LEN; | ||
240 | return -EINVAL; | ||
241 | } | ||
242 | |||
243 | ctx->key_length = key_len; | ||
244 | |||
245 | D_KEY[key_len + 24] = E_KEY[0] = le32_to_cpu(key[0]); | ||
246 | D_KEY[key_len + 25] = E_KEY[1] = le32_to_cpu(key[1]); | ||
247 | D_KEY[key_len + 26] = E_KEY[2] = le32_to_cpu(key[2]); | ||
248 | D_KEY[key_len + 27] = E_KEY[3] = le32_to_cpu(key[3]); | ||
249 | |||
250 | switch (key_len) { | ||
251 | case 16: | ||
252 | t = E_KEY[3]; | ||
253 | for (i = 0; i < 10; ++i) | ||
254 | loop4(i); | ||
255 | break; | ||
256 | |||
257 | case 24: | ||
258 | E_KEY[4] = le32_to_cpu(key[4]); | ||
259 | t = E_KEY[5] = le32_to_cpu(key[5]); | ||
260 | for (i = 0; i < 8; ++i) | ||
261 | loop6 (i); | ||
262 | break; | ||
263 | |||
264 | case 32: | ||
265 | E_KEY[4] = le32_to_cpu(key[4]); | ||
266 | E_KEY[5] = le32_to_cpu(key[5]); | ||
267 | E_KEY[6] = le32_to_cpu(key[6]); | ||
268 | t = E_KEY[7] = le32_to_cpu(key[7]); | ||
269 | for (i = 0; i < 7; ++i) | ||
270 | loop8(i); | ||
271 | break; | ||
272 | } | ||
273 | |||
274 | D_KEY[0] = E_KEY[key_len + 24]; | ||
275 | D_KEY[1] = E_KEY[key_len + 25]; | ||
276 | D_KEY[2] = E_KEY[key_len + 26]; | ||
277 | D_KEY[3] = E_KEY[key_len + 27]; | ||
278 | |||
279 | for (i = 4; i < key_len + 24; ++i) { | ||
280 | j = key_len + 24 - (i & ~3) + (i & 3); | ||
281 | imix_col(D_KEY[j], E_KEY[i]); | ||
282 | } | ||
283 | |||
284 | return 0; | ||
285 | } | ||
286 | |||
287 | asmlinkage void aes_enc_blk(struct crypto_tfm *tfm, u8 *out, const u8 *in); | ||
288 | asmlinkage void aes_dec_blk(struct crypto_tfm *tfm, u8 *out, const u8 *in); | ||
289 | |||
290 | static void aes_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src) | ||
291 | { | ||
292 | aes_enc_blk(tfm, dst, src); | ||
293 | } | ||
294 | |||
295 | static void aes_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src) | ||
296 | { | ||
297 | aes_dec_blk(tfm, dst, src); | ||
298 | } | ||
299 | |||
300 | static struct crypto_alg aes_alg = { | ||
301 | .cra_name = "aes", | ||
302 | .cra_driver_name = "aes-x86_64", | ||
303 | .cra_priority = 200, | ||
304 | .cra_flags = CRYPTO_ALG_TYPE_CIPHER, | ||
305 | .cra_blocksize = AES_BLOCK_SIZE, | ||
306 | .cra_ctxsize = sizeof(struct aes_ctx), | ||
307 | .cra_module = THIS_MODULE, | ||
308 | .cra_list = LIST_HEAD_INIT(aes_alg.cra_list), | ||
309 | .cra_u = { | ||
310 | .cipher = { | ||
311 | .cia_min_keysize = AES_MIN_KEY_SIZE, | ||
312 | .cia_max_keysize = AES_MAX_KEY_SIZE, | ||
313 | .cia_setkey = aes_set_key, | ||
314 | .cia_encrypt = aes_encrypt, | ||
315 | .cia_decrypt = aes_decrypt | ||
316 | } | ||
317 | } | ||
318 | }; | ||
319 | |||
320 | static int __init aes_init(void) | ||
321 | { | ||
322 | gen_tabs(); | ||
323 | return crypto_register_alg(&aes_alg); | ||
324 | } | ||
325 | |||
326 | static void __exit aes_fini(void) | ||
327 | { | ||
328 | crypto_unregister_alg(&aes_alg); | ||
329 | } | ||
330 | |||
331 | module_init(aes_init); | ||
332 | module_exit(aes_fini); | ||
333 | |||
334 | MODULE_DESCRIPTION("Rijndael (AES) Cipher Algorithm"); | ||
335 | MODULE_LICENSE("GPL"); | ||
336 | MODULE_ALIAS("aes"); | ||
diff --git a/arch/x86/crypto/aes_glue.c b/arch/x86/crypto/aes_glue.c new file mode 100644 index 000000000000..71f457827116 --- /dev/null +++ b/arch/x86/crypto/aes_glue.c | |||
@@ -0,0 +1,57 @@ | |||
1 | /* | ||
2 | * Glue Code for the asm optimized version of the AES Cipher Algorithm | ||
3 | * | ||
4 | */ | ||
5 | |||
6 | #include <crypto/aes.h> | ||
7 | |||
8 | asmlinkage void aes_enc_blk(struct crypto_tfm *tfm, u8 *out, const u8 *in); | ||
9 | asmlinkage void aes_dec_blk(struct crypto_tfm *tfm, u8 *out, const u8 *in); | ||
10 | |||
11 | static void aes_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src) | ||
12 | { | ||
13 | aes_enc_blk(tfm, dst, src); | ||
14 | } | ||
15 | |||
16 | static void aes_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src) | ||
17 | { | ||
18 | aes_dec_blk(tfm, dst, src); | ||
19 | } | ||
20 | |||
21 | static struct crypto_alg aes_alg = { | ||
22 | .cra_name = "aes", | ||
23 | .cra_driver_name = "aes-asm", | ||
24 | .cra_priority = 200, | ||
25 | .cra_flags = CRYPTO_ALG_TYPE_CIPHER, | ||
26 | .cra_blocksize = AES_BLOCK_SIZE, | ||
27 | .cra_ctxsize = sizeof(struct crypto_aes_ctx), | ||
28 | .cra_module = THIS_MODULE, | ||
29 | .cra_list = LIST_HEAD_INIT(aes_alg.cra_list), | ||
30 | .cra_u = { | ||
31 | .cipher = { | ||
32 | .cia_min_keysize = AES_MIN_KEY_SIZE, | ||
33 | .cia_max_keysize = AES_MAX_KEY_SIZE, | ||
34 | .cia_setkey = crypto_aes_set_key, | ||
35 | .cia_encrypt = aes_encrypt, | ||
36 | .cia_decrypt = aes_decrypt | ||
37 | } | ||
38 | } | ||
39 | }; | ||
40 | |||
41 | static int __init aes_init(void) | ||
42 | { | ||
43 | return crypto_register_alg(&aes_alg); | ||
44 | } | ||
45 | |||
46 | static void __exit aes_fini(void) | ||
47 | { | ||
48 | crypto_unregister_alg(&aes_alg); | ||
49 | } | ||
50 | |||
51 | module_init(aes_init); | ||
52 | module_exit(aes_fini); | ||
53 | |||
54 | MODULE_DESCRIPTION("Rijndael (AES) Cipher Algorithm, asm optimized"); | ||
55 | MODULE_LICENSE("GPL"); | ||
56 | MODULE_ALIAS("aes"); | ||
57 | MODULE_ALIAS("aes-asm"); | ||
diff --git a/arch/x86/crypto/salsa20-i586-asm_32.S b/arch/x86/crypto/salsa20-i586-asm_32.S new file mode 100644 index 000000000000..72eb306680b2 --- /dev/null +++ b/arch/x86/crypto/salsa20-i586-asm_32.S | |||
@@ -0,0 +1,1114 @@ | |||
1 | # salsa20_pm.s version 20051229 | ||
2 | # D. J. Bernstein | ||
3 | # Public domain. | ||
4 | |||
5 | # enter ECRYPT_encrypt_bytes | ||
6 | .text | ||
7 | .p2align 5 | ||
8 | .globl ECRYPT_encrypt_bytes | ||
9 | ECRYPT_encrypt_bytes: | ||
10 | mov %esp,%eax | ||
11 | and $31,%eax | ||
12 | add $256,%eax | ||
13 | sub %eax,%esp | ||
14 | # eax_stack = eax | ||
15 | movl %eax,80(%esp) | ||
16 | # ebx_stack = ebx | ||
17 | movl %ebx,84(%esp) | ||
18 | # esi_stack = esi | ||
19 | movl %esi,88(%esp) | ||
20 | # edi_stack = edi | ||
21 | movl %edi,92(%esp) | ||
22 | # ebp_stack = ebp | ||
23 | movl %ebp,96(%esp) | ||
24 | # x = arg1 | ||
25 | movl 4(%esp,%eax),%edx | ||
26 | # m = arg2 | ||
27 | movl 8(%esp,%eax),%esi | ||
28 | # out = arg3 | ||
29 | movl 12(%esp,%eax),%edi | ||
30 | # bytes = arg4 | ||
31 | movl 16(%esp,%eax),%ebx | ||
32 | # bytes -= 0 | ||
33 | sub $0,%ebx | ||
34 | # goto done if unsigned<= | ||
35 | jbe ._done | ||
36 | ._start: | ||
37 | # in0 = *(uint32 *) (x + 0) | ||
38 | movl 0(%edx),%eax | ||
39 | # in1 = *(uint32 *) (x + 4) | ||
40 | movl 4(%edx),%ecx | ||
41 | # in2 = *(uint32 *) (x + 8) | ||
42 | movl 8(%edx),%ebp | ||
43 | # j0 = in0 | ||
44 | movl %eax,164(%esp) | ||
45 | # in3 = *(uint32 *) (x + 12) | ||
46 | movl 12(%edx),%eax | ||
47 | # j1 = in1 | ||
48 | movl %ecx,168(%esp) | ||
49 | # in4 = *(uint32 *) (x + 16) | ||
50 | movl 16(%edx),%ecx | ||
51 | # j2 = in2 | ||
52 | movl %ebp,172(%esp) | ||
53 | # in5 = *(uint32 *) (x + 20) | ||
54 | movl 20(%edx),%ebp | ||
55 | # j3 = in3 | ||
56 | movl %eax,176(%esp) | ||
57 | # in6 = *(uint32 *) (x + 24) | ||
58 | movl 24(%edx),%eax | ||
59 | # j4 = in4 | ||
60 | movl %ecx,180(%esp) | ||
61 | # in7 = *(uint32 *) (x + 28) | ||
62 | movl 28(%edx),%ecx | ||
63 | # j5 = in5 | ||
64 | movl %ebp,184(%esp) | ||
65 | # in8 = *(uint32 *) (x + 32) | ||
66 | movl 32(%edx),%ebp | ||
67 | # j6 = in6 | ||
68 | movl %eax,188(%esp) | ||
69 | # in9 = *(uint32 *) (x + 36) | ||
70 | movl 36(%edx),%eax | ||
71 | # j7 = in7 | ||
72 | movl %ecx,192(%esp) | ||
73 | # in10 = *(uint32 *) (x + 40) | ||
74 | movl 40(%edx),%ecx | ||
75 | # j8 = in8 | ||
76 | movl %ebp,196(%esp) | ||
77 | # in11 = *(uint32 *) (x + 44) | ||
78 | movl 44(%edx),%ebp | ||
79 | # j9 = in9 | ||
80 | movl %eax,200(%esp) | ||
81 | # in12 = *(uint32 *) (x + 48) | ||
82 | movl 48(%edx),%eax | ||
83 | # j10 = in10 | ||
84 | movl %ecx,204(%esp) | ||
85 | # in13 = *(uint32 *) (x + 52) | ||
86 | movl 52(%edx),%ecx | ||
87 | # j11 = in11 | ||
88 | movl %ebp,208(%esp) | ||
89 | # in14 = *(uint32 *) (x + 56) | ||
90 | movl 56(%edx),%ebp | ||
91 | # j12 = in12 | ||
92 | movl %eax,212(%esp) | ||
93 | # in15 = *(uint32 *) (x + 60) | ||
94 | movl 60(%edx),%eax | ||
95 | # j13 = in13 | ||
96 | movl %ecx,216(%esp) | ||
97 | # j14 = in14 | ||
98 | movl %ebp,220(%esp) | ||
99 | # j15 = in15 | ||
100 | movl %eax,224(%esp) | ||
101 | # x_backup = x | ||
102 | movl %edx,64(%esp) | ||
103 | ._bytesatleast1: | ||
104 | # bytes - 64 | ||
105 | cmp $64,%ebx | ||
106 | # goto nocopy if unsigned>= | ||
107 | jae ._nocopy | ||
108 | # ctarget = out | ||
109 | movl %edi,228(%esp) | ||
110 | # out = &tmp | ||
111 | leal 0(%esp),%edi | ||
112 | # i = bytes | ||
113 | mov %ebx,%ecx | ||
114 | # while (i) { *out++ = *m++; --i } | ||
115 | rep movsb | ||
116 | # out = &tmp | ||
117 | leal 0(%esp),%edi | ||
118 | # m = &tmp | ||
119 | leal 0(%esp),%esi | ||
120 | ._nocopy: | ||
121 | # out_backup = out | ||
122 | movl %edi,72(%esp) | ||
123 | # m_backup = m | ||
124 | movl %esi,68(%esp) | ||
125 | # bytes_backup = bytes | ||
126 | movl %ebx,76(%esp) | ||
127 | # in0 = j0 | ||
128 | movl 164(%esp),%eax | ||
129 | # in1 = j1 | ||
130 | movl 168(%esp),%ecx | ||
131 | # in2 = j2 | ||
132 | movl 172(%esp),%edx | ||
133 | # in3 = j3 | ||
134 | movl 176(%esp),%ebx | ||
135 | # x0 = in0 | ||
136 | movl %eax,100(%esp) | ||
137 | # x1 = in1 | ||
138 | movl %ecx,104(%esp) | ||
139 | # x2 = in2 | ||
140 | movl %edx,108(%esp) | ||
141 | # x3 = in3 | ||
142 | movl %ebx,112(%esp) | ||
143 | # in4 = j4 | ||
144 | movl 180(%esp),%eax | ||
145 | # in5 = j5 | ||
146 | movl 184(%esp),%ecx | ||
147 | # in6 = j6 | ||
148 | movl 188(%esp),%edx | ||
149 | # in7 = j7 | ||
150 | movl 192(%esp),%ebx | ||
151 | # x4 = in4 | ||
152 | movl %eax,116(%esp) | ||
153 | # x5 = in5 | ||
154 | movl %ecx,120(%esp) | ||
155 | # x6 = in6 | ||
156 | movl %edx,124(%esp) | ||
157 | # x7 = in7 | ||
158 | movl %ebx,128(%esp) | ||
159 | # in8 = j8 | ||
160 | movl 196(%esp),%eax | ||
161 | # in9 = j9 | ||
162 | movl 200(%esp),%ecx | ||
163 | # in10 = j10 | ||
164 | movl 204(%esp),%edx | ||
165 | # in11 = j11 | ||
166 | movl 208(%esp),%ebx | ||
167 | # x8 = in8 | ||
168 | movl %eax,132(%esp) | ||
169 | # x9 = in9 | ||
170 | movl %ecx,136(%esp) | ||
171 | # x10 = in10 | ||
172 | movl %edx,140(%esp) | ||
173 | # x11 = in11 | ||
174 | movl %ebx,144(%esp) | ||
175 | # in12 = j12 | ||
176 | movl 212(%esp),%eax | ||
177 | # in13 = j13 | ||
178 | movl 216(%esp),%ecx | ||
179 | # in14 = j14 | ||
180 | movl 220(%esp),%edx | ||
181 | # in15 = j15 | ||
182 | movl 224(%esp),%ebx | ||
183 | # x12 = in12 | ||
184 | movl %eax,148(%esp) | ||
185 | # x13 = in13 | ||
186 | movl %ecx,152(%esp) | ||
187 | # x14 = in14 | ||
188 | movl %edx,156(%esp) | ||
189 | # x15 = in15 | ||
190 | movl %ebx,160(%esp) | ||
191 | # i = 20 | ||
192 | mov $20,%ebp | ||
193 | # p = x0 | ||
194 | movl 100(%esp),%eax | ||
195 | # s = x5 | ||
196 | movl 120(%esp),%ecx | ||
197 | # t = x10 | ||
198 | movl 140(%esp),%edx | ||
199 | # w = x15 | ||
200 | movl 160(%esp),%ebx | ||
201 | ._mainloop: | ||
202 | # x0 = p | ||
203 | movl %eax,100(%esp) | ||
204 | # x10 = t | ||
205 | movl %edx,140(%esp) | ||
206 | # p += x12 | ||
207 | addl 148(%esp),%eax | ||
208 | # x5 = s | ||
209 | movl %ecx,120(%esp) | ||
210 | # t += x6 | ||
211 | addl 124(%esp),%edx | ||
212 | # x15 = w | ||
213 | movl %ebx,160(%esp) | ||
214 | # r = x1 | ||
215 | movl 104(%esp),%esi | ||
216 | # r += s | ||
217 | add %ecx,%esi | ||
218 | # v = x11 | ||
219 | movl 144(%esp),%edi | ||
220 | # v += w | ||
221 | add %ebx,%edi | ||
222 | # p <<<= 7 | ||
223 | rol $7,%eax | ||
224 | # p ^= x4 | ||
225 | xorl 116(%esp),%eax | ||
226 | # t <<<= 7 | ||
227 | rol $7,%edx | ||
228 | # t ^= x14 | ||
229 | xorl 156(%esp),%edx | ||
230 | # r <<<= 7 | ||
231 | rol $7,%esi | ||
232 | # r ^= x9 | ||
233 | xorl 136(%esp),%esi | ||
234 | # v <<<= 7 | ||
235 | rol $7,%edi | ||
236 | # v ^= x3 | ||
237 | xorl 112(%esp),%edi | ||
238 | # x4 = p | ||
239 | movl %eax,116(%esp) | ||
240 | # x14 = t | ||
241 | movl %edx,156(%esp) | ||
242 | # p += x0 | ||
243 | addl 100(%esp),%eax | ||
244 | # x9 = r | ||
245 | movl %esi,136(%esp) | ||
246 | # t += x10 | ||
247 | addl 140(%esp),%edx | ||
248 | # x3 = v | ||
249 | movl %edi,112(%esp) | ||
250 | # p <<<= 9 | ||
251 | rol $9,%eax | ||
252 | # p ^= x8 | ||
253 | xorl 132(%esp),%eax | ||
254 | # t <<<= 9 | ||
255 | rol $9,%edx | ||
256 | # t ^= x2 | ||
257 | xorl 108(%esp),%edx | ||
258 | # s += r | ||
259 | add %esi,%ecx | ||
260 | # s <<<= 9 | ||
261 | rol $9,%ecx | ||
262 | # s ^= x13 | ||
263 | xorl 152(%esp),%ecx | ||
264 | # w += v | ||
265 | add %edi,%ebx | ||
266 | # w <<<= 9 | ||
267 | rol $9,%ebx | ||
268 | # w ^= x7 | ||
269 | xorl 128(%esp),%ebx | ||
270 | # x8 = p | ||
271 | movl %eax,132(%esp) | ||
272 | # x2 = t | ||
273 | movl %edx,108(%esp) | ||
274 | # p += x4 | ||
275 | addl 116(%esp),%eax | ||
276 | # x13 = s | ||
277 | movl %ecx,152(%esp) | ||
278 | # t += x14 | ||
279 | addl 156(%esp),%edx | ||
280 | # x7 = w | ||
281 | movl %ebx,128(%esp) | ||
282 | # p <<<= 13 | ||
283 | rol $13,%eax | ||
284 | # p ^= x12 | ||
285 | xorl 148(%esp),%eax | ||
286 | # t <<<= 13 | ||
287 | rol $13,%edx | ||
288 | # t ^= x6 | ||
289 | xorl 124(%esp),%edx | ||
290 | # r += s | ||
291 | add %ecx,%esi | ||
292 | # r <<<= 13 | ||
293 | rol $13,%esi | ||
294 | # r ^= x1 | ||
295 | xorl 104(%esp),%esi | ||
296 | # v += w | ||
297 | add %ebx,%edi | ||
298 | # v <<<= 13 | ||
299 | rol $13,%edi | ||
300 | # v ^= x11 | ||
301 | xorl 144(%esp),%edi | ||
302 | # x12 = p | ||
303 | movl %eax,148(%esp) | ||
304 | # x6 = t | ||
305 | movl %edx,124(%esp) | ||
306 | # p += x8 | ||
307 | addl 132(%esp),%eax | ||
308 | # x1 = r | ||
309 | movl %esi,104(%esp) | ||
310 | # t += x2 | ||
311 | addl 108(%esp),%edx | ||
312 | # x11 = v | ||
313 | movl %edi,144(%esp) | ||
314 | # p <<<= 18 | ||
315 | rol $18,%eax | ||
316 | # p ^= x0 | ||
317 | xorl 100(%esp),%eax | ||
318 | # t <<<= 18 | ||
319 | rol $18,%edx | ||
320 | # t ^= x10 | ||
321 | xorl 140(%esp),%edx | ||
322 | # s += r | ||
323 | add %esi,%ecx | ||
324 | # s <<<= 18 | ||
325 | rol $18,%ecx | ||
326 | # s ^= x5 | ||
327 | xorl 120(%esp),%ecx | ||
328 | # w += v | ||
329 | add %edi,%ebx | ||
330 | # w <<<= 18 | ||
331 | rol $18,%ebx | ||
332 | # w ^= x15 | ||
333 | xorl 160(%esp),%ebx | ||
334 | # x0 = p | ||
335 | movl %eax,100(%esp) | ||
336 | # x10 = t | ||
337 | movl %edx,140(%esp) | ||
338 | # p += x3 | ||
339 | addl 112(%esp),%eax | ||
340 | # p <<<= 7 | ||
341 | rol $7,%eax | ||
342 | # x5 = s | ||
343 | movl %ecx,120(%esp) | ||
344 | # t += x9 | ||
345 | addl 136(%esp),%edx | ||
346 | # x15 = w | ||
347 | movl %ebx,160(%esp) | ||
348 | # r = x4 | ||
349 | movl 116(%esp),%esi | ||
350 | # r += s | ||
351 | add %ecx,%esi | ||
352 | # v = x14 | ||
353 | movl 156(%esp),%edi | ||
354 | # v += w | ||
355 | add %ebx,%edi | ||
356 | # p ^= x1 | ||
357 | xorl 104(%esp),%eax | ||
358 | # t <<<= 7 | ||
359 | rol $7,%edx | ||
360 | # t ^= x11 | ||
361 | xorl 144(%esp),%edx | ||
362 | # r <<<= 7 | ||
363 | rol $7,%esi | ||
364 | # r ^= x6 | ||
365 | xorl 124(%esp),%esi | ||
366 | # v <<<= 7 | ||
367 | rol $7,%edi | ||
368 | # v ^= x12 | ||
369 | xorl 148(%esp),%edi | ||
370 | # x1 = p | ||
371 | movl %eax,104(%esp) | ||
372 | # x11 = t | ||
373 | movl %edx,144(%esp) | ||
374 | # p += x0 | ||
375 | addl 100(%esp),%eax | ||
376 | # x6 = r | ||
377 | movl %esi,124(%esp) | ||
378 | # t += x10 | ||
379 | addl 140(%esp),%edx | ||
380 | # x12 = v | ||
381 | movl %edi,148(%esp) | ||
382 | # p <<<= 9 | ||
383 | rol $9,%eax | ||
384 | # p ^= x2 | ||
385 | xorl 108(%esp),%eax | ||
386 | # t <<<= 9 | ||
387 | rol $9,%edx | ||
388 | # t ^= x8 | ||
389 | xorl 132(%esp),%edx | ||
390 | # s += r | ||
391 | add %esi,%ecx | ||
392 | # s <<<= 9 | ||
393 | rol $9,%ecx | ||
394 | # s ^= x7 | ||
395 | xorl 128(%esp),%ecx | ||
396 | # w += v | ||
397 | add %edi,%ebx | ||
398 | # w <<<= 9 | ||
399 | rol $9,%ebx | ||
400 | # w ^= x13 | ||
401 | xorl 152(%esp),%ebx | ||
402 | # x2 = p | ||
403 | movl %eax,108(%esp) | ||
404 | # x8 = t | ||
405 | movl %edx,132(%esp) | ||
406 | # p += x1 | ||
407 | addl 104(%esp),%eax | ||
408 | # x7 = s | ||
409 | movl %ecx,128(%esp) | ||
410 | # t += x11 | ||
411 | addl 144(%esp),%edx | ||
412 | # x13 = w | ||
413 | movl %ebx,152(%esp) | ||
414 | # p <<<= 13 | ||
415 | rol $13,%eax | ||
416 | # p ^= x3 | ||
417 | xorl 112(%esp),%eax | ||
418 | # t <<<= 13 | ||
419 | rol $13,%edx | ||
420 | # t ^= x9 | ||
421 | xorl 136(%esp),%edx | ||
422 | # r += s | ||
423 | add %ecx,%esi | ||
424 | # r <<<= 13 | ||
425 | rol $13,%esi | ||
426 | # r ^= x4 | ||
427 | xorl 116(%esp),%esi | ||
428 | # v += w | ||
429 | add %ebx,%edi | ||
430 | # v <<<= 13 | ||
431 | rol $13,%edi | ||
432 | # v ^= x14 | ||
433 | xorl 156(%esp),%edi | ||
434 | # x3 = p | ||
435 | movl %eax,112(%esp) | ||
436 | # x9 = t | ||
437 | movl %edx,136(%esp) | ||
438 | # p += x2 | ||
439 | addl 108(%esp),%eax | ||
440 | # x4 = r | ||
441 | movl %esi,116(%esp) | ||
442 | # t += x8 | ||
443 | addl 132(%esp),%edx | ||
444 | # x14 = v | ||
445 | movl %edi,156(%esp) | ||
446 | # p <<<= 18 | ||
447 | rol $18,%eax | ||
448 | # p ^= x0 | ||
449 | xorl 100(%esp),%eax | ||
450 | # t <<<= 18 | ||
451 | rol $18,%edx | ||
452 | # t ^= x10 | ||
453 | xorl 140(%esp),%edx | ||
454 | # s += r | ||
455 | add %esi,%ecx | ||
456 | # s <<<= 18 | ||
457 | rol $18,%ecx | ||
458 | # s ^= x5 | ||
459 | xorl 120(%esp),%ecx | ||
460 | # w += v | ||
461 | add %edi,%ebx | ||
462 | # w <<<= 18 | ||
463 | rol $18,%ebx | ||
464 | # w ^= x15 | ||
465 | xorl 160(%esp),%ebx | ||
466 | # x0 = p | ||
467 | movl %eax,100(%esp) | ||
468 | # x10 = t | ||
469 | movl %edx,140(%esp) | ||
470 | # p += x12 | ||
471 | addl 148(%esp),%eax | ||
472 | # x5 = s | ||
473 | movl %ecx,120(%esp) | ||
474 | # t += x6 | ||
475 | addl 124(%esp),%edx | ||
476 | # x15 = w | ||
477 | movl %ebx,160(%esp) | ||
478 | # r = x1 | ||
479 | movl 104(%esp),%esi | ||
480 | # r += s | ||
481 | add %ecx,%esi | ||
482 | # v = x11 | ||
483 | movl 144(%esp),%edi | ||
484 | # v += w | ||
485 | add %ebx,%edi | ||
486 | # p <<<= 7 | ||
487 | rol $7,%eax | ||
488 | # p ^= x4 | ||
489 | xorl 116(%esp),%eax | ||
490 | # t <<<= 7 | ||
491 | rol $7,%edx | ||
492 | # t ^= x14 | ||
493 | xorl 156(%esp),%edx | ||
494 | # r <<<= 7 | ||
495 | rol $7,%esi | ||
496 | # r ^= x9 | ||
497 | xorl 136(%esp),%esi | ||
498 | # v <<<= 7 | ||
499 | rol $7,%edi | ||
500 | # v ^= x3 | ||
501 | xorl 112(%esp),%edi | ||
502 | # x4 = p | ||
503 | movl %eax,116(%esp) | ||
504 | # x14 = t | ||
505 | movl %edx,156(%esp) | ||
506 | # p += x0 | ||
507 | addl 100(%esp),%eax | ||
508 | # x9 = r | ||
509 | movl %esi,136(%esp) | ||
510 | # t += x10 | ||
511 | addl 140(%esp),%edx | ||
512 | # x3 = v | ||
513 | movl %edi,112(%esp) | ||
514 | # p <<<= 9 | ||
515 | rol $9,%eax | ||
516 | # p ^= x8 | ||
517 | xorl 132(%esp),%eax | ||
518 | # t <<<= 9 | ||
519 | rol $9,%edx | ||
520 | # t ^= x2 | ||
521 | xorl 108(%esp),%edx | ||
522 | # s += r | ||
523 | add %esi,%ecx | ||
524 | # s <<<= 9 | ||
525 | rol $9,%ecx | ||
526 | # s ^= x13 | ||
527 | xorl 152(%esp),%ecx | ||
528 | # w += v | ||
529 | add %edi,%ebx | ||
530 | # w <<<= 9 | ||
531 | rol $9,%ebx | ||
532 | # w ^= x7 | ||
533 | xorl 128(%esp),%ebx | ||
534 | # x8 = p | ||
535 | movl %eax,132(%esp) | ||
536 | # x2 = t | ||
537 | movl %edx,108(%esp) | ||
538 | # p += x4 | ||
539 | addl 116(%esp),%eax | ||
540 | # x13 = s | ||
541 | movl %ecx,152(%esp) | ||
542 | # t += x14 | ||
543 | addl 156(%esp),%edx | ||
544 | # x7 = w | ||
545 | movl %ebx,128(%esp) | ||
546 | # p <<<= 13 | ||
547 | rol $13,%eax | ||
548 | # p ^= x12 | ||
549 | xorl 148(%esp),%eax | ||
550 | # t <<<= 13 | ||
551 | rol $13,%edx | ||
552 | # t ^= x6 | ||
553 | xorl 124(%esp),%edx | ||
554 | # r += s | ||
555 | add %ecx,%esi | ||
556 | # r <<<= 13 | ||
557 | rol $13,%esi | ||
558 | # r ^= x1 | ||
559 | xorl 104(%esp),%esi | ||
560 | # v += w | ||
561 | add %ebx,%edi | ||
562 | # v <<<= 13 | ||
563 | rol $13,%edi | ||
564 | # v ^= x11 | ||
565 | xorl 144(%esp),%edi | ||
566 | # x12 = p | ||
567 | movl %eax,148(%esp) | ||
568 | # x6 = t | ||
569 | movl %edx,124(%esp) | ||
570 | # p += x8 | ||
571 | addl 132(%esp),%eax | ||
572 | # x1 = r | ||
573 | movl %esi,104(%esp) | ||
574 | # t += x2 | ||
575 | addl 108(%esp),%edx | ||
576 | # x11 = v | ||
577 | movl %edi,144(%esp) | ||
578 | # p <<<= 18 | ||
579 | rol $18,%eax | ||
580 | # p ^= x0 | ||
581 | xorl 100(%esp),%eax | ||
582 | # t <<<= 18 | ||
583 | rol $18,%edx | ||
584 | # t ^= x10 | ||
585 | xorl 140(%esp),%edx | ||
586 | # s += r | ||
587 | add %esi,%ecx | ||
588 | # s <<<= 18 | ||
589 | rol $18,%ecx | ||
590 | # s ^= x5 | ||
591 | xorl 120(%esp),%ecx | ||
592 | # w += v | ||
593 | add %edi,%ebx | ||
594 | # w <<<= 18 | ||
595 | rol $18,%ebx | ||
596 | # w ^= x15 | ||
597 | xorl 160(%esp),%ebx | ||
598 | # x0 = p | ||
599 | movl %eax,100(%esp) | ||
600 | # x10 = t | ||
601 | movl %edx,140(%esp) | ||
602 | # p += x3 | ||
603 | addl 112(%esp),%eax | ||
604 | # p <<<= 7 | ||
605 | rol $7,%eax | ||
606 | # x5 = s | ||
607 | movl %ecx,120(%esp) | ||
608 | # t += x9 | ||
609 | addl 136(%esp),%edx | ||
610 | # x15 = w | ||
611 | movl %ebx,160(%esp) | ||
612 | # r = x4 | ||
613 | movl 116(%esp),%esi | ||
614 | # r += s | ||
615 | add %ecx,%esi | ||
616 | # v = x14 | ||
617 | movl 156(%esp),%edi | ||
618 | # v += w | ||
619 | add %ebx,%edi | ||
620 | # p ^= x1 | ||
621 | xorl 104(%esp),%eax | ||
622 | # t <<<= 7 | ||
623 | rol $7,%edx | ||
624 | # t ^= x11 | ||
625 | xorl 144(%esp),%edx | ||
626 | # r <<<= 7 | ||
627 | rol $7,%esi | ||
628 | # r ^= x6 | ||
629 | xorl 124(%esp),%esi | ||
630 | # v <<<= 7 | ||
631 | rol $7,%edi | ||
632 | # v ^= x12 | ||
633 | xorl 148(%esp),%edi | ||
634 | # x1 = p | ||
635 | movl %eax,104(%esp) | ||
636 | # x11 = t | ||
637 | movl %edx,144(%esp) | ||
638 | # p += x0 | ||
639 | addl 100(%esp),%eax | ||
640 | # x6 = r | ||
641 | movl %esi,124(%esp) | ||
642 | # t += x10 | ||
643 | addl 140(%esp),%edx | ||
644 | # x12 = v | ||
645 | movl %edi,148(%esp) | ||
646 | # p <<<= 9 | ||
647 | rol $9,%eax | ||
648 | # p ^= x2 | ||
649 | xorl 108(%esp),%eax | ||
650 | # t <<<= 9 | ||
651 | rol $9,%edx | ||
652 | # t ^= x8 | ||
653 | xorl 132(%esp),%edx | ||
654 | # s += r | ||
655 | add %esi,%ecx | ||
656 | # s <<<= 9 | ||
657 | rol $9,%ecx | ||
658 | # s ^= x7 | ||
659 | xorl 128(%esp),%ecx | ||
660 | # w += v | ||
661 | add %edi,%ebx | ||
662 | # w <<<= 9 | ||
663 | rol $9,%ebx | ||
664 | # w ^= x13 | ||
665 | xorl 152(%esp),%ebx | ||
666 | # x2 = p | ||
667 | movl %eax,108(%esp) | ||
668 | # x8 = t | ||
669 | movl %edx,132(%esp) | ||
670 | # p += x1 | ||
671 | addl 104(%esp),%eax | ||
672 | # x7 = s | ||
673 | movl %ecx,128(%esp) | ||
674 | # t += x11 | ||
675 | addl 144(%esp),%edx | ||
676 | # x13 = w | ||
677 | movl %ebx,152(%esp) | ||
678 | # p <<<= 13 | ||
679 | rol $13,%eax | ||
680 | # p ^= x3 | ||
681 | xorl 112(%esp),%eax | ||
682 | # t <<<= 13 | ||
683 | rol $13,%edx | ||
684 | # t ^= x9 | ||
685 | xorl 136(%esp),%edx | ||
686 | # r += s | ||
687 | add %ecx,%esi | ||
688 | # r <<<= 13 | ||
689 | rol $13,%esi | ||
690 | # r ^= x4 | ||
691 | xorl 116(%esp),%esi | ||
692 | # v += w | ||
693 | add %ebx,%edi | ||
694 | # v <<<= 13 | ||
695 | rol $13,%edi | ||
696 | # v ^= x14 | ||
697 | xorl 156(%esp),%edi | ||
698 | # x3 = p | ||
699 | movl %eax,112(%esp) | ||
700 | # x9 = t | ||
701 | movl %edx,136(%esp) | ||
702 | # p += x2 | ||
703 | addl 108(%esp),%eax | ||
704 | # x4 = r | ||
705 | movl %esi,116(%esp) | ||
706 | # t += x8 | ||
707 | addl 132(%esp),%edx | ||
708 | # x14 = v | ||
709 | movl %edi,156(%esp) | ||
710 | # p <<<= 18 | ||
711 | rol $18,%eax | ||
712 | # p ^= x0 | ||
713 | xorl 100(%esp),%eax | ||
714 | # t <<<= 18 | ||
715 | rol $18,%edx | ||
716 | # t ^= x10 | ||
717 | xorl 140(%esp),%edx | ||
718 | # s += r | ||
719 | add %esi,%ecx | ||
720 | # s <<<= 18 | ||
721 | rol $18,%ecx | ||
722 | # s ^= x5 | ||
723 | xorl 120(%esp),%ecx | ||
724 | # w += v | ||
725 | add %edi,%ebx | ||
726 | # w <<<= 18 | ||
727 | rol $18,%ebx | ||
728 | # w ^= x15 | ||
729 | xorl 160(%esp),%ebx | ||
730 | # i -= 4 | ||
731 | sub $4,%ebp | ||
732 | # goto mainloop if unsigned > | ||
733 | ja ._mainloop | ||
734 | # x0 = p | ||
735 | movl %eax,100(%esp) | ||
736 | # x5 = s | ||
737 | movl %ecx,120(%esp) | ||
738 | # x10 = t | ||
739 | movl %edx,140(%esp) | ||
740 | # x15 = w | ||
741 | movl %ebx,160(%esp) | ||
742 | # out = out_backup | ||
743 | movl 72(%esp),%edi | ||
744 | # m = m_backup | ||
745 | movl 68(%esp),%esi | ||
746 | # in0 = x0 | ||
747 | movl 100(%esp),%eax | ||
748 | # in1 = x1 | ||
749 | movl 104(%esp),%ecx | ||
750 | # in0 += j0 | ||
751 | addl 164(%esp),%eax | ||
752 | # in1 += j1 | ||
753 | addl 168(%esp),%ecx | ||
754 | # in0 ^= *(uint32 *) (m + 0) | ||
755 | xorl 0(%esi),%eax | ||
756 | # in1 ^= *(uint32 *) (m + 4) | ||
757 | xorl 4(%esi),%ecx | ||
758 | # *(uint32 *) (out + 0) = in0 | ||
759 | movl %eax,0(%edi) | ||
760 | # *(uint32 *) (out + 4) = in1 | ||
761 | movl %ecx,4(%edi) | ||
762 | # in2 = x2 | ||
763 | movl 108(%esp),%eax | ||
764 | # in3 = x3 | ||
765 | movl 112(%esp),%ecx | ||
766 | # in2 += j2 | ||
767 | addl 172(%esp),%eax | ||
768 | # in3 += j3 | ||
769 | addl 176(%esp),%ecx | ||
770 | # in2 ^= *(uint32 *) (m + 8) | ||
771 | xorl 8(%esi),%eax | ||
772 | # in3 ^= *(uint32 *) (m + 12) | ||
773 | xorl 12(%esi),%ecx | ||
774 | # *(uint32 *) (out + 8) = in2 | ||
775 | movl %eax,8(%edi) | ||
776 | # *(uint32 *) (out + 12) = in3 | ||
777 | movl %ecx,12(%edi) | ||
778 | # in4 = x4 | ||
779 | movl 116(%esp),%eax | ||
780 | # in5 = x5 | ||
781 | movl 120(%esp),%ecx | ||
782 | # in4 += j4 | ||
783 | addl 180(%esp),%eax | ||
784 | # in5 += j5 | ||
785 | addl 184(%esp),%ecx | ||
786 | # in4 ^= *(uint32 *) (m + 16) | ||
787 | xorl 16(%esi),%eax | ||
788 | # in5 ^= *(uint32 *) (m + 20) | ||
789 | xorl 20(%esi),%ecx | ||
790 | # *(uint32 *) (out + 16) = in4 | ||
791 | movl %eax,16(%edi) | ||
792 | # *(uint32 *) (out + 20) = in5 | ||
793 | movl %ecx,20(%edi) | ||
794 | # in6 = x6 | ||
795 | movl 124(%esp),%eax | ||
796 | # in7 = x7 | ||
797 | movl 128(%esp),%ecx | ||
798 | # in6 += j6 | ||
799 | addl 188(%esp),%eax | ||
800 | # in7 += j7 | ||
801 | addl 192(%esp),%ecx | ||
802 | # in6 ^= *(uint32 *) (m + 24) | ||
803 | xorl 24(%esi),%eax | ||
804 | # in7 ^= *(uint32 *) (m + 28) | ||
805 | xorl 28(%esi),%ecx | ||
806 | # *(uint32 *) (out + 24) = in6 | ||
807 | movl %eax,24(%edi) | ||
808 | # *(uint32 *) (out + 28) = in7 | ||
809 | movl %ecx,28(%edi) | ||
810 | # in8 = x8 | ||
811 | movl 132(%esp),%eax | ||
812 | # in9 = x9 | ||
813 | movl 136(%esp),%ecx | ||
814 | # in8 += j8 | ||
815 | addl 196(%esp),%eax | ||
816 | # in9 += j9 | ||
817 | addl 200(%esp),%ecx | ||
818 | # in8 ^= *(uint32 *) (m + 32) | ||
819 | xorl 32(%esi),%eax | ||
820 | # in9 ^= *(uint32 *) (m + 36) | ||
821 | xorl 36(%esi),%ecx | ||
822 | # *(uint32 *) (out + 32) = in8 | ||
823 | movl %eax,32(%edi) | ||
824 | # *(uint32 *) (out + 36) = in9 | ||
825 | movl %ecx,36(%edi) | ||
826 | # in10 = x10 | ||
827 | movl 140(%esp),%eax | ||
828 | # in11 = x11 | ||
829 | movl 144(%esp),%ecx | ||
830 | # in10 += j10 | ||
831 | addl 204(%esp),%eax | ||
832 | # in11 += j11 | ||
833 | addl 208(%esp),%ecx | ||
834 | # in10 ^= *(uint32 *) (m + 40) | ||
835 | xorl 40(%esi),%eax | ||
836 | # in11 ^= *(uint32 *) (m + 44) | ||
837 | xorl 44(%esi),%ecx | ||
838 | # *(uint32 *) (out + 40) = in10 | ||
839 | movl %eax,40(%edi) | ||
840 | # *(uint32 *) (out + 44) = in11 | ||
841 | movl %ecx,44(%edi) | ||
842 | # in12 = x12 | ||
843 | movl 148(%esp),%eax | ||
844 | # in13 = x13 | ||
845 | movl 152(%esp),%ecx | ||
846 | # in12 += j12 | ||
847 | addl 212(%esp),%eax | ||
848 | # in13 += j13 | ||
849 | addl 216(%esp),%ecx | ||
850 | # in12 ^= *(uint32 *) (m + 48) | ||
851 | xorl 48(%esi),%eax | ||
852 | # in13 ^= *(uint32 *) (m + 52) | ||
853 | xorl 52(%esi),%ecx | ||
854 | # *(uint32 *) (out + 48) = in12 | ||
855 | movl %eax,48(%edi) | ||
856 | # *(uint32 *) (out + 52) = in13 | ||
857 | movl %ecx,52(%edi) | ||
858 | # in14 = x14 | ||
859 | movl 156(%esp),%eax | ||
860 | # in15 = x15 | ||
861 | movl 160(%esp),%ecx | ||
862 | # in14 += j14 | ||
863 | addl 220(%esp),%eax | ||
864 | # in15 += j15 | ||
865 | addl 224(%esp),%ecx | ||
866 | # in14 ^= *(uint32 *) (m + 56) | ||
867 | xorl 56(%esi),%eax | ||
868 | # in15 ^= *(uint32 *) (m + 60) | ||
869 | xorl 60(%esi),%ecx | ||
870 | # *(uint32 *) (out + 56) = in14 | ||
871 | movl %eax,56(%edi) | ||
872 | # *(uint32 *) (out + 60) = in15 | ||
873 | movl %ecx,60(%edi) | ||
874 | # bytes = bytes_backup | ||
875 | movl 76(%esp),%ebx | ||
876 | # in8 = j8 | ||
877 | movl 196(%esp),%eax | ||
878 | # in9 = j9 | ||
879 | movl 200(%esp),%ecx | ||
880 | # in8 += 1 | ||
881 | add $1,%eax | ||
882 | # in9 += 0 + carry | ||
883 | adc $0,%ecx | ||
884 | # j8 = in8 | ||
885 | movl %eax,196(%esp) | ||
886 | # j9 = in9 | ||
887 | movl %ecx,200(%esp) | ||
888 | # bytes - 64 | ||
889 | cmp $64,%ebx | ||
890 | # goto bytesatleast65 if unsigned> | ||
891 | ja ._bytesatleast65 | ||
892 | # goto bytesatleast64 if unsigned>= | ||
893 | jae ._bytesatleast64 | ||
894 | # m = out | ||
895 | mov %edi,%esi | ||
896 | # out = ctarget | ||
897 | movl 228(%esp),%edi | ||
898 | # i = bytes | ||
899 | mov %ebx,%ecx | ||
900 | # while (i) { *out++ = *m++; --i } | ||
901 | rep movsb | ||
902 | ._bytesatleast64: | ||
903 | # x = x_backup | ||
904 | movl 64(%esp),%eax | ||
905 | # in8 = j8 | ||
906 | movl 196(%esp),%ecx | ||
907 | # in9 = j9 | ||
908 | movl 200(%esp),%edx | ||
909 | # *(uint32 *) (x + 32) = in8 | ||
910 | movl %ecx,32(%eax) | ||
911 | # *(uint32 *) (x + 36) = in9 | ||
912 | movl %edx,36(%eax) | ||
913 | ._done: | ||
914 | # eax = eax_stack | ||
915 | movl 80(%esp),%eax | ||
916 | # ebx = ebx_stack | ||
917 | movl 84(%esp),%ebx | ||
918 | # esi = esi_stack | ||
919 | movl 88(%esp),%esi | ||
920 | # edi = edi_stack | ||
921 | movl 92(%esp),%edi | ||
922 | # ebp = ebp_stack | ||
923 | movl 96(%esp),%ebp | ||
924 | # leave | ||
925 | add %eax,%esp | ||
926 | ret | ||
927 | ._bytesatleast65: | ||
928 | # bytes -= 64 | ||
929 | sub $64,%ebx | ||
930 | # out += 64 | ||
931 | add $64,%edi | ||
932 | # m += 64 | ||
933 | add $64,%esi | ||
934 | # goto bytesatleast1 | ||
935 | jmp ._bytesatleast1 | ||
936 | # enter ECRYPT_keysetup | ||
937 | .text | ||
938 | .p2align 5 | ||
939 | .globl ECRYPT_keysetup | ||
940 | ECRYPT_keysetup: | ||
941 | mov %esp,%eax | ||
942 | and $31,%eax | ||
943 | add $256,%eax | ||
944 | sub %eax,%esp | ||
945 | # eax_stack = eax | ||
946 | movl %eax,64(%esp) | ||
947 | # ebx_stack = ebx | ||
948 | movl %ebx,68(%esp) | ||
949 | # esi_stack = esi | ||
950 | movl %esi,72(%esp) | ||
951 | # edi_stack = edi | ||
952 | movl %edi,76(%esp) | ||
953 | # ebp_stack = ebp | ||
954 | movl %ebp,80(%esp) | ||
955 | # k = arg2 | ||
956 | movl 8(%esp,%eax),%ecx | ||
957 | # kbits = arg3 | ||
958 | movl 12(%esp,%eax),%edx | ||
959 | # x = arg1 | ||
960 | movl 4(%esp,%eax),%eax | ||
961 | # in1 = *(uint32 *) (k + 0) | ||
962 | movl 0(%ecx),%ebx | ||
963 | # in2 = *(uint32 *) (k + 4) | ||
964 | movl 4(%ecx),%esi | ||
965 | # in3 = *(uint32 *) (k + 8) | ||
966 | movl 8(%ecx),%edi | ||
967 | # in4 = *(uint32 *) (k + 12) | ||
968 | movl 12(%ecx),%ebp | ||
969 | # *(uint32 *) (x + 4) = in1 | ||
970 | movl %ebx,4(%eax) | ||
971 | # *(uint32 *) (x + 8) = in2 | ||
972 | movl %esi,8(%eax) | ||
973 | # *(uint32 *) (x + 12) = in3 | ||
974 | movl %edi,12(%eax) | ||
975 | # *(uint32 *) (x + 16) = in4 | ||
976 | movl %ebp,16(%eax) | ||
977 | # kbits - 256 | ||
978 | cmp $256,%edx | ||
979 | # goto kbits128 if unsigned< | ||
980 | jb ._kbits128 | ||
981 | ._kbits256: | ||
982 | # in11 = *(uint32 *) (k + 16) | ||
983 | movl 16(%ecx),%edx | ||
984 | # in12 = *(uint32 *) (k + 20) | ||
985 | movl 20(%ecx),%ebx | ||
986 | # in13 = *(uint32 *) (k + 24) | ||
987 | movl 24(%ecx),%esi | ||
988 | # in14 = *(uint32 *) (k + 28) | ||
989 | movl 28(%ecx),%ecx | ||
990 | # *(uint32 *) (x + 44) = in11 | ||
991 | movl %edx,44(%eax) | ||
992 | # *(uint32 *) (x + 48) = in12 | ||
993 | movl %ebx,48(%eax) | ||
994 | # *(uint32 *) (x + 52) = in13 | ||
995 | movl %esi,52(%eax) | ||
996 | # *(uint32 *) (x + 56) = in14 | ||
997 | movl %ecx,56(%eax) | ||
998 | # in0 = 1634760805 | ||
999 | mov $1634760805,%ecx | ||
1000 | # in5 = 857760878 | ||
1001 | mov $857760878,%edx | ||
1002 | # in10 = 2036477234 | ||
1003 | mov $2036477234,%ebx | ||
1004 | # in15 = 1797285236 | ||
1005 | mov $1797285236,%esi | ||
1006 | # *(uint32 *) (x + 0) = in0 | ||
1007 | movl %ecx,0(%eax) | ||
1008 | # *(uint32 *) (x + 20) = in5 | ||
1009 | movl %edx,20(%eax) | ||
1010 | # *(uint32 *) (x + 40) = in10 | ||
1011 | movl %ebx,40(%eax) | ||
1012 | # *(uint32 *) (x + 60) = in15 | ||
1013 | movl %esi,60(%eax) | ||
1014 | # goto keysetupdone | ||
1015 | jmp ._keysetupdone | ||
1016 | ._kbits128: | ||
1017 | # in11 = *(uint32 *) (k + 0) | ||
1018 | movl 0(%ecx),%edx | ||
1019 | # in12 = *(uint32 *) (k + 4) | ||
1020 | movl 4(%ecx),%ebx | ||
1021 | # in13 = *(uint32 *) (k + 8) | ||
1022 | movl 8(%ecx),%esi | ||
1023 | # in14 = *(uint32 *) (k + 12) | ||
1024 | movl 12(%ecx),%ecx | ||
1025 | # *(uint32 *) (x + 44) = in11 | ||
1026 | movl %edx,44(%eax) | ||
1027 | # *(uint32 *) (x + 48) = in12 | ||
1028 | movl %ebx,48(%eax) | ||
1029 | # *(uint32 *) (x + 52) = in13 | ||
1030 | movl %esi,52(%eax) | ||
1031 | # *(uint32 *) (x + 56) = in14 | ||
1032 | movl %ecx,56(%eax) | ||
1033 | # in0 = 1634760805 | ||
1034 | mov $1634760805,%ecx | ||
1035 | # in5 = 824206446 | ||
1036 | mov $824206446,%edx | ||
1037 | # in10 = 2036477238 | ||
1038 | mov $2036477238,%ebx | ||
1039 | # in15 = 1797285236 | ||
1040 | mov $1797285236,%esi | ||
1041 | # *(uint32 *) (x + 0) = in0 | ||
1042 | movl %ecx,0(%eax) | ||
1043 | # *(uint32 *) (x + 20) = in5 | ||
1044 | movl %edx,20(%eax) | ||
1045 | # *(uint32 *) (x + 40) = in10 | ||
1046 | movl %ebx,40(%eax) | ||
1047 | # *(uint32 *) (x + 60) = in15 | ||
1048 | movl %esi,60(%eax) | ||
1049 | ._keysetupdone: | ||
1050 | # eax = eax_stack | ||
1051 | movl 64(%esp),%eax | ||
1052 | # ebx = ebx_stack | ||
1053 | movl 68(%esp),%ebx | ||
1054 | # esi = esi_stack | ||
1055 | movl 72(%esp),%esi | ||
1056 | # edi = edi_stack | ||
1057 | movl 76(%esp),%edi | ||
1058 | # ebp = ebp_stack | ||
1059 | movl 80(%esp),%ebp | ||
1060 | # leave | ||
1061 | add %eax,%esp | ||
1062 | ret | ||
1063 | # enter ECRYPT_ivsetup | ||
1064 | .text | ||
1065 | .p2align 5 | ||
1066 | .globl ECRYPT_ivsetup | ||
1067 | ECRYPT_ivsetup: | ||
1068 | mov %esp,%eax | ||
1069 | and $31,%eax | ||
1070 | add $256,%eax | ||
1071 | sub %eax,%esp | ||
1072 | # eax_stack = eax | ||
1073 | movl %eax,64(%esp) | ||
1074 | # ebx_stack = ebx | ||
1075 | movl %ebx,68(%esp) | ||
1076 | # esi_stack = esi | ||
1077 | movl %esi,72(%esp) | ||
1078 | # edi_stack = edi | ||
1079 | movl %edi,76(%esp) | ||
1080 | # ebp_stack = ebp | ||
1081 | movl %ebp,80(%esp) | ||
1082 | # iv = arg2 | ||
1083 | movl 8(%esp,%eax),%ecx | ||
1084 | # x = arg1 | ||
1085 | movl 4(%esp,%eax),%eax | ||
1086 | # in6 = *(uint32 *) (iv + 0) | ||
1087 | movl 0(%ecx),%edx | ||
1088 | # in7 = *(uint32 *) (iv + 4) | ||
1089 | movl 4(%ecx),%ecx | ||
1090 | # in8 = 0 | ||
1091 | mov $0,%ebx | ||
1092 | # in9 = 0 | ||
1093 | mov $0,%esi | ||
1094 | # *(uint32 *) (x + 24) = in6 | ||
1095 | movl %edx,24(%eax) | ||
1096 | # *(uint32 *) (x + 28) = in7 | ||
1097 | movl %ecx,28(%eax) | ||
1098 | # *(uint32 *) (x + 32) = in8 | ||
1099 | movl %ebx,32(%eax) | ||
1100 | # *(uint32 *) (x + 36) = in9 | ||
1101 | movl %esi,36(%eax) | ||
1102 | # eax = eax_stack | ||
1103 | movl 64(%esp),%eax | ||
1104 | # ebx = ebx_stack | ||
1105 | movl 68(%esp),%ebx | ||
1106 | # esi = esi_stack | ||
1107 | movl 72(%esp),%esi | ||
1108 | # edi = edi_stack | ||
1109 | movl 76(%esp),%edi | ||
1110 | # ebp = ebp_stack | ||
1111 | movl 80(%esp),%ebp | ||
1112 | # leave | ||
1113 | add %eax,%esp | ||
1114 | ret | ||
diff --git a/arch/x86/crypto/salsa20-x86_64-asm_64.S b/arch/x86/crypto/salsa20-x86_64-asm_64.S new file mode 100644 index 000000000000..6214a9b09706 --- /dev/null +++ b/arch/x86/crypto/salsa20-x86_64-asm_64.S | |||
@@ -0,0 +1,920 @@ | |||
1 | # enter ECRYPT_encrypt_bytes | ||
2 | .text | ||
3 | .p2align 5 | ||
4 | .globl ECRYPT_encrypt_bytes | ||
5 | ECRYPT_encrypt_bytes: | ||
6 | mov %rsp,%r11 | ||
7 | and $31,%r11 | ||
8 | add $256,%r11 | ||
9 | sub %r11,%rsp | ||
10 | # x = arg1 | ||
11 | mov %rdi,%r8 | ||
12 | # m = arg2 | ||
13 | mov %rsi,%rsi | ||
14 | # out = arg3 | ||
15 | mov %rdx,%rdi | ||
16 | # bytes = arg4 | ||
17 | mov %rcx,%rdx | ||
18 | # unsigned>? bytes - 0 | ||
19 | cmp $0,%rdx | ||
20 | # comment:fp stack unchanged by jump | ||
21 | # goto done if !unsigned> | ||
22 | jbe ._done | ||
23 | # comment:fp stack unchanged by fallthrough | ||
24 | # start: | ||
25 | ._start: | ||
26 | # r11_stack = r11 | ||
27 | movq %r11,0(%rsp) | ||
28 | # r12_stack = r12 | ||
29 | movq %r12,8(%rsp) | ||
30 | # r13_stack = r13 | ||
31 | movq %r13,16(%rsp) | ||
32 | # r14_stack = r14 | ||
33 | movq %r14,24(%rsp) | ||
34 | # r15_stack = r15 | ||
35 | movq %r15,32(%rsp) | ||
36 | # rbx_stack = rbx | ||
37 | movq %rbx,40(%rsp) | ||
38 | # rbp_stack = rbp | ||
39 | movq %rbp,48(%rsp) | ||
40 | # in0 = *(uint64 *) (x + 0) | ||
41 | movq 0(%r8),%rcx | ||
42 | # in2 = *(uint64 *) (x + 8) | ||
43 | movq 8(%r8),%r9 | ||
44 | # in4 = *(uint64 *) (x + 16) | ||
45 | movq 16(%r8),%rax | ||
46 | # in6 = *(uint64 *) (x + 24) | ||
47 | movq 24(%r8),%r10 | ||
48 | # in8 = *(uint64 *) (x + 32) | ||
49 | movq 32(%r8),%r11 | ||
50 | # in10 = *(uint64 *) (x + 40) | ||
51 | movq 40(%r8),%r12 | ||
52 | # in12 = *(uint64 *) (x + 48) | ||
53 | movq 48(%r8),%r13 | ||
54 | # in14 = *(uint64 *) (x + 56) | ||
55 | movq 56(%r8),%r14 | ||
56 | # j0 = in0 | ||
57 | movq %rcx,56(%rsp) | ||
58 | # j2 = in2 | ||
59 | movq %r9,64(%rsp) | ||
60 | # j4 = in4 | ||
61 | movq %rax,72(%rsp) | ||
62 | # j6 = in6 | ||
63 | movq %r10,80(%rsp) | ||
64 | # j8 = in8 | ||
65 | movq %r11,88(%rsp) | ||
66 | # j10 = in10 | ||
67 | movq %r12,96(%rsp) | ||
68 | # j12 = in12 | ||
69 | movq %r13,104(%rsp) | ||
70 | # j14 = in14 | ||
71 | movq %r14,112(%rsp) | ||
72 | # x_backup = x | ||
73 | movq %r8,120(%rsp) | ||
74 | # bytesatleast1: | ||
75 | ._bytesatleast1: | ||
76 | # unsigned<? bytes - 64 | ||
77 | cmp $64,%rdx | ||
78 | # comment:fp stack unchanged by jump | ||
79 | # goto nocopy if !unsigned< | ||
80 | jae ._nocopy | ||
81 | # ctarget = out | ||
82 | movq %rdi,128(%rsp) | ||
83 | # out = &tmp | ||
84 | leaq 192(%rsp),%rdi | ||
85 | # i = bytes | ||
86 | mov %rdx,%rcx | ||
87 | # while (i) { *out++ = *m++; --i } | ||
88 | rep movsb | ||
89 | # out = &tmp | ||
90 | leaq 192(%rsp),%rdi | ||
91 | # m = &tmp | ||
92 | leaq 192(%rsp),%rsi | ||
93 | # comment:fp stack unchanged by fallthrough | ||
94 | # nocopy: | ||
95 | ._nocopy: | ||
96 | # out_backup = out | ||
97 | movq %rdi,136(%rsp) | ||
98 | # m_backup = m | ||
99 | movq %rsi,144(%rsp) | ||
100 | # bytes_backup = bytes | ||
101 | movq %rdx,152(%rsp) | ||
102 | # x1 = j0 | ||
103 | movq 56(%rsp),%rdi | ||
104 | # x0 = x1 | ||
105 | mov %rdi,%rdx | ||
106 | # (uint64) x1 >>= 32 | ||
107 | shr $32,%rdi | ||
108 | # x3 = j2 | ||
109 | movq 64(%rsp),%rsi | ||
110 | # x2 = x3 | ||
111 | mov %rsi,%rcx | ||
112 | # (uint64) x3 >>= 32 | ||
113 | shr $32,%rsi | ||
114 | # x5 = j4 | ||
115 | movq 72(%rsp),%r8 | ||
116 | # x4 = x5 | ||
117 | mov %r8,%r9 | ||
118 | # (uint64) x5 >>= 32 | ||
119 | shr $32,%r8 | ||
120 | # x5_stack = x5 | ||
121 | movq %r8,160(%rsp) | ||
122 | # x7 = j6 | ||
123 | movq 80(%rsp),%r8 | ||
124 | # x6 = x7 | ||
125 | mov %r8,%rax | ||
126 | # (uint64) x7 >>= 32 | ||
127 | shr $32,%r8 | ||
128 | # x9 = j8 | ||
129 | movq 88(%rsp),%r10 | ||
130 | # x8 = x9 | ||
131 | mov %r10,%r11 | ||
132 | # (uint64) x9 >>= 32 | ||
133 | shr $32,%r10 | ||
134 | # x11 = j10 | ||
135 | movq 96(%rsp),%r12 | ||
136 | # x10 = x11 | ||
137 | mov %r12,%r13 | ||
138 | # x10_stack = x10 | ||
139 | movq %r13,168(%rsp) | ||
140 | # (uint64) x11 >>= 32 | ||
141 | shr $32,%r12 | ||
142 | # x13 = j12 | ||
143 | movq 104(%rsp),%r13 | ||
144 | # x12 = x13 | ||
145 | mov %r13,%r14 | ||
146 | # (uint64) x13 >>= 32 | ||
147 | shr $32,%r13 | ||
148 | # x15 = j14 | ||
149 | movq 112(%rsp),%r15 | ||
150 | # x14 = x15 | ||
151 | mov %r15,%rbx | ||
152 | # (uint64) x15 >>= 32 | ||
153 | shr $32,%r15 | ||
154 | # x15_stack = x15 | ||
155 | movq %r15,176(%rsp) | ||
156 | # i = 20 | ||
157 | mov $20,%r15 | ||
158 | # mainloop: | ||
159 | ._mainloop: | ||
160 | # i_backup = i | ||
161 | movq %r15,184(%rsp) | ||
162 | # x5 = x5_stack | ||
163 | movq 160(%rsp),%r15 | ||
164 | # a = x12 + x0 | ||
165 | lea (%r14,%rdx),%rbp | ||
166 | # (uint32) a <<<= 7 | ||
167 | rol $7,%ebp | ||
168 | # x4 ^= a | ||
169 | xor %rbp,%r9 | ||
170 | # b = x1 + x5 | ||
171 | lea (%rdi,%r15),%rbp | ||
172 | # (uint32) b <<<= 7 | ||
173 | rol $7,%ebp | ||
174 | # x9 ^= b | ||
175 | xor %rbp,%r10 | ||
176 | # a = x0 + x4 | ||
177 | lea (%rdx,%r9),%rbp | ||
178 | # (uint32) a <<<= 9 | ||
179 | rol $9,%ebp | ||
180 | # x8 ^= a | ||
181 | xor %rbp,%r11 | ||
182 | # b = x5 + x9 | ||
183 | lea (%r15,%r10),%rbp | ||
184 | # (uint32) b <<<= 9 | ||
185 | rol $9,%ebp | ||
186 | # x13 ^= b | ||
187 | xor %rbp,%r13 | ||
188 | # a = x4 + x8 | ||
189 | lea (%r9,%r11),%rbp | ||
190 | # (uint32) a <<<= 13 | ||
191 | rol $13,%ebp | ||
192 | # x12 ^= a | ||
193 | xor %rbp,%r14 | ||
194 | # b = x9 + x13 | ||
195 | lea (%r10,%r13),%rbp | ||
196 | # (uint32) b <<<= 13 | ||
197 | rol $13,%ebp | ||
198 | # x1 ^= b | ||
199 | xor %rbp,%rdi | ||
200 | # a = x8 + x12 | ||
201 | lea (%r11,%r14),%rbp | ||
202 | # (uint32) a <<<= 18 | ||
203 | rol $18,%ebp | ||
204 | # x0 ^= a | ||
205 | xor %rbp,%rdx | ||
206 | # b = x13 + x1 | ||
207 | lea (%r13,%rdi),%rbp | ||
208 | # (uint32) b <<<= 18 | ||
209 | rol $18,%ebp | ||
210 | # x5 ^= b | ||
211 | xor %rbp,%r15 | ||
212 | # x10 = x10_stack | ||
213 | movq 168(%rsp),%rbp | ||
214 | # x5_stack = x5 | ||
215 | movq %r15,160(%rsp) | ||
216 | # c = x6 + x10 | ||
217 | lea (%rax,%rbp),%r15 | ||
218 | # (uint32) c <<<= 7 | ||
219 | rol $7,%r15d | ||
220 | # x14 ^= c | ||
221 | xor %r15,%rbx | ||
222 | # c = x10 + x14 | ||
223 | lea (%rbp,%rbx),%r15 | ||
224 | # (uint32) c <<<= 9 | ||
225 | rol $9,%r15d | ||
226 | # x2 ^= c | ||
227 | xor %r15,%rcx | ||
228 | # c = x14 + x2 | ||
229 | lea (%rbx,%rcx),%r15 | ||
230 | # (uint32) c <<<= 13 | ||
231 | rol $13,%r15d | ||
232 | # x6 ^= c | ||
233 | xor %r15,%rax | ||
234 | # c = x2 + x6 | ||
235 | lea (%rcx,%rax),%r15 | ||
236 | # (uint32) c <<<= 18 | ||
237 | rol $18,%r15d | ||
238 | # x10 ^= c | ||
239 | xor %r15,%rbp | ||
240 | # x15 = x15_stack | ||
241 | movq 176(%rsp),%r15 | ||
242 | # x10_stack = x10 | ||
243 | movq %rbp,168(%rsp) | ||
244 | # d = x11 + x15 | ||
245 | lea (%r12,%r15),%rbp | ||
246 | # (uint32) d <<<= 7 | ||
247 | rol $7,%ebp | ||
248 | # x3 ^= d | ||
249 | xor %rbp,%rsi | ||
250 | # d = x15 + x3 | ||
251 | lea (%r15,%rsi),%rbp | ||
252 | # (uint32) d <<<= 9 | ||
253 | rol $9,%ebp | ||
254 | # x7 ^= d | ||
255 | xor %rbp,%r8 | ||
256 | # d = x3 + x7 | ||
257 | lea (%rsi,%r8),%rbp | ||
258 | # (uint32) d <<<= 13 | ||
259 | rol $13,%ebp | ||
260 | # x11 ^= d | ||
261 | xor %rbp,%r12 | ||
262 | # d = x7 + x11 | ||
263 | lea (%r8,%r12),%rbp | ||
264 | # (uint32) d <<<= 18 | ||
265 | rol $18,%ebp | ||
266 | # x15 ^= d | ||
267 | xor %rbp,%r15 | ||
268 | # x15_stack = x15 | ||
269 | movq %r15,176(%rsp) | ||
270 | # x5 = x5_stack | ||
271 | movq 160(%rsp),%r15 | ||
272 | # a = x3 + x0 | ||
273 | lea (%rsi,%rdx),%rbp | ||
274 | # (uint32) a <<<= 7 | ||
275 | rol $7,%ebp | ||
276 | # x1 ^= a | ||
277 | xor %rbp,%rdi | ||
278 | # b = x4 + x5 | ||
279 | lea (%r9,%r15),%rbp | ||
280 | # (uint32) b <<<= 7 | ||
281 | rol $7,%ebp | ||
282 | # x6 ^= b | ||
283 | xor %rbp,%rax | ||
284 | # a = x0 + x1 | ||
285 | lea (%rdx,%rdi),%rbp | ||
286 | # (uint32) a <<<= 9 | ||
287 | rol $9,%ebp | ||
288 | # x2 ^= a | ||
289 | xor %rbp,%rcx | ||
290 | # b = x5 + x6 | ||
291 | lea (%r15,%rax),%rbp | ||
292 | # (uint32) b <<<= 9 | ||
293 | rol $9,%ebp | ||
294 | # x7 ^= b | ||
295 | xor %rbp,%r8 | ||
296 | # a = x1 + x2 | ||
297 | lea (%rdi,%rcx),%rbp | ||
298 | # (uint32) a <<<= 13 | ||
299 | rol $13,%ebp | ||
300 | # x3 ^= a | ||
301 | xor %rbp,%rsi | ||
302 | # b = x6 + x7 | ||
303 | lea (%rax,%r8),%rbp | ||
304 | # (uint32) b <<<= 13 | ||
305 | rol $13,%ebp | ||
306 | # x4 ^= b | ||
307 | xor %rbp,%r9 | ||
308 | # a = x2 + x3 | ||
309 | lea (%rcx,%rsi),%rbp | ||
310 | # (uint32) a <<<= 18 | ||
311 | rol $18,%ebp | ||
312 | # x0 ^= a | ||
313 | xor %rbp,%rdx | ||
314 | # b = x7 + x4 | ||
315 | lea (%r8,%r9),%rbp | ||
316 | # (uint32) b <<<= 18 | ||
317 | rol $18,%ebp | ||
318 | # x5 ^= b | ||
319 | xor %rbp,%r15 | ||
320 | # x10 = x10_stack | ||
321 | movq 168(%rsp),%rbp | ||
322 | # x5_stack = x5 | ||
323 | movq %r15,160(%rsp) | ||
324 | # c = x9 + x10 | ||
325 | lea (%r10,%rbp),%r15 | ||
326 | # (uint32) c <<<= 7 | ||
327 | rol $7,%r15d | ||
328 | # x11 ^= c | ||
329 | xor %r15,%r12 | ||
330 | # c = x10 + x11 | ||
331 | lea (%rbp,%r12),%r15 | ||
332 | # (uint32) c <<<= 9 | ||
333 | rol $9,%r15d | ||
334 | # x8 ^= c | ||
335 | xor %r15,%r11 | ||
336 | # c = x11 + x8 | ||
337 | lea (%r12,%r11),%r15 | ||
338 | # (uint32) c <<<= 13 | ||
339 | rol $13,%r15d | ||
340 | # x9 ^= c | ||
341 | xor %r15,%r10 | ||
342 | # c = x8 + x9 | ||
343 | lea (%r11,%r10),%r15 | ||
344 | # (uint32) c <<<= 18 | ||
345 | rol $18,%r15d | ||
346 | # x10 ^= c | ||
347 | xor %r15,%rbp | ||
348 | # x15 = x15_stack | ||
349 | movq 176(%rsp),%r15 | ||
350 | # x10_stack = x10 | ||
351 | movq %rbp,168(%rsp) | ||
352 | # d = x14 + x15 | ||
353 | lea (%rbx,%r15),%rbp | ||
354 | # (uint32) d <<<= 7 | ||
355 | rol $7,%ebp | ||
356 | # x12 ^= d | ||
357 | xor %rbp,%r14 | ||
358 | # d = x15 + x12 | ||
359 | lea (%r15,%r14),%rbp | ||
360 | # (uint32) d <<<= 9 | ||
361 | rol $9,%ebp | ||
362 | # x13 ^= d | ||
363 | xor %rbp,%r13 | ||
364 | # d = x12 + x13 | ||
365 | lea (%r14,%r13),%rbp | ||
366 | # (uint32) d <<<= 13 | ||
367 | rol $13,%ebp | ||
368 | # x14 ^= d | ||
369 | xor %rbp,%rbx | ||
370 | # d = x13 + x14 | ||
371 | lea (%r13,%rbx),%rbp | ||
372 | # (uint32) d <<<= 18 | ||
373 | rol $18,%ebp | ||
374 | # x15 ^= d | ||
375 | xor %rbp,%r15 | ||
376 | # x15_stack = x15 | ||
377 | movq %r15,176(%rsp) | ||
378 | # x5 = x5_stack | ||
379 | movq 160(%rsp),%r15 | ||
380 | # a = x12 + x0 | ||
381 | lea (%r14,%rdx),%rbp | ||
382 | # (uint32) a <<<= 7 | ||
383 | rol $7,%ebp | ||
384 | # x4 ^= a | ||
385 | xor %rbp,%r9 | ||
386 | # b = x1 + x5 | ||
387 | lea (%rdi,%r15),%rbp | ||
388 | # (uint32) b <<<= 7 | ||
389 | rol $7,%ebp | ||
390 | # x9 ^= b | ||
391 | xor %rbp,%r10 | ||
392 | # a = x0 + x4 | ||
393 | lea (%rdx,%r9),%rbp | ||
394 | # (uint32) a <<<= 9 | ||
395 | rol $9,%ebp | ||
396 | # x8 ^= a | ||
397 | xor %rbp,%r11 | ||
398 | # b = x5 + x9 | ||
399 | lea (%r15,%r10),%rbp | ||
400 | # (uint32) b <<<= 9 | ||
401 | rol $9,%ebp | ||
402 | # x13 ^= b | ||
403 | xor %rbp,%r13 | ||
404 | # a = x4 + x8 | ||
405 | lea (%r9,%r11),%rbp | ||
406 | # (uint32) a <<<= 13 | ||
407 | rol $13,%ebp | ||
408 | # x12 ^= a | ||
409 | xor %rbp,%r14 | ||
410 | # b = x9 + x13 | ||
411 | lea (%r10,%r13),%rbp | ||
412 | # (uint32) b <<<= 13 | ||
413 | rol $13,%ebp | ||
414 | # x1 ^= b | ||
415 | xor %rbp,%rdi | ||
416 | # a = x8 + x12 | ||
417 | lea (%r11,%r14),%rbp | ||
418 | # (uint32) a <<<= 18 | ||
419 | rol $18,%ebp | ||
420 | # x0 ^= a | ||
421 | xor %rbp,%rdx | ||
422 | # b = x13 + x1 | ||
423 | lea (%r13,%rdi),%rbp | ||
424 | # (uint32) b <<<= 18 | ||
425 | rol $18,%ebp | ||
426 | # x5 ^= b | ||
427 | xor %rbp,%r15 | ||
428 | # x10 = x10_stack | ||
429 | movq 168(%rsp),%rbp | ||
430 | # x5_stack = x5 | ||
431 | movq %r15,160(%rsp) | ||
432 | # c = x6 + x10 | ||
433 | lea (%rax,%rbp),%r15 | ||
434 | # (uint32) c <<<= 7 | ||
435 | rol $7,%r15d | ||
436 | # x14 ^= c | ||
437 | xor %r15,%rbx | ||
438 | # c = x10 + x14 | ||
439 | lea (%rbp,%rbx),%r15 | ||
440 | # (uint32) c <<<= 9 | ||
441 | rol $9,%r15d | ||
442 | # x2 ^= c | ||
443 | xor %r15,%rcx | ||
444 | # c = x14 + x2 | ||
445 | lea (%rbx,%rcx),%r15 | ||
446 | # (uint32) c <<<= 13 | ||
447 | rol $13,%r15d | ||
448 | # x6 ^= c | ||
449 | xor %r15,%rax | ||
450 | # c = x2 + x6 | ||
451 | lea (%rcx,%rax),%r15 | ||
452 | # (uint32) c <<<= 18 | ||
453 | rol $18,%r15d | ||
454 | # x10 ^= c | ||
455 | xor %r15,%rbp | ||
456 | # x15 = x15_stack | ||
457 | movq 176(%rsp),%r15 | ||
458 | # x10_stack = x10 | ||
459 | movq %rbp,168(%rsp) | ||
460 | # d = x11 + x15 | ||
461 | lea (%r12,%r15),%rbp | ||
462 | # (uint32) d <<<= 7 | ||
463 | rol $7,%ebp | ||
464 | # x3 ^= d | ||
465 | xor %rbp,%rsi | ||
466 | # d = x15 + x3 | ||
467 | lea (%r15,%rsi),%rbp | ||
468 | # (uint32) d <<<= 9 | ||
469 | rol $9,%ebp | ||
470 | # x7 ^= d | ||
471 | xor %rbp,%r8 | ||
472 | # d = x3 + x7 | ||
473 | lea (%rsi,%r8),%rbp | ||
474 | # (uint32) d <<<= 13 | ||
475 | rol $13,%ebp | ||
476 | # x11 ^= d | ||
477 | xor %rbp,%r12 | ||
478 | # d = x7 + x11 | ||
479 | lea (%r8,%r12),%rbp | ||
480 | # (uint32) d <<<= 18 | ||
481 | rol $18,%ebp | ||
482 | # x15 ^= d | ||
483 | xor %rbp,%r15 | ||
484 | # x15_stack = x15 | ||
485 | movq %r15,176(%rsp) | ||
486 | # x5 = x5_stack | ||
487 | movq 160(%rsp),%r15 | ||
488 | # a = x3 + x0 | ||
489 | lea (%rsi,%rdx),%rbp | ||
490 | # (uint32) a <<<= 7 | ||
491 | rol $7,%ebp | ||
492 | # x1 ^= a | ||
493 | xor %rbp,%rdi | ||
494 | # b = x4 + x5 | ||
495 | lea (%r9,%r15),%rbp | ||
496 | # (uint32) b <<<= 7 | ||
497 | rol $7,%ebp | ||
498 | # x6 ^= b | ||
499 | xor %rbp,%rax | ||
500 | # a = x0 + x1 | ||
501 | lea (%rdx,%rdi),%rbp | ||
502 | # (uint32) a <<<= 9 | ||
503 | rol $9,%ebp | ||
504 | # x2 ^= a | ||
505 | xor %rbp,%rcx | ||
506 | # b = x5 + x6 | ||
507 | lea (%r15,%rax),%rbp | ||
508 | # (uint32) b <<<= 9 | ||
509 | rol $9,%ebp | ||
510 | # x7 ^= b | ||
511 | xor %rbp,%r8 | ||
512 | # a = x1 + x2 | ||
513 | lea (%rdi,%rcx),%rbp | ||
514 | # (uint32) a <<<= 13 | ||
515 | rol $13,%ebp | ||
516 | # x3 ^= a | ||
517 | xor %rbp,%rsi | ||
518 | # b = x6 + x7 | ||
519 | lea (%rax,%r8),%rbp | ||
520 | # (uint32) b <<<= 13 | ||
521 | rol $13,%ebp | ||
522 | # x4 ^= b | ||
523 | xor %rbp,%r9 | ||
524 | # a = x2 + x3 | ||
525 | lea (%rcx,%rsi),%rbp | ||
526 | # (uint32) a <<<= 18 | ||
527 | rol $18,%ebp | ||
528 | # x0 ^= a | ||
529 | xor %rbp,%rdx | ||
530 | # b = x7 + x4 | ||
531 | lea (%r8,%r9),%rbp | ||
532 | # (uint32) b <<<= 18 | ||
533 | rol $18,%ebp | ||
534 | # x5 ^= b | ||
535 | xor %rbp,%r15 | ||
536 | # x10 = x10_stack | ||
537 | movq 168(%rsp),%rbp | ||
538 | # x5_stack = x5 | ||
539 | movq %r15,160(%rsp) | ||
540 | # c = x9 + x10 | ||
541 | lea (%r10,%rbp),%r15 | ||
542 | # (uint32) c <<<= 7 | ||
543 | rol $7,%r15d | ||
544 | # x11 ^= c | ||
545 | xor %r15,%r12 | ||
546 | # c = x10 + x11 | ||
547 | lea (%rbp,%r12),%r15 | ||
548 | # (uint32) c <<<= 9 | ||
549 | rol $9,%r15d | ||
550 | # x8 ^= c | ||
551 | xor %r15,%r11 | ||
552 | # c = x11 + x8 | ||
553 | lea (%r12,%r11),%r15 | ||
554 | # (uint32) c <<<= 13 | ||
555 | rol $13,%r15d | ||
556 | # x9 ^= c | ||
557 | xor %r15,%r10 | ||
558 | # c = x8 + x9 | ||
559 | lea (%r11,%r10),%r15 | ||
560 | # (uint32) c <<<= 18 | ||
561 | rol $18,%r15d | ||
562 | # x10 ^= c | ||
563 | xor %r15,%rbp | ||
564 | # x15 = x15_stack | ||
565 | movq 176(%rsp),%r15 | ||
566 | # x10_stack = x10 | ||
567 | movq %rbp,168(%rsp) | ||
568 | # d = x14 + x15 | ||
569 | lea (%rbx,%r15),%rbp | ||
570 | # (uint32) d <<<= 7 | ||
571 | rol $7,%ebp | ||
572 | # x12 ^= d | ||
573 | xor %rbp,%r14 | ||
574 | # d = x15 + x12 | ||
575 | lea (%r15,%r14),%rbp | ||
576 | # (uint32) d <<<= 9 | ||
577 | rol $9,%ebp | ||
578 | # x13 ^= d | ||
579 | xor %rbp,%r13 | ||
580 | # d = x12 + x13 | ||
581 | lea (%r14,%r13),%rbp | ||
582 | # (uint32) d <<<= 13 | ||
583 | rol $13,%ebp | ||
584 | # x14 ^= d | ||
585 | xor %rbp,%rbx | ||
586 | # d = x13 + x14 | ||
587 | lea (%r13,%rbx),%rbp | ||
588 | # (uint32) d <<<= 18 | ||
589 | rol $18,%ebp | ||
590 | # x15 ^= d | ||
591 | xor %rbp,%r15 | ||
592 | # x15_stack = x15 | ||
593 | movq %r15,176(%rsp) | ||
594 | # i = i_backup | ||
595 | movq 184(%rsp),%r15 | ||
596 | # unsigned>? i -= 4 | ||
597 | sub $4,%r15 | ||
598 | # comment:fp stack unchanged by jump | ||
599 | # goto mainloop if unsigned> | ||
600 | ja ._mainloop | ||
601 | # (uint32) x2 += j2 | ||
602 | addl 64(%rsp),%ecx | ||
603 | # x3 <<= 32 | ||
604 | shl $32,%rsi | ||
605 | # x3 += j2 | ||
606 | addq 64(%rsp),%rsi | ||
607 | # (uint64) x3 >>= 32 | ||
608 | shr $32,%rsi | ||
609 | # x3 <<= 32 | ||
610 | shl $32,%rsi | ||
611 | # x2 += x3 | ||
612 | add %rsi,%rcx | ||
613 | # (uint32) x6 += j6 | ||
614 | addl 80(%rsp),%eax | ||
615 | # x7 <<= 32 | ||
616 | shl $32,%r8 | ||
617 | # x7 += j6 | ||
618 | addq 80(%rsp),%r8 | ||
619 | # (uint64) x7 >>= 32 | ||
620 | shr $32,%r8 | ||
621 | # x7 <<= 32 | ||
622 | shl $32,%r8 | ||
623 | # x6 += x7 | ||
624 | add %r8,%rax | ||
625 | # (uint32) x8 += j8 | ||
626 | addl 88(%rsp),%r11d | ||
627 | # x9 <<= 32 | ||
628 | shl $32,%r10 | ||
629 | # x9 += j8 | ||
630 | addq 88(%rsp),%r10 | ||
631 | # (uint64) x9 >>= 32 | ||
632 | shr $32,%r10 | ||
633 | # x9 <<= 32 | ||
634 | shl $32,%r10 | ||
635 | # x8 += x9 | ||
636 | add %r10,%r11 | ||
637 | # (uint32) x12 += j12 | ||
638 | addl 104(%rsp),%r14d | ||
639 | # x13 <<= 32 | ||
640 | shl $32,%r13 | ||
641 | # x13 += j12 | ||
642 | addq 104(%rsp),%r13 | ||
643 | # (uint64) x13 >>= 32 | ||
644 | shr $32,%r13 | ||
645 | # x13 <<= 32 | ||
646 | shl $32,%r13 | ||
647 | # x12 += x13 | ||
648 | add %r13,%r14 | ||
649 | # (uint32) x0 += j0 | ||
650 | addl 56(%rsp),%edx | ||
651 | # x1 <<= 32 | ||
652 | shl $32,%rdi | ||
653 | # x1 += j0 | ||
654 | addq 56(%rsp),%rdi | ||
655 | # (uint64) x1 >>= 32 | ||
656 | shr $32,%rdi | ||
657 | # x1 <<= 32 | ||
658 | shl $32,%rdi | ||
659 | # x0 += x1 | ||
660 | add %rdi,%rdx | ||
661 | # x5 = x5_stack | ||
662 | movq 160(%rsp),%rdi | ||
663 | # (uint32) x4 += j4 | ||
664 | addl 72(%rsp),%r9d | ||
665 | # x5 <<= 32 | ||
666 | shl $32,%rdi | ||
667 | # x5 += j4 | ||
668 | addq 72(%rsp),%rdi | ||
669 | # (uint64) x5 >>= 32 | ||
670 | shr $32,%rdi | ||
671 | # x5 <<= 32 | ||
672 | shl $32,%rdi | ||
673 | # x4 += x5 | ||
674 | add %rdi,%r9 | ||
675 | # x10 = x10_stack | ||
676 | movq 168(%rsp),%r8 | ||
677 | # (uint32) x10 += j10 | ||
678 | addl 96(%rsp),%r8d | ||
679 | # x11 <<= 32 | ||
680 | shl $32,%r12 | ||
681 | # x11 += j10 | ||
682 | addq 96(%rsp),%r12 | ||
683 | # (uint64) x11 >>= 32 | ||
684 | shr $32,%r12 | ||
685 | # x11 <<= 32 | ||
686 | shl $32,%r12 | ||
687 | # x10 += x11 | ||
688 | add %r12,%r8 | ||
689 | # x15 = x15_stack | ||
690 | movq 176(%rsp),%rdi | ||
691 | # (uint32) x14 += j14 | ||
692 | addl 112(%rsp),%ebx | ||
693 | # x15 <<= 32 | ||
694 | shl $32,%rdi | ||
695 | # x15 += j14 | ||
696 | addq 112(%rsp),%rdi | ||
697 | # (uint64) x15 >>= 32 | ||
698 | shr $32,%rdi | ||
699 | # x15 <<= 32 | ||
700 | shl $32,%rdi | ||
701 | # x14 += x15 | ||
702 | add %rdi,%rbx | ||
703 | # out = out_backup | ||
704 | movq 136(%rsp),%rdi | ||
705 | # m = m_backup | ||
706 | movq 144(%rsp),%rsi | ||
707 | # x0 ^= *(uint64 *) (m + 0) | ||
708 | xorq 0(%rsi),%rdx | ||
709 | # *(uint64 *) (out + 0) = x0 | ||
710 | movq %rdx,0(%rdi) | ||
711 | # x2 ^= *(uint64 *) (m + 8) | ||
712 | xorq 8(%rsi),%rcx | ||
713 | # *(uint64 *) (out + 8) = x2 | ||
714 | movq %rcx,8(%rdi) | ||
715 | # x4 ^= *(uint64 *) (m + 16) | ||
716 | xorq 16(%rsi),%r9 | ||
717 | # *(uint64 *) (out + 16) = x4 | ||
718 | movq %r9,16(%rdi) | ||
719 | # x6 ^= *(uint64 *) (m + 24) | ||
720 | xorq 24(%rsi),%rax | ||
721 | # *(uint64 *) (out + 24) = x6 | ||
722 | movq %rax,24(%rdi) | ||
723 | # x8 ^= *(uint64 *) (m + 32) | ||
724 | xorq 32(%rsi),%r11 | ||
725 | # *(uint64 *) (out + 32) = x8 | ||
726 | movq %r11,32(%rdi) | ||
727 | # x10 ^= *(uint64 *) (m + 40) | ||
728 | xorq 40(%rsi),%r8 | ||
729 | # *(uint64 *) (out + 40) = x10 | ||
730 | movq %r8,40(%rdi) | ||
731 | # x12 ^= *(uint64 *) (m + 48) | ||
732 | xorq 48(%rsi),%r14 | ||
733 | # *(uint64 *) (out + 48) = x12 | ||
734 | movq %r14,48(%rdi) | ||
735 | # x14 ^= *(uint64 *) (m + 56) | ||
736 | xorq 56(%rsi),%rbx | ||
737 | # *(uint64 *) (out + 56) = x14 | ||
738 | movq %rbx,56(%rdi) | ||
739 | # bytes = bytes_backup | ||
740 | movq 152(%rsp),%rdx | ||
741 | # in8 = j8 | ||
742 | movq 88(%rsp),%rcx | ||
743 | # in8 += 1 | ||
744 | add $1,%rcx | ||
745 | # j8 = in8 | ||
746 | movq %rcx,88(%rsp) | ||
747 | # unsigned>? unsigned<? bytes - 64 | ||
748 | cmp $64,%rdx | ||
749 | # comment:fp stack unchanged by jump | ||
750 | # goto bytesatleast65 if unsigned> | ||
751 | ja ._bytesatleast65 | ||
752 | # comment:fp stack unchanged by jump | ||
753 | # goto bytesatleast64 if !unsigned< | ||
754 | jae ._bytesatleast64 | ||
755 | # m = out | ||
756 | mov %rdi,%rsi | ||
757 | # out = ctarget | ||
758 | movq 128(%rsp),%rdi | ||
759 | # i = bytes | ||
760 | mov %rdx,%rcx | ||
761 | # while (i) { *out++ = *m++; --i } | ||
762 | rep movsb | ||
763 | # comment:fp stack unchanged by fallthrough | ||
764 | # bytesatleast64: | ||
765 | ._bytesatleast64: | ||
766 | # x = x_backup | ||
767 | movq 120(%rsp),%rdi | ||
768 | # in8 = j8 | ||
769 | movq 88(%rsp),%rsi | ||
770 | # *(uint64 *) (x + 32) = in8 | ||
771 | movq %rsi,32(%rdi) | ||
772 | # r11 = r11_stack | ||
773 | movq 0(%rsp),%r11 | ||
774 | # r12 = r12_stack | ||
775 | movq 8(%rsp),%r12 | ||
776 | # r13 = r13_stack | ||
777 | movq 16(%rsp),%r13 | ||
778 | # r14 = r14_stack | ||
779 | movq 24(%rsp),%r14 | ||
780 | # r15 = r15_stack | ||
781 | movq 32(%rsp),%r15 | ||
782 | # rbx = rbx_stack | ||
783 | movq 40(%rsp),%rbx | ||
784 | # rbp = rbp_stack | ||
785 | movq 48(%rsp),%rbp | ||
786 | # comment:fp stack unchanged by fallthrough | ||
787 | # done: | ||
788 | ._done: | ||
789 | # leave | ||
790 | add %r11,%rsp | ||
791 | mov %rdi,%rax | ||
792 | mov %rsi,%rdx | ||
793 | ret | ||
794 | # bytesatleast65: | ||
795 | ._bytesatleast65: | ||
796 | # bytes -= 64 | ||
797 | sub $64,%rdx | ||
798 | # out += 64 | ||
799 | add $64,%rdi | ||
800 | # m += 64 | ||
801 | add $64,%rsi | ||
802 | # comment:fp stack unchanged by jump | ||
803 | # goto bytesatleast1 | ||
804 | jmp ._bytesatleast1 | ||
805 | # enter ECRYPT_keysetup | ||
806 | .text | ||
807 | .p2align 5 | ||
808 | .globl ECRYPT_keysetup | ||
809 | ECRYPT_keysetup: | ||
810 | mov %rsp,%r11 | ||
811 | and $31,%r11 | ||
812 | add $256,%r11 | ||
813 | sub %r11,%rsp | ||
814 | # k = arg2 | ||
815 | mov %rsi,%rsi | ||
816 | # kbits = arg3 | ||
817 | mov %rdx,%rdx | ||
818 | # x = arg1 | ||
819 | mov %rdi,%rdi | ||
820 | # in0 = *(uint64 *) (k + 0) | ||
821 | movq 0(%rsi),%r8 | ||
822 | # in2 = *(uint64 *) (k + 8) | ||
823 | movq 8(%rsi),%r9 | ||
824 | # *(uint64 *) (x + 4) = in0 | ||
825 | movq %r8,4(%rdi) | ||
826 | # *(uint64 *) (x + 12) = in2 | ||
827 | movq %r9,12(%rdi) | ||
828 | # unsigned<? kbits - 256 | ||
829 | cmp $256,%rdx | ||
830 | # comment:fp stack unchanged by jump | ||
831 | # goto kbits128 if unsigned< | ||
832 | jb ._kbits128 | ||
833 | # kbits256: | ||
834 | ._kbits256: | ||
835 | # in10 = *(uint64 *) (k + 16) | ||
836 | movq 16(%rsi),%rdx | ||
837 | # in12 = *(uint64 *) (k + 24) | ||
838 | movq 24(%rsi),%rsi | ||
839 | # *(uint64 *) (x + 44) = in10 | ||
840 | movq %rdx,44(%rdi) | ||
841 | # *(uint64 *) (x + 52) = in12 | ||
842 | movq %rsi,52(%rdi) | ||
843 | # in0 = 1634760805 | ||
844 | mov $1634760805,%rsi | ||
845 | # in4 = 857760878 | ||
846 | mov $857760878,%rdx | ||
847 | # in10 = 2036477234 | ||
848 | mov $2036477234,%rcx | ||
849 | # in14 = 1797285236 | ||
850 | mov $1797285236,%r8 | ||
851 | # *(uint32 *) (x + 0) = in0 | ||
852 | movl %esi,0(%rdi) | ||
853 | # *(uint32 *) (x + 20) = in4 | ||
854 | movl %edx,20(%rdi) | ||
855 | # *(uint32 *) (x + 40) = in10 | ||
856 | movl %ecx,40(%rdi) | ||
857 | # *(uint32 *) (x + 60) = in14 | ||
858 | movl %r8d,60(%rdi) | ||
859 | # comment:fp stack unchanged by jump | ||
860 | # goto keysetupdone | ||
861 | jmp ._keysetupdone | ||
862 | # kbits128: | ||
863 | ._kbits128: | ||
864 | # in10 = *(uint64 *) (k + 0) | ||
865 | movq 0(%rsi),%rdx | ||
866 | # in12 = *(uint64 *) (k + 8) | ||
867 | movq 8(%rsi),%rsi | ||
868 | # *(uint64 *) (x + 44) = in10 | ||
869 | movq %rdx,44(%rdi) | ||
870 | # *(uint64 *) (x + 52) = in12 | ||
871 | movq %rsi,52(%rdi) | ||
872 | # in0 = 1634760805 | ||
873 | mov $1634760805,%rsi | ||
874 | # in4 = 824206446 | ||
875 | mov $824206446,%rdx | ||
876 | # in10 = 2036477238 | ||
877 | mov $2036477238,%rcx | ||
878 | # in14 = 1797285236 | ||
879 | mov $1797285236,%r8 | ||
880 | # *(uint32 *) (x + 0) = in0 | ||
881 | movl %esi,0(%rdi) | ||
882 | # *(uint32 *) (x + 20) = in4 | ||
883 | movl %edx,20(%rdi) | ||
884 | # *(uint32 *) (x + 40) = in10 | ||
885 | movl %ecx,40(%rdi) | ||
886 | # *(uint32 *) (x + 60) = in14 | ||
887 | movl %r8d,60(%rdi) | ||
888 | # keysetupdone: | ||
889 | ._keysetupdone: | ||
890 | # leave | ||
891 | add %r11,%rsp | ||
892 | mov %rdi,%rax | ||
893 | mov %rsi,%rdx | ||
894 | ret | ||
895 | # enter ECRYPT_ivsetup | ||
896 | .text | ||
897 | .p2align 5 | ||
898 | .globl ECRYPT_ivsetup | ||
899 | ECRYPT_ivsetup: | ||
900 | mov %rsp,%r11 | ||
901 | and $31,%r11 | ||
902 | add $256,%r11 | ||
903 | sub %r11,%rsp | ||
904 | # iv = arg2 | ||
905 | mov %rsi,%rsi | ||
906 | # x = arg1 | ||
907 | mov %rdi,%rdi | ||
908 | # in6 = *(uint64 *) (iv + 0) | ||
909 | movq 0(%rsi),%rsi | ||
910 | # in8 = 0 | ||
911 | mov $0,%r8 | ||
912 | # *(uint64 *) (x + 24) = in6 | ||
913 | movq %rsi,24(%rdi) | ||
914 | # *(uint64 *) (x + 32) = in8 | ||
915 | movq %r8,32(%rdi) | ||
916 | # leave | ||
917 | add %r11,%rsp | ||
918 | mov %rdi,%rax | ||
919 | mov %rsi,%rdx | ||
920 | ret | ||
diff --git a/arch/x86/crypto/salsa20_glue.c b/arch/x86/crypto/salsa20_glue.c new file mode 100644 index 000000000000..bccb76d80987 --- /dev/null +++ b/arch/x86/crypto/salsa20_glue.c | |||
@@ -0,0 +1,129 @@ | |||
1 | /* | ||
2 | * Glue code for optimized assembly version of Salsa20. | ||
3 | * | ||
4 | * Copyright (c) 2007 Tan Swee Heng <thesweeheng@gmail.com> | ||
5 | * | ||
6 | * The assembly codes are public domain assembly codes written by Daniel. J. | ||
7 | * Bernstein <djb@cr.yp.to>. The codes are modified to include indentation | ||
8 | * and to remove extraneous comments and functions that are not needed. | ||
9 | * - i586 version, renamed as salsa20-i586-asm_32.S | ||
10 | * available from <http://cr.yp.to/snuffle/salsa20/x86-pm/salsa20.s> | ||
11 | * - x86-64 version, renamed as salsa20-x86_64-asm_64.S | ||
12 | * available from <http://cr.yp.to/snuffle/salsa20/amd64-3/salsa20.s> | ||
13 | * | ||
14 | * This program is free software; you can redistribute it and/or modify it | ||
15 | * under the terms of the GNU General Public License as published by the Free | ||
16 | * Software Foundation; either version 2 of the License, or (at your option) | ||
17 | * any later version. | ||
18 | * | ||
19 | */ | ||
20 | |||
21 | #include <crypto/algapi.h> | ||
22 | #include <linux/module.h> | ||
23 | #include <linux/crypto.h> | ||
24 | |||
25 | #define SALSA20_IV_SIZE 8U | ||
26 | #define SALSA20_MIN_KEY_SIZE 16U | ||
27 | #define SALSA20_MAX_KEY_SIZE 32U | ||
28 | |||
29 | // use the ECRYPT_* function names | ||
30 | #define salsa20_keysetup ECRYPT_keysetup | ||
31 | #define salsa20_ivsetup ECRYPT_ivsetup | ||
32 | #define salsa20_encrypt_bytes ECRYPT_encrypt_bytes | ||
33 | |||
34 | struct salsa20_ctx | ||
35 | { | ||
36 | u32 input[16]; | ||
37 | }; | ||
38 | |||
39 | asmlinkage void salsa20_keysetup(struct salsa20_ctx *ctx, const u8 *k, | ||
40 | u32 keysize, u32 ivsize); | ||
41 | asmlinkage void salsa20_ivsetup(struct salsa20_ctx *ctx, const u8 *iv); | ||
42 | asmlinkage void salsa20_encrypt_bytes(struct salsa20_ctx *ctx, | ||
43 | const u8 *src, u8 *dst, u32 bytes); | ||
44 | |||
45 | static int setkey(struct crypto_tfm *tfm, const u8 *key, | ||
46 | unsigned int keysize) | ||
47 | { | ||
48 | struct salsa20_ctx *ctx = crypto_tfm_ctx(tfm); | ||
49 | salsa20_keysetup(ctx, key, keysize*8, SALSA20_IV_SIZE*8); | ||
50 | return 0; | ||
51 | } | ||
52 | |||
53 | static int encrypt(struct blkcipher_desc *desc, | ||
54 | struct scatterlist *dst, struct scatterlist *src, | ||
55 | unsigned int nbytes) | ||
56 | { | ||
57 | struct blkcipher_walk walk; | ||
58 | struct crypto_blkcipher *tfm = desc->tfm; | ||
59 | struct salsa20_ctx *ctx = crypto_blkcipher_ctx(tfm); | ||
60 | int err; | ||
61 | |||
62 | blkcipher_walk_init(&walk, dst, src, nbytes); | ||
63 | err = blkcipher_walk_virt_block(desc, &walk, 64); | ||
64 | |||
65 | salsa20_ivsetup(ctx, walk.iv); | ||
66 | |||
67 | if (likely(walk.nbytes == nbytes)) | ||
68 | { | ||
69 | salsa20_encrypt_bytes(ctx, walk.src.virt.addr, | ||
70 | walk.dst.virt.addr, nbytes); | ||
71 | return blkcipher_walk_done(desc, &walk, 0); | ||
72 | } | ||
73 | |||
74 | while (walk.nbytes >= 64) { | ||
75 | salsa20_encrypt_bytes(ctx, walk.src.virt.addr, | ||
76 | walk.dst.virt.addr, | ||
77 | walk.nbytes - (walk.nbytes % 64)); | ||
78 | err = blkcipher_walk_done(desc, &walk, walk.nbytes % 64); | ||
79 | } | ||
80 | |||
81 | if (walk.nbytes) { | ||
82 | salsa20_encrypt_bytes(ctx, walk.src.virt.addr, | ||
83 | walk.dst.virt.addr, walk.nbytes); | ||
84 | err = blkcipher_walk_done(desc, &walk, 0); | ||
85 | } | ||
86 | |||
87 | return err; | ||
88 | } | ||
89 | |||
90 | static struct crypto_alg alg = { | ||
91 | .cra_name = "salsa20", | ||
92 | .cra_driver_name = "salsa20-asm", | ||
93 | .cra_priority = 200, | ||
94 | .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER, | ||
95 | .cra_type = &crypto_blkcipher_type, | ||
96 | .cra_blocksize = 1, | ||
97 | .cra_ctxsize = sizeof(struct salsa20_ctx), | ||
98 | .cra_alignmask = 3, | ||
99 | .cra_module = THIS_MODULE, | ||
100 | .cra_list = LIST_HEAD_INIT(alg.cra_list), | ||
101 | .cra_u = { | ||
102 | .blkcipher = { | ||
103 | .setkey = setkey, | ||
104 | .encrypt = encrypt, | ||
105 | .decrypt = encrypt, | ||
106 | .min_keysize = SALSA20_MIN_KEY_SIZE, | ||
107 | .max_keysize = SALSA20_MAX_KEY_SIZE, | ||
108 | .ivsize = SALSA20_IV_SIZE, | ||
109 | } | ||
110 | } | ||
111 | }; | ||
112 | |||
113 | static int __init init(void) | ||
114 | { | ||
115 | return crypto_register_alg(&alg); | ||
116 | } | ||
117 | |||
118 | static void __exit fini(void) | ||
119 | { | ||
120 | crypto_unregister_alg(&alg); | ||
121 | } | ||
122 | |||
123 | module_init(init); | ||
124 | module_exit(fini); | ||
125 | |||
126 | MODULE_LICENSE("GPL"); | ||
127 | MODULE_DESCRIPTION ("Salsa20 stream cipher algorithm (optimized assembly version)"); | ||
128 | MODULE_ALIAS("salsa20"); | ||
129 | MODULE_ALIAS("salsa20-asm"); | ||
diff --git a/arch/x86/crypto/twofish_64.c b/arch/x86/crypto/twofish_64.c deleted file mode 100644 index 182d91d5cfb9..000000000000 --- a/arch/x86/crypto/twofish_64.c +++ /dev/null | |||
@@ -1,97 +0,0 @@ | |||
1 | /* | ||
2 | * Glue Code for optimized x86_64 assembler version of TWOFISH | ||
3 | * | ||
4 | * Originally Twofish for GPG | ||
5 | * By Matthew Skala <mskala@ansuz.sooke.bc.ca>, July 26, 1998 | ||
6 | * 256-bit key length added March 20, 1999 | ||
7 | * Some modifications to reduce the text size by Werner Koch, April, 1998 | ||
8 | * Ported to the kerneli patch by Marc Mutz <Marc@Mutz.com> | ||
9 | * Ported to CryptoAPI by Colin Slater <hoho@tacomeat.net> | ||
10 | * | ||
11 | * The original author has disclaimed all copyright interest in this | ||
12 | * code and thus put it in the public domain. The subsequent authors | ||
13 | * have put this under the GNU General Public License. | ||
14 | * | ||
15 | * This program is free software; you can redistribute it and/or modify | ||
16 | * it under the terms of the GNU General Public License as published by | ||
17 | * the Free Software Foundation; either version 2 of the License, or | ||
18 | * (at your option) any later version. | ||
19 | * | ||
20 | * This program is distributed in the hope that it will be useful, | ||
21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
23 | * GNU General Public License for more details. | ||
24 | * | ||
25 | * You should have received a copy of the GNU General Public License | ||
26 | * along with this program; if not, write to the Free Software | ||
27 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 | ||
28 | * USA | ||
29 | * | ||
30 | * This code is a "clean room" implementation, written from the paper | ||
31 | * _Twofish: A 128-Bit Block Cipher_ by Bruce Schneier, John Kelsey, | ||
32 | * Doug Whiting, David Wagner, Chris Hall, and Niels Ferguson, available | ||
33 | * through http://www.counterpane.com/twofish.html | ||
34 | * | ||
35 | * For background information on multiplication in finite fields, used for | ||
36 | * the matrix operations in the key schedule, see the book _Contemporary | ||
37 | * Abstract Algebra_ by Joseph A. Gallian, especially chapter 22 in the | ||
38 | * Third Edition. | ||
39 | */ | ||
40 | |||
41 | #include <crypto/twofish.h> | ||
42 | #include <linux/crypto.h> | ||
43 | #include <linux/init.h> | ||
44 | #include <linux/kernel.h> | ||
45 | #include <linux/module.h> | ||
46 | #include <linux/types.h> | ||
47 | |||
48 | asmlinkage void twofish_enc_blk(struct crypto_tfm *tfm, u8 *dst, const u8 *src); | ||
49 | asmlinkage void twofish_dec_blk(struct crypto_tfm *tfm, u8 *dst, const u8 *src); | ||
50 | |||
51 | static void twofish_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src) | ||
52 | { | ||
53 | twofish_enc_blk(tfm, dst, src); | ||
54 | } | ||
55 | |||
56 | static void twofish_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src) | ||
57 | { | ||
58 | twofish_dec_blk(tfm, dst, src); | ||
59 | } | ||
60 | |||
61 | static struct crypto_alg alg = { | ||
62 | .cra_name = "twofish", | ||
63 | .cra_driver_name = "twofish-x86_64", | ||
64 | .cra_priority = 200, | ||
65 | .cra_flags = CRYPTO_ALG_TYPE_CIPHER, | ||
66 | .cra_blocksize = TF_BLOCK_SIZE, | ||
67 | .cra_ctxsize = sizeof(struct twofish_ctx), | ||
68 | .cra_alignmask = 3, | ||
69 | .cra_module = THIS_MODULE, | ||
70 | .cra_list = LIST_HEAD_INIT(alg.cra_list), | ||
71 | .cra_u = { | ||
72 | .cipher = { | ||
73 | .cia_min_keysize = TF_MIN_KEY_SIZE, | ||
74 | .cia_max_keysize = TF_MAX_KEY_SIZE, | ||
75 | .cia_setkey = twofish_setkey, | ||
76 | .cia_encrypt = twofish_encrypt, | ||
77 | .cia_decrypt = twofish_decrypt | ||
78 | } | ||
79 | } | ||
80 | }; | ||
81 | |||
82 | static int __init init(void) | ||
83 | { | ||
84 | return crypto_register_alg(&alg); | ||
85 | } | ||
86 | |||
87 | static void __exit fini(void) | ||
88 | { | ||
89 | crypto_unregister_alg(&alg); | ||
90 | } | ||
91 | |||
92 | module_init(init); | ||
93 | module_exit(fini); | ||
94 | |||
95 | MODULE_LICENSE("GPL"); | ||
96 | MODULE_DESCRIPTION ("Twofish Cipher Algorithm, x86_64 asm optimized"); | ||
97 | MODULE_ALIAS("twofish"); | ||
diff --git a/arch/x86/crypto/twofish_32.c b/arch/x86/crypto/twofish_glue.c index e3004dfe9c7a..cefaf8b9aa18 100644 --- a/arch/x86/crypto/twofish_32.c +++ b/arch/x86/crypto/twofish_glue.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Glue Code for optimized 586 assembler version of TWOFISH | 2 | * Glue Code for assembler optimized version of TWOFISH |
3 | * | 3 | * |
4 | * Originally Twofish for GPG | 4 | * Originally Twofish for GPG |
5 | * By Matthew Skala <mskala@ansuz.sooke.bc.ca>, July 26, 1998 | 5 | * By Matthew Skala <mskala@ansuz.sooke.bc.ca>, July 26, 1998 |
@@ -44,7 +44,6 @@ | |||
44 | #include <linux/module.h> | 44 | #include <linux/module.h> |
45 | #include <linux/types.h> | 45 | #include <linux/types.h> |
46 | 46 | ||
47 | |||
48 | asmlinkage void twofish_enc_blk(struct crypto_tfm *tfm, u8 *dst, const u8 *src); | 47 | asmlinkage void twofish_enc_blk(struct crypto_tfm *tfm, u8 *dst, const u8 *src); |
49 | asmlinkage void twofish_dec_blk(struct crypto_tfm *tfm, u8 *dst, const u8 *src); | 48 | asmlinkage void twofish_dec_blk(struct crypto_tfm *tfm, u8 *dst, const u8 *src); |
50 | 49 | ||
@@ -60,7 +59,7 @@ static void twofish_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src) | |||
60 | 59 | ||
61 | static struct crypto_alg alg = { | 60 | static struct crypto_alg alg = { |
62 | .cra_name = "twofish", | 61 | .cra_name = "twofish", |
63 | .cra_driver_name = "twofish-i586", | 62 | .cra_driver_name = "twofish-asm", |
64 | .cra_priority = 200, | 63 | .cra_priority = 200, |
65 | .cra_flags = CRYPTO_ALG_TYPE_CIPHER, | 64 | .cra_flags = CRYPTO_ALG_TYPE_CIPHER, |
66 | .cra_blocksize = TF_BLOCK_SIZE, | 65 | .cra_blocksize = TF_BLOCK_SIZE, |
@@ -93,5 +92,6 @@ module_init(init); | |||
93 | module_exit(fini); | 92 | module_exit(fini); |
94 | 93 | ||
95 | MODULE_LICENSE("GPL"); | 94 | MODULE_LICENSE("GPL"); |
96 | MODULE_DESCRIPTION ("Twofish Cipher Algorithm, i586 asm optimized"); | 95 | MODULE_DESCRIPTION ("Twofish Cipher Algorithm, asm optimized"); |
97 | MODULE_ALIAS("twofish"); | 96 | MODULE_ALIAS("twofish"); |
97 | MODULE_ALIAS("twofish-asm"); | ||
diff --git a/crypto/Kconfig b/crypto/Kconfig index 083d2e1dfc21..c3166a1a5bb6 100644 --- a/crypto/Kconfig +++ b/crypto/Kconfig | |||
@@ -24,10 +24,6 @@ config CRYPTO_ALGAPI | |||
24 | help | 24 | help |
25 | This option provides the API for cryptographic algorithms. | 25 | This option provides the API for cryptographic algorithms. |
26 | 26 | ||
27 | config CRYPTO_ABLKCIPHER | ||
28 | tristate | ||
29 | select CRYPTO_BLKCIPHER | ||
30 | |||
31 | config CRYPTO_AEAD | 27 | config CRYPTO_AEAD |
32 | tristate | 28 | tristate |
33 | select CRYPTO_ALGAPI | 29 | select CRYPTO_ALGAPI |
@@ -36,6 +32,15 @@ config CRYPTO_BLKCIPHER | |||
36 | tristate | 32 | tristate |
37 | select CRYPTO_ALGAPI | 33 | select CRYPTO_ALGAPI |
38 | 34 | ||
35 | config CRYPTO_SEQIV | ||
36 | tristate "Sequence Number IV Generator" | ||
37 | select CRYPTO_AEAD | ||
38 | select CRYPTO_BLKCIPHER | ||
39 | help | ||
40 | This IV generator generates an IV based on a sequence number by | ||
41 | xoring it with a salt. This algorithm is mainly useful for CTR | ||
42 | and similar modes. | ||
43 | |||
39 | config CRYPTO_HASH | 44 | config CRYPTO_HASH |
40 | tristate | 45 | tristate |
41 | select CRYPTO_ALGAPI | 46 | select CRYPTO_ALGAPI |
@@ -91,7 +96,7 @@ config CRYPTO_SHA1 | |||
91 | SHA-1 secure hash standard (FIPS 180-1/DFIPS 180-2). | 96 | SHA-1 secure hash standard (FIPS 180-1/DFIPS 180-2). |
92 | 97 | ||
93 | config CRYPTO_SHA256 | 98 | config CRYPTO_SHA256 |
94 | tristate "SHA256 digest algorithm" | 99 | tristate "SHA224 and SHA256 digest algorithm" |
95 | select CRYPTO_ALGAPI | 100 | select CRYPTO_ALGAPI |
96 | help | 101 | help |
97 | SHA256 secure hash standard (DFIPS 180-2). | 102 | SHA256 secure hash standard (DFIPS 180-2). |
@@ -99,6 +104,9 @@ config CRYPTO_SHA256 | |||
99 | This version of SHA implements a 256 bit hash with 128 bits of | 104 | This version of SHA implements a 256 bit hash with 128 bits of |
100 | security against collision attacks. | 105 | security against collision attacks. |
101 | 106 | ||
107 | This code also includes SHA-224, a 224 bit hash with 112 bits | ||
108 | of security against collision attacks. | ||
109 | |||
102 | config CRYPTO_SHA512 | 110 | config CRYPTO_SHA512 |
103 | tristate "SHA384 and SHA512 digest algorithms" | 111 | tristate "SHA384 and SHA512 digest algorithms" |
104 | select CRYPTO_ALGAPI | 112 | select CRYPTO_ALGAPI |
@@ -195,9 +203,34 @@ config CRYPTO_XTS | |||
195 | key size 256, 384 or 512 bits. This implementation currently | 203 | key size 256, 384 or 512 bits. This implementation currently |
196 | can't handle a sectorsize which is not a multiple of 16 bytes. | 204 | can't handle a sectorsize which is not a multiple of 16 bytes. |
197 | 205 | ||
206 | config CRYPTO_CTR | ||
207 | tristate "CTR support" | ||
208 | select CRYPTO_BLKCIPHER | ||
209 | select CRYPTO_SEQIV | ||
210 | select CRYPTO_MANAGER | ||
211 | help | ||
212 | CTR: Counter mode | ||
213 | This block cipher algorithm is required for IPSec. | ||
214 | |||
215 | config CRYPTO_GCM | ||
216 | tristate "GCM/GMAC support" | ||
217 | select CRYPTO_CTR | ||
218 | select CRYPTO_AEAD | ||
219 | select CRYPTO_GF128MUL | ||
220 | help | ||
221 | Support for Galois/Counter Mode (GCM) and Galois Message | ||
222 | Authentication Code (GMAC). Required for IPSec. | ||
223 | |||
224 | config CRYPTO_CCM | ||
225 | tristate "CCM support" | ||
226 | select CRYPTO_CTR | ||
227 | select CRYPTO_AEAD | ||
228 | help | ||
229 | Support for Counter with CBC MAC. Required for IPsec. | ||
230 | |||
198 | config CRYPTO_CRYPTD | 231 | config CRYPTO_CRYPTD |
199 | tristate "Software async crypto daemon" | 232 | tristate "Software async crypto daemon" |
200 | select CRYPTO_ABLKCIPHER | 233 | select CRYPTO_BLKCIPHER |
201 | select CRYPTO_MANAGER | 234 | select CRYPTO_MANAGER |
202 | help | 235 | help |
203 | This is a generic software asynchronous crypto daemon that | 236 | This is a generic software asynchronous crypto daemon that |
@@ -320,6 +353,7 @@ config CRYPTO_AES_586 | |||
320 | tristate "AES cipher algorithms (i586)" | 353 | tristate "AES cipher algorithms (i586)" |
321 | depends on (X86 || UML_X86) && !64BIT | 354 | depends on (X86 || UML_X86) && !64BIT |
322 | select CRYPTO_ALGAPI | 355 | select CRYPTO_ALGAPI |
356 | select CRYPTO_AES | ||
323 | help | 357 | help |
324 | AES cipher algorithms (FIPS-197). AES uses the Rijndael | 358 | AES cipher algorithms (FIPS-197). AES uses the Rijndael |
325 | algorithm. | 359 | algorithm. |
@@ -341,6 +375,7 @@ config CRYPTO_AES_X86_64 | |||
341 | tristate "AES cipher algorithms (x86_64)" | 375 | tristate "AES cipher algorithms (x86_64)" |
342 | depends on (X86 || UML_X86) && 64BIT | 376 | depends on (X86 || UML_X86) && 64BIT |
343 | select CRYPTO_ALGAPI | 377 | select CRYPTO_ALGAPI |
378 | select CRYPTO_AES | ||
344 | help | 379 | help |
345 | AES cipher algorithms (FIPS-197). AES uses the Rijndael | 380 | AES cipher algorithms (FIPS-197). AES uses the Rijndael |
346 | algorithm. | 381 | algorithm. |
@@ -441,6 +476,46 @@ config CRYPTO_SEED | |||
441 | See also: | 476 | See also: |
442 | <http://www.kisa.or.kr/kisa/seed/jsp/seed_eng.jsp> | 477 | <http://www.kisa.or.kr/kisa/seed/jsp/seed_eng.jsp> |
443 | 478 | ||
479 | config CRYPTO_SALSA20 | ||
480 | tristate "Salsa20 stream cipher algorithm (EXPERIMENTAL)" | ||
481 | depends on EXPERIMENTAL | ||
482 | select CRYPTO_BLKCIPHER | ||
483 | help | ||
484 | Salsa20 stream cipher algorithm. | ||
485 | |||
486 | Salsa20 is a stream cipher submitted to eSTREAM, the ECRYPT | ||
487 | Stream Cipher Project. See <http://www.ecrypt.eu.org/stream/> | ||
488 | |||
489 | The Salsa20 stream cipher algorithm is designed by Daniel J. | ||
490 | Bernstein <djb@cr.yp.to>. See <http://cr.yp.to/snuffle.html> | ||
491 | |||
492 | config CRYPTO_SALSA20_586 | ||
493 | tristate "Salsa20 stream cipher algorithm (i586) (EXPERIMENTAL)" | ||
494 | depends on (X86 || UML_X86) && !64BIT | ||
495 | depends on EXPERIMENTAL | ||
496 | select CRYPTO_BLKCIPHER | ||
497 | help | ||
498 | Salsa20 stream cipher algorithm. | ||
499 | |||
500 | Salsa20 is a stream cipher submitted to eSTREAM, the ECRYPT | ||
501 | Stream Cipher Project. See <http://www.ecrypt.eu.org/stream/> | ||
502 | |||
503 | The Salsa20 stream cipher algorithm is designed by Daniel J. | ||
504 | Bernstein <djb@cr.yp.to>. See <http://cr.yp.to/snuffle.html> | ||
505 | |||
506 | config CRYPTO_SALSA20_X86_64 | ||
507 | tristate "Salsa20 stream cipher algorithm (x86_64) (EXPERIMENTAL)" | ||
508 | depends on (X86 || UML_X86) && 64BIT | ||
509 | depends on EXPERIMENTAL | ||
510 | select CRYPTO_BLKCIPHER | ||
511 | help | ||
512 | Salsa20 stream cipher algorithm. | ||
513 | |||
514 | Salsa20 is a stream cipher submitted to eSTREAM, the ECRYPT | ||
515 | Stream Cipher Project. See <http://www.ecrypt.eu.org/stream/> | ||
516 | |||
517 | The Salsa20 stream cipher algorithm is designed by Daniel J. | ||
518 | Bernstein <djb@cr.yp.to>. See <http://cr.yp.to/snuffle.html> | ||
444 | 519 | ||
445 | config CRYPTO_DEFLATE | 520 | config CRYPTO_DEFLATE |
446 | tristate "Deflate compression algorithm" | 521 | tristate "Deflate compression algorithm" |
@@ -491,6 +566,7 @@ config CRYPTO_TEST | |||
491 | tristate "Testing module" | 566 | tristate "Testing module" |
492 | depends on m | 567 | depends on m |
493 | select CRYPTO_ALGAPI | 568 | select CRYPTO_ALGAPI |
569 | select CRYPTO_AEAD | ||
494 | help | 570 | help |
495 | Quick & dirty crypto test module. | 571 | Quick & dirty crypto test module. |
496 | 572 | ||
@@ -498,10 +574,19 @@ config CRYPTO_AUTHENC | |||
498 | tristate "Authenc support" | 574 | tristate "Authenc support" |
499 | select CRYPTO_AEAD | 575 | select CRYPTO_AEAD |
500 | select CRYPTO_MANAGER | 576 | select CRYPTO_MANAGER |
577 | select CRYPTO_HASH | ||
501 | help | 578 | help |
502 | Authenc: Combined mode wrapper for IPsec. | 579 | Authenc: Combined mode wrapper for IPsec. |
503 | This is required for IPSec. | 580 | This is required for IPSec. |
504 | 581 | ||
582 | config CRYPTO_LZO | ||
583 | tristate "LZO compression algorithm" | ||
584 | select CRYPTO_ALGAPI | ||
585 | select LZO_COMPRESS | ||
586 | select LZO_DECOMPRESS | ||
587 | help | ||
588 | This is the LZO algorithm. | ||
589 | |||
505 | source "drivers/crypto/Kconfig" | 590 | source "drivers/crypto/Kconfig" |
506 | 591 | ||
507 | endif # if CRYPTO | 592 | endif # if CRYPTO |
diff --git a/crypto/Makefile b/crypto/Makefile index 43c2a0dc9936..48c758379954 100644 --- a/crypto/Makefile +++ b/crypto/Makefile | |||
@@ -8,9 +8,14 @@ crypto_algapi-$(CONFIG_PROC_FS) += proc.o | |||
8 | crypto_algapi-objs := algapi.o scatterwalk.o $(crypto_algapi-y) | 8 | crypto_algapi-objs := algapi.o scatterwalk.o $(crypto_algapi-y) |
9 | obj-$(CONFIG_CRYPTO_ALGAPI) += crypto_algapi.o | 9 | obj-$(CONFIG_CRYPTO_ALGAPI) += crypto_algapi.o |
10 | 10 | ||
11 | obj-$(CONFIG_CRYPTO_ABLKCIPHER) += ablkcipher.o | ||
12 | obj-$(CONFIG_CRYPTO_AEAD) += aead.o | 11 | obj-$(CONFIG_CRYPTO_AEAD) += aead.o |
13 | obj-$(CONFIG_CRYPTO_BLKCIPHER) += blkcipher.o | 12 | |
13 | crypto_blkcipher-objs := ablkcipher.o | ||
14 | crypto_blkcipher-objs += blkcipher.o | ||
15 | obj-$(CONFIG_CRYPTO_BLKCIPHER) += crypto_blkcipher.o | ||
16 | obj-$(CONFIG_CRYPTO_BLKCIPHER) += chainiv.o | ||
17 | obj-$(CONFIG_CRYPTO_BLKCIPHER) += eseqiv.o | ||
18 | obj-$(CONFIG_CRYPTO_SEQIV) += seqiv.o | ||
14 | 19 | ||
15 | crypto_hash-objs := hash.o | 20 | crypto_hash-objs := hash.o |
16 | obj-$(CONFIG_CRYPTO_HASH) += crypto_hash.o | 21 | obj-$(CONFIG_CRYPTO_HASH) += crypto_hash.o |
@@ -32,6 +37,9 @@ obj-$(CONFIG_CRYPTO_CBC) += cbc.o | |||
32 | obj-$(CONFIG_CRYPTO_PCBC) += pcbc.o | 37 | obj-$(CONFIG_CRYPTO_PCBC) += pcbc.o |
33 | obj-$(CONFIG_CRYPTO_LRW) += lrw.o | 38 | obj-$(CONFIG_CRYPTO_LRW) += lrw.o |
34 | obj-$(CONFIG_CRYPTO_XTS) += xts.o | 39 | obj-$(CONFIG_CRYPTO_XTS) += xts.o |
40 | obj-$(CONFIG_CRYPTO_CTR) += ctr.o | ||
41 | obj-$(CONFIG_CRYPTO_GCM) += gcm.o | ||
42 | obj-$(CONFIG_CRYPTO_CCM) += ccm.o | ||
35 | obj-$(CONFIG_CRYPTO_CRYPTD) += cryptd.o | 43 | obj-$(CONFIG_CRYPTO_CRYPTD) += cryptd.o |
36 | obj-$(CONFIG_CRYPTO_DES) += des_generic.o | 44 | obj-$(CONFIG_CRYPTO_DES) += des_generic.o |
37 | obj-$(CONFIG_CRYPTO_FCRYPT) += fcrypt.o | 45 | obj-$(CONFIG_CRYPTO_FCRYPT) += fcrypt.o |
@@ -48,10 +56,12 @@ obj-$(CONFIG_CRYPTO_TEA) += tea.o | |||
48 | obj-$(CONFIG_CRYPTO_KHAZAD) += khazad.o | 56 | obj-$(CONFIG_CRYPTO_KHAZAD) += khazad.o |
49 | obj-$(CONFIG_CRYPTO_ANUBIS) += anubis.o | 57 | obj-$(CONFIG_CRYPTO_ANUBIS) += anubis.o |
50 | obj-$(CONFIG_CRYPTO_SEED) += seed.o | 58 | obj-$(CONFIG_CRYPTO_SEED) += seed.o |
59 | obj-$(CONFIG_CRYPTO_SALSA20) += salsa20_generic.o | ||
51 | obj-$(CONFIG_CRYPTO_DEFLATE) += deflate.o | 60 | obj-$(CONFIG_CRYPTO_DEFLATE) += deflate.o |
52 | obj-$(CONFIG_CRYPTO_MICHAEL_MIC) += michael_mic.o | 61 | obj-$(CONFIG_CRYPTO_MICHAEL_MIC) += michael_mic.o |
53 | obj-$(CONFIG_CRYPTO_CRC32C) += crc32c.o | 62 | obj-$(CONFIG_CRYPTO_CRC32C) += crc32c.o |
54 | obj-$(CONFIG_CRYPTO_AUTHENC) += authenc.o | 63 | obj-$(CONFIG_CRYPTO_AUTHENC) += authenc.o |
64 | obj-$(CONFIG_CRYPTO_LZO) += lzo.o | ||
55 | 65 | ||
56 | obj-$(CONFIG_CRYPTO_TEST) += tcrypt.o | 66 | obj-$(CONFIG_CRYPTO_TEST) += tcrypt.o |
57 | 67 | ||
diff --git a/crypto/ablkcipher.c b/crypto/ablkcipher.c index 2731acb86e7d..3bcb099b4a85 100644 --- a/crypto/ablkcipher.c +++ b/crypto/ablkcipher.c | |||
@@ -13,14 +13,18 @@ | |||
13 | * | 13 | * |
14 | */ | 14 | */ |
15 | 15 | ||
16 | #include <crypto/algapi.h> | 16 | #include <crypto/internal/skcipher.h> |
17 | #include <linux/errno.h> | 17 | #include <linux/err.h> |
18 | #include <linux/init.h> | 18 | #include <linux/init.h> |
19 | #include <linux/kernel.h> | 19 | #include <linux/kernel.h> |
20 | #include <linux/module.h> | 20 | #include <linux/module.h> |
21 | #include <linux/rtnetlink.h> | ||
22 | #include <linux/sched.h> | ||
21 | #include <linux/slab.h> | 23 | #include <linux/slab.h> |
22 | #include <linux/seq_file.h> | 24 | #include <linux/seq_file.h> |
23 | 25 | ||
26 | #include "internal.h" | ||
27 | |||
24 | static int setkey_unaligned(struct crypto_ablkcipher *tfm, const u8 *key, | 28 | static int setkey_unaligned(struct crypto_ablkcipher *tfm, const u8 *key, |
25 | unsigned int keylen) | 29 | unsigned int keylen) |
26 | { | 30 | { |
@@ -66,6 +70,16 @@ static unsigned int crypto_ablkcipher_ctxsize(struct crypto_alg *alg, u32 type, | |||
66 | return alg->cra_ctxsize; | 70 | return alg->cra_ctxsize; |
67 | } | 71 | } |
68 | 72 | ||
73 | int skcipher_null_givencrypt(struct skcipher_givcrypt_request *req) | ||
74 | { | ||
75 | return crypto_ablkcipher_encrypt(&req->creq); | ||
76 | } | ||
77 | |||
78 | int skcipher_null_givdecrypt(struct skcipher_givcrypt_request *req) | ||
79 | { | ||
80 | return crypto_ablkcipher_decrypt(&req->creq); | ||
81 | } | ||
82 | |||
69 | static int crypto_init_ablkcipher_ops(struct crypto_tfm *tfm, u32 type, | 83 | static int crypto_init_ablkcipher_ops(struct crypto_tfm *tfm, u32 type, |
70 | u32 mask) | 84 | u32 mask) |
71 | { | 85 | { |
@@ -78,6 +92,11 @@ static int crypto_init_ablkcipher_ops(struct crypto_tfm *tfm, u32 type, | |||
78 | crt->setkey = setkey; | 92 | crt->setkey = setkey; |
79 | crt->encrypt = alg->encrypt; | 93 | crt->encrypt = alg->encrypt; |
80 | crt->decrypt = alg->decrypt; | 94 | crt->decrypt = alg->decrypt; |
95 | if (!alg->ivsize) { | ||
96 | crt->givencrypt = skcipher_null_givencrypt; | ||
97 | crt->givdecrypt = skcipher_null_givdecrypt; | ||
98 | } | ||
99 | crt->base = __crypto_ablkcipher_cast(tfm); | ||
81 | crt->ivsize = alg->ivsize; | 100 | crt->ivsize = alg->ivsize; |
82 | 101 | ||
83 | return 0; | 102 | return 0; |
@@ -90,10 +109,13 @@ static void crypto_ablkcipher_show(struct seq_file *m, struct crypto_alg *alg) | |||
90 | struct ablkcipher_alg *ablkcipher = &alg->cra_ablkcipher; | 109 | struct ablkcipher_alg *ablkcipher = &alg->cra_ablkcipher; |
91 | 110 | ||
92 | seq_printf(m, "type : ablkcipher\n"); | 111 | seq_printf(m, "type : ablkcipher\n"); |
112 | seq_printf(m, "async : %s\n", alg->cra_flags & CRYPTO_ALG_ASYNC ? | ||
113 | "yes" : "no"); | ||
93 | seq_printf(m, "blocksize : %u\n", alg->cra_blocksize); | 114 | seq_printf(m, "blocksize : %u\n", alg->cra_blocksize); |
94 | seq_printf(m, "min keysize : %u\n", ablkcipher->min_keysize); | 115 | seq_printf(m, "min keysize : %u\n", ablkcipher->min_keysize); |
95 | seq_printf(m, "max keysize : %u\n", ablkcipher->max_keysize); | 116 | seq_printf(m, "max keysize : %u\n", ablkcipher->max_keysize); |
96 | seq_printf(m, "ivsize : %u\n", ablkcipher->ivsize); | 117 | seq_printf(m, "ivsize : %u\n", ablkcipher->ivsize); |
118 | seq_printf(m, "geniv : %s\n", ablkcipher->geniv ?: "<default>"); | ||
97 | } | 119 | } |
98 | 120 | ||
99 | const struct crypto_type crypto_ablkcipher_type = { | 121 | const struct crypto_type crypto_ablkcipher_type = { |
@@ -105,5 +127,220 @@ const struct crypto_type crypto_ablkcipher_type = { | |||
105 | }; | 127 | }; |
106 | EXPORT_SYMBOL_GPL(crypto_ablkcipher_type); | 128 | EXPORT_SYMBOL_GPL(crypto_ablkcipher_type); |
107 | 129 | ||
130 | static int no_givdecrypt(struct skcipher_givcrypt_request *req) | ||
131 | { | ||
132 | return -ENOSYS; | ||
133 | } | ||
134 | |||
135 | static int crypto_init_givcipher_ops(struct crypto_tfm *tfm, u32 type, | ||
136 | u32 mask) | ||
137 | { | ||
138 | struct ablkcipher_alg *alg = &tfm->__crt_alg->cra_ablkcipher; | ||
139 | struct ablkcipher_tfm *crt = &tfm->crt_ablkcipher; | ||
140 | |||
141 | if (alg->ivsize > PAGE_SIZE / 8) | ||
142 | return -EINVAL; | ||
143 | |||
144 | crt->setkey = tfm->__crt_alg->cra_flags & CRYPTO_ALG_GENIV ? | ||
145 | alg->setkey : setkey; | ||
146 | crt->encrypt = alg->encrypt; | ||
147 | crt->decrypt = alg->decrypt; | ||
148 | crt->givencrypt = alg->givencrypt; | ||
149 | crt->givdecrypt = alg->givdecrypt ?: no_givdecrypt; | ||
150 | crt->base = __crypto_ablkcipher_cast(tfm); | ||
151 | crt->ivsize = alg->ivsize; | ||
152 | |||
153 | return 0; | ||
154 | } | ||
155 | |||
156 | static void crypto_givcipher_show(struct seq_file *m, struct crypto_alg *alg) | ||
157 | __attribute__ ((unused)); | ||
158 | static void crypto_givcipher_show(struct seq_file *m, struct crypto_alg *alg) | ||
159 | { | ||
160 | struct ablkcipher_alg *ablkcipher = &alg->cra_ablkcipher; | ||
161 | |||
162 | seq_printf(m, "type : givcipher\n"); | ||
163 | seq_printf(m, "async : %s\n", alg->cra_flags & CRYPTO_ALG_ASYNC ? | ||
164 | "yes" : "no"); | ||
165 | seq_printf(m, "blocksize : %u\n", alg->cra_blocksize); | ||
166 | seq_printf(m, "min keysize : %u\n", ablkcipher->min_keysize); | ||
167 | seq_printf(m, "max keysize : %u\n", ablkcipher->max_keysize); | ||
168 | seq_printf(m, "ivsize : %u\n", ablkcipher->ivsize); | ||
169 | seq_printf(m, "geniv : %s\n", ablkcipher->geniv ?: "<built-in>"); | ||
170 | } | ||
171 | |||
172 | const struct crypto_type crypto_givcipher_type = { | ||
173 | .ctxsize = crypto_ablkcipher_ctxsize, | ||
174 | .init = crypto_init_givcipher_ops, | ||
175 | #ifdef CONFIG_PROC_FS | ||
176 | .show = crypto_givcipher_show, | ||
177 | #endif | ||
178 | }; | ||
179 | EXPORT_SYMBOL_GPL(crypto_givcipher_type); | ||
180 | |||
181 | const char *crypto_default_geniv(const struct crypto_alg *alg) | ||
182 | { | ||
183 | return alg->cra_flags & CRYPTO_ALG_ASYNC ? "eseqiv" : "chainiv"; | ||
184 | } | ||
185 | |||
186 | static int crypto_givcipher_default(struct crypto_alg *alg, u32 type, u32 mask) | ||
187 | { | ||
188 | struct rtattr *tb[3]; | ||
189 | struct { | ||
190 | struct rtattr attr; | ||
191 | struct crypto_attr_type data; | ||
192 | } ptype; | ||
193 | struct { | ||
194 | struct rtattr attr; | ||
195 | struct crypto_attr_alg data; | ||
196 | } palg; | ||
197 | struct crypto_template *tmpl; | ||
198 | struct crypto_instance *inst; | ||
199 | struct crypto_alg *larval; | ||
200 | const char *geniv; | ||
201 | int err; | ||
202 | |||
203 | larval = crypto_larval_lookup(alg->cra_driver_name, | ||
204 | CRYPTO_ALG_TYPE_GIVCIPHER, | ||
205 | CRYPTO_ALG_TYPE_MASK); | ||
206 | err = PTR_ERR(larval); | ||
207 | if (IS_ERR(larval)) | ||
208 | goto out; | ||
209 | |||
210 | err = -EAGAIN; | ||
211 | if (!crypto_is_larval(larval)) | ||
212 | goto drop_larval; | ||
213 | |||
214 | ptype.attr.rta_len = sizeof(ptype); | ||
215 | ptype.attr.rta_type = CRYPTOA_TYPE; | ||
216 | ptype.data.type = type | CRYPTO_ALG_GENIV; | ||
217 | /* GENIV tells the template that we're making a default geniv. */ | ||
218 | ptype.data.mask = mask | CRYPTO_ALG_GENIV; | ||
219 | tb[0] = &ptype.attr; | ||
220 | |||
221 | palg.attr.rta_len = sizeof(palg); | ||
222 | palg.attr.rta_type = CRYPTOA_ALG; | ||
223 | /* Must use the exact name to locate ourselves. */ | ||
224 | memcpy(palg.data.name, alg->cra_driver_name, CRYPTO_MAX_ALG_NAME); | ||
225 | tb[1] = &palg.attr; | ||
226 | |||
227 | tb[2] = NULL; | ||
228 | |||
229 | if ((alg->cra_flags & CRYPTO_ALG_TYPE_MASK) == | ||
230 | CRYPTO_ALG_TYPE_BLKCIPHER) | ||
231 | geniv = alg->cra_blkcipher.geniv; | ||
232 | else | ||
233 | geniv = alg->cra_ablkcipher.geniv; | ||
234 | |||
235 | if (!geniv) | ||
236 | geniv = crypto_default_geniv(alg); | ||
237 | |||
238 | tmpl = crypto_lookup_template(geniv); | ||
239 | err = -ENOENT; | ||
240 | if (!tmpl) | ||
241 | goto kill_larval; | ||
242 | |||
243 | inst = tmpl->alloc(tb); | ||
244 | err = PTR_ERR(inst); | ||
245 | if (IS_ERR(inst)) | ||
246 | goto put_tmpl; | ||
247 | |||
248 | if ((err = crypto_register_instance(tmpl, inst))) { | ||
249 | tmpl->free(inst); | ||
250 | goto put_tmpl; | ||
251 | } | ||
252 | |||
253 | /* Redo the lookup to use the instance we just registered. */ | ||
254 | err = -EAGAIN; | ||
255 | |||
256 | put_tmpl: | ||
257 | crypto_tmpl_put(tmpl); | ||
258 | kill_larval: | ||
259 | crypto_larval_kill(larval); | ||
260 | drop_larval: | ||
261 | crypto_mod_put(larval); | ||
262 | out: | ||
263 | crypto_mod_put(alg); | ||
264 | return err; | ||
265 | } | ||
266 | |||
267 | static struct crypto_alg *crypto_lookup_skcipher(const char *name, u32 type, | ||
268 | u32 mask) | ||
269 | { | ||
270 | struct crypto_alg *alg; | ||
271 | |||
272 | alg = crypto_alg_mod_lookup(name, type, mask); | ||
273 | if (IS_ERR(alg)) | ||
274 | return alg; | ||
275 | |||
276 | if ((alg->cra_flags & CRYPTO_ALG_TYPE_MASK) == | ||
277 | CRYPTO_ALG_TYPE_GIVCIPHER) | ||
278 | return alg; | ||
279 | |||
280 | if (!((alg->cra_flags & CRYPTO_ALG_TYPE_MASK) == | ||
281 | CRYPTO_ALG_TYPE_BLKCIPHER ? alg->cra_blkcipher.ivsize : | ||
282 | alg->cra_ablkcipher.ivsize)) | ||
283 | return alg; | ||
284 | |||
285 | return ERR_PTR(crypto_givcipher_default(alg, type, mask)); | ||
286 | } | ||
287 | |||
288 | int crypto_grab_skcipher(struct crypto_skcipher_spawn *spawn, const char *name, | ||
289 | u32 type, u32 mask) | ||
290 | { | ||
291 | struct crypto_alg *alg; | ||
292 | int err; | ||
293 | |||
294 | type = crypto_skcipher_type(type); | ||
295 | mask = crypto_skcipher_mask(mask); | ||
296 | |||
297 | alg = crypto_lookup_skcipher(name, type, mask); | ||
298 | if (IS_ERR(alg)) | ||
299 | return PTR_ERR(alg); | ||
300 | |||
301 | err = crypto_init_spawn(&spawn->base, alg, spawn->base.inst, mask); | ||
302 | crypto_mod_put(alg); | ||
303 | return err; | ||
304 | } | ||
305 | EXPORT_SYMBOL_GPL(crypto_grab_skcipher); | ||
306 | |||
307 | struct crypto_ablkcipher *crypto_alloc_ablkcipher(const char *alg_name, | ||
308 | u32 type, u32 mask) | ||
309 | { | ||
310 | struct crypto_tfm *tfm; | ||
311 | int err; | ||
312 | |||
313 | type = crypto_skcipher_type(type); | ||
314 | mask = crypto_skcipher_mask(mask); | ||
315 | |||
316 | for (;;) { | ||
317 | struct crypto_alg *alg; | ||
318 | |||
319 | alg = crypto_lookup_skcipher(alg_name, type, mask); | ||
320 | if (IS_ERR(alg)) { | ||
321 | err = PTR_ERR(alg); | ||
322 | goto err; | ||
323 | } | ||
324 | |||
325 | tfm = __crypto_alloc_tfm(alg, type, mask); | ||
326 | if (!IS_ERR(tfm)) | ||
327 | return __crypto_ablkcipher_cast(tfm); | ||
328 | |||
329 | crypto_mod_put(alg); | ||
330 | err = PTR_ERR(tfm); | ||
331 | |||
332 | err: | ||
333 | if (err != -EAGAIN) | ||
334 | break; | ||
335 | if (signal_pending(current)) { | ||
336 | err = -EINTR; | ||
337 | break; | ||
338 | } | ||
339 | } | ||
340 | |||
341 | return ERR_PTR(err); | ||
342 | } | ||
343 | EXPORT_SYMBOL_GPL(crypto_alloc_ablkcipher); | ||
344 | |||
108 | MODULE_LICENSE("GPL"); | 345 | MODULE_LICENSE("GPL"); |
109 | MODULE_DESCRIPTION("Asynchronous block chaining cipher type"); | 346 | MODULE_DESCRIPTION("Asynchronous block chaining cipher type"); |
diff --git a/crypto/aead.c b/crypto/aead.c index 84a3501fb478..3a6f3f52c7c7 100644 --- a/crypto/aead.c +++ b/crypto/aead.c | |||
@@ -12,14 +12,17 @@ | |||
12 | * | 12 | * |
13 | */ | 13 | */ |
14 | 14 | ||
15 | #include <crypto/algapi.h> | 15 | #include <crypto/internal/aead.h> |
16 | #include <linux/errno.h> | 16 | #include <linux/err.h> |
17 | #include <linux/init.h> | 17 | #include <linux/init.h> |
18 | #include <linux/kernel.h> | 18 | #include <linux/kernel.h> |
19 | #include <linux/module.h> | 19 | #include <linux/module.h> |
20 | #include <linux/rtnetlink.h> | ||
20 | #include <linux/slab.h> | 21 | #include <linux/slab.h> |
21 | #include <linux/seq_file.h> | 22 | #include <linux/seq_file.h> |
22 | 23 | ||
24 | #include "internal.h" | ||
25 | |||
23 | static int setkey_unaligned(struct crypto_aead *tfm, const u8 *key, | 26 | static int setkey_unaligned(struct crypto_aead *tfm, const u8 *key, |
24 | unsigned int keylen) | 27 | unsigned int keylen) |
25 | { | 28 | { |
@@ -53,25 +56,54 @@ static int setkey(struct crypto_aead *tfm, const u8 *key, unsigned int keylen) | |||
53 | return aead->setkey(tfm, key, keylen); | 56 | return aead->setkey(tfm, key, keylen); |
54 | } | 57 | } |
55 | 58 | ||
59 | int crypto_aead_setauthsize(struct crypto_aead *tfm, unsigned int authsize) | ||
60 | { | ||
61 | struct aead_tfm *crt = crypto_aead_crt(tfm); | ||
62 | int err; | ||
63 | |||
64 | if (authsize > crypto_aead_alg(tfm)->maxauthsize) | ||
65 | return -EINVAL; | ||
66 | |||
67 | if (crypto_aead_alg(tfm)->setauthsize) { | ||
68 | err = crypto_aead_alg(tfm)->setauthsize(crt->base, authsize); | ||
69 | if (err) | ||
70 | return err; | ||
71 | } | ||
72 | |||
73 | crypto_aead_crt(crt->base)->authsize = authsize; | ||
74 | crt->authsize = authsize; | ||
75 | return 0; | ||
76 | } | ||
77 | EXPORT_SYMBOL_GPL(crypto_aead_setauthsize); | ||
78 | |||
56 | static unsigned int crypto_aead_ctxsize(struct crypto_alg *alg, u32 type, | 79 | static unsigned int crypto_aead_ctxsize(struct crypto_alg *alg, u32 type, |
57 | u32 mask) | 80 | u32 mask) |
58 | { | 81 | { |
59 | return alg->cra_ctxsize; | 82 | return alg->cra_ctxsize; |
60 | } | 83 | } |
61 | 84 | ||
85 | static int no_givcrypt(struct aead_givcrypt_request *req) | ||
86 | { | ||
87 | return -ENOSYS; | ||
88 | } | ||
89 | |||
62 | static int crypto_init_aead_ops(struct crypto_tfm *tfm, u32 type, u32 mask) | 90 | static int crypto_init_aead_ops(struct crypto_tfm *tfm, u32 type, u32 mask) |
63 | { | 91 | { |
64 | struct aead_alg *alg = &tfm->__crt_alg->cra_aead; | 92 | struct aead_alg *alg = &tfm->__crt_alg->cra_aead; |
65 | struct aead_tfm *crt = &tfm->crt_aead; | 93 | struct aead_tfm *crt = &tfm->crt_aead; |
66 | 94 | ||
67 | if (max(alg->authsize, alg->ivsize) > PAGE_SIZE / 8) | 95 | if (max(alg->maxauthsize, alg->ivsize) > PAGE_SIZE / 8) |
68 | return -EINVAL; | 96 | return -EINVAL; |
69 | 97 | ||
70 | crt->setkey = setkey; | 98 | crt->setkey = tfm->__crt_alg->cra_flags & CRYPTO_ALG_GENIV ? |
99 | alg->setkey : setkey; | ||
71 | crt->encrypt = alg->encrypt; | 100 | crt->encrypt = alg->encrypt; |
72 | crt->decrypt = alg->decrypt; | 101 | crt->decrypt = alg->decrypt; |
102 | crt->givencrypt = alg->givencrypt ?: no_givcrypt; | ||
103 | crt->givdecrypt = alg->givdecrypt ?: no_givcrypt; | ||
104 | crt->base = __crypto_aead_cast(tfm); | ||
73 | crt->ivsize = alg->ivsize; | 105 | crt->ivsize = alg->ivsize; |
74 | crt->authsize = alg->authsize; | 106 | crt->authsize = alg->maxauthsize; |
75 | 107 | ||
76 | return 0; | 108 | return 0; |
77 | } | 109 | } |
@@ -83,9 +115,12 @@ static void crypto_aead_show(struct seq_file *m, struct crypto_alg *alg) | |||
83 | struct aead_alg *aead = &alg->cra_aead; | 115 | struct aead_alg *aead = &alg->cra_aead; |
84 | 116 | ||
85 | seq_printf(m, "type : aead\n"); | 117 | seq_printf(m, "type : aead\n"); |
118 | seq_printf(m, "async : %s\n", alg->cra_flags & CRYPTO_ALG_ASYNC ? | ||
119 | "yes" : "no"); | ||
86 | seq_printf(m, "blocksize : %u\n", alg->cra_blocksize); | 120 | seq_printf(m, "blocksize : %u\n", alg->cra_blocksize); |
87 | seq_printf(m, "ivsize : %u\n", aead->ivsize); | 121 | seq_printf(m, "ivsize : %u\n", aead->ivsize); |
88 | seq_printf(m, "authsize : %u\n", aead->authsize); | 122 | seq_printf(m, "maxauthsize : %u\n", aead->maxauthsize); |
123 | seq_printf(m, "geniv : %s\n", aead->geniv ?: "<built-in>"); | ||
89 | } | 124 | } |
90 | 125 | ||
91 | const struct crypto_type crypto_aead_type = { | 126 | const struct crypto_type crypto_aead_type = { |
@@ -97,5 +132,358 @@ const struct crypto_type crypto_aead_type = { | |||
97 | }; | 132 | }; |
98 | EXPORT_SYMBOL_GPL(crypto_aead_type); | 133 | EXPORT_SYMBOL_GPL(crypto_aead_type); |
99 | 134 | ||
135 | static int aead_null_givencrypt(struct aead_givcrypt_request *req) | ||
136 | { | ||
137 | return crypto_aead_encrypt(&req->areq); | ||
138 | } | ||
139 | |||
140 | static int aead_null_givdecrypt(struct aead_givcrypt_request *req) | ||
141 | { | ||
142 | return crypto_aead_decrypt(&req->areq); | ||
143 | } | ||
144 | |||
145 | static int crypto_init_nivaead_ops(struct crypto_tfm *tfm, u32 type, u32 mask) | ||
146 | { | ||
147 | struct aead_alg *alg = &tfm->__crt_alg->cra_aead; | ||
148 | struct aead_tfm *crt = &tfm->crt_aead; | ||
149 | |||
150 | if (max(alg->maxauthsize, alg->ivsize) > PAGE_SIZE / 8) | ||
151 | return -EINVAL; | ||
152 | |||
153 | crt->setkey = setkey; | ||
154 | crt->encrypt = alg->encrypt; | ||
155 | crt->decrypt = alg->decrypt; | ||
156 | if (!alg->ivsize) { | ||
157 | crt->givencrypt = aead_null_givencrypt; | ||
158 | crt->givdecrypt = aead_null_givdecrypt; | ||
159 | } | ||
160 | crt->base = __crypto_aead_cast(tfm); | ||
161 | crt->ivsize = alg->ivsize; | ||
162 | crt->authsize = alg->maxauthsize; | ||
163 | |||
164 | return 0; | ||
165 | } | ||
166 | |||
167 | static void crypto_nivaead_show(struct seq_file *m, struct crypto_alg *alg) | ||
168 | __attribute__ ((unused)); | ||
169 | static void crypto_nivaead_show(struct seq_file *m, struct crypto_alg *alg) | ||
170 | { | ||
171 | struct aead_alg *aead = &alg->cra_aead; | ||
172 | |||
173 | seq_printf(m, "type : nivaead\n"); | ||
174 | seq_printf(m, "async : %s\n", alg->cra_flags & CRYPTO_ALG_ASYNC ? | ||
175 | "yes" : "no"); | ||
176 | seq_printf(m, "blocksize : %u\n", alg->cra_blocksize); | ||
177 | seq_printf(m, "ivsize : %u\n", aead->ivsize); | ||
178 | seq_printf(m, "maxauthsize : %u\n", aead->maxauthsize); | ||
179 | seq_printf(m, "geniv : %s\n", aead->geniv); | ||
180 | } | ||
181 | |||
182 | const struct crypto_type crypto_nivaead_type = { | ||
183 | .ctxsize = crypto_aead_ctxsize, | ||
184 | .init = crypto_init_nivaead_ops, | ||
185 | #ifdef CONFIG_PROC_FS | ||
186 | .show = crypto_nivaead_show, | ||
187 | #endif | ||
188 | }; | ||
189 | EXPORT_SYMBOL_GPL(crypto_nivaead_type); | ||
190 | |||
191 | static int crypto_grab_nivaead(struct crypto_aead_spawn *spawn, | ||
192 | const char *name, u32 type, u32 mask) | ||
193 | { | ||
194 | struct crypto_alg *alg; | ||
195 | int err; | ||
196 | |||
197 | type &= ~(CRYPTO_ALG_TYPE_MASK | CRYPTO_ALG_GENIV); | ||
198 | type |= CRYPTO_ALG_TYPE_AEAD; | ||
199 | mask |= CRYPTO_ALG_TYPE_MASK | CRYPTO_ALG_GENIV; | ||
200 | |||
201 | alg = crypto_alg_mod_lookup(name, type, mask); | ||
202 | if (IS_ERR(alg)) | ||
203 | return PTR_ERR(alg); | ||
204 | |||
205 | err = crypto_init_spawn(&spawn->base, alg, spawn->base.inst, mask); | ||
206 | crypto_mod_put(alg); | ||
207 | return err; | ||
208 | } | ||
209 | |||
210 | struct crypto_instance *aead_geniv_alloc(struct crypto_template *tmpl, | ||
211 | struct rtattr **tb, u32 type, | ||
212 | u32 mask) | ||
213 | { | ||
214 | const char *name; | ||
215 | struct crypto_aead_spawn *spawn; | ||
216 | struct crypto_attr_type *algt; | ||
217 | struct crypto_instance *inst; | ||
218 | struct crypto_alg *alg; | ||
219 | int err; | ||
220 | |||
221 | algt = crypto_get_attr_type(tb); | ||
222 | err = PTR_ERR(algt); | ||
223 | if (IS_ERR(algt)) | ||
224 | return ERR_PTR(err); | ||
225 | |||
226 | if ((algt->type ^ (CRYPTO_ALG_TYPE_AEAD | CRYPTO_ALG_GENIV)) & | ||
227 | algt->mask) | ||
228 | return ERR_PTR(-EINVAL); | ||
229 | |||
230 | name = crypto_attr_alg_name(tb[1]); | ||
231 | err = PTR_ERR(name); | ||
232 | if (IS_ERR(name)) | ||
233 | return ERR_PTR(err); | ||
234 | |||
235 | inst = kzalloc(sizeof(*inst) + sizeof(*spawn), GFP_KERNEL); | ||
236 | if (!inst) | ||
237 | return ERR_PTR(-ENOMEM); | ||
238 | |||
239 | spawn = crypto_instance_ctx(inst); | ||
240 | |||
241 | /* Ignore async algorithms if necessary. */ | ||
242 | mask |= crypto_requires_sync(algt->type, algt->mask); | ||
243 | |||
244 | crypto_set_aead_spawn(spawn, inst); | ||
245 | err = crypto_grab_nivaead(spawn, name, type, mask); | ||
246 | if (err) | ||
247 | goto err_free_inst; | ||
248 | |||
249 | alg = crypto_aead_spawn_alg(spawn); | ||
250 | |||
251 | err = -EINVAL; | ||
252 | if (!alg->cra_aead.ivsize) | ||
253 | goto err_drop_alg; | ||
254 | |||
255 | /* | ||
256 | * This is only true if we're constructing an algorithm with its | ||
257 | * default IV generator. For the default generator we elide the | ||
258 | * template name and double-check the IV generator. | ||
259 | */ | ||
260 | if (algt->mask & CRYPTO_ALG_GENIV) { | ||
261 | if (strcmp(tmpl->name, alg->cra_aead.geniv)) | ||
262 | goto err_drop_alg; | ||
263 | |||
264 | memcpy(inst->alg.cra_name, alg->cra_name, CRYPTO_MAX_ALG_NAME); | ||
265 | memcpy(inst->alg.cra_driver_name, alg->cra_driver_name, | ||
266 | CRYPTO_MAX_ALG_NAME); | ||
267 | } else { | ||
268 | err = -ENAMETOOLONG; | ||
269 | if (snprintf(inst->alg.cra_name, CRYPTO_MAX_ALG_NAME, | ||
270 | "%s(%s)", tmpl->name, alg->cra_name) >= | ||
271 | CRYPTO_MAX_ALG_NAME) | ||
272 | goto err_drop_alg; | ||
273 | if (snprintf(inst->alg.cra_driver_name, CRYPTO_MAX_ALG_NAME, | ||
274 | "%s(%s)", tmpl->name, alg->cra_driver_name) >= | ||
275 | CRYPTO_MAX_ALG_NAME) | ||
276 | goto err_drop_alg; | ||
277 | } | ||
278 | |||
279 | inst->alg.cra_flags = CRYPTO_ALG_TYPE_AEAD | CRYPTO_ALG_GENIV; | ||
280 | inst->alg.cra_flags |= alg->cra_flags & CRYPTO_ALG_ASYNC; | ||
281 | inst->alg.cra_priority = alg->cra_priority; | ||
282 | inst->alg.cra_blocksize = alg->cra_blocksize; | ||
283 | inst->alg.cra_alignmask = alg->cra_alignmask; | ||
284 | inst->alg.cra_type = &crypto_aead_type; | ||
285 | |||
286 | inst->alg.cra_aead.ivsize = alg->cra_aead.ivsize; | ||
287 | inst->alg.cra_aead.maxauthsize = alg->cra_aead.maxauthsize; | ||
288 | inst->alg.cra_aead.geniv = alg->cra_aead.geniv; | ||
289 | |||
290 | inst->alg.cra_aead.setkey = alg->cra_aead.setkey; | ||
291 | inst->alg.cra_aead.setauthsize = alg->cra_aead.setauthsize; | ||
292 | inst->alg.cra_aead.encrypt = alg->cra_aead.encrypt; | ||
293 | inst->alg.cra_aead.decrypt = alg->cra_aead.decrypt; | ||
294 | |||
295 | out: | ||
296 | return inst; | ||
297 | |||
298 | err_drop_alg: | ||
299 | crypto_drop_aead(spawn); | ||
300 | err_free_inst: | ||
301 | kfree(inst); | ||
302 | inst = ERR_PTR(err); | ||
303 | goto out; | ||
304 | } | ||
305 | EXPORT_SYMBOL_GPL(aead_geniv_alloc); | ||
306 | |||
307 | void aead_geniv_free(struct crypto_instance *inst) | ||
308 | { | ||
309 | crypto_drop_aead(crypto_instance_ctx(inst)); | ||
310 | kfree(inst); | ||
311 | } | ||
312 | EXPORT_SYMBOL_GPL(aead_geniv_free); | ||
313 | |||
314 | int aead_geniv_init(struct crypto_tfm *tfm) | ||
315 | { | ||
316 | struct crypto_instance *inst = (void *)tfm->__crt_alg; | ||
317 | struct crypto_aead *aead; | ||
318 | |||
319 | aead = crypto_spawn_aead(crypto_instance_ctx(inst)); | ||
320 | if (IS_ERR(aead)) | ||
321 | return PTR_ERR(aead); | ||
322 | |||
323 | tfm->crt_aead.base = aead; | ||
324 | tfm->crt_aead.reqsize += crypto_aead_reqsize(aead); | ||
325 | |||
326 | return 0; | ||
327 | } | ||
328 | EXPORT_SYMBOL_GPL(aead_geniv_init); | ||
329 | |||
330 | void aead_geniv_exit(struct crypto_tfm *tfm) | ||
331 | { | ||
332 | crypto_free_aead(tfm->crt_aead.base); | ||
333 | } | ||
334 | EXPORT_SYMBOL_GPL(aead_geniv_exit); | ||
335 | |||
336 | static int crypto_nivaead_default(struct crypto_alg *alg, u32 type, u32 mask) | ||
337 | { | ||
338 | struct rtattr *tb[3]; | ||
339 | struct { | ||
340 | struct rtattr attr; | ||
341 | struct crypto_attr_type data; | ||
342 | } ptype; | ||
343 | struct { | ||
344 | struct rtattr attr; | ||
345 | struct crypto_attr_alg data; | ||
346 | } palg; | ||
347 | struct crypto_template *tmpl; | ||
348 | struct crypto_instance *inst; | ||
349 | struct crypto_alg *larval; | ||
350 | const char *geniv; | ||
351 | int err; | ||
352 | |||
353 | larval = crypto_larval_lookup(alg->cra_driver_name, | ||
354 | CRYPTO_ALG_TYPE_AEAD | CRYPTO_ALG_GENIV, | ||
355 | CRYPTO_ALG_TYPE_MASK | CRYPTO_ALG_GENIV); | ||
356 | err = PTR_ERR(larval); | ||
357 | if (IS_ERR(larval)) | ||
358 | goto out; | ||
359 | |||
360 | err = -EAGAIN; | ||
361 | if (!crypto_is_larval(larval)) | ||
362 | goto drop_larval; | ||
363 | |||
364 | ptype.attr.rta_len = sizeof(ptype); | ||
365 | ptype.attr.rta_type = CRYPTOA_TYPE; | ||
366 | ptype.data.type = type | CRYPTO_ALG_GENIV; | ||
367 | /* GENIV tells the template that we're making a default geniv. */ | ||
368 | ptype.data.mask = mask | CRYPTO_ALG_GENIV; | ||
369 | tb[0] = &ptype.attr; | ||
370 | |||
371 | palg.attr.rta_len = sizeof(palg); | ||
372 | palg.attr.rta_type = CRYPTOA_ALG; | ||
373 | /* Must use the exact name to locate ourselves. */ | ||
374 | memcpy(palg.data.name, alg->cra_driver_name, CRYPTO_MAX_ALG_NAME); | ||
375 | tb[1] = &palg.attr; | ||
376 | |||
377 | tb[2] = NULL; | ||
378 | |||
379 | geniv = alg->cra_aead.geniv; | ||
380 | |||
381 | tmpl = crypto_lookup_template(geniv); | ||
382 | err = -ENOENT; | ||
383 | if (!tmpl) | ||
384 | goto kill_larval; | ||
385 | |||
386 | inst = tmpl->alloc(tb); | ||
387 | err = PTR_ERR(inst); | ||
388 | if (IS_ERR(inst)) | ||
389 | goto put_tmpl; | ||
390 | |||
391 | if ((err = crypto_register_instance(tmpl, inst))) { | ||
392 | tmpl->free(inst); | ||
393 | goto put_tmpl; | ||
394 | } | ||
395 | |||
396 | /* Redo the lookup to use the instance we just registered. */ | ||
397 | err = -EAGAIN; | ||
398 | |||
399 | put_tmpl: | ||
400 | crypto_tmpl_put(tmpl); | ||
401 | kill_larval: | ||
402 | crypto_larval_kill(larval); | ||
403 | drop_larval: | ||
404 | crypto_mod_put(larval); | ||
405 | out: | ||
406 | crypto_mod_put(alg); | ||
407 | return err; | ||
408 | } | ||
409 | |||
410 | static struct crypto_alg *crypto_lookup_aead(const char *name, u32 type, | ||
411 | u32 mask) | ||
412 | { | ||
413 | struct crypto_alg *alg; | ||
414 | |||
415 | alg = crypto_alg_mod_lookup(name, type, mask); | ||
416 | if (IS_ERR(alg)) | ||
417 | return alg; | ||
418 | |||
419 | if (alg->cra_type == &crypto_aead_type) | ||
420 | return alg; | ||
421 | |||
422 | if (!alg->cra_aead.ivsize) | ||
423 | return alg; | ||
424 | |||
425 | return ERR_PTR(crypto_nivaead_default(alg, type, mask)); | ||
426 | } | ||
427 | |||
428 | int crypto_grab_aead(struct crypto_aead_spawn *spawn, const char *name, | ||
429 | u32 type, u32 mask) | ||
430 | { | ||
431 | struct crypto_alg *alg; | ||
432 | int err; | ||
433 | |||
434 | type &= ~(CRYPTO_ALG_TYPE_MASK | CRYPTO_ALG_GENIV); | ||
435 | type |= CRYPTO_ALG_TYPE_AEAD; | ||
436 | mask &= ~(CRYPTO_ALG_TYPE_MASK | CRYPTO_ALG_GENIV); | ||
437 | mask |= CRYPTO_ALG_TYPE_MASK; | ||
438 | |||
439 | alg = crypto_lookup_aead(name, type, mask); | ||
440 | if (IS_ERR(alg)) | ||
441 | return PTR_ERR(alg); | ||
442 | |||
443 | err = crypto_init_spawn(&spawn->base, alg, spawn->base.inst, mask); | ||
444 | crypto_mod_put(alg); | ||
445 | return err; | ||
446 | } | ||
447 | EXPORT_SYMBOL_GPL(crypto_grab_aead); | ||
448 | |||
449 | struct crypto_aead *crypto_alloc_aead(const char *alg_name, u32 type, u32 mask) | ||
450 | { | ||
451 | struct crypto_tfm *tfm; | ||
452 | int err; | ||
453 | |||
454 | type &= ~(CRYPTO_ALG_TYPE_MASK | CRYPTO_ALG_GENIV); | ||
455 | type |= CRYPTO_ALG_TYPE_AEAD; | ||
456 | mask &= ~(CRYPTO_ALG_TYPE_MASK | CRYPTO_ALG_GENIV); | ||
457 | mask |= CRYPTO_ALG_TYPE_MASK; | ||
458 | |||
459 | for (;;) { | ||
460 | struct crypto_alg *alg; | ||
461 | |||
462 | alg = crypto_lookup_aead(alg_name, type, mask); | ||
463 | if (IS_ERR(alg)) { | ||
464 | err = PTR_ERR(alg); | ||
465 | goto err; | ||
466 | } | ||
467 | |||
468 | tfm = __crypto_alloc_tfm(alg, type, mask); | ||
469 | if (!IS_ERR(tfm)) | ||
470 | return __crypto_aead_cast(tfm); | ||
471 | |||
472 | crypto_mod_put(alg); | ||
473 | err = PTR_ERR(tfm); | ||
474 | |||
475 | err: | ||
476 | if (err != -EAGAIN) | ||
477 | break; | ||
478 | if (signal_pending(current)) { | ||
479 | err = -EINTR; | ||
480 | break; | ||
481 | } | ||
482 | } | ||
483 | |||
484 | return ERR_PTR(err); | ||
485 | } | ||
486 | EXPORT_SYMBOL_GPL(crypto_alloc_aead); | ||
487 | |||
100 | MODULE_LICENSE("GPL"); | 488 | MODULE_LICENSE("GPL"); |
101 | MODULE_DESCRIPTION("Authenticated Encryption with Associated Data (AEAD)"); | 489 | MODULE_DESCRIPTION("Authenticated Encryption with Associated Data (AEAD)"); |
diff --git a/crypto/aes_generic.c b/crypto/aes_generic.c index 9401dca85e87..cf30af74480f 100644 --- a/crypto/aes_generic.c +++ b/crypto/aes_generic.c | |||
@@ -47,11 +47,7 @@ | |||
47 | * --------------------------------------------------------------------------- | 47 | * --------------------------------------------------------------------------- |
48 | */ | 48 | */ |
49 | 49 | ||
50 | /* Some changes from the Gladman version: | 50 | #include <crypto/aes.h> |
51 | s/RIJNDAEL(e_key)/E_KEY/g | ||
52 | s/RIJNDAEL(d_key)/D_KEY/g | ||
53 | */ | ||
54 | |||
55 | #include <linux/module.h> | 51 | #include <linux/module.h> |
56 | #include <linux/init.h> | 52 | #include <linux/init.h> |
57 | #include <linux/types.h> | 53 | #include <linux/types.h> |
@@ -59,88 +55,46 @@ | |||
59 | #include <linux/crypto.h> | 55 | #include <linux/crypto.h> |
60 | #include <asm/byteorder.h> | 56 | #include <asm/byteorder.h> |
61 | 57 | ||
62 | #define AES_MIN_KEY_SIZE 16 | 58 | static inline u8 byte(const u32 x, const unsigned n) |
63 | #define AES_MAX_KEY_SIZE 32 | ||
64 | |||
65 | #define AES_BLOCK_SIZE 16 | ||
66 | |||
67 | /* | ||
68 | * #define byte(x, nr) ((unsigned char)((x) >> (nr*8))) | ||
69 | */ | ||
70 | static inline u8 | ||
71 | byte(const u32 x, const unsigned n) | ||
72 | { | 59 | { |
73 | return x >> (n << 3); | 60 | return x >> (n << 3); |
74 | } | 61 | } |
75 | 62 | ||
76 | struct aes_ctx { | ||
77 | int key_length; | ||
78 | u32 buf[120]; | ||
79 | }; | ||
80 | |||
81 | #define E_KEY (&ctx->buf[0]) | ||
82 | #define D_KEY (&ctx->buf[60]) | ||
83 | |||
84 | static u8 pow_tab[256] __initdata; | 63 | static u8 pow_tab[256] __initdata; |
85 | static u8 log_tab[256] __initdata; | 64 | static u8 log_tab[256] __initdata; |
86 | static u8 sbx_tab[256] __initdata; | 65 | static u8 sbx_tab[256] __initdata; |
87 | static u8 isb_tab[256] __initdata; | 66 | static u8 isb_tab[256] __initdata; |
88 | static u32 rco_tab[10]; | 67 | static u32 rco_tab[10]; |
89 | static u32 ft_tab[4][256]; | ||
90 | static u32 it_tab[4][256]; | ||
91 | 68 | ||
92 | static u32 fl_tab[4][256]; | 69 | u32 crypto_ft_tab[4][256]; |
93 | static u32 il_tab[4][256]; | 70 | u32 crypto_fl_tab[4][256]; |
71 | u32 crypto_it_tab[4][256]; | ||
72 | u32 crypto_il_tab[4][256]; | ||
94 | 73 | ||
95 | static inline u8 __init | 74 | EXPORT_SYMBOL_GPL(crypto_ft_tab); |
96 | f_mult (u8 a, u8 b) | 75 | EXPORT_SYMBOL_GPL(crypto_fl_tab); |
76 | EXPORT_SYMBOL_GPL(crypto_it_tab); | ||
77 | EXPORT_SYMBOL_GPL(crypto_il_tab); | ||
78 | |||
79 | static inline u8 __init f_mult(u8 a, u8 b) | ||
97 | { | 80 | { |
98 | u8 aa = log_tab[a], cc = aa + log_tab[b]; | 81 | u8 aa = log_tab[a], cc = aa + log_tab[b]; |
99 | 82 | ||
100 | return pow_tab[cc + (cc < aa ? 1 : 0)]; | 83 | return pow_tab[cc + (cc < aa ? 1 : 0)]; |
101 | } | 84 | } |
102 | 85 | ||
103 | #define ff_mult(a,b) (a && b ? f_mult(a, b) : 0) | 86 | #define ff_mult(a, b) (a && b ? f_mult(a, b) : 0) |
104 | 87 | ||
105 | #define f_rn(bo, bi, n, k) \ | 88 | static void __init gen_tabs(void) |
106 | bo[n] = ft_tab[0][byte(bi[n],0)] ^ \ | ||
107 | ft_tab[1][byte(bi[(n + 1) & 3],1)] ^ \ | ||
108 | ft_tab[2][byte(bi[(n + 2) & 3],2)] ^ \ | ||
109 | ft_tab[3][byte(bi[(n + 3) & 3],3)] ^ *(k + n) | ||
110 | |||
111 | #define i_rn(bo, bi, n, k) \ | ||
112 | bo[n] = it_tab[0][byte(bi[n],0)] ^ \ | ||
113 | it_tab[1][byte(bi[(n + 3) & 3],1)] ^ \ | ||
114 | it_tab[2][byte(bi[(n + 2) & 3],2)] ^ \ | ||
115 | it_tab[3][byte(bi[(n + 1) & 3],3)] ^ *(k + n) | ||
116 | |||
117 | #define ls_box(x) \ | ||
118 | ( fl_tab[0][byte(x, 0)] ^ \ | ||
119 | fl_tab[1][byte(x, 1)] ^ \ | ||
120 | fl_tab[2][byte(x, 2)] ^ \ | ||
121 | fl_tab[3][byte(x, 3)] ) | ||
122 | |||
123 | #define f_rl(bo, bi, n, k) \ | ||
124 | bo[n] = fl_tab[0][byte(bi[n],0)] ^ \ | ||
125 | fl_tab[1][byte(bi[(n + 1) & 3],1)] ^ \ | ||
126 | fl_tab[2][byte(bi[(n + 2) & 3],2)] ^ \ | ||
127 | fl_tab[3][byte(bi[(n + 3) & 3],3)] ^ *(k + n) | ||
128 | |||
129 | #define i_rl(bo, bi, n, k) \ | ||
130 | bo[n] = il_tab[0][byte(bi[n],0)] ^ \ | ||
131 | il_tab[1][byte(bi[(n + 3) & 3],1)] ^ \ | ||
132 | il_tab[2][byte(bi[(n + 2) & 3],2)] ^ \ | ||
133 | il_tab[3][byte(bi[(n + 1) & 3],3)] ^ *(k + n) | ||
134 | |||
135 | static void __init | ||
136 | gen_tabs (void) | ||
137 | { | 89 | { |
138 | u32 i, t; | 90 | u32 i, t; |
139 | u8 p, q; | 91 | u8 p, q; |
140 | 92 | ||
141 | /* log and power tables for GF(2**8) finite field with | 93 | /* |
142 | 0x011b as modular polynomial - the simplest primitive | 94 | * log and power tables for GF(2**8) finite field with |
143 | root is 0x03, used here to generate the tables */ | 95 | * 0x011b as modular polynomial - the simplest primitive |
96 | * root is 0x03, used here to generate the tables | ||
97 | */ | ||
144 | 98 | ||
145 | for (i = 0, p = 1; i < 256; ++i) { | 99 | for (i = 0, p = 1; i < 256; ++i) { |
146 | pow_tab[i] = (u8) p; | 100 | pow_tab[i] = (u8) p; |
@@ -169,92 +123,119 @@ gen_tabs (void) | |||
169 | p = sbx_tab[i]; | 123 | p = sbx_tab[i]; |
170 | 124 | ||
171 | t = p; | 125 | t = p; |
172 | fl_tab[0][i] = t; | 126 | crypto_fl_tab[0][i] = t; |
173 | fl_tab[1][i] = rol32(t, 8); | 127 | crypto_fl_tab[1][i] = rol32(t, 8); |
174 | fl_tab[2][i] = rol32(t, 16); | 128 | crypto_fl_tab[2][i] = rol32(t, 16); |
175 | fl_tab[3][i] = rol32(t, 24); | 129 | crypto_fl_tab[3][i] = rol32(t, 24); |
176 | 130 | ||
177 | t = ((u32) ff_mult (2, p)) | | 131 | t = ((u32) ff_mult(2, p)) | |
178 | ((u32) p << 8) | | 132 | ((u32) p << 8) | |
179 | ((u32) p << 16) | ((u32) ff_mult (3, p) << 24); | 133 | ((u32) p << 16) | ((u32) ff_mult(3, p) << 24); |
180 | 134 | ||
181 | ft_tab[0][i] = t; | 135 | crypto_ft_tab[0][i] = t; |
182 | ft_tab[1][i] = rol32(t, 8); | 136 | crypto_ft_tab[1][i] = rol32(t, 8); |
183 | ft_tab[2][i] = rol32(t, 16); | 137 | crypto_ft_tab[2][i] = rol32(t, 16); |
184 | ft_tab[3][i] = rol32(t, 24); | 138 | crypto_ft_tab[3][i] = rol32(t, 24); |
185 | 139 | ||
186 | p = isb_tab[i]; | 140 | p = isb_tab[i]; |
187 | 141 | ||
188 | t = p; | 142 | t = p; |
189 | il_tab[0][i] = t; | 143 | crypto_il_tab[0][i] = t; |
190 | il_tab[1][i] = rol32(t, 8); | 144 | crypto_il_tab[1][i] = rol32(t, 8); |
191 | il_tab[2][i] = rol32(t, 16); | 145 | crypto_il_tab[2][i] = rol32(t, 16); |
192 | il_tab[3][i] = rol32(t, 24); | 146 | crypto_il_tab[3][i] = rol32(t, 24); |
193 | 147 | ||
194 | t = ((u32) ff_mult (14, p)) | | 148 | t = ((u32) ff_mult(14, p)) | |
195 | ((u32) ff_mult (9, p) << 8) | | 149 | ((u32) ff_mult(9, p) << 8) | |
196 | ((u32) ff_mult (13, p) << 16) | | 150 | ((u32) ff_mult(13, p) << 16) | |
197 | ((u32) ff_mult (11, p) << 24); | 151 | ((u32) ff_mult(11, p) << 24); |
198 | 152 | ||
199 | it_tab[0][i] = t; | 153 | crypto_it_tab[0][i] = t; |
200 | it_tab[1][i] = rol32(t, 8); | 154 | crypto_it_tab[1][i] = rol32(t, 8); |
201 | it_tab[2][i] = rol32(t, 16); | 155 | crypto_it_tab[2][i] = rol32(t, 16); |
202 | it_tab[3][i] = rol32(t, 24); | 156 | crypto_it_tab[3][i] = rol32(t, 24); |
203 | } | 157 | } |
204 | } | 158 | } |
205 | 159 | ||
206 | #define star_x(x) (((x) & 0x7f7f7f7f) << 1) ^ ((((x) & 0x80808080) >> 7) * 0x1b) | ||
207 | |||
208 | #define imix_col(y,x) \ | ||
209 | u = star_x(x); \ | ||
210 | v = star_x(u); \ | ||
211 | w = star_x(v); \ | ||
212 | t = w ^ (x); \ | ||
213 | (y) = u ^ v ^ w; \ | ||
214 | (y) ^= ror32(u ^ t, 8) ^ \ | ||
215 | ror32(v ^ t, 16) ^ \ | ||
216 | ror32(t,24) | ||
217 | |||
218 | /* initialise the key schedule from the user supplied key */ | 160 | /* initialise the key schedule from the user supplied key */ |
219 | 161 | ||
220 | #define loop4(i) \ | 162 | #define star_x(x) (((x) & 0x7f7f7f7f) << 1) ^ ((((x) & 0x80808080) >> 7) * 0x1b) |
221 | { t = ror32(t, 8); t = ls_box(t) ^ rco_tab[i]; \ | ||
222 | t ^= E_KEY[4 * i]; E_KEY[4 * i + 4] = t; \ | ||
223 | t ^= E_KEY[4 * i + 1]; E_KEY[4 * i + 5] = t; \ | ||
224 | t ^= E_KEY[4 * i + 2]; E_KEY[4 * i + 6] = t; \ | ||
225 | t ^= E_KEY[4 * i + 3]; E_KEY[4 * i + 7] = t; \ | ||
226 | } | ||
227 | |||
228 | #define loop6(i) \ | ||
229 | { t = ror32(t, 8); t = ls_box(t) ^ rco_tab[i]; \ | ||
230 | t ^= E_KEY[6 * i]; E_KEY[6 * i + 6] = t; \ | ||
231 | t ^= E_KEY[6 * i + 1]; E_KEY[6 * i + 7] = t; \ | ||
232 | t ^= E_KEY[6 * i + 2]; E_KEY[6 * i + 8] = t; \ | ||
233 | t ^= E_KEY[6 * i + 3]; E_KEY[6 * i + 9] = t; \ | ||
234 | t ^= E_KEY[6 * i + 4]; E_KEY[6 * i + 10] = t; \ | ||
235 | t ^= E_KEY[6 * i + 5]; E_KEY[6 * i + 11] = t; \ | ||
236 | } | ||
237 | |||
238 | #define loop8(i) \ | ||
239 | { t = ror32(t, 8); ; t = ls_box(t) ^ rco_tab[i]; \ | ||
240 | t ^= E_KEY[8 * i]; E_KEY[8 * i + 8] = t; \ | ||
241 | t ^= E_KEY[8 * i + 1]; E_KEY[8 * i + 9] = t; \ | ||
242 | t ^= E_KEY[8 * i + 2]; E_KEY[8 * i + 10] = t; \ | ||
243 | t ^= E_KEY[8 * i + 3]; E_KEY[8 * i + 11] = t; \ | ||
244 | t = E_KEY[8 * i + 4] ^ ls_box(t); \ | ||
245 | E_KEY[8 * i + 12] = t; \ | ||
246 | t ^= E_KEY[8 * i + 5]; E_KEY[8 * i + 13] = t; \ | ||
247 | t ^= E_KEY[8 * i + 6]; E_KEY[8 * i + 14] = t; \ | ||
248 | t ^= E_KEY[8 * i + 7]; E_KEY[8 * i + 15] = t; \ | ||
249 | } | ||
250 | 163 | ||
251 | static int aes_set_key(struct crypto_tfm *tfm, const u8 *in_key, | 164 | #define imix_col(y,x) do { \ |
252 | unsigned int key_len) | 165 | u = star_x(x); \ |
166 | v = star_x(u); \ | ||
167 | w = star_x(v); \ | ||
168 | t = w ^ (x); \ | ||
169 | (y) = u ^ v ^ w; \ | ||
170 | (y) ^= ror32(u ^ t, 8) ^ \ | ||
171 | ror32(v ^ t, 16) ^ \ | ||
172 | ror32(t, 24); \ | ||
173 | } while (0) | ||
174 | |||
175 | #define ls_box(x) \ | ||
176 | crypto_fl_tab[0][byte(x, 0)] ^ \ | ||
177 | crypto_fl_tab[1][byte(x, 1)] ^ \ | ||
178 | crypto_fl_tab[2][byte(x, 2)] ^ \ | ||
179 | crypto_fl_tab[3][byte(x, 3)] | ||
180 | |||
181 | #define loop4(i) do { \ | ||
182 | t = ror32(t, 8); \ | ||
183 | t = ls_box(t) ^ rco_tab[i]; \ | ||
184 | t ^= ctx->key_enc[4 * i]; \ | ||
185 | ctx->key_enc[4 * i + 4] = t; \ | ||
186 | t ^= ctx->key_enc[4 * i + 1]; \ | ||
187 | ctx->key_enc[4 * i + 5] = t; \ | ||
188 | t ^= ctx->key_enc[4 * i + 2]; \ | ||
189 | ctx->key_enc[4 * i + 6] = t; \ | ||
190 | t ^= ctx->key_enc[4 * i + 3]; \ | ||
191 | ctx->key_enc[4 * i + 7] = t; \ | ||
192 | } while (0) | ||
193 | |||
194 | #define loop6(i) do { \ | ||
195 | t = ror32(t, 8); \ | ||
196 | t = ls_box(t) ^ rco_tab[i]; \ | ||
197 | t ^= ctx->key_enc[6 * i]; \ | ||
198 | ctx->key_enc[6 * i + 6] = t; \ | ||
199 | t ^= ctx->key_enc[6 * i + 1]; \ | ||
200 | ctx->key_enc[6 * i + 7] = t; \ | ||
201 | t ^= ctx->key_enc[6 * i + 2]; \ | ||
202 | ctx->key_enc[6 * i + 8] = t; \ | ||
203 | t ^= ctx->key_enc[6 * i + 3]; \ | ||
204 | ctx->key_enc[6 * i + 9] = t; \ | ||
205 | t ^= ctx->key_enc[6 * i + 4]; \ | ||
206 | ctx->key_enc[6 * i + 10] = t; \ | ||
207 | t ^= ctx->key_enc[6 * i + 5]; \ | ||
208 | ctx->key_enc[6 * i + 11] = t; \ | ||
209 | } while (0) | ||
210 | |||
211 | #define loop8(i) do { \ | ||
212 | t = ror32(t, 8); \ | ||
213 | t = ls_box(t) ^ rco_tab[i]; \ | ||
214 | t ^= ctx->key_enc[8 * i]; \ | ||
215 | ctx->key_enc[8 * i + 8] = t; \ | ||
216 | t ^= ctx->key_enc[8 * i + 1]; \ | ||
217 | ctx->key_enc[8 * i + 9] = t; \ | ||
218 | t ^= ctx->key_enc[8 * i + 2]; \ | ||
219 | ctx->key_enc[8 * i + 10] = t; \ | ||
220 | t ^= ctx->key_enc[8 * i + 3]; \ | ||
221 | ctx->key_enc[8 * i + 11] = t; \ | ||
222 | t = ctx->key_enc[8 * i + 4] ^ ls_box(t); \ | ||
223 | ctx->key_enc[8 * i + 12] = t; \ | ||
224 | t ^= ctx->key_enc[8 * i + 5]; \ | ||
225 | ctx->key_enc[8 * i + 13] = t; \ | ||
226 | t ^= ctx->key_enc[8 * i + 6]; \ | ||
227 | ctx->key_enc[8 * i + 14] = t; \ | ||
228 | t ^= ctx->key_enc[8 * i + 7]; \ | ||
229 | ctx->key_enc[8 * i + 15] = t; \ | ||
230 | } while (0) | ||
231 | |||
232 | int crypto_aes_set_key(struct crypto_tfm *tfm, const u8 *in_key, | ||
233 | unsigned int key_len) | ||
253 | { | 234 | { |
254 | struct aes_ctx *ctx = crypto_tfm_ctx(tfm); | 235 | struct crypto_aes_ctx *ctx = crypto_tfm_ctx(tfm); |
255 | const __le32 *key = (const __le32 *)in_key; | 236 | const __le32 *key = (const __le32 *)in_key; |
256 | u32 *flags = &tfm->crt_flags; | 237 | u32 *flags = &tfm->crt_flags; |
257 | u32 i, t, u, v, w; | 238 | u32 i, t, u, v, w, j; |
258 | 239 | ||
259 | if (key_len % 8) { | 240 | if (key_len % 8) { |
260 | *flags |= CRYPTO_TFM_RES_BAD_KEY_LEN; | 241 | *flags |= CRYPTO_TFM_RES_BAD_KEY_LEN; |
@@ -263,95 +244,113 @@ static int aes_set_key(struct crypto_tfm *tfm, const u8 *in_key, | |||
263 | 244 | ||
264 | ctx->key_length = key_len; | 245 | ctx->key_length = key_len; |
265 | 246 | ||
266 | E_KEY[0] = le32_to_cpu(key[0]); | 247 | ctx->key_dec[key_len + 24] = ctx->key_enc[0] = le32_to_cpu(key[0]); |
267 | E_KEY[1] = le32_to_cpu(key[1]); | 248 | ctx->key_dec[key_len + 25] = ctx->key_enc[1] = le32_to_cpu(key[1]); |
268 | E_KEY[2] = le32_to_cpu(key[2]); | 249 | ctx->key_dec[key_len + 26] = ctx->key_enc[2] = le32_to_cpu(key[2]); |
269 | E_KEY[3] = le32_to_cpu(key[3]); | 250 | ctx->key_dec[key_len + 27] = ctx->key_enc[3] = le32_to_cpu(key[3]); |
270 | 251 | ||
271 | switch (key_len) { | 252 | switch (key_len) { |
272 | case 16: | 253 | case 16: |
273 | t = E_KEY[3]; | 254 | t = ctx->key_enc[3]; |
274 | for (i = 0; i < 10; ++i) | 255 | for (i = 0; i < 10; ++i) |
275 | loop4 (i); | 256 | loop4(i); |
276 | break; | 257 | break; |
277 | 258 | ||
278 | case 24: | 259 | case 24: |
279 | E_KEY[4] = le32_to_cpu(key[4]); | 260 | ctx->key_enc[4] = le32_to_cpu(key[4]); |
280 | t = E_KEY[5] = le32_to_cpu(key[5]); | 261 | t = ctx->key_enc[5] = le32_to_cpu(key[5]); |
281 | for (i = 0; i < 8; ++i) | 262 | for (i = 0; i < 8; ++i) |
282 | loop6 (i); | 263 | loop6(i); |
283 | break; | 264 | break; |
284 | 265 | ||
285 | case 32: | 266 | case 32: |
286 | E_KEY[4] = le32_to_cpu(key[4]); | 267 | ctx->key_enc[4] = le32_to_cpu(key[4]); |
287 | E_KEY[5] = le32_to_cpu(key[5]); | 268 | ctx->key_enc[5] = le32_to_cpu(key[5]); |
288 | E_KEY[6] = le32_to_cpu(key[6]); | 269 | ctx->key_enc[6] = le32_to_cpu(key[6]); |
289 | t = E_KEY[7] = le32_to_cpu(key[7]); | 270 | t = ctx->key_enc[7] = le32_to_cpu(key[7]); |
290 | for (i = 0; i < 7; ++i) | 271 | for (i = 0; i < 7; ++i) |
291 | loop8 (i); | 272 | loop8(i); |
292 | break; | 273 | break; |
293 | } | 274 | } |
294 | 275 | ||
295 | D_KEY[0] = E_KEY[0]; | 276 | ctx->key_dec[0] = ctx->key_enc[key_len + 24]; |
296 | D_KEY[1] = E_KEY[1]; | 277 | ctx->key_dec[1] = ctx->key_enc[key_len + 25]; |
297 | D_KEY[2] = E_KEY[2]; | 278 | ctx->key_dec[2] = ctx->key_enc[key_len + 26]; |
298 | D_KEY[3] = E_KEY[3]; | 279 | ctx->key_dec[3] = ctx->key_enc[key_len + 27]; |
299 | 280 | ||
300 | for (i = 4; i < key_len + 24; ++i) { | 281 | for (i = 4; i < key_len + 24; ++i) { |
301 | imix_col (D_KEY[i], E_KEY[i]); | 282 | j = key_len + 24 - (i & ~3) + (i & 3); |
283 | imix_col(ctx->key_dec[j], ctx->key_enc[i]); | ||
302 | } | 284 | } |
303 | |||
304 | return 0; | 285 | return 0; |
305 | } | 286 | } |
287 | EXPORT_SYMBOL_GPL(crypto_aes_set_key); | ||
306 | 288 | ||
307 | /* encrypt a block of text */ | 289 | /* encrypt a block of text */ |
308 | 290 | ||
309 | #define f_nround(bo, bi, k) \ | 291 | #define f_rn(bo, bi, n, k) do { \ |
310 | f_rn(bo, bi, 0, k); \ | 292 | bo[n] = crypto_ft_tab[0][byte(bi[n], 0)] ^ \ |
311 | f_rn(bo, bi, 1, k); \ | 293 | crypto_ft_tab[1][byte(bi[(n + 1) & 3], 1)] ^ \ |
312 | f_rn(bo, bi, 2, k); \ | 294 | crypto_ft_tab[2][byte(bi[(n + 2) & 3], 2)] ^ \ |
313 | f_rn(bo, bi, 3, k); \ | 295 | crypto_ft_tab[3][byte(bi[(n + 3) & 3], 3)] ^ *(k + n); \ |
314 | k += 4 | 296 | } while (0) |
315 | 297 | ||
316 | #define f_lround(bo, bi, k) \ | 298 | #define f_nround(bo, bi, k) do {\ |
317 | f_rl(bo, bi, 0, k); \ | 299 | f_rn(bo, bi, 0, k); \ |
318 | f_rl(bo, bi, 1, k); \ | 300 | f_rn(bo, bi, 1, k); \ |
319 | f_rl(bo, bi, 2, k); \ | 301 | f_rn(bo, bi, 2, k); \ |
320 | f_rl(bo, bi, 3, k) | 302 | f_rn(bo, bi, 3, k); \ |
303 | k += 4; \ | ||
304 | } while (0) | ||
305 | |||
306 | #define f_rl(bo, bi, n, k) do { \ | ||
307 | bo[n] = crypto_fl_tab[0][byte(bi[n], 0)] ^ \ | ||
308 | crypto_fl_tab[1][byte(bi[(n + 1) & 3], 1)] ^ \ | ||
309 | crypto_fl_tab[2][byte(bi[(n + 2) & 3], 2)] ^ \ | ||
310 | crypto_fl_tab[3][byte(bi[(n + 3) & 3], 3)] ^ *(k + n); \ | ||
311 | } while (0) | ||
312 | |||
313 | #define f_lround(bo, bi, k) do {\ | ||
314 | f_rl(bo, bi, 0, k); \ | ||
315 | f_rl(bo, bi, 1, k); \ | ||
316 | f_rl(bo, bi, 2, k); \ | ||
317 | f_rl(bo, bi, 3, k); \ | ||
318 | } while (0) | ||
321 | 319 | ||
322 | static void aes_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) | 320 | static void aes_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) |
323 | { | 321 | { |
324 | const struct aes_ctx *ctx = crypto_tfm_ctx(tfm); | 322 | const struct crypto_aes_ctx *ctx = crypto_tfm_ctx(tfm); |
325 | const __le32 *src = (const __le32 *)in; | 323 | const __le32 *src = (const __le32 *)in; |
326 | __le32 *dst = (__le32 *)out; | 324 | __le32 *dst = (__le32 *)out; |
327 | u32 b0[4], b1[4]; | 325 | u32 b0[4], b1[4]; |
328 | const u32 *kp = E_KEY + 4; | 326 | const u32 *kp = ctx->key_enc + 4; |
327 | const int key_len = ctx->key_length; | ||
329 | 328 | ||
330 | b0[0] = le32_to_cpu(src[0]) ^ E_KEY[0]; | 329 | b0[0] = le32_to_cpu(src[0]) ^ ctx->key_enc[0]; |
331 | b0[1] = le32_to_cpu(src[1]) ^ E_KEY[1]; | 330 | b0[1] = le32_to_cpu(src[1]) ^ ctx->key_enc[1]; |
332 | b0[2] = le32_to_cpu(src[2]) ^ E_KEY[2]; | 331 | b0[2] = le32_to_cpu(src[2]) ^ ctx->key_enc[2]; |
333 | b0[3] = le32_to_cpu(src[3]) ^ E_KEY[3]; | 332 | b0[3] = le32_to_cpu(src[3]) ^ ctx->key_enc[3]; |
334 | 333 | ||
335 | if (ctx->key_length > 24) { | 334 | if (key_len > 24) { |
336 | f_nround (b1, b0, kp); | 335 | f_nround(b1, b0, kp); |
337 | f_nround (b0, b1, kp); | 336 | f_nround(b0, b1, kp); |
338 | } | 337 | } |
339 | 338 | ||
340 | if (ctx->key_length > 16) { | 339 | if (key_len > 16) { |
341 | f_nround (b1, b0, kp); | 340 | f_nround(b1, b0, kp); |
342 | f_nround (b0, b1, kp); | 341 | f_nround(b0, b1, kp); |
343 | } | 342 | } |
344 | 343 | ||
345 | f_nround (b1, b0, kp); | 344 | f_nround(b1, b0, kp); |
346 | f_nround (b0, b1, kp); | 345 | f_nround(b0, b1, kp); |
347 | f_nround (b1, b0, kp); | 346 | f_nround(b1, b0, kp); |
348 | f_nround (b0, b1, kp); | 347 | f_nround(b0, b1, kp); |
349 | f_nround (b1, b0, kp); | 348 | f_nround(b1, b0, kp); |
350 | f_nround (b0, b1, kp); | 349 | f_nround(b0, b1, kp); |
351 | f_nround (b1, b0, kp); | 350 | f_nround(b1, b0, kp); |
352 | f_nround (b0, b1, kp); | 351 | f_nround(b0, b1, kp); |
353 | f_nround (b1, b0, kp); | 352 | f_nround(b1, b0, kp); |
354 | f_lround (b0, b1, kp); | 353 | f_lround(b0, b1, kp); |
355 | 354 | ||
356 | dst[0] = cpu_to_le32(b0[0]); | 355 | dst[0] = cpu_to_le32(b0[0]); |
357 | dst[1] = cpu_to_le32(b0[1]); | 356 | dst[1] = cpu_to_le32(b0[1]); |
@@ -361,53 +360,69 @@ static void aes_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) | |||
361 | 360 | ||
362 | /* decrypt a block of text */ | 361 | /* decrypt a block of text */ |
363 | 362 | ||
364 | #define i_nround(bo, bi, k) \ | 363 | #define i_rn(bo, bi, n, k) do { \ |
365 | i_rn(bo, bi, 0, k); \ | 364 | bo[n] = crypto_it_tab[0][byte(bi[n], 0)] ^ \ |
366 | i_rn(bo, bi, 1, k); \ | 365 | crypto_it_tab[1][byte(bi[(n + 3) & 3], 1)] ^ \ |
367 | i_rn(bo, bi, 2, k); \ | 366 | crypto_it_tab[2][byte(bi[(n + 2) & 3], 2)] ^ \ |
368 | i_rn(bo, bi, 3, k); \ | 367 | crypto_it_tab[3][byte(bi[(n + 1) & 3], 3)] ^ *(k + n); \ |
369 | k -= 4 | 368 | } while (0) |
370 | 369 | ||
371 | #define i_lround(bo, bi, k) \ | 370 | #define i_nround(bo, bi, k) do {\ |
372 | i_rl(bo, bi, 0, k); \ | 371 | i_rn(bo, bi, 0, k); \ |
373 | i_rl(bo, bi, 1, k); \ | 372 | i_rn(bo, bi, 1, k); \ |
374 | i_rl(bo, bi, 2, k); \ | 373 | i_rn(bo, bi, 2, k); \ |
375 | i_rl(bo, bi, 3, k) | 374 | i_rn(bo, bi, 3, k); \ |
375 | k += 4; \ | ||
376 | } while (0) | ||
377 | |||
378 | #define i_rl(bo, bi, n, k) do { \ | ||
379 | bo[n] = crypto_il_tab[0][byte(bi[n], 0)] ^ \ | ||
380 | crypto_il_tab[1][byte(bi[(n + 3) & 3], 1)] ^ \ | ||
381 | crypto_il_tab[2][byte(bi[(n + 2) & 3], 2)] ^ \ | ||
382 | crypto_il_tab[3][byte(bi[(n + 1) & 3], 3)] ^ *(k + n); \ | ||
383 | } while (0) | ||
384 | |||
385 | #define i_lround(bo, bi, k) do {\ | ||
386 | i_rl(bo, bi, 0, k); \ | ||
387 | i_rl(bo, bi, 1, k); \ | ||
388 | i_rl(bo, bi, 2, k); \ | ||
389 | i_rl(bo, bi, 3, k); \ | ||
390 | } while (0) | ||
376 | 391 | ||
377 | static void aes_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) | 392 | static void aes_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) |
378 | { | 393 | { |
379 | const struct aes_ctx *ctx = crypto_tfm_ctx(tfm); | 394 | const struct crypto_aes_ctx *ctx = crypto_tfm_ctx(tfm); |
380 | const __le32 *src = (const __le32 *)in; | 395 | const __le32 *src = (const __le32 *)in; |
381 | __le32 *dst = (__le32 *)out; | 396 | __le32 *dst = (__le32 *)out; |
382 | u32 b0[4], b1[4]; | 397 | u32 b0[4], b1[4]; |
383 | const int key_len = ctx->key_length; | 398 | const int key_len = ctx->key_length; |
384 | const u32 *kp = D_KEY + key_len + 20; | 399 | const u32 *kp = ctx->key_dec + 4; |
385 | 400 | ||
386 | b0[0] = le32_to_cpu(src[0]) ^ E_KEY[key_len + 24]; | 401 | b0[0] = le32_to_cpu(src[0]) ^ ctx->key_dec[0]; |
387 | b0[1] = le32_to_cpu(src[1]) ^ E_KEY[key_len + 25]; | 402 | b0[1] = le32_to_cpu(src[1]) ^ ctx->key_dec[1]; |
388 | b0[2] = le32_to_cpu(src[2]) ^ E_KEY[key_len + 26]; | 403 | b0[2] = le32_to_cpu(src[2]) ^ ctx->key_dec[2]; |
389 | b0[3] = le32_to_cpu(src[3]) ^ E_KEY[key_len + 27]; | 404 | b0[3] = le32_to_cpu(src[3]) ^ ctx->key_dec[3]; |
390 | 405 | ||
391 | if (key_len > 24) { | 406 | if (key_len > 24) { |
392 | i_nround (b1, b0, kp); | 407 | i_nround(b1, b0, kp); |
393 | i_nround (b0, b1, kp); | 408 | i_nround(b0, b1, kp); |
394 | } | 409 | } |
395 | 410 | ||
396 | if (key_len > 16) { | 411 | if (key_len > 16) { |
397 | i_nround (b1, b0, kp); | 412 | i_nround(b1, b0, kp); |
398 | i_nround (b0, b1, kp); | 413 | i_nround(b0, b1, kp); |
399 | } | 414 | } |
400 | 415 | ||
401 | i_nround (b1, b0, kp); | 416 | i_nround(b1, b0, kp); |
402 | i_nround (b0, b1, kp); | 417 | i_nround(b0, b1, kp); |
403 | i_nround (b1, b0, kp); | 418 | i_nround(b1, b0, kp); |
404 | i_nround (b0, b1, kp); | 419 | i_nround(b0, b1, kp); |
405 | i_nround (b1, b0, kp); | 420 | i_nround(b1, b0, kp); |
406 | i_nround (b0, b1, kp); | 421 | i_nround(b0, b1, kp); |
407 | i_nround (b1, b0, kp); | 422 | i_nround(b1, b0, kp); |
408 | i_nround (b0, b1, kp); | 423 | i_nround(b0, b1, kp); |
409 | i_nround (b1, b0, kp); | 424 | i_nround(b1, b0, kp); |
410 | i_lround (b0, b1, kp); | 425 | i_lround(b0, b1, kp); |
411 | 426 | ||
412 | dst[0] = cpu_to_le32(b0[0]); | 427 | dst[0] = cpu_to_le32(b0[0]); |
413 | dst[1] = cpu_to_le32(b0[1]); | 428 | dst[1] = cpu_to_le32(b0[1]); |
@@ -415,14 +430,13 @@ static void aes_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) | |||
415 | dst[3] = cpu_to_le32(b0[3]); | 430 | dst[3] = cpu_to_le32(b0[3]); |
416 | } | 431 | } |
417 | 432 | ||
418 | |||
419 | static struct crypto_alg aes_alg = { | 433 | static struct crypto_alg aes_alg = { |
420 | .cra_name = "aes", | 434 | .cra_name = "aes", |
421 | .cra_driver_name = "aes-generic", | 435 | .cra_driver_name = "aes-generic", |
422 | .cra_priority = 100, | 436 | .cra_priority = 100, |
423 | .cra_flags = CRYPTO_ALG_TYPE_CIPHER, | 437 | .cra_flags = CRYPTO_ALG_TYPE_CIPHER, |
424 | .cra_blocksize = AES_BLOCK_SIZE, | 438 | .cra_blocksize = AES_BLOCK_SIZE, |
425 | .cra_ctxsize = sizeof(struct aes_ctx), | 439 | .cra_ctxsize = sizeof(struct crypto_aes_ctx), |
426 | .cra_alignmask = 3, | 440 | .cra_alignmask = 3, |
427 | .cra_module = THIS_MODULE, | 441 | .cra_module = THIS_MODULE, |
428 | .cra_list = LIST_HEAD_INIT(aes_alg.cra_list), | 442 | .cra_list = LIST_HEAD_INIT(aes_alg.cra_list), |
@@ -430,9 +444,9 @@ static struct crypto_alg aes_alg = { | |||
430 | .cipher = { | 444 | .cipher = { |
431 | .cia_min_keysize = AES_MIN_KEY_SIZE, | 445 | .cia_min_keysize = AES_MIN_KEY_SIZE, |
432 | .cia_max_keysize = AES_MAX_KEY_SIZE, | 446 | .cia_max_keysize = AES_MAX_KEY_SIZE, |
433 | .cia_setkey = aes_set_key, | 447 | .cia_setkey = crypto_aes_set_key, |
434 | .cia_encrypt = aes_encrypt, | 448 | .cia_encrypt = aes_encrypt, |
435 | .cia_decrypt = aes_decrypt | 449 | .cia_decrypt = aes_decrypt |
436 | } | 450 | } |
437 | } | 451 | } |
438 | }; | 452 | }; |
diff --git a/crypto/algapi.c b/crypto/algapi.c index 8383282de1dd..e65cb50cf4af 100644 --- a/crypto/algapi.c +++ b/crypto/algapi.c | |||
@@ -472,7 +472,7 @@ int crypto_check_attr_type(struct rtattr **tb, u32 type) | |||
472 | } | 472 | } |
473 | EXPORT_SYMBOL_GPL(crypto_check_attr_type); | 473 | EXPORT_SYMBOL_GPL(crypto_check_attr_type); |
474 | 474 | ||
475 | struct crypto_alg *crypto_attr_alg(struct rtattr *rta, u32 type, u32 mask) | 475 | const char *crypto_attr_alg_name(struct rtattr *rta) |
476 | { | 476 | { |
477 | struct crypto_attr_alg *alga; | 477 | struct crypto_attr_alg *alga; |
478 | 478 | ||
@@ -486,7 +486,21 @@ struct crypto_alg *crypto_attr_alg(struct rtattr *rta, u32 type, u32 mask) | |||
486 | alga = RTA_DATA(rta); | 486 | alga = RTA_DATA(rta); |
487 | alga->name[CRYPTO_MAX_ALG_NAME - 1] = 0; | 487 | alga->name[CRYPTO_MAX_ALG_NAME - 1] = 0; |
488 | 488 | ||
489 | return crypto_alg_mod_lookup(alga->name, type, mask); | 489 | return alga->name; |
490 | } | ||
491 | EXPORT_SYMBOL_GPL(crypto_attr_alg_name); | ||
492 | |||
493 | struct crypto_alg *crypto_attr_alg(struct rtattr *rta, u32 type, u32 mask) | ||
494 | { | ||
495 | const char *name; | ||
496 | int err; | ||
497 | |||
498 | name = crypto_attr_alg_name(rta); | ||
499 | err = PTR_ERR(name); | ||
500 | if (IS_ERR(name)) | ||
501 | return ERR_PTR(err); | ||
502 | |||
503 | return crypto_alg_mod_lookup(name, type, mask); | ||
490 | } | 504 | } |
491 | EXPORT_SYMBOL_GPL(crypto_attr_alg); | 505 | EXPORT_SYMBOL_GPL(crypto_attr_alg); |
492 | 506 | ||
@@ -605,6 +619,53 @@ int crypto_tfm_in_queue(struct crypto_queue *queue, struct crypto_tfm *tfm) | |||
605 | } | 619 | } |
606 | EXPORT_SYMBOL_GPL(crypto_tfm_in_queue); | 620 | EXPORT_SYMBOL_GPL(crypto_tfm_in_queue); |
607 | 621 | ||
622 | static inline void crypto_inc_byte(u8 *a, unsigned int size) | ||
623 | { | ||
624 | u8 *b = (a + size); | ||
625 | u8 c; | ||
626 | |||
627 | for (; size; size--) { | ||
628 | c = *--b + 1; | ||
629 | *b = c; | ||
630 | if (c) | ||
631 | break; | ||
632 | } | ||
633 | } | ||
634 | |||
635 | void crypto_inc(u8 *a, unsigned int size) | ||
636 | { | ||
637 | __be32 *b = (__be32 *)(a + size); | ||
638 | u32 c; | ||
639 | |||
640 | for (; size >= 4; size -= 4) { | ||
641 | c = be32_to_cpu(*--b) + 1; | ||
642 | *b = cpu_to_be32(c); | ||
643 | if (c) | ||
644 | return; | ||
645 | } | ||
646 | |||
647 | crypto_inc_byte(a, size); | ||
648 | } | ||
649 | EXPORT_SYMBOL_GPL(crypto_inc); | ||
650 | |||
651 | static inline void crypto_xor_byte(u8 *a, const u8 *b, unsigned int size) | ||
652 | { | ||
653 | for (; size; size--) | ||
654 | *a++ ^= *b++; | ||
655 | } | ||
656 | |||
657 | void crypto_xor(u8 *dst, const u8 *src, unsigned int size) | ||
658 | { | ||
659 | u32 *a = (u32 *)dst; | ||
660 | u32 *b = (u32 *)src; | ||
661 | |||
662 | for (; size >= 4; size -= 4) | ||
663 | *a++ ^= *b++; | ||
664 | |||
665 | crypto_xor_byte((u8 *)a, (u8 *)b, size); | ||
666 | } | ||
667 | EXPORT_SYMBOL_GPL(crypto_xor); | ||
668 | |||
608 | static int __init crypto_algapi_init(void) | 669 | static int __init crypto_algapi_init(void) |
609 | { | 670 | { |
610 | crypto_init_proc(); | 671 | crypto_init_proc(); |
diff --git a/crypto/api.c b/crypto/api.c index 1f5c72477356..a2496d1bc6d4 100644 --- a/crypto/api.c +++ b/crypto/api.c | |||
@@ -137,7 +137,7 @@ static struct crypto_alg *crypto_larval_alloc(const char *name, u32 type, | |||
137 | return alg; | 137 | return alg; |
138 | } | 138 | } |
139 | 139 | ||
140 | static void crypto_larval_kill(struct crypto_alg *alg) | 140 | void crypto_larval_kill(struct crypto_alg *alg) |
141 | { | 141 | { |
142 | struct crypto_larval *larval = (void *)alg; | 142 | struct crypto_larval *larval = (void *)alg; |
143 | 143 | ||
@@ -147,6 +147,7 @@ static void crypto_larval_kill(struct crypto_alg *alg) | |||
147 | complete_all(&larval->completion); | 147 | complete_all(&larval->completion); |
148 | crypto_alg_put(alg); | 148 | crypto_alg_put(alg); |
149 | } | 149 | } |
150 | EXPORT_SYMBOL_GPL(crypto_larval_kill); | ||
150 | 151 | ||
151 | static struct crypto_alg *crypto_larval_wait(struct crypto_alg *alg) | 152 | static struct crypto_alg *crypto_larval_wait(struct crypto_alg *alg) |
152 | { | 153 | { |
@@ -176,11 +177,9 @@ static struct crypto_alg *crypto_alg_lookup(const char *name, u32 type, | |||
176 | return alg; | 177 | return alg; |
177 | } | 178 | } |
178 | 179 | ||
179 | struct crypto_alg *crypto_alg_mod_lookup(const char *name, u32 type, u32 mask) | 180 | struct crypto_alg *crypto_larval_lookup(const char *name, u32 type, u32 mask) |
180 | { | 181 | { |
181 | struct crypto_alg *alg; | 182 | struct crypto_alg *alg; |
182 | struct crypto_alg *larval; | ||
183 | int ok; | ||
184 | 183 | ||
185 | if (!name) | 184 | if (!name) |
186 | return ERR_PTR(-ENOENT); | 185 | return ERR_PTR(-ENOENT); |
@@ -193,7 +192,17 @@ struct crypto_alg *crypto_alg_mod_lookup(const char *name, u32 type, u32 mask) | |||
193 | if (alg) | 192 | if (alg) |
194 | return crypto_is_larval(alg) ? crypto_larval_wait(alg) : alg; | 193 | return crypto_is_larval(alg) ? crypto_larval_wait(alg) : alg; |
195 | 194 | ||
196 | larval = crypto_larval_alloc(name, type, mask); | 195 | return crypto_larval_alloc(name, type, mask); |
196 | } | ||
197 | EXPORT_SYMBOL_GPL(crypto_larval_lookup); | ||
198 | |||
199 | struct crypto_alg *crypto_alg_mod_lookup(const char *name, u32 type, u32 mask) | ||
200 | { | ||
201 | struct crypto_alg *alg; | ||
202 | struct crypto_alg *larval; | ||
203 | int ok; | ||
204 | |||
205 | larval = crypto_larval_lookup(name, type, mask); | ||
197 | if (IS_ERR(larval) || !crypto_is_larval(larval)) | 206 | if (IS_ERR(larval) || !crypto_is_larval(larval)) |
198 | return larval; | 207 | return larval; |
199 | 208 | ||
diff --git a/crypto/authenc.c b/crypto/authenc.c index 126a529b496d..ed8ac5a6fa5f 100644 --- a/crypto/authenc.c +++ b/crypto/authenc.c | |||
@@ -10,22 +10,21 @@ | |||
10 | * | 10 | * |
11 | */ | 11 | */ |
12 | 12 | ||
13 | #include <crypto/algapi.h> | 13 | #include <crypto/aead.h> |
14 | #include <crypto/internal/skcipher.h> | ||
15 | #include <crypto/authenc.h> | ||
16 | #include <crypto/scatterwalk.h> | ||
14 | #include <linux/err.h> | 17 | #include <linux/err.h> |
15 | #include <linux/init.h> | 18 | #include <linux/init.h> |
16 | #include <linux/kernel.h> | 19 | #include <linux/kernel.h> |
17 | #include <linux/module.h> | 20 | #include <linux/module.h> |
21 | #include <linux/rtnetlink.h> | ||
18 | #include <linux/slab.h> | 22 | #include <linux/slab.h> |
19 | #include <linux/spinlock.h> | 23 | #include <linux/spinlock.h> |
20 | 24 | ||
21 | #include "scatterwalk.h" | ||
22 | |||
23 | struct authenc_instance_ctx { | 25 | struct authenc_instance_ctx { |
24 | struct crypto_spawn auth; | 26 | struct crypto_spawn auth; |
25 | struct crypto_spawn enc; | 27 | struct crypto_skcipher_spawn enc; |
26 | |||
27 | unsigned int authsize; | ||
28 | unsigned int enckeylen; | ||
29 | }; | 28 | }; |
30 | 29 | ||
31 | struct crypto_authenc_ctx { | 30 | struct crypto_authenc_ctx { |
@@ -37,19 +36,31 @@ struct crypto_authenc_ctx { | |||
37 | static int crypto_authenc_setkey(struct crypto_aead *authenc, const u8 *key, | 36 | static int crypto_authenc_setkey(struct crypto_aead *authenc, const u8 *key, |
38 | unsigned int keylen) | 37 | unsigned int keylen) |
39 | { | 38 | { |
40 | struct authenc_instance_ctx *ictx = | ||
41 | crypto_instance_ctx(crypto_aead_alg_instance(authenc)); | ||
42 | unsigned int enckeylen = ictx->enckeylen; | ||
43 | unsigned int authkeylen; | 39 | unsigned int authkeylen; |
40 | unsigned int enckeylen; | ||
44 | struct crypto_authenc_ctx *ctx = crypto_aead_ctx(authenc); | 41 | struct crypto_authenc_ctx *ctx = crypto_aead_ctx(authenc); |
45 | struct crypto_hash *auth = ctx->auth; | 42 | struct crypto_hash *auth = ctx->auth; |
46 | struct crypto_ablkcipher *enc = ctx->enc; | 43 | struct crypto_ablkcipher *enc = ctx->enc; |
44 | struct rtattr *rta = (void *)key; | ||
45 | struct crypto_authenc_key_param *param; | ||
47 | int err = -EINVAL; | 46 | int err = -EINVAL; |
48 | 47 | ||
49 | if (keylen < enckeylen) { | 48 | if (!RTA_OK(rta, keylen)) |
50 | crypto_aead_set_flags(authenc, CRYPTO_TFM_RES_BAD_KEY_LEN); | 49 | goto badkey; |
51 | goto out; | 50 | if (rta->rta_type != CRYPTO_AUTHENC_KEYA_PARAM) |
52 | } | 51 | goto badkey; |
52 | if (RTA_PAYLOAD(rta) < sizeof(*param)) | ||
53 | goto badkey; | ||
54 | |||
55 | param = RTA_DATA(rta); | ||
56 | enckeylen = be32_to_cpu(param->enckeylen); | ||
57 | |||
58 | key += RTA_ALIGN(rta->rta_len); | ||
59 | keylen -= RTA_ALIGN(rta->rta_len); | ||
60 | |||
61 | if (keylen < enckeylen) | ||
62 | goto badkey; | ||
63 | |||
53 | authkeylen = keylen - enckeylen; | 64 | authkeylen = keylen - enckeylen; |
54 | 65 | ||
55 | crypto_hash_clear_flags(auth, CRYPTO_TFM_REQ_MASK); | 66 | crypto_hash_clear_flags(auth, CRYPTO_TFM_REQ_MASK); |
@@ -71,21 +82,38 @@ static int crypto_authenc_setkey(struct crypto_aead *authenc, const u8 *key, | |||
71 | 82 | ||
72 | out: | 83 | out: |
73 | return err; | 84 | return err; |
85 | |||
86 | badkey: | ||
87 | crypto_aead_set_flags(authenc, CRYPTO_TFM_RES_BAD_KEY_LEN); | ||
88 | goto out; | ||
74 | } | 89 | } |
75 | 90 | ||
76 | static int crypto_authenc_hash(struct aead_request *req) | 91 | static void authenc_chain(struct scatterlist *head, struct scatterlist *sg, |
92 | int chain) | ||
93 | { | ||
94 | if (chain) { | ||
95 | head->length += sg->length; | ||
96 | sg = scatterwalk_sg_next(sg); | ||
97 | } | ||
98 | |||
99 | if (sg) | ||
100 | scatterwalk_sg_chain(head, 2, sg); | ||
101 | else | ||
102 | sg_mark_end(head); | ||
103 | } | ||
104 | |||
105 | static u8 *crypto_authenc_hash(struct aead_request *req, unsigned int flags, | ||
106 | struct scatterlist *cipher, | ||
107 | unsigned int cryptlen) | ||
77 | { | 108 | { |
78 | struct crypto_aead *authenc = crypto_aead_reqtfm(req); | 109 | struct crypto_aead *authenc = crypto_aead_reqtfm(req); |
79 | struct authenc_instance_ctx *ictx = | ||
80 | crypto_instance_ctx(crypto_aead_alg_instance(authenc)); | ||
81 | struct crypto_authenc_ctx *ctx = crypto_aead_ctx(authenc); | 110 | struct crypto_authenc_ctx *ctx = crypto_aead_ctx(authenc); |
82 | struct crypto_hash *auth = ctx->auth; | 111 | struct crypto_hash *auth = ctx->auth; |
83 | struct hash_desc desc = { | 112 | struct hash_desc desc = { |
84 | .tfm = auth, | 113 | .tfm = auth, |
114 | .flags = aead_request_flags(req) & flags, | ||
85 | }; | 115 | }; |
86 | u8 *hash = aead_request_ctx(req); | 116 | u8 *hash = aead_request_ctx(req); |
87 | struct scatterlist *dst = req->dst; | ||
88 | unsigned int cryptlen = req->cryptlen; | ||
89 | int err; | 117 | int err; |
90 | 118 | ||
91 | hash = (u8 *)ALIGN((unsigned long)hash + crypto_hash_alignmask(auth), | 119 | hash = (u8 *)ALIGN((unsigned long)hash + crypto_hash_alignmask(auth), |
@@ -100,7 +128,7 @@ static int crypto_authenc_hash(struct aead_request *req) | |||
100 | if (err) | 128 | if (err) |
101 | goto auth_unlock; | 129 | goto auth_unlock; |
102 | 130 | ||
103 | err = crypto_hash_update(&desc, dst, cryptlen); | 131 | err = crypto_hash_update(&desc, cipher, cryptlen); |
104 | if (err) | 132 | if (err) |
105 | goto auth_unlock; | 133 | goto auth_unlock; |
106 | 134 | ||
@@ -109,17 +137,53 @@ auth_unlock: | |||
109 | spin_unlock_bh(&ctx->auth_lock); | 137 | spin_unlock_bh(&ctx->auth_lock); |
110 | 138 | ||
111 | if (err) | 139 | if (err) |
112 | return err; | 140 | return ERR_PTR(err); |
141 | |||
142 | return hash; | ||
143 | } | ||
113 | 144 | ||
114 | scatterwalk_map_and_copy(hash, dst, cryptlen, ictx->authsize, 1); | 145 | static int crypto_authenc_genicv(struct aead_request *req, u8 *iv, |
146 | unsigned int flags) | ||
147 | { | ||
148 | struct crypto_aead *authenc = crypto_aead_reqtfm(req); | ||
149 | struct scatterlist *dst = req->dst; | ||
150 | struct scatterlist cipher[2]; | ||
151 | struct page *dstp; | ||
152 | unsigned int ivsize = crypto_aead_ivsize(authenc); | ||
153 | unsigned int cryptlen; | ||
154 | u8 *vdst; | ||
155 | u8 *hash; | ||
156 | |||
157 | dstp = sg_page(dst); | ||
158 | vdst = PageHighMem(dstp) ? NULL : page_address(dstp) + dst->offset; | ||
159 | |||
160 | sg_init_table(cipher, 2); | ||
161 | sg_set_buf(cipher, iv, ivsize); | ||
162 | authenc_chain(cipher, dst, vdst == iv + ivsize); | ||
163 | |||
164 | cryptlen = req->cryptlen + ivsize; | ||
165 | hash = crypto_authenc_hash(req, flags, cipher, cryptlen); | ||
166 | if (IS_ERR(hash)) | ||
167 | return PTR_ERR(hash); | ||
168 | |||
169 | scatterwalk_map_and_copy(hash, cipher, cryptlen, | ||
170 | crypto_aead_authsize(authenc), 1); | ||
115 | return 0; | 171 | return 0; |
116 | } | 172 | } |
117 | 173 | ||
118 | static void crypto_authenc_encrypt_done(struct crypto_async_request *req, | 174 | static void crypto_authenc_encrypt_done(struct crypto_async_request *req, |
119 | int err) | 175 | int err) |
120 | { | 176 | { |
121 | if (!err) | 177 | if (!err) { |
122 | err = crypto_authenc_hash(req->data); | 178 | struct aead_request *areq = req->data; |
179 | struct crypto_aead *authenc = crypto_aead_reqtfm(areq); | ||
180 | struct crypto_authenc_ctx *ctx = crypto_aead_ctx(authenc); | ||
181 | struct ablkcipher_request *abreq = aead_request_ctx(areq); | ||
182 | u8 *iv = (u8 *)(abreq + 1) + | ||
183 | crypto_ablkcipher_reqsize(ctx->enc); | ||
184 | |||
185 | err = crypto_authenc_genicv(areq, iv, 0); | ||
186 | } | ||
123 | 187 | ||
124 | aead_request_complete(req->data, err); | 188 | aead_request_complete(req->data, err); |
125 | } | 189 | } |
@@ -129,72 +193,99 @@ static int crypto_authenc_encrypt(struct aead_request *req) | |||
129 | struct crypto_aead *authenc = crypto_aead_reqtfm(req); | 193 | struct crypto_aead *authenc = crypto_aead_reqtfm(req); |
130 | struct crypto_authenc_ctx *ctx = crypto_aead_ctx(authenc); | 194 | struct crypto_authenc_ctx *ctx = crypto_aead_ctx(authenc); |
131 | struct ablkcipher_request *abreq = aead_request_ctx(req); | 195 | struct ablkcipher_request *abreq = aead_request_ctx(req); |
196 | struct crypto_ablkcipher *enc = ctx->enc; | ||
197 | struct scatterlist *dst = req->dst; | ||
198 | unsigned int cryptlen = req->cryptlen; | ||
199 | u8 *iv = (u8 *)(abreq + 1) + crypto_ablkcipher_reqsize(enc); | ||
132 | int err; | 200 | int err; |
133 | 201 | ||
134 | ablkcipher_request_set_tfm(abreq, ctx->enc); | 202 | ablkcipher_request_set_tfm(abreq, enc); |
135 | ablkcipher_request_set_callback(abreq, aead_request_flags(req), | 203 | ablkcipher_request_set_callback(abreq, aead_request_flags(req), |
136 | crypto_authenc_encrypt_done, req); | 204 | crypto_authenc_encrypt_done, req); |
137 | ablkcipher_request_set_crypt(abreq, req->src, req->dst, req->cryptlen, | 205 | ablkcipher_request_set_crypt(abreq, req->src, dst, cryptlen, req->iv); |
138 | req->iv); | 206 | |
207 | memcpy(iv, req->iv, crypto_aead_ivsize(authenc)); | ||
139 | 208 | ||
140 | err = crypto_ablkcipher_encrypt(abreq); | 209 | err = crypto_ablkcipher_encrypt(abreq); |
141 | if (err) | 210 | if (err) |
142 | return err; | 211 | return err; |
143 | 212 | ||
144 | return crypto_authenc_hash(req); | 213 | return crypto_authenc_genicv(req, iv, CRYPTO_TFM_REQ_MAY_SLEEP); |
145 | } | 214 | } |
146 | 215 | ||
147 | static int crypto_authenc_verify(struct aead_request *req) | 216 | static void crypto_authenc_givencrypt_done(struct crypto_async_request *req, |
217 | int err) | ||
148 | { | 218 | { |
149 | struct crypto_aead *authenc = crypto_aead_reqtfm(req); | 219 | if (!err) { |
150 | struct authenc_instance_ctx *ictx = | 220 | struct aead_givcrypt_request *greq = req->data; |
151 | crypto_instance_ctx(crypto_aead_alg_instance(authenc)); | 221 | |
222 | err = crypto_authenc_genicv(&greq->areq, greq->giv, 0); | ||
223 | } | ||
224 | |||
225 | aead_request_complete(req->data, err); | ||
226 | } | ||
227 | |||
228 | static int crypto_authenc_givencrypt(struct aead_givcrypt_request *req) | ||
229 | { | ||
230 | struct crypto_aead *authenc = aead_givcrypt_reqtfm(req); | ||
152 | struct crypto_authenc_ctx *ctx = crypto_aead_ctx(authenc); | 231 | struct crypto_authenc_ctx *ctx = crypto_aead_ctx(authenc); |
153 | struct crypto_hash *auth = ctx->auth; | 232 | struct aead_request *areq = &req->areq; |
154 | struct hash_desc desc = { | 233 | struct skcipher_givcrypt_request *greq = aead_request_ctx(areq); |
155 | .tfm = auth, | 234 | u8 *iv = req->giv; |
156 | .flags = aead_request_flags(req), | ||
157 | }; | ||
158 | u8 *ohash = aead_request_ctx(req); | ||
159 | u8 *ihash; | ||
160 | struct scatterlist *src = req->src; | ||
161 | unsigned int cryptlen = req->cryptlen; | ||
162 | unsigned int authsize; | ||
163 | int err; | 235 | int err; |
164 | 236 | ||
165 | ohash = (u8 *)ALIGN((unsigned long)ohash + crypto_hash_alignmask(auth), | 237 | skcipher_givcrypt_set_tfm(greq, ctx->enc); |
166 | crypto_hash_alignmask(auth) + 1); | 238 | skcipher_givcrypt_set_callback(greq, aead_request_flags(areq), |
167 | ihash = ohash + crypto_hash_digestsize(auth); | 239 | crypto_authenc_givencrypt_done, areq); |
168 | 240 | skcipher_givcrypt_set_crypt(greq, areq->src, areq->dst, areq->cryptlen, | |
169 | spin_lock_bh(&ctx->auth_lock); | 241 | areq->iv); |
170 | err = crypto_hash_init(&desc); | 242 | skcipher_givcrypt_set_giv(greq, iv, req->seq); |
171 | if (err) | ||
172 | goto auth_unlock; | ||
173 | 243 | ||
174 | err = crypto_hash_update(&desc, req->assoc, req->assoclen); | 244 | err = crypto_skcipher_givencrypt(greq); |
175 | if (err) | 245 | if (err) |
176 | goto auth_unlock; | 246 | return err; |
177 | 247 | ||
178 | err = crypto_hash_update(&desc, src, cryptlen); | 248 | return crypto_authenc_genicv(areq, iv, CRYPTO_TFM_REQ_MAY_SLEEP); |
179 | if (err) | 249 | } |
180 | goto auth_unlock; | ||
181 | 250 | ||
182 | err = crypto_hash_final(&desc, ohash); | 251 | static int crypto_authenc_verify(struct aead_request *req, |
183 | auth_unlock: | 252 | struct scatterlist *cipher, |
184 | spin_unlock_bh(&ctx->auth_lock); | 253 | unsigned int cryptlen) |
254 | { | ||
255 | struct crypto_aead *authenc = crypto_aead_reqtfm(req); | ||
256 | u8 *ohash; | ||
257 | u8 *ihash; | ||
258 | unsigned int authsize; | ||
185 | 259 | ||
186 | if (err) | 260 | ohash = crypto_authenc_hash(req, CRYPTO_TFM_REQ_MAY_SLEEP, cipher, |
187 | return err; | 261 | cryptlen); |
262 | if (IS_ERR(ohash)) | ||
263 | return PTR_ERR(ohash); | ||
188 | 264 | ||
189 | authsize = ictx->authsize; | 265 | authsize = crypto_aead_authsize(authenc); |
190 | scatterwalk_map_and_copy(ihash, src, cryptlen, authsize, 0); | 266 | ihash = ohash + authsize; |
191 | return memcmp(ihash, ohash, authsize) ? -EINVAL : 0; | 267 | scatterwalk_map_and_copy(ihash, cipher, cryptlen, authsize, 0); |
268 | return memcmp(ihash, ohash, authsize) ? -EBADMSG: 0; | ||
192 | } | 269 | } |
193 | 270 | ||
194 | static void crypto_authenc_decrypt_done(struct crypto_async_request *req, | 271 | static int crypto_authenc_iverify(struct aead_request *req, u8 *iv, |
195 | int err) | 272 | unsigned int cryptlen) |
196 | { | 273 | { |
197 | aead_request_complete(req->data, err); | 274 | struct crypto_aead *authenc = crypto_aead_reqtfm(req); |
275 | struct scatterlist *src = req->src; | ||
276 | struct scatterlist cipher[2]; | ||
277 | struct page *srcp; | ||
278 | unsigned int ivsize = crypto_aead_ivsize(authenc); | ||
279 | u8 *vsrc; | ||
280 | |||
281 | srcp = sg_page(src); | ||
282 | vsrc = PageHighMem(srcp) ? NULL : page_address(srcp) + src->offset; | ||
283 | |||
284 | sg_init_table(cipher, 2); | ||
285 | sg_set_buf(cipher, iv, ivsize); | ||
286 | authenc_chain(cipher, src, vsrc == iv + ivsize); | ||
287 | |||
288 | return crypto_authenc_verify(req, cipher, cryptlen + ivsize); | ||
198 | } | 289 | } |
199 | 290 | ||
200 | static int crypto_authenc_decrypt(struct aead_request *req) | 291 | static int crypto_authenc_decrypt(struct aead_request *req) |
@@ -202,17 +293,23 @@ static int crypto_authenc_decrypt(struct aead_request *req) | |||
202 | struct crypto_aead *authenc = crypto_aead_reqtfm(req); | 293 | struct crypto_aead *authenc = crypto_aead_reqtfm(req); |
203 | struct crypto_authenc_ctx *ctx = crypto_aead_ctx(authenc); | 294 | struct crypto_authenc_ctx *ctx = crypto_aead_ctx(authenc); |
204 | struct ablkcipher_request *abreq = aead_request_ctx(req); | 295 | struct ablkcipher_request *abreq = aead_request_ctx(req); |
296 | unsigned int cryptlen = req->cryptlen; | ||
297 | unsigned int authsize = crypto_aead_authsize(authenc); | ||
298 | u8 *iv = req->iv; | ||
205 | int err; | 299 | int err; |
206 | 300 | ||
207 | err = crypto_authenc_verify(req); | 301 | if (cryptlen < authsize) |
302 | return -EINVAL; | ||
303 | cryptlen -= authsize; | ||
304 | |||
305 | err = crypto_authenc_iverify(req, iv, cryptlen); | ||
208 | if (err) | 306 | if (err) |
209 | return err; | 307 | return err; |
210 | 308 | ||
211 | ablkcipher_request_set_tfm(abreq, ctx->enc); | 309 | ablkcipher_request_set_tfm(abreq, ctx->enc); |
212 | ablkcipher_request_set_callback(abreq, aead_request_flags(req), | 310 | ablkcipher_request_set_callback(abreq, aead_request_flags(req), |
213 | crypto_authenc_decrypt_done, req); | 311 | req->base.complete, req->base.data); |
214 | ablkcipher_request_set_crypt(abreq, req->src, req->dst, req->cryptlen, | 312 | ablkcipher_request_set_crypt(abreq, req->src, req->dst, cryptlen, iv); |
215 | req->iv); | ||
216 | 313 | ||
217 | return crypto_ablkcipher_decrypt(abreq); | 314 | return crypto_ablkcipher_decrypt(abreq); |
218 | } | 315 | } |
@@ -224,19 +321,13 @@ static int crypto_authenc_init_tfm(struct crypto_tfm *tfm) | |||
224 | struct crypto_authenc_ctx *ctx = crypto_tfm_ctx(tfm); | 321 | struct crypto_authenc_ctx *ctx = crypto_tfm_ctx(tfm); |
225 | struct crypto_hash *auth; | 322 | struct crypto_hash *auth; |
226 | struct crypto_ablkcipher *enc; | 323 | struct crypto_ablkcipher *enc; |
227 | unsigned int digestsize; | ||
228 | int err; | 324 | int err; |
229 | 325 | ||
230 | auth = crypto_spawn_hash(&ictx->auth); | 326 | auth = crypto_spawn_hash(&ictx->auth); |
231 | if (IS_ERR(auth)) | 327 | if (IS_ERR(auth)) |
232 | return PTR_ERR(auth); | 328 | return PTR_ERR(auth); |
233 | 329 | ||
234 | err = -EINVAL; | 330 | enc = crypto_spawn_skcipher(&ictx->enc); |
235 | digestsize = crypto_hash_digestsize(auth); | ||
236 | if (ictx->authsize > digestsize) | ||
237 | goto err_free_hash; | ||
238 | |||
239 | enc = crypto_spawn_ablkcipher(&ictx->enc); | ||
240 | err = PTR_ERR(enc); | 331 | err = PTR_ERR(enc); |
241 | if (IS_ERR(enc)) | 332 | if (IS_ERR(enc)) |
242 | goto err_free_hash; | 333 | goto err_free_hash; |
@@ -246,9 +337,10 @@ static int crypto_authenc_init_tfm(struct crypto_tfm *tfm) | |||
246 | tfm->crt_aead.reqsize = max_t(unsigned int, | 337 | tfm->crt_aead.reqsize = max_t(unsigned int, |
247 | (crypto_hash_alignmask(auth) & | 338 | (crypto_hash_alignmask(auth) & |
248 | ~(crypto_tfm_ctx_alignment() - 1)) + | 339 | ~(crypto_tfm_ctx_alignment() - 1)) + |
249 | digestsize * 2, | 340 | crypto_hash_digestsize(auth) * 2, |
250 | sizeof(struct ablkcipher_request) + | 341 | sizeof(struct skcipher_givcrypt_request) + |
251 | crypto_ablkcipher_reqsize(enc)); | 342 | crypto_ablkcipher_reqsize(enc) + |
343 | crypto_ablkcipher_ivsize(enc)); | ||
252 | 344 | ||
253 | spin_lock_init(&ctx->auth_lock); | 345 | spin_lock_init(&ctx->auth_lock); |
254 | 346 | ||
@@ -269,75 +361,74 @@ static void crypto_authenc_exit_tfm(struct crypto_tfm *tfm) | |||
269 | 361 | ||
270 | static struct crypto_instance *crypto_authenc_alloc(struct rtattr **tb) | 362 | static struct crypto_instance *crypto_authenc_alloc(struct rtattr **tb) |
271 | { | 363 | { |
364 | struct crypto_attr_type *algt; | ||
272 | struct crypto_instance *inst; | 365 | struct crypto_instance *inst; |
273 | struct crypto_alg *auth; | 366 | struct crypto_alg *auth; |
274 | struct crypto_alg *enc; | 367 | struct crypto_alg *enc; |
275 | struct authenc_instance_ctx *ctx; | 368 | struct authenc_instance_ctx *ctx; |
276 | unsigned int authsize; | 369 | const char *enc_name; |
277 | unsigned int enckeylen; | ||
278 | int err; | 370 | int err; |
279 | 371 | ||
280 | err = crypto_check_attr_type(tb, CRYPTO_ALG_TYPE_AEAD); | 372 | algt = crypto_get_attr_type(tb); |
281 | if (err) | 373 | err = PTR_ERR(algt); |
374 | if (IS_ERR(algt)) | ||
282 | return ERR_PTR(err); | 375 | return ERR_PTR(err); |
283 | 376 | ||
377 | if ((algt->type ^ CRYPTO_ALG_TYPE_AEAD) & algt->mask) | ||
378 | return ERR_PTR(-EINVAL); | ||
379 | |||
284 | auth = crypto_attr_alg(tb[1], CRYPTO_ALG_TYPE_HASH, | 380 | auth = crypto_attr_alg(tb[1], CRYPTO_ALG_TYPE_HASH, |
285 | CRYPTO_ALG_TYPE_HASH_MASK); | 381 | CRYPTO_ALG_TYPE_HASH_MASK); |
286 | if (IS_ERR(auth)) | 382 | if (IS_ERR(auth)) |
287 | return ERR_PTR(PTR_ERR(auth)); | 383 | return ERR_PTR(PTR_ERR(auth)); |
288 | 384 | ||
289 | err = crypto_attr_u32(tb[2], &authsize); | 385 | enc_name = crypto_attr_alg_name(tb[2]); |
290 | inst = ERR_PTR(err); | 386 | err = PTR_ERR(enc_name); |
291 | if (err) | 387 | if (IS_ERR(enc_name)) |
292 | goto out_put_auth; | ||
293 | |||
294 | enc = crypto_attr_alg(tb[3], CRYPTO_ALG_TYPE_BLKCIPHER, | ||
295 | CRYPTO_ALG_TYPE_MASK); | ||
296 | inst = ERR_PTR(PTR_ERR(enc)); | ||
297 | if (IS_ERR(enc)) | ||
298 | goto out_put_auth; | 388 | goto out_put_auth; |
299 | 389 | ||
300 | err = crypto_attr_u32(tb[4], &enckeylen); | ||
301 | if (err) | ||
302 | goto out_put_enc; | ||
303 | |||
304 | inst = kzalloc(sizeof(*inst) + sizeof(*ctx), GFP_KERNEL); | 390 | inst = kzalloc(sizeof(*inst) + sizeof(*ctx), GFP_KERNEL); |
305 | err = -ENOMEM; | 391 | err = -ENOMEM; |
306 | if (!inst) | 392 | if (!inst) |
307 | goto out_put_enc; | 393 | goto out_put_auth; |
308 | |||
309 | err = -ENAMETOOLONG; | ||
310 | if (snprintf(inst->alg.cra_name, CRYPTO_MAX_ALG_NAME, | ||
311 | "authenc(%s,%u,%s,%u)", auth->cra_name, authsize, | ||
312 | enc->cra_name, enckeylen) >= CRYPTO_MAX_ALG_NAME) | ||
313 | goto err_free_inst; | ||
314 | |||
315 | if (snprintf(inst->alg.cra_driver_name, CRYPTO_MAX_ALG_NAME, | ||
316 | "authenc(%s,%u,%s,%u)", auth->cra_driver_name, | ||
317 | authsize, enc->cra_driver_name, enckeylen) >= | ||
318 | CRYPTO_MAX_ALG_NAME) | ||
319 | goto err_free_inst; | ||
320 | 394 | ||
321 | ctx = crypto_instance_ctx(inst); | 395 | ctx = crypto_instance_ctx(inst); |
322 | ctx->authsize = authsize; | ||
323 | ctx->enckeylen = enckeylen; | ||
324 | 396 | ||
325 | err = crypto_init_spawn(&ctx->auth, auth, inst, CRYPTO_ALG_TYPE_MASK); | 397 | err = crypto_init_spawn(&ctx->auth, auth, inst, CRYPTO_ALG_TYPE_MASK); |
326 | if (err) | 398 | if (err) |
327 | goto err_free_inst; | 399 | goto err_free_inst; |
328 | 400 | ||
329 | err = crypto_init_spawn(&ctx->enc, enc, inst, CRYPTO_ALG_TYPE_MASK); | 401 | crypto_set_skcipher_spawn(&ctx->enc, inst); |
402 | err = crypto_grab_skcipher(&ctx->enc, enc_name, 0, | ||
403 | crypto_requires_sync(algt->type, | ||
404 | algt->mask)); | ||
330 | if (err) | 405 | if (err) |
331 | goto err_drop_auth; | 406 | goto err_drop_auth; |
332 | 407 | ||
333 | inst->alg.cra_flags = CRYPTO_ALG_TYPE_AEAD | CRYPTO_ALG_ASYNC; | 408 | enc = crypto_skcipher_spawn_alg(&ctx->enc); |
409 | |||
410 | err = -ENAMETOOLONG; | ||
411 | if (snprintf(inst->alg.cra_name, CRYPTO_MAX_ALG_NAME, | ||
412 | "authenc(%s,%s)", auth->cra_name, enc->cra_name) >= | ||
413 | CRYPTO_MAX_ALG_NAME) | ||
414 | goto err_drop_enc; | ||
415 | |||
416 | if (snprintf(inst->alg.cra_driver_name, CRYPTO_MAX_ALG_NAME, | ||
417 | "authenc(%s,%s)", auth->cra_driver_name, | ||
418 | enc->cra_driver_name) >= CRYPTO_MAX_ALG_NAME) | ||
419 | goto err_drop_enc; | ||
420 | |||
421 | inst->alg.cra_flags = CRYPTO_ALG_TYPE_AEAD; | ||
422 | inst->alg.cra_flags |= enc->cra_flags & CRYPTO_ALG_ASYNC; | ||
334 | inst->alg.cra_priority = enc->cra_priority * 10 + auth->cra_priority; | 423 | inst->alg.cra_priority = enc->cra_priority * 10 + auth->cra_priority; |
335 | inst->alg.cra_blocksize = enc->cra_blocksize; | 424 | inst->alg.cra_blocksize = enc->cra_blocksize; |
336 | inst->alg.cra_alignmask = max(auth->cra_alignmask, enc->cra_alignmask); | 425 | inst->alg.cra_alignmask = auth->cra_alignmask | enc->cra_alignmask; |
337 | inst->alg.cra_type = &crypto_aead_type; | 426 | inst->alg.cra_type = &crypto_aead_type; |
338 | 427 | ||
339 | inst->alg.cra_aead.ivsize = enc->cra_blkcipher.ivsize; | 428 | inst->alg.cra_aead.ivsize = enc->cra_ablkcipher.ivsize; |
340 | inst->alg.cra_aead.authsize = authsize; | 429 | inst->alg.cra_aead.maxauthsize = auth->cra_type == &crypto_hash_type ? |
430 | auth->cra_hash.digestsize : | ||
431 | auth->cra_digest.dia_digestsize; | ||
341 | 432 | ||
342 | inst->alg.cra_ctxsize = sizeof(struct crypto_authenc_ctx); | 433 | inst->alg.cra_ctxsize = sizeof(struct crypto_authenc_ctx); |
343 | 434 | ||
@@ -347,18 +438,19 @@ static struct crypto_instance *crypto_authenc_alloc(struct rtattr **tb) | |||
347 | inst->alg.cra_aead.setkey = crypto_authenc_setkey; | 438 | inst->alg.cra_aead.setkey = crypto_authenc_setkey; |
348 | inst->alg.cra_aead.encrypt = crypto_authenc_encrypt; | 439 | inst->alg.cra_aead.encrypt = crypto_authenc_encrypt; |
349 | inst->alg.cra_aead.decrypt = crypto_authenc_decrypt; | 440 | inst->alg.cra_aead.decrypt = crypto_authenc_decrypt; |
441 | inst->alg.cra_aead.givencrypt = crypto_authenc_givencrypt; | ||
350 | 442 | ||
351 | out: | 443 | out: |
352 | crypto_mod_put(enc); | ||
353 | out_put_auth: | ||
354 | crypto_mod_put(auth); | 444 | crypto_mod_put(auth); |
355 | return inst; | 445 | return inst; |
356 | 446 | ||
447 | err_drop_enc: | ||
448 | crypto_drop_skcipher(&ctx->enc); | ||
357 | err_drop_auth: | 449 | err_drop_auth: |
358 | crypto_drop_spawn(&ctx->auth); | 450 | crypto_drop_spawn(&ctx->auth); |
359 | err_free_inst: | 451 | err_free_inst: |
360 | kfree(inst); | 452 | kfree(inst); |
361 | out_put_enc: | 453 | out_put_auth: |
362 | inst = ERR_PTR(err); | 454 | inst = ERR_PTR(err); |
363 | goto out; | 455 | goto out; |
364 | } | 456 | } |
@@ -367,7 +459,7 @@ static void crypto_authenc_free(struct crypto_instance *inst) | |||
367 | { | 459 | { |
368 | struct authenc_instance_ctx *ctx = crypto_instance_ctx(inst); | 460 | struct authenc_instance_ctx *ctx = crypto_instance_ctx(inst); |
369 | 461 | ||
370 | crypto_drop_spawn(&ctx->enc); | 462 | crypto_drop_skcipher(&ctx->enc); |
371 | crypto_drop_spawn(&ctx->auth); | 463 | crypto_drop_spawn(&ctx->auth); |
372 | kfree(inst); | 464 | kfree(inst); |
373 | } | 465 | } |
diff --git a/crypto/blkcipher.c b/crypto/blkcipher.c index f6c67f9d4e5c..4a7e65c4df4d 100644 --- a/crypto/blkcipher.c +++ b/crypto/blkcipher.c | |||
@@ -14,7 +14,8 @@ | |||
14 | * | 14 | * |
15 | */ | 15 | */ |
16 | 16 | ||
17 | #include <linux/crypto.h> | 17 | #include <crypto/internal/skcipher.h> |
18 | #include <crypto/scatterwalk.h> | ||
18 | #include <linux/errno.h> | 19 | #include <linux/errno.h> |
19 | #include <linux/hardirq.h> | 20 | #include <linux/hardirq.h> |
20 | #include <linux/kernel.h> | 21 | #include <linux/kernel.h> |
@@ -25,7 +26,6 @@ | |||
25 | #include <linux/string.h> | 26 | #include <linux/string.h> |
26 | 27 | ||
27 | #include "internal.h" | 28 | #include "internal.h" |
28 | #include "scatterwalk.h" | ||
29 | 29 | ||
30 | enum { | 30 | enum { |
31 | BLKCIPHER_WALK_PHYS = 1 << 0, | 31 | BLKCIPHER_WALK_PHYS = 1 << 0, |
@@ -433,9 +433,8 @@ static unsigned int crypto_blkcipher_ctxsize(struct crypto_alg *alg, u32 type, | |||
433 | struct blkcipher_alg *cipher = &alg->cra_blkcipher; | 433 | struct blkcipher_alg *cipher = &alg->cra_blkcipher; |
434 | unsigned int len = alg->cra_ctxsize; | 434 | unsigned int len = alg->cra_ctxsize; |
435 | 435 | ||
436 | type ^= CRYPTO_ALG_ASYNC; | 436 | if ((mask & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_MASK && |
437 | mask &= CRYPTO_ALG_ASYNC; | 437 | cipher->ivsize) { |
438 | if ((type & mask) && cipher->ivsize) { | ||
439 | len = ALIGN(len, (unsigned long)alg->cra_alignmask + 1); | 438 | len = ALIGN(len, (unsigned long)alg->cra_alignmask + 1); |
440 | len += cipher->ivsize; | 439 | len += cipher->ivsize; |
441 | } | 440 | } |
@@ -451,6 +450,11 @@ static int crypto_init_blkcipher_ops_async(struct crypto_tfm *tfm) | |||
451 | crt->setkey = async_setkey; | 450 | crt->setkey = async_setkey; |
452 | crt->encrypt = async_encrypt; | 451 | crt->encrypt = async_encrypt; |
453 | crt->decrypt = async_decrypt; | 452 | crt->decrypt = async_decrypt; |
453 | if (!alg->ivsize) { | ||
454 | crt->givencrypt = skcipher_null_givencrypt; | ||
455 | crt->givdecrypt = skcipher_null_givdecrypt; | ||
456 | } | ||
457 | crt->base = __crypto_ablkcipher_cast(tfm); | ||
454 | crt->ivsize = alg->ivsize; | 458 | crt->ivsize = alg->ivsize; |
455 | 459 | ||
456 | return 0; | 460 | return 0; |
@@ -482,9 +486,7 @@ static int crypto_init_blkcipher_ops(struct crypto_tfm *tfm, u32 type, u32 mask) | |||
482 | if (alg->ivsize > PAGE_SIZE / 8) | 486 | if (alg->ivsize > PAGE_SIZE / 8) |
483 | return -EINVAL; | 487 | return -EINVAL; |
484 | 488 | ||
485 | type ^= CRYPTO_ALG_ASYNC; | 489 | if ((mask & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_MASK) |
486 | mask &= CRYPTO_ALG_ASYNC; | ||
487 | if (type & mask) | ||
488 | return crypto_init_blkcipher_ops_sync(tfm); | 490 | return crypto_init_blkcipher_ops_sync(tfm); |
489 | else | 491 | else |
490 | return crypto_init_blkcipher_ops_async(tfm); | 492 | return crypto_init_blkcipher_ops_async(tfm); |
@@ -499,6 +501,8 @@ static void crypto_blkcipher_show(struct seq_file *m, struct crypto_alg *alg) | |||
499 | seq_printf(m, "min keysize : %u\n", alg->cra_blkcipher.min_keysize); | 501 | seq_printf(m, "min keysize : %u\n", alg->cra_blkcipher.min_keysize); |
500 | seq_printf(m, "max keysize : %u\n", alg->cra_blkcipher.max_keysize); | 502 | seq_printf(m, "max keysize : %u\n", alg->cra_blkcipher.max_keysize); |
501 | seq_printf(m, "ivsize : %u\n", alg->cra_blkcipher.ivsize); | 503 | seq_printf(m, "ivsize : %u\n", alg->cra_blkcipher.ivsize); |
504 | seq_printf(m, "geniv : %s\n", alg->cra_blkcipher.geniv ?: | ||
505 | "<default>"); | ||
502 | } | 506 | } |
503 | 507 | ||
504 | const struct crypto_type crypto_blkcipher_type = { | 508 | const struct crypto_type crypto_blkcipher_type = { |
@@ -510,5 +514,187 @@ const struct crypto_type crypto_blkcipher_type = { | |||
510 | }; | 514 | }; |
511 | EXPORT_SYMBOL_GPL(crypto_blkcipher_type); | 515 | EXPORT_SYMBOL_GPL(crypto_blkcipher_type); |
512 | 516 | ||
517 | static int crypto_grab_nivcipher(struct crypto_skcipher_spawn *spawn, | ||
518 | const char *name, u32 type, u32 mask) | ||
519 | { | ||
520 | struct crypto_alg *alg; | ||
521 | int err; | ||
522 | |||
523 | type = crypto_skcipher_type(type); | ||
524 | mask = crypto_skcipher_mask(mask) | CRYPTO_ALG_GENIV; | ||
525 | |||
526 | alg = crypto_alg_mod_lookup(name, type, mask); | ||
527 | if (IS_ERR(alg)) | ||
528 | return PTR_ERR(alg); | ||
529 | |||
530 | err = crypto_init_spawn(&spawn->base, alg, spawn->base.inst, mask); | ||
531 | crypto_mod_put(alg); | ||
532 | return err; | ||
533 | } | ||
534 | |||
535 | struct crypto_instance *skcipher_geniv_alloc(struct crypto_template *tmpl, | ||
536 | struct rtattr **tb, u32 type, | ||
537 | u32 mask) | ||
538 | { | ||
539 | struct { | ||
540 | int (*setkey)(struct crypto_ablkcipher *tfm, const u8 *key, | ||
541 | unsigned int keylen); | ||
542 | int (*encrypt)(struct ablkcipher_request *req); | ||
543 | int (*decrypt)(struct ablkcipher_request *req); | ||
544 | |||
545 | unsigned int min_keysize; | ||
546 | unsigned int max_keysize; | ||
547 | unsigned int ivsize; | ||
548 | |||
549 | const char *geniv; | ||
550 | } balg; | ||
551 | const char *name; | ||
552 | struct crypto_skcipher_spawn *spawn; | ||
553 | struct crypto_attr_type *algt; | ||
554 | struct crypto_instance *inst; | ||
555 | struct crypto_alg *alg; | ||
556 | int err; | ||
557 | |||
558 | algt = crypto_get_attr_type(tb); | ||
559 | err = PTR_ERR(algt); | ||
560 | if (IS_ERR(algt)) | ||
561 | return ERR_PTR(err); | ||
562 | |||
563 | if ((algt->type ^ (CRYPTO_ALG_TYPE_GIVCIPHER | CRYPTO_ALG_GENIV)) & | ||
564 | algt->mask) | ||
565 | return ERR_PTR(-EINVAL); | ||
566 | |||
567 | name = crypto_attr_alg_name(tb[1]); | ||
568 | err = PTR_ERR(name); | ||
569 | if (IS_ERR(name)) | ||
570 | return ERR_PTR(err); | ||
571 | |||
572 | inst = kzalloc(sizeof(*inst) + sizeof(*spawn), GFP_KERNEL); | ||
573 | if (!inst) | ||
574 | return ERR_PTR(-ENOMEM); | ||
575 | |||
576 | spawn = crypto_instance_ctx(inst); | ||
577 | |||
578 | /* Ignore async algorithms if necessary. */ | ||
579 | mask |= crypto_requires_sync(algt->type, algt->mask); | ||
580 | |||
581 | crypto_set_skcipher_spawn(spawn, inst); | ||
582 | err = crypto_grab_nivcipher(spawn, name, type, mask); | ||
583 | if (err) | ||
584 | goto err_free_inst; | ||
585 | |||
586 | alg = crypto_skcipher_spawn_alg(spawn); | ||
587 | |||
588 | if ((alg->cra_flags & CRYPTO_ALG_TYPE_MASK) == | ||
589 | CRYPTO_ALG_TYPE_BLKCIPHER) { | ||
590 | balg.ivsize = alg->cra_blkcipher.ivsize; | ||
591 | balg.min_keysize = alg->cra_blkcipher.min_keysize; | ||
592 | balg.max_keysize = alg->cra_blkcipher.max_keysize; | ||
593 | |||
594 | balg.setkey = async_setkey; | ||
595 | balg.encrypt = async_encrypt; | ||
596 | balg.decrypt = async_decrypt; | ||
597 | |||
598 | balg.geniv = alg->cra_blkcipher.geniv; | ||
599 | } else { | ||
600 | balg.ivsize = alg->cra_ablkcipher.ivsize; | ||
601 | balg.min_keysize = alg->cra_ablkcipher.min_keysize; | ||
602 | balg.max_keysize = alg->cra_ablkcipher.max_keysize; | ||
603 | |||
604 | balg.setkey = alg->cra_ablkcipher.setkey; | ||
605 | balg.encrypt = alg->cra_ablkcipher.encrypt; | ||
606 | balg.decrypt = alg->cra_ablkcipher.decrypt; | ||
607 | |||
608 | balg.geniv = alg->cra_ablkcipher.geniv; | ||
609 | } | ||
610 | |||
611 | err = -EINVAL; | ||
612 | if (!balg.ivsize) | ||
613 | goto err_drop_alg; | ||
614 | |||
615 | /* | ||
616 | * This is only true if we're constructing an algorithm with its | ||
617 | * default IV generator. For the default generator we elide the | ||
618 | * template name and double-check the IV generator. | ||
619 | */ | ||
620 | if (algt->mask & CRYPTO_ALG_GENIV) { | ||
621 | if (!balg.geniv) | ||
622 | balg.geniv = crypto_default_geniv(alg); | ||
623 | err = -EAGAIN; | ||
624 | if (strcmp(tmpl->name, balg.geniv)) | ||
625 | goto err_drop_alg; | ||
626 | |||
627 | memcpy(inst->alg.cra_name, alg->cra_name, CRYPTO_MAX_ALG_NAME); | ||
628 | memcpy(inst->alg.cra_driver_name, alg->cra_driver_name, | ||
629 | CRYPTO_MAX_ALG_NAME); | ||
630 | } else { | ||
631 | err = -ENAMETOOLONG; | ||
632 | if (snprintf(inst->alg.cra_name, CRYPTO_MAX_ALG_NAME, | ||
633 | "%s(%s)", tmpl->name, alg->cra_name) >= | ||
634 | CRYPTO_MAX_ALG_NAME) | ||
635 | goto err_drop_alg; | ||
636 | if (snprintf(inst->alg.cra_driver_name, CRYPTO_MAX_ALG_NAME, | ||
637 | "%s(%s)", tmpl->name, alg->cra_driver_name) >= | ||
638 | CRYPTO_MAX_ALG_NAME) | ||
639 | goto err_drop_alg; | ||
640 | } | ||
641 | |||
642 | inst->alg.cra_flags = CRYPTO_ALG_TYPE_GIVCIPHER | CRYPTO_ALG_GENIV; | ||
643 | inst->alg.cra_flags |= alg->cra_flags & CRYPTO_ALG_ASYNC; | ||
644 | inst->alg.cra_priority = alg->cra_priority; | ||
645 | inst->alg.cra_blocksize = alg->cra_blocksize; | ||
646 | inst->alg.cra_alignmask = alg->cra_alignmask; | ||
647 | inst->alg.cra_type = &crypto_givcipher_type; | ||
648 | |||
649 | inst->alg.cra_ablkcipher.ivsize = balg.ivsize; | ||
650 | inst->alg.cra_ablkcipher.min_keysize = balg.min_keysize; | ||
651 | inst->alg.cra_ablkcipher.max_keysize = balg.max_keysize; | ||
652 | inst->alg.cra_ablkcipher.geniv = balg.geniv; | ||
653 | |||
654 | inst->alg.cra_ablkcipher.setkey = balg.setkey; | ||
655 | inst->alg.cra_ablkcipher.encrypt = balg.encrypt; | ||
656 | inst->alg.cra_ablkcipher.decrypt = balg.decrypt; | ||
657 | |||
658 | out: | ||
659 | return inst; | ||
660 | |||
661 | err_drop_alg: | ||
662 | crypto_drop_skcipher(spawn); | ||
663 | err_free_inst: | ||
664 | kfree(inst); | ||
665 | inst = ERR_PTR(err); | ||
666 | goto out; | ||
667 | } | ||
668 | EXPORT_SYMBOL_GPL(skcipher_geniv_alloc); | ||
669 | |||
670 | void skcipher_geniv_free(struct crypto_instance *inst) | ||
671 | { | ||
672 | crypto_drop_skcipher(crypto_instance_ctx(inst)); | ||
673 | kfree(inst); | ||
674 | } | ||
675 | EXPORT_SYMBOL_GPL(skcipher_geniv_free); | ||
676 | |||
677 | int skcipher_geniv_init(struct crypto_tfm *tfm) | ||
678 | { | ||
679 | struct crypto_instance *inst = (void *)tfm->__crt_alg; | ||
680 | struct crypto_ablkcipher *cipher; | ||
681 | |||
682 | cipher = crypto_spawn_skcipher(crypto_instance_ctx(inst)); | ||
683 | if (IS_ERR(cipher)) | ||
684 | return PTR_ERR(cipher); | ||
685 | |||
686 | tfm->crt_ablkcipher.base = cipher; | ||
687 | tfm->crt_ablkcipher.reqsize += crypto_ablkcipher_reqsize(cipher); | ||
688 | |||
689 | return 0; | ||
690 | } | ||
691 | EXPORT_SYMBOL_GPL(skcipher_geniv_init); | ||
692 | |||
693 | void skcipher_geniv_exit(struct crypto_tfm *tfm) | ||
694 | { | ||
695 | crypto_free_ablkcipher(tfm->crt_ablkcipher.base); | ||
696 | } | ||
697 | EXPORT_SYMBOL_GPL(skcipher_geniv_exit); | ||
698 | |||
513 | MODULE_LICENSE("GPL"); | 699 | MODULE_LICENSE("GPL"); |
514 | MODULE_DESCRIPTION("Generic block chaining cipher type"); | 700 | MODULE_DESCRIPTION("Generic block chaining cipher type"); |
diff --git a/crypto/camellia.c b/crypto/camellia.c index 6877ecfd90bb..493fee7e0a8b 100644 --- a/crypto/camellia.c +++ b/crypto/camellia.c | |||
@@ -36,176 +36,6 @@ | |||
36 | #include <linux/kernel.h> | 36 | #include <linux/kernel.h> |
37 | #include <linux/module.h> | 37 | #include <linux/module.h> |
38 | 38 | ||
39 | |||
40 | #define CAMELLIA_MIN_KEY_SIZE 16 | ||
41 | #define CAMELLIA_MAX_KEY_SIZE 32 | ||
42 | #define CAMELLIA_BLOCK_SIZE 16 | ||
43 | #define CAMELLIA_TABLE_BYTE_LEN 272 | ||
44 | #define CAMELLIA_TABLE_WORD_LEN (CAMELLIA_TABLE_BYTE_LEN / 4) | ||
45 | |||
46 | typedef u32 KEY_TABLE_TYPE[CAMELLIA_TABLE_WORD_LEN]; | ||
47 | |||
48 | |||
49 | /* key constants */ | ||
50 | |||
51 | #define CAMELLIA_SIGMA1L (0xA09E667FL) | ||
52 | #define CAMELLIA_SIGMA1R (0x3BCC908BL) | ||
53 | #define CAMELLIA_SIGMA2L (0xB67AE858L) | ||
54 | #define CAMELLIA_SIGMA2R (0x4CAA73B2L) | ||
55 | #define CAMELLIA_SIGMA3L (0xC6EF372FL) | ||
56 | #define CAMELLIA_SIGMA3R (0xE94F82BEL) | ||
57 | #define CAMELLIA_SIGMA4L (0x54FF53A5L) | ||
58 | #define CAMELLIA_SIGMA4R (0xF1D36F1CL) | ||
59 | #define CAMELLIA_SIGMA5L (0x10E527FAL) | ||
60 | #define CAMELLIA_SIGMA5R (0xDE682D1DL) | ||
61 | #define CAMELLIA_SIGMA6L (0xB05688C2L) | ||
62 | #define CAMELLIA_SIGMA6R (0xB3E6C1FDL) | ||
63 | |||
64 | struct camellia_ctx { | ||
65 | int key_length; | ||
66 | KEY_TABLE_TYPE key_table; | ||
67 | }; | ||
68 | |||
69 | |||
70 | /* | ||
71 | * macros | ||
72 | */ | ||
73 | |||
74 | |||
75 | # define GETU32(pt) (((u32)(pt)[0] << 24) \ | ||
76 | ^ ((u32)(pt)[1] << 16) \ | ||
77 | ^ ((u32)(pt)[2] << 8) \ | ||
78 | ^ ((u32)(pt)[3])) | ||
79 | |||
80 | #define COPY4WORD(dst, src) \ | ||
81 | do { \ | ||
82 | (dst)[0]=(src)[0]; \ | ||
83 | (dst)[1]=(src)[1]; \ | ||
84 | (dst)[2]=(src)[2]; \ | ||
85 | (dst)[3]=(src)[3]; \ | ||
86 | }while(0) | ||
87 | |||
88 | #define SWAP4WORD(word) \ | ||
89 | do { \ | ||
90 | CAMELLIA_SWAP4((word)[0]); \ | ||
91 | CAMELLIA_SWAP4((word)[1]); \ | ||
92 | CAMELLIA_SWAP4((word)[2]); \ | ||
93 | CAMELLIA_SWAP4((word)[3]); \ | ||
94 | }while(0) | ||
95 | |||
96 | #define XOR4WORD(a, b)/* a = a ^ b */ \ | ||
97 | do { \ | ||
98 | (a)[0]^=(b)[0]; \ | ||
99 | (a)[1]^=(b)[1]; \ | ||
100 | (a)[2]^=(b)[2]; \ | ||
101 | (a)[3]^=(b)[3]; \ | ||
102 | }while(0) | ||
103 | |||
104 | #define XOR4WORD2(a, b, c)/* a = b ^ c */ \ | ||
105 | do { \ | ||
106 | (a)[0]=(b)[0]^(c)[0]; \ | ||
107 | (a)[1]=(b)[1]^(c)[1]; \ | ||
108 | (a)[2]=(b)[2]^(c)[2]; \ | ||
109 | (a)[3]=(b)[3]^(c)[3]; \ | ||
110 | }while(0) | ||
111 | |||
112 | #define CAMELLIA_SUBKEY_L(INDEX) (subkey[(INDEX)*2]) | ||
113 | #define CAMELLIA_SUBKEY_R(INDEX) (subkey[(INDEX)*2 + 1]) | ||
114 | |||
115 | /* rotation right shift 1byte */ | ||
116 | #define CAMELLIA_RR8(x) (((x) >> 8) + ((x) << 24)) | ||
117 | /* rotation left shift 1bit */ | ||
118 | #define CAMELLIA_RL1(x) (((x) << 1) + ((x) >> 31)) | ||
119 | /* rotation left shift 1byte */ | ||
120 | #define CAMELLIA_RL8(x) (((x) << 8) + ((x) >> 24)) | ||
121 | |||
122 | #define CAMELLIA_ROLDQ(ll, lr, rl, rr, w0, w1, bits) \ | ||
123 | do { \ | ||
124 | w0 = ll; \ | ||
125 | ll = (ll << bits) + (lr >> (32 - bits)); \ | ||
126 | lr = (lr << bits) + (rl >> (32 - bits)); \ | ||
127 | rl = (rl << bits) + (rr >> (32 - bits)); \ | ||
128 | rr = (rr << bits) + (w0 >> (32 - bits)); \ | ||
129 | } while(0) | ||
130 | |||
131 | #define CAMELLIA_ROLDQo32(ll, lr, rl, rr, w0, w1, bits) \ | ||
132 | do { \ | ||
133 | w0 = ll; \ | ||
134 | w1 = lr; \ | ||
135 | ll = (lr << (bits - 32)) + (rl >> (64 - bits)); \ | ||
136 | lr = (rl << (bits - 32)) + (rr >> (64 - bits)); \ | ||
137 | rl = (rr << (bits - 32)) + (w0 >> (64 - bits)); \ | ||
138 | rr = (w0 << (bits - 32)) + (w1 >> (64 - bits)); \ | ||
139 | } while(0) | ||
140 | |||
141 | #define CAMELLIA_SP1110(INDEX) (camellia_sp1110[(INDEX)]) | ||
142 | #define CAMELLIA_SP0222(INDEX) (camellia_sp0222[(INDEX)]) | ||
143 | #define CAMELLIA_SP3033(INDEX) (camellia_sp3033[(INDEX)]) | ||
144 | #define CAMELLIA_SP4404(INDEX) (camellia_sp4404[(INDEX)]) | ||
145 | |||
146 | #define CAMELLIA_F(xl, xr, kl, kr, yl, yr, il, ir, t0, t1) \ | ||
147 | do { \ | ||
148 | il = xl ^ kl; \ | ||
149 | ir = xr ^ kr; \ | ||
150 | t0 = il >> 16; \ | ||
151 | t1 = ir >> 16; \ | ||
152 | yl = CAMELLIA_SP1110(ir & 0xff) \ | ||
153 | ^ CAMELLIA_SP0222((t1 >> 8) & 0xff) \ | ||
154 | ^ CAMELLIA_SP3033(t1 & 0xff) \ | ||
155 | ^ CAMELLIA_SP4404((ir >> 8) & 0xff); \ | ||
156 | yr = CAMELLIA_SP1110((t0 >> 8) & 0xff) \ | ||
157 | ^ CAMELLIA_SP0222(t0 & 0xff) \ | ||
158 | ^ CAMELLIA_SP3033((il >> 8) & 0xff) \ | ||
159 | ^ CAMELLIA_SP4404(il & 0xff); \ | ||
160 | yl ^= yr; \ | ||
161 | yr = CAMELLIA_RR8(yr); \ | ||
162 | yr ^= yl; \ | ||
163 | } while(0) | ||
164 | |||
165 | |||
166 | /* | ||
167 | * for speed up | ||
168 | * | ||
169 | */ | ||
170 | #define CAMELLIA_FLS(ll, lr, rl, rr, kll, klr, krl, krr, t0, t1, t2, t3) \ | ||
171 | do { \ | ||
172 | t0 = kll; \ | ||
173 | t2 = krr; \ | ||
174 | t0 &= ll; \ | ||
175 | t2 |= rr; \ | ||
176 | rl ^= t2; \ | ||
177 | lr ^= CAMELLIA_RL1(t0); \ | ||
178 | t3 = krl; \ | ||
179 | t1 = klr; \ | ||
180 | t3 &= rl; \ | ||
181 | t1 |= lr; \ | ||
182 | ll ^= t1; \ | ||
183 | rr ^= CAMELLIA_RL1(t3); \ | ||
184 | } while(0) | ||
185 | |||
186 | #define CAMELLIA_ROUNDSM(xl, xr, kl, kr, yl, yr, il, ir, t0, t1) \ | ||
187 | do { \ | ||
188 | ir = CAMELLIA_SP1110(xr & 0xff); \ | ||
189 | il = CAMELLIA_SP1110((xl>>24) & 0xff); \ | ||
190 | ir ^= CAMELLIA_SP0222((xr>>24) & 0xff); \ | ||
191 | il ^= CAMELLIA_SP0222((xl>>16) & 0xff); \ | ||
192 | ir ^= CAMELLIA_SP3033((xr>>16) & 0xff); \ | ||
193 | il ^= CAMELLIA_SP3033((xl>>8) & 0xff); \ | ||
194 | ir ^= CAMELLIA_SP4404((xr>>8) & 0xff); \ | ||
195 | il ^= CAMELLIA_SP4404(xl & 0xff); \ | ||
196 | il ^= kl; \ | ||
197 | ir ^= il ^ kr; \ | ||
198 | yl ^= ir; \ | ||
199 | yr ^= CAMELLIA_RR8(il) ^ ir; \ | ||
200 | } while(0) | ||
201 | |||
202 | /** | ||
203 | * Stuff related to the Camellia key schedule | ||
204 | */ | ||
205 | #define SUBL(x) subL[(x)] | ||
206 | #define SUBR(x) subR[(x)] | ||
207 | |||
208 | |||
209 | static const u32 camellia_sp1110[256] = { | 39 | static const u32 camellia_sp1110[256] = { |
210 | 0x70707000,0x82828200,0x2c2c2c00,0xececec00, | 40 | 0x70707000,0x82828200,0x2c2c2c00,0xececec00, |
211 | 0xb3b3b300,0x27272700,0xc0c0c000,0xe5e5e500, | 41 | 0xb3b3b300,0x27272700,0xc0c0c000,0xe5e5e500, |
@@ -475,67 +305,348 @@ static const u32 camellia_sp4404[256] = { | |||
475 | }; | 305 | }; |
476 | 306 | ||
477 | 307 | ||
308 | #define CAMELLIA_MIN_KEY_SIZE 16 | ||
309 | #define CAMELLIA_MAX_KEY_SIZE 32 | ||
310 | #define CAMELLIA_BLOCK_SIZE 16 | ||
311 | #define CAMELLIA_TABLE_BYTE_LEN 272 | ||
312 | |||
313 | /* | ||
314 | * NB: L and R below stand for 'left' and 'right' as in written numbers. | ||
315 | * That is, in (xxxL,xxxR) pair xxxL holds most significant digits, | ||
316 | * _not_ least significant ones! | ||
317 | */ | ||
318 | |||
319 | |||
320 | /* key constants */ | ||
321 | |||
322 | #define CAMELLIA_SIGMA1L (0xA09E667FL) | ||
323 | #define CAMELLIA_SIGMA1R (0x3BCC908BL) | ||
324 | #define CAMELLIA_SIGMA2L (0xB67AE858L) | ||
325 | #define CAMELLIA_SIGMA2R (0x4CAA73B2L) | ||
326 | #define CAMELLIA_SIGMA3L (0xC6EF372FL) | ||
327 | #define CAMELLIA_SIGMA3R (0xE94F82BEL) | ||
328 | #define CAMELLIA_SIGMA4L (0x54FF53A5L) | ||
329 | #define CAMELLIA_SIGMA4R (0xF1D36F1CL) | ||
330 | #define CAMELLIA_SIGMA5L (0x10E527FAL) | ||
331 | #define CAMELLIA_SIGMA5R (0xDE682D1DL) | ||
332 | #define CAMELLIA_SIGMA6L (0xB05688C2L) | ||
333 | #define CAMELLIA_SIGMA6R (0xB3E6C1FDL) | ||
334 | |||
335 | /* | ||
336 | * macros | ||
337 | */ | ||
338 | #define GETU32(v, pt) \ | ||
339 | do { \ | ||
340 | /* latest breed of gcc is clever enough to use move */ \ | ||
341 | memcpy(&(v), (pt), 4); \ | ||
342 | (v) = be32_to_cpu(v); \ | ||
343 | } while(0) | ||
344 | |||
345 | /* rotation right shift 1byte */ | ||
346 | #define ROR8(x) (((x) >> 8) + ((x) << 24)) | ||
347 | /* rotation left shift 1bit */ | ||
348 | #define ROL1(x) (((x) << 1) + ((x) >> 31)) | ||
349 | /* rotation left shift 1byte */ | ||
350 | #define ROL8(x) (((x) << 8) + ((x) >> 24)) | ||
351 | |||
352 | #define ROLDQ(ll, lr, rl, rr, w0, w1, bits) \ | ||
353 | do { \ | ||
354 | w0 = ll; \ | ||
355 | ll = (ll << bits) + (lr >> (32 - bits)); \ | ||
356 | lr = (lr << bits) + (rl >> (32 - bits)); \ | ||
357 | rl = (rl << bits) + (rr >> (32 - bits)); \ | ||
358 | rr = (rr << bits) + (w0 >> (32 - bits)); \ | ||
359 | } while(0) | ||
360 | |||
361 | #define ROLDQo32(ll, lr, rl, rr, w0, w1, bits) \ | ||
362 | do { \ | ||
363 | w0 = ll; \ | ||
364 | w1 = lr; \ | ||
365 | ll = (lr << (bits - 32)) + (rl >> (64 - bits)); \ | ||
366 | lr = (rl << (bits - 32)) + (rr >> (64 - bits)); \ | ||
367 | rl = (rr << (bits - 32)) + (w0 >> (64 - bits)); \ | ||
368 | rr = (w0 << (bits - 32)) + (w1 >> (64 - bits)); \ | ||
369 | } while(0) | ||
370 | |||
371 | #define CAMELLIA_F(xl, xr, kl, kr, yl, yr, il, ir, t0, t1) \ | ||
372 | do { \ | ||
373 | il = xl ^ kl; \ | ||
374 | ir = xr ^ kr; \ | ||
375 | t0 = il >> 16; \ | ||
376 | t1 = ir >> 16; \ | ||
377 | yl = camellia_sp1110[(u8)(ir )] \ | ||
378 | ^ camellia_sp0222[ (t1 >> 8)] \ | ||
379 | ^ camellia_sp3033[(u8)(t1 )] \ | ||
380 | ^ camellia_sp4404[(u8)(ir >> 8)]; \ | ||
381 | yr = camellia_sp1110[ (t0 >> 8)] \ | ||
382 | ^ camellia_sp0222[(u8)(t0 )] \ | ||
383 | ^ camellia_sp3033[(u8)(il >> 8)] \ | ||
384 | ^ camellia_sp4404[(u8)(il )]; \ | ||
385 | yl ^= yr; \ | ||
386 | yr = ROR8(yr); \ | ||
387 | yr ^= yl; \ | ||
388 | } while(0) | ||
389 | |||
390 | #define SUBKEY_L(INDEX) (subkey[(INDEX)*2]) | ||
391 | #define SUBKEY_R(INDEX) (subkey[(INDEX)*2 + 1]) | ||
392 | |||
393 | static void camellia_setup_tail(u32 *subkey, u32 *subL, u32 *subR, int max) | ||
394 | { | ||
395 | u32 dw, tl, tr; | ||
396 | u32 kw4l, kw4r; | ||
397 | int i; | ||
398 | |||
399 | /* absorb kw2 to other subkeys */ | ||
400 | /* round 2 */ | ||
401 | subL[3] ^= subL[1]; subR[3] ^= subR[1]; | ||
402 | /* round 4 */ | ||
403 | subL[5] ^= subL[1]; subR[5] ^= subR[1]; | ||
404 | /* round 6 */ | ||
405 | subL[7] ^= subL[1]; subR[7] ^= subR[1]; | ||
406 | subL[1] ^= subR[1] & ~subR[9]; | ||
407 | dw = subL[1] & subL[9], | ||
408 | subR[1] ^= ROL1(dw); /* modified for FLinv(kl2) */ | ||
409 | /* round 8 */ | ||
410 | subL[11] ^= subL[1]; subR[11] ^= subR[1]; | ||
411 | /* round 10 */ | ||
412 | subL[13] ^= subL[1]; subR[13] ^= subR[1]; | ||
413 | /* round 12 */ | ||
414 | subL[15] ^= subL[1]; subR[15] ^= subR[1]; | ||
415 | subL[1] ^= subR[1] & ~subR[17]; | ||
416 | dw = subL[1] & subL[17], | ||
417 | subR[1] ^= ROL1(dw); /* modified for FLinv(kl4) */ | ||
418 | /* round 14 */ | ||
419 | subL[19] ^= subL[1]; subR[19] ^= subR[1]; | ||
420 | /* round 16 */ | ||
421 | subL[21] ^= subL[1]; subR[21] ^= subR[1]; | ||
422 | /* round 18 */ | ||
423 | subL[23] ^= subL[1]; subR[23] ^= subR[1]; | ||
424 | if (max == 24) { | ||
425 | /* kw3 */ | ||
426 | subL[24] ^= subL[1]; subR[24] ^= subR[1]; | ||
427 | |||
428 | /* absorb kw4 to other subkeys */ | ||
429 | kw4l = subL[25]; kw4r = subR[25]; | ||
430 | } else { | ||
431 | subL[1] ^= subR[1] & ~subR[25]; | ||
432 | dw = subL[1] & subL[25], | ||
433 | subR[1] ^= ROL1(dw); /* modified for FLinv(kl6) */ | ||
434 | /* round 20 */ | ||
435 | subL[27] ^= subL[1]; subR[27] ^= subR[1]; | ||
436 | /* round 22 */ | ||
437 | subL[29] ^= subL[1]; subR[29] ^= subR[1]; | ||
438 | /* round 24 */ | ||
439 | subL[31] ^= subL[1]; subR[31] ^= subR[1]; | ||
440 | /* kw3 */ | ||
441 | subL[32] ^= subL[1]; subR[32] ^= subR[1]; | ||
442 | |||
443 | /* absorb kw4 to other subkeys */ | ||
444 | kw4l = subL[33]; kw4r = subR[33]; | ||
445 | /* round 23 */ | ||
446 | subL[30] ^= kw4l; subR[30] ^= kw4r; | ||
447 | /* round 21 */ | ||
448 | subL[28] ^= kw4l; subR[28] ^= kw4r; | ||
449 | /* round 19 */ | ||
450 | subL[26] ^= kw4l; subR[26] ^= kw4r; | ||
451 | kw4l ^= kw4r & ~subR[24]; | ||
452 | dw = kw4l & subL[24], | ||
453 | kw4r ^= ROL1(dw); /* modified for FL(kl5) */ | ||
454 | } | ||
455 | /* round 17 */ | ||
456 | subL[22] ^= kw4l; subR[22] ^= kw4r; | ||
457 | /* round 15 */ | ||
458 | subL[20] ^= kw4l; subR[20] ^= kw4r; | ||
459 | /* round 13 */ | ||
460 | subL[18] ^= kw4l; subR[18] ^= kw4r; | ||
461 | kw4l ^= kw4r & ~subR[16]; | ||
462 | dw = kw4l & subL[16], | ||
463 | kw4r ^= ROL1(dw); /* modified for FL(kl3) */ | ||
464 | /* round 11 */ | ||
465 | subL[14] ^= kw4l; subR[14] ^= kw4r; | ||
466 | /* round 9 */ | ||
467 | subL[12] ^= kw4l; subR[12] ^= kw4r; | ||
468 | /* round 7 */ | ||
469 | subL[10] ^= kw4l; subR[10] ^= kw4r; | ||
470 | kw4l ^= kw4r & ~subR[8]; | ||
471 | dw = kw4l & subL[8], | ||
472 | kw4r ^= ROL1(dw); /* modified for FL(kl1) */ | ||
473 | /* round 5 */ | ||
474 | subL[6] ^= kw4l; subR[6] ^= kw4r; | ||
475 | /* round 3 */ | ||
476 | subL[4] ^= kw4l; subR[4] ^= kw4r; | ||
477 | /* round 1 */ | ||
478 | subL[2] ^= kw4l; subR[2] ^= kw4r; | ||
479 | /* kw1 */ | ||
480 | subL[0] ^= kw4l; subR[0] ^= kw4r; | ||
481 | |||
482 | /* key XOR is end of F-function */ | ||
483 | SUBKEY_L(0) = subL[0] ^ subL[2];/* kw1 */ | ||
484 | SUBKEY_R(0) = subR[0] ^ subR[2]; | ||
485 | SUBKEY_L(2) = subL[3]; /* round 1 */ | ||
486 | SUBKEY_R(2) = subR[3]; | ||
487 | SUBKEY_L(3) = subL[2] ^ subL[4]; /* round 2 */ | ||
488 | SUBKEY_R(3) = subR[2] ^ subR[4]; | ||
489 | SUBKEY_L(4) = subL[3] ^ subL[5]; /* round 3 */ | ||
490 | SUBKEY_R(4) = subR[3] ^ subR[5]; | ||
491 | SUBKEY_L(5) = subL[4] ^ subL[6]; /* round 4 */ | ||
492 | SUBKEY_R(5) = subR[4] ^ subR[6]; | ||
493 | SUBKEY_L(6) = subL[5] ^ subL[7]; /* round 5 */ | ||
494 | SUBKEY_R(6) = subR[5] ^ subR[7]; | ||
495 | tl = subL[10] ^ (subR[10] & ~subR[8]); | ||
496 | dw = tl & subL[8], /* FL(kl1) */ | ||
497 | tr = subR[10] ^ ROL1(dw); | ||
498 | SUBKEY_L(7) = subL[6] ^ tl; /* round 6 */ | ||
499 | SUBKEY_R(7) = subR[6] ^ tr; | ||
500 | SUBKEY_L(8) = subL[8]; /* FL(kl1) */ | ||
501 | SUBKEY_R(8) = subR[8]; | ||
502 | SUBKEY_L(9) = subL[9]; /* FLinv(kl2) */ | ||
503 | SUBKEY_R(9) = subR[9]; | ||
504 | tl = subL[7] ^ (subR[7] & ~subR[9]); | ||
505 | dw = tl & subL[9], /* FLinv(kl2) */ | ||
506 | tr = subR[7] ^ ROL1(dw); | ||
507 | SUBKEY_L(10) = tl ^ subL[11]; /* round 7 */ | ||
508 | SUBKEY_R(10) = tr ^ subR[11]; | ||
509 | SUBKEY_L(11) = subL[10] ^ subL[12]; /* round 8 */ | ||
510 | SUBKEY_R(11) = subR[10] ^ subR[12]; | ||
511 | SUBKEY_L(12) = subL[11] ^ subL[13]; /* round 9 */ | ||
512 | SUBKEY_R(12) = subR[11] ^ subR[13]; | ||
513 | SUBKEY_L(13) = subL[12] ^ subL[14]; /* round 10 */ | ||
514 | SUBKEY_R(13) = subR[12] ^ subR[14]; | ||
515 | SUBKEY_L(14) = subL[13] ^ subL[15]; /* round 11 */ | ||
516 | SUBKEY_R(14) = subR[13] ^ subR[15]; | ||
517 | tl = subL[18] ^ (subR[18] & ~subR[16]); | ||
518 | dw = tl & subL[16], /* FL(kl3) */ | ||
519 | tr = subR[18] ^ ROL1(dw); | ||
520 | SUBKEY_L(15) = subL[14] ^ tl; /* round 12 */ | ||
521 | SUBKEY_R(15) = subR[14] ^ tr; | ||
522 | SUBKEY_L(16) = subL[16]; /* FL(kl3) */ | ||
523 | SUBKEY_R(16) = subR[16]; | ||
524 | SUBKEY_L(17) = subL[17]; /* FLinv(kl4) */ | ||
525 | SUBKEY_R(17) = subR[17]; | ||
526 | tl = subL[15] ^ (subR[15] & ~subR[17]); | ||
527 | dw = tl & subL[17], /* FLinv(kl4) */ | ||
528 | tr = subR[15] ^ ROL1(dw); | ||
529 | SUBKEY_L(18) = tl ^ subL[19]; /* round 13 */ | ||
530 | SUBKEY_R(18) = tr ^ subR[19]; | ||
531 | SUBKEY_L(19) = subL[18] ^ subL[20]; /* round 14 */ | ||
532 | SUBKEY_R(19) = subR[18] ^ subR[20]; | ||
533 | SUBKEY_L(20) = subL[19] ^ subL[21]; /* round 15 */ | ||
534 | SUBKEY_R(20) = subR[19] ^ subR[21]; | ||
535 | SUBKEY_L(21) = subL[20] ^ subL[22]; /* round 16 */ | ||
536 | SUBKEY_R(21) = subR[20] ^ subR[22]; | ||
537 | SUBKEY_L(22) = subL[21] ^ subL[23]; /* round 17 */ | ||
538 | SUBKEY_R(22) = subR[21] ^ subR[23]; | ||
539 | if (max == 24) { | ||
540 | SUBKEY_L(23) = subL[22]; /* round 18 */ | ||
541 | SUBKEY_R(23) = subR[22]; | ||
542 | SUBKEY_L(24) = subL[24] ^ subL[23]; /* kw3 */ | ||
543 | SUBKEY_R(24) = subR[24] ^ subR[23]; | ||
544 | } else { | ||
545 | tl = subL[26] ^ (subR[26] & ~subR[24]); | ||
546 | dw = tl & subL[24], /* FL(kl5) */ | ||
547 | tr = subR[26] ^ ROL1(dw); | ||
548 | SUBKEY_L(23) = subL[22] ^ tl; /* round 18 */ | ||
549 | SUBKEY_R(23) = subR[22] ^ tr; | ||
550 | SUBKEY_L(24) = subL[24]; /* FL(kl5) */ | ||
551 | SUBKEY_R(24) = subR[24]; | ||
552 | SUBKEY_L(25) = subL[25]; /* FLinv(kl6) */ | ||
553 | SUBKEY_R(25) = subR[25]; | ||
554 | tl = subL[23] ^ (subR[23] & ~subR[25]); | ||
555 | dw = tl & subL[25], /* FLinv(kl6) */ | ||
556 | tr = subR[23] ^ ROL1(dw); | ||
557 | SUBKEY_L(26) = tl ^ subL[27]; /* round 19 */ | ||
558 | SUBKEY_R(26) = tr ^ subR[27]; | ||
559 | SUBKEY_L(27) = subL[26] ^ subL[28]; /* round 20 */ | ||
560 | SUBKEY_R(27) = subR[26] ^ subR[28]; | ||
561 | SUBKEY_L(28) = subL[27] ^ subL[29]; /* round 21 */ | ||
562 | SUBKEY_R(28) = subR[27] ^ subR[29]; | ||
563 | SUBKEY_L(29) = subL[28] ^ subL[30]; /* round 22 */ | ||
564 | SUBKEY_R(29) = subR[28] ^ subR[30]; | ||
565 | SUBKEY_L(30) = subL[29] ^ subL[31]; /* round 23 */ | ||
566 | SUBKEY_R(30) = subR[29] ^ subR[31]; | ||
567 | SUBKEY_L(31) = subL[30]; /* round 24 */ | ||
568 | SUBKEY_R(31) = subR[30]; | ||
569 | SUBKEY_L(32) = subL[32] ^ subL[31]; /* kw3 */ | ||
570 | SUBKEY_R(32) = subR[32] ^ subR[31]; | ||
571 | } | ||
572 | |||
573 | /* apply the inverse of the last half of P-function */ | ||
574 | i = 2; | ||
575 | do { | ||
576 | dw = SUBKEY_L(i + 0) ^ SUBKEY_R(i + 0); dw = ROL8(dw);/* round 1 */ | ||
577 | SUBKEY_R(i + 0) = SUBKEY_L(i + 0) ^ dw; SUBKEY_L(i + 0) = dw; | ||
578 | dw = SUBKEY_L(i + 1) ^ SUBKEY_R(i + 1); dw = ROL8(dw);/* round 2 */ | ||
579 | SUBKEY_R(i + 1) = SUBKEY_L(i + 1) ^ dw; SUBKEY_L(i + 1) = dw; | ||
580 | dw = SUBKEY_L(i + 2) ^ SUBKEY_R(i + 2); dw = ROL8(dw);/* round 3 */ | ||
581 | SUBKEY_R(i + 2) = SUBKEY_L(i + 2) ^ dw; SUBKEY_L(i + 2) = dw; | ||
582 | dw = SUBKEY_L(i + 3) ^ SUBKEY_R(i + 3); dw = ROL8(dw);/* round 4 */ | ||
583 | SUBKEY_R(i + 3) = SUBKEY_L(i + 3) ^ dw; SUBKEY_L(i + 3) = dw; | ||
584 | dw = SUBKEY_L(i + 4) ^ SUBKEY_R(i + 4); dw = ROL8(dw);/* round 5 */ | ||
585 | SUBKEY_R(i + 4) = SUBKEY_L(i + 4) ^ dw; SUBKEY_L(i + 4) = dw; | ||
586 | dw = SUBKEY_L(i + 5) ^ SUBKEY_R(i + 5); dw = ROL8(dw);/* round 6 */ | ||
587 | SUBKEY_R(i + 5) = SUBKEY_L(i + 5) ^ dw; SUBKEY_L(i + 5) = dw; | ||
588 | i += 8; | ||
589 | } while (i < max); | ||
590 | } | ||
478 | 591 | ||
479 | static void camellia_setup128(const unsigned char *key, u32 *subkey) | 592 | static void camellia_setup128(const unsigned char *key, u32 *subkey) |
480 | { | 593 | { |
481 | u32 kll, klr, krl, krr; | 594 | u32 kll, klr, krl, krr; |
482 | u32 il, ir, t0, t1, w0, w1; | 595 | u32 il, ir, t0, t1, w0, w1; |
483 | u32 kw4l, kw4r, dw, tl, tr; | ||
484 | u32 subL[26]; | 596 | u32 subL[26]; |
485 | u32 subR[26]; | 597 | u32 subR[26]; |
486 | 598 | ||
487 | /** | 599 | /** |
488 | * k == kll || klr || krl || krr (|| is concatination) | 600 | * k == kll || klr || krl || krr (|| is concatenation) |
489 | */ | ||
490 | kll = GETU32(key ); | ||
491 | klr = GETU32(key + 4); | ||
492 | krl = GETU32(key + 8); | ||
493 | krr = GETU32(key + 12); | ||
494 | /** | ||
495 | * generate KL dependent subkeys | ||
496 | */ | 601 | */ |
602 | GETU32(kll, key ); | ||
603 | GETU32(klr, key + 4); | ||
604 | GETU32(krl, key + 8); | ||
605 | GETU32(krr, key + 12); | ||
606 | |||
607 | /* generate KL dependent subkeys */ | ||
497 | /* kw1 */ | 608 | /* kw1 */ |
498 | SUBL(0) = kll; SUBR(0) = klr; | 609 | subL[0] = kll; subR[0] = klr; |
499 | /* kw2 */ | 610 | /* kw2 */ |
500 | SUBL(1) = krl; SUBR(1) = krr; | 611 | subL[1] = krl; subR[1] = krr; |
501 | /* rotation left shift 15bit */ | 612 | /* rotation left shift 15bit */ |
502 | CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15); | 613 | ROLDQ(kll, klr, krl, krr, w0, w1, 15); |
503 | /* k3 */ | 614 | /* k3 */ |
504 | SUBL(4) = kll; SUBR(4) = klr; | 615 | subL[4] = kll; subR[4] = klr; |
505 | /* k4 */ | 616 | /* k4 */ |
506 | SUBL(5) = krl; SUBR(5) = krr; | 617 | subL[5] = krl; subR[5] = krr; |
507 | /* rotation left shift 15+30bit */ | 618 | /* rotation left shift 15+30bit */ |
508 | CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 30); | 619 | ROLDQ(kll, klr, krl, krr, w0, w1, 30); |
509 | /* k7 */ | 620 | /* k7 */ |
510 | SUBL(10) = kll; SUBR(10) = klr; | 621 | subL[10] = kll; subR[10] = klr; |
511 | /* k8 */ | 622 | /* k8 */ |
512 | SUBL(11) = krl; SUBR(11) = krr; | 623 | subL[11] = krl; subR[11] = krr; |
513 | /* rotation left shift 15+30+15bit */ | 624 | /* rotation left shift 15+30+15bit */ |
514 | CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15); | 625 | ROLDQ(kll, klr, krl, krr, w0, w1, 15); |
515 | /* k10 */ | 626 | /* k10 */ |
516 | SUBL(13) = krl; SUBR(13) = krr; | 627 | subL[13] = krl; subR[13] = krr; |
517 | /* rotation left shift 15+30+15+17 bit */ | 628 | /* rotation left shift 15+30+15+17 bit */ |
518 | CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 17); | 629 | ROLDQ(kll, klr, krl, krr, w0, w1, 17); |
519 | /* kl3 */ | 630 | /* kl3 */ |
520 | SUBL(16) = kll; SUBR(16) = klr; | 631 | subL[16] = kll; subR[16] = klr; |
521 | /* kl4 */ | 632 | /* kl4 */ |
522 | SUBL(17) = krl; SUBR(17) = krr; | 633 | subL[17] = krl; subR[17] = krr; |
523 | /* rotation left shift 15+30+15+17+17 bit */ | 634 | /* rotation left shift 15+30+15+17+17 bit */ |
524 | CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 17); | 635 | ROLDQ(kll, klr, krl, krr, w0, w1, 17); |
525 | /* k13 */ | 636 | /* k13 */ |
526 | SUBL(18) = kll; SUBR(18) = klr; | 637 | subL[18] = kll; subR[18] = klr; |
527 | /* k14 */ | 638 | /* k14 */ |
528 | SUBL(19) = krl; SUBR(19) = krr; | 639 | subL[19] = krl; subR[19] = krr; |
529 | /* rotation left shift 15+30+15+17+17+17 bit */ | 640 | /* rotation left shift 15+30+15+17+17+17 bit */ |
530 | CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 17); | 641 | ROLDQ(kll, klr, krl, krr, w0, w1, 17); |
531 | /* k17 */ | 642 | /* k17 */ |
532 | SUBL(22) = kll; SUBR(22) = klr; | 643 | subL[22] = kll; subR[22] = klr; |
533 | /* k18 */ | 644 | /* k18 */ |
534 | SUBL(23) = krl; SUBR(23) = krr; | 645 | subL[23] = krl; subR[23] = krr; |
535 | 646 | ||
536 | /* generate KA */ | 647 | /* generate KA */ |
537 | kll = SUBL(0); klr = SUBR(0); | 648 | kll = subL[0]; klr = subR[0]; |
538 | krl = SUBL(1); krr = SUBR(1); | 649 | krl = subL[1]; krr = subR[1]; |
539 | CAMELLIA_F(kll, klr, | 650 | CAMELLIA_F(kll, klr, |
540 | CAMELLIA_SIGMA1L, CAMELLIA_SIGMA1R, | 651 | CAMELLIA_SIGMA1L, CAMELLIA_SIGMA1R, |
541 | w0, w1, il, ir, t0, t1); | 652 | w0, w1, il, ir, t0, t1); |
@@ -555,306 +666,108 @@ static void camellia_setup128(const unsigned char *key, u32 *subkey) | |||
555 | 666 | ||
556 | /* generate KA dependent subkeys */ | 667 | /* generate KA dependent subkeys */ |
557 | /* k1, k2 */ | 668 | /* k1, k2 */ |
558 | SUBL(2) = kll; SUBR(2) = klr; | 669 | subL[2] = kll; subR[2] = klr; |
559 | SUBL(3) = krl; SUBR(3) = krr; | 670 | subL[3] = krl; subR[3] = krr; |
560 | CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15); | 671 | ROLDQ(kll, klr, krl, krr, w0, w1, 15); |
561 | /* k5,k6 */ | 672 | /* k5,k6 */ |
562 | SUBL(6) = kll; SUBR(6) = klr; | 673 | subL[6] = kll; subR[6] = klr; |
563 | SUBL(7) = krl; SUBR(7) = krr; | 674 | subL[7] = krl; subR[7] = krr; |
564 | CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15); | 675 | ROLDQ(kll, klr, krl, krr, w0, w1, 15); |
565 | /* kl1, kl2 */ | 676 | /* kl1, kl2 */ |
566 | SUBL(8) = kll; SUBR(8) = klr; | 677 | subL[8] = kll; subR[8] = klr; |
567 | SUBL(9) = krl; SUBR(9) = krr; | 678 | subL[9] = krl; subR[9] = krr; |
568 | CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15); | 679 | ROLDQ(kll, klr, krl, krr, w0, w1, 15); |
569 | /* k9 */ | 680 | /* k9 */ |
570 | SUBL(12) = kll; SUBR(12) = klr; | 681 | subL[12] = kll; subR[12] = klr; |
571 | CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15); | 682 | ROLDQ(kll, klr, krl, krr, w0, w1, 15); |
572 | /* k11, k12 */ | 683 | /* k11, k12 */ |
573 | SUBL(14) = kll; SUBR(14) = klr; | 684 | subL[14] = kll; subR[14] = klr; |
574 | SUBL(15) = krl; SUBR(15) = krr; | 685 | subL[15] = krl; subR[15] = krr; |
575 | CAMELLIA_ROLDQo32(kll, klr, krl, krr, w0, w1, 34); | 686 | ROLDQo32(kll, klr, krl, krr, w0, w1, 34); |
576 | /* k15, k16 */ | 687 | /* k15, k16 */ |
577 | SUBL(20) = kll; SUBR(20) = klr; | 688 | subL[20] = kll; subR[20] = klr; |
578 | SUBL(21) = krl; SUBR(21) = krr; | 689 | subL[21] = krl; subR[21] = krr; |
579 | CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 17); | 690 | ROLDQ(kll, klr, krl, krr, w0, w1, 17); |
580 | /* kw3, kw4 */ | 691 | /* kw3, kw4 */ |
581 | SUBL(24) = kll; SUBR(24) = klr; | 692 | subL[24] = kll; subR[24] = klr; |
582 | SUBL(25) = krl; SUBR(25) = krr; | 693 | subL[25] = krl; subR[25] = krr; |
583 | 694 | ||
584 | 695 | camellia_setup_tail(subkey, subL, subR, 24); | |
585 | /* absorb kw2 to other subkeys */ | ||
586 | /* round 2 */ | ||
587 | SUBL(3) ^= SUBL(1); SUBR(3) ^= SUBR(1); | ||
588 | /* round 4 */ | ||
589 | SUBL(5) ^= SUBL(1); SUBR(5) ^= SUBR(1); | ||
590 | /* round 6 */ | ||
591 | SUBL(7) ^= SUBL(1); SUBR(7) ^= SUBR(1); | ||
592 | SUBL(1) ^= SUBR(1) & ~SUBR(9); | ||
593 | dw = SUBL(1) & SUBL(9), | ||
594 | SUBR(1) ^= CAMELLIA_RL1(dw); /* modified for FLinv(kl2) */ | ||
595 | /* round 8 */ | ||
596 | SUBL(11) ^= SUBL(1); SUBR(11) ^= SUBR(1); | ||
597 | /* round 10 */ | ||
598 | SUBL(13) ^= SUBL(1); SUBR(13) ^= SUBR(1); | ||
599 | /* round 12 */ | ||
600 | SUBL(15) ^= SUBL(1); SUBR(15) ^= SUBR(1); | ||
601 | SUBL(1) ^= SUBR(1) & ~SUBR(17); | ||
602 | dw = SUBL(1) & SUBL(17), | ||
603 | SUBR(1) ^= CAMELLIA_RL1(dw); /* modified for FLinv(kl4) */ | ||
604 | /* round 14 */ | ||
605 | SUBL(19) ^= SUBL(1); SUBR(19) ^= SUBR(1); | ||
606 | /* round 16 */ | ||
607 | SUBL(21) ^= SUBL(1); SUBR(21) ^= SUBR(1); | ||
608 | /* round 18 */ | ||
609 | SUBL(23) ^= SUBL(1); SUBR(23) ^= SUBR(1); | ||
610 | /* kw3 */ | ||
611 | SUBL(24) ^= SUBL(1); SUBR(24) ^= SUBR(1); | ||
612 | |||
613 | /* absorb kw4 to other subkeys */ | ||
614 | kw4l = SUBL(25); kw4r = SUBR(25); | ||
615 | /* round 17 */ | ||
616 | SUBL(22) ^= kw4l; SUBR(22) ^= kw4r; | ||
617 | /* round 15 */ | ||
618 | SUBL(20) ^= kw4l; SUBR(20) ^= kw4r; | ||
619 | /* round 13 */ | ||
620 | SUBL(18) ^= kw4l; SUBR(18) ^= kw4r; | ||
621 | kw4l ^= kw4r & ~SUBR(16); | ||
622 | dw = kw4l & SUBL(16), | ||
623 | kw4r ^= CAMELLIA_RL1(dw); /* modified for FL(kl3) */ | ||
624 | /* round 11 */ | ||
625 | SUBL(14) ^= kw4l; SUBR(14) ^= kw4r; | ||
626 | /* round 9 */ | ||
627 | SUBL(12) ^= kw4l; SUBR(12) ^= kw4r; | ||
628 | /* round 7 */ | ||
629 | SUBL(10) ^= kw4l; SUBR(10) ^= kw4r; | ||
630 | kw4l ^= kw4r & ~SUBR(8); | ||
631 | dw = kw4l & SUBL(8), | ||
632 | kw4r ^= CAMELLIA_RL1(dw); /* modified for FL(kl1) */ | ||
633 | /* round 5 */ | ||
634 | SUBL(6) ^= kw4l; SUBR(6) ^= kw4r; | ||
635 | /* round 3 */ | ||
636 | SUBL(4) ^= kw4l; SUBR(4) ^= kw4r; | ||
637 | /* round 1 */ | ||
638 | SUBL(2) ^= kw4l; SUBR(2) ^= kw4r; | ||
639 | /* kw1 */ | ||
640 | SUBL(0) ^= kw4l; SUBR(0) ^= kw4r; | ||
641 | |||
642 | |||
643 | /* key XOR is end of F-function */ | ||
644 | CAMELLIA_SUBKEY_L(0) = SUBL(0) ^ SUBL(2);/* kw1 */ | ||
645 | CAMELLIA_SUBKEY_R(0) = SUBR(0) ^ SUBR(2); | ||
646 | CAMELLIA_SUBKEY_L(2) = SUBL(3); /* round 1 */ | ||
647 | CAMELLIA_SUBKEY_R(2) = SUBR(3); | ||
648 | CAMELLIA_SUBKEY_L(3) = SUBL(2) ^ SUBL(4); /* round 2 */ | ||
649 | CAMELLIA_SUBKEY_R(3) = SUBR(2) ^ SUBR(4); | ||
650 | CAMELLIA_SUBKEY_L(4) = SUBL(3) ^ SUBL(5); /* round 3 */ | ||
651 | CAMELLIA_SUBKEY_R(4) = SUBR(3) ^ SUBR(5); | ||
652 | CAMELLIA_SUBKEY_L(5) = SUBL(4) ^ SUBL(6); /* round 4 */ | ||
653 | CAMELLIA_SUBKEY_R(5) = SUBR(4) ^ SUBR(6); | ||
654 | CAMELLIA_SUBKEY_L(6) = SUBL(5) ^ SUBL(7); /* round 5 */ | ||
655 | CAMELLIA_SUBKEY_R(6) = SUBR(5) ^ SUBR(7); | ||
656 | tl = SUBL(10) ^ (SUBR(10) & ~SUBR(8)); | ||
657 | dw = tl & SUBL(8), /* FL(kl1) */ | ||
658 | tr = SUBR(10) ^ CAMELLIA_RL1(dw); | ||
659 | CAMELLIA_SUBKEY_L(7) = SUBL(6) ^ tl; /* round 6 */ | ||
660 | CAMELLIA_SUBKEY_R(7) = SUBR(6) ^ tr; | ||
661 | CAMELLIA_SUBKEY_L(8) = SUBL(8); /* FL(kl1) */ | ||
662 | CAMELLIA_SUBKEY_R(8) = SUBR(8); | ||
663 | CAMELLIA_SUBKEY_L(9) = SUBL(9); /* FLinv(kl2) */ | ||
664 | CAMELLIA_SUBKEY_R(9) = SUBR(9); | ||
665 | tl = SUBL(7) ^ (SUBR(7) & ~SUBR(9)); | ||
666 | dw = tl & SUBL(9), /* FLinv(kl2) */ | ||
667 | tr = SUBR(7) ^ CAMELLIA_RL1(dw); | ||
668 | CAMELLIA_SUBKEY_L(10) = tl ^ SUBL(11); /* round 7 */ | ||
669 | CAMELLIA_SUBKEY_R(10) = tr ^ SUBR(11); | ||
670 | CAMELLIA_SUBKEY_L(11) = SUBL(10) ^ SUBL(12); /* round 8 */ | ||
671 | CAMELLIA_SUBKEY_R(11) = SUBR(10) ^ SUBR(12); | ||
672 | CAMELLIA_SUBKEY_L(12) = SUBL(11) ^ SUBL(13); /* round 9 */ | ||
673 | CAMELLIA_SUBKEY_R(12) = SUBR(11) ^ SUBR(13); | ||
674 | CAMELLIA_SUBKEY_L(13) = SUBL(12) ^ SUBL(14); /* round 10 */ | ||
675 | CAMELLIA_SUBKEY_R(13) = SUBR(12) ^ SUBR(14); | ||
676 | CAMELLIA_SUBKEY_L(14) = SUBL(13) ^ SUBL(15); /* round 11 */ | ||
677 | CAMELLIA_SUBKEY_R(14) = SUBR(13) ^ SUBR(15); | ||
678 | tl = SUBL(18) ^ (SUBR(18) & ~SUBR(16)); | ||
679 | dw = tl & SUBL(16), /* FL(kl3) */ | ||
680 | tr = SUBR(18) ^ CAMELLIA_RL1(dw); | ||
681 | CAMELLIA_SUBKEY_L(15) = SUBL(14) ^ tl; /* round 12 */ | ||
682 | CAMELLIA_SUBKEY_R(15) = SUBR(14) ^ tr; | ||
683 | CAMELLIA_SUBKEY_L(16) = SUBL(16); /* FL(kl3) */ | ||
684 | CAMELLIA_SUBKEY_R(16) = SUBR(16); | ||
685 | CAMELLIA_SUBKEY_L(17) = SUBL(17); /* FLinv(kl4) */ | ||
686 | CAMELLIA_SUBKEY_R(17) = SUBR(17); | ||
687 | tl = SUBL(15) ^ (SUBR(15) & ~SUBR(17)); | ||
688 | dw = tl & SUBL(17), /* FLinv(kl4) */ | ||
689 | tr = SUBR(15) ^ CAMELLIA_RL1(dw); | ||
690 | CAMELLIA_SUBKEY_L(18) = tl ^ SUBL(19); /* round 13 */ | ||
691 | CAMELLIA_SUBKEY_R(18) = tr ^ SUBR(19); | ||
692 | CAMELLIA_SUBKEY_L(19) = SUBL(18) ^ SUBL(20); /* round 14 */ | ||
693 | CAMELLIA_SUBKEY_R(19) = SUBR(18) ^ SUBR(20); | ||
694 | CAMELLIA_SUBKEY_L(20) = SUBL(19) ^ SUBL(21); /* round 15 */ | ||
695 | CAMELLIA_SUBKEY_R(20) = SUBR(19) ^ SUBR(21); | ||
696 | CAMELLIA_SUBKEY_L(21) = SUBL(20) ^ SUBL(22); /* round 16 */ | ||
697 | CAMELLIA_SUBKEY_R(21) = SUBR(20) ^ SUBR(22); | ||
698 | CAMELLIA_SUBKEY_L(22) = SUBL(21) ^ SUBL(23); /* round 17 */ | ||
699 | CAMELLIA_SUBKEY_R(22) = SUBR(21) ^ SUBR(23); | ||
700 | CAMELLIA_SUBKEY_L(23) = SUBL(22); /* round 18 */ | ||
701 | CAMELLIA_SUBKEY_R(23) = SUBR(22); | ||
702 | CAMELLIA_SUBKEY_L(24) = SUBL(24) ^ SUBL(23); /* kw3 */ | ||
703 | CAMELLIA_SUBKEY_R(24) = SUBR(24) ^ SUBR(23); | ||
704 | |||
705 | /* apply the inverse of the last half of P-function */ | ||
706 | dw = CAMELLIA_SUBKEY_L(2) ^ CAMELLIA_SUBKEY_R(2), | ||
707 | dw = CAMELLIA_RL8(dw);/* round 1 */ | ||
708 | CAMELLIA_SUBKEY_R(2) = CAMELLIA_SUBKEY_L(2) ^ dw, | ||
709 | CAMELLIA_SUBKEY_L(2) = dw; | ||
710 | dw = CAMELLIA_SUBKEY_L(3) ^ CAMELLIA_SUBKEY_R(3), | ||
711 | dw = CAMELLIA_RL8(dw);/* round 2 */ | ||
712 | CAMELLIA_SUBKEY_R(3) = CAMELLIA_SUBKEY_L(3) ^ dw, | ||
713 | CAMELLIA_SUBKEY_L(3) = dw; | ||
714 | dw = CAMELLIA_SUBKEY_L(4) ^ CAMELLIA_SUBKEY_R(4), | ||
715 | dw = CAMELLIA_RL8(dw);/* round 3 */ | ||
716 | CAMELLIA_SUBKEY_R(4) = CAMELLIA_SUBKEY_L(4) ^ dw, | ||
717 | CAMELLIA_SUBKEY_L(4) = dw; | ||
718 | dw = CAMELLIA_SUBKEY_L(5) ^ CAMELLIA_SUBKEY_R(5), | ||
719 | dw = CAMELLIA_RL8(dw);/* round 4 */ | ||
720 | CAMELLIA_SUBKEY_R(5) = CAMELLIA_SUBKEY_L(5) ^ dw, | ||
721 | CAMELLIA_SUBKEY_L(5) = dw; | ||
722 | dw = CAMELLIA_SUBKEY_L(6) ^ CAMELLIA_SUBKEY_R(6), | ||
723 | dw = CAMELLIA_RL8(dw);/* round 5 */ | ||
724 | CAMELLIA_SUBKEY_R(6) = CAMELLIA_SUBKEY_L(6) ^ dw, | ||
725 | CAMELLIA_SUBKEY_L(6) = dw; | ||
726 | dw = CAMELLIA_SUBKEY_L(7) ^ CAMELLIA_SUBKEY_R(7), | ||
727 | dw = CAMELLIA_RL8(dw);/* round 6 */ | ||
728 | CAMELLIA_SUBKEY_R(7) = CAMELLIA_SUBKEY_L(7) ^ dw, | ||
729 | CAMELLIA_SUBKEY_L(7) = dw; | ||
730 | dw = CAMELLIA_SUBKEY_L(10) ^ CAMELLIA_SUBKEY_R(10), | ||
731 | dw = CAMELLIA_RL8(dw);/* round 7 */ | ||
732 | CAMELLIA_SUBKEY_R(10) = CAMELLIA_SUBKEY_L(10) ^ dw, | ||
733 | CAMELLIA_SUBKEY_L(10) = dw; | ||
734 | dw = CAMELLIA_SUBKEY_L(11) ^ CAMELLIA_SUBKEY_R(11), | ||
735 | dw = CAMELLIA_RL8(dw);/* round 8 */ | ||
736 | CAMELLIA_SUBKEY_R(11) = CAMELLIA_SUBKEY_L(11) ^ dw, | ||
737 | CAMELLIA_SUBKEY_L(11) = dw; | ||
738 | dw = CAMELLIA_SUBKEY_L(12) ^ CAMELLIA_SUBKEY_R(12), | ||
739 | dw = CAMELLIA_RL8(dw);/* round 9 */ | ||
740 | CAMELLIA_SUBKEY_R(12) = CAMELLIA_SUBKEY_L(12) ^ dw, | ||
741 | CAMELLIA_SUBKEY_L(12) = dw; | ||
742 | dw = CAMELLIA_SUBKEY_L(13) ^ CAMELLIA_SUBKEY_R(13), | ||
743 | dw = CAMELLIA_RL8(dw);/* round 10 */ | ||
744 | CAMELLIA_SUBKEY_R(13) = CAMELLIA_SUBKEY_L(13) ^ dw, | ||
745 | CAMELLIA_SUBKEY_L(13) = dw; | ||
746 | dw = CAMELLIA_SUBKEY_L(14) ^ CAMELLIA_SUBKEY_R(14), | ||
747 | dw = CAMELLIA_RL8(dw);/* round 11 */ | ||
748 | CAMELLIA_SUBKEY_R(14) = CAMELLIA_SUBKEY_L(14) ^ dw, | ||
749 | CAMELLIA_SUBKEY_L(14) = dw; | ||
750 | dw = CAMELLIA_SUBKEY_L(15) ^ CAMELLIA_SUBKEY_R(15), | ||
751 | dw = CAMELLIA_RL8(dw);/* round 12 */ | ||
752 | CAMELLIA_SUBKEY_R(15) = CAMELLIA_SUBKEY_L(15) ^ dw, | ||
753 | CAMELLIA_SUBKEY_L(15) = dw; | ||
754 | dw = CAMELLIA_SUBKEY_L(18) ^ CAMELLIA_SUBKEY_R(18), | ||
755 | dw = CAMELLIA_RL8(dw);/* round 13 */ | ||
756 | CAMELLIA_SUBKEY_R(18) = CAMELLIA_SUBKEY_L(18) ^ dw, | ||
757 | CAMELLIA_SUBKEY_L(18) = dw; | ||
758 | dw = CAMELLIA_SUBKEY_L(19) ^ CAMELLIA_SUBKEY_R(19), | ||
759 | dw = CAMELLIA_RL8(dw);/* round 14 */ | ||
760 | CAMELLIA_SUBKEY_R(19) = CAMELLIA_SUBKEY_L(19) ^ dw, | ||
761 | CAMELLIA_SUBKEY_L(19) = dw; | ||
762 | dw = CAMELLIA_SUBKEY_L(20) ^ CAMELLIA_SUBKEY_R(20), | ||
763 | dw = CAMELLIA_RL8(dw);/* round 15 */ | ||
764 | CAMELLIA_SUBKEY_R(20) = CAMELLIA_SUBKEY_L(20) ^ dw, | ||
765 | CAMELLIA_SUBKEY_L(20) = dw; | ||
766 | dw = CAMELLIA_SUBKEY_L(21) ^ CAMELLIA_SUBKEY_R(21), | ||
767 | dw = CAMELLIA_RL8(dw);/* round 16 */ | ||
768 | CAMELLIA_SUBKEY_R(21) = CAMELLIA_SUBKEY_L(21) ^ dw, | ||
769 | CAMELLIA_SUBKEY_L(21) = dw; | ||
770 | dw = CAMELLIA_SUBKEY_L(22) ^ CAMELLIA_SUBKEY_R(22), | ||
771 | dw = CAMELLIA_RL8(dw);/* round 17 */ | ||
772 | CAMELLIA_SUBKEY_R(22) = CAMELLIA_SUBKEY_L(22) ^ dw, | ||
773 | CAMELLIA_SUBKEY_L(22) = dw; | ||
774 | dw = CAMELLIA_SUBKEY_L(23) ^ CAMELLIA_SUBKEY_R(23), | ||
775 | dw = CAMELLIA_RL8(dw);/* round 18 */ | ||
776 | CAMELLIA_SUBKEY_R(23) = CAMELLIA_SUBKEY_L(23) ^ dw, | ||
777 | CAMELLIA_SUBKEY_L(23) = dw; | ||
778 | |||
779 | return; | ||
780 | } | 696 | } |
781 | 697 | ||
782 | |||
783 | static void camellia_setup256(const unsigned char *key, u32 *subkey) | 698 | static void camellia_setup256(const unsigned char *key, u32 *subkey) |
784 | { | 699 | { |
785 | u32 kll,klr,krl,krr; /* left half of key */ | 700 | u32 kll, klr, krl, krr; /* left half of key */ |
786 | u32 krll,krlr,krrl,krrr; /* right half of key */ | 701 | u32 krll, krlr, krrl, krrr; /* right half of key */ |
787 | u32 il, ir, t0, t1, w0, w1; /* temporary variables */ | 702 | u32 il, ir, t0, t1, w0, w1; /* temporary variables */ |
788 | u32 kw4l, kw4r, dw, tl, tr; | ||
789 | u32 subL[34]; | 703 | u32 subL[34]; |
790 | u32 subR[34]; | 704 | u32 subR[34]; |
791 | 705 | ||
792 | /** | 706 | /** |
793 | * key = (kll || klr || krl || krr || krll || krlr || krrl || krrr) | 707 | * key = (kll || klr || krl || krr || krll || krlr || krrl || krrr) |
794 | * (|| is concatination) | 708 | * (|| is concatenation) |
795 | */ | 709 | */ |
796 | 710 | GETU32(kll, key ); | |
797 | kll = GETU32(key ); | 711 | GETU32(klr, key + 4); |
798 | klr = GETU32(key + 4); | 712 | GETU32(krl, key + 8); |
799 | krl = GETU32(key + 8); | 713 | GETU32(krr, key + 12); |
800 | krr = GETU32(key + 12); | 714 | GETU32(krll, key + 16); |
801 | krll = GETU32(key + 16); | 715 | GETU32(krlr, key + 20); |
802 | krlr = GETU32(key + 20); | 716 | GETU32(krrl, key + 24); |
803 | krrl = GETU32(key + 24); | 717 | GETU32(krrr, key + 28); |
804 | krrr = GETU32(key + 28); | ||
805 | 718 | ||
806 | /* generate KL dependent subkeys */ | 719 | /* generate KL dependent subkeys */ |
807 | /* kw1 */ | 720 | /* kw1 */ |
808 | SUBL(0) = kll; SUBR(0) = klr; | 721 | subL[0] = kll; subR[0] = klr; |
809 | /* kw2 */ | 722 | /* kw2 */ |
810 | SUBL(1) = krl; SUBR(1) = krr; | 723 | subL[1] = krl; subR[1] = krr; |
811 | CAMELLIA_ROLDQo32(kll, klr, krl, krr, w0, w1, 45); | 724 | ROLDQo32(kll, klr, krl, krr, w0, w1, 45); |
812 | /* k9 */ | 725 | /* k9 */ |
813 | SUBL(12) = kll; SUBR(12) = klr; | 726 | subL[12] = kll; subR[12] = klr; |
814 | /* k10 */ | 727 | /* k10 */ |
815 | SUBL(13) = krl; SUBR(13) = krr; | 728 | subL[13] = krl; subR[13] = krr; |
816 | CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15); | 729 | ROLDQ(kll, klr, krl, krr, w0, w1, 15); |
817 | /* kl3 */ | 730 | /* kl3 */ |
818 | SUBL(16) = kll; SUBR(16) = klr; | 731 | subL[16] = kll; subR[16] = klr; |
819 | /* kl4 */ | 732 | /* kl4 */ |
820 | SUBL(17) = krl; SUBR(17) = krr; | 733 | subL[17] = krl; subR[17] = krr; |
821 | CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 17); | 734 | ROLDQ(kll, klr, krl, krr, w0, w1, 17); |
822 | /* k17 */ | 735 | /* k17 */ |
823 | SUBL(22) = kll; SUBR(22) = klr; | 736 | subL[22] = kll; subR[22] = klr; |
824 | /* k18 */ | 737 | /* k18 */ |
825 | SUBL(23) = krl; SUBR(23) = krr; | 738 | subL[23] = krl; subR[23] = krr; |
826 | CAMELLIA_ROLDQo32(kll, klr, krl, krr, w0, w1, 34); | 739 | ROLDQo32(kll, klr, krl, krr, w0, w1, 34); |
827 | /* k23 */ | 740 | /* k23 */ |
828 | SUBL(30) = kll; SUBR(30) = klr; | 741 | subL[30] = kll; subR[30] = klr; |
829 | /* k24 */ | 742 | /* k24 */ |
830 | SUBL(31) = krl; SUBR(31) = krr; | 743 | subL[31] = krl; subR[31] = krr; |
831 | 744 | ||
832 | /* generate KR dependent subkeys */ | 745 | /* generate KR dependent subkeys */ |
833 | CAMELLIA_ROLDQ(krll, krlr, krrl, krrr, w0, w1, 15); | 746 | ROLDQ(krll, krlr, krrl, krrr, w0, w1, 15); |
834 | /* k3 */ | 747 | /* k3 */ |
835 | SUBL(4) = krll; SUBR(4) = krlr; | 748 | subL[4] = krll; subR[4] = krlr; |
836 | /* k4 */ | 749 | /* k4 */ |
837 | SUBL(5) = krrl; SUBR(5) = krrr; | 750 | subL[5] = krrl; subR[5] = krrr; |
838 | CAMELLIA_ROLDQ(krll, krlr, krrl, krrr, w0, w1, 15); | 751 | ROLDQ(krll, krlr, krrl, krrr, w0, w1, 15); |
839 | /* kl1 */ | 752 | /* kl1 */ |
840 | SUBL(8) = krll; SUBR(8) = krlr; | 753 | subL[8] = krll; subR[8] = krlr; |
841 | /* kl2 */ | 754 | /* kl2 */ |
842 | SUBL(9) = krrl; SUBR(9) = krrr; | 755 | subL[9] = krrl; subR[9] = krrr; |
843 | CAMELLIA_ROLDQ(krll, krlr, krrl, krrr, w0, w1, 30); | 756 | ROLDQ(krll, krlr, krrl, krrr, w0, w1, 30); |
844 | /* k13 */ | 757 | /* k13 */ |
845 | SUBL(18) = krll; SUBR(18) = krlr; | 758 | subL[18] = krll; subR[18] = krlr; |
846 | /* k14 */ | 759 | /* k14 */ |
847 | SUBL(19) = krrl; SUBR(19) = krrr; | 760 | subL[19] = krrl; subR[19] = krrr; |
848 | CAMELLIA_ROLDQo32(krll, krlr, krrl, krrr, w0, w1, 34); | 761 | ROLDQo32(krll, krlr, krrl, krrr, w0, w1, 34); |
849 | /* k19 */ | 762 | /* k19 */ |
850 | SUBL(26) = krll; SUBR(26) = krlr; | 763 | subL[26] = krll; subR[26] = krlr; |
851 | /* k20 */ | 764 | /* k20 */ |
852 | SUBL(27) = krrl; SUBR(27) = krrr; | 765 | subL[27] = krrl; subR[27] = krrr; |
853 | CAMELLIA_ROLDQo32(krll, krlr, krrl, krrr, w0, w1, 34); | 766 | ROLDQo32(krll, krlr, krrl, krrr, w0, w1, 34); |
854 | 767 | ||
855 | /* generate KA */ | 768 | /* generate KA */ |
856 | kll = SUBL(0) ^ krll; klr = SUBR(0) ^ krlr; | 769 | kll = subL[0] ^ krll; klr = subR[0] ^ krlr; |
857 | krl = SUBL(1) ^ krrl; krr = SUBR(1) ^ krrr; | 770 | krl = subL[1] ^ krrl; krr = subR[1] ^ krrr; |
858 | CAMELLIA_F(kll, klr, | 771 | CAMELLIA_F(kll, klr, |
859 | CAMELLIA_SIGMA1L, CAMELLIA_SIGMA1R, | 772 | CAMELLIA_SIGMA1L, CAMELLIA_SIGMA1R, |
860 | w0, w1, il, ir, t0, t1); | 773 | w0, w1, il, ir, t0, t1); |
@@ -885,310 +798,50 @@ static void camellia_setup256(const unsigned char *key, u32 *subkey) | |||
885 | krll ^= w0; krlr ^= w1; | 798 | krll ^= w0; krlr ^= w1; |
886 | 799 | ||
887 | /* generate KA dependent subkeys */ | 800 | /* generate KA dependent subkeys */ |
888 | CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15); | 801 | ROLDQ(kll, klr, krl, krr, w0, w1, 15); |
889 | /* k5 */ | 802 | /* k5 */ |
890 | SUBL(6) = kll; SUBR(6) = klr; | 803 | subL[6] = kll; subR[6] = klr; |
891 | /* k6 */ | 804 | /* k6 */ |
892 | SUBL(7) = krl; SUBR(7) = krr; | 805 | subL[7] = krl; subR[7] = krr; |
893 | CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 30); | 806 | ROLDQ(kll, klr, krl, krr, w0, w1, 30); |
894 | /* k11 */ | 807 | /* k11 */ |
895 | SUBL(14) = kll; SUBR(14) = klr; | 808 | subL[14] = kll; subR[14] = klr; |
896 | /* k12 */ | 809 | /* k12 */ |
897 | SUBL(15) = krl; SUBR(15) = krr; | 810 | subL[15] = krl; subR[15] = krr; |
898 | /* rotation left shift 32bit */ | 811 | /* rotation left shift 32bit */ |
899 | /* kl5 */ | 812 | /* kl5 */ |
900 | SUBL(24) = klr; SUBR(24) = krl; | 813 | subL[24] = klr; subR[24] = krl; |
901 | /* kl6 */ | 814 | /* kl6 */ |
902 | SUBL(25) = krr; SUBR(25) = kll; | 815 | subL[25] = krr; subR[25] = kll; |
903 | /* rotation left shift 49 from k11,k12 -> k21,k22 */ | 816 | /* rotation left shift 49 from k11,k12 -> k21,k22 */ |
904 | CAMELLIA_ROLDQo32(kll, klr, krl, krr, w0, w1, 49); | 817 | ROLDQo32(kll, klr, krl, krr, w0, w1, 49); |
905 | /* k21 */ | 818 | /* k21 */ |
906 | SUBL(28) = kll; SUBR(28) = klr; | 819 | subL[28] = kll; subR[28] = klr; |
907 | /* k22 */ | 820 | /* k22 */ |
908 | SUBL(29) = krl; SUBR(29) = krr; | 821 | subL[29] = krl; subR[29] = krr; |
909 | 822 | ||
910 | /* generate KB dependent subkeys */ | 823 | /* generate KB dependent subkeys */ |
911 | /* k1 */ | 824 | /* k1 */ |
912 | SUBL(2) = krll; SUBR(2) = krlr; | 825 | subL[2] = krll; subR[2] = krlr; |
913 | /* k2 */ | 826 | /* k2 */ |
914 | SUBL(3) = krrl; SUBR(3) = krrr; | 827 | subL[3] = krrl; subR[3] = krrr; |
915 | CAMELLIA_ROLDQ(krll, krlr, krrl, krrr, w0, w1, 30); | 828 | ROLDQ(krll, krlr, krrl, krrr, w0, w1, 30); |
916 | /* k7 */ | 829 | /* k7 */ |
917 | SUBL(10) = krll; SUBR(10) = krlr; | 830 | subL[10] = krll; subR[10] = krlr; |
918 | /* k8 */ | 831 | /* k8 */ |
919 | SUBL(11) = krrl; SUBR(11) = krrr; | 832 | subL[11] = krrl; subR[11] = krrr; |
920 | CAMELLIA_ROLDQ(krll, krlr, krrl, krrr, w0, w1, 30); | 833 | ROLDQ(krll, krlr, krrl, krrr, w0, w1, 30); |
921 | /* k15 */ | 834 | /* k15 */ |
922 | SUBL(20) = krll; SUBR(20) = krlr; | 835 | subL[20] = krll; subR[20] = krlr; |
923 | /* k16 */ | 836 | /* k16 */ |
924 | SUBL(21) = krrl; SUBR(21) = krrr; | 837 | subL[21] = krrl; subR[21] = krrr; |
925 | CAMELLIA_ROLDQo32(krll, krlr, krrl, krrr, w0, w1, 51); | 838 | ROLDQo32(krll, krlr, krrl, krrr, w0, w1, 51); |
926 | /* kw3 */ | 839 | /* kw3 */ |
927 | SUBL(32) = krll; SUBR(32) = krlr; | 840 | subL[32] = krll; subR[32] = krlr; |
928 | /* kw4 */ | 841 | /* kw4 */ |
929 | SUBL(33) = krrl; SUBR(33) = krrr; | 842 | subL[33] = krrl; subR[33] = krrr; |
930 | |||
931 | /* absorb kw2 to other subkeys */ | ||
932 | /* round 2 */ | ||
933 | SUBL(3) ^= SUBL(1); SUBR(3) ^= SUBR(1); | ||
934 | /* round 4 */ | ||
935 | SUBL(5) ^= SUBL(1); SUBR(5) ^= SUBR(1); | ||
936 | /* round 6 */ | ||
937 | SUBL(7) ^= SUBL(1); SUBR(7) ^= SUBR(1); | ||
938 | SUBL(1) ^= SUBR(1) & ~SUBR(9); | ||
939 | dw = SUBL(1) & SUBL(9), | ||
940 | SUBR(1) ^= CAMELLIA_RL1(dw); /* modified for FLinv(kl2) */ | ||
941 | /* round 8 */ | ||
942 | SUBL(11) ^= SUBL(1); SUBR(11) ^= SUBR(1); | ||
943 | /* round 10 */ | ||
944 | SUBL(13) ^= SUBL(1); SUBR(13) ^= SUBR(1); | ||
945 | /* round 12 */ | ||
946 | SUBL(15) ^= SUBL(1); SUBR(15) ^= SUBR(1); | ||
947 | SUBL(1) ^= SUBR(1) & ~SUBR(17); | ||
948 | dw = SUBL(1) & SUBL(17), | ||
949 | SUBR(1) ^= CAMELLIA_RL1(dw); /* modified for FLinv(kl4) */ | ||
950 | /* round 14 */ | ||
951 | SUBL(19) ^= SUBL(1); SUBR(19) ^= SUBR(1); | ||
952 | /* round 16 */ | ||
953 | SUBL(21) ^= SUBL(1); SUBR(21) ^= SUBR(1); | ||
954 | /* round 18 */ | ||
955 | SUBL(23) ^= SUBL(1); SUBR(23) ^= SUBR(1); | ||
956 | SUBL(1) ^= SUBR(1) & ~SUBR(25); | ||
957 | dw = SUBL(1) & SUBL(25), | ||
958 | SUBR(1) ^= CAMELLIA_RL1(dw); /* modified for FLinv(kl6) */ | ||
959 | /* round 20 */ | ||
960 | SUBL(27) ^= SUBL(1); SUBR(27) ^= SUBR(1); | ||
961 | /* round 22 */ | ||
962 | SUBL(29) ^= SUBL(1); SUBR(29) ^= SUBR(1); | ||
963 | /* round 24 */ | ||
964 | SUBL(31) ^= SUBL(1); SUBR(31) ^= SUBR(1); | ||
965 | /* kw3 */ | ||
966 | SUBL(32) ^= SUBL(1); SUBR(32) ^= SUBR(1); | ||
967 | |||
968 | |||
969 | /* absorb kw4 to other subkeys */ | ||
970 | kw4l = SUBL(33); kw4r = SUBR(33); | ||
971 | /* round 23 */ | ||
972 | SUBL(30) ^= kw4l; SUBR(30) ^= kw4r; | ||
973 | /* round 21 */ | ||
974 | SUBL(28) ^= kw4l; SUBR(28) ^= kw4r; | ||
975 | /* round 19 */ | ||
976 | SUBL(26) ^= kw4l; SUBR(26) ^= kw4r; | ||
977 | kw4l ^= kw4r & ~SUBR(24); | ||
978 | dw = kw4l & SUBL(24), | ||
979 | kw4r ^= CAMELLIA_RL1(dw); /* modified for FL(kl5) */ | ||
980 | /* round 17 */ | ||
981 | SUBL(22) ^= kw4l; SUBR(22) ^= kw4r; | ||
982 | /* round 15 */ | ||
983 | SUBL(20) ^= kw4l; SUBR(20) ^= kw4r; | ||
984 | /* round 13 */ | ||
985 | SUBL(18) ^= kw4l; SUBR(18) ^= kw4r; | ||
986 | kw4l ^= kw4r & ~SUBR(16); | ||
987 | dw = kw4l & SUBL(16), | ||
988 | kw4r ^= CAMELLIA_RL1(dw); /* modified for FL(kl3) */ | ||
989 | /* round 11 */ | ||
990 | SUBL(14) ^= kw4l; SUBR(14) ^= kw4r; | ||
991 | /* round 9 */ | ||
992 | SUBL(12) ^= kw4l; SUBR(12) ^= kw4r; | ||
993 | /* round 7 */ | ||
994 | SUBL(10) ^= kw4l; SUBR(10) ^= kw4r; | ||
995 | kw4l ^= kw4r & ~SUBR(8); | ||
996 | dw = kw4l & SUBL(8), | ||
997 | kw4r ^= CAMELLIA_RL1(dw); /* modified for FL(kl1) */ | ||
998 | /* round 5 */ | ||
999 | SUBL(6) ^= kw4l; SUBR(6) ^= kw4r; | ||
1000 | /* round 3 */ | ||
1001 | SUBL(4) ^= kw4l; SUBR(4) ^= kw4r; | ||
1002 | /* round 1 */ | ||
1003 | SUBL(2) ^= kw4l; SUBR(2) ^= kw4r; | ||
1004 | /* kw1 */ | ||
1005 | SUBL(0) ^= kw4l; SUBR(0) ^= kw4r; | ||
1006 | 843 | ||
1007 | /* key XOR is end of F-function */ | 844 | camellia_setup_tail(subkey, subL, subR, 32); |
1008 | CAMELLIA_SUBKEY_L(0) = SUBL(0) ^ SUBL(2);/* kw1 */ | ||
1009 | CAMELLIA_SUBKEY_R(0) = SUBR(0) ^ SUBR(2); | ||
1010 | CAMELLIA_SUBKEY_L(2) = SUBL(3); /* round 1 */ | ||
1011 | CAMELLIA_SUBKEY_R(2) = SUBR(3); | ||
1012 | CAMELLIA_SUBKEY_L(3) = SUBL(2) ^ SUBL(4); /* round 2 */ | ||
1013 | CAMELLIA_SUBKEY_R(3) = SUBR(2) ^ SUBR(4); | ||
1014 | CAMELLIA_SUBKEY_L(4) = SUBL(3) ^ SUBL(5); /* round 3 */ | ||
1015 | CAMELLIA_SUBKEY_R(4) = SUBR(3) ^ SUBR(5); | ||
1016 | CAMELLIA_SUBKEY_L(5) = SUBL(4) ^ SUBL(6); /* round 4 */ | ||
1017 | CAMELLIA_SUBKEY_R(5) = SUBR(4) ^ SUBR(6); | ||
1018 | CAMELLIA_SUBKEY_L(6) = SUBL(5) ^ SUBL(7); /* round 5 */ | ||
1019 | CAMELLIA_SUBKEY_R(6) = SUBR(5) ^ SUBR(7); | ||
1020 | tl = SUBL(10) ^ (SUBR(10) & ~SUBR(8)); | ||
1021 | dw = tl & SUBL(8), /* FL(kl1) */ | ||
1022 | tr = SUBR(10) ^ CAMELLIA_RL1(dw); | ||
1023 | CAMELLIA_SUBKEY_L(7) = SUBL(6) ^ tl; /* round 6 */ | ||
1024 | CAMELLIA_SUBKEY_R(7) = SUBR(6) ^ tr; | ||
1025 | CAMELLIA_SUBKEY_L(8) = SUBL(8); /* FL(kl1) */ | ||
1026 | CAMELLIA_SUBKEY_R(8) = SUBR(8); | ||
1027 | CAMELLIA_SUBKEY_L(9) = SUBL(9); /* FLinv(kl2) */ | ||
1028 | CAMELLIA_SUBKEY_R(9) = SUBR(9); | ||
1029 | tl = SUBL(7) ^ (SUBR(7) & ~SUBR(9)); | ||
1030 | dw = tl & SUBL(9), /* FLinv(kl2) */ | ||
1031 | tr = SUBR(7) ^ CAMELLIA_RL1(dw); | ||
1032 | CAMELLIA_SUBKEY_L(10) = tl ^ SUBL(11); /* round 7 */ | ||
1033 | CAMELLIA_SUBKEY_R(10) = tr ^ SUBR(11); | ||
1034 | CAMELLIA_SUBKEY_L(11) = SUBL(10) ^ SUBL(12); /* round 8 */ | ||
1035 | CAMELLIA_SUBKEY_R(11) = SUBR(10) ^ SUBR(12); | ||
1036 | CAMELLIA_SUBKEY_L(12) = SUBL(11) ^ SUBL(13); /* round 9 */ | ||
1037 | CAMELLIA_SUBKEY_R(12) = SUBR(11) ^ SUBR(13); | ||
1038 | CAMELLIA_SUBKEY_L(13) = SUBL(12) ^ SUBL(14); /* round 10 */ | ||
1039 | CAMELLIA_SUBKEY_R(13) = SUBR(12) ^ SUBR(14); | ||
1040 | CAMELLIA_SUBKEY_L(14) = SUBL(13) ^ SUBL(15); /* round 11 */ | ||
1041 | CAMELLIA_SUBKEY_R(14) = SUBR(13) ^ SUBR(15); | ||
1042 | tl = SUBL(18) ^ (SUBR(18) & ~SUBR(16)); | ||
1043 | dw = tl & SUBL(16), /* FL(kl3) */ | ||
1044 | tr = SUBR(18) ^ CAMELLIA_RL1(dw); | ||
1045 | CAMELLIA_SUBKEY_L(15) = SUBL(14) ^ tl; /* round 12 */ | ||
1046 | CAMELLIA_SUBKEY_R(15) = SUBR(14) ^ tr; | ||
1047 | CAMELLIA_SUBKEY_L(16) = SUBL(16); /* FL(kl3) */ | ||
1048 | CAMELLIA_SUBKEY_R(16) = SUBR(16); | ||
1049 | CAMELLIA_SUBKEY_L(17) = SUBL(17); /* FLinv(kl4) */ | ||
1050 | CAMELLIA_SUBKEY_R(17) = SUBR(17); | ||
1051 | tl = SUBL(15) ^ (SUBR(15) & ~SUBR(17)); | ||
1052 | dw = tl & SUBL(17), /* FLinv(kl4) */ | ||
1053 | tr = SUBR(15) ^ CAMELLIA_RL1(dw); | ||
1054 | CAMELLIA_SUBKEY_L(18) = tl ^ SUBL(19); /* round 13 */ | ||
1055 | CAMELLIA_SUBKEY_R(18) = tr ^ SUBR(19); | ||
1056 | CAMELLIA_SUBKEY_L(19) = SUBL(18) ^ SUBL(20); /* round 14 */ | ||
1057 | CAMELLIA_SUBKEY_R(19) = SUBR(18) ^ SUBR(20); | ||
1058 | CAMELLIA_SUBKEY_L(20) = SUBL(19) ^ SUBL(21); /* round 15 */ | ||
1059 | CAMELLIA_SUBKEY_R(20) = SUBR(19) ^ SUBR(21); | ||
1060 | CAMELLIA_SUBKEY_L(21) = SUBL(20) ^ SUBL(22); /* round 16 */ | ||
1061 | CAMELLIA_SUBKEY_R(21) = SUBR(20) ^ SUBR(22); | ||
1062 | CAMELLIA_SUBKEY_L(22) = SUBL(21) ^ SUBL(23); /* round 17 */ | ||
1063 | CAMELLIA_SUBKEY_R(22) = SUBR(21) ^ SUBR(23); | ||
1064 | tl = SUBL(26) ^ (SUBR(26) | ||
1065 | & ~SUBR(24)); | ||
1066 | dw = tl & SUBL(24), /* FL(kl5) */ | ||
1067 | tr = SUBR(26) ^ CAMELLIA_RL1(dw); | ||
1068 | CAMELLIA_SUBKEY_L(23) = SUBL(22) ^ tl; /* round 18 */ | ||
1069 | CAMELLIA_SUBKEY_R(23) = SUBR(22) ^ tr; | ||
1070 | CAMELLIA_SUBKEY_L(24) = SUBL(24); /* FL(kl5) */ | ||
1071 | CAMELLIA_SUBKEY_R(24) = SUBR(24); | ||
1072 | CAMELLIA_SUBKEY_L(25) = SUBL(25); /* FLinv(kl6) */ | ||
1073 | CAMELLIA_SUBKEY_R(25) = SUBR(25); | ||
1074 | tl = SUBL(23) ^ (SUBR(23) & | ||
1075 | ~SUBR(25)); | ||
1076 | dw = tl & SUBL(25), /* FLinv(kl6) */ | ||
1077 | tr = SUBR(23) ^ CAMELLIA_RL1(dw); | ||
1078 | CAMELLIA_SUBKEY_L(26) = tl ^ SUBL(27); /* round 19 */ | ||
1079 | CAMELLIA_SUBKEY_R(26) = tr ^ SUBR(27); | ||
1080 | CAMELLIA_SUBKEY_L(27) = SUBL(26) ^ SUBL(28); /* round 20 */ | ||
1081 | CAMELLIA_SUBKEY_R(27) = SUBR(26) ^ SUBR(28); | ||
1082 | CAMELLIA_SUBKEY_L(28) = SUBL(27) ^ SUBL(29); /* round 21 */ | ||
1083 | CAMELLIA_SUBKEY_R(28) = SUBR(27) ^ SUBR(29); | ||
1084 | CAMELLIA_SUBKEY_L(29) = SUBL(28) ^ SUBL(30); /* round 22 */ | ||
1085 | CAMELLIA_SUBKEY_R(29) = SUBR(28) ^ SUBR(30); | ||
1086 | CAMELLIA_SUBKEY_L(30) = SUBL(29) ^ SUBL(31); /* round 23 */ | ||
1087 | CAMELLIA_SUBKEY_R(30) = SUBR(29) ^ SUBR(31); | ||
1088 | CAMELLIA_SUBKEY_L(31) = SUBL(30); /* round 24 */ | ||
1089 | CAMELLIA_SUBKEY_R(31) = SUBR(30); | ||
1090 | CAMELLIA_SUBKEY_L(32) = SUBL(32) ^ SUBL(31); /* kw3 */ | ||
1091 | CAMELLIA_SUBKEY_R(32) = SUBR(32) ^ SUBR(31); | ||
1092 | |||
1093 | /* apply the inverse of the last half of P-function */ | ||
1094 | dw = CAMELLIA_SUBKEY_L(2) ^ CAMELLIA_SUBKEY_R(2), | ||
1095 | dw = CAMELLIA_RL8(dw);/* round 1 */ | ||
1096 | CAMELLIA_SUBKEY_R(2) = CAMELLIA_SUBKEY_L(2) ^ dw, | ||
1097 | CAMELLIA_SUBKEY_L(2) = dw; | ||
1098 | dw = CAMELLIA_SUBKEY_L(3) ^ CAMELLIA_SUBKEY_R(3), | ||
1099 | dw = CAMELLIA_RL8(dw);/* round 2 */ | ||
1100 | CAMELLIA_SUBKEY_R(3) = CAMELLIA_SUBKEY_L(3) ^ dw, | ||
1101 | CAMELLIA_SUBKEY_L(3) = dw; | ||
1102 | dw = CAMELLIA_SUBKEY_L(4) ^ CAMELLIA_SUBKEY_R(4), | ||
1103 | dw = CAMELLIA_RL8(dw);/* round 3 */ | ||
1104 | CAMELLIA_SUBKEY_R(4) = CAMELLIA_SUBKEY_L(4) ^ dw, | ||
1105 | CAMELLIA_SUBKEY_L(4) = dw; | ||
1106 | dw = CAMELLIA_SUBKEY_L(5) ^ CAMELLIA_SUBKEY_R(5), | ||
1107 | dw = CAMELLIA_RL8(dw);/* round 4 */ | ||
1108 | CAMELLIA_SUBKEY_R(5) = CAMELLIA_SUBKEY_L(5) ^ dw, | ||
1109 | CAMELLIA_SUBKEY_L(5) = dw; | ||
1110 | dw = CAMELLIA_SUBKEY_L(6) ^ CAMELLIA_SUBKEY_R(6), | ||
1111 | dw = CAMELLIA_RL8(dw);/* round 5 */ | ||
1112 | CAMELLIA_SUBKEY_R(6) = CAMELLIA_SUBKEY_L(6) ^ dw, | ||
1113 | CAMELLIA_SUBKEY_L(6) = dw; | ||
1114 | dw = CAMELLIA_SUBKEY_L(7) ^ CAMELLIA_SUBKEY_R(7), | ||
1115 | dw = CAMELLIA_RL8(dw);/* round 6 */ | ||
1116 | CAMELLIA_SUBKEY_R(7) = CAMELLIA_SUBKEY_L(7) ^ dw, | ||
1117 | CAMELLIA_SUBKEY_L(7) = dw; | ||
1118 | dw = CAMELLIA_SUBKEY_L(10) ^ CAMELLIA_SUBKEY_R(10), | ||
1119 | dw = CAMELLIA_RL8(dw);/* round 7 */ | ||
1120 | CAMELLIA_SUBKEY_R(10) = CAMELLIA_SUBKEY_L(10) ^ dw, | ||
1121 | CAMELLIA_SUBKEY_L(10) = dw; | ||
1122 | dw = CAMELLIA_SUBKEY_L(11) ^ CAMELLIA_SUBKEY_R(11), | ||
1123 | dw = CAMELLIA_RL8(dw);/* round 8 */ | ||
1124 | CAMELLIA_SUBKEY_R(11) = CAMELLIA_SUBKEY_L(11) ^ dw, | ||
1125 | CAMELLIA_SUBKEY_L(11) = dw; | ||
1126 | dw = CAMELLIA_SUBKEY_L(12) ^ CAMELLIA_SUBKEY_R(12), | ||
1127 | dw = CAMELLIA_RL8(dw);/* round 9 */ | ||
1128 | CAMELLIA_SUBKEY_R(12) = CAMELLIA_SUBKEY_L(12) ^ dw, | ||
1129 | CAMELLIA_SUBKEY_L(12) = dw; | ||
1130 | dw = CAMELLIA_SUBKEY_L(13) ^ CAMELLIA_SUBKEY_R(13), | ||
1131 | dw = CAMELLIA_RL8(dw);/* round 10 */ | ||
1132 | CAMELLIA_SUBKEY_R(13) = CAMELLIA_SUBKEY_L(13) ^ dw, | ||
1133 | CAMELLIA_SUBKEY_L(13) = dw; | ||
1134 | dw = CAMELLIA_SUBKEY_L(14) ^ CAMELLIA_SUBKEY_R(14), | ||
1135 | dw = CAMELLIA_RL8(dw);/* round 11 */ | ||
1136 | CAMELLIA_SUBKEY_R(14) = CAMELLIA_SUBKEY_L(14) ^ dw, | ||
1137 | CAMELLIA_SUBKEY_L(14) = dw; | ||
1138 | dw = CAMELLIA_SUBKEY_L(15) ^ CAMELLIA_SUBKEY_R(15), | ||
1139 | dw = CAMELLIA_RL8(dw);/* round 12 */ | ||
1140 | CAMELLIA_SUBKEY_R(15) = CAMELLIA_SUBKEY_L(15) ^ dw, | ||
1141 | CAMELLIA_SUBKEY_L(15) = dw; | ||
1142 | dw = CAMELLIA_SUBKEY_L(18) ^ CAMELLIA_SUBKEY_R(18), | ||
1143 | dw = CAMELLIA_RL8(dw);/* round 13 */ | ||
1144 | CAMELLIA_SUBKEY_R(18) = CAMELLIA_SUBKEY_L(18) ^ dw, | ||
1145 | CAMELLIA_SUBKEY_L(18) = dw; | ||
1146 | dw = CAMELLIA_SUBKEY_L(19) ^ CAMELLIA_SUBKEY_R(19), | ||
1147 | dw = CAMELLIA_RL8(dw);/* round 14 */ | ||
1148 | CAMELLIA_SUBKEY_R(19) = CAMELLIA_SUBKEY_L(19) ^ dw, | ||
1149 | CAMELLIA_SUBKEY_L(19) = dw; | ||
1150 | dw = CAMELLIA_SUBKEY_L(20) ^ CAMELLIA_SUBKEY_R(20), | ||
1151 | dw = CAMELLIA_RL8(dw);/* round 15 */ | ||
1152 | CAMELLIA_SUBKEY_R(20) = CAMELLIA_SUBKEY_L(20) ^ dw, | ||
1153 | CAMELLIA_SUBKEY_L(20) = dw; | ||
1154 | dw = CAMELLIA_SUBKEY_L(21) ^ CAMELLIA_SUBKEY_R(21), | ||
1155 | dw = CAMELLIA_RL8(dw);/* round 16 */ | ||
1156 | CAMELLIA_SUBKEY_R(21) = CAMELLIA_SUBKEY_L(21) ^ dw, | ||
1157 | CAMELLIA_SUBKEY_L(21) = dw; | ||
1158 | dw = CAMELLIA_SUBKEY_L(22) ^ CAMELLIA_SUBKEY_R(22), | ||
1159 | dw = CAMELLIA_RL8(dw);/* round 17 */ | ||
1160 | CAMELLIA_SUBKEY_R(22) = CAMELLIA_SUBKEY_L(22) ^ dw, | ||
1161 | CAMELLIA_SUBKEY_L(22) = dw; | ||
1162 | dw = CAMELLIA_SUBKEY_L(23) ^ CAMELLIA_SUBKEY_R(23), | ||
1163 | dw = CAMELLIA_RL8(dw);/* round 18 */ | ||
1164 | CAMELLIA_SUBKEY_R(23) = CAMELLIA_SUBKEY_L(23) ^ dw, | ||
1165 | CAMELLIA_SUBKEY_L(23) = dw; | ||
1166 | dw = CAMELLIA_SUBKEY_L(26) ^ CAMELLIA_SUBKEY_R(26), | ||
1167 | dw = CAMELLIA_RL8(dw);/* round 19 */ | ||
1168 | CAMELLIA_SUBKEY_R(26) = CAMELLIA_SUBKEY_L(26) ^ dw, | ||
1169 | CAMELLIA_SUBKEY_L(26) = dw; | ||
1170 | dw = CAMELLIA_SUBKEY_L(27) ^ CAMELLIA_SUBKEY_R(27), | ||
1171 | dw = CAMELLIA_RL8(dw);/* round 20 */ | ||
1172 | CAMELLIA_SUBKEY_R(27) = CAMELLIA_SUBKEY_L(27) ^ dw, | ||
1173 | CAMELLIA_SUBKEY_L(27) = dw; | ||
1174 | dw = CAMELLIA_SUBKEY_L(28) ^ CAMELLIA_SUBKEY_R(28), | ||
1175 | dw = CAMELLIA_RL8(dw);/* round 21 */ | ||
1176 | CAMELLIA_SUBKEY_R(28) = CAMELLIA_SUBKEY_L(28) ^ dw, | ||
1177 | CAMELLIA_SUBKEY_L(28) = dw; | ||
1178 | dw = CAMELLIA_SUBKEY_L(29) ^ CAMELLIA_SUBKEY_R(29), | ||
1179 | dw = CAMELLIA_RL8(dw);/* round 22 */ | ||
1180 | CAMELLIA_SUBKEY_R(29) = CAMELLIA_SUBKEY_L(29) ^ dw, | ||
1181 | CAMELLIA_SUBKEY_L(29) = dw; | ||
1182 | dw = CAMELLIA_SUBKEY_L(30) ^ CAMELLIA_SUBKEY_R(30), | ||
1183 | dw = CAMELLIA_RL8(dw);/* round 23 */ | ||
1184 | CAMELLIA_SUBKEY_R(30) = CAMELLIA_SUBKEY_L(30) ^ dw, | ||
1185 | CAMELLIA_SUBKEY_L(30) = dw; | ||
1186 | dw = CAMELLIA_SUBKEY_L(31) ^ CAMELLIA_SUBKEY_R(31), | ||
1187 | dw = CAMELLIA_RL8(dw);/* round 24 */ | ||
1188 | CAMELLIA_SUBKEY_R(31) = CAMELLIA_SUBKEY_L(31) ^ dw, | ||
1189 | CAMELLIA_SUBKEY_L(31) = dw; | ||
1190 | |||
1191 | return; | ||
1192 | } | 845 | } |
1193 | 846 | ||
1194 | static void camellia_setup192(const unsigned char *key, u32 *subkey) | 847 | static void camellia_setup192(const unsigned char *key, u32 *subkey) |
@@ -1197,482 +850,168 @@ static void camellia_setup192(const unsigned char *key, u32 *subkey) | |||
1197 | u32 krll, krlr, krrl,krrr; | 850 | u32 krll, krlr, krrl,krrr; |
1198 | 851 | ||
1199 | memcpy(kk, key, 24); | 852 | memcpy(kk, key, 24); |
1200 | memcpy((unsigned char *)&krll, key+16,4); | 853 | memcpy((unsigned char *)&krll, key+16, 4); |
1201 | memcpy((unsigned char *)&krlr, key+20,4); | 854 | memcpy((unsigned char *)&krlr, key+20, 4); |
1202 | krrl = ~krll; | 855 | krrl = ~krll; |
1203 | krrr = ~krlr; | 856 | krrr = ~krlr; |
1204 | memcpy(kk+24, (unsigned char *)&krrl, 4); | 857 | memcpy(kk+24, (unsigned char *)&krrl, 4); |
1205 | memcpy(kk+28, (unsigned char *)&krrr, 4); | 858 | memcpy(kk+28, (unsigned char *)&krrr, 4); |
1206 | camellia_setup256(kk, subkey); | 859 | camellia_setup256(kk, subkey); |
1207 | return; | ||
1208 | } | 860 | } |
1209 | 861 | ||
1210 | 862 | ||
1211 | /** | 863 | /* |
1212 | * Stuff related to camellia encryption/decryption | 864 | * Encrypt/decrypt |
1213 | */ | 865 | */ |
1214 | static void camellia_encrypt128(const u32 *subkey, __be32 *io_text) | 866 | #define CAMELLIA_FLS(ll, lr, rl, rr, kll, klr, krl, krr, t0, t1, t2, t3) \ |
1215 | { | 867 | do { \ |
1216 | u32 il,ir,t0,t1; /* temporary valiables */ | 868 | t0 = kll; \ |
1217 | 869 | t2 = krr; \ | |
1218 | u32 io[4]; | 870 | t0 &= ll; \ |
1219 | 871 | t2 |= rr; \ | |
1220 | io[0] = be32_to_cpu(io_text[0]); | 872 | rl ^= t2; \ |
1221 | io[1] = be32_to_cpu(io_text[1]); | 873 | lr ^= ROL1(t0); \ |
1222 | io[2] = be32_to_cpu(io_text[2]); | 874 | t3 = krl; \ |
1223 | io[3] = be32_to_cpu(io_text[3]); | 875 | t1 = klr; \ |
1224 | 876 | t3 &= rl; \ | |
1225 | /* pre whitening but absorb kw2*/ | 877 | t1 |= lr; \ |
1226 | io[0] ^= CAMELLIA_SUBKEY_L(0); | 878 | ll ^= t1; \ |
1227 | io[1] ^= CAMELLIA_SUBKEY_R(0); | 879 | rr ^= ROL1(t3); \ |
1228 | /* main iteration */ | 880 | } while(0) |
1229 | |||
1230 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
1231 | CAMELLIA_SUBKEY_L(2),CAMELLIA_SUBKEY_R(2), | ||
1232 | io[2],io[3],il,ir,t0,t1); | ||
1233 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
1234 | CAMELLIA_SUBKEY_L(3),CAMELLIA_SUBKEY_R(3), | ||
1235 | io[0],io[1],il,ir,t0,t1); | ||
1236 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
1237 | CAMELLIA_SUBKEY_L(4),CAMELLIA_SUBKEY_R(4), | ||
1238 | io[2],io[3],il,ir,t0,t1); | ||
1239 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
1240 | CAMELLIA_SUBKEY_L(5),CAMELLIA_SUBKEY_R(5), | ||
1241 | io[0],io[1],il,ir,t0,t1); | ||
1242 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
1243 | CAMELLIA_SUBKEY_L(6),CAMELLIA_SUBKEY_R(6), | ||
1244 | io[2],io[3],il,ir,t0,t1); | ||
1245 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
1246 | CAMELLIA_SUBKEY_L(7),CAMELLIA_SUBKEY_R(7), | ||
1247 | io[0],io[1],il,ir,t0,t1); | ||
1248 | |||
1249 | CAMELLIA_FLS(io[0],io[1],io[2],io[3], | ||
1250 | CAMELLIA_SUBKEY_L(8),CAMELLIA_SUBKEY_R(8), | ||
1251 | CAMELLIA_SUBKEY_L(9),CAMELLIA_SUBKEY_R(9), | ||
1252 | t0,t1,il,ir); | ||
1253 | |||
1254 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
1255 | CAMELLIA_SUBKEY_L(10),CAMELLIA_SUBKEY_R(10), | ||
1256 | io[2],io[3],il,ir,t0,t1); | ||
1257 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
1258 | CAMELLIA_SUBKEY_L(11),CAMELLIA_SUBKEY_R(11), | ||
1259 | io[0],io[1],il,ir,t0,t1); | ||
1260 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
1261 | CAMELLIA_SUBKEY_L(12),CAMELLIA_SUBKEY_R(12), | ||
1262 | io[2],io[3],il,ir,t0,t1); | ||
1263 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
1264 | CAMELLIA_SUBKEY_L(13),CAMELLIA_SUBKEY_R(13), | ||
1265 | io[0],io[1],il,ir,t0,t1); | ||
1266 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
1267 | CAMELLIA_SUBKEY_L(14),CAMELLIA_SUBKEY_R(14), | ||
1268 | io[2],io[3],il,ir,t0,t1); | ||
1269 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
1270 | CAMELLIA_SUBKEY_L(15),CAMELLIA_SUBKEY_R(15), | ||
1271 | io[0],io[1],il,ir,t0,t1); | ||
1272 | |||
1273 | CAMELLIA_FLS(io[0],io[1],io[2],io[3], | ||
1274 | CAMELLIA_SUBKEY_L(16),CAMELLIA_SUBKEY_R(16), | ||
1275 | CAMELLIA_SUBKEY_L(17),CAMELLIA_SUBKEY_R(17), | ||
1276 | t0,t1,il,ir); | ||
1277 | |||
1278 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
1279 | CAMELLIA_SUBKEY_L(18),CAMELLIA_SUBKEY_R(18), | ||
1280 | io[2],io[3],il,ir,t0,t1); | ||
1281 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
1282 | CAMELLIA_SUBKEY_L(19),CAMELLIA_SUBKEY_R(19), | ||
1283 | io[0],io[1],il,ir,t0,t1); | ||
1284 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
1285 | CAMELLIA_SUBKEY_L(20),CAMELLIA_SUBKEY_R(20), | ||
1286 | io[2],io[3],il,ir,t0,t1); | ||
1287 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
1288 | CAMELLIA_SUBKEY_L(21),CAMELLIA_SUBKEY_R(21), | ||
1289 | io[0],io[1],il,ir,t0,t1); | ||
1290 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
1291 | CAMELLIA_SUBKEY_L(22),CAMELLIA_SUBKEY_R(22), | ||
1292 | io[2],io[3],il,ir,t0,t1); | ||
1293 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
1294 | CAMELLIA_SUBKEY_L(23),CAMELLIA_SUBKEY_R(23), | ||
1295 | io[0],io[1],il,ir,t0,t1); | ||
1296 | 881 | ||
1297 | /* post whitening but kw4 */ | 882 | #define CAMELLIA_ROUNDSM(xl, xr, kl, kr, yl, yr, il, ir) \ |
1298 | io[2] ^= CAMELLIA_SUBKEY_L(24); | 883 | do { \ |
1299 | io[3] ^= CAMELLIA_SUBKEY_R(24); | 884 | ir = camellia_sp1110[(u8)xr]; \ |
1300 | 885 | il = camellia_sp1110[ (xl >> 24)]; \ | |
1301 | t0 = io[0]; | 886 | ir ^= camellia_sp0222[ (xr >> 24)]; \ |
1302 | t1 = io[1]; | 887 | il ^= camellia_sp0222[(u8)(xl >> 16)]; \ |
1303 | io[0] = io[2]; | 888 | ir ^= camellia_sp3033[(u8)(xr >> 16)]; \ |
1304 | io[1] = io[3]; | 889 | il ^= camellia_sp3033[(u8)(xl >> 8)]; \ |
1305 | io[2] = t0; | 890 | ir ^= camellia_sp4404[(u8)(xr >> 8)]; \ |
1306 | io[3] = t1; | 891 | il ^= camellia_sp4404[(u8)xl]; \ |
1307 | 892 | il ^= kl; \ | |
1308 | io_text[0] = cpu_to_be32(io[0]); | 893 | ir ^= il ^ kr; \ |
1309 | io_text[1] = cpu_to_be32(io[1]); | 894 | yl ^= ir; \ |
1310 | io_text[2] = cpu_to_be32(io[2]); | 895 | yr ^= ROR8(il) ^ ir; \ |
1311 | io_text[3] = cpu_to_be32(io[3]); | 896 | } while(0) |
1312 | |||
1313 | return; | ||
1314 | } | ||
1315 | 897 | ||
1316 | static void camellia_decrypt128(const u32 *subkey, __be32 *io_text) | 898 | /* max = 24: 128bit encrypt, max = 32: 256bit encrypt */ |
899 | static void camellia_do_encrypt(const u32 *subkey, u32 *io, unsigned max) | ||
1317 | { | 900 | { |
1318 | u32 il,ir,t0,t1; /* temporary valiables */ | 901 | u32 il,ir,t0,t1; /* temporary variables */ |
1319 | 902 | ||
1320 | u32 io[4]; | 903 | /* pre whitening but absorb kw2 */ |
1321 | 904 | io[0] ^= SUBKEY_L(0); | |
1322 | io[0] = be32_to_cpu(io_text[0]); | 905 | io[1] ^= SUBKEY_R(0); |
1323 | io[1] = be32_to_cpu(io_text[1]); | ||
1324 | io[2] = be32_to_cpu(io_text[2]); | ||
1325 | io[3] = be32_to_cpu(io_text[3]); | ||
1326 | |||
1327 | /* pre whitening but absorb kw2*/ | ||
1328 | io[0] ^= CAMELLIA_SUBKEY_L(24); | ||
1329 | io[1] ^= CAMELLIA_SUBKEY_R(24); | ||
1330 | 906 | ||
1331 | /* main iteration */ | 907 | /* main iteration */ |
1332 | CAMELLIA_ROUNDSM(io[0],io[1], | 908 | #define ROUNDS(i) do { \ |
1333 | CAMELLIA_SUBKEY_L(23),CAMELLIA_SUBKEY_R(23), | 909 | CAMELLIA_ROUNDSM(io[0],io[1], \ |
1334 | io[2],io[3],il,ir,t0,t1); | 910 | SUBKEY_L(i + 2),SUBKEY_R(i + 2), \ |
1335 | CAMELLIA_ROUNDSM(io[2],io[3], | 911 | io[2],io[3],il,ir); \ |
1336 | CAMELLIA_SUBKEY_L(22),CAMELLIA_SUBKEY_R(22), | 912 | CAMELLIA_ROUNDSM(io[2],io[3], \ |
1337 | io[0],io[1],il,ir,t0,t1); | 913 | SUBKEY_L(i + 3),SUBKEY_R(i + 3), \ |
1338 | CAMELLIA_ROUNDSM(io[0],io[1], | 914 | io[0],io[1],il,ir); \ |
1339 | CAMELLIA_SUBKEY_L(21),CAMELLIA_SUBKEY_R(21), | 915 | CAMELLIA_ROUNDSM(io[0],io[1], \ |
1340 | io[2],io[3],il,ir,t0,t1); | 916 | SUBKEY_L(i + 4),SUBKEY_R(i + 4), \ |
1341 | CAMELLIA_ROUNDSM(io[2],io[3], | 917 | io[2],io[3],il,ir); \ |
1342 | CAMELLIA_SUBKEY_L(20),CAMELLIA_SUBKEY_R(20), | 918 | CAMELLIA_ROUNDSM(io[2],io[3], \ |
1343 | io[0],io[1],il,ir,t0,t1); | 919 | SUBKEY_L(i + 5),SUBKEY_R(i + 5), \ |
1344 | CAMELLIA_ROUNDSM(io[0],io[1], | 920 | io[0],io[1],il,ir); \ |
1345 | CAMELLIA_SUBKEY_L(19),CAMELLIA_SUBKEY_R(19), | 921 | CAMELLIA_ROUNDSM(io[0],io[1], \ |
1346 | io[2],io[3],il,ir,t0,t1); | 922 | SUBKEY_L(i + 6),SUBKEY_R(i + 6), \ |
1347 | CAMELLIA_ROUNDSM(io[2],io[3], | 923 | io[2],io[3],il,ir); \ |
1348 | CAMELLIA_SUBKEY_L(18),CAMELLIA_SUBKEY_R(18), | 924 | CAMELLIA_ROUNDSM(io[2],io[3], \ |
1349 | io[0],io[1],il,ir,t0,t1); | 925 | SUBKEY_L(i + 7),SUBKEY_R(i + 7), \ |
1350 | 926 | io[0],io[1],il,ir); \ | |
1351 | CAMELLIA_FLS(io[0],io[1],io[2],io[3], | 927 | } while (0) |
1352 | CAMELLIA_SUBKEY_L(17),CAMELLIA_SUBKEY_R(17), | 928 | #define FLS(i) do { \ |
1353 | CAMELLIA_SUBKEY_L(16),CAMELLIA_SUBKEY_R(16), | 929 | CAMELLIA_FLS(io[0],io[1],io[2],io[3], \ |
1354 | t0,t1,il,ir); | 930 | SUBKEY_L(i + 0),SUBKEY_R(i + 0), \ |
1355 | 931 | SUBKEY_L(i + 1),SUBKEY_R(i + 1), \ | |
1356 | CAMELLIA_ROUNDSM(io[0],io[1], | 932 | t0,t1,il,ir); \ |
1357 | CAMELLIA_SUBKEY_L(15),CAMELLIA_SUBKEY_R(15), | 933 | } while (0) |
1358 | io[2],io[3],il,ir,t0,t1); | 934 | |
1359 | CAMELLIA_ROUNDSM(io[2],io[3], | 935 | ROUNDS(0); |
1360 | CAMELLIA_SUBKEY_L(14),CAMELLIA_SUBKEY_R(14), | 936 | FLS(8); |
1361 | io[0],io[1],il,ir,t0,t1); | 937 | ROUNDS(8); |
1362 | CAMELLIA_ROUNDSM(io[0],io[1], | 938 | FLS(16); |
1363 | CAMELLIA_SUBKEY_L(13),CAMELLIA_SUBKEY_R(13), | 939 | ROUNDS(16); |
1364 | io[2],io[3],il,ir,t0,t1); | 940 | if (max == 32) { |
1365 | CAMELLIA_ROUNDSM(io[2],io[3], | 941 | FLS(24); |
1366 | CAMELLIA_SUBKEY_L(12),CAMELLIA_SUBKEY_R(12), | 942 | ROUNDS(24); |
1367 | io[0],io[1],il,ir,t0,t1); | 943 | } |
1368 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
1369 | CAMELLIA_SUBKEY_L(11),CAMELLIA_SUBKEY_R(11), | ||
1370 | io[2],io[3],il,ir,t0,t1); | ||
1371 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
1372 | CAMELLIA_SUBKEY_L(10),CAMELLIA_SUBKEY_R(10), | ||
1373 | io[0],io[1],il,ir,t0,t1); | ||
1374 | |||
1375 | CAMELLIA_FLS(io[0],io[1],io[2],io[3], | ||
1376 | CAMELLIA_SUBKEY_L(9),CAMELLIA_SUBKEY_R(9), | ||
1377 | CAMELLIA_SUBKEY_L(8),CAMELLIA_SUBKEY_R(8), | ||
1378 | t0,t1,il,ir); | ||
1379 | |||
1380 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
1381 | CAMELLIA_SUBKEY_L(7),CAMELLIA_SUBKEY_R(7), | ||
1382 | io[2],io[3],il,ir,t0,t1); | ||
1383 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
1384 | CAMELLIA_SUBKEY_L(6),CAMELLIA_SUBKEY_R(6), | ||
1385 | io[0],io[1],il,ir,t0,t1); | ||
1386 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
1387 | CAMELLIA_SUBKEY_L(5),CAMELLIA_SUBKEY_R(5), | ||
1388 | io[2],io[3],il,ir,t0,t1); | ||
1389 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
1390 | CAMELLIA_SUBKEY_L(4),CAMELLIA_SUBKEY_R(4), | ||
1391 | io[0],io[1],il,ir,t0,t1); | ||
1392 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
1393 | CAMELLIA_SUBKEY_L(3),CAMELLIA_SUBKEY_R(3), | ||
1394 | io[2],io[3],il,ir,t0,t1); | ||
1395 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
1396 | CAMELLIA_SUBKEY_L(2),CAMELLIA_SUBKEY_R(2), | ||
1397 | io[0],io[1],il,ir,t0,t1); | ||
1398 | |||
1399 | /* post whitening but kw4 */ | ||
1400 | io[2] ^= CAMELLIA_SUBKEY_L(0); | ||
1401 | io[3] ^= CAMELLIA_SUBKEY_R(0); | ||
1402 | |||
1403 | t0 = io[0]; | ||
1404 | t1 = io[1]; | ||
1405 | io[0] = io[2]; | ||
1406 | io[1] = io[3]; | ||
1407 | io[2] = t0; | ||
1408 | io[3] = t1; | ||
1409 | |||
1410 | io_text[0] = cpu_to_be32(io[0]); | ||
1411 | io_text[1] = cpu_to_be32(io[1]); | ||
1412 | io_text[2] = cpu_to_be32(io[2]); | ||
1413 | io_text[3] = cpu_to_be32(io[3]); | ||
1414 | |||
1415 | return; | ||
1416 | } | ||
1417 | |||
1418 | |||
1419 | /** | ||
1420 | * stuff for 192 and 256bit encryption/decryption | ||
1421 | */ | ||
1422 | static void camellia_encrypt256(const u32 *subkey, __be32 *io_text) | ||
1423 | { | ||
1424 | u32 il,ir,t0,t1; /* temporary valiables */ | ||
1425 | |||
1426 | u32 io[4]; | ||
1427 | |||
1428 | io[0] = be32_to_cpu(io_text[0]); | ||
1429 | io[1] = be32_to_cpu(io_text[1]); | ||
1430 | io[2] = be32_to_cpu(io_text[2]); | ||
1431 | io[3] = be32_to_cpu(io_text[3]); | ||
1432 | 944 | ||
1433 | /* pre whitening but absorb kw2*/ | 945 | #undef ROUNDS |
1434 | io[0] ^= CAMELLIA_SUBKEY_L(0); | 946 | #undef FLS |
1435 | io[1] ^= CAMELLIA_SUBKEY_R(0); | ||
1436 | |||
1437 | /* main iteration */ | ||
1438 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
1439 | CAMELLIA_SUBKEY_L(2),CAMELLIA_SUBKEY_R(2), | ||
1440 | io[2],io[3],il,ir,t0,t1); | ||
1441 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
1442 | CAMELLIA_SUBKEY_L(3),CAMELLIA_SUBKEY_R(3), | ||
1443 | io[0],io[1],il,ir,t0,t1); | ||
1444 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
1445 | CAMELLIA_SUBKEY_L(4),CAMELLIA_SUBKEY_R(4), | ||
1446 | io[2],io[3],il,ir,t0,t1); | ||
1447 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
1448 | CAMELLIA_SUBKEY_L(5),CAMELLIA_SUBKEY_R(5), | ||
1449 | io[0],io[1],il,ir,t0,t1); | ||
1450 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
1451 | CAMELLIA_SUBKEY_L(6),CAMELLIA_SUBKEY_R(6), | ||
1452 | io[2],io[3],il,ir,t0,t1); | ||
1453 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
1454 | CAMELLIA_SUBKEY_L(7),CAMELLIA_SUBKEY_R(7), | ||
1455 | io[0],io[1],il,ir,t0,t1); | ||
1456 | |||
1457 | CAMELLIA_FLS(io[0],io[1],io[2],io[3], | ||
1458 | CAMELLIA_SUBKEY_L(8),CAMELLIA_SUBKEY_R(8), | ||
1459 | CAMELLIA_SUBKEY_L(9),CAMELLIA_SUBKEY_R(9), | ||
1460 | t0,t1,il,ir); | ||
1461 | |||
1462 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
1463 | CAMELLIA_SUBKEY_L(10),CAMELLIA_SUBKEY_R(10), | ||
1464 | io[2],io[3],il,ir,t0,t1); | ||
1465 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
1466 | CAMELLIA_SUBKEY_L(11),CAMELLIA_SUBKEY_R(11), | ||
1467 | io[0],io[1],il,ir,t0,t1); | ||
1468 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
1469 | CAMELLIA_SUBKEY_L(12),CAMELLIA_SUBKEY_R(12), | ||
1470 | io[2],io[3],il,ir,t0,t1); | ||
1471 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
1472 | CAMELLIA_SUBKEY_L(13),CAMELLIA_SUBKEY_R(13), | ||
1473 | io[0],io[1],il,ir,t0,t1); | ||
1474 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
1475 | CAMELLIA_SUBKEY_L(14),CAMELLIA_SUBKEY_R(14), | ||
1476 | io[2],io[3],il,ir,t0,t1); | ||
1477 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
1478 | CAMELLIA_SUBKEY_L(15),CAMELLIA_SUBKEY_R(15), | ||
1479 | io[0],io[1],il,ir,t0,t1); | ||
1480 | |||
1481 | CAMELLIA_FLS(io[0],io[1],io[2],io[3], | ||
1482 | CAMELLIA_SUBKEY_L(16),CAMELLIA_SUBKEY_R(16), | ||
1483 | CAMELLIA_SUBKEY_L(17),CAMELLIA_SUBKEY_R(17), | ||
1484 | t0,t1,il,ir); | ||
1485 | |||
1486 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
1487 | CAMELLIA_SUBKEY_L(18),CAMELLIA_SUBKEY_R(18), | ||
1488 | io[2],io[3],il,ir,t0,t1); | ||
1489 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
1490 | CAMELLIA_SUBKEY_L(19),CAMELLIA_SUBKEY_R(19), | ||
1491 | io[0],io[1],il,ir,t0,t1); | ||
1492 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
1493 | CAMELLIA_SUBKEY_L(20),CAMELLIA_SUBKEY_R(20), | ||
1494 | io[2],io[3],il,ir,t0,t1); | ||
1495 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
1496 | CAMELLIA_SUBKEY_L(21),CAMELLIA_SUBKEY_R(21), | ||
1497 | io[0],io[1],il,ir,t0,t1); | ||
1498 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
1499 | CAMELLIA_SUBKEY_L(22),CAMELLIA_SUBKEY_R(22), | ||
1500 | io[2],io[3],il,ir,t0,t1); | ||
1501 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
1502 | CAMELLIA_SUBKEY_L(23),CAMELLIA_SUBKEY_R(23), | ||
1503 | io[0],io[1],il,ir,t0,t1); | ||
1504 | |||
1505 | CAMELLIA_FLS(io[0],io[1],io[2],io[3], | ||
1506 | CAMELLIA_SUBKEY_L(24),CAMELLIA_SUBKEY_R(24), | ||
1507 | CAMELLIA_SUBKEY_L(25),CAMELLIA_SUBKEY_R(25), | ||
1508 | t0,t1,il,ir); | ||
1509 | |||
1510 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
1511 | CAMELLIA_SUBKEY_L(26),CAMELLIA_SUBKEY_R(26), | ||
1512 | io[2],io[3],il,ir,t0,t1); | ||
1513 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
1514 | CAMELLIA_SUBKEY_L(27),CAMELLIA_SUBKEY_R(27), | ||
1515 | io[0],io[1],il,ir,t0,t1); | ||
1516 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
1517 | CAMELLIA_SUBKEY_L(28),CAMELLIA_SUBKEY_R(28), | ||
1518 | io[2],io[3],il,ir,t0,t1); | ||
1519 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
1520 | CAMELLIA_SUBKEY_L(29),CAMELLIA_SUBKEY_R(29), | ||
1521 | io[0],io[1],il,ir,t0,t1); | ||
1522 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
1523 | CAMELLIA_SUBKEY_L(30),CAMELLIA_SUBKEY_R(30), | ||
1524 | io[2],io[3],il,ir,t0,t1); | ||
1525 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
1526 | CAMELLIA_SUBKEY_L(31),CAMELLIA_SUBKEY_R(31), | ||
1527 | io[0],io[1],il,ir,t0,t1); | ||
1528 | 947 | ||
1529 | /* post whitening but kw4 */ | 948 | /* post whitening but kw4 */ |
1530 | io[2] ^= CAMELLIA_SUBKEY_L(32); | 949 | io[2] ^= SUBKEY_L(max); |
1531 | io[3] ^= CAMELLIA_SUBKEY_R(32); | 950 | io[3] ^= SUBKEY_R(max); |
1532 | 951 | /* NB: io[0],[1] should be swapped with [2],[3] by caller! */ | |
1533 | t0 = io[0]; | ||
1534 | t1 = io[1]; | ||
1535 | io[0] = io[2]; | ||
1536 | io[1] = io[3]; | ||
1537 | io[2] = t0; | ||
1538 | io[3] = t1; | ||
1539 | |||
1540 | io_text[0] = cpu_to_be32(io[0]); | ||
1541 | io_text[1] = cpu_to_be32(io[1]); | ||
1542 | io_text[2] = cpu_to_be32(io[2]); | ||
1543 | io_text[3] = cpu_to_be32(io[3]); | ||
1544 | |||
1545 | return; | ||
1546 | } | 952 | } |
1547 | 953 | ||
1548 | 954 | static void camellia_do_decrypt(const u32 *subkey, u32 *io, unsigned i) | |
1549 | static void camellia_decrypt256(const u32 *subkey, __be32 *io_text) | ||
1550 | { | 955 | { |
1551 | u32 il,ir,t0,t1; /* temporary valiables */ | 956 | u32 il,ir,t0,t1; /* temporary variables */ |
1552 | 957 | ||
1553 | u32 io[4]; | 958 | /* pre whitening but absorb kw2 */ |
1554 | 959 | io[0] ^= SUBKEY_L(i); | |
1555 | io[0] = be32_to_cpu(io_text[0]); | 960 | io[1] ^= SUBKEY_R(i); |
1556 | io[1] = be32_to_cpu(io_text[1]); | ||
1557 | io[2] = be32_to_cpu(io_text[2]); | ||
1558 | io[3] = be32_to_cpu(io_text[3]); | ||
1559 | |||
1560 | /* pre whitening but absorb kw2*/ | ||
1561 | io[0] ^= CAMELLIA_SUBKEY_L(32); | ||
1562 | io[1] ^= CAMELLIA_SUBKEY_R(32); | ||
1563 | 961 | ||
1564 | /* main iteration */ | 962 | /* main iteration */ |
1565 | CAMELLIA_ROUNDSM(io[0],io[1], | 963 | #define ROUNDS(i) do { \ |
1566 | CAMELLIA_SUBKEY_L(31),CAMELLIA_SUBKEY_R(31), | 964 | CAMELLIA_ROUNDSM(io[0],io[1], \ |
1567 | io[2],io[3],il,ir,t0,t1); | 965 | SUBKEY_L(i + 7),SUBKEY_R(i + 7), \ |
1568 | CAMELLIA_ROUNDSM(io[2],io[3], | 966 | io[2],io[3],il,ir); \ |
1569 | CAMELLIA_SUBKEY_L(30),CAMELLIA_SUBKEY_R(30), | 967 | CAMELLIA_ROUNDSM(io[2],io[3], \ |
1570 | io[0],io[1],il,ir,t0,t1); | 968 | SUBKEY_L(i + 6),SUBKEY_R(i + 6), \ |
1571 | CAMELLIA_ROUNDSM(io[0],io[1], | 969 | io[0],io[1],il,ir); \ |
1572 | CAMELLIA_SUBKEY_L(29),CAMELLIA_SUBKEY_R(29), | 970 | CAMELLIA_ROUNDSM(io[0],io[1], \ |
1573 | io[2],io[3],il,ir,t0,t1); | 971 | SUBKEY_L(i + 5),SUBKEY_R(i + 5), \ |
1574 | CAMELLIA_ROUNDSM(io[2],io[3], | 972 | io[2],io[3],il,ir); \ |
1575 | CAMELLIA_SUBKEY_L(28),CAMELLIA_SUBKEY_R(28), | 973 | CAMELLIA_ROUNDSM(io[2],io[3], \ |
1576 | io[0],io[1],il,ir,t0,t1); | 974 | SUBKEY_L(i + 4),SUBKEY_R(i + 4), \ |
1577 | CAMELLIA_ROUNDSM(io[0],io[1], | 975 | io[0],io[1],il,ir); \ |
1578 | CAMELLIA_SUBKEY_L(27),CAMELLIA_SUBKEY_R(27), | 976 | CAMELLIA_ROUNDSM(io[0],io[1], \ |
1579 | io[2],io[3],il,ir,t0,t1); | 977 | SUBKEY_L(i + 3),SUBKEY_R(i + 3), \ |
1580 | CAMELLIA_ROUNDSM(io[2],io[3], | 978 | io[2],io[3],il,ir); \ |
1581 | CAMELLIA_SUBKEY_L(26),CAMELLIA_SUBKEY_R(26), | 979 | CAMELLIA_ROUNDSM(io[2],io[3], \ |
1582 | io[0],io[1],il,ir,t0,t1); | 980 | SUBKEY_L(i + 2),SUBKEY_R(i + 2), \ |
1583 | 981 | io[0],io[1],il,ir); \ | |
1584 | CAMELLIA_FLS(io[0],io[1],io[2],io[3], | 982 | } while (0) |
1585 | CAMELLIA_SUBKEY_L(25),CAMELLIA_SUBKEY_R(25), | 983 | #define FLS(i) do { \ |
1586 | CAMELLIA_SUBKEY_L(24),CAMELLIA_SUBKEY_R(24), | 984 | CAMELLIA_FLS(io[0],io[1],io[2],io[3], \ |
1587 | t0,t1,il,ir); | 985 | SUBKEY_L(i + 1),SUBKEY_R(i + 1), \ |
1588 | 986 | SUBKEY_L(i + 0),SUBKEY_R(i + 0), \ | |
1589 | CAMELLIA_ROUNDSM(io[0],io[1], | 987 | t0,t1,il,ir); \ |
1590 | CAMELLIA_SUBKEY_L(23),CAMELLIA_SUBKEY_R(23), | 988 | } while (0) |
1591 | io[2],io[3],il,ir,t0,t1); | 989 | |
1592 | CAMELLIA_ROUNDSM(io[2],io[3], | 990 | if (i == 32) { |
1593 | CAMELLIA_SUBKEY_L(22),CAMELLIA_SUBKEY_R(22), | 991 | ROUNDS(24); |
1594 | io[0],io[1],il,ir,t0,t1); | 992 | FLS(24); |
1595 | CAMELLIA_ROUNDSM(io[0],io[1], | 993 | } |
1596 | CAMELLIA_SUBKEY_L(21),CAMELLIA_SUBKEY_R(21), | 994 | ROUNDS(16); |
1597 | io[2],io[3],il,ir,t0,t1); | 995 | FLS(16); |
1598 | CAMELLIA_ROUNDSM(io[2],io[3], | 996 | ROUNDS(8); |
1599 | CAMELLIA_SUBKEY_L(20),CAMELLIA_SUBKEY_R(20), | 997 | FLS(8); |
1600 | io[0],io[1],il,ir,t0,t1); | 998 | ROUNDS(0); |
1601 | CAMELLIA_ROUNDSM(io[0],io[1], | 999 | |
1602 | CAMELLIA_SUBKEY_L(19),CAMELLIA_SUBKEY_R(19), | 1000 | #undef ROUNDS |
1603 | io[2],io[3],il,ir,t0,t1); | 1001 | #undef FLS |
1604 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
1605 | CAMELLIA_SUBKEY_L(18),CAMELLIA_SUBKEY_R(18), | ||
1606 | io[0],io[1],il,ir,t0,t1); | ||
1607 | |||
1608 | CAMELLIA_FLS(io[0],io[1],io[2],io[3], | ||
1609 | CAMELLIA_SUBKEY_L(17),CAMELLIA_SUBKEY_R(17), | ||
1610 | CAMELLIA_SUBKEY_L(16),CAMELLIA_SUBKEY_R(16), | ||
1611 | t0,t1,il,ir); | ||
1612 | |||
1613 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
1614 | CAMELLIA_SUBKEY_L(15),CAMELLIA_SUBKEY_R(15), | ||
1615 | io[2],io[3],il,ir,t0,t1); | ||
1616 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
1617 | CAMELLIA_SUBKEY_L(14),CAMELLIA_SUBKEY_R(14), | ||
1618 | io[0],io[1],il,ir,t0,t1); | ||
1619 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
1620 | CAMELLIA_SUBKEY_L(13),CAMELLIA_SUBKEY_R(13), | ||
1621 | io[2],io[3],il,ir,t0,t1); | ||
1622 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
1623 | CAMELLIA_SUBKEY_L(12),CAMELLIA_SUBKEY_R(12), | ||
1624 | io[0],io[1],il,ir,t0,t1); | ||
1625 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
1626 | CAMELLIA_SUBKEY_L(11),CAMELLIA_SUBKEY_R(11), | ||
1627 | io[2],io[3],il,ir,t0,t1); | ||
1628 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
1629 | CAMELLIA_SUBKEY_L(10),CAMELLIA_SUBKEY_R(10), | ||
1630 | io[0],io[1],il,ir,t0,t1); | ||
1631 | |||
1632 | CAMELLIA_FLS(io[0],io[1],io[2],io[3], | ||
1633 | CAMELLIA_SUBKEY_L(9),CAMELLIA_SUBKEY_R(9), | ||
1634 | CAMELLIA_SUBKEY_L(8),CAMELLIA_SUBKEY_R(8), | ||
1635 | t0,t1,il,ir); | ||
1636 | |||
1637 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
1638 | CAMELLIA_SUBKEY_L(7),CAMELLIA_SUBKEY_R(7), | ||
1639 | io[2],io[3],il,ir,t0,t1); | ||
1640 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
1641 | CAMELLIA_SUBKEY_L(6),CAMELLIA_SUBKEY_R(6), | ||
1642 | io[0],io[1],il,ir,t0,t1); | ||
1643 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
1644 | CAMELLIA_SUBKEY_L(5),CAMELLIA_SUBKEY_R(5), | ||
1645 | io[2],io[3],il,ir,t0,t1); | ||
1646 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
1647 | CAMELLIA_SUBKEY_L(4),CAMELLIA_SUBKEY_R(4), | ||
1648 | io[0],io[1],il,ir,t0,t1); | ||
1649 | CAMELLIA_ROUNDSM(io[0],io[1], | ||
1650 | CAMELLIA_SUBKEY_L(3),CAMELLIA_SUBKEY_R(3), | ||
1651 | io[2],io[3],il,ir,t0,t1); | ||
1652 | CAMELLIA_ROUNDSM(io[2],io[3], | ||
1653 | CAMELLIA_SUBKEY_L(2),CAMELLIA_SUBKEY_R(2), | ||
1654 | io[0],io[1],il,ir,t0,t1); | ||
1655 | 1002 | ||
1656 | /* post whitening but kw4 */ | 1003 | /* post whitening but kw4 */ |
1657 | io[2] ^= CAMELLIA_SUBKEY_L(0); | 1004 | io[2] ^= SUBKEY_L(0); |
1658 | io[3] ^= CAMELLIA_SUBKEY_R(0); | 1005 | io[3] ^= SUBKEY_R(0); |
1659 | 1006 | /* NB: 0,1 should be swapped with 2,3 by caller! */ | |
1660 | t0 = io[0]; | ||
1661 | t1 = io[1]; | ||
1662 | io[0] = io[2]; | ||
1663 | io[1] = io[3]; | ||
1664 | io[2] = t0; | ||
1665 | io[3] = t1; | ||
1666 | |||
1667 | io_text[0] = cpu_to_be32(io[0]); | ||
1668 | io_text[1] = cpu_to_be32(io[1]); | ||
1669 | io_text[2] = cpu_to_be32(io[2]); | ||
1670 | io_text[3] = cpu_to_be32(io[3]); | ||
1671 | |||
1672 | return; | ||
1673 | } | 1007 | } |
1674 | 1008 | ||
1675 | 1009 | ||
1010 | struct camellia_ctx { | ||
1011 | int key_length; | ||
1012 | u32 key_table[CAMELLIA_TABLE_BYTE_LEN / sizeof(u32)]; | ||
1013 | }; | ||
1014 | |||
1676 | static int | 1015 | static int |
1677 | camellia_set_key(struct crypto_tfm *tfm, const u8 *in_key, | 1016 | camellia_set_key(struct crypto_tfm *tfm, const u8 *in_key, |
1678 | unsigned int key_len) | 1017 | unsigned int key_len) |
@@ -1688,7 +1027,7 @@ camellia_set_key(struct crypto_tfm *tfm, const u8 *in_key, | |||
1688 | 1027 | ||
1689 | cctx->key_length = key_len; | 1028 | cctx->key_length = key_len; |
1690 | 1029 | ||
1691 | switch(key_len) { | 1030 | switch (key_len) { |
1692 | case 16: | 1031 | case 16: |
1693 | camellia_setup128(key, cctx->key_table); | 1032 | camellia_setup128(key, cctx->key_table); |
1694 | break; | 1033 | break; |
@@ -1698,68 +1037,59 @@ camellia_set_key(struct crypto_tfm *tfm, const u8 *in_key, | |||
1698 | case 32: | 1037 | case 32: |
1699 | camellia_setup256(key, cctx->key_table); | 1038 | camellia_setup256(key, cctx->key_table); |
1700 | break; | 1039 | break; |
1701 | default: | ||
1702 | break; | ||
1703 | } | 1040 | } |
1704 | 1041 | ||
1705 | return 0; | 1042 | return 0; |
1706 | } | 1043 | } |
1707 | 1044 | ||
1708 | |||
1709 | static void camellia_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) | 1045 | static void camellia_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) |
1710 | { | 1046 | { |
1711 | const struct camellia_ctx *cctx = crypto_tfm_ctx(tfm); | 1047 | const struct camellia_ctx *cctx = crypto_tfm_ctx(tfm); |
1712 | const __be32 *src = (const __be32 *)in; | 1048 | const __be32 *src = (const __be32 *)in; |
1713 | __be32 *dst = (__be32 *)out; | 1049 | __be32 *dst = (__be32 *)out; |
1714 | 1050 | ||
1715 | __be32 tmp[4]; | 1051 | u32 tmp[4]; |
1716 | 1052 | ||
1717 | memcpy(tmp, src, CAMELLIA_BLOCK_SIZE); | 1053 | tmp[0] = be32_to_cpu(src[0]); |
1054 | tmp[1] = be32_to_cpu(src[1]); | ||
1055 | tmp[2] = be32_to_cpu(src[2]); | ||
1056 | tmp[3] = be32_to_cpu(src[3]); | ||
1718 | 1057 | ||
1719 | switch (cctx->key_length) { | 1058 | camellia_do_encrypt(cctx->key_table, tmp, |
1720 | case 16: | 1059 | cctx->key_length == 16 ? 24 : 32 /* for key lengths of 24 and 32 */ |
1721 | camellia_encrypt128(cctx->key_table, tmp); | 1060 | ); |
1722 | break; | ||
1723 | case 24: | ||
1724 | /* fall through */ | ||
1725 | case 32: | ||
1726 | camellia_encrypt256(cctx->key_table, tmp); | ||
1727 | break; | ||
1728 | default: | ||
1729 | break; | ||
1730 | } | ||
1731 | 1061 | ||
1732 | memcpy(dst, tmp, CAMELLIA_BLOCK_SIZE); | 1062 | /* do_encrypt returns 0,1 swapped with 2,3 */ |
1063 | dst[0] = cpu_to_be32(tmp[2]); | ||
1064 | dst[1] = cpu_to_be32(tmp[3]); | ||
1065 | dst[2] = cpu_to_be32(tmp[0]); | ||
1066 | dst[3] = cpu_to_be32(tmp[1]); | ||
1733 | } | 1067 | } |
1734 | 1068 | ||
1735 | |||
1736 | static void camellia_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) | 1069 | static void camellia_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) |
1737 | { | 1070 | { |
1738 | const struct camellia_ctx *cctx = crypto_tfm_ctx(tfm); | 1071 | const struct camellia_ctx *cctx = crypto_tfm_ctx(tfm); |
1739 | const __be32 *src = (const __be32 *)in; | 1072 | const __be32 *src = (const __be32 *)in; |
1740 | __be32 *dst = (__be32 *)out; | 1073 | __be32 *dst = (__be32 *)out; |
1741 | 1074 | ||
1742 | __be32 tmp[4]; | 1075 | u32 tmp[4]; |
1743 | 1076 | ||
1744 | memcpy(tmp, src, CAMELLIA_BLOCK_SIZE); | 1077 | tmp[0] = be32_to_cpu(src[0]); |
1078 | tmp[1] = be32_to_cpu(src[1]); | ||
1079 | tmp[2] = be32_to_cpu(src[2]); | ||
1080 | tmp[3] = be32_to_cpu(src[3]); | ||
1745 | 1081 | ||
1746 | switch (cctx->key_length) { | 1082 | camellia_do_decrypt(cctx->key_table, tmp, |
1747 | case 16: | 1083 | cctx->key_length == 16 ? 24 : 32 /* for key lengths of 24 and 32 */ |
1748 | camellia_decrypt128(cctx->key_table, tmp); | 1084 | ); |
1749 | break; | ||
1750 | case 24: | ||
1751 | /* fall through */ | ||
1752 | case 32: | ||
1753 | camellia_decrypt256(cctx->key_table, tmp); | ||
1754 | break; | ||
1755 | default: | ||
1756 | break; | ||
1757 | } | ||
1758 | 1085 | ||
1759 | memcpy(dst, tmp, CAMELLIA_BLOCK_SIZE); | 1086 | /* do_decrypt returns 0,1 swapped with 2,3 */ |
1087 | dst[0] = cpu_to_be32(tmp[2]); | ||
1088 | dst[1] = cpu_to_be32(tmp[3]); | ||
1089 | dst[2] = cpu_to_be32(tmp[0]); | ||
1090 | dst[3] = cpu_to_be32(tmp[1]); | ||
1760 | } | 1091 | } |
1761 | 1092 | ||
1762 | |||
1763 | static struct crypto_alg camellia_alg = { | 1093 | static struct crypto_alg camellia_alg = { |
1764 | .cra_name = "camellia", | 1094 | .cra_name = "camellia", |
1765 | .cra_driver_name = "camellia-generic", | 1095 | .cra_driver_name = "camellia-generic", |
@@ -1786,16 +1116,13 @@ static int __init camellia_init(void) | |||
1786 | return crypto_register_alg(&camellia_alg); | 1116 | return crypto_register_alg(&camellia_alg); |
1787 | } | 1117 | } |
1788 | 1118 | ||
1789 | |||
1790 | static void __exit camellia_fini(void) | 1119 | static void __exit camellia_fini(void) |
1791 | { | 1120 | { |
1792 | crypto_unregister_alg(&camellia_alg); | 1121 | crypto_unregister_alg(&camellia_alg); |
1793 | } | 1122 | } |
1794 | 1123 | ||
1795 | |||
1796 | module_init(camellia_init); | 1124 | module_init(camellia_init); |
1797 | module_exit(camellia_fini); | 1125 | module_exit(camellia_fini); |
1798 | 1126 | ||
1799 | |||
1800 | MODULE_DESCRIPTION("Camellia Cipher Algorithm"); | 1127 | MODULE_DESCRIPTION("Camellia Cipher Algorithm"); |
1801 | MODULE_LICENSE("GPL"); | 1128 | MODULE_LICENSE("GPL"); |
diff --git a/crypto/cast6.c b/crypto/cast6.c index 136ab6dfe8c5..5fd9420dc58e 100644 --- a/crypto/cast6.c +++ b/crypto/cast6.c | |||
@@ -369,7 +369,7 @@ static const u8 Tr[4][8] = { | |||
369 | }; | 369 | }; |
370 | 370 | ||
371 | /* forward octave */ | 371 | /* forward octave */ |
372 | static inline void W(u32 *key, unsigned int i) { | 372 | static void W(u32 *key, unsigned int i) { |
373 | u32 I; | 373 | u32 I; |
374 | key[6] ^= F1(key[7], Tr[i % 4][0], Tm[i][0]); | 374 | key[6] ^= F1(key[7], Tr[i % 4][0], Tm[i][0]); |
375 | key[5] ^= F2(key[6], Tr[i % 4][1], Tm[i][1]); | 375 | key[5] ^= F2(key[6], Tr[i % 4][1], Tm[i][1]); |
@@ -428,7 +428,7 @@ static int cast6_setkey(struct crypto_tfm *tfm, const u8 *in_key, | |||
428 | } | 428 | } |
429 | 429 | ||
430 | /*forward quad round*/ | 430 | /*forward quad round*/ |
431 | static inline void Q (u32 * block, u8 * Kr, u32 * Km) { | 431 | static void Q (u32 * block, u8 * Kr, u32 * Km) { |
432 | u32 I; | 432 | u32 I; |
433 | block[2] ^= F1(block[3], Kr[0], Km[0]); | 433 | block[2] ^= F1(block[3], Kr[0], Km[0]); |
434 | block[1] ^= F2(block[2], Kr[1], Km[1]); | 434 | block[1] ^= F2(block[2], Kr[1], Km[1]); |
@@ -437,7 +437,7 @@ static inline void Q (u32 * block, u8 * Kr, u32 * Km) { | |||
437 | } | 437 | } |
438 | 438 | ||
439 | /*reverse quad round*/ | 439 | /*reverse quad round*/ |
440 | static inline void QBAR (u32 * block, u8 * Kr, u32 * Km) { | 440 | static void QBAR (u32 * block, u8 * Kr, u32 * Km) { |
441 | u32 I; | 441 | u32 I; |
442 | block[3] ^= F1(block[0], Kr[3], Km[3]); | 442 | block[3] ^= F1(block[0], Kr[3], Km[3]); |
443 | block[0] ^= F3(block[1], Kr[2], Km[2]); | 443 | block[0] ^= F3(block[1], Kr[2], Km[2]); |
diff --git a/crypto/cbc.c b/crypto/cbc.c index 1f2649e13b42..6affff882cf8 100644 --- a/crypto/cbc.c +++ b/crypto/cbc.c | |||
@@ -14,13 +14,13 @@ | |||
14 | #include <linux/err.h> | 14 | #include <linux/err.h> |
15 | #include <linux/init.h> | 15 | #include <linux/init.h> |
16 | #include <linux/kernel.h> | 16 | #include <linux/kernel.h> |
17 | #include <linux/log2.h> | ||
17 | #include <linux/module.h> | 18 | #include <linux/module.h> |
18 | #include <linux/scatterlist.h> | 19 | #include <linux/scatterlist.h> |
19 | #include <linux/slab.h> | 20 | #include <linux/slab.h> |
20 | 21 | ||
21 | struct crypto_cbc_ctx { | 22 | struct crypto_cbc_ctx { |
22 | struct crypto_cipher *child; | 23 | struct crypto_cipher *child; |
23 | void (*xor)(u8 *dst, const u8 *src, unsigned int bs); | ||
24 | }; | 24 | }; |
25 | 25 | ||
26 | static int crypto_cbc_setkey(struct crypto_tfm *parent, const u8 *key, | 26 | static int crypto_cbc_setkey(struct crypto_tfm *parent, const u8 *key, |
@@ -41,9 +41,7 @@ static int crypto_cbc_setkey(struct crypto_tfm *parent, const u8 *key, | |||
41 | 41 | ||
42 | static int crypto_cbc_encrypt_segment(struct blkcipher_desc *desc, | 42 | static int crypto_cbc_encrypt_segment(struct blkcipher_desc *desc, |
43 | struct blkcipher_walk *walk, | 43 | struct blkcipher_walk *walk, |
44 | struct crypto_cipher *tfm, | 44 | struct crypto_cipher *tfm) |
45 | void (*xor)(u8 *, const u8 *, | ||
46 | unsigned int)) | ||
47 | { | 45 | { |
48 | void (*fn)(struct crypto_tfm *, u8 *, const u8 *) = | 46 | void (*fn)(struct crypto_tfm *, u8 *, const u8 *) = |
49 | crypto_cipher_alg(tfm)->cia_encrypt; | 47 | crypto_cipher_alg(tfm)->cia_encrypt; |
@@ -54,7 +52,7 @@ static int crypto_cbc_encrypt_segment(struct blkcipher_desc *desc, | |||
54 | u8 *iv = walk->iv; | 52 | u8 *iv = walk->iv; |
55 | 53 | ||
56 | do { | 54 | do { |
57 | xor(iv, src, bsize); | 55 | crypto_xor(iv, src, bsize); |
58 | fn(crypto_cipher_tfm(tfm), dst, iv); | 56 | fn(crypto_cipher_tfm(tfm), dst, iv); |
59 | memcpy(iv, dst, bsize); | 57 | memcpy(iv, dst, bsize); |
60 | 58 | ||
@@ -67,9 +65,7 @@ static int crypto_cbc_encrypt_segment(struct blkcipher_desc *desc, | |||
67 | 65 | ||
68 | static int crypto_cbc_encrypt_inplace(struct blkcipher_desc *desc, | 66 | static int crypto_cbc_encrypt_inplace(struct blkcipher_desc *desc, |
69 | struct blkcipher_walk *walk, | 67 | struct blkcipher_walk *walk, |
70 | struct crypto_cipher *tfm, | 68 | struct crypto_cipher *tfm) |
71 | void (*xor)(u8 *, const u8 *, | ||
72 | unsigned int)) | ||
73 | { | 69 | { |
74 | void (*fn)(struct crypto_tfm *, u8 *, const u8 *) = | 70 | void (*fn)(struct crypto_tfm *, u8 *, const u8 *) = |
75 | crypto_cipher_alg(tfm)->cia_encrypt; | 71 | crypto_cipher_alg(tfm)->cia_encrypt; |
@@ -79,7 +75,7 @@ static int crypto_cbc_encrypt_inplace(struct blkcipher_desc *desc, | |||
79 | u8 *iv = walk->iv; | 75 | u8 *iv = walk->iv; |
80 | 76 | ||
81 | do { | 77 | do { |
82 | xor(src, iv, bsize); | 78 | crypto_xor(src, iv, bsize); |
83 | fn(crypto_cipher_tfm(tfm), src, src); | 79 | fn(crypto_cipher_tfm(tfm), src, src); |
84 | iv = src; | 80 | iv = src; |
85 | 81 | ||
@@ -99,7 +95,6 @@ static int crypto_cbc_encrypt(struct blkcipher_desc *desc, | |||
99 | struct crypto_blkcipher *tfm = desc->tfm; | 95 | struct crypto_blkcipher *tfm = desc->tfm; |
100 | struct crypto_cbc_ctx *ctx = crypto_blkcipher_ctx(tfm); | 96 | struct crypto_cbc_ctx *ctx = crypto_blkcipher_ctx(tfm); |
101 | struct crypto_cipher *child = ctx->child; | 97 | struct crypto_cipher *child = ctx->child; |
102 | void (*xor)(u8 *, const u8 *, unsigned int bs) = ctx->xor; | ||
103 | int err; | 98 | int err; |
104 | 99 | ||
105 | blkcipher_walk_init(&walk, dst, src, nbytes); | 100 | blkcipher_walk_init(&walk, dst, src, nbytes); |
@@ -107,11 +102,9 @@ static int crypto_cbc_encrypt(struct blkcipher_desc *desc, | |||
107 | 102 | ||
108 | while ((nbytes = walk.nbytes)) { | 103 | while ((nbytes = walk.nbytes)) { |
109 | if (walk.src.virt.addr == walk.dst.virt.addr) | 104 | if (walk.src.virt.addr == walk.dst.virt.addr) |
110 | nbytes = crypto_cbc_encrypt_inplace(desc, &walk, child, | 105 | nbytes = crypto_cbc_encrypt_inplace(desc, &walk, child); |
111 | xor); | ||
112 | else | 106 | else |
113 | nbytes = crypto_cbc_encrypt_segment(desc, &walk, child, | 107 | nbytes = crypto_cbc_encrypt_segment(desc, &walk, child); |
114 | xor); | ||
115 | err = blkcipher_walk_done(desc, &walk, nbytes); | 108 | err = blkcipher_walk_done(desc, &walk, nbytes); |
116 | } | 109 | } |
117 | 110 | ||
@@ -120,9 +113,7 @@ static int crypto_cbc_encrypt(struct blkcipher_desc *desc, | |||
120 | 113 | ||
121 | static int crypto_cbc_decrypt_segment(struct blkcipher_desc *desc, | 114 | static int crypto_cbc_decrypt_segment(struct blkcipher_desc *desc, |
122 | struct blkcipher_walk *walk, | 115 | struct blkcipher_walk *walk, |
123 | struct crypto_cipher *tfm, | 116 | struct crypto_cipher *tfm) |
124 | void (*xor)(u8 *, const u8 *, | ||
125 | unsigned int)) | ||
126 | { | 117 | { |
127 | void (*fn)(struct crypto_tfm *, u8 *, const u8 *) = | 118 | void (*fn)(struct crypto_tfm *, u8 *, const u8 *) = |
128 | crypto_cipher_alg(tfm)->cia_decrypt; | 119 | crypto_cipher_alg(tfm)->cia_decrypt; |
@@ -134,7 +125,7 @@ static int crypto_cbc_decrypt_segment(struct blkcipher_desc *desc, | |||
134 | 125 | ||
135 | do { | 126 | do { |
136 | fn(crypto_cipher_tfm(tfm), dst, src); | 127 | fn(crypto_cipher_tfm(tfm), dst, src); |
137 | xor(dst, iv, bsize); | 128 | crypto_xor(dst, iv, bsize); |
138 | iv = src; | 129 | iv = src; |
139 | 130 | ||
140 | src += bsize; | 131 | src += bsize; |
@@ -148,34 +139,29 @@ static int crypto_cbc_decrypt_segment(struct blkcipher_desc *desc, | |||
148 | 139 | ||
149 | static int crypto_cbc_decrypt_inplace(struct blkcipher_desc *desc, | 140 | static int crypto_cbc_decrypt_inplace(struct blkcipher_desc *desc, |
150 | struct blkcipher_walk *walk, | 141 | struct blkcipher_walk *walk, |
151 | struct crypto_cipher *tfm, | 142 | struct crypto_cipher *tfm) |
152 | void (*xor)(u8 *, const u8 *, | ||
153 | unsigned int)) | ||
154 | { | 143 | { |
155 | void (*fn)(struct crypto_tfm *, u8 *, const u8 *) = | 144 | void (*fn)(struct crypto_tfm *, u8 *, const u8 *) = |
156 | crypto_cipher_alg(tfm)->cia_decrypt; | 145 | crypto_cipher_alg(tfm)->cia_decrypt; |
157 | int bsize = crypto_cipher_blocksize(tfm); | 146 | int bsize = crypto_cipher_blocksize(tfm); |
158 | unsigned long alignmask = crypto_cipher_alignmask(tfm); | ||
159 | unsigned int nbytes = walk->nbytes; | 147 | unsigned int nbytes = walk->nbytes; |
160 | u8 *src = walk->src.virt.addr; | 148 | u8 *src = walk->src.virt.addr; |
161 | u8 stack[bsize + alignmask]; | 149 | u8 last_iv[bsize]; |
162 | u8 *first_iv = (u8 *)ALIGN((unsigned long)stack, alignmask + 1); | ||
163 | |||
164 | memcpy(first_iv, walk->iv, bsize); | ||
165 | 150 | ||
166 | /* Start of the last block. */ | 151 | /* Start of the last block. */ |
167 | src += nbytes - nbytes % bsize - bsize; | 152 | src += nbytes - (nbytes & (bsize - 1)) - bsize; |
168 | memcpy(walk->iv, src, bsize); | 153 | memcpy(last_iv, src, bsize); |
169 | 154 | ||
170 | for (;;) { | 155 | for (;;) { |
171 | fn(crypto_cipher_tfm(tfm), src, src); | 156 | fn(crypto_cipher_tfm(tfm), src, src); |
172 | if ((nbytes -= bsize) < bsize) | 157 | if ((nbytes -= bsize) < bsize) |
173 | break; | 158 | break; |
174 | xor(src, src - bsize, bsize); | 159 | crypto_xor(src, src - bsize, bsize); |
175 | src -= bsize; | 160 | src -= bsize; |
176 | } | 161 | } |
177 | 162 | ||
178 | xor(src, first_iv, bsize); | 163 | crypto_xor(src, walk->iv, bsize); |
164 | memcpy(walk->iv, last_iv, bsize); | ||
179 | 165 | ||
180 | return nbytes; | 166 | return nbytes; |
181 | } | 167 | } |
@@ -188,7 +174,6 @@ static int crypto_cbc_decrypt(struct blkcipher_desc *desc, | |||
188 | struct crypto_blkcipher *tfm = desc->tfm; | 174 | struct crypto_blkcipher *tfm = desc->tfm; |
189 | struct crypto_cbc_ctx *ctx = crypto_blkcipher_ctx(tfm); | 175 | struct crypto_cbc_ctx *ctx = crypto_blkcipher_ctx(tfm); |
190 | struct crypto_cipher *child = ctx->child; | 176 | struct crypto_cipher *child = ctx->child; |
191 | void (*xor)(u8 *, const u8 *, unsigned int bs) = ctx->xor; | ||
192 | int err; | 177 | int err; |
193 | 178 | ||
194 | blkcipher_walk_init(&walk, dst, src, nbytes); | 179 | blkcipher_walk_init(&walk, dst, src, nbytes); |
@@ -196,48 +181,15 @@ static int crypto_cbc_decrypt(struct blkcipher_desc *desc, | |||
196 | 181 | ||
197 | while ((nbytes = walk.nbytes)) { | 182 | while ((nbytes = walk.nbytes)) { |
198 | if (walk.src.virt.addr == walk.dst.virt.addr) | 183 | if (walk.src.virt.addr == walk.dst.virt.addr) |
199 | nbytes = crypto_cbc_decrypt_inplace(desc, &walk, child, | 184 | nbytes = crypto_cbc_decrypt_inplace(desc, &walk, child); |
200 | xor); | ||
201 | else | 185 | else |
202 | nbytes = crypto_cbc_decrypt_segment(desc, &walk, child, | 186 | nbytes = crypto_cbc_decrypt_segment(desc, &walk, child); |
203 | xor); | ||
204 | err = blkcipher_walk_done(desc, &walk, nbytes); | 187 | err = blkcipher_walk_done(desc, &walk, nbytes); |
205 | } | 188 | } |
206 | 189 | ||
207 | return err; | 190 | return err; |
208 | } | 191 | } |
209 | 192 | ||
210 | static void xor_byte(u8 *a, const u8 *b, unsigned int bs) | ||
211 | { | ||
212 | do { | ||
213 | *a++ ^= *b++; | ||
214 | } while (--bs); | ||
215 | } | ||
216 | |||
217 | static void xor_quad(u8 *dst, const u8 *src, unsigned int bs) | ||
218 | { | ||
219 | u32 *a = (u32 *)dst; | ||
220 | u32 *b = (u32 *)src; | ||
221 | |||
222 | do { | ||
223 | *a++ ^= *b++; | ||
224 | } while ((bs -= 4)); | ||
225 | } | ||
226 | |||
227 | static void xor_64(u8 *a, const u8 *b, unsigned int bs) | ||
228 | { | ||
229 | ((u32 *)a)[0] ^= ((u32 *)b)[0]; | ||
230 | ((u32 *)a)[1] ^= ((u32 *)b)[1]; | ||
231 | } | ||
232 | |||
233 | static void xor_128(u8 *a, const u8 *b, unsigned int bs) | ||
234 | { | ||
235 | ((u32 *)a)[0] ^= ((u32 *)b)[0]; | ||
236 | ((u32 *)a)[1] ^= ((u32 *)b)[1]; | ||
237 | ((u32 *)a)[2] ^= ((u32 *)b)[2]; | ||
238 | ((u32 *)a)[3] ^= ((u32 *)b)[3]; | ||
239 | } | ||
240 | |||
241 | static int crypto_cbc_init_tfm(struct crypto_tfm *tfm) | 193 | static int crypto_cbc_init_tfm(struct crypto_tfm *tfm) |
242 | { | 194 | { |
243 | struct crypto_instance *inst = (void *)tfm->__crt_alg; | 195 | struct crypto_instance *inst = (void *)tfm->__crt_alg; |
@@ -245,22 +197,6 @@ static int crypto_cbc_init_tfm(struct crypto_tfm *tfm) | |||
245 | struct crypto_cbc_ctx *ctx = crypto_tfm_ctx(tfm); | 197 | struct crypto_cbc_ctx *ctx = crypto_tfm_ctx(tfm); |
246 | struct crypto_cipher *cipher; | 198 | struct crypto_cipher *cipher; |
247 | 199 | ||
248 | switch (crypto_tfm_alg_blocksize(tfm)) { | ||
249 | case 8: | ||
250 | ctx->xor = xor_64; | ||
251 | break; | ||
252 | |||
253 | case 16: | ||
254 | ctx->xor = xor_128; | ||
255 | break; | ||
256 | |||
257 | default: | ||
258 | if (crypto_tfm_alg_blocksize(tfm) % 4) | ||
259 | ctx->xor = xor_byte; | ||
260 | else | ||
261 | ctx->xor = xor_quad; | ||
262 | } | ||
263 | |||
264 | cipher = crypto_spawn_cipher(spawn); | 200 | cipher = crypto_spawn_cipher(spawn); |
265 | if (IS_ERR(cipher)) | 201 | if (IS_ERR(cipher)) |
266 | return PTR_ERR(cipher); | 202 | return PTR_ERR(cipher); |
@@ -290,6 +226,10 @@ static struct crypto_instance *crypto_cbc_alloc(struct rtattr **tb) | |||
290 | if (IS_ERR(alg)) | 226 | if (IS_ERR(alg)) |
291 | return ERR_PTR(PTR_ERR(alg)); | 227 | return ERR_PTR(PTR_ERR(alg)); |
292 | 228 | ||
229 | inst = ERR_PTR(-EINVAL); | ||
230 | if (!is_power_of_2(alg->cra_blocksize)) | ||
231 | goto out_put_alg; | ||
232 | |||
293 | inst = crypto_alloc_instance("cbc", alg); | 233 | inst = crypto_alloc_instance("cbc", alg); |
294 | if (IS_ERR(inst)) | 234 | if (IS_ERR(inst)) |
295 | goto out_put_alg; | 235 | goto out_put_alg; |
@@ -300,8 +240,9 @@ static struct crypto_instance *crypto_cbc_alloc(struct rtattr **tb) | |||
300 | inst->alg.cra_alignmask = alg->cra_alignmask; | 240 | inst->alg.cra_alignmask = alg->cra_alignmask; |
301 | inst->alg.cra_type = &crypto_blkcipher_type; | 241 | inst->alg.cra_type = &crypto_blkcipher_type; |
302 | 242 | ||
303 | if (!(alg->cra_blocksize % 4)) | 243 | /* We access the data as u32s when xoring. */ |
304 | inst->alg.cra_alignmask |= 3; | 244 | inst->alg.cra_alignmask |= __alignof__(u32) - 1; |
245 | |||
305 | inst->alg.cra_blkcipher.ivsize = alg->cra_blocksize; | 246 | inst->alg.cra_blkcipher.ivsize = alg->cra_blocksize; |
306 | inst->alg.cra_blkcipher.min_keysize = alg->cra_cipher.cia_min_keysize; | 247 | inst->alg.cra_blkcipher.min_keysize = alg->cra_cipher.cia_min_keysize; |
307 | inst->alg.cra_blkcipher.max_keysize = alg->cra_cipher.cia_max_keysize; | 248 | inst->alg.cra_blkcipher.max_keysize = alg->cra_cipher.cia_max_keysize; |
diff --git a/crypto/ccm.c b/crypto/ccm.c new file mode 100644 index 000000000000..7cf7e5a6b781 --- /dev/null +++ b/crypto/ccm.c | |||
@@ -0,0 +1,889 @@ | |||
1 | /* | ||
2 | * CCM: Counter with CBC-MAC | ||
3 | * | ||
4 | * (C) Copyright IBM Corp. 2007 - Joy Latten <latten@us.ibm.com> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify it | ||
7 | * under the terms of the GNU General Public License as published by the Free | ||
8 | * Software Foundation; either version 2 of the License, or (at your option) | ||
9 | * any later version. | ||
10 | * | ||
11 | */ | ||
12 | |||
13 | #include <crypto/internal/aead.h> | ||
14 | #include <crypto/internal/skcipher.h> | ||
15 | #include <crypto/scatterwalk.h> | ||
16 | #include <linux/err.h> | ||
17 | #include <linux/init.h> | ||
18 | #include <linux/kernel.h> | ||
19 | #include <linux/module.h> | ||
20 | #include <linux/slab.h> | ||
21 | |||
22 | #include "internal.h" | ||
23 | |||
24 | struct ccm_instance_ctx { | ||
25 | struct crypto_skcipher_spawn ctr; | ||
26 | struct crypto_spawn cipher; | ||
27 | }; | ||
28 | |||
29 | struct crypto_ccm_ctx { | ||
30 | struct crypto_cipher *cipher; | ||
31 | struct crypto_ablkcipher *ctr; | ||
32 | }; | ||
33 | |||
34 | struct crypto_rfc4309_ctx { | ||
35 | struct crypto_aead *child; | ||
36 | u8 nonce[3]; | ||
37 | }; | ||
38 | |||
39 | struct crypto_ccm_req_priv_ctx { | ||
40 | u8 odata[16]; | ||
41 | u8 idata[16]; | ||
42 | u8 auth_tag[16]; | ||
43 | u32 ilen; | ||
44 | u32 flags; | ||
45 | struct scatterlist src[2]; | ||
46 | struct scatterlist dst[2]; | ||
47 | struct ablkcipher_request abreq; | ||
48 | }; | ||
49 | |||
50 | static inline struct crypto_ccm_req_priv_ctx *crypto_ccm_reqctx( | ||
51 | struct aead_request *req) | ||
52 | { | ||
53 | unsigned long align = crypto_aead_alignmask(crypto_aead_reqtfm(req)); | ||
54 | |||
55 | return (void *)PTR_ALIGN((u8 *)aead_request_ctx(req), align + 1); | ||
56 | } | ||
57 | |||
58 | static int set_msg_len(u8 *block, unsigned int msglen, int csize) | ||
59 | { | ||
60 | __be32 data; | ||
61 | |||
62 | memset(block, 0, csize); | ||
63 | block += csize; | ||
64 | |||
65 | if (csize >= 4) | ||
66 | csize = 4; | ||
67 | else if (msglen > (1 << (8 * csize))) | ||
68 | return -EOVERFLOW; | ||
69 | |||
70 | data = cpu_to_be32(msglen); | ||
71 | memcpy(block - csize, (u8 *)&data + 4 - csize, csize); | ||
72 | |||
73 | return 0; | ||
74 | } | ||
75 | |||
76 | static int crypto_ccm_setkey(struct crypto_aead *aead, const u8 *key, | ||
77 | unsigned int keylen) | ||
78 | { | ||
79 | struct crypto_ccm_ctx *ctx = crypto_aead_ctx(aead); | ||
80 | struct crypto_ablkcipher *ctr = ctx->ctr; | ||
81 | struct crypto_cipher *tfm = ctx->cipher; | ||
82 | int err = 0; | ||
83 | |||
84 | crypto_ablkcipher_clear_flags(ctr, CRYPTO_TFM_REQ_MASK); | ||
85 | crypto_ablkcipher_set_flags(ctr, crypto_aead_get_flags(aead) & | ||
86 | CRYPTO_TFM_REQ_MASK); | ||
87 | err = crypto_ablkcipher_setkey(ctr, key, keylen); | ||
88 | crypto_aead_set_flags(aead, crypto_ablkcipher_get_flags(ctr) & | ||
89 | CRYPTO_TFM_RES_MASK); | ||
90 | if (err) | ||
91 | goto out; | ||
92 | |||
93 | crypto_cipher_clear_flags(tfm, CRYPTO_TFM_REQ_MASK); | ||
94 | crypto_cipher_set_flags(tfm, crypto_aead_get_flags(aead) & | ||
95 | CRYPTO_TFM_REQ_MASK); | ||
96 | err = crypto_cipher_setkey(tfm, key, keylen); | ||
97 | crypto_aead_set_flags(aead, crypto_cipher_get_flags(tfm) & | ||
98 | CRYPTO_TFM_RES_MASK); | ||
99 | |||
100 | out: | ||
101 | return err; | ||
102 | } | ||
103 | |||
104 | static int crypto_ccm_setauthsize(struct crypto_aead *tfm, | ||
105 | unsigned int authsize) | ||
106 | { | ||
107 | switch (authsize) { | ||
108 | case 4: | ||
109 | case 6: | ||
110 | case 8: | ||
111 | case 10: | ||
112 | case 12: | ||
113 | case 14: | ||
114 | case 16: | ||
115 | break; | ||
116 | default: | ||
117 | return -EINVAL; | ||
118 | } | ||
119 | |||
120 | return 0; | ||
121 | } | ||
122 | |||
123 | static int format_input(u8 *info, struct aead_request *req, | ||
124 | unsigned int cryptlen) | ||
125 | { | ||
126 | struct crypto_aead *aead = crypto_aead_reqtfm(req); | ||
127 | unsigned int lp = req->iv[0]; | ||
128 | unsigned int l = lp + 1; | ||
129 | unsigned int m; | ||
130 | |||
131 | m = crypto_aead_authsize(aead); | ||
132 | |||
133 | memcpy(info, req->iv, 16); | ||
134 | |||
135 | /* format control info per RFC 3610 and | ||
136 | * NIST Special Publication 800-38C | ||
137 | */ | ||
138 | *info |= (8 * ((m - 2) / 2)); | ||
139 | if (req->assoclen) | ||
140 | *info |= 64; | ||
141 | |||
142 | return set_msg_len(info + 16 - l, cryptlen, l); | ||
143 | } | ||
144 | |||
145 | static int format_adata(u8 *adata, unsigned int a) | ||
146 | { | ||
147 | int len = 0; | ||
148 | |||
149 | /* add control info for associated data | ||
150 | * RFC 3610 and NIST Special Publication 800-38C | ||
151 | */ | ||
152 | if (a < 65280) { | ||
153 | *(__be16 *)adata = cpu_to_be16(a); | ||
154 | len = 2; | ||
155 | } else { | ||
156 | *(__be16 *)adata = cpu_to_be16(0xfffe); | ||
157 | *(__be32 *)&adata[2] = cpu_to_be32(a); | ||
158 | len = 6; | ||
159 | } | ||
160 | |||
161 | return len; | ||
162 | } | ||
163 | |||
164 | static void compute_mac(struct crypto_cipher *tfm, u8 *data, int n, | ||
165 | struct crypto_ccm_req_priv_ctx *pctx) | ||
166 | { | ||
167 | unsigned int bs = 16; | ||
168 | u8 *odata = pctx->odata; | ||
169 | u8 *idata = pctx->idata; | ||
170 | int datalen, getlen; | ||
171 | |||
172 | datalen = n; | ||
173 | |||
174 | /* first time in here, block may be partially filled. */ | ||
175 | getlen = bs - pctx->ilen; | ||
176 | if (datalen >= getlen) { | ||
177 | memcpy(idata + pctx->ilen, data, getlen); | ||
178 | crypto_xor(odata, idata, bs); | ||
179 | crypto_cipher_encrypt_one(tfm, odata, odata); | ||
180 | datalen -= getlen; | ||
181 | data += getlen; | ||
182 | pctx->ilen = 0; | ||
183 | } | ||
184 | |||
185 | /* now encrypt rest of data */ | ||
186 | while (datalen >= bs) { | ||
187 | crypto_xor(odata, data, bs); | ||
188 | crypto_cipher_encrypt_one(tfm, odata, odata); | ||
189 | |||
190 | datalen -= bs; | ||
191 | data += bs; | ||
192 | } | ||
193 | |||
194 | /* check and see if there's leftover data that wasn't | ||
195 | * enough to fill a block. | ||
196 | */ | ||
197 | if (datalen) { | ||
198 | memcpy(idata + pctx->ilen, data, datalen); | ||
199 | pctx->ilen += datalen; | ||
200 | } | ||
201 | } | ||
202 | |||
203 | static void get_data_to_compute(struct crypto_cipher *tfm, | ||
204 | struct crypto_ccm_req_priv_ctx *pctx, | ||
205 | struct scatterlist *sg, unsigned int len) | ||
206 | { | ||
207 | struct scatter_walk walk; | ||
208 | u8 *data_src; | ||
209 | int n; | ||
210 | |||
211 | scatterwalk_start(&walk, sg); | ||
212 | |||
213 | while (len) { | ||
214 | n = scatterwalk_clamp(&walk, len); | ||
215 | if (!n) { | ||
216 | scatterwalk_start(&walk, sg_next(walk.sg)); | ||
217 | n = scatterwalk_clamp(&walk, len); | ||
218 | } | ||
219 | data_src = scatterwalk_map(&walk, 0); | ||
220 | |||
221 | compute_mac(tfm, data_src, n, pctx); | ||
222 | len -= n; | ||
223 | |||
224 | scatterwalk_unmap(data_src, 0); | ||
225 | scatterwalk_advance(&walk, n); | ||
226 | scatterwalk_done(&walk, 0, len); | ||
227 | if (len) | ||
228 | crypto_yield(pctx->flags); | ||
229 | } | ||
230 | |||
231 | /* any leftover needs padding and then encrypted */ | ||
232 | if (pctx->ilen) { | ||
233 | int padlen; | ||
234 | u8 *odata = pctx->odata; | ||
235 | u8 *idata = pctx->idata; | ||
236 | |||
237 | padlen = 16 - pctx->ilen; | ||
238 | memset(idata + pctx->ilen, 0, padlen); | ||
239 | crypto_xor(odata, idata, 16); | ||
240 | crypto_cipher_encrypt_one(tfm, odata, odata); | ||
241 | pctx->ilen = 0; | ||
242 | } | ||
243 | } | ||
244 | |||
245 | static int crypto_ccm_auth(struct aead_request *req, struct scatterlist *plain, | ||
246 | unsigned int cryptlen) | ||
247 | { | ||
248 | struct crypto_aead *aead = crypto_aead_reqtfm(req); | ||
249 | struct crypto_ccm_ctx *ctx = crypto_aead_ctx(aead); | ||
250 | struct crypto_ccm_req_priv_ctx *pctx = crypto_ccm_reqctx(req); | ||
251 | struct crypto_cipher *cipher = ctx->cipher; | ||
252 | unsigned int assoclen = req->assoclen; | ||
253 | u8 *odata = pctx->odata; | ||
254 | u8 *idata = pctx->idata; | ||
255 | int err; | ||
256 | |||
257 | /* format control data for input */ | ||
258 | err = format_input(odata, req, cryptlen); | ||
259 | if (err) | ||
260 | goto out; | ||
261 | |||
262 | /* encrypt first block to use as start in computing mac */ | ||
263 | crypto_cipher_encrypt_one(cipher, odata, odata); | ||
264 | |||
265 | /* format associated data and compute into mac */ | ||
266 | if (assoclen) { | ||
267 | pctx->ilen = format_adata(idata, assoclen); | ||
268 | get_data_to_compute(cipher, pctx, req->assoc, req->assoclen); | ||
269 | } | ||
270 | |||
271 | /* compute plaintext into mac */ | ||
272 | get_data_to_compute(cipher, pctx, plain, cryptlen); | ||
273 | |||
274 | out: | ||
275 | return err; | ||
276 | } | ||
277 | |||
278 | static void crypto_ccm_encrypt_done(struct crypto_async_request *areq, int err) | ||
279 | { | ||
280 | struct aead_request *req = areq->data; | ||
281 | struct crypto_aead *aead = crypto_aead_reqtfm(req); | ||
282 | struct crypto_ccm_req_priv_ctx *pctx = crypto_ccm_reqctx(req); | ||
283 | u8 *odata = pctx->odata; | ||
284 | |||
285 | if (!err) | ||
286 | scatterwalk_map_and_copy(odata, req->dst, req->cryptlen, | ||
287 | crypto_aead_authsize(aead), 1); | ||
288 | aead_request_complete(req, err); | ||
289 | } | ||
290 | |||
291 | static inline int crypto_ccm_check_iv(const u8 *iv) | ||
292 | { | ||
293 | /* 2 <= L <= 8, so 1 <= L' <= 7. */ | ||
294 | if (1 > iv[0] || iv[0] > 7) | ||
295 | return -EINVAL; | ||
296 | |||
297 | return 0; | ||
298 | } | ||
299 | |||
300 | static int crypto_ccm_encrypt(struct aead_request *req) | ||
301 | { | ||
302 | struct crypto_aead *aead = crypto_aead_reqtfm(req); | ||
303 | struct crypto_ccm_ctx *ctx = crypto_aead_ctx(aead); | ||
304 | struct crypto_ccm_req_priv_ctx *pctx = crypto_ccm_reqctx(req); | ||
305 | struct ablkcipher_request *abreq = &pctx->abreq; | ||
306 | struct scatterlist *dst; | ||
307 | unsigned int cryptlen = req->cryptlen; | ||
308 | u8 *odata = pctx->odata; | ||
309 | u8 *iv = req->iv; | ||
310 | int err; | ||
311 | |||
312 | err = crypto_ccm_check_iv(iv); | ||
313 | if (err) | ||
314 | return err; | ||
315 | |||
316 | pctx->flags = aead_request_flags(req); | ||
317 | |||
318 | err = crypto_ccm_auth(req, req->src, cryptlen); | ||
319 | if (err) | ||
320 | return err; | ||
321 | |||
322 | /* Note: rfc 3610 and NIST 800-38C require counter of | ||
323 | * zero to encrypt auth tag. | ||
324 | */ | ||
325 | memset(iv + 15 - iv[0], 0, iv[0] + 1); | ||
326 | |||
327 | sg_init_table(pctx->src, 2); | ||
328 | sg_set_buf(pctx->src, odata, 16); | ||
329 | scatterwalk_sg_chain(pctx->src, 2, req->src); | ||
330 | |||
331 | dst = pctx->src; | ||
332 | if (req->src != req->dst) { | ||
333 | sg_init_table(pctx->dst, 2); | ||
334 | sg_set_buf(pctx->dst, odata, 16); | ||
335 | scatterwalk_sg_chain(pctx->dst, 2, req->dst); | ||
336 | dst = pctx->dst; | ||
337 | } | ||
338 | |||
339 | ablkcipher_request_set_tfm(abreq, ctx->ctr); | ||
340 | ablkcipher_request_set_callback(abreq, pctx->flags, | ||
341 | crypto_ccm_encrypt_done, req); | ||
342 | ablkcipher_request_set_crypt(abreq, pctx->src, dst, cryptlen + 16, iv); | ||
343 | err = crypto_ablkcipher_encrypt(abreq); | ||
344 | if (err) | ||
345 | return err; | ||
346 | |||
347 | /* copy authtag to end of dst */ | ||
348 | scatterwalk_map_and_copy(odata, req->dst, cryptlen, | ||
349 | crypto_aead_authsize(aead), 1); | ||
350 | return err; | ||
351 | } | ||
352 | |||
353 | static void crypto_ccm_decrypt_done(struct crypto_async_request *areq, | ||
354 | int err) | ||
355 | { | ||
356 | struct aead_request *req = areq->data; | ||
357 | struct crypto_ccm_req_priv_ctx *pctx = crypto_ccm_reqctx(req); | ||
358 | struct crypto_aead *aead = crypto_aead_reqtfm(req); | ||
359 | unsigned int authsize = crypto_aead_authsize(aead); | ||
360 | unsigned int cryptlen = req->cryptlen - authsize; | ||
361 | |||
362 | if (!err) { | ||
363 | err = crypto_ccm_auth(req, req->dst, cryptlen); | ||
364 | if (!err && memcmp(pctx->auth_tag, pctx->odata, authsize)) | ||
365 | err = -EBADMSG; | ||
366 | } | ||
367 | aead_request_complete(req, err); | ||
368 | } | ||
369 | |||
370 | static int crypto_ccm_decrypt(struct aead_request *req) | ||
371 | { | ||
372 | struct crypto_aead *aead = crypto_aead_reqtfm(req); | ||
373 | struct crypto_ccm_ctx *ctx = crypto_aead_ctx(aead); | ||
374 | struct crypto_ccm_req_priv_ctx *pctx = crypto_ccm_reqctx(req); | ||
375 | struct ablkcipher_request *abreq = &pctx->abreq; | ||
376 | struct scatterlist *dst; | ||
377 | unsigned int authsize = crypto_aead_authsize(aead); | ||
378 | unsigned int cryptlen = req->cryptlen; | ||
379 | u8 *authtag = pctx->auth_tag; | ||
380 | u8 *odata = pctx->odata; | ||
381 | u8 *iv = req->iv; | ||
382 | int err; | ||
383 | |||
384 | if (cryptlen < authsize) | ||
385 | return -EINVAL; | ||
386 | cryptlen -= authsize; | ||
387 | |||
388 | err = crypto_ccm_check_iv(iv); | ||
389 | if (err) | ||
390 | return err; | ||
391 | |||
392 | pctx->flags = aead_request_flags(req); | ||
393 | |||
394 | scatterwalk_map_and_copy(authtag, req->src, cryptlen, authsize, 0); | ||
395 | |||
396 | memset(iv + 15 - iv[0], 0, iv[0] + 1); | ||
397 | |||
398 | sg_init_table(pctx->src, 2); | ||
399 | sg_set_buf(pctx->src, authtag, 16); | ||
400 | scatterwalk_sg_chain(pctx->src, 2, req->src); | ||
401 | |||
402 | dst = pctx->src; | ||
403 | if (req->src != req->dst) { | ||
404 | sg_init_table(pctx->dst, 2); | ||
405 | sg_set_buf(pctx->dst, authtag, 16); | ||
406 | scatterwalk_sg_chain(pctx->dst, 2, req->dst); | ||
407 | dst = pctx->dst; | ||
408 | } | ||
409 | |||
410 | ablkcipher_request_set_tfm(abreq, ctx->ctr); | ||
411 | ablkcipher_request_set_callback(abreq, pctx->flags, | ||
412 | crypto_ccm_decrypt_done, req); | ||
413 | ablkcipher_request_set_crypt(abreq, pctx->src, dst, cryptlen + 16, iv); | ||
414 | err = crypto_ablkcipher_decrypt(abreq); | ||
415 | if (err) | ||
416 | return err; | ||
417 | |||
418 | err = crypto_ccm_auth(req, req->dst, cryptlen); | ||
419 | if (err) | ||
420 | return err; | ||
421 | |||
422 | /* verify */ | ||
423 | if (memcmp(authtag, odata, authsize)) | ||
424 | return -EBADMSG; | ||
425 | |||
426 | return err; | ||
427 | } | ||
428 | |||
429 | static int crypto_ccm_init_tfm(struct crypto_tfm *tfm) | ||
430 | { | ||
431 | struct crypto_instance *inst = (void *)tfm->__crt_alg; | ||
432 | struct ccm_instance_ctx *ictx = crypto_instance_ctx(inst); | ||
433 | struct crypto_ccm_ctx *ctx = crypto_tfm_ctx(tfm); | ||
434 | struct crypto_cipher *cipher; | ||
435 | struct crypto_ablkcipher *ctr; | ||
436 | unsigned long align; | ||
437 | int err; | ||
438 | |||
439 | cipher = crypto_spawn_cipher(&ictx->cipher); | ||
440 | if (IS_ERR(cipher)) | ||
441 | return PTR_ERR(cipher); | ||
442 | |||
443 | ctr = crypto_spawn_skcipher(&ictx->ctr); | ||
444 | err = PTR_ERR(ctr); | ||
445 | if (IS_ERR(ctr)) | ||
446 | goto err_free_cipher; | ||
447 | |||
448 | ctx->cipher = cipher; | ||
449 | ctx->ctr = ctr; | ||
450 | |||
451 | align = crypto_tfm_alg_alignmask(tfm); | ||
452 | align &= ~(crypto_tfm_ctx_alignment() - 1); | ||
453 | tfm->crt_aead.reqsize = align + | ||
454 | sizeof(struct crypto_ccm_req_priv_ctx) + | ||
455 | crypto_ablkcipher_reqsize(ctr); | ||
456 | |||
457 | return 0; | ||
458 | |||
459 | err_free_cipher: | ||
460 | crypto_free_cipher(cipher); | ||
461 | return err; | ||
462 | } | ||
463 | |||
464 | static void crypto_ccm_exit_tfm(struct crypto_tfm *tfm) | ||
465 | { | ||
466 | struct crypto_ccm_ctx *ctx = crypto_tfm_ctx(tfm); | ||
467 | |||
468 | crypto_free_cipher(ctx->cipher); | ||
469 | crypto_free_ablkcipher(ctx->ctr); | ||
470 | } | ||
471 | |||
472 | static struct crypto_instance *crypto_ccm_alloc_common(struct rtattr **tb, | ||
473 | const char *full_name, | ||
474 | const char *ctr_name, | ||
475 | const char *cipher_name) | ||
476 | { | ||
477 | struct crypto_attr_type *algt; | ||
478 | struct crypto_instance *inst; | ||
479 | struct crypto_alg *ctr; | ||
480 | struct crypto_alg *cipher; | ||
481 | struct ccm_instance_ctx *ictx; | ||
482 | int err; | ||
483 | |||
484 | algt = crypto_get_attr_type(tb); | ||
485 | err = PTR_ERR(algt); | ||
486 | if (IS_ERR(algt)) | ||
487 | return ERR_PTR(err); | ||
488 | |||
489 | if ((algt->type ^ CRYPTO_ALG_TYPE_AEAD) & algt->mask) | ||
490 | return ERR_PTR(-EINVAL); | ||
491 | |||
492 | cipher = crypto_alg_mod_lookup(cipher_name, CRYPTO_ALG_TYPE_CIPHER, | ||
493 | CRYPTO_ALG_TYPE_MASK); | ||
494 | err = PTR_ERR(cipher); | ||
495 | if (IS_ERR(cipher)) | ||
496 | return ERR_PTR(err); | ||
497 | |||
498 | err = -EINVAL; | ||
499 | if (cipher->cra_blocksize != 16) | ||
500 | goto out_put_cipher; | ||
501 | |||
502 | inst = kzalloc(sizeof(*inst) + sizeof(*ictx), GFP_KERNEL); | ||
503 | err = -ENOMEM; | ||
504 | if (!inst) | ||
505 | goto out_put_cipher; | ||
506 | |||
507 | ictx = crypto_instance_ctx(inst); | ||
508 | |||
509 | err = crypto_init_spawn(&ictx->cipher, cipher, inst, | ||
510 | CRYPTO_ALG_TYPE_MASK); | ||
511 | if (err) | ||
512 | goto err_free_inst; | ||
513 | |||
514 | crypto_set_skcipher_spawn(&ictx->ctr, inst); | ||
515 | err = crypto_grab_skcipher(&ictx->ctr, ctr_name, 0, | ||
516 | crypto_requires_sync(algt->type, | ||
517 | algt->mask)); | ||
518 | if (err) | ||
519 | goto err_drop_cipher; | ||
520 | |||
521 | ctr = crypto_skcipher_spawn_alg(&ictx->ctr); | ||
522 | |||
523 | /* Not a stream cipher? */ | ||
524 | err = -EINVAL; | ||
525 | if (ctr->cra_blocksize != 1) | ||
526 | goto err_drop_ctr; | ||
527 | |||
528 | /* We want the real thing! */ | ||
529 | if (ctr->cra_ablkcipher.ivsize != 16) | ||
530 | goto err_drop_ctr; | ||
531 | |||
532 | err = -ENAMETOOLONG; | ||
533 | if (snprintf(inst->alg.cra_driver_name, CRYPTO_MAX_ALG_NAME, | ||
534 | "ccm_base(%s,%s)", ctr->cra_driver_name, | ||
535 | cipher->cra_driver_name) >= CRYPTO_MAX_ALG_NAME) | ||
536 | goto err_drop_ctr; | ||
537 | |||
538 | memcpy(inst->alg.cra_name, full_name, CRYPTO_MAX_ALG_NAME); | ||
539 | |||
540 | inst->alg.cra_flags = CRYPTO_ALG_TYPE_AEAD; | ||
541 | inst->alg.cra_flags |= ctr->cra_flags & CRYPTO_ALG_ASYNC; | ||
542 | inst->alg.cra_priority = cipher->cra_priority + ctr->cra_priority; | ||
543 | inst->alg.cra_blocksize = 1; | ||
544 | inst->alg.cra_alignmask = cipher->cra_alignmask | ctr->cra_alignmask | | ||
545 | (__alignof__(u32) - 1); | ||
546 | inst->alg.cra_type = &crypto_aead_type; | ||
547 | inst->alg.cra_aead.ivsize = 16; | ||
548 | inst->alg.cra_aead.maxauthsize = 16; | ||
549 | inst->alg.cra_ctxsize = sizeof(struct crypto_ccm_ctx); | ||
550 | inst->alg.cra_init = crypto_ccm_init_tfm; | ||
551 | inst->alg.cra_exit = crypto_ccm_exit_tfm; | ||
552 | inst->alg.cra_aead.setkey = crypto_ccm_setkey; | ||
553 | inst->alg.cra_aead.setauthsize = crypto_ccm_setauthsize; | ||
554 | inst->alg.cra_aead.encrypt = crypto_ccm_encrypt; | ||
555 | inst->alg.cra_aead.decrypt = crypto_ccm_decrypt; | ||
556 | |||
557 | out: | ||
558 | crypto_mod_put(cipher); | ||
559 | return inst; | ||
560 | |||
561 | err_drop_ctr: | ||
562 | crypto_drop_skcipher(&ictx->ctr); | ||
563 | err_drop_cipher: | ||
564 | crypto_drop_spawn(&ictx->cipher); | ||
565 | err_free_inst: | ||
566 | kfree(inst); | ||
567 | out_put_cipher: | ||
568 | inst = ERR_PTR(err); | ||
569 | goto out; | ||
570 | } | ||
571 | |||
572 | static struct crypto_instance *crypto_ccm_alloc(struct rtattr **tb) | ||
573 | { | ||
574 | int err; | ||
575 | const char *cipher_name; | ||
576 | char ctr_name[CRYPTO_MAX_ALG_NAME]; | ||
577 | char full_name[CRYPTO_MAX_ALG_NAME]; | ||
578 | |||
579 | cipher_name = crypto_attr_alg_name(tb[1]); | ||
580 | err = PTR_ERR(cipher_name); | ||
581 | if (IS_ERR(cipher_name)) | ||
582 | return ERR_PTR(err); | ||
583 | |||
584 | if (snprintf(ctr_name, CRYPTO_MAX_ALG_NAME, "ctr(%s)", | ||
585 | cipher_name) >= CRYPTO_MAX_ALG_NAME) | ||
586 | return ERR_PTR(-ENAMETOOLONG); | ||
587 | |||
588 | if (snprintf(full_name, CRYPTO_MAX_ALG_NAME, "ccm(%s)", cipher_name) >= | ||
589 | CRYPTO_MAX_ALG_NAME) | ||
590 | return ERR_PTR(-ENAMETOOLONG); | ||
591 | |||
592 | return crypto_ccm_alloc_common(tb, full_name, ctr_name, cipher_name); | ||
593 | } | ||
594 | |||
595 | static void crypto_ccm_free(struct crypto_instance *inst) | ||
596 | { | ||
597 | struct ccm_instance_ctx *ctx = crypto_instance_ctx(inst); | ||
598 | |||
599 | crypto_drop_spawn(&ctx->cipher); | ||
600 | crypto_drop_skcipher(&ctx->ctr); | ||
601 | kfree(inst); | ||
602 | } | ||
603 | |||
604 | static struct crypto_template crypto_ccm_tmpl = { | ||
605 | .name = "ccm", | ||
606 | .alloc = crypto_ccm_alloc, | ||
607 | .free = crypto_ccm_free, | ||
608 | .module = THIS_MODULE, | ||
609 | }; | ||
610 | |||
611 | static struct crypto_instance *crypto_ccm_base_alloc(struct rtattr **tb) | ||
612 | { | ||
613 | int err; | ||
614 | const char *ctr_name; | ||
615 | const char *cipher_name; | ||
616 | char full_name[CRYPTO_MAX_ALG_NAME]; | ||
617 | |||
618 | ctr_name = crypto_attr_alg_name(tb[1]); | ||
619 | err = PTR_ERR(ctr_name); | ||
620 | if (IS_ERR(ctr_name)) | ||
621 | return ERR_PTR(err); | ||
622 | |||
623 | cipher_name = crypto_attr_alg_name(tb[2]); | ||
624 | err = PTR_ERR(cipher_name); | ||
625 | if (IS_ERR(cipher_name)) | ||
626 | return ERR_PTR(err); | ||
627 | |||
628 | if (snprintf(full_name, CRYPTO_MAX_ALG_NAME, "ccm_base(%s,%s)", | ||
629 | ctr_name, cipher_name) >= CRYPTO_MAX_ALG_NAME) | ||
630 | return ERR_PTR(-ENAMETOOLONG); | ||
631 | |||
632 | return crypto_ccm_alloc_common(tb, full_name, ctr_name, cipher_name); | ||
633 | } | ||
634 | |||
635 | static struct crypto_template crypto_ccm_base_tmpl = { | ||
636 | .name = "ccm_base", | ||
637 | .alloc = crypto_ccm_base_alloc, | ||
638 | .free = crypto_ccm_free, | ||
639 | .module = THIS_MODULE, | ||
640 | }; | ||
641 | |||
642 | static int crypto_rfc4309_setkey(struct crypto_aead *parent, const u8 *key, | ||
643 | unsigned int keylen) | ||
644 | { | ||
645 | struct crypto_rfc4309_ctx *ctx = crypto_aead_ctx(parent); | ||
646 | struct crypto_aead *child = ctx->child; | ||
647 | int err; | ||
648 | |||
649 | if (keylen < 3) | ||
650 | return -EINVAL; | ||
651 | |||
652 | keylen -= 3; | ||
653 | memcpy(ctx->nonce, key + keylen, 3); | ||
654 | |||
655 | crypto_aead_clear_flags(child, CRYPTO_TFM_REQ_MASK); | ||
656 | crypto_aead_set_flags(child, crypto_aead_get_flags(parent) & | ||
657 | CRYPTO_TFM_REQ_MASK); | ||
658 | err = crypto_aead_setkey(child, key, keylen); | ||
659 | crypto_aead_set_flags(parent, crypto_aead_get_flags(child) & | ||
660 | CRYPTO_TFM_RES_MASK); | ||
661 | |||
662 | return err; | ||
663 | } | ||
664 | |||
665 | static int crypto_rfc4309_setauthsize(struct crypto_aead *parent, | ||
666 | unsigned int authsize) | ||
667 | { | ||
668 | struct crypto_rfc4309_ctx *ctx = crypto_aead_ctx(parent); | ||
669 | |||
670 | switch (authsize) { | ||
671 | case 8: | ||
672 | case 12: | ||
673 | case 16: | ||
674 | break; | ||
675 | default: | ||
676 | return -EINVAL; | ||
677 | } | ||
678 | |||
679 | return crypto_aead_setauthsize(ctx->child, authsize); | ||
680 | } | ||
681 | |||
682 | static struct aead_request *crypto_rfc4309_crypt(struct aead_request *req) | ||
683 | { | ||
684 | struct aead_request *subreq = aead_request_ctx(req); | ||
685 | struct crypto_aead *aead = crypto_aead_reqtfm(req); | ||
686 | struct crypto_rfc4309_ctx *ctx = crypto_aead_ctx(aead); | ||
687 | struct crypto_aead *child = ctx->child; | ||
688 | u8 *iv = PTR_ALIGN((u8 *)(subreq + 1) + crypto_aead_reqsize(child), | ||
689 | crypto_aead_alignmask(child) + 1); | ||
690 | |||
691 | /* L' */ | ||
692 | iv[0] = 3; | ||
693 | |||
694 | memcpy(iv + 1, ctx->nonce, 3); | ||
695 | memcpy(iv + 4, req->iv, 8); | ||
696 | |||
697 | aead_request_set_tfm(subreq, child); | ||
698 | aead_request_set_callback(subreq, req->base.flags, req->base.complete, | ||
699 | req->base.data); | ||
700 | aead_request_set_crypt(subreq, req->src, req->dst, req->cryptlen, iv); | ||
701 | aead_request_set_assoc(subreq, req->assoc, req->assoclen); | ||
702 | |||
703 | return subreq; | ||
704 | } | ||
705 | |||
706 | static int crypto_rfc4309_encrypt(struct aead_request *req) | ||
707 | { | ||
708 | req = crypto_rfc4309_crypt(req); | ||
709 | |||
710 | return crypto_aead_encrypt(req); | ||
711 | } | ||
712 | |||
713 | static int crypto_rfc4309_decrypt(struct aead_request *req) | ||
714 | { | ||
715 | req = crypto_rfc4309_crypt(req); | ||
716 | |||
717 | return crypto_aead_decrypt(req); | ||
718 | } | ||
719 | |||
720 | static int crypto_rfc4309_init_tfm(struct crypto_tfm *tfm) | ||
721 | { | ||
722 | struct crypto_instance *inst = (void *)tfm->__crt_alg; | ||
723 | struct crypto_aead_spawn *spawn = crypto_instance_ctx(inst); | ||
724 | struct crypto_rfc4309_ctx *ctx = crypto_tfm_ctx(tfm); | ||
725 | struct crypto_aead *aead; | ||
726 | unsigned long align; | ||
727 | |||
728 | aead = crypto_spawn_aead(spawn); | ||
729 | if (IS_ERR(aead)) | ||
730 | return PTR_ERR(aead); | ||
731 | |||
732 | ctx->child = aead; | ||
733 | |||
734 | align = crypto_aead_alignmask(aead); | ||
735 | align &= ~(crypto_tfm_ctx_alignment() - 1); | ||
736 | tfm->crt_aead.reqsize = sizeof(struct aead_request) + | ||
737 | ALIGN(crypto_aead_reqsize(aead), | ||
738 | crypto_tfm_ctx_alignment()) + | ||
739 | align + 16; | ||
740 | |||
741 | return 0; | ||
742 | } | ||
743 | |||
744 | static void crypto_rfc4309_exit_tfm(struct crypto_tfm *tfm) | ||
745 | { | ||
746 | struct crypto_rfc4309_ctx *ctx = crypto_tfm_ctx(tfm); | ||
747 | |||
748 | crypto_free_aead(ctx->child); | ||
749 | } | ||
750 | |||
751 | static struct crypto_instance *crypto_rfc4309_alloc(struct rtattr **tb) | ||
752 | { | ||
753 | struct crypto_attr_type *algt; | ||
754 | struct crypto_instance *inst; | ||
755 | struct crypto_aead_spawn *spawn; | ||
756 | struct crypto_alg *alg; | ||
757 | const char *ccm_name; | ||
758 | int err; | ||
759 | |||
760 | algt = crypto_get_attr_type(tb); | ||
761 | err = PTR_ERR(algt); | ||
762 | if (IS_ERR(algt)) | ||
763 | return ERR_PTR(err); | ||
764 | |||
765 | if ((algt->type ^ CRYPTO_ALG_TYPE_AEAD) & algt->mask) | ||
766 | return ERR_PTR(-EINVAL); | ||
767 | |||
768 | ccm_name = crypto_attr_alg_name(tb[1]); | ||
769 | err = PTR_ERR(ccm_name); | ||
770 | if (IS_ERR(ccm_name)) | ||
771 | return ERR_PTR(err); | ||
772 | |||
773 | inst = kzalloc(sizeof(*inst) + sizeof(*spawn), GFP_KERNEL); | ||
774 | if (!inst) | ||
775 | return ERR_PTR(-ENOMEM); | ||
776 | |||
777 | spawn = crypto_instance_ctx(inst); | ||
778 | crypto_set_aead_spawn(spawn, inst); | ||
779 | err = crypto_grab_aead(spawn, ccm_name, 0, | ||
780 | crypto_requires_sync(algt->type, algt->mask)); | ||
781 | if (err) | ||
782 | goto out_free_inst; | ||
783 | |||
784 | alg = crypto_aead_spawn_alg(spawn); | ||
785 | |||
786 | err = -EINVAL; | ||
787 | |||
788 | /* We only support 16-byte blocks. */ | ||
789 | if (alg->cra_aead.ivsize != 16) | ||
790 | goto out_drop_alg; | ||
791 | |||
792 | /* Not a stream cipher? */ | ||
793 | if (alg->cra_blocksize != 1) | ||
794 | goto out_drop_alg; | ||
795 | |||
796 | err = -ENAMETOOLONG; | ||
797 | if (snprintf(inst->alg.cra_name, CRYPTO_MAX_ALG_NAME, | ||
798 | "rfc4309(%s)", alg->cra_name) >= CRYPTO_MAX_ALG_NAME || | ||
799 | snprintf(inst->alg.cra_driver_name, CRYPTO_MAX_ALG_NAME, | ||
800 | "rfc4309(%s)", alg->cra_driver_name) >= | ||
801 | CRYPTO_MAX_ALG_NAME) | ||
802 | goto out_drop_alg; | ||
803 | |||
804 | inst->alg.cra_flags = CRYPTO_ALG_TYPE_AEAD; | ||
805 | inst->alg.cra_flags |= alg->cra_flags & CRYPTO_ALG_ASYNC; | ||
806 | inst->alg.cra_priority = alg->cra_priority; | ||
807 | inst->alg.cra_blocksize = 1; | ||
808 | inst->alg.cra_alignmask = alg->cra_alignmask; | ||
809 | inst->alg.cra_type = &crypto_nivaead_type; | ||
810 | |||
811 | inst->alg.cra_aead.ivsize = 8; | ||
812 | inst->alg.cra_aead.maxauthsize = 16; | ||
813 | |||
814 | inst->alg.cra_ctxsize = sizeof(struct crypto_rfc4309_ctx); | ||
815 | |||
816 | inst->alg.cra_init = crypto_rfc4309_init_tfm; | ||
817 | inst->alg.cra_exit = crypto_rfc4309_exit_tfm; | ||
818 | |||
819 | inst->alg.cra_aead.setkey = crypto_rfc4309_setkey; | ||
820 | inst->alg.cra_aead.setauthsize = crypto_rfc4309_setauthsize; | ||
821 | inst->alg.cra_aead.encrypt = crypto_rfc4309_encrypt; | ||
822 | inst->alg.cra_aead.decrypt = crypto_rfc4309_decrypt; | ||
823 | |||
824 | inst->alg.cra_aead.geniv = "seqiv"; | ||
825 | |||
826 | out: | ||
827 | return inst; | ||
828 | |||
829 | out_drop_alg: | ||
830 | crypto_drop_aead(spawn); | ||
831 | out_free_inst: | ||
832 | kfree(inst); | ||
833 | inst = ERR_PTR(err); | ||
834 | goto out; | ||
835 | } | ||
836 | |||
837 | static void crypto_rfc4309_free(struct crypto_instance *inst) | ||
838 | { | ||
839 | crypto_drop_spawn(crypto_instance_ctx(inst)); | ||
840 | kfree(inst); | ||
841 | } | ||
842 | |||
843 | static struct crypto_template crypto_rfc4309_tmpl = { | ||
844 | .name = "rfc4309", | ||
845 | .alloc = crypto_rfc4309_alloc, | ||
846 | .free = crypto_rfc4309_free, | ||
847 | .module = THIS_MODULE, | ||
848 | }; | ||
849 | |||
850 | static int __init crypto_ccm_module_init(void) | ||
851 | { | ||
852 | int err; | ||
853 | |||
854 | err = crypto_register_template(&crypto_ccm_base_tmpl); | ||
855 | if (err) | ||
856 | goto out; | ||
857 | |||
858 | err = crypto_register_template(&crypto_ccm_tmpl); | ||
859 | if (err) | ||
860 | goto out_undo_base; | ||
861 | |||
862 | err = crypto_register_template(&crypto_rfc4309_tmpl); | ||
863 | if (err) | ||
864 | goto out_undo_ccm; | ||
865 | |||
866 | out: | ||
867 | return err; | ||
868 | |||
869 | out_undo_ccm: | ||
870 | crypto_unregister_template(&crypto_ccm_tmpl); | ||
871 | out_undo_base: | ||
872 | crypto_unregister_template(&crypto_ccm_base_tmpl); | ||
873 | goto out; | ||
874 | } | ||
875 | |||
876 | static void __exit crypto_ccm_module_exit(void) | ||
877 | { | ||
878 | crypto_unregister_template(&crypto_rfc4309_tmpl); | ||
879 | crypto_unregister_template(&crypto_ccm_tmpl); | ||
880 | crypto_unregister_template(&crypto_ccm_base_tmpl); | ||
881 | } | ||
882 | |||
883 | module_init(crypto_ccm_module_init); | ||
884 | module_exit(crypto_ccm_module_exit); | ||
885 | |||
886 | MODULE_LICENSE("GPL"); | ||
887 | MODULE_DESCRIPTION("Counter with CBC MAC"); | ||
888 | MODULE_ALIAS("ccm_base"); | ||
889 | MODULE_ALIAS("rfc4309"); | ||
diff --git a/crypto/chainiv.c b/crypto/chainiv.c new file mode 100644 index 000000000000..d17fa0454dc3 --- /dev/null +++ b/crypto/chainiv.c | |||
@@ -0,0 +1,331 @@ | |||
1 | /* | ||
2 | * chainiv: Chain IV Generator | ||
3 | * | ||
4 | * Generate IVs simply be using the last block of the previous encryption. | ||
5 | * This is mainly useful for CBC with a synchronous algorithm. | ||
6 | * | ||
7 | * Copyright (c) 2007 Herbert Xu <herbert@gondor.apana.org.au> | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify it | ||
10 | * under the terms of the GNU General Public License as published by the Free | ||
11 | * Software Foundation; either version 2 of the License, or (at your option) | ||
12 | * any later version. | ||
13 | * | ||
14 | */ | ||
15 | |||
16 | #include <crypto/internal/skcipher.h> | ||
17 | #include <linux/err.h> | ||
18 | #include <linux/init.h> | ||
19 | #include <linux/kernel.h> | ||
20 | #include <linux/module.h> | ||
21 | #include <linux/random.h> | ||
22 | #include <linux/spinlock.h> | ||
23 | #include <linux/string.h> | ||
24 | #include <linux/workqueue.h> | ||
25 | |||
26 | enum { | ||
27 | CHAINIV_STATE_INUSE = 0, | ||
28 | }; | ||
29 | |||
30 | struct chainiv_ctx { | ||
31 | spinlock_t lock; | ||
32 | char iv[]; | ||
33 | }; | ||
34 | |||
35 | struct async_chainiv_ctx { | ||
36 | unsigned long state; | ||
37 | |||
38 | spinlock_t lock; | ||
39 | int err; | ||
40 | |||
41 | struct crypto_queue queue; | ||
42 | struct work_struct postponed; | ||
43 | |||
44 | char iv[]; | ||
45 | }; | ||
46 | |||
47 | static int chainiv_givencrypt(struct skcipher_givcrypt_request *req) | ||
48 | { | ||
49 | struct crypto_ablkcipher *geniv = skcipher_givcrypt_reqtfm(req); | ||
50 | struct chainiv_ctx *ctx = crypto_ablkcipher_ctx(geniv); | ||
51 | struct ablkcipher_request *subreq = skcipher_givcrypt_reqctx(req); | ||
52 | unsigned int ivsize; | ||
53 | int err; | ||
54 | |||
55 | ablkcipher_request_set_tfm(subreq, skcipher_geniv_cipher(geniv)); | ||
56 | ablkcipher_request_set_callback(subreq, req->creq.base.flags & | ||
57 | ~CRYPTO_TFM_REQ_MAY_SLEEP, | ||
58 | req->creq.base.complete, | ||
59 | req->creq.base.data); | ||
60 | ablkcipher_request_set_crypt(subreq, req->creq.src, req->creq.dst, | ||
61 | req->creq.nbytes, req->creq.info); | ||
62 | |||
63 | spin_lock_bh(&ctx->lock); | ||
64 | |||
65 | ivsize = crypto_ablkcipher_ivsize(geniv); | ||
66 | |||
67 | memcpy(req->giv, ctx->iv, ivsize); | ||
68 | memcpy(subreq->info, ctx->iv, ivsize); | ||
69 | |||
70 | err = crypto_ablkcipher_encrypt(subreq); | ||
71 | if (err) | ||
72 | goto unlock; | ||
73 | |||
74 | memcpy(ctx->iv, subreq->info, ivsize); | ||
75 | |||
76 | unlock: | ||
77 | spin_unlock_bh(&ctx->lock); | ||
78 | |||
79 | return err; | ||
80 | } | ||
81 | |||
82 | static int chainiv_givencrypt_first(struct skcipher_givcrypt_request *req) | ||
83 | { | ||
84 | struct crypto_ablkcipher *geniv = skcipher_givcrypt_reqtfm(req); | ||
85 | struct chainiv_ctx *ctx = crypto_ablkcipher_ctx(geniv); | ||
86 | |||
87 | spin_lock_bh(&ctx->lock); | ||
88 | if (crypto_ablkcipher_crt(geniv)->givencrypt != | ||
89 | chainiv_givencrypt_first) | ||
90 | goto unlock; | ||
91 | |||
92 | crypto_ablkcipher_crt(geniv)->givencrypt = chainiv_givencrypt; | ||
93 | get_random_bytes(ctx->iv, crypto_ablkcipher_ivsize(geniv)); | ||
94 | |||
95 | unlock: | ||
96 | spin_unlock_bh(&ctx->lock); | ||
97 | |||
98 | return chainiv_givencrypt(req); | ||
99 | } | ||
100 | |||
101 | static int chainiv_init_common(struct crypto_tfm *tfm) | ||
102 | { | ||
103 | tfm->crt_ablkcipher.reqsize = sizeof(struct ablkcipher_request); | ||
104 | |||
105 | return skcipher_geniv_init(tfm); | ||
106 | } | ||
107 | |||
108 | static int chainiv_init(struct crypto_tfm *tfm) | ||
109 | { | ||
110 | struct chainiv_ctx *ctx = crypto_tfm_ctx(tfm); | ||
111 | |||
112 | spin_lock_init(&ctx->lock); | ||
113 | |||
114 | return chainiv_init_common(tfm); | ||
115 | } | ||
116 | |||
117 | static int async_chainiv_schedule_work(struct async_chainiv_ctx *ctx) | ||
118 | { | ||
119 | int queued; | ||
120 | |||
121 | if (!ctx->queue.qlen) { | ||
122 | smp_mb__before_clear_bit(); | ||
123 | clear_bit(CHAINIV_STATE_INUSE, &ctx->state); | ||
124 | |||
125 | if (!ctx->queue.qlen || | ||
126 | test_and_set_bit(CHAINIV_STATE_INUSE, &ctx->state)) | ||
127 | goto out; | ||
128 | } | ||
129 | |||
130 | queued = schedule_work(&ctx->postponed); | ||
131 | BUG_ON(!queued); | ||
132 | |||
133 | out: | ||
134 | return ctx->err; | ||
135 | } | ||
136 | |||
137 | static int async_chainiv_postpone_request(struct skcipher_givcrypt_request *req) | ||
138 | { | ||
139 | struct crypto_ablkcipher *geniv = skcipher_givcrypt_reqtfm(req); | ||
140 | struct async_chainiv_ctx *ctx = crypto_ablkcipher_ctx(geniv); | ||
141 | int err; | ||
142 | |||
143 | spin_lock_bh(&ctx->lock); | ||
144 | err = skcipher_enqueue_givcrypt(&ctx->queue, req); | ||
145 | spin_unlock_bh(&ctx->lock); | ||
146 | |||
147 | if (test_and_set_bit(CHAINIV_STATE_INUSE, &ctx->state)) | ||
148 | return err; | ||
149 | |||
150 | ctx->err = err; | ||
151 | return async_chainiv_schedule_work(ctx); | ||
152 | } | ||
153 | |||
154 | static int async_chainiv_givencrypt_tail(struct skcipher_givcrypt_request *req) | ||
155 | { | ||
156 | struct crypto_ablkcipher *geniv = skcipher_givcrypt_reqtfm(req); | ||
157 | struct async_chainiv_ctx *ctx = crypto_ablkcipher_ctx(geniv); | ||
158 | struct ablkcipher_request *subreq = skcipher_givcrypt_reqctx(req); | ||
159 | unsigned int ivsize = crypto_ablkcipher_ivsize(geniv); | ||
160 | |||
161 | memcpy(req->giv, ctx->iv, ivsize); | ||
162 | memcpy(subreq->info, ctx->iv, ivsize); | ||
163 | |||
164 | ctx->err = crypto_ablkcipher_encrypt(subreq); | ||
165 | if (ctx->err) | ||
166 | goto out; | ||
167 | |||
168 | memcpy(ctx->iv, subreq->info, ivsize); | ||
169 | |||
170 | out: | ||
171 | return async_chainiv_schedule_work(ctx); | ||
172 | } | ||
173 | |||
174 | static int async_chainiv_givencrypt(struct skcipher_givcrypt_request *req) | ||
175 | { | ||
176 | struct crypto_ablkcipher *geniv = skcipher_givcrypt_reqtfm(req); | ||
177 | struct async_chainiv_ctx *ctx = crypto_ablkcipher_ctx(geniv); | ||
178 | struct ablkcipher_request *subreq = skcipher_givcrypt_reqctx(req); | ||
179 | |||
180 | ablkcipher_request_set_tfm(subreq, skcipher_geniv_cipher(geniv)); | ||
181 | ablkcipher_request_set_callback(subreq, req->creq.base.flags, | ||
182 | req->creq.base.complete, | ||
183 | req->creq.base.data); | ||
184 | ablkcipher_request_set_crypt(subreq, req->creq.src, req->creq.dst, | ||
185 | req->creq.nbytes, req->creq.info); | ||
186 | |||
187 | if (test_and_set_bit(CHAINIV_STATE_INUSE, &ctx->state)) | ||
188 | goto postpone; | ||
189 | |||
190 | if (ctx->queue.qlen) { | ||
191 | clear_bit(CHAINIV_STATE_INUSE, &ctx->state); | ||
192 | goto postpone; | ||
193 | } | ||
194 | |||
195 | return async_chainiv_givencrypt_tail(req); | ||
196 | |||
197 | postpone: | ||
198 | return async_chainiv_postpone_request(req); | ||
199 | } | ||
200 | |||
201 | static int async_chainiv_givencrypt_first(struct skcipher_givcrypt_request *req) | ||
202 | { | ||
203 | struct crypto_ablkcipher *geniv = skcipher_givcrypt_reqtfm(req); | ||
204 | struct async_chainiv_ctx *ctx = crypto_ablkcipher_ctx(geniv); | ||
205 | |||
206 | if (test_and_set_bit(CHAINIV_STATE_INUSE, &ctx->state)) | ||
207 | goto out; | ||
208 | |||
209 | if (crypto_ablkcipher_crt(geniv)->givencrypt != | ||
210 | async_chainiv_givencrypt_first) | ||
211 | goto unlock; | ||
212 | |||
213 | crypto_ablkcipher_crt(geniv)->givencrypt = async_chainiv_givencrypt; | ||
214 | get_random_bytes(ctx->iv, crypto_ablkcipher_ivsize(geniv)); | ||
215 | |||
216 | unlock: | ||
217 | clear_bit(CHAINIV_STATE_INUSE, &ctx->state); | ||
218 | |||
219 | out: | ||
220 | return async_chainiv_givencrypt(req); | ||
221 | } | ||
222 | |||
223 | static void async_chainiv_do_postponed(struct work_struct *work) | ||
224 | { | ||
225 | struct async_chainiv_ctx *ctx = container_of(work, | ||
226 | struct async_chainiv_ctx, | ||
227 | postponed); | ||
228 | struct skcipher_givcrypt_request *req; | ||
229 | struct ablkcipher_request *subreq; | ||
230 | |||
231 | /* Only handle one request at a time to avoid hogging keventd. */ | ||
232 | spin_lock_bh(&ctx->lock); | ||
233 | req = skcipher_dequeue_givcrypt(&ctx->queue); | ||
234 | spin_unlock_bh(&ctx->lock); | ||
235 | |||
236 | if (!req) { | ||
237 | async_chainiv_schedule_work(ctx); | ||
238 | return; | ||
239 | } | ||
240 | |||
241 | subreq = skcipher_givcrypt_reqctx(req); | ||
242 | subreq->base.flags |= CRYPTO_TFM_REQ_MAY_SLEEP; | ||
243 | |||
244 | async_chainiv_givencrypt_tail(req); | ||
245 | } | ||
246 | |||
247 | static int async_chainiv_init(struct crypto_tfm *tfm) | ||
248 | { | ||
249 | struct async_chainiv_ctx *ctx = crypto_tfm_ctx(tfm); | ||
250 | |||
251 | spin_lock_init(&ctx->lock); | ||
252 | |||
253 | crypto_init_queue(&ctx->queue, 100); | ||
254 | INIT_WORK(&ctx->postponed, async_chainiv_do_postponed); | ||
255 | |||
256 | return chainiv_init_common(tfm); | ||
257 | } | ||
258 | |||
259 | static void async_chainiv_exit(struct crypto_tfm *tfm) | ||
260 | { | ||
261 | struct async_chainiv_ctx *ctx = crypto_tfm_ctx(tfm); | ||
262 | |||
263 | BUG_ON(test_bit(CHAINIV_STATE_INUSE, &ctx->state) || ctx->queue.qlen); | ||
264 | |||
265 | skcipher_geniv_exit(tfm); | ||
266 | } | ||
267 | |||
268 | static struct crypto_template chainiv_tmpl; | ||
269 | |||
270 | static struct crypto_instance *chainiv_alloc(struct rtattr **tb) | ||
271 | { | ||
272 | struct crypto_attr_type *algt; | ||
273 | struct crypto_instance *inst; | ||
274 | int err; | ||
275 | |||
276 | algt = crypto_get_attr_type(tb); | ||
277 | err = PTR_ERR(algt); | ||
278 | if (IS_ERR(algt)) | ||
279 | return ERR_PTR(err); | ||
280 | |||
281 | inst = skcipher_geniv_alloc(&chainiv_tmpl, tb, 0, 0); | ||
282 | if (IS_ERR(inst)) | ||
283 | goto out; | ||
284 | |||
285 | inst->alg.cra_ablkcipher.givencrypt = chainiv_givencrypt_first; | ||
286 | |||
287 | inst->alg.cra_init = chainiv_init; | ||
288 | inst->alg.cra_exit = skcipher_geniv_exit; | ||
289 | |||
290 | inst->alg.cra_ctxsize = sizeof(struct chainiv_ctx); | ||
291 | |||
292 | if (!crypto_requires_sync(algt->type, algt->mask)) { | ||
293 | inst->alg.cra_flags |= CRYPTO_ALG_ASYNC; | ||
294 | |||
295 | inst->alg.cra_ablkcipher.givencrypt = | ||
296 | async_chainiv_givencrypt_first; | ||
297 | |||
298 | inst->alg.cra_init = async_chainiv_init; | ||
299 | inst->alg.cra_exit = async_chainiv_exit; | ||
300 | |||
301 | inst->alg.cra_ctxsize = sizeof(struct async_chainiv_ctx); | ||
302 | } | ||
303 | |||
304 | inst->alg.cra_ctxsize += inst->alg.cra_ablkcipher.ivsize; | ||
305 | |||
306 | out: | ||
307 | return inst; | ||
308 | } | ||
309 | |||
310 | static struct crypto_template chainiv_tmpl = { | ||
311 | .name = "chainiv", | ||
312 | .alloc = chainiv_alloc, | ||
313 | .free = skcipher_geniv_free, | ||
314 | .module = THIS_MODULE, | ||
315 | }; | ||
316 | |||
317 | static int __init chainiv_module_init(void) | ||
318 | { | ||
319 | return crypto_register_template(&chainiv_tmpl); | ||
320 | } | ||
321 | |||
322 | static void __exit chainiv_module_exit(void) | ||
323 | { | ||
324 | crypto_unregister_template(&chainiv_tmpl); | ||
325 | } | ||
326 | |||
327 | module_init(chainiv_module_init); | ||
328 | module_exit(chainiv_module_exit); | ||
329 | |||
330 | MODULE_LICENSE("GPL"); | ||
331 | MODULE_DESCRIPTION("Chain IV Generator"); | ||
diff --git a/crypto/cryptd.c b/crypto/cryptd.c index 8bf2da835f7b..074298f2f8e3 100644 --- a/crypto/cryptd.c +++ b/crypto/cryptd.c | |||
@@ -228,7 +228,7 @@ static struct crypto_instance *cryptd_alloc_blkcipher( | |||
228 | struct crypto_alg *alg; | 228 | struct crypto_alg *alg; |
229 | 229 | ||
230 | alg = crypto_get_attr_alg(tb, CRYPTO_ALG_TYPE_BLKCIPHER, | 230 | alg = crypto_get_attr_alg(tb, CRYPTO_ALG_TYPE_BLKCIPHER, |
231 | CRYPTO_ALG_TYPE_MASK | CRYPTO_ALG_ASYNC); | 231 | CRYPTO_ALG_TYPE_MASK); |
232 | if (IS_ERR(alg)) | 232 | if (IS_ERR(alg)) |
233 | return ERR_PTR(PTR_ERR(alg)); | 233 | return ERR_PTR(PTR_ERR(alg)); |
234 | 234 | ||
@@ -236,13 +236,15 @@ static struct crypto_instance *cryptd_alloc_blkcipher( | |||
236 | if (IS_ERR(inst)) | 236 | if (IS_ERR(inst)) |
237 | goto out_put_alg; | 237 | goto out_put_alg; |
238 | 238 | ||
239 | inst->alg.cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER | CRYPTO_ALG_ASYNC; | 239 | inst->alg.cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER | CRYPTO_ALG_ASYNC; |
240 | inst->alg.cra_type = &crypto_ablkcipher_type; | 240 | inst->alg.cra_type = &crypto_ablkcipher_type; |
241 | 241 | ||
242 | inst->alg.cra_ablkcipher.ivsize = alg->cra_blkcipher.ivsize; | 242 | inst->alg.cra_ablkcipher.ivsize = alg->cra_blkcipher.ivsize; |
243 | inst->alg.cra_ablkcipher.min_keysize = alg->cra_blkcipher.min_keysize; | 243 | inst->alg.cra_ablkcipher.min_keysize = alg->cra_blkcipher.min_keysize; |
244 | inst->alg.cra_ablkcipher.max_keysize = alg->cra_blkcipher.max_keysize; | 244 | inst->alg.cra_ablkcipher.max_keysize = alg->cra_blkcipher.max_keysize; |
245 | 245 | ||
246 | inst->alg.cra_ablkcipher.geniv = alg->cra_blkcipher.geniv; | ||
247 | |||
246 | inst->alg.cra_ctxsize = sizeof(struct cryptd_blkcipher_ctx); | 248 | inst->alg.cra_ctxsize = sizeof(struct cryptd_blkcipher_ctx); |
247 | 249 | ||
248 | inst->alg.cra_init = cryptd_blkcipher_init_tfm; | 250 | inst->alg.cra_init = cryptd_blkcipher_init_tfm; |
diff --git a/crypto/crypto_null.c b/crypto/crypto_null.c index 29f77477d701..ff7b3de1bcfd 100644 --- a/crypto/crypto_null.c +++ b/crypto/crypto_null.c | |||
@@ -16,15 +16,17 @@ | |||
16 | * (at your option) any later version. | 16 | * (at your option) any later version. |
17 | * | 17 | * |
18 | */ | 18 | */ |
19 | |||
20 | #include <crypto/internal/skcipher.h> | ||
19 | #include <linux/init.h> | 21 | #include <linux/init.h> |
20 | #include <linux/module.h> | 22 | #include <linux/module.h> |
21 | #include <linux/mm.h> | 23 | #include <linux/mm.h> |
22 | #include <linux/crypto.h> | ||
23 | #include <linux/string.h> | 24 | #include <linux/string.h> |
24 | 25 | ||
25 | #define NULL_KEY_SIZE 0 | 26 | #define NULL_KEY_SIZE 0 |
26 | #define NULL_BLOCK_SIZE 1 | 27 | #define NULL_BLOCK_SIZE 1 |
27 | #define NULL_DIGEST_SIZE 0 | 28 | #define NULL_DIGEST_SIZE 0 |
29 | #define NULL_IV_SIZE 0 | ||
28 | 30 | ||
29 | static int null_compress(struct crypto_tfm *tfm, const u8 *src, | 31 | static int null_compress(struct crypto_tfm *tfm, const u8 *src, |
30 | unsigned int slen, u8 *dst, unsigned int *dlen) | 32 | unsigned int slen, u8 *dst, unsigned int *dlen) |
@@ -55,6 +57,26 @@ static void null_crypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src) | |||
55 | memcpy(dst, src, NULL_BLOCK_SIZE); | 57 | memcpy(dst, src, NULL_BLOCK_SIZE); |
56 | } | 58 | } |
57 | 59 | ||
60 | static int skcipher_null_crypt(struct blkcipher_desc *desc, | ||
61 | struct scatterlist *dst, | ||
62 | struct scatterlist *src, unsigned int nbytes) | ||
63 | { | ||
64 | struct blkcipher_walk walk; | ||
65 | int err; | ||
66 | |||
67 | blkcipher_walk_init(&walk, dst, src, nbytes); | ||
68 | err = blkcipher_walk_virt(desc, &walk); | ||
69 | |||
70 | while (walk.nbytes) { | ||
71 | if (walk.src.virt.addr != walk.dst.virt.addr) | ||
72 | memcpy(walk.dst.virt.addr, walk.src.virt.addr, | ||
73 | walk.nbytes); | ||
74 | err = blkcipher_walk_done(desc, &walk, 0); | ||
75 | } | ||
76 | |||
77 | return err; | ||
78 | } | ||
79 | |||
58 | static struct crypto_alg compress_null = { | 80 | static struct crypto_alg compress_null = { |
59 | .cra_name = "compress_null", | 81 | .cra_name = "compress_null", |
60 | .cra_flags = CRYPTO_ALG_TYPE_COMPRESS, | 82 | .cra_flags = CRYPTO_ALG_TYPE_COMPRESS, |
@@ -76,6 +98,7 @@ static struct crypto_alg digest_null = { | |||
76 | .cra_list = LIST_HEAD_INIT(digest_null.cra_list), | 98 | .cra_list = LIST_HEAD_INIT(digest_null.cra_list), |
77 | .cra_u = { .digest = { | 99 | .cra_u = { .digest = { |
78 | .dia_digestsize = NULL_DIGEST_SIZE, | 100 | .dia_digestsize = NULL_DIGEST_SIZE, |
101 | .dia_setkey = null_setkey, | ||
79 | .dia_init = null_init, | 102 | .dia_init = null_init, |
80 | .dia_update = null_update, | 103 | .dia_update = null_update, |
81 | .dia_final = null_final } } | 104 | .dia_final = null_final } } |
@@ -96,6 +119,25 @@ static struct crypto_alg cipher_null = { | |||
96 | .cia_decrypt = null_crypt } } | 119 | .cia_decrypt = null_crypt } } |
97 | }; | 120 | }; |
98 | 121 | ||
122 | static struct crypto_alg skcipher_null = { | ||
123 | .cra_name = "ecb(cipher_null)", | ||
124 | .cra_driver_name = "ecb-cipher_null", | ||
125 | .cra_priority = 100, | ||
126 | .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER, | ||
127 | .cra_blocksize = NULL_BLOCK_SIZE, | ||
128 | .cra_type = &crypto_blkcipher_type, | ||
129 | .cra_ctxsize = 0, | ||
130 | .cra_module = THIS_MODULE, | ||
131 | .cra_list = LIST_HEAD_INIT(skcipher_null.cra_list), | ||
132 | .cra_u = { .blkcipher = { | ||
133 | .min_keysize = NULL_KEY_SIZE, | ||
134 | .max_keysize = NULL_KEY_SIZE, | ||
135 | .ivsize = NULL_IV_SIZE, | ||
136 | .setkey = null_setkey, | ||
137 | .encrypt = skcipher_null_crypt, | ||
138 | .decrypt = skcipher_null_crypt } } | ||
139 | }; | ||
140 | |||
99 | MODULE_ALIAS("compress_null"); | 141 | MODULE_ALIAS("compress_null"); |
100 | MODULE_ALIAS("digest_null"); | 142 | MODULE_ALIAS("digest_null"); |
101 | MODULE_ALIAS("cipher_null"); | 143 | MODULE_ALIAS("cipher_null"); |
@@ -108,27 +150,35 @@ static int __init init(void) | |||
108 | if (ret < 0) | 150 | if (ret < 0) |
109 | goto out; | 151 | goto out; |
110 | 152 | ||
153 | ret = crypto_register_alg(&skcipher_null); | ||
154 | if (ret < 0) | ||
155 | goto out_unregister_cipher; | ||
156 | |||
111 | ret = crypto_register_alg(&digest_null); | 157 | ret = crypto_register_alg(&digest_null); |
112 | if (ret < 0) { | 158 | if (ret < 0) |
113 | crypto_unregister_alg(&cipher_null); | 159 | goto out_unregister_skcipher; |
114 | goto out; | ||
115 | } | ||
116 | 160 | ||
117 | ret = crypto_register_alg(&compress_null); | 161 | ret = crypto_register_alg(&compress_null); |
118 | if (ret < 0) { | 162 | if (ret < 0) |
119 | crypto_unregister_alg(&digest_null); | 163 | goto out_unregister_digest; |
120 | crypto_unregister_alg(&cipher_null); | ||
121 | goto out; | ||
122 | } | ||
123 | 164 | ||
124 | out: | 165 | out: |
125 | return ret; | 166 | return ret; |
167 | |||
168 | out_unregister_digest: | ||
169 | crypto_unregister_alg(&digest_null); | ||
170 | out_unregister_skcipher: | ||
171 | crypto_unregister_alg(&skcipher_null); | ||
172 | out_unregister_cipher: | ||
173 | crypto_unregister_alg(&cipher_null); | ||
174 | goto out; | ||
126 | } | 175 | } |
127 | 176 | ||
128 | static void __exit fini(void) | 177 | static void __exit fini(void) |
129 | { | 178 | { |
130 | crypto_unregister_alg(&compress_null); | 179 | crypto_unregister_alg(&compress_null); |
131 | crypto_unregister_alg(&digest_null); | 180 | crypto_unregister_alg(&digest_null); |
181 | crypto_unregister_alg(&skcipher_null); | ||
132 | crypto_unregister_alg(&cipher_null); | 182 | crypto_unregister_alg(&cipher_null); |
133 | } | 183 | } |
134 | 184 | ||
diff --git a/crypto/ctr.c b/crypto/ctr.c new file mode 100644 index 000000000000..2d7425f0e7b8 --- /dev/null +++ b/crypto/ctr.c | |||
@@ -0,0 +1,422 @@ | |||
1 | /* | ||
2 | * CTR: Counter mode | ||
3 | * | ||
4 | * (C) Copyright IBM Corp. 2007 - Joy Latten <latten@us.ibm.com> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify it | ||
7 | * under the terms of the GNU General Public License as published by the Free | ||
8 | * Software Foundation; either version 2 of the License, or (at your option) | ||
9 | * any later version. | ||
10 | * | ||
11 | */ | ||
12 | |||
13 | #include <crypto/algapi.h> | ||
14 | #include <crypto/ctr.h> | ||
15 | #include <linux/err.h> | ||
16 | #include <linux/init.h> | ||
17 | #include <linux/kernel.h> | ||
18 | #include <linux/module.h> | ||
19 | #include <linux/random.h> | ||
20 | #include <linux/scatterlist.h> | ||
21 | #include <linux/slab.h> | ||
22 | |||
23 | struct crypto_ctr_ctx { | ||
24 | struct crypto_cipher *child; | ||
25 | }; | ||
26 | |||
27 | struct crypto_rfc3686_ctx { | ||
28 | struct crypto_blkcipher *child; | ||
29 | u8 nonce[CTR_RFC3686_NONCE_SIZE]; | ||
30 | }; | ||
31 | |||
32 | static int crypto_ctr_setkey(struct crypto_tfm *parent, const u8 *key, | ||
33 | unsigned int keylen) | ||
34 | { | ||
35 | struct crypto_ctr_ctx *ctx = crypto_tfm_ctx(parent); | ||
36 | struct crypto_cipher *child = ctx->child; | ||
37 | int err; | ||
38 | |||
39 | crypto_cipher_clear_flags(child, CRYPTO_TFM_REQ_MASK); | ||
40 | crypto_cipher_set_flags(child, crypto_tfm_get_flags(parent) & | ||
41 | CRYPTO_TFM_REQ_MASK); | ||
42 | err = crypto_cipher_setkey(child, key, keylen); | ||
43 | crypto_tfm_set_flags(parent, crypto_cipher_get_flags(child) & | ||
44 | CRYPTO_TFM_RES_MASK); | ||
45 | |||
46 | return err; | ||
47 | } | ||
48 | |||
49 | static void crypto_ctr_crypt_final(struct blkcipher_walk *walk, | ||
50 | struct crypto_cipher *tfm) | ||
51 | { | ||
52 | unsigned int bsize = crypto_cipher_blocksize(tfm); | ||
53 | unsigned long alignmask = crypto_cipher_alignmask(tfm); | ||
54 | u8 *ctrblk = walk->iv; | ||
55 | u8 tmp[bsize + alignmask]; | ||
56 | u8 *keystream = PTR_ALIGN(tmp + 0, alignmask + 1); | ||
57 | u8 *src = walk->src.virt.addr; | ||
58 | u8 *dst = walk->dst.virt.addr; | ||
59 | unsigned int nbytes = walk->nbytes; | ||
60 | |||
61 | crypto_cipher_encrypt_one(tfm, keystream, ctrblk); | ||
62 | crypto_xor(keystream, src, nbytes); | ||
63 | memcpy(dst, keystream, nbytes); | ||
64 | |||
65 | crypto_inc(ctrblk, bsize); | ||
66 | } | ||
67 | |||
68 | static int crypto_ctr_crypt_segment(struct blkcipher_walk *walk, | ||
69 | struct crypto_cipher *tfm) | ||
70 | { | ||
71 | void (*fn)(struct crypto_tfm *, u8 *, const u8 *) = | ||
72 | crypto_cipher_alg(tfm)->cia_encrypt; | ||
73 | unsigned int bsize = crypto_cipher_blocksize(tfm); | ||
74 | u8 *ctrblk = walk->iv; | ||
75 | u8 *src = walk->src.virt.addr; | ||
76 | u8 *dst = walk->dst.virt.addr; | ||
77 | unsigned int nbytes = walk->nbytes; | ||
78 | |||
79 | do { | ||
80 | /* create keystream */ | ||
81 | fn(crypto_cipher_tfm(tfm), dst, ctrblk); | ||
82 | crypto_xor(dst, src, bsize); | ||
83 | |||
84 | /* increment counter in counterblock */ | ||
85 | crypto_inc(ctrblk, bsize); | ||
86 | |||
87 | src += bsize; | ||
88 | dst += bsize; | ||
89 | } while ((nbytes -= bsize) >= bsize); | ||
90 | |||
91 | return nbytes; | ||
92 | } | ||
93 | |||
94 | static int crypto_ctr_crypt_inplace(struct blkcipher_walk *walk, | ||
95 | struct crypto_cipher *tfm) | ||
96 | { | ||
97 | void (*fn)(struct crypto_tfm *, u8 *, const u8 *) = | ||
98 | crypto_cipher_alg(tfm)->cia_encrypt; | ||
99 | unsigned int bsize = crypto_cipher_blocksize(tfm); | ||
100 | unsigned long alignmask = crypto_cipher_alignmask(tfm); | ||
101 | unsigned int nbytes = walk->nbytes; | ||
102 | u8 *ctrblk = walk->iv; | ||
103 | u8 *src = walk->src.virt.addr; | ||
104 | u8 tmp[bsize + alignmask]; | ||
105 | u8 *keystream = PTR_ALIGN(tmp + 0, alignmask + 1); | ||
106 | |||
107 | do { | ||
108 | /* create keystream */ | ||
109 | fn(crypto_cipher_tfm(tfm), keystream, ctrblk); | ||
110 | crypto_xor(src, keystream, bsize); | ||
111 | |||
112 | /* increment counter in counterblock */ | ||
113 | crypto_inc(ctrblk, bsize); | ||
114 | |||
115 | src += bsize; | ||
116 | } while ((nbytes -= bsize) >= bsize); | ||
117 | |||
118 | return nbytes; | ||
119 | } | ||
120 | |||
121 | static int crypto_ctr_crypt(struct blkcipher_desc *desc, | ||
122 | struct scatterlist *dst, struct scatterlist *src, | ||
123 | unsigned int nbytes) | ||
124 | { | ||
125 | struct blkcipher_walk walk; | ||
126 | struct crypto_blkcipher *tfm = desc->tfm; | ||
127 | struct crypto_ctr_ctx *ctx = crypto_blkcipher_ctx(tfm); | ||
128 | struct crypto_cipher *child = ctx->child; | ||
129 | unsigned int bsize = crypto_cipher_blocksize(child); | ||
130 | int err; | ||
131 | |||
132 | blkcipher_walk_init(&walk, dst, src, nbytes); | ||
133 | err = blkcipher_walk_virt_block(desc, &walk, bsize); | ||
134 | |||
135 | while (walk.nbytes >= bsize) { | ||
136 | if (walk.src.virt.addr == walk.dst.virt.addr) | ||
137 | nbytes = crypto_ctr_crypt_inplace(&walk, child); | ||
138 | else | ||
139 | nbytes = crypto_ctr_crypt_segment(&walk, child); | ||
140 | |||
141 | err = blkcipher_walk_done(desc, &walk, nbytes); | ||
142 | } | ||
143 | |||
144 | if (walk.nbytes) { | ||
145 | crypto_ctr_crypt_final(&walk, child); | ||
146 | err = blkcipher_walk_done(desc, &walk, 0); | ||
147 | } | ||
148 | |||
149 | return err; | ||
150 | } | ||
151 | |||
152 | static int crypto_ctr_init_tfm(struct crypto_tfm *tfm) | ||
153 | { | ||
154 | struct crypto_instance *inst = (void *)tfm->__crt_alg; | ||
155 | struct crypto_spawn *spawn = crypto_instance_ctx(inst); | ||
156 | struct crypto_ctr_ctx *ctx = crypto_tfm_ctx(tfm); | ||
157 | struct crypto_cipher *cipher; | ||
158 | |||
159 | cipher = crypto_spawn_cipher(spawn); | ||
160 | if (IS_ERR(cipher)) | ||
161 | return PTR_ERR(cipher); | ||
162 | |||
163 | ctx->child = cipher; | ||
164 | |||
165 | return 0; | ||
166 | } | ||
167 | |||
168 | static void crypto_ctr_exit_tfm(struct crypto_tfm *tfm) | ||
169 | { | ||
170 | struct crypto_ctr_ctx *ctx = crypto_tfm_ctx(tfm); | ||
171 | |||
172 | crypto_free_cipher(ctx->child); | ||
173 | } | ||
174 | |||
175 | static struct crypto_instance *crypto_ctr_alloc(struct rtattr **tb) | ||
176 | { | ||
177 | struct crypto_instance *inst; | ||
178 | struct crypto_alg *alg; | ||
179 | int err; | ||
180 | |||
181 | err = crypto_check_attr_type(tb, CRYPTO_ALG_TYPE_BLKCIPHER); | ||
182 | if (err) | ||
183 | return ERR_PTR(err); | ||
184 | |||
185 | alg = crypto_attr_alg(tb[1], CRYPTO_ALG_TYPE_CIPHER, | ||
186 | CRYPTO_ALG_TYPE_MASK); | ||
187 | if (IS_ERR(alg)) | ||
188 | return ERR_PTR(PTR_ERR(alg)); | ||
189 | |||
190 | /* Block size must be >= 4 bytes. */ | ||
191 | err = -EINVAL; | ||
192 | if (alg->cra_blocksize < 4) | ||
193 | goto out_put_alg; | ||
194 | |||
195 | /* If this is false we'd fail the alignment of crypto_inc. */ | ||
196 | if (alg->cra_blocksize % 4) | ||
197 | goto out_put_alg; | ||
198 | |||
199 | inst = crypto_alloc_instance("ctr", alg); | ||
200 | if (IS_ERR(inst)) | ||
201 | goto out; | ||
202 | |||
203 | inst->alg.cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER; | ||
204 | inst->alg.cra_priority = alg->cra_priority; | ||
205 | inst->alg.cra_blocksize = 1; | ||
206 | inst->alg.cra_alignmask = alg->cra_alignmask | (__alignof__(u32) - 1); | ||
207 | inst->alg.cra_type = &crypto_blkcipher_type; | ||
208 | |||
209 | inst->alg.cra_blkcipher.ivsize = alg->cra_blocksize; | ||
210 | inst->alg.cra_blkcipher.min_keysize = alg->cra_cipher.cia_min_keysize; | ||
211 | inst->alg.cra_blkcipher.max_keysize = alg->cra_cipher.cia_max_keysize; | ||
212 | |||
213 | inst->alg.cra_ctxsize = sizeof(struct crypto_ctr_ctx); | ||
214 | |||
215 | inst->alg.cra_init = crypto_ctr_init_tfm; | ||
216 | inst->alg.cra_exit = crypto_ctr_exit_tfm; | ||
217 | |||
218 | inst->alg.cra_blkcipher.setkey = crypto_ctr_setkey; | ||
219 | inst->alg.cra_blkcipher.encrypt = crypto_ctr_crypt; | ||
220 | inst->alg.cra_blkcipher.decrypt = crypto_ctr_crypt; | ||
221 | |||
222 | out: | ||
223 | crypto_mod_put(alg); | ||
224 | return inst; | ||
225 | |||
226 | out_put_alg: | ||
227 | inst = ERR_PTR(err); | ||
228 | goto out; | ||
229 | } | ||
230 | |||
231 | static void crypto_ctr_free(struct crypto_instance *inst) | ||
232 | { | ||
233 | crypto_drop_spawn(crypto_instance_ctx(inst)); | ||
234 | kfree(inst); | ||
235 | } | ||
236 | |||
237 | static struct crypto_template crypto_ctr_tmpl = { | ||
238 | .name = "ctr", | ||
239 | .alloc = crypto_ctr_alloc, | ||
240 | .free = crypto_ctr_free, | ||
241 | .module = THIS_MODULE, | ||
242 | }; | ||
243 | |||
244 | static int crypto_rfc3686_setkey(struct crypto_tfm *parent, const u8 *key, | ||
245 | unsigned int keylen) | ||
246 | { | ||
247 | struct crypto_rfc3686_ctx *ctx = crypto_tfm_ctx(parent); | ||
248 | struct crypto_blkcipher *child = ctx->child; | ||
249 | int err; | ||
250 | |||
251 | /* the nonce is stored in bytes at end of key */ | ||
252 | if (keylen < CTR_RFC3686_NONCE_SIZE) | ||
253 | return -EINVAL; | ||
254 | |||
255 | memcpy(ctx->nonce, key + (keylen - CTR_RFC3686_NONCE_SIZE), | ||
256 | CTR_RFC3686_NONCE_SIZE); | ||
257 | |||
258 | keylen -= CTR_RFC3686_NONCE_SIZE; | ||
259 | |||
260 | crypto_blkcipher_clear_flags(child, CRYPTO_TFM_REQ_MASK); | ||
261 | crypto_blkcipher_set_flags(child, crypto_tfm_get_flags(parent) & | ||
262 | CRYPTO_TFM_REQ_MASK); | ||
263 | err = crypto_blkcipher_setkey(child, key, keylen); | ||
264 | crypto_tfm_set_flags(parent, crypto_blkcipher_get_flags(child) & | ||
265 | CRYPTO_TFM_RES_MASK); | ||
266 | |||
267 | return err; | ||
268 | } | ||
269 | |||
270 | static int crypto_rfc3686_crypt(struct blkcipher_desc *desc, | ||
271 | struct scatterlist *dst, | ||
272 | struct scatterlist *src, unsigned int nbytes) | ||
273 | { | ||
274 | struct crypto_blkcipher *tfm = desc->tfm; | ||
275 | struct crypto_rfc3686_ctx *ctx = crypto_blkcipher_ctx(tfm); | ||
276 | struct crypto_blkcipher *child = ctx->child; | ||
277 | unsigned long alignmask = crypto_blkcipher_alignmask(tfm); | ||
278 | u8 ivblk[CTR_RFC3686_BLOCK_SIZE + alignmask]; | ||
279 | u8 *iv = PTR_ALIGN(ivblk + 0, alignmask + 1); | ||
280 | u8 *info = desc->info; | ||
281 | int err; | ||
282 | |||
283 | /* set up counter block */ | ||
284 | memcpy(iv, ctx->nonce, CTR_RFC3686_NONCE_SIZE); | ||
285 | memcpy(iv + CTR_RFC3686_NONCE_SIZE, info, CTR_RFC3686_IV_SIZE); | ||
286 | |||
287 | /* initialize counter portion of counter block */ | ||
288 | *(__be32 *)(iv + CTR_RFC3686_NONCE_SIZE + CTR_RFC3686_IV_SIZE) = | ||
289 | cpu_to_be32(1); | ||
290 | |||
291 | desc->tfm = child; | ||
292 | desc->info = iv; | ||
293 | err = crypto_blkcipher_encrypt_iv(desc, dst, src, nbytes); | ||
294 | desc->tfm = tfm; | ||
295 | desc->info = info; | ||
296 | |||
297 | return err; | ||
298 | } | ||
299 | |||
300 | static int crypto_rfc3686_init_tfm(struct crypto_tfm *tfm) | ||
301 | { | ||
302 | struct crypto_instance *inst = (void *)tfm->__crt_alg; | ||
303 | struct crypto_spawn *spawn = crypto_instance_ctx(inst); | ||
304 | struct crypto_rfc3686_ctx *ctx = crypto_tfm_ctx(tfm); | ||
305 | struct crypto_blkcipher *cipher; | ||
306 | |||
307 | cipher = crypto_spawn_blkcipher(spawn); | ||
308 | if (IS_ERR(cipher)) | ||
309 | return PTR_ERR(cipher); | ||
310 | |||
311 | ctx->child = cipher; | ||
312 | |||
313 | return 0; | ||
314 | } | ||
315 | |||
316 | static void crypto_rfc3686_exit_tfm(struct crypto_tfm *tfm) | ||
317 | { | ||
318 | struct crypto_rfc3686_ctx *ctx = crypto_tfm_ctx(tfm); | ||
319 | |||
320 | crypto_free_blkcipher(ctx->child); | ||
321 | } | ||
322 | |||
323 | static struct crypto_instance *crypto_rfc3686_alloc(struct rtattr **tb) | ||
324 | { | ||
325 | struct crypto_instance *inst; | ||
326 | struct crypto_alg *alg; | ||
327 | int err; | ||
328 | |||
329 | err = crypto_check_attr_type(tb, CRYPTO_ALG_TYPE_BLKCIPHER); | ||
330 | if (err) | ||
331 | return ERR_PTR(err); | ||
332 | |||
333 | alg = crypto_attr_alg(tb[1], CRYPTO_ALG_TYPE_BLKCIPHER, | ||
334 | CRYPTO_ALG_TYPE_MASK); | ||
335 | err = PTR_ERR(alg); | ||
336 | if (IS_ERR(alg)) | ||
337 | return ERR_PTR(err); | ||
338 | |||
339 | /* We only support 16-byte blocks. */ | ||
340 | err = -EINVAL; | ||
341 | if (alg->cra_blkcipher.ivsize != CTR_RFC3686_BLOCK_SIZE) | ||
342 | goto out_put_alg; | ||
343 | |||
344 | /* Not a stream cipher? */ | ||
345 | if (alg->cra_blocksize != 1) | ||
346 | goto out_put_alg; | ||
347 | |||
348 | inst = crypto_alloc_instance("rfc3686", alg); | ||
349 | if (IS_ERR(inst)) | ||
350 | goto out; | ||
351 | |||
352 | inst->alg.cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER; | ||
353 | inst->alg.cra_priority = alg->cra_priority; | ||
354 | inst->alg.cra_blocksize = 1; | ||
355 | inst->alg.cra_alignmask = alg->cra_alignmask; | ||
356 | inst->alg.cra_type = &crypto_blkcipher_type; | ||
357 | |||
358 | inst->alg.cra_blkcipher.ivsize = CTR_RFC3686_IV_SIZE; | ||
359 | inst->alg.cra_blkcipher.min_keysize = alg->cra_blkcipher.min_keysize | ||
360 | + CTR_RFC3686_NONCE_SIZE; | ||
361 | inst->alg.cra_blkcipher.max_keysize = alg->cra_blkcipher.max_keysize | ||
362 | + CTR_RFC3686_NONCE_SIZE; | ||
363 | |||
364 | inst->alg.cra_blkcipher.geniv = "seqiv"; | ||
365 | |||
366 | inst->alg.cra_ctxsize = sizeof(struct crypto_rfc3686_ctx); | ||
367 | |||
368 | inst->alg.cra_init = crypto_rfc3686_init_tfm; | ||
369 | inst->alg.cra_exit = crypto_rfc3686_exit_tfm; | ||
370 | |||
371 | inst->alg.cra_blkcipher.setkey = crypto_rfc3686_setkey; | ||
372 | inst->alg.cra_blkcipher.encrypt = crypto_rfc3686_crypt; | ||
373 | inst->alg.cra_blkcipher.decrypt = crypto_rfc3686_crypt; | ||
374 | |||
375 | out: | ||
376 | crypto_mod_put(alg); | ||
377 | return inst; | ||
378 | |||
379 | out_put_alg: | ||
380 | inst = ERR_PTR(err); | ||
381 | goto out; | ||
382 | } | ||
383 | |||
384 | static struct crypto_template crypto_rfc3686_tmpl = { | ||
385 | .name = "rfc3686", | ||
386 | .alloc = crypto_rfc3686_alloc, | ||
387 | .free = crypto_ctr_free, | ||
388 | .module = THIS_MODULE, | ||
389 | }; | ||
390 | |||
391 | static int __init crypto_ctr_module_init(void) | ||
392 | { | ||
393 | int err; | ||
394 | |||
395 | err = crypto_register_template(&crypto_ctr_tmpl); | ||
396 | if (err) | ||
397 | goto out; | ||
398 | |||
399 | err = crypto_register_template(&crypto_rfc3686_tmpl); | ||
400 | if (err) | ||
401 | goto out_drop_ctr; | ||
402 | |||
403 | out: | ||
404 | return err; | ||
405 | |||
406 | out_drop_ctr: | ||
407 | crypto_unregister_template(&crypto_ctr_tmpl); | ||
408 | goto out; | ||
409 | } | ||
410 | |||
411 | static void __exit crypto_ctr_module_exit(void) | ||
412 | { | ||
413 | crypto_unregister_template(&crypto_rfc3686_tmpl); | ||
414 | crypto_unregister_template(&crypto_ctr_tmpl); | ||
415 | } | ||
416 | |||
417 | module_init(crypto_ctr_module_init); | ||
418 | module_exit(crypto_ctr_module_exit); | ||
419 | |||
420 | MODULE_LICENSE("GPL"); | ||
421 | MODULE_DESCRIPTION("CTR Counter block mode"); | ||
422 | MODULE_ALIAS("rfc3686"); | ||
diff --git a/crypto/des_generic.c b/crypto/des_generic.c index 59966d14b8e0..355ecb71cb0d 100644 --- a/crypto/des_generic.c +++ b/crypto/des_generic.c | |||
@@ -20,13 +20,7 @@ | |||
20 | #include <linux/crypto.h> | 20 | #include <linux/crypto.h> |
21 | #include <linux/types.h> | 21 | #include <linux/types.h> |
22 | 22 | ||
23 | #define DES_KEY_SIZE 8 | 23 | #include <crypto/des.h> |
24 | #define DES_EXPKEY_WORDS 32 | ||
25 | #define DES_BLOCK_SIZE 8 | ||
26 | |||
27 | #define DES3_EDE_KEY_SIZE (3 * DES_KEY_SIZE) | ||
28 | #define DES3_EDE_EXPKEY_WORDS (3 * DES_EXPKEY_WORDS) | ||
29 | #define DES3_EDE_BLOCK_SIZE DES_BLOCK_SIZE | ||
30 | 24 | ||
31 | #define ROL(x, r) ((x) = rol32((x), (r))) | 25 | #define ROL(x, r) ((x) = rol32((x), (r))) |
32 | #define ROR(x, r) ((x) = ror32((x), (r))) | 26 | #define ROR(x, r) ((x) = ror32((x), (r))) |
@@ -634,7 +628,7 @@ static const u32 S8[64] = { | |||
634 | * Choice 1 has operated on the key. | 628 | * Choice 1 has operated on the key. |
635 | * | 629 | * |
636 | */ | 630 | */ |
637 | static unsigned long ekey(u32 *pe, const u8 *k) | 631 | unsigned long des_ekey(u32 *pe, const u8 *k) |
638 | { | 632 | { |
639 | /* K&R: long is at least 32 bits */ | 633 | /* K&R: long is at least 32 bits */ |
640 | unsigned long a, b, c, d, w; | 634 | unsigned long a, b, c, d, w; |
@@ -709,6 +703,7 @@ static unsigned long ekey(u32 *pe, const u8 *k) | |||
709 | /* Zero if weak key */ | 703 | /* Zero if weak key */ |
710 | return w; | 704 | return w; |
711 | } | 705 | } |
706 | EXPORT_SYMBOL_GPL(des_ekey); | ||
712 | 707 | ||
713 | /* | 708 | /* |
714 | * Decryption key expansion | 709 | * Decryption key expansion |
@@ -792,7 +787,7 @@ static int des_setkey(struct crypto_tfm *tfm, const u8 *key, | |||
792 | int ret; | 787 | int ret; |
793 | 788 | ||
794 | /* Expand to tmp */ | 789 | /* Expand to tmp */ |
795 | ret = ekey(tmp, key); | 790 | ret = des_ekey(tmp, key); |
796 | 791 | ||
797 | if (unlikely(ret == 0) && (*flags & CRYPTO_TFM_REQ_WEAK_KEY)) { | 792 | if (unlikely(ret == 0) && (*flags & CRYPTO_TFM_REQ_WEAK_KEY)) { |
798 | *flags |= CRYPTO_TFM_RES_WEAK_KEY; | 793 | *flags |= CRYPTO_TFM_RES_WEAK_KEY; |
@@ -879,9 +874,9 @@ static int des3_ede_setkey(struct crypto_tfm *tfm, const u8 *key, | |||
879 | return -EINVAL; | 874 | return -EINVAL; |
880 | } | 875 | } |
881 | 876 | ||
882 | ekey(expkey, key); expkey += DES_EXPKEY_WORDS; key += DES_KEY_SIZE; | 877 | des_ekey(expkey, key); expkey += DES_EXPKEY_WORDS; key += DES_KEY_SIZE; |
883 | dkey(expkey, key); expkey += DES_EXPKEY_WORDS; key += DES_KEY_SIZE; | 878 | dkey(expkey, key); expkey += DES_EXPKEY_WORDS; key += DES_KEY_SIZE; |
884 | ekey(expkey, key); | 879 | des_ekey(expkey, key); |
885 | 880 | ||
886 | return 0; | 881 | return 0; |
887 | } | 882 | } |
diff --git a/crypto/digest.c b/crypto/digest.c index 8871dec8cae7..6fd43bddd545 100644 --- a/crypto/digest.c +++ b/crypto/digest.c | |||
@@ -12,6 +12,7 @@ | |||
12 | * | 12 | * |
13 | */ | 13 | */ |
14 | 14 | ||
15 | #include <crypto/scatterwalk.h> | ||
15 | #include <linux/mm.h> | 16 | #include <linux/mm.h> |
16 | #include <linux/errno.h> | 17 | #include <linux/errno.h> |
17 | #include <linux/hardirq.h> | 18 | #include <linux/hardirq.h> |
@@ -20,9 +21,6 @@ | |||
20 | #include <linux/module.h> | 21 | #include <linux/module.h> |
21 | #include <linux/scatterlist.h> | 22 | #include <linux/scatterlist.h> |
22 | 23 | ||
23 | #include "internal.h" | ||
24 | #include "scatterwalk.h" | ||
25 | |||
26 | static int init(struct hash_desc *desc) | 24 | static int init(struct hash_desc *desc) |
27 | { | 25 | { |
28 | struct crypto_tfm *tfm = crypto_hash_tfm(desc->tfm); | 26 | struct crypto_tfm *tfm = crypto_hash_tfm(desc->tfm); |
diff --git a/crypto/eseqiv.c b/crypto/eseqiv.c new file mode 100644 index 000000000000..eb90d27ae118 --- /dev/null +++ b/crypto/eseqiv.c | |||
@@ -0,0 +1,264 @@ | |||
1 | /* | ||
2 | * eseqiv: Encrypted Sequence Number IV Generator | ||
3 | * | ||
4 | * This generator generates an IV based on a sequence number by xoring it | ||
5 | * with a salt and then encrypting it with the same key as used to encrypt | ||
6 | * the plain text. This algorithm requires that the block size be equal | ||
7 | * to the IV size. It is mainly useful for CBC. | ||
8 | * | ||
9 | * Copyright (c) 2007 Herbert Xu <herbert@gondor.apana.org.au> | ||
10 | * | ||
11 | * This program is free software; you can redistribute it and/or modify it | ||
12 | * under the terms of the GNU General Public License as published by the Free | ||
13 | * Software Foundation; either version 2 of the License, or (at your option) | ||
14 | * any later version. | ||
15 | * | ||
16 | */ | ||
17 | |||
18 | #include <crypto/internal/skcipher.h> | ||
19 | #include <crypto/scatterwalk.h> | ||
20 | #include <linux/err.h> | ||
21 | #include <linux/init.h> | ||
22 | #include <linux/kernel.h> | ||
23 | #include <linux/mm.h> | ||
24 | #include <linux/module.h> | ||
25 | #include <linux/random.h> | ||
26 | #include <linux/scatterlist.h> | ||
27 | #include <linux/spinlock.h> | ||
28 | #include <linux/string.h> | ||
29 | |||
30 | struct eseqiv_request_ctx { | ||
31 | struct scatterlist src[2]; | ||
32 | struct scatterlist dst[2]; | ||
33 | char tail[]; | ||
34 | }; | ||
35 | |||
36 | struct eseqiv_ctx { | ||
37 | spinlock_t lock; | ||
38 | unsigned int reqoff; | ||
39 | char salt[]; | ||
40 | }; | ||
41 | |||
42 | static void eseqiv_complete2(struct skcipher_givcrypt_request *req) | ||
43 | { | ||
44 | struct crypto_ablkcipher *geniv = skcipher_givcrypt_reqtfm(req); | ||
45 | struct eseqiv_request_ctx *reqctx = skcipher_givcrypt_reqctx(req); | ||
46 | |||
47 | memcpy(req->giv, PTR_ALIGN((u8 *)reqctx->tail, | ||
48 | crypto_ablkcipher_alignmask(geniv) + 1), | ||
49 | crypto_ablkcipher_ivsize(geniv)); | ||
50 | } | ||
51 | |||
52 | static void eseqiv_complete(struct crypto_async_request *base, int err) | ||
53 | { | ||
54 | struct skcipher_givcrypt_request *req = base->data; | ||
55 | |||
56 | if (err) | ||
57 | goto out; | ||
58 | |||
59 | eseqiv_complete2(req); | ||
60 | |||
61 | out: | ||
62 | skcipher_givcrypt_complete(req, err); | ||
63 | } | ||
64 | |||
65 | static void eseqiv_chain(struct scatterlist *head, struct scatterlist *sg, | ||
66 | int chain) | ||
67 | { | ||
68 | if (chain) { | ||
69 | head->length += sg->length; | ||
70 | sg = scatterwalk_sg_next(sg); | ||
71 | } | ||
72 | |||
73 | if (sg) | ||
74 | scatterwalk_sg_chain(head, 2, sg); | ||
75 | else | ||
76 | sg_mark_end(head); | ||
77 | } | ||
78 | |||
79 | static int eseqiv_givencrypt(struct skcipher_givcrypt_request *req) | ||
80 | { | ||
81 | struct crypto_ablkcipher *geniv = skcipher_givcrypt_reqtfm(req); | ||
82 | struct eseqiv_ctx *ctx = crypto_ablkcipher_ctx(geniv); | ||
83 | struct eseqiv_request_ctx *reqctx = skcipher_givcrypt_reqctx(req); | ||
84 | struct ablkcipher_request *subreq; | ||
85 | crypto_completion_t complete; | ||
86 | void *data; | ||
87 | struct scatterlist *osrc, *odst; | ||
88 | struct scatterlist *dst; | ||
89 | struct page *srcp; | ||
90 | struct page *dstp; | ||
91 | u8 *giv; | ||
92 | u8 *vsrc; | ||
93 | u8 *vdst; | ||
94 | __be64 seq; | ||
95 | unsigned int ivsize; | ||
96 | unsigned int len; | ||
97 | int err; | ||
98 | |||
99 | subreq = (void *)(reqctx->tail + ctx->reqoff); | ||
100 | ablkcipher_request_set_tfm(subreq, skcipher_geniv_cipher(geniv)); | ||
101 | |||
102 | giv = req->giv; | ||
103 | complete = req->creq.base.complete; | ||
104 | data = req->creq.base.data; | ||
105 | |||
106 | osrc = req->creq.src; | ||
107 | odst = req->creq.dst; | ||
108 | srcp = sg_page(osrc); | ||
109 | dstp = sg_page(odst); | ||
110 | vsrc = PageHighMem(srcp) ? NULL : page_address(srcp) + osrc->offset; | ||
111 | vdst = PageHighMem(dstp) ? NULL : page_address(dstp) + odst->offset; | ||
112 | |||
113 | ivsize = crypto_ablkcipher_ivsize(geniv); | ||
114 | |||
115 | if (vsrc != giv + ivsize && vdst != giv + ivsize) { | ||
116 | giv = PTR_ALIGN((u8 *)reqctx->tail, | ||
117 | crypto_ablkcipher_alignmask(geniv) + 1); | ||
118 | complete = eseqiv_complete; | ||
119 | data = req; | ||
120 | } | ||
121 | |||
122 | ablkcipher_request_set_callback(subreq, req->creq.base.flags, complete, | ||
123 | data); | ||
124 | |||
125 | sg_init_table(reqctx->src, 2); | ||
126 | sg_set_buf(reqctx->src, giv, ivsize); | ||
127 | eseqiv_chain(reqctx->src, osrc, vsrc == giv + ivsize); | ||
128 | |||
129 | dst = reqctx->src; | ||
130 | if (osrc != odst) { | ||
131 | sg_init_table(reqctx->dst, 2); | ||
132 | sg_set_buf(reqctx->dst, giv, ivsize); | ||
133 | eseqiv_chain(reqctx->dst, odst, vdst == giv + ivsize); | ||
134 | |||
135 | dst = reqctx->dst; | ||
136 | } | ||
137 | |||
138 | ablkcipher_request_set_crypt(subreq, reqctx->src, dst, | ||
139 | req->creq.nbytes, req->creq.info); | ||
140 | |||
141 | memcpy(req->creq.info, ctx->salt, ivsize); | ||
142 | |||
143 | len = ivsize; | ||
144 | if (ivsize > sizeof(u64)) { | ||
145 | memset(req->giv, 0, ivsize - sizeof(u64)); | ||
146 | len = sizeof(u64); | ||
147 | } | ||
148 | seq = cpu_to_be64(req->seq); | ||
149 | memcpy(req->giv + ivsize - len, &seq, len); | ||
150 | |||
151 | err = crypto_ablkcipher_encrypt(subreq); | ||
152 | if (err) | ||
153 | goto out; | ||
154 | |||
155 | eseqiv_complete2(req); | ||
156 | |||
157 | out: | ||
158 | return err; | ||
159 | } | ||
160 | |||
161 | static int eseqiv_givencrypt_first(struct skcipher_givcrypt_request *req) | ||
162 | { | ||
163 | struct crypto_ablkcipher *geniv = skcipher_givcrypt_reqtfm(req); | ||
164 | struct eseqiv_ctx *ctx = crypto_ablkcipher_ctx(geniv); | ||
165 | |||
166 | spin_lock_bh(&ctx->lock); | ||
167 | if (crypto_ablkcipher_crt(geniv)->givencrypt != eseqiv_givencrypt_first) | ||
168 | goto unlock; | ||
169 | |||
170 | crypto_ablkcipher_crt(geniv)->givencrypt = eseqiv_givencrypt; | ||
171 | get_random_bytes(ctx->salt, crypto_ablkcipher_ivsize(geniv)); | ||
172 | |||
173 | unlock: | ||
174 | spin_unlock_bh(&ctx->lock); | ||
175 | |||
176 | return eseqiv_givencrypt(req); | ||
177 | } | ||
178 | |||
179 | static int eseqiv_init(struct crypto_tfm *tfm) | ||
180 | { | ||
181 | struct crypto_ablkcipher *geniv = __crypto_ablkcipher_cast(tfm); | ||
182 | struct eseqiv_ctx *ctx = crypto_ablkcipher_ctx(geniv); | ||
183 | unsigned long alignmask; | ||
184 | unsigned int reqsize; | ||
185 | |||
186 | spin_lock_init(&ctx->lock); | ||
187 | |||
188 | alignmask = crypto_tfm_ctx_alignment() - 1; | ||
189 | reqsize = sizeof(struct eseqiv_request_ctx); | ||
190 | |||
191 | if (alignmask & reqsize) { | ||
192 | alignmask &= reqsize; | ||
193 | alignmask--; | ||
194 | } | ||
195 | |||
196 | alignmask = ~alignmask; | ||
197 | alignmask &= crypto_ablkcipher_alignmask(geniv); | ||
198 | |||
199 | reqsize += alignmask; | ||
200 | reqsize += crypto_ablkcipher_ivsize(geniv); | ||
201 | reqsize = ALIGN(reqsize, crypto_tfm_ctx_alignment()); | ||
202 | |||
203 | ctx->reqoff = reqsize - sizeof(struct eseqiv_request_ctx); | ||
204 | |||
205 | tfm->crt_ablkcipher.reqsize = reqsize + | ||
206 | sizeof(struct ablkcipher_request); | ||
207 | |||
208 | return skcipher_geniv_init(tfm); | ||
209 | } | ||
210 | |||
211 | static struct crypto_template eseqiv_tmpl; | ||
212 | |||
213 | static struct crypto_instance *eseqiv_alloc(struct rtattr **tb) | ||
214 | { | ||
215 | struct crypto_instance *inst; | ||
216 | int err; | ||
217 | |||
218 | inst = skcipher_geniv_alloc(&eseqiv_tmpl, tb, 0, 0); | ||
219 | if (IS_ERR(inst)) | ||
220 | goto out; | ||
221 | |||
222 | err = -EINVAL; | ||
223 | if (inst->alg.cra_ablkcipher.ivsize != inst->alg.cra_blocksize) | ||
224 | goto free_inst; | ||
225 | |||
226 | inst->alg.cra_ablkcipher.givencrypt = eseqiv_givencrypt_first; | ||
227 | |||
228 | inst->alg.cra_init = eseqiv_init; | ||
229 | inst->alg.cra_exit = skcipher_geniv_exit; | ||
230 | |||
231 | inst->alg.cra_ctxsize = sizeof(struct eseqiv_ctx); | ||
232 | inst->alg.cra_ctxsize += inst->alg.cra_ablkcipher.ivsize; | ||
233 | |||
234 | out: | ||
235 | return inst; | ||
236 | |||
237 | free_inst: | ||
238 | skcipher_geniv_free(inst); | ||
239 | inst = ERR_PTR(err); | ||
240 | goto out; | ||
241 | } | ||
242 | |||
243 | static struct crypto_template eseqiv_tmpl = { | ||
244 | .name = "eseqiv", | ||
245 | .alloc = eseqiv_alloc, | ||
246 | .free = skcipher_geniv_free, | ||
247 | .module = THIS_MODULE, | ||
248 | }; | ||
249 | |||
250 | static int __init eseqiv_module_init(void) | ||
251 | { | ||
252 | return crypto_register_template(&eseqiv_tmpl); | ||
253 | } | ||
254 | |||
255 | static void __exit eseqiv_module_exit(void) | ||
256 | { | ||
257 | crypto_unregister_template(&eseqiv_tmpl); | ||
258 | } | ||
259 | |||
260 | module_init(eseqiv_module_init); | ||
261 | module_exit(eseqiv_module_exit); | ||
262 | |||
263 | MODULE_LICENSE("GPL"); | ||
264 | MODULE_DESCRIPTION("Encrypted Sequence Number IV Generator"); | ||
diff --git a/crypto/gcm.c b/crypto/gcm.c new file mode 100644 index 000000000000..e70afd0c73dd --- /dev/null +++ b/crypto/gcm.c | |||
@@ -0,0 +1,823 @@ | |||
1 | /* | ||
2 | * GCM: Galois/Counter Mode. | ||
3 | * | ||
4 | * Copyright (c) 2007 Nokia Siemens Networks - Mikko Herranen <mh1@iki.fi> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify it | ||
7 | * under the terms of the GNU General Public License version 2 as published | ||
8 | * by the Free Software Foundation. | ||
9 | */ | ||
10 | |||
11 | #include <crypto/gf128mul.h> | ||
12 | #include <crypto/internal/aead.h> | ||
13 | #include <crypto/internal/skcipher.h> | ||
14 | #include <crypto/scatterwalk.h> | ||
15 | #include <linux/completion.h> | ||
16 | #include <linux/err.h> | ||
17 | #include <linux/init.h> | ||
18 | #include <linux/kernel.h> | ||
19 | #include <linux/module.h> | ||
20 | #include <linux/slab.h> | ||
21 | |||
22 | struct gcm_instance_ctx { | ||
23 | struct crypto_skcipher_spawn ctr; | ||
24 | }; | ||
25 | |||
26 | struct crypto_gcm_ctx { | ||
27 | struct crypto_ablkcipher *ctr; | ||
28 | struct gf128mul_4k *gf128; | ||
29 | }; | ||
30 | |||
31 | struct crypto_rfc4106_ctx { | ||
32 | struct crypto_aead *child; | ||
33 | u8 nonce[4]; | ||
34 | }; | ||
35 | |||
36 | struct crypto_gcm_ghash_ctx { | ||
37 | u32 bytes; | ||
38 | u32 flags; | ||
39 | struct gf128mul_4k *gf128; | ||
40 | u8 buffer[16]; | ||
41 | }; | ||
42 | |||
43 | struct crypto_gcm_req_priv_ctx { | ||
44 | u8 auth_tag[16]; | ||
45 | u8 iauth_tag[16]; | ||
46 | struct scatterlist src[2]; | ||
47 | struct scatterlist dst[2]; | ||
48 | struct crypto_gcm_ghash_ctx ghash; | ||
49 | struct ablkcipher_request abreq; | ||
50 | }; | ||
51 | |||
52 | struct crypto_gcm_setkey_result { | ||
53 | int err; | ||
54 | struct completion completion; | ||
55 | }; | ||
56 | |||
57 | static inline struct crypto_gcm_req_priv_ctx *crypto_gcm_reqctx( | ||
58 | struct aead_request *req) | ||
59 | { | ||
60 | unsigned long align = crypto_aead_alignmask(crypto_aead_reqtfm(req)); | ||
61 | |||
62 | return (void *)PTR_ALIGN((u8 *)aead_request_ctx(req), align + 1); | ||
63 | } | ||
64 | |||
65 | static void crypto_gcm_ghash_init(struct crypto_gcm_ghash_ctx *ctx, u32 flags, | ||
66 | struct gf128mul_4k *gf128) | ||
67 | { | ||
68 | ctx->bytes = 0; | ||
69 | ctx->flags = flags; | ||
70 | ctx->gf128 = gf128; | ||
71 | memset(ctx->buffer, 0, 16); | ||
72 | } | ||
73 | |||
74 | static void crypto_gcm_ghash_update(struct crypto_gcm_ghash_ctx *ctx, | ||
75 | const u8 *src, unsigned int srclen) | ||
76 | { | ||
77 | u8 *dst = ctx->buffer; | ||
78 | |||
79 | if (ctx->bytes) { | ||
80 | int n = min(srclen, ctx->bytes); | ||
81 | u8 *pos = dst + (16 - ctx->bytes); | ||
82 | |||
83 | ctx->bytes -= n; | ||
84 | srclen -= n; | ||
85 | |||
86 | while (n--) | ||
87 | *pos++ ^= *src++; | ||
88 | |||
89 | if (!ctx->bytes) | ||
90 | gf128mul_4k_lle((be128 *)dst, ctx->gf128); | ||
91 | } | ||
92 | |||
93 | while (srclen >= 16) { | ||
94 | crypto_xor(dst, src, 16); | ||
95 | gf128mul_4k_lle((be128 *)dst, ctx->gf128); | ||
96 | src += 16; | ||
97 | srclen -= 16; | ||
98 | } | ||
99 | |||
100 | if (srclen) { | ||
101 | ctx->bytes = 16 - srclen; | ||
102 | while (srclen--) | ||
103 | *dst++ ^= *src++; | ||
104 | } | ||
105 | } | ||
106 | |||
107 | static void crypto_gcm_ghash_update_sg(struct crypto_gcm_ghash_ctx *ctx, | ||
108 | struct scatterlist *sg, int len) | ||
109 | { | ||
110 | struct scatter_walk walk; | ||
111 | u8 *src; | ||
112 | int n; | ||
113 | |||
114 | if (!len) | ||
115 | return; | ||
116 | |||
117 | scatterwalk_start(&walk, sg); | ||
118 | |||
119 | while (len) { | ||
120 | n = scatterwalk_clamp(&walk, len); | ||
121 | |||
122 | if (!n) { | ||
123 | scatterwalk_start(&walk, scatterwalk_sg_next(walk.sg)); | ||
124 | n = scatterwalk_clamp(&walk, len); | ||
125 | } | ||
126 | |||
127 | src = scatterwalk_map(&walk, 0); | ||
128 | |||
129 | crypto_gcm_ghash_update(ctx, src, n); | ||
130 | len -= n; | ||
131 | |||
132 | scatterwalk_unmap(src, 0); | ||
133 | scatterwalk_advance(&walk, n); | ||
134 | scatterwalk_done(&walk, 0, len); | ||
135 | if (len) | ||
136 | crypto_yield(ctx->flags); | ||
137 | } | ||
138 | } | ||
139 | |||
140 | static void crypto_gcm_ghash_flush(struct crypto_gcm_ghash_ctx *ctx) | ||
141 | { | ||
142 | u8 *dst = ctx->buffer; | ||
143 | |||
144 | if (ctx->bytes) { | ||
145 | u8 *tmp = dst + (16 - ctx->bytes); | ||
146 | |||
147 | while (ctx->bytes--) | ||
148 | *tmp++ ^= 0; | ||
149 | |||
150 | gf128mul_4k_lle((be128 *)dst, ctx->gf128); | ||
151 | } | ||
152 | |||
153 | ctx->bytes = 0; | ||
154 | } | ||
155 | |||
156 | static void crypto_gcm_ghash_final_xor(struct crypto_gcm_ghash_ctx *ctx, | ||
157 | unsigned int authlen, | ||
158 | unsigned int cryptlen, u8 *dst) | ||
159 | { | ||
160 | u8 *buf = ctx->buffer; | ||
161 | u128 lengths; | ||
162 | |||
163 | lengths.a = cpu_to_be64(authlen * 8); | ||
164 | lengths.b = cpu_to_be64(cryptlen * 8); | ||
165 | |||
166 | crypto_gcm_ghash_flush(ctx); | ||
167 | crypto_xor(buf, (u8 *)&lengths, 16); | ||
168 | gf128mul_4k_lle((be128 *)buf, ctx->gf128); | ||
169 | crypto_xor(dst, buf, 16); | ||
170 | } | ||
171 | |||
172 | static void crypto_gcm_setkey_done(struct crypto_async_request *req, int err) | ||
173 | { | ||
174 | struct crypto_gcm_setkey_result *result = req->data; | ||
175 | |||
176 | if (err == -EINPROGRESS) | ||
177 | return; | ||
178 | |||
179 | result->err = err; | ||
180 | complete(&result->completion); | ||
181 | } | ||
182 | |||
183 | static int crypto_gcm_setkey(struct crypto_aead *aead, const u8 *key, | ||
184 | unsigned int keylen) | ||
185 | { | ||
186 | struct crypto_gcm_ctx *ctx = crypto_aead_ctx(aead); | ||
187 | struct crypto_ablkcipher *ctr = ctx->ctr; | ||
188 | struct { | ||
189 | be128 hash; | ||
190 | u8 iv[8]; | ||
191 | |||
192 | struct crypto_gcm_setkey_result result; | ||
193 | |||
194 | struct scatterlist sg[1]; | ||
195 | struct ablkcipher_request req; | ||
196 | } *data; | ||
197 | int err; | ||
198 | |||
199 | crypto_ablkcipher_clear_flags(ctr, CRYPTO_TFM_REQ_MASK); | ||
200 | crypto_ablkcipher_set_flags(ctr, crypto_aead_get_flags(aead) & | ||
201 | CRYPTO_TFM_REQ_MASK); | ||
202 | |||
203 | err = crypto_ablkcipher_setkey(ctr, key, keylen); | ||
204 | if (err) | ||
205 | return err; | ||
206 | |||
207 | crypto_aead_set_flags(aead, crypto_ablkcipher_get_flags(ctr) & | ||
208 | CRYPTO_TFM_RES_MASK); | ||
209 | |||
210 | data = kzalloc(sizeof(*data) + crypto_ablkcipher_reqsize(ctr), | ||
211 | GFP_KERNEL); | ||
212 | if (!data) | ||
213 | return -ENOMEM; | ||
214 | |||
215 | init_completion(&data->result.completion); | ||
216 | sg_init_one(data->sg, &data->hash, sizeof(data->hash)); | ||
217 | ablkcipher_request_set_tfm(&data->req, ctr); | ||
218 | ablkcipher_request_set_callback(&data->req, CRYPTO_TFM_REQ_MAY_SLEEP | | ||
219 | CRYPTO_TFM_REQ_MAY_BACKLOG, | ||
220 | crypto_gcm_setkey_done, | ||
221 | &data->result); | ||
222 | ablkcipher_request_set_crypt(&data->req, data->sg, data->sg, | ||
223 | sizeof(data->hash), data->iv); | ||
224 | |||
225 | err = crypto_ablkcipher_encrypt(&data->req); | ||
226 | if (err == -EINPROGRESS || err == -EBUSY) { | ||
227 | err = wait_for_completion_interruptible( | ||
228 | &data->result.completion); | ||
229 | if (!err) | ||
230 | err = data->result.err; | ||
231 | } | ||
232 | |||
233 | if (err) | ||
234 | goto out; | ||
235 | |||
236 | if (ctx->gf128 != NULL) | ||
237 | gf128mul_free_4k(ctx->gf128); | ||
238 | |||
239 | ctx->gf128 = gf128mul_init_4k_lle(&data->hash); | ||
240 | |||
241 | if (ctx->gf128 == NULL) | ||
242 | err = -ENOMEM; | ||
243 | |||
244 | out: | ||
245 | kfree(data); | ||
246 | return err; | ||
247 | } | ||
248 | |||
249 | static int crypto_gcm_setauthsize(struct crypto_aead *tfm, | ||
250 | unsigned int authsize) | ||
251 | { | ||
252 | switch (authsize) { | ||
253 | case 4: | ||
254 | case 8: | ||
255 | case 12: | ||
256 | case 13: | ||
257 | case 14: | ||
258 | case 15: | ||
259 | case 16: | ||
260 | break; | ||
261 | default: | ||
262 | return -EINVAL; | ||
263 | } | ||
264 | |||
265 | return 0; | ||
266 | } | ||
267 | |||
268 | static void crypto_gcm_init_crypt(struct ablkcipher_request *ablk_req, | ||
269 | struct aead_request *req, | ||
270 | unsigned int cryptlen) | ||
271 | { | ||
272 | struct crypto_aead *aead = crypto_aead_reqtfm(req); | ||
273 | struct crypto_gcm_ctx *ctx = crypto_aead_ctx(aead); | ||
274 | struct crypto_gcm_req_priv_ctx *pctx = crypto_gcm_reqctx(req); | ||
275 | u32 flags = req->base.tfm->crt_flags; | ||
276 | struct crypto_gcm_ghash_ctx *ghash = &pctx->ghash; | ||
277 | struct scatterlist *dst; | ||
278 | __be32 counter = cpu_to_be32(1); | ||
279 | |||
280 | memset(pctx->auth_tag, 0, sizeof(pctx->auth_tag)); | ||
281 | memcpy(req->iv + 12, &counter, 4); | ||
282 | |||
283 | sg_init_table(pctx->src, 2); | ||
284 | sg_set_buf(pctx->src, pctx->auth_tag, sizeof(pctx->auth_tag)); | ||
285 | scatterwalk_sg_chain(pctx->src, 2, req->src); | ||
286 | |||
287 | dst = pctx->src; | ||
288 | if (req->src != req->dst) { | ||
289 | sg_init_table(pctx->dst, 2); | ||
290 | sg_set_buf(pctx->dst, pctx->auth_tag, sizeof(pctx->auth_tag)); | ||
291 | scatterwalk_sg_chain(pctx->dst, 2, req->dst); | ||
292 | dst = pctx->dst; | ||
293 | } | ||
294 | |||
295 | ablkcipher_request_set_tfm(ablk_req, ctx->ctr); | ||
296 | ablkcipher_request_set_crypt(ablk_req, pctx->src, dst, | ||
297 | cryptlen + sizeof(pctx->auth_tag), | ||
298 | req->iv); | ||
299 | |||
300 | crypto_gcm_ghash_init(ghash, flags, ctx->gf128); | ||
301 | |||
302 | crypto_gcm_ghash_update_sg(ghash, req->assoc, req->assoclen); | ||
303 | crypto_gcm_ghash_flush(ghash); | ||
304 | } | ||
305 | |||
306 | static int crypto_gcm_hash(struct aead_request *req) | ||
307 | { | ||
308 | struct crypto_aead *aead = crypto_aead_reqtfm(req); | ||
309 | struct crypto_gcm_req_priv_ctx *pctx = crypto_gcm_reqctx(req); | ||
310 | u8 *auth_tag = pctx->auth_tag; | ||
311 | struct crypto_gcm_ghash_ctx *ghash = &pctx->ghash; | ||
312 | |||
313 | crypto_gcm_ghash_update_sg(ghash, req->dst, req->cryptlen); | ||
314 | crypto_gcm_ghash_final_xor(ghash, req->assoclen, req->cryptlen, | ||
315 | auth_tag); | ||
316 | |||
317 | scatterwalk_map_and_copy(auth_tag, req->dst, req->cryptlen, | ||
318 | crypto_aead_authsize(aead), 1); | ||
319 | return 0; | ||
320 | } | ||
321 | |||
322 | static void crypto_gcm_encrypt_done(struct crypto_async_request *areq, int err) | ||
323 | { | ||
324 | struct aead_request *req = areq->data; | ||
325 | |||
326 | if (!err) | ||
327 | err = crypto_gcm_hash(req); | ||
328 | |||
329 | aead_request_complete(req, err); | ||
330 | } | ||
331 | |||
332 | static int crypto_gcm_encrypt(struct aead_request *req) | ||
333 | { | ||
334 | struct crypto_gcm_req_priv_ctx *pctx = crypto_gcm_reqctx(req); | ||
335 | struct ablkcipher_request *abreq = &pctx->abreq; | ||
336 | int err; | ||
337 | |||
338 | crypto_gcm_init_crypt(abreq, req, req->cryptlen); | ||
339 | ablkcipher_request_set_callback(abreq, aead_request_flags(req), | ||
340 | crypto_gcm_encrypt_done, req); | ||
341 | |||
342 | err = crypto_ablkcipher_encrypt(abreq); | ||
343 | if (err) | ||
344 | return err; | ||
345 | |||
346 | return crypto_gcm_hash(req); | ||
347 | } | ||
348 | |||
349 | static int crypto_gcm_verify(struct aead_request *req) | ||
350 | { | ||
351 | struct crypto_aead *aead = crypto_aead_reqtfm(req); | ||
352 | struct crypto_gcm_req_priv_ctx *pctx = crypto_gcm_reqctx(req); | ||
353 | struct crypto_gcm_ghash_ctx *ghash = &pctx->ghash; | ||
354 | u8 *auth_tag = pctx->auth_tag; | ||
355 | u8 *iauth_tag = pctx->iauth_tag; | ||
356 | unsigned int authsize = crypto_aead_authsize(aead); | ||
357 | unsigned int cryptlen = req->cryptlen - authsize; | ||
358 | |||
359 | crypto_gcm_ghash_final_xor(ghash, req->assoclen, cryptlen, auth_tag); | ||
360 | |||
361 | authsize = crypto_aead_authsize(aead); | ||
362 | scatterwalk_map_and_copy(iauth_tag, req->src, cryptlen, authsize, 0); | ||
363 | return memcmp(iauth_tag, auth_tag, authsize) ? -EBADMSG : 0; | ||
364 | } | ||
365 | |||
366 | static void crypto_gcm_decrypt_done(struct crypto_async_request *areq, int err) | ||
367 | { | ||
368 | struct aead_request *req = areq->data; | ||
369 | |||
370 | if (!err) | ||
371 | err = crypto_gcm_verify(req); | ||
372 | |||
373 | aead_request_complete(req, err); | ||
374 | } | ||
375 | |||
376 | static int crypto_gcm_decrypt(struct aead_request *req) | ||
377 | { | ||
378 | struct crypto_aead *aead = crypto_aead_reqtfm(req); | ||
379 | struct crypto_gcm_req_priv_ctx *pctx = crypto_gcm_reqctx(req); | ||
380 | struct ablkcipher_request *abreq = &pctx->abreq; | ||
381 | struct crypto_gcm_ghash_ctx *ghash = &pctx->ghash; | ||
382 | unsigned int cryptlen = req->cryptlen; | ||
383 | unsigned int authsize = crypto_aead_authsize(aead); | ||
384 | int err; | ||
385 | |||
386 | if (cryptlen < authsize) | ||
387 | return -EINVAL; | ||
388 | cryptlen -= authsize; | ||
389 | |||
390 | crypto_gcm_init_crypt(abreq, req, cryptlen); | ||
391 | ablkcipher_request_set_callback(abreq, aead_request_flags(req), | ||
392 | crypto_gcm_decrypt_done, req); | ||
393 | |||
394 | crypto_gcm_ghash_update_sg(ghash, req->src, cryptlen); | ||
395 | |||
396 | err = crypto_ablkcipher_decrypt(abreq); | ||
397 | if (err) | ||
398 | return err; | ||
399 | |||
400 | return crypto_gcm_verify(req); | ||
401 | } | ||
402 | |||
403 | static int crypto_gcm_init_tfm(struct crypto_tfm *tfm) | ||
404 | { | ||
405 | struct crypto_instance *inst = (void *)tfm->__crt_alg; | ||
406 | struct gcm_instance_ctx *ictx = crypto_instance_ctx(inst); | ||
407 | struct crypto_gcm_ctx *ctx = crypto_tfm_ctx(tfm); | ||
408 | struct crypto_ablkcipher *ctr; | ||
409 | unsigned long align; | ||
410 | int err; | ||
411 | |||
412 | ctr = crypto_spawn_skcipher(&ictx->ctr); | ||
413 | err = PTR_ERR(ctr); | ||
414 | if (IS_ERR(ctr)) | ||
415 | return err; | ||
416 | |||
417 | ctx->ctr = ctr; | ||
418 | ctx->gf128 = NULL; | ||
419 | |||
420 | align = crypto_tfm_alg_alignmask(tfm); | ||
421 | align &= ~(crypto_tfm_ctx_alignment() - 1); | ||
422 | tfm->crt_aead.reqsize = align + | ||
423 | sizeof(struct crypto_gcm_req_priv_ctx) + | ||
424 | crypto_ablkcipher_reqsize(ctr); | ||
425 | |||
426 | return 0; | ||
427 | } | ||
428 | |||
429 | static void crypto_gcm_exit_tfm(struct crypto_tfm *tfm) | ||
430 | { | ||
431 | struct crypto_gcm_ctx *ctx = crypto_tfm_ctx(tfm); | ||
432 | |||
433 | if (ctx->gf128 != NULL) | ||
434 | gf128mul_free_4k(ctx->gf128); | ||
435 | |||
436 | crypto_free_ablkcipher(ctx->ctr); | ||
437 | } | ||
438 | |||
439 | static struct crypto_instance *crypto_gcm_alloc_common(struct rtattr **tb, | ||
440 | const char *full_name, | ||
441 | const char *ctr_name) | ||
442 | { | ||
443 | struct crypto_attr_type *algt; | ||
444 | struct crypto_instance *inst; | ||
445 | struct crypto_alg *ctr; | ||
446 | struct gcm_instance_ctx *ctx; | ||
447 | int err; | ||
448 | |||
449 | algt = crypto_get_attr_type(tb); | ||
450 | err = PTR_ERR(algt); | ||
451 | if (IS_ERR(algt)) | ||
452 | return ERR_PTR(err); | ||
453 | |||
454 | if ((algt->type ^ CRYPTO_ALG_TYPE_AEAD) & algt->mask) | ||
455 | return ERR_PTR(-EINVAL); | ||
456 | |||
457 | inst = kzalloc(sizeof(*inst) + sizeof(*ctx), GFP_KERNEL); | ||
458 | if (!inst) | ||
459 | return ERR_PTR(-ENOMEM); | ||
460 | |||
461 | ctx = crypto_instance_ctx(inst); | ||
462 | crypto_set_skcipher_spawn(&ctx->ctr, inst); | ||
463 | err = crypto_grab_skcipher(&ctx->ctr, ctr_name, 0, | ||
464 | crypto_requires_sync(algt->type, | ||
465 | algt->mask)); | ||
466 | if (err) | ||
467 | goto err_free_inst; | ||
468 | |||
469 | ctr = crypto_skcipher_spawn_alg(&ctx->ctr); | ||
470 | |||
471 | /* We only support 16-byte blocks. */ | ||
472 | if (ctr->cra_ablkcipher.ivsize != 16) | ||
473 | goto out_put_ctr; | ||
474 | |||
475 | /* Not a stream cipher? */ | ||
476 | err = -EINVAL; | ||
477 | if (ctr->cra_blocksize != 1) | ||
478 | goto out_put_ctr; | ||
479 | |||
480 | err = -ENAMETOOLONG; | ||
481 | if (snprintf(inst->alg.cra_driver_name, CRYPTO_MAX_ALG_NAME, | ||
482 | "gcm_base(%s)", ctr->cra_driver_name) >= | ||
483 | CRYPTO_MAX_ALG_NAME) | ||
484 | goto out_put_ctr; | ||
485 | |||
486 | memcpy(inst->alg.cra_name, full_name, CRYPTO_MAX_ALG_NAME); | ||
487 | |||
488 | inst->alg.cra_flags = CRYPTO_ALG_TYPE_AEAD; | ||
489 | inst->alg.cra_flags |= ctr->cra_flags & CRYPTO_ALG_ASYNC; | ||
490 | inst->alg.cra_priority = ctr->cra_priority; | ||
491 | inst->alg.cra_blocksize = 1; | ||
492 | inst->alg.cra_alignmask = ctr->cra_alignmask | (__alignof__(u64) - 1); | ||
493 | inst->alg.cra_type = &crypto_aead_type; | ||
494 | inst->alg.cra_aead.ivsize = 16; | ||
495 | inst->alg.cra_aead.maxauthsize = 16; | ||
496 | inst->alg.cra_ctxsize = sizeof(struct crypto_gcm_ctx); | ||
497 | inst->alg.cra_init = crypto_gcm_init_tfm; | ||
498 | inst->alg.cra_exit = crypto_gcm_exit_tfm; | ||
499 | inst->alg.cra_aead.setkey = crypto_gcm_setkey; | ||
500 | inst->alg.cra_aead.setauthsize = crypto_gcm_setauthsize; | ||
501 | inst->alg.cra_aead.encrypt = crypto_gcm_encrypt; | ||
502 | inst->alg.cra_aead.decrypt = crypto_gcm_decrypt; | ||
503 | |||
504 | out: | ||
505 | return inst; | ||
506 | |||
507 | out_put_ctr: | ||
508 | crypto_drop_skcipher(&ctx->ctr); | ||
509 | err_free_inst: | ||
510 | kfree(inst); | ||
511 | inst = ERR_PTR(err); | ||
512 | goto out; | ||
513 | } | ||
514 | |||
515 | static struct crypto_instance *crypto_gcm_alloc(struct rtattr **tb) | ||
516 | { | ||
517 | int err; | ||
518 | const char *cipher_name; | ||
519 | char ctr_name[CRYPTO_MAX_ALG_NAME]; | ||
520 | char full_name[CRYPTO_MAX_ALG_NAME]; | ||
521 | |||
522 | cipher_name = crypto_attr_alg_name(tb[1]); | ||
523 | err = PTR_ERR(cipher_name); | ||
524 | if (IS_ERR(cipher_name)) | ||
525 | return ERR_PTR(err); | ||
526 | |||
527 | if (snprintf(ctr_name, CRYPTO_MAX_ALG_NAME, "ctr(%s)", cipher_name) >= | ||
528 | CRYPTO_MAX_ALG_NAME) | ||
529 | return ERR_PTR(-ENAMETOOLONG); | ||
530 | |||
531 | if (snprintf(full_name, CRYPTO_MAX_ALG_NAME, "gcm(%s)", cipher_name) >= | ||
532 | CRYPTO_MAX_ALG_NAME) | ||
533 | return ERR_PTR(-ENAMETOOLONG); | ||
534 | |||
535 | return crypto_gcm_alloc_common(tb, full_name, ctr_name); | ||
536 | } | ||
537 | |||
538 | static void crypto_gcm_free(struct crypto_instance *inst) | ||
539 | { | ||
540 | struct gcm_instance_ctx *ctx = crypto_instance_ctx(inst); | ||
541 | |||
542 | crypto_drop_skcipher(&ctx->ctr); | ||
543 | kfree(inst); | ||
544 | } | ||
545 | |||
546 | static struct crypto_template crypto_gcm_tmpl = { | ||
547 | .name = "gcm", | ||
548 | .alloc = crypto_gcm_alloc, | ||
549 | .free = crypto_gcm_free, | ||
550 | .module = THIS_MODULE, | ||
551 | }; | ||
552 | |||
553 | static struct crypto_instance *crypto_gcm_base_alloc(struct rtattr **tb) | ||
554 | { | ||
555 | int err; | ||
556 | const char *ctr_name; | ||
557 | char full_name[CRYPTO_MAX_ALG_NAME]; | ||
558 | |||
559 | ctr_name = crypto_attr_alg_name(tb[1]); | ||
560 | err = PTR_ERR(ctr_name); | ||
561 | if (IS_ERR(ctr_name)) | ||
562 | return ERR_PTR(err); | ||
563 | |||
564 | if (snprintf(full_name, CRYPTO_MAX_ALG_NAME, "gcm_base(%s)", | ||
565 | ctr_name) >= CRYPTO_MAX_ALG_NAME) | ||
566 | return ERR_PTR(-ENAMETOOLONG); | ||
567 | |||
568 | return crypto_gcm_alloc_common(tb, full_name, ctr_name); | ||
569 | } | ||
570 | |||
571 | static struct crypto_template crypto_gcm_base_tmpl = { | ||
572 | .name = "gcm_base", | ||
573 | .alloc = crypto_gcm_base_alloc, | ||
574 | .free = crypto_gcm_free, | ||
575 | .module = THIS_MODULE, | ||
576 | }; | ||
577 | |||
578 | static int crypto_rfc4106_setkey(struct crypto_aead *parent, const u8 *key, | ||
579 | unsigned int keylen) | ||
580 | { | ||
581 | struct crypto_rfc4106_ctx *ctx = crypto_aead_ctx(parent); | ||
582 | struct crypto_aead *child = ctx->child; | ||
583 | int err; | ||
584 | |||
585 | if (keylen < 4) | ||
586 | return -EINVAL; | ||
587 | |||
588 | keylen -= 4; | ||
589 | memcpy(ctx->nonce, key + keylen, 4); | ||
590 | |||
591 | crypto_aead_clear_flags(child, CRYPTO_TFM_REQ_MASK); | ||
592 | crypto_aead_set_flags(child, crypto_aead_get_flags(parent) & | ||
593 | CRYPTO_TFM_REQ_MASK); | ||
594 | err = crypto_aead_setkey(child, key, keylen); | ||
595 | crypto_aead_set_flags(parent, crypto_aead_get_flags(child) & | ||
596 | CRYPTO_TFM_RES_MASK); | ||
597 | |||
598 | return err; | ||
599 | } | ||
600 | |||
601 | static int crypto_rfc4106_setauthsize(struct crypto_aead *parent, | ||
602 | unsigned int authsize) | ||
603 | { | ||
604 | struct crypto_rfc4106_ctx *ctx = crypto_aead_ctx(parent); | ||
605 | |||
606 | switch (authsize) { | ||
607 | case 8: | ||
608 | case 12: | ||
609 | case 16: | ||
610 | break; | ||
611 | default: | ||
612 | return -EINVAL; | ||
613 | } | ||
614 | |||
615 | return crypto_aead_setauthsize(ctx->child, authsize); | ||
616 | } | ||
617 | |||
618 | static struct aead_request *crypto_rfc4106_crypt(struct aead_request *req) | ||
619 | { | ||
620 | struct aead_request *subreq = aead_request_ctx(req); | ||
621 | struct crypto_aead *aead = crypto_aead_reqtfm(req); | ||
622 | struct crypto_rfc4106_ctx *ctx = crypto_aead_ctx(aead); | ||
623 | struct crypto_aead *child = ctx->child; | ||
624 | u8 *iv = PTR_ALIGN((u8 *)(subreq + 1) + crypto_aead_reqsize(child), | ||
625 | crypto_aead_alignmask(child) + 1); | ||
626 | |||
627 | memcpy(iv, ctx->nonce, 4); | ||
628 | memcpy(iv + 4, req->iv, 8); | ||
629 | |||
630 | aead_request_set_tfm(subreq, child); | ||
631 | aead_request_set_callback(subreq, req->base.flags, req->base.complete, | ||
632 | req->base.data); | ||
633 | aead_request_set_crypt(subreq, req->src, req->dst, req->cryptlen, iv); | ||
634 | aead_request_set_assoc(subreq, req->assoc, req->assoclen); | ||
635 | |||
636 | return subreq; | ||
637 | } | ||
638 | |||
639 | static int crypto_rfc4106_encrypt(struct aead_request *req) | ||
640 | { | ||
641 | req = crypto_rfc4106_crypt(req); | ||
642 | |||
643 | return crypto_aead_encrypt(req); | ||
644 | } | ||
645 | |||
646 | static int crypto_rfc4106_decrypt(struct aead_request *req) | ||
647 | { | ||
648 | req = crypto_rfc4106_crypt(req); | ||
649 | |||
650 | return crypto_aead_decrypt(req); | ||
651 | } | ||
652 | |||
653 | static int crypto_rfc4106_init_tfm(struct crypto_tfm *tfm) | ||
654 | { | ||
655 | struct crypto_instance *inst = (void *)tfm->__crt_alg; | ||
656 | struct crypto_aead_spawn *spawn = crypto_instance_ctx(inst); | ||
657 | struct crypto_rfc4106_ctx *ctx = crypto_tfm_ctx(tfm); | ||
658 | struct crypto_aead *aead; | ||
659 | unsigned long align; | ||
660 | |||
661 | aead = crypto_spawn_aead(spawn); | ||
662 | if (IS_ERR(aead)) | ||
663 | return PTR_ERR(aead); | ||
664 | |||
665 | ctx->child = aead; | ||
666 | |||
667 | align = crypto_aead_alignmask(aead); | ||
668 | align &= ~(crypto_tfm_ctx_alignment() - 1); | ||
669 | tfm->crt_aead.reqsize = sizeof(struct aead_request) + | ||
670 | ALIGN(crypto_aead_reqsize(aead), | ||
671 | crypto_tfm_ctx_alignment()) + | ||
672 | align + 16; | ||
673 | |||
674 | return 0; | ||
675 | } | ||
676 | |||
677 | static void crypto_rfc4106_exit_tfm(struct crypto_tfm *tfm) | ||
678 | { | ||
679 | struct crypto_rfc4106_ctx *ctx = crypto_tfm_ctx(tfm); | ||
680 | |||
681 | crypto_free_aead(ctx->child); | ||
682 | } | ||
683 | |||
684 | static struct crypto_instance *crypto_rfc4106_alloc(struct rtattr **tb) | ||
685 | { | ||
686 | struct crypto_attr_type *algt; | ||
687 | struct crypto_instance *inst; | ||
688 | struct crypto_aead_spawn *spawn; | ||
689 | struct crypto_alg *alg; | ||
690 | const char *ccm_name; | ||
691 | int err; | ||
692 | |||
693 | algt = crypto_get_attr_type(tb); | ||
694 | err = PTR_ERR(algt); | ||
695 | if (IS_ERR(algt)) | ||
696 | return ERR_PTR(err); | ||
697 | |||
698 | if ((algt->type ^ CRYPTO_ALG_TYPE_AEAD) & algt->mask) | ||
699 | return ERR_PTR(-EINVAL); | ||
700 | |||
701 | ccm_name = crypto_attr_alg_name(tb[1]); | ||
702 | err = PTR_ERR(ccm_name); | ||
703 | if (IS_ERR(ccm_name)) | ||
704 | return ERR_PTR(err); | ||
705 | |||
706 | inst = kzalloc(sizeof(*inst) + sizeof(*spawn), GFP_KERNEL); | ||
707 | if (!inst) | ||
708 | return ERR_PTR(-ENOMEM); | ||
709 | |||
710 | spawn = crypto_instance_ctx(inst); | ||
711 | crypto_set_aead_spawn(spawn, inst); | ||
712 | err = crypto_grab_aead(spawn, ccm_name, 0, | ||
713 | crypto_requires_sync(algt->type, algt->mask)); | ||
714 | if (err) | ||
715 | goto out_free_inst; | ||
716 | |||
717 | alg = crypto_aead_spawn_alg(spawn); | ||
718 | |||
719 | err = -EINVAL; | ||
720 | |||
721 | /* We only support 16-byte blocks. */ | ||
722 | if (alg->cra_aead.ivsize != 16) | ||
723 | goto out_drop_alg; | ||
724 | |||
725 | /* Not a stream cipher? */ | ||
726 | if (alg->cra_blocksize != 1) | ||
727 | goto out_drop_alg; | ||
728 | |||
729 | err = -ENAMETOOLONG; | ||
730 | if (snprintf(inst->alg.cra_name, CRYPTO_MAX_ALG_NAME, | ||
731 | "rfc4106(%s)", alg->cra_name) >= CRYPTO_MAX_ALG_NAME || | ||
732 | snprintf(inst->alg.cra_driver_name, CRYPTO_MAX_ALG_NAME, | ||
733 | "rfc4106(%s)", alg->cra_driver_name) >= | ||
734 | CRYPTO_MAX_ALG_NAME) | ||
735 | goto out_drop_alg; | ||
736 | |||
737 | inst->alg.cra_flags = CRYPTO_ALG_TYPE_AEAD; | ||
738 | inst->alg.cra_flags |= alg->cra_flags & CRYPTO_ALG_ASYNC; | ||
739 | inst->alg.cra_priority = alg->cra_priority; | ||
740 | inst->alg.cra_blocksize = 1; | ||
741 | inst->alg.cra_alignmask = alg->cra_alignmask; | ||
742 | inst->alg.cra_type = &crypto_nivaead_type; | ||
743 | |||
744 | inst->alg.cra_aead.ivsize = 8; | ||
745 | inst->alg.cra_aead.maxauthsize = 16; | ||
746 | |||
747 | inst->alg.cra_ctxsize = sizeof(struct crypto_rfc4106_ctx); | ||
748 | |||
749 | inst->alg.cra_init = crypto_rfc4106_init_tfm; | ||
750 | inst->alg.cra_exit = crypto_rfc4106_exit_tfm; | ||
751 | |||
752 | inst->alg.cra_aead.setkey = crypto_rfc4106_setkey; | ||
753 | inst->alg.cra_aead.setauthsize = crypto_rfc4106_setauthsize; | ||
754 | inst->alg.cra_aead.encrypt = crypto_rfc4106_encrypt; | ||
755 | inst->alg.cra_aead.decrypt = crypto_rfc4106_decrypt; | ||
756 | |||
757 | inst->alg.cra_aead.geniv = "seqiv"; | ||
758 | |||
759 | out: | ||
760 | return inst; | ||
761 | |||
762 | out_drop_alg: | ||
763 | crypto_drop_aead(spawn); | ||
764 | out_free_inst: | ||
765 | kfree(inst); | ||
766 | inst = ERR_PTR(err); | ||
767 | goto out; | ||
768 | } | ||
769 | |||
770 | static void crypto_rfc4106_free(struct crypto_instance *inst) | ||
771 | { | ||
772 | crypto_drop_spawn(crypto_instance_ctx(inst)); | ||
773 | kfree(inst); | ||
774 | } | ||
775 | |||
776 | static struct crypto_template crypto_rfc4106_tmpl = { | ||
777 | .name = "rfc4106", | ||
778 | .alloc = crypto_rfc4106_alloc, | ||
779 | .free = crypto_rfc4106_free, | ||
780 | .module = THIS_MODULE, | ||
781 | }; | ||
782 | |||
783 | static int __init crypto_gcm_module_init(void) | ||
784 | { | ||
785 | int err; | ||
786 | |||
787 | err = crypto_register_template(&crypto_gcm_base_tmpl); | ||
788 | if (err) | ||
789 | goto out; | ||
790 | |||
791 | err = crypto_register_template(&crypto_gcm_tmpl); | ||
792 | if (err) | ||
793 | goto out_undo_base; | ||
794 | |||
795 | err = crypto_register_template(&crypto_rfc4106_tmpl); | ||
796 | if (err) | ||
797 | goto out_undo_gcm; | ||
798 | |||
799 | out: | ||
800 | return err; | ||
801 | |||
802 | out_undo_gcm: | ||
803 | crypto_unregister_template(&crypto_gcm_tmpl); | ||
804 | out_undo_base: | ||
805 | crypto_unregister_template(&crypto_gcm_base_tmpl); | ||
806 | goto out; | ||
807 | } | ||
808 | |||
809 | static void __exit crypto_gcm_module_exit(void) | ||
810 | { | ||
811 | crypto_unregister_template(&crypto_rfc4106_tmpl); | ||
812 | crypto_unregister_template(&crypto_gcm_tmpl); | ||
813 | crypto_unregister_template(&crypto_gcm_base_tmpl); | ||
814 | } | ||
815 | |||
816 | module_init(crypto_gcm_module_init); | ||
817 | module_exit(crypto_gcm_module_exit); | ||
818 | |||
819 | MODULE_LICENSE("GPL"); | ||
820 | MODULE_DESCRIPTION("Galois/Counter Mode"); | ||
821 | MODULE_AUTHOR("Mikko Herranen <mh1@iki.fi>"); | ||
822 | MODULE_ALIAS("gcm_base"); | ||
823 | MODULE_ALIAS("rfc4106"); | ||
diff --git a/crypto/hmac.c b/crypto/hmac.c index 0f05be769c34..a1d016a50e7d 100644 --- a/crypto/hmac.c +++ b/crypto/hmac.c | |||
@@ -17,6 +17,7 @@ | |||
17 | */ | 17 | */ |
18 | 18 | ||
19 | #include <crypto/algapi.h> | 19 | #include <crypto/algapi.h> |
20 | #include <crypto/scatterwalk.h> | ||
20 | #include <linux/err.h> | 21 | #include <linux/err.h> |
21 | #include <linux/init.h> | 22 | #include <linux/init.h> |
22 | #include <linux/kernel.h> | 23 | #include <linux/kernel.h> |
@@ -160,7 +161,7 @@ static int hmac_digest(struct hash_desc *pdesc, struct scatterlist *sg, | |||
160 | 161 | ||
161 | sg_init_table(sg1, 2); | 162 | sg_init_table(sg1, 2); |
162 | sg_set_buf(sg1, ipad, bs); | 163 | sg_set_buf(sg1, ipad, bs); |
163 | sg_set_page(&sg1[1], (void *) sg, 0, 0); | 164 | scatterwalk_sg_chain(sg1, 2, sg); |
164 | 165 | ||
165 | sg_init_table(sg2, 1); | 166 | sg_init_table(sg2, 1); |
166 | sg_set_buf(sg2, opad, bs + ds); | 167 | sg_set_buf(sg2, opad, bs + ds); |
diff --git a/crypto/internal.h b/crypto/internal.h index abb01f71f817..32f4c2145603 100644 --- a/crypto/internal.h +++ b/crypto/internal.h | |||
@@ -25,7 +25,6 @@ | |||
25 | #include <linux/notifier.h> | 25 | #include <linux/notifier.h> |
26 | #include <linux/rwsem.h> | 26 | #include <linux/rwsem.h> |
27 | #include <linux/slab.h> | 27 | #include <linux/slab.h> |
28 | #include <asm/kmap_types.h> | ||
29 | 28 | ||
30 | /* Crypto notification events. */ | 29 | /* Crypto notification events. */ |
31 | enum { | 30 | enum { |
@@ -50,34 +49,6 @@ extern struct list_head crypto_alg_list; | |||
50 | extern struct rw_semaphore crypto_alg_sem; | 49 | extern struct rw_semaphore crypto_alg_sem; |
51 | extern struct blocking_notifier_head crypto_chain; | 50 | extern struct blocking_notifier_head crypto_chain; |
52 | 51 | ||
53 | static inline enum km_type crypto_kmap_type(int out) | ||
54 | { | ||
55 | enum km_type type; | ||
56 | |||
57 | if (in_softirq()) | ||
58 | type = out * (KM_SOFTIRQ1 - KM_SOFTIRQ0) + KM_SOFTIRQ0; | ||
59 | else | ||
60 | type = out * (KM_USER1 - KM_USER0) + KM_USER0; | ||
61 | |||
62 | return type; | ||
63 | } | ||
64 | |||
65 | static inline void *crypto_kmap(struct page *page, int out) | ||
66 | { | ||
67 | return kmap_atomic(page, crypto_kmap_type(out)); | ||
68 | } | ||
69 | |||
70 | static inline void crypto_kunmap(void *vaddr, int out) | ||
71 | { | ||
72 | kunmap_atomic(vaddr, crypto_kmap_type(out)); | ||
73 | } | ||
74 | |||
75 | static inline void crypto_yield(u32 flags) | ||
76 | { | ||
77 | if (flags & CRYPTO_TFM_REQ_MAY_SLEEP) | ||
78 | cond_resched(); | ||
79 | } | ||
80 | |||
81 | #ifdef CONFIG_PROC_FS | 52 | #ifdef CONFIG_PROC_FS |
82 | void __init crypto_init_proc(void); | 53 | void __init crypto_init_proc(void); |
83 | void __exit crypto_exit_proc(void); | 54 | void __exit crypto_exit_proc(void); |
@@ -122,6 +93,8 @@ void crypto_exit_digest_ops(struct crypto_tfm *tfm); | |||
122 | void crypto_exit_cipher_ops(struct crypto_tfm *tfm); | 93 | void crypto_exit_cipher_ops(struct crypto_tfm *tfm); |
123 | void crypto_exit_compress_ops(struct crypto_tfm *tfm); | 94 | void crypto_exit_compress_ops(struct crypto_tfm *tfm); |
124 | 95 | ||
96 | void crypto_larval_kill(struct crypto_alg *alg); | ||
97 | struct crypto_alg *crypto_larval_lookup(const char *name, u32 type, u32 mask); | ||
125 | void crypto_larval_error(const char *name, u32 type, u32 mask); | 98 | void crypto_larval_error(const char *name, u32 type, u32 mask); |
126 | 99 | ||
127 | void crypto_shoot_alg(struct crypto_alg *alg); | 100 | void crypto_shoot_alg(struct crypto_alg *alg); |
diff --git a/crypto/lzo.c b/crypto/lzo.c new file mode 100644 index 000000000000..48c32883f024 --- /dev/null +++ b/crypto/lzo.c | |||
@@ -0,0 +1,106 @@ | |||
1 | /* | ||
2 | * Cryptographic API. | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify it | ||
5 | * under the terms of the GNU General Public License version 2 as published by | ||
6 | * the Free Software Foundation. | ||
7 | * | ||
8 | * This program is distributed in the hope that it will be useful, but WITHOUT | ||
9 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
10 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
11 | * more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License along with | ||
14 | * this program; if not, write to the Free Software Foundation, Inc., 51 | ||
15 | * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
16 | * | ||
17 | */ | ||
18 | |||
19 | #include <linux/init.h> | ||
20 | #include <linux/module.h> | ||
21 | #include <linux/crypto.h> | ||
22 | #include <linux/vmalloc.h> | ||
23 | #include <linux/lzo.h> | ||
24 | |||
25 | struct lzo_ctx { | ||
26 | void *lzo_comp_mem; | ||
27 | }; | ||
28 | |||
29 | static int lzo_init(struct crypto_tfm *tfm) | ||
30 | { | ||
31 | struct lzo_ctx *ctx = crypto_tfm_ctx(tfm); | ||
32 | |||
33 | ctx->lzo_comp_mem = vmalloc(LZO1X_MEM_COMPRESS); | ||
34 | if (!ctx->lzo_comp_mem) | ||
35 | return -ENOMEM; | ||
36 | |||
37 | return 0; | ||
38 | } | ||
39 | |||
40 | static void lzo_exit(struct crypto_tfm *tfm) | ||
41 | { | ||
42 | struct lzo_ctx *ctx = crypto_tfm_ctx(tfm); | ||
43 | |||
44 | vfree(ctx->lzo_comp_mem); | ||
45 | } | ||
46 | |||
47 | static int lzo_compress(struct crypto_tfm *tfm, const u8 *src, | ||
48 | unsigned int slen, u8 *dst, unsigned int *dlen) | ||
49 | { | ||
50 | struct lzo_ctx *ctx = crypto_tfm_ctx(tfm); | ||
51 | size_t tmp_len = *dlen; /* size_t(ulong) <-> uint on 64 bit */ | ||
52 | int err; | ||
53 | |||
54 | err = lzo1x_1_compress(src, slen, dst, &tmp_len, ctx->lzo_comp_mem); | ||
55 | |||
56 | if (err != LZO_E_OK) | ||
57 | return -EINVAL; | ||
58 | |||
59 | *dlen = tmp_len; | ||
60 | return 0; | ||
61 | } | ||
62 | |||
63 | static int lzo_decompress(struct crypto_tfm *tfm, const u8 *src, | ||
64 | unsigned int slen, u8 *dst, unsigned int *dlen) | ||
65 | { | ||
66 | int err; | ||
67 | size_t tmp_len = *dlen; /* size_t(ulong) <-> uint on 64 bit */ | ||
68 | |||
69 | err = lzo1x_decompress_safe(src, slen, dst, &tmp_len); | ||
70 | |||
71 | if (err != LZO_E_OK) | ||
72 | return -EINVAL; | ||
73 | |||
74 | *dlen = tmp_len; | ||
75 | return 0; | ||
76 | |||
77 | } | ||
78 | |||
79 | static struct crypto_alg alg = { | ||
80 | .cra_name = "lzo", | ||
81 | .cra_flags = CRYPTO_ALG_TYPE_COMPRESS, | ||
82 | .cra_ctxsize = sizeof(struct lzo_ctx), | ||
83 | .cra_module = THIS_MODULE, | ||
84 | .cra_list = LIST_HEAD_INIT(alg.cra_list), | ||
85 | .cra_init = lzo_init, | ||
86 | .cra_exit = lzo_exit, | ||
87 | .cra_u = { .compress = { | ||
88 | .coa_compress = lzo_compress, | ||
89 | .coa_decompress = lzo_decompress } } | ||
90 | }; | ||
91 | |||
92 | static int __init init(void) | ||
93 | { | ||
94 | return crypto_register_alg(&alg); | ||
95 | } | ||
96 | |||
97 | static void __exit fini(void) | ||
98 | { | ||
99 | crypto_unregister_alg(&alg); | ||
100 | } | ||
101 | |||
102 | module_init(init); | ||
103 | module_exit(fini); | ||
104 | |||
105 | MODULE_LICENSE("GPL"); | ||
106 | MODULE_DESCRIPTION("LZO Compression Algorithm"); | ||
diff --git a/crypto/pcbc.c b/crypto/pcbc.c index c3ed8a1c9f46..fe704775f88f 100644 --- a/crypto/pcbc.c +++ b/crypto/pcbc.c | |||
@@ -24,7 +24,6 @@ | |||
24 | 24 | ||
25 | struct crypto_pcbc_ctx { | 25 | struct crypto_pcbc_ctx { |
26 | struct crypto_cipher *child; | 26 | struct crypto_cipher *child; |
27 | void (*xor)(u8 *dst, const u8 *src, unsigned int bs); | ||
28 | }; | 27 | }; |
29 | 28 | ||
30 | static int crypto_pcbc_setkey(struct crypto_tfm *parent, const u8 *key, | 29 | static int crypto_pcbc_setkey(struct crypto_tfm *parent, const u8 *key, |
@@ -45,9 +44,7 @@ static int crypto_pcbc_setkey(struct crypto_tfm *parent, const u8 *key, | |||
45 | 44 | ||
46 | static int crypto_pcbc_encrypt_segment(struct blkcipher_desc *desc, | 45 | static int crypto_pcbc_encrypt_segment(struct blkcipher_desc *desc, |
47 | struct blkcipher_walk *walk, | 46 | struct blkcipher_walk *walk, |
48 | struct crypto_cipher *tfm, | 47 | struct crypto_cipher *tfm) |
49 | void (*xor)(u8 *, const u8 *, | ||
50 | unsigned int)) | ||
51 | { | 48 | { |
52 | void (*fn)(struct crypto_tfm *, u8 *, const u8 *) = | 49 | void (*fn)(struct crypto_tfm *, u8 *, const u8 *) = |
53 | crypto_cipher_alg(tfm)->cia_encrypt; | 50 | crypto_cipher_alg(tfm)->cia_encrypt; |
@@ -58,10 +55,10 @@ static int crypto_pcbc_encrypt_segment(struct blkcipher_desc *desc, | |||
58 | u8 *iv = walk->iv; | 55 | u8 *iv = walk->iv; |
59 | 56 | ||
60 | do { | 57 | do { |
61 | xor(iv, src, bsize); | 58 | crypto_xor(iv, src, bsize); |
62 | fn(crypto_cipher_tfm(tfm), dst, iv); | 59 | fn(crypto_cipher_tfm(tfm), dst, iv); |
63 | memcpy(iv, dst, bsize); | 60 | memcpy(iv, dst, bsize); |
64 | xor(iv, src, bsize); | 61 | crypto_xor(iv, src, bsize); |
65 | 62 | ||
66 | src += bsize; | 63 | src += bsize; |
67 | dst += bsize; | 64 | dst += bsize; |
@@ -72,9 +69,7 @@ static int crypto_pcbc_encrypt_segment(struct blkcipher_desc *desc, | |||
72 | 69 | ||
73 | static int crypto_pcbc_encrypt_inplace(struct blkcipher_desc *desc, | 70 | static int crypto_pcbc_encrypt_inplace(struct blkcipher_desc *desc, |
74 | struct blkcipher_walk *walk, | 71 | struct blkcipher_walk *walk, |
75 | struct crypto_cipher *tfm, | 72 | struct crypto_cipher *tfm) |
76 | void (*xor)(u8 *, const u8 *, | ||
77 | unsigned int)) | ||
78 | { | 73 | { |
79 | void (*fn)(struct crypto_tfm *, u8 *, const u8 *) = | 74 | void (*fn)(struct crypto_tfm *, u8 *, const u8 *) = |
80 | crypto_cipher_alg(tfm)->cia_encrypt; | 75 | crypto_cipher_alg(tfm)->cia_encrypt; |
@@ -86,10 +81,10 @@ static int crypto_pcbc_encrypt_inplace(struct blkcipher_desc *desc, | |||
86 | 81 | ||
87 | do { | 82 | do { |
88 | memcpy(tmpbuf, src, bsize); | 83 | memcpy(tmpbuf, src, bsize); |
89 | xor(iv, tmpbuf, bsize); | 84 | crypto_xor(iv, src, bsize); |
90 | fn(crypto_cipher_tfm(tfm), src, iv); | 85 | fn(crypto_cipher_tfm(tfm), src, iv); |
91 | memcpy(iv, src, bsize); | 86 | memcpy(iv, tmpbuf, bsize); |
92 | xor(iv, tmpbuf, bsize); | 87 | crypto_xor(iv, src, bsize); |
93 | 88 | ||
94 | src += bsize; | 89 | src += bsize; |
95 | } while ((nbytes -= bsize) >= bsize); | 90 | } while ((nbytes -= bsize) >= bsize); |
@@ -107,7 +102,6 @@ static int crypto_pcbc_encrypt(struct blkcipher_desc *desc, | |||
107 | struct crypto_blkcipher *tfm = desc->tfm; | 102 | struct crypto_blkcipher *tfm = desc->tfm; |
108 | struct crypto_pcbc_ctx *ctx = crypto_blkcipher_ctx(tfm); | 103 | struct crypto_pcbc_ctx *ctx = crypto_blkcipher_ctx(tfm); |
109 | struct crypto_cipher *child = ctx->child; | 104 | struct crypto_cipher *child = ctx->child; |
110 | void (*xor)(u8 *, const u8 *, unsigned int bs) = ctx->xor; | ||
111 | int err; | 105 | int err; |
112 | 106 | ||
113 | blkcipher_walk_init(&walk, dst, src, nbytes); | 107 | blkcipher_walk_init(&walk, dst, src, nbytes); |
@@ -115,11 +109,11 @@ static int crypto_pcbc_encrypt(struct blkcipher_desc *desc, | |||
115 | 109 | ||
116 | while ((nbytes = walk.nbytes)) { | 110 | while ((nbytes = walk.nbytes)) { |
117 | if (walk.src.virt.addr == walk.dst.virt.addr) | 111 | if (walk.src.virt.addr == walk.dst.virt.addr) |
118 | nbytes = crypto_pcbc_encrypt_inplace(desc, &walk, child, | 112 | nbytes = crypto_pcbc_encrypt_inplace(desc, &walk, |
119 | xor); | 113 | child); |
120 | else | 114 | else |
121 | nbytes = crypto_pcbc_encrypt_segment(desc, &walk, child, | 115 | nbytes = crypto_pcbc_encrypt_segment(desc, &walk, |
122 | xor); | 116 | child); |
123 | err = blkcipher_walk_done(desc, &walk, nbytes); | 117 | err = blkcipher_walk_done(desc, &walk, nbytes); |
124 | } | 118 | } |
125 | 119 | ||
@@ -128,9 +122,7 @@ static int crypto_pcbc_encrypt(struct blkcipher_desc *desc, | |||
128 | 122 | ||
129 | static int crypto_pcbc_decrypt_segment(struct blkcipher_desc *desc, | 123 | static int crypto_pcbc_decrypt_segment(struct blkcipher_desc *desc, |
130 | struct blkcipher_walk *walk, | 124 | struct blkcipher_walk *walk, |
131 | struct crypto_cipher *tfm, | 125 | struct crypto_cipher *tfm) |
132 | void (*xor)(u8 *, const u8 *, | ||
133 | unsigned int)) | ||
134 | { | 126 | { |
135 | void (*fn)(struct crypto_tfm *, u8 *, const u8 *) = | 127 | void (*fn)(struct crypto_tfm *, u8 *, const u8 *) = |
136 | crypto_cipher_alg(tfm)->cia_decrypt; | 128 | crypto_cipher_alg(tfm)->cia_decrypt; |
@@ -142,9 +134,9 @@ static int crypto_pcbc_decrypt_segment(struct blkcipher_desc *desc, | |||
142 | 134 | ||
143 | do { | 135 | do { |
144 | fn(crypto_cipher_tfm(tfm), dst, src); | 136 | fn(crypto_cipher_tfm(tfm), dst, src); |
145 | xor(dst, iv, bsize); | 137 | crypto_xor(dst, iv, bsize); |
146 | memcpy(iv, src, bsize); | 138 | memcpy(iv, src, bsize); |
147 | xor(iv, dst, bsize); | 139 | crypto_xor(iv, dst, bsize); |
148 | 140 | ||
149 | src += bsize; | 141 | src += bsize; |
150 | dst += bsize; | 142 | dst += bsize; |
@@ -157,9 +149,7 @@ static int crypto_pcbc_decrypt_segment(struct blkcipher_desc *desc, | |||
157 | 149 | ||
158 | static int crypto_pcbc_decrypt_inplace(struct blkcipher_desc *desc, | 150 | static int crypto_pcbc_decrypt_inplace(struct blkcipher_desc *desc, |
159 | struct blkcipher_walk *walk, | 151 | struct blkcipher_walk *walk, |
160 | struct crypto_cipher *tfm, | 152 | struct crypto_cipher *tfm) |
161 | void (*xor)(u8 *, const u8 *, | ||
162 | unsigned int)) | ||
163 | { | 153 | { |
164 | void (*fn)(struct crypto_tfm *, u8 *, const u8 *) = | 154 | void (*fn)(struct crypto_tfm *, u8 *, const u8 *) = |
165 | crypto_cipher_alg(tfm)->cia_decrypt; | 155 | crypto_cipher_alg(tfm)->cia_decrypt; |
@@ -172,9 +162,9 @@ static int crypto_pcbc_decrypt_inplace(struct blkcipher_desc *desc, | |||
172 | do { | 162 | do { |
173 | memcpy(tmpbuf, src, bsize); | 163 | memcpy(tmpbuf, src, bsize); |
174 | fn(crypto_cipher_tfm(tfm), src, src); | 164 | fn(crypto_cipher_tfm(tfm), src, src); |
175 | xor(src, iv, bsize); | 165 | crypto_xor(src, iv, bsize); |
176 | memcpy(iv, tmpbuf, bsize); | 166 | memcpy(iv, tmpbuf, bsize); |
177 | xor(iv, src, bsize); | 167 | crypto_xor(iv, src, bsize); |
178 | 168 | ||
179 | src += bsize; | 169 | src += bsize; |
180 | } while ((nbytes -= bsize) >= bsize); | 170 | } while ((nbytes -= bsize) >= bsize); |
@@ -192,7 +182,6 @@ static int crypto_pcbc_decrypt(struct blkcipher_desc *desc, | |||
192 | struct crypto_blkcipher *tfm = desc->tfm; | 182 | struct crypto_blkcipher *tfm = desc->tfm; |
193 | struct crypto_pcbc_ctx *ctx = crypto_blkcipher_ctx(tfm); | 183 | struct crypto_pcbc_ctx *ctx = crypto_blkcipher_ctx(tfm); |
194 | struct crypto_cipher *child = ctx->child; | 184 | struct crypto_cipher *child = ctx->child; |
195 | void (*xor)(u8 *, const u8 *, unsigned int bs) = ctx->xor; | ||
196 | int err; | 185 | int err; |
197 | 186 | ||
198 | blkcipher_walk_init(&walk, dst, src, nbytes); | 187 | blkcipher_walk_init(&walk, dst, src, nbytes); |
@@ -200,48 +189,17 @@ static int crypto_pcbc_decrypt(struct blkcipher_desc *desc, | |||
200 | 189 | ||
201 | while ((nbytes = walk.nbytes)) { | 190 | while ((nbytes = walk.nbytes)) { |
202 | if (walk.src.virt.addr == walk.dst.virt.addr) | 191 | if (walk.src.virt.addr == walk.dst.virt.addr) |
203 | nbytes = crypto_pcbc_decrypt_inplace(desc, &walk, child, | 192 | nbytes = crypto_pcbc_decrypt_inplace(desc, &walk, |
204 | xor); | 193 | child); |
205 | else | 194 | else |
206 | nbytes = crypto_pcbc_decrypt_segment(desc, &walk, child, | 195 | nbytes = crypto_pcbc_decrypt_segment(desc, &walk, |
207 | xor); | 196 | child); |
208 | err = blkcipher_walk_done(desc, &walk, nbytes); | 197 | err = blkcipher_walk_done(desc, &walk, nbytes); |
209 | } | 198 | } |
210 | 199 | ||
211 | return err; | 200 | return err; |
212 | } | 201 | } |
213 | 202 | ||
214 | static void xor_byte(u8 *a, const u8 *b, unsigned int bs) | ||
215 | { | ||
216 | do { | ||
217 | *a++ ^= *b++; | ||
218 | } while (--bs); | ||
219 | } | ||
220 | |||
221 | static void xor_quad(u8 *dst, const u8 *src, unsigned int bs) | ||
222 | { | ||
223 | u32 *a = (u32 *)dst; | ||
224 | u32 *b = (u32 *)src; | ||
225 | |||
226 | do { | ||
227 | *a++ ^= *b++; | ||
228 | } while ((bs -= 4)); | ||
229 | } | ||
230 | |||
231 | static void xor_64(u8 *a, const u8 *b, unsigned int bs) | ||
232 | { | ||
233 | ((u32 *)a)[0] ^= ((u32 *)b)[0]; | ||
234 | ((u32 *)a)[1] ^= ((u32 *)b)[1]; | ||
235 | } | ||
236 | |||
237 | static void xor_128(u8 *a, const u8 *b, unsigned int bs) | ||
238 | { | ||
239 | ((u32 *)a)[0] ^= ((u32 *)b)[0]; | ||
240 | ((u32 *)a)[1] ^= ((u32 *)b)[1]; | ||
241 | ((u32 *)a)[2] ^= ((u32 *)b)[2]; | ||
242 | ((u32 *)a)[3] ^= ((u32 *)b)[3]; | ||
243 | } | ||
244 | |||
245 | static int crypto_pcbc_init_tfm(struct crypto_tfm *tfm) | 203 | static int crypto_pcbc_init_tfm(struct crypto_tfm *tfm) |
246 | { | 204 | { |
247 | struct crypto_instance *inst = (void *)tfm->__crt_alg; | 205 | struct crypto_instance *inst = (void *)tfm->__crt_alg; |
@@ -249,22 +207,6 @@ static int crypto_pcbc_init_tfm(struct crypto_tfm *tfm) | |||
249 | struct crypto_pcbc_ctx *ctx = crypto_tfm_ctx(tfm); | 207 | struct crypto_pcbc_ctx *ctx = crypto_tfm_ctx(tfm); |
250 | struct crypto_cipher *cipher; | 208 | struct crypto_cipher *cipher; |
251 | 209 | ||
252 | switch (crypto_tfm_alg_blocksize(tfm)) { | ||
253 | case 8: | ||
254 | ctx->xor = xor_64; | ||
255 | break; | ||
256 | |||
257 | case 16: | ||
258 | ctx->xor = xor_128; | ||
259 | break; | ||
260 | |||
261 | default: | ||
262 | if (crypto_tfm_alg_blocksize(tfm) % 4) | ||
263 | ctx->xor = xor_byte; | ||
264 | else | ||
265 | ctx->xor = xor_quad; | ||
266 | } | ||
267 | |||
268 | cipher = crypto_spawn_cipher(spawn); | 210 | cipher = crypto_spawn_cipher(spawn); |
269 | if (IS_ERR(cipher)) | 211 | if (IS_ERR(cipher)) |
270 | return PTR_ERR(cipher); | 212 | return PTR_ERR(cipher); |
@@ -304,8 +246,9 @@ static struct crypto_instance *crypto_pcbc_alloc(struct rtattr **tb) | |||
304 | inst->alg.cra_alignmask = alg->cra_alignmask; | 246 | inst->alg.cra_alignmask = alg->cra_alignmask; |
305 | inst->alg.cra_type = &crypto_blkcipher_type; | 247 | inst->alg.cra_type = &crypto_blkcipher_type; |
306 | 248 | ||
307 | if (!(alg->cra_blocksize % 4)) | 249 | /* We access the data as u32s when xoring. */ |
308 | inst->alg.cra_alignmask |= 3; | 250 | inst->alg.cra_alignmask |= __alignof__(u32) - 1; |
251 | |||
309 | inst->alg.cra_blkcipher.ivsize = alg->cra_blocksize; | 252 | inst->alg.cra_blkcipher.ivsize = alg->cra_blocksize; |
310 | inst->alg.cra_blkcipher.min_keysize = alg->cra_cipher.cia_min_keysize; | 253 | inst->alg.cra_blkcipher.min_keysize = alg->cra_cipher.cia_min_keysize; |
311 | inst->alg.cra_blkcipher.max_keysize = alg->cra_cipher.cia_max_keysize; | 254 | inst->alg.cra_blkcipher.max_keysize = alg->cra_cipher.cia_max_keysize; |
diff --git a/crypto/salsa20_generic.c b/crypto/salsa20_generic.c new file mode 100644 index 000000000000..1fa4e4ddcab5 --- /dev/null +++ b/crypto/salsa20_generic.c | |||
@@ -0,0 +1,255 @@ | |||
1 | /* | ||
2 | * Salsa20: Salsa20 stream cipher algorithm | ||
3 | * | ||
4 | * Copyright (c) 2007 Tan Swee Heng <thesweeheng@gmail.com> | ||
5 | * | ||
6 | * Derived from: | ||
7 | * - salsa20.c: Public domain C code by Daniel J. Bernstein <djb@cr.yp.to> | ||
8 | * | ||
9 | * Salsa20 is a stream cipher candidate in eSTREAM, the ECRYPT Stream | ||
10 | * Cipher Project. It is designed by Daniel J. Bernstein <djb@cr.yp.to>. | ||
11 | * More information about eSTREAM and Salsa20 can be found here: | ||
12 | * http://www.ecrypt.eu.org/stream/ | ||
13 | * http://cr.yp.to/snuffle.html | ||
14 | * | ||
15 | * This program is free software; you can redistribute it and/or modify it | ||
16 | * under the terms of the GNU General Public License as published by the Free | ||
17 | * Software Foundation; either version 2 of the License, or (at your option) | ||
18 | * any later version. | ||
19 | * | ||
20 | */ | ||
21 | |||
22 | #include <linux/init.h> | ||
23 | #include <linux/module.h> | ||
24 | #include <linux/errno.h> | ||
25 | #include <linux/crypto.h> | ||
26 | #include <linux/types.h> | ||
27 | #include <crypto/algapi.h> | ||
28 | #include <asm/byteorder.h> | ||
29 | |||
30 | #define SALSA20_IV_SIZE 8U | ||
31 | #define SALSA20_MIN_KEY_SIZE 16U | ||
32 | #define SALSA20_MAX_KEY_SIZE 32U | ||
33 | |||
34 | /* | ||
35 | * Start of code taken from D. J. Bernstein's reference implementation. | ||
36 | * With some modifications and optimizations made to suit our needs. | ||
37 | */ | ||
38 | |||
39 | /* | ||
40 | salsa20-ref.c version 20051118 | ||
41 | D. J. Bernstein | ||
42 | Public domain. | ||
43 | */ | ||
44 | |||
45 | #define ROTATE(v,n) (((v) << (n)) | ((v) >> (32 - (n)))) | ||
46 | #define XOR(v,w) ((v) ^ (w)) | ||
47 | #define PLUS(v,w) (((v) + (w))) | ||
48 | #define PLUSONE(v) (PLUS((v),1)) | ||
49 | #define U32TO8_LITTLE(p, v) \ | ||
50 | { (p)[0] = (v >> 0) & 0xff; (p)[1] = (v >> 8) & 0xff; \ | ||
51 | (p)[2] = (v >> 16) & 0xff; (p)[3] = (v >> 24) & 0xff; } | ||
52 | #define U8TO32_LITTLE(p) \ | ||
53 | (((u32)((p)[0]) ) | ((u32)((p)[1]) << 8) | \ | ||
54 | ((u32)((p)[2]) << 16) | ((u32)((p)[3]) << 24) ) | ||
55 | |||
56 | struct salsa20_ctx | ||
57 | { | ||
58 | u32 input[16]; | ||
59 | }; | ||
60 | |||
61 | static void salsa20_wordtobyte(u8 output[64], const u32 input[16]) | ||
62 | { | ||
63 | u32 x[16]; | ||
64 | int i; | ||
65 | |||
66 | memcpy(x, input, sizeof(x)); | ||
67 | for (i = 20; i > 0; i -= 2) { | ||
68 | x[ 4] = XOR(x[ 4],ROTATE(PLUS(x[ 0],x[12]), 7)); | ||
69 | x[ 8] = XOR(x[ 8],ROTATE(PLUS(x[ 4],x[ 0]), 9)); | ||
70 | x[12] = XOR(x[12],ROTATE(PLUS(x[ 8],x[ 4]),13)); | ||
71 | x[ 0] = XOR(x[ 0],ROTATE(PLUS(x[12],x[ 8]),18)); | ||
72 | x[ 9] = XOR(x[ 9],ROTATE(PLUS(x[ 5],x[ 1]), 7)); | ||
73 | x[13] = XOR(x[13],ROTATE(PLUS(x[ 9],x[ 5]), 9)); | ||
74 | x[ 1] = XOR(x[ 1],ROTATE(PLUS(x[13],x[ 9]),13)); | ||
75 | x[ 5] = XOR(x[ 5],ROTATE(PLUS(x[ 1],x[13]),18)); | ||
76 | x[14] = XOR(x[14],ROTATE(PLUS(x[10],x[ 6]), 7)); | ||
77 | x[ 2] = XOR(x[ 2],ROTATE(PLUS(x[14],x[10]), 9)); | ||
78 | x[ 6] = XOR(x[ 6],ROTATE(PLUS(x[ 2],x[14]),13)); | ||
79 | x[10] = XOR(x[10],ROTATE(PLUS(x[ 6],x[ 2]),18)); | ||
80 | x[ 3] = XOR(x[ 3],ROTATE(PLUS(x[15],x[11]), 7)); | ||
81 | x[ 7] = XOR(x[ 7],ROTATE(PLUS(x[ 3],x[15]), 9)); | ||
82 | x[11] = XOR(x[11],ROTATE(PLUS(x[ 7],x[ 3]),13)); | ||
83 | x[15] = XOR(x[15],ROTATE(PLUS(x[11],x[ 7]),18)); | ||
84 | x[ 1] = XOR(x[ 1],ROTATE(PLUS(x[ 0],x[ 3]), 7)); | ||
85 | x[ 2] = XOR(x[ 2],ROTATE(PLUS(x[ 1],x[ 0]), 9)); | ||
86 | x[ 3] = XOR(x[ 3],ROTATE(PLUS(x[ 2],x[ 1]),13)); | ||
87 | x[ 0] = XOR(x[ 0],ROTATE(PLUS(x[ 3],x[ 2]),18)); | ||
88 | x[ 6] = XOR(x[ 6],ROTATE(PLUS(x[ 5],x[ 4]), 7)); | ||
89 | x[ 7] = XOR(x[ 7],ROTATE(PLUS(x[ 6],x[ 5]), 9)); | ||
90 | x[ 4] = XOR(x[ 4],ROTATE(PLUS(x[ 7],x[ 6]),13)); | ||
91 | x[ 5] = XOR(x[ 5],ROTATE(PLUS(x[ 4],x[ 7]),18)); | ||
92 | x[11] = XOR(x[11],ROTATE(PLUS(x[10],x[ 9]), 7)); | ||
93 | x[ 8] = XOR(x[ 8],ROTATE(PLUS(x[11],x[10]), 9)); | ||
94 | x[ 9] = XOR(x[ 9],ROTATE(PLUS(x[ 8],x[11]),13)); | ||
95 | x[10] = XOR(x[10],ROTATE(PLUS(x[ 9],x[ 8]),18)); | ||
96 | x[12] = XOR(x[12],ROTATE(PLUS(x[15],x[14]), 7)); | ||
97 | x[13] = XOR(x[13],ROTATE(PLUS(x[12],x[15]), 9)); | ||
98 | x[14] = XOR(x[14],ROTATE(PLUS(x[13],x[12]),13)); | ||
99 | x[15] = XOR(x[15],ROTATE(PLUS(x[14],x[13]),18)); | ||
100 | } | ||
101 | for (i = 0; i < 16; ++i) | ||
102 | x[i] = PLUS(x[i],input[i]); | ||
103 | for (i = 0; i < 16; ++i) | ||
104 | U32TO8_LITTLE(output + 4 * i,x[i]); | ||
105 | } | ||
106 | |||
107 | static const char sigma[16] = "expand 32-byte k"; | ||
108 | static const char tau[16] = "expand 16-byte k"; | ||
109 | |||
110 | static void salsa20_keysetup(struct salsa20_ctx *ctx, const u8 *k, u32 kbytes) | ||
111 | { | ||
112 | const char *constants; | ||
113 | |||
114 | ctx->input[1] = U8TO32_LITTLE(k + 0); | ||
115 | ctx->input[2] = U8TO32_LITTLE(k + 4); | ||
116 | ctx->input[3] = U8TO32_LITTLE(k + 8); | ||
117 | ctx->input[4] = U8TO32_LITTLE(k + 12); | ||
118 | if (kbytes == 32) { /* recommended */ | ||
119 | k += 16; | ||
120 | constants = sigma; | ||
121 | } else { /* kbytes == 16 */ | ||
122 | constants = tau; | ||
123 | } | ||
124 | ctx->input[11] = U8TO32_LITTLE(k + 0); | ||
125 | ctx->input[12] = U8TO32_LITTLE(k + 4); | ||
126 | ctx->input[13] = U8TO32_LITTLE(k + 8); | ||
127 | ctx->input[14] = U8TO32_LITTLE(k + 12); | ||
128 | ctx->input[0] = U8TO32_LITTLE(constants + 0); | ||
129 | ctx->input[5] = U8TO32_LITTLE(constants + 4); | ||
130 | ctx->input[10] = U8TO32_LITTLE(constants + 8); | ||
131 | ctx->input[15] = U8TO32_LITTLE(constants + 12); | ||
132 | } | ||
133 | |||
134 | static void salsa20_ivsetup(struct salsa20_ctx *ctx, const u8 *iv) | ||
135 | { | ||
136 | ctx->input[6] = U8TO32_LITTLE(iv + 0); | ||
137 | ctx->input[7] = U8TO32_LITTLE(iv + 4); | ||
138 | ctx->input[8] = 0; | ||
139 | ctx->input[9] = 0; | ||
140 | } | ||
141 | |||
142 | static void salsa20_encrypt_bytes(struct salsa20_ctx *ctx, u8 *dst, | ||
143 | const u8 *src, unsigned int bytes) | ||
144 | { | ||
145 | u8 buf[64]; | ||
146 | |||
147 | if (dst != src) | ||
148 | memcpy(dst, src, bytes); | ||
149 | |||
150 | while (bytes) { | ||
151 | salsa20_wordtobyte(buf, ctx->input); | ||
152 | |||
153 | ctx->input[8] = PLUSONE(ctx->input[8]); | ||
154 | if (!ctx->input[8]) | ||
155 | ctx->input[9] = PLUSONE(ctx->input[9]); | ||
156 | |||
157 | if (bytes <= 64) { | ||
158 | crypto_xor(dst, buf, bytes); | ||
159 | return; | ||
160 | } | ||
161 | |||
162 | crypto_xor(dst, buf, 64); | ||
163 | bytes -= 64; | ||
164 | dst += 64; | ||
165 | } | ||
166 | } | ||
167 | |||
168 | /* | ||
169 | * End of code taken from D. J. Bernstein's reference implementation. | ||
170 | */ | ||
171 | |||
172 | static int setkey(struct crypto_tfm *tfm, const u8 *key, | ||
173 | unsigned int keysize) | ||
174 | { | ||
175 | struct salsa20_ctx *ctx = crypto_tfm_ctx(tfm); | ||
176 | salsa20_keysetup(ctx, key, keysize); | ||
177 | return 0; | ||
178 | } | ||
179 | |||
180 | static int encrypt(struct blkcipher_desc *desc, | ||
181 | struct scatterlist *dst, struct scatterlist *src, | ||
182 | unsigned int nbytes) | ||
183 | { | ||
184 | struct blkcipher_walk walk; | ||
185 | struct crypto_blkcipher *tfm = desc->tfm; | ||
186 | struct salsa20_ctx *ctx = crypto_blkcipher_ctx(tfm); | ||
187 | int err; | ||
188 | |||
189 | blkcipher_walk_init(&walk, dst, src, nbytes); | ||
190 | err = blkcipher_walk_virt_block(desc, &walk, 64); | ||
191 | |||
192 | salsa20_ivsetup(ctx, walk.iv); | ||
193 | |||
194 | if (likely(walk.nbytes == nbytes)) | ||
195 | { | ||
196 | salsa20_encrypt_bytes(ctx, walk.dst.virt.addr, | ||
197 | walk.src.virt.addr, nbytes); | ||
198 | return blkcipher_walk_done(desc, &walk, 0); | ||
199 | } | ||
200 | |||
201 | while (walk.nbytes >= 64) { | ||
202 | salsa20_encrypt_bytes(ctx, walk.dst.virt.addr, | ||
203 | walk.src.virt.addr, | ||
204 | walk.nbytes - (walk.nbytes % 64)); | ||
205 | err = blkcipher_walk_done(desc, &walk, walk.nbytes % 64); | ||
206 | } | ||
207 | |||
208 | if (walk.nbytes) { | ||
209 | salsa20_encrypt_bytes(ctx, walk.dst.virt.addr, | ||
210 | walk.src.virt.addr, walk.nbytes); | ||
211 | err = blkcipher_walk_done(desc, &walk, 0); | ||
212 | } | ||
213 | |||
214 | return err; | ||
215 | } | ||
216 | |||
217 | static struct crypto_alg alg = { | ||
218 | .cra_name = "salsa20", | ||
219 | .cra_driver_name = "salsa20-generic", | ||
220 | .cra_priority = 100, | ||
221 | .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER, | ||
222 | .cra_type = &crypto_blkcipher_type, | ||
223 | .cra_blocksize = 1, | ||
224 | .cra_ctxsize = sizeof(struct salsa20_ctx), | ||
225 | .cra_alignmask = 3, | ||
226 | .cra_module = THIS_MODULE, | ||
227 | .cra_list = LIST_HEAD_INIT(alg.cra_list), | ||
228 | .cra_u = { | ||
229 | .blkcipher = { | ||
230 | .setkey = setkey, | ||
231 | .encrypt = encrypt, | ||
232 | .decrypt = encrypt, | ||
233 | .min_keysize = SALSA20_MIN_KEY_SIZE, | ||
234 | .max_keysize = SALSA20_MAX_KEY_SIZE, | ||
235 | .ivsize = SALSA20_IV_SIZE, | ||
236 | } | ||
237 | } | ||
238 | }; | ||
239 | |||
240 | static int __init init(void) | ||
241 | { | ||
242 | return crypto_register_alg(&alg); | ||
243 | } | ||
244 | |||
245 | static void __exit fini(void) | ||
246 | { | ||
247 | crypto_unregister_alg(&alg); | ||
248 | } | ||
249 | |||
250 | module_init(init); | ||
251 | module_exit(fini); | ||
252 | |||
253 | MODULE_LICENSE("GPL"); | ||
254 | MODULE_DESCRIPTION ("Salsa20 stream cipher algorithm"); | ||
255 | MODULE_ALIAS("salsa20"); | ||
diff --git a/crypto/scatterwalk.c b/crypto/scatterwalk.c index b9bbda0bb9f9..9aeeb52004a5 100644 --- a/crypto/scatterwalk.c +++ b/crypto/scatterwalk.c | |||
@@ -13,6 +13,8 @@ | |||
13 | * any later version. | 13 | * any later version. |
14 | * | 14 | * |
15 | */ | 15 | */ |
16 | |||
17 | #include <crypto/scatterwalk.h> | ||
16 | #include <linux/kernel.h> | 18 | #include <linux/kernel.h> |
17 | #include <linux/mm.h> | 19 | #include <linux/mm.h> |
18 | #include <linux/module.h> | 20 | #include <linux/module.h> |
@@ -20,9 +22,6 @@ | |||
20 | #include <linux/highmem.h> | 22 | #include <linux/highmem.h> |
21 | #include <linux/scatterlist.h> | 23 | #include <linux/scatterlist.h> |
22 | 24 | ||
23 | #include "internal.h" | ||
24 | #include "scatterwalk.h" | ||
25 | |||
26 | static inline void memcpy_dir(void *buf, void *sgdata, size_t nbytes, int out) | 25 | static inline void memcpy_dir(void *buf, void *sgdata, size_t nbytes, int out) |
27 | { | 26 | { |
28 | void *src = out ? buf : sgdata; | 27 | void *src = out ? buf : sgdata; |
@@ -106,6 +105,9 @@ void scatterwalk_map_and_copy(void *buf, struct scatterlist *sg, | |||
106 | struct scatter_walk walk; | 105 | struct scatter_walk walk; |
107 | unsigned int offset = 0; | 106 | unsigned int offset = 0; |
108 | 107 | ||
108 | if (!nbytes) | ||
109 | return; | ||
110 | |||
109 | for (;;) { | 111 | for (;;) { |
110 | scatterwalk_start(&walk, sg); | 112 | scatterwalk_start(&walk, sg); |
111 | 113 | ||
@@ -113,7 +115,7 @@ void scatterwalk_map_and_copy(void *buf, struct scatterlist *sg, | |||
113 | break; | 115 | break; |
114 | 116 | ||
115 | offset += sg->length; | 117 | offset += sg->length; |
116 | sg = sg_next(sg); | 118 | sg = scatterwalk_sg_next(sg); |
117 | } | 119 | } |
118 | 120 | ||
119 | scatterwalk_advance(&walk, start - offset); | 121 | scatterwalk_advance(&walk, start - offset); |
diff --git a/crypto/seqiv.c b/crypto/seqiv.c new file mode 100644 index 000000000000..b903aab31577 --- /dev/null +++ b/crypto/seqiv.c | |||
@@ -0,0 +1,345 @@ | |||
1 | /* | ||
2 | * seqiv: Sequence Number IV Generator | ||
3 | * | ||
4 | * This generator generates an IV based on a sequence number by xoring it | ||
5 | * with a salt. This algorithm is mainly useful for CTR and similar modes. | ||
6 | * | ||
7 | * Copyright (c) 2007 Herbert Xu <herbert@gondor.apana.org.au> | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify it | ||
10 | * under the terms of the GNU General Public License as published by the Free | ||
11 | * Software Foundation; either version 2 of the License, or (at your option) | ||
12 | * any later version. | ||
13 | * | ||
14 | */ | ||
15 | |||
16 | #include <crypto/internal/aead.h> | ||
17 | #include <crypto/internal/skcipher.h> | ||
18 | #include <linux/err.h> | ||
19 | #include <linux/init.h> | ||
20 | #include <linux/kernel.h> | ||
21 | #include <linux/module.h> | ||
22 | #include <linux/random.h> | ||
23 | #include <linux/spinlock.h> | ||
24 | #include <linux/string.h> | ||
25 | |||
26 | struct seqiv_ctx { | ||
27 | spinlock_t lock; | ||
28 | u8 salt[] __attribute__ ((aligned(__alignof__(u32)))); | ||
29 | }; | ||
30 | |||
31 | static void seqiv_complete2(struct skcipher_givcrypt_request *req, int err) | ||
32 | { | ||
33 | struct ablkcipher_request *subreq = skcipher_givcrypt_reqctx(req); | ||
34 | struct crypto_ablkcipher *geniv; | ||
35 | |||
36 | if (err == -EINPROGRESS) | ||
37 | return; | ||
38 | |||
39 | if (err) | ||
40 | goto out; | ||
41 | |||
42 | geniv = skcipher_givcrypt_reqtfm(req); | ||
43 | memcpy(req->creq.info, subreq->info, crypto_ablkcipher_ivsize(geniv)); | ||
44 | |||
45 | out: | ||
46 | kfree(subreq->info); | ||
47 | } | ||
48 | |||
49 | static void seqiv_complete(struct crypto_async_request *base, int err) | ||
50 | { | ||
51 | struct skcipher_givcrypt_request *req = base->data; | ||
52 | |||
53 | seqiv_complete2(req, err); | ||
54 | skcipher_givcrypt_complete(req, err); | ||
55 | } | ||
56 | |||
57 | static void seqiv_aead_complete2(struct aead_givcrypt_request *req, int err) | ||
58 | { | ||
59 | struct aead_request *subreq = aead_givcrypt_reqctx(req); | ||
60 | struct crypto_aead *geniv; | ||
61 | |||
62 | if (err == -EINPROGRESS) | ||
63 | return; | ||
64 | |||
65 | if (err) | ||
66 | goto out; | ||
67 | |||
68 | geniv = aead_givcrypt_reqtfm(req); | ||
69 | memcpy(req->areq.iv, subreq->iv, crypto_aead_ivsize(geniv)); | ||
70 | |||
71 | out: | ||
72 | kfree(subreq->iv); | ||
73 | } | ||
74 | |||
75 | static void seqiv_aead_complete(struct crypto_async_request *base, int err) | ||
76 | { | ||
77 | struct aead_givcrypt_request *req = base->data; | ||
78 | |||
79 | seqiv_aead_complete2(req, err); | ||
80 | aead_givcrypt_complete(req, err); | ||
81 | } | ||
82 | |||
83 | static void seqiv_geniv(struct seqiv_ctx *ctx, u8 *info, u64 seq, | ||
84 | unsigned int ivsize) | ||
85 | { | ||
86 | unsigned int len = ivsize; | ||
87 | |||
88 | if (ivsize > sizeof(u64)) { | ||
89 | memset(info, 0, ivsize - sizeof(u64)); | ||
90 | len = sizeof(u64); | ||
91 | } | ||
92 | seq = cpu_to_be64(seq); | ||
93 | memcpy(info + ivsize - len, &seq, len); | ||
94 | crypto_xor(info, ctx->salt, ivsize); | ||
95 | } | ||
96 | |||
97 | static int seqiv_givencrypt(struct skcipher_givcrypt_request *req) | ||
98 | { | ||
99 | struct crypto_ablkcipher *geniv = skcipher_givcrypt_reqtfm(req); | ||
100 | struct seqiv_ctx *ctx = crypto_ablkcipher_ctx(geniv); | ||
101 | struct ablkcipher_request *subreq = skcipher_givcrypt_reqctx(req); | ||
102 | crypto_completion_t complete; | ||
103 | void *data; | ||
104 | u8 *info; | ||
105 | unsigned int ivsize; | ||
106 | int err; | ||
107 | |||
108 | ablkcipher_request_set_tfm(subreq, skcipher_geniv_cipher(geniv)); | ||
109 | |||
110 | complete = req->creq.base.complete; | ||
111 | data = req->creq.base.data; | ||
112 | info = req->creq.info; | ||
113 | |||
114 | ivsize = crypto_ablkcipher_ivsize(geniv); | ||
115 | |||
116 | if (unlikely(!IS_ALIGNED((unsigned long)info, | ||
117 | crypto_ablkcipher_alignmask(geniv) + 1))) { | ||
118 | info = kmalloc(ivsize, req->creq.base.flags & | ||
119 | CRYPTO_TFM_REQ_MAY_SLEEP ? GFP_KERNEL: | ||
120 | GFP_ATOMIC); | ||
121 | if (!info) | ||
122 | return -ENOMEM; | ||
123 | |||
124 | complete = seqiv_complete; | ||
125 | data = req; | ||
126 | } | ||
127 | |||
128 | ablkcipher_request_set_callback(subreq, req->creq.base.flags, complete, | ||
129 | data); | ||
130 | ablkcipher_request_set_crypt(subreq, req->creq.src, req->creq.dst, | ||
131 | req->creq.nbytes, info); | ||
132 | |||
133 | seqiv_geniv(ctx, info, req->seq, ivsize); | ||
134 | memcpy(req->giv, info, ivsize); | ||
135 | |||
136 | err = crypto_ablkcipher_encrypt(subreq); | ||
137 | if (unlikely(info != req->creq.info)) | ||
138 | seqiv_complete2(req, err); | ||
139 | return err; | ||
140 | } | ||
141 | |||
142 | static int seqiv_aead_givencrypt(struct aead_givcrypt_request *req) | ||
143 | { | ||
144 | struct crypto_aead *geniv = aead_givcrypt_reqtfm(req); | ||
145 | struct seqiv_ctx *ctx = crypto_aead_ctx(geniv); | ||
146 | struct aead_request *areq = &req->areq; | ||
147 | struct aead_request *subreq = aead_givcrypt_reqctx(req); | ||
148 | crypto_completion_t complete; | ||
149 | void *data; | ||
150 | u8 *info; | ||
151 | unsigned int ivsize; | ||
152 | int err; | ||
153 | |||
154 | aead_request_set_tfm(subreq, aead_geniv_base(geniv)); | ||
155 | |||
156 | complete = areq->base.complete; | ||
157 | data = areq->base.data; | ||
158 | info = areq->iv; | ||
159 | |||
160 | ivsize = crypto_aead_ivsize(geniv); | ||
161 | |||
162 | if (unlikely(!IS_ALIGNED((unsigned long)info, | ||
163 | crypto_aead_alignmask(geniv) + 1))) { | ||
164 | info = kmalloc(ivsize, areq->base.flags & | ||
165 | CRYPTO_TFM_REQ_MAY_SLEEP ? GFP_KERNEL: | ||
166 | GFP_ATOMIC); | ||
167 | if (!info) | ||
168 | return -ENOMEM; | ||
169 | |||
170 | complete = seqiv_aead_complete; | ||
171 | data = req; | ||
172 | } | ||
173 | |||
174 | aead_request_set_callback(subreq, areq->base.flags, complete, data); | ||
175 | aead_request_set_crypt(subreq, areq->src, areq->dst, areq->cryptlen, | ||
176 | info); | ||
177 | aead_request_set_assoc(subreq, areq->assoc, areq->assoclen); | ||
178 | |||
179 | seqiv_geniv(ctx, info, req->seq, ivsize); | ||
180 | memcpy(req->giv, info, ivsize); | ||
181 | |||
182 | err = crypto_aead_encrypt(subreq); | ||
183 | if (unlikely(info != areq->iv)) | ||
184 | seqiv_aead_complete2(req, err); | ||
185 | return err; | ||
186 | } | ||
187 | |||
188 | static int seqiv_givencrypt_first(struct skcipher_givcrypt_request *req) | ||
189 | { | ||
190 | struct crypto_ablkcipher *geniv = skcipher_givcrypt_reqtfm(req); | ||
191 | struct seqiv_ctx *ctx = crypto_ablkcipher_ctx(geniv); | ||
192 | |||
193 | spin_lock_bh(&ctx->lock); | ||
194 | if (crypto_ablkcipher_crt(geniv)->givencrypt != seqiv_givencrypt_first) | ||
195 | goto unlock; | ||
196 | |||
197 | crypto_ablkcipher_crt(geniv)->givencrypt = seqiv_givencrypt; | ||
198 | get_random_bytes(ctx->salt, crypto_ablkcipher_ivsize(geniv)); | ||
199 | |||
200 | unlock: | ||
201 | spin_unlock_bh(&ctx->lock); | ||
202 | |||
203 | return seqiv_givencrypt(req); | ||
204 | } | ||
205 | |||
206 | static int seqiv_aead_givencrypt_first(struct aead_givcrypt_request *req) | ||
207 | { | ||
208 | struct crypto_aead *geniv = aead_givcrypt_reqtfm(req); | ||
209 | struct seqiv_ctx *ctx = crypto_aead_ctx(geniv); | ||
210 | |||
211 | spin_lock_bh(&ctx->lock); | ||
212 | if (crypto_aead_crt(geniv)->givencrypt != seqiv_aead_givencrypt_first) | ||
213 | goto unlock; | ||
214 | |||
215 | crypto_aead_crt(geniv)->givencrypt = seqiv_aead_givencrypt; | ||
216 | get_random_bytes(ctx->salt, crypto_aead_ivsize(geniv)); | ||
217 | |||
218 | unlock: | ||
219 | spin_unlock_bh(&ctx->lock); | ||
220 | |||
221 | return seqiv_aead_givencrypt(req); | ||
222 | } | ||
223 | |||
224 | static int seqiv_init(struct crypto_tfm *tfm) | ||
225 | { | ||
226 | struct crypto_ablkcipher *geniv = __crypto_ablkcipher_cast(tfm); | ||
227 | struct seqiv_ctx *ctx = crypto_ablkcipher_ctx(geniv); | ||
228 | |||
229 | spin_lock_init(&ctx->lock); | ||
230 | |||
231 | tfm->crt_ablkcipher.reqsize = sizeof(struct ablkcipher_request); | ||
232 | |||
233 | return skcipher_geniv_init(tfm); | ||
234 | } | ||
235 | |||
236 | static int seqiv_aead_init(struct crypto_tfm *tfm) | ||
237 | { | ||
238 | struct crypto_aead *geniv = __crypto_aead_cast(tfm); | ||
239 | struct seqiv_ctx *ctx = crypto_aead_ctx(geniv); | ||
240 | |||
241 | spin_lock_init(&ctx->lock); | ||
242 | |||
243 | tfm->crt_aead.reqsize = sizeof(struct aead_request); | ||
244 | |||
245 | return aead_geniv_init(tfm); | ||
246 | } | ||
247 | |||
248 | static struct crypto_template seqiv_tmpl; | ||
249 | |||
250 | static struct crypto_instance *seqiv_ablkcipher_alloc(struct rtattr **tb) | ||
251 | { | ||
252 | struct crypto_instance *inst; | ||
253 | |||
254 | inst = skcipher_geniv_alloc(&seqiv_tmpl, tb, 0, 0); | ||
255 | |||
256 | if (IS_ERR(inst)) | ||
257 | goto out; | ||
258 | |||
259 | inst->alg.cra_ablkcipher.givencrypt = seqiv_givencrypt_first; | ||
260 | |||
261 | inst->alg.cra_init = seqiv_init; | ||
262 | inst->alg.cra_exit = skcipher_geniv_exit; | ||
263 | |||
264 | inst->alg.cra_ctxsize += inst->alg.cra_ablkcipher.ivsize; | ||
265 | |||
266 | out: | ||
267 | return inst; | ||
268 | } | ||
269 | |||
270 | static struct crypto_instance *seqiv_aead_alloc(struct rtattr **tb) | ||
271 | { | ||
272 | struct crypto_instance *inst; | ||
273 | |||
274 | inst = aead_geniv_alloc(&seqiv_tmpl, tb, 0, 0); | ||
275 | |||
276 | if (IS_ERR(inst)) | ||
277 | goto out; | ||
278 | |||
279 | inst->alg.cra_aead.givencrypt = seqiv_aead_givencrypt_first; | ||
280 | |||
281 | inst->alg.cra_init = seqiv_aead_init; | ||
282 | inst->alg.cra_exit = aead_geniv_exit; | ||
283 | |||
284 | inst->alg.cra_ctxsize = inst->alg.cra_aead.ivsize; | ||
285 | |||
286 | out: | ||
287 | return inst; | ||
288 | } | ||
289 | |||
290 | static struct crypto_instance *seqiv_alloc(struct rtattr **tb) | ||
291 | { | ||
292 | struct crypto_attr_type *algt; | ||
293 | struct crypto_instance *inst; | ||
294 | int err; | ||
295 | |||
296 | algt = crypto_get_attr_type(tb); | ||
297 | err = PTR_ERR(algt); | ||
298 | if (IS_ERR(algt)) | ||
299 | return ERR_PTR(err); | ||
300 | |||
301 | if ((algt->type ^ CRYPTO_ALG_TYPE_AEAD) & CRYPTO_ALG_TYPE_MASK) | ||
302 | inst = seqiv_ablkcipher_alloc(tb); | ||
303 | else | ||
304 | inst = seqiv_aead_alloc(tb); | ||
305 | |||
306 | if (IS_ERR(inst)) | ||
307 | goto out; | ||
308 | |||
309 | inst->alg.cra_alignmask |= __alignof__(u32) - 1; | ||
310 | inst->alg.cra_ctxsize += sizeof(struct seqiv_ctx); | ||
311 | |||
312 | out: | ||
313 | return inst; | ||
314 | } | ||
315 | |||
316 | static void seqiv_free(struct crypto_instance *inst) | ||
317 | { | ||
318 | if ((inst->alg.cra_flags ^ CRYPTO_ALG_TYPE_AEAD) & CRYPTO_ALG_TYPE_MASK) | ||
319 | skcipher_geniv_free(inst); | ||
320 | else | ||
321 | aead_geniv_free(inst); | ||
322 | } | ||
323 | |||
324 | static struct crypto_template seqiv_tmpl = { | ||
325 | .name = "seqiv", | ||
326 | .alloc = seqiv_alloc, | ||
327 | .free = seqiv_free, | ||
328 | .module = THIS_MODULE, | ||
329 | }; | ||
330 | |||
331 | static int __init seqiv_module_init(void) | ||
332 | { | ||
333 | return crypto_register_template(&seqiv_tmpl); | ||
334 | } | ||
335 | |||
336 | static void __exit seqiv_module_exit(void) | ||
337 | { | ||
338 | crypto_unregister_template(&seqiv_tmpl); | ||
339 | } | ||
340 | |||
341 | module_init(seqiv_module_init); | ||
342 | module_exit(seqiv_module_exit); | ||
343 | |||
344 | MODULE_LICENSE("GPL"); | ||
345 | MODULE_DESCRIPTION("Sequence Number IV Generator"); | ||
diff --git a/crypto/sha256_generic.c b/crypto/sha256_generic.c index fd3918be58b5..3cc93fd61043 100644 --- a/crypto/sha256_generic.c +++ b/crypto/sha256_generic.c | |||
@@ -9,6 +9,7 @@ | |||
9 | * Copyright (c) Jean-Luc Cooke <jlcooke@certainkey.com> | 9 | * Copyright (c) Jean-Luc Cooke <jlcooke@certainkey.com> |
10 | * Copyright (c) Andrew McDonald <andrew@mcdonald.org.uk> | 10 | * Copyright (c) Andrew McDonald <andrew@mcdonald.org.uk> |
11 | * Copyright (c) 2002 James Morris <jmorris@intercode.com.au> | 11 | * Copyright (c) 2002 James Morris <jmorris@intercode.com.au> |
12 | * SHA224 Support Copyright 2007 Intel Corporation <jonathan.lynch@intel.com> | ||
12 | * | 13 | * |
13 | * This program is free software; you can redistribute it and/or modify it | 14 | * This program is free software; you can redistribute it and/or modify it |
14 | * under the terms of the GNU General Public License as published by the Free | 15 | * under the terms of the GNU General Public License as published by the Free |
@@ -218,6 +219,22 @@ static void sha256_transform(u32 *state, const u8 *input) | |||
218 | memset(W, 0, 64 * sizeof(u32)); | 219 | memset(W, 0, 64 * sizeof(u32)); |
219 | } | 220 | } |
220 | 221 | ||
222 | |||
223 | static void sha224_init(struct crypto_tfm *tfm) | ||
224 | { | ||
225 | struct sha256_ctx *sctx = crypto_tfm_ctx(tfm); | ||
226 | sctx->state[0] = SHA224_H0; | ||
227 | sctx->state[1] = SHA224_H1; | ||
228 | sctx->state[2] = SHA224_H2; | ||
229 | sctx->state[3] = SHA224_H3; | ||
230 | sctx->state[4] = SHA224_H4; | ||
231 | sctx->state[5] = SHA224_H5; | ||
232 | sctx->state[6] = SHA224_H6; | ||
233 | sctx->state[7] = SHA224_H7; | ||
234 | sctx->count[0] = 0; | ||
235 | sctx->count[1] = 0; | ||
236 | } | ||
237 | |||
221 | static void sha256_init(struct crypto_tfm *tfm) | 238 | static void sha256_init(struct crypto_tfm *tfm) |
222 | { | 239 | { |
223 | struct sha256_ctx *sctx = crypto_tfm_ctx(tfm); | 240 | struct sha256_ctx *sctx = crypto_tfm_ctx(tfm); |
@@ -294,8 +311,17 @@ static void sha256_final(struct crypto_tfm *tfm, u8 *out) | |||
294 | memset(sctx, 0, sizeof(*sctx)); | 311 | memset(sctx, 0, sizeof(*sctx)); |
295 | } | 312 | } |
296 | 313 | ||
314 | static void sha224_final(struct crypto_tfm *tfm, u8 *hash) | ||
315 | { | ||
316 | u8 D[SHA256_DIGEST_SIZE]; | ||
317 | |||
318 | sha256_final(tfm, D); | ||
319 | |||
320 | memcpy(hash, D, SHA224_DIGEST_SIZE); | ||
321 | memset(D, 0, SHA256_DIGEST_SIZE); | ||
322 | } | ||
297 | 323 | ||
298 | static struct crypto_alg alg = { | 324 | static struct crypto_alg sha256 = { |
299 | .cra_name = "sha256", | 325 | .cra_name = "sha256", |
300 | .cra_driver_name= "sha256-generic", | 326 | .cra_driver_name= "sha256-generic", |
301 | .cra_flags = CRYPTO_ALG_TYPE_DIGEST, | 327 | .cra_flags = CRYPTO_ALG_TYPE_DIGEST, |
@@ -303,28 +329,58 @@ static struct crypto_alg alg = { | |||
303 | .cra_ctxsize = sizeof(struct sha256_ctx), | 329 | .cra_ctxsize = sizeof(struct sha256_ctx), |
304 | .cra_module = THIS_MODULE, | 330 | .cra_module = THIS_MODULE, |
305 | .cra_alignmask = 3, | 331 | .cra_alignmask = 3, |
306 | .cra_list = LIST_HEAD_INIT(alg.cra_list), | 332 | .cra_list = LIST_HEAD_INIT(sha256.cra_list), |
307 | .cra_u = { .digest = { | 333 | .cra_u = { .digest = { |
308 | .dia_digestsize = SHA256_DIGEST_SIZE, | 334 | .dia_digestsize = SHA256_DIGEST_SIZE, |
309 | .dia_init = sha256_init, | 335 | .dia_init = sha256_init, |
310 | .dia_update = sha256_update, | 336 | .dia_update = sha256_update, |
311 | .dia_final = sha256_final } } | 337 | .dia_final = sha256_final } } |
338 | }; | ||
339 | |||
340 | static struct crypto_alg sha224 = { | ||
341 | .cra_name = "sha224", | ||
342 | .cra_driver_name = "sha224-generic", | ||
343 | .cra_flags = CRYPTO_ALG_TYPE_DIGEST, | ||
344 | .cra_blocksize = SHA224_BLOCK_SIZE, | ||
345 | .cra_ctxsize = sizeof(struct sha256_ctx), | ||
346 | .cra_module = THIS_MODULE, | ||
347 | .cra_alignmask = 3, | ||
348 | .cra_list = LIST_HEAD_INIT(sha224.cra_list), | ||
349 | .cra_u = { .digest = { | ||
350 | .dia_digestsize = SHA224_DIGEST_SIZE, | ||
351 | .dia_init = sha224_init, | ||
352 | .dia_update = sha256_update, | ||
353 | .dia_final = sha224_final } } | ||
312 | }; | 354 | }; |
313 | 355 | ||
314 | static int __init init(void) | 356 | static int __init init(void) |
315 | { | 357 | { |
316 | return crypto_register_alg(&alg); | 358 | int ret = 0; |
359 | |||
360 | ret = crypto_register_alg(&sha224); | ||
361 | |||
362 | if (ret < 0) | ||
363 | return ret; | ||
364 | |||
365 | ret = crypto_register_alg(&sha256); | ||
366 | |||
367 | if (ret < 0) | ||
368 | crypto_unregister_alg(&sha224); | ||
369 | |||
370 | return ret; | ||
317 | } | 371 | } |
318 | 372 | ||
319 | static void __exit fini(void) | 373 | static void __exit fini(void) |
320 | { | 374 | { |
321 | crypto_unregister_alg(&alg); | 375 | crypto_unregister_alg(&sha224); |
376 | crypto_unregister_alg(&sha256); | ||
322 | } | 377 | } |
323 | 378 | ||
324 | module_init(init); | 379 | module_init(init); |
325 | module_exit(fini); | 380 | module_exit(fini); |
326 | 381 | ||
327 | MODULE_LICENSE("GPL"); | 382 | MODULE_LICENSE("GPL"); |
328 | MODULE_DESCRIPTION("SHA256 Secure Hash Algorithm"); | 383 | MODULE_DESCRIPTION("SHA-224 and SHA-256 Secure Hash Algorithm"); |
329 | 384 | ||
385 | MODULE_ALIAS("sha224"); | ||
330 | MODULE_ALIAS("sha256"); | 386 | MODULE_ALIAS("sha256"); |
diff --git a/crypto/tcrypt.c b/crypto/tcrypt.c index 24141fb6f5cb..1ab8c017a011 100644 --- a/crypto/tcrypt.c +++ b/crypto/tcrypt.c | |||
@@ -6,12 +6,16 @@ | |||
6 | * | 6 | * |
7 | * Copyright (c) 2002 James Morris <jmorris@intercode.com.au> | 7 | * Copyright (c) 2002 James Morris <jmorris@intercode.com.au> |
8 | * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org> | 8 | * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org> |
9 | * Copyright (c) 2007 Nokia Siemens Networks | ||
9 | * | 10 | * |
10 | * This program is free software; you can redistribute it and/or modify it | 11 | * This program is free software; you can redistribute it and/or modify it |
11 | * under the terms of the GNU General Public License as published by the Free | 12 | * under the terms of the GNU General Public License as published by the Free |
12 | * Software Foundation; either version 2 of the License, or (at your option) | 13 | * Software Foundation; either version 2 of the License, or (at your option) |
13 | * any later version. | 14 | * any later version. |
14 | * | 15 | * |
16 | * 2007-11-13 Added GCM tests | ||
17 | * 2007-11-13 Added AEAD support | ||
18 | * 2007-11-06 Added SHA-224 and SHA-224-HMAC tests | ||
15 | * 2006-12-07 Added SHA384 HMAC and SHA512 HMAC tests | 19 | * 2006-12-07 Added SHA384 HMAC and SHA512 HMAC tests |
16 | * 2004-08-09 Added cipher speed tests (Reyk Floeter <reyk@vantronix.net>) | 20 | * 2004-08-09 Added cipher speed tests (Reyk Floeter <reyk@vantronix.net>) |
17 | * 2003-09-14 Rewritten by Kartikey Mahendra Bhatt | 21 | * 2003-09-14 Rewritten by Kartikey Mahendra Bhatt |
@@ -71,22 +75,23 @@ static unsigned int sec; | |||
71 | 75 | ||
72 | static int mode; | 76 | static int mode; |
73 | static char *xbuf; | 77 | static char *xbuf; |
78 | static char *axbuf; | ||
74 | static char *tvmem; | 79 | static char *tvmem; |
75 | 80 | ||
76 | static char *check[] = { | 81 | static char *check[] = { |
77 | "des", "md5", "des3_ede", "rot13", "sha1", "sha256", "blowfish", | 82 | "des", "md5", "des3_ede", "rot13", "sha1", "sha224", "sha256", |
78 | "twofish", "serpent", "sha384", "sha512", "md4", "aes", "cast6", | 83 | "blowfish", "twofish", "serpent", "sha384", "sha512", "md4", "aes", |
84 | "cast6", "arc4", "michael_mic", "deflate", "crc32c", "tea", "xtea", | ||
79 | "arc4", "michael_mic", "deflate", "crc32c", "tea", "xtea", | 85 | "arc4", "michael_mic", "deflate", "crc32c", "tea", "xtea", |
80 | "khazad", "wp512", "wp384", "wp256", "tnepres", "xeta", "fcrypt", | 86 | "khazad", "wp512", "wp384", "wp256", "tnepres", "xeta", "fcrypt", |
81 | "camellia", "seed", NULL | 87 | "camellia", "seed", "salsa20", "lzo", NULL |
82 | }; | 88 | }; |
83 | 89 | ||
84 | static void hexdump(unsigned char *buf, unsigned int len) | 90 | static void hexdump(unsigned char *buf, unsigned int len) |
85 | { | 91 | { |
86 | while (len--) | 92 | print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET, |
87 | printk("%02x", *buf++); | 93 | 16, 1, |
88 | 94 | buf, len, false); | |
89 | printk("\n"); | ||
90 | } | 95 | } |
91 | 96 | ||
92 | static void tcrypt_complete(struct crypto_async_request *req, int err) | 97 | static void tcrypt_complete(struct crypto_async_request *req, int err) |
@@ -215,6 +220,238 @@ out: | |||
215 | crypto_free_hash(tfm); | 220 | crypto_free_hash(tfm); |
216 | } | 221 | } |
217 | 222 | ||
223 | static void test_aead(char *algo, int enc, struct aead_testvec *template, | ||
224 | unsigned int tcount) | ||
225 | { | ||
226 | unsigned int ret, i, j, k, temp; | ||
227 | unsigned int tsize; | ||
228 | char *q; | ||
229 | struct crypto_aead *tfm; | ||
230 | char *key; | ||
231 | struct aead_testvec *aead_tv; | ||
232 | struct aead_request *req; | ||
233 | struct scatterlist sg[8]; | ||
234 | struct scatterlist asg[8]; | ||
235 | const char *e; | ||
236 | struct tcrypt_result result; | ||
237 | unsigned int authsize; | ||
238 | |||
239 | if (enc == ENCRYPT) | ||
240 | e = "encryption"; | ||
241 | else | ||
242 | e = "decryption"; | ||
243 | |||
244 | printk(KERN_INFO "\ntesting %s %s\n", algo, e); | ||
245 | |||
246 | tsize = sizeof(struct aead_testvec); | ||
247 | tsize *= tcount; | ||
248 | |||
249 | if (tsize > TVMEMSIZE) { | ||
250 | printk(KERN_INFO "template (%u) too big for tvmem (%u)\n", | ||
251 | tsize, TVMEMSIZE); | ||
252 | return; | ||
253 | } | ||
254 | |||
255 | memcpy(tvmem, template, tsize); | ||
256 | aead_tv = (void *)tvmem; | ||
257 | |||
258 | init_completion(&result.completion); | ||
259 | |||
260 | tfm = crypto_alloc_aead(algo, 0, 0); | ||
261 | |||
262 | if (IS_ERR(tfm)) { | ||
263 | printk(KERN_INFO "failed to load transform for %s: %ld\n", | ||
264 | algo, PTR_ERR(tfm)); | ||
265 | return; | ||
266 | } | ||
267 | |||
268 | req = aead_request_alloc(tfm, GFP_KERNEL); | ||
269 | if (!req) { | ||
270 | printk(KERN_INFO "failed to allocate request for %s\n", algo); | ||
271 | goto out; | ||
272 | } | ||
273 | |||
274 | aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, | ||
275 | tcrypt_complete, &result); | ||
276 | |||
277 | for (i = 0, j = 0; i < tcount; i++) { | ||
278 | if (!aead_tv[i].np) { | ||
279 | printk(KERN_INFO "test %u (%d bit key):\n", | ||
280 | ++j, aead_tv[i].klen * 8); | ||
281 | |||
282 | crypto_aead_clear_flags(tfm, ~0); | ||
283 | if (aead_tv[i].wk) | ||
284 | crypto_aead_set_flags( | ||
285 | tfm, CRYPTO_TFM_REQ_WEAK_KEY); | ||
286 | key = aead_tv[i].key; | ||
287 | |||
288 | ret = crypto_aead_setkey(tfm, key, | ||
289 | aead_tv[i].klen); | ||
290 | if (ret) { | ||
291 | printk(KERN_INFO "setkey() failed flags=%x\n", | ||
292 | crypto_aead_get_flags(tfm)); | ||
293 | |||
294 | if (!aead_tv[i].fail) | ||
295 | goto out; | ||
296 | } | ||
297 | |||
298 | authsize = abs(aead_tv[i].rlen - aead_tv[i].ilen); | ||
299 | ret = crypto_aead_setauthsize(tfm, authsize); | ||
300 | if (ret) { | ||
301 | printk(KERN_INFO | ||
302 | "failed to set authsize = %u\n", | ||
303 | authsize); | ||
304 | goto out; | ||
305 | } | ||
306 | |||
307 | sg_init_one(&sg[0], aead_tv[i].input, | ||
308 | aead_tv[i].ilen + (enc ? authsize : 0)); | ||
309 | |||
310 | sg_init_one(&asg[0], aead_tv[i].assoc, | ||
311 | aead_tv[i].alen); | ||
312 | |||
313 | aead_request_set_crypt(req, sg, sg, | ||
314 | aead_tv[i].ilen, | ||
315 | aead_tv[i].iv); | ||
316 | |||
317 | aead_request_set_assoc(req, asg, aead_tv[i].alen); | ||
318 | |||
319 | ret = enc ? | ||
320 | crypto_aead_encrypt(req) : | ||
321 | crypto_aead_decrypt(req); | ||
322 | |||
323 | switch (ret) { | ||
324 | case 0: | ||
325 | break; | ||
326 | case -EINPROGRESS: | ||
327 | case -EBUSY: | ||
328 | ret = wait_for_completion_interruptible( | ||
329 | &result.completion); | ||
330 | if (!ret && !(ret = result.err)) { | ||
331 | INIT_COMPLETION(result.completion); | ||
332 | break; | ||
333 | } | ||
334 | /* fall through */ | ||
335 | default: | ||
336 | printk(KERN_INFO "%s () failed err=%d\n", | ||
337 | e, -ret); | ||
338 | goto out; | ||
339 | } | ||
340 | |||
341 | q = kmap(sg_page(&sg[0])) + sg[0].offset; | ||
342 | hexdump(q, aead_tv[i].rlen); | ||
343 | |||
344 | printk(KERN_INFO "enc/dec: %s\n", | ||
345 | memcmp(q, aead_tv[i].result, | ||
346 | aead_tv[i].rlen) ? "fail" : "pass"); | ||
347 | } | ||
348 | } | ||
349 | |||
350 | printk(KERN_INFO "\ntesting %s %s across pages (chunking)\n", algo, e); | ||
351 | memset(xbuf, 0, XBUFSIZE); | ||
352 | memset(axbuf, 0, XBUFSIZE); | ||
353 | |||
354 | for (i = 0, j = 0; i < tcount; i++) { | ||
355 | if (aead_tv[i].np) { | ||
356 | printk(KERN_INFO "test %u (%d bit key):\n", | ||
357 | ++j, aead_tv[i].klen * 8); | ||
358 | |||
359 | crypto_aead_clear_flags(tfm, ~0); | ||
360 | if (aead_tv[i].wk) | ||
361 | crypto_aead_set_flags( | ||
362 | tfm, CRYPTO_TFM_REQ_WEAK_KEY); | ||
363 | key = aead_tv[i].key; | ||
364 | |||
365 | ret = crypto_aead_setkey(tfm, key, aead_tv[i].klen); | ||
366 | if (ret) { | ||
367 | printk(KERN_INFO "setkey() failed flags=%x\n", | ||
368 | crypto_aead_get_flags(tfm)); | ||
369 | |||
370 | if (!aead_tv[i].fail) | ||
371 | goto out; | ||
372 | } | ||
373 | |||
374 | sg_init_table(sg, aead_tv[i].np); | ||
375 | for (k = 0, temp = 0; k < aead_tv[i].np; k++) { | ||
376 | memcpy(&xbuf[IDX[k]], | ||
377 | aead_tv[i].input + temp, | ||
378 | aead_tv[i].tap[k]); | ||
379 | temp += aead_tv[i].tap[k]; | ||
380 | sg_set_buf(&sg[k], &xbuf[IDX[k]], | ||
381 | aead_tv[i].tap[k]); | ||
382 | } | ||
383 | |||
384 | authsize = abs(aead_tv[i].rlen - aead_tv[i].ilen); | ||
385 | ret = crypto_aead_setauthsize(tfm, authsize); | ||
386 | if (ret) { | ||
387 | printk(KERN_INFO | ||
388 | "failed to set authsize = %u\n", | ||
389 | authsize); | ||
390 | goto out; | ||
391 | } | ||
392 | |||
393 | if (enc) | ||
394 | sg[k - 1].length += authsize; | ||
395 | |||
396 | sg_init_table(asg, aead_tv[i].anp); | ||
397 | for (k = 0, temp = 0; k < aead_tv[i].anp; k++) { | ||
398 | memcpy(&axbuf[IDX[k]], | ||
399 | aead_tv[i].assoc + temp, | ||
400 | aead_tv[i].atap[k]); | ||
401 | temp += aead_tv[i].atap[k]; | ||
402 | sg_set_buf(&asg[k], &axbuf[IDX[k]], | ||
403 | aead_tv[i].atap[k]); | ||
404 | } | ||
405 | |||
406 | aead_request_set_crypt(req, sg, sg, | ||
407 | aead_tv[i].ilen, | ||
408 | aead_tv[i].iv); | ||
409 | |||
410 | aead_request_set_assoc(req, asg, aead_tv[i].alen); | ||
411 | |||
412 | ret = enc ? | ||
413 | crypto_aead_encrypt(req) : | ||
414 | crypto_aead_decrypt(req); | ||
415 | |||
416 | switch (ret) { | ||
417 | case 0: | ||
418 | break; | ||
419 | case -EINPROGRESS: | ||
420 | case -EBUSY: | ||
421 | ret = wait_for_completion_interruptible( | ||
422 | &result.completion); | ||
423 | if (!ret && !(ret = result.err)) { | ||
424 | INIT_COMPLETION(result.completion); | ||
425 | break; | ||
426 | } | ||
427 | /* fall through */ | ||
428 | default: | ||
429 | printk(KERN_INFO "%s () failed err=%d\n", | ||
430 | e, -ret); | ||
431 | goto out; | ||
432 | } | ||
433 | |||
434 | for (k = 0, temp = 0; k < aead_tv[i].np; k++) { | ||
435 | printk(KERN_INFO "page %u\n", k); | ||
436 | q = kmap(sg_page(&sg[k])) + sg[k].offset; | ||
437 | hexdump(q, aead_tv[i].tap[k]); | ||
438 | printk(KERN_INFO "%s\n", | ||
439 | memcmp(q, aead_tv[i].result + temp, | ||
440 | aead_tv[i].tap[k] - | ||
441 | (k < aead_tv[i].np - 1 || enc ? | ||
442 | 0 : authsize)) ? | ||
443 | "fail" : "pass"); | ||
444 | |||
445 | temp += aead_tv[i].tap[k]; | ||
446 | } | ||
447 | } | ||
448 | } | ||
449 | |||
450 | out: | ||
451 | crypto_free_aead(tfm); | ||
452 | aead_request_free(req); | ||
453 | } | ||
454 | |||
218 | static void test_cipher(char *algo, int enc, | 455 | static void test_cipher(char *algo, int enc, |
219 | struct cipher_testvec *template, unsigned int tcount) | 456 | struct cipher_testvec *template, unsigned int tcount) |
220 | { | 457 | { |
@@ -237,15 +474,11 @@ static void test_cipher(char *algo, int enc, | |||
237 | printk("\ntesting %s %s\n", algo, e); | 474 | printk("\ntesting %s %s\n", algo, e); |
238 | 475 | ||
239 | tsize = sizeof (struct cipher_testvec); | 476 | tsize = sizeof (struct cipher_testvec); |
240 | tsize *= tcount; | ||
241 | |||
242 | if (tsize > TVMEMSIZE) { | 477 | if (tsize > TVMEMSIZE) { |
243 | printk("template (%u) too big for tvmem (%u)\n", tsize, | 478 | printk("template (%u) too big for tvmem (%u)\n", tsize, |
244 | TVMEMSIZE); | 479 | TVMEMSIZE); |
245 | return; | 480 | return; |
246 | } | 481 | } |
247 | |||
248 | memcpy(tvmem, template, tsize); | ||
249 | cipher_tv = (void *)tvmem; | 482 | cipher_tv = (void *)tvmem; |
250 | 483 | ||
251 | init_completion(&result.completion); | 484 | init_completion(&result.completion); |
@@ -269,33 +502,34 @@ static void test_cipher(char *algo, int enc, | |||
269 | 502 | ||
270 | j = 0; | 503 | j = 0; |
271 | for (i = 0; i < tcount; i++) { | 504 | for (i = 0; i < tcount; i++) { |
272 | if (!(cipher_tv[i].np)) { | 505 | memcpy(cipher_tv, &template[i], tsize); |
506 | if (!(cipher_tv->np)) { | ||
273 | j++; | 507 | j++; |
274 | printk("test %u (%d bit key):\n", | 508 | printk("test %u (%d bit key):\n", |
275 | j, cipher_tv[i].klen * 8); | 509 | j, cipher_tv->klen * 8); |
276 | 510 | ||
277 | crypto_ablkcipher_clear_flags(tfm, ~0); | 511 | crypto_ablkcipher_clear_flags(tfm, ~0); |
278 | if (cipher_tv[i].wk) | 512 | if (cipher_tv->wk) |
279 | crypto_ablkcipher_set_flags( | 513 | crypto_ablkcipher_set_flags( |
280 | tfm, CRYPTO_TFM_REQ_WEAK_KEY); | 514 | tfm, CRYPTO_TFM_REQ_WEAK_KEY); |
281 | key = cipher_tv[i].key; | 515 | key = cipher_tv->key; |
282 | 516 | ||
283 | ret = crypto_ablkcipher_setkey(tfm, key, | 517 | ret = crypto_ablkcipher_setkey(tfm, key, |
284 | cipher_tv[i].klen); | 518 | cipher_tv->klen); |
285 | if (ret) { | 519 | if (ret) { |
286 | printk("setkey() failed flags=%x\n", | 520 | printk("setkey() failed flags=%x\n", |
287 | crypto_ablkcipher_get_flags(tfm)); | 521 | crypto_ablkcipher_get_flags(tfm)); |
288 | 522 | ||
289 | if (!cipher_tv[i].fail) | 523 | if (!cipher_tv->fail) |
290 | goto out; | 524 | goto out; |
291 | } | 525 | } |
292 | 526 | ||
293 | sg_init_one(&sg[0], cipher_tv[i].input, | 527 | sg_init_one(&sg[0], cipher_tv->input, |
294 | cipher_tv[i].ilen); | 528 | cipher_tv->ilen); |
295 | 529 | ||
296 | ablkcipher_request_set_crypt(req, sg, sg, | 530 | ablkcipher_request_set_crypt(req, sg, sg, |
297 | cipher_tv[i].ilen, | 531 | cipher_tv->ilen, |
298 | cipher_tv[i].iv); | 532 | cipher_tv->iv); |
299 | 533 | ||
300 | ret = enc ? | 534 | ret = enc ? |
301 | crypto_ablkcipher_encrypt(req) : | 535 | crypto_ablkcipher_encrypt(req) : |
@@ -319,11 +553,11 @@ static void test_cipher(char *algo, int enc, | |||
319 | } | 553 | } |
320 | 554 | ||
321 | q = kmap(sg_page(&sg[0])) + sg[0].offset; | 555 | q = kmap(sg_page(&sg[0])) + sg[0].offset; |
322 | hexdump(q, cipher_tv[i].rlen); | 556 | hexdump(q, cipher_tv->rlen); |
323 | 557 | ||
324 | printk("%s\n", | 558 | printk("%s\n", |
325 | memcmp(q, cipher_tv[i].result, | 559 | memcmp(q, cipher_tv->result, |
326 | cipher_tv[i].rlen) ? "fail" : "pass"); | 560 | cipher_tv->rlen) ? "fail" : "pass"); |
327 | } | 561 | } |
328 | } | 562 | } |
329 | 563 | ||
@@ -332,41 +566,42 @@ static void test_cipher(char *algo, int enc, | |||
332 | 566 | ||
333 | j = 0; | 567 | j = 0; |
334 | for (i = 0; i < tcount; i++) { | 568 | for (i = 0; i < tcount; i++) { |
335 | if (cipher_tv[i].np) { | 569 | memcpy(cipher_tv, &template[i], tsize); |
570 | if (cipher_tv->np) { | ||
336 | j++; | 571 | j++; |
337 | printk("test %u (%d bit key):\n", | 572 | printk("test %u (%d bit key):\n", |
338 | j, cipher_tv[i].klen * 8); | 573 | j, cipher_tv->klen * 8); |
339 | 574 | ||
340 | crypto_ablkcipher_clear_flags(tfm, ~0); | 575 | crypto_ablkcipher_clear_flags(tfm, ~0); |
341 | if (cipher_tv[i].wk) | 576 | if (cipher_tv->wk) |
342 | crypto_ablkcipher_set_flags( | 577 | crypto_ablkcipher_set_flags( |
343 | tfm, CRYPTO_TFM_REQ_WEAK_KEY); | 578 | tfm, CRYPTO_TFM_REQ_WEAK_KEY); |
344 | key = cipher_tv[i].key; | 579 | key = cipher_tv->key; |
345 | 580 | ||
346 | ret = crypto_ablkcipher_setkey(tfm, key, | 581 | ret = crypto_ablkcipher_setkey(tfm, key, |
347 | cipher_tv[i].klen); | 582 | cipher_tv->klen); |
348 | if (ret) { | 583 | if (ret) { |
349 | printk("setkey() failed flags=%x\n", | 584 | printk("setkey() failed flags=%x\n", |
350 | crypto_ablkcipher_get_flags(tfm)); | 585 | crypto_ablkcipher_get_flags(tfm)); |
351 | 586 | ||
352 | if (!cipher_tv[i].fail) | 587 | if (!cipher_tv->fail) |
353 | goto out; | 588 | goto out; |
354 | } | 589 | } |
355 | 590 | ||
356 | temp = 0; | 591 | temp = 0; |
357 | sg_init_table(sg, cipher_tv[i].np); | 592 | sg_init_table(sg, cipher_tv->np); |
358 | for (k = 0; k < cipher_tv[i].np; k++) { | 593 | for (k = 0; k < cipher_tv->np; k++) { |
359 | memcpy(&xbuf[IDX[k]], | 594 | memcpy(&xbuf[IDX[k]], |
360 | cipher_tv[i].input + temp, | 595 | cipher_tv->input + temp, |
361 | cipher_tv[i].tap[k]); | 596 | cipher_tv->tap[k]); |
362 | temp += cipher_tv[i].tap[k]; | 597 | temp += cipher_tv->tap[k]; |
363 | sg_set_buf(&sg[k], &xbuf[IDX[k]], | 598 | sg_set_buf(&sg[k], &xbuf[IDX[k]], |
364 | cipher_tv[i].tap[k]); | 599 | cipher_tv->tap[k]); |
365 | } | 600 | } |
366 | 601 | ||
367 | ablkcipher_request_set_crypt(req, sg, sg, | 602 | ablkcipher_request_set_crypt(req, sg, sg, |
368 | cipher_tv[i].ilen, | 603 | cipher_tv->ilen, |
369 | cipher_tv[i].iv); | 604 | cipher_tv->iv); |
370 | 605 | ||
371 | ret = enc ? | 606 | ret = enc ? |
372 | crypto_ablkcipher_encrypt(req) : | 607 | crypto_ablkcipher_encrypt(req) : |
@@ -390,15 +625,15 @@ static void test_cipher(char *algo, int enc, | |||
390 | } | 625 | } |
391 | 626 | ||
392 | temp = 0; | 627 | temp = 0; |
393 | for (k = 0; k < cipher_tv[i].np; k++) { | 628 | for (k = 0; k < cipher_tv->np; k++) { |
394 | printk("page %u\n", k); | 629 | printk("page %u\n", k); |
395 | q = kmap(sg_page(&sg[k])) + sg[k].offset; | 630 | q = kmap(sg_page(&sg[k])) + sg[k].offset; |
396 | hexdump(q, cipher_tv[i].tap[k]); | 631 | hexdump(q, cipher_tv->tap[k]); |
397 | printk("%s\n", | 632 | printk("%s\n", |
398 | memcmp(q, cipher_tv[i].result + temp, | 633 | memcmp(q, cipher_tv->result + temp, |
399 | cipher_tv[i].tap[k]) ? "fail" : | 634 | cipher_tv->tap[k]) ? "fail" : |
400 | "pass"); | 635 | "pass"); |
401 | temp += cipher_tv[i].tap[k]; | 636 | temp += cipher_tv->tap[k]; |
402 | } | 637 | } |
403 | } | 638 | } |
404 | } | 639 | } |
@@ -800,7 +1035,8 @@ out: | |||
800 | crypto_free_hash(tfm); | 1035 | crypto_free_hash(tfm); |
801 | } | 1036 | } |
802 | 1037 | ||
803 | static void test_deflate(void) | 1038 | static void test_comp(char *algo, struct comp_testvec *ctemplate, |
1039 | struct comp_testvec *dtemplate, int ctcount, int dtcount) | ||
804 | { | 1040 | { |
805 | unsigned int i; | 1041 | unsigned int i; |
806 | char result[COMP_BUF_SIZE]; | 1042 | char result[COMP_BUF_SIZE]; |
@@ -808,25 +1044,26 @@ static void test_deflate(void) | |||
808 | struct comp_testvec *tv; | 1044 | struct comp_testvec *tv; |
809 | unsigned int tsize; | 1045 | unsigned int tsize; |
810 | 1046 | ||
811 | printk("\ntesting deflate compression\n"); | 1047 | printk("\ntesting %s compression\n", algo); |
812 | 1048 | ||
813 | tsize = sizeof (deflate_comp_tv_template); | 1049 | tsize = sizeof(struct comp_testvec); |
1050 | tsize *= ctcount; | ||
814 | if (tsize > TVMEMSIZE) { | 1051 | if (tsize > TVMEMSIZE) { |
815 | printk("template (%u) too big for tvmem (%u)\n", tsize, | 1052 | printk("template (%u) too big for tvmem (%u)\n", tsize, |
816 | TVMEMSIZE); | 1053 | TVMEMSIZE); |
817 | return; | 1054 | return; |
818 | } | 1055 | } |
819 | 1056 | ||
820 | memcpy(tvmem, deflate_comp_tv_template, tsize); | 1057 | memcpy(tvmem, ctemplate, tsize); |
821 | tv = (void *)tvmem; | 1058 | tv = (void *)tvmem; |
822 | 1059 | ||
823 | tfm = crypto_alloc_comp("deflate", 0, CRYPTO_ALG_ASYNC); | 1060 | tfm = crypto_alloc_comp(algo, 0, CRYPTO_ALG_ASYNC); |
824 | if (IS_ERR(tfm)) { | 1061 | if (IS_ERR(tfm)) { |
825 | printk("failed to load transform for deflate\n"); | 1062 | printk("failed to load transform for %s\n", algo); |
826 | return; | 1063 | return; |
827 | } | 1064 | } |
828 | 1065 | ||
829 | for (i = 0; i < DEFLATE_COMP_TEST_VECTORS; i++) { | 1066 | for (i = 0; i < ctcount; i++) { |
830 | int ilen, ret, dlen = COMP_BUF_SIZE; | 1067 | int ilen, ret, dlen = COMP_BUF_SIZE; |
831 | 1068 | ||
832 | printk("test %u:\n", i + 1); | 1069 | printk("test %u:\n", i + 1); |
@@ -845,19 +1082,20 @@ static void test_deflate(void) | |||
845 | ilen, dlen); | 1082 | ilen, dlen); |
846 | } | 1083 | } |
847 | 1084 | ||
848 | printk("\ntesting deflate decompression\n"); | 1085 | printk("\ntesting %s decompression\n", algo); |
849 | 1086 | ||
850 | tsize = sizeof (deflate_decomp_tv_template); | 1087 | tsize = sizeof(struct comp_testvec); |
1088 | tsize *= dtcount; | ||
851 | if (tsize > TVMEMSIZE) { | 1089 | if (tsize > TVMEMSIZE) { |
852 | printk("template (%u) too big for tvmem (%u)\n", tsize, | 1090 | printk("template (%u) too big for tvmem (%u)\n", tsize, |
853 | TVMEMSIZE); | 1091 | TVMEMSIZE); |
854 | goto out; | 1092 | goto out; |
855 | } | 1093 | } |
856 | 1094 | ||
857 | memcpy(tvmem, deflate_decomp_tv_template, tsize); | 1095 | memcpy(tvmem, dtemplate, tsize); |
858 | tv = (void *)tvmem; | 1096 | tv = (void *)tvmem; |
859 | 1097 | ||
860 | for (i = 0; i < DEFLATE_DECOMP_TEST_VECTORS; i++) { | 1098 | for (i = 0; i < dtcount; i++) { |
861 | int ilen, ret, dlen = COMP_BUF_SIZE; | 1099 | int ilen, ret, dlen = COMP_BUF_SIZE; |
862 | 1100 | ||
863 | printk("test %u:\n", i + 1); | 1101 | printk("test %u:\n", i + 1); |
@@ -918,6 +1156,8 @@ static void do_test(void) | |||
918 | 1156 | ||
919 | test_hash("md4", md4_tv_template, MD4_TEST_VECTORS); | 1157 | test_hash("md4", md4_tv_template, MD4_TEST_VECTORS); |
920 | 1158 | ||
1159 | test_hash("sha224", sha224_tv_template, SHA224_TEST_VECTORS); | ||
1160 | |||
921 | test_hash("sha256", sha256_tv_template, SHA256_TEST_VECTORS); | 1161 | test_hash("sha256", sha256_tv_template, SHA256_TEST_VECTORS); |
922 | 1162 | ||
923 | //BLOWFISH | 1163 | //BLOWFISH |
@@ -969,6 +1209,18 @@ static void do_test(void) | |||
969 | AES_XTS_ENC_TEST_VECTORS); | 1209 | AES_XTS_ENC_TEST_VECTORS); |
970 | test_cipher("xts(aes)", DECRYPT, aes_xts_dec_tv_template, | 1210 | test_cipher("xts(aes)", DECRYPT, aes_xts_dec_tv_template, |
971 | AES_XTS_DEC_TEST_VECTORS); | 1211 | AES_XTS_DEC_TEST_VECTORS); |
1212 | test_cipher("rfc3686(ctr(aes))", ENCRYPT, aes_ctr_enc_tv_template, | ||
1213 | AES_CTR_ENC_TEST_VECTORS); | ||
1214 | test_cipher("rfc3686(ctr(aes))", DECRYPT, aes_ctr_dec_tv_template, | ||
1215 | AES_CTR_DEC_TEST_VECTORS); | ||
1216 | test_aead("gcm(aes)", ENCRYPT, aes_gcm_enc_tv_template, | ||
1217 | AES_GCM_ENC_TEST_VECTORS); | ||
1218 | test_aead("gcm(aes)", DECRYPT, aes_gcm_dec_tv_template, | ||
1219 | AES_GCM_DEC_TEST_VECTORS); | ||
1220 | test_aead("ccm(aes)", ENCRYPT, aes_ccm_enc_tv_template, | ||
1221 | AES_CCM_ENC_TEST_VECTORS); | ||
1222 | test_aead("ccm(aes)", DECRYPT, aes_ccm_dec_tv_template, | ||
1223 | AES_CCM_DEC_TEST_VECTORS); | ||
972 | 1224 | ||
973 | //CAST5 | 1225 | //CAST5 |
974 | test_cipher("ecb(cast5)", ENCRYPT, cast5_enc_tv_template, | 1226 | test_cipher("ecb(cast5)", ENCRYPT, cast5_enc_tv_template, |
@@ -1057,12 +1309,18 @@ static void do_test(void) | |||
1057 | test_hash("tgr192", tgr192_tv_template, TGR192_TEST_VECTORS); | 1309 | test_hash("tgr192", tgr192_tv_template, TGR192_TEST_VECTORS); |
1058 | test_hash("tgr160", tgr160_tv_template, TGR160_TEST_VECTORS); | 1310 | test_hash("tgr160", tgr160_tv_template, TGR160_TEST_VECTORS); |
1059 | test_hash("tgr128", tgr128_tv_template, TGR128_TEST_VECTORS); | 1311 | test_hash("tgr128", tgr128_tv_template, TGR128_TEST_VECTORS); |
1060 | test_deflate(); | 1312 | test_comp("deflate", deflate_comp_tv_template, |
1313 | deflate_decomp_tv_template, DEFLATE_COMP_TEST_VECTORS, | ||
1314 | DEFLATE_DECOMP_TEST_VECTORS); | ||
1315 | test_comp("lzo", lzo_comp_tv_template, lzo_decomp_tv_template, | ||
1316 | LZO_COMP_TEST_VECTORS, LZO_DECOMP_TEST_VECTORS); | ||
1061 | test_hash("crc32c", crc32c_tv_template, CRC32C_TEST_VECTORS); | 1317 | test_hash("crc32c", crc32c_tv_template, CRC32C_TEST_VECTORS); |
1062 | test_hash("hmac(md5)", hmac_md5_tv_template, | 1318 | test_hash("hmac(md5)", hmac_md5_tv_template, |
1063 | HMAC_MD5_TEST_VECTORS); | 1319 | HMAC_MD5_TEST_VECTORS); |
1064 | test_hash("hmac(sha1)", hmac_sha1_tv_template, | 1320 | test_hash("hmac(sha1)", hmac_sha1_tv_template, |
1065 | HMAC_SHA1_TEST_VECTORS); | 1321 | HMAC_SHA1_TEST_VECTORS); |
1322 | test_hash("hmac(sha224)", hmac_sha224_tv_template, | ||
1323 | HMAC_SHA224_TEST_VECTORS); | ||
1066 | test_hash("hmac(sha256)", hmac_sha256_tv_template, | 1324 | test_hash("hmac(sha256)", hmac_sha256_tv_template, |
1067 | HMAC_SHA256_TEST_VECTORS); | 1325 | HMAC_SHA256_TEST_VECTORS); |
1068 | test_hash("hmac(sha384)", hmac_sha384_tv_template, | 1326 | test_hash("hmac(sha384)", hmac_sha384_tv_template, |
@@ -1156,6 +1414,10 @@ static void do_test(void) | |||
1156 | AES_XTS_ENC_TEST_VECTORS); | 1414 | AES_XTS_ENC_TEST_VECTORS); |
1157 | test_cipher("xts(aes)", DECRYPT, aes_xts_dec_tv_template, | 1415 | test_cipher("xts(aes)", DECRYPT, aes_xts_dec_tv_template, |
1158 | AES_XTS_DEC_TEST_VECTORS); | 1416 | AES_XTS_DEC_TEST_VECTORS); |
1417 | test_cipher("rfc3686(ctr(aes))", ENCRYPT, aes_ctr_enc_tv_template, | ||
1418 | AES_CTR_ENC_TEST_VECTORS); | ||
1419 | test_cipher("rfc3686(ctr(aes))", DECRYPT, aes_ctr_dec_tv_template, | ||
1420 | AES_CTR_DEC_TEST_VECTORS); | ||
1159 | break; | 1421 | break; |
1160 | 1422 | ||
1161 | case 11: | 1423 | case 11: |
@@ -1167,7 +1429,9 @@ static void do_test(void) | |||
1167 | break; | 1429 | break; |
1168 | 1430 | ||
1169 | case 13: | 1431 | case 13: |
1170 | test_deflate(); | 1432 | test_comp("deflate", deflate_comp_tv_template, |
1433 | deflate_decomp_tv_template, DEFLATE_COMP_TEST_VECTORS, | ||
1434 | DEFLATE_DECOMP_TEST_VECTORS); | ||
1171 | break; | 1435 | break; |
1172 | 1436 | ||
1173 | case 14: | 1437 | case 14: |
@@ -1291,6 +1555,34 @@ static void do_test(void) | |||
1291 | camellia_cbc_dec_tv_template, | 1555 | camellia_cbc_dec_tv_template, |
1292 | CAMELLIA_CBC_DEC_TEST_VECTORS); | 1556 | CAMELLIA_CBC_DEC_TEST_VECTORS); |
1293 | break; | 1557 | break; |
1558 | case 33: | ||
1559 | test_hash("sha224", sha224_tv_template, SHA224_TEST_VECTORS); | ||
1560 | break; | ||
1561 | |||
1562 | case 34: | ||
1563 | test_cipher("salsa20", ENCRYPT, | ||
1564 | salsa20_stream_enc_tv_template, | ||
1565 | SALSA20_STREAM_ENC_TEST_VECTORS); | ||
1566 | break; | ||
1567 | |||
1568 | case 35: | ||
1569 | test_aead("gcm(aes)", ENCRYPT, aes_gcm_enc_tv_template, | ||
1570 | AES_GCM_ENC_TEST_VECTORS); | ||
1571 | test_aead("gcm(aes)", DECRYPT, aes_gcm_dec_tv_template, | ||
1572 | AES_GCM_DEC_TEST_VECTORS); | ||
1573 | break; | ||
1574 | |||
1575 | case 36: | ||
1576 | test_comp("lzo", lzo_comp_tv_template, lzo_decomp_tv_template, | ||
1577 | LZO_COMP_TEST_VECTORS, LZO_DECOMP_TEST_VECTORS); | ||
1578 | break; | ||
1579 | |||
1580 | case 37: | ||
1581 | test_aead("ccm(aes)", ENCRYPT, aes_ccm_enc_tv_template, | ||
1582 | AES_CCM_ENC_TEST_VECTORS); | ||
1583 | test_aead("ccm(aes)", DECRYPT, aes_ccm_dec_tv_template, | ||
1584 | AES_CCM_DEC_TEST_VECTORS); | ||
1585 | break; | ||
1294 | 1586 | ||
1295 | case 100: | 1587 | case 100: |
1296 | test_hash("hmac(md5)", hmac_md5_tv_template, | 1588 | test_hash("hmac(md5)", hmac_md5_tv_template, |
@@ -1317,6 +1609,15 @@ static void do_test(void) | |||
1317 | HMAC_SHA512_TEST_VECTORS); | 1609 | HMAC_SHA512_TEST_VECTORS); |
1318 | break; | 1610 | break; |
1319 | 1611 | ||
1612 | case 105: | ||
1613 | test_hash("hmac(sha224)", hmac_sha224_tv_template, | ||
1614 | HMAC_SHA224_TEST_VECTORS); | ||
1615 | break; | ||
1616 | |||
1617 | case 106: | ||
1618 | test_hash("xcbc(aes)", aes_xcbc128_tv_template, | ||
1619 | XCBC_AES_TEST_VECTORS); | ||
1620 | break; | ||
1320 | 1621 | ||
1321 | case 200: | 1622 | case 200: |
1322 | test_cipher_speed("ecb(aes)", ENCRYPT, sec, NULL, 0, | 1623 | test_cipher_speed("ecb(aes)", ENCRYPT, sec, NULL, 0, |
@@ -1400,6 +1701,11 @@ static void do_test(void) | |||
1400 | camellia_speed_template); | 1701 | camellia_speed_template); |
1401 | break; | 1702 | break; |
1402 | 1703 | ||
1704 | case 206: | ||
1705 | test_cipher_speed("salsa20", ENCRYPT, sec, NULL, 0, | ||
1706 | salsa20_speed_template); | ||
1707 | break; | ||
1708 | |||
1403 | case 300: | 1709 | case 300: |
1404 | /* fall through */ | 1710 | /* fall through */ |
1405 | 1711 | ||
@@ -1451,6 +1757,10 @@ static void do_test(void) | |||
1451 | test_hash_speed("tgr192", sec, generic_hash_speed_template); | 1757 | test_hash_speed("tgr192", sec, generic_hash_speed_template); |
1452 | if (mode > 300 && mode < 400) break; | 1758 | if (mode > 300 && mode < 400) break; |
1453 | 1759 | ||
1760 | case 313: | ||
1761 | test_hash_speed("sha224", sec, generic_hash_speed_template); | ||
1762 | if (mode > 300 && mode < 400) break; | ||
1763 | |||
1454 | case 399: | 1764 | case 399: |
1455 | break; | 1765 | break; |
1456 | 1766 | ||
@@ -1467,20 +1777,21 @@ static void do_test(void) | |||
1467 | 1777 | ||
1468 | static int __init init(void) | 1778 | static int __init init(void) |
1469 | { | 1779 | { |
1780 | int err = -ENOMEM; | ||
1781 | |||
1470 | tvmem = kmalloc(TVMEMSIZE, GFP_KERNEL); | 1782 | tvmem = kmalloc(TVMEMSIZE, GFP_KERNEL); |
1471 | if (tvmem == NULL) | 1783 | if (tvmem == NULL) |
1472 | return -ENOMEM; | 1784 | return err; |
1473 | 1785 | ||
1474 | xbuf = kmalloc(XBUFSIZE, GFP_KERNEL); | 1786 | xbuf = kmalloc(XBUFSIZE, GFP_KERNEL); |
1475 | if (xbuf == NULL) { | 1787 | if (xbuf == NULL) |
1476 | kfree(tvmem); | 1788 | goto err_free_tv; |
1477 | return -ENOMEM; | ||
1478 | } | ||
1479 | 1789 | ||
1480 | do_test(); | 1790 | axbuf = kmalloc(XBUFSIZE, GFP_KERNEL); |
1791 | if (axbuf == NULL) | ||
1792 | goto err_free_xbuf; | ||
1481 | 1793 | ||
1482 | kfree(xbuf); | 1794 | do_test(); |
1483 | kfree(tvmem); | ||
1484 | 1795 | ||
1485 | /* We intentionaly return -EAGAIN to prevent keeping | 1796 | /* We intentionaly return -EAGAIN to prevent keeping |
1486 | * the module. It does all its work from init() | 1797 | * the module. It does all its work from init() |
@@ -1488,7 +1799,15 @@ static int __init init(void) | |||
1488 | * => we don't need it in the memory, do we? | 1799 | * => we don't need it in the memory, do we? |
1489 | * -- mludvig | 1800 | * -- mludvig |
1490 | */ | 1801 | */ |
1491 | return -EAGAIN; | 1802 | err = -EAGAIN; |
1803 | |||
1804 | kfree(axbuf); | ||
1805 | err_free_xbuf: | ||
1806 | kfree(xbuf); | ||
1807 | err_free_tv: | ||
1808 | kfree(tvmem); | ||
1809 | |||
1810 | return err; | ||
1492 | } | 1811 | } |
1493 | 1812 | ||
1494 | /* | 1813 | /* |
diff --git a/crypto/tcrypt.h b/crypto/tcrypt.h index ec861388d9a0..f785e5618e11 100644 --- a/crypto/tcrypt.h +++ b/crypto/tcrypt.h | |||
@@ -6,12 +6,15 @@ | |||
6 | * | 6 | * |
7 | * Copyright (c) 2002 James Morris <jmorris@intercode.com.au> | 7 | * Copyright (c) 2002 James Morris <jmorris@intercode.com.au> |
8 | * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org> | 8 | * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org> |
9 | * Copyright (c) 2007 Nokia Siemens Networks | ||
9 | * | 10 | * |
10 | * This program is free software; you can redistribute it and/or modify it | 11 | * This program is free software; you can redistribute it and/or modify it |
11 | * under the terms of the GNU General Public License as published by the Free | 12 | * under the terms of the GNU General Public License as published by the Free |
12 | * Software Foundation; either version 2 of the License, or (at your option) | 13 | * Software Foundation; either version 2 of the License, or (at your option) |
13 | * any later version. | 14 | * any later version. |
14 | * | 15 | * |
16 | * 2007-11-13 Added GCM tests | ||
17 | * 2007-11-13 Added AEAD support | ||
15 | * 2006-12-07 Added SHA384 HMAC and SHA512 HMAC tests | 18 | * 2006-12-07 Added SHA384 HMAC and SHA512 HMAC tests |
16 | * 2004-08-09 Cipher speed tests by Reyk Floeter <reyk@vantronix.net> | 19 | * 2004-08-09 Cipher speed tests by Reyk Floeter <reyk@vantronix.net> |
17 | * 2003-09-14 Changes by Kartikey Mahendra Bhatt | 20 | * 2003-09-14 Changes by Kartikey Mahendra Bhatt |
@@ -40,14 +43,32 @@ struct hash_testvec { | |||
40 | struct cipher_testvec { | 43 | struct cipher_testvec { |
41 | char key[MAX_KEYLEN] __attribute__ ((__aligned__(4))); | 44 | char key[MAX_KEYLEN] __attribute__ ((__aligned__(4))); |
42 | char iv[MAX_IVLEN]; | 45 | char iv[MAX_IVLEN]; |
46 | char input[4100]; | ||
47 | char result[4100]; | ||
48 | unsigned char tap[MAX_TAP]; | ||
49 | int np; | ||
50 | unsigned char fail; | ||
51 | unsigned char wk; /* weak key flag */ | ||
52 | unsigned char klen; | ||
53 | unsigned short ilen; | ||
54 | unsigned short rlen; | ||
55 | }; | ||
56 | |||
57 | struct aead_testvec { | ||
58 | char key[MAX_KEYLEN] __attribute__ ((__aligned__(4))); | ||
59 | char iv[MAX_IVLEN]; | ||
43 | char input[512]; | 60 | char input[512]; |
61 | char assoc[512]; | ||
44 | char result[512]; | 62 | char result[512]; |
45 | unsigned char tap[MAX_TAP]; | 63 | unsigned char tap[MAX_TAP]; |
64 | unsigned char atap[MAX_TAP]; | ||
46 | int np; | 65 | int np; |
66 | int anp; | ||
47 | unsigned char fail; | 67 | unsigned char fail; |
48 | unsigned char wk; /* weak key flag */ | 68 | unsigned char wk; /* weak key flag */ |
49 | unsigned char klen; | 69 | unsigned char klen; |
50 | unsigned short ilen; | 70 | unsigned short ilen; |
71 | unsigned short alen; | ||
51 | unsigned short rlen; | 72 | unsigned short rlen; |
52 | }; | 73 | }; |
53 | 74 | ||
@@ -173,6 +194,33 @@ static struct hash_testvec sha1_tv_template[] = { | |||
173 | } | 194 | } |
174 | }; | 195 | }; |
175 | 196 | ||
197 | |||
198 | /* | ||
199 | * SHA224 test vectors from from FIPS PUB 180-2 | ||
200 | */ | ||
201 | #define SHA224_TEST_VECTORS 2 | ||
202 | |||
203 | static struct hash_testvec sha224_tv_template[] = { | ||
204 | { | ||
205 | .plaintext = "abc", | ||
206 | .psize = 3, | ||
207 | .digest = { 0x23, 0x09, 0x7D, 0x22, 0x34, 0x05, 0xD8, 0x22, | ||
208 | 0x86, 0x42, 0xA4, 0x77, 0xBD, 0xA2, 0x55, 0xB3, | ||
209 | 0x2A, 0xAD, 0xBC, 0xE4, 0xBD, 0xA0, 0xB3, 0xF7, | ||
210 | 0xE3, 0x6C, 0x9D, 0xA7}, | ||
211 | }, { | ||
212 | .plaintext = | ||
213 | "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", | ||
214 | .psize = 56, | ||
215 | .digest = { 0x75, 0x38, 0x8B, 0x16, 0x51, 0x27, 0x76, 0xCC, | ||
216 | 0x5D, 0xBA, 0x5D, 0xA1, 0xFD, 0x89, 0x01, 0x50, | ||
217 | 0xB0, 0xC6, 0x45, 0x5C, 0xB4, 0xF5, 0x8B, 0x19, | ||
218 | 0x52, 0x52, 0x25, 0x25 }, | ||
219 | .np = 2, | ||
220 | .tap = { 28, 28 } | ||
221 | } | ||
222 | }; | ||
223 | |||
176 | /* | 224 | /* |
177 | * SHA256 test vectors from from NIST | 225 | * SHA256 test vectors from from NIST |
178 | */ | 226 | */ |
@@ -817,6 +865,121 @@ static struct hash_testvec hmac_sha1_tv_template[] = { | |||
817 | }, | 865 | }, |
818 | }; | 866 | }; |
819 | 867 | ||
868 | |||
869 | /* | ||
870 | * SHA224 HMAC test vectors from RFC4231 | ||
871 | */ | ||
872 | #define HMAC_SHA224_TEST_VECTORS 4 | ||
873 | |||
874 | static struct hash_testvec hmac_sha224_tv_template[] = { | ||
875 | { | ||
876 | .key = { 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, | ||
877 | 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, | ||
878 | 0x0b, 0x0b, 0x0b, 0x0b }, | ||
879 | .ksize = 20, | ||
880 | /* ("Hi There") */ | ||
881 | .plaintext = { 0x48, 0x69, 0x20, 0x54, 0x68, 0x65, 0x72, 0x65 }, | ||
882 | .psize = 8, | ||
883 | .digest = { 0x89, 0x6f, 0xb1, 0x12, 0x8a, 0xbb, 0xdf, 0x19, | ||
884 | 0x68, 0x32, 0x10, 0x7c, 0xd4, 0x9d, 0xf3, 0x3f, | ||
885 | 0x47, 0xb4, 0xb1, 0x16, 0x99, 0x12, 0xba, 0x4f, | ||
886 | 0x53, 0x68, 0x4b, 0x22}, | ||
887 | }, { | ||
888 | .key = { 0x4a, 0x65, 0x66, 0x65 }, /* ("Jefe") */ | ||
889 | .ksize = 4, | ||
890 | /* ("what do ya want for nothing?") */ | ||
891 | .plaintext = { 0x77, 0x68, 0x61, 0x74, 0x20, 0x64, 0x6f, 0x20, | ||
892 | 0x79, 0x61, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x20, | ||
893 | 0x66, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x68, | ||
894 | 0x69, 0x6e, 0x67, 0x3f }, | ||
895 | .psize = 28, | ||
896 | .digest = { 0xa3, 0x0e, 0x01, 0x09, 0x8b, 0xc6, 0xdb, 0xbf, | ||
897 | 0x45, 0x69, 0x0f, 0x3a, 0x7e, 0x9e, 0x6d, 0x0f, | ||
898 | 0x8b, 0xbe, 0xa2, 0xa3, 0x9e, 0x61, 0x48, 0x00, | ||
899 | 0x8f, 0xd0, 0x5e, 0x44 }, | ||
900 | .np = 4, | ||
901 | .tap = { 7, 7, 7, 7 } | ||
902 | }, { | ||
903 | .key = { 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
904 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
905 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
906 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
907 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
908 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
909 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
910 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
911 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
912 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
913 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
914 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
915 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
916 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
917 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
918 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
919 | 0xaa, 0xaa, 0xaa }, | ||
920 | .ksize = 131, | ||
921 | /* ("Test Using Larger Than Block-Size Key - Hash Key First") */ | ||
922 | .plaintext = { 0x54, 0x65, 0x73, 0x74, 0x20, 0x55, 0x73, 0x69, | ||
923 | 0x6e, 0x67, 0x20, 0x4c, 0x61, 0x72, 0x67, 0x65, | ||
924 | 0x72, 0x20, 0x54, 0x68, 0x61, 0x6e, 0x20, 0x42, | ||
925 | 0x6c, 0x6f, 0x63, 0x6b, 0x2d, 0x53, 0x69, 0x7a, | ||
926 | 0x65, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x2d, 0x20, | ||
927 | 0x48, 0x61, 0x73, 0x68, 0x20, 0x4b, 0x65, 0x79, | ||
928 | 0x20, 0x46, 0x69, 0x72, 0x73, 0x74 }, | ||
929 | .psize = 54, | ||
930 | .digest = { 0x95, 0xe9, 0xa0, 0xdb, 0x96, 0x20, 0x95, 0xad, | ||
931 | 0xae, 0xbe, 0x9b, 0x2d, 0x6f, 0x0d, 0xbc, 0xe2, | ||
932 | 0xd4, 0x99, 0xf1, 0x12, 0xf2, 0xd2, 0xb7, 0x27, | ||
933 | 0x3f, 0xa6, 0x87, 0x0e }, | ||
934 | }, { | ||
935 | .key = { 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
936 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
937 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
938 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
939 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
940 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
941 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
942 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
943 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
944 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
945 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
946 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
947 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
948 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
949 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
950 | 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | ||
951 | 0xaa, 0xaa, 0xaa }, | ||
952 | .ksize = 131, | ||
953 | /* ("This is a test using a larger than block-size key and a") | ||
954 | (" larger than block-size data. The key needs to be") | ||
955 | (" hashed before being used by the HMAC algorithm.") */ | ||
956 | .plaintext = { 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, | ||
957 | 0x61, 0x20, 0x74, 0x65, 0x73, 0x74, 0x20, 0x75, | ||
958 | 0x73, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x6c, | ||
959 | 0x61, 0x72, 0x67, 0x65, 0x72, 0x20, 0x74, 0x68, | ||
960 | 0x61, 0x6e, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, | ||
961 | 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6b, 0x65, | ||
962 | 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x20, | ||
963 | 0x6c, 0x61, 0x72, 0x67, 0x65, 0x72, 0x20, 0x74, | ||
964 | 0x68, 0x61, 0x6e, 0x20, 0x62, 0x6c, 0x6f, 0x63, | ||
965 | 0x6b, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x64, | ||
966 | 0x61, 0x74, 0x61, 0x2e, 0x20, 0x54, 0x68, 0x65, | ||
967 | 0x20, 0x6b, 0x65, 0x79, 0x20, 0x6e, 0x65, 0x65, | ||
968 | 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, | ||
969 | 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x64, 0x20, | ||
970 | 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x62, | ||
971 | 0x65, 0x69, 0x6e, 0x67, 0x20, 0x75, 0x73, 0x65, | ||
972 | 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, | ||
973 | 0x20, 0x48, 0x4d, 0x41, 0x43, 0x20, 0x61, 0x6c, | ||
974 | 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x2e }, | ||
975 | .psize = 152, | ||
976 | .digest = { 0x3a, 0x85, 0x41, 0x66, 0xac, 0x5d, 0x9f, 0x02, | ||
977 | 0x3f, 0x54, 0xd5, 0x17, 0xd0, 0xb3, 0x9d, 0xbd, | ||
978 | 0x94, 0x67, 0x70, 0xdb, 0x9c, 0x2b, 0x95, 0xc9, | ||
979 | 0xf6, 0xf5, 0x65, 0xd1 }, | ||
980 | }, | ||
981 | }; | ||
982 | |||
820 | /* | 983 | /* |
821 | * HMAC-SHA256 test vectors from | 984 | * HMAC-SHA256 test vectors from |
822 | * draft-ietf-ipsec-ciph-sha-256-01.txt | 985 | * draft-ietf-ipsec-ciph-sha-256-01.txt |
@@ -2140,12 +2303,18 @@ static struct cipher_testvec cast6_dec_tv_template[] = { | |||
2140 | */ | 2303 | */ |
2141 | #define AES_ENC_TEST_VECTORS 3 | 2304 | #define AES_ENC_TEST_VECTORS 3 |
2142 | #define AES_DEC_TEST_VECTORS 3 | 2305 | #define AES_DEC_TEST_VECTORS 3 |
2143 | #define AES_CBC_ENC_TEST_VECTORS 2 | 2306 | #define AES_CBC_ENC_TEST_VECTORS 4 |
2144 | #define AES_CBC_DEC_TEST_VECTORS 2 | 2307 | #define AES_CBC_DEC_TEST_VECTORS 4 |
2145 | #define AES_LRW_ENC_TEST_VECTORS 8 | 2308 | #define AES_LRW_ENC_TEST_VECTORS 8 |
2146 | #define AES_LRW_DEC_TEST_VECTORS 8 | 2309 | #define AES_LRW_DEC_TEST_VECTORS 8 |
2147 | #define AES_XTS_ENC_TEST_VECTORS 4 | 2310 | #define AES_XTS_ENC_TEST_VECTORS 4 |
2148 | #define AES_XTS_DEC_TEST_VECTORS 4 | 2311 | #define AES_XTS_DEC_TEST_VECTORS 4 |
2312 | #define AES_CTR_ENC_TEST_VECTORS 7 | ||
2313 | #define AES_CTR_DEC_TEST_VECTORS 6 | ||
2314 | #define AES_GCM_ENC_TEST_VECTORS 9 | ||
2315 | #define AES_GCM_DEC_TEST_VECTORS 8 | ||
2316 | #define AES_CCM_ENC_TEST_VECTORS 7 | ||
2317 | #define AES_CCM_DEC_TEST_VECTORS 7 | ||
2149 | 2318 | ||
2150 | static struct cipher_testvec aes_enc_tv_template[] = { | 2319 | static struct cipher_testvec aes_enc_tv_template[] = { |
2151 | { /* From FIPS-197 */ | 2320 | { /* From FIPS-197 */ |
@@ -2249,6 +2418,57 @@ static struct cipher_testvec aes_cbc_enc_tv_template[] = { | |||
2249 | 0x75, 0x86, 0x60, 0x2d, 0x25, 0x3c, 0xff, 0xf9, | 2418 | 0x75, 0x86, 0x60, 0x2d, 0x25, 0x3c, 0xff, 0xf9, |
2250 | 0x1b, 0x82, 0x66, 0xbe, 0xa6, 0xd6, 0x1a, 0xb1 }, | 2419 | 0x1b, 0x82, 0x66, 0xbe, 0xa6, 0xd6, 0x1a, 0xb1 }, |
2251 | .rlen = 32, | 2420 | .rlen = 32, |
2421 | }, { /* From NIST SP800-38A */ | ||
2422 | .key = { 0x8e, 0x73, 0xb0, 0xf7, 0xda, 0x0e, 0x64, 0x52, | ||
2423 | 0xc8, 0x10, 0xf3, 0x2b, 0x80, 0x90, 0x79, 0xe5, | ||
2424 | 0x62, 0xf8, 0xea, 0xd2, 0x52, 0x2c, 0x6b, 0x7b }, | ||
2425 | .klen = 24, | ||
2426 | .iv = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
2427 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }, | ||
2428 | .input = { 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, | ||
2429 | 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a, | ||
2430 | 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c, | ||
2431 | 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51, | ||
2432 | 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11, | ||
2433 | 0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef, | ||
2434 | 0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17, | ||
2435 | 0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10 }, | ||
2436 | .ilen = 64, | ||
2437 | .result = { 0x4f, 0x02, 0x1d, 0xb2, 0x43, 0xbc, 0x63, 0x3d, | ||
2438 | 0x71, 0x78, 0x18, 0x3a, 0x9f, 0xa0, 0x71, 0xe8, | ||
2439 | 0xb4, 0xd9, 0xad, 0xa9, 0xad, 0x7d, 0xed, 0xf4, | ||
2440 | 0xe5, 0xe7, 0x38, 0x76, 0x3f, 0x69, 0x14, 0x5a, | ||
2441 | 0x57, 0x1b, 0x24, 0x20, 0x12, 0xfb, 0x7a, 0xe0, | ||
2442 | 0x7f, 0xa9, 0xba, 0xac, 0x3d, 0xf1, 0x02, 0xe0, | ||
2443 | 0x08, 0xb0, 0xe2, 0x79, 0x88, 0x59, 0x88, 0x81, | ||
2444 | 0xd9, 0x20, 0xa9, 0xe6, 0x4f, 0x56, 0x15, 0xcd }, | ||
2445 | .rlen = 64, | ||
2446 | }, { | ||
2447 | .key = { 0x60, 0x3d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe, | ||
2448 | 0x2b, 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81, | ||
2449 | 0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7, | ||
2450 | 0x2d, 0x98, 0x10, 0xa3, 0x09, 0x14, 0xdf, 0xf4 }, | ||
2451 | .klen = 32, | ||
2452 | .iv = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
2453 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }, | ||
2454 | .input = { 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, | ||
2455 | 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a, | ||
2456 | 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c, | ||
2457 | 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51, | ||
2458 | 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11, | ||
2459 | 0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef, | ||
2460 | 0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17, | ||
2461 | 0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10 }, | ||
2462 | .ilen = 64, | ||
2463 | .result = { 0xf5, 0x8c, 0x4c, 0x04, 0xd6, 0xe5, 0xf1, 0xba, | ||
2464 | 0x77, 0x9e, 0xab, 0xfb, 0x5f, 0x7b, 0xfb, 0xd6, | ||
2465 | 0x9c, 0xfc, 0x4e, 0x96, 0x7e, 0xdb, 0x80, 0x8d, | ||
2466 | 0x67, 0x9f, 0x77, 0x7b, 0xc6, 0x70, 0x2c, 0x7d, | ||
2467 | 0x39, 0xf2, 0x33, 0x69, 0xa9, 0xd9, 0xba, 0xcf, | ||
2468 | 0xa5, 0x30, 0xe2, 0x63, 0x04, 0x23, 0x14, 0x61, | ||
2469 | 0xb2, 0xeb, 0x05, 0xe2, 0xc3, 0x9b, 0xe9, 0xfc, | ||
2470 | 0xda, 0x6c, 0x19, 0x07, 0x8c, 0x6a, 0x9d, 0x1b }, | ||
2471 | .rlen = 64, | ||
2252 | }, | 2472 | }, |
2253 | }; | 2473 | }; |
2254 | 2474 | ||
@@ -2280,6 +2500,57 @@ static struct cipher_testvec aes_cbc_dec_tv_template[] = { | |||
2280 | 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, | 2500 | 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, |
2281 | 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f }, | 2501 | 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f }, |
2282 | .rlen = 32, | 2502 | .rlen = 32, |
2503 | }, { /* From NIST SP800-38A */ | ||
2504 | .key = { 0x8e, 0x73, 0xb0, 0xf7, 0xda, 0x0e, 0x64, 0x52, | ||
2505 | 0xc8, 0x10, 0xf3, 0x2b, 0x80, 0x90, 0x79, 0xe5, | ||
2506 | 0x62, 0xf8, 0xea, 0xd2, 0x52, 0x2c, 0x6b, 0x7b }, | ||
2507 | .klen = 24, | ||
2508 | .iv = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
2509 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }, | ||
2510 | .input = { 0x4f, 0x02, 0x1d, 0xb2, 0x43, 0xbc, 0x63, 0x3d, | ||
2511 | 0x71, 0x78, 0x18, 0x3a, 0x9f, 0xa0, 0x71, 0xe8, | ||
2512 | 0xb4, 0xd9, 0xad, 0xa9, 0xad, 0x7d, 0xed, 0xf4, | ||
2513 | 0xe5, 0xe7, 0x38, 0x76, 0x3f, 0x69, 0x14, 0x5a, | ||
2514 | 0x57, 0x1b, 0x24, 0x20, 0x12, 0xfb, 0x7a, 0xe0, | ||
2515 | 0x7f, 0xa9, 0xba, 0xac, 0x3d, 0xf1, 0x02, 0xe0, | ||
2516 | 0x08, 0xb0, 0xe2, 0x79, 0x88, 0x59, 0x88, 0x81, | ||
2517 | 0xd9, 0x20, 0xa9, 0xe6, 0x4f, 0x56, 0x15, 0xcd }, | ||
2518 | .ilen = 64, | ||
2519 | .result = { 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, | ||
2520 | 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a, | ||
2521 | 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c, | ||
2522 | 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51, | ||
2523 | 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11, | ||
2524 | 0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef, | ||
2525 | 0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17, | ||
2526 | 0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10 }, | ||
2527 | .rlen = 64, | ||
2528 | }, { | ||
2529 | .key = { 0x60, 0x3d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe, | ||
2530 | 0x2b, 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81, | ||
2531 | 0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7, | ||
2532 | 0x2d, 0x98, 0x10, 0xa3, 0x09, 0x14, 0xdf, 0xf4 }, | ||
2533 | .klen = 32, | ||
2534 | .iv = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
2535 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }, | ||
2536 | .input = { 0xf5, 0x8c, 0x4c, 0x04, 0xd6, 0xe5, 0xf1, 0xba, | ||
2537 | 0x77, 0x9e, 0xab, 0xfb, 0x5f, 0x7b, 0xfb, 0xd6, | ||
2538 | 0x9c, 0xfc, 0x4e, 0x96, 0x7e, 0xdb, 0x80, 0x8d, | ||
2539 | 0x67, 0x9f, 0x77, 0x7b, 0xc6, 0x70, 0x2c, 0x7d, | ||
2540 | 0x39, 0xf2, 0x33, 0x69, 0xa9, 0xd9, 0xba, 0xcf, | ||
2541 | 0xa5, 0x30, 0xe2, 0x63, 0x04, 0x23, 0x14, 0x61, | ||
2542 | 0xb2, 0xeb, 0x05, 0xe2, 0xc3, 0x9b, 0xe9, 0xfc, | ||
2543 | 0xda, 0x6c, 0x19, 0x07, 0x8c, 0x6a, 0x9d, 0x1b }, | ||
2544 | .ilen = 64, | ||
2545 | .result = { 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, | ||
2546 | 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a, | ||
2547 | 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c, | ||
2548 | 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51, | ||
2549 | 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11, | ||
2550 | 0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef, | ||
2551 | 0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17, | ||
2552 | 0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10 }, | ||
2553 | .rlen = 64, | ||
2283 | }, | 2554 | }, |
2284 | }; | 2555 | }; |
2285 | 2556 | ||
@@ -3180,6 +3451,1843 @@ static struct cipher_testvec aes_xts_dec_tv_template[] = { | |||
3180 | } | 3451 | } |
3181 | }; | 3452 | }; |
3182 | 3453 | ||
3454 | |||
3455 | static struct cipher_testvec aes_ctr_enc_tv_template[] = { | ||
3456 | { /* From RFC 3686 */ | ||
3457 | .key = { 0xae, 0x68, 0x52, 0xf8, 0x12, 0x10, 0x67, 0xcc, | ||
3458 | 0x4b, 0xf7, 0xa5, 0x76, 0x55, 0x77, 0xf3, 0x9e, | ||
3459 | 0x00, 0x00, 0x00, 0x30 }, | ||
3460 | .klen = 20, | ||
3461 | .iv = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, | ||
3462 | .input = { "Single block msg" }, | ||
3463 | .ilen = 16, | ||
3464 | .result = { 0xe4, 0x09, 0x5d, 0x4f, 0xb7, 0xa7, 0xb3, 0x79, | ||
3465 | 0x2d, 0x61, 0x75, 0xa3, 0x26, 0x13, 0x11, 0xb8 }, | ||
3466 | .rlen = 16, | ||
3467 | }, { | ||
3468 | .key = { 0x7e, 0x24, 0x06, 0x78, 0x17, 0xfa, 0xe0, 0xd7, | ||
3469 | 0x43, 0xd6, 0xce, 0x1f, 0x32, 0x53, 0x91, 0x63, | ||
3470 | 0x00, 0x6c, 0xb6, 0xdb }, | ||
3471 | .klen = 20, | ||
3472 | .iv = { 0xc0, 0x54, 0x3b, 0x59, 0xda, 0x48, 0xd9, 0x0b }, | ||
3473 | .input = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
3474 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, | ||
3475 | 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, | ||
3476 | 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f }, | ||
3477 | .ilen = 32, | ||
3478 | .result = { 0x51, 0x04, 0xa1, 0x06, 0x16, 0x8a, 0x72, 0xd9, | ||
3479 | 0x79, 0x0d, 0x41, 0xee, 0x8e, 0xda, 0xd3, 0x88, | ||
3480 | 0xeb, 0x2e, 0x1e, 0xfc, 0x46, 0xda, 0x57, 0xc8, | ||
3481 | 0xfc, 0xe6, 0x30, 0xdf, 0x91, 0x41, 0xbe, 0x28 }, | ||
3482 | .rlen = 32, | ||
3483 | }, { | ||
3484 | .key = { 0x16, 0xaf, 0x5b, 0x14, 0x5f, 0xc9, 0xf5, 0x79, | ||
3485 | 0xc1, 0x75, 0xf9, 0x3e, 0x3b, 0xfb, 0x0e, 0xed, | ||
3486 | 0x86, 0x3d, 0x06, 0xcc, 0xfd, 0xb7, 0x85, 0x15, | ||
3487 | 0x00, 0x00, 0x00, 0x48 }, | ||
3488 | .klen = 28, | ||
3489 | .iv = { 0x36, 0x73, 0x3c, 0x14, 0x7d, 0x6d, 0x93, 0xcb }, | ||
3490 | .input = { "Single block msg" }, | ||
3491 | .ilen = 16, | ||
3492 | .result = { 0x4b, 0x55, 0x38, 0x4f, 0xe2, 0x59, 0xc9, 0xc8, | ||
3493 | 0x4e, 0x79, 0x35, 0xa0, 0x03, 0xcb, 0xe9, 0x28 }, | ||
3494 | .rlen = 16, | ||
3495 | }, { | ||
3496 | .key = { 0x7c, 0x5c, 0xb2, 0x40, 0x1b, 0x3d, 0xc3, 0x3c, | ||
3497 | 0x19, 0xe7, 0x34, 0x08, 0x19, 0xe0, 0xf6, 0x9c, | ||
3498 | 0x67, 0x8c, 0x3d, 0xb8, 0xe6, 0xf6, 0xa9, 0x1a, | ||
3499 | 0x00, 0x96, 0xb0, 0x3b }, | ||
3500 | .klen = 28, | ||
3501 | .iv = { 0x02, 0x0c, 0x6e, 0xad, 0xc2, 0xcb, 0x50, 0x0d }, | ||
3502 | .input = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
3503 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, | ||
3504 | 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, | ||
3505 | 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f }, | ||
3506 | .ilen = 32, | ||
3507 | .result = { 0x45, 0x32, 0x43, 0xfc, 0x60, 0x9b, 0x23, 0x32, | ||
3508 | 0x7e, 0xdf, 0xaa, 0xfa, 0x71, 0x31, 0xcd, 0x9f, | ||
3509 | 0x84, 0x90, 0x70, 0x1c, 0x5a, 0xd4, 0xa7, 0x9c, | ||
3510 | 0xfc, 0x1f, 0xe0, 0xff, 0x42, 0xf4, 0xfb, 0x00 }, | ||
3511 | .rlen = 32, | ||
3512 | }, { | ||
3513 | .key = { 0x77, 0x6b, 0xef, 0xf2, 0x85, 0x1d, 0xb0, 0x6f, | ||
3514 | 0x4c, 0x8a, 0x05, 0x42, 0xc8, 0x69, 0x6f, 0x6c, | ||
3515 | 0x6a, 0x81, 0xaf, 0x1e, 0xec, 0x96, 0xb4, 0xd3, | ||
3516 | 0x7f, 0xc1, 0xd6, 0x89, 0xe6, 0xc1, 0xc1, 0x04, | ||
3517 | 0x00, 0x00, 0x00, 0x60 }, | ||
3518 | .klen = 36, | ||
3519 | .iv = { 0xdb, 0x56, 0x72, 0xc9, 0x7a, 0xa8, 0xf0, 0xb2 }, | ||
3520 | .input = { "Single block msg" }, | ||
3521 | .ilen = 16, | ||
3522 | .result = { 0x14, 0x5a, 0xd0, 0x1d, 0xbf, 0x82, 0x4e, 0xc7, | ||
3523 | 0x56, 0x08, 0x63, 0xdc, 0x71, 0xe3, 0xe0, 0xc0 }, | ||
3524 | .rlen = 16, | ||
3525 | }, { | ||
3526 | .key = { 0xf6, 0xd6, 0x6d, 0x6b, 0xd5, 0x2d, 0x59, 0xbb, | ||
3527 | 0x07, 0x96, 0x36, 0x58, 0x79, 0xef, 0xf8, 0x86, | ||
3528 | 0xc6, 0x6d, 0xd5, 0x1a, 0x5b, 0x6a, 0x99, 0x74, | ||
3529 | 0x4b, 0x50, 0x59, 0x0c, 0x87, 0xa2, 0x38, 0x84, | ||
3530 | 0x00, 0xfa, 0xac, 0x24 }, | ||
3531 | .klen = 36, | ||
3532 | .iv = { 0xc1, 0x58, 0x5e, 0xf1, 0x5a, 0x43, 0xd8, 0x75 }, | ||
3533 | .input = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
3534 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, | ||
3535 | 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, | ||
3536 | 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f }, | ||
3537 | .ilen = 32, | ||
3538 | .result = { 0xf0, 0x5e, 0x23, 0x1b, 0x38, 0x94, 0x61, 0x2c, | ||
3539 | 0x49, 0xee, 0x00, 0x0b, 0x80, 0x4e, 0xb2, 0xa9, | ||
3540 | 0xb8, 0x30, 0x6b, 0x50, 0x8f, 0x83, 0x9d, 0x6a, | ||
3541 | 0x55, 0x30, 0x83, 0x1d, 0x93, 0x44, 0xaf, 0x1c }, | ||
3542 | .rlen = 32, | ||
3543 | }, { | ||
3544 | // generated using Crypto++ | ||
3545 | .key = { | ||
3546 | 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
3547 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, | ||
3548 | 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, | ||
3549 | 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, | ||
3550 | 0x00, 0x00, 0x00, 0x00, | ||
3551 | }, | ||
3552 | .klen = 32 + 4, | ||
3553 | .iv = { | ||
3554 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
3555 | }, | ||
3556 | .input = { | ||
3557 | 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
3558 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, | ||
3559 | 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, | ||
3560 | 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, | ||
3561 | 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, | ||
3562 | 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, | ||
3563 | 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, | ||
3564 | 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, | ||
3565 | 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, | ||
3566 | 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, | ||
3567 | 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, | ||
3568 | 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, | ||
3569 | 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, | ||
3570 | 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, | ||
3571 | 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, | ||
3572 | 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, | ||
3573 | 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, | ||
3574 | 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, | ||
3575 | 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, | ||
3576 | 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, | ||
3577 | 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, | ||
3578 | 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, | ||
3579 | 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, | ||
3580 | 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, | ||
3581 | 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, | ||
3582 | 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, | ||
3583 | 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, | ||
3584 | 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, | ||
3585 | 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, | ||
3586 | 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, | ||
3587 | 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, | ||
3588 | 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, | ||
3589 | 0x00, 0x03, 0x06, 0x09, 0x0c, 0x0f, 0x12, 0x15, | ||
3590 | 0x18, 0x1b, 0x1e, 0x21, 0x24, 0x27, 0x2a, 0x2d, | ||
3591 | 0x30, 0x33, 0x36, 0x39, 0x3c, 0x3f, 0x42, 0x45, | ||
3592 | 0x48, 0x4b, 0x4e, 0x51, 0x54, 0x57, 0x5a, 0x5d, | ||
3593 | 0x60, 0x63, 0x66, 0x69, 0x6c, 0x6f, 0x72, 0x75, | ||
3594 | 0x78, 0x7b, 0x7e, 0x81, 0x84, 0x87, 0x8a, 0x8d, | ||
3595 | 0x90, 0x93, 0x96, 0x99, 0x9c, 0x9f, 0xa2, 0xa5, | ||
3596 | 0xa8, 0xab, 0xae, 0xb1, 0xb4, 0xb7, 0xba, 0xbd, | ||
3597 | 0xc0, 0xc3, 0xc6, 0xc9, 0xcc, 0xcf, 0xd2, 0xd5, | ||
3598 | 0xd8, 0xdb, 0xde, 0xe1, 0xe4, 0xe7, 0xea, 0xed, | ||
3599 | 0xf0, 0xf3, 0xf6, 0xf9, 0xfc, 0xff, 0x02, 0x05, | ||
3600 | 0x08, 0x0b, 0x0e, 0x11, 0x14, 0x17, 0x1a, 0x1d, | ||
3601 | 0x20, 0x23, 0x26, 0x29, 0x2c, 0x2f, 0x32, 0x35, | ||
3602 | 0x38, 0x3b, 0x3e, 0x41, 0x44, 0x47, 0x4a, 0x4d, | ||
3603 | 0x50, 0x53, 0x56, 0x59, 0x5c, 0x5f, 0x62, 0x65, | ||
3604 | 0x68, 0x6b, 0x6e, 0x71, 0x74, 0x77, 0x7a, 0x7d, | ||
3605 | 0x80, 0x83, 0x86, 0x89, 0x8c, 0x8f, 0x92, 0x95, | ||
3606 | 0x98, 0x9b, 0x9e, 0xa1, 0xa4, 0xa7, 0xaa, 0xad, | ||
3607 | 0xb0, 0xb3, 0xb6, 0xb9, 0xbc, 0xbf, 0xc2, 0xc5, | ||
3608 | 0xc8, 0xcb, 0xce, 0xd1, 0xd4, 0xd7, 0xda, 0xdd, | ||
3609 | 0xe0, 0xe3, 0xe6, 0xe9, 0xec, 0xef, 0xf2, 0xf5, | ||
3610 | 0xf8, 0xfb, 0xfe, 0x01, 0x04, 0x07, 0x0a, 0x0d, | ||
3611 | 0x10, 0x13, 0x16, 0x19, 0x1c, 0x1f, 0x22, 0x25, | ||
3612 | 0x28, 0x2b, 0x2e, 0x31, 0x34, 0x37, 0x3a, 0x3d, | ||
3613 | 0x40, 0x43, 0x46, 0x49, 0x4c, 0x4f, 0x52, 0x55, | ||
3614 | 0x58, 0x5b, 0x5e, 0x61, 0x64, 0x67, 0x6a, 0x6d, | ||
3615 | 0x70, 0x73, 0x76, 0x79, 0x7c, 0x7f, 0x82, 0x85, | ||
3616 | 0x88, 0x8b, 0x8e, 0x91, 0x94, 0x97, 0x9a, 0x9d, | ||
3617 | 0xa0, 0xa3, 0xa6, 0xa9, 0xac, 0xaf, 0xb2, 0xb5, | ||
3618 | 0xb8, 0xbb, 0xbe, 0xc1, 0xc4, 0xc7, 0xca, 0xcd, | ||
3619 | 0xd0, 0xd3, 0xd6, 0xd9, 0xdc, 0xdf, 0xe2, 0xe5, | ||
3620 | 0xe8, 0xeb, 0xee, 0xf1, 0xf4, 0xf7, 0xfa, 0xfd, | ||
3621 | 0x00, 0x05, 0x0a, 0x0f, 0x14, 0x19, 0x1e, 0x23, | ||
3622 | 0x28, 0x2d, 0x32, 0x37, 0x3c, 0x41, 0x46, 0x4b, | ||
3623 | 0x50, 0x55, 0x5a, 0x5f, 0x64, 0x69, 0x6e, 0x73, | ||
3624 | 0x78, 0x7d, 0x82, 0x87, 0x8c, 0x91, 0x96, 0x9b, | ||
3625 | 0xa0, 0xa5, 0xaa, 0xaf, 0xb4, 0xb9, 0xbe, 0xc3, | ||
3626 | 0xc8, 0xcd, 0xd2, 0xd7, 0xdc, 0xe1, 0xe6, 0xeb, | ||
3627 | 0xf0, 0xf5, 0xfa, 0xff, 0x04, 0x09, 0x0e, 0x13, | ||
3628 | 0x18, 0x1d, 0x22, 0x27, 0x2c, 0x31, 0x36, 0x3b, | ||
3629 | 0x40, 0x45, 0x4a, 0x4f, 0x54, 0x59, 0x5e, 0x63, | ||
3630 | 0x68, 0x6d, 0x72, 0x77, 0x7c, 0x81, 0x86, 0x8b, | ||
3631 | 0x90, 0x95, 0x9a, 0x9f, 0xa4, 0xa9, 0xae, 0xb3, | ||
3632 | 0xb8, 0xbd, 0xc2, 0xc7, 0xcc, 0xd1, 0xd6, 0xdb, | ||
3633 | 0xe0, 0xe5, 0xea, 0xef, 0xf4, 0xf9, 0xfe, 0x03, | ||
3634 | 0x08, 0x0d, 0x12, 0x17, 0x1c, 0x21, 0x26, 0x2b, | ||
3635 | 0x30, 0x35, 0x3a, 0x3f, 0x44, 0x49, 0x4e, 0x53, | ||
3636 | 0x58, 0x5d, 0x62, 0x67, 0x6c, 0x71, 0x76, 0x7b, | ||
3637 | 0x80, 0x85, 0x8a, 0x8f, 0x94, 0x99, 0x9e, 0xa3, | ||
3638 | 0xa8, 0xad, 0xb2, 0xb7, 0xbc, 0xc1, 0xc6, 0xcb, | ||
3639 | 0xd0, 0xd5, 0xda, 0xdf, 0xe4, 0xe9, 0xee, 0xf3, | ||
3640 | 0xf8, 0xfd, 0x02, 0x07, 0x0c, 0x11, 0x16, 0x1b, | ||
3641 | 0x20, 0x25, 0x2a, 0x2f, 0x34, 0x39, 0x3e, 0x43, | ||
3642 | 0x48, 0x4d, 0x52, 0x57, 0x5c, 0x61, 0x66, 0x6b, | ||
3643 | 0x70, 0x75, 0x7a, 0x7f, 0x84, 0x89, 0x8e, 0x93, | ||
3644 | 0x98, 0x9d, 0xa2, 0xa7, 0xac, 0xb1, 0xb6, 0xbb, | ||
3645 | 0xc0, 0xc5, 0xca, 0xcf, 0xd4, 0xd9, 0xde, 0xe3, | ||
3646 | 0xe8, 0xed, 0xf2, 0xf7, 0xfc, 0x01, 0x06, 0x0b, | ||
3647 | 0x10, 0x15, 0x1a, 0x1f, 0x24, 0x29, 0x2e, 0x33, | ||
3648 | 0x38, 0x3d, 0x42, 0x47, 0x4c, 0x51, 0x56, 0x5b, | ||
3649 | 0x60, 0x65, 0x6a, 0x6f, 0x74, 0x79, 0x7e, 0x83, | ||
3650 | 0x88, 0x8d, 0x92, 0x97, 0x9c, 0xa1, 0xa6, 0xab, | ||
3651 | 0xb0, 0xb5, 0xba, 0xbf, 0xc4, 0xc9, 0xce, 0xd3, | ||
3652 | 0xd8, 0xdd, 0xe2, 0xe7, 0xec, 0xf1, 0xf6, 0xfb, | ||
3653 | 0x00, 0x07, 0x0e, 0x15, 0x1c, 0x23, 0x2a, 0x31, | ||
3654 | 0x38, 0x3f, 0x46, 0x4d, 0x54, 0x5b, 0x62, 0x69, | ||
3655 | 0x70, 0x77, 0x7e, 0x85, 0x8c, 0x93, 0x9a, 0xa1, | ||
3656 | 0xa8, 0xaf, 0xb6, 0xbd, 0xc4, 0xcb, 0xd2, 0xd9, | ||
3657 | 0xe0, 0xe7, 0xee, 0xf5, 0xfc, 0x03, 0x0a, 0x11, | ||
3658 | 0x18, 0x1f, 0x26, 0x2d, 0x34, 0x3b, 0x42, 0x49, | ||
3659 | 0x50, 0x57, 0x5e, 0x65, 0x6c, 0x73, 0x7a, 0x81, | ||
3660 | 0x88, 0x8f, 0x96, 0x9d, 0xa4, 0xab, 0xb2, 0xb9, | ||
3661 | 0xc0, 0xc7, 0xce, 0xd5, 0xdc, 0xe3, 0xea, 0xf1, | ||
3662 | 0xf8, 0xff, 0x06, 0x0d, 0x14, 0x1b, 0x22, 0x29, | ||
3663 | 0x30, 0x37, 0x3e, 0x45, 0x4c, 0x53, 0x5a, 0x61, | ||
3664 | 0x68, 0x6f, 0x76, 0x7d, 0x84, 0x8b, 0x92, 0x99, | ||
3665 | 0xa0, 0xa7, 0xae, 0xb5, 0xbc, 0xc3, 0xca, 0xd1, | ||
3666 | 0xd8, 0xdf, 0xe6, 0xed, 0xf4, 0xfb, 0x02, 0x09, | ||
3667 | 0x10, 0x17, 0x1e, 0x25, 0x2c, 0x33, 0x3a, 0x41, | ||
3668 | 0x48, 0x4f, 0x56, 0x5d, 0x64, 0x6b, 0x72, 0x79, | ||
3669 | 0x80, 0x87, 0x8e, 0x95, 0x9c, 0xa3, 0xaa, 0xb1, | ||
3670 | 0xb8, 0xbf, 0xc6, 0xcd, 0xd4, 0xdb, 0xe2, 0xe9, | ||
3671 | 0xf0, 0xf7, 0xfe, 0x05, 0x0c, 0x13, 0x1a, 0x21, | ||
3672 | 0x28, 0x2f, 0x36, 0x3d, 0x44, 0x4b, 0x52, 0x59, | ||
3673 | 0x60, 0x67, 0x6e, 0x75, 0x7c, 0x83, 0x8a, 0x91, | ||
3674 | 0x98, 0x9f, 0xa6, 0xad, 0xb4, 0xbb, 0xc2, 0xc9, | ||
3675 | 0xd0, 0xd7, 0xde, 0xe5, 0xec, 0xf3, 0xfa, 0x01, | ||
3676 | 0x08, 0x0f, 0x16, 0x1d, 0x24, 0x2b, 0x32, 0x39, | ||
3677 | 0x40, 0x47, 0x4e, 0x55, 0x5c, 0x63, 0x6a, 0x71, | ||
3678 | 0x78, 0x7f, 0x86, 0x8d, 0x94, 0x9b, 0xa2, 0xa9, | ||
3679 | 0xb0, 0xb7, 0xbe, 0xc5, 0xcc, 0xd3, 0xda, 0xe1, | ||
3680 | 0xe8, 0xef, 0xf6, 0xfd, 0x04, 0x0b, 0x12, 0x19, | ||
3681 | 0x20, 0x27, 0x2e, 0x35, 0x3c, 0x43, 0x4a, 0x51, | ||
3682 | 0x58, 0x5f, 0x66, 0x6d, 0x74, 0x7b, 0x82, 0x89, | ||
3683 | 0x90, 0x97, 0x9e, 0xa5, 0xac, 0xb3, 0xba, 0xc1, | ||
3684 | 0xc8, 0xcf, 0xd6, 0xdd, 0xe4, 0xeb, 0xf2, 0xf9, | ||
3685 | 0x00, 0x09, 0x12, 0x1b, 0x24, 0x2d, 0x36, 0x3f, | ||
3686 | 0x48, 0x51, 0x5a, 0x63, 0x6c, 0x75, 0x7e, 0x87, | ||
3687 | 0x90, 0x99, 0xa2, 0xab, 0xb4, 0xbd, 0xc6, 0xcf, | ||
3688 | 0xd8, 0xe1, 0xea, 0xf3, 0xfc, 0x05, 0x0e, 0x17, | ||
3689 | 0x20, 0x29, 0x32, 0x3b, 0x44, 0x4d, 0x56, 0x5f, | ||
3690 | 0x68, 0x71, 0x7a, 0x83, 0x8c, 0x95, 0x9e, 0xa7, | ||
3691 | 0xb0, 0xb9, 0xc2, 0xcb, 0xd4, 0xdd, 0xe6, 0xef, | ||
3692 | 0xf8, 0x01, 0x0a, 0x13, 0x1c, 0x25, 0x2e, 0x37, | ||
3693 | 0x40, 0x49, 0x52, 0x5b, 0x64, 0x6d, 0x76, 0x7f, | ||
3694 | 0x88, 0x91, 0x9a, 0xa3, 0xac, 0xb5, 0xbe, 0xc7, | ||
3695 | 0xd0, 0xd9, 0xe2, 0xeb, 0xf4, 0xfd, 0x06, 0x0f, | ||
3696 | 0x18, 0x21, 0x2a, 0x33, 0x3c, 0x45, 0x4e, 0x57, | ||
3697 | 0x60, 0x69, 0x72, 0x7b, 0x84, 0x8d, 0x96, 0x9f, | ||
3698 | 0xa8, 0xb1, 0xba, 0xc3, 0xcc, 0xd5, 0xde, 0xe7, | ||
3699 | 0xf0, 0xf9, 0x02, 0x0b, 0x14, 0x1d, 0x26, 0x2f, | ||
3700 | 0x38, 0x41, 0x4a, 0x53, 0x5c, 0x65, 0x6e, 0x77, | ||
3701 | 0x80, 0x89, 0x92, 0x9b, 0xa4, 0xad, 0xb6, 0xbf, | ||
3702 | 0xc8, 0xd1, 0xda, 0xe3, 0xec, 0xf5, 0xfe, 0x07, | ||
3703 | 0x10, 0x19, 0x22, 0x2b, 0x34, 0x3d, 0x46, 0x4f, | ||
3704 | 0x58, 0x61, 0x6a, 0x73, 0x7c, 0x85, 0x8e, 0x97, | ||
3705 | 0xa0, 0xa9, 0xb2, 0xbb, 0xc4, 0xcd, 0xd6, 0xdf, | ||
3706 | 0xe8, 0xf1, 0xfa, 0x03, 0x0c, 0x15, 0x1e, 0x27, | ||
3707 | 0x30, 0x39, 0x42, 0x4b, 0x54, 0x5d, 0x66, 0x6f, | ||
3708 | 0x78, 0x81, 0x8a, 0x93, 0x9c, 0xa5, 0xae, 0xb7, | ||
3709 | 0xc0, 0xc9, 0xd2, 0xdb, 0xe4, 0xed, 0xf6, 0xff, | ||
3710 | 0x08, 0x11, 0x1a, 0x23, 0x2c, 0x35, 0x3e, 0x47, | ||
3711 | 0x50, 0x59, 0x62, 0x6b, 0x74, 0x7d, 0x86, 0x8f, | ||
3712 | 0x98, 0xa1, 0xaa, 0xb3, 0xbc, 0xc5, 0xce, 0xd7, | ||
3713 | 0xe0, 0xe9, 0xf2, 0xfb, 0x04, 0x0d, 0x16, 0x1f, | ||
3714 | 0x28, 0x31, 0x3a, 0x43, 0x4c, 0x55, 0x5e, 0x67, | ||
3715 | 0x70, 0x79, 0x82, 0x8b, 0x94, 0x9d, 0xa6, 0xaf, | ||
3716 | 0xb8, 0xc1, 0xca, 0xd3, 0xdc, 0xe5, 0xee, 0xf7, | ||
3717 | 0x00, 0x0b, 0x16, 0x21, 0x2c, 0x37, 0x42, 0x4d, | ||
3718 | 0x58, 0x63, 0x6e, 0x79, 0x84, 0x8f, 0x9a, 0xa5, | ||
3719 | 0xb0, 0xbb, 0xc6, 0xd1, 0xdc, 0xe7, 0xf2, 0xfd, | ||
3720 | 0x08, 0x13, 0x1e, 0x29, 0x34, 0x3f, 0x4a, 0x55, | ||
3721 | 0x60, 0x6b, 0x76, 0x81, 0x8c, 0x97, 0xa2, 0xad, | ||
3722 | 0xb8, 0xc3, 0xce, 0xd9, 0xe4, 0xef, 0xfa, 0x05, | ||
3723 | 0x10, 0x1b, 0x26, 0x31, 0x3c, 0x47, 0x52, 0x5d, | ||
3724 | 0x68, 0x73, 0x7e, 0x89, 0x94, 0x9f, 0xaa, 0xb5, | ||
3725 | 0xc0, 0xcb, 0xd6, 0xe1, 0xec, 0xf7, 0x02, 0x0d, | ||
3726 | 0x18, 0x23, 0x2e, 0x39, 0x44, 0x4f, 0x5a, 0x65, | ||
3727 | 0x70, 0x7b, 0x86, 0x91, 0x9c, 0xa7, 0xb2, 0xbd, | ||
3728 | 0xc8, 0xd3, 0xde, 0xe9, 0xf4, 0xff, 0x0a, 0x15, | ||
3729 | 0x20, 0x2b, 0x36, 0x41, 0x4c, 0x57, 0x62, 0x6d, | ||
3730 | 0x78, 0x83, 0x8e, 0x99, 0xa4, 0xaf, 0xba, 0xc5, | ||
3731 | 0xd0, 0xdb, 0xe6, 0xf1, 0xfc, 0x07, 0x12, 0x1d, | ||
3732 | 0x28, 0x33, 0x3e, 0x49, 0x54, 0x5f, 0x6a, 0x75, | ||
3733 | 0x80, 0x8b, 0x96, 0xa1, 0xac, 0xb7, 0xc2, 0xcd, | ||
3734 | 0xd8, 0xe3, 0xee, 0xf9, 0x04, 0x0f, 0x1a, 0x25, | ||
3735 | 0x30, 0x3b, 0x46, 0x51, 0x5c, 0x67, 0x72, 0x7d, | ||
3736 | 0x88, 0x93, 0x9e, 0xa9, 0xb4, 0xbf, 0xca, 0xd5, | ||
3737 | 0xe0, 0xeb, 0xf6, 0x01, 0x0c, 0x17, 0x22, 0x2d, | ||
3738 | 0x38, 0x43, 0x4e, 0x59, 0x64, 0x6f, 0x7a, 0x85, | ||
3739 | 0x90, 0x9b, 0xa6, 0xb1, 0xbc, 0xc7, 0xd2, 0xdd, | ||
3740 | 0xe8, 0xf3, 0xfe, 0x09, 0x14, 0x1f, 0x2a, 0x35, | ||
3741 | 0x40, 0x4b, 0x56, 0x61, 0x6c, 0x77, 0x82, 0x8d, | ||
3742 | 0x98, 0xa3, 0xae, 0xb9, 0xc4, 0xcf, 0xda, 0xe5, | ||
3743 | 0xf0, 0xfb, 0x06, 0x11, 0x1c, 0x27, 0x32, 0x3d, | ||
3744 | 0x48, 0x53, 0x5e, 0x69, 0x74, 0x7f, 0x8a, 0x95, | ||
3745 | 0xa0, 0xab, 0xb6, 0xc1, 0xcc, 0xd7, 0xe2, 0xed, | ||
3746 | 0xf8, 0x03, 0x0e, 0x19, 0x24, 0x2f, 0x3a, 0x45, | ||
3747 | 0x50, 0x5b, 0x66, 0x71, 0x7c, 0x87, 0x92, 0x9d, | ||
3748 | 0xa8, 0xb3, 0xbe, 0xc9, 0xd4, 0xdf, 0xea, 0xf5, | ||
3749 | 0x00, 0x0d, 0x1a, 0x27, 0x34, 0x41, 0x4e, 0x5b, | ||
3750 | 0x68, 0x75, 0x82, 0x8f, 0x9c, 0xa9, 0xb6, 0xc3, | ||
3751 | 0xd0, 0xdd, 0xea, 0xf7, 0x04, 0x11, 0x1e, 0x2b, | ||
3752 | 0x38, 0x45, 0x52, 0x5f, 0x6c, 0x79, 0x86, 0x93, | ||
3753 | 0xa0, 0xad, 0xba, 0xc7, 0xd4, 0xe1, 0xee, 0xfb, | ||
3754 | 0x08, 0x15, 0x22, 0x2f, 0x3c, 0x49, 0x56, 0x63, | ||
3755 | 0x70, 0x7d, 0x8a, 0x97, 0xa4, 0xb1, 0xbe, 0xcb, | ||
3756 | 0xd8, 0xe5, 0xf2, 0xff, 0x0c, 0x19, 0x26, 0x33, | ||
3757 | 0x40, 0x4d, 0x5a, 0x67, 0x74, 0x81, 0x8e, 0x9b, | ||
3758 | 0xa8, 0xb5, 0xc2, 0xcf, 0xdc, 0xe9, 0xf6, 0x03, | ||
3759 | 0x10, 0x1d, 0x2a, 0x37, 0x44, 0x51, 0x5e, 0x6b, | ||
3760 | 0x78, 0x85, 0x92, 0x9f, 0xac, 0xb9, 0xc6, 0xd3, | ||
3761 | 0xe0, 0xed, 0xfa, 0x07, 0x14, 0x21, 0x2e, 0x3b, | ||
3762 | 0x48, 0x55, 0x62, 0x6f, 0x7c, 0x89, 0x96, 0xa3, | ||
3763 | 0xb0, 0xbd, 0xca, 0xd7, 0xe4, 0xf1, 0xfe, 0x0b, | ||
3764 | 0x18, 0x25, 0x32, 0x3f, 0x4c, 0x59, 0x66, 0x73, | ||
3765 | 0x80, 0x8d, 0x9a, 0xa7, 0xb4, 0xc1, 0xce, 0xdb, | ||
3766 | 0xe8, 0xf5, 0x02, 0x0f, 0x1c, 0x29, 0x36, 0x43, | ||
3767 | 0x50, 0x5d, 0x6a, 0x77, 0x84, 0x91, 0x9e, 0xab, | ||
3768 | 0xb8, 0xc5, 0xd2, 0xdf, 0xec, 0xf9, 0x06, 0x13, | ||
3769 | 0x20, 0x2d, 0x3a, 0x47, 0x54, 0x61, 0x6e, 0x7b, | ||
3770 | 0x88, 0x95, 0xa2, 0xaf, 0xbc, 0xc9, 0xd6, 0xe3, | ||
3771 | 0xf0, 0xfd, 0x0a, 0x17, 0x24, 0x31, 0x3e, 0x4b, | ||
3772 | 0x58, 0x65, 0x72, 0x7f, 0x8c, 0x99, 0xa6, 0xb3, | ||
3773 | 0xc0, 0xcd, 0xda, 0xe7, 0xf4, 0x01, 0x0e, 0x1b, | ||
3774 | 0x28, 0x35, 0x42, 0x4f, 0x5c, 0x69, 0x76, 0x83, | ||
3775 | 0x90, 0x9d, 0xaa, 0xb7, 0xc4, 0xd1, 0xde, 0xeb, | ||
3776 | 0xf8, 0x05, 0x12, 0x1f, 0x2c, 0x39, 0x46, 0x53, | ||
3777 | 0x60, 0x6d, 0x7a, 0x87, 0x94, 0xa1, 0xae, 0xbb, | ||
3778 | 0xc8, 0xd5, 0xe2, 0xef, 0xfc, 0x09, 0x16, 0x23, | ||
3779 | 0x30, 0x3d, 0x4a, 0x57, 0x64, 0x71, 0x7e, 0x8b, | ||
3780 | 0x98, 0xa5, 0xb2, 0xbf, 0xcc, 0xd9, 0xe6, 0xf3, | ||
3781 | 0x00, 0x0f, 0x1e, 0x2d, 0x3c, 0x4b, 0x5a, 0x69, | ||
3782 | 0x78, 0x87, 0x96, 0xa5, 0xb4, 0xc3, 0xd2, 0xe1, | ||
3783 | 0xf0, 0xff, 0x0e, 0x1d, 0x2c, 0x3b, 0x4a, 0x59, | ||
3784 | 0x68, 0x77, 0x86, 0x95, 0xa4, 0xb3, 0xc2, 0xd1, | ||
3785 | 0xe0, 0xef, 0xfe, 0x0d, 0x1c, 0x2b, 0x3a, 0x49, | ||
3786 | 0x58, 0x67, 0x76, 0x85, 0x94, 0xa3, 0xb2, 0xc1, | ||
3787 | 0xd0, 0xdf, 0xee, 0xfd, 0x0c, 0x1b, 0x2a, 0x39, | ||
3788 | 0x48, 0x57, 0x66, 0x75, 0x84, 0x93, 0xa2, 0xb1, | ||
3789 | 0xc0, 0xcf, 0xde, 0xed, 0xfc, 0x0b, 0x1a, 0x29, | ||
3790 | 0x38, 0x47, 0x56, 0x65, 0x74, 0x83, 0x92, 0xa1, | ||
3791 | 0xb0, 0xbf, 0xce, 0xdd, 0xec, 0xfb, 0x0a, 0x19, | ||
3792 | 0x28, 0x37, 0x46, 0x55, 0x64, 0x73, 0x82, 0x91, | ||
3793 | 0xa0, 0xaf, 0xbe, 0xcd, 0xdc, 0xeb, 0xfa, 0x09, | ||
3794 | 0x18, 0x27, 0x36, 0x45, 0x54, 0x63, 0x72, 0x81, | ||
3795 | 0x90, 0x9f, 0xae, 0xbd, 0xcc, 0xdb, 0xea, 0xf9, | ||
3796 | 0x08, 0x17, 0x26, 0x35, 0x44, 0x53, 0x62, 0x71, | ||
3797 | 0x80, 0x8f, 0x9e, 0xad, 0xbc, 0xcb, 0xda, 0xe9, | ||
3798 | 0xf8, 0x07, 0x16, 0x25, 0x34, 0x43, 0x52, 0x61, | ||
3799 | 0x70, 0x7f, 0x8e, 0x9d, 0xac, 0xbb, 0xca, 0xd9, | ||
3800 | 0xe8, 0xf7, 0x06, 0x15, 0x24, 0x33, 0x42, 0x51, | ||
3801 | 0x60, 0x6f, 0x7e, 0x8d, 0x9c, 0xab, 0xba, 0xc9, | ||
3802 | 0xd8, 0xe7, 0xf6, 0x05, 0x14, 0x23, 0x32, 0x41, | ||
3803 | 0x50, 0x5f, 0x6e, 0x7d, 0x8c, 0x9b, 0xaa, 0xb9, | ||
3804 | 0xc8, 0xd7, 0xe6, 0xf5, 0x04, 0x13, 0x22, 0x31, | ||
3805 | 0x40, 0x4f, 0x5e, 0x6d, 0x7c, 0x8b, 0x9a, 0xa9, | ||
3806 | 0xb8, 0xc7, 0xd6, 0xe5, 0xf4, 0x03, 0x12, 0x21, | ||
3807 | 0x30, 0x3f, 0x4e, 0x5d, 0x6c, 0x7b, 0x8a, 0x99, | ||
3808 | 0xa8, 0xb7, 0xc6, 0xd5, 0xe4, 0xf3, 0x02, 0x11, | ||
3809 | 0x20, 0x2f, 0x3e, 0x4d, 0x5c, 0x6b, 0x7a, 0x89, | ||
3810 | 0x98, 0xa7, 0xb6, 0xc5, 0xd4, 0xe3, 0xf2, 0x01, | ||
3811 | 0x10, 0x1f, 0x2e, 0x3d, 0x4c, 0x5b, 0x6a, 0x79, | ||
3812 | 0x88, 0x97, 0xa6, 0xb5, 0xc4, 0xd3, 0xe2, 0xf1, | ||
3813 | 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, | ||
3814 | 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, | ||
3815 | 0x10, 0x21, 0x32, 0x43, 0x54, 0x65, 0x76, 0x87, | ||
3816 | 0x98, 0xa9, 0xba, 0xcb, 0xdc, 0xed, 0xfe, 0x0f, | ||
3817 | 0x20, 0x31, 0x42, 0x53, 0x64, 0x75, 0x86, 0x97, | ||
3818 | 0xa8, 0xb9, 0xca, 0xdb, 0xec, 0xfd, 0x0e, 0x1f, | ||
3819 | 0x30, 0x41, 0x52, 0x63, 0x74, 0x85, 0x96, 0xa7, | ||
3820 | 0xb8, 0xc9, 0xda, 0xeb, 0xfc, 0x0d, 0x1e, 0x2f, | ||
3821 | 0x40, 0x51, 0x62, 0x73, 0x84, 0x95, 0xa6, 0xb7, | ||
3822 | 0xc8, 0xd9, 0xea, 0xfb, 0x0c, 0x1d, 0x2e, 0x3f, | ||
3823 | 0x50, 0x61, 0x72, 0x83, 0x94, 0xa5, 0xb6, 0xc7, | ||
3824 | 0xd8, 0xe9, 0xfa, 0x0b, 0x1c, 0x2d, 0x3e, 0x4f, | ||
3825 | 0x60, 0x71, 0x82, 0x93, 0xa4, 0xb5, 0xc6, 0xd7, | ||
3826 | 0xe8, 0xf9, 0x0a, 0x1b, 0x2c, 0x3d, 0x4e, 0x5f, | ||
3827 | 0x70, 0x81, 0x92, 0xa3, 0xb4, 0xc5, 0xd6, 0xe7, | ||
3828 | 0xf8, 0x09, 0x1a, 0x2b, 0x3c, 0x4d, 0x5e, 0x6f, | ||
3829 | 0x80, 0x91, 0xa2, 0xb3, 0xc4, 0xd5, 0xe6, 0xf7, | ||
3830 | 0x08, 0x19, 0x2a, 0x3b, 0x4c, 0x5d, 0x6e, 0x7f, | ||
3831 | 0x90, 0xa1, 0xb2, 0xc3, 0xd4, 0xe5, 0xf6, 0x07, | ||
3832 | 0x18, 0x29, 0x3a, 0x4b, 0x5c, 0x6d, 0x7e, 0x8f, | ||
3833 | 0xa0, 0xb1, 0xc2, 0xd3, 0xe4, 0xf5, 0x06, 0x17, | ||
3834 | 0x28, 0x39, 0x4a, 0x5b, 0x6c, 0x7d, 0x8e, 0x9f, | ||
3835 | 0xb0, 0xc1, 0xd2, 0xe3, 0xf4, 0x05, 0x16, 0x27, | ||
3836 | 0x38, 0x49, 0x5a, 0x6b, 0x7c, 0x8d, 0x9e, 0xaf, | ||
3837 | 0xc0, 0xd1, 0xe2, 0xf3, 0x04, 0x15, 0x26, 0x37, | ||
3838 | 0x48, 0x59, 0x6a, 0x7b, 0x8c, 0x9d, 0xae, 0xbf, | ||
3839 | 0xd0, 0xe1, 0xf2, 0x03, 0x14, 0x25, 0x36, 0x47, | ||
3840 | 0x58, 0x69, 0x7a, 0x8b, 0x9c, 0xad, 0xbe, 0xcf, | ||
3841 | 0xe0, 0xf1, 0x02, 0x13, 0x24, 0x35, 0x46, 0x57, | ||
3842 | 0x68, 0x79, 0x8a, 0x9b, 0xac, 0xbd, 0xce, 0xdf, | ||
3843 | 0xf0, 0x01, 0x12, 0x23, 0x34, 0x45, 0x56, 0x67, | ||
3844 | 0x78, 0x89, 0x9a, 0xab, 0xbc, 0xcd, 0xde, 0xef, | ||
3845 | 0x00, 0x13, 0x26, 0x39, 0x4c, 0x5f, 0x72, 0x85, | ||
3846 | 0x98, 0xab, 0xbe, 0xd1, 0xe4, 0xf7, 0x0a, 0x1d, | ||
3847 | 0x30, 0x43, 0x56, 0x69, 0x7c, 0x8f, 0xa2, 0xb5, | ||
3848 | 0xc8, 0xdb, 0xee, 0x01, 0x14, 0x27, 0x3a, 0x4d, | ||
3849 | 0x60, 0x73, 0x86, 0x99, 0xac, 0xbf, 0xd2, 0xe5, | ||
3850 | 0xf8, 0x0b, 0x1e, 0x31, 0x44, 0x57, 0x6a, 0x7d, | ||
3851 | 0x90, 0xa3, 0xb6, 0xc9, 0xdc, 0xef, 0x02, 0x15, | ||
3852 | 0x28, 0x3b, 0x4e, 0x61, 0x74, 0x87, 0x9a, 0xad, | ||
3853 | 0xc0, 0xd3, 0xe6, 0xf9, 0x0c, 0x1f, 0x32, 0x45, | ||
3854 | 0x58, 0x6b, 0x7e, 0x91, 0xa4, 0xb7, 0xca, 0xdd, | ||
3855 | 0xf0, 0x03, 0x16, 0x29, 0x3c, 0x4f, 0x62, 0x75, | ||
3856 | 0x88, 0x9b, 0xae, 0xc1, 0xd4, 0xe7, 0xfa, 0x0d, | ||
3857 | 0x20, 0x33, 0x46, 0x59, 0x6c, 0x7f, 0x92, 0xa5, | ||
3858 | 0xb8, 0xcb, 0xde, 0xf1, 0x04, 0x17, 0x2a, 0x3d, | ||
3859 | 0x50, 0x63, 0x76, 0x89, 0x9c, 0xaf, 0xc2, 0xd5, | ||
3860 | 0xe8, 0xfb, 0x0e, 0x21, 0x34, 0x47, 0x5a, 0x6d, | ||
3861 | 0x80, 0x93, 0xa6, 0xb9, 0xcc, 0xdf, 0xf2, 0x05, | ||
3862 | 0x18, 0x2b, 0x3e, 0x51, 0x64, 0x77, 0x8a, 0x9d, | ||
3863 | 0xb0, 0xc3, 0xd6, 0xe9, 0xfc, 0x0f, 0x22, 0x35, | ||
3864 | 0x48, 0x5b, 0x6e, 0x81, 0x94, 0xa7, 0xba, 0xcd, | ||
3865 | 0xe0, 0xf3, 0x06, 0x19, 0x2c, 0x3f, 0x52, 0x65, | ||
3866 | 0x78, 0x8b, 0x9e, 0xb1, 0xc4, 0xd7, 0xea, 0xfd, | ||
3867 | 0x10, 0x23, 0x36, 0x49, 0x5c, 0x6f, 0x82, 0x95, | ||
3868 | 0xa8, 0xbb, 0xce, 0xe1, 0xf4, 0x07, 0x1a, 0x2d, | ||
3869 | 0x40, 0x53, 0x66, 0x79, 0x8c, 0x9f, 0xb2, 0xc5, | ||
3870 | 0xd8, 0xeb, 0xfe, 0x11, 0x24, 0x37, 0x4a, 0x5d, | ||
3871 | 0x70, 0x83, 0x96, 0xa9, 0xbc, 0xcf, 0xe2, 0xf5, | ||
3872 | 0x08, 0x1b, 0x2e, 0x41, 0x54, 0x67, 0x7a, 0x8d, | ||
3873 | 0xa0, 0xb3, 0xc6, 0xd9, 0xec, 0xff, 0x12, 0x25, | ||
3874 | 0x38, 0x4b, 0x5e, 0x71, 0x84, 0x97, 0xaa, 0xbd, | ||
3875 | 0xd0, 0xe3, 0xf6, 0x09, 0x1c, 0x2f, 0x42, 0x55, | ||
3876 | 0x68, 0x7b, 0x8e, 0xa1, 0xb4, 0xc7, 0xda, 0xed, | ||
3877 | 0x00, 0x15, 0x2a, 0x3f, 0x54, 0x69, 0x7e, 0x93, | ||
3878 | 0xa8, 0xbd, 0xd2, 0xe7, 0xfc, 0x11, 0x26, 0x3b, | ||
3879 | 0x50, 0x65, 0x7a, 0x8f, 0xa4, 0xb9, 0xce, 0xe3, | ||
3880 | 0xf8, 0x0d, 0x22, 0x37, 0x4c, 0x61, 0x76, 0x8b, | ||
3881 | 0xa0, 0xb5, 0xca, 0xdf, 0xf4, 0x09, 0x1e, 0x33, | ||
3882 | 0x48, 0x5d, 0x72, 0x87, 0x9c, 0xb1, 0xc6, 0xdb, | ||
3883 | 0xf0, 0x05, 0x1a, 0x2f, 0x44, 0x59, 0x6e, 0x83, | ||
3884 | 0x98, 0xad, 0xc2, 0xd7, 0xec, 0x01, 0x16, 0x2b, | ||
3885 | 0x40, 0x55, 0x6a, 0x7f, 0x94, 0xa9, 0xbe, 0xd3, | ||
3886 | 0xe8, 0xfd, 0x12, 0x27, 0x3c, 0x51, 0x66, 0x7b, | ||
3887 | 0x90, 0xa5, 0xba, 0xcf, 0xe4, 0xf9, 0x0e, 0x23, | ||
3888 | 0x38, 0x4d, 0x62, 0x77, 0x8c, 0xa1, 0xb6, 0xcb, | ||
3889 | 0xe0, 0xf5, 0x0a, 0x1f, 0x34, 0x49, 0x5e, 0x73, | ||
3890 | 0x88, 0x9d, 0xb2, 0xc7, 0xdc, 0xf1, 0x06, 0x1b, | ||
3891 | 0x30, 0x45, 0x5a, 0x6f, 0x84, 0x99, 0xae, 0xc3, | ||
3892 | 0xd8, 0xed, 0x02, 0x17, 0x2c, 0x41, 0x56, 0x6b, | ||
3893 | 0x80, 0x95, 0xaa, 0xbf, 0xd4, 0xe9, 0xfe, 0x13, | ||
3894 | 0x28, 0x3d, 0x52, 0x67, 0x7c, 0x91, 0xa6, 0xbb, | ||
3895 | 0xd0, 0xe5, 0xfa, 0x0f, 0x24, 0x39, 0x4e, 0x63, | ||
3896 | 0x78, 0x8d, 0xa2, 0xb7, 0xcc, 0xe1, 0xf6, 0x0b, | ||
3897 | 0x20, 0x35, 0x4a, 0x5f, 0x74, 0x89, 0x9e, 0xb3, | ||
3898 | 0xc8, 0xdd, 0xf2, 0x07, 0x1c, 0x31, 0x46, 0x5b, | ||
3899 | 0x70, 0x85, 0x9a, 0xaf, 0xc4, 0xd9, 0xee, 0x03, | ||
3900 | 0x18, 0x2d, 0x42, 0x57, 0x6c, 0x81, 0x96, 0xab, | ||
3901 | 0xc0, 0xd5, 0xea, 0xff, 0x14, 0x29, 0x3e, 0x53, | ||
3902 | 0x68, 0x7d, 0x92, 0xa7, 0xbc, 0xd1, 0xe6, 0xfb, | ||
3903 | 0x10, 0x25, 0x3a, 0x4f, 0x64, 0x79, 0x8e, 0xa3, | ||
3904 | 0xb8, 0xcd, 0xe2, 0xf7, 0x0c, 0x21, 0x36, 0x4b, | ||
3905 | 0x60, 0x75, 0x8a, 0x9f, 0xb4, 0xc9, 0xde, 0xf3, | ||
3906 | 0x08, 0x1d, 0x32, 0x47, 0x5c, 0x71, 0x86, 0x9b, | ||
3907 | 0xb0, 0xc5, 0xda, 0xef, 0x04, 0x19, 0x2e, 0x43, | ||
3908 | 0x58, 0x6d, 0x82, 0x97, 0xac, 0xc1, 0xd6, 0xeb, | ||
3909 | 0x00, 0x17, 0x2e, 0x45, 0x5c, 0x73, 0x8a, 0xa1, | ||
3910 | 0xb8, 0xcf, 0xe6, 0xfd, 0x14, 0x2b, 0x42, 0x59, | ||
3911 | 0x70, 0x87, 0x9e, 0xb5, 0xcc, 0xe3, 0xfa, 0x11, | ||
3912 | 0x28, 0x3f, 0x56, 0x6d, 0x84, 0x9b, 0xb2, 0xc9, | ||
3913 | 0xe0, 0xf7, 0x0e, 0x25, 0x3c, 0x53, 0x6a, 0x81, | ||
3914 | 0x98, 0xaf, 0xc6, 0xdd, 0xf4, 0x0b, 0x22, 0x39, | ||
3915 | 0x50, 0x67, 0x7e, 0x95, 0xac, 0xc3, 0xda, 0xf1, | ||
3916 | 0x08, 0x1f, 0x36, 0x4d, 0x64, 0x7b, 0x92, 0xa9, | ||
3917 | 0xc0, 0xd7, 0xee, 0x05, 0x1c, 0x33, 0x4a, 0x61, | ||
3918 | 0x78, 0x8f, 0xa6, 0xbd, 0xd4, 0xeb, 0x02, 0x19, | ||
3919 | 0x30, 0x47, 0x5e, 0x75, 0x8c, 0xa3, 0xba, 0xd1, | ||
3920 | 0xe8, 0xff, 0x16, 0x2d, 0x44, 0x5b, 0x72, 0x89, | ||
3921 | 0xa0, 0xb7, 0xce, 0xe5, 0xfc, 0x13, 0x2a, 0x41, | ||
3922 | 0x58, 0x6f, 0x86, 0x9d, 0xb4, 0xcb, 0xe2, 0xf9, | ||
3923 | 0x10, 0x27, 0x3e, 0x55, 0x6c, 0x83, 0x9a, 0xb1, | ||
3924 | 0xc8, 0xdf, 0xf6, 0x0d, 0x24, 0x3b, 0x52, 0x69, | ||
3925 | 0x80, 0x97, 0xae, 0xc5, 0xdc, 0xf3, 0x0a, 0x21, | ||
3926 | 0x38, 0x4f, 0x66, 0x7d, 0x94, 0xab, 0xc2, 0xd9, | ||
3927 | 0xf0, 0x07, 0x1e, 0x35, 0x4c, 0x63, 0x7a, 0x91, | ||
3928 | 0xa8, 0xbf, 0xd6, 0xed, 0x04, 0x1b, 0x32, 0x49, | ||
3929 | 0x60, 0x77, 0x8e, 0xa5, 0xbc, 0xd3, 0xea, 0x01, | ||
3930 | 0x18, 0x2f, 0x46, 0x5d, 0x74, 0x8b, 0xa2, 0xb9, | ||
3931 | 0xd0, 0xe7, 0xfe, 0x15, 0x2c, 0x43, 0x5a, 0x71, | ||
3932 | 0x88, 0x9f, 0xb6, 0xcd, 0xe4, 0xfb, 0x12, 0x29, | ||
3933 | 0x40, 0x57, 0x6e, 0x85, 0x9c, 0xb3, 0xca, 0xe1, | ||
3934 | 0xf8, 0x0f, 0x26, 0x3d, 0x54, 0x6b, 0x82, 0x99, | ||
3935 | 0xb0, 0xc7, 0xde, 0xf5, 0x0c, 0x23, 0x3a, 0x51, | ||
3936 | 0x68, 0x7f, 0x96, 0xad, 0xc4, 0xdb, 0xf2, 0x09, | ||
3937 | 0x20, 0x37, 0x4e, 0x65, 0x7c, 0x93, 0xaa, 0xc1, | ||
3938 | 0xd8, 0xef, 0x06, 0x1d, 0x34, 0x4b, 0x62, 0x79, | ||
3939 | 0x90, 0xa7, 0xbe, 0xd5, 0xec, 0x03, 0x1a, 0x31, | ||
3940 | 0x48, 0x5f, 0x76, 0x8d, 0xa4, 0xbb, 0xd2, 0xe9, | ||
3941 | 0x00, 0x19, 0x32, 0x4b, 0x64, 0x7d, 0x96, 0xaf, | ||
3942 | 0xc8, 0xe1, 0xfa, 0x13, 0x2c, 0x45, 0x5e, 0x77, | ||
3943 | 0x90, 0xa9, 0xc2, 0xdb, 0xf4, 0x0d, 0x26, 0x3f, | ||
3944 | 0x58, 0x71, 0x8a, 0xa3, 0xbc, 0xd5, 0xee, 0x07, | ||
3945 | 0x20, 0x39, 0x52, 0x6b, 0x84, 0x9d, 0xb6, 0xcf, | ||
3946 | 0xe8, 0x01, 0x1a, 0x33, 0x4c, 0x65, 0x7e, 0x97, | ||
3947 | 0xb0, 0xc9, 0xe2, 0xfb, 0x14, 0x2d, 0x46, 0x5f, | ||
3948 | 0x78, 0x91, 0xaa, 0xc3, 0xdc, 0xf5, 0x0e, 0x27, | ||
3949 | 0x40, 0x59, 0x72, 0x8b, 0xa4, 0xbd, 0xd6, 0xef, | ||
3950 | 0x08, 0x21, 0x3a, 0x53, 0x6c, 0x85, 0x9e, 0xb7, | ||
3951 | 0xd0, 0xe9, 0x02, 0x1b, 0x34, 0x4d, 0x66, 0x7f, | ||
3952 | 0x98, 0xb1, 0xca, 0xe3, 0xfc, 0x15, 0x2e, 0x47, | ||
3953 | 0x60, 0x79, 0x92, 0xab, 0xc4, 0xdd, 0xf6, 0x0f, | ||
3954 | 0x28, 0x41, 0x5a, 0x73, 0x8c, 0xa5, 0xbe, 0xd7, | ||
3955 | 0xf0, 0x09, 0x22, 0x3b, 0x54, 0x6d, 0x86, 0x9f, | ||
3956 | 0xb8, 0xd1, 0xea, 0x03, 0x1c, 0x35, 0x4e, 0x67, | ||
3957 | 0x80, 0x99, 0xb2, 0xcb, 0xe4, 0xfd, 0x16, 0x2f, | ||
3958 | 0x48, 0x61, 0x7a, 0x93, 0xac, 0xc5, 0xde, 0xf7, | ||
3959 | 0x10, 0x29, 0x42, 0x5b, 0x74, 0x8d, 0xa6, 0xbf, | ||
3960 | 0xd8, 0xf1, 0x0a, 0x23, 0x3c, 0x55, 0x6e, 0x87, | ||
3961 | 0xa0, 0xb9, 0xd2, 0xeb, 0x04, 0x1d, 0x36, 0x4f, | ||
3962 | 0x68, 0x81, 0x9a, 0xb3, 0xcc, 0xe5, 0xfe, 0x17, | ||
3963 | 0x30, 0x49, 0x62, 0x7b, 0x94, 0xad, 0xc6, 0xdf, | ||
3964 | 0xf8, 0x11, 0x2a, 0x43, 0x5c, 0x75, 0x8e, 0xa7, | ||
3965 | 0xc0, 0xd9, 0xf2, 0x0b, 0x24, 0x3d, 0x56, 0x6f, | ||
3966 | 0x88, 0xa1, 0xba, 0xd3, 0xec, 0x05, 0x1e, 0x37, | ||
3967 | 0x50, 0x69, 0x82, 0x9b, 0xb4, 0xcd, 0xe6, 0xff, | ||
3968 | 0x18, 0x31, 0x4a, 0x63, 0x7c, 0x95, 0xae, 0xc7, | ||
3969 | 0xe0, 0xf9, 0x12, 0x2b, 0x44, 0x5d, 0x76, 0x8f, | ||
3970 | 0xa8, 0xc1, 0xda, 0xf3, 0x0c, 0x25, 0x3e, 0x57, | ||
3971 | 0x70, 0x89, 0xa2, 0xbb, 0xd4, 0xed, 0x06, 0x1f, | ||
3972 | 0x38, 0x51, 0x6a, 0x83, 0x9c, 0xb5, 0xce, 0xe7, | ||
3973 | 0x00, 0x1b, 0x36, 0x51, 0x6c, 0x87, 0xa2, 0xbd, | ||
3974 | 0xd8, 0xf3, 0x0e, 0x29, 0x44, 0x5f, 0x7a, 0x95, | ||
3975 | 0xb0, 0xcb, 0xe6, 0x01, 0x1c, 0x37, 0x52, 0x6d, | ||
3976 | 0x88, 0xa3, 0xbe, 0xd9, 0xf4, 0x0f, 0x2a, 0x45, | ||
3977 | 0x60, 0x7b, 0x96, 0xb1, 0xcc, 0xe7, 0x02, 0x1d, | ||
3978 | 0x38, 0x53, 0x6e, 0x89, 0xa4, 0xbf, 0xda, 0xf5, | ||
3979 | 0x10, 0x2b, 0x46, 0x61, 0x7c, 0x97, 0xb2, 0xcd, | ||
3980 | 0xe8, 0x03, 0x1e, 0x39, 0x54, 0x6f, 0x8a, 0xa5, | ||
3981 | 0xc0, 0xdb, 0xf6, 0x11, 0x2c, 0x47, 0x62, 0x7d, | ||
3982 | 0x98, 0xb3, 0xce, 0xe9, 0x04, 0x1f, 0x3a, 0x55, | ||
3983 | 0x70, 0x8b, 0xa6, 0xc1, 0xdc, 0xf7, 0x12, 0x2d, | ||
3984 | 0x48, 0x63, 0x7e, 0x99, 0xb4, 0xcf, 0xea, 0x05, | ||
3985 | 0x20, 0x3b, 0x56, 0x71, 0x8c, 0xa7, 0xc2, 0xdd, | ||
3986 | 0xf8, 0x13, 0x2e, 0x49, 0x64, 0x7f, 0x9a, 0xb5, | ||
3987 | 0xd0, 0xeb, 0x06, 0x21, 0x3c, 0x57, 0x72, 0x8d, | ||
3988 | 0xa8, 0xc3, 0xde, 0xf9, 0x14, 0x2f, 0x4a, 0x65, | ||
3989 | 0x80, 0x9b, 0xb6, 0xd1, 0xec, 0x07, 0x22, 0x3d, | ||
3990 | 0x58, 0x73, 0x8e, 0xa9, 0xc4, 0xdf, 0xfa, 0x15, | ||
3991 | 0x30, 0x4b, 0x66, 0x81, 0x9c, 0xb7, 0xd2, 0xed, | ||
3992 | 0x08, 0x23, 0x3e, 0x59, 0x74, 0x8f, 0xaa, 0xc5, | ||
3993 | 0xe0, 0xfb, 0x16, 0x31, 0x4c, 0x67, 0x82, 0x9d, | ||
3994 | 0xb8, 0xd3, 0xee, 0x09, 0x24, 0x3f, 0x5a, 0x75, | ||
3995 | 0x90, 0xab, 0xc6, 0xe1, 0xfc, 0x17, 0x32, 0x4d, | ||
3996 | 0x68, 0x83, 0x9e, 0xb9, 0xd4, 0xef, 0x0a, 0x25, | ||
3997 | 0x40, 0x5b, 0x76, 0x91, 0xac, 0xc7, 0xe2, 0xfd, | ||
3998 | 0x18, 0x33, 0x4e, 0x69, 0x84, 0x9f, 0xba, 0xd5, | ||
3999 | 0xf0, 0x0b, 0x26, 0x41, 0x5c, 0x77, 0x92, 0xad, | ||
4000 | 0xc8, 0xe3, 0xfe, 0x19, 0x34, 0x4f, 0x6a, 0x85, | ||
4001 | 0xa0, 0xbb, 0xd6, 0xf1, 0x0c, 0x27, 0x42, 0x5d, | ||
4002 | 0x78, 0x93, 0xae, 0xc9, 0xe4, 0xff, 0x1a, 0x35, | ||
4003 | 0x50, 0x6b, 0x86, 0xa1, 0xbc, 0xd7, 0xf2, 0x0d, | ||
4004 | 0x28, 0x43, 0x5e, 0x79, 0x94, 0xaf, 0xca, 0xe5, | ||
4005 | 0x00, 0x1d, 0x3a, 0x57, 0x74, 0x91, 0xae, 0xcb, | ||
4006 | 0xe8, 0x05, 0x22, 0x3f, 0x5c, 0x79, 0x96, 0xb3, | ||
4007 | 0xd0, 0xed, 0x0a, 0x27, 0x44, 0x61, 0x7e, 0x9b, | ||
4008 | 0xb8, 0xd5, 0xf2, 0x0f, 0x2c, 0x49, 0x66, 0x83, | ||
4009 | 0xa0, 0xbd, 0xda, 0xf7, 0x14, 0x31, 0x4e, 0x6b, | ||
4010 | 0x88, 0xa5, 0xc2, 0xdf, 0xfc, 0x19, 0x36, 0x53, | ||
4011 | 0x70, 0x8d, 0xaa, 0xc7, 0xe4, 0x01, 0x1e, 0x3b, | ||
4012 | 0x58, 0x75, 0x92, 0xaf, 0xcc, 0xe9, 0x06, 0x23, | ||
4013 | 0x40, 0x5d, 0x7a, 0x97, 0xb4, 0xd1, 0xee, 0x0b, | ||
4014 | 0x28, 0x45, 0x62, 0x7f, 0x9c, 0xb9, 0xd6, 0xf3, | ||
4015 | 0x10, 0x2d, 0x4a, 0x67, 0x84, 0xa1, 0xbe, 0xdb, | ||
4016 | 0xf8, 0x15, 0x32, 0x4f, 0x6c, 0x89, 0xa6, 0xc3, | ||
4017 | 0xe0, 0xfd, 0x1a, 0x37, 0x54, 0x71, 0x8e, 0xab, | ||
4018 | 0xc8, 0xe5, 0x02, 0x1f, 0x3c, 0x59, 0x76, 0x93, | ||
4019 | 0xb0, 0xcd, 0xea, 0x07, 0x24, 0x41, 0x5e, 0x7b, | ||
4020 | 0x98, 0xb5, 0xd2, 0xef, 0x0c, 0x29, 0x46, 0x63, | ||
4021 | 0x80, 0x9d, 0xba, 0xd7, 0xf4, 0x11, 0x2e, 0x4b, | ||
4022 | 0x68, 0x85, 0xa2, 0xbf, 0xdc, 0xf9, 0x16, 0x33, | ||
4023 | 0x50, 0x6d, 0x8a, 0xa7, 0xc4, 0xe1, 0xfe, 0x1b, | ||
4024 | 0x38, 0x55, 0x72, 0x8f, 0xac, 0xc9, 0xe6, 0x03, | ||
4025 | 0x20, 0x3d, 0x5a, 0x77, 0x94, 0xb1, 0xce, 0xeb, | ||
4026 | 0x08, 0x25, 0x42, 0x5f, 0x7c, 0x99, 0xb6, 0xd3, | ||
4027 | 0xf0, 0x0d, 0x2a, 0x47, 0x64, 0x81, 0x9e, 0xbb, | ||
4028 | 0xd8, 0xf5, 0x12, 0x2f, 0x4c, 0x69, 0x86, 0xa3, | ||
4029 | 0xc0, 0xdd, 0xfa, 0x17, 0x34, 0x51, 0x6e, 0x8b, | ||
4030 | 0xa8, 0xc5, 0xe2, 0xff, 0x1c, 0x39, 0x56, 0x73, | ||
4031 | 0x90, 0xad, 0xca, 0xe7, 0x04, 0x21, 0x3e, 0x5b, | ||
4032 | 0x78, 0x95, 0xb2, 0xcf, 0xec, 0x09, 0x26, 0x43, | ||
4033 | 0x60, 0x7d, 0x9a, 0xb7, 0xd4, 0xf1, 0x0e, 0x2b, | ||
4034 | 0x48, 0x65, 0x82, 0x9f, 0xbc, 0xd9, 0xf6, 0x13, | ||
4035 | 0x30, 0x4d, 0x6a, 0x87, 0xa4, 0xc1, 0xde, 0xfb, | ||
4036 | 0x18, 0x35, 0x52, 0x6f, 0x8c, 0xa9, 0xc6, 0xe3, | ||
4037 | 0x00, 0x1f, 0x3e, 0x5d, 0x7c, 0x9b, 0xba, 0xd9, | ||
4038 | 0xf8, 0x17, 0x36, 0x55, 0x74, 0x93, 0xb2, 0xd1, | ||
4039 | 0xf0, 0x0f, 0x2e, 0x4d, 0x6c, 0x8b, 0xaa, 0xc9, | ||
4040 | 0xe8, 0x07, 0x26, 0x45, 0x64, 0x83, 0xa2, 0xc1, | ||
4041 | 0xe0, 0xff, 0x1e, 0x3d, 0x5c, 0x7b, 0x9a, 0xb9, | ||
4042 | 0xd8, 0xf7, 0x16, 0x35, 0x54, 0x73, 0x92, 0xb1, | ||
4043 | 0xd0, 0xef, 0x0e, 0x2d, 0x4c, 0x6b, 0x8a, 0xa9, | ||
4044 | 0xc8, 0xe7, 0x06, 0x25, 0x44, 0x63, 0x82, 0xa1, | ||
4045 | 0xc0, 0xdf, 0xfe, 0x1d, 0x3c, 0x5b, 0x7a, 0x99, | ||
4046 | 0xb8, 0xd7, 0xf6, 0x15, 0x34, 0x53, 0x72, 0x91, | ||
4047 | 0xb0, 0xcf, 0xee, 0x0d, 0x2c, 0x4b, 0x6a, 0x89, | ||
4048 | 0xa8, 0xc7, 0xe6, 0x05, 0x24, 0x43, 0x62, 0x81, | ||
4049 | 0xa0, 0xbf, 0xde, 0xfd, 0x1c, 0x3b, 0x5a, 0x79, | ||
4050 | 0x98, 0xb7, 0xd6, 0xf5, 0x14, 0x33, 0x52, 0x71, | ||
4051 | 0x90, 0xaf, 0xce, 0xed, 0x0c, 0x2b, 0x4a, 0x69, | ||
4052 | 0x88, 0xa7, 0xc6, 0xe5, 0x04, 0x23, 0x42, 0x61, | ||
4053 | 0x80, 0x9f, 0xbe, 0xdd, 0xfc, 0x1b, 0x3a, 0x59, | ||
4054 | 0x78, 0x97, 0xb6, 0xd5, 0xf4, 0x13, 0x32, 0x51, | ||
4055 | 0x70, 0x8f, 0xae, 0xcd, 0xec, 0x0b, 0x2a, 0x49, | ||
4056 | 0x68, 0x87, 0xa6, 0xc5, 0xe4, 0x03, 0x22, 0x41, | ||
4057 | 0x60, 0x7f, 0x9e, 0xbd, 0xdc, 0xfb, 0x1a, 0x39, | ||
4058 | 0x58, 0x77, 0x96, 0xb5, 0xd4, 0xf3, 0x12, 0x31, | ||
4059 | 0x50, 0x6f, 0x8e, 0xad, 0xcc, 0xeb, 0x0a, 0x29, | ||
4060 | 0x48, 0x67, 0x86, 0xa5, 0xc4, 0xe3, 0x02, 0x21, | ||
4061 | 0x40, 0x5f, 0x7e, 0x9d, 0xbc, 0xdb, 0xfa, 0x19, | ||
4062 | 0x38, 0x57, 0x76, 0x95, 0xb4, 0xd3, 0xf2, 0x11, | ||
4063 | 0x30, 0x4f, 0x6e, 0x8d, 0xac, 0xcb, 0xea, 0x09, | ||
4064 | 0x28, 0x47, 0x66, 0x85, 0xa4, 0xc3, 0xe2, 0x01, | ||
4065 | 0x20, 0x3f, 0x5e, 0x7d, 0x9c, 0xbb, 0xda, 0xf9, | ||
4066 | 0x18, 0x37, 0x56, 0x75, 0x94, 0xb3, 0xd2, 0xf1, | ||
4067 | 0x10, 0x2f, 0x4e, 0x6d, 0x8c, 0xab, 0xca, 0xe9, | ||
4068 | 0x08, 0x27, 0x46, 0x65, 0x84, 0xa3, 0xc2, 0xe1, | ||
4069 | 0x00, 0x21, 0x42, 0x63, | ||
4070 | }, | ||
4071 | .ilen = 4100, | ||
4072 | .result = { | ||
4073 | 0xf0, 0x5c, 0x74, 0xad, 0x4e, 0xbc, 0x99, 0xe2, | ||
4074 | 0xae, 0xff, 0x91, 0x3a, 0x44, 0xcf, 0x38, 0x32, | ||
4075 | 0x1e, 0xad, 0xa7, 0xcd, 0xa1, 0x39, 0x95, 0xaa, | ||
4076 | 0x10, 0xb1, 0xb3, 0x2e, 0x04, 0x31, 0x8f, 0x86, | ||
4077 | 0xf2, 0x62, 0x74, 0x70, 0x0c, 0xa4, 0x46, 0x08, | ||
4078 | 0xa8, 0xb7, 0x99, 0xa8, 0xe9, 0xd2, 0x73, 0x79, | ||
4079 | 0x7e, 0x6e, 0xd4, 0x8f, 0x1e, 0xc7, 0x8e, 0x31, | ||
4080 | 0x0b, 0xfa, 0x4b, 0xce, 0xfd, 0xf3, 0x57, 0x71, | ||
4081 | 0xe9, 0x46, 0x03, 0xa5, 0x3d, 0x34, 0x00, 0xe2, | ||
4082 | 0x18, 0xff, 0x75, 0x6d, 0x06, 0x2d, 0x00, 0xab, | ||
4083 | 0xb9, 0x3e, 0x6c, 0x59, 0xc5, 0x84, 0x06, 0xb5, | ||
4084 | 0x8b, 0xd0, 0x89, 0x9c, 0x4a, 0x79, 0x16, 0xc6, | ||
4085 | 0x3d, 0x74, 0x54, 0xfa, 0x44, 0xcd, 0x23, 0x26, | ||
4086 | 0x5c, 0xcf, 0x7e, 0x28, 0x92, 0x32, 0xbf, 0xdf, | ||
4087 | 0xa7, 0x20, 0x3c, 0x74, 0x58, 0x2a, 0x9a, 0xde, | ||
4088 | 0x61, 0x00, 0x1c, 0x4f, 0xff, 0x59, 0xc4, 0x22, | ||
4089 | 0xac, 0x3c, 0xd0, 0xe8, 0x6c, 0xf9, 0x97, 0x1b, | ||
4090 | 0x58, 0x9b, 0xad, 0x71, 0xe8, 0xa9, 0xb5, 0x0d, | ||
4091 | 0xee, 0x2f, 0x04, 0x1f, 0x7f, 0xbc, 0x99, 0xee, | ||
4092 | 0x84, 0xff, 0x42, 0x60, 0xdc, 0x3a, 0x18, 0xa5, | ||
4093 | 0x81, 0xf9, 0xef, 0xdc, 0x7a, 0x0f, 0x65, 0x41, | ||
4094 | 0x2f, 0xa3, 0xd3, 0xf9, 0xc2, 0xcb, 0xc0, 0x4d, | ||
4095 | 0x8f, 0xd3, 0x76, 0x96, 0xad, 0x49, 0x6d, 0x38, | ||
4096 | 0x3d, 0x39, 0x0b, 0x6c, 0x80, 0xb7, 0x54, 0x69, | ||
4097 | 0xf0, 0x2c, 0x90, 0x02, 0x29, 0x0d, 0x1c, 0x12, | ||
4098 | 0xad, 0x55, 0xc3, 0x8b, 0x68, 0xd9, 0xcc, 0xb3, | ||
4099 | 0xb2, 0x64, 0x33, 0x90, 0x5e, 0xca, 0x4b, 0xe2, | ||
4100 | 0xfb, 0x75, 0xdc, 0x63, 0xf7, 0x9f, 0x82, 0x74, | ||
4101 | 0xf0, 0xc9, 0xaa, 0x7f, 0xe9, 0x2a, 0x9b, 0x33, | ||
4102 | 0xbc, 0x88, 0x00, 0x7f, 0xca, 0xb2, 0x1f, 0x14, | ||
4103 | 0xdb, 0xc5, 0x8e, 0x7b, 0x11, 0x3c, 0x3e, 0x08, | ||
4104 | 0xf3, 0x83, 0xe8, 0xe0, 0x94, 0x86, 0x2e, 0x92, | ||
4105 | 0x78, 0x6b, 0x01, 0xc9, 0xc7, 0x83, 0xba, 0x21, | ||
4106 | 0x6a, 0x25, 0x15, 0x33, 0x4e, 0x45, 0x08, 0xec, | ||
4107 | 0x35, 0xdb, 0xe0, 0x6e, 0x31, 0x51, 0x79, 0xa9, | ||
4108 | 0x42, 0x44, 0x65, 0xc1, 0xa0, 0xf1, 0xf9, 0x2a, | ||
4109 | 0x70, 0xd5, 0xb6, 0xc6, 0xc1, 0x8c, 0x39, 0xfc, | ||
4110 | 0x25, 0xa6, 0x55, 0xd9, 0xdd, 0x2d, 0x4c, 0xec, | ||
4111 | 0x49, 0xc6, 0xeb, 0x0e, 0xa8, 0x25, 0x2a, 0x16, | ||
4112 | 0x1b, 0x66, 0x84, 0xda, 0xe2, 0x92, 0xe5, 0xc0, | ||
4113 | 0xc8, 0x53, 0x07, 0xaf, 0x80, 0x84, 0xec, 0xfd, | ||
4114 | 0xcd, 0xd1, 0x6e, 0xcd, 0x6f, 0x6a, 0xf5, 0x36, | ||
4115 | 0xc5, 0x15, 0xe5, 0x25, 0x7d, 0x77, 0xd1, 0x1a, | ||
4116 | 0x93, 0x36, 0xa9, 0xcf, 0x7c, 0xa4, 0x54, 0x4a, | ||
4117 | 0x06, 0x51, 0x48, 0x4e, 0xf6, 0x59, 0x87, 0xd2, | ||
4118 | 0x04, 0x02, 0xef, 0xd3, 0x44, 0xde, 0x76, 0x31, | ||
4119 | 0xb3, 0x34, 0x17, 0x1b, 0x9d, 0x66, 0x11, 0x9f, | ||
4120 | 0x1e, 0xcc, 0x17, 0xe9, 0xc7, 0x3c, 0x1b, 0xe7, | ||
4121 | 0xcb, 0x50, 0x08, 0xfc, 0xdc, 0x2b, 0x24, 0xdb, | ||
4122 | 0x65, 0x83, 0xd0, 0x3b, 0xe3, 0x30, 0xea, 0x94, | ||
4123 | 0x6c, 0xe7, 0xe8, 0x35, 0x32, 0xc7, 0xdb, 0x64, | ||
4124 | 0xb4, 0x01, 0xab, 0x36, 0x2c, 0x77, 0x13, 0xaf, | ||
4125 | 0xf8, 0x2b, 0x88, 0x3f, 0x54, 0x39, 0xc4, 0x44, | ||
4126 | 0xfe, 0xef, 0x6f, 0x68, 0x34, 0xbe, 0x0f, 0x05, | ||
4127 | 0x16, 0x6d, 0xf6, 0x0a, 0x30, 0xe7, 0xe3, 0xed, | ||
4128 | 0xc4, 0xde, 0x3c, 0x1b, 0x13, 0xd8, 0xdb, 0xfe, | ||
4129 | 0x41, 0x62, 0xe5, 0x28, 0xd4, 0x8d, 0xa3, 0xc7, | ||
4130 | 0x93, 0x97, 0xc6, 0x48, 0x45, 0x1d, 0x9f, 0x83, | ||
4131 | 0xdf, 0x4b, 0x40, 0x3e, 0x42, 0x25, 0x87, 0x80, | ||
4132 | 0x4c, 0x7d, 0xa8, 0xd4, 0x98, 0x23, 0x95, 0x75, | ||
4133 | 0x41, 0x8c, 0xda, 0x41, 0x9b, 0xd4, 0xa7, 0x06, | ||
4134 | 0xb5, 0xf1, 0x71, 0x09, 0x53, 0xbe, 0xca, 0xbf, | ||
4135 | 0x32, 0x03, 0xed, 0xf0, 0x50, 0x1c, 0x56, 0x39, | ||
4136 | 0x5b, 0xa4, 0x75, 0x18, 0xf7, 0x9b, 0x58, 0xef, | ||
4137 | 0x53, 0xfc, 0x2a, 0x38, 0x23, 0x15, 0x75, 0xcd, | ||
4138 | 0x45, 0xe5, 0x5a, 0x82, 0x55, 0xba, 0x21, 0xfa, | ||
4139 | 0xd4, 0xbd, 0xc6, 0x94, 0x7c, 0xc5, 0x80, 0x12, | ||
4140 | 0xf7, 0x4b, 0x32, 0xc4, 0x9a, 0x82, 0xd8, 0x28, | ||
4141 | 0x8f, 0xd9, 0xc2, 0x0f, 0x60, 0x03, 0xbe, 0x5e, | ||
4142 | 0x21, 0xd6, 0x5f, 0x58, 0xbf, 0x5c, 0xb1, 0x32, | ||
4143 | 0x82, 0x8d, 0xa9, 0xe5, 0xf2, 0x66, 0x1a, 0xc0, | ||
4144 | 0xa0, 0xbc, 0x58, 0x2f, 0x71, 0xf5, 0x2f, 0xed, | ||
4145 | 0xd1, 0x26, 0xb9, 0xd8, 0x49, 0x5a, 0x07, 0x19, | ||
4146 | 0x01, 0x7c, 0x59, 0xb0, 0xf8, 0xa4, 0xb7, 0xd3, | ||
4147 | 0x7b, 0x1a, 0x8c, 0x38, 0xf4, 0x50, 0xa4, 0x59, | ||
4148 | 0xb0, 0xcc, 0x41, 0x0b, 0x88, 0x7f, 0xe5, 0x31, | ||
4149 | 0xb3, 0x42, 0xba, 0xa2, 0x7e, 0xd4, 0x32, 0x71, | ||
4150 | 0x45, 0x87, 0x48, 0xa9, 0xc2, 0xf2, 0x89, 0xb3, | ||
4151 | 0xe4, 0xa7, 0x7e, 0x52, 0x15, 0x61, 0xfa, 0xfe, | ||
4152 | 0xc9, 0xdd, 0x81, 0xeb, 0x13, 0xab, 0xab, 0xc3, | ||
4153 | 0x98, 0x59, 0xd8, 0x16, 0x3d, 0x14, 0x7a, 0x1c, | ||
4154 | 0x3c, 0x41, 0x9a, 0x16, 0x16, 0x9b, 0xd2, 0xd2, | ||
4155 | 0x69, 0x3a, 0x29, 0x23, 0xac, 0x86, 0x32, 0xa5, | ||
4156 | 0x48, 0x9c, 0x9e, 0xf3, 0x47, 0x77, 0x81, 0x70, | ||
4157 | 0x24, 0xe8, 0x85, 0xd2, 0xf5, 0xb5, 0xfa, 0xff, | ||
4158 | 0x59, 0x6a, 0xd3, 0x50, 0x59, 0x43, 0x59, 0xde, | ||
4159 | 0xd9, 0xf1, 0x55, 0xa5, 0x0c, 0xc3, 0x1a, 0x1a, | ||
4160 | 0x18, 0x34, 0x0d, 0x1a, 0x63, 0x33, 0xed, 0x10, | ||
4161 | 0xe0, 0x1d, 0x2a, 0x18, 0xd2, 0xc0, 0x54, 0xa8, | ||
4162 | 0xca, 0xb5, 0x9a, 0xd3, 0xdd, 0xca, 0x45, 0x84, | ||
4163 | 0x50, 0xe7, 0x0f, 0xfe, 0xa4, 0x99, 0x5a, 0xbe, | ||
4164 | 0x43, 0x2d, 0x9a, 0xcb, 0x92, 0x3f, 0x5a, 0x1d, | ||
4165 | 0x85, 0xd8, 0xc9, 0xdf, 0x68, 0xc9, 0x12, 0x80, | ||
4166 | 0x56, 0x0c, 0xdc, 0x00, 0xdc, 0x3a, 0x7d, 0x9d, | ||
4167 | 0xa3, 0xa2, 0xe8, 0x4d, 0xbf, 0xf9, 0x70, 0xa0, | ||
4168 | 0xa4, 0x13, 0x4f, 0x6b, 0xaf, 0x0a, 0x89, 0x7f, | ||
4169 | 0xda, 0xf0, 0xbf, 0x9b, 0xc8, 0x1d, 0xe5, 0xf8, | ||
4170 | 0x2e, 0x8b, 0x07, 0xb5, 0x73, 0x1b, 0xcc, 0xa2, | ||
4171 | 0xa6, 0xad, 0x30, 0xbc, 0x78, 0x3c, 0x5b, 0x10, | ||
4172 | 0xfa, 0x5e, 0x62, 0x2d, 0x9e, 0x64, 0xb3, 0x33, | ||
4173 | 0xce, 0xf9, 0x1f, 0x86, 0xe7, 0x8b, 0xa2, 0xb8, | ||
4174 | 0xe8, 0x99, 0x57, 0x8c, 0x11, 0xed, 0x66, 0xd9, | ||
4175 | 0x3c, 0x72, 0xb9, 0xc3, 0xe6, 0x4e, 0x17, 0x3a, | ||
4176 | 0x6a, 0xcb, 0x42, 0x24, 0x06, 0xed, 0x3e, 0x4e, | ||
4177 | 0xa3, 0xe8, 0x6a, 0x94, 0xda, 0x0d, 0x4e, 0xd5, | ||
4178 | 0x14, 0x19, 0xcf, 0xb6, 0x26, 0xd8, 0x2e, 0xcc, | ||
4179 | 0x64, 0x76, 0x38, 0x49, 0x4d, 0xfe, 0x30, 0x6d, | ||
4180 | 0xe4, 0xc8, 0x8c, 0x7b, 0xc4, 0xe0, 0x35, 0xba, | ||
4181 | 0x22, 0x6e, 0x76, 0xe1, 0x1a, 0xf2, 0x53, 0xc3, | ||
4182 | 0x28, 0xa2, 0x82, 0x1f, 0x61, 0x69, 0xad, 0xc1, | ||
4183 | 0x7b, 0x28, 0x4b, 0x1e, 0x6c, 0x85, 0x95, 0x9b, | ||
4184 | 0x51, 0xb5, 0x17, 0x7f, 0x12, 0x69, 0x8c, 0x24, | ||
4185 | 0xd5, 0xc7, 0x5a, 0x5a, 0x11, 0x54, 0xff, 0x5a, | ||
4186 | 0xf7, 0x16, 0xc3, 0x91, 0xa6, 0xf0, 0xdc, 0x0a, | ||
4187 | 0xb6, 0xa7, 0x4a, 0x0d, 0x7a, 0x58, 0xfe, 0xa5, | ||
4188 | 0xf5, 0xcb, 0x8f, 0x7b, 0x0e, 0xea, 0x57, 0xe7, | ||
4189 | 0xbd, 0x79, 0xd6, 0x1c, 0x88, 0x23, 0x6c, 0xf2, | ||
4190 | 0x4d, 0x29, 0x77, 0x53, 0x35, 0x6a, 0x00, 0x8d, | ||
4191 | 0xcd, 0xa3, 0x58, 0xbe, 0x77, 0x99, 0x18, 0xf8, | ||
4192 | 0xe6, 0xe1, 0x8f, 0xe9, 0x37, 0x8f, 0xe3, 0xe2, | ||
4193 | 0x5a, 0x8a, 0x93, 0x25, 0xaf, 0xf3, 0x78, 0x80, | ||
4194 | 0xbe, 0xa6, 0x1b, 0xc6, 0xac, 0x8b, 0x1c, 0x91, | ||
4195 | 0x58, 0xe1, 0x9f, 0x89, 0x35, 0x9d, 0x1d, 0x21, | ||
4196 | 0x29, 0x9f, 0xf4, 0x99, 0x02, 0x27, 0x0f, 0xa8, | ||
4197 | 0x4f, 0x79, 0x94, 0x2b, 0x33, 0x2c, 0xda, 0xa2, | ||
4198 | 0x26, 0x39, 0x83, 0x94, 0xef, 0x27, 0xd8, 0x53, | ||
4199 | 0x8f, 0x66, 0x0d, 0xe4, 0x41, 0x7d, 0x34, 0xcd, | ||
4200 | 0x43, 0x7c, 0x95, 0x0a, 0x53, 0xef, 0x66, 0xda, | ||
4201 | 0x7e, 0x9b, 0xf3, 0x93, 0xaf, 0xd0, 0x73, 0x71, | ||
4202 | 0xba, 0x40, 0x9b, 0x74, 0xf8, 0xd7, 0xd7, 0x41, | ||
4203 | 0x6d, 0xaf, 0x72, 0x9c, 0x8d, 0x21, 0x87, 0x3c, | ||
4204 | 0xfd, 0x0a, 0x90, 0xa9, 0x47, 0x96, 0x9e, 0xd3, | ||
4205 | 0x88, 0xee, 0x73, 0xcf, 0x66, 0x2f, 0x52, 0x56, | ||
4206 | 0x6d, 0xa9, 0x80, 0x4c, 0xe2, 0x6f, 0x62, 0x88, | ||
4207 | 0x3f, 0x0e, 0x54, 0x17, 0x48, 0x80, 0x5d, 0xd3, | ||
4208 | 0xc3, 0xda, 0x25, 0x3d, 0xa1, 0xc8, 0xcb, 0x9f, | ||
4209 | 0x9b, 0x70, 0xb3, 0xa1, 0xeb, 0x04, 0x52, 0xa1, | ||
4210 | 0xf2, 0x22, 0x0f, 0xfc, 0xc8, 0x18, 0xfa, 0xf9, | ||
4211 | 0x85, 0x9c, 0xf1, 0xac, 0xeb, 0x0c, 0x02, 0x46, | ||
4212 | 0x75, 0xd2, 0xf5, 0x2c, 0xe3, 0xd2, 0x59, 0x94, | ||
4213 | 0x12, 0xf3, 0x3c, 0xfc, 0xd7, 0x92, 0xfa, 0x36, | ||
4214 | 0xba, 0x61, 0x34, 0x38, 0x7c, 0xda, 0x48, 0x3e, | ||
4215 | 0x08, 0xc9, 0x39, 0x23, 0x5e, 0x02, 0x2c, 0x1a, | ||
4216 | 0x18, 0x7e, 0xb4, 0xd9, 0xfd, 0x9e, 0x40, 0x02, | ||
4217 | 0xb1, 0x33, 0x37, 0x32, 0xe7, 0xde, 0xd6, 0xd0, | ||
4218 | 0x7c, 0x58, 0x65, 0x4b, 0xf8, 0x34, 0x27, 0x9c, | ||
4219 | 0x44, 0xb4, 0xbd, 0xe9, 0xe9, 0x4c, 0x78, 0x7d, | ||
4220 | 0x4b, 0x9f, 0xce, 0xb1, 0xcd, 0x47, 0xa5, 0x37, | ||
4221 | 0xe5, 0x6d, 0xbd, 0xb9, 0x43, 0x94, 0x0a, 0xd4, | ||
4222 | 0xd6, 0xf9, 0x04, 0x5f, 0xb5, 0x66, 0x6c, 0x1a, | ||
4223 | 0x35, 0x12, 0xe3, 0x36, 0x28, 0x27, 0x36, 0x58, | ||
4224 | 0x01, 0x2b, 0x79, 0xe4, 0xba, 0x6d, 0x10, 0x7d, | ||
4225 | 0x65, 0xdf, 0x84, 0x95, 0xf4, 0xd5, 0xb6, 0x8f, | ||
4226 | 0x2b, 0x9f, 0x96, 0x00, 0x86, 0x60, 0xf0, 0x21, | ||
4227 | 0x76, 0xa8, 0x6a, 0x8c, 0x28, 0x1c, 0xb3, 0x6b, | ||
4228 | 0x97, 0xd7, 0xb6, 0x53, 0x2a, 0xcc, 0xab, 0x40, | ||
4229 | 0x9d, 0x62, 0x79, 0x58, 0x52, 0xe6, 0x65, 0xb7, | ||
4230 | 0xab, 0x55, 0x67, 0x9c, 0x89, 0x7c, 0x03, 0xb0, | ||
4231 | 0x73, 0x59, 0xc5, 0x81, 0xf5, 0x18, 0x17, 0x5c, | ||
4232 | 0x89, 0xf3, 0x78, 0x35, 0x44, 0x62, 0x78, 0x72, | ||
4233 | 0xd0, 0x96, 0xeb, 0x31, 0xe7, 0x87, 0x77, 0x14, | ||
4234 | 0x99, 0x51, 0xf2, 0x59, 0x26, 0x9e, 0xb5, 0xa6, | ||
4235 | 0x45, 0xfe, 0x6e, 0xbd, 0x07, 0x4c, 0x94, 0x5a, | ||
4236 | 0xa5, 0x7d, 0xfc, 0xf1, 0x2b, 0x77, 0xe2, 0xfe, | ||
4237 | 0x17, 0xd4, 0x84, 0xa0, 0xac, 0xb5, 0xc7, 0xda, | ||
4238 | 0xa9, 0x1a, 0xb6, 0xf3, 0x74, 0x11, 0xb4, 0x9d, | ||
4239 | 0xfb, 0x79, 0x2e, 0x04, 0x2d, 0x50, 0x28, 0x83, | ||
4240 | 0xbf, 0xc6, 0x52, 0xd3, 0x34, 0xd6, 0xe8, 0x7a, | ||
4241 | 0xb6, 0xea, 0xe7, 0xa8, 0x6c, 0x15, 0x1e, 0x2c, | ||
4242 | 0x57, 0xbc, 0x48, 0x4e, 0x5f, 0x5c, 0xb6, 0x92, | ||
4243 | 0xd2, 0x49, 0x77, 0x81, 0x6d, 0x90, 0x70, 0xae, | ||
4244 | 0x98, 0xa1, 0x03, 0x0d, 0x6b, 0xb9, 0x77, 0x14, | ||
4245 | 0xf1, 0x4e, 0x23, 0xd3, 0xf8, 0x68, 0xbd, 0xc2, | ||
4246 | 0xfe, 0x04, 0xb7, 0x5c, 0xc5, 0x17, 0x60, 0x8f, | ||
4247 | 0x65, 0x54, 0xa4, 0x7a, 0x42, 0xdc, 0x18, 0x0d, | ||
4248 | 0xb5, 0xcf, 0x0f, 0xd3, 0xc7, 0x91, 0x66, 0x1b, | ||
4249 | 0x45, 0x42, 0x27, 0x75, 0x50, 0xe5, 0xee, 0xb8, | ||
4250 | 0x7f, 0x33, 0x2c, 0xba, 0x4a, 0x92, 0x4d, 0x2c, | ||
4251 | 0x3c, 0xe3, 0x0d, 0x80, 0x01, 0xba, 0x0d, 0x29, | ||
4252 | 0xd8, 0x3c, 0xe9, 0x13, 0x16, 0x57, 0xe6, 0xea, | ||
4253 | 0x94, 0x52, 0xe7, 0x00, 0x4d, 0x30, 0xb0, 0x0f, | ||
4254 | 0x35, 0xb8, 0xb8, 0xa7, 0xb1, 0xb5, 0x3b, 0x44, | ||
4255 | 0xe1, 0x2f, 0xfd, 0x88, 0xed, 0x43, 0xe7, 0x52, | ||
4256 | 0x10, 0x93, 0xb3, 0x8a, 0x30, 0x6b, 0x0a, 0xf7, | ||
4257 | 0x23, 0xc6, 0x50, 0x9d, 0x4a, 0xb0, 0xde, 0xc3, | ||
4258 | 0xdc, 0x9b, 0x2f, 0x01, 0x56, 0x36, 0x09, 0xc5, | ||
4259 | 0x2f, 0x6b, 0xfe, 0xf1, 0xd8, 0x27, 0x45, 0x03, | ||
4260 | 0x30, 0x5e, 0x5c, 0x5b, 0xb4, 0x62, 0x0e, 0x1a, | ||
4261 | 0xa9, 0x21, 0x2b, 0x92, 0x94, 0x87, 0x62, 0x57, | ||
4262 | 0x4c, 0x10, 0x74, 0x1a, 0xf1, 0x0a, 0xc5, 0x84, | ||
4263 | 0x3b, 0x9e, 0x72, 0x02, 0xd7, 0xcc, 0x09, 0x56, | ||
4264 | 0xbd, 0x54, 0xc1, 0xf0, 0xc3, 0xe3, 0xb3, 0xf8, | ||
4265 | 0xd2, 0x0d, 0x61, 0xcb, 0xef, 0xce, 0x0d, 0x05, | ||
4266 | 0xb0, 0x98, 0xd9, 0x8e, 0x4f, 0xf9, 0xbc, 0x93, | ||
4267 | 0xa6, 0xea, 0xc8, 0xcf, 0x10, 0x53, 0x4b, 0xf1, | ||
4268 | 0xec, 0xfc, 0x89, 0xf9, 0x64, 0xb0, 0x22, 0xbf, | ||
4269 | 0x9e, 0x55, 0x46, 0x9f, 0x7c, 0x50, 0x8e, 0x84, | ||
4270 | 0x54, 0x20, 0x98, 0xd7, 0x6c, 0x40, 0x1e, 0xdb, | ||
4271 | 0x69, 0x34, 0x78, 0x61, 0x24, 0x21, 0x9c, 0x8a, | ||
4272 | 0xb3, 0x62, 0x31, 0x8b, 0x6e, 0xf5, 0x2a, 0x35, | ||
4273 | 0x86, 0x13, 0xb1, 0x6c, 0x64, 0x2e, 0x41, 0xa5, | ||
4274 | 0x05, 0xf2, 0x42, 0xba, 0xd2, 0x3a, 0x0d, 0x8e, | ||
4275 | 0x8a, 0x59, 0x94, 0x3c, 0xcf, 0x36, 0x27, 0x82, | ||
4276 | 0xc2, 0x45, 0xee, 0x58, 0xcd, 0x88, 0xb4, 0xec, | ||
4277 | 0xde, 0xb2, 0x96, 0x0a, 0xaf, 0x38, 0x6f, 0x88, | ||
4278 | 0xd7, 0xd8, 0xe1, 0xdf, 0xb9, 0x96, 0xa9, 0x0a, | ||
4279 | 0xb1, 0x95, 0x28, 0x86, 0x20, 0xe9, 0x17, 0x49, | ||
4280 | 0xa2, 0x29, 0x38, 0xaa, 0xa5, 0xe9, 0x6e, 0xf1, | ||
4281 | 0x19, 0x27, 0xc0, 0xd5, 0x2a, 0x22, 0xc3, 0x0b, | ||
4282 | 0xdb, 0x7c, 0x73, 0x10, 0xb9, 0xba, 0x89, 0x76, | ||
4283 | 0x54, 0xae, 0x7d, 0x71, 0xb3, 0x93, 0xf6, 0x32, | ||
4284 | 0xe6, 0x47, 0x43, 0x55, 0xac, 0xa0, 0x0d, 0xc2, | ||
4285 | 0x93, 0x27, 0x4a, 0x8e, 0x0e, 0x74, 0x15, 0xc7, | ||
4286 | 0x0b, 0x85, 0xd9, 0x0c, 0xa9, 0x30, 0x7a, 0x3e, | ||
4287 | 0xea, 0x8f, 0x85, 0x6d, 0x3a, 0x12, 0x4f, 0x72, | ||
4288 | 0x69, 0x58, 0x7a, 0x80, 0xbb, 0xb5, 0x97, 0xf3, | ||
4289 | 0xcf, 0x70, 0xd2, 0x5d, 0xdd, 0x4d, 0x21, 0x79, | ||
4290 | 0x54, 0x4d, 0xe4, 0x05, 0xe8, 0xbd, 0xc2, 0x62, | ||
4291 | 0xb1, 0x3b, 0x77, 0x1c, 0xd6, 0x5c, 0xf3, 0xa0, | ||
4292 | 0x79, 0x00, 0xa8, 0x6c, 0x29, 0xd9, 0x18, 0x24, | ||
4293 | 0x36, 0xa2, 0x46, 0xc0, 0x96, 0x65, 0x7f, 0xbd, | ||
4294 | 0x2a, 0xed, 0x36, 0x16, 0x0c, 0xaa, 0x9f, 0xf4, | ||
4295 | 0xc5, 0xb4, 0xe2, 0x12, 0xed, 0x69, 0xed, 0x4f, | ||
4296 | 0x26, 0x2c, 0x39, 0x52, 0x89, 0x98, 0xe7, 0x2c, | ||
4297 | 0x99, 0xa4, 0x9e, 0xa3, 0x9b, 0x99, 0x46, 0x7a, | ||
4298 | 0x3a, 0xdc, 0xa8, 0x59, 0xa3, 0xdb, 0xc3, 0x3b, | ||
4299 | 0x95, 0x0d, 0x3b, 0x09, 0x6e, 0xee, 0x83, 0x5d, | ||
4300 | 0x32, 0x4d, 0xed, 0xab, 0xfa, 0x98, 0x14, 0x4e, | ||
4301 | 0xc3, 0x15, 0x45, 0x53, 0x61, 0xc4, 0x93, 0xbd, | ||
4302 | 0x90, 0xf4, 0x99, 0x95, 0x4c, 0xe6, 0x76, 0x92, | ||
4303 | 0x29, 0x90, 0x46, 0x30, 0x92, 0x69, 0x7d, 0x13, | ||
4304 | 0xf2, 0xa5, 0xcd, 0x69, 0x49, 0x44, 0xb2, 0x0f, | ||
4305 | 0x63, 0x40, 0x36, 0x5f, 0x09, 0xe2, 0x78, 0xf8, | ||
4306 | 0x91, 0xe3, 0xe2, 0xfa, 0x10, 0xf7, 0xc8, 0x24, | ||
4307 | 0xa8, 0x89, 0x32, 0x5c, 0x37, 0x25, 0x1d, 0xb2, | ||
4308 | 0xea, 0x17, 0x8a, 0x0a, 0xa9, 0x64, 0xc3, 0x7c, | ||
4309 | 0x3c, 0x7c, 0xbd, 0xc6, 0x79, 0x34, 0xe7, 0xe2, | ||
4310 | 0x85, 0x8e, 0xbf, 0xf8, 0xde, 0x92, 0xa0, 0xae, | ||
4311 | 0x20, 0xc4, 0xf6, 0xbb, 0x1f, 0x38, 0x19, 0x0e, | ||
4312 | 0xe8, 0x79, 0x9c, 0xa1, 0x23, 0xe9, 0x54, 0x7e, | ||
4313 | 0x37, 0x2f, 0xe2, 0x94, 0x32, 0xaf, 0xa0, 0x23, | ||
4314 | 0x49, 0xe4, 0xc0, 0xb3, 0xac, 0x00, 0x8f, 0x36, | ||
4315 | 0x05, 0xc4, 0xa6, 0x96, 0xec, 0x05, 0x98, 0x4f, | ||
4316 | 0x96, 0x67, 0x57, 0x1f, 0x20, 0x86, 0x1b, 0x2d, | ||
4317 | 0x69, 0xe4, 0x29, 0x93, 0x66, 0x5f, 0xaf, 0x6b, | ||
4318 | 0x88, 0x26, 0x2c, 0x67, 0x02, 0x4b, 0x52, 0xd0, | ||
4319 | 0x83, 0x7a, 0x43, 0x1f, 0xc0, 0x71, 0x15, 0x25, | ||
4320 | 0x77, 0x65, 0x08, 0x60, 0x11, 0x76, 0x4c, 0x8d, | ||
4321 | 0xed, 0xa9, 0x27, 0xc6, 0xb1, 0x2a, 0x2c, 0x6a, | ||
4322 | 0x4a, 0x97, 0xf5, 0xc6, 0xb7, 0x70, 0x42, 0xd3, | ||
4323 | 0x03, 0xd1, 0x24, 0x95, 0xec, 0x6d, 0xab, 0x38, | ||
4324 | 0x72, 0xce, 0xe2, 0x8b, 0x33, 0xd7, 0x51, 0x09, | ||
4325 | 0xdc, 0x45, 0xe0, 0x09, 0x96, 0x32, 0xf3, 0xc4, | ||
4326 | 0x84, 0xdc, 0x73, 0x73, 0x2d, 0x1b, 0x11, 0x98, | ||
4327 | 0xc5, 0x0e, 0x69, 0x28, 0x94, 0xc7, 0xb5, 0x4d, | ||
4328 | 0xc8, 0x8a, 0xd0, 0xaa, 0x13, 0x2e, 0x18, 0x74, | ||
4329 | 0xdd, 0xd1, 0x1e, 0xf3, 0x90, 0xe8, 0xfc, 0x9a, | ||
4330 | 0x72, 0x4a, 0x0e, 0xd1, 0xe4, 0xfb, 0x0d, 0x96, | ||
4331 | 0xd1, 0x0c, 0x79, 0x85, 0x1b, 0x1c, 0xfe, 0xe1, | ||
4332 | 0x62, 0x8f, 0x7a, 0x73, 0x32, 0xab, 0xc8, 0x18, | ||
4333 | 0x69, 0xe3, 0x34, 0x30, 0xdf, 0x13, 0xa6, 0xe5, | ||
4334 | 0xe8, 0x0e, 0x67, 0x7f, 0x81, 0x11, 0xb4, 0x60, | ||
4335 | 0xc7, 0xbd, 0x79, 0x65, 0x50, 0xdc, 0xc4, 0x5b, | ||
4336 | 0xde, 0x39, 0xa4, 0x01, 0x72, 0x63, 0xf3, 0xd1, | ||
4337 | 0x64, 0x4e, 0xdf, 0xfc, 0x27, 0x92, 0x37, 0x0d, | ||
4338 | 0x57, 0xcd, 0x11, 0x4f, 0x11, 0x04, 0x8e, 0x1d, | ||
4339 | 0x16, 0xf7, 0xcd, 0x92, 0x9a, 0x99, 0x30, 0x14, | ||
4340 | 0xf1, 0x7c, 0x67, 0x1b, 0x1f, 0x41, 0x0b, 0xe8, | ||
4341 | 0x32, 0xe8, 0xb8, 0xc1, 0x4f, 0x54, 0x86, 0x4f, | ||
4342 | 0xe5, 0x79, 0x81, 0x73, 0xcd, 0x43, 0x59, 0x68, | ||
4343 | 0x73, 0x02, 0x3b, 0x78, 0x21, 0x72, 0x43, 0x00, | ||
4344 | 0x49, 0x17, 0xf7, 0x00, 0xaf, 0x68, 0x24, 0x53, | ||
4345 | 0x05, 0x0a, 0xc3, 0x33, 0xe0, 0x33, 0x3f, 0x69, | ||
4346 | 0xd2, 0x84, 0x2f, 0x0b, 0xed, 0xde, 0x04, 0xf4, | ||
4347 | 0x11, 0x94, 0x13, 0x69, 0x51, 0x09, 0x28, 0xde, | ||
4348 | 0x57, 0x5c, 0xef, 0xdc, 0x9a, 0x49, 0x1c, 0x17, | ||
4349 | 0x97, 0xf3, 0x96, 0xc1, 0x7f, 0x5d, 0x2e, 0x7d, | ||
4350 | 0x55, 0xb8, 0xb3, 0x02, 0x09, 0xb3, 0x1f, 0xe7, | ||
4351 | 0xc9, 0x8d, 0xa3, 0x36, 0x34, 0x8a, 0x77, 0x13, | ||
4352 | 0x30, 0x63, 0x4c, 0xa5, 0xcd, 0xc3, 0xe0, 0x7e, | ||
4353 | 0x05, 0xa1, 0x7b, 0x0c, 0xcb, 0x74, 0x47, 0x31, | ||
4354 | 0x62, 0x03, 0x43, 0xf1, 0x87, 0xb4, 0xb0, 0x85, | ||
4355 | 0x87, 0x8e, 0x4b, 0x25, 0xc7, 0xcf, 0xae, 0x4b, | ||
4356 | 0x36, 0x46, 0x3e, 0x62, 0xbc, 0x6f, 0xeb, 0x5f, | ||
4357 | 0x73, 0xac, 0xe6, 0x07, 0xee, 0xc1, 0xa1, 0xd6, | ||
4358 | 0xc4, 0xab, 0xc9, 0xd6, 0x89, 0x45, 0xe1, 0xf1, | ||
4359 | 0x04, 0x4e, 0x1a, 0x6f, 0xbb, 0x4f, 0x3a, 0xa3, | ||
4360 | 0xa0, 0xcb, 0xa3, 0x0a, 0xd8, 0x71, 0x35, 0x55, | ||
4361 | 0xe4, 0xbc, 0x2e, 0x04, 0x06, 0xe6, 0xff, 0x5b, | ||
4362 | 0x1c, 0xc0, 0x11, 0x7c, 0xc5, 0x17, 0xf3, 0x38, | ||
4363 | 0xcf, 0xe9, 0xba, 0x0f, 0x0e, 0xef, 0x02, 0xc2, | ||
4364 | 0x8d, 0xc6, 0xbc, 0x4b, 0x67, 0x20, 0x95, 0xd7, | ||
4365 | 0x2c, 0x45, 0x5b, 0x86, 0x44, 0x8c, 0x6f, 0x2e, | ||
4366 | 0x7e, 0x9f, 0x1c, 0x77, 0xba, 0x6b, 0x0e, 0xa3, | ||
4367 | 0x69, 0xdc, 0xab, 0x24, 0x57, 0x60, 0x47, 0xc1, | ||
4368 | 0xd1, 0xa5, 0x9d, 0x23, 0xe6, 0xb1, 0x37, 0xfe, | ||
4369 | 0x93, 0xd2, 0x4c, 0x46, 0xf9, 0x0c, 0xc6, 0xfb, | ||
4370 | 0xd6, 0x9d, 0x99, 0x69, 0xab, 0x7a, 0x07, 0x0c, | ||
4371 | 0x65, 0xe7, 0xc4, 0x08, 0x96, 0xe2, 0xa5, 0x01, | ||
4372 | 0x3f, 0x46, 0x07, 0x05, 0x7e, 0xe8, 0x9a, 0x90, | ||
4373 | 0x50, 0xdc, 0xe9, 0x7a, 0xea, 0xa1, 0x39, 0x6e, | ||
4374 | 0x66, 0xe4, 0x6f, 0xa5, 0x5f, 0xb2, 0xd9, 0x5b, | ||
4375 | 0xf5, 0xdb, 0x2a, 0x32, 0xf0, 0x11, 0x6f, 0x7c, | ||
4376 | 0x26, 0x10, 0x8f, 0x3d, 0x80, 0xe9, 0x58, 0xf7, | ||
4377 | 0xe0, 0xa8, 0x57, 0xf8, 0xdb, 0x0e, 0xce, 0x99, | ||
4378 | 0x63, 0x19, 0x3d, 0xd5, 0xec, 0x1b, 0x77, 0x69, | ||
4379 | 0x98, 0xf6, 0xe4, 0x5f, 0x67, 0x17, 0x4b, 0x09, | ||
4380 | 0x85, 0x62, 0x82, 0x70, 0x18, 0xe2, 0x9a, 0x78, | ||
4381 | 0xe2, 0x62, 0xbd, 0xb4, 0xf1, 0x42, 0xc6, 0xfb, | ||
4382 | 0x08, 0xd0, 0xbd, 0xeb, 0x4e, 0x09, 0xf2, 0xc8, | ||
4383 | 0x1e, 0xdc, 0x3d, 0x32, 0x21, 0x56, 0x9c, 0x4f, | ||
4384 | 0x35, 0xf3, 0x61, 0x06, 0x72, 0x84, 0xc4, 0x32, | ||
4385 | 0xf2, 0xf1, 0xfa, 0x0b, 0x2f, 0xc3, 0xdb, 0x02, | ||
4386 | 0x04, 0xc2, 0xde, 0x57, 0x64, 0x60, 0x8d, 0xcf, | ||
4387 | 0xcb, 0x86, 0x5d, 0x97, 0x3e, 0xb1, 0x9c, 0x01, | ||
4388 | 0xd6, 0x28, 0x8f, 0x99, 0xbc, 0x46, 0xeb, 0x05, | ||
4389 | 0xaf, 0x7e, 0xb8, 0x21, 0x2a, 0x56, 0x85, 0x1c, | ||
4390 | 0xb3, 0x71, 0xa0, 0xde, 0xca, 0x96, 0xf1, 0x78, | ||
4391 | 0x49, 0xa2, 0x99, 0x81, 0x80, 0x5c, 0x01, 0xf5, | ||
4392 | 0xa0, 0xa2, 0x56, 0x63, 0xe2, 0x70, 0x07, 0xa5, | ||
4393 | 0x95, 0xd6, 0x85, 0xeb, 0x36, 0x9e, 0xa9, 0x51, | ||
4394 | 0x66, 0x56, 0x5f, 0x1d, 0x02, 0x19, 0xe2, 0xf6, | ||
4395 | 0x4f, 0x73, 0x38, 0x09, 0x75, 0x64, 0x48, 0xe0, | ||
4396 | 0xf1, 0x7e, 0x0e, 0xe8, 0x9d, 0xf9, 0xed, 0x94, | ||
4397 | 0xfe, 0x16, 0x26, 0x62, 0x49, 0x74, 0xf4, 0xb0, | ||
4398 | 0xd4, 0xa9, 0x6c, 0xb0, 0xfd, 0x53, 0xe9, 0x81, | ||
4399 | 0xe0, 0x7a, 0xbf, 0xcf, 0xb5, 0xc4, 0x01, 0x81, | ||
4400 | 0x79, 0x99, 0x77, 0x01, 0x3b, 0xe9, 0xa2, 0xb6, | ||
4401 | 0xe6, 0x6a, 0x8a, 0x9e, 0x56, 0x1c, 0x8d, 0x1e, | ||
4402 | 0x8f, 0x06, 0x55, 0x2c, 0x6c, 0xdc, 0x92, 0x87, | ||
4403 | 0x64, 0x3b, 0x4b, 0x19, 0xa1, 0x13, 0x64, 0x1d, | ||
4404 | 0x4a, 0xe9, 0xc0, 0x00, 0xb8, 0x95, 0xef, 0x6b, | ||
4405 | 0x1a, 0x86, 0x6d, 0x37, 0x52, 0x02, 0xc2, 0xe0, | ||
4406 | 0xc8, 0xbb, 0x42, 0x0c, 0x02, 0x21, 0x4a, 0xc9, | ||
4407 | 0xef, 0xa0, 0x54, 0xe4, 0x5e, 0x16, 0x53, 0x81, | ||
4408 | 0x70, 0x62, 0x10, 0xaf, 0xde, 0xb8, 0xb5, 0xd3, | ||
4409 | 0xe8, 0x5e, 0x6c, 0xc3, 0x8a, 0x3e, 0x18, 0x07, | ||
4410 | 0xf2, 0x2f, 0x7d, 0xa7, 0xe1, 0x3d, 0x4e, 0xb4, | ||
4411 | 0x26, 0xa7, 0xa3, 0x93, 0x86, 0xb2, 0x04, 0x1e, | ||
4412 | 0x53, 0x5d, 0x86, 0xd6, 0xde, 0x65, 0xca, 0xe3, | ||
4413 | 0x4e, 0xc1, 0xcf, 0xef, 0xc8, 0x70, 0x1b, 0x83, | ||
4414 | 0x13, 0xdd, 0x18, 0x8b, 0x0d, 0x76, 0xd2, 0xf6, | ||
4415 | 0x37, 0x7a, 0x93, 0x7a, 0x50, 0x11, 0x9f, 0x96, | ||
4416 | 0x86, 0x25, 0xfd, 0xac, 0xdc, 0xbe, 0x18, 0x93, | ||
4417 | 0x19, 0x6b, 0xec, 0x58, 0x4f, 0xb9, 0x75, 0xa7, | ||
4418 | 0xdd, 0x3f, 0x2f, 0xec, 0xc8, 0x5a, 0x84, 0xab, | ||
4419 | 0xd5, 0xe4, 0x8a, 0x07, 0xf6, 0x4d, 0x23, 0xd6, | ||
4420 | 0x03, 0xfb, 0x03, 0x6a, 0xea, 0x66, 0xbf, 0xd4, | ||
4421 | 0xb1, 0x34, 0xfb, 0x78, 0xe9, 0x55, 0xdc, 0x7c, | ||
4422 | 0x3d, 0x9c, 0xe5, 0x9a, 0xac, 0xc3, 0x7a, 0x80, | ||
4423 | 0x24, 0x6d, 0xa0, 0xef, 0x25, 0x7c, 0xb7, 0xea, | ||
4424 | 0xce, 0x4d, 0x5f, 0x18, 0x60, 0xce, 0x87, 0x22, | ||
4425 | 0x66, 0x2f, 0xd5, 0xdd, 0xdd, 0x02, 0x21, 0x75, | ||
4426 | 0x82, 0xa0, 0x1f, 0x58, 0xc6, 0xd3, 0x62, 0xf7, | ||
4427 | 0x32, 0xd8, 0xaf, 0x1e, 0x07, 0x77, 0x51, 0x96, | ||
4428 | 0xd5, 0x6b, 0x1e, 0x7e, 0x80, 0x02, 0xe8, 0x67, | ||
4429 | 0xea, 0x17, 0x0b, 0x10, 0xd2, 0x3f, 0x28, 0x25, | ||
4430 | 0x4f, 0x05, 0x77, 0x02, 0x14, 0x69, 0xf0, 0x2c, | ||
4431 | 0xbe, 0x0c, 0xf1, 0x74, 0x30, 0xd1, 0xb9, 0x9b, | ||
4432 | 0xfc, 0x8c, 0xbb, 0x04, 0x16, 0xd9, 0xba, 0xc3, | ||
4433 | 0xbc, 0x91, 0x8a, 0xc4, 0x30, 0xa4, 0xb0, 0x12, | ||
4434 | 0x4c, 0x21, 0x87, 0xcb, 0xc9, 0x1d, 0x16, 0x96, | ||
4435 | 0x07, 0x6f, 0x23, 0x54, 0xb9, 0x6f, 0x79, 0xe5, | ||
4436 | 0x64, 0xc0, 0x64, 0xda, 0xb1, 0xae, 0xdd, 0x60, | ||
4437 | 0x6c, 0x1a, 0x9d, 0xd3, 0x04, 0x8e, 0x45, 0xb0, | ||
4438 | 0x92, 0x61, 0xd0, 0x48, 0x81, 0xed, 0x5e, 0x1d, | ||
4439 | 0xa0, 0xc9, 0xa4, 0x33, 0xc7, 0x13, 0x51, 0x5d, | ||
4440 | 0x7f, 0x83, 0x73, 0xb6, 0x70, 0x18, 0x65, 0x3e, | ||
4441 | 0x2f, 0x0e, 0x7a, 0x12, 0x39, 0x98, 0xab, 0xd8, | ||
4442 | 0x7e, 0x6f, 0xa3, 0xd1, 0xba, 0x56, 0xad, 0xbd, | ||
4443 | 0xf0, 0x03, 0x01, 0x1c, 0x85, 0x35, 0x9f, 0xeb, | ||
4444 | 0x19, 0x63, 0xa1, 0xaf, 0xfe, 0x2d, 0x35, 0x50, | ||
4445 | 0x39, 0xa0, 0x65, 0x7c, 0x95, 0x7e, 0x6b, 0xfe, | ||
4446 | 0xc1, 0xac, 0x07, 0x7c, 0x98, 0x4f, 0xbe, 0x57, | ||
4447 | 0xa7, 0x22, 0xec, 0xe2, 0x7e, 0x29, 0x09, 0x53, | ||
4448 | 0xe8, 0xbf, 0xb4, 0x7e, 0x3f, 0x8f, 0xfc, 0x14, | ||
4449 | 0xce, 0x54, 0xf9, 0x18, 0x58, 0xb5, 0xff, 0x44, | ||
4450 | 0x05, 0x9d, 0xce, 0x1b, 0xb6, 0x82, 0x23, 0xc8, | ||
4451 | 0x2e, 0xbc, 0x69, 0xbb, 0x4a, 0x29, 0x0f, 0x65, | ||
4452 | 0x94, 0xf0, 0x63, 0x06, 0x0e, 0xef, 0x8c, 0xbd, | ||
4453 | 0xff, 0xfd, 0xb0, 0x21, 0x6e, 0x57, 0x05, 0x75, | ||
4454 | 0xda, 0xd5, 0xc4, 0xeb, 0x8d, 0x32, 0xf7, 0x50, | ||
4455 | 0xd3, 0x6f, 0x22, 0xed, 0x5f, 0x8e, 0xa2, 0x5b, | ||
4456 | 0x80, 0x8c, 0xc8, 0x78, 0x40, 0x24, 0x4b, 0x89, | ||
4457 | 0x30, 0xce, 0x7a, 0x97, 0x0e, 0xc4, 0xaf, 0xef, | ||
4458 | 0x9b, 0xb4, 0xcd, 0x66, 0x74, 0x14, 0x04, 0x2b, | ||
4459 | 0xf7, 0xce, 0x0b, 0x1c, 0x6e, 0xc2, 0x78, 0x8c, | ||
4460 | 0xca, 0xc5, 0xd0, 0x1c, 0x95, 0x4a, 0x91, 0x2d, | ||
4461 | 0xa7, 0x20, 0xeb, 0x86, 0x52, 0xb7, 0x67, 0xd8, | ||
4462 | 0x0c, 0xd6, 0x04, 0x14, 0xde, 0x51, 0x74, 0x75, | ||
4463 | 0xe7, 0x11, 0xb4, 0x87, 0xa3, 0x3d, 0x2d, 0xad, | ||
4464 | 0x4f, 0xef, 0xa0, 0x0f, 0x70, 0x00, 0x6d, 0x13, | ||
4465 | 0x19, 0x1d, 0x41, 0x50, 0xe9, 0xd8, 0xf0, 0x32, | ||
4466 | 0x71, 0xbc, 0xd3, 0x11, 0xf2, 0xac, 0xbe, 0xaf, | ||
4467 | 0x75, 0x46, 0x65, 0x4e, 0x07, 0x34, 0x37, 0xa3, | ||
4468 | 0x89, 0xfe, 0x75, 0xd4, 0x70, 0x4c, 0xc6, 0x3f, | ||
4469 | 0x69, 0x24, 0x0e, 0x38, 0x67, 0x43, 0x8c, 0xde, | ||
4470 | 0x06, 0xb5, 0xb8, 0xe7, 0xc4, 0xf0, 0x41, 0x8f, | ||
4471 | 0xf0, 0xbd, 0x2f, 0x0b, 0xb9, 0x18, 0xf8, 0xde, | ||
4472 | 0x64, 0xb1, 0xdb, 0xee, 0x00, 0x50, 0x77, 0xe1, | ||
4473 | 0xc7, 0xff, 0xa6, 0xfa, 0xdd, 0x70, 0xf4, 0xe3, | ||
4474 | 0x93, 0xe9, 0x77, 0x35, 0x3d, 0x4b, 0x2f, 0x2b, | ||
4475 | 0x6d, 0x55, 0xf0, 0xfc, 0x88, 0x54, 0x4e, 0x89, | ||
4476 | 0xc1, 0x8a, 0x23, 0x31, 0x2d, 0x14, 0x2a, 0xb8, | ||
4477 | 0x1b, 0x15, 0xdd, 0x9e, 0x6e, 0x7b, 0xda, 0x05, | ||
4478 | 0x91, 0x7d, 0x62, 0x64, 0x96, 0x72, 0xde, 0xfc, | ||
4479 | 0xc1, 0xec, 0xf0, 0x23, 0x51, 0x6f, 0xdb, 0x5b, | ||
4480 | 0x1d, 0x08, 0x57, 0xce, 0x09, 0xb8, 0xf6, 0xcd, | ||
4481 | 0x8d, 0x95, 0xf2, 0x20, 0xbf, 0x0f, 0x20, 0x57, | ||
4482 | 0x98, 0x81, 0x84, 0x4f, 0x15, 0x5c, 0x76, 0xe7, | ||
4483 | 0x3e, 0x0a, 0x3a, 0x6c, 0xc4, 0x8a, 0xbe, 0x78, | ||
4484 | 0x74, 0x77, 0xc3, 0x09, 0x4b, 0x5d, 0x48, 0xe4, | ||
4485 | 0xc8, 0xcb, 0x0b, 0xea, 0x17, 0x28, 0xcf, 0xcf, | ||
4486 | 0x31, 0x32, 0x44, 0xa4, 0xe5, 0x0e, 0x1a, 0x98, | ||
4487 | 0x94, 0xc4, 0xf0, 0xff, 0xae, 0x3e, 0x44, 0xe8, | ||
4488 | 0xa5, 0xb3, 0xb5, 0x37, 0x2f, 0xe8, 0xaf, 0x6f, | ||
4489 | 0x28, 0xc1, 0x37, 0x5f, 0x31, 0xd2, 0xb9, 0x33, | ||
4490 | 0xb1, 0xb2, 0x52, 0x94, 0x75, 0x2c, 0x29, 0x59, | ||
4491 | 0x06, 0xc2, 0x25, 0xe8, 0x71, 0x65, 0x4e, 0xed, | ||
4492 | 0xc0, 0x9c, 0xb1, 0xbb, 0x25, 0xdc, 0x6c, 0xe7, | ||
4493 | 0x4b, 0xa5, 0x7a, 0x54, 0x7a, 0x60, 0xff, 0x7a, | ||
4494 | 0xe0, 0x50, 0x40, 0x96, 0x35, 0x63, 0xe4, 0x0b, | ||
4495 | 0x76, 0xbd, 0xa4, 0x65, 0x00, 0x1b, 0x57, 0x88, | ||
4496 | 0xae, 0xed, 0x39, 0x88, 0x42, 0x11, 0x3c, 0xed, | ||
4497 | 0x85, 0x67, 0x7d, 0xb9, 0x68, 0x82, 0xe9, 0x43, | ||
4498 | 0x3c, 0x47, 0x53, 0xfa, 0xe8, 0xf8, 0x9f, 0x1f, | ||
4499 | 0x9f, 0xef, 0x0f, 0xf7, 0x30, 0xd9, 0x30, 0x0e, | ||
4500 | 0xb9, 0x9f, 0x69, 0x18, 0x2f, 0x7e, 0xf8, 0xf8, | ||
4501 | 0xf8, 0x8c, 0x0f, 0xd4, 0x02, 0x4d, 0xea, 0xcd, | ||
4502 | 0x0a, 0x9c, 0x6f, 0x71, 0x6d, 0x5a, 0x4c, 0x60, | ||
4503 | 0xce, 0x20, 0x56, 0x32, 0xc6, 0xc5, 0x99, 0x1f, | ||
4504 | 0x09, 0xe6, 0x4e, 0x18, 0x1a, 0x15, 0x13, 0xa8, | ||
4505 | 0x7d, 0xb1, 0x6b, 0xc0, 0xb2, 0x6d, 0xf8, 0x26, | ||
4506 | 0x66, 0xf8, 0x3d, 0x18, 0x74, 0x70, 0x66, 0x7a, | ||
4507 | 0x34, 0x17, 0xde, 0xba, 0x47, 0xf1, 0x06, 0x18, | ||
4508 | 0xcb, 0xaf, 0xeb, 0x4a, 0x1e, 0x8f, 0xa7, 0x77, | ||
4509 | 0xe0, 0x3b, 0x78, 0x62, 0x66, 0xc9, 0x10, 0xea, | ||
4510 | 0x1f, 0xb7, 0x29, 0x0a, 0x45, 0xa1, 0x1d, 0x1e, | ||
4511 | 0x1d, 0xe2, 0x65, 0x61, 0x50, 0x9c, 0xd7, 0x05, | ||
4512 | 0xf2, 0x0b, 0x5b, 0x12, 0x61, 0x02, 0xc8, 0xe5, | ||
4513 | 0x63, 0x4f, 0x20, 0x0c, 0x07, 0x17, 0x33, 0x5e, | ||
4514 | 0x03, 0x9a, 0x53, 0x0f, 0x2e, 0x55, 0xfe, 0x50, | ||
4515 | 0x43, 0x7d, 0xd0, 0xb6, 0x7e, 0x5a, 0xda, 0xae, | ||
4516 | 0x58, 0xef, 0x15, 0xa9, 0x83, 0xd9, 0x46, 0xb1, | ||
4517 | 0x42, 0xaa, 0xf5, 0x02, 0x6c, 0xce, 0x92, 0x06, | ||
4518 | 0x1b, 0xdb, 0x66, 0x45, 0x91, 0x79, 0xc2, 0x2d, | ||
4519 | 0xe6, 0x53, 0xd3, 0x14, 0xfd, 0xbb, 0x44, 0x63, | ||
4520 | 0xc6, 0xd7, 0x3d, 0x7a, 0x0c, 0x75, 0x78, 0x9d, | ||
4521 | 0x5c, 0xa6, 0x39, 0xb3, 0xe5, 0x63, 0xca, 0x8b, | ||
4522 | 0xfe, 0xd3, 0xef, 0x60, 0x83, 0xf6, 0x8e, 0x70, | ||
4523 | 0xb6, 0x67, 0xc7, 0x77, 0xed, 0x23, 0xef, 0x4c, | ||
4524 | 0xf0, 0xed, 0x2d, 0x07, 0x59, 0x6f, 0xc1, 0x01, | ||
4525 | 0x34, 0x37, 0x08, 0xab, 0xd9, 0x1f, 0x09, 0xb1, | ||
4526 | 0xce, 0x5b, 0x17, 0xff, 0x74, 0xf8, 0x9c, 0xd5, | ||
4527 | 0x2c, 0x56, 0x39, 0x79, 0x0f, 0x69, 0x44, 0x75, | ||
4528 | 0x58, 0x27, 0x01, 0xc4, 0xbf, 0xa7, 0xa1, 0x1d, | ||
4529 | 0x90, 0x17, 0x77, 0x86, 0x5a, 0x3f, 0xd9, 0xd1, | ||
4530 | 0x0e, 0xa0, 0x10, 0xf8, 0xec, 0x1e, 0xa5, 0x7f, | ||
4531 | 0x5e, 0x36, 0xd1, 0xe3, 0x04, 0x2c, 0x70, 0xf7, | ||
4532 | 0x8e, 0xc0, 0x98, 0x2f, 0x6c, 0x94, 0x2b, 0x41, | ||
4533 | 0xb7, 0x60, 0x00, 0xb7, 0x2e, 0xb8, 0x02, 0x8d, | ||
4534 | 0xb8, 0xb0, 0xd3, 0x86, 0xba, 0x1d, 0xd7, 0x90, | ||
4535 | 0xd6, 0xb6, 0xe1, 0xfc, 0xd7, 0xd8, 0x28, 0x06, | ||
4536 | 0x63, 0x9b, 0xce, 0x61, 0x24, 0x79, 0xc0, 0x70, | ||
4537 | 0x52, 0xd0, 0xb6, 0xd4, 0x28, 0x95, 0x24, 0x87, | ||
4538 | 0x03, 0x1f, 0xb7, 0x9a, 0xda, 0xa3, 0xfb, 0x52, | ||
4539 | 0x5b, 0x68, 0xe7, 0x4c, 0x8c, 0x24, 0xe1, 0x42, | ||
4540 | 0xf7, 0xd5, 0xfd, 0xad, 0x06, 0x32, 0x9f, 0xba, | ||
4541 | 0xc1, 0xfc, 0xdd, 0xc6, 0xfc, 0xfc, 0xb3, 0x38, | ||
4542 | 0x74, 0x56, 0x58, 0x40, 0x02, 0x37, 0x52, 0x2c, | ||
4543 | 0x55, 0xcc, 0xb3, 0x9e, 0x7a, 0xe9, 0xd4, 0x38, | ||
4544 | 0x41, 0x5e, 0x0c, 0x35, 0xe2, 0x11, 0xd1, 0x13, | ||
4545 | 0xf8, 0xb7, 0x8d, 0x72, 0x6b, 0x22, 0x2a, 0xb0, | ||
4546 | 0xdb, 0x08, 0xba, 0x35, 0xb9, 0x3f, 0xc8, 0xd3, | ||
4547 | 0x24, 0x90, 0xec, 0x58, 0xd2, 0x09, 0xc7, 0x2d, | ||
4548 | 0xed, 0x38, 0x80, 0x36, 0x72, 0x43, 0x27, 0x49, | ||
4549 | 0x4a, 0x80, 0x8a, 0xa2, 0xe8, 0xd3, 0xda, 0x30, | ||
4550 | 0x7d, 0xb6, 0x82, 0x37, 0x86, 0x92, 0x86, 0x3e, | ||
4551 | 0x08, 0xb2, 0x28, 0x5a, 0x55, 0x44, 0x24, 0x7d, | ||
4552 | 0x40, 0x48, 0x8a, 0xb6, 0x89, 0x58, 0x08, 0xa0, | ||
4553 | 0xd6, 0x6d, 0x3a, 0x17, 0xbf, 0xf6, 0x54, 0xa2, | ||
4554 | 0xf5, 0xd3, 0x8c, 0x0f, 0x78, 0x12, 0x57, 0x8b, | ||
4555 | 0xd5, 0xc2, 0xfd, 0x58, 0x5b, 0x7f, 0x38, 0xe3, | ||
4556 | 0xcc, 0xb7, 0x7c, 0x48, 0xb3, 0x20, 0xe8, 0x81, | ||
4557 | 0x14, 0x32, 0x45, 0x05, 0xe0, 0xdb, 0x9f, 0x75, | ||
4558 | 0x85, 0xb4, 0x6a, 0xfc, 0x95, 0xe3, 0x54, 0x22, | ||
4559 | 0x12, 0xee, 0x30, 0xfe, 0xd8, 0x30, 0xef, 0x34, | ||
4560 | 0x50, 0xab, 0x46, 0x30, 0x98, 0x2f, 0xb7, 0xc0, | ||
4561 | 0x15, 0xa2, 0x83, 0xb6, 0xf2, 0x06, 0x21, 0xa2, | ||
4562 | 0xc3, 0x26, 0x37, 0x14, 0xd1, 0x4d, 0xb5, 0x10, | ||
4563 | 0x52, 0x76, 0x4d, 0x6a, 0xee, 0xb5, 0x2b, 0x15, | ||
4564 | 0xb7, 0xf9, 0x51, 0xe8, 0x2a, 0xaf, 0xc7, 0xfa, | ||
4565 | 0x77, 0xaf, 0xb0, 0x05, 0x4d, 0xd1, 0x68, 0x8e, | ||
4566 | 0x74, 0x05, 0x9f, 0x9d, 0x93, 0xa5, 0x3e, 0x7f, | ||
4567 | 0x4e, 0x5f, 0x9d, 0xcb, 0x09, 0xc7, 0x83, 0xe3, | ||
4568 | 0x02, 0x9d, 0x27, 0x1f, 0xef, 0x85, 0x05, 0x8d, | ||
4569 | 0xec, 0x55, 0x88, 0x0f, 0x0d, 0x7c, 0x4c, 0xe8, | ||
4570 | 0xa1, 0x75, 0xa0, 0xd8, 0x06, 0x47, 0x14, 0xef, | ||
4571 | 0xaa, 0x61, 0xcf, 0x26, 0x15, 0xad, 0xd8, 0xa3, | ||
4572 | 0xaa, 0x75, 0xf2, 0x78, 0x4a, 0x5a, 0x61, 0xdf, | ||
4573 | 0x8b, 0xc7, 0x04, 0xbc, 0xb2, 0x32, 0xd2, 0x7e, | ||
4574 | 0x42, 0xee, 0xb4, 0x2f, 0x51, 0xff, 0x7b, 0x2e, | ||
4575 | 0xd3, 0x02, 0xe8, 0xdc, 0x5d, 0x0d, 0x50, 0xdc, | ||
4576 | 0xae, 0xb7, 0x46, 0xf9, 0xa8, 0xe6, 0xd0, 0x16, | ||
4577 | 0xcc, 0xe6, 0x2c, 0x81, 0xc7, 0xad, 0xe9, 0xf0, | ||
4578 | 0x05, 0x72, 0x6d, 0x3d, 0x0a, 0x7a, 0xa9, 0x02, | ||
4579 | 0xac, 0x82, 0x93, 0x6e, 0xb6, 0x1c, 0x28, 0xfc, | ||
4580 | 0x44, 0x12, 0xfb, 0x73, 0x77, 0xd4, 0x13, 0x39, | ||
4581 | 0x29, 0x88, 0x8a, 0xf3, 0x5c, 0xa6, 0x36, 0xa0, | ||
4582 | 0x2a, 0xed, 0x7e, 0xb1, 0x1d, 0xd6, 0x4c, 0x6b, | ||
4583 | 0x41, 0x01, 0x18, 0x5d, 0x5d, 0x07, 0x97, 0xa6, | ||
4584 | 0x4b, 0xef, 0x31, 0x18, 0xea, 0xac, 0xb1, 0x84, | ||
4585 | 0x21, 0xed, 0xda, 0x86, | ||
4586 | }, | ||
4587 | .rlen = 4100, | ||
4588 | }, | ||
4589 | }; | ||
4590 | |||
4591 | static struct cipher_testvec aes_ctr_dec_tv_template[] = { | ||
4592 | { /* From RFC 3686 */ | ||
4593 | .key = { 0xae, 0x68, 0x52, 0xf8, 0x12, 0x10, 0x67, 0xcc, | ||
4594 | 0x4b, 0xf7, 0xa5, 0x76, 0x55, 0x77, 0xf3, 0x9e, | ||
4595 | 0x00, 0x00, 0x00, 0x30 }, | ||
4596 | .klen = 20, | ||
4597 | .iv = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, | ||
4598 | .input = { 0xe4, 0x09, 0x5d, 0x4f, 0xb7, 0xa7, 0xb3, 0x79, | ||
4599 | 0x2d, 0x61, 0x75, 0xa3, 0x26, 0x13, 0x11, 0xb8 }, | ||
4600 | .ilen = 16, | ||
4601 | .result = { "Single block msg" }, | ||
4602 | .rlen = 16, | ||
4603 | }, { | ||
4604 | .key = { 0x7e, 0x24, 0x06, 0x78, 0x17, 0xfa, 0xe0, 0xd7, | ||
4605 | 0x43, 0xd6, 0xce, 0x1f, 0x32, 0x53, 0x91, 0x63, | ||
4606 | 0x00, 0x6c, 0xb6, 0xdb }, | ||
4607 | .klen = 20, | ||
4608 | .iv = { 0xc0, 0x54, 0x3b, 0x59, 0xda, 0x48, 0xd9, 0x0b }, | ||
4609 | .input = { 0x51, 0x04, 0xa1, 0x06, 0x16, 0x8a, 0x72, 0xd9, | ||
4610 | 0x79, 0x0d, 0x41, 0xee, 0x8e, 0xda, 0xd3, 0x88, | ||
4611 | 0xeb, 0x2e, 0x1e, 0xfc, 0x46, 0xda, 0x57, 0xc8, | ||
4612 | 0xfc, 0xe6, 0x30, 0xdf, 0x91, 0x41, 0xbe, 0x28 }, | ||
4613 | .ilen = 32, | ||
4614 | .result = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
4615 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, | ||
4616 | 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, | ||
4617 | 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f }, | ||
4618 | .rlen = 32, | ||
4619 | }, { | ||
4620 | .key = { 0x16, 0xaf, 0x5b, 0x14, 0x5f, 0xc9, 0xf5, 0x79, | ||
4621 | 0xc1, 0x75, 0xf9, 0x3e, 0x3b, 0xfb, 0x0e, 0xed, | ||
4622 | 0x86, 0x3d, 0x06, 0xcc, 0xfd, 0xb7, 0x85, 0x15, | ||
4623 | 0x00, 0x00, 0x00, 0x48 }, | ||
4624 | .klen = 28, | ||
4625 | .iv = { 0x36, 0x73, 0x3c, 0x14, 0x7d, 0x6d, 0x93, 0xcb }, | ||
4626 | .input = { 0x4b, 0x55, 0x38, 0x4f, 0xe2, 0x59, 0xc9, 0xc8, | ||
4627 | 0x4e, 0x79, 0x35, 0xa0, 0x03, 0xcb, 0xe9, 0x28 }, | ||
4628 | .ilen = 16, | ||
4629 | .result = { "Single block msg" }, | ||
4630 | .rlen = 16, | ||
4631 | }, { | ||
4632 | .key = { 0x7c, 0x5c, 0xb2, 0x40, 0x1b, 0x3d, 0xc3, 0x3c, | ||
4633 | 0x19, 0xe7, 0x34, 0x08, 0x19, 0xe0, 0xf6, 0x9c, | ||
4634 | 0x67, 0x8c, 0x3d, 0xb8, 0xe6, 0xf6, 0xa9, 0x1a, | ||
4635 | 0x00, 0x96, 0xb0, 0x3b }, | ||
4636 | .klen = 28, | ||
4637 | .iv = { 0x02, 0x0c, 0x6e, 0xad, 0xc2, 0xcb, 0x50, 0x0d }, | ||
4638 | .input = { 0x45, 0x32, 0x43, 0xfc, 0x60, 0x9b, 0x23, 0x32, | ||
4639 | 0x7e, 0xdf, 0xaa, 0xfa, 0x71, 0x31, 0xcd, 0x9f, | ||
4640 | 0x84, 0x90, 0x70, 0x1c, 0x5a, 0xd4, 0xa7, 0x9c, | ||
4641 | 0xfc, 0x1f, 0xe0, 0xff, 0x42, 0xf4, 0xfb, 0x00 }, | ||
4642 | .ilen = 32, | ||
4643 | .result = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
4644 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, | ||
4645 | 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, | ||
4646 | 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f }, | ||
4647 | .rlen = 32, | ||
4648 | }, { | ||
4649 | .key = { 0x77, 0x6b, 0xef, 0xf2, 0x85, 0x1d, 0xb0, 0x6f, | ||
4650 | 0x4c, 0x8a, 0x05, 0x42, 0xc8, 0x69, 0x6f, 0x6c, | ||
4651 | 0x6a, 0x81, 0xaf, 0x1e, 0xec, 0x96, 0xb4, 0xd3, | ||
4652 | 0x7f, 0xc1, 0xd6, 0x89, 0xe6, 0xc1, 0xc1, 0x04, | ||
4653 | 0x00, 0x00, 0x00, 0x60 }, | ||
4654 | .klen = 36, | ||
4655 | .iv = { 0xdb, 0x56, 0x72, 0xc9, 0x7a, 0xa8, 0xf0, 0xb2 }, | ||
4656 | .input = { 0x14, 0x5a, 0xd0, 0x1d, 0xbf, 0x82, 0x4e, 0xc7, | ||
4657 | 0x56, 0x08, 0x63, 0xdc, 0x71, 0xe3, 0xe0, 0xc0 }, | ||
4658 | .ilen = 16, | ||
4659 | .result = { "Single block msg" }, | ||
4660 | .rlen = 16, | ||
4661 | }, { | ||
4662 | .key = { 0xf6, 0xd6, 0x6d, 0x6b, 0xd5, 0x2d, 0x59, 0xbb, | ||
4663 | 0x07, 0x96, 0x36, 0x58, 0x79, 0xef, 0xf8, 0x86, | ||
4664 | 0xc6, 0x6d, 0xd5, 0x1a, 0x5b, 0x6a, 0x99, 0x74, | ||
4665 | 0x4b, 0x50, 0x59, 0x0c, 0x87, 0xa2, 0x38, 0x84, | ||
4666 | 0x00, 0xfa, 0xac, 0x24 }, | ||
4667 | .klen = 36, | ||
4668 | .iv = { 0xc1, 0x58, 0x5e, 0xf1, 0x5a, 0x43, 0xd8, 0x75 }, | ||
4669 | .input = { 0xf0, 0x5e, 0x23, 0x1b, 0x38, 0x94, 0x61, 0x2c, | ||
4670 | 0x49, 0xee, 0x00, 0x0b, 0x80, 0x4e, 0xb2, 0xa9, | ||
4671 | 0xb8, 0x30, 0x6b, 0x50, 0x8f, 0x83, 0x9d, 0x6a, | ||
4672 | 0x55, 0x30, 0x83, 0x1d, 0x93, 0x44, 0xaf, 0x1c }, | ||
4673 | .ilen = 32, | ||
4674 | .result = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
4675 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, | ||
4676 | 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, | ||
4677 | 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f }, | ||
4678 | .rlen = 32, | ||
4679 | }, | ||
4680 | }; | ||
4681 | |||
4682 | static struct aead_testvec aes_gcm_enc_tv_template[] = { | ||
4683 | { /* From McGrew & Viega - http://citeseer.ist.psu.edu/656989.html */ | ||
4684 | .klen = 16, | ||
4685 | .result = { 0x58, 0xe2, 0xfc, 0xce, 0xfa, 0x7e, 0x30, 0x61, | ||
4686 | 0x36, 0x7f, 0x1d, 0x57, 0xa4, 0xe7, 0x45, 0x5a }, | ||
4687 | .rlen = 16, | ||
4688 | }, { | ||
4689 | .klen = 16, | ||
4690 | .ilen = 16, | ||
4691 | .result = { 0x03, 0x88, 0xda, 0xce, 0x60, 0xb6, 0xa3, 0x92, | ||
4692 | 0xf3, 0x28, 0xc2, 0xb9, 0x71, 0xb2, 0xfe, 0x78, | ||
4693 | 0xab, 0x6e, 0x47, 0xd4, 0x2c, 0xec, 0x13, 0xbd, | ||
4694 | 0xf5, 0x3a, 0x67, 0xb2, 0x12, 0x57, 0xbd, 0xdf }, | ||
4695 | .rlen = 32, | ||
4696 | }, { | ||
4697 | .key = { 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c, | ||
4698 | 0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08 }, | ||
4699 | .klen = 16, | ||
4700 | .iv = { 0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad, | ||
4701 | 0xde, 0xca, 0xf8, 0x88 }, | ||
4702 | .input = { 0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5, | ||
4703 | 0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26, 0x9a, | ||
4704 | 0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda, | ||
4705 | 0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72, | ||
4706 | 0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53, | ||
4707 | 0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25, | ||
4708 | 0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57, | ||
4709 | 0xba, 0x63, 0x7b, 0x39, 0x1a, 0xaf, 0xd2, 0x55 }, | ||
4710 | .ilen = 64, | ||
4711 | .result = { 0x42, 0x83, 0x1e, 0xc2, 0x21, 0x77, 0x74, 0x24, | ||
4712 | 0x4b, 0x72, 0x21, 0xb7, 0x84, 0xd0, 0xd4, 0x9c, | ||
4713 | 0xe3, 0xaa, 0x21, 0x2f, 0x2c, 0x02, 0xa4, 0xe0, | ||
4714 | 0x35, 0xc1, 0x7e, 0x23, 0x29, 0xac, 0xa1, 0x2e, | ||
4715 | 0x21, 0xd5, 0x14, 0xb2, 0x54, 0x66, 0x93, 0x1c, | ||
4716 | 0x7d, 0x8f, 0x6a, 0x5a, 0xac, 0x84, 0xaa, 0x05, | ||
4717 | 0x1b, 0xa3, 0x0b, 0x39, 0x6a, 0x0a, 0xac, 0x97, | ||
4718 | 0x3d, 0x58, 0xe0, 0x91, 0x47, 0x3f, 0x59, 0x85, | ||
4719 | 0x4d, 0x5c, 0x2a, 0xf3, 0x27, 0xcd, 0x64, 0xa6, | ||
4720 | 0x2c, 0xf3, 0x5a, 0xbd, 0x2b, 0xa6, 0xfa, 0xb4 }, | ||
4721 | .rlen = 80, | ||
4722 | }, { | ||
4723 | .key = { 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c, | ||
4724 | 0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08 }, | ||
4725 | .klen = 16, | ||
4726 | .iv = { 0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad, | ||
4727 | 0xde, 0xca, 0xf8, 0x88 }, | ||
4728 | .input = { 0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5, | ||
4729 | 0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26, 0x9a, | ||
4730 | 0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda, | ||
4731 | 0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72, | ||
4732 | 0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53, | ||
4733 | 0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25, | ||
4734 | 0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57, | ||
4735 | 0xba, 0x63, 0x7b, 0x39 }, | ||
4736 | .ilen = 60, | ||
4737 | .assoc = { 0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef, | ||
4738 | 0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef, | ||
4739 | 0xab, 0xad, 0xda, 0xd2 }, | ||
4740 | .alen = 20, | ||
4741 | .result = { 0x42, 0x83, 0x1e, 0xc2, 0x21, 0x77, 0x74, 0x24, | ||
4742 | 0x4b, 0x72, 0x21, 0xb7, 0x84, 0xd0, 0xd4, 0x9c, | ||
4743 | 0xe3, 0xaa, 0x21, 0x2f, 0x2c, 0x02, 0xa4, 0xe0, | ||
4744 | 0x35, 0xc1, 0x7e, 0x23, 0x29, 0xac, 0xa1, 0x2e, | ||
4745 | 0x21, 0xd5, 0x14, 0xb2, 0x54, 0x66, 0x93, 0x1c, | ||
4746 | 0x7d, 0x8f, 0x6a, 0x5a, 0xac, 0x84, 0xaa, 0x05, | ||
4747 | 0x1b, 0xa3, 0x0b, 0x39, 0x6a, 0x0a, 0xac, 0x97, | ||
4748 | 0x3d, 0x58, 0xe0, 0x91, | ||
4749 | 0x5b, 0xc9, 0x4f, 0xbc, 0x32, 0x21, 0xa5, 0xdb, | ||
4750 | 0x94, 0xfa, 0xe9, 0x5a, 0xe7, 0x12, 0x1a, 0x47 }, | ||
4751 | .rlen = 76, | ||
4752 | }, { | ||
4753 | .klen = 24, | ||
4754 | .result = { 0xcd, 0x33, 0xb2, 0x8a, 0xc7, 0x73, 0xf7, 0x4b, | ||
4755 | 0xa0, 0x0e, 0xd1, 0xf3, 0x12, 0x57, 0x24, 0x35 }, | ||
4756 | .rlen = 16, | ||
4757 | }, { | ||
4758 | .klen = 24, | ||
4759 | .ilen = 16, | ||
4760 | .result = { 0x98, 0xe7, 0x24, 0x7c, 0x07, 0xf0, 0xfe, 0x41, | ||
4761 | 0x1c, 0x26, 0x7e, 0x43, 0x84, 0xb0, 0xf6, 0x00, | ||
4762 | 0x2f, 0xf5, 0x8d, 0x80, 0x03, 0x39, 0x27, 0xab, | ||
4763 | 0x8e, 0xf4, 0xd4, 0x58, 0x75, 0x14, 0xf0, 0xfb }, | ||
4764 | .rlen = 32, | ||
4765 | }, { | ||
4766 | .key = { 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c, | ||
4767 | 0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08, | ||
4768 | 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c }, | ||
4769 | .klen = 24, | ||
4770 | .iv = { 0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad, | ||
4771 | 0xde, 0xca, 0xf8, 0x88 }, | ||
4772 | .input = { 0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5, | ||
4773 | 0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26, 0x9a, | ||
4774 | 0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda, | ||
4775 | 0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72, | ||
4776 | 0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53, | ||
4777 | 0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25, | ||
4778 | 0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57, | ||
4779 | 0xba, 0x63, 0x7b, 0x39, 0x1a, 0xaf, 0xd2, 0x55 }, | ||
4780 | .ilen = 64, | ||
4781 | .result = { 0x39, 0x80, 0xca, 0x0b, 0x3c, 0x00, 0xe8, 0x41, | ||
4782 | 0xeb, 0x06, 0xfa, 0xc4, 0x87, 0x2a, 0x27, 0x57, | ||
4783 | 0x85, 0x9e, 0x1c, 0xea, 0xa6, 0xef, 0xd9, 0x84, | ||
4784 | 0x62, 0x85, 0x93, 0xb4, 0x0c, 0xa1, 0xe1, 0x9c, | ||
4785 | 0x7d, 0x77, 0x3d, 0x00, 0xc1, 0x44, 0xc5, 0x25, | ||
4786 | 0xac, 0x61, 0x9d, 0x18, 0xc8, 0x4a, 0x3f, 0x47, | ||
4787 | 0x18, 0xe2, 0x44, 0x8b, 0x2f, 0xe3, 0x24, 0xd9, | ||
4788 | 0xcc, 0xda, 0x27, 0x10, 0xac, 0xad, 0xe2, 0x56, | ||
4789 | 0x99, 0x24, 0xa7, 0xc8, 0x58, 0x73, 0x36, 0xbf, | ||
4790 | 0xb1, 0x18, 0x02, 0x4d, 0xb8, 0x67, 0x4a, 0x14 }, | ||
4791 | .rlen = 80, | ||
4792 | }, { | ||
4793 | .key = { 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c, | ||
4794 | 0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08, | ||
4795 | 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c }, | ||
4796 | .klen = 24, | ||
4797 | .iv = { 0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad, | ||
4798 | 0xde, 0xca, 0xf8, 0x88 }, | ||
4799 | .input = { 0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5, | ||
4800 | 0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26, 0x9a, | ||
4801 | 0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda, | ||
4802 | 0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72, | ||
4803 | 0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53, | ||
4804 | 0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25, | ||
4805 | 0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57, | ||
4806 | 0xba, 0x63, 0x7b, 0x39 }, | ||
4807 | .ilen = 60, | ||
4808 | .assoc = { 0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef, | ||
4809 | 0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef, | ||
4810 | 0xab, 0xad, 0xda, 0xd2 }, | ||
4811 | .alen = 20, | ||
4812 | .result = { 0x39, 0x80, 0xca, 0x0b, 0x3c, 0x00, 0xe8, 0x41, | ||
4813 | 0xeb, 0x06, 0xfa, 0xc4, 0x87, 0x2a, 0x27, 0x57, | ||
4814 | 0x85, 0x9e, 0x1c, 0xea, 0xa6, 0xef, 0xd9, 0x84, | ||
4815 | 0x62, 0x85, 0x93, 0xb4, 0x0c, 0xa1, 0xe1, 0x9c, | ||
4816 | 0x7d, 0x77, 0x3d, 0x00, 0xc1, 0x44, 0xc5, 0x25, | ||
4817 | 0xac, 0x61, 0x9d, 0x18, 0xc8, 0x4a, 0x3f, 0x47, | ||
4818 | 0x18, 0xe2, 0x44, 0x8b, 0x2f, 0xe3, 0x24, 0xd9, | ||
4819 | 0xcc, 0xda, 0x27, 0x10, | ||
4820 | 0x25, 0x19, 0x49, 0x8e, 0x80, 0xf1, 0x47, 0x8f, | ||
4821 | 0x37, 0xba, 0x55, 0xbd, 0x6d, 0x27, 0x61, 0x8c }, | ||
4822 | .rlen = 76, | ||
4823 | .np = 2, | ||
4824 | .tap = { 32, 28 }, | ||
4825 | .anp = 2, | ||
4826 | .atap = { 8, 12 } | ||
4827 | }, { | ||
4828 | .klen = 32, | ||
4829 | .result = { 0x53, 0x0f, 0x8a, 0xfb, 0xc7, 0x45, 0x36, 0xb9, | ||
4830 | 0xa9, 0x63, 0xb4, 0xf1, 0xc4, 0xcb, 0x73, 0x8b }, | ||
4831 | .rlen = 16, | ||
4832 | } | ||
4833 | }; | ||
4834 | |||
4835 | static struct aead_testvec aes_gcm_dec_tv_template[] = { | ||
4836 | { /* From McGrew & Viega - http://citeseer.ist.psu.edu/656989.html */ | ||
4837 | .klen = 32, | ||
4838 | .input = { 0xce, 0xa7, 0x40, 0x3d, 0x4d, 0x60, 0x6b, 0x6e, | ||
4839 | 0x07, 0x4e, 0xc5, 0xd3, 0xba, 0xf3, 0x9d, 0x18, | ||
4840 | 0xd0, 0xd1, 0xc8, 0xa7, 0x99, 0x99, 0x6b, 0xf0, | ||
4841 | 0x26, 0x5b, 0x98, 0xb5, 0xd4, 0x8a, 0xb9, 0x19 }, | ||
4842 | .ilen = 32, | ||
4843 | .rlen = 16, | ||
4844 | }, { | ||
4845 | .key = { 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c, | ||
4846 | 0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08, | ||
4847 | 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c, | ||
4848 | 0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08 }, | ||
4849 | .klen = 32, | ||
4850 | .iv = { 0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad, | ||
4851 | 0xde, 0xca, 0xf8, 0x88 }, | ||
4852 | .input = { 0x52, 0x2d, 0xc1, 0xf0, 0x99, 0x56, 0x7d, 0x07, | ||
4853 | 0xf4, 0x7f, 0x37, 0xa3, 0x2a, 0x84, 0x42, 0x7d, | ||
4854 | 0x64, 0x3a, 0x8c, 0xdc, 0xbf, 0xe5, 0xc0, 0xc9, | ||
4855 | 0x75, 0x98, 0xa2, 0xbd, 0x25, 0x55, 0xd1, 0xaa, | ||
4856 | 0x8c, 0xb0, 0x8e, 0x48, 0x59, 0x0d, 0xbb, 0x3d, | ||
4857 | 0xa7, 0xb0, 0x8b, 0x10, 0x56, 0x82, 0x88, 0x38, | ||
4858 | 0xc5, 0xf6, 0x1e, 0x63, 0x93, 0xba, 0x7a, 0x0a, | ||
4859 | 0xbc, 0xc9, 0xf6, 0x62, 0x89, 0x80, 0x15, 0xad, | ||
4860 | 0xb0, 0x94, 0xda, 0xc5, 0xd9, 0x34, 0x71, 0xbd, | ||
4861 | 0xec, 0x1a, 0x50, 0x22, 0x70, 0xe3, 0xcc, 0x6c }, | ||
4862 | .ilen = 80, | ||
4863 | .result = { 0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5, | ||
4864 | 0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26, 0x9a, | ||
4865 | 0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda, | ||
4866 | 0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72, | ||
4867 | 0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53, | ||
4868 | 0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25, | ||
4869 | 0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57, | ||
4870 | 0xba, 0x63, 0x7b, 0x39, 0x1a, 0xaf, 0xd2, 0x55 }, | ||
4871 | .rlen = 64, | ||
4872 | }, { | ||
4873 | .key = { 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c, | ||
4874 | 0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08, | ||
4875 | 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c, | ||
4876 | 0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08 }, | ||
4877 | .klen = 32, | ||
4878 | .iv = { 0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad, | ||
4879 | 0xde, 0xca, 0xf8, 0x88 }, | ||
4880 | .input = { 0x52, 0x2d, 0xc1, 0xf0, 0x99, 0x56, 0x7d, 0x07, | ||
4881 | 0xf4, 0x7f, 0x37, 0xa3, 0x2a, 0x84, 0x42, 0x7d, | ||
4882 | 0x64, 0x3a, 0x8c, 0xdc, 0xbf, 0xe5, 0xc0, 0xc9, | ||
4883 | 0x75, 0x98, 0xa2, 0xbd, 0x25, 0x55, 0xd1, 0xaa, | ||
4884 | 0x8c, 0xb0, 0x8e, 0x48, 0x59, 0x0d, 0xbb, 0x3d, | ||
4885 | 0xa7, 0xb0, 0x8b, 0x10, 0x56, 0x82, 0x88, 0x38, | ||
4886 | 0xc5, 0xf6, 0x1e, 0x63, 0x93, 0xba, 0x7a, 0x0a, | ||
4887 | 0xbc, 0xc9, 0xf6, 0x62, | ||
4888 | 0x76, 0xfc, 0x6e, 0xce, 0x0f, 0x4e, 0x17, 0x68, | ||
4889 | 0xcd, 0xdf, 0x88, 0x53, 0xbb, 0x2d, 0x55, 0x1b }, | ||
4890 | .ilen = 76, | ||
4891 | .assoc = { 0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef, | ||
4892 | 0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef, | ||
4893 | 0xab, 0xad, 0xda, 0xd2 }, | ||
4894 | .alen = 20, | ||
4895 | .result = { 0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5, | ||
4896 | 0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26, 0x9a, | ||
4897 | 0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda, | ||
4898 | 0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72, | ||
4899 | 0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53, | ||
4900 | 0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25, | ||
4901 | 0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57, | ||
4902 | 0xba, 0x63, 0x7b, 0x39 }, | ||
4903 | .rlen = 60, | ||
4904 | .np = 2, | ||
4905 | .tap = { 48, 28 }, | ||
4906 | .anp = 3, | ||
4907 | .atap = { 8, 8, 4 } | ||
4908 | }, { | ||
4909 | .key = { 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c, | ||
4910 | 0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08 }, | ||
4911 | .klen = 16, | ||
4912 | .iv = { 0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad, | ||
4913 | 0xde, 0xca, 0xf8, 0x88 }, | ||
4914 | .input = { 0x42, 0x83, 0x1e, 0xc2, 0x21, 0x77, 0x74, 0x24, | ||
4915 | 0x4b, 0x72, 0x21, 0xb7, 0x84, 0xd0, 0xd4, 0x9c, | ||
4916 | 0xe3, 0xaa, 0x21, 0x2f, 0x2c, 0x02, 0xa4, 0xe0, | ||
4917 | 0x35, 0xc1, 0x7e, 0x23, 0x29, 0xac, 0xa1, 0x2e, | ||
4918 | 0x21, 0xd5, 0x14, 0xb2, 0x54, 0x66, 0x93, 0x1c, | ||
4919 | 0x7d, 0x8f, 0x6a, 0x5a, 0xac, 0x84, 0xaa, 0x05, | ||
4920 | 0x1b, 0xa3, 0x0b, 0x39, 0x6a, 0x0a, 0xac, 0x97, | ||
4921 | 0x3d, 0x58, 0xe0, 0x91, 0x47, 0x3f, 0x59, 0x85, | ||
4922 | 0x4d, 0x5c, 0x2a, 0xf3, 0x27, 0xcd, 0x64, 0xa6, | ||
4923 | 0x2c, 0xf3, 0x5a, 0xbd, 0x2b, 0xa6, 0xfa, 0xb4 }, | ||
4924 | .ilen = 80, | ||
4925 | .result = { 0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5, | ||
4926 | 0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26, 0x9a, | ||
4927 | 0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda, | ||
4928 | 0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72, | ||
4929 | 0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53, | ||
4930 | 0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25, | ||
4931 | 0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57, | ||
4932 | 0xba, 0x63, 0x7b, 0x39, 0x1a, 0xaf, 0xd2, 0x55 }, | ||
4933 | .rlen = 64, | ||
4934 | }, { | ||
4935 | .key = { 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c, | ||
4936 | 0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08 }, | ||
4937 | .klen = 16, | ||
4938 | .iv = { 0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad, | ||
4939 | 0xde, 0xca, 0xf8, 0x88 }, | ||
4940 | .input = { 0x42, 0x83, 0x1e, 0xc2, 0x21, 0x77, 0x74, 0x24, | ||
4941 | 0x4b, 0x72, 0x21, 0xb7, 0x84, 0xd0, 0xd4, 0x9c, | ||
4942 | 0xe3, 0xaa, 0x21, 0x2f, 0x2c, 0x02, 0xa4, 0xe0, | ||
4943 | 0x35, 0xc1, 0x7e, 0x23, 0x29, 0xac, 0xa1, 0x2e, | ||
4944 | 0x21, 0xd5, 0x14, 0xb2, 0x54, 0x66, 0x93, 0x1c, | ||
4945 | 0x7d, 0x8f, 0x6a, 0x5a, 0xac, 0x84, 0xaa, 0x05, | ||
4946 | 0x1b, 0xa3, 0x0b, 0x39, 0x6a, 0x0a, 0xac, 0x97, | ||
4947 | 0x3d, 0x58, 0xe0, 0x91, | ||
4948 | 0x5b, 0xc9, 0x4f, 0xbc, 0x32, 0x21, 0xa5, 0xdb, | ||
4949 | 0x94, 0xfa, 0xe9, 0x5a, 0xe7, 0x12, 0x1a, 0x47 }, | ||
4950 | .ilen = 76, | ||
4951 | .assoc = { 0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef, | ||
4952 | 0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef, | ||
4953 | 0xab, 0xad, 0xda, 0xd2 }, | ||
4954 | .alen = 20, | ||
4955 | .result = { 0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5, | ||
4956 | 0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26, 0x9a, | ||
4957 | 0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda, | ||
4958 | 0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72, | ||
4959 | 0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53, | ||
4960 | 0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25, | ||
4961 | 0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57, | ||
4962 | 0xba, 0x63, 0x7b, 0x39 }, | ||
4963 | .rlen = 60, | ||
4964 | }, { | ||
4965 | .klen = 24, | ||
4966 | .input = { 0x98, 0xe7, 0x24, 0x7c, 0x07, 0xf0, 0xfe, 0x41, | ||
4967 | 0x1c, 0x26, 0x7e, 0x43, 0x84, 0xb0, 0xf6, 0x00, | ||
4968 | 0x2f, 0xf5, 0x8d, 0x80, 0x03, 0x39, 0x27, 0xab, | ||
4969 | 0x8e, 0xf4, 0xd4, 0x58, 0x75, 0x14, 0xf0, 0xfb }, | ||
4970 | .ilen = 32, | ||
4971 | .rlen = 16, | ||
4972 | }, { | ||
4973 | .key = { 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c, | ||
4974 | 0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08, | ||
4975 | 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c }, | ||
4976 | .klen = 24, | ||
4977 | .iv = { 0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad, | ||
4978 | 0xde, 0xca, 0xf8, 0x88 }, | ||
4979 | .input = { 0x39, 0x80, 0xca, 0x0b, 0x3c, 0x00, 0xe8, 0x41, | ||
4980 | 0xeb, 0x06, 0xfa, 0xc4, 0x87, 0x2a, 0x27, 0x57, | ||
4981 | 0x85, 0x9e, 0x1c, 0xea, 0xa6, 0xef, 0xd9, 0x84, | ||
4982 | 0x62, 0x85, 0x93, 0xb4, 0x0c, 0xa1, 0xe1, 0x9c, | ||
4983 | 0x7d, 0x77, 0x3d, 0x00, 0xc1, 0x44, 0xc5, 0x25, | ||
4984 | 0xac, 0x61, 0x9d, 0x18, 0xc8, 0x4a, 0x3f, 0x47, | ||
4985 | 0x18, 0xe2, 0x44, 0x8b, 0x2f, 0xe3, 0x24, 0xd9, | ||
4986 | 0xcc, 0xda, 0x27, 0x10, 0xac, 0xad, 0xe2, 0x56, | ||
4987 | 0x99, 0x24, 0xa7, 0xc8, 0x58, 0x73, 0x36, 0xbf, | ||
4988 | 0xb1, 0x18, 0x02, 0x4d, 0xb8, 0x67, 0x4a, 0x14 }, | ||
4989 | .ilen = 80, | ||
4990 | .result = { 0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5, | ||
4991 | 0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26, 0x9a, | ||
4992 | 0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda, | ||
4993 | 0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72, | ||
4994 | 0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53, | ||
4995 | 0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25, | ||
4996 | 0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57, | ||
4997 | 0xba, 0x63, 0x7b, 0x39, 0x1a, 0xaf, 0xd2, 0x55 }, | ||
4998 | .rlen = 64, | ||
4999 | }, { | ||
5000 | .key = { 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c, | ||
5001 | 0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08, | ||
5002 | 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c }, | ||
5003 | .klen = 24, | ||
5004 | .iv = { 0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad, | ||
5005 | 0xde, 0xca, 0xf8, 0x88 }, | ||
5006 | .input = { 0x39, 0x80, 0xca, 0x0b, 0x3c, 0x00, 0xe8, 0x41, | ||
5007 | 0xeb, 0x06, 0xfa, 0xc4, 0x87, 0x2a, 0x27, 0x57, | ||
5008 | 0x85, 0x9e, 0x1c, 0xea, 0xa6, 0xef, 0xd9, 0x84, | ||
5009 | 0x62, 0x85, 0x93, 0xb4, 0x0c, 0xa1, 0xe1, 0x9c, | ||
5010 | 0x7d, 0x77, 0x3d, 0x00, 0xc1, 0x44, 0xc5, 0x25, | ||
5011 | 0xac, 0x61, 0x9d, 0x18, 0xc8, 0x4a, 0x3f, 0x47, | ||
5012 | 0x18, 0xe2, 0x44, 0x8b, 0x2f, 0xe3, 0x24, 0xd9, | ||
5013 | 0xcc, 0xda, 0x27, 0x10, | ||
5014 | 0x25, 0x19, 0x49, 0x8e, 0x80, 0xf1, 0x47, 0x8f, | ||
5015 | 0x37, 0xba, 0x55, 0xbd, 0x6d, 0x27, 0x61, 0x8c }, | ||
5016 | .ilen = 76, | ||
5017 | .assoc = { 0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef, | ||
5018 | 0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef, | ||
5019 | 0xab, 0xad, 0xda, 0xd2 }, | ||
5020 | .alen = 20, | ||
5021 | .result = { 0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5, | ||
5022 | 0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26, 0x9a, | ||
5023 | 0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda, | ||
5024 | 0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72, | ||
5025 | 0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53, | ||
5026 | 0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25, | ||
5027 | 0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57, | ||
5028 | 0xba, 0x63, 0x7b, 0x39 }, | ||
5029 | .rlen = 60, | ||
5030 | } | ||
5031 | }; | ||
5032 | |||
5033 | static struct aead_testvec aes_ccm_enc_tv_template[] = { | ||
5034 | { /* From RFC 3610 */ | ||
5035 | .key = { 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, | ||
5036 | 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf }, | ||
5037 | .klen = 16, | ||
5038 | .iv = { 0x01, 0x00, 0x00, 0x00, 0x03, 0x02, 0x01, 0x00, | ||
5039 | 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0x00, 0x00 }, | ||
5040 | .assoc = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 }, | ||
5041 | .alen = 8, | ||
5042 | .input = { 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, | ||
5043 | 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, | ||
5044 | 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e }, | ||
5045 | .ilen = 23, | ||
5046 | .result = { 0x58, 0x8c, 0x97, 0x9a, 0x61, 0xc6, 0x63, 0xd2, | ||
5047 | 0xf0, 0x66, 0xd0, 0xc2, 0xc0, 0xf9, 0x89, 0x80, | ||
5048 | 0x6d, 0x5f, 0x6b, 0x61, 0xda, 0xc3, 0x84, 0x17, | ||
5049 | 0xe8, 0xd1, 0x2c, 0xfd, 0xf9, 0x26, 0xe0 }, | ||
5050 | .rlen = 31, | ||
5051 | }, { | ||
5052 | .key = { 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, | ||
5053 | 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf }, | ||
5054 | .klen = 16, | ||
5055 | .iv = { 0x01, 0x00, 0x00, 0x00, 0x07, 0x06, 0x05, 0x04, | ||
5056 | 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0x00, 0x00 }, | ||
5057 | .assoc = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
5058 | 0x08, 0x09, 0x0a, 0x0b }, | ||
5059 | .alen = 12, | ||
5060 | .input = { 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, | ||
5061 | 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, | ||
5062 | 0x1c, 0x1d, 0x1e, 0x1f }, | ||
5063 | .ilen = 20, | ||
5064 | .result = { 0xdc, 0xf1, 0xfb, 0x7b, 0x5d, 0x9e, 0x23, 0xfb, | ||
5065 | 0x9d, 0x4e, 0x13, 0x12, 0x53, 0x65, 0x8a, 0xd8, | ||
5066 | 0x6e, 0xbd, 0xca, 0x3e, 0x51, 0xe8, 0x3f, 0x07, | ||
5067 | 0x7d, 0x9c, 0x2d, 0x93 }, | ||
5068 | .rlen = 28, | ||
5069 | }, { | ||
5070 | .key = { 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, | ||
5071 | 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf }, | ||
5072 | .klen = 16, | ||
5073 | .iv = { 0x01, 0x00, 0x00, 0x00, 0x0b, 0x0a, 0x09, 0x08, | ||
5074 | 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0x00, 0x00 }, | ||
5075 | .assoc = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 }, | ||
5076 | .alen = 8, | ||
5077 | .input = { 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, | ||
5078 | 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, | ||
5079 | 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, | ||
5080 | 0x20 }, | ||
5081 | .ilen = 25, | ||
5082 | .result = { 0x82, 0x53, 0x1a, 0x60, 0xcc, 0x24, 0x94, 0x5a, | ||
5083 | 0x4b, 0x82, 0x79, 0x18, 0x1a, 0xb5, 0xc8, 0x4d, | ||
5084 | 0xf2, 0x1c, 0xe7, 0xf9, 0xb7, 0x3f, 0x42, 0xe1, | ||
5085 | 0x97, 0xea, 0x9c, 0x07, 0xe5, 0x6b, 0x5e, 0xb1, | ||
5086 | 0x7e, 0x5f, 0x4e }, | ||
5087 | .rlen = 35, | ||
5088 | }, { | ||
5089 | .key = { 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, | ||
5090 | 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf }, | ||
5091 | .klen = 16, | ||
5092 | .iv = { 0x01, 0x00, 0x00, 0x00, 0x0c, 0x0b, 0x0a, 0x09, | ||
5093 | 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0x00, 0x00 }, | ||
5094 | .assoc = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
5095 | 0x08, 0x09, 0x0a, 0x0b }, | ||
5096 | .alen = 12, | ||
5097 | .input = { 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, | ||
5098 | 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, | ||
5099 | 0x1c, 0x1d, 0x1e }, | ||
5100 | .ilen = 19, | ||
5101 | .result = { 0x07, 0x34, 0x25, 0x94, 0x15, 0x77, 0x85, 0x15, | ||
5102 | 0x2b, 0x07, 0x40, 0x98, 0x33, 0x0a, 0xbb, 0x14, | ||
5103 | 0x1b, 0x94, 0x7b, 0x56, 0x6a, 0xa9, 0x40, 0x6b, | ||
5104 | 0x4d, 0x99, 0x99, 0x88, 0xdd }, | ||
5105 | .rlen = 29, | ||
5106 | }, { | ||
5107 | .key = { 0xd7, 0x82, 0x8d, 0x13, 0xb2, 0xb0, 0xbd, 0xc3, | ||
5108 | 0x25, 0xa7, 0x62, 0x36, 0xdf, 0x93, 0xcc, 0x6b }, | ||
5109 | .klen = 16, | ||
5110 | .iv = { 0x01, 0x00, 0x33, 0x56, 0x8e, 0xf7, 0xb2, 0x63, | ||
5111 | 0x3c, 0x96, 0x96, 0x76, 0x6c, 0xfa, 0x00, 0x00 }, | ||
5112 | .assoc = { 0x63, 0x01, 0x8f, 0x76, 0xdc, 0x8a, 0x1b, 0xcb }, | ||
5113 | .alen = 8, | ||
5114 | .input = { 0x90, 0x20, 0xea, 0x6f, 0x91, 0xbd, 0xd8, 0x5a, | ||
5115 | 0xfa, 0x00, 0x39, 0xba, 0x4b, 0xaf, 0xf9, 0xbf, | ||
5116 | 0xb7, 0x9c, 0x70, 0x28, 0x94, 0x9c, 0xd0, 0xec }, | ||
5117 | .ilen = 24, | ||
5118 | .result = { 0x4c, 0xcb, 0x1e, 0x7c, 0xa9, 0x81, 0xbe, 0xfa, | ||
5119 | 0xa0, 0x72, 0x6c, 0x55, 0xd3, 0x78, 0x06, 0x12, | ||
5120 | 0x98, 0xc8, 0x5c, 0x92, 0x81, 0x4a, 0xbc, 0x33, | ||
5121 | 0xc5, 0x2e, 0xe8, 0x1d, 0x7d, 0x77, 0xc0, 0x8a }, | ||
5122 | .rlen = 32, | ||
5123 | }, { | ||
5124 | .key = { 0xd7, 0x82, 0x8d, 0x13, 0xb2, 0xb0, 0xbd, 0xc3, | ||
5125 | 0x25, 0xa7, 0x62, 0x36, 0xdf, 0x93, 0xcc, 0x6b }, | ||
5126 | .klen = 16, | ||
5127 | .iv = { 0x01, 0x00, 0xd5, 0x60, 0x91, 0x2d, 0x3f, 0x70, | ||
5128 | 0x3c, 0x96, 0x96, 0x76, 0x6c, 0xfa, 0x00, 0x00 }, | ||
5129 | .assoc = { 0xcd, 0x90, 0x44, 0xd2, 0xb7, 0x1f, 0xdb, 0x81, | ||
5130 | 0x20, 0xea, 0x60, 0xc0 }, | ||
5131 | .alen = 12, | ||
5132 | .input = { 0x64, 0x35, 0xac, 0xba, 0xfb, 0x11, 0xa8, 0x2e, | ||
5133 | 0x2f, 0x07, 0x1d, 0x7c, 0xa4, 0xa5, 0xeb, 0xd9, | ||
5134 | 0x3a, 0x80, 0x3b, 0xa8, 0x7f }, | ||
5135 | .ilen = 21, | ||
5136 | .result = { 0x00, 0x97, 0x69, 0xec, 0xab, 0xdf, 0x48, 0x62, | ||
5137 | 0x55, 0x94, 0xc5, 0x92, 0x51, 0xe6, 0x03, 0x57, | ||
5138 | 0x22, 0x67, 0x5e, 0x04, 0xc8, 0x47, 0x09, 0x9e, | ||
5139 | 0x5a, 0xe0, 0x70, 0x45, 0x51 }, | ||
5140 | .rlen = 29, | ||
5141 | }, { | ||
5142 | .key = { 0xd7, 0x82, 0x8d, 0x13, 0xb2, 0xb0, 0xbd, 0xc3, | ||
5143 | 0x25, 0xa7, 0x62, 0x36, 0xdf, 0x93, 0xcc, 0x6b }, | ||
5144 | .klen = 16, | ||
5145 | .iv = { 0x01, 0x00, 0x42, 0xff, 0xf8, 0xf1, 0x95, 0x1c, | ||
5146 | 0x3c, 0x96, 0x96, 0x76, 0x6c, 0xfa, 0x00, 0x00 }, | ||
5147 | .assoc = { 0xd8, 0x5b, 0xc7, 0xe6, 0x9f, 0x94, 0x4f, 0xb8 }, | ||
5148 | .alen = 8, | ||
5149 | .input = { 0x8a, 0x19, 0xb9, 0x50, 0xbc, 0xf7, 0x1a, 0x01, | ||
5150 | 0x8e, 0x5e, 0x67, 0x01, 0xc9, 0x17, 0x87, 0x65, | ||
5151 | 0x98, 0x09, 0xd6, 0x7d, 0xbe, 0xdd, 0x18 }, | ||
5152 | .ilen = 23, | ||
5153 | .result = { 0xbc, 0x21, 0x8d, 0xaa, 0x94, 0x74, 0x27, 0xb6, | ||
5154 | 0xdb, 0x38, 0x6a, 0x99, 0xac, 0x1a, 0xef, 0x23, | ||
5155 | 0xad, 0xe0, 0xb5, 0x29, 0x39, 0xcb, 0x6a, 0x63, | ||
5156 | 0x7c, 0xf9, 0xbe, 0xc2, 0x40, 0x88, 0x97, 0xc6, | ||
5157 | 0xba }, | ||
5158 | .rlen = 33, | ||
5159 | }, | ||
5160 | }; | ||
5161 | |||
5162 | static struct aead_testvec aes_ccm_dec_tv_template[] = { | ||
5163 | { /* From RFC 3610 */ | ||
5164 | .key = { 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, | ||
5165 | 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf }, | ||
5166 | .klen = 16, | ||
5167 | .iv = { 0x01, 0x00, 0x00, 0x00, 0x03, 0x02, 0x01, 0x00, | ||
5168 | 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0x00, 0x00 }, | ||
5169 | .assoc = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 }, | ||
5170 | .alen = 8, | ||
5171 | .input = { 0x58, 0x8c, 0x97, 0x9a, 0x61, 0xc6, 0x63, 0xd2, | ||
5172 | 0xf0, 0x66, 0xd0, 0xc2, 0xc0, 0xf9, 0x89, 0x80, | ||
5173 | 0x6d, 0x5f, 0x6b, 0x61, 0xda, 0xc3, 0x84, 0x17, | ||
5174 | 0xe8, 0xd1, 0x2c, 0xfd, 0xf9, 0x26, 0xe0 }, | ||
5175 | .ilen = 31, | ||
5176 | .result = { 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, | ||
5177 | 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, | ||
5178 | 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e }, | ||
5179 | .rlen = 23, | ||
5180 | }, { | ||
5181 | .key = { 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, | ||
5182 | 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf }, | ||
5183 | .klen = 16, | ||
5184 | .iv = { 0x01, 0x00, 0x00, 0x00, 0x07, 0x06, 0x05, 0x04, | ||
5185 | 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0x00, 0x00 }, | ||
5186 | .assoc = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
5187 | 0x08, 0x09, 0x0a, 0x0b }, | ||
5188 | .alen = 12, | ||
5189 | .input = { 0xdc, 0xf1, 0xfb, 0x7b, 0x5d, 0x9e, 0x23, 0xfb, | ||
5190 | 0x9d, 0x4e, 0x13, 0x12, 0x53, 0x65, 0x8a, 0xd8, | ||
5191 | 0x6e, 0xbd, 0xca, 0x3e, 0x51, 0xe8, 0x3f, 0x07, | ||
5192 | 0x7d, 0x9c, 0x2d, 0x93 }, | ||
5193 | .ilen = 28, | ||
5194 | .result = { 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, | ||
5195 | 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, | ||
5196 | 0x1c, 0x1d, 0x1e, 0x1f }, | ||
5197 | .rlen = 20, | ||
5198 | }, { | ||
5199 | .key = { 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, | ||
5200 | 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf }, | ||
5201 | .klen = 16, | ||
5202 | .iv = { 0x01, 0x00, 0x00, 0x00, 0x0b, 0x0a, 0x09, 0x08, | ||
5203 | 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0x00, 0x00 }, | ||
5204 | .assoc = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 }, | ||
5205 | .alen = 8, | ||
5206 | .input = { 0x82, 0x53, 0x1a, 0x60, 0xcc, 0x24, 0x94, 0x5a, | ||
5207 | 0x4b, 0x82, 0x79, 0x18, 0x1a, 0xb5, 0xc8, 0x4d, | ||
5208 | 0xf2, 0x1c, 0xe7, 0xf9, 0xb7, 0x3f, 0x42, 0xe1, | ||
5209 | 0x97, 0xea, 0x9c, 0x07, 0xe5, 0x6b, 0x5e, 0xb1, | ||
5210 | 0x7e, 0x5f, 0x4e }, | ||
5211 | .ilen = 35, | ||
5212 | .result = { 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, | ||
5213 | 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, | ||
5214 | 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, | ||
5215 | 0x20 }, | ||
5216 | .rlen = 25, | ||
5217 | }, { | ||
5218 | .key = { 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, | ||
5219 | 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf }, | ||
5220 | .klen = 16, | ||
5221 | .iv = { 0x01, 0x00, 0x00, 0x00, 0x0c, 0x0b, 0x0a, 0x09, | ||
5222 | 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0x00, 0x00 }, | ||
5223 | .assoc = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
5224 | 0x08, 0x09, 0x0a, 0x0b }, | ||
5225 | .alen = 12, | ||
5226 | .input = { 0x07, 0x34, 0x25, 0x94, 0x15, 0x77, 0x85, 0x15, | ||
5227 | 0x2b, 0x07, 0x40, 0x98, 0x33, 0x0a, 0xbb, 0x14, | ||
5228 | 0x1b, 0x94, 0x7b, 0x56, 0x6a, 0xa9, 0x40, 0x6b, | ||
5229 | 0x4d, 0x99, 0x99, 0x88, 0xdd }, | ||
5230 | .ilen = 29, | ||
5231 | .result = { 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, | ||
5232 | 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, | ||
5233 | 0x1c, 0x1d, 0x1e }, | ||
5234 | .rlen = 19, | ||
5235 | }, { | ||
5236 | .key = { 0xd7, 0x82, 0x8d, 0x13, 0xb2, 0xb0, 0xbd, 0xc3, | ||
5237 | 0x25, 0xa7, 0x62, 0x36, 0xdf, 0x93, 0xcc, 0x6b }, | ||
5238 | .klen = 16, | ||
5239 | .iv = { 0x01, 0x00, 0x33, 0x56, 0x8e, 0xf7, 0xb2, 0x63, | ||
5240 | 0x3c, 0x96, 0x96, 0x76, 0x6c, 0xfa, 0x00, 0x00 }, | ||
5241 | .assoc = { 0x63, 0x01, 0x8f, 0x76, 0xdc, 0x8a, 0x1b, 0xcb }, | ||
5242 | .alen = 8, | ||
5243 | .input = { 0x4c, 0xcb, 0x1e, 0x7c, 0xa9, 0x81, 0xbe, 0xfa, | ||
5244 | 0xa0, 0x72, 0x6c, 0x55, 0xd3, 0x78, 0x06, 0x12, | ||
5245 | 0x98, 0xc8, 0x5c, 0x92, 0x81, 0x4a, 0xbc, 0x33, | ||
5246 | 0xc5, 0x2e, 0xe8, 0x1d, 0x7d, 0x77, 0xc0, 0x8a }, | ||
5247 | .ilen = 32, | ||
5248 | .result = { 0x90, 0x20, 0xea, 0x6f, 0x91, 0xbd, 0xd8, 0x5a, | ||
5249 | 0xfa, 0x00, 0x39, 0xba, 0x4b, 0xaf, 0xf9, 0xbf, | ||
5250 | 0xb7, 0x9c, 0x70, 0x28, 0x94, 0x9c, 0xd0, 0xec }, | ||
5251 | .rlen = 24, | ||
5252 | }, { | ||
5253 | .key = { 0xd7, 0x82, 0x8d, 0x13, 0xb2, 0xb0, 0xbd, 0xc3, | ||
5254 | 0x25, 0xa7, 0x62, 0x36, 0xdf, 0x93, 0xcc, 0x6b }, | ||
5255 | .klen = 16, | ||
5256 | .iv = { 0x01, 0x00, 0xd5, 0x60, 0x91, 0x2d, 0x3f, 0x70, | ||
5257 | 0x3c, 0x96, 0x96, 0x76, 0x6c, 0xfa, 0x00, 0x00 }, | ||
5258 | .assoc = { 0xcd, 0x90, 0x44, 0xd2, 0xb7, 0x1f, 0xdb, 0x81, | ||
5259 | 0x20, 0xea, 0x60, 0xc0 }, | ||
5260 | .alen = 12, | ||
5261 | .input = { 0x00, 0x97, 0x69, 0xec, 0xab, 0xdf, 0x48, 0x62, | ||
5262 | 0x55, 0x94, 0xc5, 0x92, 0x51, 0xe6, 0x03, 0x57, | ||
5263 | 0x22, 0x67, 0x5e, 0x04, 0xc8, 0x47, 0x09, 0x9e, | ||
5264 | 0x5a, 0xe0, 0x70, 0x45, 0x51 }, | ||
5265 | .ilen = 29, | ||
5266 | .result = { 0x64, 0x35, 0xac, 0xba, 0xfb, 0x11, 0xa8, 0x2e, | ||
5267 | 0x2f, 0x07, 0x1d, 0x7c, 0xa4, 0xa5, 0xeb, 0xd9, | ||
5268 | 0x3a, 0x80, 0x3b, 0xa8, 0x7f }, | ||
5269 | .rlen = 21, | ||
5270 | }, { | ||
5271 | .key = { 0xd7, 0x82, 0x8d, 0x13, 0xb2, 0xb0, 0xbd, 0xc3, | ||
5272 | 0x25, 0xa7, 0x62, 0x36, 0xdf, 0x93, 0xcc, 0x6b }, | ||
5273 | .klen = 16, | ||
5274 | .iv = { 0x01, 0x00, 0x42, 0xff, 0xf8, 0xf1, 0x95, 0x1c, | ||
5275 | 0x3c, 0x96, 0x96, 0x76, 0x6c, 0xfa, 0x00, 0x00 }, | ||
5276 | .assoc = { 0xd8, 0x5b, 0xc7, 0xe6, 0x9f, 0x94, 0x4f, 0xb8 }, | ||
5277 | .alen = 8, | ||
5278 | .input = { 0xbc, 0x21, 0x8d, 0xaa, 0x94, 0x74, 0x27, 0xb6, | ||
5279 | 0xdb, 0x38, 0x6a, 0x99, 0xac, 0x1a, 0xef, 0x23, | ||
5280 | 0xad, 0xe0, 0xb5, 0x29, 0x39, 0xcb, 0x6a, 0x63, | ||
5281 | 0x7c, 0xf9, 0xbe, 0xc2, 0x40, 0x88, 0x97, 0xc6, | ||
5282 | 0xba }, | ||
5283 | .ilen = 33, | ||
5284 | .result = { 0x8a, 0x19, 0xb9, 0x50, 0xbc, 0xf7, 0x1a, 0x01, | ||
5285 | 0x8e, 0x5e, 0x67, 0x01, 0xc9, 0x17, 0x87, 0x65, | ||
5286 | 0x98, 0x09, 0xd6, 0x7d, 0xbe, 0xdd, 0x18 }, | ||
5287 | .rlen = 23, | ||
5288 | }, | ||
5289 | }; | ||
5290 | |||
3183 | /* Cast5 test vectors from RFC 2144 */ | 5291 | /* Cast5 test vectors from RFC 2144 */ |
3184 | #define CAST5_ENC_TEST_VECTORS 3 | 5292 | #define CAST5_ENC_TEST_VECTORS 3 |
3185 | #define CAST5_DEC_TEST_VECTORS 3 | 5293 | #define CAST5_DEC_TEST_VECTORS 3 |
@@ -4317,6 +6425,1211 @@ static struct cipher_testvec seed_dec_tv_template[] = { | |||
4317 | } | 6425 | } |
4318 | }; | 6426 | }; |
4319 | 6427 | ||
6428 | #define SALSA20_STREAM_ENC_TEST_VECTORS 5 | ||
6429 | static struct cipher_testvec salsa20_stream_enc_tv_template[] = { | ||
6430 | /* | ||
6431 | * Testvectors from verified.test-vectors submitted to ECRYPT. | ||
6432 | * They are truncated to size 39, 64, 111, 129 to test a variety | ||
6433 | * of input length. | ||
6434 | */ | ||
6435 | { /* Set 3, vector 0 */ | ||
6436 | .key = { | ||
6437 | 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
6438 | 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F | ||
6439 | }, | ||
6440 | .klen = 16, | ||
6441 | .iv = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, | ||
6442 | .input = { | ||
6443 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6444 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6445 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6446 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6447 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6448 | }, | ||
6449 | .ilen = 39, | ||
6450 | .result = { | ||
6451 | 0x2D, 0xD5, 0xC3, 0xF7, 0xBA, 0x2B, 0x20, 0xF7, | ||
6452 | 0x68, 0x02, 0x41, 0x0C, 0x68, 0x86, 0x88, 0x89, | ||
6453 | 0x5A, 0xD8, 0xC1, 0xBD, 0x4E, 0xA6, 0xC9, 0xB1, | ||
6454 | 0x40, 0xFB, 0x9B, 0x90, 0xE2, 0x10, 0x49, 0xBF, | ||
6455 | 0x58, 0x3F, 0x52, 0x79, 0x70, 0xEB, 0xC1, | ||
6456 | }, | ||
6457 | .rlen = 39, | ||
6458 | }, { /* Set 5, vector 0 */ | ||
6459 | .key = { | ||
6460 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6461 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 | ||
6462 | }, | ||
6463 | .klen = 16, | ||
6464 | .iv = { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, | ||
6465 | .input = { | ||
6466 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6467 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6468 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6469 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6470 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6471 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6472 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6473 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6474 | }, | ||
6475 | .ilen = 64, | ||
6476 | .result = { | ||
6477 | 0xB6, 0x6C, 0x1E, 0x44, 0x46, 0xDD, 0x95, 0x57, | ||
6478 | 0xE5, 0x78, 0xE2, 0x23, 0xB0, 0xB7, 0x68, 0x01, | ||
6479 | 0x7B, 0x23, 0xB2, 0x67, 0xBB, 0x02, 0x34, 0xAE, | ||
6480 | 0x46, 0x26, 0xBF, 0x44, 0x3F, 0x21, 0x97, 0x76, | ||
6481 | 0x43, 0x6F, 0xB1, 0x9F, 0xD0, 0xE8, 0x86, 0x6F, | ||
6482 | 0xCD, 0x0D, 0xE9, 0xA9, 0x53, 0x8F, 0x4A, 0x09, | ||
6483 | 0xCA, 0x9A, 0xC0, 0x73, 0x2E, 0x30, 0xBC, 0xF9, | ||
6484 | 0x8E, 0x4F, 0x13, 0xE4, 0xB9, 0xE2, 0x01, 0xD9, | ||
6485 | }, | ||
6486 | .rlen = 64, | ||
6487 | }, { /* Set 3, vector 27 */ | ||
6488 | .key = { | ||
6489 | 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, | ||
6490 | 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, | ||
6491 | 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, | ||
6492 | 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A | ||
6493 | }, | ||
6494 | .klen = 32, | ||
6495 | .iv = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, | ||
6496 | .input = { | ||
6497 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6498 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6499 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6500 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6501 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6502 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6503 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6504 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6505 | |||
6506 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6507 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6508 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6509 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6510 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6511 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6512 | }, | ||
6513 | .ilen = 111, | ||
6514 | .result = { | ||
6515 | 0xAE, 0x39, 0x50, 0x8E, 0xAC, 0x9A, 0xEC, 0xE7, | ||
6516 | 0xBF, 0x97, 0xBB, 0x20, 0xB9, 0xDE, 0xE4, 0x1F, | ||
6517 | 0x87, 0xD9, 0x47, 0xF8, 0x28, 0x91, 0x35, 0x98, | ||
6518 | 0xDB, 0x72, 0xCC, 0x23, 0x29, 0x48, 0x56, 0x5E, | ||
6519 | 0x83, 0x7E, 0x0B, 0xF3, 0x7D, 0x5D, 0x38, 0x7B, | ||
6520 | 0x2D, 0x71, 0x02, 0xB4, 0x3B, 0xB5, 0xD8, 0x23, | ||
6521 | 0xB0, 0x4A, 0xDF, 0x3C, 0xEC, 0xB6, 0xD9, 0x3B, | ||
6522 | 0x9B, 0xA7, 0x52, 0xBE, 0xC5, 0xD4, 0x50, 0x59, | ||
6523 | |||
6524 | 0x15, 0x14, 0xB4, 0x0E, 0x40, 0xE6, 0x53, 0xD1, | ||
6525 | 0x83, 0x9C, 0x5B, 0xA0, 0x92, 0x29, 0x6B, 0x5E, | ||
6526 | 0x96, 0x5B, 0x1E, 0x2F, 0xD3, 0xAC, 0xC1, 0x92, | ||
6527 | 0xB1, 0x41, 0x3F, 0x19, 0x2F, 0xC4, 0x3B, 0xC6, | ||
6528 | 0x95, 0x46, 0x45, 0x54, 0xE9, 0x75, 0x03, 0x08, | ||
6529 | 0x44, 0xAF, 0xE5, 0x8A, 0x81, 0x12, 0x09, | ||
6530 | }, | ||
6531 | .rlen = 111, | ||
6532 | |||
6533 | }, { /* Set 5, vector 27 */ | ||
6534 | .key = { | ||
6535 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6536 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6537 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6538 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 | ||
6539 | }, | ||
6540 | .klen = 32, | ||
6541 | .iv = { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00 }, | ||
6542 | .input = { | ||
6543 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6544 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6545 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6546 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6547 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6548 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6549 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6550 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6551 | |||
6552 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6553 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6554 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6555 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6556 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6557 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6558 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6559 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6560 | |||
6561 | 0x00, | ||
6562 | }, | ||
6563 | .ilen = 129, | ||
6564 | .result = { | ||
6565 | 0xD2, 0xDB, 0x1A, 0x5C, 0xF1, 0xC1, 0xAC, 0xDB, | ||
6566 | 0xE8, 0x1A, 0x7A, 0x43, 0x40, 0xEF, 0x53, 0x43, | ||
6567 | 0x5E, 0x7F, 0x4B, 0x1A, 0x50, 0x52, 0x3F, 0x8D, | ||
6568 | 0x28, 0x3D, 0xCF, 0x85, 0x1D, 0x69, 0x6E, 0x60, | ||
6569 | 0xF2, 0xDE, 0x74, 0x56, 0x18, 0x1B, 0x84, 0x10, | ||
6570 | 0xD4, 0x62, 0xBA, 0x60, 0x50, 0xF0, 0x61, 0xF2, | ||
6571 | 0x1C, 0x78, 0x7F, 0xC1, 0x24, 0x34, 0xAF, 0x58, | ||
6572 | 0xBF, 0x2C, 0x59, 0xCA, 0x90, 0x77, 0xF3, 0xB0, | ||
6573 | |||
6574 | 0x5B, 0x4A, 0xDF, 0x89, 0xCE, 0x2C, 0x2F, 0xFC, | ||
6575 | 0x67, 0xF0, 0xE3, 0x45, 0xE8, 0xB3, 0xB3, 0x75, | ||
6576 | 0xA0, 0x95, 0x71, 0xA1, 0x29, 0x39, 0x94, 0xCA, | ||
6577 | 0x45, 0x2F, 0xBD, 0xCB, 0x10, 0xB6, 0xBE, 0x9F, | ||
6578 | 0x8E, 0xF9, 0xB2, 0x01, 0x0A, 0x5A, 0x0A, 0xB7, | ||
6579 | 0x6B, 0x9D, 0x70, 0x8E, 0x4B, 0xD6, 0x2F, 0xCD, | ||
6580 | 0x2E, 0x40, 0x48, 0x75, 0xE9, 0xE2, 0x21, 0x45, | ||
6581 | 0x0B, 0xC9, 0xB6, 0xB5, 0x66, 0xBC, 0x9A, 0x59, | ||
6582 | |||
6583 | 0x5A, | ||
6584 | }, | ||
6585 | .rlen = 129, | ||
6586 | }, { /* large test vector generated using Crypto++ */ | ||
6587 | .key = { | ||
6588 | 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
6589 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, | ||
6590 | 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, | ||
6591 | 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, | ||
6592 | }, | ||
6593 | .klen = 32, | ||
6594 | .iv = { | ||
6595 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6596 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6597 | }, | ||
6598 | .input = { | ||
6599 | 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
6600 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, | ||
6601 | 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, | ||
6602 | 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, | ||
6603 | 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, | ||
6604 | 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, | ||
6605 | 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, | ||
6606 | 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, | ||
6607 | 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, | ||
6608 | 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, | ||
6609 | 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, | ||
6610 | 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, | ||
6611 | 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, | ||
6612 | 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, | ||
6613 | 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, | ||
6614 | 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, | ||
6615 | 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, | ||
6616 | 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, | ||
6617 | 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, | ||
6618 | 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, | ||
6619 | 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, | ||
6620 | 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, | ||
6621 | 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, | ||
6622 | 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, | ||
6623 | 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, | ||
6624 | 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, | ||
6625 | 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, | ||
6626 | 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, | ||
6627 | 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, | ||
6628 | 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, | ||
6629 | 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, | ||
6630 | 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, | ||
6631 | 0x00, 0x03, 0x06, 0x09, 0x0c, 0x0f, 0x12, 0x15, | ||
6632 | 0x18, 0x1b, 0x1e, 0x21, 0x24, 0x27, 0x2a, 0x2d, | ||
6633 | 0x30, 0x33, 0x36, 0x39, 0x3c, 0x3f, 0x42, 0x45, | ||
6634 | 0x48, 0x4b, 0x4e, 0x51, 0x54, 0x57, 0x5a, 0x5d, | ||
6635 | 0x60, 0x63, 0x66, 0x69, 0x6c, 0x6f, 0x72, 0x75, | ||
6636 | 0x78, 0x7b, 0x7e, 0x81, 0x84, 0x87, 0x8a, 0x8d, | ||
6637 | 0x90, 0x93, 0x96, 0x99, 0x9c, 0x9f, 0xa2, 0xa5, | ||
6638 | 0xa8, 0xab, 0xae, 0xb1, 0xb4, 0xb7, 0xba, 0xbd, | ||
6639 | 0xc0, 0xc3, 0xc6, 0xc9, 0xcc, 0xcf, 0xd2, 0xd5, | ||
6640 | 0xd8, 0xdb, 0xde, 0xe1, 0xe4, 0xe7, 0xea, 0xed, | ||
6641 | 0xf0, 0xf3, 0xf6, 0xf9, 0xfc, 0xff, 0x02, 0x05, | ||
6642 | 0x08, 0x0b, 0x0e, 0x11, 0x14, 0x17, 0x1a, 0x1d, | ||
6643 | 0x20, 0x23, 0x26, 0x29, 0x2c, 0x2f, 0x32, 0x35, | ||
6644 | 0x38, 0x3b, 0x3e, 0x41, 0x44, 0x47, 0x4a, 0x4d, | ||
6645 | 0x50, 0x53, 0x56, 0x59, 0x5c, 0x5f, 0x62, 0x65, | ||
6646 | 0x68, 0x6b, 0x6e, 0x71, 0x74, 0x77, 0x7a, 0x7d, | ||
6647 | 0x80, 0x83, 0x86, 0x89, 0x8c, 0x8f, 0x92, 0x95, | ||
6648 | 0x98, 0x9b, 0x9e, 0xa1, 0xa4, 0xa7, 0xaa, 0xad, | ||
6649 | 0xb0, 0xb3, 0xb6, 0xb9, 0xbc, 0xbf, 0xc2, 0xc5, | ||
6650 | 0xc8, 0xcb, 0xce, 0xd1, 0xd4, 0xd7, 0xda, 0xdd, | ||
6651 | 0xe0, 0xe3, 0xe6, 0xe9, 0xec, 0xef, 0xf2, 0xf5, | ||
6652 | 0xf8, 0xfb, 0xfe, 0x01, 0x04, 0x07, 0x0a, 0x0d, | ||
6653 | 0x10, 0x13, 0x16, 0x19, 0x1c, 0x1f, 0x22, 0x25, | ||
6654 | 0x28, 0x2b, 0x2e, 0x31, 0x34, 0x37, 0x3a, 0x3d, | ||
6655 | 0x40, 0x43, 0x46, 0x49, 0x4c, 0x4f, 0x52, 0x55, | ||
6656 | 0x58, 0x5b, 0x5e, 0x61, 0x64, 0x67, 0x6a, 0x6d, | ||
6657 | 0x70, 0x73, 0x76, 0x79, 0x7c, 0x7f, 0x82, 0x85, | ||
6658 | 0x88, 0x8b, 0x8e, 0x91, 0x94, 0x97, 0x9a, 0x9d, | ||
6659 | 0xa0, 0xa3, 0xa6, 0xa9, 0xac, 0xaf, 0xb2, 0xb5, | ||
6660 | 0xb8, 0xbb, 0xbe, 0xc1, 0xc4, 0xc7, 0xca, 0xcd, | ||
6661 | 0xd0, 0xd3, 0xd6, 0xd9, 0xdc, 0xdf, 0xe2, 0xe5, | ||
6662 | 0xe8, 0xeb, 0xee, 0xf1, 0xf4, 0xf7, 0xfa, 0xfd, | ||
6663 | 0x00, 0x05, 0x0a, 0x0f, 0x14, 0x19, 0x1e, 0x23, | ||
6664 | 0x28, 0x2d, 0x32, 0x37, 0x3c, 0x41, 0x46, 0x4b, | ||
6665 | 0x50, 0x55, 0x5a, 0x5f, 0x64, 0x69, 0x6e, 0x73, | ||
6666 | 0x78, 0x7d, 0x82, 0x87, 0x8c, 0x91, 0x96, 0x9b, | ||
6667 | 0xa0, 0xa5, 0xaa, 0xaf, 0xb4, 0xb9, 0xbe, 0xc3, | ||
6668 | 0xc8, 0xcd, 0xd2, 0xd7, 0xdc, 0xe1, 0xe6, 0xeb, | ||
6669 | 0xf0, 0xf5, 0xfa, 0xff, 0x04, 0x09, 0x0e, 0x13, | ||
6670 | 0x18, 0x1d, 0x22, 0x27, 0x2c, 0x31, 0x36, 0x3b, | ||
6671 | 0x40, 0x45, 0x4a, 0x4f, 0x54, 0x59, 0x5e, 0x63, | ||
6672 | 0x68, 0x6d, 0x72, 0x77, 0x7c, 0x81, 0x86, 0x8b, | ||
6673 | 0x90, 0x95, 0x9a, 0x9f, 0xa4, 0xa9, 0xae, 0xb3, | ||
6674 | 0xb8, 0xbd, 0xc2, 0xc7, 0xcc, 0xd1, 0xd6, 0xdb, | ||
6675 | 0xe0, 0xe5, 0xea, 0xef, 0xf4, 0xf9, 0xfe, 0x03, | ||
6676 | 0x08, 0x0d, 0x12, 0x17, 0x1c, 0x21, 0x26, 0x2b, | ||
6677 | 0x30, 0x35, 0x3a, 0x3f, 0x44, 0x49, 0x4e, 0x53, | ||
6678 | 0x58, 0x5d, 0x62, 0x67, 0x6c, 0x71, 0x76, 0x7b, | ||
6679 | 0x80, 0x85, 0x8a, 0x8f, 0x94, 0x99, 0x9e, 0xa3, | ||
6680 | 0xa8, 0xad, 0xb2, 0xb7, 0xbc, 0xc1, 0xc6, 0xcb, | ||
6681 | 0xd0, 0xd5, 0xda, 0xdf, 0xe4, 0xe9, 0xee, 0xf3, | ||
6682 | 0xf8, 0xfd, 0x02, 0x07, 0x0c, 0x11, 0x16, 0x1b, | ||
6683 | 0x20, 0x25, 0x2a, 0x2f, 0x34, 0x39, 0x3e, 0x43, | ||
6684 | 0x48, 0x4d, 0x52, 0x57, 0x5c, 0x61, 0x66, 0x6b, | ||
6685 | 0x70, 0x75, 0x7a, 0x7f, 0x84, 0x89, 0x8e, 0x93, | ||
6686 | 0x98, 0x9d, 0xa2, 0xa7, 0xac, 0xb1, 0xb6, 0xbb, | ||
6687 | 0xc0, 0xc5, 0xca, 0xcf, 0xd4, 0xd9, 0xde, 0xe3, | ||
6688 | 0xe8, 0xed, 0xf2, 0xf7, 0xfc, 0x01, 0x06, 0x0b, | ||
6689 | 0x10, 0x15, 0x1a, 0x1f, 0x24, 0x29, 0x2e, 0x33, | ||
6690 | 0x38, 0x3d, 0x42, 0x47, 0x4c, 0x51, 0x56, 0x5b, | ||
6691 | 0x60, 0x65, 0x6a, 0x6f, 0x74, 0x79, 0x7e, 0x83, | ||
6692 | 0x88, 0x8d, 0x92, 0x97, 0x9c, 0xa1, 0xa6, 0xab, | ||
6693 | 0xb0, 0xb5, 0xba, 0xbf, 0xc4, 0xc9, 0xce, 0xd3, | ||
6694 | 0xd8, 0xdd, 0xe2, 0xe7, 0xec, 0xf1, 0xf6, 0xfb, | ||
6695 | 0x00, 0x07, 0x0e, 0x15, 0x1c, 0x23, 0x2a, 0x31, | ||
6696 | 0x38, 0x3f, 0x46, 0x4d, 0x54, 0x5b, 0x62, 0x69, | ||
6697 | 0x70, 0x77, 0x7e, 0x85, 0x8c, 0x93, 0x9a, 0xa1, | ||
6698 | 0xa8, 0xaf, 0xb6, 0xbd, 0xc4, 0xcb, 0xd2, 0xd9, | ||
6699 | 0xe0, 0xe7, 0xee, 0xf5, 0xfc, 0x03, 0x0a, 0x11, | ||
6700 | 0x18, 0x1f, 0x26, 0x2d, 0x34, 0x3b, 0x42, 0x49, | ||
6701 | 0x50, 0x57, 0x5e, 0x65, 0x6c, 0x73, 0x7a, 0x81, | ||
6702 | 0x88, 0x8f, 0x96, 0x9d, 0xa4, 0xab, 0xb2, 0xb9, | ||
6703 | 0xc0, 0xc7, 0xce, 0xd5, 0xdc, 0xe3, 0xea, 0xf1, | ||
6704 | 0xf8, 0xff, 0x06, 0x0d, 0x14, 0x1b, 0x22, 0x29, | ||
6705 | 0x30, 0x37, 0x3e, 0x45, 0x4c, 0x53, 0x5a, 0x61, | ||
6706 | 0x68, 0x6f, 0x76, 0x7d, 0x84, 0x8b, 0x92, 0x99, | ||
6707 | 0xa0, 0xa7, 0xae, 0xb5, 0xbc, 0xc3, 0xca, 0xd1, | ||
6708 | 0xd8, 0xdf, 0xe6, 0xed, 0xf4, 0xfb, 0x02, 0x09, | ||
6709 | 0x10, 0x17, 0x1e, 0x25, 0x2c, 0x33, 0x3a, 0x41, | ||
6710 | 0x48, 0x4f, 0x56, 0x5d, 0x64, 0x6b, 0x72, 0x79, | ||
6711 | 0x80, 0x87, 0x8e, 0x95, 0x9c, 0xa3, 0xaa, 0xb1, | ||
6712 | 0xb8, 0xbf, 0xc6, 0xcd, 0xd4, 0xdb, 0xe2, 0xe9, | ||
6713 | 0xf0, 0xf7, 0xfe, 0x05, 0x0c, 0x13, 0x1a, 0x21, | ||
6714 | 0x28, 0x2f, 0x36, 0x3d, 0x44, 0x4b, 0x52, 0x59, | ||
6715 | 0x60, 0x67, 0x6e, 0x75, 0x7c, 0x83, 0x8a, 0x91, | ||
6716 | 0x98, 0x9f, 0xa6, 0xad, 0xb4, 0xbb, 0xc2, 0xc9, | ||
6717 | 0xd0, 0xd7, 0xde, 0xe5, 0xec, 0xf3, 0xfa, 0x01, | ||
6718 | 0x08, 0x0f, 0x16, 0x1d, 0x24, 0x2b, 0x32, 0x39, | ||
6719 | 0x40, 0x47, 0x4e, 0x55, 0x5c, 0x63, 0x6a, 0x71, | ||
6720 | 0x78, 0x7f, 0x86, 0x8d, 0x94, 0x9b, 0xa2, 0xa9, | ||
6721 | 0xb0, 0xb7, 0xbe, 0xc5, 0xcc, 0xd3, 0xda, 0xe1, | ||
6722 | 0xe8, 0xef, 0xf6, 0xfd, 0x04, 0x0b, 0x12, 0x19, | ||
6723 | 0x20, 0x27, 0x2e, 0x35, 0x3c, 0x43, 0x4a, 0x51, | ||
6724 | 0x58, 0x5f, 0x66, 0x6d, 0x74, 0x7b, 0x82, 0x89, | ||
6725 | 0x90, 0x97, 0x9e, 0xa5, 0xac, 0xb3, 0xba, 0xc1, | ||
6726 | 0xc8, 0xcf, 0xd6, 0xdd, 0xe4, 0xeb, 0xf2, 0xf9, | ||
6727 | 0x00, 0x09, 0x12, 0x1b, 0x24, 0x2d, 0x36, 0x3f, | ||
6728 | 0x48, 0x51, 0x5a, 0x63, 0x6c, 0x75, 0x7e, 0x87, | ||
6729 | 0x90, 0x99, 0xa2, 0xab, 0xb4, 0xbd, 0xc6, 0xcf, | ||
6730 | 0xd8, 0xe1, 0xea, 0xf3, 0xfc, 0x05, 0x0e, 0x17, | ||
6731 | 0x20, 0x29, 0x32, 0x3b, 0x44, 0x4d, 0x56, 0x5f, | ||
6732 | 0x68, 0x71, 0x7a, 0x83, 0x8c, 0x95, 0x9e, 0xa7, | ||
6733 | 0xb0, 0xb9, 0xc2, 0xcb, 0xd4, 0xdd, 0xe6, 0xef, | ||
6734 | 0xf8, 0x01, 0x0a, 0x13, 0x1c, 0x25, 0x2e, 0x37, | ||
6735 | 0x40, 0x49, 0x52, 0x5b, 0x64, 0x6d, 0x76, 0x7f, | ||
6736 | 0x88, 0x91, 0x9a, 0xa3, 0xac, 0xb5, 0xbe, 0xc7, | ||
6737 | 0xd0, 0xd9, 0xe2, 0xeb, 0xf4, 0xfd, 0x06, 0x0f, | ||
6738 | 0x18, 0x21, 0x2a, 0x33, 0x3c, 0x45, 0x4e, 0x57, | ||
6739 | 0x60, 0x69, 0x72, 0x7b, 0x84, 0x8d, 0x96, 0x9f, | ||
6740 | 0xa8, 0xb1, 0xba, 0xc3, 0xcc, 0xd5, 0xde, 0xe7, | ||
6741 | 0xf0, 0xf9, 0x02, 0x0b, 0x14, 0x1d, 0x26, 0x2f, | ||
6742 | 0x38, 0x41, 0x4a, 0x53, 0x5c, 0x65, 0x6e, 0x77, | ||
6743 | 0x80, 0x89, 0x92, 0x9b, 0xa4, 0xad, 0xb6, 0xbf, | ||
6744 | 0xc8, 0xd1, 0xda, 0xe3, 0xec, 0xf5, 0xfe, 0x07, | ||
6745 | 0x10, 0x19, 0x22, 0x2b, 0x34, 0x3d, 0x46, 0x4f, | ||
6746 | 0x58, 0x61, 0x6a, 0x73, 0x7c, 0x85, 0x8e, 0x97, | ||
6747 | 0xa0, 0xa9, 0xb2, 0xbb, 0xc4, 0xcd, 0xd6, 0xdf, | ||
6748 | 0xe8, 0xf1, 0xfa, 0x03, 0x0c, 0x15, 0x1e, 0x27, | ||
6749 | 0x30, 0x39, 0x42, 0x4b, 0x54, 0x5d, 0x66, 0x6f, | ||
6750 | 0x78, 0x81, 0x8a, 0x93, 0x9c, 0xa5, 0xae, 0xb7, | ||
6751 | 0xc0, 0xc9, 0xd2, 0xdb, 0xe4, 0xed, 0xf6, 0xff, | ||
6752 | 0x08, 0x11, 0x1a, 0x23, 0x2c, 0x35, 0x3e, 0x47, | ||
6753 | 0x50, 0x59, 0x62, 0x6b, 0x74, 0x7d, 0x86, 0x8f, | ||
6754 | 0x98, 0xa1, 0xaa, 0xb3, 0xbc, 0xc5, 0xce, 0xd7, | ||
6755 | 0xe0, 0xe9, 0xf2, 0xfb, 0x04, 0x0d, 0x16, 0x1f, | ||
6756 | 0x28, 0x31, 0x3a, 0x43, 0x4c, 0x55, 0x5e, 0x67, | ||
6757 | 0x70, 0x79, 0x82, 0x8b, 0x94, 0x9d, 0xa6, 0xaf, | ||
6758 | 0xb8, 0xc1, 0xca, 0xd3, 0xdc, 0xe5, 0xee, 0xf7, | ||
6759 | 0x00, 0x0b, 0x16, 0x21, 0x2c, 0x37, 0x42, 0x4d, | ||
6760 | 0x58, 0x63, 0x6e, 0x79, 0x84, 0x8f, 0x9a, 0xa5, | ||
6761 | 0xb0, 0xbb, 0xc6, 0xd1, 0xdc, 0xe7, 0xf2, 0xfd, | ||
6762 | 0x08, 0x13, 0x1e, 0x29, 0x34, 0x3f, 0x4a, 0x55, | ||
6763 | 0x60, 0x6b, 0x76, 0x81, 0x8c, 0x97, 0xa2, 0xad, | ||
6764 | 0xb8, 0xc3, 0xce, 0xd9, 0xe4, 0xef, 0xfa, 0x05, | ||
6765 | 0x10, 0x1b, 0x26, 0x31, 0x3c, 0x47, 0x52, 0x5d, | ||
6766 | 0x68, 0x73, 0x7e, 0x89, 0x94, 0x9f, 0xaa, 0xb5, | ||
6767 | 0xc0, 0xcb, 0xd6, 0xe1, 0xec, 0xf7, 0x02, 0x0d, | ||
6768 | 0x18, 0x23, 0x2e, 0x39, 0x44, 0x4f, 0x5a, 0x65, | ||
6769 | 0x70, 0x7b, 0x86, 0x91, 0x9c, 0xa7, 0xb2, 0xbd, | ||
6770 | 0xc8, 0xd3, 0xde, 0xe9, 0xf4, 0xff, 0x0a, 0x15, | ||
6771 | 0x20, 0x2b, 0x36, 0x41, 0x4c, 0x57, 0x62, 0x6d, | ||
6772 | 0x78, 0x83, 0x8e, 0x99, 0xa4, 0xaf, 0xba, 0xc5, | ||
6773 | 0xd0, 0xdb, 0xe6, 0xf1, 0xfc, 0x07, 0x12, 0x1d, | ||
6774 | 0x28, 0x33, 0x3e, 0x49, 0x54, 0x5f, 0x6a, 0x75, | ||
6775 | 0x80, 0x8b, 0x96, 0xa1, 0xac, 0xb7, 0xc2, 0xcd, | ||
6776 | 0xd8, 0xe3, 0xee, 0xf9, 0x04, 0x0f, 0x1a, 0x25, | ||
6777 | 0x30, 0x3b, 0x46, 0x51, 0x5c, 0x67, 0x72, 0x7d, | ||
6778 | 0x88, 0x93, 0x9e, 0xa9, 0xb4, 0xbf, 0xca, 0xd5, | ||
6779 | 0xe0, 0xeb, 0xf6, 0x01, 0x0c, 0x17, 0x22, 0x2d, | ||
6780 | 0x38, 0x43, 0x4e, 0x59, 0x64, 0x6f, 0x7a, 0x85, | ||
6781 | 0x90, 0x9b, 0xa6, 0xb1, 0xbc, 0xc7, 0xd2, 0xdd, | ||
6782 | 0xe8, 0xf3, 0xfe, 0x09, 0x14, 0x1f, 0x2a, 0x35, | ||
6783 | 0x40, 0x4b, 0x56, 0x61, 0x6c, 0x77, 0x82, 0x8d, | ||
6784 | 0x98, 0xa3, 0xae, 0xb9, 0xc4, 0xcf, 0xda, 0xe5, | ||
6785 | 0xf0, 0xfb, 0x06, 0x11, 0x1c, 0x27, 0x32, 0x3d, | ||
6786 | 0x48, 0x53, 0x5e, 0x69, 0x74, 0x7f, 0x8a, 0x95, | ||
6787 | 0xa0, 0xab, 0xb6, 0xc1, 0xcc, 0xd7, 0xe2, 0xed, | ||
6788 | 0xf8, 0x03, 0x0e, 0x19, 0x24, 0x2f, 0x3a, 0x45, | ||
6789 | 0x50, 0x5b, 0x66, 0x71, 0x7c, 0x87, 0x92, 0x9d, | ||
6790 | 0xa8, 0xb3, 0xbe, 0xc9, 0xd4, 0xdf, 0xea, 0xf5, | ||
6791 | 0x00, 0x0d, 0x1a, 0x27, 0x34, 0x41, 0x4e, 0x5b, | ||
6792 | 0x68, 0x75, 0x82, 0x8f, 0x9c, 0xa9, 0xb6, 0xc3, | ||
6793 | 0xd0, 0xdd, 0xea, 0xf7, 0x04, 0x11, 0x1e, 0x2b, | ||
6794 | 0x38, 0x45, 0x52, 0x5f, 0x6c, 0x79, 0x86, 0x93, | ||
6795 | 0xa0, 0xad, 0xba, 0xc7, 0xd4, 0xe1, 0xee, 0xfb, | ||
6796 | 0x08, 0x15, 0x22, 0x2f, 0x3c, 0x49, 0x56, 0x63, | ||
6797 | 0x70, 0x7d, 0x8a, 0x97, 0xa4, 0xb1, 0xbe, 0xcb, | ||
6798 | 0xd8, 0xe5, 0xf2, 0xff, 0x0c, 0x19, 0x26, 0x33, | ||
6799 | 0x40, 0x4d, 0x5a, 0x67, 0x74, 0x81, 0x8e, 0x9b, | ||
6800 | 0xa8, 0xb5, 0xc2, 0xcf, 0xdc, 0xe9, 0xf6, 0x03, | ||
6801 | 0x10, 0x1d, 0x2a, 0x37, 0x44, 0x51, 0x5e, 0x6b, | ||
6802 | 0x78, 0x85, 0x92, 0x9f, 0xac, 0xb9, 0xc6, 0xd3, | ||
6803 | 0xe0, 0xed, 0xfa, 0x07, 0x14, 0x21, 0x2e, 0x3b, | ||
6804 | 0x48, 0x55, 0x62, 0x6f, 0x7c, 0x89, 0x96, 0xa3, | ||
6805 | 0xb0, 0xbd, 0xca, 0xd7, 0xe4, 0xf1, 0xfe, 0x0b, | ||
6806 | 0x18, 0x25, 0x32, 0x3f, 0x4c, 0x59, 0x66, 0x73, | ||
6807 | 0x80, 0x8d, 0x9a, 0xa7, 0xb4, 0xc1, 0xce, 0xdb, | ||
6808 | 0xe8, 0xf5, 0x02, 0x0f, 0x1c, 0x29, 0x36, 0x43, | ||
6809 | 0x50, 0x5d, 0x6a, 0x77, 0x84, 0x91, 0x9e, 0xab, | ||
6810 | 0xb8, 0xc5, 0xd2, 0xdf, 0xec, 0xf9, 0x06, 0x13, | ||
6811 | 0x20, 0x2d, 0x3a, 0x47, 0x54, 0x61, 0x6e, 0x7b, | ||
6812 | 0x88, 0x95, 0xa2, 0xaf, 0xbc, 0xc9, 0xd6, 0xe3, | ||
6813 | 0xf0, 0xfd, 0x0a, 0x17, 0x24, 0x31, 0x3e, 0x4b, | ||
6814 | 0x58, 0x65, 0x72, 0x7f, 0x8c, 0x99, 0xa6, 0xb3, | ||
6815 | 0xc0, 0xcd, 0xda, 0xe7, 0xf4, 0x01, 0x0e, 0x1b, | ||
6816 | 0x28, 0x35, 0x42, 0x4f, 0x5c, 0x69, 0x76, 0x83, | ||
6817 | 0x90, 0x9d, 0xaa, 0xb7, 0xc4, 0xd1, 0xde, 0xeb, | ||
6818 | 0xf8, 0x05, 0x12, 0x1f, 0x2c, 0x39, 0x46, 0x53, | ||
6819 | 0x60, 0x6d, 0x7a, 0x87, 0x94, 0xa1, 0xae, 0xbb, | ||
6820 | 0xc8, 0xd5, 0xe2, 0xef, 0xfc, 0x09, 0x16, 0x23, | ||
6821 | 0x30, 0x3d, 0x4a, 0x57, 0x64, 0x71, 0x7e, 0x8b, | ||
6822 | 0x98, 0xa5, 0xb2, 0xbf, 0xcc, 0xd9, 0xe6, 0xf3, | ||
6823 | 0x00, 0x0f, 0x1e, 0x2d, 0x3c, 0x4b, 0x5a, 0x69, | ||
6824 | 0x78, 0x87, 0x96, 0xa5, 0xb4, 0xc3, 0xd2, 0xe1, | ||
6825 | 0xf0, 0xff, 0x0e, 0x1d, 0x2c, 0x3b, 0x4a, 0x59, | ||
6826 | 0x68, 0x77, 0x86, 0x95, 0xa4, 0xb3, 0xc2, 0xd1, | ||
6827 | 0xe0, 0xef, 0xfe, 0x0d, 0x1c, 0x2b, 0x3a, 0x49, | ||
6828 | 0x58, 0x67, 0x76, 0x85, 0x94, 0xa3, 0xb2, 0xc1, | ||
6829 | 0xd0, 0xdf, 0xee, 0xfd, 0x0c, 0x1b, 0x2a, 0x39, | ||
6830 | 0x48, 0x57, 0x66, 0x75, 0x84, 0x93, 0xa2, 0xb1, | ||
6831 | 0xc0, 0xcf, 0xde, 0xed, 0xfc, 0x0b, 0x1a, 0x29, | ||
6832 | 0x38, 0x47, 0x56, 0x65, 0x74, 0x83, 0x92, 0xa1, | ||
6833 | 0xb0, 0xbf, 0xce, 0xdd, 0xec, 0xfb, 0x0a, 0x19, | ||
6834 | 0x28, 0x37, 0x46, 0x55, 0x64, 0x73, 0x82, 0x91, | ||
6835 | 0xa0, 0xaf, 0xbe, 0xcd, 0xdc, 0xeb, 0xfa, 0x09, | ||
6836 | 0x18, 0x27, 0x36, 0x45, 0x54, 0x63, 0x72, 0x81, | ||
6837 | 0x90, 0x9f, 0xae, 0xbd, 0xcc, 0xdb, 0xea, 0xf9, | ||
6838 | 0x08, 0x17, 0x26, 0x35, 0x44, 0x53, 0x62, 0x71, | ||
6839 | 0x80, 0x8f, 0x9e, 0xad, 0xbc, 0xcb, 0xda, 0xe9, | ||
6840 | 0xf8, 0x07, 0x16, 0x25, 0x34, 0x43, 0x52, 0x61, | ||
6841 | 0x70, 0x7f, 0x8e, 0x9d, 0xac, 0xbb, 0xca, 0xd9, | ||
6842 | 0xe8, 0xf7, 0x06, 0x15, 0x24, 0x33, 0x42, 0x51, | ||
6843 | 0x60, 0x6f, 0x7e, 0x8d, 0x9c, 0xab, 0xba, 0xc9, | ||
6844 | 0xd8, 0xe7, 0xf6, 0x05, 0x14, 0x23, 0x32, 0x41, | ||
6845 | 0x50, 0x5f, 0x6e, 0x7d, 0x8c, 0x9b, 0xaa, 0xb9, | ||
6846 | 0xc8, 0xd7, 0xe6, 0xf5, 0x04, 0x13, 0x22, 0x31, | ||
6847 | 0x40, 0x4f, 0x5e, 0x6d, 0x7c, 0x8b, 0x9a, 0xa9, | ||
6848 | 0xb8, 0xc7, 0xd6, 0xe5, 0xf4, 0x03, 0x12, 0x21, | ||
6849 | 0x30, 0x3f, 0x4e, 0x5d, 0x6c, 0x7b, 0x8a, 0x99, | ||
6850 | 0xa8, 0xb7, 0xc6, 0xd5, 0xe4, 0xf3, 0x02, 0x11, | ||
6851 | 0x20, 0x2f, 0x3e, 0x4d, 0x5c, 0x6b, 0x7a, 0x89, | ||
6852 | 0x98, 0xa7, 0xb6, 0xc5, 0xd4, 0xe3, 0xf2, 0x01, | ||
6853 | 0x10, 0x1f, 0x2e, 0x3d, 0x4c, 0x5b, 0x6a, 0x79, | ||
6854 | 0x88, 0x97, 0xa6, 0xb5, 0xc4, 0xd3, 0xe2, 0xf1, | ||
6855 | 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, | ||
6856 | 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, | ||
6857 | 0x10, 0x21, 0x32, 0x43, 0x54, 0x65, 0x76, 0x87, | ||
6858 | 0x98, 0xa9, 0xba, 0xcb, 0xdc, 0xed, 0xfe, 0x0f, | ||
6859 | 0x20, 0x31, 0x42, 0x53, 0x64, 0x75, 0x86, 0x97, | ||
6860 | 0xa8, 0xb9, 0xca, 0xdb, 0xec, 0xfd, 0x0e, 0x1f, | ||
6861 | 0x30, 0x41, 0x52, 0x63, 0x74, 0x85, 0x96, 0xa7, | ||
6862 | 0xb8, 0xc9, 0xda, 0xeb, 0xfc, 0x0d, 0x1e, 0x2f, | ||
6863 | 0x40, 0x51, 0x62, 0x73, 0x84, 0x95, 0xa6, 0xb7, | ||
6864 | 0xc8, 0xd9, 0xea, 0xfb, 0x0c, 0x1d, 0x2e, 0x3f, | ||
6865 | 0x50, 0x61, 0x72, 0x83, 0x94, 0xa5, 0xb6, 0xc7, | ||
6866 | 0xd8, 0xe9, 0xfa, 0x0b, 0x1c, 0x2d, 0x3e, 0x4f, | ||
6867 | 0x60, 0x71, 0x82, 0x93, 0xa4, 0xb5, 0xc6, 0xd7, | ||
6868 | 0xe8, 0xf9, 0x0a, 0x1b, 0x2c, 0x3d, 0x4e, 0x5f, | ||
6869 | 0x70, 0x81, 0x92, 0xa3, 0xb4, 0xc5, 0xd6, 0xe7, | ||
6870 | 0xf8, 0x09, 0x1a, 0x2b, 0x3c, 0x4d, 0x5e, 0x6f, | ||
6871 | 0x80, 0x91, 0xa2, 0xb3, 0xc4, 0xd5, 0xe6, 0xf7, | ||
6872 | 0x08, 0x19, 0x2a, 0x3b, 0x4c, 0x5d, 0x6e, 0x7f, | ||
6873 | 0x90, 0xa1, 0xb2, 0xc3, 0xd4, 0xe5, 0xf6, 0x07, | ||
6874 | 0x18, 0x29, 0x3a, 0x4b, 0x5c, 0x6d, 0x7e, 0x8f, | ||
6875 | 0xa0, 0xb1, 0xc2, 0xd3, 0xe4, 0xf5, 0x06, 0x17, | ||
6876 | 0x28, 0x39, 0x4a, 0x5b, 0x6c, 0x7d, 0x8e, 0x9f, | ||
6877 | 0xb0, 0xc1, 0xd2, 0xe3, 0xf4, 0x05, 0x16, 0x27, | ||
6878 | 0x38, 0x49, 0x5a, 0x6b, 0x7c, 0x8d, 0x9e, 0xaf, | ||
6879 | 0xc0, 0xd1, 0xe2, 0xf3, 0x04, 0x15, 0x26, 0x37, | ||
6880 | 0x48, 0x59, 0x6a, 0x7b, 0x8c, 0x9d, 0xae, 0xbf, | ||
6881 | 0xd0, 0xe1, 0xf2, 0x03, 0x14, 0x25, 0x36, 0x47, | ||
6882 | 0x58, 0x69, 0x7a, 0x8b, 0x9c, 0xad, 0xbe, 0xcf, | ||
6883 | 0xe0, 0xf1, 0x02, 0x13, 0x24, 0x35, 0x46, 0x57, | ||
6884 | 0x68, 0x79, 0x8a, 0x9b, 0xac, 0xbd, 0xce, 0xdf, | ||
6885 | 0xf0, 0x01, 0x12, 0x23, 0x34, 0x45, 0x56, 0x67, | ||
6886 | 0x78, 0x89, 0x9a, 0xab, 0xbc, 0xcd, 0xde, 0xef, | ||
6887 | 0x00, 0x13, 0x26, 0x39, 0x4c, 0x5f, 0x72, 0x85, | ||
6888 | 0x98, 0xab, 0xbe, 0xd1, 0xe4, 0xf7, 0x0a, 0x1d, | ||
6889 | 0x30, 0x43, 0x56, 0x69, 0x7c, 0x8f, 0xa2, 0xb5, | ||
6890 | 0xc8, 0xdb, 0xee, 0x01, 0x14, 0x27, 0x3a, 0x4d, | ||
6891 | 0x60, 0x73, 0x86, 0x99, 0xac, 0xbf, 0xd2, 0xe5, | ||
6892 | 0xf8, 0x0b, 0x1e, 0x31, 0x44, 0x57, 0x6a, 0x7d, | ||
6893 | 0x90, 0xa3, 0xb6, 0xc9, 0xdc, 0xef, 0x02, 0x15, | ||
6894 | 0x28, 0x3b, 0x4e, 0x61, 0x74, 0x87, 0x9a, 0xad, | ||
6895 | 0xc0, 0xd3, 0xe6, 0xf9, 0x0c, 0x1f, 0x32, 0x45, | ||
6896 | 0x58, 0x6b, 0x7e, 0x91, 0xa4, 0xb7, 0xca, 0xdd, | ||
6897 | 0xf0, 0x03, 0x16, 0x29, 0x3c, 0x4f, 0x62, 0x75, | ||
6898 | 0x88, 0x9b, 0xae, 0xc1, 0xd4, 0xe7, 0xfa, 0x0d, | ||
6899 | 0x20, 0x33, 0x46, 0x59, 0x6c, 0x7f, 0x92, 0xa5, | ||
6900 | 0xb8, 0xcb, 0xde, 0xf1, 0x04, 0x17, 0x2a, 0x3d, | ||
6901 | 0x50, 0x63, 0x76, 0x89, 0x9c, 0xaf, 0xc2, 0xd5, | ||
6902 | 0xe8, 0xfb, 0x0e, 0x21, 0x34, 0x47, 0x5a, 0x6d, | ||
6903 | 0x80, 0x93, 0xa6, 0xb9, 0xcc, 0xdf, 0xf2, 0x05, | ||
6904 | 0x18, 0x2b, 0x3e, 0x51, 0x64, 0x77, 0x8a, 0x9d, | ||
6905 | 0xb0, 0xc3, 0xd6, 0xe9, 0xfc, 0x0f, 0x22, 0x35, | ||
6906 | 0x48, 0x5b, 0x6e, 0x81, 0x94, 0xa7, 0xba, 0xcd, | ||
6907 | 0xe0, 0xf3, 0x06, 0x19, 0x2c, 0x3f, 0x52, 0x65, | ||
6908 | 0x78, 0x8b, 0x9e, 0xb1, 0xc4, 0xd7, 0xea, 0xfd, | ||
6909 | 0x10, 0x23, 0x36, 0x49, 0x5c, 0x6f, 0x82, 0x95, | ||
6910 | 0xa8, 0xbb, 0xce, 0xe1, 0xf4, 0x07, 0x1a, 0x2d, | ||
6911 | 0x40, 0x53, 0x66, 0x79, 0x8c, 0x9f, 0xb2, 0xc5, | ||
6912 | 0xd8, 0xeb, 0xfe, 0x11, 0x24, 0x37, 0x4a, 0x5d, | ||
6913 | 0x70, 0x83, 0x96, 0xa9, 0xbc, 0xcf, 0xe2, 0xf5, | ||
6914 | 0x08, 0x1b, 0x2e, 0x41, 0x54, 0x67, 0x7a, 0x8d, | ||
6915 | 0xa0, 0xb3, 0xc6, 0xd9, 0xec, 0xff, 0x12, 0x25, | ||
6916 | 0x38, 0x4b, 0x5e, 0x71, 0x84, 0x97, 0xaa, 0xbd, | ||
6917 | 0xd0, 0xe3, 0xf6, 0x09, 0x1c, 0x2f, 0x42, 0x55, | ||
6918 | 0x68, 0x7b, 0x8e, 0xa1, 0xb4, 0xc7, 0xda, 0xed, | ||
6919 | 0x00, 0x15, 0x2a, 0x3f, 0x54, 0x69, 0x7e, 0x93, | ||
6920 | 0xa8, 0xbd, 0xd2, 0xe7, 0xfc, 0x11, 0x26, 0x3b, | ||
6921 | 0x50, 0x65, 0x7a, 0x8f, 0xa4, 0xb9, 0xce, 0xe3, | ||
6922 | 0xf8, 0x0d, 0x22, 0x37, 0x4c, 0x61, 0x76, 0x8b, | ||
6923 | 0xa0, 0xb5, 0xca, 0xdf, 0xf4, 0x09, 0x1e, 0x33, | ||
6924 | 0x48, 0x5d, 0x72, 0x87, 0x9c, 0xb1, 0xc6, 0xdb, | ||
6925 | 0xf0, 0x05, 0x1a, 0x2f, 0x44, 0x59, 0x6e, 0x83, | ||
6926 | 0x98, 0xad, 0xc2, 0xd7, 0xec, 0x01, 0x16, 0x2b, | ||
6927 | 0x40, 0x55, 0x6a, 0x7f, 0x94, 0xa9, 0xbe, 0xd3, | ||
6928 | 0xe8, 0xfd, 0x12, 0x27, 0x3c, 0x51, 0x66, 0x7b, | ||
6929 | 0x90, 0xa5, 0xba, 0xcf, 0xe4, 0xf9, 0x0e, 0x23, | ||
6930 | 0x38, 0x4d, 0x62, 0x77, 0x8c, 0xa1, 0xb6, 0xcb, | ||
6931 | 0xe0, 0xf5, 0x0a, 0x1f, 0x34, 0x49, 0x5e, 0x73, | ||
6932 | 0x88, 0x9d, 0xb2, 0xc7, 0xdc, 0xf1, 0x06, 0x1b, | ||
6933 | 0x30, 0x45, 0x5a, 0x6f, 0x84, 0x99, 0xae, 0xc3, | ||
6934 | 0xd8, 0xed, 0x02, 0x17, 0x2c, 0x41, 0x56, 0x6b, | ||
6935 | 0x80, 0x95, 0xaa, 0xbf, 0xd4, 0xe9, 0xfe, 0x13, | ||
6936 | 0x28, 0x3d, 0x52, 0x67, 0x7c, 0x91, 0xa6, 0xbb, | ||
6937 | 0xd0, 0xe5, 0xfa, 0x0f, 0x24, 0x39, 0x4e, 0x63, | ||
6938 | 0x78, 0x8d, 0xa2, 0xb7, 0xcc, 0xe1, 0xf6, 0x0b, | ||
6939 | 0x20, 0x35, 0x4a, 0x5f, 0x74, 0x89, 0x9e, 0xb3, | ||
6940 | 0xc8, 0xdd, 0xf2, 0x07, 0x1c, 0x31, 0x46, 0x5b, | ||
6941 | 0x70, 0x85, 0x9a, 0xaf, 0xc4, 0xd9, 0xee, 0x03, | ||
6942 | 0x18, 0x2d, 0x42, 0x57, 0x6c, 0x81, 0x96, 0xab, | ||
6943 | 0xc0, 0xd5, 0xea, 0xff, 0x14, 0x29, 0x3e, 0x53, | ||
6944 | 0x68, 0x7d, 0x92, 0xa7, 0xbc, 0xd1, 0xe6, 0xfb, | ||
6945 | 0x10, 0x25, 0x3a, 0x4f, 0x64, 0x79, 0x8e, 0xa3, | ||
6946 | 0xb8, 0xcd, 0xe2, 0xf7, 0x0c, 0x21, 0x36, 0x4b, | ||
6947 | 0x60, 0x75, 0x8a, 0x9f, 0xb4, 0xc9, 0xde, 0xf3, | ||
6948 | 0x08, 0x1d, 0x32, 0x47, 0x5c, 0x71, 0x86, 0x9b, | ||
6949 | 0xb0, 0xc5, 0xda, 0xef, 0x04, 0x19, 0x2e, 0x43, | ||
6950 | 0x58, 0x6d, 0x82, 0x97, 0xac, 0xc1, 0xd6, 0xeb, | ||
6951 | 0x00, 0x17, 0x2e, 0x45, 0x5c, 0x73, 0x8a, 0xa1, | ||
6952 | 0xb8, 0xcf, 0xe6, 0xfd, 0x14, 0x2b, 0x42, 0x59, | ||
6953 | 0x70, 0x87, 0x9e, 0xb5, 0xcc, 0xe3, 0xfa, 0x11, | ||
6954 | 0x28, 0x3f, 0x56, 0x6d, 0x84, 0x9b, 0xb2, 0xc9, | ||
6955 | 0xe0, 0xf7, 0x0e, 0x25, 0x3c, 0x53, 0x6a, 0x81, | ||
6956 | 0x98, 0xaf, 0xc6, 0xdd, 0xf4, 0x0b, 0x22, 0x39, | ||
6957 | 0x50, 0x67, 0x7e, 0x95, 0xac, 0xc3, 0xda, 0xf1, | ||
6958 | 0x08, 0x1f, 0x36, 0x4d, 0x64, 0x7b, 0x92, 0xa9, | ||
6959 | 0xc0, 0xd7, 0xee, 0x05, 0x1c, 0x33, 0x4a, 0x61, | ||
6960 | 0x78, 0x8f, 0xa6, 0xbd, 0xd4, 0xeb, 0x02, 0x19, | ||
6961 | 0x30, 0x47, 0x5e, 0x75, 0x8c, 0xa3, 0xba, 0xd1, | ||
6962 | 0xe8, 0xff, 0x16, 0x2d, 0x44, 0x5b, 0x72, 0x89, | ||
6963 | 0xa0, 0xb7, 0xce, 0xe5, 0xfc, 0x13, 0x2a, 0x41, | ||
6964 | 0x58, 0x6f, 0x86, 0x9d, 0xb4, 0xcb, 0xe2, 0xf9, | ||
6965 | 0x10, 0x27, 0x3e, 0x55, 0x6c, 0x83, 0x9a, 0xb1, | ||
6966 | 0xc8, 0xdf, 0xf6, 0x0d, 0x24, 0x3b, 0x52, 0x69, | ||
6967 | 0x80, 0x97, 0xae, 0xc5, 0xdc, 0xf3, 0x0a, 0x21, | ||
6968 | 0x38, 0x4f, 0x66, 0x7d, 0x94, 0xab, 0xc2, 0xd9, | ||
6969 | 0xf0, 0x07, 0x1e, 0x35, 0x4c, 0x63, 0x7a, 0x91, | ||
6970 | 0xa8, 0xbf, 0xd6, 0xed, 0x04, 0x1b, 0x32, 0x49, | ||
6971 | 0x60, 0x77, 0x8e, 0xa5, 0xbc, 0xd3, 0xea, 0x01, | ||
6972 | 0x18, 0x2f, 0x46, 0x5d, 0x74, 0x8b, 0xa2, 0xb9, | ||
6973 | 0xd0, 0xe7, 0xfe, 0x15, 0x2c, 0x43, 0x5a, 0x71, | ||
6974 | 0x88, 0x9f, 0xb6, 0xcd, 0xe4, 0xfb, 0x12, 0x29, | ||
6975 | 0x40, 0x57, 0x6e, 0x85, 0x9c, 0xb3, 0xca, 0xe1, | ||
6976 | 0xf8, 0x0f, 0x26, 0x3d, 0x54, 0x6b, 0x82, 0x99, | ||
6977 | 0xb0, 0xc7, 0xde, 0xf5, 0x0c, 0x23, 0x3a, 0x51, | ||
6978 | 0x68, 0x7f, 0x96, 0xad, 0xc4, 0xdb, 0xf2, 0x09, | ||
6979 | 0x20, 0x37, 0x4e, 0x65, 0x7c, 0x93, 0xaa, 0xc1, | ||
6980 | 0xd8, 0xef, 0x06, 0x1d, 0x34, 0x4b, 0x62, 0x79, | ||
6981 | 0x90, 0xa7, 0xbe, 0xd5, 0xec, 0x03, 0x1a, 0x31, | ||
6982 | 0x48, 0x5f, 0x76, 0x8d, 0xa4, 0xbb, 0xd2, 0xe9, | ||
6983 | 0x00, 0x19, 0x32, 0x4b, 0x64, 0x7d, 0x96, 0xaf, | ||
6984 | 0xc8, 0xe1, 0xfa, 0x13, 0x2c, 0x45, 0x5e, 0x77, | ||
6985 | 0x90, 0xa9, 0xc2, 0xdb, 0xf4, 0x0d, 0x26, 0x3f, | ||
6986 | 0x58, 0x71, 0x8a, 0xa3, 0xbc, 0xd5, 0xee, 0x07, | ||
6987 | 0x20, 0x39, 0x52, 0x6b, 0x84, 0x9d, 0xb6, 0xcf, | ||
6988 | 0xe8, 0x01, 0x1a, 0x33, 0x4c, 0x65, 0x7e, 0x97, | ||
6989 | 0xb0, 0xc9, 0xe2, 0xfb, 0x14, 0x2d, 0x46, 0x5f, | ||
6990 | 0x78, 0x91, 0xaa, 0xc3, 0xdc, 0xf5, 0x0e, 0x27, | ||
6991 | 0x40, 0x59, 0x72, 0x8b, 0xa4, 0xbd, 0xd6, 0xef, | ||
6992 | 0x08, 0x21, 0x3a, 0x53, 0x6c, 0x85, 0x9e, 0xb7, | ||
6993 | 0xd0, 0xe9, 0x02, 0x1b, 0x34, 0x4d, 0x66, 0x7f, | ||
6994 | 0x98, 0xb1, 0xca, 0xe3, 0xfc, 0x15, 0x2e, 0x47, | ||
6995 | 0x60, 0x79, 0x92, 0xab, 0xc4, 0xdd, 0xf6, 0x0f, | ||
6996 | 0x28, 0x41, 0x5a, 0x73, 0x8c, 0xa5, 0xbe, 0xd7, | ||
6997 | 0xf0, 0x09, 0x22, 0x3b, 0x54, 0x6d, 0x86, 0x9f, | ||
6998 | 0xb8, 0xd1, 0xea, 0x03, 0x1c, 0x35, 0x4e, 0x67, | ||
6999 | 0x80, 0x99, 0xb2, 0xcb, 0xe4, 0xfd, 0x16, 0x2f, | ||
7000 | 0x48, 0x61, 0x7a, 0x93, 0xac, 0xc5, 0xde, 0xf7, | ||
7001 | 0x10, 0x29, 0x42, 0x5b, 0x74, 0x8d, 0xa6, 0xbf, | ||
7002 | 0xd8, 0xf1, 0x0a, 0x23, 0x3c, 0x55, 0x6e, 0x87, | ||
7003 | 0xa0, 0xb9, 0xd2, 0xeb, 0x04, 0x1d, 0x36, 0x4f, | ||
7004 | 0x68, 0x81, 0x9a, 0xb3, 0xcc, 0xe5, 0xfe, 0x17, | ||
7005 | 0x30, 0x49, 0x62, 0x7b, 0x94, 0xad, 0xc6, 0xdf, | ||
7006 | 0xf8, 0x11, 0x2a, 0x43, 0x5c, 0x75, 0x8e, 0xa7, | ||
7007 | 0xc0, 0xd9, 0xf2, 0x0b, 0x24, 0x3d, 0x56, 0x6f, | ||
7008 | 0x88, 0xa1, 0xba, 0xd3, 0xec, 0x05, 0x1e, 0x37, | ||
7009 | 0x50, 0x69, 0x82, 0x9b, 0xb4, 0xcd, 0xe6, 0xff, | ||
7010 | 0x18, 0x31, 0x4a, 0x63, 0x7c, 0x95, 0xae, 0xc7, | ||
7011 | 0xe0, 0xf9, 0x12, 0x2b, 0x44, 0x5d, 0x76, 0x8f, | ||
7012 | 0xa8, 0xc1, 0xda, 0xf3, 0x0c, 0x25, 0x3e, 0x57, | ||
7013 | 0x70, 0x89, 0xa2, 0xbb, 0xd4, 0xed, 0x06, 0x1f, | ||
7014 | 0x38, 0x51, 0x6a, 0x83, 0x9c, 0xb5, 0xce, 0xe7, | ||
7015 | 0x00, 0x1b, 0x36, 0x51, 0x6c, 0x87, 0xa2, 0xbd, | ||
7016 | 0xd8, 0xf3, 0x0e, 0x29, 0x44, 0x5f, 0x7a, 0x95, | ||
7017 | 0xb0, 0xcb, 0xe6, 0x01, 0x1c, 0x37, 0x52, 0x6d, | ||
7018 | 0x88, 0xa3, 0xbe, 0xd9, 0xf4, 0x0f, 0x2a, 0x45, | ||
7019 | 0x60, 0x7b, 0x96, 0xb1, 0xcc, 0xe7, 0x02, 0x1d, | ||
7020 | 0x38, 0x53, 0x6e, 0x89, 0xa4, 0xbf, 0xda, 0xf5, | ||
7021 | 0x10, 0x2b, 0x46, 0x61, 0x7c, 0x97, 0xb2, 0xcd, | ||
7022 | 0xe8, 0x03, 0x1e, 0x39, 0x54, 0x6f, 0x8a, 0xa5, | ||
7023 | 0xc0, 0xdb, 0xf6, 0x11, 0x2c, 0x47, 0x62, 0x7d, | ||
7024 | 0x98, 0xb3, 0xce, 0xe9, 0x04, 0x1f, 0x3a, 0x55, | ||
7025 | 0x70, 0x8b, 0xa6, 0xc1, 0xdc, 0xf7, 0x12, 0x2d, | ||
7026 | 0x48, 0x63, 0x7e, 0x99, 0xb4, 0xcf, 0xea, 0x05, | ||
7027 | 0x20, 0x3b, 0x56, 0x71, 0x8c, 0xa7, 0xc2, 0xdd, | ||
7028 | 0xf8, 0x13, 0x2e, 0x49, 0x64, 0x7f, 0x9a, 0xb5, | ||
7029 | 0xd0, 0xeb, 0x06, 0x21, 0x3c, 0x57, 0x72, 0x8d, | ||
7030 | 0xa8, 0xc3, 0xde, 0xf9, 0x14, 0x2f, 0x4a, 0x65, | ||
7031 | 0x80, 0x9b, 0xb6, 0xd1, 0xec, 0x07, 0x22, 0x3d, | ||
7032 | 0x58, 0x73, 0x8e, 0xa9, 0xc4, 0xdf, 0xfa, 0x15, | ||
7033 | 0x30, 0x4b, 0x66, 0x81, 0x9c, 0xb7, 0xd2, 0xed, | ||
7034 | 0x08, 0x23, 0x3e, 0x59, 0x74, 0x8f, 0xaa, 0xc5, | ||
7035 | 0xe0, 0xfb, 0x16, 0x31, 0x4c, 0x67, 0x82, 0x9d, | ||
7036 | 0xb8, 0xd3, 0xee, 0x09, 0x24, 0x3f, 0x5a, 0x75, | ||
7037 | 0x90, 0xab, 0xc6, 0xe1, 0xfc, 0x17, 0x32, 0x4d, | ||
7038 | 0x68, 0x83, 0x9e, 0xb9, 0xd4, 0xef, 0x0a, 0x25, | ||
7039 | 0x40, 0x5b, 0x76, 0x91, 0xac, 0xc7, 0xe2, 0xfd, | ||
7040 | 0x18, 0x33, 0x4e, 0x69, 0x84, 0x9f, 0xba, 0xd5, | ||
7041 | 0xf0, 0x0b, 0x26, 0x41, 0x5c, 0x77, 0x92, 0xad, | ||
7042 | 0xc8, 0xe3, 0xfe, 0x19, 0x34, 0x4f, 0x6a, 0x85, | ||
7043 | 0xa0, 0xbb, 0xd6, 0xf1, 0x0c, 0x27, 0x42, 0x5d, | ||
7044 | 0x78, 0x93, 0xae, 0xc9, 0xe4, 0xff, 0x1a, 0x35, | ||
7045 | 0x50, 0x6b, 0x86, 0xa1, 0xbc, 0xd7, 0xf2, 0x0d, | ||
7046 | 0x28, 0x43, 0x5e, 0x79, 0x94, 0xaf, 0xca, 0xe5, | ||
7047 | 0x00, 0x1d, 0x3a, 0x57, 0x74, 0x91, 0xae, 0xcb, | ||
7048 | 0xe8, 0x05, 0x22, 0x3f, 0x5c, 0x79, 0x96, 0xb3, | ||
7049 | 0xd0, 0xed, 0x0a, 0x27, 0x44, 0x61, 0x7e, 0x9b, | ||
7050 | 0xb8, 0xd5, 0xf2, 0x0f, 0x2c, 0x49, 0x66, 0x83, | ||
7051 | 0xa0, 0xbd, 0xda, 0xf7, 0x14, 0x31, 0x4e, 0x6b, | ||
7052 | 0x88, 0xa5, 0xc2, 0xdf, 0xfc, 0x19, 0x36, 0x53, | ||
7053 | 0x70, 0x8d, 0xaa, 0xc7, 0xe4, 0x01, 0x1e, 0x3b, | ||
7054 | 0x58, 0x75, 0x92, 0xaf, 0xcc, 0xe9, 0x06, 0x23, | ||
7055 | 0x40, 0x5d, 0x7a, 0x97, 0xb4, 0xd1, 0xee, 0x0b, | ||
7056 | 0x28, 0x45, 0x62, 0x7f, 0x9c, 0xb9, 0xd6, 0xf3, | ||
7057 | 0x10, 0x2d, 0x4a, 0x67, 0x84, 0xa1, 0xbe, 0xdb, | ||
7058 | 0xf8, 0x15, 0x32, 0x4f, 0x6c, 0x89, 0xa6, 0xc3, | ||
7059 | 0xe0, 0xfd, 0x1a, 0x37, 0x54, 0x71, 0x8e, 0xab, | ||
7060 | 0xc8, 0xe5, 0x02, 0x1f, 0x3c, 0x59, 0x76, 0x93, | ||
7061 | 0xb0, 0xcd, 0xea, 0x07, 0x24, 0x41, 0x5e, 0x7b, | ||
7062 | 0x98, 0xb5, 0xd2, 0xef, 0x0c, 0x29, 0x46, 0x63, | ||
7063 | 0x80, 0x9d, 0xba, 0xd7, 0xf4, 0x11, 0x2e, 0x4b, | ||
7064 | 0x68, 0x85, 0xa2, 0xbf, 0xdc, 0xf9, 0x16, 0x33, | ||
7065 | 0x50, 0x6d, 0x8a, 0xa7, 0xc4, 0xe1, 0xfe, 0x1b, | ||
7066 | 0x38, 0x55, 0x72, 0x8f, 0xac, 0xc9, 0xe6, 0x03, | ||
7067 | 0x20, 0x3d, 0x5a, 0x77, 0x94, 0xb1, 0xce, 0xeb, | ||
7068 | 0x08, 0x25, 0x42, 0x5f, 0x7c, 0x99, 0xb6, 0xd3, | ||
7069 | 0xf0, 0x0d, 0x2a, 0x47, 0x64, 0x81, 0x9e, 0xbb, | ||
7070 | 0xd8, 0xf5, 0x12, 0x2f, 0x4c, 0x69, 0x86, 0xa3, | ||
7071 | 0xc0, 0xdd, 0xfa, 0x17, 0x34, 0x51, 0x6e, 0x8b, | ||
7072 | 0xa8, 0xc5, 0xe2, 0xff, 0x1c, 0x39, 0x56, 0x73, | ||
7073 | 0x90, 0xad, 0xca, 0xe7, 0x04, 0x21, 0x3e, 0x5b, | ||
7074 | 0x78, 0x95, 0xb2, 0xcf, 0xec, 0x09, 0x26, 0x43, | ||
7075 | 0x60, 0x7d, 0x9a, 0xb7, 0xd4, 0xf1, 0x0e, 0x2b, | ||
7076 | 0x48, 0x65, 0x82, 0x9f, 0xbc, 0xd9, 0xf6, 0x13, | ||
7077 | 0x30, 0x4d, 0x6a, 0x87, 0xa4, 0xc1, 0xde, 0xfb, | ||
7078 | 0x18, 0x35, 0x52, 0x6f, 0x8c, 0xa9, 0xc6, 0xe3, | ||
7079 | 0x00, 0x1f, 0x3e, 0x5d, 0x7c, 0x9b, 0xba, 0xd9, | ||
7080 | 0xf8, 0x17, 0x36, 0x55, 0x74, 0x93, 0xb2, 0xd1, | ||
7081 | 0xf0, 0x0f, 0x2e, 0x4d, 0x6c, 0x8b, 0xaa, 0xc9, | ||
7082 | 0xe8, 0x07, 0x26, 0x45, 0x64, 0x83, 0xa2, 0xc1, | ||
7083 | 0xe0, 0xff, 0x1e, 0x3d, 0x5c, 0x7b, 0x9a, 0xb9, | ||
7084 | 0xd8, 0xf7, 0x16, 0x35, 0x54, 0x73, 0x92, 0xb1, | ||
7085 | 0xd0, 0xef, 0x0e, 0x2d, 0x4c, 0x6b, 0x8a, 0xa9, | ||
7086 | 0xc8, 0xe7, 0x06, 0x25, 0x44, 0x63, 0x82, 0xa1, | ||
7087 | 0xc0, 0xdf, 0xfe, 0x1d, 0x3c, 0x5b, 0x7a, 0x99, | ||
7088 | 0xb8, 0xd7, 0xf6, 0x15, 0x34, 0x53, 0x72, 0x91, | ||
7089 | 0xb0, 0xcf, 0xee, 0x0d, 0x2c, 0x4b, 0x6a, 0x89, | ||
7090 | 0xa8, 0xc7, 0xe6, 0x05, 0x24, 0x43, 0x62, 0x81, | ||
7091 | 0xa0, 0xbf, 0xde, 0xfd, 0x1c, 0x3b, 0x5a, 0x79, | ||
7092 | 0x98, 0xb7, 0xd6, 0xf5, 0x14, 0x33, 0x52, 0x71, | ||
7093 | 0x90, 0xaf, 0xce, 0xed, 0x0c, 0x2b, 0x4a, 0x69, | ||
7094 | 0x88, 0xa7, 0xc6, 0xe5, 0x04, 0x23, 0x42, 0x61, | ||
7095 | 0x80, 0x9f, 0xbe, 0xdd, 0xfc, 0x1b, 0x3a, 0x59, | ||
7096 | 0x78, 0x97, 0xb6, 0xd5, 0xf4, 0x13, 0x32, 0x51, | ||
7097 | 0x70, 0x8f, 0xae, 0xcd, 0xec, 0x0b, 0x2a, 0x49, | ||
7098 | 0x68, 0x87, 0xa6, 0xc5, 0xe4, 0x03, 0x22, 0x41, | ||
7099 | 0x60, 0x7f, 0x9e, 0xbd, 0xdc, 0xfb, 0x1a, 0x39, | ||
7100 | 0x58, 0x77, 0x96, 0xb5, 0xd4, 0xf3, 0x12, 0x31, | ||
7101 | 0x50, 0x6f, 0x8e, 0xad, 0xcc, 0xeb, 0x0a, 0x29, | ||
7102 | 0x48, 0x67, 0x86, 0xa5, 0xc4, 0xe3, 0x02, 0x21, | ||
7103 | 0x40, 0x5f, 0x7e, 0x9d, 0xbc, 0xdb, 0xfa, 0x19, | ||
7104 | 0x38, 0x57, 0x76, 0x95, 0xb4, 0xd3, 0xf2, 0x11, | ||
7105 | 0x30, 0x4f, 0x6e, 0x8d, 0xac, 0xcb, 0xea, 0x09, | ||
7106 | 0x28, 0x47, 0x66, 0x85, 0xa4, 0xc3, 0xe2, 0x01, | ||
7107 | 0x20, 0x3f, 0x5e, 0x7d, 0x9c, 0xbb, 0xda, 0xf9, | ||
7108 | 0x18, 0x37, 0x56, 0x75, 0x94, 0xb3, 0xd2, 0xf1, | ||
7109 | 0x10, 0x2f, 0x4e, 0x6d, 0x8c, 0xab, 0xca, 0xe9, | ||
7110 | 0x08, 0x27, 0x46, 0x65, 0x84, 0xa3, 0xc2, 0xe1, | ||
7111 | 0x00, 0x21, 0x42, 0x63, | ||
7112 | }, | ||
7113 | .ilen = 4100, | ||
7114 | .result = { | ||
7115 | 0xb5, 0x81, 0xf5, 0x64, 0x18, 0x73, 0xe3, 0xf0, | ||
7116 | 0x4c, 0x13, 0xf2, 0x77, 0x18, 0x60, 0x65, 0x5e, | ||
7117 | 0x29, 0x01, 0xce, 0x98, 0x55, 0x53, 0xf9, 0x0c, | ||
7118 | 0x2a, 0x08, 0xd5, 0x09, 0xb3, 0x57, 0x55, 0x56, | ||
7119 | 0xc5, 0xe9, 0x56, 0x90, 0xcb, 0x6a, 0xa3, 0xc0, | ||
7120 | 0xff, 0xc4, 0x79, 0xb4, 0xd2, 0x97, 0x5d, 0xc4, | ||
7121 | 0x43, 0xd1, 0xfe, 0x94, 0x7b, 0x88, 0x06, 0x5a, | ||
7122 | 0xb2, 0x9e, 0x2c, 0xfc, 0x44, 0x03, 0xb7, 0x90, | ||
7123 | 0xa0, 0xc1, 0xba, 0x6a, 0x33, 0xb8, 0xc7, 0xb2, | ||
7124 | 0x9d, 0xe1, 0x12, 0x4f, 0xc0, 0x64, 0xd4, 0x01, | ||
7125 | 0xfe, 0x8c, 0x7a, 0x66, 0xf7, 0xe6, 0x5a, 0x91, | ||
7126 | 0xbb, 0xde, 0x56, 0x86, 0xab, 0x65, 0x21, 0x30, | ||
7127 | 0x00, 0x84, 0x65, 0x24, 0xa5, 0x7d, 0x85, 0xb4, | ||
7128 | 0xe3, 0x17, 0xed, 0x3a, 0xb7, 0x6f, 0xb4, 0x0b, | ||
7129 | 0x0b, 0xaf, 0x15, 0xae, 0x5a, 0x8f, 0xf2, 0x0c, | ||
7130 | 0x2f, 0x27, 0xf4, 0x09, 0xd8, 0xd2, 0x96, 0xb7, | ||
7131 | 0x71, 0xf2, 0xc5, 0x99, 0x4d, 0x7e, 0x7f, 0x75, | ||
7132 | 0x77, 0x89, 0x30, 0x8b, 0x59, 0xdb, 0xa2, 0xb2, | ||
7133 | 0xa0, 0xf3, 0x19, 0x39, 0x2b, 0xc5, 0x7e, 0x3f, | ||
7134 | 0x4f, 0xd9, 0xd3, 0x56, 0x28, 0x97, 0x44, 0xdc, | ||
7135 | 0xc0, 0x8b, 0x77, 0x24, 0xd9, 0x52, 0xe7, 0xc5, | ||
7136 | 0xaf, 0xf6, 0x7d, 0x59, 0xb2, 0x44, 0x05, 0x1d, | ||
7137 | 0xb1, 0xb0, 0x11, 0xa5, 0x0f, 0xec, 0x33, 0xe1, | ||
7138 | 0x6d, 0x1b, 0x4e, 0x1f, 0xff, 0x57, 0x91, 0xb4, | ||
7139 | 0x5b, 0x9a, 0x96, 0xc5, 0x53, 0xbc, 0xae, 0x20, | ||
7140 | 0x3c, 0xbb, 0x14, 0xe2, 0xe8, 0x22, 0x33, 0xc1, | ||
7141 | 0x5e, 0x76, 0x9e, 0x46, 0x99, 0xf6, 0x2a, 0x15, | ||
7142 | 0xc6, 0x97, 0x02, 0xa0, 0x66, 0x43, 0xd1, 0xa6, | ||
7143 | 0x31, 0xa6, 0x9f, 0xfb, 0xf4, 0xd3, 0x69, 0xe5, | ||
7144 | 0xcd, 0x76, 0x95, 0xb8, 0x7a, 0x82, 0x7f, 0x21, | ||
7145 | 0x45, 0xff, 0x3f, 0xce, 0x55, 0xf6, 0x95, 0x10, | ||
7146 | 0x08, 0x77, 0x10, 0x43, 0xc6, 0xf3, 0x09, 0xe5, | ||
7147 | 0x68, 0xe7, 0x3c, 0xad, 0x00, 0x52, 0x45, 0x0d, | ||
7148 | 0xfe, 0x2d, 0xc6, 0xc2, 0x94, 0x8c, 0x12, 0x1d, | ||
7149 | 0xe6, 0x25, 0xae, 0x98, 0x12, 0x8e, 0x19, 0x9c, | ||
7150 | 0x81, 0x68, 0xb1, 0x11, 0xf6, 0x69, 0xda, 0xe3, | ||
7151 | 0x62, 0x08, 0x18, 0x7a, 0x25, 0x49, 0x28, 0xac, | ||
7152 | 0xba, 0x71, 0x12, 0x0b, 0xe4, 0xa2, 0xe5, 0xc7, | ||
7153 | 0x5d, 0x8e, 0xec, 0x49, 0x40, 0x21, 0xbf, 0x5a, | ||
7154 | 0x98, 0xf3, 0x02, 0x68, 0x55, 0x03, 0x7f, 0x8a, | ||
7155 | 0xe5, 0x94, 0x0c, 0x32, 0x5c, 0x07, 0x82, 0x63, | ||
7156 | 0xaf, 0x6f, 0x91, 0x40, 0x84, 0x8e, 0x52, 0x25, | ||
7157 | 0xd0, 0xb0, 0x29, 0x53, 0x05, 0xe2, 0x50, 0x7a, | ||
7158 | 0x34, 0xeb, 0xc9, 0x46, 0x20, 0xa8, 0x3d, 0xde, | ||
7159 | 0x7f, 0x16, 0x5f, 0x36, 0xc5, 0x2e, 0xdc, 0xd1, | ||
7160 | 0x15, 0x47, 0xc7, 0x50, 0x40, 0x6d, 0x91, 0xc5, | ||
7161 | 0xe7, 0x93, 0x95, 0x1a, 0xd3, 0x57, 0xbc, 0x52, | ||
7162 | 0x33, 0xee, 0x14, 0x19, 0x22, 0x52, 0x89, 0xa7, | ||
7163 | 0x4a, 0x25, 0x56, 0x77, 0x4b, 0xca, 0xcf, 0x0a, | ||
7164 | 0xe1, 0xf5, 0x35, 0x85, 0x30, 0x7e, 0x59, 0x4a, | ||
7165 | 0xbd, 0x14, 0x5b, 0xdf, 0xe3, 0x46, 0xcb, 0xac, | ||
7166 | 0x1f, 0x6c, 0x96, 0x0e, 0xf4, 0x81, 0xd1, 0x99, | ||
7167 | 0xca, 0x88, 0x63, 0x3d, 0x02, 0x58, 0x6b, 0xa9, | ||
7168 | 0xe5, 0x9f, 0xb3, 0x00, 0xb2, 0x54, 0xc6, 0x74, | ||
7169 | 0x1c, 0xbf, 0x46, 0xab, 0x97, 0xcc, 0xf8, 0x54, | ||
7170 | 0x04, 0x07, 0x08, 0x52, 0xe6, 0xc0, 0xda, 0x93, | ||
7171 | 0x74, 0x7d, 0x93, 0x99, 0x5d, 0x78, 0x68, 0xa6, | ||
7172 | 0x2e, 0x6b, 0xd3, 0x6a, 0x69, 0xcc, 0x12, 0x6b, | ||
7173 | 0xd4, 0xc7, 0xa5, 0xc6, 0xe7, 0xf6, 0x03, 0x04, | ||
7174 | 0x5d, 0xcd, 0x61, 0x5e, 0x17, 0x40, 0xdc, 0xd1, | ||
7175 | 0x5c, 0xf5, 0x08, 0xdf, 0x5c, 0x90, 0x85, 0xa4, | ||
7176 | 0xaf, 0xf6, 0x78, 0xbb, 0x0d, 0xf1, 0xf4, 0xa4, | ||
7177 | 0x54, 0x26, 0x72, 0x9e, 0x61, 0xfa, 0x86, 0xcf, | ||
7178 | 0xe8, 0x9e, 0xa1, 0xe0, 0xc7, 0x48, 0x23, 0xae, | ||
7179 | 0x5a, 0x90, 0xae, 0x75, 0x0a, 0x74, 0x18, 0x89, | ||
7180 | 0x05, 0xb1, 0x92, 0xb2, 0x7f, 0xd0, 0x1b, 0xa6, | ||
7181 | 0x62, 0x07, 0x25, 0x01, 0xc7, 0xc2, 0x4f, 0xf9, | ||
7182 | 0xe8, 0xfe, 0x63, 0x95, 0x80, 0x07, 0xb4, 0x26, | ||
7183 | 0xcc, 0xd1, 0x26, 0xb6, 0xc4, 0x3f, 0x9e, 0xcb, | ||
7184 | 0x8e, 0x3b, 0x2e, 0x44, 0x16, 0xd3, 0x10, 0x9a, | ||
7185 | 0x95, 0x08, 0xeb, 0xc8, 0xcb, 0xeb, 0xbf, 0x6f, | ||
7186 | 0x0b, 0xcd, 0x1f, 0xc8, 0xca, 0x86, 0xaa, 0xec, | ||
7187 | 0x33, 0xe6, 0x69, 0xf4, 0x45, 0x25, 0x86, 0x3a, | ||
7188 | 0x22, 0x94, 0x4f, 0x00, 0x23, 0x6a, 0x44, 0xc2, | ||
7189 | 0x49, 0x97, 0x33, 0xab, 0x36, 0x14, 0x0a, 0x70, | ||
7190 | 0x24, 0xc3, 0xbe, 0x04, 0x3b, 0x79, 0xa0, 0xf9, | ||
7191 | 0xb8, 0xe7, 0x76, 0x29, 0x22, 0x83, 0xd7, 0xf2, | ||
7192 | 0x94, 0xf4, 0x41, 0x49, 0xba, 0x5f, 0x7b, 0x07, | ||
7193 | 0xb5, 0xfb, 0xdb, 0x03, 0x1a, 0x9f, 0xb6, 0x4c, | ||
7194 | 0xc2, 0x2e, 0x37, 0x40, 0x49, 0xc3, 0x38, 0x16, | ||
7195 | 0xe2, 0x4f, 0x77, 0x82, 0xb0, 0x68, 0x4c, 0x71, | ||
7196 | 0x1d, 0x57, 0x61, 0x9c, 0xd9, 0x4e, 0x54, 0x99, | ||
7197 | 0x47, 0x13, 0x28, 0x73, 0x3c, 0xbb, 0x00, 0x90, | ||
7198 | 0xf3, 0x4d, 0xc9, 0x0e, 0xfd, 0xe7, 0xb1, 0x71, | ||
7199 | 0xd3, 0x15, 0x79, 0xbf, 0xcc, 0x26, 0x2f, 0xbd, | ||
7200 | 0xad, 0x6c, 0x50, 0x69, 0x6c, 0x3e, 0x6d, 0x80, | ||
7201 | 0x9a, 0xea, 0x78, 0xaf, 0x19, 0xb2, 0x0d, 0x4d, | ||
7202 | 0xad, 0x04, 0x07, 0xae, 0x22, 0x90, 0x4a, 0x93, | ||
7203 | 0x32, 0x0e, 0x36, 0x9b, 0x1b, 0x46, 0xba, 0x3b, | ||
7204 | 0xb4, 0xac, 0xc6, 0xd1, 0xa2, 0x31, 0x53, 0x3b, | ||
7205 | 0x2a, 0x3d, 0x45, 0xfe, 0x03, 0x61, 0x10, 0x85, | ||
7206 | 0x17, 0x69, 0xa6, 0x78, 0xcc, 0x6c, 0x87, 0x49, | ||
7207 | 0x53, 0xf9, 0x80, 0x10, 0xde, 0x80, 0xa2, 0x41, | ||
7208 | 0x6a, 0xc3, 0x32, 0x02, 0xad, 0x6d, 0x3c, 0x56, | ||
7209 | 0x00, 0x71, 0x51, 0x06, 0xa7, 0xbd, 0xfb, 0xef, | ||
7210 | 0x3c, 0xb5, 0x9f, 0xfc, 0x48, 0x7d, 0x53, 0x7c, | ||
7211 | 0x66, 0xb0, 0x49, 0x23, 0xc4, 0x47, 0x10, 0x0e, | ||
7212 | 0xe5, 0x6c, 0x74, 0x13, 0xe6, 0xc5, 0x3f, 0xaa, | ||
7213 | 0xde, 0xff, 0x07, 0x44, 0xdd, 0x56, 0x1b, 0xad, | ||
7214 | 0x09, 0x77, 0xfb, 0x5b, 0x12, 0xb8, 0x0d, 0x38, | ||
7215 | 0x17, 0x37, 0x35, 0x7b, 0x9b, 0xbc, 0xfe, 0xd4, | ||
7216 | 0x7e, 0x8b, 0xda, 0x7e, 0x5b, 0x04, 0xa7, 0x22, | ||
7217 | 0xa7, 0x31, 0xa1, 0x20, 0x86, 0xc7, 0x1b, 0x99, | ||
7218 | 0xdb, 0xd1, 0x89, 0xf4, 0x94, 0xa3, 0x53, 0x69, | ||
7219 | 0x8d, 0xe7, 0xe8, 0x74, 0x11, 0x8d, 0x74, 0xd6, | ||
7220 | 0x07, 0x37, 0x91, 0x9f, 0xfd, 0x67, 0x50, 0x3a, | ||
7221 | 0xc9, 0xe1, 0xf4, 0x36, 0xd5, 0xa0, 0x47, 0xd1, | ||
7222 | 0xf9, 0xe5, 0x39, 0xa3, 0x31, 0xac, 0x07, 0x36, | ||
7223 | 0x23, 0xf8, 0x66, 0x18, 0x14, 0x28, 0x34, 0x0f, | ||
7224 | 0xb8, 0xd0, 0xe7, 0x29, 0xb3, 0x04, 0x4b, 0x55, | ||
7225 | 0x01, 0x41, 0xb2, 0x75, 0x8d, 0xcb, 0x96, 0x85, | ||
7226 | 0x3a, 0xfb, 0xab, 0x2b, 0x9e, 0xfa, 0x58, 0x20, | ||
7227 | 0x44, 0x1f, 0xc0, 0x14, 0x22, 0x75, 0x61, 0xe8, | ||
7228 | 0xaa, 0x19, 0xcf, 0xf1, 0x82, 0x56, 0xf4, 0xd7, | ||
7229 | 0x78, 0x7b, 0x3d, 0x5f, 0xb3, 0x9e, 0x0b, 0x8a, | ||
7230 | 0x57, 0x50, 0xdb, 0x17, 0x41, 0x65, 0x4d, 0xa3, | ||
7231 | 0x02, 0xc9, 0x9c, 0x9c, 0x53, 0xfb, 0x39, 0x39, | ||
7232 | 0x9b, 0x1d, 0x72, 0x24, 0xda, 0xb7, 0x39, 0xbe, | ||
7233 | 0x13, 0x3b, 0xfa, 0x29, 0xda, 0x9e, 0x54, 0x64, | ||
7234 | 0x6e, 0xba, 0xd8, 0xa1, 0xcb, 0xb3, 0x36, 0xfa, | ||
7235 | 0xcb, 0x47, 0x85, 0xe9, 0x61, 0x38, 0xbc, 0xbe, | ||
7236 | 0xc5, 0x00, 0x38, 0x2a, 0x54, 0xf7, 0xc4, 0xb9, | ||
7237 | 0xb3, 0xd3, 0x7b, 0xa0, 0xa0, 0xf8, 0x72, 0x7f, | ||
7238 | 0x8c, 0x8e, 0x82, 0x0e, 0xc6, 0x1c, 0x75, 0x9d, | ||
7239 | 0xca, 0x8e, 0x61, 0x87, 0xde, 0xad, 0x80, 0xd2, | ||
7240 | 0xf5, 0xf9, 0x80, 0xef, 0x15, 0x75, 0xaf, 0xf5, | ||
7241 | 0x80, 0xfb, 0xff, 0x6d, 0x1e, 0x25, 0xb7, 0x40, | ||
7242 | 0x61, 0x6a, 0x39, 0x5a, 0x6a, 0xb5, 0x31, 0xab, | ||
7243 | 0x97, 0x8a, 0x19, 0x89, 0x44, 0x40, 0xc0, 0xa6, | ||
7244 | 0xb4, 0x4e, 0x30, 0x32, 0x7b, 0x13, 0xe7, 0x67, | ||
7245 | 0xa9, 0x8b, 0x57, 0x04, 0xc2, 0x01, 0xa6, 0xf4, | ||
7246 | 0x28, 0x99, 0xad, 0x2c, 0x76, 0xa3, 0x78, 0xc2, | ||
7247 | 0x4a, 0xe6, 0xca, 0x5c, 0x50, 0x6a, 0xc1, 0xb0, | ||
7248 | 0x62, 0x4b, 0x10, 0x8e, 0x7c, 0x17, 0x43, 0xb3, | ||
7249 | 0x17, 0x66, 0x1c, 0x3e, 0x8d, 0x69, 0xf0, 0x5a, | ||
7250 | 0x71, 0xf5, 0x97, 0xdc, 0xd1, 0x45, 0xdd, 0x28, | ||
7251 | 0xf3, 0x5d, 0xdf, 0x53, 0x7b, 0x11, 0xe5, 0xbc, | ||
7252 | 0x4c, 0xdb, 0x1b, 0x51, 0x6b, 0xe9, 0xfb, 0x3d, | ||
7253 | 0xc1, 0xc3, 0x2c, 0xb9, 0x71, 0xf5, 0xb6, 0xb2, | ||
7254 | 0x13, 0x36, 0x79, 0x80, 0x53, 0xe8, 0xd3, 0xa6, | ||
7255 | 0x0a, 0xaf, 0xfd, 0x56, 0x97, 0xf7, 0x40, 0x8e, | ||
7256 | 0x45, 0xce, 0xf8, 0xb0, 0x9e, 0x5c, 0x33, 0x82, | ||
7257 | 0xb0, 0x44, 0x56, 0xfc, 0x05, 0x09, 0xe9, 0x2a, | ||
7258 | 0xac, 0x26, 0x80, 0x14, 0x1d, 0xc8, 0x3a, 0x35, | ||
7259 | 0x4c, 0x82, 0x97, 0xfd, 0x76, 0xb7, 0xa9, 0x0a, | ||
7260 | 0x35, 0x58, 0x79, 0x8e, 0x0f, 0x66, 0xea, 0xaf, | ||
7261 | 0x51, 0x6c, 0x09, 0xa9, 0x6e, 0x9b, 0xcb, 0x9a, | ||
7262 | 0x31, 0x47, 0xa0, 0x2f, 0x7c, 0x71, 0xb4, 0x4a, | ||
7263 | 0x11, 0xaa, 0x8c, 0x66, 0xc5, 0x64, 0xe6, 0x3a, | ||
7264 | 0x54, 0xda, 0x24, 0x6a, 0xc4, 0x41, 0x65, 0x46, | ||
7265 | 0x82, 0xa0, 0x0a, 0x0f, 0x5f, 0xfb, 0x25, 0xd0, | ||
7266 | 0x2c, 0x91, 0xa7, 0xee, 0xc4, 0x81, 0x07, 0x86, | ||
7267 | 0x75, 0x5e, 0x33, 0x69, 0x97, 0xe4, 0x2c, 0xa8, | ||
7268 | 0x9d, 0x9f, 0x0b, 0x6a, 0xbe, 0xad, 0x98, 0xda, | ||
7269 | 0x6d, 0x94, 0x41, 0xda, 0x2c, 0x1e, 0x89, 0xc4, | ||
7270 | 0xc2, 0xaf, 0x1e, 0x00, 0x05, 0x0b, 0x83, 0x60, | ||
7271 | 0xbd, 0x43, 0xea, 0x15, 0x23, 0x7f, 0xb9, 0xac, | ||
7272 | 0xee, 0x4f, 0x2c, 0xaf, 0x2a, 0xf3, 0xdf, 0xd0, | ||
7273 | 0xf3, 0x19, 0x31, 0xbb, 0x4a, 0x74, 0x84, 0x17, | ||
7274 | 0x52, 0x32, 0x2c, 0x7d, 0x61, 0xe4, 0xcb, 0xeb, | ||
7275 | 0x80, 0x38, 0x15, 0x52, 0xcb, 0x6f, 0xea, 0xe5, | ||
7276 | 0x73, 0x9c, 0xd9, 0x24, 0x69, 0xc6, 0x95, 0x32, | ||
7277 | 0x21, 0xc8, 0x11, 0xe4, 0xdc, 0x36, 0xd7, 0x93, | ||
7278 | 0x38, 0x66, 0xfb, 0xb2, 0x7f, 0x3a, 0xb9, 0xaf, | ||
7279 | 0x31, 0xdd, 0x93, 0x75, 0x78, 0x8a, 0x2c, 0x94, | ||
7280 | 0x87, 0x1a, 0x58, 0xec, 0x9e, 0x7d, 0x4d, 0xba, | ||
7281 | 0xe1, 0xe5, 0x4d, 0xfc, 0xbc, 0xa4, 0x2a, 0x14, | ||
7282 | 0xef, 0xcc, 0xa7, 0xec, 0xab, 0x43, 0x09, 0x18, | ||
7283 | 0xd3, 0xab, 0x68, 0xd1, 0x07, 0x99, 0x44, 0x47, | ||
7284 | 0xd6, 0x83, 0x85, 0x3b, 0x30, 0xea, 0xa9, 0x6b, | ||
7285 | 0x63, 0xea, 0xc4, 0x07, 0xfb, 0x43, 0x2f, 0xa4, | ||
7286 | 0xaa, 0xb0, 0xab, 0x03, 0x89, 0xce, 0x3f, 0x8c, | ||
7287 | 0x02, 0x7c, 0x86, 0x54, 0xbc, 0x88, 0xaf, 0x75, | ||
7288 | 0xd2, 0xdc, 0x63, 0x17, 0xd3, 0x26, 0xf6, 0x96, | ||
7289 | 0xa9, 0x3c, 0xf1, 0x61, 0x8c, 0x11, 0x18, 0xcc, | ||
7290 | 0xd6, 0xea, 0x5b, 0xe2, 0xcd, 0xf0, 0xf1, 0xb2, | ||
7291 | 0xe5, 0x35, 0x90, 0x1f, 0x85, 0x4c, 0x76, 0x5b, | ||
7292 | 0x66, 0xce, 0x44, 0xa4, 0x32, 0x9f, 0xe6, 0x7b, | ||
7293 | 0x71, 0x6e, 0x9f, 0x58, 0x15, 0x67, 0x72, 0x87, | ||
7294 | 0x64, 0x8e, 0x3a, 0x44, 0x45, 0xd4, 0x76, 0xfa, | ||
7295 | 0xc2, 0xf6, 0xef, 0x85, 0x05, 0x18, 0x7a, 0x9b, | ||
7296 | 0xba, 0x41, 0x54, 0xac, 0xf0, 0xfc, 0x59, 0x12, | ||
7297 | 0x3f, 0xdf, 0xa0, 0xe5, 0x8a, 0x65, 0xfd, 0x3a, | ||
7298 | 0x62, 0x8d, 0x83, 0x2c, 0x03, 0xbe, 0x05, 0x76, | ||
7299 | 0x2e, 0x53, 0x49, 0x97, 0x94, 0x33, 0xae, 0x40, | ||
7300 | 0x81, 0x15, 0xdb, 0x6e, 0xad, 0xaa, 0xf5, 0x4b, | ||
7301 | 0xe3, 0x98, 0x70, 0xdf, 0xe0, 0x7c, 0xcd, 0xdb, | ||
7302 | 0x02, 0xd4, 0x7d, 0x2f, 0xc1, 0xe6, 0xb4, 0xf3, | ||
7303 | 0xd7, 0x0d, 0x7a, 0xd9, 0x23, 0x9e, 0x87, 0x2d, | ||
7304 | 0xce, 0x87, 0xad, 0xcc, 0x72, 0x05, 0x00, 0x29, | ||
7305 | 0xdc, 0x73, 0x7f, 0x64, 0xc1, 0x15, 0x0e, 0xc2, | ||
7306 | 0xdf, 0xa7, 0x5f, 0xeb, 0x41, 0xa1, 0xcd, 0xef, | ||
7307 | 0x5c, 0x50, 0x79, 0x2a, 0x56, 0x56, 0x71, 0x8c, | ||
7308 | 0xac, 0xc0, 0x79, 0x50, 0x69, 0xca, 0x59, 0x32, | ||
7309 | 0x65, 0xf2, 0x54, 0xe4, 0x52, 0x38, 0x76, 0xd1, | ||
7310 | 0x5e, 0xde, 0x26, 0x9e, 0xfb, 0x75, 0x2e, 0x11, | ||
7311 | 0xb5, 0x10, 0xf4, 0x17, 0x73, 0xf5, 0x89, 0xc7, | ||
7312 | 0x4f, 0x43, 0x5c, 0x8e, 0x7c, 0xb9, 0x05, 0x52, | ||
7313 | 0x24, 0x40, 0x99, 0xfe, 0x9b, 0x85, 0x0b, 0x6c, | ||
7314 | 0x22, 0x3e, 0x8b, 0xae, 0x86, 0xa1, 0xd2, 0x79, | ||
7315 | 0x05, 0x68, 0x6b, 0xab, 0xe3, 0x41, 0x49, 0xed, | ||
7316 | 0x15, 0xa1, 0x8d, 0x40, 0x2d, 0x61, 0xdf, 0x1a, | ||
7317 | 0x59, 0xc9, 0x26, 0x8b, 0xef, 0x30, 0x4c, 0x88, | ||
7318 | 0x4b, 0x10, 0xf8, 0x8d, 0xa6, 0x92, 0x9f, 0x4b, | ||
7319 | 0xf3, 0xc4, 0x53, 0x0b, 0x89, 0x5d, 0x28, 0x92, | ||
7320 | 0xcf, 0x78, 0xb2, 0xc0, 0x5d, 0xed, 0x7e, 0xfc, | ||
7321 | 0xc0, 0x12, 0x23, 0x5f, 0x5a, 0x78, 0x86, 0x43, | ||
7322 | 0x6e, 0x27, 0xf7, 0x5a, 0xa7, 0x6a, 0xed, 0x19, | ||
7323 | 0x04, 0xf0, 0xb3, 0x12, 0xd1, 0xbd, 0x0e, 0x89, | ||
7324 | 0x6e, 0xbc, 0x96, 0xa8, 0xd8, 0x49, 0x39, 0x9f, | ||
7325 | 0x7e, 0x67, 0xf0, 0x2e, 0x3e, 0x01, 0xa9, 0xba, | ||
7326 | 0xec, 0x8b, 0x62, 0x8e, 0xcb, 0x4a, 0x70, 0x43, | ||
7327 | 0xc7, 0xc2, 0xc4, 0xca, 0x82, 0x03, 0x73, 0xe9, | ||
7328 | 0x11, 0xdf, 0xcf, 0x54, 0xea, 0xc9, 0xb0, 0x95, | ||
7329 | 0x51, 0xc0, 0x13, 0x3d, 0x92, 0x05, 0xfa, 0xf4, | ||
7330 | 0xa9, 0x34, 0xc8, 0xce, 0x6c, 0x3d, 0x54, 0xcc, | ||
7331 | 0xc4, 0xaf, 0xf1, 0xdc, 0x11, 0x44, 0x26, 0xa2, | ||
7332 | 0xaf, 0xf1, 0x85, 0x75, 0x7d, 0x03, 0x61, 0x68, | ||
7333 | 0x4e, 0x78, 0xc6, 0x92, 0x7d, 0x86, 0x7d, 0x77, | ||
7334 | 0xdc, 0x71, 0x72, 0xdb, 0xc6, 0xae, 0xa1, 0xcb, | ||
7335 | 0x70, 0x9a, 0x0b, 0x19, 0xbe, 0x4a, 0x6c, 0x2a, | ||
7336 | 0xe2, 0xba, 0x6c, 0x64, 0x9a, 0x13, 0x28, 0xdf, | ||
7337 | 0x85, 0x75, 0xe6, 0x43, 0xf6, 0x87, 0x08, 0x68, | ||
7338 | 0x6e, 0xba, 0x6e, 0x79, 0x9f, 0x04, 0xbc, 0x23, | ||
7339 | 0x50, 0xf6, 0x33, 0x5c, 0x1f, 0x24, 0x25, 0xbe, | ||
7340 | 0x33, 0x47, 0x80, 0x45, 0x56, 0xa3, 0xa7, 0xd7, | ||
7341 | 0x7a, 0xb1, 0x34, 0x0b, 0x90, 0x3c, 0x9c, 0xad, | ||
7342 | 0x44, 0x5f, 0x9e, 0x0e, 0x9d, 0xd4, 0xbd, 0x93, | ||
7343 | 0x5e, 0xfa, 0x3c, 0xe0, 0xb0, 0xd9, 0xed, 0xf3, | ||
7344 | 0xd6, 0x2e, 0xff, 0x24, 0xd8, 0x71, 0x6c, 0xed, | ||
7345 | 0xaf, 0x55, 0xeb, 0x22, 0xac, 0x93, 0x68, 0x32, | ||
7346 | 0x05, 0x5b, 0x47, 0xdd, 0xc6, 0x4a, 0xcb, 0xc7, | ||
7347 | 0x10, 0xe1, 0x3c, 0x92, 0x1a, 0xf3, 0x23, 0x78, | ||
7348 | 0x2b, 0xa1, 0xd2, 0x80, 0xf4, 0x12, 0xb1, 0x20, | ||
7349 | 0x8f, 0xff, 0x26, 0x35, 0xdd, 0xfb, 0xc7, 0x4e, | ||
7350 | 0x78, 0xf1, 0x2d, 0x50, 0x12, 0x77, 0xa8, 0x60, | ||
7351 | 0x7c, 0x0f, 0xf5, 0x16, 0x2f, 0x63, 0x70, 0x2a, | ||
7352 | 0xc0, 0x96, 0x80, 0x4e, 0x0a, 0xb4, 0x93, 0x35, | ||
7353 | 0x5d, 0x1d, 0x3f, 0x56, 0xf7, 0x2f, 0xbb, 0x90, | ||
7354 | 0x11, 0x16, 0x8f, 0xa2, 0xec, 0x47, 0xbe, 0xac, | ||
7355 | 0x56, 0x01, 0x26, 0x56, 0xb1, 0x8c, 0xb2, 0x10, | ||
7356 | 0xf9, 0x1a, 0xca, 0xf5, 0xd1, 0xb7, 0x39, 0x20, | ||
7357 | 0x63, 0xf1, 0x69, 0x20, 0x4f, 0x13, 0x12, 0x1f, | ||
7358 | 0x5b, 0x65, 0xfc, 0x98, 0xf7, 0xc4, 0x7a, 0xbe, | ||
7359 | 0xf7, 0x26, 0x4d, 0x2b, 0x84, 0x7b, 0x42, 0xad, | ||
7360 | 0xd8, 0x7a, 0x0a, 0xb4, 0xd8, 0x74, 0xbf, 0xc1, | ||
7361 | 0xf0, 0x6e, 0xb4, 0x29, 0xa3, 0xbb, 0xca, 0x46, | ||
7362 | 0x67, 0x70, 0x6a, 0x2d, 0xce, 0x0e, 0xa2, 0x8a, | ||
7363 | 0xa9, 0x87, 0xbf, 0x05, 0xc4, 0xc1, 0x04, 0xa3, | ||
7364 | 0xab, 0xd4, 0x45, 0x43, 0x8c, 0xb6, 0x02, 0xb0, | ||
7365 | 0x41, 0xc8, 0xfc, 0x44, 0x3d, 0x59, 0xaa, 0x2e, | ||
7366 | 0x44, 0x21, 0x2a, 0x8d, 0x88, 0x9d, 0x57, 0xf4, | ||
7367 | 0xa0, 0x02, 0x77, 0xb8, 0xa6, 0xa0, 0xe6, 0x75, | ||
7368 | 0x5c, 0x82, 0x65, 0x3e, 0x03, 0x5c, 0x29, 0x8f, | ||
7369 | 0x38, 0x55, 0xab, 0x33, 0x26, 0xef, 0x9f, 0x43, | ||
7370 | 0x52, 0xfd, 0x68, 0xaf, 0x36, 0xb4, 0xbb, 0x9a, | ||
7371 | 0x58, 0x09, 0x09, 0x1b, 0xc3, 0x65, 0x46, 0x46, | ||
7372 | 0x1d, 0xa7, 0x94, 0x18, 0x23, 0x50, 0x2c, 0xca, | ||
7373 | 0x2c, 0x55, 0x19, 0x97, 0x01, 0x9d, 0x93, 0x3b, | ||
7374 | 0x63, 0x86, 0xf2, 0x03, 0x67, 0x45, 0xd2, 0x72, | ||
7375 | 0x28, 0x52, 0x6c, 0xf4, 0xe3, 0x1c, 0xb5, 0x11, | ||
7376 | 0x13, 0xf1, 0xeb, 0x21, 0xc7, 0xd9, 0x56, 0x82, | ||
7377 | 0x2b, 0x82, 0x39, 0xbd, 0x69, 0x54, 0xed, 0x62, | ||
7378 | 0xc3, 0xe2, 0xde, 0x73, 0xd4, 0x6a, 0x12, 0xae, | ||
7379 | 0x13, 0x21, 0x7f, 0x4b, 0x5b, 0xfc, 0xbf, 0xe8, | ||
7380 | 0x2b, 0xbe, 0x56, 0xba, 0x68, 0x8b, 0x9a, 0xb1, | ||
7381 | 0x6e, 0xfa, 0xbf, 0x7e, 0x5a, 0x4b, 0xf1, 0xac, | ||
7382 | 0x98, 0x65, 0x85, 0xd1, 0x93, 0x53, 0xd3, 0x7b, | ||
7383 | 0x09, 0xdd, 0x4b, 0x10, 0x6d, 0x84, 0xb0, 0x13, | ||
7384 | 0x65, 0xbd, 0xcf, 0x52, 0x09, 0xc4, 0x85, 0xe2, | ||
7385 | 0x84, 0x74, 0x15, 0x65, 0xb7, 0xf7, 0x51, 0xaf, | ||
7386 | 0x55, 0xad, 0xa4, 0xd1, 0x22, 0x54, 0x70, 0x94, | ||
7387 | 0xa0, 0x1c, 0x90, 0x41, 0xfd, 0x99, 0xd7, 0x5a, | ||
7388 | 0x31, 0xef, 0xaa, 0x25, 0xd0, 0x7f, 0x4f, 0xea, | ||
7389 | 0x1d, 0x55, 0x42, 0xe5, 0x49, 0xb0, 0xd0, 0x46, | ||
7390 | 0x62, 0x36, 0x43, 0xb2, 0x82, 0x15, 0x75, 0x50, | ||
7391 | 0xa4, 0x72, 0xeb, 0x54, 0x27, 0x1f, 0x8a, 0xe4, | ||
7392 | 0x7d, 0xe9, 0x66, 0xc5, 0xf1, 0x53, 0xa4, 0xd1, | ||
7393 | 0x0c, 0xeb, 0xb8, 0xf8, 0xbc, 0xd4, 0xe2, 0xe7, | ||
7394 | 0xe1, 0xf8, 0x4b, 0xcb, 0xa9, 0xa1, 0xaf, 0x15, | ||
7395 | 0x83, 0xcb, 0x72, 0xd0, 0x33, 0x79, 0x00, 0x2d, | ||
7396 | 0x9f, 0xd7, 0xf1, 0x2e, 0x1e, 0x10, 0xe4, 0x45, | ||
7397 | 0xc0, 0x75, 0x3a, 0x39, 0xea, 0x68, 0xf7, 0x5d, | ||
7398 | 0x1b, 0x73, 0x8f, 0xe9, 0x8e, 0x0f, 0x72, 0x47, | ||
7399 | 0xae, 0x35, 0x0a, 0x31, 0x7a, 0x14, 0x4d, 0x4a, | ||
7400 | 0x6f, 0x47, 0xf7, 0x7e, 0x91, 0x6e, 0x74, 0x8b, | ||
7401 | 0x26, 0x47, 0xf9, 0xc3, 0xf9, 0xde, 0x70, 0xf5, | ||
7402 | 0x61, 0xab, 0xa9, 0x27, 0x9f, 0x82, 0xe4, 0x9c, | ||
7403 | 0x89, 0x91, 0x3f, 0x2e, 0x6a, 0xfd, 0xb5, 0x49, | ||
7404 | 0xe9, 0xfd, 0x59, 0x14, 0x36, 0x49, 0x40, 0x6d, | ||
7405 | 0x32, 0xd8, 0x85, 0x42, 0xf3, 0xa5, 0xdf, 0x0c, | ||
7406 | 0xa8, 0x27, 0xd7, 0x54, 0xe2, 0x63, 0x2f, 0xf2, | ||
7407 | 0x7e, 0x8b, 0x8b, 0xe7, 0xf1, 0x9a, 0x95, 0x35, | ||
7408 | 0x43, 0xdc, 0x3a, 0xe4, 0xb6, 0xf4, 0xd0, 0xdf, | ||
7409 | 0x9c, 0xcb, 0x94, 0xf3, 0x21, 0xa0, 0x77, 0x50, | ||
7410 | 0xe2, 0xc6, 0xc4, 0xc6, 0x5f, 0x09, 0x64, 0x5b, | ||
7411 | 0x92, 0x90, 0xd8, 0xe1, 0xd1, 0xed, 0x4b, 0x42, | ||
7412 | 0xd7, 0x37, 0xaf, 0x65, 0x3d, 0x11, 0x39, 0xb6, | ||
7413 | 0x24, 0x8a, 0x60, 0xae, 0xd6, 0x1e, 0xbf, 0x0e, | ||
7414 | 0x0d, 0xd7, 0xdc, 0x96, 0x0e, 0x65, 0x75, 0x4e, | ||
7415 | 0x29, 0x06, 0x9d, 0xa4, 0x51, 0x3a, 0x10, 0x63, | ||
7416 | 0x8f, 0x17, 0x07, 0xd5, 0x8e, 0x3c, 0xf4, 0x28, | ||
7417 | 0x00, 0x5a, 0x5b, 0x05, 0x19, 0xd8, 0xc0, 0x6c, | ||
7418 | 0xe5, 0x15, 0xe4, 0x9c, 0x9d, 0x71, 0x9d, 0x5e, | ||
7419 | 0x94, 0x29, 0x1a, 0xa7, 0x80, 0xfa, 0x0e, 0x33, | ||
7420 | 0x03, 0xdd, 0xb7, 0x3e, 0x9a, 0xa9, 0x26, 0x18, | ||
7421 | 0x37, 0xa9, 0x64, 0x08, 0x4d, 0x94, 0x5a, 0x88, | ||
7422 | 0xca, 0x35, 0xce, 0x81, 0x02, 0xe3, 0x1f, 0x1b, | ||
7423 | 0x89, 0x1a, 0x77, 0x85, 0xe3, 0x41, 0x6d, 0x32, | ||
7424 | 0x42, 0x19, 0x23, 0x7d, 0xc8, 0x73, 0xee, 0x25, | ||
7425 | 0x85, 0x0d, 0xf8, 0x31, 0x25, 0x79, 0x1b, 0x6f, | ||
7426 | 0x79, 0x25, 0xd2, 0xd8, 0xd4, 0x23, 0xfd, 0xf7, | ||
7427 | 0x82, 0x36, 0x6a, 0x0c, 0x46, 0x22, 0x15, 0xe9, | ||
7428 | 0xff, 0x72, 0x41, 0x91, 0x91, 0x7d, 0x3a, 0xb7, | ||
7429 | 0xdd, 0x65, 0x99, 0x70, 0xf6, 0x8d, 0x84, 0xf8, | ||
7430 | 0x67, 0x15, 0x20, 0x11, 0xd6, 0xb2, 0x55, 0x7b, | ||
7431 | 0xdb, 0x87, 0xee, 0xef, 0x55, 0x89, 0x2a, 0x59, | ||
7432 | 0x2b, 0x07, 0x8f, 0x43, 0x8a, 0x59, 0x3c, 0x01, | ||
7433 | 0x8b, 0x65, 0x54, 0xa1, 0x66, 0xd5, 0x38, 0xbd, | ||
7434 | 0xc6, 0x30, 0xa9, 0xcc, 0x49, 0xb6, 0xa8, 0x1b, | ||
7435 | 0xb8, 0xc0, 0x0e, 0xe3, 0x45, 0x28, 0xe2, 0xff, | ||
7436 | 0x41, 0x9f, 0x7e, 0x7c, 0xd1, 0xae, 0x9e, 0x25, | ||
7437 | 0x3f, 0x4c, 0x7c, 0x7c, 0xf4, 0xa8, 0x26, 0x4d, | ||
7438 | 0x5c, 0xfd, 0x4b, 0x27, 0x18, 0xf9, 0x61, 0x76, | ||
7439 | 0x48, 0xba, 0x0c, 0x6b, 0xa9, 0x4d, 0xfc, 0xf5, | ||
7440 | 0x3b, 0x35, 0x7e, 0x2f, 0x4a, 0xa9, 0xc2, 0x9a, | ||
7441 | 0xae, 0xab, 0x86, 0x09, 0x89, 0xc9, 0xc2, 0x40, | ||
7442 | 0x39, 0x2c, 0x81, 0xb3, 0xb8, 0x17, 0x67, 0xc2, | ||
7443 | 0x0d, 0x32, 0x4a, 0x3a, 0x67, 0x81, 0xd7, 0x1a, | ||
7444 | 0x34, 0x52, 0xc5, 0xdb, 0x0a, 0xf5, 0x63, 0x39, | ||
7445 | 0xea, 0x1f, 0xe1, 0x7c, 0xa1, 0x9e, 0xc1, 0x35, | ||
7446 | 0xe3, 0xb1, 0x18, 0x45, 0x67, 0xf9, 0x22, 0x38, | ||
7447 | 0x95, 0xd9, 0x34, 0x34, 0x86, 0xc6, 0x41, 0x94, | ||
7448 | 0x15, 0xf9, 0x5b, 0x41, 0xa6, 0x87, 0x8b, 0xf8, | ||
7449 | 0xd5, 0xe1, 0x1b, 0xe2, 0x5b, 0xf3, 0x86, 0x10, | ||
7450 | 0xff, 0xe6, 0xae, 0x69, 0x76, 0xbc, 0x0d, 0xb4, | ||
7451 | 0x09, 0x90, 0x0c, 0xa2, 0x65, 0x0c, 0xad, 0x74, | ||
7452 | 0xf5, 0xd7, 0xff, 0xda, 0xc1, 0xce, 0x85, 0xbe, | ||
7453 | 0x00, 0xa7, 0xff, 0x4d, 0x2f, 0x65, 0xd3, 0x8c, | ||
7454 | 0x86, 0x2d, 0x05, 0xe8, 0xed, 0x3e, 0x6b, 0x8b, | ||
7455 | 0x0f, 0x3d, 0x83, 0x8c, 0xf1, 0x1d, 0x5b, 0x96, | ||
7456 | 0x2e, 0xb1, 0x9c, 0xc2, 0x98, 0xe1, 0x70, 0xb9, | ||
7457 | 0xba, 0x5c, 0x8a, 0x43, 0xd6, 0x34, 0xa7, 0x2d, | ||
7458 | 0xc9, 0x92, 0xae, 0xf2, 0xa5, 0x7b, 0x05, 0x49, | ||
7459 | 0xa7, 0x33, 0x34, 0x86, 0xca, 0xe4, 0x96, 0x23, | ||
7460 | 0x76, 0x5b, 0xf2, 0xc6, 0xf1, 0x51, 0x28, 0x42, | ||
7461 | 0x7b, 0xcc, 0x76, 0x8f, 0xfa, 0xa2, 0xad, 0x31, | ||
7462 | 0xd4, 0xd6, 0x7a, 0x6d, 0x25, 0x25, 0x54, 0xe4, | ||
7463 | 0x3f, 0x50, 0x59, 0xe1, 0x5c, 0x05, 0xb7, 0x27, | ||
7464 | 0x48, 0xbf, 0x07, 0xec, 0x1b, 0x13, 0xbe, 0x2b, | ||
7465 | 0xa1, 0x57, 0x2b, 0xd5, 0xab, 0xd7, 0xd0, 0x4c, | ||
7466 | 0x1e, 0xcb, 0x71, 0x9b, 0xc5, 0x90, 0x85, 0xd3, | ||
7467 | 0xde, 0x59, 0xec, 0x71, 0xeb, 0x89, 0xbb, 0xd0, | ||
7468 | 0x09, 0x50, 0xe1, 0x16, 0x3f, 0xfd, 0x1c, 0x34, | ||
7469 | 0xc3, 0x1c, 0xa1, 0x10, 0x77, 0x53, 0x98, 0xef, | ||
7470 | 0xf2, 0xfd, 0xa5, 0x01, 0x59, 0xc2, 0x9b, 0x26, | ||
7471 | 0xc7, 0x42, 0xd9, 0x49, 0xda, 0x58, 0x2b, 0x6e, | ||
7472 | 0x9f, 0x53, 0x19, 0x76, 0x7e, 0xd9, 0xc9, 0x0e, | ||
7473 | 0x68, 0xc8, 0x7f, 0x51, 0x22, 0x42, 0xef, 0x49, | ||
7474 | 0xa4, 0x55, 0xb6, 0x36, 0xac, 0x09, 0xc7, 0x31, | ||
7475 | 0x88, 0x15, 0x4b, 0x2e, 0x8f, 0x3a, 0x08, 0xf7, | ||
7476 | 0xd8, 0xf7, 0xa8, 0xc5, 0xa9, 0x33, 0xa6, 0x45, | ||
7477 | 0xe4, 0xc4, 0x94, 0x76, 0xf3, 0x0d, 0x8f, 0x7e, | ||
7478 | 0xc8, 0xf6, 0xbc, 0x23, 0x0a, 0xb6, 0x4c, 0xd3, | ||
7479 | 0x6a, 0xcd, 0x36, 0xc2, 0x90, 0x5c, 0x5c, 0x3c, | ||
7480 | 0x65, 0x7b, 0xc2, 0xd6, 0xcc, 0xe6, 0x0d, 0x87, | ||
7481 | 0x73, 0x2e, 0x71, 0x79, 0x16, 0x06, 0x63, 0x28, | ||
7482 | 0x09, 0x15, 0xd8, 0x89, 0x38, 0x38, 0x3d, 0xb5, | ||
7483 | 0x42, 0x1c, 0x08, 0x24, 0xf7, 0x2a, 0xd2, 0x9d, | ||
7484 | 0xc8, 0xca, 0xef, 0xf9, 0x27, 0xd8, 0x07, 0x86, | ||
7485 | 0xf7, 0x43, 0x0b, 0x55, 0x15, 0x3f, 0x9f, 0x83, | ||
7486 | 0xef, 0xdc, 0x49, 0x9d, 0x2a, 0xc1, 0x54, 0x62, | ||
7487 | 0xbd, 0x9b, 0x66, 0x55, 0x9f, 0xb7, 0x12, 0xf3, | ||
7488 | 0x1b, 0x4d, 0x9d, 0x2a, 0x5c, 0xed, 0x87, 0x75, | ||
7489 | 0x87, 0x26, 0xec, 0x61, 0x2c, 0xb4, 0x0f, 0x89, | ||
7490 | 0xb0, 0xfb, 0x2e, 0x68, 0x5d, 0x15, 0xc7, 0x8d, | ||
7491 | 0x2e, 0xc0, 0xd9, 0xec, 0xaf, 0x4f, 0xd2, 0x25, | ||
7492 | 0x29, 0xe8, 0xd2, 0x26, 0x2b, 0x67, 0xe9, 0xfc, | ||
7493 | 0x2b, 0xa8, 0x67, 0x96, 0x12, 0x1f, 0x5b, 0x96, | ||
7494 | 0xc6, 0x14, 0x53, 0xaf, 0x44, 0xea, 0xd6, 0xe2, | ||
7495 | 0x94, 0x98, 0xe4, 0x12, 0x93, 0x4c, 0x92, 0xe0, | ||
7496 | 0x18, 0xa5, 0x8d, 0x2d, 0xe4, 0x71, 0x3c, 0x47, | ||
7497 | 0x4c, 0xf7, 0xe6, 0x47, 0x9e, 0xc0, 0x68, 0xdf, | ||
7498 | 0xd4, 0xf5, 0x5a, 0x74, 0xb1, 0x2b, 0x29, 0x03, | ||
7499 | 0x19, 0x07, 0xaf, 0x90, 0x62, 0x5c, 0x68, 0x98, | ||
7500 | 0x48, 0x16, 0x11, 0x02, 0x9d, 0xee, 0xb4, 0x9b, | ||
7501 | 0xe5, 0x42, 0x7f, 0x08, 0xfd, 0x16, 0x32, 0x0b, | ||
7502 | 0xd0, 0xb3, 0xfa, 0x2b, 0xb7, 0x99, 0xf9, 0x29, | ||
7503 | 0xcd, 0x20, 0x45, 0x9f, 0xb3, 0x1a, 0x5d, 0xa2, | ||
7504 | 0xaf, 0x4d, 0xe0, 0xbd, 0x42, 0x0d, 0xbc, 0x74, | ||
7505 | 0x99, 0x9c, 0x8e, 0x53, 0x1a, 0xb4, 0x3e, 0xbd, | ||
7506 | 0xa2, 0x9a, 0x2d, 0xf7, 0xf8, 0x39, 0x0f, 0x67, | ||
7507 | 0x63, 0xfc, 0x6b, 0xc0, 0xaf, 0xb3, 0x4b, 0x4f, | ||
7508 | 0x55, 0xc4, 0xcf, 0xa7, 0xc8, 0x04, 0x11, 0x3e, | ||
7509 | 0x14, 0x32, 0xbb, 0x1b, 0x38, 0x77, 0xd6, 0x7f, | ||
7510 | 0x54, 0x4c, 0xdf, 0x75, 0xf3, 0x07, 0x2d, 0x33, | ||
7511 | 0x9b, 0xa8, 0x20, 0xe1, 0x7b, 0x12, 0xb5, 0xf3, | ||
7512 | 0xef, 0x2f, 0xce, 0x72, 0xe5, 0x24, 0x60, 0xc1, | ||
7513 | 0x30, 0xe2, 0xab, 0xa1, 0x8e, 0x11, 0x09, 0xa8, | ||
7514 | 0x21, 0x33, 0x44, 0xfe, 0x7f, 0x35, 0x32, 0x93, | ||
7515 | 0x39, 0xa7, 0xad, 0x8b, 0x79, 0x06, 0xb2, 0xcb, | ||
7516 | 0x4e, 0xa9, 0x5f, 0xc7, 0xba, 0x74, 0x29, 0xec, | ||
7517 | 0x93, 0xa0, 0x4e, 0x54, 0x93, 0xc0, 0xbc, 0x55, | ||
7518 | 0x64, 0xf0, 0x48, 0xe5, 0x57, 0x99, 0xee, 0x75, | ||
7519 | 0xd6, 0x79, 0x0f, 0x66, 0xb7, 0xc6, 0x57, 0x76, | ||
7520 | 0xf7, 0xb7, 0xf3, 0x9c, 0xc5, 0x60, 0xe8, 0x7f, | ||
7521 | 0x83, 0x76, 0xd6, 0x0e, 0xaa, 0xe6, 0x90, 0x39, | ||
7522 | 0x1d, 0xa6, 0x32, 0x6a, 0x34, 0xe3, 0x55, 0xf8, | ||
7523 | 0x58, 0xa0, 0x58, 0x7d, 0x33, 0xe0, 0x22, 0x39, | ||
7524 | 0x44, 0x64, 0x87, 0x86, 0x5a, 0x2f, 0xa7, 0x7e, | ||
7525 | 0x0f, 0x38, 0xea, 0xb0, 0x30, 0xcc, 0x61, 0xa5, | ||
7526 | 0x6a, 0x32, 0xae, 0x1e, 0xf7, 0xe9, 0xd0, 0xa9, | ||
7527 | 0x0c, 0x32, 0x4b, 0xb5, 0x49, 0x28, 0xab, 0x85, | ||
7528 | 0x2f, 0x8e, 0x01, 0x36, 0x38, 0x52, 0xd0, 0xba, | ||
7529 | 0xd6, 0x02, 0x78, 0xf8, 0x0e, 0x3e, 0x9c, 0x8b, | ||
7530 | 0x6b, 0x45, 0x99, 0x3f, 0x5c, 0xfe, 0x58, 0xf1, | ||
7531 | 0x5c, 0x94, 0x04, 0xe1, 0xf5, 0x18, 0x6d, 0x51, | ||
7532 | 0xb2, 0x5d, 0x18, 0x20, 0xb6, 0xc2, 0x9a, 0x42, | ||
7533 | 0x1d, 0xb3, 0xab, 0x3c, 0xb6, 0x3a, 0x13, 0x03, | ||
7534 | 0xb2, 0x46, 0x82, 0x4f, 0xfc, 0x64, 0xbc, 0x4f, | ||
7535 | 0xca, 0xfa, 0x9c, 0xc0, 0xd5, 0xa7, 0xbd, 0x11, | ||
7536 | 0xb7, 0xe4, 0x5a, 0xf6, 0x6f, 0x4d, 0x4d, 0x54, | ||
7537 | 0xea, 0xa4, 0x98, 0x66, 0xd4, 0x22, 0x3b, 0xd3, | ||
7538 | 0x8f, 0x34, 0x47, 0xd9, 0x7c, 0xf4, 0x72, 0x3b, | ||
7539 | 0x4d, 0x02, 0x77, 0xf6, 0xd6, 0xdd, 0x08, 0x0a, | ||
7540 | 0x81, 0xe1, 0x86, 0x89, 0x3e, 0x56, 0x10, 0x3c, | ||
7541 | 0xba, 0xd7, 0x81, 0x8c, 0x08, 0xbc, 0x8b, 0xe2, | ||
7542 | 0x53, 0xec, 0xa7, 0x89, 0xee, 0xc8, 0x56, 0xb5, | ||
7543 | 0x36, 0x2c, 0xb2, 0x03, 0xba, 0x99, 0xdd, 0x7c, | ||
7544 | 0x48, 0xa0, 0xb0, 0xbc, 0x91, 0x33, 0xe9, 0xa8, | ||
7545 | 0xcb, 0xcd, 0xcf, 0x59, 0x5f, 0x1f, 0x15, 0xe2, | ||
7546 | 0x56, 0xf5, 0x4e, 0x01, 0x35, 0x27, 0x45, 0x77, | ||
7547 | 0x47, 0xc8, 0xbc, 0xcb, 0x7e, 0x39, 0xc1, 0x97, | ||
7548 | 0x28, 0xd3, 0x84, 0xfc, 0x2c, 0x3e, 0xc8, 0xad, | ||
7549 | 0x9c, 0xf8, 0x8a, 0x61, 0x9c, 0x28, 0xaa, 0xc5, | ||
7550 | 0x99, 0x20, 0x43, 0x85, 0x9d, 0xa5, 0xe2, 0x8b, | ||
7551 | 0xb8, 0xae, 0xeb, 0xd0, 0x32, 0x0d, 0x52, 0x78, | ||
7552 | 0x09, 0x56, 0x3f, 0xc7, 0xd8, 0x7e, 0x26, 0xfc, | ||
7553 | 0x37, 0xfb, 0x6f, 0x04, 0xfc, 0xfa, 0x92, 0x10, | ||
7554 | 0xac, 0xf8, 0x3e, 0x21, 0xdc, 0x8c, 0x21, 0x16, | ||
7555 | 0x7d, 0x67, 0x6e, 0xf6, 0xcd, 0xda, 0xb6, 0x98, | ||
7556 | 0x23, 0xab, 0x23, 0x3c, 0xb2, 0x10, 0xa0, 0x53, | ||
7557 | 0x5a, 0x56, 0x9f, 0xc5, 0xd0, 0xff, 0xbb, 0xe4, | ||
7558 | 0x98, 0x3c, 0x69, 0x1e, 0xdb, 0x38, 0x8f, 0x7e, | ||
7559 | 0x0f, 0xd2, 0x98, 0x88, 0x81, 0x8b, 0x45, 0x67, | ||
7560 | 0xea, 0x33, 0xf1, 0xeb, 0xe9, 0x97, 0x55, 0x2e, | ||
7561 | 0xd9, 0xaa, 0xeb, 0x5a, 0xec, 0xda, 0xe1, 0x68, | ||
7562 | 0xa8, 0x9d, 0x3c, 0x84, 0x7c, 0x05, 0x3d, 0x62, | ||
7563 | 0x87, 0x8f, 0x03, 0x21, 0x28, 0x95, 0x0c, 0x89, | ||
7564 | 0x25, 0x22, 0x4a, 0xb0, 0x93, 0xa9, 0x50, 0xa2, | ||
7565 | 0x2f, 0x57, 0x6e, 0x18, 0x42, 0x19, 0x54, 0x0c, | ||
7566 | 0x55, 0x67, 0xc6, 0x11, 0x49, 0xf4, 0x5c, 0xd2, | ||
7567 | 0xe9, 0x3d, 0xdd, 0x8b, 0x48, 0x71, 0x21, 0x00, | ||
7568 | 0xc3, 0x9a, 0x6c, 0x85, 0x74, 0x28, 0x83, 0x4a, | ||
7569 | 0x1b, 0x31, 0x05, 0xe1, 0x06, 0x92, 0xe7, 0xda, | ||
7570 | 0x85, 0x73, 0x78, 0x45, 0x20, 0x7f, 0xae, 0x13, | ||
7571 | 0x7c, 0x33, 0x06, 0x22, 0xf4, 0x83, 0xf9, 0x35, | ||
7572 | 0x3f, 0x6c, 0x71, 0xa8, 0x4e, 0x48, 0xbe, 0x9b, | ||
7573 | 0xce, 0x8a, 0xba, 0xda, 0xbe, 0x28, 0x08, 0xf7, | ||
7574 | 0xe2, 0x14, 0x8c, 0x71, 0xea, 0x72, 0xf9, 0x33, | ||
7575 | 0xf2, 0x88, 0x3f, 0xd7, 0xbb, 0x69, 0x6c, 0x29, | ||
7576 | 0x19, 0xdc, 0x84, 0xce, 0x1f, 0x12, 0x4f, 0xc8, | ||
7577 | 0xaf, 0xa5, 0x04, 0xba, 0x5a, 0xab, 0xb0, 0xd9, | ||
7578 | 0x14, 0x1f, 0x6c, 0x68, 0x98, 0x39, 0x89, 0x7a, | ||
7579 | 0xd9, 0xd8, 0x2f, 0xdf, 0xa8, 0x47, 0x4a, 0x25, | ||
7580 | 0xe2, 0xfb, 0x33, 0xf4, 0x59, 0x78, 0xe1, 0x68, | ||
7581 | 0x85, 0xcf, 0xfe, 0x59, 0x20, 0xd4, 0x05, 0x1d, | ||
7582 | 0x80, 0x99, 0xae, 0xbc, 0xca, 0xae, 0x0f, 0x2f, | ||
7583 | 0x65, 0x43, 0x34, 0x8e, 0x7e, 0xac, 0xd3, 0x93, | ||
7584 | 0x2f, 0xac, 0x6d, 0x14, 0x3d, 0x02, 0x07, 0x70, | ||
7585 | 0x9d, 0xa4, 0xf3, 0x1b, 0x5c, 0x36, 0xfc, 0x01, | ||
7586 | 0x73, 0x34, 0x85, 0x0c, 0x6c, 0xd6, 0xf1, 0xbd, | ||
7587 | 0x3f, 0xdf, 0xee, 0xf5, 0xd9, 0xba, 0x56, 0xef, | ||
7588 | 0xf4, 0x9b, 0x6b, 0xee, 0x9f, 0x5a, 0x78, 0x6d, | ||
7589 | 0x32, 0x19, 0xf4, 0xf7, 0xf8, 0x4c, 0x69, 0x0b, | ||
7590 | 0x4b, 0xbc, 0xbb, 0xb7, 0xf2, 0x85, 0xaf, 0x70, | ||
7591 | 0x75, 0x24, 0x6c, 0x54, 0xa7, 0x0e, 0x4d, 0x1d, | ||
7592 | 0x01, 0xbf, 0x08, 0xac, 0xcf, 0x7f, 0x2c, 0xe3, | ||
7593 | 0x14, 0x89, 0x5e, 0x70, 0x5a, 0x99, 0x92, 0xcd, | ||
7594 | 0x01, 0x84, 0xc8, 0xd2, 0xab, 0xe5, 0x4f, 0x58, | ||
7595 | 0xe7, 0x0f, 0x2f, 0x0e, 0xff, 0x68, 0xea, 0xfd, | ||
7596 | 0x15, 0xb3, 0x17, 0xe6, 0xb0, 0xe7, 0x85, 0xd8, | ||
7597 | 0x23, 0x2e, 0x05, 0xc7, 0xc9, 0xc4, 0x46, 0x1f, | ||
7598 | 0xe1, 0x9e, 0x49, 0x20, 0x23, 0x24, 0x4d, 0x7e, | ||
7599 | 0x29, 0x65, 0xff, 0xf4, 0xb6, 0xfd, 0x1a, 0x85, | ||
7600 | 0xc4, 0x16, 0xec, 0xfc, 0xea, 0x7b, 0xd6, 0x2c, | ||
7601 | 0x43, 0xf8, 0xb7, 0xbf, 0x79, 0xc0, 0x85, 0xcd, | ||
7602 | 0xef, 0xe1, 0x98, 0xd3, 0xa5, 0xf7, 0x90, 0x8c, | ||
7603 | 0xe9, 0x7f, 0x80, 0x6b, 0xd2, 0xac, 0x4c, 0x30, | ||
7604 | 0xa7, 0xc6, 0x61, 0x6c, 0xd2, 0xf9, 0x2c, 0xff, | ||
7605 | 0x30, 0xbc, 0x22, 0x81, 0x7d, 0x93, 0x12, 0xe4, | ||
7606 | 0x0a, 0xcd, 0xaf, 0xdd, 0xe8, 0xab, 0x0a, 0x1e, | ||
7607 | 0x13, 0xa4, 0x27, 0xc3, 0x5f, 0xf7, 0x4b, 0xbb, | ||
7608 | 0x37, 0x09, 0x4b, 0x91, 0x6f, 0x92, 0x4f, 0xaf, | ||
7609 | 0x52, 0xee, 0xdf, 0xef, 0x09, 0x6f, 0xf7, 0x5c, | ||
7610 | 0x6e, 0x12, 0x17, 0x72, 0x63, 0x57, 0xc7, 0xba, | ||
7611 | 0x3b, 0x6b, 0x38, 0x32, 0x73, 0x1b, 0x9c, 0x80, | ||
7612 | 0xc1, 0x7a, 0xc6, 0xcf, 0xcd, 0x35, 0xc0, 0x6b, | ||
7613 | 0x31, 0x1a, 0x6b, 0xe9, 0xd8, 0x2c, 0x29, 0x3f, | ||
7614 | 0x96, 0xfb, 0xb6, 0xcd, 0x13, 0x91, 0x3b, 0xc2, | ||
7615 | 0xd2, 0xa3, 0x31, 0x8d, 0xa4, 0xcd, 0x57, 0xcd, | ||
7616 | 0x13, 0x3d, 0x64, 0xfd, 0x06, 0xce, 0xe6, 0xdc, | ||
7617 | 0x0c, 0x24, 0x43, 0x31, 0x40, 0x57, 0xf1, 0x72, | ||
7618 | 0x17, 0xe3, 0x3a, 0x63, 0x6d, 0x35, 0xcf, 0x5d, | ||
7619 | 0x97, 0x40, 0x59, 0xdd, 0xf7, 0x3c, 0x02, 0xf7, | ||
7620 | 0x1c, 0x7e, 0x05, 0xbb, 0xa9, 0x0d, 0x01, 0xb1, | ||
7621 | 0x8e, 0xc0, 0x30, 0xa9, 0x53, 0x24, 0xc9, 0x89, | ||
7622 | 0x84, 0x6d, 0xaa, 0xd0, 0xcd, 0x91, 0xc2, 0x4d, | ||
7623 | 0x91, 0xb0, 0x89, 0xe2, 0xbf, 0x83, 0x44, 0xaa, | ||
7624 | 0x28, 0x72, 0x23, 0xa0, 0xc2, 0xad, 0xad, 0x1c, | ||
7625 | 0xfc, 0x3f, 0x09, 0x7a, 0x0b, 0xdc, 0xc5, 0x1b, | ||
7626 | 0x87, 0x13, 0xc6, 0x5b, 0x59, 0x8d, 0xf2, 0xc8, | ||
7627 | 0xaf, 0xdf, 0x11, 0x95, | ||
7628 | }, | ||
7629 | .rlen = 4100, | ||
7630 | }, | ||
7631 | }; | ||
7632 | |||
4320 | /* | 7633 | /* |
4321 | * Compression stuff. | 7634 | * Compression stuff. |
4322 | */ | 7635 | */ |
@@ -4408,6 +7721,88 @@ static struct comp_testvec deflate_decomp_tv_template[] = { | |||
4408 | }; | 7721 | }; |
4409 | 7722 | ||
4410 | /* | 7723 | /* |
7724 | * LZO test vectors (null-terminated strings). | ||
7725 | */ | ||
7726 | #define LZO_COMP_TEST_VECTORS 2 | ||
7727 | #define LZO_DECOMP_TEST_VECTORS 2 | ||
7728 | |||
7729 | static struct comp_testvec lzo_comp_tv_template[] = { | ||
7730 | { | ||
7731 | .inlen = 70, | ||
7732 | .outlen = 46, | ||
7733 | .input = "Join us now and share the software " | ||
7734 | "Join us now and share the software ", | ||
7735 | .output = { 0x00, 0x0d, 0x4a, 0x6f, 0x69, 0x6e, 0x20, 0x75, | ||
7736 | 0x73, 0x20, 0x6e, 0x6f, 0x77, 0x20, 0x61, 0x6e, | ||
7737 | 0x64, 0x20, 0x73, 0x68, 0x61, 0x72, 0x65, 0x20, | ||
7738 | 0x74, 0x68, 0x65, 0x20, 0x73, 0x6f, 0x66, 0x74, | ||
7739 | 0x77, 0x70, 0x01, 0x01, 0x4a, 0x6f, 0x69, 0x6e, | ||
7740 | 0x3d, 0x88, 0x00, 0x11, 0x00, 0x00 }, | ||
7741 | }, { | ||
7742 | .inlen = 159, | ||
7743 | .outlen = 133, | ||
7744 | .input = "This document describes a compression method based on the LZO " | ||
7745 | "compression algorithm. This document defines the application of " | ||
7746 | "the LZO algorithm used in UBIFS.", | ||
7747 | .output = { 0x00, 0x2b, 0x54, 0x68, 0x69, 0x73, 0x20, 0x64, | ||
7748 | 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, | ||
7749 | 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, | ||
7750 | 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, | ||
7751 | 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, | ||
7752 | 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, 0x62, | ||
7753 | 0x61, 0x73, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, | ||
7754 | 0x74, 0x68, 0x65, 0x20, 0x4c, 0x5a, 0x4f, 0x2b, | ||
7755 | 0x8c, 0x00, 0x0d, 0x61, 0x6c, 0x67, 0x6f, 0x72, | ||
7756 | 0x69, 0x74, 0x68, 0x6d, 0x2e, 0x20, 0x20, 0x54, | ||
7757 | 0x68, 0x69, 0x73, 0x2a, 0x54, 0x01, 0x02, 0x66, | ||
7758 | 0x69, 0x6e, 0x65, 0x73, 0x94, 0x06, 0x05, 0x61, | ||
7759 | 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x76, | ||
7760 | 0x0a, 0x6f, 0x66, 0x88, 0x02, 0x60, 0x09, 0x27, | ||
7761 | 0xf0, 0x00, 0x0c, 0x20, 0x75, 0x73, 0x65, 0x64, | ||
7762 | 0x20, 0x69, 0x6e, 0x20, 0x55, 0x42, 0x49, 0x46, | ||
7763 | 0x53, 0x2e, 0x11, 0x00, 0x00 }, | ||
7764 | }, | ||
7765 | }; | ||
7766 | |||
7767 | static struct comp_testvec lzo_decomp_tv_template[] = { | ||
7768 | { | ||
7769 | .inlen = 133, | ||
7770 | .outlen = 159, | ||
7771 | .input = { 0x00, 0x2b, 0x54, 0x68, 0x69, 0x73, 0x20, 0x64, | ||
7772 | 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, | ||
7773 | 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, | ||
7774 | 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, | ||
7775 | 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, | ||
7776 | 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, 0x62, | ||
7777 | 0x61, 0x73, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, | ||
7778 | 0x74, 0x68, 0x65, 0x20, 0x4c, 0x5a, 0x4f, 0x2b, | ||
7779 | 0x8c, 0x00, 0x0d, 0x61, 0x6c, 0x67, 0x6f, 0x72, | ||
7780 | 0x69, 0x74, 0x68, 0x6d, 0x2e, 0x20, 0x20, 0x54, | ||
7781 | 0x68, 0x69, 0x73, 0x2a, 0x54, 0x01, 0x02, 0x66, | ||
7782 | 0x69, 0x6e, 0x65, 0x73, 0x94, 0x06, 0x05, 0x61, | ||
7783 | 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x76, | ||
7784 | 0x0a, 0x6f, 0x66, 0x88, 0x02, 0x60, 0x09, 0x27, | ||
7785 | 0xf0, 0x00, 0x0c, 0x20, 0x75, 0x73, 0x65, 0x64, | ||
7786 | 0x20, 0x69, 0x6e, 0x20, 0x55, 0x42, 0x49, 0x46, | ||
7787 | 0x53, 0x2e, 0x11, 0x00, 0x00 }, | ||
7788 | .output = "This document describes a compression method based on the LZO " | ||
7789 | "compression algorithm. This document defines the application of " | ||
7790 | "the LZO algorithm used in UBIFS.", | ||
7791 | }, { | ||
7792 | .inlen = 46, | ||
7793 | .outlen = 70, | ||
7794 | .input = { 0x00, 0x0d, 0x4a, 0x6f, 0x69, 0x6e, 0x20, 0x75, | ||
7795 | 0x73, 0x20, 0x6e, 0x6f, 0x77, 0x20, 0x61, 0x6e, | ||
7796 | 0x64, 0x20, 0x73, 0x68, 0x61, 0x72, 0x65, 0x20, | ||
7797 | 0x74, 0x68, 0x65, 0x20, 0x73, 0x6f, 0x66, 0x74, | ||
7798 | 0x77, 0x70, 0x01, 0x01, 0x4a, 0x6f, 0x69, 0x6e, | ||
7799 | 0x3d, 0x88, 0x00, 0x11, 0x00, 0x00 }, | ||
7800 | .output = "Join us now and share the software " | ||
7801 | "Join us now and share the software ", | ||
7802 | }, | ||
7803 | }; | ||
7804 | |||
7805 | /* | ||
4411 | * Michael MIC test vectors from IEEE 802.11i | 7806 | * Michael MIC test vectors from IEEE 802.11i |
4412 | */ | 7807 | */ |
4413 | #define MICHAEL_MIC_TEST_VECTORS 6 | 7808 | #define MICHAEL_MIC_TEST_VECTORS 6 |
@@ -4812,4 +8207,20 @@ static struct cipher_speed camellia_speed_template[] = { | |||
4812 | { .klen = 0, .blen = 0, } | 8207 | { .klen = 0, .blen = 0, } |
4813 | }; | 8208 | }; |
4814 | 8209 | ||
8210 | static struct cipher_speed salsa20_speed_template[] = { | ||
8211 | { .klen = 16, .blen = 16, }, | ||
8212 | { .klen = 16, .blen = 64, }, | ||
8213 | { .klen = 16, .blen = 256, }, | ||
8214 | { .klen = 16, .blen = 1024, }, | ||
8215 | { .klen = 16, .blen = 8192, }, | ||
8216 | { .klen = 32, .blen = 16, }, | ||
8217 | { .klen = 32, .blen = 64, }, | ||
8218 | { .klen = 32, .blen = 256, }, | ||
8219 | { .klen = 32, .blen = 1024, }, | ||
8220 | { .klen = 32, .blen = 8192, }, | ||
8221 | |||
8222 | /* End marker */ | ||
8223 | { .klen = 0, .blen = 0, } | ||
8224 | }; | ||
8225 | |||
4815 | #endif /* _CRYPTO_TCRYPT_H */ | 8226 | #endif /* _CRYPTO_TCRYPT_H */ |
diff --git a/crypto/twofish_common.c b/crypto/twofish_common.c index b4b9c0c3f4ae..0af216c75d7e 100644 --- a/crypto/twofish_common.c +++ b/crypto/twofish_common.c | |||
@@ -655,84 +655,48 @@ int twofish_setkey(struct crypto_tfm *tfm, const u8 *key, unsigned int key_len) | |||
655 | CALC_SB256_2( i, calc_sb_tbl[j], calc_sb_tbl[k] ); | 655 | CALC_SB256_2( i, calc_sb_tbl[j], calc_sb_tbl[k] ); |
656 | } | 656 | } |
657 | 657 | ||
658 | /* Calculate whitening and round subkeys. The constants are | 658 | /* CALC_K256/CALC_K192/CALC_K loops were unrolled. |
659 | * indices of subkeys, preprocessed through q0 and q1. */ | 659 | * Unrolling produced x2.5 more code (+18k on i386), |
660 | CALC_K256 (w, 0, 0xA9, 0x75, 0x67, 0xF3); | 660 | * and speeded up key setup by 7%: |
661 | CALC_K256 (w, 2, 0xB3, 0xC6, 0xE8, 0xF4); | 661 | * unrolled: twofish_setkey/sec: 41128 |
662 | CALC_K256 (w, 4, 0x04, 0xDB, 0xFD, 0x7B); | 662 | * loop: twofish_setkey/sec: 38148 |
663 | CALC_K256 (w, 6, 0xA3, 0xFB, 0x76, 0xC8); | 663 | * CALC_K256: ~100 insns each |
664 | CALC_K256 (k, 0, 0x9A, 0x4A, 0x92, 0xD3); | 664 | * CALC_K192: ~90 insns |
665 | CALC_K256 (k, 2, 0x80, 0xE6, 0x78, 0x6B); | 665 | * CALC_K: ~70 insns |
666 | CALC_K256 (k, 4, 0xE4, 0x45, 0xDD, 0x7D); | 666 | */ |
667 | CALC_K256 (k, 6, 0xD1, 0xE8, 0x38, 0x4B); | 667 | /* Calculate whitening and round subkeys */ |
668 | CALC_K256 (k, 8, 0x0D, 0xD6, 0xC6, 0x32); | 668 | for ( i = 0; i < 8; i += 2 ) { |
669 | CALC_K256 (k, 10, 0x35, 0xD8, 0x98, 0xFD); | 669 | CALC_K256 (w, i, q0[i], q1[i], q0[i+1], q1[i+1]); |
670 | CALC_K256 (k, 12, 0x18, 0x37, 0xF7, 0x71); | 670 | } |
671 | CALC_K256 (k, 14, 0xEC, 0xF1, 0x6C, 0xE1); | 671 | for ( i = 0; i < 32; i += 2 ) { |
672 | CALC_K256 (k, 16, 0x43, 0x30, 0x75, 0x0F); | 672 | CALC_K256 (k, i, q0[i+8], q1[i+8], q0[i+9], q1[i+9]); |
673 | CALC_K256 (k, 18, 0x37, 0xF8, 0x26, 0x1B); | 673 | } |
674 | CALC_K256 (k, 20, 0xFA, 0x87, 0x13, 0xFA); | ||
675 | CALC_K256 (k, 22, 0x94, 0x06, 0x48, 0x3F); | ||
676 | CALC_K256 (k, 24, 0xF2, 0x5E, 0xD0, 0xBA); | ||
677 | CALC_K256 (k, 26, 0x8B, 0xAE, 0x30, 0x5B); | ||
678 | CALC_K256 (k, 28, 0x84, 0x8A, 0x54, 0x00); | ||
679 | CALC_K256 (k, 30, 0xDF, 0xBC, 0x23, 0x9D); | ||
680 | } else if (key_len == 24) { /* 192-bit key */ | 674 | } else if (key_len == 24) { /* 192-bit key */ |
681 | /* Compute the S-boxes. */ | 675 | /* Compute the S-boxes. */ |
682 | for ( i = j = 0, k = 1; i < 256; i++, j += 2, k += 2 ) { | 676 | for ( i = j = 0, k = 1; i < 256; i++, j += 2, k += 2 ) { |
683 | CALC_SB192_2( i, calc_sb_tbl[j], calc_sb_tbl[k] ); | 677 | CALC_SB192_2( i, calc_sb_tbl[j], calc_sb_tbl[k] ); |
684 | } | 678 | } |
685 | 679 | ||
686 | /* Calculate whitening and round subkeys. The constants are | 680 | /* Calculate whitening and round subkeys */ |
687 | * indices of subkeys, preprocessed through q0 and q1. */ | 681 | for ( i = 0; i < 8; i += 2 ) { |
688 | CALC_K192 (w, 0, 0xA9, 0x75, 0x67, 0xF3); | 682 | CALC_K192 (w, i, q0[i], q1[i], q0[i+1], q1[i+1]); |
689 | CALC_K192 (w, 2, 0xB3, 0xC6, 0xE8, 0xF4); | 683 | } |
690 | CALC_K192 (w, 4, 0x04, 0xDB, 0xFD, 0x7B); | 684 | for ( i = 0; i < 32; i += 2 ) { |
691 | CALC_K192 (w, 6, 0xA3, 0xFB, 0x76, 0xC8); | 685 | CALC_K192 (k, i, q0[i+8], q1[i+8], q0[i+9], q1[i+9]); |
692 | CALC_K192 (k, 0, 0x9A, 0x4A, 0x92, 0xD3); | 686 | } |
693 | CALC_K192 (k, 2, 0x80, 0xE6, 0x78, 0x6B); | ||
694 | CALC_K192 (k, 4, 0xE4, 0x45, 0xDD, 0x7D); | ||
695 | CALC_K192 (k, 6, 0xD1, 0xE8, 0x38, 0x4B); | ||
696 | CALC_K192 (k, 8, 0x0D, 0xD6, 0xC6, 0x32); | ||
697 | CALC_K192 (k, 10, 0x35, 0xD8, 0x98, 0xFD); | ||
698 | CALC_K192 (k, 12, 0x18, 0x37, 0xF7, 0x71); | ||
699 | CALC_K192 (k, 14, 0xEC, 0xF1, 0x6C, 0xE1); | ||
700 | CALC_K192 (k, 16, 0x43, 0x30, 0x75, 0x0F); | ||
701 | CALC_K192 (k, 18, 0x37, 0xF8, 0x26, 0x1B); | ||
702 | CALC_K192 (k, 20, 0xFA, 0x87, 0x13, 0xFA); | ||
703 | CALC_K192 (k, 22, 0x94, 0x06, 0x48, 0x3F); | ||
704 | CALC_K192 (k, 24, 0xF2, 0x5E, 0xD0, 0xBA); | ||
705 | CALC_K192 (k, 26, 0x8B, 0xAE, 0x30, 0x5B); | ||
706 | CALC_K192 (k, 28, 0x84, 0x8A, 0x54, 0x00); | ||
707 | CALC_K192 (k, 30, 0xDF, 0xBC, 0x23, 0x9D); | ||
708 | } else { /* 128-bit key */ | 687 | } else { /* 128-bit key */ |
709 | /* Compute the S-boxes. */ | 688 | /* Compute the S-boxes. */ |
710 | for ( i = j = 0, k = 1; i < 256; i++, j += 2, k += 2 ) { | 689 | for ( i = j = 0, k = 1; i < 256; i++, j += 2, k += 2 ) { |
711 | CALC_SB_2( i, calc_sb_tbl[j], calc_sb_tbl[k] ); | 690 | CALC_SB_2( i, calc_sb_tbl[j], calc_sb_tbl[k] ); |
712 | } | 691 | } |
713 | 692 | ||
714 | /* Calculate whitening and round subkeys. The constants are | 693 | /* Calculate whitening and round subkeys */ |
715 | * indices of subkeys, preprocessed through q0 and q1. */ | 694 | for ( i = 0; i < 8; i += 2 ) { |
716 | CALC_K (w, 0, 0xA9, 0x75, 0x67, 0xF3); | 695 | CALC_K (w, i, q0[i], q1[i], q0[i+1], q1[i+1]); |
717 | CALC_K (w, 2, 0xB3, 0xC6, 0xE8, 0xF4); | 696 | } |
718 | CALC_K (w, 4, 0x04, 0xDB, 0xFD, 0x7B); | 697 | for ( i = 0; i < 32; i += 2 ) { |
719 | CALC_K (w, 6, 0xA3, 0xFB, 0x76, 0xC8); | 698 | CALC_K (k, i, q0[i+8], q1[i+8], q0[i+9], q1[i+9]); |
720 | CALC_K (k, 0, 0x9A, 0x4A, 0x92, 0xD3); | 699 | } |
721 | CALC_K (k, 2, 0x80, 0xE6, 0x78, 0x6B); | ||
722 | CALC_K (k, 4, 0xE4, 0x45, 0xDD, 0x7D); | ||
723 | CALC_K (k, 6, 0xD1, 0xE8, 0x38, 0x4B); | ||
724 | CALC_K (k, 8, 0x0D, 0xD6, 0xC6, 0x32); | ||
725 | CALC_K (k, 10, 0x35, 0xD8, 0x98, 0xFD); | ||
726 | CALC_K (k, 12, 0x18, 0x37, 0xF7, 0x71); | ||
727 | CALC_K (k, 14, 0xEC, 0xF1, 0x6C, 0xE1); | ||
728 | CALC_K (k, 16, 0x43, 0x30, 0x75, 0x0F); | ||
729 | CALC_K (k, 18, 0x37, 0xF8, 0x26, 0x1B); | ||
730 | CALC_K (k, 20, 0xFA, 0x87, 0x13, 0xFA); | ||
731 | CALC_K (k, 22, 0x94, 0x06, 0x48, 0x3F); | ||
732 | CALC_K (k, 24, 0xF2, 0x5E, 0xD0, 0xBA); | ||
733 | CALC_K (k, 26, 0x8B, 0xAE, 0x30, 0x5B); | ||
734 | CALC_K (k, 28, 0x84, 0x8A, 0x54, 0x00); | ||
735 | CALC_K (k, 30, 0xDF, 0xBC, 0x23, 0x9D); | ||
736 | } | 700 | } |
737 | 701 | ||
738 | return 0; | 702 | return 0; |
diff --git a/crypto/xcbc.c b/crypto/xcbc.c index ac68f3b62fde..a82959df678c 100644 --- a/crypto/xcbc.c +++ b/crypto/xcbc.c | |||
@@ -19,6 +19,7 @@ | |||
19 | * Kazunori Miyazawa <miyazawa@linux-ipv6.org> | 19 | * Kazunori Miyazawa <miyazawa@linux-ipv6.org> |
20 | */ | 20 | */ |
21 | 21 | ||
22 | #include <crypto/scatterwalk.h> | ||
22 | #include <linux/crypto.h> | 23 | #include <linux/crypto.h> |
23 | #include <linux/err.h> | 24 | #include <linux/err.h> |
24 | #include <linux/hardirq.h> | 25 | #include <linux/hardirq.h> |
@@ -27,7 +28,6 @@ | |||
27 | #include <linux/rtnetlink.h> | 28 | #include <linux/rtnetlink.h> |
28 | #include <linux/slab.h> | 29 | #include <linux/slab.h> |
29 | #include <linux/scatterlist.h> | 30 | #include <linux/scatterlist.h> |
30 | #include "internal.h" | ||
31 | 31 | ||
32 | static u_int32_t ks[12] = {0x01010101, 0x01010101, 0x01010101, 0x01010101, | 32 | static u_int32_t ks[12] = {0x01010101, 0x01010101, 0x01010101, 0x01010101, |
33 | 0x02020202, 0x02020202, 0x02020202, 0x02020202, | 33 | 0x02020202, 0x02020202, 0x02020202, 0x02020202, |
@@ -307,7 +307,8 @@ static struct crypto_instance *xcbc_alloc(struct rtattr **tb) | |||
307 | case 16: | 307 | case 16: |
308 | break; | 308 | break; |
309 | default: | 309 | default: |
310 | return ERR_PTR(PTR_ERR(alg)); | 310 | inst = ERR_PTR(-EINVAL); |
311 | goto out_put_alg; | ||
311 | } | 312 | } |
312 | 313 | ||
313 | inst = crypto_alloc_instance("xcbc", alg); | 314 | inst = crypto_alloc_instance("xcbc", alg); |
@@ -320,10 +321,7 @@ static struct crypto_instance *xcbc_alloc(struct rtattr **tb) | |||
320 | inst->alg.cra_alignmask = alg->cra_alignmask; | 321 | inst->alg.cra_alignmask = alg->cra_alignmask; |
321 | inst->alg.cra_type = &crypto_hash_type; | 322 | inst->alg.cra_type = &crypto_hash_type; |
322 | 323 | ||
323 | inst->alg.cra_hash.digestsize = | 324 | inst->alg.cra_hash.digestsize = alg->cra_blocksize; |
324 | (alg->cra_flags & CRYPTO_ALG_TYPE_MASK) == | ||
325 | CRYPTO_ALG_TYPE_HASH ? alg->cra_hash.digestsize : | ||
326 | alg->cra_blocksize; | ||
327 | inst->alg.cra_ctxsize = sizeof(struct crypto_xcbc_ctx) + | 325 | inst->alg.cra_ctxsize = sizeof(struct crypto_xcbc_ctx) + |
328 | ALIGN(inst->alg.cra_blocksize * 3, sizeof(void *)); | 326 | ALIGN(inst->alg.cra_blocksize * 3, sizeof(void *)); |
329 | inst->alg.cra_init = xcbc_init_tfm; | 327 | inst->alg.cra_init = xcbc_init_tfm; |
diff --git a/drivers/char/hw_random/amd-rng.c b/drivers/char/hw_random/amd-rng.c index 556fd81fa815..c422e870dc52 100644 --- a/drivers/char/hw_random/amd-rng.c +++ b/drivers/char/hw_random/amd-rng.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <linux/kernel.h> | 28 | #include <linux/kernel.h> |
29 | #include <linux/pci.h> | 29 | #include <linux/pci.h> |
30 | #include <linux/hw_random.h> | 30 | #include <linux/hw_random.h> |
31 | #include <linux/delay.h> | ||
31 | #include <asm/io.h> | 32 | #include <asm/io.h> |
32 | 33 | ||
33 | 34 | ||
@@ -52,11 +53,18 @@ MODULE_DEVICE_TABLE(pci, pci_tbl); | |||
52 | static struct pci_dev *amd_pdev; | 53 | static struct pci_dev *amd_pdev; |
53 | 54 | ||
54 | 55 | ||
55 | static int amd_rng_data_present(struct hwrng *rng) | 56 | static int amd_rng_data_present(struct hwrng *rng, int wait) |
56 | { | 57 | { |
57 | u32 pmbase = (u32)rng->priv; | 58 | u32 pmbase = (u32)rng->priv; |
59 | int data, i; | ||
58 | 60 | ||
59 | return !!(inl(pmbase + 0xF4) & 1); | 61 | for (i = 0; i < 20; i++) { |
62 | data = !!(inl(pmbase + 0xF4) & 1); | ||
63 | if (data || !wait) | ||
64 | break; | ||
65 | udelay(10); | ||
66 | } | ||
67 | return data; | ||
60 | } | 68 | } |
61 | 69 | ||
62 | static int amd_rng_data_read(struct hwrng *rng, u32 *data) | 70 | static int amd_rng_data_read(struct hwrng *rng, u32 *data) |
diff --git a/drivers/char/hw_random/core.c b/drivers/char/hw_random/core.c index 26a860adcb38..0118b9817a95 100644 --- a/drivers/char/hw_random/core.c +++ b/drivers/char/hw_random/core.c | |||
@@ -66,11 +66,11 @@ static inline void hwrng_cleanup(struct hwrng *rng) | |||
66 | rng->cleanup(rng); | 66 | rng->cleanup(rng); |
67 | } | 67 | } |
68 | 68 | ||
69 | static inline int hwrng_data_present(struct hwrng *rng) | 69 | static inline int hwrng_data_present(struct hwrng *rng, int wait) |
70 | { | 70 | { |
71 | if (!rng->data_present) | 71 | if (!rng->data_present) |
72 | return 1; | 72 | return 1; |
73 | return rng->data_present(rng); | 73 | return rng->data_present(rng, wait); |
74 | } | 74 | } |
75 | 75 | ||
76 | static inline int hwrng_data_read(struct hwrng *rng, u32 *data) | 76 | static inline int hwrng_data_read(struct hwrng *rng, u32 *data) |
@@ -94,8 +94,7 @@ static ssize_t rng_dev_read(struct file *filp, char __user *buf, | |||
94 | { | 94 | { |
95 | u32 data; | 95 | u32 data; |
96 | ssize_t ret = 0; | 96 | ssize_t ret = 0; |
97 | int i, err = 0; | 97 | int err = 0; |
98 | int data_present; | ||
99 | int bytes_read; | 98 | int bytes_read; |
100 | 99 | ||
101 | while (size) { | 100 | while (size) { |
@@ -107,21 +106,10 @@ static ssize_t rng_dev_read(struct file *filp, char __user *buf, | |||
107 | err = -ENODEV; | 106 | err = -ENODEV; |
108 | goto out; | 107 | goto out; |
109 | } | 108 | } |
110 | if (filp->f_flags & O_NONBLOCK) { | 109 | |
111 | data_present = hwrng_data_present(current_rng); | ||
112 | } else { | ||
113 | /* Some RNG require some time between data_reads to gather | ||
114 | * new entropy. Poll it. | ||
115 | */ | ||
116 | for (i = 0; i < 20; i++) { | ||
117 | data_present = hwrng_data_present(current_rng); | ||
118 | if (data_present) | ||
119 | break; | ||
120 | udelay(10); | ||
121 | } | ||
122 | } | ||
123 | bytes_read = 0; | 110 | bytes_read = 0; |
124 | if (data_present) | 111 | if (hwrng_data_present(current_rng, |
112 | !(filp->f_flags & O_NONBLOCK))) | ||
125 | bytes_read = hwrng_data_read(current_rng, &data); | 113 | bytes_read = hwrng_data_read(current_rng, &data); |
126 | mutex_unlock(&rng_mutex); | 114 | mutex_unlock(&rng_mutex); |
127 | 115 | ||
diff --git a/drivers/char/hw_random/geode-rng.c b/drivers/char/hw_random/geode-rng.c index 8e8658dcd2e3..fed4ef5569f5 100644 --- a/drivers/char/hw_random/geode-rng.c +++ b/drivers/char/hw_random/geode-rng.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <linux/kernel.h> | 28 | #include <linux/kernel.h> |
29 | #include <linux/pci.h> | 29 | #include <linux/pci.h> |
30 | #include <linux/hw_random.h> | 30 | #include <linux/hw_random.h> |
31 | #include <linux/delay.h> | ||
31 | #include <asm/io.h> | 32 | #include <asm/io.h> |
32 | 33 | ||
33 | 34 | ||
@@ -61,11 +62,18 @@ static int geode_rng_data_read(struct hwrng *rng, u32 *data) | |||
61 | return 4; | 62 | return 4; |
62 | } | 63 | } |
63 | 64 | ||
64 | static int geode_rng_data_present(struct hwrng *rng) | 65 | static int geode_rng_data_present(struct hwrng *rng, int wait) |
65 | { | 66 | { |
66 | void __iomem *mem = (void __iomem *)rng->priv; | 67 | void __iomem *mem = (void __iomem *)rng->priv; |
68 | int data, i; | ||
67 | 69 | ||
68 | return !!(readl(mem + GEODE_RNG_STATUS_REG)); | 70 | for (i = 0; i < 20; i++) { |
71 | data = !!(readl(mem + GEODE_RNG_STATUS_REG)); | ||
72 | if (data || !wait) | ||
73 | break; | ||
74 | udelay(10); | ||
75 | } | ||
76 | return data; | ||
69 | } | 77 | } |
70 | 78 | ||
71 | 79 | ||
diff --git a/drivers/char/hw_random/intel-rng.c b/drivers/char/hw_random/intel-rng.c index 753f46052b87..5cc651ef75eb 100644 --- a/drivers/char/hw_random/intel-rng.c +++ b/drivers/char/hw_random/intel-rng.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #include <linux/module.h> | 29 | #include <linux/module.h> |
30 | #include <linux/pci.h> | 30 | #include <linux/pci.h> |
31 | #include <linux/stop_machine.h> | 31 | #include <linux/stop_machine.h> |
32 | #include <linux/delay.h> | ||
32 | #include <asm/io.h> | 33 | #include <asm/io.h> |
33 | 34 | ||
34 | 35 | ||
@@ -162,11 +163,19 @@ static inline u8 hwstatus_set(void __iomem *mem, | |||
162 | return hwstatus_get(mem); | 163 | return hwstatus_get(mem); |
163 | } | 164 | } |
164 | 165 | ||
165 | static int intel_rng_data_present(struct hwrng *rng) | 166 | static int intel_rng_data_present(struct hwrng *rng, int wait) |
166 | { | 167 | { |
167 | void __iomem *mem = (void __iomem *)rng->priv; | 168 | void __iomem *mem = (void __iomem *)rng->priv; |
168 | 169 | int data, i; | |
169 | return !!(readb(mem + INTEL_RNG_STATUS) & INTEL_RNG_DATA_PRESENT); | 170 | |
171 | for (i = 0; i < 20; i++) { | ||
172 | data = !!(readb(mem + INTEL_RNG_STATUS) & | ||
173 | INTEL_RNG_DATA_PRESENT); | ||
174 | if (data || !wait) | ||
175 | break; | ||
176 | udelay(10); | ||
177 | } | ||
178 | return data; | ||
170 | } | 179 | } |
171 | 180 | ||
172 | static int intel_rng_data_read(struct hwrng *rng, u32 *data) | 181 | static int intel_rng_data_read(struct hwrng *rng, u32 *data) |
diff --git a/drivers/char/hw_random/omap-rng.c b/drivers/char/hw_random/omap-rng.c index 3f35a1c562b1..7e319951fa41 100644 --- a/drivers/char/hw_random/omap-rng.c +++ b/drivers/char/hw_random/omap-rng.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #include <linux/err.h> | 29 | #include <linux/err.h> |
30 | #include <linux/platform_device.h> | 30 | #include <linux/platform_device.h> |
31 | #include <linux/hw_random.h> | 31 | #include <linux/hw_random.h> |
32 | #include <linux/delay.h> | ||
32 | 33 | ||
33 | #include <asm/io.h> | 34 | #include <asm/io.h> |
34 | 35 | ||
@@ -65,9 +66,17 @@ static void omap_rng_write_reg(int reg, u32 val) | |||
65 | } | 66 | } |
66 | 67 | ||
67 | /* REVISIT: Does the status bit really work on 16xx? */ | 68 | /* REVISIT: Does the status bit really work on 16xx? */ |
68 | static int omap_rng_data_present(struct hwrng *rng) | 69 | static int omap_rng_data_present(struct hwrng *rng, int wait) |
69 | { | 70 | { |
70 | return omap_rng_read_reg(RNG_STAT_REG) ? 0 : 1; | 71 | int data, i; |
72 | |||
73 | for (i = 0; i < 20; i++) { | ||
74 | data = omap_rng_read_reg(RNG_STAT_REG) ? 0 : 1; | ||
75 | if (data || !wait) | ||
76 | break; | ||
77 | udelay(10); | ||
78 | } | ||
79 | return data; | ||
71 | } | 80 | } |
72 | 81 | ||
73 | static int omap_rng_data_read(struct hwrng *rng, u32 *data) | 82 | static int omap_rng_data_read(struct hwrng *rng, u32 *data) |
diff --git a/drivers/char/hw_random/pasemi-rng.c b/drivers/char/hw_random/pasemi-rng.c index fa6040b6c8f2..e2ea210cfa5f 100644 --- a/drivers/char/hw_random/pasemi-rng.c +++ b/drivers/char/hw_random/pasemi-rng.c | |||
@@ -23,6 +23,7 @@ | |||
23 | #include <linux/kernel.h> | 23 | #include <linux/kernel.h> |
24 | #include <linux/platform_device.h> | 24 | #include <linux/platform_device.h> |
25 | #include <linux/hw_random.h> | 25 | #include <linux/hw_random.h> |
26 | #include <linux/delay.h> | ||
26 | #include <asm/of_platform.h> | 27 | #include <asm/of_platform.h> |
27 | #include <asm/io.h> | 28 | #include <asm/io.h> |
28 | 29 | ||
@@ -41,12 +42,19 @@ | |||
41 | 42 | ||
42 | #define MODULE_NAME "pasemi_rng" | 43 | #define MODULE_NAME "pasemi_rng" |
43 | 44 | ||
44 | static int pasemi_rng_data_present(struct hwrng *rng) | 45 | static int pasemi_rng_data_present(struct hwrng *rng, int wait) |
45 | { | 46 | { |
46 | void __iomem *rng_regs = (void __iomem *)rng->priv; | 47 | void __iomem *rng_regs = (void __iomem *)rng->priv; |
47 | 48 | int data, i; | |
48 | return (in_le32(rng_regs + SDCRNG_CTL_REG) | 49 | |
49 | & SDCRNG_CTL_FVLD_M) ? 1 : 0; | 50 | for (i = 0; i < 20; i++) { |
51 | data = (in_le32(rng_regs + SDCRNG_CTL_REG) | ||
52 | & SDCRNG_CTL_FVLD_M) ? 1 : 0; | ||
53 | if (data || !wait) | ||
54 | break; | ||
55 | udelay(10); | ||
56 | } | ||
57 | return data; | ||
50 | } | 58 | } |
51 | 59 | ||
52 | static int pasemi_rng_data_read(struct hwrng *rng, u32 *data) | 60 | static int pasemi_rng_data_read(struct hwrng *rng, u32 *data) |
diff --git a/drivers/char/hw_random/via-rng.c b/drivers/char/hw_random/via-rng.c index ec435cb25c4f..868e39fd42e4 100644 --- a/drivers/char/hw_random/via-rng.c +++ b/drivers/char/hw_random/via-rng.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/module.h> | 27 | #include <linux/module.h> |
28 | #include <linux/kernel.h> | 28 | #include <linux/kernel.h> |
29 | #include <linux/hw_random.h> | 29 | #include <linux/hw_random.h> |
30 | #include <linux/delay.h> | ||
30 | #include <asm/io.h> | 31 | #include <asm/io.h> |
31 | #include <asm/msr.h> | 32 | #include <asm/msr.h> |
32 | #include <asm/cpufeature.h> | 33 | #include <asm/cpufeature.h> |
@@ -77,10 +78,11 @@ static inline u32 xstore(u32 *addr, u32 edx_in) | |||
77 | return eax_out; | 78 | return eax_out; |
78 | } | 79 | } |
79 | 80 | ||
80 | static int via_rng_data_present(struct hwrng *rng) | 81 | static int via_rng_data_present(struct hwrng *rng, int wait) |
81 | { | 82 | { |
82 | u32 bytes_out; | 83 | u32 bytes_out; |
83 | u32 *via_rng_datum = (u32 *)(&rng->priv); | 84 | u32 *via_rng_datum = (u32 *)(&rng->priv); |
85 | int i; | ||
84 | 86 | ||
85 | /* We choose the recommended 1-byte-per-instruction RNG rate, | 87 | /* We choose the recommended 1-byte-per-instruction RNG rate, |
86 | * for greater randomness at the expense of speed. Larger | 88 | * for greater randomness at the expense of speed. Larger |
@@ -95,12 +97,15 @@ static int via_rng_data_present(struct hwrng *rng) | |||
95 | * completes. | 97 | * completes. |
96 | */ | 98 | */ |
97 | 99 | ||
98 | *via_rng_datum = 0; /* paranoia, not really necessary */ | 100 | for (i = 0; i < 20; i++) { |
99 | bytes_out = xstore(via_rng_datum, VIA_RNG_CHUNK_1); | 101 | *via_rng_datum = 0; /* paranoia, not really necessary */ |
100 | bytes_out &= VIA_XSTORE_CNT_MASK; | 102 | bytes_out = xstore(via_rng_datum, VIA_RNG_CHUNK_1); |
101 | if (bytes_out == 0) | 103 | bytes_out &= VIA_XSTORE_CNT_MASK; |
102 | return 0; | 104 | if (bytes_out || !wait) |
103 | return 1; | 105 | break; |
106 | udelay(10); | ||
107 | } | ||
108 | return bytes_out ? 1 : 0; | ||
104 | } | 109 | } |
105 | 110 | ||
106 | static int via_rng_data_read(struct hwrng *rng, u32 *data) | 111 | static int via_rng_data_read(struct hwrng *rng, u32 *data) |
diff --git a/drivers/crypto/Kconfig b/drivers/crypto/Kconfig index ddd3a259cea1..74bd599dfb0c 100644 --- a/drivers/crypto/Kconfig +++ b/drivers/crypto/Kconfig | |||
@@ -83,4 +83,15 @@ config ZCRYPT_MONOLITHIC | |||
83 | that contains all parts of the crypto device driver (ap bus, | 83 | that contains all parts of the crypto device driver (ap bus, |
84 | request router and all the card drivers). | 84 | request router and all the card drivers). |
85 | 85 | ||
86 | config CRYPTO_DEV_HIFN_795X | ||
87 | tristate "Driver HIFN 795x crypto accelerator chips" | ||
88 | select CRYPTO_DES | ||
89 | select CRYPTO_ALGAPI | ||
90 | select CRYPTO_BLKCIPHER | ||
91 | depends on PCI | ||
92 | help | ||
93 | This option allows you to have support for HIFN 795x crypto adapters. | ||
94 | |||
95 | |||
96 | |||
86 | endif # CRYPTO_HW | 97 | endif # CRYPTO_HW |
diff --git a/drivers/crypto/Makefile b/drivers/crypto/Makefile index d070030f7d7e..c0327f0dadc5 100644 --- a/drivers/crypto/Makefile +++ b/drivers/crypto/Makefile | |||
@@ -1,3 +1,4 @@ | |||
1 | obj-$(CONFIG_CRYPTO_DEV_PADLOCK_AES) += padlock-aes.o | 1 | obj-$(CONFIG_CRYPTO_DEV_PADLOCK_AES) += padlock-aes.o |
2 | obj-$(CONFIG_CRYPTO_DEV_PADLOCK_SHA) += padlock-sha.o | 2 | obj-$(CONFIG_CRYPTO_DEV_PADLOCK_SHA) += padlock-sha.o |
3 | obj-$(CONFIG_CRYPTO_DEV_GEODE) += geode-aes.o | 3 | obj-$(CONFIG_CRYPTO_DEV_GEODE) += geode-aes.o |
4 | obj-$(CONFIG_CRYPTO_DEV_HIFN_795X) += hifn_795x.o | ||
diff --git a/drivers/crypto/geode-aes.c b/drivers/crypto/geode-aes.c index 711e246e1ef0..4801162919d9 100644 --- a/drivers/crypto/geode-aes.c +++ b/drivers/crypto/geode-aes.c | |||
@@ -13,44 +13,13 @@ | |||
13 | #include <linux/crypto.h> | 13 | #include <linux/crypto.h> |
14 | #include <linux/spinlock.h> | 14 | #include <linux/spinlock.h> |
15 | #include <crypto/algapi.h> | 15 | #include <crypto/algapi.h> |
16 | #include <crypto/aes.h> | ||
16 | 17 | ||
17 | #include <asm/io.h> | 18 | #include <asm/io.h> |
18 | #include <asm/delay.h> | 19 | #include <asm/delay.h> |
19 | 20 | ||
20 | #include "geode-aes.h" | 21 | #include "geode-aes.h" |
21 | 22 | ||
22 | /* Register definitions */ | ||
23 | |||
24 | #define AES_CTRLA_REG 0x0000 | ||
25 | |||
26 | #define AES_CTRL_START 0x01 | ||
27 | #define AES_CTRL_DECRYPT 0x00 | ||
28 | #define AES_CTRL_ENCRYPT 0x02 | ||
29 | #define AES_CTRL_WRKEY 0x04 | ||
30 | #define AES_CTRL_DCA 0x08 | ||
31 | #define AES_CTRL_SCA 0x10 | ||
32 | #define AES_CTRL_CBC 0x20 | ||
33 | |||
34 | #define AES_INTR_REG 0x0008 | ||
35 | |||
36 | #define AES_INTRA_PENDING (1 << 16) | ||
37 | #define AES_INTRB_PENDING (1 << 17) | ||
38 | |||
39 | #define AES_INTR_PENDING (AES_INTRA_PENDING | AES_INTRB_PENDING) | ||
40 | #define AES_INTR_MASK 0x07 | ||
41 | |||
42 | #define AES_SOURCEA_REG 0x0010 | ||
43 | #define AES_DSTA_REG 0x0014 | ||
44 | #define AES_LENA_REG 0x0018 | ||
45 | #define AES_WRITEKEY0_REG 0x0030 | ||
46 | #define AES_WRITEIV0_REG 0x0040 | ||
47 | |||
48 | /* A very large counter that is used to gracefully bail out of an | ||
49 | * operation in case of trouble | ||
50 | */ | ||
51 | |||
52 | #define AES_OP_TIMEOUT 0x50000 | ||
53 | |||
54 | /* Static structures */ | 23 | /* Static structures */ |
55 | 24 | ||
56 | static void __iomem * _iobase; | 25 | static void __iomem * _iobase; |
@@ -87,9 +56,10 @@ do_crypt(void *src, void *dst, int len, u32 flags) | |||
87 | /* Start the operation */ | 56 | /* Start the operation */ |
88 | iowrite32(AES_CTRL_START | flags, _iobase + AES_CTRLA_REG); | 57 | iowrite32(AES_CTRL_START | flags, _iobase + AES_CTRLA_REG); |
89 | 58 | ||
90 | do | 59 | do { |
91 | status = ioread32(_iobase + AES_INTR_REG); | 60 | status = ioread32(_iobase + AES_INTR_REG); |
92 | while(!(status & AES_INTRA_PENDING) && --counter); | 61 | cpu_relax(); |
62 | } while(!(status & AES_INTRA_PENDING) && --counter); | ||
93 | 63 | ||
94 | /* Clear the event */ | 64 | /* Clear the event */ |
95 | iowrite32((status & 0xFF) | AES_INTRA_PENDING, _iobase + AES_INTR_REG); | 65 | iowrite32((status & 0xFF) | AES_INTRA_PENDING, _iobase + AES_INTR_REG); |
@@ -101,6 +71,7 @@ geode_aes_crypt(struct geode_aes_op *op) | |||
101 | { | 71 | { |
102 | u32 flags = 0; | 72 | u32 flags = 0; |
103 | unsigned long iflags; | 73 | unsigned long iflags; |
74 | int ret; | ||
104 | 75 | ||
105 | if (op->len == 0) | 76 | if (op->len == 0) |
106 | return 0; | 77 | return 0; |
@@ -129,7 +100,8 @@ geode_aes_crypt(struct geode_aes_op *op) | |||
129 | _writefield(AES_WRITEKEY0_REG, op->key); | 100 | _writefield(AES_WRITEKEY0_REG, op->key); |
130 | } | 101 | } |
131 | 102 | ||
132 | do_crypt(op->src, op->dst, op->len, flags); | 103 | ret = do_crypt(op->src, op->dst, op->len, flags); |
104 | BUG_ON(ret); | ||
133 | 105 | ||
134 | if (op->mode == AES_MODE_CBC) | 106 | if (op->mode == AES_MODE_CBC) |
135 | _readfield(AES_WRITEIV0_REG, op->iv); | 107 | _readfield(AES_WRITEIV0_REG, op->iv); |
@@ -141,18 +113,103 @@ geode_aes_crypt(struct geode_aes_op *op) | |||
141 | 113 | ||
142 | /* CRYPTO-API Functions */ | 114 | /* CRYPTO-API Functions */ |
143 | 115 | ||
144 | static int | 116 | static int geode_setkey_cip(struct crypto_tfm *tfm, const u8 *key, |
145 | geode_setkey(struct crypto_tfm *tfm, const u8 *key, unsigned int len) | 117 | unsigned int len) |
146 | { | 118 | { |
147 | struct geode_aes_op *op = crypto_tfm_ctx(tfm); | 119 | struct geode_aes_op *op = crypto_tfm_ctx(tfm); |
120 | unsigned int ret; | ||
148 | 121 | ||
149 | if (len != AES_KEY_LENGTH) { | 122 | op->keylen = len; |
123 | |||
124 | if (len == AES_KEYSIZE_128) { | ||
125 | memcpy(op->key, key, len); | ||
126 | return 0; | ||
127 | } | ||
128 | |||
129 | if (len != AES_KEYSIZE_192 && len != AES_KEYSIZE_256) { | ||
130 | /* not supported at all */ | ||
150 | tfm->crt_flags |= CRYPTO_TFM_RES_BAD_KEY_LEN; | 131 | tfm->crt_flags |= CRYPTO_TFM_RES_BAD_KEY_LEN; |
151 | return -EINVAL; | 132 | return -EINVAL; |
152 | } | 133 | } |
153 | 134 | ||
154 | memcpy(op->key, key, len); | 135 | /* |
155 | return 0; | 136 | * The requested key size is not supported by HW, do a fallback |
137 | */ | ||
138 | op->fallback.blk->base.crt_flags &= ~CRYPTO_TFM_REQ_MASK; | ||
139 | op->fallback.blk->base.crt_flags |= (tfm->crt_flags & CRYPTO_TFM_REQ_MASK); | ||
140 | |||
141 | ret = crypto_cipher_setkey(op->fallback.cip, key, len); | ||
142 | if (ret) { | ||
143 | tfm->crt_flags &= ~CRYPTO_TFM_RES_MASK; | ||
144 | tfm->crt_flags |= (op->fallback.blk->base.crt_flags & CRYPTO_TFM_RES_MASK); | ||
145 | } | ||
146 | return ret; | ||
147 | } | ||
148 | |||
149 | static int geode_setkey_blk(struct crypto_tfm *tfm, const u8 *key, | ||
150 | unsigned int len) | ||
151 | { | ||
152 | struct geode_aes_op *op = crypto_tfm_ctx(tfm); | ||
153 | unsigned int ret; | ||
154 | |||
155 | op->keylen = len; | ||
156 | |||
157 | if (len == AES_KEYSIZE_128) { | ||
158 | memcpy(op->key, key, len); | ||
159 | return 0; | ||
160 | } | ||
161 | |||
162 | if (len != AES_KEYSIZE_192 && len != AES_KEYSIZE_256) { | ||
163 | /* not supported at all */ | ||
164 | tfm->crt_flags |= CRYPTO_TFM_RES_BAD_KEY_LEN; | ||
165 | return -EINVAL; | ||
166 | } | ||
167 | |||
168 | /* | ||
169 | * The requested key size is not supported by HW, do a fallback | ||
170 | */ | ||
171 | op->fallback.blk->base.crt_flags &= ~CRYPTO_TFM_REQ_MASK; | ||
172 | op->fallback.blk->base.crt_flags |= (tfm->crt_flags & CRYPTO_TFM_REQ_MASK); | ||
173 | |||
174 | ret = crypto_blkcipher_setkey(op->fallback.blk, key, len); | ||
175 | if (ret) { | ||
176 | tfm->crt_flags &= ~CRYPTO_TFM_RES_MASK; | ||
177 | tfm->crt_flags |= (op->fallback.blk->base.crt_flags & CRYPTO_TFM_RES_MASK); | ||
178 | } | ||
179 | return ret; | ||
180 | } | ||
181 | |||
182 | static int fallback_blk_dec(struct blkcipher_desc *desc, | ||
183 | struct scatterlist *dst, struct scatterlist *src, | ||
184 | unsigned int nbytes) | ||
185 | { | ||
186 | unsigned int ret; | ||
187 | struct crypto_blkcipher *tfm; | ||
188 | struct geode_aes_op *op = crypto_blkcipher_ctx(desc->tfm); | ||
189 | |||
190 | tfm = desc->tfm; | ||
191 | desc->tfm = op->fallback.blk; | ||
192 | |||
193 | ret = crypto_blkcipher_decrypt_iv(desc, dst, src, nbytes); | ||
194 | |||
195 | desc->tfm = tfm; | ||
196 | return ret; | ||
197 | } | ||
198 | static int fallback_blk_enc(struct blkcipher_desc *desc, | ||
199 | struct scatterlist *dst, struct scatterlist *src, | ||
200 | unsigned int nbytes) | ||
201 | { | ||
202 | unsigned int ret; | ||
203 | struct crypto_blkcipher *tfm; | ||
204 | struct geode_aes_op *op = crypto_blkcipher_ctx(desc->tfm); | ||
205 | |||
206 | tfm = desc->tfm; | ||
207 | desc->tfm = op->fallback.blk; | ||
208 | |||
209 | ret = crypto_blkcipher_encrypt_iv(desc, dst, src, nbytes); | ||
210 | |||
211 | desc->tfm = tfm; | ||
212 | return ret; | ||
156 | } | 213 | } |
157 | 214 | ||
158 | static void | 215 | static void |
@@ -160,8 +217,10 @@ geode_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) | |||
160 | { | 217 | { |
161 | struct geode_aes_op *op = crypto_tfm_ctx(tfm); | 218 | struct geode_aes_op *op = crypto_tfm_ctx(tfm); |
162 | 219 | ||
163 | if ((out == NULL) || (in == NULL)) | 220 | if (unlikely(op->keylen != AES_KEYSIZE_128)) { |
221 | crypto_cipher_encrypt_one(op->fallback.cip, out, in); | ||
164 | return; | 222 | return; |
223 | } | ||
165 | 224 | ||
166 | op->src = (void *) in; | 225 | op->src = (void *) in; |
167 | op->dst = (void *) out; | 226 | op->dst = (void *) out; |
@@ -179,8 +238,10 @@ geode_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) | |||
179 | { | 238 | { |
180 | struct geode_aes_op *op = crypto_tfm_ctx(tfm); | 239 | struct geode_aes_op *op = crypto_tfm_ctx(tfm); |
181 | 240 | ||
182 | if ((out == NULL) || (in == NULL)) | 241 | if (unlikely(op->keylen != AES_KEYSIZE_128)) { |
242 | crypto_cipher_decrypt_one(op->fallback.cip, out, in); | ||
183 | return; | 243 | return; |
244 | } | ||
184 | 245 | ||
185 | op->src = (void *) in; | 246 | op->src = (void *) in; |
186 | op->dst = (void *) out; | 247 | op->dst = (void *) out; |
@@ -192,24 +253,50 @@ geode_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) | |||
192 | geode_aes_crypt(op); | 253 | geode_aes_crypt(op); |
193 | } | 254 | } |
194 | 255 | ||
256 | static int fallback_init_cip(struct crypto_tfm *tfm) | ||
257 | { | ||
258 | const char *name = tfm->__crt_alg->cra_name; | ||
259 | struct geode_aes_op *op = crypto_tfm_ctx(tfm); | ||
260 | |||
261 | op->fallback.cip = crypto_alloc_cipher(name, 0, | ||
262 | CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK); | ||
263 | |||
264 | if (IS_ERR(op->fallback.cip)) { | ||
265 | printk(KERN_ERR "Error allocating fallback algo %s\n", name); | ||
266 | return PTR_ERR(op->fallback.blk); | ||
267 | } | ||
268 | |||
269 | return 0; | ||
270 | } | ||
271 | |||
272 | static void fallback_exit_cip(struct crypto_tfm *tfm) | ||
273 | { | ||
274 | struct geode_aes_op *op = crypto_tfm_ctx(tfm); | ||
275 | |||
276 | crypto_free_cipher(op->fallback.cip); | ||
277 | op->fallback.cip = NULL; | ||
278 | } | ||
195 | 279 | ||
196 | static struct crypto_alg geode_alg = { | 280 | static struct crypto_alg geode_alg = { |
197 | .cra_name = "aes", | 281 | .cra_name = "aes", |
198 | .cra_driver_name = "geode-aes-128", | 282 | .cra_driver_name = "geode-aes", |
199 | .cra_priority = 300, | 283 | .cra_priority = 300, |
200 | .cra_alignmask = 15, | 284 | .cra_alignmask = 15, |
201 | .cra_flags = CRYPTO_ALG_TYPE_CIPHER, | 285 | .cra_flags = CRYPTO_ALG_TYPE_CIPHER | |
286 | CRYPTO_ALG_NEED_FALLBACK, | ||
287 | .cra_init = fallback_init_cip, | ||
288 | .cra_exit = fallback_exit_cip, | ||
202 | .cra_blocksize = AES_MIN_BLOCK_SIZE, | 289 | .cra_blocksize = AES_MIN_BLOCK_SIZE, |
203 | .cra_ctxsize = sizeof(struct geode_aes_op), | 290 | .cra_ctxsize = sizeof(struct geode_aes_op), |
204 | .cra_module = THIS_MODULE, | 291 | .cra_module = THIS_MODULE, |
205 | .cra_list = LIST_HEAD_INIT(geode_alg.cra_list), | 292 | .cra_list = LIST_HEAD_INIT(geode_alg.cra_list), |
206 | .cra_u = { | 293 | .cra_u = { |
207 | .cipher = { | 294 | .cipher = { |
208 | .cia_min_keysize = AES_KEY_LENGTH, | 295 | .cia_min_keysize = AES_MIN_KEY_SIZE, |
209 | .cia_max_keysize = AES_KEY_LENGTH, | 296 | .cia_max_keysize = AES_MAX_KEY_SIZE, |
210 | .cia_setkey = geode_setkey, | 297 | .cia_setkey = geode_setkey_cip, |
211 | .cia_encrypt = geode_encrypt, | 298 | .cia_encrypt = geode_encrypt, |
212 | .cia_decrypt = geode_decrypt | 299 | .cia_decrypt = geode_decrypt |
213 | } | 300 | } |
214 | } | 301 | } |
215 | }; | 302 | }; |
@@ -223,8 +310,12 @@ geode_cbc_decrypt(struct blkcipher_desc *desc, | |||
223 | struct blkcipher_walk walk; | 310 | struct blkcipher_walk walk; |
224 | int err, ret; | 311 | int err, ret; |
225 | 312 | ||
313 | if (unlikely(op->keylen != AES_KEYSIZE_128)) | ||
314 | return fallback_blk_dec(desc, dst, src, nbytes); | ||
315 | |||
226 | blkcipher_walk_init(&walk, dst, src, nbytes); | 316 | blkcipher_walk_init(&walk, dst, src, nbytes); |
227 | err = blkcipher_walk_virt(desc, &walk); | 317 | err = blkcipher_walk_virt(desc, &walk); |
318 | op->iv = walk.iv; | ||
228 | 319 | ||
229 | while((nbytes = walk.nbytes)) { | 320 | while((nbytes = walk.nbytes)) { |
230 | op->src = walk.src.virt.addr, | 321 | op->src = walk.src.virt.addr, |
@@ -233,13 +324,9 @@ geode_cbc_decrypt(struct blkcipher_desc *desc, | |||
233 | op->len = nbytes - (nbytes % AES_MIN_BLOCK_SIZE); | 324 | op->len = nbytes - (nbytes % AES_MIN_BLOCK_SIZE); |
234 | op->dir = AES_DIR_DECRYPT; | 325 | op->dir = AES_DIR_DECRYPT; |
235 | 326 | ||
236 | memcpy(op->iv, walk.iv, AES_IV_LENGTH); | ||
237 | |||
238 | ret = geode_aes_crypt(op); | 327 | ret = geode_aes_crypt(op); |
239 | 328 | ||
240 | memcpy(walk.iv, op->iv, AES_IV_LENGTH); | ||
241 | nbytes -= ret; | 329 | nbytes -= ret; |
242 | |||
243 | err = blkcipher_walk_done(desc, &walk, nbytes); | 330 | err = blkcipher_walk_done(desc, &walk, nbytes); |
244 | } | 331 | } |
245 | 332 | ||
@@ -255,8 +342,12 @@ geode_cbc_encrypt(struct blkcipher_desc *desc, | |||
255 | struct blkcipher_walk walk; | 342 | struct blkcipher_walk walk; |
256 | int err, ret; | 343 | int err, ret; |
257 | 344 | ||
345 | if (unlikely(op->keylen != AES_KEYSIZE_128)) | ||
346 | return fallback_blk_enc(desc, dst, src, nbytes); | ||
347 | |||
258 | blkcipher_walk_init(&walk, dst, src, nbytes); | 348 | blkcipher_walk_init(&walk, dst, src, nbytes); |
259 | err = blkcipher_walk_virt(desc, &walk); | 349 | err = blkcipher_walk_virt(desc, &walk); |
350 | op->iv = walk.iv; | ||
260 | 351 | ||
261 | while((nbytes = walk.nbytes)) { | 352 | while((nbytes = walk.nbytes)) { |
262 | op->src = walk.src.virt.addr, | 353 | op->src = walk.src.virt.addr, |
@@ -265,8 +356,6 @@ geode_cbc_encrypt(struct blkcipher_desc *desc, | |||
265 | op->len = nbytes - (nbytes % AES_MIN_BLOCK_SIZE); | 356 | op->len = nbytes - (nbytes % AES_MIN_BLOCK_SIZE); |
266 | op->dir = AES_DIR_ENCRYPT; | 357 | op->dir = AES_DIR_ENCRYPT; |
267 | 358 | ||
268 | memcpy(op->iv, walk.iv, AES_IV_LENGTH); | ||
269 | |||
270 | ret = geode_aes_crypt(op); | 359 | ret = geode_aes_crypt(op); |
271 | nbytes -= ret; | 360 | nbytes -= ret; |
272 | err = blkcipher_walk_done(desc, &walk, nbytes); | 361 | err = blkcipher_walk_done(desc, &walk, nbytes); |
@@ -275,22 +364,49 @@ geode_cbc_encrypt(struct blkcipher_desc *desc, | |||
275 | return err; | 364 | return err; |
276 | } | 365 | } |
277 | 366 | ||
367 | static int fallback_init_blk(struct crypto_tfm *tfm) | ||
368 | { | ||
369 | const char *name = tfm->__crt_alg->cra_name; | ||
370 | struct geode_aes_op *op = crypto_tfm_ctx(tfm); | ||
371 | |||
372 | op->fallback.blk = crypto_alloc_blkcipher(name, 0, | ||
373 | CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK); | ||
374 | |||
375 | if (IS_ERR(op->fallback.blk)) { | ||
376 | printk(KERN_ERR "Error allocating fallback algo %s\n", name); | ||
377 | return PTR_ERR(op->fallback.blk); | ||
378 | } | ||
379 | |||
380 | return 0; | ||
381 | } | ||
382 | |||
383 | static void fallback_exit_blk(struct crypto_tfm *tfm) | ||
384 | { | ||
385 | struct geode_aes_op *op = crypto_tfm_ctx(tfm); | ||
386 | |||
387 | crypto_free_blkcipher(op->fallback.blk); | ||
388 | op->fallback.blk = NULL; | ||
389 | } | ||
390 | |||
278 | static struct crypto_alg geode_cbc_alg = { | 391 | static struct crypto_alg geode_cbc_alg = { |
279 | .cra_name = "cbc(aes)", | 392 | .cra_name = "cbc(aes)", |
280 | .cra_driver_name = "cbc-aes-geode-128", | 393 | .cra_driver_name = "cbc-aes-geode", |
281 | .cra_priority = 400, | 394 | .cra_priority = 400, |
282 | .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER, | 395 | .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER | |
396 | CRYPTO_ALG_NEED_FALLBACK, | ||
397 | .cra_init = fallback_init_blk, | ||
398 | .cra_exit = fallback_exit_blk, | ||
283 | .cra_blocksize = AES_MIN_BLOCK_SIZE, | 399 | .cra_blocksize = AES_MIN_BLOCK_SIZE, |
284 | .cra_ctxsize = sizeof(struct geode_aes_op), | 400 | .cra_ctxsize = sizeof(struct geode_aes_op), |
285 | .cra_alignmask = 15, | 401 | .cra_alignmask = 15, |
286 | .cra_type = &crypto_blkcipher_type, | 402 | .cra_type = &crypto_blkcipher_type, |
287 | .cra_module = THIS_MODULE, | 403 | .cra_module = THIS_MODULE, |
288 | .cra_list = LIST_HEAD_INIT(geode_cbc_alg.cra_list), | 404 | .cra_list = LIST_HEAD_INIT(geode_cbc_alg.cra_list), |
289 | .cra_u = { | 405 | .cra_u = { |
290 | .blkcipher = { | 406 | .blkcipher = { |
291 | .min_keysize = AES_KEY_LENGTH, | 407 | .min_keysize = AES_MIN_KEY_SIZE, |
292 | .max_keysize = AES_KEY_LENGTH, | 408 | .max_keysize = AES_MAX_KEY_SIZE, |
293 | .setkey = geode_setkey, | 409 | .setkey = geode_setkey_blk, |
294 | .encrypt = geode_cbc_encrypt, | 410 | .encrypt = geode_cbc_encrypt, |
295 | .decrypt = geode_cbc_decrypt, | 411 | .decrypt = geode_cbc_decrypt, |
296 | .ivsize = AES_IV_LENGTH, | 412 | .ivsize = AES_IV_LENGTH, |
@@ -307,6 +423,9 @@ geode_ecb_decrypt(struct blkcipher_desc *desc, | |||
307 | struct blkcipher_walk walk; | 423 | struct blkcipher_walk walk; |
308 | int err, ret; | 424 | int err, ret; |
309 | 425 | ||
426 | if (unlikely(op->keylen != AES_KEYSIZE_128)) | ||
427 | return fallback_blk_dec(desc, dst, src, nbytes); | ||
428 | |||
310 | blkcipher_walk_init(&walk, dst, src, nbytes); | 429 | blkcipher_walk_init(&walk, dst, src, nbytes); |
311 | err = blkcipher_walk_virt(desc, &walk); | 430 | err = blkcipher_walk_virt(desc, &walk); |
312 | 431 | ||
@@ -334,6 +453,9 @@ geode_ecb_encrypt(struct blkcipher_desc *desc, | |||
334 | struct blkcipher_walk walk; | 453 | struct blkcipher_walk walk; |
335 | int err, ret; | 454 | int err, ret; |
336 | 455 | ||
456 | if (unlikely(op->keylen != AES_KEYSIZE_128)) | ||
457 | return fallback_blk_enc(desc, dst, src, nbytes); | ||
458 | |||
337 | blkcipher_walk_init(&walk, dst, src, nbytes); | 459 | blkcipher_walk_init(&walk, dst, src, nbytes); |
338 | err = blkcipher_walk_virt(desc, &walk); | 460 | err = blkcipher_walk_virt(desc, &walk); |
339 | 461 | ||
@@ -353,28 +475,31 @@ geode_ecb_encrypt(struct blkcipher_desc *desc, | |||
353 | } | 475 | } |
354 | 476 | ||
355 | static struct crypto_alg geode_ecb_alg = { | 477 | static struct crypto_alg geode_ecb_alg = { |
356 | .cra_name = "ecb(aes)", | 478 | .cra_name = "ecb(aes)", |
357 | .cra_driver_name = "ecb-aes-geode-128", | 479 | .cra_driver_name = "ecb-aes-geode", |
358 | .cra_priority = 400, | 480 | .cra_priority = 400, |
359 | .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER, | 481 | .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER | |
482 | CRYPTO_ALG_NEED_FALLBACK, | ||
483 | .cra_init = fallback_init_blk, | ||
484 | .cra_exit = fallback_exit_blk, | ||
360 | .cra_blocksize = AES_MIN_BLOCK_SIZE, | 485 | .cra_blocksize = AES_MIN_BLOCK_SIZE, |
361 | .cra_ctxsize = sizeof(struct geode_aes_op), | 486 | .cra_ctxsize = sizeof(struct geode_aes_op), |
362 | .cra_alignmask = 15, | 487 | .cra_alignmask = 15, |
363 | .cra_type = &crypto_blkcipher_type, | 488 | .cra_type = &crypto_blkcipher_type, |
364 | .cra_module = THIS_MODULE, | 489 | .cra_module = THIS_MODULE, |
365 | .cra_list = LIST_HEAD_INIT(geode_ecb_alg.cra_list), | 490 | .cra_list = LIST_HEAD_INIT(geode_ecb_alg.cra_list), |
366 | .cra_u = { | 491 | .cra_u = { |
367 | .blkcipher = { | 492 | .blkcipher = { |
368 | .min_keysize = AES_KEY_LENGTH, | 493 | .min_keysize = AES_MIN_KEY_SIZE, |
369 | .max_keysize = AES_KEY_LENGTH, | 494 | .max_keysize = AES_MAX_KEY_SIZE, |
370 | .setkey = geode_setkey, | 495 | .setkey = geode_setkey_blk, |
371 | .encrypt = geode_ecb_encrypt, | 496 | .encrypt = geode_ecb_encrypt, |
372 | .decrypt = geode_ecb_decrypt, | 497 | .decrypt = geode_ecb_decrypt, |
373 | } | 498 | } |
374 | } | 499 | } |
375 | }; | 500 | }; |
376 | 501 | ||
377 | static void | 502 | static void __devexit |
378 | geode_aes_remove(struct pci_dev *dev) | 503 | geode_aes_remove(struct pci_dev *dev) |
379 | { | 504 | { |
380 | crypto_unregister_alg(&geode_alg); | 505 | crypto_unregister_alg(&geode_alg); |
@@ -389,7 +514,7 @@ geode_aes_remove(struct pci_dev *dev) | |||
389 | } | 514 | } |
390 | 515 | ||
391 | 516 | ||
392 | static int | 517 | static int __devinit |
393 | geode_aes_probe(struct pci_dev *dev, const struct pci_device_id *id) | 518 | geode_aes_probe(struct pci_dev *dev, const struct pci_device_id *id) |
394 | { | 519 | { |
395 | int ret; | 520 | int ret; |
@@ -397,7 +522,7 @@ geode_aes_probe(struct pci_dev *dev, const struct pci_device_id *id) | |||
397 | if ((ret = pci_enable_device(dev))) | 522 | if ((ret = pci_enable_device(dev))) |
398 | return ret; | 523 | return ret; |
399 | 524 | ||
400 | if ((ret = pci_request_regions(dev, "geode-aes-128"))) | 525 | if ((ret = pci_request_regions(dev, "geode-aes"))) |
401 | goto eenable; | 526 | goto eenable; |
402 | 527 | ||
403 | _iobase = pci_iomap(dev, 0, 0); | 528 | _iobase = pci_iomap(dev, 0, 0); |
@@ -472,7 +597,6 @@ geode_aes_exit(void) | |||
472 | MODULE_AUTHOR("Advanced Micro Devices, Inc."); | 597 | MODULE_AUTHOR("Advanced Micro Devices, Inc."); |
473 | MODULE_DESCRIPTION("Geode LX Hardware AES driver"); | 598 | MODULE_DESCRIPTION("Geode LX Hardware AES driver"); |
474 | MODULE_LICENSE("GPL"); | 599 | MODULE_LICENSE("GPL"); |
475 | MODULE_ALIAS("aes"); | ||
476 | 600 | ||
477 | module_init(geode_aes_init); | 601 | module_init(geode_aes_init); |
478 | module_exit(geode_aes_exit); | 602 | module_exit(geode_aes_exit); |
diff --git a/drivers/crypto/geode-aes.h b/drivers/crypto/geode-aes.h index f47968671ae7..f1855b50da48 100644 --- a/drivers/crypto/geode-aes.h +++ b/drivers/crypto/geode-aes.h | |||
@@ -9,9 +9,9 @@ | |||
9 | #ifndef _GEODE_AES_H_ | 9 | #ifndef _GEODE_AES_H_ |
10 | #define _GEODE_AES_H_ | 10 | #define _GEODE_AES_H_ |
11 | 11 | ||
12 | #define AES_KEY_LENGTH 16 | 12 | /* driver logic flags */ |
13 | #define AES_IV_LENGTH 16 | 13 | #define AES_IV_LENGTH 16 |
14 | 14 | #define AES_KEY_LENGTH 16 | |
15 | #define AES_MIN_BLOCK_SIZE 16 | 15 | #define AES_MIN_BLOCK_SIZE 16 |
16 | 16 | ||
17 | #define AES_MODE_ECB 0 | 17 | #define AES_MODE_ECB 0 |
@@ -22,6 +22,38 @@ | |||
22 | 22 | ||
23 | #define AES_FLAGS_HIDDENKEY (1 << 0) | 23 | #define AES_FLAGS_HIDDENKEY (1 << 0) |
24 | 24 | ||
25 | /* Register definitions */ | ||
26 | |||
27 | #define AES_CTRLA_REG 0x0000 | ||
28 | |||
29 | #define AES_CTRL_START 0x01 | ||
30 | #define AES_CTRL_DECRYPT 0x00 | ||
31 | #define AES_CTRL_ENCRYPT 0x02 | ||
32 | #define AES_CTRL_WRKEY 0x04 | ||
33 | #define AES_CTRL_DCA 0x08 | ||
34 | #define AES_CTRL_SCA 0x10 | ||
35 | #define AES_CTRL_CBC 0x20 | ||
36 | |||
37 | #define AES_INTR_REG 0x0008 | ||
38 | |||
39 | #define AES_INTRA_PENDING (1 << 16) | ||
40 | #define AES_INTRB_PENDING (1 << 17) | ||
41 | |||
42 | #define AES_INTR_PENDING (AES_INTRA_PENDING | AES_INTRB_PENDING) | ||
43 | #define AES_INTR_MASK 0x07 | ||
44 | |||
45 | #define AES_SOURCEA_REG 0x0010 | ||
46 | #define AES_DSTA_REG 0x0014 | ||
47 | #define AES_LENA_REG 0x0018 | ||
48 | #define AES_WRITEKEY0_REG 0x0030 | ||
49 | #define AES_WRITEIV0_REG 0x0040 | ||
50 | |||
51 | /* A very large counter that is used to gracefully bail out of an | ||
52 | * operation in case of trouble | ||
53 | */ | ||
54 | |||
55 | #define AES_OP_TIMEOUT 0x50000 | ||
56 | |||
25 | struct geode_aes_op { | 57 | struct geode_aes_op { |
26 | 58 | ||
27 | void *src; | 59 | void *src; |
@@ -33,7 +65,13 @@ struct geode_aes_op { | |||
33 | int len; | 65 | int len; |
34 | 66 | ||
35 | u8 key[AES_KEY_LENGTH]; | 67 | u8 key[AES_KEY_LENGTH]; |
36 | u8 iv[AES_IV_LENGTH]; | 68 | u8 *iv; |
69 | |||
70 | union { | ||
71 | struct crypto_blkcipher *blk; | ||
72 | struct crypto_cipher *cip; | ||
73 | } fallback; | ||
74 | u32 keylen; | ||
37 | }; | 75 | }; |
38 | 76 | ||
39 | #endif | 77 | #endif |
diff --git a/drivers/crypto/hifn_795x.c b/drivers/crypto/hifn_795x.c new file mode 100644 index 000000000000..16413e57597c --- /dev/null +++ b/drivers/crypto/hifn_795x.c | |||
@@ -0,0 +1,2838 @@ | |||
1 | /* | ||
2 | * 2007+ Copyright (c) Evgeniy Polyakov <johnpol@2ka.mipt.ru> | ||
3 | * All rights reserved. | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License as published by | ||
7 | * the Free Software Foundation; either version 2 of the License, or | ||
8 | * (at your option) any later version. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program; if not, write to the Free Software | ||
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
18 | */ | ||
19 | |||
20 | #include <linux/kernel.h> | ||
21 | #include <linux/module.h> | ||
22 | #include <linux/moduleparam.h> | ||
23 | #include <linux/mod_devicetable.h> | ||
24 | #include <linux/interrupt.h> | ||
25 | #include <linux/pci.h> | ||
26 | #include <linux/slab.h> | ||
27 | #include <linux/delay.h> | ||
28 | #include <linux/mm.h> | ||
29 | #include <linux/dma-mapping.h> | ||
30 | #include <linux/scatterlist.h> | ||
31 | #include <linux/highmem.h> | ||
32 | #include <linux/interrupt.h> | ||
33 | #include <linux/crypto.h> | ||
34 | #include <linux/hw_random.h> | ||
35 | #include <linux/ktime.h> | ||
36 | |||
37 | #include <crypto/algapi.h> | ||
38 | #include <crypto/des.h> | ||
39 | |||
40 | #include <asm/kmap_types.h> | ||
41 | |||
42 | #undef dprintk | ||
43 | |||
44 | #define HIFN_TEST | ||
45 | //#define HIFN_DEBUG | ||
46 | |||
47 | #ifdef HIFN_DEBUG | ||
48 | #define dprintk(f, a...) printk(f, ##a) | ||
49 | #else | ||
50 | #define dprintk(f, a...) do {} while (0) | ||
51 | #endif | ||
52 | |||
53 | static char hifn_pll_ref[sizeof("extNNN")] = "ext"; | ||
54 | module_param_string(hifn_pll_ref, hifn_pll_ref, sizeof(hifn_pll_ref), 0444); | ||
55 | MODULE_PARM_DESC(hifn_pll_ref, | ||
56 | "PLL reference clock (pci[freq] or ext[freq], default ext)"); | ||
57 | |||
58 | static atomic_t hifn_dev_number; | ||
59 | |||
60 | #define ACRYPTO_OP_DECRYPT 0 | ||
61 | #define ACRYPTO_OP_ENCRYPT 1 | ||
62 | #define ACRYPTO_OP_HMAC 2 | ||
63 | #define ACRYPTO_OP_RNG 3 | ||
64 | |||
65 | #define ACRYPTO_MODE_ECB 0 | ||
66 | #define ACRYPTO_MODE_CBC 1 | ||
67 | #define ACRYPTO_MODE_CFB 2 | ||
68 | #define ACRYPTO_MODE_OFB 3 | ||
69 | |||
70 | #define ACRYPTO_TYPE_AES_128 0 | ||
71 | #define ACRYPTO_TYPE_AES_192 1 | ||
72 | #define ACRYPTO_TYPE_AES_256 2 | ||
73 | #define ACRYPTO_TYPE_3DES 3 | ||
74 | #define ACRYPTO_TYPE_DES 4 | ||
75 | |||
76 | #define PCI_VENDOR_ID_HIFN 0x13A3 | ||
77 | #define PCI_DEVICE_ID_HIFN_7955 0x0020 | ||
78 | #define PCI_DEVICE_ID_HIFN_7956 0x001d | ||
79 | |||
80 | /* I/O region sizes */ | ||
81 | |||
82 | #define HIFN_BAR0_SIZE 0x1000 | ||
83 | #define HIFN_BAR1_SIZE 0x2000 | ||
84 | #define HIFN_BAR2_SIZE 0x8000 | ||
85 | |||
86 | /* DMA registres */ | ||
87 | |||
88 | #define HIFN_DMA_CRA 0x0C /* DMA Command Ring Address */ | ||
89 | #define HIFN_DMA_SDRA 0x1C /* DMA Source Data Ring Address */ | ||
90 | #define HIFN_DMA_RRA 0x2C /* DMA Result Ring Address */ | ||
91 | #define HIFN_DMA_DDRA 0x3C /* DMA Destination Data Ring Address */ | ||
92 | #define HIFN_DMA_STCTL 0x40 /* DMA Status and Control */ | ||
93 | #define HIFN_DMA_INTREN 0x44 /* DMA Interrupt Enable */ | ||
94 | #define HIFN_DMA_CFG1 0x48 /* DMA Configuration #1 */ | ||
95 | #define HIFN_DMA_CFG2 0x6C /* DMA Configuration #2 */ | ||
96 | #define HIFN_CHIP_ID 0x98 /* Chip ID */ | ||
97 | |||
98 | /* | ||
99 | * Processing Unit Registers (offset from BASEREG0) | ||
100 | */ | ||
101 | #define HIFN_0_PUDATA 0x00 /* Processing Unit Data */ | ||
102 | #define HIFN_0_PUCTRL 0x04 /* Processing Unit Control */ | ||
103 | #define HIFN_0_PUISR 0x08 /* Processing Unit Interrupt Status */ | ||
104 | #define HIFN_0_PUCNFG 0x0c /* Processing Unit Configuration */ | ||
105 | #define HIFN_0_PUIER 0x10 /* Processing Unit Interrupt Enable */ | ||
106 | #define HIFN_0_PUSTAT 0x14 /* Processing Unit Status/Chip ID */ | ||
107 | #define HIFN_0_FIFOSTAT 0x18 /* FIFO Status */ | ||
108 | #define HIFN_0_FIFOCNFG 0x1c /* FIFO Configuration */ | ||
109 | #define HIFN_0_SPACESIZE 0x20 /* Register space size */ | ||
110 | |||
111 | /* Processing Unit Control Register (HIFN_0_PUCTRL) */ | ||
112 | #define HIFN_PUCTRL_CLRSRCFIFO 0x0010 /* clear source fifo */ | ||
113 | #define HIFN_PUCTRL_STOP 0x0008 /* stop pu */ | ||
114 | #define HIFN_PUCTRL_LOCKRAM 0x0004 /* lock ram */ | ||
115 | #define HIFN_PUCTRL_DMAENA 0x0002 /* enable dma */ | ||
116 | #define HIFN_PUCTRL_RESET 0x0001 /* Reset processing unit */ | ||
117 | |||
118 | /* Processing Unit Interrupt Status Register (HIFN_0_PUISR) */ | ||
119 | #define HIFN_PUISR_CMDINVAL 0x8000 /* Invalid command interrupt */ | ||
120 | #define HIFN_PUISR_DATAERR 0x4000 /* Data error interrupt */ | ||
121 | #define HIFN_PUISR_SRCFIFO 0x2000 /* Source FIFO ready interrupt */ | ||
122 | #define HIFN_PUISR_DSTFIFO 0x1000 /* Destination FIFO ready interrupt */ | ||
123 | #define HIFN_PUISR_DSTOVER 0x0200 /* Destination overrun interrupt */ | ||
124 | #define HIFN_PUISR_SRCCMD 0x0080 /* Source command interrupt */ | ||
125 | #define HIFN_PUISR_SRCCTX 0x0040 /* Source context interrupt */ | ||
126 | #define HIFN_PUISR_SRCDATA 0x0020 /* Source data interrupt */ | ||
127 | #define HIFN_PUISR_DSTDATA 0x0010 /* Destination data interrupt */ | ||
128 | #define HIFN_PUISR_DSTRESULT 0x0004 /* Destination result interrupt */ | ||
129 | |||
130 | /* Processing Unit Configuration Register (HIFN_0_PUCNFG) */ | ||
131 | #define HIFN_PUCNFG_DRAMMASK 0xe000 /* DRAM size mask */ | ||
132 | #define HIFN_PUCNFG_DSZ_256K 0x0000 /* 256k dram */ | ||
133 | #define HIFN_PUCNFG_DSZ_512K 0x2000 /* 512k dram */ | ||
134 | #define HIFN_PUCNFG_DSZ_1M 0x4000 /* 1m dram */ | ||
135 | #define HIFN_PUCNFG_DSZ_2M 0x6000 /* 2m dram */ | ||
136 | #define HIFN_PUCNFG_DSZ_4M 0x8000 /* 4m dram */ | ||
137 | #define HIFN_PUCNFG_DSZ_8M 0xa000 /* 8m dram */ | ||
138 | #define HIFN_PUNCFG_DSZ_16M 0xc000 /* 16m dram */ | ||
139 | #define HIFN_PUCNFG_DSZ_32M 0xe000 /* 32m dram */ | ||
140 | #define HIFN_PUCNFG_DRAMREFRESH 0x1800 /* DRAM refresh rate mask */ | ||
141 | #define HIFN_PUCNFG_DRFR_512 0x0000 /* 512 divisor of ECLK */ | ||
142 | #define HIFN_PUCNFG_DRFR_256 0x0800 /* 256 divisor of ECLK */ | ||
143 | #define HIFN_PUCNFG_DRFR_128 0x1000 /* 128 divisor of ECLK */ | ||
144 | #define HIFN_PUCNFG_TCALLPHASES 0x0200 /* your guess is as good as mine... */ | ||
145 | #define HIFN_PUCNFG_TCDRVTOTEM 0x0100 /* your guess is as good as mine... */ | ||
146 | #define HIFN_PUCNFG_BIGENDIAN 0x0080 /* DMA big endian mode */ | ||
147 | #define HIFN_PUCNFG_BUS32 0x0040 /* Bus width 32bits */ | ||
148 | #define HIFN_PUCNFG_BUS16 0x0000 /* Bus width 16 bits */ | ||
149 | #define HIFN_PUCNFG_CHIPID 0x0020 /* Allow chipid from PUSTAT */ | ||
150 | #define HIFN_PUCNFG_DRAM 0x0010 /* Context RAM is DRAM */ | ||
151 | #define HIFN_PUCNFG_SRAM 0x0000 /* Context RAM is SRAM */ | ||
152 | #define HIFN_PUCNFG_COMPSING 0x0004 /* Enable single compression context */ | ||
153 | #define HIFN_PUCNFG_ENCCNFG 0x0002 /* Encryption configuration */ | ||
154 | |||
155 | /* Processing Unit Interrupt Enable Register (HIFN_0_PUIER) */ | ||
156 | #define HIFN_PUIER_CMDINVAL 0x8000 /* Invalid command interrupt */ | ||
157 | #define HIFN_PUIER_DATAERR 0x4000 /* Data error interrupt */ | ||
158 | #define HIFN_PUIER_SRCFIFO 0x2000 /* Source FIFO ready interrupt */ | ||
159 | #define HIFN_PUIER_DSTFIFO 0x1000 /* Destination FIFO ready interrupt */ | ||
160 | #define HIFN_PUIER_DSTOVER 0x0200 /* Destination overrun interrupt */ | ||
161 | #define HIFN_PUIER_SRCCMD 0x0080 /* Source command interrupt */ | ||
162 | #define HIFN_PUIER_SRCCTX 0x0040 /* Source context interrupt */ | ||
163 | #define HIFN_PUIER_SRCDATA 0x0020 /* Source data interrupt */ | ||
164 | #define HIFN_PUIER_DSTDATA 0x0010 /* Destination data interrupt */ | ||
165 | #define HIFN_PUIER_DSTRESULT 0x0004 /* Destination result interrupt */ | ||
166 | |||
167 | /* Processing Unit Status Register/Chip ID (HIFN_0_PUSTAT) */ | ||
168 | #define HIFN_PUSTAT_CMDINVAL 0x8000 /* Invalid command interrupt */ | ||
169 | #define HIFN_PUSTAT_DATAERR 0x4000 /* Data error interrupt */ | ||
170 | #define HIFN_PUSTAT_SRCFIFO 0x2000 /* Source FIFO ready interrupt */ | ||
171 | #define HIFN_PUSTAT_DSTFIFO 0x1000 /* Destination FIFO ready interrupt */ | ||
172 | #define HIFN_PUSTAT_DSTOVER 0x0200 /* Destination overrun interrupt */ | ||
173 | #define HIFN_PUSTAT_SRCCMD 0x0080 /* Source command interrupt */ | ||
174 | #define HIFN_PUSTAT_SRCCTX 0x0040 /* Source context interrupt */ | ||
175 | #define HIFN_PUSTAT_SRCDATA 0x0020 /* Source data interrupt */ | ||
176 | #define HIFN_PUSTAT_DSTDATA 0x0010 /* Destination data interrupt */ | ||
177 | #define HIFN_PUSTAT_DSTRESULT 0x0004 /* Destination result interrupt */ | ||
178 | #define HIFN_PUSTAT_CHIPREV 0x00ff /* Chip revision mask */ | ||
179 | #define HIFN_PUSTAT_CHIPENA 0xff00 /* Chip enabled mask */ | ||
180 | #define HIFN_PUSTAT_ENA_2 0x1100 /* Level 2 enabled */ | ||
181 | #define HIFN_PUSTAT_ENA_1 0x1000 /* Level 1 enabled */ | ||
182 | #define HIFN_PUSTAT_ENA_0 0x3000 /* Level 0 enabled */ | ||
183 | #define HIFN_PUSTAT_REV_2 0x0020 /* 7751 PT6/2 */ | ||
184 | #define HIFN_PUSTAT_REV_3 0x0030 /* 7751 PT6/3 */ | ||
185 | |||
186 | /* FIFO Status Register (HIFN_0_FIFOSTAT) */ | ||
187 | #define HIFN_FIFOSTAT_SRC 0x7f00 /* Source FIFO available */ | ||
188 | #define HIFN_FIFOSTAT_DST 0x007f /* Destination FIFO available */ | ||
189 | |||
190 | /* FIFO Configuration Register (HIFN_0_FIFOCNFG) */ | ||
191 | #define HIFN_FIFOCNFG_THRESHOLD 0x0400 /* must be written as 1 */ | ||
192 | |||
193 | /* | ||
194 | * DMA Interface Registers (offset from BASEREG1) | ||
195 | */ | ||
196 | #define HIFN_1_DMA_CRAR 0x0c /* DMA Command Ring Address */ | ||
197 | #define HIFN_1_DMA_SRAR 0x1c /* DMA Source Ring Address */ | ||
198 | #define HIFN_1_DMA_RRAR 0x2c /* DMA Result Ring Address */ | ||
199 | #define HIFN_1_DMA_DRAR 0x3c /* DMA Destination Ring Address */ | ||
200 | #define HIFN_1_DMA_CSR 0x40 /* DMA Status and Control */ | ||
201 | #define HIFN_1_DMA_IER 0x44 /* DMA Interrupt Enable */ | ||
202 | #define HIFN_1_DMA_CNFG 0x48 /* DMA Configuration */ | ||
203 | #define HIFN_1_PLL 0x4c /* 795x: PLL config */ | ||
204 | #define HIFN_1_7811_RNGENA 0x60 /* 7811: rng enable */ | ||
205 | #define HIFN_1_7811_RNGCFG 0x64 /* 7811: rng config */ | ||
206 | #define HIFN_1_7811_RNGDAT 0x68 /* 7811: rng data */ | ||
207 | #define HIFN_1_7811_RNGSTS 0x6c /* 7811: rng status */ | ||
208 | #define HIFN_1_7811_MIPSRST 0x94 /* 7811: MIPS reset */ | ||
209 | #define HIFN_1_REVID 0x98 /* Revision ID */ | ||
210 | #define HIFN_1_UNLOCK_SECRET1 0xf4 | ||
211 | #define HIFN_1_UNLOCK_SECRET2 0xfc | ||
212 | #define HIFN_1_PUB_RESET 0x204 /* Public/RNG Reset */ | ||
213 | #define HIFN_1_PUB_BASE 0x300 /* Public Base Address */ | ||
214 | #define HIFN_1_PUB_OPLEN 0x304 /* Public Operand Length */ | ||
215 | #define HIFN_1_PUB_OP 0x308 /* Public Operand */ | ||
216 | #define HIFN_1_PUB_STATUS 0x30c /* Public Status */ | ||
217 | #define HIFN_1_PUB_IEN 0x310 /* Public Interrupt enable */ | ||
218 | #define HIFN_1_RNG_CONFIG 0x314 /* RNG config */ | ||
219 | #define HIFN_1_RNG_DATA 0x318 /* RNG data */ | ||
220 | #define HIFN_1_PUB_MEM 0x400 /* start of Public key memory */ | ||
221 | #define HIFN_1_PUB_MEMEND 0xbff /* end of Public key memory */ | ||
222 | |||
223 | /* DMA Status and Control Register (HIFN_1_DMA_CSR) */ | ||
224 | #define HIFN_DMACSR_D_CTRLMASK 0xc0000000 /* Destinition Ring Control */ | ||
225 | #define HIFN_DMACSR_D_CTRL_NOP 0x00000000 /* Dest. Control: no-op */ | ||
226 | #define HIFN_DMACSR_D_CTRL_DIS 0x40000000 /* Dest. Control: disable */ | ||
227 | #define HIFN_DMACSR_D_CTRL_ENA 0x80000000 /* Dest. Control: enable */ | ||
228 | #define HIFN_DMACSR_D_ABORT 0x20000000 /* Destinition Ring PCIAbort */ | ||
229 | #define HIFN_DMACSR_D_DONE 0x10000000 /* Destinition Ring Done */ | ||
230 | #define HIFN_DMACSR_D_LAST 0x08000000 /* Destinition Ring Last */ | ||
231 | #define HIFN_DMACSR_D_WAIT 0x04000000 /* Destinition Ring Waiting */ | ||
232 | #define HIFN_DMACSR_D_OVER 0x02000000 /* Destinition Ring Overflow */ | ||
233 | #define HIFN_DMACSR_R_CTRL 0x00c00000 /* Result Ring Control */ | ||
234 | #define HIFN_DMACSR_R_CTRL_NOP 0x00000000 /* Result Control: no-op */ | ||
235 | #define HIFN_DMACSR_R_CTRL_DIS 0x00400000 /* Result Control: disable */ | ||
236 | #define HIFN_DMACSR_R_CTRL_ENA 0x00800000 /* Result Control: enable */ | ||
237 | #define HIFN_DMACSR_R_ABORT 0x00200000 /* Result Ring PCI Abort */ | ||
238 | #define HIFN_DMACSR_R_DONE 0x00100000 /* Result Ring Done */ | ||
239 | #define HIFN_DMACSR_R_LAST 0x00080000 /* Result Ring Last */ | ||
240 | #define HIFN_DMACSR_R_WAIT 0x00040000 /* Result Ring Waiting */ | ||
241 | #define HIFN_DMACSR_R_OVER 0x00020000 /* Result Ring Overflow */ | ||
242 | #define HIFN_DMACSR_S_CTRL 0x0000c000 /* Source Ring Control */ | ||
243 | #define HIFN_DMACSR_S_CTRL_NOP 0x00000000 /* Source Control: no-op */ | ||
244 | #define HIFN_DMACSR_S_CTRL_DIS 0x00004000 /* Source Control: disable */ | ||
245 | #define HIFN_DMACSR_S_CTRL_ENA 0x00008000 /* Source Control: enable */ | ||
246 | #define HIFN_DMACSR_S_ABORT 0x00002000 /* Source Ring PCI Abort */ | ||
247 | #define HIFN_DMACSR_S_DONE 0x00001000 /* Source Ring Done */ | ||
248 | #define HIFN_DMACSR_S_LAST 0x00000800 /* Source Ring Last */ | ||
249 | #define HIFN_DMACSR_S_WAIT 0x00000400 /* Source Ring Waiting */ | ||
250 | #define HIFN_DMACSR_ILLW 0x00000200 /* Illegal write (7811 only) */ | ||
251 | #define HIFN_DMACSR_ILLR 0x00000100 /* Illegal read (7811 only) */ | ||
252 | #define HIFN_DMACSR_C_CTRL 0x000000c0 /* Command Ring Control */ | ||
253 | #define HIFN_DMACSR_C_CTRL_NOP 0x00000000 /* Command Control: no-op */ | ||
254 | #define HIFN_DMACSR_C_CTRL_DIS 0x00000040 /* Command Control: disable */ | ||
255 | #define HIFN_DMACSR_C_CTRL_ENA 0x00000080 /* Command Control: enable */ | ||
256 | #define HIFN_DMACSR_C_ABORT 0x00000020 /* Command Ring PCI Abort */ | ||
257 | #define HIFN_DMACSR_C_DONE 0x00000010 /* Command Ring Done */ | ||
258 | #define HIFN_DMACSR_C_LAST 0x00000008 /* Command Ring Last */ | ||
259 | #define HIFN_DMACSR_C_WAIT 0x00000004 /* Command Ring Waiting */ | ||
260 | #define HIFN_DMACSR_PUBDONE 0x00000002 /* Public op done (7951 only) */ | ||
261 | #define HIFN_DMACSR_ENGINE 0x00000001 /* Command Ring Engine IRQ */ | ||
262 | |||
263 | /* DMA Interrupt Enable Register (HIFN_1_DMA_IER) */ | ||
264 | #define HIFN_DMAIER_D_ABORT 0x20000000 /* Destination Ring PCIAbort */ | ||
265 | #define HIFN_DMAIER_D_DONE 0x10000000 /* Destination Ring Done */ | ||
266 | #define HIFN_DMAIER_D_LAST 0x08000000 /* Destination Ring Last */ | ||
267 | #define HIFN_DMAIER_D_WAIT 0x04000000 /* Destination Ring Waiting */ | ||
268 | #define HIFN_DMAIER_D_OVER 0x02000000 /* Destination Ring Overflow */ | ||
269 | #define HIFN_DMAIER_R_ABORT 0x00200000 /* Result Ring PCI Abort */ | ||
270 | #define HIFN_DMAIER_R_DONE 0x00100000 /* Result Ring Done */ | ||
271 | #define HIFN_DMAIER_R_LAST 0x00080000 /* Result Ring Last */ | ||
272 | #define HIFN_DMAIER_R_WAIT 0x00040000 /* Result Ring Waiting */ | ||
273 | #define HIFN_DMAIER_R_OVER 0x00020000 /* Result Ring Overflow */ | ||
274 | #define HIFN_DMAIER_S_ABORT 0x00002000 /* Source Ring PCI Abort */ | ||
275 | #define HIFN_DMAIER_S_DONE 0x00001000 /* Source Ring Done */ | ||
276 | #define HIFN_DMAIER_S_LAST 0x00000800 /* Source Ring Last */ | ||
277 | #define HIFN_DMAIER_S_WAIT 0x00000400 /* Source Ring Waiting */ | ||
278 | #define HIFN_DMAIER_ILLW 0x00000200 /* Illegal write (7811 only) */ | ||
279 | #define HIFN_DMAIER_ILLR 0x00000100 /* Illegal read (7811 only) */ | ||
280 | #define HIFN_DMAIER_C_ABORT 0x00000020 /* Command Ring PCI Abort */ | ||
281 | #define HIFN_DMAIER_C_DONE 0x00000010 /* Command Ring Done */ | ||
282 | #define HIFN_DMAIER_C_LAST 0x00000008 /* Command Ring Last */ | ||
283 | #define HIFN_DMAIER_C_WAIT 0x00000004 /* Command Ring Waiting */ | ||
284 | #define HIFN_DMAIER_PUBDONE 0x00000002 /* public op done (7951 only) */ | ||
285 | #define HIFN_DMAIER_ENGINE 0x00000001 /* Engine IRQ */ | ||
286 | |||
287 | /* DMA Configuration Register (HIFN_1_DMA_CNFG) */ | ||
288 | #define HIFN_DMACNFG_BIGENDIAN 0x10000000 /* big endian mode */ | ||
289 | #define HIFN_DMACNFG_POLLFREQ 0x00ff0000 /* Poll frequency mask */ | ||
290 | #define HIFN_DMACNFG_UNLOCK 0x00000800 | ||
291 | #define HIFN_DMACNFG_POLLINVAL 0x00000700 /* Invalid Poll Scalar */ | ||
292 | #define HIFN_DMACNFG_LAST 0x00000010 /* Host control LAST bit */ | ||
293 | #define HIFN_DMACNFG_MODE 0x00000004 /* DMA mode */ | ||
294 | #define HIFN_DMACNFG_DMARESET 0x00000002 /* DMA Reset # */ | ||
295 | #define HIFN_DMACNFG_MSTRESET 0x00000001 /* Master Reset # */ | ||
296 | |||
297 | /* PLL configuration register */ | ||
298 | #define HIFN_PLL_REF_CLK_HBI 0x00000000 /* HBI reference clock */ | ||
299 | #define HIFN_PLL_REF_CLK_PLL 0x00000001 /* PLL reference clock */ | ||
300 | #define HIFN_PLL_BP 0x00000002 /* Reference clock bypass */ | ||
301 | #define HIFN_PLL_PK_CLK_HBI 0x00000000 /* PK engine HBI clock */ | ||
302 | #define HIFN_PLL_PK_CLK_PLL 0x00000008 /* PK engine PLL clock */ | ||
303 | #define HIFN_PLL_PE_CLK_HBI 0x00000000 /* PE engine HBI clock */ | ||
304 | #define HIFN_PLL_PE_CLK_PLL 0x00000010 /* PE engine PLL clock */ | ||
305 | #define HIFN_PLL_RESERVED_1 0x00000400 /* Reserved bit, must be 1 */ | ||
306 | #define HIFN_PLL_ND_SHIFT 11 /* Clock multiplier shift */ | ||
307 | #define HIFN_PLL_ND_MULT_2 0x00000000 /* PLL clock multiplier 2 */ | ||
308 | #define HIFN_PLL_ND_MULT_4 0x00000800 /* PLL clock multiplier 4 */ | ||
309 | #define HIFN_PLL_ND_MULT_6 0x00001000 /* PLL clock multiplier 6 */ | ||
310 | #define HIFN_PLL_ND_MULT_8 0x00001800 /* PLL clock multiplier 8 */ | ||
311 | #define HIFN_PLL_ND_MULT_10 0x00002000 /* PLL clock multiplier 10 */ | ||
312 | #define HIFN_PLL_ND_MULT_12 0x00002800 /* PLL clock multiplier 12 */ | ||
313 | #define HIFN_PLL_IS_1_8 0x00000000 /* charge pump (mult. 1-8) */ | ||
314 | #define HIFN_PLL_IS_9_12 0x00010000 /* charge pump (mult. 9-12) */ | ||
315 | |||
316 | #define HIFN_PLL_FCK_MAX 266 /* Maximum PLL frequency */ | ||
317 | |||
318 | /* Public key reset register (HIFN_1_PUB_RESET) */ | ||
319 | #define HIFN_PUBRST_RESET 0x00000001 /* reset public/rng unit */ | ||
320 | |||
321 | /* Public base address register (HIFN_1_PUB_BASE) */ | ||
322 | #define HIFN_PUBBASE_ADDR 0x00003fff /* base address */ | ||
323 | |||
324 | /* Public operand length register (HIFN_1_PUB_OPLEN) */ | ||
325 | #define HIFN_PUBOPLEN_MOD_M 0x0000007f /* modulus length mask */ | ||
326 | #define HIFN_PUBOPLEN_MOD_S 0 /* modulus length shift */ | ||
327 | #define HIFN_PUBOPLEN_EXP_M 0x0003ff80 /* exponent length mask */ | ||
328 | #define HIFN_PUBOPLEN_EXP_S 7 /* exponent lenght shift */ | ||
329 | #define HIFN_PUBOPLEN_RED_M 0x003c0000 /* reducend length mask */ | ||
330 | #define HIFN_PUBOPLEN_RED_S 18 /* reducend length shift */ | ||
331 | |||
332 | /* Public operation register (HIFN_1_PUB_OP) */ | ||
333 | #define HIFN_PUBOP_AOFFSET_M 0x0000007f /* A offset mask */ | ||
334 | #define HIFN_PUBOP_AOFFSET_S 0 /* A offset shift */ | ||
335 | #define HIFN_PUBOP_BOFFSET_M 0x00000f80 /* B offset mask */ | ||
336 | #define HIFN_PUBOP_BOFFSET_S 7 /* B offset shift */ | ||
337 | #define HIFN_PUBOP_MOFFSET_M 0x0003f000 /* M offset mask */ | ||
338 | #define HIFN_PUBOP_MOFFSET_S 12 /* M offset shift */ | ||
339 | #define HIFN_PUBOP_OP_MASK 0x003c0000 /* Opcode: */ | ||
340 | #define HIFN_PUBOP_OP_NOP 0x00000000 /* NOP */ | ||
341 | #define HIFN_PUBOP_OP_ADD 0x00040000 /* ADD */ | ||
342 | #define HIFN_PUBOP_OP_ADDC 0x00080000 /* ADD w/carry */ | ||
343 | #define HIFN_PUBOP_OP_SUB 0x000c0000 /* SUB */ | ||
344 | #define HIFN_PUBOP_OP_SUBC 0x00100000 /* SUB w/carry */ | ||
345 | #define HIFN_PUBOP_OP_MODADD 0x00140000 /* Modular ADD */ | ||
346 | #define HIFN_PUBOP_OP_MODSUB 0x00180000 /* Modular SUB */ | ||
347 | #define HIFN_PUBOP_OP_INCA 0x001c0000 /* INC A */ | ||
348 | #define HIFN_PUBOP_OP_DECA 0x00200000 /* DEC A */ | ||
349 | #define HIFN_PUBOP_OP_MULT 0x00240000 /* MULT */ | ||
350 | #define HIFN_PUBOP_OP_MODMULT 0x00280000 /* Modular MULT */ | ||
351 | #define HIFN_PUBOP_OP_MODRED 0x002c0000 /* Modular RED */ | ||
352 | #define HIFN_PUBOP_OP_MODEXP 0x00300000 /* Modular EXP */ | ||
353 | |||
354 | /* Public status register (HIFN_1_PUB_STATUS) */ | ||
355 | #define HIFN_PUBSTS_DONE 0x00000001 /* operation done */ | ||
356 | #define HIFN_PUBSTS_CARRY 0x00000002 /* carry */ | ||
357 | |||
358 | /* Public interrupt enable register (HIFN_1_PUB_IEN) */ | ||
359 | #define HIFN_PUBIEN_DONE 0x00000001 /* operation done interrupt */ | ||
360 | |||
361 | /* Random number generator config register (HIFN_1_RNG_CONFIG) */ | ||
362 | #define HIFN_RNGCFG_ENA 0x00000001 /* enable rng */ | ||
363 | |||
364 | #define HIFN_NAMESIZE 32 | ||
365 | #define HIFN_MAX_RESULT_ORDER 5 | ||
366 | |||
367 | #define HIFN_D_CMD_RSIZE 24*4 | ||
368 | #define HIFN_D_SRC_RSIZE 80*4 | ||
369 | #define HIFN_D_DST_RSIZE 80*4 | ||
370 | #define HIFN_D_RES_RSIZE 24*4 | ||
371 | |||
372 | #define HIFN_QUEUE_LENGTH HIFN_D_CMD_RSIZE-5 | ||
373 | |||
374 | #define AES_MIN_KEY_SIZE 16 | ||
375 | #define AES_MAX_KEY_SIZE 32 | ||
376 | |||
377 | #define HIFN_DES_KEY_LENGTH 8 | ||
378 | #define HIFN_3DES_KEY_LENGTH 24 | ||
379 | #define HIFN_MAX_CRYPT_KEY_LENGTH AES_MAX_KEY_SIZE | ||
380 | #define HIFN_IV_LENGTH 8 | ||
381 | #define HIFN_AES_IV_LENGTH 16 | ||
382 | #define HIFN_MAX_IV_LENGTH HIFN_AES_IV_LENGTH | ||
383 | |||
384 | #define HIFN_MAC_KEY_LENGTH 64 | ||
385 | #define HIFN_MD5_LENGTH 16 | ||
386 | #define HIFN_SHA1_LENGTH 20 | ||
387 | #define HIFN_MAC_TRUNC_LENGTH 12 | ||
388 | |||
389 | #define HIFN_MAX_COMMAND (8 + 8 + 8 + 64 + 260) | ||
390 | #define HIFN_MAX_RESULT (8 + 4 + 4 + 20 + 4) | ||
391 | #define HIFN_USED_RESULT 12 | ||
392 | |||
393 | struct hifn_desc | ||
394 | { | ||
395 | volatile u32 l; | ||
396 | volatile u32 p; | ||
397 | }; | ||
398 | |||
399 | struct hifn_dma { | ||
400 | struct hifn_desc cmdr[HIFN_D_CMD_RSIZE+1]; | ||
401 | struct hifn_desc srcr[HIFN_D_SRC_RSIZE+1]; | ||
402 | struct hifn_desc dstr[HIFN_D_DST_RSIZE+1]; | ||
403 | struct hifn_desc resr[HIFN_D_RES_RSIZE+1]; | ||
404 | |||
405 | u8 command_bufs[HIFN_D_CMD_RSIZE][HIFN_MAX_COMMAND]; | ||
406 | u8 result_bufs[HIFN_D_CMD_RSIZE][HIFN_MAX_RESULT]; | ||
407 | |||
408 | u64 test_src, test_dst; | ||
409 | |||
410 | /* | ||
411 | * Our current positions for insertion and removal from the descriptor | ||
412 | * rings. | ||
413 | */ | ||
414 | volatile int cmdi, srci, dsti, resi; | ||
415 | volatile int cmdu, srcu, dstu, resu; | ||
416 | int cmdk, srck, dstk, resk; | ||
417 | }; | ||
418 | |||
419 | #define HIFN_FLAG_CMD_BUSY (1<<0) | ||
420 | #define HIFN_FLAG_SRC_BUSY (1<<1) | ||
421 | #define HIFN_FLAG_DST_BUSY (1<<2) | ||
422 | #define HIFN_FLAG_RES_BUSY (1<<3) | ||
423 | #define HIFN_FLAG_OLD_KEY (1<<4) | ||
424 | |||
425 | #define HIFN_DEFAULT_ACTIVE_NUM 5 | ||
426 | |||
427 | struct hifn_device | ||
428 | { | ||
429 | char name[HIFN_NAMESIZE]; | ||
430 | |||
431 | int irq; | ||
432 | |||
433 | struct pci_dev *pdev; | ||
434 | void __iomem *bar[3]; | ||
435 | |||
436 | unsigned long result_mem; | ||
437 | dma_addr_t dst; | ||
438 | |||
439 | void *desc_virt; | ||
440 | dma_addr_t desc_dma; | ||
441 | |||
442 | u32 dmareg; | ||
443 | |||
444 | void *sa[HIFN_D_RES_RSIZE]; | ||
445 | |||
446 | spinlock_t lock; | ||
447 | |||
448 | void *priv; | ||
449 | |||
450 | u32 flags; | ||
451 | int active, started; | ||
452 | struct delayed_work work; | ||
453 | unsigned long reset; | ||
454 | unsigned long success; | ||
455 | unsigned long prev_success; | ||
456 | |||
457 | u8 snum; | ||
458 | |||
459 | struct tasklet_struct tasklet; | ||
460 | |||
461 | struct crypto_queue queue; | ||
462 | struct list_head alg_list; | ||
463 | |||
464 | unsigned int pk_clk_freq; | ||
465 | |||
466 | #if defined(CONFIG_HW_RANDOM) || defined(CONFIG_HW_RANDOM_MODULE) | ||
467 | unsigned int rng_wait_time; | ||
468 | ktime_t rngtime; | ||
469 | struct hwrng rng; | ||
470 | #endif | ||
471 | }; | ||
472 | |||
473 | #define HIFN_D_LENGTH 0x0000ffff | ||
474 | #define HIFN_D_NOINVALID 0x01000000 | ||
475 | #define HIFN_D_MASKDONEIRQ 0x02000000 | ||
476 | #define HIFN_D_DESTOVER 0x04000000 | ||
477 | #define HIFN_D_OVER 0x08000000 | ||
478 | #define HIFN_D_LAST 0x20000000 | ||
479 | #define HIFN_D_JUMP 0x40000000 | ||
480 | #define HIFN_D_VALID 0x80000000 | ||
481 | |||
482 | struct hifn_base_command | ||
483 | { | ||
484 | volatile u16 masks; | ||
485 | volatile u16 session_num; | ||
486 | volatile u16 total_source_count; | ||
487 | volatile u16 total_dest_count; | ||
488 | }; | ||
489 | |||
490 | #define HIFN_BASE_CMD_COMP 0x0100 /* enable compression engine */ | ||
491 | #define HIFN_BASE_CMD_PAD 0x0200 /* enable padding engine */ | ||
492 | #define HIFN_BASE_CMD_MAC 0x0400 /* enable MAC engine */ | ||
493 | #define HIFN_BASE_CMD_CRYPT 0x0800 /* enable crypt engine */ | ||
494 | #define HIFN_BASE_CMD_DECODE 0x2000 | ||
495 | #define HIFN_BASE_CMD_SRCLEN_M 0xc000 | ||
496 | #define HIFN_BASE_CMD_SRCLEN_S 14 | ||
497 | #define HIFN_BASE_CMD_DSTLEN_M 0x3000 | ||
498 | #define HIFN_BASE_CMD_DSTLEN_S 12 | ||
499 | #define HIFN_BASE_CMD_LENMASK_HI 0x30000 | ||
500 | #define HIFN_BASE_CMD_LENMASK_LO 0x0ffff | ||
501 | |||
502 | /* | ||
503 | * Structure to help build up the command data structure. | ||
504 | */ | ||
505 | struct hifn_crypt_command | ||
506 | { | ||
507 | volatile u16 masks; | ||
508 | volatile u16 header_skip; | ||
509 | volatile u16 source_count; | ||
510 | volatile u16 reserved; | ||
511 | }; | ||
512 | |||
513 | #define HIFN_CRYPT_CMD_ALG_MASK 0x0003 /* algorithm: */ | ||
514 | #define HIFN_CRYPT_CMD_ALG_DES 0x0000 /* DES */ | ||
515 | #define HIFN_CRYPT_CMD_ALG_3DES 0x0001 /* 3DES */ | ||
516 | #define HIFN_CRYPT_CMD_ALG_RC4 0x0002 /* RC4 */ | ||
517 | #define HIFN_CRYPT_CMD_ALG_AES 0x0003 /* AES */ | ||
518 | #define HIFN_CRYPT_CMD_MODE_MASK 0x0018 /* Encrypt mode: */ | ||
519 | #define HIFN_CRYPT_CMD_MODE_ECB 0x0000 /* ECB */ | ||
520 | #define HIFN_CRYPT_CMD_MODE_CBC 0x0008 /* CBC */ | ||
521 | #define HIFN_CRYPT_CMD_MODE_CFB 0x0010 /* CFB */ | ||
522 | #define HIFN_CRYPT_CMD_MODE_OFB 0x0018 /* OFB */ | ||
523 | #define HIFN_CRYPT_CMD_CLR_CTX 0x0040 /* clear context */ | ||
524 | #define HIFN_CRYPT_CMD_KSZ_MASK 0x0600 /* AES key size: */ | ||
525 | #define HIFN_CRYPT_CMD_KSZ_128 0x0000 /* 128 bit */ | ||
526 | #define HIFN_CRYPT_CMD_KSZ_192 0x0200 /* 192 bit */ | ||
527 | #define HIFN_CRYPT_CMD_KSZ_256 0x0400 /* 256 bit */ | ||
528 | #define HIFN_CRYPT_CMD_NEW_KEY 0x0800 /* expect new key */ | ||
529 | #define HIFN_CRYPT_CMD_NEW_IV 0x1000 /* expect new iv */ | ||
530 | #define HIFN_CRYPT_CMD_SRCLEN_M 0xc000 | ||
531 | #define HIFN_CRYPT_CMD_SRCLEN_S 14 | ||
532 | |||
533 | /* | ||
534 | * Structure to help build up the command data structure. | ||
535 | */ | ||
536 | struct hifn_mac_command | ||
537 | { | ||
538 | volatile u16 masks; | ||
539 | volatile u16 header_skip; | ||
540 | volatile u16 source_count; | ||
541 | volatile u16 reserved; | ||
542 | }; | ||
543 | |||
544 | #define HIFN_MAC_CMD_ALG_MASK 0x0001 | ||
545 | #define HIFN_MAC_CMD_ALG_SHA1 0x0000 | ||
546 | #define HIFN_MAC_CMD_ALG_MD5 0x0001 | ||
547 | #define HIFN_MAC_CMD_MODE_MASK 0x000c | ||
548 | #define HIFN_MAC_CMD_MODE_HMAC 0x0000 | ||
549 | #define HIFN_MAC_CMD_MODE_SSL_MAC 0x0004 | ||
550 | #define HIFN_MAC_CMD_MODE_HASH 0x0008 | ||
551 | #define HIFN_MAC_CMD_MODE_FULL 0x0004 | ||
552 | #define HIFN_MAC_CMD_TRUNC 0x0010 | ||
553 | #define HIFN_MAC_CMD_RESULT 0x0020 | ||
554 | #define HIFN_MAC_CMD_APPEND 0x0040 | ||
555 | #define HIFN_MAC_CMD_SRCLEN_M 0xc000 | ||
556 | #define HIFN_MAC_CMD_SRCLEN_S 14 | ||
557 | |||
558 | /* | ||
559 | * MAC POS IPsec initiates authentication after encryption on encodes | ||
560 | * and before decryption on decodes. | ||
561 | */ | ||
562 | #define HIFN_MAC_CMD_POS_IPSEC 0x0200 | ||
563 | #define HIFN_MAC_CMD_NEW_KEY 0x0800 | ||
564 | |||
565 | struct hifn_comp_command | ||
566 | { | ||
567 | volatile u16 masks; | ||
568 | volatile u16 header_skip; | ||
569 | volatile u16 source_count; | ||
570 | volatile u16 reserved; | ||
571 | }; | ||
572 | |||
573 | #define HIFN_COMP_CMD_SRCLEN_M 0xc000 | ||
574 | #define HIFN_COMP_CMD_SRCLEN_S 14 | ||
575 | #define HIFN_COMP_CMD_ONE 0x0100 /* must be one */ | ||
576 | #define HIFN_COMP_CMD_CLEARHIST 0x0010 /* clear history */ | ||
577 | #define HIFN_COMP_CMD_UPDATEHIST 0x0008 /* update history */ | ||
578 | #define HIFN_COMP_CMD_LZS_STRIP0 0x0004 /* LZS: strip zero */ | ||
579 | #define HIFN_COMP_CMD_MPPC_RESTART 0x0004 /* MPPC: restart */ | ||
580 | #define HIFN_COMP_CMD_ALG_MASK 0x0001 /* compression mode: */ | ||
581 | #define HIFN_COMP_CMD_ALG_MPPC 0x0001 /* MPPC */ | ||
582 | #define HIFN_COMP_CMD_ALG_LZS 0x0000 /* LZS */ | ||
583 | |||
584 | struct hifn_base_result | ||
585 | { | ||
586 | volatile u16 flags; | ||
587 | volatile u16 session; | ||
588 | volatile u16 src_cnt; /* 15:0 of source count */ | ||
589 | volatile u16 dst_cnt; /* 15:0 of dest count */ | ||
590 | }; | ||
591 | |||
592 | #define HIFN_BASE_RES_DSTOVERRUN 0x0200 /* destination overrun */ | ||
593 | #define HIFN_BASE_RES_SRCLEN_M 0xc000 /* 17:16 of source count */ | ||
594 | #define HIFN_BASE_RES_SRCLEN_S 14 | ||
595 | #define HIFN_BASE_RES_DSTLEN_M 0x3000 /* 17:16 of dest count */ | ||
596 | #define HIFN_BASE_RES_DSTLEN_S 12 | ||
597 | |||
598 | struct hifn_comp_result | ||
599 | { | ||
600 | volatile u16 flags; | ||
601 | volatile u16 crc; | ||
602 | }; | ||
603 | |||
604 | #define HIFN_COMP_RES_LCB_M 0xff00 /* longitudinal check byte */ | ||
605 | #define HIFN_COMP_RES_LCB_S 8 | ||
606 | #define HIFN_COMP_RES_RESTART 0x0004 /* MPPC: restart */ | ||
607 | #define HIFN_COMP_RES_ENDMARKER 0x0002 /* LZS: end marker seen */ | ||
608 | #define HIFN_COMP_RES_SRC_NOTZERO 0x0001 /* source expired */ | ||
609 | |||
610 | struct hifn_mac_result | ||
611 | { | ||
612 | volatile u16 flags; | ||
613 | volatile u16 reserved; | ||
614 | /* followed by 0, 6, 8, or 10 u16's of the MAC, then crypt */ | ||
615 | }; | ||
616 | |||
617 | #define HIFN_MAC_RES_MISCOMPARE 0x0002 /* compare failed */ | ||
618 | #define HIFN_MAC_RES_SRC_NOTZERO 0x0001 /* source expired */ | ||
619 | |||
620 | struct hifn_crypt_result | ||
621 | { | ||
622 | volatile u16 flags; | ||
623 | volatile u16 reserved; | ||
624 | }; | ||
625 | |||
626 | #define HIFN_CRYPT_RES_SRC_NOTZERO 0x0001 /* source expired */ | ||
627 | |||
628 | #ifndef HIFN_POLL_FREQUENCY | ||
629 | #define HIFN_POLL_FREQUENCY 0x1 | ||
630 | #endif | ||
631 | |||
632 | #ifndef HIFN_POLL_SCALAR | ||
633 | #define HIFN_POLL_SCALAR 0x0 | ||
634 | #endif | ||
635 | |||
636 | #define HIFN_MAX_SEGLEN 0xffff /* maximum dma segment len */ | ||
637 | #define HIFN_MAX_DMALEN 0x3ffff /* maximum dma length */ | ||
638 | |||
639 | struct hifn_crypto_alg | ||
640 | { | ||
641 | struct list_head entry; | ||
642 | struct crypto_alg alg; | ||
643 | struct hifn_device *dev; | ||
644 | }; | ||
645 | |||
646 | #define ASYNC_SCATTERLIST_CACHE 16 | ||
647 | |||
648 | #define ASYNC_FLAGS_MISALIGNED (1<<0) | ||
649 | |||
650 | struct ablkcipher_walk | ||
651 | { | ||
652 | struct scatterlist cache[ASYNC_SCATTERLIST_CACHE]; | ||
653 | u32 flags; | ||
654 | int num; | ||
655 | }; | ||
656 | |||
657 | struct hifn_context | ||
658 | { | ||
659 | u8 key[HIFN_MAX_CRYPT_KEY_LENGTH], *iv; | ||
660 | struct hifn_device *dev; | ||
661 | unsigned int keysize, ivsize; | ||
662 | u8 op, type, mode, unused; | ||
663 | struct ablkcipher_walk walk; | ||
664 | atomic_t sg_num; | ||
665 | }; | ||
666 | |||
667 | #define crypto_alg_to_hifn(a) container_of(a, struct hifn_crypto_alg, alg) | ||
668 | |||
669 | static inline u32 hifn_read_0(struct hifn_device *dev, u32 reg) | ||
670 | { | ||
671 | u32 ret; | ||
672 | |||
673 | ret = readl((char *)(dev->bar[0]) + reg); | ||
674 | |||
675 | return ret; | ||
676 | } | ||
677 | |||
678 | static inline u32 hifn_read_1(struct hifn_device *dev, u32 reg) | ||
679 | { | ||
680 | u32 ret; | ||
681 | |||
682 | ret = readl((char *)(dev->bar[1]) + reg); | ||
683 | |||
684 | return ret; | ||
685 | } | ||
686 | |||
687 | static inline void hifn_write_0(struct hifn_device *dev, u32 reg, u32 val) | ||
688 | { | ||
689 | writel(val, (char *)(dev->bar[0]) + reg); | ||
690 | } | ||
691 | |||
692 | static inline void hifn_write_1(struct hifn_device *dev, u32 reg, u32 val) | ||
693 | { | ||
694 | writel(val, (char *)(dev->bar[1]) + reg); | ||
695 | } | ||
696 | |||
697 | static void hifn_wait_puc(struct hifn_device *dev) | ||
698 | { | ||
699 | int i; | ||
700 | u32 ret; | ||
701 | |||
702 | for (i=10000; i > 0; --i) { | ||
703 | ret = hifn_read_0(dev, HIFN_0_PUCTRL); | ||
704 | if (!(ret & HIFN_PUCTRL_RESET)) | ||
705 | break; | ||
706 | |||
707 | udelay(1); | ||
708 | } | ||
709 | |||
710 | if (!i) | ||
711 | dprintk("%s: Failed to reset PUC unit.\n", dev->name); | ||
712 | } | ||
713 | |||
714 | static void hifn_reset_puc(struct hifn_device *dev) | ||
715 | { | ||
716 | hifn_write_0(dev, HIFN_0_PUCTRL, HIFN_PUCTRL_DMAENA); | ||
717 | hifn_wait_puc(dev); | ||
718 | } | ||
719 | |||
720 | static void hifn_stop_device(struct hifn_device *dev) | ||
721 | { | ||
722 | hifn_write_1(dev, HIFN_1_DMA_CSR, | ||
723 | HIFN_DMACSR_D_CTRL_DIS | HIFN_DMACSR_R_CTRL_DIS | | ||
724 | HIFN_DMACSR_S_CTRL_DIS | HIFN_DMACSR_C_CTRL_DIS); | ||
725 | hifn_write_0(dev, HIFN_0_PUIER, 0); | ||
726 | hifn_write_1(dev, HIFN_1_DMA_IER, 0); | ||
727 | } | ||
728 | |||
729 | static void hifn_reset_dma(struct hifn_device *dev, int full) | ||
730 | { | ||
731 | hifn_stop_device(dev); | ||
732 | |||
733 | /* | ||
734 | * Setting poll frequency and others to 0. | ||
735 | */ | ||
736 | hifn_write_1(dev, HIFN_1_DMA_CNFG, HIFN_DMACNFG_MSTRESET | | ||
737 | HIFN_DMACNFG_DMARESET | HIFN_DMACNFG_MODE); | ||
738 | mdelay(1); | ||
739 | |||
740 | /* | ||
741 | * Reset DMA. | ||
742 | */ | ||
743 | if (full) { | ||
744 | hifn_write_1(dev, HIFN_1_DMA_CNFG, HIFN_DMACNFG_MODE); | ||
745 | mdelay(1); | ||
746 | } else { | ||
747 | hifn_write_1(dev, HIFN_1_DMA_CNFG, HIFN_DMACNFG_MODE | | ||
748 | HIFN_DMACNFG_MSTRESET); | ||
749 | hifn_reset_puc(dev); | ||
750 | } | ||
751 | |||
752 | hifn_write_1(dev, HIFN_1_DMA_CNFG, HIFN_DMACNFG_MSTRESET | | ||
753 | HIFN_DMACNFG_DMARESET | HIFN_DMACNFG_MODE); | ||
754 | |||
755 | hifn_reset_puc(dev); | ||
756 | } | ||
757 | |||
758 | static u32 hifn_next_signature(u_int32_t a, u_int cnt) | ||
759 | { | ||
760 | int i; | ||
761 | u32 v; | ||
762 | |||
763 | for (i = 0; i < cnt; i++) { | ||
764 | |||
765 | /* get the parity */ | ||
766 | v = a & 0x80080125; | ||
767 | v ^= v >> 16; | ||
768 | v ^= v >> 8; | ||
769 | v ^= v >> 4; | ||
770 | v ^= v >> 2; | ||
771 | v ^= v >> 1; | ||
772 | |||
773 | a = (v & 1) ^ (a << 1); | ||
774 | } | ||
775 | |||
776 | return a; | ||
777 | } | ||
778 | |||
779 | static struct pci2id { | ||
780 | u_short pci_vendor; | ||
781 | u_short pci_prod; | ||
782 | char card_id[13]; | ||
783 | } pci2id[] = { | ||
784 | { | ||
785 | PCI_VENDOR_ID_HIFN, | ||
786 | PCI_DEVICE_ID_HIFN_7955, | ||
787 | { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
788 | 0x00, 0x00, 0x00, 0x00, 0x00 } | ||
789 | }, | ||
790 | { | ||
791 | PCI_VENDOR_ID_HIFN, | ||
792 | PCI_DEVICE_ID_HIFN_7956, | ||
793 | { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
794 | 0x00, 0x00, 0x00, 0x00, 0x00 } | ||
795 | } | ||
796 | }; | ||
797 | |||
798 | #if defined(CONFIG_HW_RANDOM) || defined(CONFIG_HW_RANDOM_MODULE) | ||
799 | static int hifn_rng_data_present(struct hwrng *rng, int wait) | ||
800 | { | ||
801 | struct hifn_device *dev = (struct hifn_device *)rng->priv; | ||
802 | s64 nsec; | ||
803 | |||
804 | nsec = ktime_to_ns(ktime_sub(ktime_get(), dev->rngtime)); | ||
805 | nsec -= dev->rng_wait_time; | ||
806 | if (nsec <= 0) | ||
807 | return 1; | ||
808 | if (!wait) | ||
809 | return 0; | ||
810 | ndelay(nsec); | ||
811 | return 1; | ||
812 | } | ||
813 | |||
814 | static int hifn_rng_data_read(struct hwrng *rng, u32 *data) | ||
815 | { | ||
816 | struct hifn_device *dev = (struct hifn_device *)rng->priv; | ||
817 | |||
818 | *data = hifn_read_1(dev, HIFN_1_RNG_DATA); | ||
819 | dev->rngtime = ktime_get(); | ||
820 | return 4; | ||
821 | } | ||
822 | |||
823 | static int hifn_register_rng(struct hifn_device *dev) | ||
824 | { | ||
825 | /* | ||
826 | * We must wait at least 256 Pk_clk cycles between two reads of the rng. | ||
827 | */ | ||
828 | dev->rng_wait_time = DIV_ROUND_UP(NSEC_PER_SEC, dev->pk_clk_freq) * | ||
829 | 256; | ||
830 | |||
831 | dev->rng.name = dev->name; | ||
832 | dev->rng.data_present = hifn_rng_data_present, | ||
833 | dev->rng.data_read = hifn_rng_data_read, | ||
834 | dev->rng.priv = (unsigned long)dev; | ||
835 | |||
836 | return hwrng_register(&dev->rng); | ||
837 | } | ||
838 | |||
839 | static void hifn_unregister_rng(struct hifn_device *dev) | ||
840 | { | ||
841 | hwrng_unregister(&dev->rng); | ||
842 | } | ||
843 | #else | ||
844 | #define hifn_register_rng(dev) 0 | ||
845 | #define hifn_unregister_rng(dev) | ||
846 | #endif | ||
847 | |||
848 | static int hifn_init_pubrng(struct hifn_device *dev) | ||
849 | { | ||
850 | int i; | ||
851 | |||
852 | hifn_write_1(dev, HIFN_1_PUB_RESET, hifn_read_1(dev, HIFN_1_PUB_RESET) | | ||
853 | HIFN_PUBRST_RESET); | ||
854 | |||
855 | for (i=100; i > 0; --i) { | ||
856 | mdelay(1); | ||
857 | |||
858 | if ((hifn_read_1(dev, HIFN_1_PUB_RESET) & HIFN_PUBRST_RESET) == 0) | ||
859 | break; | ||
860 | } | ||
861 | |||
862 | if (!i) | ||
863 | dprintk("Chip %s: Failed to initialise public key engine.\n", | ||
864 | dev->name); | ||
865 | else { | ||
866 | hifn_write_1(dev, HIFN_1_PUB_IEN, HIFN_PUBIEN_DONE); | ||
867 | dev->dmareg |= HIFN_DMAIER_PUBDONE; | ||
868 | hifn_write_1(dev, HIFN_1_DMA_IER, dev->dmareg); | ||
869 | |||
870 | dprintk("Chip %s: Public key engine has been sucessfully " | ||
871 | "initialised.\n", dev->name); | ||
872 | } | ||
873 | |||
874 | /* | ||
875 | * Enable RNG engine. | ||
876 | */ | ||
877 | |||
878 | hifn_write_1(dev, HIFN_1_RNG_CONFIG, | ||
879 | hifn_read_1(dev, HIFN_1_RNG_CONFIG) | HIFN_RNGCFG_ENA); | ||
880 | dprintk("Chip %s: RNG engine has been successfully initialised.\n", | ||
881 | dev->name); | ||
882 | |||
883 | #if defined(CONFIG_HW_RANDOM) || defined(CONFIG_HW_RANDOM_MODULE) | ||
884 | /* First value must be discarded */ | ||
885 | hifn_read_1(dev, HIFN_1_RNG_DATA); | ||
886 | dev->rngtime = ktime_get(); | ||
887 | #endif | ||
888 | return 0; | ||
889 | } | ||
890 | |||
891 | static int hifn_enable_crypto(struct hifn_device *dev) | ||
892 | { | ||
893 | u32 dmacfg, addr; | ||
894 | char *offtbl = NULL; | ||
895 | int i; | ||
896 | |||
897 | for (i = 0; i < sizeof(pci2id)/sizeof(pci2id[0]); i++) { | ||
898 | if (pci2id[i].pci_vendor == dev->pdev->vendor && | ||
899 | pci2id[i].pci_prod == dev->pdev->device) { | ||
900 | offtbl = pci2id[i].card_id; | ||
901 | break; | ||
902 | } | ||
903 | } | ||
904 | |||
905 | if (offtbl == NULL) { | ||
906 | dprintk("Chip %s: Unknown card!\n", dev->name); | ||
907 | return -ENODEV; | ||
908 | } | ||
909 | |||
910 | dmacfg = hifn_read_1(dev, HIFN_1_DMA_CNFG); | ||
911 | |||
912 | hifn_write_1(dev, HIFN_1_DMA_CNFG, | ||
913 | HIFN_DMACNFG_UNLOCK | HIFN_DMACNFG_MSTRESET | | ||
914 | HIFN_DMACNFG_DMARESET | HIFN_DMACNFG_MODE); | ||
915 | mdelay(1); | ||
916 | addr = hifn_read_1(dev, HIFN_1_UNLOCK_SECRET1); | ||
917 | mdelay(1); | ||
918 | hifn_write_1(dev, HIFN_1_UNLOCK_SECRET2, 0); | ||
919 | mdelay(1); | ||
920 | |||
921 | for (i=0; i<12; ++i) { | ||
922 | addr = hifn_next_signature(addr, offtbl[i] + 0x101); | ||
923 | hifn_write_1(dev, HIFN_1_UNLOCK_SECRET2, addr); | ||
924 | |||
925 | mdelay(1); | ||
926 | } | ||
927 | hifn_write_1(dev, HIFN_1_DMA_CNFG, dmacfg); | ||
928 | |||
929 | dprintk("Chip %s: %s.\n", dev->name, pci_name(dev->pdev)); | ||
930 | |||
931 | return 0; | ||
932 | } | ||
933 | |||
934 | static void hifn_init_dma(struct hifn_device *dev) | ||
935 | { | ||
936 | struct hifn_dma *dma = (struct hifn_dma *)dev->desc_virt; | ||
937 | u32 dptr = dev->desc_dma; | ||
938 | int i; | ||
939 | |||
940 | for (i=0; i<HIFN_D_CMD_RSIZE; ++i) | ||
941 | dma->cmdr[i].p = __cpu_to_le32(dptr + | ||
942 | offsetof(struct hifn_dma, command_bufs[i][0])); | ||
943 | for (i=0; i<HIFN_D_RES_RSIZE; ++i) | ||
944 | dma->resr[i].p = __cpu_to_le32(dptr + | ||
945 | offsetof(struct hifn_dma, result_bufs[i][0])); | ||
946 | |||
947 | /* | ||
948 | * Setup LAST descriptors. | ||
949 | */ | ||
950 | dma->cmdr[HIFN_D_CMD_RSIZE].p = __cpu_to_le32(dptr + | ||
951 | offsetof(struct hifn_dma, cmdr[0])); | ||
952 | dma->srcr[HIFN_D_SRC_RSIZE].p = __cpu_to_le32(dptr + | ||
953 | offsetof(struct hifn_dma, srcr[0])); | ||
954 | dma->dstr[HIFN_D_DST_RSIZE].p = __cpu_to_le32(dptr + | ||
955 | offsetof(struct hifn_dma, dstr[0])); | ||
956 | dma->resr[HIFN_D_RES_RSIZE].p = __cpu_to_le32(dptr + | ||
957 | offsetof(struct hifn_dma, resr[0])); | ||
958 | |||
959 | dma->cmdu = dma->srcu = dma->dstu = dma->resu = 0; | ||
960 | dma->cmdi = dma->srci = dma->dsti = dma->resi = 0; | ||
961 | dma->cmdk = dma->srck = dma->dstk = dma->resk = 0; | ||
962 | } | ||
963 | |||
964 | /* | ||
965 | * Initialize the PLL. We need to know the frequency of the reference clock | ||
966 | * to calculate the optimal multiplier. For PCI we assume 66MHz, since that | ||
967 | * allows us to operate without the risk of overclocking the chip. If it | ||
968 | * actually uses 33MHz, the chip will operate at half the speed, this can be | ||
969 | * overriden by specifying the frequency as module parameter (pci33). | ||
970 | * | ||
971 | * Unfortunately the PCI clock is not very suitable since the HIFN needs a | ||
972 | * stable clock and the PCI clock frequency may vary, so the default is the | ||
973 | * external clock. There is no way to find out its frequency, we default to | ||
974 | * 66MHz since according to Mike Ham of HiFn, almost every board in existence | ||
975 | * has an external crystal populated at 66MHz. | ||
976 | */ | ||
977 | static void hifn_init_pll(struct hifn_device *dev) | ||
978 | { | ||
979 | unsigned int freq, m; | ||
980 | u32 pllcfg; | ||
981 | |||
982 | pllcfg = HIFN_1_PLL | HIFN_PLL_RESERVED_1; | ||
983 | |||
984 | if (strncmp(hifn_pll_ref, "ext", 3) == 0) | ||
985 | pllcfg |= HIFN_PLL_REF_CLK_PLL; | ||
986 | else | ||
987 | pllcfg |= HIFN_PLL_REF_CLK_HBI; | ||
988 | |||
989 | if (hifn_pll_ref[3] != '\0') | ||
990 | freq = simple_strtoul(hifn_pll_ref + 3, NULL, 10); | ||
991 | else { | ||
992 | freq = 66; | ||
993 | printk(KERN_INFO "hifn795x: assuming %uMHz clock speed, " | ||
994 | "override with hifn_pll_ref=%.3s<frequency>\n", | ||
995 | freq, hifn_pll_ref); | ||
996 | } | ||
997 | |||
998 | m = HIFN_PLL_FCK_MAX / freq; | ||
999 | |||
1000 | pllcfg |= (m / 2 - 1) << HIFN_PLL_ND_SHIFT; | ||
1001 | if (m <= 8) | ||
1002 | pllcfg |= HIFN_PLL_IS_1_8; | ||
1003 | else | ||
1004 | pllcfg |= HIFN_PLL_IS_9_12; | ||
1005 | |||
1006 | /* Select clock source and enable clock bypass */ | ||
1007 | hifn_write_1(dev, HIFN_1_PLL, pllcfg | | ||
1008 | HIFN_PLL_PK_CLK_HBI | HIFN_PLL_PE_CLK_HBI | HIFN_PLL_BP); | ||
1009 | |||
1010 | /* Let the chip lock to the input clock */ | ||
1011 | mdelay(10); | ||
1012 | |||
1013 | /* Disable clock bypass */ | ||
1014 | hifn_write_1(dev, HIFN_1_PLL, pllcfg | | ||
1015 | HIFN_PLL_PK_CLK_HBI | HIFN_PLL_PE_CLK_HBI); | ||
1016 | |||
1017 | /* Switch the engines to the PLL */ | ||
1018 | hifn_write_1(dev, HIFN_1_PLL, pllcfg | | ||
1019 | HIFN_PLL_PK_CLK_PLL | HIFN_PLL_PE_CLK_PLL); | ||
1020 | |||
1021 | /* | ||
1022 | * The Fpk_clk runs at half the total speed. Its frequency is needed to | ||
1023 | * calculate the minimum time between two reads of the rng. Since 33MHz | ||
1024 | * is actually 33.333... we overestimate the frequency here, resulting | ||
1025 | * in slightly larger intervals. | ||
1026 | */ | ||
1027 | dev->pk_clk_freq = 1000000 * (freq + 1) * m / 2; | ||
1028 | } | ||
1029 | |||
1030 | static void hifn_init_registers(struct hifn_device *dev) | ||
1031 | { | ||
1032 | u32 dptr = dev->desc_dma; | ||
1033 | |||
1034 | /* Initialization magic... */ | ||
1035 | hifn_write_0(dev, HIFN_0_PUCTRL, HIFN_PUCTRL_DMAENA); | ||
1036 | hifn_write_0(dev, HIFN_0_FIFOCNFG, HIFN_FIFOCNFG_THRESHOLD); | ||
1037 | hifn_write_0(dev, HIFN_0_PUIER, HIFN_PUIER_DSTOVER); | ||
1038 | |||
1039 | /* write all 4 ring address registers */ | ||
1040 | hifn_write_1(dev, HIFN_1_DMA_CRAR, __cpu_to_le32(dptr + | ||
1041 | offsetof(struct hifn_dma, cmdr[0]))); | ||
1042 | hifn_write_1(dev, HIFN_1_DMA_SRAR, __cpu_to_le32(dptr + | ||
1043 | offsetof(struct hifn_dma, srcr[0]))); | ||
1044 | hifn_write_1(dev, HIFN_1_DMA_DRAR, __cpu_to_le32(dptr + | ||
1045 | offsetof(struct hifn_dma, dstr[0]))); | ||
1046 | hifn_write_1(dev, HIFN_1_DMA_RRAR, __cpu_to_le32(dptr + | ||
1047 | offsetof(struct hifn_dma, resr[0]))); | ||
1048 | |||
1049 | mdelay(2); | ||
1050 | #if 0 | ||
1051 | hifn_write_1(dev, HIFN_1_DMA_CSR, | ||
1052 | HIFN_DMACSR_D_CTRL_DIS | HIFN_DMACSR_R_CTRL_DIS | | ||
1053 | HIFN_DMACSR_S_CTRL_DIS | HIFN_DMACSR_C_CTRL_DIS | | ||
1054 | HIFN_DMACSR_D_ABORT | HIFN_DMACSR_D_DONE | HIFN_DMACSR_D_LAST | | ||
1055 | HIFN_DMACSR_D_WAIT | HIFN_DMACSR_D_OVER | | ||
1056 | HIFN_DMACSR_R_ABORT | HIFN_DMACSR_R_DONE | HIFN_DMACSR_R_LAST | | ||
1057 | HIFN_DMACSR_R_WAIT | HIFN_DMACSR_R_OVER | | ||
1058 | HIFN_DMACSR_S_ABORT | HIFN_DMACSR_S_DONE | HIFN_DMACSR_S_LAST | | ||
1059 | HIFN_DMACSR_S_WAIT | | ||
1060 | HIFN_DMACSR_C_ABORT | HIFN_DMACSR_C_DONE | HIFN_DMACSR_C_LAST | | ||
1061 | HIFN_DMACSR_C_WAIT | | ||
1062 | HIFN_DMACSR_ENGINE | | ||
1063 | HIFN_DMACSR_PUBDONE); | ||
1064 | #else | ||
1065 | hifn_write_1(dev, HIFN_1_DMA_CSR, | ||
1066 | HIFN_DMACSR_C_CTRL_ENA | HIFN_DMACSR_S_CTRL_ENA | | ||
1067 | HIFN_DMACSR_D_CTRL_ENA | HIFN_DMACSR_R_CTRL_ENA | | ||
1068 | HIFN_DMACSR_D_ABORT | HIFN_DMACSR_D_DONE | HIFN_DMACSR_D_LAST | | ||
1069 | HIFN_DMACSR_D_WAIT | HIFN_DMACSR_D_OVER | | ||
1070 | HIFN_DMACSR_R_ABORT | HIFN_DMACSR_R_DONE | HIFN_DMACSR_R_LAST | | ||
1071 | HIFN_DMACSR_R_WAIT | HIFN_DMACSR_R_OVER | | ||
1072 | HIFN_DMACSR_S_ABORT | HIFN_DMACSR_S_DONE | HIFN_DMACSR_S_LAST | | ||
1073 | HIFN_DMACSR_S_WAIT | | ||
1074 | HIFN_DMACSR_C_ABORT | HIFN_DMACSR_C_DONE | HIFN_DMACSR_C_LAST | | ||
1075 | HIFN_DMACSR_C_WAIT | | ||
1076 | HIFN_DMACSR_ENGINE | | ||
1077 | HIFN_DMACSR_PUBDONE); | ||
1078 | #endif | ||
1079 | hifn_read_1(dev, HIFN_1_DMA_CSR); | ||
1080 | |||
1081 | dev->dmareg |= HIFN_DMAIER_R_DONE | HIFN_DMAIER_C_ABORT | | ||
1082 | HIFN_DMAIER_D_OVER | HIFN_DMAIER_R_OVER | | ||
1083 | HIFN_DMAIER_S_ABORT | HIFN_DMAIER_D_ABORT | HIFN_DMAIER_R_ABORT | | ||
1084 | HIFN_DMAIER_ENGINE; | ||
1085 | dev->dmareg &= ~HIFN_DMAIER_C_WAIT; | ||
1086 | |||
1087 | hifn_write_1(dev, HIFN_1_DMA_IER, dev->dmareg); | ||
1088 | hifn_read_1(dev, HIFN_1_DMA_IER); | ||
1089 | #if 0 | ||
1090 | hifn_write_0(dev, HIFN_0_PUCNFG, HIFN_PUCNFG_ENCCNFG | | ||
1091 | HIFN_PUCNFG_DRFR_128 | HIFN_PUCNFG_TCALLPHASES | | ||
1092 | HIFN_PUCNFG_TCDRVTOTEM | HIFN_PUCNFG_BUS32 | | ||
1093 | HIFN_PUCNFG_DRAM); | ||
1094 | #else | ||
1095 | hifn_write_0(dev, HIFN_0_PUCNFG, 0x10342); | ||
1096 | #endif | ||
1097 | hifn_init_pll(dev); | ||
1098 | |||
1099 | hifn_write_0(dev, HIFN_0_PUISR, HIFN_PUISR_DSTOVER); | ||
1100 | hifn_write_1(dev, HIFN_1_DMA_CNFG, HIFN_DMACNFG_MSTRESET | | ||
1101 | HIFN_DMACNFG_DMARESET | HIFN_DMACNFG_MODE | HIFN_DMACNFG_LAST | | ||
1102 | ((HIFN_POLL_FREQUENCY << 16 ) & HIFN_DMACNFG_POLLFREQ) | | ||
1103 | ((HIFN_POLL_SCALAR << 8) & HIFN_DMACNFG_POLLINVAL)); | ||
1104 | } | ||
1105 | |||
1106 | static int hifn_setup_base_command(struct hifn_device *dev, u8 *buf, | ||
1107 | unsigned dlen, unsigned slen, u16 mask, u8 snum) | ||
1108 | { | ||
1109 | struct hifn_base_command *base_cmd; | ||
1110 | u8 *buf_pos = buf; | ||
1111 | |||
1112 | base_cmd = (struct hifn_base_command *)buf_pos; | ||
1113 | base_cmd->masks = __cpu_to_le16(mask); | ||
1114 | base_cmd->total_source_count = | ||
1115 | __cpu_to_le16(slen & HIFN_BASE_CMD_LENMASK_LO); | ||
1116 | base_cmd->total_dest_count = | ||
1117 | __cpu_to_le16(dlen & HIFN_BASE_CMD_LENMASK_LO); | ||
1118 | |||
1119 | dlen >>= 16; | ||
1120 | slen >>= 16; | ||
1121 | base_cmd->session_num = __cpu_to_le16(snum | | ||
1122 | ((slen << HIFN_BASE_CMD_SRCLEN_S) & HIFN_BASE_CMD_SRCLEN_M) | | ||
1123 | ((dlen << HIFN_BASE_CMD_DSTLEN_S) & HIFN_BASE_CMD_DSTLEN_M)); | ||
1124 | |||
1125 | return sizeof(struct hifn_base_command); | ||
1126 | } | ||
1127 | |||
1128 | static int hifn_setup_crypto_command(struct hifn_device *dev, | ||
1129 | u8 *buf, unsigned dlen, unsigned slen, | ||
1130 | u8 *key, int keylen, u8 *iv, int ivsize, u16 mode) | ||
1131 | { | ||
1132 | struct hifn_dma *dma = (struct hifn_dma *)dev->desc_virt; | ||
1133 | struct hifn_crypt_command *cry_cmd; | ||
1134 | u8 *buf_pos = buf; | ||
1135 | u16 cmd_len; | ||
1136 | |||
1137 | cry_cmd = (struct hifn_crypt_command *)buf_pos; | ||
1138 | |||
1139 | cry_cmd->source_count = __cpu_to_le16(dlen & 0xffff); | ||
1140 | dlen >>= 16; | ||
1141 | cry_cmd->masks = __cpu_to_le16(mode | | ||
1142 | ((dlen << HIFN_CRYPT_CMD_SRCLEN_S) & | ||
1143 | HIFN_CRYPT_CMD_SRCLEN_M)); | ||
1144 | cry_cmd->header_skip = 0; | ||
1145 | cry_cmd->reserved = 0; | ||
1146 | |||
1147 | buf_pos += sizeof(struct hifn_crypt_command); | ||
1148 | |||
1149 | dma->cmdu++; | ||
1150 | if (dma->cmdu > 1) { | ||
1151 | dev->dmareg |= HIFN_DMAIER_C_WAIT; | ||
1152 | hifn_write_1(dev, HIFN_1_DMA_IER, dev->dmareg); | ||
1153 | } | ||
1154 | |||
1155 | if (keylen) { | ||
1156 | memcpy(buf_pos, key, keylen); | ||
1157 | buf_pos += keylen; | ||
1158 | } | ||
1159 | if (ivsize) { | ||
1160 | memcpy(buf_pos, iv, ivsize); | ||
1161 | buf_pos += ivsize; | ||
1162 | } | ||
1163 | |||
1164 | cmd_len = buf_pos - buf; | ||
1165 | |||
1166 | return cmd_len; | ||
1167 | } | ||
1168 | |||
1169 | static int hifn_setup_src_desc(struct hifn_device *dev, struct page *page, | ||
1170 | unsigned int offset, unsigned int size) | ||
1171 | { | ||
1172 | struct hifn_dma *dma = (struct hifn_dma *)dev->desc_virt; | ||
1173 | int idx; | ||
1174 | dma_addr_t addr; | ||
1175 | |||
1176 | addr = pci_map_page(dev->pdev, page, offset, size, PCI_DMA_TODEVICE); | ||
1177 | |||
1178 | idx = dma->srci; | ||
1179 | |||
1180 | dma->srcr[idx].p = __cpu_to_le32(addr); | ||
1181 | dma->srcr[idx].l = __cpu_to_le32(size) | HIFN_D_VALID | | ||
1182 | HIFN_D_MASKDONEIRQ | HIFN_D_NOINVALID | HIFN_D_LAST; | ||
1183 | |||
1184 | if (++idx == HIFN_D_SRC_RSIZE) { | ||
1185 | dma->srcr[idx].l = __cpu_to_le32(HIFN_D_VALID | | ||
1186 | HIFN_D_JUMP | | ||
1187 | HIFN_D_MASKDONEIRQ | HIFN_D_LAST); | ||
1188 | idx = 0; | ||
1189 | } | ||
1190 | |||
1191 | dma->srci = idx; | ||
1192 | dma->srcu++; | ||
1193 | |||
1194 | if (!(dev->flags & HIFN_FLAG_SRC_BUSY)) { | ||
1195 | hifn_write_1(dev, HIFN_1_DMA_CSR, HIFN_DMACSR_S_CTRL_ENA); | ||
1196 | dev->flags |= HIFN_FLAG_SRC_BUSY; | ||
1197 | } | ||
1198 | |||
1199 | return size; | ||
1200 | } | ||
1201 | |||
1202 | static void hifn_setup_res_desc(struct hifn_device *dev) | ||
1203 | { | ||
1204 | struct hifn_dma *dma = (struct hifn_dma *)dev->desc_virt; | ||
1205 | |||
1206 | dma->resr[dma->resi].l = __cpu_to_le32(HIFN_USED_RESULT | | ||
1207 | HIFN_D_VALID | HIFN_D_LAST); | ||
1208 | /* | ||
1209 | * dma->resr[dma->resi].l = __cpu_to_le32(HIFN_MAX_RESULT | HIFN_D_VALID | | ||
1210 | * HIFN_D_LAST | HIFN_D_NOINVALID); | ||
1211 | */ | ||
1212 | |||
1213 | if (++dma->resi == HIFN_D_RES_RSIZE) { | ||
1214 | dma->resr[HIFN_D_RES_RSIZE].l = __cpu_to_le32(HIFN_D_VALID | | ||
1215 | HIFN_D_JUMP | HIFN_D_MASKDONEIRQ | HIFN_D_LAST); | ||
1216 | dma->resi = 0; | ||
1217 | } | ||
1218 | |||
1219 | dma->resu++; | ||
1220 | |||
1221 | if (!(dev->flags & HIFN_FLAG_RES_BUSY)) { | ||
1222 | hifn_write_1(dev, HIFN_1_DMA_CSR, HIFN_DMACSR_R_CTRL_ENA); | ||
1223 | dev->flags |= HIFN_FLAG_RES_BUSY; | ||
1224 | } | ||
1225 | } | ||
1226 | |||
1227 | static void hifn_setup_dst_desc(struct hifn_device *dev, struct page *page, | ||
1228 | unsigned offset, unsigned size) | ||
1229 | { | ||
1230 | struct hifn_dma *dma = (struct hifn_dma *)dev->desc_virt; | ||
1231 | int idx; | ||
1232 | dma_addr_t addr; | ||
1233 | |||
1234 | addr = pci_map_page(dev->pdev, page, offset, size, PCI_DMA_FROMDEVICE); | ||
1235 | |||
1236 | idx = dma->dsti; | ||
1237 | dma->dstr[idx].p = __cpu_to_le32(addr); | ||
1238 | dma->dstr[idx].l = __cpu_to_le32(size | HIFN_D_VALID | | ||
1239 | HIFN_D_MASKDONEIRQ | HIFN_D_NOINVALID | HIFN_D_LAST); | ||
1240 | |||
1241 | if (++idx == HIFN_D_DST_RSIZE) { | ||
1242 | dma->dstr[idx].l = __cpu_to_le32(HIFN_D_VALID | | ||
1243 | HIFN_D_JUMP | HIFN_D_MASKDONEIRQ | | ||
1244 | HIFN_D_LAST | HIFN_D_NOINVALID); | ||
1245 | idx = 0; | ||
1246 | } | ||
1247 | dma->dsti = idx; | ||
1248 | dma->dstu++; | ||
1249 | |||
1250 | if (!(dev->flags & HIFN_FLAG_DST_BUSY)) { | ||
1251 | hifn_write_1(dev, HIFN_1_DMA_CSR, HIFN_DMACSR_D_CTRL_ENA); | ||
1252 | dev->flags |= HIFN_FLAG_DST_BUSY; | ||
1253 | } | ||
1254 | } | ||
1255 | |||
1256 | static int hifn_setup_dma(struct hifn_device *dev, struct page *spage, unsigned int soff, | ||
1257 | struct page *dpage, unsigned int doff, unsigned int nbytes, void *priv, | ||
1258 | struct hifn_context *ctx) | ||
1259 | { | ||
1260 | struct hifn_dma *dma = (struct hifn_dma *)dev->desc_virt; | ||
1261 | int cmd_len, sa_idx; | ||
1262 | u8 *buf, *buf_pos; | ||
1263 | u16 mask; | ||
1264 | |||
1265 | dprintk("%s: spage: %p, soffset: %u, dpage: %p, doffset: %u, nbytes: %u, priv: %p, ctx: %p.\n", | ||
1266 | dev->name, spage, soff, dpage, doff, nbytes, priv, ctx); | ||
1267 | |||
1268 | sa_idx = dma->resi; | ||
1269 | |||
1270 | hifn_setup_src_desc(dev, spage, soff, nbytes); | ||
1271 | |||
1272 | buf_pos = buf = dma->command_bufs[dma->cmdi]; | ||
1273 | |||
1274 | mask = 0; | ||
1275 | switch (ctx->op) { | ||
1276 | case ACRYPTO_OP_DECRYPT: | ||
1277 | mask = HIFN_BASE_CMD_CRYPT | HIFN_BASE_CMD_DECODE; | ||
1278 | break; | ||
1279 | case ACRYPTO_OP_ENCRYPT: | ||
1280 | mask = HIFN_BASE_CMD_CRYPT; | ||
1281 | break; | ||
1282 | case ACRYPTO_OP_HMAC: | ||
1283 | mask = HIFN_BASE_CMD_MAC; | ||
1284 | break; | ||
1285 | default: | ||
1286 | goto err_out; | ||
1287 | } | ||
1288 | |||
1289 | buf_pos += hifn_setup_base_command(dev, buf_pos, nbytes, | ||
1290 | nbytes, mask, dev->snum); | ||
1291 | |||
1292 | if (ctx->op == ACRYPTO_OP_ENCRYPT || ctx->op == ACRYPTO_OP_DECRYPT) { | ||
1293 | u16 md = 0; | ||
1294 | |||
1295 | if (ctx->keysize) | ||
1296 | md |= HIFN_CRYPT_CMD_NEW_KEY; | ||
1297 | if (ctx->iv && ctx->mode != ACRYPTO_MODE_ECB) | ||
1298 | md |= HIFN_CRYPT_CMD_NEW_IV; | ||
1299 | |||
1300 | switch (ctx->mode) { | ||
1301 | case ACRYPTO_MODE_ECB: | ||
1302 | md |= HIFN_CRYPT_CMD_MODE_ECB; | ||
1303 | break; | ||
1304 | case ACRYPTO_MODE_CBC: | ||
1305 | md |= HIFN_CRYPT_CMD_MODE_CBC; | ||
1306 | break; | ||
1307 | case ACRYPTO_MODE_CFB: | ||
1308 | md |= HIFN_CRYPT_CMD_MODE_CFB; | ||
1309 | break; | ||
1310 | case ACRYPTO_MODE_OFB: | ||
1311 | md |= HIFN_CRYPT_CMD_MODE_OFB; | ||
1312 | break; | ||
1313 | default: | ||
1314 | goto err_out; | ||
1315 | } | ||
1316 | |||
1317 | switch (ctx->type) { | ||
1318 | case ACRYPTO_TYPE_AES_128: | ||
1319 | if (ctx->keysize != 16) | ||
1320 | goto err_out; | ||
1321 | md |= HIFN_CRYPT_CMD_KSZ_128 | | ||
1322 | HIFN_CRYPT_CMD_ALG_AES; | ||
1323 | break; | ||
1324 | case ACRYPTO_TYPE_AES_192: | ||
1325 | if (ctx->keysize != 24) | ||
1326 | goto err_out; | ||
1327 | md |= HIFN_CRYPT_CMD_KSZ_192 | | ||
1328 | HIFN_CRYPT_CMD_ALG_AES; | ||
1329 | break; | ||
1330 | case ACRYPTO_TYPE_AES_256: | ||
1331 | if (ctx->keysize != 32) | ||
1332 | goto err_out; | ||
1333 | md |= HIFN_CRYPT_CMD_KSZ_256 | | ||
1334 | HIFN_CRYPT_CMD_ALG_AES; | ||
1335 | break; | ||
1336 | case ACRYPTO_TYPE_3DES: | ||
1337 | if (ctx->keysize != 24) | ||
1338 | goto err_out; | ||
1339 | md |= HIFN_CRYPT_CMD_ALG_3DES; | ||
1340 | break; | ||
1341 | case ACRYPTO_TYPE_DES: | ||
1342 | if (ctx->keysize != 8) | ||
1343 | goto err_out; | ||
1344 | md |= HIFN_CRYPT_CMD_ALG_DES; | ||
1345 | break; | ||
1346 | default: | ||
1347 | goto err_out; | ||
1348 | } | ||
1349 | |||
1350 | buf_pos += hifn_setup_crypto_command(dev, buf_pos, | ||
1351 | nbytes, nbytes, ctx->key, ctx->keysize, | ||
1352 | ctx->iv, ctx->ivsize, md); | ||
1353 | } | ||
1354 | |||
1355 | dev->sa[sa_idx] = priv; | ||
1356 | |||
1357 | cmd_len = buf_pos - buf; | ||
1358 | dma->cmdr[dma->cmdi].l = __cpu_to_le32(cmd_len | HIFN_D_VALID | | ||
1359 | HIFN_D_LAST | HIFN_D_MASKDONEIRQ); | ||
1360 | |||
1361 | if (++dma->cmdi == HIFN_D_CMD_RSIZE) { | ||
1362 | dma->cmdr[dma->cmdi].l = __cpu_to_le32(HIFN_MAX_COMMAND | | ||
1363 | HIFN_D_VALID | HIFN_D_LAST | | ||
1364 | HIFN_D_MASKDONEIRQ | HIFN_D_JUMP); | ||
1365 | dma->cmdi = 0; | ||
1366 | } else | ||
1367 | dma->cmdr[dma->cmdi-1].l |= __cpu_to_le32(HIFN_D_VALID); | ||
1368 | |||
1369 | if (!(dev->flags & HIFN_FLAG_CMD_BUSY)) { | ||
1370 | hifn_write_1(dev, HIFN_1_DMA_CSR, HIFN_DMACSR_C_CTRL_ENA); | ||
1371 | dev->flags |= HIFN_FLAG_CMD_BUSY; | ||
1372 | } | ||
1373 | |||
1374 | hifn_setup_dst_desc(dev, dpage, doff, nbytes); | ||
1375 | hifn_setup_res_desc(dev); | ||
1376 | |||
1377 | return 0; | ||
1378 | |||
1379 | err_out: | ||
1380 | return -EINVAL; | ||
1381 | } | ||
1382 | |||
1383 | static int ablkcipher_walk_init(struct ablkcipher_walk *w, | ||
1384 | int num, gfp_t gfp_flags) | ||
1385 | { | ||
1386 | int i; | ||
1387 | |||
1388 | num = min(ASYNC_SCATTERLIST_CACHE, num); | ||
1389 | sg_init_table(w->cache, num); | ||
1390 | |||
1391 | w->num = 0; | ||
1392 | for (i=0; i<num; ++i) { | ||
1393 | struct page *page = alloc_page(gfp_flags); | ||
1394 | struct scatterlist *s; | ||
1395 | |||
1396 | if (!page) | ||
1397 | break; | ||
1398 | |||
1399 | s = &w->cache[i]; | ||
1400 | |||
1401 | sg_set_page(s, page, PAGE_SIZE, 0); | ||
1402 | w->num++; | ||
1403 | } | ||
1404 | |||
1405 | return i; | ||
1406 | } | ||
1407 | |||
1408 | static void ablkcipher_walk_exit(struct ablkcipher_walk *w) | ||
1409 | { | ||
1410 | int i; | ||
1411 | |||
1412 | for (i=0; i<w->num; ++i) { | ||
1413 | struct scatterlist *s = &w->cache[i]; | ||
1414 | |||
1415 | __free_page(sg_page(s)); | ||
1416 | |||
1417 | s->length = 0; | ||
1418 | } | ||
1419 | |||
1420 | w->num = 0; | ||
1421 | } | ||
1422 | |||
1423 | static int ablkcipher_add(void *daddr, unsigned int *drestp, struct scatterlist *src, | ||
1424 | unsigned int size, unsigned int *nbytesp) | ||
1425 | { | ||
1426 | unsigned int copy, drest = *drestp, nbytes = *nbytesp; | ||
1427 | int idx = 0; | ||
1428 | void *saddr; | ||
1429 | |||
1430 | if (drest < size || size > nbytes) | ||
1431 | return -EINVAL; | ||
1432 | |||
1433 | while (size) { | ||
1434 | copy = min(drest, src->length); | ||
1435 | |||
1436 | saddr = kmap_atomic(sg_page(src), KM_SOFTIRQ1); | ||
1437 | memcpy(daddr, saddr + src->offset, copy); | ||
1438 | kunmap_atomic(saddr, KM_SOFTIRQ1); | ||
1439 | |||
1440 | size -= copy; | ||
1441 | drest -= copy; | ||
1442 | nbytes -= copy; | ||
1443 | daddr += copy; | ||
1444 | |||
1445 | dprintk("%s: copy: %u, size: %u, drest: %u, nbytes: %u.\n", | ||
1446 | __func__, copy, size, drest, nbytes); | ||
1447 | |||
1448 | src++; | ||
1449 | idx++; | ||
1450 | } | ||
1451 | |||
1452 | *nbytesp = nbytes; | ||
1453 | *drestp = drest; | ||
1454 | |||
1455 | return idx; | ||
1456 | } | ||
1457 | |||
1458 | static int ablkcipher_walk(struct ablkcipher_request *req, | ||
1459 | struct ablkcipher_walk *w) | ||
1460 | { | ||
1461 | unsigned blocksize = | ||
1462 | crypto_ablkcipher_blocksize(crypto_ablkcipher_reqtfm(req)); | ||
1463 | unsigned alignmask = | ||
1464 | crypto_ablkcipher_alignmask(crypto_ablkcipher_reqtfm(req)); | ||
1465 | struct scatterlist *src, *dst, *t; | ||
1466 | void *daddr; | ||
1467 | unsigned int nbytes = req->nbytes, offset, copy, diff; | ||
1468 | int idx, tidx, err; | ||
1469 | |||
1470 | tidx = idx = 0; | ||
1471 | offset = 0; | ||
1472 | while (nbytes) { | ||
1473 | if (idx >= w->num && (w->flags & ASYNC_FLAGS_MISALIGNED)) | ||
1474 | return -EINVAL; | ||
1475 | |||
1476 | src = &req->src[idx]; | ||
1477 | dst = &req->dst[idx]; | ||
1478 | |||
1479 | dprintk("\n%s: slen: %u, dlen: %u, soff: %u, doff: %u, offset: %u, " | ||
1480 | "blocksize: %u, nbytes: %u.\n", | ||
1481 | __func__, src->length, dst->length, src->offset, | ||
1482 | dst->offset, offset, blocksize, nbytes); | ||
1483 | |||
1484 | if (src->length & (blocksize - 1) || | ||
1485 | src->offset & (alignmask - 1) || | ||
1486 | dst->length & (blocksize - 1) || | ||
1487 | dst->offset & (alignmask - 1) || | ||
1488 | offset) { | ||
1489 | unsigned slen = src->length - offset; | ||
1490 | unsigned dlen = PAGE_SIZE; | ||
1491 | |||
1492 | t = &w->cache[idx]; | ||
1493 | |||
1494 | daddr = kmap_atomic(sg_page(t), KM_SOFTIRQ0); | ||
1495 | err = ablkcipher_add(daddr, &dlen, src, slen, &nbytes); | ||
1496 | if (err < 0) | ||
1497 | goto err_out_unmap; | ||
1498 | |||
1499 | idx += err; | ||
1500 | |||
1501 | copy = slen & ~(blocksize - 1); | ||
1502 | diff = slen & (blocksize - 1); | ||
1503 | |||
1504 | if (dlen < nbytes) { | ||
1505 | /* | ||
1506 | * Destination page does not have enough space | ||
1507 | * to put there additional blocksized chunk, | ||
1508 | * so we mark that page as containing only | ||
1509 | * blocksize aligned chunks: | ||
1510 | * t->length = (slen & ~(blocksize - 1)); | ||
1511 | * and increase number of bytes to be processed | ||
1512 | * in next chunk: | ||
1513 | * nbytes += diff; | ||
1514 | */ | ||
1515 | nbytes += diff; | ||
1516 | |||
1517 | /* | ||
1518 | * Temporary of course... | ||
1519 | * Kick author if you will catch this one. | ||
1520 | */ | ||
1521 | printk(KERN_ERR "%s: dlen: %u, nbytes: %u," | ||
1522 | "slen: %u, offset: %u.\n", | ||
1523 | __func__, dlen, nbytes, slen, offset); | ||
1524 | printk(KERN_ERR "%s: please contact author to fix this " | ||
1525 | "issue, generally you should not catch " | ||
1526 | "this path under any condition but who " | ||
1527 | "knows how did you use crypto code.\n" | ||
1528 | "Thank you.\n", __func__); | ||
1529 | BUG(); | ||
1530 | } else { | ||
1531 | copy += diff + nbytes; | ||
1532 | |||
1533 | src = &req->src[idx]; | ||
1534 | |||
1535 | err = ablkcipher_add(daddr + slen, &dlen, src, nbytes, &nbytes); | ||
1536 | if (err < 0) | ||
1537 | goto err_out_unmap; | ||
1538 | |||
1539 | idx += err; | ||
1540 | } | ||
1541 | |||
1542 | t->length = copy; | ||
1543 | t->offset = offset; | ||
1544 | |||
1545 | kunmap_atomic(daddr, KM_SOFTIRQ0); | ||
1546 | } else { | ||
1547 | nbytes -= src->length; | ||
1548 | idx++; | ||
1549 | } | ||
1550 | |||
1551 | tidx++; | ||
1552 | } | ||
1553 | |||
1554 | return tidx; | ||
1555 | |||
1556 | err_out_unmap: | ||
1557 | kunmap_atomic(daddr, KM_SOFTIRQ0); | ||
1558 | return err; | ||
1559 | } | ||
1560 | |||
1561 | static int hifn_setup_session(struct ablkcipher_request *req) | ||
1562 | { | ||
1563 | struct hifn_context *ctx = crypto_tfm_ctx(req->base.tfm); | ||
1564 | struct hifn_device *dev = ctx->dev; | ||
1565 | struct page *spage, *dpage; | ||
1566 | unsigned long soff, doff, flags; | ||
1567 | unsigned int nbytes = req->nbytes, idx = 0, len; | ||
1568 | int err = -EINVAL, sg_num; | ||
1569 | struct scatterlist *src, *dst, *t; | ||
1570 | unsigned blocksize = | ||
1571 | crypto_ablkcipher_blocksize(crypto_ablkcipher_reqtfm(req)); | ||
1572 | unsigned alignmask = | ||
1573 | crypto_ablkcipher_alignmask(crypto_ablkcipher_reqtfm(req)); | ||
1574 | |||
1575 | if (ctx->iv && !ctx->ivsize && ctx->mode != ACRYPTO_MODE_ECB) | ||
1576 | goto err_out_exit; | ||
1577 | |||
1578 | ctx->walk.flags = 0; | ||
1579 | |||
1580 | while (nbytes) { | ||
1581 | src = &req->src[idx]; | ||
1582 | dst = &req->dst[idx]; | ||
1583 | |||
1584 | if (src->length & (blocksize - 1) || | ||
1585 | src->offset & (alignmask - 1) || | ||
1586 | dst->length & (blocksize - 1) || | ||
1587 | dst->offset & (alignmask - 1)) { | ||
1588 | ctx->walk.flags |= ASYNC_FLAGS_MISALIGNED; | ||
1589 | } | ||
1590 | |||
1591 | nbytes -= src->length; | ||
1592 | idx++; | ||
1593 | } | ||
1594 | |||
1595 | if (ctx->walk.flags & ASYNC_FLAGS_MISALIGNED) { | ||
1596 | err = ablkcipher_walk_init(&ctx->walk, idx, GFP_ATOMIC); | ||
1597 | if (err < 0) | ||
1598 | return err; | ||
1599 | } | ||
1600 | |||
1601 | nbytes = req->nbytes; | ||
1602 | idx = 0; | ||
1603 | |||
1604 | sg_num = ablkcipher_walk(req, &ctx->walk); | ||
1605 | |||
1606 | atomic_set(&ctx->sg_num, sg_num); | ||
1607 | |||
1608 | spin_lock_irqsave(&dev->lock, flags); | ||
1609 | if (dev->started + sg_num > HIFN_QUEUE_LENGTH) { | ||
1610 | err = -EAGAIN; | ||
1611 | goto err_out; | ||
1612 | } | ||
1613 | |||
1614 | dev->snum++; | ||
1615 | dev->started += sg_num; | ||
1616 | |||
1617 | while (nbytes) { | ||
1618 | src = &req->src[idx]; | ||
1619 | dst = &req->dst[idx]; | ||
1620 | t = &ctx->walk.cache[idx]; | ||
1621 | |||
1622 | if (t->length) { | ||
1623 | spage = dpage = sg_page(t); | ||
1624 | soff = doff = 0; | ||
1625 | len = t->length; | ||
1626 | } else { | ||
1627 | spage = sg_page(src); | ||
1628 | soff = src->offset; | ||
1629 | |||
1630 | dpage = sg_page(dst); | ||
1631 | doff = dst->offset; | ||
1632 | |||
1633 | len = dst->length; | ||
1634 | } | ||
1635 | |||
1636 | idx++; | ||
1637 | |||
1638 | err = hifn_setup_dma(dev, spage, soff, dpage, doff, nbytes, | ||
1639 | req, ctx); | ||
1640 | if (err) | ||
1641 | goto err_out; | ||
1642 | |||
1643 | nbytes -= len; | ||
1644 | } | ||
1645 | |||
1646 | dev->active = HIFN_DEFAULT_ACTIVE_NUM; | ||
1647 | spin_unlock_irqrestore(&dev->lock, flags); | ||
1648 | |||
1649 | return 0; | ||
1650 | |||
1651 | err_out: | ||
1652 | spin_unlock_irqrestore(&dev->lock, flags); | ||
1653 | err_out_exit: | ||
1654 | if (err && printk_ratelimit()) | ||
1655 | dprintk("%s: iv: %p [%d], key: %p [%d], mode: %u, op: %u, " | ||
1656 | "type: %u, err: %d.\n", | ||
1657 | dev->name, ctx->iv, ctx->ivsize, | ||
1658 | ctx->key, ctx->keysize, | ||
1659 | ctx->mode, ctx->op, ctx->type, err); | ||
1660 | |||
1661 | return err; | ||
1662 | } | ||
1663 | |||
1664 | static int hifn_test(struct hifn_device *dev, int encdec, u8 snum) | ||
1665 | { | ||
1666 | int n, err; | ||
1667 | u8 src[16]; | ||
1668 | struct hifn_context ctx; | ||
1669 | u8 fips_aes_ecb_from_zero[16] = { | ||
1670 | 0x66, 0xE9, 0x4B, 0xD4, | ||
1671 | 0xEF, 0x8A, 0x2C, 0x3B, | ||
1672 | 0x88, 0x4C, 0xFA, 0x59, | ||
1673 | 0xCA, 0x34, 0x2B, 0x2E}; | ||
1674 | |||
1675 | memset(src, 0, sizeof(src)); | ||
1676 | memset(ctx.key, 0, sizeof(ctx.key)); | ||
1677 | |||
1678 | ctx.dev = dev; | ||
1679 | ctx.keysize = 16; | ||
1680 | ctx.ivsize = 0; | ||
1681 | ctx.iv = NULL; | ||
1682 | ctx.op = (encdec)?ACRYPTO_OP_ENCRYPT:ACRYPTO_OP_DECRYPT; | ||
1683 | ctx.mode = ACRYPTO_MODE_ECB; | ||
1684 | ctx.type = ACRYPTO_TYPE_AES_128; | ||
1685 | atomic_set(&ctx.sg_num, 1); | ||
1686 | |||
1687 | err = hifn_setup_dma(dev, | ||
1688 | virt_to_page(src), offset_in_page(src), | ||
1689 | virt_to_page(src), offset_in_page(src), | ||
1690 | sizeof(src), NULL, &ctx); | ||
1691 | if (err) | ||
1692 | goto err_out; | ||
1693 | |||
1694 | msleep(200); | ||
1695 | |||
1696 | dprintk("%s: decoded: ", dev->name); | ||
1697 | for (n=0; n<sizeof(src); ++n) | ||
1698 | dprintk("%02x ", src[n]); | ||
1699 | dprintk("\n"); | ||
1700 | dprintk("%s: FIPS : ", dev->name); | ||
1701 | for (n=0; n<sizeof(fips_aes_ecb_from_zero); ++n) | ||
1702 | dprintk("%02x ", fips_aes_ecb_from_zero[n]); | ||
1703 | dprintk("\n"); | ||
1704 | |||
1705 | if (!memcmp(src, fips_aes_ecb_from_zero, sizeof(fips_aes_ecb_from_zero))) { | ||
1706 | printk(KERN_INFO "%s: AES 128 ECB test has been successfully " | ||
1707 | "passed.\n", dev->name); | ||
1708 | return 0; | ||
1709 | } | ||
1710 | |||
1711 | err_out: | ||
1712 | printk(KERN_INFO "%s: AES 128 ECB test has been failed.\n", dev->name); | ||
1713 | return -1; | ||
1714 | } | ||
1715 | |||
1716 | static int hifn_start_device(struct hifn_device *dev) | ||
1717 | { | ||
1718 | int err; | ||
1719 | |||
1720 | hifn_reset_dma(dev, 1); | ||
1721 | |||
1722 | err = hifn_enable_crypto(dev); | ||
1723 | if (err) | ||
1724 | return err; | ||
1725 | |||
1726 | hifn_reset_puc(dev); | ||
1727 | |||
1728 | hifn_init_dma(dev); | ||
1729 | |||
1730 | hifn_init_registers(dev); | ||
1731 | |||
1732 | hifn_init_pubrng(dev); | ||
1733 | |||
1734 | return 0; | ||
1735 | } | ||
1736 | |||
1737 | static int ablkcipher_get(void *saddr, unsigned int *srestp, unsigned int offset, | ||
1738 | struct scatterlist *dst, unsigned int size, unsigned int *nbytesp) | ||
1739 | { | ||
1740 | unsigned int srest = *srestp, nbytes = *nbytesp, copy; | ||
1741 | void *daddr; | ||
1742 | int idx = 0; | ||
1743 | |||
1744 | if (srest < size || size > nbytes) | ||
1745 | return -EINVAL; | ||
1746 | |||
1747 | while (size) { | ||
1748 | |||
1749 | copy = min(dst->length, srest); | ||
1750 | |||
1751 | daddr = kmap_atomic(sg_page(dst), KM_IRQ0); | ||
1752 | memcpy(daddr + dst->offset + offset, saddr, copy); | ||
1753 | kunmap_atomic(daddr, KM_IRQ0); | ||
1754 | |||
1755 | nbytes -= copy; | ||
1756 | size -= copy; | ||
1757 | srest -= copy; | ||
1758 | saddr += copy; | ||
1759 | offset = 0; | ||
1760 | |||
1761 | dprintk("%s: copy: %u, size: %u, srest: %u, nbytes: %u.\n", | ||
1762 | __func__, copy, size, srest, nbytes); | ||
1763 | |||
1764 | dst++; | ||
1765 | idx++; | ||
1766 | } | ||
1767 | |||
1768 | *nbytesp = nbytes; | ||
1769 | *srestp = srest; | ||
1770 | |||
1771 | return idx; | ||
1772 | } | ||
1773 | |||
1774 | static void hifn_process_ready(struct ablkcipher_request *req, int error) | ||
1775 | { | ||
1776 | struct hifn_context *ctx = crypto_tfm_ctx(req->base.tfm); | ||
1777 | struct hifn_device *dev; | ||
1778 | |||
1779 | dprintk("%s: req: %p, ctx: %p.\n", __func__, req, ctx); | ||
1780 | |||
1781 | dev = ctx->dev; | ||
1782 | dprintk("%s: req: %p, started: %d, sg_num: %d.\n", | ||
1783 | __func__, req, dev->started, atomic_read(&ctx->sg_num)); | ||
1784 | |||
1785 | if (--dev->started < 0) | ||
1786 | BUG(); | ||
1787 | |||
1788 | if (atomic_dec_and_test(&ctx->sg_num)) { | ||
1789 | unsigned int nbytes = req->nbytes; | ||
1790 | int idx = 0, err; | ||
1791 | struct scatterlist *dst, *t; | ||
1792 | void *saddr; | ||
1793 | |||
1794 | if (ctx->walk.flags & ASYNC_FLAGS_MISALIGNED) { | ||
1795 | while (nbytes) { | ||
1796 | t = &ctx->walk.cache[idx]; | ||
1797 | dst = &req->dst[idx]; | ||
1798 | |||
1799 | dprintk("\n%s: sg_page(t): %p, t->length: %u, " | ||
1800 | "sg_page(dst): %p, dst->length: %u, " | ||
1801 | "nbytes: %u.\n", | ||
1802 | __func__, sg_page(t), t->length, | ||
1803 | sg_page(dst), dst->length, nbytes); | ||
1804 | |||
1805 | if (!t->length) { | ||
1806 | nbytes -= dst->length; | ||
1807 | idx++; | ||
1808 | continue; | ||
1809 | } | ||
1810 | |||
1811 | saddr = kmap_atomic(sg_page(t), KM_IRQ1); | ||
1812 | |||
1813 | err = ablkcipher_get(saddr, &t->length, t->offset, | ||
1814 | dst, nbytes, &nbytes); | ||
1815 | if (err < 0) { | ||
1816 | kunmap_atomic(saddr, KM_IRQ1); | ||
1817 | break; | ||
1818 | } | ||
1819 | |||
1820 | idx += err; | ||
1821 | kunmap_atomic(saddr, KM_IRQ1); | ||
1822 | } | ||
1823 | |||
1824 | ablkcipher_walk_exit(&ctx->walk); | ||
1825 | } | ||
1826 | |||
1827 | req->base.complete(&req->base, error); | ||
1828 | } | ||
1829 | } | ||
1830 | |||
1831 | static void hifn_check_for_completion(struct hifn_device *dev, int error) | ||
1832 | { | ||
1833 | int i; | ||
1834 | struct hifn_dma *dma = (struct hifn_dma *)dev->desc_virt; | ||
1835 | |||
1836 | for (i=0; i<HIFN_D_RES_RSIZE; ++i) { | ||
1837 | struct hifn_desc *d = &dma->resr[i]; | ||
1838 | |||
1839 | if (!(d->l & __cpu_to_le32(HIFN_D_VALID)) && dev->sa[i]) { | ||
1840 | dev->success++; | ||
1841 | dev->reset = 0; | ||
1842 | hifn_process_ready(dev->sa[i], error); | ||
1843 | dev->sa[i] = NULL; | ||
1844 | } | ||
1845 | |||
1846 | if (d->l & __cpu_to_le32(HIFN_D_DESTOVER | HIFN_D_OVER)) | ||
1847 | if (printk_ratelimit()) | ||
1848 | printk("%s: overflow detected [d: %u, o: %u] " | ||
1849 | "at %d resr: l: %08x, p: %08x.\n", | ||
1850 | dev->name, | ||
1851 | !!(d->l & __cpu_to_le32(HIFN_D_DESTOVER)), | ||
1852 | !!(d->l & __cpu_to_le32(HIFN_D_OVER)), | ||
1853 | i, d->l, d->p); | ||
1854 | } | ||
1855 | } | ||
1856 | |||
1857 | static void hifn_clear_rings(struct hifn_device *dev) | ||
1858 | { | ||
1859 | struct hifn_dma *dma = (struct hifn_dma *)dev->desc_virt; | ||
1860 | int i, u; | ||
1861 | |||
1862 | dprintk("%s: ring cleanup 1: i: %d.%d.%d.%d, u: %d.%d.%d.%d, " | ||
1863 | "k: %d.%d.%d.%d.\n", | ||
1864 | dev->name, | ||
1865 | dma->cmdi, dma->srci, dma->dsti, dma->resi, | ||
1866 | dma->cmdu, dma->srcu, dma->dstu, dma->resu, | ||
1867 | dma->cmdk, dma->srck, dma->dstk, dma->resk); | ||
1868 | |||
1869 | i = dma->resk; u = dma->resu; | ||
1870 | while (u != 0) { | ||
1871 | if (dma->resr[i].l & __cpu_to_le32(HIFN_D_VALID)) | ||
1872 | break; | ||
1873 | |||
1874 | if (i != HIFN_D_RES_RSIZE) | ||
1875 | u--; | ||
1876 | |||
1877 | if (++i == (HIFN_D_RES_RSIZE + 1)) | ||
1878 | i = 0; | ||
1879 | } | ||
1880 | dma->resk = i; dma->resu = u; | ||
1881 | |||
1882 | i = dma->srck; u = dma->srcu; | ||
1883 | while (u != 0) { | ||
1884 | if (i == HIFN_D_SRC_RSIZE) | ||
1885 | i = 0; | ||
1886 | if (dma->srcr[i].l & __cpu_to_le32(HIFN_D_VALID)) | ||
1887 | break; | ||
1888 | i++, u--; | ||
1889 | } | ||
1890 | dma->srck = i; dma->srcu = u; | ||
1891 | |||
1892 | i = dma->cmdk; u = dma->cmdu; | ||
1893 | while (u != 0) { | ||
1894 | if (dma->cmdr[i].l & __cpu_to_le32(HIFN_D_VALID)) | ||
1895 | break; | ||
1896 | if (i != HIFN_D_CMD_RSIZE) | ||
1897 | u--; | ||
1898 | if (++i == (HIFN_D_CMD_RSIZE + 1)) | ||
1899 | i = 0; | ||
1900 | } | ||
1901 | dma->cmdk = i; dma->cmdu = u; | ||
1902 | |||
1903 | i = dma->dstk; u = dma->dstu; | ||
1904 | while (u != 0) { | ||
1905 | if (i == HIFN_D_DST_RSIZE) | ||
1906 | i = 0; | ||
1907 | if (dma->dstr[i].l & __cpu_to_le32(HIFN_D_VALID)) | ||
1908 | break; | ||
1909 | i++, u--; | ||
1910 | } | ||
1911 | dma->dstk = i; dma->dstu = u; | ||
1912 | |||
1913 | dprintk("%s: ring cleanup 2: i: %d.%d.%d.%d, u: %d.%d.%d.%d, " | ||
1914 | "k: %d.%d.%d.%d.\n", | ||
1915 | dev->name, | ||
1916 | dma->cmdi, dma->srci, dma->dsti, dma->resi, | ||
1917 | dma->cmdu, dma->srcu, dma->dstu, dma->resu, | ||
1918 | dma->cmdk, dma->srck, dma->dstk, dma->resk); | ||
1919 | } | ||
1920 | |||
1921 | static void hifn_work(struct work_struct *work) | ||
1922 | { | ||
1923 | struct delayed_work *dw = container_of(work, struct delayed_work, work); | ||
1924 | struct hifn_device *dev = container_of(dw, struct hifn_device, work); | ||
1925 | unsigned long flags; | ||
1926 | int reset = 0; | ||
1927 | u32 r = 0; | ||
1928 | |||
1929 | spin_lock_irqsave(&dev->lock, flags); | ||
1930 | if (dev->active == 0) { | ||
1931 | struct hifn_dma *dma = (struct hifn_dma *)dev->desc_virt; | ||
1932 | |||
1933 | if (dma->cmdu == 0 && (dev->flags & HIFN_FLAG_CMD_BUSY)) { | ||
1934 | dev->flags &= ~HIFN_FLAG_CMD_BUSY; | ||
1935 | r |= HIFN_DMACSR_C_CTRL_DIS; | ||
1936 | } | ||
1937 | if (dma->srcu == 0 && (dev->flags & HIFN_FLAG_SRC_BUSY)) { | ||
1938 | dev->flags &= ~HIFN_FLAG_SRC_BUSY; | ||
1939 | r |= HIFN_DMACSR_S_CTRL_DIS; | ||
1940 | } | ||
1941 | if (dma->dstu == 0 && (dev->flags & HIFN_FLAG_DST_BUSY)) { | ||
1942 | dev->flags &= ~HIFN_FLAG_DST_BUSY; | ||
1943 | r |= HIFN_DMACSR_D_CTRL_DIS; | ||
1944 | } | ||
1945 | if (dma->resu == 0 && (dev->flags & HIFN_FLAG_RES_BUSY)) { | ||
1946 | dev->flags &= ~HIFN_FLAG_RES_BUSY; | ||
1947 | r |= HIFN_DMACSR_R_CTRL_DIS; | ||
1948 | } | ||
1949 | if (r) | ||
1950 | hifn_write_1(dev, HIFN_1_DMA_CSR, r); | ||
1951 | } else | ||
1952 | dev->active--; | ||
1953 | |||
1954 | if (dev->prev_success == dev->success && dev->started) | ||
1955 | reset = 1; | ||
1956 | dev->prev_success = dev->success; | ||
1957 | spin_unlock_irqrestore(&dev->lock, flags); | ||
1958 | |||
1959 | if (reset) { | ||
1960 | dprintk("%s: r: %08x, active: %d, started: %d, " | ||
1961 | "success: %lu: reset: %d.\n", | ||
1962 | dev->name, r, dev->active, dev->started, | ||
1963 | dev->success, reset); | ||
1964 | |||
1965 | if (++dev->reset >= 5) { | ||
1966 | dprintk("%s: really hard reset.\n", dev->name); | ||
1967 | hifn_reset_dma(dev, 1); | ||
1968 | hifn_stop_device(dev); | ||
1969 | hifn_start_device(dev); | ||
1970 | dev->reset = 0; | ||
1971 | } | ||
1972 | |||
1973 | spin_lock_irqsave(&dev->lock, flags); | ||
1974 | hifn_check_for_completion(dev, -EBUSY); | ||
1975 | hifn_clear_rings(dev); | ||
1976 | dev->started = 0; | ||
1977 | spin_unlock_irqrestore(&dev->lock, flags); | ||
1978 | } | ||
1979 | |||
1980 | schedule_delayed_work(&dev->work, HZ); | ||
1981 | } | ||
1982 | |||
1983 | static irqreturn_t hifn_interrupt(int irq, void *data) | ||
1984 | { | ||
1985 | struct hifn_device *dev = (struct hifn_device *)data; | ||
1986 | struct hifn_dma *dma = (struct hifn_dma *)dev->desc_virt; | ||
1987 | u32 dmacsr, restart; | ||
1988 | |||
1989 | dmacsr = hifn_read_1(dev, HIFN_1_DMA_CSR); | ||
1990 | |||
1991 | dprintk("%s: 1 dmacsr: %08x, dmareg: %08x, res: %08x [%d], " | ||
1992 | "i: %d.%d.%d.%d, u: %d.%d.%d.%d.\n", | ||
1993 | dev->name, dmacsr, dev->dmareg, dmacsr & dev->dmareg, dma->cmdi, | ||
1994 | dma->cmdu, dma->srcu, dma->dstu, dma->resu, | ||
1995 | dma->cmdi, dma->srci, dma->dsti, dma->resi); | ||
1996 | |||
1997 | if ((dmacsr & dev->dmareg) == 0) | ||
1998 | return IRQ_NONE; | ||
1999 | |||
2000 | hifn_write_1(dev, HIFN_1_DMA_CSR, dmacsr & dev->dmareg); | ||
2001 | |||
2002 | if (dmacsr & HIFN_DMACSR_ENGINE) | ||
2003 | hifn_write_0(dev, HIFN_0_PUISR, hifn_read_0(dev, HIFN_0_PUISR)); | ||
2004 | if (dmacsr & HIFN_DMACSR_PUBDONE) | ||
2005 | hifn_write_1(dev, HIFN_1_PUB_STATUS, | ||
2006 | hifn_read_1(dev, HIFN_1_PUB_STATUS) | HIFN_PUBSTS_DONE); | ||
2007 | |||
2008 | restart = dmacsr & (HIFN_DMACSR_R_OVER | HIFN_DMACSR_D_OVER); | ||
2009 | if (restart) { | ||
2010 | u32 puisr = hifn_read_0(dev, HIFN_0_PUISR); | ||
2011 | |||
2012 | if (printk_ratelimit()) | ||
2013 | printk("%s: overflow: r: %d, d: %d, puisr: %08x, d: %u.\n", | ||
2014 | dev->name, !!(dmacsr & HIFN_DMACSR_R_OVER), | ||
2015 | !!(dmacsr & HIFN_DMACSR_D_OVER), | ||
2016 | puisr, !!(puisr & HIFN_PUISR_DSTOVER)); | ||
2017 | if (!!(puisr & HIFN_PUISR_DSTOVER)) | ||
2018 | hifn_write_0(dev, HIFN_0_PUISR, HIFN_PUISR_DSTOVER); | ||
2019 | hifn_write_1(dev, HIFN_1_DMA_CSR, dmacsr & (HIFN_DMACSR_R_OVER | | ||
2020 | HIFN_DMACSR_D_OVER)); | ||
2021 | } | ||
2022 | |||
2023 | restart = dmacsr & (HIFN_DMACSR_C_ABORT | HIFN_DMACSR_S_ABORT | | ||
2024 | HIFN_DMACSR_D_ABORT | HIFN_DMACSR_R_ABORT); | ||
2025 | if (restart) { | ||
2026 | if (printk_ratelimit()) | ||
2027 | printk("%s: abort: c: %d, s: %d, d: %d, r: %d.\n", | ||
2028 | dev->name, !!(dmacsr & HIFN_DMACSR_C_ABORT), | ||
2029 | !!(dmacsr & HIFN_DMACSR_S_ABORT), | ||
2030 | !!(dmacsr & HIFN_DMACSR_D_ABORT), | ||
2031 | !!(dmacsr & HIFN_DMACSR_R_ABORT)); | ||
2032 | hifn_reset_dma(dev, 1); | ||
2033 | hifn_init_dma(dev); | ||
2034 | hifn_init_registers(dev); | ||
2035 | } | ||
2036 | |||
2037 | if ((dmacsr & HIFN_DMACSR_C_WAIT) && (dma->cmdu == 0)) { | ||
2038 | dprintk("%s: wait on command.\n", dev->name); | ||
2039 | dev->dmareg &= ~(HIFN_DMAIER_C_WAIT); | ||
2040 | hifn_write_1(dev, HIFN_1_DMA_IER, dev->dmareg); | ||
2041 | } | ||
2042 | |||
2043 | tasklet_schedule(&dev->tasklet); | ||
2044 | hifn_clear_rings(dev); | ||
2045 | |||
2046 | return IRQ_HANDLED; | ||
2047 | } | ||
2048 | |||
2049 | static void hifn_flush(struct hifn_device *dev) | ||
2050 | { | ||
2051 | unsigned long flags; | ||
2052 | struct crypto_async_request *async_req; | ||
2053 | struct hifn_context *ctx; | ||
2054 | struct ablkcipher_request *req; | ||
2055 | struct hifn_dma *dma = (struct hifn_dma *)dev->desc_virt; | ||
2056 | int i; | ||
2057 | |||
2058 | spin_lock_irqsave(&dev->lock, flags); | ||
2059 | for (i=0; i<HIFN_D_RES_RSIZE; ++i) { | ||
2060 | struct hifn_desc *d = &dma->resr[i]; | ||
2061 | |||
2062 | if (dev->sa[i]) { | ||
2063 | hifn_process_ready(dev->sa[i], | ||
2064 | (d->l & __cpu_to_le32(HIFN_D_VALID))?-ENODEV:0); | ||
2065 | } | ||
2066 | } | ||
2067 | |||
2068 | while ((async_req = crypto_dequeue_request(&dev->queue))) { | ||
2069 | ctx = crypto_tfm_ctx(async_req->tfm); | ||
2070 | req = container_of(async_req, struct ablkcipher_request, base); | ||
2071 | |||
2072 | hifn_process_ready(req, -ENODEV); | ||
2073 | } | ||
2074 | spin_unlock_irqrestore(&dev->lock, flags); | ||
2075 | } | ||
2076 | |||
2077 | static int hifn_setkey(struct crypto_ablkcipher *cipher, const u8 *key, | ||
2078 | unsigned int len) | ||
2079 | { | ||
2080 | struct crypto_tfm *tfm = crypto_ablkcipher_tfm(cipher); | ||
2081 | struct hifn_context *ctx = crypto_tfm_ctx(tfm); | ||
2082 | struct hifn_device *dev = ctx->dev; | ||
2083 | |||
2084 | if (len > HIFN_MAX_CRYPT_KEY_LENGTH) { | ||
2085 | crypto_ablkcipher_set_flags(cipher, CRYPTO_TFM_RES_BAD_KEY_LEN); | ||
2086 | return -1; | ||
2087 | } | ||
2088 | |||
2089 | if (len == HIFN_DES_KEY_LENGTH) { | ||
2090 | u32 tmp[DES_EXPKEY_WORDS]; | ||
2091 | int ret = des_ekey(tmp, key); | ||
2092 | |||
2093 | if (unlikely(ret == 0) && (tfm->crt_flags & CRYPTO_TFM_REQ_WEAK_KEY)) { | ||
2094 | tfm->crt_flags |= CRYPTO_TFM_RES_WEAK_KEY; | ||
2095 | return -EINVAL; | ||
2096 | } | ||
2097 | } | ||
2098 | |||
2099 | dev->flags &= ~HIFN_FLAG_OLD_KEY; | ||
2100 | |||
2101 | memcpy(ctx->key, key, len); | ||
2102 | ctx->keysize = len; | ||
2103 | |||
2104 | return 0; | ||
2105 | } | ||
2106 | |||
2107 | static int hifn_handle_req(struct ablkcipher_request *req) | ||
2108 | { | ||
2109 | struct hifn_context *ctx = crypto_tfm_ctx(req->base.tfm); | ||
2110 | struct hifn_device *dev = ctx->dev; | ||
2111 | int err = -EAGAIN; | ||
2112 | |||
2113 | if (dev->started + DIV_ROUND_UP(req->nbytes, PAGE_SIZE) <= HIFN_QUEUE_LENGTH) | ||
2114 | err = hifn_setup_session(req); | ||
2115 | |||
2116 | if (err == -EAGAIN) { | ||
2117 | unsigned long flags; | ||
2118 | |||
2119 | spin_lock_irqsave(&dev->lock, flags); | ||
2120 | err = ablkcipher_enqueue_request(&dev->queue, req); | ||
2121 | spin_unlock_irqrestore(&dev->lock, flags); | ||
2122 | } | ||
2123 | |||
2124 | return err; | ||
2125 | } | ||
2126 | |||
2127 | static int hifn_setup_crypto_req(struct ablkcipher_request *req, u8 op, | ||
2128 | u8 type, u8 mode) | ||
2129 | { | ||
2130 | struct hifn_context *ctx = crypto_tfm_ctx(req->base.tfm); | ||
2131 | unsigned ivsize; | ||
2132 | |||
2133 | ivsize = crypto_ablkcipher_ivsize(crypto_ablkcipher_reqtfm(req)); | ||
2134 | |||
2135 | if (req->info && mode != ACRYPTO_MODE_ECB) { | ||
2136 | if (type == ACRYPTO_TYPE_AES_128) | ||
2137 | ivsize = HIFN_AES_IV_LENGTH; | ||
2138 | else if (type == ACRYPTO_TYPE_DES) | ||
2139 | ivsize = HIFN_DES_KEY_LENGTH; | ||
2140 | else if (type == ACRYPTO_TYPE_3DES) | ||
2141 | ivsize = HIFN_3DES_KEY_LENGTH; | ||
2142 | } | ||
2143 | |||
2144 | if (ctx->keysize != 16 && type == ACRYPTO_TYPE_AES_128) { | ||
2145 | if (ctx->keysize == 24) | ||
2146 | type = ACRYPTO_TYPE_AES_192; | ||
2147 | else if (ctx->keysize == 32) | ||
2148 | type = ACRYPTO_TYPE_AES_256; | ||
2149 | } | ||
2150 | |||
2151 | ctx->op = op; | ||
2152 | ctx->mode = mode; | ||
2153 | ctx->type = type; | ||
2154 | ctx->iv = req->info; | ||
2155 | ctx->ivsize = ivsize; | ||
2156 | |||
2157 | /* | ||
2158 | * HEAVY TODO: needs to kick Herbert XU to write documentation. | ||
2159 | * HEAVY TODO: needs to kick Herbert XU to write documentation. | ||
2160 | * HEAVY TODO: needs to kick Herbert XU to write documentation. | ||
2161 | */ | ||
2162 | |||
2163 | return hifn_handle_req(req); | ||
2164 | } | ||
2165 | |||
2166 | static int hifn_process_queue(struct hifn_device *dev) | ||
2167 | { | ||
2168 | struct crypto_async_request *async_req; | ||
2169 | struct hifn_context *ctx; | ||
2170 | struct ablkcipher_request *req; | ||
2171 | unsigned long flags; | ||
2172 | int err = 0; | ||
2173 | |||
2174 | while (dev->started < HIFN_QUEUE_LENGTH) { | ||
2175 | spin_lock_irqsave(&dev->lock, flags); | ||
2176 | async_req = crypto_dequeue_request(&dev->queue); | ||
2177 | spin_unlock_irqrestore(&dev->lock, flags); | ||
2178 | |||
2179 | if (!async_req) | ||
2180 | break; | ||
2181 | |||
2182 | ctx = crypto_tfm_ctx(async_req->tfm); | ||
2183 | req = container_of(async_req, struct ablkcipher_request, base); | ||
2184 | |||
2185 | err = hifn_handle_req(req); | ||
2186 | if (err) | ||
2187 | break; | ||
2188 | } | ||
2189 | |||
2190 | return err; | ||
2191 | } | ||
2192 | |||
2193 | static int hifn_setup_crypto(struct ablkcipher_request *req, u8 op, | ||
2194 | u8 type, u8 mode) | ||
2195 | { | ||
2196 | int err; | ||
2197 | struct hifn_context *ctx = crypto_tfm_ctx(req->base.tfm); | ||
2198 | struct hifn_device *dev = ctx->dev; | ||
2199 | |||
2200 | err = hifn_setup_crypto_req(req, op, type, mode); | ||
2201 | if (err) | ||
2202 | return err; | ||
2203 | |||
2204 | if (dev->started < HIFN_QUEUE_LENGTH && dev->queue.qlen) | ||
2205 | err = hifn_process_queue(dev); | ||
2206 | |||
2207 | return err; | ||
2208 | } | ||
2209 | |||
2210 | /* | ||
2211 | * AES ecryption functions. | ||
2212 | */ | ||
2213 | static inline int hifn_encrypt_aes_ecb(struct ablkcipher_request *req) | ||
2214 | { | ||
2215 | return hifn_setup_crypto(req, ACRYPTO_OP_ENCRYPT, | ||
2216 | ACRYPTO_TYPE_AES_128, ACRYPTO_MODE_ECB); | ||
2217 | } | ||
2218 | static inline int hifn_encrypt_aes_cbc(struct ablkcipher_request *req) | ||
2219 | { | ||
2220 | return hifn_setup_crypto(req, ACRYPTO_OP_ENCRYPT, | ||
2221 | ACRYPTO_TYPE_AES_128, ACRYPTO_MODE_CBC); | ||
2222 | } | ||
2223 | static inline int hifn_encrypt_aes_cfb(struct ablkcipher_request *req) | ||
2224 | { | ||
2225 | return hifn_setup_crypto(req, ACRYPTO_OP_ENCRYPT, | ||
2226 | ACRYPTO_TYPE_AES_128, ACRYPTO_MODE_CFB); | ||
2227 | } | ||
2228 | static inline int hifn_encrypt_aes_ofb(struct ablkcipher_request *req) | ||
2229 | { | ||
2230 | return hifn_setup_crypto(req, ACRYPTO_OP_ENCRYPT, | ||
2231 | ACRYPTO_TYPE_AES_128, ACRYPTO_MODE_OFB); | ||
2232 | } | ||
2233 | |||
2234 | /* | ||
2235 | * AES decryption functions. | ||
2236 | */ | ||
2237 | static inline int hifn_decrypt_aes_ecb(struct ablkcipher_request *req) | ||
2238 | { | ||
2239 | return hifn_setup_crypto(req, ACRYPTO_OP_DECRYPT, | ||
2240 | ACRYPTO_TYPE_AES_128, ACRYPTO_MODE_ECB); | ||
2241 | } | ||
2242 | static inline int hifn_decrypt_aes_cbc(struct ablkcipher_request *req) | ||
2243 | { | ||
2244 | return hifn_setup_crypto(req, ACRYPTO_OP_DECRYPT, | ||
2245 | ACRYPTO_TYPE_AES_128, ACRYPTO_MODE_CBC); | ||
2246 | } | ||
2247 | static inline int hifn_decrypt_aes_cfb(struct ablkcipher_request *req) | ||
2248 | { | ||
2249 | return hifn_setup_crypto(req, ACRYPTO_OP_DECRYPT, | ||
2250 | ACRYPTO_TYPE_AES_128, ACRYPTO_MODE_CFB); | ||
2251 | } | ||
2252 | static inline int hifn_decrypt_aes_ofb(struct ablkcipher_request *req) | ||
2253 | { | ||
2254 | return hifn_setup_crypto(req, ACRYPTO_OP_DECRYPT, | ||
2255 | ACRYPTO_TYPE_AES_128, ACRYPTO_MODE_OFB); | ||
2256 | } | ||
2257 | |||
2258 | /* | ||
2259 | * DES ecryption functions. | ||
2260 | */ | ||
2261 | static inline int hifn_encrypt_des_ecb(struct ablkcipher_request *req) | ||
2262 | { | ||
2263 | return hifn_setup_crypto(req, ACRYPTO_OP_ENCRYPT, | ||
2264 | ACRYPTO_TYPE_DES, ACRYPTO_MODE_ECB); | ||
2265 | } | ||
2266 | static inline int hifn_encrypt_des_cbc(struct ablkcipher_request *req) | ||
2267 | { | ||
2268 | return hifn_setup_crypto(req, ACRYPTO_OP_ENCRYPT, | ||
2269 | ACRYPTO_TYPE_DES, ACRYPTO_MODE_CBC); | ||
2270 | } | ||
2271 | static inline int hifn_encrypt_des_cfb(struct ablkcipher_request *req) | ||
2272 | { | ||
2273 | return hifn_setup_crypto(req, ACRYPTO_OP_ENCRYPT, | ||
2274 | ACRYPTO_TYPE_DES, ACRYPTO_MODE_CFB); | ||
2275 | } | ||
2276 | static inline int hifn_encrypt_des_ofb(struct ablkcipher_request *req) | ||
2277 | { | ||
2278 | return hifn_setup_crypto(req, ACRYPTO_OP_ENCRYPT, | ||
2279 | ACRYPTO_TYPE_DES, ACRYPTO_MODE_OFB); | ||
2280 | } | ||
2281 | |||
2282 | /* | ||
2283 | * DES decryption functions. | ||
2284 | */ | ||
2285 | static inline int hifn_decrypt_des_ecb(struct ablkcipher_request *req) | ||
2286 | { | ||
2287 | return hifn_setup_crypto(req, ACRYPTO_OP_DECRYPT, | ||
2288 | ACRYPTO_TYPE_DES, ACRYPTO_MODE_ECB); | ||
2289 | } | ||
2290 | static inline int hifn_decrypt_des_cbc(struct ablkcipher_request *req) | ||
2291 | { | ||
2292 | return hifn_setup_crypto(req, ACRYPTO_OP_DECRYPT, | ||
2293 | ACRYPTO_TYPE_DES, ACRYPTO_MODE_CBC); | ||
2294 | } | ||
2295 | static inline int hifn_decrypt_des_cfb(struct ablkcipher_request *req) | ||
2296 | { | ||
2297 | return hifn_setup_crypto(req, ACRYPTO_OP_DECRYPT, | ||
2298 | ACRYPTO_TYPE_DES, ACRYPTO_MODE_CFB); | ||
2299 | } | ||
2300 | static inline int hifn_decrypt_des_ofb(struct ablkcipher_request *req) | ||
2301 | { | ||
2302 | return hifn_setup_crypto(req, ACRYPTO_OP_DECRYPT, | ||
2303 | ACRYPTO_TYPE_DES, ACRYPTO_MODE_OFB); | ||
2304 | } | ||
2305 | |||
2306 | /* | ||
2307 | * 3DES ecryption functions. | ||
2308 | */ | ||
2309 | static inline int hifn_encrypt_3des_ecb(struct ablkcipher_request *req) | ||
2310 | { | ||
2311 | return hifn_setup_crypto(req, ACRYPTO_OP_ENCRYPT, | ||
2312 | ACRYPTO_TYPE_3DES, ACRYPTO_MODE_ECB); | ||
2313 | } | ||
2314 | static inline int hifn_encrypt_3des_cbc(struct ablkcipher_request *req) | ||
2315 | { | ||
2316 | return hifn_setup_crypto(req, ACRYPTO_OP_ENCRYPT, | ||
2317 | ACRYPTO_TYPE_3DES, ACRYPTO_MODE_CBC); | ||
2318 | } | ||
2319 | static inline int hifn_encrypt_3des_cfb(struct ablkcipher_request *req) | ||
2320 | { | ||
2321 | return hifn_setup_crypto(req, ACRYPTO_OP_ENCRYPT, | ||
2322 | ACRYPTO_TYPE_3DES, ACRYPTO_MODE_CFB); | ||
2323 | } | ||
2324 | static inline int hifn_encrypt_3des_ofb(struct ablkcipher_request *req) | ||
2325 | { | ||
2326 | return hifn_setup_crypto(req, ACRYPTO_OP_ENCRYPT, | ||
2327 | ACRYPTO_TYPE_3DES, ACRYPTO_MODE_OFB); | ||
2328 | } | ||
2329 | |||
2330 | /* | ||
2331 | * 3DES decryption functions. | ||
2332 | */ | ||
2333 | static inline int hifn_decrypt_3des_ecb(struct ablkcipher_request *req) | ||
2334 | { | ||
2335 | return hifn_setup_crypto(req, ACRYPTO_OP_DECRYPT, | ||
2336 | ACRYPTO_TYPE_3DES, ACRYPTO_MODE_ECB); | ||
2337 | } | ||
2338 | static inline int hifn_decrypt_3des_cbc(struct ablkcipher_request *req) | ||
2339 | { | ||
2340 | return hifn_setup_crypto(req, ACRYPTO_OP_DECRYPT, | ||
2341 | ACRYPTO_TYPE_3DES, ACRYPTO_MODE_CBC); | ||
2342 | } | ||
2343 | static inline int hifn_decrypt_3des_cfb(struct ablkcipher_request *req) | ||
2344 | { | ||
2345 | return hifn_setup_crypto(req, ACRYPTO_OP_DECRYPT, | ||
2346 | ACRYPTO_TYPE_3DES, ACRYPTO_MODE_CFB); | ||
2347 | } | ||
2348 | static inline int hifn_decrypt_3des_ofb(struct ablkcipher_request *req) | ||
2349 | { | ||
2350 | return hifn_setup_crypto(req, ACRYPTO_OP_DECRYPT, | ||
2351 | ACRYPTO_TYPE_3DES, ACRYPTO_MODE_OFB); | ||
2352 | } | ||
2353 | |||
2354 | struct hifn_alg_template | ||
2355 | { | ||
2356 | char name[CRYPTO_MAX_ALG_NAME]; | ||
2357 | char drv_name[CRYPTO_MAX_ALG_NAME]; | ||
2358 | unsigned int bsize; | ||
2359 | struct ablkcipher_alg ablkcipher; | ||
2360 | }; | ||
2361 | |||
2362 | static struct hifn_alg_template hifn_alg_templates[] = { | ||
2363 | /* | ||
2364 | * 3DES ECB, CBC, CFB and OFB modes. | ||
2365 | */ | ||
2366 | { | ||
2367 | .name = "cfb(des3_ede)", .drv_name = "hifn-3des", .bsize = 8, | ||
2368 | .ablkcipher = { | ||
2369 | .min_keysize = HIFN_3DES_KEY_LENGTH, | ||
2370 | .max_keysize = HIFN_3DES_KEY_LENGTH, | ||
2371 | .setkey = hifn_setkey, | ||
2372 | .encrypt = hifn_encrypt_3des_cfb, | ||
2373 | .decrypt = hifn_decrypt_3des_cfb, | ||
2374 | }, | ||
2375 | }, | ||
2376 | { | ||
2377 | .name = "ofb(des3_ede)", .drv_name = "hifn-3des", .bsize = 8, | ||
2378 | .ablkcipher = { | ||
2379 | .min_keysize = HIFN_3DES_KEY_LENGTH, | ||
2380 | .max_keysize = HIFN_3DES_KEY_LENGTH, | ||
2381 | .setkey = hifn_setkey, | ||
2382 | .encrypt = hifn_encrypt_3des_ofb, | ||
2383 | .decrypt = hifn_decrypt_3des_ofb, | ||
2384 | }, | ||
2385 | }, | ||
2386 | { | ||
2387 | .name = "cbc(des3_ede)", .drv_name = "hifn-3des", .bsize = 8, | ||
2388 | .ablkcipher = { | ||
2389 | .min_keysize = HIFN_3DES_KEY_LENGTH, | ||
2390 | .max_keysize = HIFN_3DES_KEY_LENGTH, | ||
2391 | .setkey = hifn_setkey, | ||
2392 | .encrypt = hifn_encrypt_3des_cbc, | ||
2393 | .decrypt = hifn_decrypt_3des_cbc, | ||
2394 | }, | ||
2395 | }, | ||
2396 | { | ||
2397 | .name = "ecb(des3_ede)", .drv_name = "hifn-3des", .bsize = 8, | ||
2398 | .ablkcipher = { | ||
2399 | .min_keysize = HIFN_3DES_KEY_LENGTH, | ||
2400 | .max_keysize = HIFN_3DES_KEY_LENGTH, | ||
2401 | .setkey = hifn_setkey, | ||
2402 | .encrypt = hifn_encrypt_3des_ecb, | ||
2403 | .decrypt = hifn_decrypt_3des_ecb, | ||
2404 | }, | ||
2405 | }, | ||
2406 | |||
2407 | /* | ||
2408 | * DES ECB, CBC, CFB and OFB modes. | ||
2409 | */ | ||
2410 | { | ||
2411 | .name = "cfb(des)", .drv_name = "hifn-des", .bsize = 8, | ||
2412 | .ablkcipher = { | ||
2413 | .min_keysize = HIFN_DES_KEY_LENGTH, | ||
2414 | .max_keysize = HIFN_DES_KEY_LENGTH, | ||
2415 | .setkey = hifn_setkey, | ||
2416 | .encrypt = hifn_encrypt_des_cfb, | ||
2417 | .decrypt = hifn_decrypt_des_cfb, | ||
2418 | }, | ||
2419 | }, | ||
2420 | { | ||
2421 | .name = "ofb(des)", .drv_name = "hifn-des", .bsize = 8, | ||
2422 | .ablkcipher = { | ||
2423 | .min_keysize = HIFN_DES_KEY_LENGTH, | ||
2424 | .max_keysize = HIFN_DES_KEY_LENGTH, | ||
2425 | .setkey = hifn_setkey, | ||
2426 | .encrypt = hifn_encrypt_des_ofb, | ||
2427 | .decrypt = hifn_decrypt_des_ofb, | ||
2428 | }, | ||
2429 | }, | ||
2430 | { | ||
2431 | .name = "cbc(des)", .drv_name = "hifn-des", .bsize = 8, | ||
2432 | .ablkcipher = { | ||
2433 | .min_keysize = HIFN_DES_KEY_LENGTH, | ||
2434 | .max_keysize = HIFN_DES_KEY_LENGTH, | ||
2435 | .setkey = hifn_setkey, | ||
2436 | .encrypt = hifn_encrypt_des_cbc, | ||
2437 | .decrypt = hifn_decrypt_des_cbc, | ||
2438 | }, | ||
2439 | }, | ||
2440 | { | ||
2441 | .name = "ecb(des)", .drv_name = "hifn-des", .bsize = 8, | ||
2442 | .ablkcipher = { | ||
2443 | .min_keysize = HIFN_DES_KEY_LENGTH, | ||
2444 | .max_keysize = HIFN_DES_KEY_LENGTH, | ||
2445 | .setkey = hifn_setkey, | ||
2446 | .encrypt = hifn_encrypt_des_ecb, | ||
2447 | .decrypt = hifn_decrypt_des_ecb, | ||
2448 | }, | ||
2449 | }, | ||
2450 | |||
2451 | /* | ||
2452 | * AES ECB, CBC, CFB and OFB modes. | ||
2453 | */ | ||
2454 | { | ||
2455 | .name = "ecb(aes)", .drv_name = "hifn-aes", .bsize = 16, | ||
2456 | .ablkcipher = { | ||
2457 | .min_keysize = AES_MIN_KEY_SIZE, | ||
2458 | .max_keysize = AES_MAX_KEY_SIZE, | ||
2459 | .setkey = hifn_setkey, | ||
2460 | .encrypt = hifn_encrypt_aes_ecb, | ||
2461 | .decrypt = hifn_decrypt_aes_ecb, | ||
2462 | }, | ||
2463 | }, | ||
2464 | { | ||
2465 | .name = "cbc(aes)", .drv_name = "hifn-aes", .bsize = 16, | ||
2466 | .ablkcipher = { | ||
2467 | .min_keysize = AES_MIN_KEY_SIZE, | ||
2468 | .max_keysize = AES_MAX_KEY_SIZE, | ||
2469 | .setkey = hifn_setkey, | ||
2470 | .encrypt = hifn_encrypt_aes_cbc, | ||
2471 | .decrypt = hifn_decrypt_aes_cbc, | ||
2472 | }, | ||
2473 | }, | ||
2474 | { | ||
2475 | .name = "cfb(aes)", .drv_name = "hifn-aes", .bsize = 16, | ||
2476 | .ablkcipher = { | ||
2477 | .min_keysize = AES_MIN_KEY_SIZE, | ||
2478 | .max_keysize = AES_MAX_KEY_SIZE, | ||
2479 | .setkey = hifn_setkey, | ||
2480 | .encrypt = hifn_encrypt_aes_cfb, | ||
2481 | .decrypt = hifn_decrypt_aes_cfb, | ||
2482 | }, | ||
2483 | }, | ||
2484 | { | ||
2485 | .name = "ofb(aes)", .drv_name = "hifn-aes", .bsize = 16, | ||
2486 | .ablkcipher = { | ||
2487 | .min_keysize = AES_MIN_KEY_SIZE, | ||
2488 | .max_keysize = AES_MAX_KEY_SIZE, | ||
2489 | .setkey = hifn_setkey, | ||
2490 | .encrypt = hifn_encrypt_aes_ofb, | ||
2491 | .decrypt = hifn_decrypt_aes_ofb, | ||
2492 | }, | ||
2493 | }, | ||
2494 | }; | ||
2495 | |||
2496 | static int hifn_cra_init(struct crypto_tfm *tfm) | ||
2497 | { | ||
2498 | struct crypto_alg *alg = tfm->__crt_alg; | ||
2499 | struct hifn_crypto_alg *ha = crypto_alg_to_hifn(alg); | ||
2500 | struct hifn_context *ctx = crypto_tfm_ctx(tfm); | ||
2501 | |||
2502 | ctx->dev = ha->dev; | ||
2503 | |||
2504 | return 0; | ||
2505 | } | ||
2506 | |||
2507 | static int hifn_alg_alloc(struct hifn_device *dev, struct hifn_alg_template *t) | ||
2508 | { | ||
2509 | struct hifn_crypto_alg *alg; | ||
2510 | int err; | ||
2511 | |||
2512 | alg = kzalloc(sizeof(struct hifn_crypto_alg), GFP_KERNEL); | ||
2513 | if (!alg) | ||
2514 | return -ENOMEM; | ||
2515 | |||
2516 | snprintf(alg->alg.cra_name, CRYPTO_MAX_ALG_NAME, "%s", t->name); | ||
2517 | snprintf(alg->alg.cra_driver_name, CRYPTO_MAX_ALG_NAME, "%s", t->drv_name); | ||
2518 | |||
2519 | alg->alg.cra_priority = 300; | ||
2520 | alg->alg.cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER | CRYPTO_ALG_ASYNC; | ||
2521 | alg->alg.cra_blocksize = t->bsize; | ||
2522 | alg->alg.cra_ctxsize = sizeof(struct hifn_context); | ||
2523 | alg->alg.cra_alignmask = 15; | ||
2524 | if (t->bsize == 8) | ||
2525 | alg->alg.cra_alignmask = 3; | ||
2526 | alg->alg.cra_type = &crypto_ablkcipher_type; | ||
2527 | alg->alg.cra_module = THIS_MODULE; | ||
2528 | alg->alg.cra_u.ablkcipher = t->ablkcipher; | ||
2529 | alg->alg.cra_init = hifn_cra_init; | ||
2530 | |||
2531 | alg->dev = dev; | ||
2532 | |||
2533 | list_add_tail(&alg->entry, &dev->alg_list); | ||
2534 | |||
2535 | err = crypto_register_alg(&alg->alg); | ||
2536 | if (err) { | ||
2537 | list_del(&alg->entry); | ||
2538 | kfree(alg); | ||
2539 | } | ||
2540 | |||
2541 | return err; | ||
2542 | } | ||
2543 | |||
2544 | static void hifn_unregister_alg(struct hifn_device *dev) | ||
2545 | { | ||
2546 | struct hifn_crypto_alg *a, *n; | ||
2547 | |||
2548 | list_for_each_entry_safe(a, n, &dev->alg_list, entry) { | ||
2549 | list_del(&a->entry); | ||
2550 | crypto_unregister_alg(&a->alg); | ||
2551 | kfree(a); | ||
2552 | } | ||
2553 | } | ||
2554 | |||
2555 | static int hifn_register_alg(struct hifn_device *dev) | ||
2556 | { | ||
2557 | int i, err; | ||
2558 | |||
2559 | for (i=0; i<ARRAY_SIZE(hifn_alg_templates); ++i) { | ||
2560 | err = hifn_alg_alloc(dev, &hifn_alg_templates[i]); | ||
2561 | if (err) | ||
2562 | goto err_out_exit; | ||
2563 | } | ||
2564 | |||
2565 | return 0; | ||
2566 | |||
2567 | err_out_exit: | ||
2568 | hifn_unregister_alg(dev); | ||
2569 | return err; | ||
2570 | } | ||
2571 | |||
2572 | static void hifn_tasklet_callback(unsigned long data) | ||
2573 | { | ||
2574 | struct hifn_device *dev = (struct hifn_device *)data; | ||
2575 | |||
2576 | /* | ||
2577 | * This is ok to call this without lock being held, | ||
2578 | * althogh it modifies some parameters used in parallel, | ||
2579 | * (like dev->success), but they are used in process | ||
2580 | * context or update is atomic (like setting dev->sa[i] to NULL). | ||
2581 | */ | ||
2582 | hifn_check_for_completion(dev, 0); | ||
2583 | } | ||
2584 | |||
2585 | static int hifn_probe(struct pci_dev *pdev, const struct pci_device_id *id) | ||
2586 | { | ||
2587 | int err, i; | ||
2588 | struct hifn_device *dev; | ||
2589 | char name[8]; | ||
2590 | |||
2591 | err = pci_enable_device(pdev); | ||
2592 | if (err) | ||
2593 | return err; | ||
2594 | pci_set_master(pdev); | ||
2595 | |||
2596 | err = pci_set_dma_mask(pdev, DMA_32BIT_MASK); | ||
2597 | if (err) | ||
2598 | goto err_out_disable_pci_device; | ||
2599 | |||
2600 | snprintf(name, sizeof(name), "hifn%d", | ||
2601 | atomic_inc_return(&hifn_dev_number)-1); | ||
2602 | |||
2603 | err = pci_request_regions(pdev, name); | ||
2604 | if (err) | ||
2605 | goto err_out_disable_pci_device; | ||
2606 | |||
2607 | if (pci_resource_len(pdev, 0) < HIFN_BAR0_SIZE || | ||
2608 | pci_resource_len(pdev, 1) < HIFN_BAR1_SIZE || | ||
2609 | pci_resource_len(pdev, 2) < HIFN_BAR2_SIZE) { | ||
2610 | dprintk("%s: Broken hardware - I/O regions are too small.\n", | ||
2611 | pci_name(pdev)); | ||
2612 | err = -ENODEV; | ||
2613 | goto err_out_free_regions; | ||
2614 | } | ||
2615 | |||
2616 | dev = kzalloc(sizeof(struct hifn_device) + sizeof(struct crypto_alg), | ||
2617 | GFP_KERNEL); | ||
2618 | if (!dev) { | ||
2619 | err = -ENOMEM; | ||
2620 | goto err_out_free_regions; | ||
2621 | } | ||
2622 | |||
2623 | INIT_LIST_HEAD(&dev->alg_list); | ||
2624 | |||
2625 | snprintf(dev->name, sizeof(dev->name), "%s", name); | ||
2626 | spin_lock_init(&dev->lock); | ||
2627 | |||
2628 | for (i=0; i<3; ++i) { | ||
2629 | unsigned long addr, size; | ||
2630 | |||
2631 | addr = pci_resource_start(pdev, i); | ||
2632 | size = pci_resource_len(pdev, i); | ||
2633 | |||
2634 | dev->bar[i] = ioremap_nocache(addr, size); | ||
2635 | if (!dev->bar[i]) | ||
2636 | goto err_out_unmap_bars; | ||
2637 | } | ||
2638 | |||
2639 | dev->result_mem = __get_free_pages(GFP_KERNEL, HIFN_MAX_RESULT_ORDER); | ||
2640 | if (!dev->result_mem) { | ||
2641 | dprintk("Failed to allocate %d pages for result_mem.\n", | ||
2642 | HIFN_MAX_RESULT_ORDER); | ||
2643 | goto err_out_unmap_bars; | ||
2644 | } | ||
2645 | memset((void *)dev->result_mem, 0, PAGE_SIZE*(1<<HIFN_MAX_RESULT_ORDER)); | ||
2646 | |||
2647 | dev->dst = pci_map_single(pdev, (void *)dev->result_mem, | ||
2648 | PAGE_SIZE << HIFN_MAX_RESULT_ORDER, PCI_DMA_FROMDEVICE); | ||
2649 | |||
2650 | dev->desc_virt = pci_alloc_consistent(pdev, sizeof(struct hifn_dma), | ||
2651 | &dev->desc_dma); | ||
2652 | if (!dev->desc_virt) { | ||
2653 | dprintk("Failed to allocate descriptor rings.\n"); | ||
2654 | goto err_out_free_result_pages; | ||
2655 | } | ||
2656 | memset(dev->desc_virt, 0, sizeof(struct hifn_dma)); | ||
2657 | |||
2658 | dev->pdev = pdev; | ||
2659 | dev->irq = pdev->irq; | ||
2660 | |||
2661 | for (i=0; i<HIFN_D_RES_RSIZE; ++i) | ||
2662 | dev->sa[i] = NULL; | ||
2663 | |||
2664 | pci_set_drvdata(pdev, dev); | ||
2665 | |||
2666 | tasklet_init(&dev->tasklet, hifn_tasklet_callback, (unsigned long)dev); | ||
2667 | |||
2668 | crypto_init_queue(&dev->queue, 1); | ||
2669 | |||
2670 | err = request_irq(dev->irq, hifn_interrupt, IRQF_SHARED, dev->name, dev); | ||
2671 | if (err) { | ||
2672 | dprintk("Failed to request IRQ%d: err: %d.\n", dev->irq, err); | ||
2673 | dev->irq = 0; | ||
2674 | goto err_out_free_desc; | ||
2675 | } | ||
2676 | |||
2677 | err = hifn_start_device(dev); | ||
2678 | if (err) | ||
2679 | goto err_out_free_irq; | ||
2680 | |||
2681 | err = hifn_test(dev, 1, 0); | ||
2682 | if (err) | ||
2683 | goto err_out_stop_device; | ||
2684 | |||
2685 | err = hifn_register_rng(dev); | ||
2686 | if (err) | ||
2687 | goto err_out_stop_device; | ||
2688 | |||
2689 | err = hifn_register_alg(dev); | ||
2690 | if (err) | ||
2691 | goto err_out_unregister_rng; | ||
2692 | |||
2693 | INIT_DELAYED_WORK(&dev->work, hifn_work); | ||
2694 | schedule_delayed_work(&dev->work, HZ); | ||
2695 | |||
2696 | dprintk("HIFN crypto accelerator card at %s has been " | ||
2697 | "successfully registered as %s.\n", | ||
2698 | pci_name(pdev), dev->name); | ||
2699 | |||
2700 | return 0; | ||
2701 | |||
2702 | err_out_unregister_rng: | ||
2703 | hifn_unregister_rng(dev); | ||
2704 | err_out_stop_device: | ||
2705 | hifn_reset_dma(dev, 1); | ||
2706 | hifn_stop_device(dev); | ||
2707 | err_out_free_irq: | ||
2708 | free_irq(dev->irq, dev->name); | ||
2709 | tasklet_kill(&dev->tasklet); | ||
2710 | err_out_free_desc: | ||
2711 | pci_free_consistent(pdev, sizeof(struct hifn_dma), | ||
2712 | dev->desc_virt, dev->desc_dma); | ||
2713 | |||
2714 | err_out_free_result_pages: | ||
2715 | pci_unmap_single(pdev, dev->dst, PAGE_SIZE << HIFN_MAX_RESULT_ORDER, | ||
2716 | PCI_DMA_FROMDEVICE); | ||
2717 | free_pages(dev->result_mem, HIFN_MAX_RESULT_ORDER); | ||
2718 | |||
2719 | err_out_unmap_bars: | ||
2720 | for (i=0; i<3; ++i) | ||
2721 | if (dev->bar[i]) | ||
2722 | iounmap(dev->bar[i]); | ||
2723 | |||
2724 | err_out_free_regions: | ||
2725 | pci_release_regions(pdev); | ||
2726 | |||
2727 | err_out_disable_pci_device: | ||
2728 | pci_disable_device(pdev); | ||
2729 | |||
2730 | return err; | ||
2731 | } | ||
2732 | |||
2733 | static void hifn_remove(struct pci_dev *pdev) | ||
2734 | { | ||
2735 | int i; | ||
2736 | struct hifn_device *dev; | ||
2737 | |||
2738 | dev = pci_get_drvdata(pdev); | ||
2739 | |||
2740 | if (dev) { | ||
2741 | cancel_delayed_work(&dev->work); | ||
2742 | flush_scheduled_work(); | ||
2743 | |||
2744 | hifn_unregister_rng(dev); | ||
2745 | hifn_unregister_alg(dev); | ||
2746 | hifn_reset_dma(dev, 1); | ||
2747 | hifn_stop_device(dev); | ||
2748 | |||
2749 | free_irq(dev->irq, dev->name); | ||
2750 | tasklet_kill(&dev->tasklet); | ||
2751 | |||
2752 | hifn_flush(dev); | ||
2753 | |||
2754 | pci_free_consistent(pdev, sizeof(struct hifn_dma), | ||
2755 | dev->desc_virt, dev->desc_dma); | ||
2756 | pci_unmap_single(pdev, dev->dst, | ||
2757 | PAGE_SIZE << HIFN_MAX_RESULT_ORDER, | ||
2758 | PCI_DMA_FROMDEVICE); | ||
2759 | free_pages(dev->result_mem, HIFN_MAX_RESULT_ORDER); | ||
2760 | for (i=0; i<3; ++i) | ||
2761 | if (dev->bar[i]) | ||
2762 | iounmap(dev->bar[i]); | ||
2763 | |||
2764 | kfree(dev); | ||
2765 | } | ||
2766 | |||
2767 | pci_release_regions(pdev); | ||
2768 | pci_disable_device(pdev); | ||
2769 | } | ||
2770 | |||
2771 | static struct pci_device_id hifn_pci_tbl[] = { | ||
2772 | { PCI_DEVICE(PCI_VENDOR_ID_HIFN, PCI_DEVICE_ID_HIFN_7955) }, | ||
2773 | { PCI_DEVICE(PCI_VENDOR_ID_HIFN, PCI_DEVICE_ID_HIFN_7956) }, | ||
2774 | { 0 } | ||
2775 | }; | ||
2776 | MODULE_DEVICE_TABLE(pci, hifn_pci_tbl); | ||
2777 | |||
2778 | static struct pci_driver hifn_pci_driver = { | ||
2779 | .name = "hifn795x", | ||
2780 | .id_table = hifn_pci_tbl, | ||
2781 | .probe = hifn_probe, | ||
2782 | .remove = __devexit_p(hifn_remove), | ||
2783 | }; | ||
2784 | |||
2785 | static int __devinit hifn_init(void) | ||
2786 | { | ||
2787 | unsigned int freq; | ||
2788 | int err; | ||
2789 | |||
2790 | if (strncmp(hifn_pll_ref, "ext", 3) && | ||
2791 | strncmp(hifn_pll_ref, "pci", 3)) { | ||
2792 | printk(KERN_ERR "hifn795x: invalid hifn_pll_ref clock, " | ||
2793 | "must be pci or ext"); | ||
2794 | return -EINVAL; | ||
2795 | } | ||
2796 | |||
2797 | /* | ||
2798 | * For the 7955/7956 the reference clock frequency must be in the | ||
2799 | * range of 20MHz-100MHz. For the 7954 the upper bound is 66.67MHz, | ||
2800 | * but this chip is currently not supported. | ||
2801 | */ | ||
2802 | if (hifn_pll_ref[3] != '\0') { | ||
2803 | freq = simple_strtoul(hifn_pll_ref + 3, NULL, 10); | ||
2804 | if (freq < 20 || freq > 100) { | ||
2805 | printk(KERN_ERR "hifn795x: invalid hifn_pll_ref " | ||
2806 | "frequency, must be in the range " | ||
2807 | "of 20-100"); | ||
2808 | return -EINVAL; | ||
2809 | } | ||
2810 | } | ||
2811 | |||
2812 | err = pci_register_driver(&hifn_pci_driver); | ||
2813 | if (err < 0) { | ||
2814 | dprintk("Failed to register PCI driver for %s device.\n", | ||
2815 | hifn_pci_driver.name); | ||
2816 | return -ENODEV; | ||
2817 | } | ||
2818 | |||
2819 | printk(KERN_INFO "Driver for HIFN 795x crypto accelerator chip " | ||
2820 | "has been successfully registered.\n"); | ||
2821 | |||
2822 | return 0; | ||
2823 | } | ||
2824 | |||
2825 | static void __devexit hifn_fini(void) | ||
2826 | { | ||
2827 | pci_unregister_driver(&hifn_pci_driver); | ||
2828 | |||
2829 | printk(KERN_INFO "Driver for HIFN 795x crypto accelerator chip " | ||
2830 | "has been successfully unregistered.\n"); | ||
2831 | } | ||
2832 | |||
2833 | module_init(hifn_init); | ||
2834 | module_exit(hifn_fini); | ||
2835 | |||
2836 | MODULE_LICENSE("GPL"); | ||
2837 | MODULE_AUTHOR("Evgeniy Polyakov <johnpol@2ka.mipt.ru>"); | ||
2838 | MODULE_DESCRIPTION("Driver for HIFN 795x crypto accelerator chip."); | ||
diff --git a/drivers/crypto/padlock-aes.c b/drivers/crypto/padlock-aes.c index 5f7e71810489..2f3ad3f7dfea 100644 --- a/drivers/crypto/padlock-aes.c +++ b/drivers/crypto/padlock-aes.c | |||
@@ -44,6 +44,7 @@ | |||
44 | */ | 44 | */ |
45 | 45 | ||
46 | #include <crypto/algapi.h> | 46 | #include <crypto/algapi.h> |
47 | #include <crypto/aes.h> | ||
47 | #include <linux/module.h> | 48 | #include <linux/module.h> |
48 | #include <linux/init.h> | 49 | #include <linux/init.h> |
49 | #include <linux/types.h> | 50 | #include <linux/types.h> |
@@ -53,9 +54,6 @@ | |||
53 | #include <asm/byteorder.h> | 54 | #include <asm/byteorder.h> |
54 | #include "padlock.h" | 55 | #include "padlock.h" |
55 | 56 | ||
56 | #define AES_MIN_KEY_SIZE 16 /* in uint8_t units */ | ||
57 | #define AES_MAX_KEY_SIZE 32 /* ditto */ | ||
58 | #define AES_BLOCK_SIZE 16 /* ditto */ | ||
59 | #define AES_EXTENDED_KEY_SIZE 64 /* in uint32_t units */ | 57 | #define AES_EXTENDED_KEY_SIZE 64 /* in uint32_t units */ |
60 | #define AES_EXTENDED_KEY_SIZE_B (AES_EXTENDED_KEY_SIZE * sizeof(uint32_t)) | 58 | #define AES_EXTENDED_KEY_SIZE_B (AES_EXTENDED_KEY_SIZE * sizeof(uint32_t)) |
61 | 59 | ||
@@ -419,6 +417,11 @@ static int aes_set_key(struct crypto_tfm *tfm, const u8 *in_key, | |||
419 | /* ====== Encryption/decryption routines ====== */ | 417 | /* ====== Encryption/decryption routines ====== */ |
420 | 418 | ||
421 | /* These are the real call to PadLock. */ | 419 | /* These are the real call to PadLock. */ |
420 | static inline void padlock_reset_key(void) | ||
421 | { | ||
422 | asm volatile ("pushfl; popfl"); | ||
423 | } | ||
424 | |||
422 | static inline void padlock_xcrypt(const u8 *input, u8 *output, void *key, | 425 | static inline void padlock_xcrypt(const u8 *input, u8 *output, void *key, |
423 | void *control_word) | 426 | void *control_word) |
424 | { | 427 | { |
@@ -439,8 +442,6 @@ static void aes_crypt_copy(const u8 *in, u8 *out, u32 *key, struct cword *cword) | |||
439 | static inline void aes_crypt(const u8 *in, u8 *out, u32 *key, | 442 | static inline void aes_crypt(const u8 *in, u8 *out, u32 *key, |
440 | struct cword *cword) | 443 | struct cword *cword) |
441 | { | 444 | { |
442 | asm volatile ("pushfl; popfl"); | ||
443 | |||
444 | /* padlock_xcrypt requires at least two blocks of data. */ | 445 | /* padlock_xcrypt requires at least two blocks of data. */ |
445 | if (unlikely(!(((unsigned long)in ^ (PAGE_SIZE - AES_BLOCK_SIZE)) & | 446 | if (unlikely(!(((unsigned long)in ^ (PAGE_SIZE - AES_BLOCK_SIZE)) & |
446 | (PAGE_SIZE - 1)))) { | 447 | (PAGE_SIZE - 1)))) { |
@@ -459,7 +460,6 @@ static inline void padlock_xcrypt_ecb(const u8 *input, u8 *output, void *key, | |||
459 | return; | 460 | return; |
460 | } | 461 | } |
461 | 462 | ||
462 | asm volatile ("pushfl; popfl"); /* enforce key reload. */ | ||
463 | asm volatile ("test $1, %%cl;" | 463 | asm volatile ("test $1, %%cl;" |
464 | "je 1f;" | 464 | "je 1f;" |
465 | "lea -1(%%ecx), %%eax;" | 465 | "lea -1(%%ecx), %%eax;" |
@@ -476,8 +476,6 @@ static inline void padlock_xcrypt_ecb(const u8 *input, u8 *output, void *key, | |||
476 | static inline u8 *padlock_xcrypt_cbc(const u8 *input, u8 *output, void *key, | 476 | static inline u8 *padlock_xcrypt_cbc(const u8 *input, u8 *output, void *key, |
477 | u8 *iv, void *control_word, u32 count) | 477 | u8 *iv, void *control_word, u32 count) |
478 | { | 478 | { |
479 | /* Enforce key reload. */ | ||
480 | asm volatile ("pushfl; popfl"); | ||
481 | /* rep xcryptcbc */ | 479 | /* rep xcryptcbc */ |
482 | asm volatile (".byte 0xf3,0x0f,0xa7,0xd0" | 480 | asm volatile (".byte 0xf3,0x0f,0xa7,0xd0" |
483 | : "+S" (input), "+D" (output), "+a" (iv) | 481 | : "+S" (input), "+D" (output), "+a" (iv) |
@@ -488,12 +486,14 @@ static inline u8 *padlock_xcrypt_cbc(const u8 *input, u8 *output, void *key, | |||
488 | static void aes_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) | 486 | static void aes_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) |
489 | { | 487 | { |
490 | struct aes_ctx *ctx = aes_ctx(tfm); | 488 | struct aes_ctx *ctx = aes_ctx(tfm); |
489 | padlock_reset_key(); | ||
491 | aes_crypt(in, out, ctx->E, &ctx->cword.encrypt); | 490 | aes_crypt(in, out, ctx->E, &ctx->cword.encrypt); |
492 | } | 491 | } |
493 | 492 | ||
494 | static void aes_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) | 493 | static void aes_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) |
495 | { | 494 | { |
496 | struct aes_ctx *ctx = aes_ctx(tfm); | 495 | struct aes_ctx *ctx = aes_ctx(tfm); |
496 | padlock_reset_key(); | ||
497 | aes_crypt(in, out, ctx->D, &ctx->cword.decrypt); | 497 | aes_crypt(in, out, ctx->D, &ctx->cword.decrypt); |
498 | } | 498 | } |
499 | 499 | ||
@@ -526,6 +526,8 @@ static int ecb_aes_encrypt(struct blkcipher_desc *desc, | |||
526 | struct blkcipher_walk walk; | 526 | struct blkcipher_walk walk; |
527 | int err; | 527 | int err; |
528 | 528 | ||
529 | padlock_reset_key(); | ||
530 | |||
529 | blkcipher_walk_init(&walk, dst, src, nbytes); | 531 | blkcipher_walk_init(&walk, dst, src, nbytes); |
530 | err = blkcipher_walk_virt(desc, &walk); | 532 | err = blkcipher_walk_virt(desc, &walk); |
531 | 533 | ||
@@ -548,6 +550,8 @@ static int ecb_aes_decrypt(struct blkcipher_desc *desc, | |||
548 | struct blkcipher_walk walk; | 550 | struct blkcipher_walk walk; |
549 | int err; | 551 | int err; |
550 | 552 | ||
553 | padlock_reset_key(); | ||
554 | |||
551 | blkcipher_walk_init(&walk, dst, src, nbytes); | 555 | blkcipher_walk_init(&walk, dst, src, nbytes); |
552 | err = blkcipher_walk_virt(desc, &walk); | 556 | err = blkcipher_walk_virt(desc, &walk); |
553 | 557 | ||
@@ -592,6 +596,8 @@ static int cbc_aes_encrypt(struct blkcipher_desc *desc, | |||
592 | struct blkcipher_walk walk; | 596 | struct blkcipher_walk walk; |
593 | int err; | 597 | int err; |
594 | 598 | ||
599 | padlock_reset_key(); | ||
600 | |||
595 | blkcipher_walk_init(&walk, dst, src, nbytes); | 601 | blkcipher_walk_init(&walk, dst, src, nbytes); |
596 | err = blkcipher_walk_virt(desc, &walk); | 602 | err = blkcipher_walk_virt(desc, &walk); |
597 | 603 | ||
@@ -616,6 +622,8 @@ static int cbc_aes_decrypt(struct blkcipher_desc *desc, | |||
616 | struct blkcipher_walk walk; | 622 | struct blkcipher_walk walk; |
617 | int err; | 623 | int err; |
618 | 624 | ||
625 | padlock_reset_key(); | ||
626 | |||
619 | blkcipher_walk_init(&walk, dst, src, nbytes); | 627 | blkcipher_walk_init(&walk, dst, src, nbytes); |
620 | err = blkcipher_walk_virt(desc, &walk); | 628 | err = blkcipher_walk_virt(desc, &walk); |
621 | 629 | ||
diff --git a/include/crypto/aead.h b/include/crypto/aead.h new file mode 100644 index 000000000000..0edf949f6369 --- /dev/null +++ b/include/crypto/aead.h | |||
@@ -0,0 +1,105 @@ | |||
1 | /* | ||
2 | * AEAD: Authenticated Encryption with Associated Data | ||
3 | * | ||
4 | * Copyright (c) 2007 Herbert Xu <herbert@gondor.apana.org.au> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify it | ||
7 | * under the terms of the GNU General Public License as published by the Free | ||
8 | * Software Foundation; either version 2 of the License, or (at your option) | ||
9 | * any later version. | ||
10 | * | ||
11 | */ | ||
12 | |||
13 | #ifndef _CRYPTO_AEAD_H | ||
14 | #define _CRYPTO_AEAD_H | ||
15 | |||
16 | #include <linux/crypto.h> | ||
17 | #include <linux/kernel.h> | ||
18 | #include <linux/slab.h> | ||
19 | |||
20 | /** | ||
21 | * struct aead_givcrypt_request - AEAD request with IV generation | ||
22 | * @seq: Sequence number for IV generation | ||
23 | * @giv: Space for generated IV | ||
24 | * @areq: The AEAD request itself | ||
25 | */ | ||
26 | struct aead_givcrypt_request { | ||
27 | u64 seq; | ||
28 | u8 *giv; | ||
29 | |||
30 | struct aead_request areq; | ||
31 | }; | ||
32 | |||
33 | static inline struct crypto_aead *aead_givcrypt_reqtfm( | ||
34 | struct aead_givcrypt_request *req) | ||
35 | { | ||
36 | return crypto_aead_reqtfm(&req->areq); | ||
37 | } | ||
38 | |||
39 | static inline int crypto_aead_givencrypt(struct aead_givcrypt_request *req) | ||
40 | { | ||
41 | struct aead_tfm *crt = crypto_aead_crt(aead_givcrypt_reqtfm(req)); | ||
42 | return crt->givencrypt(req); | ||
43 | }; | ||
44 | |||
45 | static inline int crypto_aead_givdecrypt(struct aead_givcrypt_request *req) | ||
46 | { | ||
47 | struct aead_tfm *crt = crypto_aead_crt(aead_givcrypt_reqtfm(req)); | ||
48 | return crt->givdecrypt(req); | ||
49 | }; | ||
50 | |||
51 | static inline void aead_givcrypt_set_tfm(struct aead_givcrypt_request *req, | ||
52 | struct crypto_aead *tfm) | ||
53 | { | ||
54 | req->areq.base.tfm = crypto_aead_tfm(tfm); | ||
55 | } | ||
56 | |||
57 | static inline struct aead_givcrypt_request *aead_givcrypt_alloc( | ||
58 | struct crypto_aead *tfm, gfp_t gfp) | ||
59 | { | ||
60 | struct aead_givcrypt_request *req; | ||
61 | |||
62 | req = kmalloc(sizeof(struct aead_givcrypt_request) + | ||
63 | crypto_aead_reqsize(tfm), gfp); | ||
64 | |||
65 | if (likely(req)) | ||
66 | aead_givcrypt_set_tfm(req, tfm); | ||
67 | |||
68 | return req; | ||
69 | } | ||
70 | |||
71 | static inline void aead_givcrypt_free(struct aead_givcrypt_request *req) | ||
72 | { | ||
73 | kfree(req); | ||
74 | } | ||
75 | |||
76 | static inline void aead_givcrypt_set_callback( | ||
77 | struct aead_givcrypt_request *req, u32 flags, | ||
78 | crypto_completion_t complete, void *data) | ||
79 | { | ||
80 | aead_request_set_callback(&req->areq, flags, complete, data); | ||
81 | } | ||
82 | |||
83 | static inline void aead_givcrypt_set_crypt(struct aead_givcrypt_request *req, | ||
84 | struct scatterlist *src, | ||
85 | struct scatterlist *dst, | ||
86 | unsigned int nbytes, void *iv) | ||
87 | { | ||
88 | aead_request_set_crypt(&req->areq, src, dst, nbytes, iv); | ||
89 | } | ||
90 | |||
91 | static inline void aead_givcrypt_set_assoc(struct aead_givcrypt_request *req, | ||
92 | struct scatterlist *assoc, | ||
93 | unsigned int assoclen) | ||
94 | { | ||
95 | aead_request_set_assoc(&req->areq, assoc, assoclen); | ||
96 | } | ||
97 | |||
98 | static inline void aead_givcrypt_set_giv(struct aead_givcrypt_request *req, | ||
99 | u8 *giv, u64 seq) | ||
100 | { | ||
101 | req->giv = giv; | ||
102 | req->seq = seq; | ||
103 | } | ||
104 | |||
105 | #endif /* _CRYPTO_AEAD_H */ | ||
diff --git a/include/crypto/aes.h b/include/crypto/aes.h new file mode 100644 index 000000000000..d480b76715a8 --- /dev/null +++ b/include/crypto/aes.h | |||
@@ -0,0 +1,31 @@ | |||
1 | /* | ||
2 | * Common values for AES algorithms | ||
3 | */ | ||
4 | |||
5 | #ifndef _CRYPTO_AES_H | ||
6 | #define _CRYPTO_AES_H | ||
7 | |||
8 | #include <linux/types.h> | ||
9 | #include <linux/crypto.h> | ||
10 | |||
11 | #define AES_MIN_KEY_SIZE 16 | ||
12 | #define AES_MAX_KEY_SIZE 32 | ||
13 | #define AES_KEYSIZE_128 16 | ||
14 | #define AES_KEYSIZE_192 24 | ||
15 | #define AES_KEYSIZE_256 32 | ||
16 | #define AES_BLOCK_SIZE 16 | ||
17 | |||
18 | struct crypto_aes_ctx { | ||
19 | u32 key_length; | ||
20 | u32 key_enc[60]; | ||
21 | u32 key_dec[60]; | ||
22 | }; | ||
23 | |||
24 | extern u32 crypto_ft_tab[4][256]; | ||
25 | extern u32 crypto_fl_tab[4][256]; | ||
26 | extern u32 crypto_it_tab[4][256]; | ||
27 | extern u32 crypto_il_tab[4][256]; | ||
28 | |||
29 | int crypto_aes_set_key(struct crypto_tfm *tfm, const u8 *in_key, | ||
30 | unsigned int key_len); | ||
31 | #endif | ||
diff --git a/include/crypto/algapi.h b/include/crypto/algapi.h index b9b05d399d2b..60d06e784be3 100644 --- a/include/crypto/algapi.h +++ b/include/crypto/algapi.h | |||
@@ -111,8 +111,15 @@ void crypto_drop_spawn(struct crypto_spawn *spawn); | |||
111 | struct crypto_tfm *crypto_spawn_tfm(struct crypto_spawn *spawn, u32 type, | 111 | struct crypto_tfm *crypto_spawn_tfm(struct crypto_spawn *spawn, u32 type, |
112 | u32 mask); | 112 | u32 mask); |
113 | 113 | ||
114 | static inline void crypto_set_spawn(struct crypto_spawn *spawn, | ||
115 | struct crypto_instance *inst) | ||
116 | { | ||
117 | spawn->inst = inst; | ||
118 | } | ||
119 | |||
114 | struct crypto_attr_type *crypto_get_attr_type(struct rtattr **tb); | 120 | struct crypto_attr_type *crypto_get_attr_type(struct rtattr **tb); |
115 | int crypto_check_attr_type(struct rtattr **tb, u32 type); | 121 | int crypto_check_attr_type(struct rtattr **tb, u32 type); |
122 | const char *crypto_attr_alg_name(struct rtattr *rta); | ||
116 | struct crypto_alg *crypto_attr_alg(struct rtattr *rta, u32 type, u32 mask); | 123 | struct crypto_alg *crypto_attr_alg(struct rtattr *rta, u32 type, u32 mask); |
117 | int crypto_attr_u32(struct rtattr *rta, u32 *num); | 124 | int crypto_attr_u32(struct rtattr *rta, u32 *num); |
118 | struct crypto_instance *crypto_alloc_instance(const char *name, | 125 | struct crypto_instance *crypto_alloc_instance(const char *name, |
@@ -124,6 +131,10 @@ int crypto_enqueue_request(struct crypto_queue *queue, | |||
124 | struct crypto_async_request *crypto_dequeue_request(struct crypto_queue *queue); | 131 | struct crypto_async_request *crypto_dequeue_request(struct crypto_queue *queue); |
125 | int crypto_tfm_in_queue(struct crypto_queue *queue, struct crypto_tfm *tfm); | 132 | int crypto_tfm_in_queue(struct crypto_queue *queue, struct crypto_tfm *tfm); |
126 | 133 | ||
134 | /* These functions require the input/output to be aligned as u32. */ | ||
135 | void crypto_inc(u8 *a, unsigned int size); | ||
136 | void crypto_xor(u8 *dst, const u8 *src, unsigned int size); | ||
137 | |||
127 | int blkcipher_walk_done(struct blkcipher_desc *desc, | 138 | int blkcipher_walk_done(struct blkcipher_desc *desc, |
128 | struct blkcipher_walk *walk, int err); | 139 | struct blkcipher_walk *walk, int err); |
129 | int blkcipher_walk_virt(struct blkcipher_desc *desc, | 140 | int blkcipher_walk_virt(struct blkcipher_desc *desc, |
@@ -187,20 +198,11 @@ static inline struct crypto_instance *crypto_aead_alg_instance( | |||
187 | return crypto_tfm_alg_instance(&aead->base); | 198 | return crypto_tfm_alg_instance(&aead->base); |
188 | } | 199 | } |
189 | 200 | ||
190 | static inline struct crypto_ablkcipher *crypto_spawn_ablkcipher( | ||
191 | struct crypto_spawn *spawn) | ||
192 | { | ||
193 | u32 type = CRYPTO_ALG_TYPE_BLKCIPHER; | ||
194 | u32 mask = CRYPTO_ALG_TYPE_MASK; | ||
195 | |||
196 | return __crypto_ablkcipher_cast(crypto_spawn_tfm(spawn, type, mask)); | ||
197 | } | ||
198 | |||
199 | static inline struct crypto_blkcipher *crypto_spawn_blkcipher( | 201 | static inline struct crypto_blkcipher *crypto_spawn_blkcipher( |
200 | struct crypto_spawn *spawn) | 202 | struct crypto_spawn *spawn) |
201 | { | 203 | { |
202 | u32 type = CRYPTO_ALG_TYPE_BLKCIPHER; | 204 | u32 type = CRYPTO_ALG_TYPE_BLKCIPHER; |
203 | u32 mask = CRYPTO_ALG_TYPE_MASK | CRYPTO_ALG_ASYNC; | 205 | u32 mask = CRYPTO_ALG_TYPE_MASK; |
204 | 206 | ||
205 | return __crypto_blkcipher_cast(crypto_spawn_tfm(spawn, type, mask)); | 207 | return __crypto_blkcipher_cast(crypto_spawn_tfm(spawn, type, mask)); |
206 | } | 208 | } |
@@ -303,5 +305,14 @@ static inline struct crypto_alg *crypto_get_attr_alg(struct rtattr **tb, | |||
303 | return crypto_attr_alg(tb[1], type, mask); | 305 | return crypto_attr_alg(tb[1], type, mask); |
304 | } | 306 | } |
305 | 307 | ||
308 | /* | ||
309 | * Returns CRYPTO_ALG_ASYNC if type/mask requires the use of sync algorithms. | ||
310 | * Otherwise returns zero. | ||
311 | */ | ||
312 | static inline int crypto_requires_sync(u32 type, u32 mask) | ||
313 | { | ||
314 | return (type ^ CRYPTO_ALG_ASYNC) & mask & CRYPTO_ALG_ASYNC; | ||
315 | } | ||
316 | |||
306 | #endif /* _CRYPTO_ALGAPI_H */ | 317 | #endif /* _CRYPTO_ALGAPI_H */ |
307 | 318 | ||
diff --git a/include/crypto/authenc.h b/include/crypto/authenc.h new file mode 100644 index 000000000000..e47b044929a8 --- /dev/null +++ b/include/crypto/authenc.h | |||
@@ -0,0 +1,27 @@ | |||
1 | /* | ||
2 | * Authenc: Simple AEAD wrapper for IPsec | ||
3 | * | ||
4 | * Copyright (c) 2007 Herbert Xu <herbert@gondor.apana.org.au> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify it | ||
7 | * under the terms of the GNU General Public License as published by the Free | ||
8 | * Software Foundation; either version 2 of the License, or (at your option) | ||
9 | * any later version. | ||
10 | * | ||
11 | */ | ||
12 | #ifndef _CRYPTO_AUTHENC_H | ||
13 | #define _CRYPTO_AUTHENC_H | ||
14 | |||
15 | #include <linux/types.h> | ||
16 | |||
17 | enum { | ||
18 | CRYPTO_AUTHENC_KEYA_UNSPEC, | ||
19 | CRYPTO_AUTHENC_KEYA_PARAM, | ||
20 | }; | ||
21 | |||
22 | struct crypto_authenc_key_param { | ||
23 | __be32 enckeylen; | ||
24 | }; | ||
25 | |||
26 | #endif /* _CRYPTO_AUTHENC_H */ | ||
27 | |||
diff --git a/include/crypto/ctr.h b/include/crypto/ctr.h new file mode 100644 index 000000000000..4180fc080e3b --- /dev/null +++ b/include/crypto/ctr.h | |||
@@ -0,0 +1,20 @@ | |||
1 | /* | ||
2 | * CTR: Counter mode | ||
3 | * | ||
4 | * Copyright (c) 2007 Herbert Xu <herbert@gondor.apana.org.au> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify it | ||
7 | * under the terms of the GNU General Public License as published by the Free | ||
8 | * Software Foundation; either version 2 of the License, or (at your option) | ||
9 | * any later version. | ||
10 | * | ||
11 | */ | ||
12 | |||
13 | #ifndef _CRYPTO_CTR_H | ||
14 | #define _CRYPTO_CTR_H | ||
15 | |||
16 | #define CTR_RFC3686_NONCE_SIZE 4 | ||
17 | #define CTR_RFC3686_IV_SIZE 8 | ||
18 | #define CTR_RFC3686_BLOCK_SIZE 16 | ||
19 | |||
20 | #endif /* _CRYPTO_CTR_H */ | ||
diff --git a/include/crypto/des.h b/include/crypto/des.h new file mode 100644 index 000000000000..2971c6304ade --- /dev/null +++ b/include/crypto/des.h | |||
@@ -0,0 +1,19 @@ | |||
1 | /* | ||
2 | * DES & Triple DES EDE Cipher Algorithms. | ||
3 | */ | ||
4 | |||
5 | #ifndef __CRYPTO_DES_H | ||
6 | #define __CRYPTO_DES_H | ||
7 | |||
8 | #define DES_KEY_SIZE 8 | ||
9 | #define DES_EXPKEY_WORDS 32 | ||
10 | #define DES_BLOCK_SIZE 8 | ||
11 | |||
12 | #define DES3_EDE_KEY_SIZE (3 * DES_KEY_SIZE) | ||
13 | #define DES3_EDE_EXPKEY_WORDS (3 * DES_EXPKEY_WORDS) | ||
14 | #define DES3_EDE_BLOCK_SIZE DES_BLOCK_SIZE | ||
15 | |||
16 | |||
17 | extern unsigned long des_ekey(u32 *pe, const u8 *k); | ||
18 | |||
19 | #endif /* __CRYPTO_DES_H */ | ||
diff --git a/include/crypto/internal/aead.h b/include/crypto/internal/aead.h new file mode 100644 index 000000000000..d838c945575a --- /dev/null +++ b/include/crypto/internal/aead.h | |||
@@ -0,0 +1,80 @@ | |||
1 | /* | ||
2 | * AEAD: Authenticated Encryption with Associated Data | ||
3 | * | ||
4 | * Copyright (c) 2007 Herbert Xu <herbert@gondor.apana.org.au> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify it | ||
7 | * under the terms of the GNU General Public License as published by the Free | ||
8 | * Software Foundation; either version 2 of the License, or (at your option) | ||
9 | * any later version. | ||
10 | * | ||
11 | */ | ||
12 | |||
13 | #ifndef _CRYPTO_INTERNAL_AEAD_H | ||
14 | #define _CRYPTO_INTERNAL_AEAD_H | ||
15 | |||
16 | #include <crypto/aead.h> | ||
17 | #include <crypto/algapi.h> | ||
18 | #include <linux/types.h> | ||
19 | |||
20 | struct rtattr; | ||
21 | |||
22 | struct crypto_aead_spawn { | ||
23 | struct crypto_spawn base; | ||
24 | }; | ||
25 | |||
26 | extern const struct crypto_type crypto_nivaead_type; | ||
27 | |||
28 | static inline void crypto_set_aead_spawn( | ||
29 | struct crypto_aead_spawn *spawn, struct crypto_instance *inst) | ||
30 | { | ||
31 | crypto_set_spawn(&spawn->base, inst); | ||
32 | } | ||
33 | |||
34 | int crypto_grab_aead(struct crypto_aead_spawn *spawn, const char *name, | ||
35 | u32 type, u32 mask); | ||
36 | |||
37 | static inline void crypto_drop_aead(struct crypto_aead_spawn *spawn) | ||
38 | { | ||
39 | crypto_drop_spawn(&spawn->base); | ||
40 | } | ||
41 | |||
42 | static inline struct crypto_alg *crypto_aead_spawn_alg( | ||
43 | struct crypto_aead_spawn *spawn) | ||
44 | { | ||
45 | return spawn->base.alg; | ||
46 | } | ||
47 | |||
48 | static inline struct crypto_aead *crypto_spawn_aead( | ||
49 | struct crypto_aead_spawn *spawn) | ||
50 | { | ||
51 | return __crypto_aead_cast( | ||
52 | crypto_spawn_tfm(&spawn->base, CRYPTO_ALG_TYPE_AEAD, | ||
53 | CRYPTO_ALG_TYPE_MASK)); | ||
54 | } | ||
55 | |||
56 | struct crypto_instance *aead_geniv_alloc(struct crypto_template *tmpl, | ||
57 | struct rtattr **tb, u32 type, | ||
58 | u32 mask); | ||
59 | void aead_geniv_free(struct crypto_instance *inst); | ||
60 | int aead_geniv_init(struct crypto_tfm *tfm); | ||
61 | void aead_geniv_exit(struct crypto_tfm *tfm); | ||
62 | |||
63 | static inline struct crypto_aead *aead_geniv_base(struct crypto_aead *geniv) | ||
64 | { | ||
65 | return crypto_aead_crt(geniv)->base; | ||
66 | } | ||
67 | |||
68 | static inline void *aead_givcrypt_reqctx(struct aead_givcrypt_request *req) | ||
69 | { | ||
70 | return aead_request_ctx(&req->areq); | ||
71 | } | ||
72 | |||
73 | static inline void aead_givcrypt_complete(struct aead_givcrypt_request *req, | ||
74 | int err) | ||
75 | { | ||
76 | aead_request_complete(&req->areq, err); | ||
77 | } | ||
78 | |||
79 | #endif /* _CRYPTO_INTERNAL_AEAD_H */ | ||
80 | |||
diff --git a/include/crypto/internal/skcipher.h b/include/crypto/internal/skcipher.h new file mode 100644 index 000000000000..2ba42cd7d6aa --- /dev/null +++ b/include/crypto/internal/skcipher.h | |||
@@ -0,0 +1,110 @@ | |||
1 | /* | ||
2 | * Symmetric key ciphers. | ||
3 | * | ||
4 | * Copyright (c) 2007 Herbert Xu <herbert@gondor.apana.org.au> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify it | ||
7 | * under the terms of the GNU General Public License as published by the Free | ||
8 | * Software Foundation; either version 2 of the License, or (at your option) | ||
9 | * any later version. | ||
10 | * | ||
11 | */ | ||
12 | |||
13 | #ifndef _CRYPTO_INTERNAL_SKCIPHER_H | ||
14 | #define _CRYPTO_INTERNAL_SKCIPHER_H | ||
15 | |||
16 | #include <crypto/algapi.h> | ||
17 | #include <crypto/skcipher.h> | ||
18 | #include <linux/types.h> | ||
19 | |||
20 | struct rtattr; | ||
21 | |||
22 | struct crypto_skcipher_spawn { | ||
23 | struct crypto_spawn base; | ||
24 | }; | ||
25 | |||
26 | extern const struct crypto_type crypto_givcipher_type; | ||
27 | |||
28 | static inline void crypto_set_skcipher_spawn( | ||
29 | struct crypto_skcipher_spawn *spawn, struct crypto_instance *inst) | ||
30 | { | ||
31 | crypto_set_spawn(&spawn->base, inst); | ||
32 | } | ||
33 | |||
34 | int crypto_grab_skcipher(struct crypto_skcipher_spawn *spawn, const char *name, | ||
35 | u32 type, u32 mask); | ||
36 | |||
37 | static inline void crypto_drop_skcipher(struct crypto_skcipher_spawn *spawn) | ||
38 | { | ||
39 | crypto_drop_spawn(&spawn->base); | ||
40 | } | ||
41 | |||
42 | static inline struct crypto_alg *crypto_skcipher_spawn_alg( | ||
43 | struct crypto_skcipher_spawn *spawn) | ||
44 | { | ||
45 | return spawn->base.alg; | ||
46 | } | ||
47 | |||
48 | static inline struct crypto_ablkcipher *crypto_spawn_skcipher( | ||
49 | struct crypto_skcipher_spawn *spawn) | ||
50 | { | ||
51 | return __crypto_ablkcipher_cast( | ||
52 | crypto_spawn_tfm(&spawn->base, crypto_skcipher_type(0), | ||
53 | crypto_skcipher_mask(0))); | ||
54 | } | ||
55 | |||
56 | int skcipher_null_givencrypt(struct skcipher_givcrypt_request *req); | ||
57 | int skcipher_null_givdecrypt(struct skcipher_givcrypt_request *req); | ||
58 | const char *crypto_default_geniv(const struct crypto_alg *alg); | ||
59 | |||
60 | struct crypto_instance *skcipher_geniv_alloc(struct crypto_template *tmpl, | ||
61 | struct rtattr **tb, u32 type, | ||
62 | u32 mask); | ||
63 | void skcipher_geniv_free(struct crypto_instance *inst); | ||
64 | int skcipher_geniv_init(struct crypto_tfm *tfm); | ||
65 | void skcipher_geniv_exit(struct crypto_tfm *tfm); | ||
66 | |||
67 | static inline struct crypto_ablkcipher *skcipher_geniv_cipher( | ||
68 | struct crypto_ablkcipher *geniv) | ||
69 | { | ||
70 | return crypto_ablkcipher_crt(geniv)->base; | ||
71 | } | ||
72 | |||
73 | static inline int skcipher_enqueue_givcrypt( | ||
74 | struct crypto_queue *queue, struct skcipher_givcrypt_request *request) | ||
75 | { | ||
76 | return ablkcipher_enqueue_request(queue, &request->creq); | ||
77 | } | ||
78 | |||
79 | static inline struct skcipher_givcrypt_request *skcipher_dequeue_givcrypt( | ||
80 | struct crypto_queue *queue) | ||
81 | { | ||
82 | return container_of(ablkcipher_dequeue_request(queue), | ||
83 | struct skcipher_givcrypt_request, creq); | ||
84 | } | ||
85 | |||
86 | static inline void *skcipher_givcrypt_reqctx( | ||
87 | struct skcipher_givcrypt_request *req) | ||
88 | { | ||
89 | return ablkcipher_request_ctx(&req->creq); | ||
90 | } | ||
91 | |||
92 | static inline void ablkcipher_request_complete(struct ablkcipher_request *req, | ||
93 | int err) | ||
94 | { | ||
95 | req->base.complete(&req->base, err); | ||
96 | } | ||
97 | |||
98 | static inline void skcipher_givcrypt_complete( | ||
99 | struct skcipher_givcrypt_request *req, int err) | ||
100 | { | ||
101 | ablkcipher_request_complete(&req->creq, err); | ||
102 | } | ||
103 | |||
104 | static inline u32 ablkcipher_request_flags(struct ablkcipher_request *req) | ||
105 | { | ||
106 | return req->base.flags; | ||
107 | } | ||
108 | |||
109 | #endif /* _CRYPTO_INTERNAL_SKCIPHER_H */ | ||
110 | |||
diff --git a/crypto/scatterwalk.h b/include/crypto/scatterwalk.h index 87ed681cceba..224658b8d806 100644 --- a/crypto/scatterwalk.h +++ b/include/crypto/scatterwalk.h | |||
@@ -1,9 +1,10 @@ | |||
1 | /* | 1 | /* |
2 | * Cryptographic API. | 2 | * Cryptographic scatter and gather helpers. |
3 | * | 3 | * |
4 | * Copyright (c) 2002 James Morris <jmorris@intercode.com.au> | 4 | * Copyright (c) 2002 James Morris <jmorris@intercode.com.au> |
5 | * Copyright (c) 2002 Adam J. Richter <adam@yggdrasil.com> | 5 | * Copyright (c) 2002 Adam J. Richter <adam@yggdrasil.com> |
6 | * Copyright (c) 2004 Jean-Luc Cooke <jlcooke@certainkey.com> | 6 | * Copyright (c) 2004 Jean-Luc Cooke <jlcooke@certainkey.com> |
7 | * Copyright (c) 2007 Herbert Xu <herbert@gondor.apana.org.au> | ||
7 | * | 8 | * |
8 | * This program is free software; you can redistribute it and/or modify it | 9 | * This program is free software; you can redistribute it and/or modify it |
9 | * under the terms of the GNU General Public License as published by the Free | 10 | * under the terms of the GNU General Public License as published by the Free |
@@ -15,14 +16,52 @@ | |||
15 | #ifndef _CRYPTO_SCATTERWALK_H | 16 | #ifndef _CRYPTO_SCATTERWALK_H |
16 | #define _CRYPTO_SCATTERWALK_H | 17 | #define _CRYPTO_SCATTERWALK_H |
17 | 18 | ||
19 | #include <asm/kmap_types.h> | ||
20 | #include <crypto/algapi.h> | ||
21 | #include <linux/hardirq.h> | ||
22 | #include <linux/highmem.h> | ||
23 | #include <linux/kernel.h> | ||
18 | #include <linux/mm.h> | 24 | #include <linux/mm.h> |
19 | #include <linux/scatterlist.h> | 25 | #include <linux/scatterlist.h> |
26 | #include <linux/sched.h> | ||
20 | 27 | ||
21 | #include "internal.h" | 28 | static inline enum km_type crypto_kmap_type(int out) |
29 | { | ||
30 | enum km_type type; | ||
31 | |||
32 | if (in_softirq()) | ||
33 | type = out * (KM_SOFTIRQ1 - KM_SOFTIRQ0) + KM_SOFTIRQ0; | ||
34 | else | ||
35 | type = out * (KM_USER1 - KM_USER0) + KM_USER0; | ||
36 | |||
37 | return type; | ||
38 | } | ||
39 | |||
40 | static inline void *crypto_kmap(struct page *page, int out) | ||
41 | { | ||
42 | return kmap_atomic(page, crypto_kmap_type(out)); | ||
43 | } | ||
44 | |||
45 | static inline void crypto_kunmap(void *vaddr, int out) | ||
46 | { | ||
47 | kunmap_atomic(vaddr, crypto_kmap_type(out)); | ||
48 | } | ||
49 | |||
50 | static inline void crypto_yield(u32 flags) | ||
51 | { | ||
52 | if (flags & CRYPTO_TFM_REQ_MAY_SLEEP) | ||
53 | cond_resched(); | ||
54 | } | ||
55 | |||
56 | static inline void scatterwalk_sg_chain(struct scatterlist *sg1, int num, | ||
57 | struct scatterlist *sg2) | ||
58 | { | ||
59 | sg_set_page(&sg1[num - 1], (void *)sg2, 0, 0); | ||
60 | } | ||
22 | 61 | ||
23 | static inline struct scatterlist *scatterwalk_sg_next(struct scatterlist *sg) | 62 | static inline struct scatterlist *scatterwalk_sg_next(struct scatterlist *sg) |
24 | { | 63 | { |
25 | return (++sg)->length ? sg : (void *) sg_page(sg); | 64 | return (++sg)->length ? sg : (void *)sg_page(sg); |
26 | } | 65 | } |
27 | 66 | ||
28 | static inline unsigned long scatterwalk_samebuf(struct scatter_walk *walk_in, | 67 | static inline unsigned long scatterwalk_samebuf(struct scatter_walk *walk_in, |
diff --git a/include/crypto/sha.h b/include/crypto/sha.h index 0686e1f7a24b..c0ccc2b1a2d8 100644 --- a/include/crypto/sha.h +++ b/include/crypto/sha.h | |||
@@ -8,6 +8,9 @@ | |||
8 | #define SHA1_DIGEST_SIZE 20 | 8 | #define SHA1_DIGEST_SIZE 20 |
9 | #define SHA1_BLOCK_SIZE 64 | 9 | #define SHA1_BLOCK_SIZE 64 |
10 | 10 | ||
11 | #define SHA224_DIGEST_SIZE 28 | ||
12 | #define SHA224_BLOCK_SIZE 64 | ||
13 | |||
11 | #define SHA256_DIGEST_SIZE 32 | 14 | #define SHA256_DIGEST_SIZE 32 |
12 | #define SHA256_BLOCK_SIZE 64 | 15 | #define SHA256_BLOCK_SIZE 64 |
13 | 16 | ||
@@ -23,6 +26,15 @@ | |||
23 | #define SHA1_H3 0x10325476UL | 26 | #define SHA1_H3 0x10325476UL |
24 | #define SHA1_H4 0xc3d2e1f0UL | 27 | #define SHA1_H4 0xc3d2e1f0UL |
25 | 28 | ||
29 | #define SHA224_H0 0xc1059ed8UL | ||
30 | #define SHA224_H1 0x367cd507UL | ||
31 | #define SHA224_H2 0x3070dd17UL | ||
32 | #define SHA224_H3 0xf70e5939UL | ||
33 | #define SHA224_H4 0xffc00b31UL | ||
34 | #define SHA224_H5 0x68581511UL | ||
35 | #define SHA224_H6 0x64f98fa7UL | ||
36 | #define SHA224_H7 0xbefa4fa4UL | ||
37 | |||
26 | #define SHA256_H0 0x6a09e667UL | 38 | #define SHA256_H0 0x6a09e667UL |
27 | #define SHA256_H1 0xbb67ae85UL | 39 | #define SHA256_H1 0xbb67ae85UL |
28 | #define SHA256_H2 0x3c6ef372UL | 40 | #define SHA256_H2 0x3c6ef372UL |
diff --git a/include/crypto/skcipher.h b/include/crypto/skcipher.h new file mode 100644 index 000000000000..25fd6126522d --- /dev/null +++ b/include/crypto/skcipher.h | |||
@@ -0,0 +1,110 @@ | |||
1 | /* | ||
2 | * Symmetric key ciphers. | ||
3 | * | ||
4 | * Copyright (c) 2007 Herbert Xu <herbert@gondor.apana.org.au> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify it | ||
7 | * under the terms of the GNU General Public License as published by the Free | ||
8 | * Software Foundation; either version 2 of the License, or (at your option) | ||
9 | * any later version. | ||
10 | * | ||
11 | */ | ||
12 | |||
13 | #ifndef _CRYPTO_SKCIPHER_H | ||
14 | #define _CRYPTO_SKCIPHER_H | ||
15 | |||
16 | #include <linux/crypto.h> | ||
17 | #include <linux/kernel.h> | ||
18 | #include <linux/slab.h> | ||
19 | |||
20 | /** | ||
21 | * struct skcipher_givcrypt_request - Crypto request with IV generation | ||
22 | * @seq: Sequence number for IV generation | ||
23 | * @giv: Space for generated IV | ||
24 | * @creq: The crypto request itself | ||
25 | */ | ||
26 | struct skcipher_givcrypt_request { | ||
27 | u64 seq; | ||
28 | u8 *giv; | ||
29 | |||
30 | struct ablkcipher_request creq; | ||
31 | }; | ||
32 | |||
33 | static inline struct crypto_ablkcipher *skcipher_givcrypt_reqtfm( | ||
34 | struct skcipher_givcrypt_request *req) | ||
35 | { | ||
36 | return crypto_ablkcipher_reqtfm(&req->creq); | ||
37 | } | ||
38 | |||
39 | static inline int crypto_skcipher_givencrypt( | ||
40 | struct skcipher_givcrypt_request *req) | ||
41 | { | ||
42 | struct ablkcipher_tfm *crt = | ||
43 | crypto_ablkcipher_crt(skcipher_givcrypt_reqtfm(req)); | ||
44 | return crt->givencrypt(req); | ||
45 | }; | ||
46 | |||
47 | static inline int crypto_skcipher_givdecrypt( | ||
48 | struct skcipher_givcrypt_request *req) | ||
49 | { | ||
50 | struct ablkcipher_tfm *crt = | ||
51 | crypto_ablkcipher_crt(skcipher_givcrypt_reqtfm(req)); | ||
52 | return crt->givdecrypt(req); | ||
53 | }; | ||
54 | |||
55 | static inline void skcipher_givcrypt_set_tfm( | ||
56 | struct skcipher_givcrypt_request *req, struct crypto_ablkcipher *tfm) | ||
57 | { | ||
58 | req->creq.base.tfm = crypto_ablkcipher_tfm(tfm); | ||
59 | } | ||
60 | |||
61 | static inline struct skcipher_givcrypt_request *skcipher_givcrypt_cast( | ||
62 | struct crypto_async_request *req) | ||
63 | { | ||
64 | return container_of(ablkcipher_request_cast(req), | ||
65 | struct skcipher_givcrypt_request, creq); | ||
66 | } | ||
67 | |||
68 | static inline struct skcipher_givcrypt_request *skcipher_givcrypt_alloc( | ||
69 | struct crypto_ablkcipher *tfm, gfp_t gfp) | ||
70 | { | ||
71 | struct skcipher_givcrypt_request *req; | ||
72 | |||
73 | req = kmalloc(sizeof(struct skcipher_givcrypt_request) + | ||
74 | crypto_ablkcipher_reqsize(tfm), gfp); | ||
75 | |||
76 | if (likely(req)) | ||
77 | skcipher_givcrypt_set_tfm(req, tfm); | ||
78 | |||
79 | return req; | ||
80 | } | ||
81 | |||
82 | static inline void skcipher_givcrypt_free(struct skcipher_givcrypt_request *req) | ||
83 | { | ||
84 | kfree(req); | ||
85 | } | ||
86 | |||
87 | static inline void skcipher_givcrypt_set_callback( | ||
88 | struct skcipher_givcrypt_request *req, u32 flags, | ||
89 | crypto_completion_t complete, void *data) | ||
90 | { | ||
91 | ablkcipher_request_set_callback(&req->creq, flags, complete, data); | ||
92 | } | ||
93 | |||
94 | static inline void skcipher_givcrypt_set_crypt( | ||
95 | struct skcipher_givcrypt_request *req, | ||
96 | struct scatterlist *src, struct scatterlist *dst, | ||
97 | unsigned int nbytes, void *iv) | ||
98 | { | ||
99 | ablkcipher_request_set_crypt(&req->creq, src, dst, nbytes, iv); | ||
100 | } | ||
101 | |||
102 | static inline void skcipher_givcrypt_set_giv( | ||
103 | struct skcipher_givcrypt_request *req, u8 *giv, u64 seq) | ||
104 | { | ||
105 | req->giv = giv; | ||
106 | req->seq = seq; | ||
107 | } | ||
108 | |||
109 | #endif /* _CRYPTO_SKCIPHER_H */ | ||
110 | |||
diff --git a/include/linux/crypto.h b/include/linux/crypto.h index f3110ebe894a..5e02d1b46370 100644 --- a/include/linux/crypto.h +++ b/include/linux/crypto.h | |||
@@ -33,10 +33,13 @@ | |||
33 | #define CRYPTO_ALG_TYPE_DIGEST 0x00000002 | 33 | #define CRYPTO_ALG_TYPE_DIGEST 0x00000002 |
34 | #define CRYPTO_ALG_TYPE_HASH 0x00000003 | 34 | #define CRYPTO_ALG_TYPE_HASH 0x00000003 |
35 | #define CRYPTO_ALG_TYPE_BLKCIPHER 0x00000004 | 35 | #define CRYPTO_ALG_TYPE_BLKCIPHER 0x00000004 |
36 | #define CRYPTO_ALG_TYPE_COMPRESS 0x00000005 | 36 | #define CRYPTO_ALG_TYPE_ABLKCIPHER 0x00000005 |
37 | #define CRYPTO_ALG_TYPE_AEAD 0x00000006 | 37 | #define CRYPTO_ALG_TYPE_GIVCIPHER 0x00000006 |
38 | #define CRYPTO_ALG_TYPE_COMPRESS 0x00000008 | ||
39 | #define CRYPTO_ALG_TYPE_AEAD 0x00000009 | ||
38 | 40 | ||
39 | #define CRYPTO_ALG_TYPE_HASH_MASK 0x0000000e | 41 | #define CRYPTO_ALG_TYPE_HASH_MASK 0x0000000e |
42 | #define CRYPTO_ALG_TYPE_BLKCIPHER_MASK 0x0000000c | ||
40 | 43 | ||
41 | #define CRYPTO_ALG_LARVAL 0x00000010 | 44 | #define CRYPTO_ALG_LARVAL 0x00000010 |
42 | #define CRYPTO_ALG_DEAD 0x00000020 | 45 | #define CRYPTO_ALG_DEAD 0x00000020 |
@@ -50,6 +53,12 @@ | |||
50 | #define CRYPTO_ALG_NEED_FALLBACK 0x00000100 | 53 | #define CRYPTO_ALG_NEED_FALLBACK 0x00000100 |
51 | 54 | ||
52 | /* | 55 | /* |
56 | * This bit is set for symmetric key ciphers that have already been wrapped | ||
57 | * with a generic IV generator to prevent them from being wrapped again. | ||
58 | */ | ||
59 | #define CRYPTO_ALG_GENIV 0x00000200 | ||
60 | |||
61 | /* | ||
53 | * Transform masks and values (for crt_flags). | 62 | * Transform masks and values (for crt_flags). |
54 | */ | 63 | */ |
55 | #define CRYPTO_TFM_REQ_MASK 0x000fff00 | 64 | #define CRYPTO_TFM_REQ_MASK 0x000fff00 |
@@ -81,13 +90,11 @@ | |||
81 | #define CRYPTO_MINALIGN ARCH_KMALLOC_MINALIGN | 90 | #define CRYPTO_MINALIGN ARCH_KMALLOC_MINALIGN |
82 | #elif defined(ARCH_SLAB_MINALIGN) | 91 | #elif defined(ARCH_SLAB_MINALIGN) |
83 | #define CRYPTO_MINALIGN ARCH_SLAB_MINALIGN | 92 | #define CRYPTO_MINALIGN ARCH_SLAB_MINALIGN |
93 | #else | ||
94 | #define CRYPTO_MINALIGN __alignof__(unsigned long long) | ||
84 | #endif | 95 | #endif |
85 | 96 | ||
86 | #ifdef CRYPTO_MINALIGN | ||
87 | #define CRYPTO_MINALIGN_ATTR __attribute__ ((__aligned__(CRYPTO_MINALIGN))) | 97 | #define CRYPTO_MINALIGN_ATTR __attribute__ ((__aligned__(CRYPTO_MINALIGN))) |
88 | #else | ||
89 | #define CRYPTO_MINALIGN_ATTR | ||
90 | #endif | ||
91 | 98 | ||
92 | struct scatterlist; | 99 | struct scatterlist; |
93 | struct crypto_ablkcipher; | 100 | struct crypto_ablkcipher; |
@@ -97,6 +104,8 @@ struct crypto_blkcipher; | |||
97 | struct crypto_hash; | 104 | struct crypto_hash; |
98 | struct crypto_tfm; | 105 | struct crypto_tfm; |
99 | struct crypto_type; | 106 | struct crypto_type; |
107 | struct aead_givcrypt_request; | ||
108 | struct skcipher_givcrypt_request; | ||
100 | 109 | ||
101 | typedef void (*crypto_completion_t)(struct crypto_async_request *req, int err); | 110 | typedef void (*crypto_completion_t)(struct crypto_async_request *req, int err); |
102 | 111 | ||
@@ -176,6 +185,10 @@ struct ablkcipher_alg { | |||
176 | unsigned int keylen); | 185 | unsigned int keylen); |
177 | int (*encrypt)(struct ablkcipher_request *req); | 186 | int (*encrypt)(struct ablkcipher_request *req); |
178 | int (*decrypt)(struct ablkcipher_request *req); | 187 | int (*decrypt)(struct ablkcipher_request *req); |
188 | int (*givencrypt)(struct skcipher_givcrypt_request *req); | ||
189 | int (*givdecrypt)(struct skcipher_givcrypt_request *req); | ||
190 | |||
191 | const char *geniv; | ||
179 | 192 | ||
180 | unsigned int min_keysize; | 193 | unsigned int min_keysize; |
181 | unsigned int max_keysize; | 194 | unsigned int max_keysize; |
@@ -185,11 +198,16 @@ struct ablkcipher_alg { | |||
185 | struct aead_alg { | 198 | struct aead_alg { |
186 | int (*setkey)(struct crypto_aead *tfm, const u8 *key, | 199 | int (*setkey)(struct crypto_aead *tfm, const u8 *key, |
187 | unsigned int keylen); | 200 | unsigned int keylen); |
201 | int (*setauthsize)(struct crypto_aead *tfm, unsigned int authsize); | ||
188 | int (*encrypt)(struct aead_request *req); | 202 | int (*encrypt)(struct aead_request *req); |
189 | int (*decrypt)(struct aead_request *req); | 203 | int (*decrypt)(struct aead_request *req); |
204 | int (*givencrypt)(struct aead_givcrypt_request *req); | ||
205 | int (*givdecrypt)(struct aead_givcrypt_request *req); | ||
206 | |||
207 | const char *geniv; | ||
190 | 208 | ||
191 | unsigned int ivsize; | 209 | unsigned int ivsize; |
192 | unsigned int authsize; | 210 | unsigned int maxauthsize; |
193 | }; | 211 | }; |
194 | 212 | ||
195 | struct blkcipher_alg { | 213 | struct blkcipher_alg { |
@@ -202,6 +220,8 @@ struct blkcipher_alg { | |||
202 | struct scatterlist *dst, struct scatterlist *src, | 220 | struct scatterlist *dst, struct scatterlist *src, |
203 | unsigned int nbytes); | 221 | unsigned int nbytes); |
204 | 222 | ||
223 | const char *geniv; | ||
224 | |||
205 | unsigned int min_keysize; | 225 | unsigned int min_keysize; |
206 | unsigned int max_keysize; | 226 | unsigned int max_keysize; |
207 | unsigned int ivsize; | 227 | unsigned int ivsize; |
@@ -317,6 +337,11 @@ struct ablkcipher_tfm { | |||
317 | unsigned int keylen); | 337 | unsigned int keylen); |
318 | int (*encrypt)(struct ablkcipher_request *req); | 338 | int (*encrypt)(struct ablkcipher_request *req); |
319 | int (*decrypt)(struct ablkcipher_request *req); | 339 | int (*decrypt)(struct ablkcipher_request *req); |
340 | int (*givencrypt)(struct skcipher_givcrypt_request *req); | ||
341 | int (*givdecrypt)(struct skcipher_givcrypt_request *req); | ||
342 | |||
343 | struct crypto_ablkcipher *base; | ||
344 | |||
320 | unsigned int ivsize; | 345 | unsigned int ivsize; |
321 | unsigned int reqsize; | 346 | unsigned int reqsize; |
322 | }; | 347 | }; |
@@ -326,6 +351,11 @@ struct aead_tfm { | |||
326 | unsigned int keylen); | 351 | unsigned int keylen); |
327 | int (*encrypt)(struct aead_request *req); | 352 | int (*encrypt)(struct aead_request *req); |
328 | int (*decrypt)(struct aead_request *req); | 353 | int (*decrypt)(struct aead_request *req); |
354 | int (*givencrypt)(struct aead_givcrypt_request *req); | ||
355 | int (*givdecrypt)(struct aead_givcrypt_request *req); | ||
356 | |||
357 | struct crypto_aead *base; | ||
358 | |||
329 | unsigned int ivsize; | 359 | unsigned int ivsize; |
330 | unsigned int authsize; | 360 | unsigned int authsize; |
331 | unsigned int reqsize; | 361 | unsigned int reqsize; |
@@ -525,17 +555,23 @@ static inline struct crypto_ablkcipher *__crypto_ablkcipher_cast( | |||
525 | return (struct crypto_ablkcipher *)tfm; | 555 | return (struct crypto_ablkcipher *)tfm; |
526 | } | 556 | } |
527 | 557 | ||
528 | static inline struct crypto_ablkcipher *crypto_alloc_ablkcipher( | 558 | static inline u32 crypto_skcipher_type(u32 type) |
529 | const char *alg_name, u32 type, u32 mask) | ||
530 | { | 559 | { |
531 | type &= ~CRYPTO_ALG_TYPE_MASK; | 560 | type &= ~(CRYPTO_ALG_TYPE_MASK | CRYPTO_ALG_GENIV); |
532 | type |= CRYPTO_ALG_TYPE_BLKCIPHER; | 561 | type |= CRYPTO_ALG_TYPE_BLKCIPHER; |
533 | mask |= CRYPTO_ALG_TYPE_MASK; | 562 | return type; |
563 | } | ||
534 | 564 | ||
535 | return __crypto_ablkcipher_cast( | 565 | static inline u32 crypto_skcipher_mask(u32 mask) |
536 | crypto_alloc_base(alg_name, type, mask)); | 566 | { |
567 | mask &= ~(CRYPTO_ALG_TYPE_MASK | CRYPTO_ALG_GENIV); | ||
568 | mask |= CRYPTO_ALG_TYPE_BLKCIPHER_MASK; | ||
569 | return mask; | ||
537 | } | 570 | } |
538 | 571 | ||
572 | struct crypto_ablkcipher *crypto_alloc_ablkcipher(const char *alg_name, | ||
573 | u32 type, u32 mask); | ||
574 | |||
539 | static inline struct crypto_tfm *crypto_ablkcipher_tfm( | 575 | static inline struct crypto_tfm *crypto_ablkcipher_tfm( |
540 | struct crypto_ablkcipher *tfm) | 576 | struct crypto_ablkcipher *tfm) |
541 | { | 577 | { |
@@ -550,11 +586,8 @@ static inline void crypto_free_ablkcipher(struct crypto_ablkcipher *tfm) | |||
550 | static inline int crypto_has_ablkcipher(const char *alg_name, u32 type, | 586 | static inline int crypto_has_ablkcipher(const char *alg_name, u32 type, |
551 | u32 mask) | 587 | u32 mask) |
552 | { | 588 | { |
553 | type &= ~CRYPTO_ALG_TYPE_MASK; | 589 | return crypto_has_alg(alg_name, crypto_skcipher_type(type), |
554 | type |= CRYPTO_ALG_TYPE_BLKCIPHER; | 590 | crypto_skcipher_mask(mask)); |
555 | mask |= CRYPTO_ALG_TYPE_MASK; | ||
556 | |||
557 | return crypto_has_alg(alg_name, type, mask); | ||
558 | } | 591 | } |
559 | 592 | ||
560 | static inline struct ablkcipher_tfm *crypto_ablkcipher_crt( | 593 | static inline struct ablkcipher_tfm *crypto_ablkcipher_crt( |
@@ -601,7 +634,9 @@ static inline void crypto_ablkcipher_clear_flags(struct crypto_ablkcipher *tfm, | |||
601 | static inline int crypto_ablkcipher_setkey(struct crypto_ablkcipher *tfm, | 634 | static inline int crypto_ablkcipher_setkey(struct crypto_ablkcipher *tfm, |
602 | const u8 *key, unsigned int keylen) | 635 | const u8 *key, unsigned int keylen) |
603 | { | 636 | { |
604 | return crypto_ablkcipher_crt(tfm)->setkey(tfm, key, keylen); | 637 | struct ablkcipher_tfm *crt = crypto_ablkcipher_crt(tfm); |
638 | |||
639 | return crt->setkey(crt->base, key, keylen); | ||
605 | } | 640 | } |
606 | 641 | ||
607 | static inline struct crypto_ablkcipher *crypto_ablkcipher_reqtfm( | 642 | static inline struct crypto_ablkcipher *crypto_ablkcipher_reqtfm( |
@@ -633,7 +668,7 @@ static inline unsigned int crypto_ablkcipher_reqsize( | |||
633 | static inline void ablkcipher_request_set_tfm( | 668 | static inline void ablkcipher_request_set_tfm( |
634 | struct ablkcipher_request *req, struct crypto_ablkcipher *tfm) | 669 | struct ablkcipher_request *req, struct crypto_ablkcipher *tfm) |
635 | { | 670 | { |
636 | req->base.tfm = crypto_ablkcipher_tfm(tfm); | 671 | req->base.tfm = crypto_ablkcipher_tfm(crypto_ablkcipher_crt(tfm)->base); |
637 | } | 672 | } |
638 | 673 | ||
639 | static inline struct ablkcipher_request *ablkcipher_request_cast( | 674 | static inline struct ablkcipher_request *ablkcipher_request_cast( |
@@ -686,15 +721,7 @@ static inline struct crypto_aead *__crypto_aead_cast(struct crypto_tfm *tfm) | |||
686 | return (struct crypto_aead *)tfm; | 721 | return (struct crypto_aead *)tfm; |
687 | } | 722 | } |
688 | 723 | ||
689 | static inline struct crypto_aead *crypto_alloc_aead(const char *alg_name, | 724 | struct crypto_aead *crypto_alloc_aead(const char *alg_name, u32 type, u32 mask); |
690 | u32 type, u32 mask) | ||
691 | { | ||
692 | type &= ~CRYPTO_ALG_TYPE_MASK; | ||
693 | type |= CRYPTO_ALG_TYPE_AEAD; | ||
694 | mask |= CRYPTO_ALG_TYPE_MASK; | ||
695 | |||
696 | return __crypto_aead_cast(crypto_alloc_base(alg_name, type, mask)); | ||
697 | } | ||
698 | 725 | ||
699 | static inline struct crypto_tfm *crypto_aead_tfm(struct crypto_aead *tfm) | 726 | static inline struct crypto_tfm *crypto_aead_tfm(struct crypto_aead *tfm) |
700 | { | 727 | { |
@@ -749,9 +776,13 @@ static inline void crypto_aead_clear_flags(struct crypto_aead *tfm, u32 flags) | |||
749 | static inline int crypto_aead_setkey(struct crypto_aead *tfm, const u8 *key, | 776 | static inline int crypto_aead_setkey(struct crypto_aead *tfm, const u8 *key, |
750 | unsigned int keylen) | 777 | unsigned int keylen) |
751 | { | 778 | { |
752 | return crypto_aead_crt(tfm)->setkey(tfm, key, keylen); | 779 | struct aead_tfm *crt = crypto_aead_crt(tfm); |
780 | |||
781 | return crt->setkey(crt->base, key, keylen); | ||
753 | } | 782 | } |
754 | 783 | ||
784 | int crypto_aead_setauthsize(struct crypto_aead *tfm, unsigned int authsize); | ||
785 | |||
755 | static inline struct crypto_aead *crypto_aead_reqtfm(struct aead_request *req) | 786 | static inline struct crypto_aead *crypto_aead_reqtfm(struct aead_request *req) |
756 | { | 787 | { |
757 | return __crypto_aead_cast(req->base.tfm); | 788 | return __crypto_aead_cast(req->base.tfm); |
@@ -775,7 +806,7 @@ static inline unsigned int crypto_aead_reqsize(struct crypto_aead *tfm) | |||
775 | static inline void aead_request_set_tfm(struct aead_request *req, | 806 | static inline void aead_request_set_tfm(struct aead_request *req, |
776 | struct crypto_aead *tfm) | 807 | struct crypto_aead *tfm) |
777 | { | 808 | { |
778 | req->base.tfm = crypto_aead_tfm(tfm); | 809 | req->base.tfm = crypto_aead_tfm(crypto_aead_crt(tfm)->base); |
779 | } | 810 | } |
780 | 811 | ||
781 | static inline struct aead_request *aead_request_alloc(struct crypto_aead *tfm, | 812 | static inline struct aead_request *aead_request_alloc(struct crypto_aead *tfm, |
@@ -841,9 +872,9 @@ static inline struct crypto_blkcipher *crypto_blkcipher_cast( | |||
841 | static inline struct crypto_blkcipher *crypto_alloc_blkcipher( | 872 | static inline struct crypto_blkcipher *crypto_alloc_blkcipher( |
842 | const char *alg_name, u32 type, u32 mask) | 873 | const char *alg_name, u32 type, u32 mask) |
843 | { | 874 | { |
844 | type &= ~(CRYPTO_ALG_TYPE_MASK | CRYPTO_ALG_ASYNC); | 875 | type &= ~CRYPTO_ALG_TYPE_MASK; |
845 | type |= CRYPTO_ALG_TYPE_BLKCIPHER; | 876 | type |= CRYPTO_ALG_TYPE_BLKCIPHER; |
846 | mask |= CRYPTO_ALG_TYPE_MASK | CRYPTO_ALG_ASYNC; | 877 | mask |= CRYPTO_ALG_TYPE_MASK; |
847 | 878 | ||
848 | return __crypto_blkcipher_cast(crypto_alloc_base(alg_name, type, mask)); | 879 | return __crypto_blkcipher_cast(crypto_alloc_base(alg_name, type, mask)); |
849 | } | 880 | } |
@@ -861,9 +892,9 @@ static inline void crypto_free_blkcipher(struct crypto_blkcipher *tfm) | |||
861 | 892 | ||
862 | static inline int crypto_has_blkcipher(const char *alg_name, u32 type, u32 mask) | 893 | static inline int crypto_has_blkcipher(const char *alg_name, u32 type, u32 mask) |
863 | { | 894 | { |
864 | type &= ~(CRYPTO_ALG_TYPE_MASK | CRYPTO_ALG_ASYNC); | 895 | type &= ~CRYPTO_ALG_TYPE_MASK; |
865 | type |= CRYPTO_ALG_TYPE_BLKCIPHER; | 896 | type |= CRYPTO_ALG_TYPE_BLKCIPHER; |
866 | mask |= CRYPTO_ALG_TYPE_MASK | CRYPTO_ALG_ASYNC; | 897 | mask |= CRYPTO_ALG_TYPE_MASK; |
867 | 898 | ||
868 | return crypto_has_alg(alg_name, type, mask); | 899 | return crypto_has_alg(alg_name, type, mask); |
869 | } | 900 | } |
@@ -1081,6 +1112,7 @@ static inline struct crypto_hash *crypto_alloc_hash(const char *alg_name, | |||
1081 | u32 type, u32 mask) | 1112 | u32 type, u32 mask) |
1082 | { | 1113 | { |
1083 | type &= ~CRYPTO_ALG_TYPE_MASK; | 1114 | type &= ~CRYPTO_ALG_TYPE_MASK; |
1115 | mask &= ~CRYPTO_ALG_TYPE_MASK; | ||
1084 | type |= CRYPTO_ALG_TYPE_HASH; | 1116 | type |= CRYPTO_ALG_TYPE_HASH; |
1085 | mask |= CRYPTO_ALG_TYPE_HASH_MASK; | 1117 | mask |= CRYPTO_ALG_TYPE_HASH_MASK; |
1086 | 1118 | ||
@@ -1100,6 +1132,7 @@ static inline void crypto_free_hash(struct crypto_hash *tfm) | |||
1100 | static inline int crypto_has_hash(const char *alg_name, u32 type, u32 mask) | 1132 | static inline int crypto_has_hash(const char *alg_name, u32 type, u32 mask) |
1101 | { | 1133 | { |
1102 | type &= ~CRYPTO_ALG_TYPE_MASK; | 1134 | type &= ~CRYPTO_ALG_TYPE_MASK; |
1135 | mask &= ~CRYPTO_ALG_TYPE_MASK; | ||
1103 | type |= CRYPTO_ALG_TYPE_HASH; | 1136 | type |= CRYPTO_ALG_TYPE_HASH; |
1104 | mask |= CRYPTO_ALG_TYPE_HASH_MASK; | 1137 | mask |= CRYPTO_ALG_TYPE_HASH_MASK; |
1105 | 1138 | ||
diff --git a/include/linux/hw_random.h b/include/linux/hw_random.h index 21ea7610e177..85d11916e9ea 100644 --- a/include/linux/hw_random.h +++ b/include/linux/hw_random.h | |||
@@ -33,7 +33,7 @@ struct hwrng { | |||
33 | const char *name; | 33 | const char *name; |
34 | int (*init)(struct hwrng *rng); | 34 | int (*init)(struct hwrng *rng); |
35 | void (*cleanup)(struct hwrng *rng); | 35 | void (*cleanup)(struct hwrng *rng); |
36 | int (*data_present)(struct hwrng *rng); | 36 | int (*data_present)(struct hwrng *rng, int wait); |
37 | int (*data_read)(struct hwrng *rng, u32 *data); | 37 | int (*data_read)(struct hwrng *rng, u32 *data); |
38 | unsigned long priv; | 38 | unsigned long priv; |
39 | 39 | ||