summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjsing <>2021-11-30 07:34:29 +0000
committerjsing <>2021-11-30 07:34:29 +0000
commit191ea8dd2d602b857731a8b90e8b52022e810b82 (patch)
tree3eb1ff50738acb529c63c8b81e7c6ffd7d71f8f9 /src
parentb4d2bd95ef1ce1b121f8a6d456749623761976dc (diff)
downloadopenbsd-191ea8dd2d602b857731a8b90e8b52022e810b82.tar.gz
openbsd-191ea8dd2d602b857731a8b90e8b52022e810b82.tar.bz2
openbsd-191ea8dd2d602b857731a8b90e8b52022e810b82.zip
Add regress for {d2i,i2d}_{,DSA_,EC_,RSA_}PUBKEY{,_bio}().
Diffstat (limited to 'src')
-rw-r--r--src/regress/lib/libcrypto/asn1/Makefile3
-rw-r--r--src/regress/lib/libcrypto/asn1/asn1x509.c568
2 files changed, 570 insertions, 1 deletions
diff --git a/src/regress/lib/libcrypto/asn1/Makefile b/src/regress/lib/libcrypto/asn1/Makefile
index a7dd633869..4b47bfdc2b 100644
--- a/src/regress/lib/libcrypto/asn1/Makefile
+++ b/src/regress/lib/libcrypto/asn1/Makefile
@@ -1,9 +1,10 @@
1# $OpenBSD: Makefile,v 1.6 2021/11/13 20:50:14 schwarze Exp $ 1# $OpenBSD: Makefile,v 1.7 2021/11/30 07:34:29 jsing Exp $
2 2
3TESTS = \ 3TESTS = \
4 asn1evp \ 4 asn1evp \
5 asn1string_copy \ 5 asn1string_copy \
6 asn1time \ 6 asn1time \
7 asn1x509 \
7 rfc5280time 8 rfc5280time
8 9
9PROGS = ${TESTS} 10PROGS = ${TESTS}
diff --git a/src/regress/lib/libcrypto/asn1/asn1x509.c b/src/regress/lib/libcrypto/asn1/asn1x509.c
new file mode 100644
index 0000000000..a9cd4967da
--- /dev/null
+++ b/src/regress/lib/libcrypto/asn1/asn1x509.c
@@ -0,0 +1,568 @@
1/* $OpenBSD: asn1x509.c,v 1.1 2021/11/30 07:34:29 jsing Exp $ */
2/*
3 * Copyright (c) 2017 Joel Sing <jsing@openbsd.org>
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18#include <err.h>
19#include <string.h>
20
21#include <openssl/asn1.h>
22#include <openssl/bio.h>
23#include <openssl/bn.h>
24#include <openssl/dsa.h>
25#include <openssl/ec.h>
26#include <openssl/err.h>
27#include <openssl/pem.h>
28#include <openssl/rsa.h>
29#include <openssl/x509.h>
30
31const char *dsa_test_key = \
32 "-----BEGIN DSA PRIVATE KEY-----\n" \
33 "MIH5AgEAAkEAt+CNNryEe8t2SkjuP0azjOKjSMXsw3GzjLS5c+vFLQKs0zIuPp8F\n" \
34 "I/z5t8vcNt/D8EyzQZWxgCfoasHqDOJvRwIVAKrJMyIMt9iJtaS31cyIJmIDVlZX\n" \
35 "AkEAs1/Uy+x0+1C1n7V3eJxuBdO/LUalbrZM5PfcwDshf9kcQNLsRu5zTZkU0OX/\n" \
36 "8xANz+ue2o6LON2sTAtuEfSM1QJBAIDRt0rQGGrFCRJ4O39Iqlf27yIO6Gq1ppbE\n" \
37 "Wvsvz4YSIZsG02vlBlzVIhULftNnkpN59MFtIjx8RsbEQ4YTnSICFDXPf/UIRvdH\n" \
38 "20NV++tnUZYUAXM+\n" \
39 "-----END DSA PRIVATE KEY-----\n";
40
41unsigned char dsa_test_asn1_pubkey[] = {
42 0x30, 0x81, 0xf2, 0x30, 0x81, 0xa9, 0x06, 0x07,
43 0x2a, 0x86, 0x48, 0xce, 0x38, 0x04, 0x01, 0x30,
44 0x81, 0x9d, 0x02, 0x41, 0x00, 0xb7, 0xe0, 0x8d,
45 0x36, 0xbc, 0x84, 0x7b, 0xcb, 0x76, 0x4a, 0x48,
46 0xee, 0x3f, 0x46, 0xb3, 0x8c, 0xe2, 0xa3, 0x48,
47 0xc5, 0xec, 0xc3, 0x71, 0xb3, 0x8c, 0xb4, 0xb9,
48 0x73, 0xeb, 0xc5, 0x2d, 0x02, 0xac, 0xd3, 0x32,
49 0x2e, 0x3e, 0x9f, 0x05, 0x23, 0xfc, 0xf9, 0xb7,
50 0xcb, 0xdc, 0x36, 0xdf, 0xc3, 0xf0, 0x4c, 0xb3,
51 0x41, 0x95, 0xb1, 0x80, 0x27, 0xe8, 0x6a, 0xc1,
52 0xea, 0x0c, 0xe2, 0x6f, 0x47, 0x02, 0x15, 0x00,
53 0xaa, 0xc9, 0x33, 0x22, 0x0c, 0xb7, 0xd8, 0x89,
54 0xb5, 0xa4, 0xb7, 0xd5, 0xcc, 0x88, 0x26, 0x62,
55 0x03, 0x56, 0x56, 0x57, 0x02, 0x41, 0x00, 0xb3,
56 0x5f, 0xd4, 0xcb, 0xec, 0x74, 0xfb, 0x50, 0xb5,
57 0x9f, 0xb5, 0x77, 0x78, 0x9c, 0x6e, 0x05, 0xd3,
58 0xbf, 0x2d, 0x46, 0xa5, 0x6e, 0xb6, 0x4c, 0xe4,
59 0xf7, 0xdc, 0xc0, 0x3b, 0x21, 0x7f, 0xd9, 0x1c,
60 0x40, 0xd2, 0xec, 0x46, 0xee, 0x73, 0x4d, 0x99,
61 0x14, 0xd0, 0xe5, 0xff, 0xf3, 0x10, 0x0d, 0xcf,
62 0xeb, 0x9e, 0xda, 0x8e, 0x8b, 0x38, 0xdd, 0xac,
63 0x4c, 0x0b, 0x6e, 0x11, 0xf4, 0x8c, 0xd5, 0x03,
64 0x44, 0x00, 0x02, 0x41, 0x00, 0x80, 0xd1, 0xb7,
65 0x4a, 0xd0, 0x18, 0x6a, 0xc5, 0x09, 0x12, 0x78,
66 0x3b, 0x7f, 0x48, 0xaa, 0x57, 0xf6, 0xef, 0x22,
67 0x0e, 0xe8, 0x6a, 0xb5, 0xa6, 0x96, 0xc4, 0x5a,
68 0xfb, 0x2f, 0xcf, 0x86, 0x12, 0x21, 0x9b, 0x06,
69 0xd3, 0x6b, 0xe5, 0x06, 0x5c, 0xd5, 0x22, 0x15,
70 0x0b, 0x7e, 0xd3, 0x67, 0x92, 0x93, 0x79, 0xf4,
71 0xc1, 0x6d, 0x22, 0x3c, 0x7c, 0x46, 0xc6, 0xc4,
72 0x43, 0x86, 0x13, 0x9d, 0x22,
73};
74
75const char *ec_test_key = \
76 "-----BEGIN EC PRIVATE KEY-----\n" \
77 "MHcCAQEEIEDkF84aPdBNu4vbPE+QV3EP9ULp4Enr1N0lz4vzuc2boAoGCCqGSM49\n" \
78 "AwEHoUQDQgAEUQGHBjYwbfHvI3QqdDy8ftNU5UvQqh6TH6upIrtz4CVccxnWO2+s\n" \
79 "qSMOu1z5KnGIOVf2kLQ2S2iMahyFMezr8g==\n" \
80 "-----END EC PRIVATE KEY-----\n";
81
82unsigned char ec_test_asn1_pubkey[] = {
83 0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86,
84 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a,
85 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03,
86 0x42, 0x00, 0x04, 0x51, 0x01, 0x87, 0x06, 0x36,
87 0x30, 0x6d, 0xf1, 0xef, 0x23, 0x74, 0x2a, 0x74,
88 0x3c, 0xbc, 0x7e, 0xd3, 0x54, 0xe5, 0x4b, 0xd0,
89 0xaa, 0x1e, 0x93, 0x1f, 0xab, 0xa9, 0x22, 0xbb,
90 0x73, 0xe0, 0x25, 0x5c, 0x73, 0x19, 0xd6, 0x3b,
91 0x6f, 0xac, 0xa9, 0x23, 0x0e, 0xbb, 0x5c, 0xf9,
92 0x2a, 0x71, 0x88, 0x39, 0x57, 0xf6, 0x90, 0xb4,
93 0x36, 0x4b, 0x68, 0x8c, 0x6a, 0x1c, 0x85, 0x31,
94 0xec, 0xeb, 0xf2,
95};
96
97const char *rsa_test_key = \
98 "-----BEGIN PRIVATE KEY-----\n" \
99 "MIIBVgIBADANBgkqhkiG9w0BAQEFAASCAUAwggE8AgEAAkEA4Fs6ljFFQw/ElDf5\n" \
100 "LTghVw972PVpQuKPQvwb1cWbV3+7W5sXOcoM/RvwzO7WeppkeltVCBoKaQd+9e2Z\n" \
101 "BHtYhwIDAQABAkEAhWv7dWIrrGvuHa8D0i51NU8R+b5IMOyHAfDnpMN1VByWcBdb\n" \
102 "G7ZJsEYlO1Tbx1zFQOVyrDUY2hn0YttPjWys0QIhAP9+FRhHCYye/EY14zSa+lxb\n" \
103 "ljOPjWgddMdJBcPOVNUNAiEA4M1QUtIcTnTnfvcxvEBIhbmSR8fRvZYAeT5EoTKM\n" \
104 "puMCIQD9898X8JRHWEg9qZabVWiBoO+ddJUD5jOLWsQGKvMbiQIgBOQyxTqRJxvg\n" \
105 "FaEnUeNMMKyzBCDS7X8gD4NNVvyUluUCIQC/lnO9xYi6S4BFMwHFEUY0jLr5vgsR\n" \
106 "+esRU9dLkMqt+w==\n" \
107 "-----END PRIVATE KEY-----\n";
108
109unsigned char rsa_test_asn1_pubkey[] = {
110 0x30, 0x5c, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,
111 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05,
112 0x00, 0x03, 0x4b, 0x00, 0x30, 0x48, 0x02, 0x41,
113 0x00, 0xe0, 0x5b, 0x3a, 0x96, 0x31, 0x45, 0x43,
114 0x0f, 0xc4, 0x94, 0x37, 0xf9, 0x2d, 0x38, 0x21,
115 0x57, 0x0f, 0x7b, 0xd8, 0xf5, 0x69, 0x42, 0xe2,
116 0x8f, 0x42, 0xfc, 0x1b, 0xd5, 0xc5, 0x9b, 0x57,
117 0x7f, 0xbb, 0x5b, 0x9b, 0x17, 0x39, 0xca, 0x0c,
118 0xfd, 0x1b, 0xf0, 0xcc, 0xee, 0xd6, 0x7a, 0x9a,
119 0x64, 0x7a, 0x5b, 0x55, 0x08, 0x1a, 0x0a, 0x69,
120 0x07, 0x7e, 0xf5, 0xed, 0x99, 0x04, 0x7b, 0x58,
121 0x87, 0x02, 0x03, 0x01, 0x00, 0x01,
122};
123
124static void
125hexdump(const unsigned char *buf, size_t len)
126{
127 size_t i;
128
129 for (i = 1; i <= len; i++)
130 fprintf(stderr, " 0x%02hhx,%s", buf[i - 1], i % 8 ? "" : "\n");
131
132 fprintf(stderr, "\n");
133}
134
135static int
136compare_data(const char *label, const unsigned char *d1, size_t d1_len,
137 const unsigned char *d2, size_t d2_len)
138{
139 if (d1_len != d2_len) {
140 fprintf(stderr, "FAIL: got %s with length %zu, want %zu\n",
141 label, d1_len, d2_len);
142 return -1;
143 }
144 if (memcmp(d1, d2, d1_len) != 0) {
145 fprintf(stderr, "FAIL: %s differs\n", label);
146 fprintf(stderr, "got:\n");
147 hexdump(d1, d1_len);
148 fprintf(stderr, "want:\n");
149 hexdump(d2, d2_len);
150 return -1;
151 }
152 return 0;
153}
154
155static int
156dsa_pubkey_test(void)
157{
158 EVP_PKEY *pkey_a = NULL, *pkey_b = NULL;
159 unsigned char *out = NULL, *data = NULL;
160 DSA *dsa_a = NULL, *dsa_b = NULL;
161 const unsigned char *p;
162 BIO *bio_mem = NULL;
163 int failure = 1;
164 int len;
165
166 if ((bio_mem = BIO_new_mem_buf((void *)dsa_test_key, -1)) == NULL)
167 errx(1, "failed to create BIO");
168
169 if ((dsa_a = PEM_read_bio_DSAPrivateKey(bio_mem, NULL, NULL, NULL)) == NULL) {
170 ERR_print_errors_fp(stderr);
171 errx(1, "failed to decode DSA key from PEM");
172 }
173
174 /*
175 * Test i2d_PUBKEY/d2i_PUBKEY.
176 */
177 if ((pkey_a = EVP_PKEY_new()) == NULL)
178 errx(1, "failed to create EVP_PKEY");
179 if (!EVP_PKEY_set1_DSA(pkey_a, dsa_a))
180 errx(1, "failed to set DSA on EVP_PKEY");
181
182 if ((len = i2d_PUBKEY(pkey_a, &out)) < 0) {
183 fprintf(stderr, "FAIL: i2d_PUBKEY failed\n");
184 goto done;
185 }
186 if (compare_data("DSA PUBKEY", out, len, dsa_test_asn1_pubkey,
187 sizeof(dsa_test_asn1_pubkey)) == -1)
188 goto done;
189
190 p = out;
191 if ((pkey_b = d2i_PUBKEY(NULL, &p, len)) == NULL) {
192 fprintf(stderr, "FAIL: d2i_PUBKEY failed\n");
193 goto done;
194 }
195
196 if (BN_cmp(pkey_a->pkey.dsa->pub_key, pkey_b->pkey.dsa->pub_key) != 0) {
197 fprintf(stderr, "FAIL: DSA public keys mismatch\n");
198 goto done;
199 }
200
201 free(out);
202 out = NULL;
203
204 /*
205 * Test i2d_DSA_PUBKEY/d2i_DSA_PUBKEY.
206 */
207
208 if ((len = i2d_DSA_PUBKEY(dsa_a, &out)) < 0) {
209 fprintf(stderr, "FAIL: i2d_DSA_PUBKEY failed\n");
210 goto done;
211 }
212 if (compare_data("DSA_PUBKEY", out, len, dsa_test_asn1_pubkey,
213 sizeof(dsa_test_asn1_pubkey)) == -1)
214 goto done;
215
216 p = out;
217 if ((dsa_b = d2i_DSA_PUBKEY(NULL, &p, len)) == NULL) {
218 fprintf(stderr, "FAIL: d2i_DSA_PUBKEY failed\n");
219 goto done;
220 }
221
222 if (BN_cmp(dsa_a->pub_key, dsa_b->pub_key) != 0) {
223 fprintf(stderr, "FAIL: DSA public keys mismatch\n");
224 goto done;
225 }
226
227 p = out;
228 if ((dsa_a = d2i_DSA_PUBKEY(&dsa_a, &p, len)) == NULL) {
229 fprintf(stderr, "FAIL: d2i_DSA_PUBKEY failed\n");
230 goto done;
231 }
232
233 if (BN_cmp(dsa_a->pub_key, dsa_b->pub_key) != 0) {
234 fprintf(stderr, "FAIL: DSA public keys mismatch\n");
235 goto done;
236 }
237
238 /*
239 * Test i2d_DSA_PUBKEY_bio/d2i_DSA_PUBKEY_bio.
240 */
241 BIO_free_all(bio_mem);
242 if ((bio_mem = BIO_new(BIO_s_mem())) == NULL)
243 errx(1, "BIO_new failed for BIO_s_mem");
244
245 if ((len = i2d_DSA_PUBKEY_bio(bio_mem, dsa_a)) < 0) {
246 fprintf(stderr, "FAIL: i2d_DSA_PUBKEY_bio failed\n");
247 goto done;
248 }
249
250 len = BIO_get_mem_data(bio_mem, &data);
251 if (compare_data("DSA_PUBKEY", data, len, dsa_test_asn1_pubkey,
252 sizeof(dsa_test_asn1_pubkey)) == -1)
253 goto done;
254
255 DSA_free(dsa_b);
256 if ((dsa_b = d2i_DSA_PUBKEY_bio(bio_mem, NULL)) == NULL) {
257 fprintf(stderr, "FAIL: d2i_DSA_PUBKEY_bio failed\n");
258 goto done;
259 }
260
261 if (BN_cmp(dsa_a->pub_key, dsa_b->pub_key) != 0) {
262 fprintf(stderr, "FAIL: DSA public keys mismatch\n");
263 goto done;
264 }
265
266 failure = 0;
267
268 done:
269 BIO_free_all(bio_mem);
270 DSA_free(dsa_a);
271 DSA_free(dsa_b);
272 EVP_PKEY_free(pkey_a);
273 EVP_PKEY_free(pkey_b);
274 free(out);
275
276 return (failure);
277}
278
279static int
280ec_pubkey_test(void)
281{
282 EVP_PKEY *pkey_a = NULL, *pkey_b = NULL;
283 unsigned char *out = NULL, *data = NULL;
284 EC_KEY *ec_a = NULL, *ec_b = NULL;
285 const unsigned char *p;
286 BIO *bio_mem = NULL;
287 int failure = 1;
288 int len;
289
290 if ((bio_mem = BIO_new_mem_buf((void *)ec_test_key, -1)) == NULL)
291 errx(1, "failed to create BIO");
292
293 if ((ec_a = PEM_read_bio_ECPrivateKey(bio_mem, NULL, NULL, NULL)) == NULL) {
294 ERR_print_errors_fp(stderr);
295 errx(1, "failed to decode EC key from PEM");
296 }
297
298 /*
299 * Test i2d_PUBKEY/d2i_PUBKEY.
300 */
301 if ((pkey_a = EVP_PKEY_new()) == NULL)
302 errx(1, "failed to create EVP_PKEY");
303 if (!EVP_PKEY_set1_EC_KEY(pkey_a, ec_a))
304 errx(1, "failed to set EC_KEY on EVP_PKEY");
305
306 if ((len = i2d_PUBKEY(pkey_a, &out)) < 0) {
307 fprintf(stderr, "FAIL: i2d_PUBKEY failed\n");
308 goto done;
309 }
310 if (compare_data("EC_KEY PUBKEY", out, len, ec_test_asn1_pubkey,
311 sizeof(ec_test_asn1_pubkey)) == -1)
312 goto done;
313
314 p = out;
315 if ((pkey_b = d2i_PUBKEY(NULL, &p, len)) == NULL) {
316 fprintf(stderr, "FAIL: d2i_PUBKEY failed\n");
317 goto done;
318 }
319
320 if (EC_GROUP_cmp(EC_KEY_get0_group(pkey_a->pkey.ec),
321 EC_KEY_get0_group(pkey_b->pkey.ec), NULL) != 0) {
322 fprintf(stderr, "FAIL: EC_KEY groups keys mismatch\n");
323 goto done;
324 }
325 if (EC_POINT_cmp(EC_KEY_get0_group(pkey_a->pkey.ec),
326 EC_KEY_get0_public_key(pkey_a->pkey.ec),
327 EC_KEY_get0_public_key(pkey_b->pkey.ec), NULL) != 0) {
328 fprintf(stderr, "FAIL: EC_KEY public keys mismatch\n");
329 goto done;
330 }
331
332 free(out);
333 out = NULL;
334
335 /*
336 * Test i2d_EC_PUBKEY/d2i_EC_PUBKEY.
337 */
338
339 if ((len = i2d_EC_PUBKEY(ec_a, &out)) < 0) {
340 fprintf(stderr, "FAIL: i2d_EC_PUBKEY failed\n");
341 goto done;
342 }
343 if (compare_data("EC_PUBKEY", out, len, ec_test_asn1_pubkey,
344 sizeof(ec_test_asn1_pubkey)) == -1)
345 goto done;
346
347 p = out;
348 if ((ec_b = d2i_EC_PUBKEY(NULL, &p, len)) == NULL) {
349 fprintf(stderr, "FAIL: d2i_EC_PUBKEY failed\n");
350 goto done;
351 }
352
353 if (EC_GROUP_cmp(EC_KEY_get0_group(ec_a), EC_KEY_get0_group(ec_b),
354 NULL) != 0) {
355 fprintf(stderr, "FAIL: EC_KEY groups keys mismatch\n");
356 goto done;
357 }
358 if (EC_POINT_cmp(EC_KEY_get0_group(ec_a), EC_KEY_get0_public_key(ec_a),
359 EC_KEY_get0_public_key(ec_b), NULL) != 0) {
360 fprintf(stderr, "FAIL: EC_KEY public keys mismatch\n");
361 goto done;
362 }
363
364 p = out;
365 if ((ec_a = d2i_EC_PUBKEY(&ec_a, &p, len)) == NULL) {
366 fprintf(stderr, "FAIL: d2i_EC_PUBKEY failed\n");
367 goto done;
368 }
369
370 if (EC_GROUP_cmp(EC_KEY_get0_group(ec_a), EC_KEY_get0_group(ec_b),
371 NULL) != 0) {
372 fprintf(stderr, "FAIL: EC_KEY groups keys mismatch\n");
373 goto done;
374 }
375 if (EC_POINT_cmp(EC_KEY_get0_group(ec_a), EC_KEY_get0_public_key(ec_a),
376 EC_KEY_get0_public_key(ec_b), NULL) != 0) {
377 fprintf(stderr, "FAIL: EC_KEY public keys mismatch\n");
378 goto done;
379 }
380
381 /*
382 * Test i2d_EC_PUBKEY_bio/d2i_EC_PUBKEY_bio.
383 */
384 BIO_free_all(bio_mem);
385 if ((bio_mem = BIO_new(BIO_s_mem())) == NULL)
386 errx(1, "BIO_new failed for BIO_s_mem");
387
388 if ((len = i2d_EC_PUBKEY_bio(bio_mem, ec_a)) < 0) {
389 fprintf(stderr, "FAIL: i2d_EC_PUBKEY_bio failed\n");
390 goto done;
391 }
392
393 len = BIO_get_mem_data(bio_mem, &data);
394 if (compare_data("EC_PUBKEY", data, len, ec_test_asn1_pubkey,
395 sizeof(ec_test_asn1_pubkey)) == -1)
396 goto done;
397
398 EC_KEY_free(ec_b);
399 if ((ec_b = d2i_EC_PUBKEY_bio(bio_mem, NULL)) == NULL) {
400 fprintf(stderr, "FAIL: d2i_EC_PUBKEY_bio failed\n");
401 goto done;
402 }
403
404 if (EC_GROUP_cmp(EC_KEY_get0_group(ec_a), EC_KEY_get0_group(ec_b),
405 NULL) != 0) {
406 fprintf(stderr, "FAIL: EC_KEY groups keys mismatch\n");
407 goto done;
408 }
409 if (EC_POINT_cmp(EC_KEY_get0_group(ec_a), EC_KEY_get0_public_key(ec_a),
410 EC_KEY_get0_public_key(ec_b), NULL) != 0) {
411 fprintf(stderr, "FAIL: EC_KEY public keys mismatch\n");
412 goto done;
413 }
414
415 failure = 0;
416
417 done:
418 BIO_free_all(bio_mem);
419 EC_KEY_free(ec_a);
420 EC_KEY_free(ec_b);
421 EVP_PKEY_free(pkey_a);
422 EVP_PKEY_free(pkey_b);
423 free(out);
424
425 return (failure);
426}
427
428static int
429rsa_pubkey_test(void)
430{
431 EVP_PKEY *pkey_a = NULL, *pkey_b = NULL;
432 RSA *rsa_a = NULL, *rsa_b = NULL;
433 unsigned char *out = NULL, *data = NULL;
434 const unsigned char *p;
435 BIO *bio_mem = NULL;
436 int failure = 1;
437 int len;
438
439 if ((bio_mem = BIO_new_mem_buf((void *)rsa_test_key, -1)) == NULL)
440 errx(1, "failed to create BIO");
441
442 if ((rsa_a = PEM_read_bio_RSAPrivateKey(bio_mem, NULL, NULL, NULL)) == NULL) {
443 ERR_print_errors_fp(stderr);
444 errx(1, "failed to decode RSA key from PEM");
445 }
446
447 /*
448 * Test i2d_PUBKEY/d2i_PUBKEY.
449 */
450 if ((pkey_a = EVP_PKEY_new()) == NULL)
451 errx(1, "failed to create EVP_PKEY");
452 if (!EVP_PKEY_set1_RSA(pkey_a, rsa_a))
453 errx(1, "failed to set RSA on EVP_PKEY");
454
455 if ((len = i2d_PUBKEY(pkey_a, &out)) < 0) {
456 fprintf(stderr, "FAIL: i2d_PUBKEY failed\n");
457 goto done;
458 }
459 if (compare_data("RSA PUBKEY", out, len, rsa_test_asn1_pubkey,
460 sizeof(rsa_test_asn1_pubkey)) == -1)
461 goto done;
462
463 p = out;
464 if ((pkey_b = d2i_PUBKEY(NULL, &p, len)) == NULL) {
465 fprintf(stderr, "FAIL: d2i_PUBKEY failed\n");
466 goto done;
467 }
468
469 if (BN_cmp(pkey_a->pkey.rsa->n, pkey_b->pkey.rsa->n) != 0 ||
470 BN_cmp(pkey_a->pkey.rsa->e, pkey_b->pkey.rsa->e) != 0) {
471 fprintf(stderr, "FAIL: RSA public keys mismatch\n");
472 goto done;
473 }
474
475 free(out);
476 out = NULL;
477
478 /*
479 * Test i2d_RSA_PUBKEY/d2i_RSA_PUBKEY.
480 */
481
482 if ((len = i2d_RSA_PUBKEY(rsa_a, &out)) < 0) {
483 fprintf(stderr, "FAIL: i2d_RSA_PUBKEY failed\n");
484 goto done;
485 }
486 if (compare_data("RSA_PUBKEY", out, len, rsa_test_asn1_pubkey,
487 sizeof(rsa_test_asn1_pubkey)) == -1)
488 goto done;
489
490 p = out;
491 if ((rsa_b = d2i_RSA_PUBKEY(NULL, &p, len)) == NULL) {
492 fprintf(stderr, "FAIL: d2i_RSA_PUBKEY failed\n");
493 goto done;
494 }
495
496 if (BN_cmp(rsa_a->n, rsa_b->n) != 0 ||
497 BN_cmp(rsa_a->e, rsa_b->e) != 0) {
498 fprintf(stderr, "FAIL: RSA public keys mismatch\n");
499 goto done;
500 }
501
502 p = out;
503 if ((rsa_a = d2i_RSA_PUBKEY(&rsa_a, &p, len)) == NULL) {
504 fprintf(stderr, "FAIL: d2i_RSA_PUBKEY failed\n");
505 goto done;
506 }
507
508 if (BN_cmp(rsa_a->n, rsa_b->n) != 0 ||
509 BN_cmp(rsa_a->e, rsa_b->e) != 0) {
510 fprintf(stderr, "FAIL: RSA public keys mismatch\n");
511 goto done;
512 }
513
514 /*
515 * Test i2d_RSA_PUBKEY_bio/d2i_RSA_PUBKEY_bio.
516 */
517 BIO_free_all(bio_mem);
518 if ((bio_mem = BIO_new(BIO_s_mem())) == NULL)
519 errx(1, "BIO_new failed for BIO_s_mem");
520
521 if ((len = i2d_RSA_PUBKEY_bio(bio_mem, rsa_a)) < 0) {
522 fprintf(stderr, "FAIL: i2d_RSA_PUBKEY_bio failed\n");
523 goto done;
524 }
525
526 len = BIO_get_mem_data(bio_mem, &data);
527 if (compare_data("RSA_PUBKEY", data, len, rsa_test_asn1_pubkey,
528 sizeof(rsa_test_asn1_pubkey)) == -1)
529 goto done;
530
531 RSA_free(rsa_b);
532 if ((rsa_b = d2i_RSA_PUBKEY_bio(bio_mem, NULL)) == NULL) {
533 fprintf(stderr, "FAIL: d2i_RSA_PUBKEY_bio failed\n");
534 goto done;
535 }
536
537 if (BN_cmp(rsa_a->n, rsa_b->n) != 0 ||
538 BN_cmp(rsa_a->e, rsa_b->e) != 0) {
539 fprintf(stderr, "FAIL: RSA public keys mismatch\n");
540 goto done;
541 }
542
543 failure = 0;
544
545 done:
546 BIO_free_all(bio_mem);
547 RSA_free(rsa_a);
548 RSA_free(rsa_b);
549 EVP_PKEY_free(pkey_a);
550 EVP_PKEY_free(pkey_b);
551 free(out);
552
553 return (failure);
554}
555
556int
557main(int argc, char **argv)
558{
559 int failed = 0;
560
561 ERR_load_crypto_strings();
562
563 failed |= dsa_pubkey_test();
564 failed |= ec_pubkey_test();
565 failed |= rsa_pubkey_test();
566
567 return (failed);
568}