Issue #96: SubtleCrypto — Chrome-Kompatibilität für AWS WAF PoW #91
Labels
No labels
bug
docs
feature
housekeeping
html-spec
performance
react-compat
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
glow-all/true-headless-browser#91
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Problembeschreibung
Bun's
crypto.subtlebasiert auf JavaScriptCore (Apple's Implementierung), nicht auf BoringSSL (Chrome). AWS WAF, CloudFlare Turnstile und andere Bot-Detection-Dienste nutzen Proof-of-Work (PoW), diecrypto.subtle.digest(),crypto.subtle.generateKey(),crypto.subtle.sign()undcrypto.subtle.encrypt()aufrufen.Kleine Abweichungen in:
Aktuelle Architecture
Analyse
Option A — Bun-native + Error-Normalisierung (EMPFEHLUNG)
globalThis.crypto.subtlebleibt Bun-native.crypto.subtle.digest('SHA-256')ist bereits korrekt für reine PoW-Hashes. Wir patchen nur die Error-Handling-Layer:DOMException-Typen auf Chrome-Werte normalisieren (z.B.NotSupportedError,OperationError)crypto.subtle.digest()mit unbekanntem Algo) auf Chrome-Verhalten bringencrypto.getRandomValues()— prüfen ob Bun-konform (Validity-Checks)Option B — Node-API C++ Addon (OpenSSL)
C++ Addon via
node-gyp/bun:ffi, das OpenSSL direkt bindet — identisch zu Chrome's BoringSSL. Gibt 100% Chrome-kompatible Resultate, aber:Option C — Full SubtleCrypto Proxy
Jede Methode (
digest,encrypt,decrypt,sign,verify,generateKey,importKey,exportKey,wrapKey,unwrapKey) wird gewrapped:ecdh,hmacmit Chrome-spezifischen Parametern)Entscheidung
Primär: Option A (Bun-native + Error-Normalisierung). Wenn konkrete PoW-Challenges damit scheitern → Option B (C++ Addon). Option C ist überengineering da Bun's native Implementierung den Kern (SHA-256, PBKDF2, AES-GCM) bereits korrekt hat.
Akzeptanzkriterien
crypto.subtle.digest('SHA-256', data)liefert gleiches Ergebnis wie Chromecrypto.subtle.generateKey()/importKey()wirft Chrome-kompatible Errorscrypto.getRandomValues()validiert Buffer-Länge wie Chrome (65536 byte max)OperationErroroderNotSupportedErrorcrypto.subtle.digest()error messages sind identisch zu ChromeBetroffene Dateien
src/fakes/subtle-crypto.tssrc/runtime-isolation.tsinstallFakes()einhängentests/unit/subtle-crypto.test.tsTestplan
Dependencies
Implementiert ✅ (Commit
1898483)Option A — Bun-native + Error-Normalisierung
Neuer Code
src/fakes/subtle-crypto.ts— ChromeSubtleCrypto Wrapper (610 Zeilen)createChromeCrypto()→ Proxy, der inallowedGlobalseingehängt wirdsrc/runtime-isolation.ts— crypto: createChromeCrypto() statt nativetests/unit/subtle-crypto.test.ts— 23 Tests (alle ✅)Getestet
Nächste Schritte