132 static const unsigned char MeowShiftAdjust[31] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128};
133 static const unsigned char MeowMaskLen[32] = {255,255,255,255, 255,255,255,255, 255,255,255,255, 255,255,255,255, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0};
137 #define MEOW_S0_INIT { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11, 12,13,14,15}
138 #define MEOW_S1_INIT {16,17,18,19, 20,21,22,23, 24,25,26,27, 28,29,30,31}
139 #define MEOW_S2_INIT {32,33,34,35, 36,37,38,39, 40,41,42,43, 44,45,46,47}
140 #define MEOW_S3_INIT {48,49,50,51, 52,53,54,55, 56,57,58,59, 60,61,62,63}
141 static const unsigned char MeowS0Init[] = MEOW_S0_INIT;
142 static const unsigned char MeowS1Init[] = MEOW_S1_INIT;
143 static const unsigned char MeowS2Init[] = MEOW_S2_INIT;
144 static const unsigned char MeowS3Init[] = MEOW_S3_INIT;
151 MeowHash_Accelerated(meow_u64 Seed, meow_u64 TotalLengthInBytes,
void *SourceInit)
157 meow_aes_128 S0 = Meow128_GetAESConstant(MeowS0Init);
158 meow_aes_128 S1 = Meow128_GetAESConstant(MeowS1Init);
159 meow_aes_128 S2 = Meow128_GetAESConstant(MeowS2Init);
160 meow_aes_128 S3 = Meow128_GetAESConstant(MeowS3Init);
162 meow_u128 Mixer = Meow128_Set64x2(Seed - TotalLengthInBytes,
163 Seed + TotalLengthInBytes + 1);
169 meow_u8 *Source = (meow_u8 *)SourceInit;
170 meow_u64 Len = TotalLengthInBytes;
171 int unsigned Len8 = Len & 15;
172 int unsigned Len128 = Len & 48;
176 S0 = Meow128_AESDEC_Mem(S0, Source);
177 S1 = Meow128_AESDEC_Mem(S1, Source + 16);
178 S2 = Meow128_AESDEC_Mem(S2, Source + 32);
179 S3 = Meow128_AESDEC_Mem(S3, Source + 48);
191 meow_u8 *Overhang = Source + Len128;
192 int Align = ((int)(meow_umm)Overhang) & 15;
195 int End = ((int)(meow_umm)Overhang) & (MEOW_PAGESIZE - 1);
198 if (End <= (MEOW_PAGESIZE - 16))
204 if ((End + Len8) > MEOW_PAGESIZE)
209 meow_u128 Partial = Meow128_Shuffle_Mem(Overhang - Align, &MeowShiftAdjust[Align]);
211 Partial = Meow128_And_Mem( Partial, &MeowMaskLen[16 - Len8] );
212 S3 = Meow128_AESDEC(S3, Partial);
218 meow_u128 Partial = Meow128_And_Mem(*(meow_u128 *)Overhang, &MeowMaskLen[16 - Len8]);
219 S3 = Meow128_AESDEC(S3, Partial);
229 case 48: S2 = Meow128_AESDEC_Mem(S2, Source + 32);
230 case 32: S1 = Meow128_AESDEC_Mem(S1, Source + 16);
231 case 16: S0 = Meow128_AESDEC_Mem(S0, Source);
238 S3 = Meow128_AESDEC(S3, Mixer);
239 S2 = Meow128_AESDEC(S2, Mixer);
240 S1 = Meow128_AESDEC(S1, Mixer);
241 S0 = Meow128_AESDEC(S0, Mixer);
243 S2 = Meow128_AESDEC(S2, Meow128_AESDEC_Finalize(S3));
244 S0 = Meow128_AESDEC(S0, Meow128_AESDEC_Finalize(S1));
246 S2 = Meow128_AESDEC(S2, Mixer);
248 S0 = Meow128_AESDEC(S0, Meow128_AESDEC_Finalize(S2));
249 S0 = Meow128_AESDEC(S0, Mixer);
252 Meow128_CopyToHash(Meow128_AESDEC_Finalize(S0), Result);