Crypt-Digest-Scrypt
view release on metacpan or search on metacpan
/* Compute U_j. */
HMAC_SHA256_Init(&hctx, passwd, passwdlen);
HMAC_SHA256_Update(&hctx, U, 32);
HMAC_SHA256_Final(U, &hctx);
/* ... xor U_j ... */
for (k = 0; k < 32; k++)
T[k] ^= U[k];
}
/* Copy as many bytes as necessary into buf. */
clen = dkLen - i * 32;
if (clen > 32)
clen = 32;
memcpy(&buf[i * 32], T, clen);
}
/* Clean PShctx, since we never called _Final on it. */
memset(&PShctx, 0, sizeof(HMAC_SHA256_CTX));
}
void scrypt_1024_1_1_256(const char *input, size_t inputlen, char *output)
{
uint8_t B[128];
uint32_t X[32];
uint32_t *V;
uint32_t i, j, k;
char scratchpad[SCRYPT_SCRATCHPAD_SIZE];
V = (uint32_t *)(((uintptr_t)(scratchpad) + 63) & ~ (uintptr_t)(63));
PBKDF2_SHA256((const uint8_t *)input, inputlen, (const uint8_t *)input, inputlen, 1, B, 128);
for (k = 0; k < 32; k++)
X[k] = le32dec(&B[4 * k]);
for (i = 0; i < 1024; i++) {
memcpy(&V[i * 32], X, 128);
xor_salsa8(&X[0], &X[16]);
xor_salsa8(&X[16], &X[0]);
}
for (i = 0; i < 1024; i++) {
j = 32 * (X[16] & 1023);
for (k = 0; k < 32; k++)
X[k] ^= V[j + k];
xor_salsa8(&X[0], &X[16]);
xor_salsa8(&X[16], &X[0]);
}
for (k = 0; k < 32; k++)
le32enc(&B[4 * k], X[k]);
PBKDF2_SHA256((const uint8_t *)input, inputlen, B, 128, 1, (uint8_t *)output, 32);
}
MODULE = Crypt::Digest::Scrypt PACKAGE = Crypt::Digest::Scrypt
PROTOTYPES: DISABLE
void scrypt_1024_1_1_256(SV *svdata)
PPCODE:
{
char hash[32];
STRLEN len;
const char *data = (const char *)SvPV(svdata, len);
scrypt_1024_1_1_256(data, len, hash);
SV *pv = newSVpvn(hash, sizeof(hash));
SvPOK_only (pv);
XPUSHs(sv_2mortal(pv));
}
( run in 0.597 second using v1.01-cache-2.11-cpan-71847e10f99 )