quantum-resistant-rustykey 0.10.0 → 0.10.1
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/README.md +18 -16
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -13,15 +13,15 @@ npm i quantum-resistant-rustykey
|
|
|
13
13
|
## Implementation status: Pre-production (stable for testing)
|
|
14
14
|
|
|
15
15
|
- ***Recommendation***: Await v1.0.0 (following security audit) for production/regulated deployment.
|
|
16
|
-
- includes NIST approved
|
|
17
|
-
- **
|
|
18
|
-
- **
|
|
19
|
-
- **
|
|
20
|
-
- **ML-KEM**
|
|
16
|
+
- includes NIST approved and NIST "on-ramp" round 3 candidate SQISign
|
|
17
|
+
- **SQIsign** Level 1, Level 3, Level 5 NOT approved yet by NIST, refer [cose-sqisign] (https://datatracker.ietf.org/doc/draft-mott-cose-sqisign/)
|
|
18
|
+
- **ML-DSA** ML-DSA-65, ML-DSA-87
|
|
19
|
+
- **FN-DSA** FN-DSA-512, FN-DSA-1024
|
|
20
|
+
- **ML-KEM** 512, 768, 1024 using [mlkem-native](https://github.com/pq-code-package/mlkem-native).
|
|
21
21
|
|
|
22
|
-
###
|
|
22
|
+
### SQISign is 'NIST-on-ramp' only yet highly suitable for constrained-development use
|
|
23
23
|
*TLDR; to help hurdle the "silent" barrier to post-quantum adoption: 1024-byte buffer limit in many existing FIDO2/WebAuthn implementations*
|
|
24
|
-
-
|
|
24
|
+
- support our IETF standards track draft and help move things along with SQISign [cose-sqisign](https://www.ietf.org/archive/id/draft-mott-cose-sqisign-03.html)
|
|
25
25
|
|
|
26
26
|
#### WebAuthn PQC Signature size constraints
|
|
27
27
|
Dilithium variants, and Falcon-1024 are physically incompatible with millions of existing FIDO2/WebAuthn authenticators that rely on the CTAP2 1024-byte buffer limit.
|
|
@@ -33,13 +33,13 @@ Dilithium variants, and Falcon-1024 are physically incompatible with millions of
|
|
|
33
33
|
- At roughly 204 bytes, SQIsign is currently the only candidate that offers NIST-level (more accurately NIST-on-ramp-level) security safely within the 1024-byte limit alongside its necessary metadata.
|
|
34
34
|
|
|
35
35
|
#### Critical use case example
|
|
36
|
-
For mission-critical applications like low-latency augmented reality remote telesurgery,
|
|
36
|
+
For constrained-device or mission-critical applications like low-latency augmented reality remote telesurgery, ultra-low latency and hardware-rooted trust are non-negotiable. RustyKey® who financially support this repo and the npm package, required a WASM port of SQIsign specifically as the small signatures is the only PQC option that works with current demanding hardware constraints, with the practical advantage of near-immediate quantum-resistant public key ceremonies without breaking the existing WebAuthn ecosystem.
|
|
37
37
|
|
|
38
38
|
## Broad user-friendly live example testbed and playground
|
|
39
39
|
|
|
40
40
|
Live at **[pqc.rustykey.me](https://pqc.rustykey.me)** — a test environment where general-purpose users and seasoned cryptanalysts can encrypt and decrypt and play, using all three variants of KEM and test WebAuthn implementations using the signature algorithms.
|
|
41
41
|
- lattice-based vs isogeny: run tests to check: Montgomery constant times, the surprising difference in time taken for the various steps
|
|
42
|
-
- all are encouraged to suggest improvements
|
|
42
|
+
- any and all who are interested kicking the tires of SQISign and other PQC algorithms are encouraged to suggest improvements. The playground's goal is to help a wider audience see how PQC works under the hood, find bugs, suggest improvements and help adopt it more quickly without breaking existing infrastructure.
|
|
43
43
|
|
|
44
44
|
## Security assurance and verification
|
|
45
45
|
|
|
@@ -67,11 +67,13 @@ The three parameter sets (512/768/1024) use the same implementation family and d
|
|
|
67
67
|
- This package builds the same source for all three variants by changing only `MLK_CONFIG_PARAMETER_SET` in `wasm/Makefile`.
|
|
68
68
|
- Variant sizes/parameters are defined upstream in `mlkem/mlkem_native.h`.
|
|
69
69
|
|
|
70
|
-
###
|
|
70
|
+
### We predominantly use C, not Rust for our web-assembly (WASM) modules: Why?
|
|
71
71
|
|
|
72
|
-
|
|
72
|
+
It seems all the cool cryptanalyst kids nowadays rely on Rust's proven memory and concurrency safety and high performance without a Garbage Collector. As outlined below, current way forward in this repository: the shipped cryptographic WASM modules will continue to be built via Emscripten from vetted C/C++ upstream code, while Rust/TypeScript will be primarily used for package-level ergonomics and integration layers.
|
|
73
73
|
|
|
74
|
-
|
|
74
|
+
Leaning on Rust is implied in our brand, so this deserves a bit of explanation! Many developers new to web-assembly migrations (i.e. from other languages) don't realize that final WebAssembly (WASM) bytecode looks completely different depending on if we start with C or Rust!
|
|
75
|
+
|
|
76
|
+
RustyKey® current dual approach is a way to balance performance, security-vetted logic, and web compatibility. Some technical factors may make C => emscripten approach acceptable and, in some cases, preferable for post-quantum cryptography:
|
|
75
77
|
|
|
76
78
|
- upstream Reliability: Many NIST-standardized PQC algorithms (like ML-KEM) have highly optimized, audited, and "constant-time" reference implementations written in C. Using C => Emscripten allows RustyKey® to port these vetted "upstream" sources directly, reducing the risk of introducing new implementation bugs during a full rewrite into Rust.
|
|
77
79
|
|
|
@@ -85,7 +87,7 @@ Increasingly, developers favor Rust => wasm-bindgen over C => emscripten for Rus
|
|
|
85
87
|
|
|
86
88
|
- Practical Side-Channel Discipline in Rust is non-trivial: Rust memory safety does not automatically guarantee constant-time behavior. Extra care is still required around branching, indexing, optimizer behavior, allocations, and panic paths, especially when targeting wasm32.
|
|
87
89
|
|
|
88
|
-
- Long-term Strategy: once a Rust implementation reaches parity in test vectors, profiling, and side-channel review, migrating selected modules can reduce FFI complexity. Until then, Emscripten
|
|
90
|
+
- Long-term Strategy: once a Rust implementation reaches parity in test vectors, profiling, and side-channel review, migrating selected modules can reduce FFI complexity. Until then, Emscripten appears to be the lower-risk route for production-adjacent cryptographic primitives.
|
|
89
91
|
|
|
90
92
|
|
|
91
93
|
### Why we offer WASM implementations of SQISign (NIST on-ramp only) alongside established, standards-track Falcon and Dilithium?
|
|
@@ -101,7 +103,7 @@ Increasingly, developers favor Rust => wasm-bindgen over C => emscripten for Rus
|
|
|
101
103
|
- SQISign has smaller signatures: Short Quaternion Isogeny Signatures. This repo and associated npm package is primarily a WASM-based project targeting web or mobile, where signature size is a massive bottleneck for bandwidth.
|
|
102
104
|
|
|
103
105
|
|
|
104
|
-
### How
|
|
106
|
+
### How to independently verify all algorithms and variants
|
|
105
107
|
|
|
106
108
|
From the repository root:
|
|
107
109
|
|
|
@@ -129,7 +131,7 @@ Notes:
|
|
|
129
131
|
- signature algorithms:
|
|
130
132
|
- FN-DSA (Falcon-512, Falcon-1024)
|
|
131
133
|
- ML-DSA (Dilithium variants)
|
|
132
|
-
- SQISign
|
|
134
|
+
- SQISign Team
|
|
133
135
|
- module-lattice-based key-encapsulation mechanism
|
|
134
136
|
- ML-KEM
|
|
135
137
|
- approach adapted from Dmitry Chestnykh's `mlkem-wasm`: https://github.com/dchest/mlkem-wasm
|
|
@@ -362,7 +364,7 @@ async function main() {
|
|
|
362
364
|
```
|
|
363
365
|
|
|
364
366
|
> [!NOTE]
|
|
365
|
-
> **SQIsign Performance**: Level 1 signing is
|
|
367
|
+
> **SQIsign Performance**: Level 1 signing is CPU-intensive (can take seconds to minutes depending on hardware). We recommend "sign-once, verify-many" scenarios for certificates or firmware updates.
|
|
366
368
|
|
|
367
369
|
## Browser example (local)
|
|
368
370
|
|
package/package.json
CHANGED