Main Page | Data Structures | File List | Data Fields | Globals

# libnet-asn1.h

    00001 /*
    00002  *  $Id: libnet-asn1.h,v 1.3 2004/01/17 07:51:19 mike Exp $
    00003  *
    00004  *  libnet-asn1.h - Network routine library ASN.1 header file
    00005  *
    00006  *  Copyright (c) 1998 - 2004 Mike D. Schiffman <mike@infonexus.com>
    00007  *  All rights reserved.
    00008  *
    00009  *  Definitions for Abstract Syntax Notation One, ASN.1
    00010  *  As defined in ISO/IS 8824 and ISO/IS 8825
    00011  *
    00012  *  Copyright 1988, 1989 by Carnegie Mellon University
    00013  *  All rights reserved.
    00014  *
    00015  *  Permission to use, copy, modify, and distribute this software and its
    00016  *  documentation for any purpose and without fee is hereby granted,
    00017  *  provided that the above copyright notice appear in all copies and that
    00018  *  both that copyright notice and this permission notice appear in
    00019  *  supporting documentation, and that the name of CMU not be
    00020  *  used in advertising or publicity pertaining to distribution of the
    00021  *  software without specific, written prior permission.
    00022  *
    00023  *  CMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
    00024  *  ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
    00025  *  CMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
    00026  *  ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
    00027  *  WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
    00028  *  ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
    00029  *  SOFTWARE.
    00030  *
    00031  *  Copyright (c) 1998 - 2001 Mike D. Schiffman <mike@infonexus.com>
    00032  *  All rights reserved.
    00033  *
    00034  * Redistribution and use in source and binary forms, with or without
    00035  * modification, are permitted provided that the following conditions
    00036  * are met:
    00037  * 1. Redistributions of source code must retain the above copyright
    00038  *    notice, this list of conditions and the following disclaimer.
    00039  * 2. Redistributions in binary form must reproduce the above copyright
    00040  *    notice, this list of conditions and the following disclaimer in the
    00041  *    documentation and/or other materials provided with the distribution.
    00042  *
    00043  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
    00044  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    00045  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    00046  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
    00047  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    00048  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    00049  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    00050  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    00051  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    00052  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    00053  * SUCH DAMAGE.
    00054  */
    00055
    00056 #ifndef __LIBNET_ASN1_H
    00057 #define __LIBNET_ASN1_H
    00058
    00059 #ifndef EIGHTBIT_SUBIDS
    00060 typedef u_int32_t  oid;
    00061 #define MAX_SUBID   0xFFFFFFFF
    00062 #else
    00063 typedef u_int8_t  oid;
    00064 #define MAX_SUBID   0xFF
    00065 #endif
    00066
    00067 #define MAX_OID_LEN         64  /* max subid's in an oid */
    00068
    00069 #define ASN_BOOLEAN         (0x01)
    00070 #define ASN_INTEGER         (0x02)
    00071 #define ASN_BIT_STR         (0x03)
    00072 #define ASN_OCTET_STR       (0x04)
    00073 #define ASN_NULL            (0x05)
    00074 #define ASN_OBJECT_ID       (0x06)
    00075 #define ASN_SEQUENCE        (0x10)
    00076 #define ASN_SET             (0x11)
    00077
    00078 #define ASN_UNIVERSAL       (0x00)
    00079 #define ASN_APPLICATION     (0x40)
    00080 #define ASN_CONTEXT         (0x80)
    00081 #define ASN_PRIVATE         (0xC0)
    00082
    00083 #define ASN_PRIMITIVE       (0x00)
    00084 #define ASN_CONSTRUCTOR     (0x20)
    00085
    00086 #define ASN_LONG_LEN        (0x80)
    00087 #define ASN_EXTENSION_ID    (0x1F)
    00088 #define ASN_BIT8            (0x80)
    00089
    00090 #define IS_CONSTRUCTOR(byte)  ((byte) & ASN_CONSTRUCTOR)
    00091 #define IS_EXTENSION_ID(byte) (((byte) & ASN_EXTENSION_ID) = ASN_EXTENSION_ID)
    00092
    00093 /*
    00094  *  All of the build_asn1_* (build_asn1_length being an exception) functions
    00095  *  take the same first 3 arguments:
    00096  *
    00097  *  u_int8_t *data:   This is a pointer to the start of the data object to be
    00098  *                  manipulated.
    00099  *  int *datalen:   This is a pointer to the number of valid bytes following
    00100  *                  "data".  This should be not be exceeded in any function.
    00101  *                  Upon exiting a function, this value will reflect the
    00102  *                  changed "data" and then refer to the new number of valid
    00103  *                  bytes until the end of "data".
    00104  *  u_int8_t type:    The ASN.1 object type.
    00105  */
    00106
    00107
    00108 /*
    00109  *  Builds an ASN object containing an integer.
    00110  *
    00111  *  Returns NULL upon error or a pointer to the first byte past the end of
    00112  *  this object (the start of the next object).
    00113  */
    00114
    00115 u_int8_t *
    00116 libnet_build_asn1_int(
    00117     u_int8_t *,           /* Pointer to the output buffer */
    00118     int *,              /* Number of valid bytes left in the buffer */
    00119     u_int8_t,             /* ASN object type */
    00120     int32_t *,             /* Pointer to a int32_t integer */
    00121     int                 /* Size of a int32_t integer */
    00122     );
    00123
    00124
    00125 /*
    00126  *  Builds an ASN object containing an unsigned integer.
    00127  *
    00128  *  Returns NULL upon error or a pointer to the first byte past the end of
    00129  *  this object (the start of the next object).
    00130  */
    00131
    00132 u_int8_t *
    00133 libnet_build_asn1_uint(
    00134     u_int8_t *,           /* Pointer to the output buffer */
    00135     int *,              /* Number of valid bytes left in the buffer */
    00136     u_int8_t,             /* ASN object type */
    00137     u_int32_t *,           /* Pointer to an unsigned int32_t integer */
    00138     int                 /* Size of a int32_t integer */
    00139     );
    00140
    00141
    00142 /*
    00143  *  Builds an ASN object containing an octect string.
    00144  *
    00145  *  Returns NULL upon error or a pointer to the first byte past the end of
    00146  *  this object (the start of the next object).
    00147  */
    00148
    00149 u_int8_t *
    00150 libnet_build_asn1_string(
    00151     u_int8_t *,           /* Pointer to the output buffer */
    00152     int *,              /* Number of valid bytes left in the buffer */
    00153     u_int8_t,             /* ASN object type */
    00154     u_int8_t *,           /* Pointer to a string to be built into an object */
    00155     int                 /* Size of the string */
    00156     );
    00157
    00158
    00159 /*
    00160  *  Builds an ASN header for an object with the ID and length specified.  This
    00161  *  only works on data types < 30, i.e. no extension octets.  The maximum
    00162  *  length is 0xFFFF;
    00163  *
    00164  *  Returns a pointer to the first byte of the contents of this object or
    00165  *  NULL upon error
    00166  */
    00167
    00168 u_int8_t *
    00169 libnet_build_asn1_header(
    00170     u_int8_t *,       /* Pointer to the start of the object */
    00171     int *,          /* Number of valid bytes left in buffer */
    00172     u_int8_t,         /* ASN object type */
    00173     int             /* ASN object length */
    00174     );
    00175
    00176
    00177 u_int8_t *
    00178 libnet_build_asn1_length(
    00179     u_int8_t *,       /* Pointer to start of object */
    00180     int *,          /* Number of valid bytes in buffer */
    00181     int             /* Length of object */
    00182     );
    00183
    00184
    00185 /*
    00186  *  Builds an ASN header for a sequence with the ID and length specified.
    00187  *
    00188  *  This only works on data types < 30, i.e. no extension octets.
    00189  *  The maximum length is 0xFFFF;
    00190  *
    00191  *  Returns a pointer to the first byte of the contents of this object.
    00192  *  Returns NULL on any error.
    00193  */
    00194
    00195 u_int8_t *
    00196 libnet_build_asn1_sequence(
    00197     u_int8_t *,
    00198     int *,
    00199     u_int8_t,
    00200     int
    00201     );
    00202
    00203
    00204 /*
    00205  *  Builds an ASN object identifier object containing the input string.
    00206  *
    00207  *  Returns NULL upon error or a pointer to the first byte past the end of
    00208  *  this object (the start of the next object).
    00209  */
    00210
    00211 u_int8_t *
    00212 libnet_build_asn1_objid(
    00213     u_int8_t *,
    00214     int *,
    00215     u_int8_t,
    00216     oid *,
    00217     int
    00218     );
    00219
    00220
    00221 /*
    00222  *  Builds an ASN null object.
    00223  *
    00224  *  Returns NULL upon error or a pointer to the first byte past the end of
    00225  *  this object (the start of the next object).
    00226  */
    00227
    00228 u_int8_t *
    00229 libnet_build_asn1_null(
    00230     u_int8_t *,
    00231     int *,
    00232     u_int8_t
    00233     );
    00234
    00235
    00236 /*
    00237  *  Builds an ASN bitstring.
    00238  *
    00239  *  Returns NULL upon error or a pointer to the first byte past the end of
    00240  *  this object (the start of the next object).
    00241  */
    00242
    00243 u_int8_t *
    00244 libnet_build_asn1_bitstring(
    00245     u_int8_t *,
    00246     int *,
    00247     u_int8_t,
    00248     u_int8_t *,       /* Pointer to the input buffer */
    00249     int             /* Length of the input buffer */
    00250     );
    00251
    00252
    00253 #endif  /* __LIBNET_ASN1_H */
    00254
    00255 /* EOF */