Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,6 @@ dist/notarization/
*.local
*.log
dist/

# Quarkdown build output
quarkdown-output/
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
<img alt="C" src="https://img.shields.io/badge/C-A8B9CC?style=flat-square&logo=c&logoColor=white">
<img alt="Platform: iOS Simulator and macOS" src="https://img.shields.io/badge/Platform-iOS_Simulator_%C2%B7_macOS-lightgrey?style=flat-square&logo=apple&logoColor=white">
<a href="https://github.com/nirapod-labs/simenclave/releases"><img alt="Latest release" src="https://img.shields.io/github/v/release/nirapod-labs/simenclave?style=flat-square&label=release&color=2563eb"></a>
<a href="https://nirapod-labs.github.io/simenclave/"><img alt="Documentation" src="https://img.shields.io/badge/docs-architecture-2563eb?style=flat-square"></a>
</p>

# SimEnclave
Expand All @@ -19,6 +20,10 @@ SimEnclave gives the iOS Simulator a real Secure Enclave. It injects a small int

It exists because the iOS Simulator has no Secure Enclave. That means the one thing hardware-backed signing depends on, a key that never leaves the chip, can't run where you develop all day. So every change to a signing path forces you onto a physical device. SimEnclave fixes that without weakening the security property and without ever becoming something that could ship.

<p align="center">
<video src="https://github.com/nirapod-labs/simenclave/raw/main/assets/github/showcase.mp4" width="830" controls></video>
</p>

## How it works

Your Mac has a real Secure Enclave. A menubar helper owns a P-256 key inside it. When a simulated app calls `SecKeyCreateSignature`, an injected interposer, loaded only through a debug scheme environment variable, sends the digest to the helper over an authenticated loopback socket. The helper signs in the Mac's SEP and the signature comes back. The private key never leaves the chip. The only things that cross the wire are a handle, a public key, a digest, and a signature, which is exactly what an app on a real device already handles.
Expand Down
Binary file added assets/github/showcase.mp4
Binary file not shown.
Loading