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