1122394Sharti/*
2122394Sharti * Copyright (c) 2001-2003
3122394Sharti *	Fraunhofer Institute for Open Communication Systems (FhG Fokus).
4122394Sharti *	All rights reserved.
5122394Sharti *
6122394Sharti * Author: Harti Brandt <harti@freebsd.org>
7310903Sngie *
8216294Ssyrinx * Copyright (c) 2010 The FreeBSD Foundation
9216294Ssyrinx * All rights reserved.
10216294Ssyrinx *
11216294Ssyrinx * Portions of this software were developed by Shteryana Sotirova Shopova
12216294Ssyrinx * under sponsorship from the FreeBSD Foundation.
13216294Ssyrinx *
14310903Sngie *
15133211Sharti * Redistribution and use in source and binary forms, with or without
16133211Sharti * modification, are permitted provided that the following conditions
17133211Sharti * are met:
18133211Sharti * 1. Redistributions of source code must retain the above copyright
19133211Sharti *    notice, this list of conditions and the following disclaimer.
20122394Sharti * 2. Redistributions in binary form must reproduce the above copyright
21122394Sharti *    notice, this list of conditions and the following disclaimer in the
22122394Sharti *    documentation and/or other materials provided with the distribution.
23310903Sngie *
24133211Sharti * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
25133211Sharti * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26133211Sharti * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27133211Sharti * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
28133211Sharti * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29133211Sharti * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30133211Sharti * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31133211Sharti * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32133211Sharti * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33133211Sharti * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34133211Sharti * SUCH DAMAGE.
35122394Sharti *
36133211Sharti * $Begemot: bsnmp/lib/snmp.h,v 1.30 2004/08/06 08:46:54 brandt Exp $
37122394Sharti *
38122394Sharti * Header file for SNMP functions.
39122394Sharti */
40122394Sharti#ifndef snmp_h_
41122394Sharti#define snmp_h_
42122394Sharti
43122394Sharti#include <sys/types.h>
44122394Sharti
45216294Ssyrinx#define SNMP_COMMUNITY_MAXLEN		128
46216294Ssyrinx#define SNMP_MAX_BINDINGS		100
47216294Ssyrinx#define	SNMP_CONTEXT_NAME_SIZ		(32 + 1)
48216294Ssyrinx#define	SNMP_ENGINE_ID_SIZ		32
49216294Ssyrinx#define	SNMP_TIME_WINDOW		150
50122394Sharti
51122394Shartienum snmp_syntax {
52122394Sharti	SNMP_SYNTAX_NULL	= 0,
53122394Sharti	SNMP_SYNTAX_INTEGER,		/* == INTEGER32 */
54122394Sharti	SNMP_SYNTAX_OCTETSTRING,
55122394Sharti	SNMP_SYNTAX_OID,
56122394Sharti	SNMP_SYNTAX_IPADDRESS,
57122394Sharti	SNMP_SYNTAX_COUNTER,
58122394Sharti	SNMP_SYNTAX_GAUGE,		/* == UNSIGNED32 */
59122394Sharti	SNMP_SYNTAX_TIMETICKS,
60122394Sharti
61122394Sharti	/* v2 additions */
62122394Sharti	SNMP_SYNTAX_COUNTER64,
63122394Sharti	SNMP_SYNTAX_NOSUCHOBJECT,	/* exception */
64122394Sharti	SNMP_SYNTAX_NOSUCHINSTANCE,	/* exception */
65122394Sharti	SNMP_SYNTAX_ENDOFMIBVIEW,	/* exception */
66122394Sharti};
67122394Sharti
68122394Shartistruct snmp_value {
69122394Sharti	struct asn_oid		var;
70122394Sharti	enum snmp_syntax	syntax;
71122394Sharti	union snmp_values {
72122394Sharti	  int32_t		integer;	/* also integer32 */
73122394Sharti	  struct {
74122394Sharti	    u_int		len;
75122394Sharti	    u_char		*octets;
76122394Sharti	  }			octetstring;
77122394Sharti	  struct asn_oid	oid;
78122394Sharti	  u_char		ipaddress[4];
79133211Sharti	  uint32_t		uint32;		/* also gauge32, counter32,
80122394Sharti						   unsigned32, timeticks */
81133211Sharti	  uint64_t		counter64;
82122394Sharti	}			v;
83122394Sharti};
84122394Sharti
85122394Shartienum snmp_version {
86122394Sharti	SNMP_Verr = 0,
87122394Sharti	SNMP_V1 = 1,
88216294Ssyrinx	SNMP_V2c = 2,
89216294Ssyrinx	SNMP_V3,
90122394Sharti};
91122394Sharti
92216594Ssyrinx#define	SNMP_MPM_SNMP_V1		0
93216594Ssyrinx#define	SNMP_MPM_SNMP_V2c		1
94216594Ssyrinx#define	SNMP_MPM_SNMP_V3		3
95216594Ssyrinx
96216294Ssyrinx#define	SNMP_ADM_STR32_SIZ		(32 + 1)
97216294Ssyrinx#define	SNMP_AUTH_KEY_SIZ		40
98216294Ssyrinx#define	SNMP_PRIV_KEY_SIZ		32
99216294Ssyrinx#define	SNMP_USM_AUTH_SIZE		12
100216294Ssyrinx#define	SNMP_USM_PRIV_SIZE		8
101216294Ssyrinx#define	SNMP_AUTH_HMACMD5_KEY_SIZ	16
102216294Ssyrinx#define	SNMP_AUTH_HMACSHA_KEY_SIZ	20
103216294Ssyrinx#define	SNMP_PRIV_AES_KEY_SIZ		16
104216294Ssyrinx#define	SNMP_PRIV_DES_KEY_SIZ		8
105216294Ssyrinx
106216294Ssyrinx
107216294Ssyrinxenum snmp_secmodel {
108216294Ssyrinx	SNMP_SECMODEL_ANY = 0,
109216294Ssyrinx	SNMP_SECMODEL_SNMPv1 = 1,
110216294Ssyrinx	SNMP_SECMODEL_SNMPv2c = 2,
111216294Ssyrinx	SNMP_SECMODEL_USM = 3,
112216294Ssyrinx	SNMP_SECMODEL_UNKNOWN
113216294Ssyrinx};
114216294Ssyrinx
115216294Ssyrinxenum snmp_usm_level {
116216294Ssyrinx	SNMP_noAuthNoPriv = 1,
117216294Ssyrinx	SNMP_authNoPriv = 2,
118216294Ssyrinx	SNMP_authPriv = 3
119216294Ssyrinx};
120216294Ssyrinx
121216294Ssyrinxenum snmp_authentication {
122216294Ssyrinx	SNMP_AUTH_NOAUTH = 0,
123216294Ssyrinx	SNMP_AUTH_HMAC_MD5,
124216294Ssyrinx	SNMP_AUTH_HMAC_SHA
125216294Ssyrinx};
126216294Ssyrinx
127216294Ssyrinxenum snmp_privacy {
128216294Ssyrinx	SNMP_PRIV_NOPRIV = 0,
129216294Ssyrinx	SNMP_PRIV_DES = 1,
130216294Ssyrinx	SNMP_PRIV_AES
131216294Ssyrinx};
132216294Ssyrinx
133216294Ssyrinxstruct snmp_engine {
134216294Ssyrinx	uint8_t			engine_id[SNMP_ENGINE_ID_SIZ];
135216294Ssyrinx	uint32_t		engine_len;
136216294Ssyrinx	int32_t			engine_boots;
137216294Ssyrinx	int32_t			engine_time;
138216294Ssyrinx	int32_t			max_msg_size;
139216294Ssyrinx};
140216294Ssyrinx
141216294Ssyrinxstruct snmp_user {
142216294Ssyrinx	char				sec_name[SNMP_ADM_STR32_SIZ];
143216294Ssyrinx	enum snmp_authentication	auth_proto;
144216294Ssyrinx	enum snmp_privacy		priv_proto;
145216294Ssyrinx	uint8_t				auth_key[SNMP_AUTH_KEY_SIZ];
146216294Ssyrinx	uint8_t				priv_key[SNMP_PRIV_KEY_SIZ];
147216294Ssyrinx};
148216294Ssyrinx
149122394Shartistruct snmp_pdu {
150216294Ssyrinx	char			community[SNMP_COMMUNITY_MAXLEN + 1];
151216294Ssyrinx	enum snmp_version	version;
152216294Ssyrinx	u_int			type;
153122394Sharti
154216294Ssyrinx	/* SNMPv3 PDU header fields */
155216294Ssyrinx	int32_t			identifier;
156216294Ssyrinx	uint8_t			flags;
157216294Ssyrinx	int32_t			security_model;
158216294Ssyrinx	struct snmp_engine	engine;
159216294Ssyrinx
160216294Ssyrinx	/* Associated USM user parameters */
161216294Ssyrinx	struct snmp_user	user;
162216294Ssyrinx	uint8_t			msg_digest[SNMP_USM_AUTH_SIZE];
163216294Ssyrinx	uint8_t			msg_salt[SNMP_USM_PRIV_SIZE];
164216294Ssyrinx
165216294Ssyrinx	/*  View-based Access Model */
166216294Ssyrinx	/* XXX: put in separate structure - conflicts with struct snmp_context */
167216294Ssyrinx	uint32_t		context_engine_len;
168216294Ssyrinx	uint8_t			context_engine[SNMP_ENGINE_ID_SIZ];
169216294Ssyrinx	char			context_name[SNMP_CONTEXT_NAME_SIZ];
170216294Ssyrinx
171122394Sharti	/* trap only */
172216294Ssyrinx	struct asn_oid		enterprise;
173216294Ssyrinx	u_char			agent_addr[4];
174216294Ssyrinx	int32_t			generic_trap;
175216294Ssyrinx	int32_t			specific_trap;
176216294Ssyrinx	uint32_t		time_stamp;
177122394Sharti
178122394Sharti	/* others */
179216294Ssyrinx	int32_t			request_id;
180216294Ssyrinx	int32_t			error_status;
181216294Ssyrinx	int32_t			error_index;
182122394Sharti
183122394Sharti	/* fixes for encoding */
184216294Ssyrinx	size_t			outer_len;
185301661Sngie	asn_len_t		scoped_len;
186216294Ssyrinx	u_char			*outer_ptr;
187216294Ssyrinx	u_char			*digest_ptr;
188216294Ssyrinx	u_char			*encrypted_ptr;
189216294Ssyrinx	u_char			*scoped_ptr;
190216294Ssyrinx	u_char			*pdu_ptr;
191216294Ssyrinx	u_char			*vars_ptr;
192122394Sharti
193216294Ssyrinx
194216294Ssyrinx	struct snmp_value	bindings[SNMP_MAX_BINDINGS];
195216294Ssyrinx	u_int			nbindings;
196122394Sharti};
197122394Sharti#define snmp_v1_pdu snmp_pdu
198122394Sharti
199122394Sharti#define SNMP_PDU_GET		0
200122394Sharti#define SNMP_PDU_GETNEXT	1
201122394Sharti#define SNMP_PDU_RESPONSE	2
202122394Sharti#define SNMP_PDU_SET		3
203122394Sharti#define SNMP_PDU_TRAP		4	/* v1 */
204122394Sharti#define SNMP_PDU_GETBULK	5	/* v2 */
205122394Sharti#define SNMP_PDU_INFORM		6	/* v2 */
206122394Sharti#define SNMP_PDU_TRAP2		7	/* v2 */
207122394Sharti#define SNMP_PDU_REPORT		8	/* v2 */
208122394Sharti
209122394Sharti#define SNMP_ERR_NOERROR	0
210122394Sharti#define SNMP_ERR_TOOBIG		1
211122394Sharti#define SNMP_ERR_NOSUCHNAME	2	/* v1 */
212122394Sharti#define SNMP_ERR_BADVALUE	3	/* v1 */
213122394Sharti#define SNMP_ERR_READONLY	4	/* v1 */
214122394Sharti#define SNMP_ERR_GENERR		5
215122394Sharti#define SNMP_ERR_NO_ACCESS	6	/* v2 */
216122394Sharti#define SNMP_ERR_WRONG_TYPE	7	/* v2 */
217122394Sharti#define SNMP_ERR_WRONG_LENGTH	8	/* v2 */
218122394Sharti#define SNMP_ERR_WRONG_ENCODING	9	/* v2 */
219122394Sharti#define SNMP_ERR_WRONG_VALUE	10	/* v2 */
220122394Sharti#define SNMP_ERR_NO_CREATION	11	/* v2 */
221122394Sharti#define SNMP_ERR_INCONS_VALUE	12	/* v2 */
222122394Sharti#define SNMP_ERR_RES_UNAVAIL	13	/* v2 */
223122394Sharti#define SNMP_ERR_COMMIT_FAILED	14	/* v2 */
224122394Sharti#define SNMP_ERR_UNDO_FAILED	15	/* v2 */
225122394Sharti#define SNMP_ERR_AUTH_ERR	16	/* v2 */
226122394Sharti#define SNMP_ERR_NOT_WRITEABLE	17	/* v2 */
227122394Sharti#define SNMP_ERR_INCONS_NAME	18	/* v2 */
228122394Sharti
229122394Sharti#define SNMP_TRAP_COLDSTART	0
230122394Sharti#define SNMP_TRAP_WARMSTART	1
231122394Sharti#define SNMP_TRAP_LINKDOWN	2
232122394Sharti#define SNMP_TRAP_LINKUP	3
233122394Sharti#define SNMP_TRAP_AUTHENTICATION_FAILURE	4
234122394Sharti#define SNMP_TRAP_EGP_NEIGHBOR_LOSS	5
235122394Sharti#define SNMP_TRAP_ENTERPRISE	6
236122394Sharti
237122394Shartienum snmp_code {
238122394Sharti	SNMP_CODE_OK = 0,
239122394Sharti	SNMP_CODE_FAILED,
240122394Sharti	SNMP_CODE_BADVERS,
241122394Sharti	SNMP_CODE_BADLEN,
242122394Sharti	SNMP_CODE_BADENC,
243122394Sharti	SNMP_CODE_OORANGE,
244216294Ssyrinx	SNMP_CODE_BADSECLEVEL,
245216294Ssyrinx	SNMP_CODE_NOTINTIME,
246216294Ssyrinx	SNMP_CODE_BADUSER,
247216294Ssyrinx	SNMP_CODE_BADENGINE,
248216294Ssyrinx	SNMP_CODE_BADDIGEST,
249216294Ssyrinx	SNMP_CODE_EDECRYPT
250122394Sharti};
251122394Sharti
252216294Ssyrinx#define	SNMP_MSG_AUTH_FLAG		0x1
253216294Ssyrinx#define	SNMP_MSG_PRIV_FLAG		0x2
254216294Ssyrinx#define	SNMP_MSG_REPORT_FLAG		0x4
255216294Ssyrinx#define	SNMP_MSG_AUTODISCOVER		0x80
256216294Ssyrinx
257122394Shartivoid snmp_value_free(struct snmp_value *);
258122394Shartiint snmp_value_parse(const char *, enum snmp_syntax, union snmp_values *);
259122394Shartiint snmp_value_copy(struct snmp_value *, const struct snmp_value *);
260122394Sharti
261122394Shartivoid snmp_pdu_free(struct snmp_pdu *);
262216594Ssyrinxvoid snmp_pdu_init_secparams(struct snmp_pdu *);
263122394Shartienum snmp_code snmp_pdu_decode(struct asn_buf *b, struct snmp_pdu *pdu, int32_t *);
264216294Ssyrinxenum snmp_code snmp_pdu_decode_header(struct asn_buf *, struct snmp_pdu *);
265216294Ssyrinxenum snmp_code snmp_pdu_decode_scoped(struct asn_buf *, struct snmp_pdu *, int32_t *);
266216294Ssyrinxenum snmp_code snmp_pdu_encode(struct snmp_pdu *, struct asn_buf *);
267216294Ssyrinxenum snmp_code snmp_pdu_decode_secmode(struct asn_buf *, struct snmp_pdu *);
268122394Sharti
269124861Shartiint snmp_pdu_snoop(const struct asn_buf *);
270124861Sharti
271122394Shartivoid snmp_pdu_dump(const struct snmp_pdu *pdu);
272122394Sharti
273216294Ssyrinxenum snmp_code snmp_passwd_to_keys(struct snmp_user *, char *);
274216294Ssyrinxenum snmp_code snmp_get_local_keys(struct snmp_user *, uint8_t *, uint32_t);
275216294Ssyrinxenum snmp_code snmp_calc_keychange(struct snmp_user *, uint8_t *);
276216294Ssyrinx
277122394Shartiextern void (*snmp_error)(const char *, ...);
278122394Shartiextern void (*snmp_printf)(const char *, ...);
279122394Sharti
280122394Sharti#define TRUTH_MK(F) ((F) ? 1 : 2)
281122394Sharti#define TRUTH_GET(T) (((T) == 1) ? 1 : 0)
282122394Sharti#define TRUTH_OK(T)  ((T) == 1 || (T) == 2)
283122394Sharti
284122394Sharti#endif
285