Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/bearssl/src/codec/pemdec.c
39482 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_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
}
527
528