summaryrefslogtreecommitdiff
path: root/cmac.cpp
diff options
context:
space:
mode:
authorJeffrey Walton <noloader@gmail.com>2017-09-04 19:49:45 -0400
committerJeffrey Walton <noloader@gmail.com>2017-09-04 19:49:45 -0400
commita2223356b00ae3736f485e28c38213f48d2cc155 (patch)
tree2aa6bccc5175970167de60b49c8fb588106e5bbb /cmac.cpp
parentd0eefdf32a5ee7ba515d468b52fc2ea92d87fb84 (diff)
downloadcryptopp-git-a2223356b00ae3736f485e28c38213f48d2cc155.tar.gz
Use aligned buffer for CMAC
Diffstat (limited to 'cmac.cpp')
-rw-r--r--cmac.cpp18
1 files changed, 16 insertions, 2 deletions
diff --git a/cmac.cpp b/cmac.cpp
index 1b56662d..367a778c 100644
--- a/cmac.cpp
+++ b/cmac.cpp
@@ -77,7 +77,8 @@ void CMAC_Base::Update(const byte *input, size_t length)
return;
BlockCipher &cipher = AccessCipher();
- unsigned int blockSize = cipher.BlockSize();
+ const unsigned int blockSize = cipher.BlockSize();
+ const unsigned int alignment = cipher.OptimalDataAlignment();
if (m_counter > 0)
{
@@ -100,7 +101,20 @@ void CMAC_Base::Update(const byte *input, size_t length)
if (length > blockSize)
{
CRYPTOPP_ASSERT(m_counter == 0);
- size_t leftOver = 1 + cipher.AdvancedProcessBlocks(m_reg, input, m_reg, length-1, BlockTransformation::BT_DontIncrementInOutPointers|BlockTransformation::BT_XorInput);
+ const byte* is = input; // m_reg is always aligned
+
+ AlignedSecByteBlock i;
+ if (!IsAlignedOn(input, alignment))
+ {
+ i.Assign(input, length);
+ is = i.begin();
+ }
+
+ // size_t leftOver = 1 + cipher.AdvancedProcessBlocks(m_reg, input, m_reg, length-1,
+ // BlockTransformation::BT_DontIncrementInOutPointers|BlockTransformation::BT_XorInput);
+ const int flags = BlockTransformation::BT_DontIncrementInOutPointers|BlockTransformation::BT_XorInput;
+ size_t leftOver = 1 + cipher.AdvancedProcessBlocks(m_reg, is, m_reg, length-1, flags);
+
input += (length - leftOver);
length = leftOver;
}