]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/bearssl/src/codec/pemdec.c
Update ELF Tool Chain to upstream r3769
[FreeBSD/FreeBSD.git] / contrib / bearssl / src / codec / pemdec.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_pem_decoder_init_main(void *t0ctx);
65
66 void br_pem_decoder_run(void *t0ctx);
67
68
69
70 #include "inner.h"
71
72 #define CTX   ((br_pem_decoder_context *)(void *)((unsigned char *)t0ctx - offsetof(br_pem_decoder_context, cpu)))
73
74 /* see bearssl_pem.h */
75 void
76 br_pem_decoder_init(br_pem_decoder_context *ctx)
77 {
78         memset(ctx, 0, sizeof *ctx);
79         ctx->cpu.dp = &ctx->dp_stack[0];
80         ctx->cpu.rp = &ctx->rp_stack[0];
81         br_pem_decoder_init_main(&ctx->cpu);
82         br_pem_decoder_run(&ctx->cpu);
83 }
84
85 /* see bearssl_pem.h */
86 size_t
87 br_pem_decoder_push(br_pem_decoder_context *ctx,
88         const void *data, size_t len)
89 {
90         if (ctx->event) {
91                 return 0;
92         }
93         ctx->hbuf = data;
94         ctx->hlen = len;
95         br_pem_decoder_run(&ctx->cpu);
96         return len - ctx->hlen;
97 }
98
99 /* see bearssl_pem.h */
100 int
101 br_pem_decoder_event(br_pem_decoder_context *ctx)
102 {
103         int event;
104
105         event = ctx->event;
106         ctx->event = 0;
107         return event;
108 }
109
110
111
112 static const unsigned char t0_datablock[] = {
113         0x00, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20,
114         0x00, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x00
115 };
116
117 static const unsigned char t0_codeblock[] = {
118         0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x01, 0x01, 0x07, 0x00, 0x00, 0x01,
119         0x01, 0x08, 0x00, 0x00, 0x13, 0x13, 0x00, 0x00, 0x01,
120         T0_INT2(offsetof(br_pem_decoder_context, event)), 0x00, 0x00, 0x01,
121         T0_INT2(offsetof(br_pem_decoder_context, name)), 0x00, 0x00, 0x05,
122         0x14, 0x2C, 0x14, 0x01, 0x0A, 0x0D, 0x06, 0x03, 0x13, 0x04, 0x76, 0x01,
123         0x2D, 0x0C, 0x06, 0x05, 0x2E, 0x01, 0x03, 0x2D, 0x00, 0x01, 0x0D, 0x27,
124         0x05, 0x04, 0x01, 0x03, 0x2D, 0x00, 0x15, 0x2E, 0x01, 0x02, 0x2D, 0x00,
125         0x01, 0x01, 0x7F, 0x03, 0x00, 0x25, 0x01, 0x00, 0x18, 0x0D, 0x06, 0x03,
126         0x13, 0x04, 0x3C, 0x01, 0x7F, 0x18, 0x0D, 0x06, 0x13, 0x13, 0x02, 0x00,
127         0x05, 0x06, 0x2E, 0x01, 0x03, 0x2D, 0x04, 0x03, 0x01, 0x7F, 0x23, 0x01,
128         0x00, 0x00, 0x04, 0x23, 0x01, 0x01, 0x18, 0x0D, 0x06, 0x09, 0x13, 0x01,
129         0x00, 0x23, 0x01, 0x00, 0x00, 0x04, 0x14, 0x01, 0x02, 0x18, 0x0D, 0x06,
130         0x06, 0x13, 0x01, 0x7F, 0x00, 0x04, 0x08, 0x13, 0x01, 0x03, 0x2D, 0x01,
131         0x00, 0x00, 0x13, 0x01, 0x00, 0x03, 0x00, 0x04, 0xFF, 0x33, 0x01, 0x2C,
132         0x14, 0x01, 0x2D, 0x0D, 0x06, 0x04, 0x13, 0x01, 0x7F, 0x00, 0x14, 0x31,
133         0x06, 0x02, 0x13, 0x29, 0x14, 0x01, 0x0A, 0x0D, 0x06, 0x04, 0x13, 0x01,
134         0x02, 0x00, 0x16, 0x14, 0x1D, 0x06, 0x05, 0x13, 0x2E, 0x01, 0x03, 0x00,
135         0x03, 0x00, 0x29, 0x14, 0x01, 0x0A, 0x0D, 0x06, 0x04, 0x13, 0x01, 0x03,
136         0x00, 0x16, 0x14, 0x1D, 0x06, 0x05, 0x13, 0x2E, 0x01, 0x03, 0x00, 0x02,
137         0x00, 0x01, 0x06, 0x0A, 0x07, 0x03, 0x00, 0x29, 0x14, 0x01, 0x0A, 0x0D,
138         0x06, 0x04, 0x13, 0x01, 0x03, 0x00, 0x14, 0x01, 0x3D, 0x0D, 0x06, 0x2E,
139         0x13, 0x29, 0x14, 0x01, 0x0A, 0x0D, 0x06, 0x04, 0x13, 0x01, 0x03, 0x00,
140         0x2F, 0x05, 0x04, 0x13, 0x01, 0x03, 0x00, 0x01, 0x3D, 0x0C, 0x06, 0x03,
141         0x01, 0x03, 0x00, 0x02, 0x00, 0x01, 0x0F, 0x10, 0x06, 0x03, 0x01, 0x03,
142         0x00, 0x02, 0x00, 0x01, 0x04, 0x0F, 0x1C, 0x01, 0x01, 0x00, 0x16, 0x14,
143         0x1D, 0x06, 0x05, 0x13, 0x2E, 0x01, 0x03, 0x00, 0x02, 0x00, 0x01, 0x06,
144         0x0A, 0x07, 0x03, 0x00, 0x29, 0x14, 0x01, 0x0A, 0x0D, 0x06, 0x04, 0x13,
145         0x01, 0x03, 0x00, 0x14, 0x01, 0x3D, 0x0D, 0x06, 0x20, 0x13, 0x2F, 0x05,
146         0x03, 0x01, 0x03, 0x00, 0x02, 0x00, 0x01, 0x03, 0x10, 0x06, 0x03, 0x01,
147         0x03, 0x00, 0x02, 0x00, 0x01, 0x0A, 0x0F, 0x1C, 0x02, 0x00, 0x01, 0x02,
148         0x0F, 0x1C, 0x01, 0x01, 0x00, 0x16, 0x14, 0x1D, 0x06, 0x05, 0x13, 0x2E,
149         0x01, 0x03, 0x00, 0x02, 0x00, 0x01, 0x06, 0x0A, 0x07, 0x03, 0x00, 0x02,
150         0x00, 0x01, 0x10, 0x0F, 0x1C, 0x02, 0x00, 0x01, 0x08, 0x0F, 0x1C, 0x02,
151         0x00, 0x1C, 0x01, 0x00, 0x00, 0x00, 0x28, 0x01, 0x01, 0x2D, 0x24, 0x06,
152         0x02, 0x04, 0x7B, 0x04, 0x75, 0x00, 0x14, 0x12, 0x2A, 0x14, 0x05, 0x04,
153         0x20, 0x01, 0x7F, 0x00, 0x2C, 0x2A, 0x14, 0x01, 0x0A, 0x0D, 0x06, 0x05,
154         0x13, 0x20, 0x01, 0x00, 0x00, 0x0D, 0x05, 0x05, 0x13, 0x2E, 0x01, 0x00,
155         0x00, 0x1E, 0x04, 0x5E, 0x00, 0x01, 0x01, 0x27, 0x06, 0x0B, 0x22, 0x01,
156         0x80, 0x7F, 0x2B, 0x14, 0x06, 0x02, 0x30, 0x00, 0x13, 0x04, 0x6E, 0x00,
157         0x2C, 0x14, 0x31, 0x05, 0x01, 0x00, 0x13, 0x04, 0x77, 0x00, 0x14, 0x14,
158         0x01, 0x80, 0x61, 0x0E, 0x1B, 0x01, 0x80, 0x7A, 0x0B, 0x10, 0x06, 0x03,
159         0x01, 0x20, 0x08, 0x00, 0x01, 0x14, 0x03, 0x00, 0x1B, 0x18, 0x05, 0x05,
160         0x20, 0x2E, 0x01, 0x00, 0x00, 0x2C, 0x14, 0x01, 0x0A, 0x0D, 0x06, 0x06,
161         0x20, 0x02, 0x00, 0x1B, 0x08, 0x00, 0x14, 0x01, 0x0D, 0x0D, 0x06, 0x03,
162         0x13, 0x04, 0x03, 0x2A, 0x18, 0x1A, 0x1E, 0x1B, 0x1F, 0x1B, 0x04, 0x59,
163         0x00, 0x19, 0x14, 0x1D, 0x05, 0x01, 0x00, 0x13, 0x11, 0x04, 0x76, 0x00,
164         0x21, 0x1A, 0x11, 0x00, 0x00, 0x2C, 0x01, 0x0A, 0x0C, 0x06, 0x02, 0x04,
165         0x78, 0x00, 0x01, 0x01, 0x7F, 0x03, 0x00, 0x2C, 0x14, 0x01, 0x0A, 0x0C,
166         0x06, 0x09, 0x31, 0x05, 0x04, 0x01, 0x00, 0x03, 0x00, 0x04, 0x70, 0x13,
167         0x02, 0x00, 0x00, 0x00, 0x14, 0x06, 0x14, 0x1F, 0x14, 0x22, 0x07, 0x17,
168         0x01, 0x2D, 0x0C, 0x06, 0x08, 0x22, 0x07, 0x1E, 0x01, 0x00, 0x1B, 0x1A,
169         0x00, 0x04, 0x69, 0x22, 0x1A, 0x00, 0x00, 0x14, 0x01, 0x0A, 0x0C, 0x1B,
170         0x01, 0x20, 0x0B, 0x10, 0x00
171 };
172
173 static const uint16_t t0_caddr[] = {
174         0,
175         5,
176         10,
177         15,
178         19,
179         24,
180         29,
181         67,
182         149,
183         384,
184         396,
185         431,
186         450,
187         460,
188         479,
189         523,
190         534,
191         539,
192         549,
193         574,
194         601
195 };
196
197 #define T0_INTERPRETED   29
198
199 #define T0_ENTER(ip, rp, slot)   do { \
200                 const unsigned char *t0_newip; \
201                 uint32_t t0_lnum; \
202                 t0_newip = &t0_codeblock[t0_caddr[(slot) - T0_INTERPRETED]]; \
203                 t0_lnum = t0_parse7E_unsigned(&t0_newip); \
204                 (rp) += t0_lnum; \
205                 *((rp) ++) = (uint32_t)((ip) - &t0_codeblock[0]) + (t0_lnum << 16); \
206                 (ip) = t0_newip; \
207         } while (0)
208
209 #define T0_DEFENTRY(name, slot) \
210 void \
211 name(void *ctx) \
212 { \
213         t0_context *t0ctx = ctx; \
214         t0ctx->ip = &t0_codeblock[0]; \
215         T0_ENTER(t0ctx->ip, t0ctx->rp, slot); \
216 }
217
218 T0_DEFENTRY(br_pem_decoder_init_main, 38)
219
220 #define T0_NEXT(t0ipp)   (*(*(t0ipp)) ++)
221
222 void
223 br_pem_decoder_run(void *t0ctx)
224 {
225         uint32_t *dp, *rp;
226         const unsigned char *ip;
227
228 #define T0_LOCAL(x)    (*(rp - 2 - (x)))
229 #define T0_POP()       (*-- dp)
230 #define T0_POPi()      (*(int32_t *)(-- dp))
231 #define T0_PEEK(x)     (*(dp - 1 - (x)))
232 #define T0_PEEKi(x)    (*(int32_t *)(dp - 1 - (x)))
233 #define T0_PUSH(v)     do { *dp = (v); dp ++; } while (0)
234 #define T0_PUSHi(v)    do { *(int32_t *)dp = (v); dp ++; } while (0)
235 #define T0_RPOP()      (*-- rp)
236 #define T0_RPOPi()     (*(int32_t *)(-- rp))
237 #define T0_RPUSH(v)    do { *rp = (v); rp ++; } while (0)
238 #define T0_RPUSHi(v)   do { *(int32_t *)rp = (v); rp ++; } while (0)
239 #define T0_ROLL(x)     do { \
240         size_t t0len = (size_t)(x); \
241         uint32_t t0tmp = *(dp - 1 - t0len); \
242         memmove(dp - t0len - 1, dp - t0len, t0len * sizeof *dp); \
243         *(dp - 1) = t0tmp; \
244 } while (0)
245 #define T0_SWAP()      do { \
246         uint32_t t0tmp = *(dp - 2); \
247         *(dp - 2) = *(dp - 1); \
248         *(dp - 1) = t0tmp; \
249 } while (0)
250 #define T0_ROT()       do { \
251         uint32_t t0tmp = *(dp - 3); \
252         *(dp - 3) = *(dp - 2); \
253         *(dp - 2) = *(dp - 1); \
254         *(dp - 1) = t0tmp; \
255 } while (0)
256 #define T0_NROT()       do { \
257         uint32_t t0tmp = *(dp - 1); \
258         *(dp - 1) = *(dp - 2); \
259         *(dp - 2) = *(dp - 3); \
260         *(dp - 3) = t0tmp; \
261 } while (0)
262 #define T0_PICK(x)      do { \
263         uint32_t t0depth = (x); \
264         T0_PUSH(T0_PEEK(t0depth)); \
265 } while (0)
266 #define T0_CO()         do { \
267         goto t0_exit; \
268 } while (0)
269 #define T0_RET()        goto t0_next
270
271         dp = ((t0_context *)t0ctx)->dp;
272         rp = ((t0_context *)t0ctx)->rp;
273         ip = ((t0_context *)t0ctx)->ip;
274         goto t0_next;
275         for (;;) {
276                 uint32_t t0x;
277
278         t0_next:
279                 t0x = T0_NEXT(&ip);
280                 if (t0x < T0_INTERPRETED) {
281                         switch (t0x) {
282                                 int32_t t0off;
283
284                         case 0: /* ret */
285                                 t0x = T0_RPOP();
286                                 rp -= (t0x >> 16);
287                                 t0x &= 0xFFFF;
288                                 if (t0x == 0) {
289                                         ip = NULL;
290                                         goto t0_exit;
291                                 }
292                                 ip = &t0_codeblock[t0x];
293                                 break;
294                         case 1: /* literal constant */
295                                 T0_PUSHi(t0_parse7E_signed(&ip));
296                                 break;
297                         case 2: /* read local */
298                                 T0_PUSH(T0_LOCAL(t0_parse7E_unsigned(&ip)));
299                                 break;
300                         case 3: /* write local */
301                                 T0_LOCAL(t0_parse7E_unsigned(&ip)) = T0_POP();
302                                 break;
303                         case 4: /* jump */
304                                 t0off = t0_parse7E_signed(&ip);
305                                 ip += t0off;
306                                 break;
307                         case 5: /* jump if */
308                                 t0off = t0_parse7E_signed(&ip);
309                                 if (T0_POP()) {
310                                         ip += t0off;
311                                 }
312                                 break;
313                         case 6: /* jump if not */
314                                 t0off = t0_parse7E_signed(&ip);
315                                 if (!T0_POP()) {
316                                         ip += t0off;
317                                 }
318                                 break;
319                         case 7: {
320                                 /* + */
321
322         uint32_t b = T0_POP();
323         uint32_t a = T0_POP();
324         T0_PUSH(a + b);
325
326                                 }
327                                 break;
328                         case 8: {
329                                 /* - */
330
331         uint32_t b = T0_POP();
332         uint32_t a = T0_POP();
333         T0_PUSH(a - b);
334
335                                 }
336                                 break;
337                         case 9: {
338                                 /* < */
339
340         int32_t b = T0_POPi();
341         int32_t a = T0_POPi();
342         T0_PUSH(-(uint32_t)(a < b));
343
344                                 }
345                                 break;
346                         case 10: {
347                                 /* << */
348
349         int c = (int)T0_POPi();
350         uint32_t x = T0_POP();
351         T0_PUSH(x << c);
352
353                                 }
354                                 break;
355                         case 11: {
356                                 /* <= */
357
358         int32_t b = T0_POPi();
359         int32_t a = T0_POPi();
360         T0_PUSH(-(uint32_t)(a <= b));
361
362                                 }
363                                 break;
364                         case 12: {
365                                 /* <> */
366
367         uint32_t b = T0_POP();
368         uint32_t a = T0_POP();
369         T0_PUSH(-(uint32_t)(a != b));
370
371                                 }
372                                 break;
373                         case 13: {
374                                 /* = */
375
376         uint32_t b = T0_POP();
377         uint32_t a = T0_POP();
378         T0_PUSH(-(uint32_t)(a == b));
379
380                                 }
381                                 break;
382                         case 14: {
383                                 /* >= */
384
385         int32_t b = T0_POPi();
386         int32_t a = T0_POPi();
387         T0_PUSH(-(uint32_t)(a >= b));
388
389                                 }
390                                 break;
391                         case 15: {
392                                 /* >> */
393
394         int c = (int)T0_POPi();
395         int32_t x = T0_POPi();
396         T0_PUSHi(x >> c);
397
398                                 }
399                                 break;
400                         case 16: {
401                                 /* and */
402
403         uint32_t b = T0_POP();
404         uint32_t a = T0_POP();
405         T0_PUSH(a & b);
406
407                                 }
408                                 break;
409                         case 17: {
410                                 /* co */
411  T0_CO(); 
412                                 }
413                                 break;
414                         case 18: {
415                                 /* data-get8 */
416
417         size_t addr = T0_POP();
418         T0_PUSH(t0_datablock[addr]);
419
420                                 }
421                                 break;
422                         case 19: {
423                                 /* drop */
424  (void)T0_POP(); 
425                                 }
426                                 break;
427                         case 20: {
428                                 /* dup */
429  T0_PUSH(T0_PEEK(0)); 
430                                 }
431                                 break;
432                         case 21: {
433                                 /* flush-buf */
434
435         if (CTX->ptr > 0) {
436                 if (CTX->dest) {
437                         CTX->dest(CTX->dest_ctx, CTX->buf, CTX->ptr);
438                 }
439                 CTX->ptr = 0;
440         }
441
442                                 }
443                                 break;
444                         case 22: {
445                                 /* from-base64 */
446
447         uint32_t c = T0_POP();
448         uint32_t p, q, r, z;
449         p = c - 0x41;
450         q = c - 0x61;
451         r = c - 0x30;
452
453         z = ((p + 2) & -LT(p, 26))
454                 | ((q + 28) & -LT(q, 26))
455                 | ((r + 54) & -LT(r, 10))
456                 | (64 & -EQ(c, 0x2B))
457                 | (65 & -EQ(c, 0x2F))
458                 | EQ(c, 0x3D);
459         T0_PUSHi((int32_t)z - 2);
460
461                                 }
462                                 break;
463                         case 23: {
464                                 /* get8 */
465
466         size_t addr = T0_POP();
467         T0_PUSH(*((unsigned char *)CTX + addr));
468
469                                 }
470                                 break;
471                         case 24: {
472                                 /* over */
473  T0_PUSH(T0_PEEK(1)); 
474                                 }
475                                 break;
476                         case 25: {
477                                 /* read8-native */
478
479         if (CTX->hlen > 0) {
480                 T0_PUSH(*CTX->hbuf ++);
481                 CTX->hlen --;
482         } else {
483                 T0_PUSHi(-1);
484         }
485
486                                 }
487                                 break;
488                         case 26: {
489                                 /* set8 */
490
491         size_t addr = T0_POP();
492         unsigned x = T0_POP();
493         *((unsigned char *)CTX + addr) = x;
494
495                                 }
496                                 break;
497                         case 27: {
498                                 /* swap */
499  T0_SWAP(); 
500                                 }
501                                 break;
502                         case 28: {
503                                 /* write8 */
504
505         unsigned char x = (unsigned char)T0_POP();
506         CTX->buf[CTX->ptr ++] = x;
507         if (CTX->ptr == sizeof CTX->buf) {
508                 if (CTX->dest) {
509                         CTX->dest(CTX->dest_ctx, CTX->buf, sizeof CTX->buf);
510                 }
511                 CTX->ptr = 0;
512         }
513
514                                 }
515                                 break;
516                         }
517
518                 } else {
519                         T0_ENTER(ip, rp, t0x);
520                 }
521         }
522 t0_exit:
523         ((t0_context *)t0ctx)->dp = dp;
524         ((t0_context *)t0ctx)->rp = rp;
525         ((t0_context *)t0ctx)->ip = ip;
526 }