diff options
author | Hideki Yamane <henrich@debian.org> | 2014-03-30 19:38:48 +0900 |
---|---|---|
committer | Hideki Yamane <henrich@debian.org> | 2014-03-30 19:38:48 +0900 |
commit | 7769a9595c3da9a35f31b42451b1f6c3ed4004fa (patch) | |
tree | 009bf8fd68af6bb1129e07dd8c1ed205010d81f8 /snmplib/snmp_auth.c | |
parent | 2e7891b0311204e0ecd5dc4a4334df01f3a6a1b4 (diff) | |
download | pkg-net-snmp-7769a9595c3da9a35f31b42451b1f6c3ed4004fa.tar.gz |
Imported Upstream version 5.7.2~dfsg
Diffstat (limited to 'snmplib/snmp_auth.c')
-rw-r--r-- | snmplib/snmp_auth.c | 240 |
1 files changed, 240 insertions, 0 deletions
diff --git a/snmplib/snmp_auth.c b/snmplib/snmp_auth.c new file mode 100644 index 0000000..4b408f1 --- /dev/null +++ b/snmplib/snmp_auth.c @@ -0,0 +1,240 @@ +/* + * snmp_auth.c + * + * Community name parse/build routines. + */ +/********************************************************************** + Copyright 1988, 1989, 1991, 1992 by Carnegie Mellon University + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of CMU not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +CMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +CMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. +******************************************************************/ + +#include <net-snmp/net-snmp-config.h> + +#ifdef KINETICS +#include "gw.h" +#include "fp4/cmdmacro.h" +#endif + +#include <stdio.h> +#if HAVE_STDLIB_H +#include <stdlib.h> +#endif +#if HAVE_STRING_H +#include <string.h> +#else +#include <strings.h> +#endif +#include <sys/types.h> +#if TIME_WITH_SYS_TIME +# include <sys/time.h> +# include <time.h> +#else +# if HAVE_SYS_TIME_H +# include <sys/time.h> +# else +# include <time.h> +# endif +#endif +#if HAVE_SYS_SELECT_H +#include <sys/select.h> +#endif +#if HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif +#if HAVE_ARPA_INET_H +#include <arpa/inet.h> +#endif + +#if HAVE_UNISTD_H +#include <unistd.h> +#endif +#if HAVE_DMALLOC_H +#include <dmalloc.h> +#endif + +#ifdef vms +#include <in.h> +#endif + +#include <net-snmp/types.h> +#include <net-snmp/output_api.h> +#include <net-snmp/utilities.h> + +#include <net-snmp/library/asn1.h> +#include <net-snmp/library/snmp_api.h> +#include <net-snmp/library/mib.h> +#include <net-snmp/library/md5.h> +#include <net-snmp/library/scapi.h> + +/* + * Globals. + */ + +#if !defined(NETSNMP_DISABLE_SNMPV1) || !defined(NETSNMP_DISABLE_SNMPV2C) +/*******************************************************************-o-****** + * snmp_comstr_parse + * + * Parameters: + * *data (I) Message. + * *length (I/O) Bytes left in message. + * *psid (O) Community string. + * *slen (O) Length of community string. + * *version (O) Message version. + * + * Returns: + * Pointer to the remainder of data. + * + * + * Parse the header of a community string-based message such as that found + * in SNMPv1 and SNMPv2c. + */ +u_char * +snmp_comstr_parse(u_char * data, + size_t * length, + u_char * psid, size_t * slen, long *version) +{ + u_char type; + long ver; + size_t origlen = *slen; + + /* + * Message is an ASN.1 SEQUENCE. + */ + data = asn_parse_sequence(data, length, &type, + (ASN_SEQUENCE | ASN_CONSTRUCTOR), + "auth message"); + if (data == NULL) { + return NULL; + } + + /* + * First field is the version. + */ + DEBUGDUMPHEADER("recv", "SNMP version"); + data = asn_parse_int(data, length, &type, &ver, sizeof(ver)); + DEBUGINDENTLESS(); + *version = ver; + if (data == NULL) { + ERROR_MSG("bad parse of version"); + return NULL; + } + + /* + * second field is the community string for SNMPv1 & SNMPv2c + */ + DEBUGDUMPHEADER("recv", "community string"); + data = asn_parse_string(data, length, &type, psid, slen); + DEBUGINDENTLESS(); + if (data == NULL) { + ERROR_MSG("bad parse of community"); + return NULL; + } + psid[SNMP_MIN(*slen, origlen - 1)] = '\0'; + return (u_char *) data; + +} /* end snmp_comstr_parse() */ + + + + +/*******************************************************************-o-****** + * snmp_comstr_build + * + * Parameters: + * *data + * *length + * *psid + * *slen + * *version + * messagelen + * + * Returns: + * Pointer into 'data' after built section. + * + * + * Build the header of a community string-based message such as that found + * in SNMPv1 and SNMPv2c. + * + * NOTE: The length of the message will have to be inserted later, + * if not known. + * + * NOTE: Version is an 'int'. (CMU had it as a long, but was passing + * in a *int. Grrr.) Assign version to verfix and pass in + * that to asn_build_int instead which expects a long. -- WH + */ +u_char * +snmp_comstr_build(u_char * data, + size_t * length, + u_char * psid, + size_t * slen, long *version, size_t messagelen) +{ + long verfix = *version; + u_char *h1 = data; + u_char *h1e; + size_t hlength = *length; + + + /* + * Build the the message wrapper (note length will be inserted later). + */ + data = + asn_build_sequence(data, length, + (u_char) (ASN_SEQUENCE | ASN_CONSTRUCTOR), 0); + if (data == NULL) { + return NULL; + } + h1e = data; + + + /* + * Store the version field. + */ + data = asn_build_int(data, length, + (u_char) (ASN_UNIVERSAL | ASN_PRIMITIVE | + ASN_INTEGER), &verfix, sizeof(verfix)); + if (data == NULL) { + return NULL; + } + + + /* + * Store the community string. + */ + data = asn_build_string(data, length, + (u_char) (ASN_UNIVERSAL | ASN_PRIMITIVE | + ASN_OCTET_STR), psid, + *(u_char *) slen); + if (data == NULL) { + return NULL; + } + + + /* + * Insert length. + */ + asn_build_sequence(h1, &hlength, + (u_char) (ASN_SEQUENCE | ASN_CONSTRUCTOR), + data - h1e + messagelen); + + + return data; + +} /* end snmp_comstr_build() */ +#endif /* support for community based SNMP */ |