1/* Automatically generated code; do not modify directly. */
2
3#include <stddef.h>
4#include <stdint.h>
5
6typedef struct {
7	uint32_t *dp;
8	uint32_t *rp;
9	const unsigned char *ip;
10} t0_context;
11
12static uint32_t
13t0_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
29static int32_t
30t0_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
64void br_ssl_hs_server_init_main(void *t0ctx);
65
66void 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 */
97static void
98do_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 */
141static void
142ecdh_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 */
175static void
176do_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 */
195static void
196do_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
218static size_t
219hash_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 */
263static int
264do_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 */
332static void
333do_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 */
364static const unsigned char HASH_PAD_OFF[] = { 0, 16, 36, 64, 96, 144, 208 };
365
366/*
367 * OID for hash functions in RSA signatures.
368 */
369static const unsigned char HASH_OID_SHA1[] = {
370	0x05, 0x2B, 0x0E, 0x03, 0x02, 0x1A
371};
372
373static const unsigned char HASH_OID_SHA224[] = {
374	0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x04
375};
376
377static const unsigned char HASH_OID_SHA256[] = {
378	0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01
379};
380
381static const unsigned char HASH_OID_SHA384[] = {
382	0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x02
383};
384
385static const unsigned char HASH_OID_SHA512[] = {
386	0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03
387};
388
389static 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 */
404static int
405verify_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
448static 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
467static 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
793static 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) \
943void \
944name(void *ctx) \
945{ \
946	t0_context *t0ctx = ctx; \
947	t0ctx->ip = &t0_codeblock[0]; \
948	T0_ENTER(t0ctx->ip, t0ctx->rp, slot); \
949}
950
951T0_DEFENTRY(br_ssl_hs_server_init_main, 166)
952
953#define T0_NEXT(t0ipp)   (*(*(t0ipp)) ++)
954
955void
956br_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	}
2005t0_exit:
2006	((t0_context *)t0ctx)->dp = dp;
2007	((t0_context *)t0ctx)->rp = rp;
2008	((t0_context *)t0ctx)->ip = ip;
2009}
2010