]> www.wagner.pp.ru Git - openssl-gost/engine.git/blob - test_params.c
tcl_tests: ca.try: Ignore openssl crl exit status for 'corrupted CRL' test
[openssl-gost/engine.git] / test_params.c
1 /*
2  * Test GOST 34.10 Verify operation with every curve parameter
3  *
4  * Copyright (C) 2019 vt@altlinux.org. All Rights Reserved.
5  *
6  * Contents licensed under the terms of the OpenSSL license
7  * See https://www.openssl.org/source/license.html for details
8  */
9
10 #ifdef _MSC_VER
11 # pragma warning(push, 3)
12 # include <openssl/applink.c>
13 # pragma warning(pop)
14 #endif
15 #include "e_gost_err.h"
16 #include "gost_lcl.h"
17 #include <openssl/evp.h>
18 #include <openssl/rand.h>
19 #include <openssl/err.h>
20 #include <openssl/asn1.h>
21 #include <openssl/obj_mac.h>
22 #include <openssl/ec.h>
23 #include <openssl/bn.h>
24 #include <openssl/safestack.h>
25 #include <string.h>
26
27 #define T(e) \
28     if (!(e)) { \
29         ERR_print_errors_fp(stderr); \
30         OpenSSLDie(__FILE__, __LINE__, #e); \
31     }
32 #define TE(e) \
33     if (!(e)) { \
34         ERR_print_errors_fp(stderr); \
35         fprintf(stderr, "Error at %s:%d %s\n", __FILE__, __LINE__, #e); \
36         return -1; \
37     }
38
39 #define cRED    "\033[1;31m"
40 #define cDRED   "\033[0;31m"
41 #define cGREEN  "\033[1;32m"
42 #define cDGREEN "\033[0;32m"
43 #define cBLUE   "\033[1;34m"
44 #define cDBLUE  "\033[0;34m"
45 #define cNORM   "\033[m"
46 #define TEST_ASSERT(e) {if ((test = (e))) \
47                  printf(cRED "  Test FAILED" cNORM "\n"); \
48              else \
49                  printf(cGREEN "  Test passed" cNORM "\n");}
50
51 struct test_param {
52     unsigned int param;         /* NID of EC parameters */
53     unsigned int len;           /* length of a digest or a half of the key */
54     unsigned int data_len;      /* length of @data */
55     const uint8_t *data;        /* data to hash (optional) */
56     const uint8_t *hash;        /* hash of data */
57     const uint8_t *signature;   /* raw signature */
58     const uint8_t *pub_key;     /* raw public key */
59 };
60
61 /*
62  * Parameters provided by CryptoPro for Basealt SPO to test
63  * interop with open-source software.
64  */
65
66 /* 1.2.643.2.2.35.1 - szOID_GostR3410_2001_CryptoPro_A_ParamSet */
67 const uint8_t data_2001_256_setA[] = {
68     0xCB, 0x03, 0xB7, 0x57, 0xBC, 0xA7, 0xBC, 0xB6,
69     0xB0, 0x37, 0xC5, 0xD4, 0xBB, 0x51, 0x52, 0x9A,
70     0xEE, 0xF3, 0x28, 0x9B, 0x14, 0x11, 0xE2, 0xCB,
71     0xAB, 0x82, 0x1A, 0xDF, 0x1D, 0x2A, 0x70, 0xE6,
72     0x09, 0x1B, 0x7C, 0xE9, 0x6D, 0xAE, 0xAF, 0xF9,
73 };
74
75 static uint8_t hash_2001_256_setA[] = {
76     0x4F, 0x49, 0xB3, 0x9E, 0xA0, 0x06, 0xD0, 0xDA,
77     0x4D, 0x81, 0x50, 0x61, 0x08, 0x66, 0xA1, 0x18,
78     0xA6, 0x04, 0x25, 0x98, 0xB9, 0x66, 0x00, 0x32,
79     0xC5, 0x40, 0xD6, 0xEB, 0x1A, 0x85, 0x70, 0xEE,
80 };
81
82 static uint8_t signature_2001_256_setA[] = {
83     0x7E, 0xE2, 0x99, 0xB9, 0x50, 0x78, 0x1C, 0xE4,
84     0xDC, 0xA6, 0x68, 0xCF, 0x6E, 0x88, 0xDC, 0x29,
85     0x3F, 0x13, 0x8F, 0x12, 0x14, 0x1A, 0x03, 0x3A,
86     0x09, 0x01, 0x78, 0x52, 0x82, 0x7D, 0xDC, 0x7B,
87     0xF0, 0xE5, 0x49, 0x93, 0x9D, 0xBF, 0x95, 0x4B,
88     0xB4, 0xB1, 0x40, 0x72, 0xDE, 0x15, 0x86, 0x11,
89     0x1D, 0xF9, 0x63, 0xF2, 0xE7, 0xEF, 0xB7, 0xBD,
90     0x73, 0xF7, 0xB7, 0xD1, 0x95, 0x61, 0xBA, 0x1C,
91 };
92
93 static uint8_t pubkey_2001_256_setA[] = {
94     0xF0, 0x69, 0xAF, 0x90, 0xEE, 0xE4, 0xA3, 0x33,
95     0x52, 0xA2, 0xE8, 0x0C, 0x72, 0xE6, 0x20, 0xAF,
96     0xB7, 0x66, 0x03, 0xE5, 0xFF, 0x85, 0xF3, 0xAA,
97     0x5F, 0x38, 0x2F, 0x8E, 0x44, 0xEF, 0x51, 0x0F,
98     0x82, 0x59, 0x4A, 0x99, 0x10, 0xB8, 0x89, 0xCD,
99     0x78, 0xD2, 0xBA, 0xF1, 0x97, 0xFE, 0xEB, 0xE6,
100     0x74, 0xC1, 0x96, 0x90, 0x97, 0x71, 0xAD, 0x16,
101     0x9F, 0x9B, 0x37, 0xDD, 0x2B, 0x44, 0xFF, 0x2D,
102 };
103
104 /* 1.2.643.2.2.35.2 - szOID_GostR3410_2001_CryptoPro_B_ParamSet */
105 const uint8_t data_2001_256_setB[] = {
106     0x54, 0x7D, 0x31, 0xFE, 0x69, 0xD4, 0xB1, 0x58,
107     0x7E, 0x34, 0x2D, 0xC9, 0x3D, 0xBD, 0x67, 0xAF,
108     0xD8, 0x31, 0x90, 0xC4, 0xA9, 0x07, 0xCE, 0x34,
109     0x3F, 0x90, 0x3A, 0xC4, 0xFC, 0xE4, 0x4E, 0xEA,
110     0xF1, 0xE9, 0x04, 0xD0, 0x7E, 0x4B, 0xCF, 0x39
111 };
112
113 const uint8_t hash_2001_256_setB[] = {
114     0x10, 0xDE, 0x3D, 0x7A, 0xEE, 0x6E, 0xC0, 0x0D,
115     0x57, 0x9B, 0x4B, 0xB2, 0x92, 0xB8, 0xE5, 0x4E,
116     0x75, 0x19, 0x92, 0xFE, 0x71, 0x91, 0xF7, 0xF2,
117     0x72, 0xE7, 0x77, 0x47, 0x51, 0xF7, 0xEC, 0x26,
118 };
119
120 const uint8_t signature_2001_256_setB[] = {
121     0x9C, 0x27, 0x76, 0x22, 0xB8, 0x4A, 0xB6, 0x2B,
122     0xBA, 0x2E, 0xE3, 0xD5, 0x89, 0x72, 0x89, 0x53,
123     0x7C, 0x2D, 0xB7, 0x70, 0x8A, 0xD5, 0x7B, 0x61,
124     0xDF, 0xD1, 0xD6, 0x7F, 0x77, 0xFF, 0xDB, 0x4E,
125     0xEE, 0x98, 0xFC, 0x2C, 0xDE, 0xAA, 0xC7, 0xDE,
126     0x42, 0xEE, 0x40, 0x12, 0x5E, 0xC8, 0xFE, 0x0E,
127     0x97, 0x80, 0xB9, 0x6A, 0xAC, 0x93, 0xAD, 0xEE,
128     0x96, 0xE1, 0xDB, 0xC6, 0xF2, 0xAC, 0xF4, 0x22
129 };
130
131 const uint8_t pubkey_2001_256_setB[] = {
132     0x6A, 0x8A, 0x5E, 0x32, 0x00, 0xED, 0xD3, 0xA7,
133     0x38, 0x83, 0x58, 0x7D, 0xBD, 0xE9, 0xFD, 0xA9,
134     0x00, 0xAE, 0xE8, 0x4F, 0xFF, 0x71, 0xD2, 0xA0,
135     0x79, 0x14, 0xD4, 0xB4, 0xB2, 0x00, 0x9A, 0x0A,
136     0x51, 0x21, 0xD5, 0x19, 0x05, 0xF1, 0xB7, 0x6C,
137     0x2E, 0x3A, 0x18, 0xDD, 0x82, 0x67, 0x7F, 0x96,
138     0x0B, 0x1A, 0x76, 0x93, 0xF7, 0x6A, 0xCA, 0x15,
139     0xCD, 0xEE, 0xA1, 0xD2, 0xDE, 0xD5, 0x56, 0x20
140 };
141
142 /* 1.2.643.2.2.35.3 - szOID_GostR3410_2001_CryptoPro_C_ParamSet */
143 const uint8_t data_2001_256_setC[] = {
144     0x30, 0x26, 0xBB, 0x7C, 0xEE, 0x71, 0x15, 0xF6,
145     0x01, 0x3B, 0x8E, 0xF9, 0x04, 0xA7, 0x02, 0x39,
146     0xC7, 0xF2, 0xDC, 0x15, 0x2C, 0xB4, 0x95, 0x74,
147     0x1B, 0x66, 0x78, 0x5A, 0x0F, 0xF1, 0x88, 0x5A,
148     0x68, 0x7F, 0xD2, 0xE8, 0xF3, 0x85, 0xE2, 0xD5
149 };
150
151 const uint8_t hash_2001_256_setC[] = {
152     0x8C, 0xFE, 0x45, 0xBD, 0x4F, 0x9D, 0xEB, 0x80,
153     0x78, 0xA7, 0xA3, 0xFB, 0xB3, 0x06, 0x2A, 0xE4,
154     0xD6, 0xF4, 0x1A, 0x0B, 0x31, 0xEB, 0x82, 0xB8,
155     0x13, 0x32, 0xD6, 0xA2, 0xAE, 0x80, 0xF1, 0xF7
156 };
157
158 const uint8_t signature_2001_256_setC[] = {
159     0xD3, 0x16, 0xBB, 0x65, 0x48, 0x6D, 0x2D, 0x55,
160     0x14, 0x13, 0xAE, 0x20, 0x31, 0x2B, 0xA5, 0x6B,
161     0x32, 0x56, 0x0C, 0xCF, 0xB3, 0x48, 0x59, 0x63,
162     0x3C, 0x8F, 0xD6, 0x98, 0x9D, 0x88, 0xB1, 0x34,
163     0xAB, 0xBD, 0x04, 0x39, 0x66, 0xE5, 0x9D, 0x63,
164     0xAA, 0xAB, 0x63, 0x98, 0x6C, 0x06, 0x54, 0xC2,
165     0xDB, 0xD0, 0x6A, 0x6E, 0x57, 0xB3, 0x23, 0x41,
166     0xAB, 0x22, 0xBB, 0x13, 0x37, 0x18, 0x3E, 0x08
167 };
168
169 const uint8_t pubkey_2001_256_setC[] = {
170     0xBA, 0x43, 0xE0, 0xF4, 0x0D, 0x3E, 0x50, 0x60,
171     0xCE, 0xC7, 0xE7, 0x0C, 0x34, 0x8F, 0x21, 0x22,
172     0xF4, 0x36, 0x7E, 0x0E, 0x35, 0x49, 0x92, 0x66,
173     0x89, 0x92, 0x0B, 0x62, 0x37, 0xF8, 0x69, 0x82,
174     0xB7, 0x0E, 0x32, 0x29, 0x5F, 0xD6, 0x44, 0x56,
175     0xBB, 0x16, 0xD0, 0x8D, 0x3B, 0xE5, 0xC2, 0xB5,
176     0xCE, 0x99, 0x4D, 0xDD, 0x41, 0xF9, 0xE7, 0x98,
177     0x14, 0xBD, 0xC5, 0x87, 0xAE, 0x8D, 0xF1, 0x25
178 };
179
180 /* 1.2.643.7.1.2.1.1.1 - szOID_tc26_gost_3410_12_256_paramSetA */
181 const uint8_t data_tc26_gost_3410_12_256_setA[] = {
182     0xBF, 0xA5, 0x7B, 0x70, 0x8F, 0x4D, 0xDE, 0x9A,
183     0x38, 0x5A, 0x4A, 0xA5, 0xD9, 0xDB, 0x84, 0x6A,
184     0x23, 0xD8, 0xB4, 0x73, 0x1E, 0x9A, 0x55, 0x42,
185     0x32, 0x85, 0x28, 0xE8, 0x2B, 0x0D, 0x83, 0x0E,
186     0x06, 0xBF, 0x46, 0x99, 0x38, 0xDF, 0xB4, 0xFA,
187     0x08, 0x0D, 0x5B, 0x20, 0xEC, 0x0D, 0xD9, 0x7F,
188     0x7C, 0x69, 0x51, 0xDA, 0xA5, 0x50, 0x2A, 0x65,
189     0xFD, 0xB1, 0x1F, 0x88, 0xCB, 0xA6, 0xE2, 0x61
190 };
191
192 const uint8_t hash_tc26_gost_3410_12_256_setA[] = {
193     0xFD, 0x39, 0xEA, 0x88, 0x90, 0x89, 0xD8, 0x1E,
194     0xE2, 0x49, 0x11, 0xDB, 0x51, 0x71, 0x48, 0x0A,
195     0xD7, 0x27, 0xCC, 0xBA, 0xD2, 0x19, 0xF4, 0x9E,
196     0x98, 0xC6, 0x3D, 0x1F, 0xB5, 0x7C, 0x24, 0x2F
197 };
198
199 const uint8_t signature_tc26_gost_3410_12_256_setA[] = {
200     0x0D, 0xC4, 0xCA, 0x98, 0x2B, 0x15, 0x51, 0xD4,
201     0x74, 0x36, 0x24, 0x10, 0xEA, 0x21, 0x2D, 0x8E,
202     0xBB, 0x6C, 0xBB, 0x5E, 0xE5, 0x26, 0x76, 0x3D,
203     0x88, 0x62, 0xC5, 0x2B, 0x5F, 0x93, 0xF9, 0x01,
204     0x46, 0x49, 0xD6, 0x0F, 0x30, 0x44, 0x45, 0x55,
205     0x0B, 0xC6, 0x63, 0x60, 0x20, 0x26, 0x09, 0x08,
206     0x85, 0x2E, 0x16, 0xBE, 0x14, 0x46, 0x31, 0x89,
207     0xA6, 0xD3, 0x52, 0xBA, 0xD5, 0x51, 0x69, 0x24
208 };
209
210 const uint8_t pubkey_tc26_gost_3410_12_256_setA[] = {
211     0x3B, 0x8A, 0x6A, 0x5E, 0xFE, 0x62, 0x30, 0x31,
212     0x3A, 0x34, 0x9A, 0x6A, 0xF0, 0xC4, 0x92, 0x4E,
213     0xF4, 0xF8, 0x0E, 0xF6, 0xE1, 0xF2, 0x3F, 0xE1,
214     0x9A, 0xA9, 0x7A, 0x77, 0x97, 0x3A, 0x11, 0xE8,
215     0xD2, 0xA8, 0x5F, 0xD1, 0x49, 0xE0, 0xBD, 0xAB,
216     0x28, 0xD5, 0x2B, 0x02, 0x06, 0x99, 0x8E, 0x7E,
217     0xFF, 0xDB, 0x2A, 0xDE, 0x92, 0x11, 0x34, 0x5D,
218     0xCF, 0x40, 0xEE, 0x0B, 0xD0, 0x61, 0x89, 0x75
219 };
220
221 /* 1.2.643.7.1.2.1.2.1 - szOID_tc26_gost_3410_12_512_paramSetA */
222 const uint8_t data_tc26_gost_3410_12_512_setA[] = {
223     0xEF, 0x15, 0x1E, 0x5B, 0xE9, 0x52, 0x35, 0x84,
224     0x17, 0x07, 0x4B, 0xBD, 0x10, 0xEA, 0x7D, 0x77,
225     0x1E, 0xBF, 0x95, 0x55, 0xA4, 0x2A, 0x8F, 0xA7,
226     0xFF, 0x3F, 0xEC, 0x8F, 0xA2, 0x3C, 0x90, 0x65,
227     0x4A, 0xB8, 0x59, 0x31, 0xE1, 0x97, 0xD5, 0xC4,
228     0x26, 0x49, 0xCE, 0x81, 0x53, 0xBE, 0x79, 0xF7,
229     0xA1, 0xB2, 0xE0, 0x7D, 0x44, 0xA4, 0x74, 0x64,
230     0xB0, 0x09, 0x62, 0x35, 0xC5, 0x50, 0x7F, 0x36
231 };
232
233 const uint8_t hash_tc26_gost_3410_12_512_setA[] = {
234     0xE9, 0x25, 0x04, 0x72, 0x12, 0xC3, 0x82, 0x06,
235     0x00, 0xB6, 0x76, 0xF4, 0x4D, 0x71, 0xE4, 0x42,
236     0x49, 0x3E, 0x57, 0x23, 0xBF, 0xBD, 0xBF, 0x94,
237     0x7C, 0x0E, 0x2D, 0xAA, 0x48, 0x36, 0xF5, 0x9A,
238     0x4D, 0x66, 0x02, 0x42, 0x0E, 0xCC, 0x94, 0xDF,
239     0x7D, 0x21, 0xF8, 0x69, 0x1D, 0xFD, 0x45, 0x56,
240     0x42, 0x4C, 0x69, 0x17, 0x8E, 0x21, 0xBE, 0x4F,
241     0x2C, 0xC8, 0x61, 0xDB, 0xA7, 0x24, 0xEC, 0x48
242 };
243
244 const uint8_t signature_tc26_gost_3410_12_512_setA[] = {
245     0xC3, 0xE5, 0xFA, 0xE8, 0x5F, 0x35, 0x88, 0x13,
246     0x49, 0x22, 0xC2, 0x1D, 0x5F, 0x73, 0xD4, 0x37,
247     0x34, 0x1D, 0xEF, 0x56, 0x04, 0x6B, 0x17, 0x6D,
248     0x00, 0x71, 0xC9, 0x14, 0xF0, 0x03, 0x3F, 0x64,
249     0xCA, 0x67, 0x3A, 0x6E, 0xFE, 0x8B, 0x1D, 0x36,
250     0xDD, 0x57, 0xE3, 0x28, 0x74, 0x64, 0xF1, 0xD0,
251     0x89, 0x9A, 0x9B, 0xDD, 0xF6, 0xBB, 0x9B, 0x58,
252     0xA4, 0x8F, 0x56, 0xB5, 0xDE, 0xF9, 0x9E, 0x70,
253     0x62, 0xC8, 0xF3, 0x19, 0xE3, 0x4B, 0x73, 0x0F,
254     0x95, 0x5D, 0x20, 0x97, 0x74, 0x5C, 0xAA, 0x02,
255     0xB7, 0xFA, 0xFD, 0x33, 0xD5, 0xBC, 0xE4, 0xDD,
256     0x9A, 0x66, 0x98, 0xEB, 0xE9, 0x51, 0x03, 0x66,
257     0x25, 0x10, 0xF5, 0x8F, 0xB4, 0x45, 0x4F, 0xB5,
258     0x3A, 0x61, 0x56, 0xCF, 0x8C, 0x1E, 0xD8, 0xAF,
259     0x4B, 0xEC, 0x54, 0xDB, 0x43, 0x4E, 0xD6, 0x55,
260     0x3F, 0xA3, 0x45, 0x15, 0x06, 0x74, 0xFA, 0x6C
261 };
262
263 const uint8_t pubkey_tc26_gost_3410_12_512_setA[] = {
264     0xB2, 0xBF, 0x45, 0x23, 0x00, 0x57, 0x70, 0xAE,
265     0xAB, 0x5B, 0x63, 0xEC, 0xA8, 0x5F, 0xCF, 0xD0,
266     0xBA, 0x88, 0x64, 0x79, 0x3D, 0xB6, 0x70, 0x88,
267     0xE8, 0xD8, 0xA4, 0x95, 0x9E, 0xB9, 0x78, 0x73,
268     0x9F, 0x0A, 0x34, 0x74, 0xED, 0xFF, 0xB9, 0x7E,
269     0x34, 0x1B, 0xE0, 0x2A, 0xE2, 0xD8, 0x07, 0xE9,
270     0xC2, 0xD2, 0x84, 0x39, 0x9E, 0x36, 0x0F, 0x7A,
271     0xE2, 0x56, 0x2A, 0x81, 0x6C, 0x94, 0x9D, 0x5E,
272     0x6E, 0x68, 0x94, 0xFD, 0x75, 0x14, 0xE5, 0x07,
273     0xED, 0x45, 0x2B, 0x07, 0xE1, 0xB2, 0x79, 0x2A,
274     0x21, 0x34, 0x21, 0x95, 0x02, 0xF2, 0xAF, 0xDC,
275     0x8A, 0xD7, 0xA3, 0x72, 0x4C, 0x02, 0xA2, 0xF8,
276     0x59, 0xE2, 0x91, 0x58, 0x01, 0x1D, 0x55, 0xC6,
277     0xEC, 0x73, 0xEA, 0x44, 0x5B, 0x35, 0x08, 0x5C,
278     0xAC, 0xA0, 0xB9, 0x4B, 0x28, 0xE7, 0xBD, 0x8B,
279     0xB2, 0x78, 0x9B, 0x4F, 0x46, 0xC9, 0xD6, 0x84
280 };
281
282 /* 1.2.643.7.1.2.1.2.2 - szOID_tc26_gost_3410_12_512_paramSetB */
283 const uint8_t data_tc26_gost_3410_12_512_setB[] = {
284     0x84, 0x66, 0x52, 0x16, 0xB7, 0x53, 0xC0, 0xBB,
285     0xAE, 0xED, 0x2F, 0x37, 0x78, 0x43, 0x03, 0xCF,
286     0x21, 0x5D, 0x36, 0x97, 0x55, 0x2B, 0x3B, 0xF3,
287     0xFB, 0x9C, 0x18, 0x04, 0x81, 0x9B, 0x50, 0x9E,
288     0xBE, 0xC1, 0x97, 0x53, 0xBC, 0xB1, 0x55, 0xDC,
289     0x0C, 0xAB, 0x7D, 0xB3, 0x88, 0xBC, 0xB2, 0x9C,
290     0x86, 0x16, 0x21, 0x0A, 0x95, 0x9F, 0x3D, 0xA6,
291     0x0C, 0xB4, 0x33, 0x1B, 0x7B, 0x29, 0xA3, 0x70,
292     0x1A, 0x67, 0xD1, 0xC7, 0x45, 0xE7, 0xF6, 0xC0,
293     0x66
294 };
295
296 const uint8_t hash_tc26_gost_3410_12_512_setB[] = {
297     0x6A, 0x55, 0x15, 0x81, 0x50, 0x2A, 0x14, 0x22,
298     0x6F, 0xD1, 0x4B, 0x50, 0xB1, 0xE2, 0x6C, 0x80,
299     0xC4, 0x84, 0x21, 0xF9, 0x63, 0x46, 0xAF, 0xE8,
300     0xE0, 0x2C, 0xFD, 0x41, 0x1E, 0x49, 0x01, 0x6B,
301     0x00, 0x3C, 0xEB, 0x5F, 0x6B, 0x34, 0xA9, 0x93,
302     0x2D, 0x86, 0x2F, 0xEA, 0x58, 0x83, 0x81, 0x51,
303     0xF7, 0xA2, 0xCC, 0x0F, 0xAE, 0xAD, 0x40, 0x65,
304     0x82, 0xC6, 0x53, 0x05, 0xAE, 0xEB, 0x22, 0xB8
305 };
306
307 const uint8_t signature_tc26_gost_3410_12_512_setB[] = {
308     0x15, 0xFD, 0xD4, 0x3B, 0x57, 0x5A, 0x97, 0x4E,
309     0x0D, 0xE6, 0xBC, 0xB5, 0x1F, 0x91, 0x3F, 0x8B,
310     0xEE, 0xE9, 0x88, 0xF3, 0x94, 0x3D, 0xB6, 0x09,
311     0x6B, 0xD6, 0xBA, 0x85, 0x42, 0xE8, 0xF4, 0xCE,
312     0x0D, 0xF5, 0x8D, 0xD1, 0xAF, 0xC9, 0xC4, 0xA7,
313     0x82, 0x3E, 0xBB, 0x7F, 0x72, 0x50, 0xF5, 0x36,
314     0x06, 0x54, 0x10, 0x31, 0x89, 0xA9, 0x80, 0x1A,
315     0x55, 0x48, 0xB7, 0xEA, 0xB3, 0xAE, 0x77, 0x4E,
316     0xC1, 0x45, 0x52, 0xDD, 0xBF, 0xA9, 0x8E, 0x02,
317     0x10, 0x80, 0x8F, 0x9C, 0xD1, 0x85, 0x36, 0xBA,
318     0x7C, 0x20, 0x86, 0x2E, 0xDB, 0x25, 0x0C, 0x1B,
319     0x53, 0xBA, 0x26, 0x39, 0xE0, 0xD4, 0xE6, 0xE7,
320     0x4B, 0xA1, 0x02, 0x7D, 0xD4, 0x74, 0x6B, 0x6E,
321     0x82, 0xDD, 0x92, 0xA2, 0xA4, 0xBA, 0xD4, 0xB6,
322     0xF9, 0x57, 0x57, 0x67, 0xB6, 0x5A, 0xA2, 0x72,
323     0x96, 0xEA, 0xE9, 0x2E, 0xA9, 0x11, 0x73, 0x27
324 };
325
326 const uint8_t pubkey_tc26_gost_3410_12_512_setB[] = {
327     0x86, 0x97, 0xE7, 0x19, 0x03, 0x5E, 0x54, 0xA6,
328     0xE8, 0x7A, 0xEE, 0xD5, 0x76, 0xC4, 0xC4, 0x72,
329     0x4A, 0x59, 0x55, 0xEB, 0x72, 0xF7, 0xE0, 0x62,
330     0xB1, 0x0D, 0x1B, 0x79, 0x32, 0x72, 0x83, 0x0D,
331     0x1F, 0x7B, 0x74, 0x12, 0x29, 0x20, 0xFD, 0x23,
332     0xAA, 0x8C, 0x77, 0xA1, 0x23, 0x38, 0x7F, 0x73,
333     0x07, 0x94, 0x8A, 0x34, 0x46, 0xDB, 0x7C, 0xFB,
334     0x46, 0xF0, 0x63, 0xE9, 0xD3, 0xAF, 0xC8, 0x4B,
335     0x78, 0x65, 0x99, 0xAE, 0x71, 0x7F, 0x45, 0xF8,
336     0x7C, 0xF3, 0x0A, 0x2F, 0x97, 0xEB, 0x85, 0x1A,
337     0x22, 0x67, 0x65, 0x78, 0xA5, 0xF8, 0xF2, 0x8C,
338     0xE8, 0xF5, 0x9B, 0x75, 0xA8, 0x3D, 0x81, 0xC1,
339     0x7F, 0x69, 0x23, 0x94, 0xDE, 0x89, 0xFC, 0x65,
340     0xB3, 0xFE, 0x18, 0x91, 0xC0, 0x03, 0xBE, 0xDA,
341     0xC8, 0x7D, 0x48, 0x12, 0x4F, 0x75, 0xC5, 0xAE,
342     0xB4, 0x50, 0xA0, 0xFC, 0x27, 0xC1, 0xE7, 0x00
343 };
344
345 /* 1.2.643.7.1.2.1.2.3 - szOID_tc26_gost_3410_12_512_paramSetC */
346 const uint8_t data_tc26_gost_3410_12_512_setC[] = {
347     0x40, 0xE2, 0xDD, 0x43, 0xF9, 0x59, 0x3C, 0xDC,
348     0x9C, 0x8F, 0x2E, 0xBF, 0xA8, 0x0B, 0x2D, 0xD4,
349     0xB5, 0x00, 0x56, 0x93, 0xFC, 0xCE, 0x73, 0x5B,
350     0x99, 0x66, 0x24, 0x0A, 0x76, 0x52, 0x2E, 0xBC,
351     0xBE, 0xEA, 0x8A, 0x52, 0xFC, 0x95, 0x02, 0x8F,
352     0xB9, 0x8E, 0x23, 0x00, 0x47, 0x40, 0x28, 0xE4,
353     0x92, 0x9C, 0x19, 0x99, 0xBD, 0x98, 0xF5, 0x3A,
354     0xA0, 0xBE, 0xFB, 0xC7, 0xC1, 0xE3, 0x98, 0x6B,
355     0x8D, 0x2F, 0x5A, 0x85, 0xB9, 0x46, 0x90, 0x83,
356     0x6D
357 };
358
359 const uint8_t hash_tc26_gost_3410_12_512_setC[] = {
360     0xBD, 0x82, 0xF1, 0x34, 0x33, 0x74, 0x9C, 0xC2,
361     0x9E, 0x95, 0x67, 0x57, 0x2C, 0x6D, 0x83, 0x3D,
362     0xFD, 0xBD, 0x7C, 0xD7, 0xAA, 0xE7, 0x28, 0xF9,
363     0x81, 0xB9, 0xCF, 0xAE, 0x4A, 0xAA, 0x17, 0x7D,
364     0x84, 0x79, 0x25, 0xC5, 0x66, 0xAA, 0x9E, 0x28,
365     0x66, 0x41, 0x95, 0xC4, 0xFF, 0xF6, 0x72, 0xEF,
366     0x0E, 0x08, 0xC6, 0x0B, 0x2E, 0x0F, 0xCB, 0xC6,
367     0x96, 0x4A, 0x77, 0x0D, 0x14, 0xE5, 0x35, 0xC0
368 };
369
370 const uint8_t signature_tc26_gost_3410_12_512_setC[] = {
371     0x35, 0x1E, 0x65, 0xAE, 0x90, 0xB0, 0x05, 0x04,
372     0x02, 0xF5, 0x22, 0xAC, 0xE4, 0x5D, 0x8C, 0x35,
373     0x17, 0x2B, 0xFF, 0xD7, 0xCA, 0x95, 0x0E, 0xF9,
374     0x85, 0x2A, 0xD0, 0xA0, 0xE1, 0x04, 0x43, 0xCA,
375     0x70, 0x9A, 0xDF, 0x35, 0xD7, 0xD8, 0x8D, 0xC2,
376     0x78, 0x84, 0x4C, 0xCF, 0x58, 0x25, 0x9C, 0xD2,
377     0x40, 0x5A, 0xEC, 0xB3, 0x9A, 0x77, 0x6B, 0x4F,
378     0x63, 0x26, 0xDD, 0xB2, 0x19, 0x8E, 0x9C, 0x39,
379     0x09, 0x55, 0x72, 0xD6, 0xDD, 0x69, 0x90, 0x1E,
380     0xB6, 0x1D, 0x36, 0x97, 0x49, 0x98, 0x99, 0x67,
381     0x4A, 0x3B, 0xCD, 0x2D, 0xEB, 0x32, 0xCA, 0x44,
382     0x4F, 0xB6, 0xC0, 0x9C, 0x4B, 0xF9, 0x18, 0x2E,
383     0x42, 0xAF, 0x8B, 0xE4, 0x45, 0xE8, 0x45, 0xEF,
384     0xF4, 0x10, 0x96, 0xF4, 0x16, 0xCA, 0xEB, 0xD1,
385     0x72, 0xCC, 0x32, 0x28, 0xA8, 0x46, 0x03, 0x34,
386     0x65, 0x3E, 0x47, 0xB2, 0xC3, 0x99, 0xE2, 0x36
387 };
388
389 const uint8_t pubkey_tc26_gost_3410_12_512_setC[] = {
390     0xA9, 0x85, 0x17, 0xF7, 0xFE, 0x1C, 0x43, 0x8A,
391     0xBE, 0xDE, 0x79, 0xE8, 0x62, 0xFE, 0x51, 0x0E,
392     0xA7, 0xEA, 0x05, 0x46, 0x34, 0xD9, 0x54, 0x5B,
393     0xFD, 0xB4, 0xC5, 0xCB, 0xA6, 0x9C, 0xFC, 0x90,
394     0x4B, 0x59, 0x14, 0xA1, 0xE7, 0x2A, 0xDE, 0x2B,
395     0xB8, 0x86, 0x9E, 0xB5, 0xDB, 0xB3, 0xD3, 0xD7,
396     0x95, 0x88, 0xCB, 0xEE, 0x33, 0x20, 0x82, 0xB2,
397     0xAC, 0xBF, 0x79, 0xDF, 0x2E, 0x88, 0xF0, 0x5A,
398     0x62, 0x90, 0x26, 0x52, 0xAD, 0x64, 0x67, 0x36,
399     0x1B, 0xE6, 0xCA, 0x57, 0x09, 0xEF, 0xF5, 0x56,
400     0x0E, 0x32, 0xDF, 0xB4, 0x6C, 0xC8, 0xA8, 0xBB,
401     0xCB, 0x4C, 0xB4, 0xBA, 0x63, 0x41, 0xBA, 0x1D,
402     0xAB, 0xB0, 0x12, 0x82, 0xFD, 0x50, 0x37, 0xDB,
403     0x69, 0x08, 0xF2, 0x7D, 0x9E, 0xC0, 0xF7, 0xA6,
404     0xE9, 0x50, 0x26, 0x94, 0x88, 0x08, 0x5E, 0xDD,
405     0x34, 0xC5, 0xC1, 0x9D, 0x50, 0x50, 0x4A, 0xAE
406 };
407 /* end */
408
409 static struct test_param cp_2001_256_a = {
410     .param      = NID_id_GostR3410_2001_CryptoPro_A_ParamSet,
411     .len        = 256 / 8,
412     .data       = data_2001_256_setA,
413     .data_len   = sizeof(data_2001_256_setA),
414     .hash       = hash_2001_256_setA,
415     .signature  = signature_2001_256_setA,
416     .pub_key    = pubkey_2001_256_setA,
417 };
418
419 static struct test_param cp_2001_256_b = {
420     .param      = NID_id_GostR3410_2001_CryptoPro_B_ParamSet,
421     .len        = 256 / 8,
422     .data       = data_2001_256_setB,
423     .data_len   = sizeof(data_2001_256_setB),
424     .hash       = hash_2001_256_setB,
425     .signature  = signature_2001_256_setB,
426     .pub_key    = pubkey_2001_256_setB,
427 };
428
429 static struct test_param cp_2001_256_c = {
430     .param      = NID_id_GostR3410_2001_CryptoPro_C_ParamSet,
431     .len        = 256 / 8,
432     .data       = data_2001_256_setC,
433     .data_len   = sizeof(data_2001_256_setC),
434     .hash       = hash_2001_256_setC,
435     .signature  = signature_2001_256_setC,
436     .pub_key    = pubkey_2001_256_setC,
437 };
438
439 static struct test_param tc_2012_256_a = {
440     .param      = NID_id_tc26_gost_3410_2012_256_paramSetA,
441     .len        = 256 / 8,
442     .data       = data_tc26_gost_3410_12_256_setA,
443     .data_len   = sizeof(data_tc26_gost_3410_12_256_setA),
444     .hash       = hash_tc26_gost_3410_12_256_setA,
445     .signature  = signature_tc26_gost_3410_12_256_setA,
446     .pub_key    = pubkey_tc26_gost_3410_12_256_setA,
447 };
448
449 static struct test_param tc_2012_512_a = {
450     .param      = NID_id_tc26_gost_3410_2012_512_paramSetA,
451     .len        = 512 / 8,
452     .data       = data_tc26_gost_3410_12_512_setA,
453     .data_len   = sizeof(data_tc26_gost_3410_12_512_setA),
454     .hash       = hash_tc26_gost_3410_12_512_setA,
455     .signature  = signature_tc26_gost_3410_12_512_setA,
456     .pub_key    = pubkey_tc26_gost_3410_12_512_setA,
457 };
458
459 static struct test_param tc_2012_512_b = {
460     .param      = NID_id_tc26_gost_3410_2012_512_paramSetB,
461     .len        = 512 / 8,
462     .data       = data_tc26_gost_3410_12_512_setB,
463     .data_len   = sizeof(data_tc26_gost_3410_12_512_setB),
464     .hash       = hash_tc26_gost_3410_12_512_setB,
465     .signature  = signature_tc26_gost_3410_12_512_setB,
466     .pub_key    = pubkey_tc26_gost_3410_12_512_setB,
467 };
468
469 static struct test_param tc_2012_512_c = {
470     .param      = NID_id_tc26_gost_3410_2012_512_paramSetC,
471     .len        = 512 / 8,
472     .data       = data_tc26_gost_3410_12_512_setC,
473     .data_len   = sizeof(data_tc26_gost_3410_12_512_setC),
474     .hash       = hash_tc26_gost_3410_12_512_setC,
475     .signature  = signature_tc26_gost_3410_12_512_setC,
476     .pub_key    = pubkey_tc26_gost_3410_12_512_setC,
477 };
478
479 static struct test_param *test_params[] = {
480     &cp_2001_256_a,
481     &cp_2001_256_b,
482     &cp_2001_256_c,
483     &tc_2012_256_a,
484     &tc_2012_512_a,
485     &tc_2012_512_b,
486     &tc_2012_512_c,
487     0,
488 };
489
490 /*
491  * Test certificates provided by Infotecs for Basealt SPO to test
492  * interop with open-source software.
493  */
494
495 unsigned char short_cp_a_cer[] = {
496     0x30, 0x82, 0x01, 0x57, 0x30, 0x82, 0x01, 0x04, 0xa0, 0x03, 0x02, 0x01,
497     0x02, 0x02, 0x01, 0x01, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x85, 0x03, 0x07,
498     0x01, 0x01, 0x03, 0x02, 0x30, 0x32, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03,
499     0x55, 0x04, 0x0a, 0x13, 0x08, 0x49, 0x6e, 0x66, 0x6f, 0x74, 0x65, 0x63,
500     0x73, 0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, 0x03, 0x1e, 0x14,
501     0x00, 0x73, 0x00, 0x68, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x74, 0x00, 0x5f,
502     0x00, 0x63, 0x00, 0x70, 0x00, 0x5f, 0x00, 0x61, 0x30, 0x1e, 0x17, 0x0d,
503     0x30, 0x31, 0x30, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
504     0x5a, 0x17, 0x0d, 0x34, 0x39, 0x31, 0x32, 0x33, 0x31, 0x30, 0x30, 0x30,
505     0x30, 0x30, 0x30, 0x5a, 0x30, 0x32, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03,
506     0x55, 0x04, 0x0a, 0x13, 0x08, 0x49, 0x6e, 0x66, 0x6f, 0x74, 0x65, 0x63,
507     0x73, 0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, 0x03, 0x1e, 0x14,
508     0x00, 0x73, 0x00, 0x68, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x74, 0x00, 0x5f,
509     0x00, 0x63, 0x00, 0x70, 0x00, 0x5f, 0x00, 0x61, 0x30, 0x66, 0x30, 0x1f,
510     0x06, 0x08, 0x2a, 0x85, 0x03, 0x07, 0x01, 0x01, 0x01, 0x01, 0x30, 0x13,
511     0x06, 0x07, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x23, 0x01, 0x06, 0x08, 0x2a,
512     0x85, 0x03, 0x07, 0x01, 0x01, 0x02, 0x02, 0x03, 0x43, 0x00, 0x04, 0x40,
513     0x89, 0xb1, 0x32, 0x31, 0xd0, 0x22, 0xe1, 0x04, 0xe3, 0x47, 0xaf, 0xea,
514     0x7e, 0x0c, 0x7d, 0x3b, 0xae, 0xad, 0xc9, 0xe7, 0x01, 0xb2, 0x91, 0x54,
515     0x17, 0x4b, 0x24, 0xb5, 0xf9, 0x79, 0xae, 0x43, 0x77, 0xc1, 0x8d, 0xf8,
516     0x78, 0x96, 0x76, 0x3c, 0xa3, 0x93, 0x6b, 0x21, 0x8e, 0x09, 0xf5, 0x92,
517     0x55, 0xdd, 0x89, 0x46, 0x9b, 0x9a, 0xb5, 0x98, 0xd6, 0x73, 0x03, 0x36,
518     0xa4, 0x4e, 0x35, 0x08, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x85, 0x03, 0x07,
519     0x01, 0x01, 0x03, 0x02, 0x03, 0x41, 0x00, 0x85, 0x57, 0xfc, 0x0b, 0xc5,
520     0x57, 0x51, 0x41, 0xa9, 0xcd, 0xd0, 0x71, 0x92, 0x9b, 0x90, 0x57, 0x76,
521     0x9f, 0x7b, 0xb9, 0x01, 0xc0, 0x13, 0x07, 0xbe, 0x40, 0x86, 0x96, 0x05,
522     0xfe, 0x35, 0xc2, 0xe4, 0xa3, 0xb4, 0xe5, 0x3f, 0xff, 0x25, 0x95, 0x21,
523     0x97, 0x14, 0x94, 0x03, 0x3a, 0x93, 0xdb, 0xec, 0xf1, 0xd5, 0x8b, 0xf8,
524     0xcc, 0x85, 0xd4, 0xe3, 0x12, 0xea, 0x70, 0x38, 0xcf, 0x21, 0xd2
525 };
526
527 unsigned char short_cp_b_cer[] = {
528     0x30, 0x82, 0x01, 0x57, 0x30, 0x82, 0x01, 0x04, 0xa0, 0x03, 0x02, 0x01,
529     0x02, 0x02, 0x01, 0x02, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x85, 0x03, 0x07,
530     0x01, 0x01, 0x03, 0x02, 0x30, 0x32, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03,
531     0x55, 0x04, 0x0a, 0x13, 0x08, 0x49, 0x6e, 0x66, 0x6f, 0x74, 0x65, 0x63,
532     0x73, 0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, 0x03, 0x1e, 0x14,
533     0x00, 0x73, 0x00, 0x68, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x74, 0x00, 0x5f,
534     0x00, 0x63, 0x00, 0x70, 0x00, 0x5f, 0x00, 0x62, 0x30, 0x1e, 0x17, 0x0d,
535     0x30, 0x31, 0x30, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
536     0x5a, 0x17, 0x0d, 0x34, 0x39, 0x31, 0x32, 0x33, 0x31, 0x30, 0x30, 0x30,
537     0x30, 0x30, 0x30, 0x5a, 0x30, 0x32, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03,
538     0x55, 0x04, 0x0a, 0x13, 0x08, 0x49, 0x6e, 0x66, 0x6f, 0x74, 0x65, 0x63,
539     0x73, 0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, 0x03, 0x1e, 0x14,
540     0x00, 0x73, 0x00, 0x68, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x74, 0x00, 0x5f,
541     0x00, 0x63, 0x00, 0x70, 0x00, 0x5f, 0x00, 0x62, 0x30, 0x66, 0x30, 0x1f,
542     0x06, 0x08, 0x2a, 0x85, 0x03, 0x07, 0x01, 0x01, 0x01, 0x01, 0x30, 0x13,
543     0x06, 0x07, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x23, 0x02, 0x06, 0x08, 0x2a,
544     0x85, 0x03, 0x07, 0x01, 0x01, 0x02, 0x02, 0x03, 0x43, 0x00, 0x04, 0x40,
545     0x07, 0x6b, 0xce, 0x22, 0x95, 0x22, 0xa4, 0x6e, 0xdd, 0x7c, 0x23, 0x24,
546     0x37, 0xf5, 0x9c, 0x8c, 0x7b, 0xb0, 0x2b, 0x6f, 0xea, 0xa0, 0x2a, 0xe6,
547     0x1f, 0x3d, 0x42, 0x26, 0xaa, 0xee, 0x64, 0x08, 0xb5, 0x19, 0x2b, 0xf1,
548     0x70, 0xeb, 0x98, 0x98, 0x6d, 0xce, 0xcc, 0x8c, 0xc6, 0x2f, 0xfb, 0x6f,
549     0xc0, 0x5c, 0x59, 0xf3, 0xcd, 0x89, 0x32, 0x80, 0xd0, 0x32, 0xfc, 0xa7,
550     0x78, 0x80, 0xfd, 0x76, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x85, 0x03, 0x07,
551     0x01, 0x01, 0x03, 0x02, 0x03, 0x41, 0x00, 0x1e, 0x42, 0xcb, 0x48, 0x23,
552     0x5b, 0x2b, 0xb0, 0x56, 0xd2, 0xd1, 0x58, 0xb0, 0x9c, 0xee, 0x6e, 0xb4,
553     0x5f, 0x5d, 0x48, 0x24, 0x07, 0x15, 0x8a, 0xf7, 0x0d, 0xb3, 0x97, 0x86,
554     0x55, 0xb3, 0xed, 0x57, 0x7b, 0xf2, 0x67, 0xef, 0x97, 0xd8, 0x8f, 0xc6,
555     0xb7, 0xcd, 0x98, 0x51, 0x48, 0xc5, 0x76, 0xf1, 0x48, 0x17, 0x1e, 0xcd,
556     0x48, 0x4f, 0xd8, 0xe8, 0x5d, 0x2c, 0xa8, 0xc0, 0x45, 0xdf, 0x2d
557 };
558
559 unsigned char short_cp_c_cer[] = {
560     0x30, 0x82, 0x01, 0x57, 0x30, 0x82, 0x01, 0x04, 0xa0, 0x03, 0x02, 0x01,
561     0x02, 0x02, 0x01, 0x03, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x85, 0x03, 0x07,
562     0x01, 0x01, 0x03, 0x02, 0x30, 0x32, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03,
563     0x55, 0x04, 0x0a, 0x13, 0x08, 0x49, 0x6e, 0x66, 0x6f, 0x74, 0x65, 0x63,
564     0x73, 0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, 0x03, 0x1e, 0x14,
565     0x00, 0x73, 0x00, 0x68, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x74, 0x00, 0x5f,
566     0x00, 0x63, 0x00, 0x70, 0x00, 0x5f, 0x00, 0x63, 0x30, 0x1e, 0x17, 0x0d,
567     0x30, 0x31, 0x30, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
568     0x5a, 0x17, 0x0d, 0x34, 0x39, 0x31, 0x32, 0x33, 0x31, 0x30, 0x30, 0x30,
569     0x30, 0x30, 0x30, 0x5a, 0x30, 0x32, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03,
570     0x55, 0x04, 0x0a, 0x13, 0x08, 0x49, 0x6e, 0x66, 0x6f, 0x74, 0x65, 0x63,
571     0x73, 0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, 0x03, 0x1e, 0x14,
572     0x00, 0x73, 0x00, 0x68, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x74, 0x00, 0x5f,
573     0x00, 0x63, 0x00, 0x70, 0x00, 0x5f, 0x00, 0x63, 0x30, 0x66, 0x30, 0x1f,
574     0x06, 0x08, 0x2a, 0x85, 0x03, 0x07, 0x01, 0x01, 0x01, 0x01, 0x30, 0x13,
575     0x06, 0x07, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x23, 0x03, 0x06, 0x08, 0x2a,
576     0x85, 0x03, 0x07, 0x01, 0x01, 0x02, 0x02, 0x03, 0x43, 0x00, 0x04, 0x40,
577     0xe0, 0x8c, 0xa8, 0x1b, 0x04, 0x4a, 0x49, 0x17, 0x41, 0x58, 0x26, 0x78,
578     0xf4, 0x0f, 0x6e, 0x1c, 0x9d, 0x7c, 0xf0, 0xc7, 0x2b, 0xcf, 0x94, 0xe4,
579     0xa8, 0x15, 0x5d, 0xb1, 0xaf, 0x7a, 0x8b, 0x2e, 0x10, 0x8c, 0xe8, 0x66,
580     0x8d, 0xa9, 0xc6, 0x9b, 0x74, 0xb4, 0xb6, 0x45, 0xd2, 0xaa, 0xab, 0x56,
581     0xb6, 0x04, 0x22, 0x90, 0x56, 0xdf, 0xbb, 0xc2, 0xc0, 0x8a, 0x91, 0x88,
582     0x4d, 0x36, 0x4e, 0x84, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x85, 0x03, 0x07,
583     0x01, 0x01, 0x03, 0x02, 0x03, 0x41, 0x00, 0x34, 0x87, 0xfa, 0x75, 0x42,
584     0xbd, 0x0e, 0x1c, 0x37, 0x39, 0xef, 0x94, 0xaf, 0x6f, 0x47, 0xa9, 0x4e,
585     0x2b, 0x58, 0x4e, 0x5b, 0x65, 0x34, 0xcb, 0x64, 0xc9, 0x72, 0xaf, 0xb7,
586     0xbe, 0x63, 0x6a, 0x51, 0x9a, 0x0b, 0xac, 0x09, 0xc3, 0x9e, 0xb9, 0xbe,
587     0x06, 0x5f, 0xe5, 0x30, 0x66, 0x20, 0xa2, 0x61, 0xe7, 0x93, 0x13, 0x6e,
588     0xca, 0x0c, 0xbc, 0x3f, 0x49, 0x9f, 0x37, 0xef, 0x5d, 0xed, 0x80
589 };
590
591 unsigned char short_tc_a_cer[] = {
592     0x30, 0x82, 0x01, 0x4e, 0x30, 0x81, 0xfc, 0xa0, 0x03, 0x02, 0x01, 0x02,
593     0x02, 0x01, 0x06, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x85, 0x03, 0x07, 0x01,
594     0x01, 0x03, 0x02, 0x30, 0x32, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55,
595     0x04, 0x0a, 0x13, 0x08, 0x49, 0x6e, 0x66, 0x6f, 0x74, 0x65, 0x63, 0x73,
596     0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, 0x03, 0x1e, 0x14, 0x00,
597     0x73, 0x00, 0x68, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x74, 0x00, 0x5f, 0x00,
598     0x74, 0x00, 0x63, 0x00, 0x5f, 0x00, 0x61, 0x30, 0x1e, 0x17, 0x0d, 0x30,
599     0x31, 0x30, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a,
600     0x17, 0x0d, 0x34, 0x39, 0x31, 0x32, 0x33, 0x31, 0x30, 0x30, 0x30, 0x30,
601     0x30, 0x30, 0x5a, 0x30, 0x32, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55,
602     0x04, 0x0a, 0x13, 0x08, 0x49, 0x6e, 0x66, 0x6f, 0x74, 0x65, 0x63, 0x73,
603     0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, 0x03, 0x1e, 0x14, 0x00,
604     0x73, 0x00, 0x68, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x74, 0x00, 0x5f, 0x00,
605     0x74, 0x00, 0x63, 0x00, 0x5f, 0x00, 0x61, 0x30, 0x5e, 0x30, 0x17, 0x06,
606     0x08, 0x2a, 0x85, 0x03, 0x07, 0x01, 0x01, 0x01, 0x01, 0x30, 0x0b, 0x06,
607     0x09, 0x2a, 0x85, 0x03, 0x07, 0x01, 0x02, 0x01, 0x01, 0x01, 0x03, 0x43,
608     0x00, 0x04, 0x40, 0xe4, 0x63, 0xf2, 0xff, 0x74, 0x1c, 0x44, 0xb2, 0xc9,
609     0x3c, 0x9a, 0xc8, 0x04, 0xb6, 0xc4, 0x14, 0x43, 0x60, 0xf2, 0x42, 0x53,
610     0xd3, 0x1a, 0x29, 0xb1, 0xbd, 0x03, 0xf8, 0xbc, 0x5e, 0x14, 0x8d, 0x1a,
611     0x86, 0xc3, 0xb0, 0x9f, 0x4f, 0x05, 0x24, 0x20, 0xf0, 0x01, 0x9d, 0x86,
612     0xa1, 0x12, 0x93, 0x9d, 0xe8, 0xb1, 0x2a, 0xc4, 0x65, 0x9f, 0xc9, 0xb8,
613     0x07, 0x3a, 0x14, 0x88, 0xdc, 0xd7, 0x03, 0x30, 0x0a, 0x06, 0x08, 0x2a,
614     0x85, 0x03, 0x07, 0x01, 0x01, 0x03, 0x02, 0x03, 0x41, 0x00, 0x30, 0x0f,
615     0x56, 0x22, 0x1f, 0x69, 0x43, 0x54, 0x6c, 0x7c, 0x11, 0x43, 0xf8, 0x5a,
616     0xa0, 0xf0, 0x33, 0x61, 0x07, 0x9b, 0x1c, 0xa5, 0xf1, 0xaa, 0x61, 0x4c,
617     0xe9, 0x8b, 0x3b, 0x82, 0x0c, 0xb2, 0x2f, 0x8b, 0xb5, 0xd6, 0x38, 0xb1,
618     0x92, 0xb1, 0xc3, 0x74, 0x9a, 0x7c, 0x55, 0xb9, 0x5c, 0xfb, 0x8d, 0x1b,
619     0x00, 0x85, 0xad, 0x70, 0x9b, 0x6f, 0xb3, 0x32, 0x53, 0xc1, 0x85, 0x4b,
620     0xd0, 0xe4
621 };
622
623 unsigned char short_tc_b_cer[] = {
624     0x30, 0x82, 0x01, 0x4e, 0x30, 0x81, 0xfc, 0xa0, 0x03, 0x02, 0x01, 0x02,
625     0x02, 0x01, 0x07, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x85, 0x03, 0x07, 0x01,
626     0x01, 0x03, 0x02, 0x30, 0x32, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55,
627     0x04, 0x0a, 0x13, 0x08, 0x49, 0x6e, 0x66, 0x6f, 0x74, 0x65, 0x63, 0x73,
628     0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, 0x03, 0x1e, 0x14, 0x00,
629     0x73, 0x00, 0x68, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x74, 0x00, 0x5f, 0x00,
630     0x74, 0x00, 0x63, 0x00, 0x5f, 0x00, 0x62, 0x30, 0x1e, 0x17, 0x0d, 0x30,
631     0x31, 0x30, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a,
632     0x17, 0x0d, 0x34, 0x39, 0x31, 0x32, 0x33, 0x31, 0x30, 0x30, 0x30, 0x30,
633     0x30, 0x30, 0x5a, 0x30, 0x32, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55,
634     0x04, 0x0a, 0x13, 0x08, 0x49, 0x6e, 0x66, 0x6f, 0x74, 0x65, 0x63, 0x73,
635     0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, 0x03, 0x1e, 0x14, 0x00,
636     0x73, 0x00, 0x68, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x74, 0x00, 0x5f, 0x00,
637     0x74, 0x00, 0x63, 0x00, 0x5f, 0x00, 0x62, 0x30, 0x5e, 0x30, 0x17, 0x06,
638     0x08, 0x2a, 0x85, 0x03, 0x07, 0x01, 0x01, 0x01, 0x01, 0x30, 0x0b, 0x06,
639     0x09, 0x2a, 0x85, 0x03, 0x07, 0x01, 0x02, 0x01, 0x01, 0x02, 0x03, 0x43,
640     0x00, 0x04, 0x40, 0x36, 0xda, 0xe1, 0x60, 0x8c, 0x63, 0x67, 0xe1, 0xa7,
641     0x36, 0x2f, 0x40, 0x1b, 0x38, 0x18, 0x59, 0xee, 0x40, 0x3b, 0xed, 0x2d,
642     0x21, 0x97, 0x28, 0xa1, 0x68, 0x4e, 0xc0, 0xf2, 0x0a, 0xae, 0x67, 0x63,
643     0xe2, 0x22, 0x17, 0x34, 0x44, 0xd0, 0x67, 0x3f, 0x67, 0x02, 0x61, 0x28,
644     0xcb, 0x6d, 0xb0, 0x92, 0x01, 0x39, 0xba, 0xa5, 0x90, 0x66, 0x39, 0x23,
645     0xcf, 0xb9, 0x37, 0x13, 0xcf, 0xfe, 0x3c, 0x30, 0x0a, 0x06, 0x08, 0x2a,
646     0x85, 0x03, 0x07, 0x01, 0x01, 0x03, 0x02, 0x03, 0x41, 0x00, 0xff, 0x80,
647     0x61, 0xbf, 0x96, 0xef, 0x0e, 0x3d, 0x09, 0x15, 0xcf, 0xf3, 0x71, 0x03,
648     0x8d, 0x5d, 0xa3, 0x68, 0x45, 0x10, 0x19, 0x6f, 0x0e, 0x08, 0xa0, 0xc3,
649     0xc8, 0xc6, 0x97, 0x81, 0x40, 0x2f, 0xd8, 0xeb, 0xe3, 0xc0, 0x3d, 0xac,
650     0xbf, 0xb7, 0x8f, 0x27, 0xc3, 0xd0, 0x57, 0x49, 0x69, 0x35, 0x3c, 0xab,
651     0x49, 0xbc, 0xef, 0x3a, 0x0c, 0x0c, 0xc3, 0x92, 0xf8, 0x74, 0xba, 0xaf,
652     0xa8, 0x15
653 };
654
655 unsigned char short_tc_c_cer[] = {
656     0x30, 0x82, 0x01, 0x4e, 0x30, 0x81, 0xfc, 0xa0, 0x03, 0x02, 0x01, 0x02,
657     0x02, 0x01, 0x08, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x85, 0x03, 0x07, 0x01,
658     0x01, 0x03, 0x02, 0x30, 0x32, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55,
659     0x04, 0x0a, 0x13, 0x08, 0x49, 0x6e, 0x66, 0x6f, 0x74, 0x65, 0x63, 0x73,
660     0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, 0x03, 0x1e, 0x14, 0x00,
661     0x73, 0x00, 0x68, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x74, 0x00, 0x5f, 0x00,
662     0x74, 0x00, 0x63, 0x00, 0x5f, 0x00, 0x63, 0x30, 0x1e, 0x17, 0x0d, 0x30,
663     0x31, 0x30, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a,
664     0x17, 0x0d, 0x34, 0x39, 0x31, 0x32, 0x33, 0x31, 0x30, 0x30, 0x30, 0x30,
665     0x30, 0x30, 0x5a, 0x30, 0x32, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55,
666     0x04, 0x0a, 0x13, 0x08, 0x49, 0x6e, 0x66, 0x6f, 0x74, 0x65, 0x63, 0x73,
667     0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, 0x03, 0x1e, 0x14, 0x00,
668     0x73, 0x00, 0x68, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x74, 0x00, 0x5f, 0x00,
669     0x74, 0x00, 0x63, 0x00, 0x5f, 0x00, 0x63, 0x30, 0x5e, 0x30, 0x17, 0x06,
670     0x08, 0x2a, 0x85, 0x03, 0x07, 0x01, 0x01, 0x01, 0x01, 0x30, 0x0b, 0x06,
671     0x09, 0x2a, 0x85, 0x03, 0x07, 0x01, 0x02, 0x01, 0x01, 0x03, 0x03, 0x43,
672     0x00, 0x04, 0x40, 0xb7, 0x10, 0xef, 0x13, 0x4b, 0x97, 0x0e, 0x19, 0x9b,
673     0x20, 0x3d, 0xb6, 0x7a, 0x3f, 0xa6, 0x3b, 0x70, 0xe1, 0xc1, 0x97, 0x1c,
674     0xe2, 0x9f, 0xb8, 0x09, 0x1f, 0xb6, 0xd6, 0x69, 0x01, 0x4d, 0x18, 0xaf,
675     0xde, 0xb4, 0xe3, 0xda, 0xab, 0x7c, 0xc8, 0x74, 0xd0, 0x59, 0x8b, 0x19,
676     0xdc, 0x63, 0x04, 0x36, 0x64, 0x0f, 0xc2, 0x1e, 0xdb, 0x0f, 0xc6, 0x0b,
677     0x2e, 0x3c, 0xbf, 0x5a, 0x68, 0x71, 0x5b, 0x30, 0x0a, 0x06, 0x08, 0x2a,
678     0x85, 0x03, 0x07, 0x01, 0x01, 0x03, 0x02, 0x03, 0x41, 0x00, 0x0c, 0xe1,
679     0xa3, 0x47, 0xe1, 0xa8, 0xfb, 0x21, 0xde, 0x98, 0x52, 0x69, 0x9e, 0x03,
680     0x5f, 0x0d, 0xbc, 0x37, 0xae, 0x86, 0xcb, 0x1c, 0x36, 0x6f, 0x97, 0x23,
681     0x37, 0x17, 0xac, 0x5f, 0x9a, 0x25, 0x56, 0x7c, 0xbd, 0x60, 0x60, 0xc1,
682     0xcd, 0xe1, 0x58, 0xf8, 0x49, 0x9e, 0x41, 0xab, 0xe5, 0x9e, 0xcd, 0xed,
683     0xf9, 0x74, 0x89, 0xc5, 0x1a, 0xc7, 0xa3, 0x88, 0x59, 0xcc, 0x79, 0x79,
684     0x9a, 0x7f
685 };
686
687 unsigned char short_tc_d_cer[] = {
688     0x30, 0x82, 0x01, 0x4e, 0x30, 0x81, 0xfc, 0xa0, 0x03, 0x02, 0x01, 0x02,
689     0x02, 0x01, 0x09, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x85, 0x03, 0x07, 0x01,
690     0x01, 0x03, 0x02, 0x30, 0x32, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55,
691     0x04, 0x0a, 0x13, 0x08, 0x49, 0x6e, 0x66, 0x6f, 0x74, 0x65, 0x63, 0x73,
692     0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, 0x03, 0x1e, 0x14, 0x00,
693     0x73, 0x00, 0x68, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x74, 0x00, 0x5f, 0x00,
694     0x74, 0x00, 0x63, 0x00, 0x5f, 0x00, 0x64, 0x30, 0x1e, 0x17, 0x0d, 0x30,
695     0x31, 0x30, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a,
696     0x17, 0x0d, 0x34, 0x39, 0x31, 0x32, 0x33, 0x31, 0x30, 0x30, 0x30, 0x30,
697     0x30, 0x30, 0x5a, 0x30, 0x32, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55,
698     0x04, 0x0a, 0x13, 0x08, 0x49, 0x6e, 0x66, 0x6f, 0x74, 0x65, 0x63, 0x73,
699     0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, 0x03, 0x1e, 0x14, 0x00,
700     0x73, 0x00, 0x68, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x74, 0x00, 0x5f, 0x00,
701     0x74, 0x00, 0x63, 0x00, 0x5f, 0x00, 0x64, 0x30, 0x5e, 0x30, 0x17, 0x06,
702     0x08, 0x2a, 0x85, 0x03, 0x07, 0x01, 0x01, 0x01, 0x01, 0x30, 0x0b, 0x06,
703     0x09, 0x2a, 0x85, 0x03, 0x07, 0x01, 0x02, 0x01, 0x01, 0x04, 0x03, 0x43,
704     0x00, 0x04, 0x40, 0x15, 0x8e, 0xa3, 0x12, 0x7a, 0xb2, 0xaa, 0x91, 0x45,
705     0xd2, 0x85, 0xfe, 0xbb, 0xcd, 0x58, 0xce, 0xd0, 0x0a, 0x99, 0x2c, 0x5d,
706     0x85, 0x88, 0x70, 0xb9, 0x3e, 0x51, 0x20, 0xca, 0x17, 0x67, 0x03, 0xa0,
707     0xa6, 0x28, 0x71, 0x0d, 0xa7, 0x1f, 0x32, 0xce, 0x14, 0x56, 0xf2, 0x4e,
708     0xf7, 0x66, 0x67, 0x78, 0xaf, 0x41, 0x41, 0x66, 0xf2, 0xc0, 0x61, 0xda,
709     0x8a, 0x35, 0x52, 0xf0, 0x81, 0x8d, 0x4a, 0x30, 0x0a, 0x06, 0x08, 0x2a,
710     0x85, 0x03, 0x07, 0x01, 0x01, 0x03, 0x02, 0x03, 0x41, 0x00, 0x12, 0xf8,
711     0x5e, 0x95, 0x57, 0xce, 0xee, 0xb0, 0x32, 0xf6, 0x96, 0x3c, 0x44, 0x01,
712     0x86, 0x07, 0x1f, 0x31, 0x7c, 0xcc, 0xa0, 0x30, 0x25, 0xa6, 0x69, 0x89,
713     0x2c, 0xde, 0xd4, 0x32, 0x06, 0x81, 0x75, 0x43, 0xe7, 0xca, 0xce, 0x1c,
714     0x3b, 0xa5, 0x43, 0xde, 0x44, 0x3e, 0x54, 0x35, 0x39, 0x3a, 0x80, 0x4b,
715     0x4f, 0xdb, 0x90, 0x09, 0x31, 0xa5, 0x8f, 0xf6, 0x66, 0xb6, 0xf1, 0x84,
716     0x9c, 0x82
717 };
718
719 unsigned char long_tc_a_cer[] = {
720     0x30, 0x82, 0x01, 0xcf, 0x30, 0x82, 0x01, 0x3b, 0xa0, 0x03, 0x02, 0x01,
721     0x02, 0x02, 0x01, 0x0a, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x85, 0x03, 0x07,
722     0x01, 0x01, 0x03, 0x03, 0x30, 0x30, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03,
723     0x55, 0x04, 0x0a, 0x13, 0x08, 0x49, 0x6e, 0x66, 0x6f, 0x74, 0x65, 0x63,
724     0x73, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x03, 0x1e, 0x12,
725     0x00, 0x6c, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x5f, 0x00, 0x74,
726     0x00, 0x63, 0x00, 0x5f, 0x00, 0x61, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x31,
727     0x30, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17,
728     0x0d, 0x34, 0x39, 0x31, 0x32, 0x33, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30,
729     0x30, 0x5a, 0x30, 0x30, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04,
730     0x0a, 0x13, 0x08, 0x49, 0x6e, 0x66, 0x6f, 0x74, 0x65, 0x63, 0x73, 0x31,
731     0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x03, 0x1e, 0x12, 0x00, 0x6c,
732     0x00, 0x6f, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x5f, 0x00, 0x74, 0x00, 0x63,
733     0x00, 0x5f, 0x00, 0x61, 0x30, 0x81, 0xa0, 0x30, 0x17, 0x06, 0x08, 0x2a,
734     0x85, 0x03, 0x07, 0x01, 0x01, 0x01, 0x02, 0x30, 0x0b, 0x06, 0x09, 0x2a,
735     0x85, 0x03, 0x07, 0x01, 0x02, 0x01, 0x02, 0x01, 0x03, 0x81, 0x84, 0x00,
736     0x04, 0x81, 0x80, 0x6b, 0xcb, 0x7e, 0xd5, 0x29, 0x12, 0x3b, 0xda, 0x9e,
737     0x97, 0x11, 0x66, 0x56, 0xab, 0x76, 0x1d, 0xd8, 0x4b, 0x88, 0x96, 0x10,
738     0xbf, 0x42, 0xae, 0x08, 0x9e, 0xcc, 0xcc, 0xdf, 0xc9, 0x17, 0xe8, 0x13,
739     0x70, 0x38, 0x31, 0x61, 0x3f, 0xde, 0xff, 0x9a, 0x64, 0x92, 0xe1, 0xc1,
740     0x80, 0xef, 0x65, 0xe8, 0xe4, 0xc2, 0xd8, 0xb1, 0xaa, 0x2a, 0xa8, 0x71,
741     0xaf, 0x56, 0x07, 0xd0, 0x71, 0x21, 0x3b, 0xb8, 0x57, 0x23, 0x90, 0x0d,
742     0x6d, 0x6c, 0x46, 0x1e, 0x2a, 0xa6, 0xc5, 0xb8, 0x9d, 0x49, 0xe2, 0x50,
743     0x2e, 0x8d, 0xaa, 0xb8, 0x68, 0x30, 0xbd, 0x78, 0x9c, 0xa3, 0x84, 0x9a,
744     0x7e, 0x77, 0xd7, 0xa9, 0xf9, 0x29, 0xd9, 0xe5, 0xc5, 0xb3, 0x10, 0xc6,
745     0x0b, 0x7b, 0x23, 0x7d, 0xa6, 0x9e, 0x2b, 0xa5, 0x33, 0x46, 0xe0, 0x75,
746     0x7b, 0x4b, 0xac, 0xca, 0x0f, 0x75, 0xe9, 0xc1, 0xd3, 0xff, 0xb4, 0x30,
747     0x0a, 0x06, 0x08, 0x2a, 0x85, 0x03, 0x07, 0x01, 0x01, 0x03, 0x03, 0x03,
748     0x81, 0x81, 0x00, 0x19, 0x47, 0x1c, 0xb7, 0x65, 0xff, 0x15, 0x60, 0x39,
749     0x8c, 0xfc, 0x8d, 0xfc, 0xaa, 0xef, 0x20, 0x0c, 0x7c, 0xf8, 0xb7, 0xfe,
750     0x17, 0xcf, 0xa0, 0x3a, 0x50, 0x47, 0x71, 0x5e, 0xa8, 0x54, 0xa2, 0xec,
751     0xbd, 0xc3, 0xbe, 0xdb, 0x42, 0x52, 0xe3, 0xb8, 0xb9, 0x91, 0x5d, 0x0b,
752     0xbc, 0xc7, 0x91, 0xe0, 0xab, 0x41, 0x7e, 0x6c, 0x6c, 0x87, 0x1f, 0x34,
753     0xb6, 0x96, 0xe2, 0xc2, 0xe3, 0x2b, 0x3b, 0xd8, 0x60, 0x82, 0x0d, 0x9b,
754     0x9d, 0xf8, 0x4a, 0x06, 0x4a, 0x99, 0xc5, 0x33, 0x87, 0x1e, 0x21, 0x82,
755     0xed, 0x34, 0x8e, 0xf5, 0xe7, 0x86, 0x7f, 0xec, 0x43, 0xff, 0x73, 0xd4,
756     0xc2, 0x67, 0xfe, 0xd8, 0x51, 0x99, 0x60, 0x76, 0x6f, 0xab, 0x85, 0x45,
757     0x92, 0xe9, 0x5c, 0xc5, 0x7d, 0x7f, 0x47, 0xf8, 0x46, 0xbe, 0x57, 0xdc,
758     0x16, 0x90, 0x50, 0x90, 0x4c, 0x88, 0x94, 0x69, 0x4e, 0x07, 0x9b
759 };
760
761 unsigned char long_tc_b_cer[] = {
762     0x30, 0x82, 0x01, 0xcf, 0x30, 0x82, 0x01, 0x3b, 0xa0, 0x03, 0x02, 0x01,
763     0x02, 0x02, 0x01, 0x0b, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x85, 0x03, 0x07,
764     0x01, 0x01, 0x03, 0x03, 0x30, 0x30, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03,
765     0x55, 0x04, 0x0a, 0x13, 0x08, 0x49, 0x6e, 0x66, 0x6f, 0x74, 0x65, 0x63,
766     0x73, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x03, 0x1e, 0x12,
767     0x00, 0x6c, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x5f, 0x00, 0x74,
768     0x00, 0x63, 0x00, 0x5f, 0x00, 0x62, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x31,
769     0x30, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17,
770     0x0d, 0x34, 0x39, 0x31, 0x32, 0x33, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30,
771     0x30, 0x5a, 0x30, 0x30, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04,
772     0x0a, 0x13, 0x08, 0x49, 0x6e, 0x66, 0x6f, 0x74, 0x65, 0x63, 0x73, 0x31,
773     0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x03, 0x1e, 0x12, 0x00, 0x6c,
774     0x00, 0x6f, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x5f, 0x00, 0x74, 0x00, 0x63,
775     0x00, 0x5f, 0x00, 0x62, 0x30, 0x81, 0xa0, 0x30, 0x17, 0x06, 0x08, 0x2a,
776     0x85, 0x03, 0x07, 0x01, 0x01, 0x01, 0x02, 0x30, 0x0b, 0x06, 0x09, 0x2a,
777     0x85, 0x03, 0x07, 0x01, 0x02, 0x01, 0x02, 0x02, 0x03, 0x81, 0x84, 0x00,
778     0x04, 0x81, 0x80, 0x9e, 0x7e, 0xa3, 0x49, 0x56, 0xbe, 0xe3, 0xf6, 0x43,
779     0x0d, 0x1d, 0xa0, 0xce, 0x43, 0x8b, 0x41, 0xec, 0x05, 0x0c, 0x06, 0x89,
780     0x19, 0xc0, 0x8d, 0xe8, 0xbc, 0xb1, 0xa1, 0x32, 0xe1, 0x68, 0x69, 0x0e,
781     0x1f, 0x2c, 0x77, 0x53, 0xc0, 0xc6, 0x9a, 0xca, 0x6a, 0xc5, 0x25, 0xa6,
782     0xf1, 0x15, 0xab, 0x6c, 0x1f, 0x38, 0xcd, 0xb0, 0x2b, 0xb9, 0x69, 0x67,
783     0x39, 0xb7, 0x90, 0x6b, 0xd6, 0x14, 0x38, 0x3e, 0x82, 0x7e, 0x53, 0xc1,
784     0x89, 0xd3, 0xea, 0x46, 0xe5, 0x5f, 0x72, 0x54, 0x70, 0x02, 0x26, 0x0c,
785     0x8c, 0xc9, 0xd1, 0x4c, 0xb9, 0xfd, 0xd2, 0x4d, 0x5e, 0x53, 0x6b, 0xa1,
786     0x56, 0xf9, 0xb7, 0xfd, 0x0f, 0x8f, 0x0c, 0x74, 0x66, 0xa4, 0x78, 0xf8,
787     0x0a, 0xcb, 0xe9, 0xc4, 0x5b, 0xf9, 0xd9, 0xb0, 0xdf, 0xc0, 0xc5, 0xa2,
788     0x2c, 0xd9, 0x27, 0x86, 0x99, 0xf1, 0x58, 0xaf, 0x46, 0xe1, 0x50, 0x30,
789     0x0a, 0x06, 0x08, 0x2a, 0x85, 0x03, 0x07, 0x01, 0x01, 0x03, 0x03, 0x03,
790     0x81, 0x81, 0x00, 0x05, 0x41, 0xea, 0x4e, 0x1d, 0x67, 0xc8, 0xe2, 0x91,
791     0xd2, 0x0c, 0xc6, 0xa5, 0x58, 0x32, 0xd6, 0xe5, 0x3f, 0x14, 0xe6, 0x97,
792     0x08, 0x7c, 0x99, 0x88, 0xf6, 0x10, 0xc7, 0xe8, 0x87, 0x83, 0x68, 0x24,
793     0xc7, 0x24, 0xc1, 0x69, 0x8c, 0x69, 0xe0, 0x40, 0x61, 0xd7, 0x64, 0xea,
794     0xa7, 0xa3, 0x0c, 0x18, 0x8d, 0xce, 0x48, 0x0e, 0x6e, 0x58, 0xa9, 0x9a,
795     0x57, 0xa7, 0x4e, 0xe9, 0x2c, 0x6b, 0x7a, 0x1a, 0xd6, 0x72, 0x56, 0x5a,
796     0x04, 0x0c, 0x57, 0xb6, 0x42, 0x72, 0x89, 0x03, 0x50, 0xd9, 0x63, 0xb7,
797     0x01, 0xc4, 0x07, 0x47, 0x80, 0xe1, 0xb1, 0xdd, 0x25, 0xf4, 0x2a, 0x93,
798     0xff, 0x5e, 0x07, 0x19, 0xc3, 0xe8, 0xb4, 0xd1, 0x6c, 0xad, 0x6c, 0xa3,
799     0x25, 0xd4, 0x3d, 0xcb, 0x9c, 0xc7, 0x87, 0x14, 0xe0, 0x7d, 0x31, 0x9d,
800     0xb6, 0x64, 0x94, 0xd1, 0x66, 0x3b, 0xb0, 0xe6, 0x3a, 0xa2, 0xa1
801 };
802
803 unsigned char long_tc_c_cer[] = {
804     0x30, 0x82, 0x01, 0xcf, 0x30, 0x82, 0x01, 0x3b, 0xa0, 0x03, 0x02, 0x01,
805     0x02, 0x02, 0x01, 0x0c, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x85, 0x03, 0x07,
806     0x01, 0x01, 0x03, 0x03, 0x30, 0x30, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03,
807     0x55, 0x04, 0x0a, 0x13, 0x08, 0x49, 0x6e, 0x66, 0x6f, 0x74, 0x65, 0x63,
808     0x73, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x03, 0x1e, 0x12,
809     0x00, 0x6c, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x5f, 0x00, 0x74,
810     0x00, 0x63, 0x00, 0x5f, 0x00, 0x63, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x31,
811     0x30, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17,
812     0x0d, 0x34, 0x39, 0x31, 0x32, 0x33, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30,
813     0x30, 0x5a, 0x30, 0x30, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04,
814     0x0a, 0x13, 0x08, 0x49, 0x6e, 0x66, 0x6f, 0x74, 0x65, 0x63, 0x73, 0x31,
815     0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x03, 0x1e, 0x12, 0x00, 0x6c,
816     0x00, 0x6f, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x5f, 0x00, 0x74, 0x00, 0x63,
817     0x00, 0x5f, 0x00, 0x63, 0x30, 0x81, 0xa0, 0x30, 0x17, 0x06, 0x08, 0x2a,
818     0x85, 0x03, 0x07, 0x01, 0x01, 0x01, 0x02, 0x30, 0x0b, 0x06, 0x09, 0x2a,
819     0x85, 0x03, 0x07, 0x01, 0x02, 0x01, 0x02, 0x03, 0x03, 0x81, 0x84, 0x00,
820     0x04, 0x81, 0x80, 0x27, 0xb1, 0xd2, 0x0d, 0x5e, 0x13, 0x65, 0x25, 0x72,
821     0x48, 0xe2, 0x84, 0xc8, 0xbc, 0x49, 0xf9, 0x72, 0x97, 0x16, 0x72, 0xc1,
822     0xb1, 0x38, 0xf4, 0xae, 0x6c, 0xe6, 0xb5, 0xf4, 0xa9, 0x20, 0xc8, 0xdc,
823     0x7f, 0x42, 0x95, 0x45, 0xf2, 0x1c, 0xbd, 0x13, 0xcf, 0x3b, 0x46, 0xd7,
824     0x1e, 0x13, 0xd2, 0xa9, 0x59, 0x08, 0x4b, 0x24, 0xc6, 0x7b, 0xe2, 0x07,
825     0x66, 0x8f, 0x5b, 0xe2, 0x7e, 0x07, 0xda, 0x7e, 0xb9, 0x95, 0xfa, 0x65,
826     0xd9, 0x6b, 0x1f, 0x9d, 0x19, 0x93, 0xcc, 0xba, 0x8e, 0x85, 0xb7, 0x29,
827     0xd3, 0x59, 0x4e, 0x4d, 0x3e, 0xff, 0xbe, 0x48, 0x29, 0x30, 0x7b, 0x72,
828     0x9f, 0xb0, 0xf2, 0xf0, 0x0d, 0xaf, 0x6d, 0x91, 0xde, 0x10, 0xed, 0x89,
829     0x84, 0x2f, 0xd3, 0xce, 0x20, 0x49, 0xf8, 0x53, 0xce, 0x58, 0xe0, 0x53,
830     0xa4, 0x7e, 0x13, 0xa2, 0xac, 0xb2, 0x3c, 0x7b, 0x00, 0x45, 0xad, 0x30,
831     0x0a, 0x06, 0x08, 0x2a, 0x85, 0x03, 0x07, 0x01, 0x01, 0x03, 0x03, 0x03,
832     0x81, 0x81, 0x00, 0x2a, 0x74, 0x42, 0xd6, 0x03, 0x58, 0x49, 0x0a, 0x80,
833     0x4b, 0xaf, 0x0a, 0x1e, 0x59, 0x09, 0x00, 0x53, 0x5e, 0xba, 0x3a, 0x52,
834     0x06, 0x18, 0xaf, 0x17, 0x25, 0xb0, 0x5c, 0x45, 0x39, 0xea, 0xc2, 0xa0,
835     0x46, 0xb4, 0xbf, 0x20, 0xaf, 0xb2, 0xd4, 0x6c, 0x1d, 0x24, 0xd8, 0xcc,
836     0x7a, 0x10, 0x46, 0x69, 0xb2, 0xe6, 0x0f, 0x55, 0xc2, 0x56, 0x4b, 0x98,
837     0x65, 0xcc, 0xad, 0x81, 0x6d, 0x8f, 0x76, 0x3e, 0x7c, 0x05, 0x60, 0x4d,
838     0xce, 0xec, 0xb4, 0x9c, 0xfc, 0x4e, 0x2d, 0x03, 0xc0, 0x45, 0xff, 0x4e,
839     0x75, 0x12, 0x9a, 0x29, 0x3f, 0xe7, 0x5a, 0x90, 0xe6, 0x42, 0x82, 0x2a,
840     0xc2, 0xbf, 0x65, 0xf5, 0xe3, 0x10, 0xc6, 0x0b, 0xf3, 0x09, 0xaa, 0x66,
841     0xf9, 0xd7, 0x73, 0x8b, 0x28, 0x9c, 0x87, 0xd8, 0x35, 0x25, 0x8a, 0xd3,
842     0x27, 0x08, 0x8c, 0xa9, 0x94, 0xeb, 0x34, 0xb3, 0x9b, 0x5a, 0xbe
843 };
844 /* end */
845
846 #define D(y) { .name = #y, .cert = y, .len = sizeof(y) }
847 static struct test_cert {
848     const char *name;
849     const unsigned char *cert;
850     int len;
851 } test_certs[] = {
852     D(short_cp_a_cer),
853     D(short_cp_b_cer),
854     D(short_cp_c_cer),
855     D(short_tc_a_cer),
856     D(short_tc_b_cer),
857     D(short_tc_c_cer),
858     D(short_tc_d_cer),
859     D(long_tc_a_cer),
860     D(long_tc_b_cer),
861     D(long_tc_c_cer),
862     {0}
863 };
864 #undef D
865
866 static void hexdump(const void *ptr, size_t len)
867 {
868     const unsigned char *p = ptr;
869     size_t i, j;
870
871     for (i = 0; i < len; i += j) {
872         for (j = 0; j < 16 && i + j < len; j++)
873             printf("%s %02x", j? "" : "\n", p[i + j]);
874     }
875     printf("\n");
876 }
877
878 static void print_test_result(int err)
879 {
880     if (err == 1)
881         printf(cGREEN "correct" cNORM "\n");
882     else if (err == 0)
883         printf(cRED "incorrect" cNORM "\n");
884     else
885         ERR_print_errors_fp(stderr);
886 }
887
888 /* copy-paste from crypto/crmf/crmf_lib.c */
889 static int X509_PUBKEY_cmp(X509_PUBKEY *a, X509_PUBKEY *b)
890 {
891     X509_ALGOR *algA = NULL, *algB = NULL;
892     int res = 0;
893
894     if (a == b)
895         return 0;
896     if (a == NULL || !X509_PUBKEY_get0_param(NULL, NULL, NULL, &algA, a)
897         || algA == NULL)
898         return -1;
899     if (b == NULL || !X509_PUBKEY_get0_param(NULL, NULL, NULL, &algB, b)
900         || algB == NULL)
901         return 1;
902     if ((res = X509_ALGOR_cmp(algA, algB)) != 0)
903         return res;
904     return !EVP_PKEY_cmp(X509_PUBKEY_get0(a), X509_PUBKEY_get0(b));
905 }
906
907 static int test_cert(struct test_cert *tc)
908 {
909     int ret = 0, err;
910     X509 *x;
911     const unsigned char *p;
912
913     printf(cBLUE "Test %s (it): " cNORM, tc->name);
914     p = tc->cert;
915     T(x = d2i_X509(NULL, &p, tc->len));
916
917     X509_PUBKEY *xk;
918     TE(xk = X509_get_X509_PUBKEY(x));
919
920     /* Output algo and parameters. */
921     X509_ALGOR *palg;
922     ASN1_OBJECT *ppkalg;
923     T(X509_PUBKEY_get0_param(&ppkalg, NULL, 0, &palg, xk));
924     int algo_nid = OBJ_obj2nid(ppkalg);
925     printf(" (algo %s)", OBJ_nid2sn(algo_nid));
926     int pptype;
927     ASN1_STRING *pval = NULL;
928     X509_ALGOR_get0(NULL, &pptype, (void *)&pval, palg);
929
930     /* Low level access to parameters in case X509_get0_pubkey does not work. */
931     T(pptype == V_ASN1_SEQUENCE);
932     STACK_OF(ASN1_TYPE) *seq;
933     p = pval->data;
934     T(seq = d2i_ASN1_SEQUENCE_ANY(NULL, &p, pval->length));
935     ASN1_TYPE *p1; /* First parameter is curve OID. */
936     T(p1 = sk_ASN1_TYPE_value(seq, 0));
937     int param_nid = OBJ_obj2nid((ASN1_OBJECT *)(p1->value.ptr));
938     printf(" (curve %s)\n", OBJ_nid2sn(param_nid));
939     sk_ASN1_TYPE_pop_free(seq, ASN1_TYPE_free);
940
941     /*
942      * Conversion tests.
943      */
944     /* Convert cert to DER and back. */
945     BIO *bp;
946     T(bp = BIO_new(BIO_s_mem()));
947     T(i2d_X509_bio(bp, x));
948     X509 *y = NULL;
949     T(d2i_X509_bio(bp, &y));
950     err = X509_cmp(x, y);
951     printf("  d2i_X509_bio\t\t\t");
952     print_test_result(!err);
953     ret |= err;
954     X509_free(y);
955
956     /* Convert cert to PEM and back. */
957     y = NULL;
958     T(PEM_write_bio_X509(bp, x));
959     T(PEM_read_bio_X509(bp, &y, 0, NULL));
960     err = X509_cmp(x, y);
961     printf("  PEM_read_bio_X509\t\t");
962     print_test_result(!err);
963     ret |= err;
964     X509_free(y);
965
966     /* Convert public key to PEM and back. */
967     T(BIO_reset(bp));
968     T(PEM_write_bio_X509_PUBKEY(bp, xk));
969     X509_PUBKEY *tk = NULL;
970     T(PEM_read_bio_X509_PUBKEY(bp, &tk, NULL, NULL));
971     err = X509_PUBKEY_cmp(xk, tk);
972     X509_PUBKEY_free(tk);
973     printf("  PEM_read_bio_X509_PUBKEY\t");
974     print_test_result(!err);
975     ret |= err;
976
977     /* Convert public key to DER and back. */
978     T(BIO_reset(bp));
979     T(i2d_X509_PUBKEY_bio(bp, xk));
980     tk = NULL;
981     T(d2i_X509_PUBKEY_bio(bp, &tk));
982     err = X509_PUBKEY_cmp(xk, tk);
983     X509_PUBKEY_free(tk);
984     printf("  d2i_X509_PUBKEY_bio\t\t");
985     print_test_result(!err);
986     ret |= err;
987     BIO_free(bp);
988
989     /*
990      * Verify
991      */
992     printf("  X509_verify API\t\t");
993     fflush(stdout);
994     EVP_PKEY *pk;
995     TE(pk = X509_get0_pubkey(x));
996     /* Similar to: openssl verify -partial_chain -check_ss_sig ... */
997     /* X509_verify uses EVP_DigestVerify internally */
998     err = X509_verify(x, pk);
999     print_test_result(err);
1000     ret |= err != 1;
1001
1002     /* Verify manually. */
1003     const ASN1_BIT_STRING *signature;
1004     X509_get0_signature(&signature, NULL, x);
1005     unsigned char *tbs = NULL; /* signed part */
1006     int tbs_len;
1007     T((tbs_len = i2d_re_X509_tbs(x, &tbs)) > 0);
1008     int algnid, hash_nid, pknid;
1009     T(algnid = X509_get_signature_nid(x));
1010     T(OBJ_find_sigid_algs(algnid, &hash_nid, &pknid));
1011
1012     printf("  EVP_Verify API\t\t");
1013     EVP_MD_CTX *md_ctx;
1014     T(md_ctx = EVP_MD_CTX_new());
1015     const EVP_MD *mdtype;
1016     T(mdtype = EVP_get_digestbynid(hash_nid));
1017     T(EVP_VerifyInit(md_ctx, mdtype));
1018     T(EVP_VerifyUpdate(md_ctx, tbs, tbs_len));
1019     err = EVP_VerifyFinal(md_ctx, signature->data, signature->length, pk);
1020     print_test_result(err);
1021     EVP_MD_CTX_free(md_ctx);
1022     ret |= err != 1;
1023
1024     X509_free(x);
1025     OPENSSL_free(tbs);
1026     return ret;
1027 }
1028
1029 /* Generate EC_KEY with proper parameters using temporary PKEYs.
1030  * This emulates fill_GOST_EC_params() call.
1031  */
1032 static int EC_KEY_create(int type, int param_nid, EC_KEY *dst)
1033 {
1034     EVP_PKEY *pkey;
1035     T(pkey = EVP_PKEY_new());
1036     T(EVP_PKEY_set_type(pkey, type));
1037     EVP_PKEY_CTX *ctx;
1038     T(ctx = EVP_PKEY_CTX_new(pkey, NULL));
1039     T(EVP_PKEY_paramgen_init(ctx));
1040     T(EVP_PKEY_CTX_ctrl(ctx, type, -1, EVP_PKEY_CTRL_GOST_PARAMSET, param_nid, NULL));
1041     EVP_PKEY *pkey2 = NULL;
1042     int err;
1043     TE((err = EVP_PKEY_paramgen(ctx, &pkey2)) == 1);
1044     T(EC_KEY_copy(dst, EVP_PKEY_get0(pkey2)));
1045     EVP_PKEY_CTX_free(ctx);
1046     EVP_PKEY_free(pkey);
1047     EVP_PKEY_free(pkey2);
1048     return err;
1049 }
1050
1051 static int test_param(struct test_param *t)
1052 {
1053     int ret = 0, err = 0;
1054     int type = 0;
1055     int hash_nid = 0;
1056     const char *sn = OBJ_nid2sn(t->param);
1057
1058     printf(cBLUE "Test %s (cp):" cNORM "\n", sn);
1059
1060     switch (t->len) {
1061         case 256 / 8:
1062             type = NID_id_GostR3410_2012_256;
1063             break;
1064         case 512 / 8:
1065             type = NID_id_GostR3410_2012_512;
1066             break;
1067         default:
1068             OpenSSLDie(__FILE__, __LINE__, "invalid len");
1069     }
1070     switch (type) {
1071         case NID_id_GostR3410_2012_256:
1072             hash_nid = NID_id_GostR3411_2012_256;
1073             break;
1074         case NID_id_GostR3410_2012_512:
1075             hash_nid = NID_id_GostR3411_2012_512;
1076             break;
1077         default:
1078             OpenSSLDie(__FILE__, __LINE__, "invalid type");
1079     }
1080
1081     /* Manually construct public key */
1082     EC_KEY *ec;
1083     T(ec = EC_KEY_new());
1084     T(EC_KEY_create(type, t->param, ec));
1085     const EC_GROUP *group;
1086     T(group = EC_KEY_get0_group(ec));
1087     unsigned char *pub_key;
1088     T(pub_key = OPENSSL_malloc(t->len * 2));
1089     BUF_reverse(pub_key, t->pub_key, t->len * 2);
1090     BIGNUM *x, *y;
1091     T(y = BN_bin2bn(pub_key, t->len, NULL));
1092     T(x = BN_bin2bn(pub_key + t->len, t->len, NULL));
1093     OPENSSL_free(pub_key);
1094     EC_POINT *pk;
1095     T(pk = EC_POINT_new(group));
1096     T(EC_POINT_set_affine_coordinates(group, pk, x, y, NULL));
1097     BN_free(x);
1098     BN_free(y);
1099     T(EC_KEY_set_public_key(ec, pk));
1100     EC_POINT_free(pk);
1101
1102     EVP_PKEY *pkey;
1103     T(pkey = EVP_PKEY_new());
1104     T(EVP_PKEY_assign(pkey, type, ec));
1105     int siglen = EVP_PKEY_size(pkey);
1106
1107     /*
1108      * Verify
1109      */
1110     EVP_PKEY_CTX *ctx;
1111     T(ctx = EVP_PKEY_CTX_new(pkey, NULL));
1112     unsigned char *sig;
1113     T(sig = OPENSSL_malloc(siglen));
1114     /* Need to reverse provided signature for unknown reason,
1115      * contrary to how it goes into signature. */
1116     BUF_reverse(sig, t->signature, siglen);
1117
1118     /* Verify using EVP_PKEY_verify API */
1119     printf("  EVP_PKEY_verify API\t\t");
1120     T(EVP_PKEY_verify_init(ctx));
1121     err = EVP_PKEY_verify(ctx, sig, siglen, t->hash, t->len);
1122     EVP_PKEY_CTX_free(ctx);
1123     print_test_result(err);
1124     ret |= err != 1;
1125
1126     /* Verify using EVP_Verify API */
1127     if (t->data) {
1128         printf("  EVP_Verify API\t\t");
1129         EVP_MD_CTX *md_ctx;
1130         T(md_ctx = EVP_MD_CTX_new());
1131         const EVP_MD *mdtype;
1132         T(mdtype = EVP_get_digestbynid(hash_nid));
1133         T(EVP_VerifyInit(md_ctx, mdtype));
1134         /* Feed byte-by-byte. */
1135         size_t i;
1136         for (i = 0; i < t->data_len; i++)
1137             T(EVP_VerifyUpdate(md_ctx, &t->data[i], 1));
1138         err = EVP_VerifyFinal(md_ctx, sig, siglen, pkey);
1139         print_test_result(err);
1140         EVP_MD_CTX_free(md_ctx);
1141         ret |= err != 1;
1142     }
1143
1144     /* Verify using EVP_DigestVerifyInit API */
1145     if (t->data) {
1146         printf("  EVP_DigestVerifyInit API\t");
1147         EVP_MD_CTX *md_ctx;
1148         T(md_ctx = EVP_MD_CTX_new());
1149         const EVP_MD *mdtype;
1150         T(mdtype = EVP_get_digestbynid(hash_nid));
1151         T(EVP_DigestVerifyInit(md_ctx, NULL, mdtype, NULL, pkey));
1152         /* Verify in one step. */
1153         err = EVP_DigestVerify(md_ctx, sig, siglen, t->data, t->data_len);
1154         print_test_result(err);
1155         EVP_MD_CTX_free(md_ctx);
1156         ret |= err != 1;
1157     }
1158
1159     OPENSSL_free(sig);
1160     EVP_PKEY_free(pkey);
1161     return ret;
1162 }
1163
1164 int main(int argc, char **argv)
1165 {
1166     int ret = 0;
1167
1168     OPENSSL_add_all_algorithms_conf();
1169
1170     struct test_param **tpp;
1171     for (tpp = test_params; *tpp; tpp++)
1172         ret |= test_param(*tpp);
1173
1174     struct test_cert *tc;
1175     for (tc = test_certs; tc->cert; tc++)
1176         ret |= test_cert(tc);
1177
1178     if (ret)
1179         printf(cDRED "= Some tests FAILED!" cNORM "\n");
1180     else
1181         printf(cDGREEN "= All tests passed!" cNORM "\n");
1182     return ret;
1183 }