Архитектура SJCL построена вокруг единого глобального пространства
имён sjcl, в которое по мере загрузки файлов добавляются
отдельные функциональные модули. Такой подход позволяет библиотеке
оставаться совместимой с ранними версиями JavaScript и при этом
обеспечивать логическое разделение криптографических компонентов без
использования современных систем модулей ES Modules или CommonJS.
В основе организации лежит объект sjcl, создаваемый в
глобальной области видимости. Каждый файл библиотеки расширяет этот
объект, добавляя новые свойства или вложенные пространства имён:
sjcl.hash — хеш-функцииsjcl.cipher — блочные шифрыsjcl.mode — режимы работы блочных шифровsjcl.codec — кодеки для преобразования данныхsjcl.misc — вспомогательные утилитыsjcl.bn — большие числаsjcl.ecc — эллиптическая криптографияsjcl.random — генератор случайных чиселКаждый модуль не изолирован в смысле системы импортов, а подключается через последовательное выполнение файлов, где порядок подключения становится критически важным.
В классической версии SJCL отсутствует механизм динамического разрешения зависимостей. Вместо этого используется статическая сборка:
Такой подход делает библиотеку независимой от окружения (браузер, старые JS-движки), но накладывает ограничения на архитектурную гибкость.
Каждый модуль представляет собой самовызывающуюся функцию или набор
выражений, которые дополняют sjcl:
sjcl.cipher.aes = function(key) {
// реализация AES
};
или
sjcl.hash.sha256 = function(message) {
// реализация SHA-256
};
Таким образом достигается эффект модульности без использования импортов. Каждый компонент становится частью общего пространства имён сразу после выполнения кода.
Модульная структура организована не по техническим слоям, а по криптографическим примитивам.
Модули в sjcl.hash реализуют алгоритмы:
Каждый алгоритм представлен отдельной реализацией, но унифицирован через общий интерфейс: функция принимает сообщение и возвращает битовый массив.
sjcl.cipher содержит реализации симметричных
алгоритмов:
Каждый шифр оформлен как конструктор, возвращающий объект с методами шифрования и дешифрования.
sjcl.mode определяет способы применения блочных
шифров:
Режимы отделены от самих алгоритмов шифрования и принимают шифр как параметр, реализуя композиционный подход.
sjcl.codec отвечает за преобразование данных между
форматами:
Кодеки не содержат криптографической логики и служат исключительно для представления данных.
sjcl.misc включает:
Эти компоненты часто используют сразу несколько других модулей, но остаются отделёнными от базовых примитивов.
Несмотря на отсутствие формальной системы импортов, зависимости между модулями строго определены:
sjcl.mode зависит от sjcl.ciphersjcl.cipher использует sjcl.bitArraysjcl.hash использует только
sjcl.bitArraysjcl.misc может использовать и hash, и
cipher, и codecЭти зависимости не проверяются системой, а поддерживаются архитектурной дисциплиной разработки.
Центральным элементом связности модульной структуры выступает формат
bitArray. Почти все криптографические операции принимают и
возвращают данные именно в этом виде.
bitArray обеспечивает:
Кодеки выступают мостом между bitArray и внешними
представлениями данных.
Добавление новых модулей осуществляется через простое присвоение в пространство имён:
sjcl.hash.myHash = function(data) {
// пользовательская реализация
};
Отсутствие централизованного регистратора модулей делает систему открытой, но требует ручного контроля конфликтов имён и зависимостей.
Процесс сборки SJCL основан на объединении исходных файлов:
Итоговый файл представляет собой линейную последовательность модулей, где каждый следующий предполагает наличие предыдущих.
Каждый модуль изолирует внутренние переменные с помощью замыканий:
sjcl.cipher.aes = function(key) {
var rounds = 10;
var keySchedule = [];
// внутренние функции и данные
};
Это позволяет скрывать реализацию криптографических деталей, оставляя наружу только публичный интерфейс.
Модули SJCL не могут подключаться или отключаться во время выполнения:
Композиция полностью переносится на этап сборки, что упрощает выполнение в браузере, но ограничивает гибкость интеграции в современные модульные системы.
Модульная структура SJCL характеризуется высокой связностью через общие структуры данных и слабой изоляцией на уровне системы загрузки. Связность достигается не инфраструктурой модулей, а:
sjclbitArrayТакой подход отражает раннюю модель JavaScript-библиотек, где модульность реализуется организацией кода, а не средствами языка.