From dc535770b1ce796bcd953ada16fb125fa8edeeba Mon Sep 17 00:00:00 2001 From: Katherine Reynolds <7054971+reynoldskr@users.noreply.github.com> Date: Mon, 17 Nov 2025 11:35:40 -0800 Subject: [PATCH] In-progress work transfer commit --- apps/browser/rust_noise_bg.wasm | Bin 0 -> 180174 bytes .../popup/settings/noise-protocol.service.ts | 236 ++++++++++++++++++ .../src/tools/popup/settings/rust_noise.d.ts | 129 ++++++++++ .../popup/settings/tunnel-demo.component.html | 12 + .../popup/settings/tunnel-demo.component.ts | 34 ++- .../tools/popup/settings/tunnel.service.ts | 89 ++++++- 6 files changed, 489 insertions(+), 11 deletions(-) create mode 100644 apps/browser/rust_noise_bg.wasm create mode 100644 apps/browser/src/tools/popup/settings/noise-protocol.service.ts create mode 100644 apps/browser/src/tools/popup/settings/rust_noise.d.ts diff --git a/apps/browser/rust_noise_bg.wasm b/apps/browser/rust_noise_bg.wasm new file mode 100644 index 0000000000000000000000000000000000000000..9c54bf61f1ed4b57237f2db0f94a0284f0e40f08 GIT binary patch literal 180174 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 ^{%gMcB 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 yoGy5tQ4UWJu>!K { + if (this.isInitialized) { + return; + } + + try { + // Import the WASM module - hardcoded path for demo + // The WASM file will be in the build output directory alongside other assets + const wasmModule = await import("./rust_noise.js"); + + // Initialize WASM - for --target web, the default export is the init function + if (typeof wasmModule.default === "function") { + // Pass the WASM file path explicitly to avoid import.meta.url issues in bundled code + await wasmModule.default("./rust_noise_bg.wasm"); + } else if (typeof wasmModule.init === "function") { + // Fallback for other targets + await wasmModule.init(); + } + + this.wasmModule = wasmModule; + this.isInitialized = true; + this.logService.info("[NoiseProtocol] WASM module initialized"); + } catch (error) { + this.logService.error("[NoiseProtocol] Failed to initialize WASM module:", error); + throw new Error(`Failed to initialize Noise Protocol WASM: ${error}`); + } + } + + /** + * Create a new Noise Protocol instance + */ + createProtocol(isInitiator: boolean, staticKeypair?: KeyPair, psk?: Uint8Array): NoiseProtocol { + if (!this.isInitialized || !this.wasmModule) { + throw new Error("NoiseProtocolService not initialized. Call initialize() first."); + } + + return new NoiseProtocol(this.wasmModule, isInitiator, staticKeypair, psk, this.logService); + } + + /** + * Perform full XXpsk3 handshake (3 messages) + */ + async performXXHandshake( + isInitiator: boolean, + sendMessage: (msg: Uint8Array) => Promise, + staticKeypair?: KeyPair, + psk?: Uint8Array, + ): Promise { + await this.initialize(); + + const noise = this.createProtocol(isInitiator, staticKeypair, psk); + + if (isInitiator) { + this.logService.info("[NoiseProtocol] Step 1: Initiator sending message 1 (-> e)"); + const msg1 = noise.writeMessage(); + const msg2 = await sendMessage(msg1); + + this.logService.info( + "[NoiseProtocol] Step 2: Initiator received message 2 (<- e, ee, s, es)", + ); + noise.readMessage(msg2); + + this.logService.info("[NoiseProtocol] Step 3: Initiator sending message 3 (-> s, se, psk)"); + const msg3 = noise.writeMessage(); + await sendMessage(msg3); + + noise.split(); + } else { + this.logService.info("[NoiseProtocol] Responder waiting for messages..."); + // Responder waits for messages, handled separately + } + + return noise; + } +} + +/** + * Noise Protocol wrapper using Rust/WASM implementation + * Implements Noise_XXpsk3_25519_AESGCM_SHA256 pattern + */ +export class NoiseProtocol { + private wasmProtocol: any; + private isInitiator: boolean; + + constructor( + wasmModule: any, + isInitiator: boolean, + staticKeypair?: KeyPair, + psk?: Uint8Array, + private logService?: LogService, + ) { + this.isInitiator = isInitiator; + + try { + // Convert optional parameters + const staticSecretKey = staticKeypair ? staticKeypair.secretKey : null; + const pskBytes = psk ? psk : null; + + // Create WASM protocol instance + this.wasmProtocol = new wasmModule.NoiseProtocol(isInitiator, staticSecretKey, pskBytes); + + this.log( + `Noise XX handshake initialized (${isInitiator ? "initiator" : "responder"}, PSK: ${psk ? "yes" : "no"})`, + ); + } catch (error) { + this.logError("Failed to create WASM NoiseProtocol:", error); + throw error; + } + } + + /** + * Write a handshake message + */ + writeMessage(payload?: Uint8Array): Uint8Array { + try { + const payloadArray = payload && payload.length > 0 ? payload : null; + const message = this.wasmProtocol.writeMessage(payloadArray); + + this.log(`Sent handshake message (length: ${message.length})`); + return message; + } catch (error) { + this.logError("Failed to write message:", error); + throw error; + } + } + + /** + * Read a handshake message + */ + readMessage(message: Uint8Array): Uint8Array { + try { + const payload = this.wasmProtocol.readMessage(message); + + this.log( + `Received handshake message (length: ${message.length}, payload: ${payload.length})`, + ); + return payload; + } catch (error) { + this.logError("Failed to read message:", error); + throw error; + } + } + + /** + * Complete the handshake and derive transport keys + */ + split(): void { + try { + this.wasmProtocol.split(); + this.log("Handshake complete - transport keys derived"); + } catch (error) { + this.logError("Failed to split:", error); + throw error; + } + } + + /** + * Encrypt a message after handshake is complete + */ + encryptMessage(plaintext: Uint8Array): Uint8Array { + try { + const ciphertext = this.wasmProtocol.encryptMessage(plaintext); + + this.log(`Message encrypted (length: ${ciphertext.length})`); + return ciphertext; + } catch (error) { + this.logError("Failed to encrypt:", error); + throw error; + } + } + + /** + * Decrypt a message after handshake is complete + */ + decryptMessage(ciphertext: Uint8Array): Uint8Array { + try { + const plaintext = this.wasmProtocol.decryptMessage(ciphertext); + + this.log(`Message decrypted (length: ${plaintext.length})`); + return plaintext; + } catch (error) { + this.logError("Failed to decrypt:", error); + throw error; + } + } + + /** + * Check if handshake is complete + */ + isHandshakeComplete(): boolean { + return this.wasmProtocol.isHandshakeComplete(); + } + + /** + * Get static public key + * Note: WASM implementation doesn't expose this directly + */ + getStaticPublicKey(): Uint8Array { + throw new Error("getStaticPublicKey not yet implemented for WASM"); + } + + private log(message: string) { + if (this.logService) { + this.logService.info(`[NoiseProtocol] ${message}`); + } + } + + private logError(message: string, error?: any) { + if (this.logService) { + this.logService.error(`[NoiseProtocol] ${message}`, error); + } + } +} diff --git a/apps/browser/src/tools/popup/settings/rust_noise.d.ts b/apps/browser/src/tools/popup/settings/rust_noise.d.ts new file mode 100644 index 00000000000..0173e4e515a --- /dev/null +++ b/apps/browser/src/tools/popup/settings/rust_noise.d.ts @@ -0,0 +1,129 @@ +/* tslint:disable */ + +/** + * Generate a new Curve25519 keypair + */ +export function generate_keypair(): Keypair; +/** + * Initialize the WASM module + */ +export function init(): void; +/** + * Keypair structure + */ +export class Keypair { + free(): void; + [Symbol.dispose](): void; + constructor(public_key: Uint8Array, secret_key: Uint8Array); + readonly public_key: Uint8Array; + readonly secret_key: Uint8Array; +} +/** + * Noise Protocol state machine + */ +export class NoiseProtocol { + free(): void; + [Symbol.dispose](): void; + /** + * Read a handshake message from the peer + * Returns the payload contained in the message + */ + readMessage(message: Uint8Array): Uint8Array; + /** + * Write a handshake message + * Returns the message to send to the peer + */ + writeMessage(payload?: Uint8Array | null): Uint8Array; + /** + * Decrypt a message (after handshake is complete) + */ + decryptMessage(ciphertext: Uint8Array): Uint8Array; + /** + * Encrypt a message (after handshake is complete) + */ + encryptMessage(plaintext: Uint8Array): Uint8Array; + /** + * Check if handshake is complete + */ + isHandshakeComplete(): boolean; + /** + * Get the remote static public key (available after handshake) + */ + getRemoteStaticPublicKey(): Uint8Array; + /** + * Create a new Noise protocol instance + * + * # Arguments + * * `is_initiator` - Whether this is the initiator (true) or responder (false) + * * `static_keypair` - Optional static keypair (if None, generates new one) + * * `psk` - Optional pre-shared key for additional authentication + */ + constructor( + is_initiator: boolean, + static_secret_key?: Uint8Array | null, + psk?: Uint8Array | null, + ); + /** + * Complete the handshake and derive transport keys + */ + split(): void; +} + +export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module; + +export interface InitOutput { + readonly memory: WebAssembly.Memory; + readonly __wbg_keypair_free: (a: number, b: number) => void; + readonly __wbg_noiseprotocol_free: (a: number, b: number) => void; + readonly generate_keypair: (a: number) => void; + readonly init: () => void; + readonly keypair_new: (a: number, b: number, c: number, d: number) => number; + readonly keypair_public_key: (a: number, b: number) => void; + readonly keypair_secret_key: (a: number, b: number) => void; + readonly noiseprotocol_decryptMessage: (a: number, b: number, c: number, d: number) => void; + readonly noiseprotocol_encryptMessage: (a: number, b: number, c: number, d: number) => void; + readonly noiseprotocol_getRemoteStaticPublicKey: (a: number, b: number) => void; + readonly noiseprotocol_isHandshakeComplete: (a: number) => number; + readonly noiseprotocol_new: ( + a: number, + b: number, + c: number, + d: number, + e: number, + f: number, + ) => void; + readonly noiseprotocol_readMessage: (a: number, b: number, c: number, d: number) => void; + readonly noiseprotocol_split: (a: number, b: number) => void; + readonly noiseprotocol_writeMessage: (a: number, b: number, c: number, d: number) => void; + readonly __wbindgen_export: (a: number) => void; + readonly __wbindgen_add_to_stack_pointer: (a: number) => number; + readonly __wbindgen_export2: (a: number, b: number) => number; + readonly __wbindgen_export3: (a: number, b: number, c: number) => void; + readonly __wbindgen_start: () => void; +} + +export type SyncInitInput = BufferSource | WebAssembly.Module; +/** + * Instantiates the given `module`, which can either be bytes or + * a precompiled `WebAssembly.Module`. + * + * @param {{ module: SyncInitInput }} module - Passing `SyncInitInput` directly is deprecated. + * + * @returns {InitOutput} + */ +export function initSync(module: { module: SyncInitInput } | SyncInitInput): InitOutput; + +/** + * If `module_or_path` is {RequestInfo} or {URL}, makes a request and + * for everything else, calls `WebAssembly.instantiate` directly. + * + * @param {{ module_or_path: InitInput | Promise }} module_or_path - Passing `InitInput` directly is deprecated. + * + * @returns {Promise} + */ +export default function __wbg_init( + module_or_path?: + | { module_or_path: InitInput | Promise } + | InitInput + | Promise, +): Promise; diff --git a/apps/browser/src/tools/popup/settings/tunnel-demo.component.html b/apps/browser/src/tools/popup/settings/tunnel-demo.component.html index e194bf6e2a4..5f07084f900 100644 --- a/apps/browser/src/tools/popup/settings/tunnel-demo.component.html +++ b/apps/browser/src/tools/popup/settings/tunnel-demo.component.html @@ -16,6 +16,18 @@ Enter your username to connect to the remote tunnel. + + + Use Noise Protocol (XXpsk3) Encryption + Enable end-to-end encryption using the Noise Protocol Framework with WASM. + diff --git a/apps/browser/src/tools/popup/settings/tunnel-demo.component.ts b/apps/browser/src/tools/popup/settings/tunnel-demo.component.ts index 216cd0277e1..afc0be95c0d 100644 --- a/apps/browser/src/tools/popup/settings/tunnel-demo.component.ts +++ b/apps/browser/src/tools/popup/settings/tunnel-demo.component.ts @@ -50,6 +50,7 @@ import { TunnelService } from "./tunnel.service"; export class TunnelDemoComponent { protected formGroup = this.formBuilder.group({ tunnelUsername: ["", Validators.required], + useNoiseProtocol: [false], }); constructor( @@ -125,17 +126,30 @@ export class TunnelDemoComponent { } // Send credentials to the localhost tunnel server - try { - await this.tunnelService.sendCredentials({ tunnelUsername, username, password }); + const useNoiseProtocol = this.formGroup.value.useNoiseProtocol ?? false; - await this.dialogService.openSimpleDialog({ - title: "Tunnel Demo - Success", - content: `Credentials successfully sent to tunnel server.\n\nUsername: - ${username}\nPassword: ${password.replace(/./g, "*")}`, - type: "success", - acceptButtonText: { key: "ok" }, - cancelButtonText: null, - }); + try { + if (useNoiseProtocol) { + await this.tunnelService.sendCredentialsWithNoise({ tunnelUsername, username, password }); + + await this.dialogService.openSimpleDialog({ + title: "Tunnel Demo - Success (Noise Protocol)", + content: `Encrypted credentials successfully sent to tunnel server using Noise Protocol (XXpsk3).\n\nUsername: ${username}\nPassword: ${password.replace(/./g, "*")}`, + type: "success", + acceptButtonText: { key: "ok" }, + cancelButtonText: null, + }); + } else { + await this.tunnelService.sendCredentials({ tunnelUsername, username, password }); + + await this.dialogService.openSimpleDialog({ + title: "Tunnel Demo - Success", + content: `Credentials successfully sent to tunnel server.\n\nUsername: ${username}\nPassword: ${password.replace(/./g, "*")}`, + type: "success", + acceptButtonText: { key: "ok" }, + cancelButtonText: null, + }); + } } catch (error) { await this.dialogService.openSimpleDialog({ title: "Tunnel Demo - Error", diff --git a/apps/browser/src/tools/popup/settings/tunnel.service.ts b/apps/browser/src/tools/popup/settings/tunnel.service.ts index 1b01b0288fc..8584b529351 100644 --- a/apps/browser/src/tools/popup/settings/tunnel.service.ts +++ b/apps/browser/src/tools/popup/settings/tunnel.service.ts @@ -2,6 +2,8 @@ import { Injectable } from "@angular/core"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { NoiseProtocolService } from "./noise-protocol.service"; + export interface TunnelCredentials { tunnelUsername: string; username: string; @@ -11,6 +13,7 @@ export interface TunnelCredentials { /** * Service for securely sending credentials to a localhost tunnel server. * SECURITY: Only allows connections to loopback addresses (localhost/127.0.0.1/[::1]). + * Uses Noise Protocol (XXpsk3) for end-to-end encryption. */ @Injectable({ providedIn: "root", @@ -20,7 +23,10 @@ export class TunnelService { private readonly TUNNEL_ENDPOINT = "/bwTunnelDemo"; private readonly ALLOWED_LOOPBACK_HOSTS = ["localhost", "127.0.0.1", "[::1]", "::1"]; - constructor(private logService: LogService) {} + constructor( + private logService: LogService, + private noiseProtocolService: NoiseProtocolService, + ) {} /** * Sends credentials to the local tunnel server. @@ -65,6 +71,87 @@ export class TunnelService { } } + /** + * Sends credentials to the local tunnel server with Noise Protocol encryption. + * Performs a full XXpsk3 handshake and sends encrypted credentials. + * @param credentials The username and password to send + * @throws Error if the connection is not to a loopback address or if the request fails + */ + async sendCredentialsWithNoise(credentials: TunnelCredentials): Promise { + const url = `http://localhost:${this.TUNNEL_PORT}${this.TUNNEL_ENDPOINT}`; + + // Validate that we're only connecting to localhost + const urlObj = new URL(url); + if (!this.isLoopbackAddress(urlObj.hostname)) { + const error = `Security violation: Attempted to connect to non-loopback address: ${urlObj.hostname}`; + this.logService.error(error); + throw new Error("Tunnel service only allows connections to localhost"); + } + + try { + // Initialize Noise Protocol WASM module + await this.noiseProtocolService.initialize(); + + // Perform Noise handshake as initiator + const noise = await this.noiseProtocolService.performXXHandshake( + true, // isInitiator + async (message: Uint8Array) => { + // Send handshake message to server + const response = await fetch(url, { + method: "POST", + headers: { + "Content-Type": "application/octet-stream", + "X-Noise-Handshake": "true", + }, + body: message, + mode: "cors", + credentials: "omit", + cache: "no-store", + }); + + if (!response.ok) { + throw new Error( + `Tunnel server responded with status ${response.status}: ${response.statusText}`, + ); + } + + // Return the response message + const arrayBuffer = await response.arrayBuffer(); + return new Uint8Array(arrayBuffer); + }, + ); + + // Encrypt credentials + const credentialsJson = JSON.stringify(credentials); + const credentialsBytes = new TextEncoder().encode(credentialsJson); + const encryptedCredentials = noise.encryptMessage(credentialsBytes); + + // Send encrypted credentials + const response = await fetch(url, { + method: "POST", + headers: { + "Content-Type": "application/octet-stream", + "X-Noise-Transport": "true", + }, + body: encryptedCredentials, + mode: "cors", + credentials: "omit", + cache: "no-store", + }); + + if (!response.ok) { + throw new Error( + `Tunnel server responded with status ${response.status}: ${response.statusText}`, + ); + } + + this.logService.info("Encrypted credentials successfully sent to tunnel server"); + } catch (error) { + this.logService.error(`Failed to send encrypted credentials to tunnel server: ${error}`); + throw error; + } + } + /** * Validates that a hostname is a loopback address. * @param hostname The hostname to validate