xref: /freebsd/contrib/bearssl/src/x509/skey_decoder.c (revision cc9e6590773dba57440750c124173ed531349a06)
10957b409SSimon J. Gerraty /* Automatically generated code; do not modify directly. */
20957b409SSimon J. Gerraty 
30957b409SSimon J. Gerraty #include <stddef.h>
40957b409SSimon J. Gerraty #include <stdint.h>
50957b409SSimon J. Gerraty 
60957b409SSimon J. Gerraty typedef struct {
70957b409SSimon J. Gerraty 	uint32_t *dp;
80957b409SSimon J. Gerraty 	uint32_t *rp;
90957b409SSimon J. Gerraty 	const unsigned char *ip;
100957b409SSimon J. Gerraty } t0_context;
110957b409SSimon J. Gerraty 
120957b409SSimon J. Gerraty static uint32_t
t0_parse7E_unsigned(const unsigned char ** p)130957b409SSimon J. Gerraty t0_parse7E_unsigned(const unsigned char **p)
140957b409SSimon J. Gerraty {
150957b409SSimon J. Gerraty 	uint32_t x;
160957b409SSimon J. Gerraty 
170957b409SSimon J. Gerraty 	x = 0;
180957b409SSimon J. Gerraty 	for (;;) {
190957b409SSimon J. Gerraty 		unsigned y;
200957b409SSimon J. Gerraty 
210957b409SSimon J. Gerraty 		y = *(*p) ++;
220957b409SSimon J. Gerraty 		x = (x << 7) | (uint32_t)(y & 0x7F);
230957b409SSimon J. Gerraty 		if (y < 0x80) {
240957b409SSimon J. Gerraty 			return x;
250957b409SSimon J. Gerraty 		}
260957b409SSimon J. Gerraty 	}
270957b409SSimon J. Gerraty }
280957b409SSimon J. Gerraty 
290957b409SSimon J. Gerraty static int32_t
t0_parse7E_signed(const unsigned char ** p)300957b409SSimon J. Gerraty t0_parse7E_signed(const unsigned char **p)
310957b409SSimon J. Gerraty {
320957b409SSimon J. Gerraty 	int neg;
330957b409SSimon J. Gerraty 	uint32_t x;
340957b409SSimon J. Gerraty 
350957b409SSimon J. Gerraty 	neg = ((**p) >> 6) & 1;
360957b409SSimon J. Gerraty 	x = (uint32_t)-neg;
370957b409SSimon J. Gerraty 	for (;;) {
380957b409SSimon J. Gerraty 		unsigned y;
390957b409SSimon J. Gerraty 
400957b409SSimon J. Gerraty 		y = *(*p) ++;
410957b409SSimon J. Gerraty 		x = (x << 7) | (uint32_t)(y & 0x7F);
420957b409SSimon J. Gerraty 		if (y < 0x80) {
430957b409SSimon J. Gerraty 			if (neg) {
440957b409SSimon J. Gerraty 				return -(int32_t)~x - 1;
450957b409SSimon J. Gerraty 			} else {
460957b409SSimon J. Gerraty 				return (int32_t)x;
470957b409SSimon J. Gerraty 			}
480957b409SSimon J. Gerraty 		}
490957b409SSimon J. Gerraty 	}
500957b409SSimon J. Gerraty }
510957b409SSimon J. Gerraty 
520957b409SSimon J. Gerraty #define T0_VBYTE(x, n)   (unsigned char)((((uint32_t)(x) >> (n)) & 0x7F) | 0x80)
530957b409SSimon J. Gerraty #define T0_FBYTE(x, n)   (unsigned char)(((uint32_t)(x) >> (n)) & 0x7F)
540957b409SSimon J. Gerraty #define T0_SBYTE(x)      (unsigned char)((((uint32_t)(x) >> 28) + 0xF8) ^ 0xF8)
550957b409SSimon J. Gerraty #define T0_INT1(x)       T0_FBYTE(x, 0)
560957b409SSimon J. Gerraty #define T0_INT2(x)       T0_VBYTE(x, 7), T0_FBYTE(x, 0)
570957b409SSimon J. Gerraty #define T0_INT3(x)       T0_VBYTE(x, 14), T0_VBYTE(x, 7), T0_FBYTE(x, 0)
580957b409SSimon J. Gerraty #define T0_INT4(x)       T0_VBYTE(x, 21), T0_VBYTE(x, 14), T0_VBYTE(x, 7), T0_FBYTE(x, 0)
590957b409SSimon J. Gerraty #define T0_INT5(x)       T0_SBYTE(x), T0_VBYTE(x, 21), T0_VBYTE(x, 14), T0_VBYTE(x, 7), T0_FBYTE(x, 0)
600957b409SSimon J. Gerraty 
610957b409SSimon J. Gerraty /* static const unsigned char t0_datablock[]; */
620957b409SSimon J. Gerraty 
630957b409SSimon J. Gerraty 
640957b409SSimon J. Gerraty void br_skey_decoder_init_main(void *t0ctx);
650957b409SSimon J. Gerraty 
660957b409SSimon J. Gerraty void br_skey_decoder_run(void *t0ctx);
670957b409SSimon J. Gerraty 
680957b409SSimon J. Gerraty 
690957b409SSimon J. Gerraty 
700957b409SSimon J. Gerraty #include "inner.h"
710957b409SSimon J. Gerraty 
720957b409SSimon J. Gerraty 
730957b409SSimon J. Gerraty 
740957b409SSimon J. Gerraty 
750957b409SSimon J. Gerraty 
760957b409SSimon J. Gerraty #include "inner.h"
770957b409SSimon J. Gerraty 
780957b409SSimon J. Gerraty #define CTX   ((br_skey_decoder_context *)(void *)((unsigned char *)t0ctx - offsetof(br_skey_decoder_context, cpu)))
790957b409SSimon J. Gerraty #define CONTEXT_NAME   br_skey_decoder_context
800957b409SSimon J. Gerraty 
810957b409SSimon J. Gerraty /* see bearssl_x509.h */
820957b409SSimon J. Gerraty void
br_skey_decoder_init(br_skey_decoder_context * ctx)830957b409SSimon J. Gerraty br_skey_decoder_init(br_skey_decoder_context *ctx)
840957b409SSimon J. Gerraty {
850957b409SSimon J. Gerraty 	memset(ctx, 0, sizeof *ctx);
860957b409SSimon J. Gerraty 	ctx->cpu.dp = &ctx->dp_stack[0];
870957b409SSimon J. Gerraty 	ctx->cpu.rp = &ctx->rp_stack[0];
880957b409SSimon J. Gerraty 	br_skey_decoder_init_main(&ctx->cpu);
890957b409SSimon J. Gerraty 	br_skey_decoder_run(&ctx->cpu);
900957b409SSimon J. Gerraty }
910957b409SSimon J. Gerraty 
920957b409SSimon J. Gerraty /* see bearssl_x509.h */
930957b409SSimon J. Gerraty void
br_skey_decoder_push(br_skey_decoder_context * ctx,const void * data,size_t len)940957b409SSimon J. Gerraty br_skey_decoder_push(br_skey_decoder_context *ctx,
950957b409SSimon J. Gerraty 	const void *data, size_t len)
960957b409SSimon J. Gerraty {
970957b409SSimon J. Gerraty 	ctx->hbuf = data;
980957b409SSimon J. Gerraty 	ctx->hlen = len;
990957b409SSimon J. Gerraty 	br_skey_decoder_run(&ctx->cpu);
1000957b409SSimon J. Gerraty }
1010957b409SSimon J. Gerraty 
1020957b409SSimon J. Gerraty 
1030957b409SSimon J. Gerraty 
1040957b409SSimon J. Gerraty static const unsigned char t0_datablock[] = {
1050957b409SSimon J. Gerraty 	0x00, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x07,
1060957b409SSimon J. Gerraty 	0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x02, 0x01, 0x08, 0x2A, 0x86, 0x48, 0xCE,
1070957b409SSimon J. Gerraty 	0x3D, 0x03, 0x01, 0x07, 0x05, 0x2B, 0x81, 0x04, 0x00, 0x22, 0x05, 0x2B,
1080957b409SSimon J. Gerraty 	0x81, 0x04, 0x00, 0x23
1090957b409SSimon J. Gerraty };
1100957b409SSimon J. Gerraty 
1110957b409SSimon J. Gerraty static const unsigned char t0_codeblock[] = {
1120957b409SSimon J. Gerraty 	0x00, 0x01, 0x01, 0x07, 0x00, 0x00, 0x01, 0x01, 0x08, 0x00, 0x00, 0x13,
1130957b409SSimon J. Gerraty 	0x13, 0x00, 0x00, 0x01, T0_INT1(BR_ERR_X509_BAD_TAG_CLASS), 0x00, 0x00,
1140957b409SSimon J. Gerraty 	0x01, T0_INT1(BR_ERR_X509_BAD_TAG_VALUE), 0x00, 0x00, 0x01,
1150957b409SSimon J. Gerraty 	T0_INT1(BR_ERR_X509_EXTRA_ELEMENT), 0x00, 0x00, 0x01,
1160957b409SSimon J. Gerraty 	T0_INT1(BR_ERR_X509_INDEFINITE_LENGTH), 0x00, 0x00, 0x01,
1170957b409SSimon J. Gerraty 	T0_INT1(BR_ERR_X509_INNER_TRUNC), 0x00, 0x00, 0x01,
1180957b409SSimon J. Gerraty 	T0_INT1(BR_ERR_X509_INVALID_VALUE), 0x00, 0x00, 0x01,
1190957b409SSimon J. Gerraty 	T0_INT1(BR_ERR_X509_LIMIT_EXCEEDED), 0x00, 0x00, 0x01,
1200957b409SSimon J. Gerraty 	T0_INT1(BR_ERR_X509_NOT_CONSTRUCTED), 0x00, 0x00, 0x01,
1210957b409SSimon J. Gerraty 	T0_INT1(BR_ERR_X509_NOT_PRIMITIVE), 0x00, 0x00, 0x01,
1220957b409SSimon J. Gerraty 	T0_INT1(BR_ERR_X509_OVERFLOW), 0x00, 0x00, 0x01,
1230957b409SSimon J. Gerraty 	T0_INT1(BR_ERR_X509_UNEXPECTED), 0x00, 0x00, 0x01,
1240957b409SSimon J. Gerraty 	T0_INT1(BR_ERR_X509_UNSUPPORTED), 0x00, 0x00, 0x01,
1250957b409SSimon J. Gerraty 	T0_INT1(BR_KEYTYPE_EC), 0x00, 0x00, 0x01, T0_INT1(BR_KEYTYPE_RSA),
1260957b409SSimon J. Gerraty 	0x00, 0x00, 0x01, T0_INT2(offsetof(CONTEXT_NAME, key_data)), 0x00,
1270957b409SSimon J. Gerraty 	0x00, 0x01, T0_INT2(offsetof(CONTEXT_NAME, key_type)), 0x00, 0x00,
1280957b409SSimon J. Gerraty 	0x33, 0x48, 0x00, 0x00, 0x01, T0_INT2(offsetof(CONTEXT_NAME, pad)),
1290957b409SSimon J. Gerraty 	0x00, 0x00, 0x01, 0x13, 0x00, 0x00, 0x01, 0x1C, 0x00, 0x00, 0x01, 0x22,
1300957b409SSimon J. Gerraty 	0x00, 0x00, 0x05, 0x02, 0x2C, 0x16, 0x00, 0x00, 0x06, 0x02, 0x2D, 0x16,
1310957b409SSimon J. Gerraty 	0x00, 0x00, 0x01, 0x10, 0x3D, 0x00, 0x00, 0x0D, 0x05, 0x02, 0x2F, 0x16,
1320957b409SSimon J. Gerraty 	0x3A, 0x00, 0x00, 0x0D, 0x05, 0x02, 0x2F, 0x16, 0x3B, 0x00, 0x00, 0x06,
1330957b409SSimon J. Gerraty 	0x02, 0x27, 0x16, 0x00, 0x01, 0x03, 0x00, 0x54, 0x57, 0x01, 0x02, 0x3E,
1340957b409SSimon J. Gerraty 	0x55, 0x23, 0x06, 0x02, 0x30, 0x16, 0x57, 0x01, 0x04, 0x3E, 0x02, 0x00,
1350957b409SSimon J. Gerraty 	0x41, 0x3F, 0x00, 0x02, 0x03, 0x00, 0x53, 0x14, 0x14, 0x03, 0x01, 0x48,
1360957b409SSimon J. Gerraty 	0x0E, 0x06, 0x02, 0x30, 0x16, 0x33, 0x4C, 0x58, 0x01, 0x7F, 0x19, 0x0D,
1370957b409SSimon J. Gerraty 	0x06, 0x04, 0x13, 0x13, 0x04, 0x29, 0x01, 0x20, 0x19, 0x0D, 0x06, 0x16,
1380957b409SSimon J. Gerraty 	0x13, 0x3A, 0x53, 0x4D, 0x02, 0x00, 0x06, 0x09, 0x02, 0x00, 0x0C, 0x06,
1390957b409SSimon J. Gerraty 	0x02, 0x2A, 0x16, 0x04, 0x02, 0x03, 0x00, 0x3F, 0x04, 0x0D, 0x01, 0x21,
1400957b409SSimon J. Gerraty 	0x19, 0x0D, 0x06, 0x04, 0x13, 0x3A, 0x04, 0x03, 0x30, 0x16, 0x13, 0x5D,
1410957b409SSimon J. Gerraty 	0x02, 0x00, 0x05, 0x02, 0x30, 0x16, 0x02, 0x00, 0x02, 0x01, 0x1D, 0x00,
1420957b409SSimon J. Gerraty 	0x02, 0x53, 0x4B, 0x05, 0x02, 0x30, 0x16, 0x5B, 0x15, 0x06, 0x07, 0x5D,
1430957b409SSimon J. Gerraty 	0x01, 0x7F, 0x03, 0x01, 0x04, 0x16, 0x46, 0x15, 0x06, 0x10, 0x01, 0x00,
1440957b409SSimon J. Gerraty 	0x03, 0x01, 0x14, 0x06, 0x03, 0x4D, 0x04, 0x02, 0x01, 0x00, 0x03, 0x00,
1450957b409SSimon J. Gerraty 	0x04, 0x02, 0x30, 0x16, 0x3F, 0x57, 0x01, 0x04, 0x3E, 0x53, 0x02, 0x01,
1460957b409SSimon J. Gerraty 	0x06, 0x03, 0x43, 0x04, 0x03, 0x02, 0x00, 0x40, 0x3F, 0x5D, 0x02, 0x01,
1470957b409SSimon J. Gerraty 	0x06, 0x03, 0x32, 0x04, 0x01, 0x31, 0x00, 0x00, 0x54, 0x57, 0x01, 0x02,
1480957b409SSimon J. Gerraty 	0x3E, 0x55, 0x06, 0x02, 0x30, 0x16, 0x57, 0x01, 0x02, 0x3E, 0x44, 0x3F,
1490957b409SSimon J. Gerraty 	0x00, 0x07, 0x35, 0x50, 0x14, 0x05, 0x02, 0x2F, 0x16, 0x23, 0x01, 0x03,
1500957b409SSimon J. Gerraty 	0x0B, 0x33, 0x17, 0x47, 0x07, 0x03, 0x00, 0x4F, 0x4F, 0x35, 0x4E, 0x14,
1510957b409SSimon J. Gerraty 	0x14, 0x03, 0x01, 0x03, 0x02, 0x51, 0x14, 0x03, 0x03, 0x02, 0x02, 0x07,
1520957b409SSimon J. Gerraty 	0x14, 0x03, 0x02, 0x51, 0x14, 0x03, 0x04, 0x02, 0x02, 0x07, 0x14, 0x03,
1530957b409SSimon J. Gerraty 	0x02, 0x51, 0x14, 0x03, 0x05, 0x02, 0x02, 0x07, 0x14, 0x03, 0x02, 0x51,
1540957b409SSimon J. Gerraty 	0x03, 0x06, 0x02, 0x00, 0x02, 0x01, 0x02, 0x03, 0x02, 0x04, 0x02, 0x05,
1550957b409SSimon J. Gerraty 	0x02, 0x06, 0x1E, 0x00, 0x00, 0x19, 0x19, 0x00, 0x00, 0x01, 0x0B, 0x00,
1560957b409SSimon J. Gerraty 	0x00, 0x01, 0x00, 0x20, 0x14, 0x06, 0x08, 0x01, 0x01, 0x21, 0x20, 0x22,
1570957b409SSimon J. Gerraty 	0x20, 0x04, 0x75, 0x13, 0x00, 0x00, 0x01,
158*cc9e6590SSimon J. Gerraty 	T0_INT2(3 * BR_X509_BUFSIZE_SIG), 0x00, 0x01, 0x01, 0x87, 0xFF, 0xFF,
1590957b409SSimon J. Gerraty 	0x7F, 0x54, 0x57, 0x01, 0x02, 0x3E, 0x55, 0x01, 0x01, 0x0E, 0x06, 0x02,
1600957b409SSimon J. Gerraty 	0x30, 0x16, 0x57, 0x01, 0x02, 0x19, 0x0D, 0x06, 0x06, 0x13, 0x3B, 0x44,
1610957b409SSimon J. Gerraty 	0x32, 0x04, 0x1C, 0x01, 0x04, 0x19, 0x0D, 0x06, 0x08, 0x13, 0x3B, 0x01,
1620957b409SSimon J. Gerraty 	0x00, 0x41, 0x31, 0x04, 0x0E, 0x01, 0x10, 0x19, 0x0D, 0x06, 0x05, 0x13,
1630957b409SSimon J. Gerraty 	0x3A, 0x42, 0x04, 0x03, 0x30, 0x16, 0x13, 0x03, 0x00, 0x3F, 0x02, 0x00,
1640957b409SSimon J. Gerraty 	0x34, 0x1F, 0x5A, 0x27, 0x16, 0x00, 0x01, 0x45, 0x0A, 0x06, 0x02, 0x29,
1650957b409SSimon J. Gerraty 	0x16, 0x14, 0x03, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x57, 0x01, 0x06,
1660957b409SSimon J. Gerraty 	0x3E, 0x56, 0x00, 0x00, 0x20, 0x14, 0x06, 0x07, 0x1A, 0x14, 0x06, 0x01,
1670957b409SSimon J. Gerraty 	0x12, 0x04, 0x76, 0x24, 0x00, 0x00, 0x4B, 0x05, 0x02, 0x30, 0x16, 0x37,
1680957b409SSimon J. Gerraty 	0x15, 0x06, 0x04, 0x01, 0x17, 0x04, 0x12, 0x38, 0x15, 0x06, 0x04, 0x01,
1690957b409SSimon J. Gerraty 	0x18, 0x04, 0x0A, 0x39, 0x15, 0x06, 0x04, 0x01, 0x19, 0x04, 0x02, 0x30,
1700957b409SSimon J. Gerraty 	0x16, 0x00, 0x00, 0x1C, 0x57, 0x01, 0x02, 0x3E, 0x09, 0x50, 0x00, 0x00,
1710957b409SSimon J. Gerraty 	0x35, 0x4E, 0x13, 0x00, 0x03, 0x14, 0x03, 0x00, 0x03, 0x01, 0x03, 0x02,
1720957b409SSimon J. Gerraty 	0x53, 0x59, 0x14, 0x01, 0x81, 0x00, 0x0F, 0x06, 0x02, 0x2E, 0x16, 0x14,
1730957b409SSimon J. Gerraty 	0x01, 0x00, 0x0D, 0x06, 0x0B, 0x13, 0x14, 0x05, 0x04, 0x13, 0x01, 0x00,
1740957b409SSimon J. Gerraty 	0x00, 0x59, 0x04, 0x6F, 0x02, 0x01, 0x14, 0x05, 0x02, 0x2B, 0x16, 0x23,
1750957b409SSimon J. Gerraty 	0x03, 0x01, 0x02, 0x02, 0x1F, 0x02, 0x02, 0x22, 0x03, 0x02, 0x14, 0x06,
1760957b409SSimon J. Gerraty 	0x03, 0x59, 0x04, 0x68, 0x13, 0x02, 0x00, 0x02, 0x01, 0x08, 0x00, 0x00,
1770957b409SSimon J. Gerraty 	0x14, 0x35, 0x1C, 0x08, 0x20, 0x1C, 0x07, 0x20, 0x4E, 0x00, 0x01, 0x59,
1780957b409SSimon J. Gerraty 	0x14, 0x01, 0x81, 0x00, 0x0A, 0x06, 0x01, 0x00, 0x01, 0x81, 0x00, 0x08,
1790957b409SSimon J. Gerraty 	0x14, 0x05, 0x02, 0x28, 0x16, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01,
1800957b409SSimon J. Gerraty 	0x00, 0x0E, 0x06, 0x19, 0x02, 0x00, 0x23, 0x03, 0x00, 0x14, 0x01, 0x83,
1810957b409SSimon J. Gerraty 	0xFF, 0xFF, 0x7F, 0x0E, 0x06, 0x02, 0x29, 0x16, 0x01, 0x08, 0x0B, 0x20,
1820957b409SSimon J. Gerraty 	0x59, 0x1C, 0x07, 0x04, 0x60, 0x00, 0x00, 0x52, 0x4A, 0x00, 0x00, 0x57,
1830957b409SSimon J. Gerraty 	0x3C, 0x53, 0x00, 0x01, 0x53, 0x14, 0x05, 0x02, 0x2E, 0x16, 0x59, 0x14,
1840957b409SSimon J. Gerraty 	0x01, 0x81, 0x00, 0x0F, 0x06, 0x02, 0x2E, 0x16, 0x03, 0x00, 0x14, 0x06,
1850957b409SSimon J. Gerraty 	0x16, 0x59, 0x02, 0x00, 0x14, 0x01, 0x87, 0xFF, 0xFF, 0x7F, 0x0F, 0x06,
1860957b409SSimon J. Gerraty 	0x02, 0x2E, 0x16, 0x01, 0x08, 0x0B, 0x07, 0x03, 0x00, 0x04, 0x67, 0x13,
1870957b409SSimon J. Gerraty 	0x02, 0x00, 0x00, 0x00, 0x53, 0x14, 0x01, 0x81, 0x7F, 0x0E, 0x06, 0x08,
1880957b409SSimon J. Gerraty 	0x5C, 0x01, 0x00, 0x36, 0x1F, 0x01, 0x00, 0x00, 0x14, 0x36, 0x1F, 0x36,
1890957b409SSimon J. Gerraty 	0x22, 0x4C, 0x01, 0x7F, 0x00, 0x01, 0x59, 0x03, 0x00, 0x02, 0x00, 0x01,
1900957b409SSimon J. Gerraty 	0x05, 0x10, 0x01, 0x01, 0x11, 0x18, 0x02, 0x00, 0x01, 0x06, 0x10, 0x14,
1910957b409SSimon J. Gerraty 	0x01, 0x01, 0x11, 0x06, 0x02, 0x25, 0x16, 0x01, 0x04, 0x0B, 0x02, 0x00,
1920957b409SSimon J. Gerraty 	0x01, 0x1F, 0x11, 0x14, 0x01, 0x1F, 0x0D, 0x06, 0x02, 0x26, 0x16, 0x07,
1930957b409SSimon J. Gerraty 	0x00, 0x00, 0x14, 0x05, 0x05, 0x01, 0x00, 0x01, 0x7F, 0x00, 0x57, 0x00,
1940957b409SSimon J. Gerraty 	0x00, 0x14, 0x05, 0x02, 0x29, 0x16, 0x23, 0x5A, 0x00, 0x00, 0x1B, 0x14,
1950957b409SSimon J. Gerraty 	0x01, 0x00, 0x0F, 0x06, 0x01, 0x00, 0x13, 0x12, 0x04, 0x74, 0x00, 0x01,
1960957b409SSimon J. Gerraty 	0x01, 0x00, 0x00, 0x5D, 0x13, 0x00, 0x00, 0x14, 0x06, 0x07, 0x5E, 0x14,
1970957b409SSimon J. Gerraty 	0x06, 0x01, 0x12, 0x04, 0x76, 0x00, 0x00, 0x01, 0x00, 0x19, 0x1A, 0x09,
1980957b409SSimon J. Gerraty 	0x24, 0x00
1990957b409SSimon J. Gerraty };
2000957b409SSimon J. Gerraty 
2010957b409SSimon J. Gerraty static const uint16_t t0_caddr[] = {
2020957b409SSimon J. Gerraty 	0,
2030957b409SSimon J. Gerraty 	5,
2040957b409SSimon J. Gerraty 	10,
2050957b409SSimon J. Gerraty 	14,
2060957b409SSimon J. Gerraty 	18,
2070957b409SSimon J. Gerraty 	22,
2080957b409SSimon J. Gerraty 	26,
2090957b409SSimon J. Gerraty 	30,
2100957b409SSimon J. Gerraty 	34,
2110957b409SSimon J. Gerraty 	38,
2120957b409SSimon J. Gerraty 	42,
2130957b409SSimon J. Gerraty 	46,
2140957b409SSimon J. Gerraty 	50,
2150957b409SSimon J. Gerraty 	54,
2160957b409SSimon J. Gerraty 	58,
2170957b409SSimon J. Gerraty 	62,
2180957b409SSimon J. Gerraty 	66,
2190957b409SSimon J. Gerraty 	70,
2200957b409SSimon J. Gerraty 	75,
2210957b409SSimon J. Gerraty 	80,
2220957b409SSimon J. Gerraty 	84,
2230957b409SSimon J. Gerraty 	89,
2240957b409SSimon J. Gerraty 	93,
2250957b409SSimon J. Gerraty 	97,
2260957b409SSimon J. Gerraty 	101,
2270957b409SSimon J. Gerraty 	107,
2280957b409SSimon J. Gerraty 	113,
2290957b409SSimon J. Gerraty 	118,
2300957b409SSimon J. Gerraty 	126,
2310957b409SSimon J. Gerraty 	134,
2320957b409SSimon J. Gerraty 	140,
2330957b409SSimon J. Gerraty 	163,
2340957b409SSimon J. Gerraty 	244,
2350957b409SSimon J. Gerraty 	311,
2360957b409SSimon J. Gerraty 	329,
2370957b409SSimon J. Gerraty 	404,
2380957b409SSimon J. Gerraty 	408,
2390957b409SSimon J. Gerraty 	412,
2400957b409SSimon J. Gerraty 	429,
2410957b409SSimon J. Gerraty 	434,
2420957b409SSimon J. Gerraty 	505,
2430957b409SSimon J. Gerraty 	519,
2440957b409SSimon J. Gerraty 	526,
2450957b409SSimon J. Gerraty 	540,
2460957b409SSimon J. Gerraty 	573,
2470957b409SSimon J. Gerraty 	582,
2480957b409SSimon J. Gerraty 	587,
2490957b409SSimon J. Gerraty 	654,
2500957b409SSimon J. Gerraty 	665,
2510957b409SSimon J. Gerraty 	721,
2520957b409SSimon J. Gerraty 	725,
2530957b409SSimon J. Gerraty 	730,
2540957b409SSimon J. Gerraty 	778,
2550957b409SSimon J. Gerraty 	804,
2560957b409SSimon J. Gerraty 	848,
2570957b409SSimon J. Gerraty 	859,
2580957b409SSimon J. Gerraty 	868,
2590957b409SSimon J. Gerraty 	881,
2600957b409SSimon J. Gerraty 	885,
2610957b409SSimon J. Gerraty 	889,
2620957b409SSimon J. Gerraty 	901
2630957b409SSimon J. Gerraty };
2640957b409SSimon J. Gerraty 
2650957b409SSimon J. Gerraty #define T0_INTERPRETED   34
2660957b409SSimon J. Gerraty 
2670957b409SSimon J. Gerraty #define T0_ENTER(ip, rp, slot)   do { \
2680957b409SSimon J. Gerraty 		const unsigned char *t0_newip; \
2690957b409SSimon J. Gerraty 		uint32_t t0_lnum; \
2700957b409SSimon J. Gerraty 		t0_newip = &t0_codeblock[t0_caddr[(slot) - T0_INTERPRETED]]; \
2710957b409SSimon J. Gerraty 		t0_lnum = t0_parse7E_unsigned(&t0_newip); \
2720957b409SSimon J. Gerraty 		(rp) += t0_lnum; \
2730957b409SSimon J. Gerraty 		*((rp) ++) = (uint32_t)((ip) - &t0_codeblock[0]) + (t0_lnum << 16); \
2740957b409SSimon J. Gerraty 		(ip) = t0_newip; \
2750957b409SSimon J. Gerraty 	} while (0)
2760957b409SSimon J. Gerraty 
2770957b409SSimon J. Gerraty #define T0_DEFENTRY(name, slot) \
2780957b409SSimon J. Gerraty void \
2790957b409SSimon J. Gerraty name(void *ctx) \
2800957b409SSimon J. Gerraty { \
2810957b409SSimon J. Gerraty 	t0_context *t0ctx = ctx; \
2820957b409SSimon J. Gerraty 	t0ctx->ip = &t0_codeblock[0]; \
2830957b409SSimon J. Gerraty 	T0_ENTER(t0ctx->ip, t0ctx->rp, slot); \
2840957b409SSimon J. Gerraty }
2850957b409SSimon J. Gerraty 
2860957b409SSimon J. Gerraty T0_DEFENTRY(br_skey_decoder_init_main, 73)
2870957b409SSimon J. Gerraty 
2880957b409SSimon J. Gerraty #define T0_NEXT(t0ipp)   (*(*(t0ipp)) ++)
2890957b409SSimon J. Gerraty 
2900957b409SSimon J. Gerraty void
br_skey_decoder_run(void * t0ctx)2910957b409SSimon J. Gerraty br_skey_decoder_run(void *t0ctx)
2920957b409SSimon J. Gerraty {
2930957b409SSimon J. Gerraty 	uint32_t *dp, *rp;
2940957b409SSimon J. Gerraty 	const unsigned char *ip;
2950957b409SSimon J. Gerraty 
2960957b409SSimon J. Gerraty #define T0_LOCAL(x)    (*(rp - 2 - (x)))
2970957b409SSimon J. Gerraty #define T0_POP()       (*-- dp)
2980957b409SSimon J. Gerraty #define T0_POPi()      (*(int32_t *)(-- dp))
2990957b409SSimon J. Gerraty #define T0_PEEK(x)     (*(dp - 1 - (x)))
3000957b409SSimon J. Gerraty #define T0_PEEKi(x)    (*(int32_t *)(dp - 1 - (x)))
3010957b409SSimon J. Gerraty #define T0_PUSH(v)     do { *dp = (v); dp ++; } while (0)
3020957b409SSimon J. Gerraty #define T0_PUSHi(v)    do { *(int32_t *)dp = (v); dp ++; } while (0)
3030957b409SSimon J. Gerraty #define T0_RPOP()      (*-- rp)
3040957b409SSimon J. Gerraty #define T0_RPOPi()     (*(int32_t *)(-- rp))
3050957b409SSimon J. Gerraty #define T0_RPUSH(v)    do { *rp = (v); rp ++; } while (0)
3060957b409SSimon J. Gerraty #define T0_RPUSHi(v)   do { *(int32_t *)rp = (v); rp ++; } while (0)
3070957b409SSimon J. Gerraty #define T0_ROLL(x)     do { \
3080957b409SSimon J. Gerraty 	size_t t0len = (size_t)(x); \
3090957b409SSimon J. Gerraty 	uint32_t t0tmp = *(dp - 1 - t0len); \
3100957b409SSimon J. Gerraty 	memmove(dp - t0len - 1, dp - t0len, t0len * sizeof *dp); \
3110957b409SSimon J. Gerraty 	*(dp - 1) = t0tmp; \
3120957b409SSimon J. Gerraty } while (0)
3130957b409SSimon J. Gerraty #define T0_SWAP()      do { \
3140957b409SSimon J. Gerraty 	uint32_t t0tmp = *(dp - 2); \
3150957b409SSimon J. Gerraty 	*(dp - 2) = *(dp - 1); \
3160957b409SSimon J. Gerraty 	*(dp - 1) = t0tmp; \
3170957b409SSimon J. Gerraty } while (0)
3180957b409SSimon J. Gerraty #define T0_ROT()       do { \
3190957b409SSimon J. Gerraty 	uint32_t t0tmp = *(dp - 3); \
3200957b409SSimon J. Gerraty 	*(dp - 3) = *(dp - 2); \
3210957b409SSimon J. Gerraty 	*(dp - 2) = *(dp - 1); \
3220957b409SSimon J. Gerraty 	*(dp - 1) = t0tmp; \
3230957b409SSimon J. Gerraty } while (0)
3240957b409SSimon J. Gerraty #define T0_NROT()       do { \
3250957b409SSimon J. Gerraty 	uint32_t t0tmp = *(dp - 1); \
3260957b409SSimon J. Gerraty 	*(dp - 1) = *(dp - 2); \
3270957b409SSimon J. Gerraty 	*(dp - 2) = *(dp - 3); \
3280957b409SSimon J. Gerraty 	*(dp - 3) = t0tmp; \
3290957b409SSimon J. Gerraty } while (0)
3300957b409SSimon J. Gerraty #define T0_PICK(x)      do { \
3310957b409SSimon J. Gerraty 	uint32_t t0depth = (x); \
3320957b409SSimon J. Gerraty 	T0_PUSH(T0_PEEK(t0depth)); \
3330957b409SSimon J. Gerraty } while (0)
3340957b409SSimon J. Gerraty #define T0_CO()         do { \
3350957b409SSimon J. Gerraty 	goto t0_exit; \
3360957b409SSimon J. Gerraty } while (0)
3370957b409SSimon J. Gerraty #define T0_RET()        goto t0_next
3380957b409SSimon J. Gerraty 
3390957b409SSimon J. Gerraty 	dp = ((t0_context *)t0ctx)->dp;
3400957b409SSimon J. Gerraty 	rp = ((t0_context *)t0ctx)->rp;
3410957b409SSimon J. Gerraty 	ip = ((t0_context *)t0ctx)->ip;
3420957b409SSimon J. Gerraty 	goto t0_next;
3430957b409SSimon J. Gerraty 	for (;;) {
3440957b409SSimon J. Gerraty 		uint32_t t0x;
3450957b409SSimon J. Gerraty 
3460957b409SSimon J. Gerraty 	t0_next:
3470957b409SSimon J. Gerraty 		t0x = T0_NEXT(&ip);
3480957b409SSimon J. Gerraty 		if (t0x < T0_INTERPRETED) {
3490957b409SSimon J. Gerraty 			switch (t0x) {
3500957b409SSimon J. Gerraty 				int32_t t0off;
3510957b409SSimon J. Gerraty 
3520957b409SSimon J. Gerraty 			case 0: /* ret */
3530957b409SSimon J. Gerraty 				t0x = T0_RPOP();
3540957b409SSimon J. Gerraty 				rp -= (t0x >> 16);
3550957b409SSimon J. Gerraty 				t0x &= 0xFFFF;
3560957b409SSimon J. Gerraty 				if (t0x == 0) {
3570957b409SSimon J. Gerraty 					ip = NULL;
3580957b409SSimon J. Gerraty 					goto t0_exit;
3590957b409SSimon J. Gerraty 				}
3600957b409SSimon J. Gerraty 				ip = &t0_codeblock[t0x];
3610957b409SSimon J. Gerraty 				break;
3620957b409SSimon J. Gerraty 			case 1: /* literal constant */
3630957b409SSimon J. Gerraty 				T0_PUSHi(t0_parse7E_signed(&ip));
3640957b409SSimon J. Gerraty 				break;
3650957b409SSimon J. Gerraty 			case 2: /* read local */
3660957b409SSimon J. Gerraty 				T0_PUSH(T0_LOCAL(t0_parse7E_unsigned(&ip)));
3670957b409SSimon J. Gerraty 				break;
3680957b409SSimon J. Gerraty 			case 3: /* write local */
3690957b409SSimon J. Gerraty 				T0_LOCAL(t0_parse7E_unsigned(&ip)) = T0_POP();
3700957b409SSimon J. Gerraty 				break;
3710957b409SSimon J. Gerraty 			case 4: /* jump */
3720957b409SSimon J. Gerraty 				t0off = t0_parse7E_signed(&ip);
3730957b409SSimon J. Gerraty 				ip += t0off;
3740957b409SSimon J. Gerraty 				break;
3750957b409SSimon J. Gerraty 			case 5: /* jump if */
3760957b409SSimon J. Gerraty 				t0off = t0_parse7E_signed(&ip);
3770957b409SSimon J. Gerraty 				if (T0_POP()) {
3780957b409SSimon J. Gerraty 					ip += t0off;
3790957b409SSimon J. Gerraty 				}
3800957b409SSimon J. Gerraty 				break;
3810957b409SSimon J. Gerraty 			case 6: /* jump if not */
3820957b409SSimon J. Gerraty 				t0off = t0_parse7E_signed(&ip);
3830957b409SSimon J. Gerraty 				if (!T0_POP()) {
3840957b409SSimon J. Gerraty 					ip += t0off;
3850957b409SSimon J. Gerraty 				}
3860957b409SSimon J. Gerraty 				break;
3870957b409SSimon J. Gerraty 			case 7: {
3880957b409SSimon J. Gerraty 				/* + */
3890957b409SSimon J. Gerraty 
3900957b409SSimon J. Gerraty 	uint32_t b = T0_POP();
3910957b409SSimon J. Gerraty 	uint32_t a = T0_POP();
3920957b409SSimon J. Gerraty 	T0_PUSH(a + b);
3930957b409SSimon J. Gerraty 
3940957b409SSimon J. Gerraty 				}
3950957b409SSimon J. Gerraty 				break;
3960957b409SSimon J. Gerraty 			case 8: {
3970957b409SSimon J. Gerraty 				/* - */
3980957b409SSimon J. Gerraty 
3990957b409SSimon J. Gerraty 	uint32_t b = T0_POP();
4000957b409SSimon J. Gerraty 	uint32_t a = T0_POP();
4010957b409SSimon J. Gerraty 	T0_PUSH(a - b);
4020957b409SSimon J. Gerraty 
4030957b409SSimon J. Gerraty 				}
4040957b409SSimon J. Gerraty 				break;
4050957b409SSimon J. Gerraty 			case 9: {
4060957b409SSimon J. Gerraty 				/* -rot */
4070957b409SSimon J. Gerraty  T0_NROT();
4080957b409SSimon J. Gerraty 				}
4090957b409SSimon J. Gerraty 				break;
4100957b409SSimon J. Gerraty 			case 10: {
4110957b409SSimon J. Gerraty 				/* < */
4120957b409SSimon J. Gerraty 
4130957b409SSimon J. Gerraty 	int32_t b = T0_POPi();
4140957b409SSimon J. Gerraty 	int32_t a = T0_POPi();
4150957b409SSimon J. Gerraty 	T0_PUSH(-(uint32_t)(a < b));
4160957b409SSimon J. Gerraty 
4170957b409SSimon J. Gerraty 				}
4180957b409SSimon J. Gerraty 				break;
4190957b409SSimon J. Gerraty 			case 11: {
4200957b409SSimon J. Gerraty 				/* << */
4210957b409SSimon J. Gerraty 
4220957b409SSimon J. Gerraty 	int c = (int)T0_POPi();
4230957b409SSimon J. Gerraty 	uint32_t x = T0_POP();
4240957b409SSimon J. Gerraty 	T0_PUSH(x << c);
4250957b409SSimon J. Gerraty 
4260957b409SSimon J. Gerraty 				}
4270957b409SSimon J. Gerraty 				break;
4280957b409SSimon J. Gerraty 			case 12: {
4290957b409SSimon J. Gerraty 				/* <> */
4300957b409SSimon J. Gerraty 
4310957b409SSimon J. Gerraty 	uint32_t b = T0_POP();
4320957b409SSimon J. Gerraty 	uint32_t a = T0_POP();
4330957b409SSimon J. Gerraty 	T0_PUSH(-(uint32_t)(a != b));
4340957b409SSimon J. Gerraty 
4350957b409SSimon J. Gerraty 				}
4360957b409SSimon J. Gerraty 				break;
4370957b409SSimon J. Gerraty 			case 13: {
4380957b409SSimon J. Gerraty 				/* = */
4390957b409SSimon J. Gerraty 
4400957b409SSimon J. Gerraty 	uint32_t b = T0_POP();
4410957b409SSimon J. Gerraty 	uint32_t a = T0_POP();
4420957b409SSimon J. Gerraty 	T0_PUSH(-(uint32_t)(a == b));
4430957b409SSimon J. Gerraty 
4440957b409SSimon J. Gerraty 				}
4450957b409SSimon J. Gerraty 				break;
4460957b409SSimon J. Gerraty 			case 14: {
4470957b409SSimon J. Gerraty 				/* > */
4480957b409SSimon J. Gerraty 
4490957b409SSimon J. Gerraty 	int32_t b = T0_POPi();
4500957b409SSimon J. Gerraty 	int32_t a = T0_POPi();
4510957b409SSimon J. Gerraty 	T0_PUSH(-(uint32_t)(a > b));
4520957b409SSimon J. Gerraty 
4530957b409SSimon J. Gerraty 				}
4540957b409SSimon J. Gerraty 				break;
4550957b409SSimon J. Gerraty 			case 15: {
4560957b409SSimon J. Gerraty 				/* >= */
4570957b409SSimon J. Gerraty 
4580957b409SSimon J. Gerraty 	int32_t b = T0_POPi();
4590957b409SSimon J. Gerraty 	int32_t a = T0_POPi();
4600957b409SSimon J. Gerraty 	T0_PUSH(-(uint32_t)(a >= b));
4610957b409SSimon J. Gerraty 
4620957b409SSimon J. Gerraty 				}
4630957b409SSimon J. Gerraty 				break;
4640957b409SSimon J. Gerraty 			case 16: {
4650957b409SSimon J. Gerraty 				/* >> */
4660957b409SSimon J. Gerraty 
4670957b409SSimon J. Gerraty 	int c = (int)T0_POPi();
4680957b409SSimon J. Gerraty 	int32_t x = T0_POPi();
4690957b409SSimon J. Gerraty 	T0_PUSHi(x >> c);
4700957b409SSimon J. Gerraty 
4710957b409SSimon J. Gerraty 				}
4720957b409SSimon J. Gerraty 				break;
4730957b409SSimon J. Gerraty 			case 17: {
4740957b409SSimon J. Gerraty 				/* and */
4750957b409SSimon J. Gerraty 
4760957b409SSimon J. Gerraty 	uint32_t b = T0_POP();
4770957b409SSimon J. Gerraty 	uint32_t a = T0_POP();
4780957b409SSimon J. Gerraty 	T0_PUSH(a & b);
4790957b409SSimon J. Gerraty 
4800957b409SSimon J. Gerraty 				}
4810957b409SSimon J. Gerraty 				break;
4820957b409SSimon J. Gerraty 			case 18: {
4830957b409SSimon J. Gerraty 				/* co */
4840957b409SSimon J. Gerraty  T0_CO();
4850957b409SSimon J. Gerraty 				}
4860957b409SSimon J. Gerraty 				break;
4870957b409SSimon J. Gerraty 			case 19: {
4880957b409SSimon J. Gerraty 				/* drop */
4890957b409SSimon J. Gerraty  (void)T0_POP();
4900957b409SSimon J. Gerraty 				}
4910957b409SSimon J. Gerraty 				break;
4920957b409SSimon J. Gerraty 			case 20: {
4930957b409SSimon J. Gerraty 				/* dup */
4940957b409SSimon J. Gerraty  T0_PUSH(T0_PEEK(0));
4950957b409SSimon J. Gerraty 				}
4960957b409SSimon J. Gerraty 				break;
4970957b409SSimon J. Gerraty 			case 21: {
4980957b409SSimon J. Gerraty 				/* eqOID */
4990957b409SSimon J. Gerraty 
5000957b409SSimon J. Gerraty 	const unsigned char *a2 = &t0_datablock[T0_POP()];
5010957b409SSimon J. Gerraty 	const unsigned char *a1 = &CTX->pad[0];
5020957b409SSimon J. Gerraty 	size_t len = a1[0];
5030957b409SSimon J. Gerraty 	int x;
5040957b409SSimon J. Gerraty 	if (len == a2[0]) {
5050957b409SSimon J. Gerraty 		x = -(memcmp(a1 + 1, a2 + 1, len) == 0);
5060957b409SSimon J. Gerraty 	} else {
5070957b409SSimon J. Gerraty 		x = 0;
5080957b409SSimon J. Gerraty 	}
5090957b409SSimon J. Gerraty 	T0_PUSH((uint32_t)x);
5100957b409SSimon J. Gerraty 
5110957b409SSimon J. Gerraty 				}
5120957b409SSimon J. Gerraty 				break;
5130957b409SSimon J. Gerraty 			case 22: {
5140957b409SSimon J. Gerraty 				/* fail */
5150957b409SSimon J. Gerraty 
5160957b409SSimon J. Gerraty 	CTX->err = T0_POPi();
5170957b409SSimon J. Gerraty 	T0_CO();
5180957b409SSimon J. Gerraty 
5190957b409SSimon J. Gerraty 				}
5200957b409SSimon J. Gerraty 				break;
5210957b409SSimon J. Gerraty 			case 23: {
5220957b409SSimon J. Gerraty 				/* get8 */
5230957b409SSimon J. Gerraty 
5240957b409SSimon J. Gerraty 	uint32_t addr = T0_POP();
5250957b409SSimon J. Gerraty 	T0_PUSH(*((unsigned char *)CTX + addr));
5260957b409SSimon J. Gerraty 
5270957b409SSimon J. Gerraty 				}
5280957b409SSimon J. Gerraty 				break;
5290957b409SSimon J. Gerraty 			case 24: {
5300957b409SSimon J. Gerraty 				/* neg */
5310957b409SSimon J. Gerraty 
5320957b409SSimon J. Gerraty 	uint32_t a = T0_POP();
5330957b409SSimon J. Gerraty 	T0_PUSH(-a);
5340957b409SSimon J. Gerraty 
5350957b409SSimon J. Gerraty 				}
5360957b409SSimon J. Gerraty 				break;
5370957b409SSimon J. Gerraty 			case 25: {
5380957b409SSimon J. Gerraty 				/* over */
5390957b409SSimon J. Gerraty  T0_PUSH(T0_PEEK(1));
5400957b409SSimon J. Gerraty 				}
5410957b409SSimon J. Gerraty 				break;
5420957b409SSimon J. Gerraty 			case 26: {
5430957b409SSimon J. Gerraty 				/* read-blob-inner */
5440957b409SSimon J. Gerraty 
5450957b409SSimon J. Gerraty 	uint32_t len = T0_POP();
5460957b409SSimon J. Gerraty 	uint32_t addr = T0_POP();
5470957b409SSimon J. Gerraty 	size_t clen = CTX->hlen;
5480957b409SSimon J. Gerraty 	if (clen > len) {
5490957b409SSimon J. Gerraty 		clen = (size_t)len;
5500957b409SSimon J. Gerraty 	}
5510957b409SSimon J. Gerraty 	if (addr != 0) {
5520957b409SSimon J. Gerraty 		memcpy((unsigned char *)CTX + addr, CTX->hbuf, clen);
5530957b409SSimon J. Gerraty 	}
5540957b409SSimon J. Gerraty 	CTX->hbuf += clen;
5550957b409SSimon J. Gerraty 	CTX->hlen -= clen;
5560957b409SSimon J. Gerraty 	T0_PUSH(addr + clen);
5570957b409SSimon J. Gerraty 	T0_PUSH(len - clen);
5580957b409SSimon J. Gerraty 
5590957b409SSimon J. Gerraty 				}
5600957b409SSimon J. Gerraty 				break;
5610957b409SSimon J. Gerraty 			case 27: {
5620957b409SSimon J. Gerraty 				/* read8-low */
5630957b409SSimon J. Gerraty 
5640957b409SSimon J. Gerraty 	if (CTX->hlen == 0) {
5650957b409SSimon J. Gerraty 		T0_PUSHi(-1);
5660957b409SSimon J. Gerraty 	} else {
5670957b409SSimon J. Gerraty 		CTX->hlen --;
5680957b409SSimon J. Gerraty 		T0_PUSH(*CTX->hbuf ++);
5690957b409SSimon J. Gerraty 	}
5700957b409SSimon J. Gerraty 
5710957b409SSimon J. Gerraty 				}
5720957b409SSimon J. Gerraty 				break;
5730957b409SSimon J. Gerraty 			case 28: {
5740957b409SSimon J. Gerraty 				/* rot */
5750957b409SSimon J. Gerraty  T0_ROT();
5760957b409SSimon J. Gerraty 				}
5770957b409SSimon J. Gerraty 				break;
5780957b409SSimon J. Gerraty 			case 29: {
5790957b409SSimon J. Gerraty 				/* set-ec-key */
5800957b409SSimon J. Gerraty 
5810957b409SSimon J. Gerraty 	size_t xlen = T0_POP();
5820957b409SSimon J. Gerraty 	uint32_t curve = T0_POP();
5830957b409SSimon J. Gerraty 	CTX->key.ec.curve = curve;
5840957b409SSimon J. Gerraty 	CTX->key.ec.x = CTX->key_data;
5850957b409SSimon J. Gerraty 	CTX->key.ec.xlen = xlen;
5860957b409SSimon J. Gerraty 
5870957b409SSimon J. Gerraty 				}
5880957b409SSimon J. Gerraty 				break;
5890957b409SSimon J. Gerraty 			case 30: {
5900957b409SSimon J. Gerraty 				/* set-rsa-key */
5910957b409SSimon J. Gerraty 
5920957b409SSimon J. Gerraty 	size_t iqlen = T0_POP();
5930957b409SSimon J. Gerraty 	size_t dqlen = T0_POP();
5940957b409SSimon J. Gerraty 	size_t dplen = T0_POP();
5950957b409SSimon J. Gerraty 	size_t qlen = T0_POP();
5960957b409SSimon J. Gerraty 	size_t plen = T0_POP();
5970957b409SSimon J. Gerraty 	uint32_t n_bitlen = T0_POP();
5980957b409SSimon J. Gerraty 	size_t off;
5990957b409SSimon J. Gerraty 
6000957b409SSimon J. Gerraty 	CTX->key.rsa.n_bitlen = n_bitlen;
6010957b409SSimon J. Gerraty 	CTX->key.rsa.p = CTX->key_data;
6020957b409SSimon J. Gerraty 	CTX->key.rsa.plen = plen;
6030957b409SSimon J. Gerraty 	off = plen;
6040957b409SSimon J. Gerraty 	CTX->key.rsa.q = CTX->key_data + off;
6050957b409SSimon J. Gerraty 	CTX->key.rsa.qlen = qlen;
6060957b409SSimon J. Gerraty 	off += qlen;
6070957b409SSimon J. Gerraty 	CTX->key.rsa.dp = CTX->key_data + off;
6080957b409SSimon J. Gerraty 	CTX->key.rsa.dplen = dplen;
6090957b409SSimon J. Gerraty 	off += dplen;
6100957b409SSimon J. Gerraty 	CTX->key.rsa.dq = CTX->key_data + off;
6110957b409SSimon J. Gerraty 	CTX->key.rsa.dqlen = dqlen;
6120957b409SSimon J. Gerraty 	off += dqlen;
6130957b409SSimon J. Gerraty 	CTX->key.rsa.iq = CTX->key_data + off;
6140957b409SSimon J. Gerraty 	CTX->key.rsa.iqlen = iqlen;
6150957b409SSimon J. Gerraty 
6160957b409SSimon J. Gerraty 				}
6170957b409SSimon J. Gerraty 				break;
6180957b409SSimon J. Gerraty 			case 31: {
6190957b409SSimon J. Gerraty 				/* set8 */
6200957b409SSimon J. Gerraty 
6210957b409SSimon J. Gerraty 	uint32_t addr = T0_POP();
6220957b409SSimon J. Gerraty 	*((unsigned char *)CTX + addr) = (unsigned char)T0_POP();
6230957b409SSimon J. Gerraty 
6240957b409SSimon J. Gerraty 				}
6250957b409SSimon J. Gerraty 				break;
6260957b409SSimon J. Gerraty 			case 32: {
6270957b409SSimon J. Gerraty 				/* swap */
6280957b409SSimon J. Gerraty  T0_SWAP();
6290957b409SSimon J. Gerraty 				}
6300957b409SSimon J. Gerraty 				break;
6310957b409SSimon J. Gerraty 			case 33: {
6320957b409SSimon J. Gerraty 				/* u>> */
6330957b409SSimon J. Gerraty 
6340957b409SSimon J. Gerraty 	int c = (int)T0_POPi();
6350957b409SSimon J. Gerraty 	uint32_t x = T0_POP();
6360957b409SSimon J. Gerraty 	T0_PUSH(x >> c);
6370957b409SSimon J. Gerraty 
6380957b409SSimon J. Gerraty 				}
6390957b409SSimon J. Gerraty 				break;
6400957b409SSimon J. Gerraty 			}
6410957b409SSimon J. Gerraty 
6420957b409SSimon J. Gerraty 		} else {
6430957b409SSimon J. Gerraty 			T0_ENTER(ip, rp, t0x);
6440957b409SSimon J. Gerraty 		}
6450957b409SSimon J. Gerraty 	}
6460957b409SSimon J. Gerraty t0_exit:
6470957b409SSimon J. Gerraty 	((t0_context *)t0ctx)->dp = dp;
6480957b409SSimon J. Gerraty 	((t0_context *)t0ctx)->rp = rp;
6490957b409SSimon J. Gerraty 	((t0_context *)t0ctx)->ip = ip;
6500957b409SSimon J. Gerraty }
651