From e06d2e28699428fbcc135c388516883bbb71f170 Mon Sep 17 00:00:00 2001 From: Per Nilsson Date: Sun, 20 Sep 2026 20:39:42 +0200 Subject: [PATCH 1/2] ml-dsa: offload private matrix storage one row at a time --- .github/workflows/ml-dsa.yml | 5 ++++ ml-dsa/CHANGELOG.md | 5 ++++ ml-dsa/README.md | 13 ++++++++++ ml-dsa/src/algebra.rs | 25 +++++++++++++++--- ml-dsa/src/ntt.rs | 5 ++-- ml-dsa/src/sampling.rs | 4 +-- ml-dsa/tests/stack.rs | 49 ++++++++++++++++++++++++++++++++++++ 7 files changed, 99 insertions(+), 7 deletions(-) create mode 100644 ml-dsa/tests/stack.rs diff --git a/.github/workflows/ml-dsa.yml b/.github/workflows/ml-dsa.yml index 8076cf65..1759a48d 100644 --- a/.github/workflows/ml-dsa.yml +++ b/.github/workflows/ml-dsa.yml @@ -39,6 +39,11 @@ jobs: toolchain: ${{ matrix.rust }} - run: cargo build --benches - run: cargo build --benches --all-features + - name: Unoptimized small-stack regression + run: cargo test --all-features --test stack + env: + CARGO_PROFILE_DEV_OPT_LEVEL: 0 + CARGO_PROFILE_TEST_OPT_LEVEL: 0 - run: cargo test --release - run: cargo test --all-features --release - run: cargo test --no-default-features --release diff --git a/ml-dsa/CHANGELOG.md b/ml-dsa/CHANGELOG.md index f50e0060..32e8bb23 100644 --- a/ml-dsa/CHANGELOG.md +++ b/ml-dsa/CHANGELOG.md @@ -5,6 +5,11 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased +### Fixed +- Construct and clone expanded matrices one row at a time with `alloc`, reducing + stack usage without changing the public lattice types or constructors. + ## 0.1.1 (2026-06-05) ### Fixed - Enable `module-lattice/alloc` when `alloc` feature is enabled ([#1365]) diff --git a/ml-dsa/README.md b/ml-dsa/README.md index 97952e90..eca52e12 100644 --- a/ml-dsa/README.md +++ b/ml-dsa/README.md @@ -14,6 +14,19 @@ Pure Rust implementation of the Module-Lattice-Based Digital Signature Standard ML-DSA was formerly known as [CRYSTALS-Dilithium]. +## Memory usage + +With the `alloc` feature, expanded matrices use private storage backed by one +`MaybeBox` allocation per row. Sampling and cloning do not assemble a complete +inline matrix before heap offload. Without `alloc`, the rows remain inline. +The public `module-lattice` types and their constructors are unchanged. + +Individual vectors and other intermediate values still use stack space. The +stack regression covers key construction, cloning, verification-key decoding, +signing, and verification for all three parameter sets on 512 KiB worker stacks, +including builds with optimization disabled. This is a tested configuration, +not a portable maximum stack requirement. + ## ⚠️ Security Warning The implementation contained in this crate has never been independently audited! diff --git a/ml-dsa/src/algebra.rs b/ml-dsa/src/algebra.rs index e9c918dd..25fb16fc 100644 --- a/ml-dsa/src/algebra.rs +++ b/ml-dsa/src/algebra.rs @@ -1,9 +1,10 @@ +use core::ops::Mul; use ctutils::{CtEq, CtGt, CtLt, CtSelect}; use hybrid_array::{ - ArraySize, + Array, ArraySize, typenum::{Shleft, U1, U13, Unsigned}, }; -use module_lattice::{Field, Truncate}; +use module_lattice::{Field, MaybeBox, Truncate}; module_lattice::define_field!(BaseField, u32, u64, u128, 8_380_417); @@ -14,7 +15,25 @@ pub(crate) type Polynomial = module_lattice::Polynomial; pub(crate) type Vector = module_lattice::Vector; pub(crate) type NttPolynomial = module_lattice::NttPolynomial; pub(crate) type NttVector = module_lattice::NttVector; -pub(crate) type NttMatrix = module_lattice::NttMatrix; + +/// Private matrix storage which offloads each row before constructing the next one. +/// Without `alloc`, `MaybeBox` keeps the rows inline. +#[derive(Clone, Debug, PartialEq)] +pub(crate) struct NttMatrix(Array>, K>); + +impl NttMatrix { + pub(crate) fn from_fn(mut f: impl FnMut(usize) -> NttVector) -> Self { + Self(Array::from_fn(|i| MaybeBox::new(f(i)))) + } +} + +impl Mul<&NttVector> for &NttMatrix { + type Output = NttVector; + + fn mul(self, rhs: &NttVector) -> Self::Output { + NttVector::new(self.0.iter().map(|row| &**row * rhs).collect()) + } +} // We require modular reduction for three moduli: q, 2^d, and 2 * gamma2. All three of these are // greater than sqrt(q), which means that a number reduced mod q will always be less than M^2, diff --git a/ml-dsa/src/ntt.rs b/ml-dsa/src/ntt.rs index 0d0b8b86..63fcb42a 100644 --- a/ml-dsa/src/ntt.rs +++ b/ml-dsa/src/ntt.rs @@ -250,11 +250,12 @@ mod test { #[test] fn ntt_matrix() { // Verify matrix multiplication by a vector - let a: NttMatrix = NttMatrix::new(Array([ + let rows = [ NttVector::new(Array([const_ntt(1), const_ntt(2)])), NttVector::new(Array([const_ntt(3), const_ntt(4)])), NttVector::new(Array([const_ntt(5), const_ntt(6)])), - ])); + ]; + let a: NttMatrix = NttMatrix::from_fn(|i| rows[i].clone()); let v_in: NttVector = NttVector::new(Array([const_ntt(1), const_ntt(2)])); let v_out: NttVector = NttVector::new(Array([const_ntt(5), const_ntt(11), const_ntt(17)])); diff --git a/ml-dsa/src/sampling.rs b/ml-dsa/src/sampling.rs index 8983eb88..c3cce72d 100644 --- a/ml-dsa/src/sampling.rs +++ b/ml-dsa/src/sampling.rs @@ -172,11 +172,11 @@ fn rej_bounded_poly(rho: &[u8], eta: Eta, r: u16) -> Polynomial { // Algorithm 32 ExpandA pub(crate) fn expand_a(rho: &[u8]) -> NttMatrix { - NttMatrix::new(Array::from_fn(|r| { + NttMatrix::from_fn(|r| { NttVector::new(Array::from_fn(|s| { rej_ntt_poly(rho, Truncate::truncate(r), Truncate::truncate(s)) })) - })) + }) } // Algorithm 33 ExpandS diff --git a/ml-dsa/tests/stack.rs b/ml-dsa/tests/stack.rs new file mode 100644 index 00000000..1a0926f7 --- /dev/null +++ b/ml-dsa/tests/stack.rs @@ -0,0 +1,49 @@ +//! Regressions for stack usage with heap offload enabled. +//! +//! Run with `CARGO_PROFILE_DEV_OPT_LEVEL=0 CARGO_PROFILE_TEST_OPT_LEVEL=0` +//! as well as in release mode: optimized builds can hide construction temporaries. + +#![cfg(feature = "alloc")] + +use ml_dsa::{Keypair, MlDsa44, MlDsa65, MlDsa87, SigningKey, VerifyingKey}; + +macro_rules! small_stack { + ($name:ident, $params:ty) => { + #[test] + fn $name() { + let (cloned, public, decoded) = std::thread::Builder::new() + .stack_size(512 * 1024) + .spawn(|| { + let key = SigningKey::<$params>::from_seed(&[7; 32].into()); + let cloned = key.clone(); + drop(key); + let public = cloned.verifying_key(); + let encoded = public.encode(); + let decoded = VerifyingKey::<$params>::decode(&encoded); + (cloned, public, decoded) + }) + .expect("create construction worker") + .join() + .expect("construction worker panicked"); + + std::thread::Builder::new() + .stack_size(512 * 1024) + .spawn(move || { + let signature = cloned + .expanded_key() + .sign_deterministic(b"message", b"context") + .expect("sign"); + assert!(decoded.verify_with_context(b"message", b"context", &signature)); + assert!(!decoded.verify_with_context(b"changed", b"context", &signature)); + assert_eq!(public, decoded); + }) + .expect("create small-stack worker") + .join() + .expect("small-stack worker panicked"); + } + }; +} + +small_stack!(ml_dsa_44_small_stack, MlDsa44); +small_stack!(ml_dsa_65_small_stack, MlDsa65); +small_stack!(ml_dsa_87_small_stack, MlDsa87); From a49fe4996e409876aee2b4aa1381ebc4b2349b90 Mon Sep 17 00:00:00 2001 From: Per Nilsson Date: Wed, 23 Sep 2026 22:21:32 +0200 Subject: [PATCH 2/2] Update Cargo dependencies --- Cargo.lock | 185 ++++++++++++++++++++++++++++------------------------- 1 file changed, 98 insertions(+), 87 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7306b6a2..4ed3e17c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 4 [[package]] name = "aes" -version = "0.9.1" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1fc76eaeac4c9164506c466d4ffdd8ec9d0c5bf57ee97177c4d8eceb3a0e138" +checksum = "35f0f96ce78e38c3dc6d8948aa8163d06385be74000f3c7a95bf1eef35d3ea32" dependencies = [ "cipher", "cpubits", @@ -15,9 +15,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" dependencies = [ "memchr", ] @@ -126,9 +126,9 @@ checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" [[package]] name = "bitflags" -version = "2.13.1" +version = "2.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" +checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" [[package]] name = "blobby" @@ -165,15 +165,15 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cfg-if" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" +checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" [[package]] name = "chacha20" -version = "0.10.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81" +checksum = "65c35e4b699c7e15ccbe7ee35c005e4fc0a278d22238a2857e6ce2dadeda1b06" dependencies = [ "cfg-if", "cipher", @@ -221,18 +221,18 @@ dependencies = [ [[package]] name = "clap" -version = "4.6.2" +version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd059f9da4f5c36b3787f65d38ccaab1cc315f07b01f89abc8359ee6a8205011" +checksum = "aa8876b300ab35ba921adea3dfd70157a46249b33f95c9084ae5709785478946" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" -version = "4.6.2" +version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f09628afdcc538b57f3c6341e9c8e9970f18e4a481690a64974d7023bd33548b" +checksum = "ec0797fb7aeb1406c84efac526901f7ec3ead2124f946b494e72879d4b54704d" dependencies = [ "anstyle", "clap_lex", @@ -240,9 +240,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" +checksum = "1c133bc6a41be0d194c306b5506d15e6feeea7b1d6604bd3f8310dfb2ca96486" [[package]] name = "cmov" @@ -273,9 +273,9 @@ checksum = "15b85f9c39137c3a891689859392b1bd49812121d0d61c9caf00d46ed5ce06ae" [[package]] name = "cpufeatures" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +checksum = "5ca28b0ae3115b884660db4118d803791fd6756b6e88f39c0f3f7859060d7566" dependencies = [ "libc", ] @@ -321,9 +321,9 @@ checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" [[package]] name = "crossbeam-deque" -version = "0.8.7" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb" +checksum = "622f3fc73690be383c7214310406f28a90e6edeadc3cea882f9d71e495b9711a" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -331,18 +331,18 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.20" +version = "0.9.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f" +checksum = "dc74980687109a3b14c72fd458107bf0baa1da1a1a805e178d15501ba9b86d9d" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.22" +version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" +checksum = "a31eee39dddec8330830986fcd7625edb5a24ec90ea038215273bbc3adb08ac6" [[package]] name = "crunchy" @@ -409,9 +409,9 @@ dependencies = [ [[package]] name = "der" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a69dedd701da44b0536442edf09c81a64b0ab97a7a4a5e3d1971f00027cbc63d" +checksum = "a878c850e9e421b20262e9b41f9c860e4785fa07541c266b62ff9d1ef998a80a" dependencies = [ "const-oid", "der_derive", @@ -427,7 +427,7 @@ checksum = "59600e2c2d636fde9b65e99cc6445ac770c63d3628195ff39932b8d6d7409903" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -508,9 +508,9 @@ dependencies = [ [[package]] name = "either" -version = "1.16.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" +checksum = "252afb9ae5eaa683babdc6a068b3f5726eb19e05070c731f9b2a23a7c3e8ed34" [[package]] name = "elliptic-curve" @@ -559,9 +559,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" [[package]] name = "ff" @@ -581,21 +581,21 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "futures-core" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" [[package]] name = "futures-task" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" [[package]] name = "futures-util" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" dependencies = [ "futures-core", "futures-task", @@ -734,9 +734,9 @@ checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "js-sys" -version = "0.3.103" +version = "0.3.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" +checksum = "ce57d20d1ea864ce2ac172ab472d409214f4fd359f0b2a2775abdf522e2af99e" dependencies = [ "cfg-if", "futures-util", @@ -745,9 +745,9 @@ dependencies = [ [[package]] name = "keccak" -version = "0.2.0" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e24a010dd405bd7ed803e5253182815b41bf2e6a80cc3bfc066658e03a198aa" +checksum = "d8f198d1db720e4940b5a493201d199d9f24f568f8f746bd13706243a2f71598" dependencies = [ "cfg-if", "cpufeatures", @@ -755,9 +755,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.186" +version = "0.2.189" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" [[package]] name = "linux-raw-sys" @@ -935,9 +935,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.106" +version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" dependencies = [ "unicode-ident", ] @@ -969,9 +969,9 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quote" -version = "1.0.46" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" dependencies = [ "proc-macro2", ] @@ -1000,9 +1000,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.10.2" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" +checksum = "65c9fb96cbc91e3478eaae79a69fcd3f1ae4ad052e471fe6732fff548984b4af" dependencies = [ "chacha20", "getrandom 0.4.3", @@ -1077,9 +1077,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.16" +version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" dependencies = [ "aho-corasick", "memchr", @@ -1114,9 +1114,9 @@ dependencies = [ [[package]] name = "rustix" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +checksum = "891efababe418670775f199f0d233d84843c227a0949a883ce15b37c78d6629d" dependencies = [ "bitflags", "errno", @@ -1181,9 +1181,9 @@ checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" [[package]] name = "serde" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" dependencies = [ "serde_core", "serde_derive", @@ -1201,29 +1201,29 @@ dependencies = [ [[package]] name = "serde_core" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 3.0.6", ] [[package]] name = "serde_json" -version = "1.0.150" +version = "1.0.151" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" dependencies = [ "itoa", "memchr", @@ -1320,7 +1320,7 @@ dependencies = [ "paste", "pkcs8", "proptest", - "rand 0.10.2", + "rand 0.10.3", "rand_core 0.10.1", "serde", "serde_json", @@ -1386,6 +1386,17 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "tempfile" version = "3.27.0" @@ -1401,22 +1412,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.18" +version = "2.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "2.0.18" +version = "2.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 3.0.6", ] [[package]] @@ -1443,9 +1454,9 @@ checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" [[package]] name = "unicode-ident" -version = "1.0.24" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" +checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954" [[package]] name = "wait-timeout" @@ -1477,9 +1488,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.126" +version = "0.2.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" +checksum = "aecb87a33d3b0c5e3b7aa46336eaf486cffafbd281b195e4c8b80d50df2351bf" dependencies = [ "cfg-if", "once_cell", @@ -1490,9 +1501,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.126" +version = "0.2.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" +checksum = "a690d511e3c1a8b3a55e33511e3c2c00c78415cd23650f32b808627f5696b9ed" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1500,31 +1511,31 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.126" +version = "0.2.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" +checksum = "411e4887f0071ef2d2164a9d5fdf2d20efbef78fccd3a78b0c10a1dc5295e48a" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn", + "syn 3.0.6", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.126" +version = "0.2.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" +checksum = "81941cd78d0c92026c33e5e01312845a4cb1e9af3407f9134b100dd03144103e" dependencies = [ "unicode-ident", ] [[package]] name = "web-sys" -version = "0.3.103" +version = "0.3.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8622dcb61c0bcc9fffa6938bed81210af2da9a7e4a1a834b2e37a59b6dfb6141" +checksum = "9fbddc4a036f00ec4f18c83445bd3115cb306a91da554919a099d9222fe4a7f8" dependencies = [ "js-sys", "wasm-bindgen", @@ -1570,7 +1581,7 @@ dependencies = [ "hybrid-array", "pkcs8", "postcard", - "rand 0.10.2", + "rand 0.10.3", "serde_json", "serdect", "sha2", @@ -1584,22 +1595,22 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.54" +version = "0.8.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7cbbc0a705a0fd05cc3676525980d2bf5a9bc4adac6d6475209a7887cf59d19" +checksum = "d35102a9f36d089ccae9e4c6802bc118be4487b80aaffc0ab4e0cf5ce92d2873" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.54" +version = "0.8.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e817b7b52d0c7358d3246da9d69935ebb18116b2b102b4230dac079b4862f5" +checksum = "146c01f5ab44258da43cf276c74a2763db2ff3969c9c652c3f2de07041d0b2bc" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]]