Add Poly1305-AES (-Camellia, etc) MACs
[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_ccm_cipher (void)
1624 {
1625 #ifdef HAVE_U64_TYPEDEF
1626   static const struct tv
1627   {
1628     int algo;
1629     int keylen;
1630     const char *key;
1631     int noncelen;
1632     const char *nonce;
1633     int aadlen;
1634     const char *aad;
1635     int plainlen;
1636     const char *plaintext;
1637     int cipherlen;
1638     const char *ciphertext;
1639   } tv[] =
1640     {
1641       /* RFC 3610 */
1642       { GCRY_CIPHER_AES, /* Packet Vector #1 */
1643           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
1644           13, "\x00\x00\x00\x03\x02\x01\x00\xA0\xA1\xA2\xA3\xA4\xA5",
1645           8, "\x00\x01\x02\x03\x04\x05\x06\x07",
1646           23,
1647           "\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E",
1648           31,
1649           "\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"},
1650       { GCRY_CIPHER_AES, /* Packet Vector #2 */
1651           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
1652           13, "\x00\x00\x00\x04\x03\x02\x01\xA0\xA1\xA2\xA3\xA4\xA5",
1653           8, "\x00\x01\x02\x03\x04\x05\x06\x07",
1654           24,
1655           "\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F",
1656           32,
1657           "\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"},
1658       { GCRY_CIPHER_AES, /* Packet Vector #3 */
1659           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
1660           13, "\x00\x00\x00\x05\x04\x03\x02\xA0\xA1\xA2\xA3\xA4\xA5",
1661           8, "\x00\x01\x02\x03\x04\x05\x06\x07",
1662           25,
1663           "\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",
1664           33,
1665           "\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"},
1666       { GCRY_CIPHER_AES, /* Packet Vector #4 */
1667           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
1668           13, "\x00\x00\x00\x06\x05\x04\x03\xA0\xA1\xA2\xA3\xA4\xA5",
1669           12, "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B",
1670           19,
1671           "\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E",
1672           27,
1673           "\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"},
1674       { GCRY_CIPHER_AES, /* Packet Vector #5 */
1675           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
1676           13, "\x00\x00\x00\x07\x06\x05\x04\xA0\xA1\xA2\xA3\xA4\xA5",
1677           12, "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B",
1678           20,
1679           "\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F",
1680           28,
1681           "\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"},
1682       { GCRY_CIPHER_AES, /* Packet Vector #6 */
1683           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
1684           13, "\x00\x00\x00\x08\x07\x06\x05\xA0\xA1\xA2\xA3\xA4\xA5",
1685           12, "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B",
1686           21,
1687           "\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F\x20",
1688           29,
1689           "\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"},
1690       { GCRY_CIPHER_AES, /* Packet Vector #7 */
1691           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
1692           13, "\x00\x00\x00\x09\x08\x07\x06\xA0\xA1\xA2\xA3\xA4\xA5",
1693           8, "\x00\x01\x02\x03\x04\x05\x06\x07",
1694           23,
1695           "\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E",
1696           33,
1697           "\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"},
1698       { GCRY_CIPHER_AES, /* Packet Vector #8 */
1699           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
1700           13, "\x00\x00\x00\x0A\x09\x08\x07\xA0\xA1\xA2\xA3\xA4\xA5",
1701           8, "\x00\x01\x02\x03\x04\x05\x06\x07",
1702           24,
1703           "\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F",
1704           34,
1705           "\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"},
1706       { GCRY_CIPHER_AES, /* Packet Vector #9 */
1707           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
1708           13, "\x00\x00\x00\x0B\x0A\x09\x08\xA0\xA1\xA2\xA3\xA4\xA5",
1709           8, "\x00\x01\x02\x03\x04\x05\x06\x07",
1710           25,
1711           "\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",
1712           35,
1713           "\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"},
1714       { GCRY_CIPHER_AES, /* Packet Vector #10 */
1715           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
1716           13, "\x00\x00\x00\x0C\x0B\x0A\x09\xA0\xA1\xA2\xA3\xA4\xA5",
1717           12, "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B",
1718           19,
1719           "\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E",
1720           29,
1721           "\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"},
1722       { GCRY_CIPHER_AES, /* Packet Vector #11 */
1723           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
1724           13, "\x00\x00\x00\x0D\x0C\x0B\x0A\xA0\xA1\xA2\xA3\xA4\xA5",
1725           12, "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B",
1726           20,
1727           "\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F",
1728           30,
1729           "\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"},
1730       { GCRY_CIPHER_AES, /* Packet Vector #12 */
1731           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
1732           13, "\x00\x00\x00\x0E\x0D\x0C\x0B\xA0\xA1\xA2\xA3\xA4\xA5",
1733           12, "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B",
1734           21,
1735           "\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F\x20",
1736           31,
1737           "\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"},
1738       { GCRY_CIPHER_AES, /* Packet Vector #13 */
1739           16, "\xD7\x82\x8D\x13\xB2\xB0\xBD\xC3\x25\xA7\x62\x36\xDF\x93\xCC\x6B",
1740           13, "\x00\x41\x2B\x4E\xA9\xCD\xBE\x3C\x96\x96\x76\x6C\xFA",
1741           8, "\x0B\xE1\xA8\x8B\xAC\xE0\x18\xB1",
1742           23,
1743           "\x08\xE8\xCF\x97\xD8\x20\xEA\x25\x84\x60\xE9\x6A\xD9\xCF\x52\x89\x05\x4D\x89\x5C\xEA\xC4\x7C",
1744           31,
1745           "\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"},
1746       { GCRY_CIPHER_AES, /* Packet Vector #14 */
1747           16, "\xD7\x82\x8D\x13\xB2\xB0\xBD\xC3\x25\xA7\x62\x36\xDF\x93\xCC\x6B",
1748           13, "\x00\x33\x56\x8E\xF7\xB2\x63\x3C\x96\x96\x76\x6C\xFA",
1749           8, "\x63\x01\x8F\x76\xDC\x8A\x1B\xCB",
1750           24,
1751           "\x90\x20\xEA\x6F\x91\xBD\xD8\x5A\xFA\x00\x39\xBA\x4B\xAF\xF9\xBF\xB7\x9C\x70\x28\x94\x9C\xD0\xEC",
1752           32,
1753           "\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"},
1754       { GCRY_CIPHER_AES, /* Packet Vector #15 */
1755           16, "\xD7\x82\x8D\x13\xB2\xB0\xBD\xC3\x25\xA7\x62\x36\xDF\x93\xCC\x6B",
1756           13, "\x00\x10\x3F\xE4\x13\x36\x71\x3C\x96\x96\x76\x6C\xFA",
1757           8, "\xAA\x6C\xFA\x36\xCA\xE8\x6B\x40",
1758           25,
1759           "\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",
1760           33,
1761           "\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"},
1762       { GCRY_CIPHER_AES, /* Packet Vector #16 */
1763           16, "\xD7\x82\x8D\x13\xB2\xB0\xBD\xC3\x25\xA7\x62\x36\xDF\x93\xCC\x6B",
1764           13, "\x00\x76\x4C\x63\xB8\x05\x8E\x3C\x96\x96\x76\x6C\xFA",
1765           12, "\xD0\xD0\x73\x5C\x53\x1E\x1B\xEC\xF0\x49\xC2\x44",
1766           19,
1767           "\x12\xDA\xAC\x56\x30\xEF\xA5\x39\x6F\x77\x0C\xE1\xA6\x6B\x21\xF7\xB2\x10\x1C",
1768           27,
1769           "\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"},
1770       { GCRY_CIPHER_AES, /* Packet Vector #17 */
1771           16, "\xD7\x82\x8D\x13\xB2\xB0\xBD\xC3\x25\xA7\x62\x36\xDF\x93\xCC\x6B",
1772           13, "\x00\xF8\xB6\x78\x09\x4E\x3B\x3C\x96\x96\x76\x6C\xFA",
1773           12, "\x77\xB6\x0F\x01\x1C\x03\xE1\x52\x58\x99\xBC\xAE",
1774           20,
1775           "\xE8\x8B\x6A\x46\xC7\x8D\x63\xE5\x2E\xB8\xC5\x46\xEF\xB5\xDE\x6F\x75\xE9\xCC\x0D",
1776           28,
1777           "\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"},
1778       { GCRY_CIPHER_AES, /* Packet Vector #18 */
1779           16, "\xD7\x82\x8D\x13\xB2\xB0\xBD\xC3\x25\xA7\x62\x36\xDF\x93\xCC\x6B",
1780           13, "\x00\xD5\x60\x91\x2D\x3F\x70\x3C\x96\x96\x76\x6C\xFA",
1781           12, "\xCD\x90\x44\xD2\xB7\x1F\xDB\x81\x20\xEA\x60\xC0",
1782           21,
1783           "\x64\x35\xAC\xBA\xFB\x11\xA8\x2E\x2F\x07\x1D\x7C\xA4\xA5\xEB\xD9\x3A\x80\x3B\xA8\x7F",
1784           29,
1785           "\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"},
1786       { GCRY_CIPHER_AES, /* Packet Vector #19 */
1787           16, "\xD7\x82\x8D\x13\xB2\xB0\xBD\xC3\x25\xA7\x62\x36\xDF\x93\xCC\x6B",
1788           13, "\x00\x42\xFF\xF8\xF1\x95\x1C\x3C\x96\x96\x76\x6C\xFA",
1789           8, "\xD8\x5B\xC7\xE6\x9F\x94\x4F\xB8",
1790           23,
1791           "\x8A\x19\xB9\x50\xBC\xF7\x1A\x01\x8E\x5E\x67\x01\xC9\x17\x87\x65\x98\x09\xD6\x7D\xBE\xDD\x18",
1792           33,
1793           "\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"},
1794       { GCRY_CIPHER_AES, /* Packet Vector #20 */
1795           16, "\xD7\x82\x8D\x13\xB2\xB0\xBD\xC3\x25\xA7\x62\x36\xDF\x93\xCC\x6B",
1796           13, "\x00\x92\x0F\x40\xE5\x6C\xDC\x3C\x96\x96\x76\x6C\xFA",
1797           8, "\x74\xA0\xEB\xC9\x06\x9F\x5B\x37",
1798           24,
1799           "\x17\x61\x43\x3C\x37\xC5\xA3\x5F\xC1\xF3\x9F\x40\x63\x02\xEB\x90\x7C\x61\x63\xBE\x38\xC9\x84\x37",
1800           34,
1801           "\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"},
1802       { GCRY_CIPHER_AES, /* Packet Vector #21 */
1803           16, "\xD7\x82\x8D\x13\xB2\xB0\xBD\xC3\x25\xA7\x62\x36\xDF\x93\xCC\x6B",
1804           13, "\x00\x27\xCA\x0C\x71\x20\xBC\x3C\x96\x96\x76\x6C\xFA",
1805           8, "\x44\xA3\xAA\x3A\xAE\x64\x75\xCA",
1806           25,
1807           "\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",
1808           35,
1809           "\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"},
1810       { GCRY_CIPHER_AES, /* Packet Vector #22 */
1811           16, "\xD7\x82\x8D\x13\xB2\xB0\xBD\xC3\x25\xA7\x62\x36\xDF\x93\xCC\x6B",
1812           13, "\x00\x5B\x8C\xCB\xCD\x9A\xF8\x3C\x96\x96\x76\x6C\xFA",
1813           12, "\xEC\x46\xBB\x63\xB0\x25\x20\xC3\x3C\x49\xFD\x70",
1814           19,
1815           "\xB9\x6B\x49\xE2\x1D\x62\x17\x41\x63\x28\x75\xDB\x7F\x6C\x92\x43\xD2\xD7\xC2",
1816           29,
1817           "\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"},
1818       { GCRY_CIPHER_AES, /* Packet Vector #23 */
1819           16, "\xD7\x82\x8D\x13\xB2\xB0\xBD\xC3\x25\xA7\x62\x36\xDF\x93\xCC\x6B",
1820           13, "\x00\x3E\xBE\x94\x04\x4B\x9A\x3C\x96\x96\x76\x6C\xFA",
1821           12, "\x47\xA6\x5A\xC7\x8B\x3D\x59\x42\x27\xE8\x5E\x71",
1822           20,
1823           "\xE2\xFC\xFB\xB8\x80\x44\x2C\x73\x1B\xF9\x51\x67\xC8\xFF\xD7\x89\x5E\x33\x70\x76",
1824           30,
1825           "\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"},
1826       { GCRY_CIPHER_AES, /* Packet Vector #24 */
1827           16, "\xD7\x82\x8D\x13\xB2\xB0\xBD\xC3\x25\xA7\x62\x36\xDF\x93\xCC\x6B",
1828           13, "\x00\x8D\x49\x3B\x30\xAE\x8B\x3C\x96\x96\x76\x6C\xFA",
1829           12, "\x6E\x37\xA6\xEF\x54\x6D\x95\x5D\x34\xAB\x60\x59",
1830           21,
1831           "\xAB\xF2\x1C\x0B\x02\xFE\xB8\x8F\x85\x6D\xF4\xA3\x73\x81\xBC\xE3\xCC\x12\x85\x17\xD4",
1832           31,
1833           "\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"},
1834       /* RFC 5528 */
1835       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #1 */
1836           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
1837           13, "\x00\x00\x00\x03\x02\x01\x00\xA0\xA1\xA2\xA3\xA4\xA5",
1838           8, "\x00\x01\x02\x03\x04\x05\x06\x07",
1839           23,
1840           "\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E",
1841           31,
1842           "\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"},
1843       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #2 */
1844           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
1845           13, "\x00\x00\x00\x04\x03\x02\x01\xA0\xA1\xA2\xA3\xA4\xA5",
1846           8, "\x00\x01\x02\x03\x04\x05\x06\x07",
1847           24,
1848           "\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F",
1849           32,
1850           "\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"},
1851       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #3 */
1852           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
1853           13, "\x00\x00\x00\x05\x04\x03\x02\xA0\xA1\xA2\xA3\xA4\xA5",
1854           8, "\x00\x01\x02\x03\x04\x05\x06\x07",
1855           25,
1856           "\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",
1857           33,
1858           "\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"},
1859       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #4 */
1860           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
1861           13, "\x00\x00\x00\x06\x05\x04\x03\xA0\xA1\xA2\xA3\xA4\xA5",
1862           12, "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B",
1863           19,
1864           "\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E",
1865           27,
1866           "\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"},
1867       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #5 */
1868           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
1869           13, "\x00\x00\x00\x07\x06\x05\x04\xA0\xA1\xA2\xA3\xA4\xA5",
1870           12, "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B",
1871           20,
1872           "\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F",
1873           28,
1874           "\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"},
1875       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #6 */
1876           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
1877           13, "\x00\x00\x00\x08\x07\x06\x05\xA0\xA1\xA2\xA3\xA4\xA5",
1878           12, "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B",
1879           21,
1880           "\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F\x20",
1881           29,
1882           "\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"},
1883       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #7 */
1884           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
1885           13, "\x00\x00\x00\x09\x08\x07\x06\xA0\xA1\xA2\xA3\xA4\xA5",
1886           8, "\x00\x01\x02\x03\x04\x05\x06\x07",
1887           23,
1888           "\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E",
1889           33,
1890           "\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"},
1891       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #8 */
1892           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
1893           13, "\x00\x00\x00\x0A\x09\x08\x07\xA0\xA1\xA2\xA3\xA4\xA5",
1894           8, "\x00\x01\x02\x03\x04\x05\x06\x07",
1895           24,
1896           "\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F",
1897           34,
1898           "\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"},
1899       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #9 */
1900           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
1901           13, "\x00\x00\x00\x0B\x0A\x09\x08\xA0\xA1\xA2\xA3\xA4\xA5",
1902           8, "\x00\x01\x02\x03\x04\x05\x06\x07",
1903           25,
1904           "\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",
1905           35,
1906           "\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"},
1907       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #10 */
1908           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
1909           13, "\x00\x00\x00\x0C\x0B\x0A\x09\xA0\xA1\xA2\xA3\xA4\xA5",
1910           12, "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B",
1911           19,
1912           "\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E",
1913           29,
1914           "\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"},
1915       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #11 */
1916           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
1917           13, "\x00\x00\x00\x0D\x0C\x0B\x0A\xA0\xA1\xA2\xA3\xA4\xA5",
1918           12, "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B",
1919           20,
1920           "\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F",
1921           30,
1922           "\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"},
1923       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #12 */
1924           16, "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF",
1925           13, "\x00\x00\x00\x0E\x0D\x0C\x0B\xA0\xA1\xA2\xA3\xA4\xA5",
1926           12, "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B",
1927           21,
1928           "\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F\x20",
1929           31,
1930           "\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"},
1931       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #13 */
1932           16, "\xD7\x5C\x27\x78\x07\x8C\xA9\x3D\x97\x1F\x96\xFD\xE7\x20\xF4\xCD",
1933           13, "\x00\xA9\x70\x11\x0E\x19\x27\xB1\x60\xB6\xA3\x1C\x1C",
1934           8, "\x6B\x7F\x46\x45\x07\xFA\xE4\x96",
1935           23,
1936           "\xC6\xB5\xF3\xE6\xCA\x23\x11\xAE\xF7\x47\x2B\x20\x3E\x73\x5E\xA5\x61\xAD\xB1\x7D\x56\xC5\xA3",
1937           31,
1938           "\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"},
1939       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #14 */
1940           16, "\xD7\x5C\x27\x78\x07\x8C\xA9\x3D\x97\x1F\x96\xFD\xE7\x20\xF4\xCD",
1941           13, "\x00\x83\xCD\x8C\xE0\xCB\x42\xB1\x60\xB6\xA3\x1C\x1C",
1942           8, "\x98\x66\x05\xB4\x3D\xF1\x5D\xE7",
1943           24,
1944           "\x01\xF6\xCE\x67\x64\xC5\x74\x48\x3B\xB0\x2E\x6B\xBF\x1E\x0A\xBD\x26\xA2\x25\x72\xB4\xD8\x0E\xE7",
1945           32,
1946           "\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"},
1947       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #15 */
1948           16, "\xD7\x5C\x27\x78\x07\x8C\xA9\x3D\x97\x1F\x96\xFD\xE7\x20\xF4\xCD",
1949           13, "\x00\x5F\x54\x95\x0B\x18\xF2\xB1\x60\xB6\xA3\x1C\x1C",
1950           8, "\x48\xF2\xE7\xE1\xA7\x67\x1A\x51",
1951           25,
1952           "\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",
1953           33,
1954           "\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"},
1955       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #16 */
1956           16, "\xD7\x5C\x27\x78\x07\x8C\xA9\x3D\x97\x1F\x96\xFD\xE7\x20\xF4\xCD",
1957           13, "\x00\xEC\x60\x08\x63\x31\x9A\xB1\x60\xB6\xA3\x1C\x1C",
1958           12, "\xDE\x97\xDF\x3B\x8C\xBD\x6D\x8E\x50\x30\xDA\x4C",
1959           19,
1960           "\xB0\x05\xDC\xFA\x0B\x59\x18\x14\x26\xA9\x61\x68\x5A\x99\x3D\x8C\x43\x18\x5B",
1961           27,
1962           "\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"},
1963       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #17 */
1964           16, "\xD7\x5C\x27\x78\x07\x8C\xA9\x3D\x97\x1F\x96\xFD\xE7\x20\xF4\xCD",
1965           13, "\x00\x60\xCF\xF1\xA3\x1E\xA1\xB1\x60\xB6\xA3\x1C\x1C",
1966           12, "\xA5\xEE\x93\xE4\x57\xDF\x05\x46\x6E\x78\x2D\xCF",
1967           20,
1968           "\x2E\x20\x21\x12\x98\x10\x5F\x12\x9D\x5E\xD9\x5B\x93\xF7\x2D\x30\xB2\xFA\xCC\xD7",
1969           28,
1970           "\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"},
1971       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #18 */
1972           16, "\xD7\x5C\x27\x78\x07\x8C\xA9\x3D\x97\x1F\x96\xFD\xE7\x20\xF4\xCD",
1973           13, "\x00\x0F\x85\xCD\x99\x5C\x97\xB1\x60\xB6\xA3\x1C\x1C",
1974           12, "\x24\xAA\x1B\xF9\xA5\xCD\x87\x61\x82\xA2\x50\x74",
1975           21,
1976           "\x26\x45\x94\x1E\x75\x63\x2D\x34\x91\xAF\x0F\xC0\xC9\x87\x6C\x3B\xE4\xAA\x74\x68\xC9",
1977           29,
1978           "\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"},
1979       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #19 */
1980           16, "\xD7\x5C\x27\x78\x07\x8C\xA9\x3D\x97\x1F\x96\xFD\xE7\x20\xF4\xCD",
1981           13, "\x00\xC2\x9B\x2C\xAA\xC4\xCD\xB1\x60\xB6\xA3\x1C\x1C",
1982           8, "\x69\x19\x46\xB9\xCA\x07\xBE\x87",
1983           23,
1984           "\x07\x01\x35\xA6\x43\x7C\x9D\xB1\x20\xCD\x61\xD8\xF6\xC3\x9C\x3E\xA1\x25\xFD\x95\xA0\xD2\x3D",
1985           33,
1986           "\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"},
1987       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #20 */
1988           16, "\xD7\x5C\x27\x78\x07\x8C\xA9\x3D\x97\x1F\x96\xFD\xE7\x20\xF4\xCD",
1989           13, "\x00\x2C\x6B\x75\x95\xEE\x62\xB1\x60\xB6\xA3\x1C\x1C",
1990           8, "\xD0\xC5\x4E\xCB\x84\x62\x7D\xC4",
1991           24,
1992           "\xC8\xC0\x88\x0E\x6C\x63\x6E\x20\x09\x3D\xD6\x59\x42\x17\xD2\xE1\x88\x77\xDB\x26\x4E\x71\xA5\xCC",
1993           34,
1994           "\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"},
1995       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #21 */
1996           16, "\xD7\x5C\x27\x78\x07\x8C\xA9\x3D\x97\x1F\x96\xFD\xE7\x20\xF4\xCD",
1997           13, "\x00\xC5\x3C\xD4\xC2\xAA\x24\xB1\x60\xB6\xA3\x1C\x1C",
1998           8, "\xE2\x85\xE0\xE4\x80\x8C\xDA\x3D",
1999           25,
2000           "\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",
2001           35,
2002           "\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"},
2003       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #22 */
2004           16, "\xD7\x5C\x27\x78\x07\x8C\xA9\x3D\x97\x1F\x96\xFD\xE7\x20\xF4\xCD",
2005           13, "\x00\xBE\xE9\x26\x7F\xBA\xDC\xB1\x60\xB6\xA3\x1C\x1C",
2006           12, "\x6C\xAE\xF9\x94\x11\x41\x57\x0D\x7C\x81\x34\x05",
2007           19,
2008           "\xC2\x38\x82\x2F\xAC\x5F\x98\xFF\x92\x94\x05\xB0\xAD\x12\x7A\x4E\x41\x85\x4E",
2009           29,
2010           "\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"},
2011       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #23 */
2012           16, "\xD7\x5C\x27\x78\x07\x8C\xA9\x3D\x97\x1F\x96\xFD\xE7\x20\xF4\xCD",
2013           13, "\x00\xDF\xA8\xB1\x24\x50\x07\xB1\x60\xB6\xA3\x1C\x1C",
2014           12, "\x36\xA5\x2C\xF1\x6B\x19\xA2\x03\x7A\xB7\x01\x1E",
2015           20,
2016           "\x4D\xBF\x3E\x77\x4A\xD2\x45\xE5\xD5\x89\x1F\x9D\x1C\x32\xA0\xAE\x02\x2C\x85\xD7",
2017           30,
2018           "\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"},
2019       { GCRY_CIPHER_CAMELLIA128, /* Packet Vector #24 */
2020           16, "\xD7\x5C\x27\x78\x07\x8C\xA9\x3D\x97\x1F\x96\xFD\xE7\x20\xF4\xCD",
2021           13, "\x00\x3B\x8F\xD8\xD3\xA9\x37\xB1\x60\xB6\xA3\x1C\x1C",
2022           12, "\xA4\xD4\x99\xF7\x84\x19\x72\x8C\x19\x17\x8B\x0C",
2023           21,
2024           "\x9D\xC9\xED\xAE\x2F\xF5\xDF\x86\x36\xE8\xC6\xDE\x0E\xED\x55\xF7\x86\x7E\x33\x33\x7D",
2025           31,
2026           "\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"}
2027     };
2028   static const int cut[] = { 0, 1, 8, 10, 16, 19, -1 };
2029   gcry_cipher_hd_t hde, hdd;
2030   unsigned char out[MAX_DATA_LEN];
2031   u64 ctl_params[3];
2032   int split, aadsplit;
2033   size_t j, i, keylen, blklen, authlen;
2034   gcry_error_t err = 0;
2035
2036   if (verbose)
2037     fprintf (stderr, "  Starting CCM checks.\n");
2038
2039   for (i = 0; i < sizeof (tv) / sizeof (tv[0]); i++)
2040     {
2041       if (verbose)
2042         fprintf (stderr, "    checking CCM mode for %s [%i]\n",
2043                  gcry_cipher_algo_name (tv[i].algo),
2044                  tv[i].algo);
2045
2046       for (j = 0; j < sizeof (cut) / sizeof (cut[0]); j++)
2047         {
2048           split = cut[j] < 0 ? tv[i].plainlen : cut[j];
2049           if (tv[i].plainlen < split)
2050             continue;
2051
2052           err = gcry_cipher_open (&hde, tv[i].algo, GCRY_CIPHER_MODE_CCM, 0);
2053           if (!err)
2054             err = gcry_cipher_open (&hdd, tv[i].algo, GCRY_CIPHER_MODE_CCM, 0);
2055           if (err)
2056             {
2057               fail ("cipher-ccm, gcry_cipher_open failed: %s\n",
2058                     gpg_strerror (err));
2059               return;
2060             }
2061
2062           keylen = gcry_cipher_get_algo_keylen(tv[i].algo);
2063           if (!keylen)
2064             {
2065               fail ("cipher-ccm, gcry_cipher_get_algo_keylen failed\n");
2066               return;
2067             }
2068
2069           err = gcry_cipher_setkey (hde, tv[i].key, keylen);
2070           if (!err)
2071             err = gcry_cipher_setkey (hdd, tv[i].key, keylen);
2072           if (err)
2073             {
2074               fail ("cipher-ccm, gcry_cipher_setkey failed: %s\n",
2075                     gpg_strerror (err));
2076               gcry_cipher_close (hde);
2077               gcry_cipher_close (hdd);
2078               return;
2079             }
2080
2081           blklen = gcry_cipher_get_algo_blklen(tv[i].algo);
2082           if (!blklen)
2083             {
2084               fail ("cipher-ccm, gcry_cipher_get_algo_blklen failed\n");
2085               return;
2086             }
2087
2088           err = gcry_cipher_setiv (hde, tv[i].nonce, tv[i].noncelen);
2089           if (!err)
2090             err = gcry_cipher_setiv (hdd, tv[i].nonce, tv[i].noncelen);
2091           if (err)
2092             {
2093               fail ("cipher-ccm, gcry_cipher_setiv failed: %s\n",
2094                     gpg_strerror (err));
2095               gcry_cipher_close (hde);
2096               gcry_cipher_close (hdd);
2097               return;
2098             }
2099
2100           authlen = tv[i].cipherlen - tv[i].plainlen;
2101           ctl_params[0] = tv[i].plainlen; /* encryptedlen */
2102           ctl_params[1] = tv[i].aadlen; /* aadlen */
2103           ctl_params[2] = authlen; /* authtaglen */
2104           err = gcry_cipher_ctl (hde, GCRYCTL_SET_CCM_LENGTHS, ctl_params,
2105                                  sizeof(ctl_params));
2106           if (!err)
2107             err = gcry_cipher_ctl (hdd, GCRYCTL_SET_CCM_LENGTHS, ctl_params,
2108                                    sizeof(ctl_params));
2109           if (err)
2110             {
2111               fail ("cipher-ccm, gcry_cipher_ctl GCRYCTL_SET_CCM_LENGTHS "
2112                     "failed: %s\n", gpg_strerror (err));
2113               gcry_cipher_close (hde);
2114               gcry_cipher_close (hdd);
2115               return;
2116             }
2117
2118           aadsplit = split > tv[i].aadlen ? 0 : split;
2119
2120           err = gcry_cipher_authenticate (hde, tv[i].aad,
2121                                           tv[i].aadlen - aadsplit);
2122           if (!err)
2123             err = gcry_cipher_authenticate (hde,
2124                                             &tv[i].aad[tv[i].aadlen - aadsplit],
2125                                             aadsplit);
2126           if (!err)
2127             err = gcry_cipher_authenticate (hdd, tv[i].aad,
2128                                             tv[i].aadlen - aadsplit);
2129           if (!err)
2130             err = gcry_cipher_authenticate (hdd,
2131                                             &tv[i].aad[tv[i].aadlen - aadsplit],
2132                                             aadsplit);
2133           if (err)
2134             {
2135               fail ("cipher-ccm, gcry_cipher_authenticate failed: %s\n",
2136                    gpg_strerror (err));
2137               gcry_cipher_close (hde);
2138               gcry_cipher_close (hdd);
2139               return;
2140             }
2141
2142           err = gcry_cipher_encrypt (hde, out, MAX_DATA_LEN, tv[i].plaintext,
2143                                      tv[i].plainlen - split);
2144           if (!err)
2145             err = gcry_cipher_encrypt (hde, &out[tv[i].plainlen - split],
2146                                        MAX_DATA_LEN - (tv[i].plainlen - split),
2147                                        &tv[i].plaintext[tv[i].plainlen - split],
2148                                        split);
2149           if (err)
2150             {
2151               fail ("cipher-ccm, gcry_cipher_encrypt (%d:%d) failed: %s\n",
2152                     i, j, gpg_strerror (err));
2153               gcry_cipher_close (hde);
2154               gcry_cipher_close (hdd);
2155               return;
2156             }
2157
2158           err = gcry_cipher_gettag (hde, &out[tv[i].plainlen], authlen);
2159           if (err)
2160             {
2161               fail ("cipher-ccm, gcry_cipher_gettag (%d:%d) failed: %s\n",
2162                     i, j, gpg_strerror (err));
2163               gcry_cipher_close (hde);
2164               gcry_cipher_close (hdd);
2165               return;
2166             }
2167
2168           if (memcmp (tv[i].ciphertext, out, tv[i].cipherlen))
2169             fail ("cipher-ccm, encrypt mismatch entry %d:%d\n", i, j);
2170
2171           err = gcry_cipher_decrypt (hdd, out, tv[i].plainlen - split, NULL, 0);
2172           if (!err)
2173             err = gcry_cipher_decrypt (hdd, &out[tv[i].plainlen - split], split,
2174                                        NULL, 0);
2175           if (err)
2176             {
2177               fail ("cipher-ccm, gcry_cipher_decrypt (%d:%d) failed: %s\n",
2178                     i, j, gpg_strerror (err));
2179               gcry_cipher_close (hde);
2180               gcry_cipher_close (hdd);
2181               return;
2182             }
2183
2184           if (memcmp (tv[i].plaintext, out, tv[i].plainlen))
2185             fail ("cipher-ccm, decrypt mismatch entry %d:%d\n", i, j);
2186
2187           err = gcry_cipher_checktag (hdd, &out[tv[i].plainlen], authlen);
2188           if (err)
2189             {
2190               fail ("cipher-ccm, gcry_cipher_checktag (%d:%d) failed: %s\n",
2191                     i, j, gpg_strerror (err));
2192               gcry_cipher_close (hde);
2193               gcry_cipher_close (hdd);
2194               return;
2195             }
2196
2197           gcry_cipher_close (hde);
2198           gcry_cipher_close (hdd);
2199         }
2200     }
2201
2202   /* Large buffer tests.  */
2203
2204   /* Test encoding of aadlen > 0xfeff.  */
2205   {
2206     static const char key[]={0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,
2207                              0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f};
2208     static const char iv[]={0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19};
2209     static const char tag[]={0x9C,0x76,0xE7,0x33,0xD5,0x15,0xB3,0x6C,
2210                              0xBA,0x76,0x95,0xF7,0xFB,0x91};
2211     char buf[1024];
2212     size_t enclen = 0x20000;
2213     size_t aadlen = 0x20000;
2214     size_t taglen = sizeof(tag);
2215
2216     err = gcry_cipher_open (&hde, GCRY_CIPHER_AES, GCRY_CIPHER_MODE_CCM, 0);
2217     if (err)
2218       {
2219         fail ("cipher-ccm-large, gcry_cipher_open failed: %s\n",
2220               gpg_strerror (err));
2221         return;
2222       }
2223
2224     err = gcry_cipher_setkey (hde, key, sizeof (key));
2225     if (err)
2226       {
2227          fail ("cipher-ccm-large, gcry_cipher_setkey failed: %s\n",
2228                gpg_strerror (err));
2229          gcry_cipher_close (hde);
2230          return;
2231       }
2232
2233     err = gcry_cipher_setiv (hde, iv, sizeof (iv));
2234     if (err)
2235       {
2236         fail ("cipher-ccm-large, gcry_cipher_setiv failed: %s\n",
2237               gpg_strerror (err));
2238         gcry_cipher_close (hde);
2239         return;
2240       }
2241
2242     ctl_params[0] = enclen; /* encryptedlen */
2243     ctl_params[1] = aadlen; /* aadlen */
2244     ctl_params[2] = taglen; /* authtaglen */
2245     err = gcry_cipher_ctl (hde, GCRYCTL_SET_CCM_LENGTHS, ctl_params,
2246                            sizeof(ctl_params));
2247     if (err)
2248       {
2249         fail ("cipher-ccm-large, gcry_cipher_ctl GCRYCTL_SET_CCM_LENGTHS "
2250               "failed: %s\n", gpg_strerror (err));
2251         gcry_cipher_close (hde);
2252         return;
2253       }
2254
2255     memset (buf, 0xaa, sizeof(buf));
2256
2257     for (i = 0; i < aadlen; i += sizeof(buf))
2258       {
2259         err = gcry_cipher_authenticate (hde, buf, sizeof (buf));
2260         if (err)
2261           {
2262             fail ("cipher-ccm-large, gcry_cipher_authenticate failed: %s\n",
2263                  gpg_strerror (err));
2264             gcry_cipher_close (hde);
2265             return;
2266           }
2267       }
2268
2269     for (i = 0; i < enclen; i += sizeof(buf))
2270       {
2271         memset (buf, 0xee, sizeof(buf));
2272         err = gcry_cipher_encrypt (hde, buf, sizeof (buf), NULL, 0);
2273         if (err)
2274           {
2275             fail ("cipher-ccm-large, gcry_cipher_encrypt failed: %s\n",
2276                  gpg_strerror (err));
2277             gcry_cipher_close (hde);
2278             return;
2279           }
2280       }
2281
2282     err = gcry_cipher_gettag (hde, buf, taglen);
2283     if (err)
2284       {
2285         fail ("cipher-ccm-large, gcry_cipher_gettag failed: %s\n",
2286               gpg_strerror (err));
2287         gcry_cipher_close (hde);
2288         return;
2289       }
2290
2291     if (memcmp (buf, tag, taglen) != 0)
2292       fail ("cipher-ccm-large, encrypt mismatch entry\n");
2293
2294     gcry_cipher_close (hde);
2295   }
2296
2297 #if 0
2298   /* Test encoding of aadlen > 0xffffffff.  */
2299   {
2300     static const char key[]={0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,
2301                              0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f};
2302     static const char iv[]={0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19};
2303     static const char tag[]={0x01,0xB2,0xC3,0x4A,0xA6,0x6A,0x07,0x6D,
2304                              0xBC,0xBD,0xEA,0x17,0xD3,0x73,0xD7,0xD4};
2305     char buf[1024];
2306     size_t enclen = (size_t)0xffffffff + 1 + 1024;
2307     size_t aadlen = (size_t)0xffffffff + 1 + 1024;
2308     size_t taglen = sizeof(tag);
2309
2310     err = gcry_cipher_open (&hde, GCRY_CIPHER_AES, GCRY_CIPHER_MODE_CCM, 0);
2311     if (err)
2312       {
2313         fail ("cipher-ccm-huge, gcry_cipher_open failed: %s\n",
2314               gpg_strerror (err));
2315         return;
2316       }
2317
2318     err = gcry_cipher_setkey (hde, key, sizeof (key));
2319     if (err)
2320       {
2321          fail ("cipher-ccm-huge, gcry_cipher_setkey failed: %s\n",
2322                gpg_strerror (err));
2323          gcry_cipher_close (hde);
2324          return;
2325       }
2326
2327     err = gcry_cipher_setiv (hde, iv, sizeof (iv));
2328     if (err)
2329       {
2330         fail ("cipher-ccm-huge, gcry_cipher_setiv failed: %s\n",
2331               gpg_strerror (err));
2332         gcry_cipher_close (hde);
2333         return;
2334       }
2335
2336     ctl_params[0] = enclen; /* encryptedlen */
2337     ctl_params[1] = aadlen; /* aadlen */
2338     ctl_params[2] = taglen; /* authtaglen */
2339     err = gcry_cipher_ctl (hde, GCRYCTL_SET_CCM_LENGTHS, ctl_params,
2340                            sizeof(ctl_params));
2341     if (err)
2342       {
2343         fail ("cipher-ccm-huge, gcry_cipher_ctl GCRYCTL_SET_CCM_LENGTHS failed:"
2344               "%s\n", gpg_strerror (err));
2345         gcry_cipher_close (hde);
2346         return;
2347       }
2348
2349     memset (buf, 0xaa, sizeof(buf));
2350
2351     for (i = 0; i < aadlen; i += sizeof(buf))
2352       {
2353         err = gcry_cipher_authenticate (hde, buf, sizeof (buf));
2354         if (err)
2355           {
2356             fail ("cipher-ccm-huge, gcry_cipher_authenticate failed: %s\n",
2357                  gpg_strerror (err));
2358             gcry_cipher_close (hde);
2359             return;
2360           }
2361       }
2362
2363     for (i = 0; i < enclen; i += sizeof(buf))
2364       {
2365         memset (buf, 0xee, sizeof(buf));
2366         err = gcry_cipher_encrypt (hde, buf, sizeof (buf), NULL, 0);
2367         if (err)
2368           {
2369             fail ("cipher-ccm-huge, gcry_cipher_encrypt failed: %s\n",
2370                  gpg_strerror (err));
2371             gcry_cipher_close (hde);
2372             return;
2373           }
2374       }
2375
2376     err = gcry_cipher_gettag (hde, buf, taglen);
2377     if (err)
2378       {
2379         fail ("cipher-ccm-huge, gcry_cipher_gettag failed: %s\n",
2380               gpg_strerror (err));
2381         gcry_cipher_close (hde);
2382         return;
2383       }
2384
2385     if (memcmp (buf, tag, taglen) != 0)
2386       fail ("cipher-ccm-huge, encrypt mismatch entry\n");
2387
2388     gcry_cipher_close (hde);
2389   }
2390
2391   if (verbose)
2392     fprintf (stderr, "  Completed CCM checks.\n");
2393 #endif
2394 #endif /*HAVE_U64_TYPEDEF*/
2395 }
2396
2397
2398 static void
2399 check_stream_cipher (void)
2400 {
2401   static const struct tv
2402   {
2403     const char *name;
2404     int algo;
2405     int keylen;
2406     int ivlen;
2407     const char *key;
2408     const char *iv;
2409     struct data
2410     {
2411       int inlen;
2412       const char *plaintext;
2413       const char *out;
2414     } data[MAX_DATA_LEN];
2415   } tv[] = {
2416 #ifdef USE_SALSA20
2417     {
2418       "Salsa20 128 bit, test 1",
2419       GCRY_CIPHER_SALSA20, 16, 8,
2420       "\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
2421       "\x00\x00\x00\x00\x00\x00\x00\x00",
2422       {
2423         { 8,
2424           "\x00\x00\x00\x00\x00\x00\x00\x00",
2425           "\x4D\xFA\x5E\x48\x1D\xA2\x3E\xA0"
2426         }
2427       }
2428     },
2429     {
2430       "Salsa20 128 bit, test 2",
2431       GCRY_CIPHER_SALSA20, 16, 8,
2432       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
2433       "\x80\x00\x00\x00\x00\x00\x00\x00",
2434       {
2435         { 8,
2436           "\x00\x00\x00\x00\x00\x00\x00\x00",
2437           "\xB6\x6C\x1E\x44\x46\xDD\x95\x57"
2438         }
2439       }
2440     },
2441     {
2442       "Salsa20 128 bit, test 3",
2443       GCRY_CIPHER_SALSA20, 16, 8,
2444       "\x00\x53\xA6\xF9\x4C\x9F\xF2\x45\x98\xEB\x3E\x91\xE4\x37\x8A\xDD",
2445       "\x0D\x74\xDB\x42\xA9\x10\x77\xDE",
2446       {
2447         { 8,
2448           "\x00\x00\x00\x00\x00\x00\x00\x00",
2449           "\x05\xE1\xE7\xBE\xB6\x97\xD9\x99"
2450         }
2451       }
2452     },
2453     {
2454       "Salsa20 256 bit, test 1",
2455       GCRY_CIPHER_SALSA20, 32, 8,
2456       "\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2457       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
2458       "\x00\x00\x00\x00\x00\x00\x00\x00",
2459       {
2460         { 8,
2461           "\x00\x00\x00\x00\x00\x00\x00\x00",
2462           "\xE3\xBE\x8F\xDD\x8B\xEC\xA2\xE3"
2463         }
2464       }
2465     },
2466     {
2467       "Salsa20 256 bit, test 2",
2468       GCRY_CIPHER_SALSA20, 32, 8,
2469       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2470       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
2471       "\x80\x00\x00\x00\x00\x00\x00\x00",
2472       {
2473         { 8,
2474           "\x00\x00\x00\x00\x00\x00\x00\x00",
2475           "\x2A\xBA\x3D\xC4\x5B\x49\x47\x00"
2476         }
2477       }
2478     },
2479     {
2480       "Salsa20 256 bit, ecrypt verified, set 6, vector 0",
2481       GCRY_CIPHER_SALSA20, 32, 8,
2482       "\x00\x53\xA6\xF9\x4C\x9F\xF2\x45\x98\xEB\x3E\x91\xE4\x37\x8A\xDD"
2483       "\x30\x83\xD6\x29\x7C\xCF\x22\x75\xC8\x1B\x6E\xC1\x14\x67\xBA\x0D",
2484       "\x0D\x74\xDB\x42\xA9\x10\x77\xDE",
2485       {
2486         { 8,
2487           "\x00\x00\x00\x00\x00\x00\x00\x00",
2488           "\xF5\xFA\xD5\x3F\x79\xF9\xDF\x58"
2489         },
2490         { 64,
2491           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2492           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2493           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2494           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
2495           "\xF5\xFA\xD5\x3F\x79\xF9\xDF\x58\xC4\xAE\xA0\xD0\xED\x9A\x96\x01"
2496           "\xF2\x78\x11\x2C\xA7\x18\x0D\x56\x5B\x42\x0A\x48\x01\x96\x70\xEA"
2497           "\xF2\x4C\xE4\x93\xA8\x62\x63\xF6\x77\xB4\x6A\xCE\x19\x24\x77\x3D"
2498           "\x2B\xB2\x55\x71\xE1\xAA\x85\x93\x75\x8F\xC3\x82\xB1\x28\x0B\x71"
2499         }
2500       }
2501     },
2502     {
2503       "Salsa20/12 128 bit, test 1",
2504       GCRY_CIPHER_SALSA20R12, 16, 8,
2505       "\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
2506       "\x00\x00\x00\x00\x00\x00\x00\x00",
2507       {
2508         { 8,
2509           "\x00\x00\x00\x00\x00\x00\x00\x00",
2510           "\xFC\x20\x7D\xBF\xC7\x6C\x5E\x17"
2511         }
2512       }
2513     },
2514     {
2515       "Salsa20/12 128 bit, test 2",
2516       GCRY_CIPHER_SALSA20R12, 16, 8,
2517       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
2518       "\x80\x00\x00\x00\x00\x00\x00\x00",
2519       {
2520         { 8,
2521           "\x00\x00\x00\x00\x00\x00\x00\x00",
2522           "\x08\x28\x39\x9A\x6F\xEF\x20\xDA"
2523         }
2524       }
2525     },
2526     {
2527       "Salsa20/12 128 bit, test 3",
2528       GCRY_CIPHER_SALSA20R12, 16, 8,
2529       "\x00\x53\xA6\xF9\x4C\x9F\xF2\x45\x98\xEB\x3E\x91\xE4\x37\x8A\xDD",
2530       "\x0D\x74\xDB\x42\xA9\x10\x77\xDE",
2531       {
2532         { 8,
2533           "\x00\x00\x00\x00\x00\x00\x00\x00",
2534           "\xAD\x9E\x60\xE6\xD2\xA2\x64\xB8"
2535         }
2536       }
2537     },
2538     {
2539       "Salsa20/12 256 bit, test 1",
2540       GCRY_CIPHER_SALSA20R12, 32, 8,
2541       "\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2542       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
2543       "\x00\x00\x00\x00\x00\x00\x00\x00",
2544       {
2545         { 8,
2546           "\x00\x00\x00\x00\x00\x00\x00\x00",
2547           "\xAF\xE4\x11\xED\x1C\x4E\x07\xE4"
2548         }
2549       }
2550     },
2551     {
2552       "Salsa20/12 256 bit, test 2",
2553       GCRY_CIPHER_SALSA20R12, 32, 8,
2554       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2555       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
2556       "\x80\x00\x00\x00\x00\x00\x00\x00",
2557       {
2558         { 8,
2559           "\x00\x00\x00\x00\x00\x00\x00\x00",
2560           "\x17\x2C\x51\x92\xCB\x6E\x64\x5B"
2561         }
2562       }
2563     },
2564     {
2565       "Salsa20/12 256 bit, ecrypt verified, set 6, vector 0",
2566       GCRY_CIPHER_SALSA20R12, 32, 8,
2567       "\x00\x53\xA6\xF9\x4C\x9F\xF2\x45\x98\xEB\x3E\x91\xE4\x37\x8A\xDD"
2568       "\x30\x83\xD6\x29\x7C\xCF\x22\x75\xC8\x1B\x6E\xC1\x14\x67\xBA\x0D",
2569       "\x0D\x74\xDB\x42\xA9\x10\x77\xDE",
2570       {
2571         { 8,
2572           "\x00\x00\x00\x00\x00\x00\x00\x00",
2573           "\x52\xE2\x0C\xF8\x77\x5A\xE8\x82"
2574         },
2575         { 64,
2576           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2577           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2578           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2579           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
2580           "\x52\xE2\x0C\xF8\x77\x5A\xE8\x82\xF2\x00\xC2\x99\x9F\xE4\xBA\x31"
2581           "\xA7\xA1\x8F\x1D\x5C\x97\x16\x19\x1D\x12\x31\x75\xE1\x47\xBD\x4E"
2582           "\x8C\xA6\xED\x16\x6C\xE0\xFC\x8E\x65\xA5\xCA\x60\x84\x20\xFC\x65"
2583           "\x44\xC9\x70\x0A\x0F\x21\x38\xE8\xC1\xA2\x86\xFB\x8C\x1F\xBF\xA0"
2584         }
2585       }
2586     },
2587 #endif /*USE_SALSA20*/
2588 #ifdef USE_CHACHA20
2589     /* From draft-strombergson-chacha-test-vectors-01 */
2590     {
2591       "ChaCha20 128 bit, TC1",
2592       GCRY_CIPHER_CHACHA20, 16, 8,
2593       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
2594       "\x00\x00\x00\x00\x00\x00\x00\x00",
2595       {
2596         { 8,
2597           "\x00\x00\x00\x00\x00\x00\x00\x00",
2598           "\x89\x67\x09\x52\x60\x83\x64\xfd"
2599         },
2600         { 112,
2601           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2602           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2603           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2604           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2605           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2606           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2607           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
2608           "\x89\x67\x09\x52\x60\x83\x64\xfd\x00\xb2\xf9\x09\x36\xf0\x31\xc8"
2609           "\xe7\x56\xe1\x5d\xba\x04\xb8\x49\x3d\x00\x42\x92\x59\xb2\x0f\x46"
2610           "\xcc\x04\xf1\x11\x24\x6b\x6c\x2c\xe0\x66\xbe\x3b\xfb\x32\xd9\xaa"
2611           "\x0f\xdd\xfb\xc1\x21\x23\xd4\xb9\xe4\x4f\x34\xdc\xa0\x5a\x10\x3f"
2612           "\x6c\xd1\x35\xc2\x87\x8c\x83\x2b\x58\x96\xb1\x34\xf6\x14\x2a\x9d"
2613           "\x4d\x8d\x0d\x8f\x10\x26\xd2\x0a\x0a\x81\x51\x2c\xbc\xe6\xe9\x75"
2614           "\x8a\x71\x43\xd0\x21\x97\x80\x22\xa3\x84\x14\x1a\x80\xce\xa3\x06"
2615         },
2616         { 128,
2617           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2618           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2619           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2620           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2621           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2622           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2623           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2624           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
2625           "\x89\x67\x09\x52\x60\x83\x64\xfd\x00\xb2\xf9\x09\x36\xf0\x31\xc8"
2626           "\xe7\x56\xe1\x5d\xba\x04\xb8\x49\x3d\x00\x42\x92\x59\xb2\x0f\x46"
2627           "\xcc\x04\xf1\x11\x24\x6b\x6c\x2c\xe0\x66\xbe\x3b\xfb\x32\xd9\xaa"
2628           "\x0f\xdd\xfb\xc1\x21\x23\xd4\xb9\xe4\x4f\x34\xdc\xa0\x5a\x10\x3f"
2629           "\x6c\xd1\x35\xc2\x87\x8c\x83\x2b\x58\x96\xb1\x34\xf6\x14\x2a\x9d"
2630           "\x4d\x8d\x0d\x8f\x10\x26\xd2\x0a\x0a\x81\x51\x2c\xbc\xe6\xe9\x75"
2631           "\x8a\x71\x43\xd0\x21\x97\x80\x22\xa3\x84\x14\x1a\x80\xce\xa3\x06"
2632           "\x2f\x41\xf6\x7a\x75\x2e\x66\xad\x34\x11\x98\x4c\x78\x7e\x30\xad"
2633         }
2634       }
2635     },
2636     {
2637       "ChaCha20 256 bit, TC1",
2638       GCRY_CIPHER_CHACHA20, 32, 8,
2639       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2640       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
2641       "\x00\x00\x00\x00\x00\x00\x00\x00",
2642       {
2643         { 8,
2644           "\x00\x00\x00\x00\x00\x00\x00\x00",
2645           "\x76\xb8\xe0\xad\xa0\xf1\x3d\x90"
2646         },
2647         { 112,
2648           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2649           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2650           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2651           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2652           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2653           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2654           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
2655           "\x76\xb8\xe0\xad\xa0\xf1\x3d\x90\x40\x5d\x6a\xe5\x53\x86\xbd\x28"
2656           "\xbd\xd2\x19\xb8\xa0\x8d\xed\x1a\xa8\x36\xef\xcc\x8b\x77\x0d\xc7"
2657           "\xda\x41\x59\x7c\x51\x57\x48\x8d\x77\x24\xe0\x3f\xb8\xd8\x4a\x37"
2658           "\x6a\x43\xb8\xf4\x15\x18\xa1\x1c\xc3\x87\xb6\x69\xb2\xee\x65\x86"
2659           "\x9f\x07\xe7\xbe\x55\x51\x38\x7a\x98\xba\x97\x7c\x73\x2d\x08\x0d"
2660           "\xcb\x0f\x29\xa0\x48\xe3\x65\x69\x12\xc6\x53\x3e\x32\xee\x7a\xed"
2661           "\x29\xb7\x21\x76\x9c\xe6\x4e\x43\xd5\x71\x33\xb0\x74\xd8\x39\xd5"
2662         },
2663         { 128,
2664           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2665           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2666           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2667           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2668           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2669           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2670           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2671           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
2672           "\x76\xb8\xe0\xad\xa0\xf1\x3d\x90\x40\x5d\x6a\xe5\x53\x86\xbd\x28"
2673           "\xbd\xd2\x19\xb8\xa0\x8d\xed\x1a\xa8\x36\xef\xcc\x8b\x77\x0d\xc7"
2674           "\xda\x41\x59\x7c\x51\x57\x48\x8d\x77\x24\xe0\x3f\xb8\xd8\x4a\x37"
2675           "\x6a\x43\xb8\xf4\x15\x18\xa1\x1c\xc3\x87\xb6\x69\xb2\xee\x65\x86"
2676           "\x9f\x07\xe7\xbe\x55\x51\x38\x7a\x98\xba\x97\x7c\x73\x2d\x08\x0d"
2677           "\xcb\x0f\x29\xa0\x48\xe3\x65\x69\x12\xc6\x53\x3e\x32\xee\x7a\xed"
2678           "\x29\xb7\x21\x76\x9c\xe6\x4e\x43\xd5\x71\x33\xb0\x74\xd8\x39\xd5"
2679           "\x31\xed\x1f\x28\x51\x0a\xfb\x45\xac\xe1\x0a\x1f\x4b\x79\x4d\x6f"
2680         }
2681       }
2682     },
2683     {
2684       "ChaCha20 256 bit, TC2",
2685       GCRY_CIPHER_CHACHA20, 32, 8,
2686       "\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2687       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
2688       "\x00\x00\x00\x00\x00\x00\x00\x00",
2689       {
2690         { 128,
2691           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2692           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2693           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2694           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2695           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2696           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2697           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2698           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
2699           "\xc5\xd3\x0a\x7c\xe1\xec\x11\x93\x78\xc8\x4f\x48\x7d\x77\x5a\x85"
2700           "\x42\xf1\x3e\xce\x23\x8a\x94\x55\xe8\x22\x9e\x88\x8d\xe8\x5b\xbd"
2701           "\x29\xeb\x63\xd0\xa1\x7a\x5b\x99\x9b\x52\xda\x22\xbe\x40\x23\xeb"
2702           "\x07\x62\x0a\x54\xf6\xfa\x6a\xd8\x73\x7b\x71\xeb\x04\x64\xda\xc0"
2703           "\x10\xf6\x56\xe6\xd1\xfd\x55\x05\x3e\x50\xc4\x87\x5c\x99\x30\xa3"
2704           "\x3f\x6d\x02\x63\xbd\x14\xdf\xd6\xab\x8c\x70\x52\x1c\x19\x33\x8b"
2705           "\x23\x08\xb9\x5c\xf8\xd0\xbb\x7d\x20\x2d\x21\x02\x78\x0e\xa3\x52"
2706           "\x8f\x1c\xb4\x85\x60\xf7\x6b\x20\xf3\x82\xb9\x42\x50\x0f\xce\xac"
2707         }
2708       }
2709     },
2710     {
2711       "ChaCha20 256 bit, TC3",
2712       GCRY_CIPHER_CHACHA20, 32, 8,
2713       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2714       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
2715       "\x01\x00\x00\x00\x00\x00\x00\x00",
2716       {
2717         { 128,
2718           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2719           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2720           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2721           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2722           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2723           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2724           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2725           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
2726           "\xef\x3f\xdf\xd6\xc6\x15\x78\xfb\xf5\xcf\x35\xbd\x3d\xd3\x3b\x80"
2727           "\x09\x63\x16\x34\xd2\x1e\x42\xac\x33\x96\x0b\xd1\x38\xe5\x0d\x32"
2728           "\x11\x1e\x4c\xaf\x23\x7e\xe5\x3c\xa8\xad\x64\x26\x19\x4a\x88\x54"
2729           "\x5d\xdc\x49\x7a\x0b\x46\x6e\x7d\x6b\xbd\xb0\x04\x1b\x2f\x58\x6b"
2730           "\x53\x05\xe5\xe4\x4a\xff\x19\xb2\x35\x93\x61\x44\x67\x5e\xfb\xe4"
2731           "\x40\x9e\xb7\xe8\xe5\xf1\x43\x0f\x5f\x58\x36\xae\xb4\x9b\xb5\x32"
2732           "\x8b\x01\x7c\x4b\x9d\xc1\x1f\x8a\x03\x86\x3f\xa8\x03\xdc\x71\xd5"
2733           "\x72\x6b\x2b\x6b\x31\xaa\x32\x70\x8a\xfe\x5a\xf1\xd6\xb6\x90\x58"
2734         }
2735       }
2736     },
2737     {
2738       "ChaCha20 256 bit, TC4",
2739       GCRY_CIPHER_CHACHA20, 32, 8,
2740       "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
2741       "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff",
2742       "\xff\xff\xff\xff\xff\xff\xff\xff",
2743       {
2744         { 128,
2745           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2746           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2747           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2748           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2749           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2750           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2751           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2752           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
2753           "\xd9\xbf\x3f\x6b\xce\x6e\xd0\xb5\x42\x54\x55\x77\x67\xfb\x57\x44"
2754           "\x3d\xd4\x77\x89\x11\xb6\x06\x05\x5c\x39\xcc\x25\xe6\x74\xb8\x36"
2755           "\x3f\xea\xbc\x57\xfd\xe5\x4f\x79\x0c\x52\xc8\xae\x43\x24\x0b\x79"
2756           "\xd4\x90\x42\xb7\x77\xbf\xd6\xcb\x80\xe9\x31\x27\x0b\x7f\x50\xeb"
2757           "\x5b\xac\x2a\xcd\x86\xa8\x36\xc5\xdc\x98\xc1\x16\xc1\x21\x7e\xc3"
2758           "\x1d\x3a\x63\xa9\x45\x13\x19\xf0\x97\xf3\xb4\xd6\xda\xb0\x77\x87"
2759           "\x19\x47\x7d\x24\xd2\x4b\x40\x3a\x12\x24\x1d\x7c\xca\x06\x4f\x79"
2760           "\x0f\x1d\x51\xcc\xaf\xf6\xb1\x66\x7d\x4b\xbc\xa1\x95\x8c\x43\x06"
2761         }
2762       }
2763     },
2764     {
2765       "ChaCha20 256 bit, TC5",
2766       GCRY_CIPHER_CHACHA20, 32, 8,
2767       "\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55"
2768       "\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55",
2769       "\x55\x55\x55\x55\x55\x55\x55\x55",
2770       {
2771         { 128,
2772           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2773           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2774           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2775           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2776           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2777           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2778           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2779           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
2780           "\xbe\xa9\x41\x1a\xa4\x53\xc5\x43\x4a\x5a\xe8\xc9\x28\x62\xf5\x64"
2781           "\x39\x68\x55\xa9\xea\x6e\x22\xd6\xd3\xb5\x0a\xe1\xb3\x66\x33\x11"
2782           "\xa4\xa3\x60\x6c\x67\x1d\x60\x5c\xe1\x6c\x3a\xec\xe8\xe6\x1e\xa1"
2783           "\x45\xc5\x97\x75\x01\x7b\xee\x2f\xa6\xf8\x8a\xfc\x75\x80\x69\xf7"
2784           "\xe0\xb8\xf6\x76\xe6\x44\x21\x6f\x4d\x2a\x34\x22\xd7\xfa\x36\xc6"
2785           "\xc4\x93\x1a\xca\x95\x0e\x9d\xa4\x27\x88\xe6\xd0\xb6\xd1\xcd\x83"
2786           "\x8e\xf6\x52\xe9\x7b\x14\x5b\x14\x87\x1e\xae\x6c\x68\x04\xc7\x00"
2787           "\x4d\xb5\xac\x2f\xce\x4c\x68\xc7\x26\xd0\x04\xb1\x0f\xca\xba\x86"
2788         }
2789       }
2790     },
2791     {
2792       "ChaCha20 256 bit, TC6",
2793       GCRY_CIPHER_CHACHA20, 32, 8,
2794       "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
2795       "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
2796       "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
2797       {
2798         { 128,
2799           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2800           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2801           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2802           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2803           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2804           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
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           "\x9a\xa2\xa9\xf6\x56\xef\xde\x5a\xa7\x59\x1c\x5f\xed\x4b\x35\xae"
2808           "\xa2\x89\x5d\xec\x7c\xb4\x54\x3b\x9e\x9f\x21\xf5\xe7\xbc\xbc\xf3"
2809           "\xc4\x3c\x74\x8a\x97\x08\x88\xf8\x24\x83\x93\xa0\x9d\x43\xe0\xb7"
2810           "\xe1\x64\xbc\x4d\x0b\x0f\xb2\x40\xa2\xd7\x21\x15\xc4\x80\x89\x06"
2811           "\x72\x18\x44\x89\x44\x05\x45\xd0\x21\xd9\x7e\xf6\xb6\x93\xdf\xe5"
2812           "\xb2\xc1\x32\xd4\x7e\x6f\x04\x1c\x90\x63\x65\x1f\x96\xb6\x23\xe6"
2813           "\x2a\x11\x99\x9a\x23\xb6\xf7\xc4\x61\xb2\x15\x30\x26\xad\x5e\x86"
2814           "\x6a\x2e\x59\x7e\xd0\x7b\x84\x01\xde\xc6\x3a\x09\x34\xc6\xb2\xa9"
2815         }
2816       }
2817     },
2818     {
2819       "ChaCha20 256 bit, TC7",
2820       GCRY_CIPHER_CHACHA20, 32, 8,
2821       "\x00\x11\x22\x33\x44\x55\x66\x77\x88\x99\xaa\xbb\xcc\xdd\xee\xff"
2822       "\xff\xee\xdd\xcc\xbb\xaa\x99\x88\x77\x66\x55\x44\x33\x22\x11\x00",
2823       "\x0f\x1e\x2d\x3c\x4b\x5a\x69\x78",
2824       {
2825         { 128,
2826           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2827           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2828           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2829           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2830           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2831           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2832           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2833           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
2834           "\x9f\xad\xf4\x09\xc0\x08\x11\xd0\x04\x31\xd6\x7e\xfb\xd8\x8f\xba"
2835           "\x59\x21\x8d\x5d\x67\x08\xb1\xd6\x85\x86\x3f\xab\xbb\x0e\x96\x1e"
2836           "\xea\x48\x0f\xd6\xfb\x53\x2b\xfd\x49\x4b\x21\x51\x01\x50\x57\x42"
2837           "\x3a\xb6\x0a\x63\xfe\x4f\x55\xf7\xa2\x12\xe2\x16\x7c\xca\xb9\x31"
2838           "\xfb\xfd\x29\xcf\x7b\xc1\xd2\x79\xed\xdf\x25\xdd\x31\x6b\xb8\x84"
2839           "\x3d\x6e\xde\xe0\xbd\x1e\xf1\x21\xd1\x2f\xa1\x7c\xbc\x2c\x57\x4c"
2840           "\xcc\xab\x5e\x27\x51\x67\xb0\x8b\xd6\x86\xf8\xa0\x9d\xf8\x7e\xc3"
2841           "\xff\xb3\x53\x61\xb9\x4e\xbf\xa1\x3f\xec\x0e\x48\x89\xd1\x8d\xa5"
2842         }
2843       }
2844     },
2845     {
2846       "ChaCha20 256 bit, TC8",
2847       GCRY_CIPHER_CHACHA20, 32, 8,
2848       "\xc4\x6e\xc1\xb1\x8c\xe8\xa8\x78\x72\x5a\x37\xe7\x80\xdf\xb7\x35"
2849       "\x1f\x68\xed\x2e\x19\x4c\x79\xfb\xc6\xae\xbe\xe1\xa6\x67\x97\x5d",
2850       "\x1a\xda\x31\xd5\xcf\x68\x82\x21",
2851       {
2852         { 128,
2853           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2854           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2855           "\x00\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\x00\x00\x00\x00\x00\x00\x00\x00"
2858           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2859           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2860           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
2861           "\xf6\x3a\x89\xb7\x5c\x22\x71\xf9\x36\x88\x16\x54\x2b\xa5\x2f\x06"
2862           "\xed\x49\x24\x17\x92\x30\x2b\x00\xb5\xe8\xf8\x0a\xe9\xa4\x73\xaf"
2863           "\xc2\x5b\x21\x8f\x51\x9a\xf0\xfd\xd4\x06\x36\x2e\x8d\x69\xde\x7f"
2864           "\x54\xc6\x04\xa6\xe0\x0f\x35\x3f\x11\x0f\x77\x1b\xdc\xa8\xab\x92"
2865           "\xe5\xfb\xc3\x4e\x60\xa1\xd9\xa9\xdb\x17\x34\x5b\x0a\x40\x27\x36"
2866           "\x85\x3b\xf9\x10\xb0\x60\xbd\xf1\xf8\x97\xb6\x29\x0f\x01\xd1\x38"
2867           "\xae\x2c\x4c\x90\x22\x5b\xa9\xea\x14\xd5\x18\xf5\x59\x29\xde\xa0"
2868           "\x98\xca\x7a\x6c\xcf\xe6\x12\x27\x05\x3c\x84\xe4\x9a\x4a\x33\x32"
2869         },
2870         { 127,
2871           "\xf6\x3a\x89\xb7\x5c\x22\x71\xf9\x36\x88\x16\x54\x2b\xa5\x2f\x06"
2872           "\xed\x49\x24\x17\x92\x30\x2b\x00\xb5\xe8\xf8\x0a\xe9\xa4\x73\xaf"
2873           "\xc2\x5b\x21\x8f\x51\x9a\xf0\xfd\xd4\x06\x36\x2e\x8d\x69\xde\x7f"
2874           "\x54\xc6\x04\xa6\xe0\x0f\x35\x3f\x11\x0f\x77\x1b\xdc\xa8\xab\x92"
2875           "\xe5\xfb\xc3\x4e\x60\xa1\xd9\xa9\xdb\x17\x34\x5b\x0a\x40\x27\x36"
2876           "\x85\x3b\xf9\x10\xb0\x60\xbd\xf1\xf8\x97\xb6\x29\x0f\x01\xd1\x38"
2877           "\xae\x2c\x4c\x90\x22\x5b\xa9\xea\x14\xd5\x18\xf5\x59\x29\xde\xa0"
2878           "\x98\xca\x7a\x6c\xcf\xe6\x12\x27\x05\x3c\x84\xe4\x9a\x4a\x33",
2879           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2880           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2881           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2882           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2883           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2884           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2885           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2886           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2887         }
2888       }
2889     },
2890     /* from draft-nir-cfrg-chacha20-poly1305-02 */
2891     {
2892       "ChaCha20 256 bit, IV96-bit",
2893       GCRY_CIPHER_CHACHA20, 32, 12,
2894       "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
2895       "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f",
2896       "\x07\x00\x00\x00\x40\x41\x42\x43\x44\x45\x46\x47",
2897       {
2898         { 64,
2899           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2900           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2901           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
2902           "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
2903           "\x7b\xac\x2b\x25\x2d\xb4\x47\xaf\x09\xb6\x7a\x55\xa4\xe9\x55\x84"
2904           "\x0a\xe1\xd6\x73\x10\x75\xd9\xeb\x2a\x93\x75\x78\x3e\xd5\x53\xff"
2905           "\xa2\x7e\xcc\xde\xad\xdb\x4d\xb4\xd1\x17\x9c\xe4\xc9\x0b\x43\xd8"
2906           "\xbc\xb7\x94\x8c\x4b\x4b\x7d\x8b\x7d\xf6\x27\x39\x32\xa4\x69\x16"
2907         },
2908       },
2909     },
2910 #endif /*USE_CHACHA20*/
2911   };
2912
2913   gcry_cipher_hd_t hde, hdd;
2914   unsigned char out[MAX_DATA_LEN];
2915   int i, j;
2916   gcry_error_t err = 0;
2917
2918
2919   if (verbose)
2920     fprintf (stderr, "  Starting stream cipher checks.\n");
2921
2922   for (i = 0; i < sizeof (tv) / sizeof (tv[0]); i++)
2923     {
2924       if (verbose)
2925         fprintf (stderr, "    checking stream mode for %s [%i] (%s)\n",
2926                  gcry_cipher_algo_name (tv[i].algo), tv[i].algo, tv[i].name);
2927
2928       if (gcry_cipher_get_algo_blklen(tv[i].algo) != 1)
2929         {
2930           fail ("stream, gcry_cipher_get_algo_blklen: bad block length\n");
2931           continue;
2932         }
2933
2934       err = gcry_cipher_open (&hde, tv[i].algo, GCRY_CIPHER_MODE_STREAM, 0);
2935       if (!err)
2936         err = gcry_cipher_open (&hdd, tv[i].algo, GCRY_CIPHER_MODE_STREAM, 0);
2937       if (err)
2938         {
2939           fail ("stream, gcry_cipher_open for stream mode failed: %s\n",
2940                 gpg_strerror (err));
2941           continue;
2942         }
2943
2944       /* Now loop over all the data samples.  */
2945       for (j = 0; tv[i].data[j].inlen; j++)
2946         {
2947           err = gcry_cipher_setkey (hde, tv[i].key, tv[i].keylen);
2948           if (!err)
2949             err = gcry_cipher_setkey (hdd, tv[i].key, tv[i].keylen);
2950           if (err)
2951             {
2952               fail ("stream, gcry_cipher_setkey failed: %s\n",
2953                     gpg_strerror (err));
2954               goto next;
2955             }
2956
2957           err = gcry_cipher_setiv (hde, tv[i].iv, tv[i].ivlen);
2958           if (!err)
2959             err = gcry_cipher_setiv (hdd, tv[i].iv, tv[i].ivlen);
2960           if (err)
2961             {
2962               fail ("stream, gcry_cipher_setiv failed: %s\n",
2963                     gpg_strerror (err));
2964               goto next;
2965             }
2966
2967           err = gcry_cipher_encrypt (hde, out, MAX_DATA_LEN,
2968                                      tv[i].data[j].plaintext,
2969                                      tv[i].data[j].inlen);
2970           if (err)
2971             {
2972               fail ("stream, gcry_cipher_encrypt (%d, %d) failed: %s\n",
2973                     i, j, gpg_strerror (err));
2974               goto next;
2975             }
2976
2977           if (memcmp (tv[i].data[j].out, out, tv[i].data[j].inlen))
2978             {
2979               fail ("stream, encrypt mismatch entry %d:%d\n", i, j);
2980               mismatch (tv[i].data[j].out, tv[i].data[j].inlen,
2981                         out, tv[i].data[j].inlen);
2982             }
2983
2984           err = gcry_cipher_decrypt (hdd, out, tv[i].data[j].inlen, NULL, 0);
2985           if (err)
2986             {
2987               fail ("stream, gcry_cipher_decrypt (%d, %d) failed: %s\n",
2988                     i, j, gpg_strerror (err));
2989               goto next;
2990             }
2991
2992           if (memcmp (tv[i].data[j].plaintext, out, tv[i].data[j].inlen))
2993             fail ("stream, decrypt mismatch entry %d:%d\n", i, j);
2994         }
2995
2996
2997       /* This time we encrypt and decrypt one byte at a time */
2998       for (j = 0; tv[i].data[j].inlen; j++)
2999         {
3000           int byteNum;
3001
3002           err = gcry_cipher_setkey (hde, tv[i].key, tv[i].keylen);
3003           if (!err)
3004             err = gcry_cipher_setkey (hdd, tv[i].key, tv[i].keylen);
3005           if (err)
3006             {
3007               fail ("stream, gcry_cipher_setkey failed: %s\n",
3008                     gpg_strerror (err));
3009               goto next;
3010             }
3011
3012           err = gcry_cipher_setiv (hde, tv[i].iv, tv[i].ivlen);
3013           if (!err)
3014             err = gcry_cipher_setiv (hdd, tv[i].iv, tv[i].ivlen);
3015           if (err)
3016             {
3017               fail ("stream, gcry_cipher_setiv failed: %s\n",
3018                     gpg_strerror (err));
3019               goto next;
3020             }
3021
3022           for (byteNum = 0; byteNum < tv[i].data[j].inlen; ++byteNum)
3023             {
3024               err = gcry_cipher_encrypt (hde, out+byteNum, 1,
3025                                          (tv[i].data[j].plaintext) + byteNum,
3026                                          1);
3027               if (err)
3028                 {
3029                   fail ("stream, gcry_cipher_encrypt (%d, %d) failed: %s\n",
3030                         i, j, gpg_strerror (err));
3031                   goto next;
3032                 }
3033             }
3034
3035           if (memcmp (tv[i].data[j].out, out, tv[i].data[j].inlen))
3036             fail ("stream, encrypt mismatch entry %d:%d (byte-wise)\n", i, j);
3037
3038           for (byteNum = 0; byteNum < tv[i].data[j].inlen; ++byteNum)
3039             {
3040               err = gcry_cipher_decrypt (hdd, out+byteNum, 1, NULL, 0);
3041               if (err)
3042                 {
3043                   fail ("stream, gcry_cipher_decrypt (%d, %d) failed: %s\n",
3044                         i, j, gpg_strerror (err));
3045                   goto next;
3046                 }
3047             }
3048
3049           if (memcmp (tv[i].data[j].plaintext, out, tv[i].data[j].inlen))
3050             fail ("stream, decrypt mismatch entry %d:%d (byte-wise)\n", i, j);
3051         }
3052
3053     next:
3054       gcry_cipher_close (hde);
3055       gcry_cipher_close (hdd);
3056     }
3057   if (verbose)
3058     fprintf (stderr, "  Completed stream cipher checks.\n");
3059 }
3060
3061
3062 static void
3063 check_stream_cipher_large_block (void)
3064 {
3065   static const struct tv
3066   {
3067     const char *name;
3068     int algo;
3069     int keylen;
3070     int ivlen;
3071     const char *key;
3072     const char *iv;
3073     struct data
3074     {
3075       int offset, length;
3076       const char *result;
3077     } data[MAX_DATA_LEN];
3078   } tv[] = {
3079 #ifdef USE_SALSA20
3080     {
3081       "Salsa20 256 bit, ecrypt verified, set 6, vector 0",
3082       GCRY_CIPHER_SALSA20, 32, 8,
3083       "\x00\x53\xA6\xF9\x4C\x9F\xF2\x45\x98\xEB\x3E\x91\xE4\x37\x8A\xDD"
3084       "\x30\x83\xD6\x29\x7C\xCF\x22\x75\xC8\x1B\x6E\xC1\x14\x67\xBA\x0D",
3085       "\x0D\x74\xDB\x42\xA9\x10\x77\xDE",
3086       {
3087         { 0, 64,
3088           "\xF5\xFA\xD5\x3F\x79\xF9\xDF\x58\xC4\xAE\xA0\xD0\xED\x9A\x96\x01"
3089           "\xF2\x78\x11\x2C\xA7\x18\x0D\x56\x5B\x42\x0A\x48\x01\x96\x70\xEA"
3090           "\xF2\x4C\xE4\x93\xA8\x62\x63\xF6\x77\xB4\x6A\xCE\x19\x24\x77\x3D"
3091           "\x2B\xB2\x55\x71\xE1\xAA\x85\x93\x75\x8F\xC3\x82\xB1\x28\x0B\x71"
3092         },
3093         { 65472, 64,
3094          "\xB7\x0C\x50\x13\x9C\x63\x33\x2E\xF6\xE7\x7A\xC5\x43\x38\xA4\x07"
3095          "\x9B\x82\xBE\xC9\xF9\xA4\x03\xDF\xEA\x82\x1B\x83\xF7\x86\x07\x91"
3096          "\x65\x0E\xF1\xB2\x48\x9D\x05\x90\xB1\xDE\x77\x2E\xED\xA4\xE3\xBC"
3097          "\xD6\x0F\xA7\xCE\x9C\xD6\x23\xD9\xD2\xFD\x57\x58\xB8\x65\x3E\x70"
3098         },
3099         { 65536, 64,
3100          "\x81\x58\x2C\x65\xD7\x56\x2B\x80\xAE\xC2\xF1\xA6\x73\xA9\xD0\x1C"
3101          "\x9F\x89\x2A\x23\xD4\x91\x9F\x6A\xB4\x7B\x91\x54\xE0\x8E\x69\x9B"
3102          "\x41\x17\xD7\xC6\x66\x47\x7B\x60\xF8\x39\x14\x81\x68\x2F\x5D\x95"
3103          "\xD9\x66\x23\xDB\xC4\x89\xD8\x8D\xAA\x69\x56\xB9\xF0\x64\x6B\x6E"
3104         },
3105         { 131008, 64,
3106          "\xA1\x3F\xFA\x12\x08\xF8\xBF\x50\x90\x08\x86\xFA\xAB\x40\xFD\x10"
3107          "\xE8\xCA\xA3\x06\xE6\x3D\xF3\x95\x36\xA1\x56\x4F\xB7\x60\xB2\x42"
3108          "\xA9\xD6\xA4\x62\x8C\xDC\x87\x87\x62\x83\x4E\x27\xA5\x41\xDA\x2A"
3109          "\x5E\x3B\x34\x45\x98\x9C\x76\xF6\x11\xE0\xFE\xC6\xD9\x1A\xCA\xCC"
3110         }
3111       }
3112     },
3113     {
3114       "Salsa20 256 bit, ecrypt verified, set 6, vector 1",
3115       GCRY_CIPHER_SALSA20, 32, 8,
3116       "\x05\x58\xAB\xFE\x51\xA4\xF7\x4A\x9D\xF0\x43\x96\xE9\x3C\x8F\xE2"
3117       "\x35\x88\xDB\x2E\x81\xD4\x27\x7A\xCD\x20\x73\xC6\x19\x6C\xBF\x12",
3118       "\x16\x7D\xE4\x4B\xB2\x19\x80\xE7",
3119       {
3120         { 0, 64,
3121           "\x39\x44\xF6\xDC\x9F\x85\xB1\x28\x08\x38\x79\xFD\xF1\x90\xF7\xDE"
3122           "\xE4\x05\x3A\x07\xBC\x09\x89\x6D\x51\xD0\x69\x0B\xD4\xDA\x4A\xC1"
3123           "\x06\x2F\x1E\x47\xD3\xD0\x71\x6F\x80\xA9\xB4\xD8\x5E\x6D\x60\x85"
3124           "\xEE\x06\x94\x76\x01\xC8\x5F\x1A\x27\xA2\xF7\x6E\x45\xA6\xAA\x87"
3125         },
3126         { 65472, 64,
3127           "\x36\xE0\x3B\x4B\x54\xB0\xB2\xE0\x4D\x06\x9E\x69\x00\x82\xC8\xC5"
3128           "\x92\xDF\x56\xE6\x33\xF5\xD8\xC7\x68\x2A\x02\xA6\x5E\xCD\x13\x71"
3129           "\x8C\xA4\x35\x2A\xAC\xCB\x0D\xA2\x0E\xD6\xBB\xBA\x62\xE1\x77\xF2"
3130           "\x10\xE3\x56\x0E\x63\xBB\x82\x2C\x41\x58\xCA\xA8\x06\xA8\x8C\x82"
3131         },
3132         { 65536, 64,
3133           "\x1B\x77\x9E\x7A\x91\x7C\x8C\x26\x03\x9F\xFB\x23\xCF\x0E\xF8\xE0"
3134           "\x8A\x1A\x13\xB4\x3A\xCD\xD9\x40\x2C\xF5\xDF\x38\x50\x10\x98\xDF"
3135           "\xC9\x45\xA6\xCC\x69\xA6\xA1\x73\x67\xBC\x03\x43\x1A\x86\xB3\xED"
3136           "\x04\xB0\x24\x5B\x56\x37\x9B\xF9\x97\xE2\x58\x00\xAD\x83\x7D\x7D"
3137         },
3138         { 131008, 64,
3139           "\x7E\xC6\xDA\xE8\x1A\x10\x5E\x67\x17\x2A\x0B\x8C\x4B\xBE\x7D\x06"
3140           "\xA7\xA8\x75\x9F\x91\x4F\xBE\xB1\xAF\x62\xC8\xA5\x52\xEF\x4A\x4F"
3141           "\x56\x96\x7E\xA2\x9C\x74\x71\xF4\x6F\x3B\x07\xF7\xA3\x74\x6E\x95"
3142           "\x3D\x31\x58\x21\xB8\x5B\x6E\x8C\xB4\x01\x22\xB9\x66\x35\x31\x3C"
3143         }
3144       }
3145     },
3146     {
3147       "Salsa20 256 bit, ecrypt verified, set 6, vector 2",
3148       GCRY_CIPHER_SALSA20, 32, 8,
3149       "\x0A\x5D\xB0\x03\x56\xA9\xFC\x4F\xA2\xF5\x48\x9B\xEE\x41\x94\xE7"
3150       "\x3A\x8D\xE0\x33\x86\xD9\x2C\x7F\xD2\x25\x78\xCB\x1E\x71\xC4\x17",
3151       "\x1F\x86\xED\x54\xBB\x22\x89\xF0",
3152       {
3153         { 0, 64,
3154           "\x3F\xE8\x5D\x5B\xB1\x96\x0A\x82\x48\x0B\x5E\x6F\x4E\x96\x5A\x44"
3155           "\x60\xD7\xA5\x45\x01\x66\x4F\x7D\x60\xB5\x4B\x06\x10\x0A\x37\xFF"
3156           "\xDC\xF6\xBD\xE5\xCE\x3F\x48\x86\xBA\x77\xDD\x5B\x44\xE9\x56\x44"
3157           "\xE4\x0A\x8A\xC6\x58\x01\x15\x5D\xB9\x0F\x02\x52\x2B\x64\x40\x23"
3158         },
3159         { 65472, 64,
3160           "\xC8\xD6\xE5\x4C\x29\xCA\x20\x40\x18\xA8\x30\xE2\x66\xCE\xEE\x0D"
3161           "\x03\x7D\xC4\x7E\x92\x19\x47\x30\x2A\xCE\x40\xD1\xB9\x96\xA6\xD8"
3162           "\x0B\x59\x86\x77\xF3\x35\x2F\x1D\xAA\x6D\x98\x88\xF8\x91\xAD\x95"
3163           "\xA1\xC3\x2F\xFE\xB7\x1B\xB8\x61\xE8\xB0\x70\x58\x51\x51\x71\xC9"
3164         },
3165         { 65536, 64,
3166           "\xB7\x9F\xD7\x76\x54\x2B\x46\x20\xEF\xCB\x88\x44\x95\x99\xF2\x34"
3167           "\x03\xE7\x4A\x6E\x91\xCA\xCC\x50\xA0\x5A\x8F\x8F\x3C\x0D\xEA\x8B"
3168           "\x00\xE1\xA5\xE6\x08\x1F\x55\x26\xAE\x97\x5B\x3B\xC0\x45\x0F\x1A"
3169           "\x0C\x8B\x66\xF8\x08\xF1\x90\x4B\x97\x13\x61\x13\x7C\x93\x15\x6F"
3170         },
3171         { 131008, 64,
3172           "\x79\x98\x20\x4F\xED\x70\xCE\x8E\x0D\x02\x7B\x20\x66\x35\xC0\x8C"
3173           "\x8B\xC4\x43\x62\x26\x08\x97\x0E\x40\xE3\xAE\xDF\x3C\xE7\x90\xAE"
3174           "\xED\xF8\x9F\x92\x26\x71\xB4\x53\x78\xE2\xCD\x03\xF6\xF6\x23\x56"
3175           "\x52\x9C\x41\x58\xB7\xFF\x41\xEE\x85\x4B\x12\x35\x37\x39\x88\xC8"
3176         }
3177       }
3178     },
3179     {
3180       "Salsa20 256 bit, ecrypt verified, set 6, vector 3",
3181       GCRY_CIPHER_SALSA20, 32, 8,
3182       "\x0F\x62\xB5\x08\x5B\xAE\x01\x54\xA7\xFA\x4D\xA0\xF3\x46\x99\xEC"
3183       "\x3F\x92\xE5\x38\x8B\xDE\x31\x84\xD7\x2A\x7D\xD0\x23\x76\xC9\x1C",
3184       "\x28\x8F\xF6\x5D\xC4\x2B\x92\xF9",
3185       {
3186         { 0, 64,
3187           "\x5E\x5E\x71\xF9\x01\x99\x34\x03\x04\xAB\xB2\x2A\x37\xB6\x62\x5B"
3188           "\xF8\x83\xFB\x89\xCE\x3B\x21\xF5\x4A\x10\xB8\x10\x66\xEF\x87\xDA"
3189           "\x30\xB7\x76\x99\xAA\x73\x79\xDA\x59\x5C\x77\xDD\x59\x54\x2D\xA2"
3190           "\x08\xE5\x95\x4F\x89\xE4\x0E\xB7\xAA\x80\xA8\x4A\x61\x76\x66\x3F"
3191         },
3192         { 65472, 64,
3193           "\x2D\xA2\x17\x4B\xD1\x50\xA1\xDF\xEC\x17\x96\xE9\x21\xE9\xD6\xE2"
3194           "\x4E\xCF\x02\x09\xBC\xBE\xA4\xF9\x83\x70\xFC\xE6\x29\x05\x6F\x64"
3195           "\x91\x72\x83\x43\x6E\x2D\x3F\x45\x55\x62\x25\x30\x7D\x5C\xC5\xA5"
3196           "\x65\x32\x5D\x89\x93\xB3\x7F\x16\x54\x19\x5C\x24\x0B\xF7\x5B\x16"
3197         },
3198         { 65536, 64,
3199           "\xAB\xF3\x9A\x21\x0E\xEE\x89\x59\x8B\x71\x33\x37\x70\x56\xC2\xFE"
3200           "\xF4\x2D\xA7\x31\x32\x75\x63\xFB\x67\xC7\xBE\xDB\x27\xF3\x8C\x7C"
3201           "\x5A\x3F\xC2\x18\x3A\x4C\x6B\x27\x7F\x90\x11\x52\x47\x2C\x6B\x2A"
3202           "\xBC\xF5\xE3\x4C\xBE\x31\x5E\x81\xFD\x3D\x18\x0B\x5D\x66\xCB\x6C"
3203         },
3204         { 131008, 64,
3205           "\x1B\xA8\x9D\xBD\x3F\x98\x83\x97\x28\xF5\x67\x91\xD5\xB7\xCE\x23"
3206           "\x50\x36\xDE\x84\x3C\xCC\xAB\x03\x90\xB8\xB5\x86\x2F\x1E\x45\x96"
3207           "\xAE\x8A\x16\xFB\x23\xDA\x99\x7F\x37\x1F\x4E\x0A\xAC\xC2\x6D\xB8"
3208           "\xEB\x31\x4E\xD4\x70\xB1\xAF\x6B\x9F\x8D\x69\xDD\x79\xA9\xD7\x50"
3209         }
3210       }
3211     },
3212     {
3213       "Salsa20/12 256 bit, ecrypt verified, set 6, vector 0",
3214       GCRY_CIPHER_SALSA20R12, 32, 8,
3215       "\x00\x53\xA6\xF9\x4C\x9F\xF2\x45\x98\xEB\x3E\x91\xE4\x37\x8A\xDD"
3216       "\x30\x83\xD6\x29\x7C\xCF\x22\x75\xC8\x1B\x6E\xC1\x14\x67\xBA\x0D",
3217       "\x0D\x74\xDB\x42\xA9\x10\x77\xDE",
3218       {
3219         { 0, 64,
3220           "\x52\xE2\x0C\xF8\x77\x5A\xE8\x82\xF2\x00\xC2\x99\x9F\xE4\xBA\x31"
3221           "\xA7\xA1\x8F\x1D\x5C\x97\x16\x19\x1D\x12\x31\x75\xE1\x47\xBD\x4E"
3222           "\x8C\xA6\xED\x16\x6C\xE0\xFC\x8E\x65\xA5\xCA\x60\x84\x20\xFC\x65"
3223           "\x44\xC9\x70\x0A\x0F\x21\x38\xE8\xC1\xA2\x86\xFB\x8C\x1F\xBF\xA0"
3224         },
3225         { 65472, 64,
3226           "\x8F\xBC\x9F\xE8\x69\x1B\xD4\xF0\x82\xB4\x7F\x54\x05\xED\xFB\xC1"
3227           "\x6F\x4D\x5A\x12\xDD\xCB\x2D\x75\x4E\x8A\x99\x98\xD0\xB2\x19\x55"
3228           "\x7D\xFE\x29\x84\xF4\xA1\xD2\xDD\xA7\x6B\x95\x96\x92\x8C\xCE\x05"
3229           "\x56\xF5\x00\x66\xCD\x59\x9E\x44\xEF\x5C\x14\xB2\x26\x68\x3A\xEF"
3230         },
3231         { 65536, 64,
3232           "\xBC\xBD\x01\xDD\x28\x96\x1C\xC7\xAD\x30\x47\x38\x6C\xBC\xC6\x7C"
3233           "\x10\x8D\x6A\xF1\x11\x67\xE4\x0D\x7A\xE1\xB2\xFC\x45\x18\xA8\x67"
3234           "\xEF\xE4\x02\x65\x1D\x1D\x88\x51\xC4\xFD\x23\x30\xC5\x97\xB3\x6A"
3235           "\x46\xD5\x68\x9E\x00\xFC\x96\xFE\xCF\x9C\xE3\xE2\x21\x1D\x44\xBE"
3236         },
3237         { 131008, 64,
3238           "\x91\x66\xF3\x1C\xD8\x5B\x5B\xB1\x8F\xC6\x14\xE5\x4E\x4A\xD6\x7F"
3239           "\xB8\x65\x8E\x3B\xF9\xFB\x19\xB7\xA8\x2F\x0F\xE7\xDC\x90\x2D\xF5"
3240           "\x63\xC6\xAC\x4F\x44\x67\x48\xC4\xBC\x3E\x14\x05\xE1\x24\x82\x0D"
3241           "\xC4\x09\x41\x99\x8F\x44\xA8\x10\xE7\x22\x78\x7F\xCD\x47\x78\x4C"
3242         }
3243       }
3244     },
3245     {
3246       "Salsa20/12 256 bit, ecrypt verified, set 6, vector 1",
3247       GCRY_CIPHER_SALSA20R12, 32, 8,
3248       "\x05\x58\xAB\xFE\x51\xA4\xF7\x4A\x9D\xF0\x43\x96\xE9\x3C\x8F\xE2"
3249       "\x35\x88\xDB\x2E\x81\xD4\x27\x7A\xCD\x20\x73\xC6\x19\x6C\xBF\x12",
3250       "\x16\x7D\xE4\x4B\xB2\x19\x80\xE7",
3251       {
3252         { 0, 64,
3253           "\xC0\x75\x60\xB3\xE7\x76\xB4\x71\xC5\xE2\x93\x14\x26\xCA\xF1\xED"
3254           "\x3A\xE4\xB8\x67\x08\x76\x82\xCA\x9D\xFD\xC2\xBA\xE8\x93\x50\xBD"
3255           "\x84\x82\x1C\xAE\xFF\x85\xAA\xC4\x9D\x74\x35\xA7\xD9\x88\x93\x52"
3256           "\xF5\x27\x9E\x36\x12\x3F\x41\x72\x8A\x14\xEF\x26\x9F\xCB\x94\x4B"
3257         },
3258         { 65472, 64,
3259           "\xEE\xD1\xBB\x58\xF9\x0C\x89\xE0\x5C\xC6\x8B\x2D\xB6\x05\x58\x49"
3260           "\xB3\xD2\xB1\x87\xB7\xF0\x2F\x9A\x24\xCE\x34\x2A\xF0\xFC\x47\xA3"
3261           "\x74\xBD\x75\x90\xFB\xF4\xFD\x9E\xE5\x9B\x1A\x38\x1E\xBF\xD2\x29"
3262           "\xAD\x2A\x29\x01\xB3\xFB\x61\x08\x12\x90\x0B\x92\x30\xE6\x22\xE9"
3263         },
3264         { 65536, 64,
3265           "\x70\xF0\x49\x3A\x1B\x62\x53\xCC\x5E\xD3\x45\x0A\x31\xCF\x37\x7D"
3266           "\x83\x4B\xAD\x20\x72\x30\x29\x27\xCC\xD8\x30\x10\x4B\xD3\x05\xFF"
3267           "\x59\xD2\x94\x17\xB2\x32\x88\x4E\xC9\x59\x19\x4D\x60\x47\xC3\xDD"
3268           "\x66\x56\xC4\x7E\x32\x00\x64\xEB\x01\x44\xF7\x34\x1B\xC3\xD6\x97"
3269         },
3270         { 131008, 64,
3271           "\xD2\xCC\xF7\xC1\xAF\x2A\xB4\x66\xE6\x27\xDB\x44\x08\x40\x96\x9A"
3272           "\xBD\xAB\x68\xD8\x86\xAE\x6A\x38\xA1\x3F\xEE\x17\x50\xCA\x97\xB5"
3273           "\xD3\x31\x5B\x84\x08\x47\x28\x86\x2F\xBC\xC7\xD4\xA9\x7C\x75\xC8"
3274           "\x65\x5F\xF9\xD6\xBB\xC2\x61\x88\x63\x6F\x3E\xDF\xE1\x5C\x7D\x30"
3275         }
3276       }
3277     },
3278     {
3279       "Salsa20/12 256 bit, ecrypt verified, set 6, vector 2",
3280       GCRY_CIPHER_SALSA20R12, 32, 8,
3281       "\x0A\x5D\xB0\x03\x56\xA9\xFC\x4F\xA2\xF5\x48\x9B\xEE\x41\x94\xE7"
3282       "\x3A\x8D\xE0\x33\x86\xD9\x2C\x7F\xD2\x25\x78\xCB\x1E\x71\xC4\x17",
3283       "\x1F\x86\xED\x54\xBB\x22\x89\xF0",
3284       {
3285         { 0, 64,
3286           "\x51\x22\x52\x91\x01\x90\xD1\x54\xD1\x4D\x0B\x92\x32\xB8\x84\x31"
3287           "\x8C\xCB\x43\x81\x9B\xD5\x42\x19\x32\xC0\x3A\x13\xF0\x7B\x40\x10"
3288           "\x83\xD7\x89\x72\x5A\xA9\xDA\x0B\x41\xCB\x62\x24\x94\x5E\xDC\xB0"
3289           "\xFB\x6F\xD7\xC2\x34\x22\x35\xC9\x70\xF6\x4E\x10\x1C\x25\x68\x64"
3290         },
3291         { 65472, 64,
3292           "\x97\x96\x74\x55\x84\x0A\x4A\xE5\xC1\xCA\xCE\x49\x15\x19\x13\x8A"
3293           "\xA3\x5E\x5F\x02\x40\x7D\x4A\x1F\xE5\x08\x6D\x35\xF3\x55\x1E\xF4"
3294           "\x77\xD9\x28\x9D\x17\x23\x79\x7C\x1A\x49\xEC\x26\x62\x9A\xFA\xDC"
3295           "\x56\xA0\x38\xA3\x8C\x75\x88\x1B\x62\x17\xFD\x74\x67\x25\x59\x09"
3296         },
3297         { 65536, 64,
3298           "\x1B\xF8\x2E\x3D\x5C\x54\xDA\xAB\xCF\x84\x15\xF8\xA2\xA1\xA2\x2E"
3299           "\x86\x88\x06\x33\x4F\xF3\x11\x36\x04\x74\x1C\x1D\xF2\xB9\x84\x0F"
3300           "\x87\xDE\xEF\xB0\x07\x23\xA8\xA1\xB2\x4A\x4D\xA1\x7E\xCD\xAD\x00"
3301           "\x01\xF9\x79\xDD\xAE\x2D\xF0\xC5\xE1\xE5\x32\xC4\x8F\x8E\x0D\x34"
3302         },
3303         { 131008, 64,
3304           "\x06\xD8\x4F\x6A\x71\x34\x84\x20\x32\x9F\xCD\x0C\x41\x75\x9A\xD1"
3305           "\x8F\x99\x57\xA3\x8F\x22\x89\x3B\xA5\x58\xC5\x05\x11\x97\x28\x5C"
3306           "\x6B\xE2\xFD\x6C\x96\xA5\xC6\x62\xAF\xD3\x11\x78\xE7\x0F\x96\x0A"
3307           "\xAB\x3F\x47\x96\x23\xA4\x44\xB6\x81\x91\xE4\xC5\x28\x46\x93\x88"
3308         }
3309       }
3310     },
3311     {
3312       "Salsa20/12 256 bit, ecrypt verified, set 6, vector 3",
3313       GCRY_CIPHER_SALSA20R12, 32, 8,
3314       "\x0F\x62\xB5\x08\x5B\xAE\x01\x54\xA7\xFA\x4D\xA0\xF3\x46\x99\xEC"
3315       "\x3F\x92\xE5\x38\x8B\xDE\x31\x84\xD7\x2A\x7D\xD0\x23\x76\xC9\x1C",
3316       "\x28\x8F\xF6\x5D\xC4\x2B\x92\xF9",
3317       {
3318         { 0, 64,
3319           "\x99\xDB\x33\xAD\x11\xCE\x0C\xCB\x3B\xFD\xBF\x8D\x0C\x18\x16\x04"
3320           "\x52\xD0\x14\xCD\xE9\x89\xB4\xC4\x11\xA5\x59\xFF\x7C\x20\xA1\x69"
3321           "\xE6\xDC\x99\x09\xD8\x16\xBE\xCE\xDC\x40\x63\xCE\x07\xCE\xA8\x28"
3322           "\xF4\x4B\xF9\xB6\xC9\xA0\xA0\xB2\x00\xE1\xB5\x2A\xF4\x18\x59\xC5"
3323         },
3324         { 65472, 64,
3325           "\x2F\xF2\x02\x64\xEE\xAF\x47\xAB\x7D\x57\xC3\x62\x24\x53\x54\x51"
3326           "\x73\x5A\xC8\x36\xD3\x2D\xD2\x8A\xE6\x36\x45\xCE\x95\x2F\x7F\xDB"
3327           "\xE6\x68\x9C\x69\x59\x77\xB1\xC7\x6E\x60\xDD\x5B\x27\xAC\xA4\x76"
3328           "\xD2\x62\x0F\xDC\x93\x13\xE8\x48\x9B\xA5\x6A\x70\xC9\xF4\xC3\xA8"
3329         },
3330         { 65536, 64,
3331           "\xEB\x30\xCD\xA7\x27\xC0\xF8\xB7\xE4\x5D\x5E\xF3\x0D\xB7\xCB\xE0"
3332           "\x21\xF2\x29\x1E\x5F\x56\x93\x8D\x56\xF6\x87\xB7\x37\xC3\xB4\x27"
3333           "\x54\x5C\x56\xA6\xD3\xA0\xBF\x2B\x2F\x47\xB4\x84\x93\xFA\xE4\x5E"
3334           "\xD5\x0C\x2E\x9B\xBE\x49\xFD\x92\xD6\x7C\x76\x49\x05\x5F\x06\xFD"
3335         },
3336         { 131008, 64,
3337           "\x0E\xBF\x6C\xC3\xCB\xCB\xE7\x4E\x6E\xE8\x07\x47\x1B\x49\x2A\x67"
3338           "\x39\xA5\x2F\x57\x11\x31\xA2\x50\xBC\xDF\xA0\x76\xA2\x65\x90\xD7"
3339           "\xED\xE6\x75\x1C\x03\x26\xA0\x2C\xB1\x1C\x58\x77\x35\x52\x80\x4F"
3340           "\xD8\x68\x67\x15\x35\x5C\x5A\x5C\xC5\x91\x96\x3A\x75\xE9\x94\xB4"
3341         }
3342       }
3343     }
3344 #endif /*USE_SALSA20*/
3345   };
3346
3347
3348   char zeroes[512];
3349   gcry_cipher_hd_t hde;
3350   unsigned char *buffer;
3351   unsigned char *p;
3352   size_t buffersize;
3353   unsigned int n;
3354   int i, j;
3355   gcry_error_t err = 0;
3356
3357   if (verbose)
3358     fprintf (stderr, "  Starting large block stream cipher checks.\n");
3359
3360   memset (zeroes, 0, 512);
3361
3362   buffersize = 128 * 1024;
3363   buffer = gcry_xmalloc (buffersize+1024);
3364   memset (buffer+buffersize, 0x5a, 1024);
3365
3366   for (i = 0; i < sizeof (tv) / sizeof (tv[0]); i++)
3367     {
3368       if (verbose)
3369         fprintf (stderr, "    checking large block stream for %s [%i] (%s)\n",
3370                  gcry_cipher_algo_name (tv[i].algo), tv[i].algo, tv[i].name);
3371
3372       err = gcry_cipher_open (&hde, tv[i].algo, GCRY_CIPHER_MODE_STREAM, 0);
3373       if (err)
3374         {
3375           fail ("large stream, gcry_cipher_open for stream mode failed: %s\n",
3376                 gpg_strerror (err));
3377           continue;
3378         }
3379
3380       err = gcry_cipher_setkey (hde, tv[i].key, tv[i].keylen);
3381       if (err)
3382         {
3383           fail ("large stream, gcry_cipher_setkey failed: %s\n",
3384                 gpg_strerror (err));
3385           goto next;
3386         }
3387
3388       err = gcry_cipher_setiv (hde, tv[i].iv, tv[i].ivlen);
3389       if (err)
3390         {
3391           fail ("large stream, gcry_cipher_setiv failed: %s\n",
3392                 gpg_strerror (err));
3393           goto next;
3394         }
3395
3396       for (j=0, p=buffer; j < buffersize/512; j++, p += 512)
3397         {
3398           err = gcry_cipher_encrypt (hde, p, 512, zeroes, 512);
3399           if (err)
3400             {
3401               fail ("large stream, "
3402                     "gcry_cipher_encrypt (%d) block %d failed: %s\n",
3403                     i, j, gpg_strerror (err));
3404               goto next;
3405             }
3406         }
3407       for (j=0, p=buffer+buffersize; j < 1024; j++, p++)
3408         if (*p != 0x5a)
3409           die ("large stream, buffer corrupted at j=%d\n", j);
3410
3411       /* Now loop over all the data samples.  */
3412       for (j = 0; tv[i].data[j].length; j++)
3413         {
3414           assert (tv[i].data[j].offset + tv[i].data[j].length <= buffersize);
3415
3416           if (memcmp (tv[i].data[j].result,
3417                       buffer + tv[i].data[j].offset, tv[i].data[j].length))
3418             {
3419               fail ("large stream, encrypt mismatch entry %d:%d\n", i, j);
3420               mismatch (tv[i].data[j].result, tv[i].data[j].length,
3421                         buffer + tv[i].data[j].offset, tv[i].data[j].length);
3422             }
3423         }
3424
3425       /*
3426        *  Let's do the same thing again but using changing block sizes.
3427        */
3428       err = gcry_cipher_setkey (hde, tv[i].key, tv[i].keylen);
3429       if (err)
3430         {
3431           fail ("large stream, gcry_cipher_setkey failed: %s\n",
3432                 gpg_strerror (err));
3433           goto next;
3434         }
3435
3436       err = gcry_cipher_setiv (hde, tv[i].iv, tv[i].ivlen);
3437       if (err)
3438         {
3439           fail ("large stream, gcry_cipher_setiv failed: %s\n",
3440                 gpg_strerror (err));
3441           goto next;
3442         }
3443
3444       for (n=0, p=buffer, j = 0; n < buffersize; n += j, p += j)
3445         {
3446           switch (j)
3447             {
3448             case   0: j =   1;  break;
3449             case   1: j =  64; break;
3450             case  64: j=  384; break;
3451             case 384: j =  63; break;
3452             case  63: j = 512; break;
3453             case 512: j =  32; break;
3454             case  32: j = 503; break;
3455             default:  j = 509; break;
3456             }
3457           if ( n + j >= buffersize )
3458             j = buffersize - n;
3459           assert (j <= 512);
3460           err = gcry_cipher_encrypt (hde, p, j, zeroes, j);
3461           if (err)
3462             {
3463               fail ("large stream, "
3464                     "gcry_cipher_encrypt (%d) offset %u failed: %s\n",
3465                     i, n, gpg_strerror (err));
3466               goto next;
3467             }
3468         }
3469       for (j=0, p=buffer+buffersize; j < 1024; j++, p++)
3470         if (*p != 0x5a)
3471           die ("large stream, buffer corrupted at j=%d (line %d)\n",
3472                j, __LINE__);
3473
3474       /* Now loop over all the data samples.  */
3475       for (j = 0; tv[i].data[j].length; j++)
3476         {
3477           assert (tv[i].data[j].offset + tv[i].data[j].length <= buffersize);
3478
3479           if (memcmp (tv[i].data[j].result,
3480                       buffer + tv[i].data[j].offset, tv[i].data[j].length))
3481             {
3482               fail ("large stream var, encrypt mismatch entry %d:%d\n", i, j);
3483               mismatch (tv[i].data[j].result, tv[i].data[j].length,
3484                         buffer + tv[i].data[j].offset, tv[i].data[j].length);
3485             }
3486         }
3487
3488     next:
3489       gcry_cipher_close (hde);
3490     }
3491
3492   gcry_free (buffer);
3493   if (verbose)
3494     fprintf (stderr, "  Completed large block stream cipher checks.\n");
3495 }
3496
3497
3498
3499 /* Check that our bulk encryption fucntions work properly.  */
3500 static void
3501 check_bulk_cipher_modes (void)
3502 {
3503   static const struct
3504   {
3505     int algo;
3506     int mode;
3507     const char *key;
3508     int  keylen;
3509     const char *iv;
3510     int ivlen;
3511     char t1_hash[20];
3512   } tv[] = {
3513     { GCRY_CIPHER_AES, GCRY_CIPHER_MODE_CFB,
3514       "abcdefghijklmnop", 16,
3515       "1234567890123456", 16,
3516 /*[0]*/
3517       { 0x53, 0xda, 0x27, 0x3c, 0x78, 0x3d, 0x54, 0x66, 0x19, 0x63,
3518         0xd7, 0xe6, 0x20, 0x10, 0xcd, 0xc0, 0x5a, 0x0b, 0x06, 0xcc }
3519     },
3520     { GCRY_CIPHER_AES192, GCRY_CIPHER_MODE_CFB,
3521       "abcdefghijklmnopABCDEFG", 24,
3522       "1234567890123456", 16,
3523 /*[1]*/
3524       { 0xc7, 0xb1, 0xd0, 0x09, 0x95, 0x04, 0x34, 0x61, 0x2b, 0xd9,
3525         0xcb, 0xb3, 0xc7, 0xcb, 0xef, 0xea, 0x16, 0x19, 0x9b, 0x3e }
3526     },
3527     { GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_CFB,
3528       "abcdefghijklmnopABCDEFGHIJKLMNOP", 32,
3529       "1234567890123456", 16,
3530 /*[2]*/
3531       { 0x31, 0xe1, 0x1f, 0x63, 0x65, 0x47, 0x8c, 0x3f, 0x53, 0xdb,
3532         0xd9, 0x4d, 0x91, 0x1d, 0x02, 0x9c, 0x05, 0x25, 0x58, 0x29 }
3533     },
3534     { GCRY_CIPHER_AES, GCRY_CIPHER_MODE_CBC,
3535       "abcdefghijklmnop", 16,
3536       "1234567890123456", 16,
3537 /*[3]*/
3538       { 0xdc, 0x0c, 0xc2, 0xd9, 0x6b, 0x47, 0xf9, 0xeb, 0x06, 0xb4,
3539         0x2f, 0x6e, 0xec, 0x72, 0xbf, 0x55, 0x26, 0x7f, 0xa9, 0x97 }
3540     },
3541     { GCRY_CIPHER_AES192, GCRY_CIPHER_MODE_CBC,
3542       "abcdefghijklmnopABCDEFG", 24,
3543       "1234567890123456", 16,
3544 /*[4]*/
3545       { 0x2b, 0x90, 0x9b, 0xe6, 0x40, 0xab, 0x6e, 0xc2, 0xc5, 0xb1,
3546         0x87, 0xf5, 0x43, 0x84, 0x7b, 0x04, 0x06, 0x47, 0xd1, 0x8f }
3547     },
3548     { GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_CBC,
3549       "abcdefghijklmnopABCDEFGHIJKLMNOP", 32,
3550       "1234567890123456", 16,
3551 /*[5]*/
3552       { 0xaa, 0xa8, 0xdf, 0x03, 0xb0, 0xba, 0xc4, 0xe3, 0xc1, 0x02,
3553         0x38, 0x31, 0x8d, 0x86, 0xcb, 0x49, 0x6d, 0xad, 0xae, 0x01 }
3554     },
3555     { GCRY_CIPHER_AES, GCRY_CIPHER_MODE_OFB,
3556       "abcdefghijklmnop", 16,
3557       "1234567890123456", 16,
3558 /*[6]*/
3559       { 0x65, 0xfe, 0xde, 0x48, 0xd0, 0xa1, 0xa6, 0xf9, 0x24, 0x6b,
3560         0x52, 0x5f, 0x21, 0x8a, 0x6f, 0xc7, 0x70, 0x3b, 0xd8, 0x4a }
3561     },
3562     { GCRY_CIPHER_AES192, GCRY_CIPHER_MODE_OFB,
3563       "abcdefghijklmnopABCDEFG", 24,
3564       "1234567890123456", 16,
3565 /*[7]*/
3566       { 0x59, 0x5b, 0x02, 0xa2, 0x88, 0xc0, 0xbe, 0x94, 0x43, 0xaa,
3567         0x39, 0xf6, 0xbd, 0xcc, 0x83, 0x99, 0xee, 0x00, 0xa1, 0x91 }
3568     },
3569     { GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_OFB,
3570       "abcdefghijklmnopABCDEFGHIJKLMNOP", 32,
3571       "1234567890123456", 16,
3572 /*[8]*/
3573       { 0x38, 0x8c, 0xe1, 0xe2, 0xbe, 0x67, 0x60, 0xe8, 0xeb, 0xce,
3574         0xd0, 0xc6, 0xaa, 0xd6, 0xf6, 0x26, 0x15, 0x56, 0xd0, 0x2b }
3575     },
3576     { GCRY_CIPHER_AES, GCRY_CIPHER_MODE_CTR,
3577       "abcdefghijklmnop", 16,
3578       "1234567890123456", 16,
3579 /*[9]*/
3580       { 0x9a, 0x48, 0x94, 0xd6, 0x50, 0x46, 0x81, 0xdb, 0x68, 0x34,
3581         0x3b, 0xc5, 0x9e, 0x66, 0x94, 0x81, 0x98, 0xa0, 0xf9, 0xff }
3582     },
3583     { GCRY_CIPHER_AES192, GCRY_CIPHER_MODE_CTR,
3584       "abcdefghijklmnopABCDEFG", 24,
3585       "1234567890123456", 16,
3586 /*[10]*/
3587       { 0x2c, 0x2c, 0xd3, 0x75, 0x81, 0x2a, 0x59, 0x07, 0xeb, 0x08,
3588         0xce, 0x28, 0x4c, 0x0c, 0x6a, 0xa8, 0x8f, 0xa3, 0x98, 0x7e }
3589     },
3590     { GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_CTR,
3591       "abcdefghijklmnopABCDEFGHIJKLMNOP", 32,
3592       "1234567890123456", 16,
3593 /*[11]*/
3594       { 0x64, 0xce, 0x73, 0x03, 0xc7, 0x89, 0x99, 0x1f, 0xf1, 0xce,
3595         0xfe, 0xfb, 0xb9, 0x42, 0x30, 0xdf, 0xbb, 0x68, 0x6f, 0xd3 }
3596     },
3597     { GCRY_CIPHER_AES, GCRY_CIPHER_MODE_ECB,
3598       "abcdefghijklmnop", 16,
3599       "1234567890123456", 16,
3600 /*[12]*/
3601       { 0x51, 0xae, 0xf5, 0xac, 0x22, 0xa0, 0xba, 0x11, 0xc5, 0xaa,
3602         0xb4, 0x70, 0x99, 0xce, 0x18, 0x08, 0x12, 0x9b, 0xb1, 0xc5 }
3603     },
3604     { GCRY_CIPHER_AES192, GCRY_CIPHER_MODE_ECB,
3605       "abcdefghijklmnopABCDEFG", 24,
3606       "1234567890123456", 16,
3607 /*[13]*/
3608       { 0x57, 0x91, 0xea, 0x48, 0xd8, 0xbf, 0x9e, 0xc1, 0xae, 0x33,
3609         0xb3, 0xfd, 0xf7, 0x7a, 0xeb, 0x30, 0xb1, 0x62, 0x0d, 0x82 }
3610     },
3611     { GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_ECB,
3612       "abcdefghijklmnopABCDEFGHIJKLMNOP", 32,
3613       "1234567890123456", 16,
3614 /*[14]*/
3615       { 0x2d, 0x71, 0x54, 0xb9, 0xc5, 0x28, 0x76, 0xff, 0x76, 0xb5,
3616         0x99, 0x37, 0x99, 0x9d, 0xf7, 0x10, 0x6d, 0x86, 0x4f, 0x3f }
3617     }
3618   };
3619   gcry_cipher_hd_t hde = NULL;
3620   gcry_cipher_hd_t hdd = NULL;
3621   unsigned char *buffer_base, *outbuf_base; /* Allocated buffers.  */
3622   unsigned char *buffer, *outbuf;           /* Aligned buffers.  */
3623   size_t buflen;
3624   unsigned char hash[20];
3625   int i, j, keylen, blklen;
3626   gcry_error_t err = 0;
3627
3628   if (verbose)
3629     fprintf (stderr, "Starting bulk cipher checks.\n");
3630
3631   buflen = 16*100;  /* We check a 1600 byte buffer.  */
3632   buffer_base = gcry_xmalloc (buflen+16);
3633   buffer = buffer_base + (16 - ((size_t)buffer_base & 0x0f));
3634   outbuf_base = gcry_xmalloc (buflen+16);
3635   outbuf = outbuf_base + (16 - ((size_t)outbuf_base & 0x0f));
3636
3637
3638   for (i = 0; i < DIM (tv); i++)
3639     {
3640       if (verbose)
3641         fprintf (stderr, "    checking bulk encryption for %s [%i], mode %d\n",
3642                  gcry_cipher_algo_name (tv[i].algo),
3643                  tv[i].algo, tv[i].mode);
3644       err = gcry_cipher_open (&hde, tv[i].algo, tv[i].mode, 0);
3645       if (!err)
3646         err = gcry_cipher_open (&hdd, tv[i].algo, tv[i].mode, 0);
3647       if (err)
3648         {
3649           fail ("gcry_cipher_open failed: %s\n", gpg_strerror (err));
3650           goto leave;
3651         }
3652
3653       keylen = gcry_cipher_get_algo_keylen(tv[i].algo);
3654       if (!keylen)
3655         {
3656           fail ("gcry_cipher_get_algo_keylen failed\n");
3657           goto leave;
3658         }
3659
3660       err = gcry_cipher_setkey (hde, tv[i].key, tv[i].keylen);
3661       if (!err)
3662         err = gcry_cipher_setkey (hdd, tv[i].key, tv[i].keylen);
3663       if (err)
3664         {
3665           fail ("gcry_cipher_setkey failed: %s\n", gpg_strerror (err));
3666           goto leave;
3667         }
3668
3669       blklen = gcry_cipher_get_algo_blklen(tv[i].algo);
3670       if (!blklen)
3671         {
3672           fail ("gcry_cipher_get_algo_blklen failed\n");
3673           goto leave;
3674         }
3675
3676       err = gcry_cipher_setiv (hde, tv[i].iv, tv[i].ivlen);
3677       if (!err)
3678         err = gcry_cipher_setiv (hdd, tv[i].iv,  tv[i].ivlen);
3679       if (err)
3680         {
3681           fail ("gcry_cipher_setiv failed: %s\n", gpg_strerror (err));
3682           goto leave;
3683         }
3684
3685       /* Fill the buffer with our test pattern.  */
3686       for (j=0; j < buflen; j++)
3687         buffer[j] = ((j & 0xff) ^ ((j >> 8) & 0xff));
3688
3689       err = gcry_cipher_encrypt (hde, outbuf, buflen, buffer, buflen);
3690       if (err)
3691         {
3692           fail ("gcry_cipher_encrypt (algo %d, mode %d) failed: %s\n",
3693                 tv[i].algo, tv[i].mode, gpg_strerror (err));
3694           goto leave;
3695         }
3696
3697       gcry_md_hash_buffer (GCRY_MD_SHA1, hash, outbuf, buflen);
3698 #if 0
3699       printf ("/*[%d]*/\n", i);
3700       fputs ("      {", stdout);
3701       for (j=0; j < 20; j++)
3702         printf (" 0x%02x%c%s", hash[j], j==19? ' ':',', j == 9? "\n       ":"");
3703       puts ("}");
3704 #endif
3705
3706       if (memcmp (hash, tv[i].t1_hash, 20))
3707         fail ("encrypt mismatch (algo %d, mode %d)\n",
3708               tv[i].algo, tv[i].mode);
3709
3710       err = gcry_cipher_decrypt (hdd, outbuf, buflen, NULL, 0);
3711       if (err)
3712         {
3713           fail ("gcry_cipher_decrypt (algo %d, mode %d) failed: %s\n",
3714                 tv[i].algo, tv[i].mode, gpg_strerror (err));
3715           goto leave;
3716         }
3717
3718       if (memcmp (buffer, outbuf, buflen))
3719         fail ("decrypt mismatch (algo %d, mode %d)\n",
3720               tv[i].algo, tv[i].mode);
3721
3722       gcry_cipher_close (hde); hde = NULL;
3723       gcry_cipher_close (hdd); hdd = NULL;
3724     }
3725
3726   if (verbose)
3727     fprintf (stderr, "Completed bulk cipher checks.\n");
3728  leave:
3729   gcry_cipher_close (hde);
3730   gcry_cipher_close (hdd);
3731   gcry_free (buffer_base);
3732   gcry_free (outbuf_base);
3733 }
3734
3735
3736 /* The core of the cipher check.  In addition to the parameters passed
3737    to check_one_cipher it also receives the KEY and the plain data.
3738    PASS is printed with error messages.  The function returns 0 on
3739    success.  */
3740 static int
3741 check_one_cipher_core (int algo, int mode, int flags,
3742                        const char *key, size_t nkey,
3743                        const unsigned char *plain, size_t nplain,
3744                        int bufshift, int pass)
3745 {
3746   gcry_cipher_hd_t hd;
3747   unsigned char in_buffer[1040+1], out_buffer[1040+1];
3748   unsigned char *in, *out;
3749   int keylen;
3750   gcry_error_t err = 0;
3751
3752   assert (nkey == 32);
3753   assert (nplain == 1040);
3754   assert (sizeof(in_buffer) == nplain + 1);
3755   assert (sizeof(out_buffer) == sizeof(in_buffer));
3756
3757   if (!bufshift)
3758     {
3759       in = in_buffer;
3760       out = out_buffer;
3761     }
3762   else if (bufshift == 1)
3763     {
3764       in = in_buffer+1;
3765       out = out_buffer;
3766     }
3767   else if (bufshift == 2)
3768     {
3769       in = in_buffer+1;
3770       out = out_buffer+1;
3771     }
3772   else
3773     {
3774       in = in_buffer;
3775       out = out_buffer+1;
3776     }
3777
3778   keylen = gcry_cipher_get_algo_keylen (algo);
3779   if (!keylen)
3780     {
3781       fail ("pass %d, algo %d, mode %d, gcry_cipher_get_algo_keylen failed\n",
3782             pass, algo, mode);
3783       return -1;
3784     }
3785
3786   if (keylen < 40 / 8 || keylen > 32)
3787     {
3788       fail ("pass %d, algo %d, mode %d, keylength problem (%d)\n", pass, algo, mode, keylen);
3789       return -1;
3790     }
3791
3792   err = gcry_cipher_open (&hd, algo, mode, flags);
3793   if (err)
3794     {
3795       fail ("pass %d, algo %d, mode %d, gcry_cipher_open failed: %s\n",
3796             pass, algo, mode, gpg_strerror (err));
3797       return -1;
3798     }
3799
3800   err = gcry_cipher_setkey (hd, key, keylen);
3801   if (err)
3802     {
3803       fail ("pass %d, algo %d, mode %d, gcry_cipher_setkey failed: %s\n",
3804             pass, algo, mode, gpg_strerror (err));
3805       gcry_cipher_close (hd);
3806       return -1;
3807     }
3808
3809   err = gcry_cipher_encrypt (hd, out, nplain, plain, nplain);
3810   if (err)
3811     {
3812       fail ("pass %d, algo %d, mode %d, gcry_cipher_encrypt failed: %s\n",
3813             pass, algo, mode, gpg_strerror (err));
3814       gcry_cipher_close (hd);
3815       return -1;
3816     }
3817
3818   gcry_cipher_reset (hd);
3819
3820   err = gcry_cipher_decrypt (hd, in, nplain, out, nplain);
3821   if (err)
3822     {
3823       fail ("pass %d, algo %d, mode %d, gcry_cipher_decrypt failed: %s\n",
3824             pass, algo, mode, gpg_strerror (err));
3825       gcry_cipher_close (hd);
3826       return -1;
3827     }
3828
3829   if (memcmp (plain, in, nplain))
3830     fail ("pass %d, algo %d, mode %d, encrypt-decrypt mismatch\n",
3831           pass, algo, mode);
3832
3833   /* Again, using in-place encryption.  */
3834   gcry_cipher_reset (hd);
3835
3836   memcpy (out, plain, nplain);
3837   err = gcry_cipher_encrypt (hd, out, nplain, NULL, 0);
3838   if (err)
3839     {
3840       fail ("pass %d, algo %d, mode %d, in-place, gcry_cipher_encrypt failed:"
3841             " %s\n",
3842             pass, algo, mode, gpg_strerror (err));
3843       gcry_cipher_close (hd);
3844       return -1;
3845     }
3846
3847   gcry_cipher_reset (hd);
3848
3849   err = gcry_cipher_decrypt (hd, out, nplain, NULL, 0);
3850   if (err)
3851     {
3852       fail ("pass %d, algo %d, mode %d, in-place, gcry_cipher_decrypt failed:"
3853             " %s\n",
3854             pass, algo, mode, gpg_strerror (err));
3855       gcry_cipher_close (hd);
3856       return -1;
3857     }
3858
3859   if (memcmp (plain, out, nplain))
3860     fail ("pass %d, algo %d, mode %d, in-place, encrypt-decrypt mismatch\n",
3861           pass, algo, mode);
3862
3863
3864   gcry_cipher_close (hd);
3865
3866   return 0;
3867 }
3868
3869
3870
3871 static void
3872 check_one_cipher (int algo, int mode, int flags)
3873 {
3874   char key[32+1];
3875   unsigned char plain[1040+1];
3876   int bufshift, i;
3877
3878   for (bufshift=0; bufshift < 4; bufshift++)
3879     {
3880       /* Pass 0: Standard test.  */
3881       memcpy (key, "0123456789abcdef.,;/[]{}-=ABCDEF", 32);
3882       memcpy (plain, "foobar42FOOBAR17", 16);
3883       for (i = 16; i < 1040; i += 16)
3884         {
3885           memcpy (&plain[i], &plain[i-16], 16);
3886           if (!++plain[i+7])
3887             plain[i+6]++;
3888           if (!++plain[i+15])
3889             plain[i+14]++;
3890         }
3891
3892       if (check_one_cipher_core (algo, mode, flags, key, 32, plain, 1040,
3893                                  bufshift, 0+10*bufshift))
3894         return;
3895
3896       /* Pass 1: Key not aligned.  */
3897       memmove (key+1, key, 32);
3898       if (check_one_cipher_core (algo, mode, flags, key+1, 32, plain, 1040,
3899                                  bufshift, 1+10*bufshift))
3900         return;
3901
3902       /* Pass 2: Key not aligned and data not aligned.  */
3903       memmove (plain+1, plain, 1040);
3904       if (check_one_cipher_core (algo, mode, flags, key+1, 32, plain+1, 1040,
3905                                  bufshift, 2+10*bufshift))
3906         return;
3907
3908       /* Pass 3: Key aligned and data not aligned.  */
3909       memmove (key, key+1, 32);
3910       if (check_one_cipher_core (algo, mode, flags, key, 32, plain+1, 1040,
3911                                  bufshift, 3+10*bufshift))
3912         return;
3913     }
3914
3915   return;
3916 }
3917
3918
3919
3920 static void
3921 check_ciphers (void)
3922 {
3923   static const int algos[] = {
3924 #if USE_BLOWFISH
3925     GCRY_CIPHER_BLOWFISH,
3926 #endif
3927 #if USE_DES
3928     GCRY_CIPHER_DES,
3929     GCRY_CIPHER_3DES,
3930 #endif
3931 #if USE_CAST5
3932     GCRY_CIPHER_CAST5,
3933 #endif