При тестировании криптографических операций в SJCL критически важно исходить из того, что любая функция библиотеки работает не с «идеальными» данными, а с тем, что реально приходит из пользовательского ввода, сетевых запросов, хранилищ или сторонних API. Большая часть уязвимостей в криптосистемах на JavaScript проявляется не в алгоритмах, а в обработке некорректных или пограничных входных значений.
SJCL оперирует несколькими базовыми типами представления данных:
sjcl.bitArray)encrypt/decrypt)Ключевая проблема тестирования заключается в том, что библиотека допускает автоматические преобразования типов. Например, строка может быть неявно преобразована в bitArray, а некорректные структуры иногда приводят не к ошибке, а к «тихому» искажению результата.
Одни из наиболее критичных случаев — это пустые и минимально допустимые значения.
sjcl.encrypt("password", "");
Ожидаемое поведение зависит от контекста, но важно проверять:
Проблема в том, что пустая строка — валидный UTF-8 ввод, и система не должна трактовать её как ошибку.
sjcl.encrypt("password", null);
sjcl.encrypt("password", undefined);
SJCL не всегда явно валидирует такие значения. В зависимости от версии:
"null" или
"undefined"Особое внимание требуется при работе с обёртками над SJCL, где типизация ослаблена.
SJCL часто используется в динамическом окружении, поэтому критично тестировать поведение при подмене типов.
sjcl.encrypt("password", 12345);
Возможные сценарии:
"12345"sjcl.encrypt("password", { data: "test" });
Здесь почти всегда происходит:
toString() → "[object Object]"Такие случаи критичны при интеграции с API, где данные приходят в JSON.
sjcl.encrypt("password", "a");
Проверяется:
const huge = "a".repeat(10_000_000);
sjcl.encrypt("password", huge);
Важные аспекты:
Особенно важно тестировать браузерные окружения, где long task может блокировать UI.
sjcl.encrypt("", "data");
Некоторые конфигурации допускают слабые ключи. Проверяется:
sjcl.encrypt("пароль?", "данные");
Важно проверить:
Особую опасность представляют символы вне BMP (эмодзи, редкие иероглифы).
SJCL внутренне использует bitArray, и его некорректная
модификация часто приводит к скрытым ошибкам.
sjcl.bitArray.bitLength([]);
Проверяется:
sjcl.bitArray.bitLength([123, "invalid", null]);
Ожидаемые проблемы:
Высокоуровневые функции sjcl.encrypt и
sjcl.decrypt часто используются с JSON-обёрткой.
sjcl.decrypt("password", "{bad json}");
Проверяется:
sjcl.decrypt("password", JSON.stringify({}));
Возможные проблемы:
ivsaltct (ciphertext)Библиотека должна явно сигнализировать об ошибке, а не возвращать undefined или некорректный результат.
Хотя SJCL обычно генерирует IV автоматически, тестирование требует проверки сценариев ручной подстановки:
const data = sjcl.encrypt("password", "text");
const parsed = JSON.parse(data);
parsed.iv = parsed.iv;
Ключевые проверки:
sjcl.misc.pbkdf2("password", "salt", -1);
Граничные значения:
Проблемы:
const encrypted = sjcl.encrypt("password", "data");
sjcl.decrypt("password", encrypted.slice(0, -10));
Проверяется:
let corrupted = encrypted.replace(/a/g, "b");
sjcl.decrypt("password", corrupted);
Ожидается:
SJCL зависит от генератора случайных чисел
(sjcl.random).
При тестировании важно учитывать:
Некорректные сценарии могут приводить к:
SJCL не всегда выбрасывает исключения в классическом смысле. Часто ошибки проявляются как:
undefined результатПоэтому тестирование должно включать:
На практике тестирование SJCL требует сочетания:
Особое внимание уделяется не только корректности результата, но и стабильности поведения при ошибках, поскольку криптографическая библиотека не должна раскрывать внутреннюю структуру через сообщения об исключениях или различия во времени выполнения.