EdDSA и ограничения jsrsasign

Алгоритмы семейства EdDSA (Edwards-curve Digital Signature Algorithm), такие как Ed25519 и Ed448, представляют собой современные криптографические схемы цифровой подписи, отличающиеся высокой производительностью и устойчивостью к ряду атак, актуальных для ECDSA. Они широко используются в протоколах нового поколения, включая TLS 1.3, SSH и системы распределённых ключей.

Библиотека jsrsasign изначально разрабатывалась с акцентом на RSA и классические варианты ECDSA, поэтому поддержка EdDSA в ней имеет ряд особенностей и ограничений, которые необходимо учитывать при разработке.


Архитектура реализации

В jsrsasign EdDSA реализуется не как полноценная часть основного криптографического ядра, а как расширение поверх существующих механизмов работы с ключами и подписями. Это накладывает следующие ограничения:

  • Отсутствие полной интеграции с API класса KJUR.crypto.Signature
  • Ограниченная поддержка форматов ключей
  • Частичная совместимость с ASN.1 структурами

Для работы с EdDSA используются специализированные классы и утилиты, которые не всегда согласуются с общей архитектурой библиотеки.


Поддерживаемые алгоритмы

На практике в jsrsasign реализована поддержка:

  • Ed25519 — основная и наиболее стабильная реализация
  • Ed448 — либо отсутствует, либо реализована частично (в зависимости от версии)

При этом:

  • Нет универсального интерфейса для выбора EdDSA через строковые идентификаторы, как в случае "SHA256withRSA"
  • Используются отдельные методы и классы

Работа с ключами Ed25519

Генерация ключей

В jsrsasign отсутствует встроенный генератор Ed25519-ключей. Это означает:

  • Генерация должна происходить вне библиотеки
  • Импорт ключей осуществляется в уже готовом виде

