text: /*
   * snmpusm.h
   *
   * Header file for USM support.
   */
  
  #ifndef SNMPUSM_H
  #define SNMPUSM_H
  
  #include <net-snmp/library/callback.h>
  
  #ifdef __cplusplus
  extern          "C" {
  #endif
  
  #define WILDCARDSTRING "*"
  
      /*
       * General.
       */
  #define USM_MAX_ID_LENGTH		1024    /* In bytes. */
  #define USM_MAX_SALT_LENGTH		128     /* In BITS. */
  #define USM_DES_SALT_LENGTH		64      /* In BITS. */
  #define USM_AES_SALT_LENGTH		128     /* In BITS. */
  #define USM_MAX_KEYEDHASH_LENGTH	128     /* In BITS. */
  
  #define USM_TIME_WINDOW			150
  #define USM_MD5_AND_SHA_AUTH_LEN        12      /* bytes */
  #define USM_MAX_AUTHSIZE                USM_MD5_AND_SHA_AUTH_LEN
  
  #define USM_SEC_MODEL_NUMBER            SNMP_SEC_MODEL_USM
  
      /*
       * Structures.
       */
      struct usmStateReference {
          char           *usr_name;
          size_t          usr_name_length;
          u_char         *usr_engine_id;
          size_t          usr_engine_id_length;
          oid            *usr_auth_protocol;
          size_t          usr_auth_protocol_length;
          u_char         *usr_auth_key;
          size_t          usr_auth_key_length;
          oid            *usr_priv_protocol;
          size_t          usr_priv_protocol_length;
          u_char         *usr_priv_key;
          size_t          usr_priv_key_length;
          u_int           usr_sec_level;
      };
  
  
      /*
       * struct usmUser: a structure to represent a given user in a list 
       */
      /*
       * Note: Any changes made to this structure need to be reflected in
       * the following functions: 
       */
  
      struct usmUser;
      struct usmUser {
          u_char         *engineID;
          size_t          engineIDLen;
          char           *name;
          char           *secName;
          oid            *cloneFrom;
          size_t          cloneFromLen;
          oid            *authProtocol;
          size_t          authProtocolLen;
          u_char         *authKey;
          size_t          authKeyLen;
          oid            *privProtocol;
          size_t          privProtocolLen;
          u_char         *privKey;
          size_t          privKeyLen;
          u_char         *userPublicString;
          size_t          userPublicStringLen;
          int             userStatus;
          int             userStorageType;
         /* these are actually DH * pointers but only if openssl is avail. */
          void           *usmDHUserAuthKeyChange;
          void           *usmDHUserPrivKeyChange;
          struct usmUser *next;
          struct usmUser *prev;
      };
  
  
  
      /*
       * Prototypes.
       */
      struct usmStateReference *usm_malloc_usmStateReference(void);
  
      void            usm_free_usmStateReference(void *old);
  
      int             usm_set_usmStateReference_name(struct usmStateReference
                                                     *ref, char *name,
                                                     size_t name_len);
  
      int             usm_set_usmStateReference_engine_id(struct
                                                          usmStateReference
                                                          *ref,
                                                          u_char * engine_id,
                                                          size_t
                                                          engine_id_len);
  
      int             usm_set_usmStateReference_auth_protocol(struct
                                                              usmStateReference
                                                              *ref,
                                                              oid *
                                                              auth_protocol,
                                                              size_t
                                                              auth_protocol_len);
  
      int             usm_set_usmStateReference_auth_key(struct
                                                         usmStateReference
                                                         *ref,
                                                         u_char * auth_key,
                                                         size_t
                                                         auth_key_len);
  
      int             usm_set_usmStateReference_priv_protocol(struct
                                                              usmStateReference
                                                              *ref,
                                                              oid *
                                                              priv_protocol,
                                                              size_t
                                                              priv_protocol_len);
  
      int             usm_set_usmStateReference_priv_key(struct
                                                         usmStateReference
                                                         *ref,
                                                         u_char * priv_key,
                                                         size_t
                                                         priv_key_len);
  
      int             usm_set_usmStateReference_sec_level(struct
                                                          usmStateReference
                                                          *ref,
                                                          int sec_level);
      int             usm_clone_usmStateReference(struct usmStateReference *from,
                                                      struct usmStateReference **to);
  
  
  #ifdef NETSNMP_ENABLE_TESTING_CODE
      void            emergency_print(u_char * field, u_int length);
  #endif
  
      int             asn_predict_int_length(int type, long number,
                                             size_t len);
  
      int             asn_predict_length(int type, u_char * ptr,
                                         size_t u_char_len);
  
      int             usm_set_salt(u_char * iv,
                                   size_t * iv_length,
                                   u_char * priv_salt,
                                   size_t priv_salt_length,
                                   u_char * msgSalt);
  
      int             usm_parse_security_parameters(u_char * secParams,
                                                    size_t remaining,
                                                    u_char * secEngineID,
                                                    size_t * secEngineIDLen,
                                                    u_int * boots_uint,
                                                    u_int * time_uint,
                                                    char *secName,
                                                    size_t * secNameLen,
                                                    u_char * signature,
                                                    size_t *
                                                    signature_length,
                                                    u_char * salt,
                                                    size_t * salt_length,
                                                    u_char ** data_ptr);
  
      int             usm_check_and_update_timeliness(u_char * secEngineID,
                                                      size_t secEngineIDLen,
                                                      u_int boots_uint,
                                                      u_int time_uint,
                                                      int *error);
  
      SecmodSessionCallback usm_open_session;
      SecmodOutMsg    usm_secmod_generate_out_msg;
      SecmodOutMsg    usm_secmod_generate_out_msg;
      SecmodInMsg     usm_secmod_process_in_msg;
      int             usm_generate_out_msg(int, u_char *, size_t, int, int,
                                           u_char *, size_t, char *, size_t,
                                           int, u_char *, size_t, void *,
                                           u_char *, size_t *, u_char **,
                                           size_t *);
      int             usm_rgenerate_out_msg(int, u_char *, size_t, int, int,
                                            u_char *, size_t, char *, size_t,
                                            int, u_char *, size_t, void *,
                                            u_char **, size_t *, size_t *);
  
      int             usm_process_in_msg(int, size_t, u_char *, int, int,
                                         u_char *, size_t, u_char *,
                                         size_t *, char *, size_t *,
                                         u_char **, size_t *, size_t *,
                                         void **, netsnmp_session *, u_char);
  
      int             usm_check_secLevel(int level, struct usmUser *user);
      NETSNMP_IMPORT
      struct usmUser *usm_get_userList(void);
      NETSNMP_IMPORT
      struct usmUser *usm_get_user(u_char * engineID, size_t engineIDLen,
                                   char *name);
      struct usmUser *usm_get_user_from_list(u_char * engineID,
                                             size_t engineIDLen, char *name,
                                             struct usmUser *userList,
                                             int use_default);
      NETSNMP_IMPORT
      struct usmUser *usm_add_user(struct usmUser *user);
      struct usmUser *usm_add_user_to_list(struct usmUser *user,
                                           struct usmUser *userList);
      NETSNMP_IMPORT
      struct usmUser *usm_free_user(struct usmUser *user);
      NETSNMP_IMPORT
      struct usmUser *usm_create_user(void);
      NETSNMP_IMPORT
      struct usmUser *usm_create_initial_user(const char *name,
                                              const oid * authProtocol,
                                              size_t authProtocolLen,
                                              const oid * privProtocol,
                                              size_t privProtocolLen);
      NETSNMP_IMPORT
      struct usmUser *usm_cloneFrom_user(struct usmUser *from,
                                         struct usmUser *to);
      NETSNMP_IMPORT
      struct usmUser *usm_remove_user(struct usmUser *user);
      struct usmUser *usm_remove_user_from_list(struct usmUser *user,
                                                struct usmUser **userList);
      char           *get_objid(char *line, oid ** optr, size_t * len);
      NETSNMP_IMPORT
      void            usm_save_users(const char *token, const char *type);
      void            usm_save_users_from_list(struct usmUser *user,
                                               const char *token,
                                               const char *type);
      void            usm_save_user(struct usmUser *user, const char *token,
                                    const char *type);
      NETSNMP_IMPORT
      SNMPCallback    usm_store_users;
      struct usmUser *usm_read_user(const char *line);
      NETSNMP_IMPORT
      void            usm_parse_config_usmUser(const char *token,
                                               char *line);
  
      void            usm_set_password(const char *token, char *line);
      NETSNMP_IMPORT
      void            usm_set_user_password(struct usmUser *user,
                                            const char *token, char *line);
      void            init_usm(void);
      NETSNMP_IMPORT
      void            init_usm_conf(const char *app);
      int             init_usm_post_config(int majorid, int minorid,
                                           void *serverarg, void *clientarg);
      int             deinit_usm_post_config(int majorid, int minorid, void *serverarg,
  					   void *clientarg);
      NETSNMP_IMPORT
      void            clear_user_list(void);
  
  #ifdef __cplusplus
  }
  #endif
  #endif                          /* SNMPUSM_H */
  