xref: /freebsd/contrib/bsnmp/lib/snmp.h (revision cbd30a72ca196976c1c700400ecd424baa1b9c16)
1 /*
2  * Copyright (c) 2001-2003
3  *	Fraunhofer Institute for Open Communication Systems (FhG Fokus).
4  *	All rights reserved.
5  *
6  * Author: Harti Brandt <harti@freebsd.org>
7  *
8  * Copyright (c) 2010 The FreeBSD Foundation
9  * All rights reserved.
10  *
11  * Portions of this software were developed by Shteryana Sotirova Shopova
12  * under sponsorship from the FreeBSD Foundation.
13  *
14  *
15  * Redistribution and use in source and binary forms, with or without
16  * modification, are permitted provided that the following conditions
17  * are met:
18  * 1. Redistributions of source code must retain the above copyright
19  *    notice, this list of conditions and the following disclaimer.
20  * 2. Redistributions in binary form must reproduce the above copyright
21  *    notice, this list of conditions and the following disclaimer in the
22  *    documentation and/or other materials provided with the distribution.
23  *
24  * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
25  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27  * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
28  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34  * SUCH DAMAGE.
35  *
36  * $Begemot: bsnmp/lib/snmp.h,v 1.30 2004/08/06 08:46:54 brandt Exp $
37  *
38  * Header file for SNMP functions.
39  */
40 #ifndef snmp_h_
41 #define snmp_h_
42 
43 #include <sys/types.h>
44 
45 #define SNMP_COMMUNITY_MAXLEN		128
46 #define SNMP_MAX_BINDINGS		100
47 #define	SNMP_CONTEXT_NAME_SIZ		(32 + 1)
48 #define	SNMP_ENGINE_ID_SIZ		32
49 #define	SNMP_TIME_WINDOW		150
50 
51 enum snmp_syntax {
52 	SNMP_SYNTAX_NULL	= 0,
53 	SNMP_SYNTAX_INTEGER,		/* == INTEGER32 */
54 	SNMP_SYNTAX_OCTETSTRING,
55 	SNMP_SYNTAX_OID,
56 	SNMP_SYNTAX_IPADDRESS,
57 	SNMP_SYNTAX_COUNTER,
58 	SNMP_SYNTAX_GAUGE,		/* == UNSIGNED32 */
59 	SNMP_SYNTAX_TIMETICKS,
60 
61 	/* v2 additions */
62 	SNMP_SYNTAX_COUNTER64,
63 	SNMP_SYNTAX_NOSUCHOBJECT,	/* exception */
64 	SNMP_SYNTAX_NOSUCHINSTANCE,	/* exception */
65 	SNMP_SYNTAX_ENDOFMIBVIEW,	/* exception */
66 };
67 
68 struct snmp_value {
69 	struct asn_oid		var;
70 	enum snmp_syntax	syntax;
71 	union snmp_values {
72 	  int32_t		integer;	/* also integer32 */
73 	  struct {
74 	    u_int		len;
75 	    u_char		*octets;
76 	  }			octetstring;
77 	  struct asn_oid	oid;
78 	  u_char		ipaddress[4];
79 	  uint32_t		uint32;		/* also gauge32, counter32,
80 						   unsigned32, timeticks */
81 	  uint64_t		counter64;
82 	}			v;
83 };
84 
85 enum snmp_version {
86 	SNMP_Verr = 0,
87 	SNMP_V1 = 1,
88 	SNMP_V2c = 2,
89 	SNMP_V3,
90 };
91 
92 #define	SNMP_MPM_SNMP_V1		0
93 #define	SNMP_MPM_SNMP_V2c		1
94 #define	SNMP_MPM_SNMP_V3		3
95 
96 #define	SNMP_ADM_STR32_SIZ		(32 + 1)
97 #define	SNMP_AUTH_KEY_SIZ		40
98 #define	SNMP_PRIV_KEY_SIZ		32
99 #define	SNMP_USM_AUTH_SIZE		12
100 #define	SNMP_USM_PRIV_SIZE		8
101 #define	SNMP_AUTH_HMACMD5_KEY_SIZ	16
102 #define	SNMP_AUTH_HMACSHA_KEY_SIZ	20
103 #define	SNMP_PRIV_AES_KEY_SIZ		16
104 #define	SNMP_PRIV_DES_KEY_SIZ		8
105 
106 
107 enum snmp_secmodel {
108 	SNMP_SECMODEL_ANY = 0,
109 	SNMP_SECMODEL_SNMPv1 = 1,
110 	SNMP_SECMODEL_SNMPv2c = 2,
111 	SNMP_SECMODEL_USM = 3,
112 	SNMP_SECMODEL_UNKNOWN
113 };
114 
115 enum snmp_usm_level {
116 	SNMP_noAuthNoPriv = 1,
117 	SNMP_authNoPriv = 2,
118 	SNMP_authPriv = 3
119 };
120 
121 enum snmp_authentication {
122 	SNMP_AUTH_NOAUTH = 0,
123 	SNMP_AUTH_HMAC_MD5,
124 	SNMP_AUTH_HMAC_SHA
125 };
126 
127 enum snmp_privacy {
128 	SNMP_PRIV_NOPRIV = 0,
129 	SNMP_PRIV_DES = 1,
130 	SNMP_PRIV_AES
131 };
132 
133 struct snmp_engine {
134 	uint8_t			engine_id[SNMP_ENGINE_ID_SIZ];
135 	uint32_t		engine_len;
136 	int32_t			engine_boots;
137 	int32_t			engine_time;
138 	int32_t			max_msg_size;
139 };
140 
141 struct snmp_user {
142 	char				sec_name[SNMP_ADM_STR32_SIZ];
143 	enum snmp_authentication	auth_proto;
144 	enum snmp_privacy		priv_proto;
145 	uint8_t				auth_key[SNMP_AUTH_KEY_SIZ];
146 	uint8_t				priv_key[SNMP_PRIV_KEY_SIZ];
147 };
148 
149 struct snmp_pdu {
150 	char			community[SNMP_COMMUNITY_MAXLEN + 1];
151 	enum snmp_version	version;
152 	u_int			type;
153 
154 	/* SNMPv3 PDU header fields */
155 	int32_t			identifier;
156 	uint8_t			flags;
157 	int32_t			security_model;
158 	struct snmp_engine	engine;
159 
160 	/* Associated USM user parameters */
161 	struct snmp_user	user;
162 	uint8_t			msg_digest[SNMP_USM_AUTH_SIZE];
163 	uint8_t			msg_salt[SNMP_USM_PRIV_SIZE];
164 
165 	/*  View-based Access Model */
166 	/* XXX: put in separate structure - conflicts with struct snmp_context */
167 	uint32_t		context_engine_len;
168 	uint8_t			context_engine[SNMP_ENGINE_ID_SIZ];
169 	char			context_name[SNMP_CONTEXT_NAME_SIZ];
170 
171 	/* trap only */
172 	struct asn_oid		enterprise;
173 	u_char			agent_addr[4];
174 	int32_t			generic_trap;
175 	int32_t			specific_trap;
176 	uint32_t		time_stamp;
177 
178 	/* others */
179 	int32_t			request_id;
180 	int32_t			error_status;
181 	int32_t			error_index;
182 
183 	/* fixes for encoding */
184 	size_t			outer_len;
185 	asn_len_t		scoped_len;
186 	u_char			*outer_ptr;
187 	u_char			*digest_ptr;
188 	u_char			*encrypted_ptr;
189 	u_char			*scoped_ptr;
190 	u_char			*pdu_ptr;
191 	u_char			*vars_ptr;
192 
193 
194 	struct snmp_value	bindings[SNMP_MAX_BINDINGS];
195 	u_int			nbindings;
196 };
197 #define snmp_v1_pdu snmp_pdu
198 
199 #define SNMP_PDU_GET		0
200 #define SNMP_PDU_GETNEXT	1
201 #define SNMP_PDU_RESPONSE	2
202 #define SNMP_PDU_SET		3
203 #define SNMP_PDU_TRAP		4	/* v1 */
204 #define SNMP_PDU_GETBULK	5	/* v2 */
205 #define SNMP_PDU_INFORM		6	/* v2 */
206 #define SNMP_PDU_TRAP2		7	/* v2 */
207 #define SNMP_PDU_REPORT		8	/* v2 */
208 
209 #define SNMP_ERR_NOERROR	0
210 #define SNMP_ERR_TOOBIG		1
211 #define SNMP_ERR_NOSUCHNAME	2	/* v1 */
212 #define SNMP_ERR_BADVALUE	3	/* v1 */
213 #define SNMP_ERR_READONLY	4	/* v1 */
214 #define SNMP_ERR_GENERR		5
215 #define SNMP_ERR_NO_ACCESS	6	/* v2 */
216 #define SNMP_ERR_WRONG_TYPE	7	/* v2 */
217 #define SNMP_ERR_WRONG_LENGTH	8	/* v2 */
218 #define SNMP_ERR_WRONG_ENCODING	9	/* v2 */
219 #define SNMP_ERR_WRONG_VALUE	10	/* v2 */
220 #define SNMP_ERR_NO_CREATION	11	/* v2 */
221 #define SNMP_ERR_INCONS_VALUE	12	/* v2 */
222 #define SNMP_ERR_RES_UNAVAIL	13	/* v2 */
223 #define SNMP_ERR_COMMIT_FAILED	14	/* v2 */
224 #define SNMP_ERR_UNDO_FAILED	15	/* v2 */
225 #define SNMP_ERR_AUTH_ERR	16	/* v2 */
226 #define SNMP_ERR_NOT_WRITEABLE	17	/* v2 */
227 #define SNMP_ERR_INCONS_NAME	18	/* v2 */
228 
229 #define SNMP_TRAP_COLDSTART	0
230 #define SNMP_TRAP_WARMSTART	1
231 #define SNMP_TRAP_LINKDOWN	2
232 #define SNMP_TRAP_LINKUP	3
233 #define SNMP_TRAP_AUTHENTICATION_FAILURE	4
234 #define SNMP_TRAP_EGP_NEIGHBOR_LOSS	5
235 #define SNMP_TRAP_ENTERPRISE	6
236 
237 enum snmp_code {
238 	SNMP_CODE_OK = 0,
239 	SNMP_CODE_FAILED,
240 	SNMP_CODE_BADVERS,
241 	SNMP_CODE_BADLEN,
242 	SNMP_CODE_BADENC,
243 	SNMP_CODE_OORANGE,
244 	SNMP_CODE_BADSECLEVEL,
245 	SNMP_CODE_NOTINTIME,
246 	SNMP_CODE_BADUSER,
247 	SNMP_CODE_BADENGINE,
248 	SNMP_CODE_BADDIGEST,
249 	SNMP_CODE_EDECRYPT
250 };
251 
252 #define	SNMP_MSG_AUTH_FLAG		0x1
253 #define	SNMP_MSG_PRIV_FLAG		0x2
254 #define	SNMP_MSG_REPORT_FLAG		0x4
255 #define	SNMP_MSG_AUTODISCOVER		0x80
256 
257 void snmp_value_free(struct snmp_value *);
258 int snmp_value_parse(const char *, enum snmp_syntax, union snmp_values *);
259 int snmp_value_copy(struct snmp_value *, const struct snmp_value *);
260 
261 void snmp_pdu_free(struct snmp_pdu *);
262 void snmp_pdu_init_secparams(struct snmp_pdu *);
263 enum snmp_code snmp_pdu_decode(struct asn_buf *b, struct snmp_pdu *pdu, int32_t *);
264 enum snmp_code snmp_pdu_decode_header(struct asn_buf *, struct snmp_pdu *);
265 enum snmp_code snmp_pdu_decode_scoped(struct asn_buf *, struct snmp_pdu *, int32_t *);
266 enum snmp_code snmp_pdu_encode(struct snmp_pdu *, struct asn_buf *);
267 enum snmp_code snmp_pdu_decode_secmode(struct asn_buf *, struct snmp_pdu *);
268 
269 int snmp_pdu_snoop(const struct asn_buf *);
270 
271 void snmp_pdu_dump(const struct snmp_pdu *pdu);
272 
273 enum snmp_code snmp_passwd_to_keys(struct snmp_user *, char *);
274 enum snmp_code snmp_get_local_keys(struct snmp_user *, uint8_t *, uint32_t);
275 enum snmp_code snmp_calc_keychange(struct snmp_user *, uint8_t *);
276 
277 extern void (*snmp_error)(const char *, ...);
278 extern void (*snmp_printf)(const char *, ...);
279 
280 #define TRUTH_MK(F) ((F) ? 1 : 2)
281 #define TRUTH_GET(T) (((T) == 1) ? 1 : 0)
282 #define TRUTH_OK(T)  ((T) == 1 || (T) == 2)
283 
284 #endif
285