]> git.ipfire.org Git - thirdparty/squid.git/blobdiff - snmplib/asn1.c
Renamed squid.h to squid-old.h and config.h to squid.h
[thirdparty/squid.git] / snmplib / asn1.c
index e0dde7fb78b3adf556cea8ffeec41243bae53f6f..def1fad3624c9a8a4c86fa5f0840db19157335ca 100644 (file)
@@ -10,9 +10,9 @@
 /***************************************************************************
  *
  *           Copyright 1997 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
@@ -20,7 +20,7 @@
  * 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
  * 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 "config.h"
+#include "squid.h"
 
 #include <stdio.h>
 
 #if HAVE_MEMORY_H
 #include <memory.h>
 #endif
-#ifdef HAVE_STRING_H
+#if HAVE_STRING_H
 #include <string.h>
 #endif
-#ifdef HAVE_STRINGS_H
+#if HAVE_STRINGS_H
 #include <strings.h>
 #endif
 #if HAVE_BSTRING_H
 
 u_char *
 asn_build_header(u_char * data,        /* IN - ptr to start of object */
-    int *datalength,           /* IN/OUT - # of valid bytes */
-                                            /*          left in buffer */
-    u_char type,               /* IN - ASN type of object */
-    int length)
+                 int *datalength,              /* IN/OUT - # of valid bytes */
+                 /*          left in buffer */
+                 u_char type,          /* IN - ASN type of object */
+                 int length)
 {                              /* IN - length of object */
     /* Truth is 0 'cause we don't know yet */
     return (asn_build_header_with_truth(data, datalength, type, length, 0));
@@ -108,12 +108,12 @@ asn_build_header(u_char * data,   /* IN - ptr to start of object */
  */
 u_char *
 asn_parse_int(u_char * data, int *datalength,
-    u_char * type, int *intp, int intsize)
-  /*    u_char *data;        IN     - pointer to start of object */
-  /*    int    *datalength;  IN/OUT - # of valid bytes left in buffer */
-  /*    u_char *type;        OUT    - asn type of object */
-  /*    int   *intp;         IN/OUT - pointer to start of output buffer */
-  /*    int     intsize;     IN     - size of output buffer */
+              u_char * type, int *intp, int intsize)
+/*    u_char *data;        IN     - pointer to start of object */
+/*    int    *datalength;  IN/OUT - # of valid bytes left in buffer */
+/*    u_char *type;        OUT    - asn type of object */
+/*    int   *intp;         IN/OUT - pointer to start of output buffer */
+/*    int     intsize;     IN     - size of output buffer */
 {
     /*
      * ASN.1 integer ::= 0x02 asnlength byte {byte}*
@@ -124,8 +124,8 @@ asn_parse_int(u_char * data, int *datalength,
 
     /* Room to store int? */
     if (intsize != sizeof(int)) {
-       snmp_set_api_error(SNMPERR_ASN_DECODE);
-       return (NULL);
+        snmp_set_api_error(SNMPERR_ASN_DECODE);
+        return (NULL);
     }
     /* Type */
     *type = *bufp++;
@@ -133,28 +133,28 @@ asn_parse_int(u_char * data, int *datalength,
     /* Extract length */
     bufp = asn_parse_length(bufp, &asn_length);
     if (bufp == NULL)
-       return (NULL);
+        return (NULL);
 
     /* Make sure the entire int is in the buffer */
     if (asn_length + (bufp - data) > *datalength) {
-       snmp_set_api_error(SNMPERR_ASN_DECODE);
-       return (NULL);
+        snmp_set_api_error(SNMPERR_ASN_DECODE);
+        return (NULL);
     }
     /* Can we store this int? */
     if (asn_length > intsize) {
-       snmp_set_api_error(SNMPERR_ASN_DECODE);
-       return (NULL);
+        snmp_set_api_error(SNMPERR_ASN_DECODE);
+        return (NULL);
     }
     /* Remaining data */
     *datalength -= (int) asn_length + (bufp - data);
 
     /* Is the int negative? */
     if (*bufp & 0x80)
-       value = -1;             /* integer is negative */
+        value = -1;            /* integer is negative */
 
     /* Extract the bytes */
     while (asn_length--)
-       value = (value << 8) | *bufp++;
+        value = (value << 8) | *bufp++;
 
     /* That's it! */
     *intp = value;
@@ -173,12 +173,12 @@ asn_parse_int(u_char * data, int *datalength,
  */
 u_char *
 asn_parse_unsigned_int(u_char * data, int *datalength,
-    u_char * type, u_int * intp, int intsize)
-  /*    u_char *data;          IN     - pointer to start of object */
-  /*    int    *datalength;    IN/OUT - # of valid bytes left in buffer */
-  /*    u_char *type;          OUT    - asn type of object */
-  /*    u_int *intp;           IN/OUT - pointer to start of output buffer */
-  /*    int     intsize;       IN     - size of output buffer */
+                       u_char * type, u_int * intp, int intsize)
+/*    u_char *data;          IN     - pointer to start of object */
+/*    int    *datalength;    IN/OUT - # of valid bytes left in buffer */
+/*    u_char *type;          OUT    - asn type of object */
+/*    u_int *intp;           IN/OUT - pointer to start of output buffer */
+/*    int     intsize;       IN     - size of output buffer */
 {
     /*
      * ASN.1 integer ::= 0x02 asnlength byte {byte}*
@@ -189,8 +189,8 @@ asn_parse_unsigned_int(u_char * data, int *datalength,
 
     /* Room to store int? */
     if (intsize != sizeof(int)) {
-       snmp_set_api_error(SNMPERR_ASN_DECODE);
-       return (NULL);
+        snmp_set_api_error(SNMPERR_ASN_DECODE);
+        return (NULL);
     }
     /* Type */
     *type = *bufp++;
@@ -198,29 +198,29 @@ asn_parse_unsigned_int(u_char * data, int *datalength,
     /* Extract length */
     bufp = asn_parse_length(bufp, &asn_length);
     if (bufp == NULL)
-       return (NULL);
+        return (NULL);
 
     /* Make sure the entire int is in the buffer */
     if (asn_length + (bufp - data) > *datalength) {
-       snmp_set_api_error(SNMPERR_ASN_DECODE);
-       return (NULL);
+        snmp_set_api_error(SNMPERR_ASN_DECODE);
+        return (NULL);
     }
     /* Can we store this int? */
     if ((asn_length > (intsize + 1)) ||
-       ((asn_length == intsize + 1) && *bufp != 0x00)) {
-       snmp_set_api_error(SNMPERR_ASN_DECODE);
-       return (NULL);
+            ((asn_length == intsize + 1) && *bufp != 0x00)) {
+        snmp_set_api_error(SNMPERR_ASN_DECODE);
+        return (NULL);
     }
     /* Remaining data */
     *datalength -= (int) asn_length + (bufp - data);
 
     /* Is the int negative? */
     if (*bufp & 0x80)
-       value = -1;             /* integer is negative */
+        value = -1;            /* integer is negative */
 
     /* Extract the bytes */
     while (asn_length--)
-       value = (value << 8) | *bufp++;
+        value = (value << 8) | *bufp++;
 
     /* That's it! */
     *intp = value;
@@ -239,12 +239,12 @@ asn_parse_unsigned_int(u_char * data, int *datalength,
  */
 u_char *
 asn_build_int(u_char * data, int *datalength,
-    u_char type, int *intp, int intsize)
-  /*     u_char *data;         IN - pointer to start of output buffer */
-  /*     int    *datalength;   IN/OUT - # of valid bytes left in buffer */
-  /*     u_char  type;         IN - asn type of object */
-  /*     int   *intp;          IN - pointer to start of integer */
-  /*     int    intsize;       IN - size of *intp */
+              u_char type, int *intp, int intsize)
+/*     u_char *data;         IN - pointer to start of output buffer */
+/*     int    *datalength;   IN/OUT - # of valid bytes left in buffer */
+/*     u_char  type;         IN - asn type of object */
+/*     int   *intp;          IN - pointer to start of integer */
+/*     int    intsize;       IN - size of *intp */
 {
     /*
      * ASN.1 integer ::= 0x02 asnlength byte {byte}*
@@ -253,8 +253,8 @@ asn_build_int(u_char * data, int *datalength,
     u_int mask;
 
     if (intsize != sizeof(int)) {
-       snmp_set_api_error(SNMPERR_ASN_ENCODE);
-       return (NULL);
+        snmp_set_api_error(SNMPERR_ASN_ENCODE);
+        return (NULL);
     }
     integer = *intp;
 
@@ -268,27 +268,27 @@ asn_build_int(u_char * data, int *datalength,
     /* mask is 0xFF800000 on a big-endian machine */
 
     while ((((integer & mask) == 0) || ((integer & mask) == mask))
-       && intsize > 1) {
-       intsize--;
-       integer <<= 8;
+            && intsize > 1) {
+        intsize--;
+        integer <<= 8;
     }
 
     data = asn_build_header_with_truth(data, datalength, type, intsize, 1);
     if (data == NULL)
-       return (NULL);
+        return (NULL);
 
     /* Enough room for what we just encoded? */
     if (*datalength < intsize) {
-       snmp_set_api_error(SNMPERR_ASN_ENCODE);
-       return (NULL);
+        snmp_set_api_error(SNMPERR_ASN_ENCODE);
+        return (NULL);
     }
     /* Insert it */
     *datalength -= intsize;
     mask = (u_int) 0xFF << (8 * (sizeof(int) - 1));
     /* mask is 0xFF000000 on a big-endian machine */
     while (intsize--) {
-       *data++ = (u_char) ((integer & mask) >> (8 * (sizeof(int) - 1)));
-       integer <<= 8;
+        *data++ = (u_char) ((integer & mask) >> (8 * (sizeof(int) - 1)));
+        integer <<= 8;
     }
     return (data);
 }
@@ -305,12 +305,12 @@ asn_build_int(u_char * data, int *datalength,
  */
 u_char *
 asn_build_unsigned_int(u_char * data, int *datalength,
-    u_char type, u_int * intp, int intsize)
-  /*     u_char *data;         IN     - pointer to start of output buffer */
-  /*     int    *datalength;   IN/OUT - # of valid bytes left in buffer */
-  /*     u_char  type;         IN     - asn type of object */
-  /*     u_int  *intp;         IN     - pointer to start of integer */
-  /*     int     intsize;      IN     - size of *intp */
+                       u_char type, u_int * intp, int intsize)
+/*     u_char *data;         IN     - pointer to start of output buffer */
+/*     int    *datalength;   IN/OUT - # of valid bytes left in buffer */
+/*     u_char  type;         IN     - asn type of object */
+/*     u_int  *intp;         IN     - pointer to start of integer */
+/*     int     intsize;      IN     - size of *intp */
 {
     /*
      * ASN.1 integer ::= 0x02 asnlength byte {byte}*
@@ -320,20 +320,20 @@ asn_build_unsigned_int(u_char * data, int *datalength,
     int add_null_byte = 0;
 
     if (intsize != sizeof(int)) {
-       snmp_set_api_error(SNMPERR_ASN_ENCODE);
-       return (NULL);
+        snmp_set_api_error(SNMPERR_ASN_ENCODE);
+        return (NULL);
     }
     integer = *intp;
     mask = (u_int) 0x80 << (8 * (sizeof(int) - 1));
     /* mask is 0x80000000 on a big-endian machine */
     if ((integer & mask) != 0) {
-       /* add a null byte if MSB is set, to prevent sign extension */
-       add_null_byte = 1;
-       intsize++;
+        /* add a null byte if MSB is set, to prevent sign extension */
+        add_null_byte = 1;
+        intsize++;
     }
     /*
      * Truncate "unnecessary" bytes off of the most significant end of
-     * this 2's complement integer. 
+     * this 2's complement integer.
      * There should be no sequence of 9 consecutive 1's or 0's at the
      * most significant end of the integer.
      * The 1's case is taken care of above by adding a null byte.
@@ -341,28 +341,28 @@ asn_build_unsigned_int(u_char * data, int *datalength,
     mask = (u_int) 0x1FF << ((8 * (sizeof(int) - 1)) - 1);
     /* mask is 0xFF800000 on a big-endian machine */
     while (((integer & mask) == 0) && intsize > 1) {
-       intsize--;
-       integer <<= 8;
+        intsize--;
+        integer <<= 8;
     }
 
     data = asn_build_header_with_truth(data, datalength, type, intsize, 1);
     if (data == NULL)
-       return (NULL);
+        return (NULL);
 
     if (*datalength < intsize) {
-       snmp_set_api_error(SNMPERR_ASN_ENCODE);
-       return (NULL);
+        snmp_set_api_error(SNMPERR_ASN_ENCODE);
+        return (NULL);
     }
     *datalength -= intsize;
     if (add_null_byte == 1) {
-       *data++ = '\0';
-       intsize--;
+        *data++ = '\0';
+        intsize--;
     }
     mask = (u_int) 0xFF << (8 * (sizeof(int) - 1));
     /* mask is 0xFF000000 on a big-endian machine */
     while (intsize--) {
-       *data++ = (u_char) ((integer & mask) >> (8 * (sizeof(int) - 1)));
-       integer <<= 8;
+        *data++ = (u_char) ((integer & mask) >> (8 * (sizeof(int) - 1)));
+        integer <<= 8;
     }
     return (data);
 }
@@ -381,12 +381,12 @@ asn_build_unsigned_int(u_char * data, int *datalength,
  */
 u_char *
 asn_parse_string(u_char * data, int *datalength,
-    u_char * type, u_char * string, int *strlength)
-  /*    u_char *data;       IN - pointer to start of object */
-  /*    int    *datalength; IN/OUT - # of valid bytes left in buffer */
-  /*    u_char *type;       OUT - asn type of object */
-  /*    u_char *string;     IN/OUT - pointer to start of output buffer */
-  /*    int    *strlength;  IN/OUT - size of output buffer */
+                 u_char * type, u_char * string, int *strlength)
+/*    u_char *data;       IN - pointer to start of object */
+/*    int    *datalength; IN/OUT - # of valid bytes left in buffer */
+/*    u_char *type;       OUT - asn type of object */
+/*    u_char *string;     IN/OUT - pointer to start of output buffer */
+/*    int    *strlength;  IN/OUT - size of output buffer */
 {
     /*
      * ASN.1 octet string ::= primstring | cmpdstring
@@ -399,17 +399,17 @@ asn_parse_string(u_char * data, int *datalength,
     *type = *bufp++;
     bufp = asn_parse_length(bufp, &asn_length);
     if (bufp == NULL)
-       return (NULL);
+        return (NULL);
 
     if (asn_length + (bufp - data) > *datalength) {
-       snmp_set_api_error(SNMPERR_ASN_DECODE);
-       return (NULL);
+        snmp_set_api_error(SNMPERR_ASN_DECODE);
+        return (NULL);
     }
     if (asn_length > *strlength) {
-       snmp_set_api_error(SNMPERR_ASN_DECODE);
-       return (NULL);
+        snmp_set_api_error(SNMPERR_ASN_DECODE);
+        return (NULL);
     }
-    xmemcpy((char *) string, (char *) bufp, (int) asn_length);
+    memcpy((char *) string, (char *) bufp, (int) asn_length);
     *strlength = (int) asn_length;
     *datalength -= (int) asn_length + (bufp - data);
     return (bufp + asn_length);
@@ -417,7 +417,7 @@ asn_parse_string(u_char * data, int *datalength,
 
 /*
  * asn_build_string - Builds an ASN octet string object containing the input
- *   string.  On entry, datalength is input as the number of valid bytes 
+ *   string.  On entry, datalength is input as the number of valid bytes
  *   following "data".  On exit, it is returned as the number of valid bytes
  *   following the beginning of the next object.
  *
@@ -427,12 +427,12 @@ asn_parse_string(u_char * data, int *datalength,
  */
 u_char *
 asn_build_string(u_char * data, int *datalength,
-    u_char type, u_char * string, int strlength)
-  /*    u_char *data;       IN - pointer to start of object */
-  /*    int    *datalength; IN/OUT - # of valid bytes left in buf */
-  /*    u_char  type;       IN - ASN type of string */
-  /*    u_char *string;     IN - pointer to start of input buffer */
-  /*    int     strlength;  IN - size of input buffer */
+                 u_char type, u_char * string, int strlength)
+/*    u_char *data;       IN - pointer to start of object */
+/*    int    *datalength; IN/OUT - # of valid bytes left in buf */
+/*    u_char  type;       IN - ASN type of string */
+/*    u_char *string;     IN - pointer to start of input buffer */
+/*    int     strlength;  IN - size of input buffer */
 {
     /*
      * ASN.1 octet string ::= primstring | cmpdstring
@@ -442,13 +442,13 @@ asn_build_string(u_char * data, int *datalength,
      */
     data = asn_build_header_with_truth(data, datalength, type, strlength, 1);
     if (data == NULL)
-       return (NULL);
+        return (NULL);
 
     if (*datalength < strlength) {
-       snmp_set_api_error(SNMPERR_ASN_DECODE);
-       return (NULL);
+        snmp_set_api_error(SNMPERR_ASN_DECODE);
+        return (NULL);
     }
-    xmemcpy((char *) data, (char *) string, strlength);
+    memcpy((char *) data, (char *) string, strlength);
     *datalength -= strlength;
     return (data + strlength);
 }
@@ -465,9 +465,9 @@ asn_build_string(u_char * data, int *datalength,
  */
 u_char *
 asn_parse_header(u_char * data, int *datalength, u_char * type)
-  /*    u_char  *data;       IN - pointer to start of object */
-  /*    int     *datalength; IN/OUT - # of valid bytes left in buffer */
-  /*    u_char  *type;       OUT - ASN type of object */
+/*    u_char  *data;       IN - pointer to start of object */
+/*    int     *datalength; IN/OUT - # of valid bytes left in buffer */
+/*    u_char  *type;       OUT - ASN type of object */
 {
     u_char *bufp = data;
     int header_len;
@@ -475,18 +475,18 @@ asn_parse_header(u_char * data, int *datalength, u_char * type)
 
     /* this only works on data types < 30, i.e. no extension octets */
     if (IS_EXTENSION_ID(*bufp)) {
-       snmp_set_api_error(SNMPERR_ASN_DECODE);
-       return (NULL);
+        snmp_set_api_error(SNMPERR_ASN_DECODE);
+        return (NULL);
     }
     *type = *bufp;
     bufp = asn_parse_length(bufp + 1, &asn_length);
     if (bufp == NULL)
-       return (NULL);
+        return (NULL);
 
     header_len = bufp - data;
     if (header_len + asn_length > *datalength || asn_length > (u_int)(2 << 18) ) {
-       snmp_set_api_error(SNMPERR_ASN_DECODE);
-       return (NULL);
+        snmp_set_api_error(SNMPERR_ASN_DECODE);
+        return (NULL);
     }
     *datalength = (int) asn_length;
     return (bufp);
@@ -508,16 +508,16 @@ asn_parse_header(u_char * data, int *datalength, u_char * type)
 
 u_char *
 asn_build_header_with_truth(u_char * data, int *datalength,
-    u_char type, int length, int truth)
-  /*    u_char *data;       IN - pointer to start of object */
-  /*    int    *datalength; IN/OUT - # of valid bytes left in buffer */
-  /*    u_char  type;       IN - ASN type of object */
-  /*    int     length;     IN - length of object */
-  /*    int     truth;      IN - Whether length is truth */
+                            u_char type, int length, int truth)
+/*    u_char *data;       IN - pointer to start of object */
+/*    int    *datalength; IN/OUT - # of valid bytes left in buffer */
+/*    u_char  type;       IN - ASN type of object */
+/*    int     length;     IN - length of object */
+/*    int     truth;      IN - Whether length is truth */
 {
     if (*datalength < 1) {
-       snmp_set_api_error(SNMPERR_ASN_ENCODE);
-       return (NULL);
+        snmp_set_api_error(SNMPERR_ASN_ENCODE);
+        return (NULL);
     }
     *data++ = type;
     (*datalength)--;
@@ -540,17 +540,17 @@ asn_build_header_with_truth(u_char * data, int *datalength,
  */
 u_char *
 asn_build_sequence(u_char * data, int *datalength,
-    u_char type, int length)
-  /*    u_char *data;       IN - pointer to start of object */
-  /*    int    *datalength; IN/OUT - # of valid bytes left in buffer */
-  /*    u_char  type;       IN - ASN type of object */
-  /*    int     length;     IN - length of object */
+                   u_char type, int length)
+/*    u_char *data;       IN - pointer to start of object */
+/*    int    *datalength; IN/OUT - # of valid bytes left in buffer */
+/*    u_char  type;       IN - ASN type of object */
+/*    int     length;     IN - length of object */
 {
     *datalength -= 4;
     if (*datalength < 0) {
-       *datalength += 4;       /* fix up before punting */
-       snmp_set_api_error(SNMPERR_ASN_ENCODE);
-       return (NULL);
+        *datalength += 4;      /* fix up before punting */
+        snmp_set_api_error(SNMPERR_ASN_ENCODE);
+        return (NULL);
     }
     *data++ = type;
     *data++ = (u_char) (0x02 | ASN_LONG_LEN);
@@ -570,27 +570,27 @@ asn_build_sequence(u_char * data, int *datalength,
  */
 u_char *
 asn_parse_length(u_char * data, u_int * length)
-  /*    u_char  *data;   IN - pointer to start of length field */
-  /*    u_int  *length; OUT - value of length field */
+/*    u_char  *data;   IN - pointer to start of length field */
+/*    u_int  *length; OUT - value of length field */
 {
     u_char lengthbyte = *data;
 
     if (lengthbyte & ASN_LONG_LEN) {
-       lengthbyte &= ~ASN_LONG_LEN;    /* turn MSb off */
-
-       if (lengthbyte == 0) {
-           snmp_set_api_error(SNMPERR_ASN_DECODE);
-           return (NULL);
-       }
-       if (lengthbyte > sizeof(int)) {
-           snmp_set_api_error(SNMPERR_ASN_DECODE);
-           return (NULL);
-       }
-       *length = (u_int) 0;
-       xmemcpy((char *) (length), (char *) data + 1, (int) lengthbyte);
-       *length = ntohl(*length);
-       *length >>= (8 * ((sizeof *length) - lengthbyte));
-       return (data + lengthbyte + 1);
+        lengthbyte &= ~ASN_LONG_LEN;   /* turn MSb off */
+
+        if (lengthbyte == 0) {
+            snmp_set_api_error(SNMPERR_ASN_DECODE);
+            return (NULL);
+        }
+        if (lengthbyte > sizeof(int)) {
+            snmp_set_api_error(SNMPERR_ASN_DECODE);
+            return (NULL);
+        }
+        *length = (u_int) 0;
+        memcpy((char *) (length), (char *) data + 1, (int) lengthbyte);
+        *length = ntohl(*length);
+        *length >>= (8 * ((sizeof *length) - lengthbyte));
+        return (data + lengthbyte + 1);
 
     }
     /* short asnlength */
@@ -602,53 +602,53 @@ asn_parse_length(u_char * data, u_int * length)
 
 u_char *
 asn_build_length(u_char * data, int *datalength,
-    int length, int truth)
-  /*   u_char *data;       IN - pointer to start of object */
-  /*   int    *datalength; IN/OUT - # of valid bytes left in buf */
-  /*   int     length;     IN - length of object */
-  /*   int     truth;      IN - If 1, this is the true len. */
+                 int length, int truth)
+/*   u_char *data;       IN - pointer to start of object */
+/*   int    *datalength; IN/OUT - # of valid bytes left in buf */
+/*   int     length;     IN - length of object */
+/*   int     truth;      IN - If 1, this is the true len. */
 {
     u_char *start_data = data;
 
     if (truth) {
 
-       /* no indefinite lengths sent */
-       if (length < 0x80) {
-           if (*datalength < 1) {
-               snmp_set_api_error(SNMPERR_ASN_ENCODE);
-               return (NULL);
-           }
-           *data++ = (u_char) length;
-
-       } else if (length <= 0xFF) {
-           if (*datalength < 2) {
-               snmp_set_api_error(SNMPERR_ASN_ENCODE);
-               return (NULL);
-           }
-           *data++ = (u_char) (0x01 | ASN_LONG_LEN);
-           *data++ = (u_char) length;
-       } else {                /* 0xFF < length <= 0xFFFF */
-           if (*datalength < 3) {
-               snmp_set_api_error(SNMPERR_ASN_ENCODE);
-               return (NULL);
-           }
-           *data++ = (u_char) (0x02 | ASN_LONG_LEN);
-           *data++ = (u_char) ((length >> 8) & 0xFF);
-           *data++ = (u_char) (length & 0xFF);
-       }
+        /* no indefinite lengths sent */
+        if (length < 0x80) {
+            if (*datalength < 1) {
+                snmp_set_api_error(SNMPERR_ASN_ENCODE);
+                return (NULL);
+            }
+            *data++ = (u_char) length;
+
+        } else if (length <= 0xFF) {
+            if (*datalength < 2) {
+                snmp_set_api_error(SNMPERR_ASN_ENCODE);
+                return (NULL);
+            }
+            *data++ = (u_char) (0x01 | ASN_LONG_LEN);
+            *data++ = (u_char) length;
+        } else {               /* 0xFF < length <= 0xFFFF */
+            if (*datalength < 3) {
+                snmp_set_api_error(SNMPERR_ASN_ENCODE);
+                return (NULL);
+            }
+            *data++ = (u_char) (0x02 | ASN_LONG_LEN);
+            *data++ = (u_char) ((length >> 8) & 0xFF);
+            *data++ = (u_char) (length & 0xFF);
+        }
 
     } else {
 
-       /* Don't know if this is the true length.  Make sure it's large
-        * enough for later.
-        */
-       if (*datalength < 3) {
-           snmp_set_api_error(SNMPERR_ASN_ENCODE);
-           return (NULL);
-       }
-       *data++ = (u_char) (0x02 | ASN_LONG_LEN);
-       *data++ = (u_char) ((length >> 8) & 0xFF);
-       *data++ = (u_char) (length & 0xFF);
+        /* Don't know if this is the true length.  Make sure it's large
+         * enough for later.
+         */
+        if (*datalength < 3) {
+            snmp_set_api_error(SNMPERR_ASN_ENCODE);
+            return (NULL);
+        }
+        *data++ = (u_char) (0x02 | ASN_LONG_LEN);
+        *data++ = (u_char) ((length >> 8) & 0xFF);
+        *data++ = (u_char) (length & 0xFF);
     }
 
     *datalength -= (data - start_data);
@@ -670,12 +670,12 @@ asn_build_length(u_char * data, int *datalength,
  */
 u_char *
 asn_parse_objid(u_char * data, int *datalength,
-    u_char * type, oid * objid, int *objidlength)
-  /*    u_char  *data;        IN - pointer to start of object */
-  /*    int     *datalength;  IN/OUT - # of valid bytes left in buf */
-  /*    u_char  *type;        OUT - ASN type of object */
-  /*    oid     *objid;       IN/OUT - pointer to start of output buffer */
-  /*    int     *objidlength; IN/OUT - number of sub-id's in objid */
+                u_char * type, oid * objid, int *objidlength)
+/*    u_char  *data;        IN - pointer to start of object */
+/*    int     *datalength;  IN/OUT - # of valid bytes left in buf */
+/*    u_char  *type;        OUT - ASN type of object */
+/*    oid     *objid;       IN/OUT - pointer to start of output buffer */
+/*    int     *objidlength; IN/OUT - number of sub-id's in objid */
 {
     /*
      * ASN.1 objid ::= 0x06 asnlength subidentifier {subidentifier}*
@@ -692,35 +692,35 @@ asn_parse_objid(u_char * data, int *datalength,
     *type = *bufp++;
     bufp = asn_parse_length(bufp, &asn_length);
     if (bufp == NULL)
-       return (NULL);
+        return (NULL);
 
     if (asn_length + (bufp - data) > *datalength) {
-       snmp_set_api_error(SNMPERR_ASN_DECODE);
-       return (NULL);
+        snmp_set_api_error(SNMPERR_ASN_DECODE);
+        return (NULL);
     }
     *datalength -= (int) asn_length + (bufp - data);
 
     /* Handle invalid object identifier encodings of the form 06 00 robustly */
     if (asn_length == 0)
-       objid[0] = objid[1] = 0;
+        objid[0] = objid[1] = 0;
 
     length = asn_length;
     (*objidlength)--;          /* account for expansion of first byte */
     while (length > 0 && (*objidlength)-- > 0) {
-       subidentifier = 0;
+        subidentifier = 0;
 
-       do {                    /* shift and add in low order 7 bits */
-           subidentifier = (subidentifier << 7)
-               + (*(u_char *) bufp & ~ASN_BIT8);
-           length--;
-       } while (*(u_char *) bufp++ & ASN_BIT8);
+        do {                   /* shift and add in low order 7 bits */
+            subidentifier = (subidentifier << 7)
+                            + (*(u_char *) bufp & ~ASN_BIT8);
+            length--;
+        } while (*(u_char *) bufp++ & ASN_BIT8);
 
-       /* while last byte has high bit clear */
-       if (subidentifier > (u_int) MAX_SUBID) {
-           snmp_set_api_error(SNMPERR_ASN_DECODE);
-           return (NULL);
-       }
-       *oidp++ = (oid) subidentifier;
+        /* while last byte has high bit clear */
+        if (subidentifier > (u_int) MAX_SUBID) {
+            snmp_set_api_error(SNMPERR_ASN_DECODE);
+            return (NULL);
+        }
+        *oidp++ = (oid) subidentifier;
     }
 
     /*
@@ -731,11 +731,11 @@ asn_parse_objid(u_char * data, int *datalength,
      */
     subidentifier = (u_int) objid[1];
     if (subidentifier == 0x2B) {
-       objid[0] = 1;
-       objid[1] = 3;
+        objid[0] = 1;
+        objid[1] = 3;
     } else {
-       objid[1] = (u_char) (subidentifier % 40);
-       objid[0] = (u_char) ((subidentifier - objid[1]) / 40);
+        objid[1] = (u_char) (subidentifier % 40);
+        objid[0] = (u_char) ((subidentifier - objid[1]) / 40);
     }
 
     *objidlength = (int) (oidp - objid);
@@ -755,12 +755,12 @@ asn_parse_objid(u_char * data, int *datalength,
  */
 u_char *
 asn_build_objid(u_char * data, int *datalength,
-    u_char type, oid * objid, int objidlength)
-  /*    u_char *data;         IN - pointer to start of object */
-  /*    int    *datalength;   IN/OUT - # of valid bytes left in buf */
-  /*    u_char  type;         IN - ASN type of object */
-  /*    oid    *objid;        IN - pointer to start of input buffer */
-  /*    int     objidlength;  IN - number of sub-id's in objid */
+                u_char type, oid * objid, int objidlength)
+/*    u_char *data;         IN - pointer to start of object */
+/*    int    *datalength;   IN/OUT - # of valid bytes left in buf */
+/*    u_char  type;         IN - ASN type of object */
+/*    oid    *objid;        IN - pointer to start of input buffer */
+/*    int     objidlength;  IN - number of sub-id's in objid */
 {
     /*
      * ASN.1 objid ::= 0x06 asnlength subidentifier {subidentifier}*
@@ -776,49 +776,49 @@ asn_build_objid(u_char * data, int *datalength,
     int bits, testbits;
 
     if (objidlength < 2) {
-       *bp++ = 0;
-       objidlength = 0;
+        *bp++ = 0;
+        objidlength = 0;
     } else {
-       *bp++ = op[1] + (op[0] * 40);
-       objidlength -= 2;
-       op += 2;
+        *bp++ = op[1] + (op[0] * 40);
+        objidlength -= 2;
+        op += 2;
     }
 
     while (objidlength-- > 0) {
-       subid = *op++;
-       if (subid < 127) {      /* off by one? */
-           *bp++ = subid;
-       } else {
-           mask = 0x7F;        /* handle subid == 0 case */
-           bits = 0;
-           /* testmask *MUST* !!!! be of an unsigned type */
-           for (testmask = 0x7F, testbits = 0; testmask != 0;
-               testmask <<= 7, testbits += 7) {
-               if (subid & testmask) {         /* if any bits set */
-                   mask = testmask;
-                   bits = testbits;
-               }
-           }
-           /* mask can't be zero here */
-           for (; mask != 0x7F; mask >>= 7, bits -= 7) {
-               /* fix a mask that got truncated above */
-               if (mask == 0x1E00000)
-                   mask = 0xFE00000;
-               *bp++ = (u_char) (((subid & mask) >> bits) | ASN_BIT8);
-           }
-           *bp++ = (u_char) (subid & mask);
-       }
+        subid = *op++;
+        if (subid < 127) {     /* off by one? */
+            *bp++ = subid;
+        } else {
+            mask = 0x7F;       /* handle subid == 0 case */
+            bits = 0;
+            /* testmask *MUST* !!!! be of an unsigned type */
+            for (testmask = 0x7F, testbits = 0; testmask != 0;
+                    testmask <<= 7, testbits += 7) {
+                if (subid & testmask) {                /* if any bits set */
+                    mask = testmask;
+                    bits = testbits;
+                }
+            }
+            /* mask can't be zero here */
+            for (; mask != 0x7F; mask >>= 7, bits -= 7) {
+                /* fix a mask that got truncated above */
+                if (mask == 0x1E00000)
+                    mask = 0xFE00000;
+                *bp++ = (u_char) (((subid & mask) >> bits) | ASN_BIT8);
+            }
+            *bp++ = (u_char) (subid & mask);
+        }
     }
 
     asnlength = bp - buf;
     data = asn_build_header_with_truth(data, datalength, type, asnlength, 1);
     if (data == NULL)
-       return (NULL);
+        return (NULL);
     if (*datalength < asnlength) {
-       snmp_set_api_error(SNMPERR_ASN_DECODE);
-       return (NULL);
+        snmp_set_api_error(SNMPERR_ASN_DECODE);
+        return (NULL);
     }
-    xmemcpy((char *) data, (char *) buf, asnlength);
+    memcpy((char *) data, (char *) buf, asnlength);
     *datalength -= asnlength;
     return (data + asnlength);
 }
@@ -836,9 +836,9 @@ asn_build_objid(u_char * data, int *datalength,
  */
 u_char *
 asn_parse_null(u_char * data, int *datalength, u_char * type)
-  /*    u_char  *data;       IN - pointer to start of object */
-  /*    int     *datalength; IN/OUT - # of valid bytes left in buf */
-  /*    u_char  *type;       OUT - ASN type of object */
+/*    u_char  *data;       IN - pointer to start of object */
+/*    int     *datalength; IN/OUT - # of valid bytes left in buf */
+/*    u_char  *type;       OUT - ASN type of object */
 {
     /*
      * ASN.1 null ::= 0x05 0x00
@@ -849,11 +849,11 @@ asn_parse_null(u_char * data, int *datalength, u_char * type)
     *type = *bufp++;
     bufp = asn_parse_length(bufp, &asn_length);
     if (bufp == NULL)
-       return (NULL);
+        return (NULL);
 
     if (asn_length != 0) {
-       snmp_set_api_error(SNMPERR_ASN_DECODE);
-       return (NULL);
+        snmp_set_api_error(SNMPERR_ASN_DECODE);
+        return (NULL);
     }
     *datalength -= (bufp - data);
     return (bufp + asn_length);
@@ -872,9 +872,9 @@ asn_parse_null(u_char * data, int *datalength, u_char * type)
  */
 u_char *
 asn_build_null(u_char * data, int *datalength, u_char type)
-  /*    u_char  *data;       IN - pointer to start of object */
-  /*    int     *datalength; IN/OUT - # of valid bytes left in buf */
-  /*    u_char   type;       IN - ASN type of object */
+/*    u_char  *data;       IN - pointer to start of object */
+/*    int     *datalength; IN/OUT - # of valid bytes left in buf */
+/*    u_char   type;       IN - ASN type of object */
 {
     /*
      * ASN.1 null ::= 0x05 0x00
@@ -898,12 +898,12 @@ asn_build_null(u_char * data, int *datalength, u_char type)
  */
 u_char *
 asn_parse_bitstring(u_char * data, int *datalength,
-    u_char * type, u_char * string, int *strlength)
-  /*   u_char  *data;        IN - pointer to start of object */
-  /*   int     *datalength;  IN/OUT - # of valid bytes left in buf */
-  /*   u_char  *type;        OUT - asn type of object */
-  /*   u_char  *string;      IN/OUT - pointer to start of output buf */
-  /*   int     *strlength;   IN/OUT - size of output buffer */
+                    u_char * type, u_char * string, int *strlength)
+/*   u_char  *data;        IN - pointer to start of object */
+/*   int     *datalength;  IN/OUT - # of valid bytes left in buf */
+/*   u_char  *type;        OUT - asn type of object */
+/*   u_char  *string;      IN/OUT - pointer to start of output buf */
+/*   int     *strlength;   IN/OUT - size of output buffer */
 {
     /*
      * bitstring ::= 0x03 asnlength unused {byte}*
@@ -914,25 +914,25 @@ asn_parse_bitstring(u_char * data, int *datalength,
     *type = *bufp++;
     bufp = asn_parse_length(bufp, &asn_length);
     if (bufp == NULL)
-       return (NULL);
+        return (NULL);
 
     if (asn_length + (bufp - data) > *datalength) {
-       snmp_set_api_error(SNMPERR_ASN_DECODE);
-       return (NULL);
+        snmp_set_api_error(SNMPERR_ASN_DECODE);
+        return (NULL);
     }
     if (asn_length > *strlength) {
-       snmp_set_api_error(SNMPERR_ASN_DECODE);
-       return (NULL);
+        snmp_set_api_error(SNMPERR_ASN_DECODE);
+        return (NULL);
     }
     if (asn_length < 1) {
-       snmp_set_api_error(SNMPERR_ASN_DECODE);
-       return (NULL);
+        snmp_set_api_error(SNMPERR_ASN_DECODE);
+        return (NULL);
     }
     if ((int) (*(char *) bufp) < 0 || (int) (*bufp) > 7) {
-       snmp_set_api_error(SNMPERR_ASN_DECODE);
-       return (NULL);
+        snmp_set_api_error(SNMPERR_ASN_DECODE);
+        return (NULL);
     }
-    xmemcpy((char *) string, (char *) bufp, (int) asn_length);
+    memcpy((char *) string, (char *) bufp, (int) asn_length);
     *strlength = (int) asn_length;
     *datalength -= (int) asn_length + (bufp - data);
     return (bufp + asn_length);
@@ -951,29 +951,29 @@ asn_parse_bitstring(u_char * data, int *datalength,
  */
 u_char *
 asn_build_bitstring(u_char * data, int *datalength,
-    u_char type, u_char * string, int strlength)
-  /*   u_char  *data;       IN - pointer to start of object */
-  /*   int     *datalength; IN/OUT - # of valid bytes left in buf */
-  /*   u_char   type;       IN - ASN type of string */
-  /*   u_char  *string;     IN - pointer to start of input buffer */
-  /*   int      strlength;  IN - size of input buffer */
+                    u_char type, u_char * string, int strlength)
+/*   u_char  *data;       IN - pointer to start of object */
+/*   int     *datalength; IN/OUT - # of valid bytes left in buf */
+/*   u_char   type;       IN - ASN type of string */
+/*   u_char  *string;     IN - pointer to start of input buffer */
+/*   int      strlength;  IN - size of input buffer */
 {
     /*
      * ASN.1 bit string ::= 0x03 asnlength unused {byte}*
      */
     if ((strlength < 1) || ((*(char *) string) < 0) || ((*string) > 7)) {
-       snmp_set_api_error(SNMPERR_ASN_ENCODE);
-       return (NULL);
+        snmp_set_api_error(SNMPERR_ASN_ENCODE);
+        return (NULL);
     }
     data = asn_build_header_with_truth(data, datalength, type, strlength, 1);
     if (data == NULL)
-       return (NULL);
+        return (NULL);
 
     if (*datalength < strlength) {
-       snmp_set_api_error(SNMPERR_ASN_ENCODE);
-       return (NULL);
+        snmp_set_api_error(SNMPERR_ASN_ENCODE);
+        return (NULL);
     }
-    xmemcpy((char *) data, (char *) string, strlength);
+    memcpy((char *) data, (char *) string, strlength);
     *datalength -= strlength;
     return (data + strlength);
 }
@@ -981,7 +981,7 @@ asn_build_bitstring(u_char * data, int *datalength,
 #endif
 
 /*
- * To do: Write an asn_parse_exception function to go with the new 
+ * To do: Write an asn_parse_exception function to go with the new
  * asn_build_exception function below so that the exceptional values can
  * be handled in input packets aswell as output ones.
  */
@@ -996,7 +996,7 @@ asn_build_bitstring(u_char * data, int *datalength,
  *   of this object (i.e. the start of the next object).
  *  Returns NULL on any error.
  *
- * ASN.1 variable exception ::= 0x8i 0x00, where 'i' is one of these 
+ * ASN.1 variable exception ::= 0x8i 0x00, where 'i' is one of these
  *                                         exception identifiers:
  *                                           0 -- noSuchObject
  *                                           1 -- noSuchInstance
@@ -1004,9 +1004,9 @@ asn_build_bitstring(u_char * data, int *datalength,
  */
 u_char *
 asn_build_exception(u_char * data, int *datalength, u_char type)
-  /*    u_char  *data;       IN - pointer to start of object */
-  /*    int     *datalength; IN/OUT - # of valid bytes left in buf */
-  /*    u_char   type;       IN - ASN type of object */
+/*    u_char  *data;       IN - pointer to start of object */
+/*    int     *datalength; IN/OUT - # of valid bytes left in buf */
+/*    u_char   type;       IN - ASN type of object */
 {
     return (asn_build_header_with_truth(data, datalength, type, 0, 1));
 }