Made Base64 decoding constant-time (with regards to actual data byte contents).
[BearSSL] / src / ssl / ssl_hs_client.c
1 /* Automatically generated code; do not modify directly. */
2
3 #include <stddef.h>
4 #include <stdint.h>
5
6 typedef struct {
7 uint32_t *dp;
8 uint32_t *rp;
9 const unsigned char *ip;
10 } t0_context;
11
12 static uint32_t
13 t0_parse7E_unsigned(const unsigned char **p)
14 {
15 uint32_t x;
16
17 x = 0;
18 for (;;) {
19 unsigned y;
20
21 y = *(*p) ++;
22 x = (x << 7) | (uint32_t)(y & 0x7F);
23 if (y < 0x80) {
24 return x;
25 }
26 }
27 }
28
29 static int32_t
30 t0_parse7E_signed(const unsigned char **p)
31 {
32 int neg;
33 uint32_t x;
34
35 neg = ((**p) >> 6) & 1;
36 x = (uint32_t)-neg;
37 for (;;) {
38 unsigned y;
39
40 y = *(*p) ++;
41 x = (x << 7) | (uint32_t)(y & 0x7F);
42 if (y < 0x80) {
43 if (neg) {
44 return -(int32_t)~x - 1;
45 } else {
46 return (int32_t)x;
47 }
48 }
49 }
50 }
51
52 #define T0_VBYTE(x, n) (unsigned char)((((uint32_t)(x) >> (n)) & 0x7F) | 0x80)
53 #define T0_FBYTE(x, n) (unsigned char)(((uint32_t)(x) >> (n)) & 0x7F)
54 #define T0_SBYTE(x) (unsigned char)((((uint32_t)(x) >> 28) + 0xF8) ^ 0xF8)
55 #define T0_INT1(x) T0_FBYTE(x, 0)
56 #define T0_INT2(x) T0_VBYTE(x, 7), T0_FBYTE(x, 0)
57 #define T0_INT3(x) T0_VBYTE(x, 14), T0_VBYTE(x, 7), T0_FBYTE(x, 0)
58 #define T0_INT4(x) T0_VBYTE(x, 21), T0_VBYTE(x, 14), T0_VBYTE(x, 7), T0_FBYTE(x, 0)
59 #define T0_INT5(x) T0_SBYTE(x), T0_VBYTE(x, 21), T0_VBYTE(x, 14), T0_VBYTE(x, 7), T0_FBYTE(x, 0)
60
61 /* static const unsigned char t0_datablock[]; */
62
63
64 void br_ssl_hs_client_init_main(void *t0ctx);
65
66 void br_ssl_hs_client_run(void *t0ctx);
67
68
69
70 #include <stddef.h>
71 #include <string.h>
72
73 #include "inner.h"
74
75 /*
76 * This macro evaluates to a pointer to the current engine context.
77 */
78 #define ENG ((br_ssl_engine_context *)(void *)((unsigned char *)t0ctx - offsetof(br_ssl_engine_context, cpu)))
79
80
81
82
83
84 /*
85 * This macro evaluates to a pointer to the client context, under that
86 * specific name. It must be noted that since the engine context is the
87 * first field of the br_ssl_client_context structure ('eng'), then
88 * pointers values of both types are interchangeable, modulo an
89 * appropriate cast. This also means that "addresses" computed as offsets
90 * within the structure work for both kinds of context.
91 */
92 #define CTX ((br_ssl_client_context *)ENG)
93
94 /*
95 * Generate the pre-master secret for RSA key exchange, and encrypt it
96 * with the server's public key. Returned value is either the encrypted
97 * data length (in bytes), or -x on error, with 'x' being an error code.
98 *
99 * This code assumes that the public key has been already verified (it
100 * was properly obtained by the X.509 engine, and it has the right type,
101 * i.e. it is of type RSA and suitable for encryption).
102 */
103 static int
104 make_pms_rsa(br_ssl_client_context *ctx, int prf_id)
105 {
106 const br_x509_class **xc;
107 const br_x509_pkey *pk;
108 const unsigned char *n;
109 unsigned char *pms;
110 size_t nlen, u;
111
112 xc = ctx->eng.x509ctx;
113 pk = (*xc)->get_pkey(xc, NULL);
114
115 /*
116 * Compute actual RSA key length, in case there are leading zeros.
117 */
118 n = pk->key.rsa.n;
119 nlen = pk->key.rsa.nlen;
120 while (nlen > 0 && *n == 0) {
121 n ++;
122 nlen --;
123 }
124
125 /*
126 * We need at least 59 bytes (48 bytes for pre-master secret, and
127 * 11 bytes for the PKCS#1 type 2 padding). Note that the X.509
128 * minimal engine normally blocks RSA keys shorter than 128 bytes,
129 * so this is mostly for public keys provided explicitly by the
130 * caller.
131 */
132 if (nlen < 59) {
133 return -BR_ERR_X509_WEAK_PUBLIC_KEY;
134 }
135 if (nlen > sizeof ctx->eng.pad) {
136 return -BR_ERR_LIMIT_EXCEEDED;
137 }
138
139 /*
140 * Make PMS.
141 */
142 pms = ctx->eng.pad + nlen - 48;
143 br_enc16be(pms, ctx->eng.version_max);
144 br_hmac_drbg_generate(&ctx->eng.rng, pms + 2, 46);
145 br_ssl_engine_compute_master(&ctx->eng, prf_id, pms, 48);
146
147 /*
148 * Apply PKCS#1 type 2 padding.
149 */
150 ctx->eng.pad[0] = 0x00;
151 ctx->eng.pad[1] = 0x02;
152 ctx->eng.pad[nlen - 49] = 0x00;
153 br_hmac_drbg_generate(&ctx->eng.rng, ctx->eng.pad + 2, nlen - 51);
154 for (u = 2; u < nlen - 49; u ++) {
155 while (ctx->eng.pad[u] == 0) {
156 br_hmac_drbg_generate(&ctx->eng.rng,
157 &ctx->eng.pad[u], 1);
158 }
159 }
160
161 /*
162 * Compute RSA encryption.
163 */
164 if (!ctx->irsapub(ctx->eng.pad, nlen, &pk->key.rsa)) {
165 return -BR_ERR_LIMIT_EXCEEDED;
166 }
167 return (int)nlen;
168 }
169
170 /*
171 * OID for hash functions in RSA signatures.
172 */
173 static const unsigned char *HASH_OID[] = {
174 BR_HASH_OID_SHA1,
175 BR_HASH_OID_SHA224,
176 BR_HASH_OID_SHA256,
177 BR_HASH_OID_SHA384,
178 BR_HASH_OID_SHA512
179 };
180
181 /*
182 * Check the RSA signature on the ServerKeyExchange message.
183 *
184 * hash hash function ID (2 to 6), or 0 for MD5+SHA-1 (with RSA only)
185 * use_rsa non-zero for RSA signature, zero for ECDSA
186 * sig_len signature length (in bytes); signature value is in the pad
187 *
188 * Returned value is 0 on success, or an error code.
189 */
190 static int
191 verify_SKE_sig(br_ssl_client_context *ctx,
192 int hash, int use_rsa, size_t sig_len)
193 {
194 const br_x509_class **xc;
195 const br_x509_pkey *pk;
196 br_multihash_context mhc;
197 unsigned char hv[64], head[4];
198 size_t hv_len;
199
200 xc = ctx->eng.x509ctx;
201 pk = (*xc)->get_pkey(xc, NULL);
202 br_multihash_zero(&mhc);
203 br_multihash_copyimpl(&mhc, &ctx->eng.mhash);
204 br_multihash_init(&mhc);
205 br_multihash_update(&mhc,
206 ctx->eng.client_random, sizeof ctx->eng.client_random);
207 br_multihash_update(&mhc,
208 ctx->eng.server_random, sizeof ctx->eng.server_random);
209 head[0] = 3;
210 head[1] = 0;
211 head[2] = ctx->eng.ecdhe_curve;
212 head[3] = ctx->eng.ecdhe_point_len;
213 br_multihash_update(&mhc, head, sizeof head);
214 br_multihash_update(&mhc,
215 ctx->eng.ecdhe_point, ctx->eng.ecdhe_point_len);
216 if (hash) {
217 hv_len = br_multihash_out(&mhc, hash, hv);
218 if (hv_len == 0) {
219 return BR_ERR_INVALID_ALGORITHM;
220 }
221 } else {
222 if (!br_multihash_out(&mhc, br_md5_ID, hv)
223 || !br_multihash_out(&mhc, br_sha1_ID, hv + 16))
224 {
225 return BR_ERR_INVALID_ALGORITHM;
226 }
227 hv_len = 36;
228 }
229 if (use_rsa) {
230 unsigned char tmp[64];
231 const unsigned char *hash_oid;
232
233 if (hash) {
234 hash_oid = HASH_OID[hash - 2];
235 } else {
236 hash_oid = NULL;
237 }
238 if (!ctx->eng.irsavrfy(ctx->eng.pad, sig_len,
239 hash_oid, hv_len, &pk->key.rsa, tmp)
240 || memcmp(tmp, hv, hv_len) != 0)
241 {
242 return BR_ERR_BAD_SIGNATURE;
243 }
244 } else {
245 if (!ctx->eng.iecdsa(ctx->eng.iec, hv, hv_len, &pk->key.ec,
246 ctx->eng.pad, sig_len))
247 {
248 return BR_ERR_BAD_SIGNATURE;
249 }
250 }
251 return 0;
252 }
253
254 /*
255 * Perform client-side ECDH (or ECDHE). The point that should be sent to
256 * the server is written in the pad; returned value is either the point
257 * length (in bytes), or -x on error, with 'x' being an error code.
258 *
259 * The point _from_ the server is taken from ecdhe_point[] if 'ecdhe'
260 * is non-zero, or from the X.509 engine context if 'ecdhe' is zero
261 * (for static ECDH).
262 */
263 static int
264 make_pms_ecdh(br_ssl_client_context *ctx, unsigned ecdhe, int prf_id)
265 {
266 int curve;
267 unsigned char key[66], point[133];
268 const unsigned char *order, *point_src;
269 size_t glen, olen, point_len, xoff, xlen;
270 unsigned char mask;
271
272 if (ecdhe) {
273 curve = ctx->eng.ecdhe_curve;
274 point_src = ctx->eng.ecdhe_point;
275 point_len = ctx->eng.ecdhe_point_len;
276 } else {
277 const br_x509_class **xc;
278 const br_x509_pkey *pk;
279
280 xc = ctx->eng.x509ctx;
281 pk = (*xc)->get_pkey(xc, NULL);
282 curve = pk->key.ec.curve;
283 point_src = pk->key.ec.q;
284 point_len = pk->key.ec.qlen;
285 }
286 if ((ctx->eng.iec->supported_curves & ((uint32_t)1 << curve)) == 0) {
287 return -BR_ERR_INVALID_ALGORITHM;
288 }
289
290 /*
291 * We need to generate our key, as a non-zero random value which
292 * is lower than the curve order, in a "large enough" range. We
293 * force top bit to 0 and bottom bit to 1, which guarantees that
294 * the value is in the proper range.
295 */
296 order = ctx->eng.iec->order(curve, &olen);
297 mask = 0xFF;
298 while (mask >= order[0]) {
299 mask >>= 1;
300 }
301 br_hmac_drbg_generate(&ctx->eng.rng, key, olen);
302 key[0] &= mask;
303 key[olen - 1] |= 0x01;
304
305 /*
306 * Compute the common ECDH point, whose X coordinate is the
307 * pre-master secret.
308 */
309 ctx->eng.iec->generator(curve, &glen);
310 if (glen != point_len) {
311 return -BR_ERR_INVALID_ALGORITHM;
312 }
313
314 memcpy(point, point_src, glen);
315 if (!ctx->eng.iec->mul(point, glen, key, olen, curve)) {
316 return -BR_ERR_INVALID_ALGORITHM;
317 }
318
319 /*
320 * The pre-master secret is the X coordinate.
321 */
322 xoff = ctx->eng.iec->xoff(curve, &xlen);
323 br_ssl_engine_compute_master(&ctx->eng, prf_id, point + xoff, xlen);
324
325 ctx->eng.iec->mulgen(point, key, olen, curve);
326 memcpy(ctx->eng.pad, point, glen);
327 return (int)glen;
328 }
329
330 /*
331 * Perform full static ECDH. This occurs only in the context of client
332 * authentication with certificates: the server uses an EC public key,
333 * the cipher suite is of type ECDH (not ECDHE), the server requested a
334 * client certificate and accepts static ECDH, the client has a
335 * certificate with an EC public key in the same curve, and accepts
336 * static ECDH as well.
337 *
338 * Returned value is 0 on success, -1 on error.
339 */
340 static int
341 make_pms_static_ecdh(br_ssl_client_context *ctx, int prf_id)
342 {
343 unsigned char point[133];
344 size_t point_len;
345 const br_x509_class **xc;
346 const br_x509_pkey *pk;
347
348 xc = ctx->eng.x509ctx;
349 pk = (*xc)->get_pkey(xc, NULL);
350 point_len = pk->key.ec.qlen;
351 if (point_len > sizeof point) {
352 return -1;
353 }
354 memcpy(point, pk->key.ec.q, point_len);
355 if (!(*ctx->client_auth_vtable)->do_keyx(
356 ctx->client_auth_vtable, point, &point_len))
357 {
358 return -1;
359 }
360 br_ssl_engine_compute_master(&ctx->eng,
361 prf_id, point, point_len);
362 return 0;
363 }
364
365 /*
366 * Compute the client-side signature. This is invoked only when a
367 * signature-based client authentication was selected. The computed
368 * signature is in the pad; its length (in bytes) is returned. On
369 * error, 0 is returned.
370 */
371 static size_t
372 make_client_sign(br_ssl_client_context *ctx)
373 {
374 size_t hv_len;
375
376 /*
377 * Compute hash of handshake messages so far. This "cannot" fail
378 * because the list of supported hash functions provided to the
379 * client certificate handler was trimmed to include only the
380 * hash functions that the multi-hasher supports.
381 */
382 if (ctx->hash_id) {
383 hv_len = br_multihash_out(&ctx->eng.mhash,
384 ctx->hash_id, ctx->eng.pad);
385 } else {
386 br_multihash_out(&ctx->eng.mhash,
387 br_md5_ID, ctx->eng.pad);
388 br_multihash_out(&ctx->eng.mhash,
389 br_sha1_ID, ctx->eng.pad + 16);
390 hv_len = 36;
391 }
392 return (*ctx->client_auth_vtable)->do_sign(
393 ctx->client_auth_vtable, ctx->hash_id, hv_len,
394 ctx->eng.pad, sizeof ctx->eng.pad);
395 }
396
397
398
399 static const unsigned char t0_datablock[] = {
400 0x00, 0x00, 0x0A, 0x00, 0x24, 0x00, 0x2F, 0x01, 0x24, 0x00, 0x35, 0x02,
401 0x24, 0x00, 0x3C, 0x01, 0x44, 0x00, 0x3D, 0x02, 0x44, 0x00, 0x9C, 0x03,
402 0x04, 0x00, 0x9D, 0x04, 0x05, 0xC0, 0x03, 0x40, 0x24, 0xC0, 0x04, 0x41,
403 0x24, 0xC0, 0x05, 0x42, 0x24, 0xC0, 0x08, 0x20, 0x24, 0xC0, 0x09, 0x21,
404 0x24, 0xC0, 0x0A, 0x22, 0x24, 0xC0, 0x0D, 0x30, 0x24, 0xC0, 0x0E, 0x31,
405 0x24, 0xC0, 0x0F, 0x32, 0x24, 0xC0, 0x12, 0x10, 0x24, 0xC0, 0x13, 0x11,
406 0x24, 0xC0, 0x14, 0x12, 0x24, 0xC0, 0x23, 0x21, 0x44, 0xC0, 0x24, 0x22,
407 0x55, 0xC0, 0x25, 0x41, 0x44, 0xC0, 0x26, 0x42, 0x55, 0xC0, 0x27, 0x11,
408 0x44, 0xC0, 0x28, 0x12, 0x55, 0xC0, 0x29, 0x31, 0x44, 0xC0, 0x2A, 0x32,
409 0x55, 0xC0, 0x2B, 0x23, 0x04, 0xC0, 0x2C, 0x24, 0x05, 0xC0, 0x2D, 0x43,
410 0x04, 0xC0, 0x2E, 0x44, 0x05, 0xC0, 0x2F, 0x13, 0x04, 0xC0, 0x30, 0x14,
411 0x05, 0xC0, 0x31, 0x33, 0x04, 0xC0, 0x32, 0x34, 0x05, 0xC0, 0x9C, 0x06,
412 0x04, 0xC0, 0x9D, 0x07, 0x04, 0xC0, 0xA0, 0x08, 0x04, 0xC0, 0xA1, 0x09,
413 0x04, 0xC0, 0xAC, 0x26, 0x04, 0xC0, 0xAD, 0x27, 0x04, 0xC0, 0xAE, 0x28,
414 0x04, 0xC0, 0xAF, 0x29, 0x04, 0xCC, 0xA8, 0x15, 0x04, 0xCC, 0xA9, 0x25,
415 0x04, 0x00, 0x00
416 };
417
418 static const unsigned char t0_codeblock[] = {
419 0x00, 0x01, 0x00, 0x0A, 0x00, 0x00, 0x01, 0x00, 0x0D, 0x00, 0x00, 0x01,
420 0x00, 0x0E, 0x00, 0x00, 0x01, 0x00, 0x0F, 0x00, 0x00, 0x01, 0x01, 0x08,
421 0x00, 0x00, 0x01, 0x01, 0x09, 0x00, 0x00, 0x01, 0x02, 0x08, 0x00, 0x00,
422 0x01, 0x02, 0x09, 0x00, 0x00, 0x25, 0x25, 0x00, 0x00, 0x01,
423 T0_INT1(BR_ERR_BAD_CCS), 0x00, 0x00, 0x01,
424 T0_INT1(BR_ERR_BAD_CIPHER_SUITE), 0x00, 0x00, 0x01,
425 T0_INT1(BR_ERR_BAD_COMPRESSION), 0x00, 0x00, 0x01,
426 T0_INT1(BR_ERR_BAD_FINISHED), 0x00, 0x00, 0x01,
427 T0_INT1(BR_ERR_BAD_FRAGLEN), 0x00, 0x00, 0x01,
428 T0_INT1(BR_ERR_BAD_HANDSHAKE), 0x00, 0x00, 0x01,
429 T0_INT1(BR_ERR_BAD_HELLO_DONE), 0x00, 0x00, 0x01,
430 T0_INT1(BR_ERR_BAD_PARAM), 0x00, 0x00, 0x01,
431 T0_INT1(BR_ERR_BAD_SECRENEG), 0x00, 0x00, 0x01,
432 T0_INT1(BR_ERR_BAD_SNI), 0x00, 0x00, 0x01, T0_INT1(BR_ERR_BAD_VERSION),
433 0x00, 0x00, 0x01, T0_INT1(BR_ERR_EXTRA_EXTENSION), 0x00, 0x00, 0x01,
434 T0_INT1(BR_ERR_INVALID_ALGORITHM), 0x00, 0x00, 0x01,
435 T0_INT1(BR_ERR_LIMIT_EXCEEDED), 0x00, 0x00, 0x01, T0_INT1(BR_ERR_OK),
436 0x00, 0x00, 0x01, T0_INT1(BR_ERR_OVERSIZED_ID), 0x00, 0x00, 0x01,
437 T0_INT1(BR_ERR_RESUME_MISMATCH), 0x00, 0x00, 0x01,
438 T0_INT1(BR_ERR_UNEXPECTED), 0x00, 0x00, 0x01,
439 T0_INT1(BR_ERR_UNSUPPORTED_VERSION), 0x00, 0x00, 0x01,
440 T0_INT1(BR_ERR_WRONG_KEY_USAGE), 0x00, 0x00, 0x01,
441 T0_INT2(offsetof(br_ssl_engine_context, action)), 0x00, 0x00, 0x01,
442 T0_INT2(offsetof(br_ssl_engine_context, alert)), 0x00, 0x00, 0x01,
443 T0_INT2(offsetof(br_ssl_engine_context, application_data)), 0x00, 0x00,
444 0x01, T0_INT2(offsetof(br_ssl_client_context, auth_type)), 0x00, 0x00,
445 0x01,
446 T0_INT2(offsetof(br_ssl_engine_context, session) + offsetof(br_ssl_session_parameters, cipher_suite)),
447 0x00, 0x00, 0x01,
448 T0_INT2(offsetof(br_ssl_engine_context, client_random)), 0x00, 0x00,
449 0x01, T0_INT2(offsetof(br_ssl_engine_context, close_received)), 0x00,
450 0x00, 0x01, T0_INT2(offsetof(br_ssl_engine_context, ecdhe_curve)),
451 0x00, 0x00, 0x01,
452 T0_INT2(offsetof(br_ssl_engine_context, ecdhe_point)), 0x00, 0x00,
453 0x01, T0_INT2(offsetof(br_ssl_engine_context, ecdhe_point_len)), 0x00,
454 0x00, 0x01, T0_INT2(offsetof(br_ssl_engine_context, flags)), 0x00,
455 0x00, 0x01, T0_INT2(offsetof(br_ssl_client_context, hash_id)), 0x00,
456 0x00, 0x01, T0_INT2(offsetof(br_ssl_client_context, hashes)), 0x00,
457 0x00, 0x01, T0_INT2(offsetof(br_ssl_engine_context, log_max_frag_len)),
458 0x00, 0x00, 0x01,
459 T0_INT2(offsetof(br_ssl_client_context, min_clienthello_len)), 0x00,
460 0x00, 0x01, T0_INT2(offsetof(br_ssl_engine_context, pad)), 0x00, 0x00,
461 0x01, T0_INT2(offsetof(br_ssl_engine_context, protocol_names_num)),
462 0x00, 0x00, 0x01,
463 T0_INT2(offsetof(br_ssl_engine_context, record_type_in)), 0x00, 0x00,
464 0x01, T0_INT2(offsetof(br_ssl_engine_context, record_type_out)), 0x00,
465 0x00, 0x01, T0_INT2(offsetof(br_ssl_engine_context, reneg)), 0x00,
466 0x00, 0x01, T0_INT2(offsetof(br_ssl_engine_context, saved_finished)),
467 0x00, 0x00, 0x01,
468 T0_INT2(offsetof(br_ssl_engine_context, selected_protocol)), 0x00,
469 0x00, 0x01, T0_INT2(offsetof(br_ssl_engine_context, server_name)),
470 0x00, 0x00, 0x01,
471 T0_INT2(offsetof(br_ssl_engine_context, server_random)), 0x00, 0x00,
472 0x01,
473 T0_INT2(offsetof(br_ssl_engine_context, session) + offsetof(br_ssl_session_parameters, session_id)),
474 0x00, 0x00, 0x01,
475 T0_INT2(offsetof(br_ssl_engine_context, session) + offsetof(br_ssl_session_parameters, session_id_len)),
476 0x00, 0x00, 0x01,
477 T0_INT2(offsetof(br_ssl_engine_context, shutdown_recv)), 0x00, 0x00,
478 0x01, T0_INT2(offsetof(br_ssl_engine_context, suites_buf)), 0x00, 0x00,
479 0x01, T0_INT2(offsetof(br_ssl_engine_context, suites_num)), 0x00, 0x00,
480 0x01,
481 T0_INT2(offsetof(br_ssl_engine_context, session) + offsetof(br_ssl_session_parameters, version)),
482 0x00, 0x00, 0x01, T0_INT2(offsetof(br_ssl_engine_context, version_in)),
483 0x00, 0x00, 0x01,
484 T0_INT2(offsetof(br_ssl_engine_context, version_max)), 0x00, 0x00,
485 0x01, T0_INT2(offsetof(br_ssl_engine_context, version_min)), 0x00,
486 0x00, 0x01, T0_INT2(offsetof(br_ssl_engine_context, version_out)),
487 0x00, 0x00, 0x09, 0x26, 0x58, 0x06, 0x02, 0x68, 0x28, 0x00, 0x00, 0x06,
488 0x08, 0x2C, 0x0E, 0x05, 0x02, 0x71, 0x28, 0x04, 0x01, 0x3C, 0x00, 0x00,
489 0x01, 0x01, 0x00, 0x01, 0x03, 0x00, 0x99, 0x26, 0x5E, 0x44, 0x9D, 0x26,
490 0x05, 0x04, 0x60, 0x01, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x06, 0x02, 0x9D,
491 0x00, 0x5E, 0x04, 0x6B, 0x00, 0x06, 0x02, 0x68, 0x28, 0x00, 0x00, 0x26,
492 0x89, 0x44, 0x05, 0x03, 0x01, 0x0C, 0x08, 0x44, 0x79, 0x2C, 0xAB, 0x1C,
493 0x84, 0x01, 0x0C, 0x31, 0x00, 0x00, 0x26, 0x1F, 0x01, 0x08, 0x0B, 0x44,
494 0x5C, 0x1F, 0x08, 0x00, 0x01, 0x03, 0x00, 0x77, 0x2E, 0x02, 0x00, 0x36,
495 0x17, 0x01, 0x01, 0x0B, 0x77, 0x3E, 0x29, 0x1A, 0x36, 0x06, 0x07, 0x02,
496 0x00, 0xCF, 0x03, 0x00, 0x04, 0x75, 0x01, 0x00, 0xC5, 0x02, 0x00, 0x26,
497 0x1A, 0x17, 0x06, 0x02, 0x6F, 0x28, 0xCF, 0x04, 0x76, 0x01, 0x01, 0x00,
498 0x77, 0x3E, 0x01, 0x16, 0x87, 0x3E, 0x01, 0x00, 0x8A, 0x3C, 0x34, 0xD5,
499 0x29, 0xB4, 0x06, 0x09, 0x01, 0x7F, 0xAF, 0x01, 0x7F, 0xD2, 0x04, 0x80,
500 0x53, 0xB1, 0x79, 0x2C, 0xA1, 0x01, T0_INT1(BR_KEYTYPE_SIGN), 0x17,
501 0x06, 0x01, 0xB5, 0xB8, 0x26, 0x01, 0x0D, 0x0E, 0x06, 0x07, 0x25, 0xB7,
502 0xB8, 0x01, 0x7F, 0x04, 0x02, 0x01, 0x00, 0x03, 0x00, 0x01, 0x0E, 0x0E,
503 0x05, 0x02, 0x72, 0x28, 0x06, 0x02, 0x67, 0x28, 0x33, 0x06, 0x02, 0x72,
504 0x28, 0x02, 0x00, 0x06, 0x1C, 0xD3, 0x80, 0x2E, 0x01, 0x81, 0x7F, 0x0E,
505 0x06, 0x0D, 0x25, 0x01, 0x10, 0xDE, 0x01, 0x00, 0xDD, 0x79, 0x2C, 0xAB,
506 0x24, 0x04, 0x04, 0xD6, 0x06, 0x01, 0xD4, 0x04, 0x01, 0xD6, 0x01, 0x7F,
507 0xD2, 0x01, 0x7F, 0xAF, 0x01, 0x01, 0x77, 0x3E, 0x01, 0x17, 0x87, 0x3E,
508 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x9A, 0x01, 0x0C, 0x11, 0x01, 0x00,
509 0x38, 0x0E, 0x06, 0x05, 0x25, 0x01,
510 T0_INT1(BR_KEYTYPE_RSA | BR_KEYTYPE_KEYX), 0x04, 0x30, 0x01, 0x01,
511 0x38, 0x0E, 0x06, 0x05, 0x25, 0x01,
512 T0_INT1(BR_KEYTYPE_RSA | BR_KEYTYPE_SIGN), 0x04, 0x25, 0x01, 0x02,
513 0x38, 0x0E, 0x06, 0x05, 0x25, 0x01,
514 T0_INT1(BR_KEYTYPE_EC | BR_KEYTYPE_SIGN), 0x04, 0x1A, 0x01, 0x03,
515 0x38, 0x0E, 0x06, 0x05, 0x25, 0x01,
516 T0_INT1(BR_KEYTYPE_EC | BR_KEYTYPE_KEYX), 0x04, 0x0F, 0x01, 0x04,
517 0x38, 0x0E, 0x06, 0x05, 0x25, 0x01,
518 T0_INT1(BR_KEYTYPE_EC | BR_KEYTYPE_KEYX), 0x04, 0x04, 0x01, 0x00,
519 0x44, 0x25, 0x00, 0x00, 0x82, 0x2E, 0x01, 0x0E, 0x0E, 0x06, 0x04, 0x01,
520 0x00, 0x04, 0x02, 0x01, 0x05, 0x00, 0x00, 0x40, 0x06, 0x04, 0x01, 0x06,
521 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x88, 0x2E, 0x26, 0x06, 0x08, 0x01,
522 0x01, 0x09, 0x01, 0x11, 0x07, 0x04, 0x03, 0x25, 0x01, 0x05, 0x00, 0x01,
523 0x41, 0x03, 0x00, 0x25, 0x01, 0x00, 0x43, 0x06, 0x03, 0x02, 0x00, 0x08,
524 0x42, 0x06, 0x03, 0x02, 0x00, 0x08, 0x26, 0x06, 0x06, 0x01, 0x01, 0x0B,
525 0x01, 0x06, 0x08, 0x00, 0x00, 0x8B, 0x3F, 0x26, 0x06, 0x03, 0x01, 0x09,
526 0x08, 0x00, 0x01, 0x40, 0x26, 0x06, 0x1E, 0x01, 0x00, 0x03, 0x00, 0x26,
527 0x06, 0x0E, 0x26, 0x01, 0x01, 0x17, 0x02, 0x00, 0x08, 0x03, 0x00, 0x01,
528 0x01, 0x11, 0x04, 0x6F, 0x25, 0x02, 0x00, 0x01, 0x01, 0x0B, 0x01, 0x06,
529 0x08, 0x00, 0x00, 0x7F, 0x2D, 0x44, 0x11, 0x01, 0x01, 0x17, 0x35, 0x00,
530 0x00, 0x9F, 0xCE, 0x26, 0x01, 0x07, 0x17, 0x01, 0x00, 0x38, 0x0E, 0x06,
531 0x09, 0x25, 0x01, 0x10, 0x17, 0x06, 0x01, 0x9F, 0x04, 0x35, 0x01, 0x01,
532 0x38, 0x0E, 0x06, 0x2C, 0x25, 0x25, 0x01, 0x00, 0x77, 0x3E, 0xB3, 0x88,
533 0x2E, 0x01, 0x01, 0x0E, 0x01, 0x01, 0xA8, 0x37, 0x06, 0x17, 0x29, 0x1A,
534 0x36, 0x06, 0x04, 0xCE, 0x25, 0x04, 0x78, 0x01, 0x80, 0x64, 0xC5, 0x01,
535 0x01, 0x77, 0x3E, 0x01, 0x17, 0x87, 0x3E, 0x04, 0x01, 0x9F, 0x04, 0x03,
536 0x72, 0x28, 0x25, 0x04, 0xFF, 0x34, 0x01, 0x26, 0x03, 0x00, 0x09, 0x26,
537 0x58, 0x06, 0x02, 0x68, 0x28, 0x02, 0x00, 0x00, 0x00, 0x9A, 0x01, 0x0F,
538 0x17, 0x00, 0x00, 0x76, 0x2E, 0x01, 0x00, 0x38, 0x0E, 0x06, 0x10, 0x25,
539 0x26, 0x01, 0x01, 0x0D, 0x06, 0x03, 0x25, 0x01, 0x02, 0x76, 0x3E, 0x01,
540 0x00, 0x04, 0x21, 0x01, 0x01, 0x38, 0x0E, 0x06, 0x14, 0x25, 0x01, 0x00,
541 0x76, 0x3E, 0x26, 0x01, 0x80, 0x64, 0x0E, 0x06, 0x05, 0x01, 0x82, 0x00,
542 0x08, 0x28, 0x5A, 0x04, 0x07, 0x25, 0x01, 0x82, 0x00, 0x08, 0x28, 0x25,
543 0x00, 0x00, 0x01, 0x00, 0x2F, 0x06, 0x05, 0x3A, 0xAC, 0x37, 0x04, 0x78,
544 0x26, 0x06, 0x04, 0x01, 0x01, 0x8F, 0x3E, 0x00, 0x01, 0xBF, 0xAA, 0xBF,
545 0xAA, 0xC1, 0x84, 0x44, 0x26, 0x03, 0x00, 0xB6, 0x9B, 0x9B, 0x02, 0x00,
546 0x4D, 0x26, 0x58, 0x06, 0x0A, 0x01, 0x03, 0xA8, 0x06, 0x02, 0x72, 0x28,
547 0x25, 0x04, 0x03, 0x5C, 0x8A, 0x3C, 0x00, 0x00, 0x2F, 0x06, 0x0B, 0x86,
548 0x2E, 0x01, 0x14, 0x0D, 0x06, 0x02, 0x72, 0x28, 0x04, 0x11, 0xCE, 0x01,
549 0x07, 0x17, 0x26, 0x01, 0x02, 0x0D, 0x06, 0x06, 0x06, 0x02, 0x72, 0x28,
550 0x04, 0x70, 0x25, 0xC2, 0x01, 0x01, 0x0D, 0x33, 0x37, 0x06, 0x02, 0x61,
551 0x28, 0x26, 0x01, 0x01, 0xC8, 0x36, 0xB2, 0x00, 0x01, 0xB8, 0x01, 0x0B,
552 0x0E, 0x05, 0x02, 0x72, 0x28, 0x26, 0x01, 0x03, 0x0E, 0x06, 0x08, 0xC0,
553 0x06, 0x02, 0x68, 0x28, 0x44, 0x25, 0x00, 0x44, 0x57, 0xC0, 0xAA, 0x26,
554 0x06, 0x23, 0xC0, 0xAA, 0x26, 0x56, 0x26, 0x06, 0x18, 0x26, 0x01, 0x82,
555 0x00, 0x0F, 0x06, 0x05, 0x01, 0x82, 0x00, 0x04, 0x01, 0x26, 0x03, 0x00,
556 0x84, 0x02, 0x00, 0xB6, 0x02, 0x00, 0x53, 0x04, 0x65, 0x9B, 0x54, 0x04,
557 0x5A, 0x9B, 0x9B, 0x55, 0x26, 0x06, 0x02, 0x35, 0x00, 0x25, 0x2B, 0x00,
558 0x00, 0x79, 0x2C, 0xA1, 0x01, 0x7F, 0xB0, 0x26, 0x58, 0x06, 0x02, 0x35,
559 0x28, 0x26, 0x05, 0x02, 0x72, 0x28, 0x38, 0x17, 0x0D, 0x06, 0x02, 0x74,
560 0x28, 0x3B, 0x00, 0x00, 0x9C, 0xB8, 0x01, 0x14, 0x0D, 0x06, 0x02, 0x72,
561 0x28, 0x84, 0x01, 0x0C, 0x08, 0x01, 0x0C, 0xB6, 0x9B, 0x84, 0x26, 0x01,
562 0x0C, 0x08, 0x01, 0x0C, 0x30, 0x05, 0x02, 0x64, 0x28, 0x00, 0x00, 0xB9,
563 0x06, 0x02, 0x72, 0x28, 0x06, 0x02, 0x66, 0x28, 0x00, 0x0A, 0xB8, 0x01,
564 0x02, 0x0E, 0x05, 0x02, 0x72, 0x28, 0xBF, 0x03, 0x00, 0x02, 0x00, 0x95,
565 0x2C, 0x0A, 0x02, 0x00, 0x94, 0x2C, 0x0F, 0x37, 0x06, 0x02, 0x73, 0x28,
566 0x02, 0x00, 0x93, 0x2C, 0x0D, 0x06, 0x02, 0x6B, 0x28, 0x02, 0x00, 0x96,
567 0x3C, 0x8C, 0x01, 0x20, 0xB6, 0x01, 0x00, 0x03, 0x01, 0xC1, 0x03, 0x02,
568 0x02, 0x02, 0x01, 0x20, 0x0F, 0x06, 0x02, 0x70, 0x28, 0x84, 0x02, 0x02,
569 0xB6, 0x02, 0x02, 0x8E, 0x2E, 0x0E, 0x02, 0x02, 0x01, 0x00, 0x0F, 0x17,
570 0x06, 0x0B, 0x8D, 0x84, 0x02, 0x02, 0x30, 0x06, 0x04, 0x01, 0x7F, 0x03,
571 0x01, 0x8D, 0x84, 0x02, 0x02, 0x31, 0x02, 0x02, 0x8E, 0x3E, 0x02, 0x00,
572 0x92, 0x02, 0x01, 0x98, 0xBF, 0x26, 0xC3, 0x58, 0x06, 0x02, 0x62, 0x28,
573 0x26, 0xCD, 0x02, 0x00, 0x01, 0x86, 0x03, 0x0A, 0x17, 0x06, 0x02, 0x62,
574 0x28, 0x79, 0x02, 0x01, 0x98, 0xC1, 0x06, 0x02, 0x63, 0x28, 0x26, 0x06,
575 0x81, 0x47, 0xBF, 0xAA, 0xA6, 0x03, 0x03, 0xA4, 0x03, 0x04, 0xA2, 0x03,
576 0x05, 0xA5, 0x03, 0x06, 0xA7, 0x03, 0x07, 0xA3, 0x03, 0x08, 0x27, 0x03,
577 0x09, 0x26, 0x06, 0x81, 0x18, 0xBF, 0x01, 0x00, 0x38, 0x0E, 0x06, 0x0F,
578 0x25, 0x02, 0x03, 0x05, 0x02, 0x6C, 0x28, 0x01, 0x00, 0x03, 0x03, 0xBE,
579 0x04, 0x80, 0x7F, 0x01, 0x01, 0x38, 0x0E, 0x06, 0x0F, 0x25, 0x02, 0x05,
580 0x05, 0x02, 0x6C, 0x28, 0x01, 0x00, 0x03, 0x05, 0xBC, 0x04, 0x80, 0x6A,
581 0x01, 0x83, 0xFE, 0x01, 0x38, 0x0E, 0x06, 0x0F, 0x25, 0x02, 0x04, 0x05,
582 0x02, 0x6C, 0x28, 0x01, 0x00, 0x03, 0x04, 0xBD, 0x04, 0x80, 0x53, 0x01,
583 0x0D, 0x38, 0x0E, 0x06, 0x0E, 0x25, 0x02, 0x06, 0x05, 0x02, 0x6C, 0x28,
584 0x01, 0x00, 0x03, 0x06, 0xBA, 0x04, 0x3F, 0x01, 0x0A, 0x38, 0x0E, 0x06,
585 0x0E, 0x25, 0x02, 0x07, 0x05, 0x02, 0x6C, 0x28, 0x01, 0x00, 0x03, 0x07,
586 0xBA, 0x04, 0x2B, 0x01, 0x0B, 0x38, 0x0E, 0x06, 0x0E, 0x25, 0x02, 0x08,
587 0x05, 0x02, 0x6C, 0x28, 0x01, 0x00, 0x03, 0x08, 0xBA, 0x04, 0x17, 0x01,
588 0x10, 0x38, 0x0E, 0x06, 0x0E, 0x25, 0x02, 0x09, 0x05, 0x02, 0x6C, 0x28,
589 0x01, 0x00, 0x03, 0x09, 0xAE, 0x04, 0x03, 0x6C, 0x28, 0x25, 0x04, 0xFE,
590 0x64, 0x02, 0x04, 0x06, 0x0D, 0x02, 0x04, 0x01, 0x05, 0x0F, 0x06, 0x02,
591 0x69, 0x28, 0x01, 0x01, 0x88, 0x3E, 0x9B, 0x04, 0x0C, 0xA4, 0x01, 0x05,
592 0x0F, 0x06, 0x02, 0x69, 0x28, 0x01, 0x01, 0x88, 0x3E, 0x9B, 0x02, 0x01,
593 0x00, 0x04, 0xB8, 0x01, 0x0C, 0x0E, 0x05, 0x02, 0x72, 0x28, 0xC1, 0x01,
594 0x03, 0x0E, 0x05, 0x02, 0x6D, 0x28, 0xBF, 0x26, 0x7C, 0x3E, 0x26, 0x01,
595 0x20, 0x10, 0x06, 0x02, 0x6D, 0x28, 0x40, 0x44, 0x11, 0x01, 0x01, 0x17,
596 0x05, 0x02, 0x6D, 0x28, 0xC1, 0x26, 0x01, 0x81, 0x05, 0x0F, 0x06, 0x02,
597 0x6D, 0x28, 0x26, 0x7E, 0x3E, 0x7D, 0x44, 0xB6, 0x92, 0x2C, 0x01, 0x86,
598 0x03, 0x10, 0x03, 0x00, 0x79, 0x2C, 0xCB, 0x03, 0x01, 0x01, 0x02, 0x03,
599 0x02, 0x02, 0x00, 0x06, 0x21, 0xC1, 0x26, 0x26, 0x01, 0x02, 0x0A, 0x44,
600 0x01, 0x06, 0x0F, 0x37, 0x06, 0x02, 0x6D, 0x28, 0x03, 0x02, 0xC1, 0x02,
601 0x01, 0x01, 0x01, 0x0B, 0x01, 0x03, 0x08, 0x0E, 0x05, 0x02, 0x6D, 0x28,
602 0x04, 0x08, 0x02, 0x01, 0x06, 0x04, 0x01, 0x00, 0x03, 0x02, 0xBF, 0x26,
603 0x03, 0x03, 0x26, 0x01, 0x84, 0x00, 0x0F, 0x06, 0x02, 0x6E, 0x28, 0x84,
604 0x44, 0xB6, 0x02, 0x02, 0x02, 0x01, 0x02, 0x03, 0x50, 0x26, 0x06, 0x01,
605 0x28, 0x25, 0x9B, 0x00, 0x02, 0x03, 0x00, 0x03, 0x01, 0x02, 0x00, 0x97,
606 0x02, 0x01, 0x02, 0x00, 0x39, 0x26, 0x01, 0x00, 0x0E, 0x06, 0x02, 0x60,
607 0x00, 0xD0, 0x04, 0x74, 0x02, 0x01, 0x00, 0x03, 0x00, 0xC1, 0xAA, 0x26,
608 0x06, 0x80, 0x43, 0xC1, 0x01, 0x01, 0x38, 0x0E, 0x06, 0x06, 0x25, 0x01,
609 0x81, 0x7F, 0x04, 0x2E, 0x01, 0x80, 0x40, 0x38, 0x0E, 0x06, 0x07, 0x25,
610 0x01, 0x83, 0xFE, 0x00, 0x04, 0x20, 0x01, 0x80, 0x41, 0x38, 0x0E, 0x06,
611 0x07, 0x25, 0x01, 0x84, 0x80, 0x00, 0x04, 0x12, 0x01, 0x80, 0x42, 0x38,
612 0x0E, 0x06, 0x07, 0x25, 0x01, 0x88, 0x80, 0x00, 0x04, 0x04, 0x01, 0x00,
613 0x44, 0x25, 0x02, 0x00, 0x37, 0x03, 0x00, 0x04, 0xFF, 0x39, 0x9B, 0x79,
614 0x2C, 0xC9, 0x05, 0x09, 0x02, 0x00, 0x01, 0x83, 0xFF, 0x7F, 0x17, 0x03,
615 0x00, 0x92, 0x2C, 0x01, 0x86, 0x03, 0x10, 0x06, 0x3A, 0xBB, 0x26, 0x81,
616 0x3D, 0x41, 0x25, 0x26, 0x01, 0x08, 0x0B, 0x37, 0x01, 0x8C, 0x80, 0x00,
617 0x37, 0x17, 0x02, 0x00, 0x17, 0x02, 0x00, 0x01, 0x8C, 0x80, 0x00, 0x17,
618 0x06, 0x19, 0x26, 0x01, 0x81, 0x7F, 0x17, 0x06, 0x05, 0x01, 0x84, 0x80,
619 0x00, 0x37, 0x26, 0x01, 0x83, 0xFE, 0x00, 0x17, 0x06, 0x05, 0x01, 0x88,
620 0x80, 0x00, 0x37, 0x03, 0x00, 0x04, 0x09, 0x02, 0x00, 0x01, 0x8C, 0x88,
621 0x01, 0x17, 0x03, 0x00, 0x16, 0xBF, 0xAA, 0x26, 0x06, 0x23, 0xBF, 0xAA,
622 0x26, 0x15, 0x26, 0x06, 0x18, 0x26, 0x01, 0x82, 0x00, 0x0F, 0x06, 0x05,
623 0x01, 0x82, 0x00, 0x04, 0x01, 0x26, 0x03, 0x01, 0x84, 0x02, 0x01, 0xB6,
624 0x02, 0x01, 0x12, 0x04, 0x65, 0x9B, 0x13, 0x04, 0x5A, 0x9B, 0x14, 0x9B,
625 0x02, 0x00, 0x2A, 0x00, 0x00, 0xB9, 0x26, 0x5A, 0x06, 0x07, 0x25, 0x06,
626 0x02, 0x66, 0x28, 0x04, 0x74, 0x00, 0x00, 0xC2, 0x01, 0x03, 0xC0, 0x44,
627 0x25, 0x44, 0x00, 0x00, 0xBF, 0xC6, 0x00, 0x03, 0x01, 0x00, 0x03, 0x00,
628 0xBF, 0xAA, 0x26, 0x06, 0x80, 0x50, 0xC1, 0x03, 0x01, 0xC1, 0x03, 0x02,
629 0x02, 0x01, 0x01, 0x08, 0x0E, 0x06, 0x16, 0x02, 0x02, 0x01, 0x0F, 0x0C,
630 0x06, 0x0D, 0x01, 0x01, 0x02, 0x02, 0x01, 0x10, 0x08, 0x0B, 0x02, 0x00,
631 0x37, 0x03, 0x00, 0x04, 0x2A, 0x02, 0x01, 0x01, 0x02, 0x10, 0x02, 0x01,
632 0x01, 0x06, 0x0C, 0x17, 0x02, 0x02, 0x01, 0x01, 0x0E, 0x02, 0x02, 0x01,
633 0x03, 0x0E, 0x37, 0x17, 0x06, 0x11, 0x02, 0x00, 0x01, 0x01, 0x02, 0x02,
634 0x5D, 0x01, 0x02, 0x0B, 0x02, 0x01, 0x08, 0x0B, 0x37, 0x03, 0x00, 0x04,
635 0xFF, 0x2C, 0x9B, 0x02, 0x00, 0x00, 0x00, 0xBF, 0x01, 0x01, 0x0E, 0x05,
636 0x02, 0x65, 0x28, 0xC1, 0x01, 0x08, 0x08, 0x82, 0x2E, 0x0E, 0x05, 0x02,
637 0x65, 0x28, 0x00, 0x00, 0xBF, 0x88, 0x2E, 0x05, 0x15, 0x01, 0x01, 0x0E,
638 0x05, 0x02, 0x69, 0x28, 0xC1, 0x01, 0x00, 0x0E, 0x05, 0x02, 0x69, 0x28,
639 0x01, 0x02, 0x88, 0x3E, 0x04, 0x1C, 0x01, 0x19, 0x0E, 0x05, 0x02, 0x69,
640 0x28, 0xC1, 0x01, 0x18, 0x0E, 0x05, 0x02, 0x69, 0x28, 0x84, 0x01, 0x18,
641 0xB6, 0x89, 0x84, 0x01, 0x18, 0x30, 0x05, 0x02, 0x69, 0x28, 0x00, 0x00,
642 0xBF, 0x06, 0x02, 0x6A, 0x28, 0x00, 0x00, 0x01, 0x02, 0x97, 0xC2, 0x01,
643 0x08, 0x0B, 0xC2, 0x08, 0x00, 0x00, 0x01, 0x03, 0x97, 0xC2, 0x01, 0x08,
644 0x0B, 0xC2, 0x08, 0x01, 0x08, 0x0B, 0xC2, 0x08, 0x00, 0x00, 0x01, 0x01,
645 0x97, 0xC2, 0x00, 0x00, 0x3A, 0x26, 0x58, 0x05, 0x01, 0x00, 0x25, 0xD0,
646 0x04, 0x76, 0x02, 0x03, 0x00, 0x91, 0x2E, 0x03, 0x01, 0x01, 0x00, 0x26,
647 0x02, 0x01, 0x0A, 0x06, 0x10, 0x26, 0x01, 0x01, 0x0B, 0x90, 0x08, 0x2C,
648 0x02, 0x00, 0x0E, 0x06, 0x01, 0x00, 0x5C, 0x04, 0x6A, 0x25, 0x01, 0x7F,
649 0x00, 0x00, 0x01, 0x15, 0x87, 0x3E, 0x44, 0x52, 0x25, 0x52, 0x25, 0x29,
650 0x00, 0x00, 0x01, 0x01, 0x44, 0xC4, 0x00, 0x00, 0x44, 0x38, 0x97, 0x44,
651 0x26, 0x06, 0x05, 0xC2, 0x25, 0x5D, 0x04, 0x78, 0x25, 0x00, 0x00, 0x26,
652 0x01, 0x81, 0xAC, 0x00, 0x0E, 0x06, 0x04, 0x25, 0x01, 0x7F, 0x00, 0x9A,
653 0x59, 0x00, 0x02, 0x03, 0x00, 0x79, 0x2C, 0x9A, 0x03, 0x01, 0x02, 0x01,
654 0x01, 0x0F, 0x17, 0x02, 0x01, 0x01, 0x04, 0x11, 0x01, 0x0F, 0x17, 0x02,
655 0x01, 0x01, 0x08, 0x11, 0x01, 0x0F, 0x17, 0x01, 0x00, 0x38, 0x0E, 0x06,
656 0x10, 0x25, 0x01, 0x00, 0x01, 0x18, 0x02, 0x00, 0x06, 0x03, 0x49, 0x04,
657 0x01, 0x4A, 0x04, 0x81, 0x0D, 0x01, 0x01, 0x38, 0x0E, 0x06, 0x10, 0x25,
658 0x01, 0x01, 0x01, 0x10, 0x02, 0x00, 0x06, 0x03, 0x49, 0x04, 0x01, 0x4A,
659 0x04, 0x80, 0x77, 0x01, 0x02, 0x38, 0x0E, 0x06, 0x10, 0x25, 0x01, 0x01,
660 0x01, 0x20, 0x02, 0x00, 0x06, 0x03, 0x49, 0x04, 0x01, 0x4A, 0x04, 0x80,
661 0x61, 0x01, 0x03, 0x38, 0x0E, 0x06, 0x0F, 0x25, 0x25, 0x01, 0x10, 0x02,
662 0x00, 0x06, 0x03, 0x47, 0x04, 0x01, 0x48, 0x04, 0x80, 0x4C, 0x01, 0x04,
663 0x38, 0x0E, 0x06, 0x0E, 0x25, 0x25, 0x01, 0x20, 0x02, 0x00, 0x06, 0x03,
664 0x47, 0x04, 0x01, 0x48, 0x04, 0x38, 0x01, 0x05, 0x38, 0x0E, 0x06, 0x0C,
665 0x25, 0x25, 0x02, 0x00, 0x06, 0x03, 0x4B, 0x04, 0x01, 0x4C, 0x04, 0x26,
666 0x26, 0x01, 0x09, 0x0F, 0x06, 0x02, 0x68, 0x28, 0x44, 0x25, 0x26, 0x01,
667 0x01, 0x17, 0x01, 0x04, 0x0B, 0x01, 0x10, 0x08, 0x44, 0x01, 0x08, 0x17,
668 0x01, 0x10, 0x44, 0x09, 0x02, 0x00, 0x06, 0x03, 0x45, 0x04, 0x01, 0x46,
669 0x00, 0x25, 0x00, 0x00, 0x9A, 0x01, 0x0C, 0x11, 0x01, 0x02, 0x0F, 0x00,
670 0x00, 0x9A, 0x01, 0x0C, 0x11, 0x26, 0x5B, 0x44, 0x01, 0x03, 0x0A, 0x17,
671 0x00, 0x00, 0x9A, 0x01, 0x0C, 0x11, 0x01, 0x01, 0x0E, 0x00, 0x00, 0x9A,
672 0x01, 0x0C, 0x11, 0x5A, 0x00, 0x00, 0x9A, 0x01, 0x81, 0x70, 0x17, 0x01,
673 0x20, 0x0D, 0x00, 0x00, 0x1B, 0x01, 0x00, 0x75, 0x2E, 0x26, 0x06, 0x22,
674 0x01, 0x01, 0x38, 0x0E, 0x06, 0x06, 0x25, 0x01, 0x00, 0x9E, 0x04, 0x14,
675 0x01, 0x02, 0x38, 0x0E, 0x06, 0x0D, 0x25, 0x77, 0x2E, 0x01, 0x01, 0x0E,
676 0x06, 0x03, 0x01, 0x10, 0x37, 0x04, 0x01, 0x25, 0x04, 0x01, 0x25, 0x7B,
677 0x2E, 0x05, 0x33, 0x2F, 0x06, 0x30, 0x86, 0x2E, 0x01, 0x14, 0x38, 0x0E,
678 0x06, 0x06, 0x25, 0x01, 0x02, 0x37, 0x04, 0x22, 0x01, 0x15, 0x38, 0x0E,
679 0x06, 0x09, 0x25, 0xAD, 0x06, 0x03, 0x01, 0x7F, 0x9E, 0x04, 0x13, 0x01,
680 0x16, 0x38, 0x0E, 0x06, 0x06, 0x25, 0x01, 0x01, 0x37, 0x04, 0x07, 0x25,
681 0x01, 0x04, 0x37, 0x01, 0x00, 0x25, 0x1A, 0x06, 0x03, 0x01, 0x08, 0x37,
682 0x00, 0x00, 0x1B, 0x26, 0x05, 0x13, 0x2F, 0x06, 0x10, 0x86, 0x2E, 0x01,
683 0x15, 0x0E, 0x06, 0x08, 0x25, 0xAD, 0x01, 0x00, 0x77, 0x3E, 0x04, 0x01,
684 0x20, 0x00, 0x00, 0xCE, 0x01, 0x07, 0x17, 0x01, 0x01, 0x0F, 0x06, 0x02,
685 0x72, 0x28, 0x00, 0x01, 0x03, 0x00, 0x29, 0x1A, 0x06, 0x05, 0x02, 0x00,
686 0x87, 0x3E, 0x00, 0xCE, 0x25, 0x04, 0x74, 0x00, 0x01, 0x14, 0xD1, 0x01,
687 0x01, 0xDE, 0x29, 0x26, 0x01, 0x00, 0xC8, 0x01, 0x16, 0xD1, 0xD7, 0x29,
688 0x00, 0x00, 0x01, 0x0B, 0xDE, 0x4E, 0x26, 0x26, 0x01, 0x03, 0x08, 0xDD,
689 0xDD, 0x18, 0x26, 0x58, 0x06, 0x02, 0x25, 0x00, 0xDD, 0x1D, 0x26, 0x06,
690 0x05, 0x84, 0x44, 0xD8, 0x04, 0x77, 0x25, 0x04, 0x6C, 0x00, 0x21, 0x01,
691 0x0F, 0xDE, 0x26, 0x92, 0x2C, 0x01, 0x86, 0x03, 0x10, 0x06, 0x0C, 0x01,
692 0x04, 0x08, 0xDD, 0x80, 0x2E, 0xDE, 0x78, 0x2E, 0xDE, 0x04, 0x02, 0x5E,
693 0xDD, 0x26, 0xDC, 0x84, 0x44, 0xD8, 0x00, 0x02, 0xA4, 0xA6, 0x08, 0xA2,
694 0x08, 0xA5, 0x08, 0xA7, 0x08, 0xA3, 0x08, 0x27, 0x08, 0x03, 0x00, 0x01,
695 0x01, 0xDE, 0x01, 0x27, 0x8E, 0x2E, 0x08, 0x91, 0x2E, 0x01, 0x01, 0x0B,
696 0x08, 0x02, 0x00, 0x06, 0x04, 0x5E, 0x02, 0x00, 0x08, 0x83, 0x2C, 0x38,
697 0x09, 0x26, 0x5B, 0x06, 0x24, 0x02, 0x00, 0x05, 0x04, 0x44, 0x5E, 0x44,
698 0x5F, 0x01, 0x04, 0x09, 0x26, 0x58, 0x06, 0x03, 0x25, 0x01, 0x00, 0x26,
699 0x01, 0x04, 0x08, 0x02, 0x00, 0x08, 0x03, 0x00, 0x44, 0x01, 0x04, 0x08,
700 0x38, 0x08, 0x44, 0x04, 0x03, 0x25, 0x01, 0x7F, 0x03, 0x01, 0xDD, 0x94,
701 0x2C, 0xDC, 0x7A, 0x01, 0x04, 0x19, 0x7A, 0x01, 0x04, 0x08, 0x01, 0x1C,
702 0x32, 0x7A, 0x01, 0x20, 0xD8, 0x8D, 0x8E, 0x2E, 0xDA, 0x91, 0x2E, 0x26,
703 0x01, 0x01, 0x0B, 0xDC, 0x90, 0x44, 0x26, 0x06, 0x0F, 0x5D, 0x38, 0x2C,
704 0x26, 0xC7, 0x05, 0x02, 0x62, 0x28, 0xDC, 0x44, 0x5E, 0x44, 0x04, 0x6E,
705 0x60, 0x01, 0x01, 0xDE, 0x01, 0x00, 0xDE, 0x02, 0x00, 0x06, 0x81, 0x5A,
706 0x02, 0x00, 0xDC, 0xA4, 0x06, 0x0E, 0x01, 0x83, 0xFE, 0x01, 0xDC, 0x89,
707 0xA4, 0x01, 0x04, 0x09, 0x26, 0xDC, 0x5D, 0xDA, 0xA6, 0x06, 0x16, 0x01,
708 0x00, 0xDC, 0x8B, 0xA6, 0x01, 0x04, 0x09, 0x26, 0xDC, 0x01, 0x02, 0x09,
709 0x26, 0xDC, 0x01, 0x00, 0xDE, 0x01, 0x03, 0x09, 0xD9, 0xA2, 0x06, 0x0C,
710 0x01, 0x01, 0xDC, 0x01, 0x01, 0xDC, 0x82, 0x2E, 0x01, 0x08, 0x09, 0xDE,
711 0xA5, 0x06, 0x19, 0x01, 0x0D, 0xDC, 0xA5, 0x01, 0x04, 0x09, 0x26, 0xDC,
712 0x01, 0x02, 0x09, 0xDC, 0x42, 0x06, 0x03, 0x01, 0x03, 0xDB, 0x43, 0x06,
713 0x03, 0x01, 0x01, 0xDB, 0xA7, 0x26, 0x06, 0x36, 0x01, 0x0A, 0xDC, 0x01,
714 0x04, 0x09, 0x26, 0xDC, 0x5F, 0xDC, 0x40, 0x01, 0x00, 0x26, 0x01, 0x82,
715 0x80, 0x80, 0x80, 0x00, 0x17, 0x06, 0x0A, 0x01, 0xFD, 0xFF, 0xFF, 0xFF,
716 0x7F, 0x17, 0x01, 0x1D, 0xDC, 0x26, 0x01, 0x20, 0x0A, 0x06, 0x0C, 0xA0,
717 0x11, 0x01, 0x01, 0x17, 0x06, 0x02, 0x26, 0xDC, 0x5C, 0x04, 0x6E, 0x60,
718 0x04, 0x01, 0x25, 0xA3, 0x06, 0x0A, 0x01, 0x0B, 0xDC, 0x01, 0x02, 0xDC,
719 0x01, 0x82, 0x00, 0xDC, 0x27, 0x26, 0x06, 0x1F, 0x01, 0x10, 0xDC, 0x01,
720 0x04, 0x09, 0x26, 0xDC, 0x5F, 0xDC, 0x85, 0x2C, 0x01, 0x00, 0xA0, 0x0F,
721 0x06, 0x0A, 0x26, 0x1E, 0x26, 0xDE, 0x84, 0x44, 0xD8, 0x5C, 0x04, 0x72,
722 0x60, 0x04, 0x01, 0x25, 0x02, 0x01, 0x58, 0x05, 0x11, 0x01, 0x15, 0xDC,
723 0x02, 0x01, 0x26, 0xDC, 0x26, 0x06, 0x06, 0x5D, 0x01, 0x00, 0xDE, 0x04,
724 0x77, 0x25, 0x00, 0x00, 0x01, 0x10, 0xDE, 0x79, 0x2C, 0x26, 0xCC, 0x06,
725 0x0C, 0xAB, 0x23, 0x26, 0x5E, 0xDD, 0x26, 0xDC, 0x84, 0x44, 0xD8, 0x04,
726 0x0D, 0x26, 0xCA, 0x44, 0xAB, 0x22, 0x26, 0x5C, 0xDD, 0x26, 0xDE, 0x84,
727 0x44, 0xD8, 0x00, 0x00, 0x9C, 0x01, 0x14, 0xDE, 0x01, 0x0C, 0xDD, 0x84,
728 0x01, 0x0C, 0xD8, 0x00, 0x00, 0x51, 0x26, 0x01, 0x00, 0x0E, 0x06, 0x02,
729 0x60, 0x00, 0xCE, 0x25, 0x04, 0x73, 0x00, 0x26, 0xDC, 0xD8, 0x00, 0x00,
730 0x26, 0xDE, 0xD8, 0x00, 0x01, 0x03, 0x00, 0x41, 0x25, 0x26, 0x01, 0x10,
731 0x17, 0x06, 0x06, 0x01, 0x04, 0xDE, 0x02, 0x00, 0xDE, 0x26, 0x01, 0x08,
732 0x17, 0x06, 0x06, 0x01, 0x03, 0xDE, 0x02, 0x00, 0xDE, 0x26, 0x01, 0x20,
733 0x17, 0x06, 0x06, 0x01, 0x05, 0xDE, 0x02, 0x00, 0xDE, 0x26, 0x01, 0x80,
734 0x40, 0x17, 0x06, 0x06, 0x01, 0x06, 0xDE, 0x02, 0x00, 0xDE, 0x01, 0x04,
735 0x17, 0x06, 0x06, 0x01, 0x02, 0xDE, 0x02, 0x00, 0xDE, 0x00, 0x00, 0x26,
736 0x01, 0x08, 0x4F, 0xDE, 0xDE, 0x00, 0x00, 0x26, 0x01, 0x10, 0x4F, 0xDE,
737 0xDC, 0x00, 0x00, 0x26, 0x52, 0x06, 0x02, 0x25, 0x00, 0xCE, 0x25, 0x04,
738 0x76
739 };
740
741 static const uint16_t t0_caddr[] = {
742 0,
743 5,
744 10,
745 15,
746 20,
747 25,
748 30,
749 35,
750 40,
751 44,
752 48,
753 52,
754 56,
755 60,
756 64,
757 68,
758 72,
759 76,
760 80,
761 84,
762 88,
763 92,
764 96,
765 100,
766 104,
767 108,
768 112,
769 116,
770 120,
771 124,
772 129,
773 134,
774 139,
775 144,
776 149,
777 154,
778 159,
779 164,
780 169,
781 174,
782 179,
783 184,
784 189,
785 194,
786 199,
787 204,
788 209,
789 214,
790 219,
791 224,
792 229,
793 234,
794 239,
795 244,
796 249,
797 254,
798 259,
799 264,
800 269,
801 274,
802 279,
803 284,
804 289,
805 294,
806 303,
807 316,
808 320,
809 345,
810 351,
811 370,
812 381,
813 422,
814 542,
815 546,
816 611,
817 626,
818 637,
819 655,
820 684,
821 694,
822 730,
823 740,
824 818,
825 832,
826 838,
827 897,
828 916,
829 951,
830 1000,
831 1076,
832 1103,
833 1134,
834 1145,
835 1497,
836 1644,
837 1668,
838 1884,
839 1898,
840 1907,
841 1911,
842 2006,
843 2027,
844 2083,
845 2090,
846 2101,
847 2117,
848 2123,
849 2134,
850 2169,
851 2181,
852 2187,
853 2202,
854 2218,
855 2411,
856 2420,
857 2433,
858 2442,
859 2449,
860 2459,
861 2565,
862 2590,
863 2603,
864 2619,
865 2637,
866 2669,
867 2703,
868 3071,
869 3107,
870 3120,
871 3134,
872 3139,
873 3144,
874 3210,
875 3218,
876 3226
877 };
878
879 #define T0_INTERPRETED 88
880
881 #define T0_ENTER(ip, rp, slot) do { \
882 const unsigned char *t0_newip; \
883 uint32_t t0_lnum; \
884 t0_newip = &t0_codeblock[t0_caddr[(slot) - T0_INTERPRETED]]; \
885 t0_lnum = t0_parse7E_unsigned(&t0_newip); \
886 (rp) += t0_lnum; \
887 *((rp) ++) = (uint32_t)((ip) - &t0_codeblock[0]) + (t0_lnum << 16); \
888 (ip) = t0_newip; \
889 } while (0)
890
891 #define T0_DEFENTRY(name, slot) \
892 void \
893 name(void *ctx) \
894 { \
895 t0_context *t0ctx = ctx; \
896 t0ctx->ip = &t0_codeblock[0]; \
897 T0_ENTER(t0ctx->ip, t0ctx->rp, slot); \
898 }
899
900 T0_DEFENTRY(br_ssl_hs_client_init_main, 169)
901
902 #define T0_NEXT(t0ipp) (*(*(t0ipp)) ++)
903
904 void
905 br_ssl_hs_client_run(void *t0ctx)
906 {
907 uint32_t *dp, *rp;
908 const unsigned char *ip;
909
910 #define T0_LOCAL(x) (*(rp - 2 - (x)))
911 #define T0_POP() (*-- dp)
912 #define T0_POPi() (*(int32_t *)(-- dp))
913 #define T0_PEEK(x) (*(dp - 1 - (x)))
914 #define T0_PEEKi(x) (*(int32_t *)(dp - 1 - (x)))
915 #define T0_PUSH(v) do { *dp = (v); dp ++; } while (0)
916 #define T0_PUSHi(v) do { *(int32_t *)dp = (v); dp ++; } while (0)
917 #define T0_RPOP() (*-- rp)
918 #define T0_RPOPi() (*(int32_t *)(-- rp))
919 #define T0_RPUSH(v) do { *rp = (v); rp ++; } while (0)
920 #define T0_RPUSHi(v) do { *(int32_t *)rp = (v); rp ++; } while (0)
921 #define T0_ROLL(x) do { \
922 size_t t0len = (size_t)(x); \
923 uint32_t t0tmp = *(dp - 1 - t0len); \
924 memmove(dp - t0len - 1, dp - t0len, t0len * sizeof *dp); \
925 *(dp - 1) = t0tmp; \
926 } while (0)
927 #define T0_SWAP() do { \
928 uint32_t t0tmp = *(dp - 2); \
929 *(dp - 2) = *(dp - 1); \
930 *(dp - 1) = t0tmp; \
931 } while (0)
932 #define T0_ROT() do { \
933 uint32_t t0tmp = *(dp - 3); \
934 *(dp - 3) = *(dp - 2); \
935 *(dp - 2) = *(dp - 1); \
936 *(dp - 1) = t0tmp; \
937 } while (0)
938 #define T0_NROT() do { \
939 uint32_t t0tmp = *(dp - 1); \
940 *(dp - 1) = *(dp - 2); \
941 *(dp - 2) = *(dp - 3); \
942 *(dp - 3) = t0tmp; \
943 } while (0)
944 #define T0_PICK(x) do { \
945 uint32_t t0depth = (x); \
946 T0_PUSH(T0_PEEK(t0depth)); \
947 } while (0)
948 #define T0_CO() do { \
949 goto t0_exit; \
950 } while (0)
951 #define T0_RET() goto t0_next
952
953 dp = ((t0_context *)t0ctx)->dp;
954 rp = ((t0_context *)t0ctx)->rp;
955 ip = ((t0_context *)t0ctx)->ip;
956 goto t0_next;
957 for (;;) {
958 uint32_t t0x;
959
960 t0_next:
961 t0x = T0_NEXT(&ip);
962 if (t0x < T0_INTERPRETED) {
963 switch (t0x) {
964 int32_t t0off;
965
966 case 0: /* ret */
967 t0x = T0_RPOP();
968 rp -= (t0x >> 16);
969 t0x &= 0xFFFF;
970 if (t0x == 0) {
971 ip = NULL;
972 goto t0_exit;
973 }
974 ip = &t0_codeblock[t0x];
975 break;
976 case 1: /* literal constant */
977 T0_PUSHi(t0_parse7E_signed(&ip));
978 break;
979 case 2: /* read local */
980 T0_PUSH(T0_LOCAL(t0_parse7E_unsigned(&ip)));
981 break;
982 case 3: /* write local */
983 T0_LOCAL(t0_parse7E_unsigned(&ip)) = T0_POP();
984 break;
985 case 4: /* jump */
986 t0off = t0_parse7E_signed(&ip);
987 ip += t0off;
988 break;
989 case 5: /* jump if */
990 t0off = t0_parse7E_signed(&ip);
991 if (T0_POP()) {
992 ip += t0off;
993 }
994 break;
995 case 6: /* jump if not */
996 t0off = t0_parse7E_signed(&ip);
997 if (!T0_POP()) {
998 ip += t0off;
999 }
1000 break;
1001 case 7: {
1002 /* * */
1003
1004 uint32_t b = T0_POP();
1005 uint32_t a = T0_POP();
1006 T0_PUSH(a * b);
1007
1008 }
1009 break;
1010 case 8: {
1011 /* + */
1012
1013 uint32_t b = T0_POP();
1014 uint32_t a = T0_POP();
1015 T0_PUSH(a + b);
1016
1017 }
1018 break;
1019 case 9: {
1020 /* - */
1021
1022 uint32_t b = T0_POP();
1023 uint32_t a = T0_POP();
1024 T0_PUSH(a - b);
1025
1026 }
1027 break;
1028 case 10: {
1029 /* < */
1030
1031 int32_t b = T0_POPi();
1032 int32_t a = T0_POPi();
1033 T0_PUSH(-(uint32_t)(a < b));
1034
1035 }
1036 break;
1037 case 11: {
1038 /* << */
1039
1040 int c = (int)T0_POPi();
1041 uint32_t x = T0_POP();
1042 T0_PUSH(x << c);
1043
1044 }
1045 break;
1046 case 12: {
1047 /* <= */
1048
1049 int32_t b = T0_POPi();
1050 int32_t a = T0_POPi();
1051 T0_PUSH(-(uint32_t)(a <= b));
1052
1053 }
1054 break;
1055 case 13: {
1056 /* <> */
1057
1058 uint32_t b = T0_POP();
1059 uint32_t a = T0_POP();
1060 T0_PUSH(-(uint32_t)(a != b));
1061
1062 }
1063 break;
1064 case 14: {
1065 /* = */
1066
1067 uint32_t b = T0_POP();
1068 uint32_t a = T0_POP();
1069 T0_PUSH(-(uint32_t)(a == b));
1070
1071 }
1072 break;
1073 case 15: {
1074 /* > */
1075
1076 int32_t b = T0_POPi();
1077 int32_t a = T0_POPi();
1078 T0_PUSH(-(uint32_t)(a > b));
1079
1080 }
1081 break;
1082 case 16: {
1083 /* >= */
1084
1085 int32_t b = T0_POPi();
1086 int32_t a = T0_POPi();
1087 T0_PUSH(-(uint32_t)(a >= b));
1088
1089 }
1090 break;
1091 case 17: {
1092 /* >> */
1093
1094 int c = (int)T0_POPi();
1095 int32_t x = T0_POPi();
1096 T0_PUSHi(x >> c);
1097
1098 }
1099 break;
1100 case 18: {
1101 /* anchor-dn-append-name */
1102
1103 size_t len;
1104
1105 len = T0_POP();
1106 if (CTX->client_auth_vtable != NULL) {
1107 (*CTX->client_auth_vtable)->append_name(
1108 CTX->client_auth_vtable, ENG->pad, len);
1109 }
1110
1111 }
1112 break;
1113 case 19: {
1114 /* anchor-dn-end-name */
1115
1116 if (CTX->client_auth_vtable != NULL) {
1117 (*CTX->client_auth_vtable)->end_name(
1118 CTX->client_auth_vtable);
1119 }
1120
1121 }
1122 break;
1123 case 20: {
1124 /* anchor-dn-end-name-list */
1125
1126 if (CTX->client_auth_vtable != NULL) {
1127 (*CTX->client_auth_vtable)->end_name_list(
1128 CTX->client_auth_vtable);
1129 }
1130
1131 }
1132 break;
1133 case 21: {
1134 /* anchor-dn-start-name */
1135
1136 size_t len;
1137
1138 len = T0_POP();
1139 if (CTX->client_auth_vtable != NULL) {
1140 (*CTX->client_auth_vtable)->start_name(
1141 CTX->client_auth_vtable, len);
1142 }
1143
1144 }
1145 break;
1146 case 22: {
1147 /* anchor-dn-start-name-list */
1148
1149 if (CTX->client_auth_vtable != NULL) {
1150 (*CTX->client_auth_vtable)->start_name_list(
1151 CTX->client_auth_vtable);
1152 }
1153
1154 }
1155 break;
1156 case 23: {
1157 /* and */
1158
1159 uint32_t b = T0_POP();
1160 uint32_t a = T0_POP();
1161 T0_PUSH(a & b);
1162
1163 }
1164 break;
1165 case 24: {
1166 /* begin-cert */
1167
1168 if (ENG->chain_len == 0) {
1169 T0_PUSHi(-1);
1170 } else {
1171 ENG->cert_cur = ENG->chain->data;
1172 ENG->cert_len = ENG->chain->data_len;
1173 ENG->chain ++;
1174 ENG->chain_len --;
1175 T0_PUSH(ENG->cert_len);
1176 }
1177
1178 }
1179 break;
1180 case 25: {
1181 /* bzero */
1182
1183 size_t len = (size_t)T0_POP();
1184 void *addr = (unsigned char *)ENG + (size_t)T0_POP();
1185 memset(addr, 0, len);
1186
1187 }
1188 break;
1189 case 26: {
1190 /* can-output? */
1191
1192 T0_PUSHi(-(ENG->hlen_out > 0));
1193
1194 }
1195 break;
1196 case 27: {
1197 /* co */
1198 T0_CO();
1199 }
1200 break;
1201 case 28: {
1202 /* compute-Finished-inner */
1203
1204 int prf_id = T0_POP();
1205 int from_client = T0_POPi();
1206 unsigned char tmp[48];
1207 br_tls_prf_seed_chunk seed;
1208
1209 br_tls_prf_impl prf = br_ssl_engine_get_PRF(ENG, prf_id);
1210 seed.data = tmp;
1211 if (ENG->session.version >= BR_TLS12) {
1212 seed.len = br_multihash_out(&ENG->mhash, prf_id, tmp);
1213 } else {
1214 br_multihash_out(&ENG->mhash, br_md5_ID, tmp);
1215 br_multihash_out(&ENG->mhash, br_sha1_ID, tmp + 16);
1216 seed.len = 36;
1217 }
1218 prf(ENG->pad, 12, ENG->session.master_secret,
1219 sizeof ENG->session.master_secret,
1220 from_client ? "client finished" : "server finished",
1221 1, &seed);
1222
1223 }
1224 break;
1225 case 29: {
1226 /* copy-cert-chunk */
1227
1228 size_t clen;
1229
1230 clen = ENG->cert_len;
1231 if (clen > sizeof ENG->pad) {
1232 clen = sizeof ENG->pad;
1233 }
1234 memcpy(ENG->pad, ENG->cert_cur, clen);
1235 ENG->cert_cur += clen;
1236 ENG->cert_len -= clen;
1237 T0_PUSH(clen);
1238
1239 }
1240 break;
1241 case 30: {
1242 /* copy-protocol-name */
1243
1244 size_t idx = T0_POP();
1245 size_t len = strlen(ENG->protocol_names[idx]);
1246 memcpy(ENG->pad, ENG->protocol_names[idx], len);
1247 T0_PUSH(len);
1248
1249 }
1250 break;
1251 case 31: {
1252 /* data-get8 */
1253
1254 size_t addr = T0_POP();
1255 T0_PUSH(t0_datablock[addr]);
1256
1257 }
1258 break;
1259 case 32: {
1260 /* discard-input */
1261
1262 ENG->hlen_in = 0;
1263
1264 }
1265 break;
1266 case 33: {
1267 /* do-client-sign */
1268
1269 size_t sig_len;
1270
1271 sig_len = make_client_sign(CTX);
1272 if (sig_len == 0) {
1273 br_ssl_engine_fail(ENG, BR_ERR_INVALID_ALGORITHM);
1274 T0_CO();
1275 }
1276 T0_PUSH(sig_len);
1277
1278 }
1279 break;
1280 case 34: {
1281 /* do-ecdh */
1282
1283 unsigned prf_id = T0_POP();
1284 unsigned ecdhe = T0_POP();
1285 int x;
1286
1287 x = make_pms_ecdh(CTX, ecdhe, prf_id);
1288 if (x < 0) {
1289 br_ssl_engine_fail(ENG, -x);
1290 T0_CO();
1291 } else {
1292 T0_PUSH(x);
1293 }
1294
1295 }
1296 break;
1297 case 35: {
1298 /* do-rsa-encrypt */
1299
1300 int x;
1301
1302 x = make_pms_rsa(CTX, T0_POP());
1303 if (x < 0) {
1304 br_ssl_engine_fail(ENG, -x);
1305 T0_CO();
1306 } else {
1307 T0_PUSH(x);
1308 }
1309
1310 }
1311 break;
1312 case 36: {
1313 /* do-static-ecdh */
1314
1315 unsigned prf_id = T0_POP();
1316
1317 if (make_pms_static_ecdh(CTX, prf_id) < 0) {
1318 br_ssl_engine_fail(ENG, BR_ERR_INVALID_ALGORITHM);
1319 T0_CO();
1320 }
1321
1322 }
1323 break;
1324 case 37: {
1325 /* drop */
1326 (void)T0_POP();
1327 }
1328 break;
1329 case 38: {
1330 /* dup */
1331 T0_PUSH(T0_PEEK(0));
1332 }
1333 break;
1334 case 39: {
1335 /* ext-ALPN-length */
1336
1337 size_t u, len;
1338
1339 if (ENG->protocol_names_num == 0) {
1340 T0_PUSH(0);
1341 T0_RET();
1342 }
1343 len = 6;
1344 for (u = 0; u < ENG->protocol_names_num; u ++) {
1345 len += 1 + strlen(ENG->protocol_names[u]);
1346 }
1347 T0_PUSH(len);
1348
1349 }
1350 break;
1351 case 40: {
1352 /* fail */
1353
1354 br_ssl_engine_fail(ENG, (int)T0_POPi());
1355 T0_CO();
1356
1357 }
1358 break;
1359 case 41: {
1360 /* flush-record */
1361
1362 br_ssl_engine_flush_record(ENG);
1363
1364 }
1365 break;
1366 case 42: {
1367 /* get-client-chain */
1368
1369 uint32_t auth_types;
1370
1371 auth_types = T0_POP();
1372 if (CTX->client_auth_vtable != NULL) {
1373 br_ssl_client_certificate ux;
1374
1375 (*CTX->client_auth_vtable)->choose(CTX->client_auth_vtable,
1376 CTX, auth_types, &ux);
1377 CTX->auth_type = (unsigned char)ux.auth_type;
1378 CTX->hash_id = (unsigned char)ux.hash_id;
1379 ENG->chain = ux.chain;
1380 ENG->chain_len = ux.chain_len;
1381 } else {
1382 CTX->hash_id = 0;
1383 ENG->chain_len = 0;
1384 }
1385
1386 }
1387 break;
1388 case 43: {
1389 /* get-key-type-usages */
1390
1391 const br_x509_class *xc;
1392 const br_x509_pkey *pk;
1393 unsigned usages;
1394
1395 xc = *(ENG->x509ctx);
1396 pk = xc->get_pkey(ENG->x509ctx, &usages);
1397 if (pk == NULL) {
1398 T0_PUSH(0);
1399 } else {
1400 T0_PUSH(pk->key_type | usages);
1401 }
1402
1403 }
1404 break;
1405 case 44: {
1406 /* get16 */
1407
1408 size_t addr = (size_t)T0_POP();
1409 T0_PUSH(*(uint16_t *)(void *)((unsigned char *)ENG + addr));
1410
1411 }
1412 break;
1413 case 45: {
1414 /* get32 */
1415
1416 size_t addr = (size_t)T0_POP();
1417 T0_PUSH(*(uint32_t *)(void *)((unsigned char *)ENG + addr));
1418
1419 }
1420 break;
1421 case 46: {
1422 /* get8 */
1423
1424 size_t addr = (size_t)T0_POP();
1425 T0_PUSH(*((unsigned char *)ENG + addr));
1426
1427 }
1428 break;
1429 case 47: {
1430 /* has-input? */
1431
1432 T0_PUSHi(-(ENG->hlen_in != 0));
1433
1434 }
1435 break;
1436 case 48: {
1437 /* memcmp */
1438
1439 size_t len = (size_t)T0_POP();
1440 void *addr2 = (unsigned char *)ENG + (size_t)T0_POP();
1441 void *addr1 = (unsigned char *)ENG + (size_t)T0_POP();
1442 int x = memcmp(addr1, addr2, len);
1443 T0_PUSH((uint32_t)-(x == 0));
1444
1445 }
1446 break;
1447 case 49: {
1448 /* memcpy */
1449
1450 size_t len = (size_t)T0_POP();
1451 void *src = (unsigned char *)ENG + (size_t)T0_POP();
1452 void *dst = (unsigned char *)ENG + (size_t)T0_POP();
1453 memcpy(dst, src, len);
1454
1455 }
1456 break;
1457 case 50: {
1458 /* mkrand */
1459
1460 size_t len = (size_t)T0_POP();
1461 void *addr = (unsigned char *)ENG + (size_t)T0_POP();
1462 br_hmac_drbg_generate(&ENG->rng, addr, len);
1463
1464 }
1465 break;
1466 case 51: {
1467 /* more-incoming-bytes? */
1468
1469 T0_PUSHi(ENG->hlen_in != 0 || !br_ssl_engine_recvrec_finished(ENG));
1470
1471 }
1472 break;
1473 case 52: {
1474 /* multihash-init */
1475
1476 br_multihash_init(&ENG->mhash);
1477
1478 }
1479 break;
1480 case 53: {
1481 /* neg */
1482
1483 uint32_t a = T0_POP();
1484 T0_PUSH(-a);
1485
1486 }
1487 break;
1488 case 54: {
1489 /* not */
1490
1491 uint32_t a = T0_POP();
1492 T0_PUSH(~a);
1493
1494 }
1495 break;
1496 case 55: {
1497 /* or */
1498
1499 uint32_t b = T0_POP();
1500 uint32_t a = T0_POP();
1501 T0_PUSH(a | b);
1502
1503 }
1504 break;
1505 case 56: {
1506 /* over */
1507 T0_PUSH(T0_PEEK(1));
1508 }
1509 break;
1510 case 57: {
1511 /* read-chunk-native */
1512
1513 size_t clen = ENG->hlen_in;
1514 if (clen > 0) {
1515 uint32_t addr, len;
1516
1517 len = T0_POP();
1518 addr = T0_POP();
1519 if ((size_t)len < clen) {
1520 clen = (size_t)len;
1521 }
1522 memcpy((unsigned char *)ENG + addr, ENG->hbuf_in, clen);
1523 if (ENG->record_type_in == BR_SSL_HANDSHAKE) {
1524 br_multihash_update(&ENG->mhash, ENG->hbuf_in, clen);
1525 }
1526 T0_PUSH(addr + (uint32_t)clen);
1527 T0_PUSH(len - (uint32_t)clen);
1528 ENG->hbuf_in += clen;
1529 ENG->hlen_in -= clen;
1530 }
1531
1532 }
1533 break;
1534 case 58: {
1535 /* read8-native */
1536
1537 if (ENG->hlen_in > 0) {
1538 unsigned char x;
1539
1540 x = *ENG->hbuf_in ++;
1541 if (ENG->record_type_in == BR_SSL_HANDSHAKE) {
1542 br_multihash_update(&ENG->mhash, &x, 1);
1543 }
1544 T0_PUSH(x);
1545 ENG->hlen_in --;
1546 } else {
1547 T0_PUSHi(-1);
1548 }
1549
1550 }
1551 break;
1552 case 59: {
1553 /* set-server-curve */
1554
1555 const br_x509_class *xc;
1556 const br_x509_pkey *pk;
1557
1558 xc = *(ENG->x509ctx);
1559 pk = xc->get_pkey(ENG->x509ctx, NULL);
1560 CTX->server_curve =
1561 (pk->key_type == BR_KEYTYPE_EC) ? pk->key.ec.curve : 0;
1562
1563 }
1564 break;
1565 case 60: {
1566 /* set16 */
1567
1568 size_t addr = (size_t)T0_POP();
1569 *(uint16_t *)(void *)((unsigned char *)ENG + addr) = (uint16_t)T0_POP();
1570
1571 }
1572 break;
1573 case 61: {
1574 /* set32 */
1575
1576 size_t addr = (size_t)T0_POP();
1577 *(uint32_t *)(void *)((unsigned char *)ENG + addr) = (uint32_t)T0_POP();
1578
1579 }
1580 break;
1581 case 62: {
1582 /* set8 */
1583
1584 size_t addr = (size_t)T0_POP();
1585 *((unsigned char *)ENG + addr) = (unsigned char)T0_POP();
1586
1587 }
1588 break;
1589 case 63: {
1590 /* strlen */
1591
1592 void *str = (unsigned char *)ENG + (size_t)T0_POP();
1593 T0_PUSH((uint32_t)strlen(str));
1594
1595 }
1596 break;
1597 case 64: {
1598 /* supported-curves */
1599
1600 uint32_t x = ENG->iec == NULL ? 0 : ENG->iec->supported_curves;
1601 T0_PUSH(x);
1602
1603 }
1604 break;
1605 case 65: {
1606 /* supported-hash-functions */
1607
1608 int i;
1609 unsigned x, num;
1610
1611 x = 0;
1612 num = 0;
1613 for (i = br_sha1_ID; i <= br_sha512_ID; i ++) {
1614 if (br_multihash_getimpl(&ENG->mhash, i)) {
1615 x |= 1U << i;
1616 num ++;
1617 }
1618 }
1619 T0_PUSH(x);
1620 T0_PUSH(num);
1621
1622 }
1623 break;
1624 case 66: {
1625 /* supports-ecdsa? */
1626
1627 T0_PUSHi(-(ENG->iecdsa != 0));
1628
1629 }
1630 break;
1631 case 67: {
1632 /* supports-rsa-sign? */
1633
1634 T0_PUSHi(-(ENG->irsavrfy != 0));
1635
1636 }
1637 break;
1638 case 68: {
1639 /* swap */
1640 T0_SWAP();
1641 }
1642 break;
1643 case 69: {
1644 /* switch-aesccm-in */
1645
1646 int is_client, prf_id;
1647 unsigned cipher_key_len, tag_len;
1648
1649 tag_len = T0_POP();
1650 cipher_key_len = T0_POP();
1651 prf_id = T0_POP();
1652 is_client = T0_POP();
1653 br_ssl_engine_switch_ccm_in(ENG, is_client, prf_id,
1654 ENG->iaes_ctrcbc, cipher_key_len, tag_len);
1655
1656 }
1657 break;
1658 case 70: {
1659 /* switch-aesccm-out */
1660
1661 int is_client, prf_id;
1662 unsigned cipher_key_len, tag_len;
1663
1664 tag_len = T0_POP();
1665 cipher_key_len = T0_POP();
1666 prf_id = T0_POP();
1667 is_client = T0_POP();
1668 br_ssl_engine_switch_ccm_out(ENG, is_client, prf_id,
1669 ENG->iaes_ctrcbc, cipher_key_len, tag_len);
1670
1671 }
1672 break;
1673 case 71: {
1674 /* switch-aesgcm-in */
1675
1676 int is_client, prf_id;
1677 unsigned cipher_key_len;
1678
1679 cipher_key_len = T0_POP();
1680 prf_id = T0_POP();
1681 is_client = T0_POP();
1682 br_ssl_engine_switch_gcm_in(ENG, is_client, prf_id,
1683 ENG->iaes_ctr, cipher_key_len);
1684
1685 }
1686 break;
1687 case 72: {
1688 /* switch-aesgcm-out */
1689
1690 int is_client, prf_id;
1691 unsigned cipher_key_len;
1692
1693 cipher_key_len = T0_POP();
1694 prf_id = T0_POP();
1695 is_client = T0_POP();
1696 br_ssl_engine_switch_gcm_out(ENG, is_client, prf_id,
1697 ENG->iaes_ctr, cipher_key_len);
1698
1699 }
1700 break;
1701 case 73: {
1702 /* switch-cbc-in */
1703
1704 int is_client, prf_id, mac_id, aes;
1705 unsigned cipher_key_len;
1706
1707 cipher_key_len = T0_POP();
1708 aes = T0_POP();
1709 mac_id = T0_POP();
1710 prf_id = T0_POP();
1711 is_client = T0_POP();
1712 br_ssl_engine_switch_cbc_in(ENG, is_client, prf_id, mac_id,
1713 aes ? ENG->iaes_cbcdec : ENG->ides_cbcdec, cipher_key_len);
1714
1715 }
1716 break;
1717 case 74: {
1718 /* switch-cbc-out */
1719
1720 int is_client, prf_id, mac_id, aes;
1721 unsigned cipher_key_len;
1722
1723 cipher_key_len = T0_POP();
1724 aes = T0_POP();
1725 mac_id = T0_POP();
1726 prf_id = T0_POP();
1727 is_client = T0_POP();
1728 br_ssl_engine_switch_cbc_out(ENG, is_client, prf_id, mac_id,
1729 aes ? ENG->iaes_cbcenc : ENG->ides_cbcenc, cipher_key_len);
1730
1731 }
1732 break;
1733 case 75: {
1734 /* switch-chapol-in */
1735
1736 int is_client, prf_id;
1737
1738 prf_id = T0_POP();
1739 is_client = T0_POP();
1740 br_ssl_engine_switch_chapol_in(ENG, is_client, prf_id);
1741
1742 }
1743 break;
1744 case 76: {
1745 /* switch-chapol-out */
1746
1747 int is_client, prf_id;
1748
1749 prf_id = T0_POP();
1750 is_client = T0_POP();
1751 br_ssl_engine_switch_chapol_out(ENG, is_client, prf_id);
1752
1753 }
1754 break;
1755 case 77: {
1756 /* test-protocol-name */
1757
1758 size_t len = T0_POP();
1759 size_t u;
1760
1761 for (u = 0; u < ENG->protocol_names_num; u ++) {
1762 const char *name;
1763
1764 name = ENG->protocol_names[u];
1765 if (len == strlen(name) && memcmp(ENG->pad, name, len) == 0) {
1766 T0_PUSH(u);
1767 T0_RET();
1768 }
1769 }
1770 T0_PUSHi(-1);
1771
1772 }
1773 break;
1774 case 78: {
1775 /* total-chain-length */
1776
1777 size_t u;
1778 uint32_t total;
1779
1780 total = 0;
1781 for (u = 0; u < ENG->chain_len; u ++) {
1782 total += 3 + (uint32_t)ENG->chain[u].data_len;
1783 }
1784 T0_PUSH(total);
1785
1786 }
1787 break;
1788 case 79: {
1789 /* u>> */
1790
1791 int c = (int)T0_POPi();
1792 uint32_t x = T0_POP();
1793 T0_PUSH(x >> c);
1794
1795 }
1796 break;
1797 case 80: {
1798 /* verify-SKE-sig */
1799
1800 size_t sig_len = T0_POP();
1801 int use_rsa = T0_POPi();
1802 int hash = T0_POPi();
1803
1804 T0_PUSH(verify_SKE_sig(CTX, hash, use_rsa, sig_len));
1805
1806 }
1807 break;
1808 case 81: {
1809 /* write-blob-chunk */
1810
1811 size_t clen = ENG->hlen_out;
1812 if (clen > 0) {
1813 uint32_t addr, len;
1814
1815 len = T0_POP();
1816 addr = T0_POP();
1817 if ((size_t)len < clen) {
1818 clen = (size_t)len;
1819 }
1820 memcpy(ENG->hbuf_out, (unsigned char *)ENG + addr, clen);
1821 if (ENG->record_type_out == BR_SSL_HANDSHAKE) {
1822 br_multihash_update(&ENG->mhash, ENG->hbuf_out, clen);
1823 }
1824 T0_PUSH(addr + (uint32_t)clen);
1825 T0_PUSH(len - (uint32_t)clen);
1826 ENG->hbuf_out += clen;
1827 ENG->hlen_out -= clen;
1828 }
1829
1830 }
1831 break;
1832 case 82: {
1833 /* write8-native */
1834
1835 unsigned char x;
1836
1837 x = (unsigned char)T0_POP();
1838 if (ENG->hlen_out > 0) {
1839 if (ENG->record_type_out == BR_SSL_HANDSHAKE) {
1840 br_multihash_update(&ENG->mhash, &x, 1);
1841 }
1842 *ENG->hbuf_out ++ = x;
1843 ENG->hlen_out --;
1844 T0_PUSHi(-1);
1845 } else {
1846 T0_PUSHi(0);
1847 }
1848
1849 }
1850 break;
1851 case 83: {
1852 /* x509-append */
1853
1854 const br_x509_class *xc;
1855 size_t len;
1856
1857 xc = *(ENG->x509ctx);
1858 len = T0_POP();
1859 xc->append(ENG->x509ctx, ENG->pad, len);
1860
1861 }
1862 break;
1863 case 84: {
1864 /* x509-end-cert */
1865
1866 const br_x509_class *xc;
1867
1868 xc = *(ENG->x509ctx);
1869 xc->end_cert(ENG->x509ctx);
1870
1871 }
1872 break;
1873 case 85: {
1874 /* x509-end-chain */
1875
1876 const br_x509_class *xc;
1877
1878 xc = *(ENG->x509ctx);
1879 T0_PUSH(xc->end_chain(ENG->x509ctx));
1880
1881 }
1882 break;
1883 case 86: {
1884 /* x509-start-cert */
1885
1886 const br_x509_class *xc;
1887
1888 xc = *(ENG->x509ctx);
1889 xc->start_cert(ENG->x509ctx, T0_POP());
1890
1891 }
1892 break;
1893 case 87: {
1894 /* x509-start-chain */
1895
1896 const br_x509_class *xc;
1897 uint32_t bc;
1898
1899 bc = T0_POP();
1900 xc = *(ENG->x509ctx);
1901 xc->start_chain(ENG->x509ctx, bc ? ENG->server_name : NULL);
1902
1903 }
1904 break;
1905 }
1906
1907 } else {
1908 T0_ENTER(ip, rp, t0x);
1909 }
1910 }
1911 t0_exit:
1912 ((t0_context *)t0ctx)->dp = dp;
1913 ((t0_context *)t0ctx)->rp = rp;
1914 ((t0_context *)t0ctx)->ip = ip;
1915 }