@@ -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+
16771695DataPointer 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
16961726DataPointer 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