Минимальная сборка SJCL формируется вокруг принципа включения только
тех криптографических примитивов, которые действительно требуются
приложению. Библиотека изначально проектировалась как модульная система
поверх JavaScript, но при этом итоговый дистрибутив чаще всего
представляет собой результат статической сборки через Closure Compiler с
явным указанием включаемых компонентов.
SJCL состоит из набора независимых модулей, каждый из которых
реализует отдельный класс алгоритмов или вспомогательных функций:
- симметричное шифрование (AES)
- режимы работы блочных шифров (CCM, GCM-частично в кастомных
сборках)
- хэш-функции (SHA-256 и производные)
- генераторы случайных чисел
- кодирование (bitArray, hex, base64, UTF-8)
- асимметричная криптография (ECC — опционально)
- PBKDF2 и функции деривации ключей
Сборка формируется через файл конфигурации, который определяет, какие
модули будут включены в финальный bundle.
Минимальная конфигурация
Минимальная конфигурация ориентирована на использование SJCL как
компактного криптографического ядра для симметричного шифрования и
хэширования без поддержки асимметрии и расширенных протоколов.
Типичный набор включает:
- AES-128/256
- SHA-256
- PBKDF2
- HMAC
- bitArray и базовые конвертеры
Такой набор позволяет реализовать:
- шифрование локальных данных
- защиту паролей через PBKDF2
- проверку целостности через HMAC
Минимальная сборка исключает:
- ECC (эллиптические кривые)
- расширенные режимы шифрования (например, CCM с дополнительными
проверками)
- дополнительные энтропийные источники
- отладочные и диагностические модули
Конфигурационно это выражается через исключение директорий
/ecc/, /random/secure.js (в расширенных
вариантах), а также части /codec/, если не используются
альтернативные представления данных.
В результате минимальная сборка компилируется в один файл порядка
30–60 KB после minify, что делает её пригодной для браузерных приложений
с ограничениями по размеру.
Расширенная конфигурация
сборки
Расширенная сборка ориентирована на использование SJCL как
полноценной криптографической библиотеки, приближенной к стандартам
криптографических систем общего назначения.
В неё включаются все основные подсистемы:
Симметричная криптография
- AES-128 / AES-192 / AES-256
- режимы CBC и CCM
- расширенные проверки целостности
Хэширование и KDF
- SHA-256 как базовый стандарт
- SHA-512 (в некоторых форках или расширениях)
- PBKDF2 с настраиваемым числом итераций
- поддержка HMAC поверх любых хэш-функций
Асимметричная криптография
Генерация случайных чисел
Расширенная сборка включает:
- secureRandom с источниками энтропии браузера
- window.crypto.getRandomValues как основной источник
- fallback-механизмы на основе событий мыши и клавиатуры (устаревшие,
но присутствующие в архитектуре)
Кодирование и преобразования
- base64
- hex
- UTF-8 / UTF-16 преобразования
- bitArray как внутренняя универсальная структура
Механизм конфигурирования
сборки
Сборка SJCL основана на принципе статического включения модулей через
Closure Compiler. Это означает, что дерево зависимостей формируется на
этапе компиляции, а не во время выполнения.
Основные принципы:
- каждый модуль объявляет зависимости явно
- Closure Compiler выполняет tree-shaking на уровне функций
- итоговый bundle содержит только достижимый код
Конфигурация часто задаётся через сборочные скрипты (Makefile или
Node-based pipeline), где перечисляются:
- входные файлы (
src/core, src/codec,
src/aes, src/ecc)
- флаги компилятора
- порядок объединения модулей
Пример логики сборки:
- базовое ядро (bitArray + codec)
- криптографические примитивы (aes, sha256)
- KDF и HMAC
- опциональные расширения (ecc, random enhancements)
Влияние конфигурации на
безопасность
Минимальная сборка снижает поверхность атаки за счёт отсутствия
сложных подсистем, но одновременно ограничивает функциональность.
Расширенная сборка увеличивает:
- криптографическую гибкость
- совместимость с протоколами
- устойчивость к различным сценариям атак
Однако увеличение числа модулей приводит к:
- росту размера итогового файла
- усложнению аудита кода
- большему числу потенциальных точек отказа
Особенности Closure
Compiler в SJCL
Closure Compiler играет ключевую роль в формировании итоговой
сборки:
- инлайнинг криптографических операций
- удаление неиспользуемых веток кода
- переименование символов для минимизации размера
- агрессивная оптимизация циклов и операций над битовыми
массивами
При этом критически важно сохранять:
- точность побитовых операций
- неизменность криптографических преобразований
- порядок вычислений в хэш-функциях
По этой причине SJCL содержит большое количество комментариев и
аннотаций, защищающих чувствительные участки от агрессивной
оптимизации.
Разделение сборок на профили
На практике используются три основных профиля:
minimal
- AES
- SHA-256
- PBKDF2
- bitArray + codecs
standard
- minimal +
- HMAC
- расширенные режимы шифрования
- улучшенный random
full
- standard +
- ECC
- расширенные кривые
- дополнительные утилиты кодирования
- расширенные fallback-механизмы генерации энтропии
Каждый профиль определяется набором включаемых исходников, а не
параметрами рантайма.
Влияние архитектуры
JavaScript на сборку
SJCL разрабатывался в условиях ограничений старых JavaScript-движков,
поэтому архитектура сборки учитывает:
- отсутствие нативных модулей ES6 в ранних версиях
- необходимость статической компоновки
- ограниченность памяти в браузерах
- отсутствие стабильного WebCrypto API в ранний период
По этой причине сборка остаётся монолитной даже при наличии
внутренней модульности.
Оптимизация минимальной
сборки
Для минимальных конфигураций применяются следующие техники:
- удаление ECC-веток на уровне исходников
- отключение fallback-энтропии
- замена универсальных функций специализированными версиями AES
- сокращение codec-набора до base64 и hex
Это позволяет уменьшить итоговый размер без потери криптографической
корректности базовых операций.
Расширение сборки под
прикладные задачи
Расширенная конфигурация часто адаптируется под конкретные
сценарии:
- защищённые веб-приложения
- клиентские криптографические протоколы
- совместимость с внешними ECC-системами
- интеграция с серверными ключевыми инфраструктурами
В таких случаях добавляются:
- поддержка нескольких кривых ECC
- дополнительные KDF-функции
- расширенные режимы шифрования
- инструменты сериализации ключей
Итоговая структура выходного
файла
После сборки SJCL представляет собой:
- единый JavaScript-файл
- набор глобальных объектов (sjcl, sjcl.cipher, sjcl.hash и т.д.)
- оптимизированный битовый движок
- набор криптографических примитивов, связанный через статическую
композицию
Разница между минимальной и расширенной конфигурацией определяется не
архитектурой исполнения, а глубиной включённого функционального графа
модулей.