xref: /minix3/external/bsd/bind/dist/lib/dns/tests/gost_test.c (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
1*00b67f09SDavid van Moolenbroek /*	$NetBSD: gost_test.c,v 1.1.1.6 2015/07/08 15:38:04 christos Exp $	*/
2*00b67f09SDavid van Moolenbroek 
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek  * Copyright (C) 2014, 2015  Internet Systems Consortium, Inc. ("ISC")
5*00b67f09SDavid van Moolenbroek  *
6*00b67f09SDavid van Moolenbroek  * Permission to use, copy, modify, and/or distribute this software for any
7*00b67f09SDavid van Moolenbroek  * purpose with or without fee is hereby granted, provided that the above
8*00b67f09SDavid van Moolenbroek  * copyright notice and this permission notice appear in all copies.
9*00b67f09SDavid van Moolenbroek  *
10*00b67f09SDavid van Moolenbroek  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
11*00b67f09SDavid van Moolenbroek  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
12*00b67f09SDavid van Moolenbroek  * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
13*00b67f09SDavid van Moolenbroek  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
14*00b67f09SDavid van Moolenbroek  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
15*00b67f09SDavid van Moolenbroek  * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16*00b67f09SDavid van Moolenbroek  * PERFORMANCE OF THIS SOFTWARE.
17*00b67f09SDavid van Moolenbroek  */
18*00b67f09SDavid van Moolenbroek 
19*00b67f09SDavid van Moolenbroek /* Id */
20*00b67f09SDavid van Moolenbroek 
21*00b67f09SDavid van Moolenbroek /* ! \file */
22*00b67f09SDavid van Moolenbroek 
23*00b67f09SDavid van Moolenbroek #include <config.h>
24*00b67f09SDavid van Moolenbroek 
25*00b67f09SDavid van Moolenbroek #include <atf-c.h>
26*00b67f09SDavid van Moolenbroek 
27*00b67f09SDavid van Moolenbroek #include <stdio.h>
28*00b67f09SDavid van Moolenbroek #include <string.h>
29*00b67f09SDavid van Moolenbroek 
30*00b67f09SDavid van Moolenbroek #include <isc/util.h>
31*00b67f09SDavid van Moolenbroek #include <isc/string.h>
32*00b67f09SDavid van Moolenbroek 
33*00b67f09SDavid van Moolenbroek #include "dnstest.h"
34*00b67f09SDavid van Moolenbroek 
35*00b67f09SDavid van Moolenbroek #ifdef HAVE_OPENSSL_GOST
36*00b67f09SDavid van Moolenbroek #include "../dst_gost.h"
37*00b67f09SDavid van Moolenbroek #include <openssl/err.h>
38*00b67f09SDavid van Moolenbroek #include <openssl/objects.h>
39*00b67f09SDavid van Moolenbroek #include <openssl/rsa.h>
40*00b67f09SDavid van Moolenbroek #include <openssl/engine.h>
41*00b67f09SDavid van Moolenbroek #endif
42*00b67f09SDavid van Moolenbroek 
43*00b67f09SDavid van Moolenbroek #ifdef HAVE_PKCS11_GOST
44*00b67f09SDavid van Moolenbroek #include "../dst_gost.h"
45*00b67f09SDavid van Moolenbroek #include <pk11/internal.h>
46*00b67f09SDavid van Moolenbroek #define WANT_GOST_PARAMS
47*00b67f09SDavid van Moolenbroek #include <pk11/constants.h>
48*00b67f09SDavid van Moolenbroek #include <pkcs11/pkcs11.h>
49*00b67f09SDavid van Moolenbroek #endif
50*00b67f09SDavid van Moolenbroek 
51*00b67f09SDavid van Moolenbroek #if defined(HAVE_OPENSSL_GOST) || defined(HAVE_PKCS11_GOST)
52*00b67f09SDavid van Moolenbroek /*
53*00b67f09SDavid van Moolenbroek  * Test data from Wikipedia GOST (hash function)
54*00b67f09SDavid van Moolenbroek  */
55*00b67f09SDavid van Moolenbroek 
56*00b67f09SDavid van Moolenbroek unsigned char digest[ISC_GOST_DIGESTLENGTH];
57*00b67f09SDavid van Moolenbroek unsigned char buffer[1024];
58*00b67f09SDavid van Moolenbroek const char *s;
59*00b67f09SDavid van Moolenbroek char str[2 * ISC_GOST_DIGESTLENGTH + 1];
60*00b67f09SDavid van Moolenbroek int i = 0;
61*00b67f09SDavid van Moolenbroek 
62*00b67f09SDavid van Moolenbroek isc_result_t
63*00b67f09SDavid van Moolenbroek tohexstr(unsigned char *d, unsigned int len, char *out);
64*00b67f09SDavid van Moolenbroek /*
65*00b67f09SDavid van Moolenbroek  * Precondition: a hexadecimal number in *d, the length of that number in len,
66*00b67f09SDavid van Moolenbroek  *   and a pointer to a character array to put the output (*out).
67*00b67f09SDavid van Moolenbroek  * Postcondition: A String representation of the given hexadecimal number is
68*00b67f09SDavid van Moolenbroek  *   placed into the array *out
69*00b67f09SDavid van Moolenbroek  *
70*00b67f09SDavid van Moolenbroek  * 'out' MUST point to an array of at least len * 2 + 1
71*00b67f09SDavid van Moolenbroek  *
72*00b67f09SDavid van Moolenbroek  * Return values: ISC_R_SUCCESS if the operation is sucessful
73*00b67f09SDavid van Moolenbroek  */
74*00b67f09SDavid van Moolenbroek 
75*00b67f09SDavid van Moolenbroek isc_result_t
tohexstr(unsigned char * d,unsigned int len,char * out)76*00b67f09SDavid van Moolenbroek tohexstr(unsigned char *d, unsigned int len, char *out) {
77*00b67f09SDavid van Moolenbroek 
78*00b67f09SDavid van Moolenbroek 	out[0]='\0';
79*00b67f09SDavid van Moolenbroek 	char c_ret[] = "AA";
80*00b67f09SDavid van Moolenbroek 	unsigned int j;
81*00b67f09SDavid van Moolenbroek 	strcat(out, "0x");
82*00b67f09SDavid van Moolenbroek 	for (j = 0; j < len; j++) {
83*00b67f09SDavid van Moolenbroek 		sprintf(c_ret, "%02X", d[j]);
84*00b67f09SDavid van Moolenbroek 		strcat(out, c_ret);
85*00b67f09SDavid van Moolenbroek 	}
86*00b67f09SDavid van Moolenbroek 	strcat(out, "\0");
87*00b67f09SDavid van Moolenbroek 	return (ISC_R_SUCCESS);
88*00b67f09SDavid van Moolenbroek }
89*00b67f09SDavid van Moolenbroek 
90*00b67f09SDavid van Moolenbroek 
91*00b67f09SDavid van Moolenbroek #define TEST_INPUT(x) (x), sizeof(x)-1
92*00b67f09SDavid van Moolenbroek 
93*00b67f09SDavid van Moolenbroek typedef struct hash_testcase {
94*00b67f09SDavid van Moolenbroek 	const char *input;
95*00b67f09SDavid van Moolenbroek 	size_t input_len;
96*00b67f09SDavid van Moolenbroek 	const char *result;
97*00b67f09SDavid van Moolenbroek 	int repeats;
98*00b67f09SDavid van Moolenbroek } hash_testcase_t;
99*00b67f09SDavid van Moolenbroek 
100*00b67f09SDavid van Moolenbroek ATF_TC(isc_gost_md);
ATF_TC_HEAD(isc_gost_md,tc)101*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(isc_gost_md, tc) {
102*00b67f09SDavid van Moolenbroek 	atf_tc_set_md_var(tc, "descr",
103*00b67f09SDavid van Moolenbroek 			  "GOST R 34.11-94 examples from Wikipedia");
104*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(isc_gost_md,tc)105*00b67f09SDavid van Moolenbroek ATF_TC_BODY(isc_gost_md, tc) {
106*00b67f09SDavid van Moolenbroek 	isc_gost_t gost;
107*00b67f09SDavid van Moolenbroek 	isc_result_t result;
108*00b67f09SDavid van Moolenbroek 
109*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
110*00b67f09SDavid van Moolenbroek 
111*00b67f09SDavid van Moolenbroek 	/*
112*00b67f09SDavid van Moolenbroek 	 * These are the various test vectors.  All of these are passed
113*00b67f09SDavid van Moolenbroek 	 * through the hash function and the results are compared to the
114*00b67f09SDavid van Moolenbroek 	 * result specified here.
115*00b67f09SDavid van Moolenbroek 	 */
116*00b67f09SDavid van Moolenbroek 	hash_testcase_t testcases[] = {
117*00b67f09SDavid van Moolenbroek 		/* Test 1 */
118*00b67f09SDavid van Moolenbroek 		{
119*00b67f09SDavid van Moolenbroek 			TEST_INPUT(""),
120*00b67f09SDavid van Moolenbroek 			"0x981E5F3CA30C841487830F84FB433E1"
121*00b67f09SDavid van Moolenbroek 			"3AC1101569B9C13584AC483234CD656C0",
122*00b67f09SDavid van Moolenbroek 			1
123*00b67f09SDavid van Moolenbroek 		},
124*00b67f09SDavid van Moolenbroek 		/* Test 2 */
125*00b67f09SDavid van Moolenbroek 		{
126*00b67f09SDavid van Moolenbroek 			TEST_INPUT("a"),
127*00b67f09SDavid van Moolenbroek 			"0xE74C52DD282183BF37AF0079C9F7805"
128*00b67f09SDavid van Moolenbroek 			"5715A103F17E3133CEFF1AACF2F403011",
129*00b67f09SDavid van Moolenbroek 			1
130*00b67f09SDavid van Moolenbroek 		},
131*00b67f09SDavid van Moolenbroek 		/* Test 3 */
132*00b67f09SDavid van Moolenbroek 		{
133*00b67f09SDavid van Moolenbroek 			TEST_INPUT("abc"),
134*00b67f09SDavid van Moolenbroek 			"0xB285056DBF18D7392D7677369524DD1"
135*00b67f09SDavid van Moolenbroek 			"4747459ED8143997E163B2986F92FD42C",
136*00b67f09SDavid van Moolenbroek 			1
137*00b67f09SDavid van Moolenbroek 		},
138*00b67f09SDavid van Moolenbroek 		/* Test 4 */
139*00b67f09SDavid van Moolenbroek 		{
140*00b67f09SDavid van Moolenbroek 			TEST_INPUT("message digest"),
141*00b67f09SDavid van Moolenbroek 			"0xBC6041DD2AA401EBFA6E9886734174F"
142*00b67f09SDavid van Moolenbroek 			"EBDB4729AA972D60F549AC39B29721BA0",
143*00b67f09SDavid van Moolenbroek 			1
144*00b67f09SDavid van Moolenbroek 		},
145*00b67f09SDavid van Moolenbroek 		/* Test 5 */
146*00b67f09SDavid van Moolenbroek 		{
147*00b67f09SDavid van Moolenbroek 			TEST_INPUT("The quick brown fox jumps "
148*00b67f09SDavid van Moolenbroek 				   "over the lazy dog"),
149*00b67f09SDavid van Moolenbroek 			"0x9004294A361A508C586FE53D1F1B027"
150*00b67f09SDavid van Moolenbroek 			"46765E71B765472786E4770D565830A76",
151*00b67f09SDavid van Moolenbroek 			1
152*00b67f09SDavid van Moolenbroek 		},
153*00b67f09SDavid van Moolenbroek 
154*00b67f09SDavid van Moolenbroek 		/* Test 6 */
155*00b67f09SDavid van Moolenbroek 		{
156*00b67f09SDavid van Moolenbroek 			TEST_INPUT("ABCDEFGHIJKLMNOPQRSTUVWXYZabcde"
157*00b67f09SDavid van Moolenbroek 				   "fghijklmnopqrstuvwxyz0123456789"),
158*00b67f09SDavid van Moolenbroek 			"0x73B70A39497DE53A6E08C67B6D4DB85"
159*00b67f09SDavid van Moolenbroek 			"3540F03E9389299D9B0156EF7E85D0F61",
160*00b67f09SDavid van Moolenbroek 			1
161*00b67f09SDavid van Moolenbroek 		},
162*00b67f09SDavid van Moolenbroek 		/* Test 7 */
163*00b67f09SDavid van Moolenbroek 		{
164*00b67f09SDavid van Moolenbroek 			TEST_INPUT("1234567890123456789012345678901"
165*00b67f09SDavid van Moolenbroek 				   "2345678901234567890123456789012"
166*00b67f09SDavid van Moolenbroek 				   "345678901234567890"),
167*00b67f09SDavid van Moolenbroek 			"0x6BC7B38989B28CF93AE8842BF9D7529"
168*00b67f09SDavid van Moolenbroek 			"05910A7528A61E5BCE0782DE43E610C90",
169*00b67f09SDavid van Moolenbroek 			1
170*00b67f09SDavid van Moolenbroek 		},
171*00b67f09SDavid van Moolenbroek 		/* Test 8 */
172*00b67f09SDavid van Moolenbroek 		{
173*00b67f09SDavid van Moolenbroek 			TEST_INPUT("This is message, length=32 bytes"),
174*00b67f09SDavid van Moolenbroek 			"0x2CEFC2F7B7BDC514E18EA57FA74FF35"
175*00b67f09SDavid van Moolenbroek 			"7E7FA17D652C75F69CB1BE7893EDE48EB",
176*00b67f09SDavid van Moolenbroek 			1
177*00b67f09SDavid van Moolenbroek 		},
178*00b67f09SDavid van Moolenbroek 		/* Test 9 */
179*00b67f09SDavid van Moolenbroek 		{
180*00b67f09SDavid van Moolenbroek 			TEST_INPUT("Suppose the original message "
181*00b67f09SDavid van Moolenbroek 				   "has length = 50 bytes"),
182*00b67f09SDavid van Moolenbroek 			"0xC3730C5CBCCACF915AC292676F21E8B"
183*00b67f09SDavid van Moolenbroek 			"D4EF75331D9405E5F1A61DC3130A65011",
184*00b67f09SDavid van Moolenbroek 			1
185*00b67f09SDavid van Moolenbroek 		},
186*00b67f09SDavid van Moolenbroek 		/* Test 10 */
187*00b67f09SDavid van Moolenbroek 		{
188*00b67f09SDavid van Moolenbroek 			TEST_INPUT("U") /* times 128 */,
189*00b67f09SDavid van Moolenbroek 			"0x1C4AC7614691BBF427FA2316216BE8F"
190*00b67f09SDavid van Moolenbroek 			"10D92EDFD37CD1027514C1008F649C4E8",
191*00b67f09SDavid van Moolenbroek 			128
192*00b67f09SDavid van Moolenbroek 		},
193*00b67f09SDavid van Moolenbroek 		/* Test 11 */
194*00b67f09SDavid van Moolenbroek 		{
195*00b67f09SDavid van Moolenbroek 			TEST_INPUT("a") /* times 1000000 */,
196*00b67f09SDavid van Moolenbroek 			"0x8693287AA62F9478F7CB312EC0866B6"
197*00b67f09SDavid van Moolenbroek 			"C4E4A0F11160441E8F4FFCD2715DD554F",
198*00b67f09SDavid van Moolenbroek 			1000000
199*00b67f09SDavid van Moolenbroek 		},
200*00b67f09SDavid van Moolenbroek 		{ NULL, 0, NULL, 1 }
201*00b67f09SDavid van Moolenbroek 	};
202*00b67f09SDavid van Moolenbroek 
203*00b67f09SDavid van Moolenbroek 	result = dns_test_begin(NULL, ISC_FALSE);
204*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE(result == ISC_R_SUCCESS);
205*00b67f09SDavid van Moolenbroek 
206*00b67f09SDavid van Moolenbroek 	hash_testcase_t *testcase = testcases;
207*00b67f09SDavid van Moolenbroek 
208*00b67f09SDavid van Moolenbroek 	while (testcase->input != NULL && testcase->result != NULL) {
209*00b67f09SDavid van Moolenbroek 		result = isc_gost_init(&gost);
210*00b67f09SDavid van Moolenbroek 		ATF_REQUIRE(result == ISC_R_SUCCESS);
211*00b67f09SDavid van Moolenbroek 		for(i = 0; i < testcase->repeats; i++) {
212*00b67f09SDavid van Moolenbroek 			result = isc_gost_update(&gost,
213*00b67f09SDavid van Moolenbroek 					(const isc_uint8_t *) testcase->input,
214*00b67f09SDavid van Moolenbroek 					testcase->input_len);
215*00b67f09SDavid van Moolenbroek 			ATF_REQUIRE(result == ISC_R_SUCCESS);
216*00b67f09SDavid van Moolenbroek 		}
217*00b67f09SDavid van Moolenbroek 		result = isc_gost_final(&gost, digest);
218*00b67f09SDavid van Moolenbroek 		ATF_REQUIRE(result == ISC_R_SUCCESS);
219*00b67f09SDavid van Moolenbroek 		tohexstr(digest, ISC_GOST_DIGESTLENGTH, str);
220*00b67f09SDavid van Moolenbroek 		ATF_CHECK_STREQ(str, testcase->result);
221*00b67f09SDavid van Moolenbroek 
222*00b67f09SDavid van Moolenbroek 		testcase++;
223*00b67f09SDavid van Moolenbroek 	}
224*00b67f09SDavid van Moolenbroek 
225*00b67f09SDavid van Moolenbroek 	dns_test_end();
226*00b67f09SDavid van Moolenbroek }
227*00b67f09SDavid van Moolenbroek 
228*00b67f09SDavid van Moolenbroek ATF_TC(isc_gost_private);
ATF_TC_HEAD(isc_gost_private,tc)229*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(isc_gost_private, tc) {
230*00b67f09SDavid van Moolenbroek   atf_tc_set_md_var(tc, "descr", "GOST R 34.10-2001 private key");
231*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(isc_gost_private,tc)232*00b67f09SDavid van Moolenbroek ATF_TC_BODY(isc_gost_private, tc) {
233*00b67f09SDavid van Moolenbroek 	isc_result_t result;
234*00b67f09SDavid van Moolenbroek 	unsigned char privraw[31] = {
235*00b67f09SDavid van Moolenbroek 		0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
236*00b67f09SDavid van Moolenbroek 		0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
237*00b67f09SDavid van Moolenbroek 		0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
238*00b67f09SDavid van Moolenbroek 		0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e
239*00b67f09SDavid van Moolenbroek 	};
240*00b67f09SDavid van Moolenbroek #ifdef HAVE_OPENSSL_GOST
241*00b67f09SDavid van Moolenbroek 	unsigned char rbuf[32];
242*00b67f09SDavid van Moolenbroek 	unsigned char privasn1[70] = {
243*00b67f09SDavid van Moolenbroek 		0x30, 0x44, 0x02, 0x01, 0x00, 0x30, 0x1c, 0x06,
244*00b67f09SDavid van Moolenbroek 		0x06, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x13, 0x30,
245*00b67f09SDavid van Moolenbroek 		0x12, 0x06, 0x07, 0x2a, 0x85, 0x03, 0x02, 0x02,
246*00b67f09SDavid van Moolenbroek 		0x23, 0x01, 0x06, 0x07, 0x2a, 0x85, 0x03, 0x02,
247*00b67f09SDavid van Moolenbroek 		0x02, 0x1e, 0x01, 0x04, 0x21, 0x02, 0x1f, 0x01,
248*00b67f09SDavid van Moolenbroek 		0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
249*00b67f09SDavid van Moolenbroek 		0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11,
250*00b67f09SDavid van Moolenbroek 		0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
251*00b67f09SDavid van Moolenbroek 		0x1a, 0x1b, 0x1c, 0x1d, 0x1e
252*00b67f09SDavid van Moolenbroek 	};
253*00b67f09SDavid van Moolenbroek 	unsigned char abuf[71];
254*00b67f09SDavid van Moolenbroek 	unsigned char gost_dummy_key[71] = {
255*00b67f09SDavid van Moolenbroek 		0x30, 0x45, 0x02, 0x01, 0x00, 0x30, 0x1c, 0x06,
256*00b67f09SDavid van Moolenbroek 		0x06, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x13, 0x30,
257*00b67f09SDavid van Moolenbroek 		0x12, 0x06, 0x07, 0x2a, 0x85, 0x03, 0x02, 0x02,
258*00b67f09SDavid van Moolenbroek 		0x23, 0x01, 0x06, 0x07, 0x2a, 0x85, 0x03, 0x02,
259*00b67f09SDavid van Moolenbroek 		0x02, 0x1e, 0x01, 0x04, 0x22, 0x02, 0x20, 0x1b,
260*00b67f09SDavid van Moolenbroek 		0x3f, 0x94, 0xf7, 0x1a, 0x5f, 0x2f, 0xe7, 0xe5,
261*00b67f09SDavid van Moolenbroek 		0x74, 0x0b, 0x8c, 0xd4, 0xb7, 0x18, 0xdd, 0x65,
262*00b67f09SDavid van Moolenbroek 		0x68, 0x26, 0xd1, 0x54, 0xfb, 0x77, 0xba, 0x63,
263*00b67f09SDavid van Moolenbroek 		0x72, 0xd9, 0xf0, 0x63, 0x87, 0xe0, 0xd6
264*00b67f09SDavid van Moolenbroek 	};
265*00b67f09SDavid van Moolenbroek 	EVP_PKEY *pkey;
266*00b67f09SDavid van Moolenbroek 	EC_KEY *eckey;
267*00b67f09SDavid van Moolenbroek 	BIGNUM *privkey;
268*00b67f09SDavid van Moolenbroek 	const BIGNUM *privkey1;
269*00b67f09SDavid van Moolenbroek 	const unsigned char *p;
270*00b67f09SDavid van Moolenbroek 	int len;
271*00b67f09SDavid van Moolenbroek 	unsigned char *q;
272*00b67f09SDavid van Moolenbroek 
273*00b67f09SDavid van Moolenbroek 	result = dns_test_begin(NULL, ISC_FALSE);
274*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE(result == ISC_R_SUCCESS);
275*00b67f09SDavid van Moolenbroek 
276*00b67f09SDavid van Moolenbroek 	/* raw parse */
277*00b67f09SDavid van Moolenbroek 	privkey = BN_bin2bn(privraw, (int) sizeof(privraw), NULL);
278*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE(privkey != NULL);
279*00b67f09SDavid van Moolenbroek 	p = gost_dummy_key;
280*00b67f09SDavid van Moolenbroek 	pkey = NULL;
281*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE(d2i_PrivateKey(NID_id_GostR3410_2001, &pkey, &p,
282*00b67f09SDavid van Moolenbroek 				   (long) sizeof(gost_dummy_key)) != NULL);
283*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE(pkey != NULL);
284*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE(EVP_PKEY_bits(pkey) == 256);
285*00b67f09SDavid van Moolenbroek 	eckey = EVP_PKEY_get0(pkey);
286*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE(eckey != NULL);
287*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE(EC_KEY_set_private_key(eckey, privkey) == 1);
288*00b67f09SDavid van Moolenbroek 	BN_clear_free(privkey);
289*00b67f09SDavid van Moolenbroek 
290*00b67f09SDavid van Moolenbroek 	/* asn1 tofile */
291*00b67f09SDavid van Moolenbroek 	len = i2d_PrivateKey(pkey, NULL);
292*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE(len == 70);
293*00b67f09SDavid van Moolenbroek 	q = abuf;
294*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE(i2d_PrivateKey(pkey, &q) == len);
295*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE(memcmp(abuf, privasn1, len) == 0);
296*00b67f09SDavid van Moolenbroek 	EVP_PKEY_free(pkey);
297*00b67f09SDavid van Moolenbroek 
298*00b67f09SDavid van Moolenbroek 	/* asn1 parse */
299*00b67f09SDavid van Moolenbroek 	p = privasn1;
300*00b67f09SDavid van Moolenbroek 	pkey = NULL;
301*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE(d2i_PrivateKey(NID_id_GostR3410_2001, &pkey, &p,
302*00b67f09SDavid van Moolenbroek 				   (long) len) != NULL);
303*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE(pkey != NULL);
304*00b67f09SDavid van Moolenbroek 	eckey = EVP_PKEY_get0(pkey);
305*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE(eckey != NULL);
306*00b67f09SDavid van Moolenbroek 	privkey1 = EC_KEY_get0_private_key(eckey);
307*00b67f09SDavid van Moolenbroek 	len = BN_num_bytes(privkey1);
308*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE(len == 31);
309*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE(BN_bn2bin(privkey1, rbuf) == len);
310*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE(memcmp(rbuf, privraw, len) == 0);
311*00b67f09SDavid van Moolenbroek 
312*00b67f09SDavid van Moolenbroek 	dns_test_end();
313*00b67f09SDavid van Moolenbroek #else
314*00b67f09SDavid van Moolenbroek 	CK_BBOOL truevalue = TRUE;
315*00b67f09SDavid van Moolenbroek 	CK_BBOOL falsevalue = FALSE;
316*00b67f09SDavid van Moolenbroek 	CK_OBJECT_CLASS keyClass = CKO_PRIVATE_KEY;
317*00b67f09SDavid van Moolenbroek 	CK_KEY_TYPE keyType = CKK_GOSTR3410;
318*00b67f09SDavid van Moolenbroek 	CK_ATTRIBUTE keyTemplate[] =
319*00b67f09SDavid van Moolenbroek 	{
320*00b67f09SDavid van Moolenbroek 		{ CKA_CLASS, &keyClass, (CK_ULONG) sizeof(keyClass) },
321*00b67f09SDavid van Moolenbroek 		{ CKA_KEY_TYPE, &keyType, (CK_ULONG) sizeof(keyType) },
322*00b67f09SDavid van Moolenbroek 		{ CKA_TOKEN, &falsevalue, (CK_ULONG) sizeof(falsevalue) },
323*00b67f09SDavid van Moolenbroek 		{ CKA_PRIVATE, &falsevalue, (CK_ULONG) sizeof(falsevalue) },
324*00b67f09SDavid van Moolenbroek 		{ CKA_SENSITIVE, &falsevalue, (CK_ULONG) sizeof(falsevalue) },
325*00b67f09SDavid van Moolenbroek 		{ CKA_SIGN, &truevalue, (CK_ULONG) sizeof(truevalue) },
326*00b67f09SDavid van Moolenbroek 		{ CKA_VALUE, privraw, sizeof(privraw) },
327*00b67f09SDavid van Moolenbroek 		{ CKA_GOSTR3410_PARAMS, pk11_gost_a_paramset,
328*00b67f09SDavid van Moolenbroek 		  (CK_ULONG) sizeof(pk11_gost_a_paramset) },
329*00b67f09SDavid van Moolenbroek 		{ CKA_GOSTR3411_PARAMS, pk11_gost_paramset,
330*00b67f09SDavid van Moolenbroek 		  (CK_ULONG) sizeof(pk11_gost_paramset) }
331*00b67f09SDavid van Moolenbroek 	};
332*00b67f09SDavid van Moolenbroek 	CK_MECHANISM mech = { CKM_GOSTR3410_WITH_GOSTR3411, NULL, 0 };
333*00b67f09SDavid van Moolenbroek 	CK_BYTE sig[64];
334*00b67f09SDavid van Moolenbroek 	CK_ULONG siglen;
335*00b67f09SDavid van Moolenbroek 	pk11_context_t pk11_ctx;
336*00b67f09SDavid van Moolenbroek 
337*00b67f09SDavid van Moolenbroek 	result = dns_test_begin(NULL, ISC_FALSE);
338*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE(result == ISC_R_SUCCESS);
339*00b67f09SDavid van Moolenbroek 
340*00b67f09SDavid van Moolenbroek 	/* create the private key */
341*00b67f09SDavid van Moolenbroek 	memset(&pk11_ctx, 0, sizeof(pk11_ctx));
342*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE(pk11_get_session(&pk11_ctx, OP_GOST, ISC_TRUE,
343*00b67f09SDavid van Moolenbroek 				     ISC_FALSE, ISC_FALSE, NULL,
344*00b67f09SDavid van Moolenbroek 				     pk11_get_best_token(OP_GOST)) ==
345*00b67f09SDavid van Moolenbroek 		    ISC_R_SUCCESS);
346*00b67f09SDavid van Moolenbroek 	pk11_ctx.object = CK_INVALID_HANDLE;
347*00b67f09SDavid van Moolenbroek 	pk11_ctx.ontoken = ISC_FALSE;
348*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE(pkcs_C_CreateObject(pk11_ctx.session, keyTemplate,
349*00b67f09SDavid van Moolenbroek 					(CK_ULONG) 9, &pk11_ctx.object) ==
350*00b67f09SDavid van Moolenbroek 		    CKR_OK);
351*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE(pk11_ctx.object != CK_INVALID_HANDLE);
352*00b67f09SDavid van Moolenbroek 
353*00b67f09SDavid van Moolenbroek 	/* sign something */
354*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE(pkcs_C_SignInit(pk11_ctx.session, &mech,
355*00b67f09SDavid van Moolenbroek 				    pk11_ctx.object) == CKR_OK);
356*00b67f09SDavid van Moolenbroek 	siglen = 0;
357*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE(pkcs_C_Sign(pk11_ctx.session, sig, 64,
358*00b67f09SDavid van Moolenbroek 				NULL, &siglen) == CKR_OK);
359*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE(siglen == 64);
360*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE(pkcs_C_Sign(pk11_ctx.session, sig, 64,
361*00b67f09SDavid van Moolenbroek 				sig, &siglen) == CKR_OK);
362*00b67f09SDavid van Moolenbroek 	ATF_REQUIRE(siglen == 64);
363*00b67f09SDavid van Moolenbroek 
364*00b67f09SDavid van Moolenbroek 	dns_test_end();
365*00b67f09SDavid van Moolenbroek #endif
366*00b67f09SDavid van Moolenbroek };
367*00b67f09SDavid van Moolenbroek #else
368*00b67f09SDavid van Moolenbroek ATF_TC(untested);
ATF_TC_HEAD(untested,tc)369*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(untested, tc) {
370*00b67f09SDavid van Moolenbroek 	atf_tc_set_md_var(tc, "descr", "skipping gost test");
371*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(untested,tc)372*00b67f09SDavid van Moolenbroek ATF_TC_BODY(untested, tc) {
373*00b67f09SDavid van Moolenbroek 	UNUSED(tc);
374*00b67f09SDavid van Moolenbroek 	atf_tc_skip("GOST not available");
375*00b67f09SDavid van Moolenbroek }
376*00b67f09SDavid van Moolenbroek #endif
377*00b67f09SDavid van Moolenbroek /*
378*00b67f09SDavid van Moolenbroek  * Main
379*00b67f09SDavid van Moolenbroek  */
ATF_TP_ADD_TCS(tp)380*00b67f09SDavid van Moolenbroek ATF_TP_ADD_TCS(tp) {
381*00b67f09SDavid van Moolenbroek #if defined(HAVE_OPENSSL_GOST) || defined(HAVE_PKCS11_GOST)
382*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, isc_gost_md);
383*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, isc_gost_private);
384*00b67f09SDavid van Moolenbroek #else
385*00b67f09SDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, untested);
386*00b67f09SDavid van Moolenbroek #endif
387*00b67f09SDavid van Moolenbroek 	return (atf_no_error());
388*00b67f09SDavid van Moolenbroek }
389*00b67f09SDavid van Moolenbroek 
390