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