react-native-quick-crypto 1.0.9 → 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.
Files changed (170) hide show
  1. package/QuickCrypto.podspec +9 -2
  2. package/README.md +13 -9
  3. package/android/CMakeLists.txt +4 -0
  4. package/cpp/cipher/HybridCipherFactory.hpp +15 -1
  5. package/cpp/cipher/OCBCipher.cpp +4 -4
  6. package/cpp/cipher/XChaCha20Poly1305Cipher.cpp +161 -0
  7. package/cpp/cipher/XChaCha20Poly1305Cipher.hpp +43 -0
  8. package/cpp/cipher/XSalsa20Poly1305Cipher.cpp +145 -0
  9. package/cpp/cipher/XSalsa20Poly1305Cipher.hpp +42 -0
  10. package/cpp/dh/HybridDiffieHellman.cpp +10 -0
  11. package/cpp/dh/HybridDiffieHellman.hpp +1 -0
  12. package/cpp/ec/HybridEcKeyPair.cpp +21 -0
  13. package/cpp/ec/HybridEcKeyPair.hpp +1 -0
  14. package/cpp/hash/HybridHash.cpp +1 -1
  15. package/cpp/hash/HybridHash.hpp +1 -1
  16. package/cpp/hmac/HybridHmac.cpp +1 -1
  17. package/cpp/hmac/HybridHmac.hpp +1 -1
  18. package/cpp/keys/HybridKeyObjectHandle.cpp +112 -1
  19. package/cpp/keys/HybridKeyObjectHandle.hpp +5 -1
  20. package/deps/ncrypto/.bazelrc +0 -1
  21. package/deps/ncrypto/.bazelversion +1 -1
  22. package/deps/ncrypto/.github/workflows/commitlint.yml +16 -0
  23. package/deps/ncrypto/.github/workflows/linter.yml +2 -2
  24. package/deps/ncrypto/.github/workflows/release-please.yml +16 -0
  25. package/deps/ncrypto/.github/workflows/ubuntu.yml +82 -0
  26. package/deps/ncrypto/.release-please-manifest.json +3 -0
  27. package/deps/ncrypto/BUILD.bazel +9 -1
  28. package/deps/ncrypto/CHANGELOG.md +37 -0
  29. package/deps/ncrypto/CMakeLists.txt +35 -11
  30. package/deps/ncrypto/MODULE.bazel +16 -1
  31. package/deps/ncrypto/MODULE.bazel.lock +299 -118
  32. package/deps/ncrypto/cmake/ncrypto-flags.cmake +1 -0
  33. package/deps/ncrypto/include/ncrypto/aead.h +137 -0
  34. package/deps/ncrypto/include/ncrypto/version.h +14 -0
  35. package/deps/ncrypto/include/ncrypto.h +85 -230
  36. package/deps/ncrypto/ncrypto.pc.in +10 -0
  37. package/deps/ncrypto/release-please-config.json +11 -0
  38. package/deps/ncrypto/src/CMakeLists.txt +31 -6
  39. package/deps/ncrypto/src/aead.cpp +302 -0
  40. package/deps/ncrypto/src/ncrypto.cpp +274 -556
  41. package/deps/ncrypto/tests/BUILD.bazel +2 -0
  42. package/deps/ncrypto/tests/basic.cpp +772 -2
  43. package/deps/ncrypto/tools/run-clang-format.sh +5 -5
  44. package/lib/commonjs/diffie-hellman.js +4 -1
  45. package/lib/commonjs/diffie-hellman.js.map +1 -1
  46. package/lib/commonjs/ec.js +20 -25
  47. package/lib/commonjs/ec.js.map +1 -1
  48. package/lib/commonjs/ed.js +1 -2
  49. package/lib/commonjs/ed.js.map +1 -1
  50. package/lib/commonjs/hash.js +7 -0
  51. package/lib/commonjs/hash.js.map +1 -1
  52. package/lib/commonjs/index.js +11 -1
  53. package/lib/commonjs/index.js.map +1 -1
  54. package/lib/commonjs/keys/classes.js +9 -5
  55. package/lib/commonjs/keys/classes.js.map +1 -1
  56. package/lib/commonjs/subtle.js +82 -31
  57. package/lib/commonjs/subtle.js.map +1 -1
  58. package/lib/commonjs/utils/types.js.map +1 -1
  59. package/lib/module/diffie-hellman.js +4 -0
  60. package/lib/module/diffie-hellman.js.map +1 -1
  61. package/lib/module/ec.js +19 -25
  62. package/lib/module/ec.js.map +1 -1
  63. package/lib/module/ed.js +1 -2
  64. package/lib/module/ed.js.map +1 -1
  65. package/lib/module/hash.js +6 -0
  66. package/lib/module/hash.js.map +1 -1
  67. package/lib/module/index.js +3 -0
  68. package/lib/module/index.js.map +1 -1
  69. package/lib/module/keys/classes.js +9 -5
  70. package/lib/module/keys/classes.js.map +1 -1
  71. package/lib/module/subtle.js +83 -32
  72. package/lib/module/subtle.js.map +1 -1
  73. package/lib/module/utils/types.js.map +1 -1
  74. package/lib/tsconfig.tsbuildinfo +1 -1
  75. package/lib/typescript/diffie-hellman.d.ts +2 -0
  76. package/lib/typescript/diffie-hellman.d.ts.map +1 -1
  77. package/lib/typescript/ec.d.ts +1 -0
  78. package/lib/typescript/ec.d.ts.map +1 -1
  79. package/lib/typescript/ed.d.ts.map +1 -1
  80. package/lib/typescript/hash.d.ts +2 -0
  81. package/lib/typescript/hash.d.ts.map +1 -1
  82. package/lib/typescript/index.d.ts +5 -0
  83. package/lib/typescript/index.d.ts.map +1 -1
  84. package/lib/typescript/keys/classes.d.ts +2 -0
  85. package/lib/typescript/keys/classes.d.ts.map +1 -1
  86. package/lib/typescript/specs/diffie-hellman.nitro.d.ts +1 -0
  87. package/lib/typescript/specs/diffie-hellman.nitro.d.ts.map +1 -1
  88. package/lib/typescript/specs/ecKeyPair.nitro.d.ts +1 -0
  89. package/lib/typescript/specs/ecKeyPair.nitro.d.ts.map +1 -1
  90. package/lib/typescript/specs/keyObjectHandle.nitro.d.ts +2 -0
  91. package/lib/typescript/specs/keyObjectHandle.nitro.d.ts.map +1 -1
  92. package/lib/typescript/subtle.d.ts.map +1 -1
  93. package/lib/typescript/utils/types.d.ts +12 -5
  94. package/lib/typescript/utils/types.d.ts.map +1 -1
  95. package/nitrogen/generated/android/QuickCrypto+autolinking.cmake +8 -5
  96. package/nitrogen/generated/android/QuickCrypto+autolinking.gradle +1 -1
  97. package/nitrogen/generated/android/QuickCryptoOnLoad.cpp +54 -54
  98. package/nitrogen/generated/android/QuickCryptoOnLoad.hpp +1 -1
  99. package/nitrogen/generated/android/kotlin/com/margelo/nitro/crypto/QuickCryptoOnLoad.kt +1 -1
  100. package/nitrogen/generated/ios/QuickCrypto+autolinking.rb +2 -2
  101. package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Bridge.cpp +1 -1
  102. package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Bridge.hpp +1 -1
  103. package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Umbrella.hpp +1 -1
  104. package/nitrogen/generated/ios/QuickCryptoAutolinking.mm +54 -54
  105. package/nitrogen/generated/ios/QuickCryptoAutolinking.swift +5 -1
  106. package/nitrogen/generated/shared/c++/AsymmetricKeyType.hpp +1 -1
  107. package/nitrogen/generated/shared/c++/CipherArgs.hpp +34 -19
  108. package/nitrogen/generated/shared/c++/HybridBlake3Spec.cpp +1 -1
  109. package/nitrogen/generated/shared/c++/HybridBlake3Spec.hpp +1 -3
  110. package/nitrogen/generated/shared/c++/HybridCipherFactorySpec.cpp +1 -1
  111. package/nitrogen/generated/shared/c++/HybridCipherFactorySpec.hpp +1 -1
  112. package/nitrogen/generated/shared/c++/HybridCipherSpec.cpp +1 -1
  113. package/nitrogen/generated/shared/c++/HybridCipherSpec.hpp +1 -3
  114. package/nitrogen/generated/shared/c++/HybridDiffieHellmanSpec.cpp +2 -1
  115. package/nitrogen/generated/shared/c++/HybridDiffieHellmanSpec.hpp +3 -3
  116. package/nitrogen/generated/shared/c++/HybridECDHSpec.cpp +1 -1
  117. package/nitrogen/generated/shared/c++/HybridECDHSpec.hpp +2 -3
  118. package/nitrogen/generated/shared/c++/HybridEcKeyPairSpec.cpp +2 -1
  119. package/nitrogen/generated/shared/c++/HybridEcKeyPairSpec.hpp +2 -3
  120. package/nitrogen/generated/shared/c++/HybridEdKeyPairSpec.cpp +1 -1
  121. package/nitrogen/generated/shared/c++/HybridEdKeyPairSpec.hpp +2 -3
  122. package/nitrogen/generated/shared/c++/HybridHashSpec.cpp +1 -1
  123. package/nitrogen/generated/shared/c++/HybridHashSpec.hpp +2 -4
  124. package/nitrogen/generated/shared/c++/HybridHkdfSpec.cpp +1 -1
  125. package/nitrogen/generated/shared/c++/HybridHkdfSpec.hpp +2 -3
  126. package/nitrogen/generated/shared/c++/HybridHmacSpec.cpp +1 -1
  127. package/nitrogen/generated/shared/c++/HybridHmacSpec.hpp +3 -4
  128. package/nitrogen/generated/shared/c++/HybridKeyObjectHandleSpec.cpp +3 -1
  129. package/nitrogen/generated/shared/c++/HybridKeyObjectHandleSpec.hpp +8 -4
  130. package/nitrogen/generated/shared/c++/HybridMlDsaKeyPairSpec.cpp +1 -1
  131. package/nitrogen/generated/shared/c++/HybridMlDsaKeyPairSpec.hpp +2 -3
  132. package/nitrogen/generated/shared/c++/HybridPbkdf2Spec.cpp +1 -1
  133. package/nitrogen/generated/shared/c++/HybridPbkdf2Spec.hpp +2 -3
  134. package/nitrogen/generated/shared/c++/HybridRandomSpec.cpp +1 -1
  135. package/nitrogen/generated/shared/c++/HybridRandomSpec.hpp +2 -3
  136. package/nitrogen/generated/shared/c++/HybridRsaCipherSpec.cpp +1 -1
  137. package/nitrogen/generated/shared/c++/HybridRsaCipherSpec.hpp +1 -3
  138. package/nitrogen/generated/shared/c++/HybridRsaKeyPairSpec.cpp +1 -1
  139. package/nitrogen/generated/shared/c++/HybridRsaKeyPairSpec.hpp +1 -3
  140. package/nitrogen/generated/shared/c++/HybridScryptSpec.cpp +1 -1
  141. package/nitrogen/generated/shared/c++/HybridScryptSpec.hpp +2 -3
  142. package/nitrogen/generated/shared/c++/HybridSignHandleSpec.cpp +1 -1
  143. package/nitrogen/generated/shared/c++/HybridSignHandleSpec.hpp +1 -3
  144. package/nitrogen/generated/shared/c++/HybridUtilsSpec.cpp +1 -1
  145. package/nitrogen/generated/shared/c++/HybridUtilsSpec.hpp +2 -3
  146. package/nitrogen/generated/shared/c++/HybridVerifyHandleSpec.cpp +1 -1
  147. package/nitrogen/generated/shared/c++/HybridVerifyHandleSpec.hpp +1 -3
  148. package/nitrogen/generated/shared/c++/JWK.hpp +84 -68
  149. package/nitrogen/generated/shared/c++/JWKkty.hpp +5 -1
  150. package/nitrogen/generated/shared/c++/JWKuse.hpp +1 -1
  151. package/nitrogen/generated/shared/c++/KFormatType.hpp +1 -1
  152. package/nitrogen/generated/shared/c++/KeyDetail.hpp +39 -23
  153. package/nitrogen/generated/shared/c++/KeyEncoding.hpp +1 -1
  154. package/nitrogen/generated/shared/c++/KeyObject.hpp +21 -5
  155. package/nitrogen/generated/shared/c++/KeyType.hpp +1 -1
  156. package/nitrogen/generated/shared/c++/KeyUsage.hpp +1 -1
  157. package/nitrogen/generated/shared/c++/NamedCurve.hpp +1 -1
  158. package/package.json +1 -1
  159. package/src/diffie-hellman.ts +6 -0
  160. package/src/ec.ts +23 -19
  161. package/src/ed.ts +1 -2
  162. package/src/hash.ts +11 -0
  163. package/src/index.ts +3 -0
  164. package/src/keys/classes.ts +10 -3
  165. package/src/specs/diffie-hellman.nitro.ts +1 -0
  166. package/src/specs/ecKeyPair.nitro.ts +2 -0
  167. package/src/specs/keyObjectHandle.nitro.ts +2 -0
  168. package/src/subtle.ts +131 -32
  169. package/src/utils/types.ts +18 -3
  170. package/deps/ncrypto/WORKSPACE +0 -15
@@ -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::string, std::shared_ptr<ArrayBuffer>>& key,
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::string, std::shared_ptr<ArrayBuffer>>& key, std::optional<KFormatType> format,
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
  }
@@ -1,2 +1 @@
1
- common --enable_workspace
2
1
  build --cxxopt="-std=c++20"
@@ -1 +1 @@
1
- 8.0.0
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@c74383674bf5f7c69f60ce562019c1c94bc1421a # v4.13.0
30
+ uses: jidicula/clang-format-action@6cd220de46c89139a0365edae93eee8eb30ca8fe # v4.16.0
31
31
  with:
32
- clang-format-version: '17'
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
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "1.1.3"
3
+ }
@@ -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
- include(cmake/CPM.cmake)
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
- CPMAddPackage(
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
- # For Windows: Prevent overriding the parent project's compiler/linker settings
36
- set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
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.15.2")
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
+ )