ring предлагает короткий список алгоритмов с ассемблерным кодом, унаследованным от BoringSSL, и API, устойчивый к неправильному использованию: в нём нельзя выбрать nonce, подписать заранее вычисленный дайджест или загрузить ключ в необычном формате. Поэтому библиотека быстрая и её трудно применить неправильно, а основная работа уходит на преобразование ключей и подписей из других стеков.
Кодировка входит в алгоритм: ECDSA_P256_SHA256_FIXED_SIGNING создаёт 64-байтовую подпись raw r‖s, а ECDSA_P256_SHA256_ASN1_SIGNING — DER, и для проверки есть соответствующие константы _FIXED и _ASN1. Подпись, которую проверяют с другой константой, просто не проходит проверку с ошибкой Unspecified, поэтому подпись JWS, проверенная с константой ASN1, или подпись OpenSSL, проверенная с FIXED, выглядит точно так же, как подделка. Пример показывает оба результата. При подписи используется случайный nonce, s не нормализуется, а проверка принимает s из обеих половин диапазона.
Закрытые ключи читаются только в формате PKCS#8 DER, а ключи Ed25519 должны быть в PKCS#8 v2 с открытым ключом внутри: метод Ed25519KeyPair::from_pkcs8 отклонил 48-байтовую форму v1 (её записывают OpenSSL и большинство инструментов) с ошибкой VersionNotSupported, тогда как from_pkcs8_maybe_unchecked и from_seed_unchecked её приняли. Закрытые ключи PEM, SEC1 и JWK сначала нужно преобразовать, например в конвертере JWK. Открытые ключи — это точки SEC1 без обёртки: public_key() возвращает 65-байтовую несжатую форму, а сжатые точки не принимаются.
Список кривых ограничен P-256 и P-384, плюс Ed25519; P-521, secp256k1 и постквантовых алгоритмов нет. Проекты, которым они нужны или нужна сертификация FIPS, переходят на aws-lc-rs с API, совместимым с ring.
Чтобы узнать, в какой кодировке подпись из ring, вставьте её в конвертер DER ⇄ raw.