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
10 #include "e_gost_err.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>
22 #define T(e) ({ if (!(e)) { \
23 ERR_print_errors_fp(stderr); \
24 OpenSSLDie(__FILE__, __LINE__, #e); \
27 #define TE(e) ({ if (!(e)) { \
28 ERR_print_errors_fp(stderr); \
29 fprintf(stderr, "Error at %s:%d %s\n", __FILE__, __LINE__, #e); \
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); \
44 printf(cGREEN " Test passed\n" cNORM);}
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 */
57 * Parameters provided by CryptoPro for Basealt SPO to test
58 * interop with open-source software.
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,
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,
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,
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,
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
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,
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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,
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
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
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
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,
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
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
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
404 static struct test_param cp_2001_256_a = {
405 .param = NID_id_GostR3410_2001_CryptoPro_A_ParamSet,
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,
414 static struct test_param cp_2001_256_b = {
415 .param = NID_id_GostR3410_2001_CryptoPro_B_ParamSet,
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,
424 static struct test_param cp_2001_256_c = {
425 .param = NID_id_GostR3410_2001_CryptoPro_C_ParamSet,
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,
434 static struct test_param tc_2012_256_a = {
435 .param = NID_id_tc26_gost_3410_2012_256_paramSetA,
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,
444 static struct test_param tc_2012_512_a = {
445 .param = NID_id_tc26_gost_3410_2012_512_paramSetA,
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,
454 static struct test_param tc_2012_512_b = {
455 .param = NID_id_tc26_gost_3410_2012_512_paramSetB,
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,
464 static struct test_param tc_2012_512_c = {
465 .param = NID_id_tc26_gost_3410_2012_512_paramSetC,
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,
474 static struct test_param *test_params[] = {
486 * Test certificates provided by Infotecs for Basealt SPO to test
487 * interop with open-source software.
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
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
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
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,
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,
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,
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,
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
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
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
841 #define D(y) { .name = #y, .cert = y, .len = sizeof(y) }
842 static struct test_cert {
844 const unsigned char *cert;
861 static void hexdump(const void *ptr, size_t len)
863 const unsigned char *p = ptr;
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]);
873 static void print_test_result(int err)
876 printf(cGREEN "correct\n" cNORM);
878 printf(cRED "incorrect\n" cNORM);
880 ERR_print_errors_fp(stderr);
883 static int test_cert(struct test_cert *tc)
887 const unsigned char *p;
889 printf(cBLUE "Test %s (it):\n" cNORM, tc->name);
891 T(x = d2i_X509(NULL, &p, tc->len));
894 TE(xk = X509_get_X509_PUBKEY(x));
896 /* Output algo and parameters. */
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));
903 ASN1_STRING *pval = NULL;
904 X509_ALGOR_get0(NULL, &pptype, (void *)&pval, palg);
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;
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);
920 printf(" X509_verify API\t\t");
923 TE(pk = X509_get0_pubkey(x));
924 /* Similar to: openssl verify -partial_chain -check_ss_sig ... */
925 /* X509_verify uses EVP_DigestVerify internally */
926 err = X509_verify(x, pk);
927 print_test_result(err);
930 /* Verify manually. */
931 const ASN1_BIT_STRING *signature;
932 X509_get0_signature(&signature, NULL, x);
933 unsigned char *tbs = NULL; /* signed part */
935 T((tbs_len = i2d_re_X509_tbs(x, &tbs)) > 0);
936 int algnid, hash_nid, pknid;
937 T(algnid = X509_get_signature_nid(x));
938 T(OBJ_find_sigid_algs(algnid, &hash_nid, &pknid));
940 printf(" EVP_Verify API\t\t");
942 T(md_ctx = EVP_MD_CTX_new());
943 const EVP_MD *mdtype;
944 T(mdtype = EVP_get_digestbynid(hash_nid));
945 T(EVP_VerifyInit(md_ctx, mdtype));
946 T(EVP_VerifyUpdate(md_ctx, tbs, tbs_len));
947 err = EVP_VerifyFinal(md_ctx, signature->data, signature->length, pk);
948 print_test_result(err);
949 EVP_MD_CTX_free(md_ctx);
957 /* Generate EC_KEY with proper parameters using temporary PKEYs.
958 * This emulates fill_GOST_EC_params() call.
960 static int EC_KEY_create(int type, int param_nid, EC_KEY *dst)
963 T(pkey = EVP_PKEY_new());
964 T(EVP_PKEY_set_type(pkey, type));
966 T(ctx = EVP_PKEY_CTX_new(pkey, NULL));
967 T(EVP_PKEY_paramgen_init(ctx));
968 T(EVP_PKEY_CTX_ctrl(ctx, type, -1, EVP_PKEY_CTRL_GOST_PARAMSET, param_nid, NULL));
969 EVP_PKEY *pkey2 = NULL;
971 TE((err = EVP_PKEY_paramgen(ctx, &pkey2)) == 1);
972 T(EC_KEY_copy(dst, EVP_PKEY_get0(pkey2)));
973 EVP_PKEY_CTX_free(ctx);
975 EVP_PKEY_free(pkey2);
979 static int test_param(struct test_param *t)
981 int ret = 0, err = 0;
984 const char *sn = OBJ_nid2sn(t->param);
986 printf(cBLUE "Test %s (cp):\n" cNORM, sn);
990 type = NID_id_GostR3410_2012_256;
993 type = NID_id_GostR3410_2012_512;
996 OpenSSLDie(__FILE__, __LINE__, "invalid len");
999 case NID_id_GostR3410_2012_256:
1000 hash_nid = NID_id_GostR3411_2012_256;
1002 case NID_id_GostR3410_2012_512:
1003 hash_nid = NID_id_GostR3411_2012_512;
1006 OpenSSLDie(__FILE__, __LINE__, "invalid type");
1009 /* Manually construct public key */
1011 T(ec = EC_KEY_new());
1012 T(EC_KEY_create(type, t->param, ec));
1013 const EC_GROUP *group;
1014 T(group = EC_KEY_get0_group(ec));
1015 unsigned char *pub_key;
1016 T(pub_key = OPENSSL_malloc(t->len * 2));
1017 BUF_reverse(pub_key, t->pub_key, t->len * 2);
1019 T(y = BN_bin2bn(pub_key, t->len, NULL));
1020 T(x = BN_bin2bn(pub_key + t->len, t->len, NULL));
1021 OPENSSL_free(pub_key);
1023 T(pk = EC_POINT_new(group));
1024 T(EC_POINT_set_affine_coordinates(group, pk, x, y, NULL));
1027 T(EC_KEY_set_public_key(ec, pk));
1031 T(pkey = EVP_PKEY_new());
1032 T(EVP_PKEY_assign(pkey, type, ec));
1033 int siglen = EVP_PKEY_size(pkey);
1039 T(ctx = EVP_PKEY_CTX_new(pkey, NULL));
1041 T(sig = OPENSSL_malloc(siglen));
1042 /* Need to reverse provided signature for unknown reason,
1043 * contrary to how it goes into signature. */
1044 BUF_reverse(sig, t->signature, siglen);
1046 /* Verify using EVP_PKEY_verify API */
1047 printf(" EVP_PKEY_verify API\t\t");
1048 T(EVP_PKEY_verify_init(ctx));
1049 err = EVP_PKEY_verify(ctx, sig, siglen, t->hash, t->len);
1050 EVP_PKEY_CTX_free(ctx);
1051 print_test_result(err);
1054 /* Verify using EVP_Verify API */
1056 printf(" EVP_Verify API\t\t");
1058 T(md_ctx = EVP_MD_CTX_new());
1059 const EVP_MD *mdtype;
1060 T(mdtype = EVP_get_digestbynid(hash_nid));
1061 T(EVP_VerifyInit(md_ctx, mdtype));
1062 /* Feed byte-by-byte. */
1064 for (i = 0; i < t->data_len; i++)
1065 T(EVP_VerifyUpdate(md_ctx, &t->data[i], 1));
1066 err = EVP_VerifyFinal(md_ctx, sig, siglen, pkey);
1067 print_test_result(err);
1068 EVP_MD_CTX_free(md_ctx);
1072 /* Verify using EVP_DigestVerifyInit API */
1074 printf(" EVP_DigestVerifyInit API\t");
1076 T(md_ctx = EVP_MD_CTX_new());
1077 const EVP_MD *mdtype;
1078 T(mdtype = EVP_get_digestbynid(hash_nid));
1079 T(EVP_DigestVerifyInit(md_ctx, NULL, mdtype, NULL, pkey));
1080 /* Verify in one step. */
1081 err = EVP_DigestVerify(md_ctx, sig, siglen, t->data, t->data_len);
1082 print_test_result(err);
1083 EVP_MD_CTX_free(md_ctx);
1088 EVP_PKEY_free(pkey);
1092 int main(int argc, char **argv)
1096 setenv("OPENSSL_ENGINES", ENGINE_DIR, 0);
1097 OPENSSL_add_all_algorithms_conf();
1098 ERR_load_crypto_strings();
1100 T(eng = ENGINE_by_id("gost"));
1101 T(ENGINE_init(eng));
1102 T(ENGINE_set_default(eng, ENGINE_METHOD_ALL));
1104 struct test_param **tpp;
1105 for (tpp = test_params; *tpp; tpp++)
1106 ret |= test_param(*tpp);
1108 struct test_cert *tc;
1109 for (tc = test_certs; tc->cert; tc++)
1110 ret |= test_cert(tc);