1/* Automatically generated code; do not modify directly. */
2
3#include <stddef.h>
4#include <stdint.h>
5
6typedef struct {
7	uint32_t *dp;
8	uint32_t *rp;
9	const unsigned char *ip;
10} t0_context;
11
12static uint32_t
13t0_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
29static int32_t
30t0_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
64void br_skey_decoder_init_main(void *t0ctx);
65
66void 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 */
82void
83br_skey_decoder_init(br_skey_decoder_context *ctx)
84{
85	memset(ctx, 0, sizeof *ctx);
86	ctx->cpu.dp = &ctx->dp_stack[0];
87	ctx->cpu.rp = &ctx->rp_stack[0];
88	br_skey_decoder_init_main(&ctx->cpu);
89	br_skey_decoder_run(&ctx->cpu);
90}
91
92/* see bearssl_x509.h */
93void
94br_skey_decoder_push(br_skey_decoder_context *ctx,
95	const void *data, size_t len)
96{
97	ctx->hbuf = data;
98	ctx->hlen = len;
99	br_skey_decoder_run(&ctx->cpu);
100}
101
102
103
104static 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
111static 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
201static 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) \
278void \
279name(void *ctx) \
280{ \
281	t0_context *t0ctx = ctx; \
282	t0ctx->ip = &t0_codeblock[0]; \
283	T0_ENTER(t0ctx->ip, t0ctx->rp, slot); \
284}
285
286T0_DEFENTRY(br_skey_decoder_init_main, 73)
287
288#define T0_NEXT(t0ipp)   (*(*(t0ipp)) ++)
289
290void
291br_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	dp = ((t0_context *)t0ctx)->dp;
340	rp = ((t0_context *)t0ctx)->rp;
341	ip = ((t0_context *)t0ctx)->ip;
342	goto t0_next;
343	for (;;) {
344		uint32_t t0x;
345
346	t0_next:
347		t0x = T0_NEXT(&ip);
348		if (t0x < T0_INTERPRETED) {
349			switch (t0x) {
350				int32_t t0off;
351
352			case 0: /* ret */
353				t0x = T0_RPOP();
354				rp -= (t0x >> 16);
355				t0x &= 0xFFFF;
356				if (t0x == 0) {
357					ip = NULL;
358					goto t0_exit;
359				}
360				ip = &t0_codeblock[t0x];
361				break;
362			case 1: /* literal constant */
363				T0_PUSHi(t0_parse7E_signed(&ip));
364				break;
365			case 2: /* read local */
366				T0_PUSH(T0_LOCAL(t0_parse7E_unsigned(&ip)));
367				break;
368			case 3: /* write local */
369				T0_LOCAL(t0_parse7E_unsigned(&ip)) = T0_POP();
370				break;
371			case 4: /* jump */
372				t0off = t0_parse7E_signed(&ip);
373				ip += t0off;
374				break;
375			case 5: /* jump if */
376				t0off = t0_parse7E_signed(&ip);
377				if (T0_POP()) {
378					ip += t0off;
379				}
380				break;
381			case 6: /* jump if not */
382				t0off = t0_parse7E_signed(&ip);
383				if (!T0_POP()) {
384					ip += t0off;
385				}
386				break;
387			case 7: {
388				/* + */
389
390	uint32_t b = T0_POP();
391	uint32_t a = T0_POP();
392	T0_PUSH(a + b);
393
394				}
395				break;
396			case 8: {
397				/* - */
398
399	uint32_t b = T0_POP();
400	uint32_t a = T0_POP();
401	T0_PUSH(a - b);
402
403				}
404				break;
405			case 9: {
406				/* -rot */
407 T0_NROT();
408				}
409				break;
410			case 10: {
411				/* < */
412
413	int32_t b = T0_POPi();
414	int32_t a = T0_POPi();
415	T0_PUSH(-(uint32_t)(a < b));
416
417				}
418				break;
419			case 11: {
420				/* << */
421
422	int c = (int)T0_POPi();
423	uint32_t x = T0_POP();
424	T0_PUSH(x << c);
425
426				}
427				break;
428			case 12: {
429				/* <> */
430
431	uint32_t b = T0_POP();
432	uint32_t a = T0_POP();
433	T0_PUSH(-(uint32_t)(a != b));
434
435				}
436				break;
437			case 13: {
438				/* = */
439
440	uint32_t b = T0_POP();
441	uint32_t a = T0_POP();
442	T0_PUSH(-(uint32_t)(a == b));
443
444				}
445				break;
446			case 14: {
447				/* > */
448
449	int32_t b = T0_POPi();
450	int32_t a = T0_POPi();
451	T0_PUSH(-(uint32_t)(a > b));
452
453				}
454				break;
455			case 15: {
456				/* >= */
457
458	int32_t b = T0_POPi();
459	int32_t a = T0_POPi();
460	T0_PUSH(-(uint32_t)(a >= b));
461
462				}
463				break;
464			case 16: {
465				/* >> */
466
467	int c = (int)T0_POPi();
468	int32_t x = T0_POPi();
469	T0_PUSHi(x >> c);
470
471				}
472				break;
473			case 17: {
474				/* and */
475
476	uint32_t b = T0_POP();
477	uint32_t a = T0_POP();
478	T0_PUSH(a & b);
479
480				}
481				break;
482			case 18: {
483				/* co */
484 T0_CO();
485				}
486				break;
487			case 19: {
488				/* drop */
489 (void)T0_POP();
490				}
491				break;
492			case 20: {
493				/* dup */
494 T0_PUSH(T0_PEEK(0));
495				}
496				break;
497			case 21: {
498				/* eqOID */
499
500	const unsigned char *a2 = &t0_datablock[T0_POP()];
501	const unsigned char *a1 = &CTX->pad[0];
502	size_t len = a1[0];
503	int x;
504	if (len == a2[0]) {
505		x = -(memcmp(a1 + 1, a2 + 1, len) == 0);
506	} else {
507		x = 0;
508	}
509	T0_PUSH((uint32_t)x);
510
511				}
512				break;
513			case 22: {
514				/* fail */
515
516	CTX->err = T0_POPi();
517	T0_CO();
518
519				}
520				break;
521			case 23: {
522				/* get8 */
523
524	uint32_t addr = T0_POP();
525	T0_PUSH(*((unsigned char *)CTX + addr));
526
527				}
528				break;
529			case 24: {
530				/* neg */
531
532	uint32_t a = T0_POP();
533	T0_PUSH(-a);
534
535				}
536				break;
537			case 25: {
538				/* over */
539 T0_PUSH(T0_PEEK(1));
540				}
541				break;
542			case 26: {
543				/* read-blob-inner */
544
545	uint32_t len = T0_POP();
546	uint32_t addr = T0_POP();
547	size_t clen = CTX->hlen;
548	if (clen > len) {
549		clen = (size_t)len;
550	}
551	if (addr != 0) {
552		memcpy((unsigned char *)CTX + addr, CTX->hbuf, clen);
553	}
554	CTX->hbuf += clen;
555	CTX->hlen -= clen;
556	T0_PUSH(addr + clen);
557	T0_PUSH(len - clen);
558
559				}
560				break;
561			case 27: {
562				/* read8-low */
563
564	if (CTX->hlen == 0) {
565		T0_PUSHi(-1);
566	} else {
567		CTX->hlen --;
568		T0_PUSH(*CTX->hbuf ++);
569	}
570
571				}
572				break;
573			case 28: {
574				/* rot */
575 T0_ROT();
576				}
577				break;
578			case 29: {
579				/* set-ec-key */
580
581	size_t xlen = T0_POP();
582	uint32_t curve = T0_POP();
583	CTX->key.ec.curve = curve;
584	CTX->key.ec.x = CTX->key_data;
585	CTX->key.ec.xlen = xlen;
586
587				}
588				break;
589			case 30: {
590				/* set-rsa-key */
591
592	size_t iqlen = T0_POP();
593	size_t dqlen = T0_POP();
594	size_t dplen = T0_POP();
595	size_t qlen = T0_POP();
596	size_t plen = T0_POP();
597	uint32_t n_bitlen = T0_POP();
598	size_t off;
599
600	CTX->key.rsa.n_bitlen = n_bitlen;
601	CTX->key.rsa.p = CTX->key_data;
602	CTX->key.rsa.plen = plen;
603	off = plen;
604	CTX->key.rsa.q = CTX->key_data + off;
605	CTX->key.rsa.qlen = qlen;
606	off += qlen;
607	CTX->key.rsa.dp = CTX->key_data + off;
608	CTX->key.rsa.dplen = dplen;
609	off += dplen;
610	CTX->key.rsa.dq = CTX->key_data + off;
611	CTX->key.rsa.dqlen = dqlen;
612	off += dqlen;
613	CTX->key.rsa.iq = CTX->key_data + off;
614	CTX->key.rsa.iqlen = iqlen;
615
616				}
617				break;
618			case 31: {
619				/* set8 */
620
621	uint32_t addr = T0_POP();
622	*((unsigned char *)CTX + addr) = (unsigned char)T0_POP();
623
624				}
625				break;
626			case 32: {
627				/* swap */
628 T0_SWAP();
629				}
630				break;
631			case 33: {
632				/* u>> */
633
634	int c = (int)T0_POPi();
635	uint32_t x = T0_POP();
636	T0_PUSH(x >> c);
637
638				}
639				break;
640			}
641
642		} else {
643			T0_ENTER(ip, rp, t0x);
644		}
645	}
646t0_exit:
647	((t0_context *)t0ctx)->dp = dp;
648	((t0_context *)t0ctx)->rp = rp;
649	((t0_context *)t0ctx)->ip = ip;
650}
651