react-native-quick-crypto 1.0.2 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/QuickCrypto.podspec +1 -0
- package/README.md +1 -1
- package/android/CMakeLists.txt +4 -0
- package/cpp/hkdf/HybridHkdf.cpp +96 -0
- package/cpp/hkdf/HybridHkdf.hpp +28 -0
- package/cpp/scrypt/HybridScrypt.cpp +62 -0
- package/cpp/scrypt/HybridScrypt.hpp +28 -0
- package/lib/commonjs/hkdf.js +81 -0
- package/lib/commonjs/hkdf.js.map +1 -0
- package/lib/commonjs/index.js +33 -1
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/scrypt.js +98 -0
- package/lib/commonjs/scrypt.js.map +1 -0
- package/lib/commonjs/specs/hkdf.nitro.js +6 -0
- package/lib/commonjs/specs/hkdf.nitro.js.map +1 -0
- package/lib/commonjs/specs/scrypt.nitro.js +6 -0
- package/lib/commonjs/specs/scrypt.nitro.js.map +1 -0
- package/lib/commonjs/subtle.js +28 -0
- package/lib/commonjs/subtle.js.map +1 -1
- package/lib/module/hkdf.js +75 -0
- package/lib/module/hkdf.js.map +1 -0
- package/lib/module/index.js +13 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/scrypt.js +93 -0
- package/lib/module/scrypt.js.map +1 -0
- package/lib/module/specs/hkdf.nitro.js +4 -0
- package/lib/module/specs/hkdf.nitro.js.map +1 -0
- package/lib/module/specs/scrypt.nitro.js +4 -0
- package/lib/module/specs/scrypt.nitro.js.map +1 -0
- package/lib/module/subtle.js +28 -0
- package/lib/module/subtle.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/lib/typescript/hkdf.d.ts +26 -0
- package/lib/typescript/hkdf.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +9 -0
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/scrypt.d.ts +18 -0
- package/lib/typescript/scrypt.d.ts.map +1 -0
- package/lib/typescript/specs/hkdf.nitro.d.ts +9 -0
- package/lib/typescript/specs/hkdf.nitro.d.ts.map +1 -0
- package/lib/typescript/specs/scrypt.nitro.d.ts +9 -0
- package/lib/typescript/specs/scrypt.nitro.d.ts.map +1 -0
- package/lib/typescript/subtle.d.ts.map +1 -1
- package/nitrogen/generated/android/QuickCrypto+autolinking.cmake +2 -0
- package/nitrogen/generated/android/QuickCryptoOnLoad.cpp +20 -0
- package/nitrogen/generated/ios/QuickCryptoAutolinking.mm +20 -0
- package/nitrogen/generated/shared/c++/HybridHkdfSpec.cpp +22 -0
- package/nitrogen/generated/shared/c++/HybridHkdfSpec.hpp +66 -0
- package/nitrogen/generated/shared/c++/HybridScryptSpec.cpp +22 -0
- package/nitrogen/generated/shared/c++/HybridScryptSpec.hpp +65 -0
- package/package.json +1 -1
- package/react-native.config.js +19 -0
- package/src/hkdf.ts +152 -0
- package/src/index.ts +13 -1
- package/src/scrypt.ts +134 -0
- package/src/specs/hkdf.nitro.ts +19 -0
- package/src/specs/scrypt.nitro.ts +23 -0
- package/src/subtle.ts +45 -0
package/QuickCrypto.podspec
CHANGED
|
@@ -108,6 +108,7 @@ Pod::Spec.new do |s|
|
|
|
108
108
|
# Add cpp subdirectories to header search paths
|
|
109
109
|
cpp_headers = [
|
|
110
110
|
"\"$(PODS_TARGET_SRCROOT)/cpp/utils\"",
|
|
111
|
+
"\"$(PODS_TARGET_SRCROOT)/cpp/hkdf\"",
|
|
111
112
|
"\"$(PODS_TARGET_SRCROOT)/deps/ncrypto/include\"",
|
|
112
113
|
"\"$(PODS_TARGET_SRCROOT)/deps/blake3/c\"",
|
|
113
114
|
"\"$(PODS_TARGET_SRCROOT)/deps/fastpbkdf2\""
|
package/README.md
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
|
|
11
11
|
A fast implementation of Node's `crypto` module.
|
|
12
12
|
|
|
13
|
-
> Note: This version `1.x` completed a major refactor, porting to OpenSSL 3.
|
|
13
|
+
> Note: This version `1.x` completed a major refactor, porting to OpenSSL 3.6+, New Architecture, Bridgeless, and [`Nitro Modules`](https://github.com/mrousavy/react-native-nitro). It should be at or above feature-parity compared to the `0.x` version. Status, as always, will be represented in [implementation-coverage.md](../main/docs/implementation-coverage.md).
|
|
14
14
|
|
|
15
15
|
> Note: Minimum supported version of React Native is `0.75`. If you need to use earlier versions, please use `0.x` versions of this library.
|
|
16
16
|
|
package/android/CMakeLists.txt
CHANGED
|
@@ -38,12 +38,14 @@ add_library(
|
|
|
38
38
|
../cpp/ed25519/HybridEdKeyPair.cpp
|
|
39
39
|
../cpp/hash/HybridHash.cpp
|
|
40
40
|
../cpp/hmac/HybridHmac.cpp
|
|
41
|
+
../cpp/hkdf/HybridHkdf.cpp
|
|
41
42
|
../cpp/keys/HybridKeyObjectHandle.cpp
|
|
42
43
|
../cpp/keys/KeyObjectData.cpp
|
|
43
44
|
../cpp/mldsa/HybridMlDsaKeyPair.cpp
|
|
44
45
|
../cpp/pbkdf2/HybridPbkdf2.cpp
|
|
45
46
|
../cpp/random/HybridRandom.cpp
|
|
46
47
|
../cpp/rsa/HybridRsaKeyPair.cpp
|
|
48
|
+
../cpp/scrypt/HybridScrypt.cpp
|
|
47
49
|
../cpp/sign/HybridSignHandle.cpp
|
|
48
50
|
../cpp/sign/HybridVerifyHandle.cpp
|
|
49
51
|
${BLAKE3_SOURCES}
|
|
@@ -62,6 +64,7 @@ include_directories(
|
|
|
62
64
|
"../cpp/ec"
|
|
63
65
|
"../cpp/ed25519"
|
|
64
66
|
"../cpp/hash"
|
|
67
|
+
"../cpp/hkdf"
|
|
65
68
|
"../cpp/hmac"
|
|
66
69
|
"../cpp/keys"
|
|
67
70
|
"../cpp/mldsa"
|
|
@@ -69,6 +72,7 @@ include_directories(
|
|
|
69
72
|
"../cpp/random"
|
|
70
73
|
"../cpp/rsa"
|
|
71
74
|
"../cpp/sign"
|
|
75
|
+
"../cpp/scrypt"
|
|
72
76
|
"../cpp/utils"
|
|
73
77
|
"../deps/blake3/c"
|
|
74
78
|
"../deps/fastpbkdf2"
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
#include <NitroModules/ArrayBuffer.hpp>
|
|
2
|
+
#include <memory>
|
|
3
|
+
#include <openssl/core_names.h>
|
|
4
|
+
#include <openssl/err.h>
|
|
5
|
+
#include <openssl/evp.h>
|
|
6
|
+
#include <openssl/kdf.h>
|
|
7
|
+
#include <string>
|
|
8
|
+
#include <vector>
|
|
9
|
+
|
|
10
|
+
#include "HybridHkdf.hpp"
|
|
11
|
+
#include "Utils.hpp"
|
|
12
|
+
|
|
13
|
+
namespace margelo::nitro::crypto {
|
|
14
|
+
|
|
15
|
+
std::shared_ptr<Promise<std::shared_ptr<ArrayBuffer>>> HybridHkdf::deriveKey(const std::string& algorithm,
|
|
16
|
+
const std::shared_ptr<ArrayBuffer>& key,
|
|
17
|
+
const std::shared_ptr<ArrayBuffer>& salt,
|
|
18
|
+
const std::shared_ptr<ArrayBuffer>& info, double length) {
|
|
19
|
+
// get owned NativeArrayBuffers before passing to sync function
|
|
20
|
+
auto nativeKey = ToNativeArrayBuffer(key);
|
|
21
|
+
auto nativeSalt = ToNativeArrayBuffer(salt);
|
|
22
|
+
auto nativeInfo = ToNativeArrayBuffer(info);
|
|
23
|
+
|
|
24
|
+
return Promise<std::shared_ptr<ArrayBuffer>>::async([this, algorithm, nativeKey, nativeSalt, nativeInfo, length]() {
|
|
25
|
+
return this->deriveKeySync(algorithm, nativeKey, nativeSalt, nativeInfo, length);
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
std::shared_ptr<ArrayBuffer> HybridHkdf::deriveKeySync(const std::string& algorithm, const std::shared_ptr<ArrayBuffer>& baseKey,
|
|
30
|
+
const std::shared_ptr<ArrayBuffer>& salt, const std::shared_ptr<ArrayBuffer>& info,
|
|
31
|
+
double length) {
|
|
32
|
+
EVP_KDF* kdf = EVP_KDF_fetch(nullptr, "HKDF", nullptr);
|
|
33
|
+
if (kdf == nullptr) {
|
|
34
|
+
throw std::runtime_error("Failed to fetch HKDF implementation: " + std::to_string(ERR_get_error()));
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
EVP_KDF_CTX* ctx = EVP_KDF_CTX_new(kdf);
|
|
38
|
+
EVP_KDF_free(kdf);
|
|
39
|
+
if (ctx == nullptr) {
|
|
40
|
+
throw std::runtime_error("Failed to create HKDF context: " + std::to_string(ERR_get_error()));
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Set up parameters
|
|
44
|
+
OSSL_PARAM params[5];
|
|
45
|
+
size_t paramIndex = 0;
|
|
46
|
+
|
|
47
|
+
params[paramIndex++] = OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_DIGEST, const_cast<char*>(algorithm.c_str()), 0);
|
|
48
|
+
|
|
49
|
+
// Key (Input Keying Material)
|
|
50
|
+
if (baseKey && baseKey->size() > 0) {
|
|
51
|
+
params[paramIndex++] = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_KEY, baseKey->data(), baseKey->size());
|
|
52
|
+
} else {
|
|
53
|
+
// Empty key is allowed in HKDF (defaults to zero string of hashLen) but explicit param usually expected if not null
|
|
54
|
+
// If we want empty, we can pass generic empty buffer or handle it.
|
|
55
|
+
// Node.js crypto allows buffer.
|
|
56
|
+
// Assuming key is effectively required or can be empty.
|
|
57
|
+
params[paramIndex++] = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_KEY, nullptr, 0);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Salt
|
|
61
|
+
if (salt && salt->size() > 0) {
|
|
62
|
+
params[paramIndex++] = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SALT, salt->data(), salt->size());
|
|
63
|
+
} else {
|
|
64
|
+
// If salt is not provided, it is set to a string of HashLen zeros.
|
|
65
|
+
// OpenSSL handles missing salt as default? Or do we need to pass empty?
|
|
66
|
+
// Usually standard optional.
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Info
|
|
70
|
+
if (info && info->size() > 0) {
|
|
71
|
+
params[paramIndex++] = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_INFO, info->data(), info->size());
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
params[paramIndex++] = OSSL_PARAM_construct_end();
|
|
75
|
+
|
|
76
|
+
// Output buffer
|
|
77
|
+
size_t outLen = static_cast<size_t>(length);
|
|
78
|
+
if (outLen == 0) {
|
|
79
|
+
EVP_KDF_CTX_free(ctx);
|
|
80
|
+
throw std::runtime_error("HKDF length cannot be zero");
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
uint8_t* outBuf = new uint8_t[outLen];
|
|
84
|
+
|
|
85
|
+
if (EVP_KDF_derive(ctx, outBuf, outLen, params) <= 0) {
|
|
86
|
+
EVP_KDF_CTX_free(ctx);
|
|
87
|
+
delete[] outBuf;
|
|
88
|
+
throw std::runtime_error("HKDF derivation failed: " + std::to_string(ERR_get_error()));
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
EVP_KDF_CTX_free(ctx);
|
|
92
|
+
|
|
93
|
+
return std::make_shared<NativeArrayBuffer>(outBuf, outLen, [=]() { delete[] outBuf; });
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
} // namespace margelo::nitro::crypto
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include <NitroModules/ArrayBuffer.hpp>
|
|
4
|
+
#include <memory>
|
|
5
|
+
#include <openssl/evp.h>
|
|
6
|
+
#include <string>
|
|
7
|
+
|
|
8
|
+
#include "HybridHkdfSpec.hpp"
|
|
9
|
+
|
|
10
|
+
namespace margelo::nitro::crypto {
|
|
11
|
+
|
|
12
|
+
using namespace facebook;
|
|
13
|
+
|
|
14
|
+
class HybridHkdf : public HybridHkdfSpec {
|
|
15
|
+
public:
|
|
16
|
+
HybridHkdf() : HybridObject(TAG) {}
|
|
17
|
+
|
|
18
|
+
public:
|
|
19
|
+
// Methods
|
|
20
|
+
std::shared_ptr<ArrayBuffer> deriveKeySync(const std::string& algorithm, const std::shared_ptr<ArrayBuffer>& key,
|
|
21
|
+
const std::shared_ptr<ArrayBuffer>& salt, const std::shared_ptr<ArrayBuffer>& info,
|
|
22
|
+
double length) override;
|
|
23
|
+
std::shared_ptr<Promise<std::shared_ptr<ArrayBuffer>>> deriveKey(const std::string& algorithm, const std::shared_ptr<ArrayBuffer>& key,
|
|
24
|
+
const std::shared_ptr<ArrayBuffer>& salt,
|
|
25
|
+
const std::shared_ptr<ArrayBuffer>& info, double length) override;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
} // namespace margelo::nitro::crypto
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
#include <NitroModules/ArrayBuffer.hpp>
|
|
2
|
+
#include <memory>
|
|
3
|
+
#include <openssl/err.h>
|
|
4
|
+
#include <openssl/evp.h>
|
|
5
|
+
#include <string>
|
|
6
|
+
#include <vector>
|
|
7
|
+
|
|
8
|
+
#include "HybridScrypt.hpp"
|
|
9
|
+
#include "Utils.hpp"
|
|
10
|
+
|
|
11
|
+
namespace margelo::nitro::crypto {
|
|
12
|
+
|
|
13
|
+
std::shared_ptr<Promise<std::shared_ptr<ArrayBuffer>>> HybridScrypt::deriveKey(const std::shared_ptr<ArrayBuffer>& password,
|
|
14
|
+
const std::shared_ptr<ArrayBuffer>& salt, double N, double r,
|
|
15
|
+
double p, double maxmem, double keylen) {
|
|
16
|
+
// get owned NativeArrayBuffers before passing to sync function
|
|
17
|
+
auto nativePassword = ToNativeArrayBuffer(password);
|
|
18
|
+
auto nativeSalt = ToNativeArrayBuffer(salt);
|
|
19
|
+
|
|
20
|
+
return Promise<std::shared_ptr<ArrayBuffer>>::async([this, nativePassword, nativeSalt, N, r, p, maxmem, keylen]() {
|
|
21
|
+
return this->deriveKeySync(nativePassword, nativeSalt, N, r, p, maxmem, keylen);
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
std::shared_ptr<ArrayBuffer> HybridScrypt::deriveKeySync(const std::shared_ptr<ArrayBuffer>& password,
|
|
26
|
+
const std::shared_ptr<ArrayBuffer>& salt, double N, double r, double p,
|
|
27
|
+
double maxmem, double keylen) {
|
|
28
|
+
// Use EVP_PBE_scrypt to match Node.js implementation exactly
|
|
29
|
+
// All parameters are uint64_t for this API (unlike EVP_KDF which uses uint32_t for r/p)
|
|
30
|
+
uint64_t n_val = static_cast<uint64_t>(N);
|
|
31
|
+
uint64_t r_val = static_cast<uint64_t>(r);
|
|
32
|
+
uint64_t p_val = static_cast<uint64_t>(p);
|
|
33
|
+
uint64_t maxmem_val = static_cast<uint64_t>(maxmem);
|
|
34
|
+
size_t outLen = static_cast<size_t>(keylen);
|
|
35
|
+
|
|
36
|
+
if (outLen == 0) {
|
|
37
|
+
throw std::runtime_error("SCRYPT length cannot be zero");
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Prepare password and salt pointers
|
|
41
|
+
const char* pass_data = password && password->size() > 0 ? reinterpret_cast<const char*>(password->data()) : "";
|
|
42
|
+
size_t pass_len = password ? password->size() : 0;
|
|
43
|
+
|
|
44
|
+
const unsigned char* salt_data =
|
|
45
|
+
salt && salt->size() > 0 ? reinterpret_cast<const unsigned char*>(salt->data()) : reinterpret_cast<const unsigned char*>("");
|
|
46
|
+
size_t salt_len = salt ? salt->size() : 0;
|
|
47
|
+
|
|
48
|
+
// Allocate output buffer
|
|
49
|
+
uint8_t* outBuf = new uint8_t[outLen];
|
|
50
|
+
|
|
51
|
+
// Use EVP_PBE_scrypt - the same API Node.js uses
|
|
52
|
+
int result = EVP_PBE_scrypt(pass_data, pass_len, salt_data, salt_len, n_val, r_val, p_val, maxmem_val, outBuf, outLen);
|
|
53
|
+
|
|
54
|
+
if (result != 1) {
|
|
55
|
+
delete[] outBuf;
|
|
56
|
+
throw std::runtime_error("SCRYPT derivation failed: " + getOpenSSLError());
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return std::make_shared<NativeArrayBuffer>(outBuf, outLen, [=]() { delete[] outBuf; });
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
} // namespace margelo::nitro::crypto
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include <NitroModules/ArrayBuffer.hpp>
|
|
4
|
+
#include <NitroModules/Promise.hpp>
|
|
5
|
+
#include <memory>
|
|
6
|
+
#include <openssl/evp.h>
|
|
7
|
+
#include <string>
|
|
8
|
+
|
|
9
|
+
#include "HybridScryptSpec.hpp"
|
|
10
|
+
|
|
11
|
+
namespace margelo::nitro::crypto {
|
|
12
|
+
|
|
13
|
+
using namespace facebook;
|
|
14
|
+
|
|
15
|
+
class HybridScrypt : public HybridScryptSpec {
|
|
16
|
+
public:
|
|
17
|
+
HybridScrypt() : HybridObject(TAG) {}
|
|
18
|
+
|
|
19
|
+
public:
|
|
20
|
+
// Methods
|
|
21
|
+
std::shared_ptr<ArrayBuffer> deriveKeySync(const std::shared_ptr<ArrayBuffer>& password, const std::shared_ptr<ArrayBuffer>& salt,
|
|
22
|
+
double N, double r, double p, double maxmem, double keylen) override;
|
|
23
|
+
std::shared_ptr<Promise<std::shared_ptr<ArrayBuffer>>> deriveKey(const std::shared_ptr<ArrayBuffer>& password,
|
|
24
|
+
const std::shared_ptr<ArrayBuffer>& salt, double N, double r, double p,
|
|
25
|
+
double maxmem, double keylen) override;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
} // namespace margelo::nitro::crypto
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.hkdf = hkdf;
|
|
7
|
+
exports.hkdfDeriveBits = hkdfDeriveBits;
|
|
8
|
+
exports.hkdfSync = hkdfSync;
|
|
9
|
+
var _reactNativeBuffer = require("@craftzdog/react-native-buffer");
|
|
10
|
+
var _reactNativeNitroModules = require("react-native-nitro-modules");
|
|
11
|
+
var _utils = require("./utils");
|
|
12
|
+
// Lazy load native module
|
|
13
|
+
let native;
|
|
14
|
+
function getNative() {
|
|
15
|
+
if (native == null) {
|
|
16
|
+
native = _reactNativeNitroModules.NitroModules.createHybridObject('Hkdf');
|
|
17
|
+
}
|
|
18
|
+
return native;
|
|
19
|
+
}
|
|
20
|
+
function validateCallback(callback) {
|
|
21
|
+
if (callback === undefined || typeof callback !== 'function') {
|
|
22
|
+
throw new Error('No callback provided to hkdf');
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function sanitizeInput(input, name) {
|
|
26
|
+
try {
|
|
27
|
+
return (0, _utils.binaryLikeToArrayBuffer)(input);
|
|
28
|
+
} catch {
|
|
29
|
+
throw new Error(`${name} must be a string, a Buffer, a typed array, or a DataView`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function hkdf(digest, key, salt, info, keylen, callback) {
|
|
33
|
+
validateCallback(callback);
|
|
34
|
+
try {
|
|
35
|
+
const normalizedDigest = (0, _utils.normalizeHashName)(digest);
|
|
36
|
+
const sanitizedKey = sanitizeInput(key, 'Key');
|
|
37
|
+
const sanitizedSalt = sanitizeInput(salt, 'Salt');
|
|
38
|
+
const sanitizedInfo = sanitizeInput(info, 'Info');
|
|
39
|
+
if (keylen < 0) {
|
|
40
|
+
throw new TypeError('Bad key length');
|
|
41
|
+
}
|
|
42
|
+
const nativeMod = getNative();
|
|
43
|
+
nativeMod.deriveKey(normalizedDigest, sanitizedKey, sanitizedSalt, sanitizedInfo, keylen).then(res => {
|
|
44
|
+
callback(null, _reactNativeBuffer.Buffer.from(res));
|
|
45
|
+
}, err => {
|
|
46
|
+
callback(err);
|
|
47
|
+
});
|
|
48
|
+
} catch (err) {
|
|
49
|
+
callback(err);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function hkdfSync(digest, key, salt, info, keylen) {
|
|
53
|
+
const normalizedDigest = (0, _utils.normalizeHashName)(digest);
|
|
54
|
+
const sanitizedKey = sanitizeInput(key, 'Key');
|
|
55
|
+
const sanitizedSalt = sanitizeInput(salt, 'Salt');
|
|
56
|
+
const sanitizedInfo = sanitizeInput(info, 'Info');
|
|
57
|
+
if (keylen < 0) {
|
|
58
|
+
throw new TypeError('Bad key length');
|
|
59
|
+
}
|
|
60
|
+
const nativeMod = getNative();
|
|
61
|
+
const result = nativeMod.deriveKeySync(normalizedDigest, sanitizedKey, sanitizedSalt, sanitizedInfo, keylen);
|
|
62
|
+
return _reactNativeBuffer.Buffer.from(result);
|
|
63
|
+
}
|
|
64
|
+
function hkdfDeriveBits(algorithm, baseKey, length) {
|
|
65
|
+
const hash = algorithm.hash;
|
|
66
|
+
const salt = algorithm.salt;
|
|
67
|
+
const info = algorithm.info;
|
|
68
|
+
|
|
69
|
+
// Check if key is extractable or we can access its handle/buffer
|
|
70
|
+
// For raw keys, we can export.
|
|
71
|
+
const keyBuffer = baseKey.keyObject.export();
|
|
72
|
+
|
|
73
|
+
// length is in bits, native expects bytes
|
|
74
|
+
const keylen = Math.ceil(length / 8);
|
|
75
|
+
const hashName = typeof hash === 'string' ? hash : hash.name;
|
|
76
|
+
const normalizedDigest = (0, _utils.normalizeHashName)(hashName);
|
|
77
|
+
const nativeMod = getNative();
|
|
78
|
+
const result = nativeMod.deriveKeySync(normalizedDigest, (0, _utils.binaryLikeToArrayBuffer)(keyBuffer), (0, _utils.binaryLikeToArrayBuffer)(salt), (0, _utils.binaryLikeToArrayBuffer)(info), keylen);
|
|
79
|
+
return result;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=hkdf.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_reactNativeBuffer","require","_reactNativeNitroModules","_utils","native","getNative","NitroModules","createHybridObject","validateCallback","callback","undefined","Error","sanitizeInput","input","name","binaryLikeToArrayBuffer","hkdf","digest","key","salt","info","keylen","normalizedDigest","normalizeHashName","sanitizedKey","sanitizedSalt","sanitizedInfo","TypeError","nativeMod","deriveKey","then","res","Buffer","from","err","hkdfSync","result","deriveKeySync","hkdfDeriveBits","algorithm","baseKey","length","hash","keyBuffer","keyObject","export","Math","ceil","hashName"],"sourceRoot":"../../src","sources":["hkdf.ts"],"mappings":"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","ignoreList":[]}
|
package/lib/commonjs/index.js
CHANGED
|
@@ -101,6 +101,18 @@ Object.keys(_hmac).forEach(function (key) {
|
|
|
101
101
|
}
|
|
102
102
|
});
|
|
103
103
|
});
|
|
104
|
+
var hkdf = _interopRequireWildcard(require("./hkdf"));
|
|
105
|
+
Object.keys(hkdf).forEach(function (key) {
|
|
106
|
+
if (key === "default" || key === "__esModule") return;
|
|
107
|
+
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
108
|
+
if (key in exports && exports[key] === hkdf[key]) return;
|
|
109
|
+
Object.defineProperty(exports, key, {
|
|
110
|
+
enumerable: true,
|
|
111
|
+
get: function () {
|
|
112
|
+
return hkdf[key];
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
});
|
|
104
116
|
var pbkdf2 = _interopRequireWildcard(require("./pbkdf2"));
|
|
105
117
|
Object.keys(pbkdf2).forEach(function (key) {
|
|
106
118
|
if (key === "default" || key === "__esModule") return;
|
|
@@ -113,6 +125,18 @@ Object.keys(pbkdf2).forEach(function (key) {
|
|
|
113
125
|
}
|
|
114
126
|
});
|
|
115
127
|
});
|
|
128
|
+
var scrypt = _interopRequireWildcard(require("./scrypt"));
|
|
129
|
+
Object.keys(scrypt).forEach(function (key) {
|
|
130
|
+
if (key === "default" || key === "__esModule") return;
|
|
131
|
+
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
132
|
+
if (key in exports && exports[key] === scrypt[key]) return;
|
|
133
|
+
Object.defineProperty(exports, key, {
|
|
134
|
+
enumerable: true,
|
|
135
|
+
get: function () {
|
|
136
|
+
return scrypt[key];
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
});
|
|
116
140
|
var random = _interopRequireWildcard(require("./random"));
|
|
117
141
|
Object.keys(random).forEach(function (key) {
|
|
118
142
|
if (key === "default" || key === "__esModule") return;
|
|
@@ -168,7 +192,9 @@ const QuickCrypto = {
|
|
|
168
192
|
...ed,
|
|
169
193
|
..._hash.hashExports,
|
|
170
194
|
..._hmac.hmacExports,
|
|
195
|
+
...hkdf,
|
|
171
196
|
...pbkdf2,
|
|
197
|
+
...scrypt,
|
|
172
198
|
...random,
|
|
173
199
|
...utils,
|
|
174
200
|
...subtle,
|
|
@@ -189,7 +215,13 @@ const install = () => {
|
|
|
189
215
|
|
|
190
216
|
// random, cipher, hash use nextTick
|
|
191
217
|
exports.install = install;
|
|
192
|
-
global.process
|
|
218
|
+
if (global.process == null) {
|
|
219
|
+
// @ts-expect-error - process is not defined
|
|
220
|
+
global.process = {};
|
|
221
|
+
}
|
|
222
|
+
if (global.process.nextTick == null) {
|
|
223
|
+
global.process.nextTick = setImmediate;
|
|
224
|
+
}
|
|
193
225
|
|
|
194
226
|
// exports
|
|
195
227
|
var _default = exports.default = QuickCrypto;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNativeBuffer","require","keys","_interopRequireWildcard","Object","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","blake3","cipher","ed","_hash","_hmac","pbkdf2","random","_constants","utils","subtle","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","set","getOwnPropertyDescriptor","QuickCrypto","hash","hmac","constants","install","global","Buffer","crypto","process","nextTick","setImmediate","_default","module"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,IAAAA,kBAAA,GAAAC,OAAA;AAGA,IAAAC,IAAA,GAAAC,uBAAA,CAAAF,OAAA;
|
|
1
|
+
{"version":3,"names":["_reactNativeBuffer","require","keys","_interopRequireWildcard","Object","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","blake3","cipher","ed","_hash","_hmac","hkdf","pbkdf2","scrypt","random","_constants","utils","subtle","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","set","getOwnPropertyDescriptor","QuickCrypto","hash","hmac","constants","install","global","Buffer","crypto","process","nextTick","setImmediate","_default","module"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.scrypt = scrypt;
|
|
7
|
+
exports.scryptSync = scryptSync;
|
|
8
|
+
var _reactNativeBuffer = require("@craftzdog/react-native-buffer");
|
|
9
|
+
var _reactNativeNitroModules = require("react-native-nitro-modules");
|
|
10
|
+
var _utils = require("./utils");
|
|
11
|
+
// Lazy load native module
|
|
12
|
+
let native;
|
|
13
|
+
function getNative() {
|
|
14
|
+
if (native == null) {
|
|
15
|
+
native = _reactNativeNitroModules.NitroModules.createHybridObject('Scrypt');
|
|
16
|
+
}
|
|
17
|
+
return native;
|
|
18
|
+
}
|
|
19
|
+
const defaults = {
|
|
20
|
+
N: 16384,
|
|
21
|
+
r: 8,
|
|
22
|
+
p: 1,
|
|
23
|
+
maxmem: 32 * 1024 * 1024
|
|
24
|
+
};
|
|
25
|
+
function getScryptParams(options) {
|
|
26
|
+
const N = options?.N ?? options?.cost ?? defaults.N;
|
|
27
|
+
const r = options?.r ?? options?.blockSize ?? defaults.r;
|
|
28
|
+
const p = options?.p ?? options?.parallelization ?? defaults.p;
|
|
29
|
+
const maxmem = options?.maxmem ?? defaults.maxmem;
|
|
30
|
+
return {
|
|
31
|
+
N,
|
|
32
|
+
r,
|
|
33
|
+
p,
|
|
34
|
+
maxmem
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function validateCallback(callback) {
|
|
38
|
+
if (callback === undefined || typeof callback !== 'function') {
|
|
39
|
+
throw new Error('No callback provided to scrypt');
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function sanitizeInput(input, name) {
|
|
43
|
+
try {
|
|
44
|
+
return (0, _utils.binaryLikeToArrayBuffer)(input);
|
|
45
|
+
} catch {
|
|
46
|
+
throw new Error(`${name} must be a string, a Buffer, a typed array, or a DataView`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function scrypt(password, salt, keylen, options, callback) {
|
|
50
|
+
let cb;
|
|
51
|
+
let opts;
|
|
52
|
+
if (typeof options === 'function') {
|
|
53
|
+
cb = options;
|
|
54
|
+
opts = undefined;
|
|
55
|
+
} else {
|
|
56
|
+
cb = callback;
|
|
57
|
+
opts = options;
|
|
58
|
+
}
|
|
59
|
+
validateCallback(cb);
|
|
60
|
+
try {
|
|
61
|
+
const {
|
|
62
|
+
N,
|
|
63
|
+
r,
|
|
64
|
+
p,
|
|
65
|
+
maxmem
|
|
66
|
+
} = getScryptParams(opts);
|
|
67
|
+
const sanitizedPassword = sanitizeInput(password, 'Password');
|
|
68
|
+
const sanitizedSalt = sanitizeInput(salt, 'Salt');
|
|
69
|
+
if (keylen < 0) {
|
|
70
|
+
throw new TypeError('Bad key length');
|
|
71
|
+
}
|
|
72
|
+
const nativeMod = getNative();
|
|
73
|
+
nativeMod.deriveKey(sanitizedPassword, sanitizedSalt, N, r, p, maxmem, keylen).then(res => {
|
|
74
|
+
cb(null, _reactNativeBuffer.Buffer.from(res));
|
|
75
|
+
}, err => {
|
|
76
|
+
cb(err);
|
|
77
|
+
});
|
|
78
|
+
} catch (err) {
|
|
79
|
+
cb(err);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function scryptSync(password, salt, keylen, options) {
|
|
83
|
+
const {
|
|
84
|
+
N,
|
|
85
|
+
r,
|
|
86
|
+
p,
|
|
87
|
+
maxmem
|
|
88
|
+
} = getScryptParams(options);
|
|
89
|
+
const sanitizedPassword = sanitizeInput(password, 'Password');
|
|
90
|
+
const sanitizedSalt = sanitizeInput(salt, 'Salt');
|
|
91
|
+
if (keylen < 0) {
|
|
92
|
+
throw new TypeError('Bad key length');
|
|
93
|
+
}
|
|
94
|
+
const nativeMod = getNative();
|
|
95
|
+
const result = nativeMod.deriveKeySync(sanitizedPassword, sanitizedSalt, N, r, p, maxmem, keylen);
|
|
96
|
+
return _reactNativeBuffer.Buffer.from(result);
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=scrypt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_reactNativeBuffer","require","_reactNativeNitroModules","_utils","native","getNative","NitroModules","createHybridObject","defaults","N","r","p","maxmem","getScryptParams","options","cost","blockSize","parallelization","validateCallback","callback","undefined","Error","sanitizeInput","input","name","binaryLikeToArrayBuffer","scrypt","password","salt","keylen","cb","opts","sanitizedPassword","sanitizedSalt","TypeError","nativeMod","deriveKey","then","res","Buffer","from","err","scryptSync","result","deriveKeySync"],"sourceRoot":"../../src","sources":["scrypt.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"../../../src","sources":["specs/hkdf.nitro.ts"],"mappings":"","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"../../../src","sources":["specs/scrypt.nitro.ts"],"mappings":"","ignoreList":[]}
|
package/lib/commonjs/subtle.js
CHANGED
|
@@ -23,6 +23,7 @@ var _hmac = require("./hmac");
|
|
|
23
23
|
var _signVerify = require("./keys/signVerify");
|
|
24
24
|
var _ed = require("./ed");
|
|
25
25
|
var _mldsa = require("./mldsa");
|
|
26
|
+
var _hkdf = require("./hkdf");
|
|
26
27
|
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
27
28
|
// import { pbkdf2DeriveBits } from './pbkdf2';
|
|
28
29
|
// import { aesCipher, aesGenerateKey, aesImportKey, getAlgorithmName } from './aes';
|
|
@@ -923,6 +924,25 @@ const importGenericSecretKey = async ({
|
|
|
923
924
|
}
|
|
924
925
|
throw new Error(`Unable to import ${name} key with format ${format}`);
|
|
925
926
|
};
|
|
927
|
+
const hkdfImportKey = async (format, keyData, algorithm, extractable, keyUsages) => {
|
|
928
|
+
const {
|
|
929
|
+
name
|
|
930
|
+
} = algorithm;
|
|
931
|
+
if (hasAnyNotIn(keyUsages, ['deriveKey', 'deriveBits'])) {
|
|
932
|
+
throw new Error(`Unsupported key usage for a ${name} key`);
|
|
933
|
+
}
|
|
934
|
+
switch (format) {
|
|
935
|
+
case 'raw':
|
|
936
|
+
{
|
|
937
|
+
const keyObject = (0, _keys.createSecretKey)(keyData);
|
|
938
|
+
return new _keys.CryptoKey(keyObject, {
|
|
939
|
+
name
|
|
940
|
+
}, keyUsages, extractable);
|
|
941
|
+
}
|
|
942
|
+
default:
|
|
943
|
+
throw new Error(`Unable to import ${name} key with format ${format}`);
|
|
944
|
+
}
|
|
945
|
+
};
|
|
926
946
|
const checkCryptoKeyPairUsages = pair => {
|
|
927
947
|
if (pair.privateKey && pair.privateKey instanceof _keys.CryptoKey && pair.privateKey.keyUsages && pair.privateKey.keyUsages.length > 0) {
|
|
928
948
|
return;
|
|
@@ -1110,6 +1130,8 @@ class Subtle {
|
|
|
1110
1130
|
// Fall through
|
|
1111
1131
|
case 'X448':
|
|
1112
1132
|
return (0, _ed.xDeriveBits)(algorithm, baseKey, length);
|
|
1133
|
+
case 'HKDF':
|
|
1134
|
+
return (0, _hkdf.hkdfDeriveBits)(algorithm, baseKey, length);
|
|
1113
1135
|
}
|
|
1114
1136
|
throw new Error(`'subtle.deriveBits()' for ${algorithm.name} is not implemented.`);
|
|
1115
1137
|
}
|
|
@@ -1134,6 +1156,9 @@ class Subtle {
|
|
|
1134
1156
|
case 'X448':
|
|
1135
1157
|
derivedBits = await (0, _ed.xDeriveBits)(algorithm, baseKey, length);
|
|
1136
1158
|
break;
|
|
1159
|
+
case 'HKDF':
|
|
1160
|
+
derivedBits = (0, _hkdf.hkdfDeriveBits)(algorithm, baseKey, length);
|
|
1161
|
+
break;
|
|
1137
1162
|
default:
|
|
1138
1163
|
throw new Error(`'subtle.deriveKey()' for ${algorithm.name} is not implemented.`);
|
|
1139
1164
|
}
|
|
@@ -1328,6 +1353,9 @@ class Subtle {
|
|
|
1328
1353
|
case 'PBKDF2':
|
|
1329
1354
|
result = await importGenericSecretKey(normalizedAlgorithm, format, data, extractable, keyUsages);
|
|
1330
1355
|
break;
|
|
1356
|
+
case 'HKDF':
|
|
1357
|
+
result = await hkdfImportKey(format, data, normalizedAlgorithm, extractable, keyUsages);
|
|
1358
|
+
break;
|
|
1331
1359
|
case 'X25519':
|
|
1332
1360
|
// Fall through
|
|
1333
1361
|
case 'X448':
|