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
33extern "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 */
133uchar_t	*asn_build_sequence(uchar_t *, size_t *, uchar_t, size_t);
134uchar_t	*asn_build_header(uchar_t *, size_t *, uchar_t, size_t);
135uchar_t	*asn_build_length(uchar_t *, size_t *, size_t);
136uchar_t	*asn_build_int(uchar_t *, size_t *, uchar_t, int);
137uchar_t	*asn_build_string(uchar_t *, size_t *, uchar_t, uchar_t *, size_t);
138uchar_t	*asn_build_objid(uchar_t *, size_t *, uchar_t, void *, size_t);
139uchar_t	*asn_build_null(uchar_t *, size_t *, uchar_t);
140
141uchar_t	*asn_parse_sequence(uchar_t *, size_t *, uchar_t);
142uchar_t	*asn_parse_header(uchar_t *, size_t *, uchar_t *);
143uchar_t	*asn_parse_length(uchar_t *, size_t *);
144uchar_t	*asn_parse_int(uchar_t *, size_t *, int *);
145uchar_t *asn_parse_uint(uchar_t *, size_t *, uint_t *);
146uchar_t	*asn_parse_string(uchar_t *, size_t *, uchar_t **, size_t *);
147uchar_t	*asn_parse_objid(uchar_t *, size_t *, void *, size_t *);
148uchar_t	*asn_parse_objval(uchar_t *, size_t *, void *);
149
150#ifdef	__cplusplus
151}
152#endif
153
154#endif	/* _ASN1_H */
155