xref: /openbsd/regress/lib/libcrypto/dsa/dsatest.c (revision a1db1954)
1 /*	$OpenBSD: dsatest.c,v 1.11 2024/02/29 20:04:43 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
main(int argc,char ** argv)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 	if (DSA_get0_engine(dsa) != NULL) {
141 		BIO_printf(bio_err, "ENGINE was not NULL\n");
142 		goto end;
143 	}
144 
145 	if (!DSA_generate_parameters_ex(dsa, 512, seed, 20, &counter, &h, cb))
146 		goto end;
147 
148 	BIO_printf(bio_err, "seed\n");
149 	for (i = 0; i < 20; i += 4) {
150 		BIO_printf(bio_err, "%02X%02X%02X%02X ",
151 			seed[i], seed[i + 1], seed[i + 2], seed[i + 3]);
152 	}
153 	BIO_printf(bio_err, "\ncounter=%d h=%ld\n", counter, h);
154 
155 	DSA_print(bio_err, dsa, 0);
156 	if (counter != 105) {
157 		BIO_printf(bio_err, "counter should be 105\n");
158 		goto end;
159 	}
160 	if (h != 2) {
161 		BIO_printf(bio_err, "h should be 2\n");
162 		goto end;
163 	}
164 
165 	i = BN_bn2bin(DSA_get0_q(dsa), buf);
166 	j = sizeof(out_q);
167 	if ((i != j) || (memcmp(buf, out_q, i) != 0)) {
168 		BIO_printf(bio_err, "q value is wrong\n");
169 		goto end;
170 	}
171 
172 	i = BN_bn2bin(DSA_get0_p(dsa), buf);
173 	j = sizeof(out_p);
174 	if ((i != j) || (memcmp(buf, out_p, i) != 0)) {
175 		BIO_printf(bio_err, "p value is wrong\n");
176 		goto end;
177 	}
178 
179 	i = BN_bn2bin(DSA_get0_g(dsa), buf);
180 	j = sizeof(out_g);
181 	if ((i != j) || (memcmp(buf, out_g, i) != 0)) {
182 		BIO_printf(bio_err, "g value is wrong\n");
183 		goto end;
184 	}
185 
186 	DSA_generate_key(dsa);
187 	DSA_sign(0, str1, 20, sig, &siglen, dsa);
188 	if (DSA_verify(0, str1, 20, sig, siglen, dsa) == 1)
189 		ret = 1;
190 
191 end:
192 	BN_GENCB_free(cb);
193 	if (!ret)
194 		ERR_print_errors(bio_err);
195 	DSA_free(dsa);
196 	CRYPTO_cleanup_all_ex_data();
197 	ERR_remove_thread_state(NULL);
198 	ERR_free_strings();
199 	BIO_free(bio_err);
200 	bio_err = NULL;
201 
202 	return !ret;
203 }
204 
205 static int
dsa_cb(int p,int n,BN_GENCB * arg)206 dsa_cb(int p, int n, BN_GENCB *arg)
207 {
208 	char c = '*';
209 	static int ok = 0, num = 0;
210 
211 	if (p == 0) {
212 		c = '.';
213 		num++;
214 	}
215 	if (p == 1)
216 		c = '+';
217 	if (p == 2) {
218 		c = '*';
219 		ok++;
220 	}
221 
222 	if (p == 3)
223 		c = '\n';
224 	BIO_write(BN_GENCB_get_arg(arg), &c, 1);
225 	(void)BIO_flush(BN_GENCB_get_arg(arg));
226 
227 	if (!ok && (p == 0) && (num > 1)) {
228 		BIO_printf((BIO *)arg, "error in dsatest\n");
229 		return 0;
230 	}
231 	return 1;
232 }
233