Внутренние вспомогательные функции

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

Внутренние утилиты решают несколько задач:

  • нормализация входных данных (строки, hex, Base64, ASN.1)
  • преобразование кодировок
  • работа с бинарными структурами
  • генерация случайных значений
  • вспомогательные операции для хэширования и подписи

Пространство имен и структура

Большинство вспомогательных функций сосредоточено в следующих пространствах имен:

  • KJUR.lang.String
  • KJUR.lang.Integer
  • KJUR.crypto.Util
  • ASN1HEX
  • hextob64, b64tohex, utf8tohex и аналогичные глобальные функции

Эти утилиты часто используются внутри классов вроде KJUR.crypto.Signature или KJUR.crypto.MessageDigest.


Работа со строками и кодировками

Преобразование UTF-8 ↔︎ HEX

Одной из самых часто используемых операций является преобразование текстовых данных в шестнадцатеричное представление:

var hex = utf8tohex("example");

Обратное преобразование:

var text = hextoutf8(hex);

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

  • используется кодировка UTF-8
  • корректно обрабатываются многобайтовые символы
  • активно применяется перед хэшированием

Base64 и Base64URL

Для работы с сертификатами и токенами используются функции:

var b64 = hextob64(hex);
var hex = b64tohex(b64);

Для URL-безопасного варианта:

var b64u = hextob64u(hex);
var hex = b64utohex(b64u);

Ключевые отличия Base64URL:

  • + заменяется на -
  • / заменяется на _
  • отсутствуют символы =

ASN.1 и HEX-структуры

Модуль ASN1HEX предоставляет функции для разбора ASN.1-структур в hex-формате.

Получение длины и значения

var len = ASN1HEX.getVblen(hex, index);
var value = ASN1HEX.getV(hex, index);

Извлечение дочерних элементов

var children = ASN1HEX.getChildIdx(hex, index);

Используется при разборе:

  • X.509 сертификатов
  • PKCS#8 ключей
  • CSR запросов

Утилиты для работы с числами

Конвертация BigInteger ↔︎ HEX

var hex = bigIntToHex(bigInteger);
var bi = new BigInteger(hex, 16);

Внутри библиотеки активно используется объект BigInteger для:

  • RSA операций
  • ECC вычислений
  • генерации ключей

Криптографические утилиты

Хэширование

Вспомогательная функция:

var hashHex = KJUR.crypto.Util.hashHex(hex, "sha256");

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

  • sha1
  • sha256
  • sha384
  • sha512
  • md5

Генерация случайных значений

var randomHex = KJUR.crypto.Util.getRandomHexOfNbytes(16);

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

  • использует криптографически стойкий генератор
  • возвращает hex-строку
  • применяется при генерации ключей и nonce

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

Извлечение параметров из ключей

Внутренние функции позволяют извлекать параметры RSA:

var key = new RSAKey();
key.readPrivateKeyFromPEMString(pem);

Внутри происходит:

  • парсинг ASN.1
  • извлечение модулей и экспонент
  • преобразование в BigInteger

Упрощённые интерфейсы преобразований

Библиотека предоставляет “короткие” функции без пространств имен:

  • hextorstr
  • rstrtohex
  • b64tob64u
  • b64utob64

Они используются для быстрого преобразования без необходимости обращаться к объектам.


Валидация и проверка данных

Некоторые утилиты выполняют проверку корректности:

KJUR.lang.String.isHex(hexString);
KJUR.lang.String.isBase64(base64String);

Назначение:

  • предотвращение ошибок при криптографических операциях
  • защита от некорректных входных данных

Работа с DER и PEM

Преобразование PEM → HEX

var hex = pemtohex(pemString);

HEX → PEM

var pem = hextopem(hex, "CERTIFICATE");

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

  • автоматическое добавление заголовков
  • корректная разбивка строк

Оптимизация и внутренние механизмы

Вспомогательные функции часто:

  • минимизируют повторение кода
  • работают напрямую с hex-строками для повышения производительности
  • избегают лишних преобразований в бинарные структуры

Такой подход объясняется тем, что:

  • JavaScript не имеет нативной поддержки бинарных массивов в старых средах
  • hex-строки проще сериализуются и передаются

Частые сценарии использования

  1. Подготовка данных перед подписью:

    • UTF-8 → HEX → HASH
  2. Разбор сертификата:

    • PEM → HEX → ASN.1 → поля
  3. Работа с JWT:

    • JSON → UTF-8 → Base64URL
  4. Генерация ключей:

    • случайные значения → BigInteger → ASN.1

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

  • функции ориентированы на hex как основной формат
  • отсутствует строгая типизация
  • некоторые функции не проверяют входные данные глубоко
  • производительность зависит от строковых операций

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

Внутренние вспомогательные функции позволяют:

  • создавать собственные криптографические обёртки
  • разбирать сложные структуры без сторонних библиотек
  • контролировать каждый этап преобразования данных

Именно через них раскрывается архитектура Jsrsasign: библиотека строится вокруг универсального представления данных в виде hex-строк и набора инструментов для их трансформации.