1 /* ASN.1 BER/DER/CER parsing state machine internal definitions 2 * 3 * Copyright (C) 2012 Red Hat, Inc. All Rights Reserved. 4 * Written by David Howells (dhowells@redhat.com) 5 * 6 * This program is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU General Public Licence 8 * as published by the Free Software Foundation; either version 9 * 2 of the Licence, or (at your option) any later version. 10 */ 11 12 #ifndef _LINUX_ASN1_BER_BYTECODE_H 13 #define _LINUX_ASN1_BER_BYTECODE_H 14 15 #ifdef __KERNEL__ 16 #include <linux/types.h> 17 #endif 18 #include <linux/asn1.h> 19 20 typedef int (*asn1_action_t)(void *context, 21 size_t hdrlen, /* In case of ANY type */ 22 unsigned char tag, /* In case of ANY type */ 23 const void *value, size_t vlen); 24 25 struct asn1_decoder { 26 const unsigned char *machine; 27 size_t machlen; 28 const asn1_action_t *actions; 29 }; 30 31 enum asn1_opcode { 32 /* The tag-matching ops come first and the odd-numbered slots 33 * are for OR_SKIP ops. 34 */ 35 #define ASN1_OP_MATCH__SKIP 0x01 36 #define ASN1_OP_MATCH__ACT 0x02 37 #define ASN1_OP_MATCH__JUMP 0x04 38 #define ASN1_OP_MATCH__ANY 0x08 39 #define ASN1_OP_MATCH__COND 0x10 40 41 ASN1_OP_MATCH = 0x00, 42 ASN1_OP_MATCH_OR_SKIP = 0x01, 43 ASN1_OP_MATCH_ACT = 0x02, 44 ASN1_OP_MATCH_ACT_OR_SKIP = 0x03, 45 ASN1_OP_MATCH_JUMP = 0x04, 46 ASN1_OP_MATCH_JUMP_OR_SKIP = 0x05, 47 ASN1_OP_MATCH_ANY = 0x08, 48 ASN1_OP_MATCH_ANY_ACT = 0x0a, 49 /* Everything before here matches unconditionally */ 50 51 ASN1_OP_COND_MATCH_OR_SKIP = 0x11, 52 ASN1_OP_COND_MATCH_ACT_OR_SKIP = 0x13, 53 ASN1_OP_COND_MATCH_JUMP_OR_SKIP = 0x15, 54 ASN1_OP_COND_MATCH_ANY = 0x18, 55 ASN1_OP_COND_MATCH_ANY_ACT = 0x1a, 56 57 /* Everything before here will want a tag from the data */ 58 #define ASN1_OP__MATCHES_TAG ASN1_OP_COND_MATCH_ANY_ACT 59 60 /* These are here to help fill up space */ 61 ASN1_OP_COND_FAIL = 0x1b, 62 ASN1_OP_COMPLETE = 0x1c, 63 ASN1_OP_ACT = 0x1d, 64 ASN1_OP_RETURN = 0x1e, 65 66 /* The following eight have bit 0 -> SET, 1 -> OF, 2 -> ACT */ 67 ASN1_OP_END_SEQ = 0x20, 68 ASN1_OP_END_SET = 0x21, 69 ASN1_OP_END_SEQ_OF = 0x22, 70 ASN1_OP_END_SET_OF = 0x23, 71 ASN1_OP_END_SEQ_ACT = 0x24, 72 ASN1_OP_END_SET_ACT = 0x25, 73 ASN1_OP_END_SEQ_OF_ACT = 0x26, 74 ASN1_OP_END_SET_OF_ACT = 0x27, 75 #define ASN1_OP_END__SET 0x01 76 #define ASN1_OP_END__OF 0x02 77 #define ASN1_OP_END__ACT 0x04 78 79 ASN1_OP__NR 80 }; 81 82 #define _tag(CLASS, CP, TAG) ((ASN1_##CLASS << 6) | (ASN1_##CP << 5) | ASN1_##TAG) 83 #define _tagn(CLASS, CP, TAG) ((ASN1_##CLASS << 6) | (ASN1_##CP << 5) | TAG) 84 #define _jump_target(N) (N) 85 #define _action(N) (N) 86 87 #endif /* _LINUX_ASN1_BER_BYTECODE_H */ 88