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