xref: /illumos-gate/usr/src/cmd/picl/plugins/sun4v/lib/snmp/asn1.h (revision 45ede40b2394db7967e59f19288fae9b62efd4aa)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #ifndef	_ASN1_H
28 #define	_ASN1_H
29 
30 #pragma ident	"%Z%%M%	%I%	%E% SMI"
31 
32 #ifdef	__cplusplus
33 extern "C" {
34 #endif
35 
36 /*
37  * ASN.1 values are encoded as octet strings based on the use of a
38  * Type-Length-Value (TLV) structure. The Type indicates the ASN.1
39  * type, the class of the type, and whether the encoding is primitive
40  * or constructed. The Length indicates the length of the actual value
41  * representation and the Value represents the value as a string
42  * of octets.
43  *
44  *              +------------+--------+----------+
45  *              | Identifier | Length | Contents |
46  *              +------------+--------+----------+
47  *
48  * The encoding of the Identifier field is shown below (for tags less than 31):
49  *
50  *              +-------+-----+------------+
51  *              | Class | P/C | Tag number |
52  *              +-------+-----+------------+
53  *          Bit   7   6    5   4  3  2  1  0
54  *
55  * The class field specifies one of four classes, the P/C bit specifies
56  * whether this is a primitive/constructed encoding and the tag number
57  * distinguishes one data type from another within the class.
58  */
59 
60 /*
61  * Identifier classes
62  */
63 #define	ASN_UNIVERSAL		((uchar_t)0x00)
64 #define	ASN_APPLICATION		((uchar_t)0x40)
65 #define	ASN_CONTEXT		((uchar_t)0x80)
66 #define	ASN_PRIVATE		((uchar_t)0xc0)
67 
68 /*
69  * Encoding type
70  */
71 #define	ASN_PRIMITIVE		((uchar_t)0x00)
72 #define	ASN_CONSTRUCTOR		((uchar_t)0x20)
73 
74 /*
75  * Tag numbers for the Universal class of ASN.1 values
76  */
77 #define	ASN_BOOLEAN		((uchar_t)0x01)
78 #define	ASN_INTEGER		((uchar_t)0x02)
79 #define	ASN_BIT_STR		((uchar_t)0x03)
80 #define	ASN_OCTET_STR		((uchar_t)0x04)
81 #define	ASN_NULL		((uchar_t)0x05)
82 #define	ASN_OBJECT_ID		((uchar_t)0x06)
83 #define	ASN_SEQUENCE		((uchar_t)0x10)
84 #define	ASN_SET			((uchar_t)0x11)
85 
86 /*
87  * ASN Extension Tag in the identifier
88  */
89 #define	ASN_EXT_TAG		((uchar_t)0x1f)
90 
91 /*
92  * Application class ASN.1 identifiers
93  */
94 #define	ASN_COUNTER	(ASN_APPLICATION | ASN_PRIMITIVE | (uchar_t)0x01)
95 #define	ASN_TIMETICKS	(ASN_APPLICATION | ASN_PRIMITIVE | (uchar_t)0x03)
96 
97 /*
98  * The Length field in the TLV structure described above is represented
99  * in many ways depending on the value.
100  *
101  * If the length is less than 128, the length field consists of a
102  * single octet beginning with a zero.
103  *
104  *                        +---+-----------+
105  *                        | 0 | Length(L) |
106  *                        +---+-----------+
107  *
108  * If the length is greater than 127, the first octet of the length field
109  * contains a seven-bit integer that specifies the number of additional
110  * length octets and the additional octets specify the actual length.
111  *
112  *              <-- one octet --><----- K octets ----->
113  *              +---------------+---------------------+
114  *              |  1  |    K    |      Length(L)      |
115  *              +---------------+---------------------+
116  *
117  */
118 #define	ASN_LONG_LEN	((uchar_t)0x80)
119 #define	ASN_BIT8	((uchar_t)0x80)
120 
121 /*
122  * Some parts of the code assumes a few things -- big-endian ordering,
123  * sizeof int, etc. to simplify things.
124  */
125 #define	BUILD_INT_SHIFT	23
126 #define	BUILD_INT_MASK	0x1ff
127 
128 /*
129  * Exported ASN.1 encoding related interfaces (only exported within
130  * snmplib, we need to do ld versioning to limit the scope of these to
131  * within snmplib).
132  */
133 uchar_t	*asn_build_sequence(uchar_t *, size_t *, uchar_t, size_t);
134 uchar_t	*asn_build_header(uchar_t *, size_t *, uchar_t, size_t);
135 uchar_t	*asn_build_length(uchar_t *, size_t *, size_t);
136 uchar_t	*asn_build_int(uchar_t *, size_t *, uchar_t, int);
137 uchar_t	*asn_build_string(uchar_t *, size_t *, uchar_t, uchar_t *, size_t);
138 uchar_t	*asn_build_objid(uchar_t *, size_t *, uchar_t, void *, size_t);
139 uchar_t	*asn_build_null(uchar_t *, size_t *, uchar_t);
140 
141 uchar_t	*asn_parse_sequence(uchar_t *, size_t *, uchar_t);
142 uchar_t	*asn_parse_header(uchar_t *, size_t *, uchar_t *);
143 uchar_t	*asn_parse_length(uchar_t *, size_t *);
144 uchar_t	*asn_parse_int(uchar_t *, size_t *, int *);
145 uchar_t *asn_parse_uint(uchar_t *, size_t *, uint_t *);
146 uchar_t	*asn_parse_string(uchar_t *, size_t *, uchar_t **, size_t *);
147 uchar_t	*asn_parse_objid(uchar_t *, size_t *, void *, size_t *);
148 uchar_t	*asn_parse_objval(uchar_t *, size_t *, void *);
149 
150 #ifdef	__cplusplus
151 }
152 #endif
153 
154 #endif	/* _ASN1_H */
155