1 /* Automatically generated code; do not modify directly. */
9 const unsigned char *ip
;
13 t0_parse7E_unsigned(const unsigned char **p
)
22 x
= (x
<< 7) | (uint32_t)(y
& 0x7F);
30 t0_parse7E_signed(const unsigned char **p
)
35 neg
= ((**p
) >> 6) & 1;
41 x
= (x
<< 7) | (uint32_t)(y
& 0x7F);
44 return -(int32_t)~x
- 1;
52 #define T0_VBYTE(x, n) (unsigned char)((((uint32_t)(x) >> (n)) & 0x7F) | 0x80)
53 #define T0_FBYTE(x, n) (unsigned char)(((uint32_t)(x) >> (n)) & 0x7F)
54 #define T0_SBYTE(x) (unsigned char)((((uint32_t)(x) >> 28) + 0xF8) ^ 0xF8)
55 #define T0_INT1(x) T0_FBYTE(x, 0)
56 #define T0_INT2(x) T0_VBYTE(x, 7), T0_FBYTE(x, 0)
57 #define T0_INT3(x) T0_VBYTE(x, 14), T0_VBYTE(x, 7), T0_FBYTE(x, 0)
58 #define T0_INT4(x) T0_VBYTE(x, 21), T0_VBYTE(x, 14), T0_VBYTE(x, 7), T0_FBYTE(x, 0)
59 #define T0_INT5(x) T0_SBYTE(x), T0_VBYTE(x, 21), T0_VBYTE(x, 14), T0_VBYTE(x, 7), T0_FBYTE(x, 0)
61 static const uint8_t t0_datablock
[];
64 void br_ssl_hs_server_init_main(void *t0ctx
);
66 void br_ssl_hs_server_run(void *t0ctx
);
76 * This macro evaluates to a pointer to the current engine context.
78 #define ENG ((br_ssl_engine_context *)((unsigned char *)t0ctx - offsetof(br_ssl_engine_context, cpu)))
85 * This macro evaluates to a pointer to the server context, under that
86 * specific name. It must be noted that since the engine context is the
87 * first field of the br_ssl_server_context structure ('eng'), then
88 * pointers values of both types are interchangeable, modulo an
89 * appropriate cast. This also means that "adresses" computed as offsets
90 * within the structure work for both kinds of context.
92 #define CTX ((br_ssl_server_context *)ENG)
95 * Decrypt the pre-master secret (RSA key exchange).
98 do_rsa_decrypt(br_ssl_server_context
*ctx
, int prf_id
,
99 unsigned char *epms
, size_t len
)
102 unsigned char rpms
[48];
107 x
= (*ctx
->policy_vtable
)->do_keyx(ctx
->policy_vtable
, epms
, len
);
110 * Set the first two bytes to the maximum supported client
111 * protocol version. These bytes are used for version rollback
112 * detection; forceing the two bytes will make the master secret
113 * wrong if the bytes are not correct. This process is
114 * recommended by RFC 5246 (section 7.4.7.1).
116 br_enc16be(epms
, ctx
->client_max_version
);
119 * Make a random PMS and copy it above the decrypted value if the
120 * decryption failed. Note that we use a constant-time conditional
123 br_hmac_drbg_generate(&ctx
->eng
.rng
, rpms
, sizeof rpms
);
124 br_ccopy(x
^ 1, epms
, rpms
, sizeof rpms
);
127 * Compute master secret.
129 br_ssl_engine_compute_master(&ctx
->eng
, prf_id
, epms
, 48);
132 * Clear the pre-master secret from RAM: it is normally a buffer
133 * in the context, hence potentially long-lived.
135 memset(epms
, 0, len
);
139 * Common part for ECDH and ECDHE.
142 ecdh_common(br_ssl_server_context
*ctx
, int prf_id
,
143 unsigned char *cpoint
, size_t cpoint_len
, uint32_t ctl
)
145 unsigned char rpms
[80];
149 * The point length is supposed to be 1+2*Xlen, where Xlen is
150 * the length (in bytes) of the X coordinate, i.e. the pre-master
151 * secret. If the provided point is too large, then it is
152 * obviously incorrect (i.e. everybody can see that it is
153 * incorrect), so leaking that fact is not a problem.
155 pms_len
= cpoint_len
>> 1;
156 if (pms_len
> sizeof rpms
) {
157 pms_len
= sizeof rpms
;
162 * Make a random PMS and copy it above the decrypted value if the
163 * decryption failed. Note that we use a constant-time conditional
166 br_hmac_drbg_generate(&ctx
->eng
.rng
, rpms
, pms_len
);
167 br_ccopy(ctl
^ 1, cpoint
+ 1, rpms
, pms_len
);
170 * Compute master secret.
172 br_ssl_engine_compute_master(&ctx
->eng
, prf_id
, cpoint
+ 1, pms_len
);
175 * Clear the pre-master secret from RAM: it is normally a buffer
176 * in the context, hence potentially long-lived.
178 memset(cpoint
, 0, cpoint_len
);
182 * Do the ECDH key exchange (not ECDHE).
185 do_ecdh(br_ssl_server_context
*ctx
, int prf_id
,
186 unsigned char *cpoint
, size_t cpoint_len
)
191 * Finalise the key exchange.
193 x
= (*ctx
->policy_vtable
)->do_keyx(ctx
->policy_vtable
,
195 ecdh_common(ctx
, prf_id
, cpoint
, cpoint_len
, x
);
199 * Do the ECDHE key exchange (part 1: generation of transient key, and
200 * computing of the point to send to the client). Returned value is the
201 * signature length (in bytes), or -x on error (with x being an error
202 * code). The encoded point is written in the ecdhe_point[] context buffer
203 * (length in ecdhe_point_len).
206 do_ecdhe_part1(br_ssl_server_context
*ctx
, int curve
)
210 const unsigned char *order
, *generator
;
212 br_multihash_context mhc
;
213 unsigned char head
[4];
214 size_t hv_len
, sig_len
;
216 if (!((ctx
->eng
.iec
->supported_curves
>> curve
) & 1)) {
217 return -BR_ERR_INVALID_ALGORITHM
;
219 ctx
->eng
.ecdhe_curve
= curve
;
222 * Generate our private key. We need a non-zero random value
223 * which is lower than the curve order, in a "large enough"
224 * range. We force the top bit to 0 and bottom bit to 1, which
225 * does the trick. Note that contrary to what happens in ECDSA,
226 * this is not a problem if we do not cover the full range of
229 order
= ctx
->eng
.iec
->order(curve
, &olen
);
231 while (mask
>= order
[0]) {
234 br_hmac_drbg_generate(&ctx
->eng
.rng
, ctx
->ecdhe_key
, olen
);
235 ctx
->ecdhe_key
[0] &= mask
;
236 ctx
->ecdhe_key
[olen
- 1] |= 0x01;
237 ctx
->ecdhe_key_len
= olen
;
240 * Compute our ECDH point.
242 generator
= ctx
->eng
.iec
->generator(curve
, &glen
);
243 memcpy(ctx
->eng
.ecdhe_point
, generator
, glen
);
244 ctx
->eng
.ecdhe_point_len
= glen
;
245 if (!ctx
->eng
.iec
->mul(ctx
->eng
.ecdhe_point
, glen
,
246 ctx
->ecdhe_key
, olen
, curve
))
248 return -BR_ERR_INVALID_ALGORITHM
;
252 * Compute the signature.
254 br_multihash_zero(&mhc
);
255 br_multihash_copyimpl(&mhc
, &ctx
->eng
.mhash
);
256 br_multihash_init(&mhc
);
257 br_multihash_update(&mhc
,
258 ctx
->eng
.client_random
, sizeof ctx
->eng
.client_random
);
259 br_multihash_update(&mhc
,
260 ctx
->eng
.server_random
, sizeof ctx
->eng
.server_random
);
264 head
[3] = ctx
->eng
.ecdhe_point_len
;
265 br_multihash_update(&mhc
, head
, sizeof head
);
266 br_multihash_update(&mhc
,
267 ctx
->eng
.ecdhe_point
, ctx
->eng
.ecdhe_point_len
);
268 hash
= ctx
->sign_hash_id
;
270 hv_len
= br_multihash_out(&mhc
, hash
, ctx
->eng
.pad
);
272 return -BR_ERR_INVALID_ALGORITHM
;
275 if (!br_multihash_out(&mhc
, br_md5_ID
, ctx
->eng
.pad
)
276 || !br_multihash_out(&mhc
,
277 br_sha1_ID
, ctx
->eng
.pad
+ 16))
279 return -BR_ERR_INVALID_ALGORITHM
;
283 sig_len
= (*ctx
->policy_vtable
)->do_sign(ctx
->policy_vtable
,
284 hash
, hv_len
, ctx
->eng
.pad
, sizeof ctx
->eng
.pad
);
285 return sig_len
? (int)sig_len
: -BR_ERR_INVALID_ALGORITHM
;
289 * Do the ECDHE key exchange (part 2: computation of the shared secret
290 * from the point sent by the client).
293 do_ecdhe_part2(br_ssl_server_context
*ctx
, int prf_id
,
294 unsigned char *cpoint
, size_t cpoint_len
)
299 curve
= ctx
->eng
.ecdhe_curve
;
302 * Finalise the key exchange.
304 x
= ctx
->eng
.iec
->mul(cpoint
, cpoint_len
,
305 ctx
->ecdhe_key
, ctx
->ecdhe_key_len
, curve
);
306 ecdh_common(ctx
, prf_id
, cpoint
, cpoint_len
, x
);
309 * Clear the ECDHE private key. Forward Secrecy is achieved insofar
310 * as that key does not get stolen, so we'd better destroy it
311 * as soon as it ceases to be useful.
313 memset(ctx
->ecdhe_key
, 0, ctx
->ecdhe_key_len
);
318 static const uint8_t t0_datablock
[] = {
319 0x00, 0x00, 0x0A, 0x00, 0x24, 0x00, 0x2F, 0x01, 0x24, 0x00, 0x35, 0x02,
320 0x24, 0x00, 0x3C, 0x01, 0x44, 0x00, 0x3D, 0x02, 0x44, 0x00, 0x9C, 0x03,
321 0x04, 0x00, 0x9D, 0x04, 0x05, 0xC0, 0x03, 0x40, 0x24, 0xC0, 0x04, 0x41,
322 0x24, 0xC0, 0x05, 0x42, 0x24, 0xC0, 0x08, 0x20, 0x24, 0xC0, 0x09, 0x21,
323 0x24, 0xC0, 0x0A, 0x22, 0x24, 0xC0, 0x0D, 0x30, 0x24, 0xC0, 0x0E, 0x31,
324 0x24, 0xC0, 0x0F, 0x32, 0x24, 0xC0, 0x12, 0x10, 0x24, 0xC0, 0x13, 0x11,
325 0x24, 0xC0, 0x14, 0x12, 0x24, 0xC0, 0x23, 0x21, 0x44, 0xC0, 0x24, 0x22,
326 0x55, 0xC0, 0x25, 0x41, 0x44, 0xC0, 0x26, 0x42, 0x55, 0xC0, 0x27, 0x11,
327 0x44, 0xC0, 0x28, 0x12, 0x55, 0xC0, 0x29, 0x31, 0x44, 0xC0, 0x2A, 0x32,
328 0x55, 0xC0, 0x2B, 0x23, 0x04, 0xC0, 0x2C, 0x24, 0x05, 0xC0, 0x2D, 0x43,
329 0x04, 0xC0, 0x2E, 0x44, 0x05, 0xC0, 0x2F, 0x13, 0x04, 0xC0, 0x30, 0x14,
330 0x05, 0xC0, 0x31, 0x33, 0x04, 0xC0, 0x32, 0x34, 0x05, 0xCC, 0xA8, 0x15,
331 0x04, 0xCC, 0xA9, 0x25, 0x04, 0x00, 0x00
334 static const uint8_t t0_codeblock
[] = {
335 0x00, 0x01, 0x00, 0x0A, 0x00, 0x00, 0x01, 0x00, 0x0D, 0x00, 0x00, 0x01,
336 0x00, 0x0E, 0x00, 0x00, 0x01, 0x00, 0x0F, 0x00, 0x00, 0x01, 0x01, 0x08,
337 0x00, 0x00, 0x01, 0x01, 0x09, 0x00, 0x00, 0x01, 0x02, 0x08, 0x00, 0x00,
338 0x21, 0x21, 0x00, 0x00, 0x01, T0_INT1(BR_ERR_BAD_CCS
), 0x00, 0x00,
339 0x01, T0_INT1(BR_ERR_BAD_FINISHED
), 0x00, 0x00, 0x01,
340 T0_INT1(BR_ERR_BAD_FRAGLEN
), 0x00, 0x00, 0x01,
341 T0_INT1(BR_ERR_BAD_HANDSHAKE
), 0x00, 0x00, 0x01,
342 T0_INT1(BR_ERR_BAD_PARAM
), 0x00, 0x00, 0x01,
343 T0_INT1(BR_ERR_BAD_SECRENEG
), 0x00, 0x00, 0x01,
344 T0_INT1(BR_ERR_BAD_VERSION
), 0x00, 0x00, 0x01,
345 T0_INT1(BR_ERR_LIMIT_EXCEEDED
), 0x00, 0x00, 0x01, T0_INT1(BR_ERR_OK
),
346 0x00, 0x00, 0x01, T0_INT1(BR_ERR_OVERSIZED_ID
), 0x00, 0x00, 0x01,
347 T0_INT1(BR_ERR_UNEXPECTED
), 0x00, 0x00, 0x01,
348 T0_INT2(offsetof(br_ssl_engine_context
, action
)), 0x00, 0x00, 0x01,
349 T0_INT2(offsetof(br_ssl_engine_context
, alert
)), 0x00, 0x00, 0x01,
350 T0_INT2(offsetof(br_ssl_engine_context
, application_data
)), 0x00, 0x00,
352 T0_INT2(offsetof(br_ssl_engine_context
, session
) + offsetof(br_ssl_session_parameters
, cipher_suite
)),
354 T0_INT2(offsetof(br_ssl_server_context
, client_max_version
)), 0x00,
355 0x00, 0x01, T0_INT2(offsetof(br_ssl_engine_context
, client_random
)),
357 T0_INT2(offsetof(br_ssl_server_context
, client_suites
)), 0x00, 0x00,
358 0x01, T0_INT2(offsetof(br_ssl_server_context
, client_suites_num
)),
360 T0_INT2(offsetof(br_ssl_engine_context
, close_received
)), 0x00, 0x00,
361 0x01, T0_INT2(offsetof(br_ssl_server_context
, curves
)), 0x00, 0x00,
362 0x01, T0_INT2(offsetof(br_ssl_engine_context
, ecdhe_point
)), 0x00,
363 0x00, 0x01, T0_INT2(offsetof(br_ssl_engine_context
, ecdhe_point_len
)),
364 0x00, 0x00, 0x01, T0_INT2(offsetof(br_ssl_server_context
, flags
)),
365 0x00, 0x00, 0x01, T0_INT2(offsetof(br_ssl_server_context
, hashes
)),
366 0x00, 0x00, 0x5D, 0x01,
367 T0_INT2(BR_MAX_CIPHER_SUITES
* sizeof(br_suite_translated
)), 0x00,
368 0x00, 0x01, T0_INT2(offsetof(br_ssl_engine_context
, log_max_frag_len
)),
369 0x00, 0x00, 0x01, T0_INT2(offsetof(br_ssl_engine_context
, pad
)), 0x00,
371 T0_INT2(offsetof(br_ssl_engine_context
, peer_log_max_frag_len
)), 0x00,
372 0x00, 0x01, T0_INT2(offsetof(br_ssl_engine_context
, record_type_in
)),
374 T0_INT2(offsetof(br_ssl_engine_context
, record_type_out
)), 0x00, 0x00,
375 0x01, T0_INT2(offsetof(br_ssl_engine_context
, reneg
)), 0x00, 0x00,
376 0x01, T0_INT2(offsetof(br_ssl_engine_context
, saved_finished
)), 0x00,
377 0x00, 0x01, T0_INT2(offsetof(br_ssl_engine_context
, server_name
)),
379 T0_INT2(offsetof(br_ssl_engine_context
, server_random
)), 0x00, 0x00,
381 T0_INT2(offsetof(br_ssl_engine_context
, session
) + offsetof(br_ssl_session_parameters
, session_id
)),
383 T0_INT2(offsetof(br_ssl_engine_context
, session
) + offsetof(br_ssl_session_parameters
, session_id_len
)),
385 T0_INT2(offsetof(br_ssl_engine_context
, shutdown_recv
)), 0x00, 0x00,
386 0x01, T0_INT2(offsetof(br_ssl_server_context
, sign_hash_id
)), 0x00,
387 0x00, 0x01, T0_INT2(offsetof(br_ssl_engine_context
, suites_buf
)), 0x00,
388 0x00, 0x01, T0_INT2(offsetof(br_ssl_engine_context
, suites_num
)), 0x00,
390 T0_INT2(offsetof(br_ssl_engine_context
, session
) + offsetof(br_ssl_session_parameters
, version
)),
391 0x00, 0x00, 0x01, T0_INT2(offsetof(br_ssl_engine_context
, version_in
)),
393 T0_INT2(offsetof(br_ssl_engine_context
, version_max
)), 0x00, 0x00,
394 0x01, T0_INT2(offsetof(br_ssl_engine_context
, version_min
)), 0x00,
395 0x00, 0x01, T0_INT2(offsetof(br_ssl_engine_context
, version_out
)),
396 0x00, 0x00, 0x09, 0x22, 0x44, 0x06, 0x02, 0x50, 0x23, 0x00, 0x00, 0x01,
397 0x01, 0x00, 0x01, 0x03, 0x00, 0x7B, 0x22, 0x4A, 0x3B, 0x7F, 0x22, 0x05,
398 0x04, 0x4B, 0x01, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x06, 0x02, 0x7F, 0x00,
399 0x4A, 0x04, 0x6B, 0x00, 0x06, 0x02, 0x50, 0x23, 0x00, 0x00, 0x22, 0x6C,
400 0x3B, 0x05, 0x03, 0x01, 0x0C, 0x08, 0x3B, 0x5A, 0x25, 0x81, 0x07, 0x19,
401 0x67, 0x01, 0x0C, 0x2A, 0x00, 0x00, 0x22, 0x1B, 0x01, 0x08, 0x0B, 0x3B,
402 0x48, 0x1B, 0x08, 0x00, 0x01, 0x03, 0x00, 0x01, 0x00, 0x59, 0x38, 0x24,
403 0x16, 0x2F, 0x06, 0x08, 0x02, 0x00, 0x81, 0x26, 0x03, 0x00, 0x04, 0x74,
404 0x01, 0x00, 0x81, 0x1E, 0x02, 0x00, 0x22, 0x16, 0x12, 0x06, 0x02, 0x54,
405 0x23, 0x81, 0x26, 0x04, 0x75, 0x00, 0x01, 0x00, 0x59, 0x38, 0x01, 0x16,
406 0x6A, 0x38, 0x2D, 0x81, 0x0B, 0x2C, 0x06, 0x02, 0x56, 0x23, 0x06, 0x0C,
407 0x81, 0x2C, 0x01, 0x00, 0x81, 0x29, 0x01, 0x00, 0x81, 0x0A, 0x04, 0x14,
408 0x81, 0x2C, 0x81, 0x2A, 0x81, 0x2E, 0x81, 0x2D, 0x24, 0x81, 0x0C, 0x01,
409 0x00, 0x81, 0x0A, 0x01, 0x00, 0x81, 0x29, 0x34, 0x01, 0x01, 0x59, 0x38,
410 0x01, 0x17, 0x6A, 0x38, 0x00, 0x00, 0x31, 0x31, 0x00, 0x01, 0x03, 0x00,
411 0x24, 0x16, 0x2F, 0x06, 0x05, 0x81, 0x25, 0x21, 0x04, 0x77, 0x01, 0x02,
412 0x02, 0x00, 0x81, 0x1D, 0x16, 0x2F, 0x06, 0x05, 0x81, 0x25, 0x21, 0x04,
413 0x77, 0x02, 0x00, 0x01, 0x84, 0x00, 0x08, 0x23, 0x00, 0x00, 0x63, 0x26,
414 0x3B, 0x11, 0x01, 0x01, 0x12, 0x2E, 0x00, 0x00, 0x01, 0x7F, 0x81, 0x01,
415 0x81, 0x25, 0x22, 0x01, 0x07, 0x12, 0x01, 0x00, 0x31, 0x0E, 0x06, 0x0A,
416 0x21, 0x01, 0x10, 0x12, 0x06, 0x02, 0x81, 0x1C, 0x04, 0x24, 0x01, 0x01,
417 0x31, 0x0E, 0x06, 0x1B, 0x21, 0x21, 0x6B, 0x27, 0x01, 0x01, 0x0D, 0x06,
418 0x06, 0x01, 0x00, 0x81, 0x01, 0x04, 0x0A, 0x24, 0x16, 0x2F, 0x06, 0x05,
419 0x81, 0x25, 0x21, 0x04, 0x77, 0x04, 0x03, 0x56, 0x23, 0x21, 0x04, 0x44,
420 0x01, 0x22, 0x03, 0x00, 0x09, 0x22, 0x44, 0x06, 0x02, 0x50, 0x23, 0x02,
421 0x00, 0x00, 0x00, 0x7C, 0x01, 0x0F, 0x12, 0x00, 0x00, 0x58, 0x27, 0x01,
422 0x00, 0x31, 0x0E, 0x06, 0x10, 0x21, 0x22, 0x01, 0x01, 0x0D, 0x06, 0x03,
423 0x21, 0x01, 0x02, 0x58, 0x38, 0x01, 0x00, 0x04, 0x16, 0x01, 0x01, 0x31,
424 0x0E, 0x06, 0x09, 0x21, 0x01, 0x00, 0x58, 0x38, 0x46, 0x00, 0x04, 0x07,
425 0x21, 0x01, 0x82, 0x00, 0x08, 0x23, 0x21, 0x00, 0x00, 0x01, 0x00, 0x28,
426 0x06, 0x06, 0x33, 0x81, 0x08, 0x30, 0x04, 0x77, 0x22, 0x06, 0x04, 0x01,
427 0x01, 0x71, 0x38, 0x00, 0x00, 0x28, 0x06, 0x0B, 0x69, 0x27, 0x01, 0x14,
428 0x0D, 0x06, 0x02, 0x56, 0x23, 0x04, 0x12, 0x81, 0x25, 0x01, 0x07, 0x12,
429 0x22, 0x01, 0x02, 0x0D, 0x06, 0x06, 0x06, 0x02, 0x56, 0x23, 0x04, 0x6F,
430 0x21, 0x81, 0x1A, 0x01, 0x01, 0x0D, 0x2C, 0x30, 0x06, 0x02, 0x4C, 0x23,
431 0x22, 0x01, 0x01, 0x81, 0x20, 0x2F, 0x81, 0x0D, 0x00, 0x0A, 0x81, 0x12,
432 0x01, 0x01, 0x0E, 0x05, 0x02, 0x56, 0x23, 0x81, 0x17, 0x22, 0x03, 0x00,
433 0x5B, 0x36, 0x5C, 0x01, 0x20, 0x81, 0x0E, 0x81, 0x19, 0x22, 0x01, 0x20,
434 0x0F, 0x06, 0x02, 0x55, 0x23, 0x22, 0x70, 0x38, 0x6F, 0x3B, 0x81, 0x0E,
435 0x17, 0x03, 0x01, 0x81, 0x17, 0x81, 0x06, 0x01, 0x00, 0x03, 0x02, 0x01,
436 0x00, 0x03, 0x03, 0x65, 0x81, 0x02, 0x14, 0x31, 0x08, 0x03, 0x04, 0x03,
437 0x05, 0x22, 0x06, 0x80, 0x70, 0x81, 0x17, 0x22, 0x03, 0x06, 0x02, 0x01,
438 0x06, 0x0A, 0x22, 0x5A, 0x25, 0x0E, 0x06, 0x04, 0x01, 0x7F, 0x03, 0x03,
439 0x22, 0x01, 0x81, 0x7F, 0x0E, 0x06, 0x0A, 0x6B, 0x27, 0x06, 0x02, 0x51,
440 0x23, 0x01, 0x7F, 0x03, 0x02, 0x22, 0x01, 0x81, 0xAC, 0x00, 0x0E, 0x06,
441 0x11, 0x02, 0x00, 0x78, 0x25, 0x10, 0x02, 0x00, 0x77, 0x25, 0x0A, 0x12,
442 0x06, 0x04, 0x01, 0x7F, 0x03, 0x00, 0x81, 0x1B, 0x22, 0x44, 0x06, 0x03,
443 0x21, 0x04, 0x27, 0x01, 0x00, 0x81, 0x04, 0x06, 0x0B, 0x01, 0x02, 0x0B,
444 0x5D, 0x08, 0x02, 0x06, 0x3B, 0x36, 0x04, 0x16, 0x21, 0x02, 0x05, 0x02,
445 0x04, 0x10, 0x06, 0x02, 0x4F, 0x23, 0x02, 0x06, 0x02, 0x05, 0x36, 0x02,
446 0x05, 0x01, 0x04, 0x08, 0x03, 0x05, 0x04, 0xFF, 0x0C, 0x21, 0x01, 0x00,
447 0x03, 0x07, 0x81, 0x19, 0x81, 0x06, 0x22, 0x06, 0x0A, 0x81, 0x19, 0x05,
448 0x04, 0x01, 0x7F, 0x03, 0x07, 0x04, 0x73, 0x7D, 0x01, 0x00, 0x6D, 0x38,
449 0x01, 0x88, 0x04, 0x64, 0x36, 0x01, 0x84, 0x80, 0x80, 0x00, 0x60, 0x37,
450 0x22, 0x06, 0x80, 0x4D, 0x81, 0x17, 0x81, 0x06, 0x22, 0x06, 0x80, 0x44,
451 0x81, 0x17, 0x01, 0x00, 0x31, 0x0E, 0x06, 0x05, 0x21, 0x81, 0x11, 0x04,
452 0x34, 0x01, 0x01, 0x31, 0x0E, 0x06, 0x05, 0x21, 0x81, 0x0F, 0x04, 0x29,
453 0x01, 0x83, 0xFE, 0x01, 0x31, 0x0E, 0x06, 0x05, 0x21, 0x81, 0x10, 0x04,
454 0x1C, 0x01, 0x0D, 0x31, 0x0E, 0x06, 0x05, 0x21, 0x81, 0x15, 0x04, 0x11,
455 0x01, 0x0A, 0x31, 0x0E, 0x06, 0x05, 0x21, 0x81, 0x16, 0x04, 0x06, 0x21,
456 0x81, 0x14, 0x01, 0x00, 0x21, 0x04, 0xFF, 0x38, 0x7D, 0x7D, 0x02, 0x01,
457 0x02, 0x03, 0x12, 0x03, 0x01, 0x02, 0x00, 0x44, 0x06, 0x09, 0x5B, 0x25,
458 0x79, 0x36, 0x01, 0x80, 0x56, 0x81, 0x03, 0x77, 0x25, 0x22, 0x02, 0x00,
459 0x0F, 0x06, 0x03, 0x21, 0x02, 0x00, 0x22, 0x01, 0x86, 0x00, 0x0A, 0x06,
460 0x02, 0x52, 0x23, 0x02, 0x00, 0x78, 0x25, 0x0A, 0x06, 0x05, 0x01, 0x80,
461 0x46, 0x81, 0x03, 0x02, 0x01, 0x06, 0x10, 0x75, 0x25, 0x02, 0x00, 0x0C,
462 0x06, 0x05, 0x21, 0x75, 0x25, 0x04, 0x04, 0x01, 0x00, 0x03, 0x01, 0x22,
463 0x75, 0x36, 0x22, 0x76, 0x36, 0x22, 0x79, 0x36, 0x01, 0x86, 0x03, 0x10,
464 0x03, 0x08, 0x02, 0x02, 0x06, 0x04, 0x01, 0x02, 0x6B, 0x38, 0x02, 0x07,
465 0x05, 0x04, 0x01, 0x28, 0x81, 0x03, 0x3A, 0x21, 0x01, 0x82, 0x01, 0x07,
466 0x64, 0x25, 0x12, 0x22, 0x64, 0x36, 0x45, 0x03, 0x09, 0x60, 0x26, 0x39,
467 0x12, 0x22, 0x60, 0x37, 0x05, 0x04, 0x01, 0x00, 0x03, 0x09, 0x02, 0x01,
468 0x06, 0x03, 0x01, 0x7F, 0x00, 0x6F, 0x01, 0x20, 0x2B, 0x5D, 0x22, 0x03,
469 0x05, 0x22, 0x02, 0x04, 0x0A, 0x06, 0x80, 0x47, 0x22, 0x25, 0x22, 0x7C,
470 0x02, 0x09, 0x05, 0x13, 0x22, 0x01, 0x0C, 0x11, 0x22, 0x01, 0x01, 0x0E,
471 0x3B, 0x01, 0x02, 0x0E, 0x30, 0x06, 0x04, 0x4B, 0x01, 0x00, 0x22, 0x02,
472 0x08, 0x05, 0x0E, 0x22, 0x01, 0x81, 0x70, 0x12, 0x01, 0x20, 0x0D, 0x06,
473 0x04, 0x4B, 0x01, 0x00, 0x22, 0x22, 0x06, 0x10, 0x02, 0x05, 0x4A, 0x36,
474 0x02, 0x05, 0x36, 0x02, 0x05, 0x01, 0x04, 0x08, 0x03, 0x05, 0x04, 0x01,
475 0x4B, 0x01, 0x04, 0x08, 0x04, 0xFF, 0x32, 0x21, 0x02, 0x05, 0x5D, 0x09,
476 0x01, 0x02, 0x11, 0x22, 0x05, 0x04, 0x01, 0x28, 0x81, 0x03, 0x5E, 0x38,
477 0x15, 0x05, 0x04, 0x01, 0x28, 0x81, 0x03, 0x01, 0x00, 0x00, 0x04, 0x81,
478 0x12, 0x01, 0x10, 0x0E, 0x05, 0x02, 0x56, 0x23, 0x5A, 0x25, 0x81, 0x24,
479 0x06, 0x19, 0x81, 0x17, 0x22, 0x01, 0x84, 0x00, 0x0F, 0x06, 0x02, 0x53,
480 0x23, 0x22, 0x03, 0x00, 0x67, 0x3B, 0x81, 0x0E, 0x02, 0x00, 0x5A, 0x25,
481 0x81, 0x07, 0x20, 0x5A, 0x25, 0x22, 0x81, 0x22, 0x3B, 0x81, 0x21, 0x03,
482 0x01, 0x03, 0x02, 0x02, 0x01, 0x02, 0x02, 0x30, 0x06, 0x17, 0x81, 0x19,
483 0x22, 0x03, 0x03, 0x67, 0x3B, 0x81, 0x0E, 0x02, 0x03, 0x5A, 0x25, 0x81,
484 0x07, 0x02, 0x02, 0x06, 0x03, 0x1F, 0x04, 0x01, 0x1D, 0x7D, 0x00, 0x00,
485 0x7E, 0x81, 0x12, 0x01, 0x14, 0x0D, 0x06, 0x02, 0x56, 0x23, 0x67, 0x01,
486 0x0C, 0x08, 0x01, 0x0C, 0x81, 0x0E, 0x7D, 0x67, 0x22, 0x01, 0x0C, 0x08,
487 0x01, 0x0C, 0x29, 0x05, 0x02, 0x4D, 0x23, 0x00, 0x02, 0x03, 0x00, 0x03,
488 0x01, 0x02, 0x00, 0x7A, 0x02, 0x01, 0x02, 0x00, 0x32, 0x22, 0x01, 0x00,
489 0x0E, 0x06, 0x02, 0x4B, 0x00, 0x81, 0x27, 0x04, 0x73, 0x00, 0x81, 0x17,
490 0x01, 0x01, 0x0D, 0x06, 0x02, 0x4E, 0x23, 0x81, 0x19, 0x22, 0x22, 0x46,
491 0x3B, 0x01, 0x05, 0x10, 0x30, 0x06, 0x02, 0x4E, 0x23, 0x01, 0x08, 0x08,
492 0x22, 0x66, 0x27, 0x0A, 0x06, 0x0D, 0x22, 0x01, 0x01, 0x3B, 0x0B, 0x35,
493 0x22, 0x66, 0x38, 0x68, 0x38, 0x04, 0x01, 0x21, 0x00, 0x00, 0x81, 0x17,
494 0x6B, 0x27, 0x01, 0x00, 0x31, 0x0E, 0x06, 0x14, 0x21, 0x01, 0x01, 0x0E,
495 0x05, 0x02, 0x51, 0x23, 0x81, 0x19, 0x06, 0x02, 0x51, 0x23, 0x01, 0x02,
496 0x6B, 0x38, 0x04, 0x2A, 0x01, 0x02, 0x31, 0x0E, 0x06, 0x21, 0x21, 0x01,
497 0x0D, 0x0E, 0x05, 0x02, 0x51, 0x23, 0x81, 0x19, 0x01, 0x0C, 0x0E, 0x05,
498 0x02, 0x51, 0x23, 0x67, 0x01, 0x0C, 0x81, 0x0E, 0x6C, 0x67, 0x01, 0x0C,
499 0x29, 0x05, 0x02, 0x51, 0x23, 0x04, 0x03, 0x51, 0x23, 0x21, 0x00, 0x00,
500 0x81, 0x17, 0x81, 0x06, 0x81, 0x17, 0x81, 0x06, 0x22, 0x06, 0x22, 0x81,
501 0x19, 0x06, 0x04, 0x81, 0x14, 0x04, 0x18, 0x81, 0x17, 0x22, 0x01, 0x81,
502 0x7F, 0x0C, 0x06, 0x0D, 0x22, 0x6D, 0x08, 0x01, 0x00, 0x3B, 0x38, 0x6D,
503 0x3B, 0x81, 0x0E, 0x04, 0x02, 0x81, 0x1F, 0x04, 0x5B, 0x7D, 0x7D, 0x00,
504 0x00, 0x81, 0x13, 0x22, 0x46, 0x06, 0x07, 0x21, 0x06, 0x02, 0x4F, 0x23,
505 0x04, 0x73, 0x00, 0x00, 0x81, 0x1A, 0x01, 0x03, 0x81, 0x18, 0x3B, 0x21,
506 0x3B, 0x00, 0x00, 0x81, 0x17, 0x81, 0x1F, 0x00, 0x02, 0x81, 0x17, 0x81,
507 0x06, 0x01, 0x00, 0x64, 0x36, 0x81, 0x17, 0x81, 0x06, 0x22, 0x06, 0x34,
508 0x81, 0x19, 0x03, 0x00, 0x81, 0x19, 0x03, 0x01, 0x02, 0x00, 0x01, 0x02,
509 0x10, 0x02, 0x00, 0x01, 0x06, 0x0C, 0x12, 0x02, 0x01, 0x01, 0x01, 0x0E,
510 0x02, 0x01, 0x01, 0x03, 0x0E, 0x30, 0x12, 0x06, 0x11, 0x64, 0x25, 0x01,
511 0x01, 0x02, 0x01, 0x49, 0x01, 0x02, 0x0B, 0x02, 0x00, 0x08, 0x0B, 0x30,
512 0x64, 0x36, 0x04, 0x49, 0x7D, 0x7D, 0x00, 0x00, 0x81, 0x17, 0x81, 0x06,
513 0x81, 0x17, 0x81, 0x06, 0x01, 0x00, 0x60, 0x37, 0x22, 0x06, 0x16, 0x81,
514 0x17, 0x22, 0x01, 0x20, 0x0A, 0x06, 0x0B, 0x01, 0x01, 0x3B, 0x0B, 0x60,
515 0x26, 0x30, 0x60, 0x37, 0x04, 0x01, 0x21, 0x04, 0x67, 0x7D, 0x7D, 0x00,
516 0x00, 0x01, 0x02, 0x7A, 0x81, 0x1A, 0x01, 0x08, 0x0B, 0x81, 0x1A, 0x08,
517 0x00, 0x00, 0x01, 0x03, 0x7A, 0x81, 0x1A, 0x01, 0x08, 0x0B, 0x81, 0x1A,
518 0x08, 0x01, 0x08, 0x0B, 0x81, 0x1A, 0x08, 0x00, 0x00, 0x01, 0x01, 0x7A,
519 0x81, 0x1A, 0x00, 0x00, 0x33, 0x22, 0x44, 0x05, 0x01, 0x00, 0x21, 0x81,
520 0x27, 0x04, 0x75, 0x02, 0x03, 0x00, 0x74, 0x27, 0x03, 0x01, 0x01, 0x00,
521 0x22, 0x02, 0x01, 0x0A, 0x06, 0x10, 0x22, 0x01, 0x01, 0x0B, 0x73, 0x08,
522 0x25, 0x02, 0x00, 0x0E, 0x06, 0x01, 0x00, 0x48, 0x04, 0x6A, 0x21, 0x01,
523 0x7F, 0x00, 0x00, 0x24, 0x16, 0x2F, 0x06, 0x05, 0x81, 0x25, 0x21, 0x04,
524 0x77, 0x01, 0x16, 0x6A, 0x38, 0x01, 0x00, 0x81, 0x33, 0x01, 0x00, 0x81,
525 0x32, 0x24, 0x01, 0x17, 0x6A, 0x38, 0x00, 0x00, 0x01, 0x15, 0x6A, 0x38,
526 0x3B, 0x43, 0x21, 0x43, 0x21, 0x24, 0x00, 0x00, 0x01, 0x01, 0x3B, 0x81,
527 0x1D, 0x00, 0x00, 0x3B, 0x31, 0x7A, 0x3B, 0x22, 0x06, 0x06, 0x81, 0x1A,
528 0x21, 0x49, 0x04, 0x77, 0x21, 0x00, 0x02, 0x03, 0x00, 0x5A, 0x25, 0x7C,
529 0x03, 0x01, 0x02, 0x01, 0x01, 0x0F, 0x12, 0x02, 0x01, 0x01, 0x04, 0x11,
530 0x01, 0x0F, 0x12, 0x02, 0x01, 0x01, 0x08, 0x11, 0x01, 0x0F, 0x12, 0x01,
531 0x00, 0x31, 0x0E, 0x06, 0x10, 0x21, 0x01, 0x00, 0x01, 0x18, 0x02, 0x00,
532 0x06, 0x03, 0x3E, 0x04, 0x01, 0x3F, 0x04, 0x80, 0x56, 0x01, 0x01, 0x31,
533 0x0E, 0x06, 0x10, 0x21, 0x01, 0x01, 0x01, 0x10, 0x02, 0x00, 0x06, 0x03,
534 0x3E, 0x04, 0x01, 0x3F, 0x04, 0x80, 0x40, 0x01, 0x02, 0x31, 0x0E, 0x06,
535 0x0F, 0x21, 0x01, 0x01, 0x01, 0x20, 0x02, 0x00, 0x06, 0x03, 0x3E, 0x04,
536 0x01, 0x3F, 0x04, 0x2B, 0x01, 0x03, 0x31, 0x0E, 0x06, 0x0E, 0x21, 0x21,
537 0x01, 0x10, 0x02, 0x00, 0x06, 0x03, 0x3C, 0x04, 0x01, 0x3D, 0x04, 0x17,
538 0x01, 0x04, 0x31, 0x0E, 0x06, 0x0E, 0x21, 0x21, 0x01, 0x20, 0x02, 0x00,
539 0x06, 0x03, 0x3C, 0x04, 0x01, 0x3D, 0x04, 0x03, 0x50, 0x23, 0x21, 0x00,
540 0x00, 0x7C, 0x01, 0x0C, 0x11, 0x01, 0x02, 0x0F, 0x00, 0x00, 0x7C, 0x01,
541 0x0C, 0x11, 0x22, 0x47, 0x3B, 0x01, 0x03, 0x0A, 0x12, 0x00, 0x00, 0x7C,
542 0x01, 0x0C, 0x11, 0x01, 0x01, 0x0E, 0x00, 0x00, 0x7C, 0x01, 0x0C, 0x11,
543 0x46, 0x00, 0x00, 0x18, 0x01, 0x00, 0x57, 0x27, 0x22, 0x06, 0x20, 0x01,
544 0x01, 0x31, 0x0E, 0x06, 0x07, 0x21, 0x01, 0x00, 0x81, 0x00, 0x04, 0x11,
545 0x01, 0x02, 0x31, 0x0E, 0x06, 0x0A, 0x21, 0x59, 0x27, 0x06, 0x03, 0x01,
546 0x10, 0x30, 0x04, 0x01, 0x21, 0x04, 0x01, 0x21, 0x5F, 0x27, 0x05, 0x35,
547 0x28, 0x06, 0x32, 0x69, 0x27, 0x01, 0x14, 0x31, 0x0E, 0x06, 0x06, 0x21,
548 0x01, 0x02, 0x30, 0x04, 0x24, 0x01, 0x15, 0x31, 0x0E, 0x06, 0x0B, 0x21,
549 0x81, 0x09, 0x06, 0x04, 0x01, 0x7F, 0x81, 0x00, 0x04, 0x13, 0x01, 0x16,
550 0x31, 0x0E, 0x06, 0x06, 0x21, 0x01, 0x01, 0x30, 0x04, 0x07, 0x21, 0x01,
551 0x04, 0x30, 0x01, 0x00, 0x21, 0x16, 0x06, 0x03, 0x01, 0x08, 0x30, 0x00,
552 0x00, 0x18, 0x22, 0x05, 0x10, 0x28, 0x06, 0x0D, 0x69, 0x27, 0x01, 0x15,
553 0x0E, 0x06, 0x05, 0x21, 0x81, 0x09, 0x04, 0x01, 0x1C, 0x00, 0x00, 0x81,
554 0x25, 0x01, 0x07, 0x12, 0x01, 0x01, 0x0F, 0x06, 0x02, 0x56, 0x23, 0x00,
555 0x01, 0x03, 0x00, 0x24, 0x16, 0x06, 0x05, 0x02, 0x00, 0x6A, 0x38, 0x00,
556 0x81, 0x25, 0x21, 0x04, 0x73, 0x00, 0x01, 0x14, 0x81, 0x28, 0x01, 0x01,
557 0x81, 0x33, 0x24, 0x22, 0x01, 0x00, 0x81, 0x20, 0x01, 0x16, 0x81, 0x28,
558 0x81, 0x2B, 0x24, 0x00, 0x00, 0x01, 0x0B, 0x81, 0x33, 0x40, 0x22, 0x01,
559 0x03, 0x08, 0x81, 0x32, 0x81, 0x32, 0x13, 0x22, 0x44, 0x06, 0x02, 0x21,
560 0x00, 0x81, 0x32, 0x1A, 0x22, 0x06, 0x06, 0x67, 0x3B, 0x81, 0x2F, 0x04,
561 0x76, 0x21, 0x04, 0x6A, 0x00, 0x7E, 0x01, 0x14, 0x81, 0x33, 0x01, 0x0C,
562 0x81, 0x32, 0x67, 0x01, 0x0C, 0x81, 0x2F, 0x00, 0x03, 0x03, 0x00, 0x01,
563 0x02, 0x81, 0x33, 0x01, 0x80, 0x46, 0x6B, 0x27, 0x01, 0x02, 0x0E, 0x06,
564 0x0C, 0x02, 0x00, 0x06, 0x04, 0x01, 0x05, 0x04, 0x02, 0x01, 0x1D, 0x04,
565 0x02, 0x01, 0x00, 0x03, 0x01, 0x68, 0x27, 0x06, 0x04, 0x01, 0x05, 0x04,
566 0x02, 0x01, 0x00, 0x03, 0x02, 0x02, 0x01, 0x02, 0x02, 0x08, 0x22, 0x06,
567 0x03, 0x01, 0x02, 0x08, 0x08, 0x81, 0x32, 0x75, 0x25, 0x81, 0x31, 0x6E,
568 0x01, 0x04, 0x14, 0x6E, 0x01, 0x04, 0x08, 0x01, 0x1C, 0x2B, 0x6E, 0x01,
569 0x20, 0x81, 0x2F, 0x01, 0x20, 0x81, 0x33, 0x6F, 0x01, 0x20, 0x81, 0x2F,
570 0x5A, 0x25, 0x81, 0x31, 0x01, 0x00, 0x81, 0x33, 0x02, 0x01, 0x02, 0x02,
571 0x08, 0x22, 0x06, 0x30, 0x81, 0x31, 0x02, 0x01, 0x22, 0x06, 0x13, 0x01,
572 0x83, 0xFE, 0x01, 0x81, 0x31, 0x01, 0x04, 0x09, 0x22, 0x81, 0x31, 0x49,
573 0x6C, 0x3B, 0x81, 0x30, 0x04, 0x01, 0x21, 0x02, 0x02, 0x06, 0x0F, 0x01,
574 0x01, 0x81, 0x31, 0x01, 0x01, 0x81, 0x31, 0x68, 0x27, 0x01, 0x08, 0x09,
575 0x81, 0x33, 0x04, 0x01, 0x21, 0x00, 0x00, 0x01, 0x0E, 0x81, 0x33, 0x01,
576 0x00, 0x81, 0x32, 0x00, 0x03, 0x5A, 0x25, 0x81, 0x22, 0x05, 0x01, 0x00,
577 0x60, 0x26, 0x01, 0x00, 0x81, 0x02, 0x11, 0x01, 0x01, 0x12, 0x46, 0x06,
578 0x03, 0x48, 0x04, 0x74, 0x03, 0x00, 0x21, 0x02, 0x00, 0x1E, 0x22, 0x44,
579 0x06, 0x02, 0x2E, 0x23, 0x03, 0x01, 0x75, 0x25, 0x01, 0x86, 0x03, 0x10,
580 0x03, 0x02, 0x01, 0x0C, 0x81, 0x33, 0x02, 0x01, 0x62, 0x27, 0x08, 0x02,
581 0x02, 0x01, 0x02, 0x12, 0x08, 0x01, 0x06, 0x08, 0x81, 0x32, 0x01, 0x03,
582 0x81, 0x33, 0x02, 0x00, 0x81, 0x31, 0x61, 0x62, 0x27, 0x81, 0x30, 0x02,
583 0x02, 0x06, 0x10, 0x72, 0x27, 0x81, 0x33, 0x5A, 0x25, 0x81, 0x23, 0x01,
584 0x01, 0x0B, 0x01, 0x03, 0x08, 0x81, 0x33, 0x02, 0x01, 0x81, 0x31, 0x67,
585 0x02, 0x01, 0x81, 0x2F, 0x00, 0x00, 0x42, 0x22, 0x01, 0x00, 0x0E, 0x06,
586 0x02, 0x4B, 0x00, 0x81, 0x25, 0x21, 0x04, 0x72, 0x00, 0x22, 0x81, 0x33,
587 0x81, 0x2F, 0x00, 0x00, 0x22, 0x01, 0x08, 0x41, 0x81, 0x33, 0x81, 0x33,
588 0x00, 0x00, 0x22, 0x01, 0x10, 0x41, 0x81, 0x33, 0x81, 0x31, 0x00, 0x00,
589 0x22, 0x43, 0x06, 0x02, 0x21, 0x00, 0x81, 0x25, 0x21, 0x04, 0x75
592 static const uint16_t t0_caddr
[] = {
707 #define T0_INTERPRETED 68
709 #define T0_ENTER(ip, rp, slot) do { \
710 const unsigned char *t0_newip; \
712 t0_newip = &t0_codeblock[t0_caddr[(slot) - T0_INTERPRETED]]; \
713 t0_lnum = t0_parse7E_unsigned(&t0_newip); \
715 *((rp) ++) = (uint32_t)((ip) - &t0_codeblock[0]) + (t0_lnum << 16); \
719 #define T0_DEFENTRY(name, slot) \
723 t0_context *t0ctx = ctx; \
724 t0ctx->ip = &t0_codeblock[0]; \
725 T0_ENTER(t0ctx->ip, t0ctx->rp, slot); \
728 T0_DEFENTRY(br_ssl_hs_server_init_main
, 133)
731 br_ssl_hs_server_run(void *t0ctx
)
734 const unsigned char *ip
;
736 #define T0_LOCAL(x) (*(rp - 2 - (x)))
737 #define T0_POP() (*-- dp)
738 #define T0_POPi() (*(int32_t *)(-- dp))
739 #define T0_PEEK(x) (*(dp - 1 - (x)))
740 #define T0_PEEKi(x) (*(int32_t *)(dp - 1 - (x)))
741 #define T0_PUSH(v) do { *dp = (v); dp ++; } while (0)
742 #define T0_PUSHi(v) do { *(int32_t *)dp = (v); dp ++; } while (0)
743 #define T0_RPOP() (*-- rp)
744 #define T0_RPOPi() (*(int32_t *)(-- rp))
745 #define T0_RPUSH(v) do { *rp = (v); rp ++; } while (0)
746 #define T0_RPUSHi(v) do { *(int32_t *)rp = (v); rp ++; } while (0)
747 #define T0_ROLL(x) do { \
748 size_t t0len = (size_t)(x); \
749 uint32_t t0tmp = *(dp - 1 - t0len); \
750 memmove(dp - t0len - 1, dp - t0len, t0len * sizeof *dp); \
753 #define T0_SWAP() do { \
754 uint32_t t0tmp = *(dp - 2); \
755 *(dp - 2) = *(dp - 1); \
758 #define T0_ROT() do { \
759 uint32_t t0tmp = *(dp - 3); \
760 *(dp - 3) = *(dp - 2); \
761 *(dp - 2) = *(dp - 1); \
764 #define T0_NROT() do { \
765 uint32_t t0tmp = *(dp - 1); \
766 *(dp - 1) = *(dp - 2); \
767 *(dp - 2) = *(dp - 3); \
770 #define T0_PICK(x) do { \
771 uint32_t t0depth = (x); \
772 T0_PUSH(T0_PEEK(t0depth)); \
774 #define T0_CO() do { \
777 #define T0_RET() break
779 dp
= ((t0_context
*)t0ctx
)->dp
;
780 rp
= ((t0_context
*)t0ctx
)->rp
;
781 ip
= ((t0_context
*)t0ctx
)->ip
;
785 t0x
= t0_parse7E_unsigned(&ip
);
786 if (t0x
< T0_INTERPRETED
) {
798 ip
= &t0_codeblock
[t0x
];
800 case 1: /* literal constant */
801 T0_PUSHi(t0_parse7E_signed(&ip
));
803 case 2: /* read local */
804 T0_PUSH(T0_LOCAL(t0_parse7E_unsigned(&ip
)));
806 case 3: /* write local */
807 T0_LOCAL(t0_parse7E_unsigned(&ip
)) = T0_POP();
810 t0off
= t0_parse7E_signed(&ip
);
813 case 5: /* jump if */
814 t0off
= t0_parse7E_signed(&ip
);
819 case 6: /* jump if not */
820 t0off
= t0_parse7E_signed(&ip
);
828 uint32_t b
= T0_POP();
829 uint32_t a
= T0_POP();
837 uint32_t b
= T0_POP();
838 uint32_t a
= T0_POP();
846 uint32_t b
= T0_POP();
847 uint32_t a
= T0_POP();
855 int32_t b
= T0_POPi();
856 int32_t a
= T0_POPi();
857 T0_PUSH(-(uint32_t)(a
< b
));
864 int c
= (int)T0_POPi();
865 uint32_t x
= T0_POP();
873 int32_t b
= T0_POPi();
874 int32_t a
= T0_POPi();
875 T0_PUSH(-(uint32_t)(a
<= b
));
882 uint32_t b
= T0_POP();
883 uint32_t a
= T0_POP();
884 T0_PUSH(-(uint32_t)(a
!= b
));
891 uint32_t b
= T0_POP();
892 uint32_t a
= T0_POP();
893 T0_PUSH(-(uint32_t)(a
== b
));
900 int32_t b
= T0_POPi();
901 int32_t a
= T0_POPi();
902 T0_PUSH(-(uint32_t)(a
> b
));
909 int32_t b
= T0_POPi();
910 int32_t a
= T0_POPi();
911 T0_PUSH(-(uint32_t)(a
>= b
));
918 int c
= (int)T0_POPi();
919 int32_t x
= T0_POPi();
927 uint32_t b
= T0_POP();
928 uint32_t a
= T0_POP();
936 if (CTX
->chain_len
== 0) {
939 CTX
->cert_cur
= CTX
->chain
->data
;
940 CTX
->cert_len
= CTX
->chain
->data_len
;
943 T0_PUSH(CTX
->cert_len
);
951 size_t len
= (size_t)T0_POP();
952 void *addr
= (unsigned char *)ENG
+ (size_t)T0_POP();
953 memset(addr
, 0, len
);
958 /* call-policy-handler */
961 br_ssl_server_choices choices
;
963 x
= (*CTX
->policy_vtable
)->choose(
964 CTX
->policy_vtable
, CTX
, &choices
);
965 ENG
->session
.cipher_suite
= choices
.cipher_suite
;
966 CTX
->sign_hash_id
= choices
.hash_id
;
967 CTX
->chain
= choices
.chain
;
968 CTX
->chain_len
= choices
.chain_len
;
976 T0_PUSHi(-(ENG
->hlen_out
> 0));
983 if (ENG
->session
.session_id_len
== 32
984 && CTX
->cache_vtable
!= NULL
&& (*CTX
->cache_vtable
)->load(
985 CTX
->cache_vtable
, CTX
, &ENG
->session
))
1000 /* compute-Finished-inner */
1002 int prf_id
= T0_POP();
1003 int from_client
= T0_POPi();
1004 unsigned char seed
[48];
1007 br_tls_prf_impl prf
= br_ssl_engine_get_PRF(ENG
, prf_id
);
1008 if (ENG
->session
.version
>= BR_TLS12
) {
1009 seed_len
= br_multihash_out(&ENG
->mhash
, prf_id
, seed
);
1011 br_multihash_out(&ENG
->mhash
, br_md5_ID
, seed
);
1012 br_multihash_out(&ENG
->mhash
, br_sha1_ID
, seed
+ 16);
1015 prf(ENG
->pad
, 12, ENG
->session
.master_secret
,
1016 sizeof ENG
->session
.master_secret
,
1017 from_client
? "client finished" : "server finished",
1023 /* copy-cert-chunk */
1027 clen
= CTX
->cert_len
;
1028 if (clen
> sizeof ENG
->pad
) {
1029 clen
= sizeof ENG
->pad
;
1031 memcpy(ENG
->pad
, CTX
->cert_cur
, clen
);
1032 CTX
->cert_cur
+= clen
;
1033 CTX
->cert_len
-= clen
;
1041 size_t addr
= T0_POP();
1042 T0_PUSH(t0_datablock
[addr
]);
1056 int prf_id
= T0_POPi();
1057 size_t len
= T0_POP();
1058 do_ecdh(CTX
, prf_id
, ENG
->pad
, len
);
1063 /* do-ecdhe-part1 */
1065 int curve
= T0_POPi();
1066 T0_PUSHi(do_ecdhe_part1(CTX
, curve
));
1071 /* do-ecdhe-part2 */
1073 int prf_id
= T0_POPi();
1074 size_t len
= T0_POP();
1075 do_ecdhe_part2(CTX
, prf_id
, ENG
->pad
, len
);
1080 /* do-rsa-decrypt */
1082 int prf_id
= T0_POPi();
1083 size_t len
= T0_POP();
1084 do_rsa_decrypt(CTX
, prf_id
, ENG
->pad
, len
);
1095 T0_PUSH(T0_PEEK(0));
1101 br_ssl_engine_fail(ENG
, (int)T0_POPi());
1109 br_ssl_engine_flush_record(ENG
);
1116 size_t addr
= (size_t)T0_POP();
1117 T0_PUSH(*(uint16_t *)((unsigned char *)ENG
+ addr
));
1124 size_t addr
= (size_t)T0_POP();
1125 T0_PUSH(*(uint32_t *)((unsigned char *)ENG
+ addr
));
1132 size_t addr
= (size_t)T0_POP();
1133 T0_PUSH(*((unsigned char *)ENG
+ addr
));
1140 T0_PUSHi(-(ENG
->hlen_in
!= 0));
1147 size_t len
= (size_t)T0_POP();
1148 void *addr2
= (unsigned char *)ENG
+ (size_t)T0_POP();
1149 void *addr1
= (unsigned char *)ENG
+ (size_t)T0_POP();
1150 int x
= memcmp(addr1
, addr2
, len
);
1151 T0_PUSH((uint32_t)-(x
== 0));
1158 size_t len
= (size_t)T0_POP();
1159 void *src
= (unsigned char *)ENG
+ (size_t)T0_POP();
1160 void *dst
= (unsigned char *)ENG
+ (size_t)T0_POP();
1161 memcpy(dst
, src
, len
);
1168 size_t len
= (size_t)T0_POP();
1169 void *addr
= (unsigned char *)ENG
+ (size_t)T0_POP();
1170 br_hmac_drbg_generate(&ENG
->rng
, addr
, len
);
1175 /* more-incoming-bytes? */
1177 T0_PUSHi(ENG
->hlen_in
!= 0 || !br_ssl_engine_recvrec_finished(ENG
));
1182 /* multihash-init */
1184 br_multihash_init(&ENG
->mhash
);
1191 uint32_t a
= T0_POP();
1199 uint32_t a
= T0_POP();
1207 uint32_t b
= T0_POP();
1208 uint32_t a
= T0_POP();
1215 T0_PUSH(T0_PEEK(1));
1219 /* read-chunk-native */
1221 size_t clen
= ENG
->hlen_in
;
1227 if ((size_t)len
< clen
) {
1230 memcpy((unsigned char *)ENG
+ addr
, ENG
->hbuf_in
, clen
);
1231 if (ENG
->record_type_in
== BR_SSL_HANDSHAKE
) {
1232 br_multihash_update(&ENG
->mhash
, ENG
->hbuf_in
, clen
);
1234 T0_PUSH(addr
+ (uint32_t)clen
);
1235 T0_PUSH(len
- (uint32_t)clen
);
1236 ENG
->hbuf_in
+= clen
;
1237 ENG
->hlen_in
-= clen
;
1245 if (ENG
->hlen_in
> 0) {
1248 x
= *ENG
->hbuf_in
++;
1249 if (ENG
->record_type_in
== BR_SSL_HANDSHAKE
) {
1250 br_multihash_update(&ENG
->mhash
, &x
, 1);
1263 if (CTX
->cache_vtable
!= NULL
) {
1264 (*CTX
->cache_vtable
)->save(
1265 CTX
->cache_vtable
, CTX
, &ENG
->session
);
1271 /* set-max-frag-len */
1273 size_t max_frag_len
= T0_POP();
1275 br_ssl_engine_new_max_frag_len(ENG
, max_frag_len
);
1278 * We must adjust our own output limit. Since we call this only
1279 * after receiving a ClientHello and before beginning to send
1280 * the ServerHello, the next output record should be empty at
1281 * that point, so we can use max_frag_len as a limit.
1283 if (ENG
->hlen_out
> max_frag_len
) {
1284 ENG
->hlen_out
= max_frag_len
;
1292 size_t addr
= (size_t)T0_POP();
1293 *(uint16_t *)((unsigned char *)ENG
+ addr
) = (uint16_t)T0_POP();
1300 size_t addr
= (size_t)T0_POP();
1301 *(uint32_t *)((unsigned char *)ENG
+ addr
) = (uint32_t)T0_POP();
1308 size_t addr
= (size_t)T0_POP();
1309 *((unsigned char *)ENG
+ addr
) = (unsigned char)T0_POP();
1314 /* supported-curves */
1316 uint32_t x
= ENG
->iec
== NULL
? 0 : ENG
->iec
->supported_curves
;
1322 /* supported-hash-functions */
1329 for (i
= br_sha1_ID
; i
<= br_sha512_ID
; i
++) {
1330 if (br_multihash_getimpl(&ENG
->mhash
, i
)) {
1346 /* switch-aesgcm-in */
1348 int is_client
, prf_id
;
1349 unsigned cipher_key_len
;
1351 cipher_key_len
= T0_POP();
1353 is_client
= T0_POP();
1354 br_ssl_engine_switch_gcm_in(ENG
, is_client
, prf_id
,
1355 ENG
->iaes_ctr
, cipher_key_len
);
1360 /* switch-aesgcm-out */
1362 int is_client
, prf_id
;
1363 unsigned cipher_key_len
;
1365 cipher_key_len
= T0_POP();
1367 is_client
= T0_POP();
1368 br_ssl_engine_switch_gcm_out(ENG
, is_client
, prf_id
,
1369 ENG
->iaes_ctr
, cipher_key_len
);
1376 int is_client
, prf_id
, mac_id
, aes
;
1377 unsigned cipher_key_len
;
1379 cipher_key_len
= T0_POP();
1383 is_client
= T0_POP();
1384 br_ssl_engine_switch_cbc_in(ENG
, is_client
, prf_id
, mac_id
,
1385 aes
? ENG
->iaes_cbcdec
: ENG
->ides_cbcdec
, cipher_key_len
);
1390 /* switch-cbc-out */
1392 int is_client
, prf_id
, mac_id
, aes
;
1393 unsigned cipher_key_len
;
1395 cipher_key_len
= T0_POP();
1399 is_client
= T0_POP();
1400 br_ssl_engine_switch_cbc_out(ENG
, is_client
, prf_id
, mac_id
,
1401 aes
? ENG
->iaes_cbcenc
: ENG
->ides_cbcenc
, cipher_key_len
);
1406 /* total-chain-length */
1412 for (u
= 0; u
< CTX
->chain_len
; u
++) {
1413 total
+= 3 + (uint32_t)CTX
->chain
[u
].data_len
;
1422 int c
= (int)T0_POPi();
1423 uint32_t x
= T0_POP();
1429 /* write-blob-chunk */
1431 size_t clen
= ENG
->hlen_out
;
1437 if ((size_t)len
< clen
) {
1440 memcpy(ENG
->hbuf_out
, (unsigned char *)ENG
+ addr
, clen
);
1441 if (ENG
->record_type_out
== BR_SSL_HANDSHAKE
) {
1442 br_multihash_update(&ENG
->mhash
, ENG
->hbuf_out
, clen
);
1444 T0_PUSH(addr
+ (uint32_t)clen
);
1445 T0_PUSH(len
- (uint32_t)clen
);
1446 ENG
->hbuf_out
+= clen
;
1447 ENG
->hlen_out
-= clen
;
1457 x
= (unsigned char)T0_POP();
1458 if (ENG
->hlen_out
> 0) {
1459 if (ENG
->record_type_out
== BR_SSL_HANDSHAKE
) {
1460 br_multihash_update(&ENG
->mhash
, &x
, 1);
1462 *ENG
->hbuf_out
++ = x
;
1474 T0_ENTER(ip
, rp
, t0x
);
1478 ((t0_context
*)t0ctx
)->dp
= dp
;
1479 ((t0_context
*)t0ctx
)->rp
= rp
;
1480 ((t0_context
*)t0ctx
)->ip
= ip
;