You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
76 lines
2.4 KiB
76 lines
2.4 KiB
#include "internal.h"
|
|
#include <include/wally_bip38.h>
|
|
#include <include/wally_crypto.h>
|
|
#include "hmac.h"
|
|
#include "ccan/ccan/endian/endian.h"
|
|
|
|
/* Use scrypts internal malloc/free */
|
|
#undef malloc
|
|
#undef free
|
|
|
|
/* Implement functions required by the scrypt core */
|
|
static uint32_t le32dec(const void *p)
|
|
{
|
|
leint32_t tmp;
|
|
memcpy(&tmp, p, sizeof(tmp));
|
|
return le32_to_cpu(tmp);
|
|
}
|
|
|
|
static void le32enc(void *p, uint32_t value)
|
|
{
|
|
leint32_t tmp = cpu_to_le32(value);
|
|
memcpy(p, &tmp, sizeof(tmp));
|
|
}
|
|
|
|
static void PBKDF2_SHA256(const unsigned char *pass, size_t pass_len,
|
|
const unsigned char *salt, size_t salt_len,
|
|
uint64_t cost,
|
|
unsigned char *bytes_out, size_t len)
|
|
{
|
|
const uint32_t flags = 0;
|
|
wally_pbkdf2_hmac_sha256(pass, pass_len, (unsigned char *)salt, salt_len,
|
|
flags, (uint32_t)cost, bytes_out, len);
|
|
}
|
|
|
|
/* Include a suitable smix function/functions */
|
|
#if defined(__ARM_NEON__) || defined(__ARM_NEON)
|
|
# include <arm_neon.h>
|
|
# include "scrypt/crypto_scrypt_smix_neon.c"
|
|
# if !defined(__ANDROID__)
|
|
/* No way to check for support, assume Neon present */
|
|
# define crypto_scrypt_smix_fn crypto_scrypt_smix_neon
|
|
# else
|
|
/* On Android, detect Neon support at runtime */
|
|
# include "cpufeatures/cpu-features.h"
|
|
# include "scrypt/crypto_scrypt_smix.c"
|
|
static void
|
|
crypto_scrypt_smix_fn(uint8_t *B, size_t r, uint64_t N, void *_V, void *XY)
|
|
{
|
|
if (android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON)
|
|
crypto_scrypt_smix_neon(B, r, N, _V, XY);
|
|
else
|
|
crypto_scrypt_smix_c(B, r, N, _V, XY);
|
|
}
|
|
# endif
|
|
#elif defined(__SSE2__)
|
|
/* Use the SSE2 version */
|
|
# include "scrypt/crypto_scrypt_smix_sse2.c"
|
|
# define crypto_scrypt_smix_fn crypto_scrypt_smix_sse2
|
|
#else
|
|
/* Use the C version */
|
|
# include "scrypt/crypto_scrypt_smix.c"
|
|
# define crypto_scrypt_smix_fn crypto_scrypt_smix_c
|
|
#endif
|
|
|
|
#include "scrypt/crypto_scrypt.c"
|
|
|
|
/* Our scrypt wrapper. */
|
|
int wally_scrypt(const unsigned char *pass, size_t pass_len,
|
|
const unsigned char *salt, size_t salt_len,
|
|
uint32_t cost, uint32_t block_size, uint32_t parallelism,
|
|
unsigned char *bytes_out, size_t len)
|
|
{
|
|
return _crypto_scrypt(pass, pass_len, salt, salt_len,
|
|
cost, block_size, parallelism,
|
|
bytes_out, len, crypto_scrypt_smix_fn);
|
|
}
|
|
|