xref: /openbsd-src/regress/lib/libcrypto/dsa/dsatest.c (revision 1ad61ae0a79a724d2d3ec69e69c8e1d1ff6b53a0)
1 /*	$OpenBSD: dsatest.c,v 1.9 2023/08/20 22:22:55 tb Exp $	*/
2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3  * All rights reserved.
4  *
5  * This package is an SSL implementation written
6  * by Eric Young (eay@cryptsoft.com).
7  * The implementation was written so as to conform with Netscapes SSL.
8  *
9  * This library is free for commercial and non-commercial use as long as
10  * the following conditions are aheared to.  The following conditions
11  * apply to all code found in this distribution, be it the RC4, RSA,
12  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
13  * included with this distribution is covered by the same copyright terms
14  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15  *
16  * Copyright remains Eric Young's, and as such any Copyright notices in
17  * the code are not to be removed.
18  * If this package is used in a product, Eric Young should be given attribution
19  * as the author of the parts of the library used.
20  * This can be in the form of a textual message at program startup or
21  * in documentation (online or textual) provided with the package.
22  *
23  * Redistribution and use in source and binary forms, with or without
24  * modification, are permitted provided that the following conditions
25  * are met:
26  * 1. Redistributions of source code must retain the copyright
27  *    notice, this list of conditions and the following disclaimer.
28  * 2. Redistributions in binary form must reproduce the above copyright
29  *    notice, this list of conditions and the following disclaimer in the
30  *    documentation and/or other materials provided with the distribution.
31  * 3. All advertising materials mentioning features or use of this software
32  *    must display the following acknowledgement:
33  *    "This product includes cryptographic software written by
34  *     Eric Young (eay@cryptsoft.com)"
35  *    The word 'cryptographic' can be left out if the rouines from the library
36  *    being used are not cryptographic related :-).
37  * 4. If you include any Windows specific code (or a derivative thereof) from
38  *    the apps directory (application code) you must include an acknowledgement:
39  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40  *
41  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51  * SUCH DAMAGE.
52  *
53  * The licence and distribution terms for any publically available version or
54  * derivative of this code cannot be changed.  i.e. this code cannot simply be
55  * copied and put under another distribution licence
56  * [including the GNU Public Licence.]
57  */
58 
59 #include <err.h>
60 #include <stdio.h>
61 #include <stdlib.h>
62 #include <string.h>
63 #include <sys/types.h>
64 #include <sys/stat.h>
65 
66 #include <openssl/crypto.h>
67 #include <openssl/bio.h>
68 #include <openssl/err.h>
69 #include <openssl/bn.h>
70 
71 #include <openssl/dsa.h>
72 
73 static int dsa_cb(int p, int n, BN_GENCB *arg);
74 
75 /* seed, out_p, out_q, out_g are taken from the updated Appendix 5 to
76  * FIPS PUB 186 and also appear in Appendix 5 to FIPS PIB 186-1 */
77 static unsigned char seed[20] = {
78 	0xd5, 0x01, 0x4e, 0x4b, 0x60, 0xef, 0x2b, 0xa8, 0xb6, 0x21, 0x1b, 0x40,
79 	0x62, 0xba, 0x32, 0x24, 0xe0, 0x42, 0x7d, 0xd3,
80 };
81 
82 static unsigned char out_p[] = {
83 	0x8d, 0xf2, 0xa4, 0x94, 0x49, 0x22, 0x76, 0xaa,
84 	0x3d, 0x25, 0x75, 0x9b, 0xb0, 0x68, 0x69, 0xcb,
85 	0xea, 0xc0, 0xd8, 0x3a, 0xfb, 0x8d, 0x0c, 0xf7,
86 	0xcb, 0xb8, 0x32, 0x4f, 0x0d, 0x78, 0x82, 0xe5,
87 	0xd0, 0x76, 0x2f, 0xc5, 0xb7, 0x21, 0x0e, 0xaf,
88 	0xc2, 0xe9, 0xad, 0xac, 0x32, 0xab, 0x7a, 0xac,
89 	0x49, 0x69, 0x3d, 0xfb, 0xf8, 0x37, 0x24, 0xc2,
90 	0xec, 0x07, 0x36, 0xee, 0x31, 0xc8, 0x02, 0x91,
91 };
92 
93 static unsigned char out_q[] = {
94 	0xc7, 0x73, 0x21, 0x8c, 0x73, 0x7e, 0xc8, 0xee,
95 	0x99, 0x3b, 0x4f, 0x2d, 0xed, 0x30, 0xf4, 0x8e,
96 	0xda, 0xce, 0x91, 0x5f,
97 };
98 
99 static unsigned char out_g[] = {
100 	0x62, 0x6d, 0x02, 0x78, 0x39, 0xea, 0x0a, 0x13,
101 	0x41, 0x31, 0x63, 0xa5, 0x5b, 0x4c, 0xb5, 0x00,
102 	0x29, 0x9d, 0x55, 0x22, 0x95, 0x6c, 0xef, 0xcb,
103 	0x3b, 0xff, 0x10, 0xf3, 0x99, 0xce, 0x2c, 0x2e,
104 	0x71, 0xcb, 0x9d, 0xe5, 0xfa, 0x24, 0xba, 0xbf,
105 	0x58, 0xe5, 0xb7, 0x95, 0x21, 0x92, 0x5c, 0x9c,
106 	0xc4, 0x2e, 0x9f, 0x6f, 0x46, 0x4b, 0x08, 0x8c,
107 	0xc5, 0x72, 0xaf, 0x53, 0xe6, 0xd7, 0x88, 0x02,
108 };
109 
110 static const unsigned char str1[] = "12345678901234567890";
111 
112 static BIO *bio_err = NULL;
113 
114 int
115 main(int argc, char **argv)
116 {
117 	BN_GENCB *cb;
118 	DSA *dsa = NULL;
119 	int counter, i, j;
120 	unsigned char buf[256];
121 	unsigned long h;
122 	unsigned char sig[256];
123 	unsigned int siglen;
124 	int ret = 0;
125 
126 	if (bio_err == NULL)
127 		bio_err = BIO_new_fp(stderr, BIO_NOCLOSE);
128 
129 	ERR_load_crypto_strings();
130 
131 	BIO_printf(bio_err, "test generation of DSA parameters\n");
132 
133 	if ((cb = BN_GENCB_new()) == NULL)
134 		goto end;
135 
136 	BN_GENCB_set(cb, dsa_cb, bio_err);
137 	if ((dsa = DSA_new()) == NULL)
138 		goto end;
139 
140 #ifdef OPENSSL_NO_ENGINE
141 	if (DSA_get0_engine(dsa) != NULL) {
142 		BIO_printf(bio_err, "ENGINE was not NULL\n");
143 		goto end;
144 	}
145 #endif
146 
147 	if (!DSA_generate_parameters_ex(dsa, 512, seed, 20, &counter, &h, cb))
148 		goto end;
149 
150 	BIO_printf(bio_err, "seed\n");
151 	for (i = 0; i < 20; i += 4) {
152 		BIO_printf(bio_err, "%02X%02X%02X%02X ",
153 			seed[i], seed[i + 1], seed[i + 2], seed[i + 3]);
154 	}
155 	BIO_printf(bio_err, "\ncounter=%d h=%ld\n", counter, h);
156 
157 	DSA_print(bio_err, dsa, 0);
158 	if (counter != 105) {
159 		BIO_printf(bio_err, "counter should be 105\n");
160 		goto end;
161 	}
162 	if (h != 2) {
163 		BIO_printf(bio_err, "h should be 2\n");
164 		goto end;
165 	}
166 
167 	i = BN_bn2bin(DSA_get0_q(dsa), buf);
168 	j = sizeof(out_q);
169 	if ((i != j) || (memcmp(buf, out_q, i) != 0)) {
170 		BIO_printf(bio_err, "q value is wrong\n");
171 		goto end;
172 	}
173 
174 	i = BN_bn2bin(DSA_get0_p(dsa), buf);
175 	j = sizeof(out_p);
176 	if ((i != j) || (memcmp(buf, out_p, i) != 0)) {
177 		BIO_printf(bio_err, "p value is wrong\n");
178 		goto end;
179 	}
180 
181 	i = BN_bn2bin(DSA_get0_g(dsa), buf);
182 	j = sizeof(out_g);
183 	if ((i != j) || (memcmp(buf, out_g, i) != 0)) {
184 		BIO_printf(bio_err, "g value is wrong\n");
185 		goto end;
186 	}
187 
188 	DSA_generate_key(dsa);
189 	DSA_sign(0, str1, 20, sig, &siglen, dsa);
190 	if (DSA_verify(0, str1, 20, sig, siglen, dsa) == 1)
191 		ret = 1;
192 
193 end:
194 	BN_GENCB_free(cb);
195 	if (!ret)
196 		ERR_print_errors(bio_err);
197 	DSA_free(dsa);
198 	CRYPTO_cleanup_all_ex_data();
199 	ERR_remove_thread_state(NULL);
200 	ERR_free_strings();
201 	CRYPTO_mem_leaks(bio_err);
202 	BIO_free(bio_err);
203 	bio_err = NULL;
204 
205 	return !ret;
206 }
207 
208 static int
209 dsa_cb(int p, int n, BN_GENCB *arg)
210 {
211 	char c = '*';
212 	static int ok = 0, num = 0;
213 
214 	if (p == 0) {
215 		c = '.';
216 		num++;
217 	}
218 	if (p == 1)
219 		c = '+';
220 	if (p == 2) {
221 		c = '*';
222 		ok++;
223 	}
224 
225 	if (p == 3)
226 		c = '\n';
227 	BIO_write(BN_GENCB_get_arg(arg), &c, 1);
228 	(void)BIO_flush(BN_GENCB_get_arg(arg));
229 
230 	if (!ok && (p == 0) && (num > 1)) {
231 		BIO_printf((BIO *)arg, "error in dsatest\n");
232 		return 0;
233 	}
234 	return 1;
235 }
236