asn1.h
上传用户:ets1996
上传日期:2014-09-30
资源大小:353k
文件大小:17k
源码类别:

SNMP编程

开发平台:

Visual C++

  1. /*_############################################################################
  2.   _## 
  3.   _##  asn1.h  
  4.   _##
  5.   _##  SNMP++v3.2.22
  6.   _##  -----------------------------------------------
  7.   _##  Copyright (c) 2001-2007 Jochen Katz, Frank Fock
  8.   _##
  9.   _##  This software is based on SNMP++2.6 from Hewlett Packard:
  10.   _##  
  11.   _##    Copyright (c) 1996
  12.   _##    Hewlett-Packard Company
  13.   _##  
  14.   _##  ATTENTION: USE OF THIS SOFTWARE IS SUBJECT TO THE FOLLOWING TERMS.
  15.   _##  Permission to use, copy, modify, distribute and/or sell this software 
  16.   _##  and/or its documentation is hereby granted without fee. User agrees 
  17.   _##  to display the above copyright notice and this license notice in all 
  18.   _##  copies of the software and any documentation of the software. User 
  19.   _##  agrees to assume all liability for the use of the software; 
  20.   _##  Hewlett-Packard and Jochen Katz make no representations about the 
  21.   _##  suitability of this software for any purpose. It is provided 
  22.   _##  "AS-IS" without warranty of any kind, either express or implied. User 
  23.   _##  hereby grants a royalty-free license to any and all derivatives based
  24.   _##  upon this software code base. 
  25.   _##  
  26.   _##  Stuttgart, Germany, Wed May  2 23:22:30 CEST 2007 
  27.   _##  
  28.   _##########################################################################*/
  29. // $Id: asn1.h 287 2007-03-22 22:37:09Z katz $
  30. #ifndef _ASN1
  31. #define _ASN1
  32. #ifdef WIN32
  33. #ifndef __unix
  34. #include <winsock.h>
  35. #endif
  36. #endif
  37. #include "snmp_pp/target.h"
  38. #ifdef SNMP_PP_NAMESPACE
  39. namespace Snmp_pp {
  40. #endif
  41. #ifndef EIGHTBIT_SUBIDS
  42. typedef unsigned long oid;
  43. #define MAX_SUBID   0xFFFFFFFF
  44. #else
  45. typedef unsigned char oid;
  46. #define MAX_SUBID   0xFF
  47. #endif
  48. #define MAX_OID_LEN      128 /* max subid's in an oid */
  49. // asn.1 values
  50. #define ASN_BOOLEAN      (0x01)
  51. #ifndef ASN_INTEGER
  52. #define ASN_INTEGER      (0x02)
  53. #endif
  54. #define ASN_BIT_STR      (0x03)
  55. #define ASN_OCTET_STR    (0x04)
  56. #ifndef ASN_NULL
  57. #define ASN_NULL         (0x05)
  58. #endif
  59. #define ASN_OBJECT_ID    (0x06)
  60. #ifndef ASN_SEQUENCE
  61. #define ASN_SEQUENCE     (0x10)
  62. #endif
  63. #define ASN_SET          (0x11)
  64. #ifndef ASN_UNIVERSAL
  65. #define ASN_UNIVERSAL    (0x00)
  66. #endif
  67. #ifndef ASN_APPLICATION
  68. #define ASN_APPLICATION  (0x40)
  69. #endif
  70. #ifndef ASN_CONTEXT
  71. #define ASN_CONTEXT      (0x80)
  72. #endif
  73. #ifndef ASN_PRIVATE
  74. #define ASN_PRIVATE      (0xC0)
  75. #endif
  76. #ifndef ASN_PRIMITIVE
  77. #define ASN_PRIMITIVE    (0x00)
  78. #endif
  79. #ifndef ASN_CONSTRUCTOR
  80. #define ASN_CONSTRUCTOR  (0x20)
  81. #endif
  82. #define ASN_LONG_LEN     (0x80)
  83. #define ASN_EXTENSION_ID (0x1F)
  84. #define ASN_BIT8         (0x80)
  85. #define IS_CONSTRUCTOR(byte)  ((byte) & ASN_CONSTRUCTOR)
  86. #define IS_EXTENSION_ID(byte) (((byte) & ASN_EXTENSION_ID) == ASN_EXTENSION_ID)
  87. #define ASN_MAX_NAME_LEN   128
  88. #define SNMP_VERSION_1      0
  89. #define SNMP_VERSION_2C     1
  90. #define SNMP_VERSION_2STERN 2
  91. #define SNMP_VERSION_3      3
  92. // defined types (from the SMI, RFC 1065)
  93. #define SMI_IPADDRESS       (ASN_APPLICATION | 0)
  94. #define SMI_COUNTER         (ASN_APPLICATION | 1)
  95. #define SMI_GAUGE           (ASN_APPLICATION | 2)
  96. #define SMI_TIMETICKS       (ASN_APPLICATION | 3)
  97. #define SMI_OPAQUE          (ASN_APPLICATION | 4)
  98. #define SMI_NSAP            (ASN_APPLICATION | 5)
  99. #define SMI_COUNTER64       (ASN_APPLICATION | 6)
  100. #define SMI_UINTEGER        (ASN_APPLICATION | 7)
  101. #define GET_REQ_MSG         (ASN_CONTEXT | ASN_CONSTRUCTOR | 0x0)
  102. #define GETNEXT_REQ_MSG     (ASN_CONTEXT | ASN_CONSTRUCTOR | 0x1)
  103. #define GET_RSP_MSG         (ASN_CONTEXT | ASN_CONSTRUCTOR | 0x2)
  104. #define SET_REQ_MSG         (ASN_CONTEXT | ASN_CONSTRUCTOR | 0x3)
  105. #define TRP_REQ_MSG         (ASN_CONTEXT | ASN_CONSTRUCTOR | 0x4)
  106. #define GETBULK_REQ_MSG     (ASN_CONTEXT | ASN_CONSTRUCTOR | 0x5)
  107. #define INFORM_REQ_MSG      (ASN_CONTEXT | ASN_CONSTRUCTOR | 0x6)
  108. #define TRP2_REQ_MSG        (ASN_CONTEXT | ASN_CONSTRUCTOR | 0x7)
  109. #define REPORT_MSG          (ASN_CONTEXT | ASN_CONSTRUCTOR | 0x8)
  110. #define SNMP_NOSUCHOBJECT   (ASN_CONTEXT | ASN_PRIMITIVE | 0x0)
  111. #define SNMP_NOSUCHINSTANCE (ASN_CONTEXT | ASN_PRIMITIVE | 0x1)
  112. #define SNMP_ENDOFMIBVIEW   (ASN_CONTEXT | ASN_PRIMITIVE | 0x2)
  113. #ifdef _DEBUG
  114. #define ASNERROR( string)    debugprintf(3, "ASN parse error (%s)n", string )
  115. #else
  116. #define ASNERROR( string)
  117. #endif
  118. typedef struct sockaddr_in  ipaddr;
  119. // pdu
  120. struct snmp_pdu {
  121.     int        command;      // pdu type
  122.     unsigned long  reqid;    // Request id
  123. #ifdef _SNMPv3
  124.     unsigned long  msgid;
  125.     unsigned long  maxsize_scopedpdu;
  126. #endif
  127.     unsigned long  errstat;  // Error status
  128.     unsigned long  errindex; // Error index
  129.     // Trap information
  130.     oid        *enterprise;   // System OID
  131.     int        enterprise_length;
  132.     ipaddr  agent_addr;       // address of object generating trap
  133.     int        trap_type;     // trap type
  134.     int        specific_type; // specific type
  135.     unsigned long  time;      // Uptime
  136.     // vb list
  137.     struct variable_list *variables;
  138. };
  139. // vb list
  140. struct variable_list {
  141.     struct variable_list *next_variable;    // NULL for last variable
  142.     oid        *name;                       // Object identifier of variable
  143.     int        name_length;                 // number of subid's in name
  144.     unsigned char   type;                   // ASN type of variable
  145.     union {                                 // value of variable
  146.     long    *integer;
  147.     unsigned char     *string;
  148.     oid    *objid;
  149.     unsigned char   *bitstring;
  150.     struct counter64 *counter64;
  151.     } val;
  152.     int        val_len;
  153. };
  154. struct counter64 {
  155.     unsigned long high;
  156.     unsigned long low;
  157. };
  158. // prototypes for encoding routines
  159. DLLOPT unsigned char *asn_parse_int( unsigned char *data, int *datalength,
  160.                                      unsigned char *type,
  161.                                      long int *intp, int intsize);
  162. DLLOPT unsigned char *asn_parse_unsigned_int( unsigned char *data,        
  163.                                               int *datalength,
  164.                                               unsigned char *type,
  165.                                               unsigned long *intp,
  166.                                               int intsize);
  167. DLLOPT unsigned char *asn_build_int(unsigned char *data, int *datalength,
  168.                                     const unsigned char type,
  169.                                     const long *intp, int intsize);
  170. DLLOPT unsigned char *asn_build_unsigned_int( unsigned char *data,
  171.                                               int *datalength,
  172.                                               unsigned char type,
  173.                                               unsigned long *intp,
  174.                                               int intsize);
  175. DLLOPT unsigned char *asn_parse_string( unsigned char *data, int *datalength,
  176.                                         unsigned char *type,
  177.                                         unsigned char *string,
  178.                                         int *strlength);
  179. DLLOPT unsigned char *asn_build_string( unsigned char *data, int *datalength,
  180.                                         const unsigned char type,
  181.                                         const unsigned char *string,
  182.                                         const int strlength);
  183. DLLOPT unsigned char *asn_parse_header( unsigned char *data, int *datalength,
  184.                                         unsigned char *type);
  185. DLLOPT unsigned char *asn_build_header( unsigned char *data, int *datalength,
  186.                                         unsigned char type,
  187.                                         int length);
  188. DLLOPT unsigned char *asn_build_sequence( unsigned char *data,
  189.                                           int *datalength,
  190.                                           unsigned char type,
  191.                                           int length);
  192. DLLOPT unsigned char *asn_parse_length( unsigned char *data,
  193.                                         unsigned long *length);
  194. DLLOPT unsigned char *asn_build_length( unsigned char *data, int *datalength,
  195.                                         int length);
  196. DLLOPT unsigned char *asn_parse_objid( unsigned char *data, int *datalength,
  197.                                        unsigned char *type,
  198.                                        oid *objid,
  199.                                        int *objidlength);
  200. DLLOPT unsigned char *asn_build_objid( unsigned char *data,
  201.                                        int *datalength,
  202.                                        unsigned char type,
  203.                                        oid *objid,
  204.                                        int objidlength);
  205. DLLOPT unsigned char *asn_parse_null(unsigned char *data, int *datalength,
  206.                                      unsigned char *type);
  207. DLLOPT unsigned char *asn_build_null( unsigned char *data,int *datalength,
  208.                                       unsigned char type);
  209. DLLOPT unsigned char *asn_parse_bitstring( unsigned char *data,
  210.                                            int *datalength,
  211.                                            unsigned char *type,
  212.                                            unsigned char *string,
  213.                                            int *strlength);
  214. DLLOPT unsigned char *asn_build_bitstring( unsigned char *data,
  215.                                            int *datalength,
  216.                                            unsigned char type,
  217.                                            unsigned char *string,
  218.                                            int strlength);
  219. DLLOPT unsigned char *asn_parse_unsigned_int64( unsigned char *data,
  220.                                                 int *datalength,
  221.                                                 unsigned char *type,
  222.                                                 struct counter64 *cp,
  223.                                                 int countersize);
  224. DLLOPT unsigned char *asn_build_unsigned_int64( unsigned char *data,
  225.                                                 int *datalength,
  226.                                                 unsigned char        type,
  227.                                                 struct counter64 *cp,
  228.                                                 int countersize);
  229. DLLOPT struct snmp_pdu *snmp_pdu_create( int command);
  230. DLLOPT void snmp_free_pdu( struct snmp_pdu *pdu);
  231. DLLOPT int snmp_build(struct snmp_pdu *pdu,
  232.                       unsigned char *packet,
  233.                       int *out_length,
  234.                       const long version,
  235.                       const unsigned char* community,
  236.                       const int community_len);
  237. DLLOPT void snmp_add_var(struct snmp_pdu *pdu,
  238.                          oid *name, int name_length,
  239.                          SmiVALUE *smival);
  240. DLLOPT int snmp_parse(struct snmp_pdu *pdu,
  241.                       unsigned char *data,
  242.                       int data_length,
  243.                       unsigned char *community_name,
  244.                       int &community_len,
  245.                       snmp_version &version);
  246. DLLOPT unsigned char *build_vb(struct snmp_pdu *pdu,
  247.        unsigned char *buf, int *buf_len);
  248. DLLOPT unsigned char *build_data_pdu(struct snmp_pdu *pdu,
  249.      unsigned char *buf, int *buf_len,
  250.      unsigned char *vb_buf, int vb_buf_len);
  251. DLLOPT unsigned char *snmp_build_var_op(unsigned char *data,
  252.                                         oid * var_name,
  253.                                         int *var_name_len,
  254.                                         unsigned char var_val_type,
  255.                                         int var_val_len,
  256.                                         unsigned char *var_val,
  257.                                         int *listlength);
  258. DLLOPT unsigned char *snmp_parse_var_op( unsigned char *data,
  259.                                          oid *var_name,        
  260.                                          int *var_name_len,
  261.                                          unsigned char  *var_val_type,
  262.                                          int *var_val_len,
  263.                                          unsigned char  **var_val,        
  264.                                          int *listlength);
  265. DLLOPT int snmp_parse_data_pdu(struct snmp_pdu *pdu,
  266.                                unsigned char *&data, int &length);
  267.                                
  268. DLLOPT int snmp_parse_vb(struct snmp_pdu *pdu,
  269.                          unsigned char *&data, int &data_len);
  270. DLLOPT void clear_pdu(struct snmp_pdu *pdu, bool clear_all = false);
  271. /**
  272.  * Encode the given values for the HeaderData into the buffer.
  273.  *                                                                  <pre>
  274.  *  HeaderData ::= SEQUENCE {
  275.  *    msgID      INTEGER (0..2147483647),
  276.  *    msgMaxSize INTEGER (484..2147483647),
  277.  *    msgFlags   OCTET STRING (SIZE(1)),
  278.  *    msgSecurityModel INTEGER (0..2147483647)
  279.  *  }
  280.  *                                                                 </pre>
  281.  * @param outBuf         - The buffer
  282.  * @param maxLength      - IN: length of the buffer
  283.  *                         OUT: free bytes left in the buffer
  284.  * @param msgID          - The message ID
  285.  * @param maxMessageSize - The maximum size of a SNMPv3 message
  286.  * @param msgFlags       - The message Flags
  287.  * @param securityModel  - The security model
  288.  *
  289.  * @return - Pointer to the first free byte in the buffer or
  290.  *           NULL if an error occured
  291.  */
  292. DLLOPT unsigned char *asn1_build_header_data(unsigned char *outBuf,
  293.      int *maxLength,
  294.      long msgID,
  295.      long maxMessageSize,
  296.      unsigned char msgFlags,
  297.      long securityModel);
  298. /**
  299.  * Parse the filled HeaderData of a SNMPv3 message and return
  300.  * the encoded values.
  301.  *                                                                  <pre>
  302.  *      HeaderData ::= SEQUENCE {
  303.  *          msgID      INTEGER (0..2147483647),
  304.  *          msgMaxSize INTEGER (484..2147483647),
  305.  *          msgFlags   OCTET STRING (SIZE(1)),
  306.  *          msgSecurityModel INTEGER (0..2147483647)
  307.  *      }
  308.  *                                                                 </pre>
  309.  *
  310.  * @param buf                - The buffer to parse
  311.  * @param buf_len            - IN: The length of the buffer
  312.  *                             OUT: The number of bytes after this object
  313.  *                                  int the buffer
  314.  * @param msg_id             - OUT: The message id
  315.  * @param msg_max_size       - OUT: THe maximum message size of the sender
  316.  * @param msg_flags          - OUT: The message flags
  317.  * @param msg_security_model - OUT: The security model used to build this
  318.  *                                message
  319.  *
  320.  * @return -  Returns a pointer to the first byte past the end of
  321.  *            the object HeaderData (i.e. the start of the next object).
  322.  *            Returns NULL on any error.
  323.  */
  324. DLLOPT unsigned char *asn1_parse_header_data(unsigned char *buf, int *buf_len,
  325.      long *msg_id, long *msg_max_size,
  326.      unsigned char *msg_flags,
  327.      long *msg_security_model);
  328. /**
  329.  * Parse the ScopedPDU and return the encoded values.
  330.  *                                                                  <pre>
  331.  *      ScopedPDU ::= SEQUENCE {
  332.  *          contextEngineID  OCTET STRING,
  333.  *          contextName      OCTET STRING,
  334.  *          data             ANY -- e.g., PDUs as defined in RFC 1905
  335.  *      }
  336.  *                                                                 </pre>
  337.  *
  338.  * @param scoped_pdu            - The buffer to parse
  339.  * @param scoped_pdu_len        - IN: The length of the buffer
  340.  *                                OUT: The number of bytes after this object
  341.  *                                     int the buffer
  342.  * @param context_engine_id     - OUT: The parsed contextEngineID
  343.  * @param context_engine_id_len - OUT: The length of the contextEngineID
  344.  * @param context_name          - OUT: The parsed contextName
  345.  * @param context_name_len      - OUT: The length of the contextName
  346.  *
  347.  * @return - Pointer to the data object of the scopedPDU or
  348.  *           NULL on any error.
  349.  */
  350. DLLOPT unsigned char *asn1_parse_scoped_pdu(
  351.          unsigned char *scoped_pdu, int *scoped_pdu_len,
  352.          unsigned char *context_engine_id, int *context_engine_id_len,
  353.          unsigned char *context_name, int *context_name_len );
  354. /**
  355.  * Encode the given values for the scopedPDU into the buffer.
  356.  *                                                                  <pre>
  357.  *    ScopedPDU ::= SEQUENCE {
  358.  *           contextEngineID OCTET STRING
  359.  *           contextName     OCTET STRING
  360.  *           data            ANY  -- PDU
  361.  *       }
  362.  *                                                                 </pre>
  363.  * param outBuf            - The buffer
  364.  * param max_len           - IN: length of the buffer
  365.  *                           OUT: free bytes left in the buffer
  366.  * param contextEngineID   - The contextEngineID
  367.  * param contextEngineIDLength - The length of the contextEngineID
  368.  * param contextName       - The contextName
  369.  * param contextNameLength - The length of the contextName
  370.  * param data              - The already encoded data
  371.  * param dataLength        - The length of the data
  372.  *
  373.  * @return - Pointer to the first free byte in the buffer or
  374.  *           NULL if an error occured
  375.  */
  376. DLLOPT unsigned char *asn1_build_scoped_pdu(
  377.                unsigned char *outBuf, int *max_len,
  378.                unsigned char *contextEngineID, long contextEngineIDLength,
  379.                unsigned char *contextName, long contextNameLength,
  380.                unsigned char *data, long dataLength);
  381. #ifdef SNMP_PP_NAMESPACE
  382. } // end of namespace Snmp_pp
  383. #endif 
  384. #endif  // _ASN1