Проверка криптографических примитивов на соответствие стандартным тест-векторам NIST является обязательным этапом валидации любой реализации, включая Stanford JavaScript Crypto Library. Тест-векторы представляют собой заранее известные входные данные и ожидаемые выходные результаты для конкретных алгоритмов, что позволяет выявлять ошибки в реализации на уровне битовой совместимости.
В контексте SJCL ключевая сложность заключается в том, что библиотека
использует собственное представление данных через bitArray,
а не стандартные JS-строки или Uint8Array. Это требует аккуратной
адаптации тестов, предоставляемых NIST, к внутреннему формату
библиотеки.
Перед тем как переходить к тест-векторам, необходимо учитывать ключевую архитектурную особенность:
sjcl.bitArrayТипичная ошибка при тестировании — некорректное преобразование
входных данных в bitArray, что приводит к несовпадению
результатов даже при корректном алгоритме.
Обычно NIST предоставляет тесты в формате:
Для использования в SJCL требуется преобразование:
var keyBits = sjcl.codec.hex.toBits("000102030405060708090a0b0c0d0e0f");
var dataBits = sjcl.codec.hex.toBits("00112233445566778899aabbccddeeff");
После этого результаты также сравниваются через hex:
var resultHex = sjcl.codec.hex.fromBits(resultBits);
Типичный NIST-вектор:
000102030405060708090a0b0c0d0e0f00112233445566778899aabbccddeeff69c4e0d86a7b0430d8cdb78070b4c55avar aes = new sjcl.cipher.aes(sjcl.codec.hex.toBits("000102030405060708090a0b0c0d0e0f"));
var pt = sjcl.codec.hex.toBits("00112233445566778899aabbccddeeff");
var ct = aes.encrypt(pt);
var ctHex = sjcl.codec.hex.fromBits(ct);
Сравнение:
ctHex === "69c4e0d86a7b0430d8cdb78070b4c55a";
Для CBC режима дополнительно используется IV:
000102030405060708090a0b0c0d0e0fvar aes = new sjcl.cipher.aes(keyBits);
var cipher = sjcl.mode.cbc.encrypt(aes, ptBits, ivBits);
Особенность проверки CBC:
CTR режим наиболее чувствителен к ошибкам счётчика.
var aes = new sjcl.cipher.aes(keyBits);
var ctr = new sjcl.mode.ctr(aes, ivBits, 128);
var out = ctr.encrypt(ptBits);
NIST тест-векторы для CTR обычно проверяют:
Вход:
Ожидаемый результат:
e3b0c44298fc1c149afbf4c8996fb924...
var hash = sjcl.hash.sha256.hash("");
var hex = sjcl.codec.hex.fromBits(hash);
NIST SHA-256 test suite включает:
Пример:
sjcl.codec.hex.fromBits(
sjcl.hash.sha256.hash("abc")
);
Ожидаемое значение:
ba7816bf8f01cfea414140de5dae2223...
NIST предоставляет HMAC тест-векторы с разными ключами:
var hmac = new sjcl.misc.hmac(keyBits, sjcl.hash.sha256);
var result = hmac.encrypt(messageBits);
Проверяются:
Хотя PBKDF2 не всегда входит в классические NIST KAT наборы для всех конфигураций, он широко используется в валидации.
sjcl.misc.pbkdf2(password, salt, iterations, keyLength);
Ключевые параметры проверки:
Наиболее частая проблема:
Особенно критично для CBC и CTR:
NIST использует:
SJCL требует явного преобразования через codec
AES-CBC тесты могут не совпадать из-за:
Для крупных наборов тестов удобно строить runner:
function runTest(vector) {
var key = sjcl.codec.hex.toBits(vector.key);
var pt = sjcl.codec.hex.toBits(vector.pt);
var aes = new sjcl.cipher.aes(key);
var ct = aes.encrypt(pt);
var out = sjcl.codec.hex.fromBits(ct);
return out === vector.ct;
}
Обычно NIST набор организован как:
Для SJCL удобно преобразовать в JSON:
{
"key": "...",
"pt": "...",
"ct": "...",
"iv": "...",
"mode": "CBC"
}
Дополнительный уровень проверки:
Несовпадение только с SJCL обычно указывает на ошибку в адаптации
bitArray, а не в алгоритме.
Некоторые тонкости:
Это критично при:
В реальных проектах проверка NIST-векторов интегрируется как:
Каждый алгоритм имеет собственный набор:
Если результат не совпадает:
Даже один неверный байт в IV или ключе приводит к полностью отличающемуся выходу, что характерно для криптографических примитивов.