]> www.wagner.pp.ru Git - openssl-gost/engine.git/blob - test_params.c
test_params: Avoid calls to fill_GOST_EC_params and bind_gost
[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) ({ if (!(e)) { \
23                 ERR_print_errors_fp(stderr); \
24                 OpenSSLDie(__FILE__, __LINE__, #e); \
25             } \
26         })
27 #define TE(e) ({ if (!(e)) { \
28                 ERR_print_errors_fp(stderr); \
29                 fprintf(stderr, "Error at %s:%d %s\n", __FILE__, __LINE__, #e); \
30                 return -1; \
31             } \
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\n" cNORM); \
43              else \
44                  printf(cGREEN "  Test passed\n" cNORM);}
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\n" cNORM);
877     else if (err == 0)
878         printf(cRED "incorrect\n" cNORM);
879     else
880         ERR_print_errors_fp(stderr);
881 }
882
883 static int test_cert(struct test_cert *tc)
884 {
885     int err = 0;
886     X509 *x;
887     const unsigned char *p;
888
889     printf(cBLUE "Test %s (it):\n" cNORM, tc->name);
890     p = tc->cert;
891     T(x = d2i_X509(NULL, &p, tc->len));
892
893     X509_PUBKEY *xk;
894     TE(xk = X509_get_X509_PUBKEY(x));
895
896     /* Output algo and parameters. */
897     X509_ALGOR *palg;
898     ASN1_OBJECT *ppkalg;
899     T(X509_PUBKEY_get0_param(&ppkalg, NULL, 0, &palg, xk));
900     int algo_nid = OBJ_obj2nid(ppkalg);
901     printf(" (algo %s)", OBJ_nid2sn(algo_nid));
902     int pptype;
903     ASN1_STRING *pval = NULL;
904     X509_ALGOR_get0(NULL, &pptype, (void *)&pval, palg);
905
906     /* Low level access to parameters in case X509_get0_pubkey does not work. */
907     T(pptype == V_ASN1_SEQUENCE);
908     STACK_OF(ASN1_TYPE) *seq;
909     p = pval->data;
910     T(seq = d2i_ASN1_SEQUENCE_ANY(NULL, &p, pval->length));
911     ASN1_TYPE *p1; /* First parameter is curve OID. */
912     T(p1 = sk_ASN1_TYPE_value(seq, 0));
913     int param_nid = OBJ_obj2nid((ASN1_OBJECT *)(p1->value.ptr));
914     printf(" (curve %s)\n", OBJ_nid2sn(param_nid));
915     sk_ASN1_TYPE_pop_free(seq, ASN1_TYPE_free);
916
917     /*
918      * Verify
919      */
920     printf("  X509_verify API\t");
921     fflush(stdout);
922     EVP_PKEY *pk;
923     TE(pk = X509_get0_pubkey(x));
924     /* Similar to: openssl verify -partial_chain -check_ss_sig ... */
925     err = X509_verify(x, pk);
926     print_test_result(err);
927
928     return err != 1;
929 }
930
931 /* Generate EC_KEY with proper parameters using temporary PKEYs.
932  * This emulates fill_GOST_EC_params() call.
933  */
934 static int EC_KEY_create(int type, int param_nid, EC_KEY *dst)
935 {
936     EVP_PKEY *pkey;
937     T(pkey = EVP_PKEY_new());
938     T(EVP_PKEY_set_type(pkey, type));
939     EVP_PKEY_CTX *ctx;
940     T(ctx = EVP_PKEY_CTX_new(pkey, NULL));
941     T(EVP_PKEY_paramgen_init(ctx));
942     T(EVP_PKEY_CTX_ctrl(ctx, type, -1, EVP_PKEY_CTRL_GOST_PARAMSET, param_nid, NULL));
943     EVP_PKEY *pkey2 = NULL;
944     int err;
945     TE((err = EVP_PKEY_paramgen(ctx, &pkey2)) == 1);
946     T(EC_KEY_copy(dst, EVP_PKEY_get0(pkey2)));
947     EVP_PKEY_CTX_free(ctx);
948     EVP_PKEY_free(pkey);
949     EVP_PKEY_free(pkey2);
950     return err;
951 }
952
953 static int test_param(struct test_param *t)
954 {
955     int ret = 0, err = 0;
956     int type = 0;
957     int hash_nid = 0;
958     const char *sn = OBJ_nid2sn(t->param);
959
960     printf(cBLUE "Test %s (cp):\n" cNORM, sn);
961
962     switch (t->len) {
963         case 256 / 8:
964             type = NID_id_GostR3410_2012_256;
965             break;
966         case 512 / 8:
967             type = NID_id_GostR3410_2012_512;
968             break;
969         default:
970             OpenSSLDie(__FILE__, __LINE__, "invalid len");
971     }
972     switch (type) {
973         case NID_id_GostR3410_2012_256:
974             hash_nid = NID_id_GostR3411_2012_256;
975             break;
976         case NID_id_GostR3410_2012_512:
977             hash_nid = NID_id_GostR3411_2012_512;
978             break;
979         default:
980             OpenSSLDie(__FILE__, __LINE__, "invalid type");
981     }
982
983     /* Manually construct public key */
984     EC_KEY *ec;
985     T(ec = EC_KEY_new());
986     T(EC_KEY_create(type, t->param, ec));
987     const EC_GROUP *group;
988     T(group = EC_KEY_get0_group(ec));
989     unsigned char *pub_key;
990     T(pub_key = OPENSSL_malloc(t->len * 2));
991     BUF_reverse(pub_key, t->pub_key, t->len * 2);
992     BIGNUM *x, *y;
993     T(y = BN_bin2bn(pub_key, t->len, NULL));
994     T(x = BN_bin2bn(pub_key + t->len, t->len, NULL));
995     OPENSSL_free(pub_key);
996     EC_POINT *pk;
997     T(pk = EC_POINT_new(group));
998     T(EC_POINT_set_affine_coordinates(group, pk, x, y, NULL));
999     BN_free(x);
1000     BN_free(y);
1001     T(EC_KEY_set_public_key(ec, pk));
1002     EC_POINT_free(pk);
1003
1004     EVP_PKEY *pkey;
1005     T(pkey = EVP_PKEY_new());
1006     T(EVP_PKEY_assign(pkey, type, ec));
1007     int siglen = EVP_PKEY_size(pkey);
1008
1009     /*
1010      * Verify
1011      */
1012     EVP_PKEY_CTX *ctx;
1013     T(ctx = EVP_PKEY_CTX_new(pkey, NULL));
1014     unsigned char *sig;
1015     T(sig = OPENSSL_malloc(siglen));
1016     /* Need to reverse provided signature for unknown reason */
1017     BUF_reverse(sig, t->signature, siglen);
1018
1019     /* Verify using EVP_PKEY_verify API */
1020     printf("  EVP_PKEY_verify API\t");
1021     T(EVP_PKEY_verify_init(ctx));
1022     err = EVP_PKEY_verify(ctx, sig, siglen, t->hash, t->len);
1023     print_test_result(err);
1024     ret |= err != 1;
1025
1026     /* Verify using EVP_Verify API */
1027     if (t->data) {
1028         printf("  EVP_Verify API\t");
1029         EVP_MD_CTX *md_ctx;
1030         T(md_ctx = EVP_MD_CTX_new());
1031         const EVP_MD *mdtype;
1032         T(mdtype = EVP_get_digestbynid(hash_nid));
1033         T(EVP_VerifyInit(md_ctx, mdtype));
1034         T(EVP_VerifyUpdate(md_ctx, t->data, t->data_len));
1035         err = EVP_VerifyFinal(md_ctx, sig, siglen, pkey);
1036         print_test_result(err);
1037         EVP_MD_CTX_free(md_ctx);
1038         ret |= err != 1;
1039     }
1040
1041     OPENSSL_free(sig);
1042     return ret;
1043 }
1044
1045 int main(int argc, char **argv)
1046 {
1047     int ret = 0;
1048
1049     setenv("OPENSSL_CONF", "../example.conf", 0);
1050     OPENSSL_add_all_algorithms_conf();
1051     ERR_load_crypto_strings();
1052
1053     struct test_param **tpp;
1054     for (tpp = test_params; *tpp; tpp++)
1055         ret |= test_param(*tpp);
1056
1057     struct test_cert *tc;
1058     for (tc = test_certs; tc->cert; tc++)
1059         ret |= test_cert(tc);
1060
1061     return ret;
1062 }