xref: /freebsd/crypto/openssh/regress/unittests/sshkey/test_file.c (revision fed1ca4b719c56c930f2259d80663cd34be812bb)
1 /* 	$OpenBSD: test_file.c,v 1.5 2015/10/06 01:20:59 djm Exp $ */
2 /*
3  * Regress test for sshkey.h key management API
4  *
5  * Placed in the public domain
6  */
7 
8 #include "includes.h"
9 
10 #include <sys/types.h>
11 #include <sys/param.h>
12 #include <sys/stat.h>
13 #include <fcntl.h>
14 #include <stdio.h>
15 #ifdef HAVE_STDINT_H
16 #include <stdint.h>
17 #endif
18 #include <stdlib.h>
19 #include <string.h>
20 #include <unistd.h>
21 
22 #include <openssl/bn.h>
23 #include <openssl/rsa.h>
24 #include <openssl/dsa.h>
25 #include <openssl/objects.h>
26 #ifdef OPENSSL_HAS_NISTP256
27 # include <openssl/ec.h>
28 #endif
29 
30 #include "../test_helper/test_helper.h"
31 
32 #include "ssherr.h"
33 #include "authfile.h"
34 #include "sshkey.h"
35 #include "sshbuf.h"
36 #include "digest.h"
37 
38 #include "common.h"
39 
40 void sshkey_file_tests(void);
41 
42 void
43 sshkey_file_tests(void)
44 {
45 	struct sshkey *k1, *k2;
46 	struct sshbuf *buf, *pw;
47 	BIGNUM *a, *b, *c;
48 	char *cp;
49 
50 	TEST_START("load passphrase");
51 	pw = load_text_file("pw");
52 	TEST_DONE();
53 
54 #ifdef WITH_SSH1
55 	TEST_START("parse RSA1 from private");
56 	buf = load_file("rsa1_1");
57 	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf, "", &k1, NULL), 0);
58 	sshbuf_free(buf);
59 	ASSERT_PTR_NE(k1, NULL);
60 	a = load_bignum("rsa1_1.param.n");
61 	ASSERT_BIGNUM_EQ(k1->rsa->n, a);
62 	BN_free(a);
63 	TEST_DONE();
64 
65 	TEST_START("parse RSA1 from private w/ passphrase");
66 	buf = load_file("rsa1_1_pw");
67 	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf,
68 	    (const char *)sshbuf_ptr(pw), &k2, NULL), 0);
69 	sshbuf_free(buf);
70 	ASSERT_PTR_NE(k2, NULL);
71 	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
72 	sshkey_free(k2);
73 	TEST_DONE();
74 
75 	TEST_START("load RSA1 from public");
76 	ASSERT_INT_EQ(sshkey_load_public(test_data_file("rsa1_1.pub"), &k2,
77 	    NULL), 0);
78 	ASSERT_PTR_NE(k2, NULL);
79 	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
80 	sshkey_free(k2);
81 	TEST_DONE();
82 
83 	TEST_START("RSA1 key hex fingerprint");
84 	buf = load_text_file("rsa1_1.fp");
85 	cp = sshkey_fingerprint(k1, SSH_DIGEST_SHA256, SSH_FP_BASE64);
86 	ASSERT_PTR_NE(cp, NULL);
87 	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
88 	sshbuf_free(buf);
89 	free(cp);
90 	TEST_DONE();
91 
92 	TEST_START("RSA1 key bubblebabble fingerprint");
93 	buf = load_text_file("rsa1_1.fp.bb");
94 	cp = sshkey_fingerprint(k1, SSH_DIGEST_SHA1, SSH_FP_BUBBLEBABBLE);
95 	ASSERT_PTR_NE(cp, NULL);
96 	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
97 	sshbuf_free(buf);
98 	free(cp);
99 	TEST_DONE();
100 
101 	sshkey_free(k1);
102 #endif
103 
104 	TEST_START("parse RSA from private");
105 	buf = load_file("rsa_1");
106 	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf, "", &k1, NULL), 0);
107 	sshbuf_free(buf);
108 	ASSERT_PTR_NE(k1, NULL);
109 	a = load_bignum("rsa_1.param.n");
110 	b = load_bignum("rsa_1.param.p");
111 	c = load_bignum("rsa_1.param.q");
112 	ASSERT_BIGNUM_EQ(k1->rsa->n, a);
113 	ASSERT_BIGNUM_EQ(k1->rsa->p, b);
114 	ASSERT_BIGNUM_EQ(k1->rsa->q, c);
115 	BN_free(a);
116 	BN_free(b);
117 	BN_free(c);
118 	TEST_DONE();
119 
120 	TEST_START("parse RSA from private w/ passphrase");
121 	buf = load_file("rsa_1_pw");
122 	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf,
123 	    (const char *)sshbuf_ptr(pw), &k2, NULL), 0);
124 	sshbuf_free(buf);
125 	ASSERT_PTR_NE(k2, NULL);
126 	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
127 	sshkey_free(k2);
128 	TEST_DONE();
129 
130 	TEST_START("parse RSA from new-format");
131 	buf = load_file("rsa_n");
132 	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf, "", &k2, NULL), 0);
133 	sshbuf_free(buf);
134 	ASSERT_PTR_NE(k2, NULL);
135 	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
136 	sshkey_free(k2);
137 	TEST_DONE();
138 
139 	TEST_START("parse RSA from new-format w/ passphrase");
140 	buf = load_file("rsa_n_pw");
141 	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf,
142 	    (const char *)sshbuf_ptr(pw), &k2, NULL), 0);
143 	sshbuf_free(buf);
144 	ASSERT_PTR_NE(k2, NULL);
145 	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
146 	sshkey_free(k2);
147 	TEST_DONE();
148 
149 	TEST_START("load RSA from public");
150 	ASSERT_INT_EQ(sshkey_load_public(test_data_file("rsa_1.pub"), &k2,
151 	    NULL), 0);
152 	ASSERT_PTR_NE(k2, NULL);
153 	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
154 	sshkey_free(k2);
155 	TEST_DONE();
156 
157 	TEST_START("load RSA cert");
158 	ASSERT_INT_EQ(sshkey_load_cert(test_data_file("rsa_1"), &k2), 0);
159 	ASSERT_PTR_NE(k2, NULL);
160 	ASSERT_INT_EQ(k2->type, KEY_RSA_CERT);
161 	ASSERT_INT_EQ(sshkey_equal(k1, k2), 0);
162 	ASSERT_INT_EQ(sshkey_equal_public(k1, k2), 1);
163 	TEST_DONE();
164 
165 	TEST_START("RSA key hex fingerprint");
166 	buf = load_text_file("rsa_1.fp");
167 	cp = sshkey_fingerprint(k1, SSH_DIGEST_SHA256, SSH_FP_BASE64);
168 	ASSERT_PTR_NE(cp, NULL);
169 	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
170 	sshbuf_free(buf);
171 	free(cp);
172 	TEST_DONE();
173 
174 	TEST_START("RSA cert hex fingerprint");
175 	buf = load_text_file("rsa_1-cert.fp");
176 	cp = sshkey_fingerprint(k2, SSH_DIGEST_SHA256, SSH_FP_BASE64);
177 	ASSERT_PTR_NE(cp, NULL);
178 	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
179 	sshbuf_free(buf);
180 	free(cp);
181 	sshkey_free(k2);
182 	TEST_DONE();
183 
184 	TEST_START("RSA key bubblebabble fingerprint");
185 	buf = load_text_file("rsa_1.fp.bb");
186 	cp = sshkey_fingerprint(k1, SSH_DIGEST_SHA1, SSH_FP_BUBBLEBABBLE);
187 	ASSERT_PTR_NE(cp, NULL);
188 	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
189 	sshbuf_free(buf);
190 	free(cp);
191 	TEST_DONE();
192 
193 	sshkey_free(k1);
194 
195 	TEST_START("parse DSA from private");
196 	buf = load_file("dsa_1");
197 	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf, "", &k1, NULL), 0);
198 	sshbuf_free(buf);
199 	ASSERT_PTR_NE(k1, NULL);
200 	a = load_bignum("dsa_1.param.g");
201 	b = load_bignum("dsa_1.param.priv");
202 	c = load_bignum("dsa_1.param.pub");
203 	ASSERT_BIGNUM_EQ(k1->dsa->g, a);
204 	ASSERT_BIGNUM_EQ(k1->dsa->priv_key, b);
205 	ASSERT_BIGNUM_EQ(k1->dsa->pub_key, c);
206 	BN_free(a);
207 	BN_free(b);
208 	BN_free(c);
209 	TEST_DONE();
210 
211 	TEST_START("parse DSA from private w/ passphrase");
212 	buf = load_file("dsa_1_pw");
213 	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf,
214 	    (const char *)sshbuf_ptr(pw), &k2, NULL), 0);
215 	sshbuf_free(buf);
216 	ASSERT_PTR_NE(k2, NULL);
217 	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
218 	sshkey_free(k2);
219 	TEST_DONE();
220 
221 	TEST_START("parse DSA from new-format");
222 	buf = load_file("dsa_n");
223 	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf, "", &k2, NULL), 0);
224 	sshbuf_free(buf);
225 	ASSERT_PTR_NE(k2, NULL);
226 	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
227 	sshkey_free(k2);
228 	TEST_DONE();
229 
230 	TEST_START("parse DSA from new-format w/ passphrase");
231 	buf = load_file("dsa_n_pw");
232 	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf,
233 	    (const char *)sshbuf_ptr(pw), &k2, NULL), 0);
234 	sshbuf_free(buf);
235 	ASSERT_PTR_NE(k2, NULL);
236 	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
237 	sshkey_free(k2);
238 	TEST_DONE();
239 
240 	TEST_START("load DSA from public");
241 	ASSERT_INT_EQ(sshkey_load_public(test_data_file("dsa_1.pub"), &k2,
242 	    NULL), 0);
243 	ASSERT_PTR_NE(k2, NULL);
244 	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
245 	sshkey_free(k2);
246 	TEST_DONE();
247 
248 	TEST_START("load DSA cert");
249 	ASSERT_INT_EQ(sshkey_load_cert(test_data_file("dsa_1"), &k2), 0);
250 	ASSERT_PTR_NE(k2, NULL);
251 	ASSERT_INT_EQ(k2->type, KEY_DSA_CERT);
252 	ASSERT_INT_EQ(sshkey_equal(k1, k2), 0);
253 	ASSERT_INT_EQ(sshkey_equal_public(k1, k2), 1);
254 	TEST_DONE();
255 
256 	TEST_START("DSA key hex fingerprint");
257 	buf = load_text_file("dsa_1.fp");
258 	cp = sshkey_fingerprint(k1, SSH_DIGEST_SHA256, SSH_FP_BASE64);
259 	ASSERT_PTR_NE(cp, NULL);
260 	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
261 	sshbuf_free(buf);
262 	free(cp);
263 	TEST_DONE();
264 
265 	TEST_START("DSA cert hex fingerprint");
266 	buf = load_text_file("dsa_1-cert.fp");
267 	cp = sshkey_fingerprint(k2, SSH_DIGEST_SHA256, SSH_FP_BASE64);
268 	ASSERT_PTR_NE(cp, NULL);
269 	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
270 	sshbuf_free(buf);
271 	free(cp);
272 	sshkey_free(k2);
273 	TEST_DONE();
274 
275 	TEST_START("DSA key bubblebabble fingerprint");
276 	buf = load_text_file("dsa_1.fp.bb");
277 	cp = sshkey_fingerprint(k1, SSH_DIGEST_SHA1, SSH_FP_BUBBLEBABBLE);
278 	ASSERT_PTR_NE(cp, NULL);
279 	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
280 	sshbuf_free(buf);
281 	free(cp);
282 	TEST_DONE();
283 
284 	sshkey_free(k1);
285 
286 #ifdef OPENSSL_HAS_ECC
287 	TEST_START("parse ECDSA from private");
288 	buf = load_file("ecdsa_1");
289 	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf, "", &k1, NULL), 0);
290 	sshbuf_free(buf);
291 	ASSERT_PTR_NE(k1, NULL);
292 	buf = load_text_file("ecdsa_1.param.curve");
293 	ASSERT_STRING_EQ((const char *)sshbuf_ptr(buf),
294 	    OBJ_nid2sn(k1->ecdsa_nid));
295 	sshbuf_free(buf);
296 	a = load_bignum("ecdsa_1.param.priv");
297 	b = load_bignum("ecdsa_1.param.pub");
298 	c = EC_POINT_point2bn(EC_KEY_get0_group(k1->ecdsa),
299 	    EC_KEY_get0_public_key(k1->ecdsa), POINT_CONVERSION_UNCOMPRESSED,
300 	    NULL, NULL);
301 	ASSERT_PTR_NE(c, NULL);
302 	ASSERT_BIGNUM_EQ(EC_KEY_get0_private_key(k1->ecdsa), a);
303 	ASSERT_BIGNUM_EQ(b, c);
304 	BN_free(a);
305 	BN_free(b);
306 	BN_free(c);
307 	TEST_DONE();
308 
309 	TEST_START("parse ECDSA from private w/ passphrase");
310 	buf = load_file("ecdsa_1_pw");
311 	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf,
312 	    (const char *)sshbuf_ptr(pw), &k2, NULL), 0);
313 	sshbuf_free(buf);
314 	ASSERT_PTR_NE(k2, NULL);
315 	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
316 	sshkey_free(k2);
317 	TEST_DONE();
318 
319 	TEST_START("parse ECDSA from new-format");
320 	buf = load_file("ecdsa_n");
321 	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf, "", &k2, NULL), 0);
322 	sshbuf_free(buf);
323 	ASSERT_PTR_NE(k2, NULL);
324 	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
325 	sshkey_free(k2);
326 	TEST_DONE();
327 
328 	TEST_START("parse ECDSA from new-format w/ passphrase");
329 	buf = load_file("ecdsa_n_pw");
330 	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf,
331 	    (const char *)sshbuf_ptr(pw), &k2, NULL), 0);
332 	sshbuf_free(buf);
333 	ASSERT_PTR_NE(k2, NULL);
334 	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
335 	sshkey_free(k2);
336 	TEST_DONE();
337 
338 	TEST_START("load ECDSA from public");
339 	ASSERT_INT_EQ(sshkey_load_public(test_data_file("ecdsa_1.pub"), &k2,
340 	    NULL), 0);
341 	ASSERT_PTR_NE(k2, NULL);
342 	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
343 	sshkey_free(k2);
344 	TEST_DONE();
345 
346 	TEST_START("load ECDSA cert");
347 	ASSERT_INT_EQ(sshkey_load_cert(test_data_file("ecdsa_1"), &k2), 0);
348 	ASSERT_PTR_NE(k2, NULL);
349 	ASSERT_INT_EQ(k2->type, KEY_ECDSA_CERT);
350 	ASSERT_INT_EQ(sshkey_equal(k1, k2), 0);
351 	ASSERT_INT_EQ(sshkey_equal_public(k1, k2), 1);
352 	TEST_DONE();
353 
354 	TEST_START("ECDSA key hex fingerprint");
355 	buf = load_text_file("ecdsa_1.fp");
356 	cp = sshkey_fingerprint(k1, SSH_DIGEST_SHA256, SSH_FP_BASE64);
357 	ASSERT_PTR_NE(cp, NULL);
358 	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
359 	sshbuf_free(buf);
360 	free(cp);
361 	TEST_DONE();
362 
363 	TEST_START("ECDSA cert hex fingerprint");
364 	buf = load_text_file("ecdsa_1-cert.fp");
365 	cp = sshkey_fingerprint(k2, SSH_DIGEST_SHA256, SSH_FP_BASE64);
366 	ASSERT_PTR_NE(cp, NULL);
367 	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
368 	sshbuf_free(buf);
369 	free(cp);
370 	sshkey_free(k2);
371 	TEST_DONE();
372 
373 	TEST_START("ECDSA key bubblebabble fingerprint");
374 	buf = load_text_file("ecdsa_1.fp.bb");
375 	cp = sshkey_fingerprint(k1, SSH_DIGEST_SHA1, SSH_FP_BUBBLEBABBLE);
376 	ASSERT_PTR_NE(cp, NULL);
377 	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
378 	sshbuf_free(buf);
379 	free(cp);
380 	TEST_DONE();
381 
382 	sshkey_free(k1);
383 #endif /* OPENSSL_HAS_ECC */
384 
385 	TEST_START("parse Ed25519 from private");
386 	buf = load_file("ed25519_1");
387 	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf, "", &k1, NULL), 0);
388 	sshbuf_free(buf);
389 	ASSERT_PTR_NE(k1, NULL);
390 	ASSERT_INT_EQ(k1->type, KEY_ED25519);
391 	/* XXX check key contents */
392 	TEST_DONE();
393 
394 	TEST_START("parse Ed25519 from private w/ passphrase");
395 	buf = load_file("ed25519_1_pw");
396 	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf,
397 	    (const char *)sshbuf_ptr(pw), &k2, NULL), 0);
398 	sshbuf_free(buf);
399 	ASSERT_PTR_NE(k2, NULL);
400 	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
401 	sshkey_free(k2);
402 	TEST_DONE();
403 
404 	TEST_START("load Ed25519 from public");
405 	ASSERT_INT_EQ(sshkey_load_public(test_data_file("ed25519_1.pub"), &k2,
406 	    NULL), 0);
407 	ASSERT_PTR_NE(k2, NULL);
408 	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
409 	sshkey_free(k2);
410 	TEST_DONE();
411 
412 	TEST_START("load Ed25519 cert");
413 	ASSERT_INT_EQ(sshkey_load_cert(test_data_file("ed25519_1"), &k2), 0);
414 	ASSERT_PTR_NE(k2, NULL);
415 	ASSERT_INT_EQ(k2->type, KEY_ED25519_CERT);
416 	ASSERT_INT_EQ(sshkey_equal(k1, k2), 0);
417 	ASSERT_INT_EQ(sshkey_equal_public(k1, k2), 1);
418 	TEST_DONE();
419 
420 	TEST_START("Ed25519 key hex fingerprint");
421 	buf = load_text_file("ed25519_1.fp");
422 	cp = sshkey_fingerprint(k1, SSH_DIGEST_SHA256, SSH_FP_BASE64);
423 	ASSERT_PTR_NE(cp, NULL);
424 	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
425 	sshbuf_free(buf);
426 	free(cp);
427 	TEST_DONE();
428 
429 	TEST_START("Ed25519 cert hex fingerprint");
430 	buf = load_text_file("ed25519_1-cert.fp");
431 	cp = sshkey_fingerprint(k2, SSH_DIGEST_SHA256, SSH_FP_BASE64);
432 	ASSERT_PTR_NE(cp, NULL);
433 	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
434 	sshbuf_free(buf);
435 	free(cp);
436 	sshkey_free(k2);
437 	TEST_DONE();
438 
439 	TEST_START("Ed25519 key bubblebabble fingerprint");
440 	buf = load_text_file("ed25519_1.fp.bb");
441 	cp = sshkey_fingerprint(k1, SSH_DIGEST_SHA1, SSH_FP_BUBBLEBABBLE);
442 	ASSERT_PTR_NE(cp, NULL);
443 	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
444 	sshbuf_free(buf);
445 	free(cp);
446 	TEST_DONE();
447 
448 	sshkey_free(k1);
449 
450 	sshbuf_free(pw);
451 
452 }
453