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