react-native-quick-crypto 1.0.8 → 1.0.10
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 +56 -6
- package/README.md +17 -11
- package/android/CMakeLists.txt +4 -0
- package/android/build.gradle +3 -0
- package/cpp/cipher/HybridCipherFactory.hpp +15 -1
- package/cpp/cipher/OCBCipher.cpp +4 -4
- package/cpp/cipher/XChaCha20Poly1305Cipher.cpp +161 -0
- package/cpp/cipher/XChaCha20Poly1305Cipher.hpp +43 -0
- package/cpp/cipher/XSalsa20Poly1305Cipher.cpp +145 -0
- package/cpp/cipher/XSalsa20Poly1305Cipher.hpp +42 -0
- package/cpp/dh/HybridDiffieHellman.cpp +10 -0
- package/cpp/dh/HybridDiffieHellman.hpp +1 -0
- package/cpp/ec/HybridEcKeyPair.cpp +21 -0
- package/cpp/ec/HybridEcKeyPair.hpp +1 -0
- package/cpp/hash/HybridHash.cpp +1 -1
- package/cpp/hash/HybridHash.hpp +1 -1
- package/cpp/hmac/HybridHmac.cpp +1 -1
- package/cpp/hmac/HybridHmac.hpp +1 -1
- package/cpp/keys/HybridKeyObjectHandle.cpp +112 -1
- package/cpp/keys/HybridKeyObjectHandle.hpp +5 -1
- package/deps/ncrypto/.bazelrc +0 -1
- package/deps/ncrypto/.bazelversion +1 -1
- package/deps/ncrypto/.github/workflows/commitlint.yml +16 -0
- package/deps/ncrypto/.github/workflows/linter.yml +2 -2
- package/deps/ncrypto/.github/workflows/release-please.yml +16 -0
- package/deps/ncrypto/.github/workflows/ubuntu.yml +82 -0
- package/deps/ncrypto/.release-please-manifest.json +3 -0
- package/deps/ncrypto/BUILD.bazel +9 -1
- package/deps/ncrypto/CHANGELOG.md +37 -0
- package/deps/ncrypto/CMakeLists.txt +35 -11
- package/deps/ncrypto/MODULE.bazel +16 -1
- package/deps/ncrypto/MODULE.bazel.lock +299 -118
- package/deps/ncrypto/cmake/ncrypto-flags.cmake +1 -0
- package/deps/ncrypto/include/ncrypto/aead.h +137 -0
- package/deps/ncrypto/include/ncrypto/version.h +14 -0
- package/deps/ncrypto/include/ncrypto.h +85 -230
- package/deps/ncrypto/ncrypto.pc.in +10 -0
- package/deps/ncrypto/release-please-config.json +11 -0
- package/deps/ncrypto/src/CMakeLists.txt +31 -6
- package/deps/ncrypto/src/aead.cpp +302 -0
- package/deps/ncrypto/src/ncrypto.cpp +274 -556
- package/deps/ncrypto/tests/BUILD.bazel +2 -0
- package/deps/ncrypto/tests/basic.cpp +772 -2
- package/deps/ncrypto/tools/run-clang-format.sh +5 -5
- package/lib/commonjs/diffie-hellman.js +4 -1
- package/lib/commonjs/diffie-hellman.js.map +1 -1
- package/lib/commonjs/ec.js +20 -25
- package/lib/commonjs/ec.js.map +1 -1
- package/lib/commonjs/ed.js +1 -2
- package/lib/commonjs/ed.js.map +1 -1
- package/lib/commonjs/hash.js +7 -0
- package/lib/commonjs/hash.js.map +1 -1
- package/lib/commonjs/index.js +24 -2
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/keys/classes.js +9 -5
- package/lib/commonjs/keys/classes.js.map +1 -1
- package/lib/commonjs/subtle.js +82 -31
- package/lib/commonjs/subtle.js.map +1 -1
- package/lib/commonjs/utils/types.js.map +1 -1
- package/lib/module/diffie-hellman.js +4 -0
- package/lib/module/diffie-hellman.js.map +1 -1
- package/lib/module/ec.js +19 -25
- package/lib/module/ec.js.map +1 -1
- package/lib/module/ed.js +1 -2
- package/lib/module/ed.js.map +1 -1
- package/lib/module/hash.js +6 -0
- package/lib/module/hash.js.map +1 -1
- package/lib/module/index.js +10 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/keys/classes.js +9 -5
- package/lib/module/keys/classes.js.map +1 -1
- package/lib/module/subtle.js +83 -32
- package/lib/module/subtle.js.map +1 -1
- package/lib/module/utils/types.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/lib/typescript/diffie-hellman.d.ts +2 -0
- package/lib/typescript/diffie-hellman.d.ts.map +1 -1
- package/lib/typescript/ec.d.ts +1 -0
- package/lib/typescript/ec.d.ts.map +1 -1
- package/lib/typescript/ed.d.ts.map +1 -1
- package/lib/typescript/hash.d.ts +2 -0
- package/lib/typescript/hash.d.ts.map +1 -1
- package/lib/typescript/index.d.ts +7 -0
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/keys/classes.d.ts +2 -0
- package/lib/typescript/keys/classes.d.ts.map +1 -1
- package/lib/typescript/specs/diffie-hellman.nitro.d.ts +1 -0
- package/lib/typescript/specs/diffie-hellman.nitro.d.ts.map +1 -1
- package/lib/typescript/specs/ecKeyPair.nitro.d.ts +1 -0
- package/lib/typescript/specs/ecKeyPair.nitro.d.ts.map +1 -1
- package/lib/typescript/specs/keyObjectHandle.nitro.d.ts +2 -0
- package/lib/typescript/specs/keyObjectHandle.nitro.d.ts.map +1 -1
- package/lib/typescript/subtle.d.ts.map +1 -1
- package/lib/typescript/utils/types.d.ts +12 -5
- package/lib/typescript/utils/types.d.ts.map +1 -1
- package/nitrogen/generated/android/QuickCrypto+autolinking.cmake +8 -5
- package/nitrogen/generated/android/QuickCrypto+autolinking.gradle +1 -1
- package/nitrogen/generated/android/QuickCryptoOnLoad.cpp +54 -54
- package/nitrogen/generated/android/QuickCryptoOnLoad.hpp +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/crypto/QuickCryptoOnLoad.kt +1 -1
- package/nitrogen/generated/ios/QuickCrypto+autolinking.rb +2 -2
- package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Bridge.cpp +1 -1
- package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Bridge.hpp +1 -1
- package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Umbrella.hpp +1 -1
- package/nitrogen/generated/ios/QuickCryptoAutolinking.mm +54 -54
- package/nitrogen/generated/ios/QuickCryptoAutolinking.swift +5 -1
- package/nitrogen/generated/shared/c++/AsymmetricKeyType.hpp +1 -1
- package/nitrogen/generated/shared/c++/CipherArgs.hpp +34 -19
- package/nitrogen/generated/shared/c++/HybridBlake3Spec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridBlake3Spec.hpp +1 -3
- package/nitrogen/generated/shared/c++/HybridCipherFactorySpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridCipherFactorySpec.hpp +1 -1
- package/nitrogen/generated/shared/c++/HybridCipherSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridCipherSpec.hpp +1 -3
- package/nitrogen/generated/shared/c++/HybridDiffieHellmanSpec.cpp +2 -1
- package/nitrogen/generated/shared/c++/HybridDiffieHellmanSpec.hpp +3 -3
- package/nitrogen/generated/shared/c++/HybridECDHSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridECDHSpec.hpp +2 -3
- package/nitrogen/generated/shared/c++/HybridEcKeyPairSpec.cpp +2 -1
- package/nitrogen/generated/shared/c++/HybridEcKeyPairSpec.hpp +2 -3
- package/nitrogen/generated/shared/c++/HybridEdKeyPairSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridEdKeyPairSpec.hpp +2 -3
- package/nitrogen/generated/shared/c++/HybridHashSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridHashSpec.hpp +2 -4
- package/nitrogen/generated/shared/c++/HybridHkdfSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridHkdfSpec.hpp +2 -3
- package/nitrogen/generated/shared/c++/HybridHmacSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridHmacSpec.hpp +3 -4
- package/nitrogen/generated/shared/c++/HybridKeyObjectHandleSpec.cpp +3 -1
- package/nitrogen/generated/shared/c++/HybridKeyObjectHandleSpec.hpp +8 -4
- package/nitrogen/generated/shared/c++/HybridMlDsaKeyPairSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridMlDsaKeyPairSpec.hpp +2 -3
- package/nitrogen/generated/shared/c++/HybridPbkdf2Spec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridPbkdf2Spec.hpp +2 -3
- package/nitrogen/generated/shared/c++/HybridRandomSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridRandomSpec.hpp +2 -3
- package/nitrogen/generated/shared/c++/HybridRsaCipherSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridRsaCipherSpec.hpp +1 -3
- package/nitrogen/generated/shared/c++/HybridRsaKeyPairSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridRsaKeyPairSpec.hpp +1 -3
- package/nitrogen/generated/shared/c++/HybridScryptSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridScryptSpec.hpp +2 -3
- package/nitrogen/generated/shared/c++/HybridSignHandleSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridSignHandleSpec.hpp +1 -3
- package/nitrogen/generated/shared/c++/HybridUtilsSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridUtilsSpec.hpp +2 -3
- package/nitrogen/generated/shared/c++/HybridVerifyHandleSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridVerifyHandleSpec.hpp +1 -3
- package/nitrogen/generated/shared/c++/JWK.hpp +84 -68
- package/nitrogen/generated/shared/c++/JWKkty.hpp +5 -1
- package/nitrogen/generated/shared/c++/JWKuse.hpp +1 -1
- package/nitrogen/generated/shared/c++/KFormatType.hpp +1 -1
- package/nitrogen/generated/shared/c++/KeyDetail.hpp +39 -23
- package/nitrogen/generated/shared/c++/KeyEncoding.hpp +1 -1
- package/nitrogen/generated/shared/c++/KeyObject.hpp +21 -5
- package/nitrogen/generated/shared/c++/KeyType.hpp +1 -1
- package/nitrogen/generated/shared/c++/KeyUsage.hpp +1 -1
- package/nitrogen/generated/shared/c++/NamedCurve.hpp +1 -1
- package/package.json +10 -7
- package/src/diffie-hellman.ts +6 -0
- package/src/ec.ts +23 -19
- package/src/ed.ts +1 -2
- package/src/hash.ts +11 -0
- package/src/index.ts +9 -0
- package/src/keys/classes.ts +10 -3
- package/src/specs/diffie-hellman.nitro.ts +1 -0
- package/src/specs/ecKeyPair.nitro.ts +2 -0
- package/src/specs/keyObjectHandle.nitro.ts +2 -0
- package/src/subtle.ts +131 -32
- package/src/utils/types.ts +18 -3
- package/deps/ncrypto/WORKSPACE +0 -15
|
@@ -30,6 +30,7 @@ class HybridDiffieHellman : public HybridDiffieHellmanSpec {
|
|
|
30
30
|
std::shared_ptr<ArrayBuffer> getPrivateKey() override;
|
|
31
31
|
void setPublicKey(const std::shared_ptr<ArrayBuffer>& publicKey) override;
|
|
32
32
|
void setPrivateKey(const std::shared_ptr<ArrayBuffer>& privateKey) override;
|
|
33
|
+
double getVerifyError() override;
|
|
33
34
|
|
|
34
35
|
private:
|
|
35
36
|
EVP_PKEY_ptr _pkey;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#include <NitroModules/ArrayBuffer.hpp>
|
|
2
2
|
#include <NitroModules/Promise.hpp>
|
|
3
|
+
#include <algorithm>
|
|
3
4
|
#include <memory>
|
|
4
5
|
#include <openssl/bio.h>
|
|
5
6
|
#include <openssl/buffer.h>
|
|
@@ -425,4 +426,24 @@ void HybridEcKeyPair::checkKeyPair() {
|
|
|
425
426
|
}
|
|
426
427
|
}
|
|
427
428
|
|
|
429
|
+
std::vector<std::string> HybridEcKeyPair::getSupportedCurves() {
|
|
430
|
+
const size_t count = EC_get_builtin_curves(nullptr, 0);
|
|
431
|
+
std::vector<EC_builtin_curve> curves(count);
|
|
432
|
+
if (EC_get_builtin_curves(curves.data(), count) != count) {
|
|
433
|
+
throw std::runtime_error("Failed to enumerate EC curves");
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
std::vector<std::string> names;
|
|
437
|
+
names.reserve(count);
|
|
438
|
+
for (const auto& curve : curves) {
|
|
439
|
+
const char* sn = OBJ_nid2sn(curve.nid);
|
|
440
|
+
if (sn != nullptr) {
|
|
441
|
+
names.emplace_back(sn);
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
std::sort(names.begin(), names.end());
|
|
446
|
+
return names;
|
|
447
|
+
}
|
|
448
|
+
|
|
428
449
|
} // namespace margelo::nitro::crypto
|
|
@@ -34,6 +34,7 @@ class HybridEcKeyPair : public HybridEcKeyPairSpec {
|
|
|
34
34
|
std::shared_ptr<ArrayBuffer> sign(const std::shared_ptr<ArrayBuffer>& data, const std::string& hashAlgorithm) override;
|
|
35
35
|
bool verify(const std::shared_ptr<ArrayBuffer>& data, const std::shared_ptr<ArrayBuffer>& signature,
|
|
36
36
|
const std::string& hashAlgorithm) override;
|
|
37
|
+
std::vector<std::string> getSupportedCurves() override;
|
|
37
38
|
|
|
38
39
|
protected:
|
|
39
40
|
void checkKeyPair();
|
package/cpp/hash/HybridHash.cpp
CHANGED
|
@@ -68,7 +68,7 @@ void HybridHash::createHash(const std::string& hashAlgorithmArg, const std::opti
|
|
|
68
68
|
}
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
-
void HybridHash::update(const std::variant<std::
|
|
71
|
+
void HybridHash::update(const std::variant<std::shared_ptr<ArrayBuffer>, std::string>& data) {
|
|
72
72
|
if (!ctx) {
|
|
73
73
|
throw std::runtime_error("Hash context not initialized");
|
|
74
74
|
}
|
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::variant<std::
|
|
24
|
+
void update(const std::variant<std::shared_ptr<ArrayBuffer>, std::string>& 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,7 +60,7 @@ void HybridHmac::createHmac(const std::string& hmacAlgorithm, const std::shared_
|
|
|
60
60
|
}
|
|
61
61
|
}
|
|
62
62
|
|
|
63
|
-
void HybridHmac::update(const std::variant<std::
|
|
63
|
+
void HybridHmac::update(const std::variant<std::shared_ptr<ArrayBuffer>, std::string>& data) {
|
|
64
64
|
if (!ctx) {
|
|
65
65
|
throw std::runtime_error("HMAC context not initialized");
|
|
66
66
|
}
|
package/cpp/hmac/HybridHmac.hpp
CHANGED
|
@@ -20,7 +20,7 @@ class HybridHmac : public HybridHmacSpec {
|
|
|
20
20
|
public:
|
|
21
21
|
// Methods
|
|
22
22
|
void createHmac(const std::string& algorithm, const std::shared_ptr<ArrayBuffer>& key) override;
|
|
23
|
-
void update(const std::variant<std::
|
|
23
|
+
void update(const std::variant<std::shared_ptr<ArrayBuffer>, std::string>& data) override;
|
|
24
24
|
std::shared_ptr<ArrayBuffer> digest() override;
|
|
25
25
|
|
|
26
26
|
private:
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
#include "HybridKeyObjectHandle.hpp"
|
|
6
6
|
#include "QuickCryptoUtils.hpp"
|
|
7
7
|
#include <openssl/bn.h>
|
|
8
|
+
#include <openssl/crypto.h>
|
|
8
9
|
#include <openssl/ec.h>
|
|
9
10
|
#include <openssl/evp.h>
|
|
10
11
|
#include <openssl/obj_mac.h>
|
|
@@ -292,6 +293,44 @@ JWK HybridKeyObjectHandle::exportJwk(const JWK& key, bool handleRsaPss) {
|
|
|
292
293
|
return result;
|
|
293
294
|
}
|
|
294
295
|
|
|
296
|
+
// Export OKP keys (Ed25519, Ed448, X25519, X448) per RFC 8037
|
|
297
|
+
if (keyId == EVP_PKEY_ED25519 || keyId == EVP_PKEY_ED448 || keyId == EVP_PKEY_X25519 || keyId == EVP_PKEY_X448) {
|
|
298
|
+
result.kty = JWKkty::OKP;
|
|
299
|
+
|
|
300
|
+
switch (keyId) {
|
|
301
|
+
case EVP_PKEY_ED25519:
|
|
302
|
+
result.crv = "Ed25519";
|
|
303
|
+
break;
|
|
304
|
+
case EVP_PKEY_ED448:
|
|
305
|
+
result.crv = "Ed448";
|
|
306
|
+
break;
|
|
307
|
+
case EVP_PKEY_X25519:
|
|
308
|
+
result.crv = "X25519";
|
|
309
|
+
break;
|
|
310
|
+
case EVP_PKEY_X448:
|
|
311
|
+
result.crv = "X448";
|
|
312
|
+
break;
|
|
313
|
+
default:
|
|
314
|
+
break;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
auto pubKey = pkey.rawPublicKey();
|
|
318
|
+
if (!pubKey) {
|
|
319
|
+
throw std::runtime_error("Failed to get raw public key for OKP JWK export");
|
|
320
|
+
}
|
|
321
|
+
result.x = base64url_encode(reinterpret_cast<const unsigned char*>(pubKey.get()), pubKey.size());
|
|
322
|
+
|
|
323
|
+
if (keyType == KeyType::PRIVATE) {
|
|
324
|
+
auto privKey = pkey.rawPrivateKey();
|
|
325
|
+
if (!privKey) {
|
|
326
|
+
throw std::runtime_error("Failed to get raw private key for OKP JWK export");
|
|
327
|
+
}
|
|
328
|
+
result.d = base64url_encode(reinterpret_cast<const unsigned char*>(privKey.get()), privKey.size());
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
return result;
|
|
332
|
+
}
|
|
333
|
+
|
|
295
334
|
throw std::runtime_error("Unsupported key type for JWK export");
|
|
296
335
|
}
|
|
297
336
|
|
|
@@ -335,7 +374,7 @@ AsymmetricKeyType HybridKeyObjectHandle::getAsymmetricKeyType() {
|
|
|
335
374
|
}
|
|
336
375
|
}
|
|
337
376
|
|
|
338
|
-
bool HybridKeyObjectHandle::init(KeyType keyType, const std::variant<std::
|
|
377
|
+
bool HybridKeyObjectHandle::init(KeyType keyType, const std::variant<std::shared_ptr<ArrayBuffer>, std::string>& key,
|
|
339
378
|
std::optional<KFormatType> format, std::optional<KeyEncoding> type,
|
|
340
379
|
const std::optional<std::shared_ptr<ArrayBuffer>>& passphrase) {
|
|
341
380
|
// Reset any existing data to prevent state leakage
|
|
@@ -597,6 +636,50 @@ std::optional<KeyType> HybridKeyObjectHandle::initJwk(const JWK& keyData, std::o
|
|
|
597
636
|
return type;
|
|
598
637
|
}
|
|
599
638
|
|
|
639
|
+
// Handle OKP keys (Ed25519, Ed448, X25519, X448) per RFC 8037
|
|
640
|
+
if (kty == JWKkty::OKP) {
|
|
641
|
+
bool isPrivate = keyData.d.has_value();
|
|
642
|
+
|
|
643
|
+
if (!keyData.crv.has_value() || !keyData.x.has_value()) {
|
|
644
|
+
throw std::runtime_error("JWK OKP key missing required fields (crv, x)");
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
std::string crv = keyData.crv.value();
|
|
648
|
+
|
|
649
|
+
int evpType;
|
|
650
|
+
if (crv == "Ed25519") {
|
|
651
|
+
evpType = EVP_PKEY_ED25519;
|
|
652
|
+
} else if (crv == "Ed448") {
|
|
653
|
+
evpType = EVP_PKEY_ED448;
|
|
654
|
+
} else if (crv == "X25519") {
|
|
655
|
+
evpType = EVP_PKEY_X25519;
|
|
656
|
+
} else if (crv == "X448") {
|
|
657
|
+
evpType = EVP_PKEY_X448;
|
|
658
|
+
} else {
|
|
659
|
+
throw std::runtime_error("Unsupported OKP curve: " + crv);
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
if (isPrivate) {
|
|
663
|
+
std::string privBytes = base64url_decode(keyData.d.value());
|
|
664
|
+
EVP_PKEY* pkey =
|
|
665
|
+
EVP_PKEY_new_raw_private_key(evpType, nullptr, reinterpret_cast<const unsigned char*>(privBytes.data()), privBytes.size());
|
|
666
|
+
if (!pkey) {
|
|
667
|
+
throw std::runtime_error("Failed to create OKP private key from JWK");
|
|
668
|
+
}
|
|
669
|
+
data_ = KeyObjectData::CreateAsymmetric(KeyType::PRIVATE, ncrypto::EVPKeyPointer(pkey));
|
|
670
|
+
return KeyType::PRIVATE;
|
|
671
|
+
} else {
|
|
672
|
+
std::string pubBytes = base64url_decode(keyData.x.value());
|
|
673
|
+
EVP_PKEY* pkey =
|
|
674
|
+
EVP_PKEY_new_raw_public_key(evpType, nullptr, reinterpret_cast<const unsigned char*>(pubBytes.data()), pubBytes.size());
|
|
675
|
+
if (!pkey) {
|
|
676
|
+
throw std::runtime_error("Failed to create OKP public key from JWK");
|
|
677
|
+
}
|
|
678
|
+
data_ = KeyObjectData::CreateAsymmetric(KeyType::PUBLIC, ncrypto::EVPKeyPointer(pkey));
|
|
679
|
+
return KeyType::PUBLIC;
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
|
|
600
683
|
throw std::runtime_error("Unsupported JWK key type");
|
|
601
684
|
}
|
|
602
685
|
|
|
@@ -754,4 +837,32 @@ bool HybridKeyObjectHandle::initECRaw(const std::string& namedCurve, const std::
|
|
|
754
837
|
return true;
|
|
755
838
|
}
|
|
756
839
|
|
|
840
|
+
bool HybridKeyObjectHandle::keyEquals(const std::shared_ptr<HybridKeyObjectHandleSpec>& other) {
|
|
841
|
+
auto otherHandle = std::dynamic_pointer_cast<HybridKeyObjectHandle>(other);
|
|
842
|
+
if (!otherHandle)
|
|
843
|
+
return false;
|
|
844
|
+
|
|
845
|
+
const auto& otherData = otherHandle->getKeyObjectData();
|
|
846
|
+
if (data_.GetKeyType() != otherData.GetKeyType())
|
|
847
|
+
return false;
|
|
848
|
+
|
|
849
|
+
if (data_.GetKeyType() == KeyType::SECRET) {
|
|
850
|
+
auto thisKey = data_.GetSymmetricKey();
|
|
851
|
+
auto otherKey = otherData.GetSymmetricKey();
|
|
852
|
+
if (thisKey->size() != otherKey->size())
|
|
853
|
+
return false;
|
|
854
|
+
return CRYPTO_memcmp(thisKey->data(), otherKey->data(), thisKey->size()) == 0;
|
|
855
|
+
}
|
|
856
|
+
|
|
857
|
+
const auto& thisPkey = data_.GetAsymmetricKey();
|
|
858
|
+
const auto& otherPkey = otherData.GetAsymmetricKey();
|
|
859
|
+
if (!thisPkey || !otherPkey)
|
|
860
|
+
return false;
|
|
861
|
+
return EVP_PKEY_eq(thisPkey.get(), otherPkey.get()) == 1;
|
|
862
|
+
}
|
|
863
|
+
|
|
864
|
+
double HybridKeyObjectHandle::getSymmetricKeySize() {
|
|
865
|
+
return static_cast<double>(data_.GetSymmetricKeySize());
|
|
866
|
+
}
|
|
867
|
+
|
|
757
868
|
} // namespace margelo::nitro::crypto
|
|
@@ -26,7 +26,7 @@ class HybridKeyObjectHandle : public HybridKeyObjectHandleSpec {
|
|
|
26
26
|
|
|
27
27
|
AsymmetricKeyType getAsymmetricKeyType() override;
|
|
28
28
|
|
|
29
|
-
bool init(KeyType keyType, const std::variant<std::
|
|
29
|
+
bool init(KeyType keyType, const std::variant<std::shared_ptr<ArrayBuffer>, std::string>& key, std::optional<KFormatType> format,
|
|
30
30
|
std::optional<KeyEncoding> type, const std::optional<std::shared_ptr<ArrayBuffer>>& passphrase) override;
|
|
31
31
|
|
|
32
32
|
bool initECRaw(const std::string& namedCurve, const std::shared_ptr<ArrayBuffer>& keyData) override;
|
|
@@ -35,6 +35,10 @@ class HybridKeyObjectHandle : public HybridKeyObjectHandleSpec {
|
|
|
35
35
|
|
|
36
36
|
KeyDetail keyDetail() override;
|
|
37
37
|
|
|
38
|
+
bool keyEquals(const std::shared_ptr<HybridKeyObjectHandleSpec>& other) override;
|
|
39
|
+
|
|
40
|
+
double getSymmetricKeySize() override;
|
|
41
|
+
|
|
38
42
|
KeyObjectData& getKeyObjectData() {
|
|
39
43
|
return data_;
|
|
40
44
|
}
|
package/deps/ncrypto/.bazelrc
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
9.0.0
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
name: Conventional Commit Linter
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- main
|
|
7
|
+
pull_request:
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
commitlint:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
steps:
|
|
13
|
+
- uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
|
|
14
|
+
with:
|
|
15
|
+
fetch-depth: 100
|
|
16
|
+
- uses: wagoid/commitlint-github-action@b948419dd99f3fd78a6548d48f94e3df7f6bf3ed # v6.2.1
|
|
@@ -27,9 +27,9 @@ jobs:
|
|
|
27
27
|
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
|
|
28
28
|
|
|
29
29
|
- name: Run clang-format
|
|
30
|
-
uses: jidicula/clang-format-action@
|
|
30
|
+
uses: jidicula/clang-format-action@6cd220de46c89139a0365edae93eee8eb30ca8fe # v4.16.0
|
|
31
31
|
with:
|
|
32
|
-
clang-format-version: '
|
|
32
|
+
clang-format-version: '21'
|
|
33
33
|
fallback-style: 'Google'
|
|
34
34
|
|
|
35
35
|
- uses: chartboost/ruff-action@e18ae971ccee1b2d7bbef113930f00c670b78da4 # v1.0.0
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
name: Release Please
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- main
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: write
|
|
10
|
+
pull-requests: write
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
release-please:
|
|
14
|
+
runs-on: ubuntu-latest
|
|
15
|
+
steps:
|
|
16
|
+
- uses: googleapis/release-please-action@16a9c90856f42705d54a6fda1823352bdc62cf38 # v4.4.0
|
|
@@ -44,3 +44,85 @@ jobs:
|
|
|
44
44
|
run: cmake --build build -j=4
|
|
45
45
|
- name: Test
|
|
46
46
|
run: ctest --output-on-failure --test-dir build
|
|
47
|
+
|
|
48
|
+
# Test with OpenSSL 3.2+ to cover Argon2 code path
|
|
49
|
+
openssl:
|
|
50
|
+
runs-on: ubuntu-latest
|
|
51
|
+
env:
|
|
52
|
+
OPENSSL_VERSION: "3.4.1"
|
|
53
|
+
OPENSSL_DIR: "${{ github.workspace }}/openssl-install"
|
|
54
|
+
steps:
|
|
55
|
+
- uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
|
|
56
|
+
- name: Cache OpenSSL
|
|
57
|
+
id: cache-openssl
|
|
58
|
+
uses: actions/cache@v4
|
|
59
|
+
with:
|
|
60
|
+
path: ${{ env.OPENSSL_DIR }}
|
|
61
|
+
key: openssl-${{ env.OPENSSL_VERSION }}-${{ runner.os }}
|
|
62
|
+
- name: Build OpenSSL
|
|
63
|
+
if: steps.cache-openssl.outputs.cache-hit != 'true'
|
|
64
|
+
run: |
|
|
65
|
+
curl -LO https://github.com/openssl/openssl/releases/download/openssl-${OPENSSL_VERSION}/openssl-${OPENSSL_VERSION}.tar.gz
|
|
66
|
+
tar xzf openssl-${OPENSSL_VERSION}.tar.gz
|
|
67
|
+
cd openssl-${OPENSSL_VERSION}
|
|
68
|
+
./Configure --prefix=${OPENSSL_DIR} --openssldir=${OPENSSL_DIR}/ssl
|
|
69
|
+
make -j$(nproc)
|
|
70
|
+
make install_sw
|
|
71
|
+
- name: ccache
|
|
72
|
+
uses: hendrikmuhs/ccache-action@v1.2
|
|
73
|
+
with:
|
|
74
|
+
key: ${{github.job}}-openssl
|
|
75
|
+
- name: Setup dependencies
|
|
76
|
+
run: sudo apt-get update && sudo apt-get install -y ninja-build libgtest-dev
|
|
77
|
+
- name: Prepare
|
|
78
|
+
run: |
|
|
79
|
+
cmake -DNCRYPTO_SHARED_LIBS=ON -G Ninja -B build \
|
|
80
|
+
-DOPENSSL_ROOT_DIR=${OPENSSL_DIR} \
|
|
81
|
+
-DCMAKE_PREFIX_PATH=${OPENSSL_DIR}
|
|
82
|
+
- name: Build
|
|
83
|
+
run: cmake --build build -j=4
|
|
84
|
+
- name: Test
|
|
85
|
+
run: ctest --output-on-failure --test-dir build
|
|
86
|
+
env:
|
|
87
|
+
LD_LIBRARY_PATH: ${{ env.OPENSSL_DIR }}/lib64:${{ env.OPENSSL_DIR }}/lib
|
|
88
|
+
|
|
89
|
+
# Test with OPENSSL_NO_ARGON2 defined (Argon2 tests excluded)
|
|
90
|
+
openssl-no-argon2:
|
|
91
|
+
runs-on: ubuntu-latest
|
|
92
|
+
env:
|
|
93
|
+
OPENSSL_VERSION: "3.4.1"
|
|
94
|
+
OPENSSL_DIR: "${{ github.workspace }}/openssl-install"
|
|
95
|
+
steps:
|
|
96
|
+
- uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
|
|
97
|
+
- name: Cache OpenSSL
|
|
98
|
+
id: cache-openssl
|
|
99
|
+
uses: actions/cache@v4
|
|
100
|
+
with:
|
|
101
|
+
path: ${{ env.OPENSSL_DIR }}
|
|
102
|
+
key: openssl-${{ env.OPENSSL_VERSION }}-${{ runner.os }}
|
|
103
|
+
- name: Build OpenSSL
|
|
104
|
+
if: steps.cache-openssl.outputs.cache-hit != 'true'
|
|
105
|
+
run: |
|
|
106
|
+
curl -LO https://github.com/openssl/openssl/releases/download/openssl-${OPENSSL_VERSION}/openssl-${OPENSSL_VERSION}.tar.gz
|
|
107
|
+
tar xzf openssl-${OPENSSL_VERSION}.tar.gz
|
|
108
|
+
cd openssl-${OPENSSL_VERSION}
|
|
109
|
+
./Configure --prefix=${OPENSSL_DIR} --openssldir=${OPENSSL_DIR}/ssl
|
|
110
|
+
make -j$(nproc)
|
|
111
|
+
make install_sw
|
|
112
|
+
- name: ccache
|
|
113
|
+
uses: hendrikmuhs/ccache-action@v1.2
|
|
114
|
+
with:
|
|
115
|
+
key: ${{github.job}}-openssl-no-argon2
|
|
116
|
+
- name: Setup dependencies
|
|
117
|
+
run: sudo apt-get update && sudo apt-get install -y ninja-build libgtest-dev
|
|
118
|
+
- name: Prepare
|
|
119
|
+
run: |
|
|
120
|
+
cmake -DNCRYPTO_SHARED_LIBS=ON -DCMAKE_CXX_FLAGS="-DOPENSSL_NO_ARGON2" -G Ninja -B build \
|
|
121
|
+
-DOPENSSL_ROOT_DIR=${OPENSSL_DIR} \
|
|
122
|
+
-DCMAKE_PREFIX_PATH=${OPENSSL_DIR}
|
|
123
|
+
- name: Build
|
|
124
|
+
run: cmake --build build -j=4
|
|
125
|
+
- name: Test
|
|
126
|
+
run: ctest --output-on-failure --test-dir build
|
|
127
|
+
env:
|
|
128
|
+
LD_LIBRARY_PATH: ${{ env.OPENSSL_DIR }}/lib64:${{ env.OPENSSL_DIR }}/lib
|
package/deps/ncrypto/BUILD.bazel
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
load("@bazel_skylib//rules:common_settings.bzl", "bool_flag")
|
|
2
|
+
load("@rules_cc//cc:cc_library.bzl", "cc_library")
|
|
2
3
|
|
|
3
4
|
bool_flag(
|
|
4
5
|
name = "bssl_libdecrepit_missing",
|
|
@@ -15,7 +16,14 @@ config_setting(
|
|
|
15
16
|
cc_library(
|
|
16
17
|
name = "ncrypto",
|
|
17
18
|
srcs = glob(["src/*.cpp"]),
|
|
18
|
-
hdrs = glob(["include/*.h"]),
|
|
19
|
+
hdrs = glob(["include/*.h", "include/ncrypto/*.h"]),
|
|
20
|
+
copts = [
|
|
21
|
+
"-Werror",
|
|
22
|
+
"-Wextra",
|
|
23
|
+
"-Wno-unused-parameter",
|
|
24
|
+
"-Wimplicit-fallthrough",
|
|
25
|
+
"-Wno-deprecated-declarations", # OpenSSL 3.0 deprecates many APIs we intentionally use
|
|
26
|
+
],
|
|
19
27
|
includes = ["include"],
|
|
20
28
|
local_defines = {
|
|
21
29
|
"NCRYPTO_BSSL_LIBDECREPIT_MISSING": select(
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## [1.1.3](https://github.com/nodejs/ncrypto/compare/v1.1.2...v1.1.3) (2026-02-04)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* unconditionally include vector ([ba39e40](https://github.com/nodejs/ncrypto/commit/ba39e40ed1c1231902a676f53906cdd2f6119648))
|
|
9
|
+
* use more strict compiler flags ([fc401e3](https://github.com/nodejs/ncrypto/commit/fc401e387491005bfbe6c48b7296862d07ea85d7))
|
|
10
|
+
|
|
11
|
+
## [1.1.2](https://github.com/nodejs/ncrypto/compare/v1.1.1...v1.1.2) (2026-02-02)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
### Bug Fixes
|
|
15
|
+
|
|
16
|
+
* handle edge cases and CI builds ([57cae0f](https://github.com/nodejs/ncrypto/commit/57cae0f055ba7c2d060f0ed4e49431e9e56a0a2d))
|
|
17
|
+
|
|
18
|
+
## [1.1.1](https://github.com/nodejs/ncrypto/compare/v1.1.0...v1.1.1) (2026-02-02)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
### Bug Fixes
|
|
22
|
+
|
|
23
|
+
* re-add more functions that are moved ([2ceab38](https://github.com/nodejs/ncrypto/commit/2ceab38e9caafd49b2f0a722ad76ae68f68fe7b5))
|
|
24
|
+
* re-add removed BignumPointer::bitLength() ([0ba85e3](https://github.com/nodejs/ncrypto/commit/0ba85e3c3a3cdd8abcab066b046bbb11c9136bc8))
|
|
25
|
+
|
|
26
|
+
## [1.1.0](https://github.com/nodejs/ncrypto/compare/1.0.1...v1.1.0) (2026-01-31)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
### Features
|
|
30
|
+
|
|
31
|
+
* sync source code with nodejs/node ([#17](https://github.com/nodejs/ncrypto/issues/17)) ([47c21db](https://github.com/nodejs/ncrypto/commit/47c21db34df5f00eab945e2cd4e3ca6d9d57c793))
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
### Bug Fixes
|
|
35
|
+
|
|
36
|
+
* add missing header files during install ([#27](https://github.com/nodejs/ncrypto/issues/27)) ([d714e74](https://github.com/nodejs/ncrypto/commit/d714e745cd54b5f06686e2def826da101ebb2205))
|
|
37
|
+
* use BN_GENCB_get_arg accessor for OpenSSL 3.x compatibility ([#16](https://github.com/nodejs/ncrypto/issues/16)) ([afc7e12](https://github.com/nodejs/ncrypto/commit/afc7e12c3f862165d7cfdc10bd971d7115d4fdb5))
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
cmake_minimum_required(VERSION 3.28)
|
|
2
|
-
project(ncrypto)
|
|
2
|
+
project(ncrypto VERSION 1.1.3) # x-release-please-version
|
|
3
3
|
|
|
4
4
|
include(CTest)
|
|
5
5
|
include(GNUInstallDirs)
|
|
6
|
-
include(FetchContent)
|
|
7
6
|
include(cmake/ncrypto-flags.cmake)
|
|
8
7
|
|
|
9
8
|
if (NOT CMAKE_BUILD_TYPE)
|
|
@@ -11,29 +10,37 @@ if (NOT CMAKE_BUILD_TYPE)
|
|
|
11
10
|
set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build." FORCE)
|
|
12
11
|
endif()
|
|
13
12
|
|
|
14
|
-
|
|
13
|
+
if (NCRYPTO_SHARED_LIBS)
|
|
14
|
+
find_package(OpenSSL REQUIRED)
|
|
15
|
+
else()
|
|
16
|
+
include(FetchContent)
|
|
17
|
+
include(cmake/CPM.cmake)
|
|
15
18
|
|
|
16
|
-
CPMAddPackage(
|
|
19
|
+
CPMAddPackage(
|
|
17
20
|
NAME boringssl
|
|
18
21
|
VERSION 0.20250818.0
|
|
19
22
|
GITHUB_REPOSITORY google/boringssl
|
|
20
23
|
GIT_TAG 0.20250818.0
|
|
21
24
|
OPTIONS "BUILD_SHARED_LIBS OFF" "BUILD_TESTING OFF"
|
|
22
|
-
)
|
|
25
|
+
)
|
|
26
|
+
endif()
|
|
27
|
+
|
|
23
28
|
add_subdirectory(src)
|
|
24
29
|
add_library(ncrypto::ncrypto ALIAS ncrypto)
|
|
25
30
|
|
|
26
|
-
include_directories(${boringssl_SOURCE_DIR}/include)
|
|
27
|
-
|
|
28
31
|
if (NCRYPTO_TESTING)
|
|
29
|
-
|
|
32
|
+
if (NCRYPTO_SHARED_LIBS)
|
|
33
|
+
find_package(GTest REQUIRED)
|
|
34
|
+
else()
|
|
35
|
+
CPMAddPackage(
|
|
30
36
|
NAME GTest
|
|
31
37
|
GITHUB_REPOSITORY google/googletest
|
|
32
38
|
VERSION 1.15.2
|
|
33
39
|
OPTIONS "BUILD_GMOCK OFF" "INSTALL_GTEST OFF"
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
40
|
+
)
|
|
41
|
+
# For Windows: Prevent overriding the parent project's compiler/linker settings
|
|
42
|
+
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
|
|
43
|
+
endif()
|
|
37
44
|
enable_testing()
|
|
38
45
|
add_subdirectory(tests)
|
|
39
46
|
endif()
|
|
@@ -43,6 +50,11 @@ install(
|
|
|
43
50
|
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
|
|
44
51
|
COMPONENT ncrypto_development
|
|
45
52
|
)
|
|
53
|
+
install(
|
|
54
|
+
DIRECTORY include/ncrypto
|
|
55
|
+
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
|
|
56
|
+
COMPONENT ncrypto_development
|
|
57
|
+
)
|
|
46
58
|
|
|
47
59
|
install(
|
|
48
60
|
TARGETS ncrypto
|
|
@@ -53,3 +65,15 @@ install(
|
|
|
53
65
|
ARCHIVE COMPONENT ncrypto_development
|
|
54
66
|
INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
|
|
55
67
|
)
|
|
68
|
+
|
|
69
|
+
# Generate pkg-config file
|
|
70
|
+
configure_file(
|
|
71
|
+
${CMAKE_CURRENT_SOURCE_DIR}/ncrypto.pc.in
|
|
72
|
+
${CMAKE_CURRENT_BINARY_DIR}/ncrypto.pc
|
|
73
|
+
@ONLY
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
install(
|
|
77
|
+
FILES ${CMAKE_CURRENT_BINARY_DIR}/ncrypto.pc
|
|
78
|
+
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig
|
|
79
|
+
)
|
|
@@ -1 +1,16 @@
|
|
|
1
|
-
bazel_dep(name = "googletest", version = "1.
|
|
1
|
+
bazel_dep(name = "googletest", version = "1.17.0.bcr.2")
|
|
2
|
+
bazel_dep(name = "bazel_skylib", version = "1.9.0")
|
|
3
|
+
bazel_dep(name = "boringssl", version = "0.20251002.0", repo_name = "ssl")
|
|
4
|
+
bazel_dep(name = "rules_cc", version = "0.2.16")
|
|
5
|
+
|
|
6
|
+
archive_override(
|
|
7
|
+
module_name = "boringssl",
|
|
8
|
+
patch_strip = 1,
|
|
9
|
+
patches = [
|
|
10
|
+
"//:patches/0001-Expose-libdecrepit-so-NodeJS-can-use-it-for-ncrypto.patch",
|
|
11
|
+
],
|
|
12
|
+
sha256 = "f96733fc3df03d4195db656d1b7b8c174c33f95d052f811f0ecc8f4e4e3db332",
|
|
13
|
+
strip_prefix = "boringssl-0.20251002.0",
|
|
14
|
+
type = "tgz",
|
|
15
|
+
urls = ["https://github.com/google/boringssl/archive/refs/tags/0.20251002.0.tar.gz"],
|
|
16
|
+
)
|