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