Pular para o conteúdo

Stdlib · extensões

crypto.pq

criptografia pós-quântica

extensions.md · 48 linhas · 1 min de leitura

Sub-namespace de crypto (não pacote separado), espelhando a forma do crypto atual. Os esquemas NIST padronizados: ML-KEM (Kyber, encapsulamento de chave) e ML-DSA (Dilithium, assinatura). Tier 1 (adição ao crypto), entra sem mexer no core.

fn pq.ml_kem_keypair() -> (public: [1184]byte, secret: [2400]byte) // ML-KEM-768 (nível 3)
fn pq.ml_kem_encapsulate(their_public: [1184]byte) -> (ciphertext: [1088]byte, shared: [32]byte)
fn pq.ml_kem_decapsulate(my_secret: [2400]byte, ciphertext: [1088]byte) -> Result[[32]byte, error{Invalid}]

(Tamanhos do nível 3, ML-KEM-768; os níveis 512/1024 seguem a mesma forma com arrays de outro tamanho.)

fn pq.ml_dsa_keypair() -> (public: [1952]byte, secret: [4032]byte) // ML-DSA-65
fn pq.ml_dsa_sign(secret: [4032]byte, message: []byte) -> [3309]byte
fn pq.ml_dsa_verify(public: [1952]byte, message: []byte, signature: [3309]byte) -> bool

A transição é híbrida (clássico + PQ): se um quebrar, o outro segura. Combina X25519 (do crypto) com ML-KEM num único segredo:

fn pq.hybrid_x25519_mlkem_keypair() -> (public: HybridPublic, secret: HybridSecret)
fn pq.hybrid_encapsulate(their_public: HybridPublic) -> (ciphertext: HybridCiphertext, shared: [32]byte)
fn pq.hybrid_decapsulate(my_secret: HybridSecret, ct: HybridCiphertext) -> Result[[32]byte, error{Invalid}]
decl HybridPublic { ... } decl HybridSecret { ... } decl HybridCiphertext { ... }
  • Sub-namespace, não pacote: é crypto com esquemas a mais; mesma forma (keypair/encapsulate/ sign/verify), mesmos buffers de tamanho fixo ([N]byte), mesma postura (falha de verificação é Result/bool, não panic).
  • Híbrido é o default recomendado na prosa: PQ puro existe, mas a transição madura combina com o clássico.
  • Só os NIST-padronizados (ML-KEM/ML-DSA); candidatos pré-padrão (Falcon/SPHINCS+) ficam de fora até padronizarem, como o resto do crypto.