File Coverage

src/x509/skey_decoder.c
Criterion Covered Total %
statement 207 226 91.5
branch 17 22 77.2
condition n/a
subroutine n/a
pod n/a
total 224 248 90.3


line stmt bran cond sub pod time code
1             /* Automatically generated code; do not modify directly. */
2              
3             #include
4             #include
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 24254           t0_parse7E_unsigned(const unsigned char **p)
14             {
15             uint32_t x;
16              
17 24254           x = 0;
18 0           for (;;) {
19             unsigned y;
20              
21 24254           y = *(*p) ++;
22 24254           x = (x << 7) | (uint32_t)(y & 0x7F);
23 24254 50         if (y < 0x80) {
24 24254           return x;
25             }
26             }
27             }
28              
29             static int32_t
30 22236           t0_parse7E_signed(const unsigned char **p)
31             {
32             int neg;
33             uint32_t x;
34              
35 22236           neg = ((**p) >> 6) & 1;
36 22236           x = (uint32_t)-neg;
37 208           for (;;) {
38             unsigned y;
39              
40 22444           y = *(*p) ++;
41 22444           x = (x << 7) | (uint32_t)(y & 0x7F);
42 22444 100         if (y < 0x80) {
43 22236 100         if (neg) {
44 2356           return -(int32_t)~x - 1;
45             } else {
46 19880           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_skey_decoder_init_main(void *t0ctx);
65              
66             void br_skey_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_skey_decoder_context *)(void *)((unsigned char *)t0ctx - offsetof(br_skey_decoder_context, cpu)))
79             #define CONTEXT_NAME br_skey_decoder_context
80              
81             /* see bearssl_x509.h */
82             void
83 2           br_skey_decoder_init(br_skey_decoder_context *ctx)
84             {
85 2           memset(ctx, 0, sizeof *ctx);
86 2           ctx->cpu.dp = &ctx->dp_stack[0];
87 2           ctx->cpu.rp = &ctx->rp_stack[0];
88 2           br_skey_decoder_init_main(&ctx->cpu);
89 2           br_skey_decoder_run(&ctx->cpu);
90 2           }
91              
92             /* see bearssl_x509.h */
93             void
94 2           br_skey_decoder_push(br_skey_decoder_context *ctx,
95             const void *data, size_t len)
96             {
97 2           ctx->hbuf = data;
98 2           ctx->hlen = len;
99 2           br_skey_decoder_run(&ctx->cpu);
100 2           }
101              
102              
103              
104             static const unsigned char t0_datablock[] = {
105             0x00, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x07,
106             0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x02, 0x01, 0x08, 0x2A, 0x86, 0x48, 0xCE,
107             0x3D, 0x03, 0x01, 0x07, 0x05, 0x2B, 0x81, 0x04, 0x00, 0x22, 0x05, 0x2B,
108             0x81, 0x04, 0x00, 0x23
109             };
110              
111             static const unsigned char t0_codeblock[] = {
112             0x00, 0x01, 0x01, 0x07, 0x00, 0x00, 0x01, 0x01, 0x08, 0x00, 0x00, 0x13,
113             0x13, 0x00, 0x00, 0x01, T0_INT1(BR_ERR_X509_BAD_TAG_CLASS), 0x00, 0x00,
114             0x01, T0_INT1(BR_ERR_X509_BAD_TAG_VALUE), 0x00, 0x00, 0x01,
115             T0_INT1(BR_ERR_X509_EXTRA_ELEMENT), 0x00, 0x00, 0x01,
116             T0_INT1(BR_ERR_X509_INDEFINITE_LENGTH), 0x00, 0x00, 0x01,
117             T0_INT1(BR_ERR_X509_INNER_TRUNC), 0x00, 0x00, 0x01,
118             T0_INT1(BR_ERR_X509_INVALID_VALUE), 0x00, 0x00, 0x01,
119             T0_INT1(BR_ERR_X509_LIMIT_EXCEEDED), 0x00, 0x00, 0x01,
120             T0_INT1(BR_ERR_X509_NOT_CONSTRUCTED), 0x00, 0x00, 0x01,
121             T0_INT1(BR_ERR_X509_NOT_PRIMITIVE), 0x00, 0x00, 0x01,
122             T0_INT1(BR_ERR_X509_OVERFLOW), 0x00, 0x00, 0x01,
123             T0_INT1(BR_ERR_X509_UNEXPECTED), 0x00, 0x00, 0x01,
124             T0_INT1(BR_ERR_X509_UNSUPPORTED), 0x00, 0x00, 0x01,
125             T0_INT1(BR_KEYTYPE_EC), 0x00, 0x00, 0x01, T0_INT1(BR_KEYTYPE_RSA),
126             0x00, 0x00, 0x01, T0_INT2(offsetof(CONTEXT_NAME, key_data)), 0x00,
127             0x00, 0x01, T0_INT2(offsetof(CONTEXT_NAME, key_type)), 0x00, 0x00,
128             0x33, 0x48, 0x00, 0x00, 0x01, T0_INT2(offsetof(CONTEXT_NAME, pad)),
129             0x00, 0x00, 0x01, 0x13, 0x00, 0x00, 0x01, 0x1C, 0x00, 0x00, 0x01, 0x22,
130             0x00, 0x00, 0x05, 0x02, 0x2C, 0x16, 0x00, 0x00, 0x06, 0x02, 0x2D, 0x16,
131             0x00, 0x00, 0x01, 0x10, 0x3D, 0x00, 0x00, 0x0D, 0x05, 0x02, 0x2F, 0x16,
132             0x3A, 0x00, 0x00, 0x0D, 0x05, 0x02, 0x2F, 0x16, 0x3B, 0x00, 0x00, 0x06,
133             0x02, 0x27, 0x16, 0x00, 0x01, 0x03, 0x00, 0x54, 0x57, 0x01, 0x02, 0x3E,
134             0x55, 0x23, 0x06, 0x02, 0x30, 0x16, 0x57, 0x01, 0x04, 0x3E, 0x02, 0x00,
135             0x41, 0x3F, 0x00, 0x02, 0x03, 0x00, 0x53, 0x14, 0x14, 0x03, 0x01, 0x48,
136             0x0E, 0x06, 0x02, 0x30, 0x16, 0x33, 0x4C, 0x58, 0x01, 0x7F, 0x19, 0x0D,
137             0x06, 0x04, 0x13, 0x13, 0x04, 0x29, 0x01, 0x20, 0x19, 0x0D, 0x06, 0x16,
138             0x13, 0x3A, 0x53, 0x4D, 0x02, 0x00, 0x06, 0x09, 0x02, 0x00, 0x0C, 0x06,
139             0x02, 0x2A, 0x16, 0x04, 0x02, 0x03, 0x00, 0x3F, 0x04, 0x0D, 0x01, 0x21,
140             0x19, 0x0D, 0x06, 0x04, 0x13, 0x3A, 0x04, 0x03, 0x30, 0x16, 0x13, 0x5D,
141             0x02, 0x00, 0x05, 0x02, 0x30, 0x16, 0x02, 0x00, 0x02, 0x01, 0x1D, 0x00,
142             0x02, 0x53, 0x4B, 0x05, 0x02, 0x30, 0x16, 0x5B, 0x15, 0x06, 0x07, 0x5D,
143             0x01, 0x7F, 0x03, 0x01, 0x04, 0x16, 0x46, 0x15, 0x06, 0x10, 0x01, 0x00,
144             0x03, 0x01, 0x14, 0x06, 0x03, 0x4D, 0x04, 0x02, 0x01, 0x00, 0x03, 0x00,
145             0x04, 0x02, 0x30, 0x16, 0x3F, 0x57, 0x01, 0x04, 0x3E, 0x53, 0x02, 0x01,
146             0x06, 0x03, 0x43, 0x04, 0x03, 0x02, 0x00, 0x40, 0x3F, 0x5D, 0x02, 0x01,
147             0x06, 0x03, 0x32, 0x04, 0x01, 0x31, 0x00, 0x00, 0x54, 0x57, 0x01, 0x02,
148             0x3E, 0x55, 0x06, 0x02, 0x30, 0x16, 0x57, 0x01, 0x02, 0x3E, 0x44, 0x3F,
149             0x00, 0x07, 0x35, 0x50, 0x14, 0x05, 0x02, 0x2F, 0x16, 0x23, 0x01, 0x03,
150             0x0B, 0x33, 0x17, 0x47, 0x07, 0x03, 0x00, 0x4F, 0x4F, 0x35, 0x4E, 0x14,
151             0x14, 0x03, 0x01, 0x03, 0x02, 0x51, 0x14, 0x03, 0x03, 0x02, 0x02, 0x07,
152             0x14, 0x03, 0x02, 0x51, 0x14, 0x03, 0x04, 0x02, 0x02, 0x07, 0x14, 0x03,
153             0x02, 0x51, 0x14, 0x03, 0x05, 0x02, 0x02, 0x07, 0x14, 0x03, 0x02, 0x51,
154             0x03, 0x06, 0x02, 0x00, 0x02, 0x01, 0x02, 0x03, 0x02, 0x04, 0x02, 0x05,
155             0x02, 0x06, 0x1E, 0x00, 0x00, 0x19, 0x19, 0x00, 0x00, 0x01, 0x0B, 0x00,
156             0x00, 0x01, 0x00, 0x20, 0x14, 0x06, 0x08, 0x01, 0x01, 0x21, 0x20, 0x22,
157             0x20, 0x04, 0x75, 0x13, 0x00, 0x00, 0x01,
158             T0_INT2(3 * BR_X509_BUFSIZE_SIG), 0x00, 0x01, 0x01, 0x87, 0xFF, 0xFF,
159             0x7F, 0x54, 0x57, 0x01, 0x02, 0x3E, 0x55, 0x01, 0x01, 0x0E, 0x06, 0x02,
160             0x30, 0x16, 0x57, 0x01, 0x02, 0x19, 0x0D, 0x06, 0x06, 0x13, 0x3B, 0x44,
161             0x32, 0x04, 0x1C, 0x01, 0x04, 0x19, 0x0D, 0x06, 0x08, 0x13, 0x3B, 0x01,
162             0x00, 0x41, 0x31, 0x04, 0x0E, 0x01, 0x10, 0x19, 0x0D, 0x06, 0x05, 0x13,
163             0x3A, 0x42, 0x04, 0x03, 0x30, 0x16, 0x13, 0x03, 0x00, 0x3F, 0x02, 0x00,
164             0x34, 0x1F, 0x5A, 0x27, 0x16, 0x00, 0x01, 0x45, 0x0A, 0x06, 0x02, 0x29,
165             0x16, 0x14, 0x03, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x57, 0x01, 0x06,
166             0x3E, 0x56, 0x00, 0x00, 0x20, 0x14, 0x06, 0x07, 0x1A, 0x14, 0x06, 0x01,
167             0x12, 0x04, 0x76, 0x24, 0x00, 0x00, 0x4B, 0x05, 0x02, 0x30, 0x16, 0x37,
168             0x15, 0x06, 0x04, 0x01, 0x17, 0x04, 0x12, 0x38, 0x15, 0x06, 0x04, 0x01,
169             0x18, 0x04, 0x0A, 0x39, 0x15, 0x06, 0x04, 0x01, 0x19, 0x04, 0x02, 0x30,
170             0x16, 0x00, 0x00, 0x1C, 0x57, 0x01, 0x02, 0x3E, 0x09, 0x50, 0x00, 0x00,
171             0x35, 0x4E, 0x13, 0x00, 0x03, 0x14, 0x03, 0x00, 0x03, 0x01, 0x03, 0x02,
172             0x53, 0x59, 0x14, 0x01, 0x81, 0x00, 0x0F, 0x06, 0x02, 0x2E, 0x16, 0x14,
173             0x01, 0x00, 0x0D, 0x06, 0x0B, 0x13, 0x14, 0x05, 0x04, 0x13, 0x01, 0x00,
174             0x00, 0x59, 0x04, 0x6F, 0x02, 0x01, 0x14, 0x05, 0x02, 0x2B, 0x16, 0x23,
175             0x03, 0x01, 0x02, 0x02, 0x1F, 0x02, 0x02, 0x22, 0x03, 0x02, 0x14, 0x06,
176             0x03, 0x59, 0x04, 0x68, 0x13, 0x02, 0x00, 0x02, 0x01, 0x08, 0x00, 0x00,
177             0x14, 0x35, 0x1C, 0x08, 0x20, 0x1C, 0x07, 0x20, 0x4E, 0x00, 0x01, 0x59,
178             0x14, 0x01, 0x81, 0x00, 0x0A, 0x06, 0x01, 0x00, 0x01, 0x81, 0x00, 0x08,
179             0x14, 0x05, 0x02, 0x28, 0x16, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01,
180             0x00, 0x0E, 0x06, 0x19, 0x02, 0x00, 0x23, 0x03, 0x00, 0x14, 0x01, 0x83,
181             0xFF, 0xFF, 0x7F, 0x0E, 0x06, 0x02, 0x29, 0x16, 0x01, 0x08, 0x0B, 0x20,
182             0x59, 0x1C, 0x07, 0x04, 0x60, 0x00, 0x00, 0x52, 0x4A, 0x00, 0x00, 0x57,
183             0x3C, 0x53, 0x00, 0x01, 0x53, 0x14, 0x05, 0x02, 0x2E, 0x16, 0x59, 0x14,
184             0x01, 0x81, 0x00, 0x0F, 0x06, 0x02, 0x2E, 0x16, 0x03, 0x00, 0x14, 0x06,
185             0x16, 0x59, 0x02, 0x00, 0x14, 0x01, 0x87, 0xFF, 0xFF, 0x7F, 0x0F, 0x06,
186             0x02, 0x2E, 0x16, 0x01, 0x08, 0x0B, 0x07, 0x03, 0x00, 0x04, 0x67, 0x13,
187             0x02, 0x00, 0x00, 0x00, 0x53, 0x14, 0x01, 0x81, 0x7F, 0x0E, 0x06, 0x08,
188             0x5C, 0x01, 0x00, 0x36, 0x1F, 0x01, 0x00, 0x00, 0x14, 0x36, 0x1F, 0x36,
189             0x22, 0x4C, 0x01, 0x7F, 0x00, 0x01, 0x59, 0x03, 0x00, 0x02, 0x00, 0x01,
190             0x05, 0x10, 0x01, 0x01, 0x11, 0x18, 0x02, 0x00, 0x01, 0x06, 0x10, 0x14,
191             0x01, 0x01, 0x11, 0x06, 0x02, 0x25, 0x16, 0x01, 0x04, 0x0B, 0x02, 0x00,
192             0x01, 0x1F, 0x11, 0x14, 0x01, 0x1F, 0x0D, 0x06, 0x02, 0x26, 0x16, 0x07,
193             0x00, 0x00, 0x14, 0x05, 0x05, 0x01, 0x00, 0x01, 0x7F, 0x00, 0x57, 0x00,
194             0x00, 0x14, 0x05, 0x02, 0x29, 0x16, 0x23, 0x5A, 0x00, 0x00, 0x1B, 0x14,
195             0x01, 0x00, 0x0F, 0x06, 0x01, 0x00, 0x13, 0x12, 0x04, 0x74, 0x00, 0x01,
196             0x01, 0x00, 0x00, 0x5D, 0x13, 0x00, 0x00, 0x14, 0x06, 0x07, 0x5E, 0x14,
197             0x06, 0x01, 0x12, 0x04, 0x76, 0x00, 0x00, 0x01, 0x00, 0x19, 0x1A, 0x09,
198             0x24, 0x00
199             };
200              
201             static const uint16_t t0_caddr[] = {
202             0,
203             5,
204             10,
205             14,
206             18,
207             22,
208             26,
209             30,
210             34,
211             38,
212             42,
213             46,
214             50,
215             54,
216             58,
217             62,
218             66,
219             70,
220             75,
221             80,
222             84,
223             89,
224             93,
225             97,
226             101,
227             107,
228             113,
229             118,
230             126,
231             134,
232             140,
233             163,
234             244,
235             311,
236             329,
237             404,
238             408,
239             412,
240             429,
241             434,
242             505,
243             519,
244             526,
245             540,
246             573,
247             582,
248             587,
249             654,
250             665,
251             721,
252             725,
253             730,
254             778,
255             804,
256             848,
257             859,
258             868,
259             881,
260             885,
261             889,
262             901
263             };
264              
265             #define T0_INTERPRETED 34
266              
267             #define T0_ENTER(ip, rp, slot) do { \
268             const unsigned char *t0_newip; \
269             uint32_t t0_lnum; \
270             t0_newip = &t0_codeblock[t0_caddr[(slot) - T0_INTERPRETED]]; \
271             t0_lnum = t0_parse7E_unsigned(&t0_newip); \
272             (rp) += t0_lnum; \
273             *((rp) ++) = (uint32_t)((ip) - &t0_codeblock[0]) + (t0_lnum << 16); \
274             (ip) = t0_newip; \
275             } while (0)
276              
277             #define T0_DEFENTRY(name, slot) \
278             void \
279             name(void *ctx) \
280             { \
281             t0_context *t0ctx = ctx; \
282             t0ctx->ip = &t0_codeblock[0]; \
283             T0_ENTER(t0ctx->ip, t0ctx->rp, slot); \
284             }
285              
286 2           T0_DEFENTRY(br_skey_decoder_init_main, 73)
287              
288             #define T0_NEXT(t0ipp) (*(*(t0ipp)) ++)
289              
290             void
291 4           br_skey_decoder_run(void *t0ctx)
292             {
293             uint32_t *dp, *rp;
294             const unsigned char *ip;
295              
296             #define T0_LOCAL(x) (*(rp - 2 - (x)))
297             #define T0_POP() (*-- dp)
298             #define T0_POPi() (*(int32_t *)(-- dp))
299             #define T0_PEEK(x) (*(dp - 1 - (x)))
300             #define T0_PEEKi(x) (*(int32_t *)(dp - 1 - (x)))
301             #define T0_PUSH(v) do { *dp = (v); dp ++; } while (0)
302             #define T0_PUSHi(v) do { *(int32_t *)dp = (v); dp ++; } while (0)
303             #define T0_RPOP() (*-- rp)
304             #define T0_RPOPi() (*(int32_t *)(-- rp))
305             #define T0_RPUSH(v) do { *rp = (v); rp ++; } while (0)
306             #define T0_RPUSHi(v) do { *(int32_t *)rp = (v); rp ++; } while (0)
307             #define T0_ROLL(x) do { \
308             size_t t0len = (size_t)(x); \
309             uint32_t t0tmp = *(dp - 1 - t0len); \
310             memmove(dp - t0len - 1, dp - t0len, t0len * sizeof *dp); \
311             *(dp - 1) = t0tmp; \
312             } while (0)
313             #define T0_SWAP() do { \
314             uint32_t t0tmp = *(dp - 2); \
315             *(dp - 2) = *(dp - 1); \
316             *(dp - 1) = t0tmp; \
317             } while (0)
318             #define T0_ROT() do { \
319             uint32_t t0tmp = *(dp - 3); \
320             *(dp - 3) = *(dp - 2); \
321             *(dp - 2) = *(dp - 1); \
322             *(dp - 1) = t0tmp; \
323             } while (0)
324             #define T0_NROT() do { \
325             uint32_t t0tmp = *(dp - 1); \
326             *(dp - 1) = *(dp - 2); \
327             *(dp - 2) = *(dp - 3); \
328             *(dp - 3) = t0tmp; \
329             } while (0)
330             #define T0_PICK(x) do { \
331             uint32_t t0depth = (x); \
332             T0_PUSH(T0_PEEK(t0depth)); \
333             } while (0)
334             #define T0_CO() do { \
335             goto t0_exit; \
336             } while (0)
337             #define T0_RET() goto t0_next
338              
339 4           dp = ((t0_context *)t0ctx)->dp;
340 4           rp = ((t0_context *)t0ctx)->rp;
341 4           ip = ((t0_context *)t0ctx)->ip;
342 4           goto t0_next;
343 83652           for (;;) {
344             uint32_t t0x;
345              
346 83656           t0_next:
347 83656           t0x = T0_NEXT(&ip);
348 83656 100         if (t0x < T0_INTERPRETED) {
349 71400           switch (t0x) {
350             int32_t t0off;
351              
352 12254           case 0: /* ret */
353 12254           t0x = T0_RPOP();
354 12254           rp -= (t0x >> 16);
355 12254           t0x &= 0xFFFF;
356 12254 50         if (t0x == 0) {
357 0           ip = NULL;
358 0           goto t0_exit;
359             }
360 12254           ip = &t0_codeblock[t0x];
361 12254           break;
362 10036           case 1: /* literal constant */
363 10036           T0_PUSHi(t0_parse7E_signed(&ip));
364 10036           break;
365 7190           case 2: /* read local */
366 7190           T0_PUSH(T0_LOCAL(t0_parse7E_unsigned(&ip)));
367 7190           break;
368 4806           case 3: /* write local */
369 4806           T0_LOCAL(t0_parse7E_unsigned(&ip)) = T0_POP();
370 4806           break;
371 2360           case 4: /* jump */
372 2360           t0off = t0_parse7E_signed(&ip);
373 2360           ip += t0off;
374 2360           break;
375 4788           case 5: /* jump if */
376 4788           t0off = t0_parse7E_signed(&ip);
377 4788 50         if (T0_POP()) {
378 4788           ip += t0off;
379             }
380 4788           break;
381 5052           case 6: /* jump if not */
382 5052           t0off = t0_parse7E_signed(&ip);
383 5052 100         if (!T0_POP()) {
384 274           ip += t0off;
385             }
386 5052           break;
387 2404           case 7: {
388             /* + */
389              
390 2404           uint32_t b = T0_POP();
391 2404           uint32_t a = T0_POP();
392 2404           T0_PUSH(a + b);
393              
394             }
395 2404           break;
396 4826           case 8: {
397             /* - */
398              
399 4826           uint32_t b = T0_POP();
400 4826           uint32_t a = T0_POP();
401 4826           T0_PUSH(a - b);
402              
403             }
404 4826           break;
405 16           case 9: {
406             /* -rot */
407 16           T0_NROT();
408             }
409 16           break;
410 60           case 10: {
411             /* < */
412              
413 60           int32_t b = T0_POPi();
414 60           int32_t a = T0_POPi();
415 60           T0_PUSH(-(uint32_t)(a < b));
416              
417             }
418 60           break;
419 62           case 11: {
420             /* << */
421              
422 62           int c = (int)T0_POPi();
423 62           uint32_t x = T0_POP();
424 62           T0_PUSH(x << c);
425              
426             }
427 62           break;
428 0           case 12: {
429             /* <> */
430              
431 0           uint32_t b = T0_POP();
432 0           uint32_t a = T0_POP();
433 0           T0_PUSH(-(uint32_t)(a != b));
434              
435             }
436 0           break;
437 86           case 13: {
438             /* = */
439              
440 86           uint32_t b = T0_POP();
441 86           uint32_t a = T0_POP();
442 86           T0_PUSH(-(uint32_t)(a == b));
443              
444             }
445 86           break;
446 84           case 14: {
447             /* > */
448              
449 84           int32_t b = T0_POPi();
450 84           int32_t a = T0_POPi();
451 84           T0_PUSH(-(uint32_t)(a > b));
452              
453             }
454 84           break;
455 2434           case 15: {
456             /* >= */
457              
458 2434           int32_t b = T0_POPi();
459 2434           int32_t a = T0_POPi();
460 2434           T0_PUSH(-(uint32_t)(a >= b));
461              
462             }
463 2434           break;
464 60           case 16: {
465             /* >> */
466              
467 60           int c = (int)T0_POPi();
468 60           int32_t x = T0_POPi();
469 60           T0_PUSHi(x >> c);
470              
471             }
472 60           break;
473 90           case 17: {
474             /* and */
475              
476 90           uint32_t b = T0_POP();
477 90           uint32_t a = T0_POP();
478 90           T0_PUSH(a & b);
479              
480             }
481 90           break;
482 4           case 18: {
483             /* co */
484 4           T0_CO();
485             }
486             break;
487 46           case 19: {
488             /* drop */
489 46           (void)T0_POP();
490             }
491 46           break;
492 9748           case 20: {
493             /* dup */
494 9748           T0_PUSH(T0_PEEK(0));
495             }
496 9748           break;
497 2           case 21: {
498             /* eqOID */
499              
500 2           const unsigned char *a2 = &t0_datablock[T0_POP()];
501 2           const unsigned char *a1 = &CTX->pad[0];
502 2           size_t len = a1[0];
503             int x;
504 2 50         if (len == a2[0]) {
505 2           x = -(memcmp(a1 + 1, a2 + 1, len) == 0);
506             } else {
507 0           x = 0;
508             }
509 2           T0_PUSH((uint32_t)x);
510              
511             }
512 2           break;
513 0           case 22: {
514             /* fail */
515              
516 0           CTX->err = T0_POPi();
517 0           T0_CO();
518              
519             }
520             break;
521 2           case 23: {
522             /* get8 */
523              
524 2           uint32_t addr = T0_POP();
525 2           T0_PUSH(*((unsigned char *)CTX + addr));
526              
527             }
528 2           break;
529 30           case 24: {
530             /* neg */
531              
532 30           uint32_t a = T0_POP();
533 30           T0_PUSH(-a);
534              
535             }
536 30           break;
537 68           case 25: {
538             /* over */
539 68           T0_PUSH(T0_PEEK(1));
540             }
541 68           break;
542 4           case 26: {
543             /* read-blob-inner */
544              
545 4           uint32_t len = T0_POP();
546 4           uint32_t addr = T0_POP();
547 4           size_t clen = CTX->hlen;
548 4 50         if (clen > len) {
549 4           clen = (size_t)len;
550             }
551 4 100         if (addr != 0) {
552 2           memcpy((unsigned char *)CTX + addr, CTX->hbuf, clen);
553             }
554 4           CTX->hbuf += clen;
555 4           CTX->hlen -= clen;
556 4           T0_PUSH(addr + clen);
557 4           T0_PUSH(len - clen);
558              
559             }
560 4           break;
561 2414           case 27: {
562             /* read8-low */
563              
564 2414 100         if (CTX->hlen == 0) {
565 4           T0_PUSHi(-1);
566             } else {
567 2410           CTX->hlen --;
568 2410           T0_PUSH(*CTX->hbuf ++);
569             }
570              
571             }
572 2414           break;
573 60           case 28: {
574             /* rot */
575 60           T0_ROT();
576             }
577 60           break;
578 0           case 29: {
579             /* set-ec-key */
580              
581 0           size_t xlen = T0_POP();
582 0           uint32_t curve = T0_POP();
583 0           CTX->key.ec.curve = curve;
584 0           CTX->key.ec.x = CTX->key_data;
585 0           CTX->key.ec.xlen = xlen;
586              
587             }
588 0           break;
589 2           case 30: {
590             /* set-rsa-key */
591              
592 2           size_t iqlen = T0_POP();
593 2           size_t dqlen = T0_POP();
594 2           size_t dplen = T0_POP();
595 2           size_t qlen = T0_POP();
596 2           size_t plen = T0_POP();
597 2           uint32_t n_bitlen = T0_POP();
598             size_t off;
599              
600 2           CTX->key.rsa.n_bitlen = n_bitlen;
601 2           CTX->key.rsa.p = CTX->key_data;
602 2           CTX->key.rsa.plen = plen;
603 2           off = plen;
604 2           CTX->key.rsa.q = CTX->key_data + off;
605 2           CTX->key.rsa.qlen = qlen;
606 2           off += qlen;
607 2           CTX->key.rsa.dp = CTX->key_data + off;
608 2           CTX->key.rsa.dplen = dplen;
609 2           off += dplen;
610 2           CTX->key.rsa.dq = CTX->key_data + off;
611 2           CTX->key.rsa.dqlen = dqlen;
612 2           off += dqlen;
613 2           CTX->key.rsa.iq = CTX->key_data + off;
614 2           CTX->key.rsa.iqlen = iqlen;
615              
616             }
617 2           break;
618 2314           case 31: {
619             /* set8 */
620              
621 2314           uint32_t addr = T0_POP();
622 2314           *((unsigned char *)CTX + addr) = (unsigned char)T0_POP();
623              
624             }
625 2314           break;
626 82           case 32: {
627             /* swap */
628 82           T0_SWAP();
629             }
630 82           break;
631 16           case 33: {
632             /* u>> */
633              
634 16           int c = (int)T0_POPi();
635 16           uint32_t x = T0_POP();
636 16           T0_PUSH(x >> c);
637              
638             }
639 16           break;
640             }
641              
642             } else {
643 12256           T0_ENTER(ip, rp, t0x);
644             }
645             }
646 4           t0_exit:
647 4           ((t0_context *)t0ctx)->dp = dp;
648 4           ((t0_context *)t0ctx)->rp = rp;
649 4           ((t0_context *)t0ctx)->ip = ip;
650 4           }