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
, log_max_frag_len
)),
403 0x00, 0x00, 0x01, T0_INT2(offsetof(br_ssl_engine_context
, pad
)), 0x00,
404 0x00, 0x01, T0_INT2(offsetof(br_ssl_engine_context
, record_type_in
)),
406 T0_INT2(offsetof(br_ssl_engine_context
, record_type_out
)), 0x00, 0x00,
407 0x01, T0_INT2(offsetof(br_ssl_engine_context
, reneg
)), 0x00, 0x00,
408 0x01, T0_INT2(offsetof(br_ssl_engine_context
, saved_finished
)), 0x00,
409 0x00, 0x01, T0_INT2(offsetof(br_ssl_engine_context
, server_name
)),
411 T0_INT2(offsetof(br_ssl_engine_context
, server_random
)), 0x00, 0x00,
413 T0_INT2(offsetof(br_ssl_engine_context
, session
) + offsetof(br_ssl_session_parameters
, session_id
)),
415 T0_INT2(offsetof(br_ssl_engine_context
, session
) + offsetof(br_ssl_session_parameters
, session_id_len
)),
417 T0_INT2(offsetof(br_ssl_engine_context
, shutdown_recv
)), 0x00, 0x00,
418 0x01, T0_INT2(offsetof(br_ssl_engine_context
, suites_buf
)), 0x00, 0x00,
419 0x01, T0_INT2(offsetof(br_ssl_engine_context
, suites_num
)), 0x00, 0x00,
421 T0_INT2(offsetof(br_ssl_engine_context
, session
) + offsetof(br_ssl_session_parameters
, version
)),
422 0x00, 0x00, 0x01, T0_INT2(offsetof(br_ssl_engine_context
, version_in
)),
424 T0_INT2(offsetof(br_ssl_engine_context
, version_max
)), 0x00, 0x00,
425 0x01, T0_INT2(offsetof(br_ssl_engine_context
, version_min
)), 0x00,
426 0x00, 0x01, T0_INT2(offsetof(br_ssl_engine_context
, version_out
)),
427 0x00, 0x00, 0x09, 0x1B, 0x40, 0x06, 0x02, 0x50, 0x1C, 0x00, 0x00, 0x06,
428 0x08, 0x1E, 0x0D, 0x05, 0x02, 0x59, 0x1C, 0x04, 0x01, 0x2B, 0x00, 0x00,
429 0x01, 0x01, 0x00, 0x01, 0x03, 0x00, 0x79, 0x1B, 0x46, 0x32, 0x7D, 0x1B,
430 0x05, 0x04, 0x48, 0x01, 0x00, 0x00, 0x02, 0x00, 0x0D, 0x06, 0x02, 0x7D,
431 0x00, 0x46, 0x04, 0x6B, 0x00, 0x06, 0x02, 0x50, 0x1C, 0x00, 0x00, 0x1B,
432 0x6A, 0x32, 0x05, 0x03, 0x01, 0x0C, 0x08, 0x32, 0x5F, 0x1E, 0x81, 0x0A,
433 0x15, 0x66, 0x01, 0x0C, 0x22, 0x00, 0x00, 0x1B, 0x16, 0x01, 0x08, 0x0B,
434 0x32, 0x44, 0x16, 0x08, 0x00, 0x01, 0x03, 0x00, 0x01, 0x00, 0x5E, 0x2C,
435 0x1D, 0x13, 0x26, 0x06, 0x08, 0x02, 0x00, 0x81, 0x29, 0x03, 0x00, 0x04,
436 0x74, 0x01, 0x00, 0x81, 0x21, 0x02, 0x00, 0x1B, 0x13, 0x11, 0x06, 0x02,
437 0x57, 0x1C, 0x81, 0x29, 0x04, 0x75, 0x01, 0x01, 0x00, 0x5E, 0x2C, 0x01,
438 0x16, 0x68, 0x2C, 0x25, 0x81, 0x2D, 0x1D, 0x81, 0x11, 0x06, 0x0B, 0x01,
439 0x7F, 0x81, 0x0D, 0x01, 0x7F, 0x81, 0x2C, 0x04, 0x80, 0x42, 0x81, 0x0E,
440 0x5F, 0x1E, 0x81, 0x01, 0x01, T0_INT1(BR_KEYTYPE_SIGN
), 0x11, 0x06,
441 0x02, 0x81, 0x12, 0x81, 0x15, 0x1B, 0x01, 0x0D, 0x0D, 0x06, 0x09, 0x1A,
442 0x81, 0x14, 0x81, 0x15, 0x01, 0x7F, 0x04, 0x02, 0x01, 0x00, 0x03, 0x00,
443 0x01, 0x0E, 0x0D, 0x05, 0x02, 0x5A, 0x1C, 0x06, 0x02, 0x4F, 0x1C, 0x24,
444 0x06, 0x02, 0x5A, 0x1C, 0x02, 0x00, 0x06, 0x02, 0x81, 0x33, 0x81, 0x2E,
445 0x01, 0x7F, 0x81, 0x2C, 0x01, 0x7F, 0x81, 0x0D, 0x01, 0x01, 0x5E, 0x2C,
446 0x01, 0x17, 0x68, 0x2C, 0x00, 0x00, 0x28, 0x28, 0x00, 0x00, 0x7A, 0x01,
447 0x0C, 0x10, 0x01, 0x00, 0x28, 0x0D, 0x06, 0x05, 0x1A, 0x01,
448 T0_INT1(BR_KEYTYPE_RSA
| BR_KEYTYPE_KEYX
), 0x04, 0x30, 0x01, 0x01,
449 0x28, 0x0D, 0x06, 0x05, 0x1A, 0x01,
450 T0_INT1(BR_KEYTYPE_RSA
| BR_KEYTYPE_SIGN
), 0x04, 0x25, 0x01, 0x02,
451 0x28, 0x0D, 0x06, 0x05, 0x1A, 0x01,
452 T0_INT1(BR_KEYTYPE_EC
| BR_KEYTYPE_SIGN
), 0x04, 0x1A, 0x01, 0x03,
453 0x28, 0x0D, 0x06, 0x05, 0x1A, 0x01,
454 T0_INT1(BR_KEYTYPE_EC
| BR_KEYTYPE_KEYX
), 0x04, 0x0F, 0x01, 0x04,
455 0x28, 0x0D, 0x06, 0x05, 0x1A, 0x01,
456 T0_INT1(BR_KEYTYPE_EC
| BR_KEYTYPE_KEYX
), 0x04, 0x04, 0x01, 0x00,
457 0x32, 0x1A, 0x00, 0x00, 0x65, 0x1F, 0x01, 0x0E, 0x0D, 0x06, 0x04, 0x01,
458 0x00, 0x04, 0x02, 0x01, 0x05, 0x00, 0x00, 0x2E, 0x06, 0x04, 0x01, 0x06,
459 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x69, 0x1F, 0x1B, 0x06, 0x08, 0x01,
460 0x01, 0x09, 0x01, 0x11, 0x07, 0x04, 0x03, 0x1A, 0x01, 0x05, 0x00, 0x01,
461 0x2F, 0x03, 0x00, 0x1A, 0x01, 0x00, 0x31, 0x06, 0x03, 0x02, 0x00, 0x08,
462 0x30, 0x06, 0x03, 0x02, 0x00, 0x08, 0x1B, 0x06, 0x06, 0x01, 0x01, 0x0B,
463 0x01, 0x06, 0x08, 0x00, 0x00, 0x6B, 0x2D, 0x1B, 0x06, 0x03, 0x01, 0x09,
464 0x08, 0x00, 0x01, 0x2E, 0x1B, 0x06, 0x1E, 0x01, 0x00, 0x03, 0x00, 0x1B,
465 0x06, 0x0E, 0x1B, 0x01, 0x01, 0x11, 0x02, 0x00, 0x08, 0x03, 0x00, 0x01,
466 0x01, 0x10, 0x04, 0x6F, 0x1A, 0x02, 0x00, 0x01, 0x01, 0x0B, 0x01, 0x06,
467 0x08, 0x00, 0x00, 0x7F, 0x81, 0x28, 0x1B, 0x01, 0x07, 0x11, 0x01, 0x00,
468 0x28, 0x0D, 0x06, 0x09, 0x1A, 0x01, 0x10, 0x11, 0x06, 0x01, 0x7F, 0x04,
469 0x2C, 0x01, 0x01, 0x28, 0x0D, 0x06, 0x23, 0x1A, 0x1A, 0x01, 0x00, 0x5E,
470 0x2C, 0x81, 0x10, 0x69, 0x1F, 0x01, 0x01, 0x0D, 0x06, 0x11, 0x1D, 0x13,
471 0x26, 0x06, 0x05, 0x81, 0x28, 0x1A, 0x04, 0x77, 0x01, 0x80, 0x64, 0x81,
472 0x21, 0x04, 0x01, 0x7F, 0x04, 0x03, 0x5A, 0x1C, 0x1A, 0x04, 0xFF, 0x3C,
473 0x01, 0x1B, 0x03, 0x00, 0x09, 0x1B, 0x40, 0x06, 0x02, 0x50, 0x1C, 0x02,
474 0x00, 0x00, 0x00, 0x7A, 0x01, 0x0F, 0x11, 0x00, 0x00, 0x5D, 0x1F, 0x01,
475 0x00, 0x28, 0x0D, 0x06, 0x10, 0x1A, 0x1B, 0x01, 0x01, 0x0C, 0x06, 0x03,
476 0x1A, 0x01, 0x02, 0x5D, 0x2C, 0x01, 0x00, 0x04, 0x15, 0x01, 0x01, 0x28,
477 0x0D, 0x06, 0x09, 0x1A, 0x01, 0x00, 0x5D, 0x2C, 0x42, 0x00, 0x04, 0x06,
478 0x01, 0x82, 0x00, 0x08, 0x1C, 0x1A, 0x00, 0x00, 0x01, 0x00, 0x20, 0x06,
479 0x06, 0x2A, 0x81, 0x0B, 0x27, 0x04, 0x77, 0x1B, 0x06, 0x04, 0x01, 0x01,
480 0x6F, 0x2C, 0x00, 0x00, 0x20, 0x06, 0x0B, 0x67, 0x1F, 0x01, 0x14, 0x0C,
481 0x06, 0x02, 0x5A, 0x1C, 0x04, 0x12, 0x81, 0x28, 0x01, 0x07, 0x11, 0x1B,
482 0x01, 0x02, 0x0C, 0x06, 0x06, 0x06, 0x02, 0x5A, 0x1C, 0x04, 0x6F, 0x1A,
483 0x81, 0x1E, 0x01, 0x01, 0x0C, 0x24, 0x27, 0x06, 0x02, 0x49, 0x1C, 0x1B,
484 0x01, 0x01, 0x81, 0x24, 0x26, 0x81, 0x0F, 0x00, 0x01, 0x81, 0x15, 0x01,
485 0x0B, 0x0D, 0x05, 0x02, 0x5A, 0x1C, 0x5F, 0x1E, 0x81, 0x01, 0x3F, 0x81,
486 0x1C, 0x81, 0x09, 0x1B, 0x06, 0x26, 0x81, 0x1C, 0x81, 0x09, 0x1B, 0x3E,
487 0x1B, 0x06, 0x19, 0x1B, 0x01, 0x82, 0x00, 0x0E, 0x06, 0x05, 0x01, 0x82,
488 0x00, 0x04, 0x01, 0x1B, 0x03, 0x00, 0x66, 0x02, 0x00, 0x81, 0x13, 0x02,
489 0x00, 0x3B, 0x04, 0x64, 0x7B, 0x3C, 0x04, 0x57, 0x7B, 0x7B, 0x3D, 0x1B,
490 0x06, 0x01, 0x1C, 0x1A, 0x00, 0x00, 0x7C, 0x81, 0x15, 0x01, 0x14, 0x0C,
491 0x06, 0x02, 0x5A, 0x1C, 0x66, 0x01, 0x0C, 0x08, 0x01, 0x0C, 0x81, 0x13,
492 0x7B, 0x66, 0x1B, 0x01, 0x0C, 0x08, 0x01, 0x0C, 0x21, 0x05, 0x02, 0x4C,
493 0x1C, 0x00, 0x00, 0x81, 0x16, 0x06, 0x02, 0x5A, 0x1C, 0x06, 0x02, 0x4E,
494 0x1C, 0x00, 0x09, 0x81, 0x15, 0x01, 0x02, 0x0D, 0x05, 0x02, 0x5A, 0x1C,
495 0x81, 0x1B, 0x03, 0x00, 0x02, 0x00, 0x75, 0x1E, 0x0A, 0x02, 0x00, 0x74,
496 0x1E, 0x0E, 0x27, 0x06, 0x02, 0x5B, 0x1C, 0x02, 0x00, 0x73, 0x1E, 0x0C,
497 0x06, 0x02, 0x53, 0x1C, 0x02, 0x00, 0x76, 0x2B, 0x6C, 0x01, 0x20, 0x81,
498 0x13, 0x01, 0x00, 0x03, 0x01, 0x81, 0x1D, 0x03, 0x02, 0x02, 0x02, 0x01,
499 0x20, 0x0E, 0x06, 0x02, 0x58, 0x1C, 0x66, 0x02, 0x02, 0x81, 0x13, 0x02,
500 0x02, 0x6E, 0x1F, 0x0D, 0x02, 0x02, 0x01, 0x00, 0x0E, 0x11, 0x06, 0x0B,
501 0x6D, 0x66, 0x02, 0x02, 0x21, 0x06, 0x04, 0x01, 0x7F, 0x03, 0x01, 0x6D,
502 0x66, 0x02, 0x02, 0x22, 0x02, 0x02, 0x6E, 0x2C, 0x02, 0x00, 0x72, 0x02,
503 0x01, 0x78, 0x81, 0x1B, 0x1B, 0x81, 0x1F, 0x40, 0x06, 0x02, 0x4A, 0x1C,
504 0x5F, 0x02, 0x01, 0x78, 0x81, 0x1D, 0x06, 0x02, 0x4B, 0x1C, 0x1B, 0x06,
505 0x81, 0x3D, 0x81, 0x1B, 0x81, 0x09, 0x81, 0x06, 0x03, 0x03, 0x81, 0x04,
506 0x03, 0x04, 0x81, 0x02, 0x03, 0x05, 0x81, 0x05, 0x03, 0x06, 0x81, 0x07,
507 0x03, 0x07, 0x81, 0x03, 0x03, 0x08, 0x1B, 0x06, 0x81, 0x0B, 0x81, 0x1B,
508 0x01, 0x00, 0x28, 0x0D, 0x06, 0x10, 0x1A, 0x02, 0x03, 0x05, 0x02, 0x54,
509 0x1C, 0x01, 0x00, 0x03, 0x03, 0x81, 0x1A, 0x04, 0x80, 0x70, 0x01, 0x01,
510 0x28, 0x0D, 0x06, 0x10, 0x1A, 0x02, 0x05, 0x05, 0x02, 0x54, 0x1C, 0x01,
511 0x00, 0x03, 0x05, 0x81, 0x18, 0x04, 0x80, 0x5A, 0x01, 0x83, 0xFE, 0x01,
512 0x28, 0x0D, 0x06, 0x10, 0x1A, 0x02, 0x04, 0x05, 0x02, 0x54, 0x1C, 0x01,
513 0x00, 0x03, 0x04, 0x81, 0x19, 0x04, 0x80, 0x42, 0x01, 0x0D, 0x28, 0x0D,
514 0x06, 0x0F, 0x1A, 0x02, 0x06, 0x05, 0x02, 0x54, 0x1C, 0x01, 0x00, 0x03,
515 0x06, 0x81, 0x17, 0x04, 0x2D, 0x01, 0x0A, 0x28, 0x0D, 0x06, 0x0F, 0x1A,
516 0x02, 0x07, 0x05, 0x02, 0x54, 0x1C, 0x01, 0x00, 0x03, 0x07, 0x81, 0x17,
517 0x04, 0x18, 0x01, 0x0B, 0x28, 0x0D, 0x06, 0x0F, 0x1A, 0x02, 0x08, 0x05,
518 0x02, 0x54, 0x1C, 0x01, 0x00, 0x03, 0x08, 0x81, 0x17, 0x04, 0x03, 0x54,
519 0x1C, 0x1A, 0x04, 0xFE, 0x71, 0x02, 0x04, 0x06, 0x0D, 0x02, 0x04, 0x01,
520 0x05, 0x0E, 0x06, 0x02, 0x51, 0x1C, 0x01, 0x01, 0x69, 0x2C, 0x7B, 0x7B,
521 0x02, 0x01, 0x00, 0x04, 0x81, 0x15, 0x01, 0x0C, 0x0D, 0x05, 0x02, 0x5A,
522 0x1C, 0x81, 0x1D, 0x01, 0x03, 0x0D, 0x05, 0x02, 0x55, 0x1C, 0x81, 0x1B,
523 0x1B, 0x62, 0x2C, 0x1B, 0x01, 0x20, 0x0F, 0x06, 0x02, 0x55, 0x1C, 0x2E,
524 0x32, 0x10, 0x01, 0x01, 0x11, 0x05, 0x02, 0x55, 0x1C, 0x81, 0x1D, 0x1B,
525 0x01, 0x81, 0x05, 0x0E, 0x06, 0x02, 0x55, 0x1C, 0x1B, 0x64, 0x2C, 0x63,
526 0x32, 0x81, 0x13, 0x72, 0x1E, 0x01, 0x86, 0x03, 0x0F, 0x03, 0x00, 0x5F,
527 0x1E, 0x81, 0x26, 0x03, 0x01, 0x01, 0x02, 0x03, 0x02, 0x02, 0x00, 0x06,
528 0x23, 0x81, 0x1D, 0x1B, 0x1B, 0x01, 0x02, 0x0A, 0x32, 0x01, 0x06, 0x0E,
529 0x27, 0x06, 0x02, 0x55, 0x1C, 0x03, 0x02, 0x81, 0x1D, 0x02, 0x01, 0x01,
530 0x01, 0x0B, 0x01, 0x03, 0x08, 0x0D, 0x05, 0x02, 0x55, 0x1C, 0x04, 0x08,
531 0x02, 0x01, 0x06, 0x04, 0x01, 0x00, 0x03, 0x02, 0x81, 0x1B, 0x1B, 0x03,
532 0x03, 0x1B, 0x01, 0x84, 0x00, 0x0E, 0x06, 0x02, 0x56, 0x1C, 0x66, 0x32,
533 0x81, 0x13, 0x02, 0x02, 0x02, 0x01, 0x02, 0x03, 0x38, 0x1B, 0x06, 0x01,
534 0x1C, 0x1A, 0x7B, 0x00, 0x02, 0x03, 0x00, 0x03, 0x01, 0x02, 0x00, 0x77,
535 0x02, 0x01, 0x02, 0x00, 0x29, 0x1B, 0x01, 0x00, 0x0D, 0x06, 0x02, 0x48,
536 0x00, 0x81, 0x2A, 0x04, 0x73, 0x00, 0x1B, 0x06, 0x05, 0x81, 0x1D, 0x1A,
537 0x04, 0x78, 0x1A, 0x00, 0x00, 0x81, 0x16, 0x1B, 0x42, 0x06, 0x07, 0x1A,
538 0x06, 0x02, 0x4E, 0x1C, 0x04, 0x73, 0x00, 0x00, 0x81, 0x1E, 0x01, 0x03,
539 0x81, 0x1C, 0x32, 0x1A, 0x32, 0x00, 0x00, 0x81, 0x1B, 0x81, 0x22, 0x00,
540 0x00, 0x81, 0x1B, 0x01, 0x01, 0x0D, 0x05, 0x02, 0x4D, 0x1C, 0x81, 0x1D,
541 0x01, 0x08, 0x08, 0x65, 0x1F, 0x0D, 0x05, 0x02, 0x4D, 0x1C, 0x00, 0x00,
542 0x81, 0x1B, 0x69, 0x1F, 0x05, 0x16, 0x01, 0x01, 0x0D, 0x05, 0x02, 0x51,
543 0x1C, 0x81, 0x1D, 0x01, 0x00, 0x0D, 0x05, 0x02, 0x51, 0x1C, 0x01, 0x02,
544 0x69, 0x2C, 0x04, 0x1E, 0x01, 0x19, 0x0D, 0x05, 0x02, 0x51, 0x1C, 0x81,
545 0x1D, 0x01, 0x18, 0x0D, 0x05, 0x02, 0x51, 0x1C, 0x66, 0x01, 0x18, 0x81,
546 0x13, 0x6A, 0x66, 0x01, 0x18, 0x21, 0x05, 0x02, 0x51, 0x1C, 0x00, 0x00,
547 0x81, 0x1B, 0x06, 0x02, 0x52, 0x1C, 0x00, 0x00, 0x01, 0x02, 0x77, 0x81,
548 0x1E, 0x01, 0x08, 0x0B, 0x81, 0x1E, 0x08, 0x00, 0x00, 0x01, 0x03, 0x77,
549 0x81, 0x1E, 0x01, 0x08, 0x0B, 0x81, 0x1E, 0x08, 0x01, 0x08, 0x0B, 0x81,
550 0x1E, 0x08, 0x00, 0x00, 0x01, 0x01, 0x77, 0x81, 0x1E, 0x00, 0x00, 0x2A,
551 0x1B, 0x40, 0x05, 0x01, 0x00, 0x1A, 0x81, 0x2A, 0x04, 0x75, 0x02, 0x03,
552 0x00, 0x71, 0x1F, 0x03, 0x01, 0x01, 0x00, 0x1B, 0x02, 0x01, 0x0A, 0x06,
553 0x10, 0x1B, 0x01, 0x01, 0x0B, 0x70, 0x08, 0x1E, 0x02, 0x00, 0x0D, 0x06,
554 0x01, 0x00, 0x44, 0x04, 0x6A, 0x1A, 0x01, 0x7F, 0x00, 0x00, 0x01, 0x15,
555 0x68, 0x2C, 0x32, 0x3A, 0x1A, 0x3A, 0x1A, 0x1D, 0x00, 0x00, 0x01, 0x01,
556 0x32, 0x81, 0x20, 0x00, 0x00, 0x32, 0x28, 0x77, 0x32, 0x1B, 0x06, 0x06,
557 0x81, 0x1E, 0x1A, 0x45, 0x04, 0x77, 0x1A, 0x00, 0x00, 0x7A, 0x41, 0x00,
558 0x02, 0x03, 0x00, 0x5F, 0x1E, 0x7A, 0x03, 0x01, 0x02, 0x01, 0x01, 0x0F,
559 0x11, 0x02, 0x01, 0x01, 0x04, 0x10, 0x01, 0x0F, 0x11, 0x02, 0x01, 0x01,
560 0x08, 0x10, 0x01, 0x0F, 0x11, 0x01, 0x00, 0x28, 0x0D, 0x06, 0x10, 0x1A,
561 0x01, 0x00, 0x01, 0x18, 0x02, 0x00, 0x06, 0x03, 0x35, 0x04, 0x01, 0x36,
562 0x04, 0x80, 0x56, 0x01, 0x01, 0x28, 0x0D, 0x06, 0x10, 0x1A, 0x01, 0x01,
563 0x01, 0x10, 0x02, 0x00, 0x06, 0x03, 0x35, 0x04, 0x01, 0x36, 0x04, 0x80,
564 0x40, 0x01, 0x02, 0x28, 0x0D, 0x06, 0x0F, 0x1A, 0x01, 0x01, 0x01, 0x20,
565 0x02, 0x00, 0x06, 0x03, 0x35, 0x04, 0x01, 0x36, 0x04, 0x2B, 0x01, 0x03,
566 0x28, 0x0D, 0x06, 0x0E, 0x1A, 0x1A, 0x01, 0x10, 0x02, 0x00, 0x06, 0x03,
567 0x33, 0x04, 0x01, 0x34, 0x04, 0x17, 0x01, 0x04, 0x28, 0x0D, 0x06, 0x0E,
568 0x1A, 0x1A, 0x01, 0x20, 0x02, 0x00, 0x06, 0x03, 0x33, 0x04, 0x01, 0x34,
569 0x04, 0x03, 0x50, 0x1C, 0x1A, 0x00, 0x00, 0x7A, 0x01, 0x0C, 0x10, 0x1B,
570 0x43, 0x32, 0x01, 0x03, 0x0A, 0x11, 0x00, 0x00, 0x7A, 0x01, 0x0C, 0x10,
571 0x01, 0x01, 0x0D, 0x00, 0x00, 0x7A, 0x01, 0x0C, 0x10, 0x42, 0x00, 0x00,
572 0x14, 0x01, 0x00, 0x5C, 0x1F, 0x1B, 0x06, 0x1F, 0x01, 0x01, 0x28, 0x0D,
573 0x06, 0x06, 0x1A, 0x01, 0x00, 0x7E, 0x04, 0x11, 0x01, 0x02, 0x28, 0x0D,
574 0x06, 0x0A, 0x1A, 0x5E, 0x1F, 0x06, 0x03, 0x01, 0x10, 0x27, 0x04, 0x01,
575 0x1A, 0x04, 0x01, 0x1A, 0x61, 0x1F, 0x05, 0x34, 0x20, 0x06, 0x31, 0x67,
576 0x1F, 0x01, 0x14, 0x28, 0x0D, 0x06, 0x06, 0x1A, 0x01, 0x02, 0x27, 0x04,
577 0x23, 0x01, 0x15, 0x28, 0x0D, 0x06, 0x0A, 0x1A, 0x81, 0x0C, 0x06, 0x03,
578 0x01, 0x7F, 0x7E, 0x04, 0x13, 0x01, 0x16, 0x28, 0x0D, 0x06, 0x06, 0x1A,
579 0x01, 0x01, 0x27, 0x04, 0x07, 0x1A, 0x01, 0x04, 0x27, 0x01, 0x00, 0x1A,
580 0x13, 0x06, 0x03, 0x01, 0x08, 0x27, 0x00, 0x00, 0x14, 0x1B, 0x05, 0x10,
581 0x20, 0x06, 0x0D, 0x67, 0x1F, 0x01, 0x15, 0x0D, 0x06, 0x05, 0x1A, 0x81,
582 0x0C, 0x04, 0x01, 0x17, 0x00, 0x00, 0x81, 0x28, 0x01, 0x07, 0x11, 0x01,
583 0x01, 0x0E, 0x06, 0x02, 0x5A, 0x1C, 0x00, 0x01, 0x03, 0x00, 0x1D, 0x13,
584 0x06, 0x05, 0x02, 0x00, 0x68, 0x2C, 0x00, 0x81, 0x28, 0x1A, 0x04, 0x73,
585 0x00, 0x01, 0x14, 0x81, 0x2B, 0x01, 0x01, 0x81, 0x37, 0x1D, 0x1B, 0x01,
586 0x00, 0x81, 0x24, 0x01, 0x16, 0x81, 0x2B, 0x81, 0x2F, 0x1D, 0x00, 0x01,
587 0x81, 0x04, 0x81, 0x06, 0x08, 0x81, 0x02, 0x08, 0x81, 0x05, 0x08, 0x81,
588 0x07, 0x08, 0x81, 0x03, 0x08, 0x03, 0x00, 0x01, 0x01, 0x81, 0x37, 0x01,
589 0x27, 0x6E, 0x1F, 0x08, 0x71, 0x1F, 0x01, 0x01, 0x0B, 0x08, 0x02, 0x00,
590 0x06, 0x04, 0x46, 0x02, 0x00, 0x08, 0x81, 0x36, 0x74, 0x1E, 0x81, 0x35,
591 0x60, 0x01, 0x04, 0x12, 0x60, 0x01, 0x04, 0x08, 0x01, 0x1C, 0x23, 0x60,
592 0x01, 0x20, 0x81, 0x30, 0x6D, 0x6E, 0x1F, 0x81, 0x32, 0x71, 0x1F, 0x1B,
593 0x01, 0x01, 0x0B, 0x81, 0x35, 0x70, 0x32, 0x1B, 0x06, 0x11, 0x45, 0x28,
594 0x1E, 0x1B, 0x81, 0x23, 0x05, 0x02, 0x4A, 0x1C, 0x81, 0x35, 0x32, 0x46,
595 0x32, 0x04, 0x6C, 0x48, 0x01, 0x01, 0x81, 0x37, 0x01, 0x00, 0x81, 0x37,
596 0x02, 0x00, 0x06, 0x81, 0x2E, 0x02, 0x00, 0x81, 0x35, 0x81, 0x04, 0x06,
597 0x12, 0x01, 0x83, 0xFE, 0x01, 0x81, 0x35, 0x6A, 0x81, 0x04, 0x01, 0x04,
598 0x09, 0x1B, 0x81, 0x35, 0x45, 0x81, 0x32, 0x81, 0x06, 0x06, 0x1C, 0x01,
599 0x00, 0x81, 0x35, 0x6B, 0x81, 0x06, 0x01, 0x04, 0x09, 0x1B, 0x81, 0x35,
600 0x01, 0x02, 0x09, 0x1B, 0x81, 0x35, 0x01, 0x00, 0x81, 0x37, 0x01, 0x03,
601 0x09, 0x81, 0x31, 0x81, 0x02, 0x06, 0x0F, 0x01, 0x01, 0x81, 0x35, 0x01,
602 0x01, 0x81, 0x35, 0x65, 0x1F, 0x01, 0x08, 0x09, 0x81, 0x37, 0x81, 0x05,
603 0x06, 0x1F, 0x01, 0x0D, 0x81, 0x35, 0x81, 0x05, 0x01, 0x04, 0x09, 0x1B,
604 0x81, 0x35, 0x01, 0x02, 0x09, 0x81, 0x35, 0x30, 0x06, 0x04, 0x01, 0x03,
605 0x81, 0x34, 0x31, 0x06, 0x04, 0x01, 0x01, 0x81, 0x34, 0x81, 0x07, 0x1B,
606 0x06, 0x27, 0x01, 0x0A, 0x81, 0x35, 0x01, 0x04, 0x09, 0x1B, 0x81, 0x35,
607 0x47, 0x81, 0x35, 0x2E, 0x01, 0x00, 0x1B, 0x01, 0x20, 0x0A, 0x06, 0x0E,
608 0x81, 0x00, 0x10, 0x01, 0x01, 0x11, 0x06, 0x03, 0x1B, 0x81, 0x35, 0x44,
609 0x04, 0x6C, 0x48, 0x04, 0x01, 0x1A, 0x81, 0x03, 0x06, 0x0D, 0x01, 0x0B,
610 0x81, 0x35, 0x01, 0x02, 0x81, 0x35, 0x01, 0x82, 0x00, 0x81, 0x35, 0x00,
611 0x00, 0x01, 0x10, 0x81, 0x37, 0x5F, 0x1E, 0x1B, 0x81, 0x27, 0x06, 0x10,
612 0x81, 0x0A, 0x19, 0x1B, 0x46, 0x81, 0x36, 0x1B, 0x81, 0x35, 0x66, 0x32,
613 0x81, 0x30, 0x04, 0x12, 0x1B, 0x81, 0x25, 0x32, 0x81, 0x0A, 0x18, 0x1B,
614 0x44, 0x81, 0x36, 0x1B, 0x81, 0x37, 0x66, 0x32, 0x81, 0x30, 0x00, 0x00,
615 0x7C, 0x01, 0x14, 0x81, 0x37, 0x01, 0x0C, 0x81, 0x36, 0x66, 0x01, 0x0C,
616 0x81, 0x30, 0x00, 0x00, 0x39, 0x1B, 0x01, 0x00, 0x0D, 0x06, 0x02, 0x48,
617 0x00, 0x81, 0x28, 0x1A, 0x04, 0x72, 0x00, 0x1B, 0x81, 0x35, 0x81, 0x30,
618 0x00, 0x00, 0x1B, 0x81, 0x37, 0x81, 0x30, 0x00, 0x00, 0x01, 0x0B, 0x81,
619 0x37, 0x01, 0x03, 0x81, 0x36, 0x01, 0x00, 0x81, 0x36, 0x00, 0x01, 0x03,
620 0x00, 0x2F, 0x1A, 0x1B, 0x01, 0x10, 0x11, 0x06, 0x08, 0x01, 0x04, 0x81,
621 0x37, 0x02, 0x00, 0x81, 0x37, 0x1B, 0x01, 0x08, 0x11, 0x06, 0x08, 0x01,
622 0x03, 0x81, 0x37, 0x02, 0x00, 0x81, 0x37, 0x1B, 0x01, 0x20, 0x11, 0x06,
623 0x08, 0x01, 0x05, 0x81, 0x37, 0x02, 0x00, 0x81, 0x37, 0x1B, 0x01, 0x80,
624 0x40, 0x11, 0x06, 0x08, 0x01, 0x06, 0x81, 0x37, 0x02, 0x00, 0x81, 0x37,
625 0x01, 0x04, 0x11, 0x06, 0x08, 0x01, 0x02, 0x81, 0x37, 0x02, 0x00, 0x81,
626 0x37, 0x00, 0x00, 0x1B, 0x01, 0x08, 0x37, 0x81, 0x37, 0x81, 0x37, 0x00,
627 0x00, 0x1B, 0x01, 0x10, 0x37, 0x81, 0x37, 0x81, 0x35, 0x00, 0x00, 0x1B,
628 0x3A, 0x06, 0x02, 0x1A, 0x00, 0x81, 0x28, 0x1A, 0x04, 0x75
631 static const uint16_t t0_caddr
[] = {
754 #define T0_INTERPRETED 64
756 #define T0_ENTER(ip, rp, slot) do { \
757 const unsigned char *t0_newip; \
759 t0_newip = &t0_codeblock[t0_caddr[(slot) - T0_INTERPRETED]]; \
760 t0_lnum = t0_parse7E_unsigned(&t0_newip); \
762 *((rp) ++) = (uint32_t)((ip) - &t0_codeblock[0]) + (t0_lnum << 16); \
766 #define T0_DEFENTRY(name, slot) \
770 t0_context *t0ctx = ctx; \
771 t0ctx->ip = &t0_codeblock[0]; \
772 T0_ENTER(t0ctx->ip, t0ctx->rp, slot); \
775 T0_DEFENTRY(br_ssl_hs_client_init_main
, 136)
778 br_ssl_hs_client_run(void *t0ctx
)
781 const unsigned char *ip
;
783 #define T0_LOCAL(x) (*(rp - 2 - (x)))
784 #define T0_POP() (*-- dp)
785 #define T0_POPi() (*(int32_t *)(-- dp))
786 #define T0_PEEK(x) (*(dp - 1 - (x)))
787 #define T0_PEEKi(x) (*(int32_t *)(dp - 1 - (x)))
788 #define T0_PUSH(v) do { *dp = (v); dp ++; } while (0)
789 #define T0_PUSHi(v) do { *(int32_t *)dp = (v); dp ++; } while (0)
790 #define T0_RPOP() (*-- rp)
791 #define T0_RPOPi() (*(int32_t *)(-- rp))
792 #define T0_RPUSH(v) do { *rp = (v); rp ++; } while (0)
793 #define T0_RPUSHi(v) do { *(int32_t *)rp = (v); rp ++; } while (0)
794 #define T0_ROLL(x) do { \
795 size_t t0len = (size_t)(x); \
796 uint32_t t0tmp = *(dp - 1 - t0len); \
797 memmove(dp - t0len - 1, dp - t0len, t0len * sizeof *dp); \
800 #define T0_SWAP() do { \
801 uint32_t t0tmp = *(dp - 2); \
802 *(dp - 2) = *(dp - 1); \
805 #define T0_ROT() do { \
806 uint32_t t0tmp = *(dp - 3); \
807 *(dp - 3) = *(dp - 2); \
808 *(dp - 2) = *(dp - 1); \
811 #define T0_NROT() do { \
812 uint32_t t0tmp = *(dp - 1); \
813 *(dp - 1) = *(dp - 2); \
814 *(dp - 2) = *(dp - 3); \
817 #define T0_PICK(x) do { \
818 uint32_t t0depth = (x); \
819 T0_PUSH(T0_PEEK(t0depth)); \
821 #define T0_CO() do { \
824 #define T0_RET() break
826 dp
= ((t0_context
*)t0ctx
)->dp
;
827 rp
= ((t0_context
*)t0ctx
)->rp
;
828 ip
= ((t0_context
*)t0ctx
)->ip
;
832 t0x
= t0_parse7E_unsigned(&ip
);
833 if (t0x
< T0_INTERPRETED
) {
845 ip
= &t0_codeblock
[t0x
];
847 case 1: /* literal constant */
848 T0_PUSHi(t0_parse7E_signed(&ip
));
850 case 2: /* read local */
851 T0_PUSH(T0_LOCAL(t0_parse7E_unsigned(&ip
)));
853 case 3: /* write local */
854 T0_LOCAL(t0_parse7E_unsigned(&ip
)) = T0_POP();
857 t0off
= t0_parse7E_signed(&ip
);
860 case 5: /* jump if */
861 t0off
= t0_parse7E_signed(&ip
);
866 case 6: /* jump if not */
867 t0off
= t0_parse7E_signed(&ip
);
875 uint32_t b
= T0_POP();
876 uint32_t a
= T0_POP();
884 uint32_t b
= T0_POP();
885 uint32_t a
= T0_POP();
893 uint32_t b
= T0_POP();
894 uint32_t a
= T0_POP();
902 int32_t b
= T0_POPi();
903 int32_t a
= T0_POPi();
904 T0_PUSH(-(uint32_t)(a
< b
));
911 int c
= (int)T0_POPi();
912 uint32_t x
= T0_POP();
920 uint32_t b
= T0_POP();
921 uint32_t a
= T0_POP();
922 T0_PUSH(-(uint32_t)(a
!= b
));
929 uint32_t b
= T0_POP();
930 uint32_t a
= T0_POP();
931 T0_PUSH(-(uint32_t)(a
== b
));
938 int32_t b
= T0_POPi();
939 int32_t a
= T0_POPi();
940 T0_PUSH(-(uint32_t)(a
> b
));
947 int32_t b
= T0_POPi();
948 int32_t a
= T0_POPi();
949 T0_PUSH(-(uint32_t)(a
>= b
));
956 int c
= (int)T0_POPi();
957 int32_t x
= T0_POPi();
965 uint32_t b
= T0_POP();
966 uint32_t a
= T0_POP();
974 size_t len
= (size_t)T0_POP();
975 void *addr
= (unsigned char *)ENG
+ (size_t)T0_POP();
976 memset(addr
, 0, len
);
983 T0_PUSHi(-(ENG
->hlen_out
> 0));
993 /* compute-Finished-inner */
995 int prf_id
= T0_POP();
996 int from_client
= T0_POPi();
997 unsigned char seed
[48];
1000 br_tls_prf_impl prf
= br_ssl_engine_get_PRF(ENG
, prf_id
);
1001 if (ENG
->session
.version
>= BR_TLS12
) {
1002 seed_len
= br_multihash_out(&ENG
->mhash
, prf_id
, seed
);
1004 br_multihash_out(&ENG
->mhash
, br_md5_ID
, seed
);
1005 br_multihash_out(&ENG
->mhash
, br_sha1_ID
, seed
+ 16);
1008 prf(ENG
->pad
, 12, ENG
->session
.master_secret
,
1009 sizeof ENG
->session
.master_secret
,
1010 from_client
? "client finished" : "server finished",
1018 size_t addr
= T0_POP();
1019 T0_PUSH(t0_datablock
[addr
]);
1033 unsigned prf_id
= T0_POP();
1034 unsigned ecdhe
= T0_POP();
1037 x
= make_pms_ecdh(CTX
, ecdhe
, prf_id
);
1039 br_ssl_engine_fail(ENG
, -x
);
1048 /* do-rsa-encrypt */
1052 x
= make_pms_rsa(CTX
, T0_POP());
1054 br_ssl_engine_fail(ENG
, -x
);
1069 T0_PUSH(T0_PEEK(0));
1075 br_ssl_engine_fail(ENG
, (int)T0_POPi());
1083 br_ssl_engine_flush_record(ENG
);
1090 size_t addr
= (size_t)T0_POP();
1091 T0_PUSH(*(uint16_t *)((unsigned char *)ENG
+ addr
));
1098 size_t addr
= (size_t)T0_POP();
1099 T0_PUSH(*((unsigned char *)ENG
+ addr
));
1106 T0_PUSHi(-(ENG
->hlen_in
!= 0));
1113 size_t len
= (size_t)T0_POP();
1114 void *addr2
= (unsigned char *)ENG
+ (size_t)T0_POP();
1115 void *addr1
= (unsigned char *)ENG
+ (size_t)T0_POP();
1116 int x
= memcmp(addr1
, addr2
, len
);
1117 T0_PUSH((uint32_t)-(x
== 0));
1124 size_t len
= (size_t)T0_POP();
1125 void *src
= (unsigned char *)ENG
+ (size_t)T0_POP();
1126 void *dst
= (unsigned char *)ENG
+ (size_t)T0_POP();
1127 memcpy(dst
, src
, len
);
1134 size_t len
= (size_t)T0_POP();
1135 void *addr
= (unsigned char *)ENG
+ (size_t)T0_POP();
1136 br_hmac_drbg_generate(&ENG
->rng
, addr
, len
);
1141 /* more-incoming-bytes? */
1143 T0_PUSHi(ENG
->hlen_in
!= 0 || !br_ssl_engine_recvrec_finished(ENG
));
1148 /* multihash-init */
1150 br_multihash_init(&ENG
->mhash
);
1157 uint32_t a
= T0_POP();
1165 uint32_t b
= T0_POP();
1166 uint32_t a
= T0_POP();
1173 T0_PUSH(T0_PEEK(1));
1177 /* read-chunk-native */
1179 size_t clen
= ENG
->hlen_in
;
1185 if ((size_t)len
< clen
) {
1188 memcpy((unsigned char *)ENG
+ addr
, ENG
->hbuf_in
, clen
);
1189 if (ENG
->record_type_in
== BR_SSL_HANDSHAKE
) {
1190 br_multihash_update(&ENG
->mhash
, ENG
->hbuf_in
, clen
);
1192 T0_PUSH(addr
+ (uint32_t)clen
);
1193 T0_PUSH(len
- (uint32_t)clen
);
1194 ENG
->hbuf_in
+= clen
;
1195 ENG
->hlen_in
-= clen
;
1203 if (ENG
->hlen_in
> 0) {
1206 x
= *ENG
->hbuf_in
++;
1207 if (ENG
->record_type_in
== BR_SSL_HANDSHAKE
) {
1208 br_multihash_update(&ENG
->mhash
, &x
, 1);
1221 size_t addr
= (size_t)T0_POP();
1222 *(uint16_t *)((unsigned char *)ENG
+ addr
) = (uint16_t)T0_POP();
1229 size_t addr
= (size_t)T0_POP();
1230 *((unsigned char *)ENG
+ addr
) = (unsigned char)T0_POP();
1237 void *str
= (unsigned char *)ENG
+ (size_t)T0_POP();
1238 T0_PUSH((uint32_t)strlen(str
));
1243 /* supported-curves */
1245 uint32_t x
= ENG
->iec
== NULL
? 0 : ENG
->iec
->supported_curves
;
1251 /* supported-hash-functions */
1258 for (i
= br_sha1_ID
; i
<= br_sha512_ID
; i
++) {
1259 if (br_multihash_getimpl(&ENG
->mhash
, i
)) {
1270 /* supports-ecdsa? */
1272 T0_PUSHi(-(CTX
->iecdsa
!= 0));
1277 /* supports-rsa-sign? */
1279 T0_PUSHi(-(CTX
->irsavrfy
!= 0));
1289 /* switch-aesgcm-in */
1291 int is_client
, prf_id
;
1292 unsigned cipher_key_len
;
1294 cipher_key_len
= T0_POP();
1296 is_client
= T0_POP();
1297 br_ssl_engine_switch_gcm_in(ENG
, is_client
, prf_id
,
1298 ENG
->iaes_ctr
, cipher_key_len
);
1303 /* switch-aesgcm-out */
1305 int is_client
, prf_id
;
1306 unsigned cipher_key_len
;
1308 cipher_key_len
= T0_POP();
1310 is_client
= T0_POP();
1311 br_ssl_engine_switch_gcm_out(ENG
, is_client
, prf_id
,
1312 ENG
->iaes_ctr
, cipher_key_len
);
1319 int is_client
, prf_id
, mac_id
, aes
;
1320 unsigned cipher_key_len
;
1322 cipher_key_len
= T0_POP();
1326 is_client
= T0_POP();
1327 br_ssl_engine_switch_cbc_in(ENG
, is_client
, prf_id
, mac_id
,
1328 aes
? ENG
->iaes_cbcdec
: ENG
->ides_cbcdec
, cipher_key_len
);
1333 /* switch-cbc-out */
1335 int is_client
, prf_id
, mac_id
, aes
;
1336 unsigned cipher_key_len
;
1338 cipher_key_len
= T0_POP();
1342 is_client
= T0_POP();
1343 br_ssl_engine_switch_cbc_out(ENG
, is_client
, prf_id
, mac_id
,
1344 aes
? ENG
->iaes_cbcenc
: ENG
->ides_cbcenc
, cipher_key_len
);
1351 int c
= (int)T0_POPi();
1352 uint32_t x
= T0_POP();
1358 /* verify-SKE-sig */
1360 size_t sig_len
= T0_POP();
1361 int use_rsa
= T0_POPi();
1362 int hash
= T0_POPi();
1364 T0_PUSH(verify_SKE_sig(CTX
, hash
, use_rsa
, sig_len
));
1369 /* write-blob-chunk */
1371 size_t clen
= ENG
->hlen_out
;
1377 if ((size_t)len
< clen
) {
1380 memcpy(ENG
->hbuf_out
, (unsigned char *)ENG
+ addr
, clen
);
1381 if (ENG
->record_type_out
== BR_SSL_HANDSHAKE
) {
1382 br_multihash_update(&ENG
->mhash
, ENG
->hbuf_out
, clen
);
1384 T0_PUSH(addr
+ (uint32_t)clen
);
1385 T0_PUSH(len
- (uint32_t)clen
);
1386 ENG
->hbuf_out
+= clen
;
1387 ENG
->hlen_out
-= clen
;
1397 x
= (unsigned char)T0_POP();
1398 if (ENG
->hlen_out
> 0) {
1399 if (ENG
->record_type_out
== BR_SSL_HANDSHAKE
) {
1400 br_multihash_update(&ENG
->mhash
, &x
, 1);
1402 *ENG
->hbuf_out
++ = x
;
1414 const br_x509_class
*xc
;
1417 xc
= *(ENG
->x509ctx
);
1419 xc
->append(ENG
->x509ctx
, ENG
->pad
, len
);
1426 const br_x509_class
*xc
;
1428 xc
= *(ENG
->x509ctx
);
1429 xc
->end_cert(ENG
->x509ctx
);
1434 /* x509-end-chain */
1436 const br_x509_class
*xc
;
1438 xc
= *(ENG
->x509ctx
);
1439 T0_PUSH(xc
->end_chain(ENG
->x509ctx
));
1444 /* x509-start-cert */
1446 const br_x509_class
*xc
;
1448 xc
= *(ENG
->x509ctx
);
1449 xc
->start_cert(ENG
->x509ctx
, T0_POP());
1454 /* x509-start-chain */
1456 const br_x509_class
*xc
;
1458 xc
= *(ENG
->x509ctx
);
1459 xc
->start_chain(ENG
->x509ctx
, T0_POP(), ENG
->server_name
);
1466 T0_ENTER(ip
, rp
, t0x
);
1470 ((t0_context
*)t0ctx
)->dp
= dp
;
1471 ((t0_context
*)t0ctx
)->rp
= rp
;
1472 ((t0_context
*)t0ctx
)->ip
= ip
;