Skip to content

Commit c2179d8

Browse files
committed
Add scryptInto and pbkdf2Into
1 parent a501567 commit c2179d8

File tree

2 files changed

+52
-19
lines changed

2 files changed

+52
-19
lines changed

include/ncrypto.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1392,10 +1392,19 @@ DataPointer hkdf(const EVP_MD* md, const Buffer<const unsigned char>& key,
13921392

13931393
bool checkScryptParams(uint64_t N, uint64_t r, uint64_t p, uint64_t maxmem);
13941394

1395+
bool scryptInto(const Buffer<const char>& pass,
1396+
const Buffer<const unsigned char>& salt, uint64_t N, uint64_t r,
1397+
uint64_t p, uint64_t maxmem, size_t length,
1398+
Buffer<unsigned char>* out);
1399+
13951400
DataPointer scrypt(const Buffer<const char>& pass,
13961401
const Buffer<const unsigned char>& salt, uint64_t N,
13971402
uint64_t r, uint64_t p, uint64_t maxmem, size_t length);
13981403

1404+
bool pbkdf2Into(const EVP_MD* md, const Buffer<const char>& pass,
1405+
const Buffer<const unsigned char>& salt, uint32_t iterations,
1406+
size_t length, Buffer<unsigned char>* out);
1407+
13991408
DataPointer pbkdf2(const EVP_MD* md, const Buffer<const char>& pass,
14001409
const Buffer<const unsigned char>& salt, uint32_t iterations,
14011410
size_t length);

src/ncrypto.cpp

Lines changed: 43 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1674,39 +1674,63 @@ bool checkScryptParams(uint64_t N, uint64_t r, uint64_t p, uint64_t maxmem) {
16741674
1;
16751675
}
16761676

1677+
bool scryptInto(const Buffer<const char>& pass,
1678+
const Buffer<const unsigned char>& salt, uint64_t N, uint64_t r,
1679+
uint64_t p, uint64_t maxmem, size_t length,
1680+
Buffer<unsigned char>* out) {
1681+
ClearErrorOnReturn clearErrorOnReturn;
1682+
1683+
if (pass.len > INT_MAX || salt.len > INT_MAX || out == nullptr) {
1684+
return false;
1685+
}
1686+
1687+
if (auto dp = DataPointer::Alloc(length)) {
1688+
return EVP_PBE_scrypt(pass.data, pass.len, salt.data, salt.len, N, r, p,
1689+
maxmem, out->data, length);
1690+
}
1691+
1692+
return false;
1693+
}
1694+
16771695
DataPointer scrypt(const Buffer<const char>& pass,
16781696
const Buffer<const unsigned char>& salt, uint64_t N,
16791697
uint64_t r, uint64_t p, uint64_t maxmem, size_t length) {
1698+
if (auto dp = DataPointer::Alloc(length)) {
1699+
Buffer<unsigned char> buf = dp;
1700+
if (scryptInto(pass, salt, N, r, p, maxmem, length, &buf)) {
1701+
return dp;
1702+
}
1703+
}
1704+
1705+
return {};
1706+
}
1707+
1708+
bool pbkdf2Into(const EVP_MD* md, const Buffer<const char>& pass,
1709+
const Buffer<const unsigned char>& salt, uint32_t iterations,
1710+
size_t length, Buffer<unsigned char>* out) {
16801711
ClearErrorOnReturn clearErrorOnReturn;
16811712

1682-
if (pass.len > INT_MAX || salt.len > INT_MAX) {
1683-
return {};
1713+
if (pass.len > INT_MAX || salt.len > INT_MAX || length > INT_MAX ||
1714+
out == nullptr) {
1715+
return false;
16841716
}
16851717

1686-
auto dp = DataPointer::Alloc(length);
1687-
if (dp &&
1688-
EVP_PBE_scrypt(pass.data, pass.len, salt.data, salt.len, N, r, p, maxmem,
1689-
reinterpret_cast<unsigned char*>(dp.get()), length)) {
1690-
return dp;
1718+
if (PKCS5_PBKDF2_HMAC(pass.data, pass.len, salt.data, salt.len, iterations,
1719+
md, length, out->data)) {
1720+
return true;
16911721
}
16921722

1693-
return {};
1723+
return false;
16941724
}
16951725

16961726
DataPointer pbkdf2(const EVP_MD* md, const Buffer<const char>& pass,
16971727
const Buffer<const unsigned char>& salt, uint32_t iterations,
16981728
size_t length) {
1699-
ClearErrorOnReturn clearErrorOnReturn;
1700-
1701-
if (pass.len > INT_MAX || salt.len > INT_MAX || length > INT_MAX) {
1702-
return {};
1703-
}
1704-
1705-
auto dp = DataPointer::Alloc(length);
1706-
if (dp && PKCS5_PBKDF2_HMAC(pass.data, pass.len, salt.data, salt.len,
1707-
iterations, md, length,
1708-
reinterpret_cast<unsigned char*>(dp.get()))) {
1709-
return dp;
1729+
if (auto dp = DataPointer::Alloc(length)) {
1730+
Buffer<unsigned char> buf = dp;
1731+
if (pbkdf2Into(md, pass, salt, iterations, length, &buf)) {
1732+
return dp;
1733+
}
17101734
}
17111735

17121736
return {};

0 commit comments

Comments
 (0)