Crypt-Digest-Scrypt

 view release on metacpan or  search on metacpan

Scrypt.xs  view on Meta::CPAN

            /* 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 )