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