Blame include/net-snmp/library/snmpusm.h

Packit fcad23
/*
Packit fcad23
 * snmpusm.h
Packit fcad23
 *
Packit fcad23
 * Header file for USM support.
Packit fcad23
 *
Packit fcad23
 * Portions of this file are copyrighted by:
Packit fcad23
 * Copyright (c) 2016 VMware, Inc. All rights reserved.
Packit fcad23
 * Use is subject to license terms specified in the COPYING file
Packit fcad23
 * distributed with the Net-SNMP package.
Packit fcad23
 */
Packit fcad23
Packit fcad23
#ifndef SNMPUSM_H
Packit fcad23
#define SNMPUSM_H
Packit fcad23
Packit fcad23
#include <net-snmp/library/callback.h>
Packit fcad23
Packit fcad23
#ifdef __cplusplus
Packit fcad23
extern          "C" {
Packit fcad23
#endif
Packit fcad23
Packit fcad23
#define WILDCARDSTRING "*"
Packit fcad23
Packit fcad23
    /*
Packit fcad23
     * General.
Packit fcad23
     */
Packit fcad23
#define USM_MAX_ID_LENGTH		1024    /* In bytes. */
Packit fcad23
#define USM_MAX_SALT_LENGTH		128     /* In BITS. */
Packit fcad23
#define USM_DES_SALT_LENGTH		64      /* In BITS. */
Packit fcad23
#define USM_AES_SALT_LENGTH		128     /* In BITS. */
Packit fcad23
#define USM_MAX_KEYEDHASH_LENGTH	128     /* In BITS. */
Packit fcad23
Packit fcad23
#define USM_TIME_WINDOW			150
Packit fcad23
#define USM_MD5_AND_SHA_AUTH_LEN        12      /* bytes */
Packit fcad23
#define USM_HMAC128SHA224_AUTH_LEN      16      /* OPTIONAL */
Packit fcad23
#define USM_HMAC192SHA256_AUTH_LEN      24      /* MUST */
Packit fcad23
#define USM_HMAC256SHA384_AUTH_LEN      32      /* OPTIONAL */
Packit fcad23
#define USM_HMAC384SHA512_AUTH_LEN      48      /* SHOULD */
Packit fcad23
#define USM_MAX_AUTHSIZE                USM_HMAC384SHA512_AUTH_LEN
Packit fcad23
Packit fcad23
#define USM_SEC_MODEL_NUMBER            SNMP_SEC_MODEL_USM
Packit fcad23
Packit fcad23
    /*
Packit fcad23
     * Structures.
Packit fcad23
     */
Packit fcad23
    struct usmStateReference {
Packit Service 1b8caa
        int             refcnt;
Packit fcad23
        char           *usr_name;
Packit fcad23
        size_t          usr_name_length;
Packit fcad23
        u_char         *usr_engine_id;
Packit fcad23
        size_t          usr_engine_id_length;
Packit fcad23
        oid            *usr_auth_protocol;
Packit fcad23
        size_t          usr_auth_protocol_length;
Packit fcad23
        u_char         *usr_auth_key;
Packit fcad23
        size_t          usr_auth_key_length;
Packit fcad23
        oid            *usr_priv_protocol;
Packit fcad23
        size_t          usr_priv_protocol_length;
Packit fcad23
        u_char         *usr_priv_key;
Packit fcad23
        size_t          usr_priv_key_length;
Packit fcad23
        u_int           usr_sec_level;
Packit fcad23
    };
Packit fcad23
Packit fcad23
Packit fcad23
    /*
Packit fcad23
     * struct usmUser: a structure to represent a given user in a list 
Packit fcad23
     */
Packit fcad23
    /*
Packit fcad23
     * Note: Any changes made to this structure need to be reflected in
Packit fcad23
     * the following functions: 
Packit fcad23
     */
Packit fcad23
Packit fcad23
    struct usmUser;
Packit fcad23
    struct usmUser {
Packit fcad23
        u_int          flags;
Packit fcad23
        u_char         *engineID;
Packit fcad23
        size_t          engineIDLen;
Packit fcad23
        char           *name;
Packit fcad23
        char           *secName;
Packit fcad23
        oid            *cloneFrom;
Packit fcad23
        size_t          cloneFromLen;
Packit fcad23
        oid            *authProtocol;
Packit fcad23
        size_t          authProtocolLen;
Packit fcad23
        u_char         *authKey;
Packit fcad23
        size_t          authKeyLen;
Packit fcad23
        u_char         *authKeyKu;
Packit fcad23
        size_t          authKeyKuLen;
Packit fcad23
        oid            *privProtocol;
Packit fcad23
        size_t          privProtocolLen;
Packit fcad23
        u_char         *privKeyKu;
Packit fcad23
        size_t          privKeyKuLen;
Packit fcad23
        u_char         *privKey;
Packit fcad23
        size_t          privKeyLen;
Packit fcad23
        u_char         *userPublicString;
Packit fcad23
        size_t          userPublicStringLen;
Packit fcad23
        int             userStatus;
Packit fcad23
        int             userStorageType;
Packit fcad23
       /* these are actually DH * pointers but only if openssl is avail. */
Packit fcad23
        void           *usmDHUserAuthKeyChange;
Packit fcad23
        void           *usmDHUserPrivKeyChange;
Packit fcad23
        struct usmUser *next;
Packit fcad23
        struct usmUser *prev;
Packit fcad23
    };
Packit fcad23
Packit fcad23
#define USMUSER_FLAG_KEEP_MASTER_KEY             0x01
Packit fcad23
Packit fcad23
Packit fcad23
    /*
Packit fcad23
     * Prototypes.
Packit fcad23
     */
Packit fcad23
    struct usmStateReference *usm_malloc_usmStateReference(void);
Packit fcad23
Packit fcad23
    void            usm_free_usmStateReference(void *old);
Packit fcad23
Packit fcad23
    int             usm_set_usmStateReference_name(struct usmStateReference
Packit fcad23
                                                   *ref, char *name,
Packit fcad23
                                                   size_t name_len);
Packit fcad23
Packit fcad23
    int             usm_set_usmStateReference_engine_id(struct
Packit fcad23
                                                        usmStateReference
Packit fcad23
                                                        *ref,
Packit fcad23
                                                        u_char * engine_id,
Packit fcad23
                                                        size_t
Packit fcad23
                                                        engine_id_len);
Packit fcad23
Packit fcad23
    int             usm_set_usmStateReference_auth_protocol(struct
Packit fcad23
                                                            usmStateReference
Packit fcad23
                                                            *ref,
Packit fcad23
                                                            oid *
Packit fcad23
                                                            auth_protocol,
Packit fcad23
                                                            size_t
Packit fcad23
                                                            auth_protocol_len);
Packit fcad23
Packit fcad23
    int             usm_set_usmStateReference_auth_key(struct
Packit fcad23
                                                       usmStateReference
Packit fcad23
                                                       *ref,
Packit fcad23
                                                       u_char * auth_key,
Packit fcad23
                                                       size_t
Packit fcad23
                                                       auth_key_len);
Packit fcad23
Packit fcad23
    int             usm_set_usmStateReference_priv_protocol(struct
Packit fcad23
                                                            usmStateReference
Packit fcad23
                                                            *ref,
Packit fcad23
                                                            oid *
Packit fcad23
                                                            priv_protocol,
Packit fcad23
                                                            size_t
Packit fcad23
                                                            priv_protocol_len);
Packit fcad23
Packit fcad23
    int             usm_set_usmStateReference_priv_key(struct
Packit fcad23
                                                       usmStateReference
Packit fcad23
                                                       *ref,
Packit fcad23
                                                       u_char * priv_key,
Packit fcad23
                                                       size_t
Packit fcad23
                                                       priv_key_len);
Packit fcad23
Packit fcad23
    int             usm_set_usmStateReference_sec_level(struct
Packit fcad23
                                                        usmStateReference
Packit fcad23
                                                        *ref,
Packit fcad23
                                                        int sec_level);
Packit fcad23
    int             usm_clone_usmStateReference(struct usmStateReference *from,
Packit fcad23
                                                    struct usmStateReference **to);
Packit fcad23
Packit fcad23
Packit fcad23
#ifdef NETSNMP_ENABLE_TESTING_CODE
Packit fcad23
    void            emergency_print(u_char * field, u_int length);
Packit fcad23
#endif
Packit fcad23
Packit fcad23
    int             asn_predict_int_length(int type, long number,
Packit fcad23
                                           size_t len);
Packit fcad23
Packit fcad23
    int             asn_predict_length(int type, u_char * ptr,
Packit fcad23
                                       size_t u_char_len);
Packit fcad23
Packit fcad23
    int             usm_set_salt(u_char * iv,
Packit fcad23
                                 size_t * iv_length,
Packit fcad23
                                 u_char * priv_salt,
Packit fcad23
                                 size_t priv_salt_length,
Packit fcad23
                                 u_char * msgSalt);
Packit fcad23
Packit fcad23
    NETSNMP_IMPORT
Packit fcad23
    int             usm_extend_user_kul(struct usmUser *user,
Packit fcad23
                                        u_int privKeyBufSize);
Packit fcad23
Packit fcad23
    int             usm_parse_security_parameters(u_char * secParams,
Packit fcad23
                                                  size_t remaining,
Packit fcad23
                                                  u_char * secEngineID,
Packit fcad23
                                                  size_t * secEngineIDLen,
Packit fcad23
                                                  u_int * boots_uint,
Packit fcad23
                                                  u_int * time_uint,
Packit fcad23
                                                  char *secName,
Packit fcad23
                                                  size_t * secNameLen,
Packit fcad23
                                                  u_char * signature,
Packit fcad23
                                                  size_t *
Packit fcad23
                                                  signature_length,
Packit fcad23
                                                  u_char * salt,
Packit fcad23
                                                  size_t * salt_length,
Packit fcad23
                                                  u_char ** data_ptr);
Packit fcad23
Packit fcad23
    int             usm_check_and_update_timeliness(u_char * secEngineID,
Packit fcad23
                                                    size_t secEngineIDLen,
Packit fcad23
                                                    u_int boots_uint,
Packit fcad23
                                                    u_int time_uint,
Packit fcad23
                                                    int *error);
Packit fcad23
Packit fcad23
    SecmodSessionCallback usm_open_session;
Packit fcad23
    SecmodOutMsg    usm_secmod_generate_out_msg;
Packit fcad23
    SecmodOutMsg    usm_secmod_generate_out_msg;
Packit fcad23
    SecmodInMsg     usm_secmod_process_in_msg;
Packit fcad23
    int             usm_generate_out_msg(int, u_char *, size_t, int, int,
Packit fcad23
                                         u_char *, size_t, char *, size_t,
Packit fcad23
                                         int, u_char *, size_t, void *,
Packit fcad23
                                         u_char *, size_t *, u_char **,
Packit fcad23
                                         size_t *);
Packit fcad23
    int             usm_rgenerate_out_msg(int, u_char *, size_t, int, int,
Packit fcad23
                                          u_char *, size_t, char *, size_t,
Packit fcad23
                                          int, u_char *, size_t, void *,
Packit fcad23
                                          u_char **, size_t *, size_t *);
Packit fcad23
Packit fcad23
    int             usm_process_in_msg(int, size_t, u_char *, int, int,
Packit fcad23
                                       u_char *, size_t, u_char *,
Packit fcad23
                                       size_t *, char *, size_t *,
Packit fcad23
                                       u_char **, size_t *, size_t *,
Packit fcad23
                                       void **, netsnmp_session *, u_char);
Packit fcad23
Packit fcad23
    int             usm_check_secLevel(int level, struct usmUser *user);
Packit fcad23
    NETSNMP_IMPORT
Packit fcad23
    struct usmUser *usm_get_userList(void);
Packit fcad23
    NETSNMP_IMPORT
Packit fcad23
    struct usmUser *usm_get_user(u_char * engineID, size_t engineIDLen,
Packit fcad23
                                 char *name);
Packit fcad23
    struct usmUser *usm_get_user_from_list(u_char * engineID,
Packit fcad23
                                           size_t engineIDLen, char *name,
Packit fcad23
                                           struct usmUser *userList,
Packit fcad23
                                           int use_default);
Packit fcad23
    NETSNMP_IMPORT
Packit fcad23
    struct usmUser *usm_add_user(struct usmUser *user);
Packit fcad23
    struct usmUser *usm_add_user_to_list(struct usmUser *user,
Packit fcad23
                                         struct usmUser *userList);
Packit fcad23
    NETSNMP_IMPORT
Packit fcad23
    struct usmUser *usm_free_user(struct usmUser *user);
Packit fcad23
    NETSNMP_IMPORT
Packit fcad23
    struct usmUser *usm_create_user(void);
Packit fcad23
    NETSNMP_IMPORT
Packit fcad23
    struct usmUser *usm_create_initial_user(const char *name,
Packit fcad23
                                            const oid * authProtocol,
Packit fcad23
                                            size_t authProtocolLen,
Packit fcad23
                                            const oid * privProtocol,
Packit fcad23
                                            size_t privProtocolLen);
Packit fcad23
    NETSNMP_IMPORT
Packit fcad23
    struct usmUser *usm_cloneFrom_user(struct usmUser *from,
Packit fcad23
                                       struct usmUser *to);
Packit fcad23
    NETSNMP_IMPORT
Packit fcad23
    struct usmUser *usm_remove_user(struct usmUser *user);
Packit fcad23
    struct usmUser *usm_remove_user_from_list(struct usmUser *user,
Packit fcad23
                                              struct usmUser **userList);
Packit fcad23
    char           *get_objid(char *line, oid ** optr, size_t * len);
Packit fcad23
    NETSNMP_IMPORT
Packit fcad23
    void            usm_save_users(const char *token, const char *type);
Packit fcad23
    void            usm_save_users_from_list(struct usmUser *user,
Packit fcad23
                                             const char *token,
Packit fcad23
                                             const char *type);
Packit fcad23
    void            usm_save_user(struct usmUser *user, const char *token,
Packit fcad23
                                  const char *type);
Packit fcad23
    NETSNMP_IMPORT
Packit fcad23
    SNMPCallback    usm_store_users;
Packit fcad23
    struct usmUser *usm_read_user(const char *line);
Packit fcad23
    NETSNMP_IMPORT
Packit fcad23
    void            usm_parse_config_usmUser(const char *token,
Packit fcad23
                                             char *line);
Packit fcad23
Packit fcad23
    void            usm_set_password(const char *token, char *line);
Packit fcad23
    NETSNMP_IMPORT
Packit fcad23
    void            usm_set_user_password(struct usmUser *user,
Packit fcad23
                                          const char *token, char *line);
Packit fcad23
    void            init_usm(void);
Packit fcad23
    NETSNMP_IMPORT
Packit fcad23
    void            init_usm_conf(const char *app);
Packit fcad23
    int             init_usm_post_config(int majorid, int minorid,
Packit fcad23
                                         void *serverarg, void *clientarg);
Packit fcad23
    int             deinit_usm_post_config(int majorid, int minorid, void *serverarg,
Packit fcad23
					   void *clientarg);
Packit fcad23
    NETSNMP_IMPORT
Packit fcad23
    void            clear_user_list(void);
Packit fcad23
    NETSNMP_IMPORT
Packit fcad23
    void            shutdown_usm(void);
Packit fcad23
Packit fcad23
    NETSNMP_IMPORT
Packit fcad23
    int             usm_lookup_auth_type(const char *str);
Packit fcad23
    NETSNMP_IMPORT
Packit fcad23
    const char     *usm_lookup_auth_str(int value);
Packit fcad23
    NETSNMP_IMPORT
Packit fcad23
    oid            *usm_get_auth_oid(int auth_type, size_t *oid_len);
Packit fcad23
Packit fcad23
    NETSNMP_IMPORT
Packit fcad23
    int             usm_lookup_priv_type(const char *str);
Packit fcad23
    NETSNMP_IMPORT
Packit fcad23
    const char     *usm_lookup_priv_str(int value);
Packit fcad23
    NETSNMP_IMPORT
Packit fcad23
    oid            *usm_get_priv_oid(int priv_type, size_t *oid_len);
Packit fcad23
Packit fcad23
Packit fcad23
#define USM_CREATE_USER_AUTH_DFLT -1
Packit fcad23
#define USM_CREATE_USER_AUTH_NONE NETSNMP_USMAUTH_NONE
Packit fcad23
#define USM_CREATE_USER_AUTH_MD5  NETSNMP_USMAUTH_HMACMD5
Packit fcad23
#define USM_CREATE_USER_AUTH_SHA1 NETSNMP_USMAUTH_HMACSHA1
Packit fcad23
#define USM_CREATE_USER_AUTH_SHA  USM_CREATE_USER_AUTH_SHA1
Packit fcad23
#define USM_CREATE_USER_AUTH_SHA512  NETSNMP_USMAUTH_HMAC384SHA512
Packit fcad23
#define USM_CREATE_USER_AUTH_SHA384  NETSNMP_USMAUTH_HMAC256SHA384
Packit fcad23
#define USM_CREATE_USER_AUTH_SHA256  NETSNMP_USMAUTH_HMAC192SHA256
Packit fcad23
#define USM_CREATE_USER_AUTH_SHA224  NETSNMP_USMAUTH_HMAC128SHA224
Packit fcad23
Packit fcad23
    /** flags for variants fo priv algorithsm */
Packit fcad23
#define USM_DES_FLAG_3                      0x000100
Packit fcad23
Packit fcad23
#define USM_AES_FLAG_192                    0x000100
Packit fcad23
#define USM_AES_FLAG_256                    0x000200
Packit fcad23
Packit fcad23
#define USM_AES_REEDER_FLAG                 0x030000
Packit fcad23
#define USM_AES_FLAG_CISCO                  0x100000
Packit fcad23
Packit fcad23
#define USM_PRIV_MASK_ALG                   0x0000ff
Packit fcad23
#define USM_PRIV_MASK_VARIANT               0x00ff00
Packit fcad23
Packit fcad23
#define USM_CREATE_USER_PRIV_DFLT          -1
Packit fcad23
#define USM_CREATE_USER_PRIV_NONE           0
Packit fcad23
Packit fcad23
#define USM_CREATE_USER_PRIV_DES            0x01
Packit fcad23
#define USM_CREATE_USER_PRIV_3DES           \
Packit fcad23
    (USM_CREATE_USER_PRIV_DES | USM_DES_FLAG_3)
Packit fcad23
Packit fcad23
#define USM_CREATE_USER_PRIV_AES            0x02
Packit fcad23
#define USM_CREATE_USER_PRIV_AES192         \
Packit fcad23
    (USM_CREATE_USER_PRIV_AES | USM_AES_FLAG_192)
Packit fcad23
#define USM_CREATE_USER_PRIV_AES256         \
Packit fcad23
    (USM_CREATE_USER_PRIV_AES | USM_AES_FLAG_256)
Packit fcad23
Packit fcad23
#define USM_CREATE_USER_PRIV_AES192_CISCO   \
Packit fcad23
    (USM_CREATE_USER_PRIV_AES | USM_AES_FLAG_192 | USM_AES_FLAG_CISCO \
Packit fcad23
     | USM_AES_REEDER_FLAG)
Packit fcad23
#define USM_CREATE_USER_PRIV_AES256_CISCO   \
Packit fcad23
    (USM_CREATE_USER_PRIV_AES | USM_AES_FLAG_256 | USM_AES_FLAG_CISCO \
Packit fcad23
     | USM_AES_REEDER_FLAG)
Packit fcad23
Packit fcad23
Packit fcad23
    struct usmUser *usm_create_usmUser(const char *userName,
Packit fcad23
                                       const char *engineID, u_int flags,
Packit fcad23
                                       int authType, const char *authPass,
Packit fcad23
                                       int privType, const char *privPass,
Packit fcad23
                                       const char **errorMsg);
Packit fcad23
Packit fcad23
    NETSNMP_IMPORT
Packit fcad23
    int             usm_remove_usmUser(struct usmUser *user);
Packit fcad23
Packit fcad23
    NETSNMP_IMPORT
Packit fcad23
    int             usm_remove_usmUser_from_list(struct usmUser *user,
Packit fcad23
                                                 struct usmUser **ppuserList);
Packit fcad23
Packit fcad23
    NETSNMP_IMPORT
Packit fcad23
    struct usmUser *usm_create_usmUser_from_string(char *line,
Packit fcad23
                                                   const char **errorMsg);
Packit fcad23
Packit fcad23
    NETSNMP_IMPORT
Packit fcad23
    int             usm_create_user_from_session(netsnmp_session * session);
Packit fcad23
    SecmodPostDiscovery usm_create_user_from_session_hook;
Packit fcad23
    NETSNMP_IMPORT
Packit fcad23
    void            usm_parse_create_usmUser(const char *token,
Packit fcad23
                                             char *line);
Packit fcad23
    NETSNMP_IMPORT
Packit fcad23
    const oid      *get_default_authtype(size_t *);
Packit fcad23
    NETSNMP_IMPORT
Packit fcad23
    const oid      *get_default_privtype(size_t *);
Packit fcad23
    void            snmpv3_authtype_conf(const char *word, char *cptr);
Packit fcad23
    void            snmpv3_privtype_conf(const char *word, char *cptr);
Packit fcad23
Packit fcad23
#ifdef __cplusplus
Packit fcad23
}
Packit fcad23
#endif
Packit fcad23
#endif                          /* SNMPUSM_H */