Skip to content

licensing: emissor de licença de dev (issue_dev_license_jwt.py) não emite ML-DSA — quebra o Maestro quando o híbrido for obrigatório #2043

Closed

Description

@FabioLeitao

Contexto

Canon: licença híbrida Ed25519 + ML-DSA-65 obrigatória em todo o roster (ver issue irmã sobre âncora e guard.py). Quando o verificador passar a exigir dbmldsa_sig, todo token emitido sem ele deixa de valer.

O que existe hoje

scripts/issue_dev_license_jwt.py emite licença de dev de vida curta para o modo enforced e não referencia mldsa, dbmldsa_sig nem ml-dsa (verificado via gh api em DataBoar/data-boar@main, 2026-10-05). O Maestro depende dele: handlers/Handle-LicensingMatrix.ps1 (repo DataBoar/maestro) chama esse script.

Hoje isso funciona porque o híbrido é opcional no verify. Com o híbrido obrigatório, o Maestro e qualquer fluxo que use esse emissor passam a receber licença recusada.

Esperado

  • O emissor de dev gera dbmldsa_sig válido sob o payload canônico, assinado com uma chave ML-DSA de dev, nunca a golden. Isso exige uma âncora de teste equivalente, que só pode existir em build de teste (como o -tags licensetest do kp-license-check).
  • A chave privada de dev não entra no repositório.
  • Teste que prova que o token de dev passa no caminho híbrido obrigatório e que o mesmo token sem a claim é recusado.

Critérios de aceite

  • Token de dev verifica pelo mesmo caminho híbrido de produção, com âncora de teste isolada.
  • Nenhuma chave privada, nem de dev, commitada.
  • A matriz de licenciamento do Maestro continua verde com o híbrido obrigatório.

Relacionado

Issue irmã #2042 (âncora ML-DSA + híbrido obrigatório no guard.py); épico #1462.

Activity

  1. FabioLeitao commented on Oct 20, 2026

    @FabioLeitao
    CollaboratorAuthor

    Atualização de escopo (auditoria, tom recomendatório) — verificado contra origin/main @ 9fdd2434, 2026-10-19.

    Continua valendo: scripts/issue_dev_license_jwt.py não referencia mldsa/dbmldsa_sig. A âncora de produção já está vendorizada (#2075) e a claim inválida já falha fechada (#2002), então o que falta é o lado emissor + o fim do modo opcional (#2042).

    Recomendações:

    1. O emissor de dev passa a emitir dbmldsa_sig válido sobre o payload canônico, assinado com chave ML-DSA de dev, nunca a golden.
    2. A âncora de teste correspondente existe só em build/ambiente de teste, sem virar override de chave crua em produção (ver security(licensing): cross-signed key rotation, no raw key override #1994). Nenhuma chave privada, nem de dev, no repositório (gerar em runtime ou fora do repo).
    3. Testes: o token de dev passa no caminho híbrido obrigatório; o mesmo token sem a claim é recusado.
    4. Conferir Handle-LicensingMatrix.ps1 no DataBoar/maestro com o híbrido obrigatório: a matriz precisa continuar verde. Ordem segura: emissor de dev + âncora de teste antes (ou junto) de tornar o híbrido obrigatório (licensing: âncora ML-DSA embutida ausente e híbrido ainda opcional no guard (canon: Ed25519 + ML-DSA obrigatório) #2042).
    5. Marco sugerido v1.8.0, junto com licensing: âncora ML-DSA embutida ausente e híbrido ainda opcional no guard (canon: Ed25519 + ML-DSA obrigatório) #2042; quantas PRs é decisão do operador.

    Rodapé: comentário gerado por Claude (auditor RO), sem alteração de código.

  2. FabioLeitao commented on Oct 20, 2026

    @FabioLeitao
    CollaboratorAuthor

    Resolvida pela PR #2114 (merge 87f1fe0). Commit 98b6ad8: o emissor de DEV assina dbmldsa_sig. Teste: test_dev_token_without_claim_is_rejected em tests/test_issue_dev_license_qa.py.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions