Проверка корректности установки

После установки через npm или подключения через <script> в браузере ключевой задачей становится подтверждение того, что библиотека действительно доступна в текущем окружении и корректно инициализирована.

В зависимости от способа подключения доступ к объекту может отличаться:

Подключение через npm (Node.js / bundler)

npm install sjcl

В коде:

import sjcl from "sjcl";

или (в некоторых сборках):

const sjcl = require("sjcl");

Подключение через CDN (браузер)

<script src="https://cdnjs.cloudflare.com/ajax/libs/sjcl/1.0.8/sjcl.min.js"></script>

После подключения библиотека становится доступной через глобальный объект:

window.sjcl

или просто:

sjcl

Проверка доступности глобального объекта

Первый уровень проверки — убедиться, что объект библиотеки существует в окружении.

if (typeof sjcl === "undefined") {
  throw new Error("SJCL не загружен");
}

В Node.js или сборщиках модулей дополнительно проверяется импорт:

if (!sjcl || typeof sjcl.hash !== "object") {
  throw new Error("SJCL импортирован некорректно");
}

Проверка версии библиотеки

SJCL не всегда активно развивается, поэтому важно фиксировать ожидаемую версию, особенно в учебных и криптографических проектах.

console.log(sjcl.version);

Ожидаемый результат:

1.0.8

Если значение отсутствует или undefined, это может указывать на некорректную сборку или обрезанную версию библиотеки.


Проверка базовой криптографической операции

Наиболее надёжный способ убедиться в корректной установке — выполнить простую операцию шифрования и расшифрования.

Шифрование строки

const data = "test message";
const password = "secret-password";

const encrypted = sjcl.encrypt(password, data);

encrypted возвращается в формате JSON-строки, содержащей параметры:

  • алгоритм
  • соль
  • IV
  • ciphertext
  • параметры PBKDF2

Расшифрование строки

const decrypted = sjcl.decrypt(password, encrypted);

console.log(decrypted); // "test message"

Если библиотека работает корректно, результат полностью совпадает с исходной строкой.


Проверка устойчивости при неверном пароле

Корректная реализация SJCL должна выбрасывать исключение при попытке расшифрования с неправильным ключом.

try {
  sjcl.decrypt("wrong-password", encrypted);
} catch (e) {
  console.log("Ошибка расшифрования подтверждена");
}

Ожидаемое поведение:

  • генерация исключения
  • отсутствие частичного или повреждённого результата

Проверка криптографических модулей

SJCL состоит из набора модулей (AES, SHA, HMAC, PBKDF2). Их наличие можно проверить напрямую.

AES

typeof sjcl.cipher.aes === "function"

SHA-256

typeof sjcl.hash.sha256 === "function"

HMAC

typeof sjcl.misc.hmac === "function"

Если любой из модулей отсутствует, это означает неполную сборку библиотеки.


Проверка хеширования

Базовая проверка SHA-256:

const hashBits = sjcl.hash.sha256.hash("hello");
const hashHex = sjcl.codec.hex.fromBits(hashBits);

console.log(hashHex);

Ожидается стабильный результат:

2cf24dba5fb0a30e26e83b2ac5b9e29e...

Стабильность хеша при повторных вызовах подтверждает корректную работу алгоритма.


Проверка PBKDF2 (ключевая функция для паролей)

const key = sjcl.misc.pbkdf2("password", "salt", 1000, 256);
const hexKey = sjcl.codec.hex.fromBits(key);

console.log(hexKey);

Важно, чтобы:

  • одинаковый вход давал одинаковый результат
  • разные соли давали разные ключи
  • функция не возвращала null или undefined

Проверка работы в сборщиках (Webpack / Vite / Rollup)

При использовании сборщиков часто возникают ошибки экспорта.

Типичная проверка:

console.log("aes:", sjcl.cipher.aes);
console.log("sha256:", sjcl.hash.sha256);

Если вывод содержит undefined, возможны причины:

  • неверный импорт (default vs named export)
  • конфликт CommonJS/ESM
  • tree-shaking удалил модули

Проверка совместимости с строгим режимом

SJCL должен работать без ошибок в "use strict":

"use strict";

const encrypted = sjcl.encrypt("key", "data");
const decrypted = sjcl.decrypt("key", encrypted);

console.log(decrypted);

Отсутствие ошибок указывает на корректную интеграцию без глобальных побочных эффектов.


Проверка отсутствия runtime-ошибок при инициализации

В некоторых окружениях (особенно старые браузеры или минимизированные сборки) возможны ошибки при загрузке модулей.

Базовая проверка:

try {
  sjcl.random.randomWords(1);
  console.log("random OK");
} catch (e) {
  console.log("random module error");
}

Проверка детерминированности криптографических операций

Ключевой критерий корректной работы — воспроизводимость результатов.

const p = "key";
const m = "message";

const e1 = sjcl.encrypt(p, m);
const e2 = sjcl.encrypt(p, m);

const d1 = sjcl.decrypt(p, e1);
const d2 = sjcl.decrypt(p, e2);

console.log(d1 === m && d2 === m);

Обе расшифровки должны совпадать с исходным значением, несмотря на различие ciphertext (из-за случайного IV).


Проверка отсутствия повреждения JSON-формата

SJCL использует JSON-строку как контейнер шифртекста.

const enc = sjcl.encrypt("key", "data");

const parsed = JSON.parse(enc);

console.log(parsed.ct); // ciphertext

Если JSON не парсится — проблема в сборке или повреждении результата.


Проверка поведения при пустых входных данных

sjcl.encrypt("key", "");
sjcl.decrypt("key", sjcl.encrypt("key", ""));

Корректная реализация должна обрабатывать пустые строки без исключений.


Проверка интеграции с внешними API (edge case)

Иногда SJCL используется вместе с передачей данных через HTTP.

const payload = sjcl.encrypt("key", JSON.stringify({ a: 1 }));

fetch("/api", {
  method: "POST",
  body: payload,
});

Проверяется:

  • отсутствие изменений строки при передаче
  • корректная сериализация/десериализация на стороне клиента

Проверка устойчивости к многократным вызовам

for (let i = 0; i < 100; i++) {
  const enc = sjcl.encrypt("key", "data" + i);
  const dec = sjcl.decrypt("key", enc);

  if (dec !== "data" + i) {
    throw new Error("Ошибка на итерации " + i);
  }
}

Такой тест выявляет утечки состояния или проблемы с RNG.


Проверка работы генератора случайных чисел

const rnd = sjcl.random.randomWords(4);
console.log(rnd);

Если массив:

  • всегда одинаковый → проблема с entropy
  • содержит NaN → повреждение RNG
  • пустой → модуль не инициализирован