Skip to content

v0.2.0

Choose a tag to compare

@github-actions github-actions released this 08 Sep 12:18
· 57 commits to main since this release
v0.2.0
f0dfcd4

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.