Skip to content

licensing: âncora ML-DSA embutida ausente e híbrido ainda opcional no guard (canon: Ed25519 + ML-DSA obrigatório) #2042

Description

@FabioLeitao

Contexto

Canon do operador (repetido várias vezes): a licença do Boar e de todo o roster bestial é híbrida Ed25519 + ML-DSA-65, obrigatória — é o modo mínimo de licença, não uma opção. Em 2026-10-05 um levantamento dos verificadores mostrou onde o data-boar ainda não cumpre isso. Estado verificado via gh api em DataBoar/data-boar@main, não pelo clone local.

O que existe hoje

  1. Âncora ML-DSA ausente. core/licensing/ traz só license-pub-v1.pem (Ed25519). guard.py carrega a âncora por trust_anchor.load_embedded_mldsa_anchor_pem(), que não tem arquivo para ler. Os consumidores irmãos já documentam essa espera: faithful-ferret (trust_anchor.clj: "data-boar main does not ship license-mldsa-pub-v1.pem") e sage-remora (trust_anchor.clj, mesma frase). O resultado nos dois foi um verificador que recusava ou degradava, até que cada um vendorizou a chave por conta própria.
  2. Híbrido opcional no verify/guard. core/licensing/guard.py::_token_has_mldsa_claim diz no docstring: "only an absent key selects Ed25519-only verification". Token sem dbmldsa_sig verifica só com Ed25519. verify.py descreve o claim como "Optional hybrid PQC claim".

Âncora canônica (já em uso)

  • ~/.keys/data-boar/golden-mldsa.pub = keen-platypus/go/kp-license-check/trust/golden-mldsa.pub, sha256 37faef8ff167cf01a0fc6a2bc8b7cfcac6bfe5651360051b1eb00a0a60fa85b8.
  • Cadeia verificada em 2026-10-05 com kp-license-check -verify-cross-sign: OK Ed25519 signs ML-DSA-65 pubkey e OK ML-DSA-65 signs Ed25519 pubkey (PKIX DER).
  • O kp-license-check já é obrigatório (verifyTokenHybridRequired). O sage-remora está na branch fix/hybrid-license-required (commit d474be2, sem push) e o faithful-ferret recebe a mesma correção.

Escopo proposto (cada item é um commit)

  • Vendorizar core/licensing/license-mldsa-pub-v1.pem = a chave canônica acima, com teste que fixa o sha256.
  • dbmldsa_sig ausente deixa de selecionar Ed25519-only: token sem a claim é inválido. null, vazio e não-string já falham fechado.
  • Âncora ausente = falha fechada, sem cair para Ed25519.
  • Atualizar docs e docstrings que descrevem o híbrido como opcional.

Cuidado de compatibilidade

Tornar o híbrido obrigatório rejeita licenças emitidas só com Ed25519 (por exemplo os .lic curtos antigos). O release 1.7.4 GA já saiu com o híbrido opcional, então isso é mudança de comportamento para 1.8.x. Precisa de nota no CHANGELOG e de um caminho de reemissão. O emissor de dev tem issue própria (ver "Relacionado").

Fora de escopo

Rotação de chave. O contrato de rotação (attestation assinada pelas duas âncoras) já existe e não muda.

Relacionado

Épico #1462 (crypto agility + hybrid PQC). KP#375 (Remora recusava o JWT híbrido por falta da âncora). Emissor de dev sem ML-DSA: issue irmã.

Verifique antes de implementar: gh api repos/DataBoar/data-boar/contents/core/licensing/guard.py (as linhas citadas acima) — não confiar no clone local.

Activity

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