Внутри SJCL (Stanford Javascript Crypto Library) все криптографические примитивы опираются на единый базовый формат представления данных — bitArray. Это не просто вспомогательная структура, а центральный контракт, через который проходят ключи, векторы инициализации, хэши, шифротексты и промежуточные состояния алгоритмов.
bitArray в SJCL устроен иначе, чем привычные массивы байтов или TypedArray. Его модель ближе к потоковому представлению битов, чем к классическому блочному буферу.
bitArray — это обычный JavaScript-массив, элементы которого интерпретируются как 32-битные слова:
Пример:
var a = [0x12345678, 0x9abcdef0];
Это не массив чисел в математическом смысле, а последовательность 64 бит информации, разбитая на два слова.
Ключевая особенность SJCL: bitArray не содержит отдельного поля длины.
Длина вычисляется неявно:
Таким образом, фактическая длина в битах определяется функциями библиотеки, а не структурой данных.
Чтобы поддерживать произвольную длину битового потока, SJCL использует механизм “partial word” — последний элемент массива может хранить не 32, а меньше бит.
Это реализуется через специальное кодирование:
Типичная идея:
[ word1, word2, ..., lastWordWithPartialInfo ]
Где последний элемент не полностью заполнен.
Вся работа с bitArray осуществляется через набор функций,
определённых в sjcl.bitArray.
Объединение двух битовых массивов:
sjcl.bitArray.concat(a, b);
Логика:
b дописываются к asjcl.bitArray.bitLength(a);
Функция вычисляет количество значимых бит во всём массиве.
Важно:
a.length * 32sjcl.bitArray.clamp(a, len);
Операция ограничивает битовый массив первыми len
битами.
Используется при:
SJCL реализует битовые сдвиги на уровне массива:
sjcl.bitArray.shiftRight(a, n);
sjcl.bitArray.shiftLeft(a, n);
Особенности:
Одна из ключевых операций в криптографии:
sjcl.bitArray.xor(a, b);
Используется в:
Поведение:
bitArray не является байтовым массивом, поэтому SJCL предоставляет конвертеры.
sjcl.codec.bytes.toBits(bytes);
Правила:
sjcl.codec.bytes.fromBits(bits);
Используется при:
Каждое 32-битное слово в SJCL фактически обрабатывается как беззнаковое:
>>> и
<<Это важно, потому что JavaScript числа — IEEE 754 double, но SJCL искусственно ограничивает их до 32 бит через битовые операции.
SJCL не использует bitArray как арифметическую структуру, но через него реализуются:
Пример вращения:
sjcl.bitArray.rotl(x, n);
Используется в:
Помимо базовых операций, bitArray поддерживает низкоуровневые функции:
Извлечение диапазона бит:
sjcl.bitArray.bitSlice(a, start, end);
Позволяет работать с подстроками битового потока.
Сравнение двух массивов:
sjcl.bitArray.equal(a, b);
Используется для:
Важно: сравнение реализовано так, чтобы минимизировать утечки по времени (constant-time поведение в пределах возможностей JS).
bitArray является фундаментом всей библиотеки:
Фактически SJCL не оперирует “байтами” в классическом смысле — весь стек построен поверх битового потока.
Любой вход в SJCL в конечном счёте приводится к bitArray:
Пример:
sjcl.codec.utf8String.toBits("test");
bitArray не оптимизирован под высокоуровневые структуры:
Это осознанный компромисс:
Несмотря на универсальность, bitArray имеет ограничения:
bitArray выступает как универсальный “язык общения” между всеми стадиями.
bitArray — это компромисс между:
Он не пытается быть эффективным контейнером данных. Его задача — гарантировать корректную и однозначную работу битовых операций во всех алгоритмах SJCL.