@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 CROSS-rsdpg-192-balanced signature algorithm implementation
|
|
3
|
+
* @module algorithms/sig/cross/cross-rsdpg-192-balanced
|
|
4
|
+
* @description
|
|
5
|
+
* CROSS-rsdpg-192-balanced is a code-based signature scheme providing NIST security level 3.
|
|
6
|
+
* It offers balanced tradeoff between signature size and signing/verification speed.
|
|
7
|
+
*
|
|
8
|
+
* Key features:
|
|
9
|
+
* - Balanced performance profile
|
|
10
|
+
* - Security Level 3 (192-bit classical, quantum-resistant)
|
|
11
|
+
* - Variable-length signatures
|
|
12
|
+
* - Code-based cryptography (restricted syndrome decoding problem)
|
|
13
|
+
*
|
|
14
|
+
* @see {@link https://www.cross-crypto.com/} - CROSS specification
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { LibOQSError, LibOQSInitError, LibOQSOperationError, LibOQSValidationError } from '../../../core/errors.js';
|
|
18
|
+
import { isUint8Array } from '../../../core/validation.js';
|
|
19
|
+
|
|
20
|
+
// Dynamic module loading for cross-runtime compatibility
|
|
21
|
+
async function loadModule() {
|
|
22
|
+
const isDeno = typeof Deno !== 'undefined';
|
|
23
|
+
const modulePath = isDeno
|
|
24
|
+
? `../../../../dist/cross-rsdpg-192-balanced.deno.js`
|
|
25
|
+
: `../../../../dist/cross-rsdpg-192-balanced.min.js`;
|
|
26
|
+
|
|
27
|
+
const module = await import(modulePath);
|
|
28
|
+
return module.default;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* CROSS-RSDPG-192-BALANCED-INFO algorithm constants and metadata
|
|
33
|
+
* @type {{readonly name: 'CROSS-rsdpg-192-balanced', readonly identifier: 'CROSS-rsdpg-192-balanced', readonly type: 'sig', readonly securityLevel: 3, readonly standardized: false, readonly description: string, readonly keySize: {readonly publicKey: 83, readonly secretKey: 48, readonly signature: 22464}}}
|
|
34
|
+
*/
|
|
35
|
+
export const CROSS_RSDPG_192_BALANCED_INFO = {
|
|
36
|
+
name: 'CROSS-rsdpg-192-balanced',
|
|
37
|
+
identifier: 'CROSS-rsdpg-192-balanced',
|
|
38
|
+
type: 'sig',
|
|
39
|
+
securityLevel: 3,
|
|
40
|
+
standardized: false,
|
|
41
|
+
description: 'CROSS-rsdpg-192-balanced code-based signature (NIST Level 3, 192-bit quantum security, balanced)',
|
|
42
|
+
keySize: {
|
|
43
|
+
publicKey: 83,
|
|
44
|
+
secretKey: 48,
|
|
45
|
+
signature: 22464
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Factory function to create a CROSS-rsdpg-192-balanced signature instance
|
|
51
|
+
*
|
|
52
|
+
* @async
|
|
53
|
+
* @function createCrossRsdpg192Balanced
|
|
54
|
+
* @returns {Promise<CrossRsdpg192Balanced>} Initialized CROSS-rsdpg-192-balanced instance
|
|
55
|
+
* @throws {LibOQSInitError} If module initialization fails
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* import { createCrossRsdpg192Balanced } from '@oqs/liboqs-js';
|
|
59
|
+
*
|
|
60
|
+
* const sig = await createCrossRsdpg192Balanced();
|
|
61
|
+
* const { publicKey, secretKey } = sig.generateKeyPair();
|
|
62
|
+
* sig.destroy();
|
|
63
|
+
*/
|
|
64
|
+
export async function createCrossRsdpg192Balanced() {
|
|
65
|
+
const moduleFactory = await loadModule();
|
|
66
|
+
const wasmModule = await moduleFactory();
|
|
67
|
+
wasmModule._OQS_init();
|
|
68
|
+
|
|
69
|
+
const algoName = CROSS_RSDPG_192_BALANCED_INFO.identifier;
|
|
70
|
+
const nameLen = wasmModule.lengthBytesUTF8(algoName);
|
|
71
|
+
const namePtr = wasmModule._malloc(nameLen + 1);
|
|
72
|
+
wasmModule.stringToUTF8(algoName, namePtr, nameLen + 1);
|
|
73
|
+
|
|
74
|
+
const sigPtr = wasmModule._OQS_SIG_new(namePtr);
|
|
75
|
+
wasmModule._free(namePtr);
|
|
76
|
+
|
|
77
|
+
if (!sigPtr) {
|
|
78
|
+
throw new LibOQSInitError('CROSS-rsdpg-192-balanced', 'Failed to create SIG instance');
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
return new CrossRsdpg192Balanced(wasmModule, sigPtr);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* CROSS-rsdpg-192-balanced signature algorithm wrapper class
|
|
86
|
+
*
|
|
87
|
+
* @class CrossRsdpg192Balanced
|
|
88
|
+
* @description
|
|
89
|
+
* High-level wrapper for CROSS-rsdpg-192-balanced signature operations. Provides secure key generation,
|
|
90
|
+
* message signing, and signature verification with automatic memory management.
|
|
91
|
+
*
|
|
92
|
+
* Memory Management:
|
|
93
|
+
* - All WASM memory is managed internally
|
|
94
|
+
* - Call destroy() when finished to free resources
|
|
95
|
+
* - Do not use instance after calling destroy()
|
|
96
|
+
*
|
|
97
|
+
* @example
|
|
98
|
+
* const sig = await createCrossRsdpg192Balanced(moduleFactory);
|
|
99
|
+
*
|
|
100
|
+
* // Generate keypair
|
|
101
|
+
* const { publicKey, secretKey } = sig.generateKeyPair();
|
|
102
|
+
*
|
|
103
|
+
* // Sign message
|
|
104
|
+
* const message = new TextEncoder().encode('Hello, quantum world!');
|
|
105
|
+
* const signature = sig.sign(message, secretKey);
|
|
106
|
+
*
|
|
107
|
+
* // Verify signature
|
|
108
|
+
* const isValid = sig.verify(message, signature, publicKey);
|
|
109
|
+
* console.log('Valid:', isValid); // true
|
|
110
|
+
*
|
|
111
|
+
* // Cleanup
|
|
112
|
+
* sig.destroy();
|
|
113
|
+
*/
|
|
114
|
+
export class CrossRsdpg192Balanced {
|
|
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 CROSS-rsdpg-192-balanced 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); // 83 bytes
|
|
141
|
+
* console.log('Secret key:', secretKey.length); // 48 bytes
|
|
142
|
+
*/
|
|
143
|
+
generateKeyPair() {
|
|
144
|
+
this.#checkDestroyed();
|
|
145
|
+
|
|
146
|
+
const publicKey = new Uint8Array(CROSS_RSDPG_192_BALANCED_INFO.keySize.publicKey);
|
|
147
|
+
const secretKey = new Uint8Array(CROSS_RSDPG_192_BALANCED_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', 'CROSS-rsdpg-192-balanced', '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 with CROSS-rsdpg-192-balanced
|
|
171
|
+
*
|
|
172
|
+
* @async
|
|
173
|
+
* @param {Uint8Array} message - Message to sign (any length)
|
|
174
|
+
* @param {Uint8Array} secretKey - Secret key (48 bytes)
|
|
175
|
+
* @returns {Uint8Array} Signature (variable length, max 22464 bytes)
|
|
176
|
+
* @throws {LibOQSError} If instance is destroyed
|
|
177
|
+
* @throws {LibOQSValidationError} If secret key size is invalid
|
|
178
|
+
* @throws {LibOQSOperationError} If signing fails
|
|
179
|
+
*
|
|
180
|
+
* @example
|
|
181
|
+
* const message = new TextEncoder().encode('Sign this message');
|
|
182
|
+
* const signature = sig.sign(message, secretKey);
|
|
183
|
+
* console.log('Signature length:', signature.length);
|
|
184
|
+
*/
|
|
185
|
+
sign(message, secretKey) {
|
|
186
|
+
this.#checkDestroyed();
|
|
187
|
+
this.#validateMessage(message);
|
|
188
|
+
this.#validateSecretKey(secretKey);
|
|
189
|
+
|
|
190
|
+
const messagePtr = this.#wasmModule._malloc(message.length);
|
|
191
|
+
const secretKeyPtr = this.#wasmModule._malloc(secretKey.length);
|
|
192
|
+
const signaturePtr = this.#wasmModule._malloc(CROSS_RSDPG_192_BALANCED_INFO.keySize.signature);
|
|
193
|
+
const signatureLenPtr = this.#wasmModule._malloc(8);
|
|
194
|
+
|
|
195
|
+
try {
|
|
196
|
+
this.#wasmModule.HEAPU8.set(message, messagePtr);
|
|
197
|
+
this.#wasmModule.HEAPU8.set(secretKey, secretKeyPtr);
|
|
198
|
+
|
|
199
|
+
const result = this.#wasmModule._OQS_SIG_sign(
|
|
200
|
+
this.#sigPtr,
|
|
201
|
+
signaturePtr,
|
|
202
|
+
signatureLenPtr,
|
|
203
|
+
messagePtr,
|
|
204
|
+
message.length,
|
|
205
|
+
secretKeyPtr
|
|
206
|
+
);
|
|
207
|
+
|
|
208
|
+
if (result !== 0) {
|
|
209
|
+
throw new LibOQSOperationError('sign', 'CROSS-rsdpg-192-balanced', 'Signature generation failed');
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
const signatureLen = this.#wasmModule.getValue(signatureLenPtr, 'i32');
|
|
213
|
+
const signature = new Uint8Array(signatureLen);
|
|
214
|
+
signature.set(this.#wasmModule.HEAPU8.subarray(signaturePtr, signaturePtr + signatureLen));
|
|
215
|
+
|
|
216
|
+
return signature;
|
|
217
|
+
} finally {
|
|
218
|
+
this.#wasmModule._free(messagePtr);
|
|
219
|
+
this.#wasmModule._free(secretKeyPtr);
|
|
220
|
+
this.#wasmModule._free(signaturePtr);
|
|
221
|
+
this.#wasmModule._free(signatureLenPtr);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Verify a CROSS-rsdpg-192-balanced signature
|
|
227
|
+
*
|
|
228
|
+
* @async
|
|
229
|
+
* @param {Uint8Array} message - Original message
|
|
230
|
+
* @param {Uint8Array} signature - Signature to verify
|
|
231
|
+
* @param {Uint8Array} publicKey - Public key (83 bytes)
|
|
232
|
+
* @returns {boolean} True if signature is valid, false otherwise
|
|
233
|
+
* @throws {LibOQSError} If instance is destroyed
|
|
234
|
+
* @throws {LibOQSValidationError} If public key or signature size is invalid
|
|
235
|
+
*
|
|
236
|
+
* @example
|
|
237
|
+
* const isValid = sig.verify(message, signature, publicKey);
|
|
238
|
+
* if (isValid) {
|
|
239
|
+
* console.log('Signature is valid!');
|
|
240
|
+
* } else {
|
|
241
|
+
* console.log('Signature verification failed');
|
|
242
|
+
* }
|
|
243
|
+
*/
|
|
244
|
+
verify(message, signature, publicKey) {
|
|
245
|
+
this.#checkDestroyed();
|
|
246
|
+
this.#validateMessage(message);
|
|
247
|
+
this.#validatePublicKey(publicKey);
|
|
248
|
+
this.#validateSignature(signature);
|
|
249
|
+
|
|
250
|
+
const messagePtr = this.#wasmModule._malloc(message.length);
|
|
251
|
+
const signaturePtr = this.#wasmModule._malloc(signature.length);
|
|
252
|
+
const publicKeyPtr = this.#wasmModule._malloc(publicKey.length);
|
|
253
|
+
|
|
254
|
+
try {
|
|
255
|
+
this.#wasmModule.HEAPU8.set(message, messagePtr);
|
|
256
|
+
this.#wasmModule.HEAPU8.set(signature, signaturePtr);
|
|
257
|
+
this.#wasmModule.HEAPU8.set(publicKey, publicKeyPtr);
|
|
258
|
+
|
|
259
|
+
const result = this.#wasmModule._OQS_SIG_verify(
|
|
260
|
+
this.#sigPtr,
|
|
261
|
+
messagePtr,
|
|
262
|
+
message.length,
|
|
263
|
+
signaturePtr,
|
|
264
|
+
signature.length,
|
|
265
|
+
publicKeyPtr
|
|
266
|
+
);
|
|
267
|
+
|
|
268
|
+
return result === 0;
|
|
269
|
+
} finally {
|
|
270
|
+
this.#wasmModule._free(messagePtr);
|
|
271
|
+
this.#wasmModule._free(signaturePtr);
|
|
272
|
+
this.#wasmModule._free(publicKeyPtr);
|
|
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 CROSS_RSDPG_192_BALANCED_INFO} Algorithm metadata
|
|
310
|
+
*
|
|
311
|
+
* @example
|
|
312
|
+
* console.log(sig.info.name); // 'CROSS-rsdpg-192-balanced'
|
|
313
|
+
* console.log(sig.info.securityLevel); // 3
|
|
314
|
+
* console.log(sig.info.keySize); // { publicKey: 83, secretKey: 48, signature: 22464 }
|
|
315
|
+
*/
|
|
316
|
+
get info() {
|
|
317
|
+
return CROSS_RSDPG_192_BALANCED_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', 'CROSS-rsdpg-192-balanced');
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
/**
|
|
331
|
+
* @private
|
|
332
|
+
* @param {Uint8Array} message
|
|
333
|
+
* @throws {LibOQSValidationError} If message is invalid
|
|
334
|
+
*/
|
|
335
|
+
#validateMessage(message) {
|
|
336
|
+
if (!isUint8Array(message)) {
|
|
337
|
+
throw new LibOQSValidationError(
|
|
338
|
+
'Message must be Uint8Array',
|
|
339
|
+
'CROSS-rsdpg-192-balanced'
|
|
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 !== CROSS_RSDPG_192_BALANCED_INFO.keySize.publicKey) {
|
|
351
|
+
throw new LibOQSValidationError(
|
|
352
|
+
`Invalid public key: expected ${CROSS_RSDPG_192_BALANCED_INFO.keySize.publicKey} bytes, got ${publicKey?.length ?? 'null'}`,
|
|
353
|
+
'CROSS-rsdpg-192-balanced'
|
|
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 !== CROSS_RSDPG_192_BALANCED_INFO.keySize.secretKey) {
|
|
365
|
+
throw new LibOQSValidationError(
|
|
366
|
+
`Invalid secret key: expected ${CROSS_RSDPG_192_BALANCED_INFO.keySize.secretKey} bytes, got ${secretKey?.length ?? 'null'}`,
|
|
367
|
+
'CROSS-rsdpg-192-balanced'
|
|
368
|
+
);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
/**
|
|
373
|
+
* @private
|
|
374
|
+
* @param {Uint8Array} signature
|
|
375
|
+
* @throws {LibOQSValidationError} If signature size is invalid
|
|
376
|
+
*/
|
|
377
|
+
#validateSignature(signature) {
|
|
378
|
+
if (!isUint8Array(signature)) {
|
|
379
|
+
throw new LibOQSValidationError(
|
|
380
|
+
'Signature must be Uint8Array',
|
|
381
|
+
'CROSS-rsdpg-192-balanced'
|
|
382
|
+
);
|
|
383
|
+
}
|
|
384
|
+
if (signature.length === 0 || signature.length > CROSS_RSDPG_192_BALANCED_INFO.keySize.signature) {
|
|
385
|
+
throw new LibOQSValidationError(
|
|
386
|
+
`Invalid signature length: expected up to ${CROSS_RSDPG_192_BALANCED_INFO.keySize.signature} bytes, got ${signature.length}`,
|
|
387
|
+
'CROSS-rsdpg-192-balanced'
|
|
388
|
+
);
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
}
|