Crypto: remove unnecessary alignment adjusting code in Serpent since the SIMD implementation works with unaligned data and gain negligible compared to memcpy overhead.

This commit is contained in:
Mounir IDRASSI 2016-11-28 00:46:31 +01:00
parent 263abeee3a
commit 91e0de6145
No known key found for this signature in database
GPG Key ID: DD0C382D5FCFB8FC

View File

@ -83,31 +83,9 @@ void serpent_encrypt_blocks(const unsigned __int8* in, unsigned __int8* out, siz
#if CRYPTOPP_BOOL_SSE2_INTRINSICS_AVAILABLE #if CRYPTOPP_BOOL_SSE2_INTRINSICS_AVAILABLE
if(HasSSE2() && (blocks >= 4)) if(HasSSE2() && (blocks >= 4))
{ {
CRYPTOPP_ALIGN_DATA(16) unsigned __int8 alignedInputBuffer[4 * 16];
CRYPTOPP_ALIGN_DATA(16) unsigned __int8 alignedOutputBuffer[4 * 16];
unsigned __int8 *inPtr, *outPtr;
BOOL inputAligned = IsAligned16(in)? TRUE : FALSE;
BOOL outputAligned = IsAligned16(out)? TRUE : FALSE;
while(blocks >= 4) while(blocks >= 4)
{ {
if (inputAligned) serpent_simd_encrypt_blocks_4(in, out, round_key);
inPtr = (unsigned __int8 *) in;
else
{
inPtr = alignedInputBuffer;
memcpy (inPtr, in, 4 * 16);
}
if (out == in)
outPtr = inPtr;
else if (outputAligned)
outPtr = (unsigned __int8 *) out;
else
{
outPtr = alignedOutputBuffer;
memcpy (outPtr, out, 4 * 16);
}
serpent_simd_encrypt_blocks_4(inPtr, outPtr, round_key);
in += 4 * 16; in += 4 * 16;
out += 4 * 16; out += 4 * 16;
blocks -= 4; blocks -= 4;
@ -184,31 +162,9 @@ void serpent_decrypt_blocks(const unsigned __int8* in, unsigned __int8* out, siz
#if CRYPTOPP_BOOL_SSE2_INTRINSICS_AVAILABLE #if CRYPTOPP_BOOL_SSE2_INTRINSICS_AVAILABLE
if(HasSSE2() && (blocks >= 4)) if(HasSSE2() && (blocks >= 4))
{ {
CRYPTOPP_ALIGN_DATA(16) unsigned __int8 alignedInputBuffer[4 * 16];
CRYPTOPP_ALIGN_DATA(16) unsigned __int8 alignedOutputBuffer[4 * 16];
unsigned __int8 *inPtr, *outPtr;
BOOL inputAligned = IsAligned16(in)? TRUE : FALSE;
BOOL outputAligned = IsAligned16(out)? TRUE : FALSE;
while(blocks >= 4) while(blocks >= 4)
{ {
if (inputAligned) serpent_simd_decrypt_blocks_4(in, out, round_key);
inPtr = (unsigned __int8 *) in;
else
{
inPtr = alignedInputBuffer;
memcpy (inPtr, in, 4 * 16);
}
if (out == in)
outPtr = inPtr;
else if (outputAligned)
outPtr = (unsigned __int8 *) out;
else
{
outPtr = alignedOutputBuffer;
memcpy (outPtr, out, 4 * 16);
}
serpent_simd_decrypt_blocks_4(inPtr, outPtr, round_key);
in += 4 * 16; in += 4 * 16;
out += 4 * 16; out += 4 * 16;
blocks -= 4; blocks -= 4;