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