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