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
Texto PEM passado como bytes
comum`include_bytes!("key.pem")` ou `fs::read("key.pem")` entregam o texto PEM. O ring precisa do DER que está dentro dele, já decodificado do base64.
SEC 1 ou PKCS#1 em vez de PKCS#8
comumArquivos `EC PRIVATE KEY` e `RSA PRIVATE KEY` têm outras estruturas. No ring, os pares de chaves ECDSA e Ed25519 só podem ser carregados de PKCS#8.
Uma chave de outro algoritmo ou de outra curva
ocasionalUma chave P-384 carregada com o algoritmo de assinatura P-256, ou uma chave ECDSA passada a `Ed25519KeyPair`, gera `WrongAlgorithm`.
Como corrigir
- 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.
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