diff --git a/Cargo.lock b/Cargo.lock index 61a4131..a29558c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -341,12 +341,16 @@ dependencies = [ name = "enclaveapp-apple" version = "0.1.0" dependencies = [ + "aes-gcm", "base64 0.22.1", "dirs", "enclaveapp-core", "libc", + "rand", "serde", "serde_json", + "tempfile", + "tracing", ] [[package]] diff --git a/DESIGN.md b/DESIGN.md index a44ab96..86233f8 100644 --- a/DESIGN.md +++ b/DESIGN.md @@ -156,7 +156,7 @@ Signing keys are long-lived identity keys (e.g., SSH keys). At Levels 1-3, the h | Level | Backend | Who signs? | Private key exportable? | User presence | Key storage | |:-----:|---------|-----------|:----------------------:|---------------|-------------| -| **1** | macOS Secure Enclave | **The SE hardware.** `sshenc` sends data to the SE via CryptoKit; the SE performs ECDSA P-256 internally and returns the signature. The private key never exists outside the chip. Works for both signed and unsigned binaries on Apple Silicon. | **No** — impossible. Even root cannot extract it. The `dataRepresentation` on disk is an opaque SE handle (not key material); it is written with 0600 permissions today. AES-GCM wrapping under a Keychain-stored key is planned (see `fix-macos.md`) and not yet implemented. | Touch ID / biometric enforced by SE hardware per-signature (when access policy is set). | Secure Enclave coprocessor + handle file on disk (0600). Keychain-wrapped handle is a planned hardening. | +| **1** | macOS Secure Enclave | **The SE hardware.** `sshenc` sends data to the SE via CryptoKit; the SE performs ECDSA P-256 internally and returns the signature. The private key never exists outside the chip. Works for both signed and unsigned binaries on Apple Silicon. | **No** — impossible. Even root cannot extract it. The `dataRepresentation` on disk is an opaque SE handle (not key material); it is AES-256-GCM wrapped under a 32-byte key stored in the login Keychain (service `com.enclaveapp.`, account `