usm_v3.h
上传用户:uncom666
上传日期:2020-03-30
资源大小:1426k
文件大小:39k
源码类别:

SNMP编程

开发平台:

Visual C++

  1. /*_############################################################################
  2.   _## 
  3.   _##  usm_v3.h  
  4.   _##
  5.   _##  SNMP++v3.2.24
  6.   _##  -----------------------------------------------
  7.   _##  Copyright (c) 2001-2009 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, Fri May 29 22:35:14 CEST 2009 
  27.   _##  
  28.   _##########################################################################*/
  29. // $Id: usm_v3.h 337 2008-05-02 19:16:15Z katz $
  30. #ifndef _USM_V3
  31. #define _USM_V3
  32. #include "snmp_pp/config_snmp_pp.h"
  33. #ifdef _SNMPv3
  34. #include "snmp_pp/smi.h"
  35. #include "snmp_pp/octet.h"
  36. #include "snmp_pp/address.h"
  37. #ifdef SNMP_PP_NAMESPACE
  38. namespace Snmp_pp {
  39. #endif
  40. #define MAXUINT32 4294967295u
  41. // the maximum allowed length of the username
  42. #define MAXLEN_USMUSERNAME 32
  43. #define MAXLEN_USMSECURITYNAME MAXLEN_USMUSERNAME
  44. #define SNMPv3_AUTHFLAG       0x01
  45. #define SNMPv3_PRIVFLAG       0x02
  46. #define SNMPv3_REPORTABLEFLAG 0x04
  47. #define NOKEY      0
  48. #define AUTHKEY    1
  49. #define PRIVKEY    2
  50. #define OWNAUTHKEY 3
  51. #define OWNPRIVKEY 4
  52. /** @name SecurityLevels
  53.  *
  54.  * When sending a SNMPv3 message, one of these security levels can be
  55.  * set on the Pdu object.
  56.  */
  57. //@{
  58. #define SNMP_SECURITY_LEVEL_NOAUTH_NOPRIV  1 ///< noAuthNoPriv
  59. #define SNMP_SECURITY_LEVEL_AUTH_NOPRIV    2 ///< authNoPriv
  60. #define SNMP_SECURITY_LEVEL_AUTH_PRIV      3 ///< authPriv
  61. //@}
  62. /** @name AuthProtocols
  63.  *
  64.  * Each user of the USM must use one authentication protocol (which
  65.  * may be none.
  66.  */
  67. //@{
  68. #define SNMP_AUTHPROTOCOL_NONE    1 ///< None
  69. #define SNMP_AUTHPROTOCOL_HMACMD5 2 ///< HMAC-MD5
  70. #define SNMP_AUTHPROTOCOL_HMACSHA 3 ///< HMAC-SHA
  71. //@}
  72. /** @name PrivProtocols
  73.  *
  74.  * Each user of the USM must use one privacy protocol (which may be
  75.  * none.
  76.  */
  77. //@{
  78. #define SNMP_PRIVPROTOCOL_NONE     1 ///< None
  79. #define SNMP_PRIVPROTOCOL_DES      2 ///< DES
  80. #define SNMP_PRIVPROTOCOL_AES128   4 ///< AES128 (RFC 3826)
  81. #define SNMP_PRIVPROTOCOL_IDEA     9 ///< IDEA (non standard)
  82. #define SNMP_PRIVPROTOCOL_AES192  20 ///< AES192 (non standard)
  83. #define SNMP_PRIVPROTOCOL_AES256  21 ///< AES256 (non standard)
  84. #define SNMP_PRIVPROTOCOL_3DESEDE  3 ///< 3DES (expired draft standard)
  85. //@}
  86. /** @name USM-ErrorCodes
  87.  *
  88.  * Each method of the class USM may return one of the following
  89.  * error codes.
  90.  */
  91. //@{
  92. #define SNMPv3_USM_OK                          1400
  93. #define SNMPv3_USM_ERROR                       1401
  94. #define SNMPv3_USM_ERROR_CONFIGFILE            1402
  95. #define SNMPv3_USM_UNSUPPORTED_SECURITY_LEVEL  1403
  96. #define SNMPv3_USM_UNKNOWN_SECURITY_NAME       1404
  97. #define SNMPv3_USM_ENCRYPTION_ERROR            1405
  98. #define SNMPv3_USM_DECRYPTION_ERROR            1406
  99. #define SNMPv3_USM_AUTHENTICATION_ERROR        1407
  100. #define SNMPv3_USM_AUTHENTICATION_FAILURE      1408
  101. #define SNMPv3_USM_PARSE_ERROR                 1409
  102. #define SNMPv3_USM_UNKNOWN_ENGINEID            1410
  103. #define SNMPv3_USM_NOT_IN_TIME_WINDOW          1411
  104. #define SNMPv3_USM_UNSUPPORTED_AUTHPROTOCOL    1412
  105. #define SNMPv3_USM_UNSUPPORTED_PRIVPROTOCOL    1413
  106. #define SNMPv3_USM_ADDRESS_ERROR               1414
  107. #define SNMPv3_USM_FILECREATE_ERROR            1415
  108. #define SNMPv3_USM_FILEOPEN_ERROR              1416
  109. #define SNMPv3_USM_FILERENAME_ERROR            1417
  110. #define SNMPv3_USM_FILEDELETE_ERROR            1418
  111. #define SNMPv3_USM_FILEWRITE_ERROR             1419
  112. #define SNMPv3_USM_FILEREAD_ERROR              1420
  113. //@}
  114. /** @name Statistics on error codes. */
  115. //@{
  116. #define SNMPv3_USM_MAX_ERROR                   SNMPv3_USM_FILEREAD_ERROR
  117. #define SNMPv3_USM_MIN_ERROR                   SNMPv3_USM_OK
  118. #define SNMPv3_USM_ERRORCOUNT                  SNMPv3_USM_MAX_ERROR - SNMPv3_USM_MIN_ERROR
  119. //@}
  120. #define oidUsmStats                        "1.3.6.1.6.3.15.1.1"
  121. #define oidUsmStatsUnsupportedSecLevels    "1.3.6.1.6.3.15.1.1.1.0"
  122. #define oidUsmStatsNotInTimeWindows        "1.3.6.1.6.3.15.1.1.2.0"
  123. #define oidUsmStatsUnknownUserNames        "1.3.6.1.6.3.15.1.1.3.0"
  124. #define oidUsmStatsUnknownEngineIDs        "1.3.6.1.6.3.15.1.1.4.0"
  125. #define oidUsmStatsWrongDigests            "1.3.6.1.6.3.15.1.1.5.0"
  126. #define oidUsmStatsDecryptionErrors        "1.3.6.1.6.3.15.1.1.6.0"
  127. #define oidUsmUserTable                    "1.3.6.1.6.3.15.1.2.2"
  128. #define oidUsmUserEntry                    "1.3.6.1.6.3.15.1.2.2.1"
  129. #define oidUsmAuthProtocolBase             "1.3.6.1.6.3.10.1.1"
  130. #define oidUsmNoAuthProtocol               "1.3.6.1.6.3.10.1.1.1"
  131. #define oidUsmHMACMD5AuthProtocol          "1.3.6.1.6.3.10.1.1.2"
  132. #define oidUsmHMACSHAAuthProtocol          "1.3.6.1.6.3.10.1.1.3"
  133. #define oidUsmPrivProtocolBase             "1.3.6.1.6.3.10.1.2"
  134. #define oidUsmNoPrivProtocol               "1.3.6.1.6.3.10.1.2.1"
  135. #define oidUsmDESPrivProtocol              "1.3.6.1.6.3.10.1.2.2"
  136. #define oidUsmIDEAPrivProtocol             "1.3.6.1.6.3.10.1.2.9"
  137. #define oidUsmAES128PrivProtocol           "1.3.6.1.6.3.10.1.2.4"
  138. #define oidUsmAES192PrivProtocol           "1.3.6.1.6.3.10.1.2.20"
  139. #define oidUsmAES256PrivProtocol           "1.3.6.1.6.3.10.1.2.21"
  140. #define oidUsm3DESEDEPrivProtocol          "1.3.6.1.6.3.10.1.2.3"
  141. #define USM_KeyUpdate            1
  142. #define USM_PasswordUpdate       2
  143. #define USM_PasswordKeyUpdate    3
  144. #define USM_PasswordAllKeyUpdate 4
  145. class SnmpTarget;
  146. class Pdu;
  147. struct UsmKeyUpdate;
  148. struct UsmUserTableEntry {
  149.   unsigned char *usmUserEngineID;     long int usmUserEngineIDLength;
  150.   unsigned char *usmUserName;         long int usmUserNameLength;
  151.   unsigned char *usmUserSecurityName; long int usmUserSecurityNameLength;
  152.   long int  usmUserAuthProtocol;
  153.   unsigned char *usmUserAuthKey;      long int usmUserAuthKeyLength;
  154.   long int  usmUserPrivProtocol;
  155.   unsigned char *usmUserPrivKey;      long int usmUserPrivKeyLength;
  156. };
  157. struct UsmUser {
  158.   unsigned char *engineID;     long int engineIDLength;
  159.   unsigned char *usmUserName;  long int usmUserNameLength;
  160.   unsigned char *securityName; long int securityNameLength;
  161.   long int  authProtocol;
  162.   unsigned char *authKey;      long int authKeyLength;
  163.   long int  privProtocol;
  164.   unsigned char *privKey;      long int privKeyLength;
  165. };
  166. struct UsmUserNameTableEntry {
  167.   OctetStr usmUserName;
  168.   OctetStr usmUserSecurityName;
  169.   long int  usmUserAuthProtocol;
  170.   long int  usmUserPrivProtocol;
  171.   unsigned char *authPassword;        long int authPasswordLength;
  172.   unsigned char *privPassword;        long int privPasswordLength;
  173. };
  174. //-----------[ async methods callback ]-----------------------------------
  175. typedef void (*usm_add_user_callback)(const OctetStr &engine_id,
  176.                                       const OctetStr &usm_user_name,
  177.                                       const OctetStr &usm_user_security_name,
  178.                                       const int auth_protocol,
  179.                                       const OctetStr &auth_key,
  180.                                       const int priv_protocol,
  181.                                       const OctetStr &priv_key);
  182. struct SecurityStateReference;
  183. class AuthPriv;
  184. class USMTimeTable;
  185. class USMUserNameTable;
  186. class USMUserTable;
  187. class v3MP;
  188. /**
  189.  * This is the class for the User Based Security Model.
  190.  *
  191.  * To add or delete users, the methods add_usm_user() and delete_usm_user()
  192.  * should be used.
  193.  *
  194.  * USM distinguishes between userName and securityName. The following is
  195.  * from section 2.1 of RFC3414:
  196.  *
  197.  * "userName: A string representing the name of the user.
  198.  *
  199.  *  securityName: A human-readable string representing the user in a format
  200.  *  that is Security Model independent. There is a one-to-one relationship *
  201.  *  between userName and securityName."
  202.  */
  203. class DLLOPT USM
  204. {
  205.   friend class v3MP;
  206. public:
  207.   /**
  208.    * Create an instance of the USM.
  209.    *
  210.    * @param engine_boots - The new value for the snmpEngineBoots counter
  211.    * @param engine_id    - The local snmp engine id
  212.    * @param v3_mp        - Pointer to the parent v3MP object.
  213.    * @param msg_id       - OUT: The initial value for the msgID
  214.    * @param result       - OUT: construct status, should be SNMPv3_USM_OK
  215.    */
  216.   USM(unsigned int engine_boots, const OctetStr &engine_id, const v3MP *v3_mp,
  217.       unsigned int *msg_id, int &result);
  218.   /**
  219.    * Destructor.
  220.    */
  221.   ~USM();
  222.   /**
  223.    * Enables the discovery mode of the USM, i.e. the USM accepts all messages
  224.    * with unknown engine ids and adds these engine ids to its tables.
  225.    */
  226.   void set_discovery_mode() { discovery_mode = true; };
  227.   /**
  228.    * Disables the discovery mode of the USM, i.e. the USM will not accept any
  229.    * message with an unknown engine id.
  230.    */
  231.   void unset_discovery_mode() { discovery_mode = false; };
  232.   /**
  233.    * Return TRUE if the USM discovery mode is enabled, FALSE else.
  234.    */
  235.   bool is_discovery_enabled() const { return discovery_mode; };
  236.   /**
  237.    * Add a new user to the usmUserNameTable. If the User is already known
  238.    * to the USM, the old entry is replaced.
  239.    * The USM will compute a userName for the given securityName, which
  240.    * will be the same as securityName (recommended).
  241.    *
  242.    * @param security_name - Unique securityName
  243.    * @param auth_protocol - Possible values are:
  244.    *                              SNMP_AUTHPROTOCOL_NONE,
  245.    *                              SNMP_AUTHPROTOCOL_HMACMD5,
  246.    *                              SNMP_AUTHPROTOCOL_HMACSHA
  247.    * @param priv_protocol - Possible values are:
  248.    *                              SNMP_PRIVPROTOCOL_NONE,
  249.    *                              SNMP_PRIVPROTOCOL_DES,
  250.    *                              SNMP_PRIVPROTOCOL_IDEA
  251.    * @param auth_password - Secret password for authentication
  252.    * @param priv_password - Secret password for privacy
  253.    *
  254.    * @return - SNMPv3_USM_OK or
  255.    *           SNMP_v3_USM_ERROR (memory error, not initialized)
  256.    */
  257.   int add_usm_user(const OctetStr& security_name,
  258.    const long int  auth_protocol,
  259.    const long int  priv_protocol,
  260.    const OctetStr& auth_password,
  261.    const OctetStr& priv_password);
  262.   /**
  263.    * Add a new user to the usmUserNameTable. If the userName is already known
  264.    * to the USM, the old entry is replaced.
  265.    *
  266.    * It is not recommended to add users with userName != securityName.
  267.    *
  268.    * @param  user_name     - Unique userName
  269.    * @param  security_name - Unique securityName
  270.    * @param  auth_protocol - Possible values are:
  271.    *                              SNMP_AUTHPROTOCOL_NONE,
  272.    *                              SNMP_AUTHPROTOCOL_HMACMD5,
  273.    *                              SNMP_AUTHPROTOCOL_HMACSHA
  274.    * @param  priv_protocol - Possible values are:
  275.    *                              SNMP_PRIVPROTOCOL_NONE,
  276.    *                              SNMP_PRIVPROTOCOL_DES,
  277.    *                              SNMP_PRIVPROTOCOL_IDEA
  278.    * @param  auth_password - Secret password for authentication
  279.    * @param  priv_password - Secret password for privacy
  280.    *
  281.    * @return - SNMPv3_USM_OK or
  282.    *           SNMP_v3_USM_ERROR (memory error, not initialized)
  283.    */
  284.   int add_usm_user(const OctetStr& user_name,
  285.    const OctetStr& security_name,
  286.    const long int  auth_protocol,
  287.    const long int  priv_protocol,
  288.    const OctetStr& auth_password,
  289.    const OctetStr& priv_password);
  290.   /**
  291.    * Add or replace a localized user in the USM table.
  292.    *
  293.    * This function uses build_localized_keys() to generate localized
  294.    * keys for the given passwords. Then it calls add_localized_user()
  295.    * to add/replace the localized entry for the user.
  296.    *
  297.    * The passwords are not stored, so no additonal engine id discovery
  298.    * is possible.
  299.    *
  300.    * @param user_name         - The name of the user (in the USM)
  301.    * @param security_name     - The securityName of the user, this name
  302.    *                                is the same for all securityModels
  303.    * @param auth_protocol     - Possible values are:
  304.    *                                SNMP_AUTHPROTOCOL_NONE,
  305.    *                                SNMP_AUTHPROTOCOL_HMACMD5,
  306.    *                                SNMP_AUTHPROTOCOL_HMACSHA,...
  307.    * @param priv_protocol     - Possible values are:
  308.    *                                SNMP_PRIVPROTOCOL_NONE,
  309.    *                                SNMP_PRIVPROTOCOL_DES,
  310.    *                                SNMP_PRIVPROTOCOL_IDEA,...
  311.    * @param  auth_password - Secret password for authentication
  312.    * @param  priv_password - Secret password for privacy
  313.    * @param engine_id         - The engineID, the key was localized with
  314.    *
  315.    * @return - SNMPv3_USM_OK
  316.    *           SNMP_v3_USM_ERROR (not initialized, no memory)
  317.    */
  318.   int add_usm_user(const OctetStr& user_name,
  319.    const OctetStr& security_name,
  320.    const long int  auth_protocol,
  321.    const long int  priv_protocol,
  322.    const OctetStr& auth_password,
  323.    const OctetStr& priv_password,
  324.    const OctetStr& engine_id);
  325.   int add_usm_user(const OctetStr& security_name,
  326.    const long int  auth_protocol,
  327.    const long int  priv_protocol,
  328.    const OctetStr& auth_password,
  329.    const OctetStr& priv_password,
  330.    const OctetStr& engine_id)
  331.     { return add_usm_user(security_name, security_name, auth_protocol,
  332.   priv_protocol, auth_password, priv_password,
  333.   engine_id); };
  334.   /**
  335.    * Delete all occurences of the user with the given security name
  336.    * from the USM.
  337.    *
  338.    * @param security_name - the securityName of the user
  339.    *
  340.    * @return - SNMPv3_USM_OK, SNMPv3_USM_ERROR (not initialized)
  341.    */
  342.   int delete_usm_user(const OctetStr& security_name);
  343.   /**
  344.    * Save all localized users into a file.
  345.    *
  346.    * @param file - filename including path
  347.    *
  348.    * @return SNMPv3_USM_ERROR, SNMPv3_USM_FILECREATE_ERROR,
  349.    *         SNMPv3_USM_FILERENAME_ERROR or SNMPv3_USM_OK
  350.    */
  351.   int save_localized_users(const char *file);
  352.   /**
  353.    * Load localized users from a file.
  354.    *
  355.    * @param file - filename including path
  356.    *
  357.    * @return SNMPv3_USM_ERROR, SNMPv3_USM_FILEOPEN_ERROR,
  358.    *         SNMPv3_USM_FILEREAD_ERROR or SNMPv3_USM_OK
  359.    */
  360.   int load_localized_users(const char *file);
  361.   /**
  362.    * Save all users with their passwords into a file.
  363.    *
  364.    * @param file - filename including path
  365.    *
  366.    * @return SNMPv3_USM_ERROR, SNMPv3_USM_FILECREATE_ERROR,
  367.    *         SNMPv3_USM_FILERENAME_ERROR or SNMPv3_USM_OK
  368.    */
  369.   int save_users(const char *file);
  370.   /**
  371.    * Load users with their passwords from a file.
  372.    *
  373.    * @param file - filename including path
  374.    *
  375.    * @return SNMPv3_USM_ERROR, SNMPv3_USM_FILEOPEN_ERROR,
  376.    *         SNMPv3_USM_FILEREAD_ERROR or SNMPv3_USM_OK
  377.    */
  378.   int load_users(const char *file);
  379.   /**
  380.    * Add or replace a localized user in the USM table. Use this method
  381.    * only, if you know what you are doing.
  382.    *
  383.    * @param engine_id         - The engineID, the key was localized with
  384.    * @param user_name         - The name of the user (in the USM)
  385.    * @param security_name     - The securityName of the user, this name
  386.    *                                is the same for all securityModels
  387.    * @param auth_protocol     - Possible values are:
  388.    *                                SNMP_AUTHPROTOCOL_NONE,
  389.    *                                SNMP_AUTHPROTOCOL_HMACMD5,
  390.    *                                SNMP_AUTHPROTOCOL_HMACSHA,...
  391.    * @param auth_key          - The key used for authentications
  392.    * @param priv_protocol     - Possible values are:
  393.    *                                SNMP_PRIVPROTOCOL_NONE,
  394.    *                                SNMP_PRIVPROTOCOL_DES,
  395.    *                                SNMP_PRIVPROTOCOL_IDEA,...
  396.    * @param priv_key          - The key used for privacy
  397.    *
  398.    * @return - SNMPv3_USM_OK
  399.    *           SNMP_v3_USM_ERROR (not initialized, no memory)
  400.    */
  401.   int add_localized_user(const OctetStr &engine_id,
  402.  const OctetStr &user_name,
  403.  const OctetStr &security_name,
  404.  const long auth_protocol,
  405.  const OctetStr &auth_key,
  406.  const long priv_protocol,
  407.  const OctetStr &priv_key);
  408.   /**
  409.    * Generate localized keys for the given params.
  410.    *
  411.    * The buffers for the keys should be of size SNMPv3_USM_MAX_KEY_LEN.
  412.    *
  413.    * @param engine_id - 
  414.    * @param auth_prot -
  415.    * @param priv_prot -
  416.    * @param auth_password     -
  417.    * @param auth_password_len -
  418.    * @param priv_password     -
  419.    * @param priv_password_len -
  420.    * @param auth_key     - allocated space for the authentication key
  421.    * @param auth_key_len - IN: length of the buffer, OUT: key length
  422.    * @param priv_key     - allocated space for the privacy key
  423.    * @param priv_key_len - IN: length of the buffer, OUT: key length
  424.    * @return SNMPv3_USM_OK, or USM error codes
  425.    */
  426.   int build_localized_keys(const OctetStr      &engine_id,
  427.    const int            auth_prot,
  428.    const int            priv_prot,
  429.    const unsigned char *auth_password,
  430.    const unsigned int   auth_password_len,
  431.    const unsigned char *priv_password,
  432.    const unsigned int   priv_password_len,
  433.    unsigned char *auth_key,
  434.    unsigned int  *auth_key_len,
  435.    unsigned char *priv_key,
  436.    unsigned int  *priv_key_len);
  437.   /**
  438.    * Delete all localized entries of this user from the usmUserTable.
  439.    *
  440.    * @param user_name - The userName that should be deleted
  441.    *
  442.    * @return - SNMPv3_USM_ERROR (not initialized),
  443.    *           SNMPv3_USM_OK (user deleted or not in table)
  444.    */
  445.   int delete_localized_user(const OctetStr& user_name);
  446.   /**
  447.    * Delete the entry with the given userName and engineID
  448.    * from the usmUserTable
  449.    *
  450.    * @param engine_id - The engineID
  451.    * @param user_name - The userName that should be deleted
  452.    *
  453.    * @return - SNMPv3_USM_ERROR (not initialized),
  454.    *           SNMPv3_USM_OK (user deleted or not in table)
  455.    */
  456.   int delete_localized_user(const OctetStr& engine_id,
  457.     const OctetStr& user_name);
  458.   /**
  459.    * Delete this engine id form all USM tables (users and engine time).
  460.    *
  461.    * @param engine_id - the engine id
  462.    *
  463.    * @return - SNMPv3_USM_ERROR (not initialized),
  464.    *           SNMPv3_USM_OK (entries deleted or not in table)
  465.    */
  466.   int remove_engine_id(const OctetStr &engine_id);
  467.   /**
  468.    * Delete the time information for the given engine id.
  469.    *
  470.    * @param engine_id - the engine id
  471.    *
  472.    * @return - SNMPv3_USM_ERROR (not initialized),
  473.    *           SNMPv3_USM_OK (entry deleted or not in table)
  474.    */
  475.   int remove_time_information(const OctetStr &engine_id);
  476.   /**
  477.    * Replace a localized key of the user and engineID in the
  478.    * usmUserTable.
  479.    *
  480.    * @param user_name     - The name of the user in the USM
  481.    * @param user_name_len - The length of the user name
  482.    * @param engine_id     - Change the localized key for the SNMP
  483.    *                        entity with this engine id
  484.    * @param engine_id_len - The length of the engine id
  485.    * @param new_key       - The new key
  486.    * @param new_key_len   - The length of the new key
  487.    * @param type_of_key   - AUTHKEY, OWNAUTHKEY, PRIVKEY or OWNPRIVKEY
  488.    *
  489.    * @return - SNMPv3_USM_ERROR (no such entry or not initialized),
  490.    *           SNMPv3_USM_OK
  491.    */
  492.    int update_key(const unsigned char* user_name, const long user_name_len,
  493.           const unsigned char* engine_id, const long engine_id_len,
  494.           const unsigned char* new_key,   const long new_key_len,
  495.           const int type_of_key);
  496.   /**
  497.    * Search for a user with the given securityName and engineID
  498.    * in the usmUserTable and return the entry. If no entry
  499.    * could be found, the usmUserNameTable is searched for the given
  500.    * securityName. If this table has an entry of this user, a
  501.    * localized entry is generated, added to the usmUserTable and
  502.    * returned to the caller.
  503.    *
  504.    * The caller has to call free_user() with the returned struct.
  505.    *
  506.    * @param engine_id         -
  507.    * @param security_name     -
  508.    *
  509.    * @return - a pointer to the structure if an entry could be found
  510.    *           or was generated, NULL for all errors
  511.    */
  512.   struct UsmUser *get_user(const OctetStr &engine_id,
  513.    const OctetStr &security_name);
  514.   /**
  515.    * Free the structure returned from get_user(OctetStr,OctetStr).
  516.    */
  517.   void free_user(struct UsmUser *&user);
  518.   /**
  519.    * Get the security name from a user name.
  520.    *
  521.    * @param user_name         -
  522.    * @param user_name_len     -
  523.    * @param security_name     - Buffer for the securityName
  524.    *
  525.    * @return - SNMPv3_USM_ERROR (not initialized, not found, buffer too small),
  526.    *           SNMPv3_USM_OK
  527.    */
  528.   int get_security_name(const unsigned char *user_name,
  529. const long int user_name_len,
  530. OctetStr &security_name);
  531.   /**
  532.    * Get the user name from a security name.
  533.    *
  534.    * @param user_name         - Buffer for the userName
  535.    * @param user_name_len     - Has to be set to the max length of the
  536.    *                            buffer. Is set to the length of the found
  537.    *                            securityName or to 0 if not found.
  538.    * @param security_name     -
  539.    * @param security_name_len -
  540.    *
  541.    * @return - SNMPv3_USM_ERROR (not initialized, not found, buffer too small),
  542.    *           SNMPv3_USM_OK
  543.    */
  544.   int get_user_name(unsigned char *user_name,
  545.     long int *user_name_len,
  546.     const unsigned char *security_name,
  547.     const long int security_name_len);
  548.   /**
  549.    * Prepare a key update in the USM. The following procedure is used: To
  550.    * prepare the key update, this function adds the neccessary variable
  551.    * bindings to the Pdu to do the key update on the target SNMP entity.
  552.    * The Pdu has to be sent to the target. If the key update on the target
  553.    * is successful, usmCommitKeyUpdate() has to be called to do the local key
  554.    * update. On failure usmAbortKeyUpdate() has to be called to free
  555.    * temporary ressources.
  556.    *
  557.    * @param securityName - The name of the user
  558.    * @param target       - A target to identify the SNMP entity on which the
  559.    *                       key will be updated
  560.    * @param newPassword  - The new password for the user
  561.    * @param pdu          - A PDU into which this funktion adds the VBs needed
  562.    *                       to change the keys on the target
  563.    * @param type         - Indicates how and which key should be chaned:
  564.    *                       possilbe values are: AUTHKEY, PRIVKEY and
  565.    *                       OWNAUTHKEY, OWNPRIVKEY.
  566.    * @param status       - The return status: SNMPv3_USM_OK or one of the
  567.    *                       error codes
  568.    *
  569.    * @return - A structure, that is needed to commit/abort the key update.
  570.    *           If an error occurs, the return value is NULL
  571.    */
  572.   struct UsmKeyUpdate* key_update_prepare(const OctetStr& securityName,
  573.   SnmpTarget& target,
  574.   const OctetStr& newPassword,
  575.   Pdu& pdu, int type,
  576.   int &status,
  577.   const OctetStr& oldpass = "",
  578.   const OctetStr& oldengid= "",
  579.   const OctetStr& newengid= "");
  580.   /**
  581.    * Abort the local key update.
  582.    *
  583.    * @param uku - The pointer returned by usmPrepareKeyUpdate()
  584.    */
  585.   void key_update_abort(struct UsmKeyUpdate *uku);
  586.   /**
  587.    * Commit the local key update.
  588.    *
  589.    * @param uku - The pointer returned by usmPrepareKeyUpdate()
  590.    * @param update_type - One of USM_KeyUpdate, USM_PasswordKeyUpdate,
  591.    *                      USM_PasswordAllKeyUpdate
  592.    *
  593.    * @return - SNMPv3_USM_ERROR, SNMPv3_USM_OK
  594.    */
  595.   int key_update_commit(struct UsmKeyUpdate *uku, int update_type);
  596.   /**
  597.    * Get a pointer to the AuthPriv object used by the USM.
  598.    *
  599.    */
  600.   AuthPriv *get_auth_priv();
  601.   /**
  602.    * Return engineBoots and engineTime for a given engineID
  603.    *
  604.    * @param  engine_id    - The engineID of the SNMP entity
  605.    * @param  engine_boots - OUT: boot counter (0 if not found)
  606.    * @param  engine_time  - OUT: engine time (0 if not found)
  607.    *
  608.    * @return - SNMPv3_USM_ERROR (not initialized),
  609.    *           SNMPv3_USM_OK (entry found, values are filled)
  610.    *           SNMPv3_USM_UNKNOWN_ENGINEID ( not found)
  611.    */
  612.   int get_time(const OctetStr &engine_id,
  613.        long int *engine_boots, long int *engine_time);
  614.   /**
  615.    * Return engineBoots and engineTime of the local snmp entity
  616.    *
  617.    * @param engine_boots - OUT: boot counter (0 if not found)
  618.    * @param engine_time  - OUT: engine time (0 if not found)
  619.    *
  620.    * @return - SNMPv3_USM_ERROR (not initialized),
  621.    *           SNMPv3_USM_OK (entry found, values are filled)
  622.    */
  623.   int get_local_time(long int *engine_boots, long int *engine_time) const;
  624.   /**
  625.    * Return the local snmp engine id.
  626.    */
  627.   const OctetStr& get_local_engine_id() const { return local_snmp_engine_id; };
  628.   /**
  629.    * Get the number of received messages with an unsupported securityLevel
  630.    *
  631.    * @return - usmStatsUnsupportedSecLevels
  632.    */
  633.   unsigned long get_stats_unsupported_sec_levels() const
  634.     { return usmStatsUnsupportedSecLevels; };
  635.   /**
  636.    * Get the number of received messages outside time window
  637.    *
  638.    * @return - usmStatsNotInTimeWindows
  639.    */
  640.   unsigned long get_stats_not_in_time_windows() const
  641.     { return usmStatsNotInTimeWindows; };
  642.   /**
  643.    * Get the number of received messages with a unknown userName
  644.    *
  645.    * @return - usmStatsUnknownUserNames
  646.    */
  647.   unsigned long get_stats_unknown_user_names() const
  648.     { return usmStatsUnknownUserNames; };
  649.   /**
  650.    * Get the number of received messages with a unknown engineID
  651.    *
  652.    * @return - usmStatsUnknownEngineIDs
  653.    */
  654.   unsigned long get_stats_unknown_engine_ids() const
  655.     { return usmStatsUnknownEngineIDs; };
  656.   /**
  657.    * Get the number of received messages with a wrong digest
  658.    *
  659.    * @return - usmStatsWrongDigests
  660.    */
  661.   unsigned long get_stats_wrong_digests() const
  662.     { return usmStatsWrongDigests; };
  663.   /**
  664.    * Get the number of received messages with decryption errors
  665.    *
  666.    * @return - usmStatsDecryptionErrors
  667.    */
  668.   unsigned long get_stats_decryption_errors() const
  669.     { return usmStatsDecryptionErrors; };
  670.   //@{
  671.   /**
  672.    * Increase the stats counter. Should only be used by agent++.
  673.    */
  674.   void inc_stats_unsupported_sec_levels();
  675.   void inc_stats_not_in_time_windows();
  676.   void inc_stats_unknown_user_names();
  677.   void inc_stats_unknown_engine_ids();
  678.   void inc_stats_wrong_digests();
  679.   void inc_stats_decryption_errors();
  680.   //@}
  681.   /**
  682.    * Lock the UsmUserNameTable for access through peek_first_user()
  683.    * and peek_next_user().
  684.    */
  685.   void lock_user_name_table();
  686.   /**
  687.    * Get a const pointer to the first entry of the UsmUserNameTable.
  688.    *
  689.    * @note Use lock_user_name_table() and unlock_user_name_table()
  690.    *       for thread safety.
  691.    */
  692.   const UsmUserNameTableEntry *peek_first_user();
  693.   /**
  694.    * Get a const pointer to the next entry of the UsmUserNameTable.
  695.    *
  696.    * @note Use lock_user_name_table() and unlock_user_name_table()
  697.    *       for thread safety.
  698.    */
  699.   const UsmUserNameTableEntry *peek_next_user(const UsmUserNameTableEntry *e);
  700.   /**
  701.    * Unlock the UsmUserNameTable after access through peek_first_user()
  702.    * and peek_next_user().
  703.    */
  704.   void unlock_user_name_table();
  705.   /**
  706.    * Lock the UsmUserTable for access through peek_first_luser()
  707.    * and peek_next_luser().
  708.    */
  709.   void lock_user_table();
  710.   /**
  711.    * Get a const pointer to the first entry of the UsmUserTable.
  712.    *
  713.    * @note Use lock_user_table() and unlock_user_table()
  714.    *       for thread safety.
  715.    */
  716.   const UsmUserTableEntry *peek_first_luser();
  717.   /**
  718.    * Get a const pointer to the next entry of the UsmUserTable.
  719.    *
  720.    * @note Use lock_user_table() and unlock_user_table()
  721.    *       for thread safety.
  722.    */
  723.   const UsmUserTableEntry *peek_next_luser(const UsmUserTableEntry *e);
  724.   /**
  725.    * Unlock the UsmUserTable after access through peek_first_luser()
  726.    * and peek_next_luser().
  727.    */
  728.   void unlock_user_table();
  729.   /**
  730.    * for v3MP:
  731.    *
  732.    * Delete the pointers within the structure and the structure
  733.    * itself.
  734.    *
  735.    * @param ssr - The structure that should be deleted.
  736.    */
  737.   void delete_sec_state_reference(struct SecurityStateReference *ssr);
  738.   /**
  739.    * Protected (for agent++):
  740.    *
  741.    * Get the user at the specified position of the usmUserTable.
  742.    *
  743.    * The returned pointer must NOT be deleted!
  744.    *
  745.    * @note lock_user_table() and unlock_user_table() must be used
  746.    *       for thread synchronization.
  747.    *
  748.    * @param number - get the entry at position number (1...)
  749.    *
  750.    * @return - a pointer to the structure or NULL if number is out
  751.    *           of range
  752.    */
  753.   const struct UsmUserTableEntry *get_user(int number);
  754.   /**
  755.    * Get the properties of the specified user.
  756.    *
  757.    * The returned pointer must NOT be deleted!
  758.    *
  759.    * @note lock_user_table() and unlock_user_table() must be used
  760.    *       for thread synchronization.
  761.    *
  762.    * @param security_name - The security name of the user
  763.    *
  764.    * @return - a pointer to the structure or NULL if number is out
  765.    *           of range
  766.    */
  767.   const struct UsmUserNameTableEntry *get_user(const OctetStr &security_name);
  768.   /**
  769.    * Protected (for agent++):
  770.    *
  771.    * Get the number of elements in the usmUserTable
  772.    *
  773.    * @note lock_user_table() and unlock_user_table() must be used
  774.    *       for thread synchronization.
  775.    *
  776.    * @return - number of elements
  777.    */
  778.   int get_user_count() const;
  779.   /**
  780.    * Protected (for agent++)
  781.    *
  782.    * Register a callback function that is called if a new localized user
  783.    * has been added to the usm user table
  784.    */
  785.   void add_user_added_callback(const usm_add_user_callback cb);
  786.  protected:
  787.   /**
  788.    * Get a new security state reference (for v3MP).
  789.    *
  790.    * @return - A newly created security state reference.
  791.    */
  792.   struct SecurityStateReference *get_new_sec_state_reference();
  793.   /**
  794.    * Generate a complete message that is ready to send to the target.
  795.    *
  796.    * @param globalData       - Buffer containing the serialized globalData,
  797.    *                           ready to be copied into the wholeMsg
  798.    * @param globalDataLength - The length of this buffer
  799.    * @param maxMessageSize   - The maximum message size
  800.    * @param securityEngineID - The engineID of the authoritative SNMP entity
  801.    * @param securityName     - The name of the user
  802.    * @param securityLevel    - The security Level for this Message
  803.    * @param scopedPDU        - Buffer containing the serialized scopedPDU,
  804.    *                           ready to be copied into the wholeMsg
  805.    * @param scopedPDULength  - The length of this Buffer
  806.    * @param securityStateReference - The reference that was generated when
  807.    *                                 the request was parsed. For request, this
  808.    *                                 param has to be NULL. The reference
  809.    *                                 is deleted by this function.
  810.    * @param wholeMsg         - OUT: the buffer for the whole message
  811.    * @param wholeMsgLength   - IN:  lenght of the buffer.
  812.    *                           OUT: length of the generated message
  813.    *
  814.    * @return - SNMPv3_USM_OK on success. See snmperrs.h for the error codes
  815.    *           of the USM.
  816.    */
  817.   int generate_msg(
  818.              unsigned char *globalData,       // message header, admin data
  819.              int globalDataLength,
  820.              int maxMessageSize,              // of the sending SNMP entity
  821.              const OctetStr &securityEngineID,// authoritative SNMP entity
  822.              const OctetStr &securityName,    // on behalf of this principal
  823.              int  securityLevel,              // Level of Security requested
  824.              unsigned char  *scopedPDU,       // message (plaintext) payload
  825.              int scopedPDULength,
  826.              struct SecurityStateReference *securityStateReference,
  827.              unsigned char *wholeMsg,         // OUT complete generated message
  828.              int *wholeMsgLength);            // OUT length of generated message
  829.   /**
  830.    * Parse a received message.
  831.    *
  832.    * @param maxMessageSize         - The maximum message size of the snding
  833.    *                                 SNMP entity.
  834.    * @param securityParameters     - The security parameters as received
  835.    * @param securityParametersLength - The length of the security parameters
  836.    * @param securityParametersPosition - The position of the security
  837.    *                                     parameters in the message
  838.    * @param securityLevel          - The securityLevel of the message
  839.    * @param wholeMsg               - The buffer with the whole message
  840.    * @param wholeMsgLength         - The length of the whole message
  841.    * @param msgData                - The buffer with the messageData
  842.    * @param msgDataLength          - The length of the messageData buffer
  843.    * @param security_engine_id     - OUT: the authoritative engineID
  844.    * @param security_name          - OUT: the name of the user
  845.    * @param scopedPDU              - OUT: buffer containing the scopedPDU
  846.    * @param scopedPDULength        - IN: length of the buffer
  847.    *                                 OUT: length of the scopedPDU
  848.    * @param maxSizeResponseScopedPDU - OUT: maximum size for a scopedPDU in a
  849.    *                                        response message
  850.    * @param securityStateReference - OUT: the securityStateReference
  851.    * @param fromAddress            - IN: Address of the sender
  852.    *
  853.    * @return - SNMPv3_USM_OK on success. See snmperrs.h for the error codes
  854.    *           of the USM.
  855.    */
  856.   int process_msg(
  857.            int maxMessageSize,                // of the sending SNMP entity
  858.            unsigned char *securityParameters, // for the received message
  859.            int securityParametersLength,
  860.            int securityParametersPosition,
  861.            long int securityLevel,            // Level of Security
  862.            unsigned char *wholeMsg,           // as received on the wire
  863.            int wholeMsgLength,                // length as received on the wire
  864.            unsigned char *msgData,
  865.            int msgDataLength,
  866.    OctetStr &security_engine_id,      // authoritative SNMP entity
  867.    OctetStr &security_name,           //identification of the principal
  868.            unsigned char *scopedPDU,          // message (plaintext) payload
  869.            int *scopedPDULength,
  870.            long *maxSizeResponseScopedPDU,// maximum size of the Response PDU
  871.            struct SecurityStateReference *securityStateReference,
  872.                                             // reference to security state
  873.                                             // information, needed for response
  874.            const UdpAddress &fromAddress);  // Address of the sender
  875. private:
  876.   /**
  877.    * Delete the pointers in the structure and set all values to 0/NULL.
  878.    *
  879.    * @param usp - The structure that should be deleted
  880.    */
  881.   void delete_sec_parameters( struct UsmSecurityParameters *usp);
  882.   /**
  883.    * Serialize the given values into the buffer according to the BER.
  884.    *
  885.    *  UsmSecurityParameters ::=
  886.    *      SEQUENCE {
  887.    *      -- global User-based security parameters
  888.    *          msgAuthoritativeEngineID     OCTET STRING (5..32)
  889.    *          msgAuthoritativeEngineBoots  INTEGER (0..2147483647),
  890.    *          msgAuthoritativeEngineTime   INTEGER (0..2147483647),
  891.    *          msgUserName                  OCTET STRING (SIZE(0..32)),
  892.    *       -- authentication protocol specific parameters
  893.    *          msgAuthenticationParameters  OCTET STRING,
  894.    *       -- privacy protocol specific parameters
  895.    *          msgPrivacyParameters         OCTET STRING
  896.    *      }
  897.    *
  898.    * @param outBuf    - buffer for the serialized values
  899.    * @param maxLength - before call: length of the buffer
  900.    *                    after call: bytes left in the buffer
  901.    * @param sp        - the values to serialize
  902.    * @param position  - after call: points to the first byte of the
  903.    *                    field for the authentication parameter
  904.    *
  905.    * @return - a pointer to the first free byte in the buffer,
  906.    *           NULL on error
  907.    */
  908.   unsigned char *build_sec_params(unsigned char *outBuf, int *maxLength,
  909.                                   struct UsmSecurityParameters sp,
  910.                                   int *position);
  911.   /**
  912.    * Serialize the given values acording to the BER into the
  913.    * buffer. On success, the buffer contains a valid SNMPv3 message.
  914.    *
  915.    * @param outBuf             - buffer for the serialized values
  916.    * @param maxLength          - before call: length of the buffer
  917.    *                             after call: bytes left in the buffer
  918.    * @param globalData         - Buffer that contains the serialized globalData
  919.    * @param globalDataLength   - The length of this buffer
  920.    * @param positionAuthPar    - after call: points to the first byte of the
  921.    *                             field for the authentication parameter
  922.    * @param securityParameters - The security parameters
  923.    * @param msgData            - Buffer that contains the serialized msgData
  924.    * @param msgDataLength      - The length of this buffer
  925.    *
  926.    * @return - a pointer to the first free byte in the buffer,
  927.    * NULL on error
  928.    */
  929.   unsigned char *build_whole_msg(
  930.                       unsigned char *outBuf, int *maxLength,
  931.                       unsigned char *globalData, long int globalDataLength,
  932.                       int *positionAuthPar,
  933.                       struct UsmSecurityParameters  securityParameters,
  934.                       unsigned char *msgData, long int msgDataLength);
  935.   /**
  936.    * Delete the pointers in the structure
  937.    *
  938.    * @param user - The structure that should be deleted
  939.    */
  940.   inline void delete_user_ptr(struct UsmUser *user);
  941.  private:
  942.   OctetStr local_snmp_engine_id; ///< local snmp engine id
  943.   const v3MP *v3mp;          ///< Pointer to the v3MP that created this object
  944.   // 0: don't accept messages from hosts with a unknown engine id
  945.   bool discovery_mode;
  946.    // MIB Counters
  947.    unsigned int usmStatsUnsupportedSecLevels;
  948.    unsigned int usmStatsNotInTimeWindows;
  949.    unsigned int usmStatsUnknownUserNames;
  950.    unsigned int usmStatsUnknownEngineIDs;
  951.    unsigned int usmStatsWrongDigests;
  952.    unsigned int usmStatsDecryptionErrors;
  953.    // the instance of AuthPriv
  954.    AuthPriv *auth_priv;
  955.    // this table contains time values of contacted snmp entities
  956.    USMTimeTable *usm_time_table;
  957.    // Users that are known but not localized to a engine ID
  958.    USMUserNameTable *usm_user_name_table;
  959.    // Table containing localized Users ready to use
  960.    USMUserTable *usm_user_table;
  961.    // Callback for agent++ to indicate new users in usm tables
  962.    usm_add_user_callback usm_add_user_cb;
  963. };
  964. // only for compatibility do not use these values and functions:
  965. // =============================================================
  966. #define SecurityLevel_noAuthNoPriv    SNMP_SECURITY_LEVEL_NOAUTH_NOPRIV
  967. #define SecurityLevel_authNoPriv      SNMP_SECURITY_LEVEL_AUTH_NOPRIV
  968. #define SecurityLevel_authPriv        SNMP_SECURITY_LEVEL_AUTH_PRIV
  969. #define SNMPv3_usmNoAuthProtocol      SNMP_AUTHPROTOCOL_NONE
  970. #define SNMPv3_usmHMACMD5AuthProtocol SNMP_AUTHPROTOCOL_HMACMD5
  971. #define SNMPv3_usmHMACSHAAuthProtocol SNMP_AUTHPROTOCOL_HMACSHA
  972. #define SNMPv3_usmNoPrivProtocol     SNMP_PRIVPROTOCOL_NONE
  973. #define SNMPv3_usmDESPrivProtocol    SNMP_PRIVPROTOCOL_DES
  974. #define SNMPv3_usmIDEAPrivProtocol   SNMP_PRIVPROTOCOL_IDEA
  975. #define SNMPv3_usmAES128PrivProtocol SNMP_PRIVPROTOCOL_AES128
  976. #define SNMPv3_usmAES192PrivProtocol SNMP_PRIVPROTOCOL_AES192
  977. #define SNMPv3_usmAES256PrivProtocol SNMP_PRIVPROTOCOL_AES256
  978. #ifdef SNMP_PP_NAMESPACE
  979. } // end of namespace Snmp_pp
  980. #endif 
  981. #endif // _SNMPv3
  982. #endif