diff --git a/rijndael.cpp b/rijndael.cpp index 141ba646..90663535 100644 --- a/rijndael.cpp +++ b/rijndael.cpp @@ -316,6 +316,9 @@ void Rijndael::Base::UncheckedSetKey(const byte *userKey, unsigned int keyLen, c #if CRYPTOPP_BOOL_X64 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X86 m_aliasBlock.New(s_sizeToAllocate); + // The alias block is only used on IA-32 when unaligned data access is in effect. + // Setting the low water mark to 0 avoids zeroization when m_aliasBlock is unused. + m_aliasBlock.SetMark(0); #endif m_rounds = keyLen/4 + 6; @@ -1146,6 +1149,7 @@ size_t Rijndael::Enc::AdvancedProcessBlocks(const byte *inBlocks, const byte *xo return length; static const byte *zeros = (const byte*)(Te+256); + m_aliasBlock.SetMark(m_aliasBlock.size()); byte *space = NULLPTR, *originalSpace = const_cast(m_aliasBlock.data()); // round up to nearest 256 byte boundary diff --git a/rijndael.h b/rijndael.h index 867817b4..3410a800 100644 --- a/rijndael.h +++ b/rijndael.h @@ -57,7 +57,7 @@ class CRYPTOPP_DLL Rijndael : public Rijndael_Info, public BlockCipherDocumentat unsigned int m_rounds; FixedSizeAlignedSecBlock m_key; - SecByteBlock m_aliasBlock; + mutable SecByteBlock m_aliasBlock; }; //! \brief Provides implementation for encryption transformation