
SRO PKCS11 β SSH Agent CNG est un agent Windows souverain, ultraβlΓ©ger et zΓ©roβdΓ©pendance qui unifie PKCS#11, SSH-agent, Pageant et CNG/Smartcard dans un seul binaire robuste. PensΓ© pour les environnements exigeants, il offre une cryptographie matΓ©rielle native, une isolation service/userland, un support complet smartcards.
Sovereign unification PKCS#11 + SSH-agent + Pageant + CNG/Smartcard
A single Windows executable that unifies four traditionally separate functions:
Sovereign. No CRT dependency. All memory operations use RtlCopyMemory, RtlZeroMemory, RtlEqualMemory (FreeCRT.h). Unicode everywhere (native Win32). No malloc, memcpy, strlen, printf.
Secure. Private keys are never exported. No PIN transits. CNG/KSP handles native Windows PIN UI. Strict service β userland isolation via secure pipes.
Minimalist. Single binary. No external DLLs. No registry bloat. Simple installation (regsvr32 or -install).
Versatile. Simultaneous support for PKCS#11, SSH-agent, Pageant, and WSL2 in the same process.
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β Clients (Git, VS, WSL, OpenSSH, PuTTY, Firefox) β ββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββ β βββββββββββββββββΌββββββββββββββββ¬ββββββββββββββββββ β β β β SSH-agent Pageant (WM_COPYDATA) PKCS#11 WSL2 (TCP) β β β β v v v v ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β Service Stub (session 0, SYSTEM) β β - Accepte connexions sur \.\pipe\openssh-ssh-agent β β - CrΓ©e pipe interne par client (GUID unique) β β - Lance helper userland avec token interactif β β - Forwarde messages sans manipuler de secrets β ββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββ β lancΓ© par le service v ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β Helper Userland (session interactive) β β - Connecte au pipe interne β β - DΓ©code protocole SSH-agent/Pageant β β - Invoque CNG/KSP pour signature β β - UI PIN native Windows (pas de relay) β β - Renvoie signature au service β β - FenΓͺtre Pageant cachΓ©e pour WM_COPYDATA β β - Listener TCP 127.0.0.1:10022 pour WSL2 β β - Tray icon avec menu contextuel β ββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββ β v ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β CNG/KSP Backend β β - NCryptSignHash avec PKCS#1/PSS padding β β - EnumΓ©ration certificats Windows Store β β - Filtrage SmartCardOnly / AllowedKSP β β - Support RSA + ECDSA (P-256, P-384, P-521) β β - Support EdDSA (Ed25519, Ed448) β β - Support Brainpool (P256r1, P384r1, P512r1) β β - Cache clΓ©s + providers (4h timeout) β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
---
## Execution Modes
### 1. PKCS#11 Mode (automatic)
Loaded by:
- `ssh -I ssh-agent.exe user@host`
- Firefox (Security Devices β Load PKCS#11 Module)
- `pkcs11-tool --module ssh-agent.exe --list-objects`
Exposes standard PKCS#11 exports:
- `C_Initialize`, `C_Finalize`, `C_GetInfo`
- `C_GetSlotList`, `C_GetSlotInfo`, `C_GetTokenInfo`
- `C_GetMechanismList`, `C_GetMechanismInfo`
- `C_OpenSession`, `C_CloseSession`, `C_Login`, `C_Logout`
- `C_FindObjectsInit`, `C_FindObjects`, `C_FindObjectsFinal`
- `C_GetAttributeValue`
- `C_SignInit`, `C_Sign`
- `C_VerifyInit`, `C_Verify`
- `C_DecryptInit`, `C_Decrypt`
- `C_GenerateRandom`, `C_SeedRandom`
**Supported mechanisms (14 total):**
- `CKM_RSA_PKCS` (raw with padding)
- `CKM_RSA_X_509` (raw without padding)
- `CKM_SHA1_RSA_PKCS` (legacy ssh-rsa)
- `CKM_SHA256_RSA_PKCS` (rsa-sha2-256)
- `CKM_SHA384_RSA_PKCS` (rsa-sha2-384)
- `CKM_SHA512_RSA_PKCS` (rsa-sha2-512)
- `CKM_SHA256_RSA_PKCS_PSS` (RSA-PSS SHA-256)
- `CKM_SHA384_RSA_PKCS_PSS` (RSA-PSS SHA-384)
- `CKM_SHA512_RSA_PKCS_PSS` (RSA-PSS SHA-512)
- `CKM_ECDSA` (raw)
- `CKM_ECDSA_SHA1` (legacy)
- `CKM_ECDSA_SHA256` (ecdsa-sha2-nistp256/384/521)
- `CKM_ECDSA_SHA384`
- `CKM_ECDSA_SHA512`
### 2. Userland Agent Mode (standalone)```bash
ssh-agent.exe
\\.\pipe\openssh-ssh-agent in user sessionCompatible with:
set SSH_AUTH_SOCK=\\.\pipe\openssh-ssh-agent)ssh-agent.exe -install net start SROSSHAgentCNG
- Runs in session 0 (SYSTEM)
- Accepts connections on global pipe
- Creates an internal pipe per client (secured by SID)
- Launches a userland helper with `CreateProcessAsUserW`
- Forwards messages without touching secrets
- Helper pool with 4h timeout (automatic reuse)
- LRU eviction if pool full
**Advantages:**
- UI PIN in user session (not in session 0)
- Compatible with hardened environments
- Strict isolation service β crypto
- Multi-user multiplexing
### 4. Userland crypto helper mode```bash
ssh-agent.exe -useragent -pipe \\.\pipe\ssh-ksp-helper-{GUID}
Launched automatically by the service:
NCryptSignHash (native PIN UI)regsvr32 ssh-agent.exe
Create the keys:
- `HKLM\SOFTWARE\San@sro Inc\PKCS11-SSH-Agent`
- `HKCU\SOFTWARE\San@sro Inc\PKCS11-SSH-Agent`
- `HKCU\SOFTWARE\Mozilla\Firefox\PKCS11Modules\SROSSHAgent`
### Install the Windows service```bash
ssh-agent.exe -install
net start SROSSHAgentCNG
Add to ~/.bashrc or ~/.zshrc :```bash
export SSH_AUTH_SOCK="$HOME/.ssh/agent.sock"