xref: /openbsd-src/regress/lib/libcrypto/dsa/dsatest.c (revision f90ef06a3045119dcc88b72d8b98ca60e3c00d5a)
1 /*	$OpenBSD: dsatest.c,v 1.8 2023/08/12 06:23:59 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 /* Until the key-gen callbacks are modified to use newer prototypes, we allow
60  * deprecated functions for openssl-internal code */
61 #ifdef OPENSSL_NO_DEPRECATED
62 #undef OPENSSL_NO_DEPRECATED
63 #endif
64 
65 #include <err.h>
66 #include <stdio.h>
67 #include <stdlib.h>
68 #include <string.h>
69 #include <sys/types.h>
70 #include <sys/stat.h>
71 
72 #include <openssl/crypto.h>
73 #include <openssl/bio.h>
74 #include <openssl/err.h>
75 #include <openssl/bn.h>
76 
77 #include <openssl/dsa.h>
78 
79 static int dsa_cb(int p, int n, BN_GENCB *arg);
80 
81 /* seed, out_p, out_q, out_g are taken from the updated Appendix 5 to
82  * FIPS PUB 186 and also appear in Appendix 5 to FIPS PIB 186-1 */
83 static unsigned char seed[20] = {
84 	0xd5, 0x01, 0x4e, 0x4b, 0x60, 0xef, 0x2b, 0xa8, 0xb6, 0x21, 0x1b, 0x40,
85 	0x62, 0xba, 0x32, 0x24, 0xe0, 0x42, 0x7d, 0xd3,
86 };
87 
88 static unsigned char out_p[] = {
89 	0x8d, 0xf2, 0xa4, 0x94, 0x49, 0x22, 0x76, 0xaa,
90 	0x3d, 0x25, 0x75, 0x9b, 0xb0, 0x68, 0x69, 0xcb,
91 	0xea, 0xc0, 0xd8, 0x3a, 0xfb, 0x8d, 0x0c, 0xf7,
92 	0xcb, 0xb8, 0x32, 0x4f, 0x0d, 0x78, 0x82, 0xe5,
93 	0xd0, 0x76, 0x2f, 0xc5, 0xb7, 0x21, 0x0e, 0xaf,
94 	0xc2, 0xe9, 0xad, 0xac, 0x32, 0xab, 0x7a, 0xac,
95 	0x49, 0x69, 0x3d, 0xfb, 0xf8, 0x37, 0x24, 0xc2,
96 	0xec, 0x07, 0x36, 0xee, 0x31, 0xc8, 0x02, 0x91,
97 };
98 
99 static unsigned char out_q[] = {
100 	0xc7, 0x73, 0x21, 0x8c, 0x73, 0x7e, 0xc8, 0xee,
101 	0x99, 0x3b, 0x4f, 0x2d, 0xed, 0x30, 0xf4, 0x8e,
102 	0xda, 0xce, 0x91, 0x5f,
103 };
104 
105 static unsigned char out_g[] = {
106 	0x62, 0x6d, 0x02, 0x78, 0x39, 0xea, 0x0a, 0x13,
107 	0x41, 0x31, 0x63, 0xa5, 0x5b, 0x4c, 0xb5, 0x00,
108 	0x29, 0x9d, 0x55, 0x22, 0x95, 0x6c, 0xef, 0xcb,
109 	0x3b, 0xff, 0x10, 0xf3, 0x99, 0xce, 0x2c, 0x2e,
110 	0x71, 0xcb, 0x9d, 0xe5, 0xfa, 0x24, 0xba, 0xbf,
111 	0x58, 0xe5, 0xb7, 0x95, 0x21, 0x92, 0x5c, 0x9c,
112 	0xc4, 0x2e, 0x9f, 0x6f, 0x46, 0x4b, 0x08, 0x8c,
113 	0xc5, 0x72, 0xaf, 0x53, 0xe6, 0xd7, 0x88, 0x02,
114 };
115 
116 static const unsigned char str1[] = "12345678901234567890";
117 
118 static BIO *bio_err = NULL;
119 
120 int
121 main(int argc, char **argv)
122 {
123 	BN_GENCB *cb;
124 	DSA *dsa = NULL;
125 	int counter, i, j;
126 	unsigned char buf[256];
127 	unsigned long h;
128 	unsigned char sig[256];
129 	unsigned int siglen;
130 	int ret = 0;
131 
132 	if (bio_err == NULL)
133 		bio_err = BIO_new_fp(stderr, BIO_NOCLOSE);
134 
135 	ERR_load_crypto_strings();
136 
137 	BIO_printf(bio_err, "test generation of DSA parameters\n");
138 
139 	if ((cb = BN_GENCB_new()) == NULL)
140 		goto end;
141 
142 	BN_GENCB_set(cb, dsa_cb, bio_err);
143 	if ((dsa = DSA_new()) == NULL)
144 		goto end;
145 
146 #ifdef OPENSSL_NO_ENGINE
147 	if (DSA_get0_engine(dsa) != NULL) {
148 		BIO_printf(bio_err, "ENGINE was not NULL\n");
149 		goto end;
150 	}
151 #endif
152 
153 	if (!DSA_generate_parameters_ex(dsa, 512, seed, 20, &counter, &h, cb))
154 		goto end;
155 
156 	BIO_printf(bio_err, "seed\n");
157 	for (i = 0; i < 20; i += 4) {
158 		BIO_printf(bio_err, "%02X%02X%02X%02X ",
159 			seed[i], seed[i + 1], seed[i + 2], seed[i + 3]);
160 	}
161 	BIO_printf(bio_err, "\ncounter=%d h=%ld\n", counter, h);
162 
163 	DSA_print(bio_err, dsa, 0);
164 	if (counter != 105) {
165 		BIO_printf(bio_err, "counter should be 105\n");
166 		goto end;
167 	}
168 	if (h != 2) {
169 		BIO_printf(bio_err, "h should be 2\n");
170 		goto end;
171 	}
172 
173 	i = BN_bn2bin(DSA_get0_q(dsa), buf);
174 	j = sizeof(out_q);
175 	if ((i != j) || (memcmp(buf, out_q, i) != 0)) {
176 		BIO_printf(bio_err, "q value is wrong\n");
177 		goto end;
178 	}
179 
180 	i = BN_bn2bin(DSA_get0_p(dsa), buf);
181 	j = sizeof(out_p);
182 	if ((i != j) || (memcmp(buf, out_p, i) != 0)) {
183 		BIO_printf(bio_err, "p value is wrong\n");
184 		goto end;
185 	}
186 
187 	i = BN_bn2bin(DSA_get0_g(dsa), buf);
188 	j = sizeof(out_g);
189 	if ((i != j) || (memcmp(buf, out_g, i) != 0)) {
190 		BIO_printf(bio_err, "g value is wrong\n");
191 		goto end;
192 	}
193 
194 	DSA_generate_key(dsa);
195 	DSA_sign(0, str1, 20, sig, &siglen, dsa);
196 	if (DSA_verify(0, str1, 20, sig, siglen, dsa) == 1)
197 		ret = 1;
198 
199 end:
200 	BN_GENCB_free(cb);
201 	if (!ret)
202 		ERR_print_errors(bio_err);
203 	DSA_free(dsa);
204 	CRYPTO_cleanup_all_ex_data();
205 	ERR_remove_thread_state(NULL);
206 	ERR_free_strings();
207 	CRYPTO_mem_leaks(bio_err);
208 	BIO_free(bio_err);
209 	bio_err = NULL;
210 
211 	return !ret;
212 }
213 
214 static int
215 dsa_cb(int p, int n, BN_GENCB *arg)
216 {
217 	char c = '*';
218 	static int ok = 0, num = 0;
219 
220 	if (p == 0) {
221 		c = '.';
222 		num++;
223 	}
224 	if (p == 1)
225 		c = '+';
226 	if (p == 2) {
227 		c = '*';
228 		ok++;
229 	}
230 
231 	if (p == 3)
232 		c = '\n';
233 	BIO_write(BN_GENCB_get_arg(arg), &c, 1);
234 	(void)BIO_flush(BN_GENCB_get_arg(arg));
235 
236 	if (!ok && (p == 0) && (num > 1)) {
237 		BIO_printf((BIO *)arg, "error in dsatest\n");
238 		return 0;
239 	}
240 	return 1;
241 }
242