diff --git a/Cargo.lock b/Cargo.lock index f7e5dd5..f622918 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 4 [[package]] name = "addr2line" -version = "0.24.2" +version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +checksum = "59317f77929f0e679d39364702289274de2f0f0b22cbf50b2b8cff2169a0b27a" dependencies = [ "gimli", ] @@ -67,15 +67,6 @@ version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" -[[package]] -name = "ar_archive_writer" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0c269894b6fe5e9d7ada0cf69b5bf847ff35bc25fc271f08e1d080fce80339a" -dependencies = [ - "object 0.32.2", -] - [[package]] name = "arbitrary" version = "1.4.2" @@ -195,6 +186,15 @@ version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +[[package]] +name = "bitmaps" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "031043d04099746d8db04daf1fa424b2bc8bd69d92b25962dcde24da39ab64a2" +dependencies = [ + "typenum", +] + [[package]] name = "block-buffer" version = "0.10.4" @@ -212,9 +212,9 @@ checksum = "dc0b364ead1874514c8c2855ab558056ebfeb775653e7ae45ff72f28f8f3166c" [[package]] name = "bumpalo" -version = "3.19.0" +version = "3.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" dependencies = [ "allocator-api2", ] @@ -225,12 +225,6 @@ version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e" -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - [[package]] name = "bytes" version = "1.11.1" @@ -395,32 +389,53 @@ dependencies = [ "libc", ] +[[package]] +name = "cranelift-assembler-x64" +version = "0.130.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046d4b584c3bb9b5eb500c8f29549bec36be11000f1ba2a927cef3d1a9875691" +dependencies = [ + "cranelift-assembler-x64-meta", +] + +[[package]] +name = "cranelift-assembler-x64-meta" +version = "0.130.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9b194a7870becb1490366fc0ae392ccd188065ff35f8391e77ac659db6fb977" +dependencies = [ + "cranelift-srcgen", +] + [[package]] name = "cranelift-bforest" -version = "0.116.1" +version = "0.130.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e15d04a0ce86cb36ead88ad68cf693ffd6cda47052b9e0ac114bc47fd9cd23c4" +checksum = "bb6a4ab44c6b371e661846b97dab687387a60ac4e2f864e2d4257284aad9e889" dependencies = [ "cranelift-entity", + "wasmtime-internal-core", ] [[package]] name = "cranelift-bitset" -version = "0.116.1" +version = "0.130.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c6e3969a7ce267259ce244b7867c5d3bc9e65b0a87e81039588dfdeaede9f34" +checksum = "b8b7a44150c2f471a94023482bda1902710746e4bed9f9973d60c5a94319b06d" dependencies = [ "serde", "serde_derive", + "wasmtime-internal-core", ] [[package]] name = "cranelift-codegen" -version = "0.116.1" +version = "0.130.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c22032c4cb42558371cf516bb47f26cdad1819d3475c133e93c49f50ebf304e" +checksum = "01b06598133b1dd76758b8b95f8d6747c124124aade50cea96a3d88b962da9fa" dependencies = [ "bumpalo", + "cranelift-assembler-x64", "cranelift-bforest", "cranelift-bitset", "cranelift-codegen-meta", @@ -429,55 +444,63 @@ dependencies = [ "cranelift-entity", "cranelift-isle", "gimli", - "hashbrown 0.14.5", + "hashbrown 0.16.1", + "libm", "log", + "pulley-interpreter", "regalloc2", "rustc-hash", "serde", "smallvec", "target-lexicon 0.13.4", + "wasmtime-internal-core", ] [[package]] name = "cranelift-codegen-meta" -version = "0.116.1" +version = "0.130.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c904bc71c61b27fc57827f4a1379f29de64fe95653b620a3db77d59655eee0b8" +checksum = "6190e2e7bcf0a678da2f715363d34ed530fedf7a2f0ab75edaefef72a70465ff" dependencies = [ + "cranelift-assembler-x64-meta", "cranelift-codegen-shared", + "cranelift-srcgen", + "heck", + "pulley-interpreter", ] [[package]] name = "cranelift-codegen-shared" -version = "0.116.1" +version = "0.130.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40180f5497572f644ce88c255480981ae2ec1d7bb4d8e0c0136a13b87a2f2ceb" +checksum = "f583cf203d1aa8b79560e3b01f929bdacf9070b015eec4ea9c46e22a3f83e4a0" [[package]] name = "cranelift-control" -version = "0.116.1" +version = "0.130.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d132c6d0bd8a489563472afc171759da0707804a65ece7ceb15a8c6d7dd5ef" +checksum = "803159df35cc398ae54473c150b16d6c77e92ab2948be638488de126a3328fbc" dependencies = [ "arbitrary", ] [[package]] name = "cranelift-entity" -version = "0.116.1" +version = "0.130.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b2d0d9618275474fbf679dd018ac6e009acbd6ae6850f6a67be33fb3b00b323" +checksum = "3109e417257082d88087f5bcce677525bdaa8322b88dd7f175ed1a1fd41d546c" dependencies = [ "cranelift-bitset", "serde", "serde_derive", + "wasmtime-internal-core", ] [[package]] name = "cranelift-frontend" -version = "0.116.1" +version = "0.130.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fac41e16729107393174b0c9e3730fb072866100e1e64e80a1a963b2e484d57" +checksum = "14db6b0e0e4994c581092df78d837be2072578f7cb2528f96a6cf895e56dee63" dependencies = [ "cranelift-codegen", "log", @@ -487,21 +510,27 @@ dependencies = [ [[package]] name = "cranelift-isle" -version = "0.116.1" +version = "0.130.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ca20d576e5070044d0a72a9effc2deacf4d6aa650403189d8ea50126483944d" +checksum = "ec66ea5025c7317383699778282ac98741d68444f956e3b1d7b62f12b7216e67" [[package]] name = "cranelift-native" -version = "0.116.1" +version = "0.130.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8dee82f3f1f2c4cba9177f1cc5e350fe98764379bcd29340caa7b01f85076c7" +checksum = "373ade56438e6232619d85678477d0a88a31b3581936e0503e61e96b546b0800" dependencies = [ "cranelift-codegen", "libc", "target-lexicon 0.13.4", ] +[[package]] +name = "cranelift-srcgen" +version = "0.130.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef53619d3cd5c78fd998c6d9420547af26b72e6456f94c2a8a2334cb76b42baa" + [[package]] name = "crc32fast" version = "1.5.0" @@ -811,15 +840,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] -[[package]] -name = "fallible-iterator" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" - [[package]] name = "fancy-regex" version = "0.14.0" @@ -853,6 +876,12 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + [[package]] name = "flate2" version = "1.1.5" @@ -882,9 +911,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "foldhash" -version = "0.1.5" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" [[package]] name = "form_urlencoded" @@ -905,58 +934,81 @@ dependencies = [ "num", ] +[[package]] +name = "futures" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + [[package]] name = "futures-channel" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" dependencies = [ "futures-core", + "futures-sink", ] [[package]] name = "futures-core" -version = "0.3.31" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" + +[[package]] +name = "futures-io" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" + +[[package]] +name = "futures-sink" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" [[package]] name = "futures-task" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" [[package]] name = "futures-util" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" dependencies = [ + "futures-channel", "futures-core", + "futures-io", + "futures-sink", "futures-task", + "memchr", "pin-project-lite", - "pin-utils", -] - -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", + "slab", ] [[package]] name = "fxprof-processed-profile" -version = "0.6.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27d12c0aed7f1e24276a241aadc4cb8ea9f83000f34bc062b7cc2d51e3b0fabd" +checksum = "25234f20a3ec0a962a61770cfe39ecf03cb529a6e474ad8cff025ed497eda557" dependencies = [ "bitflags", "debugid", - "fxhash", + "rustc-hash", "serde", + "serde_derive", "serde_json", ] @@ -1000,11 +1052,12 @@ dependencies = [ [[package]] name = "gimli" -version = "0.31.1" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +checksum = "0bf7f043f89559805f8c7cacc432749b2fa0d0a0a9ee46ce47164ed5ba7f126c" dependencies = [ - "fallible-iterator", + "fnv", + "hashbrown 0.16.1", "indexmap", "stable_deref_trait", ] @@ -1022,28 +1075,26 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.5" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -dependencies = [ - "ahash", -] +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" [[package]] name = "hashbrown" -version = "0.15.5" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" dependencies = [ "foldhash", "serde", + "serde_core", ] [[package]] name = "hashbrown" -version = "0.16.0" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" +checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51" [[package]] name = "heck" @@ -1321,6 +1372,20 @@ dependencies = [ "icu_properties", ] +[[package]] +name = "im-rc" +version = "15.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1955a75fa080c677d3972822ec4bad316169ab1cfc6c257a942c2265dbe5fe" +dependencies = [ + "bitmaps", + "rand_core 0.6.4", + "rand_xoshiro", + "sized-chunks", + "typenum", + "version_check", +] + [[package]] name = "in_toto_attestation" version = "0.1.0" @@ -1337,12 +1402,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.12.0" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", - "hashbrown 0.16.0", + "hashbrown 0.17.0", "serde", "serde_core", ] @@ -1374,18 +1439,18 @@ dependencies = [ [[package]] name = "itertools" -version = "0.12.1" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" dependencies = [ "either", ] [[package]] name = "itertools" -version = "0.13.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" dependencies = [ "either", ] @@ -1518,12 +1583,6 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -[[package]] -name = "leb128" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" - [[package]] name = "leb128fmt" version = "0.1.0" @@ -1698,7 +1757,7 @@ version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -1799,21 +1858,12 @@ dependencies = [ [[package]] name = "object" -version = "0.32.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" -dependencies = [ - "memchr", -] - -[[package]] -name = "object" -version = "0.36.7" +version = "0.38.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +checksum = "271638cd5fa9cca89c4c304675ca658efc4e64a66c716b7cfe1afb4b9611dbbc" dependencies = [ "crc32fast", - "hashbrown 0.15.5", + "hashbrown 0.16.1", "indexmap", "memchr", ] @@ -1860,12 +1910,6 @@ dependencies = [ "sha2", ] -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - [[package]] name = "pem" version = "3.0.6" @@ -1891,6 +1935,16 @@ version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +dependencies = [ + "fixedbitset", + "indexmap", +] + [[package]] name = "phf" version = "0.12.1" @@ -2113,25 +2167,26 @@ dependencies = [ ] [[package]] -name = "psm" -version = "0.1.28" +name = "pulley-interpreter" +version = "43.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d11f2fedc3b7dafdc2851bc52f277377c5473d378859be234bc7ebb593144d01" +checksum = "010dec3755eb61b2f1051ecb3611b718460b7a74c131e474de2af20a845938af" dependencies = [ - "ar_archive_writer", - "cc", + "cranelift-bitset", + "log", + "pulley-macros", + "wasmtime-internal-core", ] [[package]] -name = "pulley-interpreter" -version = "29.0.1" +name = "pulley-macros" +version = "43.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62d95f8575df49a2708398182f49a888cf9dc30210fb1fd2df87c889edcee75d" +checksum = "ad360c32e85ca4b083ac0e2b6856e8f11c3d5060dafa7d5dc57b370857fa3018" dependencies = [ - "cranelift-bitset", - "log", - "sptr", - "wasmtime-math", + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -2263,6 +2318,15 @@ dependencies = [ "getrandom 0.3.4", ] +[[package]] +name = "rand_xoshiro" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa" +dependencies = [ + "rand_core 0.6.4", +] + [[package]] name = "rayon" version = "1.11.0" @@ -2343,9 +2407,9 @@ dependencies = [ [[package]] name = "regalloc2" -version = "0.11.2" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc06e6b318142614e4a48bc725abbf08ff166694835c43c9dae5a9009704639a" +checksum = "952ddbfc6f9f64d006c3efd8c9851a6ba2f2b944ba94730db255d55006e0ffda" dependencies = [ "allocator-api2", "bumpalo", @@ -2522,7 +2586,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys 0.11.0", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -2741,6 +2805,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" +dependencies = [ + "serde_core", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -2837,6 +2910,16 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" +[[package]] +name = "sized-chunks" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16d69225bde7a69b235da73377861095455d298f2b970996eec25ddbb42b3d1e" +dependencies = [ + "bitmaps", + "typenum", +] + [[package]] name = "slab" version = "0.4.11" @@ -2872,12 +2955,6 @@ dependencies = [ "der", ] -[[package]] -name = "sptr" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b9b39299b249ad65f3b7e96443bad61c02ca5cd3589f46cb6d610a0fd6c0d6a" - [[package]] name = "stable_deref_trait" version = "1.2.1" @@ -2943,7 +3020,7 @@ dependencies = [ "getrandom 0.3.4", "once_cell", "rustix 1.1.2", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -3101,11 +3178,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" dependencies = [ "serde", - "serde_spanned", - "toml_datetime", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", "toml_edit", ] +[[package]] +name = "toml" +version = "0.9.12+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" +dependencies = [ + "indexmap", + "serde_core", + "serde_spanned 1.1.1", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 0.7.14", +] + [[package]] name = "toml_datetime" version = "0.6.11" @@ -3115,6 +3207,15 @@ dependencies = [ "serde", ] +[[package]] +name = "toml_datetime" +version = "0.7.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +dependencies = [ + "serde_core", +] + [[package]] name = "toml_edit" version = "0.22.27" @@ -3123,10 +3224,19 @@ checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ "indexmap", "serde", - "serde_spanned", - "toml_datetime", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", "toml_write", - "winnow", + "winnow 0.7.14", +] + +[[package]] +name = "toml_parser" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" +dependencies = [ + "winnow 1.0.1", ] [[package]] @@ -3135,6 +3245,12 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" +[[package]] +name = "toml_writer" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db" + [[package]] name = "tower" version = "0.5.3" @@ -3254,17 +3370,6 @@ dependencies = [ "tracing-serde", ] -[[package]] -name = "trait-variant" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70977707304198400eb4835a78f6a9f928bf41bba420deb8fdb175cd965d77a7" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "try-lock" version = "0.2.5" @@ -3540,34 +3645,55 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "wasm-compose" +version = "0.245.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fd23d12cc95c451c1306db5bc63075fbebb612bb70c53b4237b1ce5bc178343" +dependencies = [ + "anyhow", + "heck", + "im-rc", + "indexmap", + "log", + "petgraph", + "serde", + "serde_derive", + "serde_yaml", + "smallvec", + "wasm-encoder 0.245.1", + "wasmparser 0.245.1", + "wat", +] + [[package]] name = "wasm-encoder" -version = "0.221.3" +version = "0.245.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc8444fe4920de80a4fe5ab564fff2ae58b6b73166b89751f8c6c93509da32e5" +checksum = "3f9dca005e69bf015e45577e415b9af8c67e8ee3c0e38b5b0add5aa92581ed5c" dependencies = [ - "leb128", - "wasmparser 0.221.3", + "leb128fmt", + "wasmparser 0.245.1", ] [[package]] name = "wasm-encoder" -version = "0.241.2" +version = "0.246.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e01164c9dda68301e34fdae536c23ed6fe90ce6d97213ccc171eebbd3d02d6b8" +checksum = "61fb705ce81adde29d2a8e99d87995e39a6e927358c91398f374474746070ef7" dependencies = [ "leb128fmt", - "wasmparser 0.241.2", + "wasmparser 0.246.2", ] [[package]] name = "wasmparser" -version = "0.221.3" +version = "0.245.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d06bfa36ab3ac2be0dee563380147a5b81ba10dd8885d7fbbc9eb574be67d185" +checksum = "4f08c9adee0428b7bddf3890fc27e015ac4b761cc608c822667102b8bfd6995e" dependencies = [ "bitflags", - "hashbrown 0.15.5", + "hashbrown 0.16.1", "indexmap", "semver", "serde", @@ -3575,9 +3701,9 @@ dependencies = [ [[package]] name = "wasmparser" -version = "0.241.2" +version = "0.246.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46d90019b1afd4b808c263e428de644f3003691f243387d30d673211ee0cb8e8" +checksum = "71cde4757396defafd25417cfb36aa3161027d06d865b0c24baaae229aac005d" dependencies = [ "bitflags", "indexmap", @@ -3586,130 +3712,158 @@ dependencies = [ [[package]] name = "wasmprinter" -version = "0.221.3" +version = "0.245.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7343c42a97f2926c7819ff81b64012092ae954c5d83ddd30c9fcdefd97d0b283" +checksum = "5f41517a3716fbb8ccf46daa9c1325f760fcbff5168e75c7392288e410b91ac8" dependencies = [ "anyhow", "termcolor", - "wasmparser 0.221.3", + "wasmparser 0.245.1", ] [[package]] name = "wasmtime" -version = "29.0.1" +version = "43.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11976a250672556d1c4c04c6d5d7656ac9192ac9edc42a4587d6c21460010e69" +checksum = "ce205cd643d661b5ba5ba4717e13730262e8cdbc8f2eacbc7b906d45c1a74026" dependencies = [ "addr2line", - "anyhow", "async-trait", "bitflags", "bumpalo", "cc", "cfg-if", "encoding_rs", + "futures", "fxprof-processed-profile", "gimli", - "hashbrown 0.14.5", - "indexmap", "ittapi", "libc", "log", "mach2", "memfd", - "object 0.36.7", + "object", "once_cell", - "paste", "postcard", - "psm", "pulley-interpreter", "rayon", - "rustix 0.38.44", + "rustix 1.1.2", "semver", "serde", "serde_derive", "serde_json", "smallvec", - "sptr", "target-lexicon 0.13.4", - "trait-variant", - "wasm-encoder 0.221.3", - "wasmparser 0.221.3", - "wasmtime-asm-macros", - "wasmtime-cache", - "wasmtime-component-macro", - "wasmtime-component-util", - "wasmtime-cranelift", + "tempfile", + "wasm-compose", + "wasm-encoder 0.245.1", + "wasmparser 0.245.1", "wasmtime-environ", - "wasmtime-fiber", - "wasmtime-jit-debug", - "wasmtime-jit-icache-coherence", - "wasmtime-math", - "wasmtime-slab", - "wasmtime-versioned-export-macros", - "wasmtime-winch", + "wasmtime-internal-cache", + "wasmtime-internal-component-macro", + "wasmtime-internal-component-util", + "wasmtime-internal-core", + "wasmtime-internal-cranelift", + "wasmtime-internal-fiber", + "wasmtime-internal-jit-debug", + "wasmtime-internal-jit-icache-coherence", + "wasmtime-internal-unwinder", + "wasmtime-internal-versioned-export-macros", + "wasmtime-internal-winch", "wat", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] -name = "wasmtime-asm-macros" -version = "29.0.1" +name = "wasmtime-environ" +version = "43.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f178b0d125201fbe9f75beaf849bd3e511891f9e45ba216a5b620802ccf64f2" +checksum = "0b8b78abf3677d4a0a5db82e5015b4d085ff3a1b8b472cbb8c70d4b769f019ce" dependencies = [ - "cfg-if", + "anyhow", + "cpp_demangle", + "cranelift-bforest", + "cranelift-bitset", + "cranelift-entity", + "gimli", + "hashbrown 0.16.1", + "indexmap", + "log", + "object", + "postcard", + "rustc-demangle", + "semver", + "serde", + "serde_derive", + "sha2", + "smallvec", + "target-lexicon 0.13.4", + "wasm-encoder 0.245.1", + "wasmparser 0.245.1", + "wasmprinter", + "wasmtime-internal-component-util", + "wasmtime-internal-core", ] [[package]] -name = "wasmtime-cache" -version = "29.0.1" +name = "wasmtime-internal-cache" +version = "43.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b1161c8f62880deea07358bc40cceddc019f1c81d46007bc390710b2fe24ffc" +checksum = "8e4fd4103ba413c0da2e636f73490c6c8e446d708cbde7573703941bc3d6a448" dependencies = [ - "anyhow", - "base64 0.21.7", + "base64 0.22.1", "directories-next", "log", "postcard", - "rustix 0.38.44", + "rustix 1.1.2", "serde", "serde_derive", "sha2", - "toml", - "windows-sys 0.59.0", + "toml 0.9.12+spec-1.1.0", + "wasmtime-environ", + "windows-sys 0.61.2", "zstd", ] [[package]] -name = "wasmtime-component-macro" -version = "29.0.1" +name = "wasmtime-internal-component-macro" +version = "43.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d74de6592ed945d0a602f71243982a304d5d02f1e501b638addf57f42d57dfaf" +checksum = "0d3d6914f34be2f9d78d8ee9f422e834dfc204e71ccce697205fae95fed87892" dependencies = [ "anyhow", "proc-macro2", "quote", "syn", - "wasmtime-component-util", - "wasmtime-wit-bindgen", + "wasmtime-internal-component-util", + "wasmtime-internal-wit-bindgen", "wit-parser", ] [[package]] -name = "wasmtime-component-util" -version = "29.0.1" +name = "wasmtime-internal-component-util" +version = "43.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707dc7b3c112ab5a366b30cfe2fb5b2f8e6a0f682f16df96a5ec582bfe6f056e" +checksum = "3751b0616b914fdd87fe1bf804694a078f321b000338e6476bc48a4d6e454f21" [[package]] -name = "wasmtime-cranelift" -version = "29.0.1" +name = "wasmtime-internal-core" +version = "43.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "366be722674d4bf153290fbcbc4d7d16895cc82fb3e869f8d550ff768f9e9e87" +checksum = "22632b187e1b0716f1b9ac57ad29013bed33175fcb19e10bb6896126f82fac67" dependencies = [ "anyhow", + "hashbrown 0.16.1", + "libm", + "serde", +] + +[[package]] +name = "wasmtime-internal-cranelift" +version = "43.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b3ca07b3e0bb3429674b173b5800577719d600774dd81bff58f775c0aaa64ee" +dependencies = [ "cfg-if", "cranelift-codegen", "cranelift-control", @@ -3717,102 +3871,77 @@ dependencies = [ "cranelift-frontend", "cranelift-native", "gimli", - "itertools 0.12.1", + "itertools 0.14.0", "log", - "object 0.36.7", + "object", + "pulley-interpreter", "smallvec", "target-lexicon 0.13.4", - "thiserror 1.0.69", - "wasmparser 0.221.3", + "thiserror 2.0.17", + "wasmparser 0.245.1", "wasmtime-environ", - "wasmtime-versioned-export-macros", + "wasmtime-internal-core", + "wasmtime-internal-unwinder", + "wasmtime-internal-versioned-export-macros", ] [[package]] -name = "wasmtime-environ" -version = "29.0.1" +name = "wasmtime-internal-fiber" +version = "43.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdadc1af7097347aa276a4f008929810f726b5b46946971c660b6d421e9994ad" +checksum = "20c8b2c9704eb1f33ead025ec16038277ccb63d0a14c31e99d5b765d7c36da55" dependencies = [ - "anyhow", - "cpp_demangle", - "cranelift-bitset", - "cranelift-entity", - "gimli", - "indexmap", - "log", - "object 0.36.7", - "postcard", - "rustc-demangle", - "semver", - "serde", - "serde_derive", - "smallvec", - "target-lexicon 0.13.4", - "wasm-encoder 0.221.3", - "wasmparser 0.221.3", - "wasmprinter", - "wasmtime-component-util", -] - -[[package]] -name = "wasmtime-fiber" -version = "29.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccba90d4119f081bca91190485650730a617be1fff5228f8c4757ce133d21117" -dependencies = [ - "anyhow", "cc", "cfg-if", - "rustix 0.38.44", - "wasmtime-asm-macros", - "wasmtime-versioned-export-macros", - "windows-sys 0.59.0", + "libc", + "rustix 1.1.2", + "wasmtime-environ", + "wasmtime-internal-versioned-export-macros", + "windows-sys 0.61.2", ] [[package]] -name = "wasmtime-jit-debug" -version = "29.0.1" +name = "wasmtime-internal-jit-debug" +version = "43.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e7b61488a5ee00c35c8c22de707c36c0aecacf419a3be803a6a2ba5e860f56a" +checksum = "d950310d07391d34369f62c48336ebb14eacbd4d6f772bb5f349c24e838e0664" dependencies = [ - "object 0.36.7", - "rustix 0.38.44", - "wasmtime-versioned-export-macros", + "cc", + "object", + "rustix 1.1.2", + "wasmtime-internal-versioned-export-macros", ] [[package]] -name = "wasmtime-jit-icache-coherence" -version = "29.0.1" +name = "wasmtime-internal-jit-icache-coherence" +version = "43.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec5e8552e01692e6c2e5293171704fed8abdec79d1a6995a0870ab190e5747d1" +checksum = "3606662c156962d096be3127b8b8ae8ee2f8be3f896dad29259ff01ddb64abfd" dependencies = [ - "anyhow", "cfg-if", "libc", - "windows-sys 0.59.0", + "wasmtime-internal-core", + "windows-sys 0.61.2", ] [[package]] -name = "wasmtime-math" -version = "29.0.1" +name = "wasmtime-internal-unwinder" +version = "43.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29210ec2aa25e00f4d54605cedaf080f39ec01a872c5bd520ad04c67af1dde17" +checksum = "75eef0747e52dc545b075f64fd0e0cc237ae738e641266b1970e07e2d744bc32" dependencies = [ - "libm", + "cfg-if", + "cranelift-codegen", + "log", + "object", + "wasmtime-environ", ] [[package]] -name = "wasmtime-slab" -version = "29.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcb5821a96fa04ac14bc7b158bb3d5cd7729a053db5a74dad396cd513a5e5ccf" - -[[package]] -name = "wasmtime-versioned-export-macros" -version = "29.0.1" +name = "wasmtime-internal-versioned-export-macros" +version = "43.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86ff86db216dc0240462de40c8290887a613dddf9685508eb39479037ba97b5b" +checksum = "d8b0a5dab02a8fb527f547855ecc0e05f9fdc3d5bd57b8b080349408f9a6cece" dependencies = [ "proc-macro2", "quote", @@ -3820,29 +3949,30 @@ dependencies = [ ] [[package]] -name = "wasmtime-winch" -version = "29.0.1" +name = "wasmtime-internal-winch" +version = "43.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdbabfb8f20502d5e1d81092b9ead3682ae59988487aafcd7567387b7a43cf8f" +checksum = "8007342bd12ff400293a817973f7ecd6f1d9a8549a53369a9c1af357166f1f1e" dependencies = [ - "anyhow", "cranelift-codegen", "gimli", - "object 0.36.7", + "log", + "object", "target-lexicon 0.13.4", - "wasmparser 0.221.3", - "wasmtime-cranelift", + "wasmparser 0.245.1", "wasmtime-environ", + "wasmtime-internal-cranelift", "winch-codegen", ] [[package]] -name = "wasmtime-wit-bindgen" -version = "29.0.1" +name = "wasmtime-internal-wit-bindgen" +version = "43.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8358319c2dd1e4db79e3c1c5d3a5af84956615343f9f89f4e4996a36816e06e6" +checksum = "7900c3e3c1d6e475bc225d73b02d6d5484815f260022e6964dca9558e50dd01a" dependencies = [ "anyhow", + "bitflags", "heck", "indexmap", "wit-parser", @@ -3850,22 +3980,22 @@ dependencies = [ [[package]] name = "wast" -version = "241.0.2" +version = "246.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63f66e07e2ddf531fef6344dbf94d112df7c2f23ed6ffb10962e711500b8d816" +checksum = "fe3fe8e3bf88ad96d031b4181ddbd64634b17cb0d06dfc3de589ef43591a9a62" dependencies = [ "bumpalo", "leb128fmt", "memchr", "unicode-width", - "wasm-encoder 0.241.2", + "wasm-encoder 0.246.2", ] [[package]] name = "wat" -version = "1.241.2" +version = "1.246.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45f923705c40830af909c5dec2352ec2821202e4a66008194585e1917458a26d" +checksum = "4bd7fda1199b94fff395c2d19a153f05dbe7807630316fa9673367666fd2ad8c" dependencies = [ "wast", ] @@ -3947,7 +4077,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -3958,20 +4088,21 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "winch-codegen" -version = "29.0.1" +version = "43.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f849ef2c5f46cb0a20af4b4487aaa239846e52e2c03f13fa3c784684552859c" +checksum = "eb9f45f7172a2628c8317766e427babc0a400f9d10b1c0f0b0617c5ed5b79de6" dependencies = [ - "anyhow", + "cranelift-assembler-x64", "cranelift-codegen", "gimli", "regalloc2", "smallvec", "target-lexicon 0.13.4", - "thiserror 1.0.69", - "wasmparser 0.221.3", - "wasmtime-cranelift", + "thiserror 2.0.17", + "wasmparser 0.245.1", "wasmtime-environ", + "wasmtime-internal-core", + "wasmtime-internal-cranelift", ] [[package]] @@ -4207,6 +4338,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "winnow" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09dac053f1cd375980747450bfc7250c264eaae0583872e845c0c7cd578872b5" + [[package]] name = "wit-bindgen" version = "0.46.0" @@ -4224,11 +4361,12 @@ checksum = "a374235c3c0dff10537040b437073d09f1e38f13216b5f3cbc809c6226814e5c" [[package]] name = "wit-parser" -version = "0.221.3" +version = "0.245.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "896112579ed56b4a538b07a3d16e562d101ff6265c46b515ce0c701eef16b2ac" +checksum = "330698718e82983499419494dd1e3d7811a457a9bf9f69734e8c5f07a2547929" dependencies = [ "anyhow", + "hashbrown 0.16.1", "id-arena", "indexmap", "log", @@ -4237,7 +4375,7 @@ dependencies = [ "serde_derive", "serde_json", "unicode-xid", - "wasmparser 0.221.3", + "wasmparser 0.245.1", ] [[package]] @@ -4280,7 +4418,7 @@ dependencies = [ "thiserror 2.0.17", "time", "tokio", - "toml", + "toml 0.8.23", "tracing", "tracing-subscriber", "tss-esapi", diff --git a/deny.toml b/deny.toml index 667dff1..6354a9f 100644 --- a/deny.toml +++ b/deny.toml @@ -7,16 +7,8 @@ db-path = "~/.cargo/advisory-db" db-urls = ["https://github.com/rustsec/advisory-db"] # Transitive advisories we cannot fix directly — tracked for upstream resolution ignore = [ - # wasmtime (optional 'runtime' feature — not in production CLI builds) - "RUSTSEC-2025-0046", # wasmtime: fd_renumber host panic - "RUSTSEC-2025-0118", # wasmtime: unsound shared memory API - "RUSTSEC-2026-0006", # wasmtime: f64.copysign segfault on x86-64 - "RUSTSEC-2026-0020", # wasmtime: WASI resource exhaustion - "RUSTSEC-2026-0021", # wasmtime: wasi:http fields panic # Transitive unmaintained crates — no alternative available - "RUSTSEC-2025-0057", # fxhash: unmaintained (transitive via wasmtime) "RUSTSEC-2025-0134", # rustls-pemfile: unmaintained (transitive via rustls) - "RUSTSEC-2024-0436", # paste: unmaintained (transitive via wasmtime) ] [licenses] diff --git a/rust-toolchain.toml b/rust-toolchain.toml index bb912f0..fb31626 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,4 +1,4 @@ [toolchain] -channel = "1.90.0" +channel = "1.91.0" components = ["rustfmt", "clippy", "rust-src", "rust-analyzer"] targets = ["wasm32-wasip2"] diff --git a/src/lib/Cargo.toml b/src/lib/Cargo.toml index 2481cb8..e4c1bfd 100644 --- a/src/lib/Cargo.toml +++ b/src/lib/Cargo.toml @@ -92,7 +92,7 @@ optional = true # Wasmtime runtime for hosting WASM components (optional) # Enables running WASM components that use wsc:crypto interface [dependencies.wasmtime] -version = "29" +version = "43" features = ["component-model"] optional = true diff --git a/src/lib/src/runtime/crypto_host.rs b/src/lib/src/runtime/crypto_host.rs index 75bb868..c2aeca6 100644 --- a/src/lib/src/runtime/crypto_host.rs +++ b/src/lib/src/runtime/crypto_host.rs @@ -13,7 +13,7 @@ use wasmtime::{Config, Engine, Store}; wasmtime::component::bindgen!({ path: "../../wit/deps/wsc-crypto", world: "crypto-guest", - async: false, + require_store_data_send: true, }); /// State held by the wasmtime Store for crypto operations. @@ -189,8 +189,11 @@ impl WscRuntime

{ let mut linker = Linker::new(&engine); // Add wsc:crypto imports to the linker - CryptoGuest::add_to_linker(&mut linker, |state| state) - .map_err(|e| WSError::InternalError(format!("Failed to add crypto bindings: {}", e)))?; + CryptoGuest::add_to_linker::, wasmtime::component::HasSelf>>( + &mut linker, + |state| state, + ) + .map_err(|e| WSError::InternalError(format!("Failed to add crypto bindings: {}", e)))?; Ok(Self { engine, linker }) } diff --git a/src/lib/src/signature/keyless/cert_pinning.rs b/src/lib/src/signature/keyless/cert_pinning.rs index 02b0054..7477dd0 100644 --- a/src/lib/src/signature/keyless/cert_pinning.rs +++ b/src/lib/src/signature/keyless/cert_pinning.rs @@ -1,8 +1,12 @@ -/// Certificate pinning for Sigstore endpoints +/// SPKI certificate pinning for Sigstore endpoints /// -/// This module implements certificate pinning to protect against CA compromise -/// and man-in-the-middle attacks. It validates that TLS certificates match -/// known SHA256 fingerprints. +/// This module implements SPKI (Subject Public Key Info) pinning to protect +/// against CA compromise and man-in-the-middle attacks. It validates that +/// the public key in TLS certificates matches known SHA256(SPKI) hashes. +/// +/// SPKI pinning is more resilient than leaf-cert pinning: pins survive +/// certificate renewals as long as the key stays the same (common for +/// Google Trust Services which issues Sigstore's TLS certs). /// /// # Security Model /// @@ -67,54 +71,49 @@ use rustls::pki_types::{CertificateDer, ServerName, UnixTime}; #[cfg(not(target_arch = "wasm32"))] use rustls::{DigitallySignedStruct, Error as TlsError, SignatureScheme}; -/// Production Fulcio certificate pins (SHA256 fingerprints) +/// Production Fulcio SPKI pins (SHA256 of SubjectPublicKeyInfo DER) /// -/// These are the SHA256 fingerprints of certificates in the Sigstore production -/// certificate chain. Multiple pins are included for rotation support. +/// SPKI pinning survives certificate renewals — only changes when the +/// actual public key rotates (rare for Google Trust Services). /// -/// To get the current fingerprint: +/// To get the current SPKI pin: /// ```bash /// echo | openssl s_client -connect fulcio.sigstore.dev:443 -servername fulcio.sigstore.dev 2>/dev/null | \ -/// openssl x509 -outform DER | sha256sum +/// openssl x509 -pubkey -noout | openssl pkey -pubin -outform DER | sha256sum /// ``` /// -/// Sigstore uses Google Trust Services certificates (GTS Root R1 -> GTS CA 1D4 -> fulcio.sigstore.dev) -/// We pin both the intermediate and root CA for defense in depth. +/// Sigstore uses Google Trust Services certificates (GTS Root R1 -> GTS WR3 -> fulcio.sigstore.dev) +/// We pin the leaf SPKI and the intermediate CA SPKI for defense in depth. const FULCIO_PRODUCTION_PINS: &[&str] = &[ - // Current fulcio.sigstore.dev leaf certificate (updated 2026-03-21) - // Run: echo | openssl s_client -connect fulcio.sigstore.dev:443 -servername fulcio.sigstore.dev 2>/dev/null | openssl x509 -outform DER | sha256sum - "ba90f09de9ec18ad1e17dd8e050f5aa1042a42f633a8bd69981e0aeaea7e36b6", - // Previous pins kept for rotation grace period - "a1ab2a71570894a6d9b2e539ec31419968cc3192b8c64bafb016bb72013f4087", - "d947432abde7b7fa90fc2e6b59101b12780fe0b4f02be0d81f4a6e2a0d5f2c17", + // fulcio.sigstore.dev leaf SPKI (updated 2026-04-14) + "6611c54b2960f4ed00fef7be46e6ea6541f38e65b039f756b87c0825c0f67df4", + // Google Trust Services WR3 intermediate CA SPKI + "39d4a59900fd356261e046dc387071921ca03f0352c00f50f757a8ba77db7281", ]; -/// Production Rekor certificate pins (SHA256 fingerprints) +/// Production Rekor SPKI pins (SHA256 of SubjectPublicKeyInfo DER) /// /// Rekor uses the same Google Trust Services infrastructure as Fulcio. const REKOR_PRODUCTION_PINS: &[&str] = &[ - // Current rekor.sigstore.dev leaf certificate (updated 2026-03-15) - // Run: echo | openssl s_client -connect rekor.sigstore.dev:443 -servername rekor.sigstore.dev 2>/dev/null | openssl x509 -outform DER | sha256sum - "b4eb704754cb6f968f0aad64e4f8dedea5105ca2eb5974cbf82a38021cd54433", - // Previous pins kept for rotation grace period - "1d1d8295591c131c4e3581c8bdaa6ee0a76baae16f454467069cd1211756b88d", - "d947432abde7b7fa90fc2e6b59101b12780fe0b4f02be0d81f4a6e2a0d5f2c17", + // rekor.sigstore.dev leaf SPKI (updated 2026-04-14) + "356aacac31f1dda36c418426c4fad25071f849fdaccda221cca9a41b9ddb140d", + // Google Trust Services WR3 intermediate CA SPKI + "39d4a59900fd356261e046dc387071921ca03f0352c00f50f757a8ba77db7281", ]; -/// Staging Fulcio certificate pins (SHA256 fingerprints) +/// Staging Fulcio SPKI pins (SHA256 of SubjectPublicKeyInfo DER) /// /// Staging environment uses different certificates. Set WSC_SIGSTORE_STAGING=1 /// to use staging endpoints. const FULCIO_STAGING_PINS: &[&str] = &[ - // Staging uses Let's Encrypt certificates - // ISRG Root X1 - "96bcec06264976f37460779acf28c5a7cfe8a3c0aae11a8ffcee05c0bddf08c6", + // ISRG Root X1 SPKI (Let's Encrypt root — extremely stable) + "0b9fa5a59eed715c26c1020c711b4f6ec42d58b0015e14337a39dad301c5afc3", ]; -/// Staging Rekor certificate pins (SHA256 fingerprints) +/// Staging Rekor SPKI pins (SHA256 of SubjectPublicKeyInfo DER) const REKOR_STAGING_PINS: &[&str] = &[ - // ISRG Root X1 - "96bcec06264976f37460779acf28c5a7cfe8a3c0aae11a8ffcee05c0bddf08c6", + // ISRG Root X1 SPKI (Let's Encrypt root) + "0b9fa5a59eed715c26c1020c711b4f6ec42d58b0015e14337a39dad301c5afc3", ]; /// Certificate pinning configuration @@ -281,10 +280,13 @@ impl PinningConfig { // Rustls-dependent methods (native only) #[cfg(not(target_arch = "wasm32"))] impl PinningConfig { - /// Verify a certificate matches one of the pins + /// Verify a certificate's SPKI matches one of the pins. + /// + /// Extracts the SubjectPublicKeyInfo (SPKI) from the X.509 certificate + /// and computes SHA256(SPKI_DER). This survives certificate renewals + /// as long as the public key stays the same. fn verify_certificate(&self, cert_der: &CertificateDer) -> Result<(), WSError> { if !self.is_enabled() { - // No pins configured - allow connection but log warning log::warn!( "Certificate pinning disabled for {} (no pins configured)", self.service_name @@ -292,22 +294,28 @@ impl PinningConfig { return Ok(()); } - // Compute SHA256 fingerprint of the certificate + // Parse the X.509 certificate to extract SPKI + let (_, cert) = x509_parser::parse_x509_certificate(cert_der.as_ref()) + .map_err(|e| WSError::CertificatePinningError(format!( + "Failed to parse certificate for SPKI extraction: {:?}", e + )))?; + + // Hash the raw SubjectPublicKeyInfo DER bytes + let spki_der = cert.public_key().raw; let mut hasher = Sha256::new(); - hasher.update(cert_der.as_ref()); + hasher.update(spki_der); let fingerprint = hasher.finalize(); let fingerprint_hex = hex::encode(fingerprint); - // Check if fingerprint matches any pin + // Check if SPKI fingerprint matches any pin if self.pins.contains(&fingerprint_hex) { log::debug!( - "Certificate pin matched for {} (fingerprint: {}...)", + "SPKI pin matched for {} (fingerprint: {}...)", self.service_name, &fingerprint_hex[..16] ); Ok(()) } else if self.enforce { - // SECURITY (Issue #9): Only show first 16 hex chars (8 bytes) of fingerprint Err(WSError::CertificatePinningError(format!( "Certificate pin mismatch for {}: got {}..., expected one of {} configured pins", self.service_name, @@ -316,7 +324,7 @@ impl PinningConfig { ))) } else { log::warn!( - "Certificate pin mismatch for {} (warn-only mode): {}...", + "SPKI pin mismatch for {} (warn-only mode): {}...", self.service_name, &fingerprint_hex[..16] ); @@ -541,23 +549,28 @@ mod tests { } #[test] - fn test_certificate_fingerprint_matching() { - // Create a test certificate (DER format) - let test_cert_der = vec![0x30, 0x82, 0x01, 0x00]; // Minimal DER structure - let cert = CertificateDer::from(test_cert_der.clone()); - - // Compute expected fingerprint + fn test_spki_fingerprint_matching() { + // Generate a real self-signed certificate for SPKI pinning test + let params = rcgen::CertificateParams::new(vec!["test.example.com".to_string()]).unwrap(); + let cert_key = rcgen::KeyPair::generate().unwrap(); + let cert = params.self_signed(&cert_key).unwrap(); + let cert_der = cert.der().to_vec(); + let cert_ref = CertificateDer::from(cert_der.clone()); + + // Extract SPKI and compute expected pin + let (_, parsed) = x509_parser::parse_x509_certificate(&cert_der).unwrap(); + let spki_der = parsed.public_key().raw; let mut hasher = Sha256::new(); - hasher.update(&test_cert_der); + hasher.update(spki_der); let expected = hex::encode(hasher.finalize()); - // Create config with correct pin + // Config with correct SPKI pin should pass let config = PinningConfig::custom(vec![expected.clone()], "test".to_string()); - assert!(config.verify_certificate(&cert).is_ok()); + assert!(config.verify_certificate(&cert_ref).is_ok()); - // Create config with wrong pin + // Config with wrong pin should fail let wrong_config = PinningConfig::custom(vec!["a".repeat(64)], "test".to_string()); - assert!(wrong_config.verify_certificate(&cert).is_err()); + assert!(wrong_config.verify_certificate(&cert_ref).is_err()); } #[test] @@ -565,12 +578,12 @@ mod tests { let fulcio = PinningConfig::fulcio_production(); assert_eq!(fulcio.service_name, "fulcio.sigstore.dev"); assert!(fulcio.is_enabled()); - assert!(fulcio.pin_count() >= 3); // Current leaf + previous pins for rotation + assert!(fulcio.pin_count() >= 2); // Leaf SPKI + intermediate CA SPKI let rekor = PinningConfig::rekor_production(); assert_eq!(rekor.service_name, "rekor.sigstore.dev"); assert!(rekor.is_enabled()); - assert!(rekor.pin_count() >= 3); + assert!(rekor.pin_count() >= 2); } #[test] @@ -601,9 +614,14 @@ mod tests { assert!(!config.is_enforcing()); - // In warn-only mode, verification should pass even with wrong cert - let wrong_cert = vec![0x30, 0x82, 0x01, 0x00]; - let result = config.verify_certificate(&CertificateDer::from(wrong_cert)); + // Generate a real cert with a non-matching pin + let params = rcgen::CertificateParams::new(vec!["warn.example.com".to_string()]).unwrap(); + let cert_key = rcgen::KeyPair::generate().unwrap(); + let cert = params.self_signed(&cert_key).unwrap(); + let cert_der = CertificateDer::from(cert.der().to_vec()); + + // In warn-only mode, verification should pass even with wrong pin + let result = config.verify_certificate(&cert_der); assert!(result.is_ok()); // Should just warn, not error } @@ -652,13 +670,26 @@ mod tests { #[test] fn test_pinning_with_multiple_certs() { - // Test that pinning works with multiple pinned certificates - let cert1 = vec![0x30, 0x82, 0x01, 0x01]; - let cert2 = vec![0x30, 0x82, 0x01, 0x02]; - - // Compute fingerprints - let fp1 = hex::encode(Sha256::digest(&cert1)); - let fp2 = hex::encode(Sha256::digest(&cert2)); + // Generate two real certificates + let params1 = rcgen::CertificateParams::new(vec!["one.example.com".to_string()]).unwrap(); + let key1 = rcgen::KeyPair::generate().unwrap(); + let cert1 = params1.self_signed(&key1).unwrap(); + let cert1_der = cert1.der().to_vec(); + + let params2 = rcgen::CertificateParams::new(vec!["two.example.com".to_string()]).unwrap(); + let key2 = rcgen::KeyPair::generate().unwrap(); + let cert2 = params2.self_signed(&key2).unwrap(); + let cert2_der = cert2.der().to_vec(); + + // Compute SPKI fingerprints + let fp1 = { + let (_, p) = x509_parser::parse_x509_certificate(&cert1_der).unwrap(); + hex::encode(Sha256::digest(p.public_key().raw)) + }; + let fp2 = { + let (_, p) = x509_parser::parse_x509_certificate(&cert2_der).unwrap(); + hex::encode(Sha256::digest(p.public_key().raw)) + }; let config = PinningConfig::custom(vec![fp1.clone(), fp2.clone()], "multi-test".to_string()); @@ -666,20 +697,22 @@ mod tests { // Both certificates should pass assert!( config - .verify_certificate(&CertificateDer::from(cert1)) + .verify_certificate(&CertificateDer::from(cert1_der)) .is_ok() ); assert!( config - .verify_certificate(&CertificateDer::from(cert2)) + .verify_certificate(&CertificateDer::from(cert2_der)) .is_ok() ); - // Wrong certificate should fail - let cert3 = vec![0x30, 0x82, 0x01, 0x03]; + // Certificate with different key should fail + let params3 = rcgen::CertificateParams::new(vec!["three.example.com".to_string()]).unwrap(); + let key3 = rcgen::KeyPair::generate().unwrap(); + let cert3 = params3.self_signed(&key3).unwrap(); assert!( config - .verify_certificate(&CertificateDer::from(cert3)) + .verify_certificate(&CertificateDer::from(cert3.der().to_vec())) .is_err() ); }