Blame snmplib/snmp_auth.c

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