Перейти к содержимому
ecdsa.com
C · Командная строка

LibreSSL

LibreSSL от OpenBSD — форк OpenSSL 2014 года, который используют OpenBSD и системные инструменты macOS: тот же ECDSA в DER и те же форматы ключей, Ed25519, но без Ed448, ML-KEM через собственный API, без ML-DSA и без RFC 6979.
Лицензия
OpenSSL AND ISC
Проверенная версия
4.3.1 ·
Исходный код
github.com/libressl/portable
Документация
man.openbsd.org/

Совместимость вкратце

ECDSAEdDSAПостквантовая криптография

Кривые ECDSA
P-224P-256P-384P-521secp256k1brainpoolP256r1brainpoolP384r1brainpoolP512r1
EdDSA
Ed25519
Форматы закрытых ключей
pkcs8-pempkcs8-derencrypted-pkcs8sec1-pemsec1-der

LibreSSL сохраняет привычный API libcrypto/libssl и интерфейс командной строки OpenSSL, но избавляется от устаревшего кода и добавляет собственную библиотеку libtls. В macOS более старая версия LibreSSL поставляется как системная криптографическая библиотека: в macOS 27.0.1 команда /usr/bin/openssl version вывела LibreSSL 3.3.6, а ssh -V назвала ту же библиотеку. Факты на этой странице проверены на пакете Alpine 3.24.2 с LibreSSL 4.3.1 (сам проект к тому времени выпустил 4.3.3), где команда установлена под именем libressl, поэтому скрипты, которые вызывают openssl, там завершаются ошибкой, если не добавить пакет совместимости.

ECDSA ведёт себя как OpenSSL с настройками по умолчанию: подписи в DER, случайные nonce, никакой нормализации low-S и проверка, которая принимает high-S. В отличие от OpenSSL 3.2+, детерминированного варианта по RFC 6979 нет. EVP_DigestVerify вернула -1 для подписи raw r‖s, а утилита командной строки вывела для неё Error Verifying Data, тогда как для верной подписи других данных — Verification Failure; обратите внимание: регистр букв здесь не такой, как в сообщениях OpenSSL, и скрипты, которые ищут через grep точный текст, из-за этого ломаются.

Поддерживаются кривые от P-224 до P-521, secp256k1 и кривые Brainpool r1; Ed25519 работает через EVP_PKEY_ED25519, а Ed448 нет вовсе. Файлы ключей совместимы с OpenSSL: SPKI и сертификаты для открытых ключей, PKCS#8 (обычный и зашифрованный) и SEC1 для закрытых ключей; ecparam -genkey записывает SEC1 EC PRIVATE KEY, поэтому, если другому инструменту нужен PKCS#8, преобразуйте ключ командой pkcs8 -topk8, как это делает пример.

Поддержка постквантовых алгоритмов частичная: ML-KEM-768 и ML-KEM-1024 доступны через собственные функции LibreSSL MLKEM_* из <openssl/mlkem.h>, но не через EVP и не из командной строки, а ML-DSA нет совсем (Algorithm ML-DSA-65 not found). Сравните алгоритмы в песочнице постквантовых KEM; для подписей ML-DSA используйте OpenSSL 3.5 или новее.

Факты и проверки, на которых они основаны

Ничего из приведённого ниже не скопировано из документации. 20 октября 2026 г. проверка content/libraries/verify/libressl/run.sh запустила LibreSSL 4.3.1 в образе контейнера alpine:3.24.2; содержимое страницы должно совпадать с выводом проверки, а у каждого факта приведены соответствующие строки вывода.

  • Кодировка подписи ECDSA

    der

    EVP_DigestSign и libressl dgst -sign выдают ASN.1 DER.

    Что записала проверка
    fact ecdsa-signature-encoding = der
  • Nonce в ECDSA

    random

    Случайный nonce: две подписи одного сообщения различаются; детерминированного варианта нет.

    Что записала проверка
    fact ecdsa-nonce = random
  • Low-S при подписи

    either

    s не нормализуется: среди 64 подписей встретились значения high-S.

    Что записала проверка
    fact ecdsa-low-s-sign = either
  • High-S при проверке

    accepts-high-s

    Подпись в DER, в которой s заменили на n − s, прошла проверку.

    Что записала проверка
    fact ecdsa-low-s-verify = accepts-high-s
  • Что хеширует вызов подписи

    hashes-message-or-digest

    EVP_DigestSign хеширует данные; ECDSA_sign подписывает дайджест, и такая подпись прошла проверку по сообщению.

    Что записала проверка
    fact ecdsa-prehash = hashes-message-or-digest
  • Некорректная подпись ECDSA

    returns-error

    EVP_DigestVerify вернула -1 для подписи raw r‖s и для 3-байтового фрагмента данных.

    Что записала проверка
    fact ecdsa-malformed-signature = returns-error
    evidence ecdsa-malformed-signature: EVP_DigestVerify returned -1 for raw r||s and -1 for 3 bytes
  • Вывод проверки при ошибке

    distinguishable

    Команда dgst -verify вывела Error Verifying Data для подписи не в формате DER и Verification Failure для верной подписи других данных.

    Что записала проверка
    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
  • Кривые ECDSA

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

    Подпись и проверка работают на P-224, P-256, P-384, P-521, secp256k1 и brainpoolP256r1/P384r1/P512r1.

    Что записала проверка
    fact ecdsa-curves = P-224, P-256, P-384, P-521, secp256k1, brainpoolP256r1, brainpoolP384r1, brainpoolP512r1
  • EdDSA

    Ed25519

    Ed25519 через EVP_PKEY_ED25519; EVP_PKEY_ED448 не определён.

    Что записала проверка
    fact eddsa = Ed25519
    evidence eddsa: EVP_PKEY_ED448 is not defined in the headers
  • Постквантовые алгоритмы

    ML-KEM

    ML-KEM-768 и ML-KEM-1024 прошли полный цикл через API MLKEM_*; команда genpkey -algorithm ML-DSA-65 завершилась ошибкой Algorithm ML-DSA-65 not found.

    Что записала проверка
    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
  • Форматы открытых ключей

    spki-pemspki-derx509

    Одна и та же подпись прошла проверку открытыми ключами SPKI в PEM и DER и открытым ключом из сертификата.

    Что записала проверка
    fact public-key-formats = spki-pem, spki-der, x509
  • Форматы закрытых ключей

    pkcs8-pempkcs8-derencrypted-pkcs8sec1-pemsec1-der

    Подпись работает с ключами PKCS#8 в PEM и DER, с зашифрованным PKCS#8 и с SEC1 в PEM и DER; ecparam -genkey записывает SEC1.

    Что записала проверка
    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-----

Использование

Создайте ключ P-256 командой libressl, преобразуйте его в PKCS#8, подпишите данные и проверьте подпись, а затем убедитесь, что Ed25519 работает, а ML-DSA нет.
# 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"

Тестовый стенд для фрагментов кода запускает каждый пример без изменений в образе контейнера alpine:3.24.2, и запуск завершается ошибкой, если вывод не совпадает.

Подготовка
apk add --no-cache -q libressl=4.3.1-r0 >/dev/null
Команда
OPENSSL_CONF=/dev/null sh usage.sh
Вывод должен совпадать (регулярное выражение)
Verified OK\nEd25519 key: -----BEGIN PRIVATE KEY-----\nAlgorithm ML-DSA-65 not found

Библиотеки