PicoKeys HSM
Eu deixei para escrever essa parte separadamente porque a anterior estava bem grande. Aqui eu quero explicar como o Pico HSM organiza as chaves, que tipos de chaves ele usa, como o PIN participa do acesso e como escolher tamanhos de chave RSA.
O Pico HSM é um firmware que transforma uma placa compatível em um dispositivo criptográfico. O computador conversa com ele como se fosse um cartão inteligente, através do USB/CCID, usando ferramentas como OpenSC, pkcs11-tool e aplicações compatíveis com PKCS#11. O objetivo é que a chave privada seja criada ou importada para o HSM e usada lá dentro. Em uma operação de assinatura, por exemplo, o computador envia os dados ao HSM e recebe a assinatura.
Um HSM não impede que um computador comprometido solicite operações válidas para o HSM. O PIN autoriza o uso da chave, mas a aplicação e o computador que enviam os dados também precisam ser confiáveis.
O Pico HSM é um projeto de código aberto para estudo e uso pessoal. Ele não deve ser confundido com um HSM empresarial certificado para requisitos regulatórios ou para proteção contra ataques físicos avançados.
As chaves
Existem chaves internas para proteger o armazenamento, chaves de transporte para backup e as chaves que você cria para assinar, criptografar ou autentica, a tabela abaixo exemplifica um pouco a sopa de letrinhas:
| Nome | Para que serve | Onde participa |
|---|---|---|
| PIN do usuário | Autoriza o uso das chaves privadas e secretas | Sessão de acesso ao HSM |
| SO PIN | Autoriza certas ações administrativas e de recuperação | Gerenciamento do token |
| MKEK | Protege as chaves privadas e secretas armazenadas | Criptografia do armazenamento interno |
| DKEK | Protege chaves exportadas ou importadas em formato wrapped | Backup e transferência entre dispositivos do mesmo domínio |
| Chave privada de aplicação | Assina, descriptografa ou executa outra operação definida | Objeto armazenado e usado pelo HSM |
| Chave pública | Verifica assinaturas ou cifra dados para o par privado | Pode ser exportada e distribuída |
| Chave de assinatura do Secure Boot | Assina o bootloader e as imagens de firmware | A privada fica com quem assina; o ESP32-S3 verifica com a confiança provisionada no eFuse |
O nome MKEK aparece em inglês como Master Key Encryption Key. O nome DKEK significa Device Key Encryption Key. Apesar de ambas ajudarem a proteger material criptográfico, elas têm papéis diferentes.
Como o armazenamento do Pico HSM funciona
De forma bem simplificada, o HSM mantém os objetos criptográficos na memória flash, mas em formato criptografado. A MKEK é a chave mestra usada para proteger essas chaves. No fluxo do Pico HSM, o PIN participa da autorização e da proteção que permite ao firmware usar a MKEK e as chaves.
Em placas como ESP32-S3 e RP2350/RP2354, o firmware pode usar recursos OTP/eFuse para ancorar material sensível e oferecer uma proteção de hardware mais forte. O papel exato de cada campo depende da placa, do firmware e da configuração habilitada.
Durante uma operação criptográfica, o firmware autoriza a sessão, obtém o material necessário para usar a chave e executa a operação no dispositivo. A chave privada pode passar pela RAM do microcontrolador durante o processamento, mas a interface normal entrega ao computador o resultado (como uma assinatura) e não a chave privada em claro.
PIN do usuário e SO PIN
O PIN do usuário é usado para autorizar operações com chaves privadas e secretas, já o SO PIN (Security Officer PIN) tem uma função administrativa, como certas ações de recuperação ou gerenciamento. Como recomendação, não use o mesmo PIN para ambos. Os limites de tentativas e as consequências de exceder dependem da inicialização e da versão do firmware.
O que fica na flash e o que fica no OTP/eFuse
Na flash ficam os objetos do HSM (como chaves, certificados e outros dados) de forma criptografada. No OTP/eFuse podem ficar segredos internos ou configurações de segurança associadas ao hardware. O digest da chave pública de Secure Boot, quando habilitado, é outro dado de eFuse com outra finalidade.
Chaves públicas e privadas
Algoritmos assimétricos, como RSA e ECDSA, usam um par relacionado:
- Chave privada: fica protegida no HSM e é usada para assinar ou descriptografar.
- Chave pública: pode ser compartilhada e é usada para verificar a assinatura ou criptografar dados destinados à chave privada.
Ao assinar um documento, o HSM usa a chave privada e devolve uma assinatura. Quem recebe o documento usa a chave pública para verificar que a assinatura corresponde aos dados e à chave privada associada. A chave pública não permite reconstruir a privada quando o algoritmo e o tamanho são adequados.
O Pico HSM também suporta outros tipos de material, como: AES para criptografia simétrica, HMAC e CMAC para autenticação de mensagens, ECDSA e EdDSA para assinaturas, ECDH/X25519/X448 para acordo de chaves e KDFs para derivar chaves.
RSA e tamanho em bits
Em RSA, o tamanho da chave (como 2048 ou 3072 bits) é usado para representar o tamanho do módulo usado pelo par de chaves, mas isso não significa que ela tenha o mesmo número de bits de segurança. Por exemplo, uma chave RSA de 3072 bits oferece aproximadamente 128 bits de segurança, conforme as tabelas de referência do NIST.
| Tamanho RSA | Leitura prática |
|---|---|
| 1024 bits | Legado. Evite para chaves novas. |
| 2048 bits | Cerca de 112 bits de força; ainda aparece em sistemas existentes, mas oferece menos margem para uma chave de longa duração. |
| 3072 bits | Cerca de 128 bits de força; é o tamanho requerido pelo Secure Boot v2 RSA do ESP32-S3. |
| 4096 bits | Módulo maior, com custo de geração e operação maior. Não é necessário para o Secure Boot v2 do ESP32-S3. |
O Pico HSM anuncia geração RSA de 1024 a 4096 bits. Para o projeto de assinatura de firmware no ESP32-S3, devemos usar RSA-3072, já que ele é o formato esperado pelo Secure Boot v2.
RSA-PSS e RSA-PKCS#1 v1.5
O RSA é o algoritmo criptográfico, enquanto o esquema de assinatura define como a assinatura será gerada e validada. Existem diferentes esquemas que podem ser usados com RSA:
- RSA-PSS: esquema de assinatura mais moderno, que usa parâmetros específicos para gerar e validar assinaturas. É o esquema usado pelo Secure Boot v2 do ESP32-S3.
- RSA-PKCS#1 v1.5: esquema de assinatura mais antigo, mas ainda bastante usado, principalmente por questões de compatibilidade.
- RSA-OAEP: diferente dos anteriores, é usado para cifrar dados, não para gerar assinaturas digitais.
No ESP32-S3, o Secure Boot v2 usa RSA-3072 com RSA-PSS e SHA-256, seguindo os parâmetros exigidos pelo formato da imagem. Isso significa que não basta usar uma chave RSA de 3072 bits. O HSM ou a ferramenta responsável pela assinatura também precisa usar o esquema RSA-PSS com os parâmetros esperados pelo ESP32-S3, caso contrário, a assinatura não será validada pelo Secure Boot.
Credenciais FIDO usando ykman
Para listar:
$ ykman fido credentials list
WARNING: PC/SC not available. Smart card (CCID) protocols will not function.
ERROR: Unable to list devices for connection
Enter your PIN:
Credential ID RP ID Username Display name
3c99f2caf1d00206000009... www.token2.com token2_user_369d11ac token2_user_369d11ac
3c99f2caf1d0020600003f... www.token2.com user_3f7488a6 user_3f7488a6
3c99f2caf1d0020600006a... www.token2.com token2_user_f85f6dd8
3c99f2caf1d00206000057... www.token2.com user_2b9e7720
3c99f2caf1d002060000c1... www.token2.com user_319904ca
3c99f2caf1d00206000026... www.token2.com user_fddcbdaf
3c99f2caf1d0020600000b... www.token2.com user_c2e21ab5 user_c2e21ab5
3c99f2caf1d00206000056... www.token2.com user_f6581068
Para deletar:
$ ykman fido credentials delete 3c99f2caf1d00206000009
WARNING: PC/SC not available. Smart card (CCID) protocols will not function.
ERROR: Unable to list devices for connection
Enter your PIN:
Delete www.token2.com token2_user_369d11ac token2_user_369d11ac (3c99f2caf1d002060000099b23d43f7b27668b5837891b8c339f62e2559909ce674a94f7e65b7100662e)? [y/N]: y
Deleting credential, DO NOT REMOVE YOUR YUBIKEY!
Credential deleted.
Resetar PIN com ykman
Vamos trocar o PIN usando o ykman:
$ ykman fido access change-pin
WARNING: PC/SC not available. Smart card (CCID) protocols will not function.
ERROR: Unable to list devices for connection
Enter your current PIN:
Enter your new PIN:
Repeat for confirmation:
FIDO PIN updated.