Skip to content

Commit 5c887b6

Browse files
chore: sync ncrypto from Node.js v26.2.0 (#47)
Co-authored-by: Filip Skokan <panva.ip@gmail.com>
1 parent 2ee0b88 commit 5c887b6

7 files changed

Lines changed: 324 additions & 123 deletions

File tree

.github/sync-node-ncrypto.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
{
2-
"node_commit": "e7da6f056ac4afeaaf012042188818ca7736f437"
2+
"node_commit": "cfd7920d5a2d84905c4292362d01d07870047e93"
33
}

.github/workflows/ubuntu.yml

Lines changed: 37 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -45,52 +45,42 @@ jobs:
4545
- name: Test
4646
run: ctest --output-on-failure --test-dir build
4747

48-
# Test with OpenSSL 3.2+ to cover Argon2 code path
48+
# Test with OpenSSL release lines
4949
openssl:
50+
strategy:
51+
fail-fast: false
52+
matrix:
53+
include:
54+
- name: "1.1.1"
55+
cache_key: "1.1.1"
56+
version: "1.1.1w"
57+
tag: "OpenSSL_1_1_1w"
58+
cxx_flags: ""
59+
- name: "3.0"
60+
cache_key: "3.0"
61+
version: "3.0.20"
62+
tag: "openssl-3.0.20"
63+
cxx_flags: ""
64+
- name: "3.5 LTS"
65+
cache_key: "3.5-lts"
66+
version: "3.5.6"
67+
tag: "openssl-3.5.6"
68+
cxx_flags: ""
69+
- name: "3.5 LTS, no Argon2"
70+
cache_key: "3.5-lts-no-argon2"
71+
version: "3.5.6"
72+
tag: "openssl-3.5.6"
73+
cxx_flags: "-DOPENSSL_NO_ARGON2"
74+
- name: "4.0"
75+
cache_key: "4.0"
76+
version: "4.0.0"
77+
tag: "openssl-4.0.0"
78+
cxx_flags: ""
79+
name: OpenSSL ${{ matrix.name }}
5080
runs-on: ubuntu-latest
5181
env:
52-
OPENSSL_VERSION: "3.4.1"
53-
OPENSSL_DIR: "${{ github.workspace }}/openssl-install"
54-
steps:
55-
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
56-
- name: Cache OpenSSL
57-
id: cache-openssl
58-
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
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@d62db5f07c26379fc4b4e0916f098a92573c3b03 # v1.2.23
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"
82+
OPENSSL_VERSION: ${{ matrix.version }}
83+
OPENSSL_TAG: ${{ matrix.tag }}
9484
OPENSSL_DIR: "${{ github.workspace }}/openssl-install"
9585
steps:
9686
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
@@ -103,21 +93,21 @@ jobs:
10393
- name: Build OpenSSL
10494
if: steps.cache-openssl.outputs.cache-hit != 'true'
10595
run: |
106-
curl -LO https://github.com/openssl/openssl/releases/download/openssl-${OPENSSL_VERSION}/openssl-${OPENSSL_VERSION}.tar.gz
96+
curl -LO https://github.com/openssl/openssl/releases/download/${OPENSSL_TAG}/openssl-${OPENSSL_VERSION}.tar.gz
10797
tar xzf openssl-${OPENSSL_VERSION}.tar.gz
10898
cd openssl-${OPENSSL_VERSION}
109-
./Configure --prefix=${OPENSSL_DIR} --openssldir=${OPENSSL_DIR}/ssl
99+
./config --prefix=${OPENSSL_DIR} --openssldir=${OPENSSL_DIR}/ssl
110100
make -j$(nproc)
111101
make install_sw
112102
- name: ccache
113103
uses: hendrikmuhs/ccache-action@d62db5f07c26379fc4b4e0916f098a92573c3b03 # v1.2.23
114104
with:
115-
key: ${{github.job}}-openssl-no-argon2
105+
key: ${{github.job}}-openssl-${{ matrix.cache_key }}
116106
- name: Setup dependencies
117107
run: sudo apt-get update && sudo apt-get install -y ninja-build libgtest-dev
118108
- name: Prepare
119109
run: |
120-
cmake -DNCRYPTO_SHARED_LIBS=ON -DCMAKE_CXX_FLAGS="-DOPENSSL_NO_ARGON2" -G Ninja -B build \
110+
cmake -DNCRYPTO_SHARED_LIBS=ON -DCMAKE_CXX_FLAGS="${{ matrix.cxx_flags }}" -G Ninja -B build \
121111
-DOPENSSL_ROOT_DIR=${OPENSSL_DIR} \
122112
-DCMAKE_PREFIX_PATH=${OPENSSL_DIR}
123113
- name: Build

CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ else()
1818

1919
CPMAddPackage(
2020
NAME boringssl
21-
VERSION 0.20250818.0
21+
VERSION 0.20260508.0
2222
GITHUB_REPOSITORY google/boringssl
23-
GIT_TAG 0.20250818.0
23+
GIT_TAG 0.20260508.0
2424
OPTIONS "BUILD_SHARED_LIBS OFF" "BUILD_TESTING OFF"
2525
)
2626
endif()

MODULE.bazel

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
bazel_dep(name = "googletest", version = "1.17.0.bcr.2")
22
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")
3+
bazel_dep(name = "boringssl", version = "0.20260508.0", repo_name = "ssl")
4+
bazel_dep(name = "rules_cc", version = "0.2.17")
55

66
archive_override(
77
module_name = "boringssl",
88
patch_strip = 1,
99
patches = [
1010
"//:patches/0001-Expose-libdecrepit-so-NodeJS-can-use-it-for-ncrypto.patch",
1111
],
12-
sha256 = "f96733fc3df03d4195db656d1b7b8c174c33f95d052f811f0ecc8f4e4e3db332",
13-
strip_prefix = "boringssl-0.20251002.0",
12+
sha256 = "de3371d3fe085afd34778a4c988fb7840b9c92cb21504e674f33ebefd98edc00",
13+
strip_prefix = "boringssl-0.20260508.0",
1414
type = "tgz",
15-
urls = ["https://github.com/google/boringssl/archive/refs/tags/0.20251002.0.tar.gz"],
15+
urls = ["https://github.com/google/boringssl/archive/refs/tags/0.20260508.0.tar.gz"],
1616
)

MODULE.bazel.lock

Lines changed: 26 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

include/ncrypto.h

Lines changed: 92 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -32,22 +32,103 @@
3232
#ifndef OPENSSL_NO_ENGINE
3333
#include <openssl/engine.h>
3434
#endif // !OPENSSL_NO_ENGINE
35+
36+
#ifndef OPENSSL_VERSION_PREREQ
37+
#define OPENSSL_VERSION_PREREQ(maj, min) \
38+
(OPENSSL_VERSION_NUMBER >= (((maj) << 28) | ((min) << 20)))
39+
#endif
40+
41+
// BoringSSL declares the EVP_*_do_all* APIs, but their implementation may
42+
// live in libdecrepit. This matches standalone ncrypto's build flag.
43+
#ifndef NCRYPTO_BSSL_LIBDECREPIT_MISSING
44+
#define NCRYPTO_BSSL_LIBDECREPIT_MISSING 0
45+
#endif
46+
47+
#if defined(OPENSSL_IS_BORINGSSL) && NCRYPTO_BSSL_LIBDECREPIT_MISSING
48+
#define NCRYPTO_USE_BORINGSSL_EVP_DO_ALL_FALLBACK 1
49+
#else
50+
#define NCRYPTO_USE_BORINGSSL_EVP_DO_ALL_FALLBACK 0
51+
#endif
52+
3553
// The FIPS-related functions are only available
3654
// when the OpenSSL itself was compiled with FIPS support.
37-
#if defined(OPENSSL_FIPS) && OPENSSL_VERSION_MAJOR < 3
55+
#if defined(OPENSSL_FIPS) && !OPENSSL_VERSION_PREREQ(3, 0)
3856
#include <openssl/fips.h>
3957
#endif // OPENSSL_FIPS
4058

41-
// Define OPENSSL_WITH_PQC for post-quantum cryptography support
42-
#if OPENSSL_VERSION_NUMBER >= 0x30500000L
43-
#define OPENSSL_WITH_PQC 1
59+
#if OPENSSL_VERSION_PREREQ(3, 0)
60+
#define OPENSSL_WITH_AES_OCB 1
61+
#else
62+
#define OPENSSL_WITH_AES_OCB 0
63+
#endif
64+
65+
#if !defined(OPENSSL_NO_ARGON2) && OPENSSL_VERSION_PREREQ(3, 2)
66+
#define OPENSSL_WITH_ARGON2 1
67+
#else
68+
#define OPENSSL_WITH_ARGON2 0
69+
#endif
70+
71+
#if OPENSSL_VERSION_PREREQ(3, 0) || defined(OPENSSL_IS_BORINGSSL)
72+
#define OPENSSL_WITH_KEM 1
73+
#else
74+
#define OPENSSL_WITH_KEM 0
75+
#endif
76+
77+
#if OPENSSL_VERSION_PREREQ(3, 0)
78+
#define OPENSSL_WITH_KMAC 1
79+
#else
80+
#define OPENSSL_WITH_KMAC 0
81+
#endif
82+
83+
#if defined(OPENSSL_IS_BORINGSSL) || OPENSSL_VERSION_PREREQ(3, 2)
84+
#define OPENSSL_WITH_SIGNATURE_CONTEXT_STRING 1
85+
#else
86+
#define OPENSSL_WITH_SIGNATURE_CONTEXT_STRING 0
87+
#endif
88+
89+
#if !defined(OPENSSL_IS_BORINGSSL) && OPENSSL_VERSION_PREREQ(3, 2)
90+
#define OPENSSL_WITH_OPENSSL_DHKEM 1
91+
#else
92+
#define OPENSSL_WITH_OPENSSL_DHKEM 0
93+
#endif
94+
95+
#if OPENSSL_WITH_KEM && !defined(OPENSSL_IS_BORINGSSL) && \
96+
!OPENSSL_VERSION_PREREQ(3, 5)
97+
#define OPENSSL_WITH_KEM_OPERATION_PARAM 1
98+
#else
99+
#define OPENSSL_WITH_KEM_OPERATION_PARAM 0
100+
#endif
101+
102+
// Post-quantum cryptography support. Keep these explicit so code can
103+
// distinguish provider API shape from the available algorithm set.
104+
#if !defined(OPENSSL_IS_BORINGSSL) && OPENSSL_VERSION_PREREQ(3, 5)
105+
#define OPENSSL_WITH_OPENSSL_PQC 1
106+
#else
107+
#define OPENSSL_WITH_OPENSSL_PQC 0
108+
#endif
109+
110+
#ifdef OPENSSL_IS_BORINGSSL
111+
#define OPENSSL_WITH_BORINGSSL_PQC 1
112+
#else
113+
#define OPENSSL_WITH_BORINGSSL_PQC 0
114+
#endif
115+
116+
#define OPENSSL_WITH_PQC \
117+
(OPENSSL_WITH_OPENSSL_PQC || OPENSSL_WITH_BORINGSSL_PQC)
118+
#define OPENSSL_WITH_PQC_ML_KEM_512 OPENSSL_WITH_OPENSSL_PQC
119+
#define OPENSSL_WITH_PQC_SLH_DSA OPENSSL_WITH_OPENSSL_PQC
120+
121+
#if OPENSSL_WITH_OPENSSL_PQC
44122
#define EVP_PKEY_ML_KEM_512 NID_ML_KEM_512
45123
#define EVP_PKEY_ML_KEM_768 NID_ML_KEM_768
46124
#define EVP_PKEY_ML_KEM_1024 NID_ML_KEM_1024
47125
#include <openssl/core_names.h>
126+
#elif OPENSSL_WITH_BORINGSSL_PQC
127+
#define EVP_PKEY_ML_KEM_768 NID_ML_KEM_768
128+
#define EVP_PKEY_ML_KEM_1024 NID_ML_KEM_1024
48129
#endif
49130

50-
#if OPENSSL_VERSION_MAJOR >= 3
131+
#if OPENSSL_VERSION_PREREQ(3, 0)
51132
#define OSSL3_CONST const
52133
#else
53134
#define OSSL3_CONST
@@ -1515,7 +1596,7 @@ class HMACCtxPointer final {
15151596
DeleteFnPtr<HMAC_CTX, HMAC_CTX_free> ctx_;
15161597
};
15171598

1518-
#if OPENSSL_VERSION_MAJOR >= 3
1599+
#if OPENSSL_WITH_KMAC
15191600
class EVPMacPointer final {
15201601
public:
15211602
EVPMacPointer() = default;
@@ -1563,7 +1644,7 @@ class EVPMacCtxPointer final {
15631644
private:
15641645
DeleteFnPtr<EVP_MAC_CTX, EVP_MAC_CTX_free> ctx_;
15651646
};
1566-
#endif // OPENSSL_VERSION_MAJOR >= 3
1647+
#endif // OPENSSL_WITH_KMAC
15671648

15681649
#ifndef OPENSSL_NO_ENGINE
15691650
class EnginePointer final {
@@ -1703,8 +1784,7 @@ DataPointer pbkdf2(const Digest& md,
17031784
uint32_t iterations,
17041785
size_t length);
17051786

1706-
#if OPENSSL_VERSION_NUMBER >= 0x30200000L
1707-
#ifndef OPENSSL_NO_ARGON2
1787+
#if OPENSSL_WITH_ARGON2
17081788
enum class Argon2Type { ARGON2D, ARGON2I, ARGON2ID };
17091789

17101790
DataPointer argon2(const Buffer<const char>& pass,
@@ -1718,11 +1798,10 @@ DataPointer argon2(const Buffer<const char>& pass,
17181798
const Buffer<const unsigned char>& ad,
17191799
Argon2Type type);
17201800
#endif
1721-
#endif
17221801

17231802
// ============================================================================
17241803
// KEM (Key Encapsulation Mechanism)
1725-
#if OPENSSL_VERSION_MAJOR >= 3
1804+
#if OPENSSL_WITH_KEM
17261805

17271806
class KEM final {
17281807
public:
@@ -1746,13 +1825,13 @@ class KEM final {
17461825
const Buffer<const void>& ciphertext);
17471826

17481827
private:
1749-
#if !OPENSSL_VERSION_PREREQ(3, 5)
1828+
#if OPENSSL_WITH_KEM_OPERATION_PARAM
17501829
static bool SetOperationParameter(EVP_PKEY_CTX* ctx,
17511830
const EVPKeyPointer& key);
17521831
#endif
17531832
};
17541833

1755-
#endif // OPENSSL_VERSION_MAJOR >= 3
1834+
#endif // OPENSSL_WITH_KEM
17561835

17571836
#include "ncrypto/version.h"
17581837

0 commit comments

Comments
 (0)