xref: /freebsd/crypto/openssh/regress/unittests/sshsig/tests.c (revision a91a246563dffa876a52f53a98de4af9fa364c52)
1 /* 	$OpenBSD: tests.c,v 1.4 2024/01/11 01:45:59 djm Exp $ */
2 /*
3  * Regress test for sshbuf.h buffer API
4  *
5  * Placed in the public domain
6  */
7 
8 #include "includes.h"
9 
10 #include <sys/types.h>
11 #include <sys/stat.h>
12 #include <fcntl.h>
13 #include <stdio.h>
14 #ifdef HAVE_STDINT_H
15 #include <stdint.h>
16 #endif
17 #include <stdlib.h>
18 #include <string.h>
19 #include <unistd.h>
20 
21 #ifdef WITH_OPENSSL
22 #include <openssl/evp.h>
23 #include <openssl/crypto.h>
24 #endif
25 
26 #include "ssherr.h"
27 #include "authfile.h"
28 #include "sshkey.h"
29 #include "sshbuf.h"
30 #include "sshsig.h"
31 #include "log.h"
32 
33 #include "../test_helper/test_helper.h"
34 
35 static struct sshbuf *
load_file(const char * name)36 load_file(const char *name)
37 {
38 	struct sshbuf *ret = NULL;
39 
40 	ASSERT_INT_EQ(sshbuf_load_file(test_data_file(name), &ret), 0);
41 	ASSERT_PTR_NE(ret, NULL);
42 	return ret;
43 }
44 
45 static struct sshkey *
load_key(const char * name)46 load_key(const char *name)
47 {
48 	struct sshkey *ret = NULL;
49 	ASSERT_INT_EQ(sshkey_load_public(test_data_file(name), &ret, NULL), 0);
50 	ASSERT_PTR_NE(ret, NULL);
51 	return ret;
52 }
53 
54 static void
check_sig(const char * keyname,const char * signame,const struct sshbuf * msg,const char * namespace)55 check_sig(const char *keyname, const char *signame, const struct sshbuf *msg,
56     const char *namespace)
57 {
58 	struct sshkey *k, *sign_key;
59 	struct sshbuf *sig, *rawsig;
60 	struct sshkey_sig_details *sig_details;
61 
62 	k = load_key(keyname);
63 	sig = load_file(signame);
64 	sign_key = NULL;
65 	sig_details = NULL;
66 	rawsig = NULL;
67 	ASSERT_INT_EQ(sshsig_dearmor(sig, &rawsig), 0);
68 	ASSERT_INT_EQ(sshsig_verifyb(rawsig, msg, namespace,
69 	    &sign_key, &sig_details), 0);
70 	ASSERT_INT_EQ(sshkey_equal(k, sign_key), 1);
71 	sshkey_free(k);
72 	sshkey_free(sign_key);
73 	sshkey_sig_details_free(sig_details);
74 	sshbuf_free(sig);
75 	sshbuf_free(rawsig);
76 }
77 
78 void
tests(void)79 tests(void)
80 {
81 	struct sshbuf *msg;
82 	char *namespace;
83 
84 #if 0
85         log_init("test_sshsig", SYSLOG_LEVEL_DEBUG3, SYSLOG_FACILITY_AUTH, 1);
86 #endif
87 
88 #ifdef WITH_OPENSSL
89 	OpenSSL_add_all_algorithms();
90 	ERR_load_crypto_strings();
91 #endif
92 
93 	TEST_START("load data");
94 	msg = load_file("namespace");
95 	namespace = sshbuf_dup_string(msg);
96 	ASSERT_PTR_NE(namespace, NULL);
97 	sshbuf_free(msg);
98 	msg = load_file("signed-data");
99 	TEST_DONE();
100 
101 #ifdef WITH_OPENSSL
102 	TEST_START("check RSA signature");
103 	check_sig("rsa.pub", "rsa.sig", msg, namespace);
104 	TEST_DONE();
105 
106 #ifdef WITH_DSA
107 	TEST_START("check DSA signature");
108 	check_sig("dsa.pub", "dsa.sig", msg, namespace);
109 	TEST_DONE();
110 #endif
111 
112 #ifdef OPENSSL_HAS_ECC
113 	TEST_START("check ECDSA signature");
114 	check_sig("ecdsa.pub", "ecdsa.sig", msg, namespace);
115 	TEST_DONE();
116 #endif
117 #endif
118 
119 	TEST_START("check ED25519 signature");
120 	check_sig("ed25519.pub", "ed25519.sig", msg, namespace);
121 	TEST_DONE();
122 
123 #ifdef ENABLE_SK
124 #if defined(WITH_OPENSSL) && defined(OPENSSL_HAS_ECC)
125 	TEST_START("check ECDSA-SK signature");
126 	check_sig("ecdsa_sk.pub", "ecdsa_sk.sig", msg, namespace);
127 	TEST_DONE();
128 #endif
129 
130 	TEST_START("check ED25519-SK signature");
131 	check_sig("ed25519_sk.pub", "ed25519_sk.sig", msg, namespace);
132 	TEST_DONE();
133 
134 #if defined(WITH_OPENSSL) && defined(OPENSSL_HAS_ECC)
135 	TEST_START("check ECDSA-SK webauthn signature");
136 	check_sig("ecdsa_sk_webauthn.pub", "ecdsa_sk_webauthn.sig",
137 	    msg, namespace);
138  	TEST_DONE();
139 #endif
140 #endif /* ENABLE_SK */
141 
142 	sshbuf_free(msg);
143 	free(namespace);
144 }
145