mirror of
https://github.com/MarekZegare4/MeshCore-Solo.git
synced 2026-11-02 19:02:00 +00:00
Merge pull request #1809 from DanielNovak/fix-decrypt-block-alignment-check
Fix stack buffer overflow in MACThenDecrypt
This commit is contained in:
+5
-2
@@ -147,6 +147,9 @@ int Utils::encryptThenMAC(const uint8_t* shared_secret, uint8_t* dest, const uin
|
|||||||
int Utils::MACThenDecrypt(const uint8_t* shared_secret, uint8_t* dest, const uint8_t* src, int src_len) {
|
int Utils::MACThenDecrypt(const uint8_t* shared_secret, uint8_t* dest, const uint8_t* src, int src_len) {
|
||||||
if (src_len <= CIPHER_MAC_SIZE) return 0; // invalid src bytes
|
if (src_len <= CIPHER_MAC_SIZE) return 0; // invalid src bytes
|
||||||
|
|
||||||
|
int enc_len = src_len - CIPHER_MAC_SIZE;
|
||||||
|
if (enc_len % CIPHER_BLOCK_SIZE != 0) return 0; // reject non-block-aligned ciphertext
|
||||||
|
|
||||||
uint8_t hmac[CIPHER_MAC_SIZE];
|
uint8_t hmac[CIPHER_MAC_SIZE];
|
||||||
#ifdef USE_CC310_HW_CRYPTO
|
#ifdef USE_CC310_HW_CRYPTO
|
||||||
{
|
{
|
||||||
@@ -161,12 +164,12 @@ int Utils::MACThenDecrypt(const uint8_t* shared_secret, uint8_t* dest, const uin
|
|||||||
{
|
{
|
||||||
SHA256 sha;
|
SHA256 sha;
|
||||||
sha.resetHMAC(shared_secret, PUB_KEY_SIZE);
|
sha.resetHMAC(shared_secret, PUB_KEY_SIZE);
|
||||||
sha.update(src + CIPHER_MAC_SIZE, src_len - CIPHER_MAC_SIZE);
|
sha.update(src + CIPHER_MAC_SIZE, enc_len);
|
||||||
sha.finalizeHMAC(shared_secret, PUB_KEY_SIZE, hmac, CIPHER_MAC_SIZE);
|
sha.finalizeHMAC(shared_secret, PUB_KEY_SIZE, hmac, CIPHER_MAC_SIZE);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (memcmp(hmac, src, CIPHER_MAC_SIZE) == 0) {
|
if (memcmp(hmac, src, CIPHER_MAC_SIZE) == 0) {
|
||||||
return decrypt(shared_secret, dest, src + CIPHER_MAC_SIZE, src_len - CIPHER_MAC_SIZE);
|
return decrypt(shared_secret, dest, src + CIPHER_MAC_SIZE, enc_len);
|
||||||
}
|
}
|
||||||
return 0; // invalid HMAC
|
return 0; // invalid HMAC
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -50,7 +50,7 @@ public:
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief checks the MAC (in leading bytes of 'src'), then if valid, decrypts remaining bytes in src.
|
* \brief checks the MAC (in leading bytes of 'src'), then if valid, decrypts remaining bytes in src.
|
||||||
* \returns zero if MAC is invalid, otherwise the length of decrypted bytes in 'dest'
|
* \returns zero if MAC is invalid or ciphertext is not block-aligned, otherwise the length of decrypted bytes in 'dest'
|
||||||
*/
|
*/
|
||||||
static int MACThenDecrypt(const uint8_t* shared_secret, uint8_t* dest, const uint8_t* src, int src_len);
|
static int MACThenDecrypt(const uint8_t* shared_secret, uint8_t* dest, const uint8_t* src, int src_len);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user