usm_v3.cpp
来自「JdonFramework need above jdk 1.4.0 This」· C++ 代码 · 共 2,118 行 · 第 1/5 页
CPP
2,118 行
name_table_entry->usmUserPrivProtocol, name_table_entry->authPassword, name_table_entry->authPasswordLength, name_table_entry->privPassword, name_table_entry->privPasswordLength, authKey, &authKeyLength, privKey, &privKeyLength); if (res != SNMPv3_USM_OK) { LOG_BEGIN(ERROR_LOG | 4); LOG("Cannot add User: error code"); LOG(res); LOG_END; usm_user_name_table->delete_cloned_entry(name_table_entry); return 0; } OctetStr akey(authKey, authKeyLength); OctetStr pkey(privKey, privKeyLength); add_localized_user( engine_id, name_table_entry->usmUserName, name_table_entry->usmUserSecurityName, name_table_entry->usmUserAuthProtocol, akey, name_table_entry->usmUserPrivProtocol, pkey); if (usm_add_user_cb) { // inform agent++ about new user debugprintf(5, "Informing agent++ about newly created user"); usm_add_user_cb(engine_id, name_table_entry->usmUserName, name_table_entry->usmUserSecurityName, name_table_entry->usmUserAuthProtocol, akey, name_table_entry->usmUserPrivProtocol, pkey); } akey.clear(); pkey.clear(); user_table_entry = usm_user_table->get_cloned_entry(engine_id, security_name); if (!user_table_entry) { LOG_BEGIN(ERROR_LOG | 1); LOG("Get of just added localized entry failed (sec name) (engine id)"); LOG(security_name.get_printable()); LOG(engine_id.get_printable()); LOG_END; usm_user_name_table->delete_cloned_entry(name_table_entry); return 0; } } usm_user_name_table->delete_cloned_entry(name_table_entry); } struct UsmUser *res = new UsmUser; if (!res) { usm_user_table->delete_cloned_entry(user_table_entry); return 0; } res->engineID = user_table_entry->usmUserEngineID; res->engineIDLength = user_table_entry->usmUserEngineIDLength; res->usmUserName = user_table_entry->usmUserName; res->usmUserNameLength = user_table_entry->usmUserNameLength; res->securityName = user_table_entry->usmUserSecurityName; res->securityNameLength = user_table_entry->usmUserSecurityNameLength; res->authProtocol = user_table_entry->usmUserAuthProtocol; res->authKey = user_table_entry->usmUserAuthKey; res->authKeyLength = user_table_entry->usmUserAuthKeyLength; res->privProtocol = user_table_entry->usmUserPrivProtocol; res->privKey = user_table_entry->usmUserPrivKey; res->privKeyLength = user_table_entry->usmUserPrivKeyLength; user_table_entry->usmUserEngineID = 0; user_table_entry->usmUserName = 0; user_table_entry->usmUserSecurityName = 0; user_table_entry->usmUserAuthKey = 0; user_table_entry->usmUserPrivKey = 0; usm_user_table->delete_cloned_entry(user_table_entry); return res;}// Free the structure returned from get_user().void USM::free_user(struct UsmUser *&user){ if (!user) return; if (user->engineID) delete [] user->engineID; if (user->usmUserName) delete [] user->usmUserName; if (user->securityName) delete [] user->securityName; if (user->authKey) { memset(user->authKey, 0, user->authKeyLength); delete [] user->authKey; } if (user->privKey) { memset(user->privKey, 0, user->privKeyLength); delete [] user->privKey; } delete user; user = 0;}int USM::delete_usm_user(const OctetStr& security_name){ usm_user_name_table->delete_security_name(security_name); unsigned char username[MAXLEN_USMUSERNAME + 1]; long int length = MAXLEN_USMUSERNAME; if ((get_user_name(username, &length, security_name.data(), security_name.len())) == SNMPv3_USM_OK) return delete_localized_user(OctetStr(username, length)); return SNMPv3_USM_ERROR;}int USM::get_security_name(const unsigned char *user_name, const long int user_name_len, OctetStr &security_name){ debugprintf(20,"USM::get_security_name: get user (%s)", OctetStr(user_name,user_name_len).get_printable()); int result; result = usm_user_name_table->get_security_name(user_name, user_name_len, security_name); if (result == SNMPv3_USM_OK) return SNMPv3_USM_OK; result = usm_user_table->get_security_name(user_name, user_name_len, security_name); if (result == SNMPv3_USM_OK) return SNMPv3_USM_OK; debugprintf(1, "USM::get_security_name: User unknown"); return SNMPv3_USM_ERROR;}int USM::get_user_name(unsigned char *user_name, long int *user_name_len, const unsigned char *security_name, const long int security_name_len){ int result; long int buf_len = *user_name_len; result = usm_user_name_table->get_user_name(user_name, user_name_len, security_name, security_name_len); if (result == SNMPv3_USM_OK) return SNMPv3_USM_OK; *user_name_len = buf_len; result = usm_user_table->get_user_name(user_name, user_name_len, security_name, security_name_len); if (result == SNMPv3_USM_OK) return SNMPv3_USM_OK; debugprintf(1, "usmGetUsmUserName: User unknown"); return SNMPv3_USM_ERROR;}void USM::delete_sec_parameters( struct UsmSecurityParameters *usp){ usp->msgAuthoritativeEngineID[0] = 0; usp->msgAuthoritativeEngineIDLength = 0; usp->msgAuthoritativeEngineBoots = 0; usp->msgAuthoritativeEngineTime = 0; usp->msgUserName[0] = 0; usp->msgUserNameLength = 0; if (usp->msgAuthenticationParameters) { delete [] usp->msgAuthenticationParameters; usp->msgAuthenticationParameters = NULL; } usp->msgAuthenticationParametersLength = 0; if (usp->msgPrivacyParameters) { delete [] usp->msgPrivacyParameters; usp->msgPrivacyParameters = NULL; } usp->msgPrivacyParametersLength = 0;}const struct UsmUserTableEntry *USM::get_user(int number){ return usm_user_table->get_entry(number);}const struct UsmUserNameTableEntry *USM::get_user(const OctetStr &security_name){ return usm_user_name_table->get_entry(security_name);}int USM::get_user_count() const{ return usm_user_table->size();}DLLOPT void USM::add_user_added_callback(const usm_add_user_callback cb){ usm_add_user_cb = cb;}int USM::get_time(const OctetStr &engine_id, long int *engine_boots, long int *engine_time){ return usm_time_table->get_time(engine_id, *engine_boots, *engine_time);}int USM::get_local_time(long int *engine_boots, long int *engine_time) const{ return usm_time_table->get_local_time(*engine_boots, *engine_time);}AuthPriv *USM::get_auth_priv(){ return auth_priv;}struct UsmKeyUpdate* USM::key_update_prepare(const OctetStr& securityName, SnmpTarget& target, const OctetStr& newPassword, Pdu& pdu, int type, int &status, const OctetStr& oldpass, const OctetStr& oldengid, const OctetStr& newengid){ // check address GenAddress genaddress; target.get_address(genaddress); UdpAddress udp_address(genaddress); if (!udp_address.valid()) { debugprintf(0, "usmPrepareKeyUpdate: Address invalid."); status = SNMPv3_USM_ADDRESS_ERROR; return NULL; } OctetStr engineID = ""; // get engineID if (v3mp->get_from_engine_id_table(engineID, (char*)udp_address.get_printable()) != SNMPv3_MP_OK ) { debugprintf(0, "usmPrepareKeyUpdate: Could not find engineID of given address."); status = SNMPv3_USM_ADDRESS_ERROR; return NULL; } // get user struct UsmUser* user; user = get_user(engineID, securityName); if (user == NULL) { debugprintf(0, "usmPrepareKeyUpdate: Could not find user in usmTables."); status = SNMPv3_USM_UNKNOWN_SECURITY_NAME; return NULL; } /* set old and new key */ unsigned char key[SNMPv3_USM_MAX_KEY_LEN]; unsigned int key_len = SNMPv3_USM_MAX_KEY_LEN; OctetStr newKey; OctetStr oldKey; switch (type) { case AUTHKEY: case OWNAUTHKEY: { status = auth_priv->password_to_key_auth( user->authProtocol, newPassword.data(), newPassword.len(), engineID.data(), engineID.len(), key, &key_len); oldKey = OctetStr(user->authKey, user->authKeyLength); break; } case PRIVKEY: case OWNPRIVKEY: { status = auth_priv->password_to_key_priv( user->authProtocol, user->privProtocol, newPassword.data(), newPassword.len(), engineID.data(), engineID.len(), key, &key_len); oldKey = OctetStr(user->privKey, user->privKeyLength); break; } default: { debugprintf(0, "usmPrepareKeyUpdate: wrong type specified."); status = SNMPv3_USM_ERROR; free_user(user); return NULL; } } if (status != SNMPv3_USM_OK) { debugprintf(0, "usmPrepareKeyUpdate: password_to_key failed (code %i).", status); free_user(user); return NULL; } newKey = OctetStr(key, key_len); /* get value to set and random value */ OctetStr newValue; OctetStr random_value; auth_priv->get_keychange_value(user->authProtocol, oldKey, newKey, newValue); char tmp_rand; for (int i = 0; i<30; i++) { tmp_rand = rand(); random_value += tmp_rand; } // Oid in usmUserTable Oid userOid = Oid(oidUsmUserEntry); Oid publicOid = Oid(oidUsmUserEntry); publicOid += "11"; switch (type) { case AUTHKEY: { userOid += "6"; break; } case OWNAUTHKEY: { userOid += "7"; break; } case PRIVKEY: { userOid += "9"; break; } case OWNPRIVKEY: { userOid += "10"; break; } default: { debugprintf(0, "KeyChange error: wrong type:"); status = SNMPv3_USM_ERROR; free_user(user); return NULL; } } userOid += engineID.len(); publicOid += engineID.len(); for (unsigned int j=0; j<engineID.len(); j++) { userOid += (engineID)[j]; publicOid += (engineID)[j]; } OctetStr os = securityName; userOid += os.len(); publicOid += os.len(); for (unsigned int k=0; k<os.len(); k++) { userOid += os[k]; publicOid += os[k]; } Vb vb; vb.set_oid(userOid); vb.set_value(newValue); pdu += vb; vb.set_oid(publicOid); vb.set_value(random_value); pdu += vb; struct UsmKeyUpdate *uku = new struct UsmKeyUpdate; uku->engineID = engineID; uku->securityName = securityName; uku->newPassword = newPassword; uku->newKey = newKey; uku->type = type; free_user(user); status = SNMPv3_USM_OK; return uku;}void USM::key_update_abort(struct UsmKeyUpdate *uku){ delete uku;}int USM::key_update_commit(struct UsmKeyUpdate *uku, int update_type){ if (!uku) return SNMPv3_USM_ERROR; int result; OctetStr userName; switch (update_type) { case USM_KeyUpdate: { result = update_key(uku->securityName.data(), uku->securityName.len(), uku->engineID.data(), uku->engineID.len(), uku->newKey.data(), uku->newKey.len(), uku->type); delete uku; return result; }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?