Типичные форматы:

  • PEM (PKCS#8)
  • Raw (массив байтов)

Импорт ключа

var key = KEYUTIL.getKey(pemString);

Ограничения:

  • Не все PEM-заголовки корректно распознаются
  • Возможны ошибки при работе с нестандартными ASN.1 структурами

Подписание данных

Для Ed25519 используется специализированный интерфейс, а не стандартный Signature.

Пример:

var sig = new KJUR.crypto.EdDSA();
sig.init({ d: privateKeyHex });
sig.updateString("message");
var signature = sig.sign();

Особенности:

  • Нет указания хеш-функции — она встроена в алгоритм
  • Метод updateHex предпочтительнее для бинарных данных
  • Подпись возвращается в hex-формате

Проверка подписи

var verifier = new KJUR.crypto.EdDSA();
verifier.init({ xy: publicKeyHex });
verifier.updateString("message");
var isValid = verifier.verify(signatureHex);

Ключевые моменты:

  • Публичный ключ должен быть в формате xy
  • Ошибки формата не всегда явно сигнализируются
  • Проверка чувствительна к точному соответствию входных данных

Ограничения API

Отсутствие унификации

В отличие от RSA/ECDSA:

  • Нельзя использовать KJUR.crypto.Signature с "Ed25519"
  • Нет поддержки через стандартный интерфейс sign() / verify() с алгоритмами в строковом виде

Ограниченная документация

  • Официальная документация описывает EdDSA фрагментарно
  • Некоторые методы доступны только через исходный код

Ограничения форматов

ASN.1 и DER

Поддержка ASN.1 структур для EdDSA ограничена:

  • Не все OID корректно обрабатываются
  • Возможны ошибки при парсинге сертификатов с Ed25519

JWK

Работа с JSON Web Key:

  • Частично поддерживается
  • Требуется ручное преобразование полей (x, d)

Пример JWK:

{
  "kty": "OKP",
  "crv": "Ed25519",
  "x": "...",
  "d": "..."
}

jsrsasign может не распознать такой ключ без дополнительной обработки.


Ограничения безопасности

Отсутствие side-channel защиты

Реализация EdDSA в jsrsasign:

  • Не гарантирует защиту от атак по времени выполнения
  • Не оптимизирована для защищённых сред

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

  • Выполнение в браузере или Node.js ограничивает контроль над памятью
  • Возможны утечки через GC и сторонние скрипты

Производительность

Хотя Ed25519 в теории быстрее ECDSA:

  • Реализация на JavaScript нивелирует это преимущество
  • Производительность уступает нативным библиотекам (например, libsodium)

Факторы:

  • Отсутствие WebAssembly-оптимизации
  • Использование BigInteger вместо специализированных структур

Совместимость

С другими библиотеками

Проблемы совместимости возникают при:

  • Использовании разных форматов ключей
  • Различиях в кодировании подписи (raw vs DER)

Часто требуется:

  • Конвертация ключей
  • Нормализация подписи

С протоколами

  • TLS и SSH не используют jsrsasign напрямую
  • JWT с EdDSA поддерживается ограниченно

Поддержка JWT (EdDSA)

Алгоритм "EdDSA" используется в JWT:

var token = KJUR.jws.JWS.sign(
  "EdDSA",
  header,
  payload,
  privateKey
);

Ограничения:

  • Требуется корректный формат ключа
  • Не все версии jsrsasign поддерживают EdDSA в JWS

Типичные ошибки

Неверный формат ключа

  • Hex вместо Base64
  • Отсутствие правильной длины (32 байта для Ed25519)

Несоответствие данных

  • Разные кодировки строки (UTF-8 vs ASCII)
  • Использование updateString вместо updateHex

Ошибки при импорте

  • PEM с нестандартными заголовками
  • ASN.1 структуры, не поддерживаемые библиотекой

Обход ограничений

Использование внешних библиотек

Для генерации ключей и базовых операций:

  • tweetnacl
  • libsodium.js

Затем:

  • Импорт ключей в jsrsasign
  • Использование только для интеграции с JWS/JWT

Конвертация форматов

  • Base64 ↔︎ Hex
  • Raw ↔︎ PEM

Часто требуется ручная обработка:

var hex = b64tohex(base64Key);

Версионные особенности

Поддержка EdDSA зависит от версии jsrsasign:

  • Старые версии — отсутствует полностью
  • Средние версии — экспериментальная поддержка
  • Новые версии — частично стабильная реализация Ed25519

Рекомендуется:

  • Проверять changelog
  • Тестировать конкретные сценарии

Практические ограничения

  • Нельзя использовать EdDSA как drop-in замену ECDSA
  • Требуется отдельная логика обработки ключей
  • Ограничена интеграция с существующим API

Рекомендации по применению

  • Использование Ed25519 оправдано при необходимости современных алгоритмов подписи

  • Для production-систем предпочтительны нативные реализации

  • jsrsasign подходит для:

    • прототипирования
    • образовательных целей
    • работы с JWT при ограниченных требованиях

Сравнение с ECDSA в jsrsasign

Характеристика ECDSA EdDSA (Ed25519)
Поддержка API Полная Частичная
Генерация ключей Есть Нет
ASN.1 Полная Ограниченная
Производительность Средняя Ниже ожидаемой
Безопасность Зависит от nonce Детерминированная

Внутренние особенности реализации

  • Используются арифметические операции над кривыми Edwards
  • Нет аппаратного ускорения
  • Код ориентирован на читаемость, а не на производительность

Ограничения при использовании в браузере

  • Отсутствие доступа к WebCrypto API для EdDSA через jsrsasign
  • Возможные конфликты с CSP
  • Ограничения на размер данных

Перспективы развития

Поддержка EdDSA в jsrsasign развивается медленно:

  • Основной фокус библиотеки остаётся на RSA и ECDSA
  • Возможна интеграция с WebAssembly в будущем
  • Улучшение совместимости с JWK и JWT ожидается, но не гарантировано