Обработка ошибок
Всё, что отвергнуто из-за ввода, наследует SmCryptoError и делится по тому, что нужно исправить — проблему ключа или проблему шифротекста:
text
SmCryptoError
├── InvalidKeyError плохой ключ / скаляр
│ └── InvalidPublicKeyError точка не на кривой, координаты вне диапазона
└── CiphertextError плохой шифротекст / подпись / сообщение протокола
├── InvalidCiphertextError нарушена структура (длина, ASN.1, кодировка точки)
└── DecryptionError структура верна, но проверка не прошлаts
import { isSmCryptoError } from 'sm-crypto-wasm';
try {
sm2.decrypt(priv, ct);
} catch (e) {
if (isSmCryptoError(e)) { /* библиотека отвергла ввод */ }
}Неверные типы аргументов не оборачиваются
| Ситуация | Бросается |
|---|---|
null / number / неверная форма | TypeError |
| Пустая строка на входе | TypeError |
| Лимит длины, отрицательный счётчик, неизвестное значение перечисления | RangeError |
Это остаётся нативным — ошибка программиста, а не «криптографический отказ».
safeMode: null вместо исключения
ts
const pt = sm2.decrypt(priv, ct, { safeMode: true }); // string | null
const pt2 = sm4.decryptGCM(key, iv, ct, tag, { aad, safeMode: true }); // string | null
const pt3 = sm9.decrypt(ke, id, ct, { safeMode: true }); // string | nullsafeMode глушит только отказы со стороны шифротекста; ошибки типов всё равно бросаются.
verify не бросает на плохом ключе
sm2.verify / sm9.verify возвращают false для точки не на кривой или неверной подписи — «не прошло» это обычный результат, а не исключение. Исключение бросается только при структурно неверной длине подписи.
Полный справочник
Китайская страница содержит таблицу типичных ошибок по алгоритмам.