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