Saltar al contenido
ecdsa.com
C · Línea de comandos

LibreSSL

LibreSSL de OpenBSD, el fork de OpenSSL de 2014 que usan OpenBSD y las herramientas del sistema de macOS: las mismas firmas ECDSA DER y los mismos formatos de clave, Ed25519 pero no Ed448, ML-KEM con una API propia, sin ML-DSA y sin RFC 6979.
Licencia
OpenSSL AND ISC
Versión comprobada
4.3.1 ·
Código fuente
github.com/libressl/portable
Documentación
man.openbsd.org/

Compatibilidad de un vistazo

ECDSAEdDSACriptografía poscuántica

Curvas ECDSA
P-224P-256P-384P-521secp256k1brainpoolP256r1brainpoolP384r1brainpoolP512r1
EdDSA
Ed25519
Formatos de clave pública
spki-pemspki-derx509
Formatos de clave privada
pkcs8-pempkcs8-derencrypted-pkcs8sec1-pemsec1-der

LibreSSL conserva la conocida API libcrypto/libssl de OpenSSL y su línea de comandos, pero elimina código heredado y añade su propia libtls. macOS incluye una versión antigua de LibreSSL como criptografía del sistema: en macOS 27.0.1, /usr/bin/openssl version imprimió LibreSSL 3.3.6 y ssh -V indicó la misma biblioteca. Los datos de esta página se comprobaron con el paquete de Alpine 3.24.2, LibreSSL 4.3.1 (la última versión del proyecto ya era la 4.3.3), donde el comando se instala como libressl: los scripts que llaman a openssl fallan allí salvo que se añada el paquete de compatibilidad.

ECDSA se comporta como OpenSSL con sus valores predeterminados: firmas DER, nonces aleatorios, sin normalización low-S y una verificación que acepta high-S. A diferencia de OpenSSL 3.2+, no hay opción determinista RFC 6979. EVP_DigestVerify devolvió -1 con una firma r‖s en bruto, y la línea de comandos imprimió Error Verifying Data para ella frente a Verification Failure para una firma válida sobre otros datos; fíjate en que las mayúsculas no coinciden con las de los mensajes de OpenSSL, lo que rompe los scripts que buscan el texto exacto con grep.

Las curvas abarcan de P-224 a P-521, secp256k1 y las curvas Brainpool r1; Ed25519 funciona mediante EVP_PKEY_ED25519, y Ed448 no existe en absoluto. Los archivos de clave son interoperables con OpenSSL: SPKI y certificados para las claves públicas, PKCS#8 (sin cifrar y cifrado) y SEC1 para las claves privadas; ecparam -genkey escribe SEC1 EC PRIVATE KEY, así que convierte la clave con pkcs8 -topk8 cuando otra herramienta espere PKCS#8, como hace el ejemplo.

La compatibilidad poscuántica es parcial: ML-KEM-768 y ML-KEM-1024 están disponibles mediante las funciones MLKEM_* propias de LibreSSL en <openssl/mlkem.h>, no a través de EVP ni de la línea de comandos, y ML-DSA no existe (Algorithm ML-DSA-65 not found). Compara los algoritmos en el laboratorio de KEM poscuánticos; para firmas con ML-DSA, usa OpenSSL 3.5 o posterior.

Datos y las comprobaciones que los respaldan

