12 void Tiger::InitState(HashWordType *state)
14 state[0] = W64LIT(0x0123456789ABCDEF);
15 state[1] = W64LIT(0xFEDCBA9876543210);
16 state[2] = W64LIT(0xF096A5B4C3B2E187);
21 ThrowIfInvalidTruncatedSize(size);
23 PadLastBlock(56, 0x01);
24 CorrectEndianess(m_data, m_data, 56);
26 m_data[7] = GetBitCountLo();
28 Transform(m_state, m_data);
29 CorrectEndianess(m_state, m_state,
DigestSize());
30 memcpy(hash, m_state, size);
35 void Tiger::Transform (word64 *digest,
const word64 *X)
37 #if CRYPTOPP_BOOL_SSE2_ASM_AVAILABLE && (CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32) 47 const word64 *t = table;
50 AS2( lea edx, [table])
56 AS2( movq mm1, [eax+1*8])
58 AS2( movq mm2, [eax+2*8])
59 AS2( movq mm7, [edx+4*2048+0*8])
60 AS2( movq mm6, [edx+4*2048+1*8])
62 AS2( and esp, 0xfffffff0)
66 #define SSE2_round(a,b,c,x,mul) \ 70 AS2( movq mm3, [edx+0*2048+edi*8])\ 72 AS2( movq mm4, [edx+3*2048+edi*8])\ 75 AS2( pxor mm3, [edx+1*2048+edi*8])\ 77 AS2( pxor mm4, [edx+2*2048+edi*8])\ 78 AS3( pextrw ecx, c, 2)\ 80 AS2( pxor mm3, [edx+2*2048+edi*8])\ 82 AS2( pxor mm4, [edx+1*2048+edi*8])\ 83 AS3( pextrw ecx, c, 3)\ 85 AS2( pxor mm3, [edx+3*2048+edi*8])\ 88 AS2( pxor mm4, [edx+0*2048+edi*8])\ 92 #define SSE2_mul_5(b) \ 97 #define SSE2_mul_7(b) \ 102 #define SSE2_mul_9(b) \ 111 #define SSE2_pass(A,B,C,mul,X) \ 114 SSE2_round(A,B,C,X+0*8+ebx,mul)\ 115 SSE2_round(B,C,A,X+1*8+ebx,mul)\ 117 ASJ( je, label2_##mul, f)\ 118 SSE2_round(C,A,B,X+2*8+ebx,mul)\ 123 #define SSE2_key_schedule(Y,X) \ 124 AS2( movq mm3, [X+7*8])\ 126 AS2( movq mm4, [X+0*8])\ 127 AS2( psubq mm4, mm3)\ 128 AS2( movq [Y+0*8], mm4)\ 129 AS2( pxor mm4, [X+1*8])\ 131 AS2( movq [Y+1*8], mm4)\ 132 AS2( paddq mm4, [X+2*8])\ 135 AS2( movq [Y+2*8], mm4)\ 137 AS2( movq mm4, [X+3*8])\ 138 AS2( psubq mm4, mm3)\ 139 AS2( movq [Y+3*8], mm4)\ 140 AS2( pxor mm4, [X+4*8])\ 142 AS2( movq [Y+4*8], mm4)\ 143 AS2( paddq mm4, [X+5*8])\ 146 AS2( movq [Y+5*8], mm4)\ 148 AS2( movq mm4, [X+6*8])\ 149 AS2( psubq mm4, mm3)\ 150 AS2( movq [Y+6*8], mm4)\ 151 AS2( pxor mm4, [X+7*8])\ 153 AS2( movq [Y+7*8], mm4)\ 154 AS2( paddq mm4, [Y+0*8])\ 157 AS2( movq [Y+0*8], mm4)\ 159 AS2( movq mm4, [Y+1*8])\ 160 AS2( psubq mm4, mm3)\ 161 AS2( movq [Y+1*8], mm4)\ 162 AS2( pxor mm4, [Y+2*8])\ 164 AS2( movq [Y+2*8], mm4)\ 165 AS2( paddq mm4, [Y+3*8])\ 168 AS2( movq [Y+3*8], mm4)\ 170 AS2( movq mm4, [Y+4*8])\ 171 AS2( psubq mm4, mm3)\ 172 AS2( movq [Y+4*8], mm4)\ 173 AS2( pxor mm4, [Y+5*8])\ 174 AS2( movq [Y+5*8], mm4)\ 175 AS2( paddq mm4, [Y+6*8])\ 176 AS2( movq [Y+6*8], mm4)\ 177 AS2( pxor mm4, [edx+4*2048+2*8])\ 178 AS2( movq mm3, [Y+7*8])\ 179 AS2( psubq mm3, mm4)\ 180 AS2( movq [Y+7*8], mm3) 182 #if CRYPTOPP_BOOL_X32 183 SSE2_pass(mm0, mm1, mm2, 5, esi)
184 SSE2_key_schedule(esp+8, esi)
185 SSE2_pass(mm2, mm0, mm1, 7, esp+8)
186 SSE2_key_schedule(esp+8, esp+8)
187 SSE2_pass(mm1, mm2, mm0, 9, esp+8)
189 SSE2_pass(mm0, mm1, mm2, 5, esi)
190 SSE2_key_schedule(esp+4, esi)
191 SSE2_pass(mm2, mm0, mm1, 7, esp+4)
192 SSE2_key_schedule(esp+4, esp+4)
193 SSE2_pass(mm1, mm2, mm0, 9, esp+4)
196 AS2( pxor mm0, [eax+0*8])
197 AS2( movq [eax+0*8], mm0)
199 AS2( movq [eax+1*8], mm1)
200 AS2( paddq mm2, [eax+2*8])
201 AS2( movq [eax+2*8], mm2)
210 :
"a" (digest),
"S" (X),
"d" (table)
211 :
"%ecx",
"%edi",
"memory",
"cc" 218 word64 a = digest[0];
219 word64 b = digest[1];
220 word64 c = digest[2];
224 #define t2 (table+256) 225 #define t3 (table+256*2) 226 #define t4 (table+256*3) 228 #define round(a,b,c,x,mul) \ 230 a -= t1[GETBYTE(c,0)] ^ t2[GETBYTE(c,2)] ^ t3[GETBYTE(c,4)] ^ t4[GETBYTE(c,6)]; \ 231 b += t4[GETBYTE(c,1)] ^ t3[GETBYTE(c,3)] ^ t2[GETBYTE(c,5)] ^ t1[GETBYTE(c,7)]; \ 234 #define pass(a,b,c,mul,X) {\ 238 round(a,b,c,X[i+0],mul); \ 239 round(b,c,a,X[i+1],mul); \ 242 round(c,a,b,X[i+2],mul); \ 246 #define key_schedule(Y,X) \ 247 Y[0] = X[0] - (X[7]^W64LIT(0xA5A5A5A5A5A5A5A5)); \ 248 Y[1] = X[1] ^ Y[0]; \ 249 Y[2] = X[2] + Y[1]; \ 250 Y[3] = X[3] - (Y[2] ^ ((~Y[1])<<19)); \ 251 Y[4] = X[4] ^ Y[3]; \ 252 Y[5] = X[5] + Y[4]; \ 253 Y[6] = X[6] - (Y[5] ^ ((~Y[4])>>23)); \ 254 Y[7] = X[7] ^ Y[6]; \ 256 Y[1] -= Y[0] ^ ((~Y[7])<<19); \ 259 Y[4] -= Y[3] ^ ((~Y[2])>>23); \ 262 Y[7] -= Y[6] ^ W64LIT(0x0123456789ABCDEF) 270 digest[0] = a ^ digest[0];
271 digest[1] = b - digest[1];
272 digest[2] = c + digest[2];
Utility functions for the Crypto++ library.
Library configuration file.
Classes, functions, intrinsics and features for X86, X32 nd X64 assembly.
Crypto++ library namespace.
void TruncatedFinal(byte *hash, size_t size)
Computes the hash of the current message.