]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/bearssl/src/x509/x509_decoder.c
Add libbearssl
[FreeBSD/FreeBSD.git] / contrib / bearssl / src / x509 / x509_decoder.c
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_decoder_init_main(void *t0ctx);
65
66 void br_x509_decoder_run(void *t0ctx);
67
68
69
70 #include "inner.h"
71
72
73
74
75
76 #include "inner.h"
77
78 #define CTX   ((br_x509_decoder_context *)(void *)((unsigned char *)t0ctx - offsetof(br_x509_decoder_context, cpu)))
79 #define CONTEXT_NAME   br_x509_decoder_context
80
81 /* see bearssl_x509.h */
82 void
83 br_x509_decoder_init(br_x509_decoder_context *ctx,
84         void (*append_dn)(void *ctx, const void *buf, size_t len),
85         void *append_dn_ctx)
86 {
87         memset(ctx, 0, sizeof *ctx);
88         /* obsolete
89         ctx->err = 0;
90         ctx->hbuf = NULL;
91         ctx->hlen = 0;
92         */
93         ctx->append_dn = append_dn;
94         ctx->append_dn_ctx = append_dn_ctx;
95         ctx->cpu.dp = &ctx->dp_stack[0];
96         ctx->cpu.rp = &ctx->rp_stack[0];
97         br_x509_decoder_init_main(&ctx->cpu);
98         br_x509_decoder_run(&ctx->cpu);
99 }
100
101 /* see bearssl_x509.h */
102 void
103 br_x509_decoder_push(br_x509_decoder_context *ctx,
104         const void *data, size_t len)
105 {
106         ctx->hbuf = data;
107         ctx->hlen = len;
108         br_x509_decoder_run(&ctx->cpu);
109 }
110
111
112
113 static const unsigned char t0_datablock[] = {
114         0x00, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x09,
115         0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x05, 0x09, 0x2A, 0x86,
116         0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0E, 0x09, 0x2A, 0x86, 0x48, 0x86,
117         0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D,
118         0x01, 0x01, 0x0C, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01,
119         0x0D, 0x07, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x02, 0x01, 0x08, 0x2A, 0x86,
120         0x48, 0xCE, 0x3D, 0x03, 0x01, 0x07, 0x05, 0x2B, 0x81, 0x04, 0x00, 0x22,
121         0x05, 0x2B, 0x81, 0x04, 0x00, 0x23, 0x07, 0x2A, 0x86, 0x48, 0xCE, 0x3D,
122         0x04, 0x01, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x04, 0x03, 0x01, 0x08,
123         0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x04, 0x03, 0x02, 0x08, 0x2A, 0x86, 0x48,
124         0xCE, 0x3D, 0x04, 0x03, 0x03, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x04,
125         0x03, 0x04, 0x00, 0x1F, 0x03, 0xFC, 0x07, 0x7F, 0x0B, 0x5E, 0x0F, 0x1F,
126         0x12, 0xFE, 0x16, 0xBF, 0x1A, 0x9F, 0x1E, 0x7E, 0x22, 0x3F, 0x26, 0x1E,
127         0x29, 0xDF, 0x00, 0x1F, 0x03, 0xFD, 0x07, 0x9F, 0x0B, 0x7E, 0x0F, 0x3F,
128         0x13, 0x1E, 0x16, 0xDF, 0x1A, 0xBF, 0x1E, 0x9E, 0x22, 0x5F, 0x26, 0x3E,
129         0x29, 0xFF, 0x03, 0x55, 0x1D, 0x13
130 };
131
132 static const unsigned char t0_codeblock[] = {
133         0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00, 0x11, 0x00, 0x00, 0x01,
134         0x01, 0x09, 0x00, 0x00, 0x01, 0x01, 0x0A, 0x00, 0x00, 0x1A, 0x1A, 0x00,
135         0x00, 0x01, T0_INT1(BR_ERR_X509_BAD_BOOLEAN), 0x00, 0x00, 0x01,
136         T0_INT1(BR_ERR_X509_BAD_TAG_CLASS), 0x00, 0x00, 0x01,
137         T0_INT1(BR_ERR_X509_BAD_TAG_VALUE), 0x00, 0x00, 0x01,
138         T0_INT1(BR_ERR_X509_BAD_TIME), 0x00, 0x00, 0x01,
139         T0_INT1(BR_ERR_X509_EXTRA_ELEMENT), 0x00, 0x00, 0x01,
140         T0_INT1(BR_ERR_X509_INDEFINITE_LENGTH), 0x00, 0x00, 0x01,
141         T0_INT1(BR_ERR_X509_INNER_TRUNC), 0x00, 0x00, 0x01,
142         T0_INT1(BR_ERR_X509_LIMIT_EXCEEDED), 0x00, 0x00, 0x01,
143         T0_INT1(BR_ERR_X509_NOT_CONSTRUCTED), 0x00, 0x00, 0x01,
144         T0_INT1(BR_ERR_X509_NOT_PRIMITIVE), 0x00, 0x00, 0x01,
145         T0_INT1(BR_ERR_X509_OVERFLOW), 0x00, 0x00, 0x01,
146         T0_INT1(BR_ERR_X509_PARTIAL_BYTE), 0x00, 0x00, 0x01,
147         T0_INT1(BR_ERR_X509_UNEXPECTED), 0x00, 0x00, 0x01,
148         T0_INT1(BR_ERR_X509_UNSUPPORTED), 0x00, 0x00, 0x01,
149         T0_INT1(BR_KEYTYPE_EC), 0x00, 0x00, 0x01, T0_INT1(BR_KEYTYPE_RSA),
150         0x00, 0x00, 0x01, T0_INT2(offsetof(CONTEXT_NAME, copy_dn)), 0x00, 0x00,
151         0x01, T0_INT2(offsetof(CONTEXT_NAME, decoded)), 0x00, 0x00, 0x01,
152         T0_INT2(offsetof(CONTEXT_NAME, isCA)), 0x00, 0x00, 0x01,
153         T0_INT2(offsetof(br_x509_decoder_context, pkey_data)), 0x01,
154         T0_INT2(BR_X509_BUFSIZE_KEY), 0x00, 0x00, 0x01,
155         T0_INT2(offsetof(CONTEXT_NAME, notafter_days)), 0x00, 0x00, 0x01,
156         T0_INT2(offsetof(CONTEXT_NAME, notafter_seconds)), 0x00, 0x00, 0x01,
157         T0_INT2(offsetof(CONTEXT_NAME, notbefore_days)), 0x00, 0x00, 0x01,
158         T0_INT2(offsetof(CONTEXT_NAME, notbefore_seconds)), 0x00, 0x00, 0x01,
159         T0_INT2(offsetof(CONTEXT_NAME, pad)), 0x00, 0x00, 0x01,
160         T0_INT2(offsetof(CONTEXT_NAME, signer_hash_id)), 0x00, 0x00, 0x01,
161         T0_INT2(offsetof(CONTEXT_NAME, signer_key_type)), 0x00, 0x00, 0x01,
162         0x80, 0x45, 0x00, 0x00, 0x01, 0x80, 0x4E, 0x00, 0x00, 0x01, 0x80, 0x54,
163         0x00, 0x00, 0x01, 0x81, 0x36, 0x00, 0x02, 0x03, 0x00, 0x03, 0x01, 0x1B,
164         0x02, 0x01, 0x13, 0x26, 0x02, 0x00, 0x0F, 0x15, 0x00, 0x00, 0x05, 0x02,
165         0x34, 0x1D, 0x00, 0x00, 0x06, 0x02, 0x35, 0x1D, 0x00, 0x00, 0x01, 0x10,
166         0x4F, 0x00, 0x00, 0x11, 0x05, 0x02, 0x38, 0x1D, 0x4C, 0x00, 0x00, 0x11,
167         0x05, 0x02, 0x38, 0x1D, 0x4D, 0x00, 0x00, 0x06, 0x02, 0x30, 0x1D, 0x00,
168         0x00, 0x1B, 0x19, 0x01, 0x08, 0x0E, 0x26, 0x29, 0x19, 0x09, 0x00, 0x00,
169         0x01, 0x30, 0x0A, 0x1B, 0x01, 0x00, 0x01, 0x09, 0x4B, 0x05, 0x02, 0x2F,
170         0x1D, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x01, 0x80, 0x5A, 0x00, 0x00,
171         0x01, 0x80, 0x62, 0x00, 0x00, 0x01, 0x80, 0x6B, 0x00, 0x00, 0x01, 0x80,
172         0x74, 0x00, 0x00, 0x01, 0x80, 0x7D, 0x00, 0x00, 0x01, 0x3D, 0x00, 0x00,
173         0x20, 0x11, 0x06, 0x04, 0x2B, 0x6B, 0x7A, 0x71, 0x00, 0x04, 0x01, 0x00,
174         0x3D, 0x25, 0x01, 0x00, 0x3C, 0x25, 0x01, 0x87, 0xFF, 0xFF, 0x7F, 0x6D,
175         0x6D, 0x70, 0x1B, 0x01, 0x20, 0x11, 0x06, 0x11, 0x1A, 0x4C, 0x6B, 0x70,
176         0x01, 0x02, 0x50, 0x6E, 0x01, 0x02, 0x12, 0x06, 0x02, 0x39, 0x1D, 0x51,
177         0x70, 0x01, 0x02, 0x50, 0x6C, 0x6D, 0x7A, 0x6D, 0x7A, 0x6D, 0x65, 0x43,
178         0x24, 0x42, 0x24, 0x65, 0x41, 0x24, 0x40, 0x24, 0x51, 0x01, 0x01, 0x3C,
179         0x25, 0x6D, 0x7A, 0x01, 0x00, 0x3C, 0x25, 0x6D, 0x6D, 0x60, 0x05, 0x02,
180         0x39, 0x1D, 0x74, 0x1C, 0x06, 0x1C, 0x7A, 0x61, 0x6D, 0x3F, 0x68, 0x03,
181         0x00, 0x3F, 0x26, 0x02, 0x00, 0x09, 0x26, 0x02, 0x00, 0x0A, 0x68, 0x03,
182         0x01, 0x51, 0x51, 0x02, 0x00, 0x02, 0x01, 0x18, 0x04, 0x1E, 0x5A, 0x1C,
183         0x06, 0x18, 0x64, 0x03, 0x02, 0x51, 0x61, 0x1B, 0x03, 0x03, 0x1B, 0x3F,
184         0x23, 0x0D, 0x06, 0x02, 0x33, 0x1D, 0x62, 0x02, 0x02, 0x02, 0x03, 0x17,
185         0x04, 0x02, 0x39, 0x1D, 0x51, 0x01, 0x00, 0x3E, 0x25, 0x71, 0x01, 0x21,
186         0x5B, 0x01, 0x22, 0x5B, 0x1B, 0x01, 0x23, 0x11, 0x06, 0x28, 0x1A, 0x4C,
187         0x6B, 0x6D, 0x1B, 0x06, 0x1D, 0x6D, 0x60, 0x1A, 0x70, 0x1B, 0x01, 0x01,
188         0x11, 0x06, 0x03, 0x63, 0x1A, 0x70, 0x01, 0x04, 0x50, 0x6B, 0x4A, 0x1C,
189         0x06, 0x03, 0x5F, 0x04, 0x01, 0x7B, 0x51, 0x51, 0x04, 0x60, 0x51, 0x51,
190         0x04, 0x08, 0x01, 0x7F, 0x11, 0x05, 0x02, 0x38, 0x1D, 0x1A, 0x51, 0x6D,
191         0x60, 0x06, 0x80, 0x63, 0x75, 0x1C, 0x06, 0x06, 0x01, 0x02, 0x3B, 0x04,
192         0x80, 0x57, 0x76, 0x1C, 0x06, 0x06, 0x01, 0x03, 0x3B, 0x04, 0x80, 0x4D,
193         0x77, 0x1C, 0x06, 0x06, 0x01, 0x04, 0x3B, 0x04, 0x80, 0x43, 0x78, 0x1C,
194         0x06, 0x05, 0x01, 0x05, 0x3B, 0x04, 0x3A, 0x79, 0x1C, 0x06, 0x05, 0x01,
195         0x06, 0x3B, 0x04, 0x31, 0x55, 0x1C, 0x06, 0x05, 0x01, 0x02, 0x3A, 0x04,
196         0x28, 0x56, 0x1C, 0x06, 0x05, 0x01, 0x03, 0x3A, 0x04, 0x1F, 0x57, 0x1C,
197         0x06, 0x05, 0x01, 0x04, 0x3A, 0x04, 0x16, 0x58, 0x1C, 0x06, 0x05, 0x01,
198         0x05, 0x3A, 0x04, 0x0D, 0x59, 0x1C, 0x06, 0x05, 0x01, 0x06, 0x3A, 0x04,
199         0x04, 0x01, 0x00, 0x01, 0x00, 0x04, 0x04, 0x01, 0x00, 0x01, 0x00, 0x46,
200         0x25, 0x45, 0x25, 0x7A, 0x61, 0x7A, 0x51, 0x1A, 0x01, 0x01, 0x3D, 0x25,
201         0x73, 0x30, 0x1D, 0x00, 0x00, 0x01, 0x81, 0x06, 0x00, 0x01, 0x54, 0x0D,
202         0x06, 0x02, 0x32, 0x1D, 0x1B, 0x03, 0x00, 0x0A, 0x02, 0x00, 0x00, 0x00,
203         0x6D, 0x71, 0x1B, 0x01, 0x01, 0x11, 0x06, 0x08, 0x63, 0x01, 0x01, 0x15,
204         0x3E, 0x25, 0x04, 0x01, 0x2B, 0x7A, 0x00, 0x00, 0x70, 0x01, 0x06, 0x50,
205         0x6F, 0x00, 0x00, 0x70, 0x01, 0x03, 0x50, 0x6B, 0x72, 0x06, 0x02, 0x37,
206         0x1D, 0x00, 0x00, 0x26, 0x1B, 0x06, 0x07, 0x21, 0x1B, 0x06, 0x01, 0x16,
207         0x04, 0x76, 0x2B, 0x00, 0x00, 0x01, 0x01, 0x50, 0x6A, 0x01, 0x01, 0x10,
208         0x06, 0x02, 0x2C, 0x1D, 0x72, 0x27, 0x00, 0x00, 0x60, 0x05, 0x02, 0x39,
209         0x1D, 0x47, 0x1C, 0x06, 0x04, 0x01, 0x17, 0x04, 0x12, 0x48, 0x1C, 0x06,
210         0x04, 0x01, 0x18, 0x04, 0x0A, 0x49, 0x1C, 0x06, 0x04, 0x01, 0x19, 0x04,
211         0x02, 0x39, 0x1D, 0x00, 0x04, 0x70, 0x1B, 0x01, 0x17, 0x01, 0x18, 0x4B,
212         0x05, 0x02, 0x2F, 0x1D, 0x01, 0x18, 0x11, 0x03, 0x00, 0x4D, 0x6B, 0x66,
213         0x02, 0x00, 0x06, 0x0C, 0x01, 0x80, 0x64, 0x08, 0x03, 0x01, 0x66, 0x02,
214         0x01, 0x09, 0x04, 0x0E, 0x1B, 0x01, 0x32, 0x0D, 0x06, 0x04, 0x01, 0x80,
215         0x64, 0x09, 0x01, 0x8E, 0x6C, 0x09, 0x03, 0x01, 0x02, 0x01, 0x01, 0x82,
216         0x6D, 0x08, 0x02, 0x01, 0x01, 0x03, 0x09, 0x01, 0x04, 0x0C, 0x09, 0x02,
217         0x01, 0x01, 0x80, 0x63, 0x09, 0x01, 0x80, 0x64, 0x0C, 0x0A, 0x02, 0x01,
218         0x01, 0x83, 0x0F, 0x09, 0x01, 0x83, 0x10, 0x0C, 0x09, 0x03, 0x03, 0x01,
219         0x01, 0x01, 0x0C, 0x67, 0x2A, 0x01, 0x01, 0x0E, 0x02, 0x01, 0x01, 0x04,
220         0x07, 0x28, 0x02, 0x01, 0x01, 0x80, 0x64, 0x07, 0x27, 0x02, 0x01, 0x01,
221         0x83, 0x10, 0x07, 0x28, 0x1F, 0x15, 0x06, 0x03, 0x01, 0x18, 0x09, 0x5D,
222         0x09, 0x52, 0x1B, 0x01, 0x05, 0x14, 0x02, 0x03, 0x09, 0x03, 0x03, 0x01,
223         0x1F, 0x15, 0x01, 0x01, 0x26, 0x67, 0x02, 0x03, 0x09, 0x2A, 0x03, 0x03,
224         0x01, 0x00, 0x01, 0x17, 0x67, 0x01, 0x9C, 0x10, 0x08, 0x03, 0x02, 0x01,
225         0x00, 0x01, 0x3B, 0x67, 0x01, 0x3C, 0x08, 0x02, 0x02, 0x09, 0x03, 0x02,
226         0x01, 0x00, 0x01, 0x3C, 0x67, 0x02, 0x02, 0x09, 0x03, 0x02, 0x72, 0x1B,
227         0x01, 0x2E, 0x11, 0x06, 0x0D, 0x1A, 0x72, 0x1B, 0x01, 0x30, 0x01, 0x39,
228         0x4B, 0x06, 0x03, 0x1A, 0x04, 0x74, 0x01, 0x80, 0x5A, 0x10, 0x06, 0x02,
229         0x2F, 0x1D, 0x51, 0x02, 0x03, 0x02, 0x02, 0x00, 0x01, 0x72, 0x53, 0x01,
230         0x0A, 0x08, 0x03, 0x00, 0x72, 0x53, 0x02, 0x00, 0x09, 0x00, 0x02, 0x03,
231         0x00, 0x03, 0x01, 0x66, 0x1B, 0x02, 0x01, 0x02, 0x00, 0x4B, 0x05, 0x02,
232         0x2F, 0x1D, 0x00, 0x00, 0x23, 0x70, 0x01, 0x02, 0x50, 0x0B, 0x69, 0x00,
233         0x03, 0x1B, 0x03, 0x00, 0x03, 0x01, 0x03, 0x02, 0x6B, 0x72, 0x1B, 0x01,
234         0x81, 0x00, 0x13, 0x06, 0x02, 0x36, 0x1D, 0x1B, 0x01, 0x00, 0x11, 0x06,
235         0x0B, 0x1A, 0x1B, 0x05, 0x04, 0x1A, 0x01, 0x00, 0x00, 0x72, 0x04, 0x6F,
236         0x02, 0x01, 0x1B, 0x05, 0x02, 0x33, 0x1D, 0x2A, 0x03, 0x01, 0x02, 0x02,
237         0x25, 0x02, 0x02, 0x29, 0x03, 0x02, 0x1B, 0x06, 0x03, 0x72, 0x04, 0x68,
238         0x1A, 0x02, 0x00, 0x02, 0x01, 0x0A, 0x00, 0x01, 0x72, 0x1B, 0x01, 0x81,
239         0x00, 0x0D, 0x06, 0x01, 0x00, 0x01, 0x81, 0x00, 0x0A, 0x1B, 0x05, 0x02,
240         0x31, 0x1D, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x12, 0x06,
241         0x19, 0x02, 0x00, 0x2A, 0x03, 0x00, 0x1B, 0x01, 0x83, 0xFF, 0xFF, 0x7F,
242         0x12, 0x06, 0x02, 0x32, 0x1D, 0x01, 0x08, 0x0E, 0x26, 0x72, 0x23, 0x09,
243         0x04, 0x60, 0x00, 0x00, 0x6A, 0x5E, 0x00, 0x00, 0x6B, 0x7A, 0x00, 0x00,
244         0x70, 0x4E, 0x6B, 0x00, 0x01, 0x6B, 0x1B, 0x05, 0x02, 0x36, 0x1D, 0x72,
245         0x1B, 0x01, 0x81, 0x00, 0x13, 0x06, 0x02, 0x36, 0x1D, 0x03, 0x00, 0x1B,
246         0x06, 0x16, 0x72, 0x02, 0x00, 0x1B, 0x01, 0x87, 0xFF, 0xFF, 0x7F, 0x13,
247         0x06, 0x02, 0x36, 0x1D, 0x01, 0x08, 0x0E, 0x09, 0x03, 0x00, 0x04, 0x67,
248         0x1A, 0x02, 0x00, 0x00, 0x00, 0x6B, 0x1B, 0x01, 0x81, 0x7F, 0x12, 0x06,
249         0x08, 0x7A, 0x01, 0x00, 0x44, 0x25, 0x01, 0x00, 0x00, 0x1B, 0x44, 0x25,
250         0x44, 0x29, 0x62, 0x01, 0x7F, 0x00, 0x01, 0x72, 0x03, 0x00, 0x02, 0x00,
251         0x01, 0x05, 0x14, 0x01, 0x01, 0x15, 0x1E, 0x02, 0x00, 0x01, 0x06, 0x14,
252         0x1B, 0x01, 0x01, 0x15, 0x06, 0x02, 0x2D, 0x1D, 0x01, 0x04, 0x0E, 0x02,
253         0x00, 0x01, 0x1F, 0x15, 0x1B, 0x01, 0x1F, 0x11, 0x06, 0x02, 0x2E, 0x1D,
254         0x09, 0x00, 0x00, 0x1B, 0x05, 0x05, 0x01, 0x00, 0x01, 0x7F, 0x00, 0x70,
255         0x00, 0x00, 0x1B, 0x05, 0x02, 0x32, 0x1D, 0x2A, 0x73, 0x00, 0x00, 0x22,
256         0x1B, 0x01, 0x00, 0x13, 0x06, 0x01, 0x00, 0x1A, 0x16, 0x04, 0x74, 0x00,
257         0x01, 0x01, 0x00, 0x00, 0x01, 0x0B, 0x00, 0x00, 0x01, 0x15, 0x00, 0x00,
258         0x01, 0x1F, 0x00, 0x00, 0x01, 0x29, 0x00, 0x00, 0x01, 0x33, 0x00, 0x00,
259         0x7B, 0x1A, 0x00, 0x00, 0x1B, 0x06, 0x07, 0x7C, 0x1B, 0x06, 0x01, 0x16,
260         0x04, 0x76, 0x00, 0x00, 0x01, 0x00, 0x20, 0x21, 0x0B, 0x2B, 0x00
261 };
262
263 static const uint16_t t0_caddr[] = {
264         0,
265         5,
266         10,
267         15,
268         20,
269         24,
270         28,
271         32,
272         36,
273         40,
274         44,
275         48,
276         52,
277         56,
278         60,
279         64,
280         68,
281         72,
282         76,
283         80,
284         84,
285         88,
286         93,
287         98,
288         103,
289         111,
290         116,
291         121,
292         126,
293         131,
294         136,
295         141,
296         146,
297         151,
298         156,
299         161,
300         166,
301         181,
302         187,
303         193,
304         198,
305         206,
306         214,
307         220,
308         231,
309         246,
310         250,
311         255,
312         260,
313         265,
314         270,
315         275,
316         279,
317         289,
318         620,
319         625,
320         639,
321         659,
322         666,
323         678,
324         692,
325         707,
326         740,
327         960,
328         974,
329         991,
330         1000,
331         1067,
332         1123,
333         1127,
334         1131,
335         1136,
336         1184,
337         1210,
338         1254,
339         1265,
340         1274,
341         1287,
342         1291,
343         1295,
344         1299,
345         1303,
346         1307,
347         1311,
348         1315,
349         1327
350 };
351
352 #define T0_INTERPRETED   39
353
354 #define T0_ENTER(ip, rp, slot)   do { \
355                 const unsigned char *t0_newip; \
356                 uint32_t t0_lnum; \
357                 t0_newip = &t0_codeblock[t0_caddr[(slot) - T0_INTERPRETED]]; \
358                 t0_lnum = t0_parse7E_unsigned(&t0_newip); \
359                 (rp) += t0_lnum; \
360                 *((rp) ++) = (uint32_t)((ip) - &t0_codeblock[0]) + (t0_lnum << 16); \
361                 (ip) = t0_newip; \
362         } while (0)
363
364 #define T0_DEFENTRY(name, slot) \
365 void \
366 name(void *ctx) \
367 { \
368         t0_context *t0ctx = ctx; \
369         t0ctx->ip = &t0_codeblock[0]; \
370         T0_ENTER(t0ctx->ip, t0ctx->rp, slot); \
371 }
372
373 T0_DEFENTRY(br_x509_decoder_init_main, 92)
374
375 #define T0_NEXT(t0ipp)   (*(*(t0ipp)) ++)
376
377 void
378 br_x509_decoder_run(void *t0ctx)
379 {
380         uint32_t *dp, *rp;
381         const unsigned char *ip;
382
383 #define T0_LOCAL(x)    (*(rp - 2 - (x)))
384 #define T0_POP()       (*-- dp)
385 #define T0_POPi()      (*(int32_t *)(-- dp))
386 #define T0_PEEK(x)     (*(dp - 1 - (x)))
387 #define T0_PEEKi(x)    (*(int32_t *)(dp - 1 - (x)))
388 #define T0_PUSH(v)     do { *dp = (v); dp ++; } while (0)
389 #define T0_PUSHi(v)    do { *(int32_t *)dp = (v); dp ++; } while (0)
390 #define T0_RPOP()      (*-- rp)
391 #define T0_RPOPi()     (*(int32_t *)(-- rp))
392 #define T0_RPUSH(v)    do { *rp = (v); rp ++; } while (0)
393 #define T0_RPUSHi(v)   do { *(int32_t *)rp = (v); rp ++; } while (0)
394 #define T0_ROLL(x)     do { \
395         size_t t0len = (size_t)(x); \
396         uint32_t t0tmp = *(dp - 1 - t0len); \
397         memmove(dp - t0len - 1, dp - t0len, t0len * sizeof *dp); \
398         *(dp - 1) = t0tmp; \
399 } while (0)
400 #define T0_SWAP()      do { \
401         uint32_t t0tmp = *(dp - 2); \
402         *(dp - 2) = *(dp - 1); \
403         *(dp - 1) = t0tmp; \
404 } while (0)
405 #define T0_ROT()       do { \
406         uint32_t t0tmp = *(dp - 3); \
407         *(dp - 3) = *(dp - 2); \
408         *(dp - 2) = *(dp - 1); \
409         *(dp - 1) = t0tmp; \
410 } while (0)
411 #define T0_NROT()       do { \
412         uint32_t t0tmp = *(dp - 1); \
413         *(dp - 1) = *(dp - 2); \
414         *(dp - 2) = *(dp - 3); \
415         *(dp - 3) = t0tmp; \
416 } while (0)
417 #define T0_PICK(x)      do { \
418         uint32_t t0depth = (x); \
419         T0_PUSH(T0_PEEK(t0depth)); \
420 } while (0)
421 #define T0_CO()         do { \
422         goto t0_exit; \
423 } while (0)
424 #define T0_RET()        goto t0_next
425
426         dp = ((t0_context *)t0ctx)->dp;
427         rp = ((t0_context *)t0ctx)->rp;
428         ip = ((t0_context *)t0ctx)->ip;
429         goto t0_next;
430         for (;;) {
431                 uint32_t t0x;
432
433         t0_next:
434                 t0x = T0_NEXT(&ip);
435                 if (t0x < T0_INTERPRETED) {
436                         switch (t0x) {
437                                 int32_t t0off;
438
439                         case 0: /* ret */
440                                 t0x = T0_RPOP();
441                                 rp -= (t0x >> 16);
442                                 t0x &= 0xFFFF;
443                                 if (t0x == 0) {
444                                         ip = NULL;
445                                         goto t0_exit;
446                                 }
447                                 ip = &t0_codeblock[t0x];
448                                 break;
449                         case 1: /* literal constant */
450                                 T0_PUSHi(t0_parse7E_signed(&ip));
451                                 break;
452                         case 2: /* read local */
453                                 T0_PUSH(T0_LOCAL(t0_parse7E_unsigned(&ip)));
454                                 break;
455                         case 3: /* write local */
456                                 T0_LOCAL(t0_parse7E_unsigned(&ip)) = T0_POP();
457                                 break;
458                         case 4: /* jump */
459                                 t0off = t0_parse7E_signed(&ip);
460                                 ip += t0off;
461                                 break;
462                         case 5: /* jump if */
463                                 t0off = t0_parse7E_signed(&ip);
464                                 if (T0_POP()) {
465                                         ip += t0off;
466                                 }
467                                 break;
468                         case 6: /* jump if not */
469                                 t0off = t0_parse7E_signed(&ip);
470                                 if (!T0_POP()) {
471                                         ip += t0off;
472                                 }
473                                 break;
474                         case 7: {
475                                 /* %25 */
476
477         int32_t b = T0_POPi();
478         int32_t a = T0_POPi();
479         T0_PUSHi(a % b);
480
481                                 }
482                                 break;
483                         case 8: {
484                                 /* * */
485
486         uint32_t b = T0_POP();
487         uint32_t a = T0_POP();
488         T0_PUSH(a * b);
489
490                                 }
491                                 break;
492                         case 9: {
493                                 /* + */
494
495         uint32_t b = T0_POP();
496         uint32_t a = T0_POP();
497         T0_PUSH(a + b);
498
499                                 }
500                                 break;
501                         case 10: {
502                                 /* - */
503
504         uint32_t b = T0_POP();
505         uint32_t a = T0_POP();
506         T0_PUSH(a - b);
507
508                                 }
509                                 break;
510                         case 11: {
511                                 /* -rot */
512  T0_NROT(); 
513                                 }
514                                 break;
515                         case 12: {
516                                 /* / */
517
518         int32_t b = T0_POPi();
519         int32_t a = T0_POPi();
520         T0_PUSHi(a / b);
521
522                                 }
523                                 break;
524                         case 13: {
525                                 /* < */
526
527         int32_t b = T0_POPi();
528         int32_t a = T0_POPi();
529         T0_PUSH(-(uint32_t)(a < b));
530
531                                 }
532                                 break;
533                         case 14: {
534                                 /* << */
535
536         int c = (int)T0_POPi();
537         uint32_t x = T0_POP();
538         T0_PUSH(x << c);
539
540                                 }
541                                 break;
542                         case 15: {
543                                 /* <= */
544
545         int32_t b = T0_POPi();
546         int32_t a = T0_POPi();
547         T0_PUSH(-(uint32_t)(a <= b));
548
549                                 }
550                                 break;
551                         case 16: {
552                                 /* <> */
553
554         uint32_t b = T0_POP();
555         uint32_t a = T0_POP();
556         T0_PUSH(-(uint32_t)(a != b));
557
558                                 }
559                                 break;
560                         case 17: {
561                                 /* = */
562
563         uint32_t b = T0_POP();
564         uint32_t a = T0_POP();
565         T0_PUSH(-(uint32_t)(a == b));
566
567                                 }
568                                 break;
569                         case 18: {
570                                 /* > */
571
572         int32_t b = T0_POPi();
573         int32_t a = T0_POPi();
574         T0_PUSH(-(uint32_t)(a > b));
575
576                                 }
577                                 break;
578                         case 19: {
579                                 /* >= */
580
581         int32_t b = T0_POPi();
582         int32_t a = T0_POPi();
583         T0_PUSH(-(uint32_t)(a >= b));
584
585                                 }
586                                 break;
587                         case 20: {
588                                 /* >> */
589
590         int c = (int)T0_POPi();
591         int32_t x = T0_POPi();
592         T0_PUSHi(x >> c);
593
594                                 }
595                                 break;
596                         case 21: {
597                                 /* and */
598
599         uint32_t b = T0_POP();
600         uint32_t a = T0_POP();
601         T0_PUSH(a & b);
602
603                                 }
604                                 break;
605                         case 22: {
606                                 /* co */
607  T0_CO(); 
608                                 }
609                                 break;
610                         case 23: {
611                                 /* copy-ec-pkey */
612
613         size_t qlen = T0_POP();
614         uint32_t curve = T0_POP();
615         CTX->pkey.key_type = BR_KEYTYPE_EC;
616         CTX->pkey.key.ec.curve = curve;
617         CTX->pkey.key.ec.q = CTX->pkey_data;
618         CTX->pkey.key.ec.qlen = qlen;
619
620                                 }
621                                 break;
622                         case 24: {
623                                 /* copy-rsa-pkey */
624
625         size_t elen = T0_POP();
626         size_t nlen = T0_POP();
627         CTX->pkey.key_type = BR_KEYTYPE_RSA;
628         CTX->pkey.key.rsa.n = CTX->pkey_data;
629         CTX->pkey.key.rsa.nlen = nlen;
630         CTX->pkey.key.rsa.e = CTX->pkey_data + nlen;
631         CTX->pkey.key.rsa.elen = elen;
632
633                                 }
634                                 break;
635                         case 25: {
636                                 /* data-get8 */
637
638         size_t addr = T0_POP();
639         T0_PUSH(t0_datablock[addr]);
640
641                                 }
642                                 break;
643                         case 26: {
644                                 /* drop */
645  (void)T0_POP(); 
646                                 }
647                                 break;
648                         case 27: {
649                                 /* dup */
650  T0_PUSH(T0_PEEK(0)); 
651                                 }
652                                 break;
653                         case 28: {
654                                 /* eqOID */
655
656         const unsigned char *a2 = &t0_datablock[T0_POP()];
657         const unsigned char *a1 = &CTX->pad[0];
658         size_t len = a1[0];
659         int x;
660         if (len == a2[0]) {
661                 x = -(memcmp(a1 + 1, a2 + 1, len) == 0);
662         } else {
663                 x = 0;
664         }
665         T0_PUSH((uint32_t)x);
666
667                                 }
668                                 break;
669                         case 29: {
670                                 /* fail */
671
672         CTX->err = T0_POPi();
673         T0_CO();
674
675                                 }
676                                 break;
677                         case 30: {
678                                 /* neg */
679
680         uint32_t a = T0_POP();
681         T0_PUSH(-a);
682
683                                 }
684                                 break;
685                         case 31: {
686                                 /* or */
687
688         uint32_t b = T0_POP();
689         uint32_t a = T0_POP();
690         T0_PUSH(a | b);
691
692                                 }
693                                 break;
694                         case 32: {
695                                 /* over */
696  T0_PUSH(T0_PEEK(1)); 
697                                 }
698                                 break;
699                         case 33: {
700                                 /* read-blob-inner */
701
702         uint32_t len = T0_POP();
703         uint32_t addr = T0_POP();
704         size_t clen = CTX->hlen;
705         if (clen > len) {
706                 clen = (size_t)len;
707         }
708         if (addr != 0) {
709                 memcpy((unsigned char *)CTX + addr, CTX->hbuf, clen);
710         }
711         if (CTX->copy_dn && CTX->append_dn) {
712                 CTX->append_dn(CTX->append_dn_ctx, CTX->hbuf, clen);
713         }
714         CTX->hbuf += clen;
715         CTX->hlen -= clen;
716         T0_PUSH(addr + clen);
717         T0_PUSH(len - clen);
718
719                                 }
720                                 break;
721                         case 34: {
722                                 /* read8-low */
723
724         if (CTX->hlen == 0) {
725                 T0_PUSHi(-1);
726         } else {
727                 unsigned char x = *CTX->hbuf ++;
728                 if (CTX->copy_dn && CTX->append_dn) {
729                         CTX->append_dn(CTX->append_dn_ctx, &x, 1);
730                 }
731                 CTX->hlen --;
732                 T0_PUSH(x);
733         }
734
735                                 }
736                                 break;
737                         case 35: {
738                                 /* rot */
739  T0_ROT(); 
740                                 }
741                                 break;
742                         case 36: {
743                                 /* set32 */
744
745         uint32_t addr = T0_POP();
746         *(uint32_t *)(void *)((unsigned char *)CTX + addr) = T0_POP();
747
748                                 }
749                                 break;
750                         case 37: {
751                                 /* set8 */
752
753         uint32_t addr = T0_POP();
754         *((unsigned char *)CTX + addr) = (unsigned char)T0_POP();
755
756                                 }
757                                 break;
758                         case 38: {
759                                 /* swap */
760  T0_SWAP(); 
761                                 }
762                                 break;
763                         }
764
765                 } else {
766                         T0_ENTER(ip, rp, t0x);
767                 }
768         }
769 t0_exit:
770         ((t0_context *)t0ctx)->dp = dp;
771         ((t0_context *)t0ctx)->rp = rp;
772         ((t0_context *)t0ctx)->ip = ip;
773 }