From 4cbbc7c99923bfc2b973f20f1b38301731655e45 Mon Sep 17 00:00:00 2001 From: Theo Ephraim Date: Wed, 8 Apr 2026 15:56:40 -0700 Subject: [PATCH 1/3] mac/swift encryption binary + cross platform client --- .changeset/red-wasps-kick.md | 5 + .gitignore | 1 + bun.lock | 37 +- eslint.config.mjs | 18 +- package.json | 5 +- packages/encryption-binary-swift/.env.schema | 22 ++ packages/encryption-binary-swift/.gitignore | 1 + packages/encryption-binary-swift/README.md | 32 ++ packages/encryption-binary-swift/package.json | 18 + .../resources/AppIcon.icns | Bin 0 -> 673866 bytes .../scripts/build-swift.ts | 181 +++++++++ .../scripts/kill-daemon.ts | 47 +++ .../swift/Package.swift | 20 + .../Sources/VarlockEnclave/IPCServer.swift | 217 +++++++++++ .../Sources/VarlockEnclave/PeerIdentity.swift | 64 ++++ .../VarlockEnclave/SecureEnclaveManager.swift | 299 +++++++++++++++ .../VarlockEnclave/SecureInputDialog.swift | 74 ++++ .../VarlockEnclave/SessionManager.swift | 186 ++++++++++ .../VarlockEnclave/StatusBarMenu.swift | 106 ++++++ .../swift/Sources/VarlockEnclave/main.swift | 349 ++++++++++++++++++ packages/varlock/.gitignore | 3 +- packages/varlock/package.json | 3 +- packages/varlock/scripts/build-binaries.ts | 15 + packages/varlock/src/cli/cli-executable.ts | 6 +- .../src/cli/commands/encrypt.command.ts | 257 +++++++------ .../varlock/src/cli/commands/lock.command.ts | 26 ++ .../varlock/src/env-graph/lib/env-graph.ts | 3 + .../src/lib/local-encrypt/binary-resolver.ts | 140 +++++++ .../src/lib/local-encrypt/builtin-resolver.ts | 144 ++++++++ .../src/lib/local-encrypt/crypto.test.ts | 95 +++++ .../varlock/src/lib/local-encrypt/crypto.ts | 247 +++++++++++++ .../src/lib/local-encrypt/daemon-client.ts | 325 ++++++++++++++++ .../lib/local-encrypt/file-backend.test.ts | 81 ++++ .../src/lib/local-encrypt/file-backend.ts | 103 ++++++ .../varlock/src/lib/local-encrypt/index.ts | 173 +++++++++ .../varlock/src/lib/local-encrypt/types.ts | 42 +++ .../plugins/legacy-global-plugin.js | 2 + 37 files changed, 3212 insertions(+), 135 deletions(-) create mode 100644 .changeset/red-wasps-kick.md create mode 100644 packages/encryption-binary-swift/.env.schema create mode 100644 packages/encryption-binary-swift/.gitignore create mode 100644 packages/encryption-binary-swift/README.md create mode 100644 packages/encryption-binary-swift/package.json create mode 100644 packages/encryption-binary-swift/resources/AppIcon.icns create mode 100644 packages/encryption-binary-swift/scripts/build-swift.ts create mode 100644 packages/encryption-binary-swift/scripts/kill-daemon.ts create mode 100644 packages/encryption-binary-swift/swift/Package.swift create mode 100644 packages/encryption-binary-swift/swift/Sources/VarlockEnclave/IPCServer.swift create mode 100644 packages/encryption-binary-swift/swift/Sources/VarlockEnclave/PeerIdentity.swift create mode 100644 packages/encryption-binary-swift/swift/Sources/VarlockEnclave/SecureEnclaveManager.swift create mode 100644 packages/encryption-binary-swift/swift/Sources/VarlockEnclave/SecureInputDialog.swift create mode 100644 packages/encryption-binary-swift/swift/Sources/VarlockEnclave/SessionManager.swift create mode 100644 packages/encryption-binary-swift/swift/Sources/VarlockEnclave/StatusBarMenu.swift create mode 100644 packages/encryption-binary-swift/swift/Sources/VarlockEnclave/main.swift create mode 100644 packages/varlock/src/cli/commands/lock.command.ts create mode 100644 packages/varlock/src/lib/local-encrypt/binary-resolver.ts create mode 100644 packages/varlock/src/lib/local-encrypt/builtin-resolver.ts create mode 100644 packages/varlock/src/lib/local-encrypt/crypto.test.ts create mode 100644 packages/varlock/src/lib/local-encrypt/crypto.ts create mode 100644 packages/varlock/src/lib/local-encrypt/daemon-client.ts create mode 100644 packages/varlock/src/lib/local-encrypt/file-backend.test.ts create mode 100644 packages/varlock/src/lib/local-encrypt/file-backend.ts create mode 100644 packages/varlock/src/lib/local-encrypt/index.ts create mode 100644 packages/varlock/src/lib/local-encrypt/types.ts diff --git a/.changeset/red-wasps-kick.md b/.changeset/red-wasps-kick.md new file mode 100644 index 00000000..897c3607 --- /dev/null +++ b/.changeset/red-wasps-kick.md @@ -0,0 +1,5 @@ +--- +"varlock": minor +--- + +add new varlock() function for built-in encryption diff --git a/.gitignore b/.gitignore index b523d384..4f30189e 100644 --- a/.gitignore +++ b/.gitignore @@ -16,4 +16,5 @@ smoke-tests/pnpm-lock.yaml framework-tests/.packed framework-tests/.test-projects .magent +.claude/worktrees/ eslint-output.txt diff --git a/bun.lock b/bun.lock index 6246abf5..bdd306d7 100644 --- a/bun.lock +++ b/bun.lock @@ -12,8 +12,6 @@ "@typescript-eslint/eslint-plugin": "^8.56.1", "@typescript-eslint/parser": "^8.56.1", "@varlock/changeset-changelog": "workspace:*", - "@varlock/cloudflare-integration": "workspace:*", - "@varlock/keepass-plugin": "workspace:*", "@varlock/tsconfig": "workspace:*", "eslint": "^10.0.2", "eslint-plugin-es-x": "^9.5.0", @@ -25,6 +23,7 @@ "turbo": "^2.8.12", "typescript": "catalog:", "typescript-eslint": "^8.56.1", + "varlock": "workspace:*", }, }, "packages/changeset-changelog": { @@ -44,6 +43,14 @@ "vitest": "catalog:", }, }, + "packages/encryption-binary-swift": { + "name": "@varlock/encryption-binary-swift", + "version": "0.0.1", + "devDependencies": { + "@varlock/1password-plugin": "workspace:*", + "varlock": "workspace:*", + }, + }, "packages/env-spec-parser": { "name": "@env-spec/parser", "version": "0.2.0", @@ -116,7 +123,7 @@ }, "packages/integrations/nextjs": { "name": "@varlock/nextjs-integration", - "version": "0.3.2", + "version": "0.3.3", "devDependencies": { "@types/node": "catalog:", "tsup": "catalog:", @@ -130,7 +137,7 @@ }, "packages/integrations/vite": { "name": "@varlock/vite-integration", - "version": "0.2.9", + "version": "0.2.10", "devDependencies": { "@types/node": "catalog:", "ast-matcher": "^1.2.0", @@ -148,7 +155,7 @@ }, "packages/plugins/1password": { "name": "@varlock/1password-plugin", - "version": "0.3.2", + "version": "0.3.3", "devDependencies": { "@1password/sdk": "0.4.1-beta.1", "@1password/sdk-core": "0.4.1-beta.1", @@ -337,6 +344,20 @@ "varlock": "workspace:^", }, }, + "packages/plugins/secure-enclave": { + "name": "@varlock/secure-enclave-plugin", + "version": "0.0.1", + "devDependencies": { + "@env-spec/utils": "workspace:^", + "@types/node": "catalog:", + "tsup": "catalog:", + "varlock": "workspace:^", + "vitest": "catalog:", + }, + "peerDependencies": { + "varlock": "workspace:^", + }, + }, "packages/tsconfig": { "name": "@varlock/tsconfig", "version": "0.0.0", @@ -355,7 +376,7 @@ }, "packages/varlock": { "name": "varlock", - "version": "0.7.1", + "version": "0.7.2", "bin": { "varlock": "./bin/cli.js", }, @@ -1306,6 +1327,8 @@ "@varlock/dashlane-plugin": ["@varlock/dashlane-plugin@workspace:packages/plugins/dashlane"], + "@varlock/encryption-binary-swift": ["@varlock/encryption-binary-swift@workspace:packages/encryption-binary-swift"], + "@varlock/expo-integration": ["@varlock/expo-integration@workspace:packages/integrations/expo"], "@varlock/google-secret-manager-plugin": ["@varlock/google-secret-manager-plugin@workspace:packages/plugins/google-secret-manager"], @@ -1324,6 +1347,8 @@ "@varlock/proton-pass-plugin": ["@varlock/proton-pass-plugin@workspace:packages/plugins/proton-pass"], + "@varlock/secure-enclave-plugin": ["@varlock/secure-enclave-plugin@workspace:packages/plugins/secure-enclave"], + "@varlock/tsconfig": ["@varlock/tsconfig@workspace:packages/tsconfig"], "@varlock/vite-integration": ["@varlock/vite-integration@workspace:packages/integrations/vite"], diff --git a/eslint.config.mjs b/eslint.config.mjs index 324e9337..64674d62 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -159,6 +159,7 @@ export default tseslint.config( }, }, { + // allow console.log in some scripts/tests/etc files: [ 'scripts/**', 'ignore/**', @@ -168,6 +169,7 @@ export default tseslint.config( 'packages/varlock/scripts/**', 'smoke-tests/**', 'framework-tests/**', + 'packages/encryption-binary-swift/scripts/**', ], rules: { 'no-console': 0, @@ -179,22 +181,6 @@ export default tseslint.config( '@typescript-eslint/no-require-imports': 0, }, }, - { - // plugin files use triple-slash directives for the `plugin` global type - // which is injected at runtime by varlock via globalThis - files: [ - 'smoke-tests/**/plugins/**', - 'packages/varlock/src/env-graph/test/plugins/**', - ], - languageOptions: { - globals: { - plugin: 'readonly', - }, - }, - rules: { - '@typescript-eslint/triple-slash-reference': 0, - }, - }, { // these files use build-time globals declared in globals.d.ts files: [ diff --git a/package.json b/package.json index 0cefe334..55f67dd3 100644 --- a/package.json +++ b/package.json @@ -38,8 +38,6 @@ "@typescript-eslint/parser": "^8.56.1", "@varlock/changeset-changelog": "workspace:*", "@varlock/tsconfig": "workspace:*", - "@varlock/cloudflare-integration": "workspace:*", - "@varlock/keepass-plugin": "workspace:*", "eslint": "^10.0.2", "eslint-plugin-es-x": "^9.5.0", "eslint-plugin-fix-disabled-rules": "^0.0.2", @@ -49,7 +47,8 @@ "globals": "^17.3.0", "turbo": "^2.8.12", "typescript": "catalog:", - "typescript-eslint": "^8.56.1" + "typescript-eslint": "^8.56.1", + "varlock": "workspace:*" }, "packageManager": "bun@1.3.11", "engines": { diff --git a/packages/encryption-binary-swift/.env.schema b/packages/encryption-binary-swift/.env.schema new file mode 100644 index 00000000..ab7c4933 --- /dev/null +++ b/packages/encryption-binary-swift/.env.schema @@ -0,0 +1,22 @@ +# @defaultSensitive=false @defaultRequired=infer +# @plugin(@varlock/1password-plugin) +# @initOp(allowAppAuth=true, token=$OP_CI_TOKEN) +# --- + +# this must be set in github actions secrets +# @type=opServiceAccountToken @sensitive +OP_CI_TOKEN= + +# Apple code signing - used in CI to sign the macOS native binary +# @sensitive +APPLE_CERTIFICATE_BASE64=op("op://VarlockCI/apple developer/APPLE_CERTIFICATE_BASE64") +# @sensitive +APPLE_CERTIFICATE_PASSWORD=op("op://VarlockCI/apple developer/APPLE_CERTIFICATE_PASSWORD") +APPLE_SIGNING_IDENTITY=op("op://VarlockCI/apple developer/APPLE_SIGNING_IDENTITY") +APPLE_TEAM_ID=op("op://VarlockCI/apple developer/APPLE_TEAM_ID") + +# Apple notarization +# @sensitive +APPLE_ID=op("op://VarlockCI/apple developer/APPLE_NOTARIZATION_APPLE_ID") +# @sensitive +APPLE_APP_PASSWORD=op("op://VarlockCI/apple developer/APPLE_NOTARIZATION_APP_PASSWORD") diff --git a/packages/encryption-binary-swift/.gitignore b/packages/encryption-binary-swift/.gitignore new file mode 100644 index 00000000..74487071 --- /dev/null +++ b/packages/encryption-binary-swift/.gitignore @@ -0,0 +1 @@ +swift/.build diff --git a/packages/encryption-binary-swift/README.md b/packages/encryption-binary-swift/README.md new file mode 100644 index 00000000..b2a2163b --- /dev/null +++ b/packages/encryption-binary-swift/README.md @@ -0,0 +1,32 @@ +# @varlock/encryption-binary-swift + +macOS native binary for varlock's local encryption, built in Swift. + +## Why Swift? + +Varlock uses the **Secure Enclave** for hardware-backed key storage on macOS. The Secure Enclave, Touch ID biometric prompts, and native UI (status bar menu, secure input dialogs) are only accessible through Apple's `Security`, `LocalAuthentication`, and `AppKit` frameworks — which are designed for Swift/Objective-C. Rust or other languages would require fragile FFI bindings with no stable C ABI to target. + +The `.app` bundle format is also required for custom Touch ID icons, `LSUIElement` (menu-bar-only) behavior, and proper code signing + notarization. + +Rust is planned for Windows (TPM / Windows Hello) and Linux (TPM2), where the platform APIs have C-friendly interfaces. The IPC protocol (length-prefixed JSON over a Unix socket) is the same across all platforms. + +## Structure + +- `swift/` — Swift Package Manager project (`VarlockEnclave` executable) +- `scripts/build-swift.ts` — Two-phase build: compile (cacheable) + bundle (mode-specific `.app` wrapping + codesign) +- `resources/` — App icon and other bundle resources + +## Building + +```bash +# Local dev (current arch, dev mode) +bun run build:swift:dev + +# Universal binary (arm64 + x86_64, for CI) +bun run build:swift + +# With signing and release metadata +bun run build:swift -- --mode release --version 1.2.3 --sign "Developer ID Application: ..." +``` + +Output: `packages/varlock/native-bins/darwin/VarlockEnclave.app` diff --git a/packages/encryption-binary-swift/package.json b/packages/encryption-binary-swift/package.json new file mode 100644 index 00000000..f6bd7f1f --- /dev/null +++ b/packages/encryption-binary-swift/package.json @@ -0,0 +1,18 @@ +{ + "name": "@varlock/encryption-binary-swift", + "description": "macOS Secure Enclave encryption binary for varlock (Swift)", + "version": "0.0.1", + "private": true, + "scripts": { + "kill-daemon": "bun run scripts/kill-daemon.ts", + "build:swift": "bun run kill-daemon && bun run scripts/build-swift.ts --universal", + "build:swift:dev": "bun run kill-daemon && bun run scripts/build-swift.ts", + "clean": "rm -rf swift/.build" + }, + "devDependencies": { + "@varlock/1password-plugin": "workspace:*", + "varlock": "workspace:*" + }, + "author": "dmno-dev", + "license": "MIT" +} diff --git a/packages/encryption-binary-swift/resources/AppIcon.icns b/packages/encryption-binary-swift/resources/AppIcon.icns new file mode 100644 index 0000000000000000000000000000000000000000..b1fc5d233c5da77fca383a1d581367cd579abdfb GIT binary patch literal 673866 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

uVaweH1;9Y)ZB=-{X>|y2sOwaAVy1)X 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

vp$pI5D(P5sQraJgxDG|>zq3Iu%6m|jS!>i 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
-i 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≪sSbSUBj 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¨k_L_f}s!X4F@ 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%0DE0^fY9z30VQ9}r4sS`Quox?lHkU~DD6mFLKDq% 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 0 ? args[idx + 1] : undefined; +} + +const universal = args.includes('--universal'); +const signingIdentity = getArg('--sign'); +const mode = (getArg('--mode') ?? 'dev') as 'dev' | 'preview' | 'release'; +const version = getArg('--version') ?? '0.0.0-dev'; + +// ── Paths ─────────────────────────────────────────────────────── + +const swiftDir = path.resolve(import.meta.dir, '..', 'swift'); +const binDir = path.resolve(import.meta.dir, '..', '..', 'varlock', 'native-bins', 'darwin'); +const binaryName = 'varlock-local-encrypt'; +const appBundleName = 'VarlockEnclave.app'; + +// ── Build mode config ─────────────────────────────────────────── + +interface BundleConfig { + bundleId: string; + displayName: string; + menuTitle: string; +} + +const BUNDLE_CONFIGS: Record = { + dev: { + bundleId: 'dev.varlock.enclave.dev', + displayName: 'Varlock (Dev)', + menuTitle: 'Varlock Enclave (Dev)', + }, + preview: { + bundleId: 'dev.varlock.enclave.preview', + displayName: 'Varlock (Preview)', + menuTitle: 'Varlock Enclave (Preview)', + }, + release: { + bundleId: 'dev.varlock.enclave', + displayName: 'Varlock', + menuTitle: 'Varlock Secure Enclave', + }, +}; + +const bundleConfig = BUNDLE_CONFIGS[mode]; +console.log(`Build mode: ${mode}`); +console.log(`Bundle ID: ${bundleConfig.bundleId}`); +console.log(`Display name: ${bundleConfig.displayName}`); + +function run(cmd: string, opts?: { cwd?: string }) { + console.log(`> ${cmd}`); + execSync(cmd, { stdio: 'inherit', cwd: opts?.cwd ?? swiftDir }); +} + +// ── Phase 1: Compile ──────────────────────────────────────────── + +fs.mkdirSync(binDir, { recursive: true }); + +let builtBinaryPath: string; + +if (universal) { + // Build universal binary (arm64 + x86_64) — used in CI + run('swift build -c release --arch arm64'); + run('swift build -c release --arch x86_64'); + + const arm64Binary = path.join(swiftDir, '.build', 'arm64-apple-macosx', 'release', 'VarlockEnclave'); + const x86Binary = path.join(swiftDir, '.build', 'x86_64-apple-macosx', 'release', 'VarlockEnclave'); + + builtBinaryPath = path.join(binDir, `${binaryName}-universal`); + run(`lipo -create "${arm64Binary}" "${x86Binary}" -output "${builtBinaryPath}"`); + run(`lipo -info "${builtBinaryPath}"`); +} else { + // Current platform only — fast for local dev + run('swift build -c release'); + builtBinaryPath = path.join(swiftDir, '.build', 'release', 'VarlockEnclave'); +} + +// ── Phase 2: Bundle ───────────────────────────────────────────── + +const appDir = path.join(binDir, appBundleName); +const contentsDir = path.join(appDir, 'Contents'); +const macosDir = path.join(contentsDir, 'MacOS'); +const resourcesDir = path.join(contentsDir, 'Resources'); + +// Clean previous bundle +fs.rmSync(appDir, { recursive: true, force: true }); +fs.mkdirSync(macosDir, { recursive: true }); +fs.mkdirSync(resourcesDir, { recursive: true }); + +// Copy binary into bundle +const bundleBinaryPath = path.join(macosDir, binaryName); +fs.copyFileSync(builtBinaryPath, bundleBinaryPath); +fs.chmodSync(bundleBinaryPath, 0o755); + +// Clean up temp universal binary if we created one +if (universal) { + fs.unlinkSync(builtBinaryPath); +} + +// Copy icon if it exists +const iconSrc = path.join(import.meta.dir, '..', 'resources', 'AppIcon.icns'); +const hasIcon = fs.existsSync(iconSrc); +if (hasIcon) { + fs.copyFileSync(iconSrc, path.join(resourcesDir, 'AppIcon.icns')); +} + +// Write Info.plist with environment-specific metadata +const infoPlist = ` + + + + CFBundleIdentifier + ${bundleConfig.bundleId} + CFBundleName + ${bundleConfig.displayName} + CFBundleDisplayName + ${bundleConfig.displayName} + CFBundleExecutable + ${binaryName} + CFBundlePackageType + APPL + CFBundleVersion + ${version} + CFBundleShortVersionString + ${version} + LSUIElement + + LSBackgroundOnly + ${hasIcon ? ` + CFBundleIconFile + AppIcon` : ''} + VarlockBuildMode + ${mode} + VarlockMenuTitle + ${bundleConfig.menuTitle} + +`; + +fs.writeFileSync(path.join(contentsDir, 'Info.plist'), infoPlist); + +console.log(`Built app bundle: ${appDir}`); + +// ── Codesign ──────────────────────────────────────────────────── + +if (signingIdentity) { + run(`codesign --force --deep --options runtime --sign "${signingIdentity}" "${appDir}"`); + run(`codesign --verify --verbose "${appDir}"`); + console.log('App bundle signed successfully'); +} else { + run(`codesign --force --deep --sign - "${appDir}"`); + console.log('App bundle ad-hoc signed (use --sign for proper signing)'); +} + +console.log('Done!'); diff --git a/packages/encryption-binary-swift/scripts/kill-daemon.ts b/packages/encryption-binary-swift/scripts/kill-daemon.ts new file mode 100644 index 00000000..919da7cf --- /dev/null +++ b/packages/encryption-binary-swift/scripts/kill-daemon.ts @@ -0,0 +1,47 @@ +#!/usr/bin/env bun + +/** + * Kill the running VarlockEnclave daemon (if any). + * + * Reads the PID from the local-encrypt daemon.pid, + * sends SIGTERM, and cleans up PID and socket files. + */ + +import path from 'node:path'; +import fs from 'node:fs'; +import { getUserVarlockDir } from '../../../packages/varlock/src/lib/user-config-dir'; + +const socketDir = path.join(getUserVarlockDir(), 'local-encrypt'); +const pidPath = path.join(socketDir, 'daemon.pid'); +const socketPath = path.join(socketDir, 'daemon.sock'); + +if (!fs.existsSync(pidPath)) { + console.log('No daemon PID file found, nothing to kill'); + process.exit(0); +} + +const pid = parseInt(fs.readFileSync(pidPath, 'utf-8').trim(), 10); +if (Number.isNaN(pid)) { + console.log('Invalid PID file, cleaning up'); + fs.unlinkSync(pidPath); + process.exit(0); +} + +try { + process.kill(pid, 'SIGTERM'); + console.log(`Killed daemon (PID ${pid})`); +} catch (err: any) { + if (err.code === 'ESRCH') { + console.log(`Daemon (PID ${pid}) was not running, cleaning up stale PID file`); + } else { + throw err; + } +} + +// Clean up PID and socket files +try { + fs.unlinkSync(pidPath); +} catch { /* ignore */ } +try { + fs.unlinkSync(socketPath); +} catch { /* ignore */ } diff --git a/packages/encryption-binary-swift/swift/Package.swift b/packages/encryption-binary-swift/swift/Package.swift new file mode 100644 index 00000000..0ada0708 --- /dev/null +++ b/packages/encryption-binary-swift/swift/Package.swift @@ -0,0 +1,20 @@ +// swift-tools-version: 5.9 +import PackageDescription + +let package = Package( + name: "VarlockEnclave", + platforms: [ + .macOS(.v13), + ], + targets: [ + .executableTarget( + name: "VarlockEnclave", + path: "Sources/VarlockEnclave", + linkerSettings: [ + .linkedFramework("Security"), + .linkedFramework("LocalAuthentication"), + .linkedFramework("AppKit"), + ] + ), + ] +) diff --git a/packages/encryption-binary-swift/swift/Sources/VarlockEnclave/IPCServer.swift b/packages/encryption-binary-swift/swift/Sources/VarlockEnclave/IPCServer.swift new file mode 100644 index 00000000..2d754675 --- /dev/null +++ b/packages/encryption-binary-swift/swift/Sources/VarlockEnclave/IPCServer.swift @@ -0,0 +1,217 @@ +import Foundation + +/// Unix domain socket IPC server using length-prefixed JSON protocol. +/// +/// Protocol: +/// - 4-byte little-endian message length +/// - JSON payload: { "id": "...", "action": "...", "payload": { ... } } +/// - Response: { "id": "...", "result": "..." } or { "id": "...", "error": "..." } +final class IPCServer { + private let socketPath: String + private var socketFD: Int32 = -1 + private var clientHandlers: [Int32: DispatchWorkItem] = [:] + private let queue = DispatchQueue(label: "dev.varlock.ipc", attributes: .concurrent) + private let handlersQueue = DispatchQueue(label: "dev.varlock.ipc.handlers") + private var isRunning = false + + /// Handler for incoming messages. Second parameter is the peer's TTY identity (nil if unknown). + var messageHandler: ((_ message: [String: Any], _ ttyId: String?) -> [String: Any])? + + /// Called after accept (new client) and after each successfully parsed JSON message. + var onConnectionActivity: (() -> Void)? + + init(socketPath: String) { + self.socketPath = socketPath + } + + // MARK: - Server Lifecycle + + func start() throws { + // Clean up any stale socket file + unlink(socketPath) + + // Ensure parent directory exists + let dir = (socketPath as NSString).deletingLastPathComponent + try FileManager.default.createDirectory(atPath: dir, withIntermediateDirectories: true) + + // Create socket + socketFD = socket(AF_UNIX, SOCK_STREAM, 0) + guard socketFD >= 0 else { + throw IPCError.socketCreationFailed(String(cString: strerror(errno))) + } + + // Bind + var addr = sockaddr_un() + addr.sun_family = sa_family_t(AF_UNIX) + withUnsafeMutablePointer(to: &addr.sun_path) { ptr in + socketPath.withCString { cstr in + _ = strcpy(UnsafeMutableRawPointer(ptr).assumingMemoryBound(to: CChar.self), cstr) + } + } + + let bindResult = withUnsafePointer(to: &addr) { ptr in + ptr.withMemoryRebound(to: sockaddr.self, capacity: 1) { sockaddrPtr in + bind(socketFD, sockaddrPtr, socklen_t(MemoryLayout.size)) + } + } + guard bindResult == 0 else { + close(socketFD) + throw IPCError.bindFailed(String(cString: strerror(errno))) + } + + // Set socket permissions (owner only) + chmod(socketPath, 0o600) + + // Listen + guard listen(socketFD, 5) == 0 else { + close(socketFD) + unlink(socketPath) + throw IPCError.listenFailed(String(cString: strerror(errno))) + } + + isRunning = true + + // Accept loop on background queue + queue.async { [weak self] in + self?.acceptLoop() + } + } + + func stop() { + isRunning = false + if socketFD >= 0 { + close(socketFD) + socketFD = -1 + } + unlink(socketPath) + + // Cancel all client handlers + handlersQueue.sync { + for (fd, work) in clientHandlers { + work.cancel() + close(fd) + } + clientHandlers.removeAll() + } + } + + // MARK: - Accept Loop + + private func acceptLoop() { + while isRunning { + var clientAddr = sockaddr_un() + var clientAddrLen = socklen_t(MemoryLayout.size) + + let clientFD = withUnsafeMutablePointer(to: &clientAddr) { ptr in + ptr.withMemoryRebound(to: sockaddr.self, capacity: 1) { sockaddrPtr in + accept(socketFD, sockaddrPtr, &clientAddrLen) + } + } + + guard clientFD >= 0 else { + if !isRunning { break } + continue + } + + onConnectionActivity?() + + let workItem = DispatchWorkItem { [weak self] in + self?.handleClient(fd: clientFD) + } + handlersQueue.sync { + clientHandlers[clientFD] = workItem + } + queue.async(execute: workItem) + } + } + + // MARK: - Client Handling + + private func handleClient(fd: Int32) { + defer { + close(fd) + handlersQueue.sync { + _ = clientHandlers.removeValue(forKey: fd) + } + } + + // Resolve the peer's TTY identity once per connection + let ttyId: String? + if let peerPid = getPeerPid(fd: fd) { + ttyId = getTtyIdentifier(forPid: peerPid) + } else { + ttyId = nil + } + + while isRunning { + // Read 4-byte length prefix (little-endian) + var lengthBytes = [UInt8](repeating: 0, count: 4) + let bytesRead = recv(fd, &lengthBytes, 4, MSG_WAITALL) + guard bytesRead == 4 else { break } + + let messageLength = Int(UInt32(lengthBytes[0]) + | (UInt32(lengthBytes[1]) << 8) + | (UInt32(lengthBytes[2]) << 16) + | (UInt32(lengthBytes[3]) << 24)) + + guard messageLength > 0, messageLength < 10_000_000 else { break } // 10MB safety limit + + // Read message body + var messageData = Data(count: messageLength) + let bodyRead = messageData.withUnsafeMutableBytes { ptr in + recv(fd, ptr.baseAddress!, messageLength, MSG_WAITALL) + } + guard bodyRead == messageLength else { break } + + // Parse JSON + guard let json = try? JSONSerialization.jsonObject(with: messageData) as? [String: Any] else { + sendResponse(fd: fd, response: ["error": "Invalid JSON"]) + continue + } + + onConnectionActivity?() + + // Handle message with the peer's TTY identity + let response = messageHandler?(json, ttyId) ?? ["error": "No handler"] + sendResponse(fd: fd, id: json["id"] as? String, response: response) + } + } + + private func sendResponse(fd: Int32, id: String? = nil, response: [String: Any]) { + var fullResponse = response + if let id = id { + fullResponse["id"] = id + } + + guard let jsonData = try? JSONSerialization.data(withJSONObject: fullResponse) else { + return + } + + // Write length prefix (4 bytes, little-endian) + var length = UInt32(jsonData.count).littleEndian + _ = withUnsafeBytes(of: &length) { ptr in + send(fd, ptr.baseAddress!, 4, 0) + } + + // Write message body + jsonData.withUnsafeBytes { ptr in + _ = send(fd, ptr.baseAddress!, jsonData.count, 0) + } + } +} + +// MARK: - Errors + +enum IPCError: LocalizedError { + case socketCreationFailed(String) + case bindFailed(String) + case listenFailed(String) + + var errorDescription: String? { + switch self { + case .socketCreationFailed(let msg): return "Socket creation failed: \(msg)" + case .bindFailed(let msg): return "Socket bind failed: \(msg)" + case .listenFailed(let msg): return "Socket listen failed: \(msg)" + } + } +} diff --git a/packages/encryption-binary-swift/swift/Sources/VarlockEnclave/PeerIdentity.swift b/packages/encryption-binary-swift/swift/Sources/VarlockEnclave/PeerIdentity.swift new file mode 100644 index 00000000..259a1e06 --- /dev/null +++ b/packages/encryption-binary-swift/swift/Sources/VarlockEnclave/PeerIdentity.swift @@ -0,0 +1,64 @@ +import Foundation +import Darwin + +// LOCAL_PEERPID may not be exported by Swift's Darwin module +private let LOCAL_PEERPID: Int32 = 0x002 + +/// Get the PID of the peer connected to a Unix domain socket. +func getPeerPid(fd: Int32) -> pid_t? { + var pid: pid_t = 0 + var pidSize = socklen_t(MemoryLayout.size) + let result = getsockopt(fd, SOL_LOCAL, LOCAL_PEERPID, &pid, &pidSize) + guard result == 0, pid > 0 else { return nil } + return pid +} + +/// Get process info via sysctl KERN_PROC. +private func getProcessInfo(pid: pid_t) -> kinfo_proc? { + var mib: [Int32] = [CTL_KERN, KERN_PROC, KERN_PROC_PID, pid] + var info = kinfo_proc() + var size = MemoryLayout.size + + let result = sysctl(&mib, UInt32(mib.count), &info, &size, nil, 0) + guard result == 0 else { return nil } + return info +} + +/// Get a stable TTY identifier for a process. +/// +/// Combines the TTY device name with the session leader's start time. +/// The session leader is the shell process that owns the TTY (its PID equals +/// the session ID). Using its start time prevents TTY device reuse attacks +/// (where a new terminal is allocated the same /dev/ttysNNN after the old one closed). +/// +/// Returns nil if the process has no controlling TTY (detached, CI, etc). +func getTtyIdentifier(forPid pid: pid_t) -> String? { + guard let info = getProcessInfo(pid: pid) else { return nil } + + let ttyDev = info.kp_eproc.e_tdev + // NODEV (0xFFFFFFFF) or 0 means no controlling tty + guard ttyDev != UInt32.max, ttyDev != 0 else { return nil } + + // Convert device number to name (e.g., "ttys003") + guard let namePtr = devname(dev_t(ttyDev), S_IFCHR) else { return nil } + let ttyName = String(cString: namePtr) + + // Get the session leader's start time for uniqueness. + // getsid() returns the session leader PID (the shell that owns the TTY), + // which is stable across all processes launched from the same terminal. + // (e_tpgid is the *foreground process group*, which changes on every command.) + let sessionLeaderPid = getsid(pid) + var startTimestamp: Int = 0 + + if sessionLeaderPid > 0, let leaderInfo = getProcessInfo(pid: sessionLeaderPid) { + startTimestamp = Int(leaderInfo.kp_proc.p_starttime.tv_sec) + } + + // If we couldn't get the session leader start time, fall back to the + // connecting process's own start time (less ideal but still unique per session) + if startTimestamp == 0 { + startTimestamp = Int(info.kp_proc.p_starttime.tv_sec) + } + + return "\(ttyName):\(startTimestamp)" +} diff --git a/packages/encryption-binary-swift/swift/Sources/VarlockEnclave/SecureEnclaveManager.swift b/packages/encryption-binary-swift/swift/Sources/VarlockEnclave/SecureEnclaveManager.swift new file mode 100644 index 00000000..e70bcb70 --- /dev/null +++ b/packages/encryption-binary-swift/swift/Sources/VarlockEnclave/SecureEnclaveManager.swift @@ -0,0 +1,299 @@ +import Foundation +import Security +import LocalAuthentication +import CryptoKit + +/// Manages Secure Enclave key operations and ECIES encrypt/decrypt. +/// +/// Uses CryptoKit's SecureEnclave.P256 API. Key "data representations" (opaque handles +/// to the SE key, NOT the private key itself) are stored as files on disk. +/// This avoids Keychain entitlement requirements that plague CLI tools. +/// +/// Crypto scheme: +/// - P-256 key stored in Secure Enclave with biometric access control +/// - ECIES: ephemeral P-256 key pair → ECDH → HKDF-SHA256 → AES-256-GCM +/// - Payload: version(1) | ephemeralPubKey(65) | nonce(12) | ciphertext(N) | tag(16) +final class SecureEnclaveManager { + static let payloadVersion: UInt8 = 0x01 + + /// Directory where key data representations are stored + static var keyStorePath: String { + let xdg = ProcessInfo.processInfo.environment["XDG_CONFIG_HOME"] + let base = xdg ?? (NSHomeDirectory() + "/.config") + return base + "/varlock/secure-enclave/keys" + } + + private static func keyFilePath(for keyId: String) -> String { + return keyStorePath + "/\(keyId).keydata" + } + + // MARK: - Key Management + + /// Create a new Secure Enclave P-256 key with user-presence access control. + /// Accepts Touch ID, Apple Watch, or device password as authentication. + /// Saves the key data representation to disk and returns the public key. + static func generateKey(keyId: String, context: LAContext? = nil) throws -> Data { + // Create access control requiring user presence (biometric or password) + var accessError: Unmanaged? + guard let accessControl = SecAccessControlCreateWithFlags( + kCFAllocatorDefault, + kSecAttrAccessibleWhenUnlockedThisDeviceOnly, + [.privateKeyUsage, .userPresence], + &accessError + ) else { + let err = accessError?.takeRetainedValue() + throw EnclaveError.keyGenerationFailed(err?.localizedDescription ?? "Failed to create access control") + } + + // Generate the SE key via CryptoKit + let privateKey: SecureEnclave.P256.KeyAgreement.PrivateKey + do { + if let context = context { + privateKey = try SecureEnclave.P256.KeyAgreement.PrivateKey( + accessControl: accessControl, + authenticationContext: context + ) + } else { + privateKey = try SecureEnclave.P256.KeyAgreement.PrivateKey( + accessControl: accessControl + ) + } + } catch { + throw EnclaveError.keyGenerationFailed(error.localizedDescription) + } + + // Save the data representation (an opaque handle, NOT the private key) + let dataRepresentation = privateKey.dataRepresentation + let filePath = keyFilePath(for: keyId) + let dir = (filePath as NSString).deletingLastPathComponent + try FileManager.default.createDirectory(atPath: dir, withIntermediateDirectories: true) + try dataRepresentation.write(to: URL(fileURLWithPath: filePath)) + + // Set file permissions to owner-only + try FileManager.default.setAttributes( + [.posixPermissions: 0o600], + ofItemAtPath: filePath + ) + + return Data(privateKey.publicKey.x963Representation) + } + + /// Delete a key by removing its data representation file. + static func deleteKey(keyId: String) -> Bool { + let filePath = keyFilePath(for: keyId) + do { + try FileManager.default.removeItem(atPath: filePath) + return true + } catch { + return false + } + } + + /// List key IDs by scanning the key store directory. + static func listKeys() -> [String] { + let dir = keyStorePath + guard let files = try? FileManager.default.contentsOfDirectory(atPath: dir) else { + return [] + } + return files + .filter { $0.hasSuffix(".keydata") } + .map { String($0.dropLast(".keydata".count)) } + } + + /// Check if a key exists. + static func keyExists(keyId: String) -> Bool { + return FileManager.default.fileExists(atPath: keyFilePath(for: keyId)) + } + + // MARK: - Key Loading + + /// Load a Secure Enclave private key from its stored data representation. + private static func loadPrivateKey(keyId: String, context: LAContext?) throws -> SecureEnclave.P256.KeyAgreement.PrivateKey { + let filePath = keyFilePath(for: keyId) + guard let data = FileManager.default.contents(atPath: filePath) else { + throw EnclaveError.keyNotFound(keyId) + } + + do { + if let context = context { + return try SecureEnclave.P256.KeyAgreement.PrivateKey( + dataRepresentation: data, + authenticationContext: context + ) + } else { + return try SecureEnclave.P256.KeyAgreement.PrivateKey( + dataRepresentation: data + ) + } + } catch { + throw EnclaveError.keyNotFound("\(keyId) - \(error.localizedDescription)") + } + } + + // MARK: - ECIES Encrypt + + /// Encrypt plaintext using ECIES with the Secure Enclave key. + /// + /// Only needs the public key, so no biometric auth required for encryption. + /// Steps: + /// 1. Load SE key to get public key + /// 2. Generate ephemeral P-256 key pair + /// 3. ECDH: ephemeral private × SE public → shared secret + /// 4. HKDF-SHA256 derive AES-256-GCM key + /// 5. AES-256-GCM encrypt + /// 6. Return: version | ephemeralPub | nonce | ciphertext | tag + static func encrypt(plaintext: Data, keyId: String) throws -> Data { + let seKey = try loadPrivateKey(keyId: keyId, context: nil) + let sePublicKey = seKey.publicKey + let pubKeyData = Data(sePublicKey.x963Representation) + + // Generate ephemeral key pair (in software, not SE) + let ephemeralPrivateKey = P256.KeyAgreement.PrivateKey() + let ephemeralPublicKeyData = Data(ephemeralPrivateKey.publicKey.x963Representation) // 65 bytes + + // ECDH: ephemeral private × SE public + let sharedSecret = try ephemeralPrivateKey.sharedSecretFromKeyAgreement(with: sePublicKey) + + // Extract raw shared secret bytes for HKDF + let sharedSecretData = sharedSecret.withUnsafeBytes { Data($0) } + + // HKDF derive AES-256 key (using manual HKDF to match decrypt path) + let symmetricKey = SecureEnclaveManager.deriveKey( + sharedSecret: sharedSecretData, + salt: Data("varlock-ecies-v1".utf8), + info: ephemeralPublicKeyData + pubKeyData, + outputByteCount: 32 + ) + + // AES-256-GCM encrypt + let sealedBox = try AES.GCM.seal(plaintext, using: symmetricKey) + + // Assemble payload: version(1) | ephemeralPub(65) | nonce(12) | ciphertext(N) | tag(16) + var payload = Data() + payload.append(SecureEnclaveManager.payloadVersion) + payload.append(ephemeralPublicKeyData) // 65 bytes + payload.append(contentsOf: sealedBox.nonce) // 12 bytes + payload.append(sealedBox.ciphertext) // N bytes + payload.append(sealedBox.tag) // 16 bytes + + return payload + } + + // MARK: - ECIES Decrypt + + /// Decrypt ciphertext using ECIES with the Secure Enclave key. + /// Uses the provided LAContext for biometric session caching. + /// + /// Steps: + /// 1. Parse payload components + /// 2. Load SE private key with LAContext (uses cached biometric) + /// 3. ECDH: SE private × ephemeral public → shared secret + /// 4. HKDF-SHA256 derive AES-256-GCM key + /// 5. AES-256-GCM decrypt + static func decrypt(payload: Data, keyId: String, context: LAContext?) throws -> Data { + // Parse payload + guard payload.count > 1 + 65 + 12 + 16 else { + throw EnclaveError.decryptionFailed("Payload too short") + } + + let version = payload[0] + guard version == SecureEnclaveManager.payloadVersion else { + throw EnclaveError.decryptionFailed("Unsupported payload version: \(version)") + } + + let ephemeralPubKeyData = payload[1..<66] // 65 bytes + let nonce = payload[66..<78] // 12 bytes + let ciphertextAndTag = payload[78...] + guard ciphertextAndTag.count >= 16 else { + throw EnclaveError.decryptionFailed("Payload too short for tag") + } + let ciphertext = ciphertextAndTag.dropLast(16) + let tag = ciphertextAndTag.suffix(16) + + // Load SE private key with LAContext for cached biometric session + let seKey = try loadPrivateKey(keyId: keyId, context: context) + let pubKeyData = Data(seKey.publicKey.x963Representation) + + // Reconstruct ephemeral public key + let ephemeralPublicKey = try P256.KeyAgreement.PublicKey(x963Representation: ephemeralPubKeyData) + + // ECDH: SE private × ephemeral public + // CryptoKit's SecureEnclave key performs the ECDH inside the SE + let sharedSecret = try seKey.sharedSecretFromKeyAgreement(with: ephemeralPublicKey) + let sharedSecretData = sharedSecret.withUnsafeBytes { Data($0) } + + // Derive symmetric key using HKDF (must match encrypt side) + let symmetricKey = SecureEnclaveManager.deriveKey( + sharedSecret: sharedSecretData, + salt: Data("varlock-ecies-v1".utf8), + info: Data(ephemeralPubKeyData) + pubKeyData, + outputByteCount: 32 + ) + + // AES-256-GCM decrypt + let gcmNonce = try AES.GCM.Nonce(data: nonce) + let sealedBox = try AES.GCM.SealedBox(nonce: gcmNonce, ciphertext: ciphertext, tag: tag) + let decrypted = try AES.GCM.open(sealedBox, using: symmetricKey) + + return decrypted + } +} + +// MARK: - HKDF + +// We implement HKDF manually so both encrypt and decrypt paths are consistent. +// On the encrypt side we could use CryptoKit's built-in HKDF via SharedSecret, +// but on the decrypt side the SE key's sharedSecretFromKeyAgreement also returns +// a SharedSecret, so actually both paths are consistent now. +// Keeping manual HKDF for explicitness and in case we ever need raw SecKey ECDH. +extension SecureEnclaveManager { + /// HKDF-SHA256 key derivation from raw shared secret bytes. + static func deriveKey( + sharedSecret: Data, + salt: Data, + info: Data, + outputByteCount: Int + ) -> SymmetricKey { + // HKDF-Extract + let prk = HMAC.authenticationCode(for: sharedSecret, using: SymmetricKey(data: salt)) + let prkData = Data(prk) + + // HKDF-Expand + var okm = Data() + var t = Data() + var counter: UInt8 = 1 + + while okm.count < outputByteCount { + var input = t + input.append(info) + input.append(counter) + t = Data(HMAC.authenticationCode(for: input, using: SymmetricKey(data: prkData))) + okm.append(t) + counter += 1 + } + + return SymmetricKey(data: okm.prefix(outputByteCount)) + } +} + +// MARK: - Error Types + +enum EnclaveError: LocalizedError { + case keyGenerationFailed(String) + case keyNotFound(String) + case encryptionFailed(String) + case decryptionFailed(String) + case biometricFailed(String) + case notSupported(String) + + var errorDescription: String? { + switch self { + case .keyGenerationFailed(let msg): return "Key generation failed: \(msg)" + case .keyNotFound(let keyId): return "Key not found: \(keyId)" + case .encryptionFailed(let msg): return "Encryption failed: \(msg)" + case .decryptionFailed(let msg): return "Decryption failed: \(msg)" + case .biometricFailed(let msg): return "Biometric authentication failed: \(msg)" + case .notSupported(let msg): return "Not supported: \(msg)" + } + } +} diff --git a/packages/encryption-binary-swift/swift/Sources/VarlockEnclave/SecureInputDialog.swift b/packages/encryption-binary-swift/swift/Sources/VarlockEnclave/SecureInputDialog.swift new file mode 100644 index 00000000..c3ba4387 --- /dev/null +++ b/packages/encryption-binary-swift/swift/Sources/VarlockEnclave/SecureInputDialog.swift @@ -0,0 +1,74 @@ +import AppKit + +/// Shows a native macOS dialog with a secure text field for entering secrets. +/// Runs on the main thread and blocks until the user submits or cancels. +final class SecureInputDialog { + /// Show a secure input dialog and return the entered text, or nil if cancelled. + static func prompt(title: String, message: String, itemKey: String?) -> String? { + var result: String? + let work = { + // Ensure the app has an Edit menu so Cmd+V/C/X/A work in text fields. + // NSAlert doesn't create one, so keyboard shortcuts are dead without this. + ensureEditMenu() + + let alert = NSAlert() + alert.messageText = title + alert.informativeText = message + alert.alertStyle = .informational + alert.addButton(withTitle: "Encrypt") + alert.addButton(withTitle: "Cancel") + + let inputField = NSSecureTextField(frame: NSRect(x: 0, y: 0, width: 300, height: 24)) + inputField.placeholderString = "Enter or paste secret value..." + alert.accessoryView = inputField + + // Set the window title to include the item key for context + let appName = Bundle.main.object(forInfoDictionaryKey: "CFBundleDisplayName") as? String ?? "Varlock" + alert.window.title = itemKey.map { "\(appName) — \($0)" } ?? appName + + // Bring the app to front so the dialog is visible + NSApp.activate(ignoringOtherApps: true) + + // Make the input field the first responder after the alert is shown + alert.window.initialFirstResponder = inputField + + let response = alert.runModal() + if response == .alertFirstButtonReturn { + let value = inputField.stringValue + if !value.isEmpty { + result = value + } + } + } + + if Thread.isMainThread { + work() + } else { + DispatchQueue.main.sync { work() } + } + + return result + } + + /// Create a minimal Edit menu so standard keyboard shortcuts work. + /// Safe to call multiple times — only creates the menu once. + private static var editMenuInstalled = false + private static func ensureEditMenu() { + guard !editMenuInstalled else { return } + editMenuInstalled = true + + let mainMenu = NSApp.mainMenu ?? NSMenu() + + let editMenuItem = NSMenuItem(title: "Edit", action: nil, keyEquivalent: "") + let editMenu = NSMenu(title: "Edit") + + editMenu.addItem(withTitle: "Cut", action: #selector(NSText.cut(_:)), keyEquivalent: "x") + editMenu.addItem(withTitle: "Copy", action: #selector(NSText.copy(_:)), keyEquivalent: "c") + editMenu.addItem(withTitle: "Paste", action: #selector(NSText.paste(_:)), keyEquivalent: "v") + editMenu.addItem(withTitle: "Select All", action: #selector(NSText.selectAll(_:)), keyEquivalent: "a") + + editMenuItem.submenu = editMenu + mainMenu.addItem(editMenuItem) + NSApp.mainMenu = mainMenu + } +} diff --git a/packages/encryption-binary-swift/swift/Sources/VarlockEnclave/SessionManager.swift b/packages/encryption-binary-swift/swift/Sources/VarlockEnclave/SessionManager.swift new file mode 100644 index 00000000..9c2d7e39 --- /dev/null +++ b/packages/encryption-binary-swift/swift/Sources/VarlockEnclave/SessionManager.swift @@ -0,0 +1,186 @@ +import Foundation +import LocalAuthentication +import AppKit + +/// Manages biometric authentication sessions for the daemon, scoped per-TTY. +/// +/// Each terminal must independently authenticate via Touch ID. This prevents +/// rogue processes in other terminals from piggybacking on an existing session. +/// +/// Biometric reuse timeout is handled by macOS via `touchIDAuthenticationAllowableReuseDuration`. +/// This manager handles per-TTY scoping, explicit invalidation (lock command), +/// and system events (sleep, screen lock). +final class SessionManager { + /// How long Touch ID stays unlocked per terminal before re-prompting (seconds). + /// Passed to macOS via `touchIDAuthenticationAllowableReuseDuration`. + static let sessionTimeout: TimeInterval = 300 // 5 minutes + + /// How long the daemon stays alive with no connections at all + static let daemonInactivityTimeout: TimeInterval = 1800 // 30 minutes + + /// Fallback key for processes without a controlling terminal + static let noTtyFallback = "__no_tty__" + + /// Per-TTY cached LAContext (macOS owns the timeout via reuse duration) + private var contexts: [String: LAContext] = [:] + private let queue = DispatchQueue(label: "dev.varlock.session") + + /// Called when the daemon should shut down due to inactivity + var onDaemonTimeout: (() -> Void)? + + private var daemonTimer: DispatchSourceTimer? + + init() { + setupSystemNotifications() + resetDaemonTimer() + } + + deinit { + daemonTimer?.cancel() + } + + // MARK: - Public API + + /// Get or create an authenticated LAContext for the given TTY. + /// On first call per TTY, triggers Touch ID. Subsequent calls within the + /// reuse duration return the cached context without re-prompting. + func getAuthenticatedContext(ttyId: String?) throws -> LAContext { + let key = ttyId ?? SessionManager.noTtyFallback + + return try queue.sync { + // Return cached context if available — macOS handles expiry + // via touchIDAuthenticationAllowableReuseDuration + if let context = contexts[key] { + resetDaemonTimer() + return context + } + + // Need fresh auth for this TTY + let context = LAContext() + context.touchIDAuthenticationAllowableReuseDuration = SessionManager.sessionTimeout + + // Use deviceOwnerAuthentication which accepts Touch ID, Apple Watch, + // or device password — works on machines without biometrics and + // supports the "Use Password" fallback in the Touch ID dialog. + var authError: NSError? + guard context.canEvaluatePolicy(.deviceOwnerAuthentication, error: &authError) else { + let msg = authError?.localizedDescription ?? "Authentication not available" + throw EnclaveError.biometricFailed(msg) + } + + // Synchronous authentication evaluation + let semaphore = DispatchSemaphore(value: 0) + var evalError: Error? + + context.evaluatePolicy( + .deviceOwnerAuthentication, + localizedReason: "decrypt your secrets" + ) { success, error in + if !success { + evalError = error + } + semaphore.signal() + } + + semaphore.wait() + + if let error = evalError { + throw EnclaveError.biometricFailed(error.localizedDescription) + } + + // Cache the authenticated context for this TTY + contexts[key] = context + resetDaemonTimer() + + return context + } + } + + /// Invalidate all TTY sessions (used by lock command, sleep/lock events). + func invalidateAllSessions() { + queue.sync { + for (_, context) in contexts { + context.invalidate() + } + contexts.removeAll() + } + } + + /// Resets the daemon shutdown timer (no Touch ID). Call for any IPC so the + /// process stays up while clients use ping, encrypt, etc., not only decrypt. + func noteIpcActivity() { + queue.async { [weak self] in + self?.resetDaemonTimer() + } + } + + /// Whether the given TTY has a cached session. + /// Note: the session may still re-prompt if macOS's reuse duration has expired. + func isSessionWarm(ttyId: String?) -> Bool { + let key = ttyId ?? SessionManager.noTtyFallback + return queue.sync { + return contexts[key] != nil + } + } + + /// Whether any TTY has a cached session. + func hasAnySessions() -> Bool { + return queue.sync { + return !contexts.isEmpty + } + } + + // MARK: - Private + + private func resetDaemonTimer() { + daemonTimer?.cancel() + let timer = DispatchSource.makeTimerSource(queue: queue) + timer.schedule(deadline: .now() + SessionManager.daemonInactivityTimeout) + timer.setEventHandler { [weak self] in + self?.onDaemonTimeout?() + } + timer.resume() + daemonTimer = timer + } + + // MARK: - System Notifications + + private func setupSystemNotifications() { + let workspace = NSWorkspace.shared + let notificationCenter = workspace.notificationCenter + + // Screen lock / sleep → invalidate ALL sessions + notificationCenter.addObserver( + forName: NSWorkspace.willSleepNotification, + object: nil, + queue: .main + ) { [weak self] _ in + self?.invalidateAllSessions() + } + + notificationCenter.addObserver( + forName: NSWorkspace.sessionDidResignActiveNotification, + object: nil, + queue: .main + ) { [weak self] _ in + self?.invalidateAllSessions() + } + + notificationCenter.addObserver( + forName: NSWorkspace.screensDidSleepNotification, + object: nil, + queue: .main + ) { [weak self] _ in + self?.invalidateAllSessions() + } + + // Also invalidate when screens lock (available on macOS 13+) + DistributedNotificationCenter.default().addObserver( + forName: NSNotification.Name("com.apple.screenIsLocked"), + object: nil, + queue: .main + ) { [weak self] _ in + self?.invalidateAllSessions() + } + } +} diff --git a/packages/encryption-binary-swift/swift/Sources/VarlockEnclave/StatusBarMenu.swift b/packages/encryption-binary-swift/swift/Sources/VarlockEnclave/StatusBarMenu.swift new file mode 100644 index 00000000..0078ab94 --- /dev/null +++ b/packages/encryption-binary-swift/swift/Sources/VarlockEnclave/StatusBarMenu.swift @@ -0,0 +1,106 @@ +import AppKit + +/// Manages the macOS menu bar status item for the Varlock Enclave daemon. +final class StatusBarMenu: NSObject, NSMenuDelegate { + private var statusItem: NSStatusItem? + private let menu = NSMenu() + private let sessionManager: SessionManager + private let onLock: () -> Void + private let onQuit: () -> Void + + init( + sessionManager: SessionManager, + onLock: @escaping () -> Void, + onQuit: @escaping () -> Void + ) { + self.sessionManager = sessionManager + self.onLock = onLock + self.onQuit = onQuit + super.init() + setupStatusItem() + } + + private func setupStatusItem() { + statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.squareLength) + + guard let button = statusItem?.button else { return } + updateIcon() + let menuTitle = Bundle.main.object(forInfoDictionaryKey: "VarlockMenuTitle") as? String ?? "Varlock Secure Enclave" + button.toolTip = menuTitle + + menu.delegate = self + statusItem?.menu = menu + rebuildMenuItems() + } + + private func updateIcon() { + guard let button = statusItem?.button else { return } + let hasActiveSessions = sessionManager.hasAnySessions() + button.image = nil + button.title = hasActiveSessions ? "🔓" : "🔒" + } + + // NSMenuDelegate — update items and icon each time the menu opens + func menuWillOpen(_ menu: NSMenu) { + updateIcon() + rebuildMenuItems() + } + + private func rebuildMenuItems() { + menu.removeAllItems() + + // Header + let menuTitle = Bundle.main.object(forInfoDictionaryKey: "VarlockMenuTitle") as? String ?? "Varlock Secure Enclave" + let headerItem = NSMenuItem(title: menuTitle, action: nil, keyEquivalent: "") + headerItem.isEnabled = false + menu.addItem(headerItem) + + menu.addItem(NSMenuItem.separator()) + + // Lock action — disabled with status text when already locked + let hasActiveSessions = sessionManager.hasAnySessions() + if hasActiveSessions { + let lockItem = NSMenuItem(title: "Lock", action: #selector(lockClicked), keyEquivalent: "l") + lockItem.target = self + menu.addItem(lockItem) + } else { + let lockedItem = NSMenuItem(title: "Locked", action: nil, keyEquivalent: "") + lockedItem.isEnabled = false + menu.addItem(lockedItem) + } + + menu.addItem(NSMenuItem.separator()) + + // Quit + let quitItem = NSMenuItem(title: "Quit Daemon", action: #selector(quitClicked), keyEquivalent: "q") + quitItem.target = self + menu.addItem(quitItem) + } + + @objc private func lockClicked() { + onLock() + updateIcon() + } + + @objc private func quitClicked() { + onQuit() + } + + /// Call from any thread after a session state change to update the icon + func refresh() { + // Use performSelector to ensure the update runs in the next run loop iteration + // on the main thread — more reliable than DispatchQueue.main.async with NSApplication + performSelector(onMainThread: #selector(doRefresh), with: nil, waitUntilDone: false) + } + + @objc private func doRefresh() { + updateIcon() + } + + func remove() { + if let item = statusItem { + NSStatusBar.system.removeStatusItem(item) + statusItem = nil + } + } +} diff --git a/packages/encryption-binary-swift/swift/Sources/VarlockEnclave/main.swift b/packages/encryption-binary-swift/swift/Sources/VarlockEnclave/main.swift new file mode 100644 index 00000000..bb0ac8a4 --- /dev/null +++ b/packages/encryption-binary-swift/swift/Sources/VarlockEnclave/main.swift @@ -0,0 +1,349 @@ +import Foundation +import AppKit + +// MARK: - JSON Output Helpers + +func jsonOutput(_ dict: [String: Any]) { + guard let data = try? JSONSerialization.data(withJSONObject: dict), + let str = String(data: data, encoding: .utf8) else { + fputs("{\"error\":\"Failed to serialize output\"}\n", stderr) + exit(1) + } + print(str) +} + +func jsonError(_ message: String) -> Never { + jsonOutput(["error": message]) + exit(1) +} + +func jsonSuccess(_ result: [String: Any]) -> Never { + jsonOutput(["ok": true].merging(result) { _, new in new }) + exit(0) +} + +// MARK: - CLI Parsing + +let args = CommandLine.arguments +let command = args.count > 1 ? args[1] : "help" + +func getArg(_ flag: String) -> String? { + guard let idx = args.firstIndex(of: flag), idx + 1 < args.count else { return nil } + return args[idx + 1] +} + +let defaultKeyId = "varlock-default" + +switch command { + +// MARK: - generate-key + +case "generate-key": + let keyId = getArg("--key-id") ?? defaultKeyId + + do { + let pubKeyData = try SecureEnclaveManager.generateKey(keyId: keyId) + jsonSuccess([ + "keyId": keyId, + "publicKey": pubKeyData.base64EncodedString(), + "publicKeyBytes": pubKeyData.count, + ]) + } catch { + jsonError(error.localizedDescription) + } + +// MARK: - delete-key + +case "delete-key": + let keyId = getArg("--key-id") ?? defaultKeyId + let deleted = SecureEnclaveManager.deleteKey(keyId: keyId) + jsonSuccess(["keyId": keyId, "deleted": deleted]) + +// MARK: - list-keys + +case "list-keys": + let keys = SecureEnclaveManager.listKeys() + jsonSuccess(["keys": keys]) + +// MARK: - key-exists + +case "key-exists": + let keyId = getArg("--key-id") ?? defaultKeyId + let exists = SecureEnclaveManager.keyExists(keyId: keyId) + jsonSuccess(["keyId": keyId, "exists": exists]) + +// MARK: - encrypt + +case "encrypt": + let keyId = getArg("--key-id") ?? defaultKeyId + + guard let dataB64 = getArg("--data") else { + jsonError("Missing --data argument (base64-encoded plaintext)") + } + guard let plaintext = Data(base64Encoded: dataB64) else { + jsonError("Invalid base64 data") + } + + do { + let encrypted = try SecureEnclaveManager.encrypt(plaintext: plaintext, keyId: keyId) + jsonSuccess(["ciphertext": encrypted.base64EncodedString()]) + } catch { + jsonError(error.localizedDescription) + } + +// MARK: - decrypt (one-shot, for testing) + +case "decrypt": + let keyId = getArg("--key-id") ?? defaultKeyId + + guard let dataB64 = getArg("--data") else { + jsonError("Missing --data argument (base64-encoded ciphertext)") + } + guard let ciphertext = Data(base64Encoded: dataB64) else { + jsonError("Invalid base64 data") + } + + do { + let decrypted = try SecureEnclaveManager.decrypt(payload: ciphertext, keyId: keyId, context: nil) + guard let plaintext = String(data: decrypted, encoding: .utf8) else { + jsonError("Decrypted data is not valid UTF-8") + } + jsonSuccess(["plaintext": plaintext]) + } catch { + jsonError(error.localizedDescription) + } + +// MARK: - status + +case "status": + let seAvailable: Bool + #if targetEnvironment(simulator) + seAvailable = false + #else + seAvailable = true // If this binary runs on real hardware, SE is available + #endif + + jsonSuccess([ + "secureEnclaveAvailable": seAvailable, + "platform": "darwin", + "arch": { + #if arch(arm64) + return "arm64" + #elseif arch(x86_64) + return "x86_64" + #else + return "unknown" + #endif + }(), + "keys": SecureEnclaveManager.listKeys(), + ]) + +// MARK: - daemon + +case "daemon": + guard let socketPath = getArg("--socket-path") else { + jsonError("Missing --socket-path argument") + } + + let sessionManager = SessionManager() + let server = IPCServer(socketPath: socketPath) + + // Write PID file + let pidPath = getArg("--pid-path") + if let pidPath = pidPath { + let pidDir = (pidPath as NSString).deletingLastPathComponent + try? FileManager.default.createDirectory(atPath: pidDir, withIntermediateDirectories: true) + try? "\(ProcessInfo.processInfo.processIdentifier)".write(toFile: pidPath, atomically: true, encoding: .utf8) + } + + // Status bar menu (must be created before run loop starts) + // NSApplication is needed for status bar items to work + let app = NSApplication.shared + app.setActivationPolicy(.accessory) // no Dock icon + + var statusBarMenu: StatusBarMenu? + + // Handle daemon shutdown + func shutdownDaemon() { + statusBarMenu?.remove() + server.stop() + if let pidPath = pidPath { + try? FileManager.default.removeItem(atPath: pidPath) + } + exit(0) + } + + sessionManager.onDaemonTimeout = { + shutdownDaemon() + } + + server.onConnectionActivity = { + sessionManager.noteIpcActivity() + } + + // Handle IPC messages (ttyId is resolved from the peer's controlling terminal) + server.messageHandler = { message, ttyId in + guard let action = message["action"] as? String else { + return ["error": "Missing action"] + } + + switch action { + case "decrypt": + guard let payload = message["payload"] as? [String: Any], + let ciphertextB64 = payload["ciphertext"] as? String, + let ciphertext = Data(base64Encoded: ciphertextB64) else { + return ["error": "Missing or invalid ciphertext in payload"] + } + + let keyId = (payload["keyId"] as? String) ?? defaultKeyId + + do { + let context = try sessionManager.getAuthenticatedContext(ttyId: ttyId) + let decrypted = try SecureEnclaveManager.decrypt( + payload: ciphertext, + keyId: keyId, + context: context + ) + guard let plaintext = String(data: decrypted, encoding: .utf8) else { + return ["error": "Decrypted data is not valid UTF-8"] + } + statusBarMenu?.refresh() + return ["result": plaintext] + } catch { + return ["error": error.localizedDescription] + } + + case "ping": + return [ + "result": [ + "pong": true, + "sessionWarm": sessionManager.isSessionWarm(ttyId: ttyId), + "ttyId": ttyId as Any, + ], + ] + + case "encrypt": + guard let payload = message["payload"] as? [String: Any], + let plaintextStr = payload["plaintext"] as? String else { + return ["error": "Missing plaintext in payload"] + } + + let encKeyId = (payload["keyId"] as? String) ?? defaultKeyId + guard let plaintextData = plaintextStr.data(using: .utf8) else { + return ["error": "Plaintext is not valid UTF-8"] + } + + do { + let encrypted = try SecureEnclaveManager.encrypt(plaintext: plaintextData, keyId: encKeyId) + return ["result": encrypted.base64EncodedString()] + } catch { + return ["error": error.localizedDescription] + } + + case "prompt-secret": + let promptPayload = message["payload"] as? [String: Any] + let itemKey = promptPayload?["itemKey"] as? String + let promptMessage = promptPayload?["message"] as? String + ?? "Enter the secret value to encrypt:" + + guard let value = SecureInputDialog.prompt( + title: "Varlock — Enter Secret", + message: promptMessage, + itemKey: itemKey + ) else { + return ["error": "cancelled"] + } + + // Encrypt the entered value immediately + let promptKeyId = (promptPayload?["keyId"] as? String) ?? defaultKeyId + guard let valueData = value.data(using: .utf8) else { + return ["error": "Value is not valid UTF-8"] + } + + do { + let encrypted = try SecureEnclaveManager.encrypt(plaintext: valueData, keyId: promptKeyId) + return ["result": [ + "ciphertext": encrypted.base64EncodedString(), + ]] + } catch { + return ["error": error.localizedDescription] + } + + case "invalidate-session": + sessionManager.invalidateAllSessions() + statusBarMenu?.refresh() + return ["result": "all sessions invalidated"] + + default: + return ["error": "Unknown action: \(action)"] + } + } + + // Start server + do { + try server.start() + + // Print ready message to stdout so the JS launcher knows we're ready + jsonOutput(["ready": true, "pid": ProcessInfo.processInfo.processIdentifier, "socketPath": socketPath]) + fflush(stdout) + + // Set up status bar menu + statusBarMenu = StatusBarMenu( + sessionManager: sessionManager, + onLock: { + sessionManager.invalidateAllSessions() + statusBarMenu?.refresh() + }, + onQuit: { + shutdownDaemon() + } + ) + + // We need a run loop for NSWorkspace notifications (sleep/lock detection) + // and for the status bar menu to work + signal(SIGTERM, SIG_IGN) + signal(SIGINT, SIG_IGN) + + let sigTermSource = DispatchSource.makeSignalSource(signal: SIGTERM, queue: .main) + sigTermSource.setEventHandler { shutdownDaemon() } + sigTermSource.resume() + + let sigIntSource = DispatchSource.makeSignalSource(signal: SIGINT, queue: .main) + sigIntSource.setEventHandler { shutdownDaemon() } + sigIntSource.resume() + + app.run() + } catch { + jsonError("Failed to start daemon: \(error.localizedDescription)") + } + +// MARK: - help + +case "help", "--help", "-h": + let help = """ + varlock-enclave - Secure Enclave encryption daemon for Varlock + + COMMANDS: + generate-key [--key-id ] Create a new Secure Enclave key + delete-key [--key-id ] Delete a Secure Enclave key + list-keys List all Varlock Secure Enclave keys + key-exists [--key-id ] Check if a key exists + encrypt --data [--key-id ] Encrypt data (one-shot) + decrypt --data [--key-id ] Decrypt data (one-shot, testing) + status Check Secure Enclave availability + daemon --socket-path [--pid-path ] Start IPC daemon + + OPTIONS: + --key-id Key identifier (default: varlock-default) + --data Base64-encoded data + --socket-path Unix socket path for daemon mode + --pid-path PID file path for daemon mode + + All output is JSON. Errors return {"error": "message"}. + """ + print(help) + exit(0) + +default: + jsonError("Unknown command: \(command). Run with --help for usage.") +} diff --git a/packages/varlock/.gitignore b/packages/varlock/.gitignore index 5b1113d9..e6f1c68f 100644 --- a/packages/varlock/.gitignore +++ b/packages/varlock/.gitignore @@ -1,2 +1,3 @@ dist -dist-sea \ No newline at end of file +dist-sea +native-bins diff --git a/packages/varlock/package.json b/packages/varlock/package.json index cf0df48a..5fad62d9 100644 --- a/packages/varlock/package.json +++ b/packages/varlock/package.json @@ -44,7 +44,8 @@ ], "files": [ "/bin", - "/dist" + "/dist", + "/native-bins" ], "bin": { "varlock": "./bin/cli.js" diff --git a/packages/varlock/scripts/build-binaries.ts b/packages/varlock/scripts/build-binaries.ts index 669c63e4..ee7b6389 100644 --- a/packages/varlock/scripts/build-binaries.ts +++ b/packages/varlock/scripts/build-binaries.ts @@ -1,10 +1,12 @@ import { execSync } from 'node:child_process'; import path from 'node:path'; +import fs from 'node:fs'; import { fileURLToPath } from 'node:url'; const __dirname = path.dirname(fileURLToPath(import.meta.url)); const PKG_DIR = path.resolve(__dirname, '..'); const DIST_DIR = 'dist-sea'; +const NATIVE_BINS_DIR = path.join(PKG_DIR, 'native-bins'); const ENTRY = 'src/cli/cli-executable.ts'; const ALL_TARGETS = [ @@ -67,6 +69,19 @@ if (devMode) { ENTRY, ].join(' ')); + // Bundle platform-specific native binaries alongside the CLI binary + const isMac = archiveName.startsWith('macos-'); + if (isMac) { + const appBundleSrc = path.join(NATIVE_BINS_DIR, 'darwin', 'VarlockEnclave.app'); + if (fs.existsSync(appBundleSrc)) { + console.log(' Bundling macOS native binary (VarlockEnclave.app)'); + exec(`cp -R "${appBundleSrc}" "${targetDir}/VarlockEnclave.app"`); + } else { + console.log(` Warning: macOS native binary not found at ${appBundleSrc}, skipping`); + } + } + // TODO: bundle native binaries for linux/windows when rust builds exist + // Archive let archive: string; let archiveCmd: string; diff --git a/packages/varlock/src/cli/cli-executable.ts b/packages/varlock/src/cli/cli-executable.ts index 4584a4aa..cb0f4b03 100644 --- a/packages/varlock/src/cli/cli-executable.ts +++ b/packages/varlock/src/cli/cli-executable.ts @@ -15,7 +15,8 @@ import { commandSpec as initCommandSpec } from './commands/init.command'; import { commandSpec as loadCommandSpec } from './commands/load.command'; import { commandSpec as runCommandSpec } from './commands/run.command'; import { commandSpec as printenvCommandSpec } from './commands/printenv.command'; -// import { commandSpec as encryptCommandSpec } from './commands/encrypt.command'; +import { commandSpec as encryptCommandSpec } from './commands/encrypt.command'; +import { commandSpec as lockCommandSpec } from './commands/lock.command'; // import { commandSpec as doctorCommandSpec } from './commands/doctor.command'; import { commandSpec as helpCommandSpec } from './commands/help.command'; import { commandSpec as telemetryCommandSpec } from './commands/telemetry.command'; @@ -52,7 +53,8 @@ subCommands.set('init', buildLazyCommand(initCommandSpec, async () => await impo subCommands.set('load', buildLazyCommand(loadCommandSpec, async () => await import('./commands/load.command'))); subCommands.set('run', buildLazyCommand(runCommandSpec, async () => await import('./commands/run.command'))); subCommands.set('printenv', buildLazyCommand(printenvCommandSpec, async () => await import('./commands/printenv.command'))); -// subCommands.set('encrypt', buildLazyCommand(encryptCommandSpec, async () => await import('./commands/encrypt.command'))); +subCommands.set('encrypt', buildLazyCommand(encryptCommandSpec, async () => await import('./commands/encrypt.command'))); +subCommands.set('lock', buildLazyCommand(lockCommandSpec, async () => await import('./commands/lock.command'))); // subCommands.set('doctor', buildLazyCommand(doctorCommandSpec, async () => await import('./commands/doctor.command'))); subCommands.set('explain', buildLazyCommand(explainCommandSpec, async () => await import('./commands/explain.command'))); subCommands.set('help', buildLazyCommand(helpCommandSpec, async () => await import('./commands/help.command'))); diff --git a/packages/varlock/src/cli/commands/encrypt.command.ts b/packages/varlock/src/cli/commands/encrypt.command.ts index ee9d926e..eb724da1 100644 --- a/packages/varlock/src/cli/commands/encrypt.command.ts +++ b/packages/varlock/src/cli/commands/encrypt.command.ts @@ -1,122 +1,167 @@ - import { define } from 'gunshi'; import { isCancel, password } from '@clack/prompts'; - -import { VarlockNativeAppClient } from '../../lib/native-app-client'; +import ansis from 'ansis'; +import path from 'node:path'; +import fs from 'node:fs'; + +import { + ParsedEnvSpecStaticValue, + ParsedEnvSpecFunctionCall, +} from '@env-spec/parser'; +import { FileBasedDataSource } from '../../env-graph'; +import { loadVarlockEnvGraph } from '../../lib/load-graph'; import { type TypedGunshiCommandFn } from '../helpers/gunshi-type-utils'; +import { CliExitError } from '../helpers/exit-error'; +import { multiselect } from '../helpers/prompts'; import { gracefulExit } from 'exit-hook'; +import * as localEncrypt from '../../lib/local-encrypt'; export const commandSpec = define({ name: 'encrypt', - description: 'Encrypt environment variables in your .env file', - args: {}, + description: 'Encrypt a value using device-local encryption', + args: { + 'key-id': { + type: 'string', + description: 'Encryption key ID (default: varlock-default)', + default: 'varlock-default', + }, + file: { + type: 'string', + description: 'Path to a .env file — encrypts all sensitive plaintext values in-place', + }, + }, }); +async function encryptFile(keyId: string, filePath: string) { + const resolvedPath = path.resolve(filePath); + if (!fs.existsSync(resolvedPath)) { + throw new CliExitError(`File not found: ${resolvedPath}`); + } + + // Load the full env graph and resolve to get sensitivity info from the schema + const envGraph = await loadVarlockEnvGraph(); + await envGraph.resolveEnvValues(); + + // Find the data source matching the target file + const targetSource = envGraph.sortedDataSources.find( + (s) => s instanceof FileBasedDataSource && s.fullPath === resolvedPath, + ) as FileBasedDataSource | undefined; + + if (!targetSource) { + throw new CliExitError( + `File "${filePath}" is not part of the loaded env graph`, + { suggestion: 'Make sure the file is in the project directory or imported by your schema.' }, + ); + } + + // Find sensitive items that have plaintext static values in this file + const itemsToEncrypt: Array<{ key: string; value: string }> = []; + + for (const [key, itemDef] of Object.entries(targetSource.configItemDefs)) { + const graphItem = envGraph.configSchema[key]; + if (!graphItem?.isSensitive) continue; + + // Skip items already using varlock() or another function call + if (itemDef.parsedValue instanceof ParsedEnvSpecFunctionCall) continue; + + // Only encrypt items with actual static string values + if (!(itemDef.parsedValue instanceof ParsedEnvSpecStaticValue)) continue; + const val = itemDef.parsedValue.unescapedValue; + if (val === undefined || val === '' || typeof val !== 'string') continue; + + itemsToEncrypt.push({ key, value: val }); + } + + if (itemsToEncrypt.length === 0) { + console.log('No sensitive plaintext values found to encrypt.'); + return; + } + + console.log('Only items marked as @sensitive in the schema are shown.'); + console.log('If a key is missing, add @sensitive to it in your schema file.\n'); + + const selected = await multiselect({ + message: `Confirm values to encrypt in ${filePath} ${ansis.gray('(use arrows, space to toggle, enter to confirm)')}`, + options: itemsToEncrypt.map((item) => ({ + value: item.key, + label: item.key, + })), + initialValues: itemsToEncrypt.map((item) => item.key), + }); + + if (isCancel(selected)) return gracefulExit(); + + const selectedKeys = new Set(selected as Array); + const filteredItems = itemsToEncrypt.filter((item) => selectedKeys.has(item.key)); + + if (filteredItems.length === 0) { + console.log('No items selected.'); + return; + } + + console.log(''); + + // Encrypt each value and write back using string replacement on the raw file. + // We re-read each time since prior replacements modify the file. + let encryptedCount = 0; + for (const item of filteredItems) { + const ciphertext = await localEncrypt.encryptValue(item.value, keyId); + const prefixed = `local:${ciphertext}`; + + const currentContents = fs.readFileSync(resolvedPath, 'utf-8'); + // Match the line for this key and replace the static value with varlock("local:...") + const escaped = item.key.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + const pattern = new RegExp(`^(${escaped}\\s*=\\s*).*$`, 'm'); + const updatedContents = currentContents.replace(pattern, `$1varlock("${prefixed}")`); + + if (updatedContents !== currentContents) { + fs.writeFileSync(resolvedPath, updatedContents); + encryptedCount++; + console.log(` Encrypted: ${item.key}`); + } + } + + console.log(`\nEncrypted ${encryptedCount} value${encryptedCount !== 1 ? 's' : ''} in ${filePath}`); +} + export const commandFn: TypedGunshiCommandFn = async (ctx) => { + const keyId = String(ctx.values['key-id'] || 'varlock-default'); + const backend = localEncrypt.getBackendInfo(); + + try { + await localEncrypt.ensureKey(keyId); + } catch (err) { + if (err instanceof CliExitError) throw err; + throw new CliExitError( + `Failed to check/create encryption key: ${err instanceof Error ? err.message : err}`, + ); + } + + console.log(`Using ${backend.type} backend (${backend.hardwareBacked ? 'hardware-backed' : 'file-based'})`); + + const filePath = ctx.values.file; + + // --file mode: encrypt all sensitive plaintext values in a .env file + if (filePath) { + await encryptFile(keyId, filePath); + return; + } + + // Interactive single-value mode console.log(''); - console.log('🧙 Encrypting environment variables... ✨'); - // intro('🧙 Encrypting environment variables... ✨'); const rawValue = await password({ message: 'Enter the value you want to encrypt' }); if (isCancel(rawValue)) return gracefulExit(); - const client = new VarlockNativeAppClient(); - await client.initializeSocket(); - const encryptedValue = await client.encrypt(rawValue); - - console.log('Copy this into your .env.local file and rename the key appropriately:\n'); - console.log(`SOME_SENSITIVE_KEY=varlock("${encryptedValue}")`); - - // const envGraph = await loadEnvGraph(); - // await envGraph.resolveEnvValues(); - // const resolvedEnv = envGraph.getResolvedEnvObject(); - - // TODO: need to reimplement using the new parser - - // const client = new VarlockNativeAppClient(); - // await client.initializeSocket(); - - // for (const envFile of loadedEnv.files) { - // let changeCount = 0; - // for (const itemKey in envFile.items) { - // const item = envFile.items[itemKey]; - // if (item.decorators?.sensitive) { - // if ('value' in item && item.value) { - // console.log('Encrypting', itemKey, envFile.path); - // const encryptedValue = await client.encrypt(item.value); - // delete item.value; - // (item as any).resolverName = 'varlock'; - // (item as any).resolverArgs = [encryptedValue]; - // changeCount++; - // } - // } else { - // if ('resolverName' in item && item.resolverName === 'varlock') { - // console.log('Decrypting', itemKey, envFile.path); - // const encryptedValue = item.resolverArgs[0]; - // if (typeof encryptedValue !== 'string') { - // throw new Error('Expected encrypted value to be a string'); - // } - // const decryptedValue = await client.decrypt(encryptedValue); - // (item as any).value = decryptedValue; - // delete (item as any).resolverName; - // delete (item as any).resolverArgs; - // changeCount++; - // } - // } - // } - - // const updatedEnvFileStr = dumpDotEnvContents(envFile.parsedContents); - // await fs.writeFile(envFile.path, updatedEnvFileStr); - - // log.success(`Updated ${changeCount} items in ${envFile.path}`); - // } - - // console.log(loadedEnv); - - // const unencryptedKeys: Array = []; - // parsedEnv.forEach((item) => { - // if (item.type !== 'item') return; - // if (item.key.startsWith('_VARLOCK_')) return; - // if (!('value' in item) || !item.value) return; - - // unencryptedKeys.push(item.key); - // }); - - // if (unencryptedKeys.length === 0) { - // console.log('No items to encrypt. Exiting...'); - // return; - // } - - // const selectedKeys = await multiselect({ - // message: 'Select env item(s) to encrypt 🔏', - // options: unencryptedKeys.map((key) => ({ - // value: key, - // label: key, - // })), - // initialValues: unencryptedKeys, - // required: false, - // }); - - // if (isCancel(selectedKeys) || !selectedKeys.length) { - // console.log('No items selected. Exiting...'); - // return; - // } - - // for (const item of parsedEnv) { - // if (item.type === 'item' && selectedKeys.includes(item.key)) { - // if (!('value' in item) || !item.value) throw new Error(`Item ${item.key} has no value`); - // const encryptedValue = await client.encrypt(item.value); - // delete item.value; - // (item as any).resolverName = 'varlock'; - // (item as any).resolverArgs = [encryptedValue]; - // } - // } - - // // write the updated env file - - // const updatedEnvFileStr = dumpDotEnvContents(parsedEnv); - // await fs.writeFile(envFilePath, updatedEnvFileStr); - - // outro(`Encrypted ${selectedKeys.length} items!`); + try { + const ciphertext = await localEncrypt.encryptValue(rawValue, keyId); + + console.log('\nCopy this into your .env.local file and rename the key appropriately:\n'); + console.log(`SOME_SENSITIVE_KEY=varlock("local:${ciphertext}")`); + } catch (err) { + if (err instanceof CliExitError) throw err; + throw new CliExitError( + `Encryption failed: ${err instanceof Error ? err.message : err}`, + ); + } }; - diff --git a/packages/varlock/src/cli/commands/lock.command.ts b/packages/varlock/src/cli/commands/lock.command.ts new file mode 100644 index 00000000..5128c7ac --- /dev/null +++ b/packages/varlock/src/cli/commands/lock.command.ts @@ -0,0 +1,26 @@ + +import { define } from 'gunshi'; + +import { type TypedGunshiCommandFn } from '../helpers/gunshi-type-utils'; +import * as localEncrypt from '../../lib/local-encrypt'; + +export const commandSpec = define({ + name: 'lock', + description: 'Lock the encryption daemon, requiring biometric for next decrypt', +}); + +export const commandFn: TypedGunshiCommandFn = async () => { + const backend = localEncrypt.getBackendInfo(); + + if (!backend.biometricAvailable) { + console.log(`The ${backend.type} backend does not support biometric lock.`); + return; + } + + try { + await localEncrypt.lockSession(); + console.log('Encryption session locked. Biometric authentication will be required for next decrypt.'); + } catch { + console.log('No encryption daemon is running — nothing to lock.'); + } +}; diff --git a/packages/varlock/src/env-graph/lib/env-graph.ts b/packages/varlock/src/env-graph/lib/env-graph.ts index 9c498fdc..28469081 100644 --- a/packages/varlock/src/env-graph/lib/env-graph.ts +++ b/packages/varlock/src/env-graph/lib/env-graph.ts @@ -4,6 +4,7 @@ import { ConfigItem } from './config-item'; import { EnvGraphDataSource, FileBasedDataSource, ImportAliasSource } from './data-source'; import { BaseResolvers, createResolver, type ResolverChildClass } from './resolver'; +import { VarlockResolver } from '../../lib/local-encrypt/builtin-resolver'; import { BaseDataTypes, type EnvGraphDataTypeFactory } from './data-types'; import { findGraphCycles, getTransitiveDeps, type GraphAdjacencyList } from './graph-utils'; import { ResolutionError, SchemaError } from './errors'; @@ -227,6 +228,8 @@ export class EnvGraph { for (const resolverClass of BaseResolvers) { this.registerResolver(resolverClass); } + // register built-in varlock() resolver for local encryption + this.registerResolver(VarlockResolver); // base root decorators (envFlag, generateTypes, import, etc) for (const rootDec of builtInRootDecorators) { this.registerRootDecorator(rootDec); diff --git a/packages/varlock/src/lib/local-encrypt/binary-resolver.ts b/packages/varlock/src/lib/local-encrypt/binary-resolver.ts new file mode 100644 index 00000000..85defebb --- /dev/null +++ b/packages/varlock/src/lib/local-encrypt/binary-resolver.ts @@ -0,0 +1,140 @@ +/** + * Resolves the path to the platform-specific native helper binary. + * + * Resolution order: + * 1. SEA sibling: same directory as the running varlock binary (install.sh, homebrew) + * 2. Bundled in npm package: native-bins/[-]/ within the varlock package + * 3. Dev fallback: walk up from __dirname to find build output + * + * Returns undefined if no binary is found (file-based fallback will be used instead). + */ + +import path from 'node:path'; +import fs from 'node:fs'; +import { fileURLToPath } from 'node:url'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +const BINARY_NAME = 'varlock-local-encrypt'; +const MACOS_APP_BUNDLE = 'VarlockEnclave.app'; + +/** Get the binary name for the current platform */ +function getPlatformBinaryName(): string { + return process.platform === 'win32' ? `${BINARY_NAME}.exe` : BINARY_NAME; +} + +/** Get the subdirectory name within native-bins/ for the current platform */ +function getNativeBinSubdir(): string { + if (process.platform === 'darwin') return 'darwin'; + if (process.platform === 'win32') return `win32-${process.arch}`; + return `${process.platform}-${process.arch}`; +} + +/** + * Resolve the macOS .app bundle binary path, or fall back to bare binary. + */ +function resolveMacOSBinary(dir: string): string | undefined { + // Try .app bundle first (needed for custom Touch ID icon) + const appBundlePath = path.join(dir, MACOS_APP_BUNDLE, 'Contents', 'MacOS', BINARY_NAME); + if (fs.existsSync(appBundlePath)) return appBundlePath; + + // Fall back to bare binary + const barePath = path.join(dir, BINARY_NAME); + if (fs.existsSync(barePath)) return barePath; + + return undefined; +} + +/** + * Resolve the binary path for Linux/Windows. + */ +function resolveStandardBinary(dir: string): string | undefined { + const binaryPath = path.join(dir, getPlatformBinaryName()); + if (fs.existsSync(binaryPath)) return binaryPath; + return undefined; +} + +/** + * Resolve binary from a directory, handling macOS .app bundle vs standard binary. + */ +function resolveBinaryFromDir(dir: string): string | undefined { + if (process.platform === 'darwin') return resolveMacOSBinary(dir); + return resolveStandardBinary(dir); +} + +/** + * Strategy 1: Look for the binary next to the running varlock binary. + * This is the primary path for binary/SEA distribution (install.sh, homebrew). + */ +function resolveSeaSibling(): string | undefined { + const execDir = path.dirname(process.execPath); + return resolveBinaryFromDir(execDir); +} + +/** + * Strategy 2: Look for the binary bundled in the varlock npm package. + * native-bins// + */ +function resolveNpmBundled(): string | undefined { + // __dirname points to the compiled dist/ or src/ directory within the varlock package + // native-bins/ is a sibling to dist/ and src/ + const nativeBinsDir = path.resolve(__dirname, '..', '..', '..', 'native-bins', getNativeBinSubdir()); + if (fs.existsSync(nativeBinsDir)) return resolveBinaryFromDir(nativeBinsDir); + + // Also check one level up (when running from dist/) + const altDir = path.resolve(__dirname, '..', 'native-bins', getNativeBinSubdir()); + if (fs.existsSync(altDir)) return resolveBinaryFromDir(altDir); + + return undefined; +} + +/** + * Strategy 3: Development fallback — look for build output in the monorepo. + * Walks up from __dirname looking for native binary build output + */ +function resolveDevFallback(): string | undefined { + let dir = __dirname; + for (let i = 0; i < 10; i++) { + const parent = path.dirname(dir); + if (parent === dir) break; + dir = parent; + + // Check for Swift build output (macOS) + if (process.platform === 'darwin') { + const swiftBuild = path.join(dir, 'packages', 'encryption-binary-swift', 'swift', '.build', 'release', 'VarlockEnclave'); + if (fs.existsSync(swiftBuild)) return swiftBuild; + } + + // Check for Rust build output (Linux/Windows) + const rustBuild = path.join(dir, 'packages', 'local-encrypt', 'rust', 'target', 'release', getPlatformBinaryName()); + if (fs.existsSync(rustBuild)) return rustBuild; + } + + return undefined; +} + +/** + * Ensure the binary at the given path is executable. + * GitHub Actions artifact upload/download strips execute permissions, + * and some extraction tools may do the same. + */ +function ensureExecutable(binaryPath: string): string { + try { + fs.accessSync(binaryPath, fs.constants.X_OK); + } catch { + // Not executable — try to fix it + if (process.platform !== 'win32') { + fs.chmodSync(binaryPath, 0o755); + } + } + return binaryPath; +} + +/** + * Resolve the native helper binary path. + * Returns undefined if no binary is found — caller should fall back to pure JS. + */ +export function resolveNativeBinary(): string | undefined { + const resolved = resolveSeaSibling() ?? resolveNpmBundled() ?? resolveDevFallback(); + return resolved ? ensureExecutable(resolved) : undefined; +} diff --git a/packages/varlock/src/lib/local-encrypt/builtin-resolver.ts b/packages/varlock/src/lib/local-encrypt/builtin-resolver.ts new file mode 100644 index 00000000..9b7aebfb --- /dev/null +++ b/packages/varlock/src/lib/local-encrypt/builtin-resolver.ts @@ -0,0 +1,144 @@ +/** + * Built-in varlock() resolver function. + * + * Replaces the plugin-based resolver from @varlock/secure-enclave-plugin. + * Works cross-platform using the local-encrypt abstraction layer. + */ + +import fs from 'node:fs'; +import { createResolver, Resolver } from '../../env-graph/lib/resolver'; +import { ResolutionError, SchemaError } from '../../env-graph/lib/errors'; +import * as localEncrypt from './index'; + +const LOCAL_PREFIX = 'local:'; +const PLUGIN_ICON = 'mdi:fingerprint'; + +function escapeRegExp(str: string) { + return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); +} + +type VarlockResolverState = { + mode: 'decrypt'; + payload: string; +} | { + mode: 'prompt'; + itemKey: string; + sourceFilePath: string | undefined; +}; + +function writeBackEncryptedValue(itemKey: string, ciphertext: string, sourceFilePath: string | undefined) { + if (!sourceFilePath) return; + const currentContents = fs.readFileSync(sourceFilePath, 'utf-8'); + const pattern = new RegExp(`^(${escapeRegExp(itemKey)}\\s*=\\s*)varlock\\(prompt(?:=\\S*)?\\)`, 'm'); + const prefixedCiphertext = `${LOCAL_PREFIX}${ciphertext}`; + const updatedContents = currentContents.replace(pattern, `$1varlock("${prefixedCiphertext}")`); + if (updatedContents !== currentContents) { + fs.writeFileSync(sourceFilePath, updatedContents); + } +} + +export const VarlockResolver: typeof Resolver = createResolver({ + name: 'varlock', + label: 'Decrypt locally encrypted value', + icon: PLUGIN_ICON, + argsSchema: { + type: 'mixed', + arrayMinLength: 0, + }, + process(): VarlockResolverState { + // Check for prompt mode: varlock(prompt=1) or varlock(prompt) + const promptArg = this.objArgs?.prompt; + if (promptArg) { + // Resolver doesn't expose parent item in its type, but it's available at runtime + const parent = (this as any).parent; + const itemKey = parent?.key || 'unknown'; + const dataSource = this.dataSource as any; + const sourceFilePath = dataSource?.fullPath as string | undefined; + return { mode: 'prompt', itemKey, sourceFilePath }; + } + + // Normal mode: varlock("encrypted-payload") + if (!this.arrArgs || this.arrArgs.length !== 1) { + throw new SchemaError('varlock() expects a single encrypted payload string, or prompt=1 to enter a new value'); + } + if (!this.arrArgs[0]?.isStatic) { + throw new SchemaError('varlock() expects a single static encrypted payload string'); + } + const payload = this.arrArgs[0].staticValue; + if (typeof payload !== 'string') { + throw new SchemaError('varlock() expects a string argument'); + } + return { mode: 'decrypt', payload }; + }, + async resolve(state: VarlockResolverState) { + // Ensure a key exists (first-time setup) + await localEncrypt.ensureKey(); + + if (state.mode === 'decrypt') { + let ciphertext = state.payload; + if (ciphertext.startsWith(LOCAL_PREFIX)) { + ciphertext = ciphertext.slice(LOCAL_PREFIX.length); + } + try { + return await localEncrypt.decryptValue(ciphertext); + } catch (err) { + const backend = localEncrypt.getBackendInfo(); + throw new ResolutionError( + `Decryption failed: ${err instanceof Error ? err.message : err}`, + { + tip: [ + `Backend: ${backend.type} (${backend.hardwareBacked ? 'hardware-backed' : 'file-based'})`, + 'Make sure the encryption key has not been deleted.', + 'Run `varlock encrypt --help` for more info.', + ].join('\n'), + }, + ); + } + } + + // Prompt mode: prompt user for secret, encrypt it, write back to file + const { itemKey, sourceFilePath } = state; + const backend = localEncrypt.getBackendInfo(); + + // Use daemon's native dialog on macOS Secure Enclave + if (backend.type === 'secure-enclave' && backend.biometricAvailable) { + const { DaemonClient } = await import('./daemon-client'); + const client = new DaemonClient(); + const ciphertext = await client.promptSecret({ + itemKey, + message: `Enter the secret value for ${itemKey}:`, + }); + + if (!ciphertext) { + throw new ResolutionError('Secret input was cancelled', { + tip: 'Run varlock again and enter a value, or replace prompt=1 with an encrypted value', + }); + } + + writeBackEncryptedValue(itemKey, ciphertext, sourceFilePath); + return localEncrypt.decryptValue(ciphertext); + } + + // Terminal prompt for file-based backend + if (!process.stdout.isTTY || !process.stdin.isTTY) { + throw new ResolutionError( + `No encrypted value found for ${itemKey}`, + { + tip: `Run \`varlock encrypt --file ${sourceFilePath || ''}\` to encrypt this value interactively.`, + }, + ); + } + + const { password, isCancel } = await import('@clack/prompts'); + const rawValue = await password({ message: `Enter the secret value for ${itemKey}:` }); + if (isCancel(rawValue) || !rawValue) { + throw new ResolutionError('Secret input was cancelled', { + tip: 'Run varlock again and enter a value, or replace prompt=1 with an encrypted value', + }); + } + + const ciphertext = await localEncrypt.encryptValue(rawValue); + writeBackEncryptedValue(itemKey, ciphertext, sourceFilePath); + return rawValue; + }, +}); diff --git a/packages/varlock/src/lib/local-encrypt/crypto.test.ts b/packages/varlock/src/lib/local-encrypt/crypto.test.ts new file mode 100644 index 00000000..baeca237 --- /dev/null +++ b/packages/varlock/src/lib/local-encrypt/crypto.test.ts @@ -0,0 +1,95 @@ +import { describe, it, expect } from 'vitest'; +import { createKeyPair, encrypt, decrypt } from './crypto'; + +describe('ECIES crypto', () => { + it('round-trips encrypt → decrypt', async () => { + const keyPair = await createKeyPair(); + const plaintext = 'hello world — this is a secret!'; + + const ciphertext = await encrypt(keyPair.publicKey, plaintext); + const decrypted = await decrypt(keyPair.privateKey, keyPair.publicKey, ciphertext); + + expect(decrypted).toBe(plaintext); + }); + + it('produces different ciphertext each time (random nonce)', async () => { + const keyPair = await createKeyPair(); + const plaintext = 'same input'; + + const ct1 = await encrypt(keyPair.publicKey, plaintext); + const ct2 = await encrypt(keyPair.publicKey, plaintext); + + expect(ct1).not.toBe(ct2); + + // But both decrypt to the same value + expect(await decrypt(keyPair.privateKey, keyPair.publicKey, ct1)).toBe(plaintext); + expect(await decrypt(keyPair.privateKey, keyPair.publicKey, ct2)).toBe(plaintext); + }); + + it('fails with wrong private key', async () => { + const keyPair1 = await createKeyPair(); + const keyPair2 = await createKeyPair(); + const plaintext = 'secret'; + + const ciphertext = await encrypt(keyPair1.publicKey, plaintext); + + await expect(decrypt(keyPair2.privateKey, keyPair2.publicKey, ciphertext)).rejects.toThrow(); + }); + + it('fails with truncated payload', async () => { + const keyPair = await createKeyPair(); + const ciphertext = await encrypt(keyPair.publicKey, 'test'); + + // Truncate the base64 payload + const truncated = ciphertext.slice(0, 20); + await expect(decrypt(keyPair.privateKey, keyPair.publicKey, truncated)).rejects.toThrow('Payload too short'); + }); + + it('fails with wrong version byte', async () => { + const keyPair = await createKeyPair(); + const ciphertext = await encrypt(keyPair.publicKey, 'test'); + + // Decode, change version byte, re-encode + const buf = Buffer.from(ciphertext, 'base64'); + buf[0] = 0xFF; + const tampered = buf.toString('base64'); + + await expect(decrypt(keyPair.privateKey, keyPair.publicKey, tampered)).rejects.toThrow( + 'Unsupported payload version', + ); + }); + + it('handles empty string', async () => { + const keyPair = await createKeyPair(); + const ciphertext = await encrypt(keyPair.publicKey, ''); + const decrypted = await decrypt(keyPair.privateKey, keyPair.publicKey, ciphertext); + expect(decrypted).toBe(''); + }); + + it('handles unicode and emoji', async () => { + const keyPair = await createKeyPair(); + const plaintext = 'こんにちは 🔐 résumé café'; + const ciphertext = await encrypt(keyPair.publicKey, plaintext); + const decrypted = await decrypt(keyPair.privateKey, keyPair.publicKey, ciphertext); + expect(decrypted).toBe(plaintext); + }); + + it('handles large payloads', async () => { + const keyPair = await createKeyPair(); + const plaintext = 'x'.repeat(100_000); + const ciphertext = await encrypt(keyPair.publicKey, plaintext); + const decrypted = await decrypt(keyPair.privateKey, keyPair.publicKey, ciphertext); + expect(decrypted).toBe(plaintext); + }); + + it('payload has correct structure', async () => { + const keyPair = await createKeyPair(); + const ciphertext = await encrypt(keyPair.publicKey, 'test'); + const payload = Buffer.from(ciphertext, 'base64'); + + // version(1) + ephemeralPubKey(65) + nonce(12) + ciphertext(4 for "test") + tag(16) = 98 + expect(payload[0]).toBe(0x01); // version + expect(payload[1]).toBe(0x04); // uncompressed point prefix + expect(payload.length).toBe(1 + 65 + 12 + 4 + 16); // 98 bytes + }); +}); diff --git a/packages/varlock/src/lib/local-encrypt/crypto.ts b/packages/varlock/src/lib/local-encrypt/crypto.ts new file mode 100644 index 00000000..ee51f8c1 --- /dev/null +++ b/packages/varlock/src/lib/local-encrypt/crypto.ts @@ -0,0 +1,247 @@ +/** + * Pure JS ECIES implementation using Node.js Web Crypto API. + * + * Wire-compatible with the Swift Secure Enclave implementation: + * - P-256 ECDH key agreement + * - HKDF-SHA256 (salt: "varlock-ecies-v1", info: ephemeralPub || recipientPub) + * - AES-256-GCM with random 12-byte nonce + * - Payload: version(1) | ephemeralPubKey(65) | nonce(12) | ciphertext(N) | tag(16) + * + * Adapted from PR #19's apple-crypto.ts, modified to match the custom ECIES scheme + * used by the Swift SecureEnclaveManager rather than Apple's built-in variant. + */ + +import { webcrypto } from 'node:crypto'; + +const subtle = webcrypto.subtle; + +const PAYLOAD_VERSION = 0x01; +const HKDF_SALT = new TextEncoder().encode('varlock-ecies-v1'); +const EC_ALGORITHM = { name: 'ECDH', namedCurve: 'P-256' }; + +/** Uncompressed P-256 public key is 65 bytes (0x04 || x(32) || y(32)) */ +const PUBLIC_KEY_LENGTH = 65; +const NONCE_LENGTH = 12; +const TAG_LENGTH = 16; +const HEADER_LENGTH = 1 + PUBLIC_KEY_LENGTH + NONCE_LENGTH; // version + pubkey + nonce + +// Bun's types are stricter about BufferSource (requires ArrayBuffer, not ArrayBufferLike). +// This type assertion is safe — we always work with standard ArrayBuffers. + +const bs = (data: Uint8Array | ArrayBuffer) => data as any; + +// ── Key types ────────────────────────────────────────────────────────── + +export interface EcKeyPair { + /** Base64-encoded uncompressed P-256 public key (65 bytes raw) */ + publicKey: string; + /** Base64-encoded PKCS8 private key */ + privateKey: string; +} + +// ── Utilities ────────────────────────────────────────────────────────── + +function concatBuffers(...buffers: Array): Uint8Array { + const totalLength = buffers.reduce((sum, b) => sum + b.length, 0); + const result = new Uint8Array(totalLength); + let offset = 0; + for (const buf of buffers) { + result.set(buf, offset); + offset += buf.length; + } + return result; +} + +function bufferToBase64(buffer: ArrayBuffer | Uint8Array): string { + if (buffer instanceof Uint8Array) { + return Buffer.from(buffer.buffer, buffer.byteOffset, buffer.byteLength).toString('base64'); + } + return Buffer.from(buffer).toString('base64'); +} + +function base64ToUint8(base64: string): Uint8Array { + const buf = Buffer.from(base64, 'base64'); + return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength); +} + +// ── HKDF-SHA256 ──────────────────────────────────────────────────────── + +/** + * HKDF-SHA256 (RFC 5869) — matches the Swift SecureEnclaveManager.deriveKey implementation. + * + * We implement this manually rather than using Web Crypto's built-in HKDF because + * the Web Crypto HKDF requires importing the input key material as a CryptoKey, + * which adds complexity. This manual implementation is a direct port of the Swift code. + */ +async function hkdfSha256( + ikm: Uint8Array, + salt: Uint8Array, + info: Uint8Array, + outputByteCount: number, +): Promise { + // HKDF-Extract: PRK = HMAC-SHA256(salt, IKM) + const saltKey = await subtle.importKey('raw', bs(salt), { name: 'HMAC', hash: 'SHA-256' }, false, ['sign']); + const prk = new Uint8Array(await subtle.sign('HMAC', saltKey, bs(ikm))); + + // HKDF-Expand: OKM = T(1) || T(2) || ... + const prkKey = await subtle.importKey('raw', bs(prk), { name: 'HMAC', hash: 'SHA-256' }, false, ['sign']); + const okm = new Uint8Array(outputByteCount); + let t = new Uint8Array(0); + let offset = 0; + let counter = 1; + + while (offset < outputByteCount) { + const input = concatBuffers(t, info, new Uint8Array([counter])); + t = new Uint8Array(await subtle.sign('HMAC', prkKey, bs(input))); + okm.set(t.slice(0, Math.min(t.length, outputByteCount - offset)), offset); + offset += t.length; + counter++; + } + + return okm; +} + +// ── Key management ───────────────────────────────────────────────────── + +/** Import a public key from its base64-encoded uncompressed representation. */ +async function importPublicKey(base64: string): Promise { + return subtle.importKey('raw', bs(base64ToUint8(base64)), EC_ALGORITHM, true, []); +} + +/** Import a private key from its base64-encoded PKCS8 representation. */ +async function importPrivateKey(base64: string): Promise { + return subtle.importKey('pkcs8', bs(base64ToUint8(base64)), EC_ALGORITHM, true, ['deriveBits']); +} + +/** Generate a new P-256 ECDH key pair. */ +export async function createKeyPair(): Promise { + const keyPair = await subtle.generateKey(EC_ALGORITHM, true, ['deriveBits']); + + const publicKeyRaw = await subtle.exportKey('raw', keyPair.publicKey); + const privateKeyPkcs8 = await subtle.exportKey('pkcs8', keyPair.privateKey); + + return { + publicKey: bufferToBase64(publicKeyRaw), + privateKey: bufferToBase64(privateKeyPkcs8), + }; +} + +// ── ECIES encrypt ────────────────────────────────────────────────────── + +/** + * Encrypt plaintext using ECIES with the recipient's public key. + * + * @param publicKeyBase64 - Base64-encoded uncompressed P-256 public key (65 bytes raw) + * @param plaintext - UTF-8 string to encrypt + * @returns Base64-encoded ciphertext payload + */ +export async function encrypt(publicKeyBase64: string, plaintext: string): Promise { + const recipientPublicKey = await importPublicKey(publicKeyBase64); + const recipientPubKeyRaw = base64ToUint8(publicKeyBase64); + + // Generate ephemeral key pair + const ephemeralKeyPair = await subtle.generateKey(EC_ALGORITHM, true, ['deriveBits']); + const ephemeralPubKeyRaw = new Uint8Array(await subtle.exportKey('raw', ephemeralKeyPair.publicKey)); + + // ECDH: ephemeral private × recipient public → shared secret (32 bytes for P-256) + const sharedSecretBits = await subtle.deriveBits( + { name: 'ECDH', public: recipientPublicKey }, + ephemeralKeyPair.privateKey, + 256, + ); + const sharedSecret = new Uint8Array(sharedSecretBits); + + // HKDF-SHA256 → AES-256 key + const info = concatBuffers(ephemeralPubKeyRaw, recipientPubKeyRaw); + const aesKey = await hkdfSha256(sharedSecret, HKDF_SALT, info, 32); + + // AES-256-GCM encrypt + const nonce = webcrypto.getRandomValues(new Uint8Array(NONCE_LENGTH)); + const plaintextBytes = new TextEncoder().encode(plaintext); + + const cryptoKey = await subtle.importKey('raw', bs(aesKey), 'AES-GCM', false, ['encrypt']); + const encrypted = new Uint8Array( + await subtle.encrypt({ name: 'AES-GCM', iv: bs(nonce), tagLength: TAG_LENGTH * 8 }, cryptoKey, bs(plaintextBytes)), + ); + + // Web Crypto appends the tag to ciphertext — split them to match Swift format + const ciphertext = encrypted.slice(0, encrypted.length - TAG_LENGTH); + const tag = encrypted.slice(encrypted.length - TAG_LENGTH); + + // Assemble payload: version(1) | ephemeralPub(65) | nonce(12) | ciphertext(N) | tag(16) + const payload = concatBuffers( + new Uint8Array([PAYLOAD_VERSION]), + ephemeralPubKeyRaw, + nonce, + ciphertext, + tag, + ); + + return bufferToBase64(payload); +} + +// ── ECIES decrypt ────────────────────────────────────────────────────── + +/** + * Decrypt ciphertext using ECIES with the recipient's private key. + * + * @param privateKeyBase64 - Base64-encoded PKCS8 private key + * @param publicKeyBase64 - Base64-encoded uncompressed P-256 public key of the recipient + * @param ciphertextBase64 - Base64-encoded ciphertext payload + * @returns Decrypted UTF-8 string + */ +export async function decrypt( + privateKeyBase64: string, + publicKeyBase64: string, + ciphertextBase64: string, +): Promise { + const payloadBytes = base64ToUint8(ciphertextBase64); + + if (payloadBytes.byteLength < HEADER_LENGTH + TAG_LENGTH) { + throw new Error('Payload too short'); + } + + // Parse payload + const version = payloadBytes[0]; + if (version !== PAYLOAD_VERSION) { + throw new Error(`Unsupported payload version: ${version}`); + } + + const ephemeralPubKeyRaw = payloadBytes.slice(1, 1 + PUBLIC_KEY_LENGTH); + const nonce = payloadBytes.slice(1 + PUBLIC_KEY_LENGTH, HEADER_LENGTH); + const ciphertextAndTag = payloadBytes.slice(HEADER_LENGTH); + + if (ciphertextAndTag.length < TAG_LENGTH) { + throw new Error('Payload too short for tag'); + } + + // Import keys + const privateKey = await importPrivateKey(privateKeyBase64); + const ephemeralPublicKey = await subtle.importKey('raw', bs(ephemeralPubKeyRaw), EC_ALGORITHM, true, []); + + // Recipient public key bytes for HKDF info + const recipientPubKeyRaw = base64ToUint8(publicKeyBase64); + + // ECDH: recipient private × ephemeral public → shared secret + const sharedSecretBits = await subtle.deriveBits( + { name: 'ECDH', public: ephemeralPublicKey }, + privateKey, + 256, + ); + const sharedSecret = new Uint8Array(sharedSecretBits); + + // HKDF-SHA256 → AES-256 key (must match encrypt side) + const info = concatBuffers(ephemeralPubKeyRaw, recipientPubKeyRaw); + const aesKey = await hkdfSha256(sharedSecret, HKDF_SALT, info, 32); + + // AES-256-GCM decrypt + // Web Crypto expects ciphertext + tag concatenated + const cryptoKey = await subtle.importKey('raw', bs(aesKey), 'AES-GCM', false, ['decrypt']); + const decrypted = await subtle.decrypt( + { name: 'AES-GCM', iv: bs(nonce), tagLength: TAG_LENGTH * 8 }, + cryptoKey, + bs(ciphertextAndTag), // already ciphertext || tag + ); + + return new TextDecoder().decode(decrypted); +} diff --git a/packages/varlock/src/lib/local-encrypt/daemon-client.ts b/packages/varlock/src/lib/local-encrypt/daemon-client.ts new file mode 100644 index 00000000..ea556448 --- /dev/null +++ b/packages/varlock/src/lib/local-encrypt/daemon-client.ts @@ -0,0 +1,325 @@ +/** + * Daemon client for communicating with the native encryption helper binary. + * + * Handles daemon lifecycle (spawn, connect, reconnect) and IPC messaging + * using the 4-byte LE length-prefixed JSON protocol. + * + * - macOS/Linux: Unix domain socket + * - Windows: named pipe (TODO) + * + * Generalized from the secure-enclave plugin's EnclaveDaemonClient. + */ + +import net from 'node:net'; +import path from 'node:path'; +import fs from 'node:fs'; +import crypto from 'node:crypto'; +import { spawn } from 'node:child_process'; + +import { getUserVarlockDir } from '../user-config-dir'; +import { resolveNativeBinary } from './binary-resolver'; + +function getSocketDir(): string { + return path.join(getUserVarlockDir(), 'local-encrypt'); +} + +function getSocketPath(): string { + if (process.platform === 'win32') { + // Windows named pipe + return `\\\\.\\pipe\\varlock-local-encrypt-${process.pid}`; + } + return path.join(getSocketDir(), 'daemon.sock'); +} + +function getPidPath(): string { + return path.join(getSocketDir(), 'daemon.pid'); +} + +export class DaemonClient { + private socket: net.Socket | null = null; + private messageQueue = new Map void; + reject: (error: Error) => void; + }>(); + private isConnected = false; + private buffer = Buffer.alloc(0); + private connectingPromise: Promise | null = null; + + async ensureConnected(): Promise { + if (this.isConnected && this.socket) return; + + // Deduplicate concurrent ensureConnected calls — multiple varlock() items + // may resolve concurrently and all call decrypt → ensureConnected + if (this.connectingPromise) return this.connectingPromise; + + this.connectingPromise = this.doConnect(); + try { + await this.connectingPromise; + } finally { + this.connectingPromise = null; + } + } + + /** + * Try to connect to an existing daemon without spawning a new one. + * Returns true if connected, false if no daemon is running. + */ + async tryConnect(): Promise { + if (this.isConnected && this.socket) return true; + const socketPath = getSocketPath(); + try { + await this.connectToSocket(socketPath); + return true; + } catch { + return false; + } + } + + private async doConnect(): Promise { + const socketPath = getSocketPath(); + try { + await this.connectToSocket(socketPath); + return; + } catch { + // Daemon not running, spawn it + } + + await this.spawnDaemon(); + await this.connectToSocket(socketPath); + } + + async decrypt(ciphertext: string, keyId = 'varlock-default'): Promise { + await this.ensureConnected(); + const result = await this.sendMessage({ + action: 'decrypt', + payload: { ciphertext, keyId }, + }); + if (typeof result === 'string') return result; + if (result && typeof result === 'object' && 'error' in result) { + throw new Error(String(result.error)); + } + return String(result); + } + + async promptSecret(opts?: { + itemKey?: string; + message?: string; + keyId?: string; + }): Promise { + await this.ensureConnected(); + try { + const result = await this.sendMessage({ + action: 'prompt-secret', + payload: { + itemKey: opts?.itemKey, + message: opts?.message, + keyId: opts?.keyId, + }, + }); + if (result && typeof result === 'object' && 'ciphertext' in result) { + return result.ciphertext as string; + } + return undefined; + } catch (err) { + if (err instanceof Error && err.message === 'cancelled') return undefined; + throw err; + } + } + + async invalidateSession(): Promise { + await this.ensureConnected(); + await this.sendMessage({ action: 'invalidate-session' }); + } + + cleanup(): void { + for (const { reject } of this.messageQueue.values()) { + reject(new Error('Connection closed')); + } + this.messageQueue.clear(); + this.socket?.end(); + this.socket = null; + this.isConnected = false; + this.buffer = Buffer.alloc(0); + } + + // -- Private -- + + private connectToSocket(socketPath: string): Promise { + return new Promise((resolve, reject) => { + const socket = new net.Socket(); + const timeout = setTimeout(() => { + socket.destroy(); + reject(new Error('Connection timeout')); + }, 5000); + + socket.on('connect', () => { + clearTimeout(timeout); + this.socket = socket; + this.isConnected = true; + this.buffer = Buffer.alloc(0); + resolve(); + }); + + socket.on('data', (data: Buffer) => { + this.handleData(data); + }); + + socket.on('error', (err) => { + clearTimeout(timeout); + this.isConnected = false; + reject(err); + }); + + socket.on('close', () => { + this.isConnected = false; + this.socket = null; + }); + + socket.connect(socketPath); + }); + } + + private handleData(data: Buffer): void { + this.buffer = Buffer.concat([this.buffer, data]); + + while (this.buffer.length >= 4) { + const messageLength = this.buffer.readUInt32LE(0); + if (this.buffer.length < 4 + messageLength) break; + + const messageData = this.buffer.subarray(4, 4 + messageLength); + this.buffer = this.buffer.subarray(4 + messageLength); + + try { + const message = JSON.parse(messageData.toString()); + if (message.id && this.messageQueue.has(message.id)) { + const { resolve: res, reject: rej } = this.messageQueue.get(message.id)!; + this.messageQueue.delete(message.id); + if (message.error) { + rej(new Error(message.error)); + } else { + res(message.result); + } + } + } catch { + // Ignore malformed messages + } + } + } + + private sendMessage(message: Record): Promise { + return new Promise((resolve, reject) => { + if (!this.isConnected || !this.socket) { + reject(new Error('Not connected to daemon')); + return; + } + + const messageId = `${Date.now().toString(36)}-${crypto.randomBytes(4).toString('hex')}`; + const messageWithId = { ...message, id: messageId }; + const jsonData = JSON.stringify(messageWithId); + const messageBytes = Buffer.from(jsonData, 'utf-8'); + + const lengthBuf = Buffer.alloc(4); + lengthBuf.writeUInt32LE(messageBytes.length, 0); + + this.messageQueue.set(messageId, { resolve, reject }); + this.socket.write(Buffer.concat([lengthBuf, messageBytes])); + }); + } + + private async spawnDaemon(): Promise { + const binaryPath = resolveNativeBinary(); + if (!binaryPath) { + throw new Error('Native encryption binary not found — cannot start daemon'); + } + + const socketPath = getSocketPath(); + const pidPath = getPidPath(); + + fs.mkdirSync(path.dirname(socketPath), { recursive: true }); + + // Check for existing daemon via PID + if (fs.existsSync(pidPath)) { + try { + const pid = parseInt(fs.readFileSync(pidPath, 'utf-8').trim(), 10); + process.kill(pid, 0); // Throws if process doesn't exist + // Process is alive — wait briefly and let ensureConnected retry + await new Promise((r) => { + setTimeout(r, 500); + }); + return; + } catch { + // Stale PID file — clean up both PID and socket + } + } + + // Clean up stale socket and PID files before spawning + for (const file of [socketPath, pidPath]) { + if (fs.existsSync(file)) { + fs.unlinkSync(file); + } + } + + // Verify socket file is actually gone — if not, something is very wrong + if (fs.existsSync(socketPath)) { + throw new Error(`Failed to clean up stale socket file: ${socketPath}`); + } + + return new Promise((resolve, reject) => { + const child = spawn(binaryPath, [ + 'daemon', + '--socket-path', + socketPath, + '--pid-path', + pidPath, + ], { + detached: true, + stdio: ['ignore', 'pipe', 'pipe'], + }); + + const timeout = setTimeout(() => { + reject(new Error('Daemon failed to start within timeout')); + }, 10000); + + let stdoutData = ''; + let stderrData = ''; + + child.stdout!.on('data', (data: Buffer) => { + stdoutData += data.toString(); + try { + const parsed = JSON.parse(stdoutData); + if (parsed.ready) { + clearTimeout(timeout); + child.unref(); + child.stdout!.destroy(); + child.stderr!.destroy(); + resolve(); + } + } catch { + // Incomplete JSON, keep buffering + } + }); + + child.stderr!.on('data', (data: Buffer) => { + stderrData += data.toString(); + }); + + child.on('error', (err) => { + clearTimeout(timeout); + reject(new Error(`Failed to spawn daemon: ${err.message}`)); + }); + + child.on('exit', (code) => { + clearTimeout(timeout); + if (code !== 0) { + const details = [ + stderrData.trim() && `stderr: ${stderrData.trim()}`, + stdoutData.trim() && `stdout: ${stdoutData.trim()}`, + `binary: ${binaryPath}`, + `socket: ${socketPath}`, + ].filter(Boolean).join('\n'); + reject(new Error(`Daemon exited with code ${code}\n${details}`)); + } + }); + }); + } +} diff --git a/packages/varlock/src/lib/local-encrypt/file-backend.test.ts b/packages/varlock/src/lib/local-encrypt/file-backend.test.ts new file mode 100644 index 00000000..afdcbf06 --- /dev/null +++ b/packages/varlock/src/lib/local-encrypt/file-backend.test.ts @@ -0,0 +1,81 @@ +import { + describe, it, expect, beforeEach, afterEach, vi, +} from 'vitest'; +import fs from 'node:fs'; +import path from 'node:path'; +import os from 'node:os'; +import { + keyExists, generateKey, deleteKey, listKeys, encryptValue, decryptValue, +} from './file-backend'; + +// Use a temp directory for all key operations during tests +const testDir = path.join(os.tmpdir(), `varlock-test-${process.pid}`); + +vi.mock('../user-config-dir', () => ({ + getUserVarlockDir: () => testDir, +})); + +beforeEach(() => { + fs.mkdirSync(testDir, { recursive: true }); +}); + +afterEach(() => { + fs.rmSync(testDir, { recursive: true, force: true }); +}); + +describe('file-backend', () => { + it('generates and checks key existence', async () => { + expect(keyExists('test-key')).toBe(false); + const result = await generateKey('test-key'); + expect(result.keyId).toBe('test-key'); + expect(result.publicKey).toBeTruthy(); + expect(keyExists('test-key')).toBe(true); + }); + + it('uses default key id', async () => { + await generateKey(); + expect(keyExists()).toBe(true); + expect(keyExists('varlock-default')).toBe(true); + }); + + it('lists keys', async () => { + expect(listKeys()).toEqual([]); + await generateKey('key-a'); + await generateKey('key-b'); + const keys = listKeys(); + expect(keys).toContain('key-a'); + expect(keys).toContain('key-b'); + expect(keys).toHaveLength(2); + }); + + it('deletes keys', async () => { + await generateKey('to-delete'); + expect(keyExists('to-delete')).toBe(true); + expect(deleteKey('to-delete')).toBe(true); + expect(keyExists('to-delete')).toBe(false); + expect(deleteKey('nonexistent')).toBe(false); + }); + + it('round-trips encrypt → decrypt', async () => { + await generateKey('round-trip'); + const plaintext = 'super secret value!'; + const ciphertext = await encryptValue(plaintext, 'round-trip'); + const decrypted = await decryptValue(ciphertext, 'round-trip'); + expect(decrypted).toBe(plaintext); + }); + + it('fails to encrypt with nonexistent key', async () => { + await expect(encryptValue('test', 'nonexistent')).rejects.toThrow('Key not found'); + }); + + it('fails to decrypt with nonexistent key', async () => { + await expect(decryptValue('dGVzdA==', 'nonexistent')).rejects.toThrow('Key not found'); + }); + + it('fails to decrypt with wrong key', async () => { + await generateKey('key-1'); + await generateKey('key-2'); + const ciphertext = await encryptValue('secret', 'key-1'); + await expect(decryptValue(ciphertext, 'key-2')).rejects.toThrow(); + }); +}); diff --git a/packages/varlock/src/lib/local-encrypt/file-backend.ts b/packages/varlock/src/lib/local-encrypt/file-backend.ts new file mode 100644 index 00000000..e8107c3b --- /dev/null +++ b/packages/varlock/src/lib/local-encrypt/file-backend.ts @@ -0,0 +1,103 @@ +/** + * File-based local encryption backend. + * + * Stores P-256 ECDH key pairs as JSON files on disk with restricted permissions. + * Uses the pure JS ECIES implementation for all crypto operations. + * Works on all platforms — no native binary required. + */ + +import fs from 'node:fs'; +import path from 'node:path'; +import { getUserVarlockDir } from '../user-config-dir'; +import { createKeyPair, encrypt, decrypt } from './crypto'; + +const KEY_STORE_SUBDIR = 'local-encrypt/keys'; +const DEFAULT_KEY_ID = 'varlock-default'; + +interface StoredKeyPair { + keyId: string; + publicKey: string; + privateKey: string; + createdAt: string; +} + +function getKeyStorePath(): string { + return path.join(getUserVarlockDir(), KEY_STORE_SUBDIR); +} + +function getKeyFilePath(keyId: string): string { + return path.join(getKeyStorePath(), `${keyId}.json`); +} + +// ── Key management ───────────────────────────────────────────────────── + +export function keyExists(keyId: string = DEFAULT_KEY_ID): boolean { + return fs.existsSync(getKeyFilePath(keyId)); +} + +export async function generateKey(keyId: string = DEFAULT_KEY_ID): Promise<{ keyId: string; publicKey: string }> { + const keyPair = await createKeyPair(); + + const stored: StoredKeyPair = { + keyId, + publicKey: keyPair.publicKey, + privateKey: keyPair.privateKey, + createdAt: new Date().toISOString(), + }; + + const keyStorePath = getKeyStorePath(); + fs.mkdirSync(keyStorePath, { recursive: true }); + + const filePath = getKeyFilePath(keyId); + fs.writeFileSync(filePath, JSON.stringify(stored, null, 2), { mode: 0o600 }); + + return { keyId, publicKey: keyPair.publicKey }; +} + +export function deleteKey(keyId: string = DEFAULT_KEY_ID): boolean { + const filePath = getKeyFilePath(keyId); + try { + fs.unlinkSync(filePath); + return true; + } catch { + return false; + } +} + +export function listKeys(): Array { + const keyStorePath = getKeyStorePath(); + try { + return fs.readdirSync(keyStorePath) + .filter((f) => f.endsWith('.json')) + .map((f) => f.slice(0, -5)); + } catch { + return []; + } +} + +// ── Internal key loading ─────────────────────────────────────────────── + +function loadKeyPair(keyId: string): StoredKeyPair { + const filePath = getKeyFilePath(keyId); + if (!fs.existsSync(filePath)) { + throw new Error(`Key not found: ${keyId}`); + } + const data = fs.readFileSync(filePath, 'utf-8'); + return JSON.parse(data) as StoredKeyPair; +} + +function getPublicKey(keyId: string): string { + return loadKeyPair(keyId).publicKey; +} + +// ── Encrypt / Decrypt ────────────────────────────────────────────────── + +export async function encryptValue(plaintext: string, keyId: string = DEFAULT_KEY_ID): Promise { + const publicKey = getPublicKey(keyId); + return encrypt(publicKey, plaintext); +} + +export async function decryptValue(ciphertext: string, keyId: string = DEFAULT_KEY_ID): Promise { + const stored = loadKeyPair(keyId); + return decrypt(stored.privateKey, stored.publicKey, ciphertext); +} diff --git a/packages/varlock/src/lib/local-encrypt/index.ts b/packages/varlock/src/lib/local-encrypt/index.ts new file mode 100644 index 00000000..2b99831d --- /dev/null +++ b/packages/varlock/src/lib/local-encrypt/index.ts @@ -0,0 +1,173 @@ +/** + * Cross-platform local encryption for varlock. + * + * Provides a unified API for encrypting/decrypting secrets using the best + * available backend on the current platform: + * + * 1. macOS Secure Enclave (Swift binary) — hardware-backed, Touch ID + * 2. Windows TPM/Hello (Rust binary) — hardware-backed, Windows Hello (TODO) + * 3. Linux TPM2 (Rust binary) — hardware-backed (TODO) + * 4. File-based (pure JS) — universal fallback, no native binary needed + */ + +import { execFileSync } from 'node:child_process'; +import { resolveNativeBinary } from './binary-resolver'; +import { DaemonClient } from './daemon-client'; +import * as fileBackend from './file-backend'; +import type { BackendInfo, BackendType } from './types'; + +export type { BackendInfo, BackendType } from './types'; + +const DEFAULT_KEY_ID = 'varlock-default'; + +// ── Backend detection ────────────────────────────────────────────────── + +let cachedBackendInfo: BackendInfo | undefined; + +function detectBackendType(): BackendType { + const binaryPath = resolveNativeBinary(); + if (!binaryPath) return 'file'; + + switch (process.platform) { + case 'darwin': return 'secure-enclave'; + // TODO: Windows TPM and Linux TPM2 native backends not yet implemented + // case 'win32': return 'windows-tpm'; + // case 'linux': return 'linux-tpm'; + default: return 'file'; + } +} + +/** Get information about the active encryption backend. */ +export function getBackendInfo(): BackendInfo { + if (cachedBackendInfo) return cachedBackendInfo; + + const type = detectBackendType(); + const binaryPath = type !== 'file' ? resolveNativeBinary() : undefined; + + cachedBackendInfo = { + type, + platform: process.platform, + hardwareBacked: type !== 'file', + biometricAvailable: type === 'secure-enclave' || type === 'windows-tpm', + binaryPath, + }; + + return cachedBackendInfo; +} + +// ── Native binary one-shot commands ──────────────────────────────────── + +function runNativeBinary(args: Array): string { + const binaryPath = resolveNativeBinary(); + if (!binaryPath) { + throw new Error('Native binary not found'); + } + return execFileSync(binaryPath, args, { + encoding: 'utf-8', + timeout: 30_000, + }).trim(); +} + +function runNativeBinaryJson>(args: Array): T { + const output = runNativeBinary(args); + const parsed = JSON.parse(output); + if (parsed.error) { + throw new Error(parsed.error); + } + return parsed as T; +} + +// ── Daemon client (singleton for biometric-enabled backends) ─────────── + +let daemonClient: DaemonClient | undefined; + +function getDaemonClient(): DaemonClient { + daemonClient ||= new DaemonClient(); + return daemonClient; +} + +// ── Key management ───────────────────────────────────────────────────── + +/** Check if a key exists. */ +export function keyExists(keyId: string = DEFAULT_KEY_ID): boolean { + const backend = getBackendInfo(); + if (backend.type === 'file') { + return fileBackend.keyExists(keyId); + } + const result = runNativeBinaryJson<{ exists: boolean }>(['key-exists', '--key-id', keyId]); + return result.exists; +} + +/** Generate a new encryption key. */ +export async function generateKey(keyId: string = DEFAULT_KEY_ID): Promise<{ keyId: string; publicKey: string }> { + const backend = getBackendInfo(); + if (backend.type === 'file') { + return fileBackend.generateKey(keyId); + } + return runNativeBinaryJson<{ keyId: string; publicKey: string }>(['generate-key', '--key-id', keyId]); +} + +/** Ensure a key exists, generating one if necessary. */ +export async function ensureKey(keyId: string = DEFAULT_KEY_ID): Promise { + if (!keyExists(keyId)) { + await generateKey(keyId); + } +} + +// ── Encrypt / Decrypt ────────────────────────────────────────────────── + +/** + * Encrypt a plaintext value. + * + * For hardware-backed backends, encryption uses the public key only (no biometric needed). + * For file-based backend, uses the pure JS ECIES implementation. + */ +export async function encryptValue(plaintext: string, keyId: string = DEFAULT_KEY_ID): Promise { + const backend = getBackendInfo(); + if (backend.type === 'file') { + return fileBackend.encryptValue(plaintext, keyId); + } + // Native binary encrypt (one-shot, no biometric needed for encrypt) + const b64Input = Buffer.from(plaintext, 'utf-8').toString('base64'); + const result = runNativeBinaryJson<{ ciphertext: string }>(['encrypt', '--key-id', keyId, '--data', b64Input]); + return result.ciphertext; +} + +/** + * Decrypt a ciphertext value. + * + * For biometric-enabled backends (macOS Secure Enclave, Windows Hello), + * uses the daemon client for session caching (avoids repeated biometric prompts). + * For file-based backend, uses the pure JS ECIES implementation. + */ +export async function decryptValue(ciphertext: string, keyId: string = DEFAULT_KEY_ID): Promise { + const backend = getBackendInfo(); + if (backend.type === 'file') { + return fileBackend.decryptValue(ciphertext, keyId); + } + + // Use daemon client for biometric backends (session caching) + if (backend.biometricAvailable) { + const client = getDaemonClient(); + return client.decrypt(ciphertext, keyId); + } + + // Non-biometric native backend (e.g., Linux TPM without polkit) — one-shot + const result = runNativeBinaryJson<{ plaintext: string }>(['decrypt', '--key-id', keyId, '--data', ciphertext]); + return result.plaintext; +} + +/** + * Invalidate the biometric session, requiring re-authentication for next decrypt. + * Connects to the running daemon without spawning one (varlock lock runs in a separate process). + */ +export async function lockSession(): Promise { + const backend = getBackendInfo(); + if (!backend.biometricAvailable) return; + const client = getDaemonClient(); + const connected = await client.tryConnect(); + if (!connected) { + throw new Error('No encryption daemon is running'); + } + await client.invalidateSession(); +} diff --git a/packages/varlock/src/lib/local-encrypt/types.ts b/packages/varlock/src/lib/local-encrypt/types.ts new file mode 100644 index 00000000..f6125b07 --- /dev/null +++ b/packages/varlock/src/lib/local-encrypt/types.ts @@ -0,0 +1,42 @@ +/** + * Shared types for the local encryption system. + */ + +/** Which encryption backend is active */ +export type BackendType = ( + | 'secure-enclave' // macOS Secure Enclave (Swift binary) + | 'windows-tpm' // Windows TPM via NCrypt (Rust binary) + | 'linux-tpm' // Linux TPM2 (Rust binary) + | 'file' // Pure JS file-based (universal fallback) +); + +/** Information about the active encryption backend */ +export interface BackendInfo { + type: BackendType; + platform: NodeJS.Platform; + hardwareBacked: boolean; + biometricAvailable: boolean; + binaryPath?: string; +} + +/** IPC daemon message format (length-prefixed JSON over Unix socket or named pipe) */ +export interface DaemonMessage { + id: string; + action: 'decrypt' | 'encrypt' | 'prompt-secret' | 'ping' | 'invalidate-session'; + payload?: Record; +} + +/** IPC daemon response format */ +export interface DaemonResponse { + id: string; + result?: unknown; + error?: string; +} + +/** Result from the status command of a native binary */ +export interface NativeStatusResult { + backend: string; + hardwareBacked: boolean; + biometricAvailable: boolean; + keys: Array; +} diff --git a/smoke-tests/smoke-test-plugin/plugins/legacy-global-plugin.js b/smoke-tests/smoke-test-plugin/plugins/legacy-global-plugin.js index 59a9d455..e491efee 100644 --- a/smoke-tests/smoke-test-plugin/plugins/legacy-global-plugin.js +++ b/smoke-tests/smoke-test-plugin/plugins/legacy-global-plugin.js @@ -1,5 +1,7 @@ // Legacy plugin that uses the old implicit `plugin` global (no require). // Used to verify the migration error message is shown. + +// eslint-disable-next-line no-undef plugin.registerResolverFunction({ name: 'legacyTest', argsSchema: { From 48f4feb57f40038773ed42ce0dbc4b3a7879af80 Mon Sep 17 00:00:00 2001 From: Theo Ephraim Date: Wed, 8 Apr 2026 15:56:06 -0700 Subject: [PATCH 2/3] gh actions changes --- .github/workflows/binary-release.yaml | 37 +++++ .github/workflows/build-native-macos.yaml | 142 +++++++++++++++++++ .github/workflows/notarize-native-macos.yaml | 91 ++++++++++++ .github/workflows/release-preview.yaml | 46 ------ .github/workflows/release.yaml | 32 +++++ .github/workflows/test.yaml | 116 ++++++++++++--- bun.lock | 17 +-- package.json | 6 +- scripts/check-release-packages.ts | 65 +++++++++ scripts/release-preview.ts | 68 ++------- scripts/update-homebrew-formula.ts | 2 +- tsconfig.json | 11 ++ turbo.json | 3 + 13 files changed, 499 insertions(+), 137 deletions(-) create mode 100644 .github/workflows/build-native-macos.yaml create mode 100644 .github/workflows/notarize-native-macos.yaml delete mode 100644 .github/workflows/release-preview.yaml create mode 100644 scripts/check-release-packages.ts create mode 100644 tsconfig.json diff --git a/.github/workflows/binary-release.yaml b/.github/workflows/binary-release.yaml index 29bcaefd..fcfb9d99 100644 --- a/.github/workflows/binary-release.yaml +++ b/.github/workflows/binary-release.yaml @@ -12,6 +12,9 @@ on: release: types: [published] +permissions: + contents: read + concurrency: ${{ github.workflow }}-${{ github.ref }} jobs: @@ -24,10 +27,35 @@ jobs: run: | echo "$GITHUB_CONTEXT" + # Build and sign the macOS native binary (cache hit if already built in CI) + build-native-macos: + if: github.event_name == 'workflow_dispatch' || startsWith(github.ref_name, 'varlock@') + uses: ./.github/workflows/build-native-macos.yaml + with: + mode: release + version: ${{ github.event_name == 'workflow_dispatch' && inputs.version || github.ref_name }} + artifact-name: native-bin-macos-signed + secrets: + OP_CI_TOKEN: ${{ secrets.OP_CI_TOKEN }} + + # Notarize the signed binary for production distribution + notarize-native-macos: + needs: build-native-macos + if: github.event_name == 'workflow_dispatch' || startsWith(github.ref_name, 'varlock@') + uses: ./.github/workflows/notarize-native-macos.yaml + with: + source-artifact-name: native-bin-macos-signed + artifact-name: native-bin-macos-release + secrets: + OP_CI_TOKEN: ${{ secrets.OP_CI_TOKEN }} + release-binaries: + needs: notarize-native-macos # was using github.ref.tag_name, but it seems that when publishing multiple tags at once, it was behaving weirdly if: github.event_name == 'workflow_dispatch' || startsWith(github.ref_name, 'varlock@') runs-on: ubuntu-latest + permissions: + contents: write steps: - uses: actions/checkout@v6 - name: Setup Bun @@ -63,6 +91,15 @@ jobs: echo "RELEASE_TAG=varlock@${{ inputs.version }}" >> $GITHUB_ENV echo "RELEASE_VERSION=${{ inputs.version }}" >> $GITHUB_ENV + # Download the signed macOS native binary + - name: Download macOS native binary + uses: actions/download-artifact@v8 + with: + name: native-bin-macos-release + path: packages/varlock/native-bins/darwin/VarlockEnclave.app + - name: Restore native binary execute permission + run: chmod +x packages/varlock/native-bins/darwin/VarlockEnclave.app/Contents/MacOS/varlock-local-encrypt + - name: build libs run: bun run build:libs env: diff --git a/.github/workflows/build-native-macos.yaml b/.github/workflows/build-native-macos.yaml new file mode 100644 index 00000000..a773decc --- /dev/null +++ b/.github/workflows/build-native-macos.yaml @@ -0,0 +1,142 @@ +name: Build macOS native binary + +# Reusable workflow that compiles, bundles, and Developer ID signs the +# VarlockEnclave Swift binary on a macOS runner. +# +# The Swift .build directory is cached by source hash, so the compile +# step (~minutes) is near-instant on cache hit. The .app bundle wrapping +# (plist, icon, signing) always runs since it varies by mode/version. +# +# Notarization is intentionally NOT included here — it's a separate +# workflow for production releases. + +permissions: + contents: read + +on: + workflow_call: + inputs: + mode: + description: 'Build mode: dev, preview, or release (affects bundle metadata)' + type: string + default: 'preview' + version: + description: 'Bundle version string (e.g. 1.2.3)' + type: string + default: '0.0.0-preview' + artifact-name: + description: 'Name for the uploaded artifact' + type: string + default: 'native-bin-macos' + secrets: + OP_CI_TOKEN: + required: true + +jobs: + build-swift-binary: + runs-on: macos-latest + steps: + - uses: actions/checkout@v6 + + - name: Setup Bun + uses: oven-sh/setup-bun@v2 + + # skip bun dep caching since less likely to hit + + - name: Install node deps + run: bun install + + - name: Enable turborepo build cache + uses: rharkor/caching-for-turbo@v2.3.11 + + # Cache the Swift .build directory so compilation is fast on unchanged source + - name: Compute Swift source hash + id: swift-hash + run: | + HASH=$(find packages/encryption-binary-swift/swift -type f | sort | xargs shasum -a 256 | shasum -a 256 | cut -d' ' -f1) + echo "hash=$HASH" >> $GITHUB_OUTPUT + echo "Swift source hash: $HASH" + + - name: Cache Swift build artifacts + uses: actions/cache@v5 + with: + path: packages/encryption-binary-swift/swift/.build + key: varlock-swift-build-${{ steps.swift-hash.outputs.hash }} + + # Build varlock JS so we can use it to resolve secrets from 1Password + - name: Build varlock libs + run: bun run build:libs + + # Load secrets from 1Password via varlock (scoped to the Swift package) + - name: Load signing secrets + uses: dmno-dev/varlock-action@v1.0.1 + with: + working-directory: packages/encryption-binary-swift + env: + OP_CI_TOKEN: ${{ secrets.OP_CI_TOKEN }} + + # Import signing certificate into a temporary keychain + - name: Import signing certificate + run: | + KEYCHAIN_PATH=$RUNNER_TEMP/signing.keychain-db + KEYCHAIN_PASSWORD=$(openssl rand -base64 24) + + echo "$APPLE_CERTIFICATE_BASE64" | base64 --decode > $RUNNER_TEMP/certificate.p12 + + security create-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH" + security set-keychain-settings -lut 21600 "$KEYCHAIN_PATH" + security unlock-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH" + + security import $RUNNER_TEMP/certificate.p12 \ + -P "$APPLE_CERTIFICATE_PASSWORD" \ + -A -t cert -f pkcs12 \ + -k "$KEYCHAIN_PATH" + + security set-key-partition-list -S apple-tool:,apple:,codesign: \ + -s -k "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH" + + security list-keychains -d user -s "$KEYCHAIN_PATH" login.keychain-db + + echo "APPLE_SIGNING_IDENTITY=$APPLE_SIGNING_IDENTITY" >> $GITHUB_ENV + + # Compile (cached), bundle with mode-specific metadata, and sign + - name: Build, bundle, and sign + run: | + bun run --filter @varlock/encryption-binary-swift build:swift \ + -- --mode ${{ inputs.mode }} --version ${{ inputs.version }} --sign "$APPLE_SIGNING_IDENTITY" + + - name: Verify binary + run: | + APP_PATH="packages/varlock/native-bins/darwin/VarlockEnclave.app" + echo "=== App bundle contents ===" + ls -la "$APP_PATH/Contents/MacOS/" + echo "=== Binary architectures ===" + lipo -info "$APP_PATH/Contents/MacOS/varlock-local-encrypt" + echo "=== Code signature ===" + codesign -dvv "$APP_PATH" 2>&1 || true + echo "=== Info.plist ===" + cat "$APP_PATH/Contents/Info.plist" + + - name: Upload native binary artifact + uses: actions/upload-artifact@v7 + with: + name: ${{ inputs.artifact-name }} + path: packages/varlock/native-bins/darwin/VarlockEnclave.app + retention-days: 7 + + # Cache the signed .app so other jobs (e.g. release-preview) can restore + # it on a Linux runner without needing a macOS build + - name: Cache signed .app bundle + uses: actions/cache/save@v5 + with: + path: packages/varlock/native-bins/darwin/VarlockEnclave.app + key: native-bin-macos-signed-${{ hashFiles('packages/encryption-binary-swift/swift/**') }} + + - name: Cleanup signing keychain + if: always() + run: | + KEYCHAIN_PATH=$RUNNER_TEMP/signing.keychain-db + if [ -f "$KEYCHAIN_PATH" ]; then + security delete-keychain "$KEYCHAIN_PATH" || true + fi + rm -f $RUNNER_TEMP/certificate.p12 diff --git a/.github/workflows/notarize-native-macos.yaml b/.github/workflows/notarize-native-macos.yaml new file mode 100644 index 00000000..8169a7c2 --- /dev/null +++ b/.github/workflows/notarize-native-macos.yaml @@ -0,0 +1,91 @@ +name: Notarize macOS native binary + +# Reusable workflow that takes an already-signed .app bundle artifact, +# submits it to Apple for notarization, and staples the ticket. +# Requires a macOS runner for xcrun. + +permissions: + contents: read + +on: + workflow_call: + inputs: + source-artifact-name: + description: 'Name of the signed .app artifact to notarize' + type: string + required: true + artifact-name: + description: 'Name for the notarized artifact' + type: string + default: 'native-bin-macos-notarized' + secrets: + OP_CI_TOKEN: + required: true + +jobs: + notarize: + runs-on: macos-latest + steps: + - uses: actions/checkout@v6 + + - name: Setup Bun + uses: oven-sh/setup-bun@v2 + + # skip bun dep caching since less likely to hit + + - name: Install node deps + run: bun install + + - name: Enable turborepo build cache + uses: rharkor/caching-for-turbo@v2.3.11 + + - name: Build varlock libs + run: bun run build:libs + + - name: Download signed .app bundle + uses: actions/download-artifact@v8 + with: + name: ${{ inputs.source-artifact-name }} + path: VarlockEnclave.app + + # Load secrets from 1Password via varlock (scoped to the Swift package) + - name: Load signing secrets + uses: dmno-dev/varlock-action@v1.0.1 + with: + working-directory: packages/encryption-binary-swift + env: + OP_CI_TOKEN: ${{ secrets.OP_CI_TOKEN }} + + - name: Notarize and staple + working-directory: packages/encryption-binary-swift + run: | + APP_PATH="$GITHUB_WORKSPACE/VarlockEnclave.app" + + # Create a zip for notarization submission + ditto -c -k --keepParent "$APP_PATH" $RUNNER_TEMP/VarlockEnclave.zip + + # Submit for notarization and wait + xcrun notarytool submit $RUNNER_TEMP/VarlockEnclave.zip \ + --apple-id "$APPLE_ID" \ + --password "$APPLE_APP_PASSWORD" \ + --team-id "$APPLE_TEAM_ID" \ + --wait + + # Staple the notarization ticket to the app bundle + xcrun stapler staple "$APP_PATH" + env: + OP_CI_TOKEN: ${{ secrets.OP_CI_TOKEN }} + + - name: Verify notarization + run: | + echo "=== Code signature ===" + codesign -dvv VarlockEnclave.app 2>&1 || true + echo "=== Notarization staple ===" + xcrun stapler validate VarlockEnclave.app + + - name: Upload notarized artifact + uses: actions/upload-artifact@v7 + with: + name: ${{ inputs.artifact-name }} + path: VarlockEnclave.app + retention-days: 7 diff --git a/.github/workflows/release-preview.yaml b/.github/workflows/release-preview.yaml deleted file mode 100644 index 5859e5ca..00000000 --- a/.github/workflows/release-preview.yaml +++ /dev/null @@ -1,46 +0,0 @@ -name: Release _preview_ packages -on: - pull_request: - push: - branches-ignore: - - main - - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v6 - with: - # by default only the current commit is fetched - # but we need more history to be able to compare to main - # TODO: ideally we would just fetch the history between origin/main and the current commit - fetch-depth: 0 - - name: Setup Bun - uses: oven-sh/setup-bun@v2 - - name: Cache bun dependencies - uses: actions/cache@v5 - with: - path: ~/.bun/install/cache - key: bun-${{ runner.os }}-${{ hashFiles('bun.lock') }} - restore-keys: | - bun-${{ runner.os }}- - - name: Use Node.js 24.x - uses: actions/setup-node@v6 - with: - node-version: "24.x" - - name: Install node deps - run: bun install - - name: Enable turborepo build cache - uses: rharkor/caching-for-turbo@v2.3.11 - - # ------------------------------------------------------------ - - name: Build publishable npm packages - run: bun run build:libs - env: - BUILD_TYPE: preview - # we use a custom script to run `npx pkg-pr-new publish` - # so that we can determine which packages to release - - name: Release preview packages - run: bun run scripts/release-preview.ts diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 66143316..5025a21a 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -5,11 +5,34 @@ on: branches: - main +permissions: + contents: read + concurrency: ${{ github.workflow }}-${{ github.ref }} jobs: + # Build and sign the macOS native binary (cache hit if already built in CI) + build-native-macos: + uses: ./.github/workflows/build-native-macos.yaml + with: + mode: release + artifact-name: native-bin-macos-signed + secrets: + OP_CI_TOKEN: ${{ secrets.OP_CI_TOKEN }} + + # Notarize for production npm distribution + notarize-native-macos: + needs: build-native-macos + uses: ./.github/workflows/notarize-native-macos.yaml + with: + source-artifact-name: native-bin-macos-signed + artifact-name: native-bin-macos-npm + secrets: + OP_CI_TOKEN: ${{ secrets.OP_CI_TOKEN }} + release: name: Release + needs: notarize-native-macos runs-on: ubuntu-latest permissions: id-token: write # Required for OIDC @@ -45,6 +68,15 @@ jobs: - name: Update npm run: npm install -g npm@latest + # Download signed macOS native binary so it's included in the npm package + - name: Download macOS native binary + uses: actions/download-artifact@v8 + with: + name: native-bin-macos-npm + path: packages/varlock/native-bins/darwin/VarlockEnclave.app + - name: Restore native binary execute permission + run: chmod +x packages/varlock/native-bins/darwin/VarlockEnclave.app/Contents/MacOS/varlock-local-encrypt + # ------------------------------------------------------------ - name: Create Release Pull Request or Publish to npm id: changesets diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index dddb41ba..b4e6aff6 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -2,19 +2,25 @@ name: CI test suite on: pull_request: push: + branches: [main] +permissions: + contents: read jobs: - build: + build-and-test: runs-on: ubuntu-latest - + outputs: + swift-changed: ${{ steps.check-swift.outputs.changed }} steps: - uses: actions/checkout@v6 + with: + fetch-depth: 0 - name: Setup Bun uses: oven-sh/setup-bun@v2 + # this caching step is kind of a wash - # downloading the cache adds a few seconds - # and then installing is a bit faster + # downloading the cache adds a few seconds and then installing is a bit faster - name: Cache bun dependencies uses: actions/cache@v5 with: @@ -28,22 +34,10 @@ jobs: node-version: "24.x" - name: Install js deps (w/ bun) run: bun install - - name: Dogfood varlock-action - id: varlock - uses: dmno-dev/varlock-action@v1.0.1 - with: - working-directory: smoke-tests/smoke-test-basic - show-summary: 'false' - fail-on-error: 'true' - output-format: 'json' - - name: Verify varlock-action output - run: | - test -n "${{ steps.varlock.outputs.json-env }}" - echo "Varlock action output is present" - name: Enable turborepo build cache uses: rharkor/caching-for-turbo@v2.3.11 - # ------------------------------------------------------------ + # lint, build, tests --------------------------------- - name: ESLint run: bun run lint - name: TypeScript type check @@ -52,3 +46,91 @@ jobs: run: bun run build:libs - name: Run tests run: bun run test:ci + + # Check if Swift source changed (used to gate macOS native build) + - name: Check for Swift source changes + id: check-swift + run: | + if git diff --name-only origin/main...HEAD | grep -q '^packages/encryption-binary-swift/'; then + echo "changed=true" >> $GITHUB_OUTPUT + else + echo "changed=false" >> $GITHUB_OUTPUT + fi + + # Build + sign the macOS native binary if Swift source changed (warms the cache) + # this must be done on a mac-os runner + build-native-macos: + needs: build-and-test + if: needs.build-and-test.outputs.swift-changed == 'true' + uses: ./.github/workflows/build-native-macos.yaml + with: + artifact-name: native-bin-macos-ci + secrets: + OP_CI_TOKEN: ${{ secrets.OP_CI_TOKEN }} + + # Publish preview packages via pkg-pr-new + release-preview-packages: + needs: [build-and-test, build-native-macos] + # Run even if build-native-macos was skipped, but not if anything failed. Skip on main. + if: always() && !failure() && !cancelled() && github.ref_name != 'main' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + - name: Setup Bun + uses: oven-sh/setup-bun@v2 + - name: Cache bun dependencies + uses: actions/cache@v5 + with: + path: ~/.bun/install/cache + key: bun-${{ runner.os }}-${{ hashFiles('bun.lock') }} + restore-keys: | + bun-${{ runner.os }}- + - name: Use Node.js 24.x + uses: actions/setup-node@v6 + with: + node-version: "24.x" + - name: Install node deps + run: bun install + - name: Enable turborepo build cache + uses: rharkor/caching-for-turbo@v2.3.11 + + # Determine which packages will be preview-released + - name: Check release packages + id: check-release + run: bun run scripts/check-release-packages.ts + + # Get signed macOS .app if varlock is being released + # If the macOS build ran this run (swift changed), download the artifact directly + # Otherwise, restore from cross-run cache + - name: Download macOS native binary (from this run) + if: steps.check-release.outputs.includes-varlock == 'true' && needs.build-and-test.outputs.swift-changed == 'true' + uses: actions/download-artifact@v8 + with: + name: native-bin-macos-ci + path: packages/varlock/native-bins/darwin/VarlockEnclave.app + - name: Restore cached macOS native binary (from prior run) + if: steps.check-release.outputs.includes-varlock == 'true' && needs.build-and-test.outputs.swift-changed != 'true' + uses: actions/cache/restore@v5 + with: + path: packages/varlock/native-bins/darwin/VarlockEnclave.app + key: native-bin-macos-signed-${{ hashFiles('packages/encryption-binary-swift/swift/**') }} + - name: Verify and fix native binary permissions + if: steps.check-release.outputs.includes-varlock == 'true' + run: | + BINARY=packages/varlock/native-bins/darwin/VarlockEnclave.app/Contents/MacOS/varlock-local-encrypt + if [ ! -f "$BINARY" ]; then + echo "::error::macOS native binary not found — cannot publish varlock preview without it" + exit 1 + fi + chmod +x "$BINARY" + + - name: Build publishable npm packages + run: bun run build:libs + env: + BUILD_TYPE: preview + - name: Release preview packages + run: bun run scripts/release-preview.ts + env: + RELEASE_PACKAGES: ${{ steps.check-release.outputs.packages }} diff --git a/bun.lock b/bun.lock index bdd306d7..e47f7845 100644 --- a/bun.lock +++ b/bun.lock @@ -9,6 +9,7 @@ "@cloudflare/vite-plugin": "^1.30.1", "@eslint/js": "^10.0.1", "@stylistic/eslint-plugin": "^5.9.0", + "@types/node": "catalog:", "@typescript-eslint/eslint-plugin": "^8.56.1", "@typescript-eslint/parser": "^8.56.1", "@varlock/changeset-changelog": "workspace:*", @@ -344,20 +345,6 @@ "varlock": "workspace:^", }, }, - "packages/plugins/secure-enclave": { - "name": "@varlock/secure-enclave-plugin", - "version": "0.0.1", - "devDependencies": { - "@env-spec/utils": "workspace:^", - "@types/node": "catalog:", - "tsup": "catalog:", - "varlock": "workspace:^", - "vitest": "catalog:", - }, - "peerDependencies": { - "varlock": "workspace:^", - }, - }, "packages/tsconfig": { "name": "@varlock/tsconfig", "version": "0.0.0", @@ -1347,8 +1334,6 @@ "@varlock/proton-pass-plugin": ["@varlock/proton-pass-plugin@workspace:packages/plugins/proton-pass"], - "@varlock/secure-enclave-plugin": ["@varlock/secure-enclave-plugin@workspace:packages/plugins/secure-enclave"], - "@varlock/tsconfig": ["@varlock/tsconfig@workspace:packages/tsconfig"], "@varlock/vite-integration": ["@varlock/vite-integration@workspace:packages/integrations/vite"], diff --git a/package.json b/package.json index 55f67dd3..6e284b2c 100644 --- a/package.json +++ b/package.json @@ -18,8 +18,9 @@ "test:ci": "turbo test:ci --filter=\"!smoke-test-*\"", "smoke-test": "cd smoke-tests && bun run test", "test:frameworks": "cd framework-tests && bun run test", - "typecheck": "turbo typecheck --filter=\"!@varlock/website\" --filter=\"!smoke-test-*\" --filter=\"!varlock-docs-mcp\"", - "check": "bun run lint && bun run typecheck && bun run build:libs && bun run test:ci", + "typecheck": "tsc --noEmit", + "typecheck:all": "turbo typecheck --filter=\"!@varlock/website\" --filter=\"!smoke-test-*\" --filter=\"!varlock-docs-mcp\"", + "check": "bun run lint && bun run typecheck:all && bun run build:libs && bun run test:ci", "dev": "turbo run dev --concurrency=40 --parallel --filter=\"!smoke-test-*\"", "lint": "eslint .", "lint:fix": "eslint . --fix", @@ -34,6 +35,7 @@ "@cloudflare/vite-plugin": "^1.30.1", "@eslint/js": "^10.0.1", "@stylistic/eslint-plugin": "^5.9.0", + "@types/node": "catalog:", "@typescript-eslint/eslint-plugin": "^8.56.1", "@typescript-eslint/parser": "^8.56.1", "@varlock/changeset-changelog": "workspace:*", diff --git a/scripts/check-release-packages.ts b/scripts/check-release-packages.ts new file mode 100644 index 00000000..30a4d420 --- /dev/null +++ b/scripts/check-release-packages.ts @@ -0,0 +1,65 @@ +/** + * Determines which packages would be published in a preview release. + * Outputs a JSON array of package paths and a flag for whether varlock is included. + * + * Usage: + * bun run scripts/check-release-packages.ts + * + * Outputs (via GITHUB_OUTPUT if available): + * packages=["path1","path2"] + * includes-varlock=true|false + */ +import { execSync } from 'node:child_process'; +import fs from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { listWorkspaces } from './list-workspaces'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const MONOREPO_ROOT = path.resolve(__dirname, '..'); + +const workspacePackagesInfo = await listWorkspaces(MONOREPO_ROOT); + +const currentBranch = process.env.GITHUB_HEAD_REF || execSync('git branch --show-current').toString().trim(); +let releasePackagePaths: Array; + +if (currentBranch === 'changeset-release/main') { + const gitDiff = execSync('git diff origin/main --name-only').toString(); + const modifiedPackageJsons = gitDiff + .split('\n') + .filter((filePath) => filePath !== 'package.json') + .filter((filePath) => filePath.endsWith('package.json')); + + releasePackagePaths = modifiedPackageJsons + .map((filePath) => `${MONOREPO_ROOT}/${filePath.replace('/package.json', '')}`) + .filter((filePath) => workspacePackagesInfo.some((p) => p.path === filePath)); +} else { + execSync('bunx changeset status --output=changesets-summary.json', { cwd: MONOREPO_ROOT }); + + const changeSetsSummaryRaw = fs.readFileSync(path.join(MONOREPO_ROOT, 'changesets-summary.json'), 'utf8'); + const changeSetsSummary = JSON.parse(changeSetsSummaryRaw); + + releasePackagePaths = changeSetsSummary.releases + .filter((r: any) => r.newVersion !== r.oldVersion) + .map((r: any) => workspacePackagesInfo.find((p) => p.name === r.name)) + .filter(Boolean) + .map((p: any) => p.path); + + fs.unlinkSync(path.join(MONOREPO_ROOT, 'changesets-summary.json')); +} + +// filter out vscode extension which is not released via npm +releasePackagePaths = releasePackagePaths.filter((p: string) => !p.endsWith('packages/vscode-plugin')); + +const includesVarlock = releasePackagePaths.some((p) => p.endsWith('packages/varlock')); + +console.log('Packages to release:', releasePackagePaths); +console.log('Includes varlock:', includesVarlock); + +// Write to GITHUB_OUTPUT if running in CI +const githubOutput = process.env.GITHUB_OUTPUT; +if (githubOutput) { + fs.appendFileSync(githubOutput, `packages=${JSON.stringify(releasePackagePaths)}\n`); + fs.appendFileSync(githubOutput, `includes-varlock=${includesVarlock}\n`); +} diff --git a/scripts/release-preview.ts b/scripts/release-preview.ts index 2f6e45e6..85893882 100644 --- a/scripts/release-preview.ts +++ b/scripts/release-preview.ts @@ -1,63 +1,26 @@ import { execSync, execFileSync } from 'node:child_process'; -import fs from 'node:fs'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; -import { listWorkspaces } from './list-workspaces'; const __filename = fileURLToPath(import.meta.url); const MONOREPO_ROOT = path.resolve(path.dirname(__filename), '..'); -let err: unknown; -try { - const workspacePackagesInfo = await listWorkspaces(MONOREPO_ROOT); - - // Check if we're on changeset-release/main branch - const currentBranch = process.env.GITHUB_HEAD_REF || execSync('git branch --show-current').toString().trim(); - let releasePackagePaths: Array; - - console.log('current branch = ', currentBranch); - - if (currentBranch === 'changeset-release/main') { - // On changeset-release/main branch, find modified package.json files - console.log('Running on changeset-release/main branch, finding modified package.json files...'); - const gitDiff = execSync('git diff origin/main --name-only').toString(); - const modifiedPackageJsons = gitDiff - .split('\n') - .filter((filePath) => filePath !== 'package.json') // skip root package.json - .filter((filePath) => filePath.endsWith('package.json')); - - if (!modifiedPackageJsons.length) { - console.log('No modified package.json files found!'); - process.exit(0); - } - - // Get the workspace paths for modified packages - releasePackagePaths = modifiedPackageJsons - .map((filePath) => `${MONOREPO_ROOT}/${filePath.replace('/package.json', '')}`) - .filter((filePath) => workspacePackagesInfo.some((p) => p.path === filePath)); - } else { - console.log('Running on normal PR, using changesets to determine packages to release...'); - // Regular changeset-based logic - // generate summary of changed (publishable) modules according to changesets - execSync('bunx changeset status --output=changesets-summary.json'); - - const changeSetsSummaryRaw = fs.readFileSync('./changesets-summary.json', 'utf8'); - const changeSetsSummary = JSON.parse(changeSetsSummaryRaw); - - releasePackagePaths = changeSetsSummary.releases - .filter((r: any) => r.newVersion !== r.oldVersion) - .map((r: any) => workspacePackagesInfo.find((p) => p.name === r.name)) - .map((p: any) => p.path); - } +// Accept package paths from RELEASE_PACKAGES env var (set by check-release-packages step) +const releasePackagesEnv = process.env.RELEASE_PACKAGES; +if (!releasePackagesEnv) { + console.error('RELEASE_PACKAGES env var not set — run check-release-packages.ts first'); + process.exit(1); +} - // filter out vscode extension which is not released via npm - releasePackagePaths = releasePackagePaths.filter((p: string) => !p.endsWith('packages/vscode-plugin')); +const releasePackagePaths: Array = JSON.parse(releasePackagesEnv); - if (!releasePackagePaths.length) { - console.log('No packages to release!'); - process.exit(0); - } +if (!releasePackagePaths.length) { + console.log('No packages to release!'); + process.exit(0); +} +let err: unknown; +try { console.log('Updated packages to release:', releasePackagePaths); // Resolve workspace: and catalog: protocols in package.json files before publishing @@ -73,9 +36,4 @@ try { console.error('preview release failed'); console.error(_err); } - -// Only clean up changesets-summary.json if it exists (only created in changeset case) -if (fs.existsSync('./changesets-summary.json')) { - fs.unlinkSync('./changesets-summary.json'); -} process.exit(err ? 1 : 0); diff --git a/scripts/update-homebrew-formula.ts b/scripts/update-homebrew-formula.ts index 3a1c5f77..59d21f4f 100644 --- a/scripts/update-homebrew-formula.ts +++ b/scripts/update-homebrew-formula.ts @@ -5,7 +5,7 @@ const VERSION = process.env.RELEASE_VERSION; // get checksums file from dist-sea since we are running this script just after building the binaries const checksumsStr = await fs.readFile(path.join(import.meta.dirname, '../packages/varlock/dist-sea/checksums.txt'), 'utf-8'); -const checksums = {}; +const checksums: Record = {}; checksumsStr.split('\n').forEach((line) => { if (!line.trim()) return; // skip trailing blank line const [sha256, fileName] = line.split(' '); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..57da96b9 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,11 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "extends": "@varlock/tsconfig/base.tsconfig.json", + "compilerOptions": { + "noEmit": true, + "types": ["node"], + // bun supports .ts imports natively, but tsc needs this + "allowImportingTsExtensions": true + }, + "include": ["scripts/**/*.ts"] +} diff --git a/turbo.json b/turbo.json index 93c9000e..5c5d5bdf 100644 --- a/turbo.json +++ b/turbo.json @@ -30,6 +30,9 @@ "dependsOn": ["^typecheck"], "inputs": ["package.json", "tsconfig.json", "tsconfig.*.json", "src/**"] }, + "//#typecheck": { + "inputs": ["tsconfig.json", "scripts/**/*.ts"] + }, "dev": { "cache": false, "persistent": true From 9d6fb0823f3c621717837bce7713f732bab46614 Mon Sep 17 00:00:00 2001 From: Theo Ephraim Date: Wed, 8 Apr 2026 21:03:11 -0700 Subject: [PATCH 3/3] add rust binary for windows/linux --- .github/workflows/binary-release.yaml | 30 +- .github/workflows/build-native-macos.yaml | 77 ++ .github/workflows/build-native-rust.yaml | 211 +++++ .github/workflows/release.yaml | 29 +- .github/workflows/test.yaml | 72 +- eslint.config.mjs | 2 + packages/encryption-binary-rust/.gitignore | 1 + packages/encryption-binary-rust/Cargo.lock | 767 ++++++++++++++++++ packages/encryption-binary-rust/Cargo.toml | 56 ++ packages/encryption-binary-rust/package.json | 12 + .../scripts/build-rust.ts | 113 +++ packages/encryption-binary-rust/src/crypto.rs | 252 ++++++ packages/encryption-binary-rust/src/daemon.rs | 326 ++++++++ packages/encryption-binary-rust/src/ipc.rs | 456 +++++++++++ .../src/key_store/linux.rs | 287 +++++++ .../src/key_store/mod.rs | 368 +++++++++ .../src/key_store/windows.rs | 124 +++ .../src/key_store/windows_hello.rs | 102 +++ packages/encryption-binary-rust/src/main.rs | 246 ++++++ .../VarlockEnclave/SecureEnclaveManager.swift | 15 +- .../swift/Sources/VarlockEnclave/main.swift | 3 +- packages/varlock/scripts/build-binaries.ts | 22 +- .../src/lib/local-encrypt/binary-resolver.ts | 2 +- .../src/lib/local-encrypt/daemon-client.ts | 36 +- .../varlock/src/lib/local-encrypt/index.ts | 88 +- .../varlock/src/lib/local-encrypt/types.ts | 4 +- 26 files changed, 3641 insertions(+), 60 deletions(-) create mode 100644 .github/workflows/build-native-rust.yaml create mode 100644 packages/encryption-binary-rust/.gitignore create mode 100644 packages/encryption-binary-rust/Cargo.lock create mode 100644 packages/encryption-binary-rust/Cargo.toml create mode 100644 packages/encryption-binary-rust/package.json create mode 100644 packages/encryption-binary-rust/scripts/build-rust.ts create mode 100644 packages/encryption-binary-rust/src/crypto.rs create mode 100644 packages/encryption-binary-rust/src/daemon.rs create mode 100644 packages/encryption-binary-rust/src/ipc.rs create mode 100644 packages/encryption-binary-rust/src/key_store/linux.rs create mode 100644 packages/encryption-binary-rust/src/key_store/mod.rs create mode 100644 packages/encryption-binary-rust/src/key_store/windows.rs create mode 100644 packages/encryption-binary-rust/src/key_store/windows_hello.rs create mode 100644 packages/encryption-binary-rust/src/main.rs diff --git a/.github/workflows/binary-release.yaml b/.github/workflows/binary-release.yaml index fcfb9d99..9e7e70f1 100644 --- a/.github/workflows/binary-release.yaml +++ b/.github/workflows/binary-release.yaml @@ -49,8 +49,15 @@ jobs: secrets: OP_CI_TOKEN: ${{ secrets.OP_CI_TOKEN }} + # Build Rust native binaries for Linux and Windows + build-native-rust: + if: github.event_name == 'workflow_dispatch' || startsWith(github.ref_name, 'varlock@') + uses: ./.github/workflows/build-native-rust.yaml + with: + artifact-name: native-bin-rust + release-binaries: - needs: notarize-native-macos + needs: [notarize-native-macos, build-native-rust] # was using github.ref.tag_name, but it seems that when publishing multiple tags at once, it was behaving weirdly if: github.event_name == 'workflow_dispatch' || startsWith(github.ref_name, 'varlock@') runs-on: ubuntu-latest @@ -100,6 +107,27 @@ jobs: - name: Restore native binary execute permission run: chmod +x packages/varlock/native-bins/darwin/VarlockEnclave.app/Contents/MacOS/varlock-local-encrypt + # Download Rust native binaries for Linux and Windows + - name: Download Linux x64 native binary + uses: actions/download-artifact@v8 + with: + name: native-bin-rust-linux-x64 + path: packages/varlock/native-bins/linux-x64 + - name: Download Linux arm64 native binary + uses: actions/download-artifact@v8 + with: + name: native-bin-rust-linux-arm64 + path: packages/varlock/native-bins/linux-arm64 + - name: Download Windows x64 native binary + uses: actions/download-artifact@v8 + with: + name: native-bin-rust-win32-x64 + path: packages/varlock/native-bins/win32-x64 + - name: Restore Rust binary execute permissions + run: | + chmod +x packages/varlock/native-bins/linux-x64/varlock-local-encrypt + chmod +x packages/varlock/native-bins/linux-arm64/varlock-local-encrypt + - name: build libs run: bun run build:libs env: diff --git a/.github/workflows/build-native-macos.yaml b/.github/workflows/build-native-macos.yaml index a773decc..b9e236a3 100644 --- a/.github/workflows/build-native-macos.yaml +++ b/.github/workflows/build-native-macos.yaml @@ -117,6 +117,83 @@ jobs: echo "=== Info.plist ===" cat "$APP_PATH/Contents/Info.plist" + # Test the binary (using --no-auth since CI has no biometric) + # Keys are still Secure Enclave-backed, just without user presence requirement + - name: Test binary - status + run: | + BIN="packages/varlock/native-bins/darwin/VarlockEnclave.app/Contents/MacOS/varlock-local-encrypt" + echo "=== status ===" + $BIN status + $BIN status | python3 -c "import sys,json; d=json.load(sys.stdin); assert d['ok'], 'status not ok'" + + - name: Test binary - SE key lifecycle + encrypt/decrypt roundtrip + run: | + BIN="packages/varlock/native-bins/darwin/VarlockEnclave.app/Contents/MacOS/varlock-local-encrypt" + + echo "=== generate-key (--no-auth for CI) ===" + $BIN generate-key --key-id ci-test --no-auth + + echo "=== key-exists ===" + $BIN key-exists --key-id ci-test | python3 -c "import sys,json; d=json.load(sys.stdin); assert d['exists']" + + echo "=== encrypt ===" + PLAINTEXT=$(printf 'hello from macOS CI' | base64) + CIPHERTEXT=$($BIN encrypt --key-id ci-test --data "$PLAINTEXT" | python3 -c "import sys,json; print(json.load(sys.stdin)['ciphertext'])") + echo "Ciphertext: ${CIPHERTEXT:0:40}..." + + echo "=== decrypt (one-shot, no auth needed) ===" + DECRYPTED=$($BIN decrypt --key-id ci-test --data "$CIPHERTEXT" | python3 -c "import sys,json; print(json.load(sys.stdin)['plaintext'])") + echo "Decrypted: $DECRYPTED" + + if [ "$DECRYPTED" != "hello from macOS CI" ]; then + echo "::error::Roundtrip failed! Expected 'hello from macOS CI', got '$DECRYPTED'" + exit 1 + fi + + echo "=== delete-key ===" + $BIN delete-key --key-id ci-test + + echo "All macOS binary tests passed" + + - name: Test JS→Swift interop + run: | + BIN="packages/varlock/native-bins/darwin/VarlockEnclave.app/Contents/MacOS/varlock-local-encrypt" + + # Generate SE key (no auth for CI) + $BIN generate-key --key-id interop-test --no-auth + + # Get the public key from the SE binary + PUBLIC_KEY=$($BIN generate-key --key-id interop-tmp --no-auth > /dev/null 2>&1; echo "skip") + # Actually, get public key by generating and reading the output + GEN_OUTPUT=$($BIN key-exists --key-id interop-test) + + # Use the SE binary's encrypt to get the public key indirectly: + # generate-key already printed it — let's re-generate to capture it + $BIN delete-key --key-id interop-test > /dev/null + PUBLIC_KEY=$($BIN generate-key --key-id interop-test --no-auth | python3 -c "import sys,json; print(json.load(sys.stdin)['publicKey'])") + echo "SE Public Key: ${PUBLIC_KEY:0:20}..." + + # Encrypt with JS using the SE public key + CIPHERTEXT=$(bun -e " + const { encrypt } = await import('./packages/varlock/src/lib/local-encrypt/crypto.ts'); + const result = await encrypt('$PUBLIC_KEY', 'javascript to secure enclave'); + process.stdout.write(result); + ") + echo "JS Ciphertext: ${CIPHERTEXT:0:40}..." + + # Decrypt with Swift SE binary (proves JS wire format is SE-compatible) + DECRYPTED=$($BIN decrypt --key-id interop-test --data "$CIPHERTEXT" | python3 -c "import sys,json; print(json.load(sys.stdin)['plaintext'])") + + if [ "$DECRYPTED" != "javascript to secure enclave" ]; then + echo "::error::JS→Swift interop failed! Got: $DECRYPTED" + exit 1 + fi + echo "✓ JS→Swift SE: '$DECRYPTED'" + + # Cleanup + $BIN delete-key --key-id interop-test + echo "All macOS interop tests passed" + - name: Upload native binary artifact uses: actions/upload-artifact@v7 with: diff --git a/.github/workflows/build-native-rust.yaml b/.github/workflows/build-native-rust.yaml new file mode 100644 index 00000000..f0efa84f --- /dev/null +++ b/.github/workflows/build-native-rust.yaml @@ -0,0 +1,211 @@ +name: Build Rust native binaries + +# Reusable workflow that compiles the varlock-local-encrypt Rust binary +# for Linux and Windows targets. +# +# Builds are cached by Cargo.lock + source hash. Each platform builds +# natively on its own runner for maximum compatibility. +# +# Output: native binaries uploaded as artifacts, ready to be bundled +# into the varlock npm package and CLI release archives. + +permissions: + contents: read + +on: + workflow_call: + inputs: + artifact-name: + description: 'Base name for uploaded artifacts (suffixed with platform)' + type: string + default: 'native-bin-rust' + +jobs: + build: + strategy: + matrix: + include: + - os: ubuntu-latest + target: x86_64-unknown-linux-gnu + native-bin-subdir: linux-x64 + binary-name: varlock-local-encrypt + - os: ubuntu-24.04-arm + target: aarch64-unknown-linux-gnu + native-bin-subdir: linux-arm64 + binary-name: varlock-local-encrypt + - os: windows-latest + target: x86_64-pc-windows-msvc + native-bin-subdir: win32-x64 + binary-name: varlock-local-encrypt.exe + + runs-on: ${{ matrix.os }} + name: Build ${{ matrix.native-bin-subdir }} + + steps: + - uses: actions/checkout@v6 + + - name: Install Rust toolchain + uses: dtolnay/rust-toolchain@stable + with: + targets: ${{ matrix.target }} + + # Cache Cargo registry + build artifacts by lockfile hash + - name: Cache Cargo + uses: actions/cache@v5 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + packages/encryption-binary-rust/target + key: rust-${{ matrix.target }}-${{ hashFiles('packages/encryption-binary-rust/Cargo.lock') }}-${{ hashFiles('packages/encryption-binary-rust/src/**') }} + restore-keys: | + rust-${{ matrix.target }}-${{ hashFiles('packages/encryption-binary-rust/Cargo.lock') }}- + rust-${{ matrix.target }}- + + - name: Build release binary + working-directory: packages/encryption-binary-rust + run: cargo build --release --target ${{ matrix.target }} + + - name: Prepare artifact + shell: bash + run: | + ARTIFACT_DIR="native-bins/${{ matrix.native-bin-subdir }}" + mkdir -p "$ARTIFACT_DIR" + cp "packages/encryption-binary-rust/target/${{ matrix.target }}/release/${{ matrix.binary-name }}" "$ARTIFACT_DIR/" + echo "=== Binary info ===" + ls -la "$ARTIFACT_DIR/${{ matrix.binary-name }}" + file "$ARTIFACT_DIR/${{ matrix.binary-name }}" || true + + # Run Rust unit tests + - name: Run unit tests + working-directory: packages/encryption-binary-rust + run: cargo test --release --target ${{ matrix.target }} + + # Test the built binary end-to-end (one-shot commands, no biometric) + # Uses python (not python3) for Windows compat; printf for reliable base64 input + - name: Test binary - status + shell: bash + run: | + BIN="native-bins/${{ matrix.native-bin-subdir }}/${{ matrix.binary-name }}" + PY=$(command -v python3 || command -v python) + echo "=== status ===" + $BIN status + $BIN status | $PY -c "import sys,json; d=json.load(sys.stdin); assert d['ok'], 'status not ok'" + + - name: Test binary - key lifecycle + encrypt/decrypt roundtrip + shell: bash + run: | + BIN="native-bins/${{ matrix.native-bin-subdir }}/${{ matrix.binary-name }}" + PY=$(command -v python3 || command -v python) + + echo "=== generate-key ===" + $BIN generate-key --key-id ci-test + $BIN key-exists --key-id ci-test | $PY -c "import sys,json; d=json.load(sys.stdin); assert d['exists']" + + echo "=== encrypt ===" + PLAINTEXT=$($PY -c "import base64; print(base64.b64encode(b'hello from CI').decode())") + CIPHERTEXT=$($BIN encrypt --key-id ci-test --data "$PLAINTEXT" | $PY -c "import sys,json; print(json.load(sys.stdin)['ciphertext'])") + echo "Ciphertext: ${CIPHERTEXT:0:40}..." + + echo "=== decrypt ===" + DECRYPTED=$($BIN decrypt --key-id ci-test --data "$CIPHERTEXT" | $PY -c "import sys,json; print(json.load(sys.stdin)['plaintext'])") + echo "Decrypted: $DECRYPTED" + + if [ "$DECRYPTED" != "hello from CI" ]; then + echo "::error::Roundtrip failed! Expected 'hello from CI', got '$DECRYPTED'" + exit 1 + fi + + echo "=== delete-key ===" + $BIN delete-key --key-id ci-test + + echo "All binary tests passed" + + - name: Upload artifact + uses: actions/upload-artifact@v7 + with: + name: ${{ inputs.artifact-name }}-${{ matrix.native-bin-subdir }} + path: native-bins/${{ matrix.native-bin-subdir }}/ + retention-days: 7 + + # Cache the built binary so preview releases on other runners can restore it + - name: Cache built binary + uses: actions/cache/save@v5 + with: + path: native-bins/${{ matrix.native-bin-subdir }}/ + key: native-bin-rust-${{ matrix.native-bin-subdir }}-${{ hashFiles('packages/encryption-binary-rust/Cargo.lock', 'packages/encryption-binary-rust/src/**') }} + + # Cross-platform interop: encrypt with Rust on Linux, decrypt with JS, and vice versa + test-interop: + needs: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + + - name: Setup Bun + uses: oven-sh/setup-bun@v2 + + - name: Install deps + run: bun install + + - name: Download Linux x64 binary + uses: actions/download-artifact@v7 + with: + name: ${{ inputs.artifact-name }}-linux-x64 + path: native-bins/linux-x64 + + - name: Fix permissions + run: chmod +x native-bins/linux-x64/varlock-local-encrypt + + - name: Test Rust→JS interop + run: | + BIN=native-bins/linux-x64/varlock-local-encrypt + + # Generate a key with Rust + $BIN generate-key --key-id interop-test + KEY_JSON=$(cat ~/.config/varlock/local-encrypt/keys/interop-test.json) + PUBLIC_KEY=$(echo "$KEY_JSON" | python3 -c "import sys,json; print(json.load(sys.stdin)['publicKey'])") + PRIVATE_KEY=$(echo "$KEY_JSON" | python3 -c "import sys,json; print(json.load(sys.stdin)['protectedPrivateKey'])") + + # Encrypt with Rust + PLAINTEXT_B64=$(echo -n "rust to javascript" | base64) + CIPHERTEXT=$($BIN encrypt --key-id interop-test --data "$PLAINTEXT_B64" | python3 -c "import sys,json; print(json.load(sys.stdin)['ciphertext'])") + + # Decrypt with JS + RESULT=$(bun -e " + const { decrypt } = await import('./packages/varlock/src/lib/local-encrypt/crypto.ts'); + const result = await decrypt('$PRIVATE_KEY', '$PUBLIC_KEY', '$CIPHERTEXT'); + process.stdout.write(result); + ") + + if [ "$RESULT" != "rust to javascript" ]; then + echo "::error::Rust→JS interop failed! Got: $RESULT" + exit 1 + fi + echo "✓ Rust→JS: '$RESULT'" + + - name: Test JS→Rust interop + run: | + BIN=native-bins/linux-x64/varlock-local-encrypt + KEY_JSON=$(cat ~/.config/varlock/local-encrypt/keys/interop-test.json) + PUBLIC_KEY=$(echo "$KEY_JSON" | python3 -c "import sys,json; print(json.load(sys.stdin)['publicKey'])") + + # Encrypt with JS + CIPHERTEXT=$(bun -e " + const { encrypt } = await import('./packages/varlock/src/lib/local-encrypt/crypto.ts'); + const result = await encrypt('$PUBLIC_KEY', 'javascript to rust'); + process.stdout.write(result); + ") + + # Decrypt with Rust + RESULT=$($BIN decrypt --key-id interop-test --data "$CIPHERTEXT" | python3 -c "import sys,json; print(json.load(sys.stdin)['plaintext'])") + + if [ "$RESULT" != "javascript to rust" ]; then + echo "::error::JS→Rust interop failed! Got: $RESULT" + exit 1 + fi + echo "✓ JS→Rust: '$RESULT'" + + # Cleanup + $BIN delete-key --key-id interop-test + echo "✓ All cross-platform interop tests passed" diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 5025a21a..69c4f9dc 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -30,9 +30,15 @@ jobs: secrets: OP_CI_TOKEN: ${{ secrets.OP_CI_TOKEN }} + # Build Rust native binaries for Linux and Windows + build-native-rust: + uses: ./.github/workflows/build-native-rust.yaml + with: + artifact-name: native-bin-rust + release: name: Release - needs: notarize-native-macos + needs: [notarize-native-macos, build-native-rust] runs-on: ubuntu-latest permissions: id-token: write # Required for OIDC @@ -77,6 +83,27 @@ jobs: - name: Restore native binary execute permission run: chmod +x packages/varlock/native-bins/darwin/VarlockEnclave.app/Contents/MacOS/varlock-local-encrypt + # Download Rust native binaries for Linux and Windows + - name: Download Linux x64 native binary + uses: actions/download-artifact@v8 + with: + name: native-bin-rust-linux-x64 + path: packages/varlock/native-bins/linux-x64 + - name: Download Linux arm64 native binary + uses: actions/download-artifact@v8 + with: + name: native-bin-rust-linux-arm64 + path: packages/varlock/native-bins/linux-arm64 + - name: Download Windows x64 native binary + uses: actions/download-artifact@v8 + with: + name: native-bin-rust-win32-x64 + path: packages/varlock/native-bins/win32-x64 + - name: Restore Rust binary execute permissions + run: | + chmod +x packages/varlock/native-bins/linux-x64/varlock-local-encrypt + chmod +x packages/varlock/native-bins/linux-arm64/varlock-local-encrypt + # ------------------------------------------------------------ - name: Create Release Pull Request or Publish to npm id: changesets diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index b4e6aff6..89c6be41 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -12,6 +12,7 @@ jobs: runs-on: ubuntu-latest outputs: swift-changed: ${{ steps.check-swift.outputs.changed }} + rust-changed: ${{ steps.check-rust.outputs.changed }} steps: - uses: actions/checkout@v6 with: @@ -47,7 +48,7 @@ jobs: - name: Run tests run: bun run test:ci - # Check if Swift source changed (used to gate macOS native build) + # Check if native binary source changed (used to gate native builds) - name: Check for Swift source changes id: check-swift run: | @@ -56,6 +57,14 @@ jobs: else echo "changed=false" >> $GITHUB_OUTPUT fi + - name: Check for Rust source changes + id: check-rust + run: | + if git diff --name-only origin/main...HEAD | grep -q '^packages/encryption-binary-rust/'; then + echo "changed=true" >> $GITHUB_OUTPUT + else + echo "changed=false" >> $GITHUB_OUTPUT + fi # Build + sign the macOS native binary if Swift source changed (warms the cache) # this must be done on a mac-os runner @@ -68,10 +77,18 @@ jobs: secrets: OP_CI_TOKEN: ${{ secrets.OP_CI_TOKEN }} + # Build Rust native binaries if source changed (warms the cache) + build-native-rust: + needs: build-and-test + if: needs.build-and-test.outputs.rust-changed == 'true' + uses: ./.github/workflows/build-native-rust.yaml + with: + artifact-name: native-bin-rust-ci + # Publish preview packages via pkg-pr-new release-preview-packages: - needs: [build-and-test, build-native-macos] - # Run even if build-native-macos was skipped, but not if anything failed. Skip on main. + needs: [build-and-test, build-native-macos, build-native-rust] + # Run even if native builds were skipped (source unchanged), but not if anything failed. Skip on main. if: always() && !failure() && !cancelled() && github.ref_name != 'main' runs-on: ubuntu-latest steps: @@ -126,6 +143,55 @@ jobs: fi chmod +x "$BINARY" + # Get Rust native binaries if varlock is being released + # If the Rust build ran this run, download the artifacts; otherwise restore from cache + - name: Download Rust binaries (from this run) + if: steps.check-release.outputs.includes-varlock == 'true' && needs.build-and-test.outputs.rust-changed == 'true' + uses: actions/download-artifact@v8 + with: + pattern: native-bin-rust-ci-* + path: packages/varlock/native-bins/ + merge-multiple: false + # Flatten: download-artifact creates subdirs per artifact name, but we need linux-x64/ etc. + - name: Flatten Rust artifact directories (from this run) + if: steps.check-release.outputs.includes-varlock == 'true' && needs.build-and-test.outputs.rust-changed == 'true' + run: | + cd packages/varlock/native-bins + for dir in native-bin-rust-ci-*/; do + subdir=$(echo "$dir" | sed 's/native-bin-rust-ci-//' | sed 's/\///') + mv "$dir" "$subdir" 2>/dev/null || true + done + + - name: Restore cached Rust binaries (from prior run) + if: steps.check-release.outputs.includes-varlock == 'true' && needs.build-and-test.outputs.rust-changed != 'true' + run: | + CACHE_KEY_SUFFIX="${{ hashFiles('packages/encryption-binary-rust/Cargo.lock', 'packages/encryption-binary-rust/src/**') }}" + for SUBDIR in linux-x64 linux-arm64 win32-x64; do + echo "Restoring native-bin-rust-$SUBDIR..." + done + - uses: actions/cache/restore@v5 + if: steps.check-release.outputs.includes-varlock == 'true' && needs.build-and-test.outputs.rust-changed != 'true' + with: + path: packages/varlock/native-bins/linux-x64/ + key: native-bin-rust-linux-x64-${{ hashFiles('packages/encryption-binary-rust/Cargo.lock', 'packages/encryption-binary-rust/src/**') }} + - uses: actions/cache/restore@v5 + if: steps.check-release.outputs.includes-varlock == 'true' && needs.build-and-test.outputs.rust-changed != 'true' + with: + path: packages/varlock/native-bins/linux-arm64/ + key: native-bin-rust-linux-arm64-${{ hashFiles('packages/encryption-binary-rust/Cargo.lock', 'packages/encryption-binary-rust/src/**') }} + - uses: actions/cache/restore@v5 + if: steps.check-release.outputs.includes-varlock == 'true' && needs.build-and-test.outputs.rust-changed != 'true' + with: + path: packages/varlock/native-bins/win32-x64/ + key: native-bin-rust-win32-x64-${{ hashFiles('packages/encryption-binary-rust/Cargo.lock', 'packages/encryption-binary-rust/src/**') }} + + - name: Fix Rust binary permissions + if: steps.check-release.outputs.includes-varlock == 'true' + run: | + for BIN in packages/varlock/native-bins/linux-*/varlock-local-encrypt; do + [ -f "$BIN" ] && chmod +x "$BIN" && echo "Fixed: $BIN" + done + - name: Build publishable npm packages run: bun run build:libs env: diff --git a/eslint.config.mjs b/eslint.config.mjs index 64674d62..c2e14f55 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -54,6 +54,7 @@ export default tseslint.config( '**/out', '**/next-env.d.ts', '.magent', + '.claude', 'framework-tests/.test-projects', 'framework-tests/.packed', ], @@ -170,6 +171,7 @@ export default tseslint.config( 'smoke-tests/**', 'framework-tests/**', 'packages/encryption-binary-swift/scripts/**', + 'packages/encryption-binary-rust/scripts/**', ], rules: { 'no-console': 0, diff --git a/packages/encryption-binary-rust/.gitignore b/packages/encryption-binary-rust/.gitignore new file mode 100644 index 00000000..2f7896d1 --- /dev/null +++ b/packages/encryption-binary-rust/.gitignore @@ -0,0 +1 @@ +target/ diff --git a/packages/encryption-binary-rust/Cargo.lock b/packages/encryption-binary-rust/Cargo.lock new file mode 100644 index 00000000..c7f66d7d --- /dev/null +++ b/packages/encryption-binary-rust/Cargo.lock @@ -0,0 +1,767 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aead" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +dependencies = [ + "crypto-common", + "generic-array", +] + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "aes-gcm" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "ghash", + "subtle", +] + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" + +[[package]] +name = "bitflags" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "rand_core", + "typenum", +] + +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest", + "ff", + "generic-array", + "group", + "hkdf", + "pem-rfc7468", + "pkcs8", + "rand_core", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "rand_core", + "subtle", +] + +[[package]] +name = "generic-array" +version = "0.14.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "ghash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" +dependencies = [ + "opaque-debug", + "polyval", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core", + "subtle", +] + +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "libc" +version = "0.2.184" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48f5d2a454e16a5ea0f4ced81bd44e4cfc7bd3a507b61887c99fd3538b28e4af" + +[[package]] +name = "memchr" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "nix" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +dependencies = [ + "bitflags", + "cfg-if", + "cfg_aliases", + "libc", + "memoffset", +] + +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2", +] + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "polyval" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" +dependencies = [ + "cfg-if", + "cpufeatures", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "2.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "universal-hash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +dependencies = [ + "crypto-common", + "subtle", +] + +[[package]] +name = "varlock-local-encrypt" +version = "0.1.0" +dependencies = [ + "aes-gcm", + "base64", + "elliptic-curve", + "hkdf", + "hmac", + "libc", + "nix", + "p256", + "rand", + "serde", + "serde_json", + "sha2", + "windows", +] + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "windows" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" +dependencies = [ + "windows-core", + "windows-targets", +] + +[[package]] +name = "windows-core" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-result", + "windows-strings", + "windows-targets", +] + +[[package]] +name = "windows-implement" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "zerocopy" +version = "0.8.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff --git a/packages/encryption-binary-rust/Cargo.toml b/packages/encryption-binary-rust/Cargo.toml new file mode 100644 index 00000000..893f8b3a --- /dev/null +++ b/packages/encryption-binary-rust/Cargo.toml @@ -0,0 +1,56 @@ +[package] +name = "varlock-local-encrypt" +version = "0.1.0" +edition = "2021" +description = "Cross-platform local encryption binary for Varlock (Windows/Linux)" + +[[bin]] +name = "varlock-local-encrypt" +path = "src/main.rs" + +[dependencies] +# ECIES crypto (pure Rust, no OpenSSL) +p256 = { version = "0.13", features = ["ecdh", "pkcs8"] } +elliptic-curve = { version = "0.13", features = ["sec1", "pkcs8"] } +hkdf = "0.12" +hmac = "0.12" +sha2 = "0.10" +aes-gcm = "0.10" +rand = "0.8" + +# Serialization +serde = { version = "1", features = ["derive"] } +serde_json = "1" +base64 = "0.22" + +# Signal handling (Unix) +[target.'cfg(unix)'.dependencies] +libc = "0.2" + +# Platform — Linux (nix for peer credentials in IPC) +[target.'cfg(target_os = "linux")'.dependencies] +nix = { version = "0.29", features = ["process", "socket", "user", "fs"] } + +# Platform — Windows +[target.'cfg(target_os = "windows")'.dependencies] +windows = { version = "0.58", features = [ + # DPAPI + "Win32_Security_Cryptography", + "Win32_Security_Credentials", + "Win32_System_Memory", + # Named pipes + "Win32_System_Pipes", + "Win32_Storage_FileSystem", + "Win32_Foundation", + "Win32_System_IO", + # Windows Hello (UserConsentVerifier) + "Security_Credentials_UI", + "Foundation", +] } + +[profile.release] +strip = true +lto = true +opt-level = "z" # optimize for size +codegen-units = 1 +panic = "abort" diff --git a/packages/encryption-binary-rust/package.json b/packages/encryption-binary-rust/package.json new file mode 100644 index 00000000..2732a443 --- /dev/null +++ b/packages/encryption-binary-rust/package.json @@ -0,0 +1,12 @@ +{ + "name": "@varlock/encryption-binary-rust", + "version": "0.0.0", + "private": true, + "scripts": { + "build:current": "bun run scripts/build-rust.ts", + "build:linux-x64": "bun run scripts/build-rust.ts --target x86_64-unknown-linux-gnu", + "build:linux-arm64": "bun run scripts/build-rust.ts --target aarch64-unknown-linux-gnu", + "build:windows-x64": "bun run scripts/build-rust.ts --target x86_64-pc-windows-msvc", + "build:windows-arm64": "bun run scripts/build-rust.ts --target aarch64-pc-windows-msvc" + } +} diff --git a/packages/encryption-binary-rust/scripts/build-rust.ts b/packages/encryption-binary-rust/scripts/build-rust.ts new file mode 100644 index 00000000..512cee12 --- /dev/null +++ b/packages/encryption-binary-rust/scripts/build-rust.ts @@ -0,0 +1,113 @@ +#!/usr/bin/env bun + +/** + * Build script for the varlock-local-encrypt Rust binary. + * + * Usage: + * bun run scripts/build-rust.ts # build for current platform + * bun run scripts/build-rust.ts --target x86_64-unknown-linux-gnu + * bun run scripts/build-rust.ts --target x86_64-pc-windows-msvc + * + * The binary is placed in packages/varlock/native-bins/[-]/ + */ + +import { execSync } from 'node:child_process'; +import path from 'node:path'; +import fs from 'node:fs'; + +// ── CLI args ──────────────────────────────────────────────────── + +const args = process.argv.slice(2); + +function getArg(flag: string): string | undefined { + const idx = args.indexOf(flag); + return idx >= 0 ? args[idx + 1] : undefined; +} + +const target = getArg('--target'); + +// ── Paths ─────────────────────────────────────────────────────── + +const rustDir = path.resolve(import.meta.dir, '..'); +const varlockPkgDir = path.resolve(import.meta.dir, '..', '..', 'varlock'); +const binaryName = process.platform === 'win32' && !target?.includes('linux') + ? 'varlock-local-encrypt.exe' + : 'varlock-local-encrypt'; + +/** + * Map a Rust target triple to the native-bins subdirectory name. + */ +function getOutputSubdir(rustTarget?: string): string { + if (!rustTarget) { + // Current platform + if (process.platform === 'darwin') return 'darwin'; + if (process.platform === 'win32') return `win32-${process.arch}`; + return `${process.platform}-${process.arch}`; + } + + // Parse Rust target triple: --[-] + const parts = rustTarget.split('-'); + const arch = parts[0]; + const os = parts[2]; + + let nodeArch = arch; + if (arch === 'x86_64') nodeArch = 'x64'; + else if (arch === 'aarch64') nodeArch = 'arm64'; + + if (os === 'linux') return `linux-${nodeArch}`; + if (os === 'windows') return `win32-${nodeArch}`; + if (os === 'darwin' || os === 'apple') return 'darwin'; + return `${os}-${nodeArch}`; +} + +function run(cmd: string, opts?: { cwd?: string }) { + console.log(`> ${cmd}`); + execSync(cmd, { stdio: 'inherit', cwd: opts?.cwd ?? rustDir }); +} + +// ── Build ─────────────────────────────────────────────────────── + +const buildArgs = ['cargo', 'build', '--release']; +if (target) { + buildArgs.push('--target', target); +} + +run(buildArgs.join(' ')); + +// ── Copy to native-bins ───────────────────────────────────────── + +const subdir = getOutputSubdir(target); +const outputDir = path.join(varlockPkgDir, 'native-bins', subdir); +fs.mkdirSync(outputDir, { recursive: true }); + +// Find the built binary +let sourceBinary: string; +if (target) { + const targetBinaryName = target.includes('windows') + ? 'varlock-local-encrypt.exe' + : 'varlock-local-encrypt'; + sourceBinary = path.join(rustDir, 'target', target, 'release', targetBinaryName); +} else { + sourceBinary = path.join(rustDir, 'target', 'release', binaryName); +} + +if (!fs.existsSync(sourceBinary)) { + console.error(`Build succeeded but binary not found at: ${sourceBinary}`); + process.exit(1); +} + +const destBinary = path.join(outputDir, binaryName); +fs.copyFileSync(sourceBinary, destBinary); + +// Ensure executable +if (process.platform !== 'win32') { + fs.chmodSync(destBinary, 0o755); +} + +const stats = fs.statSync(destBinary); +const sizeKB = Math.round(stats.size / 1024); + +console.log(`\nBuilt: ${destBinary}`); +console.log(`Size: ${sizeKB} KB`); +console.log(`Platform: ${subdir}`); +console.log('Done!'); diff --git a/packages/encryption-binary-rust/src/crypto.rs b/packages/encryption-binary-rust/src/crypto.rs new file mode 100644 index 00000000..a6287457 --- /dev/null +++ b/packages/encryption-binary-rust/src/crypto.rs @@ -0,0 +1,252 @@ +//! ECIES implementation matching the JS (crypto.ts) and Swift (SecureEnclaveManager.swift) schemes. +//! +//! Wire-compatible payload format: +//! version(1) | ephemeralPubKey(65) | nonce(12) | ciphertext(N) | tag(16) +//! +//! Crypto: +//! - P-256 ECDH key agreement +//! - HKDF-SHA256 (salt: "varlock-ecies-v1", info: ephemeralPub || recipientPub) +//! - AES-256-GCM with random 12-byte nonce + +use aes_gcm::{ + aead::{Aead, KeyInit}, + Aes256Gcm, Nonce, +}; +use base64::{engine::general_purpose::STANDARD as BASE64, Engine}; +use elliptic_curve::sec1::{FromEncodedPoint, ToEncodedPoint}; +use hkdf::Hkdf; +use elliptic_curve::pkcs8::{DecodePrivateKey, EncodePrivateKey}; +use p256::{ + ecdh::EphemeralSecret, + elliptic_curve::rand_core::OsRng, + PublicKey, SecretKey, +}; +use sha2::Sha256; + +const PAYLOAD_VERSION: u8 = 0x01; +const HKDF_SALT: &[u8] = b"varlock-ecies-v1"; +const PUBLIC_KEY_LENGTH: usize = 65; // uncompressed P-256: 0x04 || x(32) || y(32) +const NONCE_LENGTH: usize = 12; +const TAG_LENGTH: usize = 16; +const HEADER_LENGTH: usize = 1 + PUBLIC_KEY_LENGTH + NONCE_LENGTH; + +/// A P-256 key pair with base64-encoded components. +pub struct KeyPair { + /// Base64-encoded uncompressed P-256 public key (65 bytes raw) + pub public_key: String, + /// Base64-encoded PKCS8 DER private key + pub private_key: String, +} + +/// Generate a new P-256 key pair. +/// +/// Returns the public key as uncompressed SEC1 (65 bytes, base64) and +/// the private key as PKCS8 DER (base64), matching the JS/Swift format. +pub fn generate_key_pair() -> Result { + let secret_key = SecretKey::random(&mut OsRng); + + // Public key: uncompressed SEC1 encoding (65 bytes) + let public_key_point = secret_key.public_key().to_encoded_point(false); + let public_key_bytes = public_key_point.as_bytes(); + + // Private key: PKCS8 DER encoding + let private_key_pkcs8 = secret_key + .to_pkcs8_der() + .map_err(|e| format!("Failed to encode private key as PKCS8: {e}"))?; + + Ok(KeyPair { + public_key: BASE64.encode(public_key_bytes), + private_key: BASE64.encode(private_key_pkcs8.as_bytes()), + }) +} + +/// Encrypt plaintext using ECIES with the recipient's public key. +/// +/// Only needs the public key — no private key or biometric auth required. +/// Returns base64-encoded ciphertext payload. +pub fn encrypt(public_key_base64: &str, plaintext: &[u8]) -> Result { + let recipient_pub_bytes = BASE64 + .decode(public_key_base64) + .map_err(|e| format!("Invalid public key base64: {e}"))?; + + if recipient_pub_bytes.len() != PUBLIC_KEY_LENGTH { + return Err(format!( + "Invalid public key length: {} (expected {})", + recipient_pub_bytes.len(), + PUBLIC_KEY_LENGTH + )); + } + + // Import recipient public key + let recipient_point = p256::EncodedPoint::from_bytes(&recipient_pub_bytes) + .map_err(|e| format!("Invalid public key encoding: {e}"))?; + let recipient_pub = PublicKey::from_encoded_point(&recipient_point) + .into_option() + .ok_or("Invalid P-256 public key point")?; + + // Generate ephemeral key pair + let ephemeral_secret = EphemeralSecret::random(&mut OsRng); + let ephemeral_pub = ephemeral_secret.public_key(); + let ephemeral_pub_bytes = ephemeral_pub.to_encoded_point(false); + let ephemeral_pub_raw = ephemeral_pub_bytes.as_bytes(); // 65 bytes + + // ECDH: ephemeral private × recipient public → shared secret + let shared_secret = ephemeral_secret.diffie_hellman(&recipient_pub); + let shared_secret_bytes = shared_secret.raw_secret_bytes(); + + // HKDF-SHA256 → AES-256 key + // info = ephemeralPubKey || recipientPubKey + let mut info = Vec::with_capacity(PUBLIC_KEY_LENGTH * 2); + info.extend_from_slice(ephemeral_pub_raw); + info.extend_from_slice(&recipient_pub_bytes); + + let hk = Hkdf::::new(Some(HKDF_SALT), shared_secret_bytes); + let mut aes_key = [0u8; 32]; + hk.expand(&info, &mut aes_key) + .map_err(|e| format!("HKDF expand failed: {e}"))?; + + // AES-256-GCM encrypt + let cipher = Aes256Gcm::new_from_slice(&aes_key) + .map_err(|e| format!("AES key init failed: {e}"))?; + + let mut nonce_bytes = [0u8; NONCE_LENGTH]; + rand::RngCore::fill_bytes(&mut OsRng, &mut nonce_bytes); + let nonce = Nonce::from_slice(&nonce_bytes); + + let ciphertext_with_tag = cipher + .encrypt(nonce, plaintext) + .map_err(|e| format!("AES-GCM encryption failed: {e}"))?; + + // AES-GCM appends tag to ciphertext — split for wire format + let ct_len = ciphertext_with_tag.len() - TAG_LENGTH; + let ciphertext = &ciphertext_with_tag[..ct_len]; + let tag = &ciphertext_with_tag[ct_len..]; + + // Assemble payload: version(1) | ephemeralPub(65) | nonce(12) | ciphertext(N) | tag(16) + let mut payload = Vec::with_capacity(HEADER_LENGTH + ciphertext.len() + TAG_LENGTH); + payload.push(PAYLOAD_VERSION); + payload.extend_from_slice(ephemeral_pub_raw); + payload.extend_from_slice(&nonce_bytes); + payload.extend_from_slice(ciphertext); + payload.extend_from_slice(tag); + + Ok(BASE64.encode(&payload)) +} + +/// Decrypt ciphertext using ECIES with the recipient's private key. +/// +/// `private_key_base64` is PKCS8 DER, `public_key_base64` is uncompressed SEC1. +/// `ciphertext_base64` is the base64-encoded wire-format payload. +/// Returns decrypted plaintext bytes. +pub fn decrypt( + private_key_base64: &str, + public_key_base64: &str, + ciphertext_base64: &str, +) -> Result, String> { + let payload = BASE64 + .decode(ciphertext_base64) + .map_err(|e| format!("Invalid ciphertext base64: {e}"))?; + + if payload.len() < HEADER_LENGTH + TAG_LENGTH { + return Err("Payload too short".into()); + } + + // Parse payload + let version = payload[0]; + if version != PAYLOAD_VERSION { + return Err(format!("Unsupported payload version: {version}")); + } + + let ephemeral_pub_raw = &payload[1..1 + PUBLIC_KEY_LENGTH]; + let nonce_bytes = &payload[1 + PUBLIC_KEY_LENGTH..HEADER_LENGTH]; + let ciphertext_and_tag = &payload[HEADER_LENGTH..]; + + if ciphertext_and_tag.len() < TAG_LENGTH { + return Err("Payload too short for tag".into()); + } + + // Import private key from PKCS8 DER + let private_key_der = BASE64 + .decode(private_key_base64) + .map_err(|e| format!("Invalid private key base64: {e}"))?; + let secret_key = SecretKey::from_pkcs8_der(&private_key_der) + .map_err(|e| format!("Invalid PKCS8 private key: {e}"))?; + + // Import ephemeral public key + let ephemeral_point = p256::EncodedPoint::from_bytes(ephemeral_pub_raw) + .map_err(|e| format!("Invalid ephemeral public key: {e}"))?; + let ephemeral_pub = PublicKey::from_encoded_point(&ephemeral_point) + .into_option() + .ok_or("Invalid ephemeral P-256 point")?; + + // Recipient public key bytes for HKDF info + let recipient_pub_bytes = BASE64 + .decode(public_key_base64) + .map_err(|e| format!("Invalid public key base64: {e}"))?; + + // ECDH: recipient private × ephemeral public → shared secret + let shared_secret = p256::ecdh::diffie_hellman( + secret_key.to_nonzero_scalar(), + ephemeral_pub.as_affine(), + ); + let shared_secret_bytes = shared_secret.raw_secret_bytes(); + + // HKDF-SHA256 → AES-256 key (must match encrypt side) + let mut info = Vec::with_capacity(PUBLIC_KEY_LENGTH * 2); + info.extend_from_slice(ephemeral_pub_raw); + info.extend_from_slice(&recipient_pub_bytes); + + let hk = Hkdf::::new(Some(HKDF_SALT), shared_secret_bytes); + let mut aes_key = [0u8; 32]; + hk.expand(&info, &mut aes_key) + .map_err(|e| format!("HKDF expand failed: {e}"))?; + + // AES-256-GCM decrypt + // aes-gcm expects ciphertext || tag concatenated (same as wire format after header) + let cipher = Aes256Gcm::new_from_slice(&aes_key) + .map_err(|e| format!("AES key init failed: {e}"))?; + let nonce = Nonce::from_slice(nonce_bytes); + + let plaintext = cipher + .decrypt(nonce, ciphertext_and_tag) + .map_err(|_| "Decryption failed: invalid ciphertext or key".to_string())?; + + Ok(plaintext) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_roundtrip() { + let kp = generate_key_pair().unwrap(); + let plaintext = b"hello world"; + let encrypted = encrypt(&kp.public_key, plaintext).unwrap(); + let decrypted = decrypt(&kp.private_key, &kp.public_key, &encrypted).unwrap(); + assert_eq!(decrypted, plaintext); + } + + #[test] + fn test_payload_format() { + let kp = generate_key_pair().unwrap(); + let encrypted = encrypt(&kp.public_key, b"test").unwrap(); + let payload = BASE64.decode(&encrypted).unwrap(); + + // Check version byte + assert_eq!(payload[0], PAYLOAD_VERSION); + // Check total minimum length: 1 + 65 + 12 + 0 + 16 = 94 + assert!(payload.len() >= HEADER_LENGTH + TAG_LENGTH); + // Check ephemeral public key starts with 0x04 (uncompressed) + assert_eq!(payload[1], 0x04); + } + + #[test] + fn test_different_keys_cannot_decrypt() { + let kp1 = generate_key_pair().unwrap(); + let kp2 = generate_key_pair().unwrap(); + let encrypted = encrypt(&kp1.public_key, b"secret").unwrap(); + let result = decrypt(&kp2.private_key, &kp2.public_key, &encrypted); + assert!(result.is_err()); + } +} diff --git a/packages/encryption-binary-rust/src/daemon.rs b/packages/encryption-binary-rust/src/daemon.rs new file mode 100644 index 00000000..d01c9b03 --- /dev/null +++ b/packages/encryption-binary-rust/src/daemon.rs @@ -0,0 +1,326 @@ +//! Daemon mode — long-lived process with IPC server, session management, and auto-shutdown. +//! +//! Matches the Swift daemon's behavior: +//! - Accepts connections over Unix socket (Linux) or named pipe (Windows) +//! - Handles: decrypt, encrypt, ping, invalidate-session +//! - On Windows with Hello: requires biometric before first decrypt per session +//! - No prompt-secret (no GUI on Linux — handled by terminal prompt in TS) +//! - Auto-shutdown after 30 minutes of inactivity +//! - Session invalidation on SIGTERM/SIGINT + +use crate::crypto; +use crate::ipc::{IpcServer, MessageHandler}; +use crate::key_store; +use serde_json::{json, Value}; +use std::sync::atomic::{AtomicBool, Ordering}; +use std::sync::{Arc, Mutex}; +use std::time::{Duration, Instant}; + +const DEFAULT_KEY_ID: &str = "varlock-default"; +const DAEMON_INACTIVITY_TIMEOUT: Duration = Duration::from_secs(30 * 60); // 30 minutes +const SESSION_TIMEOUT: Duration = Duration::from_secs(5 * 60); // 5 minutes per session + +/// Per-TTY session state. +struct SessionManager { + /// Map of TTY IDs to their session creation time. + /// Sessions expire after SESSION_TIMEOUT. + active_sessions: std::collections::HashMap, + /// Last IPC activity timestamp for daemon timeout. + last_activity: Instant, + /// Whether biometric verification is available on this platform. + biometric_available: bool, +} + +impl SessionManager { + fn new() -> Self { + let info = key_store::get_platform_info(); + Self { + active_sessions: std::collections::HashMap::new(), + last_activity: Instant::now(), + biometric_available: info.biometric_available, + } + } + + fn note_activity(&mut self) { + self.last_activity = Instant::now(); + } + + fn is_session_warm(&self, tty_id: &Option) -> bool { + let key = tty_id.as_deref().unwrap_or("__no_tty__"); + match self.active_sessions.get(key) { + Some(created_at) => created_at.elapsed() < SESSION_TIMEOUT, + None => false, + } + } + + fn mark_session_warm(&mut self, tty_id: &Option) { + let key = tty_id.as_deref().unwrap_or("__no_tty__").to_string(); + self.active_sessions.insert(key, Instant::now()); + } + + fn invalidate_all(&mut self) { + self.active_sessions.clear(); + } + + #[allow(dead_code)] + fn has_any_sessions(&self) -> bool { + self.active_sessions.values().any(|t| t.elapsed() < SESSION_TIMEOUT) + } + + fn is_timed_out(&self) -> bool { + self.last_activity.elapsed() > DAEMON_INACTIVITY_TIMEOUT + } + + /// Whether the next decrypt should require biometric verification. + fn needs_biometric(&self, tty_id: &Option) -> bool { + self.biometric_available && !self.is_session_warm(tty_id) + } +} + +/// Run the daemon. +pub fn run_daemon(socket_path: &str, pid_path: Option<&str>) -> Result<(), String> { + // Write PID file + if let Some(pid_path) = pid_path { + if let Some(parent) = std::path::Path::new(pid_path).parent() { + let _ = std::fs::create_dir_all(parent); + } + std::fs::write(pid_path, std::process::id().to_string()) + .map_err(|e| format!("Failed to write PID file: {e}"))?; + } + + let session_manager = Arc::new(Mutex::new(SessionManager::new())); + let mut server = IpcServer::new(socket_path); + + // Activity callback + let sm_activity = session_manager.clone(); + server.set_activity_callback(move || { + if let Ok(mut sm) = sm_activity.lock() { + sm.note_activity(); + } + }); + + // Message handler + let sm_handler = session_manager.clone(); + let handler: MessageHandler = Box::new(move |message: Value, tty_id: Option| { + let action = message + .get("action") + .and_then(|v| v.as_str()) + .unwrap_or(""); + + match action { + "decrypt" => handle_decrypt(&message, &tty_id, &sm_handler), + "encrypt" => handle_encrypt(&message), + "ping" => handle_ping(&tty_id, &sm_handler), + "invalidate-session" => handle_invalidate(&sm_handler), + _ => json!({"error": format!("Unknown action: {action}")}), + } + }); + server.set_message_handler(handler); + + let running = server.running_flag(); + + // Signal handling + let pid_path_owned = pid_path.map(|s| s.to_string()); + + #[cfg(unix)] + { + let _ = ctrlc_handler(running.clone()); + } + + // Inactivity timeout checker + session expiry cleanup + let sm_timeout = session_manager.clone(); + let running_timeout = running.clone(); + std::thread::spawn(move || { + loop { + std::thread::sleep(Duration::from_secs(60)); + if !running_timeout.load(Ordering::SeqCst) { + break; + } + if let Ok(mut sm) = sm_timeout.lock() { + // Clean up expired sessions + sm.active_sessions.retain(|_, created_at| { + created_at.elapsed() < SESSION_TIMEOUT + }); + + if sm.is_timed_out() { + running_timeout.store(false, Ordering::SeqCst); + break; + } + } + } + }); + + // Print ready message (matches Swift daemon format) + let ready = json!({ + "ready": true, + "pid": std::process::id(), + "socketPath": socket_path, + }); + println!("{}", ready); + use std::io::Write; + let _ = std::io::stdout().flush(); + + // Start server (blocks) + let result = server.start(); + + // Cleanup + if let Some(pp) = &pid_path_owned { + let _ = std::fs::remove_file(pp); + } + + result +} + +// ── Message handlers ───────────────────────────────────────────── + +fn handle_decrypt( + message: &Value, + tty_id: &Option, + sm: &Arc>, +) -> Value { + let payload = match message.get("payload") { + Some(p) => p, + None => return json!({"error": "Missing payload"}), + }; + + let ciphertext_b64 = match payload.get("ciphertext").and_then(|v| v.as_str()) { + Some(ct) => ct, + None => return json!({"error": "Missing or invalid ciphertext in payload"}), + }; + + let key_id = payload + .get("keyId") + .and_then(|v| v.as_str()) + .unwrap_or(DEFAULT_KEY_ID); + + // Check if biometric verification is needed + let needs_bio = sm.lock().map(|s| s.needs_biometric(tty_id)).unwrap_or(false); + + if needs_bio { + match verify_user_presence() { + Ok(true) => {} // Verified — proceed + Ok(false) => return json!({"error": "User verification cancelled"}), + Err(e) => return json!({"error": format!("Biometric verification failed: {e}")}), + } + } + + // Load key and decrypt + match key_store::load_key(key_id) { + Ok((private_key_der, public_key_b64)) => { + let private_key_b64 = base64::Engine::encode( + &base64::engine::general_purpose::STANDARD, + &private_key_der, + ); + + match crypto::decrypt(&private_key_b64, &public_key_b64, ciphertext_b64) { + Ok(plaintext_bytes) => { + match String::from_utf8(plaintext_bytes) { + Ok(plaintext) => { + // Mark session as warm + if let Ok(mut session) = sm.lock() { + session.mark_session_warm(tty_id); + } + json!({"result": plaintext}) + } + Err(_) => json!({"error": "Decrypted data is not valid UTF-8"}), + } + } + Err(e) => json!({"error": e}), + } + } + Err(e) => json!({"error": e}), + } +} + +fn handle_encrypt(message: &Value) -> Value { + let payload = match message.get("payload") { + Some(p) => p, + None => return json!({"error": "Missing payload"}), + }; + + let plaintext = match payload.get("plaintext").and_then(|v| v.as_str()) { + Some(pt) => pt, + None => return json!({"error": "Missing plaintext in payload"}), + }; + + let key_id = payload + .get("keyId") + .and_then(|v| v.as_str()) + .unwrap_or(DEFAULT_KEY_ID); + + match key_store::load_public_key(key_id) { + Ok(public_key_b64) => match crypto::encrypt(&public_key_b64, plaintext.as_bytes()) { + Ok(ciphertext) => json!({"result": ciphertext}), + Err(e) => json!({"error": e}), + }, + Err(e) => json!({"error": e}), + } +} + +fn handle_ping(tty_id: &Option, sm: &Arc>) -> Value { + let session_warm = sm + .lock() + .map(|s| s.is_session_warm(tty_id)) + .unwrap_or(false); + + json!({ + "result": { + "pong": true, + "sessionWarm": session_warm, + "ttyId": tty_id.as_deref().unwrap_or(""), + } + }) +} + +fn handle_invalidate(sm: &Arc>) -> Value { + if let Ok(mut session) = sm.lock() { + session.invalidate_all(); + } + json!({"result": "all sessions invalidated"}) +} + +// ── Biometric verification ─────────────────────────────────────── + +/// Verify user presence using platform-specific biometric. +/// Returns Ok(true) if verified, Ok(false) if cancelled. +fn verify_user_presence() -> Result { + #[cfg(target_os = "windows")] + { + crate::key_store::windows_hello::verify_user("Varlock needs to decrypt your secrets") + } + + #[cfg(not(target_os = "windows"))] + { + // No biometric on Linux — sessions are always warm + Ok(true) + } +} + +// ── Signal handling ────────────────────────────────────────────── + +#[cfg(unix)] +fn ctrlc_handler(running: Arc) -> Result<(), String> { + unsafe { + libc::signal(libc::SIGTERM, signal_handler as *const () as libc::sighandler_t); + libc::signal(libc::SIGINT, signal_handler as *const () as libc::sighandler_t); + } + + RUNNING_FLAG + .lock() + .map_err(|e| format!("Failed to set signal handler: {e}"))? + .replace(running); + + Ok(()) +} + +#[cfg(unix)] +static RUNNING_FLAG: std::sync::Mutex>> = std::sync::Mutex::new(None); + +#[cfg(unix)] +extern "C" fn signal_handler(_sig: libc::c_int) { + if let Ok(guard) = RUNNING_FLAG.lock() { + if let Some(ref running) = *guard { + running.store(false, Ordering::SeqCst); + } + } +} diff --git a/packages/encryption-binary-rust/src/ipc.rs b/packages/encryption-binary-rust/src/ipc.rs new file mode 100644 index 00000000..9657cc29 --- /dev/null +++ b/packages/encryption-binary-rust/src/ipc.rs @@ -0,0 +1,456 @@ +//! IPC server for the daemon mode. +//! +//! Protocol: Length-prefixed JSON over Unix domain socket (Linux) or named pipe (Windows). +//! +//! [4 bytes: UInt32 LE message length] +//! [N bytes: UTF-8 JSON] +//! +//! Request: { "id": "...", "action": "...", "payload": { ... } } +//! Response: { "id": "...", "result": ... } or { "id": "...", "error": "..." } + +use serde_json::Value; +use std::io::{Read, Write}; +use std::sync::atomic::{AtomicBool, Ordering}; +use std::sync::Arc; + +#[cfg(unix)] +use std::os::unix::net::{UnixListener, UnixStream}; + +const MAX_MESSAGE_SIZE: u32 = 10_000_000; // 10MB safety limit + +/// Message handler callback type. +pub type MessageHandler = Box) -> Value + Send + Sync>; + +/// IPC server that listens for length-prefixed JSON messages. +pub struct IpcServer { + socket_path: String, + running: Arc, + message_handler: Option>, + on_activity: Option>, +} + +impl IpcServer { + pub fn new(socket_path: &str) -> Self { + Self { + socket_path: socket_path.to_string(), + running: Arc::new(AtomicBool::new(false)), + message_handler: None, + on_activity: None, + } + } + + pub fn set_message_handler(&mut self, handler: MessageHandler) { + self.message_handler = Some(Arc::new(handler)); + } + + pub fn set_activity_callback(&mut self, callback: impl Fn() + Send + Sync + 'static) { + self.on_activity = Some(Arc::new(callback)); + } + + pub fn running_flag(&self) -> Arc { + self.running.clone() + } + + /// Start the IPC server. This blocks the calling thread. + #[cfg(unix)] + pub fn start(&self) -> Result<(), String> { + // Clean up stale socket + let _ = std::fs::remove_file(&self.socket_path); + + // Ensure parent directory exists + if let Some(parent) = std::path::Path::new(&self.socket_path).parent() { + std::fs::create_dir_all(parent) + .map_err(|e| format!("Failed to create socket directory: {e}"))?; + } + + let listener = UnixListener::bind(&self.socket_path) + .map_err(|e| format!("Socket bind failed: {e}"))?; + + // Set socket permissions (owner only) + #[cfg(unix)] + { + use std::os::unix::fs::PermissionsExt; + let _ = std::fs::set_permissions( + &self.socket_path, + std::fs::Permissions::from_mode(0o600), + ); + } + + // Set non-blocking so we can check the running flag + listener + .set_nonblocking(true) + .map_err(|e| format!("Failed to set non-blocking: {e}"))?; + + self.running.store(true, Ordering::SeqCst); + + while self.running.load(Ordering::SeqCst) { + match listener.accept() { + Ok((stream, _)) => { + if let Some(cb) = &self.on_activity { + cb(); + } + + let handler = self.message_handler.clone(); + let on_activity = self.on_activity.clone(); + let running = self.running.clone(); + + // Get peer TTY identity + let tty_id = get_peer_tty_id(&stream); + + std::thread::spawn(move || { + handle_client(stream, handler, on_activity, running, tty_id); + }); + } + Err(ref e) if e.kind() == std::io::ErrorKind::WouldBlock => { + // No pending connection — sleep briefly and retry + std::thread::sleep(std::time::Duration::from_millis(50)); + } + Err(e) => { + if self.running.load(Ordering::SeqCst) { + eprintln!("Accept error: {e}"); + } + break; + } + } + } + + // Cleanup + let _ = std::fs::remove_file(&self.socket_path); + Ok(()) + } + + /// Start the IPC server on Windows using named pipes. + /// + /// Named pipes work with Node.js `net.connect()` out of the box — + /// the TS daemon client's `socket.connect(pipePath)` just works. + #[cfg(windows)] + pub fn start(&self) -> Result<(), String> { + use std::io::{Read, Write}; + use windows::Win32::Foundation::{CloseHandle, HANDLE, INVALID_HANDLE_VALUE}; + use windows::Win32::Storage::FileSystem::{ + ReadFile, WriteFile, FlushFileBuffers, + }; + use windows::Win32::System::Pipes::{ + ConnectNamedPipe, CreateNamedPipeW, DisconnectNamedPipe, + PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE, PIPE_READMODE_BYTE, PIPE_WAIT, + }; + use windows::core::HSTRING; + + self.running.store(true, Ordering::SeqCst); + + let pipe_name = HSTRING::from(&self.socket_path); + + while self.running.load(Ordering::SeqCst) { + // Create a new named pipe instance for each client + let pipe_handle = unsafe { + CreateNamedPipeW( + &pipe_name, + PIPE_ACCESS_DUPLEX, + PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, + 10, // max instances + 65536, // out buffer + 65536, // in buffer + 0, // default timeout + None, // default security + ) + }.map_err(|e| format!("CreateNamedPipe failed: {e}"))?; + + if pipe_handle == INVALID_HANDLE_VALUE { + return Err("CreateNamedPipe returned invalid handle".into()); + } + + // Wait for a client to connect (blocking) + let connected = unsafe { ConnectNamedPipe(pipe_handle, None) }; + if connected.is_err() { + // ERROR_PIPE_CONNECTED means client connected between Create and Connect — that's OK + let err = unsafe { windows::Win32::Foundation::GetLastError() }; + if err != windows::Win32::Foundation::ERROR_PIPE_CONNECTED { + unsafe { let _ = CloseHandle(pipe_handle); } + if !self.running.load(Ordering::SeqCst) { + break; + } + continue; + } + } + + if let Some(cb) = &self.on_activity { + cb(); + } + + let handler = self.message_handler.clone(); + let on_activity = self.on_activity.clone(); + let running = self.running.clone(); + + // Windows doesn't have per-connection TTY identity like Unix + // Use the pipe client process ID if available + let tty_id: Option = None; + + std::thread::spawn(move || { + handle_windows_client(pipe_handle, handler, on_activity, running, tty_id); + unsafe { + let _ = DisconnectNamedPipe(pipe_handle); + let _ = CloseHandle(pipe_handle); + } + }); + } + + Ok(()) + } + + pub fn stop(&self) { + self.running.store(false, Ordering::SeqCst); + } +} + +impl Drop for IpcServer { + fn drop(&mut self) { + self.stop(); + let _ = std::fs::remove_file(&self.socket_path); + } +} + +// ── Client handling ────────────────────────────────────────────── + +#[cfg(unix)] +fn handle_client( + mut stream: UnixStream, + handler: Option>, + on_activity: Option>, + running: Arc, + tty_id: Option, +) { + // Set blocking for reads + let _ = stream.set_nonblocking(false); + let _ = stream.set_read_timeout(Some(std::time::Duration::from_secs(300))); + + while running.load(Ordering::SeqCst) { + // Read 4-byte length prefix (little-endian) + let mut len_buf = [0u8; 4]; + match stream.read_exact(&mut len_buf) { + Ok(()) => {} + Err(_) => break, // Connection closed or error + } + + let msg_len = u32::from_le_bytes(len_buf); + if msg_len == 0 || msg_len > MAX_MESSAGE_SIZE { + break; + } + + // Read message body + let mut msg_buf = vec![0u8; msg_len as usize]; + match stream.read_exact(&mut msg_buf) { + Ok(()) => {} + Err(_) => break, + } + + // Parse JSON + let message: Value = match serde_json::from_slice(&msg_buf) { + Ok(v) => v, + Err(_) => { + let _ = send_response(&mut stream, None, &serde_json::json!({"error": "Invalid JSON"})); + continue; + } + }; + + if let Some(cb) = &on_activity { + cb(); + } + + // Handle message + let id = message.get("id").and_then(|v| v.as_str()).map(|s| s.to_string()); + + let response = if let Some(ref handler) = handler { + handler(message, tty_id.clone()) + } else { + serde_json::json!({"error": "No handler"}) + }; + + if send_response(&mut stream, id.as_deref(), &response).is_err() { + break; + } + } +} + +fn send_response(stream: &mut impl Write, id: Option<&str>, response: &Value) -> Result<(), String> { + let mut full_response = response.clone(); + if let (Some(id), Some(obj)) = (id, full_response.as_object_mut()) { + obj.insert("id".to_string(), Value::String(id.to_string())); + } + + let json_bytes = serde_json::to_vec(&full_response) + .map_err(|e| format!("Serialization failed: {e}"))?; + + let len = (json_bytes.len() as u32).to_le_bytes(); + stream.write_all(&len).map_err(|e| format!("Write failed: {e}"))?; + stream.write_all(&json_bytes).map_err(|e| format!("Write failed: {e}"))?; + stream.flush().map_err(|e| format!("Flush failed: {e}"))?; + + Ok(()) +} + +// ── Peer TTY identity (Linux) ──────────────────────────────────── + +#[cfg(target_os = "linux")] +fn get_peer_tty_id(stream: &UnixStream) -> Option { + use nix::sys::socket::{getsockopt, sockopt::PeerCredentials}; + use std::os::unix::io::AsRawFd; + + let fd = stream.as_raw_fd(); + let creds = getsockopt(fd, PeerCredentials).ok()?; + let pid = creds.pid(); + + if pid <= 0 { + return None; + } + + // Read the process's controlling terminal from /proc + get_tty_for_pid(pid as u32) +} + +#[cfg(target_os = "linux")] +fn get_tty_for_pid(pid: u32) -> Option { + // Read /proc//stat to get the tty_nr field (field 7, 0-indexed 6) + let stat = std::fs::read_to_string(format!("/proc/{pid}/stat")).ok()?; + + // The stat line format is: pid (comm) state ppid pgrp session tty_nr ... + // comm can contain spaces and parens, so find the last ')' first + let after_comm = stat.rfind(')')? + 2; + let fields: Vec<&str> = stat[after_comm..].split_whitespace().collect(); + + // After the closing paren: state(0) ppid(1) pgrp(2) session(3) tty_nr(4) + let tty_nr: u32 = fields.get(4)?.parse().ok()?; + if tty_nr == 0 { + return None; // No controlling tty + } + + // Get the session leader PID (field 3 after comm) + let session_pid: u32 = fields.get(3)?.parse().ok()?; + + // Get session leader start time for uniqueness + let start_time = get_process_start_time(session_pid).unwrap_or(0); + + // Convert tty_nr to a name (major:minor) + let major = (tty_nr >> 8) & 0xff; + let minor = (tty_nr & 0xff) | ((tty_nr >> 12) & 0xfff00); + let tty_name = format!("tty{major}:{minor}"); + + Some(format!("{tty_name}:{start_time}")) +} + +#[cfg(target_os = "linux")] +fn get_process_start_time(pid: u32) -> Option { + let stat = std::fs::read_to_string(format!("/proc/{pid}/stat")).ok()?; + let after_comm = stat.rfind(')')? + 2; + let fields: Vec<&str> = stat[after_comm..].split_whitespace().collect(); + // Field 19 after comm is starttime (in clock ticks since boot) + fields.get(19)?.parse().ok() +} + +#[cfg(not(any(target_os = "linux", target_os = "windows")))] +fn get_peer_tty_id(_stream: &UnixStream) -> Option { + None +} + +// ── Windows named pipe client handling ─────────────────────────── + +#[cfg(windows)] +fn handle_windows_client( + pipe: windows::Win32::Foundation::HANDLE, + handler: Option>, + on_activity: Option>, + running: Arc, + tty_id: Option, +) { + use windows::Win32::Storage::FileSystem::{ReadFile, WriteFile, FlushFileBuffers}; + + while running.load(Ordering::SeqCst) { + // Read 4-byte length prefix + let mut len_buf = [0u8; 4]; + let mut bytes_read = 0u32; + let ok = unsafe { + ReadFile(pipe, Some(&mut len_buf), Some(&mut bytes_read), None) + }; + if ok.is_err() || bytes_read != 4 { + break; + } + + let msg_len = u32::from_le_bytes(len_buf); + if msg_len == 0 || msg_len > MAX_MESSAGE_SIZE { + break; + } + + // Read message body + let mut msg_buf = vec![0u8; msg_len as usize]; + let mut total_read = 0u32; + while (total_read as usize) < msg_buf.len() { + let mut chunk_read = 0u32; + let ok = unsafe { + ReadFile( + pipe, + Some(&mut msg_buf[total_read as usize..]), + Some(&mut chunk_read), + None, + ) + }; + if ok.is_err() || chunk_read == 0 { + return; + } + total_read += chunk_read; + } + + // Parse JSON + let message: Value = match serde_json::from_slice(&msg_buf) { + Ok(v) => v, + Err(_) => { + let _ = send_windows_response(pipe, None, &serde_json::json!({"error": "Invalid JSON"})); + continue; + } + }; + + if let Some(cb) = &on_activity { + cb(); + } + + let id = message.get("id").and_then(|v| v.as_str()).map(|s| s.to_string()); + + let response = if let Some(ref handler) = handler { + handler(message, tty_id.clone()) + } else { + serde_json::json!({"error": "No handler"}) + }; + + if send_windows_response(pipe, id.as_deref(), &response).is_err() { + break; + } + } +} + +#[cfg(windows)] +fn send_windows_response( + pipe: windows::Win32::Foundation::HANDLE, + id: Option<&str>, + response: &Value, +) -> Result<(), String> { + use windows::Win32::Storage::FileSystem::{WriteFile, FlushFileBuffers}; + + let mut full_response = response.clone(); + if let (Some(id), Some(obj)) = (id, full_response.as_object_mut()) { + obj.insert("id".to_string(), Value::String(id.to_string())); + } + + let json_bytes = serde_json::to_vec(&full_response) + .map_err(|e| format!("Serialization failed: {e}"))?; + + let len = (json_bytes.len() as u32).to_le_bytes(); + + let mut written = 0u32; + unsafe { + WriteFile(pipe, Some(&len), Some(&mut written), None) + .map_err(|e| format!("Write failed: {e}"))?; + WriteFile(pipe, Some(&json_bytes), Some(&mut written), None) + .map_err(|e| format!("Write failed: {e}"))?; + let _ = FlushFileBuffers(pipe); + } + + Ok(()) +} diff --git a/packages/encryption-binary-rust/src/key_store/linux.rs b/packages/encryption-binary-rust/src/key_store/linux.rs new file mode 100644 index 00000000..7b47192a --- /dev/null +++ b/packages/encryption-binary-rust/src/key_store/linux.rs @@ -0,0 +1,287 @@ +//! Linux key protection using TPM2 seal/unseal via tpm2-tools. +//! +//! Strategy: +//! 1. Create a TPM2 Storage Root Key (SRK) under the owner hierarchy +//! (deterministic — same template always produces the same key) +//! 2. Seal the PKCS8 private key under the SRK using tpm2_create +//! 3. Store the sealed public/private blobs on disk +//! 4. To decrypt: recreate SRK, load sealed object, unseal +//! +//! The sealed blob can ONLY be unsealed by the same machine's TPM chip. +//! Survives reboots, survives logout — the TPM hardware is the anchor. +//! +//! Requirements: +//! - TPM 2.0 hardware (present on most machines since ~2018) +//! - tpm2-tools installed (tpm2_createprimary, tpm2_create, tpm2_load, tpm2_unseal) +//! - Access to /dev/tpmrm0 (user must be in 'tss' group or have udev rule) +//! +//! Fallback: If TPM2 is not available, falls back to file-based (plaintext) storage. + +use std::io::Write; +use std::process::Command; + +/// Detailed result of TPM2 availability check. +pub enum Tpm2Status { + /// TPM2 is available and ready to use + Available, + /// tpm2-tools not installed + ToolsNotInstalled, + /// /dev/tpmrm0 doesn't exist (no TPM hardware or not enabled in BIOS) + NoDevice, + /// /dev/tpmrm0 exists but not accessible (permission issue) + PermissionDenied, + /// TPM device exists but SRK creation failed (TPM in bad state?) + SrkFailed(String), +} + +/// Check if TPM2 is available and usable. +pub fn check_tpm2_status() -> Tpm2Status { + // Check if tpm2_createprimary is in PATH + if Command::new("which") + .arg("tpm2_createprimary") + .output() + .map(|o| !o.status.success()) + .unwrap_or(true) + { + return Tpm2Status::ToolsNotInstalled; + } + + // Check if TPM device exists + let tpmrm = std::path::Path::new("/dev/tpmrm0"); + if !tpmrm.exists() { + return Tpm2Status::NoDevice; + } + + // Check if we can access it + match std::fs::metadata(tpmrm) { + Ok(meta) => { + use std::os::unix::fs::MetadataExt; + // Try to actually use it with a quick SRK creation + let tmp = std::env::temp_dir().join(format!("varlock-tpm-check-{}", std::process::id())); + let result = Command::new("tpm2_createprimary") + .args(["-C", "o", "-g", "sha256", "-G", "ecc256", "-c"]) + .arg(&tmp) + .output(); + + let _ = std::fs::remove_file(&tmp); + + match result { + Ok(output) if output.status.success() => Tpm2Status::Available, + Ok(output) => { + let stderr = String::from_utf8_lossy(&output.stderr); + if stderr.contains("Permission denied") || stderr.contains("TCTI") { + Tpm2Status::PermissionDenied + } else { + Tpm2Status::SrkFailed(stderr.to_string()) + } + } + Err(_) => Tpm2Status::PermissionDenied, + } + } + Err(_) => Tpm2Status::PermissionDenied, + } +} + +/// Simple check: is TPM2 available? +pub fn is_tpm2_available() -> bool { + matches!(check_tpm2_status(), Tpm2Status::Available) +} + +/// Protect a private key by sealing it with the TPM. +/// +/// Returns a blob containing the sealed public + private portions, +/// which can only be unsealed by this machine's TPM. +/// +/// Format: pub_len(4 LE) || pub_data || priv_data +pub fn tpm2_protect(private_key_der: &[u8]) -> Result, String> { + let tmp_dir = std::env::temp_dir().join(format!("varlock-tpm-{}", std::process::id())); + std::fs::create_dir_all(&tmp_dir) + .map_err(|e| format!("Failed to create temp dir: {e}"))?; + + let srk_ctx = tmp_dir.join("srk.ctx"); + let sealed_pub = tmp_dir.join("sealed.pub"); + let sealed_priv = tmp_dir.join("sealed.priv"); + let input_file = tmp_dir.join("input.dat"); + + // Clean up on exit + let _cleanup = CleanupDir(tmp_dir.clone()); + + // Write private key to temp file (restricted permissions) + { + use std::os::unix::fs::OpenOptionsExt; + let mut f = std::fs::OpenOptions::new() + .write(true) + .create(true) + .truncate(true) + .mode(0o600) + .open(&input_file) + .map_err(|e| format!("Failed to write temp file: {e}"))?; + f.write_all(private_key_der) + .map_err(|e| format!("Failed to write temp file: {e}"))?; + } + + // Step 1: Create SRK (Storage Root Key) — deterministic + run_tpm2_command( + "tpm2_createprimary", + &["-C", "o", "-g", "sha256", "-G", "ecc256", "-c"], + Some(&srk_ctx), + )?; + + // Step 2: Seal the private key under the SRK + run_tpm2_command_with_args( + "tpm2_create", + &[ + "-C", srk_ctx.to_str().unwrap(), + "-i", input_file.to_str().unwrap(), + "-u", sealed_pub.to_str().unwrap(), + "-r", sealed_priv.to_str().unwrap(), + ], + )?; + + // Step 3: Read the sealed blobs + let pub_data = std::fs::read(&sealed_pub) + .map_err(|e| format!("Failed to read sealed public blob: {e}"))?; + let priv_data = std::fs::read(&sealed_priv) + .map_err(|e| format!("Failed to read sealed private blob: {e}"))?; + + // Pack into a single blob: pub_len(4 LE) || pub_data || priv_data + let mut output = Vec::with_capacity(4 + pub_data.len() + priv_data.len()); + output.extend_from_slice(&(pub_data.len() as u32).to_le_bytes()); + output.extend_from_slice(&pub_data); + output.extend_from_slice(&priv_data); + + Ok(output) +} + +/// Unprotect a private key by unsealing it with the TPM. +pub fn tpm2_unprotect(sealed_blob: &[u8]) -> Result, String> { + if sealed_blob.len() < 4 { + return Err("Sealed blob too short".into()); + } + + // Parse: pub_len(4 LE) || pub_data || priv_data + let pub_len = u32::from_le_bytes(sealed_blob[..4].try_into().unwrap()) as usize; + if sealed_blob.len() < 4 + pub_len { + return Err("Sealed blob truncated".into()); + } + let pub_data = &sealed_blob[4..4 + pub_len]; + let priv_data = &sealed_blob[4 + pub_len..]; + + let tmp_dir = std::env::temp_dir().join(format!("varlock-tpm-{}", std::process::id())); + std::fs::create_dir_all(&tmp_dir) + .map_err(|e| format!("Failed to create temp dir: {e}"))?; + + let srk_ctx = tmp_dir.join("srk.ctx"); + let sealed_pub = tmp_dir.join("sealed.pub"); + let sealed_priv = tmp_dir.join("sealed.priv"); + let sealed_ctx = tmp_dir.join("sealed.ctx"); + + let _cleanup = CleanupDir(tmp_dir.clone()); + + // Write sealed blobs to temp files + std::fs::write(&sealed_pub, pub_data) + .map_err(|e| format!("Failed to write sealed pub: {e}"))?; + std::fs::write(&sealed_priv, priv_data) + .map_err(|e| format!("Failed to write sealed priv: {e}"))?; + + // Step 1: Recreate SRK (deterministic — same params = same key) + run_tpm2_command( + "tpm2_createprimary", + &["-C", "o", "-g", "sha256", "-G", "ecc256", "-c"], + Some(&srk_ctx), + )?; + + // Step 2: Load the sealed object + run_tpm2_command_with_args( + "tpm2_load", + &[ + "-C", srk_ctx.to_str().unwrap(), + "-u", sealed_pub.to_str().unwrap(), + "-r", sealed_priv.to_str().unwrap(), + "-c", sealed_ctx.to_str().unwrap(), + ], + )?; + + // Step 3: Unseal + let output = Command::new("tpm2_unseal") + .args(["-c", sealed_ctx.to_str().unwrap()]) + .output() + .map_err(|e| format!("Failed to run tpm2_unseal: {e}"))?; + + if !output.status.success() { + let stderr = String::from_utf8_lossy(&output.stderr); + return Err(format!("TPM2 unseal failed: {stderr}")); + } + + Ok(output.stdout) +} + +// ── Helpers ────────────────────────────────────────────────────── + +fn run_tpm2_command(cmd: &str, args: &[&str], ctx_path: Option<&std::path::Path>) -> Result<(), String> { + let mut command = Command::new(cmd); + command.args(args); + if let Some(ctx) = ctx_path { + command.arg(ctx); + } + + let output = command + .output() + .map_err(|e| format!("Failed to run {cmd}: {e}"))?; + + if !output.status.success() { + let stderr = String::from_utf8_lossy(&output.stderr); + return Err(format!("{cmd} failed: {stderr}")); + } + + Ok(()) +} + +fn run_tpm2_command_with_args(cmd: &str, args: &[&str]) -> Result<(), String> { + let output = Command::new(cmd) + .args(args) + .output() + .map_err(|e| format!("Failed to run {cmd}: {e}"))?; + + if !output.status.success() { + let stderr = String::from_utf8_lossy(&output.stderr); + return Err(format!("{cmd} failed: {stderr}")); + } + + Ok(()) +} + +/// RAII cleanup for temp directories. +struct CleanupDir(std::path::PathBuf); + +impl Drop for CleanupDir { + fn drop(&mut self) { + let _ = std::fs::remove_dir_all(&self.0); + } +} + +/// Get a user-friendly hint about why TPM2 isn't available. +pub fn get_tpm2_setup_hint() -> Option { + match check_tpm2_status() { + Tpm2Status::Available => None, + Tpm2Status::ToolsNotInstalled => Some( + "TPM2 hardware may be available but tpm2-tools is not installed.\n\ + Install with: sudo apt install tpm2-tools (Debian/Ubuntu)\n\ + or: sudo dnf install tpm2-tools (Fedora)\n\ + or: sudo pacman -S tpm2-tools (Arch)" + .into(), + ), + Tpm2Status::NoDevice => Some( + "No TPM2 device found (/dev/tpmrm0). TPM may need to be enabled in BIOS.".into(), + ), + Tpm2Status::PermissionDenied => Some( + "TPM2 device exists but access denied.\n\ + Add your user to the tss group: sudo usermod -aG tss $USER\n\ + Then log out and back in." + .into(), + ), + Tpm2Status::SrkFailed(e) => Some(format!( + "TPM2 device accessible but key creation failed: {e}" + )), + } +} diff --git a/packages/encryption-binary-rust/src/key_store/mod.rs b/packages/encryption-binary-rust/src/key_store/mod.rs new file mode 100644 index 00000000..f1f0eabc --- /dev/null +++ b/packages/encryption-binary-rust/src/key_store/mod.rs @@ -0,0 +1,368 @@ +//! Key storage abstraction. +//! +//! Each platform backend stores the P-256 private key in a protected manner: +//! - Windows: DPAPI (CryptProtectData) — encrypted to the current user session +//! - Linux: TPM2 seal/unseal via tpm2-tools — key sealed to hardware TPM chip +//! +//! All backends store the public key as plaintext (it's not secret) and the +//! private key in a platform-specific protected format. The key file format is: +//! +//! ~/.config/varlock/local-encrypt/keys/{keyId}.json +//! { +//! "keyId": "varlock-default", +//! "publicKey": "", +//! "protectedPrivateKey": "", +//! "protection": "dpapi" | "tpm2" | "none", +//! "createdAt": "2024-01-01T00:00:00Z" +//! } +//! +//! The "none" protection level stores the private key as plaintext base64 — +//! equivalent to the JS file-based backend. Used as an absolute fallback. + +use base64::{engine::general_purpose::STANDARD as BASE64, Engine}; +use serde::{Deserialize, Serialize}; +use std::fs; +use std::path::PathBuf; + +#[cfg(target_os = "linux")] +pub(crate) mod linux; +#[cfg(target_os = "windows")] +mod windows; +#[cfg(target_os = "windows")] +pub(crate) mod windows_hello; + +/// Which protection mechanism is used for the private key. +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +#[serde(rename_all = "lowercase")] +pub enum Protection { + /// Windows DPAPI — encrypted to current user session + Dpapi, + /// Linux TPM2 — sealed to hardware TPM chip + Tpm2, + /// No protection — plaintext on disk (fallback) + None, +} + +impl std::fmt::Display for Protection { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Protection::Dpapi => write!(f, "dpapi"), + Protection::Tpm2 => write!(f, "tpm2"), + Protection::None => write!(f, "none"), + } + } +} + +/// Stored key file format (JSON). +#[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct StoredKey { + pub key_id: String, + /// Base64 uncompressed P-256 public key (65 bytes raw) + pub public_key: String, + /// Base64 protected private key (protection-dependent format) + pub protected_private_key: String, + /// How the private key is protected + pub protection: Protection, + pub created_at: String, +} + +/// Information about what key protection is available on this platform. +pub struct PlatformInfo { + /// Backend name for status output + pub backend: String, + /// Whether keys are hardware-backed (TPM) + pub hardware_backed: bool, + /// Whether biometric unlock is available + pub biometric_available: bool, + /// What protection will be used for new keys + pub protection: Protection, +} + +// ── Path helpers ────────────────────────────────────────────────── + +fn get_config_dir() -> PathBuf { + if let Ok(xdg) = std::env::var("XDG_CONFIG_HOME") { + return PathBuf::from(xdg).join("varlock"); + } + + let home = dirs_home(); + + // Backwards compat: if ~/.varlock exists, use it + let legacy = home.join(".varlock"); + if legacy.exists() { + return legacy; + } + + // Default: ~/.config/varlock (XDG standard) + home.join(".config").join("varlock") +} + +fn dirs_home() -> PathBuf { + #[cfg(target_os = "windows")] + { + std::env::var("USERPROFILE") + .map(PathBuf::from) + .unwrap_or_else(|_| PathBuf::from("C:\\Users\\Default")) + } + #[cfg(not(target_os = "windows"))] + { + std::env::var("HOME") + .map(PathBuf::from) + .unwrap_or_else(|_| PathBuf::from("/tmp")) + } +} + +fn get_key_store_dir() -> PathBuf { + get_config_dir().join("local-encrypt").join("keys") +} + +fn get_key_file_path(key_id: &str) -> PathBuf { + get_key_store_dir().join(format!("{key_id}.json")) +} + +// ── Platform-specific key protection ───────────────────────────── + +/// Protect a private key using the best available platform mechanism. +/// Returns (protected_bytes_base64, protection_type). +fn protect_private_key(private_key_der: &[u8]) -> (String, Protection) { + #[cfg(target_os = "windows")] + { + match windows::dpapi_protect(private_key_der) { + Ok(protected) => (BASE64.encode(&protected), Protection::Dpapi), + Err(e) => { + eprintln!("Warning: DPAPI protection failed ({e}), falling back to plaintext"); + (BASE64.encode(private_key_der), Protection::None) + } + } + } + + #[cfg(target_os = "linux")] + { + if linux::is_tpm2_available() { + match linux::tpm2_protect(private_key_der) { + Ok(protected) => (BASE64.encode(&protected), Protection::Tpm2), + Err(e) => { + eprintln!("Warning: TPM2 protection failed ({e}), falling back to plaintext"); + (BASE64.encode(private_key_der), Protection::None) + } + } + } else { + // TPM2 not available — plaintext fallback + if let Some(hint) = linux::get_tpm2_setup_hint() { + eprintln!("Note: {hint}"); + } + (BASE64.encode(private_key_der), Protection::None) + } + } + + #[cfg(not(any(target_os = "windows", target_os = "linux")))] + { + // Unsupported platform — plaintext fallback + (BASE64.encode(private_key_der), Protection::None) + } +} + +/// Unprotect a private key, returning the raw PKCS8 DER bytes. +fn unprotect_private_key(protected_base64: &str, protection: &Protection) -> Result, String> { + let protected_bytes = BASE64 + .decode(protected_base64) + .map_err(|e| format!("Invalid base64: {e}"))?; + + match protection { + Protection::None => Ok(protected_bytes), + + #[cfg(target_os = "windows")] + Protection::Dpapi => windows::dpapi_unprotect(&protected_bytes), + + #[cfg(target_os = "linux")] + Protection::Tpm2 => linux::tpm2_unprotect(&protected_bytes), + + #[allow(unreachable_patterns)] + _ => Err(format!("Protection type '{protection}' not supported on this platform")), + } +} + +// ── Public API ─────────────────────────────────────────────────── + +/// Detect the platform capabilities and return status info. +pub fn get_platform_info() -> PlatformInfo { + #[cfg(target_os = "windows")] + { + let hello_available = windows_hello::is_hello_available(); + PlatformInfo { + backend: if hello_available { "windows-hello" } else { "windows-dpapi" }.into(), + hardware_backed: false, // DPAPI is software-based; TPM NCrypt is TODO + biometric_available: hello_available, + protection: Protection::Dpapi, + } + } + + #[cfg(target_os = "linux")] + { + let tpm2_available = linux::is_tpm2_available(); + PlatformInfo { + backend: if tpm2_available { "linux-tpm2" } else { "linux-file" }.into(), + hardware_backed: tpm2_available, + biometric_available: false, // fprintd integration is TODO + protection: if tpm2_available { Protection::Tpm2 } else { Protection::None }, + } + } + + #[cfg(not(any(target_os = "windows", target_os = "linux")))] + { + PlatformInfo { + backend: "file".into(), + hardware_backed: false, + biometric_available: false, + protection: Protection::None, + } + } +} + +/// Get a setup hint for TPM2 if it could be available but isn't configured. +#[cfg(target_os = "linux")] +pub fn get_tpm2_setup_hint() -> Option { + linux::get_tpm2_setup_hint() +} + +/// Check if a key exists. +pub fn key_exists(key_id: &str) -> bool { + get_key_file_path(key_id).exists() +} + +/// List all key IDs. +pub fn list_keys() -> Vec { + let dir = get_key_store_dir(); + let entries = match fs::read_dir(&dir) { + Ok(entries) => entries, + Err(_) => return vec![], + }; + + entries + .filter_map(|e| e.ok()) + .filter_map(|e| { + let name = e.file_name().to_string_lossy().to_string(); + name.strip_suffix(".json").map(|s| s.to_string()) + }) + .collect() +} + +/// Generate a new key pair and store it with platform-specific protection. +/// Returns the base64 public key. +pub fn generate_key(key_id: &str) -> Result { + let key_pair = crate::crypto::generate_key_pair()?; + + // Decode the private key to protect it + let private_key_der = BASE64 + .decode(&key_pair.private_key) + .map_err(|e| format!("Failed to decode private key: {e}"))?; + + let (protected, protection) = protect_private_key(&private_key_der); + + let stored = StoredKey { + key_id: key_id.to_string(), + public_key: key_pair.public_key.clone(), + protected_private_key: protected, + protection, + created_at: now_iso8601(), + }; + + // Write to disk + let dir = get_key_store_dir(); + fs::create_dir_all(&dir).map_err(|e| format!("Failed to create key store: {e}"))?; + + let path = get_key_file_path(key_id); + let json = serde_json::to_string_pretty(&stored) + .map_err(|e| format!("Failed to serialize key: {e}"))?; + + // Write with restricted permissions + #[cfg(unix)] + { + use std::os::unix::fs::OpenOptionsExt; + let mut opts = fs::OpenOptions::new(); + opts.write(true).create(true).truncate(true).mode(0o600); + use std::io::Write; + let mut file = opts.open(&path).map_err(|e| format!("Failed to write key file: {e}"))?; + file.write_all(json.as_bytes()) + .map_err(|e| format!("Failed to write key file: {e}"))?; + } + #[cfg(not(unix))] + { + fs::write(&path, &json).map_err(|e| format!("Failed to write key file: {e}"))?; + } + + Ok(key_pair.public_key) +} + +/// Delete a key. +pub fn delete_key(key_id: &str) -> bool { + let path = get_key_file_path(key_id); + fs::remove_file(path).is_ok() +} + +/// Load a stored key and return (private_key_der, public_key_base64). +pub fn load_key(key_id: &str) -> Result<(Vec, String), String> { + let path = get_key_file_path(key_id); + let data = fs::read_to_string(&path).map_err(|_| format!("Key not found: {key_id}"))?; + let stored: StoredKey = + serde_json::from_str(&data).map_err(|e| format!("Corrupted key file: {e}"))?; + + let private_key_der = unprotect_private_key(&stored.protected_private_key, &stored.protection)?; + Ok((private_key_der, stored.public_key)) +} + +/// Load just the public key (no protection needed). +pub fn load_public_key(key_id: &str) -> Result { + let path = get_key_file_path(key_id); + let data = fs::read_to_string(&path).map_err(|_| format!("Key not found: {key_id}"))?; + let stored: StoredKey = + serde_json::from_str(&data).map_err(|e| format!("Corrupted key file: {e}"))?; + Ok(stored.public_key) +} + +fn now_iso8601() -> String { + // Simple ISO 8601 without external crate + let duration = std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .unwrap_or_default(); + let secs = duration.as_secs(); + // Approximate UTC — good enough for metadata + let days = secs / 86400; + let time_of_day = secs % 86400; + let hours = time_of_day / 3600; + let minutes = (time_of_day % 3600) / 60; + let seconds = time_of_day % 60; + + // Calculate year/month/day from days since epoch (simplified) + let mut y = 1970i64; + let mut remaining_days = days as i64; + loop { + let days_in_year = if is_leap_year(y) { 366 } else { 365 }; + if remaining_days < days_in_year { + break; + } + remaining_days -= days_in_year; + y += 1; + } + let mut m = 1u32; + let days_in_months = if is_leap_year(y) { + [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] + } else { + [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] + }; + for dim in days_in_months { + if remaining_days < dim { + break; + } + remaining_days -= dim; + m += 1; + } + let d = remaining_days + 1; + + format!("{y:04}-{m:02}-{d:02}T{hours:02}:{minutes:02}:{seconds:02}Z") +} + +fn is_leap_year(y: i64) -> bool { + (y % 4 == 0 && y % 100 != 0) || y % 400 == 0 +} diff --git a/packages/encryption-binary-rust/src/key_store/windows.rs b/packages/encryption-binary-rust/src/key_store/windows.rs new file mode 100644 index 00000000..886ee45c --- /dev/null +++ b/packages/encryption-binary-rust/src/key_store/windows.rs @@ -0,0 +1,124 @@ +//! Windows key protection using DPAPI (CryptProtectData / CryptUnprotectData). +//! +//! DPAPI encrypts data to the current Windows user account. The encrypted blob +//! can only be decrypted by the same user on the same machine. No additional +//! credentials are needed at decrypt time — the user's login session provides +//! the decryption key. +//! +//! This is the same mechanism used by Chrome, Edge, and other apps to protect +//! stored passwords and cookies. +//! +//! Security properties: +//! - Key is never stored as plaintext on disk +//! - Encrypted to the current user's master key (derived from password) +//! - Cannot be decrypted by other users or on other machines +//! - Survives reboots (unlike Linux keyring) +//! - Does NOT require TPM (software-only, but user-scoped) + +use windows::Win32::Security::Cryptography::{ + CryptProtectData, CryptUnprotectData, CRYPT_INTEGER_BLOB, + CRYPTPROTECT_UI_FORBIDDEN, +}; +use windows::Win32::System::Memory::LocalFree; +use std::ptr; + +const DPAPI_DESCRIPTION: &str = "Varlock Local Encryption Key"; + +/// Encrypt data using DPAPI (CryptProtectData). +/// Returns the encrypted blob. +pub fn dpapi_protect(plaintext: &[u8]) -> Result, String> { + let mut data_in = CRYPT_INTEGER_BLOB { + cbData: plaintext.len() as u32, + pbData: plaintext.as_ptr() as *mut u8, + }; + + // Optional entropy — we use the description as additional context + let entropy_bytes: Vec = DPAPI_DESCRIPTION.encode_utf16().chain(std::iter::once(0)).collect(); + let entropy_u8: Vec = entropy_bytes.iter().flat_map(|w| w.to_le_bytes()).collect(); + let mut entropy = CRYPT_INTEGER_BLOB { + cbData: entropy_u8.len() as u32, + pbData: entropy_u8.as_ptr() as *mut u8, + }; + + let mut data_out = CRYPT_INTEGER_BLOB { + cbData: 0, + pbData: ptr::null_mut(), + }; + + let description: Vec = DPAPI_DESCRIPTION.encode_utf16().chain(std::iter::once(0)).collect(); + + let result = unsafe { + CryptProtectData( + &data_in, + windows::core::PCWSTR(description.as_ptr()), + Some(&entropy), + None, // reserved + None, // no prompt + CRYPTPROTECT_UI_FORBIDDEN, // no UI + &mut data_out, + ) + }; + + if result.is_err() { + return Err(format!("CryptProtectData failed: {:?}", result.err())); + } + + // Copy result and free the DPAPI-allocated buffer + let encrypted = unsafe { + let slice = std::slice::from_raw_parts(data_out.pbData, data_out.cbData as usize); + let vec = slice.to_vec(); + let _ = LocalFree(data_out.pbData as isize); + vec + }; + + Ok(encrypted) +} + +/// Decrypt data using DPAPI (CryptUnprotectData). +/// Returns the decrypted plaintext bytes. +pub fn dpapi_unprotect(encrypted: &[u8]) -> Result, String> { + let mut data_in = CRYPT_INTEGER_BLOB { + cbData: encrypted.len() as u32, + pbData: encrypted.as_ptr() as *mut u8, + }; + + let entropy_bytes: Vec = DPAPI_DESCRIPTION.encode_utf16().chain(std::iter::once(0)).collect(); + let entropy_u8: Vec = entropy_bytes.iter().flat_map(|w| w.to_le_bytes()).collect(); + let mut entropy = CRYPT_INTEGER_BLOB { + cbData: entropy_u8.len() as u32, + pbData: entropy_u8.as_ptr() as *mut u8, + }; + + let mut data_out = CRYPT_INTEGER_BLOB { + cbData: 0, + pbData: ptr::null_mut(), + }; + + let result = unsafe { + CryptUnprotectData( + &data_in, + None, // description out (don't need it) + Some(&entropy), + None, // reserved + None, // no prompt + CRYPTPROTECT_UI_FORBIDDEN, // no UI + &mut data_out, + ) + }; + + if result.is_err() { + return Err(format!( + "CryptUnprotectData failed — key may have been encrypted by a different user: {:?}", + result.err() + )); + } + + let decrypted = unsafe { + let slice = std::slice::from_raw_parts(data_out.pbData, data_out.cbData as usize); + let vec = slice.to_vec(); + let _ = LocalFree(data_out.pbData as isize); + vec + }; + + Ok(decrypted) +} diff --git a/packages/encryption-binary-rust/src/key_store/windows_hello.rs b/packages/encryption-binary-rust/src/key_store/windows_hello.rs new file mode 100644 index 00000000..2711df6a --- /dev/null +++ b/packages/encryption-binary-rust/src/key_store/windows_hello.rs @@ -0,0 +1,102 @@ +//! Windows Hello biometric verification. +//! +//! Uses the WinRT `UserConsentVerifier` API to show the Windows Hello dialog +//! (face recognition, fingerprint, or PIN). This is the same dialog that +//! Windows uses for login and app authentication. +//! +//! The verification is decoupled from key storage (DPAPI handles that). +//! This module purely handles user presence verification. + +use windows::Security::Credentials::UI::{ + UserConsentVerificationResult, UserConsentVerifier, UserConsentVerifierAvailability, +}; + +/// Check if Windows Hello is available and configured. +pub fn is_hello_available() -> bool { + match UserConsentVerifier::CheckAvailabilityAsync() { + Ok(op) => match op.get() { + Ok(availability) => availability == UserConsentVerifierAvailability::Available, + Err(_) => false, + }, + Err(_) => false, + } +} + +/// Detailed availability check for status reporting. +pub fn get_hello_status() -> HelloStatus { + match UserConsentVerifier::CheckAvailabilityAsync() { + Ok(op) => match op.get() { + Ok(availability) => match availability { + UserConsentVerifierAvailability::Available => HelloStatus::Available, + UserConsentVerifierAvailability::DeviceNotPresent => HelloStatus::NoDevice, + UserConsentVerifierAvailability::NotConfiguredForUser => HelloStatus::NotConfigured, + UserConsentVerifierAvailability::DisabledByPolicy => HelloStatus::DisabledByPolicy, + _ => HelloStatus::Unknown, + }, + Err(e) => HelloStatus::Error(format!("{e}")), + }, + Err(e) => HelloStatus::Error(format!("{e}")), + } +} + +pub enum HelloStatus { + Available, + NoDevice, + NotConfigured, + DisabledByPolicy, + Unknown, + Error(String), +} + +/// Request user verification via Windows Hello. +/// +/// Shows the Windows Hello dialog with the given message. +/// Returns Ok(true) if verified, Ok(false) if cancelled, Err on failure. +pub fn verify_user(message: &str) -> Result { + let message = windows::core::HSTRING::from(message); + + let op = UserConsentVerifier::RequestVerificationAsync(&message) + .map_err(|e| format!("Failed to request verification: {e}"))?; + + let result = op.get().map_err(|e| format!("Verification failed: {e}"))?; + + match result { + UserConsentVerificationResult::Verified => Ok(true), + UserConsentVerificationResult::Canceled => Ok(false), + UserConsentVerificationResult::DeviceNotPresent => { + Err("Windows Hello device not present".into()) + } + UserConsentVerificationResult::NotConfiguredForUser => { + Err("Windows Hello not configured".into()) + } + UserConsentVerificationResult::DisabledByPolicy => { + Err("Windows Hello disabled by policy".into()) + } + UserConsentVerificationResult::DeviceBusy => Err("Windows Hello device busy".into()), + UserConsentVerificationResult::RetriesExhausted => { + Err("Windows Hello retries exhausted".into()) + } + _ => Err("Unknown verification result".into()), + } +} + +/// Get a setup hint if Windows Hello could be available. +pub fn get_setup_hint() -> Option { + match get_hello_status() { + HelloStatus::Available => None, + HelloStatus::NoDevice => Some( + "No Windows Hello compatible device found.\n\ + Windows Hello requires a fingerprint reader, IR camera, or compatible security key." + .into(), + ), + HelloStatus::NotConfigured => Some( + "Windows Hello is available but not set up.\n\ + Configure it in Settings > Accounts > Sign-in options." + .into(), + ), + HelloStatus::DisabledByPolicy => Some( + "Windows Hello is disabled by group policy.".into(), + ), + _ => None, + } +} diff --git a/packages/encryption-binary-rust/src/main.rs b/packages/encryption-binary-rust/src/main.rs new file mode 100644 index 00000000..3fe7b885 --- /dev/null +++ b/packages/encryption-binary-rust/src/main.rs @@ -0,0 +1,246 @@ +//! varlock-local-encrypt — Cross-platform local encryption binary for Varlock. +//! +//! Provides the same CLI interface as the Swift macOS binary: +//! generate-key, delete-key, list-keys, key-exists, encrypt, decrypt, status, daemon +//! +//! All output is JSON. Errors return {"error": "message"}. + +mod crypto; +mod daemon; +mod ipc; +mod key_store; + +use base64::{engine::general_purpose::STANDARD as BASE64, Engine}; +use serde_json::json; + +const DEFAULT_KEY_ID: &str = "varlock-default"; + +fn main() { + let args: Vec = std::env::args().collect(); + let command = args.get(1).map(|s| s.as_str()).unwrap_or("help"); + + match command { + "generate-key" => cmd_generate_key(&args), + "delete-key" => cmd_delete_key(&args), + "list-keys" => cmd_list_keys(), + "key-exists" => cmd_key_exists(&args), + "encrypt" => cmd_encrypt(&args), + "decrypt" => cmd_decrypt(&args), + "status" => cmd_status(), + "daemon" => cmd_daemon(&args), + "help" | "--help" | "-h" => cmd_help(), + _ => json_error(&format!("Unknown command: {command}. Run with --help for usage.")), + } +} + +// ── CLI arg helpers ────────────────────────────────────────────── + +fn get_arg(args: &[String], flag: &str) -> Option { + args.iter() + .position(|a| a == flag) + .and_then(|i| args.get(i + 1).cloned()) +} + +fn get_key_id(args: &[String]) -> String { + get_arg(args, "--key-id").unwrap_or_else(|| DEFAULT_KEY_ID.to_string()) +} + +// ── JSON output helpers ───────────────────────────────────────── + +fn json_output(value: &serde_json::Value) { + println!("{}", serde_json::to_string(value).unwrap_or_default()); +} + +fn json_error(message: &str) -> ! { + json_output(&json!({"error": message})); + std::process::exit(1); +} + +fn json_success(result: serde_json::Value) -> ! { + let mut obj = json!({"ok": true}); + if let (Some(base), Some(extra)) = (obj.as_object_mut(), result.as_object()) { + for (k, v) in extra { + base.insert(k.clone(), v.clone()); + } + } + json_output(&obj); + std::process::exit(0); +} + +// ── Commands ──────────────────────────────────────────────────── + +fn cmd_generate_key(args: &[String]) { + let key_id = get_key_id(args); + + match key_store::generate_key(&key_id) { + Ok(public_key) => { + let pub_bytes = BASE64.decode(&public_key).unwrap_or_default(); + json_success(json!({ + "keyId": key_id, + "publicKey": public_key, + "publicKeyBytes": pub_bytes.len(), + })); + } + Err(e) => json_error(&e), + } +} + +fn cmd_delete_key(args: &[String]) { + let key_id = get_key_id(args); + let deleted = key_store::delete_key(&key_id); + json_success(json!({ + "keyId": key_id, + "deleted": deleted, + })); +} + +fn cmd_list_keys() { + let keys = key_store::list_keys(); + json_success(json!({"keys": keys})); +} + +fn cmd_key_exists(args: &[String]) { + let key_id = get_key_id(args); + let exists = key_store::key_exists(&key_id); + json_success(json!({ + "keyId": key_id, + "exists": exists, + })); +} + +fn cmd_encrypt(args: &[String]) { + let key_id = get_key_id(args); + + let data_b64 = match get_arg(args, "--data") { + Some(d) => d, + None => json_error("Missing --data argument (base64-encoded plaintext)"), + }; + + let plaintext = match BASE64.decode(&data_b64) { + Ok(d) => d, + Err(_) => json_error("Invalid base64 data"), + }; + + // Load just the public key (no private key access needed) + let public_key = match key_store::load_public_key(&key_id) { + Ok(pk) => pk, + Err(e) => json_error(&e), + }; + + match crypto::encrypt(&public_key, &plaintext) { + Ok(ciphertext) => json_success(json!({"ciphertext": ciphertext})), + Err(e) => json_error(&e), + } +} + +fn cmd_decrypt(args: &[String]) { + let key_id = get_key_id(args); + + let data_b64 = match get_arg(args, "--data") { + Some(d) => d, + None => json_error("Missing --data argument (base64-encoded ciphertext)"), + }; + + // Load the full key pair (private key needed) + let (private_key_der, public_key_b64) = match key_store::load_key(&key_id) { + Ok(k) => k, + Err(e) => json_error(&e), + }; + + let private_key_b64 = BASE64.encode(&private_key_der); + + match crypto::decrypt(&private_key_b64, &public_key_b64, &data_b64) { + Ok(plaintext_bytes) => { + let plaintext = match String::from_utf8(plaintext_bytes) { + Ok(s) => s, + Err(_) => json_error("Decrypted data is not valid UTF-8"), + }; + json_success(json!({"plaintext": plaintext})); + } + Err(e) => json_error(&e), + } +} + +fn cmd_status() { + let info = key_store::get_platform_info(); + let keys = key_store::list_keys(); + + #[allow(unused_mut)] + let mut result = json!({ + "backend": info.backend, + "hardwareBacked": info.hardware_backed, + "biometricAvailable": info.biometric_available, + "protection": info.protection.to_string(), + "platform": std::env::consts::OS, + "arch": std::env::consts::ARCH, + "keys": keys, + }); + + // Include setup hints for optional features + #[cfg(target_os = "linux")] + { + if !info.hardware_backed { + if let Some(hint) = key_store::get_tpm2_setup_hint() { + result.as_object_mut().unwrap().insert( + "setupHint".to_string(), + serde_json::Value::String(hint), + ); + } + } + } + #[cfg(target_os = "windows")] + { + if !info.biometric_available { + if let Some(hint) = key_store::windows_hello::get_setup_hint() { + result.as_object_mut().unwrap().insert( + "setupHint".to_string(), + serde_json::Value::String(hint), + ); + } + } + } + + json_success(result); +} + +fn cmd_daemon(args: &[String]) { + let socket_path = match get_arg(args, "--socket-path") { + Some(sp) => sp, + None => json_error("Missing --socket-path argument"), + }; + + let pid_path = get_arg(args, "--pid-path"); + + if let Err(e) = daemon::run_daemon(&socket_path, pid_path.as_deref()) { + json_error(&format!("Failed to start daemon: {e}")); + } +} + +fn cmd_help() { + let help = r#"varlock-local-encrypt - Cross-platform local encryption for Varlock + +COMMANDS: + generate-key [--key-id ] Create a new encryption key + delete-key [--key-id ] Delete an encryption key + list-keys List all Varlock encryption keys + key-exists [--key-id ] Check if a key exists + encrypt --data [--key-id ] Encrypt data (one-shot) + decrypt --data [--key-id ] Decrypt data (one-shot) + status Check platform capabilities + daemon --socket-path [--pid-path ] Start IPC daemon + +OPTIONS: + --key-id Key identifier (default: varlock-default) + --data Base64-encoded data + --socket-path Unix socket path for daemon mode + --pid-path PID file path for daemon mode + +PLATFORM PROTECTION: + Windows: DPAPI (user-session-scoped encryption) + Linux: Kernel keyring (key held in kernel memory) + +All output is JSON. Errors return {"error": "message"}. +"#; + print!("{help}"); + std::process::exit(0); +} diff --git a/packages/encryption-binary-swift/swift/Sources/VarlockEnclave/SecureEnclaveManager.swift b/packages/encryption-binary-swift/swift/Sources/VarlockEnclave/SecureEnclaveManager.swift index e70bcb70..f86d8203 100644 --- a/packages/encryption-binary-swift/swift/Sources/VarlockEnclave/SecureEnclaveManager.swift +++ b/packages/encryption-binary-swift/swift/Sources/VarlockEnclave/SecureEnclaveManager.swift @@ -29,16 +29,21 @@ final class SecureEnclaveManager { // MARK: - Key Management - /// Create a new Secure Enclave P-256 key with user-presence access control. - /// Accepts Touch ID, Apple Watch, or device password as authentication. + /// Create a new Secure Enclave P-256 key. + /// + /// By default, requires user presence (Touch ID, Apple Watch, or device password). + /// Pass `requireAuth: false` for CI/testing — key is still SE-backed but no biometric. /// Saves the key data representation to disk and returns the public key. - static func generateKey(keyId: String, context: LAContext? = nil) throws -> Data { - // Create access control requiring user presence (biometric or password) + static func generateKey(keyId: String, context: LAContext? = nil, requireAuth: Bool = true) throws -> Data { + // Create access control — with or without user presence requirement var accessError: Unmanaged? + let flags: SecAccessControlCreateFlags = requireAuth + ? [.privateKeyUsage, .userPresence] + : [.privateKeyUsage] guard let accessControl = SecAccessControlCreateWithFlags( kCFAllocatorDefault, kSecAttrAccessibleWhenUnlockedThisDeviceOnly, - [.privateKeyUsage, .userPresence], + flags, &accessError ) else { let err = accessError?.takeRetainedValue() diff --git a/packages/encryption-binary-swift/swift/Sources/VarlockEnclave/main.swift b/packages/encryption-binary-swift/swift/Sources/VarlockEnclave/main.swift index bb0ac8a4..6cd3297f 100644 --- a/packages/encryption-binary-swift/swift/Sources/VarlockEnclave/main.swift +++ b/packages/encryption-binary-swift/swift/Sources/VarlockEnclave/main.swift @@ -33,6 +33,7 @@ func getArg(_ flag: String) -> String? { } let defaultKeyId = "varlock-default" +let noAuth = args.contains("--no-auth") // CI mode: skip biometric requirement switch command { @@ -42,7 +43,7 @@ case "generate-key": let keyId = getArg("--key-id") ?? defaultKeyId do { - let pubKeyData = try SecureEnclaveManager.generateKey(keyId: keyId) + let pubKeyData = try SecureEnclaveManager.generateKey(keyId: keyId, requireAuth: !noAuth) jsonSuccess([ "keyId": keyId, "publicKey": pubKeyData.base64EncodedString(), diff --git a/packages/varlock/scripts/build-binaries.ts b/packages/varlock/scripts/build-binaries.ts index ee7b6389..9e18248a 100644 --- a/packages/varlock/scripts/build-binaries.ts +++ b/packages/varlock/scripts/build-binaries.ts @@ -80,7 +80,27 @@ if (devMode) { console.log(` Warning: macOS native binary not found at ${appBundleSrc}, skipping`); } } - // TODO: bundle native binaries for linux/windows when rust builds exist + + // Bundle Rust native binary for Linux/Windows + let nativeBinSubdir: string | null = null; + if (isWin) { + nativeBinSubdir = 'win32-x64'; + } else if (archiveName.startsWith('linux-musl-')) { + nativeBinSubdir = `linux-${archiveName.replace('linux-musl-', '')}`; + } else if (archiveName.startsWith('linux-')) { + nativeBinSubdir = `linux-${archiveName.replace('linux-', '')}`; + } + + if (nativeBinSubdir && !isMac) { + const rustBinaryName = isWin ? 'varlock-local-encrypt.exe' : 'varlock-local-encrypt'; + const rustBinarySrc = path.join(NATIVE_BINS_DIR, nativeBinSubdir, rustBinaryName); + if (fs.existsSync(rustBinarySrc)) { + console.log(` Bundling Rust native binary (${nativeBinSubdir}/${rustBinaryName})`); + exec(`cp "${rustBinarySrc}" "${targetDir}/${rustBinaryName}"`); + } else { + console.log(` Warning: Rust native binary not found at ${rustBinarySrc}, skipping`); + } + } // Archive let archive: string; diff --git a/packages/varlock/src/lib/local-encrypt/binary-resolver.ts b/packages/varlock/src/lib/local-encrypt/binary-resolver.ts index 85defebb..08fed488 100644 --- a/packages/varlock/src/lib/local-encrypt/binary-resolver.ts +++ b/packages/varlock/src/lib/local-encrypt/binary-resolver.ts @@ -106,7 +106,7 @@ function resolveDevFallback(): string | undefined { } // Check for Rust build output (Linux/Windows) - const rustBuild = path.join(dir, 'packages', 'local-encrypt', 'rust', 'target', 'release', getPlatformBinaryName()); + const rustBuild = path.join(dir, 'packages', 'encryption-binary-rust', 'target', 'release', getPlatformBinaryName()); if (fs.existsSync(rustBuild)) return rustBuild; } diff --git a/packages/varlock/src/lib/local-encrypt/daemon-client.ts b/packages/varlock/src/lib/local-encrypt/daemon-client.ts index ea556448..78de9335 100644 --- a/packages/varlock/src/lib/local-encrypt/daemon-client.ts +++ b/packages/varlock/src/lib/local-encrypt/daemon-client.ts @@ -25,8 +25,8 @@ function getSocketDir(): string { function getSocketPath(): string { if (process.platform === 'win32') { - // Windows named pipe - return `\\\\.\\pipe\\varlock-local-encrypt-${process.pid}`; + // Windows named pipe — fixed name shared by all varlock processes + return '\\\\.\\pipe\\varlock-local-encrypt'; } return path.join(getSocketDir(), 'daemon.sock'); } @@ -234,8 +234,13 @@ export class DaemonClient { const socketPath = getSocketPath(); const pidPath = getPidPath(); + const isWindows = process.platform === 'win32'; - fs.mkdirSync(path.dirname(socketPath), { recursive: true }); + // Ensure PID directory exists (don't mkdir for Windows pipe paths) + if (!isWindows) { + fs.mkdirSync(path.dirname(socketPath), { recursive: true }); + } + fs.mkdirSync(path.dirname(pidPath), { recursive: true }); // Check for existing daemon via PID if (fs.existsSync(pidPath)) { @@ -252,16 +257,23 @@ export class DaemonClient { } } - // Clean up stale socket and PID files before spawning - for (const file of [socketPath, pidPath]) { - if (fs.existsSync(file)) { - fs.unlinkSync(file); + // Clean up stale files before spawning + // On Windows, named pipes don't leave files — only clean PID and Unix sockets + if (!isWindows) { + for (const file of [socketPath, pidPath]) { + if (fs.existsSync(file)) { + fs.unlinkSync(file); + } + } + // Verify socket file is actually gone + if (fs.existsSync(socketPath)) { + throw new Error(`Failed to clean up stale socket file: ${socketPath}`); + } + } else { + // Clean PID file only on Windows + if (fs.existsSync(pidPath)) { + fs.unlinkSync(pidPath); } - } - - // Verify socket file is actually gone — if not, something is very wrong - if (fs.existsSync(socketPath)) { - throw new Error(`Failed to clean up stale socket file: ${socketPath}`); } return new Promise((resolve, reject) => { diff --git a/packages/varlock/src/lib/local-encrypt/index.ts b/packages/varlock/src/lib/local-encrypt/index.ts index 2b99831d..ecdda221 100644 --- a/packages/varlock/src/lib/local-encrypt/index.ts +++ b/packages/varlock/src/lib/local-encrypt/index.ts @@ -14,12 +14,34 @@ import { execFileSync } from 'node:child_process'; import { resolveNativeBinary } from './binary-resolver'; import { DaemonClient } from './daemon-client'; import * as fileBackend from './file-backend'; -import type { BackendInfo, BackendType } from './types'; +import type { BackendInfo, BackendType, NativeStatusResult } from './types'; export type { BackendInfo, BackendType } from './types'; const DEFAULT_KEY_ID = 'varlock-default'; +// ── Native binary one-shot commands ──────────────────────────────────── + +function runNativeBinary(args: Array): string { + const binaryPath = resolveNativeBinary(); + if (!binaryPath) { + throw new Error('Native binary not found'); + } + return execFileSync(binaryPath, args, { + encoding: 'utf-8', + timeout: 30_000, + }).trim(); +} + +function runNativeBinaryJson>(args: Array): T { + const output = runNativeBinary(args); + const parsed = JSON.parse(output); + if (parsed.error) { + throw new Error(parsed.error); + } + return parsed as T; +} + // ── Backend detection ────────────────────────────────────────────────── let cachedBackendInfo: BackendInfo | undefined; @@ -30,9 +52,8 @@ function detectBackendType(): BackendType { switch (process.platform) { case 'darwin': return 'secure-enclave'; - // TODO: Windows TPM and Linux TPM2 native backends not yet implemented - // case 'win32': return 'windows-tpm'; - // case 'linux': return 'linux-tpm'; + case 'win32': return 'windows-tpm'; + case 'linux': return 'linux-tpm'; default: return 'file'; } } @@ -44,37 +65,38 @@ export function getBackendInfo(): BackendInfo { const type = detectBackendType(); const binaryPath = type !== 'file' ? resolveNativeBinary() : undefined; - cachedBackendInfo = { - type, - platform: process.platform, - hardwareBacked: type !== 'file', - biometricAvailable: type === 'secure-enclave' || type === 'windows-tpm', - binaryPath, - }; - - return cachedBackendInfo; -} - -// ── Native binary one-shot commands ──────────────────────────────────── - -function runNativeBinary(args: Array): string { - const binaryPath = resolveNativeBinary(); - if (!binaryPath) { - throw new Error('Native binary not found'); + if (type !== 'file' && binaryPath) { + // Query the native binary for its actual capabilities + try { + const status = runNativeBinaryJson(['status']); + cachedBackendInfo = { + type, + platform: process.platform, + hardwareBacked: status.hardwareBacked, + biometricAvailable: status.biometricAvailable, + binaryPath, + }; + } catch { + // Binary failed — fall back to reasonable defaults + cachedBackendInfo = { + type, + platform: process.platform, + hardwareBacked: type === 'secure-enclave', + biometricAvailable: type === 'secure-enclave', + binaryPath, + }; + } + } else { + cachedBackendInfo = { + type, + platform: process.platform, + hardwareBacked: false, + biometricAvailable: false, + binaryPath: undefined, + }; } - return execFileSync(binaryPath, args, { - encoding: 'utf-8', - timeout: 30_000, - }).trim(); -} -function runNativeBinaryJson>(args: Array): T { - const output = runNativeBinary(args); - const parsed = JSON.parse(output); - if (parsed.error) { - throw new Error(parsed.error); - } - return parsed as T; + return cachedBackendInfo; } // ── Daemon client (singleton for biometric-enabled backends) ─────────── diff --git a/packages/varlock/src/lib/local-encrypt/types.ts b/packages/varlock/src/lib/local-encrypt/types.ts index f6125b07..44def1ff 100644 --- a/packages/varlock/src/lib/local-encrypt/types.ts +++ b/packages/varlock/src/lib/local-encrypt/types.ts @@ -5,8 +5,8 @@ /** Which encryption backend is active */ export type BackendType = ( | 'secure-enclave' // macOS Secure Enclave (Swift binary) - | 'windows-tpm' // Windows TPM via NCrypt (Rust binary) - | 'linux-tpm' // Linux TPM2 (Rust binary) + | 'windows-tpm' // Windows native (Rust binary) — DPAPI now, TPM/Hello planned + | 'linux-tpm' // Linux native (Rust binary) — kernel keyring now, TPM planned | 'file' // Pure JS file-based (universal fallback) );