Merge tag 'gpio-v4.20-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw...
[sfrench/cifs-2.6.git] / include / linux / asn1_ber_bytecode.h
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_OR_SKIP       = 0x09,
49         ASN1_OP_MATCH_ANY_ACT           = 0x0a,
50         ASN1_OP_MATCH_ANY_ACT_OR_SKIP   = 0x0b,
51         /* Everything before here matches unconditionally */
52
53         ASN1_OP_COND_MATCH_OR_SKIP      = 0x11,
54         ASN1_OP_COND_MATCH_ACT_OR_SKIP  = 0x13,
55         ASN1_OP_COND_MATCH_JUMP_OR_SKIP = 0x15,
56         ASN1_OP_COND_MATCH_ANY          = 0x18,
57         ASN1_OP_COND_MATCH_ANY_OR_SKIP  = 0x19,
58         ASN1_OP_COND_MATCH_ANY_ACT      = 0x1a,
59         ASN1_OP_COND_MATCH_ANY_ACT_OR_SKIP = 0x1b,
60
61         /* Everything before here will want a tag from the data */
62 #define ASN1_OP__MATCHES_TAG ASN1_OP_COND_MATCH_ANY_ACT_OR_SKIP
63
64         /* These are here to help fill up space */
65         ASN1_OP_COND_FAIL               = 0x1c,
66         ASN1_OP_COMPLETE                = 0x1d,
67         ASN1_OP_ACT                     = 0x1e,
68         ASN1_OP_MAYBE_ACT               = 0x1f,
69
70         /* The following eight have bit 0 -> SET, 1 -> OF, 2 -> ACT */
71         ASN1_OP_END_SEQ                 = 0x20,
72         ASN1_OP_END_SET                 = 0x21,
73         ASN1_OP_END_SEQ_OF              = 0x22,
74         ASN1_OP_END_SET_OF              = 0x23,
75         ASN1_OP_END_SEQ_ACT             = 0x24,
76         ASN1_OP_END_SET_ACT             = 0x25,
77         ASN1_OP_END_SEQ_OF_ACT          = 0x26,
78         ASN1_OP_END_SET_OF_ACT          = 0x27,
79 #define ASN1_OP_END__SET                  0x01
80 #define ASN1_OP_END__OF                   0x02
81 #define ASN1_OP_END__ACT                  0x04
82
83         ASN1_OP_RETURN                  = 0x28,
84
85         ASN1_OP__NR
86 };
87
88 #define _tag(CLASS, CP, TAG) ((ASN1_##CLASS << 6) | (ASN1_##CP << 5) | ASN1_##TAG)
89 #define _tagn(CLASS, CP, TAG) ((ASN1_##CLASS << 6) | (ASN1_##CP << 5) | TAG)
90 #define _jump_target(N) (N)
91 #define _action(N) (N)
92
93 #endif /* _LINUX_ASN1_BER_BYTECODE_H */