Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members

tiger.cpp

00001 // tiger.cpp - written and placed in the public domain by Wei Dai 00002 00003 #include "pch.h" 00004 #include "tiger.h" 00005 #include "misc.h" 00006 00007 #ifdef WORD64_AVAILABLE 00008 00009 NAMESPACE_BEGIN(CryptoPP) 00010 00011 void Tiger::InitState(HashWordType *state) 00012 { 00013 state[0] = W64LIT(0x0123456789ABCDEF); 00014 state[1] = W64LIT(0xFEDCBA9876543210); 00015 state[2] = W64LIT(0xF096A5B4C3B2E187); 00016 } 00017 00018 void Tiger::TruncatedFinal(byte *hash, unsigned int size) 00019 { 00020 ThrowIfInvalidTruncatedSize(size); 00021 00022 PadLastBlock(56, 0x01); 00023 CorrectEndianess(m_data, m_data, 56); 00024 00025 m_data[7] = GetBitCountLo(); 00026 00027 Transform(m_digest, m_data); 00028 CorrectEndianess(m_digest, m_digest, DigestSize()); 00029 memcpy(hash, m_digest, size); 00030 00031 Restart(); // reinit for next use 00032 } 00033 00034 #define t1 (table) 00035 #define t2 (table+256) 00036 #define t3 (table+256*2) 00037 #define t4 (table+256*3) 00038 00039 #define round(a,b,c,x,mul) \ 00040 c ^= x; \ 00041 a -= t1[GETBYTE(c,0)] ^ t2[GETBYTE(c,2)] ^ t3[GETBYTE(c,4)] ^ t4[GETBYTE(c,6)]; \ 00042 b += t4[GETBYTE(c,1)] ^ t3[GETBYTE(c,3)] ^ t2[GETBYTE(c,5)] ^ t1[GETBYTE(c,7)]; \ 00043 b *= mul 00044 00045 #define pass(a,b,c,mul,X) \ 00046 round(a,b,c,X[0],mul); \ 00047 round(b,c,a,X[1],mul); \ 00048 round(c,a,b,X[2],mul); \ 00049 round(a,b,c,X[3],mul); \ 00050 round(b,c,a,X[4],mul); \ 00051 round(c,a,b,X[5],mul); \ 00052 round(a,b,c,X[6],mul); \ 00053 round(b,c,a,X[7],mul) 00054 00055 #define key_schedule(Y,X) \ 00056 Y[0] = X[0] - (X[7]^W64LIT(0xA5A5A5A5A5A5A5A5)); \ 00057 Y[1] = X[1] ^ Y[0]; \ 00058 Y[2] = X[2] + Y[1]; \ 00059 Y[3] = X[3] - (Y[2] ^ ((~Y[1])<<19)); \ 00060 Y[4] = X[4] ^ Y[3]; \ 00061 Y[5] = X[5] + Y[4]; \ 00062 Y[6] = X[6] - (Y[5] ^ ((~Y[4])>>23)); \ 00063 Y[7] = X[7] ^ Y[6]; \ 00064 Y[0] += Y[7]; \ 00065 Y[1] -= Y[0] ^ ((~Y[7])<<19); \ 00066 Y[2] ^= Y[1]; \ 00067 Y[3] += Y[2]; \ 00068 Y[4] -= Y[3] ^ ((~Y[2])>>23); \ 00069 Y[5] ^= Y[4]; \ 00070 Y[6] += Y[5]; \ 00071 Y[7] -= Y[6] ^ W64LIT(0x0123456789ABCDEF) 00072 00073 void Tiger::Transform (word64 *digest, const word64 *X) 00074 { 00075 word64 a = digest[0]; 00076 word64 b = digest[1]; 00077 word64 c = digest[2]; 00078 word64 Y[8]; 00079 00080 pass(a,b,c,5,X); 00081 key_schedule(Y,X); 00082 pass(c,a,b,7,Y); 00083 key_schedule(Y,Y); 00084 pass(b,c,a,9,Y); 00085 00086 digest[0] = a ^ digest[0]; 00087 digest[1] = b - digest[1]; 00088 digest[2] = c + digest[2]; 00089 00090 memset(Y, 0, sizeof(Y)); 00091 } 00092 00093 NAMESPACE_END 00094 00095 #endif // WORD64_AVAILABLE

Generated on Fri Aug 27 19:39:24 2004 for Crypto++ by doxygen 1.3.8