Saltar al contenido
ecdsa.com
ring (Rust crate)Rust

Mensaje de error

KeyRejected("InvalidEncoding")

También se muestra como

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

La cadena del motivo varía: `InvalidEncoding`, `WrongAlgorithm`, `InconsistentComponents`, `TooSmall`… `Display` solo imprime el motivo, por ejemplo, `InvalidEncoding`.

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

Qué significa

ring rechazó los bytes de la clave privada. ring acepta exactamente una codificación por tipo de clave —PKCS#8 codificado en DER (v1 o v2) para ECDSA y Ed25519 y, para RSA, también PKCS#1 DER mediante `from_der`— y solo indica un motivo breve: `InvalidEncoding` cuando los bytes no tienen esa estructura y `WrongAlgorithm` cuando son un documento PKCS#8 válido de otro algoritmo o curva. ring nunca analiza PEM por sí mismo.

Por qué ocurre

Cómo solucionarlo

  1. 1.

    Decodificar el PEM y comprobar su etiqueta

    Usa un analizador de PEM, exige la etiqueta `PRIVATE KEY` y pasa a ring el contenido decodificado.

    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.

    Convertir los archivos de clave heredados a PKCS#8 DER

    OpenSSL convierte las claves privadas SEC 1 y PKCS#1 a PKCS#8; `-outform DER` escribe exactamente los bytes que espera ring.

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

Errores relacionados

Explorar toda la base de datos de errores de firma