react-native-quick-crypto 1.0.0-beta.5 → 1.0.0-beta.7
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/README.md +1 -1
- package/android/CMakeLists.txt +2 -4
- package/android/build.gradle +33 -4
- package/cpp/ed25519/HybridEdKeyPair.cpp +268 -0
- package/cpp/ed25519/HybridEdKeyPair.hpp +85 -0
- package/cpp/pbkdf2/HybridPbkdf2.cpp +6 -5
- package/cpp/pbkdf2/HybridPbkdf2.hpp +4 -4
- package/cpp/random/HybridRandom.cpp +6 -5
- package/cpp/random/HybridRandom.hpp +8 -4
- package/lib/commonjs/ed.js +41 -0
- package/lib/commonjs/ed.js.map +1 -0
- package/lib/commonjs/index.js +37 -5
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/keys/classes.js +191 -0
- package/lib/commonjs/keys/classes.js.map +1 -0
- package/lib/commonjs/keys/generateKeyPair.js +148 -0
- package/lib/commonjs/keys/generateKeyPair.js.map +1 -0
- package/lib/commonjs/keys/index.js +48 -72
- package/lib/commonjs/keys/index.js.map +1 -1
- package/lib/commonjs/keys/signVerify.js +41 -0
- package/lib/commonjs/keys/signVerify.js.map +1 -0
- package/lib/commonjs/keys/utils.js +118 -0
- package/lib/commonjs/keys/utils.js.map +1 -0
- package/lib/commonjs/specs/edKeyPair.nitro.js +6 -0
- package/lib/commonjs/specs/edKeyPair.nitro.js.map +1 -0
- package/lib/commonjs/utils/conversion.js +2 -0
- package/lib/commonjs/utils/conversion.js.map +1 -1
- package/lib/commonjs/utils/index.js +11 -0
- package/lib/commonjs/utils/index.js.map +1 -1
- package/lib/commonjs/utils/types.js +12 -1
- package/lib/commonjs/utils/types.js.map +1 -1
- package/lib/commonjs/utils/validation.js +25 -0
- package/lib/commonjs/utils/validation.js.map +1 -0
- package/lib/module/ed.js +36 -0
- package/lib/module/ed.js.map +1 -0
- package/lib/module/index.js +7 -5
- package/lib/module/index.js.map +1 -1
- package/lib/module/keys/classes.js +182 -0
- package/lib/module/keys/classes.js.map +1 -0
- package/lib/module/keys/generateKeyPair.js +148 -0
- package/lib/module/keys/generateKeyPair.js.map +1 -0
- package/lib/module/keys/index.js +25 -77
- package/lib/module/keys/index.js.map +1 -1
- package/lib/module/keys/signVerify.js +41 -0
- package/lib/module/keys/signVerify.js.map +1 -0
- package/lib/module/keys/utils.js +110 -0
- package/lib/module/keys/utils.js.map +1 -0
- package/lib/module/specs/edKeyPair.nitro.js +4 -0
- package/lib/module/specs/edKeyPair.nitro.js.map +1 -0
- package/lib/module/utils/conversion.js +1 -0
- package/lib/module/utils/conversion.js.map +1 -1
- package/lib/module/utils/index.js +1 -0
- package/lib/module/utils/index.js.map +1 -1
- package/lib/module/utils/types.js +14 -0
- package/lib/module/utils/types.js.map +1 -1
- package/lib/module/utils/validation.js +19 -0
- package/lib/module/utils/validation.js.map +1 -0
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/lib/typescript/ed.d.ts +17 -0
- package/lib/typescript/ed.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +29 -5
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/keys/classes.d.ts +38 -0
- package/lib/typescript/keys/classes.d.ts.map +1 -0
- package/lib/typescript/keys/generateKeyPair.d.ts +1 -0
- package/lib/typescript/keys/generateKeyPair.d.ts.map +1 -0
- package/lib/typescript/keys/index.d.ts +3 -21
- package/lib/typescript/keys/index.d.ts.map +1 -1
- package/lib/typescript/keys/signVerify.d.ts +1 -0
- package/lib/typescript/keys/signVerify.d.ts.map +1 -0
- package/lib/typescript/keys/utils.d.ts +32 -0
- package/lib/typescript/keys/utils.d.ts.map +1 -0
- package/lib/typescript/specs/edKeyPair.nitro.d.ts +16 -0
- package/lib/typescript/specs/edKeyPair.nitro.d.ts.map +1 -0
- package/lib/typescript/utils/conversion.d.ts +1 -0
- package/lib/typescript/utils/conversion.d.ts.map +1 -1
- package/lib/typescript/utils/index.d.ts +1 -0
- package/lib/typescript/utils/index.d.ts.map +1 -1
- package/lib/typescript/utils/types.d.ts +60 -4
- package/lib/typescript/utils/types.d.ts.map +1 -1
- package/lib/typescript/utils/validation.d.ts +8 -0
- package/lib/typescript/utils/validation.d.ts.map +1 -0
- package/nitrogen/generated/android/QuickCrypto+autolinking.cmake +1 -0
- package/nitrogen/generated/android/QuickCrypto+autolinking.gradle +2 -0
- package/nitrogen/generated/android/QuickCryptoOnLoad.cpp +10 -0
- package/nitrogen/generated/ios/QuickCrypto+autolinking.rb +1 -1
- package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Umbrella.hpp +4 -1
- package/nitrogen/generated/ios/QuickCryptoAutolinking.mm +10 -0
- package/nitrogen/generated/shared/c++/{AsymmetricKeyType.hpp → CFRGKeyPairType.hpp} +25 -25
- package/nitrogen/generated/shared/c++/HybridEdKeyPairSpec.cpp +29 -0
- package/nitrogen/generated/shared/c++/HybridEdKeyPairSpec.hpp +74 -0
- package/nitrogen/generated/shared/c++/HybridKeyObjectHandleSpec.hpp +4 -4
- package/nitrogen/generated/shared/c++/HybridPbkdf2Spec.hpp +2 -2
- package/nitrogen/generated/shared/c++/HybridRandomSpec.hpp +2 -2
- package/package.json +37 -21
- package/src/ed.ts +76 -0
- package/src/index.ts +7 -5
- package/src/keys/classes.ts +211 -0
- package/src/keys/generateKeyPair.ts +146 -0
- package/src/keys/index.ts +42 -99
- package/src/keys/signVerify.ts +39 -0
- package/src/keys/utils.ts +184 -0
- package/src/specs/edKeyPair.nitro.ts +41 -0
- package/src/utils/conversion.ts +2 -0
- package/src/utils/index.ts +1 -0
- package/src/utils/types.ts +84 -4
- package/src/utils/validation.ts +35 -0
package/README.md
CHANGED
package/android/CMakeLists.txt
CHANGED
|
@@ -9,6 +9,7 @@ set(CMAKE_CXX_STANDARD 20)
|
|
|
9
9
|
add_library(
|
|
10
10
|
${PACKAGE_NAME} SHARED
|
|
11
11
|
src/main/cpp/cpp-adapter.cpp
|
|
12
|
+
../cpp/ed25519/HybridEdKeyPair.cpp
|
|
12
13
|
../cpp/pbkdf2/HybridPbkdf2.cpp
|
|
13
14
|
../cpp/random/HybridRandom.cpp
|
|
14
15
|
../deps/fastpbkdf2/fastpbkdf2.c
|
|
@@ -20,6 +21,7 @@ include(${CMAKE_SOURCE_DIR}/../nitrogen/generated/android/QuickCrypto+autolinkin
|
|
|
20
21
|
# local includes
|
|
21
22
|
include_directories(
|
|
22
23
|
"src/main/cpp"
|
|
24
|
+
"../cpp/ed25519"
|
|
23
25
|
"../cpp/pbkdf2"
|
|
24
26
|
"../cpp/random"
|
|
25
27
|
"../cpp/utils"
|
|
@@ -29,8 +31,6 @@ include_directories(
|
|
|
29
31
|
# Third party libraries (Prefabs)
|
|
30
32
|
find_library(LOG_LIB log)
|
|
31
33
|
|
|
32
|
-
find_package(ReactAndroid REQUIRED CONFIG)
|
|
33
|
-
find_package(fbjni REQUIRED CONFIG)
|
|
34
34
|
find_package(openssl REQUIRED CONFIG)
|
|
35
35
|
|
|
36
36
|
# Link all libraries together
|
|
@@ -38,9 +38,7 @@ target_link_libraries(
|
|
|
38
38
|
${PACKAGE_NAME}
|
|
39
39
|
${LOG_LIB} # <-- Logcat logger
|
|
40
40
|
android # <-- Android core
|
|
41
|
-
fbjni::fbjni # <-- Facebook C++ JNI helpers
|
|
42
41
|
openssl::crypto # <-- OpenSSL (Crypto)
|
|
43
|
-
ReactAndroid::jsi
|
|
44
42
|
)
|
|
45
43
|
|
|
46
44
|
if(ReactAndroid_VERSION_MINOR GREATER_EQUAL 76)
|
package/android/build.gradle
CHANGED
|
@@ -7,7 +7,7 @@ buildscript {
|
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
dependencies {
|
|
10
|
-
classpath "com.android.tools.build:gradle:8.
|
|
10
|
+
classpath "com.android.tools.build:gradle:8.7.3"
|
|
11
11
|
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}"
|
|
12
12
|
}
|
|
13
13
|
}
|
|
@@ -49,9 +49,18 @@ android {
|
|
|
49
49
|
|
|
50
50
|
externalNativeBuild {
|
|
51
51
|
cmake {
|
|
52
|
-
cppFlags "-
|
|
52
|
+
cppFlags "-frtti -fexceptions -Wall -fstack-protector-all"
|
|
53
53
|
arguments "-DANDROID_STL=c++_shared"
|
|
54
54
|
abiFilters (*reactNativeArchitectures())
|
|
55
|
+
|
|
56
|
+
buildTypes {
|
|
57
|
+
debug {
|
|
58
|
+
cppFlags "-O1 -g"
|
|
59
|
+
}
|
|
60
|
+
release {
|
|
61
|
+
cppFlags "-O2"
|
|
62
|
+
}
|
|
63
|
+
}
|
|
55
64
|
}
|
|
56
65
|
}
|
|
57
66
|
}
|
|
@@ -67,6 +76,27 @@ android {
|
|
|
67
76
|
prefab true
|
|
68
77
|
}
|
|
69
78
|
|
|
79
|
+
packagingOptions {
|
|
80
|
+
excludes = [
|
|
81
|
+
"META-INF",
|
|
82
|
+
"META-INF/**",
|
|
83
|
+
"**/libc++_shared.so",
|
|
84
|
+
"**/libfbjni.so",
|
|
85
|
+
"**/libjsi.so",
|
|
86
|
+
"**/libfolly_json.so",
|
|
87
|
+
"**/libfolly_runtime.so",
|
|
88
|
+
"**/libglog.so",
|
|
89
|
+
"**/libhermes.so",
|
|
90
|
+
"**/libhermes-executor-debug.so",
|
|
91
|
+
"**/libhermes_executor.so",
|
|
92
|
+
"**/libreactnative.so",
|
|
93
|
+
"**/libreactnativejni.so",
|
|
94
|
+
"**/libturbomodulejsijni.so",
|
|
95
|
+
"**/libreact_nativemodule_core.so",
|
|
96
|
+
"**/libjscexecutor.so"
|
|
97
|
+
]
|
|
98
|
+
}
|
|
99
|
+
|
|
70
100
|
buildTypes {
|
|
71
101
|
release {
|
|
72
102
|
minifyEnabled false
|
|
@@ -108,8 +138,7 @@ dependencies {
|
|
|
108
138
|
implementation project(":react-native-nitro-modules")
|
|
109
139
|
|
|
110
140
|
// Add a dependency on OpenSSL
|
|
111
|
-
|
|
112
|
-
implementation "com.android.ndk.thirdparty:openssl:1.1.1q-beta-1"
|
|
141
|
+
implementation 'io.github.ronickg:openssl:3.3.2'
|
|
113
142
|
}
|
|
114
143
|
|
|
115
144
|
if (isNewArchitectureEnabled()) {
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
#include "HybridEdKeyPair.hpp"
|
|
2
|
+
|
|
3
|
+
#include <memory>
|
|
4
|
+
#include <string>
|
|
5
|
+
|
|
6
|
+
namespace margelo::nitro::crypto {
|
|
7
|
+
|
|
8
|
+
std::shared_ptr<Promise<void>>
|
|
9
|
+
HybridEdKeyPair::generateKeyPair(
|
|
10
|
+
double publicFormat,
|
|
11
|
+
double publicType,
|
|
12
|
+
double privateFormat,
|
|
13
|
+
double privateType,
|
|
14
|
+
const std::optional<std::string>& cipher,
|
|
15
|
+
const std::optional<std::shared_ptr<ArrayBuffer>>& passphrase
|
|
16
|
+
) {
|
|
17
|
+
// get owned NativeArrayBuffers before passing to sync function
|
|
18
|
+
std::optional<std::shared_ptr<ArrayBuffer>> nativePassphrase = std::nullopt;
|
|
19
|
+
if (passphrase.has_value()) {
|
|
20
|
+
nativePassphrase = ToNativeArrayBuffer(passphrase.value());
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
return Promise<void>::async(
|
|
24
|
+
[this, publicFormat, publicType, privateFormat, privateType, cipher,
|
|
25
|
+
nativePassphrase]() {
|
|
26
|
+
this->generateKeyPairSync(
|
|
27
|
+
publicFormat,
|
|
28
|
+
publicType,
|
|
29
|
+
privateFormat,
|
|
30
|
+
privateType,
|
|
31
|
+
cipher,
|
|
32
|
+
nativePassphrase
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
void
|
|
39
|
+
HybridEdKeyPair::generateKeyPairSync(
|
|
40
|
+
double publicFormat,
|
|
41
|
+
double publicType,
|
|
42
|
+
double privateFormat,
|
|
43
|
+
double privateType,
|
|
44
|
+
const std::optional<std::string>& cipher,
|
|
45
|
+
const std::optional<std::shared_ptr<ArrayBuffer>>& passphrase
|
|
46
|
+
) {
|
|
47
|
+
EVP_PKEY_CTX* pctx;
|
|
48
|
+
|
|
49
|
+
// key context
|
|
50
|
+
pctx = EVP_PKEY_CTX_new_from_name(nullptr, this->curve.c_str(), nullptr);
|
|
51
|
+
if (pctx == nullptr) {
|
|
52
|
+
throw std::runtime_error("Invalid curve name: " + this->curve);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// keygen init
|
|
56
|
+
if (EVP_PKEY_keygen_init(pctx) <= 0) {
|
|
57
|
+
EVP_PKEY_CTX_free(pctx);
|
|
58
|
+
throw std::runtime_error("Failed to initialize keygen");
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// generate key
|
|
62
|
+
EVP_PKEY_keygen(pctx, &this->pkey);
|
|
63
|
+
if (this->pkey == nullptr) {
|
|
64
|
+
EVP_PKEY_CTX_free(pctx);
|
|
65
|
+
throw std::runtime_error("Failed to generate key");
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// cleanup
|
|
69
|
+
EVP_PKEY_CTX_free(pctx);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
std::shared_ptr<Promise<std::shared_ptr<ArrayBuffer>>>
|
|
74
|
+
HybridEdKeyPair::sign(
|
|
75
|
+
const std::shared_ptr<ArrayBuffer>& message,
|
|
76
|
+
const std::optional<std::shared_ptr<ArrayBuffer>>& key
|
|
77
|
+
) {
|
|
78
|
+
// get owned NativeArrayBuffer before passing to sync function
|
|
79
|
+
auto nativeMessage = ToNativeArrayBuffer(message);
|
|
80
|
+
std::optional<std::shared_ptr<ArrayBuffer>> nativeKey = std::nullopt;
|
|
81
|
+
if (key.has_value()) {
|
|
82
|
+
nativeKey = ToNativeArrayBuffer(key.value());
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
return Promise<std::shared_ptr<ArrayBuffer>>::async([this, nativeMessage, nativeKey]() {
|
|
86
|
+
return this->signSync(nativeMessage, nativeKey);
|
|
87
|
+
}
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
std::shared_ptr<ArrayBuffer>
|
|
92
|
+
HybridEdKeyPair::signSync(
|
|
93
|
+
const std::shared_ptr<ArrayBuffer>& message,
|
|
94
|
+
const std::optional<std::shared_ptr<ArrayBuffer>>& key
|
|
95
|
+
) {
|
|
96
|
+
|
|
97
|
+
size_t sig_len = 0;
|
|
98
|
+
uint8_t* sig = NULL;
|
|
99
|
+
EVP_MD_CTX* md_ctx = nullptr;
|
|
100
|
+
EVP_PKEY_CTX* pkey_ctx = nullptr;
|
|
101
|
+
|
|
102
|
+
// get key to use for signing
|
|
103
|
+
EVP_PKEY* pkey = this->importPrivateKey(key);
|
|
104
|
+
|
|
105
|
+
// key context
|
|
106
|
+
md_ctx = EVP_MD_CTX_new();
|
|
107
|
+
if (md_ctx == nullptr) {
|
|
108
|
+
EVP_MD_CTX_free(md_ctx);
|
|
109
|
+
throw std::runtime_error("Error creating signing context");
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
pkey_ctx = EVP_PKEY_CTX_new_from_name(nullptr, this->curve.c_str(), nullptr);
|
|
113
|
+
if (pkey_ctx == nullptr) {
|
|
114
|
+
EVP_PKEY_CTX_free(pkey_ctx);
|
|
115
|
+
throw std::runtime_error("Error creating signing context: " + this->curve);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
if (EVP_DigestSignInit(md_ctx, &pkey_ctx, NULL, NULL, pkey) <= 0) {
|
|
119
|
+
EVP_MD_CTX_free(md_ctx);
|
|
120
|
+
char* err = ERR_error_string(ERR_get_error(), NULL);
|
|
121
|
+
throw std::runtime_error("Failed to initialize signing: " + std::string(err));
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Calculate the required size for the signature by passing a NULL buffer.
|
|
125
|
+
if (EVP_DigestSign(md_ctx, NULL, &sig_len, message.get()->data(), message.get()->size()) <= 0) {
|
|
126
|
+
EVP_MD_CTX_free(md_ctx);
|
|
127
|
+
throw std::runtime_error("Failed to calculate signature size");
|
|
128
|
+
}
|
|
129
|
+
sig = new uint8_t[sig_len];
|
|
130
|
+
|
|
131
|
+
// Actually calculate the signature
|
|
132
|
+
if (EVP_DigestSign(md_ctx, sig, &sig_len, message.get()->data(), message.get()->size()) <= 0) {
|
|
133
|
+
EVP_MD_CTX_free(md_ctx);
|
|
134
|
+
throw std::runtime_error("Failed to calculate signature");
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// return value for JS
|
|
138
|
+
std::shared_ptr<ArrayBuffer> signature = std::make_shared<NativeArrayBuffer>(
|
|
139
|
+
sig,
|
|
140
|
+
sig_len,
|
|
141
|
+
[=]() { delete[] sig; }
|
|
142
|
+
);
|
|
143
|
+
|
|
144
|
+
// Clean up
|
|
145
|
+
EVP_MD_CTX_free(md_ctx);
|
|
146
|
+
|
|
147
|
+
return signature;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
std::shared_ptr<Promise<bool>>
|
|
151
|
+
HybridEdKeyPair::verify(
|
|
152
|
+
const std::shared_ptr<ArrayBuffer>& signature,
|
|
153
|
+
const std::shared_ptr<ArrayBuffer>& message,
|
|
154
|
+
const std::optional<std::shared_ptr<ArrayBuffer>>& key
|
|
155
|
+
) {
|
|
156
|
+
// get owned NativeArrayBuffers before passing to sync function
|
|
157
|
+
auto nativeSignature = ToNativeArrayBuffer(signature);
|
|
158
|
+
auto nativeMessage = ToNativeArrayBuffer(message);
|
|
159
|
+
std::optional<std::shared_ptr<ArrayBuffer>> nativeKey = std::nullopt;
|
|
160
|
+
if (key.has_value()) {
|
|
161
|
+
nativeKey = ToNativeArrayBuffer(key.value());
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
return Promise<bool>::async([this, nativeSignature, nativeMessage, nativeKey]() {
|
|
165
|
+
return this->verifySync(nativeSignature, nativeMessage, nativeKey);
|
|
166
|
+
}
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
bool
|
|
171
|
+
HybridEdKeyPair::verifySync(
|
|
172
|
+
const std::shared_ptr<ArrayBuffer>& signature,
|
|
173
|
+
const std::shared_ptr<ArrayBuffer>& message,
|
|
174
|
+
const std::optional<std::shared_ptr<ArrayBuffer>>& key
|
|
175
|
+
) {
|
|
176
|
+
// get key to use for verifying
|
|
177
|
+
EVP_PKEY* pkey = this->importPrivateKey(key);
|
|
178
|
+
|
|
179
|
+
EVP_MD_CTX* md_ctx = nullptr;
|
|
180
|
+
EVP_PKEY_CTX* pkey_ctx = nullptr;
|
|
181
|
+
|
|
182
|
+
// key context
|
|
183
|
+
md_ctx = EVP_MD_CTX_new();
|
|
184
|
+
if (md_ctx == nullptr) {
|
|
185
|
+
EVP_MD_CTX_free(md_ctx);
|
|
186
|
+
throw std::runtime_error("Error creating verify context");
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
pkey_ctx = EVP_PKEY_CTX_new_from_name(nullptr, this->curve.c_str(), nullptr);
|
|
190
|
+
if (pkey_ctx == nullptr) {
|
|
191
|
+
EVP_PKEY_CTX_free(pkey_ctx);
|
|
192
|
+
throw std::runtime_error("Error creating verify context: " + this->curve);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
if (EVP_DigestVerifyInit(md_ctx, &pkey_ctx, NULL, NULL, pkey) <= 0) {
|
|
196
|
+
EVP_MD_CTX_free(md_ctx);
|
|
197
|
+
char* err = ERR_error_string(ERR_get_error(), NULL);
|
|
198
|
+
throw std::runtime_error("Failed to initialize verify: " + std::string(err));
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// verify
|
|
202
|
+
auto res = EVP_DigestVerify(
|
|
203
|
+
md_ctx,
|
|
204
|
+
signature.get()->data(), signature.get()->size(),
|
|
205
|
+
message.get()->data(), message.get()->size()
|
|
206
|
+
);
|
|
207
|
+
|
|
208
|
+
//return value for JS
|
|
209
|
+
if (res < 0) {
|
|
210
|
+
EVP_MD_CTX_free(md_ctx);
|
|
211
|
+
throw std::runtime_error("Failed to verify");
|
|
212
|
+
}
|
|
213
|
+
return res == 1; // true if 1, false if 0
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
std::shared_ptr<ArrayBuffer>
|
|
217
|
+
HybridEdKeyPair::getPublicKey() {
|
|
218
|
+
this->checkKeyPair();
|
|
219
|
+
size_t len = 32;
|
|
220
|
+
uint8_t* publ = new uint8_t[len];
|
|
221
|
+
EVP_PKEY_get_raw_public_key(this->pkey, publ, &len);
|
|
222
|
+
|
|
223
|
+
return std::make_shared<NativeArrayBuffer>(publ, len, [=]() { delete[] publ; });
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
std::shared_ptr<ArrayBuffer>
|
|
227
|
+
HybridEdKeyPair::getPrivateKey() {
|
|
228
|
+
this->checkKeyPair();
|
|
229
|
+
size_t len = 32;
|
|
230
|
+
uint8_t* priv = new uint8_t[len];
|
|
231
|
+
EVP_PKEY_get_raw_private_key(this->pkey, priv, &len);
|
|
232
|
+
|
|
233
|
+
return std::make_shared<NativeArrayBuffer>(priv, len, [=]() { delete[] priv; });
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
void
|
|
237
|
+
HybridEdKeyPair::checkKeyPair() {
|
|
238
|
+
if (this->pkey == nullptr) {
|
|
239
|
+
throw std::runtime_error("Keypair not initialized");
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
void
|
|
244
|
+
HybridEdKeyPair::setCurve(const std::string& curve) {
|
|
245
|
+
this->curve = curve;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
EVP_PKEY*
|
|
249
|
+
HybridEdKeyPair::importPrivateKey(const std::optional<std::shared_ptr<ArrayBuffer>>& key) {
|
|
250
|
+
EVP_PKEY* pkey = nullptr;
|
|
251
|
+
if (key.has_value()) {
|
|
252
|
+
pkey = EVP_PKEY_new_raw_private_key(
|
|
253
|
+
EVP_PKEY_ED25519, // TODO: use this->curve somehow
|
|
254
|
+
NULL,
|
|
255
|
+
key.value()->data(),
|
|
256
|
+
32
|
|
257
|
+
);
|
|
258
|
+
if (pkey == nullptr) {
|
|
259
|
+
throw std::runtime_error("Failed to read private key");
|
|
260
|
+
}
|
|
261
|
+
} else {
|
|
262
|
+
this->checkKeyPair();
|
|
263
|
+
pkey = this->pkey;
|
|
264
|
+
}
|
|
265
|
+
return pkey;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
} // namespace margelo::nitro::crypto
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
#include <openssl/evp.h>
|
|
2
|
+
#include <openssl/err.h>
|
|
3
|
+
#include <memory>
|
|
4
|
+
#include <string>
|
|
5
|
+
|
|
6
|
+
#include "HybridEdKeyPairSpec.hpp"
|
|
7
|
+
#include "Utils.hpp"
|
|
8
|
+
|
|
9
|
+
namespace margelo::nitro::crypto {
|
|
10
|
+
|
|
11
|
+
using namespace facebook;
|
|
12
|
+
|
|
13
|
+
class HybridEdKeyPair : public HybridEdKeyPairSpec {
|
|
14
|
+
public:
|
|
15
|
+
HybridEdKeyPair() : HybridObject(TAG) {}
|
|
16
|
+
|
|
17
|
+
public:
|
|
18
|
+
// Methods
|
|
19
|
+
std::shared_ptr<Promise<void>>
|
|
20
|
+
generateKeyPair(
|
|
21
|
+
double publicFormat,
|
|
22
|
+
double publicType,
|
|
23
|
+
double privateFormat,
|
|
24
|
+
double privateType,
|
|
25
|
+
const std::optional<std::string>& cipher,
|
|
26
|
+
const std::optional<std::shared_ptr<ArrayBuffer>>& passphrase
|
|
27
|
+
) override;
|
|
28
|
+
|
|
29
|
+
void
|
|
30
|
+
generateKeyPairSync(
|
|
31
|
+
double publicFormat,
|
|
32
|
+
double publicType,
|
|
33
|
+
double privateFormat,
|
|
34
|
+
double privateType,
|
|
35
|
+
const std::optional<std::string>& cipher,
|
|
36
|
+
const std::optional<std::shared_ptr<ArrayBuffer>>& passphrase
|
|
37
|
+
) override;
|
|
38
|
+
|
|
39
|
+
std::shared_ptr<Promise<std::shared_ptr<ArrayBuffer>>>
|
|
40
|
+
sign(
|
|
41
|
+
const std::shared_ptr<ArrayBuffer>& message,
|
|
42
|
+
const std::optional<std::shared_ptr<ArrayBuffer>>& key
|
|
43
|
+
) override;
|
|
44
|
+
|
|
45
|
+
std::shared_ptr<ArrayBuffer>
|
|
46
|
+
signSync(
|
|
47
|
+
const std::shared_ptr<ArrayBuffer>& message,
|
|
48
|
+
const std::optional<std::shared_ptr<ArrayBuffer>>& key
|
|
49
|
+
) override;
|
|
50
|
+
|
|
51
|
+
std::shared_ptr<Promise<bool>>
|
|
52
|
+
verify(
|
|
53
|
+
const std::shared_ptr<ArrayBuffer>& signature,
|
|
54
|
+
const std::shared_ptr<ArrayBuffer>& message,
|
|
55
|
+
const std::optional<std::shared_ptr<ArrayBuffer>>& key
|
|
56
|
+
) override;
|
|
57
|
+
|
|
58
|
+
bool
|
|
59
|
+
verifySync(
|
|
60
|
+
const std::shared_ptr<ArrayBuffer>& signature,
|
|
61
|
+
const std::shared_ptr<ArrayBuffer>& message,
|
|
62
|
+
const std::optional<std::shared_ptr<ArrayBuffer>>& key
|
|
63
|
+
) override;
|
|
64
|
+
|
|
65
|
+
protected:
|
|
66
|
+
std::shared_ptr<ArrayBuffer>
|
|
67
|
+
getPublicKey() override;
|
|
68
|
+
|
|
69
|
+
std::shared_ptr<ArrayBuffer>
|
|
70
|
+
getPrivateKey() override;
|
|
71
|
+
|
|
72
|
+
void checkKeyPair();
|
|
73
|
+
|
|
74
|
+
void setCurve(const std::string& curve) override;
|
|
75
|
+
|
|
76
|
+
private:
|
|
77
|
+
std::string curve;
|
|
78
|
+
EVP_PKEY* pkey = nullptr;
|
|
79
|
+
|
|
80
|
+
EVP_PKEY* importPrivateKey(
|
|
81
|
+
const std::optional<std::shared_ptr<ArrayBuffer>>& key
|
|
82
|
+
);
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
} // namespace margelo::nitro::crypto
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
namespace margelo::nitro::crypto {
|
|
5
5
|
|
|
6
|
-
std::
|
|
6
|
+
std::shared_ptr<Promise<std::shared_ptr<ArrayBuffer>>>
|
|
7
7
|
HybridPbkdf2::pbkdf2(
|
|
8
8
|
const std::shared_ptr<ArrayBuffer>& password,
|
|
9
9
|
const std::shared_ptr<ArrayBuffer>& salt,
|
|
@@ -15,10 +15,11 @@ HybridPbkdf2::pbkdf2(
|
|
|
15
15
|
auto nativePassword = ToNativeArrayBuffer(password);
|
|
16
16
|
auto nativeSalt = ToNativeArrayBuffer(salt);
|
|
17
17
|
|
|
18
|
-
return std::async(
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
18
|
+
return Promise<std::shared_ptr<ArrayBuffer>>::async(
|
|
19
|
+
[this, nativePassword, nativeSalt, iterations, keylen, digest]() {
|
|
20
|
+
return this->pbkdf2Sync(nativePassword, nativeSalt, iterations, keylen, digest);
|
|
21
|
+
}
|
|
22
|
+
);
|
|
22
23
|
}
|
|
23
24
|
|
|
24
25
|
std::shared_ptr<ArrayBuffer>
|
|
@@ -8,12 +8,12 @@ namespace margelo::nitro::crypto {
|
|
|
8
8
|
using namespace facebook;
|
|
9
9
|
|
|
10
10
|
class HybridPbkdf2 : public HybridPbkdf2Spec {
|
|
11
|
-
public:
|
|
11
|
+
public:
|
|
12
12
|
HybridPbkdf2() : HybridObject(TAG) {}
|
|
13
13
|
|
|
14
|
-
public:
|
|
14
|
+
public:
|
|
15
15
|
// Methods
|
|
16
|
-
|
|
16
|
+
std::shared_ptr<Promise<std::shared_ptr<ArrayBuffer>>>
|
|
17
17
|
pbkdf2(
|
|
18
18
|
const std::shared_ptr<ArrayBuffer>& password,
|
|
19
19
|
const std::shared_ptr<ArrayBuffer>& salt,
|
|
@@ -22,7 +22,7 @@ public:
|
|
|
22
22
|
const std::string& digest
|
|
23
23
|
) override;
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
std::shared_ptr<ArrayBuffer>
|
|
26
26
|
pbkdf2Sync(
|
|
27
27
|
const std::shared_ptr<ArrayBuffer>& password,
|
|
28
28
|
const std::shared_ptr<ArrayBuffer>& salt,
|
|
@@ -28,17 +28,18 @@ size_t checkOffset(double size, double offset) {
|
|
|
28
28
|
|
|
29
29
|
namespace margelo::nitro::crypto {
|
|
30
30
|
|
|
31
|
-
std::
|
|
31
|
+
std::shared_ptr<Promise<std::shared_ptr<ArrayBuffer>>>
|
|
32
32
|
HybridRandom::randomFill(const std::shared_ptr<ArrayBuffer>& buffer,
|
|
33
33
|
double dOffset,
|
|
34
34
|
double dSize) {
|
|
35
35
|
// get owned NativeArrayBuffer before passing to sync function
|
|
36
36
|
auto nativeBuffer = ToNativeArrayBuffer(buffer);
|
|
37
37
|
|
|
38
|
-
return std::async(
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
38
|
+
return Promise<std::shared_ptr<ArrayBuffer>>::async(
|
|
39
|
+
[this, nativeBuffer, dOffset, dSize]() {
|
|
40
|
+
return this->randomFillSync(nativeBuffer, dOffset, dSize);
|
|
41
|
+
}
|
|
42
|
+
);
|
|
42
43
|
};
|
|
43
44
|
|
|
44
45
|
std::shared_ptr<ArrayBuffer>
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#include <cmath>
|
|
2
2
|
#include <future>
|
|
3
|
+
#include <memory>
|
|
3
4
|
#include <iostream>
|
|
4
5
|
|
|
5
6
|
#include "HybridRandomSpec.hpp"
|
|
@@ -9,13 +10,16 @@ namespace margelo::nitro::crypto {
|
|
|
9
10
|
using namespace facebook;
|
|
10
11
|
|
|
11
12
|
class HybridRandom : public HybridRandomSpec {
|
|
12
|
-
public:
|
|
13
|
+
public:
|
|
13
14
|
HybridRandom() : HybridObject(TAG) {}
|
|
14
15
|
|
|
15
|
-
public:
|
|
16
|
+
public:
|
|
16
17
|
// Methods
|
|
17
|
-
std::
|
|
18
|
-
|
|
18
|
+
std::shared_ptr<Promise<std::shared_ptr<ArrayBuffer>>>
|
|
19
|
+
randomFill(const std::shared_ptr<ArrayBuffer>& buffer, double dOffset, double dSize) override;
|
|
20
|
+
|
|
21
|
+
std::shared_ptr<ArrayBuffer>
|
|
22
|
+
randomFillSync(const std::shared_ptr<ArrayBuffer>& buffer, double dOffset, double dSize) override;
|
|
19
23
|
};
|
|
20
24
|
|
|
21
25
|
inline void printData(std::string name, uint8_t* data, size_t size) {
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.Ed = void 0;
|
|
7
|
+
var _reactNativeNitroModules = require("react-native-nitro-modules");
|
|
8
|
+
class Ed {
|
|
9
|
+
constructor(type, config) {
|
|
10
|
+
this.type = type;
|
|
11
|
+
this.config = config;
|
|
12
|
+
this.native = _reactNativeNitroModules.NitroModules.createHybridObject('EdKeyPair');
|
|
13
|
+
this.native.setCurve(type);
|
|
14
|
+
}
|
|
15
|
+
async generateKeyPair() {
|
|
16
|
+
this.native.generateKeyPair(this.config.publicFormat || -1, this.config.publicType || -1, this.config.privateFormat || -1, this.config.privateType || -1, this.config.cipher, this.config.passphrase);
|
|
17
|
+
}
|
|
18
|
+
generateKeyPairSync() {
|
|
19
|
+
this.native.generateKeyPairSync(this.config.publicFormat || -1, this.config.publicType || -1, this.config.privateFormat || -1, this.config.privateType || -1, this.config.cipher, this.config.passphrase);
|
|
20
|
+
}
|
|
21
|
+
getPublicKey() {
|
|
22
|
+
return this.native.getPublicKey();
|
|
23
|
+
}
|
|
24
|
+
getPrivateKey() {
|
|
25
|
+
return this.native.getPrivateKey();
|
|
26
|
+
}
|
|
27
|
+
async sign(message, key) {
|
|
28
|
+
return key ? this.native.sign(message, key) : this.native.sign(message);
|
|
29
|
+
}
|
|
30
|
+
signSync(message, key) {
|
|
31
|
+
return key ? this.native.signSync(message, key) : this.native.signSync(message);
|
|
32
|
+
}
|
|
33
|
+
async verify(message, signature, key) {
|
|
34
|
+
return key ? this.native.verify(message, signature, key) : this.native.verify(message, signature);
|
|
35
|
+
}
|
|
36
|
+
verifySync(message, signature, key) {
|
|
37
|
+
return key ? this.native.verifySync(message, signature, key) : this.native.verifySync(message, signature);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
exports.Ed = Ed;
|
|
41
|
+
//# sourceMappingURL=ed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_reactNativeNitroModules","require","Ed","constructor","type","config","native","NitroModules","createHybridObject","setCurve","generateKeyPair","publicFormat","publicType","privateFormat","privateType","cipher","passphrase","generateKeyPairSync","getPublicKey","getPrivateKey","sign","message","key","signSync","verify","signature","verifySync","exports"],"sourceRoot":"../../src","sources":["ed.ts"],"mappings":";;;;;;AAAA,IAAAA,wBAAA,GAAAC,OAAA;AAIO,MAAMC,EAAE,CAAC;EAKdC,WAAWA,CAACC,IAAqB,EAAEC,MAAwB,EAAE;IAC3D,IAAI,CAACD,IAAI,GAAGA,IAAI;IAChB,IAAI,CAACC,MAAM,GAAGA,MAAM;IACpB,IAAI,CAACC,MAAM,GAAGC,qCAAY,CAACC,kBAAkB,CAAY,WAAW,CAAC;IACrE,IAAI,CAACF,MAAM,CAACG,QAAQ,CAACL,IAAI,CAAC;EAC5B;EAEA,MAAMM,eAAeA,CAAA,EAAkB;IACrC,IAAI,CAACJ,MAAM,CAACI,eAAe,CACzB,IAAI,CAACL,MAAM,CAACM,YAAY,IAAK,CAAC,CAAY,EAC1C,IAAI,CAACN,MAAM,CAACO,UAAU,IAAK,CAAC,CAAY,EACxC,IAAI,CAACP,MAAM,CAACQ,aAAa,IAAK,CAAC,CAAY,EAC3C,IAAI,CAACR,MAAM,CAACS,WAAW,IAAK,CAAC,CAAY,EACzC,IAAI,CAACT,MAAM,CAACU,MAAM,EAClB,IAAI,CAACV,MAAM,CAACW,UACd,CAAC;EACH;EAEAC,mBAAmBA,CAAA,EAAS;IAC1B,IAAI,CAACX,MAAM,CAACW,mBAAmB,CAC7B,IAAI,CAACZ,MAAM,CAACM,YAAY,IAAK,CAAC,CAAY,EAC1C,IAAI,CAACN,MAAM,CAACO,UAAU,IAAK,CAAC,CAAY,EACxC,IAAI,CAACP,MAAM,CAACQ,aAAa,IAAK,CAAC,CAAY,EAC3C,IAAI,CAACR,MAAM,CAACS,WAAW,IAAK,CAAC,CAAY,EACzC,IAAI,CAACT,MAAM,CAACU,MAAM,EAClB,IAAI,CAACV,MAAM,CAACW,UACd,CAAC;EACH;EAEAE,YAAYA,CAAA,EAAgB;IAC1B,OAAO,IAAI,CAACZ,MAAM,CAACY,YAAY,CAAC,CAAC;EACnC;EAEAC,aAAaA,CAAA,EAAgB;IAC3B,OAAO,IAAI,CAACb,MAAM,CAACa,aAAa,CAAC,CAAC;EACpC;EAEA,MAAMC,IAAIA,CAACC,OAAoB,EAAEC,GAAiB,EAAwB;IACxE,OAAOA,GAAG,GAAG,IAAI,CAAChB,MAAM,CAACc,IAAI,CAACC,OAAO,EAAEC,GAAG,CAAC,GAAG,IAAI,CAAChB,MAAM,CAACc,IAAI,CAACC,OAAO,CAAC;EACzE;EAEAE,QAAQA,CAACF,OAAoB,EAAEC,GAAiB,EAAe;IAC7D,OAAOA,GAAG,GACN,IAAI,CAAChB,MAAM,CAACiB,QAAQ,CAACF,OAAO,EAAEC,GAAG,CAAC,GAClC,IAAI,CAAChB,MAAM,CAACiB,QAAQ,CAACF,OAAO,CAAC;EACnC;EAEA,MAAMG,MAAMA,CACVH,OAAoB,EACpBI,SAAsB,EACtBH,GAAiB,EACC;IAClB,OAAOA,GAAG,GACN,IAAI,CAAChB,MAAM,CAACkB,MAAM,CAACH,OAAO,EAAEI,SAAS,EAAEH,GAAG,CAAC,GAC3C,IAAI,CAAChB,MAAM,CAACkB,MAAM,CAACH,OAAO,EAAEI,SAAS,CAAC;EAC5C;EAEAC,UAAUA,CACRL,OAAoB,EACpBI,SAAsB,EACtBH,GAAiB,EACR;IACT,OAAOA,GAAG,GACN,IAAI,CAAChB,MAAM,CAACoB,UAAU,CAACL,OAAO,EAAEI,SAAS,EAAEH,GAAG,CAAC,GAC/C,IAAI,CAAChB,MAAM,CAACoB,UAAU,CAACL,OAAO,EAAEI,SAAS,CAAC;EAChD;AACF;AAACE,OAAA,CAAAzB,EAAA,GAAAA,EAAA","ignoreList":[]}
|
package/lib/commonjs/index.js
CHANGED
|
@@ -8,8 +8,43 @@ var _exportNames = {
|
|
|
8
8
|
};
|
|
9
9
|
exports.install = exports.default = void 0;
|
|
10
10
|
var _reactNativeBuffer = require("@craftzdog/react-native-buffer");
|
|
11
|
+
var keys = _interopRequireWildcard(require("./keys"));
|
|
12
|
+
var ed = _interopRequireWildcard(require("./ed"));
|
|
13
|
+
Object.keys(ed).forEach(function (key) {
|
|
14
|
+
if (key === "default" || key === "__esModule") return;
|
|
15
|
+
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
16
|
+
if (key in exports && exports[key] === ed[key]) return;
|
|
17
|
+
Object.defineProperty(exports, key, {
|
|
18
|
+
enumerable: true,
|
|
19
|
+
get: function () {
|
|
20
|
+
return ed[key];
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
});
|
|
11
24
|
var pbkdf2 = _interopRequireWildcard(require("./pbkdf2"));
|
|
25
|
+
Object.keys(pbkdf2).forEach(function (key) {
|
|
26
|
+
if (key === "default" || key === "__esModule") return;
|
|
27
|
+
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
28
|
+
if (key in exports && exports[key] === pbkdf2[key]) return;
|
|
29
|
+
Object.defineProperty(exports, key, {
|
|
30
|
+
enumerable: true,
|
|
31
|
+
get: function () {
|
|
32
|
+
return pbkdf2[key];
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
});
|
|
12
36
|
var random = _interopRequireWildcard(require("./random"));
|
|
37
|
+
Object.keys(random).forEach(function (key) {
|
|
38
|
+
if (key === "default" || key === "__esModule") return;
|
|
39
|
+
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
40
|
+
if (key in exports && exports[key] === random[key]) return;
|
|
41
|
+
Object.defineProperty(exports, key, {
|
|
42
|
+
enumerable: true,
|
|
43
|
+
get: function () {
|
|
44
|
+
return random[key];
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
});
|
|
13
48
|
var utils = _interopRequireWildcard(require("./utils"));
|
|
14
49
|
Object.keys(utils).forEach(function (key) {
|
|
15
50
|
if (key === "default" || key === "__esModule") return;
|
|
@@ -43,20 +78,17 @@ const QuickCrypto = {
|
|
|
43
78
|
// createCipheriv,
|
|
44
79
|
// createDecipher,
|
|
45
80
|
// createDecipheriv,
|
|
46
|
-
// createPublicKey,
|
|
47
|
-
// createPrivateKey,
|
|
48
|
-
// createSecretKey,
|
|
49
81
|
// publicEncrypt,
|
|
50
82
|
// publicDecrypt,
|
|
51
83
|
// privateDecrypt,
|
|
52
84
|
// generateKey,
|
|
53
|
-
// generateKeyPair,
|
|
54
|
-
// generateKeyPairSync,
|
|
55
85
|
// generateKeySync,
|
|
56
86
|
// createSign,
|
|
57
87
|
// createVerify,
|
|
58
88
|
// subtle,
|
|
59
89
|
// constants,
|
|
90
|
+
...keys,
|
|
91
|
+
...ed,
|
|
60
92
|
...pbkdf2,
|
|
61
93
|
...random,
|
|
62
94
|
// getCiphers,
|