From 369e553baa7d9bd6ecb70a31c4356b07b8923855 Mon Sep 17 00:00:00 2001 From: weidai Date: Mon, 25 Apr 2011 17:42:11 +0000 Subject: fix for makefile and Panama cipher validation failure on armel http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=619856 git-svn-id: svn://svn.code.sf.net/p/cryptopp/code/trunk/c5@526 57ff6487-cd31-0410-9ec3-f628ee90f5f0 --- GNUmakefile | 2 +- panama.cpp | 33 ++++++++++++++++----------------- panama.h | 2 +- 3 files changed, 18 insertions(+), 19 deletions(-) diff --git a/GNUmakefile b/GNUmakefile index af6554e..e664084 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -12,6 +12,7 @@ MKDIR = mkdir EGREP = egrep UNAME = $(shell uname) ISX86 = $(shell uname -m | $(EGREP) -c "i.86|x86|i86|amd64") +IS_SUN_CC = $(shell $(CXX) -V 2>&1 | $(EGREP) -c "CC: Sun") # Default prefix for make install ifeq ($(PREFIX),) @@ -27,7 +28,6 @@ ifeq ($(ISX86),1) GCC42_OR_LATER = $(shell $(CXX) -v 2>&1 | $(EGREP) -c "^gcc version (4.[2-9]|[5-9])") INTEL_COMPILER = $(shell $(CXX) --version 2>&1 | $(EGREP) -c "\(ICC\)") ICC111_OR_LATER = $(shell $(CXX) --version 2>&1 | $(EGREP) -c "\(ICC\) ([2-9][0-9]|1[2-9]|11\.[1-9])") -IS_SUN_CC = $(shell $(CXX) -V 2>&1 | $(EGREP) -c "CC: Sun") GAS210_OR_LATER = $(shell $(CXX) -xc -c /dev/null -Wa,-v -o/dev/null 2>&1 | $(EGREP) -c "GNU assembler version (2\.[1-9][0-9]|[3-9])") GAS217_OR_LATER = $(shell $(CXX) -xc -c /dev/null -Wa,-v -o/dev/null 2>&1 | $(EGREP) -c "GNU assembler version (2\.1[7-9]|2\.[2-9]|[3-9])") GAS219_OR_LATER = $(shell $(CXX) -xc -c /dev/null -Wa,-v -o/dev/null 2>&1 | $(EGREP) -c "GNU assembler version (2\.19|2\.[2-9]|[3-9])") diff --git a/panama.cpp b/panama.cpp index a1a37d6..5fc4f94 100644 --- a/panama.cpp +++ b/panama.cpp @@ -313,7 +313,7 @@ void CRYPTOPP_NOINLINE Panama_SSE2_Pull(size_t count, word32 *state, word32 *z, #ifndef CRYPTOPP_GENERATE_X64_MASM template -void Panama::Iterate(size_t count, const word32 *p, word32 *z, const word32 *y) +void Panama::Iterate(size_t count, const word32 *p, byte *output, const byte *input, KeystreamOperation operation) { word32 bstart = m_state[17]; word32 *const aPtr = m_state; @@ -329,9 +329,6 @@ void Panama::Iterate(size_t count, const word32 *p, word32 *z, const word32 * // b: 0 4 | 1 5 | 2 6 | 3 7 #define b(i, j) b##i[(j)*2%8 + (j)/4] -// output -#define OA(i) z[i] = ConditionalByteReverse(B::ToEnum(), a(i+9)) -#define OX(i) z[i] = y[i] ^ ConditionalByteReverse(B::ToEnum(), a(i+9)) // buffer update #define US(i) {word32 t=b(0,i); b(0,i)=ConditionalByteReverse(B::ToEnum(), p[i])^t; b(25,(i+6)%8)^=t;} #define UL(i) {word32 t=b(0,i); b(0,i)=a(i+1)^t; b(25,(i+6)%8)^=t;} @@ -345,18 +342,20 @@ void Panama::Iterate(size_t count, const word32 *p, word32 *z, const word32 * while (count--) { - if (z) + if (output) { - if (y) - { - OX(0); OX(1); OX(2); OX(3); OX(4); OX(5); OX(6); OX(7); - y += 8; - } - else - { - OA(0); OA(1); OA(2); OA(3); OA(4); OA(5); OA(6); OA(7); - } - z += 8; +#define PANAMA_OUTPUT(x) \ + CRYPTOPP_KEYSTREAM_OUTPUT_WORD(x, B::ToEnum(), 0, a(0+9));\ + CRYPTOPP_KEYSTREAM_OUTPUT_WORD(x, B::ToEnum(), 1, a(1+9));\ + CRYPTOPP_KEYSTREAM_OUTPUT_WORD(x, B::ToEnum(), 2, a(2+9));\ + CRYPTOPP_KEYSTREAM_OUTPUT_WORD(x, B::ToEnum(), 3, a(3+9));\ + CRYPTOPP_KEYSTREAM_OUTPUT_WORD(x, B::ToEnum(), 4, a(4+9));\ + CRYPTOPP_KEYSTREAM_OUTPUT_WORD(x, B::ToEnum(), 5, a(5+9));\ + CRYPTOPP_KEYSTREAM_OUTPUT_WORD(x, B::ToEnum(), 6, a(6+9));\ + CRYPTOPP_KEYSTREAM_OUTPUT_WORD(x, B::ToEnum(), 7, a(7+9)); + + typedef word32 WordType; + CRYPTOPP_KEYSTREAM_OUTPUT_SWITCH(PANAMA_OUTPUT, 4*8); } word32 *const b16 = (word32 *)(bPtr+((bstart+16*32) & 31*32)); @@ -429,7 +428,7 @@ void PanamaHash::TruncatedFinal(byte *hash, size_t size) this->Iterate(32); // pull FixedSizeSecBlock buf; - this->Iterate(1, NULL, buf, NULL); + this->Iterate(1, NULL, buf.BytePtr(), NULL); memcpy(hash, buf, size); @@ -491,7 +490,7 @@ void PanamaCipherPolicy::OperateKeystream(KeystreamOperation operation, byte Panama_SSE2_Pull(iterationCount, this->m_state, (word32 *)output, (const word32 *)input); else #endif - this->Iterate(iterationCount, NULL, (word32 *)output, (const word32 *)input); + this->Iterate(iterationCount, NULL, output, input, operation); } template class Panama; diff --git a/panama.h b/panama.h index 5a23681..5888f24 100644 --- a/panama.h +++ b/panama.h @@ -12,7 +12,7 @@ class CRYPTOPP_NO_VTABLE Panama { public: void Reset(); - void Iterate(size_t count, const word32 *p=NULL, word32 *z=NULL, const word32 *y=NULL); + void Iterate(size_t count, const word32 *p=NULL, byte *output=NULL, const byte *input=NULL, KeystreamOperation operation=WRITE_KEYSTREAM); protected: typedef word32 Stage[8]; -- cgit v1.2.1