aboutsummaryrefslogtreecommitdiffstats
path: root/crypto
diff options
context:
space:
mode:
authorIngo Molnar <mingo@elte.hu>2008-10-15 07:46:29 -0400
committerIngo Molnar <mingo@elte.hu>2008-10-15 07:46:29 -0400
commitb2aaf8f74cdc84a9182f6cabf198b7763bcb9d40 (patch)
tree53ccb1c2c14751fe69cf93102e76e97021f6df07 /crypto
parent4f962d4d65923d7b722192e729840cfb79af0a5a (diff)
parent278429cff8809958d25415ba0ed32b59866ab1a8 (diff)
Merge branch 'linus' into stackprotector
Conflicts: arch/x86/kernel/Makefile include/asm-x86/pda.h
Diffstat (limited to 'crypto')
-rw-r--r--crypto/Kconfig109
-rw-r--r--crypto/Makefile17
-rw-r--r--crypto/ahash.c194
-rw-r--r--crypto/algapi.c147
-rw-r--r--crypto/algboss.c (renamed from crypto/cryptomgr.c)92
-rw-r--r--crypto/ansi_cprng.c417
-rw-r--r--crypto/api.c89
-rw-r--r--crypto/async_tx/async_memcpy.c12
-rw-r--r--crypto/async_tx/async_memset.c12
-rw-r--r--crypto/async_tx/async_tx.c37
-rw-r--r--crypto/async_tx/async_xor.c263
-rw-r--r--crypto/authenc.c10
-rw-r--r--crypto/blkcipher.c29
-rw-r--r--crypto/chainiv.c54
-rw-r--r--crypto/crc32c.c128
-rw-r--r--crypto/cryptd.c253
-rw-r--r--crypto/digest.c83
-rw-r--r--crypto/eseqiv.c35
-rw-r--r--crypto/fips.c27
-rw-r--r--crypto/hash.c102
-rw-r--r--crypto/hmac.c16
-rw-r--r--crypto/internal.h19
-rw-r--r--crypto/krng.c66
-rw-r--r--crypto/proc.c57
-rw-r--r--crypto/ripemd.h43
-rw-r--r--crypto/rmd128.c325
-rw-r--r--crypto/rmd160.c369
-rw-r--r--crypto/rmd256.c344
-rw-r--r--crypto/rmd320.c393
-rw-r--r--crypto/rng.c126
-rw-r--r--crypto/seqiv.c27
-rw-r--r--crypto/tcrypt.c1319
-rw-r--r--crypto/tcrypt.h8201
-rw-r--r--crypto/testmgr.c1868
-rw-r--r--crypto/testmgr.h8738
35 files changed, 14362 insertions, 9659 deletions
diff --git a/crypto/Kconfig b/crypto/Kconfig
index 864456c140fe..39dbd8e4dde1 100644
--- a/crypto/Kconfig
+++ b/crypto/Kconfig
@@ -21,6 +21,14 @@ if CRYPTO
21 21
22comment "Crypto core or helper" 22comment "Crypto core or helper"
23 23
24config CRYPTO_FIPS
25 bool "FIPS 200 compliance"
26 help
27 This options enables the fips boot option which is
28 required if you want to system to operate in a FIPS 200
29 certification. You should say no unless you know what
30 this is.
31
24config CRYPTO_ALGAPI 32config CRYPTO_ALGAPI
25 tristate 33 tristate
26 help 34 help
@@ -33,14 +41,21 @@ config CRYPTO_AEAD
33config CRYPTO_BLKCIPHER 41config CRYPTO_BLKCIPHER
34 tristate 42 tristate
35 select CRYPTO_ALGAPI 43 select CRYPTO_ALGAPI
44 select CRYPTO_RNG
36 45
37config CRYPTO_HASH 46config CRYPTO_HASH
38 tristate 47 tristate
39 select CRYPTO_ALGAPI 48 select CRYPTO_ALGAPI
40 49
50config CRYPTO_RNG
51 tristate
52 select CRYPTO_ALGAPI
53
41config CRYPTO_MANAGER 54config CRYPTO_MANAGER
42 tristate "Cryptographic algorithm manager" 55 tristate "Cryptographic algorithm manager"
43 select CRYPTO_ALGAPI 56 select CRYPTO_AEAD
57 select CRYPTO_HASH
58 select CRYPTO_BLKCIPHER
44 help 59 help
45 Create default cryptographic template instantiations such as 60 Create default cryptographic template instantiations such as
46 cbc(aes). 61 cbc(aes).
@@ -65,6 +80,7 @@ config CRYPTO_NULL
65config CRYPTO_CRYPTD 80config CRYPTO_CRYPTD
66 tristate "Software async crypto daemon" 81 tristate "Software async crypto daemon"
67 select CRYPTO_BLKCIPHER 82 select CRYPTO_BLKCIPHER
83 select CRYPTO_HASH
68 select CRYPTO_MANAGER 84 select CRYPTO_MANAGER
69 help 85 help
70 This is a generic software asynchronous crypto daemon that 86 This is a generic software asynchronous crypto daemon that
@@ -84,9 +100,7 @@ config CRYPTO_AUTHENC
84config CRYPTO_TEST 100config CRYPTO_TEST
85 tristate "Testing module" 101 tristate "Testing module"
86 depends on m 102 depends on m
87 select CRYPTO_ALGAPI 103 select CRYPTO_MANAGER
88 select CRYPTO_AEAD
89 select CRYPTO_BLKCIPHER
90 help 104 help
91 Quick & dirty crypto test module. 105 Quick & dirty crypto test module.
92 106
@@ -112,6 +126,7 @@ config CRYPTO_SEQIV
112 tristate "Sequence Number IV Generator" 126 tristate "Sequence Number IV Generator"
113 select CRYPTO_AEAD 127 select CRYPTO_AEAD
114 select CRYPTO_BLKCIPHER 128 select CRYPTO_BLKCIPHER
129 select CRYPTO_RNG
115 help 130 help
116 This IV generator generates an IV based on a sequence number by 131 This IV generator generates an IV based on a sequence number by
117 xoring it with a salt. This algorithm is mainly useful for CTR 132 xoring it with a salt. This algorithm is mainly useful for CTR
@@ -212,13 +227,25 @@ comment "Digest"
212 227
213config CRYPTO_CRC32C 228config CRYPTO_CRC32C
214 tristate "CRC32c CRC algorithm" 229 tristate "CRC32c CRC algorithm"
215 select CRYPTO_ALGAPI 230 select CRYPTO_HASH
216 select LIBCRC32C 231 select LIBCRC32C
217 help 232 help
218 Castagnoli, et al Cyclic Redundancy-Check Algorithm. Used 233 Castagnoli, et al Cyclic Redundancy-Check Algorithm. Used
219 by iSCSI for header and data digests and by others. 234 by iSCSI for header and data digests and by others.
220 See Castagnoli93. This implementation uses lib/libcrc32c. 235 See Castagnoli93. This implementation uses lib/libcrc32c.
221 Module will be crc32c. 236 Module will be crc32c.
237
238config CRYPTO_CRC32C_INTEL
239 tristate "CRC32c INTEL hardware acceleration"
240 depends on X86
241 select CRYPTO_HASH
242 help
243 In Intel processor with SSE4.2 supported, the processor will
244 support CRC32C implementation using hardware accelerated CRC32
245 instruction. This option will create 'crc32c-intel' module,
246 which will enable any routine to use the CRC32 instruction to
247 gain performance compared with software implementation.
248 Module will be crc32c-intel.
222 249
223config CRYPTO_MD4 250config CRYPTO_MD4
224 tristate "MD4 digest algorithm" 251 tristate "MD4 digest algorithm"
@@ -241,6 +268,60 @@ config CRYPTO_MICHAEL_MIC
241 should not be used for other purposes because of the weakness 268 should not be used for other purposes because of the weakness
242 of the algorithm. 269 of the algorithm.
243 270
271config CRYPTO_RMD128
272 tristate "RIPEMD-128 digest algorithm"
273 select CRYPTO_ALGAPI
274 help
275 RIPEMD-128 (ISO/IEC 10118-3:2004).
276
277 RIPEMD-128 is a 128-bit cryptographic hash function. It should only
278 to be used as a secure replacement for RIPEMD. For other use cases
279 RIPEMD-160 should be used.
280
281 Developed by Hans Dobbertin, Antoon Bosselaers and Bart Preneel.
282 See <http://home.esat.kuleuven.be/~bosselae/ripemd160.html>
283
284config CRYPTO_RMD160
285 tristate "RIPEMD-160 digest algorithm"
286 select CRYPTO_ALGAPI
287 help
288 RIPEMD-160 (ISO/IEC 10118-3:2004).
289
290 RIPEMD-160 is a 160-bit cryptographic hash function. It is intended
291 to be used as a secure replacement for the 128-bit hash functions
292 MD4, MD5 and it's predecessor RIPEMD
293 (not to be confused with RIPEMD-128).
294
295 It's speed is comparable to SHA1 and there are no known attacks
296 against RIPEMD-160.
297
298 Developed by Hans Dobbertin, Antoon Bosselaers and Bart Preneel.
299 See <http://home.esat.kuleuven.be/~bosselae/ripemd160.html>
300
301config CRYPTO_RMD256
302 tristate "RIPEMD-256 digest algorithm"
303 select CRYPTO_ALGAPI
304 help
305 RIPEMD-256 is an optional extension of RIPEMD-128 with a
306 256 bit hash. It is intended for applications that require
307 longer hash-results, without needing a larger security level
308 (than RIPEMD-128).
309
310 Developed by Hans Dobbertin, Antoon Bosselaers and Bart Preneel.
311 See <http://home.esat.kuleuven.be/~bosselae/ripemd160.html>
312
313config CRYPTO_RMD320
314 tristate "RIPEMD-320 digest algorithm"
315 select CRYPTO_ALGAPI
316 help
317 RIPEMD-320 is an optional extension of RIPEMD-160 with a
318 320 bit hash. It is intended for applications that require
319 longer hash-results, without needing a larger security level
320 (than RIPEMD-160).
321
322 Developed by Hans Dobbertin, Antoon Bosselaers and Bart Preneel.
323 See <http://home.esat.kuleuven.be/~bosselae/ripemd160.html>
324
244config CRYPTO_SHA1 325config CRYPTO_SHA1
245 tristate "SHA1 digest algorithm" 326 tristate "SHA1 digest algorithm"
246 select CRYPTO_ALGAPI 327 select CRYPTO_ALGAPI
@@ -256,8 +337,8 @@ config CRYPTO_SHA256
256 This version of SHA implements a 256 bit hash with 128 bits of 337 This version of SHA implements a 256 bit hash with 128 bits of
257 security against collision attacks. 338 security against collision attacks.
258 339
259 This code also includes SHA-224, a 224 bit hash with 112 bits 340 This code also includes SHA-224, a 224 bit hash with 112 bits
260 of security against collision attacks. 341 of security against collision attacks.
261 342
262config CRYPTO_SHA512 343config CRYPTO_SHA512
263 tristate "SHA384 and SHA512 digest algorithms" 344 tristate "SHA384 and SHA512 digest algorithms"
@@ -614,6 +695,18 @@ config CRYPTO_LZO
614 help 695 help
615 This is the LZO algorithm. 696 This is the LZO algorithm.
616 697
698comment "Random Number Generation"
699
700config CRYPTO_ANSI_CPRNG
701 tristate "Pseudo Random Number Generation for Cryptographic modules"
702 select CRYPTO_AES
703 select CRYPTO_RNG
704 select CRYPTO_FIPS
705 help
706 This option enables the generic pseudo random number generator
707 for cryptographic modules. Uses the Algorithm specified in
708 ANSI X9.31 A.2.4
709
617source "drivers/crypto/Kconfig" 710source "drivers/crypto/Kconfig"
618 711
619endif # if CRYPTO 712endif # if CRYPTO
diff --git a/crypto/Makefile b/crypto/Makefile
index ca024418f4fb..5862b807334e 100644
--- a/crypto/Makefile
+++ b/crypto/Makefile
@@ -5,6 +5,8 @@
5obj-$(CONFIG_CRYPTO) += crypto.o 5obj-$(CONFIG_CRYPTO) += crypto.o
6crypto-objs := api.o cipher.o digest.o compress.o 6crypto-objs := api.o cipher.o digest.o compress.o
7 7
8obj-$(CONFIG_CRYPTO_FIPS) += fips.o
9
8crypto_algapi-$(CONFIG_PROC_FS) += proc.o 10crypto_algapi-$(CONFIG_PROC_FS) += proc.o
9crypto_algapi-objs := algapi.o scatterwalk.o $(crypto_algapi-y) 11crypto_algapi-objs := algapi.o scatterwalk.o $(crypto_algapi-y)
10obj-$(CONFIG_CRYPTO_ALGAPI) += crypto_algapi.o 12obj-$(CONFIG_CRYPTO_ALGAPI) += crypto_algapi.o
@@ -13,20 +15,27 @@ obj-$(CONFIG_CRYPTO_AEAD) += aead.o
13 15
14crypto_blkcipher-objs := ablkcipher.o 16crypto_blkcipher-objs := ablkcipher.o
15crypto_blkcipher-objs += blkcipher.o 17crypto_blkcipher-objs += blkcipher.o
16crypto_blkcipher-objs += chainiv.o
17crypto_blkcipher-objs += eseqiv.o
18obj-$(CONFIG_CRYPTO_BLKCIPHER) += crypto_blkcipher.o 18obj-$(CONFIG_CRYPTO_BLKCIPHER) += crypto_blkcipher.o
19obj-$(CONFIG_CRYPTO_BLKCIPHER) += chainiv.o
20obj-$(CONFIG_CRYPTO_BLKCIPHER) += eseqiv.o
19obj-$(CONFIG_CRYPTO_SEQIV) += seqiv.o 21obj-$(CONFIG_CRYPTO_SEQIV) += seqiv.o
20 22
21crypto_hash-objs := hash.o 23crypto_hash-objs := hash.o
24crypto_hash-objs += ahash.o
22obj-$(CONFIG_CRYPTO_HASH) += crypto_hash.o 25obj-$(CONFIG_CRYPTO_HASH) += crypto_hash.o
23 26
27cryptomgr-objs := algboss.o testmgr.o
28
24obj-$(CONFIG_CRYPTO_MANAGER) += cryptomgr.o 29obj-$(CONFIG_CRYPTO_MANAGER) += cryptomgr.o
25obj-$(CONFIG_CRYPTO_HMAC) += hmac.o 30obj-$(CONFIG_CRYPTO_HMAC) += hmac.o
26obj-$(CONFIG_CRYPTO_XCBC) += xcbc.o 31obj-$(CONFIG_CRYPTO_XCBC) += xcbc.o
27obj-$(CONFIG_CRYPTO_NULL) += crypto_null.o 32obj-$(CONFIG_CRYPTO_NULL) += crypto_null.o
28obj-$(CONFIG_CRYPTO_MD4) += md4.o 33obj-$(CONFIG_CRYPTO_MD4) += md4.o
29obj-$(CONFIG_CRYPTO_MD5) += md5.o 34obj-$(CONFIG_CRYPTO_MD5) += md5.o
35obj-$(CONFIG_CRYPTO_RMD128) += rmd128.o
36obj-$(CONFIG_CRYPTO_RMD160) += rmd160.o
37obj-$(CONFIG_CRYPTO_RMD256) += rmd256.o
38obj-$(CONFIG_CRYPTO_RMD320) += rmd320.o
30obj-$(CONFIG_CRYPTO_SHA1) += sha1_generic.o 39obj-$(CONFIG_CRYPTO_SHA1) += sha1_generic.o
31obj-$(CONFIG_CRYPTO_SHA256) += sha256_generic.o 40obj-$(CONFIG_CRYPTO_SHA256) += sha256_generic.o
32obj-$(CONFIG_CRYPTO_SHA512) += sha512_generic.o 41obj-$(CONFIG_CRYPTO_SHA512) += sha512_generic.o
@@ -64,7 +73,9 @@ obj-$(CONFIG_CRYPTO_MICHAEL_MIC) += michael_mic.o
64obj-$(CONFIG_CRYPTO_CRC32C) += crc32c.o 73obj-$(CONFIG_CRYPTO_CRC32C) += crc32c.o
65obj-$(CONFIG_CRYPTO_AUTHENC) += authenc.o 74obj-$(CONFIG_CRYPTO_AUTHENC) += authenc.o
66obj-$(CONFIG_CRYPTO_LZO) += lzo.o 75obj-$(CONFIG_CRYPTO_LZO) += lzo.o
67 76obj-$(CONFIG_CRYPTO_RNG) += rng.o
77obj-$(CONFIG_CRYPTO_RNG) += krng.o
78obj-$(CONFIG_CRYPTO_ANSI_CPRNG) += ansi_cprng.o
68obj-$(CONFIG_CRYPTO_TEST) += tcrypt.o 79obj-$(CONFIG_CRYPTO_TEST) += tcrypt.o
69 80
70# 81#
diff --git a/crypto/ahash.c b/crypto/ahash.c
new file mode 100644
index 000000000000..27128f2c687a
--- /dev/null
+++ b/crypto/ahash.c
@@ -0,0 +1,194 @@
1/*
2 * Asynchronous Cryptographic Hash operations.
3 *
4 * This is the asynchronous version of hash.c with notification of
5 * completion via a callback.
6 *
7 * Copyright (c) 2008 Loc Ho <lho@amcc.com>
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/hash.h>
17#include <crypto/scatterwalk.h>
18#include <linux/err.h>
19#include <linux/kernel.h>
20#include <linux/module.h>
21#include <linux/sched.h>
22#include <linux/slab.h>
23#include <linux/seq_file.h>
24
25#include "internal.h"
26
27static int hash_walk_next(struct crypto_hash_walk *walk)
28{
29 unsigned int alignmask = walk->alignmask;
30 unsigned int offset = walk->offset;
31 unsigned int nbytes = min(walk->entrylen,
32 ((unsigned int)(PAGE_SIZE)) - offset);
33
34 walk->data = crypto_kmap(walk->pg, 0);
35 walk->data += offset;
36
37 if (offset & alignmask)
38 nbytes = alignmask + 1 - (offset & alignmask);
39
40 walk->entrylen -= nbytes;
41 return nbytes;
42}
43
44static int hash_walk_new_entry(struct crypto_hash_walk *walk)
45{
46 struct scatterlist *sg;
47
48 sg = walk->sg;
49 walk->pg = sg_page(sg);
50 walk->offset = sg->offset;
51 walk->entrylen = sg->length;
52
53 if (walk->entrylen > walk->total)
54 walk->entrylen = walk->total;
55 walk->total -= walk->entrylen;
56
57 return hash_walk_next(walk);
58}
59
60int crypto_hash_walk_done(struct crypto_hash_walk *walk, int err)
61{
62 unsigned int alignmask = walk->alignmask;
63 unsigned int nbytes = walk->entrylen;
64
65 walk->data -= walk->offset;
66
67 if (nbytes && walk->offset & alignmask && !err) {
68 walk->offset += alignmask - 1;
69 walk->offset = ALIGN(walk->offset, alignmask + 1);
70 walk->data += walk->offset;
71
72 nbytes = min(nbytes,
73 ((unsigned int)(PAGE_SIZE)) - walk->offset);
74 walk->entrylen -= nbytes;
75
76 return nbytes;
77 }
78
79 crypto_kunmap(walk->data, 0);
80 crypto_yield(walk->flags);
81
82 if (err)
83 return err;
84
85 walk->offset = 0;
86
87 if (nbytes)
88 return hash_walk_next(walk);
89
90 if (!walk->total)
91 return 0;
92
93 walk->sg = scatterwalk_sg_next(walk->sg);
94
95 return hash_walk_new_entry(walk);
96}
97EXPORT_SYMBOL_GPL(crypto_hash_walk_done);
98
99int crypto_hash_walk_first(struct ahash_request *req,
100 struct crypto_hash_walk *walk)
101{
102 walk->total = req->nbytes;
103
104 if (!walk->total)
105 return 0;
106
107 walk->alignmask = crypto_ahash_alignmask(crypto_ahash_reqtfm(req));
108 walk->sg = req->src;
109 walk->flags = req->base.flags;
110
111 return hash_walk_new_entry(walk);
112}
113EXPORT_SYMBOL_GPL(crypto_hash_walk_first);
114
115static int ahash_setkey_unaligned(struct crypto_ahash *tfm, const u8 *key,
116 unsigned int keylen)
117{
118 struct ahash_alg *ahash = crypto_ahash_alg(tfm);
119 unsigned long alignmask = crypto_ahash_alignmask(tfm);
120 int ret;
121 u8 *buffer, *alignbuffer;
122 unsigned long absize;
123
124 absize = keylen + alignmask;
125 buffer = kmalloc(absize, GFP_ATOMIC);
126 if (!buffer)
127 return -ENOMEM;
128
129 alignbuffer = (u8 *)ALIGN((unsigned long)buffer, alignmask + 1);
130 memcpy(alignbuffer, key, keylen);
131 ret = ahash->setkey(tfm, alignbuffer, keylen);
132 memset(alignbuffer, 0, keylen);
133 kfree(buffer);
134 return ret;
135}
136
137static int ahash_setkey(struct crypto_ahash *tfm, const u8 *key,
138 unsigned int keylen)
139{
140 struct ahash_alg *ahash = crypto_ahash_alg(tfm);
141 unsigned long alignmask = crypto_ahash_alignmask(tfm);
142
143 if ((unsigned long)key & alignmask)
144 return ahash_setkey_unaligned(tfm, key, keylen);
145
146 return ahash->setkey(tfm, key, keylen);
147}
148
149static unsigned int crypto_ahash_ctxsize(struct crypto_alg *alg, u32 type,
150 u32 mask)
151{
152 return alg->cra_ctxsize;
153}
154
155static int crypto_init_ahash_ops(struct crypto_tfm *tfm, u32 type, u32 mask)
156{
157 struct ahash_alg *alg = &tfm->__crt_alg->cra_ahash;
158 struct ahash_tfm *crt = &tfm->crt_ahash;
159
160 if (alg->digestsize > PAGE_SIZE / 8)
161 return -EINVAL;
162
163 crt->init = alg->init;
164 crt->update = alg->update;
165 crt->final = alg->final;
166 crt->digest = alg->digest;
167 crt->setkey = ahash_setkey;
168 crt->digestsize = alg->digestsize;
169
170 return 0;
171}
172
173static void crypto_ahash_show(struct seq_file *m, struct crypto_alg *alg)
174 __attribute__ ((unused));
175static void crypto_ahash_show(struct seq_file *m, struct crypto_alg *alg)
176{
177 seq_printf(m, "type : ahash\n");
178 seq_printf(m, "async : %s\n", alg->cra_flags & CRYPTO_ALG_ASYNC ?
179 "yes" : "no");
180 seq_printf(m, "blocksize : %u\n", alg->cra_blocksize);
181 seq_printf(m, "digestsize : %u\n", alg->cra_hash.digestsize);
182}
183
184const struct crypto_type crypto_ahash_type = {
185 .ctxsize = crypto_ahash_ctxsize,
186 .init = crypto_init_ahash_ops,
187#ifdef CONFIG_PROC_FS
188 .show = crypto_ahash_show,
189#endif
190};
191EXPORT_SYMBOL_GPL(crypto_ahash_type);
192
193MODULE_LICENSE("GPL");
194MODULE_DESCRIPTION("Asynchronous cryptographic hash type");
diff --git a/crypto/algapi.c b/crypto/algapi.c
index e65cb50cf4af..7c41e7405c41 100644
--- a/crypto/algapi.c
+++ b/crypto/algapi.c
@@ -21,15 +21,15 @@
21 21
22#include "internal.h" 22#include "internal.h"
23 23
24static void crypto_remove_final(struct list_head *list);
25
24static LIST_HEAD(crypto_template_list); 26static LIST_HEAD(crypto_template_list);
25 27
26void crypto_larval_error(const char *name, u32 type, u32 mask) 28void crypto_larval_error(const char *name, u32 type, u32 mask)
27{ 29{
28 struct crypto_alg *alg; 30 struct crypto_alg *alg;
29 31
30 down_read(&crypto_alg_sem); 32 alg = crypto_alg_lookup(name, type, mask);
31 alg = __crypto_alg_lookup(name, type, mask);
32 up_read(&crypto_alg_sem);
33 33
34 if (alg) { 34 if (alg) {
35 if (crypto_is_larval(alg)) { 35 if (crypto_is_larval(alg)) {
@@ -128,23 +128,97 @@ static void crypto_remove_spawns(struct list_head *spawns,
128 } 128 }
129} 129}
130 130
131static int __crypto_register_alg(struct crypto_alg *alg, 131static struct crypto_larval *__crypto_register_alg(struct crypto_alg *alg)
132 struct list_head *list)
133{ 132{
134 struct crypto_alg *q; 133 struct crypto_alg *q;
134 struct crypto_larval *larval;
135 int ret = -EAGAIN; 135 int ret = -EAGAIN;
136 136
137 if (crypto_is_dead(alg)) 137 if (crypto_is_dead(alg))
138 goto out; 138 goto err;
139 139
140 INIT_LIST_HEAD(&alg->cra_users); 140 INIT_LIST_HEAD(&alg->cra_users);
141 141
142 /* No cheating! */
143 alg->cra_flags &= ~CRYPTO_ALG_TESTED;
144
142 ret = -EEXIST; 145 ret = -EEXIST;
143 146
144 atomic_set(&alg->cra_refcnt, 1); 147 atomic_set(&alg->cra_refcnt, 1);
145 list_for_each_entry(q, &crypto_alg_list, cra_list) { 148 list_for_each_entry(q, &crypto_alg_list, cra_list) {
146 if (q == alg) 149 if (q == alg)
147 goto out; 150 goto err;
151
152 if (crypto_is_larval(q)) {
153 if (!strcmp(alg->cra_driver_name, q->cra_driver_name))
154 goto err;
155 continue;
156 }
157
158 if (!strcmp(q->cra_driver_name, alg->cra_name) ||
159 !strcmp(q->cra_name, alg->cra_driver_name))
160 goto err;
161 }
162
163 larval = crypto_larval_alloc(alg->cra_name,
164 alg->cra_flags | CRYPTO_ALG_TESTED, 0);
165 if (IS_ERR(larval))
166 goto out;
167
168 ret = -ENOENT;
169 larval->adult = crypto_mod_get(alg);
170 if (!larval->adult)
171 goto free_larval;
172
173 atomic_set(&larval->alg.cra_refcnt, 1);
174 memcpy(larval->alg.cra_driver_name, alg->cra_driver_name,
175 CRYPTO_MAX_ALG_NAME);
176 larval->alg.cra_priority = alg->cra_priority;
177
178 list_add(&alg->cra_list, &crypto_alg_list);
179 list_add(&larval->alg.cra_list, &crypto_alg_list);
180
181out:
182 return larval;
183
184free_larval:
185 kfree(larval);
186err:
187 larval = ERR_PTR(ret);
188 goto out;
189}
190
191void crypto_alg_tested(const char *name, int err)
192{
193 struct crypto_larval *test;
194 struct crypto_alg *alg;
195 struct crypto_alg *q;
196 LIST_HEAD(list);
197
198 down_write(&crypto_alg_sem);
199 list_for_each_entry(q, &crypto_alg_list, cra_list) {
200 if (!crypto_is_larval(q))
201 continue;
202
203 test = (struct crypto_larval *)q;
204
205 if (!strcmp(q->cra_driver_name, name))
206 goto found;
207 }
208
209 printk(KERN_ERR "alg: Unexpected test result for %s: %d\n", name, err);
210 goto unlock;
211
212found:
213 alg = test->adult;
214 if (err || list_empty(&alg->cra_list))
215 goto complete;
216
217 alg->cra_flags |= CRYPTO_ALG_TESTED;
218
219 list_for_each_entry(q, &crypto_alg_list, cra_list) {
220 if (q == alg)
221 continue;
148 222
149 if (crypto_is_moribund(q)) 223 if (crypto_is_moribund(q))
150 continue; 224 continue;
@@ -180,17 +254,18 @@ static int __crypto_register_alg(struct crypto_alg *alg,
180 q->cra_priority > alg->cra_priority) 254 q->cra_priority > alg->cra_priority)
181 continue; 255 continue;
182 256
183 crypto_remove_spawns(&q->cra_users, list, alg->cra_flags); 257 crypto_remove_spawns(&q->cra_users, &list, alg->cra_flags);
184 } 258 }
185
186 list_add(&alg->cra_list, &crypto_alg_list);
187 259
188 crypto_notify(CRYPTO_MSG_ALG_REGISTER, alg); 260complete:
189 ret = 0; 261 complete_all(&test->completion);
190 262
191out: 263unlock:
192 return ret; 264 up_write(&crypto_alg_sem);
265
266 crypto_remove_final(&list);
193} 267}
268EXPORT_SYMBOL_GPL(crypto_alg_tested);
194 269
195static void crypto_remove_final(struct list_head *list) 270static void crypto_remove_final(struct list_head *list)
196{ 271{
@@ -203,9 +278,27 @@ static void crypto_remove_final(struct list_head *list)
203 } 278 }
204} 279}
205 280
281static void crypto_wait_for_test(struct crypto_larval *larval)
282{
283 int err;
284
285 err = crypto_probing_notify(CRYPTO_MSG_ALG_REGISTER, larval->adult);
286 if (err != NOTIFY_STOP) {
287 if (WARN_ON(err != NOTIFY_DONE))
288 goto out;
289 crypto_alg_tested(larval->alg.cra_driver_name, 0);
290 }
291
292 err = wait_for_completion_interruptible(&larval->completion);
293 WARN_ON(err);
294
295out:
296 crypto_larval_kill(&larval->alg);
297}
298
206int crypto_register_alg(struct crypto_alg *alg) 299int crypto_register_alg(struct crypto_alg *alg)
207{ 300{
208 LIST_HEAD(list); 301 struct crypto_larval *larval;
209 int err; 302 int err;
210 303
211 err = crypto_check_alg(alg); 304 err = crypto_check_alg(alg);
@@ -213,11 +306,14 @@ int crypto_register_alg(struct crypto_alg *alg)
213 return err; 306 return err;
214 307
215 down_write(&crypto_alg_sem); 308 down_write(&crypto_alg_sem);
216 err = __crypto_register_alg(alg, &list); 309 larval = __crypto_register_alg(alg);
217 up_write(&crypto_alg_sem); 310 up_write(&crypto_alg_sem);
218 311
219 crypto_remove_final(&list); 312 if (IS_ERR(larval))
220 return err; 313 return PTR_ERR(larval);
314
315 crypto_wait_for_test(larval);
316 return 0;
221} 317}
222EXPORT_SYMBOL_GPL(crypto_register_alg); 318EXPORT_SYMBOL_GPL(crypto_register_alg);
223 319
@@ -335,8 +431,8 @@ EXPORT_SYMBOL_GPL(crypto_lookup_template);
335int crypto_register_instance(struct crypto_template *tmpl, 431int crypto_register_instance(struct crypto_template *tmpl,
336 struct crypto_instance *inst) 432 struct crypto_instance *inst)
337{ 433{
338 LIST_HEAD(list); 434 struct crypto_larval *larval;
339 int err = -EINVAL; 435 int err;
340 436
341 err = crypto_check_alg(&inst->alg); 437 err = crypto_check_alg(&inst->alg);
342 if (err) 438 if (err)
@@ -346,8 +442,8 @@ int crypto_register_instance(struct crypto_template *tmpl,
346 442
347 down_write(&crypto_alg_sem); 443 down_write(&crypto_alg_sem);
348 444
349 err = __crypto_register_alg(&inst->alg, &list); 445 larval = __crypto_register_alg(&inst->alg);
350 if (err) 446 if (IS_ERR(larval))
351 goto unlock; 447 goto unlock;
352 448
353 hlist_add_head(&inst->list, &tmpl->instances); 449 hlist_add_head(&inst->list, &tmpl->instances);
@@ -356,7 +452,12 @@ int crypto_register_instance(struct crypto_template *tmpl,
356unlock: 452unlock:
357 up_write(&crypto_alg_sem); 453 up_write(&crypto_alg_sem);
358 454
359 crypto_remove_final(&list); 455 err = PTR_ERR(larval);
456 if (IS_ERR(larval))
457 goto err;
458
459 crypto_wait_for_test(larval);
460 err = 0;
360 461
361err: 462err:
362 return err; 463 return err;
diff --git a/crypto/cryptomgr.c b/crypto/algboss.c
index e5e3cf848d42..4601e4267c88 100644
--- a/crypto/cryptomgr.c
+++ b/crypto/algboss.c
@@ -45,6 +45,15 @@ struct cryptomgr_param {
45 45
46 char larval[CRYPTO_MAX_ALG_NAME]; 46 char larval[CRYPTO_MAX_ALG_NAME];
47 char template[CRYPTO_MAX_ALG_NAME]; 47 char template[CRYPTO_MAX_ALG_NAME];
48
49 u32 otype;
50 u32 omask;
51};
52
53struct crypto_test_param {
54 char driver[CRYPTO_MAX_ALG_NAME];
55 char alg[CRYPTO_MAX_ALG_NAME];
56 u32 type;
48}; 57};
49 58
50static int cryptomgr_probe(void *data) 59static int cryptomgr_probe(void *data)
@@ -76,8 +85,7 @@ out:
76 module_put_and_exit(0); 85 module_put_and_exit(0);
77 86
78err: 87err:
79 crypto_larval_error(param->larval, param->type.data.type, 88 crypto_larval_error(param->larval, param->otype, param->omask);
80 param->type.data.mask);
81 goto out; 89 goto out;
82} 90}
83 91
@@ -169,13 +177,65 @@ static int cryptomgr_schedule_probe(struct crypto_larval *larval)
169 177
170 param->type.attr.rta_len = sizeof(param->type); 178 param->type.attr.rta_len = sizeof(param->type);
171 param->type.attr.rta_type = CRYPTOA_TYPE; 179 param->type.attr.rta_type = CRYPTOA_TYPE;
172 param->type.data.type = larval->alg.cra_flags; 180 param->type.data.type = larval->alg.cra_flags & ~CRYPTO_ALG_TESTED;
173 param->type.data.mask = larval->mask; 181 param->type.data.mask = larval->mask & ~CRYPTO_ALG_TESTED;
174 param->tb[0] = &param->type.attr; 182 param->tb[0] = &param->type.attr;
175 183
184 param->otype = larval->alg.cra_flags;
185 param->omask = larval->mask;
186
176 memcpy(param->larval, larval->alg.cra_name, CRYPTO_MAX_ALG_NAME); 187 memcpy(param->larval, larval->alg.cra_name, CRYPTO_MAX_ALG_NAME);
177 188
178 thread = kthread_run(cryptomgr_probe, param, "cryptomgr"); 189 thread = kthread_run(cryptomgr_probe, param, "cryptomgr_probe");
190 if (IS_ERR(thread))
191 goto err_free_param;
192
193 return NOTIFY_STOP;
194
195err_free_param:
196 kfree(param);
197err_put_module:
198 module_put(THIS_MODULE);
199err:
200 return NOTIFY_OK;
201}
202
203static int cryptomgr_test(void *data)
204{
205 struct crypto_test_param *param = data;
206 u32 type = param->type;
207 int err = 0;
208
209 if (!((type ^ CRYPTO_ALG_TYPE_BLKCIPHER) &
210 CRYPTO_ALG_TYPE_BLKCIPHER_MASK) && !(type & CRYPTO_ALG_GENIV))
211 goto skiptest;
212
213 err = alg_test(param->driver, param->alg, type, CRYPTO_ALG_TESTED);
214
215skiptest:
216 crypto_alg_tested(param->driver, err);
217
218 kfree(param);
219 module_put_and_exit(0);
220}
221
222static int cryptomgr_schedule_test(struct crypto_alg *alg)
223{
224 struct task_struct *thread;
225 struct crypto_test_param *param;
226
227 if (!try_module_get(THIS_MODULE))
228 goto err;
229
230 param = kzalloc(sizeof(*param), GFP_KERNEL);
231 if (!param)
232 goto err_put_module;
233
234 memcpy(param->driver, alg->cra_driver_name, sizeof(param->driver));
235 memcpy(param->alg, alg->cra_name, sizeof(param->alg));
236 param->type = alg->cra_flags;
237
238 thread = kthread_run(cryptomgr_test, param, "cryptomgr_test");
179 if (IS_ERR(thread)) 239 if (IS_ERR(thread))
180 goto err_free_param; 240 goto err_free_param;
181 241
@@ -195,6 +255,8 @@ static int cryptomgr_notify(struct notifier_block *this, unsigned long msg,
195 switch (msg) { 255 switch (msg) {
196 case CRYPTO_MSG_ALG_REQUEST: 256 case CRYPTO_MSG_ALG_REQUEST:
197 return cryptomgr_schedule_probe(data); 257 return cryptomgr_schedule_probe(data);
258 case CRYPTO_MSG_ALG_REGISTER:
259 return cryptomgr_schedule_test(data);
198 } 260 }
199 261
200 return NOTIFY_DONE; 262 return NOTIFY_DONE;
@@ -206,16 +268,32 @@ static struct notifier_block cryptomgr_notifier = {
206 268
207static int __init cryptomgr_init(void) 269static int __init cryptomgr_init(void)
208{ 270{
209 return crypto_register_notifier(&cryptomgr_notifier); 271 int err;
272
273 err = testmgr_init();
274 if (err)
275 return err;
276
277 err = crypto_register_notifier(&cryptomgr_notifier);
278 if (err)
279 goto free_testmgr;
280
281 return 0;
282
283free_testmgr:
284 testmgr_exit();
285 return err;
210} 286}
211 287
212static void __exit cryptomgr_exit(void) 288static void __exit cryptomgr_exit(void)
213{ 289{
214 int err = crypto_unregister_notifier(&cryptomgr_notifier); 290 int err = crypto_unregister_notifier(&cryptomgr_notifier);
215 BUG_ON(err); 291 BUG_ON(err);
292
293 testmgr_exit();
216} 294}
217 295
218module_init(cryptomgr_init); 296subsys_initcall(cryptomgr_init);
219module_exit(cryptomgr_exit); 297module_exit(cryptomgr_exit);
220 298
221MODULE_LICENSE("GPL"); 299MODULE_LICENSE("GPL");
diff --git a/crypto/ansi_cprng.c b/crypto/ansi_cprng.c
new file mode 100644
index 000000000000..72db0fd763cc
--- /dev/null
+++ b/crypto/ansi_cprng.c
@@ -0,0 +1,417 @@
1/*
2 * PRNG: Pseudo Random Number Generator
3 * Based on NIST Recommended PRNG From ANSI X9.31 Appendix A.2.4 using
4 * AES 128 cipher
5 *
6 * (C) Neil Horman <nhorman@tuxdriver.com>
7 *
8 * 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
10 * Free Software Foundation; either version 2 of the License, or (at your
11 * any later version.
12 *
13 *
14 */
15
16#include <crypto/internal/rng.h>
17#include <linux/err.h>
18#include <linux/init.h>
19#include <linux/module.h>
20#include <linux/moduleparam.h>
21#include <linux/string.h>
22
23#include "internal.h"
24
25#define DEFAULT_PRNG_KEY "0123456789abcdef"
26#define DEFAULT_PRNG_KSZ 16
27#define DEFAULT_BLK_SZ 16
28#define DEFAULT_V_SEED "zaybxcwdveuftgsh"
29
30/*
31 * Flags for the prng_context flags field
32 */
33
34#define PRNG_FIXED_SIZE 0x1
35#define PRNG_NEED_RESET 0x2
36
37/*
38 * Note: DT is our counter value
39 * I is our intermediate value
40 * V is our seed vector
41 * See http://csrc.nist.gov/groups/STM/cavp/documents/rng/931rngext.pdf
42 * for implementation details
43 */
44
45
46struct prng_context {
47 spinlock_t prng_lock;
48 unsigned char rand_data[DEFAULT_BLK_SZ];
49 unsigned char last_rand_data[DEFAULT_BLK_SZ];
50 unsigned char DT[DEFAULT_BLK_SZ];
51 unsigned char I[DEFAULT_BLK_SZ];
52 unsigned char V[DEFAULT_BLK_SZ];
53 u32 rand_data_valid;
54 struct crypto_cipher *tfm;
55 u32 flags;
56};
57
58static int dbg;
59
60static void hexdump(char *note, unsigned char *buf, unsigned int len)
61{
62 if (dbg) {
63 printk(KERN_CRIT "%s", note);
64 print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET,
65 16, 1,
66 buf, len, false);
67 }
68}
69
70#define dbgprint(format, args...) do {\
71if (dbg)\
72 printk(format, ##args);\
73} while (0)
74
75static void xor_vectors(unsigned char *in1, unsigned char *in2,
76 unsigned char *out, unsigned int size)
77{
78 int i;
79
80 for (i = 0; i < size; i++)
81 out[i] = in1[i] ^ in2[i];
82
83}
84/*
85 * Returns DEFAULT_BLK_SZ bytes of random data per call
86 * returns 0 if generation succeded, <0 if something went wrong
87 */
88static int _get_more_prng_bytes(struct prng_context *ctx)
89{
90 int i;
91 unsigned char tmp[DEFAULT_BLK_SZ];
92 unsigned char *output = NULL;
93
94
95 dbgprint(KERN_CRIT "Calling _get_more_prng_bytes for context %p\n",
96 ctx);
97
98 hexdump("Input DT: ", ctx->DT, DEFAULT_BLK_SZ);
99 hexdump("Input I: ", ctx->I, DEFAULT_BLK_SZ);
100 hexdump("Input V: ", ctx->V, DEFAULT_BLK_SZ);
101
102 /*
103 * This algorithm is a 3 stage state machine
104 */
105 for (i = 0; i < 3; i++) {
106
107 switch (i) {
108 case 0:
109 /*
110 * Start by encrypting the counter value
111 * This gives us an intermediate value I
112 */
113 memcpy(tmp, ctx->DT, DEFAULT_BLK_SZ);
114 output = ctx->I;
115 hexdump("tmp stage 0: ", tmp, DEFAULT_BLK_SZ);
116 break;
117 case 1:
118
119 /*
120 * Next xor I with our secret vector V
121 * encrypt that result to obtain our
122 * pseudo random data which we output
123 */
124 xor_vectors(ctx->I, ctx->V, tmp, DEFAULT_BLK_SZ);
125 hexdump("tmp stage 1: ", tmp, DEFAULT_BLK_SZ);
126 output = ctx->rand_data;
127 break;
128 case 2:
129 /*
130 * First check that we didn't produce the same
131 * random data that we did last time around through this
132 */
133 if (!memcmp(ctx->rand_data, ctx->last_rand_data,
134 DEFAULT_BLK_SZ)) {
135 printk(KERN_ERR
136 "ctx %p Failed repetition check!\n",
137 ctx);
138 ctx->flags |= PRNG_NEED_RESET;
139 return -EINVAL;
140 }
141 memcpy(ctx->last_rand_data, ctx->rand_data,
142 DEFAULT_BLK_SZ);
143
144 /*
145 * Lastly xor the random data with I
146 * and encrypt that to obtain a new secret vector V
147 */
148 xor_vectors(ctx->rand_data, ctx->I, tmp,
149 DEFAULT_BLK_SZ);
150 output = ctx->V;
151 hexdump("tmp stage 2: ", tmp, DEFAULT_BLK_SZ);
152 break;
153 }
154
155
156 /* do the encryption */
157 crypto_cipher_encrypt_one(ctx->tfm, output, tmp);
158
159 }
160
161 /*
162 * Now update our DT value
163 */
164 for (i = 0; i < DEFAULT_BLK_SZ; i++) {
165 ctx->DT[i] += 1;
166 if (ctx->DT[i] != 0)
167 break;
168 }
169
170 dbgprint("Returning new block for context %p\n", ctx);
171 ctx->rand_data_valid = 0;
172
173 hexdump("Output DT: ", ctx->DT, DEFAULT_BLK_SZ);
174 hexdump("Output I: ", ctx->I, DEFAULT_BLK_SZ);
175 hexdump("Output V: ", ctx->V, DEFAULT_BLK_SZ);
176 hexdump("New Random Data: ", ctx->rand_data, DEFAULT_BLK_SZ);
177
178 return 0;
179}
180
181/* Our exported functions */
182static int get_prng_bytes(char *buf, size_t nbytes, struct prng_context *ctx)
183{
184 unsigned long flags;
185 unsigned char *ptr = buf;
186 unsigned int byte_count = (unsigned int)nbytes;
187 int err;
188
189
190 if (nbytes < 0)
191 return -EINVAL;
192
193 spin_lock_irqsave(&ctx->prng_lock, flags);
194
195 err = -EINVAL;
196 if (ctx->flags & PRNG_NEED_RESET)
197 goto done;
198
199 /*
200 * If the FIXED_SIZE flag is on, only return whole blocks of
201 * pseudo random data
202 */
203 err = -EINVAL;
204 if (ctx->flags & PRNG_FIXED_SIZE) {
205 if (nbytes < DEFAULT_BLK_SZ)
206 goto done;
207 byte_count = DEFAULT_BLK_SZ;
208 }
209
210 err = byte_count;
211
212 dbgprint(KERN_CRIT "getting %d random bytes for context %p\n",
213 byte_count, ctx);
214
215
216remainder:
217 if (ctx->rand_data_valid == DEFAULT_BLK_SZ) {
218 if (_get_more_prng_bytes(ctx) < 0) {
219 memset(buf, 0, nbytes);
220 err = -EINVAL;
221 goto done;
222 }
223 }
224
225 /*
226 * Copy up to the next whole block size
227 */
228 if (byte_count < DEFAULT_BLK_SZ) {
229 for (; ctx->rand_data_valid < DEFAULT_BLK_SZ;
230 ctx->rand_data_valid++) {
231 *ptr = ctx->rand_data[ctx->rand_data_valid];
232 ptr++;
233 byte_count--;
234 if (byte_count == 0)
235 goto done;
236 }
237 }
238
239 /*
240 * Now copy whole blocks
241 */
242 for (; byte_count >= DEFAULT_BLK_SZ; byte_count -= DEFAULT_BLK_SZ) {
243 if (_get_more_prng_bytes(ctx) < 0) {
244 memset(buf, 0, nbytes);
245 err = -EINVAL;
246 goto done;
247 }
248 memcpy(ptr, ctx->rand_data, DEFAULT_BLK_SZ);
249 ctx->rand_data_valid += DEFAULT_BLK_SZ;
250 ptr += DEFAULT_BLK_SZ;
251 }
252
253 /*
254 * Now copy any extra partial data
255 */
256 if (byte_count)
257 goto remainder;
258
259done:
260 spin_unlock_irqrestore(&ctx->prng_lock, flags);
261 dbgprint(KERN_CRIT "returning %d from get_prng_bytes in context %p\n",
262 err, ctx);
263 return err;
264}
265
266static void free_prng_context(struct prng_context *ctx)
267{
268 crypto_free_cipher(ctx->tfm);
269}
270
271static int reset_prng_context(struct prng_context *ctx,
272 unsigned char *key, size_t klen,
273 unsigned char *V, unsigned char *DT)
274{
275 int ret;
276 int rc = -EINVAL;
277 unsigned char *prng_key;
278
279 spin_lock(&ctx->prng_lock);
280 ctx->flags |= PRNG_NEED_RESET;
281
282 prng_key = (key != NULL) ? key : (unsigned char *)DEFAULT_PRNG_KEY;
283
284 if (!key)
285 klen = DEFAULT_PRNG_KSZ;
286
287 if (V)
288 memcpy(ctx->V, V, DEFAULT_BLK_SZ);
289 else
290 memcpy(ctx->V, DEFAULT_V_SEED, DEFAULT_BLK_SZ);
291
292 if (DT)
293 memcpy(ctx->DT, DT, DEFAULT_BLK_SZ);
294 else
295 memset(ctx->DT, 0, DEFAULT_BLK_SZ);
296
297 memset(ctx->rand_data, 0, DEFAULT_BLK_SZ);
298 memset(ctx->last_rand_data, 0, DEFAULT_BLK_SZ);
299
300 if (ctx->tfm)
301 crypto_free_cipher(ctx->tfm);
302
303 ctx->tfm = crypto_alloc_cipher("aes", 0, 0);
304 if (IS_ERR(ctx->tfm)) {
305 dbgprint(KERN_CRIT "Failed to alloc tfm for context %p\n",
306 ctx);
307 ctx->tfm = NULL;
308 goto out;
309 }
310
311 ctx->rand_data_valid = DEFAULT_BLK_SZ;
312
313 ret = crypto_cipher_setkey(ctx->tfm, prng_key, klen);
314 if (ret) {
315 dbgprint(KERN_CRIT "PRNG: setkey() failed flags=%x\n",
316 crypto_cipher_get_flags(ctx->tfm));
317 crypto_free_cipher(ctx->tfm);
318 goto out;
319 }
320
321 rc = 0;
322 ctx->flags &= ~PRNG_NEED_RESET;
323out:
324 spin_unlock(&ctx->prng_lock);
325
326 return rc;
327
328}
329
330static int cprng_init(struct crypto_tfm *tfm)
331{
332 struct prng_context *ctx = crypto_tfm_ctx(tfm);
333
334 spin_lock_init(&ctx->prng_lock);
335
336 return reset_prng_context(ctx, NULL, DEFAULT_PRNG_KSZ, NULL, NULL);
337}
338
339static void cprng_exit(struct crypto_tfm *tfm)
340{
341 free_prng_context(crypto_tfm_ctx(tfm));
342}
343
344static int cprng_get_random(struct crypto_rng *tfm, u8 *rdata,
345 unsigned int dlen)
346{
347 struct prng_context *prng = crypto_rng_ctx(tfm);
348
349 return get_prng_bytes(rdata, dlen, prng);
350}
351
352static int cprng_reset(struct crypto_rng *tfm, u8 *seed, unsigned int slen)
353{
354 struct prng_context *prng = crypto_rng_ctx(tfm);
355 u8 *key = seed + DEFAULT_PRNG_KSZ;
356
357 if (slen < DEFAULT_PRNG_KSZ + DEFAULT_BLK_SZ)
358 return -EINVAL;
359
360 reset_prng_context(prng, key, DEFAULT_PRNG_KSZ, seed, NULL);
361
362 if (prng->flags & PRNG_NEED_RESET)
363 return -EINVAL;
364 return 0;
365}
366
367static struct crypto_alg rng_alg = {
368 .cra_name = "stdrng",
369 .cra_driver_name = "ansi_cprng",
370 .cra_priority = 100,
371 .cra_flags = CRYPTO_ALG_TYPE_RNG,
372 .cra_ctxsize = sizeof(struct prng_context),
373 .cra_type = &crypto_rng_type,
374 .cra_module = THIS_MODULE,
375 .cra_list = LIST_HEAD_INIT(rng_alg.cra_list),
376 .cra_init = cprng_init,
377 .cra_exit = cprng_exit,
378 .cra_u = {
379 .rng = {
380 .rng_make_random = cprng_get_random,
381 .rng_reset = cprng_reset,
382 .seedsize = DEFAULT_PRNG_KSZ + DEFAULT_BLK_SZ,
383 }
384 }
385};
386
387
388/* Module initalization */
389static int __init prng_mod_init(void)
390{
391 int ret = 0;
392
393 if (fips_enabled)
394 rng_alg.cra_priority += 200;
395
396 ret = crypto_register_alg(&rng_alg);
397
398 if (ret)
399 goto out;
400out:
401 return 0;
402}
403
404static void __exit prng_mod_fini(void)
405{
406 crypto_unregister_alg(&rng_alg);
407 return;
408}
409
410MODULE_LICENSE("GPL");
411MODULE_DESCRIPTION("Software Pseudo Random Number Generator");
412MODULE_AUTHOR("Neil Horman <nhorman@tuxdriver.com>");
413module_param(dbg, int, 0);
414MODULE_PARM_DESC(dbg, "Boolean to enable debugging (0/1 == off/on)");
415module_init(prng_mod_init);
416module_exit(prng_mod_fini);
417MODULE_ALIAS("stdrng");
diff --git a/crypto/api.c b/crypto/api.c
index 0a0f41ef255f..0444d242e985 100644
--- a/crypto/api.c
+++ b/crypto/api.c
@@ -55,7 +55,13 @@ void crypto_mod_put(struct crypto_alg *alg)
55} 55}
56EXPORT_SYMBOL_GPL(crypto_mod_put); 56EXPORT_SYMBOL_GPL(crypto_mod_put);
57 57
58struct crypto_alg *__crypto_alg_lookup(const char *name, u32 type, u32 mask) 58static inline int crypto_is_test_larval(struct crypto_larval *larval)
59{
60 return larval->alg.cra_driver_name[0];
61}
62
63static struct crypto_alg *__crypto_alg_lookup(const char *name, u32 type,
64 u32 mask)
59{ 65{
60 struct crypto_alg *q, *alg = NULL; 66 struct crypto_alg *q, *alg = NULL;
61 int best = -2; 67 int best = -2;
@@ -70,6 +76,7 @@ struct crypto_alg *__crypto_alg_lookup(const char *name, u32 type, u32 mask)
70 continue; 76 continue;
71 77
72 if (crypto_is_larval(q) && 78 if (crypto_is_larval(q) &&
79 !crypto_is_test_larval((struct crypto_larval *)q) &&
73 ((struct crypto_larval *)q)->mask != mask) 80 ((struct crypto_larval *)q)->mask != mask)
74 continue; 81 continue;
75 82
@@ -92,7 +99,6 @@ struct crypto_alg *__crypto_alg_lookup(const char *name, u32 type, u32 mask)
92 99
93 return alg; 100 return alg;
94} 101}
95EXPORT_SYMBOL_GPL(__crypto_alg_lookup);
96 102
97static void crypto_larval_destroy(struct crypto_alg *alg) 103static void crypto_larval_destroy(struct crypto_alg *alg)
98{ 104{
@@ -104,10 +110,8 @@ static void crypto_larval_destroy(struct crypto_alg *alg)
104 kfree(larval); 110 kfree(larval);
105} 111}
106 112
107static struct crypto_alg *crypto_larval_alloc(const char *name, u32 type, 113struct crypto_larval *crypto_larval_alloc(const char *name, u32 type, u32 mask)
108 u32 mask)
109{ 114{
110 struct crypto_alg *alg;
111 struct crypto_larval *larval; 115 struct crypto_larval *larval;
112 116
113 larval = kzalloc(sizeof(*larval), GFP_KERNEL); 117 larval = kzalloc(sizeof(*larval), GFP_KERNEL);
@@ -119,10 +123,25 @@ static struct crypto_alg *crypto_larval_alloc(const char *name, u32 type,
119 larval->alg.cra_priority = -1; 123 larval->alg.cra_priority = -1;
120 larval->alg.cra_destroy = crypto_larval_destroy; 124 larval->alg.cra_destroy = crypto_larval_destroy;
121 125
122 atomic_set(&larval->alg.cra_refcnt, 2);
123 strlcpy(larval->alg.cra_name, name, CRYPTO_MAX_ALG_NAME); 126 strlcpy(larval->alg.cra_name, name, CRYPTO_MAX_ALG_NAME);
124 init_completion(&larval->completion); 127 init_completion(&larval->completion);
125 128
129 return larval;
130}
131EXPORT_SYMBOL_GPL(crypto_larval_alloc);
132
133static struct crypto_alg *crypto_larval_add(const char *name, u32 type,
134 u32 mask)
135{
136 struct crypto_alg *alg;
137 struct crypto_larval *larval;
138
139 larval = crypto_larval_alloc(name, type, mask);
140 if (IS_ERR(larval))
141 return ERR_CAST(larval);
142
143 atomic_set(&larval->alg.cra_refcnt, 2);
144
126 down_write(&crypto_alg_sem); 145 down_write(&crypto_alg_sem);
127 alg = __crypto_alg_lookup(name, type, mask); 146 alg = __crypto_alg_lookup(name, type, mask);
128 if (!alg) { 147 if (!alg) {
@@ -152,21 +171,29 @@ EXPORT_SYMBOL_GPL(crypto_larval_kill);
152static struct crypto_alg *crypto_larval_wait(struct crypto_alg *alg) 171static struct crypto_alg *crypto_larval_wait(struct crypto_alg *alg)
153{ 172{
154 struct crypto_larval *larval = (void *)alg; 173 struct crypto_larval *larval = (void *)alg;
174 long timeout;
175
176 timeout = wait_for_completion_interruptible_timeout(
177 &larval->completion, 60 * HZ);
155 178
156 wait_for_completion_interruptible_timeout(&larval->completion, 60 * HZ);
157 alg = larval->adult; 179 alg = larval->adult;
158 if (alg) { 180 if (timeout < 0)
159 if (!crypto_mod_get(alg)) 181 alg = ERR_PTR(-EINTR);
160 alg = ERR_PTR(-EAGAIN); 182 else if (!timeout)
161 } else 183 alg = ERR_PTR(-ETIMEDOUT);
184 else if (!alg)
162 alg = ERR_PTR(-ENOENT); 185 alg = ERR_PTR(-ENOENT);
186 else if (crypto_is_test_larval(larval) &&
187 !(alg->cra_flags & CRYPTO_ALG_TESTED))
188 alg = ERR_PTR(-EAGAIN);
189 else if (!crypto_mod_get(alg))
190 alg = ERR_PTR(-EAGAIN);
163 crypto_mod_put(&larval->alg); 191 crypto_mod_put(&larval->alg);
164 192
165 return alg; 193 return alg;
166} 194}
167 195
168static struct crypto_alg *crypto_alg_lookup(const char *name, u32 type, 196struct crypto_alg *crypto_alg_lookup(const char *name, u32 type, u32 mask)
169 u32 mask)
170{ 197{
171 struct crypto_alg *alg; 198 struct crypto_alg *alg;
172 199
@@ -176,6 +203,7 @@ static struct crypto_alg *crypto_alg_lookup(const char *name, u32 type,
176 203
177 return alg; 204 return alg;
178} 205}
206EXPORT_SYMBOL_GPL(crypto_alg_lookup);
179 207
180struct crypto_alg *crypto_larval_lookup(const char *name, u32 type, u32 mask) 208struct crypto_alg *crypto_larval_lookup(const char *name, u32 type, u32 mask)
181{ 209{
@@ -192,25 +220,40 @@ struct crypto_alg *crypto_larval_lookup(const char *name, u32 type, u32 mask)
192 if (alg) 220 if (alg)
193 return crypto_is_larval(alg) ? crypto_larval_wait(alg) : alg; 221 return crypto_is_larval(alg) ? crypto_larval_wait(alg) : alg;
194 222
195 return crypto_larval_alloc(name, type, mask); 223 return crypto_larval_add(name, type, mask);
196} 224}
197EXPORT_SYMBOL_GPL(crypto_larval_lookup); 225EXPORT_SYMBOL_GPL(crypto_larval_lookup);
198 226
227int crypto_probing_notify(unsigned long val, void *v)
228{
229 int ok;
230
231 ok = blocking_notifier_call_chain(&crypto_chain, val, v);
232 if (ok == NOTIFY_DONE) {
233 request_module("cryptomgr");
234 ok = blocking_notifier_call_chain(&crypto_chain, val, v);
235 }
236
237 return ok;
238}
239EXPORT_SYMBOL_GPL(crypto_probing_notify);
240
199struct crypto_alg *crypto_alg_mod_lookup(const char *name, u32 type, u32 mask) 241struct crypto_alg *crypto_alg_mod_lookup(const char *name, u32 type, u32 mask)
200{ 242{
201 struct crypto_alg *alg; 243 struct crypto_alg *alg;
202 struct crypto_alg *larval; 244 struct crypto_alg *larval;
203 int ok; 245 int ok;
204 246
247 if (!(mask & CRYPTO_ALG_TESTED)) {
248 type |= CRYPTO_ALG_TESTED;
249 mask |= CRYPTO_ALG_TESTED;
250 }
251
205 larval = crypto_larval_lookup(name, type, mask); 252 larval = crypto_larval_lookup(name, type, mask);
206 if (IS_ERR(larval) || !crypto_is_larval(larval)) 253 if (IS_ERR(larval) || !crypto_is_larval(larval))
207 return larval; 254 return larval;
208 255
209 ok = crypto_notify(CRYPTO_MSG_ALG_REQUEST, larval); 256 ok = crypto_probing_notify(CRYPTO_MSG_ALG_REQUEST, larval);
210 if (ok == NOTIFY_DONE) {
211 request_module("cryptomgr");
212 ok = crypto_notify(CRYPTO_MSG_ALG_REQUEST, larval);
213 }
214 257
215 if (ok == NOTIFY_STOP) 258 if (ok == NOTIFY_STOP)
216 alg = crypto_larval_wait(larval); 259 alg = crypto_larval_wait(larval);
@@ -235,8 +278,12 @@ static int crypto_init_ops(struct crypto_tfm *tfm, u32 type, u32 mask)
235 return crypto_init_cipher_ops(tfm); 278 return crypto_init_cipher_ops(tfm);
236 279
237 case CRYPTO_ALG_TYPE_DIGEST: 280 case CRYPTO_ALG_TYPE_DIGEST:
238 return crypto_init_digest_ops(tfm); 281 if ((mask & CRYPTO_ALG_TYPE_HASH_MASK) !=
239 282 CRYPTO_ALG_TYPE_HASH_MASK)
283 return crypto_init_digest_ops_async(tfm);
284 else
285 return crypto_init_digest_ops(tfm);
286
240 case CRYPTO_ALG_TYPE_COMPRESS: 287 case CRYPTO_ALG_TYPE_COMPRESS:
241 return crypto_init_compress_ops(tfm); 288 return crypto_init_compress_ops(tfm);
242 289
diff --git a/crypto/async_tx/async_memcpy.c b/crypto/async_tx/async_memcpy.c
index a5eda80e8427..ddccfb01c416 100644
--- a/crypto/async_tx/async_memcpy.c
+++ b/crypto/async_tx/async_memcpy.c
@@ -73,15 +73,7 @@ async_memcpy(struct page *dest, struct page *src, unsigned int dest_offset,
73 pr_debug("%s: (sync) len: %zu\n", __func__, len); 73 pr_debug("%s: (sync) len: %zu\n", __func__, len);
74 74
75 /* wait for any prerequisite operations */ 75 /* wait for any prerequisite operations */
76 if (depend_tx) { 76 async_tx_quiesce(&depend_tx);
77 /* if ack is already set then we cannot be sure
78 * we are referring to the correct operation
79 */
80 BUG_ON(async_tx_test_ack(depend_tx));
81 if (dma_wait_for_async_tx(depend_tx) == DMA_ERROR)
82 panic("%s: DMA_ERROR waiting for depend_tx\n",
83 __func__);
84 }
85 77
86 dest_buf = kmap_atomic(dest, KM_USER0) + dest_offset; 78 dest_buf = kmap_atomic(dest, KM_USER0) + dest_offset;
87 src_buf = kmap_atomic(src, KM_USER1) + src_offset; 79 src_buf = kmap_atomic(src, KM_USER1) + src_offset;
@@ -91,7 +83,7 @@ async_memcpy(struct page *dest, struct page *src, unsigned int dest_offset,
91 kunmap_atomic(dest_buf, KM_USER0); 83 kunmap_atomic(dest_buf, KM_USER0);
92 kunmap_atomic(src_buf, KM_USER1); 84 kunmap_atomic(src_buf, KM_USER1);
93 85
94 async_tx_sync_epilog(flags, depend_tx, cb_fn, cb_param); 86 async_tx_sync_epilog(cb_fn, cb_param);
95 } 87 }
96 88
97 return tx; 89 return tx;
diff --git a/crypto/async_tx/async_memset.c b/crypto/async_tx/async_memset.c
index f5ff3906b035..5b5eb99bb244 100644
--- a/crypto/async_tx/async_memset.c
+++ b/crypto/async_tx/async_memset.c
@@ -72,19 +72,11 @@ async_memset(struct page *dest, int val, unsigned int offset,
72 dest_buf = (void *) (((char *) page_address(dest)) + offset); 72 dest_buf = (void *) (((char *) page_address(dest)) + offset);
73 73
74 /* wait for any prerequisite operations */ 74 /* wait for any prerequisite operations */
75 if (depend_tx) { 75 async_tx_quiesce(&depend_tx);
76 /* if ack is already set then we cannot be sure
77 * we are referring to the correct operation
78 */
79 BUG_ON(depend_tx->ack);
80 if (dma_wait_for_async_tx(depend_tx) == DMA_ERROR)
81 panic("%s: DMA_ERROR waiting for depend_tx\n",
82 __func__);
83 }
84 76
85 memset(dest_buf, val, len); 77 memset(dest_buf, val, len);
86 78
87 async_tx_sync_epilog(flags, depend_tx, cb_fn, cb_param); 79 async_tx_sync_epilog(cb_fn, cb_param);
88 } 80 }
89 81
90 return tx; 82 return tx;
diff --git a/crypto/async_tx/async_tx.c b/crypto/async_tx/async_tx.c
index c6e772fc5ccd..e8362c1efa30 100644
--- a/crypto/async_tx/async_tx.c
+++ b/crypto/async_tx/async_tx.c
@@ -23,6 +23,7 @@
23 * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. 23 * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
24 * 24 *
25 */ 25 */
26#include <linux/rculist.h>
26#include <linux/kernel.h> 27#include <linux/kernel.h>
27#include <linux/async_tx.h> 28#include <linux/async_tx.h>
28 29
@@ -136,7 +137,8 @@ async_tx_run_dependencies(struct dma_async_tx_descriptor *tx)
136 spin_lock_bh(&next->lock); 137 spin_lock_bh(&next->lock);
137 next->parent = NULL; 138 next->parent = NULL;
138 _next = next->next; 139 _next = next->next;
139 next->next = NULL; 140 if (_next && _next->chan == chan)
141 next->next = NULL;
140 spin_unlock_bh(&next->lock); 142 spin_unlock_bh(&next->lock);
141 143
142 next->tx_submit(next); 144 next->tx_submit(next);
@@ -294,7 +296,7 @@ dma_channel_add_remove(struct dma_client *client,
294 case DMA_RESOURCE_REMOVED: 296 case DMA_RESOURCE_REMOVED:
295 found = 0; 297 found = 0;
296 spin_lock_irqsave(&async_tx_lock, flags); 298 spin_lock_irqsave(&async_tx_lock, flags);
297 list_for_each_entry_rcu(ref, &async_tx_master_list, node) 299 list_for_each_entry(ref, &async_tx_master_list, node)
298 if (ref->chan == chan) { 300 if (ref->chan == chan) {
299 /* permit backing devices to go away */ 301 /* permit backing devices to go away */
300 dma_chan_put(ref->chan); 302 dma_chan_put(ref->chan);
@@ -607,23 +609,34 @@ async_trigger_callback(enum async_tx_flags flags,
607 pr_debug("%s: (sync)\n", __func__); 609 pr_debug("%s: (sync)\n", __func__);
608 610
609 /* wait for any prerequisite operations */ 611 /* wait for any prerequisite operations */
610 if (depend_tx) { 612 async_tx_quiesce(&depend_tx);
611 /* if ack is already set then we cannot be sure
612 * we are referring to the correct operation
613 */
614 BUG_ON(async_tx_test_ack(depend_tx));
615 if (dma_wait_for_async_tx(depend_tx) == DMA_ERROR)
616 panic("%s: DMA_ERROR waiting for depend_tx\n",
617 __func__);
618 }
619 613
620 async_tx_sync_epilog(flags, depend_tx, cb_fn, cb_param); 614 async_tx_sync_epilog(cb_fn, cb_param);
621 } 615 }
622 616
623 return tx; 617 return tx;
624} 618}
625EXPORT_SYMBOL_GPL(async_trigger_callback); 619EXPORT_SYMBOL_GPL(async_trigger_callback);
626 620
621/**
622 * async_tx_quiesce - ensure tx is complete and freeable upon return
623 * @tx - transaction to quiesce
624 */
625void async_tx_quiesce(struct dma_async_tx_descriptor **tx)
626{
627 if (*tx) {
628 /* if ack is already set then we cannot be sure
629 * we are referring to the correct operation
630 */
631 BUG_ON(async_tx_test_ack(*tx));
632 if (dma_wait_for_async_tx(*tx) == DMA_ERROR)
633 panic("DMA_ERROR waiting for transaction\n");
634 async_tx_ack(*tx);
635 *tx = NULL;
636 }
637}
638EXPORT_SYMBOL_GPL(async_tx_quiesce);
639
627module_init(async_tx_init); 640module_init(async_tx_init);
628module_exit(async_tx_exit); 641module_exit(async_tx_exit);
629 642
diff --git a/crypto/async_tx/async_xor.c b/crypto/async_tx/async_xor.c
index 3a0dddca5a10..c029d3eb9ef0 100644
--- a/crypto/async_tx/async_xor.c
+++ b/crypto/async_tx/async_xor.c
@@ -35,74 +35,121 @@
35 * when CONFIG_DMA_ENGINE=n 35 * when CONFIG_DMA_ENGINE=n
36 */ 36 */
37static __always_inline struct dma_async_tx_descriptor * 37static __always_inline struct dma_async_tx_descriptor *
38do_async_xor(struct dma_device *device, 38do_async_xor(struct dma_chan *chan, struct page *dest, struct page **src_list,
39 struct dma_chan *chan, struct page *dest, struct page **src_list, 39 unsigned int offset, int src_cnt, size_t len,
40 unsigned int offset, unsigned int src_cnt, size_t len, 40 enum async_tx_flags flags,
41 enum async_tx_flags flags, struct dma_async_tx_descriptor *depend_tx, 41 struct dma_async_tx_descriptor *depend_tx,
42 dma_async_tx_callback cb_fn, void *cb_param) 42 dma_async_tx_callback cb_fn, void *cb_param)
43{ 43{
44 dma_addr_t dma_dest; 44 struct dma_device *dma = chan->device;
45 dma_addr_t *dma_src = (dma_addr_t *) src_list; 45 dma_addr_t *dma_src = (dma_addr_t *) src_list;
46 struct dma_async_tx_descriptor *tx; 46 struct dma_async_tx_descriptor *tx = NULL;
47 int src_off = 0;
47 int i; 48 int i;
48 unsigned long dma_prep_flags = cb_fn ? DMA_PREP_INTERRUPT : 0; 49 dma_async_tx_callback _cb_fn;
49 50 void *_cb_param;
50 pr_debug("%s: len: %zu\n", __func__, len); 51 enum async_tx_flags async_flags;
51 52 enum dma_ctrl_flags dma_flags;
52 dma_dest = dma_map_page(device->dev, dest, offset, len, 53 int xor_src_cnt;
53 DMA_FROM_DEVICE); 54 dma_addr_t dma_dest;
54 55
56 dma_dest = dma_map_page(dma->dev, dest, offset, len, DMA_FROM_DEVICE);
55 for (i = 0; i < src_cnt; i++) 57 for (i = 0; i < src_cnt; i++)
56 dma_src[i] = dma_map_page(device->dev, src_list[i], offset, 58 dma_src[i] = dma_map_page(dma->dev, src_list[i], offset,
57 len, DMA_TO_DEVICE); 59 len, DMA_TO_DEVICE);
58 60
59 /* Since we have clobbered the src_list we are committed 61 while (src_cnt) {
60 * to doing this asynchronously. Drivers force forward progress 62 async_flags = flags;
61 * in case they can not provide a descriptor 63 dma_flags = 0;
62 */ 64 xor_src_cnt = min(src_cnt, dma->max_xor);
63 tx = device->device_prep_dma_xor(chan, dma_dest, dma_src, src_cnt, len, 65 /* if we are submitting additional xors, leave the chain open,
64 dma_prep_flags); 66 * clear the callback parameters, and leave the destination
65 if (!tx) { 67 * buffer mapped
66 if (depend_tx) 68 */
67 dma_wait_for_async_tx(depend_tx); 69 if (src_cnt > xor_src_cnt) {
68 70 async_flags &= ~ASYNC_TX_ACK;
69 while (!tx) 71 dma_flags = DMA_COMPL_SKIP_DEST_UNMAP;
70 tx = device->device_prep_dma_xor(chan, dma_dest, 72 _cb_fn = NULL;
71 dma_src, src_cnt, len, 73 _cb_param = NULL;
72 dma_prep_flags); 74 } else {
73 } 75 _cb_fn = cb_fn;
76 _cb_param = cb_param;
77 }
78 if (_cb_fn)
79 dma_flags |= DMA_PREP_INTERRUPT;
74 80
75 async_tx_submit(chan, tx, flags, depend_tx, cb_fn, cb_param); 81 /* Since we have clobbered the src_list we are committed
82 * to doing this asynchronously. Drivers force forward progress
83 * in case they can not provide a descriptor
84 */
85 tx = dma->device_prep_dma_xor(chan, dma_dest, &dma_src[src_off],
86 xor_src_cnt, len, dma_flags);
87
88 if (unlikely(!tx))
89 async_tx_quiesce(&depend_tx);
90
91 /* spin wait for the preceeding transactions to complete */
92 while (unlikely(!tx)) {
93 dma_async_issue_pending(chan);
94 tx = dma->device_prep_dma_xor(chan, dma_dest,
95 &dma_src[src_off],
96 xor_src_cnt, len,
97 dma_flags);
98 }
99
100 async_tx_submit(chan, tx, async_flags, depend_tx, _cb_fn,
101 _cb_param);
102
103 depend_tx = tx;
104 flags |= ASYNC_TX_DEP_ACK;
105
106 if (src_cnt > xor_src_cnt) {
107 /* drop completed sources */
108 src_cnt -= xor_src_cnt;
109 src_off += xor_src_cnt;
110
111 /* use the intermediate result a source */
112 dma_src[--src_off] = dma_dest;
113 src_cnt++;
114 } else
115 break;
116 }
76 117
77 return tx; 118 return tx;
78} 119}
79 120
80static void 121static void
81do_sync_xor(struct page *dest, struct page **src_list, unsigned int offset, 122do_sync_xor(struct page *dest, struct page **src_list, unsigned int offset,
82 unsigned int src_cnt, size_t len, enum async_tx_flags flags, 123 int src_cnt, size_t len, enum async_tx_flags flags,
83 struct dma_async_tx_descriptor *depend_tx, 124 dma_async_tx_callback cb_fn, void *cb_param)
84 dma_async_tx_callback cb_fn, void *cb_param)
85{ 125{
86 void *_dest;
87 int i; 126 int i;
88 127 int xor_src_cnt;
89 pr_debug("%s: len: %zu\n", __func__, len); 128 int src_off = 0;
129 void *dest_buf;
130 void **srcs = (void **) src_list;
90 131
91 /* reuse the 'src_list' array to convert to buffer pointers */ 132 /* reuse the 'src_list' array to convert to buffer pointers */
92 for (i = 0; i < src_cnt; i++) 133 for (i = 0; i < src_cnt; i++)
93 src_list[i] = (struct page *) 134 srcs[i] = page_address(src_list[i]) + offset;
94 (page_address(src_list[i]) + offset);
95 135
96 /* set destination address */ 136 /* set destination address */
97 _dest = page_address(dest) + offset; 137 dest_buf = page_address(dest) + offset;
98 138
99 if (flags & ASYNC_TX_XOR_ZERO_DST) 139 if (flags & ASYNC_TX_XOR_ZERO_DST)
100 memset(_dest, 0, len); 140 memset(dest_buf, 0, len);
101 141
102 xor_blocks(src_cnt, len, _dest, 142 while (src_cnt > 0) {
103 (void **) src_list); 143 /* process up to 'MAX_XOR_BLOCKS' sources */
144 xor_src_cnt = min(src_cnt, MAX_XOR_BLOCKS);
145 xor_blocks(xor_src_cnt, len, dest_buf, &srcs[src_off]);
104 146
105 async_tx_sync_epilog(flags, depend_tx, cb_fn, cb_param); 147 /* drop completed sources */
148 src_cnt -= xor_src_cnt;
149 src_off += xor_src_cnt;
150 }
151
152 async_tx_sync_epilog(cb_fn, cb_param);
106} 153}
107 154
108/** 155/**
@@ -132,106 +179,34 @@ async_xor(struct page *dest, struct page **src_list, unsigned int offset,
132 struct dma_chan *chan = async_tx_find_channel(depend_tx, DMA_XOR, 179 struct dma_chan *chan = async_tx_find_channel(depend_tx, DMA_XOR,
133 &dest, 1, src_list, 180 &dest, 1, src_list,
134 src_cnt, len); 181 src_cnt, len);
135 struct dma_device *device = chan ? chan->device : NULL;
136 struct dma_async_tx_descriptor *tx = NULL;
137 dma_async_tx_callback _cb_fn;
138 void *_cb_param;
139 unsigned long local_flags;
140 int xor_src_cnt;
141 int i = 0, src_off = 0;
142
143 BUG_ON(src_cnt <= 1); 182 BUG_ON(src_cnt <= 1);
144 183
145 while (src_cnt) { 184 if (chan) {
146 local_flags = flags; 185 /* run the xor asynchronously */
147 if (device) { /* run the xor asynchronously */ 186 pr_debug("%s (async): len: %zu\n", __func__, len);
148 xor_src_cnt = min(src_cnt, device->max_xor);
149 /* if we are submitting additional xors
150 * only set the callback on the last transaction
151 */
152 if (src_cnt > xor_src_cnt) {
153 local_flags &= ~ASYNC_TX_ACK;
154 _cb_fn = NULL;
155 _cb_param = NULL;
156 } else {
157 _cb_fn = cb_fn;
158 _cb_param = cb_param;
159 }
160
161 tx = do_async_xor(device, chan, dest,
162 &src_list[src_off], offset,
163 xor_src_cnt, len, local_flags,
164 depend_tx, _cb_fn, _cb_param);
165 } else { /* run the xor synchronously */
166 /* in the sync case the dest is an implied source
167 * (assumes the dest is at the src_off index)
168 */
169 if (flags & ASYNC_TX_XOR_DROP_DST) {
170 src_cnt--;
171 src_off++;
172 }
173
174 /* process up to 'MAX_XOR_BLOCKS' sources */
175 xor_src_cnt = min(src_cnt, MAX_XOR_BLOCKS);
176
177 /* if we are submitting additional xors
178 * only set the callback on the last transaction
179 */
180 if (src_cnt > xor_src_cnt) {
181 local_flags &= ~ASYNC_TX_ACK;
182 _cb_fn = NULL;
183 _cb_param = NULL;
184 } else {
185 _cb_fn = cb_fn;
186 _cb_param = cb_param;
187 }
188
189 /* wait for any prerequisite operations */
190 if (depend_tx) {
191 /* if ack is already set then we cannot be sure
192 * we are referring to the correct operation
193 */
194 BUG_ON(async_tx_test_ack(depend_tx));
195 if (dma_wait_for_async_tx(depend_tx) ==
196 DMA_ERROR)
197 panic("%s: DMA_ERROR waiting for "
198 "depend_tx\n",
199 __func__);
200 }
201 187
202 do_sync_xor(dest, &src_list[src_off], offset, 188 return do_async_xor(chan, dest, src_list, offset, src_cnt, len,
203 xor_src_cnt, len, local_flags, depend_tx, 189 flags, depend_tx, cb_fn, cb_param);
204 _cb_fn, _cb_param); 190 } else {
205 } 191 /* run the xor synchronously */
192 pr_debug("%s (sync): len: %zu\n", __func__, len);
206 193
207 /* the previous tx is hidden from the client, 194 /* in the sync case the dest is an implied source
208 * so ack it 195 * (assumes the dest is the first source)
209 */ 196 */
210 if (i && depend_tx) 197 if (flags & ASYNC_TX_XOR_DROP_DST) {
211 async_tx_ack(depend_tx); 198 src_cnt--;
212 199 src_list++;
213 depend_tx = tx; 200 }
214 201
215 if (src_cnt > xor_src_cnt) { 202 /* wait for any prerequisite operations */
216 /* drop completed sources */ 203 async_tx_quiesce(&depend_tx);
217 src_cnt -= xor_src_cnt;
218 src_off += xor_src_cnt;
219 204
220 /* unconditionally preserve the destination */ 205 do_sync_xor(dest, src_list, offset, src_cnt, len,
221 flags &= ~ASYNC_TX_XOR_ZERO_DST; 206 flags, cb_fn, cb_param);
222 207
223 /* use the intermediate result a source, but remember 208 return NULL;
224 * it's dropped, because it's implied, in the sync case
225 */
226 src_list[--src_off] = dest;
227 src_cnt++;
228 flags |= ASYNC_TX_XOR_DROP_DST;
229 } else
230 src_cnt = 0;
231 i++;
232 } 209 }
233
234 return tx;
235} 210}
236EXPORT_SYMBOL_GPL(async_xor); 211EXPORT_SYMBOL_GPL(async_xor);
237 212
@@ -285,14 +260,15 @@ async_xor_zero_sum(struct page *dest, struct page **src_list,
285 tx = device->device_prep_dma_zero_sum(chan, dma_src, src_cnt, 260 tx = device->device_prep_dma_zero_sum(chan, dma_src, src_cnt,
286 len, result, 261 len, result,
287 dma_prep_flags); 262 dma_prep_flags);
288 if (!tx) { 263 if (unlikely(!tx)) {
289 if (depend_tx) 264 async_tx_quiesce(&depend_tx);
290 dma_wait_for_async_tx(depend_tx);
291 265
292 while (!tx) 266 while (!tx) {
267 dma_async_issue_pending(chan);
293 tx = device->device_prep_dma_zero_sum(chan, 268 tx = device->device_prep_dma_zero_sum(chan,
294 dma_src, src_cnt, len, result, 269 dma_src, src_cnt, len, result,
295 dma_prep_flags); 270 dma_prep_flags);
271 }
296 } 272 }
297 273
298 async_tx_submit(chan, tx, flags, depend_tx, cb_fn, cb_param); 274 async_tx_submit(chan, tx, flags, depend_tx, cb_fn, cb_param);
@@ -307,18 +283,11 @@ async_xor_zero_sum(struct page *dest, struct page **src_list,
307 tx = async_xor(dest, src_list, offset, src_cnt, len, xor_flags, 283 tx = async_xor(dest, src_list, offset, src_cnt, len, xor_flags,
308 depend_tx, NULL, NULL); 284 depend_tx, NULL, NULL);
309 285
310 if (tx) { 286 async_tx_quiesce(&tx);
311 if (dma_wait_for_async_tx(tx) == DMA_ERROR)
312 panic("%s: DMA_ERROR waiting for tx\n",
313 __func__);
314 async_tx_ack(tx);
315 }
316 287
317 *result = page_is_zero(dest, offset, len) ? 0 : 1; 288 *result = page_is_zero(dest, offset, len) ? 0 : 1;
318 289
319 tx = NULL; 290 async_tx_sync_epilog(cb_fn, cb_param);
320
321 async_tx_sync_epilog(flags, depend_tx, cb_fn, cb_param);
322 } 291 }
323 292
324 return tx; 293 return tx;
diff --git a/crypto/authenc.c b/crypto/authenc.c
index 4b226768752a..fd9f06c63d76 100644
--- a/crypto/authenc.c
+++ b/crypto/authenc.c
@@ -174,8 +174,9 @@ static int crypto_authenc_genicv(struct aead_request *req, u8 *iv,
174static void crypto_authenc_encrypt_done(struct crypto_async_request *req, 174static void crypto_authenc_encrypt_done(struct crypto_async_request *req,
175 int err) 175 int err)
176{ 176{
177 struct aead_request *areq = req->data;
178
177 if (!err) { 179 if (!err) {
178 struct aead_request *areq = req->data;
179 struct crypto_aead *authenc = crypto_aead_reqtfm(areq); 180 struct crypto_aead *authenc = crypto_aead_reqtfm(areq);
180 struct crypto_authenc_ctx *ctx = crypto_aead_ctx(authenc); 181 struct crypto_authenc_ctx *ctx = crypto_aead_ctx(authenc);
181 struct ablkcipher_request *abreq = aead_request_ctx(areq); 182 struct ablkcipher_request *abreq = aead_request_ctx(areq);
@@ -185,7 +186,7 @@ static void crypto_authenc_encrypt_done(struct crypto_async_request *req,
185 err = crypto_authenc_genicv(areq, iv, 0); 186 err = crypto_authenc_genicv(areq, iv, 0);
186 } 187 }
187 188
188 aead_request_complete(req->data, err); 189 aead_request_complete(areq, err);
189} 190}
190 191
191static int crypto_authenc_encrypt(struct aead_request *req) 192static int crypto_authenc_encrypt(struct aead_request *req)
@@ -216,14 +217,15 @@ static int crypto_authenc_encrypt(struct aead_request *req)
216static void crypto_authenc_givencrypt_done(struct crypto_async_request *req, 217static void crypto_authenc_givencrypt_done(struct crypto_async_request *req,
217 int err) 218 int err)
218{ 219{
220 struct aead_request *areq = req->data;
221
219 if (!err) { 222 if (!err) {
220 struct aead_request *areq = req->data;
221 struct skcipher_givcrypt_request *greq = aead_request_ctx(areq); 223 struct skcipher_givcrypt_request *greq = aead_request_ctx(areq);
222 224
223 err = crypto_authenc_genicv(areq, greq->giv, 0); 225 err = crypto_authenc_genicv(areq, greq->giv, 0);
224 } 226 }
225 227
226 aead_request_complete(req->data, err); 228 aead_request_complete(areq, err);
227} 229}
228 230
229static int crypto_authenc_givencrypt(struct aead_givcrypt_request *req) 231static int crypto_authenc_givencrypt(struct aead_givcrypt_request *req)
diff --git a/crypto/blkcipher.c b/crypto/blkcipher.c
index 185f955fb0d7..4a7e65c4df4d 100644
--- a/crypto/blkcipher.c
+++ b/crypto/blkcipher.c
@@ -696,34 +696,5 @@ void skcipher_geniv_exit(struct crypto_tfm *tfm)
696} 696}
697EXPORT_SYMBOL_GPL(skcipher_geniv_exit); 697EXPORT_SYMBOL_GPL(skcipher_geniv_exit);
698 698
699static int __init blkcipher_module_init(void)
700{
701 int err;
702
703 err = chainiv_module_init();
704 if (err)
705 goto out;
706
707 err = eseqiv_module_init();
708 if (err)
709 goto eseqiv_err;
710
711out:
712 return err;
713
714eseqiv_err:
715 chainiv_module_exit();
716 goto out;
717}
718
719static void __exit blkcipher_module_exit(void)
720{
721 eseqiv_module_exit();
722 chainiv_module_exit();
723}
724
725module_init(blkcipher_module_init);
726module_exit(blkcipher_module_exit);
727
728MODULE_LICENSE("GPL"); 699MODULE_LICENSE("GPL");
729MODULE_DESCRIPTION("Generic block chaining cipher type"); 700MODULE_DESCRIPTION("Generic block chaining cipher type");
diff --git a/crypto/chainiv.c b/crypto/chainiv.c
index 6da3f577e4db..7c37a497b860 100644
--- a/crypto/chainiv.c
+++ b/crypto/chainiv.c
@@ -14,11 +14,11 @@
14 */ 14 */
15 15
16#include <crypto/internal/skcipher.h> 16#include <crypto/internal/skcipher.h>
17#include <crypto/rng.h>
17#include <linux/err.h> 18#include <linux/err.h>
18#include <linux/init.h> 19#include <linux/init.h>
19#include <linux/kernel.h> 20#include <linux/kernel.h>
20#include <linux/module.h> 21#include <linux/module.h>
21#include <linux/random.h>
22#include <linux/spinlock.h> 22#include <linux/spinlock.h>
23#include <linux/string.h> 23#include <linux/string.h>
24#include <linux/workqueue.h> 24#include <linux/workqueue.h>
@@ -83,6 +83,7 @@ static int chainiv_givencrypt_first(struct skcipher_givcrypt_request *req)
83{ 83{
84 struct crypto_ablkcipher *geniv = skcipher_givcrypt_reqtfm(req); 84 struct crypto_ablkcipher *geniv = skcipher_givcrypt_reqtfm(req);
85 struct chainiv_ctx *ctx = crypto_ablkcipher_ctx(geniv); 85 struct chainiv_ctx *ctx = crypto_ablkcipher_ctx(geniv);
86 int err = 0;
86 87
87 spin_lock_bh(&ctx->lock); 88 spin_lock_bh(&ctx->lock);
88 if (crypto_ablkcipher_crt(geniv)->givencrypt != 89 if (crypto_ablkcipher_crt(geniv)->givencrypt !=
@@ -90,11 +91,15 @@ static int chainiv_givencrypt_first(struct skcipher_givcrypt_request *req)
90 goto unlock; 91 goto unlock;
91 92
92 crypto_ablkcipher_crt(geniv)->givencrypt = chainiv_givencrypt; 93 crypto_ablkcipher_crt(geniv)->givencrypt = chainiv_givencrypt;
93 get_random_bytes(ctx->iv, crypto_ablkcipher_ivsize(geniv)); 94 err = crypto_rng_get_bytes(crypto_default_rng, ctx->iv,
95 crypto_ablkcipher_ivsize(geniv));
94 96
95unlock: 97unlock:
96 spin_unlock_bh(&ctx->lock); 98 spin_unlock_bh(&ctx->lock);
97 99
100 if (err)
101 return err;
102
98 return chainiv_givencrypt(req); 103 return chainiv_givencrypt(req);
99} 104}
100 105
@@ -117,6 +122,7 @@ static int chainiv_init(struct crypto_tfm *tfm)
117static int async_chainiv_schedule_work(struct async_chainiv_ctx *ctx) 122static int async_chainiv_schedule_work(struct async_chainiv_ctx *ctx)
118{ 123{
119 int queued; 124 int queued;
125 int err = ctx->err;
120 126
121 if (!ctx->queue.qlen) { 127 if (!ctx->queue.qlen) {
122 smp_mb__before_clear_bit(); 128 smp_mb__before_clear_bit();
@@ -131,7 +137,7 @@ static int async_chainiv_schedule_work(struct async_chainiv_ctx *ctx)
131 BUG_ON(!queued); 137 BUG_ON(!queued);
132 138
133out: 139out:
134 return ctx->err; 140 return err;
135} 141}
136 142
137static int async_chainiv_postpone_request(struct skcipher_givcrypt_request *req) 143static int async_chainiv_postpone_request(struct skcipher_givcrypt_request *req)
@@ -202,6 +208,7 @@ static int async_chainiv_givencrypt_first(struct skcipher_givcrypt_request *req)
202{ 208{
203 struct crypto_ablkcipher *geniv = skcipher_givcrypt_reqtfm(req); 209 struct crypto_ablkcipher *geniv = skcipher_givcrypt_reqtfm(req);
204 struct async_chainiv_ctx *ctx = crypto_ablkcipher_ctx(geniv); 210 struct async_chainiv_ctx *ctx = crypto_ablkcipher_ctx(geniv);
211 int err = 0;
205 212
206 if (test_and_set_bit(CHAINIV_STATE_INUSE, &ctx->state)) 213 if (test_and_set_bit(CHAINIV_STATE_INUSE, &ctx->state))
207 goto out; 214 goto out;
@@ -211,11 +218,15 @@ static int async_chainiv_givencrypt_first(struct skcipher_givcrypt_request *req)
211 goto unlock; 218 goto unlock;
212 219
213 crypto_ablkcipher_crt(geniv)->givencrypt = async_chainiv_givencrypt; 220 crypto_ablkcipher_crt(geniv)->givencrypt = async_chainiv_givencrypt;
214 get_random_bytes(ctx->iv, crypto_ablkcipher_ivsize(geniv)); 221 err = crypto_rng_get_bytes(crypto_default_rng, ctx->iv,
222 crypto_ablkcipher_ivsize(geniv));
215 223
216unlock: 224unlock:
217 clear_bit(CHAINIV_STATE_INUSE, &ctx->state); 225 clear_bit(CHAINIV_STATE_INUSE, &ctx->state);
218 226
227 if (err)
228 return err;
229
219out: 230out:
220 return async_chainiv_givencrypt(req); 231 return async_chainiv_givencrypt(req);
221} 232}
@@ -227,6 +238,7 @@ static void async_chainiv_do_postponed(struct work_struct *work)
227 postponed); 238 postponed);
228 struct skcipher_givcrypt_request *req; 239 struct skcipher_givcrypt_request *req;
229 struct ablkcipher_request *subreq; 240 struct ablkcipher_request *subreq;
241 int err;
230 242
231 /* Only handle one request at a time to avoid hogging keventd. */ 243 /* Only handle one request at a time to avoid hogging keventd. */
232 spin_lock_bh(&ctx->lock); 244 spin_lock_bh(&ctx->lock);
@@ -241,7 +253,11 @@ static void async_chainiv_do_postponed(struct work_struct *work)
241 subreq = skcipher_givcrypt_reqctx(req); 253 subreq = skcipher_givcrypt_reqctx(req);
242 subreq->base.flags |= CRYPTO_TFM_REQ_MAY_SLEEP; 254 subreq->base.flags |= CRYPTO_TFM_REQ_MAY_SLEEP;
243 255
244 async_chainiv_givencrypt_tail(req); 256 err = async_chainiv_givencrypt_tail(req);
257
258 local_bh_disable();
259 skcipher_givcrypt_complete(req, err);
260 local_bh_enable();
245} 261}
246 262
247static int async_chainiv_init(struct crypto_tfm *tfm) 263static int async_chainiv_init(struct crypto_tfm *tfm)
@@ -278,9 +294,13 @@ static struct crypto_instance *chainiv_alloc(struct rtattr **tb)
278 if (IS_ERR(algt)) 294 if (IS_ERR(algt))
279 return ERR_PTR(err); 295 return ERR_PTR(err);
280 296
297 err = crypto_get_default_rng();
298 if (err)
299 return ERR_PTR(err);
300
281 inst = skcipher_geniv_alloc(&chainiv_tmpl, tb, 0, 0); 301 inst = skcipher_geniv_alloc(&chainiv_tmpl, tb, 0, 0);
282 if (IS_ERR(inst)) 302 if (IS_ERR(inst))
283 goto out; 303 goto put_rng;
284 304
285 inst->alg.cra_ablkcipher.givencrypt = chainiv_givencrypt_first; 305 inst->alg.cra_ablkcipher.givencrypt = chainiv_givencrypt_first;
286 306
@@ -305,21 +325,37 @@ static struct crypto_instance *chainiv_alloc(struct rtattr **tb)
305 325
306out: 326out:
307 return inst; 327 return inst;
328
329put_rng:
330 crypto_put_default_rng();
331 goto out;
332}
333
334static void chainiv_free(struct crypto_instance *inst)
335{
336 skcipher_geniv_free(inst);
337 crypto_put_default_rng();
308} 338}
309 339
310static struct crypto_template chainiv_tmpl = { 340static struct crypto_template chainiv_tmpl = {
311 .name = "chainiv", 341 .name = "chainiv",
312 .alloc = chainiv_alloc, 342 .alloc = chainiv_alloc,
313 .free = skcipher_geniv_free, 343 .free = chainiv_free,
314 .module = THIS_MODULE, 344 .module = THIS_MODULE,
315}; 345};
316 346
317int __init chainiv_module_init(void) 347static int __init chainiv_module_init(void)
318{ 348{
319 return crypto_register_template(&chainiv_tmpl); 349 return crypto_register_template(&chainiv_tmpl);
320} 350}
321 351
322void chainiv_module_exit(void) 352static void chainiv_module_exit(void)
323{ 353{
324 crypto_unregister_template(&chainiv_tmpl); 354 crypto_unregister_template(&chainiv_tmpl);
325} 355}
356
357module_init(chainiv_module_init);
358module_exit(chainiv_module_exit);
359
360MODULE_LICENSE("GPL");
361MODULE_DESCRIPTION("Chain IV Generator");
diff --git a/crypto/crc32c.c b/crypto/crc32c.c
index 0dcf64a74e68..a882d9e4e63e 100644
--- a/crypto/crc32c.c
+++ b/crypto/crc32c.c
@@ -5,20 +5,23 @@
5 * 5 *
6 * This module file is a wrapper to invoke the lib/crc32c routines. 6 * This module file is a wrapper to invoke the lib/crc32c routines.
7 * 7 *
8 * Copyright (c) 2008 Herbert Xu <herbert@gondor.apana.org.au>
9 *
8 * This program is free software; you can redistribute it and/or modify it 10 * 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 11 * under the terms of the GNU General Public License as published by the Free
10 * Software Foundation; either version 2 of the License, or (at your option) 12 * Software Foundation; either version 2 of the License, or (at your option)
11 * any later version. 13 * any later version.
12 * 14 *
13 */ 15 */
16
17#include <crypto/internal/hash.h>
14#include <linux/init.h> 18#include <linux/init.h>
15#include <linux/module.h> 19#include <linux/module.h>
16#include <linux/string.h> 20#include <linux/string.h>
17#include <linux/crypto.h>
18#include <linux/crc32c.h> 21#include <linux/crc32c.h>
19#include <linux/kernel.h> 22#include <linux/kernel.h>
20 23
21#define CHKSUM_BLOCK_SIZE 32 24#define CHKSUM_BLOCK_SIZE 1
22#define CHKSUM_DIGEST_SIZE 4 25#define CHKSUM_DIGEST_SIZE 4
23 26
24struct chksum_ctx { 27struct chksum_ctx {
@@ -71,7 +74,7 @@ static void chksum_final(struct crypto_tfm *tfm, u8 *out)
71 *(__le32 *)out = ~cpu_to_le32(mctx->crc); 74 *(__le32 *)out = ~cpu_to_le32(mctx->crc);
72} 75}
73 76
74static int crc32c_cra_init(struct crypto_tfm *tfm) 77static int crc32c_cra_init_old(struct crypto_tfm *tfm)
75{ 78{
76 struct chksum_ctx *mctx = crypto_tfm_ctx(tfm); 79 struct chksum_ctx *mctx = crypto_tfm_ctx(tfm);
77 80
@@ -79,14 +82,14 @@ static int crc32c_cra_init(struct crypto_tfm *tfm)
79 return 0; 82 return 0;
80} 83}
81 84
82static struct crypto_alg alg = { 85static struct crypto_alg old_alg = {
83 .cra_name = "crc32c", 86 .cra_name = "crc32c",
84 .cra_flags = CRYPTO_ALG_TYPE_DIGEST, 87 .cra_flags = CRYPTO_ALG_TYPE_DIGEST,
85 .cra_blocksize = CHKSUM_BLOCK_SIZE, 88 .cra_blocksize = CHKSUM_BLOCK_SIZE,
86 .cra_ctxsize = sizeof(struct chksum_ctx), 89 .cra_ctxsize = sizeof(struct chksum_ctx),
87 .cra_module = THIS_MODULE, 90 .cra_module = THIS_MODULE,
88 .cra_list = LIST_HEAD_INIT(alg.cra_list), 91 .cra_list = LIST_HEAD_INIT(old_alg.cra_list),
89 .cra_init = crc32c_cra_init, 92 .cra_init = crc32c_cra_init_old,
90 .cra_u = { 93 .cra_u = {
91 .digest = { 94 .digest = {
92 .dia_digestsize= CHKSUM_DIGEST_SIZE, 95 .dia_digestsize= CHKSUM_DIGEST_SIZE,
@@ -98,14 +101,125 @@ static struct crypto_alg alg = {
98 } 101 }
99}; 102};
100 103
104/*
105 * Setting the seed allows arbitrary accumulators and flexible XOR policy
106 * If your algorithm starts with ~0, then XOR with ~0 before you set
107 * the seed.
108 */
109static int crc32c_setkey(struct crypto_ahash *hash, const u8 *key,
110 unsigned int keylen)
111{
112 u32 *mctx = crypto_ahash_ctx(hash);
113
114 if (keylen != sizeof(u32)) {
115 crypto_ahash_set_flags(hash, CRYPTO_TFM_RES_BAD_KEY_LEN);
116 return -EINVAL;
117 }
118 *mctx = le32_to_cpup((__le32 *)key);
119 return 0;
120}
121
122static int crc32c_init(struct ahash_request *req)
123{
124 u32 *mctx = crypto_ahash_ctx(crypto_ahash_reqtfm(req));
125 u32 *crcp = ahash_request_ctx(req);
126
127 *crcp = *mctx;
128 return 0;
129}
130
131static int crc32c_update(struct ahash_request *req)
132{
133 struct crypto_hash_walk walk;
134 u32 *crcp = ahash_request_ctx(req);
135 u32 crc = *crcp;
136 int nbytes;
137
138 for (nbytes = crypto_hash_walk_first(req, &walk); nbytes;
139 nbytes = crypto_hash_walk_done(&walk, 0))
140 crc = crc32c(crc, walk.data, nbytes);
141
142 *crcp = crc;
143 return 0;
144}
145
146static int crc32c_final(struct ahash_request *req)
147{
148 u32 *crcp = ahash_request_ctx(req);
149
150 *(__le32 *)req->result = ~cpu_to_le32p(crcp);
151 return 0;
152}
153
154static int crc32c_digest(struct ahash_request *req)
155{
156 struct crypto_hash_walk walk;
157 u32 *mctx = crypto_ahash_ctx(crypto_ahash_reqtfm(req));
158 u32 crc = *mctx;
159 int nbytes;
160
161 for (nbytes = crypto_hash_walk_first(req, &walk); nbytes;
162 nbytes = crypto_hash_walk_done(&walk, 0))
163 crc = crc32c(crc, walk.data, nbytes);
164
165 *(__le32 *)req->result = ~cpu_to_le32(crc);
166 return 0;
167}
168
169static int crc32c_cra_init(struct crypto_tfm *tfm)
170{
171 u32 *key = crypto_tfm_ctx(tfm);
172
173 *key = ~0;
174
175 tfm->crt_ahash.reqsize = sizeof(u32);
176
177 return 0;
178}
179
180static struct crypto_alg alg = {
181 .cra_name = "crc32c",
182 .cra_driver_name = "crc32c-generic",
183 .cra_priority = 100,
184 .cra_flags = CRYPTO_ALG_TYPE_AHASH,
185 .cra_blocksize = CHKSUM_BLOCK_SIZE,
186 .cra_alignmask = 3,
187 .cra_ctxsize = sizeof(u32),
188 .cra_module = THIS_MODULE,
189 .cra_list = LIST_HEAD_INIT(alg.cra_list),
190 .cra_init = crc32c_cra_init,
191 .cra_type = &crypto_ahash_type,
192 .cra_u = {
193 .ahash = {
194 .digestsize = CHKSUM_DIGEST_SIZE,
195 .setkey = crc32c_setkey,
196 .init = crc32c_init,
197 .update = crc32c_update,
198 .final = crc32c_final,
199 .digest = crc32c_digest,
200 }
201 }
202};
203
101static int __init crc32c_mod_init(void) 204static int __init crc32c_mod_init(void)
102{ 205{
103 return crypto_register_alg(&alg); 206 int err;
207
208 err = crypto_register_alg(&old_alg);
209 if (err)
210 return err;
211
212 err = crypto_register_alg(&alg);
213 if (err)
214 crypto_unregister_alg(&old_alg);
215
216 return err;
104} 217}
105 218
106static void __exit crc32c_mod_fini(void) 219static void __exit crc32c_mod_fini(void)
107{ 220{
108 crypto_unregister_alg(&alg); 221 crypto_unregister_alg(&alg);
222 crypto_unregister_alg(&old_alg);
109} 223}
110 224
111module_init(crc32c_mod_init); 225module_init(crc32c_mod_init);
diff --git a/crypto/cryptd.c b/crypto/cryptd.c
index b150de562057..d29e06b350ff 100644
--- a/crypto/cryptd.c
+++ b/crypto/cryptd.c
@@ -11,6 +11,7 @@
11 */ 11 */
12 12
13#include <crypto/algapi.h> 13#include <crypto/algapi.h>
14#include <crypto/internal/hash.h>
14#include <linux/err.h> 15#include <linux/err.h>
15#include <linux/init.h> 16#include <linux/init.h>
16#include <linux/kernel.h> 17#include <linux/kernel.h>
@@ -45,6 +46,13 @@ struct cryptd_blkcipher_request_ctx {
45 crypto_completion_t complete; 46 crypto_completion_t complete;
46}; 47};
47 48
49struct cryptd_hash_ctx {
50 struct crypto_hash *child;
51};
52
53struct cryptd_hash_request_ctx {
54 crypto_completion_t complete;
55};
48 56
49static inline struct cryptd_state *cryptd_get_state(struct crypto_tfm *tfm) 57static inline struct cryptd_state *cryptd_get_state(struct crypto_tfm *tfm)
50{ 58{
@@ -82,10 +90,8 @@ static void cryptd_blkcipher_crypt(struct ablkcipher_request *req,
82 90
83 rctx = ablkcipher_request_ctx(req); 91 rctx = ablkcipher_request_ctx(req);
84 92
85 if (unlikely(err == -EINPROGRESS)) { 93 if (unlikely(err == -EINPROGRESS))
86 rctx->complete(&req->base, err); 94 goto out;
87 return;
88 }
89 95
90 desc.tfm = child; 96 desc.tfm = child;
91 desc.info = req->info; 97 desc.info = req->info;
@@ -95,8 +101,9 @@ static void cryptd_blkcipher_crypt(struct ablkcipher_request *req,
95 101
96 req->base.complete = rctx->complete; 102 req->base.complete = rctx->complete;
97 103
104out:
98 local_bh_disable(); 105 local_bh_disable();
99 req->base.complete(&req->base, err); 106 rctx->complete(&req->base, err);
100 local_bh_enable(); 107 local_bh_enable();
101} 108}
102 109
@@ -261,6 +268,240 @@ out_put_alg:
261 return inst; 268 return inst;
262} 269}
263 270
271static int cryptd_hash_init_tfm(struct crypto_tfm *tfm)
272{
273 struct crypto_instance *inst = crypto_tfm_alg_instance(tfm);
274 struct cryptd_instance_ctx *ictx = crypto_instance_ctx(inst);
275 struct crypto_spawn *spawn = &ictx->spawn;
276 struct cryptd_hash_ctx *ctx = crypto_tfm_ctx(tfm);
277 struct crypto_hash *cipher;
278
279 cipher = crypto_spawn_hash(spawn);
280 if (IS_ERR(cipher))
281 return PTR_ERR(cipher);
282
283 ctx->child = cipher;
284 tfm->crt_ahash.reqsize =
285 sizeof(struct cryptd_hash_request_ctx);
286 return 0;
287}
288
289static void cryptd_hash_exit_tfm(struct crypto_tfm *tfm)
290{
291 struct cryptd_hash_ctx *ctx = crypto_tfm_ctx(tfm);
292 struct cryptd_state *state = cryptd_get_state(tfm);
293 int active;
294
295 mutex_lock(&state->mutex);
296 active = ahash_tfm_in_queue(&state->queue,
297 __crypto_ahash_cast(tfm));
298 mutex_unlock(&state->mutex);
299
300 BUG_ON(active);
301
302 crypto_free_hash(ctx->child);
303}
304
305static int cryptd_hash_setkey(struct crypto_ahash *parent,
306 const u8 *key, unsigned int keylen)
307{
308 struct cryptd_hash_ctx *ctx = crypto_ahash_ctx(parent);
309 struct crypto_hash *child = ctx->child;
310 int err;
311
312 crypto_hash_clear_flags(child, CRYPTO_TFM_REQ_MASK);
313 crypto_hash_set_flags(child, crypto_ahash_get_flags(parent) &
314 CRYPTO_TFM_REQ_MASK);
315 err = crypto_hash_setkey(child, key, keylen);
316 crypto_ahash_set_flags(parent, crypto_hash_get_flags(child) &
317 CRYPTO_TFM_RES_MASK);
318 return err;
319}
320
321static int cryptd_hash_enqueue(struct ahash_request *req,
322 crypto_completion_t complete)
323{
324 struct cryptd_hash_request_ctx *rctx = ahash_request_ctx(req);
325 struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
326 struct cryptd_state *state =
327 cryptd_get_state(crypto_ahash_tfm(tfm));
328 int err;
329
330 rctx->complete = req->base.complete;
331 req->base.complete = complete;
332
333 spin_lock_bh(&state->lock);
334 err = ahash_enqueue_request(&state->queue, req);
335 spin_unlock_bh(&state->lock);
336
337 wake_up_process(state->task);
338 return err;
339}
340
341static void cryptd_hash_init(struct crypto_async_request *req_async, int err)
342{
343 struct cryptd_hash_ctx *ctx = crypto_tfm_ctx(req_async->tfm);
344 struct crypto_hash *child = ctx->child;
345 struct ahash_request *req = ahash_request_cast(req_async);
346 struct cryptd_hash_request_ctx *rctx;
347 struct hash_desc desc;
348
349 rctx = ahash_request_ctx(req);
350
351 if (unlikely(err == -EINPROGRESS))
352 goto out;
353
354 desc.tfm = child;
355 desc.flags = CRYPTO_TFM_REQ_MAY_SLEEP;
356
357 err = crypto_hash_crt(child)->init(&desc);
358
359 req->base.complete = rctx->complete;
360
361out:
362 local_bh_disable();
363 rctx->complete(&req->base, err);
364 local_bh_enable();
365}
366
367static int cryptd_hash_init_enqueue(struct ahash_request *req)
368{
369 return cryptd_hash_enqueue(req, cryptd_hash_init);
370}
371
372static void cryptd_hash_update(struct crypto_async_request *req_async, int err)
373{
374 struct cryptd_hash_ctx *ctx = crypto_tfm_ctx(req_async->tfm);
375 struct crypto_hash *child = ctx->child;
376 struct ahash_request *req = ahash_request_cast(req_async);
377 struct cryptd_hash_request_ctx *rctx;
378 struct hash_desc desc;
379
380 rctx = ahash_request_ctx(req);
381
382 if (unlikely(err == -EINPROGRESS))
383 goto out;
384
385 desc.tfm = child;
386 desc.flags = CRYPTO_TFM_REQ_MAY_SLEEP;
387
388 err = crypto_hash_crt(child)->update(&desc,
389 req->src,
390 req->nbytes);
391
392 req->base.complete = rctx->complete;
393
394out:
395 local_bh_disable();
396 rctx->complete(&req->base, err);
397 local_bh_enable();
398}
399
400static int cryptd_hash_update_enqueue(struct ahash_request *req)
401{
402 return cryptd_hash_enqueue(req, cryptd_hash_update);
403}
404
405static void cryptd_hash_final(struct crypto_async_request *req_async, int err)
406{
407 struct cryptd_hash_ctx *ctx = crypto_tfm_ctx(req_async->tfm);
408 struct crypto_hash *child = ctx->child;
409 struct ahash_request *req = ahash_request_cast(req_async);
410 struct cryptd_hash_request_ctx *rctx;
411 struct hash_desc desc;
412
413 rctx = ahash_request_ctx(req);
414
415 if (unlikely(err == -EINPROGRESS))
416 goto out;
417
418 desc.tfm = child;
419 desc.flags = CRYPTO_TFM_REQ_MAY_SLEEP;
420
421 err = crypto_hash_crt(child)->final(&desc, req->result);
422
423 req->base.complete = rctx->complete;
424
425out:
426 local_bh_disable();
427 rctx->complete(&req->base, err);
428 local_bh_enable();
429}
430
431static int cryptd_hash_final_enqueue(struct ahash_request *req)
432{
433 return cryptd_hash_enqueue(req, cryptd_hash_final);
434}
435
436static void cryptd_hash_digest(struct crypto_async_request *req_async, int err)
437{
438 struct cryptd_hash_ctx *ctx = crypto_tfm_ctx(req_async->tfm);
439 struct crypto_hash *child = ctx->child;
440 struct ahash_request *req = ahash_request_cast(req_async);
441 struct cryptd_hash_request_ctx *rctx;
442 struct hash_desc desc;
443
444 rctx = ahash_request_ctx(req);
445
446 if (unlikely(err == -EINPROGRESS))
447 goto out;
448
449 desc.tfm = child;
450 desc.flags = CRYPTO_TFM_REQ_MAY_SLEEP;
451
452 err = crypto_hash_crt(child)->digest(&desc,
453 req->src,
454 req->nbytes,
455 req->result);
456
457 req->base.complete = rctx->complete;
458
459out:
460 local_bh_disable();
461 rctx->complete(&req->base, err);
462 local_bh_enable();
463}
464
465static int cryptd_hash_digest_enqueue(struct ahash_request *req)
466{
467 return cryptd_hash_enqueue(req, cryptd_hash_digest);
468}
469
470static struct crypto_instance *cryptd_alloc_hash(
471 struct rtattr **tb, struct cryptd_state *state)
472{
473 struct crypto_instance *inst;
474 struct crypto_alg *alg;
475
476 alg = crypto_get_attr_alg(tb, CRYPTO_ALG_TYPE_HASH,
477 CRYPTO_ALG_TYPE_HASH_MASK);
478 if (IS_ERR(alg))
479 return ERR_PTR(PTR_ERR(alg));
480
481 inst = cryptd_alloc_instance(alg, state);
482 if (IS_ERR(inst))
483 goto out_put_alg;
484
485 inst->alg.cra_flags = CRYPTO_ALG_TYPE_AHASH | CRYPTO_ALG_ASYNC;
486 inst->alg.cra_type = &crypto_ahash_type;
487
488 inst->alg.cra_ahash.digestsize = alg->cra_hash.digestsize;
489 inst->alg.cra_ctxsize = sizeof(struct cryptd_hash_ctx);
490
491 inst->alg.cra_init = cryptd_hash_init_tfm;
492 inst->alg.cra_exit = cryptd_hash_exit_tfm;
493
494 inst->alg.cra_ahash.init = cryptd_hash_init_enqueue;
495 inst->alg.cra_ahash.update = cryptd_hash_update_enqueue;
496 inst->alg.cra_ahash.final = cryptd_hash_final_enqueue;
497 inst->alg.cra_ahash.setkey = cryptd_hash_setkey;
498 inst->alg.cra_ahash.digest = cryptd_hash_digest_enqueue;
499
500out_put_alg:
501 crypto_mod_put(alg);
502 return inst;
503}
504
264static struct cryptd_state state; 505static struct cryptd_state state;
265 506
266static struct crypto_instance *cryptd_alloc(struct rtattr **tb) 507static struct crypto_instance *cryptd_alloc(struct rtattr **tb)
@@ -274,6 +515,8 @@ static struct crypto_instance *cryptd_alloc(struct rtattr **tb)
274 switch (algt->type & algt->mask & CRYPTO_ALG_TYPE_MASK) { 515 switch (algt->type & algt->mask & CRYPTO_ALG_TYPE_MASK) {
275 case CRYPTO_ALG_TYPE_BLKCIPHER: 516 case CRYPTO_ALG_TYPE_BLKCIPHER:
276 return cryptd_alloc_blkcipher(tb, &state); 517 return cryptd_alloc_blkcipher(tb, &state);
518 case CRYPTO_ALG_TYPE_DIGEST:
519 return cryptd_alloc_hash(tb, &state);
277 } 520 }
278 521
279 return ERR_PTR(-EINVAL); 522 return ERR_PTR(-EINVAL);
diff --git a/crypto/digest.c b/crypto/digest.c
index b526cc348b79..5d3f1303da98 100644
--- a/crypto/digest.c
+++ b/crypto/digest.c
@@ -12,6 +12,7 @@
12 * 12 *
13 */ 13 */
14 14
15#include <crypto/internal/hash.h>
15#include <crypto/scatterwalk.h> 16#include <crypto/scatterwalk.h>
16#include <linux/mm.h> 17#include <linux/mm.h>
17#include <linux/errno.h> 18#include <linux/errno.h>
@@ -141,7 +142,7 @@ int crypto_init_digest_ops(struct crypto_tfm *tfm)
141 struct hash_tfm *ops = &tfm->crt_hash; 142 struct hash_tfm *ops = &tfm->crt_hash;
142 struct digest_alg *dalg = &tfm->__crt_alg->cra_digest; 143 struct digest_alg *dalg = &tfm->__crt_alg->cra_digest;
143 144
144 if (dalg->dia_digestsize > crypto_tfm_alg_blocksize(tfm)) 145 if (dalg->dia_digestsize > PAGE_SIZE / 8)
145 return -EINVAL; 146 return -EINVAL;
146 147
147 ops->init = init; 148 ops->init = init;
@@ -157,3 +158,83 @@ int crypto_init_digest_ops(struct crypto_tfm *tfm)
157void crypto_exit_digest_ops(struct crypto_tfm *tfm) 158void crypto_exit_digest_ops(struct crypto_tfm *tfm)
158{ 159{
159} 160}
161
162static int digest_async_nosetkey(struct crypto_ahash *tfm_async, const u8 *key,
163 unsigned int keylen)
164{
165 crypto_ahash_clear_flags(tfm_async, CRYPTO_TFM_RES_MASK);
166 return -ENOSYS;
167}
168
169static int digest_async_setkey(struct crypto_ahash *tfm_async, const u8 *key,
170 unsigned int keylen)
171{
172 struct crypto_tfm *tfm = crypto_ahash_tfm(tfm_async);
173 struct digest_alg *dalg = &tfm->__crt_alg->cra_digest;
174
175 crypto_ahash_clear_flags(tfm_async, CRYPTO_TFM_RES_MASK);
176 return dalg->dia_setkey(tfm, key, keylen);
177}
178
179static int digest_async_init(struct ahash_request *req)
180{
181 struct crypto_tfm *tfm = req->base.tfm;
182 struct digest_alg *dalg = &tfm->__crt_alg->cra_digest;
183
184 dalg->dia_init(tfm);
185 return 0;
186}
187
188static int digest_async_update(struct ahash_request *req)
189{
190 struct crypto_tfm *tfm = req->base.tfm;
191 struct hash_desc desc = {
192 .tfm = __crypto_hash_cast(tfm),
193 .flags = req->base.flags,
194 };
195
196 update(&desc, req->src, req->nbytes);
197 return 0;
198}
199
200static int digest_async_final(struct ahash_request *req)
201{
202 struct crypto_tfm *tfm = req->base.tfm;
203 struct hash_desc desc = {
204 .tfm = __crypto_hash_cast(tfm),
205 .flags = req->base.flags,
206 };
207
208 final(&desc, req->result);
209 return 0;
210}
211
212static int digest_async_digest(struct ahash_request *req)
213{
214 struct crypto_tfm *tfm = req->base.tfm;
215 struct hash_desc desc = {
216 .tfm = __crypto_hash_cast(tfm),
217 .flags = req->base.flags,
218 };
219
220 return digest(&desc, req->src, req->nbytes, req->result);
221}
222
223int crypto_init_digest_ops_async(struct crypto_tfm *tfm)
224{
225 struct ahash_tfm *crt = &tfm->crt_ahash;
226 struct digest_alg *dalg = &tfm->__crt_alg->cra_digest;
227
228 if (dalg->dia_digestsize > PAGE_SIZE / 8)
229 return -EINVAL;
230
231 crt->init = digest_async_init;
232 crt->update = digest_async_update;
233 crt->final = digest_async_final;
234 crt->digest = digest_async_digest;
235 crt->setkey = dalg->dia_setkey ? digest_async_setkey :
236 digest_async_nosetkey;
237 crt->digestsize = dalg->dia_digestsize;
238
239 return 0;
240}
diff --git a/crypto/eseqiv.c b/crypto/eseqiv.c
index 881d30910434..2a342c8e52b3 100644
--- a/crypto/eseqiv.c
+++ b/crypto/eseqiv.c
@@ -16,13 +16,13 @@
16 */ 16 */
17 17
18#include <crypto/internal/skcipher.h> 18#include <crypto/internal/skcipher.h>
19#include <crypto/rng.h>
19#include <crypto/scatterwalk.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>
23#include <linux/mm.h> 24#include <linux/mm.h>
24#include <linux/module.h> 25#include <linux/module.h>
25#include <linux/random.h>
26#include <linux/scatterlist.h> 26#include <linux/scatterlist.h>
27#include <linux/spinlock.h> 27#include <linux/spinlock.h>
28#include <linux/string.h> 28#include <linux/string.h>
@@ -163,17 +163,22 @@ static int eseqiv_givencrypt_first(struct skcipher_givcrypt_request *req)
163{ 163{
164 struct crypto_ablkcipher *geniv = skcipher_givcrypt_reqtfm(req); 164 struct crypto_ablkcipher *geniv = skcipher_givcrypt_reqtfm(req);
165 struct eseqiv_ctx *ctx = crypto_ablkcipher_ctx(geniv); 165 struct eseqiv_ctx *ctx = crypto_ablkcipher_ctx(geniv);
166 int err = 0;
166 167
167 spin_lock_bh(&ctx->lock); 168 spin_lock_bh(&ctx->lock);
168 if (crypto_ablkcipher_crt(geniv)->givencrypt != eseqiv_givencrypt_first) 169 if (crypto_ablkcipher_crt(geniv)->givencrypt != eseqiv_givencrypt_first)
169 goto unlock; 170 goto unlock;
170 171
171 crypto_ablkcipher_crt(geniv)->givencrypt = eseqiv_givencrypt; 172 crypto_ablkcipher_crt(geniv)->givencrypt = eseqiv_givencrypt;
172 get_random_bytes(ctx->salt, crypto_ablkcipher_ivsize(geniv)); 173 err = crypto_rng_get_bytes(crypto_default_rng, ctx->salt,
174 crypto_ablkcipher_ivsize(geniv));
173 175
174unlock: 176unlock:
175 spin_unlock_bh(&ctx->lock); 177 spin_unlock_bh(&ctx->lock);
176 178
179 if (err)
180 return err;
181
177 return eseqiv_givencrypt(req); 182 return eseqiv_givencrypt(req);
178} 183}
179 184
@@ -216,9 +221,13 @@ static struct crypto_instance *eseqiv_alloc(struct rtattr **tb)
216 struct crypto_instance *inst; 221 struct crypto_instance *inst;
217 int err; 222 int err;
218 223
224 err = crypto_get_default_rng();
225 if (err)
226 return ERR_PTR(err);
227
219 inst = skcipher_geniv_alloc(&eseqiv_tmpl, tb, 0, 0); 228 inst = skcipher_geniv_alloc(&eseqiv_tmpl, tb, 0, 0);
220 if (IS_ERR(inst)) 229 if (IS_ERR(inst))
221 goto out; 230 goto put_rng;
222 231
223 err = -EINVAL; 232 err = -EINVAL;
224 if (inst->alg.cra_ablkcipher.ivsize != inst->alg.cra_blocksize) 233 if (inst->alg.cra_ablkcipher.ivsize != inst->alg.cra_blocksize)
@@ -238,22 +247,36 @@ out:
238free_inst: 247free_inst:
239 skcipher_geniv_free(inst); 248 skcipher_geniv_free(inst);
240 inst = ERR_PTR(err); 249 inst = ERR_PTR(err);
250put_rng:
251 crypto_put_default_rng();
241 goto out; 252 goto out;
242} 253}
243 254
255static void eseqiv_free(struct crypto_instance *inst)
256{
257 skcipher_geniv_free(inst);
258 crypto_put_default_rng();
259}
260
244static struct crypto_template eseqiv_tmpl = { 261static struct crypto_template eseqiv_tmpl = {
245 .name = "eseqiv", 262 .name = "eseqiv",
246 .alloc = eseqiv_alloc, 263 .alloc = eseqiv_alloc,
247 .free = skcipher_geniv_free, 264 .free = eseqiv_free,
248 .module = THIS_MODULE, 265 .module = THIS_MODULE,
249}; 266};
250 267
251int __init eseqiv_module_init(void) 268static int __init eseqiv_module_init(void)
252{ 269{
253 return crypto_register_template(&eseqiv_tmpl); 270 return crypto_register_template(&eseqiv_tmpl);
254} 271}
255 272
256void __exit eseqiv_module_exit(void) 273static void __exit eseqiv_module_exit(void)
257{ 274{
258 crypto_unregister_template(&eseqiv_tmpl); 275 crypto_unregister_template(&eseqiv_tmpl);
259} 276}
277
278module_init(eseqiv_module_init);
279module_exit(eseqiv_module_exit);
280
281MODULE_LICENSE("GPL");
282MODULE_DESCRIPTION("Encrypted Sequence Number IV Generator");
diff --git a/crypto/fips.c b/crypto/fips.c
new file mode 100644
index 000000000000..553970081c62
--- /dev/null
+++ b/crypto/fips.c
@@ -0,0 +1,27 @@
1/*
2 * FIPS 200 support.
3 *
4 * Copyright (c) 2008 Neil Horman <nhorman@tuxdriver.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 "internal.h"
14
15int fips_enabled;
16EXPORT_SYMBOL_GPL(fips_enabled);
17
18/* Process kernel command-line parameter at boot time. fips=0 or fips=1 */
19static int fips_enable(char *str)
20{
21 fips_enabled = !!simple_strtol(str, NULL, 0);
22 printk(KERN_INFO "fips mode: %s\n",
23 fips_enabled ? "enabled" : "disabled");
24 return 1;
25}
26
27__setup("fips=", fips_enable);
diff --git a/crypto/hash.c b/crypto/hash.c
index 7dcff671c19b..cb86b19fd105 100644
--- a/crypto/hash.c
+++ b/crypto/hash.c
@@ -9,6 +9,7 @@
9 * any later version. 9 * any later version.
10 */ 10 */
11 11
12#include <crypto/internal/hash.h>
12#include <linux/errno.h> 13#include <linux/errno.h>
13#include <linux/kernel.h> 14#include <linux/kernel.h>
14#include <linux/module.h> 15#include <linux/module.h>
@@ -59,24 +60,107 @@ static int hash_setkey(struct crypto_hash *crt, const u8 *key,
59 return alg->setkey(crt, key, keylen); 60 return alg->setkey(crt, key, keylen);
60} 61}
61 62
62static int crypto_init_hash_ops(struct crypto_tfm *tfm, u32 type, u32 mask) 63static int hash_async_setkey(struct crypto_ahash *tfm_async, const u8 *key,
64 unsigned int keylen)
65{
66 struct crypto_tfm *tfm = crypto_ahash_tfm(tfm_async);
67 struct crypto_hash *tfm_hash = __crypto_hash_cast(tfm);
68 struct hash_alg *alg = &tfm->__crt_alg->cra_hash;
69
70 return alg->setkey(tfm_hash, key, keylen);
71}
72
73static int hash_async_init(struct ahash_request *req)
74{
75 struct crypto_tfm *tfm = req->base.tfm;
76 struct hash_alg *alg = &tfm->__crt_alg->cra_hash;
77 struct hash_desc desc = {
78 .tfm = __crypto_hash_cast(tfm),
79 .flags = req->base.flags,
80 };
81
82 return alg->init(&desc);
83}
84
85static int hash_async_update(struct ahash_request *req)
86{
87 struct crypto_tfm *tfm = req->base.tfm;
88 struct hash_alg *alg = &tfm->__crt_alg->cra_hash;
89 struct hash_desc desc = {
90 .tfm = __crypto_hash_cast(tfm),
91 .flags = req->base.flags,
92 };
93
94 return alg->update(&desc, req->src, req->nbytes);
95}
96
97static int hash_async_final(struct ahash_request *req)
98{
99 struct crypto_tfm *tfm = req->base.tfm;
100 struct hash_alg *alg = &tfm->__crt_alg->cra_hash;
101 struct hash_desc desc = {
102 .tfm = __crypto_hash_cast(tfm),
103 .flags = req->base.flags,
104 };
105
106 return alg->final(&desc, req->result);
107}
108
109static int hash_async_digest(struct ahash_request *req)
110{
111 struct crypto_tfm *tfm = req->base.tfm;
112 struct hash_alg *alg = &tfm->__crt_alg->cra_hash;
113 struct hash_desc desc = {
114 .tfm = __crypto_hash_cast(tfm),
115 .flags = req->base.flags,
116 };
117
118 return alg->digest(&desc, req->src, req->nbytes, req->result);
119}
120
121static int crypto_init_hash_ops_async(struct crypto_tfm *tfm)
122{
123 struct ahash_tfm *crt = &tfm->crt_ahash;
124 struct hash_alg *alg = &tfm->__crt_alg->cra_hash;
125
126 crt->init = hash_async_init;
127 crt->update = hash_async_update;
128 crt->final = hash_async_final;
129 crt->digest = hash_async_digest;
130 crt->setkey = hash_async_setkey;
131 crt->digestsize = alg->digestsize;
132
133 return 0;
134}
135
136static int crypto_init_hash_ops_sync(struct crypto_tfm *tfm)
63{ 137{
64 struct hash_tfm *crt = &tfm->crt_hash; 138 struct hash_tfm *crt = &tfm->crt_hash;
65 struct hash_alg *alg = &tfm->__crt_alg->cra_hash; 139 struct hash_alg *alg = &tfm->__crt_alg->cra_hash;
66 140
67 if (alg->digestsize > crypto_tfm_alg_blocksize(tfm)) 141 crt->init = alg->init;
68 return -EINVAL; 142 crt->update = alg->update;
69 143 crt->final = alg->final;
70 crt->init = alg->init; 144 crt->digest = alg->digest;
71 crt->update = alg->update; 145 crt->setkey = hash_setkey;
72 crt->final = alg->final;
73 crt->digest = alg->digest;
74 crt->setkey = hash_setkey;
75 crt->digestsize = alg->digestsize; 146 crt->digestsize = alg->digestsize;
76 147
77 return 0; 148 return 0;
78} 149}
79 150
151static int crypto_init_hash_ops(struct crypto_tfm *tfm, u32 type, u32 mask)
152{
153 struct hash_alg *alg = &tfm->__crt_alg->cra_hash;
154
155 if (alg->digestsize > PAGE_SIZE / 8)
156 return -EINVAL;
157
158 if ((mask & CRYPTO_ALG_TYPE_HASH_MASK) != CRYPTO_ALG_TYPE_HASH_MASK)
159 return crypto_init_hash_ops_async(tfm);
160 else
161 return crypto_init_hash_ops_sync(tfm);
162}
163
80static void crypto_hash_show(struct seq_file *m, struct crypto_alg *alg) 164static void crypto_hash_show(struct seq_file *m, struct crypto_alg *alg)
81 __attribute__ ((unused)); 165 __attribute__ ((unused));
82static void crypto_hash_show(struct seq_file *m, struct crypto_alg *alg) 166static void crypto_hash_show(struct seq_file *m, struct crypto_alg *alg)
diff --git a/crypto/hmac.c b/crypto/hmac.c
index 14c6351e639d..7ff2d6a8c7d0 100644
--- a/crypto/hmac.c
+++ b/crypto/hmac.c
@@ -226,6 +226,7 @@ static struct crypto_instance *hmac_alloc(struct rtattr **tb)
226 struct crypto_instance *inst; 226 struct crypto_instance *inst;
227 struct crypto_alg *alg; 227 struct crypto_alg *alg;
228 int err; 228 int err;
229 int ds;
229 230
230 err = crypto_check_attr_type(tb, CRYPTO_ALG_TYPE_HASH); 231 err = crypto_check_attr_type(tb, CRYPTO_ALG_TYPE_HASH);
231 if (err) 232 if (err)
@@ -236,6 +237,13 @@ static struct crypto_instance *hmac_alloc(struct rtattr **tb)
236 if (IS_ERR(alg)) 237 if (IS_ERR(alg))
237 return ERR_CAST(alg); 238 return ERR_CAST(alg);
238 239
240 inst = ERR_PTR(-EINVAL);
241 ds = (alg->cra_flags & CRYPTO_ALG_TYPE_MASK) ==
242 CRYPTO_ALG_TYPE_HASH ? alg->cra_hash.digestsize :
243 alg->cra_digest.dia_digestsize;
244 if (ds > alg->cra_blocksize)
245 goto out_put_alg;
246
239 inst = crypto_alloc_instance("hmac", alg); 247 inst = crypto_alloc_instance("hmac", alg);
240 if (IS_ERR(inst)) 248 if (IS_ERR(inst))
241 goto out_put_alg; 249 goto out_put_alg;
@@ -246,14 +254,10 @@ static struct crypto_instance *hmac_alloc(struct rtattr **tb)
246 inst->alg.cra_alignmask = alg->cra_alignmask; 254 inst->alg.cra_alignmask = alg->cra_alignmask;
247 inst->alg.cra_type = &crypto_hash_type; 255 inst->alg.cra_type = &crypto_hash_type;
248 256
249 inst->alg.cra_hash.digestsize = 257 inst->alg.cra_hash.digestsize = ds;
250 (alg->cra_flags & CRYPTO_ALG_TYPE_MASK) ==
251 CRYPTO_ALG_TYPE_HASH ? alg->cra_hash.digestsize :
252 alg->cra_digest.dia_digestsize;
253 258
254 inst->alg.cra_ctxsize = sizeof(struct hmac_ctx) + 259 inst->alg.cra_ctxsize = sizeof(struct hmac_ctx) +
255 ALIGN(inst->alg.cra_blocksize * 2 + 260 ALIGN(inst->alg.cra_blocksize * 2 + ds,
256 inst->alg.cra_hash.digestsize,
257 sizeof(void *)); 261 sizeof(void *));
258 262
259 inst->alg.cra_init = hmac_init_tfm; 263 inst->alg.cra_init = hmac_init_tfm;
diff --git a/crypto/internal.h b/crypto/internal.h
index 32f4c2145603..8ef72d76092e 100644
--- a/crypto/internal.h
+++ b/crypto/internal.h
@@ -26,6 +26,12 @@
26#include <linux/rwsem.h> 26#include <linux/rwsem.h>
27#include <linux/slab.h> 27#include <linux/slab.h>
28 28
29#ifdef CONFIG_CRYPTO_FIPS
30extern int fips_enabled;
31#else
32#define fips_enabled 0
33#endif
34
29/* Crypto notification events. */ 35/* Crypto notification events. */
30enum { 36enum {
31 CRYPTO_MSG_ALG_REQUEST, 37 CRYPTO_MSG_ALG_REQUEST,
@@ -82,10 +88,11 @@ static inline unsigned int crypto_compress_ctxsize(struct crypto_alg *alg)
82} 88}
83 89
84struct crypto_alg *crypto_mod_get(struct crypto_alg *alg); 90struct crypto_alg *crypto_mod_get(struct crypto_alg *alg);
85struct crypto_alg *__crypto_alg_lookup(const char *name, u32 type, u32 mask); 91struct crypto_alg *crypto_alg_lookup(const char *name, u32 type, u32 mask);
86struct crypto_alg *crypto_alg_mod_lookup(const char *name, u32 type, u32 mask); 92struct crypto_alg *crypto_alg_mod_lookup(const char *name, u32 type, u32 mask);
87 93
88int crypto_init_digest_ops(struct crypto_tfm *tfm); 94int crypto_init_digest_ops(struct crypto_tfm *tfm);
95int crypto_init_digest_ops_async(struct crypto_tfm *tfm);
89int crypto_init_cipher_ops(struct crypto_tfm *tfm); 96int crypto_init_cipher_ops(struct crypto_tfm *tfm);
90int crypto_init_compress_ops(struct crypto_tfm *tfm); 97int crypto_init_compress_ops(struct crypto_tfm *tfm);
91 98
@@ -93,9 +100,11 @@ void crypto_exit_digest_ops(struct crypto_tfm *tfm);
93void crypto_exit_cipher_ops(struct crypto_tfm *tfm); 100void crypto_exit_cipher_ops(struct crypto_tfm *tfm);
94void crypto_exit_compress_ops(struct crypto_tfm *tfm); 101void crypto_exit_compress_ops(struct crypto_tfm *tfm);
95 102
103struct crypto_larval *crypto_larval_alloc(const char *name, u32 type, u32 mask);
96void crypto_larval_kill(struct crypto_alg *alg); 104void crypto_larval_kill(struct crypto_alg *alg);
97struct crypto_alg *crypto_larval_lookup(const char *name, u32 type, u32 mask); 105struct crypto_alg *crypto_larval_lookup(const char *name, u32 type, u32 mask);
98void crypto_larval_error(const char *name, u32 type, u32 mask); 106void crypto_larval_error(const char *name, u32 type, u32 mask);
107void crypto_alg_tested(const char *name, int err);
99 108
100void crypto_shoot_alg(struct crypto_alg *alg); 109void crypto_shoot_alg(struct crypto_alg *alg);
101struct crypto_tfm *__crypto_alloc_tfm(struct crypto_alg *alg, u32 type, 110struct crypto_tfm *__crypto_alloc_tfm(struct crypto_alg *alg, u32 type,
@@ -106,6 +115,10 @@ int crypto_register_instance(struct crypto_template *tmpl,
106 115
107int crypto_register_notifier(struct notifier_block *nb); 116int crypto_register_notifier(struct notifier_block *nb);
108int crypto_unregister_notifier(struct notifier_block *nb); 117int crypto_unregister_notifier(struct notifier_block *nb);
118int crypto_probing_notify(unsigned long val, void *v);
119
120int __init testmgr_init(void);
121void testmgr_exit(void);
109 122
110static inline void crypto_alg_put(struct crypto_alg *alg) 123static inline void crypto_alg_put(struct crypto_alg *alg)
111{ 124{
@@ -138,9 +151,9 @@ static inline int crypto_is_moribund(struct crypto_alg *alg)
138 return alg->cra_flags & (CRYPTO_ALG_DEAD | CRYPTO_ALG_DYING); 151 return alg->cra_flags & (CRYPTO_ALG_DEAD | CRYPTO_ALG_DYING);
139} 152}
140 153
141static inline int crypto_notify(unsigned long val, void *v) 154static inline void crypto_notify(unsigned long val, void *v)
142{ 155{
143 return blocking_notifier_call_chain(&crypto_chain, val, v); 156 blocking_notifier_call_chain(&crypto_chain, val, v);
144} 157}
145 158
146#endif /* _CRYPTO_INTERNAL_H */ 159#endif /* _CRYPTO_INTERNAL_H */
diff --git a/crypto/krng.c b/crypto/krng.c
new file mode 100644
index 000000000000..4328bb3430ed
--- /dev/null
+++ b/crypto/krng.c
@@ -0,0 +1,66 @@
1/*
2 * RNG implementation using standard kernel RNG.
3 *
4 * Copyright (c) 2008 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
8 * Free Software Foundation; either version 2 of the License, or (at your
9 * any later version.
10 *
11 */
12
13#include <crypto/internal/rng.h>
14#include <linux/err.h>
15#include <linux/init.h>
16#include <linux/module.h>
17#include <linux/random.h>
18
19static int krng_get_random(struct crypto_rng *tfm, u8 *rdata, unsigned int dlen)
20{
21 get_random_bytes(rdata, dlen);
22 return 0;
23}
24
25static int krng_reset(struct crypto_rng *tfm, u8 *seed, unsigned int slen)
26{
27 return 0;
28}
29
30static struct crypto_alg krng_alg = {
31 .cra_name = "stdrng",
32 .cra_driver_name = "krng",
33 .cra_priority = 200,
34 .cra_flags = CRYPTO_ALG_TYPE_RNG,
35 .cra_ctxsize = 0,
36 .cra_type = &crypto_rng_type,
37 .cra_module = THIS_MODULE,
38 .cra_list = LIST_HEAD_INIT(krng_alg.cra_list),
39 .cra_u = {
40 .rng = {
41 .rng_make_random = krng_get_random,
42 .rng_reset = krng_reset,
43 .seedsize = 0,
44 }
45 }
46};
47
48
49/* Module initalization */
50static int __init krng_mod_init(void)
51{
52 return crypto_register_alg(&krng_alg);
53}
54
55static void __exit krng_mod_fini(void)
56{
57 crypto_unregister_alg(&krng_alg);
58 return;
59}
60
61module_init(krng_mod_init);
62module_exit(krng_mod_fini);
63
64MODULE_LICENSE("GPL");
65MODULE_DESCRIPTION("Kernel Random Number Generator");
66MODULE_ALIAS("stdrng");
diff --git a/crypto/proc.c b/crypto/proc.c
index 02ff5670c158..37a13d05636d 100644
--- a/crypto/proc.c
+++ b/crypto/proc.c
@@ -19,8 +19,53 @@
19#include <linux/rwsem.h> 19#include <linux/rwsem.h>
20#include <linux/proc_fs.h> 20#include <linux/proc_fs.h>
21#include <linux/seq_file.h> 21#include <linux/seq_file.h>
22#include <linux/sysctl.h>
22#include "internal.h" 23#include "internal.h"
23 24
25#ifdef CONFIG_CRYPTO_FIPS
26static struct ctl_table crypto_sysctl_table[] = {
27 {
28 .ctl_name = CTL_UNNUMBERED,
29 .procname = "fips_enabled",
30 .data = &fips_enabled,
31 .maxlen = sizeof(int),
32 .mode = 0444,
33 .proc_handler = &proc_dointvec
34 },
35 {
36 .ctl_name = 0,
37 },
38};
39
40static struct ctl_table crypto_dir_table[] = {
41 {
42 .ctl_name = CTL_UNNUMBERED,
43 .procname = "crypto",
44 .mode = 0555,
45 .child = crypto_sysctl_table
46 },
47 {
48 .ctl_name = 0,
49 },
50};
51
52static struct ctl_table_header *crypto_sysctls;
53
54static void crypto_proc_fips_init(void)
55{
56 crypto_sysctls = register_sysctl_table(crypto_dir_table);
57}
58
59static void crypto_proc_fips_exit(void)
60{
61 if (crypto_sysctls)
62 unregister_sysctl_table(crypto_sysctls);
63}
64#else
65#define crypto_proc_fips_init()
66#define crypto_proc_fips_exit()
67#endif
68
24static void *c_start(struct seq_file *m, loff_t *pos) 69static void *c_start(struct seq_file *m, loff_t *pos)
25{ 70{
26 down_read(&crypto_alg_sem); 71 down_read(&crypto_alg_sem);
@@ -46,8 +91,11 @@ static int c_show(struct seq_file *m, void *p)
46 seq_printf(m, "module : %s\n", module_name(alg->cra_module)); 91 seq_printf(m, "module : %s\n", module_name(alg->cra_module));
47 seq_printf(m, "priority : %d\n", alg->cra_priority); 92 seq_printf(m, "priority : %d\n", alg->cra_priority);
48 seq_printf(m, "refcnt : %d\n", atomic_read(&alg->cra_refcnt)); 93 seq_printf(m, "refcnt : %d\n", atomic_read(&alg->cra_refcnt));
94 seq_printf(m, "selftest : %s\n",
95 (alg->cra_flags & CRYPTO_ALG_TESTED) ?
96 "passed" : "unknown");
49 97
50 switch (alg->cra_flags & CRYPTO_ALG_TYPE_MASK) { 98 switch (alg->cra_flags & (CRYPTO_ALG_TYPE_MASK | CRYPTO_ALG_LARVAL)) {
51 case CRYPTO_ALG_TYPE_CIPHER: 99 case CRYPTO_ALG_TYPE_CIPHER:
52 seq_printf(m, "type : cipher\n"); 100 seq_printf(m, "type : cipher\n");
53 seq_printf(m, "blocksize : %u\n", alg->cra_blocksize); 101 seq_printf(m, "blocksize : %u\n", alg->cra_blocksize);
@@ -67,7 +115,10 @@ static int c_show(struct seq_file *m, void *p)
67 seq_printf(m, "type : compression\n"); 115 seq_printf(m, "type : compression\n");
68 break; 116 break;
69 default: 117 default:
70 if (alg->cra_type && alg->cra_type->show) 118 if (alg->cra_flags & CRYPTO_ALG_LARVAL) {
119 seq_printf(m, "type : larval\n");
120 seq_printf(m, "flags : 0x%x\n", alg->cra_flags);
121 } else if (alg->cra_type && alg->cra_type->show)
71 alg->cra_type->show(m, alg); 122 alg->cra_type->show(m, alg);
72 else 123 else
73 seq_printf(m, "type : unknown\n"); 124 seq_printf(m, "type : unknown\n");
@@ -100,9 +151,11 @@ static const struct file_operations proc_crypto_ops = {
100void __init crypto_init_proc(void) 151void __init crypto_init_proc(void)
101{ 152{
102 proc_create("crypto", 0, NULL, &proc_crypto_ops); 153 proc_create("crypto", 0, NULL, &proc_crypto_ops);
154 crypto_proc_fips_init();
103} 155}
104 156
105void __exit crypto_exit_proc(void) 157void __exit crypto_exit_proc(void)
106{ 158{
159 crypto_proc_fips_exit();
107 remove_proc_entry("crypto", NULL); 160 remove_proc_entry("crypto", NULL);
108} 161}
diff --git a/crypto/ripemd.h b/crypto/ripemd.h
new file mode 100644
index 000000000000..c57a2d4ce8d9
--- /dev/null
+++ b/crypto/ripemd.h
@@ -0,0 +1,43 @@
1/*
2 * Common values for RIPEMD algorithms
3 */
4
5#ifndef _CRYPTO_RMD_H
6#define _CRYPTO_RMD_H
7
8#define RMD128_DIGEST_SIZE 16
9#define RMD128_BLOCK_SIZE 64
10
11#define RMD160_DIGEST_SIZE 20
12#define RMD160_BLOCK_SIZE 64
13
14#define RMD256_DIGEST_SIZE 32
15#define RMD256_BLOCK_SIZE 64
16
17#define RMD320_DIGEST_SIZE 40
18#define RMD320_BLOCK_SIZE 64
19
20/* initial values */
21#define RMD_H0 0x67452301UL
22#define RMD_H1 0xefcdab89UL
23#define RMD_H2 0x98badcfeUL
24#define RMD_H3 0x10325476UL
25#define RMD_H4 0xc3d2e1f0UL
26#define RMD_H5 0x76543210UL
27#define RMD_H6 0xfedcba98UL
28#define RMD_H7 0x89abcdefUL
29#define RMD_H8 0x01234567UL
30#define RMD_H9 0x3c2d1e0fUL
31
32/* constants */
33#define RMD_K1 0x00000000UL
34#define RMD_K2 0x5a827999UL
35#define RMD_K3 0x6ed9eba1UL
36#define RMD_K4 0x8f1bbcdcUL
37#define RMD_K5 0xa953fd4eUL
38#define RMD_K6 0x50a28be6UL
39#define RMD_K7 0x5c4dd124UL
40#define RMD_K8 0x6d703ef3UL
41#define RMD_K9 0x7a6d76e9UL
42
43#endif
diff --git a/crypto/rmd128.c b/crypto/rmd128.c
new file mode 100644
index 000000000000..5de6fa2a76fb
--- /dev/null
+++ b/crypto/rmd128.c
@@ -0,0 +1,325 @@
1/*
2 * Cryptographic API.
3 *
4 * RIPEMD-128 - RACE Integrity Primitives Evaluation Message Digest.
5 *
6 * Based on the reference implementation by Antoon Bosselaers, ESAT-COSIC
7 *
8 * Copyright (c) 2008 Adrian-Ken Rueegsegger <rueegsegger (at) swiss-it.ch>
9 *
10 * 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 * Software Foundation; either version 2 of the License, or (at your option)
13 * any later version.
14 *
15 */
16#include <linux/init.h>
17#include <linux/module.h>
18#include <linux/mm.h>
19#include <linux/crypto.h>
20#include <linux/cryptohash.h>
21#include <linux/types.h>
22#include <asm/byteorder.h>
23
24#include "ripemd.h"
25
26struct rmd128_ctx {
27 u64 byte_count;
28 u32 state[4];
29 __le32 buffer[16];
30};
31
32#define K1 RMD_K1
33#define K2 RMD_K2
34#define K3 RMD_K3
35#define K4 RMD_K4
36#define KK1 RMD_K6
37#define KK2 RMD_K7
38#define KK3 RMD_K8
39#define KK4 RMD_K1
40
41#define F1(x, y, z) (x ^ y ^ z) /* XOR */
42#define F2(x, y, z) (z ^ (x & (y ^ z))) /* x ? y : z */
43#define F3(x, y, z) ((x | ~y) ^ z)
44#define F4(x, y, z) (y ^ (z & (x ^ y))) /* z ? x : y */
45
46#define ROUND(a, b, c, d, f, k, x, s) { \
47 (a) += f((b), (c), (d)) + le32_to_cpup(&(x)) + (k); \
48 (a) = rol32((a), (s)); \
49}
50
51static void rmd128_transform(u32 *state, const __le32 *in)
52{
53 u32 aa, bb, cc, dd, aaa, bbb, ccc, ddd;
54
55 /* Initialize left lane */
56 aa = state[0];
57 bb = state[1];
58 cc = state[2];
59 dd = state[3];
60
61 /* Initialize right lane */
62 aaa = state[0];
63 bbb = state[1];
64 ccc = state[2];
65 ddd = state[3];
66
67 /* round 1: left lane */
68 ROUND(aa, bb, cc, dd, F1, K1, in[0], 11);
69 ROUND(dd, aa, bb, cc, F1, K1, in[1], 14);
70 ROUND(cc, dd, aa, bb, F1, K1, in[2], 15);
71 ROUND(bb, cc, dd, aa, F1, K1, in[3], 12);
72 ROUND(aa, bb, cc, dd, F1, K1, in[4], 5);
73 ROUND(dd, aa, bb, cc, F1, K1, in[5], 8);
74 ROUND(cc, dd, aa, bb, F1, K1, in[6], 7);
75 ROUND(bb, cc, dd, aa, F1, K1, in[7], 9);
76 ROUND(aa, bb, cc, dd, F1, K1, in[8], 11);
77 ROUND(dd, aa, bb, cc, F1, K1, in[9], 13);
78 ROUND(cc, dd, aa, bb, F1, K1, in[10], 14);
79 ROUND(bb, cc, dd, aa, F1, K1, in[11], 15);
80 ROUND(aa, bb, cc, dd, F1, K1, in[12], 6);
81 ROUND(dd, aa, bb, cc, F1, K1, in[13], 7);
82 ROUND(cc, dd, aa, bb, F1, K1, in[14], 9);
83 ROUND(bb, cc, dd, aa, F1, K1, in[15], 8);
84
85 /* round 2: left lane */
86 ROUND(aa, bb, cc, dd, F2, K2, in[7], 7);
87 ROUND(dd, aa, bb, cc, F2, K2, in[4], 6);
88 ROUND(cc, dd, aa, bb, F2, K2, in[13], 8);
89 ROUND(bb, cc, dd, aa, F2, K2, in[1], 13);
90 ROUND(aa, bb, cc, dd, F2, K2, in[10], 11);
91 ROUND(dd, aa, bb, cc, F2, K2, in[6], 9);
92 ROUND(cc, dd, aa, bb, F2, K2, in[15], 7);
93 ROUND(bb, cc, dd, aa, F2, K2, in[3], 15);
94 ROUND(aa, bb, cc, dd, F2, K2, in[12], 7);
95 ROUND(dd, aa, bb, cc, F2, K2, in[0], 12);
96 ROUND(cc, dd, aa, bb, F2, K2, in[9], 15);
97 ROUND(bb, cc, dd, aa, F2, K2, in[5], 9);
98 ROUND(aa, bb, cc, dd, F2, K2, in[2], 11);
99 ROUND(dd, aa, bb, cc, F2, K2, in[14], 7);
100 ROUND(cc, dd, aa, bb, F2, K2, in[11], 13);
101 ROUND(bb, cc, dd, aa, F2, K2, in[8], 12);
102
103 /* round 3: left lane */
104 ROUND(aa, bb, cc, dd, F3, K3, in[3], 11);
105 ROUND(dd, aa, bb, cc, F3, K3, in[10], 13);
106 ROUND(cc, dd, aa, bb, F3, K3, in[14], 6);
107 ROUND(bb, cc, dd, aa, F3, K3, in[4], 7);
108 ROUND(aa, bb, cc, dd, F3, K3, in[9], 14);
109 ROUND(dd, aa, bb, cc, F3, K3, in[15], 9);
110 ROUND(cc, dd, aa, bb, F3, K3, in[8], 13);
111 ROUND(bb, cc, dd, aa, F3, K3, in[1], 15);
112 ROUND(aa, bb, cc, dd, F3, K3, in[2], 14);
113 ROUND(dd, aa, bb, cc, F3, K3, in[7], 8);
114 ROUND(cc, dd, aa, bb, F3, K3, in[0], 13);
115 ROUND(bb, cc, dd, aa, F3, K3, in[6], 6);
116 ROUND(aa, bb, cc, dd, F3, K3, in[13], 5);
117 ROUND(dd, aa, bb, cc, F3, K3, in[11], 12);
118 ROUND(cc, dd, aa, bb, F3, K3, in[5], 7);
119 ROUND(bb, cc, dd, aa, F3, K3, in[12], 5);
120
121 /* round 4: left lane */
122 ROUND(aa, bb, cc, dd, F4, K4, in[1], 11);
123 ROUND(dd, aa, bb, cc, F4, K4, in[9], 12);
124 ROUND(cc, dd, aa, bb, F4, K4, in[11], 14);
125 ROUND(bb, cc, dd, aa, F4, K4, in[10], 15);
126 ROUND(aa, bb, cc, dd, F4, K4, in[0], 14);
127 ROUND(dd, aa, bb, cc, F4, K4, in[8], 15);
128 ROUND(cc, dd, aa, bb, F4, K4, in[12], 9);
129 ROUND(bb, cc, dd, aa, F4, K4, in[4], 8);
130 ROUND(aa, bb, cc, dd, F4, K4, in[13], 9);
131 ROUND(dd, aa, bb, cc, F4, K4, in[3], 14);
132 ROUND(cc, dd, aa, bb, F4, K4, in[7], 5);
133 ROUND(bb, cc, dd, aa, F4, K4, in[15], 6);
134 ROUND(aa, bb, cc, dd, F4, K4, in[14], 8);
135 ROUND(dd, aa, bb, cc, F4, K4, in[5], 6);
136 ROUND(cc, dd, aa, bb, F4, K4, in[6], 5);
137 ROUND(bb, cc, dd, aa, F4, K4, in[2], 12);
138
139 /* round 1: right lane */
140 ROUND(aaa, bbb, ccc, ddd, F4, KK1, in[5], 8);
141 ROUND(ddd, aaa, bbb, ccc, F4, KK1, in[14], 9);
142 ROUND(ccc, ddd, aaa, bbb, F4, KK1, in[7], 9);
143 ROUND(bbb, ccc, ddd, aaa, F4, KK1, in[0], 11);
144 ROUND(aaa, bbb, ccc, ddd, F4, KK1, in[9], 13);
145 ROUND(ddd, aaa, bbb, ccc, F4, KK1, in[2], 15);
146 ROUND(ccc, ddd, aaa, bbb, F4, KK1, in[11], 15);
147 ROUND(bbb, ccc, ddd, aaa, F4, KK1, in[4], 5);
148 ROUND(aaa, bbb, ccc, ddd, F4, KK1, in[13], 7);
149 ROUND(ddd, aaa, bbb, ccc, F4, KK1, in[6], 7);
150 ROUND(ccc, ddd, aaa, bbb, F4, KK1, in[15], 8);
151 ROUND(bbb, ccc, ddd, aaa, F4, KK1, in[8], 11);
152 ROUND(aaa, bbb, ccc, ddd, F4, KK1, in[1], 14);
153 ROUND(ddd, aaa, bbb, ccc, F4, KK1, in[10], 14);
154 ROUND(ccc, ddd, aaa, bbb, F4, KK1, in[3], 12);
155 ROUND(bbb, ccc, ddd, aaa, F4, KK1, in[12], 6);
156
157 /* round 2: right lane */
158 ROUND(aaa, bbb, ccc, ddd, F3, KK2, in[6], 9);
159 ROUND(ddd, aaa, bbb, ccc, F3, KK2, in[11], 13);
160 ROUND(ccc, ddd, aaa, bbb, F3, KK2, in[3], 15);
161 ROUND(bbb, ccc, ddd, aaa, F3, KK2, in[7], 7);
162 ROUND(aaa, bbb, ccc, ddd, F3, KK2, in[0], 12);
163 ROUND(ddd, aaa, bbb, ccc, F3, KK2, in[13], 8);
164 ROUND(ccc, ddd, aaa, bbb, F3, KK2, in[5], 9);
165 ROUND(bbb, ccc, ddd, aaa, F3, KK2, in[10], 11);
166 ROUND(aaa, bbb, ccc, ddd, F3, KK2, in[14], 7);
167 ROUND(ddd, aaa, bbb, ccc, F3, KK2, in[15], 7);
168 ROUND(ccc, ddd, aaa, bbb, F3, KK2, in[8], 12);
169 ROUND(bbb, ccc, ddd, aaa, F3, KK2, in[12], 7);
170 ROUND(aaa, bbb, ccc, ddd, F3, KK2, in[4], 6);
171 ROUND(ddd, aaa, bbb, ccc, F3, KK2, in[9], 15);
172 ROUND(ccc, ddd, aaa, bbb, F3, KK2, in[1], 13);
173 ROUND(bbb, ccc, ddd, aaa, F3, KK2, in[2], 11);
174
175 /* round 3: right lane */
176 ROUND(aaa, bbb, ccc, ddd, F2, KK3, in[15], 9);
177 ROUND(ddd, aaa, bbb, ccc, F2, KK3, in[5], 7);
178 ROUND(ccc, ddd, aaa, bbb, F2, KK3, in[1], 15);
179 ROUND(bbb, ccc, ddd, aaa, F2, KK3, in[3], 11);
180 ROUND(aaa, bbb, ccc, ddd, F2, KK3, in[7], 8);
181 ROUND(ddd, aaa, bbb, ccc, F2, KK3, in[14], 6);
182 ROUND(ccc, ddd, aaa, bbb, F2, KK3, in[6], 6);
183 ROUND(bbb, ccc, ddd, aaa, F2, KK3, in[9], 14);
184 ROUND(aaa, bbb, ccc, ddd, F2, KK3, in[11], 12);
185 ROUND(ddd, aaa, bbb, ccc, F2, KK3, in[8], 13);
186 ROUND(ccc, ddd, aaa, bbb, F2, KK3, in[12], 5);
187 ROUND(bbb, ccc, ddd, aaa, F2, KK3, in[2], 14);
188 ROUND(aaa, bbb, ccc, ddd, F2, KK3, in[10], 13);
189 ROUND(ddd, aaa, bbb, ccc, F2, KK3, in[0], 13);
190 ROUND(ccc, ddd, aaa, bbb, F2, KK3, in[4], 7);
191 ROUND(bbb, ccc, ddd, aaa, F2, KK3, in[13], 5);
192
193 /* round 4: right lane */
194 ROUND(aaa, bbb, ccc, ddd, F1, KK4, in[8], 15);
195 ROUND(ddd, aaa, bbb, ccc, F1, KK4, in[6], 5);
196 ROUND(ccc, ddd, aaa, bbb, F1, KK4, in[4], 8);
197 ROUND(bbb, ccc, ddd, aaa, F1, KK4, in[1], 11);
198 ROUND(aaa, bbb, ccc, ddd, F1, KK4, in[3], 14);
199 ROUND(ddd, aaa, bbb, ccc, F1, KK4, in[11], 14);
200 ROUND(ccc, ddd, aaa, bbb, F1, KK4, in[15], 6);
201 ROUND(bbb, ccc, ddd, aaa, F1, KK4, in[0], 14);
202 ROUND(aaa, bbb, ccc, ddd, F1, KK4, in[5], 6);
203 ROUND(ddd, aaa, bbb, ccc, F1, KK4, in[12], 9);
204 ROUND(ccc, ddd, aaa, bbb, F1, KK4, in[2], 12);
205 ROUND(bbb, ccc, ddd, aaa, F1, KK4, in[13], 9);
206 ROUND(aaa, bbb, ccc, ddd, F1, KK4, in[9], 12);
207 ROUND(ddd, aaa, bbb, ccc, F1, KK4, in[7], 5);
208 ROUND(ccc, ddd, aaa, bbb, F1, KK4, in[10], 15);
209 ROUND(bbb, ccc, ddd, aaa, F1, KK4, in[14], 8);
210
211 /* combine results */
212 ddd += cc + state[1]; /* final result for state[0] */
213 state[1] = state[2] + dd + aaa;
214 state[2] = state[3] + aa + bbb;
215 state[3] = state[0] + bb + ccc;
216 state[0] = ddd;
217
218 return;
219}
220
221static void rmd128_init(struct crypto_tfm *tfm)
222{
223 struct rmd128_ctx *rctx = crypto_tfm_ctx(tfm);
224
225 rctx->byte_count = 0;
226
227 rctx->state[0] = RMD_H0;
228 rctx->state[1] = RMD_H1;
229 rctx->state[2] = RMD_H2;
230 rctx->state[3] = RMD_H3;
231
232 memset(rctx->buffer, 0, sizeof(rctx->buffer));
233}
234
235static void rmd128_update(struct crypto_tfm *tfm, const u8 *data,
236 unsigned int len)
237{
238 struct rmd128_ctx *rctx = crypto_tfm_ctx(tfm);
239 const u32 avail = sizeof(rctx->buffer) - (rctx->byte_count & 0x3f);
240
241 rctx->byte_count += len;
242
243 /* Enough space in buffer? If so copy and we're done */
244 if (avail > len) {
245 memcpy((char *)rctx->buffer + (sizeof(rctx->buffer) - avail),
246 data, len);
247 return;
248 }
249
250 memcpy((char *)rctx->buffer + (sizeof(rctx->buffer) - avail),
251 data, avail);
252
253 rmd128_transform(rctx->state, rctx->buffer);
254 data += avail;
255 len -= avail;
256
257 while (len >= sizeof(rctx->buffer)) {
258 memcpy(rctx->buffer, data, sizeof(rctx->buffer));
259 rmd128_transform(rctx->state, rctx->buffer);
260 data += sizeof(rctx->buffer);
261 len -= sizeof(rctx->buffer);
262 }
263
264 memcpy(rctx->buffer, data, len);
265}
266
267/* Add padding and return the message digest. */
268static void rmd128_final(struct crypto_tfm *tfm, u8 *out)
269{
270 struct rmd128_ctx *rctx = crypto_tfm_ctx(tfm);
271 u32 i, index, padlen;
272 __le64 bits;
273 __le32 *dst = (__le32 *)out;
274 static const u8 padding[64] = { 0x80, };
275
276 bits = cpu_to_le64(rctx->byte_count << 3);
277
278 /* Pad out to 56 mod 64 */
279 index = rctx->byte_count & 0x3f;
280 padlen = (index < 56) ? (56 - index) : ((64+56) - index);
281 rmd128_update(tfm, padding, padlen);
282
283 /* Append length */
284 rmd128_update(tfm, (const u8 *)&bits, sizeof(bits));
285
286 /* Store state in digest */
287 for (i = 0; i < 4; i++)
288 dst[i] = cpu_to_le32p(&rctx->state[i]);
289
290 /* Wipe context */
291 memset(rctx, 0, sizeof(*rctx));
292}
293
294static struct crypto_alg alg = {
295 .cra_name = "rmd128",
296 .cra_driver_name = "rmd128",
297 .cra_flags = CRYPTO_ALG_TYPE_DIGEST,
298 .cra_blocksize = RMD128_BLOCK_SIZE,
299 .cra_ctxsize = sizeof(struct rmd128_ctx),
300 .cra_module = THIS_MODULE,
301 .cra_list = LIST_HEAD_INIT(alg.cra_list),
302 .cra_u = { .digest = {
303 .dia_digestsize = RMD128_DIGEST_SIZE,
304 .dia_init = rmd128_init,
305 .dia_update = rmd128_update,
306 .dia_final = rmd128_final } }
307};
308
309static int __init rmd128_mod_init(void)
310{
311 return crypto_register_alg(&alg);
312}
313
314static void __exit rmd128_mod_fini(void)
315{
316 crypto_unregister_alg(&alg);
317}
318
319module_init(rmd128_mod_init);
320module_exit(rmd128_mod_fini);
321
322MODULE_LICENSE("GPL");
323MODULE_DESCRIPTION("RIPEMD-128 Message Digest");
324
325MODULE_ALIAS("rmd128");
diff --git a/crypto/rmd160.c b/crypto/rmd160.c
new file mode 100644
index 000000000000..f001ec775e1f
--- /dev/null
+++ b/crypto/rmd160.c
@@ -0,0 +1,369 @@
1/*
2 * Cryptographic API.
3 *
4 * RIPEMD-160 - RACE Integrity Primitives Evaluation Message Digest.
5 *
6 * Based on the reference implementation by Antoon Bosselaers, ESAT-COSIC
7 *
8 * Copyright (c) 2008 Adrian-Ken Rueegsegger <rueegsegger (at) swiss-it.ch>
9 *
10 * 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 * Software Foundation; either version 2 of the License, or (at your option)
13 * any later version.
14 *
15 */
16#include <linux/init.h>
17#include <linux/module.h>
18#include <linux/mm.h>
19#include <linux/crypto.h>
20#include <linux/cryptohash.h>
21#include <linux/types.h>
22#include <asm/byteorder.h>
23
24#include "ripemd.h"
25
26struct rmd160_ctx {
27 u64 byte_count;
28 u32 state[5];
29 __le32 buffer[16];
30};
31
32#define K1 RMD_K1
33#define K2 RMD_K2
34#define K3 RMD_K3
35#define K4 RMD_K4
36#define K5 RMD_K5
37#define KK1 RMD_K6
38#define KK2 RMD_K7
39#define KK3 RMD_K8
40#define KK4 RMD_K9
41#define KK5 RMD_K1
42
43#define F1(x, y, z) (x ^ y ^ z) /* XOR */
44#define F2(x, y, z) (z ^ (x & (y ^ z))) /* x ? y : z */
45#define F3(x, y, z) ((x | ~y) ^ z)
46#define F4(x, y, z) (y ^ (z & (x ^ y))) /* z ? x : y */
47#define F5(x, y, z) (x ^ (y | ~z))
48
49#define ROUND(a, b, c, d, e, f, k, x, s) { \
50 (a) += f((b), (c), (d)) + le32_to_cpup(&(x)) + (k); \
51 (a) = rol32((a), (s)) + (e); \
52 (c) = rol32((c), 10); \
53}
54
55static void rmd160_transform(u32 *state, const __le32 *in)
56{
57 u32 aa, bb, cc, dd, ee, aaa, bbb, ccc, ddd, eee;
58
59 /* Initialize left lane */
60 aa = state[0];
61 bb = state[1];
62 cc = state[2];
63 dd = state[3];
64 ee = state[4];
65
66 /* Initialize right lane */
67 aaa = state[0];
68 bbb = state[1];
69 ccc = state[2];
70 ddd = state[3];
71 eee = state[4];
72
73 /* round 1: left lane */
74 ROUND(aa, bb, cc, dd, ee, F1, K1, in[0], 11);
75 ROUND(ee, aa, bb, cc, dd, F1, K1, in[1], 14);
76 ROUND(dd, ee, aa, bb, cc, F1, K1, in[2], 15);
77 ROUND(cc, dd, ee, aa, bb, F1, K1, in[3], 12);
78 ROUND(bb, cc, dd, ee, aa, F1, K1, in[4], 5);
79 ROUND(aa, bb, cc, dd, ee, F1, K1, in[5], 8);
80 ROUND(ee, aa, bb, cc, dd, F1, K1, in[6], 7);
81 ROUND(dd, ee, aa, bb, cc, F1, K1, in[7], 9);
82 ROUND(cc, dd, ee, aa, bb, F1, K1, in[8], 11);
83 ROUND(bb, cc, dd, ee, aa, F1, K1, in[9], 13);
84 ROUND(aa, bb, cc, dd, ee, F1, K1, in[10], 14);
85 ROUND(ee, aa, bb, cc, dd, F1, K1, in[11], 15);
86 ROUND(dd, ee, aa, bb, cc, F1, K1, in[12], 6);
87 ROUND(cc, dd, ee, aa, bb, F1, K1, in[13], 7);
88 ROUND(bb, cc, dd, ee, aa, F1, K1, in[14], 9);
89 ROUND(aa, bb, cc, dd, ee, F1, K1, in[15], 8);
90
91 /* round 2: left lane" */
92 ROUND(ee, aa, bb, cc, dd, F2, K2, in[7], 7);
93 ROUND(dd, ee, aa, bb, cc, F2, K2, in[4], 6);
94 ROUND(cc, dd, ee, aa, bb, F2, K2, in[13], 8);
95 ROUND(bb, cc, dd, ee, aa, F2, K2, in[1], 13);
96 ROUND(aa, bb, cc, dd, ee, F2, K2, in[10], 11);
97 ROUND(ee, aa, bb, cc, dd, F2, K2, in[6], 9);
98 ROUND(dd, ee, aa, bb, cc, F2, K2, in[15], 7);
99 ROUND(cc, dd, ee, aa, bb, F2, K2, in[3], 15);
100 ROUND(bb, cc, dd, ee, aa, F2, K2, in[12], 7);
101 ROUND(aa, bb, cc, dd, ee, F2, K2, in[0], 12);
102 ROUND(ee, aa, bb, cc, dd, F2, K2, in[9], 15);
103 ROUND(dd, ee, aa, bb, cc, F2, K2, in[5], 9);
104 ROUND(cc, dd, ee, aa, bb, F2, K2, in[2], 11);
105 ROUND(bb, cc, dd, ee, aa, F2, K2, in[14], 7);
106 ROUND(aa, bb, cc, dd, ee, F2, K2, in[11], 13);
107 ROUND(ee, aa, bb, cc, dd, F2, K2, in[8], 12);
108
109 /* round 3: left lane" */
110 ROUND(dd, ee, aa, bb, cc, F3, K3, in[3], 11);
111 ROUND(cc, dd, ee, aa, bb, F3, K3, in[10], 13);
112 ROUND(bb, cc, dd, ee, aa, F3, K3, in[14], 6);
113 ROUND(aa, bb, cc, dd, ee, F3, K3, in[4], 7);
114 ROUND(ee, aa, bb, cc, dd, F3, K3, in[9], 14);
115 ROUND(dd, ee, aa, bb, cc, F3, K3, in[15], 9);
116 ROUND(cc, dd, ee, aa, bb, F3, K3, in[8], 13);
117 ROUND(bb, cc, dd, ee, aa, F3, K3, in[1], 15);
118 ROUND(aa, bb, cc, dd, ee, F3, K3, in[2], 14);
119 ROUND(ee, aa, bb, cc, dd, F3, K3, in[7], 8);
120 ROUND(dd, ee, aa, bb, cc, F3, K3, in[0], 13);
121 ROUND(cc, dd, ee, aa, bb, F3, K3, in[6], 6);
122 ROUND(bb, cc, dd, ee, aa, F3, K3, in[13], 5);
123 ROUND(aa, bb, cc, dd, ee, F3, K3, in[11], 12);
124 ROUND(ee, aa, bb, cc, dd, F3, K3, in[5], 7);
125 ROUND(dd, ee, aa, bb, cc, F3, K3, in[12], 5);
126
127 /* round 4: left lane" */
128 ROUND(cc, dd, ee, aa, bb, F4, K4, in[1], 11);
129 ROUND(bb, cc, dd, ee, aa, F4, K4, in[9], 12);
130 ROUND(aa, bb, cc, dd, ee, F4, K4, in[11], 14);
131 ROUND(ee, aa, bb, cc, dd, F4, K4, in[10], 15);
132 ROUND(dd, ee, aa, bb, cc, F4, K4, in[0], 14);
133 ROUND(cc, dd, ee, aa, bb, F4, K4, in[8], 15);
134 ROUND(bb, cc, dd, ee, aa, F4, K4, in[12], 9);
135 ROUND(aa, bb, cc, dd, ee, F4, K4, in[4], 8);
136 ROUND(ee, aa, bb, cc, dd, F4, K4, in[13], 9);
137 ROUND(dd, ee, aa, bb, cc, F4, K4, in[3], 14);
138 ROUND(cc, dd, ee, aa, bb, F4, K4, in[7], 5);
139 ROUND(bb, cc, dd, ee, aa, F4, K4, in[15], 6);
140 ROUND(aa, bb, cc, dd, ee, F4, K4, in[14], 8);
141 ROUND(ee, aa, bb, cc, dd, F4, K4, in[5], 6);
142 ROUND(dd, ee, aa, bb, cc, F4, K4, in[6], 5);
143 ROUND(cc, dd, ee, aa, bb, F4, K4, in[2], 12);
144
145 /* round 5: left lane" */
146 ROUND(bb, cc, dd, ee, aa, F5, K5, in[4], 9);
147 ROUND(aa, bb, cc, dd, ee, F5, K5, in[0], 15);
148 ROUND(ee, aa, bb, cc, dd, F5, K5, in[5], 5);
149 ROUND(dd, ee, aa, bb, cc, F5, K5, in[9], 11);
150 ROUND(cc, dd, ee, aa, bb, F5, K5, in[7], 6);
151 ROUND(bb, cc, dd, ee, aa, F5, K5, in[12], 8);
152 ROUND(aa, bb, cc, dd, ee, F5, K5, in[2], 13);
153 ROUND(ee, aa, bb, cc, dd, F5, K5, in[10], 12);
154 ROUND(dd, ee, aa, bb, cc, F5, K5, in[14], 5);
155 ROUND(cc, dd, ee, aa, bb, F5, K5, in[1], 12);
156 ROUND(bb, cc, dd, ee, aa, F5, K5, in[3], 13);
157 ROUND(aa, bb, cc, dd, ee, F5, K5, in[8], 14);
158 ROUND(ee, aa, bb, cc, dd, F5, K5, in[11], 11);
159 ROUND(dd, ee, aa, bb, cc, F5, K5, in[6], 8);
160 ROUND(cc, dd, ee, aa, bb, F5, K5, in[15], 5);
161 ROUND(bb, cc, dd, ee, aa, F5, K5, in[13], 6);
162
163 /* round 1: right lane */
164 ROUND(aaa, bbb, ccc, ddd, eee, F5, KK1, in[5], 8);
165 ROUND(eee, aaa, bbb, ccc, ddd, F5, KK1, in[14], 9);
166 ROUND(ddd, eee, aaa, bbb, ccc, F5, KK1, in[7], 9);
167 ROUND(ccc, ddd, eee, aaa, bbb, F5, KK1, in[0], 11);
168 ROUND(bbb, ccc, ddd, eee, aaa, F5, KK1, in[9], 13);
169 ROUND(aaa, bbb, ccc, ddd, eee, F5, KK1, in[2], 15);
170 ROUND(eee, aaa, bbb, ccc, ddd, F5, KK1, in[11], 15);
171 ROUND(ddd, eee, aaa, bbb, ccc, F5, KK1, in[4], 5);
172 ROUND(ccc, ddd, eee, aaa, bbb, F5, KK1, in[13], 7);
173 ROUND(bbb, ccc, ddd, eee, aaa, F5, KK1, in[6], 7);
174 ROUND(aaa, bbb, ccc, ddd, eee, F5, KK1, in[15], 8);
175 ROUND(eee, aaa, bbb, ccc, ddd, F5, KK1, in[8], 11);
176 ROUND(ddd, eee, aaa, bbb, ccc, F5, KK1, in[1], 14);
177 ROUND(ccc, ddd, eee, aaa, bbb, F5, KK1, in[10], 14);
178 ROUND(bbb, ccc, ddd, eee, aaa, F5, KK1, in[3], 12);
179 ROUND(aaa, bbb, ccc, ddd, eee, F5, KK1, in[12], 6);
180
181 /* round 2: right lane */
182 ROUND(eee, aaa, bbb, ccc, ddd, F4, KK2, in[6], 9);
183 ROUND(ddd, eee, aaa, bbb, ccc, F4, KK2, in[11], 13);
184 ROUND(ccc, ddd, eee, aaa, bbb, F4, KK2, in[3], 15);
185 ROUND(bbb, ccc, ddd, eee, aaa, F4, KK2, in[7], 7);
186 ROUND(aaa, bbb, ccc, ddd, eee, F4, KK2, in[0], 12);
187 ROUND(eee, aaa, bbb, ccc, ddd, F4, KK2, in[13], 8);
188 ROUND(ddd, eee, aaa, bbb, ccc, F4, KK2, in[5], 9);
189 ROUND(ccc, ddd, eee, aaa, bbb, F4, KK2, in[10], 11);
190 ROUND(bbb, ccc, ddd, eee, aaa, F4, KK2, in[14], 7);
191 ROUND(aaa, bbb, ccc, ddd, eee, F4, KK2, in[15], 7);
192 ROUND(eee, aaa, bbb, ccc, ddd, F4, KK2, in[8], 12);
193 ROUND(ddd, eee, aaa, bbb, ccc, F4, KK2, in[12], 7);
194 ROUND(ccc, ddd, eee, aaa, bbb, F4, KK2, in[4], 6);
195 ROUND(bbb, ccc, ddd, eee, aaa, F4, KK2, in[9], 15);
196 ROUND(aaa, bbb, ccc, ddd, eee, F4, KK2, in[1], 13);
197 ROUND(eee, aaa, bbb, ccc, ddd, F4, KK2, in[2], 11);
198
199 /* round 3: right lane */
200 ROUND(ddd, eee, aaa, bbb, ccc, F3, KK3, in[15], 9);
201 ROUND(ccc, ddd, eee, aaa, bbb, F3, KK3, in[5], 7);
202 ROUND(bbb, ccc, ddd, eee, aaa, F3, KK3, in[1], 15);
203 ROUND(aaa, bbb, ccc, ddd, eee, F3, KK3, in[3], 11);
204 ROUND(eee, aaa, bbb, ccc, ddd, F3, KK3, in[7], 8);
205 ROUND(ddd, eee, aaa, bbb, ccc, F3, KK3, in[14], 6);
206 ROUND(ccc, ddd, eee, aaa, bbb, F3, KK3, in[6], 6);
207 ROUND(bbb, ccc, ddd, eee, aaa, F3, KK3, in[9], 14);
208 ROUND(aaa, bbb, ccc, ddd, eee, F3, KK3, in[11], 12);
209 ROUND(eee, aaa, bbb, ccc, ddd, F3, KK3, in[8], 13);
210 ROUND(ddd, eee, aaa, bbb, ccc, F3, KK3, in[12], 5);
211 ROUND(ccc, ddd, eee, aaa, bbb, F3, KK3, in[2], 14);
212 ROUND(bbb, ccc, ddd, eee, aaa, F3, KK3, in[10], 13);
213 ROUND(aaa, bbb, ccc, ddd, eee, F3, KK3, in[0], 13);
214 ROUND(eee, aaa, bbb, ccc, ddd, F3, KK3, in[4], 7);
215 ROUND(ddd, eee, aaa, bbb, ccc, F3, KK3, in[13], 5);
216
217 /* round 4: right lane */
218 ROUND(ccc, ddd, eee, aaa, bbb, F2, KK4, in[8], 15);
219 ROUND(bbb, ccc, ddd, eee, aaa, F2, KK4, in[6], 5);
220 ROUND(aaa, bbb, ccc, ddd, eee, F2, KK4, in[4], 8);
221 ROUND(eee, aaa, bbb, ccc, ddd, F2, KK4, in[1], 11);
222 ROUND(ddd, eee, aaa, bbb, ccc, F2, KK4, in[3], 14);
223 ROUND(ccc, ddd, eee, aaa, bbb, F2, KK4, in[11], 14);
224 ROUND(bbb, ccc, ddd, eee, aaa, F2, KK4, in[15], 6);
225 ROUND(aaa, bbb, ccc, ddd, eee, F2, KK4, in[0], 14);
226 ROUND(eee, aaa, bbb, ccc, ddd, F2, KK4, in[5], 6);
227 ROUND(ddd, eee, aaa, bbb, ccc, F2, KK4, in[12], 9);
228 ROUND(ccc, ddd, eee, aaa, bbb, F2, KK4, in[2], 12);
229 ROUND(bbb, ccc, ddd, eee, aaa, F2, KK4, in[13], 9);
230 ROUND(aaa, bbb, ccc, ddd, eee, F2, KK4, in[9], 12);
231 ROUND(eee, aaa, bbb, ccc, ddd, F2, KK4, in[7], 5);
232 ROUND(ddd, eee, aaa, bbb, ccc, F2, KK4, in[10], 15);
233 ROUND(ccc, ddd, eee, aaa, bbb, F2, KK4, in[14], 8);
234
235 /* round 5: right lane */
236 ROUND(bbb, ccc, ddd, eee, aaa, F1, KK5, in[12], 8);
237 ROUND(aaa, bbb, ccc, ddd, eee, F1, KK5, in[15], 5);
238 ROUND(eee, aaa, bbb, ccc, ddd, F1, KK5, in[10], 12);
239 ROUND(ddd, eee, aaa, bbb, ccc, F1, KK5, in[4], 9);
240 ROUND(ccc, ddd, eee, aaa, bbb, F1, KK5, in[1], 12);
241 ROUND(bbb, ccc, ddd, eee, aaa, F1, KK5, in[5], 5);
242 ROUND(aaa, bbb, ccc, ddd, eee, F1, KK5, in[8], 14);
243 ROUND(eee, aaa, bbb, ccc, ddd, F1, KK5, in[7], 6);
244 ROUND(ddd, eee, aaa, bbb, ccc, F1, KK5, in[6], 8);
245 ROUND(ccc, ddd, eee, aaa, bbb, F1, KK5, in[2], 13);
246 ROUND(bbb, ccc, ddd, eee, aaa, F1, KK5, in[13], 6);
247 ROUND(aaa, bbb, ccc, ddd, eee, F1, KK5, in[14], 5);
248 ROUND(eee, aaa, bbb, ccc, ddd, F1, KK5, in[0], 15);
249 ROUND(ddd, eee, aaa, bbb, ccc, F1, KK5, in[3], 13);
250 ROUND(ccc, ddd, eee, aaa, bbb, F1, KK5, in[9], 11);
251 ROUND(bbb, ccc, ddd, eee, aaa, F1, KK5, in[11], 11);
252
253 /* combine results */
254 ddd += cc + state[1]; /* final result for state[0] */
255 state[1] = state[2] + dd + eee;
256 state[2] = state[3] + ee + aaa;
257 state[3] = state[4] + aa + bbb;
258 state[4] = state[0] + bb + ccc;
259 state[0] = ddd;
260
261 return;
262}
263
264static void rmd160_init(struct crypto_tfm *tfm)
265{
266 struct rmd160_ctx *rctx = crypto_tfm_ctx(tfm);
267
268 rctx->byte_count = 0;
269
270 rctx->state[0] = RMD_H0;
271 rctx->state[1] = RMD_H1;
272 rctx->state[2] = RMD_H2;
273 rctx->state[3] = RMD_H3;
274 rctx->state[4] = RMD_H4;
275
276 memset(rctx->buffer, 0, sizeof(rctx->buffer));
277}
278
279static void rmd160_update(struct crypto_tfm *tfm, const u8 *data,
280 unsigned int len)
281{
282 struct rmd160_ctx *rctx = crypto_tfm_ctx(tfm);
283 const u32 avail = sizeof(rctx->buffer) - (rctx->byte_count & 0x3f);
284
285 rctx->byte_count += len;
286
287 /* Enough space in buffer? If so copy and we're done */
288 if (avail > len) {
289 memcpy((char *)rctx->buffer + (sizeof(rctx->buffer) - avail),
290 data, len);
291 return;
292 }
293
294 memcpy((char *)rctx->buffer + (sizeof(rctx->buffer) - avail),
295 data, avail);
296
297 rmd160_transform(rctx->state, rctx->buffer);
298 data += avail;
299 len -= avail;
300
301 while (len >= sizeof(rctx->buffer)) {
302 memcpy(rctx->buffer, data, sizeof(rctx->buffer));
303 rmd160_transform(rctx->state, rctx->buffer);
304 data += sizeof(rctx->buffer);
305 len -= sizeof(rctx->buffer);
306 }
307
308 memcpy(rctx->buffer, data, len);
309}
310
311/* Add padding and return the message digest. */
312static void rmd160_final(struct crypto_tfm *tfm, u8 *out)
313{
314 struct rmd160_ctx *rctx = crypto_tfm_ctx(tfm);
315 u32 i, index, padlen;
316 __le64 bits;
317 __le32 *dst = (__le32 *)out;
318 static const u8 padding[64] = { 0x80, };
319
320 bits = cpu_to_le64(rctx->byte_count << 3);
321
322 /* Pad out to 56 mod 64 */
323 index = rctx->byte_count & 0x3f;
324 padlen = (index < 56) ? (56 - index) : ((64+56) - index);
325 rmd160_update(tfm, padding, padlen);
326
327 /* Append length */
328 rmd160_update(tfm, (const u8 *)&bits, sizeof(bits));
329
330 /* Store state in digest */
331 for (i = 0; i < 5; i++)
332 dst[i] = cpu_to_le32p(&rctx->state[i]);
333
334 /* Wipe context */
335 memset(rctx, 0, sizeof(*rctx));
336}
337
338static struct crypto_alg alg = {
339 .cra_name = "rmd160",
340 .cra_driver_name = "rmd160",
341 .cra_flags = CRYPTO_ALG_TYPE_DIGEST,
342 .cra_blocksize = RMD160_BLOCK_SIZE,
343 .cra_ctxsize = sizeof(struct rmd160_ctx),
344 .cra_module = THIS_MODULE,
345 .cra_list = LIST_HEAD_INIT(alg.cra_list),
346 .cra_u = { .digest = {
347 .dia_digestsize = RMD160_DIGEST_SIZE,
348 .dia_init = rmd160_init,
349 .dia_update = rmd160_update,
350 .dia_final = rmd160_final } }
351};
352
353static int __init rmd160_mod_init(void)
354{
355 return crypto_register_alg(&alg);
356}
357
358static void __exit rmd160_mod_fini(void)
359{
360 crypto_unregister_alg(&alg);
361}
362
363module_init(rmd160_mod_init);
364module_exit(rmd160_mod_fini);
365
366MODULE_LICENSE("GPL");
367MODULE_DESCRIPTION("RIPEMD-160 Message Digest");
368
369MODULE_ALIAS("rmd160");
diff --git a/crypto/rmd256.c b/crypto/rmd256.c
new file mode 100644
index 000000000000..e3de5b4cb47f
--- /dev/null
+++ b/crypto/rmd256.c
@@ -0,0 +1,344 @@
1/*
2 * Cryptographic API.
3 *
4 * RIPEMD-256 - RACE Integrity Primitives Evaluation Message Digest.
5 *
6 * Based on the reference implementation by Antoon Bosselaers, ESAT-COSIC
7 *
8 * Copyright (c) 2008 Adrian-Ken Rueegsegger <rueegsegger (at) swiss-it.ch>
9 *
10 * 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 * Software Foundation; either version 2 of the License, or (at your option)
13 * any later version.
14 *
15 */
16#include <linux/init.h>
17#include <linux/module.h>
18#include <linux/mm.h>
19#include <linux/crypto.h>
20#include <linux/cryptohash.h>
21#include <linux/types.h>
22#include <asm/byteorder.h>
23
24#include "ripemd.h"
25
26struct rmd256_ctx {
27 u64 byte_count;
28 u32 state[8];
29 __le32 buffer[16];
30};
31
32#define K1 RMD_K1
33#define K2 RMD_K2
34#define K3 RMD_K3
35#define K4 RMD_K4
36#define KK1 RMD_K6
37#define KK2 RMD_K7
38#define KK3 RMD_K8
39#define KK4 RMD_K1
40
41#define F1(x, y, z) (x ^ y ^ z) /* XOR */
42#define F2(x, y, z) (z ^ (x & (y ^ z))) /* x ? y : z */
43#define F3(x, y, z) ((x | ~y) ^ z)
44#define F4(x, y, z) (y ^ (z & (x ^ y))) /* z ? x : y */
45
46#define ROUND(a, b, c, d, f, k, x, s) { \
47 (a) += f((b), (c), (d)) + le32_to_cpup(&(x)) + (k); \
48 (a) = rol32((a), (s)); \
49}
50
51static void rmd256_transform(u32 *state, const __le32 *in)
52{
53 u32 aa, bb, cc, dd, aaa, bbb, ccc, ddd, tmp;
54
55 /* Initialize left lane */
56 aa = state[0];
57 bb = state[1];
58 cc = state[2];
59 dd = state[3];
60
61 /* Initialize right lane */
62 aaa = state[4];
63 bbb = state[5];
64 ccc = state[6];
65 ddd = state[7];
66
67 /* round 1: left lane */
68 ROUND(aa, bb, cc, dd, F1, K1, in[0], 11);
69 ROUND(dd, aa, bb, cc, F1, K1, in[1], 14);
70 ROUND(cc, dd, aa, bb, F1, K1, in[2], 15);
71 ROUND(bb, cc, dd, aa, F1, K1, in[3], 12);
72 ROUND(aa, bb, cc, dd, F1, K1, in[4], 5);
73 ROUND(dd, aa, bb, cc, F1, K1, in[5], 8);
74 ROUND(cc, dd, aa, bb, F1, K1, in[6], 7);
75 ROUND(bb, cc, dd, aa, F1, K1, in[7], 9);
76 ROUND(aa, bb, cc, dd, F1, K1, in[8], 11);
77 ROUND(dd, aa, bb, cc, F1, K1, in[9], 13);
78 ROUND(cc, dd, aa, bb, F1, K1, in[10], 14);
79 ROUND(bb, cc, dd, aa, F1, K1, in[11], 15);
80 ROUND(aa, bb, cc, dd, F1, K1, in[12], 6);
81 ROUND(dd, aa, bb, cc, F1, K1, in[13], 7);
82 ROUND(cc, dd, aa, bb, F1, K1, in[14], 9);
83 ROUND(bb, cc, dd, aa, F1, K1, in[15], 8);
84
85 /* round 1: right lane */
86 ROUND(aaa, bbb, ccc, ddd, F4, KK1, in[5], 8);
87 ROUND(ddd, aaa, bbb, ccc, F4, KK1, in[14], 9);
88 ROUND(ccc, ddd, aaa, bbb, F4, KK1, in[7], 9);
89 ROUND(bbb, ccc, ddd, aaa, F4, KK1, in[0], 11);
90 ROUND(aaa, bbb, ccc, ddd, F4, KK1, in[9], 13);
91 ROUND(ddd, aaa, bbb, ccc, F4, KK1, in[2], 15);
92 ROUND(ccc, ddd, aaa, bbb, F4, KK1, in[11], 15);
93 ROUND(bbb, ccc, ddd, aaa, F4, KK1, in[4], 5);
94 ROUND(aaa, bbb, ccc, ddd, F4, KK1, in[13], 7);
95 ROUND(ddd, aaa, bbb, ccc, F4, KK1, in[6], 7);
96 ROUND(ccc, ddd, aaa, bbb, F4, KK1, in[15], 8);
97 ROUND(bbb, ccc, ddd, aaa, F4, KK1, in[8], 11);
98 ROUND(aaa, bbb, ccc, ddd, F4, KK1, in[1], 14);
99 ROUND(ddd, aaa, bbb, ccc, F4, KK1, in[10], 14);
100 ROUND(ccc, ddd, aaa, bbb, F4, KK1, in[3], 12);
101 ROUND(bbb, ccc, ddd, aaa, F4, KK1, in[12], 6);
102
103 /* Swap contents of "a" registers */
104 tmp = aa; aa = aaa; aaa = tmp;
105
106 /* round 2: left lane */
107 ROUND(aa, bb, cc, dd, F2, K2, in[7], 7);
108 ROUND(dd, aa, bb, cc, F2, K2, in[4], 6);
109 ROUND(cc, dd, aa, bb, F2, K2, in[13], 8);
110 ROUND(bb, cc, dd, aa, F2, K2, in[1], 13);
111 ROUND(aa, bb, cc, dd, F2, K2, in[10], 11);
112 ROUND(dd, aa, bb, cc, F2, K2, in[6], 9);
113 ROUND(cc, dd, aa, bb, F2, K2, in[15], 7);
114 ROUND(bb, cc, dd, aa, F2, K2, in[3], 15);
115 ROUND(aa, bb, cc, dd, F2, K2, in[12], 7);
116 ROUND(dd, aa, bb, cc, F2, K2, in[0], 12);
117 ROUND(cc, dd, aa, bb, F2, K2, in[9], 15);
118 ROUND(bb, cc, dd, aa, F2, K2, in[5], 9);
119 ROUND(aa, bb, cc, dd, F2, K2, in[2], 11);
120 ROUND(dd, aa, bb, cc, F2, K2, in[14], 7);
121 ROUND(cc, dd, aa, bb, F2, K2, in[11], 13);
122 ROUND(bb, cc, dd, aa, F2, K2, in[8], 12);
123
124 /* round 2: right lane */
125 ROUND(aaa, bbb, ccc, ddd, F3, KK2, in[6], 9);
126 ROUND(ddd, aaa, bbb, ccc, F3, KK2, in[11], 13);
127 ROUND(ccc, ddd, aaa, bbb, F3, KK2, in[3], 15);
128 ROUND(bbb, ccc, ddd, aaa, F3, KK2, in[7], 7);
129 ROUND(aaa, bbb, ccc, ddd, F3, KK2, in[0], 12);
130 ROUND(ddd, aaa, bbb, ccc, F3, KK2, in[13], 8);
131 ROUND(ccc, ddd, aaa, bbb, F3, KK2, in[5], 9);
132 ROUND(bbb, ccc, ddd, aaa, F3, KK2, in[10], 11);
133 ROUND(aaa, bbb, ccc, ddd, F3, KK2, in[14], 7);
134 ROUND(ddd, aaa, bbb, ccc, F3, KK2, in[15], 7);
135 ROUND(ccc, ddd, aaa, bbb, F3, KK2, in[8], 12);
136 ROUND(bbb, ccc, ddd, aaa, F3, KK2, in[12], 7);
137 ROUND(aaa, bbb, ccc, ddd, F3, KK2, in[4], 6);
138 ROUND(ddd, aaa, bbb, ccc, F3, KK2, in[9], 15);
139 ROUND(ccc, ddd, aaa, bbb, F3, KK2, in[1], 13);
140 ROUND(bbb, ccc, ddd, aaa, F3, KK2, in[2], 11);
141
142 /* Swap contents of "b" registers */
143 tmp = bb; bb = bbb; bbb = tmp;
144
145 /* round 3: left lane */
146 ROUND(aa, bb, cc, dd, F3, K3, in[3], 11);
147 ROUND(dd, aa, bb, cc, F3, K3, in[10], 13);
148 ROUND(cc, dd, aa, bb, F3, K3, in[14], 6);
149 ROUND(bb, cc, dd, aa, F3, K3, in[4], 7);
150 ROUND(aa, bb, cc, dd, F3, K3, in[9], 14);
151 ROUND(dd, aa, bb, cc, F3, K3, in[15], 9);
152 ROUND(cc, dd, aa, bb, F3, K3, in[8], 13);
153 ROUND(bb, cc, dd, aa, F3, K3, in[1], 15);
154 ROUND(aa, bb, cc, dd, F3, K3, in[2], 14);
155 ROUND(dd, aa, bb, cc, F3, K3, in[7], 8);
156 ROUND(cc, dd, aa, bb, F3, K3, in[0], 13);
157 ROUND(bb, cc, dd, aa, F3, K3, in[6], 6);
158 ROUND(aa, bb, cc, dd, F3, K3, in[13], 5);
159 ROUND(dd, aa, bb, cc, F3, K3, in[11], 12);
160 ROUND(cc, dd, aa, bb, F3, K3, in[5], 7);
161 ROUND(bb, cc, dd, aa, F3, K3, in[12], 5);
162
163 /* round 3: right lane */
164 ROUND(aaa, bbb, ccc, ddd, F2, KK3, in[15], 9);
165 ROUND(ddd, aaa, bbb, ccc, F2, KK3, in[5], 7);
166 ROUND(ccc, ddd, aaa, bbb, F2, KK3, in[1], 15);
167 ROUND(bbb, ccc, ddd, aaa, F2, KK3, in[3], 11);
168 ROUND(aaa, bbb, ccc, ddd, F2, KK3, in[7], 8);
169 ROUND(ddd, aaa, bbb, ccc, F2, KK3, in[14], 6);
170 ROUND(ccc, ddd, aaa, bbb, F2, KK3, in[6], 6);
171 ROUND(bbb, ccc, ddd, aaa, F2, KK3, in[9], 14);
172 ROUND(aaa, bbb, ccc, ddd, F2, KK3, in[11], 12);
173 ROUND(ddd, aaa, bbb, ccc, F2, KK3, in[8], 13);
174 ROUND(ccc, ddd, aaa, bbb, F2, KK3, in[12], 5);
175 ROUND(bbb, ccc, ddd, aaa, F2, KK3, in[2], 14);
176 ROUND(aaa, bbb, ccc, ddd, F2, KK3, in[10], 13);
177 ROUND(ddd, aaa, bbb, ccc, F2, KK3, in[0], 13);
178 ROUND(ccc, ddd, aaa, bbb, F2, KK3, in[4], 7);
179 ROUND(bbb, ccc, ddd, aaa, F2, KK3, in[13], 5);
180
181 /* Swap contents of "c" registers */
182 tmp = cc; cc = ccc; ccc = tmp;
183
184 /* round 4: left lane */
185 ROUND(aa, bb, cc, dd, F4, K4, in[1], 11);
186 ROUND(dd, aa, bb, cc, F4, K4, in[9], 12);
187 ROUND(cc, dd, aa, bb, F4, K4, in[11], 14);
188 ROUND(bb, cc, dd, aa, F4, K4, in[10], 15);
189 ROUND(aa, bb, cc, dd, F4, K4, in[0], 14);
190 ROUND(dd, aa, bb, cc, F4, K4, in[8], 15);
191 ROUND(cc, dd, aa, bb, F4, K4, in[12], 9);
192 ROUND(bb, cc, dd, aa, F4, K4, in[4], 8);
193 ROUND(aa, bb, cc, dd, F4, K4, in[13], 9);
194 ROUND(dd, aa, bb, cc, F4, K4, in[3], 14);
195 ROUND(cc, dd, aa, bb, F4, K4, in[7], 5);
196 ROUND(bb, cc, dd, aa, F4, K4, in[15], 6);
197 ROUND(aa, bb, cc, dd, F4, K4, in[14], 8);
198 ROUND(dd, aa, bb, cc, F4, K4, in[5], 6);
199 ROUND(cc, dd, aa, bb, F4, K4, in[6], 5);
200 ROUND(bb, cc, dd, aa, F4, K4, in[2], 12);
201
202 /* round 4: right lane */
203 ROUND(aaa, bbb, ccc, ddd, F1, KK4, in[8], 15);
204 ROUND(ddd, aaa, bbb, ccc, F1, KK4, in[6], 5);
205 ROUND(ccc, ddd, aaa, bbb, F1, KK4, in[4], 8);
206 ROUND(bbb, ccc, ddd, aaa, F1, KK4, in[1], 11);
207 ROUND(aaa, bbb, ccc, ddd, F1, KK4, in[3], 14);
208 ROUND(ddd, aaa, bbb, ccc, F1, KK4, in[11], 14);
209 ROUND(ccc, ddd, aaa, bbb, F1, KK4, in[15], 6);
210 ROUND(bbb, ccc, ddd, aaa, F1, KK4, in[0], 14);
211 ROUND(aaa, bbb, ccc, ddd, F1, KK4, in[5], 6);
212 ROUND(ddd, aaa, bbb, ccc, F1, KK4, in[12], 9);
213 ROUND(ccc, ddd, aaa, bbb, F1, KK4, in[2], 12);
214 ROUND(bbb, ccc, ddd, aaa, F1, KK4, in[13], 9);
215 ROUND(aaa, bbb, ccc, ddd, F1, KK4, in[9], 12);
216 ROUND(ddd, aaa, bbb, ccc, F1, KK4, in[7], 5);
217 ROUND(ccc, ddd, aaa, bbb, F1, KK4, in[10], 15);
218 ROUND(bbb, ccc, ddd, aaa, F1, KK4, in[14], 8);
219
220 /* Swap contents of "d" registers */
221 tmp = dd; dd = ddd; ddd = tmp;
222
223 /* combine results */
224 state[0] += aa;
225 state[1] += bb;
226 state[2] += cc;
227 state[3] += dd;
228 state[4] += aaa;
229 state[5] += bbb;
230 state[6] += ccc;
231 state[7] += ddd;
232
233 return;
234}
235
236static void rmd256_init(struct crypto_tfm *tfm)
237{
238 struct rmd256_ctx *rctx = crypto_tfm_ctx(tfm);
239
240 rctx->byte_count = 0;
241
242 rctx->state[0] = RMD_H0;
243 rctx->state[1] = RMD_H1;
244 rctx->state[2] = RMD_H2;
245 rctx->state[3] = RMD_H3;
246 rctx->state[4] = RMD_H5;
247 rctx->state[5] = RMD_H6;
248 rctx->state[6] = RMD_H7;
249 rctx->state[7] = RMD_H8;
250
251 memset(rctx->buffer, 0, sizeof(rctx->buffer));
252}
253
254static void rmd256_update(struct crypto_tfm *tfm, const u8 *data,
255 unsigned int len)
256{
257 struct rmd256_ctx *rctx = crypto_tfm_ctx(tfm);
258 const u32 avail = sizeof(rctx->buffer) - (rctx->byte_count & 0x3f);
259
260 rctx->byte_count += len;
261
262 /* Enough space in buffer? If so copy and we're done */
263 if (avail > len) {
264 memcpy((char *)rctx->buffer + (sizeof(rctx->buffer) - avail),
265 data, len);
266 return;
267 }
268
269 memcpy((char *)rctx->buffer + (sizeof(rctx->buffer) - avail),
270 data, avail);
271
272 rmd256_transform(rctx->state, rctx->buffer);
273 data += avail;
274 len -= avail;
275
276 while (len >= sizeof(rctx->buffer)) {
277 memcpy(rctx->buffer, data, sizeof(rctx->buffer));
278 rmd256_transform(rctx->state, rctx->buffer);
279 data += sizeof(rctx->buffer);
280 len -= sizeof(rctx->buffer);
281 }
282
283 memcpy(rctx->buffer, data, len);
284}
285
286/* Add padding and return the message digest. */
287static void rmd256_final(struct crypto_tfm *tfm, u8 *out)
288{
289 struct rmd256_ctx *rctx = crypto_tfm_ctx(tfm);
290 u32 i, index, padlen;
291 __le64 bits;
292 __le32 *dst = (__le32 *)out;
293 static const u8 padding[64] = { 0x80, };
294
295 bits = cpu_to_le64(rctx->byte_count << 3);
296
297 /* Pad out to 56 mod 64 */
298 index = rctx->byte_count & 0x3f;
299 padlen = (index < 56) ? (56 - index) : ((64+56) - index);
300 rmd256_update(tfm, padding, padlen);
301
302 /* Append length */
303 rmd256_update(tfm, (const u8 *)&bits, sizeof(bits));
304
305 /* Store state in digest */
306 for (i = 0; i < 8; i++)
307 dst[i] = cpu_to_le32p(&rctx->state[i]);
308
309 /* Wipe context */
310 memset(rctx, 0, sizeof(*rctx));
311}
312
313static struct crypto_alg alg = {
314 .cra_name = "rmd256",
315 .cra_driver_name = "rmd256",
316 .cra_flags = CRYPTO_ALG_TYPE_DIGEST,
317 .cra_blocksize = RMD256_BLOCK_SIZE,
318 .cra_ctxsize = sizeof(struct rmd256_ctx),
319 .cra_module = THIS_MODULE,
320 .cra_list = LIST_HEAD_INIT(alg.cra_list),
321 .cra_u = { .digest = {
322 .dia_digestsize = RMD256_DIGEST_SIZE,
323 .dia_init = rmd256_init,
324 .dia_update = rmd256_update,
325 .dia_final = rmd256_final } }
326};
327
328static int __init rmd256_mod_init(void)
329{
330 return crypto_register_alg(&alg);
331}
332
333static void __exit rmd256_mod_fini(void)
334{
335 crypto_unregister_alg(&alg);
336}
337
338module_init(rmd256_mod_init);
339module_exit(rmd256_mod_fini);
340
341MODULE_LICENSE("GPL");
342MODULE_DESCRIPTION("RIPEMD-256 Message Digest");
343
344MODULE_ALIAS("rmd256");
diff --git a/crypto/rmd320.c b/crypto/rmd320.c
new file mode 100644
index 000000000000..b143d66e42c8
--- /dev/null
+++ b/crypto/rmd320.c
@@ -0,0 +1,393 @@
1/*
2 * Cryptographic API.
3 *
4 * RIPEMD-320 - RACE Integrity Primitives Evaluation Message Digest.
5 *
6 * Based on the reference implementation by Antoon Bosselaers, ESAT-COSIC
7 *
8 * Copyright (c) 2008 Adrian-Ken Rueegsegger <rueegsegger (at) swiss-it.ch>
9 *
10 * 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 * Software Foundation; either version 2 of the License, or (at your option)
13 * any later version.
14 *
15 */
16#include <linux/init.h>
17#include <linux/module.h>
18#include <linux/mm.h>
19#include <linux/crypto.h>
20#include <linux/cryptohash.h>
21#include <linux/types.h>
22#include <asm/byteorder.h>
23
24#include "ripemd.h"
25
26struct rmd320_ctx {
27 u64 byte_count;
28 u32 state[10];
29 __le32 buffer[16];
30};
31
32#define K1 RMD_K1
33#define K2 RMD_K2
34#define K3 RMD_K3
35#define K4 RMD_K4
36#define K5 RMD_K5
37#define KK1 RMD_K6
38#define KK2 RMD_K7
39#define KK3 RMD_K8
40#define KK4 RMD_K9
41#define KK5 RMD_K1
42
43#define F1(x, y, z) (x ^ y ^ z) /* XOR */
44#define F2(x, y, z) (z ^ (x & (y ^ z))) /* x ? y : z */
45#define F3(x, y, z) ((x | ~y) ^ z)
46#define F4(x, y, z) (y ^ (z & (x ^ y))) /* z ? x : y */
47#define F5(x, y, z) (x ^ (y | ~z))
48
49#define ROUND(a, b, c, d, e, f, k, x, s) { \
50 (a) += f((b), (c), (d)) + le32_to_cpup(&(x)) + (k); \
51 (a) = rol32((a), (s)) + (e); \
52 (c) = rol32((c), 10); \
53}
54
55static void rmd320_transform(u32 *state, const __le32 *in)
56{
57 u32 aa, bb, cc, dd, ee, aaa, bbb, ccc, ddd, eee, tmp;
58
59 /* Initialize left lane */
60 aa = state[0];
61 bb = state[1];
62 cc = state[2];
63 dd = state[3];
64 ee = state[4];
65
66 /* Initialize right lane */
67 aaa = state[5];
68 bbb = state[6];
69 ccc = state[7];
70 ddd = state[8];
71 eee = state[9];
72
73 /* round 1: left lane */
74 ROUND(aa, bb, cc, dd, ee, F1, K1, in[0], 11);
75 ROUND(ee, aa, bb, cc, dd, F1, K1, in[1], 14);
76 ROUND(dd, ee, aa, bb, cc, F1, K1, in[2], 15);
77 ROUND(cc, dd, ee, aa, bb, F1, K1, in[3], 12);
78 ROUND(bb, cc, dd, ee, aa, F1, K1, in[4], 5);
79 ROUND(aa, bb, cc, dd, ee, F1, K1, in[5], 8);
80 ROUND(ee, aa, bb, cc, dd, F1, K1, in[6], 7);
81 ROUND(dd, ee, aa, bb, cc, F1, K1, in[7], 9);
82 ROUND(cc, dd, ee, aa, bb, F1, K1, in[8], 11);
83 ROUND(bb, cc, dd, ee, aa, F1, K1, in[9], 13);
84 ROUND(aa, bb, cc, dd, ee, F1, K1, in[10], 14);
85 ROUND(ee, aa, bb, cc, dd, F1, K1, in[11], 15);
86 ROUND(dd, ee, aa, bb, cc, F1, K1, in[12], 6);
87 ROUND(cc, dd, ee, aa, bb, F1, K1, in[13], 7);
88 ROUND(bb, cc, dd, ee, aa, F1, K1, in[14], 9);
89 ROUND(aa, bb, cc, dd, ee, F1, K1, in[15], 8);
90
91 /* round 1: right lane */
92 ROUND(aaa, bbb, ccc, ddd, eee, F5, KK1, in[5], 8);
93 ROUND(eee, aaa, bbb, ccc, ddd, F5, KK1, in[14], 9);
94 ROUND(ddd, eee, aaa, bbb, ccc, F5, KK1, in[7], 9);
95 ROUND(ccc, ddd, eee, aaa, bbb, F5, KK1, in[0], 11);
96 ROUND(bbb, ccc, ddd, eee, aaa, F5, KK1, in[9], 13);
97 ROUND(aaa, bbb, ccc, ddd, eee, F5, KK1, in[2], 15);
98 ROUND(eee, aaa, bbb, ccc, ddd, F5, KK1, in[11], 15);
99 ROUND(ddd, eee, aaa, bbb, ccc, F5, KK1, in[4], 5);
100 ROUND(ccc, ddd, eee, aaa, bbb, F5, KK1, in[13], 7);
101 ROUND(bbb, ccc, ddd, eee, aaa, F5, KK1, in[6], 7);
102 ROUND(aaa, bbb, ccc, ddd, eee, F5, KK1, in[15], 8);
103 ROUND(eee, aaa, bbb, ccc, ddd, F5, KK1, in[8], 11);
104 ROUND(ddd, eee, aaa, bbb, ccc, F5, KK1, in[1], 14);
105 ROUND(ccc, ddd, eee, aaa, bbb, F5, KK1, in[10], 14);
106 ROUND(bbb, ccc, ddd, eee, aaa, F5, KK1, in[3], 12);
107 ROUND(aaa, bbb, ccc, ddd, eee, F5, KK1, in[12], 6);
108
109 /* Swap contents of "a" registers */
110 tmp = aa; aa = aaa; aaa = tmp;
111
112 /* round 2: left lane" */
113 ROUND(ee, aa, bb, cc, dd, F2, K2, in[7], 7);
114 ROUND(dd, ee, aa, bb, cc, F2, K2, in[4], 6);
115 ROUND(cc, dd, ee, aa, bb, F2, K2, in[13], 8);
116 ROUND(bb, cc, dd, ee, aa, F2, K2, in[1], 13);
117 ROUND(aa, bb, cc, dd, ee, F2, K2, in[10], 11);
118 ROUND(ee, aa, bb, cc, dd, F2, K2, in[6], 9);
119 ROUND(dd, ee, aa, bb, cc, F2, K2, in[15], 7);
120 ROUND(cc, dd, ee, aa, bb, F2, K2, in[3], 15);
121 ROUND(bb, cc, dd, ee, aa, F2, K2, in[12], 7);
122 ROUND(aa, bb, cc, dd, ee, F2, K2, in[0], 12);
123 ROUND(ee, aa, bb, cc, dd, F2, K2, in[9], 15);
124 ROUND(dd, ee, aa, bb, cc, F2, K2, in[5], 9);
125 ROUND(cc, dd, ee, aa, bb, F2, K2, in[2], 11);
126 ROUND(bb, cc, dd, ee, aa, F2, K2, in[14], 7);
127 ROUND(aa, bb, cc, dd, ee, F2, K2, in[11], 13);
128 ROUND(ee, aa, bb, cc, dd, F2, K2, in[8], 12);
129
130 /* round 2: right lane */
131 ROUND(eee, aaa, bbb, ccc, ddd, F4, KK2, in[6], 9);
132 ROUND(ddd, eee, aaa, bbb, ccc, F4, KK2, in[11], 13);
133 ROUND(ccc, ddd, eee, aaa, bbb, F4, KK2, in[3], 15);
134 ROUND(bbb, ccc, ddd, eee, aaa, F4, KK2, in[7], 7);
135 ROUND(aaa, bbb, ccc, ddd, eee, F4, KK2, in[0], 12);
136 ROUND(eee, aaa, bbb, ccc, ddd, F4, KK2, in[13], 8);
137 ROUND(ddd, eee, aaa, bbb, ccc, F4, KK2, in[5], 9);
138 ROUND(ccc, ddd, eee, aaa, bbb, F4, KK2, in[10], 11);
139 ROUND(bbb, ccc, ddd, eee, aaa, F4, KK2, in[14], 7);
140 ROUND(aaa, bbb, ccc, ddd, eee, F4, KK2, in[15], 7);
141 ROUND(eee, aaa, bbb, ccc, ddd, F4, KK2, in[8], 12);
142 ROUND(ddd, eee, aaa, bbb, ccc, F4, KK2, in[12], 7);
143 ROUND(ccc, ddd, eee, aaa, bbb, F4, KK2, in[4], 6);
144 ROUND(bbb, ccc, ddd, eee, aaa, F4, KK2, in[9], 15);
145 ROUND(aaa, bbb, ccc, ddd, eee, F4, KK2, in[1], 13);
146 ROUND(eee, aaa, bbb, ccc, ddd, F4, KK2, in[2], 11);
147
148 /* Swap contents of "b" registers */
149 tmp = bb; bb = bbb; bbb = tmp;
150
151 /* round 3: left lane" */
152 ROUND(dd, ee, aa, bb, cc, F3, K3, in[3], 11);
153 ROUND(cc, dd, ee, aa, bb, F3, K3, in[10], 13);
154 ROUND(bb, cc, dd, ee, aa, F3, K3, in[14], 6);
155 ROUND(aa, bb, cc, dd, ee, F3, K3, in[4], 7);
156 ROUND(ee, aa, bb, cc, dd, F3, K3, in[9], 14);
157 ROUND(dd, ee, aa, bb, cc, F3, K3, in[15], 9);
158 ROUND(cc, dd, ee, aa, bb, F3, K3, in[8], 13);
159 ROUND(bb, cc, dd, ee, aa, F3, K3, in[1], 15);
160 ROUND(aa, bb, cc, dd, ee, F3, K3, in[2], 14);
161 ROUND(ee, aa, bb, cc, dd, F3, K3, in[7], 8);
162 ROUND(dd, ee, aa, bb, cc, F3, K3, in[0], 13);
163 ROUND(cc, dd, ee, aa, bb, F3, K3, in[6], 6);
164 ROUND(bb, cc, dd, ee, aa, F3, K3, in[13], 5);
165 ROUND(aa, bb, cc, dd, ee, F3, K3, in[11], 12);
166 ROUND(ee, aa, bb, cc, dd, F3, K3, in[5], 7);
167 ROUND(dd, ee, aa, bb, cc, F3, K3, in[12], 5);
168
169 /* round 3: right lane */
170 ROUND(ddd, eee, aaa, bbb, ccc, F3, KK3, in[15], 9);
171 ROUND(ccc, ddd, eee, aaa, bbb, F3, KK3, in[5], 7);
172 ROUND(bbb, ccc, ddd, eee, aaa, F3, KK3, in[1], 15);
173 ROUND(aaa, bbb, ccc, ddd, eee, F3, KK3, in[3], 11);
174 ROUND(eee, aaa, bbb, ccc, ddd, F3, KK3, in[7], 8);
175 ROUND(ddd, eee, aaa, bbb, ccc, F3, KK3, in[14], 6);
176 ROUND(ccc, ddd, eee, aaa, bbb, F3, KK3, in[6], 6);
177 ROUND(bbb, ccc, ddd, eee, aaa, F3, KK3, in[9], 14);
178 ROUND(aaa, bbb, ccc, ddd, eee, F3, KK3, in[11], 12);
179 ROUND(eee, aaa, bbb, ccc, ddd, F3, KK3, in[8], 13);
180 ROUND(ddd, eee, aaa, bbb, ccc, F3, KK3, in[12], 5);
181 ROUND(ccc, ddd, eee, aaa, bbb, F3, KK3, in[2], 14);
182 ROUND(bbb, ccc, ddd, eee, aaa, F3, KK3, in[10], 13);
183 ROUND(aaa, bbb, ccc, ddd, eee, F3, KK3, in[0], 13);
184 ROUND(eee, aaa, bbb, ccc, ddd, F3, KK3, in[4], 7);
185 ROUND(ddd, eee, aaa, bbb, ccc, F3, KK3, in[13], 5);
186
187 /* Swap contents of "c" registers */
188 tmp = cc; cc = ccc; ccc = tmp;
189
190 /* round 4: left lane" */
191 ROUND(cc, dd, ee, aa, bb, F4, K4, in[1], 11);
192 ROUND(bb, cc, dd, ee, aa, F4, K4, in[9], 12);
193 ROUND(aa, bb, cc, dd, ee, F4, K4, in[11], 14);
194 ROUND(ee, aa, bb, cc, dd, F4, K4, in[10], 15);
195 ROUND(dd, ee, aa, bb, cc, F4, K4, in[0], 14);
196 ROUND(cc, dd, ee, aa, bb, F4, K4, in[8], 15);
197 ROUND(bb, cc, dd, ee, aa, F4, K4, in[12], 9);
198 ROUND(aa, bb, cc, dd, ee, F4, K4, in[4], 8);
199 ROUND(ee, aa, bb, cc, dd, F4, K4, in[13], 9);
200 ROUND(dd, ee, aa, bb, cc, F4, K4, in[3], 14);
201 ROUND(cc, dd, ee, aa, bb, F4, K4, in[7], 5);
202 ROUND(bb, cc, dd, ee, aa, F4, K4, in[15], 6);
203 ROUND(aa, bb, cc, dd, ee, F4, K4, in[14], 8);
204 ROUND(ee, aa, bb, cc, dd, F4, K4, in[5], 6);
205 ROUND(dd, ee, aa, bb, cc, F4, K4, in[6], 5);
206 ROUND(cc, dd, ee, aa, bb, F4, K4, in[2], 12);
207
208 /* round 4: right lane */
209 ROUND(ccc, ddd, eee, aaa, bbb, F2, KK4, in[8], 15);
210 ROUND(bbb, ccc, ddd, eee, aaa, F2, KK4, in[6], 5);
211 ROUND(aaa, bbb, ccc, ddd, eee, F2, KK4, in[4], 8);
212 ROUND(eee, aaa, bbb, ccc, ddd, F2, KK4, in[1], 11);
213 ROUND(ddd, eee, aaa, bbb, ccc, F2, KK4, in[3], 14);
214 ROUND(ccc, ddd, eee, aaa, bbb, F2, KK4, in[11], 14);
215 ROUND(bbb, ccc, ddd, eee, aaa, F2, KK4, in[15], 6);
216 ROUND(aaa, bbb, ccc, ddd, eee, F2, KK4, in[0], 14);
217 ROUND(eee, aaa, bbb, ccc, ddd, F2, KK4, in[5], 6);
218 ROUND(ddd, eee, aaa, bbb, ccc, F2, KK4, in[12], 9);
219 ROUND(ccc, ddd, eee, aaa, bbb, F2, KK4, in[2], 12);
220 ROUND(bbb, ccc, ddd, eee, aaa, F2, KK4, in[13], 9);
221 ROUND(aaa, bbb, ccc, ddd, eee, F2, KK4, in[9], 12);
222 ROUND(eee, aaa, bbb, ccc, ddd, F2, KK4, in[7], 5);
223 ROUND(ddd, eee, aaa, bbb, ccc, F2, KK4, in[10], 15);
224 ROUND(ccc, ddd, eee, aaa, bbb, F2, KK4, in[14], 8);
225
226 /* Swap contents of "d" registers */
227 tmp = dd; dd = ddd; ddd = tmp;
228
229 /* round 5: left lane" */
230 ROUND(bb, cc, dd, ee, aa, F5, K5, in[4], 9);
231 ROUND(aa, bb, cc, dd, ee, F5, K5, in[0], 15);
232 ROUND(ee, aa, bb, cc, dd, F5, K5, in[5], 5);
233 ROUND(dd, ee, aa, bb, cc, F5, K5, in[9], 11);
234 ROUND(cc, dd, ee, aa, bb, F5, K5, in[7], 6);
235 ROUND(bb, cc, dd, ee, aa, F5, K5, in[12], 8);
236 ROUND(aa, bb, cc, dd, ee, F5, K5, in[2], 13);
237 ROUND(ee, aa, bb, cc, dd, F5, K5, in[10], 12);
238 ROUND(dd, ee, aa, bb, cc, F5, K5, in[14], 5);
239 ROUND(cc, dd, ee, aa, bb, F5, K5, in[1], 12);
240 ROUND(bb, cc, dd, ee, aa, F5, K5, in[3], 13);
241 ROUND(aa, bb, cc, dd, ee, F5, K5, in[8], 14);
242 ROUND(ee, aa, bb, cc, dd, F5, K5, in[11], 11);
243 ROUND(dd, ee, aa, bb, cc, F5, K5, in[6], 8);
244 ROUND(cc, dd, ee, aa, bb, F5, K5, in[15], 5);
245 ROUND(bb, cc, dd, ee, aa, F5, K5, in[13], 6);
246
247 /* round 5: right lane */
248 ROUND(bbb, ccc, ddd, eee, aaa, F1, KK5, in[12], 8);
249 ROUND(aaa, bbb, ccc, ddd, eee, F1, KK5, in[15], 5);
250 ROUND(eee, aaa, bbb, ccc, ddd, F1, KK5, in[10], 12);
251 ROUND(ddd, eee, aaa, bbb, ccc, F1, KK5, in[4], 9);
252 ROUND(ccc, ddd, eee, aaa, bbb, F1, KK5, in[1], 12);
253 ROUND(bbb, ccc, ddd, eee, aaa, F1, KK5, in[5], 5);
254 ROUND(aaa, bbb, ccc, ddd, eee, F1, KK5, in[8], 14);
255 ROUND(eee, aaa, bbb, ccc, ddd, F1, KK5, in[7], 6);
256 ROUND(ddd, eee, aaa, bbb, ccc, F1, KK5, in[6], 8);
257 ROUND(ccc, ddd, eee, aaa, bbb, F1, KK5, in[2], 13);
258 ROUND(bbb, ccc, ddd, eee, aaa, F1, KK5, in[13], 6);
259 ROUND(aaa, bbb, ccc, ddd, eee, F1, KK5, in[14], 5);
260 ROUND(eee, aaa, bbb, ccc, ddd, F1, KK5, in[0], 15);
261 ROUND(ddd, eee, aaa, bbb, ccc, F1, KK5, in[3], 13);
262 ROUND(ccc, ddd, eee, aaa, bbb, F1, KK5, in[9], 11);
263 ROUND(bbb, ccc, ddd, eee, aaa, F1, KK5, in[11], 11);
264
265 /* Swap contents of "e" registers */
266 tmp = ee; ee = eee; eee = tmp;
267
268 /* combine results */
269 state[0] += aa;
270 state[1] += bb;
271 state[2] += cc;
272 state[3] += dd;
273 state[4] += ee;
274 state[5] += aaa;
275 state[6] += bbb;
276 state[7] += ccc;
277 state[8] += ddd;
278 state[9] += eee;
279
280 return;
281}
282
283static void rmd320_init(struct crypto_tfm *tfm)
284{
285 struct rmd320_ctx *rctx = crypto_tfm_ctx(tfm);
286
287 rctx->byte_count = 0;
288
289 rctx->state[0] = RMD_H0;
290 rctx->state[1] = RMD_H1;
291 rctx->state[2] = RMD_H2;
292 rctx->state[3] = RMD_H3;
293 rctx->state[4] = RMD_H4;
294 rctx->state[5] = RMD_H5;
295 rctx->state[6] = RMD_H6;
296 rctx->state[7] = RMD_H7;
297 rctx->state[8] = RMD_H8;
298 rctx->state[9] = RMD_H9;
299
300 memset(rctx->buffer, 0, sizeof(rctx->buffer));
301}
302
303static void rmd320_update(struct crypto_tfm *tfm, const u8 *data,
304 unsigned int len)
305{
306 struct rmd320_ctx *rctx = crypto_tfm_ctx(tfm);
307 const u32 avail = sizeof(rctx->buffer) - (rctx->byte_count & 0x3f);
308
309 rctx->byte_count += len;
310
311 /* Enough space in buffer? If so copy and we're done */
312 if (avail > len) {
313 memcpy((char *)rctx->buffer + (sizeof(rctx->buffer) - avail),
314 data, len);
315 return;
316 }
317
318 memcpy((char *)rctx->buffer + (sizeof(rctx->buffer) - avail),
319 data, avail);
320
321 rmd320_transform(rctx->state, rctx->buffer);
322 data += avail;
323 len -= avail;
324
325 while (len >= sizeof(rctx->buffer)) {
326 memcpy(rctx->buffer, data, sizeof(rctx->buffer));
327 rmd320_transform(rctx->state, rctx->buffer);
328 data += sizeof(rctx->buffer);
329 len -= sizeof(rctx->buffer);
330 }
331
332 memcpy(rctx->buffer, data, len);
333}
334
335/* Add padding and return the message digest. */
336static void rmd320_final(struct crypto_tfm *tfm, u8 *out)
337{
338 struct rmd320_ctx *rctx = crypto_tfm_ctx(tfm);
339 u32 i, index, padlen;
340 __le64 bits;
341 __le32 *dst = (__le32 *)out;
342 static const u8 padding[64] = { 0x80, };
343
344 bits = cpu_to_le64(rctx->byte_count << 3);
345
346 /* Pad out to 56 mod 64 */
347 index = rctx->byte_count & 0x3f;
348 padlen = (index < 56) ? (56 - index) : ((64+56) - index);
349 rmd320_update(tfm, padding, padlen);
350
351 /* Append length */
352 rmd320_update(tfm, (const u8 *)&bits, sizeof(bits));
353
354 /* Store state in digest */
355 for (i = 0; i < 10; i++)
356 dst[i] = cpu_to_le32p(&rctx->state[i]);
357
358 /* Wipe context */
359 memset(rctx, 0, sizeof(*rctx));
360}
361
362static struct crypto_alg alg = {
363 .cra_name = "rmd320",
364 .cra_driver_name = "rmd320",
365 .cra_flags = CRYPTO_ALG_TYPE_DIGEST,
366 .cra_blocksize = RMD320_BLOCK_SIZE,
367 .cra_ctxsize = sizeof(struct rmd320_ctx),
368 .cra_module = THIS_MODULE,
369 .cra_list = LIST_HEAD_INIT(alg.cra_list),
370 .cra_u = { .digest = {
371 .dia_digestsize = RMD320_DIGEST_SIZE,
372 .dia_init = rmd320_init,
373 .dia_update = rmd320_update,
374 .dia_final = rmd320_final } }
375};
376
377static int __init rmd320_mod_init(void)
378{
379 return crypto_register_alg(&alg);
380}
381
382static void __exit rmd320_mod_fini(void)
383{
384 crypto_unregister_alg(&alg);
385}
386
387module_init(rmd320_mod_init);
388module_exit(rmd320_mod_fini);
389
390MODULE_LICENSE("GPL");
391MODULE_DESCRIPTION("RIPEMD-320 Message Digest");
392
393MODULE_ALIAS("rmd320");
diff --git a/crypto/rng.c b/crypto/rng.c
new file mode 100644
index 000000000000..6e94bc735578
--- /dev/null
+++ b/crypto/rng.c
@@ -0,0 +1,126 @@
1/*
2 * Cryptographic API.
3 *
4 * RNG operations.
5 *
6 * Copyright (c) 2008 Neil Horman <nhorman@tuxdriver.com>
7 *
8 * 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 * Software Foundation; either version 2 of the License, or (at your option)
11 * any later version.
12 *
13 */
14
15#include <asm/atomic.h>
16#include <crypto/internal/rng.h>
17#include <linux/err.h>
18#include <linux/module.h>
19#include <linux/mutex.h>
20#include <linux/random.h>
21#include <linux/seq_file.h>
22#include <linux/string.h>
23
24static DEFINE_MUTEX(crypto_default_rng_lock);
25struct crypto_rng *crypto_default_rng;
26EXPORT_SYMBOL_GPL(crypto_default_rng);
27static int crypto_default_rng_refcnt;
28
29static int rngapi_reset(struct crypto_rng *tfm, u8 *seed, unsigned int slen)
30{
31 u8 *buf = NULL;
32 int err;
33
34 if (!seed && slen) {
35 buf = kmalloc(slen, GFP_KERNEL);
36 if (!buf)
37 return -ENOMEM;
38
39 get_random_bytes(buf, slen);
40 seed = buf;
41 }
42
43 err = crypto_rng_alg(tfm)->rng_reset(tfm, seed, slen);
44
45 kfree(buf);
46 return err;
47}
48
49static int crypto_init_rng_ops(struct crypto_tfm *tfm, u32 type, u32 mask)
50{
51 struct rng_alg *alg = &tfm->__crt_alg->cra_rng;
52 struct rng_tfm *ops = &tfm->crt_rng;
53
54 ops->rng_gen_random = alg->rng_make_random;
55 ops->rng_reset = rngapi_reset;
56
57 return 0;
58}
59
60static void crypto_rng_show(struct seq_file *m, struct crypto_alg *alg)
61 __attribute__ ((unused));
62static void crypto_rng_show(struct seq_file *m, struct crypto_alg *alg)
63{
64 seq_printf(m, "type : rng\n");
65 seq_printf(m, "seedsize : %u\n", alg->cra_rng.seedsize);
66}
67
68static unsigned int crypto_rng_ctxsize(struct crypto_alg *alg, u32 type,
69 u32 mask)
70{
71 return alg->cra_ctxsize;
72}
73
74const struct crypto_type crypto_rng_type = {
75 .ctxsize = crypto_rng_ctxsize,
76 .init = crypto_init_rng_ops,
77#ifdef CONFIG_PROC_FS
78 .show = crypto_rng_show,
79#endif
80};
81EXPORT_SYMBOL_GPL(crypto_rng_type);
82
83int crypto_get_default_rng(void)
84{
85 struct crypto_rng *rng;
86 int err;
87
88 mutex_lock(&crypto_default_rng_lock);
89 if (!crypto_default_rng) {
90 rng = crypto_alloc_rng("stdrng", 0, 0);
91 err = PTR_ERR(rng);
92 if (IS_ERR(rng))
93 goto unlock;
94
95 err = crypto_rng_reset(rng, NULL, crypto_rng_seedsize(rng));
96 if (err) {
97 crypto_free_rng(rng);
98 goto unlock;
99 }
100
101 crypto_default_rng = rng;
102 }
103
104 crypto_default_rng_refcnt++;
105 err = 0;
106
107unlock:
108 mutex_unlock(&crypto_default_rng_lock);
109
110 return err;
111}
112EXPORT_SYMBOL_GPL(crypto_get_default_rng);
113
114void crypto_put_default_rng(void)
115{
116 mutex_lock(&crypto_default_rng_lock);
117 if (!--crypto_default_rng_refcnt) {
118 crypto_free_rng(crypto_default_rng);
119 crypto_default_rng = NULL;
120 }
121 mutex_unlock(&crypto_default_rng_lock);
122}
123EXPORT_SYMBOL_GPL(crypto_put_default_rng);
124
125MODULE_LICENSE("GPL");
126MODULE_DESCRIPTION("Random Number Genertor");
diff --git a/crypto/seqiv.c b/crypto/seqiv.c
index b903aab31577..5a013a8bf87a 100644
--- a/crypto/seqiv.c
+++ b/crypto/seqiv.c
@@ -15,11 +15,11 @@
15 15
16#include <crypto/internal/aead.h> 16#include <crypto/internal/aead.h>
17#include <crypto/internal/skcipher.h> 17#include <crypto/internal/skcipher.h>
18#include <crypto/rng.h>
18#include <linux/err.h> 19#include <linux/err.h>
19#include <linux/init.h> 20#include <linux/init.h>
20#include <linux/kernel.h> 21#include <linux/kernel.h>
21#include <linux/module.h> 22#include <linux/module.h>
22#include <linux/random.h>
23#include <linux/spinlock.h> 23#include <linux/spinlock.h>
24#include <linux/string.h> 24#include <linux/string.h>
25 25
@@ -189,17 +189,22 @@ static int seqiv_givencrypt_first(struct skcipher_givcrypt_request *req)
189{ 189{
190 struct crypto_ablkcipher *geniv = skcipher_givcrypt_reqtfm(req); 190 struct crypto_ablkcipher *geniv = skcipher_givcrypt_reqtfm(req);
191 struct seqiv_ctx *ctx = crypto_ablkcipher_ctx(geniv); 191 struct seqiv_ctx *ctx = crypto_ablkcipher_ctx(geniv);
192 int err = 0;
192 193
193 spin_lock_bh(&ctx->lock); 194 spin_lock_bh(&ctx->lock);
194 if (crypto_ablkcipher_crt(geniv)->givencrypt != seqiv_givencrypt_first) 195 if (crypto_ablkcipher_crt(geniv)->givencrypt != seqiv_givencrypt_first)
195 goto unlock; 196 goto unlock;
196 197
197 crypto_ablkcipher_crt(geniv)->givencrypt = seqiv_givencrypt; 198 crypto_ablkcipher_crt(geniv)->givencrypt = seqiv_givencrypt;
198 get_random_bytes(ctx->salt, crypto_ablkcipher_ivsize(geniv)); 199 err = crypto_rng_get_bytes(crypto_default_rng, ctx->salt,
200 crypto_ablkcipher_ivsize(geniv));
199 201
200unlock: 202unlock:
201 spin_unlock_bh(&ctx->lock); 203 spin_unlock_bh(&ctx->lock);
202 204
205 if (err)
206 return err;
207
203 return seqiv_givencrypt(req); 208 return seqiv_givencrypt(req);
204} 209}
205 210
@@ -207,17 +212,22 @@ static int seqiv_aead_givencrypt_first(struct aead_givcrypt_request *req)
207{ 212{
208 struct crypto_aead *geniv = aead_givcrypt_reqtfm(req); 213 struct crypto_aead *geniv = aead_givcrypt_reqtfm(req);
209 struct seqiv_ctx *ctx = crypto_aead_ctx(geniv); 214 struct seqiv_ctx *ctx = crypto_aead_ctx(geniv);
215 int err = 0;
210 216
211 spin_lock_bh(&ctx->lock); 217 spin_lock_bh(&ctx->lock);
212 if (crypto_aead_crt(geniv)->givencrypt != seqiv_aead_givencrypt_first) 218 if (crypto_aead_crt(geniv)->givencrypt != seqiv_aead_givencrypt_first)
213 goto unlock; 219 goto unlock;
214 220
215 crypto_aead_crt(geniv)->givencrypt = seqiv_aead_givencrypt; 221 crypto_aead_crt(geniv)->givencrypt = seqiv_aead_givencrypt;
216 get_random_bytes(ctx->salt, crypto_aead_ivsize(geniv)); 222 err = crypto_rng_get_bytes(crypto_default_rng, ctx->salt,
223 crypto_aead_ivsize(geniv));
217 224
218unlock: 225unlock:
219 spin_unlock_bh(&ctx->lock); 226 spin_unlock_bh(&ctx->lock);
220 227
228 if (err)
229 return err;
230
221 return seqiv_aead_givencrypt(req); 231 return seqiv_aead_givencrypt(req);
222} 232}
223 233
@@ -298,19 +308,27 @@ static struct crypto_instance *seqiv_alloc(struct rtattr **tb)
298 if (IS_ERR(algt)) 308 if (IS_ERR(algt))
299 return ERR_PTR(err); 309 return ERR_PTR(err);
300 310
311 err = crypto_get_default_rng();
312 if (err)
313 return ERR_PTR(err);
314
301 if ((algt->type ^ CRYPTO_ALG_TYPE_AEAD) & CRYPTO_ALG_TYPE_MASK) 315 if ((algt->type ^ CRYPTO_ALG_TYPE_AEAD) & CRYPTO_ALG_TYPE_MASK)
302 inst = seqiv_ablkcipher_alloc(tb); 316 inst = seqiv_ablkcipher_alloc(tb);
303 else 317 else
304 inst = seqiv_aead_alloc(tb); 318 inst = seqiv_aead_alloc(tb);
305 319
306 if (IS_ERR(inst)) 320 if (IS_ERR(inst))
307 goto out; 321 goto put_rng;
308 322
309 inst->alg.cra_alignmask |= __alignof__(u32) - 1; 323 inst->alg.cra_alignmask |= __alignof__(u32) - 1;
310 inst->alg.cra_ctxsize += sizeof(struct seqiv_ctx); 324 inst->alg.cra_ctxsize += sizeof(struct seqiv_ctx);
311 325
312out: 326out:
313 return inst; 327 return inst;
328
329put_rng:
330 crypto_put_default_rng();
331 goto out;
314} 332}
315 333
316static void seqiv_free(struct crypto_instance *inst) 334static void seqiv_free(struct crypto_instance *inst)
@@ -319,6 +337,7 @@ static void seqiv_free(struct crypto_instance *inst)
319 skcipher_geniv_free(inst); 337 skcipher_geniv_free(inst);
320 else 338 else
321 aead_geniv_free(inst); 339 aead_geniv_free(inst);
340 crypto_put_default_rng();
322} 341}
323 342
324static struct crypto_template seqiv_tmpl = { 343static struct crypto_template seqiv_tmpl = {
diff --git a/crypto/tcrypt.c b/crypto/tcrypt.c
index 6beabc5abd07..28a45a1e6f42 100644
--- a/crypto/tcrypt.c
+++ b/crypto/tcrypt.c
@@ -13,24 +13,15 @@
13 * 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)
14 * any later version. 14 * any later version.
15 * 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
19 * 2006-12-07 Added SHA384 HMAC and SHA512 HMAC tests
20 * 2004-08-09 Added cipher speed tests (Reyk Floeter <reyk@vantronix.net>)
21 * 2003-09-14 Rewritten by Kartikey Mahendra Bhatt
22 *
23 */ 16 */
24 17
18#include <crypto/hash.h>
25#include <linux/err.h> 19#include <linux/err.h>
26#include <linux/init.h> 20#include <linux/init.h>
27#include <linux/module.h> 21#include <linux/module.h>
28#include <linux/mm.h>
29#include <linux/slab.h> 22#include <linux/slab.h>
30#include <linux/scatterlist.h> 23#include <linux/scatterlist.h>
31#include <linux/string.h> 24#include <linux/string.h>
32#include <linux/crypto.h>
33#include <linux/highmem.h>
34#include <linux/moduleparam.h> 25#include <linux/moduleparam.h>
35#include <linux/jiffies.h> 26#include <linux/jiffies.h>
36#include <linux/timex.h> 27#include <linux/timex.h>
@@ -38,651 +29,40 @@
38#include "tcrypt.h" 29#include "tcrypt.h"
39 30
40/* 31/*
41 * Need to kmalloc() memory for testing kmap(). 32 * Need slab memory for testing (size in number of pages).
42 */ 33 */
43#define TVMEMSIZE 16384 34#define TVMEMSIZE 4
44#define XBUFSIZE 32768
45 35
46/* 36/*
47 * Indexes into the xbuf to simulate cross-page access. 37* Used by test_cipher_speed()
48 */
49#define IDX1 37
50#define IDX2 32400
51#define IDX3 1
52#define IDX4 8193
53#define IDX5 22222
54#define IDX6 17101
55#define IDX7 27333
56#define IDX8 3000
57
58/*
59* Used by test_cipher()
60*/ 38*/
61#define ENCRYPT 1 39#define ENCRYPT 1
62#define DECRYPT 0 40#define DECRYPT 0
63 41
64struct tcrypt_result {
65 struct completion completion;
66 int err;
67};
68
69static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 };
70
71/* 42/*
72 * Used by test_cipher_speed() 43 * Used by test_cipher_speed()
73 */ 44 */
74static unsigned int sec; 45static unsigned int sec;
75 46
76static int mode; 47static int mode;
77static char *xbuf; 48static char *tvmem[TVMEMSIZE];
78static char *axbuf;
79static char *tvmem;
80 49
81static char *check[] = { 50static char *check[] = {
82 "des", "md5", "des3_ede", "rot13", "sha1", "sha224", "sha256", 51 "des", "md5", "des3_ede", "rot13", "sha1", "sha224", "sha256",
83 "blowfish", "twofish", "serpent", "sha384", "sha512", "md4", "aes", 52 "blowfish", "twofish", "serpent", "sha384", "sha512", "md4", "aes",
84 "cast6", "arc4", "michael_mic", "deflate", "crc32c", "tea", "xtea", 53 "cast6", "arc4", "michael_mic", "deflate", "crc32c", "tea", "xtea",
85 "khazad", "wp512", "wp384", "wp256", "tnepres", "xeta", "fcrypt", 54 "khazad", "wp512", "wp384", "wp256", "tnepres", "xeta", "fcrypt",
86 "camellia", "seed", "salsa20", "lzo", "cts", NULL 55 "camellia", "seed", "salsa20", "rmd128", "rmd160", "rmd256", "rmd320",
56 "lzo", "cts", NULL
87}; 57};
88 58
89static void hexdump(unsigned char *buf, unsigned int len) 59static int test_cipher_jiffies(struct blkcipher_desc *desc, int enc,
90{ 60 struct scatterlist *sg, int blen, int sec)
91 print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET,
92 16, 1,
93 buf, len, false);
94}
95
96static void tcrypt_complete(struct crypto_async_request *req, int err)
97{
98 struct tcrypt_result *res = req->data;
99
100 if (err == -EINPROGRESS)
101 return;
102
103 res->err = err;
104 complete(&res->completion);
105}
106
107static void test_hash(char *algo, struct hash_testvec *template,
108 unsigned int tcount)
109{
110 unsigned int i, j, k, temp;
111 struct scatterlist sg[8];
112 char result[64];
113 struct crypto_hash *tfm;
114 struct hash_desc desc;
115 int ret;
116 void *hash_buff;
117
118 printk("\ntesting %s\n", algo);
119
120 tfm = crypto_alloc_hash(algo, 0, CRYPTO_ALG_ASYNC);
121 if (IS_ERR(tfm)) {
122 printk("failed to load transform for %s: %ld\n", algo,
123 PTR_ERR(tfm));
124 return;
125 }
126
127 desc.tfm = tfm;
128 desc.flags = 0;
129
130 for (i = 0; i < tcount; i++) {
131 printk("test %u:\n", i + 1);
132 memset(result, 0, 64);
133
134 hash_buff = kzalloc(template[i].psize, GFP_KERNEL);
135 if (!hash_buff)
136 continue;
137
138 memcpy(hash_buff, template[i].plaintext, template[i].psize);
139 sg_init_one(&sg[0], hash_buff, template[i].psize);
140
141 if (template[i].ksize) {
142 ret = crypto_hash_setkey(tfm, template[i].key,
143 template[i].ksize);
144 if (ret) {
145 printk("setkey() failed ret=%d\n", ret);
146 kfree(hash_buff);
147 goto out;
148 }
149 }
150
151 ret = crypto_hash_digest(&desc, sg, template[i].psize, result);
152 if (ret) {
153 printk("digest () failed ret=%d\n", ret);
154 kfree(hash_buff);
155 goto out;
156 }
157
158 hexdump(result, crypto_hash_digestsize(tfm));
159 printk("%s\n",
160 memcmp(result, template[i].digest,
161 crypto_hash_digestsize(tfm)) ?
162 "fail" : "pass");
163 kfree(hash_buff);
164 }
165
166 printk("testing %s across pages\n", algo);
167
168 /* setup the dummy buffer first */
169 memset(xbuf, 0, XBUFSIZE);
170
171 j = 0;
172 for (i = 0; i < tcount; i++) {
173 if (template[i].np) {
174 j++;
175 printk("test %u:\n", j);
176 memset(result, 0, 64);
177
178 temp = 0;
179 sg_init_table(sg, template[i].np);
180 for (k = 0; k < template[i].np; k++) {
181 memcpy(&xbuf[IDX[k]],
182 template[i].plaintext + temp,
183 template[i].tap[k]);
184 temp += template[i].tap[k];
185 sg_set_buf(&sg[k], &xbuf[IDX[k]],
186 template[i].tap[k]);
187 }
188
189 if (template[i].ksize) {
190 ret = crypto_hash_setkey(tfm, template[i].key,
191 template[i].ksize);
192
193 if (ret) {
194 printk("setkey() failed ret=%d\n", ret);
195 goto out;
196 }
197 }
198
199 ret = crypto_hash_digest(&desc, sg, template[i].psize,
200 result);
201 if (ret) {
202 printk("digest () failed ret=%d\n", ret);
203 goto out;
204 }
205
206 hexdump(result, crypto_hash_digestsize(tfm));
207 printk("%s\n",
208 memcmp(result, template[i].digest,
209 crypto_hash_digestsize(tfm)) ?
210 "fail" : "pass");
211 }
212 }
213
214out:
215 crypto_free_hash(tfm);
216}
217
218static void test_aead(char *algo, int enc, struct aead_testvec *template,
219 unsigned int tcount)
220{
221 unsigned int ret, i, j, k, temp;
222 char *q;
223 struct crypto_aead *tfm;
224 char *key;
225 struct aead_request *req;
226 struct scatterlist sg[8];
227 struct scatterlist asg[8];
228 const char *e;
229 struct tcrypt_result result;
230 unsigned int authsize;
231 void *input;
232 void *assoc;
233 char iv[MAX_IVLEN];
234
235 if (enc == ENCRYPT)
236 e = "encryption";
237 else
238 e = "decryption";
239
240 printk(KERN_INFO "\ntesting %s %s\n", algo, e);
241
242 init_completion(&result.completion);
243
244 tfm = crypto_alloc_aead(algo, 0, 0);
245
246 if (IS_ERR(tfm)) {
247 printk(KERN_INFO "failed to load transform for %s: %ld\n",
248 algo, PTR_ERR(tfm));
249 return;
250 }
251
252 req = aead_request_alloc(tfm, GFP_KERNEL);
253 if (!req) {
254 printk(KERN_INFO "failed to allocate request for %s\n", algo);
255 goto out;
256 }
257
258 aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
259 tcrypt_complete, &result);
260
261 for (i = 0, j = 0; i < tcount; i++) {
262 if (!template[i].np) {
263 printk(KERN_INFO "test %u (%d bit key):\n",
264 ++j, template[i].klen * 8);
265
266 /* some tepmplates have no input data but they will
267 * touch input
268 */
269 input = kzalloc(template[i].ilen + template[i].rlen, GFP_KERNEL);
270 if (!input)
271 continue;
272
273 assoc = kzalloc(template[i].alen, GFP_KERNEL);
274 if (!assoc) {
275 kfree(input);
276 continue;
277 }
278
279 memcpy(input, template[i].input, template[i].ilen);
280 memcpy(assoc, template[i].assoc, template[i].alen);
281 if (template[i].iv)
282 memcpy(iv, template[i].iv, MAX_IVLEN);
283 else
284 memset(iv, 0, MAX_IVLEN);
285
286 crypto_aead_clear_flags(tfm, ~0);
287 if (template[i].wk)
288 crypto_aead_set_flags(
289 tfm, CRYPTO_TFM_REQ_WEAK_KEY);
290
291 if (template[i].key)
292 key = template[i].key;
293 else
294 key = kzalloc(template[i].klen, GFP_KERNEL);
295
296 ret = crypto_aead_setkey(tfm, key,
297 template[i].klen);
298 if (ret) {
299 printk(KERN_INFO "setkey() failed flags=%x\n",
300 crypto_aead_get_flags(tfm));
301
302 if (!template[i].fail)
303 goto next_one;
304 }
305
306 authsize = abs(template[i].rlen - template[i].ilen);
307 ret = crypto_aead_setauthsize(tfm, authsize);
308 if (ret) {
309 printk(KERN_INFO
310 "failed to set authsize = %u\n",
311 authsize);
312 goto next_one;
313 }
314
315 sg_init_one(&sg[0], input,
316 template[i].ilen + (enc ? authsize : 0));
317
318 sg_init_one(&asg[0], assoc, template[i].alen);
319
320 aead_request_set_crypt(req, sg, sg,
321 template[i].ilen, iv);
322
323 aead_request_set_assoc(req, asg, template[i].alen);
324
325 ret = enc ?
326 crypto_aead_encrypt(req) :
327 crypto_aead_decrypt(req);
328
329 switch (ret) {
330 case 0:
331 break;
332 case -EINPROGRESS:
333 case -EBUSY:
334 ret = wait_for_completion_interruptible(
335 &result.completion);
336 if (!ret && !(ret = result.err)) {
337 INIT_COMPLETION(result.completion);
338 break;
339 }
340 /* fall through */
341 default:
342 printk(KERN_INFO "%s () failed err=%d\n",
343 e, -ret);
344 goto next_one;
345 }
346
347 q = kmap(sg_page(&sg[0])) + sg[0].offset;
348 hexdump(q, template[i].rlen);
349
350 printk(KERN_INFO "enc/dec: %s\n",
351 memcmp(q, template[i].result,
352 template[i].rlen) ? "fail" : "pass");
353 kunmap(sg_page(&sg[0]));
354next_one:
355 if (!template[i].key)
356 kfree(key);
357 kfree(assoc);
358 kfree(input);
359 }
360 }
361
362 printk(KERN_INFO "\ntesting %s %s across pages (chunking)\n", algo, e);
363 memset(xbuf, 0, XBUFSIZE);
364 memset(axbuf, 0, XBUFSIZE);
365
366 for (i = 0, j = 0; i < tcount; i++) {
367 if (template[i].np) {
368 printk(KERN_INFO "test %u (%d bit key):\n",
369 ++j, template[i].klen * 8);
370
371 if (template[i].iv)
372 memcpy(iv, template[i].iv, MAX_IVLEN);
373 else
374 memset(iv, 0, MAX_IVLEN);
375
376 crypto_aead_clear_flags(tfm, ~0);
377 if (template[i].wk)
378 crypto_aead_set_flags(
379 tfm, CRYPTO_TFM_REQ_WEAK_KEY);
380 key = template[i].key;
381
382 ret = crypto_aead_setkey(tfm, key, template[i].klen);
383 if (ret) {
384 printk(KERN_INFO "setkey() failed flags=%x\n",
385 crypto_aead_get_flags(tfm));
386
387 if (!template[i].fail)
388 goto out;
389 }
390
391 sg_init_table(sg, template[i].np);
392 for (k = 0, temp = 0; k < template[i].np; k++) {
393 memcpy(&xbuf[IDX[k]],
394 template[i].input + temp,
395 template[i].tap[k]);
396 temp += template[i].tap[k];
397 sg_set_buf(&sg[k], &xbuf[IDX[k]],
398 template[i].tap[k]);
399 }
400
401 authsize = abs(template[i].rlen - template[i].ilen);
402 ret = crypto_aead_setauthsize(tfm, authsize);
403 if (ret) {
404 printk(KERN_INFO
405 "failed to set authsize = %u\n",
406 authsize);
407 goto out;
408 }
409
410 if (enc)
411 sg[k - 1].length += authsize;
412
413 sg_init_table(asg, template[i].anp);
414 for (k = 0, temp = 0; k < template[i].anp; k++) {
415 memcpy(&axbuf[IDX[k]],
416 template[i].assoc + temp,
417 template[i].atap[k]);
418 temp += template[i].atap[k];
419 sg_set_buf(&asg[k], &axbuf[IDX[k]],
420 template[i].atap[k]);
421 }
422
423 aead_request_set_crypt(req, sg, sg,
424 template[i].ilen,
425 iv);
426
427 aead_request_set_assoc(req, asg, template[i].alen);
428
429 ret = enc ?
430 crypto_aead_encrypt(req) :
431 crypto_aead_decrypt(req);
432
433 switch (ret) {
434 case 0:
435 break;
436 case -EINPROGRESS:
437 case -EBUSY:
438 ret = wait_for_completion_interruptible(
439 &result.completion);
440 if (!ret && !(ret = result.err)) {
441 INIT_COMPLETION(result.completion);
442 break;
443 }
444 /* fall through */
445 default:
446 printk(KERN_INFO "%s () failed err=%d\n",
447 e, -ret);
448 goto out;
449 }
450
451 for (k = 0, temp = 0; k < template[i].np; k++) {
452 printk(KERN_INFO "page %u\n", k);
453 q = kmap(sg_page(&sg[k])) + sg[k].offset;
454 hexdump(q, template[i].tap[k]);
455 printk(KERN_INFO "%s\n",
456 memcmp(q, template[i].result + temp,
457 template[i].tap[k] -
458 (k < template[i].np - 1 || enc ?
459 0 : authsize)) ?
460 "fail" : "pass");
461
462 temp += template[i].tap[k];
463 kunmap(sg_page(&sg[k]));
464 }
465 }
466 }
467
468out:
469 crypto_free_aead(tfm);
470 aead_request_free(req);
471}
472
473static void test_cipher(char *algo, int enc,
474 struct cipher_testvec *template, unsigned int tcount)
475{ 61{
476 unsigned int ret, i, j, k, temp;
477 char *q;
478 struct crypto_ablkcipher *tfm;
479 struct ablkcipher_request *req;
480 struct scatterlist sg[8];
481 const char *e;
482 struct tcrypt_result result;
483 void *data;
484 char iv[MAX_IVLEN];
485
486 if (enc == ENCRYPT)
487 e = "encryption";
488 else
489 e = "decryption";
490
491 printk("\ntesting %s %s\n", algo, e);
492
493 init_completion(&result.completion);
494 tfm = crypto_alloc_ablkcipher(algo, 0, 0);
495
496 if (IS_ERR(tfm)) {
497 printk("failed to load transform for %s: %ld\n", algo,
498 PTR_ERR(tfm));
499 return;
500 }
501
502 req = ablkcipher_request_alloc(tfm, GFP_KERNEL);
503 if (!req) {
504 printk("failed to allocate request for %s\n", algo);
505 goto out;
506 }
507
508 ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
509 tcrypt_complete, &result);
510
511 j = 0;
512 for (i = 0; i < tcount; i++) {
513
514 data = kzalloc(template[i].ilen, GFP_KERNEL);
515 if (!data)
516 continue;
517
518 memcpy(data, template[i].input, template[i].ilen);
519 if (template[i].iv)
520 memcpy(iv, template[i].iv, MAX_IVLEN);
521 else
522 memset(iv, 0, MAX_IVLEN);
523
524 if (!(template[i].np)) {
525 j++;
526 printk("test %u (%d bit key):\n",
527 j, template[i].klen * 8);
528
529 crypto_ablkcipher_clear_flags(tfm, ~0);
530 if (template[i].wk)
531 crypto_ablkcipher_set_flags(
532 tfm, CRYPTO_TFM_REQ_WEAK_KEY);
533
534 ret = crypto_ablkcipher_setkey(tfm, template[i].key,
535 template[i].klen);
536 if (ret) {
537 printk("setkey() failed flags=%x\n",
538 crypto_ablkcipher_get_flags(tfm));
539
540 if (!template[i].fail) {
541 kfree(data);
542 goto out;
543 }
544 }
545
546 sg_init_one(&sg[0], data, template[i].ilen);
547
548 ablkcipher_request_set_crypt(req, sg, sg,
549 template[i].ilen, iv);
550 ret = enc ?
551 crypto_ablkcipher_encrypt(req) :
552 crypto_ablkcipher_decrypt(req);
553
554 switch (ret) {
555 case 0:
556 break;
557 case -EINPROGRESS:
558 case -EBUSY:
559 ret = wait_for_completion_interruptible(
560 &result.completion);
561 if (!ret && !((ret = result.err))) {
562 INIT_COMPLETION(result.completion);
563 break;
564 }
565 /* fall through */
566 default:
567 printk("%s () failed err=%d\n", e, -ret);
568 kfree(data);
569 goto out;
570 }
571
572 q = kmap(sg_page(&sg[0])) + sg[0].offset;
573 hexdump(q, template[i].rlen);
574
575 printk("%s\n",
576 memcmp(q, template[i].result,
577 template[i].rlen) ? "fail" : "pass");
578 kunmap(sg_page(&sg[0]));
579 }
580 kfree(data);
581 }
582
583 printk("\ntesting %s %s across pages (chunking)\n", algo, e);
584 memset(xbuf, 0, XBUFSIZE);
585
586 j = 0;
587 for (i = 0; i < tcount; i++) {
588
589 data = kzalloc(template[i].ilen, GFP_KERNEL);
590 if (!data)
591 continue;
592
593 memcpy(data, template[i].input, template[i].ilen);
594
595 if (template[i].iv)
596 memcpy(iv, template[i].iv, MAX_IVLEN);
597 else
598 memset(iv, 0, MAX_IVLEN);
599
600 if (template[i].np) {
601 j++;
602 printk("test %u (%d bit key):\n",
603 j, template[i].klen * 8);
604
605 crypto_ablkcipher_clear_flags(tfm, ~0);
606 if (template[i].wk)
607 crypto_ablkcipher_set_flags(
608 tfm, CRYPTO_TFM_REQ_WEAK_KEY);
609
610 ret = crypto_ablkcipher_setkey(tfm, template[i].key,
611 template[i].klen);
612 if (ret) {
613 printk("setkey() failed flags=%x\n",
614 crypto_ablkcipher_get_flags(tfm));
615
616 if (!template[i].fail) {
617 kfree(data);
618 goto out;
619 }
620 }
621
622 temp = 0;
623 sg_init_table(sg, template[i].np);
624 for (k = 0; k < template[i].np; k++) {
625 memcpy(&xbuf[IDX[k]],
626 template[i].input + temp,
627 template[i].tap[k]);
628 temp += template[i].tap[k];
629 sg_set_buf(&sg[k], &xbuf[IDX[k]],
630 template[i].tap[k]);
631 }
632
633 ablkcipher_request_set_crypt(req, sg, sg,
634 template[i].ilen, iv);
635
636 ret = enc ?
637 crypto_ablkcipher_encrypt(req) :
638 crypto_ablkcipher_decrypt(req);
639
640 switch (ret) {
641 case 0:
642 break;
643 case -EINPROGRESS:
644 case -EBUSY:
645 ret = wait_for_completion_interruptible(
646 &result.completion);
647 if (!ret && !((ret = result.err))) {
648 INIT_COMPLETION(result.completion);
649 break;
650 }
651 /* fall through */
652 default:
653 printk("%s () failed err=%d\n", e, -ret);
654 goto out;
655 }
656
657 temp = 0;
658 for (k = 0; k < template[i].np; k++) {
659 printk("page %u\n", k);
660 q = kmap(sg_page(&sg[k])) + sg[k].offset;
661 hexdump(q, template[i].tap[k]);
662 printk("%s\n",
663 memcmp(q, template[i].result + temp,
664 template[i].tap[k]) ? "fail" :
665 "pass");
666 temp += template[i].tap[k];
667 kunmap(sg_page(&sg[k]));
668 }
669 }
670 }
671out:
672 crypto_free_ablkcipher(tfm);
673 ablkcipher_request_free(req);
674}
675
676static int test_cipher_jiffies(struct blkcipher_desc *desc, int enc, char *p,
677 int blen, int sec)
678{
679 struct scatterlist sg[1];
680 unsigned long start, end; 62 unsigned long start, end;
681 int bcount; 63 int bcount;
682 int ret; 64 int ret;
683 65
684 sg_init_one(sg, p, blen);
685
686 for (start = jiffies, end = start + sec * HZ, bcount = 0; 66 for (start = jiffies, end = start + sec * HZ, bcount = 0;
687 time_before(jiffies, end); bcount++) { 67 time_before(jiffies, end); bcount++) {
688 if (enc) 68 if (enc)
@@ -699,16 +79,13 @@ static int test_cipher_jiffies(struct blkcipher_desc *desc, int enc, char *p,
699 return 0; 79 return 0;
700} 80}
701 81
702static int test_cipher_cycles(struct blkcipher_desc *desc, int enc, char *p, 82static int test_cipher_cycles(struct blkcipher_desc *desc, int enc,
703 int blen) 83 struct scatterlist *sg, int blen)
704{ 84{
705 struct scatterlist sg[1];
706 unsigned long cycles = 0; 85 unsigned long cycles = 0;
707 int ret = 0; 86 int ret = 0;
708 int i; 87 int i;
709 88
710 sg_init_one(sg, p, blen);
711
712 local_bh_disable(); 89 local_bh_disable();
713 local_irq_disable(); 90 local_irq_disable();
714 91
@@ -753,12 +130,12 @@ out:
753 130
754static u32 block_sizes[] = { 16, 64, 256, 1024, 8192, 0 }; 131static u32 block_sizes[] = { 16, 64, 256, 1024, 8192, 0 };
755 132
756static void test_cipher_speed(char *algo, int enc, unsigned int sec, 133static void test_cipher_speed(const char *algo, int enc, unsigned int sec,
757 struct cipher_testvec *template, 134 struct cipher_speed_template *template,
758 unsigned int tcount, u8 *keysize) 135 unsigned int tcount, u8 *keysize)
759{ 136{
760 unsigned int ret, i, j, iv_len; 137 unsigned int ret, i, j, iv_len;
761 unsigned char *key, *p, iv[128]; 138 const char *key, iv[128];
762 struct crypto_blkcipher *tfm; 139 struct crypto_blkcipher *tfm;
763 struct blkcipher_desc desc; 140 struct blkcipher_desc desc;
764 const char *e; 141 const char *e;
@@ -786,27 +163,28 @@ static void test_cipher_speed(char *algo, int enc, unsigned int sec,
786 163
787 b_size = block_sizes; 164 b_size = block_sizes;
788 do { 165 do {
166 struct scatterlist sg[TVMEMSIZE];
789 167
790 if ((*keysize + *b_size) > TVMEMSIZE) { 168 if ((*keysize + *b_size) > TVMEMSIZE * PAGE_SIZE) {
791 printk("template (%u) too big for tvmem (%u)\n", 169 printk("template (%u) too big for "
792 *keysize + *b_size, TVMEMSIZE); 170 "tvmem (%lu)\n", *keysize + *b_size,
171 TVMEMSIZE * PAGE_SIZE);
793 goto out; 172 goto out;
794 } 173 }
795 174
796 printk("test %u (%d bit key, %d byte blocks): ", i, 175 printk("test %u (%d bit key, %d byte blocks): ", i,
797 *keysize * 8, *b_size); 176 *keysize * 8, *b_size);
798 177
799 memset(tvmem, 0xff, *keysize + *b_size); 178 memset(tvmem[0], 0xff, PAGE_SIZE);
800 179
801 /* set key, plain text and IV */ 180 /* set key, plain text and IV */
802 key = (unsigned char *)tvmem; 181 key = tvmem[0];
803 for (j = 0; j < tcount; j++) { 182 for (j = 0; j < tcount; j++) {
804 if (template[j].klen == *keysize) { 183 if (template[j].klen == *keysize) {
805 key = template[j].key; 184 key = template[j].key;
806 break; 185 break;
807 } 186 }
808 } 187 }
809 p = (unsigned char *)tvmem + *keysize;
810 188
811 ret = crypto_blkcipher_setkey(tfm, key, *keysize); 189 ret = crypto_blkcipher_setkey(tfm, key, *keysize);
812 if (ret) { 190 if (ret) {
@@ -815,6 +193,14 @@ static void test_cipher_speed(char *algo, int enc, unsigned int sec,
815 goto out; 193 goto out;
816 } 194 }
817 195
196 sg_init_table(sg, TVMEMSIZE);
197 sg_set_buf(sg, tvmem[0] + *keysize,
198 PAGE_SIZE - *keysize);
199 for (j = 1; j < TVMEMSIZE; j++) {
200 sg_set_buf(sg + j, tvmem[j], PAGE_SIZE);
201 memset (tvmem[j], 0xff, PAGE_SIZE);
202 }
203
818 iv_len = crypto_blkcipher_ivsize(tfm); 204 iv_len = crypto_blkcipher_ivsize(tfm);
819 if (iv_len) { 205 if (iv_len) {
820 memset(&iv, 0xff, iv_len); 206 memset(&iv, 0xff, iv_len);
@@ -822,9 +208,11 @@ static void test_cipher_speed(char *algo, int enc, unsigned int sec,
822 } 208 }
823 209
824 if (sec) 210 if (sec)
825 ret = test_cipher_jiffies(&desc, enc, p, *b_size, sec); 211 ret = test_cipher_jiffies(&desc, enc, sg,
212 *b_size, sec);
826 else 213 else
827 ret = test_cipher_cycles(&desc, enc, p, *b_size); 214 ret = test_cipher_cycles(&desc, enc, sg,
215 *b_size);
828 216
829 if (ret) { 217 if (ret) {
830 printk("%s() failed flags=%x\n", e, desc.flags); 218 printk("%s() failed flags=%x\n", e, desc.flags);
@@ -840,19 +228,16 @@ out:
840 crypto_free_blkcipher(tfm); 228 crypto_free_blkcipher(tfm);
841} 229}
842 230
843static int test_hash_jiffies_digest(struct hash_desc *desc, char *p, int blen, 231static int test_hash_jiffies_digest(struct hash_desc *desc,
232 struct scatterlist *sg, int blen,
844 char *out, int sec) 233 char *out, int sec)
845{ 234{
846 struct scatterlist sg[1];
847 unsigned long start, end; 235 unsigned long start, end;
848 int bcount; 236 int bcount;
849 int ret; 237 int ret;
850 238
851 sg_init_table(sg, 1);
852
853 for (start = jiffies, end = start + sec * HZ, bcount = 0; 239 for (start = jiffies, end = start + sec * HZ, bcount = 0;
854 time_before(jiffies, end); bcount++) { 240 time_before(jiffies, end); bcount++) {
855 sg_set_buf(sg, p, blen);
856 ret = crypto_hash_digest(desc, sg, blen, out); 241 ret = crypto_hash_digest(desc, sg, blen, out);
857 if (ret) 242 if (ret)
858 return ret; 243 return ret;
@@ -864,18 +249,15 @@ static int test_hash_jiffies_digest(struct hash_desc *desc, char *p, int blen,
864 return 0; 249 return 0;
865} 250}
866 251
867static int test_hash_jiffies(struct hash_desc *desc, char *p, int blen, 252static int test_hash_jiffies(struct hash_desc *desc, struct scatterlist *sg,
868 int plen, char *out, int sec) 253 int blen, int plen, char *out, int sec)
869{ 254{
870 struct scatterlist sg[1];
871 unsigned long start, end; 255 unsigned long start, end;
872 int bcount, pcount; 256 int bcount, pcount;
873 int ret; 257 int ret;
874 258
875 if (plen == blen) 259 if (plen == blen)
876 return test_hash_jiffies_digest(desc, p, blen, out, sec); 260 return test_hash_jiffies_digest(desc, sg, blen, out, sec);
877
878 sg_init_table(sg, 1);
879 261
880 for (start = jiffies, end = start + sec * HZ, bcount = 0; 262 for (start = jiffies, end = start + sec * HZ, bcount = 0;
881 time_before(jiffies, end); bcount++) { 263 time_before(jiffies, end); bcount++) {
@@ -883,7 +265,6 @@ static int test_hash_jiffies(struct hash_desc *desc, char *p, int blen,
883 if (ret) 265 if (ret)
884 return ret; 266 return ret;
885 for (pcount = 0; pcount < blen; pcount += plen) { 267 for (pcount = 0; pcount < blen; pcount += plen) {
886 sg_set_buf(sg, p + pcount, plen);
887 ret = crypto_hash_update(desc, sg, plen); 268 ret = crypto_hash_update(desc, sg, plen);
888 if (ret) 269 if (ret)
889 return ret; 270 return ret;
@@ -900,22 +281,18 @@ static int test_hash_jiffies(struct hash_desc *desc, char *p, int blen,
900 return 0; 281 return 0;
901} 282}
902 283
903static int test_hash_cycles_digest(struct hash_desc *desc, char *p, int blen, 284static int test_hash_cycles_digest(struct hash_desc *desc,
904 char *out) 285 struct scatterlist *sg, int blen, char *out)
905{ 286{
906 struct scatterlist sg[1];
907 unsigned long cycles = 0; 287 unsigned long cycles = 0;
908 int i; 288 int i;
909 int ret; 289 int ret;
910 290
911 sg_init_table(sg, 1);
912
913 local_bh_disable(); 291 local_bh_disable();
914 local_irq_disable(); 292 local_irq_disable();
915 293
916 /* Warm-up run. */ 294 /* Warm-up run. */
917 for (i = 0; i < 4; i++) { 295 for (i = 0; i < 4; i++) {
918 sg_set_buf(sg, p, blen);
919 ret = crypto_hash_digest(desc, sg, blen, out); 296 ret = crypto_hash_digest(desc, sg, blen, out);
920 if (ret) 297 if (ret)
921 goto out; 298 goto out;
@@ -927,7 +304,6 @@ static int test_hash_cycles_digest(struct hash_desc *desc, char *p, int blen,
927 304
928 start = get_cycles(); 305 start = get_cycles();
929 306
930 sg_set_buf(sg, p, blen);
931 ret = crypto_hash_digest(desc, sg, blen, out); 307 ret = crypto_hash_digest(desc, sg, blen, out);
932 if (ret) 308 if (ret)
933 goto out; 309 goto out;
@@ -950,18 +326,15 @@ out:
950 return 0; 326 return 0;
951} 327}
952 328
953static int test_hash_cycles(struct hash_desc *desc, char *p, int blen, 329static int test_hash_cycles(struct hash_desc *desc, struct scatterlist *sg,
954 int plen, char *out) 330 int blen, int plen, char *out)
955{ 331{
956 struct scatterlist sg[1];
957 unsigned long cycles = 0; 332 unsigned long cycles = 0;
958 int i, pcount; 333 int i, pcount;
959 int ret; 334 int ret;
960 335
961 if (plen == blen) 336 if (plen == blen)
962 return test_hash_cycles_digest(desc, p, blen, out); 337 return test_hash_cycles_digest(desc, sg, blen, out);
963
964 sg_init_table(sg, 1);
965 338
966 local_bh_disable(); 339 local_bh_disable();
967 local_irq_disable(); 340 local_irq_disable();
@@ -972,7 +345,6 @@ static int test_hash_cycles(struct hash_desc *desc, char *p, int blen,
972 if (ret) 345 if (ret)
973 goto out; 346 goto out;
974 for (pcount = 0; pcount < blen; pcount += plen) { 347 for (pcount = 0; pcount < blen; pcount += plen) {
975 sg_set_buf(sg, p + pcount, plen);
976 ret = crypto_hash_update(desc, sg, plen); 348 ret = crypto_hash_update(desc, sg, plen);
977 if (ret) 349 if (ret)
978 goto out; 350 goto out;
@@ -992,7 +364,6 @@ static int test_hash_cycles(struct hash_desc *desc, char *p, int blen,
992 if (ret) 364 if (ret)
993 goto out; 365 goto out;
994 for (pcount = 0; pcount < blen; pcount += plen) { 366 for (pcount = 0; pcount < blen; pcount += plen) {
995 sg_set_buf(sg, p + pcount, plen);
996 ret = crypto_hash_update(desc, sg, plen); 367 ret = crypto_hash_update(desc, sg, plen);
997 if (ret) 368 if (ret)
998 goto out; 369 goto out;
@@ -1019,9 +390,10 @@ out:
1019 return 0; 390 return 0;
1020} 391}
1021 392
1022static void test_hash_speed(char *algo, unsigned int sec, 393static void test_hash_speed(const char *algo, unsigned int sec,
1023 struct hash_speed *speed) 394 struct hash_speed *speed)
1024{ 395{
396 struct scatterlist sg[TVMEMSIZE];
1025 struct crypto_hash *tfm; 397 struct crypto_hash *tfm;
1026 struct hash_desc desc; 398 struct hash_desc desc;
1027 char output[1024]; 399 char output[1024];
@@ -1047,23 +419,27 @@ static void test_hash_speed(char *algo, unsigned int sec,
1047 goto out; 419 goto out;
1048 } 420 }
1049 421
422 sg_init_table(sg, TVMEMSIZE);
423 for (i = 0; i < TVMEMSIZE; i++) {
424 sg_set_buf(sg + i, tvmem[i], PAGE_SIZE);
425 memset(tvmem[i], 0xff, PAGE_SIZE);
426 }
427
1050 for (i = 0; speed[i].blen != 0; i++) { 428 for (i = 0; speed[i].blen != 0; i++) {
1051 if (speed[i].blen > TVMEMSIZE) { 429 if (speed[i].blen > TVMEMSIZE * PAGE_SIZE) {
1052 printk("template (%u) too big for tvmem (%u)\n", 430 printk("template (%u) too big for tvmem (%lu)\n",
1053 speed[i].blen, TVMEMSIZE); 431 speed[i].blen, TVMEMSIZE * PAGE_SIZE);
1054 goto out; 432 goto out;
1055 } 433 }
1056 434
1057 printk("test%3u (%5u byte blocks,%5u bytes per update,%4u updates): ", 435 printk("test%3u (%5u byte blocks,%5u bytes per update,%4u updates): ",
1058 i, speed[i].blen, speed[i].plen, speed[i].blen / speed[i].plen); 436 i, speed[i].blen, speed[i].plen, speed[i].blen / speed[i].plen);
1059 437
1060 memset(tvmem, 0xff, speed[i].blen);
1061
1062 if (sec) 438 if (sec)
1063 ret = test_hash_jiffies(&desc, tvmem, speed[i].blen, 439 ret = test_hash_jiffies(&desc, sg, speed[i].blen,
1064 speed[i].plen, output, sec); 440 speed[i].plen, output, sec);
1065 else 441 else
1066 ret = test_hash_cycles(&desc, tvmem, speed[i].blen, 442 ret = test_hash_cycles(&desc, sg, speed[i].blen,
1067 speed[i].plen, output); 443 speed[i].plen, output);
1068 444
1069 if (ret) { 445 if (ret) {
@@ -1076,73 +452,6 @@ out:
1076 crypto_free_hash(tfm); 452 crypto_free_hash(tfm);
1077} 453}
1078 454
1079static void test_comp(char *algo, struct comp_testvec *ctemplate,
1080 struct comp_testvec *dtemplate, int ctcount, int dtcount)
1081{
1082 unsigned int i;
1083 char result[COMP_BUF_SIZE];
1084 struct crypto_comp *tfm;
1085 unsigned int tsize;
1086
1087 printk("\ntesting %s compression\n", algo);
1088
1089 tfm = crypto_alloc_comp(algo, 0, CRYPTO_ALG_ASYNC);
1090 if (IS_ERR(tfm)) {
1091 printk("failed to load transform for %s\n", algo);
1092 return;
1093 }
1094
1095 for (i = 0; i < ctcount; i++) {
1096 int ilen, ret, dlen = COMP_BUF_SIZE;
1097
1098 printk("test %u:\n", i + 1);
1099 memset(result, 0, sizeof (result));
1100
1101 ilen = ctemplate[i].inlen;
1102 ret = crypto_comp_compress(tfm, ctemplate[i].input,
1103 ilen, result, &dlen);
1104 if (ret) {
1105 printk("fail: ret=%d\n", ret);
1106 continue;
1107 }
1108 hexdump(result, dlen);
1109 printk("%s (ratio %d:%d)\n",
1110 memcmp(result, ctemplate[i].output, dlen) ? "fail" : "pass",
1111 ilen, dlen);
1112 }
1113
1114 printk("\ntesting %s decompression\n", algo);
1115
1116 tsize = sizeof(struct comp_testvec);
1117 tsize *= dtcount;
1118 if (tsize > TVMEMSIZE) {
1119 printk("template (%u) too big for tvmem (%u)\n", tsize,
1120 TVMEMSIZE);
1121 goto out;
1122 }
1123
1124 for (i = 0; i < dtcount; i++) {
1125 int ilen, ret, dlen = COMP_BUF_SIZE;
1126
1127 printk("test %u:\n", i + 1);
1128 memset(result, 0, sizeof (result));
1129
1130 ilen = dtemplate[i].inlen;
1131 ret = crypto_comp_decompress(tfm, dtemplate[i].input,
1132 ilen, result, &dlen);
1133 if (ret) {
1134 printk("fail: ret=%d\n", ret);
1135 continue;
1136 }
1137 hexdump(result, dlen);
1138 printk("%s (ratio %d:%d)\n",
1139 memcmp(result, dtemplate[i].output, dlen) ? "fail" : "pass",
1140 ilen, dlen);
1141 }
1142out:
1143 crypto_free_comp(tfm);
1144}
1145
1146static void test_available(void) 455static void test_available(void)
1147{ 456{
1148 char **name = check; 457 char **name = check;
@@ -1155,507 +464,237 @@ static void test_available(void)
1155 } 464 }
1156} 465}
1157 466
1158static void do_test(void) 467static inline int tcrypt_test(const char *alg)
1159{ 468{
1160 switch (mode) { 469 return alg_test(alg, alg, 0, 0);
470}
1161 471
472static void do_test(int m)
473{
474 int i;
475
476 switch (m) {
1162 case 0: 477 case 0:
1163 test_hash("md5", md5_tv_template, MD5_TEST_VECTORS); 478 for (i = 1; i < 200; i++)
1164 479 do_test(i);
1165 test_hash("sha1", sha1_tv_template, SHA1_TEST_VECTORS);
1166
1167 //DES
1168 test_cipher("ecb(des)", ENCRYPT, des_enc_tv_template,
1169 DES_ENC_TEST_VECTORS);
1170 test_cipher("ecb(des)", DECRYPT, des_dec_tv_template,
1171 DES_DEC_TEST_VECTORS);
1172 test_cipher("cbc(des)", ENCRYPT, des_cbc_enc_tv_template,
1173 DES_CBC_ENC_TEST_VECTORS);
1174 test_cipher("cbc(des)", DECRYPT, des_cbc_dec_tv_template,
1175 DES_CBC_DEC_TEST_VECTORS);
1176
1177 //DES3_EDE
1178 test_cipher("ecb(des3_ede)", ENCRYPT, des3_ede_enc_tv_template,
1179 DES3_EDE_ENC_TEST_VECTORS);
1180 test_cipher("ecb(des3_ede)", DECRYPT, des3_ede_dec_tv_template,
1181 DES3_EDE_DEC_TEST_VECTORS);
1182
1183 test_hash("md4", md4_tv_template, MD4_TEST_VECTORS);
1184
1185 test_hash("sha224", sha224_tv_template, SHA224_TEST_VECTORS);
1186
1187 test_hash("sha256", sha256_tv_template, SHA256_TEST_VECTORS);
1188
1189 //BLOWFISH
1190 test_cipher("ecb(blowfish)", ENCRYPT, bf_enc_tv_template,
1191 BF_ENC_TEST_VECTORS);
1192 test_cipher("ecb(blowfish)", DECRYPT, bf_dec_tv_template,
1193 BF_DEC_TEST_VECTORS);
1194 test_cipher("cbc(blowfish)", ENCRYPT, bf_cbc_enc_tv_template,
1195 BF_CBC_ENC_TEST_VECTORS);
1196 test_cipher("cbc(blowfish)", DECRYPT, bf_cbc_dec_tv_template,
1197 BF_CBC_DEC_TEST_VECTORS);
1198
1199 //TWOFISH
1200 test_cipher("ecb(twofish)", ENCRYPT, tf_enc_tv_template,
1201 TF_ENC_TEST_VECTORS);
1202 test_cipher("ecb(twofish)", DECRYPT, tf_dec_tv_template,
1203 TF_DEC_TEST_VECTORS);
1204 test_cipher("cbc(twofish)", ENCRYPT, tf_cbc_enc_tv_template,
1205 TF_CBC_ENC_TEST_VECTORS);
1206 test_cipher("cbc(twofish)", DECRYPT, tf_cbc_dec_tv_template,
1207 TF_CBC_DEC_TEST_VECTORS);
1208
1209 //SERPENT
1210 test_cipher("ecb(serpent)", ENCRYPT, serpent_enc_tv_template,
1211 SERPENT_ENC_TEST_VECTORS);
1212 test_cipher("ecb(serpent)", DECRYPT, serpent_dec_tv_template,
1213 SERPENT_DEC_TEST_VECTORS);
1214
1215 //TNEPRES
1216 test_cipher("ecb(tnepres)", ENCRYPT, tnepres_enc_tv_template,
1217 TNEPRES_ENC_TEST_VECTORS);
1218 test_cipher("ecb(tnepres)", DECRYPT, tnepres_dec_tv_template,
1219 TNEPRES_DEC_TEST_VECTORS);
1220
1221 //AES
1222 test_cipher("ecb(aes)", ENCRYPT, aes_enc_tv_template,
1223 AES_ENC_TEST_VECTORS);
1224 test_cipher("ecb(aes)", DECRYPT, aes_dec_tv_template,
1225 AES_DEC_TEST_VECTORS);
1226 test_cipher("cbc(aes)", ENCRYPT, aes_cbc_enc_tv_template,
1227 AES_CBC_ENC_TEST_VECTORS);
1228 test_cipher("cbc(aes)", DECRYPT, aes_cbc_dec_tv_template,
1229 AES_CBC_DEC_TEST_VECTORS);
1230 test_cipher("lrw(aes)", ENCRYPT, aes_lrw_enc_tv_template,
1231 AES_LRW_ENC_TEST_VECTORS);
1232 test_cipher("lrw(aes)", DECRYPT, aes_lrw_dec_tv_template,
1233 AES_LRW_DEC_TEST_VECTORS);
1234 test_cipher("xts(aes)", ENCRYPT, aes_xts_enc_tv_template,
1235 AES_XTS_ENC_TEST_VECTORS);
1236 test_cipher("xts(aes)", DECRYPT, aes_xts_dec_tv_template,
1237 AES_XTS_DEC_TEST_VECTORS);
1238 test_cipher("rfc3686(ctr(aes))", ENCRYPT, aes_ctr_enc_tv_template,
1239 AES_CTR_ENC_TEST_VECTORS);
1240 test_cipher("rfc3686(ctr(aes))", DECRYPT, aes_ctr_dec_tv_template,
1241 AES_CTR_DEC_TEST_VECTORS);
1242 test_aead("gcm(aes)", ENCRYPT, aes_gcm_enc_tv_template,
1243 AES_GCM_ENC_TEST_VECTORS);
1244 test_aead("gcm(aes)", DECRYPT, aes_gcm_dec_tv_template,
1245 AES_GCM_DEC_TEST_VECTORS);
1246 test_aead("ccm(aes)", ENCRYPT, aes_ccm_enc_tv_template,
1247 AES_CCM_ENC_TEST_VECTORS);
1248 test_aead("ccm(aes)", DECRYPT, aes_ccm_dec_tv_template,
1249 AES_CCM_DEC_TEST_VECTORS);
1250
1251 //CAST5
1252 test_cipher("ecb(cast5)", ENCRYPT, cast5_enc_tv_template,
1253 CAST5_ENC_TEST_VECTORS);
1254 test_cipher("ecb(cast5)", DECRYPT, cast5_dec_tv_template,
1255 CAST5_DEC_TEST_VECTORS);
1256
1257 //CAST6
1258 test_cipher("ecb(cast6)", ENCRYPT, cast6_enc_tv_template,
1259 CAST6_ENC_TEST_VECTORS);
1260 test_cipher("ecb(cast6)", DECRYPT, cast6_dec_tv_template,
1261 CAST6_DEC_TEST_VECTORS);
1262
1263 //ARC4
1264 test_cipher("ecb(arc4)", ENCRYPT, arc4_enc_tv_template,
1265 ARC4_ENC_TEST_VECTORS);
1266 test_cipher("ecb(arc4)", DECRYPT, arc4_dec_tv_template,
1267 ARC4_DEC_TEST_VECTORS);
1268
1269 //TEA
1270 test_cipher("ecb(tea)", ENCRYPT, tea_enc_tv_template,
1271 TEA_ENC_TEST_VECTORS);
1272 test_cipher("ecb(tea)", DECRYPT, tea_dec_tv_template,
1273 TEA_DEC_TEST_VECTORS);
1274
1275
1276 //XTEA
1277 test_cipher("ecb(xtea)", ENCRYPT, xtea_enc_tv_template,
1278 XTEA_ENC_TEST_VECTORS);
1279 test_cipher("ecb(xtea)", DECRYPT, xtea_dec_tv_template,
1280 XTEA_DEC_TEST_VECTORS);
1281
1282 //KHAZAD
1283 test_cipher("ecb(khazad)", ENCRYPT, khazad_enc_tv_template,
1284 KHAZAD_ENC_TEST_VECTORS);
1285 test_cipher("ecb(khazad)", DECRYPT, khazad_dec_tv_template,
1286 KHAZAD_DEC_TEST_VECTORS);
1287
1288 //ANUBIS
1289 test_cipher("ecb(anubis)", ENCRYPT, anubis_enc_tv_template,
1290 ANUBIS_ENC_TEST_VECTORS);
1291 test_cipher("ecb(anubis)", DECRYPT, anubis_dec_tv_template,
1292 ANUBIS_DEC_TEST_VECTORS);
1293 test_cipher("cbc(anubis)", ENCRYPT, anubis_cbc_enc_tv_template,
1294 ANUBIS_CBC_ENC_TEST_VECTORS);
1295 test_cipher("cbc(anubis)", DECRYPT, anubis_cbc_dec_tv_template,
1296 ANUBIS_CBC_ENC_TEST_VECTORS);
1297
1298 //XETA
1299 test_cipher("ecb(xeta)", ENCRYPT, xeta_enc_tv_template,
1300 XETA_ENC_TEST_VECTORS);
1301 test_cipher("ecb(xeta)", DECRYPT, xeta_dec_tv_template,
1302 XETA_DEC_TEST_VECTORS);
1303
1304 //FCrypt
1305 test_cipher("pcbc(fcrypt)", ENCRYPT, fcrypt_pcbc_enc_tv_template,
1306 FCRYPT_ENC_TEST_VECTORS);
1307 test_cipher("pcbc(fcrypt)", DECRYPT, fcrypt_pcbc_dec_tv_template,
1308 FCRYPT_DEC_TEST_VECTORS);
1309
1310 //CAMELLIA
1311 test_cipher("ecb(camellia)", ENCRYPT,
1312 camellia_enc_tv_template,
1313 CAMELLIA_ENC_TEST_VECTORS);
1314 test_cipher("ecb(camellia)", DECRYPT,
1315 camellia_dec_tv_template,
1316 CAMELLIA_DEC_TEST_VECTORS);
1317 test_cipher("cbc(camellia)", ENCRYPT,
1318 camellia_cbc_enc_tv_template,
1319 CAMELLIA_CBC_ENC_TEST_VECTORS);
1320 test_cipher("cbc(camellia)", DECRYPT,
1321 camellia_cbc_dec_tv_template,
1322 CAMELLIA_CBC_DEC_TEST_VECTORS);
1323
1324 //SEED
1325 test_cipher("ecb(seed)", ENCRYPT, seed_enc_tv_template,
1326 SEED_ENC_TEST_VECTORS);
1327 test_cipher("ecb(seed)", DECRYPT, seed_dec_tv_template,
1328 SEED_DEC_TEST_VECTORS);
1329
1330 //CTS
1331 test_cipher("cts(cbc(aes))", ENCRYPT, cts_mode_enc_tv_template,
1332 CTS_MODE_ENC_TEST_VECTORS);
1333 test_cipher("cts(cbc(aes))", DECRYPT, cts_mode_dec_tv_template,
1334 CTS_MODE_DEC_TEST_VECTORS);
1335
1336 test_hash("sha384", sha384_tv_template, SHA384_TEST_VECTORS);
1337 test_hash("sha512", sha512_tv_template, SHA512_TEST_VECTORS);
1338 test_hash("wp512", wp512_tv_template, WP512_TEST_VECTORS);
1339 test_hash("wp384", wp384_tv_template, WP384_TEST_VECTORS);
1340 test_hash("wp256", wp256_tv_template, WP256_TEST_VECTORS);
1341 test_hash("tgr192", tgr192_tv_template, TGR192_TEST_VECTORS);
1342 test_hash("tgr160", tgr160_tv_template, TGR160_TEST_VECTORS);
1343 test_hash("tgr128", tgr128_tv_template, TGR128_TEST_VECTORS);
1344 test_comp("deflate", deflate_comp_tv_template,
1345 deflate_decomp_tv_template, DEFLATE_COMP_TEST_VECTORS,
1346 DEFLATE_DECOMP_TEST_VECTORS);
1347 test_comp("lzo", lzo_comp_tv_template, lzo_decomp_tv_template,
1348 LZO_COMP_TEST_VECTORS, LZO_DECOMP_TEST_VECTORS);
1349 test_hash("crc32c", crc32c_tv_template, CRC32C_TEST_VECTORS);
1350 test_hash("hmac(md5)", hmac_md5_tv_template,
1351 HMAC_MD5_TEST_VECTORS);
1352 test_hash("hmac(sha1)", hmac_sha1_tv_template,
1353 HMAC_SHA1_TEST_VECTORS);
1354 test_hash("hmac(sha224)", hmac_sha224_tv_template,
1355 HMAC_SHA224_TEST_VECTORS);
1356 test_hash("hmac(sha256)", hmac_sha256_tv_template,
1357 HMAC_SHA256_TEST_VECTORS);
1358 test_hash("hmac(sha384)", hmac_sha384_tv_template,
1359 HMAC_SHA384_TEST_VECTORS);
1360 test_hash("hmac(sha512)", hmac_sha512_tv_template,
1361 HMAC_SHA512_TEST_VECTORS);
1362
1363 test_hash("xcbc(aes)", aes_xcbc128_tv_template,
1364 XCBC_AES_TEST_VECTORS);
1365
1366 test_hash("michael_mic", michael_mic_tv_template, MICHAEL_MIC_TEST_VECTORS);
1367 break; 480 break;
1368 481
1369 case 1: 482 case 1:
1370 test_hash("md5", md5_tv_template, MD5_TEST_VECTORS); 483 tcrypt_test("md5");
1371 break; 484 break;
1372 485
1373 case 2: 486 case 2:
1374 test_hash("sha1", sha1_tv_template, SHA1_TEST_VECTORS); 487 tcrypt_test("sha1");
1375 break; 488 break;
1376 489
1377 case 3: 490 case 3:
1378 test_cipher("ecb(des)", ENCRYPT, des_enc_tv_template, 491 tcrypt_test("ecb(des)");
1379 DES_ENC_TEST_VECTORS); 492 tcrypt_test("cbc(des)");
1380 test_cipher("ecb(des)", DECRYPT, des_dec_tv_template,
1381 DES_DEC_TEST_VECTORS);
1382 test_cipher("cbc(des)", ENCRYPT, des_cbc_enc_tv_template,
1383 DES_CBC_ENC_TEST_VECTORS);
1384 test_cipher("cbc(des)", DECRYPT, des_cbc_dec_tv_template,
1385 DES_CBC_DEC_TEST_VECTORS);
1386 break; 493 break;
1387 494
1388 case 4: 495 case 4:
1389 test_cipher("ecb(des3_ede)", ENCRYPT, des3_ede_enc_tv_template, 496 tcrypt_test("ecb(des3_ede)");
1390 DES3_EDE_ENC_TEST_VECTORS); 497 tcrypt_test("cbc(des3_ede)");
1391 test_cipher("ecb(des3_ede)", DECRYPT, des3_ede_dec_tv_template,
1392 DES3_EDE_DEC_TEST_VECTORS);
1393 break; 498 break;
1394 499
1395 case 5: 500 case 5:
1396 test_hash("md4", md4_tv_template, MD4_TEST_VECTORS); 501 tcrypt_test("md4");
1397 break; 502 break;
1398 503
1399 case 6: 504 case 6:
1400 test_hash("sha256", sha256_tv_template, SHA256_TEST_VECTORS); 505 tcrypt_test("sha256");
1401 break; 506 break;
1402 507
1403 case 7: 508 case 7:
1404 test_cipher("ecb(blowfish)", ENCRYPT, bf_enc_tv_template, 509 tcrypt_test("ecb(blowfish)");
1405 BF_ENC_TEST_VECTORS); 510 tcrypt_test("cbc(blowfish)");
1406 test_cipher("ecb(blowfish)", DECRYPT, bf_dec_tv_template,
1407 BF_DEC_TEST_VECTORS);
1408 test_cipher("cbc(blowfish)", ENCRYPT, bf_cbc_enc_tv_template,
1409 BF_CBC_ENC_TEST_VECTORS);
1410 test_cipher("cbc(blowfish)", DECRYPT, bf_cbc_dec_tv_template,
1411 BF_CBC_DEC_TEST_VECTORS);
1412 break; 511 break;
1413 512
1414 case 8: 513 case 8:
1415 test_cipher("ecb(twofish)", ENCRYPT, tf_enc_tv_template, 514 tcrypt_test("ecb(twofish)");
1416 TF_ENC_TEST_VECTORS); 515 tcrypt_test("cbc(twofish)");
1417 test_cipher("ecb(twofish)", DECRYPT, tf_dec_tv_template,
1418 TF_DEC_TEST_VECTORS);
1419 test_cipher("cbc(twofish)", ENCRYPT, tf_cbc_enc_tv_template,
1420 TF_CBC_ENC_TEST_VECTORS);
1421 test_cipher("cbc(twofish)", DECRYPT, tf_cbc_dec_tv_template,
1422 TF_CBC_DEC_TEST_VECTORS);
1423 break; 516 break;
1424 517
1425 case 9: 518 case 9:
1426 test_cipher("ecb(serpent)", ENCRYPT, serpent_enc_tv_template, 519 tcrypt_test("ecb(serpent)");
1427 SERPENT_ENC_TEST_VECTORS);
1428 test_cipher("ecb(serpent)", DECRYPT, serpent_dec_tv_template,
1429 SERPENT_DEC_TEST_VECTORS);
1430 break; 520 break;
1431 521
1432 case 10: 522 case 10:
1433 test_cipher("ecb(aes)", ENCRYPT, aes_enc_tv_template, 523 tcrypt_test("ecb(aes)");
1434 AES_ENC_TEST_VECTORS); 524 tcrypt_test("cbc(aes)");
1435 test_cipher("ecb(aes)", DECRYPT, aes_dec_tv_template, 525 tcrypt_test("lrw(aes)");
1436 AES_DEC_TEST_VECTORS); 526 tcrypt_test("xts(aes)");
1437 test_cipher("cbc(aes)", ENCRYPT, aes_cbc_enc_tv_template, 527 tcrypt_test("rfc3686(ctr(aes))");
1438 AES_CBC_ENC_TEST_VECTORS);
1439 test_cipher("cbc(aes)", DECRYPT, aes_cbc_dec_tv_template,
1440 AES_CBC_DEC_TEST_VECTORS);
1441 test_cipher("lrw(aes)", ENCRYPT, aes_lrw_enc_tv_template,
1442 AES_LRW_ENC_TEST_VECTORS);
1443 test_cipher("lrw(aes)", DECRYPT, aes_lrw_dec_tv_template,
1444 AES_LRW_DEC_TEST_VECTORS);
1445 test_cipher("xts(aes)", ENCRYPT, aes_xts_enc_tv_template,
1446 AES_XTS_ENC_TEST_VECTORS);
1447 test_cipher("xts(aes)", DECRYPT, aes_xts_dec_tv_template,
1448 AES_XTS_DEC_TEST_VECTORS);
1449 test_cipher("rfc3686(ctr(aes))", ENCRYPT, aes_ctr_enc_tv_template,
1450 AES_CTR_ENC_TEST_VECTORS);
1451 test_cipher("rfc3686(ctr(aes))", DECRYPT, aes_ctr_dec_tv_template,
1452 AES_CTR_DEC_TEST_VECTORS);
1453 break; 528 break;
1454 529
1455 case 11: 530 case 11:
1456 test_hash("sha384", sha384_tv_template, SHA384_TEST_VECTORS); 531 tcrypt_test("sha384");
1457 break; 532 break;
1458 533
1459 case 12: 534 case 12:
1460 test_hash("sha512", sha512_tv_template, SHA512_TEST_VECTORS); 535 tcrypt_test("sha512");
1461 break; 536 break;
1462 537
1463 case 13: 538 case 13:
1464 test_comp("deflate", deflate_comp_tv_template, 539 tcrypt_test("deflate");
1465 deflate_decomp_tv_template, DEFLATE_COMP_TEST_VECTORS,
1466 DEFLATE_DECOMP_TEST_VECTORS);
1467 break; 540 break;
1468 541
1469 case 14: 542 case 14:
1470 test_cipher("ecb(cast5)", ENCRYPT, cast5_enc_tv_template, 543 tcrypt_test("ecb(cast5)");
1471 CAST5_ENC_TEST_VECTORS);
1472 test_cipher("ecb(cast5)", DECRYPT, cast5_dec_tv_template,
1473 CAST5_DEC_TEST_VECTORS);
1474 break; 544 break;
1475 545
1476 case 15: 546 case 15:
1477 test_cipher("ecb(cast6)", ENCRYPT, cast6_enc_tv_template, 547 tcrypt_test("ecb(cast6)");
1478 CAST6_ENC_TEST_VECTORS);
1479 test_cipher("ecb(cast6)", DECRYPT, cast6_dec_tv_template,
1480 CAST6_DEC_TEST_VECTORS);
1481 break; 548 break;
1482 549
1483 case 16: 550 case 16:
1484 test_cipher("ecb(arc4)", ENCRYPT, arc4_enc_tv_template, 551 tcrypt_test("ecb(arc4)");
1485 ARC4_ENC_TEST_VECTORS);
1486 test_cipher("ecb(arc4)", DECRYPT, arc4_dec_tv_template,
1487 ARC4_DEC_TEST_VECTORS);
1488 break; 552 break;
1489 553
1490 case 17: 554 case 17:
1491 test_hash("michael_mic", michael_mic_tv_template, MICHAEL_MIC_TEST_VECTORS); 555 tcrypt_test("michael_mic");
1492 break; 556 break;
1493 557
1494 case 18: 558 case 18:
1495 test_hash("crc32c", crc32c_tv_template, CRC32C_TEST_VECTORS); 559 tcrypt_test("crc32c");
1496 break; 560 break;
1497 561
1498 case 19: 562 case 19:
1499 test_cipher("ecb(tea)", ENCRYPT, tea_enc_tv_template, 563 tcrypt_test("ecb(tea)");
1500 TEA_ENC_TEST_VECTORS);
1501 test_cipher("ecb(tea)", DECRYPT, tea_dec_tv_template,
1502 TEA_DEC_TEST_VECTORS);
1503 break; 564 break;
1504 565
1505 case 20: 566 case 20:
1506 test_cipher("ecb(xtea)", ENCRYPT, xtea_enc_tv_template, 567 tcrypt_test("ecb(xtea)");
1507 XTEA_ENC_TEST_VECTORS);
1508 test_cipher("ecb(xtea)", DECRYPT, xtea_dec_tv_template,
1509 XTEA_DEC_TEST_VECTORS);
1510 break; 568 break;
1511 569
1512 case 21: 570 case 21:
1513 test_cipher("ecb(khazad)", ENCRYPT, khazad_enc_tv_template, 571 tcrypt_test("ecb(khazad)");
1514 KHAZAD_ENC_TEST_VECTORS);
1515 test_cipher("ecb(khazad)", DECRYPT, khazad_dec_tv_template,
1516 KHAZAD_DEC_TEST_VECTORS);
1517 break; 572 break;
1518 573
1519 case 22: 574 case 22:
1520 test_hash("wp512", wp512_tv_template, WP512_TEST_VECTORS); 575 tcrypt_test("wp512");
1521 break; 576 break;
1522 577
1523 case 23: 578 case 23:
1524 test_hash("wp384", wp384_tv_template, WP384_TEST_VECTORS); 579 tcrypt_test("wp384");
1525 break; 580 break;
1526 581
1527 case 24: 582 case 24:
1528 test_hash("wp256", wp256_tv_template, WP256_TEST_VECTORS); 583 tcrypt_test("wp256");
1529 break; 584 break;
1530 585
1531 case 25: 586 case 25:
1532 test_cipher("ecb(tnepres)", ENCRYPT, tnepres_enc_tv_template, 587 tcrypt_test("ecb(tnepres)");
1533 TNEPRES_ENC_TEST_VECTORS);
1534 test_cipher("ecb(tnepres)", DECRYPT, tnepres_dec_tv_template,
1535 TNEPRES_DEC_TEST_VECTORS);
1536 break; 588 break;
1537 589
1538 case 26: 590 case 26:
1539 test_cipher("ecb(anubis)", ENCRYPT, anubis_enc_tv_template, 591 tcrypt_test("ecb(anubis)");
1540 ANUBIS_ENC_TEST_VECTORS); 592 tcrypt_test("cbc(anubis)");
1541 test_cipher("ecb(anubis)", DECRYPT, anubis_dec_tv_template,
1542 ANUBIS_DEC_TEST_VECTORS);
1543 test_cipher("cbc(anubis)", ENCRYPT, anubis_cbc_enc_tv_template,
1544 ANUBIS_CBC_ENC_TEST_VECTORS);
1545 test_cipher("cbc(anubis)", DECRYPT, anubis_cbc_dec_tv_template,
1546 ANUBIS_CBC_ENC_TEST_VECTORS);
1547 break; 593 break;
1548 594
1549 case 27: 595 case 27:
1550 test_hash("tgr192", tgr192_tv_template, TGR192_TEST_VECTORS); 596 tcrypt_test("tgr192");
1551 break; 597 break;
1552 598
1553 case 28: 599 case 28:
1554 600
1555 test_hash("tgr160", tgr160_tv_template, TGR160_TEST_VECTORS); 601 tcrypt_test("tgr160");
1556 break; 602 break;
1557 603
1558 case 29: 604 case 29:
1559 test_hash("tgr128", tgr128_tv_template, TGR128_TEST_VECTORS); 605 tcrypt_test("tgr128");
1560 break; 606 break;
1561 607
1562 case 30: 608 case 30:
1563 test_cipher("ecb(xeta)", ENCRYPT, xeta_enc_tv_template, 609 tcrypt_test("ecb(xeta)");
1564 XETA_ENC_TEST_VECTORS);
1565 test_cipher("ecb(xeta)", DECRYPT, xeta_dec_tv_template,
1566 XETA_DEC_TEST_VECTORS);
1567 break; 610 break;
1568 611
1569 case 31: 612 case 31:
1570 test_cipher("pcbc(fcrypt)", ENCRYPT, fcrypt_pcbc_enc_tv_template, 613 tcrypt_test("pcbc(fcrypt)");
1571 FCRYPT_ENC_TEST_VECTORS);
1572 test_cipher("pcbc(fcrypt)", DECRYPT, fcrypt_pcbc_dec_tv_template,
1573 FCRYPT_DEC_TEST_VECTORS);
1574 break; 614 break;
1575 615
1576 case 32: 616 case 32:
1577 test_cipher("ecb(camellia)", ENCRYPT, 617 tcrypt_test("ecb(camellia)");
1578 camellia_enc_tv_template, 618 tcrypt_test("cbc(camellia)");
1579 CAMELLIA_ENC_TEST_VECTORS);
1580 test_cipher("ecb(camellia)", DECRYPT,
1581 camellia_dec_tv_template,
1582 CAMELLIA_DEC_TEST_VECTORS);
1583 test_cipher("cbc(camellia)", ENCRYPT,
1584 camellia_cbc_enc_tv_template,
1585 CAMELLIA_CBC_ENC_TEST_VECTORS);
1586 test_cipher("cbc(camellia)", DECRYPT,
1587 camellia_cbc_dec_tv_template,
1588 CAMELLIA_CBC_DEC_TEST_VECTORS);
1589 break; 619 break;
1590 case 33: 620 case 33:
1591 test_hash("sha224", sha224_tv_template, SHA224_TEST_VECTORS); 621 tcrypt_test("sha224");
1592 break; 622 break;
1593 623
1594 case 34: 624 case 34:
1595 test_cipher("salsa20", ENCRYPT, 625 tcrypt_test("salsa20");
1596 salsa20_stream_enc_tv_template,
1597 SALSA20_STREAM_ENC_TEST_VECTORS);
1598 break; 626 break;
1599 627
1600 case 35: 628 case 35:
1601 test_aead("gcm(aes)", ENCRYPT, aes_gcm_enc_tv_template, 629 tcrypt_test("gcm(aes)");
1602 AES_GCM_ENC_TEST_VECTORS);
1603 test_aead("gcm(aes)", DECRYPT, aes_gcm_dec_tv_template,
1604 AES_GCM_DEC_TEST_VECTORS);
1605 break; 630 break;
1606 631
1607 case 36: 632 case 36:
1608 test_comp("lzo", lzo_comp_tv_template, lzo_decomp_tv_template, 633 tcrypt_test("lzo");
1609 LZO_COMP_TEST_VECTORS, LZO_DECOMP_TEST_VECTORS);
1610 break; 634 break;
1611 635
1612 case 37: 636 case 37:
1613 test_aead("ccm(aes)", ENCRYPT, aes_ccm_enc_tv_template, 637 tcrypt_test("ccm(aes)");
1614 AES_CCM_ENC_TEST_VECTORS);
1615 test_aead("ccm(aes)", DECRYPT, aes_ccm_dec_tv_template,
1616 AES_CCM_DEC_TEST_VECTORS);
1617 break; 638 break;
1618 639
1619 case 38: 640 case 38:
1620 test_cipher("cts(cbc(aes))", ENCRYPT, cts_mode_enc_tv_template, 641 tcrypt_test("cts(cbc(aes))");
1621 CTS_MODE_ENC_TEST_VECTORS); 642 break;
1622 test_cipher("cts(cbc(aes))", DECRYPT, cts_mode_dec_tv_template, 643
1623 CTS_MODE_DEC_TEST_VECTORS); 644 case 39:
645 tcrypt_test("rmd128");
646 break;
647
648 case 40:
649 tcrypt_test("rmd160");
650 break;
651
652 case 41:
653 tcrypt_test("rmd256");
654 break;
655
656 case 42:
657 tcrypt_test("rmd320");
658 break;
659
660 case 43:
661 tcrypt_test("ecb(seed)");
1624 break; 662 break;
1625 663
1626 case 100: 664 case 100:
1627 test_hash("hmac(md5)", hmac_md5_tv_template, 665 tcrypt_test("hmac(md5)");
1628 HMAC_MD5_TEST_VECTORS);
1629 break; 666 break;
1630 667
1631 case 101: 668 case 101:
1632 test_hash("hmac(sha1)", hmac_sha1_tv_template, 669 tcrypt_test("hmac(sha1)");
1633 HMAC_SHA1_TEST_VECTORS);
1634 break; 670 break;
1635 671
1636 case 102: 672 case 102:
1637 test_hash("hmac(sha256)", hmac_sha256_tv_template, 673 tcrypt_test("hmac(sha256)");
1638 HMAC_SHA256_TEST_VECTORS);
1639 break; 674 break;
1640 675
1641 case 103: 676 case 103:
1642 test_hash("hmac(sha384)", hmac_sha384_tv_template, 677 tcrypt_test("hmac(sha384)");
1643 HMAC_SHA384_TEST_VECTORS);
1644 break; 678 break;
1645 679
1646 case 104: 680 case 104:
1647 test_hash("hmac(sha512)", hmac_sha512_tv_template, 681 tcrypt_test("hmac(sha512)");
1648 HMAC_SHA512_TEST_VECTORS);
1649 break; 682 break;
1650 683
1651 case 105: 684 case 105:
1652 test_hash("hmac(sha224)", hmac_sha224_tv_template, 685 tcrypt_test("hmac(sha224)");
1653 HMAC_SHA224_TEST_VECTORS);
1654 break; 686 break;
1655 687
1656 case 106: 688 case 106:
1657 test_hash("xcbc(aes)", aes_xcbc128_tv_template, 689 tcrypt_test("xcbc(aes)");
1658 XCBC_AES_TEST_VECTORS); 690 break;
691
692 case 107:
693 tcrypt_test("hmac(rmd128)");
694 break;
695
696 case 108:
697 tcrypt_test("hmac(rmd160)");
1659 break; 698 break;
1660 699
1661 case 200: 700 case 200:
@@ -1679,16 +718,16 @@ static void do_test(void)
1679 718
1680 case 201: 719 case 201:
1681 test_cipher_speed("ecb(des3_ede)", ENCRYPT, sec, 720 test_cipher_speed("ecb(des3_ede)", ENCRYPT, sec,
1682 des3_ede_enc_tv_template, DES3_EDE_ENC_TEST_VECTORS, 721 des3_speed_template, DES3_SPEED_VECTORS,
1683 speed_template_24); 722 speed_template_24);
1684 test_cipher_speed("ecb(des3_ede)", DECRYPT, sec, 723 test_cipher_speed("ecb(des3_ede)", DECRYPT, sec,
1685 des3_ede_enc_tv_template, DES3_EDE_ENC_TEST_VECTORS, 724 des3_speed_template, DES3_SPEED_VECTORS,
1686 speed_template_24); 725 speed_template_24);
1687 test_cipher_speed("cbc(des3_ede)", ENCRYPT, sec, 726 test_cipher_speed("cbc(des3_ede)", ENCRYPT, sec,
1688 des3_ede_enc_tv_template, DES3_EDE_ENC_TEST_VECTORS, 727 des3_speed_template, DES3_SPEED_VECTORS,
1689 speed_template_24); 728 speed_template_24);
1690 test_cipher_speed("cbc(des3_ede)", DECRYPT, sec, 729 test_cipher_speed("cbc(des3_ede)", DECRYPT, sec,
1691 des3_ede_enc_tv_template, DES3_EDE_ENC_TEST_VECTORS, 730 des3_speed_template, DES3_SPEED_VECTORS,
1692 speed_template_24); 731 speed_template_24);
1693 break; 732 break;
1694 733
@@ -1796,37 +835,43 @@ static void do_test(void)
1796 test_hash_speed("sha224", sec, generic_hash_speed_template); 835 test_hash_speed("sha224", sec, generic_hash_speed_template);
1797 if (mode > 300 && mode < 400) break; 836 if (mode > 300 && mode < 400) break;
1798 837
838 case 314:
839 test_hash_speed("rmd128", sec, generic_hash_speed_template);
840 if (mode > 300 && mode < 400) break;
841
842 case 315:
843 test_hash_speed("rmd160", sec, generic_hash_speed_template);
844 if (mode > 300 && mode < 400) break;
845
846 case 316:
847 test_hash_speed("rmd256", sec, generic_hash_speed_template);
848 if (mode > 300 && mode < 400) break;
849
850 case 317:
851 test_hash_speed("rmd320", sec, generic_hash_speed_template);
852 if (mode > 300 && mode < 400) break;
853
1799 case 399: 854 case 399:
1800 break; 855 break;
1801 856
1802 case 1000: 857 case 1000:
1803 test_available(); 858 test_available();
1804 break; 859 break;
1805
1806 default:
1807 /* useful for debugging */
1808 printk("not testing anything\n");
1809 break;
1810 } 860 }
1811} 861}
1812 862
1813static int __init tcrypt_mod_init(void) 863static int __init tcrypt_mod_init(void)
1814{ 864{
1815 int err = -ENOMEM; 865 int err = -ENOMEM;
866 int i;
1816 867
1817 tvmem = kmalloc(TVMEMSIZE, GFP_KERNEL); 868 for (i = 0; i < TVMEMSIZE; i++) {
1818 if (tvmem == NULL) 869 tvmem[i] = (void *)__get_free_page(GFP_KERNEL);
1819 return err; 870 if (!tvmem[i])
1820 871 goto err_free_tv;
1821 xbuf = kmalloc(XBUFSIZE, GFP_KERNEL); 872 }
1822 if (xbuf == NULL)
1823 goto err_free_tv;
1824
1825 axbuf = kmalloc(XBUFSIZE, GFP_KERNEL);
1826 if (axbuf == NULL)
1827 goto err_free_xbuf;
1828 873
1829 do_test(); 874 do_test(mode);
1830 875
1831 /* We intentionaly return -EAGAIN to prevent keeping 876 /* We intentionaly return -EAGAIN to prevent keeping
1832 * the module. It does all its work from init() 877 * the module. It does all its work from init()
@@ -1836,11 +881,9 @@ static int __init tcrypt_mod_init(void)
1836 */ 881 */
1837 err = -EAGAIN; 882 err = -EAGAIN;
1838 883
1839 kfree(axbuf); 884err_free_tv:
1840 err_free_xbuf: 885 for (i = 0; i < TVMEMSIZE && tvmem[i]; i++)
1841 kfree(xbuf); 886 free_page((unsigned long)tvmem[i]);
1842 err_free_tv:
1843 kfree(tvmem);
1844 887
1845 return err; 888 return err;
1846} 889}
diff --git a/crypto/tcrypt.h b/crypto/tcrypt.h
index 47bc0ecb8978..966bbfaf95b1 100644
--- a/crypto/tcrypt.h
+++ b/crypto/tcrypt.h
@@ -13,63 +13,13 @@
13 * 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)
14 * any later version. 14 * any later version.
15 * 15 *
16 * 2007-11-13 Added GCM tests
17 * 2007-11-13 Added AEAD support
18 * 2006-12-07 Added SHA384 HMAC and SHA512 HMAC tests
19 * 2004-08-09 Cipher speed tests by Reyk Floeter <reyk@vantronix.net>
20 * 2003-09-14 Changes by Kartikey Mahendra Bhatt
21 *
22 */ 16 */
23#ifndef _CRYPTO_TCRYPT_H 17#ifndef _CRYPTO_TCRYPT_H
24#define _CRYPTO_TCRYPT_H 18#define _CRYPTO_TCRYPT_H
25 19
26#define MAX_DIGEST_SIZE 64 20struct cipher_speed_template {
27#define MAX_TAP 8 21 const char *key;
28 22 unsigned int klen;
29#define MAX_KEYLEN 56
30#define MAX_IVLEN 32
31
32struct hash_testvec {
33 /* only used with keyed hash algorithms */
34 char *key;
35 char *plaintext;
36 char *digest;
37 unsigned char tap[MAX_TAP];
38 unsigned char psize;
39 unsigned char np;
40 unsigned char ksize;
41};
42
43struct cipher_testvec {
44 char *key;
45 char *iv;
46 char *input;
47 char *result;
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
57struct aead_testvec {
58 char *key;
59 char *iv;
60 char *input;
61 char *assoc;
62 char *result;
63 unsigned char tap[MAX_TAP];
64 unsigned char atap[MAX_TAP];
65 int np;
66 int anp;
67 unsigned char fail;
68 unsigned char wk; /* weak key flag */
69 unsigned char klen;
70 unsigned short ilen;
71 unsigned short alen;
72 unsigned short rlen;
73}; 23};
74 24
75struct hash_speed { 25struct hash_speed {
@@ -77,8160 +27,21 @@ struct hash_speed {
77 unsigned int plen; /* per-update length */ 27 unsigned int plen; /* per-update length */
78}; 28};
79 29
80static char zeroed_string[48];
81
82/*
83 * MD4 test vectors from RFC1320
84 */
85#define MD4_TEST_VECTORS 7
86
87static struct hash_testvec md4_tv_template [] = {
88 {
89 .plaintext = "",
90 .digest = "\x31\xd6\xcf\xe0\xd1\x6a\xe9\x31"
91 "\xb7\x3c\x59\xd7\xe0\xc0\x89\xc0",
92 }, {
93 .plaintext = "a",
94 .psize = 1,
95 .digest = "\xbd\xe5\x2c\xb3\x1d\xe3\x3e\x46"
96 "\x24\x5e\x05\xfb\xdb\xd6\xfb\x24",
97 }, {
98 .plaintext = "abc",
99 .psize = 3,
100 .digest = "\xa4\x48\x01\x7a\xaf\x21\xd8\x52"
101 "\x5f\xc1\x0a\xe8\x7a\xa6\x72\x9d",
102 }, {
103 .plaintext = "message digest",
104 .psize = 14,
105 .digest = "\xd9\x13\x0a\x81\x64\x54\x9f\xe8"
106 "\x18\x87\x48\x06\xe1\xc7\x01\x4b",
107 }, {
108 .plaintext = "abcdefghijklmnopqrstuvwxyz",
109 .psize = 26,
110 .digest = "\xd7\x9e\x1c\x30\x8a\xa5\xbb\xcd"
111 "\xee\xa8\xed\x63\xdf\x41\x2d\xa9",
112 .np = 2,
113 .tap = { 13, 13 },
114 }, {
115 .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
116 .psize = 62,
117 .digest = "\x04\x3f\x85\x82\xf2\x41\xdb\x35"
118 "\x1c\xe6\x27\xe1\x53\xe7\xf0\xe4",
119 }, {
120 .plaintext = "123456789012345678901234567890123456789012345678901234567890123"
121 "45678901234567890",
122 .psize = 80,
123 .digest = "\xe3\x3b\x4d\xdc\x9c\x38\xf2\x19"
124 "\x9c\x3e\x7b\x16\x4f\xcc\x05\x36",
125 },
126};
127
128/*
129 * MD5 test vectors from RFC1321
130 */
131#define MD5_TEST_VECTORS 7
132
133static struct hash_testvec md5_tv_template[] = {
134 {
135 .digest = "\xd4\x1d\x8c\xd9\x8f\x00\xb2\x04"
136 "\xe9\x80\x09\x98\xec\xf8\x42\x7e",
137 }, {
138 .plaintext = "a",
139 .psize = 1,
140 .digest = "\x0c\xc1\x75\xb9\xc0\xf1\xb6\xa8"
141 "\x31\xc3\x99\xe2\x69\x77\x26\x61",
142 }, {
143 .plaintext = "abc",
144 .psize = 3,
145 .digest = "\x90\x01\x50\x98\x3c\xd2\x4f\xb0"
146 "\xd6\x96\x3f\x7d\x28\xe1\x7f\x72",
147 }, {
148 .plaintext = "message digest",
149 .psize = 14,
150 .digest = "\xf9\x6b\x69\x7d\x7c\xb7\x93\x8d"
151 "\x52\x5a\x2f\x31\xaa\xf1\x61\xd0",
152 }, {
153 .plaintext = "abcdefghijklmnopqrstuvwxyz",
154 .psize = 26,
155 .digest = "\xc3\xfc\xd3\xd7\x61\x92\xe4\x00"
156 "\x7d\xfb\x49\x6c\xca\x67\xe1\x3b",
157 .np = 2,
158 .tap = {13, 13}
159 }, {
160 .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
161 .psize = 62,
162 .digest = "\xd1\x74\xab\x98\xd2\x77\xd9\xf5"
163 "\xa5\x61\x1c\x2c\x9f\x41\x9d\x9f",
164 }, {
165 .plaintext = "12345678901234567890123456789012345678901234567890123456789012"
166 "345678901234567890",
167 .psize = 80,
168 .digest = "\x57\xed\xf4\xa2\x2b\xe3\xc9\x55"
169 "\xac\x49\xda\x2e\x21\x07\xb6\x7a",
170 }
171};
172
173/*
174 * SHA1 test vectors from from FIPS PUB 180-1
175 */
176#define SHA1_TEST_VECTORS 2
177
178static struct hash_testvec sha1_tv_template[] = {
179 {
180 .plaintext = "abc",
181 .psize = 3,
182 .digest = "\xa9\x99\x3e\x36\x47\x06\x81\x6a\xba\x3e"
183 "\x25\x71\x78\x50\xc2\x6c\x9c\xd0\xd8\x9d",
184 }, {
185 .plaintext = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
186 .psize = 56,
187 .digest = "\x84\x98\x3e\x44\x1c\x3b\xd2\x6e\xba\xae"
188 "\x4a\xa1\xf9\x51\x29\xe5\xe5\x46\x70\xf1",
189 .np = 2,
190 .tap = { 28, 28 }
191 }
192};
193
194
195/*
196 * SHA224 test vectors from from FIPS PUB 180-2
197 */
198#define SHA224_TEST_VECTORS 2
199
200static struct hash_testvec sha224_tv_template[] = {
201 {
202 .plaintext = "abc",
203 .psize = 3,
204 .digest = "\x23\x09\x7D\x22\x34\x05\xD8\x22"
205 "\x86\x42\xA4\x77\xBD\xA2\x55\xB3"
206 "\x2A\xAD\xBC\xE4\xBD\xA0\xB3\xF7"
207 "\xE3\x6C\x9D\xA7",
208 }, {
209 .plaintext =
210 "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
211 .psize = 56,
212 .digest = "\x75\x38\x8B\x16\x51\x27\x76\xCC"
213 "\x5D\xBA\x5D\xA1\xFD\x89\x01\x50"
214 "\xB0\xC6\x45\x5C\xB4\xF5\x8B\x19"
215 "\x52\x52\x25\x25",
216 .np = 2,
217 .tap = { 28, 28 }
218 }
219};
220
221/*
222 * SHA256 test vectors from from NIST
223 */
224#define SHA256_TEST_VECTORS 2
225
226static struct hash_testvec sha256_tv_template[] = {
227 {
228 .plaintext = "abc",
229 .psize = 3,
230 .digest = "\xba\x78\x16\xbf\x8f\x01\xcf\xea"
231 "\x41\x41\x40\xde\x5d\xae\x22\x23"
232 "\xb0\x03\x61\xa3\x96\x17\x7a\x9c"
233 "\xb4\x10\xff\x61\xf2\x00\x15\xad",
234 }, {
235 .plaintext = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
236 .psize = 56,
237 .digest = "\x24\x8d\x6a\x61\xd2\x06\x38\xb8"
238 "\xe5\xc0\x26\x93\x0c\x3e\x60\x39"
239 "\xa3\x3c\xe4\x59\x64\xff\x21\x67"
240 "\xf6\xec\xed\xd4\x19\xdb\x06\xc1",
241 .np = 2,
242 .tap = { 28, 28 }
243 },
244};
245
246/*
247 * SHA384 test vectors from from NIST and kerneli
248 */
249#define SHA384_TEST_VECTORS 4
250
251static struct hash_testvec sha384_tv_template[] = {
252 {
253 .plaintext= "abc",
254 .psize = 3,
255 .digest = "\xcb\x00\x75\x3f\x45\xa3\x5e\x8b"
256 "\xb5\xa0\x3d\x69\x9a\xc6\x50\x07"
257 "\x27\x2c\x32\xab\x0e\xde\xd1\x63"
258 "\x1a\x8b\x60\x5a\x43\xff\x5b\xed"
259 "\x80\x86\x07\x2b\xa1\xe7\xcc\x23"
260 "\x58\xba\xec\xa1\x34\xc8\x25\xa7",
261 }, {
262 .plaintext = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
263 .psize = 56,
264 .digest = "\x33\x91\xfd\xdd\xfc\x8d\xc7\x39"
265 "\x37\x07\xa6\x5b\x1b\x47\x09\x39"
266 "\x7c\xf8\xb1\xd1\x62\xaf\x05\xab"
267 "\xfe\x8f\x45\x0d\xe5\xf3\x6b\xc6"
268 "\xb0\x45\x5a\x85\x20\xbc\x4e\x6f"
269 "\x5f\xe9\x5b\x1f\xe3\xc8\x45\x2b",
270 }, {
271 .plaintext = "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn"
272 "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu",
273 .psize = 112,
274 .digest = "\x09\x33\x0c\x33\xf7\x11\x47\xe8"
275 "\x3d\x19\x2f\xc7\x82\xcd\x1b\x47"
276 "\x53\x11\x1b\x17\x3b\x3b\x05\xd2"
277 "\x2f\xa0\x80\x86\xe3\xb0\xf7\x12"
278 "\xfc\xc7\xc7\x1a\x55\x7e\x2d\xb9"
279 "\x66\xc3\xe9\xfa\x91\x74\x60\x39",
280 }, {
281 .plaintext = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd"
282 "efghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz",
283 .psize = 104,
284 .digest = "\x3d\x20\x89\x73\xab\x35\x08\xdb"
285 "\xbd\x7e\x2c\x28\x62\xba\x29\x0a"
286 "\xd3\x01\x0e\x49\x78\xc1\x98\xdc"
287 "\x4d\x8f\xd0\x14\xe5\x82\x82\x3a"
288 "\x89\xe1\x6f\x9b\x2a\x7b\xbc\x1a"
289 "\xc9\x38\xe2\xd1\x99\xe8\xbe\xa4",
290 .np = 4,
291 .tap = { 26, 26, 26, 26 }
292 },
293};
294
295/*
296 * SHA512 test vectors from from NIST and kerneli
297 */
298#define SHA512_TEST_VECTORS 4
299
300static struct hash_testvec sha512_tv_template[] = {
301 {
302 .plaintext = "abc",
303 .psize = 3,
304 .digest = "\xdd\xaf\x35\xa1\x93\x61\x7a\xba"
305 "\xcc\x41\x73\x49\xae\x20\x41\x31"
306 "\x12\xe6\xfa\x4e\x89\xa9\x7e\xa2"
307 "\x0a\x9e\xee\xe6\x4b\x55\xd3\x9a"
308 "\x21\x92\x99\x2a\x27\x4f\xc1\xa8"
309 "\x36\xba\x3c\x23\xa3\xfe\xeb\xbd"
310 "\x45\x4d\x44\x23\x64\x3c\xe8\x0e"
311 "\x2a\x9a\xc9\x4f\xa5\x4c\xa4\x9f",
312 }, {
313 .plaintext = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
314 .psize = 56,
315 .digest = "\x20\x4a\x8f\xc6\xdd\xa8\x2f\x0a"
316 "\x0c\xed\x7b\xeb\x8e\x08\xa4\x16"
317 "\x57\xc1\x6e\xf4\x68\xb2\x28\xa8"
318 "\x27\x9b\xe3\x31\xa7\x03\xc3\x35"
319 "\x96\xfd\x15\xc1\x3b\x1b\x07\xf9"
320 "\xaa\x1d\x3b\xea\x57\x78\x9c\xa0"
321 "\x31\xad\x85\xc7\xa7\x1d\xd7\x03"
322 "\x54\xec\x63\x12\x38\xca\x34\x45",
323 }, {
324 .plaintext = "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn"
325 "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu",
326 .psize = 112,
327 .digest = "\x8e\x95\x9b\x75\xda\xe3\x13\xda"
328 "\x8c\xf4\xf7\x28\x14\xfc\x14\x3f"
329 "\x8f\x77\x79\xc6\xeb\x9f\x7f\xa1"
330 "\x72\x99\xae\xad\xb6\x88\x90\x18"
331 "\x50\x1d\x28\x9e\x49\x00\xf7\xe4"
332 "\x33\x1b\x99\xde\xc4\xb5\x43\x3a"
333 "\xc7\xd3\x29\xee\xb6\xdd\x26\x54"
334 "\x5e\x96\xe5\x5b\x87\x4b\xe9\x09",
335 }, {
336 .plaintext = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd"
337 "efghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz",
338 .psize = 104,
339 .digest = "\x93\x0d\x0c\xef\xcb\x30\xff\x11"
340 "\x33\xb6\x89\x81\x21\xf1\xcf\x3d"
341 "\x27\x57\x8a\xfc\xaf\xe8\x67\x7c"
342 "\x52\x57\xcf\x06\x99\x11\xf7\x5d"
343 "\x8f\x58\x31\xb5\x6e\xbf\xda\x67"
344 "\xb2\x78\xe6\x6d\xff\x8b\x84\xfe"
345 "\x2b\x28\x70\xf7\x42\xa5\x80\xd8"
346 "\xed\xb4\x19\x87\x23\x28\x50\xc9",
347 .np = 4,
348 .tap = { 26, 26, 26, 26 }
349 },
350};
351
352
353/*
354 * WHIRLPOOL test vectors from Whirlpool package
355 * by Vincent Rijmen and Paulo S. L. M. Barreto as part of the NESSIE
356 * submission
357 */
358#define WP512_TEST_VECTORS 8
359
360static struct hash_testvec wp512_tv_template[] = {
361 {
362 .plaintext = "",
363 .psize = 0,
364 .digest = "\x19\xFA\x61\xD7\x55\x22\xA4\x66"
365 "\x9B\x44\xE3\x9C\x1D\x2E\x17\x26"
366 "\xC5\x30\x23\x21\x30\xD4\x07\xF8"
367 "\x9A\xFE\xE0\x96\x49\x97\xF7\xA7"
368 "\x3E\x83\xBE\x69\x8B\x28\x8F\xEB"
369 "\xCF\x88\xE3\xE0\x3C\x4F\x07\x57"
370 "\xEA\x89\x64\xE5\x9B\x63\xD9\x37"
371 "\x08\xB1\x38\xCC\x42\xA6\x6E\xB3",
372
373
374 }, {
375 .plaintext = "a",
376 .psize = 1,
377 .digest = "\x8A\xCA\x26\x02\x79\x2A\xEC\x6F"
378 "\x11\xA6\x72\x06\x53\x1F\xB7\xD7"
379 "\xF0\xDF\xF5\x94\x13\x14\x5E\x69"
380 "\x73\xC4\x50\x01\xD0\x08\x7B\x42"
381 "\xD1\x1B\xC6\x45\x41\x3A\xEF\xF6"
382 "\x3A\x42\x39\x1A\x39\x14\x5A\x59"
383 "\x1A\x92\x20\x0D\x56\x01\x95\xE5"
384 "\x3B\x47\x85\x84\xFD\xAE\x23\x1A",
385 }, {
386 .plaintext = "abc",
387 .psize = 3,
388 .digest = "\x4E\x24\x48\xA4\xC6\xF4\x86\xBB"
389 "\x16\xB6\x56\x2C\x73\xB4\x02\x0B"
390 "\xF3\x04\x3E\x3A\x73\x1B\xCE\x72"
391 "\x1A\xE1\xB3\x03\xD9\x7E\x6D\x4C"
392 "\x71\x81\xEE\xBD\xB6\xC5\x7E\x27"
393 "\x7D\x0E\x34\x95\x71\x14\xCB\xD6"
394 "\xC7\x97\xFC\x9D\x95\xD8\xB5\x82"
395 "\xD2\x25\x29\x20\x76\xD4\xEE\xF5",
396 }, {
397 .plaintext = "message digest",
398 .psize = 14,
399 .digest = "\x37\x8C\x84\xA4\x12\x6E\x2D\xC6"
400 "\xE5\x6D\xCC\x74\x58\x37\x7A\xAC"
401 "\x83\x8D\x00\x03\x22\x30\xF5\x3C"
402 "\xE1\xF5\x70\x0C\x0F\xFB\x4D\x3B"
403 "\x84\x21\x55\x76\x59\xEF\x55\xC1"
404 "\x06\xB4\xB5\x2A\xC5\xA4\xAA\xA6"
405 "\x92\xED\x92\x00\x52\x83\x8F\x33"
406 "\x62\xE8\x6D\xBD\x37\xA8\x90\x3E",
407 }, {
408 .plaintext = "abcdefghijklmnopqrstuvwxyz",
409 .psize = 26,
410 .digest = "\xF1\xD7\x54\x66\x26\x36\xFF\xE9"
411 "\x2C\x82\xEB\xB9\x21\x2A\x48\x4A"
412 "\x8D\x38\x63\x1E\xAD\x42\x38\xF5"
413 "\x44\x2E\xE1\x3B\x80\x54\xE4\x1B"
414 "\x08\xBF\x2A\x92\x51\xC3\x0B\x6A"
415 "\x0B\x8A\xAE\x86\x17\x7A\xB4\xA6"
416 "\xF6\x8F\x67\x3E\x72\x07\x86\x5D"
417 "\x5D\x98\x19\xA3\xDB\xA4\xEB\x3B",
418 }, {
419 .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
420 "abcdefghijklmnopqrstuvwxyz0123456789",
421 .psize = 62,
422 .digest = "\xDC\x37\xE0\x08\xCF\x9E\xE6\x9B"
423 "\xF1\x1F\x00\xED\x9A\xBA\x26\x90"
424 "\x1D\xD7\xC2\x8C\xDE\xC0\x66\xCC"
425 "\x6A\xF4\x2E\x40\xF8\x2F\x3A\x1E"
426 "\x08\xEB\xA2\x66\x29\x12\x9D\x8F"
427 "\xB7\xCB\x57\x21\x1B\x92\x81\xA6"
428 "\x55\x17\xCC\x87\x9D\x7B\x96\x21"
429 "\x42\xC6\x5F\x5A\x7A\xF0\x14\x67",
430 }, {
431 .plaintext = "1234567890123456789012345678901234567890"
432 "1234567890123456789012345678901234567890",
433 .psize = 80,
434 .digest = "\x46\x6E\xF1\x8B\xAB\xB0\x15\x4D"
435 "\x25\xB9\xD3\x8A\x64\x14\xF5\xC0"
436 "\x87\x84\x37\x2B\xCC\xB2\x04\xD6"
437 "\x54\x9C\x4A\xFA\xDB\x60\x14\x29"
438 "\x4D\x5B\xD8\xDF\x2A\x6C\x44\xE5"
439 "\x38\xCD\x04\x7B\x26\x81\xA5\x1A"
440 "\x2C\x60\x48\x1E\x88\xC5\xA2\x0B"
441 "\x2C\x2A\x80\xCF\x3A\x9A\x08\x3B",
442 }, {
443 .plaintext = "abcdbcdecdefdefgefghfghighijhijk",
444 .psize = 32,
445 .digest = "\x2A\x98\x7E\xA4\x0F\x91\x70\x61"
446 "\xF5\xD6\xF0\xA0\xE4\x64\x4F\x48"
447 "\x8A\x7A\x5A\x52\xDE\xEE\x65\x62"
448 "\x07\xC5\x62\xF9\x88\xE9\x5C\x69"
449 "\x16\xBD\xC8\x03\x1B\xC5\xBE\x1B"
450 "\x7B\x94\x76\x39\xFE\x05\x0B\x56"
451 "\x93\x9B\xAA\xA0\xAD\xFF\x9A\xE6"
452 "\x74\x5B\x7B\x18\x1C\x3B\xE3\xFD",
453 },
454};
455
456#define WP384_TEST_VECTORS 8
457
458static struct hash_testvec wp384_tv_template[] = {
459 {
460 .plaintext = "",
461 .psize = 0,
462 .digest = "\x19\xFA\x61\xD7\x55\x22\xA4\x66"
463 "\x9B\x44\xE3\x9C\x1D\x2E\x17\x26"
464 "\xC5\x30\x23\x21\x30\xD4\x07\xF8"
465 "\x9A\xFE\xE0\x96\x49\x97\xF7\xA7"
466 "\x3E\x83\xBE\x69\x8B\x28\x8F\xEB"
467 "\xCF\x88\xE3\xE0\x3C\x4F\x07\x57",
468
469
470 }, {
471 .plaintext = "a",
472 .psize = 1,
473 .digest = "\x8A\xCA\x26\x02\x79\x2A\xEC\x6F"
474 "\x11\xA6\x72\x06\x53\x1F\xB7\xD7"
475 "\xF0\xDF\xF5\x94\x13\x14\x5E\x69"
476 "\x73\xC4\x50\x01\xD0\x08\x7B\x42"
477 "\xD1\x1B\xC6\x45\x41\x3A\xEF\xF6"
478 "\x3A\x42\x39\x1A\x39\x14\x5A\x59",
479 }, {
480 .plaintext = "abc",
481 .psize = 3,
482 .digest = "\x4E\x24\x48\xA4\xC6\xF4\x86\xBB"
483 "\x16\xB6\x56\x2C\x73\xB4\x02\x0B"
484 "\xF3\x04\x3E\x3A\x73\x1B\xCE\x72"
485 "\x1A\xE1\xB3\x03\xD9\x7E\x6D\x4C"
486 "\x71\x81\xEE\xBD\xB6\xC5\x7E\x27"
487 "\x7D\x0E\x34\x95\x71\x14\xCB\xD6",
488 }, {
489 .plaintext = "message digest",
490 .psize = 14,
491 .digest = "\x37\x8C\x84\xA4\x12\x6E\x2D\xC6"
492 "\xE5\x6D\xCC\x74\x58\x37\x7A\xAC"
493 "\x83\x8D\x00\x03\x22\x30\xF5\x3C"
494 "\xE1\xF5\x70\x0C\x0F\xFB\x4D\x3B"
495 "\x84\x21\x55\x76\x59\xEF\x55\xC1"
496 "\x06\xB4\xB5\x2A\xC5\xA4\xAA\xA6",
497 }, {
498 .plaintext = "abcdefghijklmnopqrstuvwxyz",
499 .psize = 26,
500 .digest = "\xF1\xD7\x54\x66\x26\x36\xFF\xE9"
501 "\x2C\x82\xEB\xB9\x21\x2A\x48\x4A"
502 "\x8D\x38\x63\x1E\xAD\x42\x38\xF5"
503 "\x44\x2E\xE1\x3B\x80\x54\xE4\x1B"
504 "\x08\xBF\x2A\x92\x51\xC3\x0B\x6A"
505 "\x0B\x8A\xAE\x86\x17\x7A\xB4\xA6",
506 }, {
507 .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
508 "abcdefghijklmnopqrstuvwxyz0123456789",
509 .psize = 62,
510 .digest = "\xDC\x37\xE0\x08\xCF\x9E\xE6\x9B"
511 "\xF1\x1F\x00\xED\x9A\xBA\x26\x90"
512 "\x1D\xD7\xC2\x8C\xDE\xC0\x66\xCC"
513 "\x6A\xF4\x2E\x40\xF8\x2F\x3A\x1E"
514 "\x08\xEB\xA2\x66\x29\x12\x9D\x8F"
515 "\xB7\xCB\x57\x21\x1B\x92\x81\xA6",
516 }, {
517 .plaintext = "1234567890123456789012345678901234567890"
518 "1234567890123456789012345678901234567890",
519 .psize = 80,
520 .digest = "\x46\x6E\xF1\x8B\xAB\xB0\x15\x4D"
521 "\x25\xB9\xD3\x8A\x64\x14\xF5\xC0"
522 "\x87\x84\x37\x2B\xCC\xB2\x04\xD6"
523 "\x54\x9C\x4A\xFA\xDB\x60\x14\x29"
524 "\x4D\x5B\xD8\xDF\x2A\x6C\x44\xE5"
525 "\x38\xCD\x04\x7B\x26\x81\xA5\x1A",
526 }, {
527 .plaintext = "abcdbcdecdefdefgefghfghighijhijk",
528 .psize = 32,
529 .digest = "\x2A\x98\x7E\xA4\x0F\x91\x70\x61"
530 "\xF5\xD6\xF0\xA0\xE4\x64\x4F\x48"
531 "\x8A\x7A\x5A\x52\xDE\xEE\x65\x62"
532 "\x07\xC5\x62\xF9\x88\xE9\x5C\x69"
533 "\x16\xBD\xC8\x03\x1B\xC5\xBE\x1B"
534 "\x7B\x94\x76\x39\xFE\x05\x0B\x56",
535 },
536};
537
538#define WP256_TEST_VECTORS 8
539
540static struct hash_testvec wp256_tv_template[] = {
541 {
542 .plaintext = "",
543 .psize = 0,
544 .digest = "\x19\xFA\x61\xD7\x55\x22\xA4\x66"
545 "\x9B\x44\xE3\x9C\x1D\x2E\x17\x26"
546 "\xC5\x30\x23\x21\x30\xD4\x07\xF8"
547 "\x9A\xFE\xE0\x96\x49\x97\xF7\xA7",
548
549
550 }, {
551 .plaintext = "a",
552 .psize = 1,
553 .digest = "\x8A\xCA\x26\x02\x79\x2A\xEC\x6F"
554 "\x11\xA6\x72\x06\x53\x1F\xB7\xD7"
555 "\xF0\xDF\xF5\x94\x13\x14\x5E\x69"
556 "\x73\xC4\x50\x01\xD0\x08\x7B\x42",
557 }, {
558 .plaintext = "abc",
559 .psize = 3,
560 .digest = "\x4E\x24\x48\xA4\xC6\xF4\x86\xBB"
561 "\x16\xB6\x56\x2C\x73\xB4\x02\x0B"
562 "\xF3\x04\x3E\x3A\x73\x1B\xCE\x72"
563 "\x1A\xE1\xB3\x03\xD9\x7E\x6D\x4C",
564 }, {
565 .plaintext = "message digest",
566 .psize = 14,
567 .digest = "\x37\x8C\x84\xA4\x12\x6E\x2D\xC6"
568 "\xE5\x6D\xCC\x74\x58\x37\x7A\xAC"
569 "\x83\x8D\x00\x03\x22\x30\xF5\x3C"
570 "\xE1\xF5\x70\x0C\x0F\xFB\x4D\x3B",
571 }, {
572 .plaintext = "abcdefghijklmnopqrstuvwxyz",
573 .psize = 26,
574 .digest = "\xF1\xD7\x54\x66\x26\x36\xFF\xE9"
575 "\x2C\x82\xEB\xB9\x21\x2A\x48\x4A"
576 "\x8D\x38\x63\x1E\xAD\x42\x38\xF5"
577 "\x44\x2E\xE1\x3B\x80\x54\xE4\x1B",
578 }, {
579 .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
580 "abcdefghijklmnopqrstuvwxyz0123456789",
581 .psize = 62,
582 .digest = "\xDC\x37\xE0\x08\xCF\x9E\xE6\x9B"
583 "\xF1\x1F\x00\xED\x9A\xBA\x26\x90"
584 "\x1D\xD7\xC2\x8C\xDE\xC0\x66\xCC"
585 "\x6A\xF4\x2E\x40\xF8\x2F\x3A\x1E",
586 }, {
587 .plaintext = "1234567890123456789012345678901234567890"
588 "1234567890123456789012345678901234567890",
589 .psize = 80,
590 .digest = "\x46\x6E\xF1\x8B\xAB\xB0\x15\x4D"
591 "\x25\xB9\xD3\x8A\x64\x14\xF5\xC0"
592 "\x87\x84\x37\x2B\xCC\xB2\x04\xD6"
593 "\x54\x9C\x4A\xFA\xDB\x60\x14\x29",
594 }, {
595 .plaintext = "abcdbcdecdefdefgefghfghighijhijk",
596 .psize = 32,
597 .digest = "\x2A\x98\x7E\xA4\x0F\x91\x70\x61"
598 "\xF5\xD6\xF0\xA0\xE4\x64\x4F\x48"
599 "\x8A\x7A\x5A\x52\xDE\xEE\x65\x62"
600 "\x07\xC5\x62\xF9\x88\xE9\x5C\x69",
601 },
602};
603
604/*
605 * TIGER test vectors from Tiger website
606 */
607#define TGR192_TEST_VECTORS 6
608
609static struct hash_testvec tgr192_tv_template[] = {
610 {
611 .plaintext = "",
612 .psize = 0,
613 .digest = "\x24\xf0\x13\x0c\x63\xac\x93\x32"
614 "\x16\x16\x6e\x76\xb1\xbb\x92\x5f"
615 "\xf3\x73\xde\x2d\x49\x58\x4e\x7a",
616 }, {
617 .plaintext = "abc",
618 .psize = 3,
619 .digest = "\xf2\x58\xc1\xe8\x84\x14\xab\x2a"
620 "\x52\x7a\xb5\x41\xff\xc5\xb8\xbf"
621 "\x93\x5f\x7b\x95\x1c\x13\x29\x51",
622 }, {
623 .plaintext = "Tiger",
624 .psize = 5,
625 .digest = "\x9f\x00\xf5\x99\x07\x23\x00\xdd"
626 "\x27\x6a\xbb\x38\xc8\xeb\x6d\xec"
627 "\x37\x79\x0c\x11\x6f\x9d\x2b\xdf",
628 }, {
629 .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-",
630 .psize = 64,
631 .digest = "\x87\xfb\x2a\x90\x83\x85\x1c\xf7"
632 "\x47\x0d\x2c\xf8\x10\xe6\xdf\x9e"
633 "\xb5\x86\x44\x50\x34\xa5\xa3\x86",
634 }, {
635 .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZ=abcdefghijklmnopqrstuvwxyz+0123456789",
636 .psize = 64,
637 .digest = "\x46\x7d\xb8\x08\x63\xeb\xce\x48"
638 "\x8d\xf1\xcd\x12\x61\x65\x5d\xe9"
639 "\x57\x89\x65\x65\x97\x5f\x91\x97",
640 }, {
641 .plaintext = "Tiger - A Fast New Hash Function, "
642 "by Ross Anderson and Eli Biham, "
643 "proceedings of Fast Software Encryption 3, "
644 "Cambridge, 1996.",
645 .psize = 125,
646 .digest = "\x3d\x9a\xeb\x03\xd1\xbd\x1a\x63"
647 "\x57\xb2\x77\x4d\xfd\x6d\x5b\x24"
648 "\xdd\x68\x15\x1d\x50\x39\x74\xfc",
649 },
650};
651
652#define TGR160_TEST_VECTORS 6
653
654static struct hash_testvec tgr160_tv_template[] = {
655 {
656 .plaintext = "",
657 .psize = 0,
658 .digest = "\x24\xf0\x13\x0c\x63\xac\x93\x32"
659 "\x16\x16\x6e\x76\xb1\xbb\x92\x5f"
660 "\xf3\x73\xde\x2d",
661 }, {
662 .plaintext = "abc",
663 .psize = 3,
664 .digest = "\xf2\x58\xc1\xe8\x84\x14\xab\x2a"
665 "\x52\x7a\xb5\x41\xff\xc5\xb8\xbf"
666 "\x93\x5f\x7b\x95",
667 }, {
668 .plaintext = "Tiger",
669 .psize = 5,
670 .digest = "\x9f\x00\xf5\x99\x07\x23\x00\xdd"
671 "\x27\x6a\xbb\x38\xc8\xeb\x6d\xec"
672 "\x37\x79\x0c\x11",
673 }, {
674 .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-",
675 .psize = 64,
676 .digest = "\x87\xfb\x2a\x90\x83\x85\x1c\xf7"
677 "\x47\x0d\x2c\xf8\x10\xe6\xdf\x9e"
678 "\xb5\x86\x44\x50",
679 }, {
680 .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZ=abcdefghijklmnopqrstuvwxyz+0123456789",
681 .psize = 64,
682 .digest = "\x46\x7d\xb8\x08\x63\xeb\xce\x48"
683 "\x8d\xf1\xcd\x12\x61\x65\x5d\xe9"
684 "\x57\x89\x65\x65",
685 }, {
686 .plaintext = "Tiger - A Fast New Hash Function, "
687 "by Ross Anderson and Eli Biham, "
688 "proceedings of Fast Software Encryption 3, "
689 "Cambridge, 1996.",
690 .psize = 125,
691 .digest = "\x3d\x9a\xeb\x03\xd1\xbd\x1a\x63"
692 "\x57\xb2\x77\x4d\xfd\x6d\x5b\x24"
693 "\xdd\x68\x15\x1d",
694 },
695};
696
697#define TGR128_TEST_VECTORS 6
698
699static struct hash_testvec tgr128_tv_template[] = {
700 {
701 .plaintext = "",
702 .psize = 0,
703 .digest = "\x24\xf0\x13\x0c\x63\xac\x93\x32"
704 "\x16\x16\x6e\x76\xb1\xbb\x92\x5f",
705 }, {
706 .plaintext = "abc",
707 .psize = 3,
708 .digest = "\xf2\x58\xc1\xe8\x84\x14\xab\x2a"
709 "\x52\x7a\xb5\x41\xff\xc5\xb8\xbf",
710 }, {
711 .plaintext = "Tiger",
712 .psize = 5,
713 .digest = "\x9f\x00\xf5\x99\x07\x23\x00\xdd"
714 "\x27\x6a\xbb\x38\xc8\xeb\x6d\xec",
715 }, {
716 .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-",
717 .psize = 64,
718 .digest = "\x87\xfb\x2a\x90\x83\x85\x1c\xf7"
719 "\x47\x0d\x2c\xf8\x10\xe6\xdf\x9e",
720 }, {
721 .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZ=abcdefghijklmnopqrstuvwxyz+0123456789",
722 .psize = 64,
723 .digest = "\x46\x7d\xb8\x08\x63\xeb\xce\x48"
724 "\x8d\xf1\xcd\x12\x61\x65\x5d\xe9",
725 }, {
726 .plaintext = "Tiger - A Fast New Hash Function, "
727 "by Ross Anderson and Eli Biham, "
728 "proceedings of Fast Software Encryption 3, "
729 "Cambridge, 1996.",
730 .psize = 125,
731 .digest = "\x3d\x9a\xeb\x03\xd1\xbd\x1a\x63"
732 "\x57\xb2\x77\x4d\xfd\x6d\x5b\x24",
733 },
734};
735
736/*
737 * HMAC-MD5 test vectors from RFC2202
738 * (These need to be fixed to not use strlen).
739 */
740#define HMAC_MD5_TEST_VECTORS 7
741
742static struct hash_testvec hmac_md5_tv_template[] =
743{
744 {
745 .key = "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b",
746 .ksize = 16,
747 .plaintext = "Hi There",
748 .psize = 8,
749 .digest = "\x92\x94\x72\x7a\x36\x38\xbb\x1c"
750 "\x13\xf4\x8e\xf8\x15\x8b\xfc\x9d",
751 }, {
752 .key = "Jefe",
753 .ksize = 4,
754 .plaintext = "what do ya want for nothing?",
755 .psize = 28,
756 .digest = "\x75\x0c\x78\x3e\x6a\xb0\xb5\x03"
757 "\xea\xa8\x6e\x31\x0a\x5d\xb7\x38",
758 .np = 2,
759 .tap = {14, 14}
760 }, {
761 .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
762 .ksize = 16,
763 .plaintext = "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
764 "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
765 "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
766 "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd",
767 .psize = 50,
768 .digest = "\x56\xbe\x34\x52\x1d\x14\x4c\x88"
769 "\xdb\xb8\xc7\x33\xf0\xe8\xb3\xf6",
770 }, {
771 .key = "\x01\x02\x03\x04\x05\x06\x07\x08"
772 "\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
773 "\x11\x12\x13\x14\x15\x16\x17\x18\x19",
774 .ksize = 25,
775 .plaintext = "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
776 "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
777 "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
778 "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd",
779 .psize = 50,
780 .digest = "\x69\x7e\xaf\x0a\xca\x3a\x3a\xea"
781 "\x3a\x75\x16\x47\x46\xff\xaa\x79",
782 }, {
783 .key = "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c",
784 .ksize = 16,
785 .plaintext = "Test With Truncation",
786 .psize = 20,
787 .digest = "\x56\x46\x1e\xf2\x34\x2e\xdc\x00"
788 "\xf9\xba\xb9\x95\x69\x0e\xfd\x4c",
789 }, {
790 .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
791 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
792 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
793 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
794 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
795 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
796 "\xaa\xaa",
797 .ksize = 80,
798 .plaintext = "Test Using Larger Than Block-Size Key - Hash Key First",
799 .psize = 54,
800 .digest = "\x6b\x1a\xb7\xfe\x4b\xd7\xbf\x8f"
801 "\x0b\x62\xe6\xce\x61\xb9\xd0\xcd",
802 }, {
803 .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
804 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
805 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
806 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
807 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
808 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
809 "\xaa\xaa",
810 .ksize = 80,
811 .plaintext = "Test Using Larger Than Block-Size Key and Larger Than One "
812 "Block-Size Data",
813 .psize = 73,
814 .digest = "\x6f\x63\x0f\xad\x67\xcd\xa0\xee"
815 "\x1f\xb1\xf5\x62\xdb\x3a\xa5\x3e",
816 },
817};
818
819/*
820 * HMAC-SHA1 test vectors from RFC2202
821 */
822#define HMAC_SHA1_TEST_VECTORS 7
823
824static struct hash_testvec hmac_sha1_tv_template[] = {
825 {
826 .key = "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b",
827 .ksize = 20,
828 .plaintext = "Hi There",
829 .psize = 8,
830 .digest = "\xb6\x17\x31\x86\x55\x05\x72\x64"
831 "\xe2\x8b\xc0\xb6\xfb\x37\x8c\x8e\xf1"
832 "\x46\xbe",
833 }, {
834 .key = "Jefe",
835 .ksize = 4,
836 .plaintext = "what do ya want for nothing?",
837 .psize = 28,
838 .digest = "\xef\xfc\xdf\x6a\xe5\xeb\x2f\xa2\xd2\x74"
839 "\x16\xd5\xf1\x84\xdf\x9c\x25\x9a\x7c\x79",
840 .np = 2,
841 .tap = { 14, 14 }
842 }, {
843 .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
844 .ksize = 20,
845 .plaintext = "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
846 "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
847 "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
848 "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd",
849 .psize = 50,
850 .digest = "\x12\x5d\x73\x42\xb9\xac\x11\xcd\x91\xa3"
851 "\x9a\xf4\x8a\xa1\x7b\x4f\x63\xf1\x75\xd3",
852 }, {
853 .key = "\x01\x02\x03\x04\x05\x06\x07\x08"
854 "\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
855 "\x11\x12\x13\x14\x15\x16\x17\x18\x19",
856 .ksize = 25,
857 .plaintext = "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
858 "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
859 "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
860 "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd",
861 .psize = 50,
862 .digest = "\x4c\x90\x07\xf4\x02\x62\x50\xc6\xbc\x84"
863 "\x14\xf9\xbf\x50\xc8\x6c\x2d\x72\x35\xda",
864 }, {
865 .key = "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c",
866 .ksize = 20,
867 .plaintext = "Test With Truncation",
868 .psize = 20,
869 .digest = "\x4c\x1a\x03\x42\x4b\x55\xe0\x7f\xe7\xf2"
870 "\x7b\xe1\xd5\x8b\xb9\x32\x4a\x9a\x5a\x04",
871 }, {
872 .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
873 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
874 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
875 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
876 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
877 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
878 "\xaa\xaa",
879 .ksize = 80,
880 .plaintext = "Test Using Larger Than Block-Size Key - Hash Key First",
881 .psize = 54,
882 .digest = "\xaa\x4a\xe5\xe1\x52\x72\xd0\x0e\x95\x70"
883 "\x56\x37\xce\x8a\x3b\x55\xed\x40\x21\x12",
884 }, {
885 .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
886 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
887 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
888 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
889 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
890 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
891 "\xaa\xaa",
892 .ksize = 80,
893 .plaintext = "Test Using Larger Than Block-Size Key and Larger Than One "
894 "Block-Size Data",
895 .psize = 73,
896 .digest = "\xe8\xe9\x9d\x0f\x45\x23\x7d\x78\x6d\x6b"
897 "\xba\xa7\x96\x5c\x78\x08\xbb\xff\x1a\x91",
898 },
899};
900
901
902/*
903 * SHA224 HMAC test vectors from RFC4231
904 */
905#define HMAC_SHA224_TEST_VECTORS 4
906
907static struct hash_testvec hmac_sha224_tv_template[] = {
908 {
909 .key = "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
910 "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
911 "\x0b\x0b\x0b\x0b",
912 .ksize = 20,
913 /* ("Hi There") */
914 .plaintext = "\x48\x69\x20\x54\x68\x65\x72\x65",
915 .psize = 8,
916 .digest = "\x89\x6f\xb1\x12\x8a\xbb\xdf\x19"
917 "\x68\x32\x10\x7c\xd4\x9d\xf3\x3f"
918 "\x47\xb4\xb1\x16\x99\x12\xba\x4f"
919 "\x53\x68\x4b\x22",
920 }, {
921 .key = "Jefe",
922 .ksize = 4,
923 /* ("what do ya want for nothing?") */
924 .plaintext = "\x77\x68\x61\x74\x20\x64\x6f\x20"
925 "\x79\x61\x20\x77\x61\x6e\x74\x20"
926 "\x66\x6f\x72\x20\x6e\x6f\x74\x68"
927 "\x69\x6e\x67\x3f",
928 .psize = 28,
929 .digest = "\xa3\x0e\x01\x09\x8b\xc6\xdb\xbf"
930 "\x45\x69\x0f\x3a\x7e\x9e\x6d\x0f"
931 "\x8b\xbe\xa2\xa3\x9e\x61\x48\x00"
932 "\x8f\xd0\x5e\x44",
933 .np = 4,
934 .tap = { 7, 7, 7, 7 }
935 }, {
936 .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
937 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
938 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
939 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
940 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
941 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
942 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
943 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
944 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
945 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
946 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
947 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
948 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
949 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
950 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
951 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
952 "\xaa\xaa\xaa",
953 .ksize = 131,
954 /* ("Test Using Larger Than Block-Size Key - Hash Key First") */
955 .plaintext = "\x54\x65\x73\x74\x20\x55\x73\x69"
956 "\x6e\x67\x20\x4c\x61\x72\x67\x65"
957 "\x72\x20\x54\x68\x61\x6e\x20\x42"
958 "\x6c\x6f\x63\x6b\x2d\x53\x69\x7a"
959 "\x65\x20\x4b\x65\x79\x20\x2d\x20"
960 "\x48\x61\x73\x68\x20\x4b\x65\x79"
961 "\x20\x46\x69\x72\x73\x74",
962 .psize = 54,
963 .digest = "\x95\xe9\xa0\xdb\x96\x20\x95\xad"
964 "\xae\xbe\x9b\x2d\x6f\x0d\xbc\xe2"
965 "\xd4\x99\xf1\x12\xf2\xd2\xb7\x27"
966 "\x3f\xa6\x87\x0e",
967 }, {
968 .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
969 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
970 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
971 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
972 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
973 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
974 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
975 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
976 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
977 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
978 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
979 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
980 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
981 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
982 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
983 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
984 "\xaa\xaa\xaa",
985 .ksize = 131,
986 /* ("This is a test using a larger than block-size key and a")
987 (" larger than block-size data. The key needs to be")
988 (" hashed before being used by the HMAC algorithm.") */
989 .plaintext = "\x54\x68\x69\x73\x20\x69\x73\x20"
990 "\x61\x20\x74\x65\x73\x74\x20\x75"
991 "\x73\x69\x6e\x67\x20\x61\x20\x6c"
992 "\x61\x72\x67\x65\x72\x20\x74\x68"
993 "\x61\x6e\x20\x62\x6c\x6f\x63\x6b"
994 "\x2d\x73\x69\x7a\x65\x20\x6b\x65"
995 "\x79\x20\x61\x6e\x64\x20\x61\x20"
996 "\x6c\x61\x72\x67\x65\x72\x20\x74"
997 "\x68\x61\x6e\x20\x62\x6c\x6f\x63"
998 "\x6b\x2d\x73\x69\x7a\x65\x20\x64"
999 "\x61\x74\x61\x2e\x20\x54\x68\x65"
1000 "\x20\x6b\x65\x79\x20\x6e\x65\x65"
1001 "\x64\x73\x20\x74\x6f\x20\x62\x65"
1002 "\x20\x68\x61\x73\x68\x65\x64\x20"
1003 "\x62\x65\x66\x6f\x72\x65\x20\x62"
1004 "\x65\x69\x6e\x67\x20\x75\x73\x65"
1005 "\x64\x20\x62\x79\x20\x74\x68\x65"
1006 "\x20\x48\x4d\x41\x43\x20\x61\x6c"
1007 "\x67\x6f\x72\x69\x74\x68\x6d\x2e",
1008 .psize = 152,
1009 .digest = "\x3a\x85\x41\x66\xac\x5d\x9f\x02"
1010 "\x3f\x54\xd5\x17\xd0\xb3\x9d\xbd"
1011 "\x94\x67\x70\xdb\x9c\x2b\x95\xc9"
1012 "\xf6\xf5\x65\xd1",
1013 },
1014};
1015
1016/*
1017 * HMAC-SHA256 test vectors from
1018 * draft-ietf-ipsec-ciph-sha-256-01.txt
1019 */
1020#define HMAC_SHA256_TEST_VECTORS 10
1021
1022static struct hash_testvec hmac_sha256_tv_template[] = {
1023 {
1024 .key = "\x01\x02\x03\x04\x05\x06\x07\x08"
1025 "\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
1026 "\x11\x12\x13\x14\x15\x16\x17\x18"
1027 "\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20",
1028 .ksize = 32,
1029 .plaintext = "abc",
1030 .psize = 3,
1031 .digest = "\xa2\x1b\x1f\x5d\x4c\xf4\xf7\x3a"
1032 "\x4d\xd9\x39\x75\x0f\x7a\x06\x6a"
1033 "\x7f\x98\xcc\x13\x1c\xb1\x6a\x66"
1034 "\x92\x75\x90\x21\xcf\xab\x81\x81",
1035 }, {
1036 .key = "\x01\x02\x03\x04\x05\x06\x07\x08"
1037 "\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
1038 "\x11\x12\x13\x14\x15\x16\x17\x18"
1039 "\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20",
1040 .ksize = 32,
1041 .plaintext = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
1042 .psize = 56,
1043 .digest = "\x10\x4f\xdc\x12\x57\x32\x8f\x08"
1044 "\x18\x4b\xa7\x31\x31\xc5\x3c\xae"
1045 "\xe6\x98\xe3\x61\x19\x42\x11\x49"
1046 "\xea\x8c\x71\x24\x56\x69\x7d\x30",
1047 }, {
1048 .key = "\x01\x02\x03\x04\x05\x06\x07\x08"
1049 "\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
1050 "\x11\x12\x13\x14\x15\x16\x17\x18"
1051 "\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20",
1052 .ksize = 32,
1053 .plaintext = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
1054 "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
1055 .psize = 112,
1056 .digest = "\x47\x03\x05\xfc\x7e\x40\xfe\x34"
1057 "\xd3\xee\xb3\xe7\x73\xd9\x5a\xab"
1058 "\x73\xac\xf0\xfd\x06\x04\x47\xa5"
1059 "\xeb\x45\x95\xbf\x33\xa9\xd1\xa3",
1060 }, {
1061 .key = "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
1062 "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
1063 "\x0b\x0b\x0b\x0b\x0b\x0b",
1064 .ksize = 32,
1065 .plaintext = "Hi There",
1066 .psize = 8,
1067 .digest = "\x19\x8a\x60\x7e\xb4\x4b\xfb\xc6"
1068 "\x99\x03\xa0\xf1\xcf\x2b\xbd\xc5"
1069 "\xba\x0a\xa3\xf3\xd9\xae\x3c\x1c"
1070 "\x7a\x3b\x16\x96\xa0\xb6\x8c\xf7",
1071 }, {
1072 .key = "Jefe",
1073 .ksize = 4,
1074 .plaintext = "what do ya want for nothing?",
1075 .psize = 28,
1076 .digest = "\x5b\xdc\xc1\x46\xbf\x60\x75\x4e"
1077 "\x6a\x04\x24\x26\x08\x95\x75\xc7"
1078 "\x5a\x00\x3f\x08\x9d\x27\x39\x83"
1079 "\x9d\xec\x58\xb9\x64\xec\x38\x43",
1080 .np = 2,
1081 .tap = { 14, 14 }
1082 }, {
1083 .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1084 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1085 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
1086 .ksize = 32,
1087 .plaintext = "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
1088 "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
1089 "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
1090 "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd",
1091 .psize = 50,
1092 .digest = "\xcd\xcb\x12\x20\xd1\xec\xcc\xea"
1093 "\x91\xe5\x3a\xba\x30\x92\xf9\x62"
1094 "\xe5\x49\xfe\x6c\xe9\xed\x7f\xdc"
1095 "\x43\x19\x1f\xbd\xe4\x5c\x30\xb0",
1096 }, {
1097 .key = "\x01\x02\x03\x04\x05\x06\x07\x08"
1098 "\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
1099 "\x11\x12\x13\x14\x15\x16\x17\x18"
1100 "\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20"
1101 "\x21\x22\x23\x24\x25",
1102 .ksize = 37,
1103 .plaintext = "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1104 "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1105 "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1106 "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd",
1107 .psize = 50,
1108 .digest = "\xd4\x63\x3c\x17\xf6\xfb\x8d\x74"
1109 "\x4c\x66\xde\xe0\xf8\xf0\x74\x55"
1110 "\x6e\xc4\xaf\x55\xef\x07\x99\x85"
1111 "\x41\x46\x8e\xb4\x9b\xd2\xe9\x17",
1112 }, {
1113 .key = "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c"
1114 "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c"
1115 "\x0c\x0c\x0c\x0c\x0c\x0c",
1116 .ksize = 32,
1117 .plaintext = "Test With Truncation",
1118 .psize = 20,
1119 .digest = "\x75\x46\xaf\x01\x84\x1f\xc0\x9b"
1120 "\x1a\xb9\xc3\x74\x9a\x5f\x1c\x17"
1121 "\xd4\xf5\x89\x66\x8a\x58\x7b\x27"
1122 "\x00\xa9\xc9\x7c\x11\x93\xcf\x42",
1123 }, {
1124 .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1125 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1126 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1127 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1128 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1129 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1130 "\xaa\xaa",
1131 .ksize = 80,
1132 .plaintext = "Test Using Larger Than Block-Size Key - Hash Key First",
1133 .psize = 54,
1134 .digest = "\x69\x53\x02\x5e\xd9\x6f\x0c\x09"
1135 "\xf8\x0a\x96\xf7\x8e\x65\x38\xdb"
1136 "\xe2\xe7\xb8\x20\xe3\xdd\x97\x0e"
1137 "\x7d\xdd\x39\x09\x1b\x32\x35\x2f",
1138 }, {
1139 .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1140 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1141 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1142 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1143 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1144 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1145 "\xaa\xaa",
1146 .ksize = 80,
1147 .plaintext = "Test Using Larger Than Block-Size Key and Larger Than "
1148 "One Block-Size Data",
1149 .psize = 73,
1150 .digest = "\x63\x55\xac\x22\xe8\x90\xd0\xa3"
1151 "\xc8\x48\x1a\x5c\xa4\x82\x5b\xc8"
1152 "\x84\xd3\xe7\xa1\xff\x98\xa2\xfc"
1153 "\x2a\xc7\xd8\xe0\x64\xc3\xb2\xe6",
1154 },
1155};
1156
1157#define XCBC_AES_TEST_VECTORS 6
1158
1159static struct hash_testvec aes_xcbc128_tv_template[] = {
1160 {
1161 .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
1162 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
1163 .plaintext = zeroed_string,
1164 .digest = "\x75\xf0\x25\x1d\x52\x8a\xc0\x1c"
1165 "\x45\x73\xdf\xd5\x84\xd7\x9f\x29",
1166 .psize = 0,
1167 .ksize = 16,
1168 }, {
1169 .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
1170 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
1171 .plaintext = "\x00\x01\x02",
1172 .digest = "\x5b\x37\x65\x80\xae\x2f\x19\xaf"
1173 "\xe7\x21\x9c\xee\xf1\x72\x75\x6f",
1174 .psize = 3,
1175 .ksize = 16,
1176 } , {
1177 .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
1178 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
1179 .plaintext = "\x00\x01\x02\x03\x04\x05\x06\x07"
1180 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
1181 .digest = "\xd2\xa2\x46\xfa\x34\x9b\x68\xa7"
1182 "\x99\x98\xa4\x39\x4f\xf7\xa2\x63",
1183 .psize = 16,
1184 .ksize = 16,
1185 }, {
1186 .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
1187 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
1188 .plaintext = "\x00\x01\x02\x03\x04\x05\x06\x07"
1189 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
1190 "\x10\x11\x12\x13",
1191 .digest = "\x47\xf5\x1b\x45\x64\x96\x62\x15"
1192 "\xb8\x98\x5c\x63\x05\x5e\xd3\x08",
1193 .tap = { 10, 10 },
1194 .psize = 20,
1195 .np = 2,
1196 .ksize = 16,
1197 }, {
1198 .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
1199 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
1200 .plaintext = "\x00\x01\x02\x03\x04\x05\x06\x07"
1201 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
1202 "\x10\x11\x12\x13\x14\x15\x16\x17"
1203 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
1204 .digest = "\xf5\x4f\x0e\xc8\xd2\xb9\xf3\xd3"
1205 "\x68\x07\x73\x4b\xd5\x28\x3f\xd4",
1206 .psize = 32,
1207 .ksize = 16,
1208 }, {
1209 .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
1210 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
1211 .plaintext = "\x00\x01\x02\x03\x04\x05\x06\x07"
1212 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
1213 "\x10\x11\x12\x13\x14\x15\x16\x17"
1214 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
1215 "\x20\x21",
1216 .digest = "\xbe\xcb\xb3\xbc\xcd\xb5\x18\xa3"
1217 "\x06\x77\xd5\x48\x1f\xb6\xb4\xd8",
1218 .tap = { 17, 17 },
1219 .psize = 34,
1220 .np = 2,
1221 .ksize = 16,
1222 }
1223};
1224
1225/*
1226 * SHA384 HMAC test vectors from RFC4231
1227 */
1228
1229#define HMAC_SHA384_TEST_VECTORS 4
1230
1231static struct hash_testvec hmac_sha384_tv_template[] = {
1232 {
1233 .key = "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
1234 "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
1235 "\x0b\x0b\x0b\x0b",
1236 .ksize = 20,
1237 .plaintext = "Hi There",
1238 .psize = 8,
1239 .digest = "\xaf\xd0\x39\x44\xd8\x48\x95\x62"
1240 "\x6b\x08\x25\xf4\xab\x46\x90\x7f"
1241 "\x15\xf9\xda\xdb\xe4\x10\x1e\xc6"
1242 "\x82\xaa\x03\x4c\x7c\xeb\xc5\x9c"
1243 "\xfa\xea\x9e\xa9\x07\x6e\xde\x7f"
1244 "\x4a\xf1\x52\xe8\xb2\xfa\x9c\xb6",
1245 }, {
1246 .key = "Jefe",
1247 .ksize = 4,
1248 .plaintext = "what do ya want for nothing?",
1249 .psize = 28,
1250 .digest = "\xaf\x45\xd2\xe3\x76\x48\x40\x31"
1251 "\x61\x7f\x78\xd2\xb5\x8a\x6b\x1b"
1252 "\x9c\x7e\xf4\x64\xf5\xa0\x1b\x47"
1253 "\xe4\x2e\xc3\x73\x63\x22\x44\x5e"
1254 "\x8e\x22\x40\xca\x5e\x69\xe2\xc7"
1255 "\x8b\x32\x39\xec\xfa\xb2\x16\x49",
1256 .np = 4,
1257 .tap = { 7, 7, 7, 7 }
1258 }, {
1259 .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1260 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1261 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1262 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1263 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1264 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1265 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1266 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1267 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1268 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1269 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1270 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1271 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1272 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1273 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1274 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1275 "\xaa\xaa\xaa",
1276 .ksize = 131,
1277 .plaintext = "Test Using Larger Than Block-Siz"
1278 "e Key - Hash Key First",
1279 .psize = 54,
1280 .digest = "\x4e\xce\x08\x44\x85\x81\x3e\x90"
1281 "\x88\xd2\xc6\x3a\x04\x1b\xc5\xb4"
1282 "\x4f\x9e\xf1\x01\x2a\x2b\x58\x8f"
1283 "\x3c\xd1\x1f\x05\x03\x3a\xc4\xc6"
1284 "\x0c\x2e\xf6\xab\x40\x30\xfe\x82"
1285 "\x96\x24\x8d\xf1\x63\xf4\x49\x52",
1286 }, {
1287 .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1288 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1289 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1290 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1291 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1292 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1293 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1294 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1295 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1296 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1297 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1298 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1299 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1300 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1301 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1302 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1303 "\xaa\xaa\xaa",
1304 .ksize = 131,
1305 .plaintext = "This is a test u"
1306 "sing a larger th"
1307 "an block-size ke"
1308 "y and a larger t"
1309 "han block-size d"
1310 "ata. The key nee"
1311 "ds to be hashed "
1312 "before being use"
1313 "d by the HMAC al"
1314 "gorithm.",
1315 .psize = 152,
1316 .digest = "\x66\x17\x17\x8e\x94\x1f\x02\x0d"
1317 "\x35\x1e\x2f\x25\x4e\x8f\xd3\x2c"
1318 "\x60\x24\x20\xfe\xb0\xb8\xfb\x9a"
1319 "\xdc\xce\xbb\x82\x46\x1e\x99\xc5"
1320 "\xa6\x78\xcc\x31\xe7\x99\x17\x6d"
1321 "\x38\x60\xe6\x11\x0c\x46\x52\x3e",
1322 },
1323};
1324
1325/*
1326 * SHA512 HMAC test vectors from RFC4231
1327 */
1328
1329#define HMAC_SHA512_TEST_VECTORS 4
1330
1331static struct hash_testvec hmac_sha512_tv_template[] = {
1332 {
1333 .key = "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
1334 "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
1335 "\x0b\x0b\x0b\x0b",
1336 .ksize = 20,
1337 .plaintext = "Hi There",
1338 .psize = 8,
1339 .digest = "\x87\xaa\x7c\xde\xa5\xef\x61\x9d"
1340 "\x4f\xf0\xb4\x24\x1a\x1d\x6c\xb0"
1341 "\x23\x79\xf4\xe2\xce\x4e\xc2\x78"
1342 "\x7a\xd0\xb3\x05\x45\xe1\x7c\xde"
1343 "\xda\xa8\x33\xb7\xd6\xb8\xa7\x02"
1344 "\x03\x8b\x27\x4e\xae\xa3\xf4\xe4"
1345 "\xbe\x9d\x91\x4e\xeb\x61\xf1\x70"
1346 "\x2e\x69\x6c\x20\x3a\x12\x68\x54",
1347 }, {
1348 .key = "Jefe",
1349 .ksize = 4,
1350 .plaintext = "what do ya want for nothing?",
1351 .psize = 28,
1352 .digest = "\x16\x4b\x7a\x7b\xfc\xf8\x19\xe2"
1353 "\xe3\x95\xfb\xe7\x3b\x56\xe0\xa3"
1354 "\x87\xbd\x64\x22\x2e\x83\x1f\xd6"
1355 "\x10\x27\x0c\xd7\xea\x25\x05\x54"
1356 "\x97\x58\xbf\x75\xc0\x5a\x99\x4a"
1357 "\x6d\x03\x4f\x65\xf8\xf0\xe6\xfd"
1358 "\xca\xea\xb1\xa3\x4d\x4a\x6b\x4b"
1359 "\x63\x6e\x07\x0a\x38\xbc\xe7\x37",
1360 .np = 4,
1361 .tap = { 7, 7, 7, 7 }
1362 }, {
1363 .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1364 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1365 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1366 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1367 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1368 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1369 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1370 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1371 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1372 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1373 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1374 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1375 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1376 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1377 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1378 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1379 "\xaa\xaa\xaa",
1380 .ksize = 131,
1381 .plaintext = "Test Using Large"
1382 "r Than Block-Siz"
1383 "e Key - Hash Key"
1384 " First",
1385 .psize = 54,
1386 .digest = "\x80\xb2\x42\x63\xc7\xc1\xa3\xeb"
1387 "\xb7\x14\x93\xc1\xdd\x7b\xe8\xb4"
1388 "\x9b\x46\xd1\xf4\x1b\x4a\xee\xc1"
1389 "\x12\x1b\x01\x37\x83\xf8\xf3\x52"
1390 "\x6b\x56\xd0\x37\xe0\x5f\x25\x98"
1391 "\xbd\x0f\xd2\x21\x5d\x6a\x1e\x52"
1392 "\x95\xe6\x4f\x73\xf6\x3f\x0a\xec"
1393 "\x8b\x91\x5a\x98\x5d\x78\x65\x98",
1394 }, {
1395 .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1396 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1397 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1398 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1399 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1400 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1401 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1402 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1403 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1404 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1405 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1406 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1407 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1408 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1409 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1410 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1411 "\xaa\xaa\xaa",
1412 .ksize = 131,
1413 .plaintext =
1414 "This is a test u"
1415 "sing a larger th"
1416 "an block-size ke"
1417 "y and a larger t"
1418 "han block-size d"
1419 "ata. The key nee"
1420 "ds to be hashed "
1421 "before being use"
1422 "d by the HMAC al"
1423 "gorithm.",
1424 .psize = 152,
1425 .digest = "\xe3\x7b\x6a\x77\x5d\xc8\x7d\xba"
1426 "\xa4\xdf\xa9\xf9\x6e\x5e\x3f\xfd"
1427 "\xde\xbd\x71\xf8\x86\x72\x89\x86"
1428 "\x5d\xf5\xa3\x2d\x20\xcd\xc9\x44"
1429 "\xb6\x02\x2c\xac\x3c\x49\x82\xb1"
1430 "\x0d\x5e\xeb\x55\xc3\xe4\xde\x15"
1431 "\x13\x46\x76\xfb\x6d\xe0\x44\x60"
1432 "\x65\xc9\x74\x40\xfa\x8c\x6a\x58",
1433 },
1434};
1435
1436/* 30/*
1437 * DES test vectors. 31 * DES test vectors.
1438 */ 32 */
1439#define DES_ENC_TEST_VECTORS 10 33#define DES3_SPEED_VECTORS 1
1440#define DES_DEC_TEST_VECTORS 4
1441#define DES_CBC_ENC_TEST_VECTORS 5
1442#define DES_CBC_DEC_TEST_VECTORS 4
1443#define DES3_EDE_ENC_TEST_VECTORS 3
1444#define DES3_EDE_DEC_TEST_VECTORS 3
1445
1446static struct cipher_testvec des_enc_tv_template[] = {
1447 { /* From Applied Cryptography */
1448 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
1449 .klen = 8,
1450 .input = "\x01\x23\x45\x67\x89\xab\xcd\xe7",
1451 .ilen = 8,
1452 .result = "\xc9\x57\x44\x25\x6a\x5e\xd3\x1d",
1453 .rlen = 8,
1454 }, { /* Same key, different plaintext block */
1455 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
1456 .klen = 8,
1457 .input = "\x22\x33\x44\x55\x66\x77\x88\x99",
1458 .ilen = 8,
1459 .result = "\xf7\x9c\x89\x2a\x33\x8f\x4a\x8b",
1460 .rlen = 8,
1461 }, { /* Sbox test from NBS */
1462 .key = "\x7c\xa1\x10\x45\x4a\x1a\x6e\x57",
1463 .klen = 8,
1464 .input = "\x01\xa1\xd6\xd0\x39\x77\x67\x42",
1465 .ilen = 8,
1466 .result = "\x69\x0f\x5b\x0d\x9a\x26\x93\x9b",
1467 .rlen = 8,
1468 }, { /* Three blocks */
1469 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
1470 .klen = 8,
1471 .input = "\x01\x23\x45\x67\x89\xab\xcd\xe7"
1472 "\x22\x33\x44\x55\x66\x77\x88\x99"
1473 "\xca\xfe\xba\xbe\xfe\xed\xbe\xef",
1474 .ilen = 24,
1475 .result = "\xc9\x57\x44\x25\x6a\x5e\xd3\x1d"
1476 "\xf7\x9c\x89\x2a\x33\x8f\x4a\x8b"
1477 "\xb4\x99\x26\xf7\x1f\xe1\xd4\x90",
1478 .rlen = 24,
1479 }, { /* Weak key */
1480 .fail = 1,
1481 .wk = 1,
1482 .key = "\x01\x01\x01\x01\x01\x01\x01\x01",
1483 .klen = 8,
1484 .input = "\x01\x23\x45\x67\x89\xab\xcd\xe7",
1485 .ilen = 8,
1486 .result = "\xc9\x57\x44\x25\x6a\x5e\xd3\x1d",
1487 .rlen = 8,
1488 }, { /* Two blocks -- for testing encryption across pages */
1489 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
1490 .klen = 8,
1491 .input = "\x01\x23\x45\x67\x89\xab\xcd\xe7"
1492 "\x22\x33\x44\x55\x66\x77\x88\x99",
1493 .ilen = 16,
1494 .result = "\xc9\x57\x44\x25\x6a\x5e\xd3\x1d"
1495 "\xf7\x9c\x89\x2a\x33\x8f\x4a\x8b",
1496 .rlen = 16,
1497 .np = 2,
1498 .tap = { 8, 8 }
1499 }, { /* Four blocks -- for testing encryption with chunking */
1500 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
1501 .klen = 8,
1502 .input = "\x01\x23\x45\x67\x89\xab\xcd\xe7"
1503 "\x22\x33\x44\x55\x66\x77\x88\x99"
1504 "\xca\xfe\xba\xbe\xfe\xed\xbe\xef"
1505 "\x22\x33\x44\x55\x66\x77\x88\x99",
1506 .ilen = 32,
1507 .result = "\xc9\x57\x44\x25\x6a\x5e\xd3\x1d"
1508 "\xf7\x9c\x89\x2a\x33\x8f\x4a\x8b"
1509 "\xb4\x99\x26\xf7\x1f\xe1\xd4\x90"
1510 "\xf7\x9c\x89\x2a\x33\x8f\x4a\x8b",
1511 .rlen = 32,
1512 .np = 3,
1513 .tap = { 14, 10, 8 }
1514 }, {
1515 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
1516 .klen = 8,
1517 .input = "\x01\x23\x45\x67\x89\xab\xcd\xe7"
1518 "\x22\x33\x44\x55\x66\x77\x88\x99"
1519 "\xca\xfe\xba\xbe\xfe\xed\xbe\xef",
1520 .ilen = 24,
1521 .result = "\xc9\x57\x44\x25\x6a\x5e\xd3\x1d"
1522 "\xf7\x9c\x89\x2a\x33\x8f\x4a\x8b"
1523 "\xb4\x99\x26\xf7\x1f\xe1\xd4\x90",
1524 .rlen = 24,
1525 .np = 4,
1526 .tap = { 2, 1, 3, 18 }
1527 }, {
1528 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
1529 .klen = 8,
1530 .input = "\x01\x23\x45\x67\x89\xab\xcd\xe7"
1531 "\x22\x33\x44\x55\x66\x77\x88\x99",
1532 .ilen = 16,
1533 .result = "\xc9\x57\x44\x25\x6a\x5e\xd3\x1d"
1534 "\xf7\x9c\x89\x2a\x33\x8f\x4a\x8b",
1535 .rlen = 16,
1536 .np = 5,
1537 .tap = { 2, 2, 2, 2, 8 }
1538 }, {
1539 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
1540 .klen = 8,
1541 .input = "\x01\x23\x45\x67\x89\xab\xcd\xe7",
1542 .ilen = 8,
1543 .result = "\xc9\x57\x44\x25\x6a\x5e\xd3\x1d",
1544 .rlen = 8,
1545 .np = 8,
1546 .tap = { 1, 1, 1, 1, 1, 1, 1, 1 }
1547 },
1548};
1549 34
1550static struct cipher_testvec des_dec_tv_template[] = { 35static struct cipher_speed_template des3_speed_template[] = {
1551 { /* From Applied Cryptography */
1552 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
1553 .klen = 8,
1554 .input = "\xc9\x57\x44\x25\x6a\x5e\xd3\x1d",
1555 .ilen = 8,
1556 .result = "\x01\x23\x45\x67\x89\xab\xcd\xe7",
1557 .rlen = 8,
1558 }, { /* Sbox test from NBS */
1559 .key = "\x7c\xa1\x10\x45\x4a\x1a\x6e\x57",
1560 .klen = 8,
1561 .input = "\x69\x0f\x5b\x0d\x9a\x26\x93\x9b",
1562 .ilen = 8,
1563 .result = "\x01\xa1\xd6\xd0\x39\x77\x67\x42",
1564 .rlen = 8,
1565 }, { /* Two blocks, for chunking test */
1566 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
1567 .klen = 8,
1568 .input = "\xc9\x57\x44\x25\x6a\x5e\xd3\x1d"
1569 "\x69\x0f\x5b\x0d\x9a\x26\x93\x9b",
1570 .ilen = 16,
1571 .result = "\x01\x23\x45\x67\x89\xab\xcd\xe7"
1572 "\xa3\x99\x7b\xca\xaf\x69\xa0\xf5",
1573 .rlen = 16,
1574 .np = 2,
1575 .tap = { 8, 8 }
1576 }, {
1577 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
1578 .klen = 8,
1579 .input = "\xc9\x57\x44\x25\x6a\x5e\xd3\x1d"
1580 "\x69\x0f\x5b\x0d\x9a\x26\x93\x9b",
1581 .ilen = 16,
1582 .result = "\x01\x23\x45\x67\x89\xab\xcd\xe7"
1583 "\xa3\x99\x7b\xca\xaf\x69\xa0\xf5",
1584 .rlen = 16,
1585 .np = 3,
1586 .tap = { 3, 12, 1 }
1587 },
1588};
1589
1590static struct cipher_testvec des_cbc_enc_tv_template[] = {
1591 { /* From OpenSSL */
1592 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
1593 .klen = 8,
1594 .iv = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
1595 .input = "\x37\x36\x35\x34\x33\x32\x31\x20"
1596 "\x4e\x6f\x77\x20\x69\x73\x20\x74"
1597 "\x68\x65\x20\x74\x69\x6d\x65\x20",
1598 .ilen = 24,
1599 .result = "\xcc\xd1\x73\xff\xab\x20\x39\xf4"
1600 "\xac\xd8\xae\xfd\xdf\xd8\xa1\xeb"
1601 "\x46\x8e\x91\x15\x78\x88\xba\x68",
1602 .rlen = 24,
1603 }, { /* FIPS Pub 81 */
1604 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
1605 .klen = 8,
1606 .iv = "\x12\x34\x56\x78\x90\xab\xcd\xef",
1607 .input = "\x4e\x6f\x77\x20\x69\x73\x20\x74",
1608 .ilen = 8,
1609 .result = "\xe5\xc7\xcd\xde\x87\x2b\xf2\x7c",
1610 .rlen = 8,
1611 }, {
1612 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
1613 .klen = 8,
1614 .iv = "\xe5\xc7\xcd\xde\x87\x2b\xf2\x7c",
1615 .input = "\x68\x65\x20\x74\x69\x6d\x65\x20",
1616 .ilen = 8,
1617 .result = "\x43\xe9\x34\x00\x8c\x38\x9c\x0f",
1618 .rlen = 8,
1619 }, {
1620 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
1621 .klen = 8,
1622 .iv = "\x43\xe9\x34\x00\x8c\x38\x9c\x0f",
1623 .input = "\x66\x6f\x72\x20\x61\x6c\x6c\x20",
1624 .ilen = 8,
1625 .result = "\x68\x37\x88\x49\x9a\x7c\x05\xf6",
1626 .rlen = 8,
1627 }, { /* Copy of openssl vector for chunk testing */
1628 /* From OpenSSL */
1629 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
1630 .klen = 8,
1631 .iv = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
1632 .input = "\x37\x36\x35\x34\x33\x32\x31\x20"
1633 "\x4e\x6f\x77\x20\x69\x73\x20\x74"
1634 "\x68\x65\x20\x74\x69\x6d\x65\x20",
1635 .ilen = 24,
1636 .result = "\xcc\xd1\x73\xff\xab\x20\x39\xf4"
1637 "\xac\xd8\xae\xfd\xdf\xd8\xa1\xeb"
1638 "\x46\x8e\x91\x15\x78\x88\xba\x68",
1639 .rlen = 24,
1640 .np = 2,
1641 .tap = { 13, 11 }
1642 },
1643};
1644
1645static struct cipher_testvec des_cbc_dec_tv_template[] = {
1646 { /* FIPS Pub 81 */
1647 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
1648 .klen = 8,
1649 .iv = "\x12\x34\x56\x78\x90\xab\xcd\xef",
1650 .input = "\xe5\xc7\xcd\xde\x87\x2b\xf2\x7c",
1651 .ilen = 8,
1652 .result = "\x4e\x6f\x77\x20\x69\x73\x20\x74",
1653 .rlen = 8,
1654 }, {
1655 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
1656 .klen = 8,
1657 .iv = "\xe5\xc7\xcd\xde\x87\x2b\xf2\x7c",
1658 .input = "\x43\xe9\x34\x00\x8c\x38\x9c\x0f",
1659 .ilen = 8,
1660 .result = "\x68\x65\x20\x74\x69\x6d\x65\x20",
1661 .rlen = 8,
1662 }, {
1663 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
1664 .klen = 8,
1665 .iv = "\x43\xe9\x34\x00\x8c\x38\x9c\x0f",
1666 .input = "\x68\x37\x88\x49\x9a\x7c\x05\xf6",
1667 .ilen = 8,
1668 .result = "\x66\x6f\x72\x20\x61\x6c\x6c\x20",
1669 .rlen = 8,
1670 }, { /* Copy of above, for chunk testing */
1671 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
1672 .klen = 8,
1673 .iv = "\x43\xe9\x34\x00\x8c\x38\x9c\x0f",
1674 .input = "\x68\x37\x88\x49\x9a\x7c\x05\xf6",
1675 .ilen = 8,
1676 .result = "\x66\x6f\x72\x20\x61\x6c\x6c\x20",
1677 .rlen = 8,
1678 .np = 2,
1679 .tap = { 4, 4 }
1680 },
1681};
1682
1683/*
1684 * We really need some more test vectors, especially for DES3 CBC.
1685 */
1686static struct cipher_testvec des3_ede_enc_tv_template[] = {
1687 { /* These are from openssl */
1688 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef"
1689 "\x55\x55\x55\x55\x55\x55\x55\x55"
1690 "\xfe\xdc\xba\x98\x76\x54\x32\x10",
1691 .klen = 24,
1692 .input = "\x73\x6f\x6d\x65\x64\x61\x74\x61",
1693 .ilen = 8,
1694 .result = "\x18\xd7\x48\xe5\x63\x62\x05\x72",
1695 .rlen = 8,
1696 }, {
1697 .key = "\x03\x52\x02\x07\x67\x20\x82\x17"
1698 "\x86\x02\x87\x66\x59\x08\x21\x98"
1699 "\x64\x05\x6a\xbd\xfe\xa9\x34\x57",
1700 .klen = 24,
1701 .input = "\x73\x71\x75\x69\x67\x67\x6c\x65",
1702 .ilen = 8,
1703 .result = "\xc0\x7d\x2a\x0f\xa5\x66\xfa\x30",
1704 .rlen = 8,
1705 }, {
1706 .key = "\x10\x46\x10\x34\x89\x98\x80\x20"
1707 "\x91\x07\xd0\x15\x89\x19\x01\x01"
1708 "\x19\x07\x92\x10\x98\x1a\x01\x01",
1709 .klen = 24,
1710 .input = "\x00\x00\x00\x00\x00\x00\x00\x00",
1711 .ilen = 8,
1712 .result = "\xe1\xef\x62\xc3\x32\xfe\x82\x5b",
1713 .rlen = 8,
1714 },
1715};
1716
1717static struct cipher_testvec des3_ede_dec_tv_template[] = {
1718 { /* These are from openssl */
1719 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef"
1720 "\x55\x55\x55\x55\x55\x55\x55\x55"
1721 "\xfe\xdc\xba\x98\x76\x54\x32\x10",
1722 .klen = 24,
1723 .input = "\x18\xd7\x48\xe5\x63\x62\x05\x72",
1724 .ilen = 8,
1725 .result = "\x73\x6f\x6d\x65\x64\x61\x74\x61",
1726 .rlen = 8,
1727 }, {
1728 .key = "\x03\x52\x02\x07\x67\x20\x82\x17"
1729 "\x86\x02\x87\x66\x59\x08\x21\x98"
1730 "\x64\x05\x6a\xbd\xfe\xa9\x34\x57",
1731 .klen = 24,
1732 .input = "\xc0\x7d\x2a\x0f\xa5\x66\xfa\x30",
1733 .ilen = 8,
1734 .result = "\x73\x71\x75\x69\x67\x67\x6c\x65",
1735 .rlen = 8,
1736 }, {
1737 .key = "\x10\x46\x10\x34\x89\x98\x80\x20"
1738 "\x91\x07\xd0\x15\x89\x19\x01\x01"
1739 "\x19\x07\x92\x10\x98\x1a\x01\x01",
1740 .klen = 24,
1741 .input = "\xe1\xef\x62\xc3\x32\xfe\x82\x5b",
1742 .ilen = 8,
1743 .result = "\x00\x00\x00\x00\x00\x00\x00\x00",
1744 .rlen = 8,
1745 },
1746};
1747
1748/*
1749 * Blowfish test vectors.
1750 */
1751#define BF_ENC_TEST_VECTORS 6
1752#define BF_DEC_TEST_VECTORS 6
1753#define BF_CBC_ENC_TEST_VECTORS 1
1754#define BF_CBC_DEC_TEST_VECTORS 1
1755
1756static struct cipher_testvec bf_enc_tv_template[] = {
1757 { /* DES test vectors from OpenSSL */
1758 .key = "\x00\x00\x00\x00\x00\x00\x00\x00",
1759 .klen = 8,
1760 .input = "\x00\x00\x00\x00\x00\x00\x00\x00",
1761 .ilen = 8,
1762 .result = "\x4e\xf9\x97\x45\x61\x98\xdd\x78",
1763 .rlen = 8,
1764 }, {
1765 .key = "\x1f\x1f\x1f\x1f\x0e\x0e\x0e\x0e",
1766 .klen = 8,
1767 .input = "\x01\x23\x45\x67\x89\xab\xcd\xef",
1768 .ilen = 8,
1769 .result = "\xa7\x90\x79\x51\x08\xea\x3c\xae",
1770 .rlen = 8,
1771 }, {
1772 .key = "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87",
1773 .klen = 8,
1774 .input = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
1775 .ilen = 8,
1776 .result = "\xe8\x7a\x24\x4e\x2c\xc8\x5e\x82",
1777 .rlen = 8,
1778 }, { /* Vary the keylength... */
1779 .key = "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87"
1780 "\x78\x69\x5a\x4b\x3c\x2d\x1e\x0f",
1781 .klen = 16,
1782 .input = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
1783 .ilen = 8,
1784 .result = "\x93\x14\x28\x87\xee\x3b\xe1\x5c",
1785 .rlen = 8,
1786 }, {
1787 .key = "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87"
1788 "\x78\x69\x5a\x4b\x3c\x2d\x1e\x0f"
1789 "\x00\x11\x22\x33\x44",
1790 .klen = 21,
1791 .input = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
1792 .ilen = 8,
1793 .result = "\xe6\xf5\x1e\xd7\x9b\x9d\xb2\x1f",
1794 .rlen = 8,
1795 }, { /* Generated with bf488 */
1796 .key = "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87"
1797 "\x78\x69\x5a\x4b\x3c\x2d\x1e\x0f"
1798 "\x00\x11\x22\x33\x44\x55\x66\x77"
1799 "\x04\x68\x91\x04\xc2\xfd\x3b\x2f"
1800 "\x58\x40\x23\x64\x1a\xba\x61\x76"
1801 "\x1f\x1f\x1f\x1f\x0e\x0e\x0e\x0e"
1802 "\xff\xff\xff\xff\xff\xff\xff\xff",
1803 .klen = 56,
1804 .input = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
1805 .ilen = 8,
1806 .result = "\xc0\x45\x04\x01\x2e\x4e\x1f\x53",
1807 .rlen = 8,
1808 },
1809};
1810
1811static struct cipher_testvec bf_dec_tv_template[] = {
1812 { /* DES test vectors from OpenSSL */
1813 .key = "\x00\x00\x00\x00\x00\x00\x00\x00",
1814 .klen = 8,
1815 .input = "\x4e\xf9\x97\x45\x61\x98\xdd\x78",
1816 .ilen = 8,
1817 .result = "\x00\x00\x00\x00\x00\x00\x00\x00",
1818 .rlen = 8,
1819 }, {
1820 .key = "\x1f\x1f\x1f\x1f\x0e\x0e\x0e\x0e",
1821 .klen = 8,
1822 .input = "\xa7\x90\x79\x51\x08\xea\x3c\xae",
1823 .ilen = 8,
1824 .result = "\x01\x23\x45\x67\x89\xab\xcd\xef",
1825 .rlen = 8,
1826 }, {
1827 .key = "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87",
1828 .klen = 8,
1829 .input = "\xe8\x7a\x24\x4e\x2c\xc8\x5e\x82",
1830 .ilen = 8,
1831 .result = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
1832 .rlen = 8,
1833 }, { /* Vary the keylength... */
1834 .key = "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87"
1835 "\x78\x69\x5a\x4b\x3c\x2d\x1e\x0f",
1836 .klen = 16,
1837 .input = "\x93\x14\x28\x87\xee\x3b\xe1\x5c",
1838 .ilen = 8,
1839 .result = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
1840 .rlen = 8,
1841 }, {
1842 .key = "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87"
1843 "\x78\x69\x5a\x4b\x3c\x2d\x1e\x0f"
1844 "\x00\x11\x22\x33\x44",
1845 .klen = 21,
1846 .input = "\xe6\xf5\x1e\xd7\x9b\x9d\xb2\x1f",
1847 .ilen = 8,
1848 .result = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
1849 .rlen = 8,
1850 }, { /* Generated with bf488, using OpenSSL, Libgcrypt and Nettle */
1851 .key = "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87"
1852 "\x78\x69\x5a\x4b\x3c\x2d\x1e\x0f"
1853 "\x00\x11\x22\x33\x44\x55\x66\x77"
1854 "\x04\x68\x91\x04\xc2\xfd\x3b\x2f"
1855 "\x58\x40\x23\x64\x1a\xba\x61\x76"
1856 "\x1f\x1f\x1f\x1f\x0e\x0e\x0e\x0e"
1857 "\xff\xff\xff\xff\xff\xff\xff\xff",
1858 .klen = 56,
1859 .input = "\xc0\x45\x04\x01\x2e\x4e\x1f\x53",
1860 .ilen = 8,
1861 .result = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
1862 .rlen = 8,
1863 },
1864};
1865
1866static struct cipher_testvec bf_cbc_enc_tv_template[] = {
1867 { /* From OpenSSL */
1868 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef"
1869 "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87",
1870 .klen = 16,
1871 .iv = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
1872 .input = "\x37\x36\x35\x34\x33\x32\x31\x20"
1873 "\x4e\x6f\x77\x20\x69\x73\x20\x74"
1874 "\x68\x65\x20\x74\x69\x6d\x65\x20"
1875 "\x66\x6f\x72\x20\x00\x00\x00\x00",
1876 .ilen = 32,
1877 .result = "\x6b\x77\xb4\xd6\x30\x06\xde\xe6"
1878 "\x05\xb1\x56\xe2\x74\x03\x97\x93"
1879 "\x58\xde\xb9\xe7\x15\x46\x16\xd9"
1880 "\x59\xf1\x65\x2b\xd5\xff\x92\xcc",
1881 .rlen = 32,
1882 },
1883};
1884
1885static struct cipher_testvec bf_cbc_dec_tv_template[] = {
1886 { /* From OpenSSL */
1887 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef"
1888 "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87",
1889 .klen = 16,
1890 .iv = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
1891 .input = "\x6b\x77\xb4\xd6\x30\x06\xde\xe6"
1892 "\x05\xb1\x56\xe2\x74\x03\x97\x93"
1893 "\x58\xde\xb9\xe7\x15\x46\x16\xd9"
1894 "\x59\xf1\x65\x2b\xd5\xff\x92\xcc",
1895 .ilen = 32,
1896 .result = "\x37\x36\x35\x34\x33\x32\x31\x20"
1897 "\x4e\x6f\x77\x20\x69\x73\x20\x74"
1898 "\x68\x65\x20\x74\x69\x6d\x65\x20"
1899 "\x66\x6f\x72\x20\x00\x00\x00\x00",
1900 .rlen = 32,
1901 },
1902};
1903
1904/*
1905 * Twofish test vectors.
1906 */
1907#define TF_ENC_TEST_VECTORS 3
1908#define TF_DEC_TEST_VECTORS 3
1909#define TF_CBC_ENC_TEST_VECTORS 4
1910#define TF_CBC_DEC_TEST_VECTORS 4
1911
1912static struct cipher_testvec tf_enc_tv_template[] = {
1913 {
1914 .key = zeroed_string,
1915 .klen = 16,
1916 .input = zeroed_string,
1917 .ilen = 16,
1918 .result = "\x9f\x58\x9f\x5c\xf6\x12\x2c\x32"
1919 "\xb6\xbf\xec\x2f\x2a\xe8\xc3\x5a",
1920 .rlen = 16,
1921 }, {
1922 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef"
1923 "\xfe\xdc\xba\x98\x76\x54\x32\x10"
1924 "\x00\x11\x22\x33\x44\x55\x66\x77",
1925 .klen = 24,
1926 .input = zeroed_string,
1927 .ilen = 16,
1928 .result = "\xcf\xd1\xd2\xe5\xa9\xbe\x9c\xdf"
1929 "\x50\x1f\x13\xb8\x92\xbd\x22\x48",
1930 .rlen = 16,
1931 }, {
1932 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef"
1933 "\xfe\xdc\xba\x98\x76\x54\x32\x10"
1934 "\x00\x11\x22\x33\x44\x55\x66\x77"
1935 "\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
1936 .klen = 32,
1937 .input = zeroed_string,
1938 .ilen = 16,
1939 .result = "\x37\x52\x7b\xe0\x05\x23\x34\xb8"
1940 "\x9f\x0c\xfc\xca\xe8\x7c\xfa\x20",
1941 .rlen = 16,
1942 },
1943};
1944
1945static struct cipher_testvec tf_dec_tv_template[] = {
1946 { 36 {
1947 .key = zeroed_string,
1948 .klen = 16,
1949 .input = "\x9f\x58\x9f\x5c\xf6\x12\x2c\x32"
1950 "\xb6\xbf\xec\x2f\x2a\xe8\xc3\x5a",
1951 .ilen = 16,
1952 .result = zeroed_string,
1953 .rlen = 16,
1954 }, {
1955 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef" 37 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef"
1956 "\xfe\xdc\xba\x98\x76\x54\x32\x10" 38 "\x55\x55\x55\x55\x55\x55\x55\x55"
1957 "\x00\x11\x22\x33\x44\x55\x66\x77",
1958 .klen = 24,
1959 .input = "\xcf\xd1\xd2\xe5\xa9\xbe\x9c\xdf"
1960 "\x50\x1f\x13\xb8\x92\xbd\x22\x48",
1961 .ilen = 16,
1962 .result = zeroed_string,
1963 .rlen = 16,
1964 }, {
1965 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef"
1966 "\xfe\xdc\xba\x98\x76\x54\x32\x10"
1967 "\x00\x11\x22\x33\x44\x55\x66\x77"
1968 "\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
1969 .klen = 32,
1970 .input = "\x37\x52\x7b\xe0\x05\x23\x34\xb8"
1971 "\x9f\x0c\xfc\xca\xe8\x7c\xfa\x20",
1972 .ilen = 16,
1973 .result = zeroed_string,
1974 .rlen = 16,
1975 },
1976};
1977
1978static struct cipher_testvec tf_cbc_enc_tv_template[] = {
1979 { /* Generated with Nettle */
1980 .key = zeroed_string,
1981 .klen = 16,
1982 .iv = zeroed_string,
1983 .input = zeroed_string,
1984 .ilen = 16,
1985 .result = "\x9f\x58\x9f\x5c\xf6\x12\x2c\x32"
1986 "\xb6\xbf\xec\x2f\x2a\xe8\xc3\x5a",
1987 .rlen = 16,
1988 }, {
1989 .key = zeroed_string,
1990 .klen = 16,
1991 .iv = "\x9f\x58\x9f\x5c\xf6\x12\x2c\x32"
1992 "\xb6\xbf\xec\x2f\x2a\xe8\xc3\x5a",
1993 .input = zeroed_string,
1994 .ilen = 16,
1995 .result = "\xd4\x91\xdb\x16\xe7\xb1\xc3\x9e"
1996 "\x86\xcb\x08\x6b\x78\x9f\x54\x19",
1997 .rlen = 16,
1998 }, {
1999 .key = zeroed_string,
2000 .klen = 16,
2001 .iv = "\xd4\x91\xdb\x16\xe7\xb1\xc3\x9e"
2002 "\x86\xcb\x08\x6b\x78\x9f\x54\x19",
2003 .input = zeroed_string,
2004 .ilen = 16,
2005 .result = "\x05\xef\x8c\x61\xa8\x11\x58\x26"
2006 "\x34\xba\x5c\xb7\x10\x6a\xa6\x41",
2007 .rlen = 16,
2008 }, {
2009 .key = zeroed_string,
2010 .klen = 16,
2011 .iv = zeroed_string,
2012 .input = zeroed_string,
2013 .ilen = 48,
2014 .result = "\x9f\x58\x9f\x5c\xf6\x12\x2c\x32"
2015 "\xb6\xbf\xec\x2f\x2a\xe8\xc3\x5a"
2016 "\xd4\x91\xdb\x16\xe7\xb1\xc3\x9e"
2017 "\x86\xcb\x08\x6b\x78\x9f\x54\x19"
2018 "\x05\xef\x8c\x61\xa8\x11\x58\x26"
2019 "\x34\xba\x5c\xb7\x10\x6a\xa6\x41",
2020 .rlen = 48,
2021 },
2022};
2023
2024static struct cipher_testvec tf_cbc_dec_tv_template[] = {
2025 { /* Reverse of the first four above */
2026 .key = zeroed_string,
2027 .klen = 16,
2028 .iv = zeroed_string,
2029 .input = "\x9f\x58\x9f\x5c\xf6\x12\x2c\x32"
2030 "\xb6\xbf\xec\x2f\x2a\xe8\xc3\x5a",
2031 .ilen = 16,
2032 .result = zeroed_string,
2033 .rlen = 16,
2034 }, {
2035 .key = zeroed_string,
2036 .klen = 16,
2037 .iv = "\x9f\x58\x9f\x5c\xf6\x12\x2c\x32"
2038 "\xb6\xbf\xec\x2f\x2a\xe8\xc3\x5a",
2039 .input = "\xd4\x91\xdb\x16\xe7\xb1\xc3\x9e"
2040 "\x86\xcb\x08\x6b\x78\x9f\x54\x19",
2041 .ilen = 16,
2042 .result = zeroed_string,
2043 .rlen = 16,
2044 }, {
2045 .key = zeroed_string,
2046 .klen = 16,
2047 .iv = "\xd4\x91\xdb\x16\xe7\xb1\xc3\x9e"
2048 "\x86\xcb\x08\x6b\x78\x9f\x54\x19",
2049 .input = "\x05\xef\x8c\x61\xa8\x11\x58\x26"
2050 "\x34\xba\x5c\xb7\x10\x6a\xa6\x41",
2051 .ilen = 16,
2052 .result = zeroed_string,
2053 .rlen = 16,
2054 }, {
2055 .key = zeroed_string,
2056 .klen = 16,
2057 .iv = zeroed_string,
2058 .input = "\x9f\x58\x9f\x5c\xf6\x12\x2c\x32"
2059 "\xb6\xbf\xec\x2f\x2a\xe8\xc3\x5a"
2060 "\xd4\x91\xdb\x16\xe7\xb1\xc3\x9e"
2061 "\x86\xcb\x08\x6b\x78\x9f\x54\x19"
2062 "\x05\xef\x8c\x61\xa8\x11\x58\x26"
2063 "\x34\xba\x5c\xb7\x10\x6a\xa6\x41",
2064 .ilen = 48,
2065 .result = zeroed_string,
2066 .rlen = 48,
2067 },
2068};
2069
2070/*
2071 * Serpent test vectors. These are backwards because Serpent writes
2072 * octet sequences in right-to-left mode.
2073 */
2074#define SERPENT_ENC_TEST_VECTORS 4
2075#define SERPENT_DEC_TEST_VECTORS 4
2076
2077#define TNEPRES_ENC_TEST_VECTORS 4
2078#define TNEPRES_DEC_TEST_VECTORS 4
2079
2080static struct cipher_testvec serpent_enc_tv_template[] = {
2081 {
2082 .input = "\x00\x01\x02\x03\x04\x05\x06\x07"
2083 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
2084 .ilen = 16,
2085 .result = "\x12\x07\xfc\xce\x9b\xd0\xd6\x47"
2086 "\x6a\xe9\x8f\xbe\xd1\x43\xa0\xe2",
2087 .rlen = 16,
2088 }, {
2089 .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
2090 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
2091 .klen = 16,
2092 .input = "\x00\x01\x02\x03\x04\x05\x06\x07"
2093 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
2094 .ilen = 16,
2095 .result = "\x4c\x7d\x8a\x32\x80\x72\xa2\x2c"
2096 "\x82\x3e\x4a\x1f\x3a\xcd\xa1\x6d",
2097 .rlen = 16,
2098 }, {
2099 .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
2100 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
2101 "\x10\x11\x12\x13\x14\x15\x16\x17"
2102 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
2103 .klen = 32,
2104 .input = "\x00\x01\x02\x03\x04\x05\x06\x07"
2105 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
2106 .ilen = 16,
2107 .result = "\xde\x26\x9f\xf8\x33\xe4\x32\xb8"
2108 "\x5b\x2e\x88\xd2\x70\x1c\xe7\x5c",
2109 .rlen = 16,
2110 }, {
2111 .key = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80",
2112 .klen = 16,
2113 .input = zeroed_string,
2114 .ilen = 16,
2115 .result = "\xdd\xd2\x6b\x98\xa5\xff\xd8\x2c"
2116 "\x05\x34\x5a\x9d\xad\xbf\xaf\x49",
2117 .rlen = 16,
2118 },
2119};
2120
2121static struct cipher_testvec tnepres_enc_tv_template[] = {
2122 { /* KeySize=128, PT=0, I=1 */
2123 .input = "\x00\x00\x00\x00\x00\x00\x00\x00"
2124 "\x00\x00\x00\x00\x00\x00\x00\x00",
2125 .key = "\x80\x00\x00\x00\x00\x00\x00\x00"
2126 "\x00\x00\x00\x00\x00\x00\x00\x00",
2127 .klen = 16,
2128 .ilen = 16,
2129 .result = "\x49\xaf\xbf\xad\x9d\x5a\x34\x05"
2130 "\x2c\xd8\xff\xa5\x98\x6b\xd2\xdd",
2131 .rlen = 16,
2132 }, { /* KeySize=192, PT=0, I=1 */
2133 .key = "\x80\x00\x00\x00\x00\x00\x00\x00"
2134 "\x00\x00\x00\x00\x00\x00\x00\x00"
2135 "\x00\x00\x00\x00\x00\x00\x00\x00",
2136 .klen = 24,
2137 .input = "\x00\x00\x00\x00\x00\x00\x00\x00"
2138 "\x00\x00\x00\x00\x00\x00\x00\x00",
2139 .ilen = 16,
2140 .result = "\xe7\x8e\x54\x02\xc7\x19\x55\x68"
2141 "\xac\x36\x78\xf7\xa3\xf6\x0c\x66",
2142 .rlen = 16,
2143 }, { /* KeySize=256, PT=0, I=1 */
2144 .key = "\x80\x00\x00\x00\x00\x00\x00\x00"
2145 "\x00\x00\x00\x00\x00\x00\x00\x00"
2146 "\x00\x00\x00\x00\x00\x00\x00\x00"
2147 "\x00\x00\x00\x00\x00\x00\x00\x00",
2148 .klen = 32,
2149 .input = "\x00\x00\x00\x00\x00\x00\x00\x00"
2150 "\x00\x00\x00\x00\x00\x00\x00\x00",
2151 .ilen = 16,
2152 .result = "\xab\xed\x96\xe7\x66\xbf\x28\xcb"
2153 "\xc0\xeb\xd2\x1a\x82\xef\x08\x19",
2154 .rlen = 16,
2155 }, { /* KeySize=256, I=257 */
2156 .key = "\x1f\x1e\x1d\x1c\x1b\x1a\x19\x18"
2157 "\x17\x16\x15\x14\x13\x12\x11\x10"
2158 "\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08"
2159 "\x07\x06\x05\x04\x03\x02\x01\x00",
2160 .klen = 32,
2161 .input = "\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08"
2162 "\x07\x06\x05\x04\x03\x02\x01\x00",
2163 .ilen = 16,
2164 .result = "\x5c\xe7\x1c\x70\xd2\x88\x2e\x5b"
2165 "\xb8\x32\xe4\x33\xf8\x9f\x26\xde",
2166 .rlen = 16,
2167 },
2168};
2169
2170
2171static struct cipher_testvec serpent_dec_tv_template[] = {
2172 {
2173 .input = "\x12\x07\xfc\xce\x9b\xd0\xd6\x47"
2174 "\x6a\xe9\x8f\xbe\xd1\x43\xa0\xe2",
2175 .ilen = 16,
2176 .result = "\x00\x01\x02\x03\x04\x05\x06\x07"
2177 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
2178 .rlen = 16,
2179 }, {
2180 .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
2181 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
2182 .klen = 16,
2183 .input = "\x4c\x7d\x8a\x32\x80\x72\xa2\x2c"
2184 "\x82\x3e\x4a\x1f\x3a\xcd\xa1\x6d",
2185 .ilen = 16,
2186 .result = "\x00\x01\x02\x03\x04\x05\x06\x07"
2187 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
2188 .rlen = 16,
2189 }, {
2190 .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
2191 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
2192 "\x10\x11\x12\x13\x14\x15\x16\x17"
2193 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
2194 .klen = 32,
2195 .input = "\xde\x26\x9f\xf8\x33\xe4\x32\xb8"
2196 "\x5b\x2e\x88\xd2\x70\x1c\xe7\x5c",
2197 .ilen = 16,
2198 .result = "\x00\x01\x02\x03\x04\x05\x06\x07"
2199 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
2200 .rlen = 16,
2201 }, {
2202 .key = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80",
2203 .klen = 16,
2204 .input = "\xdd\xd2\x6b\x98\xa5\xff\xd8\x2c"
2205 "\x05\x34\x5a\x9d\xad\xbf\xaf\x49",
2206 .ilen = 16,
2207 .result = zeroed_string,
2208 .rlen = 16,
2209 },
2210};
2211
2212static struct cipher_testvec tnepres_dec_tv_template[] = {
2213 {
2214 .input = "\x41\xcc\x6b\x31\x59\x31\x45\x97"
2215 "\x6d\x6f\xbb\x38\x4b\x37\x21\x28",
2216 .ilen = 16,
2217 .result = "\x00\x01\x02\x03\x04\x05\x06\x07"
2218 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
2219 .rlen = 16,
2220 }, {
2221 .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
2222 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
2223 .klen = 16,
2224 .input = "\xea\xf4\xd7\xfc\xd8\x01\x34\x47"
2225 "\x81\x45\x0b\xfa\x0c\xd6\xad\x6e",
2226 .ilen = 16,
2227 .result = "\x00\x01\x02\x03\x04\x05\x06\x07"
2228 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
2229 .rlen = 16,
2230 }, {
2231 .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
2232 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
2233 "\x10\x11\x12\x13\x14\x15\x16\x17"
2234 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
2235 .klen = 32,
2236 .input = "\x64\xa9\x1a\x37\xed\x9f\xe7\x49"
2237 "\xa8\x4e\x76\xd6\xf5\x0d\x78\xee",
2238 .ilen = 16,
2239 .result = "\x00\x01\x02\x03\x04\x05\x06\x07"
2240 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
2241 .rlen = 16,
2242 }, { /* KeySize=128, I=121 */
2243 .key = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80",
2244 .klen = 16,
2245 .input = "\x3d\xda\xbf\xc0\x06\xda\xab\x06"
2246 "\x46\x2a\xf4\xef\x81\x54\x4e\x26",
2247 .ilen = 16,
2248 .result = zeroed_string,
2249 .rlen = 16,
2250 },
2251};
2252
2253
2254/* Cast6 test vectors from RFC 2612 */
2255#define CAST6_ENC_TEST_VECTORS 3
2256#define CAST6_DEC_TEST_VECTORS 3
2257
2258static struct cipher_testvec cast6_enc_tv_template[] = {
2259 {
2260 .key = "\x23\x42\xbb\x9e\xfa\x38\x54\x2c"
2261 "\x0a\xf7\x56\x47\xf2\x9f\x61\x5d",
2262 .klen = 16,
2263 .input = zeroed_string,
2264 .ilen = 16,
2265 .result = "\xc8\x42\xa0\x89\x72\xb4\x3d\x20"
2266 "\x83\x6c\x91\xd1\xb7\x53\x0f\x6b",
2267 .rlen = 16,
2268 }, {
2269 .key = "\x23\x42\xbb\x9e\xfa\x38\x54\x2c"
2270 "\xbe\xd0\xac\x83\x94\x0a\xc2\x98"
2271 "\xba\xc7\x7a\x77\x17\x94\x28\x63",
2272 .klen = 24,
2273 .input = zeroed_string,
2274 .ilen = 16,
2275 .result = "\x1b\x38\x6c\x02\x10\xdc\xad\xcb"
2276 "\xdd\x0e\x41\xaa\x08\xa7\xa7\xe8",
2277 .rlen = 16,
2278 }, {
2279 .key = "\x23\x42\xbb\x9e\xfa\x38\x54\x2c"
2280 "\xbe\xd0\xac\x83\x94\x0a\xc2\x98"
2281 "\x8d\x7c\x47\xce\x26\x49\x08\x46"
2282 "\x1c\xc1\xb5\x13\x7a\xe6\xb6\x04",
2283 .klen = 32,
2284 .input = zeroed_string,
2285 .ilen = 16,
2286 .result = "\x4f\x6a\x20\x38\x28\x68\x97\xb9"
2287 "\xc9\x87\x01\x36\x55\x33\x17\xfa",
2288 .rlen = 16,
2289 },
2290};
2291
2292static struct cipher_testvec cast6_dec_tv_template[] = {
2293 {
2294 .key = "\x23\x42\xbb\x9e\xfa\x38\x54\x2c"
2295 "\x0a\xf7\x56\x47\xf2\x9f\x61\x5d",
2296 .klen = 16,
2297 .input = "\xc8\x42\xa0\x89\x72\xb4\x3d\x20"
2298 "\x83\x6c\x91\xd1\xb7\x53\x0f\x6b",
2299 .ilen = 16,
2300 .result = zeroed_string,
2301 .rlen = 16,
2302 }, {
2303 .key = "\x23\x42\xbb\x9e\xfa\x38\x54\x2c"
2304 "\xbe\xd0\xac\x83\x94\x0a\xc2\x98"
2305 "\xba\xc7\x7a\x77\x17\x94\x28\x63",
2306 .klen = 24,
2307 .input = "\x1b\x38\x6c\x02\x10\xdc\xad\xcb"
2308 "\xdd\x0e\x41\xaa\x08\xa7\xa7\xe8",
2309 .ilen = 16,
2310 .result = zeroed_string,
2311 .rlen = 16,
2312 }, {
2313 .key = "\x23\x42\xbb\x9e\xfa\x38\x54\x2c"
2314 "\xbe\xd0\xac\x83\x94\x0a\xc2\x98"
2315 "\x8d\x7c\x47\xce\x26\x49\x08\x46"
2316 "\x1c\xc1\xb5\x13\x7a\xe6\xb6\x04",
2317 .klen = 32,
2318 .input = "\x4f\x6a\x20\x38\x28\x68\x97\xb9"
2319 "\xc9\x87\x01\x36\x55\x33\x17\xfa",
2320 .ilen = 16,
2321 .result = zeroed_string,
2322 .rlen = 16,
2323 },
2324};
2325
2326
2327/*
2328 * AES test vectors.
2329 */
2330#define AES_ENC_TEST_VECTORS 3
2331#define AES_DEC_TEST_VECTORS 3
2332#define AES_CBC_ENC_TEST_VECTORS 4
2333#define AES_CBC_DEC_TEST_VECTORS 4
2334#define AES_LRW_ENC_TEST_VECTORS 8
2335#define AES_LRW_DEC_TEST_VECTORS 8
2336#define AES_XTS_ENC_TEST_VECTORS 4
2337#define AES_XTS_DEC_TEST_VECTORS 4
2338#define AES_CTR_ENC_TEST_VECTORS 7
2339#define AES_CTR_DEC_TEST_VECTORS 6
2340#define AES_GCM_ENC_TEST_VECTORS 9
2341#define AES_GCM_DEC_TEST_VECTORS 8
2342#define AES_CCM_ENC_TEST_VECTORS 7
2343#define AES_CCM_DEC_TEST_VECTORS 7
2344
2345static struct cipher_testvec aes_enc_tv_template[] = {
2346 { /* From FIPS-197 */
2347 .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
2348 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
2349 .klen = 16,
2350 .input = "\x00\x11\x22\x33\x44\x55\x66\x77"
2351 "\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
2352 .ilen = 16,
2353 .result = "\x69\xc4\xe0\xd8\x6a\x7b\x04\x30"
2354 "\xd8\xcd\xb7\x80\x70\xb4\xc5\x5a",
2355 .rlen = 16,
2356 }, {
2357 .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
2358 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
2359 "\x10\x11\x12\x13\x14\x15\x16\x17",
2360 .klen = 24,
2361 .input = "\x00\x11\x22\x33\x44\x55\x66\x77"
2362 "\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
2363 .ilen = 16,
2364 .result = "\xdd\xa9\x7c\xa4\x86\x4c\xdf\xe0"
2365 "\x6e\xaf\x70\xa0\xec\x0d\x71\x91",
2366 .rlen = 16,
2367 }, {
2368 .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
2369 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
2370 "\x10\x11\x12\x13\x14\x15\x16\x17"
2371 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
2372 .klen = 32,
2373 .input = "\x00\x11\x22\x33\x44\x55\x66\x77"
2374 "\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
2375 .ilen = 16,
2376 .result = "\x8e\xa2\xb7\xca\x51\x67\x45\xbf"
2377 "\xea\xfc\x49\x90\x4b\x49\x60\x89",
2378 .rlen = 16,
2379 },
2380};
2381
2382static struct cipher_testvec aes_dec_tv_template[] = {
2383 { /* From FIPS-197 */
2384 .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
2385 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
2386 .klen = 16,
2387 .input = "\x69\xc4\xe0\xd8\x6a\x7b\x04\x30"
2388 "\xd8\xcd\xb7\x80\x70\xb4\xc5\x5a",
2389 .ilen = 16,
2390 .result = "\x00\x11\x22\x33\x44\x55\x66\x77"
2391 "\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
2392 .rlen = 16,
2393 }, {
2394 .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
2395 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
2396 "\x10\x11\x12\x13\x14\x15\x16\x17",
2397 .klen = 24,
2398 .input = "\xdd\xa9\x7c\xa4\x86\x4c\xdf\xe0"
2399 "\x6e\xaf\x70\xa0\xec\x0d\x71\x91",
2400 .ilen = 16,
2401 .result = "\x00\x11\x22\x33\x44\x55\x66\x77"
2402 "\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
2403 .rlen = 16,
2404 }, {
2405 .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
2406 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
2407 "\x10\x11\x12\x13\x14\x15\x16\x17"
2408 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
2409 .klen = 32,
2410 .input = "\x8e\xa2\xb7\xca\x51\x67\x45\xbf"
2411 "\xea\xfc\x49\x90\x4b\x49\x60\x89",
2412 .ilen = 16,
2413 .result = "\x00\x11\x22\x33\x44\x55\x66\x77"
2414 "\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
2415 .rlen = 16,
2416 },
2417};
2418
2419static struct cipher_testvec aes_cbc_enc_tv_template[] = {
2420 { /* From RFC 3602 */
2421 .key = "\x06\xa9\x21\x40\x36\xb8\xa1\x5b"
2422 "\x51\x2e\x03\xd5\x34\x12\x00\x06",
2423 .klen = 16,
2424 .iv = "\x3d\xaf\xba\x42\x9d\x9e\xb4\x30"
2425 "\xb4\x22\xda\x80\x2c\x9f\xac\x41",
2426 .input = "Single block msg",
2427 .ilen = 16,
2428 .result = "\xe3\x53\x77\x9c\x10\x79\xae\xb8"
2429 "\x27\x08\x94\x2d\xbe\x77\x18\x1a",
2430 .rlen = 16,
2431 }, {
2432 .key = "\xc2\x86\x69\x6d\x88\x7c\x9a\xa0"
2433 "\x61\x1b\xbb\x3e\x20\x25\xa4\x5a",
2434 .klen = 16,
2435 .iv = "\x56\x2e\x17\x99\x6d\x09\x3d\x28"
2436 "\xdd\xb3\xba\x69\x5a\x2e\x6f\x58",
2437 .input = "\x00\x01\x02\x03\x04\x05\x06\x07"
2438 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
2439 "\x10\x11\x12\x13\x14\x15\x16\x17"
2440 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
2441 .ilen = 32,
2442 .result = "\xd2\x96\xcd\x94\xc2\xcc\xcf\x8a"
2443 "\x3a\x86\x30\x28\xb5\xe1\xdc\x0a"
2444 "\x75\x86\x60\x2d\x25\x3c\xff\xf9"
2445 "\x1b\x82\x66\xbe\xa6\xd6\x1a\xb1",
2446 .rlen = 32,
2447 }, { /* From NIST SP800-38A */
2448 .key = "\x8e\x73\xb0\xf7\xda\x0e\x64\x52"
2449 "\xc8\x10\xf3\x2b\x80\x90\x79\xe5"
2450 "\x62\xf8\xea\xd2\x52\x2c\x6b\x7b",
2451 .klen = 24,
2452 .iv = "\x00\x01\x02\x03\x04\x05\x06\x07"
2453 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
2454 .input = "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96"
2455 "\xe9\x3d\x7e\x11\x73\x93\x17\x2a"
2456 "\xae\x2d\x8a\x57\x1e\x03\xac\x9c"
2457 "\x9e\xb7\x6f\xac\x45\xaf\x8e\x51"
2458 "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11"
2459 "\xe5\xfb\xc1\x19\x1a\x0a\x52\xef"
2460 "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17"
2461 "\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
2462 .ilen = 64,
2463 .result = "\x4f\x02\x1d\xb2\x43\xbc\x63\x3d"
2464 "\x71\x78\x18\x3a\x9f\xa0\x71\xe8"
2465 "\xb4\xd9\xad\xa9\xad\x7d\xed\xf4"
2466 "\xe5\xe7\x38\x76\x3f\x69\x14\x5a"
2467 "\x57\x1b\x24\x20\x12\xfb\x7a\xe0"
2468 "\x7f\xa9\xba\xac\x3d\xf1\x02\xe0"
2469 "\x08\xb0\xe2\x79\x88\x59\x88\x81"
2470 "\xd9\x20\xa9\xe6\x4f\x56\x15\xcd",
2471 .rlen = 64,
2472 }, {
2473 .key = "\x60\x3d\xeb\x10\x15\xca\x71\xbe"
2474 "\x2b\x73\xae\xf0\x85\x7d\x77\x81"
2475 "\x1f\x35\x2c\x07\x3b\x61\x08\xd7"
2476 "\x2d\x98\x10\xa3\x09\x14\xdf\xf4",
2477 .klen = 32,
2478 .iv = "\x00\x01\x02\x03\x04\x05\x06\x07"
2479 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
2480 .input = "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96"
2481 "\xe9\x3d\x7e\x11\x73\x93\x17\x2a"
2482 "\xae\x2d\x8a\x57\x1e\x03\xac\x9c"
2483 "\x9e\xb7\x6f\xac\x45\xaf\x8e\x51"
2484 "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11"
2485 "\xe5\xfb\xc1\x19\x1a\x0a\x52\xef"
2486 "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17"
2487 "\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
2488 .ilen = 64,
2489 .result = "\xf5\x8c\x4c\x04\xd6\xe5\xf1\xba"
2490 "\x77\x9e\xab\xfb\x5f\x7b\xfb\xd6"
2491 "\x9c\xfc\x4e\x96\x7e\xdb\x80\x8d"
2492 "\x67\x9f\x77\x7b\xc6\x70\x2c\x7d"
2493 "\x39\xf2\x33\x69\xa9\xd9\xba\xcf"
2494 "\xa5\x30\xe2\x63\x04\x23\x14\x61"
2495 "\xb2\xeb\x05\xe2\xc3\x9b\xe9\xfc"
2496 "\xda\x6c\x19\x07\x8c\x6a\x9d\x1b",
2497 .rlen = 64,
2498 },
2499};
2500
2501static struct cipher_testvec aes_cbc_dec_tv_template[] = {
2502 { /* From RFC 3602 */
2503 .key = "\x06\xa9\x21\x40\x36\xb8\xa1\x5b"
2504 "\x51\x2e\x03\xd5\x34\x12\x00\x06",
2505 .klen = 16,
2506 .iv = "\x3d\xaf\xba\x42\x9d\x9e\xb4\x30"
2507 "\xb4\x22\xda\x80\x2c\x9f\xac\x41",
2508 .input = "\xe3\x53\x77\x9c\x10\x79\xae\xb8"
2509 "\x27\x08\x94\x2d\xbe\x77\x18\x1a",
2510 .ilen = 16,
2511 .result = "Single block msg",
2512 .rlen = 16,
2513 }, {
2514 .key = "\xc2\x86\x69\x6d\x88\x7c\x9a\xa0"
2515 "\x61\x1b\xbb\x3e\x20\x25\xa4\x5a",
2516 .klen = 16,
2517 .iv = "\x56\x2e\x17\x99\x6d\x09\x3d\x28"
2518 "\xdd\xb3\xba\x69\x5a\x2e\x6f\x58",
2519 .input = "\xd2\x96\xcd\x94\xc2\xcc\xcf\x8a"
2520 "\x3a\x86\x30\x28\xb5\xe1\xdc\x0a"
2521 "\x75\x86\x60\x2d\x25\x3c\xff\xf9"
2522 "\x1b\x82\x66\xbe\xa6\xd6\x1a\xb1",
2523 .ilen = 32,
2524 .result = "\x00\x01\x02\x03\x04\x05\x06\x07"
2525 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
2526 "\x10\x11\x12\x13\x14\x15\x16\x17"
2527 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
2528 .rlen = 32,
2529 }, { /* From NIST SP800-38A */
2530 .key = "\x8e\x73\xb0\xf7\xda\x0e\x64\x52"
2531 "\xc8\x10\xf3\x2b\x80\x90\x79\xe5"
2532 "\x62\xf8\xea\xd2\x52\x2c\x6b\x7b",
2533 .klen = 24,
2534 .iv = "\x00\x01\x02\x03\x04\x05\x06\x07"
2535 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
2536 .input = "\x4f\x02\x1d\xb2\x43\xbc\x63\x3d"
2537 "\x71\x78\x18\x3a\x9f\xa0\x71\xe8"
2538 "\xb4\xd9\xad\xa9\xad\x7d\xed\xf4"
2539 "\xe5\xe7\x38\x76\x3f\x69\x14\x5a"
2540 "\x57\x1b\x24\x20\x12\xfb\x7a\xe0"
2541 "\x7f\xa9\xba\xac\x3d\xf1\x02\xe0"
2542 "\x08\xb0\xe2\x79\x88\x59\x88\x81"
2543 "\xd9\x20\xa9\xe6\x4f\x56\x15\xcd",
2544 .ilen = 64,
2545 .result = "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96"
2546 "\xe9\x3d\x7e\x11\x73\x93\x17\x2a"
2547 "\xae\x2d\x8a\x57\x1e\x03\xac\x9c"
2548 "\x9e\xb7\x6f\xac\x45\xaf\x8e\x51"
2549 "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11"
2550 "\xe5\xfb\xc1\x19\x1a\x0a\x52\xef"
2551 "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17"
2552 "\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
2553 .rlen = 64,
2554 }, {
2555 .key = "\x60\x3d\xeb\x10\x15\xca\x71\xbe"
2556 "\x2b\x73\xae\xf0\x85\x7d\x77\x81"
2557 "\x1f\x35\x2c\x07\x3b\x61\x08\xd7"
2558 "\x2d\x98\x10\xa3\x09\x14\xdf\xf4",
2559 .klen = 32,
2560 .iv = "\x00\x01\x02\x03\x04\x05\x06\x07"
2561 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
2562 .input = "\xf5\x8c\x4c\x04\xd6\xe5\xf1\xba"
2563 "\x77\x9e\xab\xfb\x5f\x7b\xfb\xd6"
2564 "\x9c\xfc\x4e\x96\x7e\xdb\x80\x8d"
2565 "\x67\x9f\x77\x7b\xc6\x70\x2c\x7d"
2566 "\x39\xf2\x33\x69\xa9\xd9\xba\xcf"
2567 "\xa5\x30\xe2\x63\x04\x23\x14\x61"
2568 "\xb2\xeb\x05\xe2\xc3\x9b\xe9\xfc"
2569 "\xda\x6c\x19\x07\x8c\x6a\x9d\x1b",
2570 .ilen = 64,
2571 .result = "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96"
2572 "\xe9\x3d\x7e\x11\x73\x93\x17\x2a"
2573 "\xae\x2d\x8a\x57\x1e\x03\xac\x9c"
2574 "\x9e\xb7\x6f\xac\x45\xaf\x8e\x51"
2575 "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11"
2576 "\xe5\xfb\xc1\x19\x1a\x0a\x52\xef"
2577 "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17"
2578 "\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
2579 .rlen = 64,
2580 },
2581};
2582
2583static struct cipher_testvec aes_lrw_enc_tv_template[] = {
2584 /* from http://grouper.ieee.org/groups/1619/email/pdf00017.pdf */
2585 { /* LRW-32-AES 1 */
2586 .key = "\x45\x62\xac\x25\xf8\x28\x17\x6d"
2587 "\x4c\x26\x84\x14\xb5\x68\x01\x85"
2588 "\x25\x8e\x2a\x05\xe7\x3e\x9d\x03"
2589 "\xee\x5a\x83\x0c\xcc\x09\x4c\x87",
2590 .klen = 32,
2591 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
2592 "\x00\x00\x00\x00\x00\x00\x00\x01",
2593 .input = "\x30\x31\x32\x33\x34\x35\x36\x37"
2594 "\x38\x39\x41\x42\x43\x44\x45\x46",
2595 .ilen = 16,
2596 .result = "\xf1\xb2\x73\xcd\x65\xa3\xdf\x5f"
2597 "\xe9\x5d\x48\x92\x54\x63\x4e\xb8",
2598 .rlen = 16,
2599 }, { /* LRW-32-AES 2 */
2600 .key = "\x59\x70\x47\x14\xf5\x57\x47\x8c"
2601 "\xd7\x79\xe8\x0f\x54\x88\x79\x44"
2602 "\x0d\x48\xf0\xb7\xb1\x5a\x53\xea"
2603 "\x1c\xaa\x6b\x29\xc2\xca\xfb\xaf",
2604 .klen = 32,
2605 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
2606 "\x00\x00\x00\x00\x00\x00\x00\x02",
2607 .input = "\x30\x31\x32\x33\x34\x35\x36\x37"
2608 "\x38\x39\x41\x42\x43\x44\x45\x46",
2609 .ilen = 16,
2610 .result = "\x00\xc8\x2b\xae\x95\xbb\xcd\xe5"
2611 "\x27\x4f\x07\x69\xb2\x60\xe1\x36",
2612 .rlen = 16,
2613 }, { /* LRW-32-AES 3 */
2614 .key = "\xd8\x2a\x91\x34\xb2\x6a\x56\x50"
2615 "\x30\xfe\x69\xe2\x37\x7f\x98\x47"
2616 "\xcd\xf9\x0b\x16\x0c\x64\x8f\xb6"
2617 "\xb0\x0d\x0d\x1b\xae\x85\x87\x1f",
2618 .klen = 32,
2619 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
2620 "\x00\x00\x00\x02\x00\x00\x00\x00",
2621 .input = "\x30\x31\x32\x33\x34\x35\x36\x37"
2622 "\x38\x39\x41\x42\x43\x44\x45\x46",
2623 .ilen = 16,
2624 .result = "\x76\x32\x21\x83\xed\x8f\xf1\x82"
2625 "\xf9\x59\x62\x03\x69\x0e\x5e\x01",
2626 .rlen = 16,
2627 }, { /* LRW-32-AES 4 */
2628 .key = "\x0f\x6a\xef\xf8\xd3\xd2\xbb\x15"
2629 "\x25\x83\xf7\x3c\x1f\x01\x28\x74"
2630 "\xca\xc6\xbc\x35\x4d\x4a\x65\x54"
2631 "\x90\xae\x61\xcf\x7b\xae\xbd\xcc"
2632 "\xad\xe4\x94\xc5\x4a\x29\xae\x70",
2633 .klen = 40,
2634 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
2635 "\x00\x00\x00\x00\x00\x00\x00\x01",
2636 .input = "\x30\x31\x32\x33\x34\x35\x36\x37"
2637 "\x38\x39\x41\x42\x43\x44\x45\x46",
2638 .ilen = 16,
2639 .result = "\x9c\x0f\x15\x2f\x55\xa2\xd8\xf0"
2640 "\xd6\x7b\x8f\x9e\x28\x22\xbc\x41",
2641 .rlen = 16,
2642 }, { /* LRW-32-AES 5 */
2643 .key = "\x8a\xd4\xee\x10\x2f\xbd\x81\xff"
2644 "\xf8\x86\xce\xac\x93\xc5\xad\xc6"
2645 "\xa0\x19\x07\xc0\x9d\xf7\xbb\xdd"
2646 "\x52\x13\xb2\xb7\xf0\xff\x11\xd8"
2647 "\xd6\x08\xd0\xcd\x2e\xb1\x17\x6f",
2648 .klen = 40,
2649 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
2650 "\x00\x00\x00\x02\x00\x00\x00\x00",
2651 .input = "\x30\x31\x32\x33\x34\x35\x36\x37"
2652 "\x38\x39\x41\x42\x43\x44\x45\x46",
2653 .ilen = 16,
2654 .result = "\xd4\x27\x6a\x7f\x14\x91\x3d\x65"
2655 "\xc8\x60\x48\x02\x87\xe3\x34\x06",
2656 .rlen = 16,
2657 }, { /* LRW-32-AES 6 */
2658 .key = "\xf8\xd4\x76\xff\xd6\x46\xee\x6c"
2659 "\x23\x84\xcb\x1c\x77\xd6\x19\x5d"
2660 "\xfe\xf1\xa9\xf3\x7b\xbc\x8d\x21"
2661 "\xa7\x9c\x21\xf8\xcb\x90\x02\x89"
2662 "\xa8\x45\x34\x8e\xc8\xc5\xb5\xf1"
2663 "\x26\xf5\x0e\x76\xfe\xfd\x1b\x1e",
2664 .klen = 48,
2665 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
2666 "\x00\x00\x00\x00\x00\x00\x00\x01",
2667 .input = "\x30\x31\x32\x33\x34\x35\x36\x37"
2668 "\x38\x39\x41\x42\x43\x44\x45\x46",
2669 .ilen = 16,
2670 .result = "\xbd\x06\xb8\xe1\xdb\x98\x89\x9e"
2671 "\xc4\x98\xe4\x91\xcf\x1c\x70\x2b",
2672 .rlen = 16,
2673 }, { /* LRW-32-AES 7 */
2674 .key = "\xfb\x76\x15\xb2\x3d\x80\x89\x1d"
2675 "\xd4\x70\x98\x0b\xc7\x95\x84\xc8"
2676 "\xb2\xfb\x64\xce\x60\x97\x87\x8d"
2677 "\x17\xfc\xe4\x5a\x49\xe8\x30\xb7"
2678 "\x6e\x78\x17\xe7\x2d\x5e\x12\xd4"
2679 "\x60\x64\x04\x7a\xf1\x2f\x9e\x0c",
2680 .klen = 48,
2681 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
2682 "\x00\x00\x00\x02\x00\x00\x00\x00",
2683 .input = "\x30\x31\x32\x33\x34\x35\x36\x37"
2684 "\x38\x39\x41\x42\x43\x44\x45\x46",
2685 .ilen = 16,
2686 .result = "\x5b\x90\x8e\xc1\xab\xdd\x67\x5f"
2687 "\x3d\x69\x8a\x95\x53\xc8\x9c\xe5",
2688 .rlen = 16,
2689 }, {
2690/* http://www.mail-archive.com/stds-p1619@listserv.ieee.org/msg00173.html */
2691 .key = "\xf8\xd4\x76\xff\xd6\x46\xee\x6c"
2692 "\x23\x84\xcb\x1c\x77\xd6\x19\x5d"
2693 "\xfe\xf1\xa9\xf3\x7b\xbc\x8d\x21"
2694 "\xa7\x9c\x21\xf8\xcb\x90\x02\x89"
2695 "\xa8\x45\x34\x8e\xc8\xc5\xb5\xf1"
2696 "\x26\xf5\x0e\x76\xfe\xfd\x1b\x1e",
2697 .klen = 48,
2698 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
2699 "\x00\x00\x00\x00\x00\x00\x00\x01",
2700 .input = "\x05\x11\xb7\x18\xab\xc6\x2d\xac"
2701 "\x70\x5d\xf6\x22\x94\xcd\xe5\x6c"
2702 "\x17\x6b\xf6\x1c\xf0\xf3\x6e\xf8"
2703 "\x50\x38\x1f\x71\x49\xb6\x57\xd6"
2704 "\x8f\xcb\x8d\x6b\xe3\xa6\x29\x90"
2705 "\xfe\x2a\x62\x82\xae\x6d\x8b\xf6"
2706 "\xad\x1e\x9e\x20\x5f\x38\xbe\x04"
2707 "\xda\x10\x8e\xed\xa2\xa4\x87\xab"
2708 "\xda\x6b\xb4\x0c\x75\xba\xd3\x7c"
2709 "\xc9\xac\x42\x31\x95\x7c\xc9\x04"
2710 "\xeb\xd5\x6e\x32\x69\x8a\xdb\xa6"
2711 "\x15\xd7\x3f\x4f\x2f\x66\x69\x03"
2712 "\x9c\x1f\x54\x0f\xde\x1f\xf3\x65"
2713 "\x4c\x96\x12\xed\x7c\x92\x03\x01"
2714 "\x6f\xbc\x35\x93\xac\xf1\x27\xf1"
2715 "\xb4\x96\x82\x5a\x5f\xb0\xa0\x50"
2716 "\x89\xa4\x8e\x66\x44\x85\xcc\xfd"
2717 "\x33\x14\x70\xe3\x96\xb2\xc3\xd3"
2718 "\xbb\x54\x5a\x1a\xf9\x74\xa2\xc5"
2719 "\x2d\x64\x75\xdd\xb4\x54\xe6\x74"
2720 "\x8c\xd3\x9d\x9e\x86\xab\x51\x53"
2721 "\xb7\x93\x3e\x6f\xd0\x4e\x2c\x40"
2722 "\xf6\xa8\x2e\x3e\x9d\xf4\x66\xa5"
2723 "\x76\x12\x73\x44\x1a\x56\xd7\x72"
2724 "\x88\xcd\x21\x8c\x4c\x0f\xfe\xda"
2725 "\x95\xe0\x3a\xa6\xa5\x84\x46\xcd"
2726 "\xd5\x3e\x9d\x3a\xe2\x67\xe6\x60"
2727 "\x1a\xe2\x70\x85\x58\xc2\x1b\x09"
2728 "\xe1\xd7\x2c\xca\xad\xa8\x8f\xf9"
2729 "\xac\xb3\x0e\xdb\xca\x2e\xe2\xb8"
2730 "\x51\x71\xd9\x3c\x6c\xf1\x56\xf8"
2731 "\xea\x9c\xf1\xfb\x0c\xe6\xb7\x10"
2732 "\x1c\xf8\xa9\x7c\xe8\x53\x35\xc1"
2733 "\x90\x3e\x76\x4a\x74\xa4\x21\x2c"
2734 "\xf6\x2c\x4e\x0f\x94\x3a\x88\x2e"
2735 "\x41\x09\x6a\x33\x7d\xf6\xdd\x3f"
2736 "\x8d\x23\x31\x74\x84\xeb\x88\x6e"
2737 "\xcc\xb9\xbc\x22\x83\x19\x07\x22"
2738 "\xa5\x2d\xdf\xa5\xf3\x80\x85\x78"
2739 "\x84\x39\x6a\x6d\x6a\x99\x4f\xa5"
2740 "\x15\xfe\x46\xb0\xe4\x6c\xa5\x41"
2741 "\x3c\xce\x8f\x42\x60\x71\xa7\x75"
2742 "\x08\x40\x65\x8a\x82\xbf\xf5\x43"
2743 "\x71\x96\xa9\x4d\x44\x8a\x20\xbe"
2744 "\xfa\x4d\xbb\xc0\x7d\x31\x96\x65"
2745 "\xe7\x75\xe5\x3e\xfd\x92\x3b\xc9"
2746 "\x55\xbb\x16\x7e\xf7\xc2\x8c\xa4"
2747 "\x40\x1d\xe5\xef\x0e\xdf\xe4\x9a"
2748 "\x62\x73\x65\xfd\x46\x63\x25\x3d"
2749 "\x2b\xaf\xe5\x64\xfe\xa5\x5c\xcf"
2750 "\x24\xf3\xb4\xac\x64\xba\xdf\x4b"
2751 "\xc6\x96\x7d\x81\x2d\x8d\x97\xf7"
2752 "\xc5\x68\x77\x84\x32\x2b\xcc\x85"
2753 "\x74\x96\xf0\x12\x77\x61\xb9\xeb"
2754 "\x71\xaa\x82\xcb\x1c\xdb\x89\xc8"
2755 "\xc6\xb5\xe3\x5c\x7d\x39\x07\x24"
2756 "\xda\x39\x87\x45\xc0\x2b\xbb\x01"
2757 "\xac\xbc\x2a\x5c\x7f\xfc\xe8\xce"
2758 "\x6d\x9c\x6f\xed\xd3\xc1\xa1\xd6"
2759 "\xc5\x55\xa9\x66\x2f\xe1\xc8\x32"
2760 "\xa6\x5d\xa4\x3a\x98\x73\xe8\x45"
2761 "\xa4\xc7\xa8\xb4\xf6\x13\x03\xf6"
2762 "\xe9\x2e\xc4\x29\x0f\x84\xdb\xc4"
2763 "\x21\xc4\xc2\x75\x67\x89\x37\x0a",
2764 .ilen = 512,
2765 .result = "\x1a\x1d\xa9\x30\xad\xf9\x2f\x9b"
2766 "\xb6\x1d\xae\xef\xf0\x2f\xf8\x5a"
2767 "\x39\x3c\xbf\x2a\xb2\x45\xb2\x23"
2768 "\x1b\x63\x3c\xcf\xaa\xbe\xcf\x4e"
2769 "\xfa\xe8\x29\xc2\x20\x68\x2b\x3c"
2770 "\x2e\x8b\xf7\x6e\x25\xbd\xe3\x3d"
2771 "\x66\x27\xd6\xaf\xd6\x64\x3e\xe3"
2772 "\xe8\x58\x46\x97\x39\x51\x07\xde"
2773 "\xcb\x37\xbc\xa9\xc0\x5f\x75\xc3"
2774 "\x0e\x84\x23\x1d\x16\xd4\x1c\x59"
2775 "\x9c\x1a\x02\x55\xab\x3a\x97\x1d"
2776 "\xdf\xdd\xc7\x06\x51\xd7\x70\xae"
2777 "\x23\xc6\x8c\xf5\x1e\xa0\xe5\x82"
2778 "\xb8\xb2\xbf\x04\xa0\x32\x8e\x68"
2779 "\xeb\xaf\x6e\x2d\x94\x22\x2f\xce"
2780 "\x4c\xb5\x59\xe2\xa2\x2f\xa0\x98"
2781 "\x1a\x97\xc6\xd4\xb5\x00\x59\xf2"
2782 "\x84\x14\x72\xb1\x9a\x6e\xa3\x7f"
2783 "\xea\x20\xe7\xcb\x65\x77\x3a\xdf"
2784 "\xc8\x97\x67\x15\xc2\x2a\x27\xcc"
2785 "\x18\x55\xa1\x24\x0b\x24\x24\xaf"
2786 "\x5b\xec\x68\xb8\xc8\xf5\xba\x63"
2787 "\xff\xed\x89\xce\xd5\x3d\x88\xf3"
2788 "\x25\xef\x05\x7c\x3a\xef\xeb\xd8"
2789 "\x7a\x32\x0d\xd1\x1e\x58\x59\x99"
2790 "\x90\x25\xb5\x26\xb0\xe3\x2b\x6c"
2791 "\x4c\xa9\x8b\x84\x4f\x5e\x01\x50"
2792 "\x41\x30\x58\xc5\x62\x74\x52\x1d"
2793 "\x45\x24\x6a\x42\x64\x4f\x97\x1c"
2794 "\xa8\x66\xb5\x6d\x79\xd4\x0d\x48"
2795 "\xc5\x5f\xf3\x90\x32\xdd\xdd\xe1"
2796 "\xe4\xa9\x9f\xfc\xc3\x52\x5a\x46"
2797 "\xe4\x81\x84\x95\x36\x59\x7a\x6b"
2798 "\xaa\xb3\x60\xad\xce\x9f\x9f\x28"
2799 "\xe0\x01\x75\x22\xc4\x4e\xa9\x62"
2800 "\x5c\x62\x0d\x00\xcb\x13\xe8\x43"
2801 "\x72\xd4\x2d\x53\x46\xb5\xd1\x16"
2802 "\x22\x18\xdf\x34\x33\xf5\xd6\x1c"
2803 "\xb8\x79\x78\x97\x94\xff\x72\x13"
2804 "\x4c\x27\xfc\xcb\xbf\x01\x53\xa6"
2805 "\xb4\x50\x6e\xde\xdf\xb5\x43\xa4"
2806 "\x59\xdf\x52\xf9\x7c\xe0\x11\x6f"
2807 "\x2d\x14\x8e\x24\x61\x2c\xe1\x17"
2808 "\xcc\xce\x51\x0c\x19\x8a\x82\x30"
2809 "\x94\xd5\x3d\x6a\x53\x06\x5e\xbd"
2810 "\xb7\xeb\xfa\xfd\x27\x51\xde\x85"
2811 "\x1e\x86\x53\x11\x53\x94\x00\xee"
2812 "\x2b\x8c\x08\x2a\xbf\xdd\xae\x11"
2813 "\xcb\x1e\xa2\x07\x9a\x80\xcf\x62"
2814 "\x9b\x09\xdc\x95\x3c\x96\x8e\xb1"
2815 "\x09\xbd\xe4\xeb\xdb\xca\x70\x7a"
2816 "\x9e\xfa\x31\x18\x45\x3c\x21\x33"
2817 "\xb0\xb3\x2b\xea\xf3\x71\x2d\xe1"
2818 "\x03\xad\x1b\x48\xd4\x67\x27\xf0"
2819 "\x62\xe4\x3d\xfb\x9b\x08\x76\xe7"
2820 "\xdd\x2b\x01\x39\x04\x5a\x58\x7a"
2821 "\xf7\x11\x90\xec\xbd\x51\x5c\x32"
2822 "\x6b\xd7\x35\x39\x02\x6b\xf2\xa6"
2823 "\xd0\x0d\x07\xe1\x06\xc4\x5b\x7d"
2824 "\xe4\x6a\xd7\xee\x15\x1f\x83\xb4"
2825 "\xa3\xa7\x5e\xc3\x90\xb7\xef\xd3"
2826 "\xb7\x4f\xf8\x92\x4c\xb7\x3c\x29"
2827 "\xcd\x7e\x2b\x5d\x43\xea\x42\xe7"
2828 "\x74\x3f\x7d\x58\x88\x75\xde\x3e",
2829 .rlen = 512,
2830 }
2831};
2832
2833static struct cipher_testvec aes_lrw_dec_tv_template[] = {
2834 /* from http://grouper.ieee.org/groups/1619/email/pdf00017.pdf */
2835 /* same as enc vectors with input and result reversed */
2836 { /* LRW-32-AES 1 */
2837 .key = "\x45\x62\xac\x25\xf8\x28\x17\x6d"
2838 "\x4c\x26\x84\x14\xb5\x68\x01\x85"
2839 "\x25\x8e\x2a\x05\xe7\x3e\x9d\x03"
2840 "\xee\x5a\x83\x0c\xcc\x09\x4c\x87",
2841 .klen = 32,
2842 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
2843 "\x00\x00\x00\x00\x00\x00\x00\x01",
2844 .input = "\xf1\xb2\x73\xcd\x65\xa3\xdf\x5f"
2845 "\xe9\x5d\x48\x92\x54\x63\x4e\xb8",
2846 .ilen = 16,
2847 .result = "\x30\x31\x32\x33\x34\x35\x36\x37"
2848 "\x38\x39\x41\x42\x43\x44\x45\x46",
2849 .rlen = 16,
2850 }, { /* LRW-32-AES 2 */
2851 .key = "\x59\x70\x47\x14\xf5\x57\x47\x8c"
2852 "\xd7\x79\xe8\x0f\x54\x88\x79\x44"
2853 "\x0d\x48\xf0\xb7\xb1\x5a\x53\xea"
2854 "\x1c\xaa\x6b\x29\xc2\xca\xfb\xaf",
2855 .klen = 32,
2856 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
2857 "\x00\x00\x00\x00\x00\x00\x00\x02",
2858 .input = "\x00\xc8\x2b\xae\x95\xbb\xcd\xe5"
2859 "\x27\x4f\x07\x69\xb2\x60\xe1\x36",
2860 .ilen = 16,
2861 .result = "\x30\x31\x32\x33\x34\x35\x36\x37"
2862 "\x38\x39\x41\x42\x43\x44\x45\x46",
2863 .rlen = 16,
2864 }, { /* LRW-32-AES 3 */
2865 .key = "\xd8\x2a\x91\x34\xb2\x6a\x56\x50"
2866 "\x30\xfe\x69\xe2\x37\x7f\x98\x47"
2867 "\xcd\xf9\x0b\x16\x0c\x64\x8f\xb6"
2868 "\xb0\x0d\x0d\x1b\xae\x85\x87\x1f",
2869 .klen = 32,
2870 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
2871 "\x00\x00\x00\x02\x00\x00\x00\x00",
2872 .input = "\x76\x32\x21\x83\xed\x8f\xf1\x82"
2873 "\xf9\x59\x62\x03\x69\x0e\x5e\x01",
2874 .ilen = 16,
2875 .result = "\x30\x31\x32\x33\x34\x35\x36\x37"
2876 "\x38\x39\x41\x42\x43\x44\x45\x46",
2877 .rlen = 16,
2878 }, { /* LRW-32-AES 4 */
2879 .key = "\x0f\x6a\xef\xf8\xd3\xd2\xbb\x15"
2880 "\x25\x83\xf7\x3c\x1f\x01\x28\x74"
2881 "\xca\xc6\xbc\x35\x4d\x4a\x65\x54"
2882 "\x90\xae\x61\xcf\x7b\xae\xbd\xcc"
2883 "\xad\xe4\x94\xc5\x4a\x29\xae\x70",
2884 .klen = 40,
2885 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
2886 "\x00\x00\x00\x00\x00\x00\x00\x01",
2887 .input = "\x9c\x0f\x15\x2f\x55\xa2\xd8\xf0"
2888 "\xd6\x7b\x8f\x9e\x28\x22\xbc\x41",
2889 .ilen = 16,
2890 .result = "\x30\x31\x32\x33\x34\x35\x36\x37"
2891 "\x38\x39\x41\x42\x43\x44\x45\x46",
2892 .rlen = 16,
2893 }, { /* LRW-32-AES 5 */
2894 .key = "\x8a\xd4\xee\x10\x2f\xbd\x81\xff"
2895 "\xf8\x86\xce\xac\x93\xc5\xad\xc6"
2896 "\xa0\x19\x07\xc0\x9d\xf7\xbb\xdd"
2897 "\x52\x13\xb2\xb7\xf0\xff\x11\xd8"
2898 "\xd6\x08\xd0\xcd\x2e\xb1\x17\x6f",
2899 .klen = 40,
2900 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
2901 "\x00\x00\x00\x02\x00\x00\x00\x00",
2902 .input = "\xd4\x27\x6a\x7f\x14\x91\x3d\x65"
2903 "\xc8\x60\x48\x02\x87\xe3\x34\x06",
2904 .ilen = 16,
2905 .result = "\x30\x31\x32\x33\x34\x35\x36\x37"
2906 "\x38\x39\x41\x42\x43\x44\x45\x46",
2907 .rlen = 16,
2908 }, { /* LRW-32-AES 6 */
2909 .key = "\xf8\xd4\x76\xff\xd6\x46\xee\x6c"
2910 "\x23\x84\xcb\x1c\x77\xd6\x19\x5d"
2911 "\xfe\xf1\xa9\xf3\x7b\xbc\x8d\x21"
2912 "\xa7\x9c\x21\xf8\xcb\x90\x02\x89"
2913 "\xa8\x45\x34\x8e\xc8\xc5\xb5\xf1"
2914 "\x26\xf5\x0e\x76\xfe\xfd\x1b\x1e",
2915 .klen = 48,
2916 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
2917 "\x00\x00\x00\x00\x00\x00\x00\x01",
2918 .input = "\xbd\x06\xb8\xe1\xdb\x98\x89\x9e"
2919 "\xc4\x98\xe4\x91\xcf\x1c\x70\x2b",
2920 .ilen = 16,
2921 .result = "\x30\x31\x32\x33\x34\x35\x36\x37"
2922 "\x38\x39\x41\x42\x43\x44\x45\x46",
2923 .rlen = 16,
2924 }, { /* LRW-32-AES 7 */
2925 .key = "\xfb\x76\x15\xb2\x3d\x80\x89\x1d"
2926 "\xd4\x70\x98\x0b\xc7\x95\x84\xc8"
2927 "\xb2\xfb\x64\xce\x60\x97\x87\x8d"
2928 "\x17\xfc\xe4\x5a\x49\xe8\x30\xb7"
2929 "\x6e\x78\x17\xe7\x2d\x5e\x12\xd4"
2930 "\x60\x64\x04\x7a\xf1\x2f\x9e\x0c",
2931 .klen = 48,
2932 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
2933 "\x00\x00\x00\x02\x00\x00\x00\x00",
2934 .input = "\x5b\x90\x8e\xc1\xab\xdd\x67\x5f"
2935 "\x3d\x69\x8a\x95\x53\xc8\x9c\xe5",
2936 .ilen = 16,
2937 .result = "\x30\x31\x32\x33\x34\x35\x36\x37"
2938 "\x38\x39\x41\x42\x43\x44\x45\x46",
2939 .rlen = 16,
2940 }, {
2941/* http://www.mail-archive.com/stds-p1619@listserv.ieee.org/msg00173.html */
2942 .key = "\xf8\xd4\x76\xff\xd6\x46\xee\x6c"
2943 "\x23\x84\xcb\x1c\x77\xd6\x19\x5d"
2944 "\xfe\xf1\xa9\xf3\x7b\xbc\x8d\x21"
2945 "\xa7\x9c\x21\xf8\xcb\x90\x02\x89"
2946 "\xa8\x45\x34\x8e\xc8\xc5\xb5\xf1"
2947 "\x26\xf5\x0e\x76\xfe\xfd\x1b\x1e",
2948 .klen = 48,
2949 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
2950 "\x00\x00\x00\x00\x00\x00\x00\x01",
2951 .input = "\x1a\x1d\xa9\x30\xad\xf9\x2f\x9b"
2952 "\xb6\x1d\xae\xef\xf0\x2f\xf8\x5a"
2953 "\x39\x3c\xbf\x2a\xb2\x45\xb2\x23"
2954 "\x1b\x63\x3c\xcf\xaa\xbe\xcf\x4e"
2955 "\xfa\xe8\x29\xc2\x20\x68\x2b\x3c"
2956 "\x2e\x8b\xf7\x6e\x25\xbd\xe3\x3d"
2957 "\x66\x27\xd6\xaf\xd6\x64\x3e\xe3"
2958 "\xe8\x58\x46\x97\x39\x51\x07\xde"
2959 "\xcb\x37\xbc\xa9\xc0\x5f\x75\xc3"
2960 "\x0e\x84\x23\x1d\x16\xd4\x1c\x59"
2961 "\x9c\x1a\x02\x55\xab\x3a\x97\x1d"
2962 "\xdf\xdd\xc7\x06\x51\xd7\x70\xae"
2963 "\x23\xc6\x8c\xf5\x1e\xa0\xe5\x82"
2964 "\xb8\xb2\xbf\x04\xa0\x32\x8e\x68"
2965 "\xeb\xaf\x6e\x2d\x94\x22\x2f\xce"
2966 "\x4c\xb5\x59\xe2\xa2\x2f\xa0\x98"
2967 "\x1a\x97\xc6\xd4\xb5\x00\x59\xf2"
2968 "\x84\x14\x72\xb1\x9a\x6e\xa3\x7f"
2969 "\xea\x20\xe7\xcb\x65\x77\x3a\xdf"
2970 "\xc8\x97\x67\x15\xc2\x2a\x27\xcc"
2971 "\x18\x55\xa1\x24\x0b\x24\x24\xaf"
2972 "\x5b\xec\x68\xb8\xc8\xf5\xba\x63"
2973 "\xff\xed\x89\xce\xd5\x3d\x88\xf3"
2974 "\x25\xef\x05\x7c\x3a\xef\xeb\xd8"
2975 "\x7a\x32\x0d\xd1\x1e\x58\x59\x99"
2976 "\x90\x25\xb5\x26\xb0\xe3\x2b\x6c"
2977 "\x4c\xa9\x8b\x84\x4f\x5e\x01\x50"
2978 "\x41\x30\x58\xc5\x62\x74\x52\x1d"
2979 "\x45\x24\x6a\x42\x64\x4f\x97\x1c"
2980 "\xa8\x66\xb5\x6d\x79\xd4\x0d\x48"
2981 "\xc5\x5f\xf3\x90\x32\xdd\xdd\xe1"
2982 "\xe4\xa9\x9f\xfc\xc3\x52\x5a\x46"
2983 "\xe4\x81\x84\x95\x36\x59\x7a\x6b"
2984 "\xaa\xb3\x60\xad\xce\x9f\x9f\x28"
2985 "\xe0\x01\x75\x22\xc4\x4e\xa9\x62"
2986 "\x5c\x62\x0d\x00\xcb\x13\xe8\x43"
2987 "\x72\xd4\x2d\x53\x46\xb5\xd1\x16"
2988 "\x22\x18\xdf\x34\x33\xf5\xd6\x1c"
2989 "\xb8\x79\x78\x97\x94\xff\x72\x13"
2990 "\x4c\x27\xfc\xcb\xbf\x01\x53\xa6"
2991 "\xb4\x50\x6e\xde\xdf\xb5\x43\xa4"
2992 "\x59\xdf\x52\xf9\x7c\xe0\x11\x6f"
2993 "\x2d\x14\x8e\x24\x61\x2c\xe1\x17"
2994 "\xcc\xce\x51\x0c\x19\x8a\x82\x30"
2995 "\x94\xd5\x3d\x6a\x53\x06\x5e\xbd"
2996 "\xb7\xeb\xfa\xfd\x27\x51\xde\x85"
2997 "\x1e\x86\x53\x11\x53\x94\x00\xee"
2998 "\x2b\x8c\x08\x2a\xbf\xdd\xae\x11"
2999 "\xcb\x1e\xa2\x07\x9a\x80\xcf\x62"
3000 "\x9b\x09\xdc\x95\x3c\x96\x8e\xb1"
3001 "\x09\xbd\xe4\xeb\xdb\xca\x70\x7a"
3002 "\x9e\xfa\x31\x18\x45\x3c\x21\x33"
3003 "\xb0\xb3\x2b\xea\xf3\x71\x2d\xe1"
3004 "\x03\xad\x1b\x48\xd4\x67\x27\xf0"
3005 "\x62\xe4\x3d\xfb\x9b\x08\x76\xe7"
3006 "\xdd\x2b\x01\x39\x04\x5a\x58\x7a"
3007 "\xf7\x11\x90\xec\xbd\x51\x5c\x32"
3008 "\x6b\xd7\x35\x39\x02\x6b\xf2\xa6"
3009 "\xd0\x0d\x07\xe1\x06\xc4\x5b\x7d"
3010 "\xe4\x6a\xd7\xee\x15\x1f\x83\xb4"
3011 "\xa3\xa7\x5e\xc3\x90\xb7\xef\xd3"
3012 "\xb7\x4f\xf8\x92\x4c\xb7\x3c\x29"
3013 "\xcd\x7e\x2b\x5d\x43\xea\x42\xe7"
3014 "\x74\x3f\x7d\x58\x88\x75\xde\x3e",
3015 .ilen = 512,
3016 .result = "\x05\x11\xb7\x18\xab\xc6\x2d\xac"
3017 "\x70\x5d\xf6\x22\x94\xcd\xe5\x6c"
3018 "\x17\x6b\xf6\x1c\xf0\xf3\x6e\xf8"
3019 "\x50\x38\x1f\x71\x49\xb6\x57\xd6"
3020 "\x8f\xcb\x8d\x6b\xe3\xa6\x29\x90"
3021 "\xfe\x2a\x62\x82\xae\x6d\x8b\xf6"
3022 "\xad\x1e\x9e\x20\x5f\x38\xbe\x04"
3023 "\xda\x10\x8e\xed\xa2\xa4\x87\xab"
3024 "\xda\x6b\xb4\x0c\x75\xba\xd3\x7c"
3025 "\xc9\xac\x42\x31\x95\x7c\xc9\x04"
3026 "\xeb\xd5\x6e\x32\x69\x8a\xdb\xa6"
3027 "\x15\xd7\x3f\x4f\x2f\x66\x69\x03"
3028 "\x9c\x1f\x54\x0f\xde\x1f\xf3\x65"
3029 "\x4c\x96\x12\xed\x7c\x92\x03\x01"
3030 "\x6f\xbc\x35\x93\xac\xf1\x27\xf1"
3031 "\xb4\x96\x82\x5a\x5f\xb0\xa0\x50"
3032 "\x89\xa4\x8e\x66\x44\x85\xcc\xfd"
3033 "\x33\x14\x70\xe3\x96\xb2\xc3\xd3"
3034 "\xbb\x54\x5a\x1a\xf9\x74\xa2\xc5"
3035 "\x2d\x64\x75\xdd\xb4\x54\xe6\x74"
3036 "\x8c\xd3\x9d\x9e\x86\xab\x51\x53"
3037 "\xb7\x93\x3e\x6f\xd0\x4e\x2c\x40"
3038 "\xf6\xa8\x2e\x3e\x9d\xf4\x66\xa5"
3039 "\x76\x12\x73\x44\x1a\x56\xd7\x72"
3040 "\x88\xcd\x21\x8c\x4c\x0f\xfe\xda"
3041 "\x95\xe0\x3a\xa6\xa5\x84\x46\xcd"
3042 "\xd5\x3e\x9d\x3a\xe2\x67\xe6\x60"
3043 "\x1a\xe2\x70\x85\x58\xc2\x1b\x09"
3044 "\xe1\xd7\x2c\xca\xad\xa8\x8f\xf9"
3045 "\xac\xb3\x0e\xdb\xca\x2e\xe2\xb8"
3046 "\x51\x71\xd9\x3c\x6c\xf1\x56\xf8"
3047 "\xea\x9c\xf1\xfb\x0c\xe6\xb7\x10"
3048 "\x1c\xf8\xa9\x7c\xe8\x53\x35\xc1"
3049 "\x90\x3e\x76\x4a\x74\xa4\x21\x2c"
3050 "\xf6\x2c\x4e\x0f\x94\x3a\x88\x2e"
3051 "\x41\x09\x6a\x33\x7d\xf6\xdd\x3f"
3052 "\x8d\x23\x31\x74\x84\xeb\x88\x6e"
3053 "\xcc\xb9\xbc\x22\x83\x19\x07\x22"
3054 "\xa5\x2d\xdf\xa5\xf3\x80\x85\x78"
3055 "\x84\x39\x6a\x6d\x6a\x99\x4f\xa5"
3056 "\x15\xfe\x46\xb0\xe4\x6c\xa5\x41"
3057 "\x3c\xce\x8f\x42\x60\x71\xa7\x75"
3058 "\x08\x40\x65\x8a\x82\xbf\xf5\x43"
3059 "\x71\x96\xa9\x4d\x44\x8a\x20\xbe"
3060 "\xfa\x4d\xbb\xc0\x7d\x31\x96\x65"
3061 "\xe7\x75\xe5\x3e\xfd\x92\x3b\xc9"
3062 "\x55\xbb\x16\x7e\xf7\xc2\x8c\xa4"
3063 "\x40\x1d\xe5\xef\x0e\xdf\xe4\x9a"
3064 "\x62\x73\x65\xfd\x46\x63\x25\x3d"
3065 "\x2b\xaf\xe5\x64\xfe\xa5\x5c\xcf"
3066 "\x24\xf3\xb4\xac\x64\xba\xdf\x4b"
3067 "\xc6\x96\x7d\x81\x2d\x8d\x97\xf7"
3068 "\xc5\x68\x77\x84\x32\x2b\xcc\x85"
3069 "\x74\x96\xf0\x12\x77\x61\xb9\xeb"
3070 "\x71\xaa\x82\xcb\x1c\xdb\x89\xc8"
3071 "\xc6\xb5\xe3\x5c\x7d\x39\x07\x24"
3072 "\xda\x39\x87\x45\xc0\x2b\xbb\x01"
3073 "\xac\xbc\x2a\x5c\x7f\xfc\xe8\xce"
3074 "\x6d\x9c\x6f\xed\xd3\xc1\xa1\xd6"
3075 "\xc5\x55\xa9\x66\x2f\xe1\xc8\x32"
3076 "\xa6\x5d\xa4\x3a\x98\x73\xe8\x45"
3077 "\xa4\xc7\xa8\xb4\xf6\x13\x03\xf6"
3078 "\xe9\x2e\xc4\x29\x0f\x84\xdb\xc4"
3079 "\x21\xc4\xc2\x75\x67\x89\x37\x0a",
3080 .rlen = 512,
3081 }
3082};
3083
3084static struct cipher_testvec aes_xts_enc_tv_template[] = {
3085 /* http://grouper.ieee.org/groups/1619/email/pdf00086.pdf */
3086 { /* XTS-AES 1 */
3087 .key = "\x00\x00\x00\x00\x00\x00\x00\x00"
3088 "\x00\x00\x00\x00\x00\x00\x00\x00"
3089 "\x00\x00\x00\x00\x00\x00\x00\x00"
3090 "\x00\x00\x00\x00\x00\x00\x00\x00",
3091 .klen = 32,
3092 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
3093 "\x00\x00\x00\x00\x00\x00\x00\x00",
3094 .input = "\x00\x00\x00\x00\x00\x00\x00\x00"
3095 "\x00\x00\x00\x00\x00\x00\x00\x00"
3096 "\x00\x00\x00\x00\x00\x00\x00\x00"
3097 "\x00\x00\x00\x00\x00\x00\x00\x00",
3098 .ilen = 32,
3099 .result = "\x91\x7c\xf6\x9e\xbd\x68\xb2\xec"
3100 "\x9b\x9f\xe9\xa3\xea\xdd\xa6\x92"
3101 "\xcd\x43\xd2\xf5\x95\x98\xed\x85"
3102 "\x8c\x02\xc2\x65\x2f\xbf\x92\x2e",
3103 .rlen = 32,
3104 }, { /* XTS-AES 2 */
3105 .key = "\x11\x11\x11\x11\x11\x11\x11\x11"
3106 "\x11\x11\x11\x11\x11\x11\x11\x11"
3107 "\x22\x22\x22\x22\x22\x22\x22\x22"
3108 "\x22\x22\x22\x22\x22\x22\x22\x22",
3109 .klen = 32,
3110 .iv = "\x33\x33\x33\x33\x33\x00\x00\x00"
3111 "\x00\x00\x00\x00\x00\x00\x00\x00",
3112 .input = "\x44\x44\x44\x44\x44\x44\x44\x44"
3113 "\x44\x44\x44\x44\x44\x44\x44\x44"
3114 "\x44\x44\x44\x44\x44\x44\x44\x44"
3115 "\x44\x44\x44\x44\x44\x44\x44\x44",
3116 .ilen = 32,
3117 .result = "\xc4\x54\x18\x5e\x6a\x16\x93\x6e"
3118 "\x39\x33\x40\x38\xac\xef\x83\x8b"
3119 "\xfb\x18\x6f\xff\x74\x80\xad\xc4"
3120 "\x28\x93\x82\xec\xd6\xd3\x94\xf0",
3121 .rlen = 32,
3122 }, { /* XTS-AES 3 */
3123 .key = "\xff\xfe\xfd\xfc\xfb\xfa\xf9\xf8"
3124 "\xf7\xf6\xf5\xf4\xf3\xf2\xf1\xf0"
3125 "\x22\x22\x22\x22\x22\x22\x22\x22"
3126 "\x22\x22\x22\x22\x22\x22\x22\x22",
3127 .klen = 32,
3128 .iv = "\x33\x33\x33\x33\x33\x00\x00\x00"
3129 "\x00\x00\x00\x00\x00\x00\x00\x00",
3130 .input = "\x44\x44\x44\x44\x44\x44\x44\x44"
3131 "\x44\x44\x44\x44\x44\x44\x44\x44"
3132 "\x44\x44\x44\x44\x44\x44\x44\x44"
3133 "\x44\x44\x44\x44\x44\x44\x44\x44",
3134 .ilen = 32,
3135 .result = "\xaf\x85\x33\x6b\x59\x7a\xfc\x1a"
3136 "\x90\x0b\x2e\xb2\x1e\xc9\x49\xd2"
3137 "\x92\xdf\x4c\x04\x7e\x0b\x21\x53"
3138 "\x21\x86\xa5\x97\x1a\x22\x7a\x89",
3139 .rlen = 32,
3140 }, { /* XTS-AES 4 */
3141 .key = "\x27\x18\x28\x18\x28\x45\x90\x45"
3142 "\x23\x53\x60\x28\x74\x71\x35\x26"
3143 "\x31\x41\x59\x26\x53\x58\x97\x93"
3144 "\x23\x84\x62\x64\x33\x83\x27\x95",
3145 .klen = 32,
3146 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
3147 "\x00\x00\x00\x00\x00\x00\x00\x00",
3148 .input = "\x00\x01\x02\x03\x04\x05\x06\x07"
3149 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
3150 "\x10\x11\x12\x13\x14\x15\x16\x17"
3151 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
3152 "\x20\x21\x22\x23\x24\x25\x26\x27"
3153 "\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f"
3154 "\x30\x31\x32\x33\x34\x35\x36\x37"
3155 "\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f"
3156 "\x40\x41\x42\x43\x44\x45\x46\x47"
3157 "\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f"
3158 "\x50\x51\x52\x53\x54\x55\x56\x57"
3159 "\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f"
3160 "\x60\x61\x62\x63\x64\x65\x66\x67"
3161 "\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f"
3162 "\x70\x71\x72\x73\x74\x75\x76\x77"
3163 "\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f"
3164 "\x80\x81\x82\x83\x84\x85\x86\x87"
3165 "\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
3166 "\x90\x91\x92\x93\x94\x95\x96\x97"
3167 "\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
3168 "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7"
3169 "\xa8\xa9\xaa\xab\xac\xad\xae\xaf"
3170 "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7"
3171 "\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
3172 "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
3173 "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
3174 "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7"
3175 "\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf"
3176 "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7"
3177 "\xe8\xe9\xea\xeb\xec\xed\xee\xef"
3178 "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7"
3179 "\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"
3180 "\x00\x01\x02\x03\x04\x05\x06\x07"
3181 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
3182 "\x10\x11\x12\x13\x14\x15\x16\x17"
3183 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
3184 "\x20\x21\x22\x23\x24\x25\x26\x27"
3185 "\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f"
3186 "\x30\x31\x32\x33\x34\x35\x36\x37"
3187 "\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f"
3188 "\x40\x41\x42\x43\x44\x45\x46\x47"
3189 "\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f"
3190 "\x50\x51\x52\x53\x54\x55\x56\x57"
3191 "\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f"
3192 "\x60\x61\x62\x63\x64\x65\x66\x67"
3193 "\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f"
3194 "\x70\x71\x72\x73\x74\x75\x76\x77"
3195 "\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f"
3196 "\x80\x81\x82\x83\x84\x85\x86\x87"
3197 "\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
3198 "\x90\x91\x92\x93\x94\x95\x96\x97"
3199 "\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
3200 "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7"
3201 "\xa8\xa9\xaa\xab\xac\xad\xae\xaf"
3202 "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7"
3203 "\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
3204 "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
3205 "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
3206 "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7"
3207 "\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf"
3208 "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7"
3209 "\xe8\xe9\xea\xeb\xec\xed\xee\xef"
3210 "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7"
3211 "\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff",
3212 .ilen = 512,
3213 .result = "\x27\xa7\x47\x9b\xef\xa1\xd4\x76"
3214 "\x48\x9f\x30\x8c\xd4\xcf\xa6\xe2"
3215 "\xa9\x6e\x4b\xbe\x32\x08\xff\x25"
3216 "\x28\x7d\xd3\x81\x96\x16\xe8\x9c"
3217 "\xc7\x8c\xf7\xf5\xe5\x43\x44\x5f"
3218 "\x83\x33\xd8\xfa\x7f\x56\x00\x00"
3219 "\x05\x27\x9f\xa5\xd8\xb5\xe4\xad"
3220 "\x40\xe7\x36\xdd\xb4\xd3\x54\x12"
3221 "\x32\x80\x63\xfd\x2a\xab\x53\xe5"
3222 "\xea\x1e\x0a\x9f\x33\x25\x00\xa5"
3223 "\xdf\x94\x87\xd0\x7a\x5c\x92\xcc"
3224 "\x51\x2c\x88\x66\xc7\xe8\x60\xce"
3225 "\x93\xfd\xf1\x66\xa2\x49\x12\xb4"
3226 "\x22\x97\x61\x46\xae\x20\xce\x84"
3227 "\x6b\xb7\xdc\x9b\xa9\x4a\x76\x7a"
3228 "\xae\xf2\x0c\x0d\x61\xad\x02\x65"
3229 "\x5e\xa9\x2d\xc4\xc4\xe4\x1a\x89"
3230 "\x52\xc6\x51\xd3\x31\x74\xbe\x51"
3231 "\xa1\x0c\x42\x11\x10\xe6\xd8\x15"
3232 "\x88\xed\xe8\x21\x03\xa2\x52\xd8"
3233 "\xa7\x50\xe8\x76\x8d\xef\xff\xed"
3234 "\x91\x22\x81\x0a\xae\xb9\x9f\x91"
3235 "\x72\xaf\x82\xb6\x04\xdc\x4b\x8e"
3236 "\x51\xbc\xb0\x82\x35\xa6\xf4\x34"
3237 "\x13\x32\xe4\xca\x60\x48\x2a\x4b"
3238 "\xa1\xa0\x3b\x3e\x65\x00\x8f\xc5"
3239 "\xda\x76\xb7\x0b\xf1\x69\x0d\xb4"
3240 "\xea\xe2\x9c\x5f\x1b\xad\xd0\x3c"
3241 "\x5c\xcf\x2a\x55\xd7\x05\xdd\xcd"
3242 "\x86\xd4\x49\x51\x1c\xeb\x7e\xc3"
3243 "\x0b\xf1\x2b\x1f\xa3\x5b\x91\x3f"
3244 "\x9f\x74\x7a\x8a\xfd\x1b\x13\x0e"
3245 "\x94\xbf\xf9\x4e\xff\xd0\x1a\x91"
3246 "\x73\x5c\xa1\x72\x6a\xcd\x0b\x19"
3247 "\x7c\x4e\x5b\x03\x39\x36\x97\xe1"
3248 "\x26\x82\x6f\xb6\xbb\xde\x8e\xcc"
3249 "\x1e\x08\x29\x85\x16\xe2\xc9\xed"
3250 "\x03\xff\x3c\x1b\x78\x60\xf6\xde"
3251 "\x76\xd4\xce\xcd\x94\xc8\x11\x98"
3252 "\x55\xef\x52\x97\xca\x67\xe9\xf3"
3253 "\xe7\xff\x72\xb1\xe9\x97\x85\xca"
3254 "\x0a\x7e\x77\x20\xc5\xb3\x6d\xc6"
3255 "\xd7\x2c\xac\x95\x74\xc8\xcb\xbc"
3256 "\x2f\x80\x1e\x23\xe5\x6f\xd3\x44"
3257 "\xb0\x7f\x22\x15\x4b\xeb\xa0\xf0"
3258 "\x8c\xe8\x89\x1e\x64\x3e\xd9\x95"
3259 "\xc9\x4d\x9a\x69\xc9\xf1\xb5\xf4"
3260 "\x99\x02\x7a\x78\x57\x2a\xee\xbd"
3261 "\x74\xd2\x0c\xc3\x98\x81\xc2\x13"
3262 "\xee\x77\x0b\x10\x10\xe4\xbe\xa7"
3263 "\x18\x84\x69\x77\xae\x11\x9f\x7a"
3264 "\x02\x3a\xb5\x8c\xca\x0a\xd7\x52"
3265 "\xaf\xe6\x56\xbb\x3c\x17\x25\x6a"
3266 "\x9f\x6e\x9b\xf1\x9f\xdd\x5a\x38"
3267 "\xfc\x82\xbb\xe8\x72\xc5\x53\x9e"
3268 "\xdb\x60\x9e\xf4\xf7\x9c\x20\x3e"
3269 "\xbb\x14\x0f\x2e\x58\x3c\xb2\xad"
3270 "\x15\xb4\xaa\x5b\x65\x50\x16\xa8"
3271 "\x44\x92\x77\xdb\xd4\x77\xef\x2c"
3272 "\x8d\x6c\x01\x7d\xb7\x38\xb1\x8d"
3273 "\xeb\x4a\x42\x7d\x19\x23\xce\x3f"
3274 "\xf2\x62\x73\x57\x79\xa4\x18\xf2"
3275 "\x0a\x28\x2d\xf9\x20\x14\x7b\xea"
3276 "\xbe\x42\x1e\xe5\x31\x9d\x05\x68",
3277 .rlen = 512,
3278 }
3279};
3280
3281static struct cipher_testvec aes_xts_dec_tv_template[] = {
3282 /* http://grouper.ieee.org/groups/1619/email/pdf00086.pdf */
3283 { /* XTS-AES 1 */
3284 .key = "\x00\x00\x00\x00\x00\x00\x00\x00"
3285 "\x00\x00\x00\x00\x00\x00\x00\x00"
3286 "\x00\x00\x00\x00\x00\x00\x00\x00"
3287 "\x00\x00\x00\x00\x00\x00\x00\x00",
3288 .klen = 32,
3289 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
3290 "\x00\x00\x00\x00\x00\x00\x00\x00",
3291 .input = "\x91\x7c\xf6\x9e\xbd\x68\xb2\xec"
3292 "\x9b\x9f\xe9\xa3\xea\xdd\xa6\x92"
3293 "\xcd\x43\xd2\xf5\x95\x98\xed\x85"
3294 "\x8c\x02\xc2\x65\x2f\xbf\x92\x2e",
3295 .ilen = 32,
3296 .result = "\x00\x00\x00\x00\x00\x00\x00\x00"
3297 "\x00\x00\x00\x00\x00\x00\x00\x00"
3298 "\x00\x00\x00\x00\x00\x00\x00\x00"
3299 "\x00\x00\x00\x00\x00\x00\x00\x00",
3300 .rlen = 32,
3301 }, { /* XTS-AES 2 */
3302 .key = "\x11\x11\x11\x11\x11\x11\x11\x11"
3303 "\x11\x11\x11\x11\x11\x11\x11\x11"
3304 "\x22\x22\x22\x22\x22\x22\x22\x22"
3305 "\x22\x22\x22\x22\x22\x22\x22\x22",
3306 .klen = 32,
3307 .iv = "\x33\x33\x33\x33\x33\x00\x00\x00"
3308 "\x00\x00\x00\x00\x00\x00\x00\x00",
3309 .input = "\xc4\x54\x18\x5e\x6a\x16\x93\x6e"
3310 "\x39\x33\x40\x38\xac\xef\x83\x8b"
3311 "\xfb\x18\x6f\xff\x74\x80\xad\xc4"
3312 "\x28\x93\x82\xec\xd6\xd3\x94\xf0",
3313 .ilen = 32,
3314 .result = "\x44\x44\x44\x44\x44\x44\x44\x44"
3315 "\x44\x44\x44\x44\x44\x44\x44\x44"
3316 "\x44\x44\x44\x44\x44\x44\x44\x44"
3317 "\x44\x44\x44\x44\x44\x44\x44\x44",
3318 .rlen = 32,
3319 }, { /* XTS-AES 3 */
3320 .key = "\xff\xfe\xfd\xfc\xfb\xfa\xf9\xf8"
3321 "\xf7\xf6\xf5\xf4\xf3\xf2\xf1\xf0"
3322 "\x22\x22\x22\x22\x22\x22\x22\x22"
3323 "\x22\x22\x22\x22\x22\x22\x22\x22",
3324 .klen = 32,
3325 .iv = "\x33\x33\x33\x33\x33\x00\x00\x00"
3326 "\x00\x00\x00\x00\x00\x00\x00\x00",
3327 .input = "\xaf\x85\x33\x6b\x59\x7a\xfc\x1a"
3328 "\x90\x0b\x2e\xb2\x1e\xc9\x49\xd2"
3329 "\x92\xdf\x4c\x04\x7e\x0b\x21\x53"
3330 "\x21\x86\xa5\x97\x1a\x22\x7a\x89",
3331 .ilen = 32,
3332 .result = "\x44\x44\x44\x44\x44\x44\x44\x44"
3333 "\x44\x44\x44\x44\x44\x44\x44\x44"
3334 "\x44\x44\x44\x44\x44\x44\x44\x44"
3335 "\x44\x44\x44\x44\x44\x44\x44\x44",
3336 .rlen = 32,
3337 }, { /* XTS-AES 4 */
3338 .key = "\x27\x18\x28\x18\x28\x45\x90\x45"
3339 "\x23\x53\x60\x28\x74\x71\x35\x26"
3340 "\x31\x41\x59\x26\x53\x58\x97\x93"
3341 "\x23\x84\x62\x64\x33\x83\x27\x95",
3342 .klen = 32,
3343 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
3344 "\x00\x00\x00\x00\x00\x00\x00\x00",
3345 .input = "\x27\xa7\x47\x9b\xef\xa1\xd4\x76"
3346 "\x48\x9f\x30\x8c\xd4\xcf\xa6\xe2"
3347 "\xa9\x6e\x4b\xbe\x32\x08\xff\x25"
3348 "\x28\x7d\xd3\x81\x96\x16\xe8\x9c"
3349 "\xc7\x8c\xf7\xf5\xe5\x43\x44\x5f"
3350 "\x83\x33\xd8\xfa\x7f\x56\x00\x00"
3351 "\x05\x27\x9f\xa5\xd8\xb5\xe4\xad"
3352 "\x40\xe7\x36\xdd\xb4\xd3\x54\x12"
3353 "\x32\x80\x63\xfd\x2a\xab\x53\xe5"
3354 "\xea\x1e\x0a\x9f\x33\x25\x00\xa5"
3355 "\xdf\x94\x87\xd0\x7a\x5c\x92\xcc"
3356 "\x51\x2c\x88\x66\xc7\xe8\x60\xce"
3357 "\x93\xfd\xf1\x66\xa2\x49\x12\xb4"
3358 "\x22\x97\x61\x46\xae\x20\xce\x84"
3359 "\x6b\xb7\xdc\x9b\xa9\x4a\x76\x7a"
3360 "\xae\xf2\x0c\x0d\x61\xad\x02\x65"
3361 "\x5e\xa9\x2d\xc4\xc4\xe4\x1a\x89"
3362 "\x52\xc6\x51\xd3\x31\x74\xbe\x51"
3363 "\xa1\x0c\x42\x11\x10\xe6\xd8\x15"
3364 "\x88\xed\xe8\x21\x03\xa2\x52\xd8"
3365 "\xa7\x50\xe8\x76\x8d\xef\xff\xed"
3366 "\x91\x22\x81\x0a\xae\xb9\x9f\x91"
3367 "\x72\xaf\x82\xb6\x04\xdc\x4b\x8e"
3368 "\x51\xbc\xb0\x82\x35\xa6\xf4\x34"
3369 "\x13\x32\xe4\xca\x60\x48\x2a\x4b"
3370 "\xa1\xa0\x3b\x3e\x65\x00\x8f\xc5"
3371 "\xda\x76\xb7\x0b\xf1\x69\x0d\xb4"
3372 "\xea\xe2\x9c\x5f\x1b\xad\xd0\x3c"
3373 "\x5c\xcf\x2a\x55\xd7\x05\xdd\xcd"
3374 "\x86\xd4\x49\x51\x1c\xeb\x7e\xc3"
3375 "\x0b\xf1\x2b\x1f\xa3\x5b\x91\x3f"
3376 "\x9f\x74\x7a\x8a\xfd\x1b\x13\x0e"
3377 "\x94\xbf\xf9\x4e\xff\xd0\x1a\x91"
3378 "\x73\x5c\xa1\x72\x6a\xcd\x0b\x19"
3379 "\x7c\x4e\x5b\x03\x39\x36\x97\xe1"
3380 "\x26\x82\x6f\xb6\xbb\xde\x8e\xcc"
3381 "\x1e\x08\x29\x85\x16\xe2\xc9\xed"
3382 "\x03\xff\x3c\x1b\x78\x60\xf6\xde"
3383 "\x76\xd4\xce\xcd\x94\xc8\x11\x98"
3384 "\x55\xef\x52\x97\xca\x67\xe9\xf3"
3385 "\xe7\xff\x72\xb1\xe9\x97\x85\xca"
3386 "\x0a\x7e\x77\x20\xc5\xb3\x6d\xc6"
3387 "\xd7\x2c\xac\x95\x74\xc8\xcb\xbc"
3388 "\x2f\x80\x1e\x23\xe5\x6f\xd3\x44"
3389 "\xb0\x7f\x22\x15\x4b\xeb\xa0\xf0"
3390 "\x8c\xe8\x89\x1e\x64\x3e\xd9\x95"
3391 "\xc9\x4d\x9a\x69\xc9\xf1\xb5\xf4"
3392 "\x99\x02\x7a\x78\x57\x2a\xee\xbd"
3393 "\x74\xd2\x0c\xc3\x98\x81\xc2\x13"
3394 "\xee\x77\x0b\x10\x10\xe4\xbe\xa7"
3395 "\x18\x84\x69\x77\xae\x11\x9f\x7a"
3396 "\x02\x3a\xb5\x8c\xca\x0a\xd7\x52"
3397 "\xaf\xe6\x56\xbb\x3c\x17\x25\x6a"
3398 "\x9f\x6e\x9b\xf1\x9f\xdd\x5a\x38"
3399 "\xfc\x82\xbb\xe8\x72\xc5\x53\x9e"
3400 "\xdb\x60\x9e\xf4\xf7\x9c\x20\x3e"
3401 "\xbb\x14\x0f\x2e\x58\x3c\xb2\xad"
3402 "\x15\xb4\xaa\x5b\x65\x50\x16\xa8"
3403 "\x44\x92\x77\xdb\xd4\x77\xef\x2c"
3404 "\x8d\x6c\x01\x7d\xb7\x38\xb1\x8d"
3405 "\xeb\x4a\x42\x7d\x19\x23\xce\x3f"
3406 "\xf2\x62\x73\x57\x79\xa4\x18\xf2"
3407 "\x0a\x28\x2d\xf9\x20\x14\x7b\xea"
3408 "\xbe\x42\x1e\xe5\x31\x9d\x05\x68",
3409 .ilen = 512,
3410 .result = "\x00\x01\x02\x03\x04\x05\x06\x07"
3411 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
3412 "\x10\x11\x12\x13\x14\x15\x16\x17"
3413 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
3414 "\x20\x21\x22\x23\x24\x25\x26\x27"
3415 "\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f"
3416 "\x30\x31\x32\x33\x34\x35\x36\x37"
3417 "\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f"
3418 "\x40\x41\x42\x43\x44\x45\x46\x47"
3419 "\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f"
3420 "\x50\x51\x52\x53\x54\x55\x56\x57"
3421 "\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f"
3422 "\x60\x61\x62\x63\x64\x65\x66\x67"
3423 "\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f"
3424 "\x70\x71\x72\x73\x74\x75\x76\x77"
3425 "\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f"
3426 "\x80\x81\x82\x83\x84\x85\x86\x87"
3427 "\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
3428 "\x90\x91\x92\x93\x94\x95\x96\x97"
3429 "\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
3430 "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7"
3431 "\xa8\xa9\xaa\xab\xac\xad\xae\xaf"
3432 "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7"
3433 "\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
3434 "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
3435 "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
3436 "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7"
3437 "\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf"
3438 "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7"
3439 "\xe8\xe9\xea\xeb\xec\xed\xee\xef"
3440 "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7"
3441 "\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"
3442 "\x00\x01\x02\x03\x04\x05\x06\x07"
3443 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
3444 "\x10\x11\x12\x13\x14\x15\x16\x17"
3445 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
3446 "\x20\x21\x22\x23\x24\x25\x26\x27"
3447 "\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f"
3448 "\x30\x31\x32\x33\x34\x35\x36\x37"
3449 "\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f"
3450 "\x40\x41\x42\x43\x44\x45\x46\x47"
3451 "\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f"
3452 "\x50\x51\x52\x53\x54\x55\x56\x57"
3453 "\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f"
3454 "\x60\x61\x62\x63\x64\x65\x66\x67"
3455 "\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f"
3456 "\x70\x71\x72\x73\x74\x75\x76\x77"
3457 "\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f"
3458 "\x80\x81\x82\x83\x84\x85\x86\x87"
3459 "\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
3460 "\x90\x91\x92\x93\x94\x95\x96\x97"
3461 "\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
3462 "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7"
3463 "\xa8\xa9\xaa\xab\xac\xad\xae\xaf"
3464 "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7"
3465 "\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
3466 "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
3467 "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
3468 "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7"
3469 "\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf"
3470 "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7"
3471 "\xe8\xe9\xea\xeb\xec\xed\xee\xef"
3472 "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7"
3473 "\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff",
3474 .rlen = 512,
3475 }
3476};
3477
3478
3479static struct cipher_testvec aes_ctr_enc_tv_template[] = {
3480 { /* From RFC 3686 */
3481 .key = "\xae\x68\x52\xf8\x12\x10\x67\xcc"
3482 "\x4b\xf7\xa5\x76\x55\x77\xf3\x9e"
3483 "\x00\x00\x00\x30",
3484 .klen = 20,
3485 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00",
3486 .input = "Single block msg",
3487 .ilen = 16,
3488 .result = "\xe4\x09\x5d\x4f\xb7\xa7\xb3\x79"
3489 "\x2d\x61\x75\xa3\x26\x13\x11\xb8",
3490 .rlen = 16,
3491 }, {
3492 .key = "\x7e\x24\x06\x78\x17\xfa\xe0\xd7"
3493 "\x43\xd6\xce\x1f\x32\x53\x91\x63"
3494 "\x00\x6c\xb6\xdb",
3495 .klen = 20,
3496 .iv = "\xc0\x54\x3b\x59\xda\x48\xd9\x0b",
3497 .input = "\x00\x01\x02\x03\x04\x05\x06\x07"
3498 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
3499 "\x10\x11\x12\x13\x14\x15\x16\x17"
3500 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
3501 .ilen = 32,
3502 .result = "\x51\x04\xa1\x06\x16\x8a\x72\xd9"
3503 "\x79\x0d\x41\xee\x8e\xda\xd3\x88"
3504 "\xeb\x2e\x1e\xfc\x46\xda\x57\xc8"
3505 "\xfc\xe6\x30\xdf\x91\x41\xbe\x28",
3506 .rlen = 32,
3507 }, {
3508 .key = "\x16\xaf\x5b\x14\x5f\xc9\xf5\x79"
3509 "\xc1\x75\xf9\x3e\x3b\xfb\x0e\xed"
3510 "\x86\x3d\x06\xcc\xfd\xb7\x85\x15"
3511 "\x00\x00\x00\x48",
3512 .klen = 28,
3513 .iv = "\x36\x73\x3c\x14\x7d\x6d\x93\xcb",
3514 .input = "Single block msg",
3515 .ilen = 16,
3516 .result = "\x4b\x55\x38\x4f\xe2\x59\xc9\xc8"
3517 "\x4e\x79\x35\xa0\x03\xcb\xe9\x28",
3518 .rlen = 16,
3519 }, {
3520 .key = "\x7c\x5c\xb2\x40\x1b\x3d\xc3\x3c"
3521 "\x19\xe7\x34\x08\x19\xe0\xf6\x9c"
3522 "\x67\x8c\x3d\xb8\xe6\xf6\xa9\x1a"
3523 "\x00\x96\xb0\x3b",
3524 .klen = 28,
3525 .iv = "\x02\x0c\x6e\xad\xc2\xcb\x50\x0d",
3526 .input = "\x00\x01\x02\x03\x04\x05\x06\x07"
3527 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
3528 "\x10\x11\x12\x13\x14\x15\x16\x17"
3529 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
3530 .ilen = 32,
3531 .result = "\x45\x32\x43\xfc\x60\x9b\x23\x32"
3532 "\x7e\xdf\xaa\xfa\x71\x31\xcd\x9f"
3533 "\x84\x90\x70\x1c\x5a\xd4\xa7\x9c"
3534 "\xfc\x1f\xe0\xff\x42\xf4\xfb\x00",
3535 .rlen = 32,
3536 }, {
3537 .key = "\x77\x6b\xef\xf2\x85\x1d\xb0\x6f"
3538 "\x4c\x8a\x05\x42\xc8\x69\x6f\x6c"
3539 "\x6a\x81\xaf\x1e\xec\x96\xb4\xd3"
3540 "\x7f\xc1\xd6\x89\xe6\xc1\xc1\x04"
3541 "\x00\x00\x00\x60",
3542 .klen = 36,
3543 .iv = "\xdb\x56\x72\xc9\x7a\xa8\xf0\xb2",
3544 .input = "Single block msg",
3545 .ilen = 16,
3546 .result = "\x14\x5a\xd0\x1d\xbf\x82\x4e\xc7"
3547 "\x56\x08\x63\xdc\x71\xe3\xe0\xc0",
3548 .rlen = 16,
3549 }, {
3550 .key = "\xf6\xd6\x6d\x6b\xd5\x2d\x59\xbb"
3551 "\x07\x96\x36\x58\x79\xef\xf8\x86"
3552 "\xc6\x6d\xd5\x1a\x5b\x6a\x99\x74"
3553 "\x4b\x50\x59\x0c\x87\xa2\x38\x84"
3554 "\x00\xfa\xac\x24",
3555 .klen = 36,
3556 .iv = "\xc1\x58\x5e\xf1\x5a\x43\xd8\x75",
3557 .input = "\x00\x01\x02\x03\x04\x05\x06\x07"
3558 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
3559 "\x10\x11\x12\x13\x14\x15\x16\x17"
3560 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
3561 .ilen = 32,
3562 .result = "\xf0\x5e\x23\x1b\x38\x94\x61\x2c"
3563 "\x49\xee\x00\x0b\x80\x4e\xb2\xa9"
3564 "\xb8\x30\x6b\x50\x8f\x83\x9d\x6a"
3565 "\x55\x30\x83\x1d\x93\x44\xaf\x1c",
3566 .rlen = 32,
3567 }, {
3568 // generated using Crypto++
3569 .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
3570 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
3571 "\x10\x11\x12\x13\x14\x15\x16\x17"
3572 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
3573 "\x00\x00\x00\x00",
3574 .klen = 32 + 4,
3575 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00",
3576 .input =
3577 "\x00\x01\x02\x03\x04\x05\x06\x07"
3578 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
3579 "\x10\x11\x12\x13\x14\x15\x16\x17"
3580 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
3581 "\x20\x21\x22\x23\x24\x25\x26\x27"
3582 "\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f"
3583 "\x30\x31\x32\x33\x34\x35\x36\x37"
3584 "\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f"
3585 "\x40\x41\x42\x43\x44\x45\x46\x47"
3586 "\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f"
3587 "\x50\x51\x52\x53\x54\x55\x56\x57"
3588 "\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f"
3589 "\x60\x61\x62\x63\x64\x65\x66\x67"
3590 "\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f"
3591 "\x70\x71\x72\x73\x74\x75\x76\x77"
3592 "\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f"
3593 "\x80\x81\x82\x83\x84\x85\x86\x87"
3594 "\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
3595 "\x90\x91\x92\x93\x94\x95\x96\x97"
3596 "\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
3597 "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7"
3598 "\xa8\xa9\xaa\xab\xac\xad\xae\xaf"
3599 "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7"
3600 "\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
3601 "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
3602 "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
3603 "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7"
3604 "\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf"
3605 "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7"
3606 "\xe8\xe9\xea\xeb\xec\xed\xee\xef"
3607 "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7"
3608 "\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"
3609 "\x00\x03\x06\x09\x0c\x0f\x12\x15"
3610 "\x18\x1b\x1e\x21\x24\x27\x2a\x2d"
3611 "\x30\x33\x36\x39\x3c\x3f\x42\x45"
3612 "\x48\x4b\x4e\x51\x54\x57\x5a\x5d"
3613 "\x60\x63\x66\x69\x6c\x6f\x72\x75"
3614 "\x78\x7b\x7e\x81\x84\x87\x8a\x8d"
3615 "\x90\x93\x96\x99\x9c\x9f\xa2\xa5"
3616 "\xa8\xab\xae\xb1\xb4\xb7\xba\xbd"
3617 "\xc0\xc3\xc6\xc9\xcc\xcf\xd2\xd5"
3618 "\xd8\xdb\xde\xe1\xe4\xe7\xea\xed"
3619 "\xf0\xf3\xf6\xf9\xfc\xff\x02\x05"
3620 "\x08\x0b\x0e\x11\x14\x17\x1a\x1d"
3621 "\x20\x23\x26\x29\x2c\x2f\x32\x35"
3622 "\x38\x3b\x3e\x41\x44\x47\x4a\x4d"
3623 "\x50\x53\x56\x59\x5c\x5f\x62\x65"
3624 "\x68\x6b\x6e\x71\x74\x77\x7a\x7d"
3625 "\x80\x83\x86\x89\x8c\x8f\x92\x95"
3626 "\x98\x9b\x9e\xa1\xa4\xa7\xaa\xad"
3627 "\xb0\xb3\xb6\xb9\xbc\xbf\xc2\xc5"
3628 "\xc8\xcb\xce\xd1\xd4\xd7\xda\xdd"
3629 "\xe0\xe3\xe6\xe9\xec\xef\xf2\xf5"
3630 "\xf8\xfb\xfe\x01\x04\x07\x0a\x0d"
3631 "\x10\x13\x16\x19\x1c\x1f\x22\x25"
3632 "\x28\x2b\x2e\x31\x34\x37\x3a\x3d"
3633 "\x40\x43\x46\x49\x4c\x4f\x52\x55"
3634 "\x58\x5b\x5e\x61\x64\x67\x6a\x6d"
3635 "\x70\x73\x76\x79\x7c\x7f\x82\x85"
3636 "\x88\x8b\x8e\x91\x94\x97\x9a\x9d"
3637 "\xa0\xa3\xa6\xa9\xac\xaf\xb2\xb5"
3638 "\xb8\xbb\xbe\xc1\xc4\xc7\xca\xcd"
3639 "\xd0\xd3\xd6\xd9\xdc\xdf\xe2\xe5"
3640 "\xe8\xeb\xee\xf1\xf4\xf7\xfa\xfd"
3641 "\x00\x05\x0a\x0f\x14\x19\x1e\x23"
3642 "\x28\x2d\x32\x37\x3c\x41\x46\x4b"
3643 "\x50\x55\x5a\x5f\x64\x69\x6e\x73"
3644 "\x78\x7d\x82\x87\x8c\x91\x96\x9b"
3645 "\xa0\xa5\xaa\xaf\xb4\xb9\xbe\xc3"
3646 "\xc8\xcd\xd2\xd7\xdc\xe1\xe6\xeb"
3647 "\xf0\xf5\xfa\xff\x04\x09\x0e\x13"
3648 "\x18\x1d\x22\x27\x2c\x31\x36\x3b"
3649 "\x40\x45\x4a\x4f\x54\x59\x5e\x63"
3650 "\x68\x6d\x72\x77\x7c\x81\x86\x8b"
3651 "\x90\x95\x9a\x9f\xa4\xa9\xae\xb3"
3652 "\xb8\xbd\xc2\xc7\xcc\xd1\xd6\xdb"
3653 "\xe0\xe5\xea\xef\xf4\xf9\xfe\x03"
3654 "\x08\x0d\x12\x17\x1c\x21\x26\x2b"
3655 "\x30\x35\x3a\x3f\x44\x49\x4e\x53"
3656 "\x58\x5d\x62\x67\x6c\x71\x76\x7b"
3657 "\x80\x85\x8a\x8f\x94\x99\x9e\xa3"
3658 "\xa8\xad\xb2\xb7\xbc\xc1\xc6\xcb"
3659 "\xd0\xd5\xda\xdf\xe4\xe9\xee\xf3"
3660 "\xf8\xfd\x02\x07\x0c\x11\x16\x1b"
3661 "\x20\x25\x2a\x2f\x34\x39\x3e\x43"
3662 "\x48\x4d\x52\x57\x5c\x61\x66\x6b"
3663 "\x70\x75\x7a\x7f\x84\x89\x8e\x93"
3664 "\x98\x9d\xa2\xa7\xac\xb1\xb6\xbb"
3665 "\xc0\xc5\xca\xcf\xd4\xd9\xde\xe3"
3666 "\xe8\xed\xf2\xf7\xfc\x01\x06\x0b"
3667 "\x10\x15\x1a\x1f\x24\x29\x2e\x33"
3668 "\x38\x3d\x42\x47\x4c\x51\x56\x5b"
3669 "\x60\x65\x6a\x6f\x74\x79\x7e\x83"
3670 "\x88\x8d\x92\x97\x9c\xa1\xa6\xab"
3671 "\xb0\xb5\xba\xbf\xc4\xc9\xce\xd3"
3672 "\xd8\xdd\xe2\xe7\xec\xf1\xf6\xfb"
3673 "\x00\x07\x0e\x15\x1c\x23\x2a\x31"
3674 "\x38\x3f\x46\x4d\x54\x5b\x62\x69"
3675 "\x70\x77\x7e\x85\x8c\x93\x9a\xa1"
3676 "\xa8\xaf\xb6\xbd\xc4\xcb\xd2\xd9"
3677 "\xe0\xe7\xee\xf5\xfc\x03\x0a\x11"
3678 "\x18\x1f\x26\x2d\x34\x3b\x42\x49"
3679 "\x50\x57\x5e\x65\x6c\x73\x7a\x81"
3680 "\x88\x8f\x96\x9d\xa4\xab\xb2\xb9"
3681 "\xc0\xc7\xce\xd5\xdc\xe3\xea\xf1"
3682 "\xf8\xff\x06\x0d\x14\x1b\x22\x29"
3683 "\x30\x37\x3e\x45\x4c\x53\x5a\x61"
3684 "\x68\x6f\x76\x7d\x84\x8b\x92\x99"
3685 "\xa0\xa7\xae\xb5\xbc\xc3\xca\xd1"
3686 "\xd8\xdf\xe6\xed\xf4\xfb\x02\x09"
3687 "\x10\x17\x1e\x25\x2c\x33\x3a\x41"
3688 "\x48\x4f\x56\x5d\x64\x6b\x72\x79"
3689 "\x80\x87\x8e\x95\x9c\xa3\xaa\xb1"
3690 "\xb8\xbf\xc6\xcd\xd4\xdb\xe2\xe9"
3691 "\xf0\xf7\xfe\x05\x0c\x13\x1a\x21"
3692 "\x28\x2f\x36\x3d\x44\x4b\x52\x59"
3693 "\x60\x67\x6e\x75\x7c\x83\x8a\x91"
3694 "\x98\x9f\xa6\xad\xb4\xbb\xc2\xc9"
3695 "\xd0\xd7\xde\xe5\xec\xf3\xfa\x01"
3696 "\x08\x0f\x16\x1d\x24\x2b\x32\x39"
3697 "\x40\x47\x4e\x55\x5c\x63\x6a\x71"
3698 "\x78\x7f\x86\x8d\x94\x9b\xa2\xa9"
3699 "\xb0\xb7\xbe\xc5\xcc\xd3\xda\xe1"
3700 "\xe8\xef\xf6\xfd\x04\x0b\x12\x19"
3701 "\x20\x27\x2e\x35\x3c\x43\x4a\x51"
3702 "\x58\x5f\x66\x6d\x74\x7b\x82\x89"
3703 "\x90\x97\x9e\xa5\xac\xb3\xba\xc1"
3704 "\xc8\xcf\xd6\xdd\xe4\xeb\xf2\xf9"
3705 "\x00\x09\x12\x1b\x24\x2d\x36\x3f"
3706 "\x48\x51\x5a\x63\x6c\x75\x7e\x87"
3707 "\x90\x99\xa2\xab\xb4\xbd\xc6\xcf"
3708 "\xd8\xe1\xea\xf3\xfc\x05\x0e\x17"
3709 "\x20\x29\x32\x3b\x44\x4d\x56\x5f"
3710 "\x68\x71\x7a\x83\x8c\x95\x9e\xa7"
3711 "\xb0\xb9\xc2\xcb\xd4\xdd\xe6\xef"
3712 "\xf8\x01\x0a\x13\x1c\x25\x2e\x37"
3713 "\x40\x49\x52\x5b\x64\x6d\x76\x7f"
3714 "\x88\x91\x9a\xa3\xac\xb5\xbe\xc7"
3715 "\xd0\xd9\xe2\xeb\xf4\xfd\x06\x0f"
3716 "\x18\x21\x2a\x33\x3c\x45\x4e\x57"
3717 "\x60\x69\x72\x7b\x84\x8d\x96\x9f"
3718 "\xa8\xb1\xba\xc3\xcc\xd5\xde\xe7"
3719 "\xf0\xf9\x02\x0b\x14\x1d\x26\x2f"
3720 "\x38\x41\x4a\x53\x5c\x65\x6e\x77"
3721 "\x80\x89\x92\x9b\xa4\xad\xb6\xbf"
3722 "\xc8\xd1\xda\xe3\xec\xf5\xfe\x07"
3723 "\x10\x19\x22\x2b\x34\x3d\x46\x4f"
3724 "\x58\x61\x6a\x73\x7c\x85\x8e\x97"
3725 "\xa0\xa9\xb2\xbb\xc4\xcd\xd6\xdf"
3726 "\xe8\xf1\xfa\x03\x0c\x15\x1e\x27"
3727 "\x30\x39\x42\x4b\x54\x5d\x66\x6f"
3728 "\x78\x81\x8a\x93\x9c\xa5\xae\xb7"
3729 "\xc0\xc9\xd2\xdb\xe4\xed\xf6\xff"
3730 "\x08\x11\x1a\x23\x2c\x35\x3e\x47"
3731 "\x50\x59\x62\x6b\x74\x7d\x86\x8f"
3732 "\x98\xa1\xaa\xb3\xbc\xc5\xce\xd7"
3733 "\xe0\xe9\xf2\xfb\x04\x0d\x16\x1f"
3734 "\x28\x31\x3a\x43\x4c\x55\x5e\x67"
3735 "\x70\x79\x82\x8b\x94\x9d\xa6\xaf"
3736 "\xb8\xc1\xca\xd3\xdc\xe5\xee\xf7"
3737 "\x00\x0b\x16\x21\x2c\x37\x42\x4d"
3738 "\x58\x63\x6e\x79\x84\x8f\x9a\xa5"
3739 "\xb0\xbb\xc6\xd1\xdc\xe7\xf2\xfd"
3740 "\x08\x13\x1e\x29\x34\x3f\x4a\x55"
3741 "\x60\x6b\x76\x81\x8c\x97\xa2\xad"
3742 "\xb8\xc3\xce\xd9\xe4\xef\xfa\x05"
3743 "\x10\x1b\x26\x31\x3c\x47\x52\x5d"
3744 "\x68\x73\x7e\x89\x94\x9f\xaa\xb5"
3745 "\xc0\xcb\xd6\xe1\xec\xf7\x02\x0d"
3746 "\x18\x23\x2e\x39\x44\x4f\x5a\x65"
3747 "\x70\x7b\x86\x91\x9c\xa7\xb2\xbd"
3748 "\xc8\xd3\xde\xe9\xf4\xff\x0a\x15"
3749 "\x20\x2b\x36\x41\x4c\x57\x62\x6d"
3750 "\x78\x83\x8e\x99\xa4\xaf\xba\xc5"
3751 "\xd0\xdb\xe6\xf1\xfc\x07\x12\x1d"
3752 "\x28\x33\x3e\x49\x54\x5f\x6a\x75"
3753 "\x80\x8b\x96\xa1\xac\xb7\xc2\xcd"
3754 "\xd8\xe3\xee\xf9\x04\x0f\x1a\x25"
3755 "\x30\x3b\x46\x51\x5c\x67\x72\x7d"
3756 "\x88\x93\x9e\xa9\xb4\xbf\xca\xd5"
3757 "\xe0\xeb\xf6\x01\x0c\x17\x22\x2d"
3758 "\x38\x43\x4e\x59\x64\x6f\x7a\x85"
3759 "\x90\x9b\xa6\xb1\xbc\xc7\xd2\xdd"
3760 "\xe8\xf3\xfe\x09\x14\x1f\x2a\x35"
3761 "\x40\x4b\x56\x61\x6c\x77\x82\x8d"
3762 "\x98\xa3\xae\xb9\xc4\xcf\xda\xe5"
3763 "\xf0\xfb\x06\x11\x1c\x27\x32\x3d"
3764 "\x48\x53\x5e\x69\x74\x7f\x8a\x95"
3765 "\xa0\xab\xb6\xc1\xcc\xd7\xe2\xed"
3766 "\xf8\x03\x0e\x19\x24\x2f\x3a\x45"
3767 "\x50\x5b\x66\x71\x7c\x87\x92\x9d"
3768 "\xa8\xb3\xbe\xc9\xd4\xdf\xea\xf5"
3769 "\x00\x0d\x1a\x27\x34\x41\x4e\x5b"
3770 "\x68\x75\x82\x8f\x9c\xa9\xb6\xc3"
3771 "\xd0\xdd\xea\xf7\x04\x11\x1e\x2b"
3772 "\x38\x45\x52\x5f\x6c\x79\x86\x93"
3773 "\xa0\xad\xba\xc7\xd4\xe1\xee\xfb"
3774 "\x08\x15\x22\x2f\x3c\x49\x56\x63"
3775 "\x70\x7d\x8a\x97\xa4\xb1\xbe\xcb"
3776 "\xd8\xe5\xf2\xff\x0c\x19\x26\x33"
3777 "\x40\x4d\x5a\x67\x74\x81\x8e\x9b"
3778 "\xa8\xb5\xc2\xcf\xdc\xe9\xf6\x03"
3779 "\x10\x1d\x2a\x37\x44\x51\x5e\x6b"
3780 "\x78\x85\x92\x9f\xac\xb9\xc6\xd3"
3781 "\xe0\xed\xfa\x07\x14\x21\x2e\x3b"
3782 "\x48\x55\x62\x6f\x7c\x89\x96\xa3"
3783 "\xb0\xbd\xca\xd7\xe4\xf1\xfe\x0b"
3784 "\x18\x25\x32\x3f\x4c\x59\x66\x73"
3785 "\x80\x8d\x9a\xa7\xb4\xc1\xce\xdb"
3786 "\xe8\xf5\x02\x0f\x1c\x29\x36\x43"
3787 "\x50\x5d\x6a\x77\x84\x91\x9e\xab"
3788 "\xb8\xc5\xd2\xdf\xec\xf9\x06\x13"
3789 "\x20\x2d\x3a\x47\x54\x61\x6e\x7b"
3790 "\x88\x95\xa2\xaf\xbc\xc9\xd6\xe3"
3791 "\xf0\xfd\x0a\x17\x24\x31\x3e\x4b"
3792 "\x58\x65\x72\x7f\x8c\x99\xa6\xb3"
3793 "\xc0\xcd\xda\xe7\xf4\x01\x0e\x1b"
3794 "\x28\x35\x42\x4f\x5c\x69\x76\x83"
3795 "\x90\x9d\xaa\xb7\xc4\xd1\xde\xeb"
3796 "\xf8\x05\x12\x1f\x2c\x39\x46\x53"
3797 "\x60\x6d\x7a\x87\x94\xa1\xae\xbb"
3798 "\xc8\xd5\xe2\xef\xfc\x09\x16\x23"
3799 "\x30\x3d\x4a\x57\x64\x71\x7e\x8b"
3800 "\x98\xa5\xb2\xbf\xcc\xd9\xe6\xf3"
3801 "\x00\x0f\x1e\x2d\x3c\x4b\x5a\x69"
3802 "\x78\x87\x96\xa5\xb4\xc3\xd2\xe1"
3803 "\xf0\xff\x0e\x1d\x2c\x3b\x4a\x59"
3804 "\x68\x77\x86\x95\xa4\xb3\xc2\xd1"
3805 "\xe0\xef\xfe\x0d\x1c\x2b\x3a\x49"
3806 "\x58\x67\x76\x85\x94\xa3\xb2\xc1"
3807 "\xd0\xdf\xee\xfd\x0c\x1b\x2a\x39"
3808 "\x48\x57\x66\x75\x84\x93\xa2\xb1"
3809 "\xc0\xcf\xde\xed\xfc\x0b\x1a\x29"
3810 "\x38\x47\x56\x65\x74\x83\x92\xa1"
3811 "\xb0\xbf\xce\xdd\xec\xfb\x0a\x19"
3812 "\x28\x37\x46\x55\x64\x73\x82\x91"
3813 "\xa0\xaf\xbe\xcd\xdc\xeb\xfa\x09"
3814 "\x18\x27\x36\x45\x54\x63\x72\x81"
3815 "\x90\x9f\xae\xbd\xcc\xdb\xea\xf9"
3816 "\x08\x17\x26\x35\x44\x53\x62\x71"
3817 "\x80\x8f\x9e\xad\xbc\xcb\xda\xe9"
3818 "\xf8\x07\x16\x25\x34\x43\x52\x61"
3819 "\x70\x7f\x8e\x9d\xac\xbb\xca\xd9"
3820 "\xe8\xf7\x06\x15\x24\x33\x42\x51"
3821 "\x60\x6f\x7e\x8d\x9c\xab\xba\xc9"
3822 "\xd8\xe7\xf6\x05\x14\x23\x32\x41"
3823 "\x50\x5f\x6e\x7d\x8c\x9b\xaa\xb9"
3824 "\xc8\xd7\xe6\xf5\x04\x13\x22\x31"
3825 "\x40\x4f\x5e\x6d\x7c\x8b\x9a\xa9"
3826 "\xb8\xc7\xd6\xe5\xf4\x03\x12\x21"
3827 "\x30\x3f\x4e\x5d\x6c\x7b\x8a\x99"
3828 "\xa8\xb7\xc6\xd5\xe4\xf3\x02\x11"
3829 "\x20\x2f\x3e\x4d\x5c\x6b\x7a\x89"
3830 "\x98\xa7\xb6\xc5\xd4\xe3\xf2\x01"
3831 "\x10\x1f\x2e\x3d\x4c\x5b\x6a\x79"
3832 "\x88\x97\xa6\xb5\xc4\xd3\xe2\xf1"
3833 "\x00\x11\x22\x33\x44\x55\x66\x77"
3834 "\x88\x99\xaa\xbb\xcc\xdd\xee\xff"
3835 "\x10\x21\x32\x43\x54\x65\x76\x87"
3836 "\x98\xa9\xba\xcb\xdc\xed\xfe\x0f"
3837 "\x20\x31\x42\x53\x64\x75\x86\x97"
3838 "\xa8\xb9\xca\xdb\xec\xfd\x0e\x1f"
3839 "\x30\x41\x52\x63\x74\x85\x96\xa7"
3840 "\xb8\xc9\xda\xeb\xfc\x0d\x1e\x2f"
3841 "\x40\x51\x62\x73\x84\x95\xa6\xb7"
3842 "\xc8\xd9\xea\xfb\x0c\x1d\x2e\x3f"
3843 "\x50\x61\x72\x83\x94\xa5\xb6\xc7"
3844 "\xd8\xe9\xfa\x0b\x1c\x2d\x3e\x4f"
3845 "\x60\x71\x82\x93\xa4\xb5\xc6\xd7"
3846 "\xe8\xf9\x0a\x1b\x2c\x3d\x4e\x5f"
3847 "\x70\x81\x92\xa3\xb4\xc5\xd6\xe7"
3848 "\xf8\x09\x1a\x2b\x3c\x4d\x5e\x6f"
3849 "\x80\x91\xa2\xb3\xc4\xd5\xe6\xf7"
3850 "\x08\x19\x2a\x3b\x4c\x5d\x6e\x7f"
3851 "\x90\xa1\xb2\xc3\xd4\xe5\xf6\x07"
3852 "\x18\x29\x3a\x4b\x5c\x6d\x7e\x8f"
3853 "\xa0\xb1\xc2\xd3\xe4\xf5\x06\x17"
3854 "\x28\x39\x4a\x5b\x6c\x7d\x8e\x9f"
3855 "\xb0\xc1\xd2\xe3\xf4\x05\x16\x27"
3856 "\x38\x49\x5a\x6b\x7c\x8d\x9e\xaf"
3857 "\xc0\xd1\xe2\xf3\x04\x15\x26\x37"
3858 "\x48\x59\x6a\x7b\x8c\x9d\xae\xbf"
3859 "\xd0\xe1\xf2\x03\x14\x25\x36\x47"
3860 "\x58\x69\x7a\x8b\x9c\xad\xbe\xcf"
3861 "\xe0\xf1\x02\x13\x24\x35\x46\x57"
3862 "\x68\x79\x8a\x9b\xac\xbd\xce\xdf"
3863 "\xf0\x01\x12\x23\x34\x45\x56\x67"
3864 "\x78\x89\x9a\xab\xbc\xcd\xde\xef"
3865 "\x00\x13\x26\x39\x4c\x5f\x72\x85"
3866 "\x98\xab\xbe\xd1\xe4\xf7\x0a\x1d"
3867 "\x30\x43\x56\x69\x7c\x8f\xa2\xb5"
3868 "\xc8\xdb\xee\x01\x14\x27\x3a\x4d"
3869 "\x60\x73\x86\x99\xac\xbf\xd2\xe5"
3870 "\xf8\x0b\x1e\x31\x44\x57\x6a\x7d"
3871 "\x90\xa3\xb6\xc9\xdc\xef\x02\x15"
3872 "\x28\x3b\x4e\x61\x74\x87\x9a\xad"
3873 "\xc0\xd3\xe6\xf9\x0c\x1f\x32\x45"
3874 "\x58\x6b\x7e\x91\xa4\xb7\xca\xdd"
3875 "\xf0\x03\x16\x29\x3c\x4f\x62\x75"
3876 "\x88\x9b\xae\xc1\xd4\xe7\xfa\x0d"
3877 "\x20\x33\x46\x59\x6c\x7f\x92\xa5"
3878 "\xb8\xcb\xde\xf1\x04\x17\x2a\x3d"
3879 "\x50\x63\x76\x89\x9c\xaf\xc2\xd5"
3880 "\xe8\xfb\x0e\x21\x34\x47\x5a\x6d"
3881 "\x80\x93\xa6\xb9\xcc\xdf\xf2\x05"
3882 "\x18\x2b\x3e\x51\x64\x77\x8a\x9d"
3883 "\xb0\xc3\xd6\xe9\xfc\x0f\x22\x35"
3884 "\x48\x5b\x6e\x81\x94\xa7\xba\xcd"
3885 "\xe0\xf3\x06\x19\x2c\x3f\x52\x65"
3886 "\x78\x8b\x9e\xb1\xc4\xd7\xea\xfd"
3887 "\x10\x23\x36\x49\x5c\x6f\x82\x95"
3888 "\xa8\xbb\xce\xe1\xf4\x07\x1a\x2d"
3889 "\x40\x53\x66\x79\x8c\x9f\xb2\xc5"
3890 "\xd8\xeb\xfe\x11\x24\x37\x4a\x5d"
3891 "\x70\x83\x96\xa9\xbc\xcf\xe2\xf5"
3892 "\x08\x1b\x2e\x41\x54\x67\x7a\x8d"
3893 "\xa0\xb3\xc6\xd9\xec\xff\x12\x25"
3894 "\x38\x4b\x5e\x71\x84\x97\xaa\xbd"
3895 "\xd0\xe3\xf6\x09\x1c\x2f\x42\x55"
3896 "\x68\x7b\x8e\xa1\xb4\xc7\xda\xed"
3897 "\x00\x15\x2a\x3f\x54\x69\x7e\x93"
3898 "\xa8\xbd\xd2\xe7\xfc\x11\x26\x3b"
3899 "\x50\x65\x7a\x8f\xa4\xb9\xce\xe3"
3900 "\xf8\x0d\x22\x37\x4c\x61\x76\x8b"
3901 "\xa0\xb5\xca\xdf\xf4\x09\x1e\x33"
3902 "\x48\x5d\x72\x87\x9c\xb1\xc6\xdb"
3903 "\xf0\x05\x1a\x2f\x44\x59\x6e\x83"
3904 "\x98\xad\xc2\xd7\xec\x01\x16\x2b"
3905 "\x40\x55\x6a\x7f\x94\xa9\xbe\xd3"
3906 "\xe8\xfd\x12\x27\x3c\x51\x66\x7b"
3907 "\x90\xa5\xba\xcf\xe4\xf9\x0e\x23"
3908 "\x38\x4d\x62\x77\x8c\xa1\xb6\xcb"
3909 "\xe0\xf5\x0a\x1f\x34\x49\x5e\x73"
3910 "\x88\x9d\xb2\xc7\xdc\xf1\x06\x1b"
3911 "\x30\x45\x5a\x6f\x84\x99\xae\xc3"
3912 "\xd8\xed\x02\x17\x2c\x41\x56\x6b"
3913 "\x80\x95\xaa\xbf\xd4\xe9\xfe\x13"
3914 "\x28\x3d\x52\x67\x7c\x91\xa6\xbb"
3915 "\xd0\xe5\xfa\x0f\x24\x39\x4e\x63"
3916 "\x78\x8d\xa2\xb7\xcc\xe1\xf6\x0b"
3917 "\x20\x35\x4a\x5f\x74\x89\x9e\xb3"
3918 "\xc8\xdd\xf2\x07\x1c\x31\x46\x5b"
3919 "\x70\x85\x9a\xaf\xc4\xd9\xee\x03"
3920 "\x18\x2d\x42\x57\x6c\x81\x96\xab"
3921 "\xc0\xd5\xea\xff\x14\x29\x3e\x53"
3922 "\x68\x7d\x92\xa7\xbc\xd1\xe6\xfb"
3923 "\x10\x25\x3a\x4f\x64\x79\x8e\xa3"
3924 "\xb8\xcd\xe2\xf7\x0c\x21\x36\x4b"
3925 "\x60\x75\x8a\x9f\xb4\xc9\xde\xf3"
3926 "\x08\x1d\x32\x47\x5c\x71\x86\x9b"
3927 "\xb0\xc5\xda\xef\x04\x19\x2e\x43"
3928 "\x58\x6d\x82\x97\xac\xc1\xd6\xeb"
3929 "\x00\x17\x2e\x45\x5c\x73\x8a\xa1"
3930 "\xb8\xcf\xe6\xfd\x14\x2b\x42\x59"
3931 "\x70\x87\x9e\xb5\xcc\xe3\xfa\x11"
3932 "\x28\x3f\x56\x6d\x84\x9b\xb2\xc9"
3933 "\xe0\xf7\x0e\x25\x3c\x53\x6a\x81"
3934 "\x98\xaf\xc6\xdd\xf4\x0b\x22\x39"
3935 "\x50\x67\x7e\x95\xac\xc3\xda\xf1"
3936 "\x08\x1f\x36\x4d\x64\x7b\x92\xa9"
3937 "\xc0\xd7\xee\x05\x1c\x33\x4a\x61"
3938 "\x78\x8f\xa6\xbd\xd4\xeb\x02\x19"
3939 "\x30\x47\x5e\x75\x8c\xa3\xba\xd1"
3940 "\xe8\xff\x16\x2d\x44\x5b\x72\x89"
3941 "\xa0\xb7\xce\xe5\xfc\x13\x2a\x41"
3942 "\x58\x6f\x86\x9d\xb4\xcb\xe2\xf9"
3943 "\x10\x27\x3e\x55\x6c\x83\x9a\xb1"
3944 "\xc8\xdf\xf6\x0d\x24\x3b\x52\x69"
3945 "\x80\x97\xae\xc5\xdc\xf3\x0a\x21"
3946 "\x38\x4f\x66\x7d\x94\xab\xc2\xd9"
3947 "\xf0\x07\x1e\x35\x4c\x63\x7a\x91"
3948 "\xa8\xbf\xd6\xed\x04\x1b\x32\x49"
3949 "\x60\x77\x8e\xa5\xbc\xd3\xea\x01"
3950 "\x18\x2f\x46\x5d\x74\x8b\xa2\xb9"
3951 "\xd0\xe7\xfe\x15\x2c\x43\x5a\x71"
3952 "\x88\x9f\xb6\xcd\xe4\xfb\x12\x29"
3953 "\x40\x57\x6e\x85\x9c\xb3\xca\xe1"
3954 "\xf8\x0f\x26\x3d\x54\x6b\x82\x99"
3955 "\xb0\xc7\xde\xf5\x0c\x23\x3a\x51"
3956 "\x68\x7f\x96\xad\xc4\xdb\xf2\x09"
3957 "\x20\x37\x4e\x65\x7c\x93\xaa\xc1"
3958 "\xd8\xef\x06\x1d\x34\x4b\x62\x79"
3959 "\x90\xa7\xbe\xd5\xec\x03\x1a\x31"
3960 "\x48\x5f\x76\x8d\xa4\xbb\xd2\xe9"
3961 "\x00\x19\x32\x4b\x64\x7d\x96\xaf"
3962 "\xc8\xe1\xfa\x13\x2c\x45\x5e\x77"
3963 "\x90\xa9\xc2\xdb\xf4\x0d\x26\x3f"
3964 "\x58\x71\x8a\xa3\xbc\xd5\xee\x07"
3965 "\x20\x39\x52\x6b\x84\x9d\xb6\xcf"
3966 "\xe8\x01\x1a\x33\x4c\x65\x7e\x97"
3967 "\xb0\xc9\xe2\xfb\x14\x2d\x46\x5f"
3968 "\x78\x91\xaa\xc3\xdc\xf5\x0e\x27"
3969 "\x40\x59\x72\x8b\xa4\xbd\xd6\xef"
3970 "\x08\x21\x3a\x53\x6c\x85\x9e\xb7"
3971 "\xd0\xe9\x02\x1b\x34\x4d\x66\x7f"
3972 "\x98\xb1\xca\xe3\xfc\x15\x2e\x47"
3973 "\x60\x79\x92\xab\xc4\xdd\xf6\x0f"
3974 "\x28\x41\x5a\x73\x8c\xa5\xbe\xd7"
3975 "\xf0\x09\x22\x3b\x54\x6d\x86\x9f"
3976 "\xb8\xd1\xea\x03\x1c\x35\x4e\x67"
3977 "\x80\x99\xb2\xcb\xe4\xfd\x16\x2f"
3978 "\x48\x61\x7a\x93\xac\xc5\xde\xf7"
3979 "\x10\x29\x42\x5b\x74\x8d\xa6\xbf"
3980 "\xd8\xf1\x0a\x23\x3c\x55\x6e\x87"
3981 "\xa0\xb9\xd2\xeb\x04\x1d\x36\x4f"
3982 "\x68\x81\x9a\xb3\xcc\xe5\xfe\x17"
3983 "\x30\x49\x62\x7b\x94\xad\xc6\xdf"
3984 "\xf8\x11\x2a\x43\x5c\x75\x8e\xa7"
3985 "\xc0\xd9\xf2\x0b\x24\x3d\x56\x6f"
3986 "\x88\xa1\xba\xd3\xec\x05\x1e\x37"
3987 "\x50\x69\x82\x9b\xb4\xcd\xe6\xff"
3988 "\x18\x31\x4a\x63\x7c\x95\xae\xc7"
3989 "\xe0\xf9\x12\x2b\x44\x5d\x76\x8f"
3990 "\xa8\xc1\xda\xf3\x0c\x25\x3e\x57"
3991 "\x70\x89\xa2\xbb\xd4\xed\x06\x1f"
3992 "\x38\x51\x6a\x83\x9c\xb5\xce\xe7"
3993 "\x00\x1b\x36\x51\x6c\x87\xa2\xbd"
3994 "\xd8\xf3\x0e\x29\x44\x5f\x7a\x95"
3995 "\xb0\xcb\xe6\x01\x1c\x37\x52\x6d"
3996 "\x88\xa3\xbe\xd9\xf4\x0f\x2a\x45"
3997 "\x60\x7b\x96\xb1\xcc\xe7\x02\x1d"
3998 "\x38\x53\x6e\x89\xa4\xbf\xda\xf5"
3999 "\x10\x2b\x46\x61\x7c\x97\xb2\xcd"
4000 "\xe8\x03\x1e\x39\x54\x6f\x8a\xa5"
4001 "\xc0\xdb\xf6\x11\x2c\x47\x62\x7d"
4002 "\x98\xb3\xce\xe9\x04\x1f\x3a\x55"
4003 "\x70\x8b\xa6\xc1\xdc\xf7\x12\x2d"
4004 "\x48\x63\x7e\x99\xb4\xcf\xea\x05"
4005 "\x20\x3b\x56\x71\x8c\xa7\xc2\xdd"
4006 "\xf8\x13\x2e\x49\x64\x7f\x9a\xb5"
4007 "\xd0\xeb\x06\x21\x3c\x57\x72\x8d"
4008 "\xa8\xc3\xde\xf9\x14\x2f\x4a\x65"
4009 "\x80\x9b\xb6\xd1\xec\x07\x22\x3d"
4010 "\x58\x73\x8e\xa9\xc4\xdf\xfa\x15"
4011 "\x30\x4b\x66\x81\x9c\xb7\xd2\xed"
4012 "\x08\x23\x3e\x59\x74\x8f\xaa\xc5"
4013 "\xe0\xfb\x16\x31\x4c\x67\x82\x9d"
4014 "\xb8\xd3\xee\x09\x24\x3f\x5a\x75"
4015 "\x90\xab\xc6\xe1\xfc\x17\x32\x4d"
4016 "\x68\x83\x9e\xb9\xd4\xef\x0a\x25"
4017 "\x40\x5b\x76\x91\xac\xc7\xe2\xfd"
4018 "\x18\x33\x4e\x69\x84\x9f\xba\xd5"
4019 "\xf0\x0b\x26\x41\x5c\x77\x92\xad"
4020 "\xc8\xe3\xfe\x19\x34\x4f\x6a\x85"
4021 "\xa0\xbb\xd6\xf1\x0c\x27\x42\x5d"
4022 "\x78\x93\xae\xc9\xe4\xff\x1a\x35"
4023 "\x50\x6b\x86\xa1\xbc\xd7\xf2\x0d"
4024 "\x28\x43\x5e\x79\x94\xaf\xca\xe5"
4025 "\x00\x1d\x3a\x57\x74\x91\xae\xcb"
4026 "\xe8\x05\x22\x3f\x5c\x79\x96\xb3"
4027 "\xd0\xed\x0a\x27\x44\x61\x7e\x9b"
4028 "\xb8\xd5\xf2\x0f\x2c\x49\x66\x83"
4029 "\xa0\xbd\xda\xf7\x14\x31\x4e\x6b"
4030 "\x88\xa5\xc2\xdf\xfc\x19\x36\x53"
4031 "\x70\x8d\xaa\xc7\xe4\x01\x1e\x3b"
4032 "\x58\x75\x92\xaf\xcc\xe9\x06\x23"
4033 "\x40\x5d\x7a\x97\xb4\xd1\xee\x0b"
4034 "\x28\x45\x62\x7f\x9c\xb9\xd6\xf3"
4035 "\x10\x2d\x4a\x67\x84\xa1\xbe\xdb"
4036 "\xf8\x15\x32\x4f\x6c\x89\xa6\xc3"
4037 "\xe0\xfd\x1a\x37\x54\x71\x8e\xab"
4038 "\xc8\xe5\x02\x1f\x3c\x59\x76\x93"
4039 "\xb0\xcd\xea\x07\x24\x41\x5e\x7b"
4040 "\x98\xb5\xd2\xef\x0c\x29\x46\x63"
4041 "\x80\x9d\xba\xd7\xf4\x11\x2e\x4b"
4042 "\x68\x85\xa2\xbf\xdc\xf9\x16\x33"
4043 "\x50\x6d\x8a\xa7\xc4\xe1\xfe\x1b"
4044 "\x38\x55\x72\x8f\xac\xc9\xe6\x03"
4045 "\x20\x3d\x5a\x77\x94\xb1\xce\xeb"
4046 "\x08\x25\x42\x5f\x7c\x99\xb6\xd3"
4047 "\xf0\x0d\x2a\x47\x64\x81\x9e\xbb"
4048 "\xd8\xf5\x12\x2f\x4c\x69\x86\xa3"
4049 "\xc0\xdd\xfa\x17\x34\x51\x6e\x8b"
4050 "\xa8\xc5\xe2\xff\x1c\x39\x56\x73"
4051 "\x90\xad\xca\xe7\x04\x21\x3e\x5b"
4052 "\x78\x95\xb2\xcf\xec\x09\x26\x43"
4053 "\x60\x7d\x9a\xb7\xd4\xf1\x0e\x2b"
4054 "\x48\x65\x82\x9f\xbc\xd9\xf6\x13"
4055 "\x30\x4d\x6a\x87\xa4\xc1\xde\xfb"
4056 "\x18\x35\x52\x6f\x8c\xa9\xc6\xe3"
4057 "\x00\x1f\x3e\x5d\x7c\x9b\xba\xd9"
4058 "\xf8\x17\x36\x55\x74\x93\xb2\xd1"
4059 "\xf0\x0f\x2e\x4d\x6c\x8b\xaa\xc9"
4060 "\xe8\x07\x26\x45\x64\x83\xa2\xc1"
4061 "\xe0\xff\x1e\x3d\x5c\x7b\x9a\xb9"
4062 "\xd8\xf7\x16\x35\x54\x73\x92\xb1"
4063 "\xd0\xef\x0e\x2d\x4c\x6b\x8a\xa9"
4064 "\xc8\xe7\x06\x25\x44\x63\x82\xa1"
4065 "\xc0\xdf\xfe\x1d\x3c\x5b\x7a\x99"
4066 "\xb8\xd7\xf6\x15\x34\x53\x72\x91"
4067 "\xb0\xcf\xee\x0d\x2c\x4b\x6a\x89"
4068 "\xa8\xc7\xe6\x05\x24\x43\x62\x81"
4069 "\xa0\xbf\xde\xfd\x1c\x3b\x5a\x79"
4070 "\x98\xb7\xd6\xf5\x14\x33\x52\x71"
4071 "\x90\xaf\xce\xed\x0c\x2b\x4a\x69"
4072 "\x88\xa7\xc6\xe5\x04\x23\x42\x61"
4073 "\x80\x9f\xbe\xdd\xfc\x1b\x3a\x59"
4074 "\x78\x97\xb6\xd5\xf4\x13\x32\x51"
4075 "\x70\x8f\xae\xcd\xec\x0b\x2a\x49"
4076 "\x68\x87\xa6\xc5\xe4\x03\x22\x41"
4077 "\x60\x7f\x9e\xbd\xdc\xfb\x1a\x39"
4078 "\x58\x77\x96\xb5\xd4\xf3\x12\x31"
4079 "\x50\x6f\x8e\xad\xcc\xeb\x0a\x29"
4080 "\x48\x67\x86\xa5\xc4\xe3\x02\x21"
4081 "\x40\x5f\x7e\x9d\xbc\xdb\xfa\x19"
4082 "\x38\x57\x76\x95\xb4\xd3\xf2\x11"
4083 "\x30\x4f\x6e\x8d\xac\xcb\xea\x09"
4084 "\x28\x47\x66\x85\xa4\xc3\xe2\x01"
4085 "\x20\x3f\x5e\x7d\x9c\xbb\xda\xf9"
4086 "\x18\x37\x56\x75\x94\xb3\xd2\xf1"
4087 "\x10\x2f\x4e\x6d\x8c\xab\xca\xe9"
4088 "\x08\x27\x46\x65\x84\xa3\xc2\xe1"
4089 "\x00\x21\x42\x63",
4090 .ilen = 4100,
4091 .result =
4092 "\xf0\x5c\x74\xad\x4e\xbc\x99\xe2"
4093 "\xae\xff\x91\x3a\x44\xcf\x38\x32"
4094 "\x1e\xad\xa7\xcd\xa1\x39\x95\xaa"
4095 "\x10\xb1\xb3\x2e\x04\x31\x8f\x86"
4096 "\xf2\x62\x74\x70\x0c\xa4\x46\x08"
4097 "\xa8\xb7\x99\xa8\xe9\xd2\x73\x79"
4098 "\x7e\x6e\xd4\x8f\x1e\xc7\x8e\x31"
4099 "\x0b\xfa\x4b\xce\xfd\xf3\x57\x71"
4100 "\xe9\x46\x03\xa5\x3d\x34\x00\xe2"
4101 "\x18\xff\x75\x6d\x06\x2d\x00\xab"
4102 "\xb9\x3e\x6c\x59\xc5\x84\x06\xb5"
4103 "\x8b\xd0\x89\x9c\x4a\x79\x16\xc6"
4104 "\x3d\x74\x54\xfa\x44\xcd\x23\x26"
4105 "\x5c\xcf\x7e\x28\x92\x32\xbf\xdf"
4106 "\xa7\x20\x3c\x74\x58\x2a\x9a\xde"
4107 "\x61\x00\x1c\x4f\xff\x59\xc4\x22"
4108 "\xac\x3c\xd0\xe8\x6c\xf9\x97\x1b"
4109 "\x58\x9b\xad\x71\xe8\xa9\xb5\x0d"
4110 "\xee\x2f\x04\x1f\x7f\xbc\x99\xee"
4111 "\x84\xff\x42\x60\xdc\x3a\x18\xa5"
4112 "\x81\xf9\xef\xdc\x7a\x0f\x65\x41"
4113 "\x2f\xa3\xd3\xf9\xc2\xcb\xc0\x4d"
4114 "\x8f\xd3\x76\x96\xad\x49\x6d\x38"
4115 "\x3d\x39\x0b\x6c\x80\xb7\x54\x69"
4116 "\xf0\x2c\x90\x02\x29\x0d\x1c\x12"
4117 "\xad\x55\xc3\x8b\x68\xd9\xcc\xb3"
4118 "\xb2\x64\x33\x90\x5e\xca\x4b\xe2"
4119 "\xfb\x75\xdc\x63\xf7\x9f\x82\x74"
4120 "\xf0\xc9\xaa\x7f\xe9\x2a\x9b\x33"
4121 "\xbc\x88\x00\x7f\xca\xb2\x1f\x14"
4122 "\xdb\xc5\x8e\x7b\x11\x3c\x3e\x08"
4123 "\xf3\x83\xe8\xe0\x94\x86\x2e\x92"
4124 "\x78\x6b\x01\xc9\xc7\x83\xba\x21"
4125 "\x6a\x25\x15\x33\x4e\x45\x08\xec"
4126 "\x35\xdb\xe0\x6e\x31\x51\x79\xa9"
4127 "\x42\x44\x65\xc1\xa0\xf1\xf9\x2a"
4128 "\x70\xd5\xb6\xc6\xc1\x8c\x39\xfc"
4129 "\x25\xa6\x55\xd9\xdd\x2d\x4c\xec"
4130 "\x49\xc6\xeb\x0e\xa8\x25\x2a\x16"
4131 "\x1b\x66\x84\xda\xe2\x92\xe5\xc0"
4132 "\xc8\x53\x07\xaf\x80\x84\xec\xfd"
4133 "\xcd\xd1\x6e\xcd\x6f\x6a\xf5\x36"
4134 "\xc5\x15\xe5\x25\x7d\x77\xd1\x1a"
4135 "\x93\x36\xa9\xcf\x7c\xa4\x54\x4a"
4136 "\x06\x51\x48\x4e\xf6\x59\x87\xd2"
4137 "\x04\x02\xef\xd3\x44\xde\x76\x31"
4138 "\xb3\x34\x17\x1b\x9d\x66\x11\x9f"
4139 "\x1e\xcc\x17\xe9\xc7\x3c\x1b\xe7"
4140 "\xcb\x50\x08\xfc\xdc\x2b\x24\xdb"
4141 "\x65\x83\xd0\x3b\xe3\x30\xea\x94"
4142 "\x6c\xe7\xe8\x35\x32\xc7\xdb\x64"
4143 "\xb4\x01\xab\x36\x2c\x77\x13\xaf"
4144 "\xf8\x2b\x88\x3f\x54\x39\xc4\x44"
4145 "\xfe\xef\x6f\x68\x34\xbe\x0f\x05"
4146 "\x16\x6d\xf6\x0a\x30\xe7\xe3\xed"
4147 "\xc4\xde\x3c\x1b\x13\xd8\xdb\xfe"
4148 "\x41\x62\xe5\x28\xd4\x8d\xa3\xc7"
4149 "\x93\x97\xc6\x48\x45\x1d\x9f\x83"
4150 "\xdf\x4b\x40\x3e\x42\x25\x87\x80"
4151 "\x4c\x7d\xa8\xd4\x98\x23\x95\x75"
4152 "\x41\x8c\xda\x41\x9b\xd4\xa7\x06"
4153 "\xb5\xf1\x71\x09\x53\xbe\xca\xbf"
4154 "\x32\x03\xed\xf0\x50\x1c\x56\x39"
4155 "\x5b\xa4\x75\x18\xf7\x9b\x58\xef"
4156 "\x53\xfc\x2a\x38\x23\x15\x75\xcd"
4157 "\x45\xe5\x5a\x82\x55\xba\x21\xfa"
4158 "\xd4\xbd\xc6\x94\x7c\xc5\x80\x12"
4159 "\xf7\x4b\x32\xc4\x9a\x82\xd8\x28"
4160 "\x8f\xd9\xc2\x0f\x60\x03\xbe\x5e"
4161 "\x21\xd6\x5f\x58\xbf\x5c\xb1\x32"
4162 "\x82\x8d\xa9\xe5\xf2\x66\x1a\xc0"
4163 "\xa0\xbc\x58\x2f\x71\xf5\x2f\xed"
4164 "\xd1\x26\xb9\xd8\x49\x5a\x07\x19"
4165 "\x01\x7c\x59\xb0\xf8\xa4\xb7\xd3"
4166 "\x7b\x1a\x8c\x38\xf4\x50\xa4\x59"
4167 "\xb0\xcc\x41\x0b\x88\x7f\xe5\x31"
4168 "\xb3\x42\xba\xa2\x7e\xd4\x32\x71"
4169 "\x45\x87\x48\xa9\xc2\xf2\x89\xb3"
4170 "\xe4\xa7\x7e\x52\x15\x61\xfa\xfe"
4171 "\xc9\xdd\x81\xeb\x13\xab\xab\xc3"
4172 "\x98\x59\xd8\x16\x3d\x14\x7a\x1c"
4173 "\x3c\x41\x9a\x16\x16\x9b\xd2\xd2"
4174 "\x69\x3a\x29\x23\xac\x86\x32\xa5"
4175 "\x48\x9c\x9e\xf3\x47\x77\x81\x70"
4176 "\x24\xe8\x85\xd2\xf5\xb5\xfa\xff"
4177 "\x59\x6a\xd3\x50\x59\x43\x59\xde"
4178 "\xd9\xf1\x55\xa5\x0c\xc3\x1a\x1a"
4179 "\x18\x34\x0d\x1a\x63\x33\xed\x10"
4180 "\xe0\x1d\x2a\x18\xd2\xc0\x54\xa8"
4181 "\xca\xb5\x9a\xd3\xdd\xca\x45\x84"
4182 "\x50\xe7\x0f\xfe\xa4\x99\x5a\xbe"
4183 "\x43\x2d\x9a\xcb\x92\x3f\x5a\x1d"
4184 "\x85\xd8\xc9\xdf\x68\xc9\x12\x80"
4185 "\x56\x0c\xdc\x00\xdc\x3a\x7d\x9d"
4186 "\xa3\xa2\xe8\x4d\xbf\xf9\x70\xa0"
4187 "\xa4\x13\x4f\x6b\xaf\x0a\x89\x7f"
4188 "\xda\xf0\xbf\x9b\xc8\x1d\xe5\xf8"
4189 "\x2e\x8b\x07\xb5\x73\x1b\xcc\xa2"
4190 "\xa6\xad\x30\xbc\x78\x3c\x5b\x10"
4191 "\xfa\x5e\x62\x2d\x9e\x64\xb3\x33"
4192 "\xce\xf9\x1f\x86\xe7\x8b\xa2\xb8"
4193 "\xe8\x99\x57\x8c\x11\xed\x66\xd9"
4194 "\x3c\x72\xb9\xc3\xe6\x4e\x17\x3a"
4195 "\x6a\xcb\x42\x24\x06\xed\x3e\x4e"
4196 "\xa3\xe8\x6a\x94\xda\x0d\x4e\xd5"
4197 "\x14\x19\xcf\xb6\x26\xd8\x2e\xcc"
4198 "\x64\x76\x38\x49\x4d\xfe\x30\x6d"
4199 "\xe4\xc8\x8c\x7b\xc4\xe0\x35\xba"
4200 "\x22\x6e\x76\xe1\x1a\xf2\x53\xc3"
4201 "\x28\xa2\x82\x1f\x61\x69\xad\xc1"
4202 "\x7b\x28\x4b\x1e\x6c\x85\x95\x9b"
4203 "\x51\xb5\x17\x7f\x12\x69\x8c\x24"
4204 "\xd5\xc7\x5a\x5a\x11\x54\xff\x5a"
4205 "\xf7\x16\xc3\x91\xa6\xf0\xdc\x0a"
4206 "\xb6\xa7\x4a\x0d\x7a\x58\xfe\xa5"
4207 "\xf5\xcb\x8f\x7b\x0e\xea\x57\xe7"
4208 "\xbd\x79\xd6\x1c\x88\x23\x6c\xf2"
4209 "\x4d\x29\x77\x53\x35\x6a\x00\x8d"
4210 "\xcd\xa3\x58\xbe\x77\x99\x18\xf8"
4211 "\xe6\xe1\x8f\xe9\x37\x8f\xe3\xe2"
4212 "\x5a\x8a\x93\x25\xaf\xf3\x78\x80"
4213 "\xbe\xa6\x1b\xc6\xac\x8b\x1c\x91"
4214 "\x58\xe1\x9f\x89\x35\x9d\x1d\x21"
4215 "\x29\x9f\xf4\x99\x02\x27\x0f\xa8"
4216 "\x4f\x79\x94\x2b\x33\x2c\xda\xa2"
4217 "\x26\x39\x83\x94\xef\x27\xd8\x53"
4218 "\x8f\x66\x0d\xe4\x41\x7d\x34\xcd"
4219 "\x43\x7c\x95\x0a\x53\xef\x66\xda"
4220 "\x7e\x9b\xf3\x93\xaf\xd0\x73\x71"
4221 "\xba\x40\x9b\x74\xf8\xd7\xd7\x41"
4222 "\x6d\xaf\x72\x9c\x8d\x21\x87\x3c"
4223 "\xfd\x0a\x90\xa9\x47\x96\x9e\xd3"
4224 "\x88\xee\x73\xcf\x66\x2f\x52\x56"
4225 "\x6d\xa9\x80\x4c\xe2\x6f\x62\x88"
4226 "\x3f\x0e\x54\x17\x48\x80\x5d\xd3"
4227 "\xc3\xda\x25\x3d\xa1\xc8\xcb\x9f"
4228 "\x9b\x70\xb3\xa1\xeb\x04\x52\xa1"
4229 "\xf2\x22\x0f\xfc\xc8\x18\xfa\xf9"
4230 "\x85\x9c\xf1\xac\xeb\x0c\x02\x46"
4231 "\x75\xd2\xf5\x2c\xe3\xd2\x59\x94"
4232 "\x12\xf3\x3c\xfc\xd7\x92\xfa\x36"
4233 "\xba\x61\x34\x38\x7c\xda\x48\x3e"
4234 "\x08\xc9\x39\x23\x5e\x02\x2c\x1a"
4235 "\x18\x7e\xb4\xd9\xfd\x9e\x40\x02"
4236 "\xb1\x33\x37\x32\xe7\xde\xd6\xd0"
4237 "\x7c\x58\x65\x4b\xf8\x34\x27\x9c"
4238 "\x44\xb4\xbd\xe9\xe9\x4c\x78\x7d"
4239 "\x4b\x9f\xce\xb1\xcd\x47\xa5\x37"
4240 "\xe5\x6d\xbd\xb9\x43\x94\x0a\xd4"
4241 "\xd6\xf9\x04\x5f\xb5\x66\x6c\x1a"
4242 "\x35\x12\xe3\x36\x28\x27\x36\x58"
4243 "\x01\x2b\x79\xe4\xba\x6d\x10\x7d"
4244 "\x65\xdf\x84\x95\xf4\xd5\xb6\x8f"
4245 "\x2b\x9f\x96\x00\x86\x60\xf0\x21"
4246 "\x76\xa8\x6a\x8c\x28\x1c\xb3\x6b"
4247 "\x97\xd7\xb6\x53\x2a\xcc\xab\x40"
4248 "\x9d\x62\x79\x58\x52\xe6\x65\xb7"
4249 "\xab\x55\x67\x9c\x89\x7c\x03\xb0"
4250 "\x73\x59\xc5\x81\xf5\x18\x17\x5c"
4251 "\x89\xf3\x78\x35\x44\x62\x78\x72"
4252 "\xd0\x96\xeb\x31\xe7\x87\x77\x14"
4253 "\x99\x51\xf2\x59\x26\x9e\xb5\xa6"
4254 "\x45\xfe\x6e\xbd\x07\x4c\x94\x5a"
4255 "\xa5\x7d\xfc\xf1\x2b\x77\xe2\xfe"
4256 "\x17\xd4\x84\xa0\xac\xb5\xc7\xda"
4257 "\xa9\x1a\xb6\xf3\x74\x11\xb4\x9d"
4258 "\xfb\x79\x2e\x04\x2d\x50\x28\x83"
4259 "\xbf\xc6\x52\xd3\x34\xd6\xe8\x7a"
4260 "\xb6\xea\xe7\xa8\x6c\x15\x1e\x2c"
4261 "\x57\xbc\x48\x4e\x5f\x5c\xb6\x92"
4262 "\xd2\x49\x77\x81\x6d\x90\x70\xae"
4263 "\x98\xa1\x03\x0d\x6b\xb9\x77\x14"
4264 "\xf1\x4e\x23\xd3\xf8\x68\xbd\xc2"
4265 "\xfe\x04\xb7\x5c\xc5\x17\x60\x8f"
4266 "\x65\x54\xa4\x7a\x42\xdc\x18\x0d"
4267 "\xb5\xcf\x0f\xd3\xc7\x91\x66\x1b"
4268 "\x45\x42\x27\x75\x50\xe5\xee\xb8"
4269 "\x7f\x33\x2c\xba\x4a\x92\x4d\x2c"
4270 "\x3c\xe3\x0d\x80\x01\xba\x0d\x29"
4271 "\xd8\x3c\xe9\x13\x16\x57\xe6\xea"
4272 "\x94\x52\xe7\x00\x4d\x30\xb0\x0f"
4273 "\x35\xb8\xb8\xa7\xb1\xb5\x3b\x44"
4274 "\xe1\x2f\xfd\x88\xed\x43\xe7\x52"
4275 "\x10\x93\xb3\x8a\x30\x6b\x0a\xf7"
4276 "\x23\xc6\x50\x9d\x4a\xb0\xde\xc3"
4277 "\xdc\x9b\x2f\x01\x56\x36\x09\xc5"
4278 "\x2f\x6b\xfe\xf1\xd8\x27\x45\x03"
4279 "\x30\x5e\x5c\x5b\xb4\x62\x0e\x1a"
4280 "\xa9\x21\x2b\x92\x94\x87\x62\x57"
4281 "\x4c\x10\x74\x1a\xf1\x0a\xc5\x84"
4282 "\x3b\x9e\x72\x02\xd7\xcc\x09\x56"
4283 "\xbd\x54\xc1\xf0\xc3\xe3\xb3\xf8"
4284 "\xd2\x0d\x61\xcb\xef\xce\x0d\x05"
4285 "\xb0\x98\xd9\x8e\x4f\xf9\xbc\x93"
4286 "\xa6\xea\xc8\xcf\x10\x53\x4b\xf1"
4287 "\xec\xfc\x89\xf9\x64\xb0\x22\xbf"
4288 "\x9e\x55\x46\x9f\x7c\x50\x8e\x84"
4289 "\x54\x20\x98\xd7\x6c\x40\x1e\xdb"
4290 "\x69\x34\x78\x61\x24\x21\x9c\x8a"
4291 "\xb3\x62\x31\x8b\x6e\xf5\x2a\x35"
4292 "\x86\x13\xb1\x6c\x64\x2e\x41\xa5"
4293 "\x05\xf2\x42\xba\xd2\x3a\x0d\x8e"
4294 "\x8a\x59\x94\x3c\xcf\x36\x27\x82"
4295 "\xc2\x45\xee\x58\xcd\x88\xb4\xec"
4296 "\xde\xb2\x96\x0a\xaf\x38\x6f\x88"
4297 "\xd7\xd8\xe1\xdf\xb9\x96\xa9\x0a"
4298 "\xb1\x95\x28\x86\x20\xe9\x17\x49"
4299 "\xa2\x29\x38\xaa\xa5\xe9\x6e\xf1"
4300 "\x19\x27\xc0\xd5\x2a\x22\xc3\x0b"
4301 "\xdb\x7c\x73\x10\xb9\xba\x89\x76"
4302 "\x54\xae\x7d\x71\xb3\x93\xf6\x32"
4303 "\xe6\x47\x43\x55\xac\xa0\x0d\xc2"
4304 "\x93\x27\x4a\x8e\x0e\x74\x15\xc7"
4305 "\x0b\x85\xd9\x0c\xa9\x30\x7a\x3e"
4306 "\xea\x8f\x85\x6d\x3a\x12\x4f\x72"
4307 "\x69\x58\x7a\x80\xbb\xb5\x97\xf3"
4308 "\xcf\x70\xd2\x5d\xdd\x4d\x21\x79"
4309 "\x54\x4d\xe4\x05\xe8\xbd\xc2\x62"
4310 "\xb1\x3b\x77\x1c\xd6\x5c\xf3\xa0"
4311 "\x79\x00\xa8\x6c\x29\xd9\x18\x24"
4312 "\x36\xa2\x46\xc0\x96\x65\x7f\xbd"
4313 "\x2a\xed\x36\x16\x0c\xaa\x9f\xf4"
4314 "\xc5\xb4\xe2\x12\xed\x69\xed\x4f"
4315 "\x26\x2c\x39\x52\x89\x98\xe7\x2c"
4316 "\x99\xa4\x9e\xa3\x9b\x99\x46\x7a"
4317 "\x3a\xdc\xa8\x59\xa3\xdb\xc3\x3b"
4318 "\x95\x0d\x3b\x09\x6e\xee\x83\x5d"
4319 "\x32\x4d\xed\xab\xfa\x98\x14\x4e"
4320 "\xc3\x15\x45\x53\x61\xc4\x93\xbd"
4321 "\x90\xf4\x99\x95\x4c\xe6\x76\x92"
4322 "\x29\x90\x46\x30\x92\x69\x7d\x13"
4323 "\xf2\xa5\xcd\x69\x49\x44\xb2\x0f"
4324 "\x63\x40\x36\x5f\x09\xe2\x78\xf8"
4325 "\x91\xe3\xe2\xfa\x10\xf7\xc8\x24"
4326 "\xa8\x89\x32\x5c\x37\x25\x1d\xb2"
4327 "\xea\x17\x8a\x0a\xa9\x64\xc3\x7c"
4328 "\x3c\x7c\xbd\xc6\x79\x34\xe7\xe2"
4329 "\x85\x8e\xbf\xf8\xde\x92\xa0\xae"
4330 "\x20\xc4\xf6\xbb\x1f\x38\x19\x0e"
4331 "\xe8\x79\x9c\xa1\x23\xe9\x54\x7e"
4332 "\x37\x2f\xe2\x94\x32\xaf\xa0\x23"
4333 "\x49\xe4\xc0\xb3\xac\x00\x8f\x36"
4334 "\x05\xc4\xa6\x96\xec\x05\x98\x4f"
4335 "\x96\x67\x57\x1f\x20\x86\x1b\x2d"
4336 "\x69\xe4\x29\x93\x66\x5f\xaf\x6b"
4337 "\x88\x26\x2c\x67\x02\x4b\x52\xd0"
4338 "\x83\x7a\x43\x1f\xc0\x71\x15\x25"
4339 "\x77\x65\x08\x60\x11\x76\x4c\x8d"
4340 "\xed\xa9\x27\xc6\xb1\x2a\x2c\x6a"
4341 "\x4a\x97\xf5\xc6\xb7\x70\x42\xd3"
4342 "\x03\xd1\x24\x95\xec\x6d\xab\x38"
4343 "\x72\xce\xe2\x8b\x33\xd7\x51\x09"
4344 "\xdc\x45\xe0\x09\x96\x32\xf3\xc4"
4345 "\x84\xdc\x73\x73\x2d\x1b\x11\x98"
4346 "\xc5\x0e\x69\x28\x94\xc7\xb5\x4d"
4347 "\xc8\x8a\xd0\xaa\x13\x2e\x18\x74"
4348 "\xdd\xd1\x1e\xf3\x90\xe8\xfc\x9a"
4349 "\x72\x4a\x0e\xd1\xe4\xfb\x0d\x96"
4350 "\xd1\x0c\x79\x85\x1b\x1c\xfe\xe1"
4351 "\x62\x8f\x7a\x73\x32\xab\xc8\x18"
4352 "\x69\xe3\x34\x30\xdf\x13\xa6\xe5"
4353 "\xe8\x0e\x67\x7f\x81\x11\xb4\x60"
4354 "\xc7\xbd\x79\x65\x50\xdc\xc4\x5b"
4355 "\xde\x39\xa4\x01\x72\x63\xf3\xd1"
4356 "\x64\x4e\xdf\xfc\x27\x92\x37\x0d"
4357 "\x57\xcd\x11\x4f\x11\x04\x8e\x1d"
4358 "\x16\xf7\xcd\x92\x9a\x99\x30\x14"
4359 "\xf1\x7c\x67\x1b\x1f\x41\x0b\xe8"
4360 "\x32\xe8\xb8\xc1\x4f\x54\x86\x4f"
4361 "\xe5\x79\x81\x73\xcd\x43\x59\x68"
4362 "\x73\x02\x3b\x78\x21\x72\x43\x00"
4363 "\x49\x17\xf7\x00\xaf\x68\x24\x53"
4364 "\x05\x0a\xc3\x33\xe0\x33\x3f\x69"
4365 "\xd2\x84\x2f\x0b\xed\xde\x04\xf4"
4366 "\x11\x94\x13\x69\x51\x09\x28\xde"
4367 "\x57\x5c\xef\xdc\x9a\x49\x1c\x17"
4368 "\x97\xf3\x96\xc1\x7f\x5d\x2e\x7d"
4369 "\x55\xb8\xb3\x02\x09\xb3\x1f\xe7"
4370 "\xc9\x8d\xa3\x36\x34\x8a\x77\x13"
4371 "\x30\x63\x4c\xa5\xcd\xc3\xe0\x7e"
4372 "\x05\xa1\x7b\x0c\xcb\x74\x47\x31"
4373 "\x62\x03\x43\xf1\x87\xb4\xb0\x85"
4374 "\x87\x8e\x4b\x25\xc7\xcf\xae\x4b"
4375 "\x36\x46\x3e\x62\xbc\x6f\xeb\x5f"
4376 "\x73\xac\xe6\x07\xee\xc1\xa1\xd6"
4377 "\xc4\xab\xc9\xd6\x89\x45\xe1\xf1"
4378 "\x04\x4e\x1a\x6f\xbb\x4f\x3a\xa3"
4379 "\xa0\xcb\xa3\x0a\xd8\x71\x35\x55"
4380 "\xe4\xbc\x2e\x04\x06\xe6\xff\x5b"
4381 "\x1c\xc0\x11\x7c\xc5\x17\xf3\x38"
4382 "\xcf\xe9\xba\x0f\x0e\xef\x02\xc2"
4383 "\x8d\xc6\xbc\x4b\x67\x20\x95\xd7"
4384 "\x2c\x45\x5b\x86\x44\x8c\x6f\x2e"
4385 "\x7e\x9f\x1c\x77\xba\x6b\x0e\xa3"
4386 "\x69\xdc\xab\x24\x57\x60\x47\xc1"
4387 "\xd1\xa5\x9d\x23\xe6\xb1\x37\xfe"
4388 "\x93\xd2\x4c\x46\xf9\x0c\xc6\xfb"
4389 "\xd6\x9d\x99\x69\xab\x7a\x07\x0c"
4390 "\x65\xe7\xc4\x08\x96\xe2\xa5\x01"
4391 "\x3f\x46\x07\x05\x7e\xe8\x9a\x90"
4392 "\x50\xdc\xe9\x7a\xea\xa1\x39\x6e"
4393 "\x66\xe4\x6f\xa5\x5f\xb2\xd9\x5b"
4394 "\xf5\xdb\x2a\x32\xf0\x11\x6f\x7c"
4395 "\x26\x10\x8f\x3d\x80\xe9\x58\xf7"
4396 "\xe0\xa8\x57\xf8\xdb\x0e\xce\x99"
4397 "\x63\x19\x3d\xd5\xec\x1b\x77\x69"
4398 "\x98\xf6\xe4\x5f\x67\x17\x4b\x09"
4399 "\x85\x62\x82\x70\x18\xe2\x9a\x78"
4400 "\xe2\x62\xbd\xb4\xf1\x42\xc6\xfb"
4401 "\x08\xd0\xbd\xeb\x4e\x09\xf2\xc8"
4402 "\x1e\xdc\x3d\x32\x21\x56\x9c\x4f"
4403 "\x35\xf3\x61\x06\x72\x84\xc4\x32"
4404 "\xf2\xf1\xfa\x0b\x2f\xc3\xdb\x02"
4405 "\x04\xc2\xde\x57\x64\x60\x8d\xcf"
4406 "\xcb\x86\x5d\x97\x3e\xb1\x9c\x01"
4407 "\xd6\x28\x8f\x99\xbc\x46\xeb\x05"
4408 "\xaf\x7e\xb8\x21\x2a\x56\x85\x1c"
4409 "\xb3\x71\xa0\xde\xca\x96\xf1\x78"
4410 "\x49\xa2\x99\x81\x80\x5c\x01\xf5"
4411 "\xa0\xa2\x56\x63\xe2\x70\x07\xa5"
4412 "\x95\xd6\x85\xeb\x36\x9e\xa9\x51"
4413 "\x66\x56\x5f\x1d\x02\x19\xe2\xf6"
4414 "\x4f\x73\x38\x09\x75\x64\x48\xe0"
4415 "\xf1\x7e\x0e\xe8\x9d\xf9\xed\x94"
4416 "\xfe\x16\x26\x62\x49\x74\xf4\xb0"
4417 "\xd4\xa9\x6c\xb0\xfd\x53\xe9\x81"
4418 "\xe0\x7a\xbf\xcf\xb5\xc4\x01\x81"
4419 "\x79\x99\x77\x01\x3b\xe9\xa2\xb6"
4420 "\xe6\x6a\x8a\x9e\x56\x1c\x8d\x1e"
4421 "\x8f\x06\x55\x2c\x6c\xdc\x92\x87"
4422 "\x64\x3b\x4b\x19\xa1\x13\x64\x1d"
4423 "\x4a\xe9\xc0\x00\xb8\x95\xef\x6b"
4424 "\x1a\x86\x6d\x37\x52\x02\xc2\xe0"
4425 "\xc8\xbb\x42\x0c\x02\x21\x4a\xc9"
4426 "\xef\xa0\x54\xe4\x5e\x16\x53\x81"
4427 "\x70\x62\x10\xaf\xde\xb8\xb5\xd3"
4428 "\xe8\x5e\x6c\xc3\x8a\x3e\x18\x07"
4429 "\xf2\x2f\x7d\xa7\xe1\x3d\x4e\xb4"
4430 "\x26\xa7\xa3\x93\x86\xb2\x04\x1e"
4431 "\x53\x5d\x86\xd6\xde\x65\xca\xe3"
4432 "\x4e\xc1\xcf\xef\xc8\x70\x1b\x83"
4433 "\x13\xdd\x18\x8b\x0d\x76\xd2\xf6"
4434 "\x37\x7a\x93\x7a\x50\x11\x9f\x96"
4435 "\x86\x25\xfd\xac\xdc\xbe\x18\x93"
4436 "\x19\x6b\xec\x58\x4f\xb9\x75\xa7"
4437 "\xdd\x3f\x2f\xec\xc8\x5a\x84\xab"
4438 "\xd5\xe4\x8a\x07\xf6\x4d\x23\xd6"
4439 "\x03\xfb\x03\x6a\xea\x66\xbf\xd4"
4440 "\xb1\x34\xfb\x78\xe9\x55\xdc\x7c"
4441 "\x3d\x9c\xe5\x9a\xac\xc3\x7a\x80"
4442 "\x24\x6d\xa0\xef\x25\x7c\xb7\xea"
4443 "\xce\x4d\x5f\x18\x60\xce\x87\x22"
4444 "\x66\x2f\xd5\xdd\xdd\x02\x21\x75"
4445 "\x82\xa0\x1f\x58\xc6\xd3\x62\xf7"
4446 "\x32\xd8\xaf\x1e\x07\x77\x51\x96"
4447 "\xd5\x6b\x1e\x7e\x80\x02\xe8\x67"
4448 "\xea\x17\x0b\x10\xd2\x3f\x28\x25"
4449 "\x4f\x05\x77\x02\x14\x69\xf0\x2c"
4450 "\xbe\x0c\xf1\x74\x30\xd1\xb9\x9b"
4451 "\xfc\x8c\xbb\x04\x16\xd9\xba\xc3"
4452 "\xbc\x91\x8a\xc4\x30\xa4\xb0\x12"
4453 "\x4c\x21\x87\xcb\xc9\x1d\x16\x96"
4454 "\x07\x6f\x23\x54\xb9\x6f\x79\xe5"
4455 "\x64\xc0\x64\xda\xb1\xae\xdd\x60"
4456 "\x6c\x1a\x9d\xd3\x04\x8e\x45\xb0"
4457 "\x92\x61\xd0\x48\x81\xed\x5e\x1d"
4458 "\xa0\xc9\xa4\x33\xc7\x13\x51\x5d"
4459 "\x7f\x83\x73\xb6\x70\x18\x65\x3e"
4460 "\x2f\x0e\x7a\x12\x39\x98\xab\xd8"
4461 "\x7e\x6f\xa3\xd1\xba\x56\xad\xbd"
4462 "\xf0\x03\x01\x1c\x85\x35\x9f\xeb"
4463 "\x19\x63\xa1\xaf\xfe\x2d\x35\x50"
4464 "\x39\xa0\x65\x7c\x95\x7e\x6b\xfe"
4465 "\xc1\xac\x07\x7c\x98\x4f\xbe\x57"
4466 "\xa7\x22\xec\xe2\x7e\x29\x09\x53"
4467 "\xe8\xbf\xb4\x7e\x3f\x8f\xfc\x14"
4468 "\xce\x54\xf9\x18\x58\xb5\xff\x44"
4469 "\x05\x9d\xce\x1b\xb6\x82\x23\xc8"
4470 "\x2e\xbc\x69\xbb\x4a\x29\x0f\x65"
4471 "\x94\xf0\x63\x06\x0e\xef\x8c\xbd"
4472 "\xff\xfd\xb0\x21\x6e\x57\x05\x75"
4473 "\xda\xd5\xc4\xeb\x8d\x32\xf7\x50"
4474 "\xd3\x6f\x22\xed\x5f\x8e\xa2\x5b"
4475 "\x80\x8c\xc8\x78\x40\x24\x4b\x89"
4476 "\x30\xce\x7a\x97\x0e\xc4\xaf\xef"
4477 "\x9b\xb4\xcd\x66\x74\x14\x04\x2b"
4478 "\xf7\xce\x0b\x1c\x6e\xc2\x78\x8c"
4479 "\xca\xc5\xd0\x1c\x95\x4a\x91\x2d"
4480 "\xa7\x20\xeb\x86\x52\xb7\x67\xd8"
4481 "\x0c\xd6\x04\x14\xde\x51\x74\x75"
4482 "\xe7\x11\xb4\x87\xa3\x3d\x2d\xad"
4483 "\x4f\xef\xa0\x0f\x70\x00\x6d\x13"
4484 "\x19\x1d\x41\x50\xe9\xd8\xf0\x32"
4485 "\x71\xbc\xd3\x11\xf2\xac\xbe\xaf"
4486 "\x75\x46\x65\x4e\x07\x34\x37\xa3"
4487 "\x89\xfe\x75\xd4\x70\x4c\xc6\x3f"
4488 "\x69\x24\x0e\x38\x67\x43\x8c\xde"
4489 "\x06\xb5\xb8\xe7\xc4\xf0\x41\x8f"
4490 "\xf0\xbd\x2f\x0b\xb9\x18\xf8\xde"
4491 "\x64\xb1\xdb\xee\x00\x50\x77\xe1"
4492 "\xc7\xff\xa6\xfa\xdd\x70\xf4\xe3"
4493 "\x93\xe9\x77\x35\x3d\x4b\x2f\x2b"
4494 "\x6d\x55\xf0\xfc\x88\x54\x4e\x89"
4495 "\xc1\x8a\x23\x31\x2d\x14\x2a\xb8"
4496 "\x1b\x15\xdd\x9e\x6e\x7b\xda\x05"
4497 "\x91\x7d\x62\x64\x96\x72\xde\xfc"
4498 "\xc1\xec\xf0\x23\x51\x6f\xdb\x5b"
4499 "\x1d\x08\x57\xce\x09\xb8\xf6\xcd"
4500 "\x8d\x95\xf2\x20\xbf\x0f\x20\x57"
4501 "\x98\x81\x84\x4f\x15\x5c\x76\xe7"
4502 "\x3e\x0a\x3a\x6c\xc4\x8a\xbe\x78"
4503 "\x74\x77\xc3\x09\x4b\x5d\x48\xe4"
4504 "\xc8\xcb\x0b\xea\x17\x28\xcf\xcf"
4505 "\x31\x32\x44\xa4\xe5\x0e\x1a\x98"
4506 "\x94\xc4\xf0\xff\xae\x3e\x44\xe8"
4507 "\xa5\xb3\xb5\x37\x2f\xe8\xaf\x6f"
4508 "\x28\xc1\x37\x5f\x31\xd2\xb9\x33"
4509 "\xb1\xb2\x52\x94\x75\x2c\x29\x59"
4510 "\x06\xc2\x25\xe8\x71\x65\x4e\xed"
4511 "\xc0\x9c\xb1\xbb\x25\xdc\x6c\xe7"
4512 "\x4b\xa5\x7a\x54\x7a\x60\xff\x7a"
4513 "\xe0\x50\x40\x96\x35\x63\xe4\x0b"
4514 "\x76\xbd\xa4\x65\x00\x1b\x57\x88"
4515 "\xae\xed\x39\x88\x42\x11\x3c\xed"
4516 "\x85\x67\x7d\xb9\x68\x82\xe9\x43"
4517 "\x3c\x47\x53\xfa\xe8\xf8\x9f\x1f"
4518 "\x9f\xef\x0f\xf7\x30\xd9\x30\x0e"
4519 "\xb9\x9f\x69\x18\x2f\x7e\xf8\xf8"
4520 "\xf8\x8c\x0f\xd4\x02\x4d\xea\xcd"
4521 "\x0a\x9c\x6f\x71\x6d\x5a\x4c\x60"
4522 "\xce\x20\x56\x32\xc6\xc5\x99\x1f"
4523 "\x09\xe6\x4e\x18\x1a\x15\x13\xa8"
4524 "\x7d\xb1\x6b\xc0\xb2\x6d\xf8\x26"
4525 "\x66\xf8\x3d\x18\x74\x70\x66\x7a"
4526 "\x34\x17\xde\xba\x47\xf1\x06\x18"
4527 "\xcb\xaf\xeb\x4a\x1e\x8f\xa7\x77"
4528 "\xe0\x3b\x78\x62\x66\xc9\x10\xea"
4529 "\x1f\xb7\x29\x0a\x45\xa1\x1d\x1e"
4530 "\x1d\xe2\x65\x61\x50\x9c\xd7\x05"
4531 "\xf2\x0b\x5b\x12\x61\x02\xc8\xe5"
4532 "\x63\x4f\x20\x0c\x07\x17\x33\x5e"
4533 "\x03\x9a\x53\x0f\x2e\x55\xfe\x50"
4534 "\x43\x7d\xd0\xb6\x7e\x5a\xda\xae"
4535 "\x58\xef\x15\xa9\x83\xd9\x46\xb1"
4536 "\x42\xaa\xf5\x02\x6c\xce\x92\x06"
4537 "\x1b\xdb\x66\x45\x91\x79\xc2\x2d"
4538 "\xe6\x53\xd3\x14\xfd\xbb\x44\x63"
4539 "\xc6\xd7\x3d\x7a\x0c\x75\x78\x9d"
4540 "\x5c\xa6\x39\xb3\xe5\x63\xca\x8b"
4541 "\xfe\xd3\xef\x60\x83\xf6\x8e\x70"
4542 "\xb6\x67\xc7\x77\xed\x23\xef\x4c"
4543 "\xf0\xed\x2d\x07\x59\x6f\xc1\x01"
4544 "\x34\x37\x08\xab\xd9\x1f\x09\xb1"
4545 "\xce\x5b\x17\xff\x74\xf8\x9c\xd5"
4546 "\x2c\x56\x39\x79\x0f\x69\x44\x75"
4547 "\x58\x27\x01\xc4\xbf\xa7\xa1\x1d"
4548 "\x90\x17\x77\x86\x5a\x3f\xd9\xd1"
4549 "\x0e\xa0\x10\xf8\xec\x1e\xa5\x7f"
4550 "\x5e\x36\xd1\xe3\x04\x2c\x70\xf7"
4551 "\x8e\xc0\x98\x2f\x6c\x94\x2b\x41"
4552 "\xb7\x60\x00\xb7\x2e\xb8\x02\x8d"
4553 "\xb8\xb0\xd3\x86\xba\x1d\xd7\x90"
4554 "\xd6\xb6\xe1\xfc\xd7\xd8\x28\x06"
4555 "\x63\x9b\xce\x61\x24\x79\xc0\x70"
4556 "\x52\xd0\xb6\xd4\x28\x95\x24\x87"
4557 "\x03\x1f\xb7\x9a\xda\xa3\xfb\x52"
4558 "\x5b\x68\xe7\x4c\x8c\x24\xe1\x42"
4559 "\xf7\xd5\xfd\xad\x06\x32\x9f\xba"
4560 "\xc1\xfc\xdd\xc6\xfc\xfc\xb3\x38"
4561 "\x74\x56\x58\x40\x02\x37\x52\x2c"
4562 "\x55\xcc\xb3\x9e\x7a\xe9\xd4\x38"
4563 "\x41\x5e\x0c\x35\xe2\x11\xd1\x13"
4564 "\xf8\xb7\x8d\x72\x6b\x22\x2a\xb0"
4565 "\xdb\x08\xba\x35\xb9\x3f\xc8\xd3"
4566 "\x24\x90\xec\x58\xd2\x09\xc7\x2d"
4567 "\xed\x38\x80\x36\x72\x43\x27\x49"
4568 "\x4a\x80\x8a\xa2\xe8\xd3\xda\x30"
4569 "\x7d\xb6\x82\x37\x86\x92\x86\x3e"
4570 "\x08\xb2\x28\x5a\x55\x44\x24\x7d"
4571 "\x40\x48\x8a\xb6\x89\x58\x08\xa0"
4572 "\xd6\x6d\x3a\x17\xbf\xf6\x54\xa2"
4573 "\xf5\xd3\x8c\x0f\x78\x12\x57\x8b"
4574 "\xd5\xc2\xfd\x58\x5b\x7f\x38\xe3"
4575 "\xcc\xb7\x7c\x48\xb3\x20\xe8\x81"
4576 "\x14\x32\x45\x05\xe0\xdb\x9f\x75"
4577 "\x85\xb4\x6a\xfc\x95\xe3\x54\x22"
4578 "\x12\xee\x30\xfe\xd8\x30\xef\x34"
4579 "\x50\xab\x46\x30\x98\x2f\xb7\xc0"
4580 "\x15\xa2\x83\xb6\xf2\x06\x21\xa2"
4581 "\xc3\x26\x37\x14\xd1\x4d\xb5\x10"
4582 "\x52\x76\x4d\x6a\xee\xb5\x2b\x15"
4583 "\xb7\xf9\x51\xe8\x2a\xaf\xc7\xfa"
4584 "\x77\xaf\xb0\x05\x4d\xd1\x68\x8e"
4585 "\x74\x05\x9f\x9d\x93\xa5\x3e\x7f"
4586 "\x4e\x5f\x9d\xcb\x09\xc7\x83\xe3"
4587 "\x02\x9d\x27\x1f\xef\x85\x05\x8d"
4588 "\xec\x55\x88\x0f\x0d\x7c\x4c\xe8"
4589 "\xa1\x75\xa0\xd8\x06\x47\x14\xef"
4590 "\xaa\x61\xcf\x26\x15\xad\xd8\xa3"
4591 "\xaa\x75\xf2\x78\x4a\x5a\x61\xdf"
4592 "\x8b\xc7\x04\xbc\xb2\x32\xd2\x7e"
4593 "\x42\xee\xb4\x2f\x51\xff\x7b\x2e"
4594 "\xd3\x02\xe8\xdc\x5d\x0d\x50\xdc"
4595 "\xae\xb7\x46\xf9\xa8\xe6\xd0\x16"
4596 "\xcc\xe6\x2c\x81\xc7\xad\xe9\xf0"
4597 "\x05\x72\x6d\x3d\x0a\x7a\xa9\x02"
4598 "\xac\x82\x93\x6e\xb6\x1c\x28\xfc"
4599 "\x44\x12\xfb\x73\x77\xd4\x13\x39"
4600 "\x29\x88\x8a\xf3\x5c\xa6\x36\xa0"
4601 "\x2a\xed\x7e\xb1\x1d\xd6\x4c\x6b"
4602 "\x41\x01\x18\x5d\x5d\x07\x97\xa6"
4603 "\x4b\xef\x31\x18\xea\xac\xb1\x84"
4604 "\x21\xed\xda\x86",
4605 .rlen = 4100,
4606 },
4607};
4608
4609static struct cipher_testvec aes_ctr_dec_tv_template[] = {
4610 { /* From RFC 3686 */
4611 .key = "\xae\x68\x52\xf8\x12\x10\x67\xcc"
4612 "\x4b\xf7\xa5\x76\x55\x77\xf3\x9e"
4613 "\x00\x00\x00\x30",
4614 .klen = 20,
4615 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00",
4616 .input = "\xe4\x09\x5d\x4f\xb7\xa7\xb3\x79"
4617 "\x2d\x61\x75\xa3\x26\x13\x11\xb8",
4618 .ilen = 16,
4619 .result = "Single block msg",
4620 .rlen = 16,
4621 }, {
4622 .key = "\x7e\x24\x06\x78\x17\xfa\xe0\xd7"
4623 "\x43\xd6\xce\x1f\x32\x53\x91\x63"
4624 "\x00\x6c\xb6\xdb",
4625 .klen = 20,
4626 .iv = "\xc0\x54\x3b\x59\xda\x48\xd9\x0b",
4627 .input = "\x51\x04\xa1\x06\x16\x8a\x72\xd9"
4628 "\x79\x0d\x41\xee\x8e\xda\xd3\x88"
4629 "\xeb\x2e\x1e\xfc\x46\xda\x57\xc8"
4630 "\xfc\xe6\x30\xdf\x91\x41\xbe\x28",
4631 .ilen = 32,
4632 .result = "\x00\x01\x02\x03\x04\x05\x06\x07"
4633 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
4634 "\x10\x11\x12\x13\x14\x15\x16\x17"
4635 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
4636 .rlen = 32,
4637 }, {
4638 .key = "\x16\xaf\x5b\x14\x5f\xc9\xf5\x79"
4639 "\xc1\x75\xf9\x3e\x3b\xfb\x0e\xed"
4640 "\x86\x3d\x06\xcc\xfd\xb7\x85\x15"
4641 "\x00\x00\x00\x48",
4642 .klen = 28,
4643 .iv = "\x36\x73\x3c\x14\x7d\x6d\x93\xcb",
4644 .input = "\x4b\x55\x38\x4f\xe2\x59\xc9\xc8"
4645 "\x4e\x79\x35\xa0\x03\xcb\xe9\x28",
4646 .ilen = 16,
4647 .result = "Single block msg",
4648 .rlen = 16,
4649 }, {
4650 .key = "\x7c\x5c\xb2\x40\x1b\x3d\xc3\x3c"
4651 "\x19\xe7\x34\x08\x19\xe0\xf6\x9c"
4652 "\x67\x8c\x3d\xb8\xe6\xf6\xa9\x1a"
4653 "\x00\x96\xb0\x3b",
4654 .klen = 28,
4655 .iv = "\x02\x0c\x6e\xad\xc2\xcb\x50\x0d",
4656 .input = "\x45\x32\x43\xfc\x60\x9b\x23\x32"
4657 "\x7e\xdf\xaa\xfa\x71\x31\xcd\x9f"
4658 "\x84\x90\x70\x1c\x5a\xd4\xa7\x9c"
4659 "\xfc\x1f\xe0\xff\x42\xf4\xfb\x00",
4660 .ilen = 32,
4661 .result = "\x00\x01\x02\x03\x04\x05\x06\x07"
4662 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
4663 "\x10\x11\x12\x13\x14\x15\x16\x17"
4664 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
4665 .rlen = 32,
4666 }, {
4667 .key = "\x77\x6b\xef\xf2\x85\x1d\xb0\x6f"
4668 "\x4c\x8a\x05\x42\xc8\x69\x6f\x6c"
4669 "\x6a\x81\xaf\x1e\xec\x96\xb4\xd3"
4670 "\x7f\xc1\xd6\x89\xe6\xc1\xc1\x04"
4671 "\x00\x00\x00\x60",
4672 .klen = 36,
4673 .iv = "\xdb\x56\x72\xc9\x7a\xa8\xf0\xb2",
4674 .input = "\x14\x5a\xd0\x1d\xbf\x82\x4e\xc7"
4675 "\x56\x08\x63\xdc\x71\xe3\xe0\xc0",
4676 .ilen = 16,
4677 .result = "Single block msg",
4678 .rlen = 16,
4679 }, {
4680 .key = "\xf6\xd6\x6d\x6b\xd5\x2d\x59\xbb"
4681 "\x07\x96\x36\x58\x79\xef\xf8\x86"
4682 "\xc6\x6d\xd5\x1a\x5b\x6a\x99\x74"
4683 "\x4b\x50\x59\x0c\x87\xa2\x38\x84"
4684 "\x00\xfa\xac\x24",
4685 .klen = 36,
4686 .iv = "\xc1\x58\x5e\xf1\x5a\x43\xd8\x75",
4687 .input = "\xf0\x5e\x23\x1b\x38\x94\x61\x2c"
4688 "\x49\xee\x00\x0b\x80\x4e\xb2\xa9"
4689 "\xb8\x30\x6b\x50\x8f\x83\x9d\x6a"
4690 "\x55\x30\x83\x1d\x93\x44\xaf\x1c",
4691 .ilen = 32,
4692 .result = "\x00\x01\x02\x03\x04\x05\x06\x07"
4693 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
4694 "\x10\x11\x12\x13\x14\x15\x16\x17"
4695 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
4696 .rlen = 32,
4697 },
4698};
4699
4700static struct aead_testvec aes_gcm_enc_tv_template[] = {
4701 { /* From McGrew & Viega - http://citeseer.ist.psu.edu/656989.html */
4702 .key = zeroed_string,
4703 .klen = 16,
4704 .result = "\x58\xe2\xfc\xce\xfa\x7e\x30\x61"
4705 "\x36\x7f\x1d\x57\xa4\xe7\x45\x5a",
4706 .rlen = 16,
4707 }, {
4708 .key = zeroed_string,
4709 .klen = 16,
4710 .input = zeroed_string,
4711 .ilen = 16,
4712 .result = "\x03\x88\xda\xce\x60\xb6\xa3\x92"
4713 "\xf3\x28\xc2\xb9\x71\xb2\xfe\x78"
4714 "\xab\x6e\x47\xd4\x2c\xec\x13\xbd"
4715 "\xf5\x3a\x67\xb2\x12\x57\xbd\xdf",
4716 .rlen = 32,
4717 }, {
4718 .key = "\xfe\xff\xe9\x92\x86\x65\x73\x1c"
4719 "\x6d\x6a\x8f\x94\x67\x30\x83\x08",
4720 .klen = 16,
4721 .iv = "\xca\xfe\xba\xbe\xfa\xce\xdb\xad"
4722 "\xde\xca\xf8\x88",
4723 .input = "\xd9\x31\x32\x25\xf8\x84\x06\xe5"
4724 "\xa5\x59\x09\xc5\xaf\xf5\x26\x9a"
4725 "\x86\xa7\xa9\x53\x15\x34\xf7\xda"
4726 "\x2e\x4c\x30\x3d\x8a\x31\x8a\x72"
4727 "\x1c\x3c\x0c\x95\x95\x68\x09\x53"
4728 "\x2f\xcf\x0e\x24\x49\xa6\xb5\x25"
4729 "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57"
4730 "\xba\x63\x7b\x39\x1a\xaf\xd2\x55",
4731 .ilen = 64,
4732 .result = "\x42\x83\x1e\xc2\x21\x77\x74\x24"
4733 "\x4b\x72\x21\xb7\x84\xd0\xd4\x9c"
4734 "\xe3\xaa\x21\x2f\x2c\x02\xa4\xe0"
4735 "\x35\xc1\x7e\x23\x29\xac\xa1\x2e"
4736 "\x21\xd5\x14\xb2\x54\x66\x93\x1c"
4737 "\x7d\x8f\x6a\x5a\xac\x84\xaa\x05"
4738 "\x1b\xa3\x0b\x39\x6a\x0a\xac\x97"
4739 "\x3d\x58\xe0\x91\x47\x3f\x59\x85"
4740 "\x4d\x5c\x2a\xf3\x27\xcd\x64\xa6"
4741 "\x2c\xf3\x5a\xbd\x2b\xa6\xfa\xb4",
4742 .rlen = 80,
4743 }, {
4744 .key = "\xfe\xff\xe9\x92\x86\x65\x73\x1c"
4745 "\x6d\x6a\x8f\x94\x67\x30\x83\x08",
4746 .klen = 16,
4747 .iv = "\xca\xfe\xba\xbe\xfa\xce\xdb\xad"
4748 "\xde\xca\xf8\x88",
4749 .input = "\xd9\x31\x32\x25\xf8\x84\x06\xe5"
4750 "\xa5\x59\x09\xc5\xaf\xf5\x26\x9a"
4751 "\x86\xa7\xa9\x53\x15\x34\xf7\xda"
4752 "\x2e\x4c\x30\x3d\x8a\x31\x8a\x72"
4753 "\x1c\x3c\x0c\x95\x95\x68\x09\x53"
4754 "\x2f\xcf\x0e\x24\x49\xa6\xb5\x25"
4755 "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57"
4756 "\xba\x63\x7b\x39",
4757 .ilen = 60,
4758 .assoc = "\xfe\xed\xfa\xce\xde\xad\xbe\xef"
4759 "\xfe\xed\xfa\xce\xde\xad\xbe\xef"
4760 "\xab\xad\xda\xd2",
4761 .alen = 20,
4762 .result = "\x42\x83\x1e\xc2\x21\x77\x74\x24"
4763 "\x4b\x72\x21\xb7\x84\xd0\xd4\x9c"
4764 "\xe3\xaa\x21\x2f\x2c\x02\xa4\xe0"
4765 "\x35\xc1\x7e\x23\x29\xac\xa1\x2e"
4766 "\x21\xd5\x14\xb2\x54\x66\x93\x1c"
4767 "\x7d\x8f\x6a\x5a\xac\x84\xaa\x05"
4768 "\x1b\xa3\x0b\x39\x6a\x0a\xac\x97"
4769 "\x3d\x58\xe0\x91"
4770 "\x5b\xc9\x4f\xbc\x32\x21\xa5\xdb"
4771 "\x94\xfa\xe9\x5a\xe7\x12\x1a\x47",
4772 .rlen = 76,
4773 }, {
4774 .key = zeroed_string,
4775 .klen = 24,
4776 .result = "\xcd\x33\xb2\x8a\xc7\x73\xf7\x4b"
4777 "\xa0\x0e\xd1\xf3\x12\x57\x24\x35",
4778 .rlen = 16,
4779 }, {
4780 .key = zeroed_string,
4781 .klen = 24,
4782 .input = zeroed_string,
4783 .ilen = 16,
4784 .result = "\x98\xe7\x24\x7c\x07\xf0\xfe\x41"
4785 "\x1c\x26\x7e\x43\x84\xb0\xf6\x00"
4786 "\x2f\xf5\x8d\x80\x03\x39\x27\xab"
4787 "\x8e\xf4\xd4\x58\x75\x14\xf0\xfb",
4788 .rlen = 32,
4789 }, {
4790 .key = "\xfe\xff\xe9\x92\x86\x65\x73\x1c"
4791 "\x6d\x6a\x8f\x94\x67\x30\x83\x08"
4792 "\xfe\xff\xe9\x92\x86\x65\x73\x1c",
4793 .klen = 24,
4794 .iv = "\xca\xfe\xba\xbe\xfa\xce\xdb\xad"
4795 "\xde\xca\xf8\x88",
4796 .input = "\xd9\x31\x32\x25\xf8\x84\x06\xe5"
4797 "\xa5\x59\x09\xc5\xaf\xf5\x26\x9a"
4798 "\x86\xa7\xa9\x53\x15\x34\xf7\xda"
4799 "\x2e\x4c\x30\x3d\x8a\x31\x8a\x72"
4800 "\x1c\x3c\x0c\x95\x95\x68\x09\x53"
4801 "\x2f\xcf\x0e\x24\x49\xa6\xb5\x25"
4802 "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57"
4803 "\xba\x63\x7b\x39\x1a\xaf\xd2\x55",
4804 .ilen = 64,
4805 .result = "\x39\x80\xca\x0b\x3c\x00\xe8\x41"
4806 "\xeb\x06\xfa\xc4\x87\x2a\x27\x57"
4807 "\x85\x9e\x1c\xea\xa6\xef\xd9\x84"
4808 "\x62\x85\x93\xb4\x0c\xa1\xe1\x9c"
4809 "\x7d\x77\x3d\x00\xc1\x44\xc5\x25"
4810 "\xac\x61\x9d\x18\xc8\x4a\x3f\x47"
4811 "\x18\xe2\x44\x8b\x2f\xe3\x24\xd9"
4812 "\xcc\xda\x27\x10\xac\xad\xe2\x56"
4813 "\x99\x24\xa7\xc8\x58\x73\x36\xbf"
4814 "\xb1\x18\x02\x4d\xb8\x67\x4a\x14",
4815 .rlen = 80,
4816 }, {
4817 .key = "\xfe\xff\xe9\x92\x86\x65\x73\x1c"
4818 "\x6d\x6a\x8f\x94\x67\x30\x83\x08"
4819 "\xfe\xff\xe9\x92\x86\x65\x73\x1c",
4820 .klen = 24,
4821 .iv = "\xca\xfe\xba\xbe\xfa\xce\xdb\xad"
4822 "\xde\xca\xf8\x88",
4823 .input = "\xd9\x31\x32\x25\xf8\x84\x06\xe5"
4824 "\xa5\x59\x09\xc5\xaf\xf5\x26\x9a"
4825 "\x86\xa7\xa9\x53\x15\x34\xf7\xda"
4826 "\x2e\x4c\x30\x3d\x8a\x31\x8a\x72"
4827 "\x1c\x3c\x0c\x95\x95\x68\x09\x53"
4828 "\x2f\xcf\x0e\x24\x49\xa6\xb5\x25"
4829 "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57"
4830 "\xba\x63\x7b\x39",
4831 .ilen = 60,
4832 .assoc = "\xfe\xed\xfa\xce\xde\xad\xbe\xef"
4833 "\xfe\xed\xfa\xce\xde\xad\xbe\xef"
4834 "\xab\xad\xda\xd2",
4835 .alen = 20,
4836 .result = "\x39\x80\xca\x0b\x3c\x00\xe8\x41"
4837 "\xeb\x06\xfa\xc4\x87\x2a\x27\x57"
4838 "\x85\x9e\x1c\xea\xa6\xef\xd9\x84"
4839 "\x62\x85\x93\xb4\x0c\xa1\xe1\x9c"
4840 "\x7d\x77\x3d\x00\xc1\x44\xc5\x25"
4841 "\xac\x61\x9d\x18\xc8\x4a\x3f\x47"
4842 "\x18\xe2\x44\x8b\x2f\xe3\x24\xd9"
4843 "\xcc\xda\x27\x10"
4844 "\x25\x19\x49\x8e\x80\xf1\x47\x8f"
4845 "\x37\xba\x55\xbd\x6d\x27\x61\x8c",
4846 .rlen = 76,
4847 .np = 2,
4848 .tap = { 32, 28 },
4849 .anp = 2,
4850 .atap = { 8, 12 }
4851 }, {
4852 .key = zeroed_string,
4853 .klen = 32,
4854 .result = "\x53\x0f\x8a\xfb\xc7\x45\x36\xb9"
4855 "\xa9\x63\xb4\xf1\xc4\xcb\x73\x8b",
4856 .rlen = 16,
4857 }
4858};
4859
4860static struct aead_testvec aes_gcm_dec_tv_template[] = {
4861 { /* From McGrew & Viega - http://citeseer.ist.psu.edu/656989.html */
4862 .key = zeroed_string,
4863 .klen = 32,
4864 .input = "\xce\xa7\x40\x3d\x4d\x60\x6b\x6e"
4865 "\x07\x4e\xc5\xd3\xba\xf3\x9d\x18"
4866 "\xd0\xd1\xc8\xa7\x99\x99\x6b\xf0"
4867 "\x26\x5b\x98\xb5\xd4\x8a\xb9\x19",
4868 .ilen = 32,
4869 .result = zeroed_string,
4870 .rlen = 16,
4871 }, {
4872 .key = "\xfe\xff\xe9\x92\x86\x65\x73\x1c"
4873 "\x6d\x6a\x8f\x94\x67\x30\x83\x08"
4874 "\xfe\xff\xe9\x92\x86\x65\x73\x1c"
4875 "\x6d\x6a\x8f\x94\x67\x30\x83\x08",
4876 .klen = 32,
4877 .iv = "\xca\xfe\xba\xbe\xfa\xce\xdb\xad"
4878 "\xde\xca\xf8\x88",
4879 .input = "\x52\x2d\xc1\xf0\x99\x56\x7d\x07"
4880 "\xf4\x7f\x37\xa3\x2a\x84\x42\x7d"
4881 "\x64\x3a\x8c\xdc\xbf\xe5\xc0\xc9"
4882 "\x75\x98\xa2\xbd\x25\x55\xd1\xaa"
4883 "\x8c\xb0\x8e\x48\x59\x0d\xbb\x3d"
4884 "\xa7\xb0\x8b\x10\x56\x82\x88\x38"
4885 "\xc5\xf6\x1e\x63\x93\xba\x7a\x0a"
4886 "\xbc\xc9\xf6\x62\x89\x80\x15\xad"
4887 "\xb0\x94\xda\xc5\xd9\x34\x71\xbd"
4888 "\xec\x1a\x50\x22\x70\xe3\xcc\x6c",
4889 .ilen = 80,
4890 .result = "\xd9\x31\x32\x25\xf8\x84\x06\xe5"
4891 "\xa5\x59\x09\xc5\xaf\xf5\x26\x9a"
4892 "\x86\xa7\xa9\x53\x15\x34\xf7\xda"
4893 "\x2e\x4c\x30\x3d\x8a\x31\x8a\x72"
4894 "\x1c\x3c\x0c\x95\x95\x68\x09\x53"
4895 "\x2f\xcf\x0e\x24\x49\xa6\xb5\x25"
4896 "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57"
4897 "\xba\x63\x7b\x39\x1a\xaf\xd2\x55",
4898 .rlen = 64,
4899 }, {
4900 .key = "\xfe\xff\xe9\x92\x86\x65\x73\x1c"
4901 "\x6d\x6a\x8f\x94\x67\x30\x83\x08"
4902 "\xfe\xff\xe9\x92\x86\x65\x73\x1c"
4903 "\x6d\x6a\x8f\x94\x67\x30\x83\x08",
4904 .klen = 32,
4905 .iv = "\xca\xfe\xba\xbe\xfa\xce\xdb\xad"
4906 "\xde\xca\xf8\x88",
4907 .input = "\x52\x2d\xc1\xf0\x99\x56\x7d\x07"
4908 "\xf4\x7f\x37\xa3\x2a\x84\x42\x7d"
4909 "\x64\x3a\x8c\xdc\xbf\xe5\xc0\xc9"
4910 "\x75\x98\xa2\xbd\x25\x55\xd1\xaa"
4911 "\x8c\xb0\x8e\x48\x59\x0d\xbb\x3d"
4912 "\xa7\xb0\x8b\x10\x56\x82\x88\x38"
4913 "\xc5\xf6\x1e\x63\x93\xba\x7a\x0a"
4914 "\xbc\xc9\xf6\x62"
4915 "\x76\xfc\x6e\xce\x0f\x4e\x17\x68"
4916 "\xcd\xdf\x88\x53\xbb\x2d\x55\x1b",
4917 .ilen = 76,
4918 .assoc = "\xfe\xed\xfa\xce\xde\xad\xbe\xef"
4919 "\xfe\xed\xfa\xce\xde\xad\xbe\xef"
4920 "\xab\xad\xda\xd2",
4921 .alen = 20,
4922 .result = "\xd9\x31\x32\x25\xf8\x84\x06\xe5"
4923 "\xa5\x59\x09\xc5\xaf\xf5\x26\x9a"
4924 "\x86\xa7\xa9\x53\x15\x34\xf7\xda"
4925 "\x2e\x4c\x30\x3d\x8a\x31\x8a\x72"
4926 "\x1c\x3c\x0c\x95\x95\x68\x09\x53"
4927 "\x2f\xcf\x0e\x24\x49\xa6\xb5\x25"
4928 "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57"
4929 "\xba\x63\x7b\x39",
4930 .rlen = 60,
4931 .np = 2,
4932 .tap = { 48, 28 },
4933 .anp = 3,
4934 .atap = { 8, 8, 4 }
4935 }, {
4936 .key = "\xfe\xff\xe9\x92\x86\x65\x73\x1c"
4937 "\x6d\x6a\x8f\x94\x67\x30\x83\x08",
4938 .klen = 16,
4939 .iv = "\xca\xfe\xba\xbe\xfa\xce\xdb\xad"
4940 "\xde\xca\xf8\x88",
4941 .input = "\x42\x83\x1e\xc2\x21\x77\x74\x24"
4942 "\x4b\x72\x21\xb7\x84\xd0\xd4\x9c"
4943 "\xe3\xaa\x21\x2f\x2c\x02\xa4\xe0"
4944 "\x35\xc1\x7e\x23\x29\xac\xa1\x2e"
4945 "\x21\xd5\x14\xb2\x54\x66\x93\x1c"
4946 "\x7d\x8f\x6a\x5a\xac\x84\xaa\x05"
4947 "\x1b\xa3\x0b\x39\x6a\x0a\xac\x97"
4948 "\x3d\x58\xe0\x91\x47\x3f\x59\x85"
4949 "\x4d\x5c\x2a\xf3\x27\xcd\x64\xa6"
4950 "\x2c\xf3\x5a\xbd\x2b\xa6\xfa\xb4",
4951 .ilen = 80,
4952 .result = "\xd9\x31\x32\x25\xf8\x84\x06\xe5"
4953 "\xa5\x59\x09\xc5\xaf\xf5\x26\x9a"
4954 "\x86\xa7\xa9\x53\x15\x34\xf7\xda"
4955 "\x2e\x4c\x30\x3d\x8a\x31\x8a\x72"
4956 "\x1c\x3c\x0c\x95\x95\x68\x09\x53"
4957 "\x2f\xcf\x0e\x24\x49\xa6\xb5\x25"
4958 "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57"
4959 "\xba\x63\x7b\x39\x1a\xaf\xd2\x55",
4960 .rlen = 64,
4961 }, {
4962 .key = "\xfe\xff\xe9\x92\x86\x65\x73\x1c"
4963 "\x6d\x6a\x8f\x94\x67\x30\x83\x08",
4964 .klen = 16,
4965 .iv = "\xca\xfe\xba\xbe\xfa\xce\xdb\xad"
4966 "\xde\xca\xf8\x88",
4967 .input = "\x42\x83\x1e\xc2\x21\x77\x74\x24"
4968 "\x4b\x72\x21\xb7\x84\xd0\xd4\x9c"
4969 "\xe3\xaa\x21\x2f\x2c\x02\xa4\xe0"
4970 "\x35\xc1\x7e\x23\x29\xac\xa1\x2e"
4971 "\x21\xd5\x14\xb2\x54\x66\x93\x1c"
4972 "\x7d\x8f\x6a\x5a\xac\x84\xaa\x05"
4973 "\x1b\xa3\x0b\x39\x6a\x0a\xac\x97"
4974 "\x3d\x58\xe0\x91"
4975 "\x5b\xc9\x4f\xbc\x32\x21\xa5\xdb"
4976 "\x94\xfa\xe9\x5a\xe7\x12\x1a\x47",
4977 .ilen = 76,
4978 .assoc = "\xfe\xed\xfa\xce\xde\xad\xbe\xef"
4979 "\xfe\xed\xfa\xce\xde\xad\xbe\xef"
4980 "\xab\xad\xda\xd2",
4981 .alen = 20,
4982 .result = "\xd9\x31\x32\x25\xf8\x84\x06\xe5"
4983 "\xa5\x59\x09\xc5\xaf\xf5\x26\x9a"
4984 "\x86\xa7\xa9\x53\x15\x34\xf7\xda"
4985 "\x2e\x4c\x30\x3d\x8a\x31\x8a\x72"
4986 "\x1c\x3c\x0c\x95\x95\x68\x09\x53"
4987 "\x2f\xcf\x0e\x24\x49\xa6\xb5\x25"
4988 "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57"
4989 "\xba\x63\x7b\x39",
4990 .rlen = 60,
4991 }, {
4992 .key = zeroed_string,
4993 .klen = 24,
4994 .input = "\x98\xe7\x24\x7c\x07\xf0\xfe\x41"
4995 "\x1c\x26\x7e\x43\x84\xb0\xf6\x00"
4996 "\x2f\xf5\x8d\x80\x03\x39\x27\xab"
4997 "\x8e\xf4\xd4\x58\x75\x14\xf0\xfb",
4998 .ilen = 32,
4999 .result = zeroed_string,
5000 .rlen = 16,
5001 }, {
5002 .key = "\xfe\xff\xe9\x92\x86\x65\x73\x1c"
5003 "\x6d\x6a\x8f\x94\x67\x30\x83\x08"
5004 "\xfe\xff\xe9\x92\x86\x65\x73\x1c",
5005 .klen = 24,
5006 .iv = "\xca\xfe\xba\xbe\xfa\xce\xdb\xad"
5007 "\xde\xca\xf8\x88",
5008 .input = "\x39\x80\xca\x0b\x3c\x00\xe8\x41"
5009 "\xeb\x06\xfa\xc4\x87\x2a\x27\x57"
5010 "\x85\x9e\x1c\xea\xa6\xef\xd9\x84"
5011 "\x62\x85\x93\xb4\x0c\xa1\xe1\x9c"
5012 "\x7d\x77\x3d\x00\xc1\x44\xc5\x25"
5013 "\xac\x61\x9d\x18\xc8\x4a\x3f\x47"
5014 "\x18\xe2\x44\x8b\x2f\xe3\x24\xd9"
5015 "\xcc\xda\x27\x10\xac\xad\xe2\x56"
5016 "\x99\x24\xa7\xc8\x58\x73\x36\xbf"
5017 "\xb1\x18\x02\x4d\xb8\x67\x4a\x14",
5018 .ilen = 80,
5019 .result = "\xd9\x31\x32\x25\xf8\x84\x06\xe5"
5020 "\xa5\x59\x09\xc5\xaf\xf5\x26\x9a"
5021 "\x86\xa7\xa9\x53\x15\x34\xf7\xda"
5022 "\x2e\x4c\x30\x3d\x8a\x31\x8a\x72"
5023 "\x1c\x3c\x0c\x95\x95\x68\x09\x53"
5024 "\x2f\xcf\x0e\x24\x49\xa6\xb5\x25"
5025 "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57"
5026 "\xba\x63\x7b\x39\x1a\xaf\xd2\x55",
5027 .rlen = 64,
5028 }, {
5029 .key = "\xfe\xff\xe9\x92\x86\x65\x73\x1c"
5030 "\x6d\x6a\x8f\x94\x67\x30\x83\x08"
5031 "\xfe\xff\xe9\x92\x86\x65\x73\x1c",
5032 .klen = 24,
5033 .iv = "\xca\xfe\xba\xbe\xfa\xce\xdb\xad"
5034 "\xde\xca\xf8\x88",
5035 .input = "\x39\x80\xca\x0b\x3c\x00\xe8\x41"
5036 "\xeb\x06\xfa\xc4\x87\x2a\x27\x57"
5037 "\x85\x9e\x1c\xea\xa6\xef\xd9\x84"
5038 "\x62\x85\x93\xb4\x0c\xa1\xe1\x9c"
5039 "\x7d\x77\x3d\x00\xc1\x44\xc5\x25"
5040 "\xac\x61\x9d\x18\xc8\x4a\x3f\x47"
5041 "\x18\xe2\x44\x8b\x2f\xe3\x24\xd9"
5042 "\xcc\xda\x27\x10"
5043 "\x25\x19\x49\x8e\x80\xf1\x47\x8f"
5044 "\x37\xba\x55\xbd\x6d\x27\x61\x8c",
5045 .ilen = 76,
5046 .assoc = "\xfe\xed\xfa\xce\xde\xad\xbe\xef"
5047 "\xfe\xed\xfa\xce\xde\xad\xbe\xef"
5048 "\xab\xad\xda\xd2",
5049 .alen = 20,
5050 .result = "\xd9\x31\x32\x25\xf8\x84\x06\xe5"
5051 "\xa5\x59\x09\xc5\xaf\xf5\x26\x9a"
5052 "\x86\xa7\xa9\x53\x15\x34\xf7\xda"
5053 "\x2e\x4c\x30\x3d\x8a\x31\x8a\x72"
5054 "\x1c\x3c\x0c\x95\x95\x68\x09\x53"
5055 "\x2f\xcf\x0e\x24\x49\xa6\xb5\x25"
5056 "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57"
5057 "\xba\x63\x7b\x39",
5058 .rlen = 60,
5059 }
5060};
5061
5062static struct aead_testvec aes_ccm_enc_tv_template[] = {
5063 { /* From RFC 3610 */
5064 .key = "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
5065 "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf",
5066 .klen = 16,
5067 .iv = "\x01\x00\x00\x00\x03\x02\x01\x00"
5068 "\xa0\xa1\xa2\xa3\xa4\xa5\x00\x00",
5069 .assoc = "\x00\x01\x02\x03\x04\x05\x06\x07",
5070 .alen = 8,
5071 .input = "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
5072 "\x10\x11\x12\x13\x14\x15\x16\x17"
5073 "\x18\x19\x1a\x1b\x1c\x1d\x1e",
5074 .ilen = 23,
5075 .result = "\x58\x8c\x97\x9a\x61\xc6\x63\xd2"
5076 "\xf0\x66\xd0\xc2\xc0\xf9\x89\x80"
5077 "\x6d\x5f\x6b\x61\xda\xc3\x84\x17"
5078 "\xe8\xd1\x2c\xfd\xf9\x26\xe0",
5079 .rlen = 31,
5080 }, {
5081 .key = "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
5082 "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf",
5083 .klen = 16,
5084 .iv = "\x01\x00\x00\x00\x07\x06\x05\x04"
5085 "\xa0\xa1\xa2\xa3\xa4\xa5\x00\x00",
5086 .assoc = "\x00\x01\x02\x03\x04\x05\x06\x07"
5087 "\x08\x09\x0a\x0b",
5088 .alen = 12,
5089 .input = "\x0c\x0d\x0e\x0f\x10\x11\x12\x13"
5090 "\x14\x15\x16\x17\x18\x19\x1a\x1b"
5091 "\x1c\x1d\x1e\x1f",
5092 .ilen = 20,
5093 .result = "\xdc\xf1\xfb\x7b\x5d\x9e\x23\xfb"
5094 "\x9d\x4e\x13\x12\x53\x65\x8a\xd8"
5095 "\x6e\xbd\xca\x3e\x51\xe8\x3f\x07"
5096 "\x7d\x9c\x2d\x93",
5097 .rlen = 28,
5098 }, {
5099 .key = "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
5100 "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf",
5101 .klen = 16,
5102 .iv = "\x01\x00\x00\x00\x0b\x0a\x09\x08"
5103 "\xa0\xa1\xa2\xa3\xa4\xa5\x00\x00",
5104 .assoc = "\x00\x01\x02\x03\x04\x05\x06\x07",
5105 .alen = 8,
5106 .input = "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
5107 "\x10\x11\x12\x13\x14\x15\x16\x17"
5108 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
5109 "\x20",
5110 .ilen = 25,
5111 .result = "\x82\x53\x1a\x60\xcc\x24\x94\x5a"
5112 "\x4b\x82\x79\x18\x1a\xb5\xc8\x4d"
5113 "\xf2\x1c\xe7\xf9\xb7\x3f\x42\xe1"
5114 "\x97\xea\x9c\x07\xe5\x6b\x5e\xb1"
5115 "\x7e\x5f\x4e",
5116 .rlen = 35,
5117 }, {
5118 .key = "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
5119 "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf",
5120 .klen = 16,
5121 .iv = "\x01\x00\x00\x00\x0c\x0b\x0a\x09"
5122 "\xa0\xa1\xa2\xa3\xa4\xa5\x00\x00",
5123 .assoc = "\x00\x01\x02\x03\x04\x05\x06\x07"
5124 "\x08\x09\x0a\x0b",
5125 .alen = 12,
5126 .input = "\x0c\x0d\x0e\x0f\x10\x11\x12\x13"
5127 "\x14\x15\x16\x17\x18\x19\x1a\x1b"
5128 "\x1c\x1d\x1e",
5129 .ilen = 19,
5130 .result = "\x07\x34\x25\x94\x15\x77\x85\x15"
5131 "\x2b\x07\x40\x98\x33\x0a\xbb\x14"
5132 "\x1b\x94\x7b\x56\x6a\xa9\x40\x6b"
5133 "\x4d\x99\x99\x88\xdd",
5134 .rlen = 29,
5135 }, {
5136 .key = "\xd7\x82\x8d\x13\xb2\xb0\xbd\xc3"
5137 "\x25\xa7\x62\x36\xdf\x93\xcc\x6b",
5138 .klen = 16,
5139 .iv = "\x01\x00\x33\x56\x8e\xf7\xb2\x63"
5140 "\x3c\x96\x96\x76\x6c\xfa\x00\x00",
5141 .assoc = "\x63\x01\x8f\x76\xdc\x8a\x1b\xcb",
5142 .alen = 8,
5143 .input = "\x90\x20\xea\x6f\x91\xbd\xd8\x5a"
5144 "\xfa\x00\x39\xba\x4b\xaf\xf9\xbf"
5145 "\xb7\x9c\x70\x28\x94\x9c\xd0\xec",
5146 .ilen = 24,
5147 .result = "\x4c\xcb\x1e\x7c\xa9\x81\xbe\xfa"
5148 "\xa0\x72\x6c\x55\xd3\x78\x06\x12"
5149 "\x98\xc8\x5c\x92\x81\x4a\xbc\x33"
5150 "\xc5\x2e\xe8\x1d\x7d\x77\xc0\x8a",
5151 .rlen = 32,
5152 }, {
5153 .key = "\xd7\x82\x8d\x13\xb2\xb0\xbd\xc3"
5154 "\x25\xa7\x62\x36\xdf\x93\xcc\x6b",
5155 .klen = 16,
5156 .iv = "\x01\x00\xd5\x60\x91\x2d\x3f\x70"
5157 "\x3c\x96\x96\x76\x6c\xfa\x00\x00",
5158 .assoc = "\xcd\x90\x44\xd2\xb7\x1f\xdb\x81"
5159 "\x20\xea\x60\xc0",
5160 .alen = 12,
5161 .input = "\x64\x35\xac\xba\xfb\x11\xa8\x2e"
5162 "\x2f\x07\x1d\x7c\xa4\xa5\xeb\xd9"
5163 "\x3a\x80\x3b\xa8\x7f",
5164 .ilen = 21,
5165 .result = "\x00\x97\x69\xec\xab\xdf\x48\x62"
5166 "\x55\x94\xc5\x92\x51\xe6\x03\x57"
5167 "\x22\x67\x5e\x04\xc8\x47\x09\x9e"
5168 "\x5a\xe0\x70\x45\x51",
5169 .rlen = 29,
5170 }, {
5171 .key = "\xd7\x82\x8d\x13\xb2\xb0\xbd\xc3"
5172 "\x25\xa7\x62\x36\xdf\x93\xcc\x6b",
5173 .klen = 16,
5174 .iv = "\x01\x00\x42\xff\xf8\xf1\x95\x1c"
5175 "\x3c\x96\x96\x76\x6c\xfa\x00\x00",
5176 .assoc = "\xd8\x5b\xc7\xe6\x9f\x94\x4f\xb8",
5177 .alen = 8,
5178 .input = "\x8a\x19\xb9\x50\xbc\xf7\x1a\x01"
5179 "\x8e\x5e\x67\x01\xc9\x17\x87\x65"
5180 "\x98\x09\xd6\x7d\xbe\xdd\x18",
5181 .ilen = 23,
5182 .result = "\xbc\x21\x8d\xaa\x94\x74\x27\xb6"
5183 "\xdb\x38\x6a\x99\xac\x1a\xef\x23"
5184 "\xad\xe0\xb5\x29\x39\xcb\x6a\x63"
5185 "\x7c\xf9\xbe\xc2\x40\x88\x97\xc6"
5186 "\xba",
5187 .rlen = 33,
5188 },
5189};
5190
5191static struct aead_testvec aes_ccm_dec_tv_template[] = {
5192 { /* From RFC 3610 */
5193 .key = "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
5194 "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf",
5195 .klen = 16,
5196 .iv = "\x01\x00\x00\x00\x03\x02\x01\x00"
5197 "\xa0\xa1\xa2\xa3\xa4\xa5\x00\x00",
5198 .assoc = "\x00\x01\x02\x03\x04\x05\x06\x07",
5199 .alen = 8,
5200 .input = "\x58\x8c\x97\x9a\x61\xc6\x63\xd2"
5201 "\xf0\x66\xd0\xc2\xc0\xf9\x89\x80"
5202 "\x6d\x5f\x6b\x61\xda\xc3\x84\x17"
5203 "\xe8\xd1\x2c\xfd\xf9\x26\xe0",
5204 .ilen = 31,
5205 .result = "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
5206 "\x10\x11\x12\x13\x14\x15\x16\x17"
5207 "\x18\x19\x1a\x1b\x1c\x1d\x1e",
5208 .rlen = 23,
5209 }, {
5210 .key = "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
5211 "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf",
5212 .klen = 16,
5213 .iv = "\x01\x00\x00\x00\x07\x06\x05\x04"
5214 "\xa0\xa1\xa2\xa3\xa4\xa5\x00\x00",
5215 .assoc = "\x00\x01\x02\x03\x04\x05\x06\x07"
5216 "\x08\x09\x0a\x0b",
5217 .alen = 12,
5218 .input = "\xdc\xf1\xfb\x7b\x5d\x9e\x23\xfb"
5219 "\x9d\x4e\x13\x12\x53\x65\x8a\xd8"
5220 "\x6e\xbd\xca\x3e\x51\xe8\x3f\x07"
5221 "\x7d\x9c\x2d\x93",
5222 .ilen = 28,
5223 .result = "\x0c\x0d\x0e\x0f\x10\x11\x12\x13"
5224 "\x14\x15\x16\x17\x18\x19\x1a\x1b"
5225 "\x1c\x1d\x1e\x1f",
5226 .rlen = 20,
5227 }, {
5228 .key = "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
5229 "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf",
5230 .klen = 16,
5231 .iv = "\x01\x00\x00\x00\x0b\x0a\x09\x08"
5232 "\xa0\xa1\xa2\xa3\xa4\xa5\x00\x00",
5233 .assoc = "\x00\x01\x02\x03\x04\x05\x06\x07",
5234 .alen = 8,
5235 .input = "\x82\x53\x1a\x60\xcc\x24\x94\x5a"
5236 "\x4b\x82\x79\x18\x1a\xb5\xc8\x4d"
5237 "\xf2\x1c\xe7\xf9\xb7\x3f\x42\xe1"
5238 "\x97\xea\x9c\x07\xe5\x6b\x5e\xb1"
5239 "\x7e\x5f\x4e",
5240 .ilen = 35,
5241 .result = "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
5242 "\x10\x11\x12\x13\x14\x15\x16\x17"
5243 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
5244 "\x20",
5245 .rlen = 25,
5246 }, {
5247 .key = "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
5248 "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf",
5249 .klen = 16,
5250 .iv = "\x01\x00\x00\x00\x0c\x0b\x0a\x09"
5251 "\xa0\xa1\xa2\xa3\xa4\xa5\x00\x00",
5252 .assoc = "\x00\x01\x02\x03\x04\x05\x06\x07"
5253 "\x08\x09\x0a\x0b",
5254 .alen = 12,
5255 .input = "\x07\x34\x25\x94\x15\x77\x85\x15"
5256 "\x2b\x07\x40\x98\x33\x0a\xbb\x14"
5257 "\x1b\x94\x7b\x56\x6a\xa9\x40\x6b"
5258 "\x4d\x99\x99\x88\xdd",
5259 .ilen = 29,
5260 .result = "\x0c\x0d\x0e\x0f\x10\x11\x12\x13"
5261 "\x14\x15\x16\x17\x18\x19\x1a\x1b"
5262 "\x1c\x1d\x1e",
5263 .rlen = 19,
5264 }, {
5265 .key = "\xd7\x82\x8d\x13\xb2\xb0\xbd\xc3"
5266 "\x25\xa7\x62\x36\xdf\x93\xcc\x6b",
5267 .klen = 16,
5268 .iv = "\x01\x00\x33\x56\x8e\xf7\xb2\x63"
5269 "\x3c\x96\x96\x76\x6c\xfa\x00\x00",
5270 .assoc = "\x63\x01\x8f\x76\xdc\x8a\x1b\xcb",
5271 .alen = 8,
5272 .input = "\x4c\xcb\x1e\x7c\xa9\x81\xbe\xfa"
5273 "\xa0\x72\x6c\x55\xd3\x78\x06\x12"
5274 "\x98\xc8\x5c\x92\x81\x4a\xbc\x33"
5275 "\xc5\x2e\xe8\x1d\x7d\x77\xc0\x8a",
5276 .ilen = 32,
5277 .result = "\x90\x20\xea\x6f\x91\xbd\xd8\x5a"
5278 "\xfa\x00\x39\xba\x4b\xaf\xf9\xbf"
5279 "\xb7\x9c\x70\x28\x94\x9c\xd0\xec",
5280 .rlen = 24,
5281 }, {
5282 .key = "\xd7\x82\x8d\x13\xb2\xb0\xbd\xc3"
5283 "\x25\xa7\x62\x36\xdf\x93\xcc\x6b",
5284 .klen = 16,
5285 .iv = "\x01\x00\xd5\x60\x91\x2d\x3f\x70"
5286 "\x3c\x96\x96\x76\x6c\xfa\x00\x00",
5287 .assoc = "\xcd\x90\x44\xd2\xb7\x1f\xdb\x81"
5288 "\x20\xea\x60\xc0",
5289 .alen = 12,
5290 .input = "\x00\x97\x69\xec\xab\xdf\x48\x62"
5291 "\x55\x94\xc5\x92\x51\xe6\x03\x57"
5292 "\x22\x67\x5e\x04\xc8\x47\x09\x9e"
5293 "\x5a\xe0\x70\x45\x51",
5294 .ilen = 29,
5295 .result = "\x64\x35\xac\xba\xfb\x11\xa8\x2e"
5296 "\x2f\x07\x1d\x7c\xa4\xa5\xeb\xd9"
5297 "\x3a\x80\x3b\xa8\x7f",
5298 .rlen = 21,
5299 }, {
5300 .key = "\xd7\x82\x8d\x13\xb2\xb0\xbd\xc3"
5301 "\x25\xa7\x62\x36\xdf\x93\xcc\x6b",
5302 .klen = 16,
5303 .iv = "\x01\x00\x42\xff\xf8\xf1\x95\x1c"
5304 "\x3c\x96\x96\x76\x6c\xfa\x00\x00",
5305 .assoc = "\xd8\x5b\xc7\xe6\x9f\x94\x4f\xb8",
5306 .alen = 8,
5307 .input = "\xbc\x21\x8d\xaa\x94\x74\x27\xb6"
5308 "\xdb\x38\x6a\x99\xac\x1a\xef\x23"
5309 "\xad\xe0\xb5\x29\x39\xcb\x6a\x63"
5310 "\x7c\xf9\xbe\xc2\x40\x88\x97\xc6"
5311 "\xba",
5312 .ilen = 33,
5313 .result = "\x8a\x19\xb9\x50\xbc\xf7\x1a\x01"
5314 "\x8e\x5e\x67\x01\xc9\x17\x87\x65"
5315 "\x98\x09\xd6\x7d\xbe\xdd\x18",
5316 .rlen = 23,
5317 },
5318};
5319
5320/* Cast5 test vectors from RFC 2144 */
5321#define CAST5_ENC_TEST_VECTORS 3
5322#define CAST5_DEC_TEST_VECTORS 3
5323
5324static struct cipher_testvec cast5_enc_tv_template[] = {
5325 {
5326 .key = "\x01\x23\x45\x67\x12\x34\x56\x78"
5327 "\x23\x45\x67\x89\x34\x56\x78\x9a",
5328 .klen = 16,
5329 .input = "\x01\x23\x45\x67\x89\xab\xcd\xef",
5330 .ilen = 8,
5331 .result = "\x23\x8b\x4f\xe5\x84\x7e\x44\xb2",
5332 .rlen = 8,
5333 }, {
5334 .key = "\x01\x23\x45\x67\x12\x34\x56\x78"
5335 "\x23\x45",
5336 .klen = 10,
5337 .input = "\x01\x23\x45\x67\x89\xab\xcd\xef",
5338 .ilen = 8,
5339 .result = "\xeb\x6a\x71\x1a\x2c\x02\x27\x1b",
5340 .rlen = 8,
5341 }, {
5342 .key = "\x01\x23\x45\x67\x12",
5343 .klen = 5,
5344 .input = "\x01\x23\x45\x67\x89\xab\xcd\xef",
5345 .ilen = 8,
5346 .result = "\x7a\xc8\x16\xd1\x6e\x9b\x30\x2e",
5347 .rlen = 8,
5348 },
5349};
5350
5351static struct cipher_testvec cast5_dec_tv_template[] = {
5352 {
5353 .key = "\x01\x23\x45\x67\x12\x34\x56\x78"
5354 "\x23\x45\x67\x89\x34\x56\x78\x9a",
5355 .klen = 16,
5356 .input = "\x23\x8b\x4f\xe5\x84\x7e\x44\xb2",
5357 .ilen = 8,
5358 .result = "\x01\x23\x45\x67\x89\xab\xcd\xef",
5359 .rlen = 8,
5360 }, {
5361 .key = "\x01\x23\x45\x67\x12\x34\x56\x78"
5362 "\x23\x45",
5363 .klen = 10,
5364 .input = "\xeb\x6a\x71\x1a\x2c\x02\x27\x1b",
5365 .ilen = 8,
5366 .result = "\x01\x23\x45\x67\x89\xab\xcd\xef",
5367 .rlen = 8,
5368 }, {
5369 .key = "\x01\x23\x45\x67\x12",
5370 .klen = 5,
5371 .input = "\x7a\xc8\x16\xd1\x6e\x9b\x30\x2e",
5372 .ilen = 8,
5373 .result = "\x01\x23\x45\x67\x89\xab\xcd\xef",
5374 .rlen = 8,
5375 },
5376};
5377
5378/*
5379 * ARC4 test vectors from OpenSSL
5380 */
5381#define ARC4_ENC_TEST_VECTORS 7
5382#define ARC4_DEC_TEST_VECTORS 7
5383
5384static struct cipher_testvec arc4_enc_tv_template[] = {
5385 {
5386 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
5387 .klen = 8,
5388 .input = "\x01\x23\x45\x67\x89\xab\xcd\xef",
5389 .ilen = 8,
5390 .result = "\x75\xb7\x87\x80\x99\xe0\xc5\x96",
5391 .rlen = 8,
5392 }, {
5393 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
5394 .klen = 8,
5395 .input = "\x00\x00\x00\x00\x00\x00\x00\x00",
5396 .ilen = 8,
5397 .result = "\x74\x94\xc2\xe7\x10\x4b\x08\x79",
5398 .rlen = 8,
5399 }, {
5400 .key = "\x00\x00\x00\x00\x00\x00\x00\x00",
5401 .klen = 8,
5402 .input = "\x00\x00\x00\x00\x00\x00\x00\x00",
5403 .ilen = 8,
5404 .result = "\xde\x18\x89\x41\xa3\x37\x5d\x3a",
5405 .rlen = 8,
5406 }, {
5407 .key = "\xef\x01\x23\x45",
5408 .klen = 4,
5409 .input = "\x00\x00\x00\x00\x00\x00\x00\x00"
5410 "\x00\x00\x00\x00\x00\x00\x00\x00"
5411 "\x00\x00\x00\x00",
5412 .ilen = 20,
5413 .result = "\xd6\xa1\x41\xa7\xec\x3c\x38\xdf"
5414 "\xbd\x61\x5a\x11\x62\xe1\xc7\xba"
5415 "\x36\xb6\x78\x58",
5416 .rlen = 20,
5417 }, {
5418 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
5419 .klen = 8,
5420 .input = "\x12\x34\x56\x78\x9A\xBC\xDE\xF0"
5421 "\x12\x34\x56\x78\x9A\xBC\xDE\xF0"
5422 "\x12\x34\x56\x78\x9A\xBC\xDE\xF0"
5423 "\x12\x34\x56\x78",
5424 .ilen = 28,
5425 .result = "\x66\xa0\x94\x9f\x8a\xf7\xd6\x89"
5426 "\x1f\x7f\x83\x2b\xa8\x33\xc0\x0c"
5427 "\x89\x2e\xbe\x30\x14\x3c\xe2\x87"
5428 "\x40\x01\x1e\xcf",
5429 .rlen = 28,
5430 }, {
5431 .key = "\xef\x01\x23\x45",
5432 .klen = 4,
5433 .input = "\x00\x00\x00\x00\x00\x00\x00\x00"
5434 "\x00\x00",
5435 .ilen = 10,
5436 .result = "\xd6\xa1\x41\xa7\xec\x3c\x38\xdf"
5437 "\xbd\x61",
5438 .rlen = 10,
5439 }, {
5440 .key = "\x01\x23\x45\x67\x89\xAB\xCD\xEF"
5441 "\x00\x00\x00\x00\x00\x00\x00\x00",
5442 .klen = 16,
5443 .input = "\x01\x23\x45\x67\x89\xAB\xCD\xEF",
5444 .ilen = 8,
5445 .result = "\x69\x72\x36\x59\x1B\x52\x42\xB1",
5446 .rlen = 8,
5447 },
5448};
5449
5450static struct cipher_testvec arc4_dec_tv_template[] = {
5451 {
5452 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
5453 .klen = 8,
5454 .input = "\x75\xb7\x87\x80\x99\xe0\xc5\x96",
5455 .ilen = 8,
5456 .result = "\x01\x23\x45\x67\x89\xab\xcd\xef",
5457 .rlen = 8,
5458 }, {
5459 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
5460 .klen = 8,
5461 .input = "\x74\x94\xc2\xe7\x10\x4b\x08\x79",
5462 .ilen = 8,
5463 .result = "\x00\x00\x00\x00\x00\x00\x00\x00",
5464 .rlen = 8,
5465 }, {
5466 .key = "\x00\x00\x00\x00\x00\x00\x00\x00",
5467 .klen = 8,
5468 .input = "\xde\x18\x89\x41\xa3\x37\x5d\x3a",
5469 .ilen = 8,
5470 .result = "\x00\x00\x00\x00\x00\x00\x00\x00",
5471 .rlen = 8,
5472 }, {
5473 .key = "\xef\x01\x23\x45",
5474 .klen = 4,
5475 .input = "\xd6\xa1\x41\xa7\xec\x3c\x38\xdf"
5476 "\xbd\x61\x5a\x11\x62\xe1\xc7\xba"
5477 "\x36\xb6\x78\x58",
5478 .ilen = 20,
5479 .result = "\x00\x00\x00\x00\x00\x00\x00\x00"
5480 "\x00\x00\x00\x00\x00\x00\x00\x00"
5481 "\x00\x00\x00\x00",
5482 .rlen = 20,
5483 }, {
5484 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
5485 .klen = 8,
5486 .input = "\x66\xa0\x94\x9f\x8a\xf7\xd6\x89"
5487 "\x1f\x7f\x83\x2b\xa8\x33\xc0\x0c"
5488 "\x89\x2e\xbe\x30\x14\x3c\xe2\x87"
5489 "\x40\x01\x1e\xcf",
5490 .ilen = 28,
5491 .result = "\x12\x34\x56\x78\x9A\xBC\xDE\xF0"
5492 "\x12\x34\x56\x78\x9A\xBC\xDE\xF0"
5493 "\x12\x34\x56\x78\x9A\xBC\xDE\xF0"
5494 "\x12\x34\x56\x78",
5495 .rlen = 28,
5496 }, {
5497 .key = "\xef\x01\x23\x45",
5498 .klen = 4,
5499 .input = "\xd6\xa1\x41\xa7\xec\x3c\x38\xdf"
5500 "\xbd\x61",
5501 .ilen = 10,
5502 .result = "\x00\x00\x00\x00\x00\x00\x00\x00"
5503 "\x00\x00",
5504 .rlen = 10,
5505 }, {
5506 .key = "\x01\x23\x45\x67\x89\xAB\xCD\xEF"
5507 "\x00\x00\x00\x00\x00\x00\x00\x00",
5508 .klen = 16,
5509 .input = "\x69\x72\x36\x59\x1B\x52\x42\xB1",
5510 .ilen = 8,
5511 .result = "\x01\x23\x45\x67\x89\xAB\xCD\xEF",
5512 .rlen = 8,
5513 },
5514};
5515
5516/*
5517 * TEA test vectors
5518 */
5519#define TEA_ENC_TEST_VECTORS 4
5520#define TEA_DEC_TEST_VECTORS 4
5521
5522static struct cipher_testvec tea_enc_tv_template[] = {
5523 {
5524 .key = zeroed_string,
5525 .klen = 16,
5526 .input = zeroed_string,
5527 .ilen = 8,
5528 .result = "\x0a\x3a\xea\x41\x40\xa9\xba\x94",
5529 .rlen = 8,
5530 }, {
5531 .key = "\x2b\x02\x05\x68\x06\x14\x49\x76"
5532 "\x77\x5d\x0e\x26\x6c\x28\x78\x43",
5533 .klen = 16,
5534 .input = "\x74\x65\x73\x74\x20\x6d\x65\x2e",
5535 .ilen = 8,
5536 .result = "\x77\x5d\x2a\x6a\xf6\xce\x92\x09",
5537 .rlen = 8,
5538 }, {
5539 .key = "\x09\x65\x43\x11\x66\x44\x39\x25"
5540 "\x51\x3a\x16\x10\x0a\x08\x12\x6e",
5541 .klen = 16,
5542 .input = "\x6c\x6f\x6e\x67\x65\x72\x5f\x74"
5543 "\x65\x73\x74\x5f\x76\x65\x63\x74",
5544 .ilen = 16,
5545 .result = "\xbe\x7a\xbb\x81\x95\x2d\x1f\x1e"
5546 "\xdd\x89\xa1\x25\x04\x21\xdf\x95",
5547 .rlen = 16,
5548 }, {
5549 .key = "\x4d\x76\x32\x17\x05\x3f\x75\x2c"
5550 "\x5d\x04\x16\x36\x15\x72\x63\x2f",
5551 .klen = 16,
5552 .input = "\x54\x65\x61\x20\x69\x73\x20\x67"
5553 "\x6f\x6f\x64\x20\x66\x6f\x72\x20"
5554 "\x79\x6f\x75\x21\x21\x21\x20\x72"
5555 "\x65\x61\x6c\x6c\x79\x21\x21\x21",
5556 .ilen = 32,
5557 .result = "\xe0\x4d\x5d\x3c\xb7\x8c\x36\x47"
5558 "\x94\x18\x95\x91\xa9\xfc\x49\xf8"
5559 "\x44\xd1\x2d\xc2\x99\xb8\x08\x2a"
5560 "\x07\x89\x73\xc2\x45\x92\xc6\x90",
5561 .rlen = 32,
5562 }
5563};
5564
5565static struct cipher_testvec tea_dec_tv_template[] = {
5566 {
5567 .key = zeroed_string,
5568 .klen = 16,
5569 .input = "\x0a\x3a\xea\x41\x40\xa9\xba\x94",
5570 .ilen = 8,
5571 .result = zeroed_string,
5572 .rlen = 8,
5573 }, {
5574 .key = "\x2b\x02\x05\x68\x06\x14\x49\x76"
5575 "\x77\x5d\x0e\x26\x6c\x28\x78\x43",
5576 .klen = 16,
5577 .input = "\x77\x5d\x2a\x6a\xf6\xce\x92\x09",
5578 .ilen = 8,
5579 .result = "\x74\x65\x73\x74\x20\x6d\x65\x2e",
5580 .rlen = 8,
5581 }, {
5582 .key = "\x09\x65\x43\x11\x66\x44\x39\x25"
5583 "\x51\x3a\x16\x10\x0a\x08\x12\x6e",
5584 .klen = 16,
5585 .input = "\xbe\x7a\xbb\x81\x95\x2d\x1f\x1e"
5586 "\xdd\x89\xa1\x25\x04\x21\xdf\x95",
5587 .ilen = 16,
5588 .result = "\x6c\x6f\x6e\x67\x65\x72\x5f\x74"
5589 "\x65\x73\x74\x5f\x76\x65\x63\x74",
5590 .rlen = 16,
5591 }, {
5592 .key = "\x4d\x76\x32\x17\x05\x3f\x75\x2c"
5593 "\x5d\x04\x16\x36\x15\x72\x63\x2f",
5594 .klen = 16,
5595 .input = "\xe0\x4d\x5d\x3c\xb7\x8c\x36\x47"
5596 "\x94\x18\x95\x91\xa9\xfc\x49\xf8"
5597 "\x44\xd1\x2d\xc2\x99\xb8\x08\x2a"
5598 "\x07\x89\x73\xc2\x45\x92\xc6\x90",
5599 .ilen = 32,
5600 .result = "\x54\x65\x61\x20\x69\x73\x20\x67"
5601 "\x6f\x6f\x64\x20\x66\x6f\x72\x20"
5602 "\x79\x6f\x75\x21\x21\x21\x20\x72"
5603 "\x65\x61\x6c\x6c\x79\x21\x21\x21",
5604 .rlen = 32,
5605 }
5606};
5607
5608/*
5609 * XTEA test vectors
5610 */
5611#define XTEA_ENC_TEST_VECTORS 4
5612#define XTEA_DEC_TEST_VECTORS 4
5613
5614static struct cipher_testvec xtea_enc_tv_template[] = {
5615 {
5616 .key = zeroed_string,
5617 .klen = 16,
5618 .input = zeroed_string,
5619 .ilen = 8,
5620 .result = "\xd8\xd4\xe9\xde\xd9\x1e\x13\xf7",
5621 .rlen = 8,
5622 }, {
5623 .key = "\x2b\x02\x05\x68\x06\x14\x49\x76"
5624 "\x77\x5d\x0e\x26\x6c\x28\x78\x43",
5625 .klen = 16,
5626 .input = "\x74\x65\x73\x74\x20\x6d\x65\x2e",
5627 .ilen = 8,
5628 .result = "\x94\xeb\xc8\x96\x84\x6a\x49\xa8",
5629 .rlen = 8,
5630 }, {
5631 .key = "\x09\x65\x43\x11\x66\x44\x39\x25"
5632 "\x51\x3a\x16\x10\x0a\x08\x12\x6e",
5633 .klen = 16,
5634 .input = "\x6c\x6f\x6e\x67\x65\x72\x5f\x74"
5635 "\x65\x73\x74\x5f\x76\x65\x63\x74",
5636 .ilen = 16,
5637 .result = "\x3e\xce\xae\x22\x60\x56\xa8\x9d"
5638 "\x77\x4d\xd4\xb4\x87\x24\xe3\x9a",
5639 .rlen = 16,
5640 }, {
5641 .key = "\x4d\x76\x32\x17\x05\x3f\x75\x2c"
5642 "\x5d\x04\x16\x36\x15\x72\x63\x2f",
5643 .klen = 16,
5644 .input = "\x54\x65\x61\x20\x69\x73\x20\x67"
5645 "\x6f\x6f\x64\x20\x66\x6f\x72\x20"
5646 "\x79\x6f\x75\x21\x21\x21\x20\x72"
5647 "\x65\x61\x6c\x6c\x79\x21\x21\x21",
5648 .ilen = 32,
5649 .result = "\x99\x81\x9f\x5d\x6f\x4b\x31\x3a"
5650 "\x86\xff\x6f\xd0\xe3\x87\x70\x07"
5651 "\x4d\xb8\xcf\xf3\x99\x50\xb3\xd4"
5652 "\x73\xa2\xfa\xc9\x16\x59\x5d\x81",
5653 .rlen = 32,
5654 }
5655};
5656
5657static struct cipher_testvec xtea_dec_tv_template[] = {
5658 {
5659 .key = zeroed_string,
5660 .klen = 16,
5661 .input = "\xd8\xd4\xe9\xde\xd9\x1e\x13\xf7",
5662 .ilen = 8,
5663 .result = zeroed_string,
5664 .rlen = 8,
5665 }, {
5666 .key = "\x2b\x02\x05\x68\x06\x14\x49\x76"
5667 "\x77\x5d\x0e\x26\x6c\x28\x78\x43",
5668 .klen = 16,
5669 .input = "\x94\xeb\xc8\x96\x84\x6a\x49\xa8",
5670 .ilen = 8,
5671 .result = "\x74\x65\x73\x74\x20\x6d\x65\x2e",
5672 .rlen = 8,
5673 }, {
5674 .key = "\x09\x65\x43\x11\x66\x44\x39\x25"
5675 "\x51\x3a\x16\x10\x0a\x08\x12\x6e",
5676 .klen = 16,
5677 .input = "\x3e\xce\xae\x22\x60\x56\xa8\x9d"
5678 "\x77\x4d\xd4\xb4\x87\x24\xe3\x9a",
5679 .ilen = 16,
5680 .result = "\x6c\x6f\x6e\x67\x65\x72\x5f\x74"
5681 "\x65\x73\x74\x5f\x76\x65\x63\x74",
5682 .rlen = 16,
5683 }, {
5684 .key = "\x4d\x76\x32\x17\x05\x3f\x75\x2c"
5685 "\x5d\x04\x16\x36\x15\x72\x63\x2f",
5686 .klen = 16,
5687 .input = "\x99\x81\x9f\x5d\x6f\x4b\x31\x3a"
5688 "\x86\xff\x6f\xd0\xe3\x87\x70\x07"
5689 "\x4d\xb8\xcf\xf3\x99\x50\xb3\xd4"
5690 "\x73\xa2\xfa\xc9\x16\x59\x5d\x81",
5691 .ilen = 32,
5692 .result = "\x54\x65\x61\x20\x69\x73\x20\x67"
5693 "\x6f\x6f\x64\x20\x66\x6f\x72\x20"
5694 "\x79\x6f\x75\x21\x21\x21\x20\x72"
5695 "\x65\x61\x6c\x6c\x79\x21\x21\x21",
5696 .rlen = 32,
5697 }
5698};
5699
5700/*
5701 * KHAZAD test vectors.
5702 */
5703#define KHAZAD_ENC_TEST_VECTORS 5
5704#define KHAZAD_DEC_TEST_VECTORS 5
5705
5706static struct cipher_testvec khazad_enc_tv_template[] = {
5707 {
5708 .key = "\x80\x00\x00\x00\x00\x00\x00\x00"
5709 "\x00\x00\x00\x00\x00\x00\x00\x00",
5710 .klen = 16,
5711 .input = "\x00\x00\x00\x00\x00\x00\x00\x00",
5712 .ilen = 8,
5713 .result = "\x49\xa4\xce\x32\xac\x19\x0e\x3f",
5714 .rlen = 8,
5715 }, {
5716 .key = "\x38\x38\x38\x38\x38\x38\x38\x38"
5717 "\x38\x38\x38\x38\x38\x38\x38\x38",
5718 .klen = 16,
5719 .input = "\x38\x38\x38\x38\x38\x38\x38\x38",
5720 .ilen = 8,
5721 .result = "\x7e\x82\x12\xa1\xd9\x5b\xe4\xf9",
5722 .rlen = 8,
5723 }, {
5724 .key = "\xa2\xa2\xa2\xa2\xa2\xa2\xa2\xa2"
5725 "\xa2\xa2\xa2\xa2\xa2\xa2\xa2\xa2",
5726 .klen = 16,
5727 .input = "\xa2\xa2\xa2\xa2\xa2\xa2\xa2\xa2",
5728 .ilen = 8,
5729 .result = "\xaa\xbe\xc1\x95\xc5\x94\x1a\x9c",
5730 .rlen = 8,
5731 }, {
5732 .key = "\x2f\x2f\x2f\x2f\x2f\x2f\x2f\x2f"
5733 "\x2f\x2f\x2f\x2f\x2f\x2f\x2f\x2f",
5734 .klen = 16,
5735 .input = "\x2f\x2f\x2f\x2f\x2f\x2f\x2f\x2f",
5736 .ilen = 8,
5737 .result = "\x04\x74\xf5\x70\x50\x16\xd3\xb8",
5738 .rlen = 8,
5739 }, {
5740 .key = "\x2f\x2f\x2f\x2f\x2f\x2f\x2f\x2f"
5741 "\x2f\x2f\x2f\x2f\x2f\x2f\x2f\x2f",
5742 .klen = 16,
5743 .input = "\x2f\x2f\x2f\x2f\x2f\x2f\x2f\x2f"
5744 "\x2f\x2f\x2f\x2f\x2f\x2f\x2f\x2f",
5745 .ilen = 16,
5746 .result = "\x04\x74\xf5\x70\x50\x16\xd3\xb8"
5747 "\x04\x74\xf5\x70\x50\x16\xd3\xb8",
5748 .rlen = 16,
5749 },
5750};
5751
5752static struct cipher_testvec khazad_dec_tv_template[] = {
5753 {
5754 .key = "\x80\x00\x00\x00\x00\x00\x00\x00"
5755 "\x00\x00\x00\x00\x00\x00\x00\x00",
5756 .klen = 16,
5757 .input = "\x49\xa4\xce\x32\xac\x19\x0e\x3f",
5758 .ilen = 8,
5759 .result = "\x00\x00\x00\x00\x00\x00\x00\x00",
5760 .rlen = 8,
5761 }, {
5762 .key = "\x38\x38\x38\x38\x38\x38\x38\x38"
5763 "\x38\x38\x38\x38\x38\x38\x38\x38",
5764 .klen = 16,
5765 .input = "\x7e\x82\x12\xa1\xd9\x5b\xe4\xf9",
5766 .ilen = 8,
5767 .result = "\x38\x38\x38\x38\x38\x38\x38\x38",
5768 .rlen = 8,
5769 }, {
5770 .key = "\xa2\xa2\xa2\xa2\xa2\xa2\xa2\xa2"
5771 "\xa2\xa2\xa2\xa2\xa2\xa2\xa2\xa2",
5772 .klen = 16,
5773 .input = "\xaa\xbe\xc1\x95\xc5\x94\x1a\x9c",
5774 .ilen = 8,
5775 .result = "\xa2\xa2\xa2\xa2\xa2\xa2\xa2\xa2",
5776 .rlen = 8,
5777 }, {
5778 .key = "\x2f\x2f\x2f\x2f\x2f\x2f\x2f\x2f"
5779 "\x2f\x2f\x2f\x2f\x2f\x2f\x2f\x2f",
5780 .klen = 16,
5781 .input = "\x04\x74\xf5\x70\x50\x16\xd3\xb8",
5782 .ilen = 8,
5783 .result = "\x2f\x2f\x2f\x2f\x2f\x2f\x2f\x2f",
5784 .rlen = 8,
5785 }, {
5786 .key = "\x2f\x2f\x2f\x2f\x2f\x2f\x2f\x2f"
5787 "\x2f\x2f\x2f\x2f\x2f\x2f\x2f\x2f",
5788 .klen = 16,
5789 .input = "\x04\x74\xf5\x70\x50\x16\xd3\xb8"
5790 "\x04\x74\xf5\x70\x50\x16\xd3\xb8",
5791 .ilen = 16,
5792 .result = "\x2f\x2f\x2f\x2f\x2f\x2f\x2f\x2f"
5793 "\x2f\x2f\x2f\x2f\x2f\x2f\x2f\x2f",
5794 .rlen = 16,
5795 },
5796};
5797
5798/*
5799 * Anubis test vectors.
5800 */
5801
5802#define ANUBIS_ENC_TEST_VECTORS 5
5803#define ANUBIS_DEC_TEST_VECTORS 5
5804#define ANUBIS_CBC_ENC_TEST_VECTORS 2
5805#define ANUBIS_CBC_DEC_TEST_VECTORS 2
5806
5807static struct cipher_testvec anubis_enc_tv_template[] = {
5808 {
5809 .key = "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe"
5810 "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe",
5811 .klen = 16,
5812 .input = "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe"
5813 "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe",
5814 .ilen = 16,
5815 .result = "\x6d\xc5\xda\xa2\x26\x7d\x62\x6f"
5816 "\x08\xb7\x52\x8e\x6e\x6e\x86\x90",
5817 .rlen = 16,
5818 }, {
5819
5820 .key = "\x03\x03\x03\x03\x03\x03\x03\x03"
5821 "\x03\x03\x03\x03\x03\x03\x03\x03"
5822 "\x03\x03\x03\x03",
5823 .klen = 20,
5824 .input = "\x03\x03\x03\x03\x03\x03\x03\x03"
5825 "\x03\x03\x03\x03\x03\x03\x03\x03",
5826 .ilen = 16,
5827 .result = "\xdb\xf1\x42\xf4\xd1\x8a\xc7\x49"
5828 "\x87\x41\x6f\x82\x0a\x98\x64\xae",
5829 .rlen = 16,
5830 }, {
5831 .key = "\x24\x24\x24\x24\x24\x24\x24\x24"
5832 "\x24\x24\x24\x24\x24\x24\x24\x24"
5833 "\x24\x24\x24\x24\x24\x24\x24\x24"
5834 "\x24\x24\x24\x24",
5835 .klen = 28,
5836 .input = "\x24\x24\x24\x24\x24\x24\x24\x24"
5837 "\x24\x24\x24\x24\x24\x24\x24\x24",
5838 .ilen = 16,
5839 .result = "\xfd\x1b\x4a\xe3\xbf\xf0\xad\x3d"
5840 "\x06\xd3\x61\x27\xfd\x13\x9e\xde",
5841 .rlen = 16,
5842 }, {
5843 .key = "\x25\x25\x25\x25\x25\x25\x25\x25"
5844 "\x25\x25\x25\x25\x25\x25\x25\x25"
5845 "\x25\x25\x25\x25\x25\x25\x25\x25"
5846 "\x25\x25\x25\x25\x25\x25\x25\x25",
5847 .klen = 32,
5848 .input = "\x25\x25\x25\x25\x25\x25\x25\x25"
5849 "\x25\x25\x25\x25\x25\x25\x25\x25",
5850 .ilen = 16,
5851 .result = "\x1a\x91\xfb\x2b\xb7\x78\x6b\xc4"
5852 "\x17\xd9\xff\x40\x3b\x0e\xe5\xfe",
5853 .rlen = 16,
5854 }, {
5855 .key = "\x35\x35\x35\x35\x35\x35\x35\x35"
5856 "\x35\x35\x35\x35\x35\x35\x35\x35"
5857 "\x35\x35\x35\x35\x35\x35\x35\x35"
5858 "\x35\x35\x35\x35\x35\x35\x35\x35"
5859 "\x35\x35\x35\x35\x35\x35\x35\x35",
5860 .klen = 40,
5861 .input = "\x35\x35\x35\x35\x35\x35\x35\x35"
5862 "\x35\x35\x35\x35\x35\x35\x35\x35",
5863 .ilen = 16,
5864 .result = "\xa5\x2c\x85\x6f\x9c\xba\xa0\x97"
5865 "\x9e\xc6\x84\x0f\x17\x21\x07\xee",
5866 .rlen = 16,
5867 },
5868};
5869
5870static struct cipher_testvec anubis_dec_tv_template[] = {
5871 {
5872 .key = "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe"
5873 "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe",
5874 .klen = 16,
5875 .input = "\x6d\xc5\xda\xa2\x26\x7d\x62\x6f"
5876 "\x08\xb7\x52\x8e\x6e\x6e\x86\x90",
5877 .ilen = 16,
5878 .result = "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe"
5879 "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe",
5880 .rlen = 16,
5881 }, {
5882
5883 .key = "\x03\x03\x03\x03\x03\x03\x03\x03"
5884 "\x03\x03\x03\x03\x03\x03\x03\x03"
5885 "\x03\x03\x03\x03",
5886 .klen = 20,
5887 .input = "\xdb\xf1\x42\xf4\xd1\x8a\xc7\x49"
5888 "\x87\x41\x6f\x82\x0a\x98\x64\xae",
5889 .ilen = 16,
5890 .result = "\x03\x03\x03\x03\x03\x03\x03\x03"
5891 "\x03\x03\x03\x03\x03\x03\x03\x03",
5892 .rlen = 16,
5893 }, {
5894 .key = "\x24\x24\x24\x24\x24\x24\x24\x24"
5895 "\x24\x24\x24\x24\x24\x24\x24\x24"
5896 "\x24\x24\x24\x24\x24\x24\x24\x24"
5897 "\x24\x24\x24\x24",
5898 .klen = 28,
5899 .input = "\xfd\x1b\x4a\xe3\xbf\xf0\xad\x3d"
5900 "\x06\xd3\x61\x27\xfd\x13\x9e\xde",
5901 .ilen = 16,
5902 .result = "\x24\x24\x24\x24\x24\x24\x24\x24"
5903 "\x24\x24\x24\x24\x24\x24\x24\x24",
5904 .rlen = 16,
5905 }, {
5906 .key = "\x25\x25\x25\x25\x25\x25\x25\x25"
5907 "\x25\x25\x25\x25\x25\x25\x25\x25"
5908 "\x25\x25\x25\x25\x25\x25\x25\x25"
5909 "\x25\x25\x25\x25\x25\x25\x25\x25",
5910 .klen = 32,
5911 .input = "\x1a\x91\xfb\x2b\xb7\x78\x6b\xc4"
5912 "\x17\xd9\xff\x40\x3b\x0e\xe5\xfe",
5913 .ilen = 16,
5914 .result = "\x25\x25\x25\x25\x25\x25\x25\x25"
5915 "\x25\x25\x25\x25\x25\x25\x25\x25",
5916 .rlen = 16,
5917 }, {
5918 .key = "\x35\x35\x35\x35\x35\x35\x35\x35"
5919 "\x35\x35\x35\x35\x35\x35\x35\x35"
5920 "\x35\x35\x35\x35\x35\x35\x35\x35"
5921 "\x35\x35\x35\x35\x35\x35\x35\x35"
5922 "\x35\x35\x35\x35\x35\x35\x35\x35",
5923 .input = "\xa5\x2c\x85\x6f\x9c\xba\xa0\x97"
5924 "\x9e\xc6\x84\x0f\x17\x21\x07\xee",
5925 .klen = 40,
5926 .ilen = 16,
5927 .result = "\x35\x35\x35\x35\x35\x35\x35\x35"
5928 "\x35\x35\x35\x35\x35\x35\x35\x35",
5929 .rlen = 16,
5930 },
5931};
5932
5933static struct cipher_testvec anubis_cbc_enc_tv_template[] = {
5934 {
5935 .key = "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe"
5936 "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe",
5937 .klen = 16,
5938 .input = "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe"
5939 "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe"
5940 "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe"
5941 "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe",
5942 .ilen = 32,
5943 .result = "\x6d\xc5\xda\xa2\x26\x7d\x62\x6f"
5944 "\x08\xb7\x52\x8e\x6e\x6e\x86\x90"
5945 "\x86\xd8\xb5\x6f\x98\x5e\x8a\x66"
5946 "\x4f\x1f\x78\xa1\xbb\x37\xf1\xbe",
5947 .rlen = 32,
5948 }, {
5949 .key = "\x35\x35\x35\x35\x35\x35\x35\x35"
5950 "\x35\x35\x35\x35\x35\x35\x35\x35"
5951 "\x35\x35\x35\x35\x35\x35\x35\x35"
5952 "\x35\x35\x35\x35\x35\x35\x35\x35"
5953 "\x35\x35\x35\x35\x35\x35\x35\x35",
5954 .klen = 40,
5955 .input = "\x35\x35\x35\x35\x35\x35\x35\x35"
5956 "\x35\x35\x35\x35\x35\x35\x35\x35"
5957 "\x35\x35\x35\x35\x35\x35\x35\x35"
5958 "\x35\x35\x35\x35\x35\x35\x35\x35",
5959 .ilen = 32,
5960 .result = "\xa5\x2c\x85\x6f\x9c\xba\xa0\x97"
5961 "\x9e\xc6\x84\x0f\x17\x21\x07\xee"
5962 "\xa2\xbc\x06\x98\xc6\x4b\xda\x75"
5963 "\x2e\xaa\xbe\x58\xce\x01\x5b\xc7",
5964 .rlen = 32,
5965 },
5966};
5967
5968static struct cipher_testvec anubis_cbc_dec_tv_template[] = {
5969 {
5970 .key = "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe"
5971 "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe",
5972 .klen = 16,
5973 .input = "\x6d\xc5\xda\xa2\x26\x7d\x62\x6f"
5974 "\x08\xb7\x52\x8e\x6e\x6e\x86\x90"
5975 "\x86\xd8\xb5\x6f\x98\x5e\x8a\x66"
5976 "\x4f\x1f\x78\xa1\xbb\x37\xf1\xbe",
5977 .ilen = 32,
5978 .result = "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe"
5979 "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe"
5980 "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe"
5981 "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe",
5982 .rlen = 32,
5983 }, {
5984 .key = "\x35\x35\x35\x35\x35\x35\x35\x35"
5985 "\x35\x35\x35\x35\x35\x35\x35\x35"
5986 "\x35\x35\x35\x35\x35\x35\x35\x35"
5987 "\x35\x35\x35\x35\x35\x35\x35\x35"
5988 "\x35\x35\x35\x35\x35\x35\x35\x35",
5989 .klen = 40,
5990 .input = "\xa5\x2c\x85\x6f\x9c\xba\xa0\x97"
5991 "\x9e\xc6\x84\x0f\x17\x21\x07\xee"
5992 "\xa2\xbc\x06\x98\xc6\x4b\xda\x75"
5993 "\x2e\xaa\xbe\x58\xce\x01\x5b\xc7",
5994 .ilen = 32,
5995 .result = "\x35\x35\x35\x35\x35\x35\x35\x35"
5996 "\x35\x35\x35\x35\x35\x35\x35\x35"
5997 "\x35\x35\x35\x35\x35\x35\x35\x35"
5998 "\x35\x35\x35\x35\x35\x35\x35\x35",
5999 .rlen = 32,
6000 },
6001};
6002
6003/*
6004 * XETA test vectors
6005 */
6006#define XETA_ENC_TEST_VECTORS 4
6007#define XETA_DEC_TEST_VECTORS 4
6008
6009static struct cipher_testvec xeta_enc_tv_template[] = {
6010 {
6011 .key = zeroed_string,
6012 .klen = 16,
6013 .input = zeroed_string,
6014 .ilen = 8,
6015 .result = "\xaa\x22\x96\xe5\x6c\x61\xf3\x45",
6016 .rlen = 8,
6017 }, {
6018 .key = "\x2b\x02\x05\x68\x06\x14\x49\x76"
6019 "\x77\x5d\x0e\x26\x6c\x28\x78\x43",
6020 .klen = 16,
6021 .input = "\x74\x65\x73\x74\x20\x6d\x65\x2e",
6022 .ilen = 8,
6023 .result = "\x82\x3e\xeb\x35\xdc\xdd\xd9\xc3",
6024 .rlen = 8,
6025 }, {
6026 .key = "\x09\x65\x43\x11\x66\x44\x39\x25"
6027 "\x51\x3a\x16\x10\x0a\x08\x12\x6e",
6028 .klen = 16,
6029 .input = "\x6c\x6f\x6e\x67\x65\x72\x5f\x74"
6030 "\x65\x73\x74\x5f\x76\x65\x63\x74",
6031 .ilen = 16,
6032 .result = "\xe2\x04\xdb\xf2\x89\x85\x9e\xea"
6033 "\x61\x35\xaa\xed\xb5\xcb\x71\x2c",
6034 .rlen = 16,
6035 }, {
6036 .key = "\x4d\x76\x32\x17\x05\x3f\x75\x2c"
6037 "\x5d\x04\x16\x36\x15\x72\x63\x2f",
6038 .klen = 16,
6039 .input = "\x54\x65\x61\x20\x69\x73\x20\x67"
6040 "\x6f\x6f\x64\x20\x66\x6f\x72\x20"
6041 "\x79\x6f\x75\x21\x21\x21\x20\x72"
6042 "\x65\x61\x6c\x6c\x79\x21\x21\x21",
6043 .ilen = 32,
6044 .result = "\x0b\x03\xcd\x8a\xbe\x95\xfd\xb1"
6045 "\xc1\x44\x91\x0b\xa5\xc9\x1b\xb4"
6046 "\xa9\xda\x1e\x9e\xb1\x3e\x2a\x8f"
6047 "\xea\xa5\x6a\x85\xd1\xf4\xa8\xa5",
6048 .rlen = 32,
6049 }
6050};
6051
6052static struct cipher_testvec xeta_dec_tv_template[] = {
6053 {
6054 .key = zeroed_string,
6055 .klen = 16,
6056 .input = "\xaa\x22\x96\xe5\x6c\x61\xf3\x45",
6057 .ilen = 8,
6058 .result = zeroed_string,
6059 .rlen = 8,
6060 }, {
6061 .key = "\x2b\x02\x05\x68\x06\x14\x49\x76"
6062 "\x77\x5d\x0e\x26\x6c\x28\x78\x43",
6063 .klen = 16,
6064 .input = "\x82\x3e\xeb\x35\xdc\xdd\xd9\xc3",
6065 .ilen = 8,
6066 .result = "\x74\x65\x73\x74\x20\x6d\x65\x2e",
6067 .rlen = 8,
6068 }, {
6069 .key = "\x09\x65\x43\x11\x66\x44\x39\x25"
6070 "\x51\x3a\x16\x10\x0a\x08\x12\x6e",
6071 .klen = 16,
6072 .input = "\xe2\x04\xdb\xf2\x89\x85\x9e\xea"
6073 "\x61\x35\xaa\xed\xb5\xcb\x71\x2c",
6074 .ilen = 16,
6075 .result = "\x6c\x6f\x6e\x67\x65\x72\x5f\x74"
6076 "\x65\x73\x74\x5f\x76\x65\x63\x74",
6077 .rlen = 16,
6078 }, {
6079 .key = "\x4d\x76\x32\x17\x05\x3f\x75\x2c"
6080 "\x5d\x04\x16\x36\x15\x72\x63\x2f",
6081 .klen = 16,
6082 .input = "\x0b\x03\xcd\x8a\xbe\x95\xfd\xb1"
6083 "\xc1\x44\x91\x0b\xa5\xc9\x1b\xb4"
6084 "\xa9\xda\x1e\x9e\xb1\x3e\x2a\x8f"
6085 "\xea\xa5\x6a\x85\xd1\xf4\xa8\xa5",
6086 .ilen = 32,
6087 .result = "\x54\x65\x61\x20\x69\x73\x20\x67"
6088 "\x6f\x6f\x64\x20\x66\x6f\x72\x20"
6089 "\x79\x6f\x75\x21\x21\x21\x20\x72"
6090 "\x65\x61\x6c\x6c\x79\x21\x21\x21",
6091 .rlen = 32,
6092 }
6093};
6094
6095/*
6096 * FCrypt test vectors
6097 */
6098#define FCRYPT_ENC_TEST_VECTORS ARRAY_SIZE(fcrypt_pcbc_enc_tv_template)
6099#define FCRYPT_DEC_TEST_VECTORS ARRAY_SIZE(fcrypt_pcbc_dec_tv_template)
6100
6101static struct cipher_testvec fcrypt_pcbc_enc_tv_template[] = {
6102 { /* http://www.openafs.org/pipermail/openafs-devel/2000-December/005320.html */
6103 .key = "\x00\x00\x00\x00\x00\x00\x00\x00",
6104 .klen = 8,
6105 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00",
6106 .input = "\x00\x00\x00\x00\x00\x00\x00\x00",
6107 .ilen = 8,
6108 .result = "\x0E\x09\x00\xC7\x3E\xF7\xED\x41",
6109 .rlen = 8,
6110 }, {
6111 .key = "\x11\x44\x77\xAA\xDD\x00\x33\x66",
6112 .klen = 8,
6113 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00",
6114 .input = "\x12\x34\x56\x78\x9A\xBC\xDE\xF0",
6115 .ilen = 8,
6116 .result = "\xD8\xED\x78\x74\x77\xEC\x06\x80",
6117 .rlen = 8,
6118 }, { /* From Arla */
6119 .key = "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87",
6120 .klen = 8,
6121 .iv = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
6122 .input = "The quick brown fox jumps over the lazy dogs.\0\0",
6123 .ilen = 48,
6124 .result = "\x00\xf0\x0e\x11\x75\xe6\x23\x82"
6125 "\xee\xac\x98\x62\x44\x51\xe4\x84"
6126 "\xc3\x59\xd8\xaa\x64\x60\xae\xf7"
6127 "\xd2\xd9\x13\x79\x72\xa3\x45\x03"
6128 "\x23\xb5\x62\xd7\x0c\xf5\x27\xd1"
6129 "\xf8\x91\x3c\xac\x44\x22\x92\xef",
6130 .rlen = 48,
6131 }, {
6132 .key = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
6133 .klen = 8,
6134 .iv = "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87",
6135 .input = "The quick brown fox jumps over the lazy dogs.\0\0",
6136 .ilen = 48,
6137 .result = "\xca\x90\xf5\x9d\xcb\xd4\xd2\x3c"
6138 "\x01\x88\x7f\x3e\x31\x6e\x62\x9d"
6139 "\xd8\xe0\x57\xa3\x06\x3a\x42\x58"
6140 "\x2a\x28\xfe\x72\x52\x2f\xdd\xe0"
6141 "\x19\x89\x09\x1c\x2a\x8e\x8c\x94"
6142 "\xfc\xc7\x68\xe4\x88\xaa\xde\x0f",
6143 .rlen = 48,
6144 }, { /* split-page version */
6145 .key = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
6146 .klen = 8,
6147 .iv = "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87",
6148 .input = "The quick brown fox jumps over the lazy dogs.\0\0",
6149 .ilen = 48,
6150 .result = "\xca\x90\xf5\x9d\xcb\xd4\xd2\x3c"
6151 "\x01\x88\x7f\x3e\x31\x6e\x62\x9d"
6152 "\xd8\xe0\x57\xa3\x06\x3a\x42\x58"
6153 "\x2a\x28\xfe\x72\x52\x2f\xdd\xe0"
6154 "\x19\x89\x09\x1c\x2a\x8e\x8c\x94"
6155 "\xfc\xc7\x68\xe4\x88\xaa\xde\x0f",
6156 .rlen = 48,
6157 .np = 2,
6158 .tap = { 20, 28 },
6159 }
6160};
6161
6162static struct cipher_testvec fcrypt_pcbc_dec_tv_template[] = {
6163 { /* http://www.openafs.org/pipermail/openafs-devel/2000-December/005320.html */
6164 .key = "\x00\x00\x00\x00\x00\x00\x00\x00",
6165 .klen = 8,
6166 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00",
6167 .input = "\x0E\x09\x00\xC7\x3E\xF7\xED\x41",
6168 .ilen = 8,
6169 .result = "\x00\x00\x00\x00\x00\x00\x00\x00",
6170 .rlen = 8,
6171 }, {
6172 .key = "\x11\x44\x77\xAA\xDD\x00\x33\x66",
6173 .klen = 8,
6174 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00",
6175 .input = "\xD8\xED\x78\x74\x77\xEC\x06\x80",
6176 .ilen = 8,
6177 .result = "\x12\x34\x56\x78\x9A\xBC\xDE\xF0",
6178 .rlen = 8,
6179 }, { /* From Arla */
6180 .key = "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87",
6181 .klen = 8,
6182 .iv = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
6183 .input = "\x00\xf0\x0e\x11\x75\xe6\x23\x82"
6184 "\xee\xac\x98\x62\x44\x51\xe4\x84"
6185 "\xc3\x59\xd8\xaa\x64\x60\xae\xf7"
6186 "\xd2\xd9\x13\x79\x72\xa3\x45\x03"
6187 "\x23\xb5\x62\xd7\x0c\xf5\x27\xd1"
6188 "\xf8\x91\x3c\xac\x44\x22\x92\xef",
6189 .ilen = 48,
6190 .result = "The quick brown fox jumps over the lazy dogs.\0\0",
6191 .rlen = 48,
6192 }, {
6193 .key = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
6194 .klen = 8,
6195 .iv = "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87",
6196 .input = "\xca\x90\xf5\x9d\xcb\xd4\xd2\x3c"
6197 "\x01\x88\x7f\x3e\x31\x6e\x62\x9d"
6198 "\xd8\xe0\x57\xa3\x06\x3a\x42\x58"
6199 "\x2a\x28\xfe\x72\x52\x2f\xdd\xe0"
6200 "\x19\x89\x09\x1c\x2a\x8e\x8c\x94"
6201 "\xfc\xc7\x68\xe4\x88\xaa\xde\x0f",
6202 .ilen = 48,
6203 .result = "The quick brown fox jumps over the lazy dogs.\0\0",
6204 .rlen = 48,
6205 }, { /* split-page version */
6206 .key = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
6207 .klen = 8,
6208 .iv = "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87",
6209 .input = "\xca\x90\xf5\x9d\xcb\xd4\xd2\x3c"
6210 "\x01\x88\x7f\x3e\x31\x6e\x62\x9d"
6211 "\xd8\xe0\x57\xa3\x06\x3a\x42\x58"
6212 "\x2a\x28\xfe\x72\x52\x2f\xdd\xe0"
6213 "\x19\x89\x09\x1c\x2a\x8e\x8c\x94"
6214 "\xfc\xc7\x68\xe4\x88\xaa\xde\x0f",
6215 .ilen = 48,
6216 .result = "The quick brown fox jumps over the lazy dogs.\0\0",
6217 .rlen = 48,
6218 .np = 2,
6219 .tap = { 20, 28 },
6220 }
6221};
6222
6223/*
6224 * CAMELLIA test vectors.
6225 */
6226#define CAMELLIA_ENC_TEST_VECTORS 3
6227#define CAMELLIA_DEC_TEST_VECTORS 3
6228#define CAMELLIA_CBC_ENC_TEST_VECTORS 2
6229#define CAMELLIA_CBC_DEC_TEST_VECTORS 2
6230
6231static struct cipher_testvec camellia_enc_tv_template[] = {
6232 {
6233 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef"
6234 "\xfe\xdc\xba\x98\x76\x54\x32\x10",
6235 .klen = 16,
6236 .input = "\x01\x23\x45\x67\x89\xab\xcd\xef"
6237 "\xfe\xdc\xba\x98\x76\x54\x32\x10",
6238 .ilen = 16,
6239 .result = "\x67\x67\x31\x38\x54\x96\x69\x73"
6240 "\x08\x57\x06\x56\x48\xea\xbe\x43",
6241 .rlen = 16,
6242 }, {
6243 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef"
6244 "\xfe\xdc\xba\x98\x76\x54\x32\x10"
6245 "\x00\x11\x22\x33\x44\x55\x66\x77",
6246 .klen = 24,
6247 .input = "\x01\x23\x45\x67\x89\xab\xcd\xef"
6248 "\xfe\xdc\xba\x98\x76\x54\x32\x10",
6249 .ilen = 16,
6250 .result = "\xb4\x99\x34\x01\xb3\xe9\x96\xf8"
6251 "\x4e\xe5\xce\xe7\xd7\x9b\x09\xb9",
6252 .rlen = 16,
6253 }, {
6254 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef"
6255 "\xfe\xdc\xba\x98\x76\x54\x32\x10"
6256 "\x00\x11\x22\x33\x44\x55\x66\x77"
6257 "\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
6258 .klen = 32,
6259 .input = "\x01\x23\x45\x67\x89\xab\xcd\xef"
6260 "\xfe\xdc\xba\x98\x76\x54\x32\x10",
6261 .ilen = 16,
6262 .result = "\x9a\xcc\x23\x7d\xff\x16\xd7\x6c"
6263 "\x20\xef\x7c\x91\x9e\x3a\x75\x09",
6264 .rlen = 16,
6265 },
6266};
6267
6268static struct cipher_testvec camellia_dec_tv_template[] = {
6269 {
6270 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef"
6271 "\xfe\xdc\xba\x98\x76\x54\x32\x10",
6272 .klen = 16,
6273 .input = "\x67\x67\x31\x38\x54\x96\x69\x73"
6274 "\x08\x57\x06\x56\x48\xea\xbe\x43",
6275 .ilen = 16,
6276 .result = "\x01\x23\x45\x67\x89\xab\xcd\xef"
6277 "\xfe\xdc\xba\x98\x76\x54\x32\x10", 39 "\xfe\xdc\xba\x98\x76\x54\x32\x10",
6278 .rlen = 16,
6279 }, {
6280 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef"
6281 "\xfe\xdc\xba\x98\x76\x54\x32\x10"
6282 "\x00\x11\x22\x33\x44\x55\x66\x77",
6283 .klen = 24, 40 .klen = 24,
6284 .input = "\xb4\x99\x34\x01\xb3\xe9\x96\xf8"
6285 "\x4e\xe5\xce\xe7\xd7\x9b\x09\xb9",
6286 .ilen = 16,
6287 .result = "\x01\x23\x45\x67\x89\xab\xcd\xef"
6288 "\xfe\xdc\xba\x98\x76\x54\x32\x10",
6289 .rlen = 16,
6290 }, {
6291 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef"
6292 "\xfe\xdc\xba\x98\x76\x54\x32\x10"
6293 "\x00\x11\x22\x33\x44\x55\x66\x77"
6294 "\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
6295 .klen = 32,
6296 .input = "\x9a\xcc\x23\x7d\xff\x16\xd7\x6c"
6297 "\x20\xef\x7c\x91\x9e\x3a\x75\x09",
6298 .ilen = 16,
6299 .result = "\x01\x23\x45\x67\x89\xab\xcd\xef"
6300 "\xfe\xdc\xba\x98\x76\x54\x32\x10",
6301 .rlen = 16,
6302 },
6303};
6304
6305static struct cipher_testvec camellia_cbc_enc_tv_template[] = {
6306 {
6307 .key = "\x06\xa9\x21\x40\x36\xb8\xa1\x5b"
6308 "\x51\x2e\x03\xd5\x34\x12\x00\x06",
6309 .klen = 16,
6310 .iv = "\x3d\xaf\xba\x42\x9d\x9e\xb4\x30"
6311 "\xb4\x22\xda\x80\x2c\x9f\xac\x41",
6312 .input = "Single block msg",
6313 .ilen = 16,
6314 .result = "\xea\x32\x12\x76\x3b\x50\x10\xe7"
6315 "\x18\xf6\xfd\x5d\xf6\x8f\x13\x51",
6316 .rlen = 16,
6317 }, {
6318 .key = "\xc2\x86\x69\x6d\x88\x7c\x9a\xa0"
6319 "\x61\x1b\xbb\x3e\x20\x25\xa4\x5a",
6320 .klen = 16,
6321 .iv = "\x56\x2e\x17\x99\x6d\x09\x3d\x28"
6322 "\xdd\xb3\xba\x69\x5a\x2e\x6f\x58",
6323 .input = "\x00\x01\x02\x03\x04\x05\x06\x07"
6324 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
6325 "\x10\x11\x12\x13\x14\x15\x16\x17"
6326 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
6327 .ilen = 32,
6328 .result = "\xa5\xdf\x6e\x50\xda\x70\x6c\x01"
6329 "\x4a\xab\xf3\xf2\xd6\xfc\x6c\xfd"
6330 "\x19\xb4\x3e\x57\x1c\x02\x5e\xa0"
6331 "\x15\x78\xe0\x5e\xf2\xcb\x87\x16",
6332 .rlen = 32,
6333 },
6334};
6335
6336static struct cipher_testvec camellia_cbc_dec_tv_template[] = {
6337 {
6338 .key = "\x06\xa9\x21\x40\x36\xb8\xa1\x5b"
6339 "\x51\x2e\x03\xd5\x34\x12\x00\x06",
6340 .klen = 16,
6341 .iv = "\x3d\xaf\xba\x42\x9d\x9e\xb4\x30"
6342 "\xb4\x22\xda\x80\x2c\x9f\xac\x41",
6343 .input = "\xea\x32\x12\x76\x3b\x50\x10\xe7"
6344 "\x18\xf6\xfd\x5d\xf6\x8f\x13\x51",
6345 .ilen = 16,
6346 .result = "Single block msg",
6347 .rlen = 16,
6348 }, {
6349 .key = "\xc2\x86\x69\x6d\x88\x7c\x9a\xa0"
6350 "\x61\x1b\xbb\x3e\x20\x25\xa4\x5a",
6351 .klen = 16,
6352 .iv = "\x56\x2e\x17\x99\x6d\x09\x3d\x28"
6353 "\xdd\xb3\xba\x69\x5a\x2e\x6f\x58",
6354 .input = "\xa5\xdf\x6e\x50\xda\x70\x6c\x01"
6355 "\x4a\xab\xf3\xf2\xd6\xfc\x6c\xfd"
6356 "\x19\xb4\x3e\x57\x1c\x02\x5e\xa0"
6357 "\x15\x78\xe0\x5e\xf2\xcb\x87\x16",
6358 .ilen = 32,
6359 .result = "\x00\x01\x02\x03\x04\x05\x06\x07"
6360 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
6361 "\x10\x11\x12\x13\x14\x15\x16\x17"
6362 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
6363 .rlen = 32,
6364 },
6365};
6366
6367/*
6368 * SEED test vectors
6369 */
6370#define SEED_ENC_TEST_VECTORS 4
6371#define SEED_DEC_TEST_VECTORS 4
6372
6373static struct cipher_testvec seed_enc_tv_template[] = {
6374 {
6375 .key = zeroed_string,
6376 .klen = 16,
6377 .input = "\x00\x01\x02\x03\x04\x05\x06\x07"
6378 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
6379 .ilen = 16,
6380 .result = "\x5e\xba\xc6\xe0\x05\x4e\x16\x68"
6381 "\x19\xaf\xf1\xcc\x6d\x34\x6c\xdb",
6382 .rlen = 16,
6383 }, {
6384 .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
6385 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
6386 .klen = 16,
6387 .input = zeroed_string,
6388 .ilen = 16,
6389 .result = "\xc1\x1f\x22\xf2\x01\x40\x50\x50"
6390 "\x84\x48\x35\x97\xe4\x37\x0f\x43",
6391 .rlen = 16,
6392 }, {
6393 .key = "\x47\x06\x48\x08\x51\xe6\x1b\xe8"
6394 "\x5d\x74\xbf\xb3\xfd\x95\x61\x85",
6395 .klen = 16,
6396 .input = "\x83\xa2\xf8\xa2\x88\x64\x1f\xb9"
6397 "\xa4\xe9\xa5\xcc\x2f\x13\x1c\x7d",
6398 .ilen = 16,
6399 .result = "\xee\x54\xd1\x3e\xbc\xae\x70\x6d"
6400 "\x22\x6b\xc3\x14\x2c\xd4\x0d\x4a",
6401 .rlen = 16,
6402 }, {
6403 .key = "\x28\xdb\xc3\xbc\x49\xff\xd8\x7d"
6404 "\xcf\xa5\x09\xb1\x1d\x42\x2b\xe7",
6405 .klen = 16,
6406 .input = "\xb4\x1e\x6b\xe2\xeb\xa8\x4a\x14"
6407 "\x8e\x2e\xed\x84\x59\x3c\x5e\xc7",
6408 .ilen = 16,
6409 .result = "\x9b\x9b\x7b\xfc\xd1\x81\x3c\xb9"
6410 "\x5d\x0b\x36\x18\xf4\x0f\x51\x22",
6411 .rlen = 16,
6412 }
6413};
6414
6415static struct cipher_testvec seed_dec_tv_template[] = {
6416 {
6417 .key = zeroed_string,
6418 .klen = 16,
6419 .input = "\x5e\xba\xc6\xe0\x05\x4e\x16\x68"
6420 "\x19\xaf\xf1\xcc\x6d\x34\x6c\xdb",
6421 .ilen = 16,
6422 .result = "\x00\x01\x02\x03\x04\x05\x06\x07"
6423 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
6424 .rlen = 16,
6425 }, {
6426 .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
6427 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
6428 .klen = 16,
6429 .input = "\xc1\x1f\x22\xf2\x01\x40\x50\x50"
6430 "\x84\x48\x35\x97\xe4\x37\x0f\x43",
6431 .ilen = 16,
6432 .result = zeroed_string,
6433 .rlen = 16,
6434 }, {
6435 .key = "\x47\x06\x48\x08\x51\xe6\x1b\xe8"
6436 "\x5d\x74\xbf\xb3\xfd\x95\x61\x85",
6437 .klen = 16,
6438 .input = "\xee\x54\xd1\x3e\xbc\xae\x70\x6d"
6439 "\x22\x6b\xc3\x14\x2c\xd4\x0d\x4a",
6440 .ilen = 16,
6441 .result = "\x83\xa2\xf8\xa2\x88\x64\x1f\xb9"
6442 "\xa4\xe9\xa5\xcc\x2f\x13\x1c\x7d",
6443 .rlen = 16,
6444 }, {
6445 .key = "\x28\xdb\xc3\xbc\x49\xff\xd8\x7d"
6446 "\xcf\xa5\x09\xb1\x1d\x42\x2b\xe7",
6447 .klen = 16,
6448 .input = "\x9b\x9b\x7b\xfc\xd1\x81\x3c\xb9"
6449 "\x5d\x0b\x36\x18\xf4\x0f\x51\x22",
6450 .ilen = 16,
6451 .result = "\xb4\x1e\x6b\xe2\xeb\xa8\x4a\x14"
6452 "\x8e\x2e\xed\x84\x59\x3c\x5e\xc7",
6453 .rlen = 16,
6454 }
6455};
6456
6457#define SALSA20_STREAM_ENC_TEST_VECTORS 5
6458static struct cipher_testvec salsa20_stream_enc_tv_template[] = {
6459 /*
6460 * Testvectors from verified.test-vectors submitted to ECRYPT.
6461 * They are truncated to size 39, 64, 111, 129 to test a variety
6462 * of input length.
6463 */
6464 { /* Set 3, vector 0 */
6465 .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
6466 "\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F",
6467 .klen = 16,
6468 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00",
6469 .input = "\x00\x00\x00\x00\x00\x00\x00\x00"
6470 "\x00\x00\x00\x00\x00\x00\x00\x00"
6471 "\x00\x00\x00\x00\x00\x00\x00\x00"
6472 "\x00\x00\x00\x00\x00\x00\x00\x00"
6473 "\x00\x00\x00\x00\x00\x00\x00",
6474 .ilen = 39,
6475 .result = "\x2D\xD5\xC3\xF7\xBA\x2B\x20\xF7"
6476 "\x68\x02\x41\x0C\x68\x86\x88\x89"
6477 "\x5A\xD8\xC1\xBD\x4E\xA6\xC9\xB1"
6478 "\x40\xFB\x9B\x90\xE2\x10\x49\xBF"
6479 "\x58\x3F\x52\x79\x70\xEB\xC1",
6480 .rlen = 39,
6481 }, { /* Set 5, vector 0 */
6482 .key = "\x00\x00\x00\x00\x00\x00\x00\x00"
6483 "\x00\x00\x00\x00\x00\x00\x00\x00",
6484 .klen = 16,
6485 .iv = "\x80\x00\x00\x00\x00\x00\x00\x00",
6486 .input = "\x00\x00\x00\x00\x00\x00\x00\x00"
6487 "\x00\x00\x00\x00\x00\x00\x00\x00"
6488 "\x00\x00\x00\x00\x00\x00\x00\x00"
6489 "\x00\x00\x00\x00\x00\x00\x00\x00"
6490 "\x00\x00\x00\x00\x00\x00\x00\x00"
6491 "\x00\x00\x00\x00\x00\x00\x00\x00"
6492 "\x00\x00\x00\x00\x00\x00\x00\x00"
6493 "\x00\x00\x00\x00\x00\x00\x00\x00",
6494 .ilen = 64,
6495 .result = "\xB6\x6C\x1E\x44\x46\xDD\x95\x57"
6496 "\xE5\x78\xE2\x23\xB0\xB7\x68\x01"
6497 "\x7B\x23\xB2\x67\xBB\x02\x34\xAE"
6498 "\x46\x26\xBF\x44\x3F\x21\x97\x76"
6499 "\x43\x6F\xB1\x9F\xD0\xE8\x86\x6F"
6500 "\xCD\x0D\xE9\xA9\x53\x8F\x4A\x09"
6501 "\xCA\x9A\xC0\x73\x2E\x30\xBC\xF9"
6502 "\x8E\x4F\x13\xE4\xB9\xE2\x01\xD9",
6503 .rlen = 64,
6504 }, { /* Set 3, vector 27 */
6505 .key = "\x1B\x1C\x1D\x1E\x1F\x20\x21\x22"
6506 "\x23\x24\x25\x26\x27\x28\x29\x2A"
6507 "\x2B\x2C\x2D\x2E\x2F\x30\x31\x32"
6508 "\x33\x34\x35\x36\x37\x38\x39\x3A",
6509 .klen = 32,
6510 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00",
6511 .input = "\x00\x00\x00\x00\x00\x00\x00\x00"
6512 "\x00\x00\x00\x00\x00\x00\x00\x00"
6513 "\x00\x00\x00\x00\x00\x00\x00\x00"
6514 "\x00\x00\x00\x00\x00\x00\x00\x00"
6515 "\x00\x00\x00\x00\x00\x00\x00\x00"
6516 "\x00\x00\x00\x00\x00\x00\x00\x00"
6517 "\x00\x00\x00\x00\x00\x00\x00\x00"
6518 "\x00\x00\x00\x00\x00\x00\x00\x00"
6519 "\x00\x00\x00\x00\x00\x00\x00\x00"
6520 "\x00\x00\x00\x00\x00\x00\x00\x00"
6521 "\x00\x00\x00\x00\x00\x00\x00\x00"
6522 "\x00\x00\x00\x00\x00\x00\x00\x00"
6523 "\x00\x00\x00\x00\x00\x00\x00\x00"
6524 "\x00\x00\x00\x00\x00\x00\x00",
6525 .ilen = 111,
6526 .result = "\xAE\x39\x50\x8E\xAC\x9A\xEC\xE7"
6527 "\xBF\x97\xBB\x20\xB9\xDE\xE4\x1F"
6528 "\x87\xD9\x47\xF8\x28\x91\x35\x98"
6529 "\xDB\x72\xCC\x23\x29\x48\x56\x5E"
6530 "\x83\x7E\x0B\xF3\x7D\x5D\x38\x7B"
6531 "\x2D\x71\x02\xB4\x3B\xB5\xD8\x23"
6532 "\xB0\x4A\xDF\x3C\xEC\xB6\xD9\x3B"
6533 "\x9B\xA7\x52\xBE\xC5\xD4\x50\x59"
6534 "\x15\x14\xB4\x0E\x40\xE6\x53\xD1"
6535 "\x83\x9C\x5B\xA0\x92\x29\x6B\x5E"
6536 "\x96\x5B\x1E\x2F\xD3\xAC\xC1\x92"
6537 "\xB1\x41\x3F\x19\x2F\xC4\x3B\xC6"
6538 "\x95\x46\x45\x54\xE9\x75\x03\x08"
6539 "\x44\xAF\xE5\x8A\x81\x12\x09",
6540 .rlen = 111,
6541 }, { /* Set 5, vector 27 */
6542 .key = "\x00\x00\x00\x00\x00\x00\x00\x00"
6543 "\x00\x00\x00\x00\x00\x00\x00\x00"
6544 "\x00\x00\x00\x00\x00\x00\x00\x00"
6545 "\x00\x00\x00\x00\x00\x00\x00\x00",
6546 .klen = 32,
6547 .iv = "\x00\x00\x00\x10\x00\x00\x00\x00",
6548 .input = "\x00\x00\x00\x00\x00\x00\x00\x00"
6549 "\x00\x00\x00\x00\x00\x00\x00\x00"
6550 "\x00\x00\x00\x00\x00\x00\x00\x00"
6551 "\x00\x00\x00\x00\x00\x00\x00\x00"
6552 "\x00\x00\x00\x00\x00\x00\x00\x00"
6553 "\x00\x00\x00\x00\x00\x00\x00\x00"
6554 "\x00\x00\x00\x00\x00\x00\x00\x00"
6555 "\x00\x00\x00\x00\x00\x00\x00\x00"
6556 "\x00\x00\x00\x00\x00\x00\x00\x00"
6557 "\x00\x00\x00\x00\x00\x00\x00\x00"
6558 "\x00\x00\x00\x00\x00\x00\x00\x00"
6559 "\x00\x00\x00\x00\x00\x00\x00\x00"
6560 "\x00\x00\x00\x00\x00\x00\x00\x00"
6561 "\x00\x00\x00\x00\x00\x00\x00\x00"
6562 "\x00\x00\x00\x00\x00\x00\x00\x00"
6563 "\x00\x00\x00\x00\x00\x00\x00\x00"
6564 "\x00",
6565 .ilen = 129,
6566 .result = "\xD2\xDB\x1A\x5C\xF1\xC1\xAC\xDB"
6567 "\xE8\x1A\x7A\x43\x40\xEF\x53\x43"
6568 "\x5E\x7F\x4B\x1A\x50\x52\x3F\x8D"
6569 "\x28\x3D\xCF\x85\x1D\x69\x6E\x60"
6570 "\xF2\xDE\x74\x56\x18\x1B\x84\x10"
6571 "\xD4\x62\xBA\x60\x50\xF0\x61\xF2"
6572 "\x1C\x78\x7F\xC1\x24\x34\xAF\x58"
6573 "\xBF\x2C\x59\xCA\x90\x77\xF3\xB0"
6574 "\x5B\x4A\xDF\x89\xCE\x2C\x2F\xFC"
6575 "\x67\xF0\xE3\x45\xE8\xB3\xB3\x75"
6576 "\xA0\x95\x71\xA1\x29\x39\x94\xCA"
6577 "\x45\x2F\xBD\xCB\x10\xB6\xBE\x9F"
6578 "\x8E\xF9\xB2\x01\x0A\x5A\x0A\xB7"
6579 "\x6B\x9D\x70\x8E\x4B\xD6\x2F\xCD"
6580 "\x2E\x40\x48\x75\xE9\xE2\x21\x45"
6581 "\x0B\xC9\xB6\xB5\x66\xBC\x9A\x59"
6582 "\x5A",
6583 .rlen = 129,
6584 }, { /* large test vector generated using Crypto++ */
6585 .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
6586 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
6587 "\x10\x11\x12\x13\x14\x15\x16\x17"
6588 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
6589 .klen = 32,
6590 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
6591 "\x00\x00\x00\x00\x00\x00\x00\x00",
6592 .input =
6593 "\x00\x01\x02\x03\x04\x05\x06\x07"
6594 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
6595 "\x10\x11\x12\x13\x14\x15\x16\x17"
6596 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
6597 "\x20\x21\x22\x23\x24\x25\x26\x27"
6598 "\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f"
6599 "\x30\x31\x32\x33\x34\x35\x36\x37"
6600 "\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f"
6601 "\x40\x41\x42\x43\x44\x45\x46\x47"
6602 "\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f"
6603 "\x50\x51\x52\x53\x54\x55\x56\x57"
6604 "\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f"
6605 "\x60\x61\x62\x63\x64\x65\x66\x67"
6606 "\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f"
6607 "\x70\x71\x72\x73\x74\x75\x76\x77"
6608 "\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f"
6609 "\x80\x81\x82\x83\x84\x85\x86\x87"
6610 "\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
6611 "\x90\x91\x92\x93\x94\x95\x96\x97"
6612 "\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
6613 "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7"
6614 "\xa8\xa9\xaa\xab\xac\xad\xae\xaf"
6615 "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7"
6616 "\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
6617 "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
6618 "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
6619 "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7"
6620 "\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf"
6621 "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7"
6622 "\xe8\xe9\xea\xeb\xec\xed\xee\xef"
6623 "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7"
6624 "\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"
6625 "\x00\x03\x06\x09\x0c\x0f\x12\x15"
6626 "\x18\x1b\x1e\x21\x24\x27\x2a\x2d"
6627 "\x30\x33\x36\x39\x3c\x3f\x42\x45"
6628 "\x48\x4b\x4e\x51\x54\x57\x5a\x5d"
6629 "\x60\x63\x66\x69\x6c\x6f\x72\x75"
6630 "\x78\x7b\x7e\x81\x84\x87\x8a\x8d"
6631 "\x90\x93\x96\x99\x9c\x9f\xa2\xa5"
6632 "\xa8\xab\xae\xb1\xb4\xb7\xba\xbd"
6633 "\xc0\xc3\xc6\xc9\xcc\xcf\xd2\xd5"
6634 "\xd8\xdb\xde\xe1\xe4\xe7\xea\xed"
6635 "\xf0\xf3\xf6\xf9\xfc\xff\x02\x05"
6636 "\x08\x0b\x0e\x11\x14\x17\x1a\x1d"
6637 "\x20\x23\x26\x29\x2c\x2f\x32\x35"
6638 "\x38\x3b\x3e\x41\x44\x47\x4a\x4d"
6639 "\x50\x53\x56\x59\x5c\x5f\x62\x65"
6640 "\x68\x6b\x6e\x71\x74\x77\x7a\x7d"
6641 "\x80\x83\x86\x89\x8c\x8f\x92\x95"
6642 "\x98\x9b\x9e\xa1\xa4\xa7\xaa\xad"
6643 "\xb0\xb3\xb6\xb9\xbc\xbf\xc2\xc5"
6644 "\xc8\xcb\xce\xd1\xd4\xd7\xda\xdd"
6645 "\xe0\xe3\xe6\xe9\xec\xef\xf2\xf5"
6646 "\xf8\xfb\xfe\x01\x04\x07\x0a\x0d"
6647 "\x10\x13\x16\x19\x1c\x1f\x22\x25"
6648 "\x28\x2b\x2e\x31\x34\x37\x3a\x3d"
6649 "\x40\x43\x46\x49\x4c\x4f\x52\x55"
6650 "\x58\x5b\x5e\x61\x64\x67\x6a\x6d"
6651 "\x70\x73\x76\x79\x7c\x7f\x82\x85"
6652 "\x88\x8b\x8e\x91\x94\x97\x9a\x9d"
6653 "\xa0\xa3\xa6\xa9\xac\xaf\xb2\xb5"
6654 "\xb8\xbb\xbe\xc1\xc4\xc7\xca\xcd"
6655 "\xd0\xd3\xd6\xd9\xdc\xdf\xe2\xe5"
6656 "\xe8\xeb\xee\xf1\xf4\xf7\xfa\xfd"
6657 "\x00\x05\x0a\x0f\x14\x19\x1e\x23"
6658 "\x28\x2d\x32\x37\x3c\x41\x46\x4b"
6659 "\x50\x55\x5a\x5f\x64\x69\x6e\x73"
6660 "\x78\x7d\x82\x87\x8c\x91\x96\x9b"
6661 "\xa0\xa5\xaa\xaf\xb4\xb9\xbe\xc3"
6662 "\xc8\xcd\xd2\xd7\xdc\xe1\xe6\xeb"
6663 "\xf0\xf5\xfa\xff\x04\x09\x0e\x13"
6664 "\x18\x1d\x22\x27\x2c\x31\x36\x3b"
6665 "\x40\x45\x4a\x4f\x54\x59\x5e\x63"
6666 "\x68\x6d\x72\x77\x7c\x81\x86\x8b"
6667 "\x90\x95\x9a\x9f\xa4\xa9\xae\xb3"
6668 "\xb8\xbd\xc2\xc7\xcc\xd1\xd6\xdb"
6669 "\xe0\xe5\xea\xef\xf4\xf9\xfe\x03"
6670 "\x08\x0d\x12\x17\x1c\x21\x26\x2b"
6671 "\x30\x35\x3a\x3f\x44\x49\x4e\x53"
6672 "\x58\x5d\x62\x67\x6c\x71\x76\x7b"
6673 "\x80\x85\x8a\x8f\x94\x99\x9e\xa3"
6674 "\xa8\xad\xb2\xb7\xbc\xc1\xc6\xcb"
6675 "\xd0\xd5\xda\xdf\xe4\xe9\xee\xf3"
6676 "\xf8\xfd\x02\x07\x0c\x11\x16\x1b"
6677 "\x20\x25\x2a\x2f\x34\x39\x3e\x43"
6678 "\x48\x4d\x52\x57\x5c\x61\x66\x6b"
6679 "\x70\x75\x7a\x7f\x84\x89\x8e\x93"
6680 "\x98\x9d\xa2\xa7\xac\xb1\xb6\xbb"
6681 "\xc0\xc5\xca\xcf\xd4\xd9\xde\xe3"
6682 "\xe8\xed\xf2\xf7\xfc\x01\x06\x0b"
6683 "\x10\x15\x1a\x1f\x24\x29\x2e\x33"
6684 "\x38\x3d\x42\x47\x4c\x51\x56\x5b"
6685 "\x60\x65\x6a\x6f\x74\x79\x7e\x83"
6686 "\x88\x8d\x92\x97\x9c\xa1\xa6\xab"
6687 "\xb0\xb5\xba\xbf\xc4\xc9\xce\xd3"
6688 "\xd8\xdd\xe2\xe7\xec\xf1\xf6\xfb"
6689 "\x00\x07\x0e\x15\x1c\x23\x2a\x31"
6690 "\x38\x3f\x46\x4d\x54\x5b\x62\x69"
6691 "\x70\x77\x7e\x85\x8c\x93\x9a\xa1"
6692 "\xa8\xaf\xb6\xbd\xc4\xcb\xd2\xd9"
6693 "\xe0\xe7\xee\xf5\xfc\x03\x0a\x11"
6694 "\x18\x1f\x26\x2d\x34\x3b\x42\x49"
6695 "\x50\x57\x5e\x65\x6c\x73\x7a\x81"
6696 "\x88\x8f\x96\x9d\xa4\xab\xb2\xb9"
6697 "\xc0\xc7\xce\xd5\xdc\xe3\xea\xf1"
6698 "\xf8\xff\x06\x0d\x14\x1b\x22\x29"
6699 "\x30\x37\x3e\x45\x4c\x53\x5a\x61"
6700 "\x68\x6f\x76\x7d\x84\x8b\x92\x99"
6701 "\xa0\xa7\xae\xb5\xbc\xc3\xca\xd1"
6702 "\xd8\xdf\xe6\xed\xf4\xfb\x02\x09"
6703 "\x10\x17\x1e\x25\x2c\x33\x3a\x41"
6704 "\x48\x4f\x56\x5d\x64\x6b\x72\x79"
6705 "\x80\x87\x8e\x95\x9c\xa3\xaa\xb1"
6706 "\xb8\xbf\xc6\xcd\xd4\xdb\xe2\xe9"
6707 "\xf0\xf7\xfe\x05\x0c\x13\x1a\x21"
6708 "\x28\x2f\x36\x3d\x44\x4b\x52\x59"
6709 "\x60\x67\x6e\x75\x7c\x83\x8a\x91"
6710 "\x98\x9f\xa6\xad\xb4\xbb\xc2\xc9"
6711 "\xd0\xd7\xde\xe5\xec\xf3\xfa\x01"
6712 "\x08\x0f\x16\x1d\x24\x2b\x32\x39"
6713 "\x40\x47\x4e\x55\x5c\x63\x6a\x71"
6714 "\x78\x7f\x86\x8d\x94\x9b\xa2\xa9"
6715 "\xb0\xb7\xbe\xc5\xcc\xd3\xda\xe1"
6716 "\xe8\xef\xf6\xfd\x04\x0b\x12\x19"
6717 "\x20\x27\x2e\x35\x3c\x43\x4a\x51"
6718 "\x58\x5f\x66\x6d\x74\x7b\x82\x89"
6719 "\x90\x97\x9e\xa5\xac\xb3\xba\xc1"
6720 "\xc8\xcf\xd6\xdd\xe4\xeb\xf2\xf9"
6721 "\x00\x09\x12\x1b\x24\x2d\x36\x3f"
6722 "\x48\x51\x5a\x63\x6c\x75\x7e\x87"
6723 "\x90\x99\xa2\xab\xb4\xbd\xc6\xcf"
6724 "\xd8\xe1\xea\xf3\xfc\x05\x0e\x17"
6725 "\x20\x29\x32\x3b\x44\x4d\x56\x5f"
6726 "\x68\x71\x7a\x83\x8c\x95\x9e\xa7"
6727 "\xb0\xb9\xc2\xcb\xd4\xdd\xe6\xef"
6728 "\xf8\x01\x0a\x13\x1c\x25\x2e\x37"
6729 "\x40\x49\x52\x5b\x64\x6d\x76\x7f"
6730 "\x88\x91\x9a\xa3\xac\xb5\xbe\xc7"
6731 "\xd0\xd9\xe2\xeb\xf4\xfd\x06\x0f"
6732 "\x18\x21\x2a\x33\x3c\x45\x4e\x57"
6733 "\x60\x69\x72\x7b\x84\x8d\x96\x9f"
6734 "\xa8\xb1\xba\xc3\xcc\xd5\xde\xe7"
6735 "\xf0\xf9\x02\x0b\x14\x1d\x26\x2f"
6736 "\x38\x41\x4a\x53\x5c\x65\x6e\x77"
6737 "\x80\x89\x92\x9b\xa4\xad\xb6\xbf"
6738 "\xc8\xd1\xda\xe3\xec\xf5\xfe\x07"
6739 "\x10\x19\x22\x2b\x34\x3d\x46\x4f"
6740 "\x58\x61\x6a\x73\x7c\x85\x8e\x97"
6741 "\xa0\xa9\xb2\xbb\xc4\xcd\xd6\xdf"
6742 "\xe8\xf1\xfa\x03\x0c\x15\x1e\x27"
6743 "\x30\x39\x42\x4b\x54\x5d\x66\x6f"
6744 "\x78\x81\x8a\x93\x9c\xa5\xae\xb7"
6745 "\xc0\xc9\xd2\xdb\xe4\xed\xf6\xff"
6746 "\x08\x11\x1a\x23\x2c\x35\x3e\x47"
6747 "\x50\x59\x62\x6b\x74\x7d\x86\x8f"
6748 "\x98\xa1\xaa\xb3\xbc\xc5\xce\xd7"
6749 "\xe0\xe9\xf2\xfb\x04\x0d\x16\x1f"
6750 "\x28\x31\x3a\x43\x4c\x55\x5e\x67"
6751 "\x70\x79\x82\x8b\x94\x9d\xa6\xaf"
6752 "\xb8\xc1\xca\xd3\xdc\xe5\xee\xf7"
6753 "\x00\x0b\x16\x21\x2c\x37\x42\x4d"
6754 "\x58\x63\x6e\x79\x84\x8f\x9a\xa5"
6755 "\xb0\xbb\xc6\xd1\xdc\xe7\xf2\xfd"
6756 "\x08\x13\x1e\x29\x34\x3f\x4a\x55"
6757 "\x60\x6b\x76\x81\x8c\x97\xa2\xad"
6758 "\xb8\xc3\xce\xd9\xe4\xef\xfa\x05"
6759 "\x10\x1b\x26\x31\x3c\x47\x52\x5d"
6760 "\x68\x73\x7e\x89\x94\x9f\xaa\xb5"
6761 "\xc0\xcb\xd6\xe1\xec\xf7\x02\x0d"
6762 "\x18\x23\x2e\x39\x44\x4f\x5a\x65"
6763 "\x70\x7b\x86\x91\x9c\xa7\xb2\xbd"
6764 "\xc8\xd3\xde\xe9\xf4\xff\x0a\x15"
6765 "\x20\x2b\x36\x41\x4c\x57\x62\x6d"
6766 "\x78\x83\x8e\x99\xa4\xaf\xba\xc5"
6767 "\xd0\xdb\xe6\xf1\xfc\x07\x12\x1d"
6768 "\x28\x33\x3e\x49\x54\x5f\x6a\x75"
6769 "\x80\x8b\x96\xa1\xac\xb7\xc2\xcd"
6770 "\xd8\xe3\xee\xf9\x04\x0f\x1a\x25"
6771 "\x30\x3b\x46\x51\x5c\x67\x72\x7d"
6772 "\x88\x93\x9e\xa9\xb4\xbf\xca\xd5"
6773 "\xe0\xeb\xf6\x01\x0c\x17\x22\x2d"
6774 "\x38\x43\x4e\x59\x64\x6f\x7a\x85"
6775 "\x90\x9b\xa6\xb1\xbc\xc7\xd2\xdd"
6776 "\xe8\xf3\xfe\x09\x14\x1f\x2a\x35"
6777 "\x40\x4b\x56\x61\x6c\x77\x82\x8d"
6778 "\x98\xa3\xae\xb9\xc4\xcf\xda\xe5"
6779 "\xf0\xfb\x06\x11\x1c\x27\x32\x3d"
6780 "\x48\x53\x5e\x69\x74\x7f\x8a\x95"
6781 "\xa0\xab\xb6\xc1\xcc\xd7\xe2\xed"
6782 "\xf8\x03\x0e\x19\x24\x2f\x3a\x45"
6783 "\x50\x5b\x66\x71\x7c\x87\x92\x9d"
6784 "\xa8\xb3\xbe\xc9\xd4\xdf\xea\xf5"
6785 "\x00\x0d\x1a\x27\x34\x41\x4e\x5b"
6786 "\x68\x75\x82\x8f\x9c\xa9\xb6\xc3"
6787 "\xd0\xdd\xea\xf7\x04\x11\x1e\x2b"
6788 "\x38\x45\x52\x5f\x6c\x79\x86\x93"
6789 "\xa0\xad\xba\xc7\xd4\xe1\xee\xfb"
6790 "\x08\x15\x22\x2f\x3c\x49\x56\x63"
6791 "\x70\x7d\x8a\x97\xa4\xb1\xbe\xcb"
6792 "\xd8\xe5\xf2\xff\x0c\x19\x26\x33"
6793 "\x40\x4d\x5a\x67\x74\x81\x8e\x9b"
6794 "\xa8\xb5\xc2\xcf\xdc\xe9\xf6\x03"
6795 "\x10\x1d\x2a\x37\x44\x51\x5e\x6b"
6796 "\x78\x85\x92\x9f\xac\xb9\xc6\xd3"
6797 "\xe0\xed\xfa\x07\x14\x21\x2e\x3b"
6798 "\x48\x55\x62\x6f\x7c\x89\x96\xa3"
6799 "\xb0\xbd\xca\xd7\xe4\xf1\xfe\x0b"
6800 "\x18\x25\x32\x3f\x4c\x59\x66\x73"
6801 "\x80\x8d\x9a\xa7\xb4\xc1\xce\xdb"
6802 "\xe8\xf5\x02\x0f\x1c\x29\x36\x43"
6803 "\x50\x5d\x6a\x77\x84\x91\x9e\xab"
6804 "\xb8\xc5\xd2\xdf\xec\xf9\x06\x13"
6805 "\x20\x2d\x3a\x47\x54\x61\x6e\x7b"
6806 "\x88\x95\xa2\xaf\xbc\xc9\xd6\xe3"
6807 "\xf0\xfd\x0a\x17\x24\x31\x3e\x4b"
6808 "\x58\x65\x72\x7f\x8c\x99\xa6\xb3"
6809 "\xc0\xcd\xda\xe7\xf4\x01\x0e\x1b"
6810 "\x28\x35\x42\x4f\x5c\x69\x76\x83"
6811 "\x90\x9d\xaa\xb7\xc4\xd1\xde\xeb"
6812 "\xf8\x05\x12\x1f\x2c\x39\x46\x53"
6813 "\x60\x6d\x7a\x87\x94\xa1\xae\xbb"
6814 "\xc8\xd5\xe2\xef\xfc\x09\x16\x23"
6815 "\x30\x3d\x4a\x57\x64\x71\x7e\x8b"
6816 "\x98\xa5\xb2\xbf\xcc\xd9\xe6\xf3"
6817 "\x00\x0f\x1e\x2d\x3c\x4b\x5a\x69"
6818 "\x78\x87\x96\xa5\xb4\xc3\xd2\xe1"
6819 "\xf0\xff\x0e\x1d\x2c\x3b\x4a\x59"
6820 "\x68\x77\x86\x95\xa4\xb3\xc2\xd1"
6821 "\xe0\xef\xfe\x0d\x1c\x2b\x3a\x49"
6822 "\x58\x67\x76\x85\x94\xa3\xb2\xc1"
6823 "\xd0\xdf\xee\xfd\x0c\x1b\x2a\x39"
6824 "\x48\x57\x66\x75\x84\x93\xa2\xb1"
6825 "\xc0\xcf\xde\xed\xfc\x0b\x1a\x29"
6826 "\x38\x47\x56\x65\x74\x83\x92\xa1"
6827 "\xb0\xbf\xce\xdd\xec\xfb\x0a\x19"
6828 "\x28\x37\x46\x55\x64\x73\x82\x91"
6829 "\xa0\xaf\xbe\xcd\xdc\xeb\xfa\x09"
6830 "\x18\x27\x36\x45\x54\x63\x72\x81"
6831 "\x90\x9f\xae\xbd\xcc\xdb\xea\xf9"
6832 "\x08\x17\x26\x35\x44\x53\x62\x71"
6833 "\x80\x8f\x9e\xad\xbc\xcb\xda\xe9"
6834 "\xf8\x07\x16\x25\x34\x43\x52\x61"
6835 "\x70\x7f\x8e\x9d\xac\xbb\xca\xd9"
6836 "\xe8\xf7\x06\x15\x24\x33\x42\x51"
6837 "\x60\x6f\x7e\x8d\x9c\xab\xba\xc9"
6838 "\xd8\xe7\xf6\x05\x14\x23\x32\x41"
6839 "\x50\x5f\x6e\x7d\x8c\x9b\xaa\xb9"
6840 "\xc8\xd7\xe6\xf5\x04\x13\x22\x31"
6841 "\x40\x4f\x5e\x6d\x7c\x8b\x9a\xa9"
6842 "\xb8\xc7\xd6\xe5\xf4\x03\x12\x21"
6843 "\x30\x3f\x4e\x5d\x6c\x7b\x8a\x99"
6844 "\xa8\xb7\xc6\xd5\xe4\xf3\x02\x11"
6845 "\x20\x2f\x3e\x4d\x5c\x6b\x7a\x89"
6846 "\x98\xa7\xb6\xc5\xd4\xe3\xf2\x01"
6847 "\x10\x1f\x2e\x3d\x4c\x5b\x6a\x79"
6848 "\x88\x97\xa6\xb5\xc4\xd3\xe2\xf1"
6849 "\x00\x11\x22\x33\x44\x55\x66\x77"
6850 "\x88\x99\xaa\xbb\xcc\xdd\xee\xff"
6851 "\x10\x21\x32\x43\x54\x65\x76\x87"
6852 "\x98\xa9\xba\xcb\xdc\xed\xfe\x0f"
6853 "\x20\x31\x42\x53\x64\x75\x86\x97"
6854 "\xa8\xb9\xca\xdb\xec\xfd\x0e\x1f"
6855 "\x30\x41\x52\x63\x74\x85\x96\xa7"
6856 "\xb8\xc9\xda\xeb\xfc\x0d\x1e\x2f"
6857 "\x40\x51\x62\x73\x84\x95\xa6\xb7"
6858 "\xc8\xd9\xea\xfb\x0c\x1d\x2e\x3f"
6859 "\x50\x61\x72\x83\x94\xa5\xb6\xc7"
6860 "\xd8\xe9\xfa\x0b\x1c\x2d\x3e\x4f"
6861 "\x60\x71\x82\x93\xa4\xb5\xc6\xd7"
6862 "\xe8\xf9\x0a\x1b\x2c\x3d\x4e\x5f"
6863 "\x70\x81\x92\xa3\xb4\xc5\xd6\xe7"
6864 "\xf8\x09\x1a\x2b\x3c\x4d\x5e\x6f"
6865 "\x80\x91\xa2\xb3\xc4\xd5\xe6\xf7"
6866 "\x08\x19\x2a\x3b\x4c\x5d\x6e\x7f"
6867 "\x90\xa1\xb2\xc3\xd4\xe5\xf6\x07"
6868 "\x18\x29\x3a\x4b\x5c\x6d\x7e\x8f"
6869 "\xa0\xb1\xc2\xd3\xe4\xf5\x06\x17"
6870 "\x28\x39\x4a\x5b\x6c\x7d\x8e\x9f"
6871 "\xb0\xc1\xd2\xe3\xf4\x05\x16\x27"
6872 "\x38\x49\x5a\x6b\x7c\x8d\x9e\xaf"
6873 "\xc0\xd1\xe2\xf3\x04\x15\x26\x37"
6874 "\x48\x59\x6a\x7b\x8c\x9d\xae\xbf"
6875 "\xd0\xe1\xf2\x03\x14\x25\x36\x47"
6876 "\x58\x69\x7a\x8b\x9c\xad\xbe\xcf"
6877 "\xe0\xf1\x02\x13\x24\x35\x46\x57"
6878 "\x68\x79\x8a\x9b\xac\xbd\xce\xdf"
6879 "\xf0\x01\x12\x23\x34\x45\x56\x67"
6880 "\x78\x89\x9a\xab\xbc\xcd\xde\xef"
6881 "\x00\x13\x26\x39\x4c\x5f\x72\x85"
6882 "\x98\xab\xbe\xd1\xe4\xf7\x0a\x1d"
6883 "\x30\x43\x56\x69\x7c\x8f\xa2\xb5"
6884 "\xc8\xdb\xee\x01\x14\x27\x3a\x4d"
6885 "\x60\x73\x86\x99\xac\xbf\xd2\xe5"
6886 "\xf8\x0b\x1e\x31\x44\x57\x6a\x7d"
6887 "\x90\xa3\xb6\xc9\xdc\xef\x02\x15"
6888 "\x28\x3b\x4e\x61\x74\x87\x9a\xad"
6889 "\xc0\xd3\xe6\xf9\x0c\x1f\x32\x45"
6890 "\x58\x6b\x7e\x91\xa4\xb7\xca\xdd"
6891 "\xf0\x03\x16\x29\x3c\x4f\x62\x75"
6892 "\x88\x9b\xae\xc1\xd4\xe7\xfa\x0d"
6893 "\x20\x33\x46\x59\x6c\x7f\x92\xa5"
6894 "\xb8\xcb\xde\xf1\x04\x17\x2a\x3d"
6895 "\x50\x63\x76\x89\x9c\xaf\xc2\xd5"
6896 "\xe8\xfb\x0e\x21\x34\x47\x5a\x6d"
6897 "\x80\x93\xa6\xb9\xcc\xdf\xf2\x05"
6898 "\x18\x2b\x3e\x51\x64\x77\x8a\x9d"
6899 "\xb0\xc3\xd6\xe9\xfc\x0f\x22\x35"
6900 "\x48\x5b\x6e\x81\x94\xa7\xba\xcd"
6901 "\xe0\xf3\x06\x19\x2c\x3f\x52\x65"
6902 "\x78\x8b\x9e\xb1\xc4\xd7\xea\xfd"
6903 "\x10\x23\x36\x49\x5c\x6f\x82\x95"
6904 "\xa8\xbb\xce\xe1\xf4\x07\x1a\x2d"
6905 "\x40\x53\x66\x79\x8c\x9f\xb2\xc5"
6906 "\xd8\xeb\xfe\x11\x24\x37\x4a\x5d"
6907 "\x70\x83\x96\xa9\xbc\xcf\xe2\xf5"
6908 "\x08\x1b\x2e\x41\x54\x67\x7a\x8d"
6909 "\xa0\xb3\xc6\xd9\xec\xff\x12\x25"
6910 "\x38\x4b\x5e\x71\x84\x97\xaa\xbd"
6911 "\xd0\xe3\xf6\x09\x1c\x2f\x42\x55"
6912 "\x68\x7b\x8e\xa1\xb4\xc7\xda\xed"
6913 "\x00\x15\x2a\x3f\x54\x69\x7e\x93"
6914 "\xa8\xbd\xd2\xe7\xfc\x11\x26\x3b"
6915 "\x50\x65\x7a\x8f\xa4\xb9\xce\xe3"
6916 "\xf8\x0d\x22\x37\x4c\x61\x76\x8b"
6917 "\xa0\xb5\xca\xdf\xf4\x09\x1e\x33"
6918 "\x48\x5d\x72\x87\x9c\xb1\xc6\xdb"
6919 "\xf0\x05\x1a\x2f\x44\x59\x6e\x83"
6920 "\x98\xad\xc2\xd7\xec\x01\x16\x2b"
6921 "\x40\x55\x6a\x7f\x94\xa9\xbe\xd3"
6922 "\xe8\xfd\x12\x27\x3c\x51\x66\x7b"
6923 "\x90\xa5\xba\xcf\xe4\xf9\x0e\x23"
6924 "\x38\x4d\x62\x77\x8c\xa1\xb6\xcb"
6925 "\xe0\xf5\x0a\x1f\x34\x49\x5e\x73"
6926 "\x88\x9d\xb2\xc7\xdc\xf1\x06\x1b"
6927 "\x30\x45\x5a\x6f\x84\x99\xae\xc3"
6928 "\xd8\xed\x02\x17\x2c\x41\x56\x6b"
6929 "\x80\x95\xaa\xbf\xd4\xe9\xfe\x13"
6930 "\x28\x3d\x52\x67\x7c\x91\xa6\xbb"
6931 "\xd0\xe5\xfa\x0f\x24\x39\x4e\x63"
6932 "\x78\x8d\xa2\xb7\xcc\xe1\xf6\x0b"
6933 "\x20\x35\x4a\x5f\x74\x89\x9e\xb3"
6934 "\xc8\xdd\xf2\x07\x1c\x31\x46\x5b"
6935 "\x70\x85\x9a\xaf\xc4\xd9\xee\x03"
6936 "\x18\x2d\x42\x57\x6c\x81\x96\xab"
6937 "\xc0\xd5\xea\xff\x14\x29\x3e\x53"
6938 "\x68\x7d\x92\xa7\xbc\xd1\xe6\xfb"
6939 "\x10\x25\x3a\x4f\x64\x79\x8e\xa3"
6940 "\xb8\xcd\xe2\xf7\x0c\x21\x36\x4b"
6941 "\x60\x75\x8a\x9f\xb4\xc9\xde\xf3"
6942 "\x08\x1d\x32\x47\x5c\x71\x86\x9b"
6943 "\xb0\xc5\xda\xef\x04\x19\x2e\x43"
6944 "\x58\x6d\x82\x97\xac\xc1\xd6\xeb"
6945 "\x00\x17\x2e\x45\x5c\x73\x8a\xa1"
6946 "\xb8\xcf\xe6\xfd\x14\x2b\x42\x59"
6947 "\x70\x87\x9e\xb5\xcc\xe3\xfa\x11"
6948 "\x28\x3f\x56\x6d\x84\x9b\xb2\xc9"
6949 "\xe0\xf7\x0e\x25\x3c\x53\x6a\x81"
6950 "\x98\xaf\xc6\xdd\xf4\x0b\x22\x39"
6951 "\x50\x67\x7e\x95\xac\xc3\xda\xf1"
6952 "\x08\x1f\x36\x4d\x64\x7b\x92\xa9"
6953 "\xc0\xd7\xee\x05\x1c\x33\x4a\x61"
6954 "\x78\x8f\xa6\xbd\xd4\xeb\x02\x19"
6955 "\x30\x47\x5e\x75\x8c\xa3\xba\xd1"
6956 "\xe8\xff\x16\x2d\x44\x5b\x72\x89"
6957 "\xa0\xb7\xce\xe5\xfc\x13\x2a\x41"
6958 "\x58\x6f\x86\x9d\xb4\xcb\xe2\xf9"
6959 "\x10\x27\x3e\x55\x6c\x83\x9a\xb1"
6960 "\xc8\xdf\xf6\x0d\x24\x3b\x52\x69"
6961 "\x80\x97\xae\xc5\xdc\xf3\x0a\x21"
6962 "\x38\x4f\x66\x7d\x94\xab\xc2\xd9"
6963 "\xf0\x07\x1e\x35\x4c\x63\x7a\x91"
6964 "\xa8\xbf\xd6\xed\x04\x1b\x32\x49"
6965 "\x60\x77\x8e\xa5\xbc\xd3\xea\x01"
6966 "\x18\x2f\x46\x5d\x74\x8b\xa2\xb9"
6967 "\xd0\xe7\xfe\x15\x2c\x43\x5a\x71"
6968 "\x88\x9f\xb6\xcd\xe4\xfb\x12\x29"
6969 "\x40\x57\x6e\x85\x9c\xb3\xca\xe1"
6970 "\xf8\x0f\x26\x3d\x54\x6b\x82\x99"
6971 "\xb0\xc7\xde\xf5\x0c\x23\x3a\x51"
6972 "\x68\x7f\x96\xad\xc4\xdb\xf2\x09"
6973 "\x20\x37\x4e\x65\x7c\x93\xaa\xc1"
6974 "\xd8\xef\x06\x1d\x34\x4b\x62\x79"
6975 "\x90\xa7\xbe\xd5\xec\x03\x1a\x31"
6976 "\x48\x5f\x76\x8d\xa4\xbb\xd2\xe9"
6977 "\x00\x19\x32\x4b\x64\x7d\x96\xaf"
6978 "\xc8\xe1\xfa\x13\x2c\x45\x5e\x77"
6979 "\x90\xa9\xc2\xdb\xf4\x0d\x26\x3f"
6980 "\x58\x71\x8a\xa3\xbc\xd5\xee\x07"
6981 "\x20\x39\x52\x6b\x84\x9d\xb6\xcf"
6982 "\xe8\x01\x1a\x33\x4c\x65\x7e\x97"
6983 "\xb0\xc9\xe2\xfb\x14\x2d\x46\x5f"
6984 "\x78\x91\xaa\xc3\xdc\xf5\x0e\x27"
6985 "\x40\x59\x72\x8b\xa4\xbd\xd6\xef"
6986 "\x08\x21\x3a\x53\x6c\x85\x9e\xb7"
6987 "\xd0\xe9\x02\x1b\x34\x4d\x66\x7f"
6988 "\x98\xb1\xca\xe3\xfc\x15\x2e\x47"
6989 "\x60\x79\x92\xab\xc4\xdd\xf6\x0f"
6990 "\x28\x41\x5a\x73\x8c\xa5\xbe\xd7"
6991 "\xf0\x09\x22\x3b\x54\x6d\x86\x9f"
6992 "\xb8\xd1\xea\x03\x1c\x35\x4e\x67"
6993 "\x80\x99\xb2\xcb\xe4\xfd\x16\x2f"
6994 "\x48\x61\x7a\x93\xac\xc5\xde\xf7"
6995 "\x10\x29\x42\x5b\x74\x8d\xa6\xbf"
6996 "\xd8\xf1\x0a\x23\x3c\x55\x6e\x87"
6997 "\xa0\xb9\xd2\xeb\x04\x1d\x36\x4f"
6998 "\x68\x81\x9a\xb3\xcc\xe5\xfe\x17"
6999 "\x30\x49\x62\x7b\x94\xad\xc6\xdf"
7000 "\xf8\x11\x2a\x43\x5c\x75\x8e\xa7"
7001 "\xc0\xd9\xf2\x0b\x24\x3d\x56\x6f"
7002 "\x88\xa1\xba\xd3\xec\x05\x1e\x37"
7003 "\x50\x69\x82\x9b\xb4\xcd\xe6\xff"
7004 "\x18\x31\x4a\x63\x7c\x95\xae\xc7"
7005 "\xe0\xf9\x12\x2b\x44\x5d\x76\x8f"
7006 "\xa8\xc1\xda\xf3\x0c\x25\x3e\x57"
7007 "\x70\x89\xa2\xbb\xd4\xed\x06\x1f"
7008 "\x38\x51\x6a\x83\x9c\xb5\xce\xe7"
7009 "\x00\x1b\x36\x51\x6c\x87\xa2\xbd"
7010 "\xd8\xf3\x0e\x29\x44\x5f\x7a\x95"
7011 "\xb0\xcb\xe6\x01\x1c\x37\x52\x6d"
7012 "\x88\xa3\xbe\xd9\xf4\x0f\x2a\x45"
7013 "\x60\x7b\x96\xb1\xcc\xe7\x02\x1d"
7014 "\x38\x53\x6e\x89\xa4\xbf\xda\xf5"
7015 "\x10\x2b\x46\x61\x7c\x97\xb2\xcd"
7016 "\xe8\x03\x1e\x39\x54\x6f\x8a\xa5"
7017 "\xc0\xdb\xf6\x11\x2c\x47\x62\x7d"
7018 "\x98\xb3\xce\xe9\x04\x1f\x3a\x55"
7019 "\x70\x8b\xa6\xc1\xdc\xf7\x12\x2d"
7020 "\x48\x63\x7e\x99\xb4\xcf\xea\x05"
7021 "\x20\x3b\x56\x71\x8c\xa7\xc2\xdd"
7022 "\xf8\x13\x2e\x49\x64\x7f\x9a\xb5"
7023 "\xd0\xeb\x06\x21\x3c\x57\x72\x8d"
7024 "\xa8\xc3\xde\xf9\x14\x2f\x4a\x65"
7025 "\x80\x9b\xb6\xd1\xec\x07\x22\x3d"
7026 "\x58\x73\x8e\xa9\xc4\xdf\xfa\x15"
7027 "\x30\x4b\x66\x81\x9c\xb7\xd2\xed"
7028 "\x08\x23\x3e\x59\x74\x8f\xaa\xc5"
7029 "\xe0\xfb\x16\x31\x4c\x67\x82\x9d"
7030 "\xb8\xd3\xee\x09\x24\x3f\x5a\x75"
7031 "\x90\xab\xc6\xe1\xfc\x17\x32\x4d"
7032 "\x68\x83\x9e\xb9\xd4\xef\x0a\x25"
7033 "\x40\x5b\x76\x91\xac\xc7\xe2\xfd"
7034 "\x18\x33\x4e\x69\x84\x9f\xba\xd5"
7035 "\xf0\x0b\x26\x41\x5c\x77\x92\xad"
7036 "\xc8\xe3\xfe\x19\x34\x4f\x6a\x85"
7037 "\xa0\xbb\xd6\xf1\x0c\x27\x42\x5d"
7038 "\x78\x93\xae\xc9\xe4\xff\x1a\x35"
7039 "\x50\x6b\x86\xa1\xbc\xd7\xf2\x0d"
7040 "\x28\x43\x5e\x79\x94\xaf\xca\xe5"
7041 "\x00\x1d\x3a\x57\x74\x91\xae\xcb"
7042 "\xe8\x05\x22\x3f\x5c\x79\x96\xb3"
7043 "\xd0\xed\x0a\x27\x44\x61\x7e\x9b"
7044 "\xb8\xd5\xf2\x0f\x2c\x49\x66\x83"
7045 "\xa0\xbd\xda\xf7\x14\x31\x4e\x6b"
7046 "\x88\xa5\xc2\xdf\xfc\x19\x36\x53"
7047 "\x70\x8d\xaa\xc7\xe4\x01\x1e\x3b"
7048 "\x58\x75\x92\xaf\xcc\xe9\x06\x23"
7049 "\x40\x5d\x7a\x97\xb4\xd1\xee\x0b"
7050 "\x28\x45\x62\x7f\x9c\xb9\xd6\xf3"
7051 "\x10\x2d\x4a\x67\x84\xa1\xbe\xdb"
7052 "\xf8\x15\x32\x4f\x6c\x89\xa6\xc3"
7053 "\xe0\xfd\x1a\x37\x54\x71\x8e\xab"
7054 "\xc8\xe5\x02\x1f\x3c\x59\x76\x93"
7055 "\xb0\xcd\xea\x07\x24\x41\x5e\x7b"
7056 "\x98\xb5\xd2\xef\x0c\x29\x46\x63"
7057 "\x80\x9d\xba\xd7\xf4\x11\x2e\x4b"
7058 "\x68\x85\xa2\xbf\xdc\xf9\x16\x33"
7059 "\x50\x6d\x8a\xa7\xc4\xe1\xfe\x1b"
7060 "\x38\x55\x72\x8f\xac\xc9\xe6\x03"
7061 "\x20\x3d\x5a\x77\x94\xb1\xce\xeb"
7062 "\x08\x25\x42\x5f\x7c\x99\xb6\xd3"
7063 "\xf0\x0d\x2a\x47\x64\x81\x9e\xbb"
7064 "\xd8\xf5\x12\x2f\x4c\x69\x86\xa3"
7065 "\xc0\xdd\xfa\x17\x34\x51\x6e\x8b"
7066 "\xa8\xc5\xe2\xff\x1c\x39\x56\x73"
7067 "\x90\xad\xca\xe7\x04\x21\x3e\x5b"
7068 "\x78\x95\xb2\xcf\xec\x09\x26\x43"
7069 "\x60\x7d\x9a\xb7\xd4\xf1\x0e\x2b"
7070 "\x48\x65\x82\x9f\xbc\xd9\xf6\x13"
7071 "\x30\x4d\x6a\x87\xa4\xc1\xde\xfb"
7072 "\x18\x35\x52\x6f\x8c\xa9\xc6\xe3"
7073 "\x00\x1f\x3e\x5d\x7c\x9b\xba\xd9"
7074 "\xf8\x17\x36\x55\x74\x93\xb2\xd1"
7075 "\xf0\x0f\x2e\x4d\x6c\x8b\xaa\xc9"
7076 "\xe8\x07\x26\x45\x64\x83\xa2\xc1"
7077 "\xe0\xff\x1e\x3d\x5c\x7b\x9a\xb9"
7078 "\xd8\xf7\x16\x35\x54\x73\x92\xb1"
7079 "\xd0\xef\x0e\x2d\x4c\x6b\x8a\xa9"
7080 "\xc8\xe7\x06\x25\x44\x63\x82\xa1"
7081 "\xc0\xdf\xfe\x1d\x3c\x5b\x7a\x99"
7082 "\xb8\xd7\xf6\x15\x34\x53\x72\x91"
7083 "\xb0\xcf\xee\x0d\x2c\x4b\x6a\x89"
7084 "\xa8\xc7\xe6\x05\x24\x43\x62\x81"
7085 "\xa0\xbf\xde\xfd\x1c\x3b\x5a\x79"
7086 "\x98\xb7\xd6\xf5\x14\x33\x52\x71"
7087 "\x90\xaf\xce\xed\x0c\x2b\x4a\x69"
7088 "\x88\xa7\xc6\xe5\x04\x23\x42\x61"
7089 "\x80\x9f\xbe\xdd\xfc\x1b\x3a\x59"
7090 "\x78\x97\xb6\xd5\xf4\x13\x32\x51"
7091 "\x70\x8f\xae\xcd\xec\x0b\x2a\x49"
7092 "\x68\x87\xa6\xc5\xe4\x03\x22\x41"
7093 "\x60\x7f\x9e\xbd\xdc\xfb\x1a\x39"
7094 "\x58\x77\x96\xb5\xd4\xf3\x12\x31"
7095 "\x50\x6f\x8e\xad\xcc\xeb\x0a\x29"
7096 "\x48\x67\x86\xa5\xc4\xe3\x02\x21"
7097 "\x40\x5f\x7e\x9d\xbc\xdb\xfa\x19"
7098 "\x38\x57\x76\x95\xb4\xd3\xf2\x11"
7099 "\x30\x4f\x6e\x8d\xac\xcb\xea\x09"
7100 "\x28\x47\x66\x85\xa4\xc3\xe2\x01"
7101 "\x20\x3f\x5e\x7d\x9c\xbb\xda\xf9"
7102 "\x18\x37\x56\x75\x94\xb3\xd2\xf1"
7103 "\x10\x2f\x4e\x6d\x8c\xab\xca\xe9"
7104 "\x08\x27\x46\x65\x84\xa3\xc2\xe1"
7105 "\x00\x21\x42\x63",
7106 .ilen = 4100,
7107 .result =
7108 "\xb5\x81\xf5\x64\x18\x73\xe3\xf0"
7109 "\x4c\x13\xf2\x77\x18\x60\x65\x5e"
7110 "\x29\x01\xce\x98\x55\x53\xf9\x0c"
7111 "\x2a\x08\xd5\x09\xb3\x57\x55\x56"
7112 "\xc5\xe9\x56\x90\xcb\x6a\xa3\xc0"
7113 "\xff\xc4\x79\xb4\xd2\x97\x5d\xc4"
7114 "\x43\xd1\xfe\x94\x7b\x88\x06\x5a"
7115 "\xb2\x9e\x2c\xfc\x44\x03\xb7\x90"
7116 "\xa0\xc1\xba\x6a\x33\xb8\xc7\xb2"
7117 "\x9d\xe1\x12\x4f\xc0\x64\xd4\x01"
7118 "\xfe\x8c\x7a\x66\xf7\xe6\x5a\x91"
7119 "\xbb\xde\x56\x86\xab\x65\x21\x30"
7120 "\x00\x84\x65\x24\xa5\x7d\x85\xb4"
7121 "\xe3\x17\xed\x3a\xb7\x6f\xb4\x0b"
7122 "\x0b\xaf\x15\xae\x5a\x8f\xf2\x0c"
7123 "\x2f\x27\xf4\x09\xd8\xd2\x96\xb7"
7124 "\x71\xf2\xc5\x99\x4d\x7e\x7f\x75"
7125 "\x77\x89\x30\x8b\x59\xdb\xa2\xb2"
7126 "\xa0\xf3\x19\x39\x2b\xc5\x7e\x3f"
7127 "\x4f\xd9\xd3\x56\x28\x97\x44\xdc"
7128 "\xc0\x8b\x77\x24\xd9\x52\xe7\xc5"
7129 "\xaf\xf6\x7d\x59\xb2\x44\x05\x1d"
7130 "\xb1\xb0\x11\xa5\x0f\xec\x33\xe1"
7131 "\x6d\x1b\x4e\x1f\xff\x57\x91\xb4"
7132 "\x5b\x9a\x96\xc5\x53\xbc\xae\x20"
7133 "\x3c\xbb\x14\xe2\xe8\x22\x33\xc1"
7134 "\x5e\x76\x9e\x46\x99\xf6\x2a\x15"
7135 "\xc6\x97\x02\xa0\x66\x43\xd1\xa6"
7136 "\x31\xa6\x9f\xfb\xf4\xd3\x69\xe5"
7137 "\xcd\x76\x95\xb8\x7a\x82\x7f\x21"
7138 "\x45\xff\x3f\xce\x55\xf6\x95\x10"
7139 "\x08\x77\x10\x43\xc6\xf3\x09\xe5"
7140 "\x68\xe7\x3c\xad\x00\x52\x45\x0d"
7141 "\xfe\x2d\xc6\xc2\x94\x8c\x12\x1d"
7142 "\xe6\x25\xae\x98\x12\x8e\x19\x9c"
7143 "\x81\x68\xb1\x11\xf6\x69\xda\xe3"
7144 "\x62\x08\x18\x7a\x25\x49\x28\xac"
7145 "\xba\x71\x12\x0b\xe4\xa2\xe5\xc7"
7146 "\x5d\x8e\xec\x49\x40\x21\xbf\x5a"
7147 "\x98\xf3\x02\x68\x55\x03\x7f\x8a"
7148 "\xe5\x94\x0c\x32\x5c\x07\x82\x63"
7149 "\xaf\x6f\x91\x40\x84\x8e\x52\x25"
7150 "\xd0\xb0\x29\x53\x05\xe2\x50\x7a"
7151 "\x34\xeb\xc9\x46\x20\xa8\x3d\xde"
7152 "\x7f\x16\x5f\x36\xc5\x2e\xdc\xd1"
7153 "\x15\x47\xc7\x50\x40\x6d\x91\xc5"
7154 "\xe7\x93\x95\x1a\xd3\x57\xbc\x52"
7155 "\x33\xee\x14\x19\x22\x52\x89\xa7"
7156 "\x4a\x25\x56\x77\x4b\xca\xcf\x0a"
7157 "\xe1\xf5\x35\x85\x30\x7e\x59\x4a"
7158 "\xbd\x14\x5b\xdf\xe3\x46\xcb\xac"
7159 "\x1f\x6c\x96\x0e\xf4\x81\xd1\x99"
7160 "\xca\x88\x63\x3d\x02\x58\x6b\xa9"
7161 "\xe5\x9f\xb3\x00\xb2\x54\xc6\x74"
7162 "\x1c\xbf\x46\xab\x97\xcc\xf8\x54"
7163 "\x04\x07\x08\x52\xe6\xc0\xda\x93"
7164 "\x74\x7d\x93\x99\x5d\x78\x68\xa6"
7165 "\x2e\x6b\xd3\x6a\x69\xcc\x12\x6b"
7166 "\xd4\xc7\xa5\xc6\xe7\xf6\x03\x04"
7167 "\x5d\xcd\x61\x5e\x17\x40\xdc\xd1"
7168 "\x5c\xf5\x08\xdf\x5c\x90\x85\xa4"
7169 "\xaf\xf6\x78\xbb\x0d\xf1\xf4\xa4"
7170 "\x54\x26\x72\x9e\x61\xfa\x86\xcf"
7171 "\xe8\x9e\xa1\xe0\xc7\x48\x23\xae"
7172 "\x5a\x90\xae\x75\x0a\x74\x18\x89"
7173 "\x05\xb1\x92\xb2\x7f\xd0\x1b\xa6"
7174 "\x62\x07\x25\x01\xc7\xc2\x4f\xf9"
7175 "\xe8\xfe\x63\x95\x80\x07\xb4\x26"
7176 "\xcc\xd1\x26\xb6\xc4\x3f\x9e\xcb"
7177 "\x8e\x3b\x2e\x44\x16\xd3\x10\x9a"
7178 "\x95\x08\xeb\xc8\xcb\xeb\xbf\x6f"
7179 "\x0b\xcd\x1f\xc8\xca\x86\xaa\xec"
7180 "\x33\xe6\x69\xf4\x45\x25\x86\x3a"
7181 "\x22\x94\x4f\x00\x23\x6a\x44\xc2"
7182 "\x49\x97\x33\xab\x36\x14\x0a\x70"
7183 "\x24\xc3\xbe\x04\x3b\x79\xa0\xf9"
7184 "\xb8\xe7\x76\x29\x22\x83\xd7\xf2"
7185 "\x94\xf4\x41\x49\xba\x5f\x7b\x07"
7186 "\xb5\xfb\xdb\x03\x1a\x9f\xb6\x4c"
7187 "\xc2\x2e\x37\x40\x49\xc3\x38\x16"
7188 "\xe2\x4f\x77\x82\xb0\x68\x4c\x71"
7189 "\x1d\x57\x61\x9c\xd9\x4e\x54\x99"
7190 "\x47\x13\x28\x73\x3c\xbb\x00\x90"
7191 "\xf3\x4d\xc9\x0e\xfd\xe7\xb1\x71"
7192 "\xd3\x15\x79\xbf\xcc\x26\x2f\xbd"
7193 "\xad\x6c\x50\x69\x6c\x3e\x6d\x80"
7194 "\x9a\xea\x78\xaf\x19\xb2\x0d\x4d"
7195 "\xad\x04\x07\xae\x22\x90\x4a\x93"
7196 "\x32\x0e\x36\x9b\x1b\x46\xba\x3b"
7197 "\xb4\xac\xc6\xd1\xa2\x31\x53\x3b"
7198 "\x2a\x3d\x45\xfe\x03\x61\x10\x85"
7199 "\x17\x69\xa6\x78\xcc\x6c\x87\x49"
7200 "\x53\xf9\x80\x10\xde\x80\xa2\x41"
7201 "\x6a\xc3\x32\x02\xad\x6d\x3c\x56"
7202 "\x00\x71\x51\x06\xa7\xbd\xfb\xef"
7203 "\x3c\xb5\x9f\xfc\x48\x7d\x53\x7c"
7204 "\x66\xb0\x49\x23\xc4\x47\x10\x0e"
7205 "\xe5\x6c\x74\x13\xe6\xc5\x3f\xaa"
7206 "\xde\xff\x07\x44\xdd\x56\x1b\xad"
7207 "\x09\x77\xfb\x5b\x12\xb8\x0d\x38"
7208 "\x17\x37\x35\x7b\x9b\xbc\xfe\xd4"
7209 "\x7e\x8b\xda\x7e\x5b\x04\xa7\x22"
7210 "\xa7\x31\xa1\x20\x86\xc7\x1b\x99"
7211 "\xdb\xd1\x89\xf4\x94\xa3\x53\x69"
7212 "\x8d\xe7\xe8\x74\x11\x8d\x74\xd6"
7213 "\x07\x37\x91\x9f\xfd\x67\x50\x3a"
7214 "\xc9\xe1\xf4\x36\xd5\xa0\x47\xd1"
7215 "\xf9\xe5\x39\xa3\x31\xac\x07\x36"
7216 "\x23\xf8\x66\x18\x14\x28\x34\x0f"
7217 "\xb8\xd0\xe7\x29\xb3\x04\x4b\x55"
7218 "\x01\x41\xb2\x75\x8d\xcb\x96\x85"
7219 "\x3a\xfb\xab\x2b\x9e\xfa\x58\x20"
7220 "\x44\x1f\xc0\x14\x22\x75\x61\xe8"
7221 "\xaa\x19\xcf\xf1\x82\x56\xf4\xd7"
7222 "\x78\x7b\x3d\x5f\xb3\x9e\x0b\x8a"
7223 "\x57\x50\xdb\x17\x41\x65\x4d\xa3"
7224 "\x02\xc9\x9c\x9c\x53\xfb\x39\x39"
7225 "\x9b\x1d\x72\x24\xda\xb7\x39\xbe"
7226 "\x13\x3b\xfa\x29\xda\x9e\x54\x64"
7227 "\x6e\xba\xd8\xa1\xcb\xb3\x36\xfa"
7228 "\xcb\x47\x85\xe9\x61\x38\xbc\xbe"
7229 "\xc5\x00\x38\x2a\x54\xf7\xc4\xb9"
7230 "\xb3\xd3\x7b\xa0\xa0\xf8\x72\x7f"
7231 "\x8c\x8e\x82\x0e\xc6\x1c\x75\x9d"
7232 "\xca\x8e\x61\x87\xde\xad\x80\xd2"
7233 "\xf5\xf9\x80\xef\x15\x75\xaf\xf5"
7234 "\x80\xfb\xff\x6d\x1e\x25\xb7\x40"
7235 "\x61\x6a\x39\x5a\x6a\xb5\x31\xab"
7236 "\x97\x8a\x19\x89\x44\x40\xc0\xa6"
7237 "\xb4\x4e\x30\x32\x7b\x13\xe7\x67"
7238 "\xa9\x8b\x57\x04\xc2\x01\xa6\xf4"
7239 "\x28\x99\xad\x2c\x76\xa3\x78\xc2"
7240 "\x4a\xe6\xca\x5c\x50\x6a\xc1\xb0"
7241 "\x62\x4b\x10\x8e\x7c\x17\x43\xb3"
7242 "\x17\x66\x1c\x3e\x8d\x69\xf0\x5a"
7243 "\x71\xf5\x97\xdc\xd1\x45\xdd\x28"
7244 "\xf3\x5d\xdf\x53\x7b\x11\xe5\xbc"
7245 "\x4c\xdb\x1b\x51\x6b\xe9\xfb\x3d"
7246 "\xc1\xc3\x2c\xb9\x71\xf5\xb6\xb2"
7247 "\x13\x36\x79\x80\x53\xe8\xd3\xa6"
7248 "\x0a\xaf\xfd\x56\x97\xf7\x40\x8e"
7249 "\x45\xce\xf8\xb0\x9e\x5c\x33\x82"
7250 "\xb0\x44\x56\xfc\x05\x09\xe9\x2a"
7251 "\xac\x26\x80\x14\x1d\xc8\x3a\x35"
7252 "\x4c\x82\x97\xfd\x76\xb7\xa9\x0a"
7253 "\x35\x58\x79\x8e\x0f\x66\xea\xaf"
7254 "\x51\x6c\x09\xa9\x6e\x9b\xcb\x9a"
7255 "\x31\x47\xa0\x2f\x7c\x71\xb4\x4a"
7256 "\x11\xaa\x8c\x66\xc5\x64\xe6\x3a"
7257 "\x54\xda\x24\x6a\xc4\x41\x65\x46"
7258 "\x82\xa0\x0a\x0f\x5f\xfb\x25\xd0"
7259 "\x2c\x91\xa7\xee\xc4\x81\x07\x86"
7260 "\x75\x5e\x33\x69\x97\xe4\x2c\xa8"
7261 "\x9d\x9f\x0b\x6a\xbe\xad\x98\xda"
7262 "\x6d\x94\x41\xda\x2c\x1e\x89\xc4"
7263 "\xc2\xaf\x1e\x00\x05\x0b\x83\x60"
7264 "\xbd\x43\xea\x15\x23\x7f\xb9\xac"
7265 "\xee\x4f\x2c\xaf\x2a\xf3\xdf\xd0"
7266 "\xf3\x19\x31\xbb\x4a\x74\x84\x17"
7267 "\x52\x32\x2c\x7d\x61\xe4\xcb\xeb"
7268 "\x80\x38\x15\x52\xcb\x6f\xea\xe5"
7269 "\x73\x9c\xd9\x24\x69\xc6\x95\x32"
7270 "\x21\xc8\x11\xe4\xdc\x36\xd7\x93"
7271 "\x38\x66\xfb\xb2\x7f\x3a\xb9\xaf"
7272 "\x31\xdd\x93\x75\x78\x8a\x2c\x94"
7273 "\x87\x1a\x58\xec\x9e\x7d\x4d\xba"
7274 "\xe1\xe5\x4d\xfc\xbc\xa4\x2a\x14"
7275 "\xef\xcc\xa7\xec\xab\x43\x09\x18"
7276 "\xd3\xab\x68\xd1\x07\x99\x44\x47"
7277 "\xd6\x83\x85\x3b\x30\xea\xa9\x6b"
7278 "\x63\xea\xc4\x07\xfb\x43\x2f\xa4"
7279 "\xaa\xb0\xab\x03\x89\xce\x3f\x8c"
7280 "\x02\x7c\x86\x54\xbc\x88\xaf\x75"
7281 "\xd2\xdc\x63\x17\xd3\x26\xf6\x96"
7282 "\xa9\x3c\xf1\x61\x8c\x11\x18\xcc"
7283 "\xd6\xea\x5b\xe2\xcd\xf0\xf1\xb2"
7284 "\xe5\x35\x90\x1f\x85\x4c\x76\x5b"
7285 "\x66\xce\x44\xa4\x32\x9f\xe6\x7b"
7286 "\x71\x6e\x9f\x58\x15\x67\x72\x87"
7287 "\x64\x8e\x3a\x44\x45\xd4\x76\xfa"
7288 "\xc2\xf6\xef\x85\x05\x18\x7a\x9b"
7289 "\xba\x41\x54\xac\xf0\xfc\x59\x12"
7290 "\x3f\xdf\xa0\xe5\x8a\x65\xfd\x3a"
7291 "\x62\x8d\x83\x2c\x03\xbe\x05\x76"
7292 "\x2e\x53\x49\x97\x94\x33\xae\x40"
7293 "\x81\x15\xdb\x6e\xad\xaa\xf5\x4b"
7294 "\xe3\x98\x70\xdf\xe0\x7c\xcd\xdb"
7295 "\x02\xd4\x7d\x2f\xc1\xe6\xb4\xf3"
7296 "\xd7\x0d\x7a\xd9\x23\x9e\x87\x2d"
7297 "\xce\x87\xad\xcc\x72\x05\x00\x29"
7298 "\xdc\x73\x7f\x64\xc1\x15\x0e\xc2"
7299 "\xdf\xa7\x5f\xeb\x41\xa1\xcd\xef"
7300 "\x5c\x50\x79\x2a\x56\x56\x71\x8c"
7301 "\xac\xc0\x79\x50\x69\xca\x59\x32"
7302 "\x65\xf2\x54\xe4\x52\x38\x76\xd1"
7303 "\x5e\xde\x26\x9e\xfb\x75\x2e\x11"
7304 "\xb5\x10\xf4\x17\x73\xf5\x89\xc7"
7305 "\x4f\x43\x5c\x8e\x7c\xb9\x05\x52"
7306 "\x24\x40\x99\xfe\x9b\x85\x0b\x6c"
7307 "\x22\x3e\x8b\xae\x86\xa1\xd2\x79"
7308 "\x05\x68\x6b\xab\xe3\x41\x49\xed"
7309 "\x15\xa1\x8d\x40\x2d\x61\xdf\x1a"
7310 "\x59\xc9\x26\x8b\xef\x30\x4c\x88"
7311 "\x4b\x10\xf8\x8d\xa6\x92\x9f\x4b"
7312 "\xf3\xc4\x53\x0b\x89\x5d\x28\x92"
7313 "\xcf\x78\xb2\xc0\x5d\xed\x7e\xfc"
7314 "\xc0\x12\x23\x5f\x5a\x78\x86\x43"
7315 "\x6e\x27\xf7\x5a\xa7\x6a\xed\x19"
7316 "\x04\xf0\xb3\x12\xd1\xbd\x0e\x89"
7317 "\x6e\xbc\x96\xa8\xd8\x49\x39\x9f"
7318 "\x7e\x67\xf0\x2e\x3e\x01\xa9\xba"
7319 "\xec\x8b\x62\x8e\xcb\x4a\x70\x43"
7320 "\xc7\xc2\xc4\xca\x82\x03\x73\xe9"
7321 "\x11\xdf\xcf\x54\xea\xc9\xb0\x95"
7322 "\x51\xc0\x13\x3d\x92\x05\xfa\xf4"
7323 "\xa9\x34\xc8\xce\x6c\x3d\x54\xcc"
7324 "\xc4\xaf\xf1\xdc\x11\x44\x26\xa2"
7325 "\xaf\xf1\x85\x75\x7d\x03\x61\x68"
7326 "\x4e\x78\xc6\x92\x7d\x86\x7d\x77"
7327 "\xdc\x71\x72\xdb\xc6\xae\xa1\xcb"
7328 "\x70\x9a\x0b\x19\xbe\x4a\x6c\x2a"
7329 "\xe2\xba\x6c\x64\x9a\x13\x28\xdf"
7330 "\x85\x75\xe6\x43\xf6\x87\x08\x68"
7331 "\x6e\xba\x6e\x79\x9f\x04\xbc\x23"
7332 "\x50\xf6\x33\x5c\x1f\x24\x25\xbe"
7333 "\x33\x47\x80\x45\x56\xa3\xa7\xd7"
7334 "\x7a\xb1\x34\x0b\x90\x3c\x9c\xad"
7335 "\x44\x5f\x9e\x0e\x9d\xd4\xbd\x93"
7336 "\x5e\xfa\x3c\xe0\xb0\xd9\xed\xf3"
7337 "\xd6\x2e\xff\x24\xd8\x71\x6c\xed"
7338 "\xaf\x55\xeb\x22\xac\x93\x68\x32"
7339 "\x05\x5b\x47\xdd\xc6\x4a\xcb\xc7"
7340 "\x10\xe1\x3c\x92\x1a\xf3\x23\x78"
7341 "\x2b\xa1\xd2\x80\xf4\x12\xb1\x20"
7342 "\x8f\xff\x26\x35\xdd\xfb\xc7\x4e"
7343 "\x78\xf1\x2d\x50\x12\x77\xa8\x60"
7344 "\x7c\x0f\xf5\x16\x2f\x63\x70\x2a"
7345 "\xc0\x96\x80\x4e\x0a\xb4\x93\x35"
7346 "\x5d\x1d\x3f\x56\xf7\x2f\xbb\x90"
7347 "\x11\x16\x8f\xa2\xec\x47\xbe\xac"
7348 "\x56\x01\x26\x56\xb1\x8c\xb2\x10"
7349 "\xf9\x1a\xca\xf5\xd1\xb7\x39\x20"
7350 "\x63\xf1\x69\x20\x4f\x13\x12\x1f"
7351 "\x5b\x65\xfc\x98\xf7\xc4\x7a\xbe"
7352 "\xf7\x26\x4d\x2b\x84\x7b\x42\xad"
7353 "\xd8\x7a\x0a\xb4\xd8\x74\xbf\xc1"
7354 "\xf0\x6e\xb4\x29\xa3\xbb\xca\x46"
7355 "\x67\x70\x6a\x2d\xce\x0e\xa2\x8a"
7356 "\xa9\x87\xbf\x05\xc4\xc1\x04\xa3"
7357 "\xab\xd4\x45\x43\x8c\xb6\x02\xb0"
7358 "\x41\xc8\xfc\x44\x3d\x59\xaa\x2e"
7359 "\x44\x21\x2a\x8d\x88\x9d\x57\xf4"
7360 "\xa0\x02\x77\xb8\xa6\xa0\xe6\x75"
7361 "\x5c\x82\x65\x3e\x03\x5c\x29\x8f"
7362 "\x38\x55\xab\x33\x26\xef\x9f\x43"
7363 "\x52\xfd\x68\xaf\x36\xb4\xbb\x9a"
7364 "\x58\x09\x09\x1b\xc3\x65\x46\x46"
7365 "\x1d\xa7\x94\x18\x23\x50\x2c\xca"
7366 "\x2c\x55\x19\x97\x01\x9d\x93\x3b"
7367 "\x63\x86\xf2\x03\x67\x45\xd2\x72"
7368 "\x28\x52\x6c\xf4\xe3\x1c\xb5\x11"
7369 "\x13\xf1\xeb\x21\xc7\xd9\x56\x82"
7370 "\x2b\x82\x39\xbd\x69\x54\xed\x62"
7371 "\xc3\xe2\xde\x73\xd4\x6a\x12\xae"
7372 "\x13\x21\x7f\x4b\x5b\xfc\xbf\xe8"
7373 "\x2b\xbe\x56\xba\x68\x8b\x9a\xb1"
7374 "\x6e\xfa\xbf\x7e\x5a\x4b\xf1\xac"
7375 "\x98\x65\x85\xd1\x93\x53\xd3\x7b"
7376 "\x09\xdd\x4b\x10\x6d\x84\xb0\x13"
7377 "\x65\xbd\xcf\x52\x09\xc4\x85\xe2"
7378 "\x84\x74\x15\x65\xb7\xf7\x51\xaf"
7379 "\x55\xad\xa4\xd1\x22\x54\x70\x94"
7380 "\xa0\x1c\x90\x41\xfd\x99\xd7\x5a"
7381 "\x31\xef\xaa\x25\xd0\x7f\x4f\xea"
7382 "\x1d\x55\x42\xe5\x49\xb0\xd0\x46"
7383 "\x62\x36\x43\xb2\x82\x15\x75\x50"
7384 "\xa4\x72\xeb\x54\x27\x1f\x8a\xe4"
7385 "\x7d\xe9\x66\xc5\xf1\x53\xa4\xd1"
7386 "\x0c\xeb\xb8\xf8\xbc\xd4\xe2\xe7"
7387 "\xe1\xf8\x4b\xcb\xa9\xa1\xaf\x15"
7388 "\x83\xcb\x72\xd0\x33\x79\x00\x2d"
7389 "\x9f\xd7\xf1\x2e\x1e\x10\xe4\x45"
7390 "\xc0\x75\x3a\x39\xea\x68\xf7\x5d"
7391 "\x1b\x73\x8f\xe9\x8e\x0f\x72\x47"
7392 "\xae\x35\x0a\x31\x7a\x14\x4d\x4a"
7393 "\x6f\x47\xf7\x7e\x91\x6e\x74\x8b"
7394 "\x26\x47\xf9\xc3\xf9\xde\x70\xf5"
7395 "\x61\xab\xa9\x27\x9f\x82\xe4\x9c"
7396 "\x89\x91\x3f\x2e\x6a\xfd\xb5\x49"
7397 "\xe9\xfd\x59\x14\x36\x49\x40\x6d"
7398 "\x32\xd8\x85\x42\xf3\xa5\xdf\x0c"
7399 "\xa8\x27\xd7\x54\xe2\x63\x2f\xf2"
7400 "\x7e\x8b\x8b\xe7\xf1\x9a\x95\x35"
7401 "\x43\xdc\x3a\xe4\xb6\xf4\xd0\xdf"
7402 "\x9c\xcb\x94\xf3\x21\xa0\x77\x50"
7403 "\xe2\xc6\xc4\xc6\x5f\x09\x64\x5b"
7404 "\x92\x90\xd8\xe1\xd1\xed\x4b\x42"
7405 "\xd7\x37\xaf\x65\x3d\x11\x39\xb6"
7406 "\x24\x8a\x60\xae\xd6\x1e\xbf\x0e"
7407 "\x0d\xd7\xdc\x96\x0e\x65\x75\x4e"
7408 "\x29\x06\x9d\xa4\x51\x3a\x10\x63"
7409 "\x8f\x17\x07\xd5\x8e\x3c\xf4\x28"
7410 "\x00\x5a\x5b\x05\x19\xd8\xc0\x6c"
7411 "\xe5\x15\xe4\x9c\x9d\x71\x9d\x5e"
7412 "\x94\x29\x1a\xa7\x80\xfa\x0e\x33"
7413 "\x03\xdd\xb7\x3e\x9a\xa9\x26\x18"
7414 "\x37\xa9\x64\x08\x4d\x94\x5a\x88"
7415 "\xca\x35\xce\x81\x02\xe3\x1f\x1b"
7416 "\x89\x1a\x77\x85\xe3\x41\x6d\x32"
7417 "\x42\x19\x23\x7d\xc8\x73\xee\x25"
7418 "\x85\x0d\xf8\x31\x25\x79\x1b\x6f"
7419 "\x79\x25\xd2\xd8\xd4\x23\xfd\xf7"
7420 "\x82\x36\x6a\x0c\x46\x22\x15\xe9"
7421 "\xff\x72\x41\x91\x91\x7d\x3a\xb7"
7422 "\xdd\x65\x99\x70\xf6\x8d\x84\xf8"
7423 "\x67\x15\x20\x11\xd6\xb2\x55\x7b"
7424 "\xdb\x87\xee\xef\x55\x89\x2a\x59"
7425 "\x2b\x07\x8f\x43\x8a\x59\x3c\x01"
7426 "\x8b\x65\x54\xa1\x66\xd5\x38\xbd"
7427 "\xc6\x30\xa9\xcc\x49\xb6\xa8\x1b"
7428 "\xb8\xc0\x0e\xe3\x45\x28\xe2\xff"
7429 "\x41\x9f\x7e\x7c\xd1\xae\x9e\x25"
7430 "\x3f\x4c\x7c\x7c\xf4\xa8\x26\x4d"
7431 "\x5c\xfd\x4b\x27\x18\xf9\x61\x76"
7432 "\x48\xba\x0c\x6b\xa9\x4d\xfc\xf5"
7433 "\x3b\x35\x7e\x2f\x4a\xa9\xc2\x9a"
7434 "\xae\xab\x86\x09\x89\xc9\xc2\x40"
7435 "\x39\x2c\x81\xb3\xb8\x17\x67\xc2"
7436 "\x0d\x32\x4a\x3a\x67\x81\xd7\x1a"
7437 "\x34\x52\xc5\xdb\x0a\xf5\x63\x39"
7438 "\xea\x1f\xe1\x7c\xa1\x9e\xc1\x35"
7439 "\xe3\xb1\x18\x45\x67\xf9\x22\x38"
7440 "\x95\xd9\x34\x34\x86\xc6\x41\x94"
7441 "\x15\xf9\x5b\x41\xa6\x87\x8b\xf8"
7442 "\xd5\xe1\x1b\xe2\x5b\xf3\x86\x10"
7443 "\xff\xe6\xae\x69\x76\xbc\x0d\xb4"
7444 "\x09\x90\x0c\xa2\x65\x0c\xad\x74"
7445 "\xf5\xd7\xff\xda\xc1\xce\x85\xbe"
7446 "\x00\xa7\xff\x4d\x2f\x65\xd3\x8c"
7447 "\x86\x2d\x05\xe8\xed\x3e\x6b\x8b"
7448 "\x0f\x3d\x83\x8c\xf1\x1d\x5b\x96"
7449 "\x2e\xb1\x9c\xc2\x98\xe1\x70\xb9"
7450 "\xba\x5c\x8a\x43\xd6\x34\xa7\x2d"
7451 "\xc9\x92\xae\xf2\xa5\x7b\x05\x49"
7452 "\xa7\x33\x34\x86\xca\xe4\x96\x23"
7453 "\x76\x5b\xf2\xc6\xf1\x51\x28\x42"
7454 "\x7b\xcc\x76\x8f\xfa\xa2\xad\x31"
7455 "\xd4\xd6\x7a\x6d\x25\x25\x54\xe4"
7456 "\x3f\x50\x59\xe1\x5c\x05\xb7\x27"
7457 "\x48\xbf\x07\xec\x1b\x13\xbe\x2b"
7458 "\xa1\x57\x2b\xd5\xab\xd7\xd0\x4c"
7459 "\x1e\xcb\x71\x9b\xc5\x90\x85\xd3"
7460 "\xde\x59\xec\x71\xeb\x89\xbb\xd0"
7461 "\x09\x50\xe1\x16\x3f\xfd\x1c\x34"
7462 "\xc3\x1c\xa1\x10\x77\x53\x98\xef"
7463 "\xf2\xfd\xa5\x01\x59\xc2\x9b\x26"
7464 "\xc7\x42\xd9\x49\xda\x58\x2b\x6e"
7465 "\x9f\x53\x19\x76\x7e\xd9\xc9\x0e"
7466 "\x68\xc8\x7f\x51\x22\x42\xef\x49"
7467 "\xa4\x55\xb6\x36\xac\x09\xc7\x31"
7468 "\x88\x15\x4b\x2e\x8f\x3a\x08\xf7"
7469 "\xd8\xf7\xa8\xc5\xa9\x33\xa6\x45"
7470 "\xe4\xc4\x94\x76\xf3\x0d\x8f\x7e"
7471 "\xc8\xf6\xbc\x23\x0a\xb6\x4c\xd3"
7472 "\x6a\xcd\x36\xc2\x90\x5c\x5c\x3c"
7473 "\x65\x7b\xc2\xd6\xcc\xe6\x0d\x87"
7474 "\x73\x2e\x71\x79\x16\x06\x63\x28"
7475 "\x09\x15\xd8\x89\x38\x38\x3d\xb5"
7476 "\x42\x1c\x08\x24\xf7\x2a\xd2\x9d"
7477 "\xc8\xca\xef\xf9\x27\xd8\x07\x86"
7478 "\xf7\x43\x0b\x55\x15\x3f\x9f\x83"
7479 "\xef\xdc\x49\x9d\x2a\xc1\x54\x62"
7480 "\xbd\x9b\x66\x55\x9f\xb7\x12\xf3"
7481 "\x1b\x4d\x9d\x2a\x5c\xed\x87\x75"
7482 "\x87\x26\xec\x61\x2c\xb4\x0f\x89"
7483 "\xb0\xfb\x2e\x68\x5d\x15\xc7\x8d"
7484 "\x2e\xc0\xd9\xec\xaf\x4f\xd2\x25"
7485 "\x29\xe8\xd2\x26\x2b\x67\xe9\xfc"
7486 "\x2b\xa8\x67\x96\x12\x1f\x5b\x96"
7487 "\xc6\x14\x53\xaf\x44\xea\xd6\xe2"
7488 "\x94\x98\xe4\x12\x93\x4c\x92\xe0"
7489 "\x18\xa5\x8d\x2d\xe4\x71\x3c\x47"
7490 "\x4c\xf7\xe6\x47\x9e\xc0\x68\xdf"
7491 "\xd4\xf5\x5a\x74\xb1\x2b\x29\x03"
7492 "\x19\x07\xaf\x90\x62\x5c\x68\x98"
7493 "\x48\x16\x11\x02\x9d\xee\xb4\x9b"
7494 "\xe5\x42\x7f\x08\xfd\x16\x32\x0b"
7495 "\xd0\xb3\xfa\x2b\xb7\x99\xf9\x29"
7496 "\xcd\x20\x45\x9f\xb3\x1a\x5d\xa2"
7497 "\xaf\x4d\xe0\xbd\x42\x0d\xbc\x74"
7498 "\x99\x9c\x8e\x53\x1a\xb4\x3e\xbd"
7499 "\xa2\x9a\x2d\xf7\xf8\x39\x0f\x67"
7500 "\x63\xfc\x6b\xc0\xaf\xb3\x4b\x4f"
7501 "\x55\xc4\xcf\xa7\xc8\x04\x11\x3e"
7502 "\x14\x32\xbb\x1b\x38\x77\xd6\x7f"
7503 "\x54\x4c\xdf\x75\xf3\x07\x2d\x33"
7504 "\x9b\xa8\x20\xe1\x7b\x12\xb5\xf3"
7505 "\xef\x2f\xce\x72\xe5\x24\x60\xc1"
7506 "\x30\xe2\xab\xa1\x8e\x11\x09\xa8"
7507 "\x21\x33\x44\xfe\x7f\x35\x32\x93"
7508 "\x39\xa7\xad\x8b\x79\x06\xb2\xcb"
7509 "\x4e\xa9\x5f\xc7\xba\x74\x29\xec"
7510 "\x93\xa0\x4e\x54\x93\xc0\xbc\x55"
7511 "\x64\xf0\x48\xe5\x57\x99\xee\x75"
7512 "\xd6\x79\x0f\x66\xb7\xc6\x57\x76"
7513 "\xf7\xb7\xf3\x9c\xc5\x60\xe8\x7f"
7514 "\x83\x76\xd6\x0e\xaa\xe6\x90\x39"
7515 "\x1d\xa6\x32\x6a\x34\xe3\x55\xf8"
7516 "\x58\xa0\x58\x7d\x33\xe0\x22\x39"
7517 "\x44\x64\x87\x86\x5a\x2f\xa7\x7e"
7518 "\x0f\x38\xea\xb0\x30\xcc\x61\xa5"
7519 "\x6a\x32\xae\x1e\xf7\xe9\xd0\xa9"
7520 "\x0c\x32\x4b\xb5\x49\x28\xab\x85"
7521 "\x2f\x8e\x01\x36\x38\x52\xd0\xba"
7522 "\xd6\x02\x78\xf8\x0e\x3e\x9c\x8b"
7523 "\x6b\x45\x99\x3f\x5c\xfe\x58\xf1"
7524 "\x5c\x94\x04\xe1\xf5\x18\x6d\x51"
7525 "\xb2\x5d\x18\x20\xb6\xc2\x9a\x42"
7526 "\x1d\xb3\xab\x3c\xb6\x3a\x13\x03"
7527 "\xb2\x46\x82\x4f\xfc\x64\xbc\x4f"
7528 "\xca\xfa\x9c\xc0\xd5\xa7\xbd\x11"
7529 "\xb7\xe4\x5a\xf6\x6f\x4d\x4d\x54"
7530 "\xea\xa4\x98\x66\xd4\x22\x3b\xd3"
7531 "\x8f\x34\x47\xd9\x7c\xf4\x72\x3b"
7532 "\x4d\x02\x77\xf6\xd6\xdd\x08\x0a"
7533 "\x81\xe1\x86\x89\x3e\x56\x10\x3c"
7534 "\xba\xd7\x81\x8c\x08\xbc\x8b\xe2"
7535 "\x53\xec\xa7\x89\xee\xc8\x56\xb5"
7536 "\x36\x2c\xb2\x03\xba\x99\xdd\x7c"
7537 "\x48\xa0\xb0\xbc\x91\x33\xe9\xa8"
7538 "\xcb\xcd\xcf\x59\x5f\x1f\x15\xe2"
7539 "\x56\xf5\x4e\x01\x35\x27\x45\x77"
7540 "\x47\xc8\xbc\xcb\x7e\x39\xc1\x97"
7541 "\x28\xd3\x84\xfc\x2c\x3e\xc8\xad"
7542 "\x9c\xf8\x8a\x61\x9c\x28\xaa\xc5"
7543 "\x99\x20\x43\x85\x9d\xa5\xe2\x8b"
7544 "\xb8\xae\xeb\xd0\x32\x0d\x52\x78"
7545 "\x09\x56\x3f\xc7\xd8\x7e\x26\xfc"
7546 "\x37\xfb\x6f\x04\xfc\xfa\x92\x10"
7547 "\xac\xf8\x3e\x21\xdc\x8c\x21\x16"
7548 "\x7d\x67\x6e\xf6\xcd\xda\xb6\x98"
7549 "\x23\xab\x23\x3c\xb2\x10\xa0\x53"
7550 "\x5a\x56\x9f\xc5\xd0\xff\xbb\xe4"
7551 "\x98\x3c\x69\x1e\xdb\x38\x8f\x7e"
7552 "\x0f\xd2\x98\x88\x81\x8b\x45\x67"
7553 "\xea\x33\xf1\xeb\xe9\x97\x55\x2e"
7554 "\xd9\xaa\xeb\x5a\xec\xda\xe1\x68"
7555 "\xa8\x9d\x3c\x84\x7c\x05\x3d\x62"
7556 "\x87\x8f\x03\x21\x28\x95\x0c\x89"
7557 "\x25\x22\x4a\xb0\x93\xa9\x50\xa2"
7558 "\x2f\x57\x6e\x18\x42\x19\x54\x0c"
7559 "\x55\x67\xc6\x11\x49\xf4\x5c\xd2"
7560 "\xe9\x3d\xdd\x8b\x48\x71\x21\x00"
7561 "\xc3\x9a\x6c\x85\x74\x28\x83\x4a"
7562 "\x1b\x31\x05\xe1\x06\x92\xe7\xda"
7563 "\x85\x73\x78\x45\x20\x7f\xae\x13"
7564 "\x7c\x33\x06\x22\xf4\x83\xf9\x35"
7565 "\x3f\x6c\x71\xa8\x4e\x48\xbe\x9b"
7566 "\xce\x8a\xba\xda\xbe\x28\x08\xf7"
7567 "\xe2\x14\x8c\x71\xea\x72\xf9\x33"
7568 "\xf2\x88\x3f\xd7\xbb\x69\x6c\x29"
7569 "\x19\xdc\x84\xce\x1f\x12\x4f\xc8"
7570 "\xaf\xa5\x04\xba\x5a\xab\xb0\xd9"
7571 "\x14\x1f\x6c\x68\x98\x39\x89\x7a"
7572 "\xd9\xd8\x2f\xdf\xa8\x47\x4a\x25"
7573 "\xe2\xfb\x33\xf4\x59\x78\xe1\x68"
7574 "\x85\xcf\xfe\x59\x20\xd4\x05\x1d"
7575 "\x80\x99\xae\xbc\xca\xae\x0f\x2f"
7576 "\x65\x43\x34\x8e\x7e\xac\xd3\x93"
7577 "\x2f\xac\x6d\x14\x3d\x02\x07\x70"
7578 "\x9d\xa4\xf3\x1b\x5c\x36\xfc\x01"
7579 "\x73\x34\x85\x0c\x6c\xd6\xf1\xbd"
7580 "\x3f\xdf\xee\xf5\xd9\xba\x56\xef"
7581 "\xf4\x9b\x6b\xee\x9f\x5a\x78\x6d"
7582 "\x32\x19\xf4\xf7\xf8\x4c\x69\x0b"
7583 "\x4b\xbc\xbb\xb7\xf2\x85\xaf\x70"
7584 "\x75\x24\x6c\x54\xa7\x0e\x4d\x1d"
7585 "\x01\xbf\x08\xac\xcf\x7f\x2c\xe3"
7586 "\x14\x89\x5e\x70\x5a\x99\x92\xcd"
7587 "\x01\x84\xc8\xd2\xab\xe5\x4f\x58"
7588 "\xe7\x0f\x2f\x0e\xff\x68\xea\xfd"
7589 "\x15\xb3\x17\xe6\xb0\xe7\x85\xd8"
7590 "\x23\x2e\x05\xc7\xc9\xc4\x46\x1f"
7591 "\xe1\x9e\x49\x20\x23\x24\x4d\x7e"
7592 "\x29\x65\xff\xf4\xb6\xfd\x1a\x85"
7593 "\xc4\x16\xec\xfc\xea\x7b\xd6\x2c"
7594 "\x43\xf8\xb7\xbf\x79\xc0\x85\xcd"
7595 "\xef\xe1\x98\xd3\xa5\xf7\x90\x8c"
7596 "\xe9\x7f\x80\x6b\xd2\xac\x4c\x30"
7597 "\xa7\xc6\x61\x6c\xd2\xf9\x2c\xff"
7598 "\x30\xbc\x22\x81\x7d\x93\x12\xe4"
7599 "\x0a\xcd\xaf\xdd\xe8\xab\x0a\x1e"
7600 "\x13\xa4\x27\xc3\x5f\xf7\x4b\xbb"
7601 "\x37\x09\x4b\x91\x6f\x92\x4f\xaf"
7602 "\x52\xee\xdf\xef\x09\x6f\xf7\x5c"
7603 "\x6e\x12\x17\x72\x63\x57\xc7\xba"
7604 "\x3b\x6b\x38\x32\x73\x1b\x9c\x80"
7605 "\xc1\x7a\xc6\xcf\xcd\x35\xc0\x6b"
7606 "\x31\x1a\x6b\xe9\xd8\x2c\x29\x3f"
7607 "\x96\xfb\xb6\xcd\x13\x91\x3b\xc2"
7608 "\xd2\xa3\x31\x8d\xa4\xcd\x57\xcd"
7609 "\x13\x3d\x64\xfd\x06\xce\xe6\xdc"
7610 "\x0c\x24\x43\x31\x40\x57\xf1\x72"
7611 "\x17\xe3\x3a\x63\x6d\x35\xcf\x5d"
7612 "\x97\x40\x59\xdd\xf7\x3c\x02\xf7"
7613 "\x1c\x7e\x05\xbb\xa9\x0d\x01\xb1"
7614 "\x8e\xc0\x30\xa9\x53\x24\xc9\x89"
7615 "\x84\x6d\xaa\xd0\xcd\x91\xc2\x4d"
7616 "\x91\xb0\x89\xe2\xbf\x83\x44\xaa"
7617 "\x28\x72\x23\xa0\xc2\xad\xad\x1c"
7618 "\xfc\x3f\x09\x7a\x0b\xdc\xc5\x1b"
7619 "\x87\x13\xc6\x5b\x59\x8d\xf2\xc8"
7620 "\xaf\xdf\x11\x95",
7621 .rlen = 4100,
7622 },
7623};
7624
7625/*
7626 * CTS (Cipher Text Stealing) mode tests
7627 */
7628#define CTS_MODE_ENC_TEST_VECTORS 6
7629#define CTS_MODE_DEC_TEST_VECTORS 6
7630static struct cipher_testvec cts_mode_enc_tv_template[] = {
7631 { /* from rfc3962 */
7632 .klen = 16,
7633 .key = "\x63\x68\x69\x63\x6b\x65\x6e\x20"
7634 "\x74\x65\x72\x69\x79\x61\x6b\x69",
7635 .ilen = 17,
7636 .input = "\x49\x20\x77\x6f\x75\x6c\x64\x20"
7637 "\x6c\x69\x6b\x65\x20\x74\x68\x65"
7638 "\x20",
7639 .rlen = 17,
7640 .result = "\xc6\x35\x35\x68\xf2\xbf\x8c\xb4"
7641 "\xd8\xa5\x80\x36\x2d\xa7\xff\x7f"
7642 "\x97",
7643 }, {
7644 .klen = 16,
7645 .key = "\x63\x68\x69\x63\x6b\x65\x6e\x20"
7646 "\x74\x65\x72\x69\x79\x61\x6b\x69",
7647 .ilen = 31,
7648 .input = "\x49\x20\x77\x6f\x75\x6c\x64\x20"
7649 "\x6c\x69\x6b\x65\x20\x74\x68\x65"
7650 "\x20\x47\x65\x6e\x65\x72\x61\x6c"
7651 "\x20\x47\x61\x75\x27\x73\x20",
7652 .rlen = 31,
7653 .result = "\xfc\x00\x78\x3e\x0e\xfd\xb2\xc1"
7654 "\xd4\x45\xd4\xc8\xef\xf7\xed\x22"
7655 "\x97\x68\x72\x68\xd6\xec\xcc\xc0"
7656 "\xc0\x7b\x25\xe2\x5e\xcf\xe5",
7657 }, {
7658 .klen = 16,
7659 .key = "\x63\x68\x69\x63\x6b\x65\x6e\x20"
7660 "\x74\x65\x72\x69\x79\x61\x6b\x69",
7661 .ilen = 32,
7662 .input = "\x49\x20\x77\x6f\x75\x6c\x64\x20"
7663 "\x6c\x69\x6b\x65\x20\x74\x68\x65"
7664 "\x20\x47\x65\x6e\x65\x72\x61\x6c"
7665 "\x20\x47\x61\x75\x27\x73\x20\x43",
7666 .rlen = 32,
7667 .result = "\x39\x31\x25\x23\xa7\x86\x62\xd5"
7668 "\xbe\x7f\xcb\xcc\x98\xeb\xf5\xa8"
7669 "\x97\x68\x72\x68\xd6\xec\xcc\xc0"
7670 "\xc0\x7b\x25\xe2\x5e\xcf\xe5\x84",
7671 }, {
7672 .klen = 16,
7673 .key = "\x63\x68\x69\x63\x6b\x65\x6e\x20"
7674 "\x74\x65\x72\x69\x79\x61\x6b\x69",
7675 .ilen = 47,
7676 .input = "\x49\x20\x77\x6f\x75\x6c\x64\x20"
7677 "\x6c\x69\x6b\x65\x20\x74\x68\x65"
7678 "\x20\x47\x65\x6e\x65\x72\x61\x6c"
7679 "\x20\x47\x61\x75\x27\x73\x20\x43"
7680 "\x68\x69\x63\x6b\x65\x6e\x2c\x20"
7681 "\x70\x6c\x65\x61\x73\x65\x2c",
7682 .rlen = 47,
7683 .result = "\x97\x68\x72\x68\xd6\xec\xcc\xc0"
7684 "\xc0\x7b\x25\xe2\x5e\xcf\xe5\x84"
7685 "\xb3\xff\xfd\x94\x0c\x16\xa1\x8c"
7686 "\x1b\x55\x49\xd2\xf8\x38\x02\x9e"
7687 "\x39\x31\x25\x23\xa7\x86\x62\xd5"
7688 "\xbe\x7f\xcb\xcc\x98\xeb\xf5",
7689 }, {
7690 .klen = 16,
7691 .key = "\x63\x68\x69\x63\x6b\x65\x6e\x20"
7692 "\x74\x65\x72\x69\x79\x61\x6b\x69",
7693 .ilen = 48,
7694 .input = "\x49\x20\x77\x6f\x75\x6c\x64\x20"
7695 "\x6c\x69\x6b\x65\x20\x74\x68\x65"
7696 "\x20\x47\x65\x6e\x65\x72\x61\x6c"
7697 "\x20\x47\x61\x75\x27\x73\x20\x43"
7698 "\x68\x69\x63\x6b\x65\x6e\x2c\x20"
7699 "\x70\x6c\x65\x61\x73\x65\x2c\x20",
7700 .rlen = 48,
7701 .result = "\x97\x68\x72\x68\xd6\xec\xcc\xc0"
7702 "\xc0\x7b\x25\xe2\x5e\xcf\xe5\x84"
7703 "\x9d\xad\x8b\xbb\x96\xc4\xcd\xc0"
7704 "\x3b\xc1\x03\xe1\xa1\x94\xbb\xd8"
7705 "\x39\x31\x25\x23\xa7\x86\x62\xd5"
7706 "\xbe\x7f\xcb\xcc\x98\xeb\xf5\xa8",
7707 }, {
7708 .klen = 16,
7709 .key = "\x63\x68\x69\x63\x6b\x65\x6e\x20"
7710 "\x74\x65\x72\x69\x79\x61\x6b\x69",
7711 .ilen = 64,
7712 .input = "\x49\x20\x77\x6f\x75\x6c\x64\x20"
7713 "\x6c\x69\x6b\x65\x20\x74\x68\x65"
7714 "\x20\x47\x65\x6e\x65\x72\x61\x6c"
7715 "\x20\x47\x61\x75\x27\x73\x20\x43"
7716 "\x68\x69\x63\x6b\x65\x6e\x2c\x20"
7717 "\x70\x6c\x65\x61\x73\x65\x2c\x20"
7718 "\x61\x6e\x64\x20\x77\x6f\x6e\x74"
7719 "\x6f\x6e\x20\x73\x6f\x75\x70\x2e",
7720 .rlen = 64,
7721 .result = "\x97\x68\x72\x68\xd6\xec\xcc\xc0"
7722 "\xc0\x7b\x25\xe2\x5e\xcf\xe5\x84"
7723 "\x39\x31\x25\x23\xa7\x86\x62\xd5"
7724 "\xbe\x7f\xcb\xcc\x98\xeb\xf5\xa8"
7725 "\x48\x07\xef\xe8\x36\xee\x89\xa5"
7726 "\x26\x73\x0d\xbc\x2f\x7b\xc8\x40"
7727 "\x9d\xad\x8b\xbb\x96\xc4\xcd\xc0"
7728 "\x3b\xc1\x03\xe1\xa1\x94\xbb\xd8",
7729 }
7730};
7731
7732static struct cipher_testvec cts_mode_dec_tv_template[] = {
7733 { /* from rfc3962 */
7734 .klen = 16,
7735 .key = "\x63\x68\x69\x63\x6b\x65\x6e\x20"
7736 "\x74\x65\x72\x69\x79\x61\x6b\x69",
7737 .rlen = 17,
7738 .result = "\x49\x20\x77\x6f\x75\x6c\x64\x20"
7739 "\x6c\x69\x6b\x65\x20\x74\x68\x65"
7740 "\x20",
7741 .ilen = 17,
7742 .input = "\xc6\x35\x35\x68\xf2\xbf\x8c\xb4"
7743 "\xd8\xa5\x80\x36\x2d\xa7\xff\x7f"
7744 "\x97",
7745 }, {
7746 .klen = 16,
7747 .key = "\x63\x68\x69\x63\x6b\x65\x6e\x20"
7748 "\x74\x65\x72\x69\x79\x61\x6b\x69",
7749 .rlen = 31,
7750 .result = "\x49\x20\x77\x6f\x75\x6c\x64\x20"
7751 "\x6c\x69\x6b\x65\x20\x74\x68\x65"
7752 "\x20\x47\x65\x6e\x65\x72\x61\x6c"
7753 "\x20\x47\x61\x75\x27\x73\x20",
7754 .ilen = 31,
7755 .input = "\xfc\x00\x78\x3e\x0e\xfd\xb2\xc1"
7756 "\xd4\x45\xd4\xc8\xef\xf7\xed\x22"
7757 "\x97\x68\x72\x68\xd6\xec\xcc\xc0"
7758 "\xc0\x7b\x25\xe2\x5e\xcf\xe5",
7759 }, {
7760 .klen = 16,
7761 .key = "\x63\x68\x69\x63\x6b\x65\x6e\x20"
7762 "\x74\x65\x72\x69\x79\x61\x6b\x69",
7763 .rlen = 32,
7764 .result = "\x49\x20\x77\x6f\x75\x6c\x64\x20"
7765 "\x6c\x69\x6b\x65\x20\x74\x68\x65"
7766 "\x20\x47\x65\x6e\x65\x72\x61\x6c"
7767 "\x20\x47\x61\x75\x27\x73\x20\x43",
7768 .ilen = 32,
7769 .input = "\x39\x31\x25\x23\xa7\x86\x62\xd5"
7770 "\xbe\x7f\xcb\xcc\x98\xeb\xf5\xa8"
7771 "\x97\x68\x72\x68\xd6\xec\xcc\xc0"
7772 "\xc0\x7b\x25\xe2\x5e\xcf\xe5\x84",
7773 }, {
7774 .klen = 16,
7775 .key = "\x63\x68\x69\x63\x6b\x65\x6e\x20"
7776 "\x74\x65\x72\x69\x79\x61\x6b\x69",
7777 .rlen = 47,
7778 .result = "\x49\x20\x77\x6f\x75\x6c\x64\x20"
7779 "\x6c\x69\x6b\x65\x20\x74\x68\x65"
7780 "\x20\x47\x65\x6e\x65\x72\x61\x6c"
7781 "\x20\x47\x61\x75\x27\x73\x20\x43"
7782 "\x68\x69\x63\x6b\x65\x6e\x2c\x20"
7783 "\x70\x6c\x65\x61\x73\x65\x2c",
7784 .ilen = 47,
7785 .input = "\x97\x68\x72\x68\xd6\xec\xcc\xc0"
7786 "\xc0\x7b\x25\xe2\x5e\xcf\xe5\x84"
7787 "\xb3\xff\xfd\x94\x0c\x16\xa1\x8c"
7788 "\x1b\x55\x49\xd2\xf8\x38\x02\x9e"
7789 "\x39\x31\x25\x23\xa7\x86\x62\xd5"
7790 "\xbe\x7f\xcb\xcc\x98\xeb\xf5",
7791 }, {
7792 .klen = 16,
7793 .key = "\x63\x68\x69\x63\x6b\x65\x6e\x20"
7794 "\x74\x65\x72\x69\x79\x61\x6b\x69",
7795 .rlen = 48,
7796 .result = "\x49\x20\x77\x6f\x75\x6c\x64\x20"
7797 "\x6c\x69\x6b\x65\x20\x74\x68\x65"
7798 "\x20\x47\x65\x6e\x65\x72\x61\x6c"
7799 "\x20\x47\x61\x75\x27\x73\x20\x43"
7800 "\x68\x69\x63\x6b\x65\x6e\x2c\x20"
7801 "\x70\x6c\x65\x61\x73\x65\x2c\x20",
7802 .ilen = 48,
7803 .input = "\x97\x68\x72\x68\xd6\xec\xcc\xc0"
7804 "\xc0\x7b\x25\xe2\x5e\xcf\xe5\x84"
7805 "\x9d\xad\x8b\xbb\x96\xc4\xcd\xc0"
7806 "\x3b\xc1\x03\xe1\xa1\x94\xbb\xd8"
7807 "\x39\x31\x25\x23\xa7\x86\x62\xd5"
7808 "\xbe\x7f\xcb\xcc\x98\xeb\xf5\xa8",
7809 }, {
7810 .klen = 16,
7811 .key = "\x63\x68\x69\x63\x6b\x65\x6e\x20"
7812 "\x74\x65\x72\x69\x79\x61\x6b\x69",
7813 .rlen = 64,
7814 .result = "\x49\x20\x77\x6f\x75\x6c\x64\x20"
7815 "\x6c\x69\x6b\x65\x20\x74\x68\x65"
7816 "\x20\x47\x65\x6e\x65\x72\x61\x6c"
7817 "\x20\x47\x61\x75\x27\x73\x20\x43"
7818 "\x68\x69\x63\x6b\x65\x6e\x2c\x20"
7819 "\x70\x6c\x65\x61\x73\x65\x2c\x20"
7820 "\x61\x6e\x64\x20\x77\x6f\x6e\x74"
7821 "\x6f\x6e\x20\x73\x6f\x75\x70\x2e",
7822 .ilen = 64,
7823 .input = "\x97\x68\x72\x68\xd6\xec\xcc\xc0"
7824 "\xc0\x7b\x25\xe2\x5e\xcf\xe5\x84"
7825 "\x39\x31\x25\x23\xa7\x86\x62\xd5"
7826 "\xbe\x7f\xcb\xcc\x98\xeb\xf5\xa8"
7827 "\x48\x07\xef\xe8\x36\xee\x89\xa5"
7828 "\x26\x73\x0d\xbc\x2f\x7b\xc8\x40"
7829 "\x9d\xad\x8b\xbb\x96\xc4\xcd\xc0"
7830 "\x3b\xc1\x03\xe1\xa1\x94\xbb\xd8",
7831 }
7832};
7833
7834/*
7835 * Compression stuff.
7836 */
7837#define COMP_BUF_SIZE 512
7838
7839struct comp_testvec {
7840 int inlen, outlen;
7841 char input[COMP_BUF_SIZE];
7842 char output[COMP_BUF_SIZE];
7843};
7844
7845/*
7846 * Deflate test vectors (null-terminated strings).
7847 * Params: winbits=11, Z_DEFAULT_COMPRESSION, MAX_MEM_LEVEL.
7848 */
7849#define DEFLATE_COMP_TEST_VECTORS 2
7850#define DEFLATE_DECOMP_TEST_VECTORS 2
7851
7852static struct comp_testvec deflate_comp_tv_template[] = {
7853 {
7854 .inlen = 70,
7855 .outlen = 38,
7856 .input = "Join us now and share the software "
7857 "Join us now and share the software ",
7858 .output = "\xf3\xca\xcf\xcc\x53\x28\x2d\x56"
7859 "\xc8\xcb\x2f\x57\x48\xcc\x4b\x51"
7860 "\x28\xce\x48\x2c\x4a\x55\x28\xc9"
7861 "\x48\x55\x28\xce\x4f\x2b\x29\x07"
7862 "\x71\xbc\x08\x2b\x01\x00",
7863 }, {
7864 .inlen = 191,
7865 .outlen = 122,
7866 .input = "This document describes a compression method based on the DEFLATE"
7867 "compression algorithm. This document defines the application of "
7868 "the DEFLATE algorithm to the IP Payload Compression Protocol.",
7869 .output = "\x5d\x8d\x31\x0e\xc2\x30\x10\x04"
7870 "\xbf\xb2\x2f\xc8\x1f\x10\x04\x09"
7871 "\x89\xc2\x85\x3f\x70\xb1\x2f\xf8"
7872 "\x24\xdb\x67\xd9\x47\xc1\xef\x49"
7873 "\x68\x12\x51\xae\x76\x67\xd6\x27"
7874 "\x19\x88\x1a\xde\x85\xab\x21\xf2"
7875 "\x08\x5d\x16\x1e\x20\x04\x2d\xad"
7876 "\xf3\x18\xa2\x15\x85\x2d\x69\xc4"
7877 "\x42\x83\x23\xb6\x6c\x89\x71\x9b"
7878 "\xef\xcf\x8b\x9f\xcf\x33\xca\x2f"
7879 "\xed\x62\xa9\x4c\x80\xff\x13\xaf"
7880 "\x52\x37\xed\x0e\x52\x6b\x59\x02"
7881 "\xd9\x4e\xe8\x7a\x76\x1d\x02\x98"
7882 "\xfe\x8a\x87\x83\xa3\x4f\x56\x8a"
7883 "\xb8\x9e\x8e\x5c\x57\xd3\xa0\x79"
7884 "\xfa\x02",
7885 },
7886};
7887
7888static struct comp_testvec deflate_decomp_tv_template[] = {
7889 {
7890 .inlen = 122,
7891 .outlen = 191,
7892 .input = "\x5d\x8d\x31\x0e\xc2\x30\x10\x04"
7893 "\xbf\xb2\x2f\xc8\x1f\x10\x04\x09"
7894 "\x89\xc2\x85\x3f\x70\xb1\x2f\xf8"
7895 "\x24\xdb\x67\xd9\x47\xc1\xef\x49"
7896 "\x68\x12\x51\xae\x76\x67\xd6\x27"
7897 "\x19\x88\x1a\xde\x85\xab\x21\xf2"
7898 "\x08\x5d\x16\x1e\x20\x04\x2d\xad"
7899 "\xf3\x18\xa2\x15\x85\x2d\x69\xc4"
7900 "\x42\x83\x23\xb6\x6c\x89\x71\x9b"
7901 "\xef\xcf\x8b\x9f\xcf\x33\xca\x2f"
7902 "\xed\x62\xa9\x4c\x80\xff\x13\xaf"
7903 "\x52\x37\xed\x0e\x52\x6b\x59\x02"
7904 "\xd9\x4e\xe8\x7a\x76\x1d\x02\x98"
7905 "\xfe\x8a\x87\x83\xa3\x4f\x56\x8a"
7906 "\xb8\x9e\x8e\x5c\x57\xd3\xa0\x79"
7907 "\xfa\x02",
7908 .output = "This document describes a compression method based on the DEFLATE"
7909 "compression algorithm. This document defines the application of "
7910 "the DEFLATE algorithm to the IP Payload Compression Protocol.",
7911 }, {
7912 .inlen = 38,
7913 .outlen = 70,
7914 .input = "\xf3\xca\xcf\xcc\x53\x28\x2d\x56"
7915 "\xc8\xcb\x2f\x57\x48\xcc\x4b\x51"
7916 "\x28\xce\x48\x2c\x4a\x55\x28\xc9"
7917 "\x48\x55\x28\xce\x4f\x2b\x29\x07"
7918 "\x71\xbc\x08\x2b\x01\x00",
7919 .output = "Join us now and share the software "
7920 "Join us now and share the software ",
7921 },
7922};
7923
7924/*
7925 * LZO test vectors (null-terminated strings).
7926 */
7927#define LZO_COMP_TEST_VECTORS 2
7928#define LZO_DECOMP_TEST_VECTORS 2
7929
7930static struct comp_testvec lzo_comp_tv_template[] = {
7931 {
7932 .inlen = 70,
7933 .outlen = 46,
7934 .input = "Join us now and share the software "
7935 "Join us now and share the software ",
7936 .output = "\x00\x0d\x4a\x6f\x69\x6e\x20\x75"
7937 "\x73\x20\x6e\x6f\x77\x20\x61\x6e"
7938 "\x64\x20\x73\x68\x61\x72\x65\x20"
7939 "\x74\x68\x65\x20\x73\x6f\x66\x74"
7940 "\x77\x70\x01\x01\x4a\x6f\x69\x6e"
7941 "\x3d\x88\x00\x11\x00\x00",
7942 }, {
7943 .inlen = 159,
7944 .outlen = 133,
7945 .input = "This document describes a compression method based on the LZO "
7946 "compression algorithm. This document defines the application of "
7947 "the LZO algorithm used in UBIFS.",
7948 .output = "\x00\x2b\x54\x68\x69\x73\x20\x64"
7949 "\x6f\x63\x75\x6d\x65\x6e\x74\x20"
7950 "\x64\x65\x73\x63\x72\x69\x62\x65"
7951 "\x73\x20\x61\x20\x63\x6f\x6d\x70"
7952 "\x72\x65\x73\x73\x69\x6f\x6e\x20"
7953 "\x6d\x65\x74\x68\x6f\x64\x20\x62"
7954 "\x61\x73\x65\x64\x20\x6f\x6e\x20"
7955 "\x74\x68\x65\x20\x4c\x5a\x4f\x2b"
7956 "\x8c\x00\x0d\x61\x6c\x67\x6f\x72"
7957 "\x69\x74\x68\x6d\x2e\x20\x20\x54"
7958 "\x68\x69\x73\x2a\x54\x01\x02\x66"
7959 "\x69\x6e\x65\x73\x94\x06\x05\x61"
7960 "\x70\x70\x6c\x69\x63\x61\x74\x76"
7961 "\x0a\x6f\x66\x88\x02\x60\x09\x27"
7962 "\xf0\x00\x0c\x20\x75\x73\x65\x64"
7963 "\x20\x69\x6e\x20\x55\x42\x49\x46"
7964 "\x53\x2e\x11\x00\x00",
7965 },
7966};
7967
7968static struct comp_testvec lzo_decomp_tv_template[] = {
7969 {
7970 .inlen = 133,
7971 .outlen = 159,
7972 .input = "\x00\x2b\x54\x68\x69\x73\x20\x64"
7973 "\x6f\x63\x75\x6d\x65\x6e\x74\x20"
7974 "\x64\x65\x73\x63\x72\x69\x62\x65"
7975 "\x73\x20\x61\x20\x63\x6f\x6d\x70"
7976 "\x72\x65\x73\x73\x69\x6f\x6e\x20"
7977 "\x6d\x65\x74\x68\x6f\x64\x20\x62"
7978 "\x61\x73\x65\x64\x20\x6f\x6e\x20"
7979 "\x74\x68\x65\x20\x4c\x5a\x4f\x2b"
7980 "\x8c\x00\x0d\x61\x6c\x67\x6f\x72"
7981 "\x69\x74\x68\x6d\x2e\x20\x20\x54"
7982 "\x68\x69\x73\x2a\x54\x01\x02\x66"
7983 "\x69\x6e\x65\x73\x94\x06\x05\x61"
7984 "\x70\x70\x6c\x69\x63\x61\x74\x76"
7985 "\x0a\x6f\x66\x88\x02\x60\x09\x27"
7986 "\xf0\x00\x0c\x20\x75\x73\x65\x64"
7987 "\x20\x69\x6e\x20\x55\x42\x49\x46"
7988 "\x53\x2e\x11\x00\x00",
7989 .output = "This document describes a compression method based on the LZO "
7990 "compression algorithm. This document defines the application of "
7991 "the LZO algorithm used in UBIFS.",
7992 }, {
7993 .inlen = 46,
7994 .outlen = 70,
7995 .input = "\x00\x0d\x4a\x6f\x69\x6e\x20\x75"
7996 "\x73\x20\x6e\x6f\x77\x20\x61\x6e"
7997 "\x64\x20\x73\x68\x61\x72\x65\x20"
7998 "\x74\x68\x65\x20\x73\x6f\x66\x74"
7999 "\x77\x70\x01\x01\x4a\x6f\x69\x6e"
8000 "\x3d\x88\x00\x11\x00\x00",
8001 .output = "Join us now and share the software "
8002 "Join us now and share the software ",
8003 },
8004};
8005
8006/*
8007 * Michael MIC test vectors from IEEE 802.11i
8008 */
8009#define MICHAEL_MIC_TEST_VECTORS 6
8010
8011static struct hash_testvec michael_mic_tv_template[] = {
8012 {
8013 .key = "\x00\x00\x00\x00\x00\x00\x00\x00",
8014 .ksize = 8,
8015 .plaintext = zeroed_string,
8016 .psize = 0,
8017 .digest = "\x82\x92\x5c\x1c\xa1\xd1\x30\xb8",
8018 },
8019 {
8020 .key = "\x82\x92\x5c\x1c\xa1\xd1\x30\xb8",
8021 .ksize = 8,
8022 .plaintext = "M",
8023 .psize = 1,
8024 .digest = "\x43\x47\x21\xca\x40\x63\x9b\x3f",
8025 },
8026 {
8027 .key = "\x43\x47\x21\xca\x40\x63\x9b\x3f",
8028 .ksize = 8,
8029 .plaintext = "Mi",
8030 .psize = 2,
8031 .digest = "\xe8\xf9\xbe\xca\xe9\x7e\x5d\x29",
8032 },
8033 {
8034 .key = "\xe8\xf9\xbe\xca\xe9\x7e\x5d\x29",
8035 .ksize = 8,
8036 .plaintext = "Mic",
8037 .psize = 3,
8038 .digest = "\x90\x03\x8f\xc6\xcf\x13\xc1\xdb",
8039 },
8040 {
8041 .key = "\x90\x03\x8f\xc6\xcf\x13\xc1\xdb",
8042 .ksize = 8,
8043 .plaintext = "Mich",
8044 .psize = 4,
8045 .digest = "\xd5\x5e\x10\x05\x10\x12\x89\x86",
8046 },
8047 {
8048 .key = "\xd5\x5e\x10\x05\x10\x12\x89\x86",
8049 .ksize = 8,
8050 .plaintext = "Michael",
8051 .psize = 7,
8052 .digest = "\x0a\x94\x2b\x12\x4e\xca\xa5\x46",
8053 } 41 }
8054}; 42};
8055 43
8056/* 44/*
8057 * CRC32C test vectors
8058 */
8059#define CRC32C_TEST_VECTORS 14
8060
8061static struct hash_testvec crc32c_tv_template[] = {
8062 {
8063 .psize = 0,
8064 .digest = "\x00\x00\x00\x00",
8065 },
8066 {
8067 .key = "\x87\xa9\xcb\xed",
8068 .ksize = 4,
8069 .psize = 0,
8070 .digest = "\x78\x56\x34\x12",
8071 },
8072 {
8073 .key = "\xff\xff\xff\xff",
8074 .ksize = 4,
8075 .plaintext = "\x01\x02\x03\x04\x05\x06\x07\x08"
8076 "\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
8077 "\x11\x12\x13\x14\x15\x16\x17\x18"
8078 "\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20"
8079 "\x21\x22\x23\x24\x25\x26\x27\x28",
8080 .psize = 40,
8081 .digest = "\x7f\x15\x2c\x0e",
8082 },
8083 {
8084 .key = "\xff\xff\xff\xff",
8085 .ksize = 4,
8086 .plaintext = "\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30"
8087 "\x31\x32\x33\x34\x35\x36\x37\x38"
8088 "\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40"
8089 "\x41\x42\x43\x44\x45\x46\x47\x48"
8090 "\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50",
8091 .psize = 40,
8092 .digest = "\xf6\xeb\x80\xe9",
8093 },
8094 {
8095 .key = "\xff\xff\xff\xff",
8096 .ksize = 4,
8097 .plaintext = "\x51\x52\x53\x54\x55\x56\x57\x58"
8098 "\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60"
8099 "\x61\x62\x63\x64\x65\x66\x67\x68"
8100 "\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70"
8101 "\x71\x72\x73\x74\x75\x76\x77\x78",
8102 .psize = 40,
8103 .digest = "\xed\xbd\x74\xde",
8104 },
8105 {
8106 .key = "\xff\xff\xff\xff",
8107 .ksize = 4,
8108 .plaintext = "\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80"
8109 "\x81\x82\x83\x84\x85\x86\x87\x88"
8110 "\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90"
8111 "\x91\x92\x93\x94\x95\x96\x97\x98"
8112 "\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0",
8113 .psize = 40,
8114 .digest = "\x62\xc8\x79\xd5",
8115 },
8116 {
8117 .key = "\xff\xff\xff\xff",
8118 .ksize = 4,
8119 .plaintext = "\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8"
8120 "\xa9\xaa\xab\xac\xad\xae\xaf\xb0"
8121 "\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8"
8122 "\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0"
8123 "\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8",
8124 .psize = 40,
8125 .digest = "\xd0\x9a\x97\xba",
8126 },
8127 {
8128 .key = "\xff\xff\xff\xff",
8129 .ksize = 4,
8130 .plaintext = "\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0"
8131 "\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8"
8132 "\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0"
8133 "\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8"
8134 "\xe9\xea\xeb\xec\xed\xee\xef\xf0",
8135 .psize = 40,
8136 .digest = "\x13\xd9\x29\x2b",
8137 },
8138 {
8139 .key = "\x80\xea\xd3\xf1",
8140 .ksize = 4,
8141 .plaintext = "\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30"
8142 "\x31\x32\x33\x34\x35\x36\x37\x38"
8143 "\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40"
8144 "\x41\x42\x43\x44\x45\x46\x47\x48"
8145 "\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50",
8146 .psize = 40,
8147 .digest = "\x0c\xb5\xe2\xa2",
8148 },
8149 {
8150 .key = "\xf3\x4a\x1d\x5d",
8151 .ksize = 4,
8152 .plaintext = "\x51\x52\x53\x54\x55\x56\x57\x58"
8153 "\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60"
8154 "\x61\x62\x63\x64\x65\x66\x67\x68"
8155 "\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70"
8156 "\x71\x72\x73\x74\x75\x76\x77\x78",
8157 .psize = 40,
8158 .digest = "\xd1\x7f\xfb\xa6",
8159 },
8160 {
8161 .key = "\x2e\x80\x04\x59",
8162 .ksize = 4,
8163 .plaintext = "\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80"
8164 "\x81\x82\x83\x84\x85\x86\x87\x88"
8165 "\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90"
8166 "\x91\x92\x93\x94\x95\x96\x97\x98"
8167 "\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0",
8168 .psize = 40,
8169 .digest = "\x59\x33\xe6\x7a",
8170 },
8171 {
8172 .key = "\xa6\xcc\x19\x85",
8173 .ksize = 4,
8174 .plaintext = "\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8"
8175 "\xa9\xaa\xab\xac\xad\xae\xaf\xb0"
8176 "\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8"
8177 "\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0"
8178 "\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8",
8179 .psize = 40,
8180 .digest = "\xbe\x03\x01\xd2",
8181 },
8182 {
8183 .key = "\x41\xfc\xfe\x2d",
8184 .ksize = 4,
8185 .plaintext = "\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0"
8186 "\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8"
8187 "\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0"
8188 "\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8"
8189 "\xe9\xea\xeb\xec\xed\xee\xef\xf0",
8190 .psize = 40,
8191 .digest = "\x75\xd3\xc5\x24",
8192 },
8193 {
8194 .key = "\xff\xff\xff\xff",
8195 .ksize = 4,
8196 .plaintext = "\x01\x02\x03\x04\x05\x06\x07\x08"
8197 "\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
8198 "\x11\x12\x13\x14\x15\x16\x17\x18"
8199 "\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20"
8200 "\x21\x22\x23\x24\x25\x26\x27\x28"
8201 "\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30"
8202 "\x31\x32\x33\x34\x35\x36\x37\x38"
8203 "\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40"
8204 "\x41\x42\x43\x44\x45\x46\x47\x48"
8205 "\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50"
8206 "\x51\x52\x53\x54\x55\x56\x57\x58"
8207 "\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60"
8208 "\x61\x62\x63\x64\x65\x66\x67\x68"
8209 "\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70"
8210 "\x71\x72\x73\x74\x75\x76\x77\x78"
8211 "\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80"
8212 "\x81\x82\x83\x84\x85\x86\x87\x88"
8213 "\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90"
8214 "\x91\x92\x93\x94\x95\x96\x97\x98"
8215 "\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0"
8216 "\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8"
8217 "\xa9\xaa\xab\xac\xad\xae\xaf\xb0"
8218 "\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8"
8219 "\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0"
8220 "\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8"
8221 "\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0"
8222 "\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8"
8223 "\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0"
8224 "\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8"
8225 "\xe9\xea\xeb\xec\xed\xee\xef\xf0",
8226 .psize = 240,
8227 .digest = "\x75\xd3\xc5\x24",
8228 .np = 2,
8229 .tap = { 31, 209 }
8230 },
8231};
8232
8233/*
8234 * Cipher speed tests 45 * Cipher speed tests
8235 */ 46 */
8236static u8 speed_template_8[] = {8, 0}; 47static u8 speed_template_8[] = {8, 0};
diff --git a/crypto/testmgr.c b/crypto/testmgr.c
new file mode 100644
index 000000000000..b828c6cf1b1d
--- /dev/null
+++ b/crypto/testmgr.c
@@ -0,0 +1,1868 @@
1/*
2 * Algorithm testing framework and tests.
3 *
4 * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
5 * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org>
6 * Copyright (c) 2007 Nokia Siemens Networks
7 * Copyright (c) 2008 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/hash.h>
17#include <linux/err.h>
18#include <linux/module.h>
19#include <linux/scatterlist.h>
20#include <linux/slab.h>
21#include <linux/string.h>
22
23#include "internal.h"
24#include "testmgr.h"
25
26/*
27 * Need slab memory for testing (size in number of pages).
28 */
29#define XBUFSIZE 8
30
31/*
32 * Indexes into the xbuf to simulate cross-page access.
33 */
34#define IDX1 32
35#define IDX2 32400
36#define IDX3 1
37#define IDX4 8193
38#define IDX5 22222
39#define IDX6 17101
40#define IDX7 27333
41#define IDX8 3000
42
43/*
44* Used by test_cipher()
45*/
46#define ENCRYPT 1
47#define DECRYPT 0
48
49struct tcrypt_result {
50 struct completion completion;
51 int err;
52};
53
54struct aead_test_suite {
55 struct {
56 struct aead_testvec *vecs;
57 unsigned int count;
58 } enc, dec;
59};
60
61struct cipher_test_suite {
62 struct {
63 struct cipher_testvec *vecs;
64 unsigned int count;
65 } enc, dec;
66};
67
68struct comp_test_suite {
69 struct {
70 struct comp_testvec *vecs;
71 unsigned int count;
72 } comp, decomp;
73};
74
75struct hash_test_suite {
76 struct hash_testvec *vecs;
77 unsigned int count;
78};
79
80struct alg_test_desc {
81 const char *alg;
82 int (*test)(const struct alg_test_desc *desc, const char *driver,
83 u32 type, u32 mask);
84
85 union {
86 struct aead_test_suite aead;
87 struct cipher_test_suite cipher;
88 struct comp_test_suite comp;
89 struct hash_test_suite hash;
90 } suite;
91};
92
93static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 };
94
95static char *xbuf[XBUFSIZE];
96static char *axbuf[XBUFSIZE];
97
98static void hexdump(unsigned char *buf, unsigned int len)
99{
100 print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET,
101 16, 1,
102 buf, len, false);
103}
104
105static void tcrypt_complete(struct crypto_async_request *req, int err)
106{
107 struct tcrypt_result *res = req->data;
108
109 if (err == -EINPROGRESS)
110 return;
111
112 res->err = err;
113 complete(&res->completion);
114}
115
116static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
117 unsigned int tcount)
118{
119 const char *algo = crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm));
120 unsigned int i, j, k, temp;
121 struct scatterlist sg[8];
122 char result[64];
123 struct ahash_request *req;
124 struct tcrypt_result tresult;
125 int ret;
126 void *hash_buff;
127
128 init_completion(&tresult.completion);
129
130 req = ahash_request_alloc(tfm, GFP_KERNEL);
131 if (!req) {
132 printk(KERN_ERR "alg: hash: Failed to allocate request for "
133 "%s\n", algo);
134 ret = -ENOMEM;
135 goto out_noreq;
136 }
137 ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
138 tcrypt_complete, &tresult);
139
140 for (i = 0; i < tcount; i++) {
141 memset(result, 0, 64);
142
143 hash_buff = xbuf[0];
144
145 memcpy(hash_buff, template[i].plaintext, template[i].psize);
146 sg_init_one(&sg[0], hash_buff, template[i].psize);
147
148 if (template[i].ksize) {
149 crypto_ahash_clear_flags(tfm, ~0);
150 ret = crypto_ahash_setkey(tfm, template[i].key,
151 template[i].ksize);
152 if (ret) {
153 printk(KERN_ERR "alg: hash: setkey failed on "
154 "test %d for %s: ret=%d\n", i + 1, algo,
155 -ret);
156 goto out;
157 }
158 }
159
160 ahash_request_set_crypt(req, sg, result, template[i].psize);
161 ret = crypto_ahash_digest(req);
162 switch (ret) {
163 case 0:
164 break;
165 case -EINPROGRESS:
166 case -EBUSY:
167 ret = wait_for_completion_interruptible(
168 &tresult.completion);
169 if (!ret && !(ret = tresult.err)) {
170 INIT_COMPLETION(tresult.completion);
171 break;
172 }
173 /* fall through */
174 default:
175 printk(KERN_ERR "alg: hash: digest failed on test %d "
176 "for %s: ret=%d\n", i + 1, algo, -ret);
177 goto out;
178 }
179
180 if (memcmp(result, template[i].digest,
181 crypto_ahash_digestsize(tfm))) {
182 printk(KERN_ERR "alg: hash: Test %d failed for %s\n",
183 i + 1, algo);
184 hexdump(result, crypto_ahash_digestsize(tfm));
185 ret = -EINVAL;
186 goto out;
187 }
188 }
189
190 j = 0;
191 for (i = 0; i < tcount; i++) {
192 if (template[i].np) {
193 j++;
194 memset(result, 0, 64);
195
196 temp = 0;
197 sg_init_table(sg, template[i].np);
198 for (k = 0; k < template[i].np; k++) {
199 sg_set_buf(&sg[k],
200 memcpy(xbuf[IDX[k] >> PAGE_SHIFT] +
201 offset_in_page(IDX[k]),
202 template[i].plaintext + temp,
203 template[i].tap[k]),
204 template[i].tap[k]);
205 temp += template[i].tap[k];
206 }
207
208 if (template[i].ksize) {
209 crypto_ahash_clear_flags(tfm, ~0);
210 ret = crypto_ahash_setkey(tfm, template[i].key,
211 template[i].ksize);
212
213 if (ret) {
214 printk(KERN_ERR "alg: hash: setkey "
215 "failed on chunking test %d "
216 "for %s: ret=%d\n", j, algo,
217 -ret);
218 goto out;
219 }
220 }
221
222 ahash_request_set_crypt(req, sg, result,
223 template[i].psize);
224 ret = crypto_ahash_digest(req);
225 switch (ret) {
226 case 0:
227 break;
228 case -EINPROGRESS:
229 case -EBUSY:
230 ret = wait_for_completion_interruptible(
231 &tresult.completion);
232 if (!ret && !(ret = tresult.err)) {
233 INIT_COMPLETION(tresult.completion);
234 break;
235 }
236 /* fall through */
237 default:
238 printk(KERN_ERR "alg: hash: digest failed "
239 "on chunking test %d for %s: "
240 "ret=%d\n", j, algo, -ret);
241 goto out;
242 }
243
244 if (memcmp(result, template[i].digest,
245 crypto_ahash_digestsize(tfm))) {
246 printk(KERN_ERR "alg: hash: Chunking test %d "
247 "failed for %s\n", j, algo);
248 hexdump(result, crypto_ahash_digestsize(tfm));
249 ret = -EINVAL;
250 goto out;
251 }
252 }
253 }
254
255 ret = 0;
256
257out:
258 ahash_request_free(req);
259out_noreq:
260 return ret;
261}
262
263static int test_aead(struct crypto_aead *tfm, int enc,
264 struct aead_testvec *template, unsigned int tcount)
265{
266 const char *algo = crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm));
267 unsigned int i, j, k, n, temp;
268 int ret = 0;
269 char *q;
270 char *key;
271 struct aead_request *req;
272 struct scatterlist sg[8];
273 struct scatterlist asg[8];
274 const char *e;
275 struct tcrypt_result result;
276 unsigned int authsize;
277 void *input;
278 void *assoc;
279 char iv[MAX_IVLEN];
280
281 if (enc == ENCRYPT)
282 e = "encryption";
283 else
284 e = "decryption";
285
286 init_completion(&result.completion);
287
288 req = aead_request_alloc(tfm, GFP_KERNEL);
289 if (!req) {
290 printk(KERN_ERR "alg: aead: Failed to allocate request for "
291 "%s\n", algo);
292 ret = -ENOMEM;
293 goto out;
294 }
295
296 aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
297 tcrypt_complete, &result);
298
299 for (i = 0, j = 0; i < tcount; i++) {
300 if (!template[i].np) {
301 j++;
302
303 /* some tepmplates have no input data but they will
304 * touch input
305 */
306 input = xbuf[0];
307 assoc = axbuf[0];
308
309 memcpy(input, template[i].input, template[i].ilen);
310 memcpy(assoc, template[i].assoc, template[i].alen);
311 if (template[i].iv)
312 memcpy(iv, template[i].iv, MAX_IVLEN);
313 else
314 memset(iv, 0, MAX_IVLEN);
315
316 crypto_aead_clear_flags(tfm, ~0);
317 if (template[i].wk)
318 crypto_aead_set_flags(
319 tfm, CRYPTO_TFM_REQ_WEAK_KEY);
320
321 key = template[i].key;
322
323 ret = crypto_aead_setkey(tfm, key,
324 template[i].klen);
325 if (!ret == template[i].fail) {
326 printk(KERN_ERR "alg: aead: setkey failed on "
327 "test %d for %s: flags=%x\n", j, algo,
328 crypto_aead_get_flags(tfm));
329 goto out;
330 } else if (ret)
331 continue;
332
333 authsize = abs(template[i].rlen - template[i].ilen);
334 ret = crypto_aead_setauthsize(tfm, authsize);
335 if (ret) {
336 printk(KERN_ERR "alg: aead: Failed to set "
337 "authsize to %u on test %d for %s\n",
338 authsize, j, algo);
339 goto out;
340 }
341
342 sg_init_one(&sg[0], input,
343 template[i].ilen + (enc ? authsize : 0));
344
345 sg_init_one(&asg[0], assoc, template[i].alen);
346
347 aead_request_set_crypt(req, sg, sg,
348 template[i].ilen, iv);
349
350 aead_request_set_assoc(req, asg, template[i].alen);
351
352 ret = enc ?
353 crypto_aead_encrypt(req) :
354 crypto_aead_decrypt(req);
355
356 switch (ret) {
357 case 0:
358 break;
359 case -EINPROGRESS:
360 case -EBUSY:
361 ret = wait_for_completion_interruptible(
362 &result.completion);
363 if (!ret && !(ret = result.err)) {
364 INIT_COMPLETION(result.completion);
365 break;
366 }
367 /* fall through */
368 default:
369 printk(KERN_ERR "alg: aead: %s failed on test "
370 "%d for %s: ret=%d\n", e, j, algo, -ret);
371 goto out;
372 }
373
374 q = input;
375 if (memcmp(q, template[i].result, template[i].rlen)) {
376 printk(KERN_ERR "alg: aead: Test %d failed on "
377 "%s for %s\n", j, e, algo);
378 hexdump(q, template[i].rlen);
379 ret = -EINVAL;
380 goto out;
381 }
382 }
383 }
384
385 for (i = 0, j = 0; i < tcount; i++) {
386 if (template[i].np) {
387 j++;
388
389 if (template[i].iv)
390 memcpy(iv, template[i].iv, MAX_IVLEN);
391 else
392 memset(iv, 0, MAX_IVLEN);
393
394 crypto_aead_clear_flags(tfm, ~0);
395 if (template[i].wk)
396 crypto_aead_set_flags(
397 tfm, CRYPTO_TFM_REQ_WEAK_KEY);
398 key = template[i].key;
399
400 ret = crypto_aead_setkey(tfm, key, template[i].klen);
401 if (!ret == template[i].fail) {
402 printk(KERN_ERR "alg: aead: setkey failed on "
403 "chunk test %d for %s: flags=%x\n", j,
404 algo, crypto_aead_get_flags(tfm));
405 goto out;
406 } else if (ret)
407 continue;
408
409 authsize = abs(template[i].rlen - template[i].ilen);
410
411 ret = -EINVAL;
412 sg_init_table(sg, template[i].np);
413 for (k = 0, temp = 0; k < template[i].np; k++) {
414 if (WARN_ON(offset_in_page(IDX[k]) +
415 template[i].tap[k] > PAGE_SIZE))
416 goto out;
417
418 q = xbuf[IDX[k] >> PAGE_SHIFT] +
419 offset_in_page(IDX[k]);
420
421 memcpy(q, template[i].input + temp,
422 template[i].tap[k]);
423
424 n = template[i].tap[k];
425 if (k == template[i].np - 1 && enc)
426 n += authsize;
427 if (offset_in_page(q) + n < PAGE_SIZE)
428 q[n] = 0;
429
430 sg_set_buf(&sg[k], q, template[i].tap[k]);
431 temp += template[i].tap[k];
432 }
433
434 ret = crypto_aead_setauthsize(tfm, authsize);
435 if (ret) {
436 printk(KERN_ERR "alg: aead: Failed to set "
437 "authsize to %u on chunk test %d for "
438 "%s\n", authsize, j, algo);
439 goto out;
440 }
441
442 if (enc) {
443 if (WARN_ON(sg[k - 1].offset +
444 sg[k - 1].length + authsize >
445 PAGE_SIZE)) {
446 ret = -EINVAL;
447 goto out;
448 }
449
450 sg[k - 1].length += authsize;
451 }
452
453 sg_init_table(asg, template[i].anp);
454 for (k = 0, temp = 0; k < template[i].anp; k++) {
455 sg_set_buf(&asg[k],
456 memcpy(axbuf[IDX[k] >> PAGE_SHIFT] +
457 offset_in_page(IDX[k]),
458 template[i].assoc + temp,
459 template[i].atap[k]),
460 template[i].atap[k]);
461 temp += template[i].atap[k];
462 }
463
464 aead_request_set_crypt(req, sg, sg,
465 template[i].ilen,
466 iv);
467
468 aead_request_set_assoc(req, asg, template[i].alen);
469
470 ret = enc ?
471 crypto_aead_encrypt(req) :
472 crypto_aead_decrypt(req);
473
474 switch (ret) {
475 case 0:
476 break;
477 case -EINPROGRESS:
478 case -EBUSY:
479 ret = wait_for_completion_interruptible(
480 &result.completion);
481 if (!ret && !(ret = result.err)) {
482 INIT_COMPLETION(result.completion);
483 break;
484 }
485 /* fall through */
486 default:
487 printk(KERN_ERR "alg: aead: %s failed on "
488 "chunk test %d for %s: ret=%d\n", e, j,
489 algo, -ret);
490 goto out;
491 }
492
493 ret = -EINVAL;
494 for (k = 0, temp = 0; k < template[i].np; k++) {
495 q = xbuf[IDX[k] >> PAGE_SHIFT] +
496 offset_in_page(IDX[k]);
497
498 n = template[i].tap[k];
499 if (k == template[i].np - 1)
500 n += enc ? authsize : -authsize;
501
502 if (memcmp(q, template[i].result + temp, n)) {
503 printk(KERN_ERR "alg: aead: Chunk "
504 "test %d failed on %s at page "
505 "%u for %s\n", j, e, k, algo);
506 hexdump(q, n);
507 goto out;
508 }
509
510 q += n;
511 if (k == template[i].np - 1 && !enc) {
512 if (memcmp(q, template[i].input +
513 temp + n, authsize))
514 n = authsize;
515 else
516 n = 0;
517 } else {
518 for (n = 0; offset_in_page(q + n) &&
519 q[n]; n++)
520 ;
521 }
522 if (n) {
523 printk(KERN_ERR "alg: aead: Result "
524 "buffer corruption in chunk "
525 "test %d on %s at page %u for "
526 "%s: %u bytes:\n", j, e, k,
527 algo, n);
528 hexdump(q, n);
529 goto out;
530 }
531
532 temp += template[i].tap[k];
533 }
534 }
535 }
536
537 ret = 0;
538
539out:
540 aead_request_free(req);
541 return ret;
542}
543
544static int test_cipher(struct crypto_cipher *tfm, int enc,
545 struct cipher_testvec *template, unsigned int tcount)
546{
547 const char *algo = crypto_tfm_alg_driver_name(crypto_cipher_tfm(tfm));
548 unsigned int i, j, k;
549 int ret;
550 char *q;
551 const char *e;
552 void *data;
553
554 if (enc == ENCRYPT)
555 e = "encryption";
556 else
557 e = "decryption";
558
559 j = 0;
560 for (i = 0; i < tcount; i++) {
561 if (template[i].np)
562 continue;
563
564 j++;
565
566 data = xbuf[0];
567 memcpy(data, template[i].input, template[i].ilen);
568
569 crypto_cipher_clear_flags(tfm, ~0);
570 if (template[i].wk)
571 crypto_cipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
572
573 ret = crypto_cipher_setkey(tfm, template[i].key,
574 template[i].klen);
575 if (!ret == template[i].fail) {
576 printk(KERN_ERR "alg: cipher: setkey failed "
577 "on test %d for %s: flags=%x\n", j,
578 algo, crypto_cipher_get_flags(tfm));
579 goto out;
580 } else if (ret)
581 continue;
582
583 for (k = 0; k < template[i].ilen;
584 k += crypto_cipher_blocksize(tfm)) {
585 if (enc)
586 crypto_cipher_encrypt_one(tfm, data + k,
587 data + k);
588 else
589 crypto_cipher_decrypt_one(tfm, data + k,
590 data + k);
591 }
592
593 q = data;
594 if (memcmp(q, template[i].result, template[i].rlen)) {
595 printk(KERN_ERR "alg: cipher: Test %d failed "
596 "on %s for %s\n", j, e, algo);
597 hexdump(q, template[i].rlen);
598 ret = -EINVAL;
599 goto out;
600 }
601 }
602
603 ret = 0;
604
605out:
606 return ret;
607}
608
609static int test_skcipher(struct crypto_ablkcipher *tfm, int enc,
610 struct cipher_testvec *template, unsigned int tcount)
611{
612 const char *algo =
613 crypto_tfm_alg_driver_name(crypto_ablkcipher_tfm(tfm));
614 unsigned int i, j, k, n, temp;
615 int ret;
616 char *q;
617 struct ablkcipher_request *req;
618 struct scatterlist sg[8];
619 const char *e;
620 struct tcrypt_result result;
621 void *data;
622 char iv[MAX_IVLEN];
623
624 if (enc == ENCRYPT)
625 e = "encryption";
626 else
627 e = "decryption";
628
629 init_completion(&result.completion);
630
631 req = ablkcipher_request_alloc(tfm, GFP_KERNEL);
632 if (!req) {
633 printk(KERN_ERR "alg: skcipher: Failed to allocate request "
634 "for %s\n", algo);
635 ret = -ENOMEM;
636 goto out;
637 }
638
639 ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
640 tcrypt_complete, &result);
641
642 j = 0;
643 for (i = 0; i < tcount; i++) {
644 if (template[i].iv)
645 memcpy(iv, template[i].iv, MAX_IVLEN);
646 else
647 memset(iv, 0, MAX_IVLEN);
648
649 if (!(template[i].np)) {
650 j++;
651
652 data = xbuf[0];
653 memcpy(data, template[i].input, template[i].ilen);
654
655 crypto_ablkcipher_clear_flags(tfm, ~0);
656 if (template[i].wk)
657 crypto_ablkcipher_set_flags(
658 tfm, CRYPTO_TFM_REQ_WEAK_KEY);
659
660 ret = crypto_ablkcipher_setkey(tfm, template[i].key,
661 template[i].klen);
662 if (!ret == template[i].fail) {
663 printk(KERN_ERR "alg: skcipher: setkey failed "
664 "on test %d for %s: flags=%x\n", j,
665 algo, crypto_ablkcipher_get_flags(tfm));
666 goto out;
667 } else if (ret)
668 continue;
669
670 sg_init_one(&sg[0], data, template[i].ilen);
671
672 ablkcipher_request_set_crypt(req, sg, sg,
673 template[i].ilen, iv);
674 ret = enc ?
675 crypto_ablkcipher_encrypt(req) :
676 crypto_ablkcipher_decrypt(req);
677
678 switch (ret) {
679 case 0:
680 break;
681 case -EINPROGRESS:
682 case -EBUSY:
683 ret = wait_for_completion_interruptible(
684 &result.completion);
685 if (!ret && !((ret = result.err))) {
686 INIT_COMPLETION(result.completion);
687 break;
688 }
689 /* fall through */
690 default:
691 printk(KERN_ERR "alg: skcipher: %s failed on "
692 "test %d for %s: ret=%d\n", e, j, algo,
693 -ret);
694 goto out;
695 }
696
697 q = data;
698 if (memcmp(q, template[i].result, template[i].rlen)) {
699 printk(KERN_ERR "alg: skcipher: Test %d "
700 "failed on %s for %s\n", j, e, algo);
701 hexdump(q, template[i].rlen);
702 ret = -EINVAL;
703 goto out;
704 }
705 }
706 }
707
708 j = 0;
709 for (i = 0; i < tcount; i++) {
710
711 if (template[i].iv)
712 memcpy(iv, template[i].iv, MAX_IVLEN);
713 else
714 memset(iv, 0, MAX_IVLEN);
715
716 if (template[i].np) {
717 j++;
718
719 crypto_ablkcipher_clear_flags(tfm, ~0);
720 if (template[i].wk)
721 crypto_ablkcipher_set_flags(
722 tfm, CRYPTO_TFM_REQ_WEAK_KEY);
723
724 ret = crypto_ablkcipher_setkey(tfm, template[i].key,
725 template[i].klen);
726 if (!ret == template[i].fail) {
727 printk(KERN_ERR "alg: skcipher: setkey failed "
728 "on chunk test %d for %s: flags=%x\n",
729 j, algo,
730 crypto_ablkcipher_get_flags(tfm));
731 goto out;
732 } else if (ret)
733 continue;
734
735 temp = 0;
736 ret = -EINVAL;
737 sg_init_table(sg, template[i].np);
738 for (k = 0; k < template[i].np; k++) {
739 if (WARN_ON(offset_in_page(IDX[k]) +
740 template[i].tap[k] > PAGE_SIZE))
741 goto out;
742
743 q = xbuf[IDX[k] >> PAGE_SHIFT] +
744 offset_in_page(IDX[k]);
745
746 memcpy(q, template[i].input + temp,
747 template[i].tap[k]);
748
749 if (offset_in_page(q) + template[i].tap[k] <
750 PAGE_SIZE)
751 q[template[i].tap[k]] = 0;
752
753 sg_set_buf(&sg[k], q, template[i].tap[k]);
754
755 temp += template[i].tap[k];
756 }
757
758 ablkcipher_request_set_crypt(req, sg, sg,
759 template[i].ilen, iv);
760
761 ret = enc ?
762 crypto_ablkcipher_encrypt(req) :
763 crypto_ablkcipher_decrypt(req);
764
765 switch (ret) {
766 case 0:
767 break;
768 case -EINPROGRESS:
769 case -EBUSY:
770 ret = wait_for_completion_interruptible(
771 &result.completion);
772 if (!ret && !((ret = result.err))) {
773 INIT_COMPLETION(result.completion);
774 break;
775 }
776 /* fall through */
777 default:
778 printk(KERN_ERR "alg: skcipher: %s failed on "
779 "chunk test %d for %s: ret=%d\n", e, j,
780 algo, -ret);
781 goto out;
782 }
783
784 temp = 0;
785 ret = -EINVAL;
786 for (k = 0; k < template[i].np; k++) {
787 q = xbuf[IDX[k] >> PAGE_SHIFT] +
788 offset_in_page(IDX[k]);
789
790 if (memcmp(q, template[i].result + temp,
791 template[i].tap[k])) {
792 printk(KERN_ERR "alg: skcipher: Chunk "
793 "test %d failed on %s at page "
794 "%u for %s\n", j, e, k, algo);
795 hexdump(q, template[i].tap[k]);
796 goto out;
797 }
798
799 q += template[i].tap[k];
800 for (n = 0; offset_in_page(q + n) && q[n]; n++)
801 ;
802 if (n) {
803 printk(KERN_ERR "alg: skcipher: "
804 "Result buffer corruption in "
805 "chunk test %d on %s at page "
806 "%u for %s: %u bytes:\n", j, e,
807 k, algo, n);
808 hexdump(q, n);
809 goto out;
810 }
811 temp += template[i].tap[k];
812 }
813 }
814 }
815
816 ret = 0;
817
818out:
819 ablkcipher_request_free(req);
820 return ret;
821}
822
823static int test_comp(struct crypto_comp *tfm, struct comp_testvec *ctemplate,
824 struct comp_testvec *dtemplate, int ctcount, int dtcount)
825{
826 const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm));
827 unsigned int i;
828 char result[COMP_BUF_SIZE];
829 int ret;
830
831 for (i = 0; i < ctcount; i++) {
832 int ilen, dlen = COMP_BUF_SIZE;
833
834 memset(result, 0, sizeof (result));
835
836 ilen = ctemplate[i].inlen;
837 ret = crypto_comp_compress(tfm, ctemplate[i].input,
838 ilen, result, &dlen);
839 if (ret) {
840 printk(KERN_ERR "alg: comp: compression failed "
841 "on test %d for %s: ret=%d\n", i + 1, algo,
842 -ret);
843 goto out;
844 }
845
846 if (memcmp(result, ctemplate[i].output, dlen)) {
847 printk(KERN_ERR "alg: comp: Compression test %d "
848 "failed for %s\n", i + 1, algo);
849 hexdump(result, dlen);
850 ret = -EINVAL;
851 goto out;
852 }
853 }
854
855 for (i = 0; i < dtcount; i++) {
856 int ilen, ret, dlen = COMP_BUF_SIZE;
857
858 memset(result, 0, sizeof (result));
859
860 ilen = dtemplate[i].inlen;
861 ret = crypto_comp_decompress(tfm, dtemplate[i].input,
862 ilen, result, &dlen);
863 if (ret) {
864 printk(KERN_ERR "alg: comp: decompression failed "
865 "on test %d for %s: ret=%d\n", i + 1, algo,
866 -ret);
867 goto out;
868 }
869
870 if (memcmp(result, dtemplate[i].output, dlen)) {
871 printk(KERN_ERR "alg: comp: Decompression test %d "
872 "failed for %s\n", i + 1, algo);
873 hexdump(result, dlen);
874 ret = -EINVAL;
875 goto out;
876 }
877 }
878
879 ret = 0;
880
881out:
882 return ret;
883}
884
885static int alg_test_aead(const struct alg_test_desc *desc, const char *driver,
886 u32 type, u32 mask)
887{
888 struct crypto_aead *tfm;
889 int err = 0;
890
891 tfm = crypto_alloc_aead(driver, type, mask);
892 if (IS_ERR(tfm)) {
893 printk(KERN_ERR "alg: aead: Failed to load transform for %s: "
894 "%ld\n", driver, PTR_ERR(tfm));
895 return PTR_ERR(tfm);
896 }
897
898 if (desc->suite.aead.enc.vecs) {
899 err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs,
900 desc->suite.aead.enc.count);
901 if (err)
902 goto out;
903 }
904
905 if (!err && desc->suite.aead.dec.vecs)
906 err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs,
907 desc->suite.aead.dec.count);
908
909out:
910 crypto_free_aead(tfm);
911 return err;
912}
913
914static int alg_test_cipher(const struct alg_test_desc *desc,
915 const char *driver, u32 type, u32 mask)
916{
917 struct crypto_cipher *tfm;
918 int err = 0;
919
920 tfm = crypto_alloc_cipher(driver, type, mask);
921 if (IS_ERR(tfm)) {
922 printk(KERN_ERR "alg: cipher: Failed to load transform for "
923 "%s: %ld\n", driver, PTR_ERR(tfm));
924 return PTR_ERR(tfm);
925 }
926
927 if (desc->suite.cipher.enc.vecs) {
928 err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
929 desc->suite.cipher.enc.count);
930 if (err)
931 goto out;
932 }
933
934 if (desc->suite.cipher.dec.vecs)
935 err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
936 desc->suite.cipher.dec.count);
937
938out:
939 crypto_free_cipher(tfm);
940 return err;
941}
942
943static int alg_test_skcipher(const struct alg_test_desc *desc,
944 const char *driver, u32 type, u32 mask)
945{
946 struct crypto_ablkcipher *tfm;
947 int err = 0;
948
949 tfm = crypto_alloc_ablkcipher(driver, type, mask);
950 if (IS_ERR(tfm)) {
951 printk(KERN_ERR "alg: skcipher: Failed to load transform for "
952 "%s: %ld\n", driver, PTR_ERR(tfm));
953 return PTR_ERR(tfm);
954 }
955
956 if (desc->suite.cipher.enc.vecs) {
957 err = test_skcipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
958 desc->suite.cipher.enc.count);
959 if (err)
960 goto out;
961 }
962
963 if (desc->suite.cipher.dec.vecs)
964 err = test_skcipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
965 desc->suite.cipher.dec.count);
966
967out:
968 crypto_free_ablkcipher(tfm);
969 return err;
970}
971
972static int alg_test_comp(const struct alg_test_desc *desc, const char *driver,
973 u32 type, u32 mask)
974{
975 struct crypto_comp *tfm;
976 int err;
977
978 tfm = crypto_alloc_comp(driver, type, mask);
979 if (IS_ERR(tfm)) {
980 printk(KERN_ERR "alg: comp: Failed to load transform for %s: "
981 "%ld\n", driver, PTR_ERR(tfm));
982 return PTR_ERR(tfm);
983 }
984
985 err = test_comp(tfm, desc->suite.comp.comp.vecs,
986 desc->suite.comp.decomp.vecs,
987 desc->suite.comp.comp.count,
988 desc->suite.comp.decomp.count);
989
990 crypto_free_comp(tfm);
991 return err;
992}
993
994static int alg_test_hash(const struct alg_test_desc *desc, const char *driver,
995 u32 type, u32 mask)
996{
997 struct crypto_ahash *tfm;
998 int err;
999
1000 tfm = crypto_alloc_ahash(driver, type, mask);
1001 if (IS_ERR(tfm)) {
1002 printk(KERN_ERR "alg: hash: Failed to load transform for %s: "
1003 "%ld\n", driver, PTR_ERR(tfm));
1004 return PTR_ERR(tfm);
1005 }
1006
1007 err = test_hash(tfm, desc->suite.hash.vecs, desc->suite.hash.count);
1008
1009 crypto_free_ahash(tfm);
1010 return err;
1011}
1012
1013/* Please keep this list sorted by algorithm name. */
1014static const struct alg_test_desc alg_test_descs[] = {
1015 {
1016 .alg = "cbc(aes)",
1017 .test = alg_test_skcipher,
1018 .suite = {
1019 .cipher = {
1020 .enc = {
1021 .vecs = aes_cbc_enc_tv_template,
1022 .count = AES_CBC_ENC_TEST_VECTORS
1023 },
1024 .dec = {
1025 .vecs = aes_cbc_dec_tv_template,
1026 .count = AES_CBC_DEC_TEST_VECTORS
1027 }
1028 }
1029 }
1030 }, {
1031 .alg = "cbc(anubis)",
1032 .test = alg_test_skcipher,
1033 .suite = {
1034 .cipher = {
1035 .enc = {
1036 .vecs = anubis_cbc_enc_tv_template,
1037 .count = ANUBIS_CBC_ENC_TEST_VECTORS
1038 },
1039 .dec = {
1040 .vecs = anubis_cbc_dec_tv_template,
1041 .count = ANUBIS_CBC_DEC_TEST_VECTORS
1042 }
1043 }
1044 }
1045 }, {
1046 .alg = "cbc(blowfish)",
1047 .test = alg_test_skcipher,
1048 .suite = {
1049 .cipher = {
1050 .enc = {
1051 .vecs = bf_cbc_enc_tv_template,
1052 .count = BF_CBC_ENC_TEST_VECTORS
1053 },
1054 .dec = {
1055 .vecs = bf_cbc_dec_tv_template,
1056 .count = BF_CBC_DEC_TEST_VECTORS
1057 }
1058 }
1059 }
1060 }, {
1061 .alg = "cbc(camellia)",
1062 .test = alg_test_skcipher,
1063 .suite = {
1064 .cipher = {
1065 .enc = {
1066 .vecs = camellia_cbc_enc_tv_template,
1067 .count = CAMELLIA_CBC_ENC_TEST_VECTORS
1068 },
1069 .dec = {
1070 .vecs = camellia_cbc_dec_tv_template,
1071 .count = CAMELLIA_CBC_DEC_TEST_VECTORS
1072 }
1073 }
1074 }
1075 }, {
1076 .alg = "cbc(des)",
1077 .test = alg_test_skcipher,
1078 .suite = {
1079 .cipher = {
1080 .enc = {
1081 .vecs = des_cbc_enc_tv_template,
1082 .count = DES_CBC_ENC_TEST_VECTORS
1083 },
1084 .dec = {
1085 .vecs = des_cbc_dec_tv_template,
1086 .count = DES_CBC_DEC_TEST_VECTORS
1087 }
1088 }
1089 }
1090 }, {
1091 .alg = "cbc(des3_ede)",
1092 .test = alg_test_skcipher,
1093 .suite = {
1094 .cipher = {
1095 .enc = {
1096 .vecs = des3_ede_cbc_enc_tv_template,
1097 .count = DES3_EDE_CBC_ENC_TEST_VECTORS
1098 },
1099 .dec = {
1100 .vecs = des3_ede_cbc_dec_tv_template,
1101 .count = DES3_EDE_CBC_DEC_TEST_VECTORS
1102 }
1103 }
1104 }
1105 }, {
1106 .alg = "cbc(twofish)",
1107 .test = alg_test_skcipher,
1108 .suite = {
1109 .cipher = {
1110 .enc = {
1111 .vecs = tf_cbc_enc_tv_template,
1112 .count = TF_CBC_ENC_TEST_VECTORS
1113 },
1114 .dec = {
1115 .vecs = tf_cbc_dec_tv_template,
1116 .count = TF_CBC_DEC_TEST_VECTORS
1117 }
1118 }
1119 }
1120 }, {
1121 .alg = "ccm(aes)",
1122 .test = alg_test_aead,
1123 .suite = {
1124 .aead = {
1125 .enc = {
1126 .vecs = aes_ccm_enc_tv_template,
1127 .count = AES_CCM_ENC_TEST_VECTORS
1128 },
1129 .dec = {
1130 .vecs = aes_ccm_dec_tv_template,
1131 .count = AES_CCM_DEC_TEST_VECTORS
1132 }
1133 }
1134 }
1135 }, {
1136 .alg = "crc32c",
1137 .test = alg_test_hash,
1138 .suite = {
1139 .hash = {
1140 .vecs = crc32c_tv_template,
1141 .count = CRC32C_TEST_VECTORS
1142 }
1143 }
1144 }, {
1145 .alg = "cts(cbc(aes))",
1146 .test = alg_test_skcipher,
1147 .suite = {
1148 .cipher = {
1149 .enc = {
1150 .vecs = cts_mode_enc_tv_template,
1151 .count = CTS_MODE_ENC_TEST_VECTORS
1152 },
1153 .dec = {
1154 .vecs = cts_mode_dec_tv_template,
1155 .count = CTS_MODE_DEC_TEST_VECTORS
1156 }
1157 }
1158 }
1159 }, {
1160 .alg = "deflate",
1161 .test = alg_test_comp,
1162 .suite = {
1163 .comp = {
1164 .comp = {
1165 .vecs = deflate_comp_tv_template,
1166 .count = DEFLATE_COMP_TEST_VECTORS
1167 },
1168 .decomp = {
1169 .vecs = deflate_decomp_tv_template,
1170 .count = DEFLATE_DECOMP_TEST_VECTORS
1171 }
1172 }
1173 }
1174 }, {
1175 .alg = "ecb(aes)",
1176 .test = alg_test_skcipher,
1177 .suite = {
1178 .cipher = {
1179 .enc = {
1180 .vecs = aes_enc_tv_template,
1181 .count = AES_ENC_TEST_VECTORS
1182 },
1183 .dec = {
1184 .vecs = aes_dec_tv_template,
1185 .count = AES_DEC_TEST_VECTORS
1186 }
1187 }
1188 }
1189 }, {
1190 .alg = "ecb(anubis)",
1191 .test = alg_test_skcipher,
1192 .suite = {
1193 .cipher = {
1194 .enc = {
1195 .vecs = anubis_enc_tv_template,
1196 .count = ANUBIS_ENC_TEST_VECTORS
1197 },
1198 .dec = {
1199 .vecs = anubis_dec_tv_template,
1200 .count = ANUBIS_DEC_TEST_VECTORS
1201 }
1202 }
1203 }
1204 }, {
1205 .alg = "ecb(arc4)",
1206 .test = alg_test_skcipher,
1207 .suite = {
1208 .cipher = {
1209 .enc = {
1210 .vecs = arc4_enc_tv_template,
1211 .count = ARC4_ENC_TEST_VECTORS
1212 },
1213 .dec = {
1214 .vecs = arc4_dec_tv_template,
1215 .count = ARC4_DEC_TEST_VECTORS
1216 }
1217 }
1218 }
1219 }, {
1220 .alg = "ecb(blowfish)",
1221 .test = alg_test_skcipher,
1222 .suite = {
1223 .cipher = {
1224 .enc = {
1225 .vecs = bf_enc_tv_template,
1226 .count = BF_ENC_TEST_VECTORS
1227 },
1228 .dec = {
1229 .vecs = bf_dec_tv_template,
1230 .count = BF_DEC_TEST_VECTORS
1231 }
1232 }
1233 }
1234 }, {
1235 .alg = "ecb(camellia)",
1236 .test = alg_test_skcipher,
1237 .suite = {
1238 .cipher = {
1239 .enc = {
1240 .vecs = camellia_enc_tv_template,
1241 .count = CAMELLIA_ENC_TEST_VECTORS
1242 },
1243 .dec = {
1244 .vecs = camellia_dec_tv_template,
1245 .count = CAMELLIA_DEC_TEST_VECTORS
1246 }
1247 }
1248 }
1249 }, {
1250 .alg = "ecb(cast5)",
1251 .test = alg_test_skcipher,
1252 .suite = {
1253 .cipher = {
1254 .enc = {
1255 .vecs = cast5_enc_tv_template,
1256 .count = CAST5_ENC_TEST_VECTORS
1257 },
1258 .dec = {
1259 .vecs = cast5_dec_tv_template,
1260 .count = CAST5_DEC_TEST_VECTORS
1261 }
1262 }
1263 }
1264 }, {
1265 .alg = "ecb(cast6)",
1266 .test = alg_test_skcipher,
1267 .suite = {
1268 .cipher = {
1269 .enc = {
1270 .vecs = cast6_enc_tv_template,
1271 .count = CAST6_ENC_TEST_VECTORS
1272 },
1273 .dec = {
1274 .vecs = cast6_dec_tv_template,
1275 .count = CAST6_DEC_TEST_VECTORS
1276 }
1277 }
1278 }
1279 }, {
1280 .alg = "ecb(des)",
1281 .test = alg_test_skcipher,
1282 .suite = {
1283 .cipher = {
1284 .enc = {
1285 .vecs = des_enc_tv_template,
1286 .count = DES_ENC_TEST_VECTORS
1287 },
1288 .dec = {
1289 .vecs = des_dec_tv_template,
1290 .count = DES_DEC_TEST_VECTORS
1291 }
1292 }
1293 }
1294 }, {
1295 .alg = "ecb(des3_ede)",
1296 .test = alg_test_skcipher,
1297 .suite = {
1298 .cipher = {
1299 .enc = {
1300 .vecs = des3_ede_enc_tv_template,
1301 .count = DES3_EDE_ENC_TEST_VECTORS
1302 },
1303 .dec = {
1304 .vecs = des3_ede_dec_tv_template,
1305 .count = DES3_EDE_DEC_TEST_VECTORS
1306 }
1307 }
1308 }
1309 }, {
1310 .alg = "ecb(khazad)",
1311 .test = alg_test_skcipher,
1312 .suite = {
1313 .cipher = {
1314 .enc = {
1315 .vecs = khazad_enc_tv_template,
1316 .count = KHAZAD_ENC_TEST_VECTORS
1317 },
1318 .dec = {
1319 .vecs = khazad_dec_tv_template,
1320 .count = KHAZAD_DEC_TEST_VECTORS
1321 }
1322 }
1323 }
1324 }, {
1325 .alg = "ecb(seed)",
1326 .test = alg_test_skcipher,
1327 .suite = {
1328 .cipher = {
1329 .enc = {
1330 .vecs = seed_enc_tv_template,
1331 .count = SEED_ENC_TEST_VECTORS
1332 },
1333 .dec = {
1334 .vecs = seed_dec_tv_template,
1335 .count = SEED_DEC_TEST_VECTORS
1336 }
1337 }
1338 }
1339 }, {
1340 .alg = "ecb(serpent)",
1341 .test = alg_test_skcipher,
1342 .suite = {
1343 .cipher = {
1344 .enc = {
1345 .vecs = serpent_enc_tv_template,
1346 .count = SERPENT_ENC_TEST_VECTORS
1347 },
1348 .dec = {
1349 .vecs = serpent_dec_tv_template,
1350 .count = SERPENT_DEC_TEST_VECTORS
1351 }
1352 }
1353 }
1354 }, {
1355 .alg = "ecb(tea)",
1356 .test = alg_test_skcipher,
1357 .suite = {
1358 .cipher = {
1359 .enc = {
1360 .vecs = tea_enc_tv_template,
1361 .count = TEA_ENC_TEST_VECTORS
1362 },
1363 .dec = {
1364 .vecs = tea_dec_tv_template,
1365 .count = TEA_DEC_TEST_VECTORS
1366 }
1367 }
1368 }
1369 }, {
1370 .alg = "ecb(tnepres)",
1371 .test = alg_test_skcipher,
1372 .suite = {
1373 .cipher = {
1374 .enc = {
1375 .vecs = tnepres_enc_tv_template,
1376 .count = TNEPRES_ENC_TEST_VECTORS
1377 },
1378 .dec = {
1379 .vecs = tnepres_dec_tv_template,
1380 .count = TNEPRES_DEC_TEST_VECTORS
1381 }
1382 }
1383 }
1384 }, {
1385 .alg = "ecb(twofish)",
1386 .test = alg_test_skcipher,
1387 .suite = {
1388 .cipher = {
1389 .enc = {
1390 .vecs = tf_enc_tv_template,
1391 .count = TF_ENC_TEST_VECTORS
1392 },
1393 .dec = {
1394 .vecs = tf_dec_tv_template,
1395 .count = TF_DEC_TEST_VECTORS
1396 }
1397 }
1398 }
1399 }, {
1400 .alg = "ecb(xeta)",
1401 .test = alg_test_skcipher,
1402 .suite = {
1403 .cipher = {
1404 .enc = {
1405 .vecs = xeta_enc_tv_template,
1406 .count = XETA_ENC_TEST_VECTORS
1407 },
1408 .dec = {
1409 .vecs = xeta_dec_tv_template,
1410 .count = XETA_DEC_TEST_VECTORS
1411 }
1412 }
1413 }
1414 }, {
1415 .alg = "ecb(xtea)",
1416 .test = alg_test_skcipher,
1417 .suite = {
1418 .cipher = {
1419 .enc = {
1420 .vecs = xtea_enc_tv_template,
1421 .count = XTEA_ENC_TEST_VECTORS
1422 },
1423 .dec = {
1424 .vecs = xtea_dec_tv_template,
1425 .count = XTEA_DEC_TEST_VECTORS
1426 }
1427 }
1428 }
1429 }, {
1430 .alg = "gcm(aes)",
1431 .test = alg_test_aead,
1432 .suite = {
1433 .aead = {
1434 .enc = {
1435 .vecs = aes_gcm_enc_tv_template,
1436 .count = AES_GCM_ENC_TEST_VECTORS
1437 },
1438 .dec = {
1439 .vecs = aes_gcm_dec_tv_template,
1440 .count = AES_GCM_DEC_TEST_VECTORS
1441 }
1442 }
1443 }
1444 }, {
1445 .alg = "hmac(md5)",
1446 .test = alg_test_hash,
1447 .suite = {
1448 .hash = {
1449 .vecs = hmac_md5_tv_template,
1450 .count = HMAC_MD5_TEST_VECTORS
1451 }
1452 }
1453 }, {
1454 .alg = "hmac(rmd128)",
1455 .test = alg_test_hash,
1456 .suite = {
1457 .hash = {
1458 .vecs = hmac_rmd128_tv_template,
1459 .count = HMAC_RMD128_TEST_VECTORS
1460 }
1461 }
1462 }, {
1463 .alg = "hmac(rmd160)",
1464 .test = alg_test_hash,
1465 .suite = {
1466 .hash = {
1467 .vecs = hmac_rmd160_tv_template,
1468 .count = HMAC_RMD160_TEST_VECTORS
1469 }
1470 }
1471 }, {
1472 .alg = "hmac(sha1)",
1473 .test = alg_test_hash,
1474 .suite = {
1475 .hash = {
1476 .vecs = hmac_sha1_tv_template,
1477 .count = HMAC_SHA1_TEST_VECTORS
1478 }
1479 }
1480 }, {
1481 .alg = "hmac(sha224)",
1482 .test = alg_test_hash,
1483 .suite = {
1484 .hash = {
1485 .vecs = hmac_sha224_tv_template,
1486 .count = HMAC_SHA224_TEST_VECTORS
1487 }
1488 }
1489 }, {
1490 .alg = "hmac(sha256)",
1491 .test = alg_test_hash,
1492 .suite = {
1493 .hash = {
1494 .vecs = hmac_sha256_tv_template,
1495 .count = HMAC_SHA256_TEST_VECTORS
1496 }
1497 }
1498 }, {
1499 .alg = "hmac(sha384)",
1500 .test = alg_test_hash,
1501 .suite = {
1502 .hash = {
1503 .vecs = hmac_sha384_tv_template,
1504 .count = HMAC_SHA384_TEST_VECTORS
1505 }
1506 }
1507 }, {
1508 .alg = "hmac(sha512)",
1509 .test = alg_test_hash,
1510 .suite = {
1511 .hash = {
1512 .vecs = hmac_sha512_tv_template,
1513 .count = HMAC_SHA512_TEST_VECTORS
1514 }
1515 }
1516 }, {
1517 .alg = "lrw(aes)",
1518 .test = alg_test_skcipher,
1519 .suite = {
1520 .cipher = {
1521 .enc = {
1522 .vecs = aes_lrw_enc_tv_template,
1523 .count = AES_LRW_ENC_TEST_VECTORS
1524 },
1525 .dec = {
1526 .vecs = aes_lrw_dec_tv_template,
1527 .count = AES_LRW_DEC_TEST_VECTORS
1528 }
1529 }
1530 }
1531 }, {
1532 .alg = "lzo",
1533 .test = alg_test_comp,
1534 .suite = {
1535 .comp = {
1536 .comp = {
1537 .vecs = lzo_comp_tv_template,
1538 .count = LZO_COMP_TEST_VECTORS
1539 },
1540 .decomp = {
1541 .vecs = lzo_decomp_tv_template,
1542 .count = LZO_DECOMP_TEST_VECTORS
1543 }
1544 }
1545 }
1546 }, {
1547 .alg = "md4",
1548 .test = alg_test_hash,
1549 .suite = {
1550 .hash = {
1551 .vecs = md4_tv_template,
1552 .count = MD4_TEST_VECTORS
1553 }
1554 }
1555 }, {
1556 .alg = "md5",
1557 .test = alg_test_hash,
1558 .suite = {
1559 .hash = {
1560 .vecs = md5_tv_template,
1561 .count = MD5_TEST_VECTORS
1562 }
1563 }
1564 }, {
1565 .alg = "michael_mic",
1566 .test = alg_test_hash,
1567 .suite = {
1568 .hash = {
1569 .vecs = michael_mic_tv_template,
1570 .count = MICHAEL_MIC_TEST_VECTORS
1571 }
1572 }
1573 }, {
1574 .alg = "pcbc(fcrypt)",
1575 .test = alg_test_skcipher,
1576 .suite = {
1577 .cipher = {
1578 .enc = {
1579 .vecs = fcrypt_pcbc_enc_tv_template,
1580 .count = FCRYPT_ENC_TEST_VECTORS
1581 },
1582 .dec = {
1583 .vecs = fcrypt_pcbc_dec_tv_template,
1584 .count = FCRYPT_DEC_TEST_VECTORS
1585 }
1586 }
1587 }
1588 }, {
1589 .alg = "rfc3686(ctr(aes))",
1590 .test = alg_test_skcipher,
1591 .suite = {
1592 .cipher = {
1593 .enc = {
1594 .vecs = aes_ctr_enc_tv_template,
1595 .count = AES_CTR_ENC_TEST_VECTORS
1596 },
1597 .dec = {
1598 .vecs = aes_ctr_dec_tv_template,
1599 .count = AES_CTR_DEC_TEST_VECTORS
1600 }
1601 }
1602 }
1603 }, {
1604 .alg = "rmd128",
1605 .test = alg_test_hash,
1606 .suite = {
1607 .hash = {
1608 .vecs = rmd128_tv_template,
1609 .count = RMD128_TEST_VECTORS
1610 }
1611 }
1612 }, {
1613 .alg = "rmd160",
1614 .test = alg_test_hash,
1615 .suite = {
1616 .hash = {
1617 .vecs = rmd160_tv_template,
1618 .count = RMD160_TEST_VECTORS
1619 }
1620 }
1621 }, {
1622 .alg = "rmd256",
1623 .test = alg_test_hash,
1624 .suite = {
1625 .hash = {
1626 .vecs = rmd256_tv_template,
1627 .count = RMD256_TEST_VECTORS
1628 }
1629 }
1630 }, {
1631 .alg = "rmd320",
1632 .test = alg_test_hash,
1633 .suite = {
1634 .hash = {
1635 .vecs = rmd320_tv_template,
1636 .count = RMD320_TEST_VECTORS
1637 }
1638 }
1639 }, {
1640 .alg = "salsa20",
1641 .test = alg_test_skcipher,
1642 .suite = {
1643 .cipher = {
1644 .enc = {
1645 .vecs = salsa20_stream_enc_tv_template,
1646 .count = SALSA20_STREAM_ENC_TEST_VECTORS
1647 }
1648 }
1649 }
1650 }, {
1651 .alg = "sha1",
1652 .test = alg_test_hash,
1653 .suite = {
1654 .hash = {
1655 .vecs = sha1_tv_template,
1656 .count = SHA1_TEST_VECTORS
1657 }
1658 }
1659 }, {
1660 .alg = "sha224",
1661 .test = alg_test_hash,
1662 .suite = {
1663 .hash = {
1664 .vecs = sha224_tv_template,
1665 .count = SHA224_TEST_VECTORS
1666 }
1667 }
1668 }, {
1669 .alg = "sha256",
1670 .test = alg_test_hash,
1671 .suite = {
1672 .hash = {
1673 .vecs = sha256_tv_template,
1674 .count = SHA256_TEST_VECTORS
1675 }
1676 }
1677 }, {
1678 .alg = "sha384",
1679 .test = alg_test_hash,
1680 .suite = {
1681 .hash = {
1682 .vecs = sha384_tv_template,
1683 .count = SHA384_TEST_VECTORS
1684 }
1685 }
1686 }, {
1687 .alg = "sha512",
1688 .test = alg_test_hash,
1689 .suite = {
1690 .hash = {
1691 .vecs = sha512_tv_template,
1692 .count = SHA512_TEST_VECTORS
1693 }
1694 }
1695 }, {
1696 .alg = "tgr128",
1697 .test = alg_test_hash,
1698 .suite = {
1699 .hash = {
1700 .vecs = tgr128_tv_template,
1701 .count = TGR128_TEST_VECTORS
1702 }
1703 }
1704 }, {
1705 .alg = "tgr160",
1706 .test = alg_test_hash,
1707 .suite = {
1708 .hash = {
1709 .vecs = tgr160_tv_template,
1710 .count = TGR160_TEST_VECTORS
1711 }
1712 }
1713 }, {
1714 .alg = "tgr192",
1715 .test = alg_test_hash,
1716 .suite = {
1717 .hash = {
1718 .vecs = tgr192_tv_template,
1719 .count = TGR192_TEST_VECTORS
1720 }
1721 }
1722 }, {
1723 .alg = "wp256",
1724 .test = alg_test_hash,
1725 .suite = {
1726 .hash = {
1727 .vecs = wp256_tv_template,
1728 .count = WP256_TEST_VECTORS
1729 }
1730 }
1731 }, {
1732 .alg = "wp384",
1733 .test = alg_test_hash,
1734 .suite = {
1735 .hash = {
1736 .vecs = wp384_tv_template,
1737 .count = WP384_TEST_VECTORS
1738 }
1739 }
1740 }, {
1741 .alg = "wp512",
1742 .test = alg_test_hash,
1743 .suite = {
1744 .hash = {
1745 .vecs = wp512_tv_template,
1746 .count = WP512_TEST_VECTORS
1747 }
1748 }
1749 }, {
1750 .alg = "xcbc(aes)",
1751 .test = alg_test_hash,
1752 .suite = {
1753 .hash = {
1754 .vecs = aes_xcbc128_tv_template,
1755 .count = XCBC_AES_TEST_VECTORS
1756 }
1757 }
1758 }, {
1759 .alg = "xts(aes)",
1760 .test = alg_test_skcipher,
1761 .suite = {
1762 .cipher = {
1763 .enc = {
1764 .vecs = aes_xts_enc_tv_template,
1765 .count = AES_XTS_ENC_TEST_VECTORS
1766 },
1767 .dec = {
1768 .vecs = aes_xts_dec_tv_template,
1769 .count = AES_XTS_DEC_TEST_VECTORS
1770 }
1771 }
1772 }
1773 }
1774};
1775
1776static int alg_find_test(const char *alg)
1777{
1778 int start = 0;
1779 int end = ARRAY_SIZE(alg_test_descs);
1780
1781 while (start < end) {
1782 int i = (start + end) / 2;
1783 int diff = strcmp(alg_test_descs[i].alg, alg);
1784
1785 if (diff > 0) {
1786 end = i;
1787 continue;
1788 }
1789
1790 if (diff < 0) {
1791 start = i + 1;
1792 continue;
1793 }
1794
1795 return i;
1796 }
1797
1798 return -1;
1799}
1800
1801int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
1802{
1803 int i;
1804
1805 if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) {
1806 char nalg[CRYPTO_MAX_ALG_NAME];
1807
1808 if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >=
1809 sizeof(nalg))
1810 return -ENAMETOOLONG;
1811
1812 i = alg_find_test(nalg);
1813 if (i < 0)
1814 goto notest;
1815
1816 return alg_test_cipher(alg_test_descs + i, driver, type, mask);
1817 }
1818
1819 i = alg_find_test(alg);
1820 if (i < 0)
1821 goto notest;
1822
1823 return alg_test_descs[i].test(alg_test_descs + i, driver,
1824 type, mask);
1825
1826notest:
1827 printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver);
1828 return 0;
1829}
1830EXPORT_SYMBOL_GPL(alg_test);
1831
1832int __init testmgr_init(void)
1833{
1834 int i;
1835
1836 for (i = 0; i < XBUFSIZE; i++) {
1837 xbuf[i] = (void *)__get_free_page(GFP_KERNEL);
1838 if (!xbuf[i])
1839 goto err_free_xbuf;
1840 }
1841
1842 for (i = 0; i < XBUFSIZE; i++) {
1843 axbuf[i] = (void *)__get_free_page(GFP_KERNEL);
1844 if (!axbuf[i])
1845 goto err_free_axbuf;
1846 }
1847
1848 return 0;
1849
1850err_free_axbuf:
1851 for (i = 0; i < XBUFSIZE && axbuf[i]; i++)
1852 free_page((unsigned long)axbuf[i]);
1853err_free_xbuf:
1854 for (i = 0; i < XBUFSIZE && xbuf[i]; i++)
1855 free_page((unsigned long)xbuf[i]);
1856
1857 return -ENOMEM;
1858}
1859
1860void testmgr_exit(void)
1861{
1862 int i;
1863
1864 for (i = 0; i < XBUFSIZE; i++)
1865 free_page((unsigned long)axbuf[i]);
1866 for (i = 0; i < XBUFSIZE; i++)
1867 free_page((unsigned long)xbuf[i]);
1868}
diff --git a/crypto/testmgr.h b/crypto/testmgr.h
new file mode 100644
index 000000000000..dee94d9ecfba
--- /dev/null
+++ b/crypto/testmgr.h
@@ -0,0 +1,8738 @@
1/*
2 * Algorithm testing framework and tests.
3 *
4 * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
5 * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org>
6 * Copyright (c) 2007 Nokia Siemens Networks
7 * Copyright (c) 2008 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#ifndef _CRYPTO_TESTMGR_H
16#define _CRYPTO_TESTMGR_H
17
18#define MAX_DIGEST_SIZE 64
19#define MAX_TAP 8
20
21#define MAX_KEYLEN 56
22#define MAX_IVLEN 32
23
24struct hash_testvec {
25 /* only used with keyed hash algorithms */
26 char *key;
27 char *plaintext;
28 char *digest;
29 unsigned char tap[MAX_TAP];
30 unsigned char psize;
31 unsigned char np;
32 unsigned char ksize;
33};
34
35struct cipher_testvec {
36 char *key;
37 char *iv;
38 char *input;
39 char *result;
40 unsigned short tap[MAX_TAP];
41 int np;
42 unsigned char fail;
43 unsigned char wk; /* weak key flag */
44 unsigned char klen;
45 unsigned short ilen;
46 unsigned short rlen;
47};
48
49struct aead_testvec {
50 char *key;
51 char *iv;
52 char *input;
53 char *assoc;
54 char *result;
55 unsigned char tap[MAX_TAP];
56 unsigned char atap[MAX_TAP];
57 int np;
58 int anp;
59 unsigned char fail;
60 unsigned char wk; /* weak key flag */
61 unsigned char klen;
62 unsigned short ilen;
63 unsigned short alen;
64 unsigned short rlen;
65};
66
67static char zeroed_string[48];
68
69/*
70 * MD4 test vectors from RFC1320
71 */
72#define MD4_TEST_VECTORS 7
73
74static struct hash_testvec md4_tv_template [] = {
75 {
76 .plaintext = "",
77 .digest = "\x31\xd6\xcf\xe0\xd1\x6a\xe9\x31"
78 "\xb7\x3c\x59\xd7\xe0\xc0\x89\xc0",
79 }, {
80 .plaintext = "a",
81 .psize = 1,
82 .digest = "\xbd\xe5\x2c\xb3\x1d\xe3\x3e\x46"
83 "\x24\x5e\x05\xfb\xdb\xd6\xfb\x24",
84 }, {
85 .plaintext = "abc",
86 .psize = 3,
87 .digest = "\xa4\x48\x01\x7a\xaf\x21\xd8\x52"
88 "\x5f\xc1\x0a\xe8\x7a\xa6\x72\x9d",
89 }, {
90 .plaintext = "message digest",
91 .psize = 14,
92 .digest = "\xd9\x13\x0a\x81\x64\x54\x9f\xe8"
93 "\x18\x87\x48\x06\xe1\xc7\x01\x4b",
94 }, {
95 .plaintext = "abcdefghijklmnopqrstuvwxyz",
96 .psize = 26,
97 .digest = "\xd7\x9e\x1c\x30\x8a\xa5\xbb\xcd"
98 "\xee\xa8\xed\x63\xdf\x41\x2d\xa9",
99 .np = 2,
100 .tap = { 13, 13 },
101 }, {
102 .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
103 .psize = 62,
104 .digest = "\x04\x3f\x85\x82\xf2\x41\xdb\x35"
105 "\x1c\xe6\x27\xe1\x53\xe7\xf0\xe4",
106 }, {
107 .plaintext = "123456789012345678901234567890123456789012345678901234567890123"
108 "45678901234567890",
109 .psize = 80,
110 .digest = "\xe3\x3b\x4d\xdc\x9c\x38\xf2\x19"
111 "\x9c\x3e\x7b\x16\x4f\xcc\x05\x36",
112 },
113};
114
115/*
116 * MD5 test vectors from RFC1321
117 */
118#define MD5_TEST_VECTORS 7
119
120static struct hash_testvec md5_tv_template[] = {
121 {
122 .digest = "\xd4\x1d\x8c\xd9\x8f\x00\xb2\x04"
123 "\xe9\x80\x09\x98\xec\xf8\x42\x7e",
124 }, {
125 .plaintext = "a",
126 .psize = 1,
127 .digest = "\x0c\xc1\x75\xb9\xc0\xf1\xb6\xa8"
128 "\x31\xc3\x99\xe2\x69\x77\x26\x61",
129 }, {
130 .plaintext = "abc",
131 .psize = 3,
132 .digest = "\x90\x01\x50\x98\x3c\xd2\x4f\xb0"
133 "\xd6\x96\x3f\x7d\x28\xe1\x7f\x72",
134 }, {
135 .plaintext = "message digest",
136 .psize = 14,
137 .digest = "\xf9\x6b\x69\x7d\x7c\xb7\x93\x8d"
138 "\x52\x5a\x2f\x31\xaa\xf1\x61\xd0",
139 }, {
140 .plaintext = "abcdefghijklmnopqrstuvwxyz",
141 .psize = 26,
142 .digest = "\xc3\xfc\xd3\xd7\x61\x92\xe4\x00"
143 "\x7d\xfb\x49\x6c\xca\x67\xe1\x3b",
144 .np = 2,
145 .tap = {13, 13}
146 }, {
147 .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
148 .psize = 62,
149 .digest = "\xd1\x74\xab\x98\xd2\x77\xd9\xf5"
150 "\xa5\x61\x1c\x2c\x9f\x41\x9d\x9f",
151 }, {
152 .plaintext = "12345678901234567890123456789012345678901234567890123456789012"
153 "345678901234567890",
154 .psize = 80,
155 .digest = "\x57\xed\xf4\xa2\x2b\xe3\xc9\x55"
156 "\xac\x49\xda\x2e\x21\x07\xb6\x7a",
157 }
158
159};
160
161/*
162 * RIPEMD-128 test vectors from ISO/IEC 10118-3:2004(E)
163 */
164#define RMD128_TEST_VECTORS 10
165
166static struct hash_testvec rmd128_tv_template[] = {
167 {
168 .digest = "\xcd\xf2\x62\x13\xa1\x50\xdc\x3e"
169 "\xcb\x61\x0f\x18\xf6\xb3\x8b\x46",
170 }, {
171 .plaintext = "a",
172 .psize = 1,
173 .digest = "\x86\xbe\x7a\xfa\x33\x9d\x0f\xc7"
174 "\xcf\xc7\x85\xe7\x2f\x57\x8d\x33",
175 }, {
176 .plaintext = "abc",
177 .psize = 3,
178 .digest = "\xc1\x4a\x12\x19\x9c\x66\xe4\xba"
179 "\x84\x63\x6b\x0f\x69\x14\x4c\x77",
180 }, {
181 .plaintext = "message digest",
182 .psize = 14,
183 .digest = "\x9e\x32\x7b\x3d\x6e\x52\x30\x62"
184 "\xaf\xc1\x13\x2d\x7d\xf9\xd1\xb8",
185 }, {
186 .plaintext = "abcdefghijklmnopqrstuvwxyz",
187 .psize = 26,
188 .digest = "\xfd\x2a\xa6\x07\xf7\x1d\xc8\xf5"
189 "\x10\x71\x49\x22\xb3\x71\x83\x4e",
190 }, {
191 .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcde"
192 "fghijklmnopqrstuvwxyz0123456789",
193 .psize = 62,
194 .digest = "\xd1\xe9\x59\xeb\x17\x9c\x91\x1f"
195 "\xae\xa4\x62\x4c\x60\xc5\xc7\x02",
196 }, {
197 .plaintext = "1234567890123456789012345678901234567890"
198 "1234567890123456789012345678901234567890",
199 .psize = 80,
200 .digest = "\x3f\x45\xef\x19\x47\x32\xc2\xdb"
201 "\xb2\xc4\xa2\xc7\x69\x79\x5f\xa3",
202 }, {
203 .plaintext = "abcdbcdecdefdefgefghfghighij"
204 "hijkijkljklmklmnlmnomnopnopq",
205 .psize = 56,
206 .digest = "\xa1\xaa\x06\x89\xd0\xfa\xfa\x2d"
207 "\xdc\x22\xe8\x8b\x49\x13\x3a\x06",
208 .np = 2,
209 .tap = { 28, 28 },
210 }, {
211 .plaintext = "abcdefghbcdefghicdefghijdefghijkefghijklfghi"
212 "jklmghijklmnhijklmnoijklmnopjklmnopqklmnopqr"
213 "lmnopqrsmnopqrstnopqrstu",
214 .psize = 112,
215 .digest = "\xd4\xec\xc9\x13\xe1\xdf\x77\x6b"
216 "\xf4\x8d\xe9\xd5\x5b\x1f\x25\x46",
217 }, {
218 .plaintext = "abcdbcdecdefdefgefghfghighijhijk",
219 .psize = 32,
220 .digest = "\x13\xfc\x13\xe8\xef\xff\x34\x7d"
221 "\xe1\x93\xff\x46\xdb\xac\xcf\xd4",
222 }
223};
224
225/*
226 * RIPEMD-160 test vectors from ISO/IEC 10118-3:2004(E)
227 */
228#define RMD160_TEST_VECTORS 10
229
230static struct hash_testvec rmd160_tv_template[] = {
231 {
232 .digest = "\x9c\x11\x85\xa5\xc5\xe9\xfc\x54\x61\x28"
233 "\x08\x97\x7e\xe8\xf5\x48\xb2\x25\x8d\x31",
234 }, {
235 .plaintext = "a",
236 .psize = 1,
237 .digest = "\x0b\xdc\x9d\x2d\x25\x6b\x3e\xe9\xda\xae"
238 "\x34\x7b\xe6\xf4\xdc\x83\x5a\x46\x7f\xfe",
239 }, {
240 .plaintext = "abc",
241 .psize = 3,
242 .digest = "\x8e\xb2\x08\xf7\xe0\x5d\x98\x7a\x9b\x04"
243 "\x4a\x8e\x98\xc6\xb0\x87\xf1\x5a\x0b\xfc",
244 }, {
245 .plaintext = "message digest",
246 .psize = 14,
247 .digest = "\x5d\x06\x89\xef\x49\xd2\xfa\xe5\x72\xb8"
248 "\x81\xb1\x23\xa8\x5f\xfa\x21\x59\x5f\x36",
249 }, {
250 .plaintext = "abcdefghijklmnopqrstuvwxyz",
251 .psize = 26,
252 .digest = "\xf7\x1c\x27\x10\x9c\x69\x2c\x1b\x56\xbb"
253 "\xdc\xeb\x5b\x9d\x28\x65\xb3\x70\x8d\xbc",
254 }, {
255 .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcde"
256 "fghijklmnopqrstuvwxyz0123456789",
257 .psize = 62,
258 .digest = "\xb0\xe2\x0b\x6e\x31\x16\x64\x02\x86\xed"
259 "\x3a\x87\xa5\x71\x30\x79\xb2\x1f\x51\x89",
260 }, {
261 .plaintext = "1234567890123456789012345678901234567890"
262 "1234567890123456789012345678901234567890",
263 .psize = 80,
264 .digest = "\x9b\x75\x2e\x45\x57\x3d\x4b\x39\xf4\xdb"
265 "\xd3\x32\x3c\xab\x82\xbf\x63\x32\x6b\xfb",
266 }, {
267 .plaintext = "abcdbcdecdefdefgefghfghighij"
268 "hijkijkljklmklmnlmnomnopnopq",
269 .psize = 56,
270 .digest = "\x12\xa0\x53\x38\x4a\x9c\x0c\x88\xe4\x05"
271 "\xa0\x6c\x27\xdc\xf4\x9a\xda\x62\xeb\x2b",
272 .np = 2,
273 .tap = { 28, 28 },
274 }, {
275 .plaintext = "abcdefghbcdefghicdefghijdefghijkefghijklfghi"
276 "jklmghijklmnhijklmnoijklmnopjklmnopqklmnopqr"
277 "lmnopqrsmnopqrstnopqrstu",
278 .psize = 112,
279 .digest = "\x6f\x3f\xa3\x9b\x6b\x50\x3c\x38\x4f\x91"
280 "\x9a\x49\xa7\xaa\x5c\x2c\x08\xbd\xfb\x45",
281 }, {
282 .plaintext = "abcdbcdecdefdefgefghfghighijhijk",
283 .psize = 32,
284 .digest = "\x94\xc2\x64\x11\x54\x04\xe6\x33\x79\x0d"
285 "\xfc\xc8\x7b\x58\x7d\x36\x77\x06\x7d\x9f",
286 }
287};
288
289/*
290 * RIPEMD-256 test vectors
291 */
292#define RMD256_TEST_VECTORS 8
293
294static struct hash_testvec rmd256_tv_template[] = {
295 {
296 .digest = "\x02\xba\x4c\x4e\x5f\x8e\xcd\x18"
297 "\x77\xfc\x52\xd6\x4d\x30\xe3\x7a"
298 "\x2d\x97\x74\xfb\x1e\x5d\x02\x63"
299 "\x80\xae\x01\x68\xe3\xc5\x52\x2d",
300 }, {
301 .plaintext = "a",
302 .psize = 1,
303 .digest = "\xf9\x33\x3e\x45\xd8\x57\xf5\xd9"
304 "\x0a\x91\xba\xb7\x0a\x1e\xba\x0c"
305 "\xfb\x1b\xe4\xb0\x78\x3c\x9a\xcf"
306 "\xcd\x88\x3a\x91\x34\x69\x29\x25",
307 }, {
308 .plaintext = "abc",
309 .psize = 3,
310 .digest = "\xaf\xbd\x6e\x22\x8b\x9d\x8c\xbb"
311 "\xce\xf5\xca\x2d\x03\xe6\xdb\xa1"
312 "\x0a\xc0\xbc\x7d\xcb\xe4\x68\x0e"
313 "\x1e\x42\xd2\xe9\x75\x45\x9b\x65",
314 }, {
315 .plaintext = "message digest",
316 .psize = 14,
317 .digest = "\x87\xe9\x71\x75\x9a\x1c\xe4\x7a"
318 "\x51\x4d\x5c\x91\x4c\x39\x2c\x90"
319 "\x18\xc7\xc4\x6b\xc1\x44\x65\x55"
320 "\x4a\xfc\xdf\x54\xa5\x07\x0c\x0e",
321 }, {
322 .plaintext = "abcdefghijklmnopqrstuvwxyz",
323 .psize = 26,
324 .digest = "\x64\x9d\x30\x34\x75\x1e\xa2\x16"
325 "\x77\x6b\xf9\xa1\x8a\xcc\x81\xbc"
326 "\x78\x96\x11\x8a\x51\x97\x96\x87"
327 "\x82\xdd\x1f\xd9\x7d\x8d\x51\x33",
328 }, {
329 .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcde"
330 "fghijklmnopqrstuvwxyz0123456789",
331 .psize = 62,
332 .digest = "\x57\x40\xa4\x08\xac\x16\xb7\x20"
333 "\xb8\x44\x24\xae\x93\x1c\xbb\x1f"
334 "\xe3\x63\xd1\xd0\xbf\x40\x17\xf1"
335 "\xa8\x9f\x7e\xa6\xde\x77\xa0\xb8",
336 }, {
337 .plaintext = "1234567890123456789012345678901234567890"
338 "1234567890123456789012345678901234567890",
339 .psize = 80,
340 .digest = "\x06\xfd\xcc\x7a\x40\x95\x48\xaa"
341 "\xf9\x13\x68\xc0\x6a\x62\x75\xb5"
342 "\x53\xe3\xf0\x99\xbf\x0e\xa4\xed"
343 "\xfd\x67\x78\xdf\x89\xa8\x90\xdd",
344 }, {
345 .plaintext = "abcdbcdecdefdefgefghfghighij"
346 "hijkijkljklmklmnlmnomnopnopq",
347 .psize = 56,
348 .digest = "\x38\x43\x04\x55\x83\xaa\xc6\xc8"
349 "\xc8\xd9\x12\x85\x73\xe7\xa9\x80"
350 "\x9a\xfb\x2a\x0f\x34\xcc\xc3\x6e"
351 "\xa9\xe7\x2f\x16\xf6\x36\x8e\x3f",
352 .np = 2,
353 .tap = { 28, 28 },
354 }
355};
356
357/*
358 * RIPEMD-320 test vectors
359 */
360#define RMD320_TEST_VECTORS 8
361
362static struct hash_testvec rmd320_tv_template[] = {
363 {
364 .digest = "\x22\xd6\x5d\x56\x61\x53\x6c\xdc\x75\xc1"
365 "\xfd\xf5\xc6\xde\x7b\x41\xb9\xf2\x73\x25"
366 "\xeb\xc6\x1e\x85\x57\x17\x7d\x70\x5a\x0e"
367 "\xc8\x80\x15\x1c\x3a\x32\xa0\x08\x99\xb8",
368 }, {
369 .plaintext = "a",
370 .psize = 1,
371 .digest = "\xce\x78\x85\x06\x38\xf9\x26\x58\xa5\xa5"
372 "\x85\x09\x75\x79\x92\x6d\xda\x66\x7a\x57"
373 "\x16\x56\x2c\xfc\xf6\xfb\xe7\x7f\x63\x54"
374 "\x2f\x99\xb0\x47\x05\xd6\x97\x0d\xff\x5d",
375 }, {
376 .plaintext = "abc",
377 .psize = 3,
378 .digest = "\xde\x4c\x01\xb3\x05\x4f\x89\x30\xa7\x9d"
379 "\x09\xae\x73\x8e\x92\x30\x1e\x5a\x17\x08"
380 "\x5b\xef\xfd\xc1\xb8\xd1\x16\x71\x3e\x74"
381 "\xf8\x2f\xa9\x42\xd6\x4c\xdb\xc4\x68\x2d",
382 }, {
383 .plaintext = "message digest",
384 .psize = 14,
385 .digest = "\x3a\x8e\x28\x50\x2e\xd4\x5d\x42\x2f\x68"
386 "\x84\x4f\x9d\xd3\x16\xe7\xb9\x85\x33\xfa"
387 "\x3f\x2a\x91\xd2\x9f\x84\xd4\x25\xc8\x8d"
388 "\x6b\x4e\xff\x72\x7d\xf6\x6a\x7c\x01\x97",
389 }, {
390 .plaintext = "abcdefghijklmnopqrstuvwxyz",
391 .psize = 26,
392 .digest = "\xca\xbd\xb1\x81\x0b\x92\x47\x0a\x20\x93"
393 "\xaa\x6b\xce\x05\x95\x2c\x28\x34\x8c\xf4"
394 "\x3f\xf6\x08\x41\x97\x51\x66\xbb\x40\xed"
395 "\x23\x40\x04\xb8\x82\x44\x63\xe6\xb0\x09",
396 }, {
397 .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcde"
398 "fghijklmnopqrstuvwxyz0123456789",
399 .psize = 62,
400 .digest = "\xed\x54\x49\x40\xc8\x6d\x67\xf2\x50\xd2"
401 "\x32\xc3\x0b\x7b\x3e\x57\x70\xe0\xc6\x0c"
402 "\x8c\xb9\xa4\xca\xfe\x3b\x11\x38\x8a\xf9"
403 "\x92\x0e\x1b\x99\x23\x0b\x84\x3c\x86\xa4",
404 }, {
405 .plaintext = "1234567890123456789012345678901234567890"
406 "1234567890123456789012345678901234567890",
407 .psize = 80,
408 .digest = "\x55\x78\x88\xaf\x5f\x6d\x8e\xd6\x2a\xb6"
409 "\x69\x45\xc6\xd2\xa0\xa4\x7e\xcd\x53\x41"
410 "\xe9\x15\xeb\x8f\xea\x1d\x05\x24\x95\x5f"
411 "\x82\x5d\xc7\x17\xe4\xa0\x08\xab\x2d\x42",
412 }, {
413 .plaintext = "abcdbcdecdefdefgefghfghighij"
414 "hijkijkljklmklmnlmnomnopnopq",
415 .psize = 56,
416 .digest = "\xd0\x34\xa7\x95\x0c\xf7\x22\x02\x1b\xa4"
417 "\xb8\x4d\xf7\x69\xa5\xde\x20\x60\xe2\x59"
418 "\xdf\x4c\x9b\xb4\xa4\x26\x8c\x0e\x93\x5b"
419 "\xbc\x74\x70\xa9\x69\xc9\xd0\x72\xa1\xac",
420 .np = 2,
421 .tap = { 28, 28 },
422 }
423};
424
425/*
426 * SHA1 test vectors from from FIPS PUB 180-1
427 */
428#define SHA1_TEST_VECTORS 2
429
430static struct hash_testvec sha1_tv_template[] = {
431 {
432 .plaintext = "abc",
433 .psize = 3,
434 .digest = "\xa9\x99\x3e\x36\x47\x06\x81\x6a\xba\x3e"
435 "\x25\x71\x78\x50\xc2\x6c\x9c\xd0\xd8\x9d",
436 }, {
437 .plaintext = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
438 .psize = 56,
439 .digest = "\x84\x98\x3e\x44\x1c\x3b\xd2\x6e\xba\xae"
440 "\x4a\xa1\xf9\x51\x29\xe5\xe5\x46\x70\xf1",
441 .np = 2,
442 .tap = { 28, 28 }
443 }
444};
445
446
447/*
448 * SHA224 test vectors from from FIPS PUB 180-2
449 */
450#define SHA224_TEST_VECTORS 2
451
452static struct hash_testvec sha224_tv_template[] = {
453 {
454 .plaintext = "abc",
455 .psize = 3,
456 .digest = "\x23\x09\x7D\x22\x34\x05\xD8\x22"
457 "\x86\x42\xA4\x77\xBD\xA2\x55\xB3"
458 "\x2A\xAD\xBC\xE4\xBD\xA0\xB3\xF7"
459 "\xE3\x6C\x9D\xA7",
460 }, {
461 .plaintext =
462 "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
463 .psize = 56,
464 .digest = "\x75\x38\x8B\x16\x51\x27\x76\xCC"
465 "\x5D\xBA\x5D\xA1\xFD\x89\x01\x50"
466 "\xB0\xC6\x45\x5C\xB4\xF5\x8B\x19"
467 "\x52\x52\x25\x25",
468 .np = 2,
469 .tap = { 28, 28 }
470 }
471};
472
473/*
474 * SHA256 test vectors from from NIST
475 */
476#define SHA256_TEST_VECTORS 2
477
478static struct hash_testvec sha256_tv_template[] = {
479 {
480 .plaintext = "abc",
481 .psize = 3,
482 .digest = "\xba\x78\x16\xbf\x8f\x01\xcf\xea"
483 "\x41\x41\x40\xde\x5d\xae\x22\x23"
484 "\xb0\x03\x61\xa3\x96\x17\x7a\x9c"
485 "\xb4\x10\xff\x61\xf2\x00\x15\xad",
486 }, {
487 .plaintext = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
488 .psize = 56,
489 .digest = "\x24\x8d\x6a\x61\xd2\x06\x38\xb8"
490 "\xe5\xc0\x26\x93\x0c\x3e\x60\x39"
491 "\xa3\x3c\xe4\x59\x64\xff\x21\x67"
492 "\xf6\xec\xed\xd4\x19\xdb\x06\xc1",
493 .np = 2,
494 .tap = { 28, 28 }
495 },
496};
497
498/*
499 * SHA384 test vectors from from NIST and kerneli
500 */
501#define SHA384_TEST_VECTORS 4
502
503static struct hash_testvec sha384_tv_template[] = {
504 {
505 .plaintext= "abc",
506 .psize = 3,
507 .digest = "\xcb\x00\x75\x3f\x45\xa3\x5e\x8b"
508 "\xb5\xa0\x3d\x69\x9a\xc6\x50\x07"
509 "\x27\x2c\x32\xab\x0e\xde\xd1\x63"
510 "\x1a\x8b\x60\x5a\x43\xff\x5b\xed"
511 "\x80\x86\x07\x2b\xa1\xe7\xcc\x23"
512 "\x58\xba\xec\xa1\x34\xc8\x25\xa7",
513 }, {
514 .plaintext = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
515 .psize = 56,
516 .digest = "\x33\x91\xfd\xdd\xfc\x8d\xc7\x39"
517 "\x37\x07\xa6\x5b\x1b\x47\x09\x39"
518 "\x7c\xf8\xb1\xd1\x62\xaf\x05\xab"
519 "\xfe\x8f\x45\x0d\xe5\xf3\x6b\xc6"
520 "\xb0\x45\x5a\x85\x20\xbc\x4e\x6f"
521 "\x5f\xe9\x5b\x1f\xe3\xc8\x45\x2b",
522 }, {
523 .plaintext = "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn"
524 "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu",
525 .psize = 112,
526 .digest = "\x09\x33\x0c\x33\xf7\x11\x47\xe8"
527 "\x3d\x19\x2f\xc7\x82\xcd\x1b\x47"
528 "\x53\x11\x1b\x17\x3b\x3b\x05\xd2"
529 "\x2f\xa0\x80\x86\xe3\xb0\xf7\x12"
530 "\xfc\xc7\xc7\x1a\x55\x7e\x2d\xb9"
531 "\x66\xc3\xe9\xfa\x91\x74\x60\x39",
532 }, {
533 .plaintext = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd"
534 "efghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz",
535 .psize = 104,
536 .digest = "\x3d\x20\x89\x73\xab\x35\x08\xdb"
537 "\xbd\x7e\x2c\x28\x62\xba\x29\x0a"
538 "\xd3\x01\x0e\x49\x78\xc1\x98\xdc"
539 "\x4d\x8f\xd0\x14\xe5\x82\x82\x3a"
540 "\x89\xe1\x6f\x9b\x2a\x7b\xbc\x1a"
541 "\xc9\x38\xe2\xd1\x99\xe8\xbe\xa4",
542 .np = 4,
543 .tap = { 26, 26, 26, 26 }
544 },
545};
546
547/*
548 * SHA512 test vectors from from NIST and kerneli
549 */
550#define SHA512_TEST_VECTORS 4
551
552static struct hash_testvec sha512_tv_template[] = {
553 {
554 .plaintext = "abc",
555 .psize = 3,
556 .digest = "\xdd\xaf\x35\xa1\x93\x61\x7a\xba"
557 "\xcc\x41\x73\x49\xae\x20\x41\x31"
558 "\x12\xe6\xfa\x4e\x89\xa9\x7e\xa2"
559 "\x0a\x9e\xee\xe6\x4b\x55\xd3\x9a"
560 "\x21\x92\x99\x2a\x27\x4f\xc1\xa8"
561 "\x36\xba\x3c\x23\xa3\xfe\xeb\xbd"
562 "\x45\x4d\x44\x23\x64\x3c\xe8\x0e"
563 "\x2a\x9a\xc9\x4f\xa5\x4c\xa4\x9f",
564 }, {
565 .plaintext = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
566 .psize = 56,
567 .digest = "\x20\x4a\x8f\xc6\xdd\xa8\x2f\x0a"
568 "\x0c\xed\x7b\xeb\x8e\x08\xa4\x16"
569 "\x57\xc1\x6e\xf4\x68\xb2\x28\xa8"
570 "\x27\x9b\xe3\x31\xa7\x03\xc3\x35"
571 "\x96\xfd\x15\xc1\x3b\x1b\x07\xf9"
572 "\xaa\x1d\x3b\xea\x57\x78\x9c\xa0"
573 "\x31\xad\x85\xc7\xa7\x1d\xd7\x03"
574 "\x54\xec\x63\x12\x38\xca\x34\x45",
575 }, {
576 .plaintext = "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn"
577 "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu",
578 .psize = 112,
579 .digest = "\x8e\x95\x9b\x75\xda\xe3\x13\xda"
580 "\x8c\xf4\xf7\x28\x14\xfc\x14\x3f"
581 "\x8f\x77\x79\xc6\xeb\x9f\x7f\xa1"
582 "\x72\x99\xae\xad\xb6\x88\x90\x18"
583 "\x50\x1d\x28\x9e\x49\x00\xf7\xe4"
584 "\x33\x1b\x99\xde\xc4\xb5\x43\x3a"
585 "\xc7\xd3\x29\xee\xb6\xdd\x26\x54"
586 "\x5e\x96\xe5\x5b\x87\x4b\xe9\x09",
587 }, {
588 .plaintext = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd"
589 "efghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz",
590 .psize = 104,
591 .digest = "\x93\x0d\x0c\xef\xcb\x30\xff\x11"
592 "\x33\xb6\x89\x81\x21\xf1\xcf\x3d"
593 "\x27\x57\x8a\xfc\xaf\xe8\x67\x7c"
594 "\x52\x57\xcf\x06\x99\x11\xf7\x5d"
595 "\x8f\x58\x31\xb5\x6e\xbf\xda\x67"
596 "\xb2\x78\xe6\x6d\xff\x8b\x84\xfe"
597 "\x2b\x28\x70\xf7\x42\xa5\x80\xd8"
598 "\xed\xb4\x19\x87\x23\x28\x50\xc9",
599 .np = 4,
600 .tap = { 26, 26, 26, 26 }
601 },
602};
603
604
605/*
606 * WHIRLPOOL test vectors from Whirlpool package
607 * by Vincent Rijmen and Paulo S. L. M. Barreto as part of the NESSIE
608 * submission
609 */
610#define WP512_TEST_VECTORS 8
611
612static struct hash_testvec wp512_tv_template[] = {
613 {
614 .plaintext = "",
615 .psize = 0,
616 .digest = "\x19\xFA\x61\xD7\x55\x22\xA4\x66"
617 "\x9B\x44\xE3\x9C\x1D\x2E\x17\x26"
618 "\xC5\x30\x23\x21\x30\xD4\x07\xF8"
619 "\x9A\xFE\xE0\x96\x49\x97\xF7\xA7"
620 "\x3E\x83\xBE\x69\x8B\x28\x8F\xEB"
621 "\xCF\x88\xE3\xE0\x3C\x4F\x07\x57"
622 "\xEA\x89\x64\xE5\x9B\x63\xD9\x37"
623 "\x08\xB1\x38\xCC\x42\xA6\x6E\xB3",
624
625
626 }, {
627 .plaintext = "a",
628 .psize = 1,
629 .digest = "\x8A\xCA\x26\x02\x79\x2A\xEC\x6F"
630 "\x11\xA6\x72\x06\x53\x1F\xB7\xD7"
631 "\xF0\xDF\xF5\x94\x13\x14\x5E\x69"
632 "\x73\xC4\x50\x01\xD0\x08\x7B\x42"
633 "\xD1\x1B\xC6\x45\x41\x3A\xEF\xF6"
634 "\x3A\x42\x39\x1A\x39\x14\x5A\x59"
635 "\x1A\x92\x20\x0D\x56\x01\x95\xE5"
636 "\x3B\x47\x85\x84\xFD\xAE\x23\x1A",
637 }, {
638 .plaintext = "abc",
639 .psize = 3,
640 .digest = "\x4E\x24\x48\xA4\xC6\xF4\x86\xBB"
641 "\x16\xB6\x56\x2C\x73\xB4\x02\x0B"
642 "\xF3\x04\x3E\x3A\x73\x1B\xCE\x72"
643 "\x1A\xE1\xB3\x03\xD9\x7E\x6D\x4C"
644 "\x71\x81\xEE\xBD\xB6\xC5\x7E\x27"
645 "\x7D\x0E\x34\x95\x71\x14\xCB\xD6"
646 "\xC7\x97\xFC\x9D\x95\xD8\xB5\x82"
647 "\xD2\x25\x29\x20\x76\xD4\xEE\xF5",
648 }, {
649 .plaintext = "message digest",
650 .psize = 14,
651 .digest = "\x37\x8C\x84\xA4\x12\x6E\x2D\xC6"
652 "\xE5\x6D\xCC\x74\x58\x37\x7A\xAC"
653 "\x83\x8D\x00\x03\x22\x30\xF5\x3C"
654 "\xE1\xF5\x70\x0C\x0F\xFB\x4D\x3B"
655 "\x84\x21\x55\x76\x59\xEF\x55\xC1"
656 "\x06\xB4\xB5\x2A\xC5\xA4\xAA\xA6"
657 "\x92\xED\x92\x00\x52\x83\x8F\x33"
658 "\x62\xE8\x6D\xBD\x37\xA8\x90\x3E",
659 }, {
660 .plaintext = "abcdefghijklmnopqrstuvwxyz",
661 .psize = 26,
662 .digest = "\xF1\xD7\x54\x66\x26\x36\xFF\xE9"
663 "\x2C\x82\xEB\xB9\x21\x2A\x48\x4A"
664 "\x8D\x38\x63\x1E\xAD\x42\x38\xF5"
665 "\x44\x2E\xE1\x3B\x80\x54\xE4\x1B"
666 "\x08\xBF\x2A\x92\x51\xC3\x0B\x6A"
667 "\x0B\x8A\xAE\x86\x17\x7A\xB4\xA6"
668 "\xF6\x8F\x67\x3E\x72\x07\x86\x5D"
669 "\x5D\x98\x19\xA3\xDB\xA4\xEB\x3B",
670 }, {
671 .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
672 "abcdefghijklmnopqrstuvwxyz0123456789",
673 .psize = 62,
674 .digest = "\xDC\x37\xE0\x08\xCF\x9E\xE6\x9B"
675 "\xF1\x1F\x00\xED\x9A\xBA\x26\x90"
676 "\x1D\xD7\xC2\x8C\xDE\xC0\x66\xCC"
677 "\x6A\xF4\x2E\x40\xF8\x2F\x3A\x1E"
678 "\x08\xEB\xA2\x66\x29\x12\x9D\x8F"
679 "\xB7\xCB\x57\x21\x1B\x92\x81\xA6"
680 "\x55\x17\xCC\x87\x9D\x7B\x96\x21"
681 "\x42\xC6\x5F\x5A\x7A\xF0\x14\x67",
682 }, {
683 .plaintext = "1234567890123456789012345678901234567890"
684 "1234567890123456789012345678901234567890",
685 .psize = 80,
686 .digest = "\x46\x6E\xF1\x8B\xAB\xB0\x15\x4D"
687 "\x25\xB9\xD3\x8A\x64\x14\xF5\xC0"
688 "\x87\x84\x37\x2B\xCC\xB2\x04\xD6"
689 "\x54\x9C\x4A\xFA\xDB\x60\x14\x29"
690 "\x4D\x5B\xD8\xDF\x2A\x6C\x44\xE5"
691 "\x38\xCD\x04\x7B\x26\x81\xA5\x1A"
692 "\x2C\x60\x48\x1E\x88\xC5\xA2\x0B"
693 "\x2C\x2A\x80\xCF\x3A\x9A\x08\x3B",
694 }, {
695 .plaintext = "abcdbcdecdefdefgefghfghighijhijk",
696 .psize = 32,
697 .digest = "\x2A\x98\x7E\xA4\x0F\x91\x70\x61"
698 "\xF5\xD6\xF0\xA0\xE4\x64\x4F\x48"
699 "\x8A\x7A\x5A\x52\xDE\xEE\x65\x62"
700 "\x07\xC5\x62\xF9\x88\xE9\x5C\x69"
701 "\x16\xBD\xC8\x03\x1B\xC5\xBE\x1B"
702 "\x7B\x94\x76\x39\xFE\x05\x0B\x56"
703 "\x93\x9B\xAA\xA0\xAD\xFF\x9A\xE6"
704 "\x74\x5B\x7B\x18\x1C\x3B\xE3\xFD",
705 },
706};
707
708#define WP384_TEST_VECTORS 8
709
710static struct hash_testvec wp384_tv_template[] = {
711 {
712 .plaintext = "",
713 .psize = 0,
714 .digest = "\x19\xFA\x61\xD7\x55\x22\xA4\x66"
715 "\x9B\x44\xE3\x9C\x1D\x2E\x17\x26"
716 "\xC5\x30\x23\x21\x30\xD4\x07\xF8"
717 "\x9A\xFE\xE0\x96\x49\x97\xF7\xA7"
718 "\x3E\x83\xBE\x69\x8B\x28\x8F\xEB"
719 "\xCF\x88\xE3\xE0\x3C\x4F\x07\x57",
720
721
722 }, {
723 .plaintext = "a",
724 .psize = 1,
725 .digest = "\x8A\xCA\x26\x02\x79\x2A\xEC\x6F"
726 "\x11\xA6\x72\x06\x53\x1F\xB7\xD7"
727 "\xF0\xDF\xF5\x94\x13\x14\x5E\x69"
728 "\x73\xC4\x50\x01\xD0\x08\x7B\x42"
729 "\xD1\x1B\xC6\x45\x41\x3A\xEF\xF6"
730 "\x3A\x42\x39\x1A\x39\x14\x5A\x59",
731 }, {
732 .plaintext = "abc",
733 .psize = 3,
734 .digest = "\x4E\x24\x48\xA4\xC6\xF4\x86\xBB"
735 "\x16\xB6\x56\x2C\x73\xB4\x02\x0B"
736 "\xF3\x04\x3E\x3A\x73\x1B\xCE\x72"
737 "\x1A\xE1\xB3\x03\xD9\x7E\x6D\x4C"
738 "\x71\x81\xEE\xBD\xB6\xC5\x7E\x27"
739 "\x7D\x0E\x34\x95\x71\x14\xCB\xD6",
740 }, {
741 .plaintext = "message digest",
742 .psize = 14,
743 .digest = "\x37\x8C\x84\xA4\x12\x6E\x2D\xC6"
744 "\xE5\x6D\xCC\x74\x58\x37\x7A\xAC"
745 "\x83\x8D\x00\x03\x22\x30\xF5\x3C"
746 "\xE1\xF5\x70\x0C\x0F\xFB\x4D\x3B"
747 "\x84\x21\x55\x76\x59\xEF\x55\xC1"
748 "\x06\xB4\xB5\x2A\xC5\xA4\xAA\xA6",
749 }, {
750 .plaintext = "abcdefghijklmnopqrstuvwxyz",
751 .psize = 26,
752 .digest = "\xF1\xD7\x54\x66\x26\x36\xFF\xE9"
753 "\x2C\x82\xEB\xB9\x21\x2A\x48\x4A"
754 "\x8D\x38\x63\x1E\xAD\x42\x38\xF5"
755 "\x44\x2E\xE1\x3B\x80\x54\xE4\x1B"
756 "\x08\xBF\x2A\x92\x51\xC3\x0B\x6A"
757 "\x0B\x8A\xAE\x86\x17\x7A\xB4\xA6",
758 }, {
759 .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
760 "abcdefghijklmnopqrstuvwxyz0123456789",
761 .psize = 62,
762 .digest = "\xDC\x37\xE0\x08\xCF\x9E\xE6\x9B"
763 "\xF1\x1F\x00\xED\x9A\xBA\x26\x90"
764 "\x1D\xD7\xC2\x8C\xDE\xC0\x66\xCC"
765 "\x6A\xF4\x2E\x40\xF8\x2F\x3A\x1E"
766 "\x08\xEB\xA2\x66\x29\x12\x9D\x8F"
767 "\xB7\xCB\x57\x21\x1B\x92\x81\xA6",
768 }, {
769 .plaintext = "1234567890123456789012345678901234567890"
770 "1234567890123456789012345678901234567890",
771 .psize = 80,
772 .digest = "\x46\x6E\xF1\x8B\xAB\xB0\x15\x4D"
773 "\x25\xB9\xD3\x8A\x64\x14\xF5\xC0"
774 "\x87\x84\x37\x2B\xCC\xB2\x04\xD6"
775 "\x54\x9C\x4A\xFA\xDB\x60\x14\x29"
776 "\x4D\x5B\xD8\xDF\x2A\x6C\x44\xE5"
777 "\x38\xCD\x04\x7B\x26\x81\xA5\x1A",
778 }, {
779 .plaintext = "abcdbcdecdefdefgefghfghighijhijk",
780 .psize = 32,
781 .digest = "\x2A\x98\x7E\xA4\x0F\x91\x70\x61"
782 "\xF5\xD6\xF0\xA0\xE4\x64\x4F\x48"
783 "\x8A\x7A\x5A\x52\xDE\xEE\x65\x62"
784 "\x07\xC5\x62\xF9\x88\xE9\x5C\x69"
785 "\x16\xBD\xC8\x03\x1B\xC5\xBE\x1B"
786 "\x7B\x94\x76\x39\xFE\x05\x0B\x56",
787 },
788};
789
790#define WP256_TEST_VECTORS 8
791
792static struct hash_testvec wp256_tv_template[] = {
793 {
794 .plaintext = "",
795 .psize = 0,
796 .digest = "\x19\xFA\x61\xD7\x55\x22\xA4\x66"
797 "\x9B\x44\xE3\x9C\x1D\x2E\x17\x26"
798 "\xC5\x30\x23\x21\x30\xD4\x07\xF8"
799 "\x9A\xFE\xE0\x96\x49\x97\xF7\xA7",
800
801
802 }, {
803 .plaintext = "a",
804 .psize = 1,
805 .digest = "\x8A\xCA\x26\x02\x79\x2A\xEC\x6F"
806 "\x11\xA6\x72\x06\x53\x1F\xB7\xD7"
807 "\xF0\xDF\xF5\x94\x13\x14\x5E\x69"
808 "\x73\xC4\x50\x01\xD0\x08\x7B\x42",
809 }, {
810 .plaintext = "abc",
811 .psize = 3,
812 .digest = "\x4E\x24\x48\xA4\xC6\xF4\x86\xBB"
813 "\x16\xB6\x56\x2C\x73\xB4\x02\x0B"
814 "\xF3\x04\x3E\x3A\x73\x1B\xCE\x72"
815 "\x1A\xE1\xB3\x03\xD9\x7E\x6D\x4C",
816 }, {
817 .plaintext = "message digest",
818 .psize = 14,
819 .digest = "\x37\x8C\x84\xA4\x12\x6E\x2D\xC6"
820 "\xE5\x6D\xCC\x74\x58\x37\x7A\xAC"
821 "\x83\x8D\x00\x03\x22\x30\xF5\x3C"
822 "\xE1\xF5\x70\x0C\x0F\xFB\x4D\x3B",
823 }, {
824 .plaintext = "abcdefghijklmnopqrstuvwxyz",
825 .psize = 26,
826 .digest = "\xF1\xD7\x54\x66\x26\x36\xFF\xE9"
827 "\x2C\x82\xEB\xB9\x21\x2A\x48\x4A"
828 "\x8D\x38\x63\x1E\xAD\x42\x38\xF5"
829 "\x44\x2E\xE1\x3B\x80\x54\xE4\x1B",
830 }, {
831 .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
832 "abcdefghijklmnopqrstuvwxyz0123456789",
833 .psize = 62,
834 .digest = "\xDC\x37\xE0\x08\xCF\x9E\xE6\x9B"
835 "\xF1\x1F\x00\xED\x9A\xBA\x26\x90"
836 "\x1D\xD7\xC2\x8C\xDE\xC0\x66\xCC"
837 "\x6A\xF4\x2E\x40\xF8\x2F\x3A\x1E",
838 }, {
839 .plaintext = "1234567890123456789012345678901234567890"
840 "1234567890123456789012345678901234567890",
841 .psize = 80,
842 .digest = "\x46\x6E\xF1\x8B\xAB\xB0\x15\x4D"
843 "\x25\xB9\xD3\x8A\x64\x14\xF5\xC0"
844 "\x87\x84\x37\x2B\xCC\xB2\x04\xD6"
845 "\x54\x9C\x4A\xFA\xDB\x60\x14\x29",
846 }, {
847 .plaintext = "abcdbcdecdefdefgefghfghighijhijk",
848 .psize = 32,
849 .digest = "\x2A\x98\x7E\xA4\x0F\x91\x70\x61"
850 "\xF5\xD6\xF0\xA0\xE4\x64\x4F\x48"
851 "\x8A\x7A\x5A\x52\xDE\xEE\x65\x62"
852 "\x07\xC5\x62\xF9\x88\xE9\x5C\x69",
853 },
854};
855
856/*
857 * TIGER test vectors from Tiger website
858 */
859#define TGR192_TEST_VECTORS 6
860
861static struct hash_testvec tgr192_tv_template[] = {
862 {
863 .plaintext = "",
864 .psize = 0,
865 .digest = "\x24\xf0\x13\x0c\x63\xac\x93\x32"
866 "\x16\x16\x6e\x76\xb1\xbb\x92\x5f"
867 "\xf3\x73\xde\x2d\x49\x58\x4e\x7a",
868 }, {
869 .plaintext = "abc",
870 .psize = 3,
871 .digest = "\xf2\x58\xc1\xe8\x84\x14\xab\x2a"
872 "\x52\x7a\xb5\x41\xff\xc5\xb8\xbf"
873 "\x93\x5f\x7b\x95\x1c\x13\x29\x51",
874 }, {
875 .plaintext = "Tiger",
876 .psize = 5,
877 .digest = "\x9f\x00\xf5\x99\x07\x23\x00\xdd"
878 "\x27\x6a\xbb\x38\xc8\xeb\x6d\xec"
879 "\x37\x79\x0c\x11\x6f\x9d\x2b\xdf",
880 }, {
881 .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-",
882 .psize = 64,
883 .digest = "\x87\xfb\x2a\x90\x83\x85\x1c\xf7"
884 "\x47\x0d\x2c\xf8\x10\xe6\xdf\x9e"
885 "\xb5\x86\x44\x50\x34\xa5\xa3\x86",
886 }, {
887 .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZ=abcdefghijklmnopqrstuvwxyz+0123456789",
888 .psize = 64,
889 .digest = "\x46\x7d\xb8\x08\x63\xeb\xce\x48"
890 "\x8d\xf1\xcd\x12\x61\x65\x5d\xe9"
891 "\x57\x89\x65\x65\x97\x5f\x91\x97",
892 }, {
893 .plaintext = "Tiger - A Fast New Hash Function, "
894 "by Ross Anderson and Eli Biham, "
895 "proceedings of Fast Software Encryption 3, "
896 "Cambridge, 1996.",
897 .psize = 125,
898 .digest = "\x3d\x9a\xeb\x03\xd1\xbd\x1a\x63"
899 "\x57\xb2\x77\x4d\xfd\x6d\x5b\x24"
900 "\xdd\x68\x15\x1d\x50\x39\x74\xfc",
901 },
902};
903
904#define TGR160_TEST_VECTORS 6
905
906static struct hash_testvec tgr160_tv_template[] = {
907 {
908 .plaintext = "",
909 .psize = 0,
910 .digest = "\x24\xf0\x13\x0c\x63\xac\x93\x32"
911 "\x16\x16\x6e\x76\xb1\xbb\x92\x5f"
912 "\xf3\x73\xde\x2d",
913 }, {
914 .plaintext = "abc",
915 .psize = 3,
916 .digest = "\xf2\x58\xc1\xe8\x84\x14\xab\x2a"
917 "\x52\x7a\xb5\x41\xff\xc5\xb8\xbf"
918 "\x93\x5f\x7b\x95",
919 }, {
920 .plaintext = "Tiger",
921 .psize = 5,
922 .digest = "\x9f\x00\xf5\x99\x07\x23\x00\xdd"
923 "\x27\x6a\xbb\x38\xc8\xeb\x6d\xec"
924 "\x37\x79\x0c\x11",
925 }, {
926 .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-",
927 .psize = 64,
928 .digest = "\x87\xfb\x2a\x90\x83\x85\x1c\xf7"
929 "\x47\x0d\x2c\xf8\x10\xe6\xdf\x9e"
930 "\xb5\x86\x44\x50",
931 }, {
932 .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZ=abcdefghijklmnopqrstuvwxyz+0123456789",
933 .psize = 64,
934 .digest = "\x46\x7d\xb8\x08\x63\xeb\xce\x48"
935 "\x8d\xf1\xcd\x12\x61\x65\x5d\xe9"
936 "\x57\x89\x65\x65",
937 }, {
938 .plaintext = "Tiger - A Fast New Hash Function, "
939 "by Ross Anderson and Eli Biham, "
940 "proceedings of Fast Software Encryption 3, "
941 "Cambridge, 1996.",
942 .psize = 125,
943 .digest = "\x3d\x9a\xeb\x03\xd1\xbd\x1a\x63"
944 "\x57\xb2\x77\x4d\xfd\x6d\x5b\x24"
945 "\xdd\x68\x15\x1d",
946 },
947};
948
949#define TGR128_TEST_VECTORS 6
950
951static struct hash_testvec tgr128_tv_template[] = {
952 {
953 .plaintext = "",
954 .psize = 0,
955 .digest = "\x24\xf0\x13\x0c\x63\xac\x93\x32"
956 "\x16\x16\x6e\x76\xb1\xbb\x92\x5f",
957 }, {
958 .plaintext = "abc",
959 .psize = 3,
960 .digest = "\xf2\x58\xc1\xe8\x84\x14\xab\x2a"
961 "\x52\x7a\xb5\x41\xff\xc5\xb8\xbf",
962 }, {
963 .plaintext = "Tiger",
964 .psize = 5,
965 .digest = "\x9f\x00\xf5\x99\x07\x23\x00\xdd"
966 "\x27\x6a\xbb\x38\xc8\xeb\x6d\xec",
967 }, {
968 .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-",
969 .psize = 64,
970 .digest = "\x87\xfb\x2a\x90\x83\x85\x1c\xf7"
971 "\x47\x0d\x2c\xf8\x10\xe6\xdf\x9e",
972 }, {
973 .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZ=abcdefghijklmnopqrstuvwxyz+0123456789",
974 .psize = 64,
975 .digest = "\x46\x7d\xb8\x08\x63\xeb\xce\x48"
976 "\x8d\xf1\xcd\x12\x61\x65\x5d\xe9",
977 }, {
978 .plaintext = "Tiger - A Fast New Hash Function, "
979 "by Ross Anderson and Eli Biham, "
980 "proceedings of Fast Software Encryption 3, "
981 "Cambridge, 1996.",
982 .psize = 125,
983 .digest = "\x3d\x9a\xeb\x03\xd1\xbd\x1a\x63"
984 "\x57\xb2\x77\x4d\xfd\x6d\x5b\x24",
985 },
986};
987
988/*
989 * HMAC-MD5 test vectors from RFC2202
990 * (These need to be fixed to not use strlen).
991 */
992#define HMAC_MD5_TEST_VECTORS 7
993
994static struct hash_testvec hmac_md5_tv_template[] =
995{
996 {
997 .key = "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b",
998 .ksize = 16,
999 .plaintext = "Hi There",
1000 .psize = 8,
1001 .digest = "\x92\x94\x72\x7a\x36\x38\xbb\x1c"
1002 "\x13\xf4\x8e\xf8\x15\x8b\xfc\x9d",
1003 }, {
1004 .key = "Jefe",
1005 .ksize = 4,
1006 .plaintext = "what do ya want for nothing?",
1007 .psize = 28,
1008 .digest = "\x75\x0c\x78\x3e\x6a\xb0\xb5\x03"
1009 "\xea\xa8\x6e\x31\x0a\x5d\xb7\x38",
1010 .np = 2,
1011 .tap = {14, 14}
1012 }, {
1013 .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
1014 .ksize = 16,
1015 .plaintext = "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
1016 "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
1017 "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
1018 "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd",
1019 .psize = 50,
1020 .digest = "\x56\xbe\x34\x52\x1d\x14\x4c\x88"
1021 "\xdb\xb8\xc7\x33\xf0\xe8\xb3\xf6",
1022 }, {
1023 .key = "\x01\x02\x03\x04\x05\x06\x07\x08"
1024 "\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
1025 "\x11\x12\x13\x14\x15\x16\x17\x18\x19",
1026 .ksize = 25,
1027 .plaintext = "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1028 "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1029 "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1030 "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd",
1031 .psize = 50,
1032 .digest = "\x69\x7e\xaf\x0a\xca\x3a\x3a\xea"
1033 "\x3a\x75\x16\x47\x46\xff\xaa\x79",
1034 }, {
1035 .key = "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c",
1036 .ksize = 16,
1037 .plaintext = "Test With Truncation",
1038 .psize = 20,
1039 .digest = "\x56\x46\x1e\xf2\x34\x2e\xdc\x00"
1040 "\xf9\xba\xb9\x95\x69\x0e\xfd\x4c",
1041 }, {
1042 .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1043 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1044 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1045 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1046 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1047 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1048 "\xaa\xaa",
1049 .ksize = 80,
1050 .plaintext = "Test Using Larger Than Block-Size Key - Hash Key First",
1051 .psize = 54,
1052 .digest = "\x6b\x1a\xb7\xfe\x4b\xd7\xbf\x8f"
1053 "\x0b\x62\xe6\xce\x61\xb9\xd0\xcd",
1054 }, {
1055 .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1056 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1057 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1058 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1059 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1060 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1061 "\xaa\xaa",
1062 .ksize = 80,
1063 .plaintext = "Test Using Larger Than Block-Size Key and Larger Than One "
1064 "Block-Size Data",
1065 .psize = 73,
1066 .digest = "\x6f\x63\x0f\xad\x67\xcd\xa0\xee"
1067 "\x1f\xb1\xf5\x62\xdb\x3a\xa5\x3e",
1068 },
1069};
1070
1071/*
1072 * HMAC-RIPEMD128 test vectors from RFC2286
1073 */
1074#define HMAC_RMD128_TEST_VECTORS 7
1075
1076static struct hash_testvec hmac_rmd128_tv_template[] = {
1077 {
1078 .key = "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b",
1079 .ksize = 16,
1080 .plaintext = "Hi There",
1081 .psize = 8,
1082 .digest = "\xfb\xf6\x1f\x94\x92\xaa\x4b\xbf"
1083 "\x81\xc1\x72\xe8\x4e\x07\x34\xdb",
1084 }, {
1085 .key = "Jefe",
1086 .ksize = 4,
1087 .plaintext = "what do ya want for nothing?",
1088 .psize = 28,
1089 .digest = "\x87\x5f\x82\x88\x62\xb6\xb3\x34"
1090 "\xb4\x27\xc5\x5f\x9f\x7f\xf0\x9b",
1091 .np = 2,
1092 .tap = { 14, 14 },
1093 }, {
1094 .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
1095 .ksize = 16,
1096 .plaintext = "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
1097 "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
1098 "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
1099 "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd",
1100 .psize = 50,
1101 .digest = "\x09\xf0\xb2\x84\x6d\x2f\x54\x3d"
1102 "\xa3\x63\xcb\xec\x8d\x62\xa3\x8d",
1103 }, {
1104 .key = "\x01\x02\x03\x04\x05\x06\x07\x08"
1105 "\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
1106 "\x11\x12\x13\x14\x15\x16\x17\x18\x19",
1107 .ksize = 25,
1108 .plaintext = "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1109 "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1110 "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1111 "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd",
1112 .psize = 50,
1113 .digest = "\xbd\xbb\xd7\xcf\x03\xe4\x4b\x5a"
1114 "\xa6\x0a\xf8\x15\xbe\x4d\x22\x94",
1115 }, {
1116 .key = "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c",
1117 .ksize = 16,
1118 .plaintext = "Test With Truncation",
1119 .psize = 20,
1120 .digest = "\xe7\x98\x08\xf2\x4b\x25\xfd\x03"
1121 "\x1c\x15\x5f\x0d\x55\x1d\x9a\x3a",
1122 }, {
1123 .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1124 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1125 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1126 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1127 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1128 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1129 "\xaa\xaa",
1130 .ksize = 80,
1131 .plaintext = "Test Using Larger Than Block-Size Key - Hash Key First",
1132 .psize = 54,
1133 .digest = "\xdc\x73\x29\x28\xde\x98\x10\x4a"
1134 "\x1f\x59\xd3\x73\xc1\x50\xac\xbb",
1135 }, {
1136 .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1137 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1138 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1139 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1140 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1141 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1142 "\xaa\xaa",
1143 .ksize = 80,
1144 .plaintext = "Test Using Larger Than Block-Size Key and Larger Than One "
1145 "Block-Size Data",
1146 .psize = 73,
1147 .digest = "\x5c\x6b\xec\x96\x79\x3e\x16\xd4"
1148 "\x06\x90\xc2\x37\x63\x5f\x30\xc5",
1149 },
1150};
1151
1152/*
1153 * HMAC-RIPEMD160 test vectors from RFC2286
1154 */
1155#define HMAC_RMD160_TEST_VECTORS 7
1156
1157static struct hash_testvec hmac_rmd160_tv_template[] = {
1158 {
1159 .key = "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b",
1160 .ksize = 20,
1161 .plaintext = "Hi There",
1162 .psize = 8,
1163 .digest = "\x24\xcb\x4b\xd6\x7d\x20\xfc\x1a\x5d\x2e"
1164 "\xd7\x73\x2d\xcc\x39\x37\x7f\x0a\x56\x68",
1165 }, {
1166 .key = "Jefe",
1167 .ksize = 4,
1168 .plaintext = "what do ya want for nothing?",
1169 .psize = 28,
1170 .digest = "\xdd\xa6\xc0\x21\x3a\x48\x5a\x9e\x24\xf4"
1171 "\x74\x20\x64\xa7\xf0\x33\xb4\x3c\x40\x69",
1172 .np = 2,
1173 .tap = { 14, 14 },
1174 }, {
1175 .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
1176 .ksize = 20,
1177 .plaintext = "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
1178 "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
1179 "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
1180 "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd",
1181 .psize = 50,
1182 .digest = "\xb0\xb1\x05\x36\x0d\xe7\x59\x96\x0a\xb4"
1183 "\xf3\x52\x98\xe1\x16\xe2\x95\xd8\xe7\xc1",
1184 }, {
1185 .key = "\x01\x02\x03\x04\x05\x06\x07\x08"
1186 "\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
1187 "\x11\x12\x13\x14\x15\x16\x17\x18\x19",
1188 .ksize = 25,
1189 .plaintext = "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1190 "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1191 "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1192 "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd",
1193 .psize = 50,
1194 .digest = "\xd5\xca\x86\x2f\x4d\x21\xd5\xe6\x10\xe1"
1195 "\x8b\x4c\xf1\xbe\xb9\x7a\x43\x65\xec\xf4",
1196 }, {
1197 .key = "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c",
1198 .ksize = 20,
1199 .plaintext = "Test With Truncation",
1200 .psize = 20,
1201 .digest = "\x76\x19\x69\x39\x78\xf9\x1d\x90\x53\x9a"
1202 "\xe7\x86\x50\x0f\xf3\xd8\xe0\x51\x8e\x39",
1203 }, {
1204 .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1205 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1206 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1207 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1208 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1209 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1210 "\xaa\xaa",
1211 .ksize = 80,
1212 .plaintext = "Test Using Larger Than Block-Size Key - Hash Key First",
1213 .psize = 54,
1214 .digest = "\x64\x66\xca\x07\xac\x5e\xac\x29\xe1\xbd"
1215 "\x52\x3e\x5a\xda\x76\x05\xb7\x91\xfd\x8b",
1216 }, {
1217 .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1218 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1219 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1220 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1221 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1222 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1223 "\xaa\xaa",
1224 .ksize = 80,
1225 .plaintext = "Test Using Larger Than Block-Size Key and Larger Than One "
1226 "Block-Size Data",
1227 .psize = 73,
1228 .digest = "\x69\xea\x60\x79\x8d\x71\x61\x6c\xce\x5f"
1229 "\xd0\x87\x1e\x23\x75\x4c\xd7\x5d\x5a\x0a",
1230 },
1231};
1232
1233/*
1234 * HMAC-SHA1 test vectors from RFC2202
1235 */
1236#define HMAC_SHA1_TEST_VECTORS 7
1237
1238static struct hash_testvec hmac_sha1_tv_template[] = {
1239 {
1240 .key = "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b",
1241 .ksize = 20,
1242 .plaintext = "Hi There",
1243 .psize = 8,
1244 .digest = "\xb6\x17\x31\x86\x55\x05\x72\x64"
1245 "\xe2\x8b\xc0\xb6\xfb\x37\x8c\x8e\xf1"
1246 "\x46\xbe",
1247 }, {
1248 .key = "Jefe",
1249 .ksize = 4,
1250 .plaintext = "what do ya want for nothing?",
1251 .psize = 28,
1252 .digest = "\xef\xfc\xdf\x6a\xe5\xeb\x2f\xa2\xd2\x74"
1253 "\x16\xd5\xf1\x84\xdf\x9c\x25\x9a\x7c\x79",
1254 .np = 2,
1255 .tap = { 14, 14 }
1256 }, {
1257 .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
1258 .ksize = 20,
1259 .plaintext = "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
1260 "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
1261 "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
1262 "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd",
1263 .psize = 50,
1264 .digest = "\x12\x5d\x73\x42\xb9\xac\x11\xcd\x91\xa3"
1265 "\x9a\xf4\x8a\xa1\x7b\x4f\x63\xf1\x75\xd3",
1266 }, {
1267 .key = "\x01\x02\x03\x04\x05\x06\x07\x08"
1268 "\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
1269 "\x11\x12\x13\x14\x15\x16\x17\x18\x19",
1270 .ksize = 25,
1271 .plaintext = "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1272 "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1273 "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1274 "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd",
1275 .psize = 50,
1276 .digest = "\x4c\x90\x07\xf4\x02\x62\x50\xc6\xbc\x84"
1277 "\x14\xf9\xbf\x50\xc8\x6c\x2d\x72\x35\xda",
1278 }, {
1279 .key = "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c",
1280 .ksize = 20,
1281 .plaintext = "Test With Truncation",
1282 .psize = 20,
1283 .digest = "\x4c\x1a\x03\x42\x4b\x55\xe0\x7f\xe7\xf2"
1284 "\x7b\xe1\xd5\x8b\xb9\x32\x4a\x9a\x5a\x04",
1285 }, {
1286 .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1287 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1288 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1289 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1290 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1291 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1292 "\xaa\xaa",
1293 .ksize = 80,
1294 .plaintext = "Test Using Larger Than Block-Size Key - Hash Key First",
1295 .psize = 54,
1296 .digest = "\xaa\x4a\xe5\xe1\x52\x72\xd0\x0e\x95\x70"
1297 "\x56\x37\xce\x8a\x3b\x55\xed\x40\x21\x12",
1298 }, {
1299 .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1300 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1301 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1302 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1303 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1304 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1305 "\xaa\xaa",
1306 .ksize = 80,
1307 .plaintext = "Test Using Larger Than Block-Size Key and Larger Than One "
1308 "Block-Size Data",
1309 .psize = 73,
1310 .digest = "\xe8\xe9\x9d\x0f\x45\x23\x7d\x78\x6d\x6b"
1311 "\xba\xa7\x96\x5c\x78\x08\xbb\xff\x1a\x91",
1312 },
1313};
1314
1315
1316/*
1317 * SHA224 HMAC test vectors from RFC4231
1318 */
1319#define HMAC_SHA224_TEST_VECTORS 4
1320
1321static struct hash_testvec hmac_sha224_tv_template[] = {
1322 {
1323 .key = "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
1324 "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
1325 "\x0b\x0b\x0b\x0b",
1326 .ksize = 20,
1327 /* ("Hi There") */
1328 .plaintext = "\x48\x69\x20\x54\x68\x65\x72\x65",
1329 .psize = 8,
1330 .digest = "\x89\x6f\xb1\x12\x8a\xbb\xdf\x19"
1331 "\x68\x32\x10\x7c\xd4\x9d\xf3\x3f"
1332 "\x47\xb4\xb1\x16\x99\x12\xba\x4f"
1333 "\x53\x68\x4b\x22",
1334 }, {
1335 .key = "Jefe",
1336 .ksize = 4,
1337 /* ("what do ya want for nothing?") */
1338 .plaintext = "\x77\x68\x61\x74\x20\x64\x6f\x20"
1339 "\x79\x61\x20\x77\x61\x6e\x74\x20"
1340 "\x66\x6f\x72\x20\x6e\x6f\x74\x68"
1341 "\x69\x6e\x67\x3f",
1342 .psize = 28,
1343 .digest = "\xa3\x0e\x01\x09\x8b\xc6\xdb\xbf"
1344 "\x45\x69\x0f\x3a\x7e\x9e\x6d\x0f"
1345 "\x8b\xbe\xa2\xa3\x9e\x61\x48\x00"
1346 "\x8f\xd0\x5e\x44",
1347 .np = 4,
1348 .tap = { 7, 7, 7, 7 }
1349 }, {
1350 .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1351 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1352 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1353 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1354 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1355 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1356 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1357 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1358 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1359 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1360 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1361 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1362 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1363 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1364 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1365 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1366 "\xaa\xaa\xaa",
1367 .ksize = 131,
1368 /* ("Test Using Larger Than Block-Size Key - Hash Key First") */
1369 .plaintext = "\x54\x65\x73\x74\x20\x55\x73\x69"
1370 "\x6e\x67\x20\x4c\x61\x72\x67\x65"
1371 "\x72\x20\x54\x68\x61\x6e\x20\x42"
1372 "\x6c\x6f\x63\x6b\x2d\x53\x69\x7a"
1373 "\x65\x20\x4b\x65\x79\x20\x2d\x20"
1374 "\x48\x61\x73\x68\x20\x4b\x65\x79"
1375 "\x20\x46\x69\x72\x73\x74",
1376 .psize = 54,
1377 .digest = "\x95\xe9\xa0\xdb\x96\x20\x95\xad"
1378 "\xae\xbe\x9b\x2d\x6f\x0d\xbc\xe2"
1379 "\xd4\x99\xf1\x12\xf2\xd2\xb7\x27"
1380 "\x3f\xa6\x87\x0e",
1381 }, {
1382 .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1383 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1384 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1385 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1386 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1387 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1388 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1389 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1390 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1391 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1392 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1393 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1394 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1395 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1396 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1397 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1398 "\xaa\xaa\xaa",
1399 .ksize = 131,
1400 /* ("This is a test using a larger than block-size key and a")
1401 (" larger than block-size data. The key needs to be")
1402 (" hashed before being used by the HMAC algorithm.") */
1403 .plaintext = "\x54\x68\x69\x73\x20\x69\x73\x20"
1404 "\x61\x20\x74\x65\x73\x74\x20\x75"
1405 "\x73\x69\x6e\x67\x20\x61\x20\x6c"
1406 "\x61\x72\x67\x65\x72\x20\x74\x68"
1407 "\x61\x6e\x20\x62\x6c\x6f\x63\x6b"
1408 "\x2d\x73\x69\x7a\x65\x20\x6b\x65"
1409 "\x79\x20\x61\x6e\x64\x20\x61\x20"
1410 "\x6c\x61\x72\x67\x65\x72\x20\x74"
1411 "\x68\x61\x6e\x20\x62\x6c\x6f\x63"
1412 "\x6b\x2d\x73\x69\x7a\x65\x20\x64"
1413 "\x61\x74\x61\x2e\x20\x54\x68\x65"
1414 "\x20\x6b\x65\x79\x20\x6e\x65\x65"
1415 "\x64\x73\x20\x74\x6f\x20\x62\x65"
1416 "\x20\x68\x61\x73\x68\x65\x64\x20"
1417 "\x62\x65\x66\x6f\x72\x65\x20\x62"
1418 "\x65\x69\x6e\x67\x20\x75\x73\x65"
1419 "\x64\x20\x62\x79\x20\x74\x68\x65"
1420 "\x20\x48\x4d\x41\x43\x20\x61\x6c"
1421 "\x67\x6f\x72\x69\x74\x68\x6d\x2e",
1422 .psize = 152,
1423 .digest = "\x3a\x85\x41\x66\xac\x5d\x9f\x02"
1424 "\x3f\x54\xd5\x17\xd0\xb3\x9d\xbd"
1425 "\x94\x67\x70\xdb\x9c\x2b\x95\xc9"
1426 "\xf6\xf5\x65\xd1",
1427 },
1428};
1429
1430/*
1431 * HMAC-SHA256 test vectors from
1432 * draft-ietf-ipsec-ciph-sha-256-01.txt
1433 */
1434#define HMAC_SHA256_TEST_VECTORS 10
1435
1436static struct hash_testvec hmac_sha256_tv_template[] = {
1437 {
1438 .key = "\x01\x02\x03\x04\x05\x06\x07\x08"
1439 "\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
1440 "\x11\x12\x13\x14\x15\x16\x17\x18"
1441 "\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20",
1442 .ksize = 32,
1443 .plaintext = "abc",
1444 .psize = 3,
1445 .digest = "\xa2\x1b\x1f\x5d\x4c\xf4\xf7\x3a"
1446 "\x4d\xd9\x39\x75\x0f\x7a\x06\x6a"
1447 "\x7f\x98\xcc\x13\x1c\xb1\x6a\x66"
1448 "\x92\x75\x90\x21\xcf\xab\x81\x81",
1449 }, {
1450 .key = "\x01\x02\x03\x04\x05\x06\x07\x08"
1451 "\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
1452 "\x11\x12\x13\x14\x15\x16\x17\x18"
1453 "\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20",
1454 .ksize = 32,
1455 .plaintext = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
1456 .psize = 56,
1457 .digest = "\x10\x4f\xdc\x12\x57\x32\x8f\x08"
1458 "\x18\x4b\xa7\x31\x31\xc5\x3c\xae"
1459 "\xe6\x98\xe3\x61\x19\x42\x11\x49"
1460 "\xea\x8c\x71\x24\x56\x69\x7d\x30",
1461 }, {
1462 .key = "\x01\x02\x03\x04\x05\x06\x07\x08"
1463 "\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
1464 "\x11\x12\x13\x14\x15\x16\x17\x18"
1465 "\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20",
1466 .ksize = 32,
1467 .plaintext = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
1468 "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
1469 .psize = 112,
1470 .digest = "\x47\x03\x05\xfc\x7e\x40\xfe\x34"
1471 "\xd3\xee\xb3\xe7\x73\xd9\x5a\xab"
1472 "\x73\xac\xf0\xfd\x06\x04\x47\xa5"
1473 "\xeb\x45\x95\xbf\x33\xa9\xd1\xa3",
1474 }, {
1475 .key = "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
1476 "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
1477 "\x0b\x0b\x0b\x0b\x0b\x0b",
1478 .ksize = 32,
1479 .plaintext = "Hi There",
1480 .psize = 8,
1481 .digest = "\x19\x8a\x60\x7e\xb4\x4b\xfb\xc6"
1482 "\x99\x03\xa0\xf1\xcf\x2b\xbd\xc5"
1483 "\xba\x0a\xa3\xf3\xd9\xae\x3c\x1c"
1484 "\x7a\x3b\x16\x96\xa0\xb6\x8c\xf7",
1485 }, {
1486 .key = "Jefe",
1487 .ksize = 4,
1488 .plaintext = "what do ya want for nothing?",
1489 .psize = 28,
1490 .digest = "\x5b\xdc\xc1\x46\xbf\x60\x75\x4e"
1491 "\x6a\x04\x24\x26\x08\x95\x75\xc7"
1492 "\x5a\x00\x3f\x08\x9d\x27\x39\x83"
1493 "\x9d\xec\x58\xb9\x64\xec\x38\x43",
1494 .np = 2,
1495 .tap = { 14, 14 }
1496 }, {
1497 .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1498 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1499 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
1500 .ksize = 32,
1501 .plaintext = "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
1502 "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
1503 "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
1504 "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd",
1505 .psize = 50,
1506 .digest = "\xcd\xcb\x12\x20\xd1\xec\xcc\xea"
1507 "\x91\xe5\x3a\xba\x30\x92\xf9\x62"
1508 "\xe5\x49\xfe\x6c\xe9\xed\x7f\xdc"
1509 "\x43\x19\x1f\xbd\xe4\x5c\x30\xb0",
1510 }, {
1511 .key = "\x01\x02\x03\x04\x05\x06\x07\x08"
1512 "\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
1513 "\x11\x12\x13\x14\x15\x16\x17\x18"
1514 "\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20"
1515 "\x21\x22\x23\x24\x25",
1516 .ksize = 37,
1517 .plaintext = "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1518 "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1519 "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
1520 "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd",
1521 .psize = 50,
1522 .digest = "\xd4\x63\x3c\x17\xf6\xfb\x8d\x74"
1523 "\x4c\x66\xde\xe0\xf8\xf0\x74\x55"
1524 "\x6e\xc4\xaf\x55\xef\x07\x99\x85"
1525 "\x41\x46\x8e\xb4\x9b\xd2\xe9\x17",
1526 }, {
1527 .key = "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c"
1528 "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c"
1529 "\x0c\x0c\x0c\x0c\x0c\x0c",
1530 .ksize = 32,
1531 .plaintext = "Test With Truncation",
1532 .psize = 20,
1533 .digest = "\x75\x46\xaf\x01\x84\x1f\xc0\x9b"
1534 "\x1a\xb9\xc3\x74\x9a\x5f\x1c\x17"
1535 "\xd4\xf5\x89\x66\x8a\x58\x7b\x27"
1536 "\x00\xa9\xc9\x7c\x11\x93\xcf\x42",
1537 }, {
1538 .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1539 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1540 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1541 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1542 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1543 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1544 "\xaa\xaa",
1545 .ksize = 80,
1546 .plaintext = "Test Using Larger Than Block-Size Key - Hash Key First",
1547 .psize = 54,
1548 .digest = "\x69\x53\x02\x5e\xd9\x6f\x0c\x09"
1549 "\xf8\x0a\x96\xf7\x8e\x65\x38\xdb"
1550 "\xe2\xe7\xb8\x20\xe3\xdd\x97\x0e"
1551 "\x7d\xdd\x39\x09\x1b\x32\x35\x2f",
1552 }, {
1553 .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1554 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1555 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1556 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1557 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1558 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1559 "\xaa\xaa",
1560 .ksize = 80,
1561 .plaintext = "Test Using Larger Than Block-Size Key and Larger Than "
1562 "One Block-Size Data",
1563 .psize = 73,
1564 .digest = "\x63\x55\xac\x22\xe8\x90\xd0\xa3"
1565 "\xc8\x48\x1a\x5c\xa4\x82\x5b\xc8"
1566 "\x84\xd3\xe7\xa1\xff\x98\xa2\xfc"
1567 "\x2a\xc7\xd8\xe0\x64\xc3\xb2\xe6",
1568 },
1569};
1570
1571#define XCBC_AES_TEST_VECTORS 6
1572
1573static struct hash_testvec aes_xcbc128_tv_template[] = {
1574 {
1575 .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
1576 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
1577 .plaintext = zeroed_string,
1578 .digest = "\x75\xf0\x25\x1d\x52\x8a\xc0\x1c"
1579 "\x45\x73\xdf\xd5\x84\xd7\x9f\x29",
1580 .psize = 0,
1581 .ksize = 16,
1582 }, {
1583 .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
1584 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
1585 .plaintext = "\x00\x01\x02",
1586 .digest = "\x5b\x37\x65\x80\xae\x2f\x19\xaf"
1587 "\xe7\x21\x9c\xee\xf1\x72\x75\x6f",
1588 .psize = 3,
1589 .ksize = 16,
1590 } , {
1591 .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
1592 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
1593 .plaintext = "\x00\x01\x02\x03\x04\x05\x06\x07"
1594 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
1595 .digest = "\xd2\xa2\x46\xfa\x34\x9b\x68\xa7"
1596 "\x99\x98\xa4\x39\x4f\xf7\xa2\x63",
1597 .psize = 16,
1598 .ksize = 16,
1599 }, {
1600 .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
1601 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
1602 .plaintext = "\x00\x01\x02\x03\x04\x05\x06\x07"
1603 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
1604 "\x10\x11\x12\x13",
1605 .digest = "\x47\xf5\x1b\x45\x64\x96\x62\x15"
1606 "\xb8\x98\x5c\x63\x05\x5e\xd3\x08",
1607 .tap = { 10, 10 },
1608 .psize = 20,
1609 .np = 2,
1610 .ksize = 16,
1611 }, {
1612 .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
1613 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
1614 .plaintext = "\x00\x01\x02\x03\x04\x05\x06\x07"
1615 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
1616 "\x10\x11\x12\x13\x14\x15\x16\x17"
1617 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
1618 .digest = "\xf5\x4f\x0e\xc8\xd2\xb9\xf3\xd3"
1619 "\x68\x07\x73\x4b\xd5\x28\x3f\xd4",
1620 .psize = 32,
1621 .ksize = 16,
1622 }, {
1623 .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
1624 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
1625 .plaintext = "\x00\x01\x02\x03\x04\x05\x06\x07"
1626 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
1627 "\x10\x11\x12\x13\x14\x15\x16\x17"
1628 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
1629 "\x20\x21",
1630 .digest = "\xbe\xcb\xb3\xbc\xcd\xb5\x18\xa3"
1631 "\x06\x77\xd5\x48\x1f\xb6\xb4\xd8",
1632 .tap = { 17, 17 },
1633 .psize = 34,
1634 .np = 2,
1635 .ksize = 16,
1636 }
1637};
1638
1639/*
1640 * SHA384 HMAC test vectors from RFC4231
1641 */
1642
1643#define HMAC_SHA384_TEST_VECTORS 4
1644
1645static struct hash_testvec hmac_sha384_tv_template[] = {
1646 {
1647 .key = "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
1648 "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
1649 "\x0b\x0b\x0b\x0b",
1650 .ksize = 20,
1651 .plaintext = "Hi There",
1652 .psize = 8,
1653 .digest = "\xaf\xd0\x39\x44\xd8\x48\x95\x62"
1654 "\x6b\x08\x25\xf4\xab\x46\x90\x7f"
1655 "\x15\xf9\xda\xdb\xe4\x10\x1e\xc6"
1656 "\x82\xaa\x03\x4c\x7c\xeb\xc5\x9c"
1657 "\xfa\xea\x9e\xa9\x07\x6e\xde\x7f"
1658 "\x4a\xf1\x52\xe8\xb2\xfa\x9c\xb6",
1659 }, {
1660 .key = "Jefe",
1661 .ksize = 4,
1662 .plaintext = "what do ya want for nothing?",
1663 .psize = 28,
1664 .digest = "\xaf\x45\xd2\xe3\x76\x48\x40\x31"
1665 "\x61\x7f\x78\xd2\xb5\x8a\x6b\x1b"
1666 "\x9c\x7e\xf4\x64\xf5\xa0\x1b\x47"
1667 "\xe4\x2e\xc3\x73\x63\x22\x44\x5e"
1668 "\x8e\x22\x40\xca\x5e\x69\xe2\xc7"
1669 "\x8b\x32\x39\xec\xfa\xb2\x16\x49",
1670 .np = 4,
1671 .tap = { 7, 7, 7, 7 }
1672 }, {
1673 .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1674 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1675 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1676 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1677 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1678 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1679 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1680 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1681 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1682 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1683 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1684 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1685 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1686 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1687 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1688 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1689 "\xaa\xaa\xaa",
1690 .ksize = 131,
1691 .plaintext = "Test Using Larger Than Block-Siz"
1692 "e Key - Hash Key First",
1693 .psize = 54,
1694 .digest = "\x4e\xce\x08\x44\x85\x81\x3e\x90"
1695 "\x88\xd2\xc6\x3a\x04\x1b\xc5\xb4"
1696 "\x4f\x9e\xf1\x01\x2a\x2b\x58\x8f"
1697 "\x3c\xd1\x1f\x05\x03\x3a\xc4\xc6"
1698 "\x0c\x2e\xf6\xab\x40\x30\xfe\x82"
1699 "\x96\x24\x8d\xf1\x63\xf4\x49\x52",
1700 }, {
1701 .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1702 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1703 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1704 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1705 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1706 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1707 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1708 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1709 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1710 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1711 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1712 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1713 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1714 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1715 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1716 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1717 "\xaa\xaa\xaa",
1718 .ksize = 131,
1719 .plaintext = "This is a test u"
1720 "sing a larger th"
1721 "an block-size ke"
1722 "y and a larger t"
1723 "han block-size d"
1724 "ata. The key nee"
1725 "ds to be hashed "
1726 "before being use"
1727 "d by the HMAC al"
1728 "gorithm.",
1729 .psize = 152,
1730 .digest = "\x66\x17\x17\x8e\x94\x1f\x02\x0d"
1731 "\x35\x1e\x2f\x25\x4e\x8f\xd3\x2c"
1732 "\x60\x24\x20\xfe\xb0\xb8\xfb\x9a"
1733 "\xdc\xce\xbb\x82\x46\x1e\x99\xc5"
1734 "\xa6\x78\xcc\x31\xe7\x99\x17\x6d"
1735 "\x38\x60\xe6\x11\x0c\x46\x52\x3e",
1736 },
1737};
1738
1739/*
1740 * SHA512 HMAC test vectors from RFC4231
1741 */
1742
1743#define HMAC_SHA512_TEST_VECTORS 4
1744
1745static struct hash_testvec hmac_sha512_tv_template[] = {
1746 {
1747 .key = "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
1748 "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
1749 "\x0b\x0b\x0b\x0b",
1750 .ksize = 20,
1751 .plaintext = "Hi There",
1752 .psize = 8,
1753 .digest = "\x87\xaa\x7c\xde\xa5\xef\x61\x9d"
1754 "\x4f\xf0\xb4\x24\x1a\x1d\x6c\xb0"
1755 "\x23\x79\xf4\xe2\xce\x4e\xc2\x78"
1756 "\x7a\xd0\xb3\x05\x45\xe1\x7c\xde"
1757 "\xda\xa8\x33\xb7\xd6\xb8\xa7\x02"
1758 "\x03\x8b\x27\x4e\xae\xa3\xf4\xe4"
1759 "\xbe\x9d\x91\x4e\xeb\x61\xf1\x70"
1760 "\x2e\x69\x6c\x20\x3a\x12\x68\x54",
1761 }, {
1762 .key = "Jefe",
1763 .ksize = 4,
1764 .plaintext = "what do ya want for nothing?",
1765 .psize = 28,
1766 .digest = "\x16\x4b\x7a\x7b\xfc\xf8\x19\xe2"
1767 "\xe3\x95\xfb\xe7\x3b\x56\xe0\xa3"
1768 "\x87\xbd\x64\x22\x2e\x83\x1f\xd6"
1769 "\x10\x27\x0c\xd7\xea\x25\x05\x54"
1770 "\x97\x58\xbf\x75\xc0\x5a\x99\x4a"
1771 "\x6d\x03\x4f\x65\xf8\xf0\xe6\xfd"
1772 "\xca\xea\xb1\xa3\x4d\x4a\x6b\x4b"
1773 "\x63\x6e\x07\x0a\x38\xbc\xe7\x37",
1774 .np = 4,
1775 .tap = { 7, 7, 7, 7 }
1776 }, {
1777 .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1778 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1779 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1780 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1781 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1782 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1783 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1784 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1785 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1786 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1787 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1788 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1789 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1790 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1791 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1792 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1793 "\xaa\xaa\xaa",
1794 .ksize = 131,
1795 .plaintext = "Test Using Large"
1796 "r Than Block-Siz"
1797 "e Key - Hash Key"
1798 " First",
1799 .psize = 54,
1800 .digest = "\x80\xb2\x42\x63\xc7\xc1\xa3\xeb"
1801 "\xb7\x14\x93\xc1\xdd\x7b\xe8\xb4"
1802 "\x9b\x46\xd1\xf4\x1b\x4a\xee\xc1"
1803 "\x12\x1b\x01\x37\x83\xf8\xf3\x52"
1804 "\x6b\x56\xd0\x37\xe0\x5f\x25\x98"
1805 "\xbd\x0f\xd2\x21\x5d\x6a\x1e\x52"
1806 "\x95\xe6\x4f\x73\xf6\x3f\x0a\xec"
1807 "\x8b\x91\x5a\x98\x5d\x78\x65\x98",
1808 }, {
1809 .key = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1810 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1811 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1812 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1813 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1814 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1815 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1816 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1817 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1818 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1819 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1820 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1821 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1822 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1823 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1824 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
1825 "\xaa\xaa\xaa",
1826 .ksize = 131,
1827 .plaintext =
1828 "This is a test u"
1829 "sing a larger th"
1830 "an block-size ke"
1831 "y and a larger t"
1832 "han block-size d"
1833 "ata. The key nee"
1834 "ds to be hashed "
1835 "before being use"
1836 "d by the HMAC al"
1837 "gorithm.",
1838 .psize = 152,
1839 .digest = "\xe3\x7b\x6a\x77\x5d\xc8\x7d\xba"
1840 "\xa4\xdf\xa9\xf9\x6e\x5e\x3f\xfd"
1841 "\xde\xbd\x71\xf8\x86\x72\x89\x86"
1842 "\x5d\xf5\xa3\x2d\x20\xcd\xc9\x44"
1843 "\xb6\x02\x2c\xac\x3c\x49\x82\xb1"
1844 "\x0d\x5e\xeb\x55\xc3\xe4\xde\x15"
1845 "\x13\x46\x76\xfb\x6d\xe0\x44\x60"
1846 "\x65\xc9\x74\x40\xfa\x8c\x6a\x58",
1847 },
1848};
1849
1850/*
1851 * DES test vectors.
1852 */
1853#define DES_ENC_TEST_VECTORS 10
1854#define DES_DEC_TEST_VECTORS 4
1855#define DES_CBC_ENC_TEST_VECTORS 5
1856#define DES_CBC_DEC_TEST_VECTORS 4
1857#define DES3_EDE_ENC_TEST_VECTORS 3
1858#define DES3_EDE_DEC_TEST_VECTORS 3
1859#define DES3_EDE_CBC_ENC_TEST_VECTORS 1
1860#define DES3_EDE_CBC_DEC_TEST_VECTORS 1
1861
1862static struct cipher_testvec des_enc_tv_template[] = {
1863 { /* From Applied Cryptography */
1864 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
1865 .klen = 8,
1866 .input = "\x01\x23\x45\x67\x89\xab\xcd\xe7",
1867 .ilen = 8,
1868 .result = "\xc9\x57\x44\x25\x6a\x5e\xd3\x1d",
1869 .rlen = 8,
1870 }, { /* Same key, different plaintext block */
1871 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
1872 .klen = 8,
1873 .input = "\x22\x33\x44\x55\x66\x77\x88\x99",
1874 .ilen = 8,
1875 .result = "\xf7\x9c\x89\x2a\x33\x8f\x4a\x8b",
1876 .rlen = 8,
1877 }, { /* Sbox test from NBS */
1878 .key = "\x7c\xa1\x10\x45\x4a\x1a\x6e\x57",
1879 .klen = 8,
1880 .input = "\x01\xa1\xd6\xd0\x39\x77\x67\x42",
1881 .ilen = 8,
1882 .result = "\x69\x0f\x5b\x0d\x9a\x26\x93\x9b",
1883 .rlen = 8,
1884 }, { /* Three blocks */
1885 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
1886 .klen = 8,
1887 .input = "\x01\x23\x45\x67\x89\xab\xcd\xe7"
1888 "\x22\x33\x44\x55\x66\x77\x88\x99"
1889 "\xca\xfe\xba\xbe\xfe\xed\xbe\xef",
1890 .ilen = 24,
1891 .result = "\xc9\x57\x44\x25\x6a\x5e\xd3\x1d"
1892 "\xf7\x9c\x89\x2a\x33\x8f\x4a\x8b"
1893 "\xb4\x99\x26\xf7\x1f\xe1\xd4\x90",
1894 .rlen = 24,
1895 }, { /* Weak key */
1896 .fail = 1,
1897 .wk = 1,
1898 .key = "\x01\x01\x01\x01\x01\x01\x01\x01",
1899 .klen = 8,
1900 .input = "\x01\x23\x45\x67\x89\xab\xcd\xe7",
1901 .ilen = 8,
1902 .result = "\xc9\x57\x44\x25\x6a\x5e\xd3\x1d",
1903 .rlen = 8,
1904 }, { /* Two blocks -- for testing encryption across pages */
1905 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
1906 .klen = 8,
1907 .input = "\x01\x23\x45\x67\x89\xab\xcd\xe7"
1908 "\x22\x33\x44\x55\x66\x77\x88\x99",
1909 .ilen = 16,
1910 .result = "\xc9\x57\x44\x25\x6a\x5e\xd3\x1d"
1911 "\xf7\x9c\x89\x2a\x33\x8f\x4a\x8b",
1912 .rlen = 16,
1913 .np = 2,
1914 .tap = { 8, 8 }
1915 }, { /* Four blocks -- for testing encryption with chunking */
1916 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
1917 .klen = 8,
1918 .input = "\x01\x23\x45\x67\x89\xab\xcd\xe7"
1919 "\x22\x33\x44\x55\x66\x77\x88\x99"
1920 "\xca\xfe\xba\xbe\xfe\xed\xbe\xef"
1921 "\x22\x33\x44\x55\x66\x77\x88\x99",
1922 .ilen = 32,
1923 .result = "\xc9\x57\x44\x25\x6a\x5e\xd3\x1d"
1924 "\xf7\x9c\x89\x2a\x33\x8f\x4a\x8b"
1925 "\xb4\x99\x26\xf7\x1f\xe1\xd4\x90"
1926 "\xf7\x9c\x89\x2a\x33\x8f\x4a\x8b",
1927 .rlen = 32,
1928 .np = 3,
1929 .tap = { 14, 10, 8 }
1930 }, {
1931 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
1932 .klen = 8,
1933 .input = "\x01\x23\x45\x67\x89\xab\xcd\xe7"
1934 "\x22\x33\x44\x55\x66\x77\x88\x99"
1935 "\xca\xfe\xba\xbe\xfe\xed\xbe\xef",
1936 .ilen = 24,
1937 .result = "\xc9\x57\x44\x25\x6a\x5e\xd3\x1d"
1938 "\xf7\x9c\x89\x2a\x33\x8f\x4a\x8b"
1939 "\xb4\x99\x26\xf7\x1f\xe1\xd4\x90",
1940 .rlen = 24,
1941 .np = 4,
1942 .tap = { 2, 1, 3, 18 }
1943 }, {
1944 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
1945 .klen = 8,
1946 .input = "\x01\x23\x45\x67\x89\xab\xcd\xe7"
1947 "\x22\x33\x44\x55\x66\x77\x88\x99",
1948 .ilen = 16,
1949 .result = "\xc9\x57\x44\x25\x6a\x5e\xd3\x1d"
1950 "\xf7\x9c\x89\x2a\x33\x8f\x4a\x8b",
1951 .rlen = 16,
1952 .np = 5,
1953 .tap = { 2, 2, 2, 2, 8 }
1954 }, {
1955 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
1956 .klen = 8,
1957 .input = "\x01\x23\x45\x67\x89\xab\xcd\xe7",
1958 .ilen = 8,
1959 .result = "\xc9\x57\x44\x25\x6a\x5e\xd3\x1d",
1960 .rlen = 8,
1961 .np = 8,
1962 .tap = { 1, 1, 1, 1, 1, 1, 1, 1 }
1963 },
1964};
1965
1966static struct cipher_testvec des_dec_tv_template[] = {
1967 { /* From Applied Cryptography */
1968 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
1969 .klen = 8,
1970 .input = "\xc9\x57\x44\x25\x6a\x5e\xd3\x1d",
1971 .ilen = 8,
1972 .result = "\x01\x23\x45\x67\x89\xab\xcd\xe7",
1973 .rlen = 8,
1974 }, { /* Sbox test from NBS */
1975 .key = "\x7c\xa1\x10\x45\x4a\x1a\x6e\x57",
1976 .klen = 8,
1977 .input = "\x69\x0f\x5b\x0d\x9a\x26\x93\x9b",
1978 .ilen = 8,
1979 .result = "\x01\xa1\xd6\xd0\x39\x77\x67\x42",
1980 .rlen = 8,
1981 }, { /* Two blocks, for chunking test */
1982 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
1983 .klen = 8,
1984 .input = "\xc9\x57\x44\x25\x6a\x5e\xd3\x1d"
1985 "\x69\x0f\x5b\x0d\x9a\x26\x93\x9b",
1986 .ilen = 16,
1987 .result = "\x01\x23\x45\x67\x89\xab\xcd\xe7"
1988 "\xa3\x99\x7b\xca\xaf\x69\xa0\xf5",
1989 .rlen = 16,
1990 .np = 2,
1991 .tap = { 8, 8 }
1992 }, {
1993 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
1994 .klen = 8,
1995 .input = "\xc9\x57\x44\x25\x6a\x5e\xd3\x1d"
1996 "\x69\x0f\x5b\x0d\x9a\x26\x93\x9b",
1997 .ilen = 16,
1998 .result = "\x01\x23\x45\x67\x89\xab\xcd\xe7"
1999 "\xa3\x99\x7b\xca\xaf\x69\xa0\xf5",
2000 .rlen = 16,
2001 .np = 3,
2002 .tap = { 3, 12, 1 }
2003 },
2004};
2005
2006static struct cipher_testvec des_cbc_enc_tv_template[] = {
2007 { /* From OpenSSL */
2008 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
2009 .klen = 8,
2010 .iv = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
2011 .input = "\x37\x36\x35\x34\x33\x32\x31\x20"
2012 "\x4e\x6f\x77\x20\x69\x73\x20\x74"
2013 "\x68\x65\x20\x74\x69\x6d\x65\x20",
2014 .ilen = 24,
2015 .result = "\xcc\xd1\x73\xff\xab\x20\x39\xf4"
2016 "\xac\xd8\xae\xfd\xdf\xd8\xa1\xeb"
2017 "\x46\x8e\x91\x15\x78\x88\xba\x68",
2018 .rlen = 24,
2019 }, { /* FIPS Pub 81 */
2020 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
2021 .klen = 8,
2022 .iv = "\x12\x34\x56\x78\x90\xab\xcd\xef",
2023 .input = "\x4e\x6f\x77\x20\x69\x73\x20\x74",
2024 .ilen = 8,
2025 .result = "\xe5\xc7\xcd\xde\x87\x2b\xf2\x7c",
2026 .rlen = 8,
2027 }, {
2028 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
2029 .klen = 8,
2030 .iv = "\xe5\xc7\xcd\xde\x87\x2b\xf2\x7c",
2031 .input = "\x68\x65\x20\x74\x69\x6d\x65\x20",
2032 .ilen = 8,
2033 .result = "\x43\xe9\x34\x00\x8c\x38\x9c\x0f",
2034 .rlen = 8,
2035 }, {
2036 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
2037 .klen = 8,
2038 .iv = "\x43\xe9\x34\x00\x8c\x38\x9c\x0f",
2039 .input = "\x66\x6f\x72\x20\x61\x6c\x6c\x20",
2040 .ilen = 8,
2041 .result = "\x68\x37\x88\x49\x9a\x7c\x05\xf6",
2042 .rlen = 8,
2043 }, { /* Copy of openssl vector for chunk testing */
2044 /* From OpenSSL */
2045 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
2046 .klen = 8,
2047 .iv = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
2048 .input = "\x37\x36\x35\x34\x33\x32\x31\x20"
2049 "\x4e\x6f\x77\x20\x69\x73\x20\x74"
2050 "\x68\x65\x20\x74\x69\x6d\x65\x20",
2051 .ilen = 24,
2052 .result = "\xcc\xd1\x73\xff\xab\x20\x39\xf4"
2053 "\xac\xd8\xae\xfd\xdf\xd8\xa1\xeb"
2054 "\x46\x8e\x91\x15\x78\x88\xba\x68",
2055 .rlen = 24,
2056 .np = 2,
2057 .tap = { 13, 11 }
2058 },
2059};
2060
2061static struct cipher_testvec des_cbc_dec_tv_template[] = {
2062 { /* FIPS Pub 81 */
2063 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
2064 .klen = 8,
2065 .iv = "\x12\x34\x56\x78\x90\xab\xcd\xef",
2066 .input = "\xe5\xc7\xcd\xde\x87\x2b\xf2\x7c",
2067 .ilen = 8,
2068 .result = "\x4e\x6f\x77\x20\x69\x73\x20\x74",
2069 .rlen = 8,
2070 }, {
2071 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
2072 .klen = 8,
2073 .iv = "\xe5\xc7\xcd\xde\x87\x2b\xf2\x7c",
2074 .input = "\x43\xe9\x34\x00\x8c\x38\x9c\x0f",
2075 .ilen = 8,
2076 .result = "\x68\x65\x20\x74\x69\x6d\x65\x20",
2077 .rlen = 8,
2078 }, {
2079 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
2080 .klen = 8,
2081 .iv = "\x43\xe9\x34\x00\x8c\x38\x9c\x0f",
2082 .input = "\x68\x37\x88\x49\x9a\x7c\x05\xf6",
2083 .ilen = 8,
2084 .result = "\x66\x6f\x72\x20\x61\x6c\x6c\x20",
2085 .rlen = 8,
2086 }, { /* Copy of above, for chunk testing */
2087 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
2088 .klen = 8,
2089 .iv = "\x43\xe9\x34\x00\x8c\x38\x9c\x0f",
2090 .input = "\x68\x37\x88\x49\x9a\x7c\x05\xf6",
2091 .ilen = 8,
2092 .result = "\x66\x6f\x72\x20\x61\x6c\x6c\x20",
2093 .rlen = 8,
2094 .np = 2,
2095 .tap = { 4, 4 }
2096 },
2097};
2098
2099static struct cipher_testvec des3_ede_enc_tv_template[] = {
2100 { /* These are from openssl */
2101 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef"
2102 "\x55\x55\x55\x55\x55\x55\x55\x55"
2103 "\xfe\xdc\xba\x98\x76\x54\x32\x10",
2104 .klen = 24,
2105 .input = "\x73\x6f\x6d\x65\x64\x61\x74\x61",
2106 .ilen = 8,
2107 .result = "\x18\xd7\x48\xe5\x63\x62\x05\x72",
2108 .rlen = 8,
2109 }, {
2110 .key = "\x03\x52\x02\x07\x67\x20\x82\x17"
2111 "\x86\x02\x87\x66\x59\x08\x21\x98"
2112 "\x64\x05\x6a\xbd\xfe\xa9\x34\x57",
2113 .klen = 24,
2114 .input = "\x73\x71\x75\x69\x67\x67\x6c\x65",
2115 .ilen = 8,
2116 .result = "\xc0\x7d\x2a\x0f\xa5\x66\xfa\x30",
2117 .rlen = 8,
2118 }, {
2119 .key = "\x10\x46\x10\x34\x89\x98\x80\x20"
2120 "\x91\x07\xd0\x15\x89\x19\x01\x01"
2121 "\x19\x07\x92\x10\x98\x1a\x01\x01",
2122 .klen = 24,
2123 .input = "\x00\x00\x00\x00\x00\x00\x00\x00",
2124 .ilen = 8,
2125 .result = "\xe1\xef\x62\xc3\x32\xfe\x82\x5b",
2126 .rlen = 8,
2127 },
2128};
2129
2130static struct cipher_testvec des3_ede_dec_tv_template[] = {
2131 { /* These are from openssl */
2132 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef"
2133 "\x55\x55\x55\x55\x55\x55\x55\x55"
2134 "\xfe\xdc\xba\x98\x76\x54\x32\x10",
2135 .klen = 24,
2136 .input = "\x18\xd7\x48\xe5\x63\x62\x05\x72",
2137 .ilen = 8,
2138 .result = "\x73\x6f\x6d\x65\x64\x61\x74\x61",
2139 .rlen = 8,
2140 }, {
2141 .key = "\x03\x52\x02\x07\x67\x20\x82\x17"
2142 "\x86\x02\x87\x66\x59\x08\x21\x98"
2143 "\x64\x05\x6a\xbd\xfe\xa9\x34\x57",
2144 .klen = 24,
2145 .input = "\xc0\x7d\x2a\x0f\xa5\x66\xfa\x30",
2146 .ilen = 8,
2147 .result = "\x73\x71\x75\x69\x67\x67\x6c\x65",
2148 .rlen = 8,
2149 }, {
2150 .key = "\x10\x46\x10\x34\x89\x98\x80\x20"
2151 "\x91\x07\xd0\x15\x89\x19\x01\x01"
2152 "\x19\x07\x92\x10\x98\x1a\x01\x01",
2153 .klen = 24,
2154 .input = "\xe1\xef\x62\xc3\x32\xfe\x82\x5b",
2155 .ilen = 8,
2156 .result = "\x00\x00\x00\x00\x00\x00\x00\x00",
2157 .rlen = 8,
2158 },
2159};
2160
2161static struct cipher_testvec des3_ede_cbc_enc_tv_template[] = {
2162 { /* Generated from openssl */
2163 .key = "\xE9\xC0\xFF\x2E\x76\x0B\x64\x24"
2164 "\x44\x4D\x99\x5A\x12\xD6\x40\xC0"
2165 "\xEA\xC2\x84\xE8\x14\x95\xDB\xE8",
2166 .klen = 24,
2167 .iv = "\x7D\x33\x88\x93\x0F\x93\xB2\x42",
2168 .input = "\x6f\x54\x20\x6f\x61\x4d\x79\x6e"
2169 "\x53\x20\x63\x65\x65\x72\x73\x74"
2170 "\x54\x20\x6f\x6f\x4d\x20\x6e\x61"
2171 "\x20\x79\x65\x53\x72\x63\x74\x65"
2172 "\x20\x73\x6f\x54\x20\x6f\x61\x4d"
2173 "\x79\x6e\x53\x20\x63\x65\x65\x72"
2174 "\x73\x74\x54\x20\x6f\x6f\x4d\x20"
2175 "\x6e\x61\x20\x79\x65\x53\x72\x63"
2176 "\x74\x65\x20\x73\x6f\x54\x20\x6f"
2177 "\x61\x4d\x79\x6e\x53\x20\x63\x65"
2178 "\x65\x72\x73\x74\x54\x20\x6f\x6f"
2179 "\x4d\x20\x6e\x61\x20\x79\x65\x53"
2180 "\x72\x63\x74\x65\x20\x73\x6f\x54"
2181 "\x20\x6f\x61\x4d\x79\x6e\x53\x20"
2182 "\x63\x65\x65\x72\x73\x74\x54\x20"
2183 "\x6f\x6f\x4d\x20\x6e\x61\x0a\x79",
2184 .ilen = 128,
2185 .result = "\x0e\x2d\xb6\x97\x3c\x56\x33\xf4"
2186 "\x67\x17\x21\xc7\x6e\x8a\xd5\x49"
2187 "\x74\xb3\x49\x05\xc5\x1c\xd0\xed"
2188 "\x12\x56\x5c\x53\x96\xb6\x00\x7d"
2189 "\x90\x48\xfc\xf5\x8d\x29\x39\xcc"
2190 "\x8a\xd5\x35\x18\x36\x23\x4e\xd7"
2191 "\x76\xd1\xda\x0c\x94\x67\xbb\x04"
2192 "\x8b\xf2\x03\x6c\xa8\xcf\xb6\xea"
2193 "\x22\x64\x47\xaa\x8f\x75\x13\xbf"
2194 "\x9f\xc2\xc3\xf0\xc9\x56\xc5\x7a"
2195 "\x71\x63\x2e\x89\x7b\x1e\x12\xca"
2196 "\xe2\x5f\xaf\xd8\xa4\xf8\xc9\x7a"
2197 "\xd6\xf9\x21\x31\x62\x44\x45\xa6"
2198 "\xd6\xbc\x5a\xd3\x2d\x54\x43\xcc"
2199 "\x9d\xde\xa5\x70\xe9\x42\x45\x8a"
2200 "\x6b\xfa\xb1\x91\x13\xb0\xd9\x19",
2201 .rlen = 128,
2202 },
2203};
2204
2205static struct cipher_testvec des3_ede_cbc_dec_tv_template[] = {
2206 { /* Generated from openssl */
2207 .key = "\xE9\xC0\xFF\x2E\x76\x0B\x64\x24"
2208 "\x44\x4D\x99\x5A\x12\xD6\x40\xC0"
2209 "\xEA\xC2\x84\xE8\x14\x95\xDB\xE8",
2210 .klen = 24,
2211 .iv = "\x7D\x33\x88\x93\x0F\x93\xB2\x42",
2212 .input = "\x0e\x2d\xb6\x97\x3c\x56\x33\xf4"
2213 "\x67\x17\x21\xc7\x6e\x8a\xd5\x49"
2214 "\x74\xb3\x49\x05\xc5\x1c\xd0\xed"
2215 "\x12\x56\x5c\x53\x96\xb6\x00\x7d"
2216 "\x90\x48\xfc\xf5\x8d\x29\x39\xcc"
2217 "\x8a\xd5\x35\x18\x36\x23\x4e\xd7"
2218 "\x76\xd1\xda\x0c\x94\x67\xbb\x04"
2219 "\x8b\xf2\x03\x6c\xa8\xcf\xb6\xea"
2220 "\x22\x64\x47\xaa\x8f\x75\x13\xbf"
2221 "\x9f\xc2\xc3\xf0\xc9\x56\xc5\x7a"
2222 "\x71\x63\x2e\x89\x7b\x1e\x12\xca"
2223 "\xe2\x5f\xaf\xd8\xa4\xf8\xc9\x7a"
2224 "\xd6\xf9\x21\x31\x62\x44\x45\xa6"
2225 "\xd6\xbc\x5a\xd3\x2d\x54\x43\xcc"
2226 "\x9d\xde\xa5\x70\xe9\x42\x45\x8a"
2227 "\x6b\xfa\xb1\x91\x13\xb0\xd9\x19",
2228 .ilen = 128,
2229 .result = "\x6f\x54\x20\x6f\x61\x4d\x79\x6e"
2230 "\x53\x20\x63\x65\x65\x72\x73\x74"
2231 "\x54\x20\x6f\x6f\x4d\x20\x6e\x61"
2232 "\x20\x79\x65\x53\x72\x63\x74\x65"
2233 "\x20\x73\x6f\x54\x20\x6f\x61\x4d"
2234 "\x79\x6e\x53\x20\x63\x65\x65\x72"
2235 "\x73\x74\x54\x20\x6f\x6f\x4d\x20"
2236 "\x6e\x61\x20\x79\x65\x53\x72\x63"
2237 "\x74\x65\x20\x73\x6f\x54\x20\x6f"
2238 "\x61\x4d\x79\x6e\x53\x20\x63\x65"
2239 "\x65\x72\x73\x74\x54\x20\x6f\x6f"
2240 "\x4d\x20\x6e\x61\x20\x79\x65\x53"
2241 "\x72\x63\x74\x65\x20\x73\x6f\x54"
2242 "\x20\x6f\x61\x4d\x79\x6e\x53\x20"
2243 "\x63\x65\x65\x72\x73\x74\x54\x20"
2244 "\x6f\x6f\x4d\x20\x6e\x61\x0a\x79",
2245 .rlen = 128,
2246 },
2247};
2248
2249/*
2250 * Blowfish test vectors.
2251 */
2252#define BF_ENC_TEST_VECTORS 6
2253#define BF_DEC_TEST_VECTORS 6
2254#define BF_CBC_ENC_TEST_VECTORS 1
2255#define BF_CBC_DEC_TEST_VECTORS 1
2256
2257static struct cipher_testvec bf_enc_tv_template[] = {
2258 { /* DES test vectors from OpenSSL */
2259 .key = "\x00\x00\x00\x00\x00\x00\x00\x00",
2260 .klen = 8,
2261 .input = "\x00\x00\x00\x00\x00\x00\x00\x00",
2262 .ilen = 8,
2263 .result = "\x4e\xf9\x97\x45\x61\x98\xdd\x78",
2264 .rlen = 8,
2265 }, {
2266 .key = "\x1f\x1f\x1f\x1f\x0e\x0e\x0e\x0e",
2267 .klen = 8,
2268 .input = "\x01\x23\x45\x67\x89\xab\xcd\xef",
2269 .ilen = 8,
2270 .result = "\xa7\x90\x79\x51\x08\xea\x3c\xae",
2271 .rlen = 8,
2272 }, {
2273 .key = "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87",
2274 .klen = 8,
2275 .input = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
2276 .ilen = 8,
2277 .result = "\xe8\x7a\x24\x4e\x2c\xc8\x5e\x82",
2278 .rlen = 8,
2279 }, { /* Vary the keylength... */
2280 .key = "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87"
2281 "\x78\x69\x5a\x4b\x3c\x2d\x1e\x0f",
2282 .klen = 16,
2283 .input = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
2284 .ilen = 8,
2285 .result = "\x93\x14\x28\x87\xee\x3b\xe1\x5c",
2286 .rlen = 8,
2287 }, {
2288 .key = "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87"
2289 "\x78\x69\x5a\x4b\x3c\x2d\x1e\x0f"
2290 "\x00\x11\x22\x33\x44",
2291 .klen = 21,
2292 .input = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
2293 .ilen = 8,
2294 .result = "\xe6\xf5\x1e\xd7\x9b\x9d\xb2\x1f",
2295 .rlen = 8,
2296 }, { /* Generated with bf488 */
2297 .key = "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87"
2298 "\x78\x69\x5a\x4b\x3c\x2d\x1e\x0f"
2299 "\x00\x11\x22\x33\x44\x55\x66\x77"
2300 "\x04\x68\x91\x04\xc2\xfd\x3b\x2f"
2301 "\x58\x40\x23\x64\x1a\xba\x61\x76"
2302 "\x1f\x1f\x1f\x1f\x0e\x0e\x0e\x0e"
2303 "\xff\xff\xff\xff\xff\xff\xff\xff",
2304 .klen = 56,
2305 .input = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
2306 .ilen = 8,
2307 .result = "\xc0\x45\x04\x01\x2e\x4e\x1f\x53",
2308 .rlen = 8,
2309 },
2310};
2311
2312static struct cipher_testvec bf_dec_tv_template[] = {
2313 { /* DES test vectors from OpenSSL */
2314 .key = "\x00\x00\x00\x00\x00\x00\x00\x00",
2315 .klen = 8,
2316 .input = "\x4e\xf9\x97\x45\x61\x98\xdd\x78",
2317 .ilen = 8,
2318 .result = "\x00\x00\x00\x00\x00\x00\x00\x00",
2319 .rlen = 8,
2320 }, {
2321 .key = "\x1f\x1f\x1f\x1f\x0e\x0e\x0e\x0e",
2322 .klen = 8,
2323 .input = "\xa7\x90\x79\x51\x08\xea\x3c\xae",
2324 .ilen = 8,
2325 .result = "\x01\x23\x45\x67\x89\xab\xcd\xef",
2326 .rlen = 8,
2327 }, {
2328 .key = "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87",
2329 .klen = 8,
2330 .input = "\xe8\x7a\x24\x4e\x2c\xc8\x5e\x82",
2331 .ilen = 8,
2332 .result = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
2333 .rlen = 8,
2334 }, { /* Vary the keylength... */
2335 .key = "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87"
2336 "\x78\x69\x5a\x4b\x3c\x2d\x1e\x0f",
2337 .klen = 16,
2338 .input = "\x93\x14\x28\x87\xee\x3b\xe1\x5c",
2339 .ilen = 8,
2340 .result = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
2341 .rlen = 8,
2342 }, {
2343 .key = "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87"
2344 "\x78\x69\x5a\x4b\x3c\x2d\x1e\x0f"
2345 "\x00\x11\x22\x33\x44",
2346 .klen = 21,
2347 .input = "\xe6\xf5\x1e\xd7\x9b\x9d\xb2\x1f",
2348 .ilen = 8,
2349 .result = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
2350 .rlen = 8,
2351 }, { /* Generated with bf488, using OpenSSL, Libgcrypt and Nettle */
2352 .key = "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87"
2353 "\x78\x69\x5a\x4b\x3c\x2d\x1e\x0f"
2354 "\x00\x11\x22\x33\x44\x55\x66\x77"
2355 "\x04\x68\x91\x04\xc2\xfd\x3b\x2f"
2356 "\x58\x40\x23\x64\x1a\xba\x61\x76"
2357 "\x1f\x1f\x1f\x1f\x0e\x0e\x0e\x0e"
2358 "\xff\xff\xff\xff\xff\xff\xff\xff",
2359 .klen = 56,
2360 .input = "\xc0\x45\x04\x01\x2e\x4e\x1f\x53",
2361 .ilen = 8,
2362 .result = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
2363 .rlen = 8,
2364 },
2365};
2366
2367static struct cipher_testvec bf_cbc_enc_tv_template[] = {
2368 { /* From OpenSSL */
2369 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef"
2370 "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87",
2371 .klen = 16,
2372 .iv = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
2373 .input = "\x37\x36\x35\x34\x33\x32\x31\x20"
2374 "\x4e\x6f\x77\x20\x69\x73\x20\x74"
2375 "\x68\x65\x20\x74\x69\x6d\x65\x20"
2376 "\x66\x6f\x72\x20\x00\x00\x00\x00",
2377 .ilen = 32,
2378 .result = "\x6b\x77\xb4\xd6\x30\x06\xde\xe6"
2379 "\x05\xb1\x56\xe2\x74\x03\x97\x93"
2380 "\x58\xde\xb9\xe7\x15\x46\x16\xd9"
2381 "\x59\xf1\x65\x2b\xd5\xff\x92\xcc",
2382 .rlen = 32,
2383 },
2384};
2385
2386static struct cipher_testvec bf_cbc_dec_tv_template[] = {
2387 { /* From OpenSSL */
2388 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef"
2389 "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87",
2390 .klen = 16,
2391 .iv = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
2392 .input = "\x6b\x77\xb4\xd6\x30\x06\xde\xe6"
2393 "\x05\xb1\x56\xe2\x74\x03\x97\x93"
2394 "\x58\xde\xb9\xe7\x15\x46\x16\xd9"
2395 "\x59\xf1\x65\x2b\xd5\xff\x92\xcc",
2396 .ilen = 32,
2397 .result = "\x37\x36\x35\x34\x33\x32\x31\x20"
2398 "\x4e\x6f\x77\x20\x69\x73\x20\x74"
2399 "\x68\x65\x20\x74\x69\x6d\x65\x20"
2400 "\x66\x6f\x72\x20\x00\x00\x00\x00",
2401 .rlen = 32,
2402 },
2403};
2404
2405/*
2406 * Twofish test vectors.
2407 */
2408#define TF_ENC_TEST_VECTORS 3
2409#define TF_DEC_TEST_VECTORS 3
2410#define TF_CBC_ENC_TEST_VECTORS 4
2411#define TF_CBC_DEC_TEST_VECTORS 4
2412
2413static struct cipher_testvec tf_enc_tv_template[] = {
2414 {
2415 .key = zeroed_string,
2416 .klen = 16,
2417 .input = zeroed_string,
2418 .ilen = 16,
2419 .result = "\x9f\x58\x9f\x5c\xf6\x12\x2c\x32"
2420 "\xb6\xbf\xec\x2f\x2a\xe8\xc3\x5a",
2421 .rlen = 16,
2422 }, {
2423 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef"
2424 "\xfe\xdc\xba\x98\x76\x54\x32\x10"
2425 "\x00\x11\x22\x33\x44\x55\x66\x77",
2426 .klen = 24,
2427 .input = zeroed_string,
2428 .ilen = 16,
2429 .result = "\xcf\xd1\xd2\xe5\xa9\xbe\x9c\xdf"
2430 "\x50\x1f\x13\xb8\x92\xbd\x22\x48",
2431 .rlen = 16,
2432 }, {
2433 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef"
2434 "\xfe\xdc\xba\x98\x76\x54\x32\x10"
2435 "\x00\x11\x22\x33\x44\x55\x66\x77"
2436 "\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
2437 .klen = 32,
2438 .input = zeroed_string,
2439 .ilen = 16,
2440 .result = "\x37\x52\x7b\xe0\x05\x23\x34\xb8"
2441 "\x9f\x0c\xfc\xca\xe8\x7c\xfa\x20",
2442 .rlen = 16,
2443 },
2444};
2445
2446static struct cipher_testvec tf_dec_tv_template[] = {
2447 {
2448 .key = zeroed_string,
2449 .klen = 16,
2450 .input = "\x9f\x58\x9f\x5c\xf6\x12\x2c\x32"
2451 "\xb6\xbf\xec\x2f\x2a\xe8\xc3\x5a",
2452 .ilen = 16,
2453 .result = zeroed_string,
2454 .rlen = 16,
2455 }, {
2456 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef"
2457 "\xfe\xdc\xba\x98\x76\x54\x32\x10"
2458 "\x00\x11\x22\x33\x44\x55\x66\x77",
2459 .klen = 24,
2460 .input = "\xcf\xd1\xd2\xe5\xa9\xbe\x9c\xdf"
2461 "\x50\x1f\x13\xb8\x92\xbd\x22\x48",
2462 .ilen = 16,
2463 .result = zeroed_string,
2464 .rlen = 16,
2465 }, {
2466 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef"
2467 "\xfe\xdc\xba\x98\x76\x54\x32\x10"
2468 "\x00\x11\x22\x33\x44\x55\x66\x77"
2469 "\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
2470 .klen = 32,
2471 .input = "\x37\x52\x7b\xe0\x05\x23\x34\xb8"
2472 "\x9f\x0c\xfc\xca\xe8\x7c\xfa\x20",
2473 .ilen = 16,
2474 .result = zeroed_string,
2475 .rlen = 16,
2476 },
2477};
2478
2479static struct cipher_testvec tf_cbc_enc_tv_template[] = {
2480 { /* Generated with Nettle */
2481 .key = zeroed_string,
2482 .klen = 16,
2483 .iv = zeroed_string,
2484 .input = zeroed_string,
2485 .ilen = 16,
2486 .result = "\x9f\x58\x9f\x5c\xf6\x12\x2c\x32"
2487 "\xb6\xbf\xec\x2f\x2a\xe8\xc3\x5a",
2488 .rlen = 16,
2489 }, {
2490 .key = zeroed_string,
2491 .klen = 16,
2492 .iv = "\x9f\x58\x9f\x5c\xf6\x12\x2c\x32"
2493 "\xb6\xbf\xec\x2f\x2a\xe8\xc3\x5a",
2494 .input = zeroed_string,
2495 .ilen = 16,
2496 .result = "\xd4\x91\xdb\x16\xe7\xb1\xc3\x9e"
2497 "\x86\xcb\x08\x6b\x78\x9f\x54\x19",
2498 .rlen = 16,
2499 }, {
2500 .key = zeroed_string,
2501 .klen = 16,
2502 .iv = "\xd4\x91\xdb\x16\xe7\xb1\xc3\x9e"
2503 "\x86\xcb\x08\x6b\x78\x9f\x54\x19",
2504 .input = zeroed_string,
2505 .ilen = 16,
2506 .result = "\x05\xef\x8c\x61\xa8\x11\x58\x26"
2507 "\x34\xba\x5c\xb7\x10\x6a\xa6\x41",
2508 .rlen = 16,
2509 }, {
2510 .key = zeroed_string,
2511 .klen = 16,
2512 .iv = zeroed_string,
2513 .input = zeroed_string,
2514 .ilen = 48,
2515 .result = "\x9f\x58\x9f\x5c\xf6\x12\x2c\x32"
2516 "\xb6\xbf\xec\x2f\x2a\xe8\xc3\x5a"
2517 "\xd4\x91\xdb\x16\xe7\xb1\xc3\x9e"
2518 "\x86\xcb\x08\x6b\x78\x9f\x54\x19"
2519 "\x05\xef\x8c\x61\xa8\x11\x58\x26"
2520 "\x34\xba\x5c\xb7\x10\x6a\xa6\x41",
2521 .rlen = 48,
2522 },
2523};
2524
2525static struct cipher_testvec tf_cbc_dec_tv_template[] = {
2526 { /* Reverse of the first four above */
2527 .key = zeroed_string,
2528 .klen = 16,
2529 .iv = zeroed_string,
2530 .input = "\x9f\x58\x9f\x5c\xf6\x12\x2c\x32"
2531 "\xb6\xbf\xec\x2f\x2a\xe8\xc3\x5a",
2532 .ilen = 16,
2533 .result = zeroed_string,
2534 .rlen = 16,
2535 }, {
2536 .key = zeroed_string,
2537 .klen = 16,
2538 .iv = "\x9f\x58\x9f\x5c\xf6\x12\x2c\x32"
2539 "\xb6\xbf\xec\x2f\x2a\xe8\xc3\x5a",
2540 .input = "\xd4\x91\xdb\x16\xe7\xb1\xc3\x9e"
2541 "\x86\xcb\x08\x6b\x78\x9f\x54\x19",
2542 .ilen = 16,
2543 .result = zeroed_string,
2544 .rlen = 16,
2545 }, {
2546 .key = zeroed_string,
2547 .klen = 16,
2548 .iv = "\xd4\x91\xdb\x16\xe7\xb1\xc3\x9e"
2549 "\x86\xcb\x08\x6b\x78\x9f\x54\x19",
2550 .input = "\x05\xef\x8c\x61\xa8\x11\x58\x26"
2551 "\x34\xba\x5c\xb7\x10\x6a\xa6\x41",
2552 .ilen = 16,
2553 .result = zeroed_string,
2554 .rlen = 16,
2555 }, {
2556 .key = zeroed_string,
2557 .klen = 16,
2558 .iv = zeroed_string,
2559 .input = "\x9f\x58\x9f\x5c\xf6\x12\x2c\x32"
2560 "\xb6\xbf\xec\x2f\x2a\xe8\xc3\x5a"
2561 "\xd4\x91\xdb\x16\xe7\xb1\xc3\x9e"
2562 "\x86\xcb\x08\x6b\x78\x9f\x54\x19"
2563 "\x05\xef\x8c\x61\xa8\x11\x58\x26"
2564 "\x34\xba\x5c\xb7\x10\x6a\xa6\x41",
2565 .ilen = 48,
2566 .result = zeroed_string,
2567 .rlen = 48,
2568 },
2569};
2570
2571/*
2572 * Serpent test vectors. These are backwards because Serpent writes
2573 * octet sequences in right-to-left mode.
2574 */
2575#define SERPENT_ENC_TEST_VECTORS 4
2576#define SERPENT_DEC_TEST_VECTORS 4
2577
2578#define TNEPRES_ENC_TEST_VECTORS 4
2579#define TNEPRES_DEC_TEST_VECTORS 4
2580
2581static struct cipher_testvec serpent_enc_tv_template[] = {
2582 {
2583 .input = "\x00\x01\x02\x03\x04\x05\x06\x07"
2584 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
2585 .ilen = 16,
2586 .result = "\x12\x07\xfc\xce\x9b\xd0\xd6\x47"
2587 "\x6a\xe9\x8f\xbe\xd1\x43\xa0\xe2",
2588 .rlen = 16,
2589 }, {
2590 .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
2591 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
2592 .klen = 16,
2593 .input = "\x00\x01\x02\x03\x04\x05\x06\x07"
2594 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
2595 .ilen = 16,
2596 .result = "\x4c\x7d\x8a\x32\x80\x72\xa2\x2c"
2597 "\x82\x3e\x4a\x1f\x3a\xcd\xa1\x6d",
2598 .rlen = 16,
2599 }, {
2600 .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
2601 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
2602 "\x10\x11\x12\x13\x14\x15\x16\x17"
2603 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
2604 .klen = 32,
2605 .input = "\x00\x01\x02\x03\x04\x05\x06\x07"
2606 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
2607 .ilen = 16,
2608 .result = "\xde\x26\x9f\xf8\x33\xe4\x32\xb8"
2609 "\x5b\x2e\x88\xd2\x70\x1c\xe7\x5c",
2610 .rlen = 16,
2611 }, {
2612 .key = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80",
2613 .klen = 16,
2614 .input = zeroed_string,
2615 .ilen = 16,
2616 .result = "\xdd\xd2\x6b\x98\xa5\xff\xd8\x2c"
2617 "\x05\x34\x5a\x9d\xad\xbf\xaf\x49",
2618 .rlen = 16,
2619 },
2620};
2621
2622static struct cipher_testvec tnepres_enc_tv_template[] = {
2623 { /* KeySize=128, PT=0, I=1 */
2624 .input = "\x00\x00\x00\x00\x00\x00\x00\x00"
2625 "\x00\x00\x00\x00\x00\x00\x00\x00",
2626 .key = "\x80\x00\x00\x00\x00\x00\x00\x00"
2627 "\x00\x00\x00\x00\x00\x00\x00\x00",
2628 .klen = 16,
2629 .ilen = 16,
2630 .result = "\x49\xaf\xbf\xad\x9d\x5a\x34\x05"
2631 "\x2c\xd8\xff\xa5\x98\x6b\xd2\xdd",
2632 .rlen = 16,
2633 }, { /* KeySize=192, PT=0, I=1 */
2634 .key = "\x80\x00\x00\x00\x00\x00\x00\x00"
2635 "\x00\x00\x00\x00\x00\x00\x00\x00"
2636 "\x00\x00\x00\x00\x00\x00\x00\x00",
2637 .klen = 24,
2638 .input = "\x00\x00\x00\x00\x00\x00\x00\x00"
2639 "\x00\x00\x00\x00\x00\x00\x00\x00",
2640 .ilen = 16,
2641 .result = "\xe7\x8e\x54\x02\xc7\x19\x55\x68"
2642 "\xac\x36\x78\xf7\xa3\xf6\x0c\x66",
2643 .rlen = 16,
2644 }, { /* KeySize=256, PT=0, I=1 */
2645 .key = "\x80\x00\x00\x00\x00\x00\x00\x00"
2646 "\x00\x00\x00\x00\x00\x00\x00\x00"
2647 "\x00\x00\x00\x00\x00\x00\x00\x00"
2648 "\x00\x00\x00\x00\x00\x00\x00\x00",
2649 .klen = 32,
2650 .input = "\x00\x00\x00\x00\x00\x00\x00\x00"
2651 "\x00\x00\x00\x00\x00\x00\x00\x00",
2652 .ilen = 16,
2653 .result = "\xab\xed\x96\xe7\x66\xbf\x28\xcb"
2654 "\xc0\xeb\xd2\x1a\x82\xef\x08\x19",
2655 .rlen = 16,
2656 }, { /* KeySize=256, I=257 */
2657 .key = "\x1f\x1e\x1d\x1c\x1b\x1a\x19\x18"
2658 "\x17\x16\x15\x14\x13\x12\x11\x10"
2659 "\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08"
2660 "\x07\x06\x05\x04\x03\x02\x01\x00",
2661 .klen = 32,
2662 .input = "\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08"
2663 "\x07\x06\x05\x04\x03\x02\x01\x00",
2664 .ilen = 16,
2665 .result = "\x5c\xe7\x1c\x70\xd2\x88\x2e\x5b"
2666 "\xb8\x32\xe4\x33\xf8\x9f\x26\xde",
2667 .rlen = 16,
2668 },
2669};
2670
2671
2672static struct cipher_testvec serpent_dec_tv_template[] = {
2673 {
2674 .input = "\x12\x07\xfc\xce\x9b\xd0\xd6\x47"
2675 "\x6a\xe9\x8f\xbe\xd1\x43\xa0\xe2",
2676 .ilen = 16,
2677 .result = "\x00\x01\x02\x03\x04\x05\x06\x07"
2678 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
2679 .rlen = 16,
2680 }, {
2681 .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
2682 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
2683 .klen = 16,
2684 .input = "\x4c\x7d\x8a\x32\x80\x72\xa2\x2c"
2685 "\x82\x3e\x4a\x1f\x3a\xcd\xa1\x6d",
2686 .ilen = 16,
2687 .result = "\x00\x01\x02\x03\x04\x05\x06\x07"
2688 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
2689 .rlen = 16,
2690 }, {
2691 .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
2692 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
2693 "\x10\x11\x12\x13\x14\x15\x16\x17"
2694 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
2695 .klen = 32,
2696 .input = "\xde\x26\x9f\xf8\x33\xe4\x32\xb8"
2697 "\x5b\x2e\x88\xd2\x70\x1c\xe7\x5c",
2698 .ilen = 16,
2699 .result = "\x00\x01\x02\x03\x04\x05\x06\x07"
2700 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
2701 .rlen = 16,
2702 }, {
2703 .key = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80",
2704 .klen = 16,
2705 .input = "\xdd\xd2\x6b\x98\xa5\xff\xd8\x2c"
2706 "\x05\x34\x5a\x9d\xad\xbf\xaf\x49",
2707 .ilen = 16,
2708 .result = zeroed_string,
2709 .rlen = 16,
2710 },
2711};
2712
2713static struct cipher_testvec tnepres_dec_tv_template[] = {
2714 {
2715 .input = "\x41\xcc\x6b\x31\x59\x31\x45\x97"
2716 "\x6d\x6f\xbb\x38\x4b\x37\x21\x28",
2717 .ilen = 16,
2718 .result = "\x00\x01\x02\x03\x04\x05\x06\x07"
2719 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
2720 .rlen = 16,
2721 }, {
2722 .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
2723 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
2724 .klen = 16,
2725 .input = "\xea\xf4\xd7\xfc\xd8\x01\x34\x47"
2726 "\x81\x45\x0b\xfa\x0c\xd6\xad\x6e",
2727 .ilen = 16,
2728 .result = "\x00\x01\x02\x03\x04\x05\x06\x07"
2729 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
2730 .rlen = 16,
2731 }, {
2732 .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
2733 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
2734 "\x10\x11\x12\x13\x14\x15\x16\x17"
2735 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
2736 .klen = 32,
2737 .input = "\x64\xa9\x1a\x37\xed\x9f\xe7\x49"
2738 "\xa8\x4e\x76\xd6\xf5\x0d\x78\xee",
2739 .ilen = 16,
2740 .result = "\x00\x01\x02\x03\x04\x05\x06\x07"
2741 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
2742 .rlen = 16,
2743 }, { /* KeySize=128, I=121 */
2744 .key = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80",
2745 .klen = 16,
2746 .input = "\x3d\xda\xbf\xc0\x06\xda\xab\x06"
2747 "\x46\x2a\xf4\xef\x81\x54\x4e\x26",
2748 .ilen = 16,
2749 .result = zeroed_string,
2750 .rlen = 16,
2751 },
2752};
2753
2754
2755/* Cast6 test vectors from RFC 2612 */
2756#define CAST6_ENC_TEST_VECTORS 3
2757#define CAST6_DEC_TEST_VECTORS 3
2758
2759static struct cipher_testvec cast6_enc_tv_template[] = {
2760 {
2761 .key = "\x23\x42\xbb\x9e\xfa\x38\x54\x2c"
2762 "\x0a\xf7\x56\x47\xf2\x9f\x61\x5d",
2763 .klen = 16,
2764 .input = zeroed_string,
2765 .ilen = 16,
2766 .result = "\xc8\x42\xa0\x89\x72\xb4\x3d\x20"
2767 "\x83\x6c\x91\xd1\xb7\x53\x0f\x6b",
2768 .rlen = 16,
2769 }, {
2770 .key = "\x23\x42\xbb\x9e\xfa\x38\x54\x2c"
2771 "\xbe\xd0\xac\x83\x94\x0a\xc2\x98"
2772 "\xba\xc7\x7a\x77\x17\x94\x28\x63",
2773 .klen = 24,
2774 .input = zeroed_string,
2775 .ilen = 16,
2776 .result = "\x1b\x38\x6c\x02\x10\xdc\xad\xcb"
2777 "\xdd\x0e\x41\xaa\x08\xa7\xa7\xe8",
2778 .rlen = 16,
2779 }, {
2780 .key = "\x23\x42\xbb\x9e\xfa\x38\x54\x2c"
2781 "\xbe\xd0\xac\x83\x94\x0a\xc2\x98"
2782 "\x8d\x7c\x47\xce\x26\x49\x08\x46"
2783 "\x1c\xc1\xb5\x13\x7a\xe6\xb6\x04",
2784 .klen = 32,
2785 .input = zeroed_string,
2786 .ilen = 16,
2787 .result = "\x4f\x6a\x20\x38\x28\x68\x97\xb9"
2788 "\xc9\x87\x01\x36\x55\x33\x17\xfa",
2789 .rlen = 16,
2790 },
2791};
2792
2793static struct cipher_testvec cast6_dec_tv_template[] = {
2794 {
2795 .key = "\x23\x42\xbb\x9e\xfa\x38\x54\x2c"
2796 "\x0a\xf7\x56\x47\xf2\x9f\x61\x5d",
2797 .klen = 16,
2798 .input = "\xc8\x42\xa0\x89\x72\xb4\x3d\x20"
2799 "\x83\x6c\x91\xd1\xb7\x53\x0f\x6b",
2800 .ilen = 16,
2801 .result = zeroed_string,
2802 .rlen = 16,
2803 }, {
2804 .key = "\x23\x42\xbb\x9e\xfa\x38\x54\x2c"
2805 "\xbe\xd0\xac\x83\x94\x0a\xc2\x98"
2806 "\xba\xc7\x7a\x77\x17\x94\x28\x63",
2807 .klen = 24,
2808 .input = "\x1b\x38\x6c\x02\x10\xdc\xad\xcb"
2809 "\xdd\x0e\x41\xaa\x08\xa7\xa7\xe8",
2810 .ilen = 16,
2811 .result = zeroed_string,
2812 .rlen = 16,
2813 }, {
2814 .key = "\x23\x42\xbb\x9e\xfa\x38\x54\x2c"
2815 "\xbe\xd0\xac\x83\x94\x0a\xc2\x98"
2816 "\x8d\x7c\x47\xce\x26\x49\x08\x46"
2817 "\x1c\xc1\xb5\x13\x7a\xe6\xb6\x04",
2818 .klen = 32,
2819 .input = "\x4f\x6a\x20\x38\x28\x68\x97\xb9"
2820 "\xc9\x87\x01\x36\x55\x33\x17\xfa",
2821 .ilen = 16,
2822 .result = zeroed_string,
2823 .rlen = 16,
2824 },
2825};
2826
2827
2828/*
2829 * AES test vectors.
2830 */
2831#define AES_ENC_TEST_VECTORS 3
2832#define AES_DEC_TEST_VECTORS 3
2833#define AES_CBC_ENC_TEST_VECTORS 4
2834#define AES_CBC_DEC_TEST_VECTORS 4
2835#define AES_LRW_ENC_TEST_VECTORS 8
2836#define AES_LRW_DEC_TEST_VECTORS 8
2837#define AES_XTS_ENC_TEST_VECTORS 4
2838#define AES_XTS_DEC_TEST_VECTORS 4
2839#define AES_CTR_ENC_TEST_VECTORS 7
2840#define AES_CTR_DEC_TEST_VECTORS 6
2841#define AES_GCM_ENC_TEST_VECTORS 9
2842#define AES_GCM_DEC_TEST_VECTORS 8
2843#define AES_CCM_ENC_TEST_VECTORS 7
2844#define AES_CCM_DEC_TEST_VECTORS 7
2845
2846static struct cipher_testvec aes_enc_tv_template[] = {
2847 { /* From FIPS-197 */
2848 .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
2849 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
2850 .klen = 16,
2851 .input = "\x00\x11\x22\x33\x44\x55\x66\x77"
2852 "\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
2853 .ilen = 16,
2854 .result = "\x69\xc4\xe0\xd8\x6a\x7b\x04\x30"
2855 "\xd8\xcd\xb7\x80\x70\xb4\xc5\x5a",
2856 .rlen = 16,
2857 }, {
2858 .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
2859 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
2860 "\x10\x11\x12\x13\x14\x15\x16\x17",
2861 .klen = 24,
2862 .input = "\x00\x11\x22\x33\x44\x55\x66\x77"
2863 "\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
2864 .ilen = 16,
2865 .result = "\xdd\xa9\x7c\xa4\x86\x4c\xdf\xe0"
2866 "\x6e\xaf\x70\xa0\xec\x0d\x71\x91",
2867 .rlen = 16,
2868 }, {
2869 .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
2870 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
2871 "\x10\x11\x12\x13\x14\x15\x16\x17"
2872 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
2873 .klen = 32,
2874 .input = "\x00\x11\x22\x33\x44\x55\x66\x77"
2875 "\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
2876 .ilen = 16,
2877 .result = "\x8e\xa2\xb7\xca\x51\x67\x45\xbf"
2878 "\xea\xfc\x49\x90\x4b\x49\x60\x89",
2879 .rlen = 16,
2880 },
2881};
2882
2883static struct cipher_testvec aes_dec_tv_template[] = {
2884 { /* From FIPS-197 */
2885 .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
2886 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
2887 .klen = 16,
2888 .input = "\x69\xc4\xe0\xd8\x6a\x7b\x04\x30"
2889 "\xd8\xcd\xb7\x80\x70\xb4\xc5\x5a",
2890 .ilen = 16,
2891 .result = "\x00\x11\x22\x33\x44\x55\x66\x77"
2892 "\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
2893 .rlen = 16,
2894 }, {
2895 .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
2896 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
2897 "\x10\x11\x12\x13\x14\x15\x16\x17",
2898 .klen = 24,
2899 .input = "\xdd\xa9\x7c\xa4\x86\x4c\xdf\xe0"
2900 "\x6e\xaf\x70\xa0\xec\x0d\x71\x91",
2901 .ilen = 16,
2902 .result = "\x00\x11\x22\x33\x44\x55\x66\x77"
2903 "\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
2904 .rlen = 16,
2905 }, {
2906 .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
2907 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
2908 "\x10\x11\x12\x13\x14\x15\x16\x17"
2909 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
2910 .klen = 32,
2911 .input = "\x8e\xa2\xb7\xca\x51\x67\x45\xbf"
2912 "\xea\xfc\x49\x90\x4b\x49\x60\x89",
2913 .ilen = 16,
2914 .result = "\x00\x11\x22\x33\x44\x55\x66\x77"
2915 "\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
2916 .rlen = 16,
2917 },
2918};
2919
2920static struct cipher_testvec aes_cbc_enc_tv_template[] = {
2921 { /* From RFC 3602 */
2922 .key = "\x06\xa9\x21\x40\x36\xb8\xa1\x5b"
2923 "\x51\x2e\x03\xd5\x34\x12\x00\x06",
2924 .klen = 16,
2925 .iv = "\x3d\xaf\xba\x42\x9d\x9e\xb4\x30"
2926 "\xb4\x22\xda\x80\x2c\x9f\xac\x41",
2927 .input = "Single block msg",
2928 .ilen = 16,
2929 .result = "\xe3\x53\x77\x9c\x10\x79\xae\xb8"
2930 "\x27\x08\x94\x2d\xbe\x77\x18\x1a",
2931 .rlen = 16,
2932 }, {
2933 .key = "\xc2\x86\x69\x6d\x88\x7c\x9a\xa0"
2934 "\x61\x1b\xbb\x3e\x20\x25\xa4\x5a",
2935 .klen = 16,
2936 .iv = "\x56\x2e\x17\x99\x6d\x09\x3d\x28"
2937 "\xdd\xb3\xba\x69\x5a\x2e\x6f\x58",
2938 .input = "\x00\x01\x02\x03\x04\x05\x06\x07"
2939 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
2940 "\x10\x11\x12\x13\x14\x15\x16\x17"
2941 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
2942 .ilen = 32,
2943 .result = "\xd2\x96\xcd\x94\xc2\xcc\xcf\x8a"
2944 "\x3a\x86\x30\x28\xb5\xe1\xdc\x0a"
2945 "\x75\x86\x60\x2d\x25\x3c\xff\xf9"
2946 "\x1b\x82\x66\xbe\xa6\xd6\x1a\xb1",
2947 .rlen = 32,
2948 }, { /* From NIST SP800-38A */
2949 .key = "\x8e\x73\xb0\xf7\xda\x0e\x64\x52"
2950 "\xc8\x10\xf3\x2b\x80\x90\x79\xe5"
2951 "\x62\xf8\xea\xd2\x52\x2c\x6b\x7b",
2952 .klen = 24,
2953 .iv = "\x00\x01\x02\x03\x04\x05\x06\x07"
2954 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
2955 .input = "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96"
2956 "\xe9\x3d\x7e\x11\x73\x93\x17\x2a"
2957 "\xae\x2d\x8a\x57\x1e\x03\xac\x9c"
2958 "\x9e\xb7\x6f\xac\x45\xaf\x8e\x51"
2959 "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11"
2960 "\xe5\xfb\xc1\x19\x1a\x0a\x52\xef"
2961 "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17"
2962 "\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
2963 .ilen = 64,
2964 .result = "\x4f\x02\x1d\xb2\x43\xbc\x63\x3d"
2965 "\x71\x78\x18\x3a\x9f\xa0\x71\xe8"
2966 "\xb4\xd9\xad\xa9\xad\x7d\xed\xf4"
2967 "\xe5\xe7\x38\x76\x3f\x69\x14\x5a"
2968 "\x57\x1b\x24\x20\x12\xfb\x7a\xe0"
2969 "\x7f\xa9\xba\xac\x3d\xf1\x02\xe0"
2970 "\x08\xb0\xe2\x79\x88\x59\x88\x81"
2971 "\xd9\x20\xa9\xe6\x4f\x56\x15\xcd",
2972 .rlen = 64,
2973 }, {
2974 .key = "\x60\x3d\xeb\x10\x15\xca\x71\xbe"
2975 "\x2b\x73\xae\xf0\x85\x7d\x77\x81"
2976 "\x1f\x35\x2c\x07\x3b\x61\x08\xd7"
2977 "\x2d\x98\x10\xa3\x09\x14\xdf\xf4",
2978 .klen = 32,
2979 .iv = "\x00\x01\x02\x03\x04\x05\x06\x07"
2980 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
2981 .input = "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96"
2982 "\xe9\x3d\x7e\x11\x73\x93\x17\x2a"
2983 "\xae\x2d\x8a\x57\x1e\x03\xac\x9c"
2984 "\x9e\xb7\x6f\xac\x45\xaf\x8e\x51"
2985 "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11"
2986 "\xe5\xfb\xc1\x19\x1a\x0a\x52\xef"
2987 "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17"
2988 "\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
2989 .ilen = 64,
2990 .result = "\xf5\x8c\x4c\x04\xd6\xe5\xf1\xba"
2991 "\x77\x9e\xab\xfb\x5f\x7b\xfb\xd6"
2992 "\x9c\xfc\x4e\x96\x7e\xdb\x80\x8d"
2993 "\x67\x9f\x77\x7b\xc6\x70\x2c\x7d"
2994 "\x39\xf2\x33\x69\xa9\xd9\xba\xcf"
2995 "\xa5\x30\xe2\x63\x04\x23\x14\x61"
2996 "\xb2\xeb\x05\xe2\xc3\x9b\xe9\xfc"
2997 "\xda\x6c\x19\x07\x8c\x6a\x9d\x1b",
2998 .rlen = 64,
2999 },
3000};
3001
3002static struct cipher_testvec aes_cbc_dec_tv_template[] = {
3003 { /* From RFC 3602 */
3004 .key = "\x06\xa9\x21\x40\x36\xb8\xa1\x5b"
3005 "\x51\x2e\x03\xd5\x34\x12\x00\x06",
3006 .klen = 16,
3007 .iv = "\x3d\xaf\xba\x42\x9d\x9e\xb4\x30"
3008 "\xb4\x22\xda\x80\x2c\x9f\xac\x41",
3009 .input = "\xe3\x53\x77\x9c\x10\x79\xae\xb8"
3010 "\x27\x08\x94\x2d\xbe\x77\x18\x1a",
3011 .ilen = 16,
3012 .result = "Single block msg",
3013 .rlen = 16,
3014 }, {
3015 .key = "\xc2\x86\x69\x6d\x88\x7c\x9a\xa0"
3016 "\x61\x1b\xbb\x3e\x20\x25\xa4\x5a",
3017 .klen = 16,
3018 .iv = "\x56\x2e\x17\x99\x6d\x09\x3d\x28"
3019 "\xdd\xb3\xba\x69\x5a\x2e\x6f\x58",
3020 .input = "\xd2\x96\xcd\x94\xc2\xcc\xcf\x8a"
3021 "\x3a\x86\x30\x28\xb5\xe1\xdc\x0a"
3022 "\x75\x86\x60\x2d\x25\x3c\xff\xf9"
3023 "\x1b\x82\x66\xbe\xa6\xd6\x1a\xb1",
3024 .ilen = 32,
3025 .result = "\x00\x01\x02\x03\x04\x05\x06\x07"
3026 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
3027 "\x10\x11\x12\x13\x14\x15\x16\x17"
3028 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
3029 .rlen = 32,
3030 }, { /* From NIST SP800-38A */
3031 .key = "\x8e\x73\xb0\xf7\xda\x0e\x64\x52"
3032 "\xc8\x10\xf3\x2b\x80\x90\x79\xe5"
3033 "\x62\xf8\xea\xd2\x52\x2c\x6b\x7b",
3034 .klen = 24,
3035 .iv = "\x00\x01\x02\x03\x04\x05\x06\x07"
3036 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
3037 .input = "\x4f\x02\x1d\xb2\x43\xbc\x63\x3d"
3038 "\x71\x78\x18\x3a\x9f\xa0\x71\xe8"
3039 "\xb4\xd9\xad\xa9\xad\x7d\xed\xf4"
3040 "\xe5\xe7\x38\x76\x3f\x69\x14\x5a"
3041 "\x57\x1b\x24\x20\x12\xfb\x7a\xe0"
3042 "\x7f\xa9\xba\xac\x3d\xf1\x02\xe0"
3043 "\x08\xb0\xe2\x79\x88\x59\x88\x81"
3044 "\xd9\x20\xa9\xe6\x4f\x56\x15\xcd",
3045 .ilen = 64,
3046 .result = "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96"
3047 "\xe9\x3d\x7e\x11\x73\x93\x17\x2a"
3048 "\xae\x2d\x8a\x57\x1e\x03\xac\x9c"
3049 "\x9e\xb7\x6f\xac\x45\xaf\x8e\x51"
3050 "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11"
3051 "\xe5\xfb\xc1\x19\x1a\x0a\x52\xef"
3052 "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17"
3053 "\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
3054 .rlen = 64,
3055 }, {
3056 .key = "\x60\x3d\xeb\x10\x15\xca\x71\xbe"
3057 "\x2b\x73\xae\xf0\x85\x7d\x77\x81"
3058 "\x1f\x35\x2c\x07\x3b\x61\x08\xd7"
3059 "\x2d\x98\x10\xa3\x09\x14\xdf\xf4",
3060 .klen = 32,
3061 .iv = "\x00\x01\x02\x03\x04\x05\x06\x07"
3062 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
3063 .input = "\xf5\x8c\x4c\x04\xd6\xe5\xf1\xba"
3064 "\x77\x9e\xab\xfb\x5f\x7b\xfb\xd6"
3065 "\x9c\xfc\x4e\x96\x7e\xdb\x80\x8d"
3066 "\x67\x9f\x77\x7b\xc6\x70\x2c\x7d"
3067 "\x39\xf2\x33\x69\xa9\xd9\xba\xcf"
3068 "\xa5\x30\xe2\x63\x04\x23\x14\x61"
3069 "\xb2\xeb\x05\xe2\xc3\x9b\xe9\xfc"
3070 "\xda\x6c\x19\x07\x8c\x6a\x9d\x1b",
3071 .ilen = 64,
3072 .result = "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96"
3073 "\xe9\x3d\x7e\x11\x73\x93\x17\x2a"
3074 "\xae\x2d\x8a\x57\x1e\x03\xac\x9c"
3075 "\x9e\xb7\x6f\xac\x45\xaf\x8e\x51"
3076 "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11"
3077 "\xe5\xfb\xc1\x19\x1a\x0a\x52\xef"
3078 "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17"
3079 "\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
3080 .rlen = 64,
3081 },
3082};
3083
3084static struct cipher_testvec aes_lrw_enc_tv_template[] = {
3085 /* from http://grouper.ieee.org/groups/1619/email/pdf00017.pdf */
3086 { /* LRW-32-AES 1 */
3087 .key = "\x45\x62\xac\x25\xf8\x28\x17\x6d"
3088 "\x4c\x26\x84\x14\xb5\x68\x01\x85"
3089 "\x25\x8e\x2a\x05\xe7\x3e\x9d\x03"
3090 "\xee\x5a\x83\x0c\xcc\x09\x4c\x87",
3091 .klen = 32,
3092 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
3093 "\x00\x00\x00\x00\x00\x00\x00\x01",
3094 .input = "\x30\x31\x32\x33\x34\x35\x36\x37"
3095 "\x38\x39\x41\x42\x43\x44\x45\x46",
3096 .ilen = 16,
3097 .result = "\xf1\xb2\x73\xcd\x65\xa3\xdf\x5f"
3098 "\xe9\x5d\x48\x92\x54\x63\x4e\xb8",
3099 .rlen = 16,
3100 }, { /* LRW-32-AES 2 */
3101 .key = "\x59\x70\x47\x14\xf5\x57\x47\x8c"
3102 "\xd7\x79\xe8\x0f\x54\x88\x79\x44"
3103 "\x0d\x48\xf0\xb7\xb1\x5a\x53\xea"
3104 "\x1c\xaa\x6b\x29\xc2\xca\xfb\xaf",
3105 .klen = 32,
3106 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
3107 "\x00\x00\x00\x00\x00\x00\x00\x02",
3108 .input = "\x30\x31\x32\x33\x34\x35\x36\x37"
3109 "\x38\x39\x41\x42\x43\x44\x45\x46",
3110 .ilen = 16,
3111 .result = "\x00\xc8\x2b\xae\x95\xbb\xcd\xe5"
3112 "\x27\x4f\x07\x69\xb2\x60\xe1\x36",
3113 .rlen = 16,
3114 }, { /* LRW-32-AES 3 */
3115 .key = "\xd8\x2a\x91\x34\xb2\x6a\x56\x50"
3116 "\x30\xfe\x69\xe2\x37\x7f\x98\x47"
3117 "\xcd\xf9\x0b\x16\x0c\x64\x8f\xb6"
3118 "\xb0\x0d\x0d\x1b\xae\x85\x87\x1f",
3119 .klen = 32,
3120 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
3121 "\x00\x00\x00\x02\x00\x00\x00\x00",
3122 .input = "\x30\x31\x32\x33\x34\x35\x36\x37"
3123 "\x38\x39\x41\x42\x43\x44\x45\x46",
3124 .ilen = 16,
3125 .result = "\x76\x32\x21\x83\xed\x8f\xf1\x82"
3126 "\xf9\x59\x62\x03\x69\x0e\x5e\x01",
3127 .rlen = 16,
3128 }, { /* LRW-32-AES 4 */
3129 .key = "\x0f\x6a\xef\xf8\xd3\xd2\xbb\x15"
3130 "\x25\x83\xf7\x3c\x1f\x01\x28\x74"
3131 "\xca\xc6\xbc\x35\x4d\x4a\x65\x54"
3132 "\x90\xae\x61\xcf\x7b\xae\xbd\xcc"
3133 "\xad\xe4\x94\xc5\x4a\x29\xae\x70",
3134 .klen = 40,
3135 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
3136 "\x00\x00\x00\x00\x00\x00\x00\x01",
3137 .input = "\x30\x31\x32\x33\x34\x35\x36\x37"
3138 "\x38\x39\x41\x42\x43\x44\x45\x46",
3139 .ilen = 16,
3140 .result = "\x9c\x0f\x15\x2f\x55\xa2\xd8\xf0"
3141 "\xd6\x7b\x8f\x9e\x28\x22\xbc\x41",
3142 .rlen = 16,
3143 }, { /* LRW-32-AES 5 */
3144 .key = "\x8a\xd4\xee\x10\x2f\xbd\x81\xff"
3145 "\xf8\x86\xce\xac\x93\xc5\xad\xc6"
3146 "\xa0\x19\x07\xc0\x9d\xf7\xbb\xdd"
3147 "\x52\x13\xb2\xb7\xf0\xff\x11\xd8"
3148 "\xd6\x08\xd0\xcd\x2e\xb1\x17\x6f",
3149 .klen = 40,
3150 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
3151 "\x00\x00\x00\x02\x00\x00\x00\x00",
3152 .input = "\x30\x31\x32\x33\x34\x35\x36\x37"
3153 "\x38\x39\x41\x42\x43\x44\x45\x46",
3154 .ilen = 16,
3155 .result = "\xd4\x27\x6a\x7f\x14\x91\x3d\x65"
3156 "\xc8\x60\x48\x02\x87\xe3\x34\x06",
3157 .rlen = 16,
3158 }, { /* LRW-32-AES 6 */
3159 .key = "\xf8\xd4\x76\xff\xd6\x46\xee\x6c"
3160 "\x23\x84\xcb\x1c\x77\xd6\x19\x5d"
3161 "\xfe\xf1\xa9\xf3\x7b\xbc\x8d\x21"
3162 "\xa7\x9c\x21\xf8\xcb\x90\x02\x89"
3163 "\xa8\x45\x34\x8e\xc8\xc5\xb5\xf1"
3164 "\x26\xf5\x0e\x76\xfe\xfd\x1b\x1e",
3165 .klen = 48,
3166 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
3167 "\x00\x00\x00\x00\x00\x00\x00\x01",
3168 .input = "\x30\x31\x32\x33\x34\x35\x36\x37"
3169 "\x38\x39\x41\x42\x43\x44\x45\x46",
3170 .ilen = 16,
3171 .result = "\xbd\x06\xb8\xe1\xdb\x98\x89\x9e"
3172 "\xc4\x98\xe4\x91\xcf\x1c\x70\x2b",
3173 .rlen = 16,
3174 }, { /* LRW-32-AES 7 */
3175 .key = "\xfb\x76\x15\xb2\x3d\x80\x89\x1d"
3176 "\xd4\x70\x98\x0b\xc7\x95\x84\xc8"
3177 "\xb2\xfb\x64\xce\x60\x97\x87\x8d"
3178 "\x17\xfc\xe4\x5a\x49\xe8\x30\xb7"
3179 "\x6e\x78\x17\xe7\x2d\x5e\x12\xd4"
3180 "\x60\x64\x04\x7a\xf1\x2f\x9e\x0c",
3181 .klen = 48,
3182 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
3183 "\x00\x00\x00\x02\x00\x00\x00\x00",
3184 .input = "\x30\x31\x32\x33\x34\x35\x36\x37"
3185 "\x38\x39\x41\x42\x43\x44\x45\x46",
3186 .ilen = 16,
3187 .result = "\x5b\x90\x8e\xc1\xab\xdd\x67\x5f"
3188 "\x3d\x69\x8a\x95\x53\xc8\x9c\xe5",
3189 .rlen = 16,
3190 }, {
3191/* http://www.mail-archive.com/stds-p1619@listserv.ieee.org/msg00173.html */
3192 .key = "\xf8\xd4\x76\xff\xd6\x46\xee\x6c"
3193 "\x23\x84\xcb\x1c\x77\xd6\x19\x5d"
3194 "\xfe\xf1\xa9\xf3\x7b\xbc\x8d\x21"
3195 "\xa7\x9c\x21\xf8\xcb\x90\x02\x89"
3196 "\xa8\x45\x34\x8e\xc8\xc5\xb5\xf1"
3197 "\x26\xf5\x0e\x76\xfe\xfd\x1b\x1e",
3198 .klen = 48,
3199 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
3200 "\x00\x00\x00\x00\x00\x00\x00\x01",
3201 .input = "\x05\x11\xb7\x18\xab\xc6\x2d\xac"
3202 "\x70\x5d\xf6\x22\x94\xcd\xe5\x6c"
3203 "\x17\x6b\xf6\x1c\xf0\xf3\x6e\xf8"
3204 "\x50\x38\x1f\x71\x49\xb6\x57\xd6"
3205 "\x8f\xcb\x8d\x6b\xe3\xa6\x29\x90"
3206 "\xfe\x2a\x62\x82\xae\x6d\x8b\xf6"
3207 "\xad\x1e\x9e\x20\x5f\x38\xbe\x04"
3208 "\xda\x10\x8e\xed\xa2\xa4\x87\xab"
3209 "\xda\x6b\xb4\x0c\x75\xba\xd3\x7c"
3210 "\xc9\xac\x42\x31\x95\x7c\xc9\x04"
3211 "\xeb\xd5\x6e\x32\x69\x8a\xdb\xa6"
3212 "\x15\xd7\x3f\x4f\x2f\x66\x69\x03"
3213 "\x9c\x1f\x54\x0f\xde\x1f\xf3\x65"
3214 "\x4c\x96\x12\xed\x7c\x92\x03\x01"
3215 "\x6f\xbc\x35\x93\xac\xf1\x27\xf1"
3216 "\xb4\x96\x82\x5a\x5f\xb0\xa0\x50"
3217 "\x89\xa4\x8e\x66\x44\x85\xcc\xfd"
3218 "\x33\x14\x70\xe3\x96\xb2\xc3\xd3"
3219 "\xbb\x54\x5a\x1a\xf9\x74\xa2\xc5"
3220 "\x2d\x64\x75\xdd\xb4\x54\xe6\x74"
3221 "\x8c\xd3\x9d\x9e\x86\xab\x51\x53"
3222 "\xb7\x93\x3e\x6f\xd0\x4e\x2c\x40"
3223 "\xf6\xa8\x2e\x3e\x9d\xf4\x66\xa5"
3224 "\x76\x12\x73\x44\x1a\x56\xd7\x72"
3225 "\x88\xcd\x21\x8c\x4c\x0f\xfe\xda"
3226 "\x95\xe0\x3a\xa6\xa5\x84\x46\xcd"
3227 "\xd5\x3e\x9d\x3a\xe2\x67\xe6\x60"
3228 "\x1a\xe2\x70\x85\x58\xc2\x1b\x09"
3229 "\xe1\xd7\x2c\xca\xad\xa8\x8f\xf9"
3230 "\xac\xb3\x0e\xdb\xca\x2e\xe2\xb8"
3231 "\x51\x71\xd9\x3c\x6c\xf1\x56\xf8"
3232 "\xea\x9c\xf1\xfb\x0c\xe6\xb7\x10"
3233 "\x1c\xf8\xa9\x7c\xe8\x53\x35\xc1"
3234 "\x90\x3e\x76\x4a\x74\xa4\x21\x2c"
3235 "\xf6\x2c\x4e\x0f\x94\x3a\x88\x2e"
3236 "\x41\x09\x6a\x33\x7d\xf6\xdd\x3f"
3237 "\x8d\x23\x31\x74\x84\xeb\x88\x6e"
3238 "\xcc\xb9\xbc\x22\x83\x19\x07\x22"
3239 "\xa5\x2d\xdf\xa5\xf3\x80\x85\x78"
3240 "\x84\x39\x6a\x6d\x6a\x99\x4f\xa5"
3241 "\x15\xfe\x46\xb0\xe4\x6c\xa5\x41"
3242 "\x3c\xce\x8f\x42\x60\x71\xa7\x75"
3243 "\x08\x40\x65\x8a\x82\xbf\xf5\x43"
3244 "\x71\x96\xa9\x4d\x44\x8a\x20\xbe"
3245 "\xfa\x4d\xbb\xc0\x7d\x31\x96\x65"
3246 "\xe7\x75\xe5\x3e\xfd\x92\x3b\xc9"
3247 "\x55\xbb\x16\x7e\xf7\xc2\x8c\xa4"
3248 "\x40\x1d\xe5\xef\x0e\xdf\xe4\x9a"
3249 "\x62\x73\x65\xfd\x46\x63\x25\x3d"
3250 "\x2b\xaf\xe5\x64\xfe\xa5\x5c\xcf"
3251 "\x24\xf3\xb4\xac\x64\xba\xdf\x4b"
3252 "\xc6\x96\x7d\x81\x2d\x8d\x97\xf7"
3253 "\xc5\x68\x77\x84\x32\x2b\xcc\x85"
3254 "\x74\x96\xf0\x12\x77\x61\xb9\xeb"
3255 "\x71\xaa\x82\xcb\x1c\xdb\x89\xc8"
3256 "\xc6\xb5\xe3\x5c\x7d\x39\x07\x24"
3257 "\xda\x39\x87\x45\xc0\x2b\xbb\x01"
3258 "\xac\xbc\x2a\x5c\x7f\xfc\xe8\xce"
3259 "\x6d\x9c\x6f\xed\xd3\xc1\xa1\xd6"
3260 "\xc5\x55\xa9\x66\x2f\xe1\xc8\x32"
3261 "\xa6\x5d\xa4\x3a\x98\x73\xe8\x45"
3262 "\xa4\xc7\xa8\xb4\xf6\x13\x03\xf6"
3263 "\xe9\x2e\xc4\x29\x0f\x84\xdb\xc4"
3264 "\x21\xc4\xc2\x75\x67\x89\x37\x0a",
3265 .ilen = 512,
3266 .result = "\x1a\x1d\xa9\x30\xad\xf9\x2f\x9b"
3267 "\xb6\x1d\xae\xef\xf0\x2f\xf8\x5a"
3268 "\x39\x3c\xbf\x2a\xb2\x45\xb2\x23"
3269 "\x1b\x63\x3c\xcf\xaa\xbe\xcf\x4e"
3270 "\xfa\xe8\x29\xc2\x20\x68\x2b\x3c"
3271 "\x2e\x8b\xf7\x6e\x25\xbd\xe3\x3d"
3272 "\x66\x27\xd6\xaf\xd6\x64\x3e\xe3"
3273 "\xe8\x58\x46\x97\x39\x51\x07\xde"
3274 "\xcb\x37\xbc\xa9\xc0\x5f\x75\xc3"
3275 "\x0e\x84\x23\x1d\x16\xd4\x1c\x59"
3276 "\x9c\x1a\x02\x55\xab\x3a\x97\x1d"
3277 "\xdf\xdd\xc7\x06\x51\xd7\x70\xae"
3278 "\x23\xc6\x8c\xf5\x1e\xa0\xe5\x82"
3279 "\xb8\xb2\xbf\x04\xa0\x32\x8e\x68"
3280 "\xeb\xaf\x6e\x2d\x94\x22\x2f\xce"
3281 "\x4c\xb5\x59\xe2\xa2\x2f\xa0\x98"
3282 "\x1a\x97\xc6\xd4\xb5\x00\x59\xf2"
3283 "\x84\x14\x72\xb1\x9a\x6e\xa3\x7f"
3284 "\xea\x20\xe7\xcb\x65\x77\x3a\xdf"
3285 "\xc8\x97\x67\x15\xc2\x2a\x27\xcc"
3286 "\x18\x55\xa1\x24\x0b\x24\x24\xaf"
3287 "\x5b\xec\x68\xb8\xc8\xf5\xba\x63"
3288 "\xff\xed\x89\xce\xd5\x3d\x88\xf3"
3289 "\x25\xef\x05\x7c\x3a\xef\xeb\xd8"
3290 "\x7a\x32\x0d\xd1\x1e\x58\x59\x99"
3291 "\x90\x25\xb5\x26\xb0\xe3\x2b\x6c"
3292 "\x4c\xa9\x8b\x84\x4f\x5e\x01\x50"
3293 "\x41\x30\x58\xc5\x62\x74\x52\x1d"
3294 "\x45\x24\x6a\x42\x64\x4f\x97\x1c"
3295 "\xa8\x66\xb5\x6d\x79\xd4\x0d\x48"
3296 "\xc5\x5f\xf3\x90\x32\xdd\xdd\xe1"
3297 "\xe4\xa9\x9f\xfc\xc3\x52\x5a\x46"
3298 "\xe4\x81\x84\x95\x36\x59\x7a\x6b"
3299 "\xaa\xb3\x60\xad\xce\x9f\x9f\x28"
3300 "\xe0\x01\x75\x22\xc4\x4e\xa9\x62"
3301 "\x5c\x62\x0d\x00\xcb\x13\xe8\x43"
3302 "\x72\xd4\x2d\x53\x46\xb5\xd1\x16"
3303 "\x22\x18\xdf\x34\x33\xf5\xd6\x1c"
3304 "\xb8\x79\x78\x97\x94\xff\x72\x13"
3305 "\x4c\x27\xfc\xcb\xbf\x01\x53\xa6"
3306 "\xb4\x50\x6e\xde\xdf\xb5\x43\xa4"
3307 "\x59\xdf\x52\xf9\x7c\xe0\x11\x6f"
3308 "\x2d\x14\x8e\x24\x61\x2c\xe1\x17"
3309 "\xcc\xce\x51\x0c\x19\x8a\x82\x30"
3310 "\x94\xd5\x3d\x6a\x53\x06\x5e\xbd"
3311 "\xb7\xeb\xfa\xfd\x27\x51\xde\x85"
3312 "\x1e\x86\x53\x11\x53\x94\x00\xee"
3313 "\x2b\x8c\x08\x2a\xbf\xdd\xae\x11"
3314 "\xcb\x1e\xa2\x07\x9a\x80\xcf\x62"
3315 "\x9b\x09\xdc\x95\x3c\x96\x8e\xb1"
3316 "\x09\xbd\xe4\xeb\xdb\xca\x70\x7a"
3317 "\x9e\xfa\x31\x18\x45\x3c\x21\x33"
3318 "\xb0\xb3\x2b\xea\xf3\x71\x2d\xe1"
3319 "\x03\xad\x1b\x48\xd4\x67\x27\xf0"
3320 "\x62\xe4\x3d\xfb\x9b\x08\x76\xe7"
3321 "\xdd\x2b\x01\x39\x04\x5a\x58\x7a"
3322 "\xf7\x11\x90\xec\xbd\x51\x5c\x32"
3323 "\x6b\xd7\x35\x39\x02\x6b\xf2\xa6"
3324 "\xd0\x0d\x07\xe1\x06\xc4\x5b\x7d"
3325 "\xe4\x6a\xd7\xee\x15\x1f\x83\xb4"
3326 "\xa3\xa7\x5e\xc3\x90\xb7\xef\xd3"
3327 "\xb7\x4f\xf8\x92\x4c\xb7\x3c\x29"
3328 "\xcd\x7e\x2b\x5d\x43\xea\x42\xe7"
3329 "\x74\x3f\x7d\x58\x88\x75\xde\x3e",
3330 .rlen = 512,
3331 }
3332};
3333
3334static struct cipher_testvec aes_lrw_dec_tv_template[] = {
3335 /* from http://grouper.ieee.org/groups/1619/email/pdf00017.pdf */
3336 /* same as enc vectors with input and result reversed */
3337 { /* LRW-32-AES 1 */
3338 .key = "\x45\x62\xac\x25\xf8\x28\x17\x6d"
3339 "\x4c\x26\x84\x14\xb5\x68\x01\x85"
3340 "\x25\x8e\x2a\x05\xe7\x3e\x9d\x03"
3341 "\xee\x5a\x83\x0c\xcc\x09\x4c\x87",
3342 .klen = 32,
3343 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
3344 "\x00\x00\x00\x00\x00\x00\x00\x01",
3345 .input = "\xf1\xb2\x73\xcd\x65\xa3\xdf\x5f"
3346 "\xe9\x5d\x48\x92\x54\x63\x4e\xb8",
3347 .ilen = 16,
3348 .result = "\x30\x31\x32\x33\x34\x35\x36\x37"
3349 "\x38\x39\x41\x42\x43\x44\x45\x46",
3350 .rlen = 16,
3351 }, { /* LRW-32-AES 2 */
3352 .key = "\x59\x70\x47\x14\xf5\x57\x47\x8c"
3353 "\xd7\x79\xe8\x0f\x54\x88\x79\x44"
3354 "\x0d\x48\xf0\xb7\xb1\x5a\x53\xea"
3355 "\x1c\xaa\x6b\x29\xc2\xca\xfb\xaf",
3356 .klen = 32,
3357 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
3358 "\x00\x00\x00\x00\x00\x00\x00\x02",
3359 .input = "\x00\xc8\x2b\xae\x95\xbb\xcd\xe5"
3360 "\x27\x4f\x07\x69\xb2\x60\xe1\x36",
3361 .ilen = 16,
3362 .result = "\x30\x31\x32\x33\x34\x35\x36\x37"
3363 "\x38\x39\x41\x42\x43\x44\x45\x46",
3364 .rlen = 16,
3365 }, { /* LRW-32-AES 3 */
3366 .key = "\xd8\x2a\x91\x34\xb2\x6a\x56\x50"
3367 "\x30\xfe\x69\xe2\x37\x7f\x98\x47"
3368 "\xcd\xf9\x0b\x16\x0c\x64\x8f\xb6"
3369 "\xb0\x0d\x0d\x1b\xae\x85\x87\x1f",
3370 .klen = 32,
3371 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
3372 "\x00\x00\x00\x02\x00\x00\x00\x00",
3373 .input = "\x76\x32\x21\x83\xed\x8f\xf1\x82"
3374 "\xf9\x59\x62\x03\x69\x0e\x5e\x01",
3375 .ilen = 16,
3376 .result = "\x30\x31\x32\x33\x34\x35\x36\x37"
3377 "\x38\x39\x41\x42\x43\x44\x45\x46",
3378 .rlen = 16,
3379 }, { /* LRW-32-AES 4 */
3380 .key = "\x0f\x6a\xef\xf8\xd3\xd2\xbb\x15"
3381 "\x25\x83\xf7\x3c\x1f\x01\x28\x74"
3382 "\xca\xc6\xbc\x35\x4d\x4a\x65\x54"
3383 "\x90\xae\x61\xcf\x7b\xae\xbd\xcc"
3384 "\xad\xe4\x94\xc5\x4a\x29\xae\x70",
3385 .klen = 40,
3386 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
3387 "\x00\x00\x00\x00\x00\x00\x00\x01",
3388 .input = "\x9c\x0f\x15\x2f\x55\xa2\xd8\xf0"
3389 "\xd6\x7b\x8f\x9e\x28\x22\xbc\x41",
3390 .ilen = 16,
3391 .result = "\x30\x31\x32\x33\x34\x35\x36\x37"
3392 "\x38\x39\x41\x42\x43\x44\x45\x46",
3393 .rlen = 16,
3394 }, { /* LRW-32-AES 5 */
3395 .key = "\x8a\xd4\xee\x10\x2f\xbd\x81\xff"
3396 "\xf8\x86\xce\xac\x93\xc5\xad\xc6"
3397 "\xa0\x19\x07\xc0\x9d\xf7\xbb\xdd"
3398 "\x52\x13\xb2\xb7\xf0\xff\x11\xd8"
3399 "\xd6\x08\xd0\xcd\x2e\xb1\x17\x6f",
3400 .klen = 40,
3401 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
3402 "\x00\x00\x00\x02\x00\x00\x00\x00",
3403 .input = "\xd4\x27\x6a\x7f\x14\x91\x3d\x65"
3404 "\xc8\x60\x48\x02\x87\xe3\x34\x06",
3405 .ilen = 16,
3406 .result = "\x30\x31\x32\x33\x34\x35\x36\x37"
3407 "\x38\x39\x41\x42\x43\x44\x45\x46",
3408 .rlen = 16,
3409 }, { /* LRW-32-AES 6 */
3410 .key = "\xf8\xd4\x76\xff\xd6\x46\xee\x6c"
3411 "\x23\x84\xcb\x1c\x77\xd6\x19\x5d"
3412 "\xfe\xf1\xa9\xf3\x7b\xbc\x8d\x21"
3413 "\xa7\x9c\x21\xf8\xcb\x90\x02\x89"
3414 "\xa8\x45\x34\x8e\xc8\xc5\xb5\xf1"
3415 "\x26\xf5\x0e\x76\xfe\xfd\x1b\x1e",
3416 .klen = 48,
3417 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
3418 "\x00\x00\x00\x00\x00\x00\x00\x01",
3419 .input = "\xbd\x06\xb8\xe1\xdb\x98\x89\x9e"
3420 "\xc4\x98\xe4\x91\xcf\x1c\x70\x2b",
3421 .ilen = 16,
3422 .result = "\x30\x31\x32\x33\x34\x35\x36\x37"
3423 "\x38\x39\x41\x42\x43\x44\x45\x46",
3424 .rlen = 16,
3425 }, { /* LRW-32-AES 7 */
3426 .key = "\xfb\x76\x15\xb2\x3d\x80\x89\x1d"
3427 "\xd4\x70\x98\x0b\xc7\x95\x84\xc8"
3428 "\xb2\xfb\x64\xce\x60\x97\x87\x8d"
3429 "\x17\xfc\xe4\x5a\x49\xe8\x30\xb7"
3430 "\x6e\x78\x17\xe7\x2d\x5e\x12\xd4"
3431 "\x60\x64\x04\x7a\xf1\x2f\x9e\x0c",
3432 .klen = 48,
3433 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
3434 "\x00\x00\x00\x02\x00\x00\x00\x00",
3435 .input = "\x5b\x90\x8e\xc1\xab\xdd\x67\x5f"
3436 "\x3d\x69\x8a\x95\x53\xc8\x9c\xe5",
3437 .ilen = 16,
3438 .result = "\x30\x31\x32\x33\x34\x35\x36\x37"
3439 "\x38\x39\x41\x42\x43\x44\x45\x46",
3440 .rlen = 16,
3441 }, {
3442/* http://www.mail-archive.com/stds-p1619@listserv.ieee.org/msg00173.html */
3443 .key = "\xf8\xd4\x76\xff\xd6\x46\xee\x6c"
3444 "\x23\x84\xcb\x1c\x77\xd6\x19\x5d"
3445 "\xfe\xf1\xa9\xf3\x7b\xbc\x8d\x21"
3446 "\xa7\x9c\x21\xf8\xcb\x90\x02\x89"
3447 "\xa8\x45\x34\x8e\xc8\xc5\xb5\xf1"
3448 "\x26\xf5\x0e\x76\xfe\xfd\x1b\x1e",
3449 .klen = 48,
3450 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
3451 "\x00\x00\x00\x00\x00\x00\x00\x01",
3452 .input = "\x1a\x1d\xa9\x30\xad\xf9\x2f\x9b"
3453 "\xb6\x1d\xae\xef\xf0\x2f\xf8\x5a"
3454 "\x39\x3c\xbf\x2a\xb2\x45\xb2\x23"
3455 "\x1b\x63\x3c\xcf\xaa\xbe\xcf\x4e"
3456 "\xfa\xe8\x29\xc2\x20\x68\x2b\x3c"
3457 "\x2e\x8b\xf7\x6e\x25\xbd\xe3\x3d"
3458 "\x66\x27\xd6\xaf\xd6\x64\x3e\xe3"
3459 "\xe8\x58\x46\x97\x39\x51\x07\xde"
3460 "\xcb\x37\xbc\xa9\xc0\x5f\x75\xc3"
3461 "\x0e\x84\x23\x1d\x16\xd4\x1c\x59"
3462 "\x9c\x1a\x02\x55\xab\x3a\x97\x1d"
3463 "\xdf\xdd\xc7\x06\x51\xd7\x70\xae"
3464 "\x23\xc6\x8c\xf5\x1e\xa0\xe5\x82"
3465 "\xb8\xb2\xbf\x04\xa0\x32\x8e\x68"
3466 "\xeb\xaf\x6e\x2d\x94\x22\x2f\xce"
3467 "\x4c\xb5\x59\xe2\xa2\x2f\xa0\x98"
3468 "\x1a\x97\xc6\xd4\xb5\x00\x59\xf2"
3469 "\x84\x14\x72\xb1\x9a\x6e\xa3\x7f"
3470 "\xea\x20\xe7\xcb\x65\x77\x3a\xdf"
3471 "\xc8\x97\x67\x15\xc2\x2a\x27\xcc"
3472 "\x18\x55\xa1\x24\x0b\x24\x24\xaf"
3473 "\x5b\xec\x68\xb8\xc8\xf5\xba\x63"
3474 "\xff\xed\x89\xce\xd5\x3d\x88\xf3"
3475 "\x25\xef\x05\x7c\x3a\xef\xeb\xd8"
3476 "\x7a\x32\x0d\xd1\x1e\x58\x59\x99"
3477 "\x90\x25\xb5\x26\xb0\xe3\x2b\x6c"
3478 "\x4c\xa9\x8b\x84\x4f\x5e\x01\x50"
3479 "\x41\x30\x58\xc5\x62\x74\x52\x1d"
3480 "\x45\x24\x6a\x42\x64\x4f\x97\x1c"
3481 "\xa8\x66\xb5\x6d\x79\xd4\x0d\x48"
3482 "\xc5\x5f\xf3\x90\x32\xdd\xdd\xe1"
3483 "\xe4\xa9\x9f\xfc\xc3\x52\x5a\x46"
3484 "\xe4\x81\x84\x95\x36\x59\x7a\x6b"
3485 "\xaa\xb3\x60\xad\xce\x9f\x9f\x28"
3486 "\xe0\x01\x75\x22\xc4\x4e\xa9\x62"
3487 "\x5c\x62\x0d\x00\xcb\x13\xe8\x43"
3488 "\x72\xd4\x2d\x53\x46\xb5\xd1\x16"
3489 "\x22\x18\xdf\x34\x33\xf5\xd6\x1c"
3490 "\xb8\x79\x78\x97\x94\xff\x72\x13"
3491 "\x4c\x27\xfc\xcb\xbf\x01\x53\xa6"
3492 "\xb4\x50\x6e\xde\xdf\xb5\x43\xa4"
3493 "\x59\xdf\x52\xf9\x7c\xe0\x11\x6f"
3494 "\x2d\x14\x8e\x24\x61\x2c\xe1\x17"
3495 "\xcc\xce\x51\x0c\x19\x8a\x82\x30"
3496 "\x94\xd5\x3d\x6a\x53\x06\x5e\xbd"
3497 "\xb7\xeb\xfa\xfd\x27\x51\xde\x85"
3498 "\x1e\x86\x53\x11\x53\x94\x00\xee"
3499 "\x2b\x8c\x08\x2a\xbf\xdd\xae\x11"
3500 "\xcb\x1e\xa2\x07\x9a\x80\xcf\x62"
3501 "\x9b\x09\xdc\x95\x3c\x96\x8e\xb1"
3502 "\x09\xbd\xe4\xeb\xdb\xca\x70\x7a"
3503 "\x9e\xfa\x31\x18\x45\x3c\x21\x33"
3504 "\xb0\xb3\x2b\xea\xf3\x71\x2d\xe1"
3505 "\x03\xad\x1b\x48\xd4\x67\x27\xf0"
3506 "\x62\xe4\x3d\xfb\x9b\x08\x76\xe7"
3507 "\xdd\x2b\x01\x39\x04\x5a\x58\x7a"
3508 "\xf7\x11\x90\xec\xbd\x51\x5c\x32"
3509 "\x6b\xd7\x35\x39\x02\x6b\xf2\xa6"
3510 "\xd0\x0d\x07\xe1\x06\xc4\x5b\x7d"
3511 "\xe4\x6a\xd7\xee\x15\x1f\x83\xb4"
3512 "\xa3\xa7\x5e\xc3\x90\xb7\xef\xd3"
3513 "\xb7\x4f\xf8\x92\x4c\xb7\x3c\x29"
3514 "\xcd\x7e\x2b\x5d\x43\xea\x42\xe7"
3515 "\x74\x3f\x7d\x58\x88\x75\xde\x3e",
3516 .ilen = 512,
3517 .result = "\x05\x11\xb7\x18\xab\xc6\x2d\xac"
3518 "\x70\x5d\xf6\x22\x94\xcd\xe5\x6c"
3519 "\x17\x6b\xf6\x1c\xf0\xf3\x6e\xf8"
3520 "\x50\x38\x1f\x71\x49\xb6\x57\xd6"
3521 "\x8f\xcb\x8d\x6b\xe3\xa6\x29\x90"
3522 "\xfe\x2a\x62\x82\xae\x6d\x8b\xf6"
3523 "\xad\x1e\x9e\x20\x5f\x38\xbe\x04"
3524 "\xda\x10\x8e\xed\xa2\xa4\x87\xab"
3525 "\xda\x6b\xb4\x0c\x75\xba\xd3\x7c"
3526 "\xc9\xac\x42\x31\x95\x7c\xc9\x04"
3527 "\xeb\xd5\x6e\x32\x69\x8a\xdb\xa6"
3528 "\x15\xd7\x3f\x4f\x2f\x66\x69\x03"
3529 "\x9c\x1f\x54\x0f\xde\x1f\xf3\x65"
3530 "\x4c\x96\x12\xed\x7c\x92\x03\x01"
3531 "\x6f\xbc\x35\x93\xac\xf1\x27\xf1"
3532 "\xb4\x96\x82\x5a\x5f\xb0\xa0\x50"
3533 "\x89\xa4\x8e\x66\x44\x85\xcc\xfd"
3534 "\x33\x14\x70\xe3\x96\xb2\xc3\xd3"
3535 "\xbb\x54\x5a\x1a\xf9\x74\xa2\xc5"
3536 "\x2d\x64\x75\xdd\xb4\x54\xe6\x74"
3537 "\x8c\xd3\x9d\x9e\x86\xab\x51\x53"
3538 "\xb7\x93\x3e\x6f\xd0\x4e\x2c\x40"
3539 "\xf6\xa8\x2e\x3e\x9d\xf4\x66\xa5"
3540 "\x76\x12\x73\x44\x1a\x56\xd7\x72"
3541 "\x88\xcd\x21\x8c\x4c\x0f\xfe\xda"
3542 "\x95\xe0\x3a\xa6\xa5\x84\x46\xcd"
3543 "\xd5\x3e\x9d\x3a\xe2\x67\xe6\x60"
3544 "\x1a\xe2\x70\x85\x58\xc2\x1b\x09"
3545 "\xe1\xd7\x2c\xca\xad\xa8\x8f\xf9"
3546 "\xac\xb3\x0e\xdb\xca\x2e\xe2\xb8"
3547 "\x51\x71\xd9\x3c\x6c\xf1\x56\xf8"
3548 "\xea\x9c\xf1\xfb\x0c\xe6\xb7\x10"
3549 "\x1c\xf8\xa9\x7c\xe8\x53\x35\xc1"
3550 "\x90\x3e\x76\x4a\x74\xa4\x21\x2c"
3551 "\xf6\x2c\x4e\x0f\x94\x3a\x88\x2e"
3552 "\x41\x09\x6a\x33\x7d\xf6\xdd\x3f"
3553 "\x8d\x23\x31\x74\x84\xeb\x88\x6e"
3554 "\xcc\xb9\xbc\x22\x83\x19\x07\x22"
3555 "\xa5\x2d\xdf\xa5\xf3\x80\x85\x78"
3556 "\x84\x39\x6a\x6d\x6a\x99\x4f\xa5"
3557 "\x15\xfe\x46\xb0\xe4\x6c\xa5\x41"
3558 "\x3c\xce\x8f\x42\x60\x71\xa7\x75"
3559 "\x08\x40\x65\x8a\x82\xbf\xf5\x43"
3560 "\x71\x96\xa9\x4d\x44\x8a\x20\xbe"
3561 "\xfa\x4d\xbb\xc0\x7d\x31\x96\x65"
3562 "\xe7\x75\xe5\x3e\xfd\x92\x3b\xc9"
3563 "\x55\xbb\x16\x7e\xf7\xc2\x8c\xa4"
3564 "\x40\x1d\xe5\xef\x0e\xdf\xe4\x9a"
3565 "\x62\x73\x65\xfd\x46\x63\x25\x3d"
3566 "\x2b\xaf\xe5\x64\xfe\xa5\x5c\xcf"
3567 "\x24\xf3\xb4\xac\x64\xba\xdf\x4b"
3568 "\xc6\x96\x7d\x81\x2d\x8d\x97\xf7"
3569 "\xc5\x68\x77\x84\x32\x2b\xcc\x85"
3570 "\x74\x96\xf0\x12\x77\x61\xb9\xeb"
3571 "\x71\xaa\x82\xcb\x1c\xdb\x89\xc8"
3572 "\xc6\xb5\xe3\x5c\x7d\x39\x07\x24"
3573 "\xda\x39\x87\x45\xc0\x2b\xbb\x01"
3574 "\xac\xbc\x2a\x5c\x7f\xfc\xe8\xce"
3575 "\x6d\x9c\x6f\xed\xd3\xc1\xa1\xd6"
3576 "\xc5\x55\xa9\x66\x2f\xe1\xc8\x32"
3577 "\xa6\x5d\xa4\x3a\x98\x73\xe8\x45"
3578 "\xa4\xc7\xa8\xb4\xf6\x13\x03\xf6"
3579 "\xe9\x2e\xc4\x29\x0f\x84\xdb\xc4"
3580 "\x21\xc4\xc2\x75\x67\x89\x37\x0a",
3581 .rlen = 512,
3582 }
3583};
3584
3585static struct cipher_testvec aes_xts_enc_tv_template[] = {
3586 /* http://grouper.ieee.org/groups/1619/email/pdf00086.pdf */
3587 { /* XTS-AES 1 */
3588 .key = "\x00\x00\x00\x00\x00\x00\x00\x00"
3589 "\x00\x00\x00\x00\x00\x00\x00\x00"
3590 "\x00\x00\x00\x00\x00\x00\x00\x00"
3591 "\x00\x00\x00\x00\x00\x00\x00\x00",
3592 .klen = 32,
3593 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
3594 "\x00\x00\x00\x00\x00\x00\x00\x00",
3595 .input = "\x00\x00\x00\x00\x00\x00\x00\x00"
3596 "\x00\x00\x00\x00\x00\x00\x00\x00"
3597 "\x00\x00\x00\x00\x00\x00\x00\x00"
3598 "\x00\x00\x00\x00\x00\x00\x00\x00",
3599 .ilen = 32,
3600 .result = "\x91\x7c\xf6\x9e\xbd\x68\xb2\xec"
3601 "\x9b\x9f\xe9\xa3\xea\xdd\xa6\x92"
3602 "\xcd\x43\xd2\xf5\x95\x98\xed\x85"
3603 "\x8c\x02\xc2\x65\x2f\xbf\x92\x2e",
3604 .rlen = 32,
3605 }, { /* XTS-AES 2 */
3606 .key = "\x11\x11\x11\x11\x11\x11\x11\x11"
3607 "\x11\x11\x11\x11\x11\x11\x11\x11"
3608 "\x22\x22\x22\x22\x22\x22\x22\x22"
3609 "\x22\x22\x22\x22\x22\x22\x22\x22",
3610 .klen = 32,
3611 .iv = "\x33\x33\x33\x33\x33\x00\x00\x00"
3612 "\x00\x00\x00\x00\x00\x00\x00\x00",
3613 .input = "\x44\x44\x44\x44\x44\x44\x44\x44"
3614 "\x44\x44\x44\x44\x44\x44\x44\x44"
3615 "\x44\x44\x44\x44\x44\x44\x44\x44"
3616 "\x44\x44\x44\x44\x44\x44\x44\x44",
3617 .ilen = 32,
3618 .result = "\xc4\x54\x18\x5e\x6a\x16\x93\x6e"
3619 "\x39\x33\x40\x38\xac\xef\x83\x8b"
3620 "\xfb\x18\x6f\xff\x74\x80\xad\xc4"
3621 "\x28\x93\x82\xec\xd6\xd3\x94\xf0",
3622 .rlen = 32,
3623 }, { /* XTS-AES 3 */
3624 .key = "\xff\xfe\xfd\xfc\xfb\xfa\xf9\xf8"
3625 "\xf7\xf6\xf5\xf4\xf3\xf2\xf1\xf0"
3626 "\x22\x22\x22\x22\x22\x22\x22\x22"
3627 "\x22\x22\x22\x22\x22\x22\x22\x22",
3628 .klen = 32,
3629 .iv = "\x33\x33\x33\x33\x33\x00\x00\x00"
3630 "\x00\x00\x00\x00\x00\x00\x00\x00",
3631 .input = "\x44\x44\x44\x44\x44\x44\x44\x44"
3632 "\x44\x44\x44\x44\x44\x44\x44\x44"
3633 "\x44\x44\x44\x44\x44\x44\x44\x44"
3634 "\x44\x44\x44\x44\x44\x44\x44\x44",
3635 .ilen = 32,
3636 .result = "\xaf\x85\x33\x6b\x59\x7a\xfc\x1a"
3637 "\x90\x0b\x2e\xb2\x1e\xc9\x49\xd2"
3638 "\x92\xdf\x4c\x04\x7e\x0b\x21\x53"
3639 "\x21\x86\xa5\x97\x1a\x22\x7a\x89",
3640 .rlen = 32,
3641 }, { /* XTS-AES 4 */
3642 .key = "\x27\x18\x28\x18\x28\x45\x90\x45"
3643 "\x23\x53\x60\x28\x74\x71\x35\x26"
3644 "\x31\x41\x59\x26\x53\x58\x97\x93"
3645 "\x23\x84\x62\x64\x33\x83\x27\x95",
3646 .klen = 32,
3647 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
3648 "\x00\x00\x00\x00\x00\x00\x00\x00",
3649 .input = "\x00\x01\x02\x03\x04\x05\x06\x07"
3650 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
3651 "\x10\x11\x12\x13\x14\x15\x16\x17"
3652 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
3653 "\x20\x21\x22\x23\x24\x25\x26\x27"
3654 "\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f"
3655 "\x30\x31\x32\x33\x34\x35\x36\x37"
3656 "\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f"
3657 "\x40\x41\x42\x43\x44\x45\x46\x47"
3658 "\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f"
3659 "\x50\x51\x52\x53\x54\x55\x56\x57"
3660 "\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f"
3661 "\x60\x61\x62\x63\x64\x65\x66\x67"
3662 "\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f"
3663 "\x70\x71\x72\x73\x74\x75\x76\x77"
3664 "\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f"
3665 "\x80\x81\x82\x83\x84\x85\x86\x87"
3666 "\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
3667 "\x90\x91\x92\x93\x94\x95\x96\x97"
3668 "\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
3669 "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7"
3670 "\xa8\xa9\xaa\xab\xac\xad\xae\xaf"
3671 "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7"
3672 "\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
3673 "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
3674 "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
3675 "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7"
3676 "\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf"
3677 "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7"
3678 "\xe8\xe9\xea\xeb\xec\xed\xee\xef"
3679 "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7"
3680 "\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"
3681 "\x00\x01\x02\x03\x04\x05\x06\x07"
3682 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
3683 "\x10\x11\x12\x13\x14\x15\x16\x17"
3684 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
3685 "\x20\x21\x22\x23\x24\x25\x26\x27"
3686 "\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f"
3687 "\x30\x31\x32\x33\x34\x35\x36\x37"
3688 "\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f"
3689 "\x40\x41\x42\x43\x44\x45\x46\x47"
3690 "\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f"
3691 "\x50\x51\x52\x53\x54\x55\x56\x57"
3692 "\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f"
3693 "\x60\x61\x62\x63\x64\x65\x66\x67"
3694 "\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f"
3695 "\x70\x71\x72\x73\x74\x75\x76\x77"
3696 "\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f"
3697 "\x80\x81\x82\x83\x84\x85\x86\x87"
3698 "\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
3699 "\x90\x91\x92\x93\x94\x95\x96\x97"
3700 "\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
3701 "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7"
3702 "\xa8\xa9\xaa\xab\xac\xad\xae\xaf"
3703 "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7"
3704 "\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
3705 "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
3706 "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
3707 "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7"
3708 "\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf"
3709 "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7"
3710 "\xe8\xe9\xea\xeb\xec\xed\xee\xef"
3711 "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7"
3712 "\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff",
3713 .ilen = 512,
3714 .result = "\x27\xa7\x47\x9b\xef\xa1\xd4\x76"
3715 "\x48\x9f\x30\x8c\xd4\xcf\xa6\xe2"
3716 "\xa9\x6e\x4b\xbe\x32\x08\xff\x25"
3717 "\x28\x7d\xd3\x81\x96\x16\xe8\x9c"
3718 "\xc7\x8c\xf7\xf5\xe5\x43\x44\x5f"
3719 "\x83\x33\xd8\xfa\x7f\x56\x00\x00"
3720 "\x05\x27\x9f\xa5\xd8\xb5\xe4\xad"
3721 "\x40\xe7\x36\xdd\xb4\xd3\x54\x12"
3722 "\x32\x80\x63\xfd\x2a\xab\x53\xe5"
3723 "\xea\x1e\x0a\x9f\x33\x25\x00\xa5"
3724 "\xdf\x94\x87\xd0\x7a\x5c\x92\xcc"
3725 "\x51\x2c\x88\x66\xc7\xe8\x60\xce"
3726 "\x93\xfd\xf1\x66\xa2\x49\x12\xb4"
3727 "\x22\x97\x61\x46\xae\x20\xce\x84"
3728 "\x6b\xb7\xdc\x9b\xa9\x4a\x76\x7a"
3729 "\xae\xf2\x0c\x0d\x61\xad\x02\x65"
3730 "\x5e\xa9\x2d\xc4\xc4\xe4\x1a\x89"
3731 "\x52\xc6\x51\xd3\x31\x74\xbe\x51"
3732 "\xa1\x0c\x42\x11\x10\xe6\xd8\x15"
3733 "\x88\xed\xe8\x21\x03\xa2\x52\xd8"
3734 "\xa7\x50\xe8\x76\x8d\xef\xff\xed"
3735 "\x91\x22\x81\x0a\xae\xb9\x9f\x91"
3736 "\x72\xaf\x82\xb6\x04\xdc\x4b\x8e"
3737 "\x51\xbc\xb0\x82\x35\xa6\xf4\x34"
3738 "\x13\x32\xe4\xca\x60\x48\x2a\x4b"
3739 "\xa1\xa0\x3b\x3e\x65\x00\x8f\xc5"
3740 "\xda\x76\xb7\x0b\xf1\x69\x0d\xb4"
3741 "\xea\xe2\x9c\x5f\x1b\xad\xd0\x3c"
3742 "\x5c\xcf\x2a\x55\xd7\x05\xdd\xcd"
3743 "\x86\xd4\x49\x51\x1c\xeb\x7e\xc3"
3744 "\x0b\xf1\x2b\x1f\xa3\x5b\x91\x3f"
3745 "\x9f\x74\x7a\x8a\xfd\x1b\x13\x0e"
3746 "\x94\xbf\xf9\x4e\xff\xd0\x1a\x91"
3747 "\x73\x5c\xa1\x72\x6a\xcd\x0b\x19"
3748 "\x7c\x4e\x5b\x03\x39\x36\x97\xe1"
3749 "\x26\x82\x6f\xb6\xbb\xde\x8e\xcc"
3750 "\x1e\x08\x29\x85\x16\xe2\xc9\xed"
3751 "\x03\xff\x3c\x1b\x78\x60\xf6\xde"
3752 "\x76\xd4\xce\xcd\x94\xc8\x11\x98"
3753 "\x55\xef\x52\x97\xca\x67\xe9\xf3"
3754 "\xe7\xff\x72\xb1\xe9\x97\x85\xca"
3755 "\x0a\x7e\x77\x20\xc5\xb3\x6d\xc6"
3756 "\xd7\x2c\xac\x95\x74\xc8\xcb\xbc"
3757 "\x2f\x80\x1e\x23\xe5\x6f\xd3\x44"
3758 "\xb0\x7f\x22\x15\x4b\xeb\xa0\xf0"
3759 "\x8c\xe8\x89\x1e\x64\x3e\xd9\x95"
3760 "\xc9\x4d\x9a\x69\xc9\xf1\xb5\xf4"
3761 "\x99\x02\x7a\x78\x57\x2a\xee\xbd"
3762 "\x74\xd2\x0c\xc3\x98\x81\xc2\x13"
3763 "\xee\x77\x0b\x10\x10\xe4\xbe\xa7"
3764 "\x18\x84\x69\x77\xae\x11\x9f\x7a"
3765 "\x02\x3a\xb5\x8c\xca\x0a\xd7\x52"
3766 "\xaf\xe6\x56\xbb\x3c\x17\x25\x6a"
3767 "\x9f\x6e\x9b\xf1\x9f\xdd\x5a\x38"
3768 "\xfc\x82\xbb\xe8\x72\xc5\x53\x9e"
3769 "\xdb\x60\x9e\xf4\xf7\x9c\x20\x3e"
3770 "\xbb\x14\x0f\x2e\x58\x3c\xb2\xad"
3771 "\x15\xb4\xaa\x5b\x65\x50\x16\xa8"
3772 "\x44\x92\x77\xdb\xd4\x77\xef\x2c"
3773 "\x8d\x6c\x01\x7d\xb7\x38\xb1\x8d"
3774 "\xeb\x4a\x42\x7d\x19\x23\xce\x3f"
3775 "\xf2\x62\x73\x57\x79\xa4\x18\xf2"
3776 "\x0a\x28\x2d\xf9\x20\x14\x7b\xea"
3777 "\xbe\x42\x1e\xe5\x31\x9d\x05\x68",
3778 .rlen = 512,
3779 }
3780};
3781
3782static struct cipher_testvec aes_xts_dec_tv_template[] = {
3783 /* http://grouper.ieee.org/groups/1619/email/pdf00086.pdf */
3784 { /* XTS-AES 1 */
3785 .key = "\x00\x00\x00\x00\x00\x00\x00\x00"
3786 "\x00\x00\x00\x00\x00\x00\x00\x00"
3787 "\x00\x00\x00\x00\x00\x00\x00\x00"
3788 "\x00\x00\x00\x00\x00\x00\x00\x00",
3789 .klen = 32,
3790 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
3791 "\x00\x00\x00\x00\x00\x00\x00\x00",
3792 .input = "\x91\x7c\xf6\x9e\xbd\x68\xb2\xec"
3793 "\x9b\x9f\xe9\xa3\xea\xdd\xa6\x92"
3794 "\xcd\x43\xd2\xf5\x95\x98\xed\x85"
3795 "\x8c\x02\xc2\x65\x2f\xbf\x92\x2e",
3796 .ilen = 32,
3797 .result = "\x00\x00\x00\x00\x00\x00\x00\x00"
3798 "\x00\x00\x00\x00\x00\x00\x00\x00"
3799 "\x00\x00\x00\x00\x00\x00\x00\x00"
3800 "\x00\x00\x00\x00\x00\x00\x00\x00",
3801 .rlen = 32,
3802 }, { /* XTS-AES 2 */
3803 .key = "\x11\x11\x11\x11\x11\x11\x11\x11"
3804 "\x11\x11\x11\x11\x11\x11\x11\x11"
3805 "\x22\x22\x22\x22\x22\x22\x22\x22"
3806 "\x22\x22\x22\x22\x22\x22\x22\x22",
3807 .klen = 32,
3808 .iv = "\x33\x33\x33\x33\x33\x00\x00\x00"
3809 "\x00\x00\x00\x00\x00\x00\x00\x00",
3810 .input = "\xc4\x54\x18\x5e\x6a\x16\x93\x6e"
3811 "\x39\x33\x40\x38\xac\xef\x83\x8b"
3812 "\xfb\x18\x6f\xff\x74\x80\xad\xc4"
3813 "\x28\x93\x82\xec\xd6\xd3\x94\xf0",
3814 .ilen = 32,
3815 .result = "\x44\x44\x44\x44\x44\x44\x44\x44"
3816 "\x44\x44\x44\x44\x44\x44\x44\x44"
3817 "\x44\x44\x44\x44\x44\x44\x44\x44"
3818 "\x44\x44\x44\x44\x44\x44\x44\x44",
3819 .rlen = 32,
3820 }, { /* XTS-AES 3 */
3821 .key = "\xff\xfe\xfd\xfc\xfb\xfa\xf9\xf8"
3822 "\xf7\xf6\xf5\xf4\xf3\xf2\xf1\xf0"
3823 "\x22\x22\x22\x22\x22\x22\x22\x22"
3824 "\x22\x22\x22\x22\x22\x22\x22\x22",
3825 .klen = 32,
3826 .iv = "\x33\x33\x33\x33\x33\x00\x00\x00"
3827 "\x00\x00\x00\x00\x00\x00\x00\x00",
3828 .input = "\xaf\x85\x33\x6b\x59\x7a\xfc\x1a"
3829 "\x90\x0b\x2e\xb2\x1e\xc9\x49\xd2"
3830 "\x92\xdf\x4c\x04\x7e\x0b\x21\x53"
3831 "\x21\x86\xa5\x97\x1a\x22\x7a\x89",
3832 .ilen = 32,
3833 .result = "\x44\x44\x44\x44\x44\x44\x44\x44"
3834 "\x44\x44\x44\x44\x44\x44\x44\x44"
3835 "\x44\x44\x44\x44\x44\x44\x44\x44"
3836 "\x44\x44\x44\x44\x44\x44\x44\x44",
3837 .rlen = 32,
3838 }, { /* XTS-AES 4 */
3839 .key = "\x27\x18\x28\x18\x28\x45\x90\x45"
3840 "\x23\x53\x60\x28\x74\x71\x35\x26"
3841 "\x31\x41\x59\x26\x53\x58\x97\x93"
3842 "\x23\x84\x62\x64\x33\x83\x27\x95",
3843 .klen = 32,
3844 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
3845 "\x00\x00\x00\x00\x00\x00\x00\x00",
3846 .input = "\x27\xa7\x47\x9b\xef\xa1\xd4\x76"
3847 "\x48\x9f\x30\x8c\xd4\xcf\xa6\xe2"
3848 "\xa9\x6e\x4b\xbe\x32\x08\xff\x25"
3849 "\x28\x7d\xd3\x81\x96\x16\xe8\x9c"
3850 "\xc7\x8c\xf7\xf5\xe5\x43\x44\x5f"
3851 "\x83\x33\xd8\xfa\x7f\x56\x00\x00"
3852 "\x05\x27\x9f\xa5\xd8\xb5\xe4\xad"
3853 "\x40\xe7\x36\xdd\xb4\xd3\x54\x12"
3854 "\x32\x80\x63\xfd\x2a\xab\x53\xe5"
3855 "\xea\x1e\x0a\x9f\x33\x25\x00\xa5"
3856 "\xdf\x94\x87\xd0\x7a\x5c\x92\xcc"
3857 "\x51\x2c\x88\x66\xc7\xe8\x60\xce"
3858 "\x93\xfd\xf1\x66\xa2\x49\x12\xb4"
3859 "\x22\x97\x61\x46\xae\x20\xce\x84"
3860 "\x6b\xb7\xdc\x9b\xa9\x4a\x76\x7a"
3861 "\xae\xf2\x0c\x0d\x61\xad\x02\x65"
3862 "\x5e\xa9\x2d\xc4\xc4\xe4\x1a\x89"
3863 "\x52\xc6\x51\xd3\x31\x74\xbe\x51"
3864 "\xa1\x0c\x42\x11\x10\xe6\xd8\x15"
3865 "\x88\xed\xe8\x21\x03\xa2\x52\xd8"
3866 "\xa7\x50\xe8\x76\x8d\xef\xff\xed"
3867 "\x91\x22\x81\x0a\xae\xb9\x9f\x91"
3868 "\x72\xaf\x82\xb6\x04\xdc\x4b\x8e"
3869 "\x51\xbc\xb0\x82\x35\xa6\xf4\x34"
3870 "\x13\x32\xe4\xca\x60\x48\x2a\x4b"
3871 "\xa1\xa0\x3b\x3e\x65\x00\x8f\xc5"
3872 "\xda\x76\xb7\x0b\xf1\x69\x0d\xb4"
3873 "\xea\xe2\x9c\x5f\x1b\xad\xd0\x3c"
3874 "\x5c\xcf\x2a\x55\xd7\x05\xdd\xcd"
3875 "\x86\xd4\x49\x51\x1c\xeb\x7e\xc3"
3876 "\x0b\xf1\x2b\x1f\xa3\x5b\x91\x3f"
3877 "\x9f\x74\x7a\x8a\xfd\x1b\x13\x0e"
3878 "\x94\xbf\xf9\x4e\xff\xd0\x1a\x91"
3879 "\x73\x5c\xa1\x72\x6a\xcd\x0b\x19"
3880 "\x7c\x4e\x5b\x03\x39\x36\x97\xe1"
3881 "\x26\x82\x6f\xb6\xbb\xde\x8e\xcc"
3882 "\x1e\x08\x29\x85\x16\xe2\xc9\xed"
3883 "\x03\xff\x3c\x1b\x78\x60\xf6\xde"
3884 "\x76\xd4\xce\xcd\x94\xc8\x11\x98"
3885 "\x55\xef\x52\x97\xca\x67\xe9\xf3"
3886 "\xe7\xff\x72\xb1\xe9\x97\x85\xca"
3887 "\x0a\x7e\x77\x20\xc5\xb3\x6d\xc6"
3888 "\xd7\x2c\xac\x95\x74\xc8\xcb\xbc"
3889 "\x2f\x80\x1e\x23\xe5\x6f\xd3\x44"
3890 "\xb0\x7f\x22\x15\x4b\xeb\xa0\xf0"
3891 "\x8c\xe8\x89\x1e\x64\x3e\xd9\x95"
3892 "\xc9\x4d\x9a\x69\xc9\xf1\xb5\xf4"
3893 "\x99\x02\x7a\x78\x57\x2a\xee\xbd"
3894 "\x74\xd2\x0c\xc3\x98\x81\xc2\x13"
3895 "\xee\x77\x0b\x10\x10\xe4\xbe\xa7"
3896 "\x18\x84\x69\x77\xae\x11\x9f\x7a"
3897 "\x02\x3a\xb5\x8c\xca\x0a\xd7\x52"
3898 "\xaf\xe6\x56\xbb\x3c\x17\x25\x6a"
3899 "\x9f\x6e\x9b\xf1\x9f\xdd\x5a\x38"
3900 "\xfc\x82\xbb\xe8\x72\xc5\x53\x9e"
3901 "\xdb\x60\x9e\xf4\xf7\x9c\x20\x3e"
3902 "\xbb\x14\x0f\x2e\x58\x3c\xb2\xad"
3903 "\x15\xb4\xaa\x5b\x65\x50\x16\xa8"
3904 "\x44\x92\x77\xdb\xd4\x77\xef\x2c"
3905 "\x8d\x6c\x01\x7d\xb7\x38\xb1\x8d"
3906 "\xeb\x4a\x42\x7d\x19\x23\xce\x3f"
3907 "\xf2\x62\x73\x57\x79\xa4\x18\xf2"
3908 "\x0a\x28\x2d\xf9\x20\x14\x7b\xea"
3909 "\xbe\x42\x1e\xe5\x31\x9d\x05\x68",
3910 .ilen = 512,
3911 .result = "\x00\x01\x02\x03\x04\x05\x06\x07"
3912 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
3913 "\x10\x11\x12\x13\x14\x15\x16\x17"
3914 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
3915 "\x20\x21\x22\x23\x24\x25\x26\x27"
3916 "\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f"
3917 "\x30\x31\x32\x33\x34\x35\x36\x37"
3918 "\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f"
3919 "\x40\x41\x42\x43\x44\x45\x46\x47"
3920 "\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f"
3921 "\x50\x51\x52\x53\x54\x55\x56\x57"
3922 "\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f"
3923 "\x60\x61\x62\x63\x64\x65\x66\x67"
3924 "\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f"
3925 "\x70\x71\x72\x73\x74\x75\x76\x77"
3926 "\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f"
3927 "\x80\x81\x82\x83\x84\x85\x86\x87"
3928 "\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
3929 "\x90\x91\x92\x93\x94\x95\x96\x97"
3930 "\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
3931 "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7"
3932 "\xa8\xa9\xaa\xab\xac\xad\xae\xaf"
3933 "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7"
3934 "\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
3935 "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
3936 "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
3937 "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7"
3938 "\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf"
3939 "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7"
3940 "\xe8\xe9\xea\xeb\xec\xed\xee\xef"
3941 "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7"
3942 "\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"
3943 "\x00\x01\x02\x03\x04\x05\x06\x07"
3944 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
3945 "\x10\x11\x12\x13\x14\x15\x16\x17"
3946 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
3947 "\x20\x21\x22\x23\x24\x25\x26\x27"
3948 "\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f"
3949 "\x30\x31\x32\x33\x34\x35\x36\x37"
3950 "\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f"
3951 "\x40\x41\x42\x43\x44\x45\x46\x47"
3952 "\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f"
3953 "\x50\x51\x52\x53\x54\x55\x56\x57"
3954 "\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f"
3955 "\x60\x61\x62\x63\x64\x65\x66\x67"
3956 "\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f"
3957 "\x70\x71\x72\x73\x74\x75\x76\x77"
3958 "\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f"
3959 "\x80\x81\x82\x83\x84\x85\x86\x87"
3960 "\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
3961 "\x90\x91\x92\x93\x94\x95\x96\x97"
3962 "\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
3963 "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7"
3964 "\xa8\xa9\xaa\xab\xac\xad\xae\xaf"
3965 "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7"
3966 "\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
3967 "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
3968 "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
3969 "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7"
3970 "\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf"
3971 "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7"
3972 "\xe8\xe9\xea\xeb\xec\xed\xee\xef"
3973 "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7"
3974 "\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff",
3975 .rlen = 512,
3976 }
3977};
3978
3979
3980static struct cipher_testvec aes_ctr_enc_tv_template[] = {
3981 { /* From RFC 3686 */
3982 .key = "\xae\x68\x52\xf8\x12\x10\x67\xcc"
3983 "\x4b\xf7\xa5\x76\x55\x77\xf3\x9e"
3984 "\x00\x00\x00\x30",
3985 .klen = 20,
3986 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00",
3987 .input = "Single block msg",
3988 .ilen = 16,
3989 .result = "\xe4\x09\x5d\x4f\xb7\xa7\xb3\x79"
3990 "\x2d\x61\x75\xa3\x26\x13\x11\xb8",
3991 .rlen = 16,
3992 }, {
3993 .key = "\x7e\x24\x06\x78\x17\xfa\xe0\xd7"
3994 "\x43\xd6\xce\x1f\x32\x53\x91\x63"
3995 "\x00\x6c\xb6\xdb",
3996 .klen = 20,
3997 .iv = "\xc0\x54\x3b\x59\xda\x48\xd9\x0b",
3998 .input = "\x00\x01\x02\x03\x04\x05\x06\x07"
3999 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
4000 "\x10\x11\x12\x13\x14\x15\x16\x17"
4001 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
4002 .ilen = 32,
4003 .result = "\x51\x04\xa1\x06\x16\x8a\x72\xd9"
4004 "\x79\x0d\x41\xee\x8e\xda\xd3\x88"
4005 "\xeb\x2e\x1e\xfc\x46\xda\x57\xc8"
4006 "\xfc\xe6\x30\xdf\x91\x41\xbe\x28",
4007 .rlen = 32,
4008 }, {
4009 .key = "\x16\xaf\x5b\x14\x5f\xc9\xf5\x79"
4010 "\xc1\x75\xf9\x3e\x3b\xfb\x0e\xed"
4011 "\x86\x3d\x06\xcc\xfd\xb7\x85\x15"
4012 "\x00\x00\x00\x48",
4013 .klen = 28,
4014 .iv = "\x36\x73\x3c\x14\x7d\x6d\x93\xcb",
4015 .input = "Single block msg",
4016 .ilen = 16,
4017 .result = "\x4b\x55\x38\x4f\xe2\x59\xc9\xc8"
4018 "\x4e\x79\x35\xa0\x03\xcb\xe9\x28",
4019 .rlen = 16,
4020 }, {
4021 .key = "\x7c\x5c\xb2\x40\x1b\x3d\xc3\x3c"
4022 "\x19\xe7\x34\x08\x19\xe0\xf6\x9c"
4023 "\x67\x8c\x3d\xb8\xe6\xf6\xa9\x1a"
4024 "\x00\x96\xb0\x3b",
4025 .klen = 28,
4026 .iv = "\x02\x0c\x6e\xad\xc2\xcb\x50\x0d",
4027 .input = "\x00\x01\x02\x03\x04\x05\x06\x07"
4028 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
4029 "\x10\x11\x12\x13\x14\x15\x16\x17"
4030 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
4031 .ilen = 32,
4032 .result = "\x45\x32\x43\xfc\x60\x9b\x23\x32"
4033 "\x7e\xdf\xaa\xfa\x71\x31\xcd\x9f"
4034 "\x84\x90\x70\x1c\x5a\xd4\xa7\x9c"
4035 "\xfc\x1f\xe0\xff\x42\xf4\xfb\x00",
4036 .rlen = 32,
4037 }, {
4038 .key = "\x77\x6b\xef\xf2\x85\x1d\xb0\x6f"
4039 "\x4c\x8a\x05\x42\xc8\x69\x6f\x6c"
4040 "\x6a\x81\xaf\x1e\xec\x96\xb4\xd3"
4041 "\x7f\xc1\xd6\x89\xe6\xc1\xc1\x04"
4042 "\x00\x00\x00\x60",
4043 .klen = 36,
4044 .iv = "\xdb\x56\x72\xc9\x7a\xa8\xf0\xb2",
4045 .input = "Single block msg",
4046 .ilen = 16,
4047 .result = "\x14\x5a\xd0\x1d\xbf\x82\x4e\xc7"
4048 "\x56\x08\x63\xdc\x71\xe3\xe0\xc0",
4049 .rlen = 16,
4050 }, {
4051 .key = "\xf6\xd6\x6d\x6b\xd5\x2d\x59\xbb"
4052 "\x07\x96\x36\x58\x79\xef\xf8\x86"
4053 "\xc6\x6d\xd5\x1a\x5b\x6a\x99\x74"
4054 "\x4b\x50\x59\x0c\x87\xa2\x38\x84"
4055 "\x00\xfa\xac\x24",
4056 .klen = 36,
4057 .iv = "\xc1\x58\x5e\xf1\x5a\x43\xd8\x75",
4058 .input = "\x00\x01\x02\x03\x04\x05\x06\x07"
4059 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
4060 "\x10\x11\x12\x13\x14\x15\x16\x17"
4061 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
4062 .ilen = 32,
4063 .result = "\xf0\x5e\x23\x1b\x38\x94\x61\x2c"
4064 "\x49\xee\x00\x0b\x80\x4e\xb2\xa9"
4065 "\xb8\x30\x6b\x50\x8f\x83\x9d\x6a"
4066 "\x55\x30\x83\x1d\x93\x44\xaf\x1c",
4067 .rlen = 32,
4068 }, {
4069 // generated using Crypto++
4070 .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
4071 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
4072 "\x10\x11\x12\x13\x14\x15\x16\x17"
4073 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
4074 "\x00\x00\x00\x00",
4075 .klen = 32 + 4,
4076 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00",
4077 .input =
4078 "\x00\x01\x02\x03\x04\x05\x06\x07"
4079 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
4080 "\x10\x11\x12\x13\x14\x15\x16\x17"
4081 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
4082 "\x20\x21\x22\x23\x24\x25\x26\x27"
4083 "\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f"
4084 "\x30\x31\x32\x33\x34\x35\x36\x37"
4085 "\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f"
4086 "\x40\x41\x42\x43\x44\x45\x46\x47"
4087 "\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f"
4088 "\x50\x51\x52\x53\x54\x55\x56\x57"
4089 "\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f"
4090 "\x60\x61\x62\x63\x64\x65\x66\x67"
4091 "\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f"
4092 "\x70\x71\x72\x73\x74\x75\x76\x77"
4093 "\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f"
4094 "\x80\x81\x82\x83\x84\x85\x86\x87"
4095 "\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
4096 "\x90\x91\x92\x93\x94\x95\x96\x97"
4097 "\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
4098 "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7"
4099 "\xa8\xa9\xaa\xab\xac\xad\xae\xaf"
4100 "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7"
4101 "\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
4102 "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
4103 "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
4104 "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7"
4105 "\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf"
4106 "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7"
4107 "\xe8\xe9\xea\xeb\xec\xed\xee\xef"
4108 "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7"
4109 "\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"
4110 "\x00\x03\x06\x09\x0c\x0f\x12\x15"
4111 "\x18\x1b\x1e\x21\x24\x27\x2a\x2d"
4112 "\x30\x33\x36\x39\x3c\x3f\x42\x45"
4113 "\x48\x4b\x4e\x51\x54\x57\x5a\x5d"
4114 "\x60\x63\x66\x69\x6c\x6f\x72\x75"
4115 "\x78\x7b\x7e\x81\x84\x87\x8a\x8d"
4116 "\x90\x93\x96\x99\x9c\x9f\xa2\xa5"
4117 "\xa8\xab\xae\xb1\xb4\xb7\xba\xbd"
4118 "\xc0\xc3\xc6\xc9\xcc\xcf\xd2\xd5"
4119 "\xd8\xdb\xde\xe1\xe4\xe7\xea\xed"
4120 "\xf0\xf3\xf6\xf9\xfc\xff\x02\x05"
4121 "\x08\x0b\x0e\x11\x14\x17\x1a\x1d"
4122 "\x20\x23\x26\x29\x2c\x2f\x32\x35"
4123 "\x38\x3b\x3e\x41\x44\x47\x4a\x4d"
4124 "\x50\x53\x56\x59\x5c\x5f\x62\x65"
4125 "\x68\x6b\x6e\x71\x74\x77\x7a\x7d"
4126 "\x80\x83\x86\x89\x8c\x8f\x92\x95"
4127 "\x98\x9b\x9e\xa1\xa4\xa7\xaa\xad"
4128 "\xb0\xb3\xb6\xb9\xbc\xbf\xc2\xc5"
4129 "\xc8\xcb\xce\xd1\xd4\xd7\xda\xdd"
4130 "\xe0\xe3\xe6\xe9\xec\xef\xf2\xf5"
4131 "\xf8\xfb\xfe\x01\x04\x07\x0a\x0d"
4132 "\x10\x13\x16\x19\x1c\x1f\x22\x25"
4133 "\x28\x2b\x2e\x31\x34\x37\x3a\x3d"
4134 "\x40\x43\x46\x49\x4c\x4f\x52\x55"
4135 "\x58\x5b\x5e\x61\x64\x67\x6a\x6d"
4136 "\x70\x73\x76\x79\x7c\x7f\x82\x85"
4137 "\x88\x8b\x8e\x91\x94\x97\x9a\x9d"
4138 "\xa0\xa3\xa6\xa9\xac\xaf\xb2\xb5"
4139 "\xb8\xbb\xbe\xc1\xc4\xc7\xca\xcd"
4140 "\xd0\xd3\xd6\xd9\xdc\xdf\xe2\xe5"
4141 "\xe8\xeb\xee\xf1\xf4\xf7\xfa\xfd"
4142 "\x00\x05\x0a\x0f\x14\x19\x1e\x23"
4143 "\x28\x2d\x32\x37\x3c\x41\x46\x4b"
4144 "\x50\x55\x5a\x5f\x64\x69\x6e\x73"
4145 "\x78\x7d\x82\x87\x8c\x91\x96\x9b"
4146 "\xa0\xa5\xaa\xaf\xb4\xb9\xbe\xc3"
4147 "\xc8\xcd\xd2\xd7\xdc\xe1\xe6\xeb"
4148 "\xf0\xf5\xfa\xff\x04\x09\x0e\x13"
4149 "\x18\x1d\x22\x27\x2c\x31\x36\x3b"
4150 "\x40\x45\x4a\x4f\x54\x59\x5e\x63"
4151 "\x68\x6d\x72\x77\x7c\x81\x86\x8b"
4152 "\x90\x95\x9a\x9f\xa4\xa9\xae\xb3"
4153 "\xb8\xbd\xc2\xc7\xcc\xd1\xd6\xdb"
4154 "\xe0\xe5\xea\xef\xf4\xf9\xfe\x03"
4155 "\x08\x0d\x12\x17\x1c\x21\x26\x2b"
4156 "\x30\x35\x3a\x3f\x44\x49\x4e\x53"
4157 "\x58\x5d\x62\x67\x6c\x71\x76\x7b"
4158 "\x80\x85\x8a\x8f\x94\x99\x9e\xa3"
4159 "\xa8\xad\xb2\xb7\xbc\xc1\xc6\xcb"
4160 "\xd0\xd5\xda\xdf\xe4\xe9\xee\xf3"
4161 "\xf8\xfd\x02\x07\x0c\x11\x16\x1b"
4162 "\x20\x25\x2a\x2f\x34\x39\x3e\x43"
4163 "\x48\x4d\x52\x57\x5c\x61\x66\x6b"
4164 "\x70\x75\x7a\x7f\x84\x89\x8e\x93"
4165 "\x98\x9d\xa2\xa7\xac\xb1\xb6\xbb"
4166 "\xc0\xc5\xca\xcf\xd4\xd9\xde\xe3"
4167 "\xe8\xed\xf2\xf7\xfc\x01\x06\x0b"
4168 "\x10\x15\x1a\x1f\x24\x29\x2e\x33"
4169 "\x38\x3d\x42\x47\x4c\x51\x56\x5b"
4170 "\x60\x65\x6a\x6f\x74\x79\x7e\x83"
4171 "\x88\x8d\x92\x97\x9c\xa1\xa6\xab"
4172 "\xb0\xb5\xba\xbf\xc4\xc9\xce\xd3"
4173 "\xd8\xdd\xe2\xe7\xec\xf1\xf6\xfb"
4174 "\x00\x07\x0e\x15\x1c\x23\x2a\x31"
4175 "\x38\x3f\x46\x4d\x54\x5b\x62\x69"
4176 "\x70\x77\x7e\x85\x8c\x93\x9a\xa1"
4177 "\xa8\xaf\xb6\xbd\xc4\xcb\xd2\xd9"
4178 "\xe0\xe7\xee\xf5\xfc\x03\x0a\x11"
4179 "\x18\x1f\x26\x2d\x34\x3b\x42\x49"
4180 "\x50\x57\x5e\x65\x6c\x73\x7a\x81"
4181 "\x88\x8f\x96\x9d\xa4\xab\xb2\xb9"
4182 "\xc0\xc7\xce\xd5\xdc\xe3\xea\xf1"
4183 "\xf8\xff\x06\x0d\x14\x1b\x22\x29"
4184 "\x30\x37\x3e\x45\x4c\x53\x5a\x61"
4185 "\x68\x6f\x76\x7d\x84\x8b\x92\x99"
4186 "\xa0\xa7\xae\xb5\xbc\xc3\xca\xd1"
4187 "\xd8\xdf\xe6\xed\xf4\xfb\x02\x09"
4188 "\x10\x17\x1e\x25\x2c\x33\x3a\x41"
4189 "\x48\x4f\x56\x5d\x64\x6b\x72\x79"
4190 "\x80\x87\x8e\x95\x9c\xa3\xaa\xb1"
4191 "\xb8\xbf\xc6\xcd\xd4\xdb\xe2\xe9"
4192 "\xf0\xf7\xfe\x05\x0c\x13\x1a\x21"
4193 "\x28\x2f\x36\x3d\x44\x4b\x52\x59"
4194 "\x60\x67\x6e\x75\x7c\x83\x8a\x91"
4195 "\x98\x9f\xa6\xad\xb4\xbb\xc2\xc9"
4196 "\xd0\xd7\xde\xe5\xec\xf3\xfa\x01"
4197 "\x08\x0f\x16\x1d\x24\x2b\x32\x39"
4198 "\x40\x47\x4e\x55\x5c\x63\x6a\x71"
4199 "\x78\x7f\x86\x8d\x94\x9b\xa2\xa9"
4200 "\xb0\xb7\xbe\xc5\xcc\xd3\xda\xe1"
4201 "\xe8\xef\xf6\xfd\x04\x0b\x12\x19"
4202 "\x20\x27\x2e\x35\x3c\x43\x4a\x51"
4203 "\x58\x5f\x66\x6d\x74\x7b\x82\x89"
4204 "\x90\x97\x9e\xa5\xac\xb3\xba\xc1"
4205 "\xc8\xcf\xd6\xdd\xe4\xeb\xf2\xf9"
4206 "\x00\x09\x12\x1b\x24\x2d\x36\x3f"
4207 "\x48\x51\x5a\x63\x6c\x75\x7e\x87"
4208 "\x90\x99\xa2\xab\xb4\xbd\xc6\xcf"
4209 "\xd8\xe1\xea\xf3\xfc\x05\x0e\x17"
4210 "\x20\x29\x32\x3b\x44\x4d\x56\x5f"
4211 "\x68\x71\x7a\x83\x8c\x95\x9e\xa7"
4212 "\xb0\xb9\xc2\xcb\xd4\xdd\xe6\xef"
4213 "\xf8\x01\x0a\x13\x1c\x25\x2e\x37"
4214 "\x40\x49\x52\x5b\x64\x6d\x76\x7f"
4215 "\x88\x91\x9a\xa3\xac\xb5\xbe\xc7"
4216 "\xd0\xd9\xe2\xeb\xf4\xfd\x06\x0f"
4217 "\x18\x21\x2a\x33\x3c\x45\x4e\x57"
4218 "\x60\x69\x72\x7b\x84\x8d\x96\x9f"
4219 "\xa8\xb1\xba\xc3\xcc\xd5\xde\xe7"
4220 "\xf0\xf9\x02\x0b\x14\x1d\x26\x2f"
4221 "\x38\x41\x4a\x53\x5c\x65\x6e\x77"
4222 "\x80\x89\x92\x9b\xa4\xad\xb6\xbf"
4223 "\xc8\xd1\xda\xe3\xec\xf5\xfe\x07"
4224 "\x10\x19\x22\x2b\x34\x3d\x46\x4f"
4225 "\x58\x61\x6a\x73\x7c\x85\x8e\x97"
4226 "\xa0\xa9\xb2\xbb\xc4\xcd\xd6\xdf"
4227 "\xe8\xf1\xfa\x03\x0c\x15\x1e\x27"
4228 "\x30\x39\x42\x4b\x54\x5d\x66\x6f"
4229 "\x78\x81\x8a\x93\x9c\xa5\xae\xb7"
4230 "\xc0\xc9\xd2\xdb\xe4\xed\xf6\xff"
4231 "\x08\x11\x1a\x23\x2c\x35\x3e\x47"
4232 "\x50\x59\x62\x6b\x74\x7d\x86\x8f"
4233 "\x98\xa1\xaa\xb3\xbc\xc5\xce\xd7"
4234 "\xe0\xe9\xf2\xfb\x04\x0d\x16\x1f"
4235 "\x28\x31\x3a\x43\x4c\x55\x5e\x67"
4236 "\x70\x79\x82\x8b\x94\x9d\xa6\xaf"
4237 "\xb8\xc1\xca\xd3\xdc\xe5\xee\xf7"
4238 "\x00\x0b\x16\x21\x2c\x37\x42\x4d"
4239 "\x58\x63\x6e\x79\x84\x8f\x9a\xa5"
4240 "\xb0\xbb\xc6\xd1\xdc\xe7\xf2\xfd"
4241 "\x08\x13\x1e\x29\x34\x3f\x4a\x55"
4242 "\x60\x6b\x76\x81\x8c\x97\xa2\xad"
4243 "\xb8\xc3\xce\xd9\xe4\xef\xfa\x05"
4244 "\x10\x1b\x26\x31\x3c\x47\x52\x5d"
4245 "\x68\x73\x7e\x89\x94\x9f\xaa\xb5"
4246 "\xc0\xcb\xd6\xe1\xec\xf7\x02\x0d"
4247 "\x18\x23\x2e\x39\x44\x4f\x5a\x65"
4248 "\x70\x7b\x86\x91\x9c\xa7\xb2\xbd"
4249 "\xc8\xd3\xde\xe9\xf4\xff\x0a\x15"
4250 "\x20\x2b\x36\x41\x4c\x57\x62\x6d"
4251 "\x78\x83\x8e\x99\xa4\xaf\xba\xc5"
4252 "\xd0\xdb\xe6\xf1\xfc\x07\x12\x1d"
4253 "\x28\x33\x3e\x49\x54\x5f\x6a\x75"
4254 "\x80\x8b\x96\xa1\xac\xb7\xc2\xcd"
4255 "\xd8\xe3\xee\xf9\x04\x0f\x1a\x25"
4256 "\x30\x3b\x46\x51\x5c\x67\x72\x7d"
4257 "\x88\x93\x9e\xa9\xb4\xbf\xca\xd5"
4258 "\xe0\xeb\xf6\x01\x0c\x17\x22\x2d"
4259 "\x38\x43\x4e\x59\x64\x6f\x7a\x85"
4260 "\x90\x9b\xa6\xb1\xbc\xc7\xd2\xdd"
4261 "\xe8\xf3\xfe\x09\x14\x1f\x2a\x35"
4262 "\x40\x4b\x56\x61\x6c\x77\x82\x8d"
4263 "\x98\xa3\xae\xb9\xc4\xcf\xda\xe5"
4264 "\xf0\xfb\x06\x11\x1c\x27\x32\x3d"
4265 "\x48\x53\x5e\x69\x74\x7f\x8a\x95"
4266 "\xa0\xab\xb6\xc1\xcc\xd7\xe2\xed"
4267 "\xf8\x03\x0e\x19\x24\x2f\x3a\x45"
4268 "\x50\x5b\x66\x71\x7c\x87\x92\x9d"
4269 "\xa8\xb3\xbe\xc9\xd4\xdf\xea\xf5"
4270 "\x00\x0d\x1a\x27\x34\x41\x4e\x5b"
4271 "\x68\x75\x82\x8f\x9c\xa9\xb6\xc3"
4272 "\xd0\xdd\xea\xf7\x04\x11\x1e\x2b"
4273 "\x38\x45\x52\x5f\x6c\x79\x86\x93"
4274 "\xa0\xad\xba\xc7\xd4\xe1\xee\xfb"
4275 "\x08\x15\x22\x2f\x3c\x49\x56\x63"
4276 "\x70\x7d\x8a\x97\xa4\xb1\xbe\xcb"
4277 "\xd8\xe5\xf2\xff\x0c\x19\x26\x33"
4278 "\x40\x4d\x5a\x67\x74\x81\x8e\x9b"
4279 "\xa8\xb5\xc2\xcf\xdc\xe9\xf6\x03"
4280 "\x10\x1d\x2a\x37\x44\x51\x5e\x6b"
4281 "\x78\x85\x92\x9f\xac\xb9\xc6\xd3"
4282 "\xe0\xed\xfa\x07\x14\x21\x2e\x3b"
4283 "\x48\x55\x62\x6f\x7c\x89\x96\xa3"
4284 "\xb0\xbd\xca\xd7\xe4\xf1\xfe\x0b"
4285 "\x18\x25\x32\x3f\x4c\x59\x66\x73"
4286 "\x80\x8d\x9a\xa7\xb4\xc1\xce\xdb"
4287 "\xe8\xf5\x02\x0f\x1c\x29\x36\x43"
4288 "\x50\x5d\x6a\x77\x84\x91\x9e\xab"
4289 "\xb8\xc5\xd2\xdf\xec\xf9\x06\x13"
4290 "\x20\x2d\x3a\x47\x54\x61\x6e\x7b"
4291 "\x88\x95\xa2\xaf\xbc\xc9\xd6\xe3"
4292 "\xf0\xfd\x0a\x17\x24\x31\x3e\x4b"
4293 "\x58\x65\x72\x7f\x8c\x99\xa6\xb3"
4294 "\xc0\xcd\xda\xe7\xf4\x01\x0e\x1b"
4295 "\x28\x35\x42\x4f\x5c\x69\x76\x83"
4296 "\x90\x9d\xaa\xb7\xc4\xd1\xde\xeb"
4297 "\xf8\x05\x12\x1f\x2c\x39\x46\x53"
4298 "\x60\x6d\x7a\x87\x94\xa1\xae\xbb"
4299 "\xc8\xd5\xe2\xef\xfc\x09\x16\x23"
4300 "\x30\x3d\x4a\x57\x64\x71\x7e\x8b"
4301 "\x98\xa5\xb2\xbf\xcc\xd9\xe6\xf3"
4302 "\x00\x0f\x1e\x2d\x3c\x4b\x5a\x69"
4303 "\x78\x87\x96\xa5\xb4\xc3\xd2\xe1"
4304 "\xf0\xff\x0e\x1d\x2c\x3b\x4a\x59"
4305 "\x68\x77\x86\x95\xa4\xb3\xc2\xd1"
4306 "\xe0\xef\xfe\x0d\x1c\x2b\x3a\x49"
4307 "\x58\x67\x76\x85\x94\xa3\xb2\xc1"
4308 "\xd0\xdf\xee\xfd\x0c\x1b\x2a\x39"
4309 "\x48\x57\x66\x75\x84\x93\xa2\xb1"
4310 "\xc0\xcf\xde\xed\xfc\x0b\x1a\x29"
4311 "\x38\x47\x56\x65\x74\x83\x92\xa1"
4312 "\xb0\xbf\xce\xdd\xec\xfb\x0a\x19"
4313 "\x28\x37\x46\x55\x64\x73\x82\x91"
4314 "\xa0\xaf\xbe\xcd\xdc\xeb\xfa\x09"
4315 "\x18\x27\x36\x45\x54\x63\x72\x81"
4316 "\x90\x9f\xae\xbd\xcc\xdb\xea\xf9"
4317 "\x08\x17\x26\x35\x44\x53\x62\x71"
4318 "\x80\x8f\x9e\xad\xbc\xcb\xda\xe9"
4319 "\xf8\x07\x16\x25\x34\x43\x52\x61"
4320 "\x70\x7f\x8e\x9d\xac\xbb\xca\xd9"
4321 "\xe8\xf7\x06\x15\x24\x33\x42\x51"
4322 "\x60\x6f\x7e\x8d\x9c\xab\xba\xc9"
4323 "\xd8\xe7\xf6\x05\x14\x23\x32\x41"
4324 "\x50\x5f\x6e\x7d\x8c\x9b\xaa\xb9"
4325 "\xc8\xd7\xe6\xf5\x04\x13\x22\x31"
4326 "\x40\x4f\x5e\x6d\x7c\x8b\x9a\xa9"
4327 "\xb8\xc7\xd6\xe5\xf4\x03\x12\x21"
4328 "\x30\x3f\x4e\x5d\x6c\x7b\x8a\x99"
4329 "\xa8\xb7\xc6\xd5\xe4\xf3\x02\x11"
4330 "\x20\x2f\x3e\x4d\x5c\x6b\x7a\x89"
4331 "\x98\xa7\xb6\xc5\xd4\xe3\xf2\x01"
4332 "\x10\x1f\x2e\x3d\x4c\x5b\x6a\x79"
4333 "\x88\x97\xa6\xb5\xc4\xd3\xe2\xf1"
4334 "\x00\x11\x22\x33\x44\x55\x66\x77"
4335 "\x88\x99\xaa\xbb\xcc\xdd\xee\xff"
4336 "\x10\x21\x32\x43\x54\x65\x76\x87"
4337 "\x98\xa9\xba\xcb\xdc\xed\xfe\x0f"
4338 "\x20\x31\x42\x53\x64\x75\x86\x97"
4339 "\xa8\xb9\xca\xdb\xec\xfd\x0e\x1f"
4340 "\x30\x41\x52\x63\x74\x85\x96\xa7"
4341 "\xb8\xc9\xda\xeb\xfc\x0d\x1e\x2f"
4342 "\x40\x51\x62\x73\x84\x95\xa6\xb7"
4343 "\xc8\xd9\xea\xfb\x0c\x1d\x2e\x3f"
4344 "\x50\x61\x72\x83\x94\xa5\xb6\xc7"
4345 "\xd8\xe9\xfa\x0b\x1c\x2d\x3e\x4f"
4346 "\x60\x71\x82\x93\xa4\xb5\xc6\xd7"
4347 "\xe8\xf9\x0a\x1b\x2c\x3d\x4e\x5f"
4348 "\x70\x81\x92\xa3\xb4\xc5\xd6\xe7"
4349 "\xf8\x09\x1a\x2b\x3c\x4d\x5e\x6f"
4350 "\x80\x91\xa2\xb3\xc4\xd5\xe6\xf7"
4351 "\x08\x19\x2a\x3b\x4c\x5d\x6e\x7f"
4352 "\x90\xa1\xb2\xc3\xd4\xe5\xf6\x07"
4353 "\x18\x29\x3a\x4b\x5c\x6d\x7e\x8f"
4354 "\xa0\xb1\xc2\xd3\xe4\xf5\x06\x17"
4355 "\x28\x39\x4a\x5b\x6c\x7d\x8e\x9f"
4356 "\xb0\xc1\xd2\xe3\xf4\x05\x16\x27"
4357 "\x38\x49\x5a\x6b\x7c\x8d\x9e\xaf"
4358 "\xc0\xd1\xe2\xf3\x04\x15\x26\x37"
4359 "\x48\x59\x6a\x7b\x8c\x9d\xae\xbf"
4360 "\xd0\xe1\xf2\x03\x14\x25\x36\x47"
4361 "\x58\x69\x7a\x8b\x9c\xad\xbe\xcf"
4362 "\xe0\xf1\x02\x13\x24\x35\x46\x57"
4363 "\x68\x79\x8a\x9b\xac\xbd\xce\xdf"
4364 "\xf0\x01\x12\x23\x34\x45\x56\x67"
4365 "\x78\x89\x9a\xab\xbc\xcd\xde\xef"
4366 "\x00\x13\x26\x39\x4c\x5f\x72\x85"
4367 "\x98\xab\xbe\xd1\xe4\xf7\x0a\x1d"
4368 "\x30\x43\x56\x69\x7c\x8f\xa2\xb5"
4369 "\xc8\xdb\xee\x01\x14\x27\x3a\x4d"
4370 "\x60\x73\x86\x99\xac\xbf\xd2\xe5"
4371 "\xf8\x0b\x1e\x31\x44\x57\x6a\x7d"
4372 "\x90\xa3\xb6\xc9\xdc\xef\x02\x15"
4373 "\x28\x3b\x4e\x61\x74\x87\x9a\xad"
4374 "\xc0\xd3\xe6\xf9\x0c\x1f\x32\x45"
4375 "\x58\x6b\x7e\x91\xa4\xb7\xca\xdd"
4376 "\xf0\x03\x16\x29\x3c\x4f\x62\x75"
4377 "\x88\x9b\xae\xc1\xd4\xe7\xfa\x0d"
4378 "\x20\x33\x46\x59\x6c\x7f\x92\xa5"
4379 "\xb8\xcb\xde\xf1\x04\x17\x2a\x3d"
4380 "\x50\x63\x76\x89\x9c\xaf\xc2\xd5"
4381 "\xe8\xfb\x0e\x21\x34\x47\x5a\x6d"
4382 "\x80\x93\xa6\xb9\xcc\xdf\xf2\x05"
4383 "\x18\x2b\x3e\x51\x64\x77\x8a\x9d"
4384 "\xb0\xc3\xd6\xe9\xfc\x0f\x22\x35"
4385 "\x48\x5b\x6e\x81\x94\xa7\xba\xcd"
4386 "\xe0\xf3\x06\x19\x2c\x3f\x52\x65"
4387 "\x78\x8b\x9e\xb1\xc4\xd7\xea\xfd"
4388 "\x10\x23\x36\x49\x5c\x6f\x82\x95"
4389 "\xa8\xbb\xce\xe1\xf4\x07\x1a\x2d"
4390 "\x40\x53\x66\x79\x8c\x9f\xb2\xc5"
4391 "\xd8\xeb\xfe\x11\x24\x37\x4a\x5d"
4392 "\x70\x83\x96\xa9\xbc\xcf\xe2\xf5"
4393 "\x08\x1b\x2e\x41\x54\x67\x7a\x8d"
4394 "\xa0\xb3\xc6\xd9\xec\xff\x12\x25"
4395 "\x38\x4b\x5e\x71\x84\x97\xaa\xbd"
4396 "\xd0\xe3\xf6\x09\x1c\x2f\x42\x55"
4397 "\x68\x7b\x8e\xa1\xb4\xc7\xda\xed"
4398 "\x00\x15\x2a\x3f\x54\x69\x7e\x93"
4399 "\xa8\xbd\xd2\xe7\xfc\x11\x26\x3b"
4400 "\x50\x65\x7a\x8f\xa4\xb9\xce\xe3"
4401 "\xf8\x0d\x22\x37\x4c\x61\x76\x8b"
4402 "\xa0\xb5\xca\xdf\xf4\x09\x1e\x33"
4403 "\x48\x5d\x72\x87\x9c\xb1\xc6\xdb"
4404 "\xf0\x05\x1a\x2f\x44\x59\x6e\x83"
4405 "\x98\xad\xc2\xd7\xec\x01\x16\x2b"
4406 "\x40\x55\x6a\x7f\x94\xa9\xbe\xd3"
4407 "\xe8\xfd\x12\x27\x3c\x51\x66\x7b"
4408 "\x90\xa5\xba\xcf\xe4\xf9\x0e\x23"
4409 "\x38\x4d\x62\x77\x8c\xa1\xb6\xcb"
4410 "\xe0\xf5\x0a\x1f\x34\x49\x5e\x73"
4411 "\x88\x9d\xb2\xc7\xdc\xf1\x06\x1b"
4412 "\x30\x45\x5a\x6f\x84\x99\xae\xc3"
4413 "\xd8\xed\x02\x17\x2c\x41\x56\x6b"
4414 "\x80\x95\xaa\xbf\xd4\xe9\xfe\x13"
4415 "\x28\x3d\x52\x67\x7c\x91\xa6\xbb"
4416 "\xd0\xe5\xfa\x0f\x24\x39\x4e\x63"
4417 "\x78\x8d\xa2\xb7\xcc\xe1\xf6\x0b"
4418 "\x20\x35\x4a\x5f\x74\x89\x9e\xb3"
4419 "\xc8\xdd\xf2\x07\x1c\x31\x46\x5b"
4420 "\x70\x85\x9a\xaf\xc4\xd9\xee\x03"
4421 "\x18\x2d\x42\x57\x6c\x81\x96\xab"
4422 "\xc0\xd5\xea\xff\x14\x29\x3e\x53"
4423 "\x68\x7d\x92\xa7\xbc\xd1\xe6\xfb"
4424 "\x10\x25\x3a\x4f\x64\x79\x8e\xa3"
4425 "\xb8\xcd\xe2\xf7\x0c\x21\x36\x4b"
4426 "\x60\x75\x8a\x9f\xb4\xc9\xde\xf3"
4427 "\x08\x1d\x32\x47\x5c\x71\x86\x9b"
4428 "\xb0\xc5\xda\xef\x04\x19\x2e\x43"
4429 "\x58\x6d\x82\x97\xac\xc1\xd6\xeb"
4430 "\x00\x17\x2e\x45\x5c\x73\x8a\xa1"
4431 "\xb8\xcf\xe6\xfd\x14\x2b\x42\x59"
4432 "\x70\x87\x9e\xb5\xcc\xe3\xfa\x11"
4433 "\x28\x3f\x56\x6d\x84\x9b\xb2\xc9"
4434 "\xe0\xf7\x0e\x25\x3c\x53\x6a\x81"
4435 "\x98\xaf\xc6\xdd\xf4\x0b\x22\x39"
4436 "\x50\x67\x7e\x95\xac\xc3\xda\xf1"
4437 "\x08\x1f\x36\x4d\x64\x7b\x92\xa9"
4438 "\xc0\xd7\xee\x05\x1c\x33\x4a\x61"
4439 "\x78\x8f\xa6\xbd\xd4\xeb\x02\x19"
4440 "\x30\x47\x5e\x75\x8c\xa3\xba\xd1"
4441 "\xe8\xff\x16\x2d\x44\x5b\x72\x89"
4442 "\xa0\xb7\xce\xe5\xfc\x13\x2a\x41"
4443 "\x58\x6f\x86\x9d\xb4\xcb\xe2\xf9"
4444 "\x10\x27\x3e\x55\x6c\x83\x9a\xb1"
4445 "\xc8\xdf\xf6\x0d\x24\x3b\x52\x69"
4446 "\x80\x97\xae\xc5\xdc\xf3\x0a\x21"
4447 "\x38\x4f\x66\x7d\x94\xab\xc2\xd9"
4448 "\xf0\x07\x1e\x35\x4c\x63\x7a\x91"
4449 "\xa8\xbf\xd6\xed\x04\x1b\x32\x49"
4450 "\x60\x77\x8e\xa5\xbc\xd3\xea\x01"
4451 "\x18\x2f\x46\x5d\x74\x8b\xa2\xb9"
4452 "\xd0\xe7\xfe\x15\x2c\x43\x5a\x71"
4453 "\x88\x9f\xb6\xcd\xe4\xfb\x12\x29"
4454 "\x40\x57\x6e\x85\x9c\xb3\xca\xe1"
4455 "\xf8\x0f\x26\x3d\x54\x6b\x82\x99"
4456 "\xb0\xc7\xde\xf5\x0c\x23\x3a\x51"
4457 "\x68\x7f\x96\xad\xc4\xdb\xf2\x09"
4458 "\x20\x37\x4e\x65\x7c\x93\xaa\xc1"
4459 "\xd8\xef\x06\x1d\x34\x4b\x62\x79"
4460 "\x90\xa7\xbe\xd5\xec\x03\x1a\x31"
4461 "\x48\x5f\x76\x8d\xa4\xbb\xd2\xe9"
4462 "\x00\x19\x32\x4b\x64\x7d\x96\xaf"
4463 "\xc8\xe1\xfa\x13\x2c\x45\x5e\x77"
4464 "\x90\xa9\xc2\xdb\xf4\x0d\x26\x3f"
4465 "\x58\x71\x8a\xa3\xbc\xd5\xee\x07"
4466 "\x20\x39\x52\x6b\x84\x9d\xb6\xcf"
4467 "\xe8\x01\x1a\x33\x4c\x65\x7e\x97"
4468 "\xb0\xc9\xe2\xfb\x14\x2d\x46\x5f"
4469 "\x78\x91\xaa\xc3\xdc\xf5\x0e\x27"
4470 "\x40\x59\x72\x8b\xa4\xbd\xd6\xef"
4471 "\x08\x21\x3a\x53\x6c\x85\x9e\xb7"
4472 "\xd0\xe9\x02\x1b\x34\x4d\x66\x7f"
4473 "\x98\xb1\xca\xe3\xfc\x15\x2e\x47"
4474 "\x60\x79\x92\xab\xc4\xdd\xf6\x0f"
4475 "\x28\x41\x5a\x73\x8c\xa5\xbe\xd7"
4476 "\xf0\x09\x22\x3b\x54\x6d\x86\x9f"
4477 "\xb8\xd1\xea\x03\x1c\x35\x4e\x67"
4478 "\x80\x99\xb2\xcb\xe4\xfd\x16\x2f"
4479 "\x48\x61\x7a\x93\xac\xc5\xde\xf7"
4480 "\x10\x29\x42\x5b\x74\x8d\xa6\xbf"
4481 "\xd8\xf1\x0a\x23\x3c\x55\x6e\x87"
4482 "\xa0\xb9\xd2\xeb\x04\x1d\x36\x4f"
4483 "\x68\x81\x9a\xb3\xcc\xe5\xfe\x17"
4484 "\x30\x49\x62\x7b\x94\xad\xc6\xdf"
4485 "\xf8\x11\x2a\x43\x5c\x75\x8e\xa7"
4486 "\xc0\xd9\xf2\x0b\x24\x3d\x56\x6f"
4487 "\x88\xa1\xba\xd3\xec\x05\x1e\x37"
4488 "\x50\x69\x82\x9b\xb4\xcd\xe6\xff"
4489 "\x18\x31\x4a\x63\x7c\x95\xae\xc7"
4490 "\xe0\xf9\x12\x2b\x44\x5d\x76\x8f"
4491 "\xa8\xc1\xda\xf3\x0c\x25\x3e\x57"
4492 "\x70\x89\xa2\xbb\xd4\xed\x06\x1f"
4493 "\x38\x51\x6a\x83\x9c\xb5\xce\xe7"
4494 "\x00\x1b\x36\x51\x6c\x87\xa2\xbd"
4495 "\xd8\xf3\x0e\x29\x44\x5f\x7a\x95"
4496 "\xb0\xcb\xe6\x01\x1c\x37\x52\x6d"
4497 "\x88\xa3\xbe\xd9\xf4\x0f\x2a\x45"
4498 "\x60\x7b\x96\xb1\xcc\xe7\x02\x1d"
4499 "\x38\x53\x6e\x89\xa4\xbf\xda\xf5"
4500 "\x10\x2b\x46\x61\x7c\x97\xb2\xcd"
4501 "\xe8\x03\x1e\x39\x54\x6f\x8a\xa5"
4502 "\xc0\xdb\xf6\x11\x2c\x47\x62\x7d"
4503 "\x98\xb3\xce\xe9\x04\x1f\x3a\x55"
4504 "\x70\x8b\xa6\xc1\xdc\xf7\x12\x2d"
4505 "\x48\x63\x7e\x99\xb4\xcf\xea\x05"
4506 "\x20\x3b\x56\x71\x8c\xa7\xc2\xdd"
4507 "\xf8\x13\x2e\x49\x64\x7f\x9a\xb5"
4508 "\xd0\xeb\x06\x21\x3c\x57\x72\x8d"
4509 "\xa8\xc3\xde\xf9\x14\x2f\x4a\x65"
4510 "\x80\x9b\xb6\xd1\xec\x07\x22\x3d"
4511 "\x58\x73\x8e\xa9\xc4\xdf\xfa\x15"
4512 "\x30\x4b\x66\x81\x9c\xb7\xd2\xed"
4513 "\x08\x23\x3e\x59\x74\x8f\xaa\xc5"
4514 "\xe0\xfb\x16\x31\x4c\x67\x82\x9d"
4515 "\xb8\xd3\xee\x09\x24\x3f\x5a\x75"
4516 "\x90\xab\xc6\xe1\xfc\x17\x32\x4d"
4517 "\x68\x83\x9e\xb9\xd4\xef\x0a\x25"
4518 "\x40\x5b\x76\x91\xac\xc7\xe2\xfd"
4519 "\x18\x33\x4e\x69\x84\x9f\xba\xd5"
4520 "\xf0\x0b\x26\x41\x5c\x77\x92\xad"
4521 "\xc8\xe3\xfe\x19\x34\x4f\x6a\x85"
4522 "\xa0\xbb\xd6\xf1\x0c\x27\x42\x5d"
4523 "\x78\x93\xae\xc9\xe4\xff\x1a\x35"
4524 "\x50\x6b\x86\xa1\xbc\xd7\xf2\x0d"
4525 "\x28\x43\x5e\x79\x94\xaf\xca\xe5"
4526 "\x00\x1d\x3a\x57\x74\x91\xae\xcb"
4527 "\xe8\x05\x22\x3f\x5c\x79\x96\xb3"
4528 "\xd0\xed\x0a\x27\x44\x61\x7e\x9b"
4529 "\xb8\xd5\xf2\x0f\x2c\x49\x66\x83"
4530 "\xa0\xbd\xda\xf7\x14\x31\x4e\x6b"
4531 "\x88\xa5\xc2\xdf\xfc\x19\x36\x53"
4532 "\x70\x8d\xaa\xc7\xe4\x01\x1e\x3b"
4533 "\x58\x75\x92\xaf\xcc\xe9\x06\x23"
4534 "\x40\x5d\x7a\x97\xb4\xd1\xee\x0b"
4535 "\x28\x45\x62\x7f\x9c\xb9\xd6\xf3"
4536 "\x10\x2d\x4a\x67\x84\xa1\xbe\xdb"
4537 "\xf8\x15\x32\x4f\x6c\x89\xa6\xc3"
4538 "\xe0\xfd\x1a\x37\x54\x71\x8e\xab"
4539 "\xc8\xe5\x02\x1f\x3c\x59\x76\x93"
4540 "\xb0\xcd\xea\x07\x24\x41\x5e\x7b"
4541 "\x98\xb5\xd2\xef\x0c\x29\x46\x63"
4542 "\x80\x9d\xba\xd7\xf4\x11\x2e\x4b"
4543 "\x68\x85\xa2\xbf\xdc\xf9\x16\x33"
4544 "\x50\x6d\x8a\xa7\xc4\xe1\xfe\x1b"
4545 "\x38\x55\x72\x8f\xac\xc9\xe6\x03"
4546 "\x20\x3d\x5a\x77\x94\xb1\xce\xeb"
4547 "\x08\x25\x42\x5f\x7c\x99\xb6\xd3"
4548 "\xf0\x0d\x2a\x47\x64\x81\x9e\xbb"
4549 "\xd8\xf5\x12\x2f\x4c\x69\x86\xa3"
4550 "\xc0\xdd\xfa\x17\x34\x51\x6e\x8b"
4551 "\xa8\xc5\xe2\xff\x1c\x39\x56\x73"
4552 "\x90\xad\xca\xe7\x04\x21\x3e\x5b"
4553 "\x78\x95\xb2\xcf\xec\x09\x26\x43"
4554 "\x60\x7d\x9a\xb7\xd4\xf1\x0e\x2b"
4555 "\x48\x65\x82\x9f\xbc\xd9\xf6\x13"
4556 "\x30\x4d\x6a\x87\xa4\xc1\xde\xfb"
4557 "\x18\x35\x52\x6f\x8c\xa9\xc6\xe3"
4558 "\x00\x1f\x3e\x5d\x7c\x9b\xba\xd9"
4559 "\xf8\x17\x36\x55\x74\x93\xb2\xd1"
4560 "\xf0\x0f\x2e\x4d\x6c\x8b\xaa\xc9"
4561 "\xe8\x07\x26\x45\x64\x83\xa2\xc1"
4562 "\xe0\xff\x1e\x3d\x5c\x7b\x9a\xb9"
4563 "\xd8\xf7\x16\x35\x54\x73\x92\xb1"
4564 "\xd0\xef\x0e\x2d\x4c\x6b\x8a\xa9"
4565 "\xc8\xe7\x06\x25\x44\x63\x82\xa1"
4566 "\xc0\xdf\xfe\x1d\x3c\x5b\x7a\x99"
4567 "\xb8\xd7\xf6\x15\x34\x53\x72\x91"
4568 "\xb0\xcf\xee\x0d\x2c\x4b\x6a\x89"
4569 "\xa8\xc7\xe6\x05\x24\x43\x62\x81"
4570 "\xa0\xbf\xde\xfd\x1c\x3b\x5a\x79"
4571 "\x98\xb7\xd6\xf5\x14\x33\x52\x71"
4572 "\x90\xaf\xce\xed\x0c\x2b\x4a\x69"
4573 "\x88\xa7\xc6\xe5\x04\x23\x42\x61"
4574 "\x80\x9f\xbe\xdd\xfc\x1b\x3a\x59"
4575 "\x78\x97\xb6\xd5\xf4\x13\x32\x51"
4576 "\x70\x8f\xae\xcd\xec\x0b\x2a\x49"
4577 "\x68\x87\xa6\xc5\xe4\x03\x22\x41"
4578 "\x60\x7f\x9e\xbd\xdc\xfb\x1a\x39"
4579 "\x58\x77\x96\xb5\xd4\xf3\x12\x31"
4580 "\x50\x6f\x8e\xad\xcc\xeb\x0a\x29"
4581 "\x48\x67\x86\xa5\xc4\xe3\x02\x21"
4582 "\x40\x5f\x7e\x9d\xbc\xdb\xfa\x19"
4583 "\x38\x57\x76\x95\xb4\xd3\xf2\x11"
4584 "\x30\x4f\x6e\x8d\xac\xcb\xea\x09"
4585 "\x28\x47\x66\x85\xa4\xc3\xe2\x01"
4586 "\x20\x3f\x5e\x7d\x9c\xbb\xda\xf9"
4587 "\x18\x37\x56\x75\x94\xb3\xd2\xf1"
4588 "\x10\x2f\x4e\x6d\x8c\xab\xca\xe9"
4589 "\x08\x27\x46\x65\x84\xa3\xc2\xe1"
4590 "\x00\x21\x42\x63",
4591 .ilen = 4100,
4592 .result =
4593 "\xf0\x5c\x74\xad\x4e\xbc\x99\xe2"
4594 "\xae\xff\x91\x3a\x44\xcf\x38\x32"
4595 "\x1e\xad\xa7\xcd\xa1\x39\x95\xaa"
4596 "\x10\xb1\xb3\x2e\x04\x31\x8f\x86"
4597 "\xf2\x62\x74\x70\x0c\xa4\x46\x08"
4598 "\xa8\xb7\x99\xa8\xe9\xd2\x73\x79"
4599 "\x7e\x6e\xd4\x8f\x1e\xc7\x8e\x31"
4600 "\x0b\xfa\x4b\xce\xfd\xf3\x57\x71"
4601 "\xe9\x46\x03\xa5\x3d\x34\x00\xe2"
4602 "\x18\xff\x75\x6d\x06\x2d\x00\xab"
4603 "\xb9\x3e\x6c\x59\xc5\x84\x06\xb5"
4604 "\x8b\xd0\x89\x9c\x4a\x79\x16\xc6"
4605 "\x3d\x74\x54\xfa\x44\xcd\x23\x26"
4606 "\x5c\xcf\x7e\x28\x92\x32\xbf\xdf"
4607 "\xa7\x20\x3c\x74\x58\x2a\x9a\xde"
4608 "\x61\x00\x1c\x4f\xff\x59\xc4\x22"
4609 "\xac\x3c\xd0\xe8\x6c\xf9\x97\x1b"
4610 "\x58\x9b\xad\x71\xe8\xa9\xb5\x0d"
4611 "\xee\x2f\x04\x1f\x7f\xbc\x99\xee"
4612 "\x84\xff\x42\x60\xdc\x3a\x18\xa5"
4613 "\x81\xf9\xef\xdc\x7a\x0f\x65\x41"
4614 "\x2f\xa3\xd3\xf9\xc2\xcb\xc0\x4d"
4615 "\x8f\xd3\x76\x96\xad\x49\x6d\x38"
4616 "\x3d\x39\x0b\x6c\x80\xb7\x54\x69"
4617 "\xf0\x2c\x90\x02\x29\x0d\x1c\x12"
4618 "\xad\x55\xc3\x8b\x68\xd9\xcc\xb3"
4619 "\xb2\x64\x33\x90\x5e\xca\x4b\xe2"
4620 "\xfb\x75\xdc\x63\xf7\x9f\x82\x74"
4621 "\xf0\xc9\xaa\x7f\xe9\x2a\x9b\x33"
4622 "\xbc\x88\x00\x7f\xca\xb2\x1f\x14"
4623 "\xdb\xc5\x8e\x7b\x11\x3c\x3e\x08"
4624 "\xf3\x83\xe8\xe0\x94\x86\x2e\x92"
4625 "\x78\x6b\x01\xc9\xc7\x83\xba\x21"
4626 "\x6a\x25\x15\x33\x4e\x45\x08\xec"
4627 "\x35\xdb\xe0\x6e\x31\x51\x79\xa9"
4628 "\x42\x44\x65\xc1\xa0\xf1\xf9\x2a"
4629 "\x70\xd5\xb6\xc6\xc1\x8c\x39\xfc"
4630 "\x25\xa6\x55\xd9\xdd\x2d\x4c\xec"
4631 "\x49\xc6\xeb\x0e\xa8\x25\x2a\x16"
4632 "\x1b\x66\x84\xda\xe2\x92\xe5\xc0"
4633 "\xc8\x53\x07\xaf\x80\x84\xec\xfd"
4634 "\xcd\xd1\x6e\xcd\x6f\x6a\xf5\x36"
4635 "\xc5\x15\xe5\x25\x7d\x77\xd1\x1a"
4636 "\x93\x36\xa9\xcf\x7c\xa4\x54\x4a"
4637 "\x06\x51\x48\x4e\xf6\x59\x87\xd2"
4638 "\x04\x02\xef\xd3\x44\xde\x76\x31"
4639 "\xb3\x34\x17\x1b\x9d\x66\x11\x9f"
4640 "\x1e\xcc\x17\xe9\xc7\x3c\x1b\xe7"
4641 "\xcb\x50\x08\xfc\xdc\x2b\x24\xdb"
4642 "\x65\x83\xd0\x3b\xe3\x30\xea\x94"
4643 "\x6c\xe7\xe8\x35\x32\xc7\xdb\x64"
4644 "\xb4\x01\xab\x36\x2c\x77\x13\xaf"
4645 "\xf8\x2b\x88\x3f\x54\x39\xc4\x44"
4646 "\xfe\xef\x6f\x68\x34\xbe\x0f\x05"
4647 "\x16\x6d\xf6\x0a\x30\xe7\xe3\xed"
4648 "\xc4\xde\x3c\x1b\x13\xd8\xdb\xfe"
4649 "\x41\x62\xe5\x28\xd4\x8d\xa3\xc7"
4650 "\x93\x97\xc6\x48\x45\x1d\x9f\x83"
4651 "\xdf\x4b\x40\x3e\x42\x25\x87\x80"
4652 "\x4c\x7d\xa8\xd4\x98\x23\x95\x75"
4653 "\x41\x8c\xda\x41\x9b\xd4\xa7\x06"
4654 "\xb5\xf1\x71\x09\x53\xbe\xca\xbf"
4655 "\x32\x03\xed\xf0\x50\x1c\x56\x39"
4656 "\x5b\xa4\x75\x18\xf7\x9b\x58\xef"
4657 "\x53\xfc\x2a\x38\x23\x15\x75\xcd"
4658 "\x45\xe5\x5a\x82\x55\xba\x21\xfa"
4659 "\xd4\xbd\xc6\x94\x7c\xc5\x80\x12"
4660 "\xf7\x4b\x32\xc4\x9a\x82\xd8\x28"
4661 "\x8f\xd9\xc2\x0f\x60\x03\xbe\x5e"
4662 "\x21\xd6\x5f\x58\xbf\x5c\xb1\x32"
4663 "\x82\x8d\xa9\xe5\xf2\x66\x1a\xc0"
4664 "\xa0\xbc\x58\x2f\x71\xf5\x2f\xed"
4665 "\xd1\x26\xb9\xd8\x49\x5a\x07\x19"
4666 "\x01\x7c\x59\xb0\xf8\xa4\xb7\xd3"
4667 "\x7b\x1a\x8c\x38\xf4\x50\xa4\x59"
4668 "\xb0\xcc\x41\x0b\x88\x7f\xe5\x31"
4669 "\xb3\x42\xba\xa2\x7e\xd4\x32\x71"
4670 "\x45\x87\x48\xa9\xc2\xf2\x89\xb3"
4671 "\xe4\xa7\x7e\x52\x15\x61\xfa\xfe"
4672 "\xc9\xdd\x81\xeb\x13\xab\xab\xc3"
4673 "\x98\x59\xd8\x16\x3d\x14\x7a\x1c"
4674 "\x3c\x41\x9a\x16\x16\x9b\xd2\xd2"
4675 "\x69\x3a\x29\x23\xac\x86\x32\xa5"
4676 "\x48\x9c\x9e\xf3\x47\x77\x81\x70"
4677 "\x24\xe8\x85\xd2\xf5\xb5\xfa\xff"
4678 "\x59\x6a\xd3\x50\x59\x43\x59\xde"
4679 "\xd9\xf1\x55\xa5\x0c\xc3\x1a\x1a"
4680 "\x18\x34\x0d\x1a\x63\x33\xed\x10"
4681 "\xe0\x1d\x2a\x18\xd2\xc0\x54\xa8"
4682 "\xca\xb5\x9a\xd3\xdd\xca\x45\x84"
4683 "\x50\xe7\x0f\xfe\xa4\x99\x5a\xbe"
4684 "\x43\x2d\x9a\xcb\x92\x3f\x5a\x1d"
4685 "\x85\xd8\xc9\xdf\x68\xc9\x12\x80"
4686 "\x56\x0c\xdc\x00\xdc\x3a\x7d\x9d"
4687 "\xa3\xa2\xe8\x4d\xbf\xf9\x70\xa0"
4688 "\xa4\x13\x4f\x6b\xaf\x0a\x89\x7f"
4689 "\xda\xf0\xbf\x9b\xc8\x1d\xe5\xf8"
4690 "\x2e\x8b\x07\xb5\x73\x1b\xcc\xa2"
4691 "\xa6\xad\x30\xbc\x78\x3c\x5b\x10"
4692 "\xfa\x5e\x62\x2d\x9e\x64\xb3\x33"
4693 "\xce\xf9\x1f\x86\xe7\x8b\xa2\xb8"
4694 "\xe8\x99\x57\x8c\x11\xed\x66\xd9"
4695 "\x3c\x72\xb9\xc3\xe6\x4e\x17\x3a"
4696 "\x6a\xcb\x42\x24\x06\xed\x3e\x4e"
4697 "\xa3\xe8\x6a\x94\xda\x0d\x4e\xd5"
4698 "\x14\x19\xcf\xb6\x26\xd8\x2e\xcc"
4699 "\x64\x76\x38\x49\x4d\xfe\x30\x6d"
4700 "\xe4\xc8\x8c\x7b\xc4\xe0\x35\xba"
4701 "\x22\x6e\x76\xe1\x1a\xf2\x53\xc3"
4702 "\x28\xa2\x82\x1f\x61\x69\xad\xc1"
4703 "\x7b\x28\x4b\x1e\x6c\x85\x95\x9b"
4704 "\x51\xb5\x17\x7f\x12\x69\x8c\x24"
4705 "\xd5\xc7\x5a\x5a\x11\x54\xff\x5a"
4706 "\xf7\x16\xc3\x91\xa6\xf0\xdc\x0a"
4707 "\xb6\xa7\x4a\x0d\x7a\x58\xfe\xa5"
4708 "\xf5\xcb\x8f\x7b\x0e\xea\x57\xe7"
4709 "\xbd\x79\xd6\x1c\x88\x23\x6c\xf2"
4710 "\x4d\x29\x77\x53\x35\x6a\x00\x8d"
4711 "\xcd\xa3\x58\xbe\x77\x99\x18\xf8"
4712 "\xe6\xe1\x8f\xe9\x37\x8f\xe3\xe2"
4713 "\x5a\x8a\x93\x25\xaf\xf3\x78\x80"
4714 "\xbe\xa6\x1b\xc6\xac\x8b\x1c\x91"
4715 "\x58\xe1\x9f\x89\x35\x9d\x1d\x21"
4716 "\x29\x9f\xf4\x99\x02\x27\x0f\xa8"
4717 "\x4f\x79\x94\x2b\x33\x2c\xda\xa2"
4718 "\x26\x39\x83\x94\xef\x27\xd8\x53"
4719 "\x8f\x66\x0d\xe4\x41\x7d\x34\xcd"
4720 "\x43\x7c\x95\x0a\x53\xef\x66\xda"
4721 "\x7e\x9b\xf3\x93\xaf\xd0\x73\x71"
4722 "\xba\x40\x9b\x74\xf8\xd7\xd7\x41"
4723 "\x6d\xaf\x72\x9c\x8d\x21\x87\x3c"
4724 "\xfd\x0a\x90\xa9\x47\x96\x9e\xd3"
4725 "\x88\xee\x73\xcf\x66\x2f\x52\x56"
4726 "\x6d\xa9\x80\x4c\xe2\x6f\x62\x88"
4727 "\x3f\x0e\x54\x17\x48\x80\x5d\xd3"
4728 "\xc3\xda\x25\x3d\xa1\xc8\xcb\x9f"
4729 "\x9b\x70\xb3\xa1\xeb\x04\x52\xa1"
4730 "\xf2\x22\x0f\xfc\xc8\x18\xfa\xf9"
4731 "\x85\x9c\xf1\xac\xeb\x0c\x02\x46"
4732 "\x75\xd2\xf5\x2c\xe3\xd2\x59\x94"
4733 "\x12\xf3\x3c\xfc\xd7\x92\xfa\x36"
4734 "\xba\x61\x34\x38\x7c\xda\x48\x3e"
4735 "\x08\xc9\x39\x23\x5e\x02\x2c\x1a"
4736 "\x18\x7e\xb4\xd9\xfd\x9e\x40\x02"
4737 "\xb1\x33\x37\x32\xe7\xde\xd6\xd0"
4738 "\x7c\x58\x65\x4b\xf8\x34\x27\x9c"
4739 "\x44\xb4\xbd\xe9\xe9\x4c\x78\x7d"
4740 "\x4b\x9f\xce\xb1\xcd\x47\xa5\x37"
4741 "\xe5\x6d\xbd\xb9\x43\x94\x0a\xd4"
4742 "\xd6\xf9\x04\x5f\xb5\x66\x6c\x1a"
4743 "\x35\x12\xe3\x36\x28\x27\x36\x58"
4744 "\x01\x2b\x79\xe4\xba\x6d\x10\x7d"
4745 "\x65\xdf\x84\x95\xf4\xd5\xb6\x8f"
4746 "\x2b\x9f\x96\x00\x86\x60\xf0\x21"
4747 "\x76\xa8\x6a\x8c\x28\x1c\xb3\x6b"
4748 "\x97\xd7\xb6\x53\x2a\xcc\xab\x40"
4749 "\x9d\x62\x79\x58\x52\xe6\x65\xb7"
4750 "\xab\x55\x67\x9c\x89\x7c\x03\xb0"
4751 "\x73\x59\xc5\x81\xf5\x18\x17\x5c"
4752 "\x89\xf3\x78\x35\x44\x62\x78\x72"
4753 "\xd0\x96\xeb\x31\xe7\x87\x77\x14"
4754 "\x99\x51\xf2\x59\x26\x9e\xb5\xa6"
4755 "\x45\xfe\x6e\xbd\x07\x4c\x94\x5a"
4756 "\xa5\x7d\xfc\xf1\x2b\x77\xe2\xfe"
4757 "\x17\xd4\x84\xa0\xac\xb5\xc7\xda"
4758 "\xa9\x1a\xb6\xf3\x74\x11\xb4\x9d"
4759 "\xfb\x79\x2e\x04\x2d\x50\x28\x83"
4760 "\xbf\xc6\x52\xd3\x34\xd6\xe8\x7a"
4761 "\xb6\xea\xe7\xa8\x6c\x15\x1e\x2c"
4762 "\x57\xbc\x48\x4e\x5f\x5c\xb6\x92"
4763 "\xd2\x49\x77\x81\x6d\x90\x70\xae"
4764 "\x98\xa1\x03\x0d\x6b\xb9\x77\x14"
4765 "\xf1\x4e\x23\xd3\xf8\x68\xbd\xc2"
4766 "\xfe\x04\xb7\x5c\xc5\x17\x60\x8f"
4767 "\x65\x54\xa4\x7a\x42\xdc\x18\x0d"
4768 "\xb5\xcf\x0f\xd3\xc7\x91\x66\x1b"
4769 "\x45\x42\x27\x75\x50\xe5\xee\xb8"
4770 "\x7f\x33\x2c\xba\x4a\x92\x4d\x2c"
4771 "\x3c\xe3\x0d\x80\x01\xba\x0d\x29"
4772 "\xd8\x3c\xe9\x13\x16\x57\xe6\xea"
4773 "\x94\x52\xe7\x00\x4d\x30\xb0\x0f"
4774 "\x35\xb8\xb8\xa7\xb1\xb5\x3b\x44"
4775 "\xe1\x2f\xfd\x88\xed\x43\xe7\x52"
4776 "\x10\x93\xb3\x8a\x30\x6b\x0a\xf7"
4777 "\x23\xc6\x50\x9d\x4a\xb0\xde\xc3"
4778 "\xdc\x9b\x2f\x01\x56\x36\x09\xc5"
4779 "\x2f\x6b\xfe\xf1\xd8\x27\x45\x03"
4780 "\x30\x5e\x5c\x5b\xb4\x62\x0e\x1a"
4781 "\xa9\x21\x2b\x92\x94\x87\x62\x57"
4782 "\x4c\x10\x74\x1a\xf1\x0a\xc5\x84"
4783 "\x3b\x9e\x72\x02\xd7\xcc\x09\x56"
4784 "\xbd\x54\xc1\xf0\xc3\xe3\xb3\xf8"
4785 "\xd2\x0d\x61\xcb\xef\xce\x0d\x05"
4786 "\xb0\x98\xd9\x8e\x4f\xf9\xbc\x93"
4787 "\xa6\xea\xc8\xcf\x10\x53\x4b\xf1"
4788 "\xec\xfc\x89\xf9\x64\xb0\x22\xbf"
4789 "\x9e\x55\x46\x9f\x7c\x50\x8e\x84"
4790 "\x54\x20\x98\xd7\x6c\x40\x1e\xdb"
4791 "\x69\x34\x78\x61\x24\x21\x9c\x8a"
4792 "\xb3\x62\x31\x8b\x6e\xf5\x2a\x35"
4793 "\x86\x13\xb1\x6c\x64\x2e\x41\xa5"
4794 "\x05\xf2\x42\xba\xd2\x3a\x0d\x8e"
4795 "\x8a\x59\x94\x3c\xcf\x36\x27\x82"
4796 "\xc2\x45\xee\x58\xcd\x88\xb4\xec"
4797 "\xde\xb2\x96\x0a\xaf\x38\x6f\x88"
4798 "\xd7\xd8\xe1\xdf\xb9\x96\xa9\x0a"
4799 "\xb1\x95\x28\x86\x20\xe9\x17\x49"
4800 "\xa2\x29\x38\xaa\xa5\xe9\x6e\xf1"
4801 "\x19\x27\xc0\xd5\x2a\x22\xc3\x0b"
4802 "\xdb\x7c\x73\x10\xb9\xba\x89\x76"
4803 "\x54\xae\x7d\x71\xb3\x93\xf6\x32"
4804 "\xe6\x47\x43\x55\xac\xa0\x0d\xc2"
4805 "\x93\x27\x4a\x8e\x0e\x74\x15\xc7"
4806 "\x0b\x85\xd9\x0c\xa9\x30\x7a\x3e"
4807 "\xea\x8f\x85\x6d\x3a\x12\x4f\x72"
4808 "\x69\x58\x7a\x80\xbb\xb5\x97\xf3"
4809 "\xcf\x70\xd2\x5d\xdd\x4d\x21\x79"
4810 "\x54\x4d\xe4\x05\xe8\xbd\xc2\x62"
4811 "\xb1\x3b\x77\x1c\xd6\x5c\xf3\xa0"
4812 "\x79\x00\xa8\x6c\x29\xd9\x18\x24"
4813 "\x36\xa2\x46\xc0\x96\x65\x7f\xbd"
4814 "\x2a\xed\x36\x16\x0c\xaa\x9f\xf4"
4815 "\xc5\xb4\xe2\x12\xed\x69\xed\x4f"
4816 "\x26\x2c\x39\x52\x89\x98\xe7\x2c"
4817 "\x99\xa4\x9e\xa3\x9b\x99\x46\x7a"
4818 "\x3a\xdc\xa8\x59\xa3\xdb\xc3\x3b"
4819 "\x95\x0d\x3b\x09\x6e\xee\x83\x5d"
4820 "\x32\x4d\xed\xab\xfa\x98\x14\x4e"
4821 "\xc3\x15\x45\x53\x61\xc4\x93\xbd"
4822 "\x90\xf4\x99\x95\x4c\xe6\x76\x92"
4823 "\x29\x90\x46\x30\x92\x69\x7d\x13"
4824 "\xf2\xa5\xcd\x69\x49\x44\xb2\x0f"
4825 "\x63\x40\x36\x5f\x09\xe2\x78\xf8"
4826 "\x91\xe3\xe2\xfa\x10\xf7\xc8\x24"
4827 "\xa8\x89\x32\x5c\x37\x25\x1d\xb2"
4828 "\xea\x17\x8a\x0a\xa9\x64\xc3\x7c"
4829 "\x3c\x7c\xbd\xc6\x79\x34\xe7\xe2"
4830 "\x85\x8e\xbf\xf8\xde\x92\xa0\xae"
4831 "\x20\xc4\xf6\xbb\x1f\x38\x19\x0e"
4832 "\xe8\x79\x9c\xa1\x23\xe9\x54\x7e"
4833 "\x37\x2f\xe2\x94\x32\xaf\xa0\x23"
4834 "\x49\xe4\xc0\xb3\xac\x00\x8f\x36"
4835 "\x05\xc4\xa6\x96\xec\x05\x98\x4f"
4836 "\x96\x67\x57\x1f\x20\x86\x1b\x2d"
4837 "\x69\xe4\x29\x93\x66\x5f\xaf\x6b"
4838 "\x88\x26\x2c\x67\x02\x4b\x52\xd0"
4839 "\x83\x7a\x43\x1f\xc0\x71\x15\x25"
4840 "\x77\x65\x08\x60\x11\x76\x4c\x8d"
4841 "\xed\xa9\x27\xc6\xb1\x2a\x2c\x6a"
4842 "\x4a\x97\xf5\xc6\xb7\x70\x42\xd3"
4843 "\x03\xd1\x24\x95\xec\x6d\xab\x38"
4844 "\x72\xce\xe2\x8b\x33\xd7\x51\x09"
4845 "\xdc\x45\xe0\x09\x96\x32\xf3\xc4"
4846 "\x84\xdc\x73\x73\x2d\x1b\x11\x98"
4847 "\xc5\x0e\x69\x28\x94\xc7\xb5\x4d"
4848 "\xc8\x8a\xd0\xaa\x13\x2e\x18\x74"
4849 "\xdd\xd1\x1e\xf3\x90\xe8\xfc\x9a"
4850 "\x72\x4a\x0e\xd1\xe4\xfb\x0d\x96"
4851 "\xd1\x0c\x79\x85\x1b\x1c\xfe\xe1"
4852 "\x62\x8f\x7a\x73\x32\xab\xc8\x18"
4853 "\x69\xe3\x34\x30\xdf\x13\xa6\xe5"
4854 "\xe8\x0e\x67\x7f\x81\x11\xb4\x60"
4855 "\xc7\xbd\x79\x65\x50\xdc\xc4\x5b"
4856 "\xde\x39\xa4\x01\x72\x63\xf3\xd1"
4857 "\x64\x4e\xdf\xfc\x27\x92\x37\x0d"
4858 "\x57\xcd\x11\x4f\x11\x04\x8e\x1d"
4859 "\x16\xf7\xcd\x92\x9a\x99\x30\x14"
4860 "\xf1\x7c\x67\x1b\x1f\x41\x0b\xe8"
4861 "\x32\xe8\xb8\xc1\x4f\x54\x86\x4f"
4862 "\xe5\x79\x81\x73\xcd\x43\x59\x68"
4863 "\x73\x02\x3b\x78\x21\x72\x43\x00"
4864 "\x49\x17\xf7\x00\xaf\x68\x24\x53"
4865 "\x05\x0a\xc3\x33\xe0\x33\x3f\x69"
4866 "\xd2\x84\x2f\x0b\xed\xde\x04\xf4"
4867 "\x11\x94\x13\x69\x51\x09\x28\xde"
4868 "\x57\x5c\xef\xdc\x9a\x49\x1c\x17"
4869 "\x97\xf3\x96\xc1\x7f\x5d\x2e\x7d"
4870 "\x55\xb8\xb3\x02\x09\xb3\x1f\xe7"
4871 "\xc9\x8d\xa3\x36\x34\x8a\x77\x13"
4872 "\x30\x63\x4c\xa5\xcd\xc3\xe0\x7e"
4873 "\x05\xa1\x7b\x0c\xcb\x74\x47\x31"
4874 "\x62\x03\x43\xf1\x87\xb4\xb0\x85"
4875 "\x87\x8e\x4b\x25\xc7\xcf\xae\x4b"
4876 "\x36\x46\x3e\x62\xbc\x6f\xeb\x5f"
4877 "\x73\xac\xe6\x07\xee\xc1\xa1\xd6"
4878 "\xc4\xab\xc9\xd6\x89\x45\xe1\xf1"
4879 "\x04\x4e\x1a\x6f\xbb\x4f\x3a\xa3"
4880 "\xa0\xcb\xa3\x0a\xd8\x71\x35\x55"
4881 "\xe4\xbc\x2e\x04\x06\xe6\xff\x5b"
4882 "\x1c\xc0\x11\x7c\xc5\x17\xf3\x38"
4883 "\xcf\xe9\xba\x0f\x0e\xef\x02\xc2"
4884 "\x8d\xc6\xbc\x4b\x67\x20\x95\xd7"
4885 "\x2c\x45\x5b\x86\x44\x8c\x6f\x2e"
4886 "\x7e\x9f\x1c\x77\xba\x6b\x0e\xa3"
4887 "\x69\xdc\xab\x24\x57\x60\x47\xc1"
4888 "\xd1\xa5\x9d\x23\xe6\xb1\x37\xfe"
4889 "\x93\xd2\x4c\x46\xf9\x0c\xc6\xfb"
4890 "\xd6\x9d\x99\x69\xab\x7a\x07\x0c"
4891 "\x65\xe7\xc4\x08\x96\xe2\xa5\x01"
4892 "\x3f\x46\x07\x05\x7e\xe8\x9a\x90"
4893 "\x50\xdc\xe9\x7a\xea\xa1\x39\x6e"
4894 "\x66\xe4\x6f\xa5\x5f\xb2\xd9\x5b"
4895 "\xf5\xdb\x2a\x32\xf0\x11\x6f\x7c"
4896 "\x26\x10\x8f\x3d\x80\xe9\x58\xf7"
4897 "\xe0\xa8\x57\xf8\xdb\x0e\xce\x99"
4898 "\x63\x19\x3d\xd5\xec\x1b\x77\x69"
4899 "\x98\xf6\xe4\x5f\x67\x17\x4b\x09"
4900 "\x85\x62\x82\x70\x18\xe2\x9a\x78"
4901 "\xe2\x62\xbd\xb4\xf1\x42\xc6\xfb"
4902 "\x08\xd0\xbd\xeb\x4e\x09\xf2\xc8"
4903 "\x1e\xdc\x3d\x32\x21\x56\x9c\x4f"
4904 "\x35\xf3\x61\x06\x72\x84\xc4\x32"
4905 "\xf2\xf1\xfa\x0b\x2f\xc3\xdb\x02"
4906 "\x04\xc2\xde\x57\x64\x60\x8d\xcf"
4907 "\xcb\x86\x5d\x97\x3e\xb1\x9c\x01"
4908 "\xd6\x28\x8f\x99\xbc\x46\xeb\x05"
4909 "\xaf\x7e\xb8\x21\x2a\x56\x85\x1c"
4910 "\xb3\x71\xa0\xde\xca\x96\xf1\x78"
4911 "\x49\xa2\x99\x81\x80\x5c\x01\xf5"
4912 "\xa0\xa2\x56\x63\xe2\x70\x07\xa5"
4913 "\x95\xd6\x85\xeb\x36\x9e\xa9\x51"
4914 "\x66\x56\x5f\x1d\x02\x19\xe2\xf6"
4915 "\x4f\x73\x38\x09\x75\x64\x48\xe0"
4916 "\xf1\x7e\x0e\xe8\x9d\xf9\xed\x94"
4917 "\xfe\x16\x26\x62\x49\x74\xf4\xb0"
4918 "\xd4\xa9\x6c\xb0\xfd\x53\xe9\x81"
4919 "\xe0\x7a\xbf\xcf\xb5\xc4\x01\x81"
4920 "\x79\x99\x77\x01\x3b\xe9\xa2\xb6"
4921 "\xe6\x6a\x8a\x9e\x56\x1c\x8d\x1e"
4922 "\x8f\x06\x55\x2c\x6c\xdc\x92\x87"
4923 "\x64\x3b\x4b\x19\xa1\x13\x64\x1d"
4924 "\x4a\xe9\xc0\x00\xb8\x95\xef\x6b"
4925 "\x1a\x86\x6d\x37\x52\x02\xc2\xe0"
4926 "\xc8\xbb\x42\x0c\x02\x21\x4a\xc9"
4927 "\xef\xa0\x54\xe4\x5e\x16\x53\x81"
4928 "\x70\x62\x10\xaf\xde\xb8\xb5\xd3"
4929 "\xe8\x5e\x6c\xc3\x8a\x3e\x18\x07"
4930 "\xf2\x2f\x7d\xa7\xe1\x3d\x4e\xb4"
4931 "\x26\xa7\xa3\x93\x86\xb2\x04\x1e"
4932 "\x53\x5d\x86\xd6\xde\x65\xca\xe3"
4933 "\x4e\xc1\xcf\xef\xc8\x70\x1b\x83"
4934 "\x13\xdd\x18\x8b\x0d\x76\xd2\xf6"
4935 "\x37\x7a\x93\x7a\x50\x11\x9f\x96"
4936 "\x86\x25\xfd\xac\xdc\xbe\x18\x93"
4937 "\x19\x6b\xec\x58\x4f\xb9\x75\xa7"
4938 "\xdd\x3f\x2f\xec\xc8\x5a\x84\xab"
4939 "\xd5\xe4\x8a\x07\xf6\x4d\x23\xd6"
4940 "\x03\xfb\x03\x6a\xea\x66\xbf\xd4"
4941 "\xb1\x34\xfb\x78\xe9\x55\xdc\x7c"
4942 "\x3d\x9c\xe5\x9a\xac\xc3\x7a\x80"
4943 "\x24\x6d\xa0\xef\x25\x7c\xb7\xea"
4944 "\xce\x4d\x5f\x18\x60\xce\x87\x22"
4945 "\x66\x2f\xd5\xdd\xdd\x02\x21\x75"
4946 "\x82\xa0\x1f\x58\xc6\xd3\x62\xf7"
4947 "\x32\xd8\xaf\x1e\x07\x77\x51\x96"
4948 "\xd5\x6b\x1e\x7e\x80\x02\xe8\x67"
4949 "\xea\x17\x0b\x10\xd2\x3f\x28\x25"
4950 "\x4f\x05\x77\x02\x14\x69\xf0\x2c"
4951 "\xbe\x0c\xf1\x74\x30\xd1\xb9\x9b"
4952 "\xfc\x8c\xbb\x04\x16\xd9\xba\xc3"
4953 "\xbc\x91\x8a\xc4\x30\xa4\xb0\x12"
4954 "\x4c\x21\x87\xcb\xc9\x1d\x16\x96"
4955 "\x07\x6f\x23\x54\xb9\x6f\x79\xe5"
4956 "\x64\xc0\x64\xda\xb1\xae\xdd\x60"
4957 "\x6c\x1a\x9d\xd3\x04\x8e\x45\xb0"
4958 "\x92\x61\xd0\x48\x81\xed\x5e\x1d"
4959 "\xa0\xc9\xa4\x33\xc7\x13\x51\x5d"
4960 "\x7f\x83\x73\xb6\x70\x18\x65\x3e"
4961 "\x2f\x0e\x7a\x12\x39\x98\xab\xd8"
4962 "\x7e\x6f\xa3\xd1\xba\x56\xad\xbd"
4963 "\xf0\x03\x01\x1c\x85\x35\x9f\xeb"
4964 "\x19\x63\xa1\xaf\xfe\x2d\x35\x50"
4965 "\x39\xa0\x65\x7c\x95\x7e\x6b\xfe"
4966 "\xc1\xac\x07\x7c\x98\x4f\xbe\x57"
4967 "\xa7\x22\xec\xe2\x7e\x29\x09\x53"
4968 "\xe8\xbf\xb4\x7e\x3f\x8f\xfc\x14"
4969 "\xce\x54\xf9\x18\x58\xb5\xff\x44"
4970 "\x05\x9d\xce\x1b\xb6\x82\x23\xc8"
4971 "\x2e\xbc\x69\xbb\x4a\x29\x0f\x65"
4972 "\x94\xf0\x63\x06\x0e\xef\x8c\xbd"
4973 "\xff\xfd\xb0\x21\x6e\x57\x05\x75"
4974 "\xda\xd5\xc4\xeb\x8d\x32\xf7\x50"
4975 "\xd3\x6f\x22\xed\x5f\x8e\xa2\x5b"
4976 "\x80\x8c\xc8\x78\x40\x24\x4b\x89"
4977 "\x30\xce\x7a\x97\x0e\xc4\xaf\xef"
4978 "\x9b\xb4\xcd\x66\x74\x14\x04\x2b"
4979 "\xf7\xce\x0b\x1c\x6e\xc2\x78\x8c"
4980 "\xca\xc5\xd0\x1c\x95\x4a\x91\x2d"
4981 "\xa7\x20\xeb\x86\x52\xb7\x67\xd8"
4982 "\x0c\xd6\x04\x14\xde\x51\x74\x75"
4983 "\xe7\x11\xb4\x87\xa3\x3d\x2d\xad"
4984 "\x4f\xef\xa0\x0f\x70\x00\x6d\x13"
4985 "\x19\x1d\x41\x50\xe9\xd8\xf0\x32"
4986 "\x71\xbc\xd3\x11\xf2\xac\xbe\xaf"
4987 "\x75\x46\x65\x4e\x07\x34\x37\xa3"
4988 "\x89\xfe\x75\xd4\x70\x4c\xc6\x3f"
4989 "\x69\x24\x0e\x38\x67\x43\x8c\xde"
4990 "\x06\xb5\xb8\xe7\xc4\xf0\x41\x8f"
4991 "\xf0\xbd\x2f\x0b\xb9\x18\xf8\xde"
4992 "\x64\xb1\xdb\xee\x00\x50\x77\xe1"
4993 "\xc7\xff\xa6\xfa\xdd\x70\xf4\xe3"
4994 "\x93\xe9\x77\x35\x3d\x4b\x2f\x2b"
4995 "\x6d\x55\xf0\xfc\x88\x54\x4e\x89"
4996 "\xc1\x8a\x23\x31\x2d\x14\x2a\xb8"
4997 "\x1b\x15\xdd\x9e\x6e\x7b\xda\x05"
4998 "\x91\x7d\x62\x64\x96\x72\xde\xfc"
4999 "\xc1\xec\xf0\x23\x51\x6f\xdb\x5b"
5000 "\x1d\x08\x57\xce\x09\xb8\xf6\xcd"
5001 "\x8d\x95\xf2\x20\xbf\x0f\x20\x57"
5002 "\x98\x81\x84\x4f\x15\x5c\x76\xe7"
5003 "\x3e\x0a\x3a\x6c\xc4\x8a\xbe\x78"
5004 "\x74\x77\xc3\x09\x4b\x5d\x48\xe4"
5005 "\xc8\xcb\x0b\xea\x17\x28\xcf\xcf"
5006 "\x31\x32\x44\xa4\xe5\x0e\x1a\x98"
5007 "\x94\xc4\xf0\xff\xae\x3e\x44\xe8"
5008 "\xa5\xb3\xb5\x37\x2f\xe8\xaf\x6f"
5009 "\x28\xc1\x37\x5f\x31\xd2\xb9\x33"
5010 "\xb1\xb2\x52\x94\x75\x2c\x29\x59"
5011 "\x06\xc2\x25\xe8\x71\x65\x4e\xed"
5012 "\xc0\x9c\xb1\xbb\x25\xdc\x6c\xe7"
5013 "\x4b\xa5\x7a\x54\x7a\x60\xff\x7a"
5014 "\xe0\x50\x40\x96\x35\x63\xe4\x0b"
5015 "\x76\xbd\xa4\x65\x00\x1b\x57\x88"
5016 "\xae\xed\x39\x88\x42\x11\x3c\xed"
5017 "\x85\x67\x7d\xb9\x68\x82\xe9\x43"
5018 "\x3c\x47\x53\xfa\xe8\xf8\x9f\x1f"
5019 "\x9f\xef\x0f\xf7\x30\xd9\x30\x0e"
5020 "\xb9\x9f\x69\x18\x2f\x7e\xf8\xf8"
5021 "\xf8\x8c\x0f\xd4\x02\x4d\xea\xcd"
5022 "\x0a\x9c\x6f\x71\x6d\x5a\x4c\x60"
5023 "\xce\x20\x56\x32\xc6\xc5\x99\x1f"
5024 "\x09\xe6\x4e\x18\x1a\x15\x13\xa8"
5025 "\x7d\xb1\x6b\xc0\xb2\x6d\xf8\x26"
5026 "\x66\xf8\x3d\x18\x74\x70\x66\x7a"
5027 "\x34\x17\xde\xba\x47\xf1\x06\x18"
5028 "\xcb\xaf\xeb\x4a\x1e\x8f\xa7\x77"
5029 "\xe0\x3b\x78\x62\x66\xc9\x10\xea"
5030 "\x1f\xb7\x29\x0a\x45\xa1\x1d\x1e"
5031 "\x1d\xe2\x65\x61\x50\x9c\xd7\x05"
5032 "\xf2\x0b\x5b\x12\x61\x02\xc8\xe5"
5033 "\x63\x4f\x20\x0c\x07\x17\x33\x5e"
5034 "\x03\x9a\x53\x0f\x2e\x55\xfe\x50"
5035 "\x43\x7d\xd0\xb6\x7e\x5a\xda\xae"
5036 "\x58\xef\x15\xa9\x83\xd9\x46\xb1"
5037 "\x42\xaa\xf5\x02\x6c\xce\x92\x06"
5038 "\x1b\xdb\x66\x45\x91\x79\xc2\x2d"
5039 "\xe6\x53\xd3\x14\xfd\xbb\x44\x63"
5040 "\xc6\xd7\x3d\x7a\x0c\x75\x78\x9d"
5041 "\x5c\xa6\x39\xb3\xe5\x63\xca\x8b"
5042 "\xfe\xd3\xef\x60\x83\xf6\x8e\x70"
5043 "\xb6\x67\xc7\x77\xed\x23\xef\x4c"
5044 "\xf0\xed\x2d\x07\x59\x6f\xc1\x01"
5045 "\x34\x37\x08\xab\xd9\x1f\x09\xb1"
5046 "\xce\x5b\x17\xff\x74\xf8\x9c\xd5"
5047 "\x2c\x56\x39\x79\x0f\x69\x44\x75"
5048 "\x58\x27\x01\xc4\xbf\xa7\xa1\x1d"
5049 "\x90\x17\x77\x86\x5a\x3f\xd9\xd1"
5050 "\x0e\xa0\x10\xf8\xec\x1e\xa5\x7f"
5051 "\x5e\x36\xd1\xe3\x04\x2c\x70\xf7"
5052 "\x8e\xc0\x98\x2f\x6c\x94\x2b\x41"
5053 "\xb7\x60\x00\xb7\x2e\xb8\x02\x8d"
5054 "\xb8\xb0\xd3\x86\xba\x1d\xd7\x90"
5055 "\xd6\xb6\xe1\xfc\xd7\xd8\x28\x06"
5056 "\x63\x9b\xce\x61\x24\x79\xc0\x70"
5057 "\x52\xd0\xb6\xd4\x28\x95\x24\x87"
5058 "\x03\x1f\xb7\x9a\xda\xa3\xfb\x52"
5059 "\x5b\x68\xe7\x4c\x8c\x24\xe1\x42"
5060 "\xf7\xd5\xfd\xad\x06\x32\x9f\xba"
5061 "\xc1\xfc\xdd\xc6\xfc\xfc\xb3\x38"
5062 "\x74\x56\x58\x40\x02\x37\x52\x2c"
5063 "\x55\xcc\xb3\x9e\x7a\xe9\xd4\x38"
5064 "\x41\x5e\x0c\x35\xe2\x11\xd1\x13"
5065 "\xf8\xb7\x8d\x72\x6b\x22\x2a\xb0"
5066 "\xdb\x08\xba\x35\xb9\x3f\xc8\xd3"
5067 "\x24\x90\xec\x58\xd2\x09\xc7\x2d"
5068 "\xed\x38\x80\x36\x72\x43\x27\x49"
5069 "\x4a\x80\x8a\xa2\xe8\xd3\xda\x30"
5070 "\x7d\xb6\x82\x37\x86\x92\x86\x3e"
5071 "\x08\xb2\x28\x5a\x55\x44\x24\x7d"
5072 "\x40\x48\x8a\xb6\x89\x58\x08\xa0"
5073 "\xd6\x6d\x3a\x17\xbf\xf6\x54\xa2"
5074 "\xf5\xd3\x8c\x0f\x78\x12\x57\x8b"
5075 "\xd5\xc2\xfd\x58\x5b\x7f\x38\xe3"
5076 "\xcc\xb7\x7c\x48\xb3\x20\xe8\x81"
5077 "\x14\x32\x45\x05\xe0\xdb\x9f\x75"
5078 "\x85\xb4\x6a\xfc\x95\xe3\x54\x22"
5079 "\x12\xee\x30\xfe\xd8\x30\xef\x34"
5080 "\x50\xab\x46\x30\x98\x2f\xb7\xc0"
5081 "\x15\xa2\x83\xb6\xf2\x06\x21\xa2"
5082 "\xc3\x26\x37\x14\xd1\x4d\xb5\x10"
5083 "\x52\x76\x4d\x6a\xee\xb5\x2b\x15"
5084 "\xb7\xf9\x51\xe8\x2a\xaf\xc7\xfa"
5085 "\x77\xaf\xb0\x05\x4d\xd1\x68\x8e"
5086 "\x74\x05\x9f\x9d\x93\xa5\x3e\x7f"
5087 "\x4e\x5f\x9d\xcb\x09\xc7\x83\xe3"
5088 "\x02\x9d\x27\x1f\xef\x85\x05\x8d"
5089 "\xec\x55\x88\x0f\x0d\x7c\x4c\xe8"
5090 "\xa1\x75\xa0\xd8\x06\x47\x14\xef"
5091 "\xaa\x61\xcf\x26\x15\xad\xd8\xa3"
5092 "\xaa\x75\xf2\x78\x4a\x5a\x61\xdf"
5093 "\x8b\xc7\x04\xbc\xb2\x32\xd2\x7e"
5094 "\x42\xee\xb4\x2f\x51\xff\x7b\x2e"
5095 "\xd3\x02\xe8\xdc\x5d\x0d\x50\xdc"
5096 "\xae\xb7\x46\xf9\xa8\xe6\xd0\x16"
5097 "\xcc\xe6\x2c\x81\xc7\xad\xe9\xf0"
5098 "\x05\x72\x6d\x3d\x0a\x7a\xa9\x02"
5099 "\xac\x82\x93\x6e\xb6\x1c\x28\xfc"
5100 "\x44\x12\xfb\x73\x77\xd4\x13\x39"
5101 "\x29\x88\x8a\xf3\x5c\xa6\x36\xa0"
5102 "\x2a\xed\x7e\xb1\x1d\xd6\x4c\x6b"
5103 "\x41\x01\x18\x5d\x5d\x07\x97\xa6"
5104 "\x4b\xef\x31\x18\xea\xac\xb1\x84"
5105 "\x21\xed\xda\x86",
5106 .rlen = 4100,
5107 .np = 2,
5108 .tap = { 4064, 36 },
5109 },
5110};
5111
5112static struct cipher_testvec aes_ctr_dec_tv_template[] = {
5113 { /* From RFC 3686 */
5114 .key = "\xae\x68\x52\xf8\x12\x10\x67\xcc"
5115 "\x4b\xf7\xa5\x76\x55\x77\xf3\x9e"
5116 "\x00\x00\x00\x30",
5117 .klen = 20,
5118 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00",
5119 .input = "\xe4\x09\x5d\x4f\xb7\xa7\xb3\x79"
5120 "\x2d\x61\x75\xa3\x26\x13\x11\xb8",
5121 .ilen = 16,
5122 .result = "Single block msg",
5123 .rlen = 16,
5124 }, {
5125 .key = "\x7e\x24\x06\x78\x17\xfa\xe0\xd7"
5126 "\x43\xd6\xce\x1f\x32\x53\x91\x63"
5127 "\x00\x6c\xb6\xdb",
5128 .klen = 20,
5129 .iv = "\xc0\x54\x3b\x59\xda\x48\xd9\x0b",
5130 .input = "\x51\x04\xa1\x06\x16\x8a\x72\xd9"
5131 "\x79\x0d\x41\xee\x8e\xda\xd3\x88"
5132 "\xeb\x2e\x1e\xfc\x46\xda\x57\xc8"
5133 "\xfc\xe6\x30\xdf\x91\x41\xbe\x28",
5134 .ilen = 32,
5135 .result = "\x00\x01\x02\x03\x04\x05\x06\x07"
5136 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
5137 "\x10\x11\x12\x13\x14\x15\x16\x17"
5138 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
5139 .rlen = 32,
5140 }, {
5141 .key = "\x16\xaf\x5b\x14\x5f\xc9\xf5\x79"
5142 "\xc1\x75\xf9\x3e\x3b\xfb\x0e\xed"
5143 "\x86\x3d\x06\xcc\xfd\xb7\x85\x15"
5144 "\x00\x00\x00\x48",
5145 .klen = 28,
5146 .iv = "\x36\x73\x3c\x14\x7d\x6d\x93\xcb",
5147 .input = "\x4b\x55\x38\x4f\xe2\x59\xc9\xc8"
5148 "\x4e\x79\x35\xa0\x03\xcb\xe9\x28",
5149 .ilen = 16,
5150 .result = "Single block msg",
5151 .rlen = 16,
5152 }, {
5153 .key = "\x7c\x5c\xb2\x40\x1b\x3d\xc3\x3c"
5154 "\x19\xe7\x34\x08\x19\xe0\xf6\x9c"
5155 "\x67\x8c\x3d\xb8\xe6\xf6\xa9\x1a"
5156 "\x00\x96\xb0\x3b",
5157 .klen = 28,
5158 .iv = "\x02\x0c\x6e\xad\xc2\xcb\x50\x0d",
5159 .input = "\x45\x32\x43\xfc\x60\x9b\x23\x32"
5160 "\x7e\xdf\xaa\xfa\x71\x31\xcd\x9f"
5161 "\x84\x90\x70\x1c\x5a\xd4\xa7\x9c"
5162 "\xfc\x1f\xe0\xff\x42\xf4\xfb\x00",
5163 .ilen = 32,
5164 .result = "\x00\x01\x02\x03\x04\x05\x06\x07"
5165 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
5166 "\x10\x11\x12\x13\x14\x15\x16\x17"
5167 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
5168 .rlen = 32,
5169 }, {
5170 .key = "\x77\x6b\xef\xf2\x85\x1d\xb0\x6f"
5171 "\x4c\x8a\x05\x42\xc8\x69\x6f\x6c"
5172 "\x6a\x81\xaf\x1e\xec\x96\xb4\xd3"
5173 "\x7f\xc1\xd6\x89\xe6\xc1\xc1\x04"
5174 "\x00\x00\x00\x60",
5175 .klen = 36,
5176 .iv = "\xdb\x56\x72\xc9\x7a\xa8\xf0\xb2",
5177 .input = "\x14\x5a\xd0\x1d\xbf\x82\x4e\xc7"
5178 "\x56\x08\x63\xdc\x71\xe3\xe0\xc0",
5179 .ilen = 16,
5180 .result = "Single block msg",
5181 .rlen = 16,
5182 }, {
5183 .key = "\xf6\xd6\x6d\x6b\xd5\x2d\x59\xbb"
5184 "\x07\x96\x36\x58\x79\xef\xf8\x86"
5185 "\xc6\x6d\xd5\x1a\x5b\x6a\x99\x74"
5186 "\x4b\x50\x59\x0c\x87\xa2\x38\x84"
5187 "\x00\xfa\xac\x24",
5188 .klen = 36,
5189 .iv = "\xc1\x58\x5e\xf1\x5a\x43\xd8\x75",
5190 .input = "\xf0\x5e\x23\x1b\x38\x94\x61\x2c"
5191 "\x49\xee\x00\x0b\x80\x4e\xb2\xa9"
5192 "\xb8\x30\x6b\x50\x8f\x83\x9d\x6a"
5193 "\x55\x30\x83\x1d\x93\x44\xaf\x1c",
5194 .ilen = 32,
5195 .result = "\x00\x01\x02\x03\x04\x05\x06\x07"
5196 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
5197 "\x10\x11\x12\x13\x14\x15\x16\x17"
5198 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
5199 .rlen = 32,
5200 },
5201};
5202
5203static struct aead_testvec aes_gcm_enc_tv_template[] = {
5204 { /* From McGrew & Viega - http://citeseer.ist.psu.edu/656989.html */
5205 .key = zeroed_string,
5206 .klen = 16,
5207 .result = "\x58\xe2\xfc\xce\xfa\x7e\x30\x61"
5208 "\x36\x7f\x1d\x57\xa4\xe7\x45\x5a",
5209 .rlen = 16,
5210 }, {
5211 .key = zeroed_string,
5212 .klen = 16,
5213 .input = zeroed_string,
5214 .ilen = 16,
5215 .result = "\x03\x88\xda\xce\x60\xb6\xa3\x92"
5216 "\xf3\x28\xc2\xb9\x71\xb2\xfe\x78"
5217 "\xab\x6e\x47\xd4\x2c\xec\x13\xbd"
5218 "\xf5\x3a\x67\xb2\x12\x57\xbd\xdf",
5219 .rlen = 32,
5220 }, {
5221 .key = "\xfe\xff\xe9\x92\x86\x65\x73\x1c"
5222 "\x6d\x6a\x8f\x94\x67\x30\x83\x08",
5223 .klen = 16,
5224 .iv = "\xca\xfe\xba\xbe\xfa\xce\xdb\xad"
5225 "\xde\xca\xf8\x88",
5226 .input = "\xd9\x31\x32\x25\xf8\x84\x06\xe5"
5227 "\xa5\x59\x09\xc5\xaf\xf5\x26\x9a"
5228 "\x86\xa7\xa9\x53\x15\x34\xf7\xda"
5229 "\x2e\x4c\x30\x3d\x8a\x31\x8a\x72"
5230 "\x1c\x3c\x0c\x95\x95\x68\x09\x53"
5231 "\x2f\xcf\x0e\x24\x49\xa6\xb5\x25"
5232 "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57"
5233 "\xba\x63\x7b\x39\x1a\xaf\xd2\x55",
5234 .ilen = 64,
5235 .result = "\x42\x83\x1e\xc2\x21\x77\x74\x24"
5236 "\x4b\x72\x21\xb7\x84\xd0\xd4\x9c"
5237 "\xe3\xaa\x21\x2f\x2c\x02\xa4\xe0"
5238 "\x35\xc1\x7e\x23\x29\xac\xa1\x2e"
5239 "\x21\xd5\x14\xb2\x54\x66\x93\x1c"
5240 "\x7d\x8f\x6a\x5a\xac\x84\xaa\x05"
5241 "\x1b\xa3\x0b\x39\x6a\x0a\xac\x97"
5242 "\x3d\x58\xe0\x91\x47\x3f\x59\x85"
5243 "\x4d\x5c\x2a\xf3\x27\xcd\x64\xa6"
5244 "\x2c\xf3\x5a\xbd\x2b\xa6\xfa\xb4",
5245 .rlen = 80,
5246 }, {
5247 .key = "\xfe\xff\xe9\x92\x86\x65\x73\x1c"
5248 "\x6d\x6a\x8f\x94\x67\x30\x83\x08",
5249 .klen = 16,
5250 .iv = "\xca\xfe\xba\xbe\xfa\xce\xdb\xad"
5251 "\xde\xca\xf8\x88",
5252 .input = "\xd9\x31\x32\x25\xf8\x84\x06\xe5"
5253 "\xa5\x59\x09\xc5\xaf\xf5\x26\x9a"
5254 "\x86\xa7\xa9\x53\x15\x34\xf7\xda"
5255 "\x2e\x4c\x30\x3d\x8a\x31\x8a\x72"
5256 "\x1c\x3c\x0c\x95\x95\x68\x09\x53"
5257 "\x2f\xcf\x0e\x24\x49\xa6\xb5\x25"
5258 "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57"
5259 "\xba\x63\x7b\x39",
5260 .ilen = 60,
5261 .assoc = "\xfe\xed\xfa\xce\xde\xad\xbe\xef"
5262 "\xfe\xed\xfa\xce\xde\xad\xbe\xef"
5263 "\xab\xad\xda\xd2",
5264 .alen = 20,
5265 .result = "\x42\x83\x1e\xc2\x21\x77\x74\x24"
5266 "\x4b\x72\x21\xb7\x84\xd0\xd4\x9c"
5267 "\xe3\xaa\x21\x2f\x2c\x02\xa4\xe0"
5268 "\x35\xc1\x7e\x23\x29\xac\xa1\x2e"
5269 "\x21\xd5\x14\xb2\x54\x66\x93\x1c"
5270 "\x7d\x8f\x6a\x5a\xac\x84\xaa\x05"
5271 "\x1b\xa3\x0b\x39\x6a\x0a\xac\x97"
5272 "\x3d\x58\xe0\x91"
5273 "\x5b\xc9\x4f\xbc\x32\x21\xa5\xdb"
5274 "\x94\xfa\xe9\x5a\xe7\x12\x1a\x47",
5275 .rlen = 76,
5276 }, {
5277 .key = zeroed_string,
5278 .klen = 24,
5279 .result = "\xcd\x33\xb2\x8a\xc7\x73\xf7\x4b"
5280 "\xa0\x0e\xd1\xf3\x12\x57\x24\x35",
5281 .rlen = 16,
5282 }, {
5283 .key = zeroed_string,
5284 .klen = 24,
5285 .input = zeroed_string,
5286 .ilen = 16,
5287 .result = "\x98\xe7\x24\x7c\x07\xf0\xfe\x41"
5288 "\x1c\x26\x7e\x43\x84\xb0\xf6\x00"
5289 "\x2f\xf5\x8d\x80\x03\x39\x27\xab"
5290 "\x8e\xf4\xd4\x58\x75\x14\xf0\xfb",
5291 .rlen = 32,
5292 }, {
5293 .key = "\xfe\xff\xe9\x92\x86\x65\x73\x1c"
5294 "\x6d\x6a\x8f\x94\x67\x30\x83\x08"
5295 "\xfe\xff\xe9\x92\x86\x65\x73\x1c",
5296 .klen = 24,
5297 .iv = "\xca\xfe\xba\xbe\xfa\xce\xdb\xad"
5298 "\xde\xca\xf8\x88",
5299 .input = "\xd9\x31\x32\x25\xf8\x84\x06\xe5"
5300 "\xa5\x59\x09\xc5\xaf\xf5\x26\x9a"
5301 "\x86\xa7\xa9\x53\x15\x34\xf7\xda"
5302 "\x2e\x4c\x30\x3d\x8a\x31\x8a\x72"
5303 "\x1c\x3c\x0c\x95\x95\x68\x09\x53"
5304 "\x2f\xcf\x0e\x24\x49\xa6\xb5\x25"
5305 "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57"
5306 "\xba\x63\x7b\x39\x1a\xaf\xd2\x55",
5307 .ilen = 64,
5308 .result = "\x39\x80\xca\x0b\x3c\x00\xe8\x41"
5309 "\xeb\x06\xfa\xc4\x87\x2a\x27\x57"
5310 "\x85\x9e\x1c\xea\xa6\xef\xd9\x84"
5311 "\x62\x85\x93\xb4\x0c\xa1\xe1\x9c"
5312 "\x7d\x77\x3d\x00\xc1\x44\xc5\x25"
5313 "\xac\x61\x9d\x18\xc8\x4a\x3f\x47"
5314 "\x18\xe2\x44\x8b\x2f\xe3\x24\xd9"
5315 "\xcc\xda\x27\x10\xac\xad\xe2\x56"
5316 "\x99\x24\xa7\xc8\x58\x73\x36\xbf"
5317 "\xb1\x18\x02\x4d\xb8\x67\x4a\x14",
5318 .rlen = 80,
5319 }, {
5320 .key = "\xfe\xff\xe9\x92\x86\x65\x73\x1c"
5321 "\x6d\x6a\x8f\x94\x67\x30\x83\x08"
5322 "\xfe\xff\xe9\x92\x86\x65\x73\x1c",
5323 .klen = 24,
5324 .iv = "\xca\xfe\xba\xbe\xfa\xce\xdb\xad"
5325 "\xde\xca\xf8\x88",
5326 .input = "\xd9\x31\x32\x25\xf8\x84\x06\xe5"
5327 "\xa5\x59\x09\xc5\xaf\xf5\x26\x9a"
5328 "\x86\xa7\xa9\x53\x15\x34\xf7\xda"
5329 "\x2e\x4c\x30\x3d\x8a\x31\x8a\x72"
5330 "\x1c\x3c\x0c\x95\x95\x68\x09\x53"
5331 "\x2f\xcf\x0e\x24\x49\xa6\xb5\x25"
5332 "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57"
5333 "\xba\x63\x7b\x39",
5334 .ilen = 60,
5335 .assoc = "\xfe\xed\xfa\xce\xde\xad\xbe\xef"
5336 "\xfe\xed\xfa\xce\xde\xad\xbe\xef"
5337 "\xab\xad\xda\xd2",
5338 .alen = 20,
5339 .result = "\x39\x80\xca\x0b\x3c\x00\xe8\x41"
5340 "\xeb\x06\xfa\xc4\x87\x2a\x27\x57"
5341 "\x85\x9e\x1c\xea\xa6\xef\xd9\x84"
5342 "\x62\x85\x93\xb4\x0c\xa1\xe1\x9c"
5343 "\x7d\x77\x3d\x00\xc1\x44\xc5\x25"
5344 "\xac\x61\x9d\x18\xc8\x4a\x3f\x47"
5345 "\x18\xe2\x44\x8b\x2f\xe3\x24\xd9"
5346 "\xcc\xda\x27\x10"
5347 "\x25\x19\x49\x8e\x80\xf1\x47\x8f"
5348 "\x37\xba\x55\xbd\x6d\x27\x61\x8c",
5349 .rlen = 76,
5350 .np = 2,
5351 .tap = { 32, 28 },
5352 .anp = 2,
5353 .atap = { 8, 12 }
5354 }, {
5355 .key = zeroed_string,
5356 .klen = 32,
5357 .result = "\x53\x0f\x8a\xfb\xc7\x45\x36\xb9"
5358 "\xa9\x63\xb4\xf1\xc4\xcb\x73\x8b",
5359 .rlen = 16,
5360 }
5361};
5362
5363static struct aead_testvec aes_gcm_dec_tv_template[] = {
5364 { /* From McGrew & Viega - http://citeseer.ist.psu.edu/656989.html */
5365 .key = zeroed_string,
5366 .klen = 32,
5367 .input = "\xce\xa7\x40\x3d\x4d\x60\x6b\x6e"
5368 "\x07\x4e\xc5\xd3\xba\xf3\x9d\x18"
5369 "\xd0\xd1\xc8\xa7\x99\x99\x6b\xf0"
5370 "\x26\x5b\x98\xb5\xd4\x8a\xb9\x19",
5371 .ilen = 32,
5372 .result = zeroed_string,
5373 .rlen = 16,
5374 }, {
5375 .key = "\xfe\xff\xe9\x92\x86\x65\x73\x1c"
5376 "\x6d\x6a\x8f\x94\x67\x30\x83\x08"
5377 "\xfe\xff\xe9\x92\x86\x65\x73\x1c"
5378 "\x6d\x6a\x8f\x94\x67\x30\x83\x08",
5379 .klen = 32,
5380 .iv = "\xca\xfe\xba\xbe\xfa\xce\xdb\xad"
5381 "\xde\xca\xf8\x88",
5382 .input = "\x52\x2d\xc1\xf0\x99\x56\x7d\x07"
5383 "\xf4\x7f\x37\xa3\x2a\x84\x42\x7d"
5384 "\x64\x3a\x8c\xdc\xbf\xe5\xc0\xc9"
5385 "\x75\x98\xa2\xbd\x25\x55\xd1\xaa"
5386 "\x8c\xb0\x8e\x48\x59\x0d\xbb\x3d"
5387 "\xa7\xb0\x8b\x10\x56\x82\x88\x38"
5388 "\xc5\xf6\x1e\x63\x93\xba\x7a\x0a"
5389 "\xbc\xc9\xf6\x62\x89\x80\x15\xad"
5390 "\xb0\x94\xda\xc5\xd9\x34\x71\xbd"
5391 "\xec\x1a\x50\x22\x70\xe3\xcc\x6c",
5392 .ilen = 80,
5393 .result = "\xd9\x31\x32\x25\xf8\x84\x06\xe5"
5394 "\xa5\x59\x09\xc5\xaf\xf5\x26\x9a"
5395 "\x86\xa7\xa9\x53\x15\x34\xf7\xda"
5396 "\x2e\x4c\x30\x3d\x8a\x31\x8a\x72"
5397 "\x1c\x3c\x0c\x95\x95\x68\x09\x53"
5398 "\x2f\xcf\x0e\x24\x49\xa6\xb5\x25"
5399 "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57"
5400 "\xba\x63\x7b\x39\x1a\xaf\xd2\x55",
5401 .rlen = 64,
5402 }, {
5403 .key = "\xfe\xff\xe9\x92\x86\x65\x73\x1c"
5404 "\x6d\x6a\x8f\x94\x67\x30\x83\x08"
5405 "\xfe\xff\xe9\x92\x86\x65\x73\x1c"
5406 "\x6d\x6a\x8f\x94\x67\x30\x83\x08",
5407 .klen = 32,
5408 .iv = "\xca\xfe\xba\xbe\xfa\xce\xdb\xad"
5409 "\xde\xca\xf8\x88",
5410 .input = "\x52\x2d\xc1\xf0\x99\x56\x7d\x07"
5411 "\xf4\x7f\x37\xa3\x2a\x84\x42\x7d"
5412 "\x64\x3a\x8c\xdc\xbf\xe5\xc0\xc9"
5413 "\x75\x98\xa2\xbd\x25\x55\xd1\xaa"
5414 "\x8c\xb0\x8e\x48\x59\x0d\xbb\x3d"
5415 "\xa7\xb0\x8b\x10\x56\x82\x88\x38"
5416 "\xc5\xf6\x1e\x63\x93\xba\x7a\x0a"
5417 "\xbc\xc9\xf6\x62"
5418 "\x76\xfc\x6e\xce\x0f\x4e\x17\x68"
5419 "\xcd\xdf\x88\x53\xbb\x2d\x55\x1b",
5420 .ilen = 76,
5421 .assoc = "\xfe\xed\xfa\xce\xde\xad\xbe\xef"
5422 "\xfe\xed\xfa\xce\xde\xad\xbe\xef"
5423 "\xab\xad\xda\xd2",
5424 .alen = 20,
5425 .result = "\xd9\x31\x32\x25\xf8\x84\x06\xe5"
5426 "\xa5\x59\x09\xc5\xaf\xf5\x26\x9a"
5427 "\x86\xa7\xa9\x53\x15\x34\xf7\xda"
5428 "\x2e\x4c\x30\x3d\x8a\x31\x8a\x72"
5429 "\x1c\x3c\x0c\x95\x95\x68\x09\x53"
5430 "\x2f\xcf\x0e\x24\x49\xa6\xb5\x25"
5431 "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57"
5432 "\xba\x63\x7b\x39",
5433 .rlen = 60,
5434 .np = 2,
5435 .tap = { 48, 28 },
5436 .anp = 3,
5437 .atap = { 8, 8, 4 }
5438 }, {
5439 .key = "\xfe\xff\xe9\x92\x86\x65\x73\x1c"
5440 "\x6d\x6a\x8f\x94\x67\x30\x83\x08",
5441 .klen = 16,
5442 .iv = "\xca\xfe\xba\xbe\xfa\xce\xdb\xad"
5443 "\xde\xca\xf8\x88",
5444 .input = "\x42\x83\x1e\xc2\x21\x77\x74\x24"
5445 "\x4b\x72\x21\xb7\x84\xd0\xd4\x9c"
5446 "\xe3\xaa\x21\x2f\x2c\x02\xa4\xe0"
5447 "\x35\xc1\x7e\x23\x29\xac\xa1\x2e"
5448 "\x21\xd5\x14\xb2\x54\x66\x93\x1c"
5449 "\x7d\x8f\x6a\x5a\xac\x84\xaa\x05"
5450 "\x1b\xa3\x0b\x39\x6a\x0a\xac\x97"
5451 "\x3d\x58\xe0\x91\x47\x3f\x59\x85"
5452 "\x4d\x5c\x2a\xf3\x27\xcd\x64\xa6"
5453 "\x2c\xf3\x5a\xbd\x2b\xa6\xfa\xb4",
5454 .ilen = 80,
5455 .result = "\xd9\x31\x32\x25\xf8\x84\x06\xe5"
5456 "\xa5\x59\x09\xc5\xaf\xf5\x26\x9a"
5457 "\x86\xa7\xa9\x53\x15\x34\xf7\xda"
5458 "\x2e\x4c\x30\x3d\x8a\x31\x8a\x72"
5459 "\x1c\x3c\x0c\x95\x95\x68\x09\x53"
5460 "\x2f\xcf\x0e\x24\x49\xa6\xb5\x25"
5461 "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57"
5462 "\xba\x63\x7b\x39\x1a\xaf\xd2\x55",
5463 .rlen = 64,
5464 }, {
5465 .key = "\xfe\xff\xe9\x92\x86\x65\x73\x1c"
5466 "\x6d\x6a\x8f\x94\x67\x30\x83\x08",
5467 .klen = 16,
5468 .iv = "\xca\xfe\xba\xbe\xfa\xce\xdb\xad"
5469 "\xde\xca\xf8\x88",
5470 .input = "\x42\x83\x1e\xc2\x21\x77\x74\x24"
5471 "\x4b\x72\x21\xb7\x84\xd0\xd4\x9c"
5472 "\xe3\xaa\x21\x2f\x2c\x02\xa4\xe0"
5473 "\x35\xc1\x7e\x23\x29\xac\xa1\x2e"
5474 "\x21\xd5\x14\xb2\x54\x66\x93\x1c"
5475 "\x7d\x8f\x6a\x5a\xac\x84\xaa\x05"
5476 "\x1b\xa3\x0b\x39\x6a\x0a\xac\x97"
5477 "\x3d\x58\xe0\x91"
5478 "\x5b\xc9\x4f\xbc\x32\x21\xa5\xdb"
5479 "\x94\xfa\xe9\x5a\xe7\x12\x1a\x47",
5480 .ilen = 76,
5481 .assoc = "\xfe\xed\xfa\xce\xde\xad\xbe\xef"
5482 "\xfe\xed\xfa\xce\xde\xad\xbe\xef"
5483 "\xab\xad\xda\xd2",
5484 .alen = 20,
5485 .result = "\xd9\x31\x32\x25\xf8\x84\x06\xe5"
5486 "\xa5\x59\x09\xc5\xaf\xf5\x26\x9a"
5487 "\x86\xa7\xa9\x53\x15\x34\xf7\xda"
5488 "\x2e\x4c\x30\x3d\x8a\x31\x8a\x72"
5489 "\x1c\x3c\x0c\x95\x95\x68\x09\x53"
5490 "\x2f\xcf\x0e\x24\x49\xa6\xb5\x25"
5491 "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57"
5492 "\xba\x63\x7b\x39",
5493 .rlen = 60,
5494 }, {
5495 .key = zeroed_string,
5496 .klen = 24,
5497 .input = "\x98\xe7\x24\x7c\x07\xf0\xfe\x41"
5498 "\x1c\x26\x7e\x43\x84\xb0\xf6\x00"
5499 "\x2f\xf5\x8d\x80\x03\x39\x27\xab"
5500 "\x8e\xf4\xd4\x58\x75\x14\xf0\xfb",
5501 .ilen = 32,
5502 .result = zeroed_string,
5503 .rlen = 16,
5504 }, {
5505 .key = "\xfe\xff\xe9\x92\x86\x65\x73\x1c"
5506 "\x6d\x6a\x8f\x94\x67\x30\x83\x08"
5507 "\xfe\xff\xe9\x92\x86\x65\x73\x1c",
5508 .klen = 24,
5509 .iv = "\xca\xfe\xba\xbe\xfa\xce\xdb\xad"
5510 "\xde\xca\xf8\x88",
5511 .input = "\x39\x80\xca\x0b\x3c\x00\xe8\x41"
5512 "\xeb\x06\xfa\xc4\x87\x2a\x27\x57"
5513 "\x85\x9e\x1c\xea\xa6\xef\xd9\x84"
5514 "\x62\x85\x93\xb4\x0c\xa1\xe1\x9c"
5515 "\x7d\x77\x3d\x00\xc1\x44\xc5\x25"
5516 "\xac\x61\x9d\x18\xc8\x4a\x3f\x47"
5517 "\x18\xe2\x44\x8b\x2f\xe3\x24\xd9"
5518 "\xcc\xda\x27\x10\xac\xad\xe2\x56"
5519 "\x99\x24\xa7\xc8\x58\x73\x36\xbf"
5520 "\xb1\x18\x02\x4d\xb8\x67\x4a\x14",
5521 .ilen = 80,
5522 .result = "\xd9\x31\x32\x25\xf8\x84\x06\xe5"
5523 "\xa5\x59\x09\xc5\xaf\xf5\x26\x9a"
5524 "\x86\xa7\xa9\x53\x15\x34\xf7\xda"
5525 "\x2e\x4c\x30\x3d\x8a\x31\x8a\x72"
5526 "\x1c\x3c\x0c\x95\x95\x68\x09\x53"
5527 "\x2f\xcf\x0e\x24\x49\xa6\xb5\x25"
5528 "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57"
5529 "\xba\x63\x7b\x39\x1a\xaf\xd2\x55",
5530 .rlen = 64,
5531 }, {
5532 .key = "\xfe\xff\xe9\x92\x86\x65\x73\x1c"
5533 "\x6d\x6a\x8f\x94\x67\x30\x83\x08"
5534 "\xfe\xff\xe9\x92\x86\x65\x73\x1c",
5535 .klen = 24,
5536 .iv = "\xca\xfe\xba\xbe\xfa\xce\xdb\xad"
5537 "\xde\xca\xf8\x88",
5538 .input = "\x39\x80\xca\x0b\x3c\x00\xe8\x41"
5539 "\xeb\x06\xfa\xc4\x87\x2a\x27\x57"
5540 "\x85\x9e\x1c\xea\xa6\xef\xd9\x84"
5541 "\x62\x85\x93\xb4\x0c\xa1\xe1\x9c"
5542 "\x7d\x77\x3d\x00\xc1\x44\xc5\x25"
5543 "\xac\x61\x9d\x18\xc8\x4a\x3f\x47"
5544 "\x18\xe2\x44\x8b\x2f\xe3\x24\xd9"
5545 "\xcc\xda\x27\x10"
5546 "\x25\x19\x49\x8e\x80\xf1\x47\x8f"
5547 "\x37\xba\x55\xbd\x6d\x27\x61\x8c",
5548 .ilen = 76,
5549 .assoc = "\xfe\xed\xfa\xce\xde\xad\xbe\xef"
5550 "\xfe\xed\xfa\xce\xde\xad\xbe\xef"
5551 "\xab\xad\xda\xd2",
5552 .alen = 20,
5553 .result = "\xd9\x31\x32\x25\xf8\x84\x06\xe5"
5554 "\xa5\x59\x09\xc5\xaf\xf5\x26\x9a"
5555 "\x86\xa7\xa9\x53\x15\x34\xf7\xda"
5556 "\x2e\x4c\x30\x3d\x8a\x31\x8a\x72"
5557 "\x1c\x3c\x0c\x95\x95\x68\x09\x53"
5558 "\x2f\xcf\x0e\x24\x49\xa6\xb5\x25"
5559 "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57"
5560 "\xba\x63\x7b\x39",
5561 .rlen = 60,
5562 }
5563};
5564
5565static struct aead_testvec aes_ccm_enc_tv_template[] = {
5566 { /* From RFC 3610 */
5567 .key = "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
5568 "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf",
5569 .klen = 16,
5570 .iv = "\x01\x00\x00\x00\x03\x02\x01\x00"
5571 "\xa0\xa1\xa2\xa3\xa4\xa5\x00\x00",
5572 .assoc = "\x00\x01\x02\x03\x04\x05\x06\x07",
5573 .alen = 8,
5574 .input = "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
5575 "\x10\x11\x12\x13\x14\x15\x16\x17"
5576 "\x18\x19\x1a\x1b\x1c\x1d\x1e",
5577 .ilen = 23,
5578 .result = "\x58\x8c\x97\x9a\x61\xc6\x63\xd2"
5579 "\xf0\x66\xd0\xc2\xc0\xf9\x89\x80"
5580 "\x6d\x5f\x6b\x61\xda\xc3\x84\x17"
5581 "\xe8\xd1\x2c\xfd\xf9\x26\xe0",
5582 .rlen = 31,
5583 }, {
5584 .key = "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
5585 "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf",
5586 .klen = 16,
5587 .iv = "\x01\x00\x00\x00\x07\x06\x05\x04"
5588 "\xa0\xa1\xa2\xa3\xa4\xa5\x00\x00",
5589 .assoc = "\x00\x01\x02\x03\x04\x05\x06\x07"
5590 "\x08\x09\x0a\x0b",
5591 .alen = 12,
5592 .input = "\x0c\x0d\x0e\x0f\x10\x11\x12\x13"
5593 "\x14\x15\x16\x17\x18\x19\x1a\x1b"
5594 "\x1c\x1d\x1e\x1f",
5595 .ilen = 20,
5596 .result = "\xdc\xf1\xfb\x7b\x5d\x9e\x23\xfb"
5597 "\x9d\x4e\x13\x12\x53\x65\x8a\xd8"
5598 "\x6e\xbd\xca\x3e\x51\xe8\x3f\x07"
5599 "\x7d\x9c\x2d\x93",
5600 .rlen = 28,
5601 }, {
5602 .key = "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
5603 "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf",
5604 .klen = 16,
5605 .iv = "\x01\x00\x00\x00\x0b\x0a\x09\x08"
5606 "\xa0\xa1\xa2\xa3\xa4\xa5\x00\x00",
5607 .assoc = "\x00\x01\x02\x03\x04\x05\x06\x07",
5608 .alen = 8,
5609 .input = "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
5610 "\x10\x11\x12\x13\x14\x15\x16\x17"
5611 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
5612 "\x20",
5613 .ilen = 25,
5614 .result = "\x82\x53\x1a\x60\xcc\x24\x94\x5a"
5615 "\x4b\x82\x79\x18\x1a\xb5\xc8\x4d"
5616 "\xf2\x1c\xe7\xf9\xb7\x3f\x42\xe1"
5617 "\x97\xea\x9c\x07\xe5\x6b\x5e\xb1"
5618 "\x7e\x5f\x4e",
5619 .rlen = 35,
5620 }, {
5621 .key = "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
5622 "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf",
5623 .klen = 16,
5624 .iv = "\x01\x00\x00\x00\x0c\x0b\x0a\x09"
5625 "\xa0\xa1\xa2\xa3\xa4\xa5\x00\x00",
5626 .assoc = "\x00\x01\x02\x03\x04\x05\x06\x07"
5627 "\x08\x09\x0a\x0b",
5628 .alen = 12,
5629 .input = "\x0c\x0d\x0e\x0f\x10\x11\x12\x13"
5630 "\x14\x15\x16\x17\x18\x19\x1a\x1b"
5631 "\x1c\x1d\x1e",
5632 .ilen = 19,
5633 .result = "\x07\x34\x25\x94\x15\x77\x85\x15"
5634 "\x2b\x07\x40\x98\x33\x0a\xbb\x14"
5635 "\x1b\x94\x7b\x56\x6a\xa9\x40\x6b"
5636 "\x4d\x99\x99\x88\xdd",
5637 .rlen = 29,
5638 }, {
5639 .key = "\xd7\x82\x8d\x13\xb2\xb0\xbd\xc3"
5640 "\x25\xa7\x62\x36\xdf\x93\xcc\x6b",
5641 .klen = 16,
5642 .iv = "\x01\x00\x33\x56\x8e\xf7\xb2\x63"
5643 "\x3c\x96\x96\x76\x6c\xfa\x00\x00",
5644 .assoc = "\x63\x01\x8f\x76\xdc\x8a\x1b\xcb",
5645 .alen = 8,
5646 .input = "\x90\x20\xea\x6f\x91\xbd\xd8\x5a"
5647 "\xfa\x00\x39\xba\x4b\xaf\xf9\xbf"
5648 "\xb7\x9c\x70\x28\x94\x9c\xd0\xec",
5649 .ilen = 24,
5650 .result = "\x4c\xcb\x1e\x7c\xa9\x81\xbe\xfa"
5651 "\xa0\x72\x6c\x55\xd3\x78\x06\x12"
5652 "\x98\xc8\x5c\x92\x81\x4a\xbc\x33"
5653 "\xc5\x2e\xe8\x1d\x7d\x77\xc0\x8a",
5654 .rlen = 32,
5655 }, {
5656 .key = "\xd7\x82\x8d\x13\xb2\xb0\xbd\xc3"
5657 "\x25\xa7\x62\x36\xdf\x93\xcc\x6b",
5658 .klen = 16,
5659 .iv = "\x01\x00\xd5\x60\x91\x2d\x3f\x70"
5660 "\x3c\x96\x96\x76\x6c\xfa\x00\x00",
5661 .assoc = "\xcd\x90\x44\xd2\xb7\x1f\xdb\x81"
5662 "\x20\xea\x60\xc0",
5663 .alen = 12,
5664 .input = "\x64\x35\xac\xba\xfb\x11\xa8\x2e"
5665 "\x2f\x07\x1d\x7c\xa4\xa5\xeb\xd9"
5666 "\x3a\x80\x3b\xa8\x7f",
5667 .ilen = 21,
5668 .result = "\x00\x97\x69\xec\xab\xdf\x48\x62"
5669 "\x55\x94\xc5\x92\x51\xe6\x03\x57"
5670 "\x22\x67\x5e\x04\xc8\x47\x09\x9e"
5671 "\x5a\xe0\x70\x45\x51",
5672 .rlen = 29,
5673 }, {
5674 .key = "\xd7\x82\x8d\x13\xb2\xb0\xbd\xc3"
5675 "\x25\xa7\x62\x36\xdf\x93\xcc\x6b",
5676 .klen = 16,
5677 .iv = "\x01\x00\x42\xff\xf8\xf1\x95\x1c"
5678 "\x3c\x96\x96\x76\x6c\xfa\x00\x00",
5679 .assoc = "\xd8\x5b\xc7\xe6\x9f\x94\x4f\xb8",
5680 .alen = 8,
5681 .input = "\x8a\x19\xb9\x50\xbc\xf7\x1a\x01"
5682 "\x8e\x5e\x67\x01\xc9\x17\x87\x65"
5683 "\x98\x09\xd6\x7d\xbe\xdd\x18",
5684 .ilen = 23,
5685 .result = "\xbc\x21\x8d\xaa\x94\x74\x27\xb6"
5686 "\xdb\x38\x6a\x99\xac\x1a\xef\x23"
5687 "\xad\xe0\xb5\x29\x39\xcb\x6a\x63"
5688 "\x7c\xf9\xbe\xc2\x40\x88\x97\xc6"
5689 "\xba",
5690 .rlen = 33,
5691 },
5692};
5693
5694static struct aead_testvec aes_ccm_dec_tv_template[] = {
5695 { /* From RFC 3610 */
5696 .key = "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
5697 "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf",
5698 .klen = 16,
5699 .iv = "\x01\x00\x00\x00\x03\x02\x01\x00"
5700 "\xa0\xa1\xa2\xa3\xa4\xa5\x00\x00",
5701 .assoc = "\x00\x01\x02\x03\x04\x05\x06\x07",
5702 .alen = 8,
5703 .input = "\x58\x8c\x97\x9a\x61\xc6\x63\xd2"
5704 "\xf0\x66\xd0\xc2\xc0\xf9\x89\x80"
5705 "\x6d\x5f\x6b\x61\xda\xc3\x84\x17"
5706 "\xe8\xd1\x2c\xfd\xf9\x26\xe0",
5707 .ilen = 31,
5708 .result = "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
5709 "\x10\x11\x12\x13\x14\x15\x16\x17"
5710 "\x18\x19\x1a\x1b\x1c\x1d\x1e",
5711 .rlen = 23,
5712 }, {
5713 .key = "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
5714 "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf",
5715 .klen = 16,
5716 .iv = "\x01\x00\x00\x00\x07\x06\x05\x04"
5717 "\xa0\xa1\xa2\xa3\xa4\xa5\x00\x00",
5718 .assoc = "\x00\x01\x02\x03\x04\x05\x06\x07"
5719 "\x08\x09\x0a\x0b",
5720 .alen = 12,
5721 .input = "\xdc\xf1\xfb\x7b\x5d\x9e\x23\xfb"
5722 "\x9d\x4e\x13\x12\x53\x65\x8a\xd8"
5723 "\x6e\xbd\xca\x3e\x51\xe8\x3f\x07"
5724 "\x7d\x9c\x2d\x93",
5725 .ilen = 28,
5726 .result = "\x0c\x0d\x0e\x0f\x10\x11\x12\x13"
5727 "\x14\x15\x16\x17\x18\x19\x1a\x1b"
5728 "\x1c\x1d\x1e\x1f",
5729 .rlen = 20,
5730 }, {
5731 .key = "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
5732 "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf",
5733 .klen = 16,
5734 .iv = "\x01\x00\x00\x00\x0b\x0a\x09\x08"
5735 "\xa0\xa1\xa2\xa3\xa4\xa5\x00\x00",
5736 .assoc = "\x00\x01\x02\x03\x04\x05\x06\x07",
5737 .alen = 8,
5738 .input = "\x82\x53\x1a\x60\xcc\x24\x94\x5a"
5739 "\x4b\x82\x79\x18\x1a\xb5\xc8\x4d"
5740 "\xf2\x1c\xe7\xf9\xb7\x3f\x42\xe1"
5741 "\x97\xea\x9c\x07\xe5\x6b\x5e\xb1"
5742 "\x7e\x5f\x4e",
5743 .ilen = 35,
5744 .result = "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
5745 "\x10\x11\x12\x13\x14\x15\x16\x17"
5746 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
5747 "\x20",
5748 .rlen = 25,
5749 }, {
5750 .key = "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
5751 "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf",
5752 .klen = 16,
5753 .iv = "\x01\x00\x00\x00\x0c\x0b\x0a\x09"
5754 "\xa0\xa1\xa2\xa3\xa4\xa5\x00\x00",
5755 .assoc = "\x00\x01\x02\x03\x04\x05\x06\x07"
5756 "\x08\x09\x0a\x0b",
5757 .alen = 12,
5758 .input = "\x07\x34\x25\x94\x15\x77\x85\x15"
5759 "\x2b\x07\x40\x98\x33\x0a\xbb\x14"
5760 "\x1b\x94\x7b\x56\x6a\xa9\x40\x6b"
5761 "\x4d\x99\x99\x88\xdd",
5762 .ilen = 29,
5763 .result = "\x0c\x0d\x0e\x0f\x10\x11\x12\x13"
5764 "\x14\x15\x16\x17\x18\x19\x1a\x1b"
5765 "\x1c\x1d\x1e",
5766 .rlen = 19,
5767 }, {
5768 .key = "\xd7\x82\x8d\x13\xb2\xb0\xbd\xc3"
5769 "\x25\xa7\x62\x36\xdf\x93\xcc\x6b",
5770 .klen = 16,
5771 .iv = "\x01\x00\x33\x56\x8e\xf7\xb2\x63"
5772 "\x3c\x96\x96\x76\x6c\xfa\x00\x00",
5773 .assoc = "\x63\x01\x8f\x76\xdc\x8a\x1b\xcb",
5774 .alen = 8,
5775 .input = "\x4c\xcb\x1e\x7c\xa9\x81\xbe\xfa"
5776 "\xa0\x72\x6c\x55\xd3\x78\x06\x12"
5777 "\x98\xc8\x5c\x92\x81\x4a\xbc\x33"
5778 "\xc5\x2e\xe8\x1d\x7d\x77\xc0\x8a",
5779 .ilen = 32,
5780 .result = "\x90\x20\xea\x6f\x91\xbd\xd8\x5a"
5781 "\xfa\x00\x39\xba\x4b\xaf\xf9\xbf"
5782 "\xb7\x9c\x70\x28\x94\x9c\xd0\xec",
5783 .rlen = 24,
5784 }, {
5785 .key = "\xd7\x82\x8d\x13\xb2\xb0\xbd\xc3"
5786 "\x25\xa7\x62\x36\xdf\x93\xcc\x6b",
5787 .klen = 16,
5788 .iv = "\x01\x00\xd5\x60\x91\x2d\x3f\x70"
5789 "\x3c\x96\x96\x76\x6c\xfa\x00\x00",
5790 .assoc = "\xcd\x90\x44\xd2\xb7\x1f\xdb\x81"
5791 "\x20\xea\x60\xc0",
5792 .alen = 12,
5793 .input = "\x00\x97\x69\xec\xab\xdf\x48\x62"
5794 "\x55\x94\xc5\x92\x51\xe6\x03\x57"
5795 "\x22\x67\x5e\x04\xc8\x47\x09\x9e"
5796 "\x5a\xe0\x70\x45\x51",
5797 .ilen = 29,
5798 .result = "\x64\x35\xac\xba\xfb\x11\xa8\x2e"
5799 "\x2f\x07\x1d\x7c\xa4\xa5\xeb\xd9"
5800 "\x3a\x80\x3b\xa8\x7f",
5801 .rlen = 21,
5802 }, {
5803 .key = "\xd7\x82\x8d\x13\xb2\xb0\xbd\xc3"
5804 "\x25\xa7\x62\x36\xdf\x93\xcc\x6b",
5805 .klen = 16,
5806 .iv = "\x01\x00\x42\xff\xf8\xf1\x95\x1c"
5807 "\x3c\x96\x96\x76\x6c\xfa\x00\x00",
5808 .assoc = "\xd8\x5b\xc7\xe6\x9f\x94\x4f\xb8",
5809 .alen = 8,
5810 .input = "\xbc\x21\x8d\xaa\x94\x74\x27\xb6"
5811 "\xdb\x38\x6a\x99\xac\x1a\xef\x23"
5812 "\xad\xe0\xb5\x29\x39\xcb\x6a\x63"
5813 "\x7c\xf9\xbe\xc2\x40\x88\x97\xc6"
5814 "\xba",
5815 .ilen = 33,
5816 .result = "\x8a\x19\xb9\x50\xbc\xf7\x1a\x01"
5817 "\x8e\x5e\x67\x01\xc9\x17\x87\x65"
5818 "\x98\x09\xd6\x7d\xbe\xdd\x18",
5819 .rlen = 23,
5820 },
5821};
5822
5823/* Cast5 test vectors from RFC 2144 */
5824#define CAST5_ENC_TEST_VECTORS 3
5825#define CAST5_DEC_TEST_VECTORS 3
5826
5827static struct cipher_testvec cast5_enc_tv_template[] = {
5828 {
5829 .key = "\x01\x23\x45\x67\x12\x34\x56\x78"
5830 "\x23\x45\x67\x89\x34\x56\x78\x9a",
5831 .klen = 16,
5832 .input = "\x01\x23\x45\x67\x89\xab\xcd\xef",
5833 .ilen = 8,
5834 .result = "\x23\x8b\x4f\xe5\x84\x7e\x44\xb2",
5835 .rlen = 8,
5836 }, {
5837 .key = "\x01\x23\x45\x67\x12\x34\x56\x78"
5838 "\x23\x45",
5839 .klen = 10,
5840 .input = "\x01\x23\x45\x67\x89\xab\xcd\xef",
5841 .ilen = 8,
5842 .result = "\xeb\x6a\x71\x1a\x2c\x02\x27\x1b",
5843 .rlen = 8,
5844 }, {
5845 .key = "\x01\x23\x45\x67\x12",
5846 .klen = 5,
5847 .input = "\x01\x23\x45\x67\x89\xab\xcd\xef",
5848 .ilen = 8,
5849 .result = "\x7a\xc8\x16\xd1\x6e\x9b\x30\x2e",
5850 .rlen = 8,
5851 },
5852};
5853
5854static struct cipher_testvec cast5_dec_tv_template[] = {
5855 {
5856 .key = "\x01\x23\x45\x67\x12\x34\x56\x78"
5857 "\x23\x45\x67\x89\x34\x56\x78\x9a",
5858 .klen = 16,
5859 .input = "\x23\x8b\x4f\xe5\x84\x7e\x44\xb2",
5860 .ilen = 8,
5861 .result = "\x01\x23\x45\x67\x89\xab\xcd\xef",
5862 .rlen = 8,
5863 }, {
5864 .key = "\x01\x23\x45\x67\x12\x34\x56\x78"
5865 "\x23\x45",
5866 .klen = 10,
5867 .input = "\xeb\x6a\x71\x1a\x2c\x02\x27\x1b",
5868 .ilen = 8,
5869 .result = "\x01\x23\x45\x67\x89\xab\xcd\xef",
5870 .rlen = 8,
5871 }, {
5872 .key = "\x01\x23\x45\x67\x12",
5873 .klen = 5,
5874 .input = "\x7a\xc8\x16\xd1\x6e\x9b\x30\x2e",
5875 .ilen = 8,
5876 .result = "\x01\x23\x45\x67\x89\xab\xcd\xef",
5877 .rlen = 8,
5878 },
5879};
5880
5881/*
5882 * ARC4 test vectors from OpenSSL
5883 */
5884#define ARC4_ENC_TEST_VECTORS 7
5885#define ARC4_DEC_TEST_VECTORS 7
5886
5887static struct cipher_testvec arc4_enc_tv_template[] = {
5888 {
5889 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
5890 .klen = 8,
5891 .input = "\x01\x23\x45\x67\x89\xab\xcd\xef",
5892 .ilen = 8,
5893 .result = "\x75\xb7\x87\x80\x99\xe0\xc5\x96",
5894 .rlen = 8,
5895 }, {
5896 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
5897 .klen = 8,
5898 .input = "\x00\x00\x00\x00\x00\x00\x00\x00",
5899 .ilen = 8,
5900 .result = "\x74\x94\xc2\xe7\x10\x4b\x08\x79",
5901 .rlen = 8,
5902 }, {
5903 .key = "\x00\x00\x00\x00\x00\x00\x00\x00",
5904 .klen = 8,
5905 .input = "\x00\x00\x00\x00\x00\x00\x00\x00",
5906 .ilen = 8,
5907 .result = "\xde\x18\x89\x41\xa3\x37\x5d\x3a",
5908 .rlen = 8,
5909 }, {
5910 .key = "\xef\x01\x23\x45",
5911 .klen = 4,
5912 .input = "\x00\x00\x00\x00\x00\x00\x00\x00"
5913 "\x00\x00\x00\x00\x00\x00\x00\x00"
5914 "\x00\x00\x00\x00",
5915 .ilen = 20,
5916 .result = "\xd6\xa1\x41\xa7\xec\x3c\x38\xdf"
5917 "\xbd\x61\x5a\x11\x62\xe1\xc7\xba"
5918 "\x36\xb6\x78\x58",
5919 .rlen = 20,
5920 }, {
5921 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
5922 .klen = 8,
5923 .input = "\x12\x34\x56\x78\x9A\xBC\xDE\xF0"
5924 "\x12\x34\x56\x78\x9A\xBC\xDE\xF0"
5925 "\x12\x34\x56\x78\x9A\xBC\xDE\xF0"
5926 "\x12\x34\x56\x78",
5927 .ilen = 28,
5928 .result = "\x66\xa0\x94\x9f\x8a\xf7\xd6\x89"
5929 "\x1f\x7f\x83\x2b\xa8\x33\xc0\x0c"
5930 "\x89\x2e\xbe\x30\x14\x3c\xe2\x87"
5931 "\x40\x01\x1e\xcf",
5932 .rlen = 28,
5933 }, {
5934 .key = "\xef\x01\x23\x45",
5935 .klen = 4,
5936 .input = "\x00\x00\x00\x00\x00\x00\x00\x00"
5937 "\x00\x00",
5938 .ilen = 10,
5939 .result = "\xd6\xa1\x41\xa7\xec\x3c\x38\xdf"
5940 "\xbd\x61",
5941 .rlen = 10,
5942 }, {
5943 .key = "\x01\x23\x45\x67\x89\xAB\xCD\xEF"
5944 "\x00\x00\x00\x00\x00\x00\x00\x00",
5945 .klen = 16,
5946 .input = "\x01\x23\x45\x67\x89\xAB\xCD\xEF",
5947 .ilen = 8,
5948 .result = "\x69\x72\x36\x59\x1B\x52\x42\xB1",
5949 .rlen = 8,
5950 },
5951};
5952
5953static struct cipher_testvec arc4_dec_tv_template[] = {
5954 {
5955 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
5956 .klen = 8,
5957 .input = "\x75\xb7\x87\x80\x99\xe0\xc5\x96",
5958 .ilen = 8,
5959 .result = "\x01\x23\x45\x67\x89\xab\xcd\xef",
5960 .rlen = 8,
5961 }, {
5962 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
5963 .klen = 8,
5964 .input = "\x74\x94\xc2\xe7\x10\x4b\x08\x79",
5965 .ilen = 8,
5966 .result = "\x00\x00\x00\x00\x00\x00\x00\x00",
5967 .rlen = 8,
5968 }, {
5969 .key = "\x00\x00\x00\x00\x00\x00\x00\x00",
5970 .klen = 8,
5971 .input = "\xde\x18\x89\x41\xa3\x37\x5d\x3a",
5972 .ilen = 8,
5973 .result = "\x00\x00\x00\x00\x00\x00\x00\x00",
5974 .rlen = 8,
5975 }, {
5976 .key = "\xef\x01\x23\x45",
5977 .klen = 4,
5978 .input = "\xd6\xa1\x41\xa7\xec\x3c\x38\xdf"
5979 "\xbd\x61\x5a\x11\x62\xe1\xc7\xba"
5980 "\x36\xb6\x78\x58",
5981 .ilen = 20,
5982 .result = "\x00\x00\x00\x00\x00\x00\x00\x00"
5983 "\x00\x00\x00\x00\x00\x00\x00\x00"
5984 "\x00\x00\x00\x00",
5985 .rlen = 20,
5986 }, {
5987 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef",
5988 .klen = 8,
5989 .input = "\x66\xa0\x94\x9f\x8a\xf7\xd6\x89"
5990 "\x1f\x7f\x83\x2b\xa8\x33\xc0\x0c"
5991 "\x89\x2e\xbe\x30\x14\x3c\xe2\x87"
5992 "\x40\x01\x1e\xcf",
5993 .ilen = 28,
5994 .result = "\x12\x34\x56\x78\x9A\xBC\xDE\xF0"
5995 "\x12\x34\x56\x78\x9A\xBC\xDE\xF0"
5996 "\x12\x34\x56\x78\x9A\xBC\xDE\xF0"
5997 "\x12\x34\x56\x78",
5998 .rlen = 28,
5999 }, {
6000 .key = "\xef\x01\x23\x45",
6001 .klen = 4,
6002 .input = "\xd6\xa1\x41\xa7\xec\x3c\x38\xdf"
6003 "\xbd\x61",
6004 .ilen = 10,
6005 .result = "\x00\x00\x00\x00\x00\x00\x00\x00"
6006 "\x00\x00",
6007 .rlen = 10,
6008 }, {
6009 .key = "\x01\x23\x45\x67\x89\xAB\xCD\xEF"
6010 "\x00\x00\x00\x00\x00\x00\x00\x00",
6011 .klen = 16,
6012 .input = "\x69\x72\x36\x59\x1B\x52\x42\xB1",
6013 .ilen = 8,
6014 .result = "\x01\x23\x45\x67\x89\xAB\xCD\xEF",
6015 .rlen = 8,
6016 },
6017};
6018
6019/*
6020 * TEA test vectors
6021 */
6022#define TEA_ENC_TEST_VECTORS 4
6023#define TEA_DEC_TEST_VECTORS 4
6024
6025static struct cipher_testvec tea_enc_tv_template[] = {
6026 {
6027 .key = zeroed_string,
6028 .klen = 16,
6029 .input = zeroed_string,
6030 .ilen = 8,
6031 .result = "\x0a\x3a\xea\x41\x40\xa9\xba\x94",
6032 .rlen = 8,
6033 }, {
6034 .key = "\x2b\x02\x05\x68\x06\x14\x49\x76"
6035 "\x77\x5d\x0e\x26\x6c\x28\x78\x43",
6036 .klen = 16,
6037 .input = "\x74\x65\x73\x74\x20\x6d\x65\x2e",
6038 .ilen = 8,
6039 .result = "\x77\x5d\x2a\x6a\xf6\xce\x92\x09",
6040 .rlen = 8,
6041 }, {
6042 .key = "\x09\x65\x43\x11\x66\x44\x39\x25"
6043 "\x51\x3a\x16\x10\x0a\x08\x12\x6e",
6044 .klen = 16,
6045 .input = "\x6c\x6f\x6e\x67\x65\x72\x5f\x74"
6046 "\x65\x73\x74\x5f\x76\x65\x63\x74",
6047 .ilen = 16,
6048 .result = "\xbe\x7a\xbb\x81\x95\x2d\x1f\x1e"
6049 "\xdd\x89\xa1\x25\x04\x21\xdf\x95",
6050 .rlen = 16,
6051 }, {
6052 .key = "\x4d\x76\x32\x17\x05\x3f\x75\x2c"
6053 "\x5d\x04\x16\x36\x15\x72\x63\x2f",
6054 .klen = 16,
6055 .input = "\x54\x65\x61\x20\x69\x73\x20\x67"
6056 "\x6f\x6f\x64\x20\x66\x6f\x72\x20"
6057 "\x79\x6f\x75\x21\x21\x21\x20\x72"
6058 "\x65\x61\x6c\x6c\x79\x21\x21\x21",
6059 .ilen = 32,
6060 .result = "\xe0\x4d\x5d\x3c\xb7\x8c\x36\x47"
6061 "\x94\x18\x95\x91\xa9\xfc\x49\xf8"
6062 "\x44\xd1\x2d\xc2\x99\xb8\x08\x2a"
6063 "\x07\x89\x73\xc2\x45\x92\xc6\x90",
6064 .rlen = 32,
6065 }
6066};
6067
6068static struct cipher_testvec tea_dec_tv_template[] = {
6069 {
6070 .key = zeroed_string,
6071 .klen = 16,
6072 .input = "\x0a\x3a\xea\x41\x40\xa9\xba\x94",
6073 .ilen = 8,
6074 .result = zeroed_string,
6075 .rlen = 8,
6076 }, {
6077 .key = "\x2b\x02\x05\x68\x06\x14\x49\x76"
6078 "\x77\x5d\x0e\x26\x6c\x28\x78\x43",
6079 .klen = 16,
6080 .input = "\x77\x5d\x2a\x6a\xf6\xce\x92\x09",
6081 .ilen = 8,
6082 .result = "\x74\x65\x73\x74\x20\x6d\x65\x2e",
6083 .rlen = 8,
6084 }, {
6085 .key = "\x09\x65\x43\x11\x66\x44\x39\x25"
6086 "\x51\x3a\x16\x10\x0a\x08\x12\x6e",
6087 .klen = 16,
6088 .input = "\xbe\x7a\xbb\x81\x95\x2d\x1f\x1e"
6089 "\xdd\x89\xa1\x25\x04\x21\xdf\x95",
6090 .ilen = 16,
6091 .result = "\x6c\x6f\x6e\x67\x65\x72\x5f\x74"
6092 "\x65\x73\x74\x5f\x76\x65\x63\x74",
6093 .rlen = 16,
6094 }, {
6095 .key = "\x4d\x76\x32\x17\x05\x3f\x75\x2c"
6096 "\x5d\x04\x16\x36\x15\x72\x63\x2f",
6097 .klen = 16,
6098 .input = "\xe0\x4d\x5d\x3c\xb7\x8c\x36\x47"
6099 "\x94\x18\x95\x91\xa9\xfc\x49\xf8"
6100 "\x44\xd1\x2d\xc2\x99\xb8\x08\x2a"
6101 "\x07\x89\x73\xc2\x45\x92\xc6\x90",
6102 .ilen = 32,
6103 .result = "\x54\x65\x61\x20\x69\x73\x20\x67"
6104 "\x6f\x6f\x64\x20\x66\x6f\x72\x20"
6105 "\x79\x6f\x75\x21\x21\x21\x20\x72"
6106 "\x65\x61\x6c\x6c\x79\x21\x21\x21",
6107 .rlen = 32,
6108 }
6109};
6110
6111/*
6112 * XTEA test vectors
6113 */
6114#define XTEA_ENC_TEST_VECTORS 4
6115#define XTEA_DEC_TEST_VECTORS 4
6116
6117static struct cipher_testvec xtea_enc_tv_template[] = {
6118 {
6119 .key = zeroed_string,
6120 .klen = 16,
6121 .input = zeroed_string,
6122 .ilen = 8,
6123 .result = "\xd8\xd4\xe9\xde\xd9\x1e\x13\xf7",
6124 .rlen = 8,
6125 }, {
6126 .key = "\x2b\x02\x05\x68\x06\x14\x49\x76"
6127 "\x77\x5d\x0e\x26\x6c\x28\x78\x43",
6128 .klen = 16,
6129 .input = "\x74\x65\x73\x74\x20\x6d\x65\x2e",
6130 .ilen = 8,
6131 .result = "\x94\xeb\xc8\x96\x84\x6a\x49\xa8",
6132 .rlen = 8,
6133 }, {
6134 .key = "\x09\x65\x43\x11\x66\x44\x39\x25"
6135 "\x51\x3a\x16\x10\x0a\x08\x12\x6e",
6136 .klen = 16,
6137 .input = "\x6c\x6f\x6e\x67\x65\x72\x5f\x74"
6138 "\x65\x73\x74\x5f\x76\x65\x63\x74",
6139 .ilen = 16,
6140 .result = "\x3e\xce\xae\x22\x60\x56\xa8\x9d"
6141 "\x77\x4d\xd4\xb4\x87\x24\xe3\x9a",
6142 .rlen = 16,
6143 }, {
6144 .key = "\x4d\x76\x32\x17\x05\x3f\x75\x2c"
6145 "\x5d\x04\x16\x36\x15\x72\x63\x2f",
6146 .klen = 16,
6147 .input = "\x54\x65\x61\x20\x69\x73\x20\x67"
6148 "\x6f\x6f\x64\x20\x66\x6f\x72\x20"
6149 "\x79\x6f\x75\x21\x21\x21\x20\x72"
6150 "\x65\x61\x6c\x6c\x79\x21\x21\x21",
6151 .ilen = 32,
6152 .result = "\x99\x81\x9f\x5d\x6f\x4b\x31\x3a"
6153 "\x86\xff\x6f\xd0\xe3\x87\x70\x07"
6154 "\x4d\xb8\xcf\xf3\x99\x50\xb3\xd4"
6155 "\x73\xa2\xfa\xc9\x16\x59\x5d\x81",
6156 .rlen = 32,
6157 }
6158};
6159
6160static struct cipher_testvec xtea_dec_tv_template[] = {
6161 {
6162 .key = zeroed_string,
6163 .klen = 16,
6164 .input = "\xd8\xd4\xe9\xde\xd9\x1e\x13\xf7",
6165 .ilen = 8,
6166 .result = zeroed_string,
6167 .rlen = 8,
6168 }, {
6169 .key = "\x2b\x02\x05\x68\x06\x14\x49\x76"
6170 "\x77\x5d\x0e\x26\x6c\x28\x78\x43",
6171 .klen = 16,
6172 .input = "\x94\xeb\xc8\x96\x84\x6a\x49\xa8",
6173 .ilen = 8,
6174 .result = "\x74\x65\x73\x74\x20\x6d\x65\x2e",
6175 .rlen = 8,
6176 }, {
6177 .key = "\x09\x65\x43\x11\x66\x44\x39\x25"
6178 "\x51\x3a\x16\x10\x0a\x08\x12\x6e",
6179 .klen = 16,
6180 .input = "\x3e\xce\xae\x22\x60\x56\xa8\x9d"
6181 "\x77\x4d\xd4\xb4\x87\x24\xe3\x9a",
6182 .ilen = 16,
6183 .result = "\x6c\x6f\x6e\x67\x65\x72\x5f\x74"
6184 "\x65\x73\x74\x5f\x76\x65\x63\x74",
6185 .rlen = 16,
6186 }, {
6187 .key = "\x4d\x76\x32\x17\x05\x3f\x75\x2c"
6188 "\x5d\x04\x16\x36\x15\x72\x63\x2f",
6189 .klen = 16,
6190 .input = "\x99\x81\x9f\x5d\x6f\x4b\x31\x3a"
6191 "\x86\xff\x6f\xd0\xe3\x87\x70\x07"
6192 "\x4d\xb8\xcf\xf3\x99\x50\xb3\xd4"
6193 "\x73\xa2\xfa\xc9\x16\x59\x5d\x81",
6194 .ilen = 32,
6195 .result = "\x54\x65\x61\x20\x69\x73\x20\x67"
6196 "\x6f\x6f\x64\x20\x66\x6f\x72\x20"
6197 "\x79\x6f\x75\x21\x21\x21\x20\x72"
6198 "\x65\x61\x6c\x6c\x79\x21\x21\x21",
6199 .rlen = 32,
6200 }
6201};
6202
6203/*
6204 * KHAZAD test vectors.
6205 */
6206#define KHAZAD_ENC_TEST_VECTORS 5
6207#define KHAZAD_DEC_TEST_VECTORS 5
6208
6209static struct cipher_testvec khazad_enc_tv_template[] = {
6210 {
6211 .key = "\x80\x00\x00\x00\x00\x00\x00\x00"
6212 "\x00\x00\x00\x00\x00\x00\x00\x00",
6213 .klen = 16,
6214 .input = "\x00\x00\x00\x00\x00\x00\x00\x00",
6215 .ilen = 8,
6216 .result = "\x49\xa4\xce\x32\xac\x19\x0e\x3f",
6217 .rlen = 8,
6218 }, {
6219 .key = "\x38\x38\x38\x38\x38\x38\x38\x38"
6220 "\x38\x38\x38\x38\x38\x38\x38\x38",
6221 .klen = 16,
6222 .input = "\x38\x38\x38\x38\x38\x38\x38\x38",
6223 .ilen = 8,
6224 .result = "\x7e\x82\x12\xa1\xd9\x5b\xe4\xf9",
6225 .rlen = 8,
6226 }, {
6227 .key = "\xa2\xa2\xa2\xa2\xa2\xa2\xa2\xa2"
6228 "\xa2\xa2\xa2\xa2\xa2\xa2\xa2\xa2",
6229 .klen = 16,
6230 .input = "\xa2\xa2\xa2\xa2\xa2\xa2\xa2\xa2",
6231 .ilen = 8,
6232 .result = "\xaa\xbe\xc1\x95\xc5\x94\x1a\x9c",
6233 .rlen = 8,
6234 }, {
6235 .key = "\x2f\x2f\x2f\x2f\x2f\x2f\x2f\x2f"
6236 "\x2f\x2f\x2f\x2f\x2f\x2f\x2f\x2f",
6237 .klen = 16,
6238 .input = "\x2f\x2f\x2f\x2f\x2f\x2f\x2f\x2f",
6239 .ilen = 8,
6240 .result = "\x04\x74\xf5\x70\x50\x16\xd3\xb8",
6241 .rlen = 8,
6242 }, {
6243 .key = "\x2f\x2f\x2f\x2f\x2f\x2f\x2f\x2f"
6244 "\x2f\x2f\x2f\x2f\x2f\x2f\x2f\x2f",
6245 .klen = 16,
6246 .input = "\x2f\x2f\x2f\x2f\x2f\x2f\x2f\x2f"
6247 "\x2f\x2f\x2f\x2f\x2f\x2f\x2f\x2f",
6248 .ilen = 16,
6249 .result = "\x04\x74\xf5\x70\x50\x16\xd3\xb8"
6250 "\x04\x74\xf5\x70\x50\x16\xd3\xb8",
6251 .rlen = 16,
6252 },
6253};
6254
6255static struct cipher_testvec khazad_dec_tv_template[] = {
6256 {
6257 .key = "\x80\x00\x00\x00\x00\x00\x00\x00"
6258 "\x00\x00\x00\x00\x00\x00\x00\x00",
6259 .klen = 16,
6260 .input = "\x49\xa4\xce\x32\xac\x19\x0e\x3f",
6261 .ilen = 8,
6262 .result = "\x00\x00\x00\x00\x00\x00\x00\x00",
6263 .rlen = 8,
6264 }, {
6265 .key = "\x38\x38\x38\x38\x38\x38\x38\x38"
6266 "\x38\x38\x38\x38\x38\x38\x38\x38",
6267 .klen = 16,
6268 .input = "\x7e\x82\x12\xa1\xd9\x5b\xe4\xf9",
6269 .ilen = 8,
6270 .result = "\x38\x38\x38\x38\x38\x38\x38\x38",
6271 .rlen = 8,
6272 }, {
6273 .key = "\xa2\xa2\xa2\xa2\xa2\xa2\xa2\xa2"
6274 "\xa2\xa2\xa2\xa2\xa2\xa2\xa2\xa2",
6275 .klen = 16,
6276 .input = "\xaa\xbe\xc1\x95\xc5\x94\x1a\x9c",
6277 .ilen = 8,
6278 .result = "\xa2\xa2\xa2\xa2\xa2\xa2\xa2\xa2",
6279 .rlen = 8,
6280 }, {
6281 .key = "\x2f\x2f\x2f\x2f\x2f\x2f\x2f\x2f"
6282 "\x2f\x2f\x2f\x2f\x2f\x2f\x2f\x2f",
6283 .klen = 16,
6284 .input = "\x04\x74\xf5\x70\x50\x16\xd3\xb8",
6285 .ilen = 8,
6286 .result = "\x2f\x2f\x2f\x2f\x2f\x2f\x2f\x2f",
6287 .rlen = 8,
6288 }, {
6289 .key = "\x2f\x2f\x2f\x2f\x2f\x2f\x2f\x2f"
6290 "\x2f\x2f\x2f\x2f\x2f\x2f\x2f\x2f",
6291 .klen = 16,
6292 .input = "\x04\x74\xf5\x70\x50\x16\xd3\xb8"
6293 "\x04\x74\xf5\x70\x50\x16\xd3\xb8",
6294 .ilen = 16,
6295 .result = "\x2f\x2f\x2f\x2f\x2f\x2f\x2f\x2f"
6296 "\x2f\x2f\x2f\x2f\x2f\x2f\x2f\x2f",
6297 .rlen = 16,
6298 },
6299};
6300
6301/*
6302 * Anubis test vectors.
6303 */
6304
6305#define ANUBIS_ENC_TEST_VECTORS 5
6306#define ANUBIS_DEC_TEST_VECTORS 5
6307#define ANUBIS_CBC_ENC_TEST_VECTORS 2
6308#define ANUBIS_CBC_DEC_TEST_VECTORS 2
6309
6310static struct cipher_testvec anubis_enc_tv_template[] = {
6311 {
6312 .key = "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe"
6313 "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe",
6314 .klen = 16,
6315 .input = "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe"
6316 "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe",
6317 .ilen = 16,
6318 .result = "\x6d\xc5\xda\xa2\x26\x7d\x62\x6f"
6319 "\x08\xb7\x52\x8e\x6e\x6e\x86\x90",
6320 .rlen = 16,
6321 }, {
6322
6323 .key = "\x03\x03\x03\x03\x03\x03\x03\x03"
6324 "\x03\x03\x03\x03\x03\x03\x03\x03"
6325 "\x03\x03\x03\x03",
6326 .klen = 20,
6327 .input = "\x03\x03\x03\x03\x03\x03\x03\x03"
6328 "\x03\x03\x03\x03\x03\x03\x03\x03",
6329 .ilen = 16,
6330 .result = "\xdb\xf1\x42\xf4\xd1\x8a\xc7\x49"
6331 "\x87\x41\x6f\x82\x0a\x98\x64\xae",
6332 .rlen = 16,
6333 }, {
6334 .key = "\x24\x24\x24\x24\x24\x24\x24\x24"
6335 "\x24\x24\x24\x24\x24\x24\x24\x24"
6336 "\x24\x24\x24\x24\x24\x24\x24\x24"
6337 "\x24\x24\x24\x24",
6338 .klen = 28,
6339 .input = "\x24\x24\x24\x24\x24\x24\x24\x24"
6340 "\x24\x24\x24\x24\x24\x24\x24\x24",
6341 .ilen = 16,
6342 .result = "\xfd\x1b\x4a\xe3\xbf\xf0\xad\x3d"
6343 "\x06\xd3\x61\x27\xfd\x13\x9e\xde",
6344 .rlen = 16,
6345 }, {
6346 .key = "\x25\x25\x25\x25\x25\x25\x25\x25"
6347 "\x25\x25\x25\x25\x25\x25\x25\x25"
6348 "\x25\x25\x25\x25\x25\x25\x25\x25"
6349 "\x25\x25\x25\x25\x25\x25\x25\x25",
6350 .klen = 32,
6351 .input = "\x25\x25\x25\x25\x25\x25\x25\x25"
6352 "\x25\x25\x25\x25\x25\x25\x25\x25",
6353 .ilen = 16,
6354 .result = "\x1a\x91\xfb\x2b\xb7\x78\x6b\xc4"
6355 "\x17\xd9\xff\x40\x3b\x0e\xe5\xfe",
6356 .rlen = 16,
6357 }, {
6358 .key = "\x35\x35\x35\x35\x35\x35\x35\x35"
6359 "\x35\x35\x35\x35\x35\x35\x35\x35"
6360 "\x35\x35\x35\x35\x35\x35\x35\x35"
6361 "\x35\x35\x35\x35\x35\x35\x35\x35"
6362 "\x35\x35\x35\x35\x35\x35\x35\x35",
6363 .klen = 40,
6364 .input = "\x35\x35\x35\x35\x35\x35\x35\x35"
6365 "\x35\x35\x35\x35\x35\x35\x35\x35",
6366 .ilen = 16,
6367 .result = "\xa5\x2c\x85\x6f\x9c\xba\xa0\x97"
6368 "\x9e\xc6\x84\x0f\x17\x21\x07\xee",
6369 .rlen = 16,
6370 },
6371};
6372
6373static struct cipher_testvec anubis_dec_tv_template[] = {
6374 {
6375 .key = "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe"
6376 "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe",
6377 .klen = 16,
6378 .input = "\x6d\xc5\xda\xa2\x26\x7d\x62\x6f"
6379 "\x08\xb7\x52\x8e\x6e\x6e\x86\x90",
6380 .ilen = 16,
6381 .result = "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe"
6382 "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe",
6383 .rlen = 16,
6384 }, {
6385
6386 .key = "\x03\x03\x03\x03\x03\x03\x03\x03"
6387 "\x03\x03\x03\x03\x03\x03\x03\x03"
6388 "\x03\x03\x03\x03",
6389 .klen = 20,
6390 .input = "\xdb\xf1\x42\xf4\xd1\x8a\xc7\x49"
6391 "\x87\x41\x6f\x82\x0a\x98\x64\xae",
6392 .ilen = 16,
6393 .result = "\x03\x03\x03\x03\x03\x03\x03\x03"
6394 "\x03\x03\x03\x03\x03\x03\x03\x03",
6395 .rlen = 16,
6396 }, {
6397 .key = "\x24\x24\x24\x24\x24\x24\x24\x24"
6398 "\x24\x24\x24\x24\x24\x24\x24\x24"
6399 "\x24\x24\x24\x24\x24\x24\x24\x24"
6400 "\x24\x24\x24\x24",
6401 .klen = 28,
6402 .input = "\xfd\x1b\x4a\xe3\xbf\xf0\xad\x3d"
6403 "\x06\xd3\x61\x27\xfd\x13\x9e\xde",
6404 .ilen = 16,
6405 .result = "\x24\x24\x24\x24\x24\x24\x24\x24"
6406 "\x24\x24\x24\x24\x24\x24\x24\x24",
6407 .rlen = 16,
6408 }, {
6409 .key = "\x25\x25\x25\x25\x25\x25\x25\x25"
6410 "\x25\x25\x25\x25\x25\x25\x25\x25"
6411 "\x25\x25\x25\x25\x25\x25\x25\x25"
6412 "\x25\x25\x25\x25\x25\x25\x25\x25",
6413 .klen = 32,
6414 .input = "\x1a\x91\xfb\x2b\xb7\x78\x6b\xc4"
6415 "\x17\xd9\xff\x40\x3b\x0e\xe5\xfe",
6416 .ilen = 16,
6417 .result = "\x25\x25\x25\x25\x25\x25\x25\x25"
6418 "\x25\x25\x25\x25\x25\x25\x25\x25",
6419 .rlen = 16,
6420 }, {
6421 .key = "\x35\x35\x35\x35\x35\x35\x35\x35"
6422 "\x35\x35\x35\x35\x35\x35\x35\x35"
6423 "\x35\x35\x35\x35\x35\x35\x35\x35"
6424 "\x35\x35\x35\x35\x35\x35\x35\x35"
6425 "\x35\x35\x35\x35\x35\x35\x35\x35",
6426 .input = "\xa5\x2c\x85\x6f\x9c\xba\xa0\x97"
6427 "\x9e\xc6\x84\x0f\x17\x21\x07\xee",
6428 .klen = 40,
6429 .ilen = 16,
6430 .result = "\x35\x35\x35\x35\x35\x35\x35\x35"
6431 "\x35\x35\x35\x35\x35\x35\x35\x35",
6432 .rlen = 16,
6433 },
6434};
6435
6436static struct cipher_testvec anubis_cbc_enc_tv_template[] = {
6437 {
6438 .key = "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe"
6439 "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe",
6440 .klen = 16,
6441 .input = "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe"
6442 "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe"
6443 "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe"
6444 "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe",
6445 .ilen = 32,
6446 .result = "\x6d\xc5\xda\xa2\x26\x7d\x62\x6f"
6447 "\x08\xb7\x52\x8e\x6e\x6e\x86\x90"
6448 "\x86\xd8\xb5\x6f\x98\x5e\x8a\x66"
6449 "\x4f\x1f\x78\xa1\xbb\x37\xf1\xbe",
6450 .rlen = 32,
6451 }, {
6452 .key = "\x35\x35\x35\x35\x35\x35\x35\x35"
6453 "\x35\x35\x35\x35\x35\x35\x35\x35"
6454 "\x35\x35\x35\x35\x35\x35\x35\x35"
6455 "\x35\x35\x35\x35\x35\x35\x35\x35"
6456 "\x35\x35\x35\x35\x35\x35\x35\x35",
6457 .klen = 40,
6458 .input = "\x35\x35\x35\x35\x35\x35\x35\x35"
6459 "\x35\x35\x35\x35\x35\x35\x35\x35"
6460 "\x35\x35\x35\x35\x35\x35\x35\x35"
6461 "\x35\x35\x35\x35\x35\x35\x35\x35",
6462 .ilen = 32,
6463 .result = "\xa5\x2c\x85\x6f\x9c\xba\xa0\x97"
6464 "\x9e\xc6\x84\x0f\x17\x21\x07\xee"
6465 "\xa2\xbc\x06\x98\xc6\x4b\xda\x75"
6466 "\x2e\xaa\xbe\x58\xce\x01\x5b\xc7",
6467 .rlen = 32,
6468 },
6469};
6470
6471static struct cipher_testvec anubis_cbc_dec_tv_template[] = {
6472 {
6473 .key = "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe"
6474 "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe",
6475 .klen = 16,
6476 .input = "\x6d\xc5\xda\xa2\x26\x7d\x62\x6f"
6477 "\x08\xb7\x52\x8e\x6e\x6e\x86\x90"
6478 "\x86\xd8\xb5\x6f\x98\x5e\x8a\x66"
6479 "\x4f\x1f\x78\xa1\xbb\x37\xf1\xbe",
6480 .ilen = 32,
6481 .result = "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe"
6482 "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe"
6483 "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe"
6484 "\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe",
6485 .rlen = 32,
6486 }, {
6487 .key = "\x35\x35\x35\x35\x35\x35\x35\x35"
6488 "\x35\x35\x35\x35\x35\x35\x35\x35"
6489 "\x35\x35\x35\x35\x35\x35\x35\x35"
6490 "\x35\x35\x35\x35\x35\x35\x35\x35"
6491 "\x35\x35\x35\x35\x35\x35\x35\x35",
6492 .klen = 40,
6493 .input = "\xa5\x2c\x85\x6f\x9c\xba\xa0\x97"
6494 "\x9e\xc6\x84\x0f\x17\x21\x07\xee"
6495 "\xa2\xbc\x06\x98\xc6\x4b\xda\x75"
6496 "\x2e\xaa\xbe\x58\xce\x01\x5b\xc7",
6497 .ilen = 32,
6498 .result = "\x35\x35\x35\x35\x35\x35\x35\x35"
6499 "\x35\x35\x35\x35\x35\x35\x35\x35"
6500 "\x35\x35\x35\x35\x35\x35\x35\x35"
6501 "\x35\x35\x35\x35\x35\x35\x35\x35",
6502 .rlen = 32,
6503 },
6504};
6505
6506/*
6507 * XETA test vectors
6508 */
6509#define XETA_ENC_TEST_VECTORS 4
6510#define XETA_DEC_TEST_VECTORS 4
6511
6512static struct cipher_testvec xeta_enc_tv_template[] = {
6513 {
6514 .key = zeroed_string,
6515 .klen = 16,
6516 .input = zeroed_string,
6517 .ilen = 8,
6518 .result = "\xaa\x22\x96\xe5\x6c\x61\xf3\x45",
6519 .rlen = 8,
6520 }, {
6521 .key = "\x2b\x02\x05\x68\x06\x14\x49\x76"
6522 "\x77\x5d\x0e\x26\x6c\x28\x78\x43",
6523 .klen = 16,
6524 .input = "\x74\x65\x73\x74\x20\x6d\x65\x2e",
6525 .ilen = 8,
6526 .result = "\x82\x3e\xeb\x35\xdc\xdd\xd9\xc3",
6527 .rlen = 8,
6528 }, {
6529 .key = "\x09\x65\x43\x11\x66\x44\x39\x25"
6530 "\x51\x3a\x16\x10\x0a\x08\x12\x6e",
6531 .klen = 16,
6532 .input = "\x6c\x6f\x6e\x67\x65\x72\x5f\x74"
6533 "\x65\x73\x74\x5f\x76\x65\x63\x74",
6534 .ilen = 16,
6535 .result = "\xe2\x04\xdb\xf2\x89\x85\x9e\xea"
6536 "\x61\x35\xaa\xed\xb5\xcb\x71\x2c",
6537 .rlen = 16,
6538 }, {
6539 .key = "\x4d\x76\x32\x17\x05\x3f\x75\x2c"
6540 "\x5d\x04\x16\x36\x15\x72\x63\x2f",
6541 .klen = 16,
6542 .input = "\x54\x65\x61\x20\x69\x73\x20\x67"
6543 "\x6f\x6f\x64\x20\x66\x6f\x72\x20"
6544 "\x79\x6f\x75\x21\x21\x21\x20\x72"
6545 "\x65\x61\x6c\x6c\x79\x21\x21\x21",
6546 .ilen = 32,
6547 .result = "\x0b\x03\xcd\x8a\xbe\x95\xfd\xb1"
6548 "\xc1\x44\x91\x0b\xa5\xc9\x1b\xb4"
6549 "\xa9\xda\x1e\x9e\xb1\x3e\x2a\x8f"
6550 "\xea\xa5\x6a\x85\xd1\xf4\xa8\xa5",
6551 .rlen = 32,
6552 }
6553};
6554
6555static struct cipher_testvec xeta_dec_tv_template[] = {
6556 {
6557 .key = zeroed_string,
6558 .klen = 16,
6559 .input = "\xaa\x22\x96\xe5\x6c\x61\xf3\x45",
6560 .ilen = 8,
6561 .result = zeroed_string,
6562 .rlen = 8,
6563 }, {
6564 .key = "\x2b\x02\x05\x68\x06\x14\x49\x76"
6565 "\x77\x5d\x0e\x26\x6c\x28\x78\x43",
6566 .klen = 16,
6567 .input = "\x82\x3e\xeb\x35\xdc\xdd\xd9\xc3",
6568 .ilen = 8,
6569 .result = "\x74\x65\x73\x74\x20\x6d\x65\x2e",
6570 .rlen = 8,
6571 }, {
6572 .key = "\x09\x65\x43\x11\x66\x44\x39\x25"
6573 "\x51\x3a\x16\x10\x0a\x08\x12\x6e",
6574 .klen = 16,
6575 .input = "\xe2\x04\xdb\xf2\x89\x85\x9e\xea"
6576 "\x61\x35\xaa\xed\xb5\xcb\x71\x2c",
6577 .ilen = 16,
6578 .result = "\x6c\x6f\x6e\x67\x65\x72\x5f\x74"
6579 "\x65\x73\x74\x5f\x76\x65\x63\x74",
6580 .rlen = 16,
6581 }, {
6582 .key = "\x4d\x76\x32\x17\x05\x3f\x75\x2c"
6583 "\x5d\x04\x16\x36\x15\x72\x63\x2f",
6584 .klen = 16,
6585 .input = "\x0b\x03\xcd\x8a\xbe\x95\xfd\xb1"
6586 "\xc1\x44\x91\x0b\xa5\xc9\x1b\xb4"
6587 "\xa9\xda\x1e\x9e\xb1\x3e\x2a\x8f"
6588 "\xea\xa5\x6a\x85\xd1\xf4\xa8\xa5",
6589 .ilen = 32,
6590 .result = "\x54\x65\x61\x20\x69\x73\x20\x67"
6591 "\x6f\x6f\x64\x20\x66\x6f\x72\x20"
6592 "\x79\x6f\x75\x21\x21\x21\x20\x72"
6593 "\x65\x61\x6c\x6c\x79\x21\x21\x21",
6594 .rlen = 32,
6595 }
6596};
6597
6598/*
6599 * FCrypt test vectors
6600 */
6601#define FCRYPT_ENC_TEST_VECTORS ARRAY_SIZE(fcrypt_pcbc_enc_tv_template)
6602#define FCRYPT_DEC_TEST_VECTORS ARRAY_SIZE(fcrypt_pcbc_dec_tv_template)
6603
6604static struct cipher_testvec fcrypt_pcbc_enc_tv_template[] = {
6605 { /* http://www.openafs.org/pipermail/openafs-devel/2000-December/005320.html */
6606 .key = "\x00\x00\x00\x00\x00\x00\x00\x00",
6607 .klen = 8,
6608 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00",
6609 .input = "\x00\x00\x00\x00\x00\x00\x00\x00",
6610 .ilen = 8,
6611 .result = "\x0E\x09\x00\xC7\x3E\xF7\xED\x41",
6612 .rlen = 8,
6613 }, {
6614 .key = "\x11\x44\x77\xAA\xDD\x00\x33\x66",
6615 .klen = 8,
6616 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00",
6617 .input = "\x12\x34\x56\x78\x9A\xBC\xDE\xF0",
6618 .ilen = 8,
6619 .result = "\xD8\xED\x78\x74\x77\xEC\x06\x80",
6620 .rlen = 8,
6621 }, { /* From Arla */
6622 .key = "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87",
6623 .klen = 8,
6624 .iv = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
6625 .input = "The quick brown fox jumps over the lazy dogs.\0\0",
6626 .ilen = 48,
6627 .result = "\x00\xf0\x0e\x11\x75\xe6\x23\x82"
6628 "\xee\xac\x98\x62\x44\x51\xe4\x84"
6629 "\xc3\x59\xd8\xaa\x64\x60\xae\xf7"
6630 "\xd2\xd9\x13\x79\x72\xa3\x45\x03"
6631 "\x23\xb5\x62\xd7\x0c\xf5\x27\xd1"
6632 "\xf8\x91\x3c\xac\x44\x22\x92\xef",
6633 .rlen = 48,
6634 }, {
6635 .key = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
6636 .klen = 8,
6637 .iv = "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87",
6638 .input = "The quick brown fox jumps over the lazy dogs.\0\0",
6639 .ilen = 48,
6640 .result = "\xca\x90\xf5\x9d\xcb\xd4\xd2\x3c"
6641 "\x01\x88\x7f\x3e\x31\x6e\x62\x9d"
6642 "\xd8\xe0\x57\xa3\x06\x3a\x42\x58"
6643 "\x2a\x28\xfe\x72\x52\x2f\xdd\xe0"
6644 "\x19\x89\x09\x1c\x2a\x8e\x8c\x94"
6645 "\xfc\xc7\x68\xe4\x88\xaa\xde\x0f",
6646 .rlen = 48,
6647 }, { /* split-page version */
6648 .key = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
6649 .klen = 8,
6650 .iv = "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87",
6651 .input = "The quick brown fox jumps over the lazy dogs.\0\0",
6652 .ilen = 48,
6653 .result = "\xca\x90\xf5\x9d\xcb\xd4\xd2\x3c"
6654 "\x01\x88\x7f\x3e\x31\x6e\x62\x9d"
6655 "\xd8\xe0\x57\xa3\x06\x3a\x42\x58"
6656 "\x2a\x28\xfe\x72\x52\x2f\xdd\xe0"
6657 "\x19\x89\x09\x1c\x2a\x8e\x8c\x94"
6658 "\xfc\xc7\x68\xe4\x88\xaa\xde\x0f",
6659 .rlen = 48,
6660 .np = 2,
6661 .tap = { 20, 28 },
6662 }
6663};
6664
6665static struct cipher_testvec fcrypt_pcbc_dec_tv_template[] = {
6666 { /* http://www.openafs.org/pipermail/openafs-devel/2000-December/005320.html */
6667 .key = "\x00\x00\x00\x00\x00\x00\x00\x00",
6668 .klen = 8,
6669 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00",
6670 .input = "\x0E\x09\x00\xC7\x3E\xF7\xED\x41",
6671 .ilen = 8,
6672 .result = "\x00\x00\x00\x00\x00\x00\x00\x00",
6673 .rlen = 8,
6674 }, {
6675 .key = "\x11\x44\x77\xAA\xDD\x00\x33\x66",
6676 .klen = 8,
6677 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00",
6678 .input = "\xD8\xED\x78\x74\x77\xEC\x06\x80",
6679 .ilen = 8,
6680 .result = "\x12\x34\x56\x78\x9A\xBC\xDE\xF0",
6681 .rlen = 8,
6682 }, { /* From Arla */
6683 .key = "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87",
6684 .klen = 8,
6685 .iv = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
6686 .input = "\x00\xf0\x0e\x11\x75\xe6\x23\x82"
6687 "\xee\xac\x98\x62\x44\x51\xe4\x84"
6688 "\xc3\x59\xd8\xaa\x64\x60\xae\xf7"
6689 "\xd2\xd9\x13\x79\x72\xa3\x45\x03"
6690 "\x23\xb5\x62\xd7\x0c\xf5\x27\xd1"
6691 "\xf8\x91\x3c\xac\x44\x22\x92\xef",
6692 .ilen = 48,
6693 .result = "The quick brown fox jumps over the lazy dogs.\0\0",
6694 .rlen = 48,
6695 }, {
6696 .key = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
6697 .klen = 8,
6698 .iv = "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87",
6699 .input = "\xca\x90\xf5\x9d\xcb\xd4\xd2\x3c"
6700 "\x01\x88\x7f\x3e\x31\x6e\x62\x9d"
6701 "\xd8\xe0\x57\xa3\x06\x3a\x42\x58"
6702 "\x2a\x28\xfe\x72\x52\x2f\xdd\xe0"
6703 "\x19\x89\x09\x1c\x2a\x8e\x8c\x94"
6704 "\xfc\xc7\x68\xe4\x88\xaa\xde\x0f",
6705 .ilen = 48,
6706 .result = "The quick brown fox jumps over the lazy dogs.\0\0",
6707 .rlen = 48,
6708 }, { /* split-page version */
6709 .key = "\xfe\xdc\xba\x98\x76\x54\x32\x10",
6710 .klen = 8,
6711 .iv = "\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87",
6712 .input = "\xca\x90\xf5\x9d\xcb\xd4\xd2\x3c"
6713 "\x01\x88\x7f\x3e\x31\x6e\x62\x9d"
6714 "\xd8\xe0\x57\xa3\x06\x3a\x42\x58"
6715 "\x2a\x28\xfe\x72\x52\x2f\xdd\xe0"
6716 "\x19\x89\x09\x1c\x2a\x8e\x8c\x94"
6717 "\xfc\xc7\x68\xe4\x88\xaa\xde\x0f",
6718 .ilen = 48,
6719 .result = "The quick brown fox jumps over the lazy dogs.\0\0",
6720 .rlen = 48,
6721 .np = 2,
6722 .tap = { 20, 28 },
6723 }
6724};
6725
6726/*
6727 * CAMELLIA test vectors.
6728 */
6729#define CAMELLIA_ENC_TEST_VECTORS 3
6730#define CAMELLIA_DEC_TEST_VECTORS 3
6731#define CAMELLIA_CBC_ENC_TEST_VECTORS 2
6732#define CAMELLIA_CBC_DEC_TEST_VECTORS 2
6733
6734static struct cipher_testvec camellia_enc_tv_template[] = {
6735 {
6736 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef"
6737 "\xfe\xdc\xba\x98\x76\x54\x32\x10",
6738 .klen = 16,
6739 .input = "\x01\x23\x45\x67\x89\xab\xcd\xef"
6740 "\xfe\xdc\xba\x98\x76\x54\x32\x10",
6741 .ilen = 16,
6742 .result = "\x67\x67\x31\x38\x54\x96\x69\x73"
6743 "\x08\x57\x06\x56\x48\xea\xbe\x43",
6744 .rlen = 16,
6745 }, {
6746 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef"
6747 "\xfe\xdc\xba\x98\x76\x54\x32\x10"
6748 "\x00\x11\x22\x33\x44\x55\x66\x77",
6749 .klen = 24,
6750 .input = "\x01\x23\x45\x67\x89\xab\xcd\xef"
6751 "\xfe\xdc\xba\x98\x76\x54\x32\x10",
6752 .ilen = 16,
6753 .result = "\xb4\x99\x34\x01\xb3\xe9\x96\xf8"
6754 "\x4e\xe5\xce\xe7\xd7\x9b\x09\xb9",
6755 .rlen = 16,
6756 }, {
6757 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef"
6758 "\xfe\xdc\xba\x98\x76\x54\x32\x10"
6759 "\x00\x11\x22\x33\x44\x55\x66\x77"
6760 "\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
6761 .klen = 32,
6762 .input = "\x01\x23\x45\x67\x89\xab\xcd\xef"
6763 "\xfe\xdc\xba\x98\x76\x54\x32\x10",
6764 .ilen = 16,
6765 .result = "\x9a\xcc\x23\x7d\xff\x16\xd7\x6c"
6766 "\x20\xef\x7c\x91\x9e\x3a\x75\x09",
6767 .rlen = 16,
6768 },
6769};
6770
6771static struct cipher_testvec camellia_dec_tv_template[] = {
6772 {
6773 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef"
6774 "\xfe\xdc\xba\x98\x76\x54\x32\x10",
6775 .klen = 16,
6776 .input = "\x67\x67\x31\x38\x54\x96\x69\x73"
6777 "\x08\x57\x06\x56\x48\xea\xbe\x43",
6778 .ilen = 16,
6779 .result = "\x01\x23\x45\x67\x89\xab\xcd\xef"
6780 "\xfe\xdc\xba\x98\x76\x54\x32\x10",
6781 .rlen = 16,
6782 }, {
6783 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef"
6784 "\xfe\xdc\xba\x98\x76\x54\x32\x10"
6785 "\x00\x11\x22\x33\x44\x55\x66\x77",
6786 .klen = 24,
6787 .input = "\xb4\x99\x34\x01\xb3\xe9\x96\xf8"
6788 "\x4e\xe5\xce\xe7\xd7\x9b\x09\xb9",
6789 .ilen = 16,
6790 .result = "\x01\x23\x45\x67\x89\xab\xcd\xef"
6791 "\xfe\xdc\xba\x98\x76\x54\x32\x10",
6792 .rlen = 16,
6793 }, {
6794 .key = "\x01\x23\x45\x67\x89\xab\xcd\xef"
6795 "\xfe\xdc\xba\x98\x76\x54\x32\x10"
6796 "\x00\x11\x22\x33\x44\x55\x66\x77"
6797 "\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
6798 .klen = 32,
6799 .input = "\x9a\xcc\x23\x7d\xff\x16\xd7\x6c"
6800 "\x20\xef\x7c\x91\x9e\x3a\x75\x09",
6801 .ilen = 16,
6802 .result = "\x01\x23\x45\x67\x89\xab\xcd\xef"
6803 "\xfe\xdc\xba\x98\x76\x54\x32\x10",
6804 .rlen = 16,
6805 },
6806};
6807
6808static struct cipher_testvec camellia_cbc_enc_tv_template[] = {
6809 {
6810 .key = "\x06\xa9\x21\x40\x36\xb8\xa1\x5b"
6811 "\x51\x2e\x03\xd5\x34\x12\x00\x06",
6812 .klen = 16,
6813 .iv = "\x3d\xaf\xba\x42\x9d\x9e\xb4\x30"
6814 "\xb4\x22\xda\x80\x2c\x9f\xac\x41",
6815 .input = "Single block msg",
6816 .ilen = 16,
6817 .result = "\xea\x32\x12\x76\x3b\x50\x10\xe7"
6818 "\x18\xf6\xfd\x5d\xf6\x8f\x13\x51",
6819 .rlen = 16,
6820 }, {
6821 .key = "\xc2\x86\x69\x6d\x88\x7c\x9a\xa0"
6822 "\x61\x1b\xbb\x3e\x20\x25\xa4\x5a",
6823 .klen = 16,
6824 .iv = "\x56\x2e\x17\x99\x6d\x09\x3d\x28"
6825 "\xdd\xb3\xba\x69\x5a\x2e\x6f\x58",
6826 .input = "\x00\x01\x02\x03\x04\x05\x06\x07"
6827 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
6828 "\x10\x11\x12\x13\x14\x15\x16\x17"
6829 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
6830 .ilen = 32,
6831 .result = "\xa5\xdf\x6e\x50\xda\x70\x6c\x01"
6832 "\x4a\xab\xf3\xf2\xd6\xfc\x6c\xfd"
6833 "\x19\xb4\x3e\x57\x1c\x02\x5e\xa0"
6834 "\x15\x78\xe0\x5e\xf2\xcb\x87\x16",
6835 .rlen = 32,
6836 },
6837};
6838
6839static struct cipher_testvec camellia_cbc_dec_tv_template[] = {
6840 {
6841 .key = "\x06\xa9\x21\x40\x36\xb8\xa1\x5b"
6842 "\x51\x2e\x03\xd5\x34\x12\x00\x06",
6843 .klen = 16,
6844 .iv = "\x3d\xaf\xba\x42\x9d\x9e\xb4\x30"
6845 "\xb4\x22\xda\x80\x2c\x9f\xac\x41",
6846 .input = "\xea\x32\x12\x76\x3b\x50\x10\xe7"
6847 "\x18\xf6\xfd\x5d\xf6\x8f\x13\x51",
6848 .ilen = 16,
6849 .result = "Single block msg",
6850 .rlen = 16,
6851 }, {
6852 .key = "\xc2\x86\x69\x6d\x88\x7c\x9a\xa0"
6853 "\x61\x1b\xbb\x3e\x20\x25\xa4\x5a",
6854 .klen = 16,
6855 .iv = "\x56\x2e\x17\x99\x6d\x09\x3d\x28"
6856 "\xdd\xb3\xba\x69\x5a\x2e\x6f\x58",
6857 .input = "\xa5\xdf\x6e\x50\xda\x70\x6c\x01"
6858 "\x4a\xab\xf3\xf2\xd6\xfc\x6c\xfd"
6859 "\x19\xb4\x3e\x57\x1c\x02\x5e\xa0"
6860 "\x15\x78\xe0\x5e\xf2\xcb\x87\x16",
6861 .ilen = 32,
6862 .result = "\x00\x01\x02\x03\x04\x05\x06\x07"
6863 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
6864 "\x10\x11\x12\x13\x14\x15\x16\x17"
6865 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
6866 .rlen = 32,
6867 },
6868};
6869
6870/*
6871 * SEED test vectors
6872 */
6873#define SEED_ENC_TEST_VECTORS 4
6874#define SEED_DEC_TEST_VECTORS 4
6875
6876static struct cipher_testvec seed_enc_tv_template[] = {
6877 {
6878 .key = zeroed_string,
6879 .klen = 16,
6880 .input = "\x00\x01\x02\x03\x04\x05\x06\x07"
6881 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
6882 .ilen = 16,
6883 .result = "\x5e\xba\xc6\xe0\x05\x4e\x16\x68"
6884 "\x19\xaf\xf1\xcc\x6d\x34\x6c\xdb",
6885 .rlen = 16,
6886 }, {
6887 .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
6888 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
6889 .klen = 16,
6890 .input = zeroed_string,
6891 .ilen = 16,
6892 .result = "\xc1\x1f\x22\xf2\x01\x40\x50\x50"
6893 "\x84\x48\x35\x97\xe4\x37\x0f\x43",
6894 .rlen = 16,
6895 }, {
6896 .key = "\x47\x06\x48\x08\x51\xe6\x1b\xe8"
6897 "\x5d\x74\xbf\xb3\xfd\x95\x61\x85",
6898 .klen = 16,
6899 .input = "\x83\xa2\xf8\xa2\x88\x64\x1f\xb9"
6900 "\xa4\xe9\xa5\xcc\x2f\x13\x1c\x7d",
6901 .ilen = 16,
6902 .result = "\xee\x54\xd1\x3e\xbc\xae\x70\x6d"
6903 "\x22\x6b\xc3\x14\x2c\xd4\x0d\x4a",
6904 .rlen = 16,
6905 }, {
6906 .key = "\x28\xdb\xc3\xbc\x49\xff\xd8\x7d"
6907 "\xcf\xa5\x09\xb1\x1d\x42\x2b\xe7",
6908 .klen = 16,
6909 .input = "\xb4\x1e\x6b\xe2\xeb\xa8\x4a\x14"
6910 "\x8e\x2e\xed\x84\x59\x3c\x5e\xc7",
6911 .ilen = 16,
6912 .result = "\x9b\x9b\x7b\xfc\xd1\x81\x3c\xb9"
6913 "\x5d\x0b\x36\x18\xf4\x0f\x51\x22",
6914 .rlen = 16,
6915 }
6916};
6917
6918static struct cipher_testvec seed_dec_tv_template[] = {
6919 {
6920 .key = zeroed_string,
6921 .klen = 16,
6922 .input = "\x5e\xba\xc6\xe0\x05\x4e\x16\x68"
6923 "\x19\xaf\xf1\xcc\x6d\x34\x6c\xdb",
6924 .ilen = 16,
6925 .result = "\x00\x01\x02\x03\x04\x05\x06\x07"
6926 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
6927 .rlen = 16,
6928 }, {
6929 .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
6930 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
6931 .klen = 16,
6932 .input = "\xc1\x1f\x22\xf2\x01\x40\x50\x50"
6933 "\x84\x48\x35\x97\xe4\x37\x0f\x43",
6934 .ilen = 16,
6935 .result = zeroed_string,
6936 .rlen = 16,
6937 }, {
6938 .key = "\x47\x06\x48\x08\x51\xe6\x1b\xe8"
6939 "\x5d\x74\xbf\xb3\xfd\x95\x61\x85",
6940 .klen = 16,
6941 .input = "\xee\x54\xd1\x3e\xbc\xae\x70\x6d"
6942 "\x22\x6b\xc3\x14\x2c\xd4\x0d\x4a",
6943 .ilen = 16,
6944 .result = "\x83\xa2\xf8\xa2\x88\x64\x1f\xb9"
6945 "\xa4\xe9\xa5\xcc\x2f\x13\x1c\x7d",
6946 .rlen = 16,
6947 }, {
6948 .key = "\x28\xdb\xc3\xbc\x49\xff\xd8\x7d"
6949 "\xcf\xa5\x09\xb1\x1d\x42\x2b\xe7",
6950 .klen = 16,
6951 .input = "\x9b\x9b\x7b\xfc\xd1\x81\x3c\xb9"
6952 "\x5d\x0b\x36\x18\xf4\x0f\x51\x22",
6953 .ilen = 16,
6954 .result = "\xb4\x1e\x6b\xe2\xeb\xa8\x4a\x14"
6955 "\x8e\x2e\xed\x84\x59\x3c\x5e\xc7",
6956 .rlen = 16,
6957 }
6958};
6959
6960#define SALSA20_STREAM_ENC_TEST_VECTORS 5
6961static struct cipher_testvec salsa20_stream_enc_tv_template[] = {
6962 /*
6963 * Testvectors from verified.test-vectors submitted to ECRYPT.
6964 * They are truncated to size 39, 64, 111, 129 to test a variety
6965 * of input length.
6966 */
6967 { /* Set 3, vector 0 */
6968 .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
6969 "\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F",
6970 .klen = 16,
6971 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00",
6972 .input = "\x00\x00\x00\x00\x00\x00\x00\x00"
6973 "\x00\x00\x00\x00\x00\x00\x00\x00"
6974 "\x00\x00\x00\x00\x00\x00\x00\x00"
6975 "\x00\x00\x00\x00\x00\x00\x00\x00"
6976 "\x00\x00\x00\x00\x00\x00\x00",
6977 .ilen = 39,
6978 .result = "\x2D\xD5\xC3\xF7\xBA\x2B\x20\xF7"
6979 "\x68\x02\x41\x0C\x68\x86\x88\x89"
6980 "\x5A\xD8\xC1\xBD\x4E\xA6\xC9\xB1"
6981 "\x40\xFB\x9B\x90\xE2\x10\x49\xBF"
6982 "\x58\x3F\x52\x79\x70\xEB\xC1",
6983 .rlen = 39,
6984 }, { /* Set 5, vector 0 */
6985 .key = "\x00\x00\x00\x00\x00\x00\x00\x00"
6986 "\x00\x00\x00\x00\x00\x00\x00\x00",
6987 .klen = 16,
6988 .iv = "\x80\x00\x00\x00\x00\x00\x00\x00",
6989 .input = "\x00\x00\x00\x00\x00\x00\x00\x00"
6990 "\x00\x00\x00\x00\x00\x00\x00\x00"
6991 "\x00\x00\x00\x00\x00\x00\x00\x00"
6992 "\x00\x00\x00\x00\x00\x00\x00\x00"
6993 "\x00\x00\x00\x00\x00\x00\x00\x00"
6994 "\x00\x00\x00\x00\x00\x00\x00\x00"
6995 "\x00\x00\x00\x00\x00\x00\x00\x00"
6996 "\x00\x00\x00\x00\x00\x00\x00\x00",
6997 .ilen = 64,
6998 .result = "\xB6\x6C\x1E\x44\x46\xDD\x95\x57"
6999 "\xE5\x78\xE2\x23\xB0\xB7\x68\x01"
7000 "\x7B\x23\xB2\x67\xBB\x02\x34\xAE"
7001 "\x46\x26\xBF\x44\x3F\x21\x97\x76"
7002 "\x43\x6F\xB1\x9F\xD0\xE8\x86\x6F"
7003 "\xCD\x0D\xE9\xA9\x53\x8F\x4A\x09"
7004 "\xCA\x9A\xC0\x73\x2E\x30\xBC\xF9"
7005 "\x8E\x4F\x13\xE4\xB9\xE2\x01\xD9",
7006 .rlen = 64,
7007 }, { /* Set 3, vector 27 */
7008 .key = "\x1B\x1C\x1D\x1E\x1F\x20\x21\x22"
7009 "\x23\x24\x25\x26\x27\x28\x29\x2A"
7010 "\x2B\x2C\x2D\x2E\x2F\x30\x31\x32"
7011 "\x33\x34\x35\x36\x37\x38\x39\x3A",
7012 .klen = 32,
7013 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00",
7014 .input = "\x00\x00\x00\x00\x00\x00\x00\x00"
7015 "\x00\x00\x00\x00\x00\x00\x00\x00"
7016 "\x00\x00\x00\x00\x00\x00\x00\x00"
7017 "\x00\x00\x00\x00\x00\x00\x00\x00"
7018 "\x00\x00\x00\x00\x00\x00\x00\x00"
7019 "\x00\x00\x00\x00\x00\x00\x00\x00"
7020 "\x00\x00\x00\x00\x00\x00\x00\x00"
7021 "\x00\x00\x00\x00\x00\x00\x00\x00"
7022 "\x00\x00\x00\x00\x00\x00\x00\x00"
7023 "\x00\x00\x00\x00\x00\x00\x00\x00"
7024 "\x00\x00\x00\x00\x00\x00\x00\x00"
7025 "\x00\x00\x00\x00\x00\x00\x00\x00"
7026 "\x00\x00\x00\x00\x00\x00\x00\x00"
7027 "\x00\x00\x00\x00\x00\x00\x00",
7028 .ilen = 111,
7029 .result = "\xAE\x39\x50\x8E\xAC\x9A\xEC\xE7"
7030 "\xBF\x97\xBB\x20\xB9\xDE\xE4\x1F"
7031 "\x87\xD9\x47\xF8\x28\x91\x35\x98"
7032 "\xDB\x72\xCC\x23\x29\x48\x56\x5E"
7033 "\x83\x7E\x0B\xF3\x7D\x5D\x38\x7B"
7034 "\x2D\x71\x02\xB4\x3B\xB5\xD8\x23"
7035 "\xB0\x4A\xDF\x3C\xEC\xB6\xD9\x3B"
7036 "\x9B\xA7\x52\xBE\xC5\xD4\x50\x59"
7037 "\x15\x14\xB4\x0E\x40\xE6\x53\xD1"
7038 "\x83\x9C\x5B\xA0\x92\x29\x6B\x5E"
7039 "\x96\x5B\x1E\x2F\xD3\xAC\xC1\x92"
7040 "\xB1\x41\x3F\x19\x2F\xC4\x3B\xC6"
7041 "\x95\x46\x45\x54\xE9\x75\x03\x08"
7042 "\x44\xAF\xE5\x8A\x81\x12\x09",
7043 .rlen = 111,
7044 }, { /* Set 5, vector 27 */
7045 .key = "\x00\x00\x00\x00\x00\x00\x00\x00"
7046 "\x00\x00\x00\x00\x00\x00\x00\x00"
7047 "\x00\x00\x00\x00\x00\x00\x00\x00"
7048 "\x00\x00\x00\x00\x00\x00\x00\x00",
7049 .klen = 32,
7050 .iv = "\x00\x00\x00\x10\x00\x00\x00\x00",
7051 .input = "\x00\x00\x00\x00\x00\x00\x00\x00"
7052 "\x00\x00\x00\x00\x00\x00\x00\x00"
7053 "\x00\x00\x00\x00\x00\x00\x00\x00"
7054 "\x00\x00\x00\x00\x00\x00\x00\x00"
7055 "\x00\x00\x00\x00\x00\x00\x00\x00"
7056 "\x00\x00\x00\x00\x00\x00\x00\x00"
7057 "\x00\x00\x00\x00\x00\x00\x00\x00"
7058 "\x00\x00\x00\x00\x00\x00\x00\x00"
7059 "\x00\x00\x00\x00\x00\x00\x00\x00"
7060 "\x00\x00\x00\x00\x00\x00\x00\x00"
7061 "\x00\x00\x00\x00\x00\x00\x00\x00"
7062 "\x00\x00\x00\x00\x00\x00\x00\x00"
7063 "\x00\x00\x00\x00\x00\x00\x00\x00"
7064 "\x00\x00\x00\x00\x00\x00\x00\x00"
7065 "\x00\x00\x00\x00\x00\x00\x00\x00"
7066 "\x00\x00\x00\x00\x00\x00\x00\x00"
7067 "\x00",
7068 .ilen = 129,
7069 .result = "\xD2\xDB\x1A\x5C\xF1\xC1\xAC\xDB"
7070 "\xE8\x1A\x7A\x43\x40\xEF\x53\x43"
7071 "\x5E\x7F\x4B\x1A\x50\x52\x3F\x8D"
7072 "\x28\x3D\xCF\x85\x1D\x69\x6E\x60"
7073 "\xF2\xDE\x74\x56\x18\x1B\x84\x10"
7074 "\xD4\x62\xBA\x60\x50\xF0\x61\xF2"
7075 "\x1C\x78\x7F\xC1\x24\x34\xAF\x58"
7076 "\xBF\x2C\x59\xCA\x90\x77\xF3\xB0"
7077 "\x5B\x4A\xDF\x89\xCE\x2C\x2F\xFC"
7078 "\x67\xF0\xE3\x45\xE8\xB3\xB3\x75"
7079 "\xA0\x95\x71\xA1\x29\x39\x94\xCA"
7080 "\x45\x2F\xBD\xCB\x10\xB6\xBE\x9F"
7081 "\x8E\xF9\xB2\x01\x0A\x5A\x0A\xB7"
7082 "\x6B\x9D\x70\x8E\x4B\xD6\x2F\xCD"
7083 "\x2E\x40\x48\x75\xE9\xE2\x21\x45"
7084 "\x0B\xC9\xB6\xB5\x66\xBC\x9A\x59"
7085 "\x5A",
7086 .rlen = 129,
7087 }, { /* large test vector generated using Crypto++ */
7088 .key = "\x00\x01\x02\x03\x04\x05\x06\x07"
7089 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
7090 "\x10\x11\x12\x13\x14\x15\x16\x17"
7091 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
7092 .klen = 32,
7093 .iv = "\x00\x00\x00\x00\x00\x00\x00\x00"
7094 "\x00\x00\x00\x00\x00\x00\x00\x00",
7095 .input =
7096 "\x00\x01\x02\x03\x04\x05\x06\x07"
7097 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
7098 "\x10\x11\x12\x13\x14\x15\x16\x17"
7099 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
7100 "\x20\x21\x22\x23\x24\x25\x26\x27"
7101 "\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f"
7102 "\x30\x31\x32\x33\x34\x35\x36\x37"
7103 "\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f"
7104 "\x40\x41\x42\x43\x44\x45\x46\x47"
7105 "\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f"
7106 "\x50\x51\x52\x53\x54\x55\x56\x57"
7107 "\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f"
7108 "\x60\x61\x62\x63\x64\x65\x66\x67"
7109 "\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f"
7110 "\x70\x71\x72\x73\x74\x75\x76\x77"
7111 "\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f"
7112 "\x80\x81\x82\x83\x84\x85\x86\x87"
7113 "\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
7114 "\x90\x91\x92\x93\x94\x95\x96\x97"
7115 "\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
7116 "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7"
7117 "\xa8\xa9\xaa\xab\xac\xad\xae\xaf"
7118 "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7"
7119 "\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
7120 "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
7121 "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
7122 "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7"
7123 "\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf"
7124 "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7"
7125 "\xe8\xe9\xea\xeb\xec\xed\xee\xef"
7126 "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7"
7127 "\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"
7128 "\x00\x03\x06\x09\x0c\x0f\x12\x15"
7129 "\x18\x1b\x1e\x21\x24\x27\x2a\x2d"
7130 "\x30\x33\x36\x39\x3c\x3f\x42\x45"
7131 "\x48\x4b\x4e\x51\x54\x57\x5a\x5d"
7132 "\x60\x63\x66\x69\x6c\x6f\x72\x75"
7133 "\x78\x7b\x7e\x81\x84\x87\x8a\x8d"
7134 "\x90\x93\x96\x99\x9c\x9f\xa2\xa5"
7135 "\xa8\xab\xae\xb1\xb4\xb7\xba\xbd"
7136 "\xc0\xc3\xc6\xc9\xcc\xcf\xd2\xd5"
7137 "\xd8\xdb\xde\xe1\xe4\xe7\xea\xed"
7138 "\xf0\xf3\xf6\xf9\xfc\xff\x02\x05"
7139 "\x08\x0b\x0e\x11\x14\x17\x1a\x1d"
7140 "\x20\x23\x26\x29\x2c\x2f\x32\x35"
7141 "\x38\x3b\x3e\x41\x44\x47\x4a\x4d"
7142 "\x50\x53\x56\x59\x5c\x5f\x62\x65"
7143 "\x68\x6b\x6e\x71\x74\x77\x7a\x7d"
7144 "\x80\x83\x86\x89\x8c\x8f\x92\x95"
7145 "\x98\x9b\x9e\xa1\xa4\xa7\xaa\xad"
7146 "\xb0\xb3\xb6\xb9\xbc\xbf\xc2\xc5"
7147 "\xc8\xcb\xce\xd1\xd4\xd7\xda\xdd"
7148 "\xe0\xe3\xe6\xe9\xec\xef\xf2\xf5"
7149 "\xf8\xfb\xfe\x01\x04\x07\x0a\x0d"
7150 "\x10\x13\x16\x19\x1c\x1f\x22\x25"
7151 "\x28\x2b\x2e\x31\x34\x37\x3a\x3d"
7152 "\x40\x43\x46\x49\x4c\x4f\x52\x55"
7153 "\x58\x5b\x5e\x61\x64\x67\x6a\x6d"
7154 "\x70\x73\x76\x79\x7c\x7f\x82\x85"
7155 "\x88\x8b\x8e\x91\x94\x97\x9a\x9d"
7156 "\xa0\xa3\xa6\xa9\xac\xaf\xb2\xb5"
7157 "\xb8\xbb\xbe\xc1\xc4\xc7\xca\xcd"
7158 "\xd0\xd3\xd6\xd9\xdc\xdf\xe2\xe5"
7159 "\xe8\xeb\xee\xf1\xf4\xf7\xfa\xfd"
7160 "\x00\x05\x0a\x0f\x14\x19\x1e\x23"
7161 "\x28\x2d\x32\x37\x3c\x41\x46\x4b"
7162 "\x50\x55\x5a\x5f\x64\x69\x6e\x73"
7163 "\x78\x7d\x82\x87\x8c\x91\x96\x9b"
7164 "\xa0\xa5\xaa\xaf\xb4\xb9\xbe\xc3"
7165 "\xc8\xcd\xd2\xd7\xdc\xe1\xe6\xeb"
7166 "\xf0\xf5\xfa\xff\x04\x09\x0e\x13"
7167 "\x18\x1d\x22\x27\x2c\x31\x36\x3b"
7168 "\x40\x45\x4a\x4f\x54\x59\x5e\x63"
7169 "\x68\x6d\x72\x77\x7c\x81\x86\x8b"
7170 "\x90\x95\x9a\x9f\xa4\xa9\xae\xb3"
7171 "\xb8\xbd\xc2\xc7\xcc\xd1\xd6\xdb"
7172 "\xe0\xe5\xea\xef\xf4\xf9\xfe\x03"
7173 "\x08\x0d\x12\x17\x1c\x21\x26\x2b"
7174 "\x30\x35\x3a\x3f\x44\x49\x4e\x53"
7175 "\x58\x5d\x62\x67\x6c\x71\x76\x7b"
7176 "\x80\x85\x8a\x8f\x94\x99\x9e\xa3"
7177 "\xa8\xad\xb2\xb7\xbc\xc1\xc6\xcb"
7178 "\xd0\xd5\xda\xdf\xe4\xe9\xee\xf3"
7179 "\xf8\xfd\x02\x07\x0c\x11\x16\x1b"
7180 "\x20\x25\x2a\x2f\x34\x39\x3e\x43"
7181 "\x48\x4d\x52\x57\x5c\x61\x66\x6b"
7182 "\x70\x75\x7a\x7f\x84\x89\x8e\x93"
7183 "\x98\x9d\xa2\xa7\xac\xb1\xb6\xbb"
7184 "\xc0\xc5\xca\xcf\xd4\xd9\xde\xe3"
7185 "\xe8\xed\xf2\xf7\xfc\x01\x06\x0b"
7186 "\x10\x15\x1a\x1f\x24\x29\x2e\x33"
7187 "\x38\x3d\x42\x47\x4c\x51\x56\x5b"
7188 "\x60\x65\x6a\x6f\x74\x79\x7e\x83"
7189 "\x88\x8d\x92\x97\x9c\xa1\xa6\xab"
7190 "\xb0\xb5\xba\xbf\xc4\xc9\xce\xd3"
7191 "\xd8\xdd\xe2\xe7\xec\xf1\xf6\xfb"
7192 "\x00\x07\x0e\x15\x1c\x23\x2a\x31"
7193 "\x38\x3f\x46\x4d\x54\x5b\x62\x69"
7194 "\x70\x77\x7e\x85\x8c\x93\x9a\xa1"
7195 "\xa8\xaf\xb6\xbd\xc4\xcb\xd2\xd9"
7196 "\xe0\xe7\xee\xf5\xfc\x03\x0a\x11"
7197 "\x18\x1f\x26\x2d\x34\x3b\x42\x49"
7198 "\x50\x57\x5e\x65\x6c\x73\x7a\x81"
7199 "\x88\x8f\x96\x9d\xa4\xab\xb2\xb9"
7200 "\xc0\xc7\xce\xd5\xdc\xe3\xea\xf1"
7201 "\xf8\xff\x06\x0d\x14\x1b\x22\x29"
7202 "\x30\x37\x3e\x45\x4c\x53\x5a\x61"
7203 "\x68\x6f\x76\x7d\x84\x8b\x92\x99"
7204 "\xa0\xa7\xae\xb5\xbc\xc3\xca\xd1"
7205 "\xd8\xdf\xe6\xed\xf4\xfb\x02\x09"
7206 "\x10\x17\x1e\x25\x2c\x33\x3a\x41"
7207 "\x48\x4f\x56\x5d\x64\x6b\x72\x79"
7208 "\x80\x87\x8e\x95\x9c\xa3\xaa\xb1"
7209 "\xb8\xbf\xc6\xcd\xd4\xdb\xe2\xe9"
7210 "\xf0\xf7\xfe\x05\x0c\x13\x1a\x21"
7211 "\x28\x2f\x36\x3d\x44\x4b\x52\x59"
7212 "\x60\x67\x6e\x75\x7c\x83\x8a\x91"
7213 "\x98\x9f\xa6\xad\xb4\xbb\xc2\xc9"
7214 "\xd0\xd7\xde\xe5\xec\xf3\xfa\x01"
7215 "\x08\x0f\x16\x1d\x24\x2b\x32\x39"
7216 "\x40\x47\x4e\x55\x5c\x63\x6a\x71"
7217 "\x78\x7f\x86\x8d\x94\x9b\xa2\xa9"
7218 "\xb0\xb7\xbe\xc5\xcc\xd3\xda\xe1"
7219 "\xe8\xef\xf6\xfd\x04\x0b\x12\x19"
7220 "\x20\x27\x2e\x35\x3c\x43\x4a\x51"
7221 "\x58\x5f\x66\x6d\x74\x7b\x82\x89"
7222 "\x90\x97\x9e\xa5\xac\xb3\xba\xc1"
7223 "\xc8\xcf\xd6\xdd\xe4\xeb\xf2\xf9"
7224 "\x00\x09\x12\x1b\x24\x2d\x36\x3f"
7225 "\x48\x51\x5a\x63\x6c\x75\x7e\x87"
7226 "\x90\x99\xa2\xab\xb4\xbd\xc6\xcf"
7227 "\xd8\xe1\xea\xf3\xfc\x05\x0e\x17"
7228 "\x20\x29\x32\x3b\x44\x4d\x56\x5f"
7229 "\x68\x71\x7a\x83\x8c\x95\x9e\xa7"
7230 "\xb0\xb9\xc2\xcb\xd4\xdd\xe6\xef"
7231 "\xf8\x01\x0a\x13\x1c\x25\x2e\x37"
7232 "\x40\x49\x52\x5b\x64\x6d\x76\x7f"
7233 "\x88\x91\x9a\xa3\xac\xb5\xbe\xc7"
7234 "\xd0\xd9\xe2\xeb\xf4\xfd\x06\x0f"
7235 "\x18\x21\x2a\x33\x3c\x45\x4e\x57"
7236 "\x60\x69\x72\x7b\x84\x8d\x96\x9f"
7237 "\xa8\xb1\xba\xc3\xcc\xd5\xde\xe7"
7238 "\xf0\xf9\x02\x0b\x14\x1d\x26\x2f"
7239 "\x38\x41\x4a\x53\x5c\x65\x6e\x77"
7240 "\x80\x89\x92\x9b\xa4\xad\xb6\xbf"
7241 "\xc8\xd1\xda\xe3\xec\xf5\xfe\x07"
7242 "\x10\x19\x22\x2b\x34\x3d\x46\x4f"
7243 "\x58\x61\x6a\x73\x7c\x85\x8e\x97"
7244 "\xa0\xa9\xb2\xbb\xc4\xcd\xd6\xdf"
7245 "\xe8\xf1\xfa\x03\x0c\x15\x1e\x27"
7246 "\x30\x39\x42\x4b\x54\x5d\x66\x6f"
7247 "\x78\x81\x8a\x93\x9c\xa5\xae\xb7"
7248 "\xc0\xc9\xd2\xdb\xe4\xed\xf6\xff"
7249 "\x08\x11\x1a\x23\x2c\x35\x3e\x47"
7250 "\x50\x59\x62\x6b\x74\x7d\x86\x8f"
7251 "\x98\xa1\xaa\xb3\xbc\xc5\xce\xd7"
7252 "\xe0\xe9\xf2\xfb\x04\x0d\x16\x1f"
7253 "\x28\x31\x3a\x43\x4c\x55\x5e\x67"
7254 "\x70\x79\x82\x8b\x94\x9d\xa6\xaf"
7255 "\xb8\xc1\xca\xd3\xdc\xe5\xee\xf7"
7256 "\x00\x0b\x16\x21\x2c\x37\x42\x4d"
7257 "\x58\x63\x6e\x79\x84\x8f\x9a\xa5"
7258 "\xb0\xbb\xc6\xd1\xdc\xe7\xf2\xfd"
7259 "\x08\x13\x1e\x29\x34\x3f\x4a\x55"
7260 "\x60\x6b\x76\x81\x8c\x97\xa2\xad"
7261 "\xb8\xc3\xce\xd9\xe4\xef\xfa\x05"
7262 "\x10\x1b\x26\x31\x3c\x47\x52\x5d"
7263 "\x68\x73\x7e\x89\x94\x9f\xaa\xb5"
7264 "\xc0\xcb\xd6\xe1\xec\xf7\x02\x0d"
7265 "\x18\x23\x2e\x39\x44\x4f\x5a\x65"
7266 "\x70\x7b\x86\x91\x9c\xa7\xb2\xbd"
7267 "\xc8\xd3\xde\xe9\xf4\xff\x0a\x15"
7268 "\x20\x2b\x36\x41\x4c\x57\x62\x6d"
7269 "\x78\x83\x8e\x99\xa4\xaf\xba\xc5"
7270 "\xd0\xdb\xe6\xf1\xfc\x07\x12\x1d"
7271 "\x28\x33\x3e\x49\x54\x5f\x6a\x75"
7272 "\x80\x8b\x96\xa1\xac\xb7\xc2\xcd"
7273 "\xd8\xe3\xee\xf9\x04\x0f\x1a\x25"
7274 "\x30\x3b\x46\x51\x5c\x67\x72\x7d"
7275 "\x88\x93\x9e\xa9\xb4\xbf\xca\xd5"
7276 "\xe0\xeb\xf6\x01\x0c\x17\x22\x2d"
7277 "\x38\x43\x4e\x59\x64\x6f\x7a\x85"
7278 "\x90\x9b\xa6\xb1\xbc\xc7\xd2\xdd"
7279 "\xe8\xf3\xfe\x09\x14\x1f\x2a\x35"
7280 "\x40\x4b\x56\x61\x6c\x77\x82\x8d"
7281 "\x98\xa3\xae\xb9\xc4\xcf\xda\xe5"
7282 "\xf0\xfb\x06\x11\x1c\x27\x32\x3d"
7283 "\x48\x53\x5e\x69\x74\x7f\x8a\x95"
7284 "\xa0\xab\xb6\xc1\xcc\xd7\xe2\xed"
7285 "\xf8\x03\x0e\x19\x24\x2f\x3a\x45"
7286 "\x50\x5b\x66\x71\x7c\x87\x92\x9d"
7287 "\xa8\xb3\xbe\xc9\xd4\xdf\xea\xf5"
7288 "\x00\x0d\x1a\x27\x34\x41\x4e\x5b"
7289 "\x68\x75\x82\x8f\x9c\xa9\xb6\xc3"
7290 "\xd0\xdd\xea\xf7\x04\x11\x1e\x2b"
7291 "\x38\x45\x52\x5f\x6c\x79\x86\x93"
7292 "\xa0\xad\xba\xc7\xd4\xe1\xee\xfb"
7293 "\x08\x15\x22\x2f\x3c\x49\x56\x63"
7294 "\x70\x7d\x8a\x97\xa4\xb1\xbe\xcb"
7295 "\xd8\xe5\xf2\xff\x0c\x19\x26\x33"
7296 "\x40\x4d\x5a\x67\x74\x81\x8e\x9b"
7297 "\xa8\xb5\xc2\xcf\xdc\xe9\xf6\x03"
7298 "\x10\x1d\x2a\x37\x44\x51\x5e\x6b"
7299 "\x78\x85\x92\x9f\xac\xb9\xc6\xd3"
7300 "\xe0\xed\xfa\x07\x14\x21\x2e\x3b"
7301 "\x48\x55\x62\x6f\x7c\x89\x96\xa3"
7302 "\xb0\xbd\xca\xd7\xe4\xf1\xfe\x0b"
7303 "\x18\x25\x32\x3f\x4c\x59\x66\x73"
7304 "\x80\x8d\x9a\xa7\xb4\xc1\xce\xdb"
7305 "\xe8\xf5\x02\x0f\x1c\x29\x36\x43"
7306 "\x50\x5d\x6a\x77\x84\x91\x9e\xab"
7307 "\xb8\xc5\xd2\xdf\xec\xf9\x06\x13"
7308 "\x20\x2d\x3a\x47\x54\x61\x6e\x7b"
7309 "\x88\x95\xa2\xaf\xbc\xc9\xd6\xe3"
7310 "\xf0\xfd\x0a\x17\x24\x31\x3e\x4b"
7311 "\x58\x65\x72\x7f\x8c\x99\xa6\xb3"
7312 "\xc0\xcd\xda\xe7\xf4\x01\x0e\x1b"
7313 "\x28\x35\x42\x4f\x5c\x69\x76\x83"
7314 "\x90\x9d\xaa\xb7\xc4\xd1\xde\xeb"
7315 "\xf8\x05\x12\x1f\x2c\x39\x46\x53"
7316 "\x60\x6d\x7a\x87\x94\xa1\xae\xbb"
7317 "\xc8\xd5\xe2\xef\xfc\x09\x16\x23"
7318 "\x30\x3d\x4a\x57\x64\x71\x7e\x8b"
7319 "\x98\xa5\xb2\xbf\xcc\xd9\xe6\xf3"
7320 "\x00\x0f\x1e\x2d\x3c\x4b\x5a\x69"
7321 "\x78\x87\x96\xa5\xb4\xc3\xd2\xe1"
7322 "\xf0\xff\x0e\x1d\x2c\x3b\x4a\x59"
7323 "\x68\x77\x86\x95\xa4\xb3\xc2\xd1"
7324 "\xe0\xef\xfe\x0d\x1c\x2b\x3a\x49"
7325 "\x58\x67\x76\x85\x94\xa3\xb2\xc1"
7326 "\xd0\xdf\xee\xfd\x0c\x1b\x2a\x39"
7327 "\x48\x57\x66\x75\x84\x93\xa2\xb1"
7328 "\xc0\xcf\xde\xed\xfc\x0b\x1a\x29"
7329 "\x38\x47\x56\x65\x74\x83\x92\xa1"
7330 "\xb0\xbf\xce\xdd\xec\xfb\x0a\x19"
7331 "\x28\x37\x46\x55\x64\x73\x82\x91"
7332 "\xa0\xaf\xbe\xcd\xdc\xeb\xfa\x09"
7333 "\x18\x27\x36\x45\x54\x63\x72\x81"
7334 "\x90\x9f\xae\xbd\xcc\xdb\xea\xf9"
7335 "\x08\x17\x26\x35\x44\x53\x62\x71"
7336 "\x80\x8f\x9e\xad\xbc\xcb\xda\xe9"
7337 "\xf8\x07\x16\x25\x34\x43\x52\x61"
7338 "\x70\x7f\x8e\x9d\xac\xbb\xca\xd9"
7339 "\xe8\xf7\x06\x15\x24\x33\x42\x51"
7340 "\x60\x6f\x7e\x8d\x9c\xab\xba\xc9"
7341 "\xd8\xe7\xf6\x05\x14\x23\x32\x41"
7342 "\x50\x5f\x6e\x7d\x8c\x9b\xaa\xb9"
7343 "\xc8\xd7\xe6\xf5\x04\x13\x22\x31"
7344 "\x40\x4f\x5e\x6d\x7c\x8b\x9a\xa9"
7345 "\xb8\xc7\xd6\xe5\xf4\x03\x12\x21"
7346 "\x30\x3f\x4e\x5d\x6c\x7b\x8a\x99"
7347 "\xa8\xb7\xc6\xd5\xe4\xf3\x02\x11"
7348 "\x20\x2f\x3e\x4d\x5c\x6b\x7a\x89"
7349 "\x98\xa7\xb6\xc5\xd4\xe3\xf2\x01"
7350 "\x10\x1f\x2e\x3d\x4c\x5b\x6a\x79"
7351 "\x88\x97\xa6\xb5\xc4\xd3\xe2\xf1"
7352 "\x00\x11\x22\x33\x44\x55\x66\x77"
7353 "\x88\x99\xaa\xbb\xcc\xdd\xee\xff"
7354 "\x10\x21\x32\x43\x54\x65\x76\x87"
7355 "\x98\xa9\xba\xcb\xdc\xed\xfe\x0f"
7356 "\x20\x31\x42\x53\x64\x75\x86\x97"
7357 "\xa8\xb9\xca\xdb\xec\xfd\x0e\x1f"
7358 "\x30\x41\x52\x63\x74\x85\x96\xa7"
7359 "\xb8\xc9\xda\xeb\xfc\x0d\x1e\x2f"
7360 "\x40\x51\x62\x73\x84\x95\xa6\xb7"
7361 "\xc8\xd9\xea\xfb\x0c\x1d\x2e\x3f"
7362 "\x50\x61\x72\x83\x94\xa5\xb6\xc7"
7363 "\xd8\xe9\xfa\x0b\x1c\x2d\x3e\x4f"
7364 "\x60\x71\x82\x93\xa4\xb5\xc6\xd7"
7365 "\xe8\xf9\x0a\x1b\x2c\x3d\x4e\x5f"
7366 "\x70\x81\x92\xa3\xb4\xc5\xd6\xe7"
7367 "\xf8\x09\x1a\x2b\x3c\x4d\x5e\x6f"
7368 "\x80\x91\xa2\xb3\xc4\xd5\xe6\xf7"
7369 "\x08\x19\x2a\x3b\x4c\x5d\x6e\x7f"
7370 "\x90\xa1\xb2\xc3\xd4\xe5\xf6\x07"
7371 "\x18\x29\x3a\x4b\x5c\x6d\x7e\x8f"
7372 "\xa0\xb1\xc2\xd3\xe4\xf5\x06\x17"
7373 "\x28\x39\x4a\x5b\x6c\x7d\x8e\x9f"
7374 "\xb0\xc1\xd2\xe3\xf4\x05\x16\x27"
7375 "\x38\x49\x5a\x6b\x7c\x8d\x9e\xaf"
7376 "\xc0\xd1\xe2\xf3\x04\x15\x26\x37"
7377 "\x48\x59\x6a\x7b\x8c\x9d\xae\xbf"
7378 "\xd0\xe1\xf2\x03\x14\x25\x36\x47"
7379 "\x58\x69\x7a\x8b\x9c\xad\xbe\xcf"
7380 "\xe0\xf1\x02\x13\x24\x35\x46\x57"
7381 "\x68\x79\x8a\x9b\xac\xbd\xce\xdf"
7382 "\xf0\x01\x12\x23\x34\x45\x56\x67"
7383 "\x78\x89\x9a\xab\xbc\xcd\xde\xef"
7384 "\x00\x13\x26\x39\x4c\x5f\x72\x85"
7385 "\x98\xab\xbe\xd1\xe4\xf7\x0a\x1d"
7386 "\x30\x43\x56\x69\x7c\x8f\xa2\xb5"
7387 "\xc8\xdb\xee\x01\x14\x27\x3a\x4d"
7388 "\x60\x73\x86\x99\xac\xbf\xd2\xe5"
7389 "\xf8\x0b\x1e\x31\x44\x57\x6a\x7d"
7390 "\x90\xa3\xb6\xc9\xdc\xef\x02\x15"
7391 "\x28\x3b\x4e\x61\x74\x87\x9a\xad"
7392 "\xc0\xd3\xe6\xf9\x0c\x1f\x32\x45"
7393 "\x58\x6b\x7e\x91\xa4\xb7\xca\xdd"
7394 "\xf0\x03\x16\x29\x3c\x4f\x62\x75"
7395 "\x88\x9b\xae\xc1\xd4\xe7\xfa\x0d"
7396 "\x20\x33\x46\x59\x6c\x7f\x92\xa5"
7397 "\xb8\xcb\xde\xf1\x04\x17\x2a\x3d"
7398 "\x50\x63\x76\x89\x9c\xaf\xc2\xd5"
7399 "\xe8\xfb\x0e\x21\x34\x47\x5a\x6d"
7400 "\x80\x93\xa6\xb9\xcc\xdf\xf2\x05"
7401 "\x18\x2b\x3e\x51\x64\x77\x8a\x9d"
7402 "\xb0\xc3\xd6\xe9\xfc\x0f\x22\x35"
7403 "\x48\x5b\x6e\x81\x94\xa7\xba\xcd"
7404 "\xe0\xf3\x06\x19\x2c\x3f\x52\x65"
7405 "\x78\x8b\x9e\xb1\xc4\xd7\xea\xfd"
7406 "\x10\x23\x36\x49\x5c\x6f\x82\x95"
7407 "\xa8\xbb\xce\xe1\xf4\x07\x1a\x2d"
7408 "\x40\x53\x66\x79\x8c\x9f\xb2\xc5"
7409 "\xd8\xeb\xfe\x11\x24\x37\x4a\x5d"
7410 "\x70\x83\x96\xa9\xbc\xcf\xe2\xf5"
7411 "\x08\x1b\x2e\x41\x54\x67\x7a\x8d"
7412 "\xa0\xb3\xc6\xd9\xec\xff\x12\x25"
7413 "\x38\x4b\x5e\x71\x84\x97\xaa\xbd"
7414 "\xd0\xe3\xf6\x09\x1c\x2f\x42\x55"
7415 "\x68\x7b\x8e\xa1\xb4\xc7\xda\xed"
7416 "\x00\x15\x2a\x3f\x54\x69\x7e\x93"
7417 "\xa8\xbd\xd2\xe7\xfc\x11\x26\x3b"
7418 "\x50\x65\x7a\x8f\xa4\xb9\xce\xe3"
7419 "\xf8\x0d\x22\x37\x4c\x61\x76\x8b"
7420 "\xa0\xb5\xca\xdf\xf4\x09\x1e\x33"
7421 "\x48\x5d\x72\x87\x9c\xb1\xc6\xdb"
7422 "\xf0\x05\x1a\x2f\x44\x59\x6e\x83"
7423 "\x98\xad\xc2\xd7\xec\x01\x16\x2b"
7424 "\x40\x55\x6a\x7f\x94\xa9\xbe\xd3"
7425 "\xe8\xfd\x12\x27\x3c\x51\x66\x7b"
7426 "\x90\xa5\xba\xcf\xe4\xf9\x0e\x23"
7427 "\x38\x4d\x62\x77\x8c\xa1\xb6\xcb"
7428 "\xe0\xf5\x0a\x1f\x34\x49\x5e\x73"
7429 "\x88\x9d\xb2\xc7\xdc\xf1\x06\x1b"
7430 "\x30\x45\x5a\x6f\x84\x99\xae\xc3"
7431 "\xd8\xed\x02\x17\x2c\x41\x56\x6b"
7432 "\x80\x95\xaa\xbf\xd4\xe9\xfe\x13"
7433 "\x28\x3d\x52\x67\x7c\x91\xa6\xbb"
7434 "\xd0\xe5\xfa\x0f\x24\x39\x4e\x63"
7435 "\x78\x8d\xa2\xb7\xcc\xe1\xf6\x0b"
7436 "\x20\x35\x4a\x5f\x74\x89\x9e\xb3"
7437 "\xc8\xdd\xf2\x07\x1c\x31\x46\x5b"
7438 "\x70\x85\x9a\xaf\xc4\xd9\xee\x03"
7439 "\x18\x2d\x42\x57\x6c\x81\x96\xab"
7440 "\xc0\xd5\xea\xff\x14\x29\x3e\x53"
7441 "\x68\x7d\x92\xa7\xbc\xd1\xe6\xfb"
7442 "\x10\x25\x3a\x4f\x64\x79\x8e\xa3"
7443 "\xb8\xcd\xe2\xf7\x0c\x21\x36\x4b"
7444 "\x60\x75\x8a\x9f\xb4\xc9\xde\xf3"
7445 "\x08\x1d\x32\x47\x5c\x71\x86\x9b"
7446 "\xb0\xc5\xda\xef\x04\x19\x2e\x43"
7447 "\x58\x6d\x82\x97\xac\xc1\xd6\xeb"
7448 "\x00\x17\x2e\x45\x5c\x73\x8a\xa1"
7449 "\xb8\xcf\xe6\xfd\x14\x2b\x42\x59"
7450 "\x70\x87\x9e\xb5\xcc\xe3\xfa\x11"
7451 "\x28\x3f\x56\x6d\x84\x9b\xb2\xc9"
7452 "\xe0\xf7\x0e\x25\x3c\x53\x6a\x81"
7453 "\x98\xaf\xc6\xdd\xf4\x0b\x22\x39"
7454 "\x50\x67\x7e\x95\xac\xc3\xda\xf1"
7455 "\x08\x1f\x36\x4d\x64\x7b\x92\xa9"
7456 "\xc0\xd7\xee\x05\x1c\x33\x4a\x61"
7457 "\x78\x8f\xa6\xbd\xd4\xeb\x02\x19"
7458 "\x30\x47\x5e\x75\x8c\xa3\xba\xd1"
7459 "\xe8\xff\x16\x2d\x44\x5b\x72\x89"
7460 "\xa0\xb7\xce\xe5\xfc\x13\x2a\x41"
7461 "\x58\x6f\x86\x9d\xb4\xcb\xe2\xf9"
7462 "\x10\x27\x3e\x55\x6c\x83\x9a\xb1"
7463 "\xc8\xdf\xf6\x0d\x24\x3b\x52\x69"
7464 "\x80\x97\xae\xc5\xdc\xf3\x0a\x21"
7465 "\x38\x4f\x66\x7d\x94\xab\xc2\xd9"
7466 "\xf0\x07\x1e\x35\x4c\x63\x7a\x91"
7467 "\xa8\xbf\xd6\xed\x04\x1b\x32\x49"
7468 "\x60\x77\x8e\xa5\xbc\xd3\xea\x01"
7469 "\x18\x2f\x46\x5d\x74\x8b\xa2\xb9"
7470 "\xd0\xe7\xfe\x15\x2c\x43\x5a\x71"
7471 "\x88\x9f\xb6\xcd\xe4\xfb\x12\x29"
7472 "\x40\x57\x6e\x85\x9c\xb3\xca\xe1"
7473 "\xf8\x0f\x26\x3d\x54\x6b\x82\x99"
7474 "\xb0\xc7\xde\xf5\x0c\x23\x3a\x51"
7475 "\x68\x7f\x96\xad\xc4\xdb\xf2\x09"
7476 "\x20\x37\x4e\x65\x7c\x93\xaa\xc1"
7477 "\xd8\xef\x06\x1d\x34\x4b\x62\x79"
7478 "\x90\xa7\xbe\xd5\xec\x03\x1a\x31"
7479 "\x48\x5f\x76\x8d\xa4\xbb\xd2\xe9"
7480 "\x00\x19\x32\x4b\x64\x7d\x96\xaf"
7481 "\xc8\xe1\xfa\x13\x2c\x45\x5e\x77"
7482 "\x90\xa9\xc2\xdb\xf4\x0d\x26\x3f"
7483 "\x58\x71\x8a\xa3\xbc\xd5\xee\x07"
7484 "\x20\x39\x52\x6b\x84\x9d\xb6\xcf"
7485 "\xe8\x01\x1a\x33\x4c\x65\x7e\x97"
7486 "\xb0\xc9\xe2\xfb\x14\x2d\x46\x5f"
7487 "\x78\x91\xaa\xc3\xdc\xf5\x0e\x27"
7488 "\x40\x59\x72\x8b\xa4\xbd\xd6\xef"
7489 "\x08\x21\x3a\x53\x6c\x85\x9e\xb7"
7490 "\xd0\xe9\x02\x1b\x34\x4d\x66\x7f"
7491 "\x98\xb1\xca\xe3\xfc\x15\x2e\x47"
7492 "\x60\x79\x92\xab\xc4\xdd\xf6\x0f"
7493 "\x28\x41\x5a\x73\x8c\xa5\xbe\xd7"
7494 "\xf0\x09\x22\x3b\x54\x6d\x86\x9f"
7495 "\xb8\xd1\xea\x03\x1c\x35\x4e\x67"
7496 "\x80\x99\xb2\xcb\xe4\xfd\x16\x2f"
7497 "\x48\x61\x7a\x93\xac\xc5\xde\xf7"
7498 "\x10\x29\x42\x5b\x74\x8d\xa6\xbf"
7499 "\xd8\xf1\x0a\x23\x3c\x55\x6e\x87"
7500 "\xa0\xb9\xd2\xeb\x04\x1d\x36\x4f"
7501 "\x68\x81\x9a\xb3\xcc\xe5\xfe\x17"
7502 "\x30\x49\x62\x7b\x94\xad\xc6\xdf"
7503 "\xf8\x11\x2a\x43\x5c\x75\x8e\xa7"
7504 "\xc0\xd9\xf2\x0b\x24\x3d\x56\x6f"
7505 "\x88\xa1\xba\xd3\xec\x05\x1e\x37"
7506 "\x50\x69\x82\x9b\xb4\xcd\xe6\xff"
7507 "\x18\x31\x4a\x63\x7c\x95\xae\xc7"
7508 "\xe0\xf9\x12\x2b\x44\x5d\x76\x8f"
7509 "\xa8\xc1\xda\xf3\x0c\x25\x3e\x57"
7510 "\x70\x89\xa2\xbb\xd4\xed\x06\x1f"
7511 "\x38\x51\x6a\x83\x9c\xb5\xce\xe7"
7512 "\x00\x1b\x36\x51\x6c\x87\xa2\xbd"
7513 "\xd8\xf3\x0e\x29\x44\x5f\x7a\x95"
7514 "\xb0\xcb\xe6\x01\x1c\x37\x52\x6d"
7515 "\x88\xa3\xbe\xd9\xf4\x0f\x2a\x45"
7516 "\x60\x7b\x96\xb1\xcc\xe7\x02\x1d"
7517 "\x38\x53\x6e\x89\xa4\xbf\xda\xf5"
7518 "\x10\x2b\x46\x61\x7c\x97\xb2\xcd"
7519 "\xe8\x03\x1e\x39\x54\x6f\x8a\xa5"
7520 "\xc0\xdb\xf6\x11\x2c\x47\x62\x7d"
7521 "\x98\xb3\xce\xe9\x04\x1f\x3a\x55"
7522 "\x70\x8b\xa6\xc1\xdc\xf7\x12\x2d"
7523 "\x48\x63\x7e\x99\xb4\xcf\xea\x05"
7524 "\x20\x3b\x56\x71\x8c\xa7\xc2\xdd"
7525 "\xf8\x13\x2e\x49\x64\x7f\x9a\xb5"
7526 "\xd0\xeb\x06\x21\x3c\x57\x72\x8d"
7527 "\xa8\xc3\xde\xf9\x14\x2f\x4a\x65"
7528 "\x80\x9b\xb6\xd1\xec\x07\x22\x3d"
7529 "\x58\x73\x8e\xa9\xc4\xdf\xfa\x15"
7530 "\x30\x4b\x66\x81\x9c\xb7\xd2\xed"
7531 "\x08\x23\x3e\x59\x74\x8f\xaa\xc5"
7532 "\xe0\xfb\x16\x31\x4c\x67\x82\x9d"
7533 "\xb8\xd3\xee\x09\x24\x3f\x5a\x75"
7534 "\x90\xab\xc6\xe1\xfc\x17\x32\x4d"
7535 "\x68\x83\x9e\xb9\xd4\xef\x0a\x25"
7536 "\x40\x5b\x76\x91\xac\xc7\xe2\xfd"
7537 "\x18\x33\x4e\x69\x84\x9f\xba\xd5"
7538 "\xf0\x0b\x26\x41\x5c\x77\x92\xad"
7539 "\xc8\xe3\xfe\x19\x34\x4f\x6a\x85"
7540 "\xa0\xbb\xd6\xf1\x0c\x27\x42\x5d"
7541 "\x78\x93\xae\xc9\xe4\xff\x1a\x35"
7542 "\x50\x6b\x86\xa1\xbc\xd7\xf2\x0d"
7543 "\x28\x43\x5e\x79\x94\xaf\xca\xe5"
7544 "\x00\x1d\x3a\x57\x74\x91\xae\xcb"
7545 "\xe8\x05\x22\x3f\x5c\x79\x96\xb3"
7546 "\xd0\xed\x0a\x27\x44\x61\x7e\x9b"
7547 "\xb8\xd5\xf2\x0f\x2c\x49\x66\x83"
7548 "\xa0\xbd\xda\xf7\x14\x31\x4e\x6b"
7549 "\x88\xa5\xc2\xdf\xfc\x19\x36\x53"
7550 "\x70\x8d\xaa\xc7\xe4\x01\x1e\x3b"
7551 "\x58\x75\x92\xaf\xcc\xe9\x06\x23"
7552 "\x40\x5d\x7a\x97\xb4\xd1\xee\x0b"
7553 "\x28\x45\x62\x7f\x9c\xb9\xd6\xf3"
7554 "\x10\x2d\x4a\x67\x84\xa1\xbe\xdb"
7555 "\xf8\x15\x32\x4f\x6c\x89\xa6\xc3"
7556 "\xe0\xfd\x1a\x37\x54\x71\x8e\xab"
7557 "\xc8\xe5\x02\x1f\x3c\x59\x76\x93"
7558 "\xb0\xcd\xea\x07\x24\x41\x5e\x7b"
7559 "\x98\xb5\xd2\xef\x0c\x29\x46\x63"
7560 "\x80\x9d\xba\xd7\xf4\x11\x2e\x4b"
7561 "\x68\x85\xa2\xbf\xdc\xf9\x16\x33"
7562 "\x50\x6d\x8a\xa7\xc4\xe1\xfe\x1b"
7563 "\x38\x55\x72\x8f\xac\xc9\xe6\x03"
7564 "\x20\x3d\x5a\x77\x94\xb1\xce\xeb"
7565 "\x08\x25\x42\x5f\x7c\x99\xb6\xd3"
7566 "\xf0\x0d\x2a\x47\x64\x81\x9e\xbb"
7567 "\xd8\xf5\x12\x2f\x4c\x69\x86\xa3"
7568 "\xc0\xdd\xfa\x17\x34\x51\x6e\x8b"
7569 "\xa8\xc5\xe2\xff\x1c\x39\x56\x73"
7570 "\x90\xad\xca\xe7\x04\x21\x3e\x5b"
7571 "\x78\x95\xb2\xcf\xec\x09\x26\x43"
7572 "\x60\x7d\x9a\xb7\xd4\xf1\x0e\x2b"
7573 "\x48\x65\x82\x9f\xbc\xd9\xf6\x13"
7574 "\x30\x4d\x6a\x87\xa4\xc1\xde\xfb"
7575 "\x18\x35\x52\x6f\x8c\xa9\xc6\xe3"
7576 "\x00\x1f\x3e\x5d\x7c\x9b\xba\xd9"
7577 "\xf8\x17\x36\x55\x74\x93\xb2\xd1"
7578 "\xf0\x0f\x2e\x4d\x6c\x8b\xaa\xc9"
7579 "\xe8\x07\x26\x45\x64\x83\xa2\xc1"
7580 "\xe0\xff\x1e\x3d\x5c\x7b\x9a\xb9"
7581 "\xd8\xf7\x16\x35\x54\x73\x92\xb1"
7582 "\xd0\xef\x0e\x2d\x4c\x6b\x8a\xa9"
7583 "\xc8\xe7\x06\x25\x44\x63\x82\xa1"
7584 "\xc0\xdf\xfe\x1d\x3c\x5b\x7a\x99"
7585 "\xb8\xd7\xf6\x15\x34\x53\x72\x91"
7586 "\xb0\xcf\xee\x0d\x2c\x4b\x6a\x89"
7587 "\xa8\xc7\xe6\x05\x24\x43\x62\x81"
7588 "\xa0\xbf\xde\xfd\x1c\x3b\x5a\x79"
7589 "\x98\xb7\xd6\xf5\x14\x33\x52\x71"
7590 "\x90\xaf\xce\xed\x0c\x2b\x4a\x69"
7591 "\x88\xa7\xc6\xe5\x04\x23\x42\x61"
7592 "\x80\x9f\xbe\xdd\xfc\x1b\x3a\x59"
7593 "\x78\x97\xb6\xd5\xf4\x13\x32\x51"
7594 "\x70\x8f\xae\xcd\xec\x0b\x2a\x49"
7595 "\x68\x87\xa6\xc5\xe4\x03\x22\x41"
7596 "\x60\x7f\x9e\xbd\xdc\xfb\x1a\x39"
7597 "\x58\x77\x96\xb5\xd4\xf3\x12\x31"
7598 "\x50\x6f\x8e\xad\xcc\xeb\x0a\x29"
7599 "\x48\x67\x86\xa5\xc4\xe3\x02\x21"
7600 "\x40\x5f\x7e\x9d\xbc\xdb\xfa\x19"
7601 "\x38\x57\x76\x95\xb4\xd3\xf2\x11"
7602 "\x30\x4f\x6e\x8d\xac\xcb\xea\x09"
7603 "\x28\x47\x66\x85\xa4\xc3\xe2\x01"
7604 "\x20\x3f\x5e\x7d\x9c\xbb\xda\xf9"
7605 "\x18\x37\x56\x75\x94\xb3\xd2\xf1"
7606 "\x10\x2f\x4e\x6d\x8c\xab\xca\xe9"
7607 "\x08\x27\x46\x65\x84\xa3\xc2\xe1"
7608 "\x00\x21\x42\x63",
7609 .ilen = 4100,
7610 .result =
7611 "\xb5\x81\xf5\x64\x18\x73\xe3\xf0"
7612 "\x4c\x13\xf2\x77\x18\x60\x65\x5e"
7613 "\x29\x01\xce\x98\x55\x53\xf9\x0c"
7614 "\x2a\x08\xd5\x09\xb3\x57\x55\x56"
7615 "\xc5\xe9\x56\x90\xcb\x6a\xa3\xc0"
7616 "\xff\xc4\x79\xb4\xd2\x97\x5d\xc4"
7617 "\x43\xd1\xfe\x94\x7b\x88\x06\x5a"
7618 "\xb2\x9e\x2c\xfc\x44\x03\xb7\x90"
7619 "\xa0\xc1\xba\x6a\x33\xb8\xc7\xb2"
7620 "\x9d\xe1\x12\x4f\xc0\x64\xd4\x01"
7621 "\xfe\x8c\x7a\x66\xf7\xe6\x5a\x91"
7622 "\xbb\xde\x56\x86\xab\x65\x21\x30"
7623 "\x00\x84\x65\x24\xa5\x7d\x85\xb4"
7624 "\xe3\x17\xed\x3a\xb7\x6f\xb4\x0b"
7625 "\x0b\xaf\x15\xae\x5a\x8f\xf2\x0c"
7626 "\x2f\x27\xf4\x09\xd8\xd2\x96\xb7"
7627 "\x71\xf2\xc5\x99\x4d\x7e\x7f\x75"
7628 "\x77\x89\x30\x8b\x59\xdb\xa2\xb2"
7629 "\xa0\xf3\x19\x39\x2b\xc5\x7e\x3f"
7630 "\x4f\xd9\xd3\x56\x28\x97\x44\xdc"
7631 "\xc0\x8b\x77\x24\xd9\x52\xe7\xc5"
7632 "\xaf\xf6\x7d\x59\xb2\x44\x05\x1d"
7633 "\xb1\xb0\x11\xa5\x0f\xec\x33\xe1"
7634 "\x6d\x1b\x4e\x1f\xff\x57\x91\xb4"
7635 "\x5b\x9a\x96\xc5\x53\xbc\xae\x20"
7636 "\x3c\xbb\x14\xe2\xe8\x22\x33\xc1"
7637 "\x5e\x76\x9e\x46\x99\xf6\x2a\x15"
7638 "\xc6\x97\x02\xa0\x66\x43\xd1\xa6"
7639 "\x31\xa6\x9f\xfb\xf4\xd3\x69\xe5"
7640 "\xcd\x76\x95\xb8\x7a\x82\x7f\x21"
7641 "\x45\xff\x3f\xce\x55\xf6\x95\x10"
7642 "\x08\x77\x10\x43\xc6\xf3\x09\xe5"
7643 "\x68\xe7\x3c\xad\x00\x52\x45\x0d"
7644 "\xfe\x2d\xc6\xc2\x94\x8c\x12\x1d"
7645 "\xe6\x25\xae\x98\x12\x8e\x19\x9c"
7646 "\x81\x68\xb1\x11\xf6\x69\xda\xe3"
7647 "\x62\x08\x18\x7a\x25\x49\x28\xac"
7648 "\xba\x71\x12\x0b\xe4\xa2\xe5\xc7"
7649 "\x5d\x8e\xec\x49\x40\x21\xbf\x5a"
7650 "\x98\xf3\x02\x68\x55\x03\x7f\x8a"
7651 "\xe5\x94\x0c\x32\x5c\x07\x82\x63"
7652 "\xaf\x6f\x91\x40\x84\x8e\x52\x25"
7653 "\xd0\xb0\x29\x53\x05\xe2\x50\x7a"
7654 "\x34\xeb\xc9\x46\x20\xa8\x3d\xde"
7655 "\x7f\x16\x5f\x36\xc5\x2e\xdc\xd1"
7656 "\x15\x47\xc7\x50\x40\x6d\x91\xc5"
7657 "\xe7\x93\x95\x1a\xd3\x57\xbc\x52"
7658 "\x33\xee\x14\x19\x22\x52\x89\xa7"
7659 "\x4a\x25\x56\x77\x4b\xca\xcf\x0a"
7660 "\xe1\xf5\x35\x85\x30\x7e\x59\x4a"
7661 "\xbd\x14\x5b\xdf\xe3\x46\xcb\xac"
7662 "\x1f\x6c\x96\x0e\xf4\x81\xd1\x99"
7663 "\xca\x88\x63\x3d\x02\x58\x6b\xa9"
7664 "\xe5\x9f\xb3\x00\xb2\x54\xc6\x74"
7665 "\x1c\xbf\x46\xab\x97\xcc\xf8\x54"
7666 "\x04\x07\x08\x52\xe6\xc0\xda\x93"
7667 "\x74\x7d\x93\x99\x5d\x78\x68\xa6"
7668 "\x2e\x6b\xd3\x6a\x69\xcc\x12\x6b"
7669 "\xd4\xc7\xa5\xc6\xe7\xf6\x03\x04"
7670 "\x5d\xcd\x61\x5e\x17\x40\xdc\xd1"
7671 "\x5c\xf5\x08\xdf\x5c\x90\x85\xa4"
7672 "\xaf\xf6\x78\xbb\x0d\xf1\xf4\xa4"
7673 "\x54\x26\x72\x9e\x61\xfa\x86\xcf"
7674 "\xe8\x9e\xa1\xe0\xc7\x48\x23\xae"
7675 "\x5a\x90\xae\x75\x0a\x74\x18\x89"
7676 "\x05\xb1\x92\xb2\x7f\xd0\x1b\xa6"
7677 "\x62\x07\x25\x01\xc7\xc2\x4f\xf9"
7678 "\xe8\xfe\x63\x95\x80\x07\xb4\x26"
7679 "\xcc\xd1\x26\xb6\xc4\x3f\x9e\xcb"
7680 "\x8e\x3b\x2e\x44\x16\xd3\x10\x9a"
7681 "\x95\x08\xeb\xc8\xcb\xeb\xbf\x6f"
7682 "\x0b\xcd\x1f\xc8\xca\x86\xaa\xec"
7683 "\x33\xe6\x69\xf4\x45\x25\x86\x3a"
7684 "\x22\x94\x4f\x00\x23\x6a\x44\xc2"
7685 "\x49\x97\x33\xab\x36\x14\x0a\x70"
7686 "\x24\xc3\xbe\x04\x3b\x79\xa0\xf9"
7687 "\xb8\xe7\x76\x29\x22\x83\xd7\xf2"
7688 "\x94\xf4\x41\x49\xba\x5f\x7b\x07"
7689 "\xb5\xfb\xdb\x03\x1a\x9f\xb6\x4c"
7690 "\xc2\x2e\x37\x40\x49\xc3\x38\x16"
7691 "\xe2\x4f\x77\x82\xb0\x68\x4c\x71"
7692 "\x1d\x57\x61\x9c\xd9\x4e\x54\x99"
7693 "\x47\x13\x28\x73\x3c\xbb\x00\x90"
7694 "\xf3\x4d\xc9\x0e\xfd\xe7\xb1\x71"
7695 "\xd3\x15\x79\xbf\xcc\x26\x2f\xbd"
7696 "\xad\x6c\x50\x69\x6c\x3e\x6d\x80"
7697 "\x9a\xea\x78\xaf\x19\xb2\x0d\x4d"
7698 "\xad\x04\x07\xae\x22\x90\x4a\x93"
7699 "\x32\x0e\x36\x9b\x1b\x46\xba\x3b"
7700 "\xb4\xac\xc6\xd1\xa2\x31\x53\x3b"
7701 "\x2a\x3d\x45\xfe\x03\x61\x10\x85"
7702 "\x17\x69\xa6\x78\xcc\x6c\x87\x49"
7703 "\x53\xf9\x80\x10\xde\x80\xa2\x41"
7704 "\x6a\xc3\x32\x02\xad\x6d\x3c\x56"
7705 "\x00\x71\x51\x06\xa7\xbd\xfb\xef"
7706 "\x3c\xb5\x9f\xfc\x48\x7d\x53\x7c"
7707 "\x66\xb0\x49\x23\xc4\x47\x10\x0e"
7708 "\xe5\x6c\x74\x13\xe6\xc5\x3f\xaa"
7709 "\xde\xff\x07\x44\xdd\x56\x1b\xad"
7710 "\x09\x77\xfb\x5b\x12\xb8\x0d\x38"
7711 "\x17\x37\x35\x7b\x9b\xbc\xfe\xd4"
7712 "\x7e\x8b\xda\x7e\x5b\x04\xa7\x22"
7713 "\xa7\x31\xa1\x20\x86\xc7\x1b\x99"
7714 "\xdb\xd1\x89\xf4\x94\xa3\x53\x69"
7715 "\x8d\xe7\xe8\x74\x11\x8d\x74\xd6"
7716 "\x07\x37\x91\x9f\xfd\x67\x50\x3a"
7717 "\xc9\xe1\xf4\x36\xd5\xa0\x47\xd1"
7718 "\xf9\xe5\x39\xa3\x31\xac\x07\x36"
7719 "\x23\xf8\x66\x18\x14\x28\x34\x0f"
7720 "\xb8\xd0\xe7\x29\xb3\x04\x4b\x55"
7721 "\x01\x41\xb2\x75\x8d\xcb\x96\x85"
7722 "\x3a\xfb\xab\x2b\x9e\xfa\x58\x20"
7723 "\x44\x1f\xc0\x14\x22\x75\x61\xe8"
7724 "\xaa\x19\xcf\xf1\x82\x56\xf4\xd7"
7725 "\x78\x7b\x3d\x5f\xb3\x9e\x0b\x8a"
7726 "\x57\x50\xdb\x17\x41\x65\x4d\xa3"
7727 "\x02\xc9\x9c\x9c\x53\xfb\x39\x39"
7728 "\x9b\x1d\x72\x24\xda\xb7\x39\xbe"
7729 "\x13\x3b\xfa\x29\xda\x9e\x54\x64"
7730 "\x6e\xba\xd8\xa1\xcb\xb3\x36\xfa"
7731 "\xcb\x47\x85\xe9\x61\x38\xbc\xbe"
7732 "\xc5\x00\x38\x2a\x54\xf7\xc4\xb9"
7733 "\xb3\xd3\x7b\xa0\xa0\xf8\x72\x7f"
7734 "\x8c\x8e\x82\x0e\xc6\x1c\x75\x9d"
7735 "\xca\x8e\x61\x87\xde\xad\x80\xd2"
7736 "\xf5\xf9\x80\xef\x15\x75\xaf\xf5"
7737 "\x80\xfb\xff\x6d\x1e\x25\xb7\x40"
7738 "\x61\x6a\x39\x5a\x6a\xb5\x31\xab"
7739 "\x97\x8a\x19\x89\x44\x40\xc0\xa6"
7740 "\xb4\x4e\x30\x32\x7b\x13\xe7\x67"
7741 "\xa9\x8b\x57\x04\xc2\x01\xa6\xf4"
7742 "\x28\x99\xad\x2c\x76\xa3\x78\xc2"
7743 "\x4a\xe6\xca\x5c\x50\x6a\xc1\xb0"
7744 "\x62\x4b\x10\x8e\x7c\x17\x43\xb3"
7745 "\x17\x66\x1c\x3e\x8d\x69\xf0\x5a"
7746 "\x71\xf5\x97\xdc\xd1\x45\xdd\x28"
7747 "\xf3\x5d\xdf\x53\x7b\x11\xe5\xbc"
7748 "\x4c\xdb\x1b\x51\x6b\xe9\xfb\x3d"
7749 "\xc1\xc3\x2c\xb9\x71\xf5\xb6\xb2"
7750 "\x13\x36\x79\x80\x53\xe8\xd3\xa6"
7751 "\x0a\xaf\xfd\x56\x97\xf7\x40\x8e"
7752 "\x45\xce\xf8\xb0\x9e\x5c\x33\x82"
7753 "\xb0\x44\x56\xfc\x05\x09\xe9\x2a"
7754 "\xac\x26\x80\x14\x1d\xc8\x3a\x35"
7755 "\x4c\x82\x97\xfd\x76\xb7\xa9\x0a"
7756 "\x35\x58\x79\x8e\x0f\x66\xea\xaf"
7757 "\x51\x6c\x09\xa9\x6e\x9b\xcb\x9a"
7758 "\x31\x47\xa0\x2f\x7c\x71\xb4\x4a"
7759 "\x11\xaa\x8c\x66\xc5\x64\xe6\x3a"
7760 "\x54\xda\x24\x6a\xc4\x41\x65\x46"
7761 "\x82\xa0\x0a\x0f\x5f\xfb\x25\xd0"
7762 "\x2c\x91\xa7\xee\xc4\x81\x07\x86"
7763 "\x75\x5e\x33\x69\x97\xe4\x2c\xa8"
7764 "\x9d\x9f\x0b\x6a\xbe\xad\x98\xda"
7765 "\x6d\x94\x41\xda\x2c\x1e\x89\xc4"
7766 "\xc2\xaf\x1e\x00\x05\x0b\x83\x60"
7767 "\xbd\x43\xea\x15\x23\x7f\xb9\xac"
7768 "\xee\x4f\x2c\xaf\x2a\xf3\xdf\xd0"
7769 "\xf3\x19\x31\xbb\x4a\x74\x84\x17"
7770 "\x52\x32\x2c\x7d\x61\xe4\xcb\xeb"
7771 "\x80\x38\x15\x52\xcb\x6f\xea\xe5"
7772 "\x73\x9c\xd9\x24\x69\xc6\x95\x32"
7773 "\x21\xc8\x11\xe4\xdc\x36\xd7\x93"
7774 "\x38\x66\xfb\xb2\x7f\x3a\xb9\xaf"
7775 "\x31\xdd\x93\x75\x78\x8a\x2c\x94"
7776 "\x87\x1a\x58\xec\x9e\x7d\x4d\xba"
7777 "\xe1\xe5\x4d\xfc\xbc\xa4\x2a\x14"
7778 "\xef\xcc\xa7\xec\xab\x43\x09\x18"
7779 "\xd3\xab\x68\xd1\x07\x99\x44\x47"
7780 "\xd6\x83\x85\x3b\x30\xea\xa9\x6b"
7781 "\x63\xea\xc4\x07\xfb\x43\x2f\xa4"
7782 "\xaa\xb0\xab\x03\x89\xce\x3f\x8c"
7783 "\x02\x7c\x86\x54\xbc\x88\xaf\x75"
7784 "\xd2\xdc\x63\x17\xd3\x26\xf6\x96"
7785 "\xa9\x3c\xf1\x61\x8c\x11\x18\xcc"
7786 "\xd6\xea\x5b\xe2\xcd\xf0\xf1\xb2"
7787 "\xe5\x35\x90\x1f\x85\x4c\x76\x5b"
7788 "\x66\xce\x44\xa4\x32\x9f\xe6\x7b"
7789 "\x71\x6e\x9f\x58\x15\x67\x72\x87"
7790 "\x64\x8e\x3a\x44\x45\xd4\x76\xfa"
7791 "\xc2\xf6\xef\x85\x05\x18\x7a\x9b"
7792 "\xba\x41\x54\xac\xf0\xfc\x59\x12"
7793 "\x3f\xdf\xa0\xe5\x8a\x65\xfd\x3a"
7794 "\x62\x8d\x83\x2c\x03\xbe\x05\x76"
7795 "\x2e\x53\x49\x97\x94\x33\xae\x40"
7796 "\x81\x15\xdb\x6e\xad\xaa\xf5\x4b"
7797 "\xe3\x98\x70\xdf\xe0\x7c\xcd\xdb"
7798 "\x02\xd4\x7d\x2f\xc1\xe6\xb4\xf3"
7799 "\xd7\x0d\x7a\xd9\x23\x9e\x87\x2d"
7800 "\xce\x87\xad\xcc\x72\x05\x00\x29"
7801 "\xdc\x73\x7f\x64\xc1\x15\x0e\xc2"
7802 "\xdf\xa7\x5f\xeb\x41\xa1\xcd\xef"
7803 "\x5c\x50\x79\x2a\x56\x56\x71\x8c"
7804 "\xac\xc0\x79\x50\x69\xca\x59\x32"
7805 "\x65\xf2\x54\xe4\x52\x38\x76\xd1"
7806 "\x5e\xde\x26\x9e\xfb\x75\x2e\x11"
7807 "\xb5\x10\xf4\x17\x73\xf5\x89\xc7"
7808 "\x4f\x43\x5c\x8e\x7c\xb9\x05\x52"
7809 "\x24\x40\x99\xfe\x9b\x85\x0b\x6c"
7810 "\x22\x3e\x8b\xae\x86\xa1\xd2\x79"
7811 "\x05\x68\x6b\xab\xe3\x41\x49\xed"
7812 "\x15\xa1\x8d\x40\x2d\x61\xdf\x1a"
7813 "\x59\xc9\x26\x8b\xef\x30\x4c\x88"
7814 "\x4b\x10\xf8\x8d\xa6\x92\x9f\x4b"
7815 "\xf3\xc4\x53\x0b\x89\x5d\x28\x92"
7816 "\xcf\x78\xb2\xc0\x5d\xed\x7e\xfc"
7817 "\xc0\x12\x23\x5f\x5a\x78\x86\x43"
7818 "\x6e\x27\xf7\x5a\xa7\x6a\xed\x19"
7819 "\x04\xf0\xb3\x12\xd1\xbd\x0e\x89"
7820 "\x6e\xbc\x96\xa8\xd8\x49\x39\x9f"
7821 "\x7e\x67\xf0\x2e\x3e\x01\xa9\xba"
7822 "\xec\x8b\x62\x8e\xcb\x4a\x70\x43"
7823 "\xc7\xc2\xc4\xca\x82\x03\x73\xe9"
7824 "\x11\xdf\xcf\x54\xea\xc9\xb0\x95"
7825 "\x51\xc0\x13\x3d\x92\x05\xfa\xf4"
7826 "\xa9\x34\xc8\xce\x6c\x3d\x54\xcc"
7827 "\xc4\xaf\xf1\xdc\x11\x44\x26\xa2"
7828 "\xaf\xf1\x85\x75\x7d\x03\x61\x68"
7829 "\x4e\x78\xc6\x92\x7d\x86\x7d\x77"
7830 "\xdc\x71\x72\xdb\xc6\xae\xa1\xcb"
7831 "\x70\x9a\x0b\x19\xbe\x4a\x6c\x2a"
7832 "\xe2\xba\x6c\x64\x9a\x13\x28\xdf"
7833 "\x85\x75\xe6\x43\xf6\x87\x08\x68"
7834 "\x6e\xba\x6e\x79\x9f\x04\xbc\x23"
7835 "\x50\xf6\x33\x5c\x1f\x24\x25\xbe"
7836 "\x33\x47\x80\x45\x56\xa3\xa7\xd7"
7837 "\x7a\xb1\x34\x0b\x90\x3c\x9c\xad"
7838 "\x44\x5f\x9e\x0e\x9d\xd4\xbd\x93"
7839 "\x5e\xfa\x3c\xe0\xb0\xd9\xed\xf3"
7840 "\xd6\x2e\xff\x24\xd8\x71\x6c\xed"
7841 "\xaf\x55\xeb\x22\xac\x93\x68\x32"
7842 "\x05\x5b\x47\xdd\xc6\x4a\xcb\xc7"
7843 "\x10\xe1\x3c\x92\x1a\xf3\x23\x78"
7844 "\x2b\xa1\xd2\x80\xf4\x12\xb1\x20"
7845 "\x8f\xff\x26\x35\xdd\xfb\xc7\x4e"
7846 "\x78\xf1\x2d\x50\x12\x77\xa8\x60"
7847 "\x7c\x0f\xf5\x16\x2f\x63\x70\x2a"
7848 "\xc0\x96\x80\x4e\x0a\xb4\x93\x35"
7849 "\x5d\x1d\x3f\x56\xf7\x2f\xbb\x90"
7850 "\x11\x16\x8f\xa2\xec\x47\xbe\xac"
7851 "\x56\x01\x26\x56\xb1\x8c\xb2\x10"
7852 "\xf9\x1a\xca\xf5\xd1\xb7\x39\x20"
7853 "\x63\xf1\x69\x20\x4f\x13\x12\x1f"
7854 "\x5b\x65\xfc\x98\xf7\xc4\x7a\xbe"
7855 "\xf7\x26\x4d\x2b\x84\x7b\x42\xad"
7856 "\xd8\x7a\x0a\xb4\xd8\x74\xbf\xc1"
7857 "\xf0\x6e\xb4\x29\xa3\xbb\xca\x46"
7858 "\x67\x70\x6a\x2d\xce\x0e\xa2\x8a"
7859 "\xa9\x87\xbf\x05\xc4\xc1\x04\xa3"
7860 "\xab\xd4\x45\x43\x8c\xb6\x02\xb0"
7861 "\x41\xc8\xfc\x44\x3d\x59\xaa\x2e"
7862 "\x44\x21\x2a\x8d\x88\x9d\x57\xf4"
7863 "\xa0\x02\x77\xb8\xa6\xa0\xe6\x75"
7864 "\x5c\x82\x65\x3e\x03\x5c\x29\x8f"
7865 "\x38\x55\xab\x33\x26\xef\x9f\x43"
7866 "\x52\xfd\x68\xaf\x36\xb4\xbb\x9a"
7867 "\x58\x09\x09\x1b\xc3\x65\x46\x46"
7868 "\x1d\xa7\x94\x18\x23\x50\x2c\xca"
7869 "\x2c\x55\x19\x97\x01\x9d\x93\x3b"
7870 "\x63\x86\xf2\x03\x67\x45\xd2\x72"
7871 "\x28\x52\x6c\xf4\xe3\x1c\xb5\x11"
7872 "\x13\xf1\xeb\x21\xc7\xd9\x56\x82"
7873 "\x2b\x82\x39\xbd\x69\x54\xed\x62"
7874 "\xc3\xe2\xde\x73\xd4\x6a\x12\xae"
7875 "\x13\x21\x7f\x4b\x5b\xfc\xbf\xe8"
7876 "\x2b\xbe\x56\xba\x68\x8b\x9a\xb1"
7877 "\x6e\xfa\xbf\x7e\x5a\x4b\xf1\xac"
7878 "\x98\x65\x85\xd1\x93\x53\xd3\x7b"
7879 "\x09\xdd\x4b\x10\x6d\x84\xb0\x13"
7880 "\x65\xbd\xcf\x52\x09\xc4\x85\xe2"
7881 "\x84\x74\x15\x65\xb7\xf7\x51\xaf"
7882 "\x55\xad\xa4\xd1\x22\x54\x70\x94"
7883 "\xa0\x1c\x90\x41\xfd\x99\xd7\x5a"
7884 "\x31\xef\xaa\x25\xd0\x7f\x4f\xea"
7885 "\x1d\x55\x42\xe5\x49\xb0\xd0\x46"
7886 "\x62\x36\x43\xb2\x82\x15\x75\x50"
7887 "\xa4\x72\xeb\x54\x27\x1f\x8a\xe4"
7888 "\x7d\xe9\x66\xc5\xf1\x53\xa4\xd1"
7889 "\x0c\xeb\xb8\xf8\xbc\xd4\xe2\xe7"
7890 "\xe1\xf8\x4b\xcb\xa9\xa1\xaf\x15"
7891 "\x83\xcb\x72\xd0\x33\x79\x00\x2d"
7892 "\x9f\xd7\xf1\x2e\x1e\x10\xe4\x45"
7893 "\xc0\x75\x3a\x39\xea\x68\xf7\x5d"
7894 "\x1b\x73\x8f\xe9\x8e\x0f\x72\x47"
7895 "\xae\x35\x0a\x31\x7a\x14\x4d\x4a"
7896 "\x6f\x47\xf7\x7e\x91\x6e\x74\x8b"
7897 "\x26\x47\xf9\xc3\xf9\xde\x70\xf5"
7898 "\x61\xab\xa9\x27\x9f\x82\xe4\x9c"
7899 "\x89\x91\x3f\x2e\x6a\xfd\xb5\x49"
7900 "\xe9\xfd\x59\x14\x36\x49\x40\x6d"
7901 "\x32\xd8\x85\x42\xf3\xa5\xdf\x0c"
7902 "\xa8\x27\xd7\x54\xe2\x63\x2f\xf2"
7903 "\x7e\x8b\x8b\xe7\xf1\x9a\x95\x35"
7904 "\x43\xdc\x3a\xe4\xb6\xf4\xd0\xdf"
7905 "\x9c\xcb\x94\xf3\x21\xa0\x77\x50"
7906 "\xe2\xc6\xc4\xc6\x5f\x09\x64\x5b"
7907 "\x92\x90\xd8\xe1\xd1\xed\x4b\x42"
7908 "\xd7\x37\xaf\x65\x3d\x11\x39\xb6"
7909 "\x24\x8a\x60\xae\xd6\x1e\xbf\x0e"
7910 "\x0d\xd7\xdc\x96\x0e\x65\x75\x4e"
7911 "\x29\x06\x9d\xa4\x51\x3a\x10\x63"
7912 "\x8f\x17\x07\xd5\x8e\x3c\xf4\x28"
7913 "\x00\x5a\x5b\x05\x19\xd8\xc0\x6c"
7914 "\xe5\x15\xe4\x9c\x9d\x71\x9d\x5e"
7915 "\x94\x29\x1a\xa7\x80\xfa\x0e\x33"
7916 "\x03\xdd\xb7\x3e\x9a\xa9\x26\x18"
7917 "\x37\xa9\x64\x08\x4d\x94\x5a\x88"
7918 "\xca\x35\xce\x81\x02\xe3\x1f\x1b"
7919 "\x89\x1a\x77\x85\xe3\x41\x6d\x32"
7920 "\x42\x19\x23\x7d\xc8\x73\xee\x25"
7921 "\x85\x0d\xf8\x31\x25\x79\x1b\x6f"
7922 "\x79\x25\xd2\xd8\xd4\x23\xfd\xf7"
7923 "\x82\x36\x6a\x0c\x46\x22\x15\xe9"
7924 "\xff\x72\x41\x91\x91\x7d\x3a\xb7"
7925 "\xdd\x65\x99\x70\xf6\x8d\x84\xf8"
7926 "\x67\x15\x20\x11\xd6\xb2\x55\x7b"
7927 "\xdb\x87\xee\xef\x55\x89\x2a\x59"
7928 "\x2b\x07\x8f\x43\x8a\x59\x3c\x01"
7929 "\x8b\x65\x54\xa1\x66\xd5\x38\xbd"
7930 "\xc6\x30\xa9\xcc\x49\xb6\xa8\x1b"
7931 "\xb8\xc0\x0e\xe3\x45\x28\xe2\xff"
7932 "\x41\x9f\x7e\x7c\xd1\xae\x9e\x25"
7933 "\x3f\x4c\x7c\x7c\xf4\xa8\x26\x4d"
7934 "\x5c\xfd\x4b\x27\x18\xf9\x61\x76"
7935 "\x48\xba\x0c\x6b\xa9\x4d\xfc\xf5"
7936 "\x3b\x35\x7e\x2f\x4a\xa9\xc2\x9a"
7937 "\xae\xab\x86\x09\x89\xc9\xc2\x40"
7938 "\x39\x2c\x81\xb3\xb8\x17\x67\xc2"
7939 "\x0d\x32\x4a\x3a\x67\x81\xd7\x1a"
7940 "\x34\x52\xc5\xdb\x0a\xf5\x63\x39"
7941 "\xea\x1f\xe1\x7c\xa1\x9e\xc1\x35"
7942 "\xe3\xb1\x18\x45\x67\xf9\x22\x38"
7943 "\x95\xd9\x34\x34\x86\xc6\x41\x94"
7944 "\x15\xf9\x5b\x41\xa6\x87\x8b\xf8"
7945 "\xd5\xe1\x1b\xe2\x5b\xf3\x86\x10"
7946 "\xff\xe6\xae\x69\x76\xbc\x0d\xb4"
7947 "\x09\x90\x0c\xa2\x65\x0c\xad\x74"
7948 "\xf5\xd7\xff\xda\xc1\xce\x85\xbe"
7949 "\x00\xa7\xff\x4d\x2f\x65\xd3\x8c"
7950 "\x86\x2d\x05\xe8\xed\x3e\x6b\x8b"
7951 "\x0f\x3d\x83\x8c\xf1\x1d\x5b\x96"
7952 "\x2e\xb1\x9c\xc2\x98\xe1\x70\xb9"
7953 "\xba\x5c\x8a\x43\xd6\x34\xa7\x2d"
7954 "\xc9\x92\xae\xf2\xa5\x7b\x05\x49"
7955 "\xa7\x33\x34\x86\xca\xe4\x96\x23"
7956 "\x76\x5b\xf2\xc6\xf1\x51\x28\x42"
7957 "\x7b\xcc\x76\x8f\xfa\xa2\xad\x31"
7958 "\xd4\xd6\x7a\x6d\x25\x25\x54\xe4"
7959 "\x3f\x50\x59\xe1\x5c\x05\xb7\x27"
7960 "\x48\xbf\x07\xec\x1b\x13\xbe\x2b"
7961 "\xa1\x57\x2b\xd5\xab\xd7\xd0\x4c"
7962 "\x1e\xcb\x71\x9b\xc5\x90\x85\xd3"
7963 "\xde\x59\xec\x71\xeb\x89\xbb\xd0"
7964 "\x09\x50\xe1\x16\x3f\xfd\x1c\x34"
7965 "\xc3\x1c\xa1\x10\x77\x53\x98\xef"
7966 "\xf2\xfd\xa5\x01\x59\xc2\x9b\x26"
7967 "\xc7\x42\xd9\x49\xda\x58\x2b\x6e"
7968 "\x9f\x53\x19\x76\x7e\xd9\xc9\x0e"
7969 "\x68\xc8\x7f\x51\x22\x42\xef\x49"
7970 "\xa4\x55\xb6\x36\xac\x09\xc7\x31"
7971 "\x88\x15\x4b\x2e\x8f\x3a\x08\xf7"
7972 "\xd8\xf7\xa8\xc5\xa9\x33\xa6\x45"
7973 "\xe4\xc4\x94\x76\xf3\x0d\x8f\x7e"
7974 "\xc8\xf6\xbc\x23\x0a\xb6\x4c\xd3"
7975 "\x6a\xcd\x36\xc2\x90\x5c\x5c\x3c"
7976 "\x65\x7b\xc2\xd6\xcc\xe6\x0d\x87"
7977 "\x73\x2e\x71\x79\x16\x06\x63\x28"
7978 "\x09\x15\xd8\x89\x38\x38\x3d\xb5"
7979 "\x42\x1c\x08\x24\xf7\x2a\xd2\x9d"
7980 "\xc8\xca\xef\xf9\x27\xd8\x07\x86"
7981 "\xf7\x43\x0b\x55\x15\x3f\x9f\x83"
7982 "\xef\xdc\x49\x9d\x2a\xc1\x54\x62"
7983 "\xbd\x9b\x66\x55\x9f\xb7\x12\xf3"
7984 "\x1b\x4d\x9d\x2a\x5c\xed\x87\x75"
7985 "\x87\x26\xec\x61\x2c\xb4\x0f\x89"
7986 "\xb0\xfb\x2e\x68\x5d\x15\xc7\x8d"
7987 "\x2e\xc0\xd9\xec\xaf\x4f\xd2\x25"
7988 "\x29\xe8\xd2\x26\x2b\x67\xe9\xfc"
7989 "\x2b\xa8\x67\x96\x12\x1f\x5b\x96"
7990 "\xc6\x14\x53\xaf\x44\xea\xd6\xe2"
7991 "\x94\x98\xe4\x12\x93\x4c\x92\xe0"
7992 "\x18\xa5\x8d\x2d\xe4\x71\x3c\x47"
7993 "\x4c\xf7\xe6\x47\x9e\xc0\x68\xdf"
7994 "\xd4\xf5\x5a\x74\xb1\x2b\x29\x03"
7995 "\x19\x07\xaf\x90\x62\x5c\x68\x98"
7996 "\x48\x16\x11\x02\x9d\xee\xb4\x9b"
7997 "\xe5\x42\x7f\x08\xfd\x16\x32\x0b"
7998 "\xd0\xb3\xfa\x2b\xb7\x99\xf9\x29"
7999 "\xcd\x20\x45\x9f\xb3\x1a\x5d\xa2"
8000 "\xaf\x4d\xe0\xbd\x42\x0d\xbc\x74"
8001 "\x99\x9c\x8e\x53\x1a\xb4\x3e\xbd"
8002 "\xa2\x9a\x2d\xf7\xf8\x39\x0f\x67"
8003 "\x63\xfc\x6b\xc0\xaf\xb3\x4b\x4f"
8004 "\x55\xc4\xcf\xa7\xc8\x04\x11\x3e"
8005 "\x14\x32\xbb\x1b\x38\x77\xd6\x7f"
8006 "\x54\x4c\xdf\x75\xf3\x07\x2d\x33"
8007 "\x9b\xa8\x20\xe1\x7b\x12\xb5\xf3"
8008 "\xef\x2f\xce\x72\xe5\x24\x60\xc1"
8009 "\x30\xe2\xab\xa1\x8e\x11\x09\xa8"
8010 "\x21\x33\x44\xfe\x7f\x35\x32\x93"
8011 "\x39\xa7\xad\x8b\x79\x06\xb2\xcb"
8012 "\x4e\xa9\x5f\xc7\xba\x74\x29\xec"
8013 "\x93\xa0\x4e\x54\x93\xc0\xbc\x55"
8014 "\x64\xf0\x48\xe5\x57\x99\xee\x75"
8015 "\xd6\x79\x0f\x66\xb7\xc6\x57\x76"
8016 "\xf7\xb7\xf3\x9c\xc5\x60\xe8\x7f"
8017 "\x83\x76\xd6\x0e\xaa\xe6\x90\x39"
8018 "\x1d\xa6\x32\x6a\x34\xe3\x55\xf8"
8019 "\x58\xa0\x58\x7d\x33\xe0\x22\x39"
8020 "\x44\x64\x87\x86\x5a\x2f\xa7\x7e"
8021 "\x0f\x38\xea\xb0\x30\xcc\x61\xa5"
8022 "\x6a\x32\xae\x1e\xf7\xe9\xd0\xa9"
8023 "\x0c\x32\x4b\xb5\x49\x28\xab\x85"
8024 "\x2f\x8e\x01\x36\x38\x52\xd0\xba"
8025 "\xd6\x02\x78\xf8\x0e\x3e\x9c\x8b"
8026 "\x6b\x45\x99\x3f\x5c\xfe\x58\xf1"
8027 "\x5c\x94\x04\xe1\xf5\x18\x6d\x51"
8028 "\xb2\x5d\x18\x20\xb6\xc2\x9a\x42"
8029 "\x1d\xb3\xab\x3c\xb6\x3a\x13\x03"
8030 "\xb2\x46\x82\x4f\xfc\x64\xbc\x4f"
8031 "\xca\xfa\x9c\xc0\xd5\xa7\xbd\x11"
8032 "\xb7\xe4\x5a\xf6\x6f\x4d\x4d\x54"
8033 "\xea\xa4\x98\x66\xd4\x22\x3b\xd3"
8034 "\x8f\x34\x47\xd9\x7c\xf4\x72\x3b"
8035 "\x4d\x02\x77\xf6\xd6\xdd\x08\x0a"
8036 "\x81\xe1\x86\x89\x3e\x56\x10\x3c"
8037 "\xba\xd7\x81\x8c\x08\xbc\x8b\xe2"
8038 "\x53\xec\xa7\x89\xee\xc8\x56\xb5"
8039 "\x36\x2c\xb2\x03\xba\x99\xdd\x7c"
8040 "\x48\xa0\xb0\xbc\x91\x33\xe9\xa8"
8041 "\xcb\xcd\xcf\x59\x5f\x1f\x15\xe2"
8042 "\x56\xf5\x4e\x01\x35\x27\x45\x77"
8043 "\x47\xc8\xbc\xcb\x7e\x39\xc1\x97"
8044 "\x28\xd3\x84\xfc\x2c\x3e\xc8\xad"
8045 "\x9c\xf8\x8a\x61\x9c\x28\xaa\xc5"
8046 "\x99\x20\x43\x85\x9d\xa5\xe2\x8b"
8047 "\xb8\xae\xeb\xd0\x32\x0d\x52\x78"
8048 "\x09\x56\x3f\xc7\xd8\x7e\x26\xfc"
8049 "\x37\xfb\x6f\x04\xfc\xfa\x92\x10"
8050 "\xac\xf8\x3e\x21\xdc\x8c\x21\x16"
8051 "\x7d\x67\x6e\xf6\xcd\xda\xb6\x98"
8052 "\x23\xab\x23\x3c\xb2\x10\xa0\x53"
8053 "\x5a\x56\x9f\xc5\xd0\xff\xbb\xe4"
8054 "\x98\x3c\x69\x1e\xdb\x38\x8f\x7e"
8055 "\x0f\xd2\x98\x88\x81\x8b\x45\x67"
8056 "\xea\x33\xf1\xeb\xe9\x97\x55\x2e"
8057 "\xd9\xaa\xeb\x5a\xec\xda\xe1\x68"
8058 "\xa8\x9d\x3c\x84\x7c\x05\x3d\x62"
8059 "\x87\x8f\x03\x21\x28\x95\x0c\x89"
8060 "\x25\x22\x4a\xb0\x93\xa9\x50\xa2"
8061 "\x2f\x57\x6e\x18\x42\x19\x54\x0c"
8062 "\x55\x67\xc6\x11\x49\xf4\x5c\xd2"
8063 "\xe9\x3d\xdd\x8b\x48\x71\x21\x00"
8064 "\xc3\x9a\x6c\x85\x74\x28\x83\x4a"
8065 "\x1b\x31\x05\xe1\x06\x92\xe7\xda"
8066 "\x85\x73\x78\x45\x20\x7f\xae\x13"
8067 "\x7c\x33\x06\x22\xf4\x83\xf9\x35"
8068 "\x3f\x6c\x71\xa8\x4e\x48\xbe\x9b"
8069 "\xce\x8a\xba\xda\xbe\x28\x08\xf7"
8070 "\xe2\x14\x8c\x71\xea\x72\xf9\x33"
8071 "\xf2\x88\x3f\xd7\xbb\x69\x6c\x29"
8072 "\x19\xdc\x84\xce\x1f\x12\x4f\xc8"
8073 "\xaf\xa5\x04\xba\x5a\xab\xb0\xd9"
8074 "\x14\x1f\x6c\x68\x98\x39\x89\x7a"
8075 "\xd9\xd8\x2f\xdf\xa8\x47\x4a\x25"
8076 "\xe2\xfb\x33\xf4\x59\x78\xe1\x68"
8077 "\x85\xcf\xfe\x59\x20\xd4\x05\x1d"
8078 "\x80\x99\xae\xbc\xca\xae\x0f\x2f"
8079 "\x65\x43\x34\x8e\x7e\xac\xd3\x93"
8080 "\x2f\xac\x6d\x14\x3d\x02\x07\x70"
8081 "\x9d\xa4\xf3\x1b\x5c\x36\xfc\x01"
8082 "\x73\x34\x85\x0c\x6c\xd6\xf1\xbd"
8083 "\x3f\xdf\xee\xf5\xd9\xba\x56\xef"
8084 "\xf4\x9b\x6b\xee\x9f\x5a\x78\x6d"
8085 "\x32\x19\xf4\xf7\xf8\x4c\x69\x0b"
8086 "\x4b\xbc\xbb\xb7\xf2\x85\xaf\x70"
8087 "\x75\x24\x6c\x54\xa7\x0e\x4d\x1d"
8088 "\x01\xbf\x08\xac\xcf\x7f\x2c\xe3"
8089 "\x14\x89\x5e\x70\x5a\x99\x92\xcd"
8090 "\x01\x84\xc8\xd2\xab\xe5\x4f\x58"
8091 "\xe7\x0f\x2f\x0e\xff\x68\xea\xfd"
8092 "\x15\xb3\x17\xe6\xb0\xe7\x85\xd8"
8093 "\x23\x2e\x05\xc7\xc9\xc4\x46\x1f"
8094 "\xe1\x9e\x49\x20\x23\x24\x4d\x7e"
8095 "\x29\x65\xff\xf4\xb6\xfd\x1a\x85"
8096 "\xc4\x16\xec\xfc\xea\x7b\xd6\x2c"
8097 "\x43\xf8\xb7\xbf\x79\xc0\x85\xcd"
8098 "\xef\xe1\x98\xd3\xa5\xf7\x90\x8c"
8099 "\xe9\x7f\x80\x6b\xd2\xac\x4c\x30"
8100 "\xa7\xc6\x61\x6c\xd2\xf9\x2c\xff"
8101 "\x30\xbc\x22\x81\x7d\x93\x12\xe4"
8102 "\x0a\xcd\xaf\xdd\xe8\xab\x0a\x1e"
8103 "\x13\xa4\x27\xc3\x5f\xf7\x4b\xbb"
8104 "\x37\x09\x4b\x91\x6f\x92\x4f\xaf"
8105 "\x52\xee\xdf\xef\x09\x6f\xf7\x5c"
8106 "\x6e\x12\x17\x72\x63\x57\xc7\xba"
8107 "\x3b\x6b\x38\x32\x73\x1b\x9c\x80"
8108 "\xc1\x7a\xc6\xcf\xcd\x35\xc0\x6b"
8109 "\x31\x1a\x6b\xe9\xd8\x2c\x29\x3f"
8110 "\x96\xfb\xb6\xcd\x13\x91\x3b\xc2"
8111 "\xd2\xa3\x31\x8d\xa4\xcd\x57\xcd"
8112 "\x13\x3d\x64\xfd\x06\xce\xe6\xdc"
8113 "\x0c\x24\x43\x31\x40\x57\xf1\x72"
8114 "\x17\xe3\x3a\x63\x6d\x35\xcf\x5d"
8115 "\x97\x40\x59\xdd\xf7\x3c\x02\xf7"
8116 "\x1c\x7e\x05\xbb\xa9\x0d\x01\xb1"
8117 "\x8e\xc0\x30\xa9\x53\x24\xc9\x89"
8118 "\x84\x6d\xaa\xd0\xcd\x91\xc2\x4d"
8119 "\x91\xb0\x89\xe2\xbf\x83\x44\xaa"
8120 "\x28\x72\x23\xa0\xc2\xad\xad\x1c"
8121 "\xfc\x3f\x09\x7a\x0b\xdc\xc5\x1b"
8122 "\x87\x13\xc6\x5b\x59\x8d\xf2\xc8"
8123 "\xaf\xdf\x11\x95",
8124 .rlen = 4100,
8125 .np = 2,
8126 .tap = { 4064, 36 },
8127 },
8128};
8129
8130/*
8131 * CTS (Cipher Text Stealing) mode tests
8132 */
8133#define CTS_MODE_ENC_TEST_VECTORS 6
8134#define CTS_MODE_DEC_TEST_VECTORS 6
8135static struct cipher_testvec cts_mode_enc_tv_template[] = {
8136 { /* from rfc3962 */
8137 .klen = 16,
8138 .key = "\x63\x68\x69\x63\x6b\x65\x6e\x20"
8139 "\x74\x65\x72\x69\x79\x61\x6b\x69",
8140 .ilen = 17,
8141 .input = "\x49\x20\x77\x6f\x75\x6c\x64\x20"
8142 "\x6c\x69\x6b\x65\x20\x74\x68\x65"
8143 "\x20",
8144 .rlen = 17,
8145 .result = "\xc6\x35\x35\x68\xf2\xbf\x8c\xb4"
8146 "\xd8\xa5\x80\x36\x2d\xa7\xff\x7f"
8147 "\x97",
8148 }, {
8149 .klen = 16,
8150 .key = "\x63\x68\x69\x63\x6b\x65\x6e\x20"
8151 "\x74\x65\x72\x69\x79\x61\x6b\x69",
8152 .ilen = 31,
8153 .input = "\x49\x20\x77\x6f\x75\x6c\x64\x20"
8154 "\x6c\x69\x6b\x65\x20\x74\x68\x65"
8155 "\x20\x47\x65\x6e\x65\x72\x61\x6c"
8156 "\x20\x47\x61\x75\x27\x73\x20",
8157 .rlen = 31,
8158 .result = "\xfc\x00\x78\x3e\x0e\xfd\xb2\xc1"
8159 "\xd4\x45\xd4\xc8\xef\xf7\xed\x22"
8160 "\x97\x68\x72\x68\xd6\xec\xcc\xc0"
8161 "\xc0\x7b\x25\xe2\x5e\xcf\xe5",
8162 }, {
8163 .klen = 16,
8164 .key = "\x63\x68\x69\x63\x6b\x65\x6e\x20"
8165 "\x74\x65\x72\x69\x79\x61\x6b\x69",
8166 .ilen = 32,
8167 .input = "\x49\x20\x77\x6f\x75\x6c\x64\x20"
8168 "\x6c\x69\x6b\x65\x20\x74\x68\x65"
8169 "\x20\x47\x65\x6e\x65\x72\x61\x6c"
8170 "\x20\x47\x61\x75\x27\x73\x20\x43",
8171 .rlen = 32,
8172 .result = "\x39\x31\x25\x23\xa7\x86\x62\xd5"
8173 "\xbe\x7f\xcb\xcc\x98\xeb\xf5\xa8"
8174 "\x97\x68\x72\x68\xd6\xec\xcc\xc0"
8175 "\xc0\x7b\x25\xe2\x5e\xcf\xe5\x84",
8176 }, {
8177 .klen = 16,
8178 .key = "\x63\x68\x69\x63\x6b\x65\x6e\x20"
8179 "\x74\x65\x72\x69\x79\x61\x6b\x69",
8180 .ilen = 47,
8181 .input = "\x49\x20\x77\x6f\x75\x6c\x64\x20"
8182 "\x6c\x69\x6b\x65\x20\x74\x68\x65"
8183 "\x20\x47\x65\x6e\x65\x72\x61\x6c"
8184 "\x20\x47\x61\x75\x27\x73\x20\x43"
8185 "\x68\x69\x63\x6b\x65\x6e\x2c\x20"
8186 "\x70\x6c\x65\x61\x73\x65\x2c",
8187 .rlen = 47,
8188 .result = "\x97\x68\x72\x68\xd6\xec\xcc\xc0"
8189 "\xc0\x7b\x25\xe2\x5e\xcf\xe5\x84"
8190 "\xb3\xff\xfd\x94\x0c\x16\xa1\x8c"
8191 "\x1b\x55\x49\xd2\xf8\x38\x02\x9e"
8192 "\x39\x31\x25\x23\xa7\x86\x62\xd5"
8193 "\xbe\x7f\xcb\xcc\x98\xeb\xf5",
8194 }, {
8195 .klen = 16,
8196 .key = "\x63\x68\x69\x63\x6b\x65\x6e\x20"
8197 "\x74\x65\x72\x69\x79\x61\x6b\x69",
8198 .ilen = 48,
8199 .input = "\x49\x20\x77\x6f\x75\x6c\x64\x20"
8200 "\x6c\x69\x6b\x65\x20\x74\x68\x65"
8201 "\x20\x47\x65\x6e\x65\x72\x61\x6c"
8202 "\x20\x47\x61\x75\x27\x73\x20\x43"
8203 "\x68\x69\x63\x6b\x65\x6e\x2c\x20"
8204 "\x70\x6c\x65\x61\x73\x65\x2c\x20",
8205 .rlen = 48,
8206 .result = "\x97\x68\x72\x68\xd6\xec\xcc\xc0"
8207 "\xc0\x7b\x25\xe2\x5e\xcf\xe5\x84"
8208 "\x9d\xad\x8b\xbb\x96\xc4\xcd\xc0"
8209 "\x3b\xc1\x03\xe1\xa1\x94\xbb\xd8"
8210 "\x39\x31\x25\x23\xa7\x86\x62\xd5"
8211 "\xbe\x7f\xcb\xcc\x98\xeb\xf5\xa8",
8212 }, {
8213 .klen = 16,
8214 .key = "\x63\x68\x69\x63\x6b\x65\x6e\x20"
8215 "\x74\x65\x72\x69\x79\x61\x6b\x69",
8216 .ilen = 64,
8217 .input = "\x49\x20\x77\x6f\x75\x6c\x64\x20"
8218 "\x6c\x69\x6b\x65\x20\x74\x68\x65"
8219 "\x20\x47\x65\x6e\x65\x72\x61\x6c"
8220 "\x20\x47\x61\x75\x27\x73\x20\x43"
8221 "\x68\x69\x63\x6b\x65\x6e\x2c\x20"
8222 "\x70\x6c\x65\x61\x73\x65\x2c\x20"
8223 "\x61\x6e\x64\x20\x77\x6f\x6e\x74"
8224 "\x6f\x6e\x20\x73\x6f\x75\x70\x2e",
8225 .rlen = 64,
8226 .result = "\x97\x68\x72\x68\xd6\xec\xcc\xc0"
8227 "\xc0\x7b\x25\xe2\x5e\xcf\xe5\x84"
8228 "\x39\x31\x25\x23\xa7\x86\x62\xd5"
8229 "\xbe\x7f\xcb\xcc\x98\xeb\xf5\xa8"
8230 "\x48\x07\xef\xe8\x36\xee\x89\xa5"
8231 "\x26\x73\x0d\xbc\x2f\x7b\xc8\x40"
8232 "\x9d\xad\x8b\xbb\x96\xc4\xcd\xc0"
8233 "\x3b\xc1\x03\xe1\xa1\x94\xbb\xd8",
8234 }
8235};
8236
8237static struct cipher_testvec cts_mode_dec_tv_template[] = {
8238 { /* from rfc3962 */
8239 .klen = 16,
8240 .key = "\x63\x68\x69\x63\x6b\x65\x6e\x20"
8241 "\x74\x65\x72\x69\x79\x61\x6b\x69",
8242 .rlen = 17,
8243 .result = "\x49\x20\x77\x6f\x75\x6c\x64\x20"
8244 "\x6c\x69\x6b\x65\x20\x74\x68\x65"
8245 "\x20",
8246 .ilen = 17,
8247 .input = "\xc6\x35\x35\x68\xf2\xbf\x8c\xb4"
8248 "\xd8\xa5\x80\x36\x2d\xa7\xff\x7f"
8249 "\x97",
8250 }, {
8251 .klen = 16,
8252 .key = "\x63\x68\x69\x63\x6b\x65\x6e\x20"
8253 "\x74\x65\x72\x69\x79\x61\x6b\x69",
8254 .rlen = 31,
8255 .result = "\x49\x20\x77\x6f\x75\x6c\x64\x20"
8256 "\x6c\x69\x6b\x65\x20\x74\x68\x65"
8257 "\x20\x47\x65\x6e\x65\x72\x61\x6c"
8258 "\x20\x47\x61\x75\x27\x73\x20",
8259 .ilen = 31,
8260 .input = "\xfc\x00\x78\x3e\x0e\xfd\xb2\xc1"
8261 "\xd4\x45\xd4\xc8\xef\xf7\xed\x22"
8262 "\x97\x68\x72\x68\xd6\xec\xcc\xc0"
8263 "\xc0\x7b\x25\xe2\x5e\xcf\xe5",
8264 }, {
8265 .klen = 16,
8266 .key = "\x63\x68\x69\x63\x6b\x65\x6e\x20"
8267 "\x74\x65\x72\x69\x79\x61\x6b\x69",
8268 .rlen = 32,
8269 .result = "\x49\x20\x77\x6f\x75\x6c\x64\x20"
8270 "\x6c\x69\x6b\x65\x20\x74\x68\x65"
8271 "\x20\x47\x65\x6e\x65\x72\x61\x6c"
8272 "\x20\x47\x61\x75\x27\x73\x20\x43",
8273 .ilen = 32,
8274 .input = "\x39\x31\x25\x23\xa7\x86\x62\xd5"
8275 "\xbe\x7f\xcb\xcc\x98\xeb\xf5\xa8"
8276 "\x97\x68\x72\x68\xd6\xec\xcc\xc0"
8277 "\xc0\x7b\x25\xe2\x5e\xcf\xe5\x84",
8278 }, {
8279 .klen = 16,
8280 .key = "\x63\x68\x69\x63\x6b\x65\x6e\x20"
8281 "\x74\x65\x72\x69\x79\x61\x6b\x69",
8282 .rlen = 47,
8283 .result = "\x49\x20\x77\x6f\x75\x6c\x64\x20"
8284 "\x6c\x69\x6b\x65\x20\x74\x68\x65"
8285 "\x20\x47\x65\x6e\x65\x72\x61\x6c"
8286 "\x20\x47\x61\x75\x27\x73\x20\x43"
8287 "\x68\x69\x63\x6b\x65\x6e\x2c\x20"
8288 "\x70\x6c\x65\x61\x73\x65\x2c",
8289 .ilen = 47,
8290 .input = "\x97\x68\x72\x68\xd6\xec\xcc\xc0"
8291 "\xc0\x7b\x25\xe2\x5e\xcf\xe5\x84"
8292 "\xb3\xff\xfd\x94\x0c\x16\xa1\x8c"
8293 "\x1b\x55\x49\xd2\xf8\x38\x02\x9e"
8294 "\x39\x31\x25\x23\xa7\x86\x62\xd5"
8295 "\xbe\x7f\xcb\xcc\x98\xeb\xf5",
8296 }, {
8297 .klen = 16,
8298 .key = "\x63\x68\x69\x63\x6b\x65\x6e\x20"
8299 "\x74\x65\x72\x69\x79\x61\x6b\x69",
8300 .rlen = 48,
8301 .result = "\x49\x20\x77\x6f\x75\x6c\x64\x20"
8302 "\x6c\x69\x6b\x65\x20\x74\x68\x65"
8303 "\x20\x47\x65\x6e\x65\x72\x61\x6c"
8304 "\x20\x47\x61\x75\x27\x73\x20\x43"
8305 "\x68\x69\x63\x6b\x65\x6e\x2c\x20"
8306 "\x70\x6c\x65\x61\x73\x65\x2c\x20",
8307 .ilen = 48,
8308 .input = "\x97\x68\x72\x68\xd6\xec\xcc\xc0"
8309 "\xc0\x7b\x25\xe2\x5e\xcf\xe5\x84"
8310 "\x9d\xad\x8b\xbb\x96\xc4\xcd\xc0"
8311 "\x3b\xc1\x03\xe1\xa1\x94\xbb\xd8"
8312 "\x39\x31\x25\x23\xa7\x86\x62\xd5"
8313 "\xbe\x7f\xcb\xcc\x98\xeb\xf5\xa8",
8314 }, {
8315 .klen = 16,
8316 .key = "\x63\x68\x69\x63\x6b\x65\x6e\x20"
8317 "\x74\x65\x72\x69\x79\x61\x6b\x69",
8318 .rlen = 64,
8319 .result = "\x49\x20\x77\x6f\x75\x6c\x64\x20"
8320 "\x6c\x69\x6b\x65\x20\x74\x68\x65"
8321 "\x20\x47\x65\x6e\x65\x72\x61\x6c"
8322 "\x20\x47\x61\x75\x27\x73\x20\x43"
8323 "\x68\x69\x63\x6b\x65\x6e\x2c\x20"
8324 "\x70\x6c\x65\x61\x73\x65\x2c\x20"
8325 "\x61\x6e\x64\x20\x77\x6f\x6e\x74"
8326 "\x6f\x6e\x20\x73\x6f\x75\x70\x2e",
8327 .ilen = 64,
8328 .input = "\x97\x68\x72\x68\xd6\xec\xcc\xc0"
8329 "\xc0\x7b\x25\xe2\x5e\xcf\xe5\x84"
8330 "\x39\x31\x25\x23\xa7\x86\x62\xd5"
8331 "\xbe\x7f\xcb\xcc\x98\xeb\xf5\xa8"
8332 "\x48\x07\xef\xe8\x36\xee\x89\xa5"
8333 "\x26\x73\x0d\xbc\x2f\x7b\xc8\x40"
8334 "\x9d\xad\x8b\xbb\x96\xc4\xcd\xc0"
8335 "\x3b\xc1\x03\xe1\xa1\x94\xbb\xd8",
8336 }
8337};
8338
8339/*
8340 * Compression stuff.
8341 */
8342#define COMP_BUF_SIZE 512
8343
8344struct comp_testvec {
8345 int inlen, outlen;
8346 char input[COMP_BUF_SIZE];
8347 char output[COMP_BUF_SIZE];
8348};
8349
8350/*
8351 * Deflate test vectors (null-terminated strings).
8352 * Params: winbits=11, Z_DEFAULT_COMPRESSION, MAX_MEM_LEVEL.
8353 */
8354#define DEFLATE_COMP_TEST_VECTORS 2
8355#define DEFLATE_DECOMP_TEST_VECTORS 2
8356
8357static struct comp_testvec deflate_comp_tv_template[] = {
8358 {
8359 .inlen = 70,
8360 .outlen = 38,
8361 .input = "Join us now and share the software "
8362 "Join us now and share the software ",
8363 .output = "\xf3\xca\xcf\xcc\x53\x28\x2d\x56"
8364 "\xc8\xcb\x2f\x57\x48\xcc\x4b\x51"
8365 "\x28\xce\x48\x2c\x4a\x55\x28\xc9"
8366 "\x48\x55\x28\xce\x4f\x2b\x29\x07"
8367 "\x71\xbc\x08\x2b\x01\x00",
8368 }, {
8369 .inlen = 191,
8370 .outlen = 122,
8371 .input = "This document describes a compression method based on the DEFLATE"
8372 "compression algorithm. This document defines the application of "
8373 "the DEFLATE algorithm to the IP Payload Compression Protocol.",
8374 .output = "\x5d\x8d\x31\x0e\xc2\x30\x10\x04"
8375 "\xbf\xb2\x2f\xc8\x1f\x10\x04\x09"
8376 "\x89\xc2\x85\x3f\x70\xb1\x2f\xf8"
8377 "\x24\xdb\x67\xd9\x47\xc1\xef\x49"
8378 "\x68\x12\x51\xae\x76\x67\xd6\x27"
8379 "\x19\x88\x1a\xde\x85\xab\x21\xf2"
8380 "\x08\x5d\x16\x1e\x20\x04\x2d\xad"
8381 "\xf3\x18\xa2\x15\x85\x2d\x69\xc4"
8382 "\x42\x83\x23\xb6\x6c\x89\x71\x9b"
8383 "\xef\xcf\x8b\x9f\xcf\x33\xca\x2f"
8384 "\xed\x62\xa9\x4c\x80\xff\x13\xaf"
8385 "\x52\x37\xed\x0e\x52\x6b\x59\x02"
8386 "\xd9\x4e\xe8\x7a\x76\x1d\x02\x98"
8387 "\xfe\x8a\x87\x83\xa3\x4f\x56\x8a"
8388 "\xb8\x9e\x8e\x5c\x57\xd3\xa0\x79"
8389 "\xfa\x02",
8390 },
8391};
8392
8393static struct comp_testvec deflate_decomp_tv_template[] = {
8394 {
8395 .inlen = 122,
8396 .outlen = 191,
8397 .input = "\x5d\x8d\x31\x0e\xc2\x30\x10\x04"
8398 "\xbf\xb2\x2f\xc8\x1f\x10\x04\x09"
8399 "\x89\xc2\x85\x3f\x70\xb1\x2f\xf8"
8400 "\x24\xdb\x67\xd9\x47\xc1\xef\x49"
8401 "\x68\x12\x51\xae\x76\x67\xd6\x27"
8402 "\x19\x88\x1a\xde\x85\xab\x21\xf2"
8403 "\x08\x5d\x16\x1e\x20\x04\x2d\xad"
8404 "\xf3\x18\xa2\x15\x85\x2d\x69\xc4"
8405 "\x42\x83\x23\xb6\x6c\x89\x71\x9b"
8406 "\xef\xcf\x8b\x9f\xcf\x33\xca\x2f"
8407 "\xed\x62\xa9\x4c\x80\xff\x13\xaf"
8408 "\x52\x37\xed\x0e\x52\x6b\x59\x02"
8409 "\xd9\x4e\xe8\x7a\x76\x1d\x02\x98"
8410 "\xfe\x8a\x87\x83\xa3\x4f\x56\x8a"
8411 "\xb8\x9e\x8e\x5c\x57\xd3\xa0\x79"
8412 "\xfa\x02",
8413 .output = "This document describes a compression method based on the DEFLATE"
8414 "compression algorithm. This document defines the application of "
8415 "the DEFLATE algorithm to the IP Payload Compression Protocol.",
8416 }, {
8417 .inlen = 38,
8418 .outlen = 70,
8419 .input = "\xf3\xca\xcf\xcc\x53\x28\x2d\x56"
8420 "\xc8\xcb\x2f\x57\x48\xcc\x4b\x51"
8421 "\x28\xce\x48\x2c\x4a\x55\x28\xc9"
8422 "\x48\x55\x28\xce\x4f\x2b\x29\x07"
8423 "\x71\xbc\x08\x2b\x01\x00",
8424 .output = "Join us now and share the software "
8425 "Join us now and share the software ",
8426 },
8427};
8428
8429/*
8430 * LZO test vectors (null-terminated strings).
8431 */
8432#define LZO_COMP_TEST_VECTORS 2
8433#define LZO_DECOMP_TEST_VECTORS 2
8434
8435static struct comp_testvec lzo_comp_tv_template[] = {
8436 {
8437 .inlen = 70,
8438 .outlen = 46,
8439 .input = "Join us now and share the software "
8440 "Join us now and share the software ",
8441 .output = "\x00\x0d\x4a\x6f\x69\x6e\x20\x75"
8442 "\x73\x20\x6e\x6f\x77\x20\x61\x6e"
8443 "\x64\x20\x73\x68\x61\x72\x65\x20"
8444 "\x74\x68\x65\x20\x73\x6f\x66\x74"
8445 "\x77\x70\x01\x01\x4a\x6f\x69\x6e"
8446 "\x3d\x88\x00\x11\x00\x00",
8447 }, {
8448 .inlen = 159,
8449 .outlen = 133,
8450 .input = "This document describes a compression method based on the LZO "
8451 "compression algorithm. This document defines the application of "
8452 "the LZO algorithm used in UBIFS.",
8453 .output = "\x00\x2b\x54\x68\x69\x73\x20\x64"
8454 "\x6f\x63\x75\x6d\x65\x6e\x74\x20"
8455 "\x64\x65\x73\x63\x72\x69\x62\x65"
8456 "\x73\x20\x61\x20\x63\x6f\x6d\x70"
8457 "\x72\x65\x73\x73\x69\x6f\x6e\x20"
8458 "\x6d\x65\x74\x68\x6f\x64\x20\x62"
8459 "\x61\x73\x65\x64\x20\x6f\x6e\x20"
8460 "\x74\x68\x65\x20\x4c\x5a\x4f\x2b"
8461 "\x8c\x00\x0d\x61\x6c\x67\x6f\x72"
8462 "\x69\x74\x68\x6d\x2e\x20\x20\x54"
8463 "\x68\x69\x73\x2a\x54\x01\x02\x66"
8464 "\x69\x6e\x65\x73\x94\x06\x05\x61"
8465 "\x70\x70\x6c\x69\x63\x61\x74\x76"
8466 "\x0a\x6f\x66\x88\x02\x60\x09\x27"
8467 "\xf0\x00\x0c\x20\x75\x73\x65\x64"
8468 "\x20\x69\x6e\x20\x55\x42\x49\x46"
8469 "\x53\x2e\x11\x00\x00",
8470 },
8471};
8472
8473static struct comp_testvec lzo_decomp_tv_template[] = {
8474 {
8475 .inlen = 133,
8476 .outlen = 159,
8477 .input = "\x00\x2b\x54\x68\x69\x73\x20\x64"
8478 "\x6f\x63\x75\x6d\x65\x6e\x74\x20"
8479 "\x64\x65\x73\x63\x72\x69\x62\x65"
8480 "\x73\x20\x61\x20\x63\x6f\x6d\x70"
8481 "\x72\x65\x73\x73\x69\x6f\x6e\x20"
8482 "\x6d\x65\x74\x68\x6f\x64\x20\x62"
8483 "\x61\x73\x65\x64\x20\x6f\x6e\x20"
8484 "\x74\x68\x65\x20\x4c\x5a\x4f\x2b"
8485 "\x8c\x00\x0d\x61\x6c\x67\x6f\x72"
8486 "\x69\x74\x68\x6d\x2e\x20\x20\x54"
8487 "\x68\x69\x73\x2a\x54\x01\x02\x66"
8488 "\x69\x6e\x65\x73\x94\x06\x05\x61"
8489 "\x70\x70\x6c\x69\x63\x61\x74\x76"
8490 "\x0a\x6f\x66\x88\x02\x60\x09\x27"
8491 "\xf0\x00\x0c\x20\x75\x73\x65\x64"
8492 "\x20\x69\x6e\x20\x55\x42\x49\x46"
8493 "\x53\x2e\x11\x00\x00",
8494 .output = "This document describes a compression method based on the LZO "
8495 "compression algorithm. This document defines the application of "
8496 "the LZO algorithm used in UBIFS.",
8497 }, {
8498 .inlen = 46,
8499 .outlen = 70,
8500 .input = "\x00\x0d\x4a\x6f\x69\x6e\x20\x75"
8501 "\x73\x20\x6e\x6f\x77\x20\x61\x6e"
8502 "\x64\x20\x73\x68\x61\x72\x65\x20"
8503 "\x74\x68\x65\x20\x73\x6f\x66\x74"
8504 "\x77\x70\x01\x01\x4a\x6f\x69\x6e"
8505 "\x3d\x88\x00\x11\x00\x00",
8506 .output = "Join us now and share the software "
8507 "Join us now and share the software ",
8508 },
8509};
8510
8511/*
8512 * Michael MIC test vectors from IEEE 802.11i
8513 */
8514#define MICHAEL_MIC_TEST_VECTORS 6
8515
8516static struct hash_testvec michael_mic_tv_template[] = {
8517 {
8518 .key = "\x00\x00\x00\x00\x00\x00\x00\x00",
8519 .ksize = 8,
8520 .plaintext = zeroed_string,
8521 .psize = 0,
8522 .digest = "\x82\x92\x5c\x1c\xa1\xd1\x30\xb8",
8523 },
8524 {
8525 .key = "\x82\x92\x5c\x1c\xa1\xd1\x30\xb8",
8526 .ksize = 8,
8527 .plaintext = "M",
8528 .psize = 1,
8529 .digest = "\x43\x47\x21\xca\x40\x63\x9b\x3f",
8530 },
8531 {
8532 .key = "\x43\x47\x21\xca\x40\x63\x9b\x3f",
8533 .ksize = 8,
8534 .plaintext = "Mi",
8535 .psize = 2,
8536 .digest = "\xe8\xf9\xbe\xca\xe9\x7e\x5d\x29",
8537 },
8538 {
8539 .key = "\xe8\xf9\xbe\xca\xe9\x7e\x5d\x29",
8540 .ksize = 8,
8541 .plaintext = "Mic",
8542 .psize = 3,
8543 .digest = "\x90\x03\x8f\xc6\xcf\x13\xc1\xdb",
8544 },
8545 {
8546 .key = "\x90\x03\x8f\xc6\xcf\x13\xc1\xdb",
8547 .ksize = 8,
8548 .plaintext = "Mich",
8549 .psize = 4,
8550 .digest = "\xd5\x5e\x10\x05\x10\x12\x89\x86",
8551 },
8552 {
8553 .key = "\xd5\x5e\x10\x05\x10\x12\x89\x86",
8554 .ksize = 8,
8555 .plaintext = "Michael",
8556 .psize = 7,
8557 .digest = "\x0a\x94\x2b\x12\x4e\xca\xa5\x46",
8558 }
8559};
8560
8561/*
8562 * CRC32C test vectors
8563 */
8564#define CRC32C_TEST_VECTORS 14
8565
8566static struct hash_testvec crc32c_tv_template[] = {
8567 {
8568 .psize = 0,
8569 .digest = "\x00\x00\x00\x00",
8570 },
8571 {
8572 .key = "\x87\xa9\xcb\xed",
8573 .ksize = 4,
8574 .psize = 0,
8575 .digest = "\x78\x56\x34\x12",
8576 },
8577 {
8578 .key = "\xff\xff\xff\xff",
8579 .ksize = 4,
8580 .plaintext = "\x01\x02\x03\x04\x05\x06\x07\x08"
8581 "\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
8582 "\x11\x12\x13\x14\x15\x16\x17\x18"
8583 "\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20"
8584 "\x21\x22\x23\x24\x25\x26\x27\x28",
8585 .psize = 40,
8586 .digest = "\x7f\x15\x2c\x0e",
8587 },
8588 {
8589 .key = "\xff\xff\xff\xff",
8590 .ksize = 4,
8591 .plaintext = "\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30"
8592 "\x31\x32\x33\x34\x35\x36\x37\x38"
8593 "\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40"
8594 "\x41\x42\x43\x44\x45\x46\x47\x48"
8595 "\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50",
8596 .psize = 40,
8597 .digest = "\xf6\xeb\x80\xe9",
8598 },
8599 {
8600 .key = "\xff\xff\xff\xff",
8601 .ksize = 4,
8602 .plaintext = "\x51\x52\x53\x54\x55\x56\x57\x58"
8603 "\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60"
8604 "\x61\x62\x63\x64\x65\x66\x67\x68"
8605 "\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70"
8606 "\x71\x72\x73\x74\x75\x76\x77\x78",
8607 .psize = 40,
8608 .digest = "\xed\xbd\x74\xde",
8609 },
8610 {
8611 .key = "\xff\xff\xff\xff",
8612 .ksize = 4,
8613 .plaintext = "\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80"
8614 "\x81\x82\x83\x84\x85\x86\x87\x88"
8615 "\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90"
8616 "\x91\x92\x93\x94\x95\x96\x97\x98"
8617 "\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0",
8618 .psize = 40,
8619 .digest = "\x62\xc8\x79\xd5",
8620 },
8621 {
8622 .key = "\xff\xff\xff\xff",
8623 .ksize = 4,
8624 .plaintext = "\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8"
8625 "\xa9\xaa\xab\xac\xad\xae\xaf\xb0"
8626 "\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8"
8627 "\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0"
8628 "\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8",
8629 .psize = 40,
8630 .digest = "\xd0\x9a\x97\xba",
8631 },
8632 {
8633 .key = "\xff\xff\xff\xff",
8634 .ksize = 4,
8635 .plaintext = "\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0"
8636 "\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8"
8637 "\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0"
8638 "\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8"
8639 "\xe9\xea\xeb\xec\xed\xee\xef\xf0",
8640 .psize = 40,
8641 .digest = "\x13\xd9\x29\x2b",
8642 },
8643 {
8644 .key = "\x80\xea\xd3\xf1",
8645 .ksize = 4,
8646 .plaintext = "\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30"
8647 "\x31\x32\x33\x34\x35\x36\x37\x38"
8648 "\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40"
8649 "\x41\x42\x43\x44\x45\x46\x47\x48"
8650 "\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50",
8651 .psize = 40,
8652 .digest = "\x0c\xb5\xe2\xa2",
8653 },
8654 {
8655 .key = "\xf3\x4a\x1d\x5d",
8656 .ksize = 4,
8657 .plaintext = "\x51\x52\x53\x54\x55\x56\x57\x58"
8658 "\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60"
8659 "\x61\x62\x63\x64\x65\x66\x67\x68"
8660 "\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70"
8661 "\x71\x72\x73\x74\x75\x76\x77\x78",
8662 .psize = 40,
8663 .digest = "\xd1\x7f\xfb\xa6",
8664 },
8665 {
8666 .key = "\x2e\x80\x04\x59",
8667 .ksize = 4,
8668 .plaintext = "\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80"
8669 "\x81\x82\x83\x84\x85\x86\x87\x88"
8670 "\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90"
8671 "\x91\x92\x93\x94\x95\x96\x97\x98"
8672 "\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0",
8673 .psize = 40,
8674 .digest = "\x59\x33\xe6\x7a",
8675 },
8676 {
8677 .key = "\xa6\xcc\x19\x85",
8678 .ksize = 4,
8679 .plaintext = "\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8"
8680 "\xa9\xaa\xab\xac\xad\xae\xaf\xb0"
8681 "\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8"
8682 "\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0"
8683 "\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8",
8684 .psize = 40,
8685 .digest = "\xbe\x03\x01\xd2",
8686 },
8687 {
8688 .key = "\x41\xfc\xfe\x2d",
8689 .ksize = 4,
8690 .plaintext = "\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0"
8691 "\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8"
8692 "\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0"
8693 "\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8"
8694 "\xe9\xea\xeb\xec\xed\xee\xef\xf0",
8695 .psize = 40,
8696 .digest = "\x75\xd3\xc5\x24",
8697 },
8698 {
8699 .key = "\xff\xff\xff\xff",
8700 .ksize = 4,
8701 .plaintext = "\x01\x02\x03\x04\x05\x06\x07\x08"
8702 "\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
8703 "\x11\x12\x13\x14\x15\x16\x17\x18"
8704 "\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20"
8705 "\x21\x22\x23\x24\x25\x26\x27\x28"
8706 "\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30"
8707 "\x31\x32\x33\x34\x35\x36\x37\x38"
8708 "\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40"
8709 "\x41\x42\x43\x44\x45\x46\x47\x48"
8710 "\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50"
8711 "\x51\x52\x53\x54\x55\x56\x57\x58"
8712 "\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60"
8713 "\x61\x62\x63\x64\x65\x66\x67\x68"
8714 "\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70"
8715 "\x71\x72\x73\x74\x75\x76\x77\x78"
8716 "\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80"
8717 "\x81\x82\x83\x84\x85\x86\x87\x88"
8718 "\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90"
8719 "\x91\x92\x93\x94\x95\x96\x97\x98"
8720 "\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0"
8721 "\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8"
8722 "\xa9\xaa\xab\xac\xad\xae\xaf\xb0"
8723 "\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8"
8724 "\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0"
8725 "\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8"
8726 "\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0"
8727 "\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8"
8728 "\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0"
8729 "\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8"
8730 "\xe9\xea\xeb\xec\xed\xee\xef\xf0",
8731 .psize = 240,
8732 .digest = "\x75\xd3\xc5\x24",
8733 .np = 2,
8734 .tap = { 31, 209 }
8735 },
8736};
8737
8738#endif /* _CRYPTO_TESTMGR_H */