libroot/crypt: remove selectsmix
There's only one implementation of smix so we don't need any selection logic. Change-Id: Id43e4ed49ee5a96755c3c4ab975bd128024e57b0 Reviewed-on: https://review.haiku-os.org/c/haiku/+/6065 Tested-by: Commit checker robot <no-reply+buildbot@haiku-os.org> Reviewed-by: Adrien Destugues <pulkomandy@pulkomandy.tk>
This commit is contained in:
parent
0849c914a7
commit
1831c1c60d
@ -40,17 +40,19 @@
|
|||||||
|
|
||||||
#include "crypto_scrypt.h"
|
#include "crypto_scrypt.h"
|
||||||
|
|
||||||
static void (*smix_func)(uint8_t *, size_t, uint64_t, void *, void *) = NULL;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* _crypto_scrypt(passwd, passwdlen, salt, saltlen, N, r, p, buf, buflen, smix):
|
* crypto_scrypt(passwd, passwdlen, salt, saltlen, N, r, p, buf, buflen):
|
||||||
* Perform the requested scrypt computation, using ${smix} as the smix routine.
|
* Compute scrypt(passwd[0 .. passwdlen - 1], salt[0 .. saltlen - 1], N, r,
|
||||||
|
* p, buflen) and write the result into buf. The parameters r, p, and buflen
|
||||||
|
* must satisfy r * p < 2^30 and buflen <= (2^32 - 1) * 32. The parameter N
|
||||||
|
* must be a power of 2 greater than 1.
|
||||||
|
*
|
||||||
|
* Return 0 on success; or -1 on error.
|
||||||
*/
|
*/
|
||||||
static int
|
int
|
||||||
_crypto_scrypt(const uint8_t * passwd, size_t passwdlen,
|
crypto_scrypt(const uint8_t * passwd, size_t passwdlen,
|
||||||
const uint8_t * salt, size_t saltlen, uint64_t N, uint32_t _r, uint32_t _p,
|
const uint8_t * salt, size_t saltlen, uint64_t N, uint32_t _r, uint32_t _p,
|
||||||
uint8_t * buf, size_t buflen,
|
uint8_t * buf, size_t buflen)
|
||||||
void (*smix)(uint8_t *, size_t, uint64_t, void *, void *))
|
|
||||||
{
|
{
|
||||||
void * B0, * V0, * XY0;
|
void * B0, * V0, * XY0;
|
||||||
uint8_t * B;
|
uint8_t * B;
|
||||||
@ -127,7 +129,7 @@ _crypto_scrypt(const uint8_t * passwd, size_t passwdlen,
|
|||||||
/* 2: for i = 0 to p - 1 do */
|
/* 2: for i = 0 to p - 1 do */
|
||||||
for (i = 0; i < p; i++) {
|
for (i = 0; i < p; i++) {
|
||||||
/* 3: B_i <-- MF(B_i, N) */
|
/* 3: B_i <-- MF(B_i, N) */
|
||||||
(smix)(&B[i * 128 * r], r, N, V, XY);
|
crypto_scrypt_smix(&B[i * 128 * r], r, N, V, XY);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 5: DK <-- PBKDF2(P, B, 1, dkLen) */
|
/* 5: DK <-- PBKDF2(P, B, 1, dkLen) */
|
||||||
@ -154,80 +156,3 @@ err0:
|
|||||||
/* Failure! */
|
/* Failure! */
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define TESTLEN 64
|
|
||||||
static struct scrypt_test {
|
|
||||||
const char * passwd;
|
|
||||||
const char * salt;
|
|
||||||
uint64_t N;
|
|
||||||
uint32_t r;
|
|
||||||
uint32_t p;
|
|
||||||
uint8_t result[TESTLEN];
|
|
||||||
} testcase = {
|
|
||||||
"pleaseletmein",
|
|
||||||
"SodiumChloride",
|
|
||||||
16,
|
|
||||||
8,
|
|
||||||
1,
|
|
||||||
{
|
|
||||||
0x25, 0xa9, 0xfa, 0x20, 0x7f, 0x87, 0xca, 0x09,
|
|
||||||
0xa4, 0xef, 0x8b, 0x9f, 0x77, 0x7a, 0xca, 0x16,
|
|
||||||
0xbe, 0xb7, 0x84, 0xae, 0x18, 0x30, 0xbf, 0xbf,
|
|
||||||
0xd3, 0x83, 0x25, 0xaa, 0xbb, 0x93, 0x77, 0xdf,
|
|
||||||
0x1b, 0xa7, 0x84, 0xd7, 0x46, 0xea, 0x27, 0x3b,
|
|
||||||
0xf5, 0x16, 0xa4, 0x6f, 0xbf, 0xac, 0xf5, 0x11,
|
|
||||||
0xc5, 0xbe, 0xba, 0x4c, 0x4a, 0xb3, 0xac, 0xc7,
|
|
||||||
0xfa, 0x6f, 0x46, 0x0b, 0x6c, 0x0f, 0x47, 0x7b,
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
static int
|
|
||||||
testsmix(void (*smix)(uint8_t *, size_t, uint64_t, void *, void *))
|
|
||||||
{
|
|
||||||
uint8_t hbuf[TESTLEN];
|
|
||||||
|
|
||||||
/* Perform the computation. */
|
|
||||||
if (_crypto_scrypt(
|
|
||||||
(const uint8_t *)testcase.passwd, strlen(testcase.passwd),
|
|
||||||
(const uint8_t *)testcase.salt, strlen(testcase.salt),
|
|
||||||
testcase.N, testcase.r, testcase.p, hbuf, TESTLEN, smix))
|
|
||||||
return (-1);
|
|
||||||
|
|
||||||
/* Does it match? */
|
|
||||||
return (memcmp(testcase.result, hbuf, TESTLEN));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
selectsmix(void)
|
|
||||||
{
|
|
||||||
/* If generic smix works, use it. */
|
|
||||||
if (!testsmix(crypto_scrypt_smix)) {
|
|
||||||
smix_func = crypto_scrypt_smix;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If we get here, something really bad happened. */
|
|
||||||
abort();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* crypto_scrypt(passwd, passwdlen, salt, saltlen, N, r, p, buf, buflen):
|
|
||||||
* Compute scrypt(passwd[0 .. passwdlen - 1], salt[0 .. saltlen - 1], N, r,
|
|
||||||
* p, buflen) and write the result into buf. The parameters r, p, and buflen
|
|
||||||
* must satisfy r * p < 2^30 and buflen <= (2^32 - 1) * 32. The parameter N
|
|
||||||
* must be a power of 2 greater than 1.
|
|
||||||
*
|
|
||||||
* Return 0 on success; or -1 on error.
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
crypto_scrypt(const uint8_t * passwd, size_t passwdlen,
|
|
||||||
const uint8_t * salt, size_t saltlen, uint64_t N, uint32_t _r, uint32_t _p,
|
|
||||||
uint8_t * buf, size_t buflen)
|
|
||||||
{
|
|
||||||
|
|
||||||
if (smix_func == NULL)
|
|
||||||
selectsmix();
|
|
||||||
|
|
||||||
return (_crypto_scrypt(passwd, passwdlen, salt, saltlen, N, _r, _p,
|
|
||||||
buf, buflen, smix_func));
|
|
||||||
}
|
|
||||||
|
Loading…
Reference in New Issue
Block a user