Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages


home | help
ASN1(3)			 BSD Library Functions Manual		       ASN1(3)

     asn_get_header, asn_put_header, asn_put_temp_header, asn_commit_header,
     asn_get_integer_raw, asn_get_integer, asn_put_integer,
     asn_get_octetstring_raw, asn_get_octetstring, asn_put_octetstring,
     asn_get_null_raw, asn_get_null, asn_put_null, asn_put_exception,
     asn_get_objid_raw,	asn_get_objid, asn_put_objid, asn_get_sequence,
     asn_get_ipaddress_raw, asn_get_ipaddress, asn_put_ipaddress,
     asn_get_uint32_raw, asn_put_uint32, asn_get_counter64_raw,
     asn_put_counter64,	asn_get_timeticks, asn_put_timeticks, asn_skip,
     asn_slice_oid, asn_append_oid, asn_compare_oid, asn_is_suboid,
     asn_oid2str_r, asn_oid2str	-- ASN.1 library for SNMP

     Begemot SNMP library (libbsnmp, -lbsnmp)

     #include <bsnmp/asn1.h>

     enum asn_err
     asn_get_header(struct asn_buf *buf, u_char	*type, asn_len_t *lenp);

     enum asn_err
     asn_put_header(struct asn_buf *buf, u_char	type, asn_len_t	len);

     enum asn_err
     asn_put_temp_header(struct	asn_buf	*buf, u_char type, u_char **ptr);

     enum asn_err
     asn_commit_header(struct asn_buf *buf, u_char *ptr);

     enum asn_err
     asn_get_integer_raw(struct	asn_buf	*buf, asn_len_t	len, int32_t *res);

     enum asn_err
     asn_get_integer(struct asn_buf *buf, int32_t *res);

     enum asn_err
     asn_put_integer(struct asn_buf *buf, int32_t arg);

     enum asn_err
     asn_get_octetstring_raw(struct asn_buf *buf, asn_len_t len, u_char	*out,
	 u_int *outsize);

     enum asn_err
     asn_get_octetstring(struct	asn_buf	*buf, u_char *out, u_int *outsize);

     enum asn_err
     asn_put_octetstring(struct	asn_buf	*buf, const u_char *str,
	 u_int strsize);

     enum asn_err
     asn_get_null_raw(struct asn_buf *buf, asn_len_t len);

     enum asn_err
     asn_get_null(struct asn_buf *buf);

     enum asn_err
     asn_put_null(struct asn_buf *buf);

     enum asn_err
     asn_put_exception(struct asn_buf *buf, u_int type);

     enum asn_err
     asn_get_objid_raw(struct asn_buf *buf, asn_len_t len,
	 struct	asn_oid	*oid);

     enum asn_err
     asn_get_objid(struct asn_buf *buf,	struct asn_oid *oid);

     enum asn_err
     asn_put_objid(struct asn_buf *buf,	const struct asn_oid *oid);

     enum asn_err
     asn_get_sequence(struct asn_buf *buf, asn_len_t *lenp);

     enum asn_err
     asn_get_ipaddress_raw(struct asn_buf *buf,	asn_len_t len, u_char *ipa);

     enum asn_err
     asn_get_ipaddress(struct asn_buf *buf, u_char *ipa);

     enum asn_err
     asn_put_ipaddress(struct asn_buf *buf, const u_char *ipa);

     enum asn_err
     asn_get_uint32_raw(struct asn_buf *buf, asn_len_t len, u_int32_t *res);

     enum asn_err
     asn_put_uint32(struct asn_buf *buf, u_char	type, u_int32_t	val);

     enum asn_err
     asn_get_counter64_raw(struct asn_buf *buf,	asn_len_t len,
	 u_int64_t *res);

     enum asn_err
     asn_put_counter64(struct asn_buf *buf, u_int64_t val);

     enum asn_err
     asn_get_timeticks(struct asn_buf *buf, u_int32_t *valp);

     enum asn_err
     asn_put_timeticks(struct asn_buf *buf, u_int32_t val);

     enum asn_err
     asn_skip(struct asn_buf *buf, asn_len_t len);

     asn_slice_oid(struct asn_oid *dest, const struct asn_oid *src,
	 u_int from, u_int to);

     asn_append_oid(struct asn_oid *to,	const struct asn_oid *from);

     asn_compare_oid(const struct asn_oid *oid1, const struct asn_oid *oid2);

     asn_is_suboid(const struct	asn_oid	*oid1, const struct asn_oid *oid2);

     char *
     asn_oid2str_r(const struct	asn_oid	*oid, char *buf);

     char *
     asn_oid2str(const struct asn_oid *oid);

     The ASN.1 library contains	routines to handle ASN.1 encoding for SNMP.
     It	supports only the restricted form of ASN.1 as required by SNMP.	 There
     are two basic structures used throughout the library:

	   /* these restrictions are in	the SMI	*/
	   #define ASN_MAXID	   0xffffffff
	   #define ASN_MAXOIDLEN   128

	   /* type of subidentifiers */
	   typedef u_int32_t asn_subid_t;

	   struct asn_oid {
		   u_int   len;
		   asn_subid_t subs[ASN_MAXOIDLEN];

     This structure represents an OID with the restrictions defined in the
     SNMP SMI.	len holds the current length of	the OID	and subs holds the el-
     ements of the OID.

	   struct asn_buf {
		   union {
			   u_char  *ptr;
			   const u_char	*cptr;
		   }	   asn_u;
		   size_t  asn_len;
	   #define asn_cptr	   asn_u.cptr
	   #define asn_ptr asn_u.ptr

     This structure is used to encode and decode ASN.1.	 It describes the out-
     put buffer	for encoding routines and the input buffer for decoding	rou-
     tines.  For encoding asn_len holds	the number of remaining	free octets in
     the buffer.  The first free byte is pointed to by asn_ptr.	 For decoding
     asn_len holds the number of remaining bytes to decode.  The next byte to
     decode is pointed to by asn_cptr.

     Most of the functions return an error code	enum asn_error:

	   enum	asn_err	{
		   /* conversion was ok	*/
		   ASN_ERR_OK	   = 0,
		   /* conversion failed	and stopped */
		   ASN_ERR_FAILED  = 1 | 0x1000,
		   /* length field bad,	value skipped */
		   ASN_ERR_BADLEN  = 2,
		   /* out of buffer, stopped */
		   ASN_ERR_EOBUF   = 3 | 0x1000,
		   /* length ok, but value is out of range */
		   ASN_ERR_RANGE   = 4,
		   /* not the expected tag, stopped */
		   ASN_ERR_TAG	   = 5 | 0x1000,
	   #define ASN_ERR_STOPPED(E) (((E) & 0x1000) != 0)

     If	ASN_ERR_STOPPED() returns true,	the error was fatal and	processing has
     stopped at	the point of error.

     The function asn_get_header() reads the next header from the input	octet
     stream.  It returns the tag in the	variable pointed to by type (note that
     only single byte tags are supported) and the decoded length field in the
     value pointed to by lenp (this is restricted to a unsigned	32-bit value).
     All errors	in this	function are fatal and stop processing.

     The function asn_put_header() writes an ASN.1 header.  type is the	tag to
     write and is restricted to	one byte tags (i.e., tags lesser or equal than
     0x30).  len is the	length of the value and	is restricted to 16-bit.

     The functions asn_put_temp_header() and asn_commit_header() are used to
     write a header when the length of the value is not	known in advance, for
     example, for sequences.  asn_put_temp_header() writes a header with the
     given tag type and	space for the maximum supported	length field and sets
     the pointer pointed to by ptr to the begin	of this	length field.  This
     pointer must then be fed into asn_commit_header() directly	after writing
     the value to the buffer.  The function will compute the length, insert it
     into the right place and shift the	value if the resulting length field is
     shorter than the estimated	one.

     The function asn_get_integer_raw()	is used	to decode a signed integer
     value (32-bit).  It assumes, that the header of the integer has been de-
     coded already.  len is the	length obtained	from the ASN.1 header and the
     integer will be returned in the value pointed to by res.

     The function asn_get_integer() decodes a complete 32-bit signed integer
     including the header.  If the tag is wrong	ASN_ERR_TAG is returned.  The
     function asn_put_integer()	encodes	a 32-bit signed	integer.

     The function asn_get_octetstring_raw() decodes the	value field of an
     ASN.1 octet string.  The length obtained from the header must be fed into
     the len argument and out must point to a buffer to	receive	the octet
     string.  On entry to the function outsize must point to the size of the
     buffer.  On exit outsize will point to the	number of octets decoded (if
     no	error occurs this will be equal	to len ). The function
     asn_get_octetstring() decodes an octetstring including the	header.	 out
     must point	to a buffer to receive the string, outsize must	point to the
     size of the buffer.  On exit of the function outsize will point to	the
     number of octets decoded.	The function asn_put_octetstring() encodes an
     octetstring (including the	header).  str points to	the string to encode
     and strsize is the	length of the string (the string may contain embedded

     The function asn_get_null_raw() decodes a null value.  len	is the length
     obtained from the header and must be 0.  The function asn_get_null() de-
     codes a null including the	header and the function	asn_put_null() encodes
     a null.

     The function asn_put_exception() is used to encode	an SNMPv2 exception.
     The exception type	is type.

     The function asn_get_objid_raw() is used to decode	an OID value.  len
     must be the value length obtained from the	header and oid will receive
     the decoded OID.  The function asn_get_objid() decodes a complete OID
     (including	the header) and	the function asn_put_objid() encodes a com-
     plete OID.

     The function asn_get_sequence() decodes a sequence	header.	 The length of
     the sequence value	will be	stored in the value pointed to by lenp.

     The function asn_get_ipaddress_raw() decodes an IP	address	value.	len is
     the length	from the header	and must be 4.	ipa will receive the decoded
     IP	address	and must point to a buffer of at least four bytes.  The	func-
     tion asn_get_ipaddress() decodes a	complete IP address (including the
     header) and asn_put_ipaddress() encodes an	IP address.

     The function asn_get_uint32_raw() decodes an unsigned 32-bit integer
     value.  len is the	length from the	header and res will get	the decoded
     value.  The function asn_put_uint32() encodes an unsigned 32-bit integer
     value and inserts the tag given in	type into the header.

     The function asn_get_counter64_raw() decodes an unsigned 64-bit integer
     value.  len must be the value length from the header.  The	resulting
     value is stored into the variable pointed to by res.  The function
     asn_put_counter64() encodes a complete unsigned 64-bit value.

     The function asn_get_timeticks() decodes an ASN.1 object of type
     TIMETICKS and the function	asn_put_timeticks() encodes such an object.

     The function asn_skip() can be used to skip len bytes in the input	buf-

     The function asn_slice_oid() splits a part	out from an OID.  It takes all
     the subids	from the OID pointed to	by src starting	with the subid at po-
     sition from (the first subid being	subid 0) up to,	but not	including,
     subid to and generates a new OID in dest.	If to is less or equal to from
     the resulting OID will have a length of zero.

     The function asn_append_oid() appends the OID from	to the OID to given
     that the resulting	OID is not too long.  If the maximum length is ex-
     ceeded the	result is undefined.

     The function asn_compare_oid() compares two oids and returns the values
     -1, 0 or +1 when oid1 is lesser than, equal, or larger than oid2 resp.

     The function asn_is_suboid() returns 1 if oid1 is equal to	the leading
     part of oid2.  It returns 0 otherwise.

     The function asn_oid2str_r() makes	a printable string from	oid.  The buf-
     fer pointed to by str must	be large enough	to hold	the result.  The con-
     stant ASN_OIDSTRLEN is defined to be the length of	the maximum string
     generated by this function	(including the trailing	NUL).  The function
     asn_oid2str() makes a printable string from oid into a private buffer
     that is overwritten by each call.

     When an error occurs in any of the	function the function pointed to by
     the global	pointer

	   extern void (*asn_error)(const struct asn_buf *, const char *, ...);

     is	called with the	current	buffer (this may be NULL) and a	printf(3)
     style format string.  There is a default error handler in the library
     that prints a message starting with `ASN.1:' followed by the error	mes-
     sage and an optional dump of the buffer.

     gensnmptree(1), bsnmpd(1),	bsnmpagent(3), bsnmpclient(3), bsnmplib(3)

     This implementation conforms to the applicable IETF RFCs and ITU-T	recom-

     Hartmut Brandt <>

BSD				October	4, 2005				   BSD


Want to link to this manual page? Use this URL:

home | help