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#include "../src/gcrypt.h" 32 33static int verbose; 34static int repetitions; 35 36 37 38static void 39die (const char *format, ...) 40{ 41 va_list arg_ptr; 42 43 va_start (arg_ptr, format); 44 vfprintf (stderr, format, arg_ptr); 45 va_end (arg_ptr); 46 exit (1); 47} 48 49static void 50print_hex (const char *text, const void *buf, size_t n) 51{ 52 const unsigned char *p = buf; 53 54 fputs (text, stdout); 55 for (; n; n--, p++) 56 printf ("%02X", *p); 57 putchar ('\n'); 58} 59 60 61 62 63static struct 64{ 65 int algo; 66 const char *key; 67 const unsigned char grip[20]; 68} key_grips[] = 69 { 70 { 71 GCRY_PK_RSA, 72 "(private-key" 73 " (rsa" 74 " (n #00B6B509596A9ECABC939212F891E656A626BA07DA8521A9CAD4C08E640C04052FBB87F424EF1A0275A48A9299AC9DB69ABE3D0124E6C756B1F7DFB9B842D6251AEA6EE85390495CADA73D671537FCE5850A932F32BAB60AB1AC1F852C1F83C625E7A7D70CDA9EF16D5C8E47739D77DF59261ABE8454807FF441E143FBD37F8545#)" 75 " (e #010001#)" 76 " (d #077AD3DE284245F4806A1B82B79E616FBDE821C82D691A65665E57B5FAD3F34E67F401E7BD2E28699E89D9C496CF821945AE83AC7A1231176A196BA6027E77D85789055D50404A7A2A95B1512F91F190BBAEF730ED550D227D512F89C0CDB31AC06FA9A19503DDF6B66D0B42B9691BFD6140EC1720FFC48AE00C34796DC899E5#)" 77 " (p #00D586C78E5F1B4BF2E7CD7A04CA091911706F19788B93E44EE20AAF462E8363E98A72253ED845CCBF2481BB351E8557C85BCFFF0DABDBFF8E26A79A0938096F27#)" 78 " (q #00DB0CDF60F26F2A296C88D6BF9F8E5BE45C0DDD713C96CC73EBCB48B061740943F21D2A93D6E42A7211E7F02A95DCED6C390A67AD21ECF739AE8A0CA46FF2EBB3#)" 79 " (u #33149195F16912DB20A48D020DBC3B9E3881B39D722BF79378F6340F43148A6E9FC5F53E2853B7387BA4443BA53A52FCA8173DE6E85B42F9783D4A7817D0680B#)))", 80 "\x32\xCF\xFA\x85\xB1\x79\x1F\xBB\x26\x14\xE9\x1A\xFD\xF3\xAF\xE3\x32\x08\x2E\x25" 81 }, 82 { 83 GCRY_PK_DSA, 84 " (public-key" 85 " (dsa" 86 " (p #0084E4C626E16005770BD9509ABF7354492E85B8C0060EFAAAEC617F725B592FAA59DF5460575F41022776A9718CE62EDD542AB73C7720869EBDBC834D174ADCD7136827DF51E2613545A25CA573BC502A61B809000B6E35F5EB7FD6F18C35678C23EA1C3638FB9CFDBA2800EE1B62F41A4479DE824F2834666FBF8DC5B53C2617#)" 87 " (q #00B0E6F710051002A9F425D98A677B18E0E5B038AB#)" 88 " (g #44370CEE0FE8609994183DBFEBA7EEA97D466838BCF65EFF506E35616DA93FA4E572A2F08886B74977BC00CA8CD3DBEA7AEB7DB8CBB180E6975E0D2CA76E023E6DE9F8CCD8826EBA2F72B8516532F6001DEFFAE76AA5E59E0FA33DBA3999B4E92D1703098CDEDCC416CF008801964084CDE1980132B2B78CB4CE9C15A559528B#)" 89 " (y #3D5DD14AFA2BF24A791E285B90232213D0E3BA74AB1109E768AED19639A322F84BB7D959E2BA92EF73DE4C7F381AA9F4053CFA3CD4527EF9043E304E5B95ED0A3A5A9D590AA641C13DB2B6E32B9B964A6A2C730DD3EA7C8E13F7A140AFF1A91CE375E9B9B960384779DC4EA180FA1F827C52288F366C0770A220F50D6D8FD6F6#)))", 90 "\x04\xA3\x4F\xA0\x2B\x03\x94\xD7\x32\xAD\xD5\x9B\x50\xAF\xDB\x5D\x57\x22\xA6\x10" 91 92 }, 93 { 94 GCRY_PK_DSA, 95 "(private-key" 96 " (dsa" 97 " (p #0084E4C626E16005770BD9509ABF7354492E85B8C0060EFAAAEC617F725B592FAA59DF5460575F41022776A9718CE62EDD542AB73C7720869EBDBC834D174ADCD7136827DF51E2613545A25CA573BC502A61B809000B6E35F5EB7FD6F18C35678C23EA1C3638FB9CFDBA2800EE1B62F41A4479DE824F2834666FBF8DC5B53C2617#)" 98 " (q #00B0E6F710051002A9F425D98A677B18E0E5B038AB#)" 99 " (g #44370CEE0FE8609994183DBFEBA7EEA97D466838BCF65EFF506E35616DA93FA4E572A2F08886B74977BC00CA8CD3DBEA7AEB7DB8CBB180E6975E0D2CA76E023E6DE9F8CCD8826EBA2F72B8516532F6001DEFFAE76AA5E59E0FA33DBA3999B4E92D1703098CDEDCC416CF008801964084CDE1980132B2B78CB4CE9C15A559528B#)" 100 " (y #3D5DD14AFA2BF24A791E285B90232213D0E3BA74AB1109E768AED19639A322F84BB7D959E2BA92EF73DE4C7F381AA9F4053CFA3CD4527EF9043E304E5B95ED0A3A5A9D590AA641C13DB2B6E32B9B964A6A2C730DD3EA7C8E13F7A140AFF1A91CE375E9B9B960384779DC4EA180FA1F827C52288F366C0770A220F50D6D8FD6F6#)" 101 " (x #0087F9E91BFBCC1163DE71ED86D557708E32F8ADDE#)))", 102 "\x04\xA3\x4F\xA0\x2B\x03\x94\xD7\x32\xAD\xD5\x9B\x50\xAF\xDB\x5D\x57\x22\xA6\x10" 103 }, 104 { 105 GCRY_PK_ECDSA, 106 "(public-key" 107 " (ecdsa" 108 " (p #00FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF#)" 109 " (a #00FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC#)" 110 " (b #5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B#)" 111 " (g #046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5#)" 112 " (n #00FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551#)" 113 " (q #04C8A4CEC2E9A9BC8E173531A67B0840DF345C32E261ADD780E6D83D56EFADFD5DE872F8B854819B59543CE0B7F822330464FBC4E6324DADDCD9D059554F63B344#)))", 114 "\xE6\xDF\x94\x2D\xBD\x8C\x77\x05\xA3\xDD\x41\x6E\xFC\x04\x01\xDB\x31\x0E\x99\xB6" 115 }, 116 { 117 GCRY_PK_ECDSA, 118 "(public-key" 119 " (ecdsa" 120 " (p #00FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF#)" 121 " (curve \"NIST P-256\")" 122 " (b #5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B#)" 123 " (g #046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5#)" 124 " (n #00FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551#)" 125 " (q #04C8A4CEC2E9A9BC8E173531A67B0840DF345C32E261ADD780E6D83D56EFADFD5DE872F8B854819B59543CE0B7F822330464FBC4E6324DADDCD9D059554F63B344#)))", 126 "\xE6\xDF\x94\x2D\xBD\x8C\x77\x05\xA3\xDD\x41\x6E\xFC\x04\x01\xDB\x31\x0E\x99\xB6" 127 }, 128 { 129 GCRY_PK_ECDSA, 130 "(public-key" 131 " (ecdsa" 132 " (curve secp256r1)" 133 " (q #04C8A4CEC2E9A9BC8E173531A67B0840DF345C32E261ADD780E6D83D56EFADFD5DE872F8B854819B59543CE0B7F822330464FBC4E6324DADDCD9D059554F63B344#)))", 134 "\xE6\xDF\x94\x2D\xBD\x8C\x77\x05\xA3\xDD\x41\x6E\xFC\x04\x01\xDB\x31\x0E\x99\xB6" 135 } 136 137 }; 138 139static void 140check (void) 141{ 142 unsigned char buf[20]; 143 unsigned char *ret; 144 gcry_error_t err; 145 gcry_sexp_t sexp; 146 unsigned int i; 147 int repn; 148 149 for (i = 0; i < (sizeof (key_grips) / sizeof (*key_grips)); i++) 150 { 151 if (gcry_pk_test_algo (key_grips[i].algo)) 152 { 153 if (verbose) 154 fprintf (stderr, "algo %d not available; test skipped\n", 155 key_grips[i].algo); 156 continue; 157 } 158 err = gcry_sexp_sscan (&sexp, NULL, key_grips[i].key, 159 strlen (key_grips[i].key)); 160 if (err) 161 die ("scanning data %d failed: %s\n", i, gpg_strerror (err)); 162 163 for (repn=0; repn < repetitions; repn++) 164 { 165 ret = gcry_pk_get_keygrip (sexp, buf); 166 if (!ret) 167 die ("gcry_pk_get_keygrip failed for %d\n", i); 168 169 if ( memcmp (key_grips[i].grip, buf, sizeof (buf)) ) 170 { 171 print_hex ("keygrip: ", buf, sizeof buf); 172 die ("keygrip for %d does not match\n", i); 173 } 174 } 175 176 gcry_sexp_release (sexp); 177 } 178} 179 180 181 182static void 183progress_handler (void *cb_data, const char *what, int printchar, 184 int current, int total) 185{ 186 (void)cb_data; 187 (void)what; 188 (void)current; 189 (void)total; 190 191 putchar (printchar); 192} 193 194int 195main (int argc, char **argv) 196{ 197 int last_argc = -1; 198 int debug = 0; 199 200 if (argc) 201 { argc--; argv++; } 202 203 while (argc && last_argc != argc ) 204 { 205 last_argc = argc; 206 if (!strcmp (*argv, "--")) 207 { 208 argc--; argv++; 209 break; 210 } 211 else if (!strcmp (*argv, "--verbose")) 212 { 213 verbose = 1; 214 argc--; argv++; 215 } 216 else if (!strcmp (*argv, "--debug")) 217 { 218 verbose = 1; 219 debug = 1; 220 argc--; argv++; 221 } 222 else if (!strcmp (*argv, "--repetitions")) 223 { 224 argc--; argv++; 225 if (argc) 226 { 227 repetitions = atoi(*argv); 228 argc--; argv++; 229 } 230 } 231 } 232 233 if (repetitions < 1) 234 repetitions = 1; 235 236 if (!gcry_check_version (GCRYPT_VERSION)) 237 die ("version mismatch\n"); 238 239 gcry_set_progress_handler (progress_handler, NULL); 240 241 gcry_control (GCRYCTL_DISABLE_SECMEM, 0); 242 gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0); 243 if (debug) 244 gcry_control (GCRYCTL_SET_DEBUG_FLAGS, 1u, 0); 245 246 check (); 247 248 return 0; 249} 250