1b4d0d230SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
24520c6a4SDavid Howells /* ASN.1 BER/DER/CER parsing state machine internal definitions
34520c6a4SDavid Howells  *
44520c6a4SDavid Howells  * Copyright (C) 2012 Red Hat, Inc. All Rights Reserved.
54520c6a4SDavid Howells  * Written by David Howells (dhowells@redhat.com)
64520c6a4SDavid Howells  */
74520c6a4SDavid Howells 
84520c6a4SDavid Howells #ifndef _LINUX_ASN1_BER_BYTECODE_H
94520c6a4SDavid Howells #define _LINUX_ASN1_BER_BYTECODE_H
104520c6a4SDavid Howells 
114520c6a4SDavid Howells #ifdef __KERNEL__
124520c6a4SDavid Howells #include <linux/types.h>
134520c6a4SDavid Howells #endif
144520c6a4SDavid Howells #include <linux/asn1.h>
154520c6a4SDavid Howells 
164520c6a4SDavid Howells typedef int (*asn1_action_t)(void *context,
174520c6a4SDavid Howells 			     size_t hdrlen, /* In case of ANY type */
184520c6a4SDavid Howells 			     unsigned char tag, /* In case of ANY type */
194520c6a4SDavid Howells 			     const void *value, size_t vlen);
204520c6a4SDavid Howells 
214520c6a4SDavid Howells struct asn1_decoder {
224520c6a4SDavid Howells 	const unsigned char *machine;
234520c6a4SDavid Howells 	size_t machlen;
244520c6a4SDavid Howells 	const asn1_action_t *actions;
254520c6a4SDavid Howells };
264520c6a4SDavid Howells 
274520c6a4SDavid Howells enum asn1_opcode {
284520c6a4SDavid Howells 	/* The tag-matching ops come first and the odd-numbered slots
294520c6a4SDavid Howells 	 * are for OR_SKIP ops.
304520c6a4SDavid Howells 	 */
314520c6a4SDavid Howells #define ASN1_OP_MATCH__SKIP		  0x01
324520c6a4SDavid Howells #define ASN1_OP_MATCH__ACT		  0x02
334520c6a4SDavid Howells #define ASN1_OP_MATCH__JUMP		  0x04
344520c6a4SDavid Howells #define ASN1_OP_MATCH__ANY		  0x08
354520c6a4SDavid Howells #define ASN1_OP_MATCH__COND		  0x10
364520c6a4SDavid Howells 
374520c6a4SDavid Howells 	ASN1_OP_MATCH			= 0x00,
384520c6a4SDavid Howells 	ASN1_OP_MATCH_OR_SKIP		= 0x01,
394520c6a4SDavid Howells 	ASN1_OP_MATCH_ACT		= 0x02,
404520c6a4SDavid Howells 	ASN1_OP_MATCH_ACT_OR_SKIP	= 0x03,
414520c6a4SDavid Howells 	ASN1_OP_MATCH_JUMP		= 0x04,
424520c6a4SDavid Howells 	ASN1_OP_MATCH_JUMP_OR_SKIP	= 0x05,
434520c6a4SDavid Howells 	ASN1_OP_MATCH_ANY		= 0x08,
44233ce79dSDavid Howells 	ASN1_OP_MATCH_ANY_OR_SKIP	= 0x09,
454520c6a4SDavid Howells 	ASN1_OP_MATCH_ANY_ACT		= 0x0a,
46233ce79dSDavid Howells 	ASN1_OP_MATCH_ANY_ACT_OR_SKIP	= 0x0b,
474520c6a4SDavid Howells 	/* Everything before here matches unconditionally */
484520c6a4SDavid Howells 
494520c6a4SDavid Howells 	ASN1_OP_COND_MATCH_OR_SKIP	= 0x11,
504520c6a4SDavid Howells 	ASN1_OP_COND_MATCH_ACT_OR_SKIP	= 0x13,
514520c6a4SDavid Howells 	ASN1_OP_COND_MATCH_JUMP_OR_SKIP	= 0x15,
524520c6a4SDavid Howells 	ASN1_OP_COND_MATCH_ANY		= 0x18,
53233ce79dSDavid Howells 	ASN1_OP_COND_MATCH_ANY_OR_SKIP	= 0x19,
544520c6a4SDavid Howells 	ASN1_OP_COND_MATCH_ANY_ACT	= 0x1a,
55233ce79dSDavid Howells 	ASN1_OP_COND_MATCH_ANY_ACT_OR_SKIP = 0x1b,
564520c6a4SDavid Howells 
574520c6a4SDavid Howells 	/* Everything before here will want a tag from the data */
58233ce79dSDavid Howells #define ASN1_OP__MATCHES_TAG ASN1_OP_COND_MATCH_ANY_ACT_OR_SKIP
594520c6a4SDavid Howells 
604520c6a4SDavid Howells 	/* These are here to help fill up space */
61233ce79dSDavid Howells 	ASN1_OP_COND_FAIL		= 0x1c,
62233ce79dSDavid Howells 	ASN1_OP_COMPLETE		= 0x1d,
63233ce79dSDavid Howells 	ASN1_OP_ACT			= 0x1e,
64233ce79dSDavid Howells 	ASN1_OP_MAYBE_ACT		= 0x1f,
654520c6a4SDavid Howells 
664520c6a4SDavid Howells 	/* The following eight have bit 0 -> SET, 1 -> OF, 2 -> ACT */
674520c6a4SDavid Howells 	ASN1_OP_END_SEQ			= 0x20,
684520c6a4SDavid Howells 	ASN1_OP_END_SET			= 0x21,
694520c6a4SDavid Howells 	ASN1_OP_END_SEQ_OF		= 0x22,
704520c6a4SDavid Howells 	ASN1_OP_END_SET_OF		= 0x23,
714520c6a4SDavid Howells 	ASN1_OP_END_SEQ_ACT		= 0x24,
724520c6a4SDavid Howells 	ASN1_OP_END_SET_ACT		= 0x25,
734520c6a4SDavid Howells 	ASN1_OP_END_SEQ_OF_ACT		= 0x26,
744520c6a4SDavid Howells 	ASN1_OP_END_SET_OF_ACT		= 0x27,
754520c6a4SDavid Howells #define ASN1_OP_END__SET		  0x01
764520c6a4SDavid Howells #define ASN1_OP_END__OF			  0x02
774520c6a4SDavid Howells #define ASN1_OP_END__ACT		  0x04
784520c6a4SDavid Howells 
79233ce79dSDavid Howells 	ASN1_OP_RETURN			= 0x28,
80233ce79dSDavid Howells 
814520c6a4SDavid Howells 	ASN1_OP__NR
824520c6a4SDavid Howells };
834520c6a4SDavid Howells 
844520c6a4SDavid Howells #define _tag(CLASS, CP, TAG) ((ASN1_##CLASS << 6) | (ASN1_##CP << 5) | ASN1_##TAG)
854520c6a4SDavid Howells #define _tagn(CLASS, CP, TAG) ((ASN1_##CLASS << 6) | (ASN1_##CP << 5) | TAG)
864520c6a4SDavid Howells #define _jump_target(N) (N)
874520c6a4SDavid Howells #define _action(N) (N)
884520c6a4SDavid Howells 
894520c6a4SDavid Howells #endif /* _LINUX_ASN1_BER_BYTECODE_H */
90