tiger.cpp
00001
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();
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 22:04:03 2004 for Crypto++ by
1.3.8