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 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 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 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 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 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 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 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 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 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 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 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