snmp_auth.c
上传用户:wxp200602
上传日期:2007-10-30
资源大小:4028k
文件大小:6k
- /*
- * 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
- # ifdef WIN32
- # include <sys/timeb.h>
- # else
- # include <sys/time.h>
- # endif
- # 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_DMALLOC_H
- #include <dmalloc.h>
- #endif
- #if HAVE_WINSOCK_H
- #include <winsock.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(DISABLE_SNMPV1) || !defined(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)] = ' ';
- 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 */