You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This commit was created on GitHub.com and signed with GitHub’s verified signature.
Adicionado
O módulo PKCS#11 anuncia CKF_ENCRYPT em CKM_RSA_PKCS e cifra com a
chave pública (issue #10). O PJeOffice não autenticava no Linux: o
signer4j precisa de RSA cru pela JCA, e a única porta é o Cipher.RSA/ECB/PKCS1Padding do SunPKCS11, que desde o JDK-8176837 só é
registrado se o mecanismo anunciar CKF_ENCRYPT. Com a chave privada em ENCRYPT_MODE o Java faz C_SignInit + C_Sign, que já existiam; o que
faltava era o anúncio. C_EncryptInit/C_Encrypt passam a existir de
verdade, só com a chave pública (a privada recebe CKR_KEY_FUNCTION_NOT_PERMITTED), sem socket e sem PIN. É uma divergência
deliberada do módulo oficial, que é sign-only. A prova em Java
(tools/prova-jca-pkcs11/ProvaCipher.java) entra no gate de integração.
Modo cru no caminho de produção (issue #11). A sondagem ao vivo de
05/09/2026 provou que o requestHashSessionSignature com algorithm: ""
só aplica o padding PKCS#1 v1.5 ao bloco enviado. O CKM_RSA_PKCS do
módulo passa a mandar o bloco inteiro nesse modo, seja qual for o hash
dentro dele; o verbo sign do socket ganha o campo algoritmo (opcional,
padrão SHA256); o motor e o daemon recebem um Algoritmo tipado, com a
regra de tamanho num lugar só. É o que faz o DigestInfo(MD5) do PjeAuthenticatorTask chegar assinado ao PJeOffice. O mock imita o
servidor medido, inclusive a forma exata da recusa.
O diag registra quem pediu cada assinatura. Evento assinatura.pedido
com hospedeiro (o comm do processo que chamou o C_Sign: papers, firefox, java), algoritmo e bloco_bytes. É a linha que responde,
num relatório de bug, qual app disparou a assinatura.
Alterado
CKM_RSA_PKCS deixa de reconhecer DigestInfo. Antes, em produção, o
módulo desmontava um DigestInfo(SHA-256) de 51 bytes para mandar só o hash,
aceitava 32 bytes crus como se fossem o hash (e o servidor os embrulhava em
DigestInfo), e recusava qualquer outro tamanho com CKR_DATA_LEN_RANGE.
Agora o bloco vai como está, de 1 a 245 bytes, e recebe só o padding, que é
o que a especificação define e o módulo oficial faz. Quem quer DigestInfo
manda DigestInfo (poppler, NSS, OpenSSL e o SunPKCS11 já mandam); a
assinatura desses continua byte a byte a mesma.
Corrigido
C_SignInit com sessão inexistente devolve CKR_SESSION_HANDLE_INVALID,
e não um pânico convertido em CKR_GENERAL_ERROR.
Interno
O remoteid-mock aceita uma carteira de fora, por REMOTEID_MOCK_FIXTURES=<dir> (cert.der, key.pem, keyname.txt). Serve
para rodar contra um certificado com a forma e o conteúdo de um real, que a
fixture sintética não reproduz (as extensões otherName da ICP-Brasil, os
vários OUs, os acentos no DN) e que não pode ser versionado, porque
identifica uma pessoa. Sem a variável nada muda; com ela apontando para um
diretório imprestável o mock morre, em vez de cair de volta na fixture
embutida e exibir outra identidade.
Testes de mutação (cargo mutants, 327 mutantes em 8 crates) fecharam os
buracos que importavam: o guarda do retry silencioso com cache válido (um bug
ali gastaria um OTP por recusa), o braço CKM_SHA256_RSA_PKCS de preparar_bloco, os handles de sessão do módulo, e o cliente do socket, que
só o gate ponta a ponta exercita.
O passo da cifra no gate de integração exige OpenSC 0.26+ e é pulado onde
a ferramenta é mais velha. O pkcs11-tool do Ubuntu 24.04 (0.25) procura uma
chave secreta e falha antes de chamar o módulo, o que deixava o CI vermelho
por causa da ferramenta. A cobertura fica com o -M, com a prova em Java e
com os testes de ABI.