uint8_t SNMPv3AESEncryptResponseScopedPdu(SNMPV3_RESPONSE_WHOLEMSG* plain_text/*uint8_t userDBIndex*/) { uint8_t* cryptoKey; uint8_t* initVector; uint8_t* plainText; uint16_t plaintextLen; uint8_t* encrypted_text; uint8_t extraMemReqd; AES_ROUND_KEYS_128_BIT round_keys; AES_CFB_STATE_DATA current_stream; SNMPV3_PROCESSING_MEM_INFO_PTRS snmpv3PktProcessingMemPntr; SNMPV3_STACK_DCPT_STUB * snmpv3EngnDcptMemoryStubPtr=0; SNMPv3GetPktProcessingDynMemStubPtrs(&snmpv3PktProcessingMemPntr); snmpv3EngnDcptMemoryStubPtr=snmpv3PktProcessingMemPntr.snmpv3StkProcessingDynMemStubPtr; //This is a secured request. Compute the AES Encryption IV SNMPv3UsmAesEncryptDecrptInitVector(SNMP_RESPONSE_PDU); plaintextLen= (plain_text->scopedPduStructLen); cryptoKey=snmpv3EngnDcptMemoryStubPtr->UserInfoDataBase[snmpv3EngnDcptMemoryStubPtr->UserInfoDataBaseIndx].userPrivPswdLoclizdKey; initVector=snmpV3AesEncryptInitVector; plainText=(plain_text->scopedPduOffset); extraMemReqd=(16-(plaintextLen%16)); //AES Blocks are in multiples of 16 Bytes encrypted_text=(uint8_t*)(TCPIP_HEAP_Calloc(snmpv3PktProcessingMemPntr.snmpHeapMemHandler,1,(size_t)plaintextLen+extraMemReqd)); if(encrypted_text != NULL) { AESCreateRoundKeys (&round_keys,cryptoKey,AES_KEY_SIZE_128_BIT); memcpy(current_stream.initial_vector,initVector,16); AESCFBEncrypt(encrypted_text,plainText, plaintextLen, &round_keys, ¤t_stream, AES_STREAM_START | AES_USE_CFB128 ); } else return SNMPV3_MSG_PRIV_FAIL; //Copy decrypted text to already allocated WholeMsg dynamic memory Buffer. memcpy(plainText,encrypted_text,plaintextLen); //free this temp buffer used for decryption purpose. TCPIP_HEAP_Free(snmpv3PktProcessingMemPntr.snmpHeapMemHandler, encrypted_text); return SNMPV3_MSG_PRIV_PASS; }
BYTE Snmpv3AESEncryptResponseScopedPdu(SNMPV3_RESPONSE_WHOLEMSG* plain_text) { UINT8* cryptoKey; UINT8* initVector; UINT8* plainText; WORD plaintextLen; UINT8* encrypted_text; BYTE extraMemReqd; AES_ROUND_KEYS_128_BIT round_keys; AES_CFB_STATE_DATA current_stream; //This is a secured request. Compute the AES Encryption IV Snmpv3UsmAesEncryptDecryptInitVector(SNMP_RESPONSE_PDU); plaintextLen= (plain_text->scopedPduStructLen); cryptoKey=snmpV3UserDataBase[gSnmpv3UserDBIndex].userPrivPswdLoclizdKey; initVector=snmpV3AesEncryptInitVector; plainText=(plain_text->scopedPduOffset); extraMemReqd=(16-(plaintextLen%16)); //AES Blocks are in multiples of 16 Bytes encrypted_text=(UINT8*)(malloc((size_t)plaintextLen+extraMemReqd)); if(encrypted_text != NULL) { AESCreateRoundKeys (&round_keys,cryptoKey,AES_KEY_SIZE_128_BIT); memcpy(current_stream.initial_vector,initVector,16); AESCFBEncrypt(encrypted_text,plainText, plaintextLen, &round_keys, ¤t_stream, AES_STREAM_START | AES_USE_CFB128 ); } else return SNMPV3_MSG_PRIV_FAIL; //Copy decrypted text to already allocated WholeMsg dynamic memory Buffer. memcpy(plainText,encrypted_text,plaintextLen); //free this temp buffer used for decryption purpose. free(encrypted_text); return SNMPV3_MSG_PRIV_PASS; }