mirror of
https://github.com/MarekZegare4/MeshCore-Solo.git
synced 2026-11-02 19:02:00 +00:00
Move block-alignment check before HMAC computation
Address review feedback: - Move the alignment check before the HMAC-SHA256 computation to skip expensive crypto on obviously malformed packets - Update MACThenDecrypt header comment to document block-alignment as a reason for returning zero
This commit is contained in:
+4
-3
@@ -74,16 +74,17 @@ 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];
|
||||||
{
|
{
|
||||||
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);
|
||||||
}
|
}
|
||||||
if (memcmp(hmac, src, CIPHER_MAC_SIZE) == 0) {
|
if (memcmp(hmac, src, CIPHER_MAC_SIZE) == 0) {
|
||||||
int enc_len = src_len - CIPHER_MAC_SIZE;
|
|
||||||
if (enc_len % CIPHER_BLOCK_SIZE != 0) return 0; // reject non-block-aligned ciphertext
|
|
||||||
return decrypt(shared_secret, dest, src + CIPHER_MAC_SIZE, enc_len);
|
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