Do not precalculate OCB offset L0+L1+L0
[libgcrypt.git] / tests / keygrip.c
1 /* keygrip.c - verifies that keygrips are calculated as expected
2  *      Copyright (C) 2005 Free Software Foundation, Inc.
3  *
4  * This file is part of Libgcrypt.
5  *
6  * Libgcrypt is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU Lesser General Public License as
8  * published by the Free Software Foundation; either version 2.1 of
9  * the License, or (at your option) any later version.
10  *
11  * Libgcrypt is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
19  */
20
21 #ifdef HAVE_CONFIG_H
22 #include <config.h>
23 #endif
24
25 #include <stdio.h>
26 #include <stdlib.h>
27 #include <string.h>
28 #include <stdarg.h>
29 #include <assert.h>
30
31 #define PGM "keygrip"
32 #include "t-common.h"
33
34 static int repetitions;
35
36 \f
37
38 static void
39 print_hex (const char *text, const void *buf, size_t n)
40 {
41   const unsigned char *p = buf;
42
43   fputs (text, stdout);
44   for (; n; n--, p++)
45     printf ("%02X", *p);
46   putchar ('\n');
47 }
48
49
50 \f
51
52 static struct
53 {
54   int algo;
55   const char *key;
56   const unsigned char grip[20];
57 } key_grips[] =
58   {
59     {
60       GCRY_PK_RSA,
61       "(private-key"
62       " (rsa"
63       "  (n #00B6B509596A9ECABC939212F891E656A626BA07DA8521A9CAD4C08E640C04052FBB87F424EF1A0275A48A9299AC9DB69ABE3D0124E6C756B1F7DFB9B842D6251AEA6EE85390495CADA73D671537FCE5850A932F32BAB60AB1AC1F852C1F83C625E7A7D70CDA9EF16D5C8E47739D77DF59261ABE8454807FF441E143FBD37F8545#)"
64       "  (e #010001#)"
65       "  (d #077AD3DE284245F4806A1B82B79E616FBDE821C82D691A65665E57B5FAD3F34E67F401E7BD2E28699E89D9C496CF821945AE83AC7A1231176A196BA6027E77D85789055D50404A7A2A95B1512F91F190BBAEF730ED550D227D512F89C0CDB31AC06FA9A19503DDF6B66D0B42B9691BFD6140EC1720FFC48AE00C34796DC899E5#)"
66       "  (p #00D586C78E5F1B4BF2E7CD7A04CA091911706F19788B93E44EE20AAF462E8363E98A72253ED845CCBF2481BB351E8557C85BCFFF0DABDBFF8E26A79A0938096F27#)"
67       "  (q #00DB0CDF60F26F2A296C88D6BF9F8E5BE45C0DDD713C96CC73EBCB48B061740943F21D2A93D6E42A7211E7F02A95DCED6C390A67AD21ECF739AE8A0CA46FF2EBB3#)"
68       "  (u #33149195F16912DB20A48D020DBC3B9E3881B39D722BF79378F6340F43148A6E9FC5F53E2853B7387BA4443BA53A52FCA8173DE6E85B42F9783D4A7817D0680B#)))",
69       "\x32\xCF\xFA\x85\xB1\x79\x1F\xBB\x26\x14\xE9\x1A\xFD\xF3\xAF\xE3\x32\x08\x2E\x25"
70     },
71     {
72       GCRY_PK_DSA,
73       " (public-key"
74       " (dsa"
75       "  (p #0084E4C626E16005770BD9509ABF7354492E85B8C0060EFAAAEC617F725B592FAA59DF5460575F41022776A9718CE62EDD542AB73C7720869EBDBC834D174ADCD7136827DF51E2613545A25CA573BC502A61B809000B6E35F5EB7FD6F18C35678C23EA1C3638FB9CFDBA2800EE1B62F41A4479DE824F2834666FBF8DC5B53C2617#)"
76       "  (q #00B0E6F710051002A9F425D98A677B18E0E5B038AB#)"
77       "  (g #44370CEE0FE8609994183DBFEBA7EEA97D466838BCF65EFF506E35616DA93FA4E572A2F08886B74977BC00CA8CD3DBEA7AEB7DB8CBB180E6975E0D2CA76E023E6DE9F8CCD8826EBA2F72B8516532F6001DEFFAE76AA5E59E0FA33DBA3999B4E92D1703098CDEDCC416CF008801964084CDE1980132B2B78CB4CE9C15A559528B#)"
78       "  (y #3D5DD14AFA2BF24A791E285B90232213D0E3BA74AB1109E768AED19639A322F84BB7D959E2BA92EF73DE4C7F381AA9F4053CFA3CD4527EF9043E304E5B95ED0A3A5A9D590AA641C13DB2B6E32B9B964A6A2C730DD3EA7C8E13F7A140AFF1A91CE375E9B9B960384779DC4EA180FA1F827C52288F366C0770A220F50D6D8FD6F6#)))",
79       "\x04\xA3\x4F\xA0\x2B\x03\x94\xD7\x32\xAD\xD5\x9B\x50\xAF\xDB\x5D\x57\x22\xA6\x10"
80
81     },
82     {
83       GCRY_PK_DSA,
84       "(private-key"
85       " (dsa"
86       "  (p #0084E4C626E16005770BD9509ABF7354492E85B8C0060EFAAAEC617F725B592FAA59DF5460575F41022776A9718CE62EDD542AB73C7720869EBDBC834D174ADCD7136827DF51E2613545A25CA573BC502A61B809000B6E35F5EB7FD6F18C35678C23EA1C3638FB9CFDBA2800EE1B62F41A4479DE824F2834666FBF8DC5B53C2617#)"
87       "  (q #00B0E6F710051002A9F425D98A677B18E0E5B038AB#)"
88       "  (g #44370CEE0FE8609994183DBFEBA7EEA97D466838BCF65EFF506E35616DA93FA4E572A2F08886B74977BC00CA8CD3DBEA7AEB7DB8CBB180E6975E0D2CA76E023E6DE9F8CCD8826EBA2F72B8516532F6001DEFFAE76AA5E59E0FA33DBA3999B4E92D1703098CDEDCC416CF008801964084CDE1980132B2B78CB4CE9C15A559528B#)"
89       "  (y #3D5DD14AFA2BF24A791E285B90232213D0E3BA74AB1109E768AED19639A322F84BB7D959E2BA92EF73DE4C7F381AA9F4053CFA3CD4527EF9043E304E5B95ED0A3A5A9D590AA641C13DB2B6E32B9B964A6A2C730DD3EA7C8E13F7A140AFF1A91CE375E9B9B960384779DC4EA180FA1F827C52288F366C0770A220F50D6D8FD6F6#)"
90       "  (x #0087F9E91BFBCC1163DE71ED86D557708E32F8ADDE#)))",
91       "\x04\xA3\x4F\xA0\x2B\x03\x94\xD7\x32\xAD\xD5\x9B\x50\xAF\xDB\x5D\x57\x22\xA6\x10"
92     },
93     {
94       GCRY_PK_ECDSA,
95       "(public-key"
96       " (ecdsa(flags param)"
97       " (p #00FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF#)"
98       " (a #00FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC#)"
99       " (b #5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B#)"
100       " (g #046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5#)"
101       " (n #00FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551#)"
102       " (h #000000000000000000000000000000000000000000000000000000000000000001#)"
103       " (q #04C8A4CEC2E9A9BC8E173531A67B0840DF345C32E261ADD780E6D83D56EFADFD5DE872F8B854819B59543CE0B7F822330464FBC4E6324DADDCD9D059554F63B344#)))",
104       "\xE6\xDF\x94\x2D\xBD\x8C\x77\x05\xA3\xDD\x41\x6E\xFC\x04\x01\xDB\x31\x0E\x99\xB6"
105     },
106     {
107       GCRY_PK_ECDSA,
108       "(public-key"
109       " (ecdsa(flags param)"
110       " (p #00FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF#)"
111       " (curve \"NIST P-256\")"
112       " (b #5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B#)"
113       " (g #046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5#)"
114       " (n #00FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551#)"
115       " (h #000000000000000000000000000000000000000000000000000000000000000001#)"
116       " (q #04C8A4CEC2E9A9BC8E173531A67B0840DF345C32E261ADD780E6D83D56EFADFD5DE872F8B854819B59543CE0B7F822330464FBC4E6324DADDCD9D059554F63B344#)))",
117       "\xE6\xDF\x94\x2D\xBD\x8C\x77\x05\xA3\xDD\x41\x6E\xFC\x04\x01\xDB\x31\x0E\x99\xB6"
118     },
119     {
120       GCRY_PK_ECDSA,
121       "(public-key"
122       " (ecdsa"
123       " (p #00FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF#)"
124       " (curve \"NIST P-256\")"
125       " (b #5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B#)"
126       " (g #046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5#)"
127       " (n #00FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551#)"
128       " (h #000000000000000000000000000000000000000000000000000000000000000001#)"
129       " (q #04C8A4CEC2E9A9BC8E173531A67B0840DF345C32E261ADD780E6D83D56EFADFD5DE872F8B854819B59543CE0B7F822330464FBC4E6324DADDCD9D059554F63B344#)))",
130       "\xE6\xDF\x94\x2D\xBD\x8C\x77\x05\xA3\xDD\x41\x6E\xFC\x04\x01\xDB\x31\x0E\x99\xB6"
131     },
132     {
133       GCRY_PK_ECDSA,
134       "(public-key"
135       " (ecdsa"
136       " (curve secp256r1)"
137       " (q #04C8A4CEC2E9A9BC8E173531A67B0840DF345C32E261ADD780E6D83D56EFADFD5DE872F8B854819B59543CE0B7F822330464FBC4E6324DADDCD9D059554F63B344#)))",
138       "\xE6\xDF\x94\x2D\xBD\x8C\x77\x05\xA3\xDD\x41\x6E\xFC\x04\x01\xDB\x31\x0E\x99\xB6"
139     },
140     {
141       GCRY_PK_ECC,
142       "(public-key"
143       " (ecc"
144       " (curve secp256r1)"
145       " (q #04C8A4CEC2E9A9BC8E173531A67B0840DF345C32E261ADD780E6D83D56EFADFD5DE872F8B854819B59543CE0B7F822330464FBC4E6324DADDCD9D059554F63B344#)))",
146       "\xE6\xDF\x94\x2D\xBD\x8C\x77\x05\xA3\xDD\x41\x6E\xFC\x04\x01\xDB\x31\x0E\x99\xB6"
147     },
148     { /* Ed25519 standard */
149       GCRY_PK_ECC,
150       "(public-key"
151       " (ecc"
152       " (curve Ed25519)"
153       " (q #04"
154       "     1CC662926E7EFF4982B7FB8B928E61CD74CCDD85277CC57196C3AD20B611085F"
155       "     47BD24842905C049257673B3F5249524E0A41FAA17B25B818D0F97E625F1A1D0#)"
156       "     ))",
157       "\x0C\xCA\xB2\xFD\x48\x9A\x33\x40\x2C\xE8"
158       "\xE0\x4A\x1F\xB2\x45\xEA\x80\x3D\x0A\xF1"
159     },
160     { /* Ed25519+EdDSA */
161       GCRY_PK_ECC,
162       "(public-key"
163       " (ecc"
164       " (curve Ed25519)(flags eddsa)"
165       " (q #773E72848C1FD5F9652B29E2E7AF79571A04990E96F2016BF4E0EC1890C2B7DB#)"
166       " ))",
167       "\x9D\xB6\xC6\x4A\x38\x83\x0F\x49\x60\x70"
168       "\x17\x89\x47\x55\x20\xBE\x8C\x82\x1F\x47"
169     },
170     { /* Ed25519+EdDSA (with compression prefix) */
171       GCRY_PK_ECC,
172       "(public-key"
173       " (ecc"
174       " (curve Ed25519)(flags eddsa)"
175       " (q #40"
176       "     773E72848C1FD5F9652B29E2E7AF79571A04990E96F2016BF4E0EC1890C2B7DB#)"
177       " ))",
178       "\x9D\xB6\xC6\x4A\x38\x83\x0F\x49\x60\x70"
179       "\x17\x89\x47\x55\x20\xBE\x8C\x82\x1F\x47"
180     },
181     { /* Ed25519+EdDSA  (same but uncompressed)*/
182       GCRY_PK_ECC,
183       "(public-key"
184       " (ecc"
185       " (curve Ed25519)(flags eddsa)"
186       " (q #04"
187       "     629ad237d1ed04dcd4abe1711dd699a1cf51b1584c4de7a4ef8b8a640180b26f"
188       "     5bb7c29018ece0f46b01f2960e99041a5779afe7e2292b65f9d51f8c84723e77#)"
189       " ))",
190       "\x9D\xB6\xC6\x4A\x38\x83\x0F\x49\x60\x70"
191       "\x17\x89\x47\x55\x20\xBE\x8C\x82\x1F\x47"
192     },
193     { /* Random key  */
194       GCRY_PK_RSA,
195       "(shadowed-private-key"
196       " (rsa"
197       " (n #00B493C79928398DA9D99AC0E949FE6EB62F683CB974FFFBFBC01066F5C9A89B"
198       "     D3DC48EAD7C65F36EA943C2B2C865C26C4884FF9EDFDA8C99C855B737D77EEF6"
199       "     B85DBC0CCEC0E900C1F89A6893A2A93E8B31028469B6927CEB2F08687E547C68"
200       "     6B0A2F7E50A194FF7AB7637E03DE0912EF7F6E5F1EC37625BD1620CCC2E7A564"
201       "     31E168CDAFBD1D9E61AE47A69A6FA03EF22F844528A710B2392F262B95A3078C"
202       "     F321DC8325F92A5691EF69F34FD0DE0B22C79D29DC87723FCADE463829E8E5F7"
203       "     D196D73D6C9C180F6A6A0DDBF7B9D8F7FA293C36163B12199EF6A1A95CAE4051"
204       "     E3069C522CC6C4A7110F663A5DAD20F66C13A1674D050088208FAE4F33B3AB51"
205       "     03#)"
206       " (e #00010001#)"
207       " (shadowed t1-v1"
208       " (#D2760001240102000005000123350000# OPENPGP.1)"
209       ")))",
210       "\xE5\x6E\xE6\xEE\x5A\x2F\xDC\x3E\x98\x9D"
211       "\xFE\x49\xDA\xF5\x67\x43\xE3\x27\x28\x33"
212     }
213   };
214
215
216 static void
217 check (void)
218 {
219   unsigned char buf[20];
220   unsigned char *ret;
221   gcry_error_t err;
222   gcry_sexp_t sexp;
223   unsigned int i;
224   int repn;
225
226   for (i = 0; i < (sizeof (key_grips) / sizeof (*key_grips)); i++)
227     {
228       if (gcry_pk_test_algo (key_grips[i].algo))
229         {
230           if (verbose)
231             fprintf (stderr, "algo %d not available; test skipped\n",
232                      key_grips[i].algo);
233           continue;
234         }
235       err = gcry_sexp_sscan (&sexp, NULL, key_grips[i].key,
236                              strlen (key_grips[i].key));
237       if (err)
238         die ("scanning data %d failed: %s\n", i, gpg_strerror (err));
239
240       if (debug)
241         info ("check(%d): s-exp='%s'\n", i, key_grips[i].key);
242
243       for (repn=0; repn < repetitions; repn++)
244         {
245           ret = gcry_pk_get_keygrip (sexp, buf);
246           if (!ret)
247             die ("gcry_pk_get_keygrip failed for %d\n", i);
248
249           if ( memcmp (key_grips[i].grip, buf, sizeof (buf)) )
250             {
251               print_hex ("keygrip: ", buf, sizeof buf);
252               die ("keygrip for %d does not match\n", i);
253             }
254           else if (debug && !repn)
255             print_hex ("keygrip: ", buf, sizeof buf);
256         }
257
258       gcry_sexp_release (sexp);
259     }
260 }
261
262 \f
263
264 static void
265 progress_handler (void *cb_data, const char *what, int printchar,
266                   int current, int total)
267 {
268   (void)cb_data;
269   (void)what;
270   (void)current;
271   (void)total;
272
273   putchar (printchar);
274 }
275
276 int
277 main (int argc, char **argv)
278 {
279   int last_argc = -1;
280
281   if (argc)
282     { argc--; argv++; }
283
284   while (argc && last_argc != argc )
285     {
286       last_argc = argc;
287       if (!strcmp (*argv, "--"))
288         {
289           argc--; argv++;
290           break;
291         }
292       else if (!strcmp (*argv, "--verbose"))
293         {
294           verbose = 1;
295           argc--; argv++;
296         }
297       else if (!strcmp (*argv, "--debug"))
298         {
299           verbose = 1;
300           debug = 1;
301           argc--; argv++;
302         }
303       else if (!strcmp (*argv, "--repetitions"))
304         {
305           argc--; argv++;
306           if (argc)
307             {
308               repetitions = atoi(*argv);
309               argc--; argv++;
310             }
311         }
312     }
313
314   if (repetitions < 1)
315     repetitions = 1;
316
317   if (!gcry_check_version (GCRYPT_VERSION))
318     die ("version mismatch\n");
319
320   gcry_set_progress_handler (progress_handler, NULL);
321
322   xgcry_control (GCRYCTL_DISABLE_SECMEM, 0);
323   xgcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0);
324   if (debug)
325     xgcry_control (GCRYCTL_SET_DEBUG_FLAGS, 1u, 0);
326
327   check ();
328
329   return 0;
330 }