Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/bearssl/src/x509/x509_minimal.c
39507 views
1
/* Automatically generated code; do not modify directly. */
2
3
#include <stddef.h>
4
#include <stdint.h>
5
6
typedef struct {
7
uint32_t *dp;
8
uint32_t *rp;
9
const unsigned char *ip;
10
} t0_context;
11
12
static uint32_t
13
t0_parse7E_unsigned(const unsigned char **p)
14
{
15
uint32_t x;
16
17
x = 0;
18
for (;;) {
19
unsigned y;
20
21
y = *(*p) ++;
22
x = (x << 7) | (uint32_t)(y & 0x7F);
23
if (y < 0x80) {
24
return x;
25
}
26
}
27
}
28
29
static int32_t
30
t0_parse7E_signed(const unsigned char **p)
31
{
32
int neg;
33
uint32_t x;
34
35
neg = ((**p) >> 6) & 1;
36
x = (uint32_t)-neg;
37
for (;;) {
38
unsigned y;
39
40
y = *(*p) ++;
41
x = (x << 7) | (uint32_t)(y & 0x7F);
42
if (y < 0x80) {
43
if (neg) {
44
return -(int32_t)~x - 1;
45
} else {
46
return (int32_t)x;
47
}
48
}
49
}
50
}
51
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)
60
61
/* static const unsigned char t0_datablock[]; */
62
63
64
void br_x509_minimal_init_main(void *t0ctx);
65
66
void br_x509_minimal_run(void *t0ctx);
67
68
69
70
#include "inner.h"
71
72
73
74
75
76
#include "inner.h"
77
78
/*
79
* Implementation Notes
80
* --------------------
81
*
82
* The C code pushes the data by chunks; all decoding is done in the
83
* T0 code. The cert_length value is set to the certificate length when
84
* a new certificate is started; the T0 code picks it up as outer limit,
85
* and decoding functions use it to ensure that no attempt is made at
86
* reading past it. The T0 code also checks that once the certificate is
87
* decoded, there are no trailing bytes.
88
*
89
* The T0 code sets cert_length to 0 when the certificate is fully
90
* decoded.
91
*
92
* The C code must still perform two checks:
93
*
94
* -- If the certificate length is 0, then the T0 code will not be
95
* invoked at all. This invalid condition must thus be reported by the
96
* C code.
97
*
98
* -- When reaching the end of certificate, the C code must verify that
99
* the certificate length has been set to 0, thereby signaling that
100
* the T0 code properly decoded a certificate.
101
*
102
* Processing of a chain works in the following way:
103
*
104
* -- The error flag is set to a non-zero value when validation is
105
* finished. The value is either BR_ERR_X509_OK (validation is
106
* successful) or another non-zero error code. When a non-zero error
107
* code is obtained, the remaining bytes in the current certificate and
108
* the subsequent certificates (if any) are completely ignored.
109
*
110
* -- Each certificate is decoded in due course, with the following
111
* "interesting points":
112
*
113
* -- Start of the TBS: the multihash engine is reset and activated.
114
*
115
* -- Start of the issuer DN: the secondary hash engine is started,
116
* to process the encoded issuer DN.
117
*
118
* -- End of the issuer DN: the secondary hash engine is stopped. The
119
* resulting hash value is computed and then copied into the
120
* next_dn_hash[] buffer.
121
*
122
* -- Start of the subject DN: the secondary hash engine is started,
123
* to process the encoded subject DN.
124
*
125
* -- For the EE certificate only: the Common Name, if any, is matched
126
* against the expected server name.
127
*
128
* -- End of the subject DN: the secondary hash engine is stopped. The
129
* resulting hash value is computed into the pad. It is then processed:
130
*
131
* -- If this is the EE certificate, then the hash is ignored
132
* (except for direct trust processing, see later; the hash is
133
* simply left in current_dn_hash[]).
134
*
135
* -- Otherwise, the hashed subject DN is compared with the saved
136
* hash value (in saved_dn_hash[]). They must match.
137
*
138
* Either way, the next_dn_hash[] value is then copied into the
139
* saved_dn_hash[] value. Thus, at that point, saved_dn_hash[]
140
* contains the hash of the issuer DN for the current certificate,
141
* and current_dn_hash[] contains the hash of the subject DN for the
142
* current certificate.
143
*
144
* -- Public key: it is decoded into the cert_pkey[] buffer. Unknown
145
* key types are reported at that point.
146
*
147
* -- If this is the EE certificate, then the key type is compared
148
* with the expected key type (initialization parameter). The public
149
* key data is copied to ee_pkey_data[]. The key and hashed subject
150
* DN are also compared with the "direct trust" keys; if the key
151
* and DN are matched, then validation ends with a success.
152
*
153
* -- Otherwise, the saved signature (cert_sig[]) is verified
154
* against the saved TBS hash (tbs_hash[]) and that freshly
155
* decoded public key. Failure here ends validation with an error.
156
*
157
* -- Extensions: extension values are processed in due order.
158
*
159
* -- Basic Constraints: for all certificates except EE, must be
160
* present, indicate a CA, and have a path length compatible with
161
* the chain length so far.
162
*
163
* -- Key Usage: for the EE, if present, must allow signatures
164
* or encryption/key exchange, as required for the cipher suite.
165
* For non-EE, if present, must have the "certificate sign" bit.
166
*
167
* -- Subject Alt Name: for the EE, dNSName names are matched
168
* against the server name. Ignored for non-EE.
169
*
170
* -- Authority Key Identifier, Subject Key Identifier, Issuer
171
* Alt Name, Subject Directory Attributes, CRL Distribution Points
172
* Freshest CRL, Authority Info Access and Subject Info Access
173
* extensions are always ignored: they either contain only
174
* informative data, or they relate to revocation processing, which
175
* we explicitly do not support.
176
*
177
* -- All other extensions are ignored if non-critical. If a
178
* critical extension other than the ones above is encountered,
179
* then a failure is reported.
180
*
181
* -- End of the TBS: the multihash engine is stopped.
182
*
183
* -- Signature algorithm: the signature algorithm on the
184
* certificate is decoded. A failure is reported if that algorithm
185
* is unknown. The hashed TBS corresponding to the signature hash
186
* function is computed and stored in tbs_hash[] (if not supported,
187
* then a failure is reported). The hash OID and length are stored
188
* in cert_sig_hash_oid and cert_sig_hash_len.
189
*
190
* -- Signature value: the signature value is copied into the
191
* cert_sig[] array.
192
*
193
* -- Certificate end: the hashed issuer DN (saved_dn_hash[]) is
194
* looked up in the trust store (CA trust anchors only); for all
195
* that match, the signature (cert_sig[]) is verified against the
196
* anchor public key (hashed TBS is in tbs_hash[]). If one of these
197
* signatures is valid, then validation ends with a success.
198
*
199
* -- If the chain end is reached without obtaining a validation success,
200
* then validation is reported as failed.
201
*/
202
203
#if BR_USE_UNIX_TIME
204
#include <time.h>
205
#endif
206
207
#if BR_USE_WIN32_TIME
208
#include <windows.h>
209
#endif
210
211
/*
212
* The T0 compiler will produce these prototypes declarations in the
213
* header.
214
*
215
void br_x509_minimal_init_main(void *ctx);
216
void br_x509_minimal_run(void *ctx);
217
*/
218
219
/* see bearssl_x509.h */
220
void
221
br_x509_minimal_init(br_x509_minimal_context *ctx,
222
const br_hash_class *dn_hash_impl,
223
const br_x509_trust_anchor *trust_anchors, size_t trust_anchors_num)
224
{
225
memset(ctx, 0, sizeof *ctx);
226
ctx->vtable = &br_x509_minimal_vtable;
227
ctx->dn_hash_impl = dn_hash_impl;
228
ctx->trust_anchors = trust_anchors;
229
ctx->trust_anchors_num = trust_anchors_num;
230
}
231
232
static void
233
xm_start_chain(const br_x509_class **ctx, const char *server_name)
234
{
235
br_x509_minimal_context *cc;
236
size_t u;
237
238
cc = (br_x509_minimal_context *)(void *)ctx;
239
for (u = 0; u < cc->num_name_elts; u ++) {
240
cc->name_elts[u].status = 0;
241
cc->name_elts[u].buf[0] = 0;
242
}
243
memset(&cc->pkey, 0, sizeof cc->pkey);
244
cc->num_certs = 0;
245
cc->err = 0;
246
cc->cpu.dp = cc->dp_stack;
247
cc->cpu.rp = cc->rp_stack;
248
br_x509_minimal_init_main(&cc->cpu);
249
if (server_name == NULL || *server_name == 0) {
250
cc->server_name = NULL;
251
} else {
252
cc->server_name = server_name;
253
}
254
}
255
256
static void
257
xm_start_cert(const br_x509_class **ctx, uint32_t length)
258
{
259
br_x509_minimal_context *cc;
260
261
cc = (br_x509_minimal_context *)(void *)ctx;
262
if (cc->err != 0) {
263
return;
264
}
265
if (length == 0) {
266
cc->err = BR_ERR_X509_TRUNCATED;
267
return;
268
}
269
cc->cert_length = length;
270
}
271
272
static void
273
xm_append(const br_x509_class **ctx, const unsigned char *buf, size_t len)
274
{
275
br_x509_minimal_context *cc;
276
277
cc = (br_x509_minimal_context *)(void *)ctx;
278
if (cc->err != 0) {
279
return;
280
}
281
cc->hbuf = buf;
282
cc->hlen = len;
283
br_x509_minimal_run(&cc->cpu);
284
}
285
286
static void
287
xm_end_cert(const br_x509_class **ctx)
288
{
289
br_x509_minimal_context *cc;
290
291
cc = (br_x509_minimal_context *)(void *)ctx;
292
if (cc->err == 0 && cc->cert_length != 0) {
293
cc->err = BR_ERR_X509_TRUNCATED;
294
}
295
cc->num_certs ++;
296
}
297
298
static unsigned
299
xm_end_chain(const br_x509_class **ctx)
300
{
301
br_x509_minimal_context *cc;
302
303
cc = (br_x509_minimal_context *)(void *)ctx;
304
if (cc->err == 0) {
305
if (cc->num_certs == 0) {
306
cc->err = BR_ERR_X509_EMPTY_CHAIN;
307
} else {
308
cc->err = BR_ERR_X509_NOT_TRUSTED;
309
}
310
} else if (cc->err == BR_ERR_X509_OK) {
311
return 0;
312
}
313
return (unsigned)cc->err;
314
}
315
316
static const br_x509_pkey *
317
xm_get_pkey(const br_x509_class *const *ctx, unsigned *usages)
318
{
319
br_x509_minimal_context *cc;
320
321
cc = (br_x509_minimal_context *)(void *)ctx;
322
if (cc->err == BR_ERR_X509_OK
323
|| cc->err == BR_ERR_X509_NOT_TRUSTED)
324
{
325
if (usages != NULL) {
326
*usages = cc->key_usages;
327
}
328
return &((br_x509_minimal_context *)(void *)ctx)->pkey;
329
} else {
330
return NULL;
331
}
332
}
333
334
/* see bearssl_x509.h */
335
const br_x509_class br_x509_minimal_vtable = {
336
sizeof(br_x509_minimal_context),
337
xm_start_chain,
338
xm_start_cert,
339
xm_append,
340
xm_end_cert,
341
xm_end_chain,
342
xm_get_pkey
343
};
344
345
#define CTX ((br_x509_minimal_context *)(void *)((unsigned char *)t0ctx - offsetof(br_x509_minimal_context, cpu)))
346
#define CONTEXT_NAME br_x509_minimal_context
347
348
#define DNHASH_LEN ((CTX->dn_hash_impl->desc >> BR_HASHDESC_OUT_OFF) & BR_HASHDESC_OUT_MASK)
349
350
/*
351
* Hash a DN (from a trust anchor) into the provided buffer. This uses the
352
* DN hash implementation and context structure from the X.509 engine
353
* context.
354
*/
355
static void
356
hash_dn(br_x509_minimal_context *ctx, const void *dn, size_t len,
357
unsigned char *out)
358
{
359
ctx->dn_hash_impl->init(&ctx->dn_hash.vtable);
360
ctx->dn_hash_impl->update(&ctx->dn_hash.vtable, dn, len);
361
ctx->dn_hash_impl->out(&ctx->dn_hash.vtable, out);
362
}
363
364
/*
365
* Compare two big integers for equality. The integers use unsigned big-endian
366
* encoding; extra leading bytes (of value 0) are allowed.
367
*/
368
static int
369
eqbigint(const unsigned char *b1, size_t len1,
370
const unsigned char *b2, size_t len2)
371
{
372
while (len1 > 0 && *b1 == 0) {
373
b1 ++;
374
len1 --;
375
}
376
while (len2 > 0 && *b2 == 0) {
377
b2 ++;
378
len2 --;
379
}
380
if (len1 != len2) {
381
return 0;
382
}
383
return memcmp(b1, b2, len1) == 0;
384
}
385
386
/*
387
* Compare two strings for equality, in a case-insensitive way. This
388
* function handles casing only for ASCII letters.
389
*/
390
static int
391
eqnocase(const void *s1, const void *s2, size_t len)
392
{
393
const unsigned char *buf1, *buf2;
394
395
buf1 = s1;
396
buf2 = s2;
397
while (len -- > 0) {
398
int x1, x2;
399
400
x1 = *buf1 ++;
401
x2 = *buf2 ++;
402
if (x1 >= 'A' && x1 <= 'Z') {
403
x1 += 'a' - 'A';
404
}
405
if (x2 >= 'A' && x2 <= 'Z') {
406
x2 += 'a' - 'A';
407
}
408
if (x1 != x2) {
409
return 0;
410
}
411
}
412
return 1;
413
}
414
415
static int verify_signature(br_x509_minimal_context *ctx,
416
const br_x509_pkey *pk);
417
418
419
420
static const unsigned char t0_datablock[] = {
421
0x00, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x09,
422
0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x05, 0x09, 0x2A, 0x86,
423
0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0E, 0x09, 0x2A, 0x86, 0x48, 0x86,
424
0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D,
425
0x01, 0x01, 0x0C, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01,
426
0x0D, 0x05, 0x2B, 0x0E, 0x03, 0x02, 0x1A, 0x09, 0x60, 0x86, 0x48, 0x01,
427
0x65, 0x03, 0x04, 0x02, 0x04, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03,
428
0x04, 0x02, 0x01, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02,
429
0x02, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03, 0x07,
430
0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x02, 0x01, 0x08, 0x2A, 0x86, 0x48, 0xCE,
431
0x3D, 0x03, 0x01, 0x07, 0x05, 0x2B, 0x81, 0x04, 0x00, 0x22, 0x05, 0x2B,
432
0x81, 0x04, 0x00, 0x23, 0x07, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x04, 0x01,
433
0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x04, 0x03, 0x01, 0x08, 0x2A, 0x86,
434
0x48, 0xCE, 0x3D, 0x04, 0x03, 0x02, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D,
435
0x04, 0x03, 0x03, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x04, 0x03, 0x04,
436
0x03, 0x55, 0x04, 0x03, 0x00, 0x1F, 0x03, 0xFC, 0x07, 0x7F, 0x0B, 0x5E,
437
0x0F, 0x1F, 0x12, 0xFE, 0x16, 0xBF, 0x1A, 0x9F, 0x1E, 0x7E, 0x22, 0x3F,
438
0x26, 0x1E, 0x29, 0xDF, 0x00, 0x1F, 0x03, 0xFD, 0x07, 0x9F, 0x0B, 0x7E,
439
0x0F, 0x3F, 0x13, 0x1E, 0x16, 0xDF, 0x1A, 0xBF, 0x1E, 0x9E, 0x22, 0x5F,
440
0x26, 0x3E, 0x29, 0xFF, 0x03, 0x55, 0x1D, 0x13, 0x03, 0x55, 0x1D, 0x0F,
441
0x03, 0x55, 0x1D, 0x11, 0x03, 0x55, 0x1D, 0x20, 0x08, 0x2B, 0x06, 0x01,
442
0x05, 0x05, 0x07, 0x02, 0x01, 0x03, 0x55, 0x1D, 0x23, 0x03, 0x55, 0x1D,
443
0x0E, 0x03, 0x55, 0x1D, 0x12, 0x03, 0x55, 0x1D, 0x09, 0x03, 0x55, 0x1D,
444
0x1F, 0x03, 0x55, 0x1D, 0x2E, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07,
445
0x01, 0x01, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x0B
446
};
447
448
static const unsigned char t0_codeblock[] = {
449
0x00, 0x01, 0x00, 0x0D, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x01,
450
0x00, 0x11, 0x00, 0x00, 0x01, 0x01, 0x09, 0x00, 0x00, 0x01, 0x01, 0x0A,
451
0x00, 0x00, 0x25, 0x25, 0x00, 0x00, 0x01,
452
T0_INT1(BR_ERR_X509_BAD_BOOLEAN), 0x00, 0x00, 0x01,
453
T0_INT1(BR_ERR_X509_BAD_DN), 0x00, 0x00, 0x01,
454
T0_INT1(BR_ERR_X509_BAD_SERVER_NAME), 0x00, 0x00, 0x01,
455
T0_INT1(BR_ERR_X509_BAD_TAG_CLASS), 0x00, 0x00, 0x01,
456
T0_INT1(BR_ERR_X509_BAD_TAG_VALUE), 0x00, 0x00, 0x01,
457
T0_INT1(BR_ERR_X509_BAD_TIME), 0x00, 0x00, 0x01,
458
T0_INT1(BR_ERR_X509_CRITICAL_EXTENSION), 0x00, 0x00, 0x01,
459
T0_INT1(BR_ERR_X509_DN_MISMATCH), 0x00, 0x00, 0x01,
460
T0_INT1(BR_ERR_X509_EXPIRED), 0x00, 0x00, 0x01,
461
T0_INT1(BR_ERR_X509_EXTRA_ELEMENT), 0x00, 0x00, 0x01,
462
T0_INT1(BR_ERR_X509_FORBIDDEN_KEY_USAGE), 0x00, 0x00, 0x01,
463
T0_INT1(BR_ERR_X509_INDEFINITE_LENGTH), 0x00, 0x00, 0x01,
464
T0_INT1(BR_ERR_X509_INNER_TRUNC), 0x00, 0x00, 0x01,
465
T0_INT1(BR_ERR_X509_LIMIT_EXCEEDED), 0x00, 0x00, 0x01,
466
T0_INT1(BR_ERR_X509_NOT_CA), 0x00, 0x00, 0x01,
467
T0_INT1(BR_ERR_X509_NOT_CONSTRUCTED), 0x00, 0x00, 0x01,
468
T0_INT1(BR_ERR_X509_NOT_PRIMITIVE), 0x00, 0x00, 0x01,
469
T0_INT1(BR_ERR_X509_OVERFLOW), 0x00, 0x00, 0x01,
470
T0_INT1(BR_ERR_X509_PARTIAL_BYTE), 0x00, 0x00, 0x01,
471
T0_INT1(BR_ERR_X509_UNEXPECTED), 0x00, 0x00, 0x01,
472
T0_INT1(BR_ERR_X509_UNSUPPORTED), 0x00, 0x00, 0x01,
473
T0_INT1(BR_ERR_X509_WEAK_PUBLIC_KEY), 0x00, 0x00, 0x01,
474
T0_INT1(BR_KEYTYPE_EC), 0x00, 0x00, 0x01, T0_INT1(BR_KEYTYPE_RSA),
475
0x00, 0x00, 0x01, T0_INT2(offsetof(CONTEXT_NAME, cert_length)), 0x00,
476
0x00, 0x01, T0_INT2(offsetof(CONTEXT_NAME, cert_sig)), 0x00, 0x00,
477
0x01, T0_INT2(offsetof(CONTEXT_NAME, cert_sig_hash_len)), 0x00, 0x00,
478
0x01, T0_INT2(offsetof(CONTEXT_NAME, cert_sig_hash_oid)), 0x00, 0x00,
479
0x01, T0_INT2(offsetof(CONTEXT_NAME, cert_sig_len)), 0x00, 0x00, 0x01,
480
T0_INT2(offsetof(CONTEXT_NAME, cert_signer_key_type)), 0x00, 0x00,
481
0x01, T0_INT2(offsetof(CONTEXT_NAME, current_dn_hash)), 0x00, 0x00,
482
0x01, T0_INT2(offsetof(CONTEXT_NAME, key_usages)), 0x00, 0x00, 0x01,
483
T0_INT2(offsetof(br_x509_minimal_context, pkey_data)), 0x01,
484
T0_INT2(BR_X509_BUFSIZE_KEY), 0x00, 0x00, 0x01,
485
T0_INT2(offsetof(CONTEXT_NAME, min_rsa_size)), 0x00, 0x00, 0x01,
486
T0_INT2(offsetof(CONTEXT_NAME, next_dn_hash)), 0x00, 0x00, 0x01,
487
T0_INT2(offsetof(CONTEXT_NAME, num_certs)), 0x00, 0x00, 0x01,
488
T0_INT2(offsetof(CONTEXT_NAME, pad)), 0x00, 0x00, 0x01,
489
T0_INT2(offsetof(CONTEXT_NAME, saved_dn_hash)), 0x00, 0x00, 0x01, 0x80,
490
0x73, 0x00, 0x00, 0x01, 0x80, 0x7C, 0x00, 0x00, 0x01, 0x81, 0x02, 0x00,
491
0x00, 0x8F, 0x05, 0x05, 0x33, 0x41, 0x01, 0x00, 0x00, 0x33, 0x01, 0x0A,
492
0x0E, 0x09, 0x01, 0x9A, 0xFF, 0xB8, 0x00, 0x0A, 0x00, 0x00, 0x01, 0x82,
493
0x19, 0x00, 0x00, 0x01, 0x82, 0x01, 0x00, 0x00, 0x01, 0x81, 0x68, 0x00,
494
0x02, 0x03, 0x00, 0x03, 0x01, 0x26, 0x02, 0x01, 0x13, 0x3A, 0x02, 0x00,
495
0x0F, 0x15, 0x00, 0x00, 0x01, 0x81, 0x74, 0x00, 0x00, 0x05, 0x02, 0x51,
496
0x29, 0x00, 0x00, 0x06, 0x02, 0x52, 0x29, 0x00, 0x00, 0x01, 0x10, 0x74,
497
0x00, 0x00, 0x11, 0x05, 0x02, 0x55, 0x29, 0x71, 0x00, 0x00, 0x11, 0x05,
498
0x02, 0x55, 0x29, 0x72, 0x00, 0x00, 0x06, 0x02, 0x4B, 0x29, 0x00, 0x00,
499
0x01, 0x82, 0x11, 0x00, 0x00, 0x26, 0x21, 0x01, 0x08, 0x0E, 0x3A, 0x3F,
500
0x21, 0x09, 0x00, 0x0B, 0x03, 0x00, 0x5A, 0x2B, 0xAC, 0x38, 0xAC, 0xB0,
501
0x26, 0x01, 0x20, 0x11, 0x06, 0x11, 0x25, 0x71, 0xAA, 0xB0, 0x01, 0x02,
502
0x75, 0xAD, 0x01, 0x02, 0x12, 0x06, 0x02, 0x56, 0x29, 0x76, 0xB0, 0x01,
503
0x02, 0x75, 0xAB, 0xAC, 0xBF, 0x99, 0x64, 0x60, 0x22, 0x16, 0xAC, 0xA4,
504
0x03, 0x01, 0x03, 0x02, 0xA4, 0x02, 0x02, 0x02, 0x01, 0x19, 0x06, 0x02,
505
0x4A, 0x29, 0x76, 0x02, 0x00, 0x06, 0x05, 0x9A, 0x03, 0x03, 0x04, 0x09,
506
0x99, 0x60, 0x67, 0x22, 0x28, 0x05, 0x02, 0x49, 0x29, 0x67, 0x64, 0x22,
507
0x16, 0xAC, 0xAC, 0x9B, 0x05, 0x02, 0x56, 0x29, 0xB9, 0x27, 0x06, 0x27,
508
0xBF, 0xA1, 0xAC, 0x62, 0xA7, 0x03, 0x05, 0x62, 0x3A, 0x02, 0x05, 0x09,
509
0x3A, 0x02, 0x05, 0x0A, 0xA7, 0x03, 0x06, 0x76, 0x63, 0x2A, 0x01, 0x81,
510
0x00, 0x09, 0x02, 0x05, 0x12, 0x06, 0x02, 0x57, 0x29, 0x76, 0x59, 0x03,
511
0x04, 0x04, 0x3A, 0x85, 0x27, 0x06, 0x34, 0x9B, 0x05, 0x02, 0x56, 0x29,
512
0x68, 0x27, 0x06, 0x04, 0x01, 0x17, 0x04, 0x12, 0x69, 0x27, 0x06, 0x04,
513
0x01, 0x18, 0x04, 0x0A, 0x6A, 0x27, 0x06, 0x04, 0x01, 0x19, 0x04, 0x02,
514
0x56, 0x29, 0x03, 0x07, 0x76, 0xA1, 0x26, 0x03, 0x08, 0x26, 0x62, 0x33,
515
0x0D, 0x06, 0x02, 0x4F, 0x29, 0xA2, 0x58, 0x03, 0x04, 0x04, 0x02, 0x56,
516
0x29, 0x76, 0x02, 0x00, 0x06, 0x21, 0x02, 0x04, 0x59, 0x30, 0x11, 0x06,
517
0x08, 0x25, 0x02, 0x05, 0x02, 0x06, 0x1E, 0x04, 0x10, 0x58, 0x30, 0x11,
518
0x06, 0x08, 0x25, 0x02, 0x07, 0x02, 0x08, 0x1D, 0x04, 0x03, 0x56, 0x29,
519
0x25, 0x04, 0x24, 0x02, 0x04, 0x59, 0x30, 0x11, 0x06, 0x08, 0x25, 0x02,
520
0x05, 0x02, 0x06, 0x24, 0x04, 0x10, 0x58, 0x30, 0x11, 0x06, 0x08, 0x25,
521
0x02, 0x07, 0x02, 0x08, 0x23, 0x04, 0x03, 0x56, 0x29, 0x25, 0x26, 0x06,
522
0x01, 0x29, 0x25, 0x01, 0x00, 0x03, 0x09, 0xB1, 0x01, 0x21, 0x8C, 0x01,
523
0x22, 0x8C, 0x26, 0x01, 0x23, 0x11, 0x06, 0x81, 0x26, 0x25, 0x71, 0xAA,
524
0xAC, 0x26, 0x06, 0x81, 0x1A, 0x01, 0x00, 0x03, 0x0A, 0xAC, 0x9B, 0x25,
525
0xB0, 0x26, 0x01, 0x01, 0x11, 0x06, 0x04, 0xA3, 0x03, 0x0A, 0xB0, 0x01,
526
0x04, 0x75, 0xAA, 0x6E, 0x27, 0x06, 0x0F, 0x02, 0x00, 0x06, 0x03, 0xC0,
527
0x04, 0x05, 0x96, 0x01, 0x7F, 0x03, 0x09, 0x04, 0x80, 0x6C, 0x8E, 0x27,
528
0x06, 0x06, 0x02, 0x00, 0x98, 0x04, 0x80, 0x62, 0xC2, 0x27, 0x06, 0x11,
529
0x02, 0x00, 0x06, 0x09, 0x01, 0x00, 0x03, 0x03, 0x95, 0x03, 0x03, 0x04,
530
0x01, 0xC0, 0x04, 0x80, 0x4D, 0x70, 0x27, 0x06, 0x0A, 0x02, 0x0A, 0x06,
531
0x03, 0x97, 0x04, 0x01, 0xC0, 0x04, 0x3F, 0x6D, 0x27, 0x06, 0x03, 0xC0,
532
0x04, 0x38, 0xC5, 0x27, 0x06, 0x03, 0xC0, 0x04, 0x31, 0x8D, 0x27, 0x06,
533
0x03, 0xC0, 0x04, 0x2A, 0xC3, 0x27, 0x06, 0x03, 0xC0, 0x04, 0x23, 0x77,
534
0x27, 0x06, 0x03, 0xC0, 0x04, 0x1C, 0x82, 0x27, 0x06, 0x03, 0xC0, 0x04,
535
0x15, 0x6C, 0x27, 0x06, 0x03, 0xC0, 0x04, 0x0E, 0xC4, 0x27, 0x06, 0x03,
536
0xC0, 0x04, 0x07, 0x02, 0x0A, 0x06, 0x02, 0x48, 0x29, 0xC0, 0x76, 0x76,
537
0x04, 0xFE, 0x62, 0x76, 0x76, 0x04, 0x08, 0x01, 0x7F, 0x11, 0x05, 0x02,
538
0x55, 0x29, 0x25, 0x76, 0x39, 0x02, 0x00, 0x06, 0x08, 0x02, 0x03, 0x3B,
539
0x2F, 0x05, 0x02, 0x44, 0x29, 0x02, 0x00, 0x06, 0x01, 0x17, 0x02, 0x00,
540
0x02, 0x09, 0x2F, 0x05, 0x02, 0x50, 0x29, 0xB0, 0x73, 0xAA, 0x9B, 0x06,
541
0x80, 0x77, 0xBA, 0x27, 0x06, 0x07, 0x01, 0x02, 0x59, 0x87, 0x04, 0x80,
542
0x5E, 0xBB, 0x27, 0x06, 0x07, 0x01, 0x03, 0x59, 0x88, 0x04, 0x80, 0x53,
543
0xBC, 0x27, 0x06, 0x07, 0x01, 0x04, 0x59, 0x89, 0x04, 0x80, 0x48, 0xBD,
544
0x27, 0x06, 0x06, 0x01, 0x05, 0x59, 0x8A, 0x04, 0x3E, 0xBE, 0x27, 0x06,
545
0x06, 0x01, 0x06, 0x59, 0x8B, 0x04, 0x34, 0x7C, 0x27, 0x06, 0x06, 0x01,
546
0x02, 0x58, 0x87, 0x04, 0x2A, 0x7D, 0x27, 0x06, 0x06, 0x01, 0x03, 0x58,
547
0x88, 0x04, 0x20, 0x7E, 0x27, 0x06, 0x06, 0x01, 0x04, 0x58, 0x89, 0x04,
548
0x16, 0x7F, 0x27, 0x06, 0x06, 0x01, 0x05, 0x58, 0x8A, 0x04, 0x0C, 0x80,
549
0x27, 0x06, 0x06, 0x01, 0x06, 0x58, 0x8B, 0x04, 0x02, 0x56, 0x29, 0x5D,
550
0x34, 0x5F, 0x36, 0x1C, 0x26, 0x05, 0x02, 0x56, 0x29, 0x5C, 0x36, 0x04,
551
0x02, 0x56, 0x29, 0xBF, 0xA1, 0x26, 0x01, T0_INT2(BR_X509_BUFSIZE_SIG),
552
0x12, 0x06, 0x02, 0x4F, 0x29, 0x26, 0x5E, 0x34, 0x5B, 0xA2, 0x76, 0x76,
553
0x01, 0x00, 0x5A, 0x35, 0x18, 0x00, 0x00, 0x01, 0x30, 0x0A, 0x26, 0x01,
554
0x00, 0x01, 0x09, 0x6F, 0x05, 0x02, 0x47, 0x29, 0x00, 0x00, 0x30, 0x30,
555
0x00, 0x00, 0x01, 0x81, 0x08, 0x00, 0x00, 0x01, 0x81, 0x10, 0x00, 0x00,
556
0x01, 0x81, 0x19, 0x00, 0x00, 0x01, 0x81, 0x22, 0x00, 0x00, 0x01, 0x81,
557
0x2B, 0x00, 0x01, 0x7B, 0x01, 0x01, 0x11, 0x3A, 0x01, 0x83, 0xFD, 0x7F,
558
0x11, 0x15, 0x06, 0x03, 0x3A, 0x25, 0x00, 0x3A, 0x26, 0x03, 0x00, 0x26,
559
0xC6, 0x05, 0x04, 0x41, 0x01, 0x00, 0x00, 0x26, 0x01, 0x81, 0x00, 0x0D,
560
0x06, 0x04, 0x93, 0x04, 0x80, 0x49, 0x26, 0x01, 0x90, 0x00, 0x0D, 0x06,
561
0x0F, 0x01, 0x06, 0x14, 0x01, 0x81, 0x40, 0x2F, 0x93, 0x02, 0x00, 0x01,
562
0x00, 0x94, 0x04, 0x33, 0x26, 0x01, 0x83, 0xFF, 0x7F, 0x0D, 0x06, 0x14,
563
0x01, 0x0C, 0x14, 0x01, 0x81, 0x60, 0x2F, 0x93, 0x02, 0x00, 0x01, 0x06,
564
0x94, 0x02, 0x00, 0x01, 0x00, 0x94, 0x04, 0x17, 0x01, 0x12, 0x14, 0x01,
565
0x81, 0x70, 0x2F, 0x93, 0x02, 0x00, 0x01, 0x0C, 0x94, 0x02, 0x00, 0x01,
566
0x06, 0x94, 0x02, 0x00, 0x01, 0x00, 0x94, 0x00, 0x00, 0x01, 0x82, 0x15,
567
0x00, 0x00, 0x26, 0x01, 0x83, 0xB0, 0x00, 0x01, 0x83, 0xB7, 0x7F, 0x6F,
568
0x00, 0x00, 0x01, 0x81, 0x34, 0x00, 0x00, 0x01, 0x80, 0x6B, 0x00, 0x00,
569
0x01, 0x81, 0x78, 0x00, 0x00, 0x01, 0x3D, 0x00, 0x00, 0x01, 0x80, 0x43,
570
0x00, 0x00, 0x01, 0x80, 0x4D, 0x00, 0x00, 0x01, 0x80, 0x57, 0x00, 0x00,
571
0x01, 0x80, 0x61, 0x00, 0x00, 0x30, 0x11, 0x06, 0x04, 0x41, 0xAA, 0xBF,
572
0xB1, 0x00, 0x00, 0x01, 0x82, 0x09, 0x00, 0x00, 0x01, 0x81, 0x6C, 0x00,
573
0x00, 0x26, 0x01, 0x83, 0xB8, 0x00, 0x01, 0x83, 0xBF, 0x7F, 0x6F, 0x00,
574
0x00, 0x01, 0x30, 0x61, 0x36, 0x01, 0x7F, 0x79, 0x1A, 0x01, 0x00, 0x79,
575
0x1A, 0x04, 0x7A, 0x00, 0x01, 0x81, 0x38, 0x00, 0x01, 0x7B, 0x0D, 0x06,
576
0x02, 0x4E, 0x29, 0x26, 0x03, 0x00, 0x0A, 0x02, 0x00, 0x00, 0x00, 0x30,
577
0x26, 0x3E, 0x3A, 0x01, 0x82, 0x00, 0x13, 0x2F, 0x06, 0x04, 0x41, 0x01,
578
0x00, 0x00, 0x30, 0x66, 0x09, 0x36, 0x3F, 0x00, 0x00, 0x14, 0x01, 0x3F,
579
0x15, 0x01, 0x81, 0x00, 0x2F, 0x93, 0x00, 0x02, 0x01, 0x00, 0x03, 0x00,
580
0xAC, 0x26, 0x06, 0x80, 0x59, 0xB0, 0x01, 0x20, 0x30, 0x11, 0x06, 0x17,
581
0x25, 0x71, 0xAA, 0x9B, 0x25, 0x01, 0x7F, 0x2E, 0x03, 0x01, 0xB0, 0x01,
582
0x20, 0x74, 0xAA, 0xAF, 0x02, 0x01, 0x20, 0x76, 0x76, 0x04, 0x38, 0x01,
583
0x21, 0x30, 0x11, 0x06, 0x08, 0x25, 0x72, 0xB3, 0x01, 0x01, 0x1F, 0x04,
584
0x2A, 0x01, 0x22, 0x30, 0x11, 0x06, 0x11, 0x25, 0x72, 0xB3, 0x26, 0x06,
585
0x06, 0x2C, 0x02, 0x00, 0x2F, 0x03, 0x00, 0x01, 0x02, 0x1F, 0x04, 0x13,
586
0x01, 0x26, 0x30, 0x11, 0x06, 0x08, 0x25, 0x72, 0xB3, 0x01, 0x06, 0x1F,
587
0x04, 0x05, 0x41, 0xAB, 0x01, 0x00, 0x25, 0x04, 0xFF, 0x23, 0x76, 0x02,
588
0x00, 0x00, 0x00, 0xAC, 0xB1, 0x26, 0x01, 0x01, 0x11, 0x06, 0x08, 0xA3,
589
0x05, 0x02, 0x50, 0x29, 0xB1, 0x04, 0x02, 0x50, 0x29, 0x26, 0x01, 0x02,
590
0x11, 0x06, 0x0C, 0x25, 0x72, 0xAD, 0x65, 0x2B, 0x40, 0x0D, 0x06, 0x02,
591
0x50, 0x29, 0xB1, 0x01, 0x7F, 0x10, 0x06, 0x02, 0x55, 0x29, 0x25, 0x76,
592
0x00, 0x00, 0xAC, 0x26, 0x06, 0x1A, 0xAC, 0x9B, 0x25, 0x26, 0x06, 0x11,
593
0xAC, 0x26, 0x06, 0x0C, 0xAC, 0x9B, 0x25, 0x86, 0x27, 0x05, 0x02, 0x48,
594
0x29, 0xBF, 0x04, 0x71, 0x76, 0x76, 0x04, 0x63, 0x76, 0x00, 0x02, 0x03,
595
0x00, 0xB0, 0x01, 0x03, 0x75, 0xAA, 0xB7, 0x03, 0x01, 0x02, 0x01, 0x01,
596
0x07, 0x12, 0x06, 0x02, 0x55, 0x29, 0x26, 0x01, 0x00, 0x30, 0x11, 0x06,
597
0x05, 0x25, 0x4C, 0x29, 0x04, 0x15, 0x01, 0x01, 0x30, 0x11, 0x06, 0x0A,
598
0x25, 0xB7, 0x02, 0x01, 0x14, 0x02, 0x01, 0x0E, 0x04, 0x05, 0x25, 0xB7,
599
0x01, 0x00, 0x25, 0x02, 0x00, 0x06, 0x19, 0x01, 0x00, 0x30, 0x01, 0x38,
600
0x15, 0x06, 0x03, 0x01, 0x10, 0x2F, 0x3A, 0x01, 0x81, 0x40, 0x15, 0x06,
601
0x03, 0x01, 0x20, 0x2F, 0x61, 0x36, 0x04, 0x07, 0x01, 0x04, 0x15, 0x05,
602
0x02, 0x4C, 0x29, 0xBF, 0x00, 0x00, 0x37, 0xAC, 0xBF, 0x1B, 0x00, 0x03,
603
0x01, 0x00, 0x03, 0x00, 0x37, 0xAC, 0x26, 0x06, 0x30, 0xB0, 0x01, 0x11,
604
0x74, 0xAA, 0x26, 0x05, 0x02, 0x43, 0x29, 0x26, 0x06, 0x20, 0xAC, 0x9B,
605
0x25, 0x84, 0x27, 0x03, 0x01, 0x01, 0x00, 0x2E, 0x03, 0x02, 0xAF, 0x26,
606
0x02, 0x01, 0x15, 0x06, 0x07, 0x2C, 0x06, 0x04, 0x01, 0x7F, 0x03, 0x00,
607
0x02, 0x02, 0x20, 0x76, 0x04, 0x5D, 0x76, 0x04, 0x4D, 0x76, 0x1B, 0x02,
608
0x00, 0x00, 0x00, 0xB0, 0x01, 0x06, 0x75, 0xAE, 0x00, 0x00, 0xB5, 0x83,
609
0x06, 0x0E, 0x3A, 0x26, 0x05, 0x06, 0x41, 0x01, 0x00, 0x01, 0x00, 0x00,
610
0xB5, 0x6B, 0x04, 0x08, 0x8F, 0x06, 0x05, 0x25, 0x01, 0x00, 0x04, 0x00,
611
0x00, 0x00, 0xB6, 0x83, 0x06, 0x0E, 0x3A, 0x26, 0x05, 0x06, 0x41, 0x01,
612
0x00, 0x01, 0x00, 0x00, 0xB6, 0x6B, 0x04, 0x08, 0x8F, 0x06, 0x05, 0x25,
613
0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0xB7, 0x26, 0x01, 0x81, 0x00, 0x0D,
614
0x06, 0x04, 0x00, 0x04, 0x80, 0x55, 0x26, 0x01, 0x81, 0x40, 0x0D, 0x06,
615
0x07, 0x25, 0x01, 0x00, 0x00, 0x04, 0x80, 0x47, 0x26, 0x01, 0x81, 0x60,
616
0x0D, 0x06, 0x0E, 0x01, 0x1F, 0x15, 0x01, 0x01, 0xA0, 0x01, 0x81, 0x00,
617
0x01, 0x8F, 0x7F, 0x04, 0x32, 0x26, 0x01, 0x81, 0x70, 0x0D, 0x06, 0x0F,
618
0x01, 0x0F, 0x15, 0x01, 0x02, 0xA0, 0x01, 0x90, 0x00, 0x01, 0x83, 0xFF,
619
0x7F, 0x04, 0x1C, 0x26, 0x01, 0x81, 0x78, 0x0D, 0x06, 0x11, 0x01, 0x07,
620
0x15, 0x01, 0x03, 0xA0, 0x01, 0x84, 0x80, 0x00, 0x01, 0x80, 0xC3, 0xFF,
621
0x7F, 0x04, 0x04, 0x25, 0x01, 0x00, 0x00, 0x6F, 0x05, 0x03, 0x25, 0x01,
622
0x00, 0x00, 0x00, 0x3A, 0x26, 0x05, 0x06, 0x41, 0x01, 0x00, 0x01, 0x7F,
623
0x00, 0xB7, 0x33, 0x26, 0x3C, 0x06, 0x03, 0x3A, 0x25, 0x00, 0x01, 0x06,
624
0x0E, 0x3A, 0x26, 0x01, 0x06, 0x14, 0x01, 0x02, 0x10, 0x06, 0x04, 0x41,
625
0x01, 0x7F, 0x00, 0x01, 0x3F, 0x15, 0x09, 0x00, 0x00, 0x26, 0x06, 0x06,
626
0x0B, 0x9F, 0x33, 0x40, 0x04, 0x77, 0x25, 0x26, 0x00, 0x00, 0xB0, 0x01,
627
0x03, 0x75, 0xAA, 0xB7, 0x06, 0x02, 0x54, 0x29, 0x00, 0x00, 0x3A, 0x26,
628
0x06, 0x07, 0x31, 0x26, 0x06, 0x01, 0x1A, 0x04, 0x76, 0x41, 0x00, 0x00,
629
0x01, 0x01, 0x75, 0xA9, 0x01, 0x01, 0x10, 0x06, 0x02, 0x42, 0x29, 0xB7,
630
0x3D, 0x00, 0x04, 0xB0, 0x26, 0x01, 0x17, 0x01, 0x18, 0x6F, 0x05, 0x02,
631
0x47, 0x29, 0x01, 0x18, 0x11, 0x03, 0x00, 0x72, 0xAA, 0xA5, 0x02, 0x00,
632
0x06, 0x0C, 0x01, 0x80, 0x64, 0x08, 0x03, 0x01, 0xA5, 0x02, 0x01, 0x09,
633
0x04, 0x0E, 0x26, 0x01, 0x32, 0x0D, 0x06, 0x04, 0x01, 0x80, 0x64, 0x09,
634
0x01, 0x8E, 0x6C, 0x09, 0x03, 0x01, 0x02, 0x01, 0x01, 0x82, 0x6D, 0x08,
635
0x02, 0x01, 0x01, 0x03, 0x09, 0x01, 0x04, 0x0C, 0x09, 0x02, 0x01, 0x01,
636
0x80, 0x63, 0x09, 0x01, 0x80, 0x64, 0x0C, 0x0A, 0x02, 0x01, 0x01, 0x83,
637
0x0F, 0x09, 0x01, 0x83, 0x10, 0x0C, 0x09, 0x03, 0x03, 0x01, 0x01, 0x01,
638
0x0C, 0xA6, 0x40, 0x01, 0x01, 0x0E, 0x02, 0x01, 0x01, 0x04, 0x07, 0x3E,
639
0x02, 0x01, 0x01, 0x80, 0x64, 0x07, 0x3D, 0x02, 0x01, 0x01, 0x83, 0x10,
640
0x07, 0x3E, 0x2F, 0x15, 0x06, 0x03, 0x01, 0x18, 0x09, 0x91, 0x09, 0x78,
641
0x26, 0x01, 0x05, 0x14, 0x02, 0x03, 0x09, 0x03, 0x03, 0x01, 0x1F, 0x15,
642
0x01, 0x01, 0x3A, 0xA6, 0x02, 0x03, 0x09, 0x40, 0x03, 0x03, 0x01, 0x00,
643
0x01, 0x17, 0xA6, 0x01, 0x9C, 0x10, 0x08, 0x03, 0x02, 0x01, 0x00, 0x01,
644
0x3B, 0xA6, 0x01, 0x3C, 0x08, 0x02, 0x02, 0x09, 0x03, 0x02, 0x01, 0x00,
645
0x01, 0x3C, 0xA6, 0x02, 0x02, 0x09, 0x03, 0x02, 0xB7, 0x26, 0x01, 0x2E,
646
0x11, 0x06, 0x0D, 0x25, 0xB7, 0x26, 0x01, 0x30, 0x01, 0x39, 0x6F, 0x06,
647
0x03, 0x25, 0x04, 0x74, 0x01, 0x80, 0x5A, 0x10, 0x06, 0x02, 0x47, 0x29,
648
0x76, 0x02, 0x03, 0x02, 0x02, 0x00, 0x01, 0xB7, 0x7A, 0x01, 0x0A, 0x08,
649
0x03, 0x00, 0xB7, 0x7A, 0x02, 0x00, 0x09, 0x00, 0x02, 0x03, 0x00, 0x03,
650
0x01, 0xA5, 0x26, 0x02, 0x01, 0x02, 0x00, 0x6F, 0x05, 0x02, 0x47, 0x29,
651
0x00, 0x00, 0x33, 0xB0, 0x01, 0x02, 0x75, 0x0B, 0xA8, 0x00, 0x03, 0x26,
652
0x03, 0x00, 0x03, 0x01, 0x03, 0x02, 0xAA, 0xB7, 0x26, 0x01, 0x81, 0x00,
653
0x13, 0x06, 0x02, 0x53, 0x29, 0x26, 0x01, 0x00, 0x11, 0x06, 0x0B, 0x25,
654
0x26, 0x05, 0x04, 0x25, 0x01, 0x00, 0x00, 0xB7, 0x04, 0x6F, 0x02, 0x01,
655
0x26, 0x05, 0x02, 0x4F, 0x29, 0x40, 0x03, 0x01, 0x02, 0x02, 0x36, 0x02,
656
0x02, 0x3F, 0x03, 0x02, 0x26, 0x06, 0x03, 0xB7, 0x04, 0x68, 0x25, 0x02,
657
0x00, 0x02, 0x01, 0x0A, 0x00, 0x01, 0xB7, 0x26, 0x01, 0x81, 0x00, 0x0D,
658
0x06, 0x01, 0x00, 0x01, 0x81, 0x00, 0x0A, 0x26, 0x05, 0x02, 0x4D, 0x29,
659
0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x12, 0x06, 0x19, 0x02,
660
0x00, 0x40, 0x03, 0x00, 0x26, 0x01, 0x83, 0xFF, 0xFF, 0x7F, 0x12, 0x06,
661
0x02, 0x4E, 0x29, 0x01, 0x08, 0x0E, 0x3A, 0xB7, 0x33, 0x09, 0x04, 0x60,
662
0x00, 0x00, 0xA9, 0x92, 0x00, 0x00, 0xAA, 0xBF, 0x00, 0x00, 0xB0, 0x73,
663
0xAA, 0x00, 0x01, 0xAA, 0x26, 0x05, 0x02, 0x53, 0x29, 0xB7, 0x26, 0x01,
664
0x81, 0x00, 0x13, 0x06, 0x02, 0x53, 0x29, 0x03, 0x00, 0x26, 0x06, 0x16,
665
0xB7, 0x02, 0x00, 0x26, 0x01, 0x87, 0xFF, 0xFF, 0x7F, 0x13, 0x06, 0x02,
666
0x53, 0x29, 0x01, 0x08, 0x0E, 0x09, 0x03, 0x00, 0x04, 0x67, 0x25, 0x02,
667
0x00, 0x00, 0x00, 0xAA, 0x26, 0x01, 0x81, 0x7F, 0x12, 0x06, 0x08, 0xBF,
668
0x01, 0x00, 0x66, 0x36, 0x01, 0x00, 0x00, 0x26, 0x66, 0x36, 0x66, 0x3F,
669
0xA2, 0x01, 0x7F, 0x00, 0x00, 0xB0, 0x01, 0x0C, 0x30, 0x11, 0x06, 0x05,
670
0x25, 0x72, 0xB3, 0x04, 0x3E, 0x01, 0x12, 0x30, 0x11, 0x06, 0x05, 0x25,
671
0x72, 0xB4, 0x04, 0x33, 0x01, 0x13, 0x30, 0x11, 0x06, 0x05, 0x25, 0x72,
672
0xB4, 0x04, 0x28, 0x01, 0x14, 0x30, 0x11, 0x06, 0x05, 0x25, 0x72, 0xB4,
673
0x04, 0x1D, 0x01, 0x16, 0x30, 0x11, 0x06, 0x05, 0x25, 0x72, 0xB4, 0x04,
674
0x12, 0x01, 0x1E, 0x30, 0x11, 0x06, 0x05, 0x25, 0x72, 0xB2, 0x04, 0x07,
675
0x41, 0xAB, 0x01, 0x00, 0x01, 0x00, 0x25, 0x00, 0x01, 0xB7, 0x03, 0x00,
676
0x02, 0x00, 0x01, 0x05, 0x14, 0x01, 0x01, 0x15, 0x2D, 0x02, 0x00, 0x01,
677
0x06, 0x14, 0x26, 0x01, 0x01, 0x15, 0x06, 0x02, 0x45, 0x29, 0x01, 0x04,
678
0x0E, 0x02, 0x00, 0x01, 0x1F, 0x15, 0x26, 0x01, 0x1F, 0x11, 0x06, 0x02,
679
0x46, 0x29, 0x09, 0x00, 0x00, 0x26, 0x05, 0x05, 0x01, 0x00, 0x01, 0x7F,
680
0x00, 0xB0, 0x00, 0x01, 0xAA, 0x26, 0x05, 0x05, 0x66, 0x36, 0x01, 0x7F,
681
0x00, 0x01, 0x01, 0x03, 0x00, 0x9C, 0x26, 0x01, 0x83, 0xFF, 0x7E, 0x11,
682
0x06, 0x16, 0x25, 0x26, 0x06, 0x10, 0x9D, 0x26, 0x05, 0x05, 0x25, 0xBF,
683
0x01, 0x00, 0x00, 0x02, 0x00, 0x81, 0x03, 0x00, 0x04, 0x6D, 0x04, 0x1B,
684
0x26, 0x05, 0x05, 0x25, 0xBF, 0x01, 0x00, 0x00, 0x02, 0x00, 0x81, 0x03,
685
0x00, 0x26, 0x06, 0x0B, 0x9C, 0x26, 0x05, 0x05, 0x25, 0xBF, 0x01, 0x00,
686
0x00, 0x04, 0x6D, 0x25, 0x02, 0x00, 0x26, 0x05, 0x01, 0x00, 0x40, 0x66,
687
0x36, 0x01, 0x7F, 0x00, 0x01, 0xAA, 0x01, 0x01, 0x03, 0x00, 0x26, 0x06,
688
0x10, 0x9E, 0x26, 0x05, 0x05, 0x25, 0xBF, 0x01, 0x00, 0x00, 0x02, 0x00,
689
0x81, 0x03, 0x00, 0x04, 0x6D, 0x25, 0x02, 0x00, 0x26, 0x05, 0x01, 0x00,
690
0x40, 0x66, 0x36, 0x01, 0x7F, 0x00, 0x01, 0xAA, 0x01, 0x01, 0x03, 0x00,
691
0x26, 0x06, 0x10, 0xB7, 0x26, 0x05, 0x05, 0x25, 0xBF, 0x01, 0x00, 0x00,
692
0x02, 0x00, 0x81, 0x03, 0x00, 0x04, 0x6D, 0x25, 0x02, 0x00, 0x26, 0x05,
693
0x01, 0x00, 0x40, 0x66, 0x36, 0x01, 0x7F, 0x00, 0x00, 0xB7, 0x01, 0x08,
694
0x0E, 0x3A, 0xB7, 0x33, 0x09, 0x00, 0x00, 0xB7, 0x3A, 0xB7, 0x01, 0x08,
695
0x0E, 0x33, 0x09, 0x00, 0x00, 0x26, 0x05, 0x02, 0x4E, 0x29, 0x40, 0xB8,
696
0x00, 0x00, 0x32, 0x26, 0x01, 0x00, 0x13, 0x06, 0x01, 0x00, 0x25, 0x1A,
697
0x04, 0x74, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x0B, 0x00, 0x00, 0x01,
698
0x15, 0x00, 0x00, 0x01, 0x1F, 0x00, 0x00, 0x01, 0x29, 0x00, 0x00, 0x01,
699
0x33, 0x00, 0x00, 0xC0, 0x25, 0x00, 0x00, 0x26, 0x06, 0x07, 0xC1, 0x26,
700
0x06, 0x01, 0x1A, 0x04, 0x76, 0x00, 0x00, 0x01, 0x00, 0x30, 0x31, 0x0B,
701
0x41, 0x00, 0x00, 0x01, 0x81, 0x70, 0x00, 0x00, 0x01, 0x82, 0x0D, 0x00,
702
0x00, 0x01, 0x82, 0x22, 0x00, 0x00, 0x01, 0x82, 0x05, 0x00, 0x00, 0x26,
703
0x01, 0x83, 0xFB, 0x50, 0x01, 0x83, 0xFB, 0x6F, 0x6F, 0x06, 0x04, 0x25,
704
0x01, 0x00, 0x00, 0x26, 0x01, 0x83, 0xB0, 0x00, 0x01, 0x83, 0xBF, 0x7F,
705
0x6F, 0x06, 0x04, 0x25, 0x01, 0x00, 0x00, 0x01, 0x83, 0xFF, 0x7F, 0x15,
706
0x01, 0x83, 0xFF, 0x7E, 0x0D, 0x00
707
};
708
709
static const uint16_t t0_caddr[] = {
710
0,
711
5,
712
10,
713
15,
714
20,
715
25,
716
29,
717
33,
718
37,
719
41,
720
45,
721
49,
722
53,
723
57,
724
61,
725
65,
726
69,
727
73,
728
77,
729
81,
730
85,
731
89,
732
93,
733
97,
734
101,
735
105,
736
109,
737
113,
738
117,
739
121,
740
125,
741
130,
742
135,
743
140,
744
145,
745
150,
746
155,
747
160,
748
165,
749
173,
750
178,
751
183,
752
188,
753
193,
754
198,
755
203,
756
208,
757
213,
758
234,
759
239,
760
244,
761
249,
762
264,
763
269,
764
275,
765
281,
766
286,
767
294,
768
302,
769
308,
770
313,
771
324,
772
960,
773
975,
774
979,
775
984,
776
989,
777
994,
778
999,
779
1004,
780
1118,
781
1123,
782
1135,
783
1140,
784
1145,
785
1150,
786
1154,
787
1159,
788
1164,
789
1169,
790
1174,
791
1184,
792
1189,
793
1194,
794
1206,
795
1221,
796
1226,
797
1240,
798
1262,
799
1273,
800
1376,
801
1423,
802
1456,
803
1547,
804
1553,
805
1616,
806
1623,
807
1651,
808
1679,
809
1784,
810
1826,
811
1839,
812
1851,
813
1865,
814
1880,
815
2100,
816
2114,
817
2131,
818
2140,
819
2207,
820
2263,
821
2267,
822
2271,
823
2276,
824
2324,
825
2350,
826
2426,
827
2470,
828
2481,
829
2566,
830
2604,
831
2642,
832
2652,
833
2662,
834
2671,
835
2684,
836
2688,
837
2692,
838
2696,
839
2700,
840
2704,
841
2708,
842
2712,
843
2724,
844
2732,
845
2737,
846
2742,
847
2747,
848
2752
849
};
850
851
#define T0_INTERPRETED 60
852
853
#define T0_ENTER(ip, rp, slot) do { \
854
const unsigned char *t0_newip; \
855
uint32_t t0_lnum; \
856
t0_newip = &t0_codeblock[t0_caddr[(slot) - T0_INTERPRETED]]; \
857
t0_lnum = t0_parse7E_unsigned(&t0_newip); \
858
(rp) += t0_lnum; \
859
*((rp) ++) = (uint32_t)((ip) - &t0_codeblock[0]) + (t0_lnum << 16); \
860
(ip) = t0_newip; \
861
} while (0)
862
863
#define T0_DEFENTRY(name, slot) \
864
void \
865
name(void *ctx) \
866
{ \
867
t0_context *t0ctx = ctx; \
868
t0ctx->ip = &t0_codeblock[0]; \
869
T0_ENTER(t0ctx->ip, t0ctx->rp, slot); \
870
}
871
872
T0_DEFENTRY(br_x509_minimal_init_main, 144)
873
874
#define T0_NEXT(t0ipp) (*(*(t0ipp)) ++)
875
876
void
877
br_x509_minimal_run(void *t0ctx)
878
{
879
uint32_t *dp, *rp;
880
const unsigned char *ip;
881
882
#define T0_LOCAL(x) (*(rp - 2 - (x)))
883
#define T0_POP() (*-- dp)
884
#define T0_POPi() (*(int32_t *)(-- dp))
885
#define T0_PEEK(x) (*(dp - 1 - (x)))
886
#define T0_PEEKi(x) (*(int32_t *)(dp - 1 - (x)))
887
#define T0_PUSH(v) do { *dp = (v); dp ++; } while (0)
888
#define T0_PUSHi(v) do { *(int32_t *)dp = (v); dp ++; } while (0)
889
#define T0_RPOP() (*-- rp)
890
#define T0_RPOPi() (*(int32_t *)(-- rp))
891
#define T0_RPUSH(v) do { *rp = (v); rp ++; } while (0)
892
#define T0_RPUSHi(v) do { *(int32_t *)rp = (v); rp ++; } while (0)
893
#define T0_ROLL(x) do { \
894
size_t t0len = (size_t)(x); \
895
uint32_t t0tmp = *(dp - 1 - t0len); \
896
memmove(dp - t0len - 1, dp - t0len, t0len * sizeof *dp); \
897
*(dp - 1) = t0tmp; \
898
} while (0)
899
#define T0_SWAP() do { \
900
uint32_t t0tmp = *(dp - 2); \
901
*(dp - 2) = *(dp - 1); \
902
*(dp - 1) = t0tmp; \
903
} while (0)
904
#define T0_ROT() do { \
905
uint32_t t0tmp = *(dp - 3); \
906
*(dp - 3) = *(dp - 2); \
907
*(dp - 2) = *(dp - 1); \
908
*(dp - 1) = t0tmp; \
909
} while (0)
910
#define T0_NROT() do { \
911
uint32_t t0tmp = *(dp - 1); \
912
*(dp - 1) = *(dp - 2); \
913
*(dp - 2) = *(dp - 3); \
914
*(dp - 3) = t0tmp; \
915
} while (0)
916
#define T0_PICK(x) do { \
917
uint32_t t0depth = (x); \
918
T0_PUSH(T0_PEEK(t0depth)); \
919
} while (0)
920
#define T0_CO() do { \
921
goto t0_exit; \
922
} while (0)
923
#define T0_RET() goto t0_next
924
925
dp = ((t0_context *)t0ctx)->dp;
926
rp = ((t0_context *)t0ctx)->rp;
927
ip = ((t0_context *)t0ctx)->ip;
928
goto t0_next;
929
for (;;) {
930
uint32_t t0x;
931
932
t0_next:
933
t0x = T0_NEXT(&ip);
934
if (t0x < T0_INTERPRETED) {
935
switch (t0x) {
936
int32_t t0off;
937
938
case 0: /* ret */
939
t0x = T0_RPOP();
940
rp -= (t0x >> 16);
941
t0x &= 0xFFFF;
942
if (t0x == 0) {
943
ip = NULL;
944
goto t0_exit;
945
}
946
ip = &t0_codeblock[t0x];
947
break;
948
case 1: /* literal constant */
949
T0_PUSHi(t0_parse7E_signed(&ip));
950
break;
951
case 2: /* read local */
952
T0_PUSH(T0_LOCAL(t0_parse7E_unsigned(&ip)));
953
break;
954
case 3: /* write local */
955
T0_LOCAL(t0_parse7E_unsigned(&ip)) = T0_POP();
956
break;
957
case 4: /* jump */
958
t0off = t0_parse7E_signed(&ip);
959
ip += t0off;
960
break;
961
case 5: /* jump if */
962
t0off = t0_parse7E_signed(&ip);
963
if (T0_POP()) {
964
ip += t0off;
965
}
966
break;
967
case 6: /* jump if not */
968
t0off = t0_parse7E_signed(&ip);
969
if (!T0_POP()) {
970
ip += t0off;
971
}
972
break;
973
case 7: {
974
/* %25 */
975
976
int32_t b = T0_POPi();
977
int32_t a = T0_POPi();
978
T0_PUSHi(a % b);
979
980
}
981
break;
982
case 8: {
983
/* * */
984
985
uint32_t b = T0_POP();
986
uint32_t a = T0_POP();
987
T0_PUSH(a * b);
988
989
}
990
break;
991
case 9: {
992
/* + */
993
994
uint32_t b = T0_POP();
995
uint32_t a = T0_POP();
996
T0_PUSH(a + b);
997
998
}
999
break;
1000
case 10: {
1001
/* - */
1002
1003
uint32_t b = T0_POP();
1004
uint32_t a = T0_POP();
1005
T0_PUSH(a - b);
1006
1007
}
1008
break;
1009
case 11: {
1010
/* -rot */
1011
T0_NROT();
1012
}
1013
break;
1014
case 12: {
1015
/* / */
1016
1017
int32_t b = T0_POPi();
1018
int32_t a = T0_POPi();
1019
T0_PUSHi(a / b);
1020
1021
}
1022
break;
1023
case 13: {
1024
/* < */
1025
1026
int32_t b = T0_POPi();
1027
int32_t a = T0_POPi();
1028
T0_PUSH(-(uint32_t)(a < b));
1029
1030
}
1031
break;
1032
case 14: {
1033
/* << */
1034
1035
int c = (int)T0_POPi();
1036
uint32_t x = T0_POP();
1037
T0_PUSH(x << c);
1038
1039
}
1040
break;
1041
case 15: {
1042
/* <= */
1043
1044
int32_t b = T0_POPi();
1045
int32_t a = T0_POPi();
1046
T0_PUSH(-(uint32_t)(a <= b));
1047
1048
}
1049
break;
1050
case 16: {
1051
/* <> */
1052
1053
uint32_t b = T0_POP();
1054
uint32_t a = T0_POP();
1055
T0_PUSH(-(uint32_t)(a != b));
1056
1057
}
1058
break;
1059
case 17: {
1060
/* = */
1061
1062
uint32_t b = T0_POP();
1063
uint32_t a = T0_POP();
1064
T0_PUSH(-(uint32_t)(a == b));
1065
1066
}
1067
break;
1068
case 18: {
1069
/* > */
1070
1071
int32_t b = T0_POPi();
1072
int32_t a = T0_POPi();
1073
T0_PUSH(-(uint32_t)(a > b));
1074
1075
}
1076
break;
1077
case 19: {
1078
/* >= */
1079
1080
int32_t b = T0_POPi();
1081
int32_t a = T0_POPi();
1082
T0_PUSH(-(uint32_t)(a >= b));
1083
1084
}
1085
break;
1086
case 20: {
1087
/* >> */
1088
1089
int c = (int)T0_POPi();
1090
int32_t x = T0_POPi();
1091
T0_PUSHi(x >> c);
1092
1093
}
1094
break;
1095
case 21: {
1096
/* and */
1097
1098
uint32_t b = T0_POP();
1099
uint32_t a = T0_POP();
1100
T0_PUSH(a & b);
1101
1102
}
1103
break;
1104
case 22: {
1105
/* blobcopy */
1106
1107
size_t len = T0_POP();
1108
unsigned char *src = (unsigned char *)CTX + T0_POP();
1109
unsigned char *dst = (unsigned char *)CTX + T0_POP();
1110
memcpy(dst, src, len);
1111
1112
}
1113
break;
1114
case 23: {
1115
/* check-direct-trust */
1116
1117
size_t u;
1118
1119
for (u = 0; u < CTX->trust_anchors_num; u ++) {
1120
const br_x509_trust_anchor *ta;
1121
unsigned char hashed_DN[64];
1122
int kt;
1123
1124
ta = &CTX->trust_anchors[u];
1125
if (ta->flags & BR_X509_TA_CA) {
1126
continue;
1127
}
1128
hash_dn(CTX, ta->dn.data, ta->dn.len, hashed_DN);
1129
if (memcmp(hashed_DN, CTX->current_dn_hash, DNHASH_LEN)) {
1130
continue;
1131
}
1132
kt = CTX->pkey.key_type;
1133
if ((ta->pkey.key_type & 0x0F) != kt) {
1134
continue;
1135
}
1136
switch (kt) {
1137
1138
case BR_KEYTYPE_RSA:
1139
if (!eqbigint(CTX->pkey.key.rsa.n,
1140
CTX->pkey.key.rsa.nlen,
1141
ta->pkey.key.rsa.n,
1142
ta->pkey.key.rsa.nlen)
1143
|| !eqbigint(CTX->pkey.key.rsa.e,
1144
CTX->pkey.key.rsa.elen,
1145
ta->pkey.key.rsa.e,
1146
ta->pkey.key.rsa.elen))
1147
{
1148
continue;
1149
}
1150
break;
1151
1152
case BR_KEYTYPE_EC:
1153
if (CTX->pkey.key.ec.curve != ta->pkey.key.ec.curve
1154
|| CTX->pkey.key.ec.qlen != ta->pkey.key.ec.qlen
1155
|| memcmp(CTX->pkey.key.ec.q,
1156
ta->pkey.key.ec.q,
1157
ta->pkey.key.ec.qlen) != 0)
1158
{
1159
continue;
1160
}
1161
break;
1162
1163
default:
1164
continue;
1165
}
1166
1167
/*
1168
* Direct trust match!
1169
*/
1170
CTX->err = BR_ERR_X509_OK;
1171
T0_CO();
1172
}
1173
1174
}
1175
break;
1176
case 24: {
1177
/* check-trust-anchor-CA */
1178
1179
size_t u;
1180
1181
for (u = 0; u < CTX->trust_anchors_num; u ++) {
1182
const br_x509_trust_anchor *ta;
1183
unsigned char hashed_DN[64];
1184
1185
ta = &CTX->trust_anchors[u];
1186
if (!(ta->flags & BR_X509_TA_CA)) {
1187
continue;
1188
}
1189
hash_dn(CTX, ta->dn.data, ta->dn.len, hashed_DN);
1190
if (memcmp(hashed_DN, CTX->saved_dn_hash, DNHASH_LEN)) {
1191
continue;
1192
}
1193
if (verify_signature(CTX, &ta->pkey) == 0) {
1194
CTX->err = BR_ERR_X509_OK;
1195
T0_CO();
1196
}
1197
}
1198
1199
}
1200
break;
1201
case 25: {
1202
/* check-validity-range */
1203
1204
uint32_t nbs = T0_POP();
1205
uint32_t nbd = T0_POP();
1206
uint32_t nas = T0_POP();
1207
uint32_t nad = T0_POP();
1208
int r;
1209
if (CTX->itime != 0) {
1210
r = CTX->itime(CTX->itime_ctx, nbd, nbs, nad, nas);
1211
if (r < -1 || r > 1) {
1212
CTX->err = BR_ERR_X509_TIME_UNKNOWN;
1213
T0_CO();
1214
}
1215
} else {
1216
uint32_t vd = CTX->days;
1217
uint32_t vs = CTX->seconds;
1218
if (vd == 0 && vs == 0) {
1219
#if BR_USE_UNIX_TIME
1220
time_t x = time(NULL);
1221
1222
vd = (uint32_t)(x / 86400) + 719528;
1223
vs = (uint32_t)(x % 86400);
1224
#elif BR_USE_WIN32_TIME
1225
FILETIME ft;
1226
uint64_t x;
1227
1228
GetSystemTimeAsFileTime(&ft);
1229
x = ((uint64_t)ft.dwHighDateTime << 32)
1230
+ (uint64_t)ft.dwLowDateTime;
1231
x = (x / 10000000);
1232
vd = (uint32_t)(x / 86400) + 584754;
1233
vs = (uint32_t)(x % 86400);
1234
#else
1235
CTX->err = BR_ERR_X509_TIME_UNKNOWN;
1236
T0_CO();
1237
#endif
1238
}
1239
if (vd < nbd || (vd == nbd && vs < nbs)) {
1240
r = -1;
1241
} else if (vd > nad || (vd == nad && vs > nas)) {
1242
r = 1;
1243
} else {
1244
r = 0;
1245
}
1246
}
1247
T0_PUSHi(r);
1248
1249
}
1250
break;
1251
case 26: {
1252
/* co */
1253
T0_CO();
1254
}
1255
break;
1256
case 27: {
1257
/* compute-dn-hash */
1258
1259
CTX->dn_hash_impl->out(&CTX->dn_hash.vtable, CTX->current_dn_hash);
1260
CTX->do_dn_hash = 0;
1261
1262
}
1263
break;
1264
case 28: {
1265
/* compute-tbs-hash */
1266
1267
int id = T0_POPi();
1268
size_t len;
1269
len = br_multihash_out(&CTX->mhash, id, CTX->tbs_hash);
1270
T0_PUSH(len);
1271
1272
}
1273
break;
1274
case 29: {
1275
/* copy-ee-ec-pkey */
1276
1277
size_t qlen = T0_POP();
1278
uint32_t curve = T0_POP();
1279
memcpy(CTX->ee_pkey_data, CTX->pkey_data, qlen);
1280
CTX->pkey.key_type = BR_KEYTYPE_EC;
1281
CTX->pkey.key.ec.curve = curve;
1282
CTX->pkey.key.ec.q = CTX->ee_pkey_data;
1283
CTX->pkey.key.ec.qlen = qlen;
1284
1285
}
1286
break;
1287
case 30: {
1288
/* copy-ee-rsa-pkey */
1289
1290
size_t elen = T0_POP();
1291
size_t nlen = T0_POP();
1292
memcpy(CTX->ee_pkey_data, CTX->pkey_data, nlen + elen);
1293
CTX->pkey.key_type = BR_KEYTYPE_RSA;
1294
CTX->pkey.key.rsa.n = CTX->ee_pkey_data;
1295
CTX->pkey.key.rsa.nlen = nlen;
1296
CTX->pkey.key.rsa.e = CTX->ee_pkey_data + nlen;
1297
CTX->pkey.key.rsa.elen = elen;
1298
1299
}
1300
break;
1301
case 31: {
1302
/* copy-name-SAN */
1303
1304
unsigned tag = T0_POP();
1305
unsigned ok = T0_POP();
1306
size_t u, len;
1307
1308
len = CTX->pad[0];
1309
for (u = 0; u < CTX->num_name_elts; u ++) {
1310
br_name_element *ne;
1311
1312
ne = &CTX->name_elts[u];
1313
if (ne->status == 0 && ne->oid[0] == 0 && ne->oid[1] == tag) {
1314
if (ok && ne->len > len) {
1315
memcpy(ne->buf, CTX->pad + 1, len);
1316
ne->buf[len] = 0;
1317
ne->status = 1;
1318
} else {
1319
ne->status = -1;
1320
}
1321
break;
1322
}
1323
}
1324
1325
}
1326
break;
1327
case 32: {
1328
/* copy-name-element */
1329
1330
size_t len;
1331
int32_t off = T0_POPi();
1332
int ok = T0_POPi();
1333
1334
if (off >= 0) {
1335
br_name_element *ne = &CTX->name_elts[off];
1336
1337
if (ok) {
1338
len = CTX->pad[0];
1339
if (len < ne->len) {
1340
memcpy(ne->buf, CTX->pad + 1, len);
1341
ne->buf[len] = 0;
1342
ne->status = 1;
1343
} else {
1344
ne->status = -1;
1345
}
1346
} else {
1347
ne->status = -1;
1348
}
1349
}
1350
1351
}
1352
break;
1353
case 33: {
1354
/* data-get8 */
1355
1356
size_t addr = T0_POP();
1357
T0_PUSH(t0_datablock[addr]);
1358
1359
}
1360
break;
1361
case 34: {
1362
/* dn-hash-length */
1363
1364
T0_PUSH(DNHASH_LEN);
1365
1366
}
1367
break;
1368
case 35: {
1369
/* do-ecdsa-vrfy */
1370
1371
size_t qlen = T0_POP();
1372
int curve = T0_POP();
1373
br_x509_pkey pk;
1374
1375
pk.key_type = BR_KEYTYPE_EC;
1376
pk.key.ec.curve = curve;
1377
pk.key.ec.q = CTX->pkey_data;
1378
pk.key.ec.qlen = qlen;
1379
T0_PUSH(verify_signature(CTX, &pk));
1380
1381
}
1382
break;
1383
case 36: {
1384
/* do-rsa-vrfy */
1385
1386
size_t elen = T0_POP();
1387
size_t nlen = T0_POP();
1388
br_x509_pkey pk;
1389
1390
pk.key_type = BR_KEYTYPE_RSA;
1391
pk.key.rsa.n = CTX->pkey_data;
1392
pk.key.rsa.nlen = nlen;
1393
pk.key.rsa.e = CTX->pkey_data + nlen;
1394
pk.key.rsa.elen = elen;
1395
T0_PUSH(verify_signature(CTX, &pk));
1396
1397
}
1398
break;
1399
case 37: {
1400
/* drop */
1401
(void)T0_POP();
1402
}
1403
break;
1404
case 38: {
1405
/* dup */
1406
T0_PUSH(T0_PEEK(0));
1407
}
1408
break;
1409
case 39: {
1410
/* eqOID */
1411
1412
const unsigned char *a2 = &t0_datablock[T0_POP()];
1413
const unsigned char *a1 = &CTX->pad[0];
1414
size_t len = a1[0];
1415
int x;
1416
if (len == a2[0]) {
1417
x = -(memcmp(a1 + 1, a2 + 1, len) == 0);
1418
} else {
1419
x = 0;
1420
}
1421
T0_PUSH((uint32_t)x);
1422
1423
}
1424
break;
1425
case 40: {
1426
/* eqblob */
1427
1428
size_t len = T0_POP();
1429
const unsigned char *a2 = (const unsigned char *)CTX + T0_POP();
1430
const unsigned char *a1 = (const unsigned char *)CTX + T0_POP();
1431
T0_PUSHi(-(memcmp(a1, a2, len) == 0));
1432
1433
}
1434
break;
1435
case 41: {
1436
/* fail */
1437
1438
CTX->err = T0_POPi();
1439
T0_CO();
1440
1441
}
1442
break;
1443
case 42: {
1444
/* get16 */
1445
1446
uint32_t addr = T0_POP();
1447
T0_PUSH(*(uint16_t *)(void *)((unsigned char *)CTX + addr));
1448
1449
}
1450
break;
1451
case 43: {
1452
/* get32 */
1453
1454
uint32_t addr = T0_POP();
1455
T0_PUSH(*(uint32_t *)(void *)((unsigned char *)CTX + addr));
1456
1457
}
1458
break;
1459
case 44: {
1460
/* match-server-name */
1461
1462
size_t n1, n2;
1463
1464
if (CTX->server_name == NULL) {
1465
T0_PUSH(0);
1466
T0_RET();
1467
}
1468
n1 = strlen(CTX->server_name);
1469
n2 = CTX->pad[0];
1470
if (n1 == n2 && eqnocase(&CTX->pad[1], CTX->server_name, n1)) {
1471
T0_PUSHi(-1);
1472
T0_RET();
1473
}
1474
if (n2 >= 2 && CTX->pad[1] == '*' && CTX->pad[2] == '.') {
1475
size_t u;
1476
1477
u = 0;
1478
while (u < n1 && CTX->server_name[u] != '.') {
1479
u ++;
1480
}
1481
u ++;
1482
n1 -= u;
1483
if ((n2 - 2) == n1
1484
&& eqnocase(&CTX->pad[3], CTX->server_name + u, n1))
1485
{
1486
T0_PUSHi(-1);
1487
T0_RET();
1488
}
1489
}
1490
T0_PUSH(0);
1491
1492
}
1493
break;
1494
case 45: {
1495
/* neg */
1496
1497
uint32_t a = T0_POP();
1498
T0_PUSH(-a);
1499
1500
}
1501
break;
1502
case 46: {
1503
/* offset-name-element */
1504
1505
unsigned san = T0_POP();
1506
size_t u;
1507
1508
for (u = 0; u < CTX->num_name_elts; u ++) {
1509
if (CTX->name_elts[u].status == 0) {
1510
const unsigned char *oid;
1511
size_t len, off;
1512
1513
oid = CTX->name_elts[u].oid;
1514
if (san) {
1515
if (oid[0] != 0 || oid[1] != 0) {
1516
continue;
1517
}
1518
off = 2;
1519
} else {
1520
off = 0;
1521
}
1522
len = oid[off];
1523
if (len != 0 && len == CTX->pad[0]
1524
&& memcmp(oid + off + 1,
1525
CTX->pad + 1, len) == 0)
1526
{
1527
T0_PUSH(u);
1528
T0_RET();
1529
}
1530
}
1531
}
1532
T0_PUSHi(-1);
1533
1534
}
1535
break;
1536
case 47: {
1537
/* or */
1538
1539
uint32_t b = T0_POP();
1540
uint32_t a = T0_POP();
1541
T0_PUSH(a | b);
1542
1543
}
1544
break;
1545
case 48: {
1546
/* over */
1547
T0_PUSH(T0_PEEK(1));
1548
}
1549
break;
1550
case 49: {
1551
/* read-blob-inner */
1552
1553
uint32_t len = T0_POP();
1554
uint32_t addr = T0_POP();
1555
size_t clen = CTX->hlen;
1556
if (clen > len) {
1557
clen = (size_t)len;
1558
}
1559
if (addr != 0) {
1560
memcpy((unsigned char *)CTX + addr, CTX->hbuf, clen);
1561
}
1562
if (CTX->do_mhash) {
1563
br_multihash_update(&CTX->mhash, CTX->hbuf, clen);
1564
}
1565
if (CTX->do_dn_hash) {
1566
CTX->dn_hash_impl->update(
1567
&CTX->dn_hash.vtable, CTX->hbuf, clen);
1568
}
1569
CTX->hbuf += clen;
1570
CTX->hlen -= clen;
1571
T0_PUSH(addr + clen);
1572
T0_PUSH(len - clen);
1573
1574
}
1575
break;
1576
case 50: {
1577
/* read8-low */
1578
1579
if (CTX->hlen == 0) {
1580
T0_PUSHi(-1);
1581
} else {
1582
unsigned char x = *CTX->hbuf ++;
1583
if (CTX->do_mhash) {
1584
br_multihash_update(&CTX->mhash, &x, 1);
1585
}
1586
if (CTX->do_dn_hash) {
1587
CTX->dn_hash_impl->update(&CTX->dn_hash.vtable, &x, 1);
1588
}
1589
CTX->hlen --;
1590
T0_PUSH(x);
1591
}
1592
1593
}
1594
break;
1595
case 51: {
1596
/* rot */
1597
T0_ROT();
1598
}
1599
break;
1600
case 52: {
1601
/* set16 */
1602
1603
uint32_t addr = T0_POP();
1604
*(uint16_t *)(void *)((unsigned char *)CTX + addr) = T0_POP();
1605
1606
}
1607
break;
1608
case 53: {
1609
/* set32 */
1610
1611
uint32_t addr = T0_POP();
1612
*(uint32_t *)(void *)((unsigned char *)CTX + addr) = T0_POP();
1613
1614
}
1615
break;
1616
case 54: {
1617
/* set8 */
1618
1619
uint32_t addr = T0_POP();
1620
*((unsigned char *)CTX + addr) = (unsigned char)T0_POP();
1621
1622
}
1623
break;
1624
case 55: {
1625
/* start-dn-hash */
1626
1627
CTX->dn_hash_impl->init(&CTX->dn_hash.vtable);
1628
CTX->do_dn_hash = 1;
1629
1630
}
1631
break;
1632
case 56: {
1633
/* start-tbs-hash */
1634
1635
br_multihash_init(&CTX->mhash);
1636
CTX->do_mhash = 1;
1637
1638
}
1639
break;
1640
case 57: {
1641
/* stop-tbs-hash */
1642
1643
CTX->do_mhash = 0;
1644
1645
}
1646
break;
1647
case 58: {
1648
/* swap */
1649
T0_SWAP();
1650
}
1651
break;
1652
case 59: {
1653
/* zero-server-name */
1654
1655
T0_PUSHi(-(CTX->server_name == NULL));
1656
1657
}
1658
break;
1659
}
1660
1661
} else {
1662
T0_ENTER(ip, rp, t0x);
1663
}
1664
}
1665
t0_exit:
1666
((t0_context *)t0ctx)->dp = dp;
1667
((t0_context *)t0ctx)->rp = rp;
1668
((t0_context *)t0ctx)->ip = ip;
1669
}
1670
1671
1672
1673
/*
1674
* Verify the signature on the certificate with the provided public key.
1675
* This function checks the public key type with regards to the expected
1676
* type. Returned value is either 0 on success, or a non-zero error code.
1677
*/
1678
static int
1679
verify_signature(br_x509_minimal_context *ctx, const br_x509_pkey *pk)
1680
{
1681
int kt;
1682
1683
kt = ctx->cert_signer_key_type;
1684
if ((pk->key_type & 0x0F) != kt) {
1685
return BR_ERR_X509_WRONG_KEY_TYPE;
1686
}
1687
switch (kt) {
1688
unsigned char tmp[64];
1689
1690
case BR_KEYTYPE_RSA:
1691
if (ctx->irsa == 0) {
1692
return BR_ERR_X509_UNSUPPORTED;
1693
}
1694
if (!ctx->irsa(ctx->cert_sig, ctx->cert_sig_len,
1695
&t0_datablock[ctx->cert_sig_hash_oid],
1696
ctx->cert_sig_hash_len, &pk->key.rsa, tmp))
1697
{
1698
return BR_ERR_X509_BAD_SIGNATURE;
1699
}
1700
if (memcmp(ctx->tbs_hash, tmp, ctx->cert_sig_hash_len) != 0) {
1701
return BR_ERR_X509_BAD_SIGNATURE;
1702
}
1703
return 0;
1704
1705
case BR_KEYTYPE_EC:
1706
if (ctx->iecdsa == 0) {
1707
return BR_ERR_X509_UNSUPPORTED;
1708
}
1709
if (!ctx->iecdsa(ctx->iec, ctx->tbs_hash,
1710
ctx->cert_sig_hash_len, &pk->key.ec,
1711
ctx->cert_sig, ctx->cert_sig_len))
1712
{
1713
return BR_ERR_X509_BAD_SIGNATURE;
1714
}
1715
return 0;
1716
1717
default:
1718
return BR_ERR_X509_UNSUPPORTED;
1719
}
1720
}
1721
1722
1723
1724