RFC 8422 определяет использование эллиптической криптографии (ECC) в протоколе TLS, включая перечень поддерживаемых кривых (Named Groups) и правила их согласования между клиентом и сервером. В библиотеке jsrsasign реализация ECC опирается на набор стандартных кривых, соответствующих рекомендациям RFC, включая те, что упоминаются в RFC 8422 и последующих обновлениях TLS 1.2/1.3.
Кривые в данном контексте используются для:
RFC 8422 определяет именованные группы (Named Groups), ранее называвшиеся Named Curves. В jsrsasign кривые задаются строковыми идентификаторами, соответствующими стандартным именам.
| Имя (RFC) | Имя в jsrsasign | Описание |
|---|---|---|
| secp256r1 | P-256 | Наиболее распространённая кривая |
| secp384r1 | P-384 | Повышенная безопасность |
| secp521r1 | P-521 | Максимальный уровень безопасности |
| secp256k1 | secp256k1 | Используется в блокчейн-системах |
Внутри jsrsasign эти кривые доступны через объект
KJUR.crypto.ECDSA.
Генерация ECC-ключей производится через класс ECDSA.
Важно указывать правильное имя кривой.
var ec = new KJUR.crypto.ECDSA({curve: "P-256"});
var keypair = ec.generateKeyPairHex();
var pubKeyHex = keypair.ecpubhex;
var privKeyHex = keypair.ecprvhex;
Особенности:
curve должен совпадать с поддерживаемыми значениями RFC
8422.Публичный ключ в ECC — это точка (x, y) на эллиптической кривой. В jsrsasign используется несжатый формат:
04 || X || Y
Где:
04 — префикс несжатого ключа,X и Y — координаты точки.var sig = new KJUR.crypto.Signature({
alg: "SHA256withECDSA"
});
sig.init({d: privKeyHex, curve: "P-256"});
sig.updateString("message");
var signatureHex = sig.sign();
var sig = new KJUR.crypto.Signature({
alg: "SHA256withECDSA"
});
sig.init({xy: pubKeyHex, curve: "P-256"});
sig.updateString("message");
var isValid = sig.verify(signatureHex);
Ключевые моменты:
Для реализации ECDH jsrsasign предоставляет низкоуровневые инструменты работы с точками кривых.
var ec = new KJUR.crypto.ECDSA({curve: "P-256"});
var sharedKey = ec.getSecretKeyHex(
privKeyHex,
pubKeyHexOtherParty
);
Принцип:
RFC 8422 подразумевает использование стандартных форматов кодирования ключей. jsrsasign поддерживает:
var pem = KJUR.KEYUTIL.getPEM({
curve: "P-256",
d: privKeyHex
}, "PKCS8PRV");
В контексте TLS:
jsrsasign не реализует TLS напрямую, но:
Разработчик явно указывает кривую. В отличие от TLS-стека, библиотека не выполняет negotiation.
ECDSA критически зависит от случайного параметра k. В
jsrsasign используется встроенный генератор, но:
RFC 8422 частично устарел, и многие положения перенесены в TLS 1.3:
jsrsasign в основном ориентирован на классические кривые NIST:
Поддержка современных кривых (например, Curve25519) ограничена или отсутствует, что важно учитывать при реализации современных TLS-решений.
| Концепция RFC 8422 | Реализация в jsrsasign |
|---|---|
| Named Groups | curve: "P-256" |
| ECDSA подпись | Signature |
| ECDH обмен | getSecretKeyHex |
| Кодирование ключей | KEYUTIL |
jsrsasign позволяет проверять сертификаты X.509, содержащие ECC-ключи:
var cert = new X509();
cert.readCertPEM(pemCert);
var pubKey = cert.getPublicKey();
После извлечения ключа можно:
RFC 8422 рекомендует избегать устаревших кривых и использовать проверенные стандартизированные параметры.
jsrsasign может использоваться совместно с:
При этом важно учитывать:
Основные компоненты:
ECDSA — генерация ключей и подписиECParameterDB — база параметров кривыхBigInteger — арифметика больших чиселECPoint — работа с точками кривойТакая последовательность полностью соответствует модели, описанной в RFC 8422, и реализуется средствами jsrsasign без необходимости внешних зависимостей.