xref: /openbsd-src/regress/usr.bin/ssh/unittests/sshkey/test_file.c (revision 123df87b87cd13dad2ee6e095f329c7c51f69244)
1 /* 	$OpenBSD: test_file.c,v 1.12 2024/08/15 00:52:23 djm Exp $ */
2 /*
3  * Regress test for sshkey.h key management API
4  *
5  * Placed in the public domain
6  */
7 
8 #include <sys/types.h>
9 #include <sys/stat.h>
10 #include <fcntl.h>
11 #include <stdio.h>
12 #include <stdint.h>
13 #include <stdlib.h>
14 #include <string.h>
15 #include <unistd.h>
16 
17 #include <openssl/bn.h>
18 #include <openssl/ec.h>
19 #include <openssl/rsa.h>
20 #include <openssl/dsa.h>
21 #include <openssl/objects.h>
22 
23 #include "test_helper.h"
24 
25 #include "ssherr.h"
26 #include "authfile.h"
27 #include "sshkey.h"
28 #include "sshbuf.h"
29 #include "digest.h"
30 
31 #include "common.h"
32 
33 void sshkey_file_tests(void);
34 
35 void
36 sshkey_file_tests(void)
37 {
38 	struct sshkey *k1, *k2;
39 	struct sshbuf *buf, *pw;
40 	BIGNUM *a, *b, *c;
41 	char *cp;
42 
43 	TEST_START("load passphrase");
44 	pw = load_text_file("pw");
45 	TEST_DONE();
46 
47 
48 	TEST_START("parse RSA from private");
49 	buf = load_file("rsa_1");
50 	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf, "", &k1, NULL), 0);
51 	sshbuf_free(buf);
52 	ASSERT_PTR_NE(k1, NULL);
53 	a = load_bignum("rsa_1.param.n");
54 	b = load_bignum("rsa_1.param.p");
55 	c = load_bignum("rsa_1.param.q");
56 	ASSERT_BIGNUM_EQ(rsa_n(k1), a);
57 	ASSERT_BIGNUM_EQ(rsa_p(k1), b);
58 	ASSERT_BIGNUM_EQ(rsa_q(k1), c);
59 	BN_free(a);
60 	BN_free(b);
61 	BN_free(c);
62 	TEST_DONE();
63 
64 	TEST_START("parse RSA from private w/ passphrase");
65 	buf = load_file("rsa_1_pw");
66 	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf,
67 	    (const char *)sshbuf_ptr(pw), &k2, NULL), 0);
68 	sshbuf_free(buf);
69 	ASSERT_PTR_NE(k2, NULL);
70 	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
71 	sshkey_free(k2);
72 	TEST_DONE();
73 
74 	TEST_START("parse RSA from new-format");
75 	buf = load_file("rsa_n");
76 	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf, "", &k2, NULL), 0);
77 	sshbuf_free(buf);
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("parse RSA from new-format w/ passphrase");
84 	buf = load_file("rsa_n_pw");
85 	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf,
86 	    (const char *)sshbuf_ptr(pw), &k2, NULL), 0);
87 	sshbuf_free(buf);
88 	ASSERT_PTR_NE(k2, NULL);
89 	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
90 	sshkey_free(k2);
91 	TEST_DONE();
92 
93 	TEST_START("load RSA from public");
94 	ASSERT_INT_EQ(sshkey_load_public(test_data_file("rsa_1.pub"), &k2,
95 	    NULL), 0);
96 	ASSERT_PTR_NE(k2, NULL);
97 	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
98 	sshkey_free(k2);
99 	TEST_DONE();
100 
101 	TEST_START("load RSA cert with SHA1 signature");
102 	ASSERT_INT_EQ(sshkey_load_cert(test_data_file("rsa_1_sha1"), &k2), 0);
103 	ASSERT_PTR_NE(k2, NULL);
104 	ASSERT_INT_EQ(k2->type, KEY_RSA_CERT);
105 	ASSERT_INT_EQ(sshkey_equal_public(k1, k2), 1);
106 	ASSERT_STRING_EQ(k2->cert->signature_type, "ssh-rsa");
107 	sshkey_free(k2);
108 	TEST_DONE();
109 
110 	TEST_START("load RSA cert with SHA512 signature");
111 	ASSERT_INT_EQ(sshkey_load_cert(test_data_file("rsa_1_sha512"), &k2), 0);
112 	ASSERT_PTR_NE(k2, NULL);
113 	ASSERT_INT_EQ(k2->type, KEY_RSA_CERT);
114 	ASSERT_INT_EQ(sshkey_equal_public(k1, k2), 1);
115 	ASSERT_STRING_EQ(k2->cert->signature_type, "rsa-sha2-512");
116 	sshkey_free(k2);
117 	TEST_DONE();
118 
119 	TEST_START("load RSA cert");
120 	ASSERT_INT_EQ(sshkey_load_cert(test_data_file("rsa_1"), &k2), 0);
121 	ASSERT_PTR_NE(k2, NULL);
122 	ASSERT_INT_EQ(k2->type, KEY_RSA_CERT);
123 	ASSERT_INT_EQ(sshkey_equal(k1, k2), 0);
124 	ASSERT_INT_EQ(sshkey_equal_public(k1, k2), 1);
125 	TEST_DONE();
126 
127 	TEST_START("RSA key hex fingerprint");
128 	buf = load_text_file("rsa_1.fp");
129 	cp = sshkey_fingerprint(k1, SSH_DIGEST_SHA256, SSH_FP_BASE64);
130 	ASSERT_PTR_NE(cp, NULL);
131 	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
132 	sshbuf_free(buf);
133 	free(cp);
134 	TEST_DONE();
135 
136 	TEST_START("RSA cert hex fingerprint");
137 	buf = load_text_file("rsa_1-cert.fp");
138 	cp = sshkey_fingerprint(k2, SSH_DIGEST_SHA256, SSH_FP_BASE64);
139 	ASSERT_PTR_NE(cp, NULL);
140 	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
141 	sshbuf_free(buf);
142 	free(cp);
143 	sshkey_free(k2);
144 	TEST_DONE();
145 
146 	TEST_START("RSA key bubblebabble fingerprint");
147 	buf = load_text_file("rsa_1.fp.bb");
148 	cp = sshkey_fingerprint(k1, SSH_DIGEST_SHA1, SSH_FP_BUBBLEBABBLE);
149 	ASSERT_PTR_NE(cp, NULL);
150 	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
151 	sshbuf_free(buf);
152 	free(cp);
153 	TEST_DONE();
154 
155 	sshkey_free(k1);
156 
157 #ifdef WITH_DSA
158 	TEST_START("parse DSA from private");
159 	buf = load_file("dsa_1");
160 	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf, "", &k1, NULL), 0);
161 	sshbuf_free(buf);
162 	ASSERT_PTR_NE(k1, NULL);
163 	a = load_bignum("dsa_1.param.g");
164 	b = load_bignum("dsa_1.param.priv");
165 	c = load_bignum("dsa_1.param.pub");
166 	ASSERT_BIGNUM_EQ(dsa_g(k1), a);
167 	ASSERT_BIGNUM_EQ(dsa_priv_key(k1), b);
168 	ASSERT_BIGNUM_EQ(dsa_pub_key(k1), c);
169 	BN_free(a);
170 	BN_free(b);
171 	BN_free(c);
172 	TEST_DONE();
173 
174 	TEST_START("parse DSA from private w/ passphrase");
175 	buf = load_file("dsa_1_pw");
176 	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf,
177 	    (const char *)sshbuf_ptr(pw), &k2, NULL), 0);
178 	sshbuf_free(buf);
179 	ASSERT_PTR_NE(k2, NULL);
180 	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
181 	sshkey_free(k2);
182 	TEST_DONE();
183 
184 	TEST_START("parse DSA from new-format");
185 	buf = load_file("dsa_n");
186 	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf, "", &k2, NULL), 0);
187 	sshbuf_free(buf);
188 	ASSERT_PTR_NE(k2, NULL);
189 	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
190 	sshkey_free(k2);
191 	TEST_DONE();
192 
193 	TEST_START("parse DSA from new-format w/ passphrase");
194 	buf = load_file("dsa_n_pw");
195 	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf,
196 	    (const char *)sshbuf_ptr(pw), &k2, NULL), 0);
197 	sshbuf_free(buf);
198 	ASSERT_PTR_NE(k2, NULL);
199 	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
200 	sshkey_free(k2);
201 	TEST_DONE();
202 
203 	TEST_START("load DSA from public");
204 	ASSERT_INT_EQ(sshkey_load_public(test_data_file("dsa_1.pub"), &k2,
205 	    NULL), 0);
206 	ASSERT_PTR_NE(k2, NULL);
207 	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
208 	sshkey_free(k2);
209 	TEST_DONE();
210 
211 	TEST_START("load DSA cert");
212 	ASSERT_INT_EQ(sshkey_load_cert(test_data_file("dsa_1"), &k2), 0);
213 	ASSERT_PTR_NE(k2, NULL);
214 	ASSERT_INT_EQ(k2->type, KEY_DSA_CERT);
215 	ASSERT_INT_EQ(sshkey_equal(k1, k2), 0);
216 	ASSERT_INT_EQ(sshkey_equal_public(k1, k2), 1);
217 	TEST_DONE();
218 
219 	TEST_START("DSA key hex fingerprint");
220 	buf = load_text_file("dsa_1.fp");
221 	cp = sshkey_fingerprint(k1, SSH_DIGEST_SHA256, SSH_FP_BASE64);
222 	ASSERT_PTR_NE(cp, NULL);
223 	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
224 	sshbuf_free(buf);
225 	free(cp);
226 	TEST_DONE();
227 
228 	TEST_START("DSA cert hex fingerprint");
229 	buf = load_text_file("dsa_1-cert.fp");
230 	cp = sshkey_fingerprint(k2, SSH_DIGEST_SHA256, SSH_FP_BASE64);
231 	ASSERT_PTR_NE(cp, NULL);
232 	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
233 	sshbuf_free(buf);
234 	free(cp);
235 	sshkey_free(k2);
236 	TEST_DONE();
237 
238 	TEST_START("DSA key bubblebabble fingerprint");
239 	buf = load_text_file("dsa_1.fp.bb");
240 	cp = sshkey_fingerprint(k1, SSH_DIGEST_SHA1, SSH_FP_BUBBLEBABBLE);
241 	ASSERT_PTR_NE(cp, NULL);
242 	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
243 	sshbuf_free(buf);
244 	free(cp);
245 	TEST_DONE();
246 
247 	sshkey_free(k1);
248 #endif
249 
250 	TEST_START("parse ECDSA from private");
251 	buf = load_file("ecdsa_1");
252 	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf, "", &k1, NULL), 0);
253 	sshbuf_free(buf);
254 	ASSERT_PTR_NE(k1, NULL);
255 	buf = load_text_file("ecdsa_1.param.curve");
256 	ASSERT_STRING_EQ((const char *)sshbuf_ptr(buf),
257 	    OBJ_nid2sn(k1->ecdsa_nid));
258 	sshbuf_free(buf);
259 	a = load_bignum("ecdsa_1.param.priv");
260 	b = load_bignum("ecdsa_1.param.pub");
261 	c = EC_POINT_point2bn(EC_KEY_get0_group(EVP_PKEY_get0_EC_KEY(k1->pkey)),
262 	    EC_KEY_get0_public_key(EVP_PKEY_get0_EC_KEY(k1->pkey)),
263 	    POINT_CONVERSION_UNCOMPRESSED, NULL, NULL);
264 	ASSERT_PTR_NE(c, NULL);
265 	ASSERT_BIGNUM_EQ(
266 	    EC_KEY_get0_private_key(EVP_PKEY_get0_EC_KEY(k1->pkey)), a);
267 	ASSERT_BIGNUM_EQ(b, c);
268 	BN_free(a);
269 	BN_free(b);
270 	BN_free(c);
271 	TEST_DONE();
272 
273 	TEST_START("parse ECDSA from private w/ passphrase");
274 	buf = load_file("ecdsa_1_pw");
275 	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf,
276 	    (const char *)sshbuf_ptr(pw), &k2, NULL), 0);
277 	sshbuf_free(buf);
278 	ASSERT_PTR_NE(k2, NULL);
279 	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
280 	sshkey_free(k2);
281 	TEST_DONE();
282 
283 	TEST_START("parse ECDSA from new-format");
284 	buf = load_file("ecdsa_n");
285 	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf, "", &k2, NULL), 0);
286 	sshbuf_free(buf);
287 	ASSERT_PTR_NE(k2, NULL);
288 	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
289 	sshkey_free(k2);
290 	TEST_DONE();
291 
292 	TEST_START("parse ECDSA from new-format w/ passphrase");
293 	buf = load_file("ecdsa_n_pw");
294 	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf,
295 	    (const char *)sshbuf_ptr(pw), &k2, NULL), 0);
296 	sshbuf_free(buf);
297 	ASSERT_PTR_NE(k2, NULL);
298 	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
299 	sshkey_free(k2);
300 	TEST_DONE();
301 
302 	TEST_START("load ECDSA from public");
303 	ASSERT_INT_EQ(sshkey_load_public(test_data_file("ecdsa_1.pub"), &k2,
304 	    NULL), 0);
305 	ASSERT_PTR_NE(k2, NULL);
306 	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
307 	sshkey_free(k2);
308 	TEST_DONE();
309 
310 	TEST_START("load ECDSA cert");
311 	ASSERT_INT_EQ(sshkey_load_cert(test_data_file("ecdsa_1"), &k2), 0);
312 	ASSERT_PTR_NE(k2, NULL);
313 	ASSERT_INT_EQ(k2->type, KEY_ECDSA_CERT);
314 	ASSERT_INT_EQ(sshkey_equal(k1, k2), 0);
315 	ASSERT_INT_EQ(sshkey_equal_public(k1, k2), 1);
316 	TEST_DONE();
317 
318 	TEST_START("ECDSA key hex fingerprint");
319 	buf = load_text_file("ecdsa_1.fp");
320 	cp = sshkey_fingerprint(k1, SSH_DIGEST_SHA256, SSH_FP_BASE64);
321 	ASSERT_PTR_NE(cp, NULL);
322 	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
323 	sshbuf_free(buf);
324 	free(cp);
325 	TEST_DONE();
326 
327 	TEST_START("ECDSA cert hex fingerprint");
328 	buf = load_text_file("ecdsa_1-cert.fp");
329 	cp = sshkey_fingerprint(k2, SSH_DIGEST_SHA256, SSH_FP_BASE64);
330 	ASSERT_PTR_NE(cp, NULL);
331 	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
332 	sshbuf_free(buf);
333 	free(cp);
334 	sshkey_free(k2);
335 	TEST_DONE();
336 
337 	TEST_START("ECDSA key bubblebabble fingerprint");
338 	buf = load_text_file("ecdsa_1.fp.bb");
339 	cp = sshkey_fingerprint(k1, SSH_DIGEST_SHA1, SSH_FP_BUBBLEBABBLE);
340 	ASSERT_PTR_NE(cp, NULL);
341 	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
342 	sshbuf_free(buf);
343 	free(cp);
344 	TEST_DONE();
345 
346 	sshkey_free(k1);
347 
348 	TEST_START("parse Ed25519 from private");
349 	buf = load_file("ed25519_1");
350 	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf, "", &k1, NULL), 0);
351 	sshbuf_free(buf);
352 	ASSERT_PTR_NE(k1, NULL);
353 	ASSERT_INT_EQ(k1->type, KEY_ED25519);
354 	/* XXX check key contents */
355 	TEST_DONE();
356 
357 	TEST_START("parse Ed25519 from private w/ passphrase");
358 	buf = load_file("ed25519_1_pw");
359 	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf,
360 	    (const char *)sshbuf_ptr(pw), &k2, NULL), 0);
361 	sshbuf_free(buf);
362 	ASSERT_PTR_NE(k2, NULL);
363 	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
364 	sshkey_free(k2);
365 	TEST_DONE();
366 
367 	TEST_START("load Ed25519 from public");
368 	ASSERT_INT_EQ(sshkey_load_public(test_data_file("ed25519_1.pub"), &k2,
369 	    NULL), 0);
370 	ASSERT_PTR_NE(k2, NULL);
371 	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
372 	sshkey_free(k2);
373 	TEST_DONE();
374 
375 	TEST_START("load Ed25519 cert");
376 	ASSERT_INT_EQ(sshkey_load_cert(test_data_file("ed25519_1"), &k2), 0);
377 	ASSERT_PTR_NE(k2, NULL);
378 	ASSERT_INT_EQ(k2->type, KEY_ED25519_CERT);
379 	ASSERT_INT_EQ(sshkey_equal(k1, k2), 0);
380 	ASSERT_INT_EQ(sshkey_equal_public(k1, k2), 1);
381 	TEST_DONE();
382 
383 	TEST_START("Ed25519 key hex fingerprint");
384 	buf = load_text_file("ed25519_1.fp");
385 	cp = sshkey_fingerprint(k1, SSH_DIGEST_SHA256, SSH_FP_BASE64);
386 	ASSERT_PTR_NE(cp, NULL);
387 	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
388 	sshbuf_free(buf);
389 	free(cp);
390 	TEST_DONE();
391 
392 	TEST_START("Ed25519 cert hex fingerprint");
393 	buf = load_text_file("ed25519_1-cert.fp");
394 	cp = sshkey_fingerprint(k2, SSH_DIGEST_SHA256, SSH_FP_BASE64);
395 	ASSERT_PTR_NE(cp, NULL);
396 	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
397 	sshbuf_free(buf);
398 	free(cp);
399 	sshkey_free(k2);
400 	TEST_DONE();
401 
402 	TEST_START("Ed25519 key bubblebabble fingerprint");
403 	buf = load_text_file("ed25519_1.fp.bb");
404 	cp = sshkey_fingerprint(k1, SSH_DIGEST_SHA1, SSH_FP_BUBBLEBABBLE);
405 	ASSERT_PTR_NE(cp, NULL);
406 	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
407 	sshbuf_free(buf);
408 	free(cp);
409 	TEST_DONE();
410 
411 	sshkey_free(k1);
412 
413 	TEST_START("parse ECDSA-SK from private");
414 	buf = load_file("ecdsa_sk1");
415 	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf, "", &k1, NULL), 0);
416 	sshbuf_free(buf);
417 	ASSERT_PTR_NE(k1, NULL);
418 	ASSERT_INT_EQ(k1->type, KEY_ECDSA_SK);
419 	TEST_DONE();
420 
421 	TEST_START("parse ECDSA-SK from private w/ passphrase");
422 	buf = load_file("ecdsa_sk1_pw");
423 	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf,
424 	    (const char *)sshbuf_ptr(pw), &k2, NULL), 0);
425 	sshbuf_free(buf);
426 	ASSERT_PTR_NE(k2, NULL);
427 	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
428 	sshkey_free(k2);
429 	TEST_DONE();
430 
431 	TEST_START("load ECDSA-SK from public");
432 	ASSERT_INT_EQ(sshkey_load_public(test_data_file("ecdsa_sk1.pub"), &k2,
433 	    NULL), 0);
434 	ASSERT_PTR_NE(k2, NULL);
435 	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
436 	sshkey_free(k2);
437 	TEST_DONE();
438 
439 	TEST_START("load ECDSA-SK cert");
440 	ASSERT_INT_EQ(sshkey_load_cert(test_data_file("ecdsa_sk1"), &k2), 0);
441 	ASSERT_PTR_NE(k2, NULL);
442 	ASSERT_INT_EQ(k2->type, KEY_ECDSA_SK_CERT);
443 	ASSERT_INT_EQ(sshkey_equal(k1, k2), 0);
444 	ASSERT_INT_EQ(sshkey_equal_public(k1, k2), 1);
445 	TEST_DONE();
446 
447 	TEST_START("ECDSA-SK key hex fingerprint");
448 	buf = load_text_file("ecdsa_sk1.fp");
449 	cp = sshkey_fingerprint(k1, SSH_DIGEST_SHA256, SSH_FP_BASE64);
450 	ASSERT_PTR_NE(cp, NULL);
451 	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
452 	sshbuf_free(buf);
453 	free(cp);
454 	TEST_DONE();
455 
456 	TEST_START("ECDSA-SK cert hex fingerprint");
457 	buf = load_text_file("ecdsa_sk1-cert.fp");
458 	cp = sshkey_fingerprint(k2, SSH_DIGEST_SHA256, SSH_FP_BASE64);
459 	ASSERT_PTR_NE(cp, NULL);
460 	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
461 	sshbuf_free(buf);
462 	free(cp);
463 	sshkey_free(k2);
464 	TEST_DONE();
465 
466 	TEST_START("ECDSA-SK key bubblebabble fingerprint");
467 	buf = load_text_file("ecdsa_sk1.fp.bb");
468 	cp = sshkey_fingerprint(k1, SSH_DIGEST_SHA1, SSH_FP_BUBBLEBABBLE);
469 	ASSERT_PTR_NE(cp, NULL);
470 	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
471 	sshbuf_free(buf);
472 	free(cp);
473 	TEST_DONE();
474 
475 	sshkey_free(k1);
476 
477 	TEST_START("parse Ed25519-SK from private");
478 	buf = load_file("ed25519_sk1");
479 	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf, "", &k1, NULL), 0);
480 	sshbuf_free(buf);
481 	ASSERT_PTR_NE(k1, NULL);
482 	ASSERT_INT_EQ(k1->type, KEY_ED25519_SK);
483 	/* XXX check key contents */
484 	TEST_DONE();
485 
486 	TEST_START("parse Ed25519-SK from private w/ passphrase");
487 	buf = load_file("ed25519_sk1_pw");
488 	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf,
489 	    (const char *)sshbuf_ptr(pw), &k2, NULL), 0);
490 	sshbuf_free(buf);
491 	ASSERT_PTR_NE(k2, NULL);
492 	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
493 	sshkey_free(k2);
494 	TEST_DONE();
495 
496 	TEST_START("load Ed25519-SK from public");
497 	ASSERT_INT_EQ(sshkey_load_public(test_data_file("ed25519_sk1.pub"),
498 	    &k2, NULL), 0);
499 	ASSERT_PTR_NE(k2, NULL);
500 	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
501 	sshkey_free(k2);
502 	TEST_DONE();
503 
504 	TEST_START("load Ed25519-SK cert");
505 	ASSERT_INT_EQ(sshkey_load_cert(test_data_file("ed25519_sk1"), &k2), 0);
506 	ASSERT_PTR_NE(k2, NULL);
507 	ASSERT_INT_EQ(k2->type, KEY_ED25519_SK_CERT);
508 	ASSERT_INT_EQ(sshkey_equal(k1, k2), 0);
509 	ASSERT_INT_EQ(sshkey_equal_public(k1, k2), 1);
510 	TEST_DONE();
511 
512 	TEST_START("Ed25519-SK key hex fingerprint");
513 	buf = load_text_file("ed25519_sk1.fp");
514 	cp = sshkey_fingerprint(k1, SSH_DIGEST_SHA256, SSH_FP_BASE64);
515 	ASSERT_PTR_NE(cp, NULL);
516 	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
517 	sshbuf_free(buf);
518 	free(cp);
519 	TEST_DONE();
520 
521 	TEST_START("Ed25519-SK cert hex fingerprint");
522 	buf = load_text_file("ed25519_sk1-cert.fp");
523 	cp = sshkey_fingerprint(k2, SSH_DIGEST_SHA256, SSH_FP_BASE64);
524 	ASSERT_PTR_NE(cp, NULL);
525 	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
526 	sshbuf_free(buf);
527 	free(cp);
528 	sshkey_free(k2);
529 	TEST_DONE();
530 
531 	TEST_START("Ed25519-SK key bubblebabble fingerprint");
532 	buf = load_text_file("ed25519_sk1.fp.bb");
533 	cp = sshkey_fingerprint(k1, SSH_DIGEST_SHA1, SSH_FP_BUBBLEBABBLE);
534 	ASSERT_PTR_NE(cp, NULL);
535 	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
536 	sshbuf_free(buf);
537 	free(cp);
538 	TEST_DONE();
539 
540 	sshkey_free(k1);
541 
542 	sshbuf_free(pw);
543 
544 }
545