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