@oqs/liboqs-js 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +50 -0
- package/README.md +829 -0
- package/bin/cli.js +16 -0
- package/dist/classic-mceliece-348864.deno.js +0 -0
- package/dist/classic-mceliece-348864.min.js +0 -0
- package/dist/classic-mceliece-348864f.deno.js +0 -0
- package/dist/classic-mceliece-348864f.min.js +0 -0
- package/dist/classic-mceliece-460896.deno.js +0 -0
- package/dist/classic-mceliece-460896.min.js +0 -0
- package/dist/classic-mceliece-460896f.deno.js +0 -0
- package/dist/classic-mceliece-460896f.min.js +0 -0
- package/dist/classic-mceliece-6688128.deno.js +0 -0
- package/dist/classic-mceliece-6688128.min.js +0 -0
- package/dist/classic-mceliece-6688128f.deno.js +0 -0
- package/dist/classic-mceliece-6688128f.min.js +0 -0
- package/dist/classic-mceliece-6960119.deno.js +0 -0
- package/dist/classic-mceliece-6960119.min.js +0 -0
- package/dist/classic-mceliece-6960119f.deno.js +0 -0
- package/dist/classic-mceliece-6960119f.min.js +0 -0
- package/dist/classic-mceliece-8192128.deno.js +0 -0
- package/dist/classic-mceliece-8192128.min.js +0 -0
- package/dist/classic-mceliece-8192128f.deno.js +0 -0
- package/dist/classic-mceliece-8192128f.min.js +0 -0
- package/dist/cross-rsdp-128-balanced.deno.js +0 -0
- package/dist/cross-rsdp-128-balanced.min.js +0 -0
- package/dist/cross-rsdp-128-fast.deno.js +0 -0
- package/dist/cross-rsdp-128-fast.min.js +0 -0
- package/dist/cross-rsdp-128-small.deno.js +0 -0
- package/dist/cross-rsdp-128-small.min.js +0 -0
- package/dist/cross-rsdp-192-balanced.deno.js +0 -0
- package/dist/cross-rsdp-192-balanced.min.js +0 -0
- package/dist/cross-rsdp-192-fast.deno.js +0 -0
- package/dist/cross-rsdp-192-fast.min.js +0 -0
- package/dist/cross-rsdp-192-small.deno.js +0 -0
- package/dist/cross-rsdp-192-small.min.js +0 -0
- package/dist/cross-rsdp-256-balanced.deno.js +0 -0
- package/dist/cross-rsdp-256-balanced.min.js +0 -0
- package/dist/cross-rsdp-256-fast.deno.js +0 -0
- package/dist/cross-rsdp-256-fast.min.js +0 -0
- package/dist/cross-rsdp-256-small.deno.js +0 -0
- package/dist/cross-rsdp-256-small.min.js +0 -0
- package/dist/cross-rsdpg-128-balanced.deno.js +0 -0
- package/dist/cross-rsdpg-128-balanced.min.js +0 -0
- package/dist/cross-rsdpg-128-fast.deno.js +0 -0
- package/dist/cross-rsdpg-128-fast.min.js +0 -0
- package/dist/cross-rsdpg-128-small.deno.js +0 -0
- package/dist/cross-rsdpg-128-small.min.js +0 -0
- package/dist/cross-rsdpg-192-balanced.deno.js +0 -0
- package/dist/cross-rsdpg-192-balanced.min.js +0 -0
- package/dist/cross-rsdpg-192-fast.deno.js +0 -0
- package/dist/cross-rsdpg-192-fast.min.js +0 -0
- package/dist/cross-rsdpg-192-small.deno.js +0 -0
- package/dist/cross-rsdpg-192-small.min.js +0 -0
- package/dist/cross-rsdpg-256-balanced.deno.js +0 -0
- package/dist/cross-rsdpg-256-balanced.min.js +0 -0
- package/dist/cross-rsdpg-256-fast.deno.js +0 -0
- package/dist/cross-rsdpg-256-fast.min.js +0 -0
- package/dist/cross-rsdpg-256-small.deno.js +0 -0
- package/dist/cross-rsdpg-256-small.min.js +0 -0
- package/dist/falcon-1024.deno.js +0 -0
- package/dist/falcon-1024.min.js +0 -0
- package/dist/falcon-512.deno.js +0 -0
- package/dist/falcon-512.min.js +0 -0
- package/dist/falcon-padded-1024.deno.js +0 -0
- package/dist/falcon-padded-1024.min.js +0 -0
- package/dist/falcon-padded-512.deno.js +0 -0
- package/dist/falcon-padded-512.min.js +0 -0
- package/dist/frodokem-1344-aes.deno.js +0 -0
- package/dist/frodokem-1344-aes.min.js +0 -0
- package/dist/frodokem-1344-shake.deno.js +0 -0
- package/dist/frodokem-1344-shake.min.js +0 -0
- package/dist/frodokem-640-aes.deno.js +0 -0
- package/dist/frodokem-640-aes.min.js +0 -0
- package/dist/frodokem-640-shake.deno.js +0 -0
- package/dist/frodokem-640-shake.min.js +0 -0
- package/dist/frodokem-976-aes.deno.js +0 -0
- package/dist/frodokem-976-aes.min.js +0 -0
- package/dist/frodokem-976-shake.deno.js +0 -0
- package/dist/frodokem-976-shake.min.js +0 -0
- package/dist/hqc-128.deno.js +0 -0
- package/dist/hqc-128.min.js +0 -0
- package/dist/hqc-192.deno.js +0 -0
- package/dist/hqc-192.min.js +0 -0
- package/dist/hqc-256.deno.js +0 -0
- package/dist/hqc-256.min.js +0 -0
- package/dist/kyber-1024.deno.js +0 -0
- package/dist/kyber-1024.min.js +0 -0
- package/dist/kyber-512.deno.js +0 -0
- package/dist/kyber-512.min.js +0 -0
- package/dist/kyber-768.deno.js +0 -0
- package/dist/kyber-768.min.js +0 -0
- package/dist/mayo-1.deno.js +0 -0
- package/dist/mayo-1.min.js +0 -0
- package/dist/mayo-2.deno.js +0 -0
- package/dist/mayo-2.min.js +0 -0
- package/dist/mayo-3.deno.js +0 -0
- package/dist/mayo-3.min.js +0 -0
- package/dist/mayo-5.deno.js +0 -0
- package/dist/mayo-5.min.js +0 -0
- package/dist/ml-dsa-44.deno.js +0 -0
- package/dist/ml-dsa-44.min.js +0 -0
- package/dist/ml-dsa-65.deno.js +0 -0
- package/dist/ml-dsa-65.min.js +0 -0
- package/dist/ml-dsa-87.deno.js +0 -0
- package/dist/ml-dsa-87.min.js +0 -0
- package/dist/ml-kem-1024.deno.js +0 -0
- package/dist/ml-kem-1024.min.js +0 -0
- package/dist/ml-kem-512.deno.js +0 -0
- package/dist/ml-kem-512.min.js +0 -0
- package/dist/ml-kem-768.deno.js +0 -0
- package/dist/ml-kem-768.min.js +0 -0
- package/dist/ntru-hps-2048-509.deno.js +0 -0
- package/dist/ntru-hps-2048-509.min.js +0 -0
- package/dist/ntru-hps-2048-677.deno.js +0 -0
- package/dist/ntru-hps-2048-677.min.js +0 -0
- package/dist/ntru-hps-4096-1229.deno.js +0 -0
- package/dist/ntru-hps-4096-1229.min.js +0 -0
- package/dist/ntru-hps-4096-821.deno.js +0 -0
- package/dist/ntru-hps-4096-821.min.js +0 -0
- package/dist/ntru-hrss-1373.deno.js +0 -0
- package/dist/ntru-hrss-1373.min.js +0 -0
- package/dist/ntru-hrss-701.deno.js +0 -0
- package/dist/ntru-hrss-701.min.js +0 -0
- package/dist/ov-iii-pkc-skc.deno.js +0 -0
- package/dist/ov-iii-pkc-skc.min.js +0 -0
- package/dist/ov-iii-pkc.deno.js +0 -0
- package/dist/ov-iii-pkc.min.js +0 -0
- package/dist/ov-iii.deno.js +0 -0
- package/dist/ov-iii.min.js +0 -0
- package/dist/ov-ip-pkc-skc.deno.js +0 -0
- package/dist/ov-ip-pkc-skc.min.js +0 -0
- package/dist/ov-ip-pkc.deno.js +0 -0
- package/dist/ov-ip-pkc.min.js +0 -0
- package/dist/ov-ip.deno.js +0 -0
- package/dist/ov-ip.min.js +0 -0
- package/dist/ov-is-pkc-skc.deno.js +0 -0
- package/dist/ov-is-pkc-skc.min.js +0 -0
- package/dist/ov-is-pkc.deno.js +0 -0
- package/dist/ov-is-pkc.min.js +0 -0
- package/dist/ov-is.deno.js +0 -0
- package/dist/ov-is.min.js +0 -0
- package/dist/ov-v-pkc-skc.deno.js +0 -0
- package/dist/ov-v-pkc-skc.min.js +0 -0
- package/dist/ov-v-pkc.deno.js +0 -0
- package/dist/ov-v-pkc.min.js +0 -0
- package/dist/ov-v.deno.js +0 -0
- package/dist/ov-v.min.js +0 -0
- package/dist/slh-dsa-sha2-128f.deno.js +0 -0
- package/dist/slh-dsa-sha2-128f.min.js +0 -0
- package/dist/slh-dsa-sha2-128s.deno.js +0 -0
- package/dist/slh-dsa-sha2-128s.min.js +0 -0
- package/dist/slh-dsa-sha2-192f.deno.js +0 -0
- package/dist/slh-dsa-sha2-192f.min.js +0 -0
- package/dist/slh-dsa-sha2-192s.deno.js +0 -0
- package/dist/slh-dsa-sha2-192s.min.js +0 -0
- package/dist/slh-dsa-sha2-256f.deno.js +0 -0
- package/dist/slh-dsa-sha2-256f.min.js +0 -0
- package/dist/slh-dsa-sha2-256s.deno.js +0 -0
- package/dist/slh-dsa-sha2-256s.min.js +0 -0
- package/dist/slh-dsa-shake-128f.deno.js +0 -0
- package/dist/slh-dsa-shake-128f.min.js +0 -0
- package/dist/slh-dsa-shake-128s.deno.js +0 -0
- package/dist/slh-dsa-shake-128s.min.js +0 -0
- package/dist/slh-dsa-shake-192f.deno.js +0 -0
- package/dist/slh-dsa-shake-192f.min.js +0 -0
- package/dist/slh-dsa-shake-192s.deno.js +0 -0
- package/dist/slh-dsa-shake-192s.min.js +0 -0
- package/dist/slh-dsa-shake-256f.deno.js +0 -0
- package/dist/slh-dsa-shake-256f.min.js +0 -0
- package/dist/slh-dsa-shake-256s.deno.js +0 -0
- package/dist/slh-dsa-shake-256s.min.js +0 -0
- package/dist/snova-24-5-4-esk.deno.js +0 -0
- package/dist/snova-24-5-4-esk.min.js +0 -0
- package/dist/snova-24-5-4-shake-esk.deno.js +0 -0
- package/dist/snova-24-5-4-shake-esk.min.js +0 -0
- package/dist/snova-24-5-4-shake.deno.js +0 -0
- package/dist/snova-24-5-4-shake.min.js +0 -0
- package/dist/snova-24-5-4.deno.js +0 -0
- package/dist/snova-24-5-4.min.js +0 -0
- package/dist/snova-24-5-5.deno.js +0 -0
- package/dist/snova-24-5-5.min.js +0 -0
- package/dist/snova-25-8-3.deno.js +0 -0
- package/dist/snova-25-8-3.min.js +0 -0
- package/dist/snova-29-6-5.deno.js +0 -0
- package/dist/snova-29-6-5.min.js +0 -0
- package/dist/snova-37-17-2.deno.js +0 -0
- package/dist/snova-37-17-2.min.js +0 -0
- package/dist/snova-37-8-4.deno.js +0 -0
- package/dist/snova-37-8-4.min.js +0 -0
- package/dist/snova-49-11-3.deno.js +0 -0
- package/dist/snova-49-11-3.min.js +0 -0
- package/dist/snova-56-25-2.deno.js +0 -0
- package/dist/snova-56-25-2.min.js +0 -0
- package/dist/snova-60-10-4.deno.js +0 -0
- package/dist/snova-60-10-4.min.js +0 -0
- package/dist/sntrup761.deno.js +0 -0
- package/dist/sntrup761.min.js +0 -0
- package/package.json +108 -0
- package/src/algorithms/kem/classic-mceliece/classic-mceliece-348864.js +336 -0
- package/src/algorithms/kem/classic-mceliece/classic-mceliece-348864f.js +336 -0
- package/src/algorithms/kem/classic-mceliece/classic-mceliece-460896.js +336 -0
- package/src/algorithms/kem/classic-mceliece/classic-mceliece-460896f.js +336 -0
- package/src/algorithms/kem/classic-mceliece/classic-mceliece-6688128.js +336 -0
- package/src/algorithms/kem/classic-mceliece/classic-mceliece-6688128f.js +336 -0
- package/src/algorithms/kem/classic-mceliece/classic-mceliece-6960119.js +336 -0
- package/src/algorithms/kem/classic-mceliece/classic-mceliece-6960119f.js +336 -0
- package/src/algorithms/kem/classic-mceliece/classic-mceliece-8192128.js +336 -0
- package/src/algorithms/kem/classic-mceliece/classic-mceliece-8192128f.js +336 -0
- package/src/algorithms/kem/frodokem/efrodokem-1344-aes.js +366 -0
- package/src/algorithms/kem/frodokem/efrodokem-1344-shake.js +366 -0
- package/src/algorithms/kem/frodokem/efrodokem-640-aes.js +366 -0
- package/src/algorithms/kem/frodokem/efrodokem-640-shake.js +366 -0
- package/src/algorithms/kem/frodokem/efrodokem-976-aes.js +366 -0
- package/src/algorithms/kem/frodokem/efrodokem-976-shake.js +366 -0
- package/src/algorithms/kem/frodokem/frodokem-1344-aes.js +366 -0
- package/src/algorithms/kem/frodokem/frodokem-1344-shake.js +366 -0
- package/src/algorithms/kem/frodokem/frodokem-640-aes.js +366 -0
- package/src/algorithms/kem/frodokem/frodokem-640-shake.js +366 -0
- package/src/algorithms/kem/frodokem/frodokem-976-aes.js +366 -0
- package/src/algorithms/kem/frodokem/frodokem-976-shake.js +366 -0
- package/src/algorithms/kem/hqc/hqc-128.js +366 -0
- package/src/algorithms/kem/hqc/hqc-192.js +366 -0
- package/src/algorithms/kem/hqc/hqc-256.js +366 -0
- package/src/algorithms/kem/kyber/kyber-1024.js +349 -0
- package/src/algorithms/kem/kyber/kyber-512.js +347 -0
- package/src/algorithms/kem/kyber/kyber-768.js +348 -0
- package/src/algorithms/kem/ml-kem/ml-kem-1024.js +345 -0
- package/src/algorithms/kem/ml-kem/ml-kem-512.js +345 -0
- package/src/algorithms/kem/ml-kem/ml-kem-768.js +344 -0
- package/src/algorithms/kem/ntru/ntru-hps-2048-509.js +366 -0
- package/src/algorithms/kem/ntru/ntru-hps-2048-677.js +366 -0
- package/src/algorithms/kem/ntru/ntru-hps-4096-1229.js +366 -0
- package/src/algorithms/kem/ntru/ntru-hps-4096-821.js +366 -0
- package/src/algorithms/kem/ntru/ntru-hrss-1373.js +366 -0
- package/src/algorithms/kem/ntru/ntru-hrss-701.js +366 -0
- package/src/algorithms/kem/ntru/sntrup761.js +367 -0
- package/src/algorithms/sig/cross/cross-rsdp-128-balanced.js +391 -0
- package/src/algorithms/sig/cross/cross-rsdp-128-fast.js +391 -0
- package/src/algorithms/sig/cross/cross-rsdp-128-small.js +391 -0
- package/src/algorithms/sig/cross/cross-rsdp-192-balanced.js +391 -0
- package/src/algorithms/sig/cross/cross-rsdp-192-fast.js +391 -0
- package/src/algorithms/sig/cross/cross-rsdp-192-small.js +391 -0
- package/src/algorithms/sig/cross/cross-rsdp-256-balanced.js +391 -0
- package/src/algorithms/sig/cross/cross-rsdp-256-fast.js +391 -0
- package/src/algorithms/sig/cross/cross-rsdp-256-small.js +391 -0
- package/src/algorithms/sig/cross/cross-rsdpg-128-balanced.js +391 -0
- package/src/algorithms/sig/cross/cross-rsdpg-128-fast.js +391 -0
- package/src/algorithms/sig/cross/cross-rsdpg-128-small.js +391 -0
- package/src/algorithms/sig/cross/cross-rsdpg-192-balanced.js +391 -0
- package/src/algorithms/sig/cross/cross-rsdpg-192-fast.js +391 -0
- package/src/algorithms/sig/cross/cross-rsdpg-192-small.js +391 -0
- package/src/algorithms/sig/cross/cross-rsdpg-256-balanced.js +391 -0
- package/src/algorithms/sig/cross/cross-rsdpg-256-fast.js +391 -0
- package/src/algorithms/sig/cross/cross-rsdpg-256-small.js +391 -0
- package/src/algorithms/sig/falcon/falcon-1024.js +378 -0
- package/src/algorithms/sig/falcon/falcon-512.js +379 -0
- package/src/algorithms/sig/falcon/falcon-padded-1024.js +380 -0
- package/src/algorithms/sig/falcon/falcon-padded-512.js +380 -0
- package/src/algorithms/sig/mayo/mayo-1.js +390 -0
- package/src/algorithms/sig/mayo/mayo-2.js +390 -0
- package/src/algorithms/sig/mayo/mayo-3.js +390 -0
- package/src/algorithms/sig/mayo/mayo-5.js +390 -0
- package/src/algorithms/sig/ml-dsa/ml-dsa-44.js +338 -0
- package/src/algorithms/sig/ml-dsa/ml-dsa-65.js +338 -0
- package/src/algorithms/sig/ml-dsa/ml-dsa-87.js +338 -0
- package/src/algorithms/sig/slh-dsa/slh-dsa-sha2-128f.js +367 -0
- package/src/algorithms/sig/slh-dsa/slh-dsa-sha2-128s.js +367 -0
- package/src/algorithms/sig/slh-dsa/slh-dsa-sha2-192f.js +367 -0
- package/src/algorithms/sig/slh-dsa/slh-dsa-sha2-192s.js +367 -0
- package/src/algorithms/sig/slh-dsa/slh-dsa-sha2-256f.js +367 -0
- package/src/algorithms/sig/slh-dsa/slh-dsa-sha2-256s.js +367 -0
- package/src/algorithms/sig/slh-dsa/slh-dsa-shake-128f.js +367 -0
- package/src/algorithms/sig/slh-dsa/slh-dsa-shake-128s.js +367 -0
- package/src/algorithms/sig/slh-dsa/slh-dsa-shake-192f.js +367 -0
- package/src/algorithms/sig/slh-dsa/slh-dsa-shake-192s.js +367 -0
- package/src/algorithms/sig/slh-dsa/slh-dsa-shake-256f.js +367 -0
- package/src/algorithms/sig/slh-dsa/slh-dsa-shake-256s.js +367 -0
- package/src/algorithms/sig/snova/snova-24-5-4-esk.js +391 -0
- package/src/algorithms/sig/snova/snova-24-5-4-shake-esk.js +391 -0
- package/src/algorithms/sig/snova/snova-24-5-4-shake.js +391 -0
- package/src/algorithms/sig/snova/snova-24-5-4.js +391 -0
- package/src/algorithms/sig/snova/snova-24-5-5.js +391 -0
- package/src/algorithms/sig/snova/snova-25-8-3.js +391 -0
- package/src/algorithms/sig/snova/snova-29-6-5.js +391 -0
- package/src/algorithms/sig/snova/snova-37-17-2.js +391 -0
- package/src/algorithms/sig/snova/snova-37-8-4.js +391 -0
- package/src/algorithms/sig/snova/snova-49-11-3.js +391 -0
- package/src/algorithms/sig/snova/snova-56-25-2.js +391 -0
- package/src/algorithms/sig/snova/snova-60-10-4.js +391 -0
- package/src/algorithms/sig/uov/ov-iii-pkc-skc.js +390 -0
- package/src/algorithms/sig/uov/ov-iii-pkc.js +390 -0
- package/src/algorithms/sig/uov/ov-iii.js +390 -0
- package/src/algorithms/sig/uov/ov-ip-pkc-skc.js +390 -0
- package/src/algorithms/sig/uov/ov-ip-pkc.js +390 -0
- package/src/algorithms/sig/uov/ov-ip.js +390 -0
- package/src/algorithms/sig/uov/ov-is-pkc-skc.js +390 -0
- package/src/algorithms/sig/uov/ov-is-pkc.js +390 -0
- package/src/algorithms/sig/uov/ov-is.js +390 -0
- package/src/algorithms/sig/uov/ov-v-pkc-skc.js +390 -0
- package/src/algorithms/sig/uov/ov-v-pkc.js +390 -0
- package/src/algorithms/sig/uov/ov-v.js +390 -0
- package/src/cli/algorithms.js +254 -0
- package/src/cli/commands/info.js +35 -0
- package/src/cli/commands/kem.js +91 -0
- package/src/cli/commands/list.js +30 -0
- package/src/cli/commands/sig.js +98 -0
- package/src/cli/index.js +86 -0
- package/src/cli/io.js +147 -0
- package/src/cli/parser.js +64 -0
- package/src/core/errors.js +75 -0
- package/src/core/validation.js +28 -0
- package/src/index.js +164 -0
- package/src/kem.js +60 -0
- package/src/sig.js +87 -0
- package/src/types/algorithms.d.ts +1543 -0
- package/src/types/errors.d.ts +60 -0
- package/src/types/index.d.ts +9 -0
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview SNOVA-24-5-4-SHAKE signature algorithm implementation
|
|
3
|
+
* @module algorithms/sig/snova/snova-24-5-4-shake
|
|
4
|
+
* @description
|
|
5
|
+
* SNOVA-24-5-4-SHAKE is a multivariate quadratic signature scheme from the SNOVA family.
|
|
6
|
+
* This is the SHAKE variant.
|
|
7
|
+
*
|
|
8
|
+
* Key features:
|
|
9
|
+
* - Multivariate quadratic cryptography
|
|
10
|
+
* - Security Level 1 (128-bit classical, quantum-resistant)
|
|
11
|
+
* - Compact secret key (48 bytes)
|
|
12
|
+
* - SHAKE-based hash function
|
|
13
|
+
* - Compact signatures (248 bytes)
|
|
14
|
+
*
|
|
15
|
+
* @see {@link https://snova.pqclab.org/} - SNOVA specification
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import { LibOQSError, LibOQSInitError, LibOQSOperationError, LibOQSValidationError } from '../../../core/errors.js';
|
|
19
|
+
import { isUint8Array } from '../../../core/validation.js';
|
|
20
|
+
|
|
21
|
+
// Dynamic module loading for cross-runtime compatibility
|
|
22
|
+
async function loadModule() {
|
|
23
|
+
const isDeno = typeof Deno !== 'undefined';
|
|
24
|
+
const modulePath = isDeno
|
|
25
|
+
? `../../../../dist/snova-24-5-4-shake.deno.js`
|
|
26
|
+
: `../../../../dist/snova-24-5-4-shake.min.js`;
|
|
27
|
+
|
|
28
|
+
const module = await import(modulePath);
|
|
29
|
+
return module.default;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* SNOVA-24-5-4-SHAKE-INFO algorithm constants and metadata
|
|
34
|
+
* @type {{readonly name: 'SNOVA-24-5-4-SHAKE', readonly identifier: 'SNOVA_24_5_4_SHAKE', readonly type: 'sig', readonly securityLevel: 1, readonly standardized: false, readonly description: string, readonly keySize: {readonly publicKey: 1016, readonly secretKey: 48, readonly signature: 248}}}
|
|
35
|
+
*/
|
|
36
|
+
export const SNOVA_24_5_4_SHAKE_INFO = {
|
|
37
|
+
name: 'SNOVA-24-5-4-SHAKE',
|
|
38
|
+
identifier: 'SNOVA_24_5_4_SHAKE',
|
|
39
|
+
type: 'sig',
|
|
40
|
+
securityLevel: 1,
|
|
41
|
+
standardized: false,
|
|
42
|
+
description: 'SNOVA-24-5-4-SHAKE multivariate signature scheme (NIST Level 1, 128-bit quantum security, SHAKE variant)',
|
|
43
|
+
keySize: {
|
|
44
|
+
publicKey: 1016,
|
|
45
|
+
secretKey: 48,
|
|
46
|
+
signature: 248
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Factory function to create a SNOVA-24-5-4-SHAKE signature instance
|
|
52
|
+
*
|
|
53
|
+
* @async
|
|
54
|
+
* @function createSnova2454Shake
|
|
55
|
+
* @returns {Promise<Snova2454Shake>} Initialized SNOVA-24-5-4-SHAKE instance
|
|
56
|
+
* @throws {LibOQSInitError} If module initialization fails
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* import { createSnova2454Shake } from '@oqs/liboqs-js';
|
|
60
|
+
*
|
|
61
|
+
* const sig = await createSnova2454Shake();
|
|
62
|
+
* const { publicKey, secretKey } = sig.generateKeyPair();
|
|
63
|
+
* sig.destroy();
|
|
64
|
+
*/
|
|
65
|
+
export async function createSnova2454Shake() {
|
|
66
|
+
const moduleFactory = await loadModule();
|
|
67
|
+
const wasmModule = await moduleFactory();
|
|
68
|
+
wasmModule._OQS_init();
|
|
69
|
+
|
|
70
|
+
const algoName = SNOVA_24_5_4_SHAKE_INFO.identifier;
|
|
71
|
+
const nameLen = wasmModule.lengthBytesUTF8(algoName);
|
|
72
|
+
const namePtr = wasmModule._malloc(nameLen + 1);
|
|
73
|
+
wasmModule.stringToUTF8(algoName, namePtr, nameLen + 1);
|
|
74
|
+
|
|
75
|
+
const sigPtr = wasmModule._OQS_SIG_new(namePtr);
|
|
76
|
+
wasmModule._free(namePtr);
|
|
77
|
+
|
|
78
|
+
if (!sigPtr) {
|
|
79
|
+
throw new LibOQSInitError('SNOVA-24-5-4-SHAKE', 'Failed to create SIG instance');
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return new Snova2454Shake(wasmModule, sigPtr);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* SNOVA-24-5-4-SHAKE digital signature wrapper class
|
|
87
|
+
*
|
|
88
|
+
* @class Snova2454Shake
|
|
89
|
+
* @description
|
|
90
|
+
* High-level wrapper for SNOVA-24-5-4-SHAKE signature operations. Provides secure key generation,
|
|
91
|
+
* signing, and verification with automatic memory management.
|
|
92
|
+
*
|
|
93
|
+
* Memory Management:
|
|
94
|
+
* - All WASM memory is managed internally
|
|
95
|
+
* - Call destroy() when finished to free resources
|
|
96
|
+
* - Do not use instance after calling destroy()
|
|
97
|
+
*
|
|
98
|
+
* @example
|
|
99
|
+
* const sig = await createSnova2454Shake();
|
|
100
|
+
*
|
|
101
|
+
* // Generate keypair
|
|
102
|
+
* const { publicKey, secretKey } = sig.generateKeyPair();
|
|
103
|
+
*
|
|
104
|
+
* // Sign message
|
|
105
|
+
* const message = new TextEncoder().encode('Hello, quantum world!');
|
|
106
|
+
* const signature = sig.sign(message, secretKey);
|
|
107
|
+
*
|
|
108
|
+
* // Verify signature
|
|
109
|
+
* const isValid = sig.verify(message, signature, publicKey);
|
|
110
|
+
*
|
|
111
|
+
* // Cleanup
|
|
112
|
+
* sig.destroy();
|
|
113
|
+
*/
|
|
114
|
+
export class Snova2454Shake {
|
|
115
|
+
/** @type {Object} @private */ #wasmModule;
|
|
116
|
+
/** @type {number} @private */ #sigPtr;
|
|
117
|
+
/** @type {boolean} @private */ #destroyed = false;
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* @private
|
|
121
|
+
* @constructor
|
|
122
|
+
* @param {Object} wasmModule - Emscripten WASM module
|
|
123
|
+
* @param {number} sigPtr - Pointer to OQS_SIG structure
|
|
124
|
+
*/
|
|
125
|
+
constructor(wasmModule, sigPtr) {
|
|
126
|
+
this.#wasmModule = wasmModule;
|
|
127
|
+
this.#sigPtr = sigPtr;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Generate a new SNOVA-24-5-4-SHAKE keypair
|
|
132
|
+
*
|
|
133
|
+
* @async
|
|
134
|
+
* @returns {{publicKey: Uint8Array, secretKey: Uint8Array}}
|
|
135
|
+
* @throws {LibOQSError} If instance is destroyed
|
|
136
|
+
* @throws {LibOQSOperationError} If key generation fails
|
|
137
|
+
*
|
|
138
|
+
* @example
|
|
139
|
+
* const { publicKey, secretKey } = sig.generateKeyPair();
|
|
140
|
+
* console.log('Public key:', publicKey.length); // 1016 bytes
|
|
141
|
+
* console.log('Secret key:', secretKey.length); // 48 bytes
|
|
142
|
+
*/
|
|
143
|
+
generateKeyPair() {
|
|
144
|
+
this.#checkDestroyed();
|
|
145
|
+
|
|
146
|
+
const publicKey = new Uint8Array(SNOVA_24_5_4_SHAKE_INFO.keySize.publicKey);
|
|
147
|
+
const secretKey = new Uint8Array(SNOVA_24_5_4_SHAKE_INFO.keySize.secretKey);
|
|
148
|
+
|
|
149
|
+
const publicKeyPtr = this.#wasmModule._malloc(publicKey.length);
|
|
150
|
+
const secretKeyPtr = this.#wasmModule._malloc(secretKey.length);
|
|
151
|
+
|
|
152
|
+
try {
|
|
153
|
+
const result = this.#wasmModule._OQS_SIG_keypair(this.#sigPtr, publicKeyPtr, secretKeyPtr);
|
|
154
|
+
|
|
155
|
+
if (result !== 0) {
|
|
156
|
+
throw new LibOQSOperationError('generateKeyPair', 'SNOVA-24-5-4-SHAKE', 'Key generation failed');
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
publicKey.set(this.#wasmModule.HEAPU8.subarray(publicKeyPtr, publicKeyPtr + publicKey.length));
|
|
160
|
+
secretKey.set(this.#wasmModule.HEAPU8.subarray(secretKeyPtr, secretKeyPtr + secretKey.length));
|
|
161
|
+
|
|
162
|
+
return { publicKey, secretKey };
|
|
163
|
+
} finally {
|
|
164
|
+
this.#wasmModule._free(publicKeyPtr);
|
|
165
|
+
this.#wasmModule._free(secretKeyPtr);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Sign a message using the secret key
|
|
171
|
+
*
|
|
172
|
+
* @async
|
|
173
|
+
* @param {Uint8Array} message - Message to sign (arbitrary length)
|
|
174
|
+
* @param {Uint8Array} secretKey - Secret key for signing (48 bytes)
|
|
175
|
+
* @returns {Uint8Array} Digital signature (up to 248 bytes)
|
|
176
|
+
* @throws {LibOQSError} If instance is destroyed
|
|
177
|
+
* @throws {LibOQSValidationError} If inputs are invalid
|
|
178
|
+
* @throws {LibOQSOperationError} If signing fails
|
|
179
|
+
*
|
|
180
|
+
* @example
|
|
181
|
+
* const message = new TextEncoder().encode('Hello!');
|
|
182
|
+
* const signature = sig.sign(message, secretKey);
|
|
183
|
+
* console.log('Signature:', signature.length); // 248 bytes
|
|
184
|
+
*/
|
|
185
|
+
sign(message, secretKey) {
|
|
186
|
+
this.#checkDestroyed();
|
|
187
|
+
this.#validateMessage(message);
|
|
188
|
+
this.#validateSecretKey(secretKey);
|
|
189
|
+
|
|
190
|
+
const signature = new Uint8Array(SNOVA_24_5_4_SHAKE_INFO.keySize.signature);
|
|
191
|
+
const sigPtr = this.#wasmModule._malloc(signature.length);
|
|
192
|
+
const sigLenPtr = this.#wasmModule._malloc(8); // size_t
|
|
193
|
+
const msgPtr = this.#wasmModule._malloc(message.length);
|
|
194
|
+
const skPtr = this.#wasmModule._malloc(secretKey.length);
|
|
195
|
+
|
|
196
|
+
try {
|
|
197
|
+
this.#wasmModule.HEAPU8.set(message, msgPtr);
|
|
198
|
+
this.#wasmModule.HEAPU8.set(secretKey, skPtr);
|
|
199
|
+
this.#wasmModule.setValue(sigLenPtr, signature.length, 'i64');
|
|
200
|
+
|
|
201
|
+
const result = this.#wasmModule._OQS_SIG_sign(
|
|
202
|
+
this.#sigPtr,
|
|
203
|
+
sigPtr,
|
|
204
|
+
sigLenPtr,
|
|
205
|
+
msgPtr,
|
|
206
|
+
message.length,
|
|
207
|
+
skPtr
|
|
208
|
+
);
|
|
209
|
+
|
|
210
|
+
if (result !== 0) {
|
|
211
|
+
throw new LibOQSOperationError('sign', 'SNOVA-24-5-4-SHAKE', 'Signing failed');
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
const actualSigLen = this.#wasmModule.getValue(sigLenPtr, 'i32');
|
|
215
|
+
const actualSignature = new Uint8Array(actualSigLen);
|
|
216
|
+
actualSignature.set(this.#wasmModule.HEAPU8.subarray(sigPtr, sigPtr + actualSigLen));
|
|
217
|
+
|
|
218
|
+
return actualSignature;
|
|
219
|
+
} finally {
|
|
220
|
+
this.#wasmModule._free(sigPtr);
|
|
221
|
+
this.#wasmModule._free(sigLenPtr);
|
|
222
|
+
this.#wasmModule._free(msgPtr);
|
|
223
|
+
this.#wasmModule._free(skPtr);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Verify a signature against a message using the public key
|
|
229
|
+
*
|
|
230
|
+
* @async
|
|
231
|
+
* @param {Uint8Array} message - Original message that was signed
|
|
232
|
+
* @param {Uint8Array} signature - Signature to verify
|
|
233
|
+
* @param {Uint8Array} publicKey - Public key for verification (1016 bytes)
|
|
234
|
+
* @returns {boolean} True if signature is valid, false otherwise
|
|
235
|
+
* @throws {LibOQSError} If instance is destroyed
|
|
236
|
+
* @throws {LibOQSValidationError} If inputs are invalid
|
|
237
|
+
*
|
|
238
|
+
* @example
|
|
239
|
+
* const isValid = sig.verify(message, signature, publicKey);
|
|
240
|
+
* if (isValid) {
|
|
241
|
+
* console.log('Signature is valid!');
|
|
242
|
+
* }
|
|
243
|
+
*/
|
|
244
|
+
verify(message, signature, publicKey) {
|
|
245
|
+
this.#checkDestroyed();
|
|
246
|
+
this.#validateMessage(message);
|
|
247
|
+
this.#validateSignature(signature);
|
|
248
|
+
this.#validatePublicKey(publicKey);
|
|
249
|
+
|
|
250
|
+
const msgPtr = this.#wasmModule._malloc(message.length);
|
|
251
|
+
const sigPtr = this.#wasmModule._malloc(signature.length);
|
|
252
|
+
const pkPtr = this.#wasmModule._malloc(publicKey.length);
|
|
253
|
+
|
|
254
|
+
try {
|
|
255
|
+
this.#wasmModule.HEAPU8.set(message, msgPtr);
|
|
256
|
+
this.#wasmModule.HEAPU8.set(signature, sigPtr);
|
|
257
|
+
this.#wasmModule.HEAPU8.set(publicKey, pkPtr);
|
|
258
|
+
|
|
259
|
+
const result = this.#wasmModule._OQS_SIG_verify(
|
|
260
|
+
this.#sigPtr,
|
|
261
|
+
msgPtr,
|
|
262
|
+
message.length,
|
|
263
|
+
sigPtr,
|
|
264
|
+
signature.length,
|
|
265
|
+
pkPtr
|
|
266
|
+
);
|
|
267
|
+
|
|
268
|
+
return result === 0;
|
|
269
|
+
} finally {
|
|
270
|
+
this.#wasmModule._free(msgPtr);
|
|
271
|
+
this.#wasmModule._free(sigPtr);
|
|
272
|
+
this.#wasmModule._free(pkPtr);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Free WASM resources
|
|
278
|
+
*
|
|
279
|
+
* @description
|
|
280
|
+
* Releases all WASM memory associated with this instance.
|
|
281
|
+
* The instance cannot be used after calling destroy().
|
|
282
|
+
*
|
|
283
|
+
* @example
|
|
284
|
+
* sig.destroy();
|
|
285
|
+
* // sig is now unusable
|
|
286
|
+
*/
|
|
287
|
+
destroy() {
|
|
288
|
+
if (!this.#destroyed && this.#sigPtr) {
|
|
289
|
+
this.#wasmModule._OQS_SIG_free(this.#sigPtr);
|
|
290
|
+
this.#sigPtr = null;
|
|
291
|
+
this.#destroyed = true;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/**
|
|
296
|
+
* Enables automatic cleanup via `using` declarations
|
|
297
|
+
* @example
|
|
298
|
+
* using instance = await create...();
|
|
299
|
+
* // automatically cleaned up at end of scope
|
|
300
|
+
*/
|
|
301
|
+
[Symbol.dispose]() {
|
|
302
|
+
this.destroy();
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
/**
|
|
306
|
+
* Get algorithm information
|
|
307
|
+
*
|
|
308
|
+
* @readonly
|
|
309
|
+
* @returns {typeof SNOVA_24_5_4_SHAKE_INFO} Algorithm metadata
|
|
310
|
+
*
|
|
311
|
+
* @example
|
|
312
|
+
* console.log(sig.info.name); // 'SNOVA-24-5-4-SHAKE'
|
|
313
|
+
* console.log(sig.info.securityLevel); // 1
|
|
314
|
+
* console.log(sig.info.keySize); // { publicKey: 1016, secretKey: 48, signature: 248 }
|
|
315
|
+
*/
|
|
316
|
+
get info() {
|
|
317
|
+
return SNOVA_24_5_4_SHAKE_INFO;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/**
|
|
321
|
+
* @private
|
|
322
|
+
* @throws {LibOQSError} If instance is destroyed
|
|
323
|
+
*/
|
|
324
|
+
#checkDestroyed() {
|
|
325
|
+
if (this.#destroyed) {
|
|
326
|
+
throw new LibOQSError('Instance has been destroyed', 'SNOVA-24-5-4-SHAKE');
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
/**
|
|
331
|
+
* @private
|
|
332
|
+
* @param {Uint8Array} message
|
|
333
|
+
* @throws {LibOQSValidationError} If message is invalid
|
|
334
|
+
*/
|
|
335
|
+
#validateMessage(message) {
|
|
336
|
+
if (!ArrayBuffer.isView(message) || message.constructor.name !== 'Uint8Array') {
|
|
337
|
+
throw new LibOQSValidationError(
|
|
338
|
+
'Message must be Uint8Array',
|
|
339
|
+
'SNOVA-24-5-4-SHAKE'
|
|
340
|
+
);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
/**
|
|
345
|
+
* @private
|
|
346
|
+
* @param {Uint8Array} publicKey
|
|
347
|
+
* @throws {LibOQSValidationError} If public key size is invalid
|
|
348
|
+
*/
|
|
349
|
+
#validatePublicKey(publicKey) {
|
|
350
|
+
if (!isUint8Array(publicKey) || publicKey.length !== SNOVA_24_5_4_SHAKE_INFO.keySize.publicKey) {
|
|
351
|
+
throw new LibOQSValidationError(
|
|
352
|
+
`Invalid public key: expected ${SNOVA_24_5_4_SHAKE_INFO.keySize.publicKey} bytes, got ${publicKey?.length ?? 'null'}`,
|
|
353
|
+
'SNOVA-24-5-4-SHAKE'
|
|
354
|
+
);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
/**
|
|
359
|
+
* @private
|
|
360
|
+
* @param {Uint8Array} secretKey
|
|
361
|
+
* @throws {LibOQSValidationError} If secret key size is invalid
|
|
362
|
+
*/
|
|
363
|
+
#validateSecretKey(secretKey) {
|
|
364
|
+
if (!isUint8Array(secretKey) || secretKey.length !== SNOVA_24_5_4_SHAKE_INFO.keySize.secretKey) {
|
|
365
|
+
throw new LibOQSValidationError(
|
|
366
|
+
`Invalid secret key: expected ${SNOVA_24_5_4_SHAKE_INFO.keySize.secretKey} bytes, got ${secretKey?.length ?? 'null'}`,
|
|
367
|
+
'SNOVA-24-5-4-SHAKE'
|
|
368
|
+
);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
/**
|
|
373
|
+
* @private
|
|
374
|
+
* @param {Uint8Array} signature
|
|
375
|
+
* @throws {LibOQSValidationError} If signature is invalid
|
|
376
|
+
*/
|
|
377
|
+
#validateSignature(signature) {
|
|
378
|
+
if (!isUint8Array(signature)) {
|
|
379
|
+
throw new LibOQSValidationError(
|
|
380
|
+
'Signature must be Uint8Array',
|
|
381
|
+
'SNOVA-24-5-4-SHAKE'
|
|
382
|
+
);
|
|
383
|
+
}
|
|
384
|
+
if (signature.length === 0 || signature.length > SNOVA_24_5_4_SHAKE_INFO.keySize.signature) {
|
|
385
|
+
throw new LibOQSValidationError(
|
|
386
|
+
`Invalid signature length: expected up to ${SNOVA_24_5_4_SHAKE_INFO.keySize.signature} bytes, got ${signature.length}`,
|
|
387
|
+
'SNOVA-24-5-4-SHAKE'
|
|
388
|
+
);
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
}
|