Line data Source code
1 : /* t-sexputil.c - Module test for sexputil.c
2 : * Copyright (C) 2007 Free Software Foundation, Inc.
3 : *
4 : * This file is part of GnuPG.
5 : *
6 : * GnuPG is free software; you can redistribute it and/or modify
7 : * it under the terms of the GNU General Public License as published by
8 : * the Free Software Foundation; either version 3 of the License, or
9 : * (at your option) any later version.
10 : *
11 : * GnuPG 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 General Public License for more details.
15 : *
16 : * You should have received a copy of the GNU General Public License
17 : * along with this program; if not, see <https://www.gnu.org/licenses/>.
18 : */
19 :
20 : #include <config.h>
21 : #include <stdio.h>
22 : #include <stdlib.h>
23 :
24 : #include "util.h"
25 :
26 : #define pass() do { ; } while(0)
27 : #define fail(a) do { fprintf (stderr, "%s:%d: test %d failed\n",\
28 : __FILE__,__LINE__, (a)); \
29 : exit (1); \
30 : } while(0)
31 :
32 :
33 : static void
34 1 : test_hash_algo_from_sigval (void)
35 : {
36 : int algo;
37 : /* A real world example. */
38 1 : unsigned char example1_rsa_sha1[] =
39 : ("\x28\x37\x3A\x73\x69\x67\x2D\x76\x61\x6C\x28\x33\x3A\x72\x73\x61"
40 : "\x28\x31\x3A\x73\x31\x32\x38\x3A\x17\xD2\xE9\x5F\xB4\x24\xD4\x1E"
41 : "\x8C\xEE\x94\xDA\x41\x42\x1F\x26\x5E\xF4\x6D\xEC\x5B\xBD\x5B\x89"
42 : "\x7A\x69\x11\x43\xE9\xD2\x23\x21\x25\x64\xA6\xB0\x56\xEF\xB4\xE9"
43 : "\x06\xB2\x44\xF6\x80\x1E\xFF\x41\x23\xEB\xC9\xFA\xFD\x09\xBF\x9C"
44 : "\x8E\xCF\x7F\xC3\x7F\x3A\x40\x48\x89\xDC\xBA\xB7\xDB\x9E\xF1\xBA"
45 : "\x7C\x08\xEA\x74\x1D\x49\xE7\x65\xEF\x67\x79\xBC\x23\xD9\x49\xCD"
46 : "\x05\x99\xD3\xD8\xB7\x7B\xC7\x0E\xF2\xB3\x01\x48\x0F\xC8\xEB\x05"
47 : "\x7B\xFB\x61\xCC\x41\x04\x74\x6D\x33\x84\xB1\xE6\x6A\xD8\x0F\xBC"
48 : "\x27\xAC\x43\x45\xFA\x04\xD1\x22\x29\x29\x28\x34\x3A\x68\x61\x73"
49 : "\x68\x34\x3A\x73\x68\x61\x31\x29\x29");
50 : /* The same but without the hash algo. */
51 1 : unsigned char example1_rsa[] =
52 : ("\x28\x37\x3A\x73\x69\x67\x2D\x76\x61\x6C\x28\x33\x3A\x72\x73\x61"
53 : "\x28\x31\x3A\x73\x31\x32\x38\x3A\x17\xD2\xE9\x5F\xB4\x24\xD4\x1E"
54 : "\x8C\xEE\x94\xDA\x41\x42\x1F\x26\x5E\xF4\x6D\xEC\x5B\xBD\x5B\x89"
55 : "\x7A\x69\x11\x43\xE9\xD2\x23\x21\x25\x64\xA6\xB0\x56\xEF\xB4\xE9"
56 : "\x06\xB2\x44\xF6\x80\x1E\xFF\x41\x23\xEB\xC9\xFA\xFD\x09\xBF\x9C"
57 : "\x8E\xCF\x7F\xC3\x7F\x3A\x40\x48\x89\xDC\xBA\xB7\xDB\x9E\xF1\xBA"
58 : "\x7C\x08\xEA\x74\x1D\x49\xE7\x65\xEF\x67\x79\xBC\x23\xD9\x49\xCD"
59 : "\x05\x99\xD3\xD8\xB7\x7B\xC7\x0E\xF2\xB3\x01\x48\x0F\xC8\xEB\x05"
60 : "\x7B\xFB\x61\xCC\x41\x04\x74\x6D\x33\x84\xB1\xE6\x6A\xD8\x0F\xBC"
61 : "\x27\xAC\x43\x45\xFA\x04\xD1\x22\x29\x29\x29");
62 :
63 1 : algo = hash_algo_from_sigval (example1_rsa_sha1);
64 1 : if (algo != GCRY_MD_SHA1)
65 0 : fail (0);
66 1 : algo = hash_algo_from_sigval (example1_rsa);
67 1 : if (algo)
68 0 : fail (0);
69 1 : }
70 :
71 :
72 : static void
73 1 : test_make_canon_sexp_from_rsa_pk (void)
74 : {
75 : struct {
76 : unsigned char *m;
77 : size_t mlen;
78 : unsigned char *e;
79 : size_t elen;
80 : unsigned char *result;
81 : size_t resultlen;
82 : gpg_err_code_t reverr; /* Expected error from the reverse function. */
83 1 : } tests[] = {
84 : {
85 : "\x82\xB4\x12\x48\x08\x48\xC0\x76\xAA\x8E\xF1\xF8\x7F\x5E\x9B\x89"
86 : "\xA9\x62\x92\xA2\x16\x1B\xF5\x9F\xE1\x41\xF3\xF0\x42\xB5\x5C\x46"
87 : "\xB8\x83\x9F\x39\x97\x73\xFF\xC5\xB2\xF4\x59\x5F\xBA\xC7\x0E\x03"
88 : "\x9D\x27\xC0\x86\x37\x31\x46\xE0\xA1\xFE\xA1\x41\xD4\xE3\xE9\xB3"
89 : "\x9B\xD5\x84\x65\xA5\x37\x35\x34\x07\x58\xB6\xBA\x21\xCA\x21\x72"
90 : "\x4C\xF3\xFC\x91\x47\xD1\x3C\x1D\xA5\x9C\x38\x4D\x58\x39\x92\x16"
91 : "\xB1\xE5\x43\xFE\xB5\x46\x4B\x43\xD1\x47\xB0\xE8\x2A\xDB\xF8\x34"
92 : "\xB0\x5A\x22\x3D\x14\xBB\xEA\x63\x65\xA7\xF1\xF2\xF8\x97\x74\xA7",
93 : 128,
94 : "\x40\x00\x00\x81",
95 : 4,
96 : "\x28\x31\x30\x3a\x70\x75\x62\x6c\x69\x63\x2d\x6b\x65\x79\x28\x33"
97 : "\x3a\x72\x73\x61\x28\x31\x3a\x6e\x31\x32\x39\x3a\x00\x82\xb4\x12"
98 : "\x48\x08\x48\xc0\x76\xaa\x8e\xf1\xf8\x7f\x5e\x9b\x89\xa9\x62\x92"
99 : "\xa2\x16\x1b\xf5\x9f\xe1\x41\xf3\xf0\x42\xb5\x5c\x46\xb8\x83\x9f"
100 : "\x39\x97\x73\xff\xc5\xb2\xf4\x59\x5f\xba\xc7\x0e\x03\x9d\x27\xc0"
101 : "\x86\x37\x31\x46\xe0\xa1\xfe\xa1\x41\xd4\xe3\xe9\xb3\x9b\xd5\x84"
102 : "\x65\xa5\x37\x35\x34\x07\x58\xb6\xba\x21\xca\x21\x72\x4c\xf3\xfc"
103 : "\x91\x47\xd1\x3c\x1d\xa5\x9c\x38\x4d\x58\x39\x92\x16\xb1\xe5\x43"
104 : "\xfe\xb5\x46\x4b\x43\xd1\x47\xb0\xe8\x2a\xdb\xf8\x34\xb0\x5a\x22"
105 : "\x3d\x14\xbb\xea\x63\x65\xa7\xf1\xf2\xf8\x97\x74\xa7\x29\x28\x31"
106 : "\x3a\x65\x34\x3a\x40\x00\x00\x81\x29\x29\x29",
107 : 171
108 : },
109 : {
110 : "\x63\xB4\x12\x48\x08\x48\xC0\x76\xAA\x8E\xF1\xF8\x7F\x5E\x9B\x89",
111 : 16,
112 : "\x03",
113 : 1,
114 : "\x28\x31\x30\x3a\x70\x75\x62\x6c\x69\x63\x2d\x6b\x65\x79\x28\x33"
115 : "\x3a\x72\x73\x61\x28\x31\x3a\x6e\x31\x36\x3a\x63\xb4\x12\x48\x08"
116 : "\x48\xc0\x76\xaa\x8e\xf1\xf8\x7f\x5e\x9b\x89\x29\x28\x31\x3a\x65"
117 : "\x31\x3a\x03\x29\x29\x29",
118 : 54,
119 : },
120 : {
121 : "",
122 : 0,
123 : "",
124 : 0,
125 : "\x28\x31\x30\x3a\x70\x75\x62\x6c\x69\x63\x2d\x6b\x65\x79\x28\x33"
126 : "\x3a\x72\x73\x61\x28\x31\x3a\x6e\x31\x3a\x00\x29\x28\x31\x3a\x65"
127 : "\x31\x3a\x00\x29\x29\x29",
128 : 38,
129 : GPG_ERR_BAD_PUBKEY
130 : },
131 : {
132 : NULL
133 : }
134 : };
135 : int idx;
136 : gpg_error_t err;
137 : unsigned char *sexp;
138 : size_t length;
139 : const unsigned char *rsa_n, *rsa_e;
140 : size_t rsa_n_len, rsa_e_len;
141 :
142 4 : for (idx=0; tests[idx].m; idx++)
143 : {
144 6 : sexp = make_canon_sexp_from_rsa_pk (tests[idx].m, tests[idx].mlen,
145 3 : tests[idx].e, tests[idx].elen,
146 : &length);
147 3 : if (!sexp)
148 : {
149 0 : fprintf (stderr, "%s:%d: out of core\n", __FILE__, __LINE__);
150 0 : exit (1);
151 : }
152 :
153 3 : if (length != tests[idx].resultlen)
154 0 : fail (idx);
155 3 : if (memcmp (sexp, tests[idx].result, tests[idx].resultlen))
156 0 : fail (idx);
157 :
158 : /* Test the reverse function. */
159 3 : err = get_rsa_pk_from_canon_sexp (sexp, length,
160 : &rsa_n, &rsa_n_len,
161 : &rsa_e, &rsa_e_len);
162 3 : if (gpg_err_code (err) != tests[idx].reverr)
163 0 : fail (idx);
164 3 : if (!err)
165 : {
166 2 : if (tests[idx].mlen != rsa_n_len)
167 0 : fail (idx);
168 2 : if (memcmp (tests[idx].m, rsa_n, rsa_n_len))
169 0 : fail (idx);
170 2 : if (tests[idx].elen != rsa_e_len)
171 0 : fail (idx);
172 2 : if (memcmp (tests[idx].e, rsa_e, rsa_e_len))
173 0 : fail (idx);
174 : }
175 :
176 3 : xfree (sexp);
177 : }
178 1 : }
179 :
180 :
181 : int
182 1 : main (int argc, char **argv)
183 : {
184 : (void)argc;
185 : (void)argv;
186 :
187 1 : test_hash_algo_from_sigval ();
188 1 : test_make_canon_sexp_from_rsa_pk ();
189 :
190 1 : return 0;
191 : }
|