Skip to content

Введение ​

sm-crypto-wasm компилирует горячие участки китайских национальных криптоалгоритмов в WebAssembly, чтобы фронтенд и Node-бэкенд вызывали SM2 / SM3 / SM4 / SM9 / ZUC через один API — без ASN.1, длинной арифметики и ручной обвязки WASM.

AssemblyScript компилируется в .wasm и заворачивается в тонкую прослойку на TypeScript. Против чистого JS эллиптические кривые и спаривания быстрее на порядок; против реализаций на C++ / Rust — распространение через npm не требует компилятора у пользователя.

Пять алгоритмов ​

АлгоритмСтандартЧто этоДокументация
SM3GM/T 0004-2012256-битный хеш, класс SHA-256SM3
SM4GM/T 0002-2012128-битный блочный шифр, шесть режимовSM4
SM2GM/T 0003-2012Эллиптические кривые (подпись / шифрование / KEM / гибридное шифрование / обмен ключами)SM2
SM9GM/T 0044-2016Идентификационная криптография (подпись / шифрование / KEM / гибридное шифрование)SM9
ZUCGM/T 0001-2012Поточный шифр, EEA3 + EIA3ZUC

Решения по устройству ​

  • Разбито по алгоритмам: один .wasm на алгоритм, загружается только выбранный.
  • Синхронный бизнес-API, асинхронный прогрев: ensureLoaded() асинхронный (создание экземпляра WASM иначе нельзя), всё после него — синхронное.
  • Случайность только от хоста: crypto.getRandomValues / crypto.randomBytes. Библиотека не содержит RNG и никогда не пишет ключи на диск или в логи.
  • Распознавание ввода: hex / base64 / PEM / Uint8Array; вывод по умолчанию hex.
  • Слоистые ошибки: всё, что отвергнуто из-за ввода, наследует SmCryptoError и делится на сторону ключа и сторону шифротекста; неверные типы аргументов остаются нативными TypeError / RangeError.

Вне области ​

  • ZUC-256 (GM/T 0001.1-2021) — другой алгоритм, а не параметризация ZUC-128;
  • адаптер в стиле WebCrypto (crypto.subtle);
  • HSM / PKCS#11;
  • X.509 / PKCS#7 / CMS;
  • среды «строго потокового WASM» (Cloudflare Workers / Vercel Edge).

Дальше ​

Лицензия Apache-2.0