Main Page   Class Hierarchy   Alphabetical List   Compound List   File List   Compound 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 
00006 #ifdef WORD64_AVAILABLE
00007 
00008 NAMESPACE_BEGIN(CryptoPP)
00009 
00010 void Tiger::Init()
00011 {
00012         digest[0] = W64LIT(0x0123456789ABCDEF);
00013         digest[1] = W64LIT(0xFEDCBA9876543210);
00014         digest[2] = W64LIT(0xF096A5B4C3B2E187);
00015 }
00016 
00017 void Tiger::Final(byte *hash)
00018 {
00019         PadLastBlock(56, 0x01);
00020         CorrectEndianess(data, data, 56);
00021 
00022         data[7] = countLo;
00023 
00024         Transform(digest, data);
00025         CorrectEndianess(digest, digest, DigestSize());
00026         memcpy(hash, digest, DigestSize());
00027 
00028         Reinit();               // reinit for next use
00029 }
00030 
00031 #define t1 (table)
00032 #define t2 (table+256)
00033 #define t3 (table+256*2)
00034 #define t4 (table+256*3)
00035 
00036 #define round(a,b,c,x,mul) \
00037         c ^= x; \
00038         a -= t1[GETBYTE(c,0)] ^ t2[GETBYTE(c,2)] ^ t3[GETBYTE(c,4)] ^ t4[GETBYTE(c,6)]; \
00039         b += t4[GETBYTE(c,1)] ^ t3[GETBYTE(c,3)] ^ t2[GETBYTE(c,5)] ^ t1[GETBYTE(c,7)]; \
00040         b *= mul
00041 
00042 #define pass(a,b,c,mul,X) \
00043         round(a,b,c,X[0],mul); \
00044         round(b,c,a,X[1],mul); \
00045         round(c,a,b,X[2],mul); \
00046         round(a,b,c,X[3],mul); \
00047         round(b,c,a,X[4],mul); \
00048         round(c,a,b,X[5],mul); \
00049         round(a,b,c,X[6],mul); \
00050         round(b,c,a,X[7],mul)
00051 
00052 #define key_schedule(Y,X) \
00053         Y[0] = X[0] - (X[7]^W64LIT(0xA5A5A5A5A5A5A5A5)); \
00054         Y[1] = X[1] ^ Y[0]; \
00055         Y[2] = X[2] + Y[1]; \
00056         Y[3] = X[3] - (Y[2] ^ ((~Y[1])<<19)); \
00057         Y[4] = X[4] ^ Y[3]; \
00058         Y[5] = X[5] + Y[4]; \
00059         Y[6] = X[6] - (Y[5] ^ ((~Y[4])>>23)); \
00060         Y[7] = X[7] ^ Y[6]; \
00061         Y[0] += Y[7]; \
00062         Y[1] -= Y[0] ^ ((~Y[7])<<19); \
00063         Y[2] ^= Y[1]; \
00064         Y[3] += Y[2]; \
00065         Y[4] -= Y[3] ^ ((~Y[2])>>23); \
00066         Y[5] ^= Y[4]; \
00067         Y[6] += Y[5]; \
00068         Y[7] -= Y[6] ^ W64LIT(0x0123456789ABCDEF)
00069 
00070 void Tiger::Transform (word64 *digest, const word64 *X)
00071 {
00072         word64 a = digest[0];
00073         word64 b = digest[1];
00074         word64 c = digest[2];
00075         word64 Y[8];
00076 
00077         pass(a,b,c,5,X);
00078         key_schedule(Y,X);
00079         pass(c,a,b,7,Y);
00080         key_schedule(Y,Y);
00081         pass(b,c,a,9,Y);
00082 
00083         digest[0] = a ^ digest[0];
00084         digest[1] = b - digest[1];
00085         digest[2] = c + digest[2];
00086 
00087         Y[0] = Y[1] = Y[2] = Y[3] = Y[4] = Y[5] = Y[6] = Y[7] = 0;
00088 }
00089 
00090 NAMESPACE_END
00091 
00092 #endif  // WORD64_AVAILABLE

Generated at Mon Jan 15 01:16:37 2001 for Crypto++ by doxygen1.2.4 written by Dimitri van Heesch, © 1997-2000