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