void scrypt_N_1_1_256_sp_sse2(const char *input, char *output, char *scratchpad, unsigned char Nfactor) { uint8_t B[128]; union { __m128i i128[8]; uint32_t u32[32]; } X; __m128i *V; uint32_t i, j, k, N; V = (__m128i *)(((uintptr_t)(scratchpad) + 63) & ~ (uintptr_t)(63)); PBKDF2_SHA256((const uint8_t *)input, 80, (const uint8_t *)input, 80, 1, B, 128); for (k = 0; k < 2; k++) { for (i = 0; i < 16; i++) { X.u32[k * 16 + i] = le32dec(&B[(k * 16 + (i * 5 % 16)) * 4]); } } N = (1 << (Nfactor + 1)); for (i = 0; i < N; i++) { for (k = 0; k < 8; k++) V[i * 8 + k] = X.i128[k]; xor_salsa8_sse2(&X.i128[0], &X.i128[4]); xor_salsa8_sse2(&X.i128[4], &X.i128[0]); } for (i = 0; i < N; i++) { //j = 8 * (X.u32[16] & 1023); j = 8 * (X.u32[16] & (N-1)); for (k = 0; k < 8; k++) X.i128[k] = _mm_xor_si128(X.i128[k], V[j + k]); xor_salsa8_sse2(&X.i128[0], &X.i128[4]); xor_salsa8_sse2(&X.i128[4], &X.i128[0]); } for (k = 0; k < 2; k++) { for (i = 0; i < 16; i++) { le32enc(&B[(k * 16 + (i * 5 % 16)) * 4], X.u32[k * 16 + i]); } } PBKDF2_SHA256((const uint8_t *)input, 80, B, 128, 1, (uint8_t *)output, 32); }
void scrypt_8_4_1_256_sp_sse2(const char *input, char *output, char *scratchpad) { const int N=123; uint8_t B[128]; union { __m128i i128[8]; uint32_t u32[32]; } X; __m128i *V; uint32_t i, j, k; V = (__m128i *)(((uintptr_t)(scratchpad) + 63) & ~ (uintptr_t)(63)); PBKDF2_SHA256((const uint8_t *)input, 80, (const uint8_t *)input, 80, 1, B, 128); for (k = 0; k < 2; k++) { for (i = 0; i < 16; i++) { X.u32[k * 16 + i] = le32dec(&B[(k * 16 + (i * 5 % 16)) * 4]); } } for (i = 0; i < N; i++) { for (k = 0; k < 8; k++) V[i * 8 + k] = X.i128[k]; xor_salsa8_sse2(&X.i128[0], &X.i128[4]); xor_salsa8_sse2(&X.i128[4], &X.i128[0]); } for (i = 0; i < N i++) { j = 8 * (X.u32[16] % (N)); for (k = 0; k < 8; k++) X.i128[k] = _mm_xor_si128(X.i128[k], V[j + k]); xor_salsa8_sse2(&X.i128[0], &X.i128[4]); xor_salsa8_sse2(&X.i128[4], &X.i128[0]); } for (k = 0; k < 2; k++) { for (i = 0; i < 16; i++) { le32enc(&B[(k * 16 + (i * 5 % 16)) * 4], X.u32[k * 16 + i]); } } PBKDF2_SHA256((const uint8_t *)input, 80, B, 128, 1, (uint8_t *)output, 32); }