summaryrefslogtreecommitdiff
path: root/snmplib/snmp_auth.c
diff options
context:
space:
mode:
authorHideki Yamane <henrich@debian.org>2014-03-30 19:38:48 +0900
committerHideki Yamane <henrich@debian.org>2014-03-30 19:38:48 +0900
commit7769a9595c3da9a35f31b42451b1f6c3ed4004fa (patch)
tree009bf8fd68af6bb1129e07dd8c1ed205010d81f8 /snmplib/snmp_auth.c
parent2e7891b0311204e0ecd5dc4a4334df01f3a6a1b4 (diff)
downloadpkg-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.c240
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 */