@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,380 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Falcon-padded-1024 signature algorithm implementation
|
|
3
|
+
* @module algorithms/sig/falcon/falcon-padded-1024
|
|
4
|
+
* @description
|
|
5
|
+
* Falcon-padded-1024 is a variant of Falcon-1024 with constant-size signatures.
|
|
6
|
+
* It provides NIST security level 5 with deterministic signature sizes for easier integration.
|
|
7
|
+
*
|
|
8
|
+
* Key features:
|
|
9
|
+
* - Constant signature size (1280 bytes, always)
|
|
10
|
+
* - Fast verification
|
|
11
|
+
* - Security Level 5 (256-bit classical, quantum-resistant)
|
|
12
|
+
* - No signature size variation
|
|
13
|
+
*
|
|
14
|
+
* @see {@link https://falcon-sign.info/} - Falcon 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/falcon-padded-1024.deno.js`
|
|
25
|
+
: `../../../../dist/falcon-padded-1024.min.js`;
|
|
26
|
+
|
|
27
|
+
const module = await import(modulePath);
|
|
28
|
+
return module.default;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* FALCON-PADDED-1024-INFO algorithm constants and metadata
|
|
33
|
+
* @type {{readonly name: 'Falcon-padded-1024', readonly identifier: 'Falcon-padded-1024', readonly type: 'sig', readonly securityLevel: 5, readonly standardized: false, readonly description: string, readonly keySize: {readonly publicKey: 1793, readonly secretKey: 2305, readonly signature: 1280}}}
|
|
34
|
+
*/
|
|
35
|
+
export const FALCON_PADDED_1024_INFO = {
|
|
36
|
+
name: 'Falcon-padded-1024',
|
|
37
|
+
identifier: 'Falcon-padded-1024',
|
|
38
|
+
type: 'sig',
|
|
39
|
+
securityLevel: 5,
|
|
40
|
+
standardized: false,
|
|
41
|
+
description: 'Falcon-padded-1024 lattice-based signature with constant-size signatures (NIST Level 5)',
|
|
42
|
+
keySize: {
|
|
43
|
+
publicKey: 1793,
|
|
44
|
+
secretKey: 2305,
|
|
45
|
+
signature: 1280
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Factory function to create a Falcon-padded-1024 signature instance
|
|
51
|
+
*
|
|
52
|
+
* @async
|
|
53
|
+
* @function createFalconPadded1024
|
|
54
|
+
* @returns {Promise<FalconPadded1024>} Initialized Falcon-padded-1024 instance
|
|
55
|
+
* @throws {LibOQSInitError} If module initialization fails
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* import { createFalconPadded1024 } from '@oqs/liboqs-js';
|
|
59
|
+
*
|
|
60
|
+
* const sig = await createFalconPadded1024();
|
|
61
|
+
* const { publicKey, secretKey } = sig.generateKeyPair();
|
|
62
|
+
* sig.destroy();
|
|
63
|
+
*/
|
|
64
|
+
export async function createFalconPadded1024() {
|
|
65
|
+
const moduleFactory = await loadModule();
|
|
66
|
+
const wasmModule = await moduleFactory();
|
|
67
|
+
wasmModule._OQS_init();
|
|
68
|
+
|
|
69
|
+
const algoName = FALCON_PADDED_1024_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
|
+
if (!sigPtr) {
|
|
77
|
+
throw new LibOQSInitError('Falcon-padded-1024', 'Failed to create SIG instance');
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return new FalconPadded1024(wasmModule, sigPtr);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Falcon-padded-1024 signature algorithm wrapper class
|
|
85
|
+
*
|
|
86
|
+
* @class FalconPadded1024
|
|
87
|
+
* @description
|
|
88
|
+
* High-level wrapper for Falcon-padded-1024 signature operations. Provides secure key generation,
|
|
89
|
+
* message signing, and signature verification with automatic memory management.
|
|
90
|
+
* Produces constant-size signatures (always 1280 bytes).
|
|
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 createFalconPadded1024();
|
|
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
|
+
* console.log(signature.length); // Always 1280 bytes
|
|
107
|
+
*
|
|
108
|
+
* // Verify signature
|
|
109
|
+
* const isValid = sig.verify(message, signature, publicKey);
|
|
110
|
+
* console.log('Valid:', isValid); // true
|
|
111
|
+
*
|
|
112
|
+
* // Cleanup
|
|
113
|
+
* sig.destroy();
|
|
114
|
+
*/
|
|
115
|
+
export class FalconPadded1024 {
|
|
116
|
+
/** @type {Object} @private */ #wasmModule;
|
|
117
|
+
/** @type {number} @private */ #sigPtr;
|
|
118
|
+
/** @type {boolean} @private */ #destroyed = false;
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* @private
|
|
122
|
+
* @constructor
|
|
123
|
+
* @param {Object} wasmModule - Emscripten WASM module
|
|
124
|
+
* @param {number} sigPtr - Pointer to OQS_SIG structure
|
|
125
|
+
*/
|
|
126
|
+
constructor(wasmModule, sigPtr) {
|
|
127
|
+
this.#wasmModule = wasmModule;
|
|
128
|
+
this.#sigPtr = sigPtr;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Generate a new Falcon-padded-1024 keypair
|
|
133
|
+
*
|
|
134
|
+
* @async
|
|
135
|
+
* @returns {{publicKey: Uint8Array, secretKey: Uint8Array}}
|
|
136
|
+
* @throws {LibOQSError} If instance is destroyed
|
|
137
|
+
* @throws {LibOQSOperationError} If key generation fails
|
|
138
|
+
*
|
|
139
|
+
* @example
|
|
140
|
+
* const { publicKey, secretKey } = sig.generateKeyPair();
|
|
141
|
+
* console.log('Public key:', publicKey.length); // 1793 bytes
|
|
142
|
+
* console.log('Secret key:', secretKey.length); // 2305 bytes
|
|
143
|
+
*/
|
|
144
|
+
generateKeyPair() {
|
|
145
|
+
this.#checkDestroyed();
|
|
146
|
+
|
|
147
|
+
const publicKeyPtr = this.#wasmModule._malloc(FALCON_PADDED_1024_INFO.keySize.publicKey);
|
|
148
|
+
const secretKeyPtr = this.#wasmModule._malloc(FALCON_PADDED_1024_INFO.keySize.secretKey);
|
|
149
|
+
|
|
150
|
+
try {
|
|
151
|
+
const result = this.#wasmModule._OQS_SIG_keypair(this.#sigPtr, publicKeyPtr, secretKeyPtr);
|
|
152
|
+
|
|
153
|
+
if (result !== 0) {
|
|
154
|
+
throw new LibOQSOperationError('generateKeyPair', 'Falcon-padded-1024', 'Key generation failed');
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
const publicKey = new Uint8Array(
|
|
158
|
+
this.#wasmModule.HEAPU8.buffer,
|
|
159
|
+
publicKeyPtr,
|
|
160
|
+
FALCON_PADDED_1024_INFO.keySize.publicKey
|
|
161
|
+
).slice();
|
|
162
|
+
|
|
163
|
+
const secretKey = new Uint8Array(
|
|
164
|
+
this.#wasmModule.HEAPU8.buffer,
|
|
165
|
+
secretKeyPtr,
|
|
166
|
+
FALCON_PADDED_1024_INFO.keySize.secretKey
|
|
167
|
+
).slice();
|
|
168
|
+
|
|
169
|
+
return { publicKey, secretKey };
|
|
170
|
+
} finally {
|
|
171
|
+
this.#wasmModule._free(publicKeyPtr);
|
|
172
|
+
this.#wasmModule._free(secretKeyPtr);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Sign a message with Falcon-padded-1024
|
|
178
|
+
*
|
|
179
|
+
* @async
|
|
180
|
+
* @param {Uint8Array} message - Message to sign (any length)
|
|
181
|
+
* @param {Uint8Array} secretKey - Secret key (2305 bytes)
|
|
182
|
+
* @returns {Uint8Array} Signature (constant 1280 bytes)
|
|
183
|
+
* @throws {LibOQSError} If instance is destroyed
|
|
184
|
+
* @throws {LibOQSValidationError} If secret key size is invalid
|
|
185
|
+
* @throws {LibOQSOperationError} If signing fails
|
|
186
|
+
*
|
|
187
|
+
* @example
|
|
188
|
+
* const message = new TextEncoder().encode('Sign this message');
|
|
189
|
+
* const signature = sig.sign(message, secretKey);
|
|
190
|
+
* console.log('Signature length:', signature.length); // Always 1280 bytes
|
|
191
|
+
*/
|
|
192
|
+
sign(message, secretKey) {
|
|
193
|
+
this.#checkDestroyed();
|
|
194
|
+
this.#validateSecretKey(secretKey);
|
|
195
|
+
|
|
196
|
+
const messagePtr = this.#wasmModule._malloc(message.length);
|
|
197
|
+
const secretKeyPtr = this.#wasmModule._malloc(FALCON_PADDED_1024_INFO.keySize.secretKey);
|
|
198
|
+
const signaturePtr = this.#wasmModule._malloc(FALCON_PADDED_1024_INFO.keySize.signature);
|
|
199
|
+
const signatureLenPtr = this.#wasmModule._malloc(8);
|
|
200
|
+
|
|
201
|
+
try {
|
|
202
|
+
this.#wasmModule.HEAPU8.set(message, messagePtr);
|
|
203
|
+
this.#wasmModule.HEAPU8.set(secretKey, secretKeyPtr);
|
|
204
|
+
|
|
205
|
+
const result = this.#wasmModule._OQS_SIG_sign(
|
|
206
|
+
this.#sigPtr,
|
|
207
|
+
signaturePtr,
|
|
208
|
+
signatureLenPtr,
|
|
209
|
+
messagePtr,
|
|
210
|
+
message.length,
|
|
211
|
+
secretKeyPtr
|
|
212
|
+
);
|
|
213
|
+
|
|
214
|
+
if (result !== 0) {
|
|
215
|
+
throw new LibOQSOperationError('sign', 'Falcon-padded-1024', 'Signature generation failed');
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
const signatureLen = this.#wasmModule.getValue(signatureLenPtr, 'i32');
|
|
219
|
+
|
|
220
|
+
const signature = new Uint8Array(
|
|
221
|
+
this.#wasmModule.HEAPU8.buffer,
|
|
222
|
+
signaturePtr,
|
|
223
|
+
signatureLen
|
|
224
|
+
).slice();
|
|
225
|
+
|
|
226
|
+
return signature;
|
|
227
|
+
} finally {
|
|
228
|
+
this.#wasmModule._free(messagePtr);
|
|
229
|
+
this.#wasmModule._free(secretKeyPtr);
|
|
230
|
+
this.#wasmModule._free(signaturePtr);
|
|
231
|
+
this.#wasmModule._free(signatureLenPtr);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* Verify a Falcon-padded-1024 signature
|
|
237
|
+
*
|
|
238
|
+
* @async
|
|
239
|
+
* @param {Uint8Array} message - Original message
|
|
240
|
+
* @param {Uint8Array} signature - Signature to verify (1280 bytes)
|
|
241
|
+
* @param {Uint8Array} publicKey - Public key (1793 bytes)
|
|
242
|
+
* @returns {boolean} True if signature is valid, false otherwise
|
|
243
|
+
* @throws {LibOQSError} If instance is destroyed
|
|
244
|
+
* @throws {LibOQSValidationError} If public key or signature size is invalid
|
|
245
|
+
*
|
|
246
|
+
* @example
|
|
247
|
+
* const isValid = sig.verify(message, signature, publicKey);
|
|
248
|
+
* if (isValid) {
|
|
249
|
+
* console.log('Signature is valid!');
|
|
250
|
+
* } else {
|
|
251
|
+
* console.log('Signature verification failed');
|
|
252
|
+
* }
|
|
253
|
+
*/
|
|
254
|
+
verify(message, signature, publicKey) {
|
|
255
|
+
this.#checkDestroyed();
|
|
256
|
+
this.#validatePublicKey(publicKey);
|
|
257
|
+
this.#validateSignature(signature);
|
|
258
|
+
|
|
259
|
+
const messagePtr = this.#wasmModule._malloc(message.length);
|
|
260
|
+
const signaturePtr = this.#wasmModule._malloc(signature.length);
|
|
261
|
+
const publicKeyPtr = this.#wasmModule._malloc(FALCON_PADDED_1024_INFO.keySize.publicKey);
|
|
262
|
+
|
|
263
|
+
try {
|
|
264
|
+
this.#wasmModule.HEAPU8.set(message, messagePtr);
|
|
265
|
+
this.#wasmModule.HEAPU8.set(signature, signaturePtr);
|
|
266
|
+
this.#wasmModule.HEAPU8.set(publicKey, publicKeyPtr);
|
|
267
|
+
|
|
268
|
+
const result = this.#wasmModule._OQS_SIG_verify(
|
|
269
|
+
this.#sigPtr,
|
|
270
|
+
messagePtr,
|
|
271
|
+
message.length,
|
|
272
|
+
signaturePtr,
|
|
273
|
+
signature.length,
|
|
274
|
+
publicKeyPtr
|
|
275
|
+
);
|
|
276
|
+
|
|
277
|
+
return result === 0;
|
|
278
|
+
} finally {
|
|
279
|
+
this.#wasmModule._free(messagePtr);
|
|
280
|
+
this.#wasmModule._free(signaturePtr);
|
|
281
|
+
this.#wasmModule._free(publicKeyPtr);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* Free WASM resources
|
|
287
|
+
*
|
|
288
|
+
* @description
|
|
289
|
+
* Releases all WASM memory associated with this instance.
|
|
290
|
+
* The instance cannot be used after calling destroy().
|
|
291
|
+
*
|
|
292
|
+
* @example
|
|
293
|
+
* sig.destroy();
|
|
294
|
+
* // sig is now unusable
|
|
295
|
+
*/
|
|
296
|
+
destroy() {
|
|
297
|
+
if (!this.#destroyed && this.#sigPtr) {
|
|
298
|
+
this.#wasmModule._OQS_SIG_free(this.#sigPtr);
|
|
299
|
+
this.#sigPtr = null;
|
|
300
|
+
this.#destroyed = true;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* Enables automatic cleanup via `using` declarations
|
|
306
|
+
* @example
|
|
307
|
+
* using instance = await create...();
|
|
308
|
+
* // automatically cleaned up at end of scope
|
|
309
|
+
*/
|
|
310
|
+
[Symbol.dispose]() {
|
|
311
|
+
this.destroy();
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
/**
|
|
315
|
+
* Get algorithm information
|
|
316
|
+
*
|
|
317
|
+
* @readonly
|
|
318
|
+
* @returns {typeof FALCON_PADDED_1024_INFO} Algorithm metadata
|
|
319
|
+
*
|
|
320
|
+
* @example
|
|
321
|
+
* console.log(sig.info.name); // 'Falcon-padded-1024'
|
|
322
|
+
* console.log(sig.info.securityLevel); // 5
|
|
323
|
+
* console.log(sig.info.keySize); // { publicKey: 1793, secretKey: 2305, signature: 1280 }
|
|
324
|
+
*/
|
|
325
|
+
get info() {
|
|
326
|
+
return FALCON_PADDED_1024_INFO;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
/**
|
|
330
|
+
* @private
|
|
331
|
+
* @throws {LibOQSError} If instance is destroyed
|
|
332
|
+
*/
|
|
333
|
+
#checkDestroyed() {
|
|
334
|
+
if (this.#destroyed) {
|
|
335
|
+
throw new LibOQSError('Instance has been destroyed', 'Falcon-padded-1024');
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
/**
|
|
340
|
+
* @private
|
|
341
|
+
* @param {Uint8Array} publicKey
|
|
342
|
+
* @throws {LibOQSValidationError} If public key size is invalid
|
|
343
|
+
*/
|
|
344
|
+
#validatePublicKey(publicKey) {
|
|
345
|
+
if (!isUint8Array(publicKey) || publicKey.length !== FALCON_PADDED_1024_INFO.keySize.publicKey) {
|
|
346
|
+
throw new LibOQSValidationError(
|
|
347
|
+
`Invalid public key size: expected ${FALCON_PADDED_1024_INFO.keySize.publicKey} bytes, got ${publicKey.length}`,
|
|
348
|
+
'Falcon-padded-1024'
|
|
349
|
+
);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
/**
|
|
354
|
+
* @private
|
|
355
|
+
* @param {Uint8Array} secretKey
|
|
356
|
+
* @throws {LibOQSValidationError} If secret key size is invalid
|
|
357
|
+
*/
|
|
358
|
+
#validateSecretKey(secretKey) {
|
|
359
|
+
if (!isUint8Array(secretKey) || secretKey.length !== FALCON_PADDED_1024_INFO.keySize.secretKey) {
|
|
360
|
+
throw new LibOQSValidationError(
|
|
361
|
+
`Invalid secret key size: expected ${FALCON_PADDED_1024_INFO.keySize.secretKey} bytes, got ${secretKey.length}`,
|
|
362
|
+
'Falcon-padded-1024'
|
|
363
|
+
);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
/**
|
|
368
|
+
* @private
|
|
369
|
+
* @param {Uint8Array} signature
|
|
370
|
+
* @throws {LibOQSValidationError} If signature size is invalid
|
|
371
|
+
*/
|
|
372
|
+
#validateSignature(signature) {
|
|
373
|
+
if (!isUint8Array(signature) || signature.length !== FALCON_PADDED_1024_INFO.keySize.signature) {
|
|
374
|
+
throw new LibOQSValidationError(
|
|
375
|
+
`Invalid signature size: expected ${FALCON_PADDED_1024_INFO.keySize.signature} bytes, got ${signature.length}`,
|
|
376
|
+
'Falcon-padded-1024'
|
|
377
|
+
);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
}
|