
SRO PKCS11 – SSH Agent CNG é um agente Windows soberano, ultraleve e zero dependência que unifica PKCS#11, SSH-agent, Pageant e CNG/Smartcard em um único binário robusto. Projetado para ambientes exigentes, ele oferece criptografia de hardware nativa, isolamento service/userland, suporte completo para smartcards.
Unificação soberana PKCS#11 + SSH-agent + Pageant + CNG/Smartcard
Um executável Windows único que unifica quatro funções tradicionalmente separadas:
Soberana. Nenhuma dependência do CRT. Todas as operações de memória passam por RtlCopyMemory, RtlZeroMemory, RtlEqualMemory (FreeCRT.h). Unicode em todo lado (Win32 nativo). Nenhum malloc, memcpy, strlen, printf.
Segura. As chaves privadas nunca são exportadas. Nenhum PIN transita. CNG/KSP gere a UI PIN nativa do Windows. Isolamento estrito serviço ↔ userland através de pipes seguros.
Minimalista. Um único binário. Nenhuma DLL externa. Nenhum inchaço de registry. Instalação simples (regsvr32 ou -install).
Versátil. Suporte simultâneo de PKCS#11, SSH-agent, Pageant e WSL2 no mesmo processo.
┌──────────────────────────────────────────────────────────────┐ │ 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) │ └──────────────────────────────────────────────────────────────┘
## Modos de execução
### 1. Modo PKCS#11 (automático)
Carregado por:
- `ssh -I ssh-agent.exe user@host`
- Firefox (Security Devices → Load PKCS#11 Module)
- `pkcs11-tool --module ssh-agent.exe --list-objects`
Expõe as exportações PKCS#11 padrão:
- `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`
**Mecanismos suportados (14 no total):**
- `CKM_RSA_PKCS` (raw com padding)
- `CKM_RSA_X_509` (raw sem 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. Modo agente userland (standalone)```bash
ssh-agent.exe
\\.\pipe\openssh-ssh-agent em sessão do usuárioCompatível com:
set SSH_AUTH_SOCK=\\.\pipe\openssh-ssh-agent)ssh-agent.exe -install net start SROSSHAgentCNG
- Roda na sessão 0 (SYSTEM)
- Aceita conexões no pipe global
- Cria um pipe interno por cliente (protegido por SID)
- Inicia um helper userland com `CreateProcessAsUserW`
- Encaminha as mensagens sem tocar nos segredos
- Pool de helpers com timeout de 4h (reutilização automática)
- Evicção LRU se pool cheio
**Vantagens:**
- UI PIN na sessão do usuário (não na sessão 0)
- Compatível com ambientes endurecidos
- Isolamento estrito serviço ↔ crypto
- Multiplexação multi-usuários
### 4. Modo helper crypto userland```bash
ssh-agent.exe -useragent -pipe \\.\pipe\ssh-ksp-helper-{GUID}
Iniciado automaticamente pelo serviço :
NCryptSignHash (UI PIN nativa)regsvr32 ssh-agent.exe
Crie as chaves :
- `HKLM\SOFTWARE\San@sro Inc\PKCS11-SSH-Agent`
- `HKCU\SOFTWARE\San@sro Inc\PKCS11-SSH-Agent`
- `HKCU\SOFTWARE\Mozilla\Firefox\PKCS11Modules\SROSSHAgent`
### Instalar o serviço Windows```bash
ssh-agent.exe -install
net start SROSSHAgentCNG