Pular para o conteúdo
ecdsa.com
ring (Rust crate)Rust

Mensagem de erro

KeyRejected("InvalidEncoding")

Também aparece como

  • KeyRejected("WrongAlgorithm")
  • called `Result::unwrap()` on an `Err` value: KeyRejected("InvalidEncoding")

A string do motivo varia: `InvalidEncoding`, `WrongAlgorithm`, `InconsistentComponents`, `TooSmall`… `Display` imprime só o motivo, por exemplo, `InvalidEncoding`.

ring (Rust crate) — ring::error::KeyRejected from EcdsaKeyPair::from_pkcs8 / Ed25519KeyPair::from_pkcs8

O que significa

O ring recusou os bytes da chave privada. O ring aceita exatamente uma codificação por tipo de chave — PKCS#8 (v1 ou v2) em codificação DER para ECDSA e Ed25519 e, para RSA, também PKCS#1 DER via `from_der` — e informa só um motivo curto: `InvalidEncoding` quando os bytes não têm essa estrutura, `WrongAlgorithm` quando são um documento PKCS#8 válido para outro algoritmo ou outra curva. O ring nunca analisa PEM por conta própria.

Por que acontece

Como corrigir

  1. 1.

    Decodificar o PEM e conferir o rótulo

    Use um parser de PEM, exija o rótulo `PRIVATE KEY` e passe o conteúdo decodificado ao ring.

    rust
    // Cargo.toml: pem = "3"
    let pem = pem::parse(std::fs::read_to_string("key.pem")?)?;
    anyhow::ensure!(pem.tag() == "PRIVATE KEY", "expected PKCS#8, got {}", pem.tag());
    let key_pair = EcdsaKeyPair::from_pkcs8(&ECDSA_P256_SHA256_FIXED_SIGNING, pem.contents(), &rng)
        .map_err(|e| anyhow::anyhow!("key rejected: {e}"))?;
  2. 2.

    Converter arquivos de chave legados para PKCS#8 DER

    O OpenSSL converte chaves privadas SEC 1 e PKCS#1 para PKCS#8; `-outform DER` grava exatamente os bytes que o ring espera.

    bash
    openssl pkcs8 -topk8 -nocrypt -in ec-sec1.pem -outform DER -out key.pk8   # SEC 1 -> PKCS#8 DER

Erros relacionados

Ver toda a base de erros de assinatura