e406db48a3dadc722703ac97f1242b12b043b964
[libgcrypt.git] / tests / basic.c
1 /* basic.c  -  basic regression tests
2  * Copyright (C) 2001, 2002, 2003, 2005, 2008,
3  *               2009 Free Software Foundation, Inc.
4  * Copyright (C) 2013 g10 Code GmbH
5  *
6  * This file is part of Libgcrypt.
7  *
8  * Libgcrypt is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU Lesser General Public License as
10  * published by the Free Software Foundation; either version 2.1 of
11  * the License, or (at your option) any later version.
12  *
13  * Libgcrypt is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with this program; if not, see <http://www.gnu.org/licenses/>.
20  */
21
22 #ifdef HAVE_CONFIG_H
23 #include <config.h>
24 #endif
25 #include <stdio.h>
26 #include <stdlib.h>
27 #include <string.h>
28 #include <stdarg.h>
29 #include <assert.h>
30
31 #include "../src/gcrypt-int.h"
32
33 #ifndef DIM
34 # define DIM(v)              (sizeof(v)/sizeof((v)[0]))
35 #endif
36
37 #define PGM "basic"
38
39 typedef struct test_spec_pubkey_key
40 {
41   const char *secret;
42   const char *public;
43   const char *grip;
44 }
45 test_spec_pubkey_key_t;
46
47 typedef struct test_spec_pubkey
48 {
49   int id;
50   int flags;
51   test_spec_pubkey_key_t key;
52 }
53 test_spec_pubkey_t;
54
55 #define FLAG_CRYPT (1 << 0)
56 #define FLAG_SIGN  (1 << 1)
57 #define FLAG_GRIP  (1 << 2)
58
59 static int verbose;
60 static int error_count;
61 static int in_fips_mode;
62 static int die_on_error;
63
64 static void
65 fail (const char *format, ...)
66 {
67   va_list arg_ptr;
68
69   va_start (arg_ptr, format);
70   vfprintf (stderr, format, arg_ptr);
71   va_end (arg_ptr);
72   error_count++;
73   if (die_on_error)
74     exit (1);
75 }
76
77 static void
78 mismatch (const void *expected, size_t expectedlen,
79           const void *computed, size_t computedlen)
80 {
81   const unsigned char *p;
82
83   fprintf (stderr, "expected:");
84   for (p = expected; expectedlen; p++, expectedlen--)
85     fprintf (stderr, " %02x", *p);
86   fprintf (stderr, "\ncomputed:");
87   for (p = computed; computedlen; p++, computedlen--)
88     fprintf (stderr, " %02x", *p);
89   fprintf (stderr, "\n");
90 }
91
92
93 static void
94 die (const char *format, ...)
95 {
96   va_list arg_ptr;
97
98   va_start (arg_ptr, format);
99   vfprintf (stderr, format, arg_ptr);
100   va_end (arg_ptr);
101   exit (1);
102 }
103
104
105 static void
106 show_sexp (const char *prefix, gcry_sexp_t a)
107 {
108   char *buf;
109   size_t size;
110
111   if (prefix)
112     fputs (prefix, stderr);
113   size = gcry_sexp_sprint (a, GCRYSEXP_FMT_ADVANCED, NULL, 0);
114   buf = gcry_xmalloc (size);
115
116   gcry_sexp_sprint (a, GCRYSEXP_FMT_ADVANCED, buf, size);
117   fprintf (stderr, "%.*s", (int)size, buf);
118   gcry_free (buf);
119 }
120
121
122 static void
123 show_note (const char *format, ...)
124 {
125   va_list arg_ptr;
126
127   if (!verbose && getenv ("srcdir"))
128     fputs ("      ", stderr);  /* To align above "PASS: ".  */
129   else
130     fprintf (stderr, "%s: ", PGM);
131   va_start (arg_ptr, format);
132   vfprintf (stderr, format, arg_ptr);
133   if (*format && format[strlen(format)-1] != '\n')
134     putc ('\n', stderr);
135   va_end (arg_ptr);
136 }
137
138
139 static void
140 show_md_not_available (int algo)
141 {
142   static int list[100];
143   static int listlen;
144   int i;
145
146   if (!verbose && algo == GCRY_MD_MD2)
147     return;  /* Do not print the diagnostic for that one.  */
148
149   for (i=0; i < listlen; i++)
150     if (algo == list[i])
151       return; /* Note already printed.  */
152   if (listlen < DIM (list))
153     list[listlen++] = algo;
154   show_note ("hash algorithm %d not available - skipping tests", algo);
155 }
156
157
158 static void
159 show_old_hmac_not_available (int algo)
160 {
161   static int list[100];
162   static int listlen;
163   int i;
164
165   if (!verbose && algo == GCRY_MD_MD2)
166     return;  /* Do not print the diagnostic for that one.  */
167
168   for (i=0; i < listlen; i++)
169     if (algo == list[i])
170       return; /* Note already printed.  */
171   if (listlen < DIM (list))
172     list[listlen++] = algo;
173   show_note ("hash algorithm %d for old HMAC API not available "
174              "- skipping tests", algo);
175 }
176
177
178 static void
179 show_mac_not_available (int algo)
180 {
181   static int list[100];
182   static int listlen;
183   int i;
184
185   if (!verbose && algo == GCRY_MD_MD2)
186     return;  /* Do not print the diagnostic for that one.  */
187
188   for (i=0; i < listlen; i++)
189     if (algo == list[i])
190       return; /* Note already printed.  */
191   if (listlen < DIM (list))
192     list[listlen++] = algo;
193   show_note ("MAC algorithm %d not available - skipping tests", algo);
194 }
195
196
197
198 #define MAX_DATA_LEN 128
199
200 void
201 progress_handler (void *cb_data, const char *what, int printchar,
202                   int current, int total)
203 {
204   (void)cb_data;
205   (void)what;
206   (void)current;
207   (void)total;
208
209   if (printchar == '\n')
210     fputs ( "<LF>", stdout);
211   else
212     putchar (printchar);
213   fflush (stdout);
214 }
215
216 static void
217 check_cbc_mac_cipher (void)
218 {
219   static const struct tv
220   {
221     int algo;
222     char key[MAX_DATA_LEN];
223     unsigned char plaintext[MAX_DATA_LEN];
224     size_t plaintextlen;
225     char mac[MAX_DATA_LEN];
226   }
227   tv[] =
228     {
229       { GCRY_CIPHER_AES,
230         "chicken teriyaki",
231         "This is a sample plaintext for CBC MAC of sixtyfour bytes.......",
232         0, "\x23\x8f\x6d\xc7\x53\x6a\x62\x97\x11\xc4\xa5\x16\x43\xea\xb0\xb6" },
233       { GCRY_CIPHER_3DES,
234         "abcdefghABCDEFGH01234567",
235         "This is a sample plaintext for CBC MAC of sixtyfour bytes.......",
236         0, "\x5c\x11\xf0\x01\x47\xbd\x3d\x3a" },
237       { GCRY_CIPHER_DES,
238         "abcdefgh",
239         "This is a sample plaintext for CBC MAC of sixtyfour bytes.......",
240         0, "\xfa\x4b\xdf\x9d\xfa\xab\x01\x70" }
241     };
242   gcry_cipher_hd_t hd;
243   unsigned char out[MAX_DATA_LEN];
244   int i, blklen, keylen;
245   gcry_error_t err = 0;
246
247   if (verbose)
248     fprintf (stderr, "  Starting CBC MAC checks.\n");
249
250   for (i = 0; i < sizeof (tv) / sizeof (tv[0]); i++)
251     {
252       if (gcry_cipher_test_algo (tv[i].algo) && in_fips_mode)
253         {
254           if (verbose)
255             fprintf (stderr, "  algorithm %d not available in fips mode\n",
256                      tv[i].algo);
257           continue;
258         }
259
260       err = gcry_cipher_open (&hd,
261                               tv[i].algo,
262                               GCRY_CIPHER_MODE_CBC, GCRY_CIPHER_CBC_MAC);
263       if (!hd)
264         {
265           fail ("cbc-mac algo %d, gcry_cipher_open failed: %s\n",
266                 tv[i].algo, gpg_strerror (err));
267           return;
268         }
269
270       blklen = gcry_cipher_get_algo_blklen(tv[i].algo);
271       if (!blklen)
272         {
273           fail ("cbc-mac algo %d, gcry_cipher_get_algo_blklen failed\n",
274                  tv[i].algo);
275           gcry_cipher_close (hd);
276           return;
277         }
278
279       keylen = gcry_cipher_get_algo_keylen (tv[i].algo);
280       if (!keylen)
281         {
282           fail ("cbc-mac algo %d, gcry_cipher_get_algo_keylen failed\n",
283                 tv[i].algo);
284           return;
285         }
286
287       err = gcry_cipher_setkey (hd, tv[i].key, keylen);
288       if (err)
289         {
290           fail ("cbc-mac algo %d, gcry_cipher_setkey failed: %s\n",
291                 tv[i].algo, gpg_strerror (err));
292           gcry_cipher_close (hd);
293           return;
294         }
295
296       err = gcry_cipher_setiv (hd, NULL, 0);
297       if (err)
298         {
299           fail ("cbc-mac algo %d, gcry_cipher_setiv failed: %s\n",
300                 tv[i].algo, gpg_strerror (err));
301           gcry_cipher_close (hd);
302           return;
303         }
304
305       if (verbose)
306         fprintf (stderr, "    checking CBC MAC for %s [%i]\n",
307                  gcry_cipher_algo_name (tv[i].algo),
308                  tv[i].algo);
309       err = gcry_cipher_encrypt (hd,
310                                  out, blklen,
311                                  tv[i].plaintext,
312                                  tv[i].plaintextlen ?
313                                  tv[i].plaintextlen :
314                                  strlen ((char*)tv[i].plaintext));
315       if (err)
316         {
317           fail ("cbc-mac algo %d, gcry_cipher_encrypt failed: %s\n",
318                 tv[i].algo, gpg_strerror (err));
319           gcry_cipher_close (hd);
320           return;
321         }
322
323 #if 0
324       {
325         int j;
326         for (j = 0; j < gcry_cipher_get_algo_blklen (tv[i].algo); j++)
327           printf ("\\x%02x", out[j] & 0xFF);
328         printf ("\n");
329       }
330 #endif
331
332       if (memcmp (tv[i].mac, out, blklen))
333         fail ("cbc-mac algo %d, encrypt mismatch entry %d\n", tv[i].algo, i);
334
335       gcry_cipher_close (hd);
336     }
337   if (verbose)
338     fprintf (stderr, "  Completed CBC MAC checks.\n");
339 }
340
341 static void
342 check_aes128_cbc_cts_cipher (void)
343 {
344   static const char key[128 / 8] = "chicken teriyaki";
345   static const unsigned char plaintext[] =
346     "I would like the General Gau's Chicken, please, and wonton soup.";
347   static const struct tv
348   {
349     unsigned char out[MAX_DATA_LEN];
350     int inlen;
351   } tv[] =
352     {
353       { "\xc6\x35\x35\x68\xf2\xbf\x8c\xb4\xd8\xa5\x80\x36\x2d\xa7\xff\x7f"
354         "\x97",
355         17 },
356       { "\xfc\x00\x78\x3e\x0e\xfd\xb2\xc1\xd4\x45\xd4\xc8\xef\xf7\xed\x22"
357         "\x97\x68\x72\x68\xd6\xec\xcc\xc0\xc0\x7b\x25\xe2\x5e\xcf\xe5",
358         31 },
359       { "\x39\x31\x25\x23\xa7\x86\x62\xd5\xbe\x7f\xcb\xcc\x98\xeb\xf5\xa8"
360         "\x97\x68\x72\x68\xd6\xec\xcc\xc0\xc0\x7b\x25\xe2\x5e\xcf\xe5\x84",
361         32 },
362       { "\x97\x68\x72\x68\xd6\xec\xcc\xc0\xc0\x7b\x25\xe2\x5e\xcf\xe5\x84"
363         "\xb3\xff\xfd\x94\x0c\x16\xa1\x8c\x1b\x55\x49\xd2\xf8\x38\x02\x9e"
364         "\x39\x31\x25\x23\xa7\x86\x62\xd5\xbe\x7f\xcb\xcc\x98\xeb\xf5",
365         47 },
366       { "\x97\x68\x72\x68\xd6\xec\xcc\xc0\xc0\x7b\x25\xe2\x5e\xcf\xe5\x84"
367         "\x9d\xad\x8b\xbb\x96\xc4\xcd\xc0\x3b\xc1\x03\xe1\xa1\x94\xbb\xd8"
368         "\x39\x31\x25\x23\xa7\x86\x62\xd5\xbe\x7f\xcb\xcc\x98\xeb\xf5\xa8",
369         48 },
370       { "\x97\x68\x72\x68\xd6\xec\xcc\xc0\xc0\x7b\x25\xe2\x5e\xcf\xe5\x84"
371         "\x39\x31\x25\x23\xa7\x86\x62\xd5\xbe\x7f\xcb\xcc\x98\xeb\xf5\xa8"
372         "\x48\x07\xef\xe8\x36\xee\x89\xa5\x26\x73\x0d\xbc\x2f\x7b\xc8\x40"
373         "\x9d\xad\x8b\xbb\x96\xc4\xcd\xc0\x3b\xc1\x03\xe1\xa1\x94\xbb\xd8",
374         64 },
375     };
376   gcry_cipher_hd_t hd;
377   unsigned char out[MAX_DATA_LEN];
378   int i;
379   gcry_error_t err = 0;
380
381   if (verbose)
382     fprintf (stderr, "  Starting AES128 CBC CTS checks.\n");
383   err = gcry_cipher_open (&hd,
384                           GCRY_CIPHER_AES,
385                           GCRY_CIPHER_MODE_CBC, GCRY_CIPHER_CBC_CTS);
386   if (err)
387     {
388       fail ("aes-cbc-cts, gcry_cipher_open failed: %s\n", gpg_strerror (err));
389       return;
390     }
391
392   err = gcry_cipher_setkey (hd, key, 128 / 8);
393   if (err)
394     {
395       fail ("aes-cbc-cts, gcry_cipher_setkey failed: %s\n",
396             gpg_strerror (err));
397       gcry_cipher_close (hd);
398       return;
399     }
400
401   for (i = 0; i < sizeof (tv) / sizeof (tv[0]); i++)
402     {
403       err = gcry_cipher_setiv (hd, NULL, 0);
404       if (err)
405         {
406           fail ("aes-cbc-cts, gcry_cipher_setiv failed: %s\n",
407                 gpg_strerror (err));
408           gcry_cipher_close (hd);
409           return;
410         }
411
412       if (verbose)
413         fprintf (stderr, "    checking encryption for length %i\n", tv[i].inlen);
414       err = gcry_cipher_encrypt (hd, out, MAX_DATA_LEN,
415                                  plaintext, tv[i].inlen);
416       if (err)
417         {
418           fail ("aes-cbc-cts, gcry_cipher_encrypt failed: %s\n",
419                 gpg_strerror (err));
420           gcry_cipher_close (hd);
421           return;
422         }
423
424       if (memcmp (tv[i].out, out, tv[i].inlen))
425         fail ("aes-cbc-cts, encrypt mismatch entry %d\n", i);
426
427       err = gcry_cipher_setiv (hd, NULL, 0);
428       if (err)
429         {
430           fail ("aes-cbc-cts, gcry_cipher_setiv failed: %s\n",
431                 gpg_strerror (err));
432           gcry_cipher_close (hd);
433           return;
434         }
435       if (verbose)
436         fprintf (stderr, "    checking decryption for length %i\n", tv[i].inlen);
437       err = gcry_cipher_decrypt (hd, out, tv[i].inlen, NULL, 0);
438       if (err)
439         {
440           fail ("aes-cbc-cts, gcry_cipher_decrypt failed: %s\n",
441                 gpg_strerror (err));
442           gcry_cipher_close (hd);
443           return;
444         }
445
446       if (memcmp (plaintext, out, tv[i].inlen))
447         fail ("aes-cbc-cts, decrypt mismatch entry %d\n", i);
448     }
449
450   gcry_cipher_close (hd);
451   if (verbose)
452     fprintf (stderr, "  Completed AES128 CBC CTS checks.\n");
453 }
454
455 static void
456 check_ctr_cipher (void)
457 {
458   static const struct tv
459   {
460     int algo;
461     char key[MAX_DATA_LEN];
462     char ctr[MAX_DATA_LEN];
463     struct data
464     {
465       unsigned char plaintext[MAX_DATA_LEN];
466       int inlen;
467       char out[MAX_DATA_LEN];
468     } data[8];
469   } tv[] =
470     {
471       /* http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf */
472       { GCRY_CIPHER_AES,
473         "\x2b\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c",
474         "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff",
475         { { "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96\xe9\x3d\x7e\x11\x73\x93\x17\x2a",
476             16,
477             "\x87\x4d\x61\x91\xb6\x20\xe3\x26\x1b\xef\x68\x64\x99\x0d\xb6\xce" },
478           { "\xae\x2d\x8a\x57\x1e\x03\xac\x9c\x9e\xb7\x6f\xac\x45\xaf\x8e\x51",
479             16,
480             "\x98\x06\xf6\x6b\x79\x70\xfd\xff\x86\x17\x18\x7b\xb9\xff\xfd\xff" },
481           { "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11\xe5\xfb\xc1\x19\x1a\x0a\x52\xef",
482             16,
483             "\x5a\xe4\xdf\x3e\xdb\xd5\xd3\x5e\x5b\x4f\x09\x02\x0d\xb0\x3e\xab" },
484           { "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
485             16,
486             "\x1e\x03\x1d\xda\x2f\xbe\x03\xd1\x79\x21\x70\xa0\xf3\x00\x9c\xee" },
487
488           { "", 0, "" }
489         }
490       },
491       { GCRY_CIPHER_AES192,
492         "\x8e\x73\xb0\xf7\xda\x0e\x64\x52\xc8\x10\xf3\x2b"
493         "\x80\x90\x79\xe5\x62\xf8\xea\xd2\x52\x2c\x6b\x7b",
494         "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff",
495         { { "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96\xe9\x3d\x7e\x11\x73\x93\x17\x2a",
496             16,
497             "\x1a\xbc\x93\x24\x17\x52\x1c\xa2\x4f\x2b\x04\x59\xfe\x7e\x6e\x0b" },
498           { "\xae\x2d\x8a\x57\x1e\x03\xac\x9c\x9e\xb7\x6f\xac\x45\xaf\x8e\x51",
499             16,
500             "\x09\x03\x39\xec\x0a\xa6\xfa\xef\xd5\xcc\xc2\xc6\xf4\xce\x8e\x94" },
501           { "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11\xe5\xfb\xc1\x19\x1a\x0a\x52\xef",
502             16,
503             "\x1e\x36\xb2\x6b\xd1\xeb\xc6\x70\xd1\xbd\x1d\x66\x56\x20\xab\xf7" },
504           { "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
505             16,
506             "\x4f\x78\xa7\xf6\xd2\x98\x09\x58\x5a\x97\xda\xec\x58\xc6\xb0\x50" },
507           { "", 0, "" }
508         }
509       },
510       { GCRY_CIPHER_AES256,
511         "\x60\x3d\xeb\x10\x15\xca\x71\xbe\x2b\x73\xae\xf0\x85\x7d\x77\x81"
512         "\x1f\x35\x2c\x07\x3b\x61\x08\xd7\x2d\x98\x10\xa3\x09\x14\xdf\xf4",
513         "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff",
514         { { "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96\xe9\x3d\x7e\x11\x73\x93\x17\x2a",
515             16,
516             "\x60\x1e\xc3\x13\x77\x57\x89\xa5\xb7\xa7\xf5\x04\xbb\xf3\xd2\x28" },
517           { "\xae\x2d\x8a\x57\x1e\x03\xac\x9c\x9e\xb7\x6f\xac\x45\xaf\x8e\x51",
518             16,
519             "\xf4\x43\xe3\xca\x4d\x62\xb5\x9a\xca\x84\xe9\x90\xca\xca\xf5\xc5" },
520           { "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11\xe5\xfb\xc1\x19\x1a\x0a\x52\xef",
521             16,
522             "\x2b\x09\x30\xda\xa2\x3d\xe9\x4c\xe8\x70\x17\xba\x2d\x84\x98\x8d" },
523           { "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
524             16,
525             "\xdf\xc9\xc5\x8d\xb6\x7a\xad\xa6\x13\xc2\xdd\x08\x45\x79\x41\xa6" },
526           { "", 0, "" }
527         }
528       },
529       /* Some truncation tests.  With a truncated second block and
530          also with a single truncated block.  */
531       { GCRY_CIPHER_AES,
532         "\x2b\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c",
533         "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff",
534         {{"\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96\xe9\x3d\x7e\x11\x73\x93\x17\x2a",
535           16,
536           "\x87\x4d\x61\x91\xb6\x20\xe3\x26\x1b\xef\x68\x64\x99\x0d\xb6\xce" },
537          {"\xae\x2d\x8a\x57\x1e\x03\xac\x9c\x9e\xb7\x6f\xac\x45\xaf\x8e",
538           15,
539           "\x98\x06\xf6\x6b\x79\x70\xfd\xff\x86\x17\x18\x7b\xb9\xff\xfd" },
540          {"", 0, "" }
541         }
542       },
543       { GCRY_CIPHER_AES,
544         "\x2b\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c",
545         "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff",
546         {{"\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96\xe9\x3d\x7e\x11\x73\x93\x17\x2a",
547           16,
548           "\x87\x4d\x61\x91\xb6\x20\xe3\x26\x1b\xef\x68\x64\x99\x0d\xb6\xce" },
549          {"\xae",
550           1,
551           "\x98" },
552          {"", 0, "" }
553         }
554       },
555       { GCRY_CIPHER_AES,
556         "\x2b\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c",
557         "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff",
558         {{"\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96\xe9\x3d\x7e\x11\x73\x93\x17",
559           15,
560           "\x87\x4d\x61\x91\xb6\x20\xe3\x26\x1b\xef\x68\x64\x99\x0d\xb6" },
561          {"", 0, "" }
562         }
563       },
564       { GCRY_CIPHER_AES,
565         "\x2b\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c",
566         "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff",
567         {{"\x6b",
568           1,
569           "\x87" },
570          {"", 0, "" }
571         }
572       },
573       /* Tests to see whether it works correctly as a stream cipher.  */
574       { GCRY_CIPHER_AES,
575         "\x2b\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c",
576         "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff",
577         {{"\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96\xe9\x3d\x7e\x11\x73\x93\x17\x2a",
578           16,
579           "\x87\x4d\x61\x91\xb6\x20\xe3\x26\x1b\xef\x68\x64\x99\x0d\xb6\xce" },
580          {"\xae\x2d\x8a\x57\x1e\x03\xac\x9c\x9e\xb7\x6f\xac\x45\xaf\x8e",
581           15,
582           "\x98\x06\xf6\x6b\x79\x70\xfd\xff\x86\x17\x18\x7b\xb9\xff\xfd" },
583          {"\x51\x30\xc8\x1c\x46\xa3\x5c\xe4\x11\xe5\xfb\xc1\x19\x1a\x0a\x52\xef",
584           17,
585           "\xff\x5a\xe4\xdf\x3e\xdb\xd5\xd3\x5e\x5b\x4f\x09\x02\x0d\xb0\x3e\xab" },
586          {"\xf6\x9f\x24\x45\xdf\x4f\x9b\x17\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
587           16,
588           "\x1e\x03\x1d\xda\x2f\xbe\x03\xd1\x79\x21\x70\xa0\xf3\x00\x9c\xee" },
589
590           { "", 0, "" }
591         }
592       },
593       { GCRY_CIPHER_AES,
594         "\x2b\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c",
595         "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff",
596         {{"\x6b",
597           1,
598           "\x87" },
599          {"\xc1\xbe",
600           2,
601           "\x4d\x61" },
602          {"\xe2\x2e\x40",
603           3,
604           "\x91\xb6\x20" },
605          {"\x9f",
606           1,
607           "\xe3" },
608          {"\x96\xe9\x3d\x7e\x11\x73\x93\x17\x2a",
609           9,
610           "\x26\x1b\xef\x68\x64\x99\x0d\xb6\xce" },
611          {"\xae\x2d\x8a\x57\x1e\x03\xac\x9c\x9e\xb7\x6f\xac\x45\xaf\x8e",
612           15,
613           "\x98\x06\xf6\x6b\x79\x70\xfd\xff\x86\x17\x18\x7b\xb9\xff\xfd" },
614          {"\x51\x30\xc8\x1c\x46\xa3\x5c\xe4\x11",
615           9,
616           "\xff\x5a\xe4\xdf\x3e\xdb\xd5\xd3\x5e" },
617
618           { "", 0, "" }
619         }
620       },
621 #if USE_CAST5
622       /* A selfmade test vector using an 64 bit block cipher.  */
623       { GCRY_CIPHER_CAST5,
624         "\x2b\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c",
625         "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8",
626         {{"\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96\xe9\x3d\x7e\x11\x73\x93\x17\x2a",
627           16,
628           "\xe8\xa7\xac\x68\xca\xca\xa0\x20\x10\xcb\x1b\xcc\x79\x2c\xc4\x48" },
629          {"\xae\x2d\x8a\x57\x1e\x03\xac\x9c",
630           8,
631           "\x16\xe8\x72\x77\xb0\x98\x29\x68" },
632          {"\x9e\xb7\x6f\xac\x45\xaf\x8e\x51",
633           8,
634           "\x9a\xb3\xa8\x03\x3b\xb4\x14\xba" },
635          {"\xae\x2d\x8a\x57\x1e\x03\xac\x9c\xa1\x00",
636           10,
637           "\x31\x5e\xd3\xfb\x1b\x8d\xd1\xf9\xb0\x83" },
638          { "", 0, "" }
639         }
640       },
641 #endif /*USE_CAST5*/
642       { 0,
643         "",
644         "",
645         {
646          {"", 0, "" }
647         }
648       }
649     };
650   gcry_cipher_hd_t hde, hdd;
651   unsigned char out[MAX_DATA_LEN];
652   int i, j, keylen, blklen;
653   gcry_error_t err = 0;
654
655   if (verbose)
656     fprintf (stderr, "  Starting CTR cipher checks.\n");
657   for (i = 0; i < sizeof (tv) / sizeof (tv[0]); i++)
658     {
659       if (!tv[i].algo)
660         continue;
661
662       err = gcry_cipher_open (&hde, tv[i].algo, GCRY_CIPHER_MODE_CTR, 0);
663       if (!err)
664         err = gcry_cipher_open (&hdd, tv[i].algo, GCRY_CIPHER_MODE_CTR, 0);
665       if (err)
666         {
667           fail ("aes-ctr, gcry_cipher_open failed: %s\n", gpg_strerror (err));
668           return;
669         }
670
671       keylen = gcry_cipher_get_algo_keylen(tv[i].algo);
672       if (!keylen)
673         {
674           fail ("aes-ctr, gcry_cipher_get_algo_keylen failed\n");
675           return;
676         }
677
678       err = gcry_cipher_setkey (hde, tv[i].key, keylen);
679       if (!err)
680         err = gcry_cipher_setkey (hdd, tv[i].key, keylen);
681       if (err)
682         {
683           fail ("aes-ctr, gcry_cipher_setkey failed: %s\n",
684                 gpg_strerror (err));
685           gcry_cipher_close (hde);
686           gcry_cipher_close (hdd);
687           return;
688         }
689
690       blklen = gcry_cipher_get_algo_blklen(tv[i].algo);
691       if (!blklen)
692         {
693           fail ("aes-ctr, gcry_cipher_get_algo_blklen failed\n");
694           return;
695         }
696
697       err = gcry_cipher_setctr (hde, tv[i].ctr, blklen);
698       if (!err)
699         err = gcry_cipher_setctr (hdd, tv[i].ctr, blklen);
700       if (err)
701         {
702           fail ("aes-ctr, gcry_cipher_setctr failed: %s\n",
703                 gpg_strerror (err));
704           gcry_cipher_close (hde);
705           gcry_cipher_close (hdd);
706           return;
707         }
708
709       if (verbose)
710         fprintf (stderr, "    checking CTR mode for %s [%i]\n",
711                  gcry_cipher_algo_name (tv[i].algo),
712                  tv[i].algo);
713       for (j = 0; tv[i].data[j].inlen; j++)
714         {
715           err = gcry_cipher_encrypt (hde, out, MAX_DATA_LEN,
716                                      tv[i].data[j].plaintext,
717                                      tv[i].data[j].inlen == -1 ?
718                                      strlen ((char*)tv[i].data[j].plaintext) :
719                                      tv[i].data[j].inlen);
720           if (err)
721             {
722               fail ("aes-ctr, gcry_cipher_encrypt (%d, %d) failed: %s\n",
723                     i, j, gpg_strerror (err));
724               gcry_cipher_close (hde);
725               gcry_cipher_close (hdd);
726               return;
727             }
728
729           if (memcmp (tv[i].data[j].out, out, tv[i].data[j].inlen))
730             {
731               fail ("aes-ctr, encrypt mismatch entry %d:%d\n", i, j);
732               mismatch (tv[i].data[j].out, tv[i].data[j].inlen,
733                         out, tv[i].data[j].inlen);
734             }
735
736           err = gcry_cipher_decrypt (hdd, out, tv[i].data[j].inlen, NULL, 0);
737           if (err)
738             {
739               fail ("aes-ctr, gcry_cipher_decrypt (%d, %d) failed: %s\n",
740                     i, j, gpg_strerror (err));
741               gcry_cipher_close (hde);
742               gcry_cipher_close (hdd);
743               return;
744             }
745
746           if (memcmp (tv[i].data[j].plaintext, out, tv[i].data[j].inlen))
747             {
748               fail ("aes-ctr, decrypt mismatch entry %d:%d\n", i, j);
749               mismatch (tv[i].data[j].plaintext, tv[i].data[j].inlen,
750                         out, tv[i].data[j].inlen);
751             }
752
753         }
754
755       /* Now check that we get valid return codes back for good and
756          bad inputs.  */
757       err = gcry_cipher_encrypt (hde, out, MAX_DATA_LEN,
758                                  "1234567890123456", 16);
759       if (err)
760         fail ("aes-ctr, encryption failed for valid input");
761
762       err = gcry_cipher_encrypt (hde, out, 15,
763                                  "1234567890123456", 16);
764       if (gpg_err_code (err) != GPG_ERR_BUFFER_TOO_SHORT)
765         fail ("aes-ctr, too short output buffer returned wrong error: %s\n",
766               gpg_strerror (err));
767
768       err = gcry_cipher_encrypt (hde, out, 0,
769                                  "1234567890123456", 16);
770       if (gpg_err_code (err) != GPG_ERR_BUFFER_TOO_SHORT)
771         fail ("aes-ctr, 0 length output buffer returned wrong error: %s\n",
772               gpg_strerror (err));
773
774       err = gcry_cipher_encrypt (hde, out, 16,
775                                  "1234567890123456", 16);
776       if (err)
777         fail ("aes-ctr, correct length output buffer returned error: %s\n",
778               gpg_strerror (err));
779
780       /* Again, now for decryption.  */
781       err = gcry_cipher_decrypt (hde, out, MAX_DATA_LEN,
782                                  "1234567890123456", 16);
783       if (err)
784         fail ("aes-ctr, decryption failed for valid input");
785
786       err = gcry_cipher_decrypt (hde, out, 15,
787                                  "1234567890123456", 16);
788       if (gpg_err_code (err) != GPG_ERR_BUFFER_TOO_SHORT)
789         fail ("aes-ctr, too short output buffer returned wrong error: %s\n",
790               gpg_strerror (err));
791
792       err = gcry_cipher_decrypt (hde, out, 0,
793                                  "1234567890123456", 16);
794       if (gpg_err_code (err) != GPG_ERR_BUFFER_TOO_SHORT)
795         fail ("aes-ctr, 0 length output buffer returned wrong error: %s\n",
796               gpg_strerror (err));
797
798       err = gcry_cipher_decrypt (hde, out, 16,
799                                  "1234567890123456", 16);
800       if (err)
801         fail ("aes-ctr, correct length output buffer returned error: %s\n",
802               gpg_strerror (err));
803
804       gcry_cipher_close (hde);
805       gcry_cipher_close (hdd);
806     }
807   if (verbose)
808     fprintf (stderr, "  Completed CTR cipher checks.\n");
809 }
810
811 static void
812 check_cfb_cipher (void)
813 {
814   static const struct tv
815   {
816     int algo;
817     char key[MAX_DATA_LEN];
818     char iv[MAX_DATA_LEN];
819     struct data
820     {
821       unsigned char plaintext[MAX_DATA_LEN];
822       int inlen;
823       char out[MAX_DATA_LEN];
824     }
825     data[MAX_DATA_LEN];
826   } tv[] =
827     {
828       /* http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf */
829       { GCRY_CIPHER_AES,
830         "\x2b\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c",
831         "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
832         { { "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96\xe9\x3d\x7e\x11\x73\x93\x17\x2a",
833             16,
834             "\x3b\x3f\xd9\x2e\xb7\x2d\xad\x20\x33\x34\x49\xf8\xe8\x3c\xfb\x4a" },
835           { "\xae\x2d\x8a\x57\x1e\x03\xac\x9c\x9e\xb7\x6f\xac\x45\xaf\x8e\x51",
836             16,
837             "\xc8\xa6\x45\x37\xa0\xb3\xa9\x3f\xcd\xe3\xcd\xad\x9f\x1c\xe5\x8b"},
838           { "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11\xe5\xfb\xc1\x19\x1a\x0a\x52\xef",
839             16,
840             "\x26\x75\x1f\x67\xa3\xcb\xb1\x40\xb1\x80\x8c\xf1\x87\xa4\xf4\xdf" },
841           { "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
842             16,
843             "\xc0\x4b\x05\x35\x7c\x5d\x1c\x0e\xea\xc4\xc6\x6f\x9f\xf7\xf2\xe6" },
844         }
845       },
846       { GCRY_CIPHER_AES192,
847         "\x8e\x73\xb0\xf7\xda\x0e\x64\x52\xc8\x10\xf3\x2b"
848         "\x80\x90\x79\xe5\x62\xf8\xea\xd2\x52\x2c\x6b\x7b",
849         "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
850         { { "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96\xe9\x3d\x7e\x11\x73\x93\x17\x2a",
851             16,
852             "\xcd\xc8\x0d\x6f\xdd\xf1\x8c\xab\x34\xc2\x59\x09\xc9\x9a\x41\x74" },
853           { "\xae\x2d\x8a\x57\x1e\x03\xac\x9c\x9e\xb7\x6f\xac\x45\xaf\x8e\x51",
854             16,
855             "\x67\xce\x7f\x7f\x81\x17\x36\x21\x96\x1a\x2b\x70\x17\x1d\x3d\x7a" },
856           { "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11\xe5\xfb\xc1\x19\x1a\x0a\x52\xef",
857             16,
858             "\x2e\x1e\x8a\x1d\xd5\x9b\x88\xb1\xc8\xe6\x0f\xed\x1e\xfa\xc4\xc9" },
859           { "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
860             16,
861             "\xc0\x5f\x9f\x9c\xa9\x83\x4f\xa0\x42\xae\x8f\xba\x58\x4b\x09\xff" },
862         }
863       },
864       { GCRY_CIPHER_AES256,
865         "\x60\x3d\xeb\x10\x15\xca\x71\xbe\x2b\x73\xae\xf0\x85\x7d\x77\x81"
866         "\x1f\x35\x2c\x07\x3b\x61\x08\xd7\x2d\x98\x10\xa3\x09\x14\xdf\xf4",
867         "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
868         { { "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96\xe9\x3d\x7e\x11\x73\x93\x17\x2a",
869             16,
870             "\xdc\x7e\x84\xbf\xda\x79\x16\x4b\x7e\xcd\x84\x86\x98\x5d\x38\x60" },
871           { "\xae\x2d\x8a\x57\x1e\x03\xac\x9c\x9e\xb7\x6f\xac\x45\xaf\x8e\x51",
872             16,
873             "\x39\xff\xed\x14\x3b\x28\xb1\xc8\x32\x11\x3c\x63\x31\xe5\x40\x7b" },
874           { "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11\xe5\xfb\xc1\x19\x1a\x0a\x52\xef",
875             16,
876             "\xdf\x10\x13\x24\x15\xe5\x4b\x92\xa1\x3e\xd0\xa8\x26\x7a\xe2\xf9" },
877           { "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
878             16,
879             "\x75\xa3\x85\x74\x1a\xb9\xce\xf8\x20\x31\x62\x3d\x55\xb1\xe4\x71" }
880         }
881       }
882     };
883   gcry_cipher_hd_t hde, hdd;
884   unsigned char out[MAX_DATA_LEN];
885   int i, j, keylen, blklen;
886   gcry_error_t err = 0;
887
888   if (verbose)
889     fprintf (stderr, "  Starting CFB checks.\n");
890
891   for (i = 0; i < sizeof (tv) / sizeof (tv[0]); i++)
892     {
893       if (verbose)
894         fprintf (stderr, "    checking CFB mode for %s [%i]\n",
895                  gcry_cipher_algo_name (tv[i].algo),
896                  tv[i].algo);
897       err = gcry_cipher_open (&hde, tv[i].algo, GCRY_CIPHER_MODE_CFB, 0);
898       if (!err)
899         err = gcry_cipher_open (&hdd, tv[i].algo, GCRY_CIPHER_MODE_CFB, 0);
900       if (err)
901         {
902           fail ("aes-cfb, gcry_cipher_open failed: %s\n", gpg_strerror (err));
903           return;
904         }
905
906       keylen = gcry_cipher_get_algo_keylen(tv[i].algo);
907       if (!keylen)
908         {
909           fail ("aes-cfb, gcry_cipher_get_algo_keylen failed\n");
910           return;
911         }
912
913       err = gcry_cipher_setkey (hde, tv[i].key, keylen);
914       if (!err)
915         err = gcry_cipher_setkey (hdd, tv[i].key, keylen);
916       if (err)
917         {
918           fail ("aes-cfb, gcry_cipher_setkey failed: %s\n",
919                 gpg_strerror (err));
920           gcry_cipher_close (hde);
921           gcry_cipher_close (hdd);
922           return;
923         }
924
925       blklen = gcry_cipher_get_algo_blklen(tv[i].algo);
926       if (!blklen)
927         {
928           fail ("aes-cfb, gcry_cipher_get_algo_blklen failed\n");
929           return;
930         }
931
932       err = gcry_cipher_setiv (hde, tv[i].iv, blklen);
933       if (!err)
934         err = gcry_cipher_setiv (hdd, tv[i].iv, blklen);
935       if (err)
936         {
937           fail ("aes-cfb, gcry_cipher_setiv failed: %s\n",
938                 gpg_strerror (err));
939           gcry_cipher_close (hde);
940           gcry_cipher_close (hdd);
941           return;
942         }
943
944       for (j = 0; tv[i].data[j].inlen; j++)
945         {
946           err = gcry_cipher_encrypt (hde, out, MAX_DATA_LEN,
947                                      tv[i].data[j].plaintext,
948                                      tv[i].data[j].inlen);
949           if (err)
950             {
951               fail ("aes-cfb, gcry_cipher_encrypt (%d, %d) failed: %s\n",
952                     i, j, gpg_strerror (err));
953               gcry_cipher_close (hde);
954               gcry_cipher_close (hdd);
955               return;
956             }
957
958           if (memcmp (tv[i].data[j].out, out, tv[i].data[j].inlen)) {
959             fail ("aes-cfb, encrypt mismatch entry %d:%d\n", i, j);
960           }
961           err = gcry_cipher_decrypt (hdd, out, tv[i].data[j].inlen, NULL, 0);
962           if (err)
963             {
964               fail ("aes-cfb, gcry_cipher_decrypt (%d, %d) failed: %s\n",
965                     i, j, gpg_strerror (err));
966               gcry_cipher_close (hde);
967               gcry_cipher_close (hdd);
968               return;
969             }
970
971           if (memcmp (tv[i].data[j].plaintext, out, tv[i].data[j].inlen))
972             fail ("aes-cfb, decrypt mismatch entry %d:%d\n", i, j);
973         }
974
975       gcry_cipher_close (hde);
976       gcry_cipher_close (hdd);
977     }
978   if (verbose)
979     fprintf (stderr, "  Completed CFB checks.\n");
980 }
981
982 static void
983 check_ofb_cipher (void)
984 {
985   static const struct tv
986   {
987     int algo;
988     char key[MAX_DATA_LEN];
989     char iv[MAX_DATA_LEN];
990     struct data
991     {
992       unsigned char plaintext[MAX_DATA_LEN];
993       int inlen;
994       char out[MAX_DATA_LEN];
995     }
996     data[MAX_DATA_LEN];
997   } tv[] =
998     {
999       /* http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf */
1000       { GCRY_CIPHER_AES,
1001         "\x2b\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c",
1002         "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
1003         { { "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96\xe9\x3d\x7e\x11\x73\x93\x17\x2a",
1004             16,
1005             "\x3b\x3f\xd9\x2e\xb7\x2d\xad\x20\x33\x34\x49\xf8\xe8\x3c\xfb\x4a" },
1006           { "\xae\x2d\x8a\x57\x1e\x03\xac\x9c\x9e\xb7\x6f\xac\x45\xaf\x8e\x51",
1007             16,
1008             "\x77\x89\x50\x8d\x16\x91\x8f\x03\xf5\x3c\x52\xda\xc5\x4e\xd8\x25"},
1009           { "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11\xe5\xfb\xc1\x19\x1a\x0a\x52\xef",
1010             16,
1011             "\x97\x40\x05\x1e\x9c\x5f\xec\xf6\x43\x44\xf7\xa8\x22\x60\xed\xcc" },
1012           { "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
1013             16,
1014             "\x30\x4c\x65\x28\xf6\x59\xc7\x78\x66\xa5\x10\xd9\xc1\xd6\xae\x5e" },
1015         }
1016       },
1017       { GCRY_CIPHER_AES192,
1018         "\x8e\x73\xb0\xf7\xda\x0e\x64\x52\xc8\x10\xf3\x2b"
1019         "\x80\x90\x79\xe5\x62\xf8\xea\xd2\x52\x2c\x6b\x7b",
1020         "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
1021         { { "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96\xe9\x3d\x7e\x11\x73\x93\x17\x2a",
1022             16,
1023             "\xcd\xc8\x0d\x6f\xdd\xf1\x8c\xab\x34\xc2\x59\x09\xc9\x9a\x41\x74" },
1024           { "\xae\x2d\x8a\x57\x1e\x03\xac\x9c\x9e\xb7\x6f\xac\x45\xaf\x8e\x51",
1025             16,
1026             "\xfc\xc2\x8b\x8d\x4c\x63\x83\x7c\x09\xe8\x17\x00\xc1\x10\x04\x01" },
1027           { "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11\xe5\xfb\xc1\x19\x1a\x0a\x52\xef",
1028             16,
1029             "\x8d\x9a\x9a\xea\xc0\xf6\x59\x6f\x55\x9c\x6d\x4d\xaf\x59\xa5\xf2" },
1030           { "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
1031             16,
1032             "\x6d\x9f\x20\x08\x57\xca\x6c\x3e\x9c\xac\x52\x4b\xd9\xac\xc9\x2a" },
1033         }
1034       },
1035       { GCRY_CIPHER_AES256,
1036         "\x60\x3d\xeb\x10\x15\xca\x71\xbe\x2b\x73\xae\xf0\x85\x7d\x77\x81"
1037         "\x1f\x35\x2c\x07\x3b\x61\x08\xd7\x2d\x98\x10\xa3\x09\x14\xdf\xf4",
1038         "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
1039         { { "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96\xe9\x3d\x7e\x11\x73\x93\x17\x2a",
1040             16,
1041             "\xdc\x7e\x84\xbf\xda\x79\x16\x4b\x7e\xcd\x84\x86\x98\x5d\x38\x60" },
1042           { "\xae\x2d\x8a\x57\x1e\x03\xac\x9c\x9e\xb7\x6f\xac\x45\xaf\x8e\x51",
1043             16,
1044             "\x4f\xeb\xdc\x67\x40\xd2\x0b\x3a\xc8\x8f\x6a\xd8\x2a\x4f\xb0\x8d" },
1045           { "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11\xe5\xfb\xc1\x19\x1a\x0a\x52\xef",
1046             16,
1047             "\x71\xab\x47\xa0\x86\xe8\x6e\xed\xf3\x9d\x1c\x5b\xba\x97\xc4\x08" },
1048           { "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
1049             16,
1050             "\x01\x26\x14\x1d\x67\xf3\x7b\xe8\x53\x8f\x5a\x8b\xe7\x40\xe4\x84" }
1051         }
1052       }
1053     };
1054   gcry_cipher_hd_t hde, hdd;
1055   unsigned char out[MAX_DATA_LEN];
1056   int i, j, keylen, blklen;
1057   gcry_error_t err = 0;
1058
1059   if (verbose)
1060     fprintf (stderr, "  Starting OFB checks.\n");
1061
1062   for (i = 0; i < sizeof (tv) / sizeof (tv[0]); i++)
1063     {
1064       if (verbose)
1065         fprintf (stderr, "    checking OFB mode for %s [%i]\n",
1066                  gcry_cipher_algo_name (tv[i].algo),
1067                  tv[i].algo);
1068       err = gcry_cipher_open (&hde, tv[i].algo, GCRY_CIPHER_MODE_OFB, 0);
1069       if (!err)
1070         err = gcry_cipher_open (&hdd, tv[i].algo, GCRY_CIPHER_MODE_OFB, 0);
1071       if (err)
1072         {
1073           fail ("aes-ofb, gcry_cipher_open failed: %s\n", gpg_strerror (err));
1074           return;
1075         }
1076
1077       keylen = gcry_cipher_get_algo_keylen(tv[i].algo);
1078       if (!keylen)
1079         {
1080           fail ("aes-ofb, gcry_cipher_get_algo_keylen failed\n");
1081           return;
1082         }
1083
1084       err = gcry_cipher_setkey (hde, tv[i].key, keylen);
1085       if (!err)
1086         err = gcry_cipher_setkey (hdd, tv[i].key, keylen);
1087       if (err)
1088         {
1089           fail ("aes-ofb, gcry_cipher_setkey failed: %s\n",
1090                 gpg_strerror (err));
1091           gcry_cipher_close (hde);
1092           gcry_cipher_close (hdd);
1093           return;
1094         }
1095
1096       blklen = gcry_cipher_get_algo_blklen(tv[i].algo);
1097       if (!blklen)
1098         {
1099           fail ("aes-ofb, gcry_cipher_get_algo_blklen failed\n");
1100           return;
1101         }
1102
1103       err = gcry_cipher_setiv (hde, tv[i].iv, blklen);
1104       if (!err)
1105         err = gcry_cipher_setiv (hdd, tv[i].iv, blklen);
1106       if (err)
1107         {
1108           fail ("aes-ofb, gcry_cipher_setiv failed: %s\n",
1109                 gpg_strerror (err));
1110           gcry_cipher_close (hde);
1111           gcry_cipher_close (hdd);
1112           return;
1113         }
1114
1115       for (j = 0; tv[i].data[j].inlen; j++)
1116         {
1117           err = gcry_cipher_encrypt (hde, out, MAX_DATA_LEN,
1118                                      tv[i].data[j].plaintext,
1119                                      tv[i].data[j].inlen);
1120           if (err)
1121             {
1122               fail ("aes-ofb, gcry_cipher_encrypt (%d, %d) failed: %s\n",
1123                     i, j, gpg_strerror (err));
1124               gcry_cipher_close (hde);
1125               gcry_cipher_close (hdd);
1126               return;
1127             }
1128
1129           if (memcmp (tv[i].data[j].out, out, tv[i].data[j].inlen))
1130             fail ("aes-ofb, encrypt mismatch entry %d:%d\n", i, j);
1131
1132           err = gcry_cipher_decrypt (hdd, out, tv[i].data[j].inlen, NULL, 0);
1133           if (err)
1134             {
1135               fail ("aes-ofb, gcry_cipher_decrypt (%d, %d) failed: %s\n",
1136                     i, j, gpg_strerror (err));
1137               gcry_cipher_close (hde);
1138               gcry_cipher_close (hdd);
1139               return;
1140             }
1141
1142           if (memcmp (tv[i].data[j].plaintext, out, tv[i].data[j].inlen))
1143             fail ("aes-ofb, decrypt mismatch entry %d:%d\n", i, j);
1144         }
1145
1146       err = gcry_cipher_reset(hde);
1147       if (!err)
1148         err = gcry_cipher_reset(hdd);
1149       if (err)
1150         {
1151           fail ("aes-ofb, gcry_cipher_reset (%d, %d) failed: %s\n",
1152                 i, j, gpg_strerror (err));
1153           gcry_cipher_close (hde);
1154           gcry_cipher_close (hdd);
1155           return;
1156         }
1157
1158       /* gcry_cipher_reset clears the IV */
1159       err = gcry_cipher_setiv (hde, tv[i].iv, blklen);
1160       if (!err)
1161         err = gcry_cipher_setiv (hdd, tv[i].iv, blklen);
1162       if (err)
1163         {
1164           fail ("aes-ofb, gcry_cipher_setiv failed: %s\n",
1165                 gpg_strerror (err));
1166           gcry_cipher_close (hde);
1167           gcry_cipher_close (hdd);
1168           return;
1169         }
1170
1171       /* this time we encrypt and decrypt one byte at a time */
1172       for (j = 0; tv[i].data[j].inlen; j++)
1173         {
1174           int byteNum;
1175           for (byteNum = 0; byteNum < tv[i].data[j].inlen; ++byteNum)
1176             {
1177               err = gcry_cipher_encrypt (hde, out+byteNum, 1,
1178                                          (tv[i].data[j].plaintext) + byteNum,
1179                                          1);
1180               if (err)
1181                 {
1182                   fail ("aes-ofb, gcry_cipher_encrypt (%d, %d) failed: %s\n",
1183                         i, j, gpg_strerror (err));
1184                   gcry_cipher_close (hde);
1185                   gcry_cipher_close (hdd);
1186                   return;
1187                 }
1188             }
1189
1190           if (memcmp (tv[i].data[j].out, out, tv[i].data[j].inlen))
1191             fail ("aes-ofb, encrypt mismatch entry %d:%d\n", i, j);
1192
1193           for (byteNum = 0; byteNum < tv[i].data[j].inlen; ++byteNum)
1194             {
1195               err = gcry_cipher_decrypt (hdd, out+byteNum, 1, NULL, 0);
1196               if (err)
1197                 {
1198                   fail ("aes-ofb, gcry_cipher_decrypt (%d, %d) failed: %s\n",
1199                         i, j, gpg_strerror (err));
1200                   gcry_cipher_close (hde);
1201                   gcry_cipher_close (hdd);
1202                   return;
1203                 }
1204             }
1205
1206           if (memcmp (tv[i].data[j].plaintext, out, tv[i].data[j].inlen))
1207             fail ("aes-ofb, decrypt mismatch entry %d:%d\n", i, j);
1208         }
1209
1210       gcry_cipher_close (hde);
1211       gcry_cipher_close (hdd);
1212     }
1213   if (verbose)
1214     fprintf (stderr, "  Completed OFB checks.\n");
1215 }
1216
1217 static void
1218 _check_gcm_cipher (unsigned int step)
1219 {
1220   struct tv
1221   {
1222     int algo;
1223     char key[MAX_DATA_LEN];
1224     char iv[MAX_DATA_LEN];
1225     int ivlen;
1226     unsigned char aad[MAX_DATA_LEN];
1227     int aadlen;
1228     unsigned char plaintext[MAX_DATA_LEN];
1229     int inlen;
1230     char out[MAX_DATA_LEN];
1231     char tag[MAX_DATA_LEN];
1232   } tv[] =
1233     {
1234       /* http://csrc.nist.gov/groups/ST/toolkit/BCM/documents/proposedmodes/gcm/gcm-revised-spec.pdf */
1235       { GCRY_CIPHER_AES,
1236         "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
1237         "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 12,
1238         "", 0,
1239         "",
1240         0,
1241         "",
1242         "\x58\xe2\xfc\xce\xfa\x7e\x30\x61\x36\x7f\x1d\x57\xa4\xe7\x45\x5a" },
1243       { GCRY_CIPHER_AES,
1244         "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
1245         "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 12,
1246         "", 0,
1247         "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
1248         16,
1249         "\x03\x88\xda\xce\x60\xb6\xa3\x92\xf3\x28\xc2\xb9\x71\xb2\xfe\x78",
1250         "\xab\x6e\x47\xd4\x2c\xec\x13\xbd\xf5\x3a\x67\xb2\x12\x57\xbd\xdf" },
1251       { GCRY_CIPHER_AES,
1252         "\xfe\xff\xe9\x92\x86\x65\x73\x1c\x6d\x6a\x8f\x94\x67\x30\x83\x08",
1253         "\xca\xfe\xba\xbe\xfa\xce\xdb\xad\xde\xca\xf8\x88", 12,
1254         "", 0,
1255         "\xd9\x31\x32\x25\xf8\x84\x06\xe5\xa5\x59\x09\xc5\xaf\xf5\x26\x9a"
1256         "\x86\xa7\xa9\x53\x15\x34\xf7\xda\x2e\x4c\x30\x3d\x8a\x31\x8a\x72"
1257         "\x1c\x3c\x0c\x95\x95\x68\x09\x53\x2f\xcf\x0e\x24\x49\xa6\xb5\x25"
1258         "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57\xba\x63\x7b\x39\x1a\xaf\xd2\x55",
1259         64,
1260         "\x42\x83\x1e\xc2\x21\x77\x74\x24\x4b\x72\x21\xb7\x84\xd0\xd4\x9c"
1261         "\xe3\xaa\x21\x2f\x2c\x02\xa4\xe0\x35\xc1\x7e\x23\x29\xac\xa1\x2e"
1262         "\x21\xd5\x14\xb2\x54\x66\x93\x1c\x7d\x8f\x6a\x5a\xac\x84\xaa\x05"
1263         "\x1b\xa3\x0b\x39\x6a\x0a\xac\x97\x3d\x58\xe0\x91\x47\x3f\x59\x85",
1264         "\x4d\x5c\x2a\xf3\x27\xcd\x64\xa6\x2c\xf3\x5a\xbd\x2b\xa6\xfa\xb4" },
1265       { GCRY_CIPHER_AES,
1266         "\xfe\xff\xe9\x92\x86\x65\x73\x1c\x6d\x6a\x8f\x94\x67\x30\x83\x08",
1267         "\xca\xfe\xba\xbe\xfa\xce\xdb\xad\xde\xca\xf8\x88", 12,
1268         "\xfe\xed\xfa\xce\xde\xad\xbe\xef\xfe\xed\xfa\xce\xde\xad\xbe\xef"
1269         "\xab\xad\xda\xd2", 20,
1270         "\xd9\x31\x32\x25\xf8\x84\x06\xe5\xa5\x59\x09\xc5\xaf\xf5\x26\x9a"
1271         "\x86\xa7\xa9\x53\x15\x34\xf7\xda\x2e\x4c\x30\x3d\x8a\x31\x8a\x72"
1272         "\x1c\x3c\x0c\x95\x95\x68\x09\x53\x2f\xcf\x0e\x24\x49\xa6\xb5\x25"
1273         "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57\xba\x63\x7b\x39",
1274         60,
1275         "\x42\x83\x1e\xc2\x21\x77\x74\x24\x4b\x72\x21\xb7\x84\xd0\xd4\x9c"
1276         "\xe3\xaa\x21\x2f\x2c\x02\xa4\xe0\x35\xc1\x7e\x23\x29\xac\xa1\x2e"
1277         "\x21\xd5\x14\xb2\x54\x66\x93\x1c\x7d\x8f\x6a\x5a\xac\x84\xaa\x05"
1278         "\x1b\xa3\x0b\x39\x6a\x0a\xac\x97\x3d\x58\xe0\x91\x47\x3f\x59\x85",
1279         "\x5b\xc9\x4f\xbc\x32\x21\xa5\xdb\x94\xfa\xe9\x5a\xe7\x12\x1a\x47" },
1280       { GCRY_CIPHER_AES,
1281         "\xfe\xff\xe9\x92\x86\x65\x73\x1c\x6d\x6a\x8f\x94\x67\x30\x83\x08",
1282         "\xca\xfe\xba\xbe\xfa\xce\xdb\xad", 8,
1283         "\xfe\xed\xfa\xce\xde\xad\xbe\xef\xfe\xed\xfa\xce\xde\xad\xbe\xef"
1284         "\xab\xad\xda\xd2", 20,
1285         "\xd9\x31\x32\x25\xf8\x84\x06\xe5\xa5\x59\x09\xc5\xaf\xf5\x26\x9a"
1286         "\x86\xa7\xa9\x53\x15\x34\xf7\xda\x2e\x4c\x30\x3d\x8a\x31\x8a\x72"
1287         "\x1c\x3c\x0c\x95\x95\x68\x09\x53\x2f\xcf\x0e\x24\x49\xa6\xb5\x25"
1288         "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57\xba\x63\x7b\x39",
1289         60,
1290         "\x61\x35\x3b\x4c\x28\x06\x93\x4a\x77\x7f\xf5\x1f\xa2\x2a\x47\x55"
1291         "\x69\x9b\x2a\x71\x4f\xcd\xc6\xf8\x37\x66\xe5\xf9\x7b\x6c\x74\x23"
1292         "\x73\x80\x69\x00\xe4\x9f\x24\xb2\x2b\x09\x75\x44\xd4\x89\x6b\x42"
1293         "\x49\x89\xb5\xe1\xeb\xac\x0f\x07\xc2\x3f\x45\x98",
1294         "\x36\x12\xd2\xe7\x9e\x3b\x07\x85\x56\x1b\xe1\x4a\xac\xa2\xfc\xcb" },
1295       { GCRY_CIPHER_AES,
1296         "\xfe\xff\xe9\x92\x86\x65\x73\x1c\x6d\x6a\x8f\x94\x67\x30\x83\x08",
1297         "\x93\x13\x22\x5d\xf8\x84\x06\xe5\x55\x90\x9c\x5a\xff\x52\x69\xaa"
1298         "\x6a\x7a\x95\x38\x53\x4f\x7d\xa1\xe4\xc3\x03\xd2\xa3\x18\xa7\x28"
1299         "\xc3\xc0\xc9\x51\x56\x80\x95\x39\xfc\xf0\xe2\x42\x9a\x6b\x52\x54"
1300         "\x16\xae\xdb\xf5\xa0\xde\x6a\x57\xa6\x37\xb3\x9b", 60,
1301         "\xfe\xed\xfa\xce\xde\xad\xbe\xef\xfe\xed\xfa\xce\xde\xad\xbe\xef"
1302         "\xab\xad\xda\xd2", 20,
1303         "\xd9\x31\x32\x25\xf8\x84\x06\xe5\xa5\x59\x09\xc5\xaf\xf5\x26\x9a"
1304         "\x86\xa7\xa9\x53\x15\x34\xf7\xda\x2e\x4c\x30\x3d\x8a\x31\x8a\x72"
1305         "\x1c\x3c\x0c\x95\x95\x68\x09\x53\x2f\xcf\x0e\x24\x49\xa6\xb5\x25"
1306         "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57\xba\x63\x7b\x39",
1307         60,
1308         "\x8c\xe2\x49\x98\x62\x56\x15\xb6\x03\xa0\x33\xac\xa1\x3f\xb8\x94"
1309         "\xbe\x91\x12\xa5\xc3\xa2\x11\xa8\xba\x26\x2a\x3c\xca\x7e\x2c\xa7"
1310         "\x01\xe4\xa9\xa4\xfb\xa4\x3c\x90\xcc\xdc\xb2\x81\xd4\x8c\x7c\x6f"
1311         "\xd6\x28\x75\xd2\xac\xa4\x17\x03\x4c\x34\xae\xe5",
1312         "\x61\x9c\xc5\xae\xff\xfe\x0b\xfa\x46\x2a\xf4\x3c\x16\x99\xd0\x50" },
1313       { GCRY_CIPHER_AES192,
1314         "\xfe\xff\xe9\x92\x86\x65\x73\x1c\x6d\x6a\x8f\x94\x67\x30\x83\x08"
1315         "\xfe\xff\xe9\x92\x86\x65\x73\x1c",
1316         "\x93\x13\x22\x5d\xf8\x84\x06\xe5\x55\x90\x9c\x5a\xff\x52\x69\xaa"
1317         "\x6a\x7a\x95\x38\x53\x4f\x7d\xa1\xe4\xc3\x03\xd2\xa3\x18\xa7\x28"
1318         "\xc3\xc0\xc9\x51\x56\x80\x95\x39\xfc\xf0\xe2\x42\x9a\x6b\x52\x54"
1319         "\x16\xae\xdb\xf5\xa0\xde\x6a\x57\xa6\x37\xb3\x9b", 60,
1320         "\xfe\xed\xfa\xce\xde\xad\xbe\xef\xfe\xed\xfa\xce\xde\xad\xbe\xef"
1321         "\xab\xad\xda\xd2", 20,
1322         "\xd9\x31\x32\x25\xf8\x84\x06\xe5\xa5\x59\x09\xc5\xaf\xf5\x26\x9a"
1323         "\x86\xa7\xa9\x53\x15\x34\xf7\xda\x2e\x4c\x30\x3d\x8a\x31\x8a\x72"
1324         "\x1c\x3c\x0c\x95\x95\x68\x09\x53\x2f\xcf\x0e\x24\x49\xa6\xb5\x25"
1325         "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57\xba\x63\x7b\x39",
1326         60,
1327         "\xd2\x7e\x88\x68\x1c\xe3\x24\x3c\x48\x30\x16\x5a\x8f\xdc\xf9\xff"
1328         "\x1d\xe9\xa1\xd8\xe6\xb4\x47\xef\x6e\xf7\xb7\x98\x28\x66\x6e\x45"
1329         "\x81\xe7\x90\x12\xaf\x34\xdd\xd9\xe2\xf0\x37\x58\x9b\x29\x2d\xb3"
1330         "\xe6\x7c\x03\x67\x45\xfa\x22\xe7\xe9\xb7\x37\x3b",
1331         "\xdc\xf5\x66\xff\x29\x1c\x25\xbb\xb8\x56\x8f\xc3\xd3\x76\xa6\xd9" },
1332       { GCRY_CIPHER_AES256,
1333         "\xfe\xff\xe9\x92\x86\x65\x73\x1c\x6d\x6a\x8f\x94\x67\x30\x83\x08"
1334         "\xfe\xff\xe9\x92\x86\x65\x73\x1c\x6d\x6a\x8f\x94\x67\x30\x83\x08",
1335         "\x93\x13\x22\x5d\xf8\x84\x06\xe5\x55\x90\x9c\x5a\xff\x52\x69\xaa"
1336         "\x6a\x7a\x95\x38\x53\x4f\x7d\xa1\xe4\xc3\x03\xd2\xa3\x18\xa7\x28"
1337         "\xc3\xc0\xc9\x51\x56\x80\x95\x39\xfc\xf0\xe2\x42\x9a\x6b\x52\x54"
1338         "\x16\xae\xdb\xf5\xa0\xde\x6a\x57\xa6\x37\xb3\x9b", 60,
1339         "\xfe\xed\xfa\xce\xde\xad\xbe\xef\xfe\xed\xfa\xce\xde\xad\xbe\xef"
1340         "\xab\xad\xda\xd2", 20,
1341         "\xd9\x31\x32\x25\xf8\x84\x06\xe5\xa5\x59\x09\xc5\xaf\xf5\x26\x9a"
1342         "\x86\xa7\xa9\x53\x15\x34\xf7\xda\x2e\x4c\x30\x3d\x8a\x31\x8a\x72"
1343         "\x1c\x3c\x0c\x95\x95\x68\x09\x53\x2f\xcf\x0e\x24\x49\xa6\xb5\x25"
1344         "\xb1\x6a\xed\xf5\xaa\x0d\xe6\x57\xba\x63\x7b\x39",
1345         60,
1346         "\x5a\x8d\xef\x2f\x0c\x9e\x53\xf1\xf7\x5d\x78\x53\x65\x9e\x2a\x20"
1347         "\xee\xb2\xb2\x2a\xaf\xde\x64\x19\xa0\x58\xab\x4f\x6f\x74\x6b\xf4"
1348         "\x0f\xc0\xc3\xb7\x80\xf2\x44\x45\x2d\xa3\xeb\xf1\xc5\xd8\x2c\xde"
1349         "\xa2\x41\x89\x97\x20\x0e\xf8\x2e\x44\xae\x7e\x3f",
1350         "\xa4\x4a\x82\x66\xee\x1c\x8e\xb0\xc8\xb5\xd4\xcf\x5a\xe9\xf1\x9a" }
1351     };
1352
1353   gcry_cipher_hd_t hde, hdd;
1354   unsigned char out[MAX_DATA_LEN];
1355   unsigned char tag[GCRY_GCM_BLOCK_LEN];
1356   int i, keylen;
1357   gcry_error_t err = 0;
1358   size_t pos, poslen;
1359   int byteNum;
1360
1361   if (verbose)
1362     fprintf (stderr, "  Starting GCM checks.\n");
1363
1364   for (i = 0; i < sizeof (tv) / sizeof (tv[0]); i++)
1365     {
1366       if (verbose)
1367         fprintf (stderr, "    checking GCM mode for %s [%i]\n",
1368                  gcry_cipher_algo_name (tv[i].algo),
1369                  tv[i].algo);
1370       err = gcry_cipher_open (&hde, tv[i].algo, GCRY_CIPHER_MODE_GCM, 0);
1371       if (!err)
1372         err = gcry_cipher_open (&hdd, tv[i].algo, GCRY_CIPHER_MODE_GCM, 0);
1373       if (err)
1374         {
1375           fail ("aes-gcm, gcry_cipher_open failed: %s\n", gpg_strerror (err));
1376           return;
1377         }
1378
1379       keylen = gcry_cipher_get_algo_keylen(tv[i].algo);
1380       if (!keylen)
1381         {
1382           fail ("aes-gcm, gcry_cipher_get_algo_keylen failed\n");
1383           return;
1384         }
1385
1386       err = gcry_cipher_setkey (hde, tv[i].key, keylen);
1387       if (!err)
1388         err = gcry_cipher_setkey (hdd, tv[i].key, keylen);
1389       if (err)
1390         {
1391           fail ("aes-gcm, gcry_cipher_setkey failed: %s\n",
1392                 gpg_strerror (err));
1393           gcry_cipher_close (hde);
1394           gcry_cipher_close (hdd);
1395           return;
1396         }
1397
1398       err = gcry_cipher_setiv (hde, tv[i].iv, tv[i].ivlen);
1399       if (!err)
1400         err = gcry_cipher_setiv (hdd, tv[i].iv, tv[i].ivlen);
1401       if (err)
1402         {
1403           fail ("aes-gcm, gcry_cipher_setiv failed: %s\n",
1404                 gpg_strerror (err));
1405           gcry_cipher_close (hde);
1406           gcry_cipher_close (hdd);
1407           return;
1408         }
1409
1410       for (pos = 0; pos < tv[i].aadlen; pos += step)
1411         {
1412           poslen = (pos + step < tv[i].aadlen) ? step : tv[i].aadlen - pos;
1413
1414           err = gcry_cipher_authenticate(hde, tv[i].aad + pos, poslen);
1415           if (err)
1416             {
1417               fail ("aes-gcm, gcry_cipher_authenticate (%d) (%d:%d) failed: "
1418                     "%s\n", i, pos, step, gpg_strerror (err));
1419               gcry_cipher_close (hde);
1420               gcry_cipher_close (hdd);
1421               return;
1422             }
1423           err = gcry_cipher_authenticate(hdd, tv[i].aad + pos, poslen);
1424           if (err)
1425             {
1426               fail ("aes-gcm, de gcry_cipher_authenticate (%d) (%d:%d) failed: "
1427                     "%s\n", i, pos, step, gpg_strerror (err));
1428               gcry_cipher_close (hde);
1429               gcry_cipher_close (hdd);
1430               return;
1431             }
1432         }
1433
1434       for (pos = 0; pos < tv[i].inlen; pos += step)
1435         {
1436           poslen = (pos + step < tv[i].inlen) ? step : tv[i].inlen - pos;
1437
1438           err = gcry_cipher_encrypt (hde, out + pos, poslen,
1439                                      tv[i].plaintext + pos, poslen);
1440           if (err)
1441             {
1442               fail ("aes-gcm, gcry_cipher_encrypt (%d) (%d:%d) failed: %s\n",
1443                     i, pos, step, gpg_strerror (err));
1444               gcry_cipher_close (hde);
1445               gcry_cipher_close (hdd);
1446               return;
1447             }
1448         }
1449
1450       if (memcmp (tv[i].out, out, tv[i].inlen))
1451         fail ("aes-gcm, encrypt mismatch entry %d (step %d)\n", i, step);
1452
1453       for (pos = 0; pos < tv[i].inlen; pos += step)
1454         {
1455           poslen = (pos + step < tv[i].inlen) ? step : tv[i].inlen - pos;
1456
1457           err = gcry_cipher_decrypt (hdd, out + pos, poslen, NULL, 0);
1458           if (err)
1459             {
1460               fail ("aes-gcm, gcry_cipher_decrypt (%d) (%d:%d) failed: %s\n",
1461                     i, pos, step, gpg_strerror (err));
1462               gcry_cipher_close (hde);
1463               gcry_cipher_close (hdd);
1464               return;
1465             }
1466         }
1467
1468       if (memcmp (tv[i].plaintext, out, tv[i].inlen))
1469         fail ("aes-gcm, decrypt mismatch entry %d (step %d)\n", i, step);
1470
1471       err = gcry_cipher_gettag (hde, out, GCRY_GCM_BLOCK_LEN);
1472       if (err)
1473         {
1474           fail ("aes-gcm, gcry_cipher_gettag(%d) failed: %s\n",
1475                 i, gpg_strerror (err));
1476           gcry_cipher_close (hde);
1477           gcry_cipher_close (hdd);
1478           return;
1479         }
1480
1481       if (memcmp (tv[i].tag, out, GCRY_GCM_BLOCK_LEN))
1482         fail ("aes-gcm, encrypt tag mismatch entry %d\n", i);
1483
1484
1485       err = gcry_cipher_checktag (hdd, out, GCRY_GCM_BLOCK_LEN);
1486       if (err)
1487         {
1488           fail ("aes-gcm, gcry_cipher_checktag(%d) failed: %s\n",
1489                 i, gpg_strerror (err));
1490           gcry_cipher_close (hde);
1491           gcry_cipher_close (hdd);
1492           return;
1493         }
1494
1495       err = gcry_cipher_reset(hde);
1496       if (!err)
1497         err = gcry_cipher_reset(hdd);
1498       if (err)
1499         {
1500           fail ("aes-gcm, gcry_cipher_reset (%d) failed: %s\n",
1501                 i, gpg_strerror (err));
1502           gcry_cipher_close (hde);
1503           gcry_cipher_close (hdd);
1504           return;
1505         }
1506
1507       /* gcry_cipher_reset clears the IV */
1508       err = gcry_cipher_setiv (hde, tv[i].iv, tv[i].ivlen);
1509       if (!err)
1510         err = gcry_cipher_setiv (hdd, tv[i].iv, tv[i].ivlen);
1511       if (err)
1512         {
1513           fail ("aes-gcm, gcry_cipher_setiv failed: %s\n",
1514                 gpg_strerror (err));
1515           gcry_cipher_close (hde);
1516           gcry_cipher_close (hdd);
1517           return;
1518         }
1519
1520       /* this time we authenticate, encrypt and decrypt one byte at a time */
1521       for (byteNum = 0; byteNum < tv[i].aadlen; ++byteNum)
1522         {
1523           err = gcry_cipher_authenticate(hde, tv[i].aad + byteNum, 1);
1524           if (err)
1525             {
1526               fail ("aes-gcm, gcry_cipher_authenticate (%d) (byte-buf) failed: "
1527                     "%s\n", i, gpg_strerror (err));
1528               gcry_cipher_close (hde);
1529               gcry_cipher_close (hdd);
1530               return;
1531             }
1532           err = gcry_cipher_authenticate(hdd, tv[i].aad + byteNum, 1);
1533           if (err)
1534             {
1535               fail ("aes-gcm, de gcry_cipher_authenticate (%d) (byte-buf) "
1536                     "failed: %s\n", i, gpg_strerror (err));
1537               gcry_cipher_close (hde);
1538               gcry_cipher_close (hdd);
1539               return;
1540             }
1541         }
1542
1543       for (byteNum = 0; byteNum < tv[i].inlen; ++byteNum)
1544         {
1545           err = gcry_cipher_encrypt (hde, out+byteNum, 1,
1546                                      (tv[i].plaintext) + byteNum,
1547                                      1);
1548           if (err)
1549             {
1550               fail ("aes-gcm, gcry_cipher_encrypt (%d) (byte-buf) failed: %s\n",
1551                     i,  gpg_strerror (err));
1552               gcry_cipher_close (hde);
1553               gcry_cipher_close (hdd);
1554               return;
1555             }
1556         }
1557
1558       if (memcmp (tv[i].out, out, tv[i].inlen))
1559         fail ("aes-gcm, encrypt mismatch entry %d, (byte-buf)\n", i);
1560
1561       err = gcry_cipher_gettag (hde, tag, GCRY_GCM_BLOCK_LEN);
1562       if (err)
1563         {
1564           fail ("aes-gcm, gcry_cipher_gettag(%d) (byte-buf) failed: %s\n",
1565                 i, gpg_strerror (err));
1566           gcry_cipher_close (hde);
1567           gcry_cipher_close (hdd);
1568           return;
1569         }
1570
1571       if (memcmp (tv[i].tag, tag, GCRY_GCM_BLOCK_LEN))
1572         fail ("aes-gcm, encrypt tag mismatch entry %d, (byte-buf)\n", i);
1573
1574       for (byteNum = 0; byteNum < tv[i].inlen; ++byteNum)
1575         {
1576           err = gcry_cipher_decrypt (hdd, out+byteNum, 1, NULL, 0);
1577           if (err)
1578             {
1579               fail ("aes-gcm, gcry_cipher_decrypt (%d) (byte-buf) failed: %s\n",
1580                     i, gpg_strerror (err));
1581               gcry_cipher_close (hde);
1582               gcry_cipher_close (hdd);
1583               return;
1584             }
1585         }
1586
1587       if (memcmp (tv[i].plaintext, out, tv[i].inlen))
1588         fail ("aes-gcm, decrypt mismatch entry %d\n", i);
1589
1590       err = gcry_cipher_checktag (hdd, tag, GCRY_GCM_BLOCK_LEN);
1591       if (err)
1592         {
1593           fail ("aes-gcm, gcry_cipher_checktag(%d) (byte-buf) failed: %s\n",
1594                 i, gpg_strerror (err));
1595           gcry_cipher_close (hde);
1596           gcry_cipher_close (hdd);
1597           return;
1598         }
1599
1600       gcry_cipher_close (hde);
1601       gcry_cipher_close (hdd);
1602     }
1603   if (verbose)
1604     fprintf (stderr, "  Completed GCM checks.\n");
1605 }
1606
1607
1608 static void
1609 check_gcm_cipher (void)
1610 {
1611   /* Large buffers, no splitting. */
1612   _check_gcm_cipher(0xffffffff);
1613   /* Split input to one byte buffers. */
1614   _check_gcm_cipher(1);
1615   /* Split input to 7 byte buffers. */
1616   _check_gcm_cipher(7);
1617   /* Split input to 16 byte buffers. */
1618   _check_gcm_cipher(16);
1619 }
1620
1621
1622 static void
1623 _check_poly1305_cipher (unsigned int step)
1624 {
1625   struct tv
1626   {
1627     int algo;
1628     char key[MAX_DATA_LEN];
1629     char iv[MAX_DATA_LEN];
1630     int ivlen;
1631     unsigned char aad[MAX_DATA_LEN];
1632     int aadlen;
1633     unsigned char plaintext[MAX_DATA_LEN];
1634     int inlen;
1635     char out[MAX_DATA_LEN];
1636     char tag[MAX_DATA_LEN];
1637   } tv[] =
1638     {
1639       /* draft-agl-tls-chacha20poly1305-04 */
1640       { GCRY_CIPHER_CHACHA20,
1641         "\x42\x90\xbc\xb1\x54\x17\x35\x31\xf3\x14\xaf\x57\xf3\xbe\x3b\x50"
1642         "\x06\xda\x37\x1e\xce\x27\x2a\xfa\x1b\x5d\xbd\xd1\x10\x0a\x10\x07",
1643         "\xcd\x7c\xf6\x7b\xe3\x9c\x79\x4a", 8,
1644         "\x87\xe2\x29\xd4\x50\x08\x45\xa0\x79\xc0", 10,
1645         "\x86\xd0\x99\x74\x84\x0b\xde\xd2\xa5\xca", 10,
1646         "\xe3\xe4\x46\xf7\xed\xe9\xa1\x9b\x62\xa4",
1647         "\x67\x7d\xab\xf4\xe3\xd2\x4b\x87\x6b\xb2\x84\x75\x38\x96\xe1\xd6" },
1648       /* draft-nir-cfrg-chacha20-poly1305-03 */
1649       { GCRY_CIPHER_CHACHA20,
1650         "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
1651         "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f",
1652         "\x07\x00\x00\x00\x40\x41\x42\x43\x44\x45\x46\x47", 12,
1653         "\x50\x51\x52\x53\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7", 12,
1654         "Ladies and Gentlemen of the class of '99: If I could offer you "
1655         "only one tip for the future, sunscreen would be it.", 114,
1656         "\xd3\x1a\x8d\x34\x64\x8e\x60\xdb\x7b\x86\xaf\xbc\x53\xef\x7e\xc2"
1657         "\xa4\xad\xed\x51\x29\x6e\x08\xfe\xa9\xe2\xb5\xa7\x36\xee\x62\xd6"
1658         "\x3d\xbe\xa4\x5e\x8c\xa9\x67\x12\x82\xfa\xfb\x69\xda\x92\x72\x8b"
1659         "\x1a\x71\xde\x0a\x9e\x06\x0b\x29\x05\xd6\xa5\xb6\x7e\xcd\x3b\x36"
1660         "\x92\xdd\xbd\x7f\x2d\x77\x8b\x8c\x98\x03\xae\xe3\x28\x09\x1b\x58"
1661         "\xfa\xb3\x24\xe4\xfa\xd6\x75\x94\x55\x85\x80\x8b\x48\x31\xd7\xbc"
1662         "\x3f\xf4\xde\xf0\x8e\x4b\x7a\x9d\xe5\x76\xd2\x65\x86\xce\xc6\x4b"
1663         "\x61\x16",
1664         "\x18\xfb\x11\xa5\x03\x1a\xd1\x3a\x7e\x3b\x03\xd4\x6e\xe3\xa6\xa7" }
1665     };
1666
1667   gcry_cipher_hd_t hde, hdd;
1668   unsigned char out[MAX_DATA_LEN];
1669   unsigned char tag[16];
1670   int i, keylen;
1671   gcry_error_t err = 0;
1672   size_t pos, poslen;
1673   int byteNum;
1674
1675   if (verbose)
1676     fprintf (stderr, "  Starting POLY1305 checks.\n");
1677
1678   for (i = 0; i < sizeof (tv) / sizeof (tv[0]); i++)
1679     {
1680       if (verbose)
1681         fprintf (stderr, "    checking POLY1305 mode for %s [%i]\n",
1682                  gcry_cipher_algo_name (tv[i].algo),
1683                  tv[i].algo);
1684       err = gcry_cipher_open (&hde, tv[i].algo, GCRY_CIPHER_MODE_POLY1305, 0);
1685       if (!err)
1686         err = gcry_cipher_open (&hdd, tv[i].algo, GCRY_CIPHER_MODE_POLY1305, 0);
1687       if (err)
1688         {
1689           fail ("poly1305, gcry_cipher_open failed: %s\n", gpg_strerror (err));
1690           return;
1691         }
1692
1693       keylen = gcry_cipher_get_algo_keylen(tv[i].algo);
1694       if (!keylen)
1695         {
1696           fail ("poly1305, gcry_cipher_get_algo_keylen failed\n");
1697           return;
1698         }
1699
1700       err = gcry_cipher_setkey (hde, tv[i].key, keylen);
1701       if (!err)
1702         err = gcry_cipher_setkey (hdd, tv[i].key, keylen);
1703       if (err)
1704         {
1705           fail ("poly1305, gcry_cipher_setkey failed: %s\n",
1706                 gpg_strerror (err));
1707           gcry_cipher_close (hde);
1708           gcry_cipher_close (hdd);
1709           return;
1710         }
1711
1712       err = gcry_cipher_setiv (hde, tv[i].iv, tv[i].ivlen);
1713       if (!err)
1714         err = gcry_cipher_setiv (hdd, tv[i].iv, tv[i].ivlen);
1715       if (err)
1716         {
1717           fail ("poly1305, gcry_cipher_setiv failed: %s\n",
1718                 gpg_strerror (err));
1719           gcry_cipher_close (hde);
1720           gcry_cipher_close (hdd);
1721           return;
1722         }
1723
1724       for (pos = 0; pos < tv[i].aadlen; pos += step)
1725         {
1726           poslen = (pos + step < tv[i].aadlen) ? step : tv[i].aadlen - pos;
1727
1728           err = gcry_cipher_authenticate(hde, tv[i].aad + pos, poslen);
1729           if (err)
1730             {
1731               fail ("poly1305, gcry_cipher_authenticate (%d) (%d:%d) failed: "
1732                     "%s\n", i, pos, step, gpg_strerror (err));
1733               gcry_cipher_close (hde);
1734               gcry_cipher_close (hdd);
1735               return;
1736             }
1737           err = gcry_cipher_authenticate(hdd, tv[i].aad + pos, poslen);
1738           if (err)
1739             {
1740               fail ("poly1305, de gcry_cipher_authenticate (%d) (%d:%d) failed: "
1741                     "%s\n", i, pos, step, gpg_strerror (err));
1742               gcry_cipher_close (hde);
1743               gcry_cipher_close (hdd);
1744               return;
1745             }
1746         }
1747
1748       for (pos = 0; pos < tv[i].inlen; pos += step)
1749         {
1750           poslen = (pos + step < tv[i].inlen) ? step : tv[i].inlen - pos;
1751
1752           err = gcry_cipher_encrypt (hde, out + pos, poslen,
1753                                      tv[i].plaintext + pos, poslen);
1754           if (err)
1755             {
1756               fail ("poly1305, gcry_cipher_encrypt (%d) (%d:%d) failed: %s\n",
1757                     i, pos, step, gpg_strerror (err));
1758               gcry_cipher_close (hde);
1759               gcry_cipher_close (hdd);
1760               return;
1761             }
1762         }
1763
1764       if (memcmp (tv[i].out, out, tv[i].inlen))
1765         fail ("poly1305, encrypt mismatch entry %d (step %d)\n", i, step);
1766
1767       for (pos = 0; pos < tv[i].inlen; pos += step)
1768         {
1769           poslen = (pos + step < tv[i].inlen) ? step : tv[i].inlen - pos;
1770
1771           err = gcry_cipher_decrypt (hdd, out + pos, poslen, NULL, 0);
1772           if (err)
1773             {
1774               fail ("poly1305, gcry_cipher_decrypt (%d) (%d:%d) failed: %s\n",
1775                     i, pos, step, gpg_strerror (err));
1776               gcry_cipher_close (hde);
1777               gcry_cipher_close (hdd);
1778               return;
1779             }
1780         }
1781
1782       if (memcmp (tv[i].plaintext, out, tv[i].inlen))
1783         fail ("poly1305, decrypt mismatch entry %d (step %d)\n", i, step);
1784
1785       err = gcry_cipher_gettag (hde, out, 16);
1786       if (err)
1787         {
1788           fail ("poly1305, gcry_cipher_gettag(%d) failed: %s\n",
1789                 i, gpg_strerror (err));
1790           gcry_cipher_close (hde);
1791           gcry_cipher_close (hdd);
1792           return;
1793         }
1794
1795       if (memcmp (tv[i].tag, out, 16))
1796         fail ("poly1305, encrypt tag mismatch entry %d\n", i);
1797
1798
1799       err = gcry_cipher_checktag (hdd, out, 16);
1800       if (err)
1801         {
1802           fail ("poly1305, gcry_cipher_checktag(%d) failed: %s\n",
1803                 i, gpg_strerror (err));
1804           gcry_cipher_close (hde);
1805           gcry_cipher_close (hdd);
1806           return;
1807         }
1808
1809       err = gcry_cipher_reset(hde);
1810       if (!err)
1811         err = gcry_cipher_reset(hdd);
1812       if (err)
1813         {
1814           fail ("poly1305, gcry_cipher_reset (%d) failed: %s\n",
1815                 i, gpg_strerror (err));
1816           gcry_cipher_close (hde);
1817           gcry_cipher_close (hdd);
1818           return;
1819         }
1820
1821       /* gcry_cipher_reset clears the IV */
1822       err = gcry_cipher_setiv (hde, tv[i].iv, tv[i].ivlen);
1823       if (!err)
1824         err = gcry_cipher_setiv (hdd, tv[i].iv, tv[i].ivlen);
1825       if (err)
1826         {
1827           fail ("poly1305, gcry_cipher_setiv failed: %s\n",
1828                 gpg_strerror (err));
1829           gcry_cipher_close (hde);
1830           gcry_cipher_close (hdd);
1831           return;
1832         }
1833
1834       /* this time we authenticate, encrypt and decrypt one byte at a time */
1835       for (byteNum = 0; byteNum < tv[i].aadlen; ++byteNum)
1836         {
1837           err = gcry_cipher_authenticate(hde, tv[i].aad + byteNum, 1);
1838           if (err)
1839             {
1840               fail ("poly1305, gcry_cipher_authenticate (%d) (byte-buf) failed: "
1841                     "%s\n", i, gpg_strerror (err));
1842               gcry_cipher_close (hde);
1843               gcry_cipher_close (hdd);
1844               return;
1845             }
1846           err = gcry_cipher_authenticate(hdd, tv[i].aad + byteNum, 1);
1847           if (err)
1848             {
1849               fail ("poly1305, de gcry_cipher_authenticate (%d) (byte-buf) "
1850                     "failed: %s\n", i, gpg_strerror (err));
1851               gcry_cipher_close (hde);
1852               gcry_cipher_close (hdd);
1853               return;
1854             }
1855         }
1856
1857       for (byteNum = 0; byteNum < tv[i].inlen; ++byteNum)
1858         {
1859           err = gcry_cipher_encrypt (hde, out+byteNum, 1,
1860                                      (tv[i].plaintext) + byteNum,
1861                                      1);
1862           if (err)
1863             {
1864               fail ("poly1305, gcry_cipher_encrypt (%d) (byte-buf) failed: %s\n",
1865                     i,  gpg_strerror (err));
1866               gcry_cipher_close (hde);
1867               gcry_cipher_close (hdd);
1868               return;
1869             }
1870         }
1871
1872       if (memcmp (tv[i].out, out, tv[i].inlen))
1873         fail ("poly1305, encrypt mismatch entry %d, (byte-buf)\n", i);
1874
1875       err = gcry_cipher_gettag (hde, tag, 16);
1876       if (err)
1877         {
1878           fail ("poly1305, gcry_cipher_gettag(%d) (byte-buf) failed: %s\n",
1879                 i, gpg_strerror (err));
1880           gcry_cipher_close (hde);
1881           gcry_cipher_close (hdd);
1882           return;
1883         }
1884
1885       if (memcmp (tv[i].tag, tag, 16))
1886         fail ("poly1305, encrypt tag mismatch entry %d, (byte-buf)\n", i);
1887
1888       for (byteNum = 0; byteNum < tv[i].inlen; ++byteNum)
1889         {
1890           err = gcry_cipher_decrypt (hdd, out+byteNum, 1, NULL, 0);
1891           if (err)
1892             {
1893               fail ("poly1305, gcry_cipher_decrypt (%d) (byte-buf) failed: %s\n",
1894                     i, gpg_strerror (err));
1895               gcry_cipher_close (hde);
1896               gcry_cipher_close (hdd);
1897               return;
1898             }
1899         }
1900
1901       if (memcmp (tv[i].plaintext, out, tv[i].inlen))
1902         fail ("poly1305, decrypt mismatch entry %d\n", i);
1903
1904       err = gcry_cipher_checktag (hdd, tag, 16);
1905       if (err)
1906         {
1907           fail ("poly1305, gcry_cipher_checktag(%d) (byte-buf) failed: %s\n",
1908                 i, gpg_strerror (err));
1909           gcry_cipher_close (hde);
1910           gcry_cipher_close (hdd);
1911           return;
1912         }
1913
1914       gcry_cipher_close (hde);
1915       gcry_cipher_close (hdd);
1916     }
1917   if (verbose)
1918     fprintf (stderr, "  Completed POLY1305 checks.\n");
1919 }
1920
1921
1922 static void
1923 check_poly1305_cipher (void)
1924 {
1925   /* Large buffers, no splitting. */
1926   _check_poly1305_cipher(0xffffffff);
1927   /* Split input to one byte buffers. */
1928   _check_poly1305_cipher(1);
1929   /* Split input to 7 byte buffers. */
1930   _check_poly1305_cipher(7);
1931   /* Split input to 16 byte buffers. */
1932   _check_poly1305_cipher(16);
1933 }
1934
1935
1936 static void
1937 check_ccm_cipher (void)
1938 {
1939 #ifdef HAVE_U64_TYPEDEF
1940   static const struct tv
1941   {
1942     int algo;
1943     int keylen;
1944     const char *key;
1945     int noncelen;
1946     const char *nonce;
1947     int aadlen;
1948     const char *aad;
1949     int plainlen;
1950     const char *plaintext;
1951     int cipherlen;
1952     const char *ciphertext;
1953   } tv[] =
1954     {
1955       /* RFC 3610 */
1956       { GCRY_CIPHER_AES, /* Packet Vector #1 */
1957           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
1958           13, "\x00\x00\x00\x03\x02\x01\x00\xA0\xA1\xA2\xA3\xA4\xA5",
1959           8, "\x00\x01\x02\x03\x04\x05\x06\x07",
1960           23,
1961           "\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E",
1962           31,
1963           "\x58\x8C\x97\x9A\x61\xC6\x63\xD2\xF0\x66\xD0\xC2\xC0\xF9\x89\x80\x6D\x5F\x6B\x61\xDA\xC3\x84\x17\xE8\xD1\x2C\xFD\xF9\x26\xE0"},
1964       { GCRY_CIPHER_AES, /* Packet Vector #2 */
1965           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
1966           13, "\x00\x00\x00\x04\x03\x02\x01\xA0\xA1\xA2\xA3\xA4\xA5",
1967           8, "\x00\x01\x02\x03\x04\x05\x06\x07",
1968           24,
1969           "\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F",
1970           32,
1971           "\x72\xC9\x1A\x36\xE1\x35\xF8\xCF\x29\x1C\xA8\x94\x08\x5C\x87\xE3\xCC\x15\xC4\x39\xC9\xE4\x3A\x3B\xA0\x91\xD5\x6E\x10\x40\x09\x16"},
1972       { GCRY_CIPHER_AES, /* Packet Vector #3 */
1973           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
1974           13, "\x00\x00\x00\x05\x04\x03\x02\xA0\xA1\xA2\xA3\xA4\xA5",
1975           8, "\x00\x01\x02\x03\x04\x05\x06\x07",
1976           25,
1977           "\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F\x20",
1978           33,
1979           "\x51\xB1\xE5\xF4\x4A\x19\x7D\x1D\xA4\x6B\x0F\x8E\x2D\x28\x2A\xE8\x71\xE8\x38\xBB\x64\xDA\x85\x96\x57\x4A\xDA\xA7\x6F\xBD\x9F\xB0\xC5"},
1980       { GCRY_CIPHER_AES, /* Packet Vector #4 */
1981           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
1982           13, "\x00\x00\x00\x06\x05\x04\x03\xA0\xA1\xA2\xA3\xA4\xA5",
1983           12, "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B",
1984           19,
1985           "\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E",
1986           27,
1987           "\xA2\x8C\x68\x65\x93\x9A\x9A\x79\xFA\xAA\x5C\x4C\x2A\x9D\x4A\x91\xCD\xAC\x8C\x96\xC8\x61\xB9\xC9\xE6\x1E\xF1"},
1988       { GCRY_CIPHER_AES, /* Packet Vector #5 */
1989           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
1990           13, "\x00\x00\x00\x07\x06\x05\x04\xA0\xA1\xA2\xA3\xA4\xA5",
1991           12, "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B",
1992           20,
1993           "\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F",
1994           28,
1995           "\xDC\xF1\xFB\x7B\x5D\x9E\x23\xFB\x9D\x4E\x13\x12\x53\x65\x8A\xD8\x6E\xBD\xCA\x3E\x51\xE8\x3F\x07\x7D\x9C\x2D\x93"},
1996       { GCRY_CIPHER_AES, /* Packet Vector #6 */
1997           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
1998           13, "\x00\x00\x00\x08\x07\x06\x05\xA0\xA1\xA2\xA3\xA4\xA5",
1999           12, "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B",
2000           21,
2001           "\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F\x20",
2002           29,
2003           "\x6F\xC1\xB0\x11\xF0\x06\x56\x8B\x51\x71\xA4\x2D\x95\x3D\x46\x9B\x25\x70\xA4\xBD\x87\x40\x5A\x04\x43\xAC\x91\xCB\x94"},
2004       { GCRY_CIPHER_AES, /* Packet Vector #7 */
2005           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
2006           13, "\x00\x00\x00\x09\x08\x07\x06\xA0\xA1\xA2\xA3\xA4\xA5",
2007           8, "\x00\x01\x02\x03\x04\x05\x06\x07",
2008           23,
2009           "\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E",
2010           33,
2011           "\x01\x35\xD1\xB2\xC9\x5F\x41\xD5\xD1\xD4\xFE\xC1\x85\xD1\x66\xB8\x09\x4E\x99\x9D\xFE\xD9\x6C\x04\x8C\x56\x60\x2C\x97\xAC\xBB\x74\x90"},
2012       { GCRY_CIPHER_AES, /* Packet Vector #8 */
2013           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
2014           13, "\x00\x00\x00\x0A\x09\x08\x07\xA0\xA1\xA2\xA3\xA4\xA5",
2015           8, "\x00\x01\x02\x03\x04\x05\x06\x07",
2016           24,
2017           "\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F",
2018           34,
2019           "\x7B\x75\x39\x9A\xC0\x83\x1D\xD2\xF0\xBB\xD7\x58\x79\xA2\xFD\x8F\x6C\xAE\x6B\x6C\xD9\xB7\xDB\x24\xC1\x7B\x44\x33\xF4\x34\x96\x3F\x34\xB4"},
2020       { GCRY_CIPHER_AES, /* Packet Vector #9 */
2021           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
2022           13, "\x00\x00\x00\x0B\x0A\x09\x08\xA0\xA1\xA2\xA3\xA4\xA5",
2023           8, "\x00\x01\x02\x03\x04\x05\x06\x07",
2024           25,
2025           "\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F\x20",
2026           35,
2027           "\x82\x53\x1A\x60\xCC\x24\x94\x5A\x4B\x82\x79\x18\x1A\xB5\xC8\x4D\xF2\x1C\xE7\xF9\xB7\x3F\x42\xE1\x97\xEA\x9C\x07\xE5\x6B\x5E\xB1\x7E\x5F\x4E"},
2028       { GCRY_CIPHER_AES, /* Packet Vector #10 */
2029           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
2030           13, "\x00\x00\x00\x0C\x0B\x0A\x09\xA0\xA1\xA2\xA3\xA4\xA5",
2031           12, "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B",
2032           19,
2033           "\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E",
2034           29,
2035           "\x07\x34\x25\x94\x15\x77\x85\x15\x2B\x07\x40\x98\x33\x0A\xBB\x14\x1B\x94\x7B\x56\x6A\xA9\x40\x6B\x4D\x99\x99\x88\xDD"},
2036       { GCRY_CIPHER_AES, /* Packet Vector #11 */
2037           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
2038           13, "\x00\x00\x00\x0D\x0C\x0B\x0A\xA0\xA1\xA2\xA3\xA4\xA5",
2039           12, "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B",
2040           20,
2041           "\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F",
2042           30,
2043           "\x67\x6B\xB2\x03\x80\xB0\xE3\x01\xE8\xAB\x79\x59\x0A\x39\x6D\xA7\x8B\x83\x49\x34\xF5\x3A\xA2\xE9\x10\x7A\x8B\x6C\x02\x2C"},
2044       { GCRY_CIPHER_AES, /* Packet Vector #12 */
2045           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
2046           13, "\x00\x00\x00\x0E\x0D\x0C\x0B\xA0\xA1\xA2\xA3\xA4\xA5",
2047           12, "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B",
2048           21,
2049           "\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F\x20",
2050           31,
2051           "\xC0\xFF\xA0\xD6\xF0\x5B\xDB\x67\xF2\x4D\x43\xA4\x33\x8D\x2A\xA4\xBE\xD7\xB2\x0E\x43\xCD\x1A\xA3\x16\x62\xE7\xAD\x65\xD6\xDB"},
2052       { GCRY_CIPHER_AES, /* Packet Vector #13 */
2053           16, "\xD7\x82\x8D\x13\xB2\xB0\xBD\xC3\x25\xA7\x62\x36\xDF\x93\xCC\x6B",
2054           13, "\x00\x41\x2B\x4E\xA9\xCD\xBE\x3C\x96\x96\x76\x6C\xFA",
2055           8, "\x0B\xE1\xA8\x8B\xAC\xE0\x18\xB1",
2056           23,
2057           "\x08\xE8\xCF\x97\xD8\x20\xEA\x25\x84\x60\xE9\x6A\xD9\xCF\x52\x89\x05\x4D\x89\x5C\xEA\xC4\x7C",
2058           31,
2059           "\x4C\xB9\x7F\x86\xA2\xA4\x68\x9A\x87\x79\x47\xAB\x80\x91\xEF\x53\x86\xA6\xFF\xBD\xD0\x80\xF8\xE7\x8C\xF7\xCB\x0C\xDD\xD7\xB3"},
2060       { GCRY_CIPHER_AES, /* Packet Vector #14 */
2061           16, "\xD7\x82\x8D\x13\xB2\xB0\xBD\xC3\x25\xA7\x62\x36\xDF\x93\xCC\x6B",
2062           13, "\x00\x33\x56\x8E\xF7\xB2\x63\x3C\x96\x96\x76\x6C\xFA",
2063           8, "\x63\x01\x8F\x76\xDC\x8A\x1B\xCB",
2064           24,
2065           "\x90\x20\xEA\x6F\x91\xBD\xD8\x5A\xFA\x00\x39\xBA\x4B\xAF\xF9\xBF\xB7\x9C\x70\x28\x94\x9C\xD0\xEC",
2066           32,
2067           "\x4C\xCB\x1E\x7C\xA9\x81\xBE\xFA\xA0\x72\x6C\x55\xD3\x78\x06\x12\x98\xC8\x5C\x92\x81\x4A\xBC\x33\xC5\x2E\xE8\x1D\x7D\x77\xC0\x8A"},
2068       { GCRY_CIPHER_AES, /* Packet Vector #15 */
2069           16, "\xD7\x82\x8D\x13\xB2\xB0\xBD\xC3\x25\xA7\x62\x36\xDF\x93\xCC\x6B",
2070           13, "\x00\x10\x3F\xE4\x13\x36\x71\x3C\x96\x96\x76\x6C\xFA",
2071           8, "\xAA\x6C\xFA\x36\xCA\xE8\x6B\x40",
2072           25,
2073           "\xB9\x16\xE0\xEA\xCC\x1C\x00\xD7\xDC\xEC\x68\xEC\x0B\x3B\xBB\x1A\x02\xDE\x8A\x2D\x1A\xA3\x46\x13\x2E",
2074           33,
2075           "\xB1\xD2\x3A\x22\x20\xDD\xC0\xAC\x90\x0D\x9A\xA0\x3C\x61\xFC\xF4\xA5\x59\xA4\x41\x77\x67\x08\x97\x08\xA7\x76\x79\x6E\xDB\x72\x35\x06"},
2076       { GCRY_CIPHER_AES, /* Packet Vector #16 */
2077           16, "\xD7\x82\x8D\x13\xB2\xB0\xBD\xC3\x25\xA7\x62\x36\xDF\x93\xCC\x6B",
2078           13, "\x00\x76\x4C\x63\xB8\x05\x8E\x3C\x96\x96\x76\x6C\xFA",
2079           12, "\xD0\xD0\x73\x5C\x53\x1E\x1B\xEC\xF0\x49\xC2\x44",
2080           19,
2081           "\x12\xDA\xAC\x56\x30\xEF\xA5\x39\x6F\x77\x0C\xE1\xA6\x6B\x21\xF7\xB2\x10\x1C",
2082           27,
2083           "\x14\xD2\x53\xC3\x96\x7B\x70\x60\x9B\x7C\xBB\x7C\x49\x91\x60\x28\x32\x45\x26\x9A\x6F\x49\x97\x5B\xCA\xDE\xAF"},
2084       { GCRY_CIPHER_AES, /* Packet Vector #17 */
2085           16, "\xD7\x82\x8D\x13\xB2\xB0\xBD\xC3\x25\xA7\x62\x36\xDF\x93\xCC\x6B",
2086           13, "\x00\xF8\xB6\x78\x09\x4E\x3B\x3C\x96\x96\x76\x6C\xFA",
2087           12, "\x77\xB6\x0F\x01\x1C\x03\xE1\x52\x58\x99\xBC\xAE",
2088           20,
2089           "\xE8\x8B\x6A\x46\xC7\x8D\x63\xE5\x2E\xB8\xC5\x46\xEF\xB5\xDE\x6F\x75\xE9\xCC\x0D",
2090           28,
2091           "\x55\x45\xFF\x1A\x08\x5E\xE2\xEF\xBF\x52\xB2\xE0\x4B\xEE\x1E\x23\x36\xC7\x3E\x3F\x76\x2C\x0C\x77\x44\xFE\x7E\x3C"},
2092       { GCRY_CIPHER_AES, /* Packet Vector #18 */
2093           16, "\xD7\x82\x8D\x13\xB2\xB0\xBD\xC3\x25\xA7\x62\x36\xDF\x93\xCC\x6B",
2094           13, "\x00\xD5\x60\x91\x2D\x3F\x70\x3C\x96\x96\x76\x6C\xFA",
2095           12, "\xCD\x90\x44\xD2\xB7\x1F\xDB\x81\x20\xEA\x60\xC0",
2096           21,
2097           "\x64\x35\xAC\xBA\xFB\x11\xA8\x2E\x2F\x07\x1D\x7C\xA4\xA5\xEB\xD9\x3A\x80\x3B\xA8\x7F",
2098           29,
2099           "\x00\x97\x69\xEC\xAB\xDF\x48\x62\x55\x94\xC5\x92\x51\xE6\x03\x57\x22\x67\x5E\x04\xC8\x47\x09\x9E\x5A\xE0\x70\x45\x51"},
2100       { GCRY_CIPHER_AES, /* Packet Vector #19 */
2101           16, "\xD7\x82\x8D\x13\xB2\xB0\xBD\xC3\x25\xA7\x62\x36\xDF\x93\xCC\x6B",
2102           13, "\x00\x42\xFF\xF8\xF1\x95\x1C\x3C\x96\x96\x76\x6C\xFA",
2103           8, "\xD8\x5B\xC7\xE6\x9F\x94\x4F\xB8",
2104           23,
2105           "\x8A\x19\xB9\x50\xBC\xF7\x1A\x01\x8E\x5E\x67\x01\xC9\x17\x87\x65\x98\x09\xD6\x7D\xBE\xDD\x18",
2106           33,
2107           "\xBC\x21\x8D\xAA\x94\x74\x27\xB6\xDB\x38\x6A\x99\xAC\x1A\xEF\x23\xAD\xE0\xB5\x29\x39\xCB\x6A\x63\x7C\xF9\xBE\xC2\x40\x88\x97\xC6\xBA"},
2108       { GCRY_CIPHER_AES, /* Packet Vector #20 */
2109           16, "\xD7\x82\x8D\x13\xB2\xB0\xBD\xC3\x25\xA7\x62\x36\xDF\x93\xCC\x6B",
2110           13, "\x00\x92\x0F\x40\xE5\x6C\xDC\x3C\x96\x96\x76\x6C\xFA",
2111           8, "\x74\xA0\xEB\xC9\x06\x9F\x5B\x37",
2112           24,
2113           "\x17\x61\x43\x3C\x37\xC5\xA3\x5F\xC1\xF3\x9F\x40\x63\x02\xEB\x90\x7C\x61\x63\xBE\x38\xC9\x84\x37",
2114           34,
2115           "\x58\x10\xE6\xFD\x25\x87\x40\x22\xE8\x03\x61\xA4\x78\xE3\xE9\xCF\x48\x4A\xB0\x4F\x44\x7E\xFF\xF6\xF0\xA4\x77\xCC\x2F\xC9\xBF\x54\x89\x44"},
2116       { GCRY_CIPHER_AES, /* Packet Vector #21 */
2117           16, "\xD7\x82\x8D\x13\xB2\xB0\xBD\xC3\x25\xA7\x62\x36\xDF\x93\xCC\x6B",
2118           13, "\x00\x27\xCA\x0C\x71\x20\xBC\x3C\x96\x96\x76\x6C\xFA",
2119           8, "\x44\xA3\xAA\x3A\xAE\x64\x75\xCA",
2120           25,
2121           "\xA4\x34\xA8\xE5\x85\x00\xC6\xE4\x15\x30\x53\x88\x62\xD6\x86\xEA\x9E\x81\x30\x1B\x5A\xE4\x22\x6B\xFA",
2122           35,
2123           "\xF2\xBE\xED\x7B\xC5\x09\x8E\x83\xFE\xB5\xB3\x16\x08\xF8\xE2\x9C\x38\x81\x9A\x89\xC8\xE7\x76\xF1\x54\x4D\x41\x51\xA4\xED\x3A\x8B\x87\xB9\xCE"},
2124       { GCRY_CIPHER_AES, /* Packet Vector #22 */
2125           16, "\xD7\x82\x8D\x13\xB2\xB0\xBD\xC3\x25\xA7\x62\x36\xDF\x93\xCC\x6B",
2126           13, "\x00\x5B\x8C\xCB\xCD\x9A\xF8\x3C\x96\x96\x76\x6C\xFA",
2127           12, "\xEC\x46\xBB\x63\xB0\x25\x20\xC3\x3C\x49\xFD\x70",
2128           19,
2129           "\xB9\x6B\x49\xE2\x1D\x62\x17\x41\x63\x28\x75\xDB\x7F\x6C\x92\x43\xD2\xD7\xC2",
2130           29,
2131           "\x31\xD7\x50\xA0\x9D\xA3\xED\x7F\xDD\xD4\x9A\x20\x32\xAA\xBF\x17\xEC\x8E\xBF\x7D\x22\xC8\x08\x8C\x66\x6B\xE5\xC1\x97"},
2132       { GCRY_CIPHER_AES, /* Packet Vector #23 */
2133           16, "\xD7\x82\x8D\x13\xB2\xB0\xBD\xC3\x25\xA7\x62\x36\xDF\x93\xCC\x6B",
2134           13, "\x00\x3E\xBE\x94\x04\x4B\x9A\x3C\x96\x96\x76\x6C\xFA",
2135           12, "\x47\xA6\x5A\xC7\x8B\x3D\x59\x42\x27\xE8\x5E\x71",
2136           20,
2137           "\xE2\xFC\xFB\xB8\x80\x44\x2C\x73\x1B\xF9\x51\x67\xC8\xFF\xD7\x89\x5E\x33\x70\x76",
2138           30,
2139           "\xE8\x82\xF1\xDB\xD3\x8C\xE3\xED\xA7\xC2\x3F\x04\xDD\x65\x07\x1E\xB4\x13\x42\xAC\xDF\x7E\x00\xDC\xCE\xC7\xAE\x52\x98\x7D"},
2140       { GCRY_CIPHER_AES, /* Packet Vector #24 */
2141           16, "\xD7\x82\x8D\x13\xB2\xB0\xBD\xC3\x25\xA7\x62\x36\xDF\x93\xCC\x6B",
2142           13, "\x00\x8D\x49\x3B\x30\xAE\x8B\x3C\x96\x96\x76\x6C\xFA",
2143           12, "\x6E\x37\xA6\xEF\x54\x6D\x95\x5D\x34\xAB\x60\x59",
2144           21,
2145           "\xAB\xF2\x1C\x0B\x02\xFE\xB8\x8F\x85\x6D\xF4\xA3\x73\x81\xBC\xE3\xCC\x12\x85\x17\xD4",
2146           31,
2147           "\xF3\x29\x05\xB8\x8A\x64\x1B\x04\xB9\xC9\xFF\xB5\x8C\xC3\x90\x90\x0F\x3D\xA1\x2A\xB1\x6D\xCE\x9E\x82\xEF\xA1\x6D\xA6\x20\x59"},
2148       /* RFC 5528 */
2149       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #1 */
2150           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
2151           13, "\x00\x00\x00\x03\x02\x01\x00\xA0\xA1\xA2\xA3\xA4\xA5",
2152           8, "\x00\x01\x02\x03\x04\x05\x06\x07",
2153           23,
2154           "\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E",
2155           31,
2156           "\xBA\x73\x71\x85\xE7\x19\x31\x04\x92\xF3\x8A\x5F\x12\x51\xDA\x55\xFA\xFB\xC9\x49\x84\x8A\x0D\xFC\xAE\xCE\x74\x6B\x3D\xB9\xAD"},
2157       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #2 */
2158           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
2159           13, "\x00\x00\x00\x04\x03\x02\x01\xA0\xA1\xA2\xA3\xA4\xA5",
2160           8, "\x00\x01\x02\x03\x04\x05\x06\x07",
2161           24,
2162           "\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F",
2163           32,
2164           "\x5D\x25\x64\xBF\x8E\xAF\xE1\xD9\x95\x26\xEC\x01\x6D\x1B\xF0\x42\x4C\xFB\xD2\xCD\x62\x84\x8F\x33\x60\xB2\x29\x5D\xF2\x42\x83\xE8"},
2165       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #3 */
2166           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
2167           13, "\x00\x00\x00\x05\x04\x03\x02\xA0\xA1\xA2\xA3\xA4\xA5",
2168           8, "\x00\x01\x02\x03\x04\x05\x06\x07",
2169           25,
2170           "\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F\x20",
2171           33,
2172           "\x81\xF6\x63\xD6\xC7\x78\x78\x17\xF9\x20\x36\x08\xB9\x82\xAD\x15\xDC\x2B\xBD\x87\xD7\x56\xF7\x92\x04\xF5\x51\xD6\x68\x2F\x23\xAA\x46"},
2173       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #4 */
2174           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
2175           13, "\x00\x00\x00\x06\x05\x04\x03\xA0\xA1\xA2\xA3\xA4\xA5",
2176           12, "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B",
2177           19,
2178           "\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E",
2179           27,
2180           "\xCA\xEF\x1E\x82\x72\x11\xB0\x8F\x7B\xD9\x0F\x08\xC7\x72\x88\xC0\x70\xA4\xA0\x8B\x3A\x93\x3A\x63\xE4\x97\xA0"},
2181       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #5 */
2182           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
2183           13, "\x00\x00\x00\x07\x06\x05\x04\xA0\xA1\xA2\xA3\xA4\xA5",
2184           12, "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B",
2185           20,
2186           "\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F",
2187           28,
2188           "\x2A\xD3\xBA\xD9\x4F\xC5\x2E\x92\xBE\x43\x8E\x82\x7C\x10\x23\xB9\x6A\x8A\x77\x25\x8F\xA1\x7B\xA7\xF3\x31\xDB\x09"},
2189       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #6 */
2190           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
2191           13, "\x00\x00\x00\x08\x07\x06\x05\xA0\xA1\xA2\xA3\xA4\xA5",
2192           12, "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B",
2193           21,
2194           "\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F\x20",
2195           29,
2196           "\xFE\xA5\x48\x0B\xA5\x3F\xA8\xD3\xC3\x44\x22\xAA\xCE\x4D\xE6\x7F\xFA\x3B\xB7\x3B\xAB\xAB\x36\xA1\xEE\x4F\xE0\xFE\x28"},
2197       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #7 */
2198           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
2199           13, "\x00\x00\x00\x09\x08\x07\x06\xA0\xA1\xA2\xA3\xA4\xA5",
2200           8, "\x00\x01\x02\x03\x04\x05\x06\x07",
2201           23,
2202           "\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E",
2203           33,
2204           "\x54\x53\x20\x26\xE5\x4C\x11\x9A\x8D\x36\xD9\xEC\x6E\x1E\xD9\x74\x16\xC8\x70\x8C\x4B\x5C\x2C\xAC\xAF\xA3\xBC\xCF\x7A\x4E\xBF\x95\x73"},
2205       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #8 */
2206           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
2207           13, "\x00\x00\x00\x0A\x09\x08\x07\xA0\xA1\xA2\xA3\xA4\xA5",
2208           8, "\x00\x01\x02\x03\x04\x05\x06\x07",
2209           24,
2210           "\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F",
2211           34,
2212           "\x8A\xD1\x9B\x00\x1A\x87\xD1\x48\xF4\xD9\x2B\xEF\x34\x52\x5C\xCC\xE3\xA6\x3C\x65\x12\xA6\xF5\x75\x73\x88\xE4\x91\x3E\xF1\x47\x01\xF4\x41"},
2213       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #9 */
2214           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
2215           13, "\x00\x00\x00\x0B\x0A\x09\x08\xA0\xA1\xA2\xA3\xA4\xA5",
2216           8, "\x00\x01\x02\x03\x04\x05\x06\x07",
2217           25,
2218           "\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F\x20",
2219           35,
2220           "\x5D\xB0\x8D\x62\x40\x7E\x6E\x31\xD6\x0F\x9C\xA2\xC6\x04\x74\x21\x9A\xC0\xBE\x50\xC0\xD4\xA5\x77\x87\x94\xD6\xE2\x30\xCD\x25\xC9\xFE\xBF\x87"},
2221       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #10 */
2222           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
2223           13, "\x00\x00\x00\x0C\x0B\x0A\x09\xA0\xA1\xA2\xA3\xA4\xA5",
2224           12, "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B",
2225           19,
2226           "\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E",
2227           29,
2228           "\xDB\x11\x8C\xCE\xC1\xB8\x76\x1C\x87\x7C\xD8\x96\x3A\x67\xD6\xF3\xBB\xBC\x5C\xD0\x92\x99\xEB\x11\xF3\x12\xF2\x32\x37"},
2229       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #11 */
2230           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
2231           13, "\x00\x00\x00\x0D\x0C\x0B\x0A\xA0\xA1\xA2\xA3\xA4\xA5",
2232           12, "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B",
2233           20,
2234           "\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F",
2235           30,
2236           "\x7C\xC8\x3D\x8D\xC4\x91\x03\x52\x5B\x48\x3D\xC5\xCA\x7E\xA9\xAB\x81\x2B\x70\x56\x07\x9D\xAF\xFA\xDA\x16\xCC\xCF\x2C\x4E"},
2237       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #12 */
2238           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
2239           13, "\x00\x00\x00\x0E\x0D\x0C\x0B\xA0\xA1\xA2\xA3\xA4\xA5",
2240           12, "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B",
2241           21,
2242           "\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F\x20",
2243           31,
2244           "\x2C\xD3\x5B\x88\x20\xD2\x3E\x7A\xA3\x51\xB0\xE9\x2F\xC7\x93\x67\x23\x8B\x2C\xC7\x48\xCB\xB9\x4C\x29\x47\x79\x3D\x64\xAF\x75"},
2245       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #13 */
2246           16, "\xD7\x5C\x27\x78\x07\x8C\xA9\x3D\x97\x1F\x96\xFD\xE7\x20\xF4\xCD",
2247           13, "\x00\xA9\x70\x11\x0E\x19\x27\xB1\x60\xB6\xA3\x1C\x1C",
2248           8, "\x6B\x7F\x46\x45\x07\xFA\xE4\x96",
2249           23,
2250           "\xC6\xB5\xF3\xE6\xCA\x23\x11\xAE\xF7\x47\x2B\x20\x3E\x73\x5E\xA5\x61\xAD\xB1\x7D\x56\xC5\xA3",
2251           31,
2252           "\xA4\x35\xD7\x27\x34\x8D\xDD\x22\x90\x7F\x7E\xB8\xF5\xFD\xBB\x4D\x93\x9D\xA6\x52\x4D\xB4\xF6\x45\x58\xC0\x2D\x25\xB1\x27\xEE"},
2253       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #14 */
2254           16, "\xD7\x5C\x27\x78\x07\x8C\xA9\x3D\x97\x1F\x96\xFD\xE7\x20\xF4\xCD",
2255           13, "\x00\x83\xCD\x8C\xE0\xCB\x42\xB1\x60\xB6\xA3\x1C\x1C",
2256           8, "\x98\x66\x05\xB4\x3D\xF1\x5D\xE7",
2257           24,
2258           "\x01\xF6\xCE\x67\x64\xC5\x74\x48\x3B\xB0\x2E\x6B\xBF\x1E\x0A\xBD\x26\xA2\x25\x72\xB4\xD8\x0E\xE7",
2259           32,
2260           "\x8A\xE0\x52\x50\x8F\xBE\xCA\x93\x2E\x34\x6F\x05\xE0\xDC\x0D\xFB\xCF\x93\x9E\xAF\xFA\x3E\x58\x7C\x86\x7D\x6E\x1C\x48\x70\x38\x06"},
2261       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #15 */
2262           16, "\xD7\x5C\x27\x78\x07\x8C\xA9\x3D\x97\x1F\x96\xFD\xE7\x20\xF4\xCD",
2263           13, "\x00\x5F\x54\x95\x0B\x18\xF2\xB1\x60\xB6\xA3\x1C\x1C",
2264           8, "\x48\xF2\xE7\xE1\xA7\x67\x1A\x51",
2265           25,
2266           "\xCD\xF1\xD8\x40\x6F\xC2\xE9\x01\x49\x53\x89\x70\x05\xFB\xFB\x8B\xA5\x72\x76\xF9\x24\x04\x60\x8E\x08",
2267           33,
2268           "\x08\xB6\x7E\xE2\x1C\x8B\xF2\x6E\x47\x3E\x40\x85\x99\xE9\xC0\x83\x6D\x6A\xF0\xBB\x18\xDF\x55\x46\x6C\xA8\x08\x78\xA7\x90\x47\x6D\xE5"},
2269       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #16 */
2270           16, "\xD7\x5C\x27\x78\x07\x8C\xA9\x3D\x97\x1F\x96\xFD\xE7\x20\xF4\xCD",
2271           13, "\x00\xEC\x60\x08\x63\x31\x9A\xB1\x60\xB6\xA3\x1C\x1C",
2272           12, "\xDE\x97\xDF\x3B\x8C\xBD\x6D\x8E\x50\x30\xDA\x4C",
2273           19,
2274           "\xB0\x05\xDC\xFA\x0B\x59\x18\x14\x26\xA9\x61\x68\x5A\x99\x3D\x8C\x43\x18\x5B",
2275           27,
2276           "\x63\xB7\x8B\x49\x67\xB1\x9E\xDB\xB7\x33\xCD\x11\x14\xF6\x4E\xB2\x26\x08\x93\x68\xC3\x54\x82\x8D\x95\x0C\xC5"},
2277       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #17 */
2278           16, "\xD7\x5C\x27\x78\x07\x8C\xA9\x3D\x97\x1F\x96\xFD\xE7\x20\xF4\xCD",
2279           13, "\x00\x60\xCF\xF1\xA3\x1E\xA1\xB1\x60\xB6\xA3\x1C\x1C",
2280           12, "\xA5\xEE\x93\xE4\x57\xDF\x05\x46\x6E\x78\x2D\xCF",
2281           20,
2282           "\x2E\x20\x21\x12\x98\x10\x5F\x12\x9D\x5E\xD9\x5B\x93\xF7\x2D\x30\xB2\xFA\xCC\xD7",
2283           28,
2284           "\x0B\xC6\xBB\xE2\xA8\xB9\x09\xF4\x62\x9E\xE6\xDC\x14\x8D\xA4\x44\x10\xE1\x8A\xF4\x31\x47\x38\x32\x76\xF6\x6A\x9F"},
2285       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #18 */
2286           16, "\xD7\x5C\x27\x78\x07\x8C\xA9\x3D\x97\x1F\x96\xFD\xE7\x20\xF4\xCD",
2287           13, "\x00\x0F\x85\xCD\x99\x5C\x97\xB1\x60\xB6\xA3\x1C\x1C",
2288           12, "\x24\xAA\x1B\xF9\xA5\xCD\x87\x61\x82\xA2\x50\x74",
2289           21,
2290           "\x26\x45\x94\x1E\x75\x63\x2D\x34\x91\xAF\x0F\xC0\xC9\x87\x6C\x3B\xE4\xAA\x74\x68\xC9",
2291           29,
2292           "\x22\x2A\xD6\x32\xFA\x31\xD6\xAF\x97\x0C\x34\x5F\x7E\x77\xCA\x3B\xD0\xDC\x25\xB3\x40\xA1\xA3\xD3\x1F\x8D\x4B\x44\xB7"},
2293       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #19 */
2294           16, "\xD7\x5C\x27\x78\x07\x8C\xA9\x3D\x97\x1F\x96\xFD\xE7\x20\xF4\xCD",
2295           13, "\x00\xC2\x9B\x2C\xAA\xC4\xCD\xB1\x60\xB6\xA3\x1C\x1C",
2296           8, "\x69\x19\x46\xB9\xCA\x07\xBE\x87",
2297           23,
2298           "\x07\x01\x35\xA6\x43\x7C\x9D\xB1\x20\xCD\x61\xD8\xF6\xC3\x9C\x3E\xA1\x25\xFD\x95\xA0\xD2\x3D",
2299           33,
2300           "\x05\xB8\xE1\xB9\xC4\x9C\xFD\x56\xCF\x13\x0A\xA6\x25\x1D\xC2\xEC\xC0\x6C\xCC\x50\x8F\xE6\x97\xA0\x06\x6D\x57\xC8\x4B\xEC\x18\x27\x68"},
2301       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #20 */
2302           16, "\xD7\x5C\x27\x78\x07\x8C\xA9\x3D\x97\x1F\x96\xFD\xE7\x20\xF4\xCD",
2303           13, "\x00\x2C\x6B\x75\x95\xEE\x62\xB1\x60\xB6\xA3\x1C\x1C",
2304           8, "\xD0\xC5\x4E\xCB\x84\x62\x7D\xC4",
2305           24,
2306           "\xC8\xC0\x88\x0E\x6C\x63\x6E\x20\x09\x3D\xD6\x59\x42\x17\xD2\xE1\x88\x77\xDB\x26\x4E\x71\xA5\xCC",
2307           34,
2308           "\x54\xCE\xB9\x68\xDE\xE2\x36\x11\x57\x5E\xC0\x03\xDF\xAA\x1C\xD4\x88\x49\xBD\xF5\xAE\x2E\xDB\x6B\x7F\xA7\x75\xB1\x50\xED\x43\x83\xC5\xA9"},
2309       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #21 */
2310           16, "\xD7\x5C\x27\x78\x07\x8C\xA9\x3D\x97\x1F\x96\xFD\xE7\x20\xF4\xCD",
2311           13, "\x00\xC5\x3C\xD4\xC2\xAA\x24\xB1\x60\xB6\xA3\x1C\x1C",
2312           8, "\xE2\x85\xE0\xE4\x80\x8C\xDA\x3D",
2313           25,
2314           "\xF7\x5D\xAA\x07\x10\xC4\xE6\x42\x97\x79\x4D\xC2\xB7\xD2\xA2\x07\x57\xB1\xAA\x4E\x44\x80\x02\xFF\xAB",
2315           35,
2316           "\xB1\x40\x45\x46\xBF\x66\x72\x10\xCA\x28\xE3\x09\xB3\x9B\xD6\xCA\x7E\x9F\xC8\x28\x5F\xE6\x98\xD4\x3C\xD2\x0A\x02\xE0\xBD\xCA\xED\x20\x10\xD3"},
2317       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #22 */
2318           16, "\xD7\x5C\x27\x78\x07\x8C\xA9\x3D\x97\x1F\x96\xFD\xE7\x20\xF4\xCD",
2319           13, "\x00\xBE\xE9\x26\x7F\xBA\xDC\xB1\x60\xB6\xA3\x1C\x1C",
2320           12, "\x6C\xAE\xF9\x94\x11\x41\x57\x0D\x7C\x81\x34\x05",
2321           19,
2322           "\xC2\x38\x82\x2F\xAC\x5F\x98\xFF\x92\x94\x05\xB0\xAD\x12\x7A\x4E\x41\x85\x4E",
2323           29,
2324           "\x94\xC8\x95\x9C\x11\x56\x9A\x29\x78\x31\xA7\x21\x00\x58\x57\xAB\x61\xB8\x7A\x2D\xEA\x09\x36\xB6\xEB\x5F\x62\x5F\x5D"},
2325       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #23 */
2326           16, "\xD7\x5C\x27\x78\x07\x8C\xA9\x3D\x97\x1F\x96\xFD\xE7\x20\xF4\xCD",
2327           13, "\x00\xDF\xA8\xB1\x24\x50\x07\xB1\x60\xB6\xA3\x1C\x1C",
2328           12, "\x36\xA5\x2C\xF1\x6B\x19\xA2\x03\x7A\xB7\x01\x1E",
2329           20,
2330           "\x4D\xBF\x3E\x77\x4A\xD2\x45\xE5\xD5\x89\x1F\x9D\x1C\x32\xA0\xAE\x02\x2C\x85\xD7",
2331           30,
2332           "\x58\x69\xE3\xAA\xD2\x44\x7C\x74\xE0\xFC\x05\xF9\xA4\xEA\x74\x57\x7F\x4D\xE8\xCA\x89\x24\x76\x42\x96\xAD\x04\x11\x9C\xE7"},
2333       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #24 */
2334           16, "\xD7\x5C\x27\x78\x07\x8C\xA9\x3D\x97\x1F\x96\xFD\xE7\x20\xF4\xCD",
2335           13, "\x00\x3B\x8F\xD8\xD3\xA9\x37\xB1\x60\xB6\xA3\x1C\x1C",
2336           12, "\xA4\xD4\x99\xF7\x84\x19\x72\x8C\x19\x17\x8B\x0C",
2337           21,
2338           "\x9D\xC9\xED\xAE\x2F\xF5\xDF\x86\x36\xE8\xC6\xDE\x0E\xED\x55\xF7\x86\x7E\x33\x33\x7D",
2339           31,
2340           "\x4B\x19\x81\x56\x39\x3B\x0F\x77\x96\x08\x6A\xAF\xB4\x54\xF8\xC3\xF0\x34\xCC\xA9\x66\x94\x5F\x1F\xCE\xA7\xE1\x1B\xEE\x6A\x2F"}
2341     };
2342   static const int cut[] = { 0, 1, 8, 10, 16, 19, -1 };
2343   gcry_cipher_hd_t hde, hdd;
2344   unsigned char out[MAX_DATA_LEN];
2345   u64 ctl_params[3];
2346   int split, aadsplit;
2347   size_t j, i, keylen, blklen, authlen;
2348   gcry_error_t err = 0;
2349
2350   if (verbose)
2351     fprintf (stderr, "  Starting CCM checks.\n");
2352
2353   for (i = 0; i < sizeof (tv) / sizeof (tv[0]); i++)
2354     {
2355       if (verbose)
2356         fprintf (stderr, "    checking CCM mode for %s [%i]\n",
2357                  gcry_cipher_algo_name (tv[i].algo),
2358                  tv[i].algo);
2359
2360       for (j = 0; j < sizeof (cut) / sizeof (cut[0]); j++)
2361         {
2362           split = cut[j] < 0 ? tv[i].plainlen : cut[j];
2363           if (tv[i].plainlen < split)
2364             continue;
2365
2366           err = gcry_cipher_open (&hde, tv[i].algo, GCRY_CIPHER_MODE_CCM, 0);
2367           if (!err)
2368             err = gcry_cipher_open (&hdd, tv[i].algo, GCRY_CIPHER_MODE_CCM, 0);
2369           if (err)
2370             {
2371               fail ("cipher-ccm, gcry_cipher_open failed: %s\n",
2372                     gpg_strerror (err));
2373               return;
2374             }
2375
2376           keylen = gcry_cipher_get_algo_keylen(tv[i].algo);
2377           if (!keylen)
2378             {
2379               fail ("cipher-ccm, gcry_cipher_get_algo_keylen failed\n");
2380               return;
2381             }
2382
2383           err = gcry_cipher_setkey (hde, tv[i].key, keylen);
2384           if (!err)
2385             err = gcry_cipher_setkey (hdd, tv[i].key, keylen);
2386           if (err)
2387             {
2388               fail ("cipher-ccm, gcry_cipher_setkey failed: %s\n",
2389                     gpg_strerror (err));
2390               gcry_cipher_close (hde);
2391               gcry_cipher_close (hdd);
2392               return;
2393             }
2394
2395           blklen = gcry_cipher_get_algo_blklen(tv[i].algo);
2396           if (!blklen)
2397             {
2398               fail ("cipher-ccm, gcry_cipher_get_algo_blklen failed\n");
2399               return;
2400             }
2401
2402           err = gcry_cipher_setiv (hde, tv[i].nonce, tv[i].noncelen);
2403           if (!err)
2404             err = gcry_cipher_setiv (hdd, tv[i].nonce, tv[i].noncelen);
2405           if (err)
2406             {
2407               fail ("cipher-ccm, gcry_cipher_setiv failed: %s\n",
2408                     gpg_strerror (err));
2409               gcry_cipher_close (hde);
2410               gcry_cipher_close (hdd);
2411               return;
2412             }
2413
2414           authlen = tv[i].cipherlen - tv[i].plainlen;
2415           ctl_params[0] = tv[i].plainlen; /* encryptedlen */
2416           ctl_params[1] = tv[i].aadlen; /* aadlen */
2417           ctl_params[2] = authlen; /* authtaglen */
2418           err = gcry_cipher_ctl (hde, GCRYCTL_SET_CCM_LENGTHS, ctl_params,
2419                                  sizeof(ctl_params));
2420           if (!err)
2421             err = gcry_cipher_ctl (hdd, GCRYCTL_SET_CCM_LENGTHS, ctl_params,
2422                                    sizeof(ctl_params));
2423           if (err)
2424             {
2425               fail ("cipher-ccm, gcry_cipher_ctl GCRYCTL_SET_CCM_LENGTHS "
2426                     "failed: %s\n", gpg_strerror (err));
2427               gcry_cipher_close (hde);
2428               gcry_cipher_close (hdd);
2429               return;
2430             }
2431
2432           aadsplit = split > tv[i].aadlen ? 0 : split;
2433
2434           err = gcry_cipher_authenticate (hde, tv[i].aad,
2435                                           tv[i].aadlen - aadsplit);
2436           if (!err)
2437             err = gcry_cipher_authenticate (hde,
2438                                             &tv[i].aad[tv[i].aadlen - aadsplit],
2439                                             aadsplit);
2440           if (!err)
2441             err = gcry_cipher_authenticate (hdd, tv[i].aad,
2442                                             tv[i].aadlen - aadsplit);
2443           if (!err)
2444             err = gcry_cipher_authenticate (hdd,
2445                                             &tv[i].aad[tv[i].aadlen - aadsplit],
2446                                             aadsplit);
2447           if (err)
2448             {
2449               fail ("cipher-ccm, gcry_cipher_authenticate failed: %s\n",
2450                    gpg_strerror (err));
2451               gcry_cipher_close (hde);
2452               gcry_cipher_close (hdd);
2453               return;
2454             }
2455
2456           err = gcry_cipher_encrypt (hde, out, MAX_DATA_LEN, tv[i].plaintext,
2457                                      tv[i].plainlen - split);
2458           if (!err)
2459             err = gcry_cipher_encrypt (hde, &out[tv[i].plainlen - split],
2460                                        MAX_DATA_LEN - (tv[i].plainlen - split),
2461                                        &tv[i].plaintext[tv[i].plainlen - split],
2462                                        split);
2463           if (err)
2464             {
2465               fail ("cipher-ccm, gcry_cipher_encrypt (%d:%d) failed: %s\n",
2466                     i, j, gpg_strerror (err));
2467               gcry_cipher_close (hde);
2468               gcry_cipher_close (hdd);
2469               return;
2470             }
2471
2472           err = gcry_cipher_gettag (hde, &out[tv[i].plainlen], authlen);
2473           if (err)
2474             {
2475               fail ("cipher-ccm, gcry_cipher_gettag (%d:%d) failed: %s\n",
2476                     i, j, gpg_strerror (err));
2477               gcry_cipher_close (hde);
2478               gcry_cipher_close (hdd);
2479               return;
2480             }
2481
2482           if (memcmp (tv[i].ciphertext, out, tv[i].cipherlen))
2483             fail ("cipher-ccm, encrypt mismatch entry %d:%d\n", i, j);
2484
2485           err = gcry_cipher_decrypt (hdd, out, tv[i].plainlen - split, NULL, 0);
2486           if (!err)
2487             err = gcry_cipher_decrypt (hdd, &out[tv[i].plainlen - split], split,
2488                                        NULL, 0);
2489           if (err)
2490             {
2491               fail ("cipher-ccm, gcry_cipher_decrypt (%d:%d) failed: %s\n",
2492                     i, j, gpg_strerror (err));
2493               gcry_cipher_close (hde);
2494               gcry_cipher_close (hdd);
2495               return;
2496             }
2497
2498           if (memcmp (tv[i].plaintext, out, tv[i].plainlen))
2499             fail ("cipher-ccm, decrypt mismatch entry %d:%d\n", i, j);
2500
2501           err = gcry_cipher_checktag (hdd, &out[tv[i].plainlen], authlen);
2502           if (err)
2503             {
2504               fail ("cipher-ccm, gcry_cipher_checktag (%d:%d) failed: %s\n",
2505                     i, j, gpg_strerror (err));
2506               gcry_cipher_close (hde);
2507               gcry_cipher_close (hdd);
2508               return;
2509             }
2510
2511           gcry_cipher_close (hde);
2512           gcry_cipher_close (hdd);
2513         }
2514     }
2515
2516   /* Large buffer tests.  */
2517
2518   /* Test encoding of aadlen > 0xfeff.  */
2519   {
2520     static const char key[]={0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,
2521                              0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f};
2522     static const char iv[]={0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19};
2523     static const char tag[]={0x9C,0x76,0xE7,0x33,0xD5,0x15,0xB3,0x6C,
2524                              0xBA,0x76,0x95,0xF7,0xFB,0x91};
2525     char buf[1024];
2526     size_t enclen = 0x20000;
2527     size_t aadlen = 0x20000;
2528     size_t taglen = sizeof(tag);
2529
2530     err = gcry_cipher_open (&hde, GCRY_CIPHER_AES, GCRY_CIPHER_MODE_CCM, 0);
2531     if (err)
2532       {
2533         fail ("cipher-ccm-large, gcry_cipher_open failed: %s\n",
2534               gpg_strerror (err));
2535         return;
2536       }
2537
2538     err = gcry_cipher_setkey (hde, key, sizeof (key));
2539     if (err)
2540       {
2541          fail ("cipher-ccm-large, gcry_cipher_setkey failed: %s\n",
2542                gpg_strerror (err));
2543          gcry_cipher_close (hde);
2544          return;
2545       }
2546
2547     err = gcry_cipher_setiv (hde, iv, sizeof (iv));
2548     if (err)
2549       {
2550         fail ("cipher-ccm-large, gcry_cipher_setiv failed: %s\n",
2551               gpg_strerror (err));
2552         gcry_cipher_close (hde);
2553         return;
2554       }
2555
2556     ctl_params[0] = enclen; /* encryptedlen */
2557     ctl_params[1] = aadlen; /* aadlen */
2558     ctl_params[2] = taglen; /* authtaglen */
2559     err = gcry_cipher_ctl (hde, GCRYCTL_SET_CCM_LENGTHS, ctl_params,
2560                            sizeof(ctl_params));
2561     if (err)
2562       {
2563         fail ("cipher-ccm-large, gcry_cipher_ctl GCRYCTL_SET_CCM_LENGTHS "
2564               "failed: %s\n", gpg_strerror (err));
2565         gcry_cipher_close (hde);
2566         return;
2567       }
2568
2569     memset (buf, 0xaa, sizeof(buf));
2570
2571     for (i = 0; i < aadlen; i += sizeof(buf))
2572       {
2573         err = gcry_cipher_authenticate (hde, buf, sizeof (buf));
2574         if (err)
2575           {
2576             fail ("cipher-ccm-large, gcry_cipher_authenticate failed: %s\n",
2577                  gpg_strerror (err));
2578             gcry_cipher_close (hde);
2579             return;
2580           }
2581       }
2582
2583     for (i = 0; i < enclen; i += sizeof(buf))
2584       {
2585         memset (buf, 0xee, sizeof(buf));
2586         err = gcry_cipher_encrypt (hde, buf, sizeof (buf), NULL, 0);
2587         if (err)
2588           {
2589             fail ("cipher-ccm-large, gcry_cipher_encrypt failed: %s\n",
2590                  gpg_strerror (err));
2591             gcry_cipher_close (hde);
2592             return;
2593           }
2594       }
2595
2596     err = gcry_cipher_gettag (hde, buf, taglen);
2597     if (err)
2598       {
2599         fail ("cipher-ccm-large, gcry_cipher_gettag failed: %s\n",
2600               gpg_strerror (err));
2601         gcry_cipher_close (hde);
2602         return;
2603       }
2604
2605     if (memcmp (buf, tag, taglen) != 0)
2606       fail ("cipher-ccm-large, encrypt mismatch entry\n");
2607
2608     gcry_cipher_close (hde);
2609   }
2610
2611 #if 0
2612   /* Test encoding of aadlen > 0xffffffff.  */
2613   {
2614     static const char key[]={0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,
2615                              0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f};
2616     static const char iv[]={0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19};
2617     static const char tag[]={0x01,0xB2,0xC3,0x4A,0xA6,0x6A,0x07,0x6D,
2618                              0xBC,0xBD,0xEA,0x17,0xD3,0x73,0xD7,0xD4};
2619     char buf[1024];
2620     size_t enclen = (size_t)0xffffffff + 1 + 1024;
2621     size_t aadlen = (size_t)0xffffffff + 1 + 1024;
2622     size_t taglen = sizeof(tag);
2623
2624     err = gcry_cipher_open (&hde, GCRY_CIPHER_AES, GCRY_CIPHER_MODE_CCM, 0);
2625     if (err)
2626       {
2627         fail ("cipher-ccm-huge, gcry_cipher_open failed: %s\n",
2628               gpg_strerror (err));
2629         return;
2630       }
2631
2632     err = gcry_cipher_setkey (hde, key, sizeof (key));
2633     if (err)
2634       {
2635          fail ("cipher-ccm-huge, gcry_cipher_setkey failed: %s\n",
2636                gpg_strerror (err));
2637          gcry_cipher_close (hde);
2638          return;
2639       }
2640
2641     err = gcry_cipher_setiv (hde, iv, sizeof (iv));
2642     if (err)
2643       {
2644         fail ("cipher-ccm-huge, gcry_cipher_setiv failed: %s\n",
2645               gpg_strerror (err));
2646         gcry_cipher_close (hde);
2647         return;
2648       }
2649
2650     ctl_params[0] = enclen; /* encryptedlen */
2651     ctl_params[1] = aadlen; /* aadlen */
2652     ctl_params[2] = taglen; /* authtaglen */
2653     err = gcry_cipher_ctl (hde, GCRYCTL_SET_CCM_LENGTHS, ctl_params,
2654                            sizeof(ctl_params));
2655     if (err)
2656       {
2657         fail ("cipher-ccm-huge, gcry_cipher_ctl GCRYCTL_SET_CCM_LENGTHS failed:"
2658               "%s\n", gpg_strerror (err));
2659         gcry_cipher_close (hde);
2660         return;
2661       }
2662
2663     memset (buf, 0xaa, sizeof(buf));
2664
2665     for (i = 0; i < aadlen; i += sizeof(buf))
2666       {
2667         err = gcry_cipher_authenticate (hde, buf, sizeof (buf));
2668         if (err)
2669           {
2670             fail ("cipher-ccm-huge, gcry_cipher_authenticate failed: %s\n",
2671                  gpg_strerror (err));
2672             gcry_cipher_close (hde);
2673             return;
2674           }
2675       }
2676
2677     for (i = 0; i < enclen; i += sizeof(buf))
2678       {
2679         memset (buf, 0xee, sizeof(buf));
2680         err = gcry_cipher_encrypt (hde, buf, sizeof (buf), NULL, 0);
2681         if (err)
2682           {
2683             fail ("cipher-ccm-huge, gcry_cipher_encrypt failed: %s\n",
2684                  gpg_strerror (err));
2685             gcry_cipher_close (hde);
2686             return;
2687           }
2688       }
2689
2690     err = gcry_cipher_gettag (hde, buf, taglen);
2691     if (err)
2692       {
2693         fail ("cipher-ccm-huge, gcry_cipher_gettag failed: %s\n",
2694               gpg_strerror (err));
2695         gcry_cipher_close (hde);
2696         return;
2697       }
2698
2699     if (memcmp (buf, tag, taglen) != 0)
2700       fail ("cipher-ccm-huge, encrypt mismatch entry\n");
2701
2702     gcry_cipher_close (hde);
2703   }
2704
2705   if (verbose)
2706     fprintf (stderr, "  Completed CCM checks.\n");
2707 #endif
2708 #endif /*HAVE_U64_TYPEDEF*/
2709 }
2710
2711
2712 static void
2713 check_stream_cipher (void)
2714 {
2715   static const struct tv
2716   {
2717     const char *name;
2718     int algo;
2719     int keylen;
2720     int ivlen;
2721     const char *key;
2722     const char *iv;
2723     struct data
2724     {
2725       int inlen;
2726       const char *plaintext;
2727       const char *out;
2728     } data[MAX_DATA_LEN];
2729   } tv[] = {
2730 #ifdef USE_SALSA20
2731     {
2732       "Salsa20 128 bit, test 1",
2733       GCRY_CIPHER_SALSA20, 16, 8,
2734       "\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
2735       "\x00\x00\x00\x00\x00\x00\x00\x00",
2736       {
2737         { 8,
2738           "\x00\x00\x00\x00\x00\x00\x00\x00",
2739           "\x4D\xFA\x5E\x48\x1D\xA2\x3E\xA0"
2740         }
2741       }
2742     },
2743     {
2744       "Salsa20 128 bit, test 2",
2745       GCRY_CIPHER_SALSA20, 16, 8,
2746       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
2747       "\x80\x00\x00\x00\x00\x00\x00\x00",
2748       {
2749         { 8,
2750           "\x00\x00\x00\x00\x00\x00\x00\x00",
2751           "\xB6\x6C\x1E\x44\x46\xDD\x95\x57"
2752         }
2753       }
2754     },
2755     {
2756       "Salsa20 128 bit, test 3",
2757       GCRY_CIPHER_SALSA20, 16, 8,
2758       "\x00\x53\xA6\xF9\x4C\x9F\xF2\x45\x98\xEB\x3E\x91\xE4\x37\x8A\xDD",
2759       "\x0D\x74\xDB\x42\xA9\x10\x77\xDE",
2760       {
2761         { 8,
2762           "\x00\x00\x00\x00\x00\x00\x00\x00",
2763           "\x05\xE1\xE7\xBE\xB6\x97\xD9\x99"
2764         }
2765       }
2766     },
2767     {
2768       "Salsa20 256 bit, test 1",
2769       GCRY_CIPHER_SALSA20, 32, 8,
2770       "\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2771       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
2772       "\x00\x00\x00\x00\x00\x00\x00\x00",
2773       {
2774         { 8,
2775           "\x00\x00\x00\x00\x00\x00\x00\x00",
2776           "\xE3\xBE\x8F\xDD\x8B\xEC\xA2\xE3"
2777         }
2778       }
2779     },
2780     {
2781       "Salsa20 256 bit, test 2",
2782       GCRY_CIPHER_SALSA20, 32, 8,
2783       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2784       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
2785       "\x80\x00\x00\x00\x00\x00\x00\x00",
2786       {
2787         { 8,
2788           "\x00\x00\x00\x00\x00\x00\x00\x00",
2789           "\x2A\xBA\x3D\xC4\x5B\x49\x47\x00"
2790         }
2791       }
2792     },
2793     {
2794       "Salsa20 256 bit, ecrypt verified, set 6, vector 0",
2795       GCRY_CIPHER_SALSA20, 32, 8,
2796       "\x00\x53\xA6\xF9\x4C\x9F\xF2\x45\x98\xEB\x3E\x91\xE4\x37\x8A\xDD"
2797       "\x30\x83\xD6\x29\x7C\xCF\x22\x75\xC8\x1B\x6E\xC1\x14\x67\xBA\x0D",
2798       "\x0D\x74\xDB\x42\xA9\x10\x77\xDE",
2799       {
2800         { 8,
2801           "\x00\x00\x00\x00\x00\x00\x00\x00",
2802           "\xF5\xFA\xD5\x3F\x79\xF9\xDF\x58"
2803         },
2804         { 64,
2805           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2806           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2807           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2808           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
2809           "\xF5\xFA\xD5\x3F\x79\xF9\xDF\x58\xC4\xAE\xA0\xD0\xED\x9A\x96\x01"
2810           "\xF2\x78\x11\x2C\xA7\x18\x0D\x56\x5B\x42\x0A\x48\x01\x96\x70\xEA"
2811           "\xF2\x4C\xE4\x93\xA8\x62\x63\xF6\x77\xB4\x6A\xCE\x19\x24\x77\x3D"
2812           "\x2B\xB2\x55\x71\xE1\xAA\x85\x93\x75\x8F\xC3\x82\xB1\x28\x0B\x71"
2813         }
2814       }
2815     },
2816     {
2817       "Salsa20/12 128 bit, test 1",
2818       GCRY_CIPHER_SALSA20R12, 16, 8,
2819       "\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
2820       "\x00\x00\x00\x00\x00\x00\x00\x00",
2821       {
2822         { 8,
2823           "\x00\x00\x00\x00\x00\x00\x00\x00",
2824           "\xFC\x20\x7D\xBF\xC7\x6C\x5E\x17"
2825         }
2826       }
2827     },
2828     {
2829       "Salsa20/12 128 bit, test 2",
2830       GCRY_CIPHER_SALSA20R12, 16, 8,
2831       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
2832       "\x80\x00\x00\x00\x00\x00\x00\x00",
2833       {
2834         { 8,
2835           "\x00\x00\x00\x00\x00\x00\x00\x00",
2836           "\x08\x28\x39\x9A\x6F\xEF\x20\xDA"
2837         }
2838       }
2839     },
2840     {
2841       "Salsa20/12 128 bit, test 3",
2842       GCRY_CIPHER_SALSA20R12, 16, 8,
2843       "\x00\x53\xA6\xF9\x4C\x9F\xF2\x45\x98\xEB\x3E\x91\xE4\x37\x8A\xDD",
2844       "\x0D\x74\xDB\x42\xA9\x10\x77\xDE",
2845       {
2846         { 8,
2847           "\x00\x00\x00\x00\x00\x00\x00\x00",
2848           "\xAD\x9E\x60\xE6\xD2\xA2\x64\xB8"
2849         }
2850       }
2851     },
2852     {
2853       "Salsa20/12 256 bit, test 1",
2854       GCRY_CIPHER_SALSA20R12, 32, 8,
2855       "\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2856       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
2857       "\x00\x00\x00\x00\x00\x00\x00\x00",
2858       {
2859         { 8,
2860           "\x00\x00\x00\x00\x00\x00\x00\x00",
2861           "\xAF\xE4\x11\xED\x1C\x4E\x07\xE4"
2862         }
2863       }
2864     },
2865     {
2866       "Salsa20/12 256 bit, test 2",
2867       GCRY_CIPHER_SALSA20R12, 32, 8,
2868       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2869       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
2870       "\x80\x00\x00\x00\x00\x00\x00\x00",
2871       {
2872         { 8,
2873           "\x00\x00\x00\x00\x00\x00\x00\x00",
2874           "\x17\x2C\x51\x92\xCB\x6E\x64\x5B"
2875         }
2876       }
2877     },
2878     {
2879       "Salsa20/12 256 bit, ecrypt verified, set 6, vector 0",
2880       GCRY_CIPHER_SALSA20R12, 32, 8,
2881       "\x00\x53\xA6\xF9\x4C\x9F\xF2\x45\x98\xEB\x3E\x91\xE4\x37\x8A\xDD"
2882       "\x30\x83\xD6\x29\x7C\xCF\x22\x75\xC8\x1B\x6E\xC1\x14\x67\xBA\x0D",
2883       "\x0D\x74\xDB\x42\xA9\x10\x77\xDE",
2884       {
2885         { 8,
2886           "\x00\x00\x00\x00\x00\x00\x00\x00",
2887           "\x52\xE2\x0C\xF8\x77\x5A\xE8\x82"
2888         },
2889         { 64,
2890           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2891           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2892           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2893           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
2894           "\x52\xE2\x0C\xF8\x77\x5A\xE8\x82\xF2\x00\xC2\x99\x9F\xE4\xBA\x31"
2895           "\xA7\xA1\x8F\x1D\x5C\x97\x16\x19\x1D\x12\x31\x75\xE1\x47\xBD\x4E"
2896           "\x8C\xA6\xED\x16\x6C\xE0\xFC\x8E\x65\xA5\xCA\x60\x84\x20\xFC\x65"
2897           "\x44\xC9\x70\x0A\x0F\x21\x38\xE8\xC1\xA2\x86\xFB\x8C\x1F\xBF\xA0"
2898         }
2899       }
2900     },
2901 #endif /*USE_SALSA20*/
2902 #ifdef USE_CHACHA20
2903     /* From draft-strombergson-chacha-test-vectors-01 */
2904     {
2905       "ChaCha20 128 bit, TC1",
2906       GCRY_CIPHER_CHACHA20, 16, 8,
2907       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
2908       "\x00\x00\x00\x00\x00\x00\x00\x00",
2909       {
2910         { 8,
2911           "\x00\x00\x00\x00\x00\x00\x00\x00",
2912           "\x89\x67\x09\x52\x60\x83\x64\xfd"
2913         },
2914         { 112,
2915           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2916           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2917           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2918           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2919           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2920           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2921           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
2922           "\x89\x67\x09\x52\x60\x83\x64\xfd\x00\xb2\xf9\x09\x36\xf0\x31\xc8"
2923           "\xe7\x56\xe1\x5d\xba\x04\xb8\x49\x3d\x00\x42\x92\x59\xb2\x0f\x46"
2924           "\xcc\x04\xf1\x11\x24\x6b\x6c\x2c\xe0\x66\xbe\x3b\xfb\x32\xd9\xaa"
2925           "\x0f\xdd\xfb\xc1\x21\x23\xd4\xb9\xe4\x4f\x34\xdc\xa0\x5a\x10\x3f"
2926           "\x6c\xd1\x35\xc2\x87\x8c\x83\x2b\x58\x96\xb1\x34\xf6\x14\x2a\x9d"
2927           "\x4d\x8d\x0d\x8f\x10\x26\xd2\x0a\x0a\x81\x51\x2c\xbc\xe6\xe9\x75"
2928           "\x8a\x71\x43\xd0\x21\x97\x80\x22\xa3\x84\x14\x1a\x80\xce\xa3\x06"
2929         },
2930         { 128,
2931           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2932           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2933           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2934           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2935           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2936           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2937           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2938           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
2939           "\x89\x67\x09\x52\x60\x83\x64\xfd\x00\xb2\xf9\x09\x36\xf0\x31\xc8"
2940           "\xe7\x56\xe1\x5d\xba\x04\xb8\x49\x3d\x00\x42\x92\x59\xb2\x0f\x46"
2941           "\xcc\x04\xf1\x11\x24\x6b\x6c\x2c\xe0\x66\xbe\x3b\xfb\x32\xd9\xaa"
2942           "\x0f\xdd\xfb\xc1\x21\x23\xd4\xb9\xe4\x4f\x34\xdc\xa0\x5a\x10\x3f"
2943           "\x6c\xd1\x35\xc2\x87\x8c\x83\x2b\x58\x96\xb1\x34\xf6\x14\x2a\x9d"
2944           "\x4d\x8d\x0d\x8f\x10\x26\xd2\x0a\x0a\x81\x51\x2c\xbc\xe6\xe9\x75"
2945           "\x8a\x71\x43\xd0\x21\x97\x80\x22\xa3\x84\x14\x1a\x80\xce\xa3\x06"
2946           "\x2f\x41\xf6\x7a\x75\x2e\x66\xad\x34\x11\x98\x4c\x78\x7e\x30\xad"
2947         }
2948       }
2949     },
2950     {
2951       "ChaCha20 256 bit, TC1",
2952       GCRY_CIPHER_CHACHA20, 32, 8,
2953       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2954       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
2955       "\x00\x00\x00\x00\x00\x00\x00\x00",
2956       {
2957         { 8,
2958           "\x00\x00\x00\x00\x00\x00\x00\x00",
2959           "\x76\xb8\xe0\xad\xa0\xf1\x3d\x90"
2960         },
2961         { 112,
2962           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2963           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2964           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2965           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2966           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2967           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2968           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
2969           "\x76\xb8\xe0\xad\xa0\xf1\x3d\x90\x40\x5d\x6a\xe5\x53\x86\xbd\x28"
2970           "\xbd\xd2\x19\xb8\xa0\x8d\xed\x1a\xa8\x36\xef\xcc\x8b\x77\x0d\xc7"
2971           "\xda\x41\x59\x7c\x51\x57\x48\x8d\x77\x24\xe0\x3f\xb8\xd8\x4a\x37"
2972           "\x6a\x43\xb8\xf4\x15\x18\xa1\x1c\xc3\x87\xb6\x69\xb2\xee\x65\x86"
2973           "\x9f\x07\xe7\xbe\x55\x51\x38\x7a\x98\xba\x97\x7c\x73\x2d\x08\x0d"
2974           "\xcb\x0f\x29\xa0\x48\xe3\x65\x69\x12\xc6\x53\x3e\x32\xee\x7a\xed"
2975           "\x29\xb7\x21\x76\x9c\xe6\x4e\x43\xd5\x71\x33\xb0\x74\xd8\x39\xd5"
2976         },
2977         { 128,
2978           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2979           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2980           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2981           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2982           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2983           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2984           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2985           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
2986           "\x76\xb8\xe0\xad\xa0\xf1\x3d\x90\x40\x5d\x6a\xe5\x53\x86\xbd\x28"
2987           "\xbd\xd2\x19\xb8\xa0\x8d\xed\x1a\xa8\x36\xef\xcc\x8b\x77\x0d\xc7"
2988           "\xda\x41\x59\x7c\x51\x57\x48\x8d\x77\x24\xe0\x3f\xb8\xd8\x4a\x37"
2989           "\x6a\x43\xb8\xf4\x15\x18\xa1\x1c\xc3\x87\xb6\x69\xb2\xee\x65\x86"
2990           "\x9f\x07\xe7\xbe\x55\x51\x38\x7a\x98\xba\x97\x7c\x73\x2d\x08\x0d"
2991           "\xcb\x0f\x29\xa0\x48\xe3\x65\x69\x12\xc6\x53\x3e\x32\xee\x7a\xed"
2992           "\x29\xb7\x21\x76\x9c\xe6\x4e\x43\xd5\x71\x33\xb0\x74\xd8\x39\xd5"
2993           "\x31\xed\x1f\x28\x51\x0a\xfb\x45\xac\xe1\x0a\x1f\x4b\x79\x4d\x6f"
2994         }
2995       }
2996     },
2997     {
2998       "ChaCha20 256 bit, TC2",
2999       GCRY_CIPHER_CHACHA20, 32, 8,
3000       "\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3001       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
3002       "\x00\x00\x00\x00\x00\x00\x00\x00",
3003       {
3004         { 128,
3005           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3006           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3007           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3008           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3009           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3010           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3011           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3012           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
3013           "\xc5\xd3\x0a\x7c\xe1\xec\x11\x93\x78\xc8\x4f\x48\x7d\x77\x5a\x85"
3014           "\x42\xf1\x3e\xce\x23\x8a\x94\x55\xe8\x22\x9e\x88\x8d\xe8\x5b\xbd"
3015           "\x29\xeb\x63\xd0\xa1\x7a\x5b\x99\x9b\x52\xda\x22\xbe\x40\x23\xeb"
3016           "\x07\x62\x0a\x54\xf6\xfa\x6a\xd8\x73\x7b\x71\xeb\x04\x64\xda\xc0"
3017           "\x10\xf6\x56\xe6\xd1\xfd\x55\x05\x3e\x50\xc4\x87\x5c\x99\x30\xa3"
3018           "\x3f\x6d\x02\x63\xbd\x14\xdf\xd6\xab\x8c\x70\x52\x1c\x19\x33\x8b"
3019           "\x23\x08\xb9\x5c\xf8\xd0\xbb\x7d\x20\x2d\x21\x02\x78\x0e\xa3\x52"
3020           "\x8f\x1c\xb4\x85\x60\xf7\x6b\x20\xf3\x82\xb9\x42\x50\x0f\xce\xac"
3021         }
3022       }
3023     },
3024     {
3025       "ChaCha20 256 bit, TC3",
3026       GCRY_CIPHER_CHACHA20, 32, 8,
3027       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3028       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
3029       "\x01\x00\x00\x00\x00\x00\x00\x00",
3030       {
3031         { 128,
3032           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3033           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3034           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3035           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3036           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3037           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3038           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3039           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
3040           "\xef\x3f\xdf\xd6\xc6\x15\x78\xfb\xf5\xcf\x35\xbd\x3d\xd3\x3b\x80"
3041           "\x09\x63\x16\x34\xd2\x1e\x42\xac\x33\x96\x0b\xd1\x38\xe5\x0d\x32"
3042           "\x11\x1e\x4c\xaf\x23\x7e\xe5\x3c\xa8\xad\x64\x26\x19\x4a\x88\x54"
3043           "\x5d\xdc\x49\x7a\x0b\x46\x6e\x7d\x6b\xbd\xb0\x04\x1b\x2f\x58\x6b"
3044           "\x53\x05\xe5\xe4\x4a\xff\x19\xb2\x35\x93\x61\x44\x67\x5e\xfb\xe4"
3045           "\x40\x9e\xb7\xe8\xe5\xf1\x43\x0f\x5f\x58\x36\xae\xb4\x9b\xb5\x32"
3046           "\x8b\x01\x7c\x4b\x9d\xc1\x1f\x8a\x03\x86\x3f\xa8\x03\xdc\x71\xd5"
3047           "\x72\x6b\x2b\x6b\x31\xaa\x32\x70\x8a\xfe\x5a\xf1\xd6\xb6\x90\x58"
3048         }
3049       }
3050     },
3051     {
3052       "ChaCha20 256 bit, TC4",
3053       GCRY_CIPHER_CHACHA20, 32, 8,
3054       "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
3055       "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff",
3056       "\xff\xff\xff\xff\xff\xff\xff\xff",
3057       {
3058         { 128,
3059           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3060           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3061           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3062           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3063           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3064           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3065           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3066           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
3067           "\xd9\xbf\x3f\x6b\xce\x6e\xd0\xb5\x42\x54\x55\x77\x67\xfb\x57\x44"
3068           "\x3d\xd4\x77\x89\x11\xb6\x06\x05\x5c\x39\xcc\x25\xe6\x74\xb8\x36"
3069           "\x3f\xea\xbc\x57\xfd\xe5\x4f\x79\x0c\x52\xc8\xae\x43\x24\x0b\x79"
3070           "\xd4\x90\x42\xb7\x77\xbf\xd6\xcb\x80\xe9\x31\x27\x0b\x7f\x50\xeb"
3071           "\x5b\xac\x2a\xcd\x86\xa8\x36\xc5\xdc\x98\xc1\x16\xc1\x21\x7e\xc3"
3072           "\x1d\x3a\x63\xa9\x45\x13\x19\xf0\x97\xf3\xb4\xd6\xda\xb0\x77\x87"
3073           "\x19\x47\x7d\x24\xd2\x4b\x40\x3a\x12\x24\x1d\x7c\xca\x06\x4f\x79"
3074           "\x0f\x1d\x51\xcc\xaf\xf6\xb1\x66\x7d\x4b\xbc\xa1\x95\x8c\x43\x06"
3075         }
3076       }
3077     },
3078     {
3079       "ChaCha20 256 bit, TC5",
3080       GCRY_CIPHER_CHACHA20, 32, 8,
3081       "\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55"
3082       "\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55",
3083       "\x55\x55\x55\x55\x55\x55\x55\x55",
3084       {
3085         { 128,
3086           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3087           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3088           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3089           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3090           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3091           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3092           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3093           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
3094           "\xbe\xa9\x41\x1a\xa4\x53\xc5\x43\x4a\x5a\xe8\xc9\x28\x62\xf5\x64"
3095           "\x39\x68\x55\xa9\xea\x6e\x22\xd6\xd3\xb5\x0a\xe1\xb3\x66\x33\x11"
3096           "\xa4\xa3\x60\x6c\x67\x1d\x60\x5c\xe1\x6c\x3a\xec\xe8\xe6\x1e\xa1"
3097           "\x45\xc5\x97\x75\x01\x7b\xee\x2f\xa6\xf8\x8a\xfc\x75\x80\x69\xf7"
3098           "\xe0\xb8\xf6\x76\xe6\x44\x21\x6f\x4d\x2a\x34\x22\xd7\xfa\x36\xc6"
3099           "\xc4\x93\x1a\xca\x95\x0e\x9d\xa4\x27\x88\xe6\xd0\xb6\xd1\xcd\x83"
3100           "\x8e\xf6\x52\xe9\x7b\x14\x5b\x14\x87\x1e\xae\x6c\x68\x04\xc7\x00"
3101           "\x4d\xb5\xac\x2f\xce\x4c\x68\xc7\x26\xd0\x04\xb1\x0f\xca\xba\x86"
3102         }
3103       }
3104     },
3105     {
3106       "ChaCha20 256 bit, TC6",
3107       GCRY_CIPHER_CHACHA20, 32, 8,
3108       "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
3109       "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
3110       "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
3111       {
3112         { 128,
3113           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3114           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3115           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3116           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3117           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3118           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3119           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3120           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
3121           "\x9a\xa2\xa9\xf6\x56\xef\xde\x5a\xa7\x59\x1c\x5f\xed\x4b\x35\xae"
3122           "\xa2\x89\x5d\xec\x7c\xb4\x54\x3b\x9e\x9f\x21\xf5\xe7\xbc\xbc\xf3"
3123           "\xc4\x3c\x74\x8a\x97\x08\x88\xf8\x24\x83\x93\xa0\x9d\x43\xe0\xb7"
3124           "\xe1\x64\xbc\x4d\x0b\x0f\xb2\x40\xa2\xd7\x21\x15\xc4\x80\x89\x06"
3125           "\x72\x18\x44\x89\x44\x05\x45\xd0\x21\xd9\x7e\xf6\xb6\x93\xdf\xe5"
3126           "\xb2\xc1\x32\xd4\x7e\x6f\x04\x1c\x90\x63\x65\x1f\x96\xb6\x23\xe6"
3127           "\x2a\x11\x99\x9a\x23\xb6\xf7\xc4\x61\xb2\x15\x30\x26\xad\x5e\x86"
3128           "\x6a\x2e\x59\x7e\xd0\x7b\x84\x01\xde\xc6\x3a\x09\x34\xc6\xb2\xa9"
3129         }
3130       }
3131     },
3132     {
3133       "ChaCha20 256 bit, TC7",
3134       GCRY_CIPHER_CHACHA20, 32, 8,
3135       "\x00\x11\x22\x33\x44\x55\x66\x77\x88\x99\xaa\xbb\xcc\xdd\xee\xff"
3136       "\xff\xee\xdd\xcc\xbb\xaa\x99\x88\x77\x66\x55\x44\x33\x22\x11\x00",
3137       "\x0f\x1e\x2d\x3c\x4b\x5a\x69\x78",
3138       {
3139         { 128,
3140           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3141           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3142           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3143           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3144           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3145           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3146           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3147           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
3148           "\x9f\xad\xf4\x09\xc0\x08\x11\xd0\x04\x31\xd6\x7e\xfb\xd8\x8f\xba"
3149           "\x59\x21\x8d\x5d\x67\x08\xb1\xd6\x85\x86\x3f\xab\xbb\x0e\x96\x1e"
3150           "\xea\x48\x0f\xd6\xfb\x53\x2b\xfd\x49\x4b\x21\x51\x01\x50\x57\x42"
3151           "\x3a\xb6\x0a\x63\xfe\x4f\x55\xf7\xa2\x12\xe2\x16\x7c\xca\xb9\x31"
3152           "\xfb\xfd\x29\xcf\x7b\xc1\xd2\x79\xed\xdf\x25\xdd\x31\x6b\xb8\x84"
3153           "\x3d\x6e\xde\xe0\xbd\x1e\xf1\x21\xd1\x2f\xa1\x7c\xbc\x2c\x57\x4c"
3154           "\xcc\xab\x5e\x27\x51\x67\xb0\x8b\xd6\x86\xf8\xa0\x9d\xf8\x7e\xc3"
3155           "\xff\xb3\x53\x61\xb9\x4e\xbf\xa1\x3f\xec\x0e\x48\x89\xd1\x8d\xa5"
3156         }
3157       }
3158     },
3159     {
3160       "ChaCha20 256 bit, TC8",
3161       GCRY_CIPHER_CHACHA20, 32, 8,
3162       "\xc4\x6e\xc1\xb1\x8c\xe8\xa8\x78\x72\x5a\x37\xe7\x80\xdf\xb7\x35"
3163       "\x1f\x68\xed\x2e\x19\x4c\x79\xfb\xc6\xae\xbe\xe1\xa6\x67\x97\x5d",
3164       "\x1a\xda\x31\xd5\xcf\x68\x82\x21",
3165       {
3166         { 128,
3167           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3168           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3169           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3170           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3171           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3172           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3173           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3174           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
3175           "\xf6\x3a\x89\xb7\x5c\x22\x71\xf9\x36\x88\x16\x54\x2b\xa5\x2f\x06"
3176           "\xed\x49\x24\x17\x92\x30\x2b\x00\xb5\xe8\xf8\x0a\xe9\xa4\x73\xaf"
3177           "\xc2\x5b\x21\x8f\x51\x9a\xf0\xfd\xd4\x06\x36\x2e\x8d\x69\xde\x7f"
3178           "\x54\xc6\x04\xa6\xe0\x0f\x35\x3f\x11\x0f\x77\x1b\xdc\xa8\xab\x92"
3179           "\xe5\xfb\xc3\x4e\x60\xa1\xd9\xa9\xdb\x17\x34\x5b\x0a\x40\x27\x36"
3180           "\x85\x3b\xf9\x10\xb0\x60\xbd\xf1\xf8\x97\xb6\x29\x0f\x01\xd1\x38"
3181           "\xae\x2c\x4c\x90\x22\x5b\xa9\xea\x14\xd5\x18\xf5\x59\x29\xde\xa0"
3182           "\x98\xca\x7a\x6c\xcf\xe6\x12\x27\x05\x3c\x84\xe4\x9a\x4a\x33\x32"
3183         },
3184         { 127,
3185           "\xf6\x3a\x89\xb7\x5c\x22\x71\xf9\x36\x88\x16\x54\x2b\xa5\x2f\x06"
3186           "\xed\x49\x24\x17\x92\x30\x2b\x00\xb5\xe8\xf8\x0a\xe9\xa4\x73\xaf"
3187           "\xc2\x5b\x21\x8f\x51\x9a\xf0\xfd\xd4\x06\x36\x2e\x8d\x69\xde\x7f"
3188           "\x54\xc6\x04\xa6\xe0\x0f\x35\x3f\x11\x0f\x77\x1b\xdc\xa8\xab\x92"
3189           "\xe5\xfb\xc3\x4e\x60\xa1\xd9\xa9\xdb\x17\x34\x5b\x0a\x40\x27\x36"
3190           "\x85\x3b\xf9\x10\xb0\x60\xbd\xf1\xf8\x97\xb6\x29\x0f\x01\xd1\x38"
3191           "\xae\x2c\x4c\x90\x22\x5b\xa9\xea\x14\xd5\x18\xf5\x59\x29\xde\xa0"
3192           "\x98\xca\x7a\x6c\xcf\xe6\x12\x27\x05\x3c\x84\xe4\x9a\x4a\x33",
3193           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3194           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3195           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3196           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3197           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3198           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3199           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3200           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3201         }
3202       }
3203     },
3204     /* from draft-nir-cfrg-chacha20-poly1305-02 */
3205     {
3206       "ChaCha20 256 bit, IV96-bit",
3207       GCRY_CIPHER_CHACHA20, 32, 12,
3208       "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
3209       "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f",
3210       "\x07\x00\x00\x00\x40\x41\x42\x43\x44\x45\x46\x47",
3211       {
3212         { 64,
3213           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3214           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3215           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
3216           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
3217           "\x7b\xac\x2b\x25\x2d\xb4\x47\xaf\x09\xb6\x7a\x55\xa4\xe9\x55\x84"
3218           "\x0a\xe1\xd6\x73\x10\x75\xd9\xeb\x2a\x93\x75\x78\x3e\xd5\x53\xff"
3219           "\xa2\x7e\xcc\xde\xad\xdb\x4d\xb4\xd1\x17\x9c\xe4\xc9\x0b\x43\xd8"
3220           "\xbc\xb7\x94\x8c\x4b\x4b\x7d\x8b\x7d\xf6\x27\x39\x32\xa4\x69\x16"
3221         },
3222       },
3223     },
3224 #endif /*USE_CHACHA20*/
3225   };
3226
3227   gcry_cipher_hd_t hde, hdd;
3228   unsigned char out[MAX_DATA_LEN];
3229   int i, j;
3230   gcry_error_t err = 0;
3231
3232
3233   if (verbose)
3234     fprintf (stderr, "  Starting stream cipher checks.\n");
3235
3236   for (i = 0; i < sizeof (tv) / sizeof (tv[0]); i++)
3237     {
3238       if (verbose)
3239         fprintf (stderr, "    checking stream mode for %s [%i] (%s)\n",
3240                  gcry_cipher_algo_name (tv[i].algo), tv[i].algo, tv[i].name);
3241
3242       if (gcry_cipher_get_algo_blklen(tv[i].algo) != 1)
3243         {
3244           fail ("stream, gcry_cipher_get_algo_blklen: bad block length\n");
3245           continue;
3246         }
3247
3248       err = gcry_cipher_open (&hde, tv[i].algo, GCRY_CIPHER_MODE_STREAM, 0);
3249       if (!err)
3250         err = gcry_cipher_open (&hdd, tv[i].algo, GCRY_CIPHER_MODE_STREAM, 0);
3251       if (err)
3252         {
3253           fail ("stream, gcry_cipher_open for stream mode failed: %s\n",
3254                 gpg_strerror (err));
3255           continue;
3256         }
3257
3258       /* Now loop over all the data samples.  */
3259       for (j = 0; tv[i].data[j].inlen; j++)
3260         {
3261           err = gcry_cipher_setkey (hde, tv[i].key, tv[i].keylen);
3262           if (!err)
3263             err = gcry_cipher_setkey (hdd, tv[i].key, tv[i].keylen);
3264           if (err)
3265             {
3266               fail ("stream, gcry_cipher_setkey failed: %s\n",
3267                     gpg_strerror (err));
3268               goto next;
3269             }
3270
3271           err = gcry_cipher_setiv (hde, tv[i].iv, tv[i].ivlen);
3272           if (!err)
3273             err = gcry_cipher_setiv (hdd, tv[i].iv, tv[i].ivlen);
3274           if (err)
3275             {
3276               fail ("stream, gcry_cipher_setiv failed: %s\n",
3277                     gpg_strerror (err));
3278               goto next;
3279             }
3280
3281           err = gcry_cipher_encrypt (hde, out, MAX_DATA_LEN,
3282                                      tv[i].data[j].plaintext,
3283                                      tv[i].data[j].inlen);
3284           if (err)
3285             {
3286               fail ("stream, gcry_cipher_encrypt (%d, %d) failed: %s\n",
3287                     i, j, gpg_strerror (err));
3288               goto next;
3289             }
3290
3291           if (memcmp (tv[i].data[j].out, out, tv[i].data[j].inlen))
3292             {
3293               fail ("stream, encrypt mismatch entry %d:%d\n", i, j);
3294               mismatch (tv[i].data[j].out, tv[i].data[j].inlen,
3295                         out, tv[i].data[j].inlen);
3296             }
3297
3298           err = gcry_cipher_decrypt (hdd, out, tv[i].data[j].inlen, NULL, 0);
3299           if (err)
3300             {
3301               fail ("stream, gcry_cipher_decrypt (%d, %d) failed: %s\n",
3302                     i, j, gpg_strerror (err));
3303               goto next;
3304             }
3305
3306           if (memcmp (tv[i].data[j].plaintext, out, tv[i].data[j].inlen))
3307             fail ("stream, decrypt mismatch entry %d:%d\n", i, j);
3308         }
3309
3310
3311       /* This time we encrypt and decrypt one byte at a time */
3312       for (j = 0; tv[i].data[j].inlen; j++)
3313         {
3314           int byteNum;
3315
3316           err = gcry_cipher_setkey (hde, tv[i].key, tv[i].keylen);
3317           if (!err)
3318             err = gcry_cipher_setkey (hdd, tv[i].key, tv[i].keylen);
3319           if (err)
3320             {
3321               fail ("stream, gcry_cipher_setkey failed: %s\n",
3322                     gpg_strerror (err));
3323               goto next;
3324             }
3325
3326           err = gcry_cipher_setiv (hde, tv[i].iv, tv[i].ivlen);
3327           if (!err)
3328             err = gcry_cipher_setiv (hdd, tv[i].iv, tv[i].ivlen);
3329           if (err)
3330             {
3331               fail ("stream, gcry_cipher_setiv failed: %s\n",
3332                     gpg_strerror (err));
3333               goto next;
3334             }
3335
3336           for (byteNum = 0; byteNum < tv[i].data[j].inlen; ++byteNum)
3337             {
3338               err = gcry_cipher_encrypt (hde, out+byteNum, 1,
3339                                          (tv[i].data[j].plaintext) + byteNum,
3340                                          1);
3341               if (err)
3342                 {
3343                   fail ("stream, gcry_cipher_encrypt (%d, %d) failed: %s\n",
3344                         i, j, gpg_strerror (err));
3345                   goto next;
3346                 }
3347             }
3348
3349           if (memcmp (tv[i].data[j].out, out, tv[i].data[j].inlen))
3350             fail ("stream, encrypt mismatch entry %d:%d (byte-wise)\n", i, j);
3351
3352           for (byteNum = 0; byteNum < tv[i].data[j].inlen; ++byteNum)
3353             {
3354               err = gcry_cipher_decrypt (hdd, out+byteNum, 1, NULL, 0);
3355               if (err)
3356                 {
3357                   fail ("stream, gcry_cipher_decrypt (%d, %d) failed: %s\n",
3358                         i, j, gpg_strerror (err));
3359                   goto next;
3360                 }
3361             }
3362
3363           if (memcmp (tv[i].data[j].plaintext, out, tv[i].data[j].inlen))
3364             fail ("stream, decrypt mismatch entry %d:%d (byte-wise)\n", i, j);
3365         }
3366
3367     next:
3368       gcry_cipher_close (hde);
3369       gcry_cipher_close (hdd);
3370     }
3371   if (verbose)
3372     fprintf (stderr, "  Completed stream cipher checks.\n");
3373 }
3374
3375
3376 static void
3377 check_stream_cipher_large_block (void)
3378 {
3379   static const struct tv
3380   {
3381     const char *name;
3382     int algo;
3383     int keylen;
3384     int ivlen;
3385     const char *key;
3386     const char *iv;
3387     struct data
3388     {
3389       int offset, length;
3390       const char *result;
3391     } data[MAX_DATA_LEN];
3392   } tv[] = {
3393 #ifdef USE_SALSA20
3394     {
3395       "Salsa20 256 bit, ecrypt verified, set 6, vector 0",
3396       GCRY_CIPHER_SALSA20, 32, 8,
3397       "\x00\x53\xA6\xF9\x4C\x9F\xF2\x45\x98\xEB\x3E\x91\xE4\x37\x8A\xDD"
3398       "\x30\x83\xD6\x29\x7C\xCF\x22\x75\xC8\x1B\x6E\xC1\x14\x67\xBA\x0D",
3399       "\x0D\x74\xDB\x42\xA9\x10\x77\xDE",
3400       {
3401         { 0, 64,
3402           "\xF5\xFA\xD5\x3F\x79\xF9\xDF\x58\xC4\xAE\xA0\xD0\xED\x9A\x96\x01"
3403           "\xF2\x78\x11\x2C\xA7\x18\x0D\x56\x5B\x42\x0A\x48\x01\x96\x70\xEA"
3404           "\xF2\x4C\xE4\x93\xA8\x62\x63\xF6\x77\xB4\x6A\xCE\x19\x24\x77\x3D"
3405           "\x2B\xB2\x55\x71\xE1\xAA\x85\x93\x75\x8F\xC3\x82\xB1\x28\x0B\x71"
3406         },
3407         { 65472, 64,
3408          "\xB7\x0C\x50\x13\x9C\x63\x33\x2E\xF6\xE7\x7A\xC5\x43\x38\xA4\x07"
3409          "\x9B\x82\xBE\xC9\xF9\xA4\x03\xDF\xEA\x82\x1B\x83\xF7\x86\x07\x91"
3410          "\x65\x0E\xF1\xB2\x48\x9D\x05\x90\xB1\xDE\x77\x2E\xED\xA4\xE3\xBC"
3411          "\xD6\x0F\xA7\xCE\x9C\xD6\x23\xD9\xD2\xFD\x57\x58\xB8\x65\x3E\x70"
3412         },
3413         { 65536, 64,
3414          "\x81\x58\x2C\x65\xD7\x56\x2B\x80\xAE\xC2\xF1\xA6\x73\xA9\xD0\x1C"
3415          "\x9F\x89\x2A\x23\xD4\x91\x9F\x6A\xB4\x7B\x91\x54\xE0\x8E\x69\x9B"
3416          "\x41\x17\xD7\xC6\x66\x47\x7B\x60\xF8\x39\x14\x81\x68\x2F\x5D\x95"
3417          "\xD9\x66\x23\xDB\xC4\x89\xD8\x8D\xAA\x69\x56\xB9\xF0\x64\x6B\x6E"
3418         },
3419         { 131008, 64,
3420          "\xA1\x3F\xFA\x12\x08\xF8\xBF\x50\x90\x08\x86\xFA\xAB\x40\xFD\x10"
3421          "\xE8\xCA\xA3\x06\xE6\x3D\xF3\x95\x36\xA1\x56\x4F\xB7\x60\xB2\x42"
3422          "\xA9\xD6\xA4\x62\x8C\xDC\x87\x87\x62\x83\x4E\x27\xA5\x41\xDA\x2A"
3423          "\x5E\x3B\x34\x45\x98\x9C\x76\xF6\x11\xE0\xFE\xC6\xD9\x1A\xCA\xCC"
3424         }
3425       }
3426     },
3427     {
3428       "Salsa20 256 bit, ecrypt verified, set 6, vector 1",
3429       GCRY_CIPHER_SALSA20, 32, 8,
3430       "\x05\x58\xAB\xFE\x51\xA4\xF7\x4A\x9D\xF0\x43\x96\xE9\x3C\x8F\xE2"
3431       "\x35\x88\xDB\x2E\x81\xD4\x27\x7A\xCD\x20\x73\xC6\x19\x6C\xBF\x12",
3432       "\x16\x7D\xE4\x4B\xB2\x19\x80\xE7",
3433       {
3434         { 0, 64,
3435           "\x39\x44\xF6\xDC\x9F\x85\xB1\x28\x08\x38\x79\xFD\xF1\x90\xF7\xDE"
3436           "\xE4\x05\x3A\x07\xBC\x09\x89\x6D\x51\xD0\x69\x0B\xD4\xDA\x4A\xC1"
3437           "\x06\x2F\x1E\x47\xD3\xD0\x71\x6F\x80\xA9\xB4\xD8\x5E\x6D\x60\x85"
3438           "\xEE\x06\x94\x76\x01\xC8\x5F\x1A\x27\xA2\xF7\x6E\x45\xA6\xAA\x87"
3439         },
3440         { 65472, 64,
3441           "\x36\xE0\x3B\x4B\x54\xB0\xB2\xE0\x4D\x06\x9E\x69\x00\x82\xC8\xC5"
3442           "\x92\xDF\x56\xE6\x33\xF5\xD8\xC7\x68\x2A\x02\xA6\x5E\xCD\x13\x71"
3443           "\x8C\xA4\x35\x2A\xAC\xCB\x0D\xA2\x0E\xD6\xBB\xBA\x62\xE1\x77\xF2"
3444           "\x10\xE3\x56\x0E\x63\xBB\x82\x2C\x41\x58\xCA\xA8\x06\xA8\x8C\x82"
3445         },
3446         { 65536, 64,
3447           "\x1B\x77\x9E\x7A\x91\x7C\x8C\x26\x03\x9F\xFB\x23\xCF\x0E\xF8\xE0"
3448           "\x8A\x1A\x13\xB4\x3A\xCD\xD9\x40\x2C\xF5\xDF\x38\x50\x10\x98\xDF"
3449           "\xC9\x45\xA6\xCC\x69\xA6\xA1\x73\x67\xBC\x03\x43\x1A\x86\xB3\xED"
3450           "\x04\xB0\x24\x5B\x56\x37\x9B\xF9\x97\xE2\x58\x00\xAD\x83\x7D\x7D"
3451         },
3452         { 131008, 64,
3453           "\x7E\xC6\xDA\xE8\x1A\x10\x5E\x67\x17\x2A\x0B\x8C\x4B\xBE\x7D\x06"
3454           "\xA7\xA8\x75\x9F\x91\x4F\xBE\xB1\xAF\x62\xC8\xA5\x52\xEF\x4A\x4F"
3455           "\x56\x96\x7E\xA2\x9C\x74\x71\xF4\x6F\x3B\x07\xF7\xA3\x74\x6E\x95"
3456           "\x3D\x31\x58\x21\xB8\x5B\x6E\x8C\xB4\x01\x22\xB9\x66\x35\x31\x3C"
3457         }
3458       }
3459     },
3460     {
3461       "Salsa20 256 bit, ecrypt verified, set 6, vector 2",
3462       GCRY_CIPHER_SALSA20, 32, 8,
3463       "\x0A\x5D\xB0\x03\x56\xA9\xFC\x4F\xA2\xF5\x48\x9B\xEE\x41\x94\xE7"
3464       "\x3A\x8D\xE0\x33\x86\xD9\x2C\x7F\xD2\x25\x78\xCB\x1E\x71\xC4\x17",
3465       "\x1F\x86\xED\x54\xBB\x22\x89\xF0",
3466       {
3467         { 0, 64,
3468           "\x3F\xE8\x5D\x5B\xB1\x96\x0A\x82\x48\x0B\x5E\x6F\x4E\x96\x5A\x44"
3469           "\x60\xD7\xA5\x45\x01\x66\x4F\x7D\x60\xB5\x4B\x06\x10\x0A\x37\xFF"
3470           "\xDC\xF6\xBD\xE5\xCE\x3F\x48\x86\xBA\x77\xDD\x5B\x44\xE9\x56\x44"
3471           "\xE4\x0A\x8A\xC6\x58\x01\x15\x5D\xB9\x0F\x02\x52\x2B\x64\x40\x23"
3472         },
3473         { 65472, 64,
3474           "\xC8\xD6\xE5\x4C\x29\xCA\x20\x40\x18\xA8\x30\xE2\x66\xCE\xEE\x0D"
3475           "\x03\x7D\xC4\x7E\x92\x19\x47\x30\x2A\xCE\x40\xD1\xB9\x96\xA6\xD8"
3476           "\x0B\x59\x86\x77\xF3\x35\x2F\x1D\xAA\x6D\x98\x88\xF8\x91\xAD\x95"
3477           "\xA1\xC3\x2F\xFE\xB7\x1B\xB8\x61\xE8\xB0\x70\x58\x51\x51\x71\xC9"
3478         },
3479         { 65536, 64,
3480           "\xB7\x9F\xD7\x76\x54\x2B\x46\x20\xEF\xCB\x88\x44\x95\x99\xF2\x34"
3481           "\x03\xE7\x4A\x6E\x91\xCA\xCC\x50\xA0\x5A\x8F\x8F\x3C\x0D\xEA\x8B"
3482           "\x00\xE1\xA5\xE6\x08\x1F\x55\x26\xAE\x97\x5B\x3B\xC0\x45\x0F\x1A"
3483           "\x0C\x8B\x66\xF8\x08\xF1\x90\x4B\x97\x13\x61\x13\x7C\x93\x15\x6F"
3484         },
3485         { 131008, 64,
3486           "\x79\x98\x20\x4F\xED\x70\xCE\x8E\x0D\x02\x7B\x20\x66\x35\xC0\x8C"
3487           "\x8B\xC4\x43\x62\x26\x08\x97\x0E\x40\xE3\xAE\xDF\x3C\xE7\x90\xAE"
3488           "\xED\xF8\x9F\x92\x26\x71\xB4\x53\x78\xE2\xCD\x03\xF6\xF6\x23\x56"
3489           "\x52\x9C\x41\x58\xB7\xFF\x41\xEE\x85\x4B\x12\x35\x37\x39\x88\xC8"
3490         }
3491       }
3492     },
3493     {
3494       "Salsa20 256 bit, ecrypt verified, set 6, vector 3",
3495       GCRY_CIPHER_SALSA20, 32, 8,
3496       "\x0F\x62\xB5\x08\x5B\xAE\x01\x54\xA7\xFA\x4D\xA0\xF3\x46\x99\xEC"
3497       "\x3F\x92\xE5\x38\x8B\xDE\x31\x84\xD7\x2A\x7D\xD0\x23\x76\xC9\x1C",
3498       "\x28\x8F\xF6\x5D\xC4\x2B\x92\xF9",
3499       {
3500         { 0, 64,
3501           "\x5E\x5E\x71\xF9\x01\x99\x34\x03\x04\xAB\xB2\x2A\x37\xB6\x62\x5B"
3502           "\xF8\x83\xFB\x89\xCE\x3B\x21\xF5\x4A\x10\xB8\x10\x66\xEF\x87\xDA"
3503           "\x30\xB7\x76\x99\xAA\x73\x79\xDA\x59\x5C\x77\xDD\x59\x54\x2D\xA2"
3504           "\x08\xE5\x95\x4F\x89\xE4\x0E\xB7\xAA\x80\xA8\x4A\x61\x76\x66\x3F"
3505         },
3506         { 65472, 64,
3507           "\x2D\xA2\x17\x4B\xD1\x50\xA1\xDF\xEC\x17\x96\xE9\x21\xE9\xD6\xE2"
3508           "\x4E\xCF\x02\x09\xBC\xBE\xA4\xF9\x83\x70\xFC\xE6\x29\x05\x6F\x64"
3509           "\x91\x72\x83\x43\x6E\x2D\x3F\x45\x55\x62\x25\x30\x7D\x5C\xC5\xA5"
3510           "\x65\x32\x5D\x89\x93\xB3\x7F\x16\x54\x19\x5C\x24\x0B\xF7\x5B\x16"
3511         },
3512         { 65536, 64,
3513           "\xAB\xF3\x9A\x21\x0E\xEE\x89\x59\x8B\x71\x33\x37\x70\x56\xC2\xFE"
3514           "\xF4\x2D\xA7\x31\x32\x75\x63\xFB\x67\xC7\xBE\xDB\x27\xF3\x8C\x7C"
3515           "\x5A\x3F\xC2\x18\x3A\x4C\x6B\x27\x7F\x90\x11\x52\x47\x2C\x6B\x2A"
3516           "\xBC\xF5\xE3\x4C\xBE\x31\x5E\x81\xFD\x3D\x18\x0B\x5D\x66\xCB\x6C"
3517         },
3518         { 131008, 64,
3519           "\x1B\xA8\x9D\xBD\x3F\x98\x83\x97\x28\xF5\x67\x91\xD5\xB7\xCE\x23"
3520           "\x50\x36\xDE\x84\x3C\xCC\xAB\x03\x90\xB8\xB5\x86\x2F\x1E\x45\x96"
3521           "\xAE\x8A\x16\xFB\x23\xDA\x99\x7F\x37\x1F\x4E\x0A\xAC\xC2\x6D\xB8"
3522           "\xEB\x31\x4E\xD4\x70\xB1\xAF\x6B\x9F\x8D\x69\xDD\x79\xA9\xD7\x50"
3523         }
3524       }
3525     },
3526     {
3527       "Salsa20/12 256 bit, ecrypt verified, set 6, vector 0",
3528       GCRY_CIPHER_SALSA20R12, 32, 8,
3529       "\x00\x53\xA6\xF9\x4C\x9F\xF2\x45\x98\xEB\x3E\x91\xE4\x37\x8A\xDD"
3530       "\x30\x83\xD6\x29\x7C\xCF\x22\x75\xC8\x1B\x6E\xC1\x14\x67\xBA\x0D",
3531       "\x0D\x74\xDB\x42\xA9\x10\x77\xDE",
3532       {
3533         { 0, 64,
3534           "\x52\xE2\x0C\xF8\x77\x5A\xE8\x82\xF2\x00\xC2\x99\x9F\xE4\xBA\x31"
3535           "\xA7\xA1\x8F\x1D\x5C\x97\x16\x19\x1D\x12\x31\x75\xE1\x47\xBD\x4E"
3536           "\x8C\xA6\xED\x16\x6C\xE0\xFC\x8E\x65\xA5\xCA\x60\x84\x20\xFC\x65"
3537           "\x44\xC9\x70\x0A\x0F\x21\x38\xE8\xC1\xA2\x86\xFB\x8C\x1F\xBF\xA0"
3538         },
3539         { 65472, 64,
3540           "\x8F\xBC\x9F\xE8\x69\x1B\xD4\xF0\x82\xB4\x7F\x54\x05\xED\xFB\xC1"
3541           "\x6F\x4D\x5A\x12\xDD\xCB\x2D\x75\x4E\x8A\x99\x98\xD0\xB2\x19\x55"
3542           "\x7D\xFE\x29\x84\xF4\xA1\xD2\xDD\xA7\x6B\x95\x96\x92\x8C\xCE\x05"
3543           "\x56\xF5\x00\x66\xCD\x59\x9E\x44\xEF\x5C\x14\xB2\x26\x68\x3A\xEF"
3544         },
3545         { 65536, 64,
3546           "\xBC\xBD\x01\xDD\x28\x96\x1C\xC7\xAD\x30\x47\x38\x6C\xBC\xC6\x7C"
3547           "\x10\x8D\x6A\xF1\x11\x67\xE4\x0D\x7A\xE1\xB2\xFC\x45\x18\xA8\x67"
3548           "\xEF\xE4\x02\x65\x1D\x1D\x88\x51\xC4\xFD\x23\x30\xC5\x97\xB3\x6A"
3549           "\x46\xD5\x68\x9E\x00\xFC\x96\xFE\xCF\x9C\xE3\xE2\x21\x1D\x44\xBE"
3550         },
3551         { 131008, 64,
3552           "\x91\x66\xF3\x1C\xD8\x5B\x5B\xB1\x8F\xC6\x14\xE5\x4E\x4A\xD6\x7F"
3553           "\xB8\x65\x8E\x3B\xF9\xFB\x19\xB7\xA8\x2F\x0F\xE7\xDC\x90\x2D\xF5"
3554           "\x63\xC6\xAC\x4F\x44\x67\x48\xC4\xBC\x3E\x14\x05\xE1\x24\x82\x0D"
3555           "\xC4\x09\x41\x99\x8F\x44\xA8\x10\xE7\x22\x78\x7F\xCD\x47\x78\x4C"
3556         }
3557       }
3558     },
3559     {
3560       "Salsa20/12 256 bit, ecrypt verified, set 6, vector 1",
3561       GCRY_CIPHER_SALSA20R12, 32, 8,
3562       "\x05\x58\xAB\xFE\x51\xA4\xF7\x4A\x9D\xF0\x43\x96\xE9\x3C\x8F\xE2"
3563       "\x35\x88\xDB\x2E\x81\xD4\x27\x7A\xCD\x20\x73\xC6\x19\x6C\xBF\x12",
3564       "\x16\x7D\xE4\x4B\xB2\x19\x80\xE7",
3565       {
3566         { 0, 64,
3567           "\xC0\x75\x60\xB3\xE7\x76\xB4\x71\xC5\xE2\x93\x14\x26\xCA\xF1\xED"
3568           "\x3A\xE4\xB8\x67\x08\x76\x82\xCA\x9D\xFD\xC2\xBA\xE8\x93\x50\xBD"
3569           "\x84\x82\x1C\xAE\xFF\x85\xAA\xC4\x9D\x74\x35\xA7\xD9\x88\x93\x52"
3570           "\xF5\x27\x9E\x36\x12\x3F\x41\x72\x8A\x14\xEF\x26\x9F\xCB\x94\x4B"
3571         },
3572         { 65472, 64,
3573           "\xEE\xD1\xBB\x58\xF9\x0C\x89\xE0\x5C\xC6\x8B\x2D\xB6\x05\x58\x49"
3574           "\xB3\xD2\xB1\x87\xB7\xF0\x2F\x9A\x24\xCE\x34\x2A\xF0\xFC\x47\xA3"
3575           "\x74\xBD\x75\x90\xFB\xF4\xFD\x9E\xE5\x9B\x1A\x38\x1E\xBF\xD2\x29"
3576           "\xAD\x2A\x29\x01\xB3\xFB\x61\x08\x12\x90\x0B\x92\x30\xE6\x22\xE9"
3577         },
3578         { 65536, 64,
3579           "\x70\xF0\x49\x3A\x1B\x62\x53\xCC\x5E\xD3\x45\x0A\x31\xCF\x37\x7D"
3580           "\x83\x4B\xAD\x20\x72\x30\x29\x27\xCC\xD8\x30\x10\x4B\xD3\x05\xFF"
3581           "\x59\xD2\x94\x17\xB2\x32\x88\x4E\xC9\x59\x19\x4D\x60\x47\xC3\xDD"
3582           "\x66\x56\xC4\x7E\x32\x00\x64\xEB\x01\x44\xF7\x34\x1B\xC3\xD6\x97"
3583         },
3584         { 131008, 64,
3585           "\xD2\xCC\xF7\xC1\xAF\x2A\xB4\x66\xE6\x27\xDB\x44\x08\x40\x96\x9A"
3586           "\xBD\xAB\x68\xD8\x86\xAE\x6A\x38\xA1\x3F\xEE\x17\x50\xCA\x97\xB5"
3587           "\xD3\x31\x5B\x84\x08\x47\x28\x86\x2F\xBC\xC7\xD4\xA9\x7C\x75\xC8"
3588           "\x65\x5F\xF9\xD6\xBB\xC2\x61\x88\x63\x6F\x3E\xDF\xE1\x5C\x7D\x30"
3589         }
3590       }
3591     },
3592     {
3593       "Salsa20/12 256 bit, ecrypt verified, set 6, vector 2",
3594       GCRY_CIPHER_SALSA20R12, 32, 8,
3595       "\x0A\x5D\xB0\x03\x56\xA9\xFC\x4F\xA2\xF5\x48\x9B\xEE\x41\x94\xE7"
3596       "\x3A\x8D\xE0\x33\x86\xD9\x2C\x7F\xD2\x25\x78\xCB\x1E\x71\xC4\x17",
3597       "\x1F\x86\xED\x54\xBB\x22\x89\xF0",
3598       {
3599         { 0, 64,
3600           "\x51\x22\x52\x91\x01\x90\xD1\x54\xD1\x4D\x0B\x92\x32\xB8\x84\x31"
3601           "\x8C\xCB\x43\x81\x9B\xD5\x42\x19\x32\xC0\x3A\x13\xF0\x7B\x40\x10"
3602           "\x83\xD7\x89\x72\x5A\xA9\xDA\x0B\x41\xCB\x62\x24\x94\x5E\xDC\xB0"
3603           "\xFB\x6F\xD7\xC2\x34\x22\x35\xC9\x70\xF6\x4E\x10\x1C\x25\x68\x64"
3604         },
3605         { 65472, 64,
3606           "\x97\x96\x74\x55\x84\x0A\x4A\xE5\xC1\xCA\xCE\x49\x15\x19\x13\x8A"
3607           "\xA3\x5E\x5F\x02\x40\x7D\x4A\x1F\xE5\x08\x6D\x35\xF3\x55\x1E\xF4"
3608           "\x77\xD9\x28\x9D\x17\x23\x79\x7C\x1A\x49\xEC\x26\x62\x9A\xFA\xDC"
3609           "\x56\xA0\x38\xA3\x8C\x75\x88\x1B\x62\x17\xFD\x74\x67\x25\x59\x09"
3610         },
3611         { 65536, 64,
3612           "\x1B\xF8\x2E\x3D\x5C\x54\xDA\xAB\xCF\x84\x15\xF8\xA2\xA1\xA2\x2E"
3613           "\x86\x88\x06\x33\x4F\xF3\x11\x36\x04\x74\x1C\x1D\xF2\xB9\x84\x0F"
3614           "\x87\xDE\xEF\xB0\x07\x23\xA8\xA1\xB2\x4A\x4D\xA1\x7E\xCD\xAD\x00"
3615           "\x01\xF9\x79\xDD\xAE\x2D\xF0\xC5\xE1\xE5\x32\xC4\x8F\x8E\x0D\x34"
3616         },
3617         { 131008, 64,
3618           "\x06\xD8\x4F\x6A\x71\x34\x84\x20\x32\x9F\xCD\x0C\x41\x75\x9A\xD1"
3619           "\x8F\x99\x57\xA3\x8F\x22\x89\x3B\xA5\x58\xC5\x05\x11\x97\x28\x5C"
3620           "\x6B\xE2\xFD\x6C\x96\xA5\xC6\x62\xAF\xD3\x11\x78\xE7\x0F\x96\x0A"
3621           "\xAB\x3F\x47\x96\x23\xA4\x44\xB6\x81\x91\xE4\xC5\x28\x46\x93\x88"
3622         }
3623       }
3624     },
3625     {
3626       "Salsa20/12 256 bit, ecrypt verified, set 6, vector 3",
3627       GCRY_CIPHER_SALSA20R12, 32, 8,
3628       "\x0F\x62\xB5\x08\x5B\xAE\x01\x54\xA7\xFA\x4D\xA0\xF3\x46\x99\xEC"
3629       "\x3F\x92\xE5\x38\x8B\xDE\x31\x84\xD7\x2A\x7D\xD0\x23\x76\xC9\x1C",
3630       "\x28\x8F\xF6\x5D\xC4\x2B\x92\xF9",
3631       {
3632         { 0, 64,
3633           "\x99\xDB\x33\xAD\x11\xCE\x0C\xCB\x3B\xFD\xBF\x8D\x0C\x18\x16\x04"
3634           "\x52\xD0\x14\xCD\xE9\x89\xB4\xC4\x11\xA5\x59\xFF\x7C\x20\xA1\x69"
3635           "\xE6\xDC\x99\x09\xD8\x16\xBE\xCE\xDC\x40\x63\xCE\x07\xCE\xA8\x28"
3636           "\xF4\x4B\xF9\xB6\xC9\xA0\xA0\xB2\x00\xE1\xB5\x2A\xF4\x18\x59\xC5"
3637         },
3638         { 65472, 64,
3639           "\x2F\xF2\x02\x64\xEE\xAF\x47\xAB\x7D\x57\xC3\x62\x24\x53\x54\x51"
3640           "\x73\x5A\xC8\x36\xD3\x2D\xD2\x8A\xE6\x36\x45\xCE\x95\x2F\x7F\xDB"
3641           "\xE6\x68\x9C\x69\x59\x77\xB1\xC7\x6E\x60\xDD\x5B\x27\xAC\xA4\x76"
3642           "\xD2\x62\x0F\xDC\x93\x13\xE8\x48\x9B\xA5\x6A\x70\xC9\xF4\xC3\xA8"
3643         },
3644         { 65536, 64,
3645           "\xEB\x30\xCD\xA7\x27\xC0\xF8\xB7\xE4\x5D\x5E\xF3\x0D\xB7\xCB\xE0"
3646           "\x21\xF2\x29\x1E\x5F\x56\x93\x8D\x56\xF6\x87\xB7\x37\xC3\xB4\x27"
3647           "\x54\x5C\x56\xA6\xD3\xA0\xBF\x2B\x2F\x47\xB4\x84\x93\xFA\xE4\x5E"
3648           "\xD5\x0C\x2E\x9B\xBE\x49\xFD\x92\xD6\x7C\x76\x49\x05\x5F\x06\xFD"
3649         },
3650         { 131008, 64,
3651           "\x0E\xBF\x6C\xC3\xCB\xCB\xE7\x4E\x6E\xE8\x07\x47\x1B\x49\x2A\x67"
3652           "\x39\xA5\x2F\x57\x11\x31\xA2\x50\xBC\xDF\xA0\x76\xA2\x65\x90\xD7"
3653           "\xED\xE6\x75\x1C\x03\x26\xA0\x2C\xB1\x1C\x58\x77\x35\x52\x80\x4F"
3654           "\xD8\x68\x67\x15\x35\x5C\x5A\x5C\xC5\x91\x96\x3A\x75\xE9\x94\xB4"
3655         }
3656       }
3657     }
3658 #endif /*USE_SALSA20*/
3659   };
3660
3661
3662   char zeroes[512];
3663   gcry_cipher_hd_t hde;
3664   unsigned char *buffer;
3665   unsigned char *p;
3666   size_t buffersize;
3667   unsigned int n;
3668   int i, j;
3669   gcry_error_t err = 0;
3670
3671   if (verbose)
3672     fprintf (stderr, "  Starting large block stream cipher checks.\n");
3673
3674   memset (zeroes, 0, 512);
3675
3676   buffersize = 128 * 1024;
3677   buffer = gcry_xmalloc (buffersize+1024);
3678   memset (buffer+buffersize, 0x5a, 1024);
3679
3680   for (i = 0; i < sizeof (tv) / sizeof (tv[0]); i++)
3681     {
3682       if (verbose)
3683         fprintf (stderr, "    checking large block stream for %s [%i] (%s)\n",
3684                  gcry_cipher_algo_name (tv[i].algo), tv[i].algo, tv[i].name);
3685
3686       err = gcry_cipher_open (&hde, tv[i].algo, GCRY_CIPHER_MODE_STREAM, 0);
3687       if (err)
3688         {
3689           fail ("large stream, gcry_cipher_open for stream mode failed: %s\n",
3690                 gpg_strerror (err));
3691           continue;
3692         }
3693
3694       err = gcry_cipher_setkey (hde, tv[i].key, tv[i].keylen);
3695       if (err)
3696         {
3697           fail ("large stream, gcry_cipher_setkey failed: %s\n",
3698                 gpg_strerror (err));
3699           goto next;
3700         }
3701
3702       err = gcry_cipher_setiv (hde, tv[i].iv, tv[i].ivlen);
3703       if (err)
3704         {
3705           fail ("large stream, gcry_cipher_setiv failed: %s\n",
3706                 gpg_strerror (err));
3707           goto next;
3708         }
3709
3710       for (j=0, p=buffer; j < buffersize/512; j++, p += 512)
3711         {
3712           err = gcry_cipher_encrypt (hde, p, 512, zeroes, 512);
3713           if (err)
3714             {
3715               fail ("large stream, "
3716                     "gcry_cipher_encrypt (%d) block %d failed: %s\n",
3717                     i, j, gpg_strerror (err));
3718               goto next;
3719             }
3720         }
3721       for (j=0, p=buffer+buffersize; j < 1024; j++, p++)
3722         if (*p != 0x5a)
3723           die ("large stream, buffer corrupted at j=%d\n", j);
3724
3725       /* Now loop over all the data samples.  */
3726       for (j = 0; tv[i].data[j].length; j++)
3727         {
3728           assert (tv[i].data[j].offset + tv[i].data[j].length <= buffersize);
3729
3730           if (memcmp (tv[i].data[j].result,
3731                       buffer + tv[i].data[j].offset, tv[i].data[j].length))
3732             {
3733               fail ("large stream, encrypt mismatch entry %d:%d\n", i, j);
3734               mismatch (tv[i].data[j].result, tv[i].data[j].length,
3735                         buffer + tv[i].data[j].offset, tv[i].data[j].length);
3736             }
3737         }
3738
3739       /*
3740        *  Let's do the same thing again but using changing block sizes.
3741        */
3742       err = gcry_cipher_setkey (hde, tv[i].key, tv[i].keylen);
3743       if (err)
3744         {
3745           fail ("large stream, gcry_cipher_setkey failed: %s\n",
3746                 gpg_strerror (err));
3747           goto next;
3748         }
3749
3750       err = gcry_cipher_setiv (hde, tv[i].iv, tv[i].ivlen);
3751       if (err)
3752         {
3753           fail ("large stream, gcry_cipher_setiv failed: %s\n",
3754                 gpg_strerror (err));
3755           goto next;
3756         }
3757
3758       for (n=0, p=buffer, j = 0; n < buffersize; n += j, p += j)
3759         {
3760           switch (j)
3761             {
3762             case   0: j =   1;  break;
3763             case   1: j =  64; break;
3764             case  64: j=  384; break;
3765             case 384: j =  63; break;
3766             case  63: j = 512; break;
3767             case 512: j =  32; break;
3768             case  32: j = 503; break;
3769             default:  j = 509; break;
3770             }
3771           if ( n + j >= buffersize )
3772             j = buffersize - n;
3773           assert (j <= 512);
3774           err = gcry_cipher_encrypt (hde, p, j, zeroes, j);
3775           if (err)
3776             {
3777               fail ("large stream, "
3778                     "gcry_cipher_encrypt (%d) offset %u failed: %s\n",
3779                     i, n, gpg_strerror (err));
3780               goto next;
3781             }
3782         }
3783       for (j=0, p=buffer+buffersize; j < 1024; j++, p++)
3784         if (*p != 0x5a)
3785           die ("large stream, buffer corrupted at j=%d (line %d)\n",
3786                j, __LINE__);
3787
3788       /* Now loop over all the data samples.  */
3789       for (j = 0; tv[i].data[j].length; j++)
3790         {
3791           assert (tv[i].data[j].offset + tv[i].data[j].length <= buffersize);
3792
3793           if (memcmp (tv[i].data[j].result,
3794                       buffer + tv[i].data[j].offset, tv[i].data[j].length))
3795             {
3796               fail ("large stream var, encrypt mismatch entry %d:%d\n", i, j);
3797               mismatch (tv[i].data[j].result, tv[i].data[j].length,
3798                         buffer + tv[i].data[j].offset, tv[i].data[j].length);
3799             }
3800         }
3801
3802     next:
3803       gcry_cipher_close (hde);
3804     }
3805
3806   gcry_free (buffer);
3807   if (verbose)
3808     fprintf (stderr, "  Completed large block stream cipher checks.\n");
3809 }
3810
3811
3812
3813 /* Check that our bulk encryption fucntions work properly.  */
3814 static void
3815 check_bulk_cipher_modes (void)
3816 {
3817   static const struct
3818   {
3819     int algo;
3820     int mode;
3821     const char *key;
3822     int  keylen;
3823     const char *iv;
3824     int ivlen;
3825     char t1_hash[20];
3826   } tv[] = {
3827     { GCRY_CIPHER_AES, GCRY_CIPHER_MODE_CFB,
3828       "abcdefghijklmnop", 16,
3829       "1234567890123456", 16,
3830 /*[0]*/
3831       { 0x53, 0xda, 0x27, 0x3c, 0x78, 0x3d, 0x54, 0x66, 0x19, 0x63,
3832         0xd7, 0xe6, 0x20, 0x10, 0xcd, 0xc0, 0x5a, 0x0b, 0x06, 0xcc }
3833     },
3834     { GCRY_CIPHER_AES192, GCRY_CIPHER_MODE_CFB,
3835       "abcdefghijklmnopABCDEFG", 24,
3836       "1234567890123456", 16,
3837 /*[1]*/
3838       { 0xc7, 0xb1, 0xd0, 0x09, 0x95, 0x04, 0x34, 0x61, 0x2b, 0xd9,
3839         0xcb, 0xb3, 0xc7, 0xcb, 0xef, 0xea, 0x16, 0x19, 0x9b, 0x3e }
3840     },
3841     { GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_CFB,
3842       "abcdefghijklmnopABCDEFGHIJKLMNOP", 32,
3843       "1234567890123456", 16,
3844 /*[2]*/
3845       { 0x31, 0xe1, 0x1f, 0x63, 0x65, 0x47, 0x8c, 0x3f, 0x53, 0xdb,
3846         0xd9, 0x4d, 0x91, 0x1d, 0x02, 0x9c, 0x05, 0x25, 0x58, 0x29 }
3847     },
3848     { GCRY_CIPHER_AES, GCRY_CIPHER_MODE_CBC,
3849       "abcdefghijklmnop", 16,
3850       "1234567890123456", 16,
3851 /*[3]*/
3852       { 0xdc, 0x0c, 0xc2, 0xd9, 0x6b, 0x47, 0xf9, 0xeb, 0x06, 0xb4,
3853         0x2f, 0x6e, 0xec, 0x72, 0xbf, 0x55, 0x26, 0x7f, 0xa9, 0x97 }
3854     },
3855     { GCRY_CIPHER_AES192, GCRY_CIPHER_MODE_CBC,
3856       "abcdefghijklmnopABCDEFG", 24,
3857       "1234567890123456", 16,
3858 /*[4]*/
3859       { 0x2b, 0x90, 0x9b, 0xe6, 0x40, 0xab, 0x6e, 0xc2, 0xc5, 0xb1,
3860         0x87, 0xf5, 0x43, 0x84, 0x7b, 0x04, 0x06, 0x47, 0xd1, 0x8f }
3861     },
3862     { GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_CBC,
3863       "abcdefghijklmnopABCDEFGHIJKLMNOP", 32,
3864       "1234567890123456", 16,
3865 /*[5]*/
3866       { 0xaa, 0xa8, 0xdf, 0x03, 0xb0, 0xba, 0xc4, 0xe3, 0xc1, 0x02,
3867         0x38, 0x31, 0x8d, 0x86, 0xcb, 0x49, 0x6d, 0xad, 0xae, 0x01 }
3868     },
3869     { GCRY_CIPHER_AES, GCRY_CIPHER_MODE_OFB,
3870       "abcdefghijklmnop", 16,
3871       "1234567890123456", 16,
3872 /*[6]*/
3873       { 0x65, 0xfe, 0xde, 0x48, 0xd0, 0xa1, 0xa6, 0xf9, 0x24, 0x6b,
3874         0x52, 0x5f, 0x21, 0x8a, 0x6f, 0xc7, 0x70, 0x3b, 0xd8, 0x4a }
3875     },
3876     { GCRY_CIPHER_AES192, GCRY_CIPHER_MODE_OFB,
3877       "abcdefghijklmnopABCDEFG", 24,
3878       "1234567890123456", 16,
3879 /*[7]*/
3880       { 0x59, 0x5b, 0x02, 0xa2, 0x88, 0xc0, 0xbe, 0x94, 0x43, 0xaa,
3881         0x39, 0xf6, 0xbd, 0xcc, 0x83, 0x99, 0xee, 0x00, 0xa1, 0x91 }
3882     },
3883     { GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_OFB,
3884       "abcdefghijklmnopABCDEFGHIJKLMNOP", 32,
3885       "1234567890123456", 16,
3886 /*[8]*/
3887       { 0x38, 0x8c, 0xe1, 0xe2, 0xbe, 0x67, 0x60, 0xe8, 0xeb, 0xce,
3888         0xd0, 0xc6, 0xaa, 0xd6, 0xf6, 0x26, 0x15, 0x56, 0xd0, 0x2b }
3889     },
3890     { GCRY_CIPHER_AES, GCRY_CIPHER_MODE_CTR,
3891       "abcdefghijklmnop", 16,
3892       "1234567890123456", 16,
3893 /*[9]*/
3894       { 0x9a, 0x48, 0x94, 0xd6, 0x50, 0x46, 0x81, 0xdb, 0x68, 0x34,
3895         0x3b, 0xc5, 0x9e, 0x66, 0x94, 0x81, 0x98, 0xa0, 0xf9, 0xff }
3896     },
3897     { GCRY_CIPHER_AES192, GCRY_CIPHER_MODE_CTR,
3898       "abcdefghijklmnopABCDEFG", 24,
3899       "1234567890123456", 16,
3900 /*[10]*/
3901       { 0x2c, 0x2c, 0xd3, 0x75, 0x81, 0x2a, 0x59, 0x07, 0xeb, 0x08,
3902         0xce, 0x28, 0x4c, 0x0c, 0x6a, 0xa8, 0x8f, 0xa3, 0x98, 0x7e }
3903     },
3904     { GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_CTR,
3905       "abcdefghijklmnopABCDEFGHIJKLMNOP", 32,
3906       "1234567890123456", 16,
3907 /*[11]*/
3908       { 0x64, 0xce, 0x73, 0x03, 0xc7, 0x89, 0x99, 0x1f, 0xf1, 0xce,
3909         0xfe, 0xfb, 0xb9, 0x42, 0x30, 0xdf, 0xbb, 0x68, 0x6f, 0xd3 }
3910     },
3911     { GCRY_CIPHER_AES, GCRY_CIPHER_MODE_ECB,
3912       "abcdefghijklmnop", 16,
3913       "1234567890123456", 16,
3914 /*[12]*/
3915       { 0x51, 0xae, 0xf5, 0xac, 0x22, 0xa0, 0xba, 0x11, 0xc5, 0xaa,
3916         0xb4, 0x70, 0x99, 0xce, 0x18, 0x08, 0x12, 0x9b, 0xb1, 0xc5 }
3917     },
3918     { GCRY_CIPHER_AES192, GCRY_CIPHER_MODE_ECB,
3919       "abcdefghijklmnopABCDEFG", 24,
3920       "1234567890123456", 16,
3921 /*[13]*/
3922       { 0x57, 0x91, 0xea, 0x48, 0xd8, 0xbf, 0x9e, 0xc1, 0xae, 0x33,
3923         0xb3, 0xfd, 0xf7, 0x7a, 0xeb, 0x30, 0xb1, 0x62, 0x0d, 0x82 }
3924     },
3925     { GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_ECB,
3926       "abcdefghijklmnopABCDEFGHIJKLMNOP", 32,
3927       "1234567890123456", 16,
3928 /*[14]*/