-
Notifications
You must be signed in to change notification settings - Fork 5k
deps: upgrade BoringSSL to upstream 606d3a344 #32521
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,100 @@ | ||
| --- | ||
| description: Upgrade Bun's BoringSSL fork (oven-sh/boringssl) to the latest upstream google/boringssl | ||
| --- | ||
|
|
||
| Bun pins BoringSSL by **commit SHA** in `scripts/build/deps/boringssl.ts` (`BORINGSSL_COMMIT`). The build downloads a tarball from `oven-sh/boringssl` at that SHA — there is no submodule and `vendor/boringssl/` is git-ignored. | ||
|
|
||
| The fork carries a small patch set on top of upstream (see "Preserved patches" below). Upgrading means: merge `google/boringssl` into `oven-sh/boringssl@master`, push, then bump the SHA + regenerate source lists in Bun. | ||
|
|
||
| ## Steps | ||
|
|
||
| ### 1. Clone the fork and merge upstream | ||
|
|
||
| ```sh | ||
| git clone https://github.com/oven-sh/boringssl.git /tmp/boringssl | ||
| cd /tmp/boringssl | ||
| git remote add upstream https://github.com/google/boringssl.git | ||
| git fetch upstream | ||
| git log --oneline $(git merge-base HEAD upstream/main)..HEAD # our patches | ||
| git merge upstream/main | ||
| ``` | ||
|
|
||
| Resolve conflicts **preserving the fork's additions**. Most conflicts are upstream's periodic `|...|` → `` `...` `` doc-comment restyle landing adjacent to a line we added — keep our line + upstream's comment style. For `include/openssl/nid.h`, keep upstream's new NIDs **and** ours (our NID numbers are from OpenSSL's range and don't collide with BoringSSL's sequential allocation). | ||
|
|
||
| ### 2. Verify the merged tree builds | ||
|
|
||
| ```sh | ||
| cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Release | ||
| ninja -C build crypto ssl decrepit | ||
| ``` | ||
|
|
||
| This catches mis-resolved conflicts before they reach Bun's CI. | ||
|
|
||
| ### 3. Push to the fork | ||
|
|
||
| The default branch is **`master`** (not `main`). | ||
|
|
||
| ```sh | ||
| git push origin HEAD:master | ||
| NEW_SHA=$(git rev-parse HEAD) | ||
| ``` | ||
|
|
||
| ### 4. Bump Bun | ||
|
|
||
| In the bun repo: | ||
|
|
||
| - `scripts/build/deps/boringssl.ts` — set `BORINGSSL_COMMIT` to `$NEW_SHA`. | ||
| - `test/js/node/process/process.test.js` — update the `boringssl:` entry in `expectedVersions` to `$NEW_SHA`. | ||
| - Regenerate the source lists (the file's header comment has the exact one-liner). Only `gen/sources.json` is authoritative — diff old vs new and apply the delta: | ||
|
|
||
| ```sh | ||
| rm -rf vendor/boringssl # force re-fetch on next build | ||
| bun bd --target=clone-boringssl | ||
| bun -e 'const j=require("./vendor/boringssl/gen/sources.json"); | ||
| const f=l=>l.map(JSON.stringify).join(", "); | ||
| for(const k of ["bcm","crypto","ssl","decrepit"]) console.log(k,"\n",f(j[k].srcs)); | ||
| console.log("asm\n",f([...j.bcm.asm,...j.crypto.asm])); | ||
| console.log("nasm\n",f([...j.bcm.nasm,...j.crypto.nasm]))' | ||
| ``` | ||
|
|
||
| ### 5. Build and test locally | ||
|
|
||
| ```sh | ||
| rm -rf vendor/boringssl | ||
| bun bd -p 'require("crypto").createHash("sha3-256").update("hi").digest("hex")' | ||
| bun bd test test/js/node/crypto/ test/js/bun/crypto/ | ||
| bun bd test test/js/node/tls/ test/js/web/fetch/fetch.tls.test.ts | ||
| ``` | ||
|
|
||
| ### 6. Open the Bun PR | ||
|
|
||
| ```sh | ||
| git checkout -b claude/boringssl-<upstream-short-sha> | ||
| git commit -am "deps: upgrade BoringSSL to <upstream-short-sha>" | ||
| git push -u origin HEAD | ||
| gh pr create | ||
| ``` | ||
|
|
||
| Then `bun run ci:watch` and fix anything that turns up. | ||
|
|
||
| ## Preserved patches (what conflicts to expect) | ||
|
|
||
| `git diff $(git merge-base HEAD upstream/main)..HEAD --stat` — currently ~35 files, ~550 insertions: | ||
|
|
||
| - **SHA-512/224** — `crypto/fipsmodule/sha/sha512.cc.inc`, `crypto/sha/sha512.cc`, `include/openssl/{sha2,nid,digest}.h` | ||
| - **SHA3-224/256/384/512 as `EVP_MD`** — `crypto/digest/digest_extra.cc`, `crypto/fipsmodule/{digest/digests.cc.inc,keccak/*}`, `include/openssl/{digest,nid}.h` | ||
| - **HMAC-SHA3** — `crypto/hmac/hmac_test*.{cc,txt}` | ||
| - **BLAKE2b-512** — `crypto/blake2/blake2.cc`, `include/openssl/blake2.h` | ||
| - **RIPEMD160 in `crypto/` (not `decrepit/`) + `EVP_ripemd160` lookup** — `crypto/ripemd/ripemd.cc` (moved), `crypto/digest/digest_extra.cc`, `include/openssl/digest.h`, `gen/sources.*`, `build.json` | ||
| - **`EVP_PBE_validate_scrypt_params`** — `crypto/evp/scrypt.cc`, `include/openssl/evp.h` | ||
| - **Electron `SSL_want` / `EVP_CIPHER_do_all_sorted`** — `ssl/ssl_lib.cc` (return `rwstate` directly), `ssl/ssl_test.cc` (drops the corresponding test block), `decrepit/evp/evp_do_all.cc`, `crypto/cipher/get_cipher.cc`, `include/openssl/cipher.h` | ||
| - **MLDSA stack-frame pragma** — `crypto/fipsmodule/mldsa/mldsa.cc.inc` | ||
|
|
||
| If upstream upstreams any of these (check `git grep` on `upstream/main` before re-applying), drop the fork's copy. | ||
|
|
||
| ## Things that have broken before | ||
|
|
||
| - **`SSL_CTX` / `SSL_ECH_KEYS` / `SSL_CREDENTIAL` made opaque** — Bun's Rust FFI (`src/boringssl_sys/boringssl.rs`) treats them as opaque already, so this is fine, but check `packages/bun-usockets/src/crypto/openssl.c` for any direct field access. | ||
| - **`BIO_read`/`BIO_write` error-value narrowing** — can change `SSL_read` error paths over memory BIOs (`SSLWrapper` for TLS-over-duplex). If `node-tls-connect.test.ts` crashes in `flush_pending_events`, see `src/runtime/socket/UpgradedDuplex.rs::teardown` and `WindowsNamedPipe.rs`'s `WRAPPER_BUSY` for the re-entrant-drop guard. | ||
| - **Per-handshake allocation churn (PQ key shares)** grows under ASAN quarantine; RSS-delta tests like `tls-connect-socket-churn.test.ts` may need their `isASAN` bound raised. The `sslCtxLiveCount` check is the real regression guard there — if that passes and LSAN is clean, raise the RSS bound. | ||
| - **`asn1_string_st` / `GENERAL_NAME_st` layout** — Bun mirrors these in `src/boringssl_sys/boringssl.rs`; diff `include/openssl/{asn1,x509v3}.h` for field changes. | ||
| Original file line number | Diff line number | Diff line change | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -24,7 +24,7 @@ | ||||||||||
| import type { Dependency, DirectBuild } from "../source.ts"; | |||||||||||
| import { depSourceDir } from "../source.ts"; | |||||||||||
|
|
|||||||||||
| const BORINGSSL_COMMIT = "0c5fce43b7ed5eb6001487ee48ac65766f5ddcd1"; | |||||||||||
| const BORINGSSL_COMMIT = "1a41b9025c2c0a37edd07ff10f6944f03e028522"; | |||||||||||
|
Check warning on line 27 in scripts/build/deps/boringssl.ts
|
|||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🟡 This bump restores Extended reasoning...What changed upstreamThis PR bumps
What's stale in BunBun hand-mirrors these constants in two places that this PR did not touch:
These flow into boringssl::c::SSL_clear_options(ssl, boringssl::c::SSL_OP_LEGACY_SERVER_CONNECT);
boringssl::c::SSL_set_options(ssl, boringssl::c::SSL_OP_LEGACY_SERVER_CONNECT);The function's doc comment says it "Sets … the legacy-server-connect option", but with the constant still Why there's no runtime regression todayThe new
No What is real
Suggested fix// src/boringssl_sys/boringssl.rs
/// `SSL_OP_LEGACY_SERVER_CONNECT` — allow initial connections to servers that
/// don't support RFC 5746 secure renegotiation. BoringSSL applies this in
/// `SSL_OP_ALL` by default; mirrored so callers can clear/set explicitly.
pub const SSL_OP_LEGACY_SERVER_CONNECT: u32 = 0x00000004;// src/boringssl_sys/boringssl.zig
pub const SSL_OP_LEGACY_SERVER_CONNECT = @as(c_int, 0x00000004);
pub const SSL_OP_ALL = SSL_OP_LEGACY_SERVER_CONNECT;And add to - **`SSL_OP_*` constant values** — Bun mirrors a handful in `src/boringssl_sys/boringssl.{rs,zig}`; diff `include/openssl/ssl.h` for value changes (`SSL_OP_LEGACY_SERVER_CONNECT` went 0→4 in the 606d3a344 bump).Marking as a nit since there's no behavioral regression in this PR — but worth a one-line cleanup commit so the next BoringSSL bump doesn't silently break |
|||||||||||
|
|
|||||||||||
| export const boringssl: Dependency = { | |||||||||||
| name: "boringssl", | |||||||||||
|
|
@@ -131,7 +131,7 @@ | ||||||||||
| "crypto/evp/evp.cc", "crypto/evp/evp_asn1.cc", "crypto/evp/evp_ctx.cc", "crypto/evp/evp_kem.cc", | |||||||||||
| "crypto/evp/p_dh.cc", "crypto/evp/p_dsa.cc", "crypto/evp/p_ec.cc", "crypto/evp/p_ed25519.cc", | |||||||||||
| "crypto/evp/p_hkdf.cc", "crypto/evp/p_mldsa.cc", "crypto/evp/p_mlkem.cc", "crypto/evp/p_rsa.cc", | |||||||||||
| "crypto/evp/p_x25519.cc", "crypto/evp/pbkdf.cc", "crypto/evp/print.cc", "crypto/evp/scrypt.cc", | |||||||||||
| "crypto/evp/p_x25519.cc", "crypto/evp/p_xwing.cc", "crypto/evp/pbkdf.cc", "crypto/evp/print.cc", "crypto/evp/scrypt.cc", | |||||||||||
| "crypto/evp/sign.cc", "crypto/ex_data.cc", "crypto/fipsmodule/fips_shared_support.cc", | |||||||||||
| "crypto/fuzzer_mode.cc", "crypto/hpke/hpke.cc", "crypto/hrss/hrss.cc", "crypto/kyber/kyber.cc", | |||||||||||
| "crypto/lhash/lhash.cc", "crypto/md4/md4.cc", "crypto/md5/md5.cc", "crypto/mem.cc", | |||||||||||
|
|
@@ -143,7 +143,7 @@ | ||||||||||
| "crypto/pkcs8/pkcs8_x509.cc", "crypto/poly1305/poly1305.cc", "crypto/poly1305/poly1305_arm.cc", | |||||||||||
| "crypto/poly1305/poly1305_vec.cc", "crypto/pool/pool.cc", "crypto/rand/deterministic.cc", | |||||||||||
| "crypto/rand/fork_detect.cc", "crypto/rand/forkunsafe.cc", "crypto/rand/getentropy.cc", | |||||||||||
| "crypto/rand/ios.cc", "crypto/rand/passive.cc", "crypto/rand/rand.cc", "crypto/rand/trusty.cc", | |||||||||||
| "crypto/rand/ios.cc", "crypto/rand/rand.cc", "crypto/rand/trusty.cc", | |||||||||||
| "crypto/rand/urandom.cc", "crypto/rand/windows.cc", "crypto/rc4/rc4.cc", "crypto/refcount.cc", | |||||||||||
| "crypto/ripemd/ripemd.cc", "crypto/rsa/rsa_asn1.cc", "crypto/rsa/rsa_crypt.cc", | |||||||||||
| "crypto/rsa/rsa_extra.cc", "crypto/rsa/rsa_print.cc", "crypto/sha/sha1.cc", | |||||||||||
|
|
|||||||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Use
bun bd -ein this runbook step.This snippet currently uses
bun -e, which bypasses the repo’s documented debug-build command flow.Suggested doc fix
As per coding guidelines: “Never use
bun testorbun <file>directly - always usebun bd ....”📝 Committable suggestion
🤖 Prompt for AI Agents
Source: Coding guidelines