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_client_init_main(void *t0ctx
);
66 void br_ssl_hs_client_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 client context, under that
86 * specific name. It must be noted that since the engine context is the
87 * first field of the br_ssl_client_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_client_context *)ENG)
95 * Generate the pre-master secret for RSA key exchange, and encrypt it
96 * with the server's public key. Returned value is either the encrypted
97 * data length (in bytes), or -x on error, with 'x' being an error code.
99 * This code assumes that the public key has been already verified (it
100 * was properly obtained by the X.509 engine, and it has the right type,
101 * i.e. it is of type RSA and suitable for encryption).
104 make_pms_rsa(br_ssl_client_context
*ctx
, int prf_id
)
106 const br_x509_class
**xc
;
107 const br_x509_pkey
*pk
;
108 const unsigned char *n
;
112 xc
= ctx
->eng
.x509ctx
;
113 pk
= (*xc
)->get_pkey(xc
);
116 * Compute actual RSA key length, in case there are leading zeros.
119 nlen
= pk
->key
.rsa
.nlen
;
120 while (nlen
> 0 && *n
== 0) {
126 * We need at least 59 bytes (48 bytes for pre-master secret, and
127 * 11 bytes for the PKCS#1 type 2 padding). Note that the X.509
128 * minimal engine normally blocks RSA keys shorter than 128 bytes,
129 * so this is mostly for public keys provided explicitly by the
133 return -BR_ERR_X509_WEAK_PUBLIC_KEY
;
135 if (nlen
> sizeof ctx
->eng
.pad
) {
136 return -BR_ERR_LIMIT_EXCEEDED
;
142 pms
= ctx
->eng
.pad
+ nlen
- 48;
143 br_enc16be(pms
, ctx
->eng
.version_max
);
144 br_hmac_drbg_generate(&ctx
->eng
.rng
, pms
+ 2, 46);
145 br_ssl_engine_compute_master(&ctx
->eng
, prf_id
, pms
, 48);
148 * Apply PKCS#1 type 2 padding.
150 ctx
->eng
.pad
[0] = 0x00;
151 ctx
->eng
.pad
[1] = 0x02;
152 ctx
->eng
.pad
[nlen
- 49] = 0x00;
153 br_hmac_drbg_generate(&ctx
->eng
.rng
, ctx
->eng
.pad
+ 2, nlen
- 51);
154 for (u
= 2; u
< nlen
- 49; u
++) {
155 while (ctx
->eng
.pad
[u
] == 0) {
156 br_hmac_drbg_generate(&ctx
->eng
.rng
,
157 &ctx
->eng
.pad
[u
], 1);
162 * Compute RSA encryption.
164 if (!ctx
->irsapub(ctx
->eng
.pad
, nlen
, &pk
->key
.rsa
)) {
165 return -BR_ERR_LIMIT_EXCEEDED
;
171 * OID for hash functions in RSA signatures.
173 static const unsigned char HASH_OID_SHA1
[] = {
174 0x05, 0x2B, 0x0E, 0x03, 0x02, 0x1A
177 static const unsigned char HASH_OID_SHA224
[] = {
178 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x04
181 static const unsigned char HASH_OID_SHA256
[] = {
182 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01
185 static const unsigned char HASH_OID_SHA384
[] = {
186 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x02
189 static const unsigned char HASH_OID_SHA512
[] = {
190 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03
193 static const unsigned char *HASH_OID
[] = {
202 * Check the RSA signature on the ServerKeyExchange message.
203 * hash hash function ID (2 to 6), or 0 for MD5+SHA-1 (with RSA only)
204 * use_rsa non-zero for RSA signature, zero for ECDSA
205 * sig_len signature length (in bytes); signature value is in the pad
206 * Returned value is 0 on success, or an error code.
209 verify_SKE_sig(br_ssl_client_context
*ctx
,
210 int hash
, int use_rsa
, size_t sig_len
)
212 const br_x509_class
**xc
;
213 const br_x509_pkey
*pk
;
214 br_multihash_context mhc
;
215 unsigned char hv
[64], head
[4];
218 xc
= ctx
->eng
.x509ctx
;
219 pk
= (*xc
)->get_pkey(xc
);
220 br_multihash_zero(&mhc
);
221 br_multihash_copyimpl(&mhc
, &ctx
->eng
.mhash
);
222 br_multihash_init(&mhc
);
223 br_multihash_update(&mhc
,
224 ctx
->eng
.client_random
, sizeof ctx
->eng
.client_random
);
225 br_multihash_update(&mhc
,
226 ctx
->eng
.server_random
, sizeof ctx
->eng
.server_random
);
229 head
[2] = ctx
->eng
.ecdhe_curve
;
230 head
[3] = ctx
->eng
.ecdhe_point_len
;
231 br_multihash_update(&mhc
, head
, sizeof head
);
232 br_multihash_update(&mhc
,
233 ctx
->eng
.ecdhe_point
, ctx
->eng
.ecdhe_point_len
);
235 hv_len
= br_multihash_out(&mhc
, hash
, hv
);
237 return BR_ERR_INVALID_ALGORITHM
;
240 if (!br_multihash_out(&mhc
, br_md5_ID
, hv
)
241 || !br_multihash_out(&mhc
, br_sha1_ID
, hv
+ 16))
243 return BR_ERR_INVALID_ALGORITHM
;
248 unsigned char tmp
[64];
249 const unsigned char *hash_oid
;
252 hash_oid
= HASH_OID
[hash
- 2];
256 if (!ctx
->irsavrfy(ctx
->eng
.pad
, sig_len
,
257 hash_oid
, hv_len
, &pk
->key
.rsa
, tmp
)
258 || memcmp(tmp
, hv
, hv_len
) != 0)
260 return BR_ERR_BAD_SIGNATURE
;
263 if (!ctx
->iecdsa(ctx
->eng
.iec
, hv
, hv_len
, &pk
->key
.ec
,
264 ctx
->eng
.pad
, sig_len
))
266 return BR_ERR_BAD_SIGNATURE
;
273 * Perform client-size ECDH (or ECDHE). The point that should be sent to
274 * the server is written in the pad; returned value is either the point
275 * length (in bytes), or -x on error, with 'x' being an error code.
277 * The point _from_ the server is taken from ecdhe_point[] if 'ecdhe'
278 * is non-zero, or from the X.509 engine context if 'ecdhe' is zero
282 make_pms_ecdh(br_ssl_client_context
*ctx
, unsigned ecdhe
, int prf_id
)
285 unsigned char key
[66], point
[133];
286 const unsigned char *generator
, *order
, *point_src
;
287 size_t glen
, olen
, point_len
;
291 curve
= ctx
->eng
.ecdhe_curve
;
292 point_src
= ctx
->eng
.ecdhe_point
;
293 point_len
= ctx
->eng
.ecdhe_point_len
;
295 const br_x509_class
**xc
;
296 const br_x509_pkey
*pk
;
298 xc
= ctx
->eng
.x509ctx
;
299 pk
= (*xc
)->get_pkey(xc
);
300 curve
= pk
->key
.ec
.curve
;
301 point_src
= pk
->key
.ec
.q
;
302 point_len
= pk
->key
.ec
.qlen
;
304 if ((ctx
->eng
.iec
->supported_curves
& ((uint32_t)1 << curve
)) == 0) {
305 return -BR_ERR_INVALID_ALGORITHM
;
309 * We need to generate our key, as a non-zero random value which
310 * is lower than the curve order, in a "large enough" range. We
311 * force top bit to 0 and bottom bit to 1, which guarantees that
312 * the value is in the proper range.
314 order
= ctx
->eng
.iec
->order(curve
, &olen
);
316 while (mask
>= order
[0]) {
319 br_hmac_drbg_generate(&ctx
->eng
.rng
, key
, olen
);
321 key
[olen
- 1] |= 0x01;
324 * Compute the common ECDH point, whose X coordinate is the
327 generator
= ctx
->eng
.iec
->generator(curve
, &glen
);
328 if (glen
!= point_len
) {
329 return -BR_ERR_INVALID_ALGORITHM
;
332 memcpy(point
, point_src
, glen
);
333 if (!ctx
->eng
.iec
->mul(point
, glen
, key
, olen
, curve
)) {
334 return -BR_ERR_INVALID_ALGORITHM
;
338 * The pre-master secret is the X coordinate.
340 br_ssl_engine_compute_master(&ctx
->eng
, prf_id
, point
+ 1, glen
>> 1);
342 memcpy(point
, generator
, glen
);
343 if (!ctx
->eng
.iec
->mul(point
, glen
, key
, olen
, curve
)) {
344 return -BR_ERR_INVALID_ALGORITHM
;
346 memcpy(ctx
->eng
.pad
, point
, glen
);
352 static const uint8_t t0_datablock
[] = {
353 0x00, 0x00, 0x0A, 0x00, 0x24, 0x00, 0x2F, 0x01, 0x24, 0x00, 0x35, 0x02,
354 0x24, 0x00, 0x3C, 0x01, 0x44, 0x00, 0x3D, 0x02, 0x44, 0x00, 0x9C, 0x03,
355 0x04, 0x00, 0x9D, 0x04, 0x05, 0xC0, 0x03, 0x40, 0x24, 0xC0, 0x04, 0x41,
356 0x24, 0xC0, 0x05, 0x42, 0x24, 0xC0, 0x08, 0x20, 0x24, 0xC0, 0x09, 0x21,
357 0x24, 0xC0, 0x0A, 0x22, 0x24, 0xC0, 0x0D, 0x30, 0x24, 0xC0, 0x0E, 0x31,
358 0x24, 0xC0, 0x0F, 0x32, 0x24, 0xC0, 0x12, 0x10, 0x24, 0xC0, 0x13, 0x11,
359 0x24, 0xC0, 0x14, 0x12, 0x24, 0xC0, 0x23, 0x21, 0x44, 0xC0, 0x24, 0x22,
360 0x55, 0xC0, 0x25, 0x41, 0x44, 0xC0, 0x26, 0x42, 0x55, 0xC0, 0x27, 0x11,
361 0x44, 0xC0, 0x28, 0x12, 0x55, 0xC0, 0x29, 0x31, 0x44, 0xC0, 0x2A, 0x32,
362 0x55, 0xC0, 0x2B, 0x23, 0x04, 0xC0, 0x2C, 0x24, 0x05, 0xC0, 0x2D, 0x43,
363 0x04, 0xC0, 0x2E, 0x44, 0x05, 0xC0, 0x2F, 0x13, 0x04, 0xC0, 0x30, 0x14,
364 0x05, 0xC0, 0x31, 0x33, 0x04, 0xC0, 0x32, 0x34, 0x05, 0xCC, 0xA8, 0x15,
365 0x04, 0xCC, 0xA9, 0x25, 0x04, 0x00, 0x00
368 static const uint8_t t0_codeblock
[] = {
369 0x00, 0x01, 0x00, 0x0A, 0x00, 0x00, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x01,
370 0x00, 0x0D, 0x00, 0x00, 0x01, 0x00, 0x0E, 0x00, 0x00, 0x01, 0x01, 0x08,
371 0x00, 0x00, 0x01, 0x01, 0x09, 0x00, 0x00, 0x01, 0x02, 0x08, 0x00, 0x00,
372 0x01, 0x02, 0x09, 0x00, 0x00, 0x1A, 0x1A, 0x00, 0x00, 0x01,
373 T0_INT1(BR_ERR_BAD_CCS
), 0x00, 0x00, 0x01,
374 T0_INT1(BR_ERR_BAD_CIPHER_SUITE
), 0x00, 0x00, 0x01,
375 T0_INT1(BR_ERR_BAD_COMPRESSION
), 0x00, 0x00, 0x01,
376 T0_INT1(BR_ERR_BAD_FINISHED
), 0x00, 0x00, 0x01,
377 T0_INT1(BR_ERR_BAD_FRAGLEN
), 0x00, 0x00, 0x01,
378 T0_INT1(BR_ERR_BAD_HANDSHAKE
), 0x00, 0x00, 0x01,
379 T0_INT1(BR_ERR_BAD_HELLO_DONE
), 0x00, 0x00, 0x01,
380 T0_INT1(BR_ERR_BAD_PARAM
), 0x00, 0x00, 0x01,
381 T0_INT1(BR_ERR_BAD_SECRENEG
), 0x00, 0x00, 0x01,
382 T0_INT1(BR_ERR_BAD_SNI
), 0x00, 0x00, 0x01, T0_INT1(BR_ERR_BAD_VERSION
),
383 0x00, 0x00, 0x01, T0_INT1(BR_ERR_EXTRA_EXTENSION
), 0x00, 0x00, 0x01,
384 T0_INT1(BR_ERR_INVALID_ALGORITHM
), 0x00, 0x00, 0x01,
385 T0_INT1(BR_ERR_LIMIT_EXCEEDED
), 0x00, 0x00, 0x01, T0_INT1(BR_ERR_OK
),
386 0x00, 0x00, 0x01, T0_INT1(BR_ERR_OVERSIZED_ID
), 0x00, 0x00, 0x01,
387 T0_INT1(BR_ERR_RESUME_MISMATCH
), 0x00, 0x00, 0x01,
388 T0_INT1(BR_ERR_UNEXPECTED
), 0x00, 0x00, 0x01,
389 T0_INT1(BR_ERR_UNSUPPORTED_VERSION
), 0x00, 0x00, 0x01,
390 T0_INT2(offsetof(br_ssl_engine_context
, action
)), 0x00, 0x00, 0x01,
391 T0_INT2(offsetof(br_ssl_engine_context
, alert
)), 0x00, 0x00, 0x01,
392 T0_INT2(offsetof(br_ssl_engine_context
, application_data
)), 0x00, 0x00,
394 T0_INT2(offsetof(br_ssl_engine_context
, session
) + offsetof(br_ssl_session_parameters
, cipher_suite
)),
396 T0_INT2(offsetof(br_ssl_engine_context
, client_random
)), 0x00, 0x00,
397 0x01, T0_INT2(offsetof(br_ssl_engine_context
, close_received
)), 0x00,
398 0x00, 0x01, T0_INT2(offsetof(br_ssl_engine_context
, ecdhe_curve
)),
400 T0_INT2(offsetof(br_ssl_engine_context
, ecdhe_point
)), 0x00, 0x00,
401 0x01, T0_INT2(offsetof(br_ssl_engine_context
, ecdhe_point_len
)), 0x00,
402 0x00, 0x01, T0_INT2(offsetof(br_ssl_engine_context
, flags
)), 0x00,
403 0x00, 0x01, T0_INT2(offsetof(br_ssl_engine_context
, log_max_frag_len
)),
405 T0_INT2(offsetof(br_ssl_client_context
, min_clienthello_len
)), 0x00,
406 0x00, 0x01, T0_INT2(offsetof(br_ssl_engine_context
, pad
)), 0x00, 0x00,
407 0x01, T0_INT2(offsetof(br_ssl_engine_context
, record_type_in
)), 0x00,
408 0x00, 0x01, T0_INT2(offsetof(br_ssl_engine_context
, record_type_out
)),
409 0x00, 0x00, 0x01, T0_INT2(offsetof(br_ssl_engine_context
, reneg
)),
411 T0_INT2(offsetof(br_ssl_engine_context
, saved_finished
)), 0x00, 0x00,
412 0x01, T0_INT2(offsetof(br_ssl_engine_context
, server_name
)), 0x00,
413 0x00, 0x01, T0_INT2(offsetof(br_ssl_engine_context
, server_random
)),
415 T0_INT2(offsetof(br_ssl_engine_context
, session
) + offsetof(br_ssl_session_parameters
, session_id
)),
417 T0_INT2(offsetof(br_ssl_engine_context
, session
) + offsetof(br_ssl_session_parameters
, session_id_len
)),
419 T0_INT2(offsetof(br_ssl_engine_context
, shutdown_recv
)), 0x00, 0x00,
420 0x01, T0_INT2(offsetof(br_ssl_engine_context
, suites_buf
)), 0x00, 0x00,
421 0x01, T0_INT2(offsetof(br_ssl_engine_context
, suites_num
)), 0x00, 0x00,
423 T0_INT2(offsetof(br_ssl_engine_context
, session
) + offsetof(br_ssl_session_parameters
, version
)),
424 0x00, 0x00, 0x01, T0_INT2(offsetof(br_ssl_engine_context
, version_in
)),
426 T0_INT2(offsetof(br_ssl_engine_context
, version_max
)), 0x00, 0x00,
427 0x01, T0_INT2(offsetof(br_ssl_engine_context
, version_min
)), 0x00,
428 0x00, 0x01, T0_INT2(offsetof(br_ssl_engine_context
, version_out
)),
429 0x00, 0x00, 0x09, 0x1B, 0x42, 0x06, 0x02, 0x52, 0x1C, 0x00, 0x00, 0x06,
430 0x08, 0x1E, 0x0D, 0x05, 0x02, 0x5B, 0x1C, 0x04, 0x01, 0x2D, 0x00, 0x00,
431 0x01, 0x01, 0x00, 0x01, 0x03, 0x00, 0x7D, 0x1B, 0x48, 0x34, 0x81, 0x01,
432 0x1B, 0x05, 0x04, 0x4A, 0x01, 0x00, 0x00, 0x02, 0x00, 0x0D, 0x06, 0x03,
433 0x81, 0x01, 0x00, 0x48, 0x04, 0x69, 0x00, 0x06, 0x02, 0x52, 0x1C, 0x00,
434 0x00, 0x1B, 0x6E, 0x34, 0x05, 0x03, 0x01, 0x0C, 0x08, 0x34, 0x61, 0x1E,
435 0x81, 0x0F, 0x15, 0x6A, 0x01, 0x0C, 0x23, 0x00, 0x00, 0x1B, 0x16, 0x01,
436 0x08, 0x0B, 0x34, 0x46, 0x16, 0x08, 0x00, 0x01, 0x03, 0x00, 0x01, 0x00,
437 0x60, 0x2E, 0x1D, 0x13, 0x28, 0x06, 0x08, 0x02, 0x00, 0x81, 0x2E, 0x03,
438 0x00, 0x04, 0x74, 0x01, 0x00, 0x81, 0x26, 0x02, 0x00, 0x1B, 0x13, 0x11,
439 0x06, 0x02, 0x59, 0x1C, 0x81, 0x2E, 0x04, 0x75, 0x01, 0x01, 0x00, 0x60,
440 0x2E, 0x01, 0x16, 0x6C, 0x2E, 0x26, 0x81, 0x32, 0x1D, 0x81, 0x16, 0x06,
441 0x0B, 0x01, 0x7F, 0x81, 0x12, 0x01, 0x7F, 0x81, 0x31, 0x04, 0x80, 0x42,
442 0x81, 0x13, 0x61, 0x1E, 0x81, 0x05, 0x01, T0_INT1(BR_KEYTYPE_SIGN
),
443 0x11, 0x06, 0x02, 0x81, 0x17, 0x81, 0x1A, 0x1B, 0x01, 0x0D, 0x0D, 0x06,
444 0x09, 0x1A, 0x81, 0x19, 0x81, 0x1A, 0x01, 0x7F, 0x04, 0x02, 0x01, 0x00,
445 0x03, 0x00, 0x01, 0x0E, 0x0D, 0x05, 0x02, 0x5C, 0x1C, 0x06, 0x02, 0x51,
446 0x1C, 0x25, 0x06, 0x02, 0x5C, 0x1C, 0x02, 0x00, 0x06, 0x02, 0x81, 0x38,
447 0x81, 0x33, 0x01, 0x7F, 0x81, 0x31, 0x01, 0x7F, 0x81, 0x12, 0x01, 0x01,
448 0x60, 0x2E, 0x01, 0x17, 0x6C, 0x2E, 0x00, 0x00, 0x2A, 0x2A, 0x00, 0x00,
449 0x7E, 0x01, 0x0C, 0x10, 0x01, 0x00, 0x2A, 0x0D, 0x06, 0x05, 0x1A, 0x01,
450 T0_INT1(BR_KEYTYPE_RSA
| BR_KEYTYPE_KEYX
), 0x04, 0x30, 0x01, 0x01,
451 0x2A, 0x0D, 0x06, 0x05, 0x1A, 0x01,
452 T0_INT1(BR_KEYTYPE_RSA
| BR_KEYTYPE_SIGN
), 0x04, 0x25, 0x01, 0x02,
453 0x2A, 0x0D, 0x06, 0x05, 0x1A, 0x01,
454 T0_INT1(BR_KEYTYPE_EC
| BR_KEYTYPE_SIGN
), 0x04, 0x1A, 0x01, 0x03,
455 0x2A, 0x0D, 0x06, 0x05, 0x1A, 0x01,
456 T0_INT1(BR_KEYTYPE_EC
| BR_KEYTYPE_KEYX
), 0x04, 0x0F, 0x01, 0x04,
457 0x2A, 0x0D, 0x06, 0x05, 0x1A, 0x01,
458 T0_INT1(BR_KEYTYPE_EC
| BR_KEYTYPE_KEYX
), 0x04, 0x04, 0x01, 0x00,
459 0x34, 0x1A, 0x00, 0x00, 0x68, 0x20, 0x01, 0x0E, 0x0D, 0x06, 0x04, 0x01,
460 0x00, 0x04, 0x02, 0x01, 0x05, 0x00, 0x00, 0x30, 0x06, 0x04, 0x01, 0x06,
461 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x6D, 0x20, 0x1B, 0x06, 0x08, 0x01,
462 0x01, 0x09, 0x01, 0x11, 0x07, 0x04, 0x03, 0x1A, 0x01, 0x05, 0x00, 0x01,
463 0x31, 0x03, 0x00, 0x1A, 0x01, 0x00, 0x33, 0x06, 0x03, 0x02, 0x00, 0x08,
464 0x32, 0x06, 0x03, 0x02, 0x00, 0x08, 0x1B, 0x06, 0x06, 0x01, 0x01, 0x0B,
465 0x01, 0x06, 0x08, 0x00, 0x00, 0x6F, 0x2F, 0x1B, 0x06, 0x03, 0x01, 0x09,
466 0x08, 0x00, 0x01, 0x30, 0x1B, 0x06, 0x1E, 0x01, 0x00, 0x03, 0x00, 0x1B,
467 0x06, 0x0E, 0x1B, 0x01, 0x01, 0x11, 0x02, 0x00, 0x08, 0x03, 0x00, 0x01,
468 0x01, 0x10, 0x04, 0x6F, 0x1A, 0x02, 0x00, 0x01, 0x01, 0x0B, 0x01, 0x06,
469 0x08, 0x00, 0x00, 0x67, 0x1F, 0x34, 0x10, 0x01, 0x01, 0x11, 0x27, 0x00,
470 0x00, 0x81, 0x03, 0x81, 0x2D, 0x1B, 0x01, 0x07, 0x11, 0x01, 0x00, 0x2A,
471 0x0D, 0x06, 0x0A, 0x1A, 0x01, 0x10, 0x11, 0x06, 0x02, 0x81, 0x03, 0x04,
472 0x32, 0x01, 0x01, 0x2A, 0x0D, 0x06, 0x29, 0x1A, 0x1A, 0x01, 0x00, 0x60,
473 0x2E, 0x81, 0x15, 0x6D, 0x20, 0x01, 0x01, 0x0D, 0x01, 0x01, 0x81, 0x0C,
474 0x29, 0x06, 0x11, 0x1D, 0x13, 0x28, 0x06, 0x05, 0x81, 0x2D, 0x1A, 0x04,
475 0x77, 0x01, 0x80, 0x64, 0x81, 0x26, 0x04, 0x02, 0x81, 0x03, 0x04, 0x03,
476 0x5C, 0x1C, 0x1A, 0x04, 0xFF, 0x35, 0x01, 0x1B, 0x03, 0x00, 0x09, 0x1B,
477 0x42, 0x06, 0x02, 0x52, 0x1C, 0x02, 0x00, 0x00, 0x00, 0x7E, 0x01, 0x0F,
478 0x11, 0x00, 0x00, 0x5F, 0x20, 0x01, 0x00, 0x2A, 0x0D, 0x06, 0x10, 0x1A,
479 0x1B, 0x01, 0x01, 0x0C, 0x06, 0x03, 0x1A, 0x01, 0x02, 0x5F, 0x2E, 0x01,
480 0x00, 0x04, 0x22, 0x01, 0x01, 0x2A, 0x0D, 0x06, 0x15, 0x1A, 0x01, 0x00,
481 0x5F, 0x2E, 0x1B, 0x01, 0x80, 0x64, 0x0D, 0x06, 0x05, 0x01, 0x82, 0x00,
482 0x08, 0x1C, 0x44, 0x00, 0x04, 0x07, 0x1A, 0x01, 0x82, 0x00, 0x08, 0x1C,
483 0x1A, 0x00, 0x00, 0x01, 0x00, 0x21, 0x06, 0x06, 0x2C, 0x81, 0x10, 0x29,
484 0x04, 0x77, 0x1B, 0x06, 0x04, 0x01, 0x01, 0x73, 0x2E, 0x00, 0x00, 0x21,
485 0x06, 0x0B, 0x6B, 0x20, 0x01, 0x14, 0x0C, 0x06, 0x02, 0x5C, 0x1C, 0x04,
486 0x12, 0x81, 0x2D, 0x01, 0x07, 0x11, 0x1B, 0x01, 0x02, 0x0C, 0x06, 0x06,
487 0x06, 0x02, 0x5C, 0x1C, 0x04, 0x6F, 0x1A, 0x81, 0x23, 0x01, 0x01, 0x0C,
488 0x25, 0x29, 0x06, 0x02, 0x4B, 0x1C, 0x1B, 0x01, 0x01, 0x81, 0x29, 0x28,
489 0x81, 0x14, 0x00, 0x01, 0x81, 0x1A, 0x01, 0x0B, 0x0D, 0x05, 0x02, 0x5C,
490 0x1C, 0x61, 0x1E, 0x81, 0x05, 0x41, 0x81, 0x21, 0x81, 0x0E, 0x1B, 0x06,
491 0x26, 0x81, 0x21, 0x81, 0x0E, 0x1B, 0x40, 0x1B, 0x06, 0x19, 0x1B, 0x01,
492 0x82, 0x00, 0x0E, 0x06, 0x05, 0x01, 0x82, 0x00, 0x04, 0x01, 0x1B, 0x03,
493 0x00, 0x6A, 0x02, 0x00, 0x81, 0x18, 0x02, 0x00, 0x3D, 0x04, 0x64, 0x7F,
494 0x3E, 0x04, 0x57, 0x7F, 0x7F, 0x3F, 0x1B, 0x06, 0x01, 0x1C, 0x1A, 0x00,
495 0x00, 0x81, 0x00, 0x81, 0x1A, 0x01, 0x14, 0x0C, 0x06, 0x02, 0x5C, 0x1C,
496 0x6A, 0x01, 0x0C, 0x08, 0x01, 0x0C, 0x81, 0x18, 0x7F, 0x6A, 0x1B, 0x01,
497 0x0C, 0x08, 0x01, 0x0C, 0x22, 0x05, 0x02, 0x4E, 0x1C, 0x00, 0x00, 0x81,
498 0x1B, 0x06, 0x02, 0x5C, 0x1C, 0x06, 0x02, 0x50, 0x1C, 0x00, 0x09, 0x81,
499 0x1A, 0x01, 0x02, 0x0D, 0x05, 0x02, 0x5C, 0x1C, 0x81, 0x20, 0x03, 0x00,
500 0x02, 0x00, 0x79, 0x1E, 0x0A, 0x02, 0x00, 0x78, 0x1E, 0x0E, 0x29, 0x06,
501 0x02, 0x5D, 0x1C, 0x02, 0x00, 0x77, 0x1E, 0x0C, 0x06, 0x02, 0x55, 0x1C,
502 0x02, 0x00, 0x7A, 0x2D, 0x70, 0x01, 0x20, 0x81, 0x18, 0x01, 0x00, 0x03,
503 0x01, 0x81, 0x22, 0x03, 0x02, 0x02, 0x02, 0x01, 0x20, 0x0E, 0x06, 0x02,
504 0x5A, 0x1C, 0x6A, 0x02, 0x02, 0x81, 0x18, 0x02, 0x02, 0x72, 0x20, 0x0D,
505 0x02, 0x02, 0x01, 0x00, 0x0E, 0x11, 0x06, 0x0B, 0x71, 0x6A, 0x02, 0x02,
506 0x22, 0x06, 0x04, 0x01, 0x7F, 0x03, 0x01, 0x71, 0x6A, 0x02, 0x02, 0x23,
507 0x02, 0x02, 0x72, 0x2E, 0x02, 0x00, 0x76, 0x02, 0x01, 0x7C, 0x81, 0x20,
508 0x1B, 0x81, 0x24, 0x42, 0x06, 0x02, 0x4C, 0x1C, 0x61, 0x02, 0x01, 0x7C,
509 0x81, 0x22, 0x06, 0x02, 0x4D, 0x1C, 0x1B, 0x06, 0x81, 0x3D, 0x81, 0x20,
510 0x81, 0x0E, 0x81, 0x0A, 0x03, 0x03, 0x81, 0x08, 0x03, 0x04, 0x81, 0x06,
511 0x03, 0x05, 0x81, 0x09, 0x03, 0x06, 0x81, 0x0B, 0x03, 0x07, 0x81, 0x07,
512 0x03, 0x08, 0x1B, 0x06, 0x81, 0x0B, 0x81, 0x20, 0x01, 0x00, 0x2A, 0x0D,
513 0x06, 0x10, 0x1A, 0x02, 0x03, 0x05, 0x02, 0x56, 0x1C, 0x01, 0x00, 0x03,
514 0x03, 0x81, 0x1F, 0x04, 0x80, 0x70, 0x01, 0x01, 0x2A, 0x0D, 0x06, 0x10,
515 0x1A, 0x02, 0x05, 0x05, 0x02, 0x56, 0x1C, 0x01, 0x00, 0x03, 0x05, 0x81,
516 0x1D, 0x04, 0x80, 0x5A, 0x01, 0x83, 0xFE, 0x01, 0x2A, 0x0D, 0x06, 0x10,
517 0x1A, 0x02, 0x04, 0x05, 0x02, 0x56, 0x1C, 0x01, 0x00, 0x03, 0x04, 0x81,
518 0x1E, 0x04, 0x80, 0x42, 0x01, 0x0D, 0x2A, 0x0D, 0x06, 0x0F, 0x1A, 0x02,
519 0x06, 0x05, 0x02, 0x56, 0x1C, 0x01, 0x00, 0x03, 0x06, 0x81, 0x1C, 0x04,
520 0x2D, 0x01, 0x0A, 0x2A, 0x0D, 0x06, 0x0F, 0x1A, 0x02, 0x07, 0x05, 0x02,
521 0x56, 0x1C, 0x01, 0x00, 0x03, 0x07, 0x81, 0x1C, 0x04, 0x18, 0x01, 0x0B,
522 0x2A, 0x0D, 0x06, 0x0F, 0x1A, 0x02, 0x08, 0x05, 0x02, 0x56, 0x1C, 0x01,
523 0x00, 0x03, 0x08, 0x81, 0x1C, 0x04, 0x03, 0x56, 0x1C, 0x1A, 0x04, 0xFE,
524 0x71, 0x02, 0x04, 0x06, 0x0D, 0x02, 0x04, 0x01, 0x05, 0x0E, 0x06, 0x02,
525 0x53, 0x1C, 0x01, 0x01, 0x6D, 0x2E, 0x7F, 0x7F, 0x02, 0x01, 0x00, 0x04,
526 0x81, 0x1A, 0x01, 0x0C, 0x0D, 0x05, 0x02, 0x5C, 0x1C, 0x81, 0x22, 0x01,
527 0x03, 0x0D, 0x05, 0x02, 0x57, 0x1C, 0x81, 0x20, 0x1B, 0x64, 0x2E, 0x1B,
528 0x01, 0x20, 0x0F, 0x06, 0x02, 0x57, 0x1C, 0x30, 0x34, 0x10, 0x01, 0x01,
529 0x11, 0x05, 0x02, 0x57, 0x1C, 0x81, 0x22, 0x1B, 0x01, 0x81, 0x05, 0x0E,
530 0x06, 0x02, 0x57, 0x1C, 0x1B, 0x66, 0x2E, 0x65, 0x34, 0x81, 0x18, 0x76,
531 0x1E, 0x01, 0x86, 0x03, 0x0F, 0x03, 0x00, 0x61, 0x1E, 0x81, 0x2B, 0x03,
532 0x01, 0x01, 0x02, 0x03, 0x02, 0x02, 0x00, 0x06, 0x23, 0x81, 0x22, 0x1B,
533 0x1B, 0x01, 0x02, 0x0A, 0x34, 0x01, 0x06, 0x0E, 0x29, 0x06, 0x02, 0x57,
534 0x1C, 0x03, 0x02, 0x81, 0x22, 0x02, 0x01, 0x01, 0x01, 0x0B, 0x01, 0x03,
535 0x08, 0x0D, 0x05, 0x02, 0x57, 0x1C, 0x04, 0x08, 0x02, 0x01, 0x06, 0x04,
536 0x01, 0x00, 0x03, 0x02, 0x81, 0x20, 0x1B, 0x03, 0x03, 0x1B, 0x01, 0x84,
537 0x00, 0x0E, 0x06, 0x02, 0x58, 0x1C, 0x6A, 0x34, 0x81, 0x18, 0x02, 0x02,
538 0x02, 0x01, 0x02, 0x03, 0x3A, 0x1B, 0x06, 0x01, 0x1C, 0x1A, 0x7F, 0x00,
539 0x02, 0x03, 0x00, 0x03, 0x01, 0x02, 0x00, 0x7B, 0x02, 0x01, 0x02, 0x00,
540 0x2B, 0x1B, 0x01, 0x00, 0x0D, 0x06, 0x02, 0x4A, 0x00, 0x81, 0x2F, 0x04,
541 0x73, 0x00, 0x1B, 0x06, 0x05, 0x81, 0x22, 0x1A, 0x04, 0x78, 0x1A, 0x00,
542 0x00, 0x81, 0x1B, 0x1B, 0x44, 0x06, 0x07, 0x1A, 0x06, 0x02, 0x50, 0x1C,
543 0x04, 0x73, 0x00, 0x00, 0x81, 0x23, 0x01, 0x03, 0x81, 0x21, 0x34, 0x1A,
544 0x34, 0x00, 0x00, 0x81, 0x20, 0x81, 0x27, 0x00, 0x00, 0x81, 0x20, 0x01,
545 0x01, 0x0D, 0x05, 0x02, 0x4F, 0x1C, 0x81, 0x22, 0x01, 0x08, 0x08, 0x68,
546 0x20, 0x0D, 0x05, 0x02, 0x4F, 0x1C, 0x00, 0x00, 0x81, 0x20, 0x6D, 0x20,
547 0x05, 0x16, 0x01, 0x01, 0x0D, 0x05, 0x02, 0x53, 0x1C, 0x81, 0x22, 0x01,
548 0x00, 0x0D, 0x05, 0x02, 0x53, 0x1C, 0x01, 0x02, 0x6D, 0x2E, 0x04, 0x1E,
549 0x01, 0x19, 0x0D, 0x05, 0x02, 0x53, 0x1C, 0x81, 0x22, 0x01, 0x18, 0x0D,
550 0x05, 0x02, 0x53, 0x1C, 0x6A, 0x01, 0x18, 0x81, 0x18, 0x6E, 0x6A, 0x01,
551 0x18, 0x22, 0x05, 0x02, 0x53, 0x1C, 0x00, 0x00, 0x81, 0x20, 0x06, 0x02,
552 0x54, 0x1C, 0x00, 0x00, 0x01, 0x02, 0x7B, 0x81, 0x23, 0x01, 0x08, 0x0B,
553 0x81, 0x23, 0x08, 0x00, 0x00, 0x01, 0x03, 0x7B, 0x81, 0x23, 0x01, 0x08,
554 0x0B, 0x81, 0x23, 0x08, 0x01, 0x08, 0x0B, 0x81, 0x23, 0x08, 0x00, 0x00,
555 0x01, 0x01, 0x7B, 0x81, 0x23, 0x00, 0x00, 0x2C, 0x1B, 0x42, 0x05, 0x01,
556 0x00, 0x1A, 0x81, 0x2F, 0x04, 0x75, 0x02, 0x03, 0x00, 0x75, 0x20, 0x03,
557 0x01, 0x01, 0x00, 0x1B, 0x02, 0x01, 0x0A, 0x06, 0x10, 0x1B, 0x01, 0x01,
558 0x0B, 0x74, 0x08, 0x1E, 0x02, 0x00, 0x0D, 0x06, 0x01, 0x00, 0x46, 0x04,
559 0x6A, 0x1A, 0x01, 0x7F, 0x00, 0x00, 0x01, 0x15, 0x6C, 0x2E, 0x34, 0x3C,
560 0x1A, 0x3C, 0x1A, 0x1D, 0x00, 0x00, 0x01, 0x01, 0x34, 0x81, 0x25, 0x00,
561 0x00, 0x34, 0x2A, 0x7B, 0x34, 0x1B, 0x06, 0x06, 0x81, 0x23, 0x1A, 0x47,
562 0x04, 0x77, 0x1A, 0x00, 0x00, 0x1B, 0x01, 0x81, 0xAC, 0x00, 0x0D, 0x06,
563 0x04, 0x1A, 0x01, 0x7F, 0x00, 0x7E, 0x43, 0x00, 0x02, 0x03, 0x00, 0x61,
564 0x1E, 0x7E, 0x03, 0x01, 0x02, 0x01, 0x01, 0x0F, 0x11, 0x02, 0x01, 0x01,
565 0x04, 0x10, 0x01, 0x0F, 0x11, 0x02, 0x01, 0x01, 0x08, 0x10, 0x01, 0x0F,
566 0x11, 0x01, 0x00, 0x2A, 0x0D, 0x06, 0x10, 0x1A, 0x01, 0x00, 0x01, 0x18,
567 0x02, 0x00, 0x06, 0x03, 0x37, 0x04, 0x01, 0x38, 0x04, 0x80, 0x56, 0x01,
568 0x01, 0x2A, 0x0D, 0x06, 0x10, 0x1A, 0x01, 0x01, 0x01, 0x10, 0x02, 0x00,
569 0x06, 0x03, 0x37, 0x04, 0x01, 0x38, 0x04, 0x80, 0x40, 0x01, 0x02, 0x2A,
570 0x0D, 0x06, 0x0F, 0x1A, 0x01, 0x01, 0x01, 0x20, 0x02, 0x00, 0x06, 0x03,
571 0x37, 0x04, 0x01, 0x38, 0x04, 0x2B, 0x01, 0x03, 0x2A, 0x0D, 0x06, 0x0E,
572 0x1A, 0x1A, 0x01, 0x10, 0x02, 0x00, 0x06, 0x03, 0x35, 0x04, 0x01, 0x36,
573 0x04, 0x17, 0x01, 0x04, 0x2A, 0x0D, 0x06, 0x0E, 0x1A, 0x1A, 0x01, 0x20,
574 0x02, 0x00, 0x06, 0x03, 0x35, 0x04, 0x01, 0x36, 0x04, 0x03, 0x52, 0x1C,
575 0x1A, 0x00, 0x00, 0x7E, 0x01, 0x0C, 0x10, 0x1B, 0x45, 0x34, 0x01, 0x03,
576 0x0A, 0x11, 0x00, 0x00, 0x7E, 0x01, 0x0C, 0x10, 0x01, 0x01, 0x0D, 0x00,
577 0x00, 0x7E, 0x01, 0x0C, 0x10, 0x44, 0x00, 0x00, 0x14, 0x01, 0x00, 0x5E,
578 0x20, 0x1B, 0x06, 0x20, 0x01, 0x01, 0x2A, 0x0D, 0x06, 0x07, 0x1A, 0x01,
579 0x00, 0x81, 0x02, 0x04, 0x11, 0x01, 0x02, 0x2A, 0x0D, 0x06, 0x0A, 0x1A,
580 0x60, 0x20, 0x06, 0x03, 0x01, 0x10, 0x29, 0x04, 0x01, 0x1A, 0x04, 0x01,
581 0x1A, 0x63, 0x20, 0x05, 0x35, 0x21, 0x06, 0x32, 0x6B, 0x20, 0x01, 0x14,
582 0x2A, 0x0D, 0x06, 0x06, 0x1A, 0x01, 0x02, 0x29, 0x04, 0x24, 0x01, 0x15,
583 0x2A, 0x0D, 0x06, 0x0B, 0x1A, 0x81, 0x11, 0x06, 0x04, 0x01, 0x7F, 0x81,
584 0x02, 0x04, 0x13, 0x01, 0x16, 0x2A, 0x0D, 0x06, 0x06, 0x1A, 0x01, 0x01,
585 0x29, 0x04, 0x07, 0x1A, 0x01, 0x04, 0x29, 0x01, 0x00, 0x1A, 0x13, 0x06,
586 0x03, 0x01, 0x08, 0x29, 0x00, 0x00, 0x14, 0x1B, 0x05, 0x10, 0x21, 0x06,
587 0x0D, 0x6B, 0x20, 0x01, 0x15, 0x0D, 0x06, 0x05, 0x1A, 0x81, 0x11, 0x04,
588 0x01, 0x17, 0x00, 0x00, 0x81, 0x2D, 0x01, 0x07, 0x11, 0x01, 0x01, 0x0E,
589 0x06, 0x02, 0x5C, 0x1C, 0x00, 0x01, 0x03, 0x00, 0x1D, 0x13, 0x06, 0x05,
590 0x02, 0x00, 0x6C, 0x2E, 0x00, 0x81, 0x2D, 0x1A, 0x04, 0x73, 0x00, 0x01,
591 0x14, 0x81, 0x30, 0x01, 0x01, 0x81, 0x3C, 0x1D, 0x1B, 0x01, 0x00, 0x81,
592 0x29, 0x01, 0x16, 0x81, 0x30, 0x81, 0x34, 0x1D, 0x00, 0x02, 0x81, 0x08,
593 0x81, 0x0A, 0x08, 0x81, 0x06, 0x08, 0x81, 0x09, 0x08, 0x81, 0x0B, 0x08,
594 0x81, 0x07, 0x08, 0x03, 0x00, 0x01, 0x01, 0x81, 0x3C, 0x01, 0x27, 0x72,
595 0x20, 0x08, 0x75, 0x20, 0x01, 0x01, 0x0B, 0x08, 0x02, 0x00, 0x06, 0x04,
596 0x48, 0x02, 0x00, 0x08, 0x69, 0x1E, 0x2A, 0x09, 0x1B, 0x45, 0x06, 0x24,
597 0x02, 0x00, 0x05, 0x04, 0x34, 0x48, 0x34, 0x49, 0x01, 0x04, 0x09, 0x1B,
598 0x42, 0x06, 0x03, 0x1A, 0x01, 0x00, 0x1B, 0x01, 0x04, 0x08, 0x02, 0x00,
599 0x08, 0x03, 0x00, 0x34, 0x01, 0x04, 0x08, 0x2A, 0x08, 0x34, 0x04, 0x03,
600 0x1A, 0x01, 0x7F, 0x03, 0x01, 0x81, 0x3B, 0x78, 0x1E, 0x81, 0x3A, 0x62,
601 0x01, 0x04, 0x12, 0x62, 0x01, 0x04, 0x08, 0x01, 0x1C, 0x24, 0x62, 0x01,
602 0x20, 0x81, 0x35, 0x71, 0x72, 0x20, 0x81, 0x37, 0x75, 0x20, 0x1B, 0x01,
603 0x01, 0x0B, 0x81, 0x3A, 0x74, 0x34, 0x1B, 0x06, 0x11, 0x47, 0x2A, 0x1E,
604 0x1B, 0x81, 0x28, 0x05, 0x02, 0x4C, 0x1C, 0x81, 0x3A, 0x34, 0x48, 0x34,
605 0x04, 0x6C, 0x4A, 0x01, 0x01, 0x81, 0x3C, 0x01, 0x00, 0x81, 0x3C, 0x02,
606 0x00, 0x06, 0x81, 0x47, 0x02, 0x00, 0x81, 0x3A, 0x81, 0x08, 0x06, 0x12,
607 0x01, 0x83, 0xFE, 0x01, 0x81, 0x3A, 0x6E, 0x81, 0x08, 0x01, 0x04, 0x09,
608 0x1B, 0x81, 0x3A, 0x47, 0x81, 0x37, 0x81, 0x0A, 0x06, 0x1C, 0x01, 0x00,
609 0x81, 0x3A, 0x6F, 0x81, 0x0A, 0x01, 0x04, 0x09, 0x1B, 0x81, 0x3A, 0x01,
610 0x02, 0x09, 0x1B, 0x81, 0x3A, 0x01, 0x00, 0x81, 0x3C, 0x01, 0x03, 0x09,
611 0x81, 0x36, 0x81, 0x06, 0x06, 0x0F, 0x01, 0x01, 0x81, 0x3A, 0x01, 0x01,
612 0x81, 0x3A, 0x68, 0x20, 0x01, 0x08, 0x09, 0x81, 0x3C, 0x81, 0x09, 0x06,
613 0x1F, 0x01, 0x0D, 0x81, 0x3A, 0x81, 0x09, 0x01, 0x04, 0x09, 0x1B, 0x81,
614 0x3A, 0x01, 0x02, 0x09, 0x81, 0x3A, 0x32, 0x06, 0x04, 0x01, 0x03, 0x81,
615 0x39, 0x33, 0x06, 0x04, 0x01, 0x01, 0x81, 0x39, 0x81, 0x0B, 0x1B, 0x06,
616 0x27, 0x01, 0x0A, 0x81, 0x3A, 0x01, 0x04, 0x09, 0x1B, 0x81, 0x3A, 0x49,
617 0x81, 0x3A, 0x30, 0x01, 0x00, 0x1B, 0x01, 0x20, 0x0A, 0x06, 0x0E, 0x81,
618 0x04, 0x10, 0x01, 0x01, 0x11, 0x06, 0x03, 0x1B, 0x81, 0x3A, 0x46, 0x04,
619 0x6C, 0x4A, 0x04, 0x01, 0x1A, 0x81, 0x07, 0x06, 0x0D, 0x01, 0x0B, 0x81,
620 0x3A, 0x01, 0x02, 0x81, 0x3A, 0x01, 0x82, 0x00, 0x81, 0x3A, 0x02, 0x01,
621 0x42, 0x05, 0x14, 0x01, 0x15, 0x81, 0x3A, 0x02, 0x01, 0x1B, 0x81, 0x3A,
622 0x1B, 0x06, 0x07, 0x47, 0x01, 0x00, 0x81, 0x3C, 0x04, 0x76, 0x1A, 0x00,
623 0x00, 0x01, 0x10, 0x81, 0x3C, 0x61, 0x1E, 0x1B, 0x81, 0x2C, 0x06, 0x10,
624 0x81, 0x0F, 0x19, 0x1B, 0x48, 0x81, 0x3B, 0x1B, 0x81, 0x3A, 0x6A, 0x34,
625 0x81, 0x35, 0x04, 0x12, 0x1B, 0x81, 0x2A, 0x34, 0x81, 0x0F, 0x18, 0x1B,
626 0x46, 0x81, 0x3B, 0x1B, 0x81, 0x3C, 0x6A, 0x34, 0x81, 0x35, 0x00, 0x00,
627 0x81, 0x00, 0x01, 0x14, 0x81, 0x3C, 0x01, 0x0C, 0x81, 0x3B, 0x6A, 0x01,
628 0x0C, 0x81, 0x35, 0x00, 0x00, 0x3B, 0x1B, 0x01, 0x00, 0x0D, 0x06, 0x02,
629 0x4A, 0x00, 0x81, 0x2D, 0x1A, 0x04, 0x72, 0x00, 0x1B, 0x81, 0x3A, 0x81,
630 0x35, 0x00, 0x00, 0x1B, 0x81, 0x3C, 0x81, 0x35, 0x00, 0x00, 0x01, 0x0B,
631 0x81, 0x3C, 0x01, 0x03, 0x81, 0x3B, 0x01, 0x00, 0x81, 0x3B, 0x00, 0x01,
632 0x03, 0x00, 0x31, 0x1A, 0x1B, 0x01, 0x10, 0x11, 0x06, 0x08, 0x01, 0x04,
633 0x81, 0x3C, 0x02, 0x00, 0x81, 0x3C, 0x1B, 0x01, 0x08, 0x11, 0x06, 0x08,
634 0x01, 0x03, 0x81, 0x3C, 0x02, 0x00, 0x81, 0x3C, 0x1B, 0x01, 0x20, 0x11,
635 0x06, 0x08, 0x01, 0x05, 0x81, 0x3C, 0x02, 0x00, 0x81, 0x3C, 0x1B, 0x01,
636 0x80, 0x40, 0x11, 0x06, 0x08, 0x01, 0x06, 0x81, 0x3C, 0x02, 0x00, 0x81,
637 0x3C, 0x01, 0x04, 0x11, 0x06, 0x08, 0x01, 0x02, 0x81, 0x3C, 0x02, 0x00,
638 0x81, 0x3C, 0x00, 0x00, 0x1B, 0x01, 0x08, 0x39, 0x81, 0x3C, 0x81, 0x3C,
639 0x00, 0x00, 0x1B, 0x01, 0x10, 0x39, 0x81, 0x3C, 0x81, 0x3A, 0x00, 0x00,
640 0x1B, 0x3C, 0x06, 0x02, 0x1A, 0x00, 0x81, 0x2D, 0x1A, 0x04, 0x75
643 static const uint16_t t0_caddr
[] = {
769 #define T0_INTERPRETED 66
771 #define T0_ENTER(ip, rp, slot) do { \
772 const unsigned char *t0_newip; \
774 t0_newip = &t0_codeblock[t0_caddr[(slot) - T0_INTERPRETED]]; \
775 t0_lnum = t0_parse7E_unsigned(&t0_newip); \
777 *((rp) ++) = (uint32_t)((ip) - &t0_codeblock[0]) + (t0_lnum << 16); \
781 #define T0_DEFENTRY(name, slot) \
785 t0_context *t0ctx = ctx; \
786 t0ctx->ip = &t0_codeblock[0]; \
787 T0_ENTER(t0ctx->ip, t0ctx->rp, slot); \
790 T0_DEFENTRY(br_ssl_hs_client_init_main
, 141)
793 br_ssl_hs_client_run(void *t0ctx
)
796 const unsigned char *ip
;
798 #define T0_LOCAL(x) (*(rp - 2 - (x)))
799 #define T0_POP() (*-- dp)
800 #define T0_POPi() (*(int32_t *)(-- dp))
801 #define T0_PEEK(x) (*(dp - 1 - (x)))
802 #define T0_PEEKi(x) (*(int32_t *)(dp - 1 - (x)))
803 #define T0_PUSH(v) do { *dp = (v); dp ++; } while (0)
804 #define T0_PUSHi(v) do { *(int32_t *)dp = (v); dp ++; } while (0)
805 #define T0_RPOP() (*-- rp)
806 #define T0_RPOPi() (*(int32_t *)(-- rp))
807 #define T0_RPUSH(v) do { *rp = (v); rp ++; } while (0)
808 #define T0_RPUSHi(v) do { *(int32_t *)rp = (v); rp ++; } while (0)
809 #define T0_ROLL(x) do { \
810 size_t t0len = (size_t)(x); \
811 uint32_t t0tmp = *(dp - 1 - t0len); \
812 memmove(dp - t0len - 1, dp - t0len, t0len * sizeof *dp); \
815 #define T0_SWAP() do { \
816 uint32_t t0tmp = *(dp - 2); \
817 *(dp - 2) = *(dp - 1); \
820 #define T0_ROT() do { \
821 uint32_t t0tmp = *(dp - 3); \
822 *(dp - 3) = *(dp - 2); \
823 *(dp - 2) = *(dp - 1); \
826 #define T0_NROT() do { \
827 uint32_t t0tmp = *(dp - 1); \
828 *(dp - 1) = *(dp - 2); \
829 *(dp - 2) = *(dp - 3); \
832 #define T0_PICK(x) do { \
833 uint32_t t0depth = (x); \
834 T0_PUSH(T0_PEEK(t0depth)); \
836 #define T0_CO() do { \
839 #define T0_RET() break
841 dp
= ((t0_context
*)t0ctx
)->dp
;
842 rp
= ((t0_context
*)t0ctx
)->rp
;
843 ip
= ((t0_context
*)t0ctx
)->ip
;
847 t0x
= t0_parse7E_unsigned(&ip
);
848 if (t0x
< T0_INTERPRETED
) {
860 ip
= &t0_codeblock
[t0x
];
862 case 1: /* literal constant */
863 T0_PUSHi(t0_parse7E_signed(&ip
));
865 case 2: /* read local */
866 T0_PUSH(T0_LOCAL(t0_parse7E_unsigned(&ip
)));
868 case 3: /* write local */
869 T0_LOCAL(t0_parse7E_unsigned(&ip
)) = T0_POP();
872 t0off
= t0_parse7E_signed(&ip
);
875 case 5: /* jump if */
876 t0off
= t0_parse7E_signed(&ip
);
881 case 6: /* jump if not */
882 t0off
= t0_parse7E_signed(&ip
);
890 uint32_t b
= T0_POP();
891 uint32_t a
= T0_POP();
899 uint32_t b
= T0_POP();
900 uint32_t a
= T0_POP();
908 uint32_t b
= T0_POP();
909 uint32_t a
= T0_POP();
917 int32_t b
= T0_POPi();
918 int32_t a
= T0_POPi();
919 T0_PUSH(-(uint32_t)(a
< b
));
926 int c
= (int)T0_POPi();
927 uint32_t x
= T0_POP();
935 uint32_t b
= T0_POP();
936 uint32_t a
= T0_POP();
937 T0_PUSH(-(uint32_t)(a
!= b
));
944 uint32_t b
= T0_POP();
945 uint32_t a
= T0_POP();
946 T0_PUSH(-(uint32_t)(a
== b
));
953 int32_t b
= T0_POPi();
954 int32_t a
= T0_POPi();
955 T0_PUSH(-(uint32_t)(a
> b
));
962 int32_t b
= T0_POPi();
963 int32_t a
= T0_POPi();
964 T0_PUSH(-(uint32_t)(a
>= b
));
971 int c
= (int)T0_POPi();
972 int32_t x
= T0_POPi();
980 uint32_t b
= T0_POP();
981 uint32_t a
= T0_POP();
989 size_t len
= (size_t)T0_POP();
990 void *addr
= (unsigned char *)ENG
+ (size_t)T0_POP();
991 memset(addr
, 0, len
);
998 T0_PUSHi(-(ENG
->hlen_out
> 0));
1008 /* compute-Finished-inner */
1010 int prf_id
= T0_POP();
1011 int from_client
= T0_POPi();
1012 unsigned char seed
[48];
1015 br_tls_prf_impl prf
= br_ssl_engine_get_PRF(ENG
, prf_id
);
1016 if (ENG
->session
.version
>= BR_TLS12
) {
1017 seed_len
= br_multihash_out(&ENG
->mhash
, prf_id
, seed
);
1019 br_multihash_out(&ENG
->mhash
, br_md5_ID
, seed
);
1020 br_multihash_out(&ENG
->mhash
, br_sha1_ID
, seed
+ 16);
1023 prf(ENG
->pad
, 12, ENG
->session
.master_secret
,
1024 sizeof ENG
->session
.master_secret
,
1025 from_client
? "client finished" : "server finished",
1033 size_t addr
= T0_POP();
1034 T0_PUSH(t0_datablock
[addr
]);
1048 unsigned prf_id
= T0_POP();
1049 unsigned ecdhe
= T0_POP();
1052 x
= make_pms_ecdh(CTX
, ecdhe
, prf_id
);
1054 br_ssl_engine_fail(ENG
, -x
);
1063 /* do-rsa-encrypt */
1067 x
= make_pms_rsa(CTX
, T0_POP());
1069 br_ssl_engine_fail(ENG
, -x
);
1084 T0_PUSH(T0_PEEK(0));
1090 br_ssl_engine_fail(ENG
, (int)T0_POPi());
1098 br_ssl_engine_flush_record(ENG
);
1105 size_t addr
= (size_t)T0_POP();
1106 T0_PUSH(*(uint16_t *)((unsigned char *)ENG
+ addr
));
1113 size_t addr
= (size_t)T0_POP();
1114 T0_PUSH(*(uint32_t *)((unsigned char *)ENG
+ addr
));
1121 size_t addr
= (size_t)T0_POP();
1122 T0_PUSH(*((unsigned char *)ENG
+ addr
));
1129 T0_PUSHi(-(ENG
->hlen_in
!= 0));
1136 size_t len
= (size_t)T0_POP();
1137 void *addr2
= (unsigned char *)ENG
+ (size_t)T0_POP();
1138 void *addr1
= (unsigned char *)ENG
+ (size_t)T0_POP();
1139 int x
= memcmp(addr1
, addr2
, len
);
1140 T0_PUSH((uint32_t)-(x
== 0));
1147 size_t len
= (size_t)T0_POP();
1148 void *src
= (unsigned char *)ENG
+ (size_t)T0_POP();
1149 void *dst
= (unsigned char *)ENG
+ (size_t)T0_POP();
1150 memcpy(dst
, src
, len
);
1157 size_t len
= (size_t)T0_POP();
1158 void *addr
= (unsigned char *)ENG
+ (size_t)T0_POP();
1159 br_hmac_drbg_generate(&ENG
->rng
, addr
, len
);
1164 /* more-incoming-bytes? */
1166 T0_PUSHi(ENG
->hlen_in
!= 0 || !br_ssl_engine_recvrec_finished(ENG
));
1171 /* multihash-init */
1173 br_multihash_init(&ENG
->mhash
);
1180 uint32_t a
= T0_POP();
1188 uint32_t a
= T0_POP();
1196 uint32_t b
= T0_POP();
1197 uint32_t a
= T0_POP();
1204 T0_PUSH(T0_PEEK(1));
1208 /* read-chunk-native */
1210 size_t clen
= ENG
->hlen_in
;
1216 if ((size_t)len
< clen
) {
1219 memcpy((unsigned char *)ENG
+ addr
, ENG
->hbuf_in
, clen
);
1220 if (ENG
->record_type_in
== BR_SSL_HANDSHAKE
) {
1221 br_multihash_update(&ENG
->mhash
, ENG
->hbuf_in
, clen
);
1223 T0_PUSH(addr
+ (uint32_t)clen
);
1224 T0_PUSH(len
- (uint32_t)clen
);
1225 ENG
->hbuf_in
+= clen
;
1226 ENG
->hlen_in
-= clen
;
1234 if (ENG
->hlen_in
> 0) {
1237 x
= *ENG
->hbuf_in
++;
1238 if (ENG
->record_type_in
== BR_SSL_HANDSHAKE
) {
1239 br_multihash_update(&ENG
->mhash
, &x
, 1);
1252 size_t addr
= (size_t)T0_POP();
1253 *(uint16_t *)((unsigned char *)ENG
+ addr
) = (uint16_t)T0_POP();
1260 size_t addr
= (size_t)T0_POP();
1261 *((unsigned char *)ENG
+ addr
) = (unsigned char)T0_POP();
1268 void *str
= (unsigned char *)ENG
+ (size_t)T0_POP();
1269 T0_PUSH((uint32_t)strlen(str
));
1274 /* supported-curves */
1276 uint32_t x
= ENG
->iec
== NULL
? 0 : ENG
->iec
->supported_curves
;
1282 /* supported-hash-functions */
1289 for (i
= br_sha1_ID
; i
<= br_sha512_ID
; i
++) {
1290 if (br_multihash_getimpl(&ENG
->mhash
, i
)) {
1301 /* supports-ecdsa? */
1303 T0_PUSHi(-(CTX
->iecdsa
!= 0));
1308 /* supports-rsa-sign? */
1310 T0_PUSHi(-(CTX
->irsavrfy
!= 0));
1320 /* switch-aesgcm-in */
1322 int is_client
, prf_id
;
1323 unsigned cipher_key_len
;
1325 cipher_key_len
= T0_POP();
1327 is_client
= T0_POP();
1328 br_ssl_engine_switch_gcm_in(ENG
, is_client
, prf_id
,
1329 ENG
->iaes_ctr
, cipher_key_len
);
1334 /* switch-aesgcm-out */
1336 int is_client
, prf_id
;
1337 unsigned cipher_key_len
;
1339 cipher_key_len
= T0_POP();
1341 is_client
= T0_POP();
1342 br_ssl_engine_switch_gcm_out(ENG
, is_client
, prf_id
,
1343 ENG
->iaes_ctr
, cipher_key_len
);
1350 int is_client
, prf_id
, mac_id
, aes
;
1351 unsigned cipher_key_len
;
1353 cipher_key_len
= T0_POP();
1357 is_client
= T0_POP();
1358 br_ssl_engine_switch_cbc_in(ENG
, is_client
, prf_id
, mac_id
,
1359 aes
? ENG
->iaes_cbcdec
: ENG
->ides_cbcdec
, cipher_key_len
);
1364 /* switch-cbc-out */
1366 int is_client
, prf_id
, mac_id
, aes
;
1367 unsigned cipher_key_len
;
1369 cipher_key_len
= T0_POP();
1373 is_client
= T0_POP();
1374 br_ssl_engine_switch_cbc_out(ENG
, is_client
, prf_id
, mac_id
,
1375 aes
? ENG
->iaes_cbcenc
: ENG
->ides_cbcenc
, cipher_key_len
);
1382 int c
= (int)T0_POPi();
1383 uint32_t x
= T0_POP();
1389 /* verify-SKE-sig */
1391 size_t sig_len
= T0_POP();
1392 int use_rsa
= T0_POPi();
1393 int hash
= T0_POPi();
1395 T0_PUSH(verify_SKE_sig(CTX
, hash
, use_rsa
, sig_len
));
1400 /* write-blob-chunk */
1402 size_t clen
= ENG
->hlen_out
;
1408 if ((size_t)len
< clen
) {
1411 memcpy(ENG
->hbuf_out
, (unsigned char *)ENG
+ addr
, clen
);
1412 if (ENG
->record_type_out
== BR_SSL_HANDSHAKE
) {
1413 br_multihash_update(&ENG
->mhash
, ENG
->hbuf_out
, clen
);
1415 T0_PUSH(addr
+ (uint32_t)clen
);
1416 T0_PUSH(len
- (uint32_t)clen
);
1417 ENG
->hbuf_out
+= clen
;
1418 ENG
->hlen_out
-= clen
;
1428 x
= (unsigned char)T0_POP();
1429 if (ENG
->hlen_out
> 0) {
1430 if (ENG
->record_type_out
== BR_SSL_HANDSHAKE
) {
1431 br_multihash_update(&ENG
->mhash
, &x
, 1);
1433 *ENG
->hbuf_out
++ = x
;
1445 const br_x509_class
*xc
;
1448 xc
= *(ENG
->x509ctx
);
1450 xc
->append(ENG
->x509ctx
, ENG
->pad
, len
);
1457 const br_x509_class
*xc
;
1459 xc
= *(ENG
->x509ctx
);
1460 xc
->end_cert(ENG
->x509ctx
);
1465 /* x509-end-chain */
1467 const br_x509_class
*xc
;
1469 xc
= *(ENG
->x509ctx
);
1470 T0_PUSH(xc
->end_chain(ENG
->x509ctx
));
1475 /* x509-start-cert */
1477 const br_x509_class
*xc
;
1479 xc
= *(ENG
->x509ctx
);
1480 xc
->start_cert(ENG
->x509ctx
, T0_POP());
1485 /* x509-start-chain */
1487 const br_x509_class
*xc
;
1489 xc
= *(ENG
->x509ctx
);
1490 xc
->start_chain(ENG
->x509ctx
, T0_POP(), ENG
->server_name
);
1497 T0_ENTER(ip
, rp
, t0x
);
1501 ((t0_context
*)t0ctx
)->dp
= dp
;
1502 ((t0_context
*)t0ctx
)->rp
= rp
;
1503 ((t0_context
*)t0ctx
)->ip
= ip
;