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