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