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