Введение
sm-crypto-wasm компилирует горячие участки китайских национальных криптоалгоритмов в WebAssembly, чтобы фронтенд и Node-бэкенд вызывали SM2 / SM3 / SM4 / SM9 / ZUC через один API — без ASN.1, длинной арифметики и ручной обвязки WASM.
AssemblyScript компилируется в .wasm и заворачивается в тонкую прослойку на TypeScript. Против чистого JS эллиптические кривые и спаривания быстрее на порядок; против реализаций на C++ / Rust — распространение через npm не требует компилятора у пользователя.
Пять алгоритмов
| Алгоритм | Стандарт | Что это | Документация |
|---|---|---|---|
| SM3 | GM/T 0004-2012 | 256-битный хеш, класс SHA-256 | SM3 |
| SM4 | GM/T 0002-2012 | 128-битный блочный шифр, шесть режимов | SM4 |
| SM2 | GM/T 0003-2012 | Эллиптические кривые (подпись / шифрование / KEM / гибридное шифрование / обмен ключами) | SM2 |
| SM9 | GM/T 0044-2016 | Идентификационная криптография (подпись / шифрование / KEM / гибридное шифрование) | SM9 |
| ZUC | GM/T 0001-2012 | Поточный шифр, EEA3 + EIA3 | ZUC |
Решения по устройству
- Разбито по алгоритмам: один
.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).