1296781Sdes/* 	$OpenBSD: test_file.c,v 1.5 2015/10/06 01:20:59 djm Exp $ */
2276707Sdes/*
3276707Sdes * Regress test for sshkey.h key management API
4276707Sdes *
5276707Sdes * Placed in the public domain
6276707Sdes */
7276707Sdes
8276707Sdes#include "includes.h"
9276707Sdes
10276707Sdes#include <sys/types.h>
11276707Sdes#include <sys/param.h>
12276707Sdes#include <sys/stat.h>
13276707Sdes#include <fcntl.h>
14276707Sdes#include <stdio.h>
15276707Sdes#ifdef HAVE_STDINT_H
16276707Sdes#include <stdint.h>
17276707Sdes#endif
18276707Sdes#include <stdlib.h>
19276707Sdes#include <string.h>
20276707Sdes#include <unistd.h>
21276707Sdes
22276707Sdes#include <openssl/bn.h>
23276707Sdes#include <openssl/rsa.h>
24276707Sdes#include <openssl/dsa.h>
25276707Sdes#include <openssl/objects.h>
26276707Sdes#ifdef OPENSSL_HAS_NISTP256
27276707Sdes# include <openssl/ec.h>
28276707Sdes#endif
29276707Sdes
30276707Sdes#include "../test_helper/test_helper.h"
31276707Sdes
32276707Sdes#include "ssherr.h"
33276707Sdes#include "authfile.h"
34276707Sdes#include "sshkey.h"
35276707Sdes#include "sshbuf.h"
36295367Sdes#include "digest.h"
37276707Sdes
38276707Sdes#include "common.h"
39276707Sdes
40276707Sdesvoid sshkey_file_tests(void);
41276707Sdes
42276707Sdesvoid
43276707Sdessshkey_file_tests(void)
44276707Sdes{
45276707Sdes	struct sshkey *k1, *k2;
46276707Sdes	struct sshbuf *buf, *pw;
47276707Sdes	BIGNUM *a, *b, *c;
48276707Sdes	char *cp;
49276707Sdes
50276707Sdes	TEST_START("load passphrase");
51276707Sdes	pw = load_text_file("pw");
52276707Sdes	TEST_DONE();
53276707Sdes
54295367Sdes#ifdef WITH_SSH1
55276707Sdes	TEST_START("parse RSA1 from private");
56276707Sdes	buf = load_file("rsa1_1");
57296781Sdes	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf, "", &k1, NULL), 0);
58276707Sdes	sshbuf_free(buf);
59276707Sdes	ASSERT_PTR_NE(k1, NULL);
60276707Sdes	a = load_bignum("rsa1_1.param.n");
61276707Sdes	ASSERT_BIGNUM_EQ(k1->rsa->n, a);
62276707Sdes	BN_free(a);
63276707Sdes	TEST_DONE();
64276707Sdes
65276707Sdes	TEST_START("parse RSA1 from private w/ passphrase");
66276707Sdes	buf = load_file("rsa1_1_pw");
67276707Sdes	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf,
68296781Sdes	    (const char *)sshbuf_ptr(pw), &k2, NULL), 0);
69276707Sdes	sshbuf_free(buf);
70276707Sdes	ASSERT_PTR_NE(k2, NULL);
71276707Sdes	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
72276707Sdes	sshkey_free(k2);
73276707Sdes	TEST_DONE();
74276707Sdes
75276707Sdes	TEST_START("load RSA1 from public");
76276707Sdes	ASSERT_INT_EQ(sshkey_load_public(test_data_file("rsa1_1.pub"), &k2,
77276707Sdes	    NULL), 0);
78276707Sdes	ASSERT_PTR_NE(k2, NULL);
79276707Sdes	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
80276707Sdes	sshkey_free(k2);
81276707Sdes	TEST_DONE();
82276707Sdes
83276707Sdes	TEST_START("RSA1 key hex fingerprint");
84276707Sdes	buf = load_text_file("rsa1_1.fp");
85295367Sdes	cp = sshkey_fingerprint(k1, SSH_DIGEST_SHA256, SSH_FP_BASE64);
86276707Sdes	ASSERT_PTR_NE(cp, NULL);
87276707Sdes	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
88276707Sdes	sshbuf_free(buf);
89276707Sdes	free(cp);
90276707Sdes	TEST_DONE();
91276707Sdes
92276707Sdes	TEST_START("RSA1 key bubblebabble fingerprint");
93276707Sdes	buf = load_text_file("rsa1_1.fp.bb");
94295367Sdes	cp = sshkey_fingerprint(k1, SSH_DIGEST_SHA1, SSH_FP_BUBBLEBABBLE);
95276707Sdes	ASSERT_PTR_NE(cp, NULL);
96276707Sdes	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
97276707Sdes	sshbuf_free(buf);
98276707Sdes	free(cp);
99276707Sdes	TEST_DONE();
100276707Sdes
101276707Sdes	sshkey_free(k1);
102295367Sdes#endif
103276707Sdes
104276707Sdes	TEST_START("parse RSA from private");
105276707Sdes	buf = load_file("rsa_1");
106296781Sdes	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf, "", &k1, NULL), 0);
107276707Sdes	sshbuf_free(buf);
108276707Sdes	ASSERT_PTR_NE(k1, NULL);
109276707Sdes	a = load_bignum("rsa_1.param.n");
110276707Sdes	b = load_bignum("rsa_1.param.p");
111276707Sdes	c = load_bignum("rsa_1.param.q");
112276707Sdes	ASSERT_BIGNUM_EQ(k1->rsa->n, a);
113276707Sdes	ASSERT_BIGNUM_EQ(k1->rsa->p, b);
114276707Sdes	ASSERT_BIGNUM_EQ(k1->rsa->q, c);
115276707Sdes	BN_free(a);
116276707Sdes	BN_free(b);
117276707Sdes	BN_free(c);
118276707Sdes	TEST_DONE();
119276707Sdes
120276707Sdes	TEST_START("parse RSA from private w/ passphrase");
121276707Sdes	buf = load_file("rsa_1_pw");
122276707Sdes	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf,
123296781Sdes	    (const char *)sshbuf_ptr(pw), &k2, NULL), 0);
124276707Sdes	sshbuf_free(buf);
125276707Sdes	ASSERT_PTR_NE(k2, NULL);
126276707Sdes	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
127276707Sdes	sshkey_free(k2);
128276707Sdes	TEST_DONE();
129276707Sdes
130276707Sdes	TEST_START("parse RSA from new-format");
131276707Sdes	buf = load_file("rsa_n");
132296781Sdes	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf, "", &k2, NULL), 0);
133276707Sdes	sshbuf_free(buf);
134276707Sdes	ASSERT_PTR_NE(k2, NULL);
135276707Sdes	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
136276707Sdes	sshkey_free(k2);
137276707Sdes	TEST_DONE();
138276707Sdes
139276707Sdes	TEST_START("parse RSA from new-format w/ passphrase");
140276707Sdes	buf = load_file("rsa_n_pw");
141276707Sdes	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf,
142296781Sdes	    (const char *)sshbuf_ptr(pw), &k2, NULL), 0);
143276707Sdes	sshbuf_free(buf);
144276707Sdes	ASSERT_PTR_NE(k2, NULL);
145276707Sdes	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
146276707Sdes	sshkey_free(k2);
147276707Sdes	TEST_DONE();
148276707Sdes
149276707Sdes	TEST_START("load RSA from public");
150276707Sdes	ASSERT_INT_EQ(sshkey_load_public(test_data_file("rsa_1.pub"), &k2,
151276707Sdes	    NULL), 0);
152276707Sdes	ASSERT_PTR_NE(k2, NULL);
153276707Sdes	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
154276707Sdes	sshkey_free(k2);
155276707Sdes	TEST_DONE();
156276707Sdes
157276707Sdes	TEST_START("load RSA cert");
158276707Sdes	ASSERT_INT_EQ(sshkey_load_cert(test_data_file("rsa_1"), &k2), 0);
159276707Sdes	ASSERT_PTR_NE(k2, NULL);
160276707Sdes	ASSERT_INT_EQ(k2->type, KEY_RSA_CERT);
161276707Sdes	ASSERT_INT_EQ(sshkey_equal(k1, k2), 0);
162276707Sdes	ASSERT_INT_EQ(sshkey_equal_public(k1, k2), 1);
163276707Sdes	TEST_DONE();
164276707Sdes
165276707Sdes	TEST_START("RSA key hex fingerprint");
166276707Sdes	buf = load_text_file("rsa_1.fp");
167295367Sdes	cp = sshkey_fingerprint(k1, SSH_DIGEST_SHA256, SSH_FP_BASE64);
168276707Sdes	ASSERT_PTR_NE(cp, NULL);
169276707Sdes	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
170276707Sdes	sshbuf_free(buf);
171276707Sdes	free(cp);
172276707Sdes	TEST_DONE();
173276707Sdes
174276707Sdes	TEST_START("RSA cert hex fingerprint");
175276707Sdes	buf = load_text_file("rsa_1-cert.fp");
176295367Sdes	cp = sshkey_fingerprint(k2, SSH_DIGEST_SHA256, SSH_FP_BASE64);
177276707Sdes	ASSERT_PTR_NE(cp, NULL);
178276707Sdes	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
179276707Sdes	sshbuf_free(buf);
180276707Sdes	free(cp);
181276707Sdes	sshkey_free(k2);
182276707Sdes	TEST_DONE();
183276707Sdes
184276707Sdes	TEST_START("RSA key bubblebabble fingerprint");
185276707Sdes	buf = load_text_file("rsa_1.fp.bb");
186295367Sdes	cp = sshkey_fingerprint(k1, SSH_DIGEST_SHA1, SSH_FP_BUBBLEBABBLE);
187276707Sdes	ASSERT_PTR_NE(cp, NULL);
188276707Sdes	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
189276707Sdes	sshbuf_free(buf);
190276707Sdes	free(cp);
191276707Sdes	TEST_DONE();
192276707Sdes
193276707Sdes	sshkey_free(k1);
194276707Sdes
195276707Sdes	TEST_START("parse DSA from private");
196276707Sdes	buf = load_file("dsa_1");
197296781Sdes	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf, "", &k1, NULL), 0);
198276707Sdes	sshbuf_free(buf);
199276707Sdes	ASSERT_PTR_NE(k1, NULL);
200276707Sdes	a = load_bignum("dsa_1.param.g");
201276707Sdes	b = load_bignum("dsa_1.param.priv");
202276707Sdes	c = load_bignum("dsa_1.param.pub");
203276707Sdes	ASSERT_BIGNUM_EQ(k1->dsa->g, a);
204276707Sdes	ASSERT_BIGNUM_EQ(k1->dsa->priv_key, b);
205276707Sdes	ASSERT_BIGNUM_EQ(k1->dsa->pub_key, c);
206276707Sdes	BN_free(a);
207276707Sdes	BN_free(b);
208276707Sdes	BN_free(c);
209276707Sdes	TEST_DONE();
210276707Sdes
211276707Sdes	TEST_START("parse DSA from private w/ passphrase");
212276707Sdes	buf = load_file("dsa_1_pw");
213276707Sdes	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf,
214296781Sdes	    (const char *)sshbuf_ptr(pw), &k2, NULL), 0);
215276707Sdes	sshbuf_free(buf);
216276707Sdes	ASSERT_PTR_NE(k2, NULL);
217276707Sdes	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
218276707Sdes	sshkey_free(k2);
219276707Sdes	TEST_DONE();
220276707Sdes
221276707Sdes	TEST_START("parse DSA from new-format");
222276707Sdes	buf = load_file("dsa_n");
223296781Sdes	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf, "", &k2, NULL), 0);
224276707Sdes	sshbuf_free(buf);
225276707Sdes	ASSERT_PTR_NE(k2, NULL);
226276707Sdes	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
227276707Sdes	sshkey_free(k2);
228276707Sdes	TEST_DONE();
229276707Sdes
230276707Sdes	TEST_START("parse DSA from new-format w/ passphrase");
231276707Sdes	buf = load_file("dsa_n_pw");
232276707Sdes	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf,
233296781Sdes	    (const char *)sshbuf_ptr(pw), &k2, NULL), 0);
234276707Sdes	sshbuf_free(buf);
235276707Sdes	ASSERT_PTR_NE(k2, NULL);
236276707Sdes	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
237276707Sdes	sshkey_free(k2);
238276707Sdes	TEST_DONE();
239276707Sdes
240276707Sdes	TEST_START("load DSA from public");
241276707Sdes	ASSERT_INT_EQ(sshkey_load_public(test_data_file("dsa_1.pub"), &k2,
242276707Sdes	    NULL), 0);
243276707Sdes	ASSERT_PTR_NE(k2, NULL);
244276707Sdes	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
245276707Sdes	sshkey_free(k2);
246276707Sdes	TEST_DONE();
247276707Sdes
248276707Sdes	TEST_START("load DSA cert");
249276707Sdes	ASSERT_INT_EQ(sshkey_load_cert(test_data_file("dsa_1"), &k2), 0);
250276707Sdes	ASSERT_PTR_NE(k2, NULL);
251276707Sdes	ASSERT_INT_EQ(k2->type, KEY_DSA_CERT);
252276707Sdes	ASSERT_INT_EQ(sshkey_equal(k1, k2), 0);
253276707Sdes	ASSERT_INT_EQ(sshkey_equal_public(k1, k2), 1);
254276707Sdes	TEST_DONE();
255276707Sdes
256276707Sdes	TEST_START("DSA key hex fingerprint");
257276707Sdes	buf = load_text_file("dsa_1.fp");
258295367Sdes	cp = sshkey_fingerprint(k1, SSH_DIGEST_SHA256, SSH_FP_BASE64);
259276707Sdes	ASSERT_PTR_NE(cp, NULL);
260276707Sdes	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
261276707Sdes	sshbuf_free(buf);
262276707Sdes	free(cp);
263276707Sdes	TEST_DONE();
264276707Sdes
265276707Sdes	TEST_START("DSA cert hex fingerprint");
266276707Sdes	buf = load_text_file("dsa_1-cert.fp");
267295367Sdes	cp = sshkey_fingerprint(k2, SSH_DIGEST_SHA256, SSH_FP_BASE64);
268276707Sdes	ASSERT_PTR_NE(cp, NULL);
269276707Sdes	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
270276707Sdes	sshbuf_free(buf);
271276707Sdes	free(cp);
272276707Sdes	sshkey_free(k2);
273276707Sdes	TEST_DONE();
274276707Sdes
275276707Sdes	TEST_START("DSA key bubblebabble fingerprint");
276276707Sdes	buf = load_text_file("dsa_1.fp.bb");
277295367Sdes	cp = sshkey_fingerprint(k1, SSH_DIGEST_SHA1, SSH_FP_BUBBLEBABBLE);
278276707Sdes	ASSERT_PTR_NE(cp, NULL);
279276707Sdes	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
280276707Sdes	sshbuf_free(buf);
281276707Sdes	free(cp);
282276707Sdes	TEST_DONE();
283276707Sdes
284276707Sdes	sshkey_free(k1);
285276707Sdes
286276707Sdes#ifdef OPENSSL_HAS_ECC
287276707Sdes	TEST_START("parse ECDSA from private");
288276707Sdes	buf = load_file("ecdsa_1");
289296781Sdes	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf, "", &k1, NULL), 0);
290276707Sdes	sshbuf_free(buf);
291276707Sdes	ASSERT_PTR_NE(k1, NULL);
292276707Sdes	buf = load_text_file("ecdsa_1.param.curve");
293276707Sdes	ASSERT_STRING_EQ((const char *)sshbuf_ptr(buf),
294276707Sdes	    OBJ_nid2sn(k1->ecdsa_nid));
295276707Sdes	sshbuf_free(buf);
296276707Sdes	a = load_bignum("ecdsa_1.param.priv");
297276707Sdes	b = load_bignum("ecdsa_1.param.pub");
298276707Sdes	c = EC_POINT_point2bn(EC_KEY_get0_group(k1->ecdsa),
299276707Sdes	    EC_KEY_get0_public_key(k1->ecdsa), POINT_CONVERSION_UNCOMPRESSED,
300276707Sdes	    NULL, NULL);
301276707Sdes	ASSERT_PTR_NE(c, NULL);
302276707Sdes	ASSERT_BIGNUM_EQ(EC_KEY_get0_private_key(k1->ecdsa), a);
303276707Sdes	ASSERT_BIGNUM_EQ(b, c);
304276707Sdes	BN_free(a);
305276707Sdes	BN_free(b);
306276707Sdes	BN_free(c);
307276707Sdes	TEST_DONE();
308276707Sdes
309276707Sdes	TEST_START("parse ECDSA from private w/ passphrase");
310276707Sdes	buf = load_file("ecdsa_1_pw");
311276707Sdes	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf,
312296781Sdes	    (const char *)sshbuf_ptr(pw), &k2, NULL), 0);
313276707Sdes	sshbuf_free(buf);
314276707Sdes	ASSERT_PTR_NE(k2, NULL);
315276707Sdes	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
316276707Sdes	sshkey_free(k2);
317276707Sdes	TEST_DONE();
318276707Sdes
319276707Sdes	TEST_START("parse ECDSA from new-format");
320276707Sdes	buf = load_file("ecdsa_n");
321296781Sdes	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf, "", &k2, NULL), 0);
322276707Sdes	sshbuf_free(buf);
323276707Sdes	ASSERT_PTR_NE(k2, NULL);
324276707Sdes	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
325276707Sdes	sshkey_free(k2);
326276707Sdes	TEST_DONE();
327276707Sdes
328276707Sdes	TEST_START("parse ECDSA from new-format w/ passphrase");
329276707Sdes	buf = load_file("ecdsa_n_pw");
330276707Sdes	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf,
331296781Sdes	    (const char *)sshbuf_ptr(pw), &k2, NULL), 0);
332276707Sdes	sshbuf_free(buf);
333276707Sdes	ASSERT_PTR_NE(k2, NULL);
334276707Sdes	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
335276707Sdes	sshkey_free(k2);
336276707Sdes	TEST_DONE();
337276707Sdes
338276707Sdes	TEST_START("load ECDSA from public");
339276707Sdes	ASSERT_INT_EQ(sshkey_load_public(test_data_file("ecdsa_1.pub"), &k2,
340276707Sdes	    NULL), 0);
341276707Sdes	ASSERT_PTR_NE(k2, NULL);
342276707Sdes	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
343276707Sdes	sshkey_free(k2);
344276707Sdes	TEST_DONE();
345276707Sdes
346276707Sdes	TEST_START("load ECDSA cert");
347276707Sdes	ASSERT_INT_EQ(sshkey_load_cert(test_data_file("ecdsa_1"), &k2), 0);
348276707Sdes	ASSERT_PTR_NE(k2, NULL);
349276707Sdes	ASSERT_INT_EQ(k2->type, KEY_ECDSA_CERT);
350276707Sdes	ASSERT_INT_EQ(sshkey_equal(k1, k2), 0);
351276707Sdes	ASSERT_INT_EQ(sshkey_equal_public(k1, k2), 1);
352276707Sdes	TEST_DONE();
353276707Sdes
354276707Sdes	TEST_START("ECDSA key hex fingerprint");
355276707Sdes	buf = load_text_file("ecdsa_1.fp");
356295367Sdes	cp = sshkey_fingerprint(k1, SSH_DIGEST_SHA256, SSH_FP_BASE64);
357276707Sdes	ASSERT_PTR_NE(cp, NULL);
358276707Sdes	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
359276707Sdes	sshbuf_free(buf);
360276707Sdes	free(cp);
361276707Sdes	TEST_DONE();
362276707Sdes
363276707Sdes	TEST_START("ECDSA cert hex fingerprint");
364276707Sdes	buf = load_text_file("ecdsa_1-cert.fp");
365295367Sdes	cp = sshkey_fingerprint(k2, SSH_DIGEST_SHA256, SSH_FP_BASE64);
366276707Sdes	ASSERT_PTR_NE(cp, NULL);
367276707Sdes	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
368276707Sdes	sshbuf_free(buf);
369276707Sdes	free(cp);
370276707Sdes	sshkey_free(k2);
371276707Sdes	TEST_DONE();
372276707Sdes
373276707Sdes	TEST_START("ECDSA key bubblebabble fingerprint");
374276707Sdes	buf = load_text_file("ecdsa_1.fp.bb");
375295367Sdes	cp = sshkey_fingerprint(k1, SSH_DIGEST_SHA1, SSH_FP_BUBBLEBABBLE);
376276707Sdes	ASSERT_PTR_NE(cp, NULL);
377276707Sdes	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
378276707Sdes	sshbuf_free(buf);
379276707Sdes	free(cp);
380276707Sdes	TEST_DONE();
381276707Sdes
382276707Sdes	sshkey_free(k1);
383276707Sdes#endif /* OPENSSL_HAS_ECC */
384276707Sdes
385276707Sdes	TEST_START("parse Ed25519 from private");
386276707Sdes	buf = load_file("ed25519_1");
387296781Sdes	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf, "", &k1, NULL), 0);
388276707Sdes	sshbuf_free(buf);
389276707Sdes	ASSERT_PTR_NE(k1, NULL);
390276707Sdes	ASSERT_INT_EQ(k1->type, KEY_ED25519);
391276707Sdes	/* XXX check key contents */
392276707Sdes	TEST_DONE();
393276707Sdes
394276707Sdes	TEST_START("parse Ed25519 from private w/ passphrase");
395276707Sdes	buf = load_file("ed25519_1_pw");
396276707Sdes	ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf,
397296781Sdes	    (const char *)sshbuf_ptr(pw), &k2, NULL), 0);
398276707Sdes	sshbuf_free(buf);
399276707Sdes	ASSERT_PTR_NE(k2, NULL);
400276707Sdes	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
401276707Sdes	sshkey_free(k2);
402276707Sdes	TEST_DONE();
403276707Sdes
404276707Sdes	TEST_START("load Ed25519 from public");
405276707Sdes	ASSERT_INT_EQ(sshkey_load_public(test_data_file("ed25519_1.pub"), &k2,
406276707Sdes	    NULL), 0);
407276707Sdes	ASSERT_PTR_NE(k2, NULL);
408276707Sdes	ASSERT_INT_EQ(sshkey_equal(k1, k2), 1);
409276707Sdes	sshkey_free(k2);
410276707Sdes	TEST_DONE();
411276707Sdes
412276707Sdes	TEST_START("load Ed25519 cert");
413276707Sdes	ASSERT_INT_EQ(sshkey_load_cert(test_data_file("ed25519_1"), &k2), 0);
414276707Sdes	ASSERT_PTR_NE(k2, NULL);
415276707Sdes	ASSERT_INT_EQ(k2->type, KEY_ED25519_CERT);
416276707Sdes	ASSERT_INT_EQ(sshkey_equal(k1, k2), 0);
417276707Sdes	ASSERT_INT_EQ(sshkey_equal_public(k1, k2), 1);
418276707Sdes	TEST_DONE();
419276707Sdes
420276707Sdes	TEST_START("Ed25519 key hex fingerprint");
421276707Sdes	buf = load_text_file("ed25519_1.fp");
422295367Sdes	cp = sshkey_fingerprint(k1, SSH_DIGEST_SHA256, SSH_FP_BASE64);
423276707Sdes	ASSERT_PTR_NE(cp, NULL);
424276707Sdes	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
425276707Sdes	sshbuf_free(buf);
426276707Sdes	free(cp);
427276707Sdes	TEST_DONE();
428276707Sdes
429276707Sdes	TEST_START("Ed25519 cert hex fingerprint");
430276707Sdes	buf = load_text_file("ed25519_1-cert.fp");
431295367Sdes	cp = sshkey_fingerprint(k2, SSH_DIGEST_SHA256, SSH_FP_BASE64);
432276707Sdes	ASSERT_PTR_NE(cp, NULL);
433276707Sdes	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
434276707Sdes	sshbuf_free(buf);
435276707Sdes	free(cp);
436276707Sdes	sshkey_free(k2);
437276707Sdes	TEST_DONE();
438276707Sdes
439276707Sdes	TEST_START("Ed25519 key bubblebabble fingerprint");
440276707Sdes	buf = load_text_file("ed25519_1.fp.bb");
441295367Sdes	cp = sshkey_fingerprint(k1, SSH_DIGEST_SHA1, SSH_FP_BUBBLEBABBLE);
442276707Sdes	ASSERT_PTR_NE(cp, NULL);
443276707Sdes	ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf));
444276707Sdes	sshbuf_free(buf);
445276707Sdes	free(cp);
446276707Sdes	TEST_DONE();
447276707Sdes
448276707Sdes	sshkey_free(k1);
449276707Sdes
450276707Sdes	sshbuf_free(pw);
451276707Sdes
452276707Sdes}
453