From 35dad2e7b571a6ffa2a4787635454190de3a8906 Mon Sep 17 00:00:00 2001 From: Frank Denis Date: Sun, 8 Mar 2026 14:49:53 +0100 Subject: [PATCH] Add a couple sodium_memzero --- src/libsodium/crypto_ipcrypt/ipcrypt_aesni.c | 19 +++++++++++++++++++ .../crypto_ipcrypt/ipcrypt_armcrypto.c | 19 +++++++++++++++++++ src/libsodium/crypto_ipcrypt/ipcrypt_soft.c | 19 +++++++++++++++++++ 3 files changed, 57 insertions(+) diff --git a/src/libsodium/crypto_ipcrypt/ipcrypt_aesni.c b/src/libsodium/crypto_ipcrypt/ipcrypt_aesni.c index c072d19b..08386752 100644 --- a/src/libsodium/crypto_ipcrypt/ipcrypt_aesni.c +++ b/src/libsodium/crypto_ipcrypt/ipcrypt_aesni.c @@ -97,6 +97,7 @@ aes_decrypt(uint8_t out[16], const uint8_t in[16], const BlockVec *rkeys) } t = AES_DECRYPTLAST(t, rkeys[0]); STORE128(out, t); + sodium_memzero(rkeys_inv, sizeof rkeys_inv); } static BlockVec @@ -142,6 +143,7 @@ aes_decrypt_with_tweak(uint8_t out[16], const uint8_t in[16], const uint8_t twea } t = AES_DECRYPTLAST(t, XOR128(tweak_block, rkeys[0])); STORE128(out, t); + sodium_memzero(rkeys_inv, sizeof rkeys_inv); } static BlockVec @@ -192,6 +194,7 @@ aes_xex_decrypt(uint8_t out[16], const uint8_t in[16], const uint8_t tweak[16], } t = AES_DECRYPTLAST(t, XOR128(rkeys[0], tt)); STORE128(out, t); + sodium_memzero(rkeys_inv, sizeof rkeys_inv); } static void @@ -201,6 +204,7 @@ encrypt(uint8_t *out, const uint8_t *in, const uint8_t *k) expand_key(rkeys, k); aes_encrypt(out, in, rkeys); + sodium_memzero(rkeys, sizeof rkeys); } static void @@ -210,6 +214,7 @@ decrypt(uint8_t *out, const uint8_t *in, const uint8_t *k) expand_key(rkeys, k); aes_decrypt(out, in, rkeys); + sodium_memzero(rkeys, sizeof rkeys); } static void @@ -220,6 +225,7 @@ nd_encrypt(uint8_t *out, const uint8_t *in, const uint8_t *t, const uint8_t *k) expand_key(rkeys, k); memcpy(out, t, 8); aes_encrypt_with_tweak(out + 8, in, t, rkeys); + sodium_memzero(rkeys, sizeof rkeys); } static void @@ -229,6 +235,7 @@ nd_decrypt(uint8_t *out, const uint8_t *in, const uint8_t *k) expand_key(rkeys, k); aes_decrypt_with_tweak(out, in + 8, in, rkeys); + sodium_memzero(rkeys, sizeof rkeys); } static void @@ -257,6 +264,9 @@ ndx_encrypt(uint8_t *out, const uint8_t *in, const uint8_t *t, const uint8_t *k) memcpy(out, t, 16); aes_xex_encrypt(out + 16, in, t, tkeys, rkeys); + sodium_memzero(diff, sizeof diff); + sodium_memzero(rkeys, sizeof rkeys); + sodium_memzero(tkeys, sizeof tkeys); } static void @@ -284,6 +294,9 @@ ndx_decrypt(uint8_t *out, const uint8_t *in, const uint8_t *k) } aes_xex_decrypt(out, in + 16, in, tkeys, rkeys); + sodium_memzero(diff, sizeof diff); + sodium_memzero(rkeys, sizeof rkeys); + sodium_memzero(tkeys, sizeof tkeys); } static int @@ -405,6 +418,9 @@ pfx_encrypt(uint8_t *out, const uint8_t *in, const uint8_t *k) } memcpy(out, encrypted, 16); + sodium_memzero(diff, sizeof diff); + sodium_memzero(k2keys, sizeof k2keys); + sodium_memzero(k1keys, sizeof k1keys); } static void @@ -477,6 +493,9 @@ pfx_decrypt(uint8_t *out, const uint8_t *in, const uint8_t *k) } memcpy(out, decrypted, 16); + sodium_memzero(diff, sizeof diff); + sodium_memzero(k2keys, sizeof k2keys); + sodium_memzero(k1keys, sizeof k1keys); } struct ipcrypt_implementation ipcrypt_aesni_implementation = { diff --git a/src/libsodium/crypto_ipcrypt/ipcrypt_armcrypto.c b/src/libsodium/crypto_ipcrypt/ipcrypt_armcrypto.c index 53c65ce9..a8a8839d 100644 --- a/src/libsodium/crypto_ipcrypt/ipcrypt_armcrypto.c +++ b/src/libsodium/crypto_ipcrypt/ipcrypt_armcrypto.c @@ -126,6 +126,7 @@ aes_decrypt(uint8_t out[16], const uint8_t in[16], const BlockVec *rkeys) t = AES_XDECRYPTLAST(t, rkeys_inv[i]); t = XOR128(t, rkeys[0]); STORE128(out, t); + sodium_memzero(rkeys_inv, sizeof rkeys_inv); } static BlockVec @@ -171,6 +172,7 @@ aes_decrypt_with_tweak(uint8_t out[16], const uint8_t in[16], const uint8_t twea t = AES_XDECRYPTLAST(t, XOR128(tweak_block_inv, rkeys_inv[i])); t = XOR128(t, XOR128(tweak_block, rkeys[0])); STORE128(out, t); + sodium_memzero(rkeys_inv, sizeof rkeys_inv); } static BlockVec @@ -224,6 +226,7 @@ aes_xex_decrypt(uint8_t out[16], const uint8_t in[16], const uint8_t tweak[16], t = AES_XDECRYPTLAST(t, rkeys_inv[i]); t = XOR128_3(t, rkeys[0], tt); STORE128(out, t); + sodium_memzero(rkeys_inv, sizeof rkeys_inv); } static void @@ -233,6 +236,7 @@ encrypt(uint8_t *out, const uint8_t *in, const uint8_t *k) expand_key(rkeys, k); aes_encrypt(out, in, rkeys); + sodium_memzero(rkeys, sizeof rkeys); } static void @@ -242,6 +246,7 @@ decrypt(uint8_t *out, const uint8_t *in, const uint8_t *k) expand_key(rkeys, k); aes_decrypt(out, in, rkeys); + sodium_memzero(rkeys, sizeof rkeys); } static void @@ -252,6 +257,7 @@ nd_encrypt(uint8_t *out, const uint8_t *in, const uint8_t *t, const uint8_t *k) expand_key(rkeys, k); memcpy(out, t, 8); aes_encrypt_with_tweak(out + 8, in, t, rkeys); + sodium_memzero(rkeys, sizeof rkeys); } static void @@ -261,6 +267,7 @@ nd_decrypt(uint8_t *out, const uint8_t *in, const uint8_t *k) expand_key(rkeys, k); aes_decrypt_with_tweak(out, in + 8, in, rkeys); + sodium_memzero(rkeys, sizeof rkeys); } static void @@ -289,6 +296,9 @@ ndx_encrypt(uint8_t *out, const uint8_t *in, const uint8_t *t, const uint8_t *k) memcpy(out, t, 16); aes_xex_encrypt(out + 16, in, t, tkeys, rkeys); + sodium_memzero(diff, sizeof diff); + sodium_memzero(rkeys, sizeof rkeys); + sodium_memzero(tkeys, sizeof tkeys); } static void @@ -316,6 +326,9 @@ ndx_decrypt(uint8_t *out, const uint8_t *in, const uint8_t *k) } aes_xex_decrypt(out, in + 16, in, tkeys, rkeys); + sodium_memzero(diff, sizeof diff); + sodium_memzero(rkeys, sizeof rkeys); + sodium_memzero(tkeys, sizeof tkeys); } static int @@ -440,6 +453,9 @@ pfx_encrypt(uint8_t *out, const uint8_t *in, const uint8_t *k) } memcpy(out, encrypted, 16); + sodium_memzero(diff, sizeof diff); + sodium_memzero(k2keys, sizeof k2keys); + sodium_memzero(k1keys, sizeof k1keys); } static void @@ -514,6 +530,9 @@ pfx_decrypt(uint8_t *out, const uint8_t *in, const uint8_t *k) } memcpy(out, decrypted, 16); + sodium_memzero(diff, sizeof diff); + sodium_memzero(k2keys, sizeof k2keys); + sodium_memzero(k1keys, sizeof k1keys); } struct ipcrypt_implementation ipcrypt_armcrypto_implementation = { diff --git a/src/libsodium/crypto_ipcrypt/ipcrypt_soft.c b/src/libsodium/crypto_ipcrypt/ipcrypt_soft.c index 3aa67370..9bf5ea66 100644 --- a/src/libsodium/crypto_ipcrypt/ipcrypt_soft.c +++ b/src/libsodium/crypto_ipcrypt/ipcrypt_soft.c @@ -64,6 +64,7 @@ aes_decrypt(uint8_t out[16], const uint8_t in[16], const KeySchedule rkeys) } t = AES_DECLAST(t, rkeys_inv[0]); AES_BLOCK_STORE(out, t); + sodium_memzero(rkeys_inv, sizeof rkeys_inv); } static aes_block_t @@ -116,6 +117,7 @@ aes_decrypt_with_tweak(uint8_t out[16], const uint8_t in[16], const uint8_t twea } t = AES_DECLAST(t, AES_BLOCK_XOR(tweak_block, rkeys_inv[0])); AES_BLOCK_STORE(out, t); + sodium_memzero(rkeys_inv, sizeof rkeys_inv); } static aes_block_t @@ -168,6 +170,7 @@ aes_xex_decrypt(uint8_t out[16], const uint8_t in[16], const uint8_t tweak[16], } t = AES_DECLAST(t, AES_BLOCK_XOR(rkeys_inv[0], tt)); AES_BLOCK_STORE(out, t); + sodium_memzero(rkeys_inv, sizeof rkeys_inv); } static void @@ -177,6 +180,7 @@ encrypt(uint8_t *out, const uint8_t *in, const uint8_t *k) expand_key(rkeys, k); aes_encrypt(out, in, rkeys); + sodium_memzero(rkeys, sizeof rkeys); } static void @@ -186,6 +190,7 @@ decrypt(uint8_t *out, const uint8_t *in, const uint8_t *k) expand_key(rkeys, k); aes_decrypt(out, in, rkeys); + sodium_memzero(rkeys, sizeof rkeys); } static void @@ -196,6 +201,7 @@ nd_encrypt(uint8_t *out, const uint8_t *in, const uint8_t *t, const uint8_t *k) expand_key(rkeys, k); memcpy(out, t, 8); aes_encrypt_with_tweak(out + 8, in, t, rkeys); + sodium_memzero(rkeys, sizeof rkeys); } static void @@ -205,6 +211,7 @@ nd_decrypt(uint8_t *out, const uint8_t *in, const uint8_t *k) expand_key(rkeys, k); aes_decrypt_with_tweak(out, in + 8, in, rkeys); + sodium_memzero(rkeys, sizeof rkeys); } static void @@ -233,6 +240,9 @@ ndx_encrypt(uint8_t *out, const uint8_t *in, const uint8_t *t, const uint8_t *k) memcpy(out, t, 16); aes_xex_encrypt(out + 16, in, t, tkeys, rkeys); + sodium_memzero(diff, sizeof diff); + sodium_memzero(rkeys, sizeof rkeys); + sodium_memzero(tkeys, sizeof tkeys); } static void @@ -260,6 +270,9 @@ ndx_decrypt(uint8_t *out, const uint8_t *in, const uint8_t *k) } aes_xex_decrypt(out, in + 16, in, tkeys, rkeys); + sodium_memzero(diff, sizeof diff); + sodium_memzero(rkeys, sizeof rkeys); + sodium_memzero(tkeys, sizeof tkeys); } static int @@ -381,6 +394,9 @@ pfx_encrypt(uint8_t *out, const uint8_t *in, const uint8_t *k) } memcpy(out, encrypted, 16); + sodium_memzero(diff, sizeof diff); + sodium_memzero(k2keys, sizeof k2keys); + sodium_memzero(k1keys, sizeof k1keys); } static void @@ -453,6 +469,9 @@ pfx_decrypt(uint8_t *out, const uint8_t *in, const uint8_t *k) } memcpy(out, decrypted, 16); + sodium_memzero(diff, sizeof diff); + sodium_memzero(k2keys, sizeof k2keys); + sodium_memzero(k1keys, sizeof k1keys); } struct ipcrypt_implementation ipcrypt_soft_implementation = {