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 } 774