Nada de lo que sigue está copiado de la documentación. La comprobación content/libraries/verify/libressl/run.sh ejecutó LibreSSL 4.3.1 en la imagen de contenedor alpine:3.24.2 el 20 de octubre de 2026; la página debe coincidir con lo que imprimió, y cada dato cita esas líneas.

  • Codificación de la firma ECDSA

    der

    EVP_DigestSign y libressl dgst -sign producen DER ASN.1.

    Registrado por la comprobación
    fact ecdsa-signature-encoding = der
  • Nonce de ECDSA

    random

    Nonce aleatorio: dos firmas del mismo mensaje son distintas; no hay opción determinista.

    Registrado por la comprobación
    fact ecdsa-nonce = random
  • Low-S al firmar

    either

    s no se normaliza: aparecieron valores high-S entre 64 firmas.

    Registrado por la comprobación
    fact ecdsa-low-s-sign = either
  • High-S al verificar

    accepts-high-s

    Se verificó una firma DER con s sustituido por n − s.

    Registrado por la comprobación
    fact ecdsa-low-s-verify = accepts-high-s
  • De qué calcula el hash la llamada de firma

    hashes-message-or-digest

    EVP_DigestSign calcula el hash; ECDSA_sign firma un resumen, y esa firma se verificó contra el mensaje.

    Registrado por la comprobación
    fact ecdsa-prehash = hashes-message-or-digest
  • Firma ECDSA mal formada

    returns-error

    EVP_DigestVerify devolvió -1 con una firma r‖s en bruto y con un blob de 3 bytes.

    Registrado por la comprobación
    fact ecdsa-malformed-signature = returns-error
    evidence ecdsa-malformed-signature: EVP_DigestVerify returned -1 for raw r||s and -1 for 3 bytes
  • Salida de la verificación en caso de fallo

    distinguishable

    dgst -verify imprimió Error Verifying Data para una firma que no es DER y Verification Failure para una firma válida sobre otros datos.

    Registrado por la comprobación
    fact cli-verify-output = distinguishable
    evidence cli-verify-output: valid: Verified OK; 64 zero bytes: Error Verifying Data; valid signature over other data: Verification Failure
  • Curvas ECDSA

    P-224P-256P-384P-521secp256k1brainpoolP256r1brainpoolP384r1brainpoolP512r1

    Con P-224, P-256, P-384, P-521, secp256k1 y brainpoolP256r1/P384r1/P512r1 se firmó y se verificó.

    Registrado por la comprobación
    fact ecdsa-curves = P-224, P-256, P-384, P-521, secp256k1, brainpoolP256r1, brainpoolP384r1, brainpoolP512r1
  • EdDSA

    Ed25519

    Ed25519 mediante EVP_PKEY_ED25519; EVP_PKEY_ED448 no está definido.

    Registrado por la comprobación
    fact eddsa = Ed25519
    evidence eddsa: EVP_PKEY_ED448 is not defined in the headers
  • Algoritmos poscuánticos

    ML-KEM

    ML-KEM-768 y ML-KEM-1024 superaron la prueba de ida y vuelta con la API MLKEM_*; genpkey -algorithm ML-DSA-65 falló con Algorithm ML-DSA-65 not found.

    Registrado por la comprobación
    fact pqc = ML-KEM
    evidence pqc: ML-KEM rank 3: public key 1184 bytes, ciphertext 1088 bytes, round trip ok
    evidence pqc: ML-KEM rank 4: public key 1568 bytes, ciphertext 1568 bytes, round trip ok
    evidence pqc: genpkey -algorithm ML-DSA-65: Algorithm ML-DSA-65 not found
    evidence pqc: ML-KEM names in s_client help: none
  • Formatos de clave pública

    spki-pemspki-derx509

    Las claves públicas SPKI en PEM y en DER y las de los certificados verificaron la misma firma.

    Registrado por la comprobación
    fact public-key-formats = spki-pem, spki-der, x509
  • Formatos de clave privada

    pkcs8-pempkcs8-derencrypted-pkcs8sec1-pemsec1-der

    Con PKCS#8 en PEM y DER, PKCS#8 cifrado y SEC1 en PEM y DER se firmó en todos los casos; ecparam -genkey escribe SEC1.

    Registrado por la comprobación
    fact private-key-formats = pkcs8-pem, pkcs8-der, encrypted-pkcs8, sec1-pem, sec1-der
    evidence private-key-formats: genpkey -algorithm EC: works
    evidence private-key-formats: ecparam -genkey writes -----BEGIN EC PRIVATE KEY-----

Uso

Crea una clave P-256 con el comando libressl, conviértela a PKCS#8, firma y verifica, y muestra que Ed25519 funciona mientras que ML-DSA no.
# Alpine and some distributions install LibreSSL's tool as "libressl", not "openssl".
L=libressl
$L ecparam -name prime256v1 -genkey -noout -out key.pem   # SEC1 "EC PRIVATE KEY"
$L pkcs8 -topk8 -nocrypt -in key.pem -out key.p8.pem       # PKCS#8 for other tools
$L pkey -in key.pem -pubout -out pub.pem

printf 'order #1042 approved' > msg.txt
$L dgst -sha256 -sign key.p8.pem -out sig.der msg.txt
$L dgst -sha256 -verify pub.pem -signature sig.der msg.txt

# Ed25519 works; ML-DSA does not exist in LibreSSL.
$L genpkey -algorithm ED25519 -out ed.pem && echo "Ed25519 key: $(head -1 ed.pem)"
$L genpkey -algorithm ML-DSA-65 2>&1 | grep -i "not found"

El arnés de pruebas de fragmentos de código ejecuta cada ejemplo tal cual en la imagen de contenedor alpine:3.24.2, y la ejecución falla si la salida no coincide.

Configuración
apk add --no-cache -q libressl=4.3.1-r0 >/dev/null
Comando
OPENSSL_CONF=/dev/null sh usage.sh
La salida debe coincidir (expresión regular)
Verified OK\nEd25519 key: -----BEGIN PRIVATE KEY-----\nAlgorithm ML-DSA-65 not found

Bibliotecas