blob: 3138f5595a61237f5fddbc6042c2b00829f21594 [file] [log] [blame]
/*
* snmpusm.h
*
* Header file for USM support.
*/
#ifndef SNMPUSM_H
#define SNMPUSM_H
#ifdef __cplusplus
extern "C" {
#endif
#define WILDCARDSTRING "*"
/*
* General.
*/
#define USM_MAX_ID_LENGTH 1024 /* In bytes. */
#define USM_MAX_SALT_LENGTH 64 /* In BITS. */
#define USM_MAX_KEYEDHASH_LENGTH 128 /* In BITS. */
#define USM_TIME_WINDOW 150
/*
* USM message processing error codes. USM_ERR_* form used in snmpusm.c;
* SNMPERR_USM_* form is defined in the snmp_api.h file.
*/
#define USM_ERR_NO_ERROR SNMPERR_SUCCESS
#define USM_ERR_GENERIC_ERROR SNMPERR_USM_GENERICERROR
#define USM_ERR_UNKNOWN_SECURITY_NAME SNMPERR_USM_UNKNOWNSECURITYNAME
#define USM_ERR_UNSUPPORTED_SECURITY_LEVEL SNMPERR_USM_UNSUPPORTEDSECURITYLEVEL
#define USM_ERR_ENCRYPTION_ERROR SNMPERR_USM_ENCRYPTIONERROR
#define USM_ERR_AUTHENTICATION_FAILURE SNMPERR_USM_AUTHENTICATIONFAILURE
#define USM_ERR_PARSE_ERROR SNMPERR_USM_PARSEERROR
#define USM_ERR_UNKNOWN_ENGINE_ID SNMPERR_USM_UNKNOWNENGINEID
#define USM_ERR_NOT_IN_TIME_WINDOW SNMPERR_USM_NOTINTIMEWINDOW
#define USM_ERR_DECRYPTION_ERROR SNMPERR_USM_DECRYPTIONERROR
/*
* 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;
int userStatus;
int userStorageType;
struct usmUser *next;
struct usmUser *prev;
};
/*
* Prototypes.
*/
void usm_set_reportErrorOnUnknownID (int value);
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);
#ifdef SNMP_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);
void usm_set_reportErrorOnUnknownID (int value);
void usm_free_usmStateReference (void *old);
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_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 **);
int usm_check_secLevel(int level, struct usmUser *user);
struct usmUser *usm_get_userList(void);
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);
struct usmUser *usm_add_user(struct usmUser *user);
struct usmUser *usm_add_user_to_list(struct usmUser *user,
struct usmUser *userList);
struct usmUser *usm_free_user(struct usmUser *user);
struct usmUser *usm_create_user(void);
struct usmUser *usm_create_initial_user(const char *name,
oid *authProtocol, size_t authProtocolLen,
oid *privProtocol, size_t privProtocolLen);
struct usmUser *usm_cloneFrom_user(struct usmUser *from, struct usmUser *to);
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);
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);
struct usmUser *usm_read_user(char *line);
void usm_parse_config_usmUser(char *token, char *line);
void usm_set_password(char *token, char *line);
void usm_set_user_password(struct usmUser *user, char *token,
char *line);
void init_usm(void);
int init_usm_post_config(int majorid, int minorid, void *serverarg,
void *clientarg);
#ifdef __cplusplus
}
#endif
#endif /* SNMPUSM_H */