]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/bearssl/src/ssl/ssl_hs_server.c
Merge ^/vendor/lvm-project/release-10.x up to its last change (upstream
[FreeBSD/FreeBSD.git] / contrib / bearssl / src / ssl / ssl_hs_server.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_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
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
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
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
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
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
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
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
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
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 }