diff --git a/simon-simd.cpp b/simon-simd.cpp index 14461e31..ae322af3 100644 --- a/simon-simd.cpp +++ b/simon-simd.cpp @@ -234,8 +234,9 @@ inline void SIMON128_Dec_Block(uint8x16_t &block0, const word64 *subkeys, unsign if (rounds & 1) { - const uint64x2_t rk = vld1q_dup_u64(subkeys + rounds - 1); std::swap(x1, y1); + const uint64x2_t rk = vld1q_dup_u64(subkeys + rounds - 1); + y1 = veorq_u64(veorq_u64(y1, rk), SIMON128_f(x1)); rounds--; } @@ -266,7 +267,7 @@ inline void SIMON128_Dec_6_Blocks(uint8x16_t &block0, uint8x16_t &block1, uint64x2_t x2 = UnpackLow64(block2, block3); uint64x2_t y2 = UnpackHigh64(block2, block3); uint64x2_t x3 = UnpackLow64(block4, block5); - uint64x2_t y3 = UnpackHigh64(block5, block5); + uint64x2_t y3 = UnpackHigh64(block4, block5); x1 = Shuffle64(x1); y1 = Shuffle64(y1); x2 = Shuffle64(x2); y2 = Shuffle64(y2); @@ -279,6 +280,7 @@ inline void SIMON128_Dec_6_Blocks(uint8x16_t &block0, uint8x16_t &block1, y1 = veorq_u64(veorq_u64(y1, rk), SIMON128_f(x1)); y2 = veorq_u64(veorq_u64(y2, rk), SIMON128_f(x2)); + y3 = veorq_u64(veorq_u64(y3, rk), SIMON128_f(x3)); rounds--; } diff --git a/simon.cpp b/simon.cpp index a966a4ca..11530120 100644 --- a/simon.cpp +++ b/simon.cpp @@ -384,7 +384,7 @@ void SIMON128::Dec::ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock OutBlock oblk(xorBlock, outBlock); oblk(m_wspace[2])(m_wspace[3]); } -#if defined(CRYPTOPP_SIMON_ADVANCED_PROCESS_BLOCKS) +#if defined(CRYPTOPP_SIMON64_ADVANCED_PROCESS_BLOCKS) size_t SIMON64::Enc::AdvancedProcessBlocks(const byte *inBlocks, const byte *xorBlocks, byte *outBlocks, size_t length, word32 flags) const { @@ -416,7 +416,9 @@ size_t SIMON64::Dec::AdvancedProcessBlocks(const byte *inBlocks, const byte *xor #endif return BlockTransformation::AdvancedProcessBlocks(inBlocks, xorBlocks, outBlocks, length, flags); } +#endif // CRYPTOPP_SIMON64_ADVANCED_PROCESS_BLOCKS +#if defined(CRYPTOPP_SIMON128_ADVANCED_PROCESS_BLOCKS) size_t SIMON128::Enc::AdvancedProcessBlocks(const byte *inBlocks, const byte *xorBlocks, byte *outBlocks, size_t length, word32 flags) const { @@ -448,6 +450,6 @@ size_t SIMON128::Dec::AdvancedProcessBlocks(const byte *inBlocks, const byte *xo #endif return BlockTransformation::AdvancedProcessBlocks(inBlocks, xorBlocks, outBlocks, length, flags); } -#endif +#endif // CRYPTOPP_SIMON128_ADVANCED_PROCESS_BLOCKS NAMESPACE_END diff --git a/simon.h b/simon.h index 48382072..2b47debb 100644 --- a/simon.h +++ b/simon.h @@ -16,8 +16,12 @@ #include "seckey.h" #include "secblock.h" +#if CRYPTOPP_BOOL_X64 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X86 +# define CRYPTOPP_SIMON64_ADVANCED_PROCESS_BLOCKS 1 +#endif + #if CRYPTOPP_BOOL_X64 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_ARM32 || CRYPTOPP_BOOL_ARM64 -# define CRYPTOPP_SIMON_ADVANCED_PROCESS_BLOCKS 1 +# define CRYPTOPP_SIMON128_ADVANCED_PROCESS_BLOCKS 1 #endif NAMESPACE_BEGIN(CryptoPP) @@ -94,7 +98,7 @@ public: { protected: void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const; -#if CRYPTOPP_SIMON_ADVANCED_PROCESS_BLOCKS +#if CRYPTOPP_SIMON64_ADVANCED_PROCESS_BLOCKS size_t AdvancedProcessBlocks(const byte *inBlocks, const byte *xorBlocks, byte *outBlocks, size_t length, word32 flags) const; #endif }; @@ -107,7 +111,7 @@ public: { protected: void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const; -#if CRYPTOPP_SIMON_ADVANCED_PROCESS_BLOCKS +#if CRYPTOPP_SIMON64_ADVANCED_PROCESS_BLOCKS size_t AdvancedProcessBlocks(const byte *inBlocks, const byte *xorBlocks, byte *outBlocks, size_t length, word32 flags) const; #endif }; @@ -152,7 +156,7 @@ public: { protected: void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const; -#if CRYPTOPP_SIMON_ADVANCED_PROCESS_BLOCKS +#if CRYPTOPP_SIMON128_ADVANCED_PROCESS_BLOCKS size_t AdvancedProcessBlocks(const byte *inBlocks, const byte *xorBlocks, byte *outBlocks, size_t length, word32 flags) const; #endif }; @@ -165,7 +169,7 @@ public: { protected: void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const; -#if CRYPTOPP_SIMON_ADVANCED_PROCESS_BLOCKS +#if CRYPTOPP_SIMON128_ADVANCED_PROCESS_BLOCKS size_t AdvancedProcessBlocks(const byte *inBlocks, const byte *xorBlocks, byte *outBlocks, size_t length, word32 flags) const; #endif }; diff --git a/speck-simd.cpp b/speck-simd.cpp index c1f2b4cc..a63ce4c6 100644 --- a/speck-simd.cpp +++ b/speck-simd.cpp @@ -254,7 +254,7 @@ inline void SPECK128_Dec_6_Blocks(uint8x16_t &block0, uint8x16_t &block1, uint64x2_t x2 = UnpackLow64(block2, block3); uint64x2_t y2 = UnpackHigh64(block2, block3); uint64x2_t x3 = UnpackLow64(block4, block5); - uint64x2_t y3 = UnpackHigh64(block5, block5); + uint64x2_t y3 = UnpackHigh64(block4, block5); x1 = Shuffle64(x1); y1 = Shuffle64(y1); @@ -996,10 +996,6 @@ inline size_t SPECK64_AdvancedProcessBlocks_SSE41(F1 func1, F4 func4, } } - //inBlocks += inIncrement; - //xorBlocks += xorIncrement; - //outBlocks += outIncrement; - while (length >= blockSize) { const word32* inPtr = reinterpret_cast(inBlocks); diff --git a/speck.cpp b/speck.cpp index f6762094..5acac044 100644 --- a/speck.cpp +++ b/speck.cpp @@ -364,7 +364,7 @@ void SPECK128::Dec::ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock OutBlock oblk(xorBlock, outBlock); oblk(m_wspace[2])(m_wspace[3]); } -#if defined(CRYPTOPP_SPECK_ADVANCED_PROCESS_BLOCKS) +#if defined(CRYPTOPP_SPECK64_ADVANCED_PROCESS_BLOCKS) size_t SPECK64::Enc::AdvancedProcessBlocks(const byte *inBlocks, const byte *xorBlocks, byte *outBlocks, size_t length, word32 flags) const { @@ -386,7 +386,9 @@ size_t SPECK64::Dec::AdvancedProcessBlocks(const byte *inBlocks, const byte *xor #endif return BlockTransformation::AdvancedProcessBlocks(inBlocks, xorBlocks, outBlocks, length, flags); } +#endif // CRYPTOPP_SPECK64_ADVANCED_PROCESS_BLOCKS +#if defined(CRYPTOPP_SPECK128_ADVANCED_PROCESS_BLOCKS) size_t SPECK128::Enc::AdvancedProcessBlocks(const byte *inBlocks, const byte *xorBlocks, byte *outBlocks, size_t length, word32 flags) const { @@ -418,6 +420,6 @@ size_t SPECK128::Dec::AdvancedProcessBlocks(const byte *inBlocks, const byte *xo #endif return BlockTransformation::AdvancedProcessBlocks(inBlocks, xorBlocks, outBlocks, length, flags); } -#endif +#endif // CRYPTOPP_SPECK128_ADVANCED_PROCESS_BLOCKS NAMESPACE_END diff --git a/speck.h b/speck.h index f34488af..6571074e 100644 --- a/speck.h +++ b/speck.h @@ -17,7 +17,11 @@ #include "secblock.h" #if CRYPTOPP_BOOL_X64 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_ARM32 || CRYPTOPP_BOOL_ARM64 -# define CRYPTOPP_SPECK_ADVANCED_PROCESS_BLOCKS 1 +# define CRYPTOPP_SPECK64_ADVANCED_PROCESS_BLOCKS 1 +#endif + +#if CRYPTOPP_BOOL_X64 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_ARM32 || CRYPTOPP_BOOL_ARM64 +# define CRYPTOPP_SPECK128_ADVANCED_PROCESS_BLOCKS 1 #endif NAMESPACE_BEGIN(CryptoPP) @@ -94,7 +98,7 @@ public: { protected: void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const; -#if CRYPTOPP_SPECK_ADVANCED_PROCESS_BLOCKS +#if CRYPTOPP_SPECK64_ADVANCED_PROCESS_BLOCKS size_t AdvancedProcessBlocks(const byte *inBlocks, const byte *xorBlocks, byte *outBlocks, size_t length, word32 flags) const; #endif }; @@ -107,7 +111,7 @@ public: { protected: void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const; -#if CRYPTOPP_SPECK_ADVANCED_PROCESS_BLOCKS +#if CRYPTOPP_SPECK64_ADVANCED_PROCESS_BLOCKS size_t AdvancedProcessBlocks(const byte *inBlocks, const byte *xorBlocks, byte *outBlocks, size_t length, word32 flags) const; #endif }; @@ -152,7 +156,7 @@ public: { protected: void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const; -#if CRYPTOPP_SPECK_ADVANCED_PROCESS_BLOCKS +#if CRYPTOPP_SPECK128_ADVANCED_PROCESS_BLOCKS size_t AdvancedProcessBlocks(const byte *inBlocks, const byte *xorBlocks, byte *outBlocks, size_t length, word32 flags) const; #endif }; @@ -165,7 +169,7 @@ public: { protected: void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const; -#if CRYPTOPP_SPECK_ADVANCED_PROCESS_BLOCKS +#if CRYPTOPP_SPECK128_ADVANCED_PROCESS_BLOCKS size_t AdvancedProcessBlocks(const byte *inBlocks, const byte *xorBlocks, byte *outBlocks, size_t length, word32 flags) const; #endif };