react-native-quick-crypto 1.0.5 → 1.0.6
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 +21 -7
- package/android/CMakeLists.txt +1 -0
- package/cpp/cipher/HybridRsaCipher.cpp +111 -25
- package/cpp/cipher/HybridRsaCipher.hpp +5 -1
- package/cpp/hash/HybridHash.cpp +11 -4
- package/cpp/hash/HybridHash.hpp +1 -1
- package/cpp/hmac/HybridHmac.cpp +13 -4
- package/cpp/hmac/HybridHmac.hpp +2 -1
- package/cpp/utils/HybridUtils.cpp +19 -0
- package/cpp/utils/HybridUtils.hpp +15 -0
- package/lib/commonjs/hash.js +7 -1
- package/lib/commonjs/hash.js.map +1 -1
- package/lib/commonjs/hmac.js +7 -1
- package/lib/commonjs/hmac.js.map +1 -1
- package/lib/commonjs/keys/publicCipher.js +30 -18
- package/lib/commonjs/keys/publicCipher.js.map +1 -1
- package/lib/commonjs/specs/utils.nitro.js +6 -0
- package/lib/commonjs/specs/utils.nitro.js.map +1 -0
- package/lib/commonjs/utils/index.js +11 -0
- package/lib/commonjs/utils/index.js.map +1 -1
- package/lib/commonjs/utils/timingSafeEqual.js +24 -0
- package/lib/commonjs/utils/timingSafeEqual.js.map +1 -0
- package/lib/module/hash.js +7 -1
- package/lib/module/hash.js.map +1 -1
- package/lib/module/hmac.js +7 -1
- package/lib/module/hmac.js.map +1 -1
- package/lib/module/keys/publicCipher.js +30 -18
- package/lib/module/keys/publicCipher.js.map +1 -1
- package/lib/module/specs/utils.nitro.js +4 -0
- package/lib/module/specs/utils.nitro.js.map +1 -0
- package/lib/module/utils/index.js +1 -0
- package/lib/module/utils/index.js.map +1 -1
- package/lib/module/utils/timingSafeEqual.js +20 -0
- package/lib/module/utils/timingSafeEqual.js.map +1 -0
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/lib/typescript/hash.d.ts.map +1 -1
- package/lib/typescript/hmac.d.ts.map +1 -1
- package/lib/typescript/index.d.ts +1 -0
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/keys/publicCipher.d.ts +2 -0
- package/lib/typescript/keys/publicCipher.d.ts.map +1 -1
- package/lib/typescript/specs/hash.nitro.d.ts +1 -1
- package/lib/typescript/specs/hash.nitro.d.ts.map +1 -1
- package/lib/typescript/specs/hmac.nitro.d.ts +1 -1
- package/lib/typescript/specs/hmac.nitro.d.ts.map +1 -1
- package/lib/typescript/specs/rsaCipher.nitro.d.ts +14 -4
- package/lib/typescript/specs/rsaCipher.nitro.d.ts.map +1 -1
- package/lib/typescript/specs/utils.nitro.d.ts +8 -0
- package/lib/typescript/specs/utils.nitro.d.ts.map +1 -0
- package/lib/typescript/utils/index.d.ts +1 -0
- package/lib/typescript/utils/index.d.ts.map +1 -1
- package/lib/typescript/utils/timingSafeEqual.d.ts +3 -0
- package/lib/typescript/utils/timingSafeEqual.d.ts.map +1 -0
- package/nitrogen/generated/android/QuickCrypto+autolinking.cmake +1 -0
- package/nitrogen/generated/android/QuickCryptoOnLoad.cpp +10 -0
- package/nitrogen/generated/ios/QuickCryptoAutolinking.mm +10 -0
- package/nitrogen/generated/shared/c++/HybridHashSpec.hpp +2 -1
- package/nitrogen/generated/shared/c++/HybridHmacSpec.hpp +2 -1
- package/nitrogen/generated/shared/c++/HybridRsaCipherSpec.cpp +1 -0
- package/nitrogen/generated/shared/c++/HybridRsaCipherSpec.hpp +2 -1
- package/nitrogen/generated/shared/c++/HybridUtilsSpec.cpp +21 -0
- package/nitrogen/generated/shared/c++/HybridUtilsSpec.hpp +63 -0
- package/package.json +2 -2
- package/src/hash.ts +6 -1
- package/src/hmac.ts +6 -1
- package/src/keys/publicCipher.ts +46 -26
- package/src/specs/hash.nitro.ts +1 -1
- package/src/specs/hmac.nitro.ts +1 -1
- package/src/specs/rsaCipher.nitro.ts +20 -3
- package/src/specs/utils.nitro.ts +5 -0
- package/src/utils/index.ts +1 -0
- package/src/utils/timingSafeEqual.ts +23 -0
- package/react-native.config.js +0 -19
- package/scripts/embed_openssl_framework.sh +0 -18
package/QuickCrypto.podspec
CHANGED
|
@@ -22,11 +22,22 @@ Pod::Spec.new do |s|
|
|
|
22
22
|
sodium_enabled = ENV['SODIUM_ENABLED'] == '1'
|
|
23
23
|
Pod::UI.puts("[QuickCrypto] 🧂 has libsodium #{sodium_enabled ? "enabled" : "disabled"}!")
|
|
24
24
|
|
|
25
|
+
# OpenSSL 3.6+ vendored xcframework (not yet on CocoaPods trunk)
|
|
26
|
+
openssl_version = "3.6.0000"
|
|
27
|
+
openssl_url = "https://github.com/krzyzanowskim/OpenSSL/releases/download/#{openssl_version}/OpenSSL.xcframework.zip"
|
|
28
|
+
|
|
25
29
|
if sodium_enabled
|
|
26
30
|
# Build libsodium from source for XSalsa20 cipher support
|
|
27
31
|
# CocoaPods packages are outdated (1.0.12) and SPM causes module conflicts
|
|
28
32
|
s.prepare_command = <<-CMD
|
|
29
33
|
set -e
|
|
34
|
+
# Download OpenSSL.xcframework
|
|
35
|
+
if [ ! -d "OpenSSL.xcframework" ]; then
|
|
36
|
+
curl -L -o OpenSSL.xcframework.zip #{openssl_url}
|
|
37
|
+
unzip -o OpenSSL.xcframework.zip
|
|
38
|
+
rm -f OpenSSL.xcframework.zip
|
|
39
|
+
fi
|
|
40
|
+
# Build libsodium
|
|
30
41
|
mkdir -p ios
|
|
31
42
|
curl -L -o ios/libsodium.tar.gz https://download.libsodium.org/libsodium/releases/libsodium-1.0.20-stable.tar.gz
|
|
32
43
|
tar -xzf ios/libsodium.tar.gz -C ios
|
|
@@ -38,11 +49,21 @@ Pod::Spec.new do |s|
|
|
|
38
49
|
CMD
|
|
39
50
|
else
|
|
40
51
|
s.prepare_command = <<-CMD
|
|
52
|
+
set -e
|
|
53
|
+
# Download OpenSSL.xcframework
|
|
54
|
+
if [ ! -d "OpenSSL.xcframework" ]; then
|
|
55
|
+
curl -L -o OpenSSL.xcframework.zip #{openssl_url}
|
|
56
|
+
unzip -o OpenSSL.xcframework.zip
|
|
57
|
+
rm -f OpenSSL.xcframework.zip
|
|
58
|
+
fi
|
|
59
|
+
# Clean up libsodium if previously built
|
|
41
60
|
rm -rf ios/libsodium-stable
|
|
42
61
|
rm -f ios/libsodium.tar.gz
|
|
43
62
|
CMD
|
|
44
63
|
end
|
|
45
64
|
|
|
65
|
+
s.vendored_frameworks = "OpenSSL.xcframework"
|
|
66
|
+
|
|
46
67
|
base_source_files = [
|
|
47
68
|
# implementation (Swift)
|
|
48
69
|
"ios/**/*.{swift}",
|
|
@@ -137,12 +158,5 @@ Pod::Spec.new do |s|
|
|
|
137
158
|
s.dependency "React-jsi"
|
|
138
159
|
s.dependency "React-callinvoker"
|
|
139
160
|
|
|
140
|
-
# OpenSSL 3.6+ via SPM for ML-DSA (post-quantum cryptography) support
|
|
141
|
-
spm_dependency(s,
|
|
142
|
-
url: 'https://github.com/krzyzanowskim/OpenSSL.git',
|
|
143
|
-
requirement: {kind: 'upToNextMajorVersion', minimumVersion: '3.6.0'},
|
|
144
|
-
products: ['OpenSSL']
|
|
145
|
-
)
|
|
146
|
-
|
|
147
161
|
install_modules_dependencies(s)
|
|
148
162
|
end
|
package/android/CMakeLists.txt
CHANGED
|
@@ -218,6 +218,79 @@ std::shared_ptr<ArrayBuffer> HybridRsaCipher::decrypt(const std::shared_ptr<Hybr
|
|
|
218
218
|
return std::make_shared<NativeArrayBuffer>(out_buf.release(), outlen, [raw_ptr]() { delete[] raw_ptr; });
|
|
219
219
|
}
|
|
220
220
|
|
|
221
|
+
std::shared_ptr<ArrayBuffer> HybridRsaCipher::publicDecrypt(const std::shared_ptr<HybridKeyObjectHandleSpec>& keyHandle,
|
|
222
|
+
const std::shared_ptr<ArrayBuffer>& data, double padding) {
|
|
223
|
+
auto keyHandleImpl = std::static_pointer_cast<HybridKeyObjectHandle>(keyHandle);
|
|
224
|
+
EVP_PKEY* pkey = keyHandleImpl->getKeyObjectData().GetAsymmetricKey().get();
|
|
225
|
+
|
|
226
|
+
if (!pkey) {
|
|
227
|
+
throw std::runtime_error("Invalid key for RSA public decryption");
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
EVP_PKEY_CTX* ctx = EVP_PKEY_CTX_new(pkey, nullptr);
|
|
231
|
+
if (!ctx) {
|
|
232
|
+
throw std::runtime_error("Failed to create EVP_PKEY_CTX");
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
if (EVP_PKEY_verify_recover_init(ctx) <= 0) {
|
|
236
|
+
EVP_PKEY_CTX_free(ctx);
|
|
237
|
+
unsigned long err = ERR_get_error();
|
|
238
|
+
char err_buf[256];
|
|
239
|
+
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
240
|
+
throw std::runtime_error("Failed to initialize verify recover: " + std::string(err_buf));
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
int paddingInt = static_cast<int>(padding);
|
|
244
|
+
int opensslPadding = toOpenSSLPadding(paddingInt);
|
|
245
|
+
|
|
246
|
+
if (EVP_PKEY_CTX_set_rsa_padding(ctx, opensslPadding) <= 0) {
|
|
247
|
+
EVP_PKEY_CTX_free(ctx);
|
|
248
|
+
throw std::runtime_error("Failed to set RSA padding");
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
auto native_data = ToNativeArrayBuffer(data);
|
|
252
|
+
const unsigned char* in = native_data->data();
|
|
253
|
+
size_t inlen = native_data->size();
|
|
254
|
+
|
|
255
|
+
size_t outlen;
|
|
256
|
+
if (EVP_PKEY_verify_recover(ctx, nullptr, &outlen, in, inlen) <= 0) {
|
|
257
|
+
EVP_PKEY_CTX_free(ctx);
|
|
258
|
+
unsigned long err = ERR_get_error();
|
|
259
|
+
char err_buf[256];
|
|
260
|
+
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
261
|
+
throw std::runtime_error("Failed to determine output length: " + std::string(err_buf));
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
if (outlen == 0) {
|
|
265
|
+
EVP_PKEY_CTX_free(ctx);
|
|
266
|
+
uint8_t* empty_buf = new uint8_t[1];
|
|
267
|
+
return std::make_shared<NativeArrayBuffer>(empty_buf, 0, [empty_buf]() { delete[] empty_buf; });
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
auto out_buf = std::make_unique<uint8_t[]>(outlen);
|
|
271
|
+
|
|
272
|
+
if (EVP_PKEY_verify_recover(ctx, out_buf.get(), &outlen, in, inlen) <= 0) {
|
|
273
|
+
unsigned long err = ERR_get_error();
|
|
274
|
+
char err_buf[256];
|
|
275
|
+
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
276
|
+
|
|
277
|
+
if ((err & 0xFFFFFFF) == 0x1C880004 || (err & 0xFF) == 0x04) {
|
|
278
|
+
ERR_clear_error();
|
|
279
|
+
EVP_PKEY_CTX_free(ctx);
|
|
280
|
+
uint8_t* empty_buf = new uint8_t[1];
|
|
281
|
+
return std::make_shared<NativeArrayBuffer>(empty_buf, 0, [empty_buf]() { delete[] empty_buf; });
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
EVP_PKEY_CTX_free(ctx);
|
|
285
|
+
throw std::runtime_error("Public decryption failed: " + std::string(err_buf));
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
EVP_PKEY_CTX_free(ctx);
|
|
289
|
+
|
|
290
|
+
uint8_t* raw_ptr = out_buf.get();
|
|
291
|
+
return std::make_shared<NativeArrayBuffer>(out_buf.release(), outlen, [raw_ptr]() { delete[] raw_ptr; });
|
|
292
|
+
}
|
|
293
|
+
|
|
221
294
|
std::shared_ptr<ArrayBuffer> HybridRsaCipher::privateEncrypt(const std::shared_ptr<HybridKeyObjectHandleSpec>& keyHandle,
|
|
222
295
|
const std::shared_ptr<ArrayBuffer>& data, double padding) {
|
|
223
296
|
auto keyHandleImpl = std::static_pointer_cast<HybridKeyObjectHandle>(keyHandle);
|
|
@@ -278,7 +351,9 @@ std::shared_ptr<ArrayBuffer> HybridRsaCipher::privateEncrypt(const std::shared_p
|
|
|
278
351
|
}
|
|
279
352
|
|
|
280
353
|
std::shared_ptr<ArrayBuffer> HybridRsaCipher::privateDecrypt(const std::shared_ptr<HybridKeyObjectHandleSpec>& keyHandle,
|
|
281
|
-
const std::shared_ptr<ArrayBuffer>& data, double padding
|
|
354
|
+
const std::shared_ptr<ArrayBuffer>& data, double padding,
|
|
355
|
+
const std::string& hashAlgorithm,
|
|
356
|
+
const std::optional<std::shared_ptr<ArrayBuffer>>& label) {
|
|
282
357
|
auto keyHandleImpl = std::static_pointer_cast<HybridKeyObjectHandle>(keyHandle);
|
|
283
358
|
EVP_PKEY* pkey = keyHandleImpl->getKeyObjectData().GetAsymmetricKey().get();
|
|
284
359
|
|
|
@@ -291,12 +366,12 @@ std::shared_ptr<ArrayBuffer> HybridRsaCipher::privateDecrypt(const std::shared_p
|
|
|
291
366
|
throw std::runtime_error("Failed to create EVP_PKEY_CTX");
|
|
292
367
|
}
|
|
293
368
|
|
|
294
|
-
if (
|
|
369
|
+
if (EVP_PKEY_decrypt_init(ctx) <= 0) {
|
|
295
370
|
EVP_PKEY_CTX_free(ctx);
|
|
296
371
|
unsigned long err = ERR_get_error();
|
|
297
372
|
char err_buf[256];
|
|
298
373
|
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
299
|
-
throw std::runtime_error("Failed to initialize
|
|
374
|
+
throw std::runtime_error("Failed to initialize decryption: " + std::string(err_buf));
|
|
300
375
|
}
|
|
301
376
|
|
|
302
377
|
int paddingInt = static_cast<int>(padding);
|
|
@@ -307,12 +382,41 @@ std::shared_ptr<ArrayBuffer> HybridRsaCipher::privateDecrypt(const std::shared_p
|
|
|
307
382
|
throw std::runtime_error("Failed to set RSA padding");
|
|
308
383
|
}
|
|
309
384
|
|
|
385
|
+
if (paddingInt == kRsaOaepPadding) {
|
|
386
|
+
const EVP_MD* md = getDigestByName(hashAlgorithm);
|
|
387
|
+
if (EVP_PKEY_CTX_set_rsa_oaep_md(ctx, md) <= 0) {
|
|
388
|
+
EVP_PKEY_CTX_free(ctx);
|
|
389
|
+
throw std::runtime_error("Failed to set OAEP hash algorithm");
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
if (EVP_PKEY_CTX_set_rsa_mgf1_md(ctx, md) <= 0) {
|
|
393
|
+
EVP_PKEY_CTX_free(ctx);
|
|
394
|
+
throw std::runtime_error("Failed to set MGF1 hash algorithm");
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
if (label.has_value() && label.value()->size() > 0) {
|
|
398
|
+
auto native_label = ToNativeArrayBuffer(label.value());
|
|
399
|
+
unsigned char* label_copy = (unsigned char*)OPENSSL_malloc(native_label->size());
|
|
400
|
+
if (!label_copy) {
|
|
401
|
+
EVP_PKEY_CTX_free(ctx);
|
|
402
|
+
throw std::runtime_error("Failed to allocate memory for label");
|
|
403
|
+
}
|
|
404
|
+
std::memcpy(label_copy, native_label->data(), native_label->size());
|
|
405
|
+
|
|
406
|
+
if (EVP_PKEY_CTX_set0_rsa_oaep_label(ctx, label_copy, native_label->size()) <= 0) {
|
|
407
|
+
OPENSSL_free(label_copy);
|
|
408
|
+
EVP_PKEY_CTX_free(ctx);
|
|
409
|
+
throw std::runtime_error("Failed to set OAEP label");
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
|
|
310
414
|
auto native_data = ToNativeArrayBuffer(data);
|
|
311
415
|
const unsigned char* in = native_data->data();
|
|
312
416
|
size_t inlen = native_data->size();
|
|
313
417
|
|
|
314
418
|
size_t outlen;
|
|
315
|
-
if (
|
|
419
|
+
if (EVP_PKEY_decrypt(ctx, nullptr, &outlen, in, inlen) <= 0) {
|
|
316
420
|
EVP_PKEY_CTX_free(ctx);
|
|
317
421
|
unsigned long err = ERR_get_error();
|
|
318
422
|
char err_buf[256];
|
|
@@ -320,32 +424,13 @@ std::shared_ptr<ArrayBuffer> HybridRsaCipher::privateDecrypt(const std::shared_p
|
|
|
320
424
|
throw std::runtime_error("Failed to determine output length: " + std::string(err_buf));
|
|
321
425
|
}
|
|
322
426
|
|
|
323
|
-
if (outlen == 0) {
|
|
324
|
-
EVP_PKEY_CTX_free(ctx);
|
|
325
|
-
uint8_t* empty_buf = new uint8_t[1];
|
|
326
|
-
return std::make_shared<NativeArrayBuffer>(empty_buf, 0, [empty_buf]() { delete[] empty_buf; });
|
|
327
|
-
}
|
|
328
|
-
|
|
329
427
|
auto out_buf = std::make_unique<uint8_t[]>(outlen);
|
|
330
428
|
|
|
331
|
-
if (
|
|
332
|
-
|
|
333
|
-
// In this case outlen is not updated from the initial buffer size
|
|
334
|
-
// Check the error and attempt to handle the empty data case
|
|
429
|
+
if (EVP_PKEY_decrypt(ctx, out_buf.get(), &outlen, in, inlen) <= 0) {
|
|
430
|
+
EVP_PKEY_CTX_free(ctx);
|
|
335
431
|
unsigned long err = ERR_get_error();
|
|
336
432
|
char err_buf[256];
|
|
337
433
|
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
338
|
-
|
|
339
|
-
// Check if this is an RSA library error that might indicate empty recovered data
|
|
340
|
-
// Error code 0x1C880004 is "RSA lib" error from OpenSSL 3.x provider
|
|
341
|
-
if ((err & 0xFFFFFFF) == 0x1C880004 || (err & 0xFF) == 0x04) {
|
|
342
|
-
ERR_clear_error();
|
|
343
|
-
EVP_PKEY_CTX_free(ctx);
|
|
344
|
-
uint8_t* empty_buf = new uint8_t[1];
|
|
345
|
-
return std::make_shared<NativeArrayBuffer>(empty_buf, 0, [empty_buf]() { delete[] empty_buf; });
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
EVP_PKEY_CTX_free(ctx);
|
|
349
434
|
throw std::runtime_error("Private decryption failed: " + std::string(err_buf));
|
|
350
435
|
}
|
|
351
436
|
|
|
@@ -359,6 +444,7 @@ void HybridRsaCipher::loadHybridMethods() {
|
|
|
359
444
|
registerHybrids(this, [](Prototype& prototype) {
|
|
360
445
|
prototype.registerHybridMethod("encrypt", &HybridRsaCipher::encrypt);
|
|
361
446
|
prototype.registerHybridMethod("decrypt", &HybridRsaCipher::decrypt);
|
|
447
|
+
prototype.registerHybridMethod("publicDecrypt", &HybridRsaCipher::publicDecrypt);
|
|
362
448
|
prototype.registerHybridMethod("privateEncrypt", &HybridRsaCipher::privateEncrypt);
|
|
363
449
|
prototype.registerHybridMethod("privateDecrypt", &HybridRsaCipher::privateDecrypt);
|
|
364
450
|
});
|
|
@@ -17,11 +17,15 @@ class HybridRsaCipher : public HybridRsaCipherSpec {
|
|
|
17
17
|
const std::shared_ptr<ArrayBuffer>& data, double padding, const std::string& hashAlgorithm,
|
|
18
18
|
const std::optional<std::shared_ptr<ArrayBuffer>>& label) override;
|
|
19
19
|
|
|
20
|
+
std::shared_ptr<ArrayBuffer> publicDecrypt(const std::shared_ptr<HybridKeyObjectHandleSpec>& keyHandle,
|
|
21
|
+
const std::shared_ptr<ArrayBuffer>& data, double padding) override;
|
|
22
|
+
|
|
20
23
|
std::shared_ptr<ArrayBuffer> privateEncrypt(const std::shared_ptr<HybridKeyObjectHandleSpec>& keyHandle,
|
|
21
24
|
const std::shared_ptr<ArrayBuffer>& data, double padding) override;
|
|
22
25
|
|
|
23
26
|
std::shared_ptr<ArrayBuffer> privateDecrypt(const std::shared_ptr<HybridKeyObjectHandleSpec>& keyHandle,
|
|
24
|
-
const std::shared_ptr<ArrayBuffer>& data, double padding
|
|
27
|
+
const std::shared_ptr<ArrayBuffer>& data, double padding, const std::string& hashAlgorithm,
|
|
28
|
+
const std::optional<std::shared_ptr<ArrayBuffer>>& label) override;
|
|
25
29
|
|
|
26
30
|
void loadHybridMethods() override;
|
|
27
31
|
};
|
package/cpp/hash/HybridHash.cpp
CHANGED
|
@@ -68,14 +68,21 @@ void HybridHash::createHash(const std::string& hashAlgorithmArg, const std::opti
|
|
|
68
68
|
}
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
-
void HybridHash::update(const std::shared_ptr<ArrayBuffer
|
|
71
|
+
void HybridHash::update(const std::variant<std::string, std::shared_ptr<ArrayBuffer>>& data) {
|
|
72
72
|
if (!ctx) {
|
|
73
73
|
throw std::runtime_error("Hash context not initialized");
|
|
74
74
|
}
|
|
75
75
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
76
|
+
if (std::holds_alternative<std::string>(data)) {
|
|
77
|
+
const std::string& str = std::get<std::string>(data);
|
|
78
|
+
if (EVP_DigestUpdate(ctx, reinterpret_cast<const uint8_t*>(str.data()), str.length()) != 1) {
|
|
79
|
+
throw std::runtime_error("Failed to update hash digest: " + std::to_string(ERR_get_error()));
|
|
80
|
+
}
|
|
81
|
+
} else {
|
|
82
|
+
const std::shared_ptr<ArrayBuffer>& buffer = std::get<std::shared_ptr<ArrayBuffer>>(data);
|
|
83
|
+
if (EVP_DigestUpdate(ctx, reinterpret_cast<const uint8_t*>(buffer->data()), buffer->size()) != 1) {
|
|
84
|
+
throw std::runtime_error("Failed to update hash digest: " + std::to_string(ERR_get_error()));
|
|
85
|
+
}
|
|
79
86
|
}
|
|
80
87
|
}
|
|
81
88
|
|
package/cpp/hash/HybridHash.hpp
CHANGED
|
@@ -21,7 +21,7 @@ class HybridHash : public HybridHashSpec {
|
|
|
21
21
|
public:
|
|
22
22
|
// Methods
|
|
23
23
|
void createHash(const std::string& algorithm, const std::optional<double> outputLength) override;
|
|
24
|
-
void update(const std::shared_ptr<ArrayBuffer
|
|
24
|
+
void update(const std::variant<std::string, std::shared_ptr<ArrayBuffer>>& data) override;
|
|
25
25
|
std::shared_ptr<ArrayBuffer> digest(const std::optional<std::string>& encoding = std::nullopt) override;
|
|
26
26
|
std::shared_ptr<margelo::nitro::crypto::HybridHashSpec> copy(const std::optional<double> outputLength) override;
|
|
27
27
|
std::vector<std::string> getSupportedHashAlgorithms() override;
|
package/cpp/hmac/HybridHmac.cpp
CHANGED
|
@@ -60,14 +60,23 @@ void HybridHmac::createHmac(const std::string& hmacAlgorithm, const std::shared_
|
|
|
60
60
|
}
|
|
61
61
|
}
|
|
62
62
|
|
|
63
|
-
void HybridHmac::update(const std::shared_ptr<ArrayBuffer
|
|
63
|
+
void HybridHmac::update(const std::variant<std::string, std::shared_ptr<ArrayBuffer>>& data) {
|
|
64
64
|
if (!ctx) {
|
|
65
65
|
throw std::runtime_error("HMAC context not initialized");
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
68
|
+
if (std::holds_alternative<std::string>(data)) {
|
|
69
|
+
// Handle string: pass UTF-8 bytes directly to OpenSSL
|
|
70
|
+
const std::string& str = std::get<std::string>(data);
|
|
71
|
+
if (EVP_MAC_update(ctx, reinterpret_cast<const uint8_t*>(str.data()), str.length()) != 1) {
|
|
72
|
+
throw std::runtime_error("Failed to update HMAC: " + std::to_string(ERR_get_error()));
|
|
73
|
+
}
|
|
74
|
+
} else {
|
|
75
|
+
// Handle ArrayBuffer
|
|
76
|
+
const std::shared_ptr<ArrayBuffer>& buffer = std::get<std::shared_ptr<ArrayBuffer>>(data);
|
|
77
|
+
if (EVP_MAC_update(ctx, reinterpret_cast<const uint8_t*>(buffer->data()), buffer->size()) != 1) {
|
|
78
|
+
throw std::runtime_error("Failed to update HMAC: " + std::to_string(ERR_get_error()));
|
|
79
|
+
}
|
|
71
80
|
}
|
|
72
81
|
}
|
|
73
82
|
|
package/cpp/hmac/HybridHmac.hpp
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
#include <openssl/evp.h>
|
|
4
4
|
#include <optional>
|
|
5
5
|
#include <string>
|
|
6
|
+
#include <variant>
|
|
6
7
|
#include <vector>
|
|
7
8
|
|
|
8
9
|
#include "HybridHmacSpec.hpp"
|
|
@@ -19,7 +20,7 @@ class HybridHmac : public HybridHmacSpec {
|
|
|
19
20
|
public:
|
|
20
21
|
// Methods
|
|
21
22
|
void createHmac(const std::string& algorithm, const std::shared_ptr<ArrayBuffer>& key) override;
|
|
22
|
-
void update(const std::shared_ptr<ArrayBuffer
|
|
23
|
+
void update(const std::variant<std::string, std::shared_ptr<ArrayBuffer>>& data) override;
|
|
23
24
|
std::shared_ptr<ArrayBuffer> digest() override;
|
|
24
25
|
|
|
25
26
|
private:
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#include "HybridUtils.hpp"
|
|
2
|
+
|
|
3
|
+
#include <openssl/crypto.h>
|
|
4
|
+
#include <stdexcept>
|
|
5
|
+
|
|
6
|
+
namespace margelo::nitro::crypto {
|
|
7
|
+
|
|
8
|
+
bool HybridUtils::timingSafeEqual(const std::shared_ptr<ArrayBuffer>& a, const std::shared_ptr<ArrayBuffer>& b) {
|
|
9
|
+
size_t aLen = a->size();
|
|
10
|
+
size_t bLen = b->size();
|
|
11
|
+
|
|
12
|
+
if (aLen != bLen) {
|
|
13
|
+
throw std::runtime_error("Input buffers must have the same byte length");
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
return CRYPTO_memcmp(a->data(), b->data(), aLen) == 0;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
} // namespace margelo::nitro::crypto
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include "HybridUtilsSpec.hpp"
|
|
4
|
+
|
|
5
|
+
namespace margelo::nitro::crypto {
|
|
6
|
+
|
|
7
|
+
class HybridUtils : public HybridUtilsSpec {
|
|
8
|
+
public:
|
|
9
|
+
HybridUtils() : HybridObject(TAG) {}
|
|
10
|
+
|
|
11
|
+
public:
|
|
12
|
+
bool timingSafeEqual(const std::shared_ptr<ArrayBuffer>& a, const std::shared_ptr<ArrayBuffer>& b) override;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
} // namespace margelo::nitro::crypto
|
package/lib/commonjs/hash.js
CHANGED
|
@@ -59,7 +59,13 @@ class Hash extends _readableStream.Stream.Transform {
|
|
|
59
59
|
update(data, inputEncoding) {
|
|
60
60
|
const defaultEncoding = 'utf8';
|
|
61
61
|
inputEncoding = inputEncoding ?? defaultEncoding;
|
|
62
|
-
|
|
62
|
+
|
|
63
|
+
// OPTIMIZED PATH: Pass UTF-8 strings directly to native without conversion
|
|
64
|
+
if (typeof data === 'string' && inputEncoding === 'utf8') {
|
|
65
|
+
this.native.update(data);
|
|
66
|
+
} else {
|
|
67
|
+
this.native.update((0, _utils.binaryLikeToArrayBuffer)(data, inputEncoding));
|
|
68
|
+
}
|
|
63
69
|
return this; // to support chaining syntax createHash().update().digest()
|
|
64
70
|
}
|
|
65
71
|
|
package/lib/commonjs/hash.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_readableStream","require","_reactNativeNitroModules","_utils","_validation","_errors","_hashnames","HashUtils","native","NitroModules","createHybridObject","getSupportedHashAlgorithms","getHashes","Hash","Stream","Transform","validate","args","algorithm","length","Error","options","outputLength","undefined","constructor","createHash","update","data","inputEncoding","defaultEncoding","binaryLikeToArrayBuffer","digest","encoding","nativeDigest","ab2str","Buffer","from","copy","newOptions","newNativeHash","hash","getOpenSSLVersion","_transform","chunk","callback","_flush","push","asyncDigest","validateMaxBufferLength","name","internalDigest","lazyDOMException","exports","normalizedHashName","normalizeHashName","bufferLikeToArrayBuffer","result","arrayBuffer","ArrayBuffer","view","Uint8Array","set","hashExports"],"sourceRoot":"../../src","sources":["hash.ts"],"mappings":";;;;;;;;;AAAA,IAAAA,eAAA,GAAAC,OAAA;AACA,IAAAC,wBAAA,GAAAD,OAAA;AASA,IAAAE,MAAA,GAAAF,OAAA;AAKA,IAAAG,WAAA,GAAAH,OAAA;AACA,IAAAI,OAAA,GAAAJ,OAAA;AACA,IAAAK,UAAA,GAAAL,OAAA;AAEA,MAAMM,SAAS,CAAC;EACd,OAAeC,MAAM,GAAGC,qCAAY,CAACC,kBAAkB,CAAa,MAAM,CAAC;EAC3E,OAAcC,0BAA0BA,CAAA,EAAa;IACnD,OAAO,IAAI,CAACH,MAAM,CAACG,0BAA0B,CAAC,CAAC;EACjD;AACF;AAEO,SAASC,SAASA,CAAA,EAAG;EAC1B,OAAOL,SAAS,CAACI,0BAA0B,CAAC,CAAC;AAC/C;AAgBA,MAAME,IAAI,SAASC,sBAAM,CAACC,SAAS,CAAC;EAK1BC,QAAQA,CAACC,IAAc,EAAE;IAC/B,IAAI,OAAOA,IAAI,CAACC,SAAS,KAAK,QAAQ,IAAID,IAAI,CAACC,SAAS,CAACC,MAAM,KAAK,CAAC,EACnE,MAAM,IAAIC,KAAK,CAAC,sCAAsC,CAAC;IACzD,IACEH,IAAI,CAACI,OAAO,EAAEC,YAAY,KAAKC,SAAS,IACxCN,IAAI,CAACI,OAAO,CAACC,YAAY,GAAG,CAAC,EAE7B,MAAM,IAAIF,KAAK,CAAC,6CAA6C,CAAC;IAChE,IACEH,IAAI,CAACI,OAAO,EAAEC,YAAY,KAAKC,SAAS,IACxC,OAAON,IAAI,CAACI,OAAO,CAACC,YAAY,KAAK,QAAQ,EAE7C,MAAM,IAAIF,KAAK,CAAC,gCAAgC,CAAC;EACrD;;EAEA;AACF;AACA;EACUI,WAAWA,CAACP,IAAc,EAAE;IAClC,KAAK,CAACA,IAAI,CAACI,OAAO,CAAC;IAEnB,IAAI,CAACL,QAAQ,CAACC,IAAI,CAAC;IAEnB,IAAI,CAACC,SAAS,GAAGD,IAAI,CAACC,SAAS;IAC/B,IAAI,CAACG,OAAO,GAAGJ,IAAI,CAACI,OAAO,IAAI,CAAC,CAAC;IAEjC,IAAIJ,IAAI,CAACT,MAAM,EAAE;MACf,IAAI,CAACA,MAAM,GAAGS,IAAI,CAACT,MAAM;MACzB;IACF;IAEA,IAAI,CAACA,MAAM,GAAGC,qCAAY,CAACC,kBAAkB,CAAa,MAAM,CAAC;IACjE,IAAI,CAACF,MAAM,CAACiB,UAAU,CAAC,IAAI,CAACP,SAAS,EAAE,IAAI,CAACG,OAAO,CAACC,YAAY,CAAC;EACnE;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;EAGEI,MAAMA,CAACC,IAAgB,EAAEC,aAAwB,EAAiB;IAChE,MAAMC,eAAyB,GAAG,MAAM;IACxCD,aAAa,GAAGA,aAAa,IAAIC,eAAe;
|
|
1
|
+
{"version":3,"names":["_readableStream","require","_reactNativeNitroModules","_utils","_validation","_errors","_hashnames","HashUtils","native","NitroModules","createHybridObject","getSupportedHashAlgorithms","getHashes","Hash","Stream","Transform","validate","args","algorithm","length","Error","options","outputLength","undefined","constructor","createHash","update","data","inputEncoding","defaultEncoding","binaryLikeToArrayBuffer","digest","encoding","nativeDigest","ab2str","Buffer","from","copy","newOptions","newNativeHash","hash","getOpenSSLVersion","_transform","chunk","callback","_flush","push","asyncDigest","validateMaxBufferLength","name","internalDigest","lazyDOMException","exports","normalizedHashName","normalizeHashName","bufferLikeToArrayBuffer","result","arrayBuffer","ArrayBuffer","view","Uint8Array","set","hashExports"],"sourceRoot":"../../src","sources":["hash.ts"],"mappings":";;;;;;;;;AAAA,IAAAA,eAAA,GAAAC,OAAA;AACA,IAAAC,wBAAA,GAAAD,OAAA;AASA,IAAAE,MAAA,GAAAF,OAAA;AAKA,IAAAG,WAAA,GAAAH,OAAA;AACA,IAAAI,OAAA,GAAAJ,OAAA;AACA,IAAAK,UAAA,GAAAL,OAAA;AAEA,MAAMM,SAAS,CAAC;EACd,OAAeC,MAAM,GAAGC,qCAAY,CAACC,kBAAkB,CAAa,MAAM,CAAC;EAC3E,OAAcC,0BAA0BA,CAAA,EAAa;IACnD,OAAO,IAAI,CAACH,MAAM,CAACG,0BAA0B,CAAC,CAAC;EACjD;AACF;AAEO,SAASC,SAASA,CAAA,EAAG;EAC1B,OAAOL,SAAS,CAACI,0BAA0B,CAAC,CAAC;AAC/C;AAgBA,MAAME,IAAI,SAASC,sBAAM,CAACC,SAAS,CAAC;EAK1BC,QAAQA,CAACC,IAAc,EAAE;IAC/B,IAAI,OAAOA,IAAI,CAACC,SAAS,KAAK,QAAQ,IAAID,IAAI,CAACC,SAAS,CAACC,MAAM,KAAK,CAAC,EACnE,MAAM,IAAIC,KAAK,CAAC,sCAAsC,CAAC;IACzD,IACEH,IAAI,CAACI,OAAO,EAAEC,YAAY,KAAKC,SAAS,IACxCN,IAAI,CAACI,OAAO,CAACC,YAAY,GAAG,CAAC,EAE7B,MAAM,IAAIF,KAAK,CAAC,6CAA6C,CAAC;IAChE,IACEH,IAAI,CAACI,OAAO,EAAEC,YAAY,KAAKC,SAAS,IACxC,OAAON,IAAI,CAACI,OAAO,CAACC,YAAY,KAAK,QAAQ,EAE7C,MAAM,IAAIF,KAAK,CAAC,gCAAgC,CAAC;EACrD;;EAEA;AACF;AACA;EACUI,WAAWA,CAACP,IAAc,EAAE;IAClC,KAAK,CAACA,IAAI,CAACI,OAAO,CAAC;IAEnB,IAAI,CAACL,QAAQ,CAACC,IAAI,CAAC;IAEnB,IAAI,CAACC,SAAS,GAAGD,IAAI,CAACC,SAAS;IAC/B,IAAI,CAACG,OAAO,GAAGJ,IAAI,CAACI,OAAO,IAAI,CAAC,CAAC;IAEjC,IAAIJ,IAAI,CAACT,MAAM,EAAE;MACf,IAAI,CAACA,MAAM,GAAGS,IAAI,CAACT,MAAM;MACzB;IACF;IAEA,IAAI,CAACA,MAAM,GAAGC,qCAAY,CAACC,kBAAkB,CAAa,MAAM,CAAC;IACjE,IAAI,CAACF,MAAM,CAACiB,UAAU,CAAC,IAAI,CAACP,SAAS,EAAE,IAAI,CAACG,OAAO,CAACC,YAAY,CAAC;EACnE;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;EAGEI,MAAMA,CAACC,IAAgB,EAAEC,aAAwB,EAAiB;IAChE,MAAMC,eAAyB,GAAG,MAAM;IACxCD,aAAa,GAAGA,aAAa,IAAIC,eAAe;;IAEhD;IACA,IAAI,OAAOF,IAAI,KAAK,QAAQ,IAAIC,aAAa,KAAK,MAAM,EAAE;MACxD,IAAI,CAACpB,MAAM,CAACkB,MAAM,CAACC,IAAI,CAAC;IAC1B,CAAC,MAAM;MACL,IAAI,CAACnB,MAAM,CAACkB,MAAM,CAAC,IAAAI,8BAAuB,EAACH,IAAI,EAAEC,aAAa,CAAC,CAAC;IAClE;IAEA,OAAO,IAAI,CAAC,CAAC;EACf;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;EAGEG,MAAMA,CAACC,QAAmB,EAAmB;IAC3C,MAAMC,YAAY,GAAG,IAAI,CAACzB,MAAM,CAACuB,MAAM,CAACC,QAAQ,CAAC;IAEjD,IAAIA,QAAQ,IAAIA,QAAQ,KAAK,QAAQ,EAAE;MACrC,OAAO,IAAAE,aAAM,EAACD,YAAY,EAAED,QAAQ,CAAC;IACvC;IAEA,OAAOG,MAAM,CAACC,IAAI,CAACH,YAAY,CAAC;EAClC;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;EAGEI,IAAIA,CAAChB,OAAqB,EAAQ;IAChC,MAAMiB,UAAU,GAAGjB,OAAO,IAAI,IAAI,CAACA,OAAO;IAC1C,MAAMkB,aAAa,GAAG,IAAI,CAAC/B,MAAM,CAAC6B,IAAI,CAACC,UAAU,CAAChB,YAAY,CAAC;IAC/D,MAAMkB,IAAI,GAAG,IAAI3B,IAAI,CAAC;MACpBK,SAAS,EAAE,IAAI,CAACA,SAAS;MACzBG,OAAO,EAAEiB,UAAU;MACnB9B,MAAM,EAAE+B;IACV,CAAC,CAAC;IACF,OAAOC,IAAI;EACb;;EAEA;AACF;AACA;AACA;EACEC,iBAAiBA,CAAA,EAAW;IAC1B,OAAO,IAAI,CAACjC,MAAM,CAACiC,iBAAiB,CAAC,CAAC;EACxC;;EAEA;EACAC,UAAUA,CACRC,KAAiB,EACjBX,QAAwB,EACxBY,QAAoB,EACpB;IACA,IAAI,CAAClB,MAAM,CAACiB,KAAK,EAAEX,QAAoB,CAAC;IACxCY,QAAQ,CAAC,CAAC;EACZ;EACAC,MAAMA,CAACD,QAAoB,EAAE;IAC3B,IAAI,CAACE,IAAI,CAAC,IAAI,CAACf,MAAM,CAAC,CAAC,CAAC;IACxBa,QAAQ,CAAC,CAAC;EACZ;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASnB,UAAUA,CAACP,SAAiB,EAAEG,OAAqB,EAAQ;EACzE;EACA,OAAO,IAAIR,IAAI,CAAC;IACdK,SAAS;IACTG;EACF,CAAC,CAAC;AACJ;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO,MAAM0B,WAAW,GAAG,MAAAA,CACzB7B,SAA0B,EAC1BS,IAAgB,KACS;EACzB,IAAAqB,mCAAuB,EAACrB,IAAI,EAAE,MAAM,CAAC;EAErC,QAAQT,SAAS,CAAC+B,IAAI;IACpB,KAAK,OAAO;IACZ;IACA,KAAK,SAAS;IACd;IACA,KAAK,SAAS;IACd;IACA,KAAK,SAAS;MACZ,OAAOC,cAAc,CAAChC,SAAS,EAAES,IAAI,CAAC;EAC1C;EAEA,MAAM,IAAAwB,wBAAgB,EACpB,gCAAgCjC,SAAS,CAAC+B,IAAI,EAAE,EAChD,mBACF,CAAC;AACH,CAAC;AAACG,OAAA,CAAAL,WAAA,GAAAA,WAAA;AAEF,MAAMG,cAAc,GAAGA,CACrBhC,SAA0B,EAC1BS,IAAgB,KACA;EAChB,MAAM0B,kBAAkB,GAAG,IAAAC,4BAAiB,EAACpC,SAAS,CAAC+B,IAAI,CAAC;EAC5D,MAAMT,IAAI,GAAGf,UAAU,CAAC4B,kBAAkB,CAAC;EAC3Cb,IAAI,CAACd,MAAM,CAAC,IAAA6B,8BAAuB,EAAC5B,IAAI,CAAC,CAAC;EAC1C,MAAM6B,MAAM,GAAGhB,IAAI,CAACT,MAAM,CAAC,CAAC;EAC5B,MAAM0B,WAAW,GAAG,IAAIC,WAAW,CAACF,MAAM,CAACrC,MAAM,CAAC;EAClD,MAAMwC,IAAI,GAAG,IAAIC,UAAU,CAACH,WAAW,CAAC;EACxCE,IAAI,CAACE,GAAG,CAACL,MAAM,CAAC;EAChB,OAAOC,WAAW;AACpB,CAAC;AAEM,MAAMK,WAAW,GAAAV,OAAA,CAAAU,WAAA,GAAG;EACzBrC,UAAU;EACVb,SAAS;EACTmC;AACF,CAAC","ignoreList":[]}
|
package/lib/commonjs/hmac.js
CHANGED
|
@@ -40,7 +40,13 @@ class Hmac extends _readableStream.Stream.Transform {
|
|
|
40
40
|
update(data, inputEncoding) {
|
|
41
41
|
const defaultEncoding = 'utf8';
|
|
42
42
|
inputEncoding = inputEncoding ?? defaultEncoding;
|
|
43
|
-
|
|
43
|
+
|
|
44
|
+
// Optimize: pass UTF-8 strings directly to C++ without conversion
|
|
45
|
+
if (typeof data === 'string' && inputEncoding === 'utf8') {
|
|
46
|
+
this.native.update(data);
|
|
47
|
+
} else {
|
|
48
|
+
this.native.update((0, _conversion.binaryLikeToArrayBuffer)(data, inputEncoding));
|
|
49
|
+
}
|
|
44
50
|
return this; // to support chaining syntax createHmac().update().digest()
|
|
45
51
|
}
|
|
46
52
|
|
package/lib/commonjs/hmac.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNativeBuffer","require","_readableStream","_reactNativeNitroModules","_conversion","Hmac","Stream","Transform","validate","args","algorithm","length","Error","key","undefined","constructor","options","native","NitroModules","createHybridObject","createHmac","binaryLikeToArrayBuffer","update","data","inputEncoding","defaultEncoding","digest","encoding","nativeDigest","ab2str","Buffer","from","_transform","chunk","callback","_flush","push","hmacExports","exports"],"sourceRoot":"../../src","sources":["hmac.ts"],"mappings":";;;;;;;AAAA,IAAAA,kBAAA,GAAAC,OAAA;AACA,IAAAC,eAAA,GAAAD,OAAA;AACA,IAAAE,wBAAA,GAAAF,OAAA;AAIA,IAAAG,WAAA,GAAAH,OAAA;AAQA,MAAMI,IAAI,SAASC,sBAAM,CAACC,SAAS,CAAC;EAK1BC,QAAQA,CAACC,IAAc,EAAE;IAC/B,IAAI,OAAOA,IAAI,CAACC,SAAS,KAAK,QAAQ,IAAID,IAAI,CAACC,SAAS,CAACC,MAAM,KAAK,CAAC,EACnE,MAAM,IAAIC,KAAK,CAAC,sCAAsC,CAAC;IACzD,IAAIH,IAAI,CAACI,GAAG,KAAK,IAAI,IAAIJ,IAAI,CAACI,GAAG,KAAKC,SAAS,EAC7C,MAAM,IAAIF,KAAK,CAAC,mCAAmC,CAAC;EACxD;;EAEA;AACF;AACA;EACUG,WAAWA,CAACN,IAAc,EAAE;IAClC,KAAK,CAACA,IAAI,CAACO,OAAO,CAAC;IAEnB,IAAI,CAACR,QAAQ,CAACC,IAAI,CAAC;IAEnB,IAAI,CAACC,SAAS,GAAGD,IAAI,CAACC,SAAS;IAC/B,IAAI,CAACG,GAAG,GAAGJ,IAAI,CAACI,GAAG;IAEnB,IAAI,CAACI,MAAM,GAAGC,qCAAY,CAACC,kBAAkB,CAAa,MAAM,CAAC;IACjE,IAAI,CAACF,MAAM,CAACG,UAAU,CAAC,IAAI,CAACV,SAAS,EAAE,IAAAW,mCAAuB,EAAC,IAAI,CAACR,GAAG,CAAC,CAAC;EAC3E;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;EAGES,MAAMA,CAACC,IAAgB,EAAEC,aAAwB,EAAQ;IACvD,MAAMC,eAAyB,GAAG,MAAM;IACxCD,aAAa,GAAGA,aAAa,IAAIC,eAAe;
|
|
1
|
+
{"version":3,"names":["_reactNativeBuffer","require","_readableStream","_reactNativeNitroModules","_conversion","Hmac","Stream","Transform","validate","args","algorithm","length","Error","key","undefined","constructor","options","native","NitroModules","createHybridObject","createHmac","binaryLikeToArrayBuffer","update","data","inputEncoding","defaultEncoding","digest","encoding","nativeDigest","ab2str","Buffer","from","_transform","chunk","callback","_flush","push","hmacExports","exports"],"sourceRoot":"../../src","sources":["hmac.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -21,18 +21,22 @@ function preparePublicCipherKey(key, isEncrypt) {
|
|
|
21
21
|
if (isEncrypt && key.type !== 'public') {
|
|
22
22
|
throw new Error('publicEncrypt requires a public key');
|
|
23
23
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}
|
|
24
|
+
// publicDecrypt accepts both public and private keys (Node.js behavior)
|
|
25
|
+
// A private key contains the public components needed for verify_recover
|
|
27
26
|
keyObj = key;
|
|
28
27
|
} else if ((0, _utils2.isCryptoKey)(key)) {
|
|
29
28
|
const cryptoKey = key;
|
|
30
29
|
keyObj = cryptoKey.keyObject;
|
|
31
30
|
} else if ((0, _utils.isStringOrBuffer)(key)) {
|
|
32
31
|
const data = (0, _utils.binaryLikeToArrayBuffer)(key);
|
|
33
|
-
// Detect if it's PEM format (contains PEM headers) or DER binary
|
|
34
32
|
const isPem = typeof key === 'string' && key.includes('-----BEGIN');
|
|
35
|
-
|
|
33
|
+
const isPrivatePem = typeof key === 'string' && key.includes('-----BEGIN PRIVATE');
|
|
34
|
+
// publicDecrypt accepts both public and private keys (Node.js behavior)
|
|
35
|
+
if (!isEncrypt && isPrivatePem) {
|
|
36
|
+
keyObj = _classes.KeyObject.createKeyObject('private', data, _utils.KFormatType.PEM, _utils.KeyEncoding.PKCS8);
|
|
37
|
+
} else {
|
|
38
|
+
keyObj = _classes.KeyObject.createKeyObject('public', data, isPem ? _utils.KFormatType.PEM : _utils.KFormatType.DER, _utils.KeyEncoding.SPKI);
|
|
39
|
+
}
|
|
36
40
|
} else if (typeof key === 'object' && 'key' in key) {
|
|
37
41
|
const options = key;
|
|
38
42
|
const result = preparePublicCipherKey(options.key, isEncrypt);
|
|
@@ -73,16 +77,13 @@ function publicEncrypt(key, buffer) {
|
|
|
73
77
|
function publicDecrypt(key, buffer) {
|
|
74
78
|
const {
|
|
75
79
|
keyHandle,
|
|
76
|
-
padding
|
|
77
|
-
oaepHash,
|
|
78
|
-
oaepLabel
|
|
80
|
+
padding
|
|
79
81
|
} = preparePublicCipherKey(key, false);
|
|
80
82
|
const rsaCipher = _reactNativeNitroModules.NitroModules.createHybridObject('RsaCipher');
|
|
81
83
|
const data = (0, _utils.binaryLikeToArrayBuffer)(buffer);
|
|
82
|
-
const paddingMode = padding ?? _constants.constants.
|
|
83
|
-
const hashAlgorithm = oaepHash || 'SHA-256';
|
|
84
|
+
const paddingMode = padding ?? _constants.constants.RSA_PKCS1_PADDING;
|
|
84
85
|
try {
|
|
85
|
-
const decrypted = rsaCipher.
|
|
86
|
+
const decrypted = rsaCipher.publicDecrypt(keyHandle.handle, data, paddingMode);
|
|
86
87
|
return Buffer.from(decrypted);
|
|
87
88
|
} catch (error) {
|
|
88
89
|
throw new Error(`publicDecrypt failed: ${error.message}`);
|
|
@@ -91,12 +92,14 @@ function publicDecrypt(key, buffer) {
|
|
|
91
92
|
function preparePrivateCipherKey(key, isEncrypt) {
|
|
92
93
|
let keyObj;
|
|
93
94
|
let padding;
|
|
95
|
+
let oaepHash;
|
|
96
|
+
let oaepLabel;
|
|
94
97
|
if (key instanceof _classes.KeyObject) {
|
|
95
98
|
if (isEncrypt && key.type !== 'private') {
|
|
96
99
|
throw new Error('privateEncrypt requires a private key');
|
|
97
100
|
}
|
|
98
|
-
if (!isEncrypt && key.type !== '
|
|
99
|
-
throw new Error('privateDecrypt requires a
|
|
101
|
+
if (!isEncrypt && key.type !== 'private') {
|
|
102
|
+
throw new Error('privateDecrypt requires a private key');
|
|
100
103
|
}
|
|
101
104
|
keyObj = key;
|
|
102
105
|
} else if ((0, _utils2.isCryptoKey)(key)) {
|
|
@@ -105,18 +108,24 @@ function preparePrivateCipherKey(key, isEncrypt) {
|
|
|
105
108
|
} else if ((0, _utils.isStringOrBuffer)(key)) {
|
|
106
109
|
const data = (0, _utils.binaryLikeToArrayBuffer)(key);
|
|
107
110
|
const isPem = typeof key === 'string' && key.includes('-----BEGIN');
|
|
108
|
-
keyObj = _classes.KeyObject.createKeyObject(
|
|
111
|
+
keyObj = _classes.KeyObject.createKeyObject('private', data, isPem ? _utils.KFormatType.PEM : _utils.KFormatType.DER, _utils.KeyEncoding.PKCS8);
|
|
109
112
|
} else if (typeof key === 'object' && 'key' in key) {
|
|
110
113
|
const options = key;
|
|
111
114
|
const result = preparePrivateCipherKey(options.key, isEncrypt);
|
|
112
115
|
keyObj = result.keyHandle;
|
|
113
116
|
padding = options.padding;
|
|
117
|
+
oaepHash = options.oaepHash;
|
|
118
|
+
if (options.oaepLabel) {
|
|
119
|
+
oaepLabel = (0, _utils.binaryLikeToArrayBuffer)(options.oaepLabel);
|
|
120
|
+
}
|
|
114
121
|
} else {
|
|
115
122
|
throw new Error('Invalid key input');
|
|
116
123
|
}
|
|
117
124
|
return {
|
|
118
125
|
keyHandle: keyObj,
|
|
119
|
-
padding
|
|
126
|
+
padding,
|
|
127
|
+
oaepHash,
|
|
128
|
+
oaepLabel
|
|
120
129
|
};
|
|
121
130
|
}
|
|
122
131
|
function privateEncrypt(key, buffer) {
|
|
@@ -137,13 +146,16 @@ function privateEncrypt(key, buffer) {
|
|
|
137
146
|
function privateDecrypt(key, buffer) {
|
|
138
147
|
const {
|
|
139
148
|
keyHandle,
|
|
140
|
-
padding
|
|
149
|
+
padding,
|
|
150
|
+
oaepHash,
|
|
151
|
+
oaepLabel
|
|
141
152
|
} = preparePrivateCipherKey(key, false);
|
|
142
153
|
const rsaCipher = _reactNativeNitroModules.NitroModules.createHybridObject('RsaCipher');
|
|
143
154
|
const data = (0, _utils.binaryLikeToArrayBuffer)(buffer);
|
|
144
|
-
const paddingMode = padding ?? _constants.constants.
|
|
155
|
+
const paddingMode = padding ?? _constants.constants.RSA_PKCS1_OAEP_PADDING;
|
|
156
|
+
const hashAlgorithm = oaepHash || 'SHA-256';
|
|
145
157
|
try {
|
|
146
|
-
const decrypted = rsaCipher.privateDecrypt(keyHandle.handle, data, paddingMode);
|
|
158
|
+
const decrypted = rsaCipher.privateDecrypt(keyHandle.handle, data, paddingMode, hashAlgorithm, oaepLabel);
|
|
147
159
|
return Buffer.from(decrypted);
|
|
148
160
|
} catch (error) {
|
|
149
161
|
throw new Error(`privateDecrypt failed: ${error.message}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNativeNitroModules","require","_utils","_utils2","_classes","_constants","preparePublicCipherKey","key","isEncrypt","keyObj","padding","oaepHash","oaepLabel","KeyObject","type","Error","isCryptoKey","cryptoKey","keyObject","isStringOrBuffer","data","toAB","isPem","includes","createKeyObject","KFormatType","PEM","
|
|
1
|
+
{"version":3,"names":["_reactNativeNitroModules","require","_utils","_utils2","_classes","_constants","preparePublicCipherKey","key","isEncrypt","keyObj","padding","oaepHash","oaepLabel","KeyObject","type","Error","isCryptoKey","cryptoKey","keyObject","isStringOrBuffer","data","toAB","isPem","includes","isPrivatePem","createKeyObject","KFormatType","PEM","KeyEncoding","PKCS8","DER","SPKI","options","result","keyHandle","publicEncrypt","buffer","rsaCipher","NitroModules","createHybridObject","paddingMode","constants","RSA_PKCS1_OAEP_PADDING","hashAlgorithm","encrypted","encrypt","handle","Buffer","from","error","message","publicDecrypt","RSA_PKCS1_PADDING","decrypted","preparePrivateCipherKey","privateEncrypt","privateDecrypt"],"sourceRoot":"../../../src","sources":["keys/publicCipher.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"../../../src","sources":["specs/utils.nitro.ts"],"mappings":"","ignoreList":[]}
|