├── .gitignore ├── LICENSE ├── README.md ├── banner.png ├── soundness-cli ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── README.md ├── src │ └── main.rs ├── test_files │ ├── sp1_fibonacci.elf │ └── sp1_fibonacci.proof └── tests │ ├── e2e_test.rs │ └── run_e2e_tests.sh └── soundnessup ├── install └── soundnessup /.gitignore: -------------------------------------------------------------------------------- 1 | # Generated by Cargo 2 | # will have compiled files and executables 3 | debug/ 4 | target/ 5 | 6 | # These are backup files generated by rustfmt 7 | **/*.rs.bk 8 | 9 | # MSVC Windows builds of rustc generate these, which store debugging information 10 | *.pdb 11 | 12 | # RustRover 13 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can 14 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore 15 | # and can be added to the global gitignore or merged into this file. For a more nuclear 16 | # option (not recommended) you can uncomment the following to ignore the entire idea folder. 17 | #.idea/ -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Soundness Labs 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Soundness Layer 2 | 3 | ![Soundness Layer Banner](banner.png) 4 | 5 | Soundness Layer is a decentralized verification layer that provides low latency, high throughput, and cross-chain compatibility for blockchain networks. Built on [Walrus](https://www.walrus.xyz/) for data availability and [Sui](https://sui.io/) for sequencing, it delivers a robust infrastructure for data verification. The network's security is maintained through an innovative restaking protocol. 6 | 7 | [X](https://x.com/SoundnessLabs) | [Discord](https://discord.gg/F4cGbdqgw8) | [Telegram](https://t.me/SoundnessLabs) | [Website](https://soundness.xyz/) 8 | 9 | > ⚠️ **Warning**: This is a testnet implementation. Do not use in production. The protocol is still under development and may contain bugs or security vulnerabilities. We are gradually rolling out features and open sourcing components as we progress through our development roadmap. 10 | 11 | ## Testnet Registration 12 | 13 | We are currently preparing for testnet launch and invite early participants to register their keys. For detailed instructions on key generation and registration, please refer to the [`soundness-cli`](/soundness-cli) documentation. 14 | -------------------------------------------------------------------------------- /banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SoundnessLabs/soundness-layer/a3b49e3b98c736a28c05a24607c437eca7438ae2/banner.png -------------------------------------------------------------------------------- /soundness-cli/.gitignore: -------------------------------------------------------------------------------- 1 | key_store.json -------------------------------------------------------------------------------- /soundness-cli/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 4 4 | 5 | [[package]] 6 | name = "addr2line" 7 | version = "0.24.2" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" 10 | dependencies = [ 11 | "gimli", 12 | ] 13 | 14 | [[package]] 15 | name = "adler2" 16 | version = "2.0.0" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" 19 | 20 | [[package]] 21 | name = "aead" 22 | version = "0.5.2" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" 25 | dependencies = [ 26 | "crypto-common", 27 | "generic-array", 28 | ] 29 | 30 | [[package]] 31 | name = "aes" 32 | version = "0.8.4" 33 | source = "registry+https://github.com/rust-lang/crates.io-index" 34 | checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" 35 | dependencies = [ 36 | "cfg-if", 37 | "cipher", 38 | "cpufeatures", 39 | ] 40 | 41 | [[package]] 42 | name = "aes-gcm" 43 | version = "0.10.3" 44 | source = "registry+https://github.com/rust-lang/crates.io-index" 45 | checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" 46 | dependencies = [ 47 | "aead", 48 | "aes", 49 | "cipher", 50 | "ctr", 51 | "ghash", 52 | "subtle", 53 | ] 54 | 55 | [[package]] 56 | name = "anstream" 57 | version = "0.6.18" 58 | source = "registry+https://github.com/rust-lang/crates.io-index" 59 | checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" 60 | dependencies = [ 61 | "anstyle", 62 | "anstyle-parse", 63 | "anstyle-query", 64 | "anstyle-wincon", 65 | "colorchoice", 66 | "is_terminal_polyfill", 67 | "utf8parse", 68 | ] 69 | 70 | [[package]] 71 | name = "anstyle" 72 | version = "1.0.10" 73 | source = "registry+https://github.com/rust-lang/crates.io-index" 74 | checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" 75 | 76 | [[package]] 77 | name = "anstyle-parse" 78 | version = "0.2.6" 79 | source = "registry+https://github.com/rust-lang/crates.io-index" 80 | checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" 81 | dependencies = [ 82 | "utf8parse", 83 | ] 84 | 85 | [[package]] 86 | name = "anstyle-query" 87 | version = "1.1.2" 88 | source = "registry+https://github.com/rust-lang/crates.io-index" 89 | checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" 90 | dependencies = [ 91 | "windows-sys 0.59.0", 92 | ] 93 | 94 | [[package]] 95 | name = "anstyle-wincon" 96 | version = "3.0.7" 97 | source = "registry+https://github.com/rust-lang/crates.io-index" 98 | checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" 99 | dependencies = [ 100 | "anstyle", 101 | "once_cell", 102 | "windows-sys 0.59.0", 103 | ] 104 | 105 | [[package]] 106 | name = "anyhow" 107 | version = "1.0.97" 108 | source = "registry+https://github.com/rust-lang/crates.io-index" 109 | checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" 110 | 111 | [[package]] 112 | name = "autocfg" 113 | version = "0.1.8" 114 | source = "registry+https://github.com/rust-lang/crates.io-index" 115 | checksum = "0dde43e75fd43e8a1bf86103336bc699aa8d17ad1be60c76c0bdfd4828e19b78" 116 | dependencies = [ 117 | "autocfg 1.4.0", 118 | ] 119 | 120 | [[package]] 121 | name = "autocfg" 122 | version = "1.4.0" 123 | source = "registry+https://github.com/rust-lang/crates.io-index" 124 | checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 125 | 126 | [[package]] 127 | name = "backtrace" 128 | version = "0.3.74" 129 | source = "registry+https://github.com/rust-lang/crates.io-index" 130 | checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" 131 | dependencies = [ 132 | "addr2line", 133 | "cfg-if", 134 | "libc", 135 | "miniz_oxide", 136 | "object", 137 | "rustc-demangle", 138 | "windows-targets 0.52.6", 139 | ] 140 | 141 | [[package]] 142 | name = "base64" 143 | version = "0.21.7" 144 | source = "registry+https://github.com/rust-lang/crates.io-index" 145 | checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" 146 | 147 | [[package]] 148 | name = "base64ct" 149 | version = "1.6.0" 150 | source = "registry+https://github.com/rust-lang/crates.io-index" 151 | checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" 152 | 153 | [[package]] 154 | name = "bip39" 155 | version = "1.2.0" 156 | source = "registry+https://github.com/rust-lang/crates.io-index" 157 | checksum = "29b9e657de8ff1c3488a4ab77cb51d604eab53415ce34f0bc800f2eac9b13c28" 158 | dependencies = [ 159 | "bitcoin_hashes", 160 | "rand 0.6.5", 161 | "rand_core 0.4.2", 162 | "serde", 163 | "unicode-normalization", 164 | ] 165 | 166 | [[package]] 167 | name = "bitcoin_hashes" 168 | version = "0.11.0" 169 | source = "registry+https://github.com/rust-lang/crates.io-index" 170 | checksum = "90064b8dee6815a6470d60bad07bbbaee885c0e12d04177138fa3291a01b7bc4" 171 | 172 | [[package]] 173 | name = "bitflags" 174 | version = "1.3.2" 175 | source = "registry+https://github.com/rust-lang/crates.io-index" 176 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 177 | 178 | [[package]] 179 | name = "bitflags" 180 | version = "2.9.0" 181 | source = "registry+https://github.com/rust-lang/crates.io-index" 182 | checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" 183 | 184 | [[package]] 185 | name = "block-buffer" 186 | version = "0.10.4" 187 | source = "registry+https://github.com/rust-lang/crates.io-index" 188 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 189 | dependencies = [ 190 | "generic-array", 191 | ] 192 | 193 | [[package]] 194 | name = "bumpalo" 195 | version = "3.17.0" 196 | source = "registry+https://github.com/rust-lang/crates.io-index" 197 | checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" 198 | 199 | [[package]] 200 | name = "bytes" 201 | version = "1.10.1" 202 | source = "registry+https://github.com/rust-lang/crates.io-index" 203 | checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" 204 | 205 | [[package]] 206 | name = "cc" 207 | version = "1.2.16" 208 | source = "registry+https://github.com/rust-lang/crates.io-index" 209 | checksum = "be714c154be609ec7f5dad223a33bf1482fff90472de28f7362806e6d4832b8c" 210 | dependencies = [ 211 | "shlex", 212 | ] 213 | 214 | [[package]] 215 | name = "cfg-if" 216 | version = "1.0.0" 217 | source = "registry+https://github.com/rust-lang/crates.io-index" 218 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 219 | 220 | [[package]] 221 | name = "cipher" 222 | version = "0.4.4" 223 | source = "registry+https://github.com/rust-lang/crates.io-index" 224 | checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" 225 | dependencies = [ 226 | "crypto-common", 227 | "inout", 228 | ] 229 | 230 | [[package]] 231 | name = "clap" 232 | version = "4.5.31" 233 | source = "registry+https://github.com/rust-lang/crates.io-index" 234 | checksum = "027bb0d98429ae334a8698531da7077bdf906419543a35a55c2cb1b66437d767" 235 | dependencies = [ 236 | "clap_builder", 237 | "clap_derive", 238 | ] 239 | 240 | [[package]] 241 | name = "clap_builder" 242 | version = "4.5.31" 243 | source = "registry+https://github.com/rust-lang/crates.io-index" 244 | checksum = "5589e0cba072e0f3d23791efac0fd8627b49c829c196a492e88168e6a669d863" 245 | dependencies = [ 246 | "anstream", 247 | "anstyle", 248 | "clap_lex", 249 | "strsim", 250 | ] 251 | 252 | [[package]] 253 | name = "clap_derive" 254 | version = "4.5.28" 255 | source = "registry+https://github.com/rust-lang/crates.io-index" 256 | checksum = "bf4ced95c6f4a675af3da73304b9ac4ed991640c36374e4b46795c49e17cf1ed" 257 | dependencies = [ 258 | "heck", 259 | "proc-macro2", 260 | "quote", 261 | "syn", 262 | ] 263 | 264 | [[package]] 265 | name = "clap_lex" 266 | version = "0.7.4" 267 | source = "registry+https://github.com/rust-lang/crates.io-index" 268 | checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" 269 | 270 | [[package]] 271 | name = "cloudabi" 272 | version = "0.0.3" 273 | source = "registry+https://github.com/rust-lang/crates.io-index" 274 | checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" 275 | dependencies = [ 276 | "bitflags 1.3.2", 277 | ] 278 | 279 | [[package]] 280 | name = "colorchoice" 281 | version = "1.0.3" 282 | source = "registry+https://github.com/rust-lang/crates.io-index" 283 | checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" 284 | 285 | [[package]] 286 | name = "console" 287 | version = "0.15.11" 288 | source = "registry+https://github.com/rust-lang/crates.io-index" 289 | checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" 290 | dependencies = [ 291 | "encode_unicode", 292 | "libc", 293 | "once_cell", 294 | "unicode-width", 295 | "windows-sys 0.59.0", 296 | ] 297 | 298 | [[package]] 299 | name = "const-oid" 300 | version = "0.9.6" 301 | source = "registry+https://github.com/rust-lang/crates.io-index" 302 | checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" 303 | 304 | [[package]] 305 | name = "core-foundation" 306 | version = "0.9.4" 307 | source = "registry+https://github.com/rust-lang/crates.io-index" 308 | checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 309 | dependencies = [ 310 | "core-foundation-sys", 311 | "libc", 312 | ] 313 | 314 | [[package]] 315 | name = "core-foundation-sys" 316 | version = "0.8.7" 317 | source = "registry+https://github.com/rust-lang/crates.io-index" 318 | checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 319 | 320 | [[package]] 321 | name = "cpufeatures" 322 | version = "0.2.17" 323 | source = "registry+https://github.com/rust-lang/crates.io-index" 324 | checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" 325 | dependencies = [ 326 | "libc", 327 | ] 328 | 329 | [[package]] 330 | name = "crypto-common" 331 | version = "0.1.6" 332 | source = "registry+https://github.com/rust-lang/crates.io-index" 333 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 334 | dependencies = [ 335 | "generic-array", 336 | "rand_core 0.6.4", 337 | "typenum", 338 | ] 339 | 340 | [[package]] 341 | name = "ctr" 342 | version = "0.9.2" 343 | source = "registry+https://github.com/rust-lang/crates.io-index" 344 | checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" 345 | dependencies = [ 346 | "cipher", 347 | ] 348 | 349 | [[package]] 350 | name = "curve25519-dalek" 351 | version = "4.1.3" 352 | source = "registry+https://github.com/rust-lang/crates.io-index" 353 | checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" 354 | dependencies = [ 355 | "cfg-if", 356 | "cpufeatures", 357 | "curve25519-dalek-derive", 358 | "digest", 359 | "fiat-crypto", 360 | "rustc_version", 361 | "subtle", 362 | "zeroize", 363 | ] 364 | 365 | [[package]] 366 | name = "curve25519-dalek-derive" 367 | version = "0.1.1" 368 | source = "registry+https://github.com/rust-lang/crates.io-index" 369 | checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" 370 | dependencies = [ 371 | "proc-macro2", 372 | "quote", 373 | "syn", 374 | ] 375 | 376 | [[package]] 377 | name = "der" 378 | version = "0.7.9" 379 | source = "registry+https://github.com/rust-lang/crates.io-index" 380 | checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" 381 | dependencies = [ 382 | "const-oid", 383 | "zeroize", 384 | ] 385 | 386 | [[package]] 387 | name = "digest" 388 | version = "0.10.7" 389 | source = "registry+https://github.com/rust-lang/crates.io-index" 390 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 391 | dependencies = [ 392 | "block-buffer", 393 | "crypto-common", 394 | "subtle", 395 | ] 396 | 397 | [[package]] 398 | name = "displaydoc" 399 | version = "0.2.5" 400 | source = "registry+https://github.com/rust-lang/crates.io-index" 401 | checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 402 | dependencies = [ 403 | "proc-macro2", 404 | "quote", 405 | "syn", 406 | ] 407 | 408 | [[package]] 409 | name = "ed25519" 410 | version = "2.2.3" 411 | source = "registry+https://github.com/rust-lang/crates.io-index" 412 | checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" 413 | dependencies = [ 414 | "pkcs8", 415 | "signature", 416 | ] 417 | 418 | [[package]] 419 | name = "ed25519-dalek" 420 | version = "2.1.1" 421 | source = "registry+https://github.com/rust-lang/crates.io-index" 422 | checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" 423 | dependencies = [ 424 | "curve25519-dalek", 425 | "ed25519", 426 | "rand_core 0.6.4", 427 | "serde", 428 | "sha2", 429 | "subtle", 430 | "zeroize", 431 | ] 432 | 433 | [[package]] 434 | name = "encode_unicode" 435 | version = "1.0.0" 436 | source = "registry+https://github.com/rust-lang/crates.io-index" 437 | checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" 438 | 439 | [[package]] 440 | name = "encoding_rs" 441 | version = "0.8.35" 442 | source = "registry+https://github.com/rust-lang/crates.io-index" 443 | checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" 444 | dependencies = [ 445 | "cfg-if", 446 | ] 447 | 448 | [[package]] 449 | name = "equivalent" 450 | version = "1.0.2" 451 | source = "registry+https://github.com/rust-lang/crates.io-index" 452 | checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" 453 | 454 | [[package]] 455 | name = "errno" 456 | version = "0.3.10" 457 | source = "registry+https://github.com/rust-lang/crates.io-index" 458 | checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" 459 | dependencies = [ 460 | "libc", 461 | "windows-sys 0.59.0", 462 | ] 463 | 464 | [[package]] 465 | name = "fastrand" 466 | version = "2.3.0" 467 | source = "registry+https://github.com/rust-lang/crates.io-index" 468 | checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 469 | 470 | [[package]] 471 | name = "fiat-crypto" 472 | version = "0.2.9" 473 | source = "registry+https://github.com/rust-lang/crates.io-index" 474 | checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" 475 | 476 | [[package]] 477 | name = "fnv" 478 | version = "1.0.7" 479 | source = "registry+https://github.com/rust-lang/crates.io-index" 480 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 481 | 482 | [[package]] 483 | name = "foreign-types" 484 | version = "0.3.2" 485 | source = "registry+https://github.com/rust-lang/crates.io-index" 486 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 487 | dependencies = [ 488 | "foreign-types-shared", 489 | ] 490 | 491 | [[package]] 492 | name = "foreign-types-shared" 493 | version = "0.1.1" 494 | source = "registry+https://github.com/rust-lang/crates.io-index" 495 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 496 | 497 | [[package]] 498 | name = "form_urlencoded" 499 | version = "1.2.1" 500 | source = "registry+https://github.com/rust-lang/crates.io-index" 501 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 502 | dependencies = [ 503 | "percent-encoding", 504 | ] 505 | 506 | [[package]] 507 | name = "fuchsia-cprng" 508 | version = "0.1.1" 509 | source = "registry+https://github.com/rust-lang/crates.io-index" 510 | checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" 511 | 512 | [[package]] 513 | name = "futures-channel" 514 | version = "0.3.31" 515 | source = "registry+https://github.com/rust-lang/crates.io-index" 516 | checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 517 | dependencies = [ 518 | "futures-core", 519 | ] 520 | 521 | [[package]] 522 | name = "futures-core" 523 | version = "0.3.31" 524 | source = "registry+https://github.com/rust-lang/crates.io-index" 525 | checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 526 | 527 | [[package]] 528 | name = "futures-sink" 529 | version = "0.3.31" 530 | source = "registry+https://github.com/rust-lang/crates.io-index" 531 | checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 532 | 533 | [[package]] 534 | name = "futures-task" 535 | version = "0.3.31" 536 | source = "registry+https://github.com/rust-lang/crates.io-index" 537 | checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 538 | 539 | [[package]] 540 | name = "futures-util" 541 | version = "0.3.31" 542 | source = "registry+https://github.com/rust-lang/crates.io-index" 543 | checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 544 | dependencies = [ 545 | "futures-core", 546 | "futures-task", 547 | "pin-project-lite", 548 | "pin-utils", 549 | ] 550 | 551 | [[package]] 552 | name = "generic-array" 553 | version = "0.14.7" 554 | source = "registry+https://github.com/rust-lang/crates.io-index" 555 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 556 | dependencies = [ 557 | "typenum", 558 | "version_check", 559 | ] 560 | 561 | [[package]] 562 | name = "getrandom" 563 | version = "0.2.15" 564 | source = "registry+https://github.com/rust-lang/crates.io-index" 565 | checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" 566 | dependencies = [ 567 | "cfg-if", 568 | "libc", 569 | "wasi 0.11.0+wasi-snapshot-preview1", 570 | ] 571 | 572 | [[package]] 573 | name = "getrandom" 574 | version = "0.3.1" 575 | source = "registry+https://github.com/rust-lang/crates.io-index" 576 | checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" 577 | dependencies = [ 578 | "cfg-if", 579 | "libc", 580 | "wasi 0.13.3+wasi-0.2.2", 581 | "windows-targets 0.52.6", 582 | ] 583 | 584 | [[package]] 585 | name = "ghash" 586 | version = "0.5.1" 587 | source = "registry+https://github.com/rust-lang/crates.io-index" 588 | checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" 589 | dependencies = [ 590 | "opaque-debug", 591 | "polyval", 592 | ] 593 | 594 | [[package]] 595 | name = "gimli" 596 | version = "0.31.1" 597 | source = "registry+https://github.com/rust-lang/crates.io-index" 598 | checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 599 | 600 | [[package]] 601 | name = "h2" 602 | version = "0.3.26" 603 | source = "registry+https://github.com/rust-lang/crates.io-index" 604 | checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" 605 | dependencies = [ 606 | "bytes", 607 | "fnv", 608 | "futures-core", 609 | "futures-sink", 610 | "futures-util", 611 | "http", 612 | "indexmap", 613 | "slab", 614 | "tokio", 615 | "tokio-util", 616 | "tracing", 617 | ] 618 | 619 | [[package]] 620 | name = "hashbrown" 621 | version = "0.15.2" 622 | source = "registry+https://github.com/rust-lang/crates.io-index" 623 | checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" 624 | 625 | [[package]] 626 | name = "heck" 627 | version = "0.5.0" 628 | source = "registry+https://github.com/rust-lang/crates.io-index" 629 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 630 | 631 | [[package]] 632 | name = "hex" 633 | version = "0.4.3" 634 | source = "registry+https://github.com/rust-lang/crates.io-index" 635 | checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 636 | 637 | [[package]] 638 | name = "hmac" 639 | version = "0.12.1" 640 | source = "registry+https://github.com/rust-lang/crates.io-index" 641 | checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" 642 | dependencies = [ 643 | "digest", 644 | ] 645 | 646 | [[package]] 647 | name = "http" 648 | version = "0.2.12" 649 | source = "registry+https://github.com/rust-lang/crates.io-index" 650 | checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" 651 | dependencies = [ 652 | "bytes", 653 | "fnv", 654 | "itoa", 655 | ] 656 | 657 | [[package]] 658 | name = "http-body" 659 | version = "0.4.6" 660 | source = "registry+https://github.com/rust-lang/crates.io-index" 661 | checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" 662 | dependencies = [ 663 | "bytes", 664 | "http", 665 | "pin-project-lite", 666 | ] 667 | 668 | [[package]] 669 | name = "httparse" 670 | version = "1.10.1" 671 | source = "registry+https://github.com/rust-lang/crates.io-index" 672 | checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" 673 | 674 | [[package]] 675 | name = "httpdate" 676 | version = "1.0.3" 677 | source = "registry+https://github.com/rust-lang/crates.io-index" 678 | checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" 679 | 680 | [[package]] 681 | name = "hyper" 682 | version = "0.14.32" 683 | source = "registry+https://github.com/rust-lang/crates.io-index" 684 | checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" 685 | dependencies = [ 686 | "bytes", 687 | "futures-channel", 688 | "futures-core", 689 | "futures-util", 690 | "h2", 691 | "http", 692 | "http-body", 693 | "httparse", 694 | "httpdate", 695 | "itoa", 696 | "pin-project-lite", 697 | "socket2", 698 | "tokio", 699 | "tower-service", 700 | "tracing", 701 | "want", 702 | ] 703 | 704 | [[package]] 705 | name = "hyper-tls" 706 | version = "0.5.0" 707 | source = "registry+https://github.com/rust-lang/crates.io-index" 708 | checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" 709 | dependencies = [ 710 | "bytes", 711 | "hyper", 712 | "native-tls", 713 | "tokio", 714 | "tokio-native-tls", 715 | ] 716 | 717 | [[package]] 718 | name = "icu_collections" 719 | version = "1.5.0" 720 | source = "registry+https://github.com/rust-lang/crates.io-index" 721 | checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" 722 | dependencies = [ 723 | "displaydoc", 724 | "yoke", 725 | "zerofrom", 726 | "zerovec", 727 | ] 728 | 729 | [[package]] 730 | name = "icu_locid" 731 | version = "1.5.0" 732 | source = "registry+https://github.com/rust-lang/crates.io-index" 733 | checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" 734 | dependencies = [ 735 | "displaydoc", 736 | "litemap", 737 | "tinystr", 738 | "writeable", 739 | "zerovec", 740 | ] 741 | 742 | [[package]] 743 | name = "icu_locid_transform" 744 | version = "1.5.0" 745 | source = "registry+https://github.com/rust-lang/crates.io-index" 746 | checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" 747 | dependencies = [ 748 | "displaydoc", 749 | "icu_locid", 750 | "icu_locid_transform_data", 751 | "icu_provider", 752 | "tinystr", 753 | "zerovec", 754 | ] 755 | 756 | [[package]] 757 | name = "icu_locid_transform_data" 758 | version = "1.5.0" 759 | source = "registry+https://github.com/rust-lang/crates.io-index" 760 | checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" 761 | 762 | [[package]] 763 | name = "icu_normalizer" 764 | version = "1.5.0" 765 | source = "registry+https://github.com/rust-lang/crates.io-index" 766 | checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" 767 | dependencies = [ 768 | "displaydoc", 769 | "icu_collections", 770 | "icu_normalizer_data", 771 | "icu_properties", 772 | "icu_provider", 773 | "smallvec 1.14.0", 774 | "utf16_iter", 775 | "utf8_iter", 776 | "write16", 777 | "zerovec", 778 | ] 779 | 780 | [[package]] 781 | name = "icu_normalizer_data" 782 | version = "1.5.0" 783 | source = "registry+https://github.com/rust-lang/crates.io-index" 784 | checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" 785 | 786 | [[package]] 787 | name = "icu_properties" 788 | version = "1.5.1" 789 | source = "registry+https://github.com/rust-lang/crates.io-index" 790 | checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" 791 | dependencies = [ 792 | "displaydoc", 793 | "icu_collections", 794 | "icu_locid_transform", 795 | "icu_properties_data", 796 | "icu_provider", 797 | "tinystr", 798 | "zerovec", 799 | ] 800 | 801 | [[package]] 802 | name = "icu_properties_data" 803 | version = "1.5.0" 804 | source = "registry+https://github.com/rust-lang/crates.io-index" 805 | checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" 806 | 807 | [[package]] 808 | name = "icu_provider" 809 | version = "1.5.0" 810 | source = "registry+https://github.com/rust-lang/crates.io-index" 811 | checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" 812 | dependencies = [ 813 | "displaydoc", 814 | "icu_locid", 815 | "icu_provider_macros", 816 | "stable_deref_trait", 817 | "tinystr", 818 | "writeable", 819 | "yoke", 820 | "zerofrom", 821 | "zerovec", 822 | ] 823 | 824 | [[package]] 825 | name = "icu_provider_macros" 826 | version = "1.5.0" 827 | source = "registry+https://github.com/rust-lang/crates.io-index" 828 | checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" 829 | dependencies = [ 830 | "proc-macro2", 831 | "quote", 832 | "syn", 833 | ] 834 | 835 | [[package]] 836 | name = "idna" 837 | version = "1.0.3" 838 | source = "registry+https://github.com/rust-lang/crates.io-index" 839 | checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" 840 | dependencies = [ 841 | "idna_adapter", 842 | "smallvec 1.14.0", 843 | "utf8_iter", 844 | ] 845 | 846 | [[package]] 847 | name = "idna_adapter" 848 | version = "1.2.0" 849 | source = "registry+https://github.com/rust-lang/crates.io-index" 850 | checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" 851 | dependencies = [ 852 | "icu_normalizer", 853 | "icu_properties", 854 | ] 855 | 856 | [[package]] 857 | name = "indexmap" 858 | version = "2.7.1" 859 | source = "registry+https://github.com/rust-lang/crates.io-index" 860 | checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" 861 | dependencies = [ 862 | "equivalent", 863 | "hashbrown", 864 | ] 865 | 866 | [[package]] 867 | name = "indicatif" 868 | version = "0.17.11" 869 | source = "registry+https://github.com/rust-lang/crates.io-index" 870 | checksum = "183b3088984b400f4cfac3620d5e076c84da5364016b4f49473de574b2586235" 871 | dependencies = [ 872 | "console", 873 | "number_prefix", 874 | "portable-atomic", 875 | "unicode-width", 876 | "web-time", 877 | ] 878 | 879 | [[package]] 880 | name = "inout" 881 | version = "0.1.4" 882 | source = "registry+https://github.com/rust-lang/crates.io-index" 883 | checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" 884 | dependencies = [ 885 | "generic-array", 886 | ] 887 | 888 | [[package]] 889 | name = "ipnet" 890 | version = "2.11.0" 891 | source = "registry+https://github.com/rust-lang/crates.io-index" 892 | checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" 893 | 894 | [[package]] 895 | name = "is_terminal_polyfill" 896 | version = "1.70.1" 897 | source = "registry+https://github.com/rust-lang/crates.io-index" 898 | checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" 899 | 900 | [[package]] 901 | name = "itoa" 902 | version = "1.0.15" 903 | source = "registry+https://github.com/rust-lang/crates.io-index" 904 | checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" 905 | 906 | [[package]] 907 | name = "js-sys" 908 | version = "0.3.77" 909 | source = "registry+https://github.com/rust-lang/crates.io-index" 910 | checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" 911 | dependencies = [ 912 | "once_cell", 913 | "wasm-bindgen", 914 | ] 915 | 916 | [[package]] 917 | name = "libc" 918 | version = "0.2.170" 919 | source = "registry+https://github.com/rust-lang/crates.io-index" 920 | checksum = "875b3680cb2f8f71bdcf9a30f38d48282f5d3c95cbf9b3fa57269bb5d5c06828" 921 | 922 | [[package]] 923 | name = "linux-raw-sys" 924 | version = "0.9.2" 925 | source = "registry+https://github.com/rust-lang/crates.io-index" 926 | checksum = "6db9c683daf087dc577b7506e9695b3d556a9f3849903fa28186283afd6809e9" 927 | 928 | [[package]] 929 | name = "litemap" 930 | version = "0.7.5" 931 | source = "registry+https://github.com/rust-lang/crates.io-index" 932 | checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" 933 | 934 | [[package]] 935 | name = "lock_api" 936 | version = "0.4.12" 937 | source = "registry+https://github.com/rust-lang/crates.io-index" 938 | checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 939 | dependencies = [ 940 | "autocfg 1.4.0", 941 | "scopeguard", 942 | ] 943 | 944 | [[package]] 945 | name = "log" 946 | version = "0.4.26" 947 | source = "registry+https://github.com/rust-lang/crates.io-index" 948 | checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" 949 | 950 | [[package]] 951 | name = "maybe-uninit" 952 | version = "2.0.0" 953 | source = "registry+https://github.com/rust-lang/crates.io-index" 954 | checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" 955 | 956 | [[package]] 957 | name = "memchr" 958 | version = "2.7.4" 959 | source = "registry+https://github.com/rust-lang/crates.io-index" 960 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 961 | 962 | [[package]] 963 | name = "mime" 964 | version = "0.3.17" 965 | source = "registry+https://github.com/rust-lang/crates.io-index" 966 | checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 967 | 968 | [[package]] 969 | name = "miniz_oxide" 970 | version = "0.8.5" 971 | source = "registry+https://github.com/rust-lang/crates.io-index" 972 | checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" 973 | dependencies = [ 974 | "adler2", 975 | ] 976 | 977 | [[package]] 978 | name = "mio" 979 | version = "1.0.3" 980 | source = "registry+https://github.com/rust-lang/crates.io-index" 981 | checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" 982 | dependencies = [ 983 | "libc", 984 | "wasi 0.11.0+wasi-snapshot-preview1", 985 | "windows-sys 0.52.0", 986 | ] 987 | 988 | [[package]] 989 | name = "native-tls" 990 | version = "0.2.14" 991 | source = "registry+https://github.com/rust-lang/crates.io-index" 992 | checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" 993 | dependencies = [ 994 | "libc", 995 | "log", 996 | "openssl", 997 | "openssl-probe", 998 | "openssl-sys", 999 | "schannel", 1000 | "security-framework", 1001 | "security-framework-sys", 1002 | "tempfile", 1003 | ] 1004 | 1005 | [[package]] 1006 | name = "number_prefix" 1007 | version = "0.4.0" 1008 | source = "registry+https://github.com/rust-lang/crates.io-index" 1009 | checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" 1010 | 1011 | [[package]] 1012 | name = "object" 1013 | version = "0.36.7" 1014 | source = "registry+https://github.com/rust-lang/crates.io-index" 1015 | checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" 1016 | dependencies = [ 1017 | "memchr", 1018 | ] 1019 | 1020 | [[package]] 1021 | name = "once_cell" 1022 | version = "1.20.3" 1023 | source = "registry+https://github.com/rust-lang/crates.io-index" 1024 | checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" 1025 | 1026 | [[package]] 1027 | name = "opaque-debug" 1028 | version = "0.3.1" 1029 | source = "registry+https://github.com/rust-lang/crates.io-index" 1030 | checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" 1031 | 1032 | [[package]] 1033 | name = "openssl" 1034 | version = "0.10.71" 1035 | source = "registry+https://github.com/rust-lang/crates.io-index" 1036 | checksum = "5e14130c6a98cd258fdcb0fb6d744152343ff729cbfcb28c656a9d12b999fbcd" 1037 | dependencies = [ 1038 | "bitflags 2.9.0", 1039 | "cfg-if", 1040 | "foreign-types", 1041 | "libc", 1042 | "once_cell", 1043 | "openssl-macros", 1044 | "openssl-sys", 1045 | ] 1046 | 1047 | [[package]] 1048 | name = "openssl-macros" 1049 | version = "0.1.1" 1050 | source = "registry+https://github.com/rust-lang/crates.io-index" 1051 | checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" 1052 | dependencies = [ 1053 | "proc-macro2", 1054 | "quote", 1055 | "syn", 1056 | ] 1057 | 1058 | [[package]] 1059 | name = "openssl-probe" 1060 | version = "0.1.6" 1061 | source = "registry+https://github.com/rust-lang/crates.io-index" 1062 | checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" 1063 | 1064 | [[package]] 1065 | name = "openssl-sys" 1066 | version = "0.9.106" 1067 | source = "registry+https://github.com/rust-lang/crates.io-index" 1068 | checksum = "8bb61ea9811cc39e3c2069f40b8b8e2e70d8569b361f879786cc7ed48b777cdd" 1069 | dependencies = [ 1070 | "cc", 1071 | "libc", 1072 | "pkg-config", 1073 | "vcpkg", 1074 | ] 1075 | 1076 | [[package]] 1077 | name = "parking_lot" 1078 | version = "0.12.3" 1079 | source = "registry+https://github.com/rust-lang/crates.io-index" 1080 | checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" 1081 | dependencies = [ 1082 | "lock_api", 1083 | "parking_lot_core", 1084 | ] 1085 | 1086 | [[package]] 1087 | name = "parking_lot_core" 1088 | version = "0.9.10" 1089 | source = "registry+https://github.com/rust-lang/crates.io-index" 1090 | checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 1091 | dependencies = [ 1092 | "cfg-if", 1093 | "libc", 1094 | "redox_syscall", 1095 | "smallvec 1.14.0", 1096 | "windows-targets 0.52.6", 1097 | ] 1098 | 1099 | [[package]] 1100 | name = "pbkdf2" 1101 | version = "0.12.2" 1102 | source = "registry+https://github.com/rust-lang/crates.io-index" 1103 | checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" 1104 | dependencies = [ 1105 | "digest", 1106 | "hmac", 1107 | ] 1108 | 1109 | [[package]] 1110 | name = "percent-encoding" 1111 | version = "2.3.1" 1112 | source = "registry+https://github.com/rust-lang/crates.io-index" 1113 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 1114 | 1115 | [[package]] 1116 | name = "pin-project-lite" 1117 | version = "0.2.16" 1118 | source = "registry+https://github.com/rust-lang/crates.io-index" 1119 | checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 1120 | 1121 | [[package]] 1122 | name = "pin-utils" 1123 | version = "0.1.0" 1124 | source = "registry+https://github.com/rust-lang/crates.io-index" 1125 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1126 | 1127 | [[package]] 1128 | name = "pkcs8" 1129 | version = "0.10.2" 1130 | source = "registry+https://github.com/rust-lang/crates.io-index" 1131 | checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" 1132 | dependencies = [ 1133 | "der", 1134 | "spki", 1135 | ] 1136 | 1137 | [[package]] 1138 | name = "pkg-config" 1139 | version = "0.3.32" 1140 | source = "registry+https://github.com/rust-lang/crates.io-index" 1141 | checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" 1142 | 1143 | [[package]] 1144 | name = "polyval" 1145 | version = "0.6.2" 1146 | source = "registry+https://github.com/rust-lang/crates.io-index" 1147 | checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" 1148 | dependencies = [ 1149 | "cfg-if", 1150 | "cpufeatures", 1151 | "opaque-debug", 1152 | "universal-hash", 1153 | ] 1154 | 1155 | [[package]] 1156 | name = "portable-atomic" 1157 | version = "1.11.0" 1158 | source = "registry+https://github.com/rust-lang/crates.io-index" 1159 | checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" 1160 | 1161 | [[package]] 1162 | name = "ppv-lite86" 1163 | version = "0.2.21" 1164 | source = "registry+https://github.com/rust-lang/crates.io-index" 1165 | checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" 1166 | dependencies = [ 1167 | "zerocopy", 1168 | ] 1169 | 1170 | [[package]] 1171 | name = "proc-macro2" 1172 | version = "1.0.94" 1173 | source = "registry+https://github.com/rust-lang/crates.io-index" 1174 | checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" 1175 | dependencies = [ 1176 | "unicode-ident", 1177 | ] 1178 | 1179 | [[package]] 1180 | name = "quote" 1181 | version = "1.0.39" 1182 | source = "registry+https://github.com/rust-lang/crates.io-index" 1183 | checksum = "c1f1914ce909e1658d9907913b4b91947430c7d9be598b15a1912935b8c04801" 1184 | dependencies = [ 1185 | "proc-macro2", 1186 | ] 1187 | 1188 | [[package]] 1189 | name = "rand" 1190 | version = "0.6.5" 1191 | source = "registry+https://github.com/rust-lang/crates.io-index" 1192 | checksum = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" 1193 | dependencies = [ 1194 | "autocfg 0.1.8", 1195 | "libc", 1196 | "rand_chacha 0.1.1", 1197 | "rand_core 0.4.2", 1198 | "rand_hc", 1199 | "rand_isaac", 1200 | "rand_jitter", 1201 | "rand_os", 1202 | "rand_pcg", 1203 | "rand_xorshift", 1204 | "winapi", 1205 | ] 1206 | 1207 | [[package]] 1208 | name = "rand" 1209 | version = "0.8.5" 1210 | source = "registry+https://github.com/rust-lang/crates.io-index" 1211 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1212 | dependencies = [ 1213 | "libc", 1214 | "rand_chacha 0.3.1", 1215 | "rand_core 0.6.4", 1216 | ] 1217 | 1218 | [[package]] 1219 | name = "rand_chacha" 1220 | version = "0.1.1" 1221 | source = "registry+https://github.com/rust-lang/crates.io-index" 1222 | checksum = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" 1223 | dependencies = [ 1224 | "autocfg 0.1.8", 1225 | "rand_core 0.3.1", 1226 | ] 1227 | 1228 | [[package]] 1229 | name = "rand_chacha" 1230 | version = "0.3.1" 1231 | source = "registry+https://github.com/rust-lang/crates.io-index" 1232 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 1233 | dependencies = [ 1234 | "ppv-lite86", 1235 | "rand_core 0.6.4", 1236 | ] 1237 | 1238 | [[package]] 1239 | name = "rand_core" 1240 | version = "0.3.1" 1241 | source = "registry+https://github.com/rust-lang/crates.io-index" 1242 | checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" 1243 | dependencies = [ 1244 | "rand_core 0.4.2", 1245 | ] 1246 | 1247 | [[package]] 1248 | name = "rand_core" 1249 | version = "0.4.2" 1250 | source = "registry+https://github.com/rust-lang/crates.io-index" 1251 | checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" 1252 | 1253 | [[package]] 1254 | name = "rand_core" 1255 | version = "0.6.4" 1256 | source = "registry+https://github.com/rust-lang/crates.io-index" 1257 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1258 | dependencies = [ 1259 | "getrandom 0.2.15", 1260 | ] 1261 | 1262 | [[package]] 1263 | name = "rand_hc" 1264 | version = "0.1.0" 1265 | source = "registry+https://github.com/rust-lang/crates.io-index" 1266 | checksum = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" 1267 | dependencies = [ 1268 | "rand_core 0.3.1", 1269 | ] 1270 | 1271 | [[package]] 1272 | name = "rand_isaac" 1273 | version = "0.1.1" 1274 | source = "registry+https://github.com/rust-lang/crates.io-index" 1275 | checksum = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" 1276 | dependencies = [ 1277 | "rand_core 0.3.1", 1278 | ] 1279 | 1280 | [[package]] 1281 | name = "rand_jitter" 1282 | version = "0.1.4" 1283 | source = "registry+https://github.com/rust-lang/crates.io-index" 1284 | checksum = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" 1285 | dependencies = [ 1286 | "libc", 1287 | "rand_core 0.4.2", 1288 | "winapi", 1289 | ] 1290 | 1291 | [[package]] 1292 | name = "rand_os" 1293 | version = "0.1.3" 1294 | source = "registry+https://github.com/rust-lang/crates.io-index" 1295 | checksum = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" 1296 | dependencies = [ 1297 | "cloudabi", 1298 | "fuchsia-cprng", 1299 | "libc", 1300 | "rand_core 0.4.2", 1301 | "rdrand", 1302 | "winapi", 1303 | ] 1304 | 1305 | [[package]] 1306 | name = "rand_pcg" 1307 | version = "0.1.2" 1308 | source = "registry+https://github.com/rust-lang/crates.io-index" 1309 | checksum = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" 1310 | dependencies = [ 1311 | "autocfg 0.1.8", 1312 | "rand_core 0.4.2", 1313 | ] 1314 | 1315 | [[package]] 1316 | name = "rand_xorshift" 1317 | version = "0.1.1" 1318 | source = "registry+https://github.com/rust-lang/crates.io-index" 1319 | checksum = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" 1320 | dependencies = [ 1321 | "rand_core 0.3.1", 1322 | ] 1323 | 1324 | [[package]] 1325 | name = "rdrand" 1326 | version = "0.4.0" 1327 | source = "registry+https://github.com/rust-lang/crates.io-index" 1328 | checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" 1329 | dependencies = [ 1330 | "rand_core 0.3.1", 1331 | ] 1332 | 1333 | [[package]] 1334 | name = "redox_syscall" 1335 | version = "0.5.10" 1336 | source = "registry+https://github.com/rust-lang/crates.io-index" 1337 | checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1" 1338 | dependencies = [ 1339 | "bitflags 2.9.0", 1340 | ] 1341 | 1342 | [[package]] 1343 | name = "reqwest" 1344 | version = "0.11.27" 1345 | source = "registry+https://github.com/rust-lang/crates.io-index" 1346 | checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" 1347 | dependencies = [ 1348 | "base64", 1349 | "bytes", 1350 | "encoding_rs", 1351 | "futures-core", 1352 | "futures-util", 1353 | "h2", 1354 | "http", 1355 | "http-body", 1356 | "hyper", 1357 | "hyper-tls", 1358 | "ipnet", 1359 | "js-sys", 1360 | "log", 1361 | "mime", 1362 | "native-tls", 1363 | "once_cell", 1364 | "percent-encoding", 1365 | "pin-project-lite", 1366 | "rustls-pemfile", 1367 | "serde", 1368 | "serde_json", 1369 | "serde_urlencoded", 1370 | "sync_wrapper", 1371 | "system-configuration", 1372 | "tokio", 1373 | "tokio-native-tls", 1374 | "tower-service", 1375 | "url", 1376 | "wasm-bindgen", 1377 | "wasm-bindgen-futures", 1378 | "web-sys", 1379 | "winreg", 1380 | ] 1381 | 1382 | [[package]] 1383 | name = "rpassword" 1384 | version = "7.3.1" 1385 | source = "registry+https://github.com/rust-lang/crates.io-index" 1386 | checksum = "80472be3c897911d0137b2d2b9055faf6eeac5b14e324073d83bc17b191d7e3f" 1387 | dependencies = [ 1388 | "libc", 1389 | "rtoolbox", 1390 | "windows-sys 0.48.0", 1391 | ] 1392 | 1393 | [[package]] 1394 | name = "rtoolbox" 1395 | version = "0.0.2" 1396 | source = "registry+https://github.com/rust-lang/crates.io-index" 1397 | checksum = "c247d24e63230cdb56463ae328478bd5eac8b8faa8c69461a77e8e323afac90e" 1398 | dependencies = [ 1399 | "libc", 1400 | "windows-sys 0.48.0", 1401 | ] 1402 | 1403 | [[package]] 1404 | name = "rustc-demangle" 1405 | version = "0.1.24" 1406 | source = "registry+https://github.com/rust-lang/crates.io-index" 1407 | checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" 1408 | 1409 | [[package]] 1410 | name = "rustc_version" 1411 | version = "0.4.1" 1412 | source = "registry+https://github.com/rust-lang/crates.io-index" 1413 | checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" 1414 | dependencies = [ 1415 | "semver", 1416 | ] 1417 | 1418 | [[package]] 1419 | name = "rustix" 1420 | version = "1.0.1" 1421 | source = "registry+https://github.com/rust-lang/crates.io-index" 1422 | checksum = "dade4812df5c384711475be5fcd8c162555352945401aed22a35bffeab61f657" 1423 | dependencies = [ 1424 | "bitflags 2.9.0", 1425 | "errno", 1426 | "libc", 1427 | "linux-raw-sys", 1428 | "windows-sys 0.59.0", 1429 | ] 1430 | 1431 | [[package]] 1432 | name = "rustls-pemfile" 1433 | version = "1.0.4" 1434 | source = "registry+https://github.com/rust-lang/crates.io-index" 1435 | checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" 1436 | dependencies = [ 1437 | "base64", 1438 | ] 1439 | 1440 | [[package]] 1441 | name = "rustversion" 1442 | version = "1.0.20" 1443 | source = "registry+https://github.com/rust-lang/crates.io-index" 1444 | checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" 1445 | 1446 | [[package]] 1447 | name = "ryu" 1448 | version = "1.0.20" 1449 | source = "registry+https://github.com/rust-lang/crates.io-index" 1450 | checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" 1451 | 1452 | [[package]] 1453 | name = "schannel" 1454 | version = "0.1.27" 1455 | source = "registry+https://github.com/rust-lang/crates.io-index" 1456 | checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" 1457 | dependencies = [ 1458 | "windows-sys 0.59.0", 1459 | ] 1460 | 1461 | [[package]] 1462 | name = "scopeguard" 1463 | version = "1.2.0" 1464 | source = "registry+https://github.com/rust-lang/crates.io-index" 1465 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 1466 | 1467 | [[package]] 1468 | name = "security-framework" 1469 | version = "2.11.1" 1470 | source = "registry+https://github.com/rust-lang/crates.io-index" 1471 | checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" 1472 | dependencies = [ 1473 | "bitflags 2.9.0", 1474 | "core-foundation", 1475 | "core-foundation-sys", 1476 | "libc", 1477 | "security-framework-sys", 1478 | ] 1479 | 1480 | [[package]] 1481 | name = "security-framework-sys" 1482 | version = "2.14.0" 1483 | source = "registry+https://github.com/rust-lang/crates.io-index" 1484 | checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" 1485 | dependencies = [ 1486 | "core-foundation-sys", 1487 | "libc", 1488 | ] 1489 | 1490 | [[package]] 1491 | name = "semver" 1492 | version = "1.0.26" 1493 | source = "registry+https://github.com/rust-lang/crates.io-index" 1494 | checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" 1495 | 1496 | [[package]] 1497 | name = "serde" 1498 | version = "1.0.219" 1499 | source = "registry+https://github.com/rust-lang/crates.io-index" 1500 | checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" 1501 | dependencies = [ 1502 | "serde_derive", 1503 | ] 1504 | 1505 | [[package]] 1506 | name = "serde_derive" 1507 | version = "1.0.219" 1508 | source = "registry+https://github.com/rust-lang/crates.io-index" 1509 | checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" 1510 | dependencies = [ 1511 | "proc-macro2", 1512 | "quote", 1513 | "syn", 1514 | ] 1515 | 1516 | [[package]] 1517 | name = "serde_json" 1518 | version = "1.0.140" 1519 | source = "registry+https://github.com/rust-lang/crates.io-index" 1520 | checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" 1521 | dependencies = [ 1522 | "itoa", 1523 | "memchr", 1524 | "ryu", 1525 | "serde", 1526 | ] 1527 | 1528 | [[package]] 1529 | name = "serde_urlencoded" 1530 | version = "0.7.1" 1531 | source = "registry+https://github.com/rust-lang/crates.io-index" 1532 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 1533 | dependencies = [ 1534 | "form_urlencoded", 1535 | "itoa", 1536 | "ryu", 1537 | "serde", 1538 | ] 1539 | 1540 | [[package]] 1541 | name = "sha2" 1542 | version = "0.10.8" 1543 | source = "registry+https://github.com/rust-lang/crates.io-index" 1544 | checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" 1545 | dependencies = [ 1546 | "cfg-if", 1547 | "cpufeatures", 1548 | "digest", 1549 | ] 1550 | 1551 | [[package]] 1552 | name = "shlex" 1553 | version = "1.3.0" 1554 | source = "registry+https://github.com/rust-lang/crates.io-index" 1555 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 1556 | 1557 | [[package]] 1558 | name = "signal-hook-registry" 1559 | version = "1.4.2" 1560 | source = "registry+https://github.com/rust-lang/crates.io-index" 1561 | checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" 1562 | dependencies = [ 1563 | "libc", 1564 | ] 1565 | 1566 | [[package]] 1567 | name = "signature" 1568 | version = "2.2.0" 1569 | source = "registry+https://github.com/rust-lang/crates.io-index" 1570 | checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" 1571 | dependencies = [ 1572 | "rand_core 0.6.4", 1573 | ] 1574 | 1575 | [[package]] 1576 | name = "slab" 1577 | version = "0.4.9" 1578 | source = "registry+https://github.com/rust-lang/crates.io-index" 1579 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 1580 | dependencies = [ 1581 | "autocfg 1.4.0", 1582 | ] 1583 | 1584 | [[package]] 1585 | name = "smallvec" 1586 | version = "0.6.14" 1587 | source = "registry+https://github.com/rust-lang/crates.io-index" 1588 | checksum = "b97fcaeba89edba30f044a10c6a3cc39df9c3f17d7cd829dd1446cab35f890e0" 1589 | dependencies = [ 1590 | "maybe-uninit", 1591 | ] 1592 | 1593 | [[package]] 1594 | name = "smallvec" 1595 | version = "1.14.0" 1596 | source = "registry+https://github.com/rust-lang/crates.io-index" 1597 | checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" 1598 | 1599 | [[package]] 1600 | name = "socket2" 1601 | version = "0.5.8" 1602 | source = "registry+https://github.com/rust-lang/crates.io-index" 1603 | checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" 1604 | dependencies = [ 1605 | "libc", 1606 | "windows-sys 0.52.0", 1607 | ] 1608 | 1609 | [[package]] 1610 | name = "soundness-cli" 1611 | version = "0.1.0" 1612 | dependencies = [ 1613 | "aes-gcm", 1614 | "anyhow", 1615 | "base64", 1616 | "bip39", 1617 | "clap", 1618 | "ed25519-dalek", 1619 | "generic-array", 1620 | "hex", 1621 | "indicatif", 1622 | "once_cell", 1623 | "pbkdf2", 1624 | "rand 0.8.5", 1625 | "rand_chacha 0.3.1", 1626 | "rand_core 0.6.4", 1627 | "reqwest", 1628 | "rpassword", 1629 | "serde", 1630 | "serde_json", 1631 | "sha2", 1632 | "tempfile", 1633 | "tokio", 1634 | "typenum", 1635 | ] 1636 | 1637 | [[package]] 1638 | name = "spki" 1639 | version = "0.7.3" 1640 | source = "registry+https://github.com/rust-lang/crates.io-index" 1641 | checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" 1642 | dependencies = [ 1643 | "base64ct", 1644 | "der", 1645 | ] 1646 | 1647 | [[package]] 1648 | name = "stable_deref_trait" 1649 | version = "1.2.0" 1650 | source = "registry+https://github.com/rust-lang/crates.io-index" 1651 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 1652 | 1653 | [[package]] 1654 | name = "strsim" 1655 | version = "0.11.1" 1656 | source = "registry+https://github.com/rust-lang/crates.io-index" 1657 | checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 1658 | 1659 | [[package]] 1660 | name = "subtle" 1661 | version = "2.6.1" 1662 | source = "registry+https://github.com/rust-lang/crates.io-index" 1663 | checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 1664 | 1665 | [[package]] 1666 | name = "syn" 1667 | version = "2.0.100" 1668 | source = "registry+https://github.com/rust-lang/crates.io-index" 1669 | checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" 1670 | dependencies = [ 1671 | "proc-macro2", 1672 | "quote", 1673 | "unicode-ident", 1674 | ] 1675 | 1676 | [[package]] 1677 | name = "sync_wrapper" 1678 | version = "0.1.2" 1679 | source = "registry+https://github.com/rust-lang/crates.io-index" 1680 | checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" 1681 | 1682 | [[package]] 1683 | name = "synstructure" 1684 | version = "0.13.1" 1685 | source = "registry+https://github.com/rust-lang/crates.io-index" 1686 | checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" 1687 | dependencies = [ 1688 | "proc-macro2", 1689 | "quote", 1690 | "syn", 1691 | ] 1692 | 1693 | [[package]] 1694 | name = "system-configuration" 1695 | version = "0.5.1" 1696 | source = "registry+https://github.com/rust-lang/crates.io-index" 1697 | checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" 1698 | dependencies = [ 1699 | "bitflags 1.3.2", 1700 | "core-foundation", 1701 | "system-configuration-sys", 1702 | ] 1703 | 1704 | [[package]] 1705 | name = "system-configuration-sys" 1706 | version = "0.5.0" 1707 | source = "registry+https://github.com/rust-lang/crates.io-index" 1708 | checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" 1709 | dependencies = [ 1710 | "core-foundation-sys", 1711 | "libc", 1712 | ] 1713 | 1714 | [[package]] 1715 | name = "tempfile" 1716 | version = "3.18.0" 1717 | source = "registry+https://github.com/rust-lang/crates.io-index" 1718 | checksum = "2c317e0a526ee6120d8dabad239c8dadca62b24b6f168914bbbc8e2fb1f0e567" 1719 | dependencies = [ 1720 | "cfg-if", 1721 | "fastrand", 1722 | "getrandom 0.3.1", 1723 | "once_cell", 1724 | "rustix", 1725 | "windows-sys 0.59.0", 1726 | ] 1727 | 1728 | [[package]] 1729 | name = "tinystr" 1730 | version = "0.7.6" 1731 | source = "registry+https://github.com/rust-lang/crates.io-index" 1732 | checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" 1733 | dependencies = [ 1734 | "displaydoc", 1735 | "zerovec", 1736 | ] 1737 | 1738 | [[package]] 1739 | name = "tokio" 1740 | version = "1.44.0" 1741 | source = "registry+https://github.com/rust-lang/crates.io-index" 1742 | checksum = "9975ea0f48b5aa3972bf2d888c238182458437cc2a19374b81b25cdf1023fb3a" 1743 | dependencies = [ 1744 | "backtrace", 1745 | "bytes", 1746 | "libc", 1747 | "mio", 1748 | "parking_lot", 1749 | "pin-project-lite", 1750 | "signal-hook-registry", 1751 | "socket2", 1752 | "tokio-macros", 1753 | "windows-sys 0.52.0", 1754 | ] 1755 | 1756 | [[package]] 1757 | name = "tokio-macros" 1758 | version = "2.5.0" 1759 | source = "registry+https://github.com/rust-lang/crates.io-index" 1760 | checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" 1761 | dependencies = [ 1762 | "proc-macro2", 1763 | "quote", 1764 | "syn", 1765 | ] 1766 | 1767 | [[package]] 1768 | name = "tokio-native-tls" 1769 | version = "0.3.1" 1770 | source = "registry+https://github.com/rust-lang/crates.io-index" 1771 | checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" 1772 | dependencies = [ 1773 | "native-tls", 1774 | "tokio", 1775 | ] 1776 | 1777 | [[package]] 1778 | name = "tokio-util" 1779 | version = "0.7.13" 1780 | source = "registry+https://github.com/rust-lang/crates.io-index" 1781 | checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" 1782 | dependencies = [ 1783 | "bytes", 1784 | "futures-core", 1785 | "futures-sink", 1786 | "pin-project-lite", 1787 | "tokio", 1788 | ] 1789 | 1790 | [[package]] 1791 | name = "tower-service" 1792 | version = "0.3.3" 1793 | source = "registry+https://github.com/rust-lang/crates.io-index" 1794 | checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" 1795 | 1796 | [[package]] 1797 | name = "tracing" 1798 | version = "0.1.41" 1799 | source = "registry+https://github.com/rust-lang/crates.io-index" 1800 | checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 1801 | dependencies = [ 1802 | "pin-project-lite", 1803 | "tracing-core", 1804 | ] 1805 | 1806 | [[package]] 1807 | name = "tracing-core" 1808 | version = "0.1.33" 1809 | source = "registry+https://github.com/rust-lang/crates.io-index" 1810 | checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" 1811 | dependencies = [ 1812 | "once_cell", 1813 | ] 1814 | 1815 | [[package]] 1816 | name = "try-lock" 1817 | version = "0.2.5" 1818 | source = "registry+https://github.com/rust-lang/crates.io-index" 1819 | checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" 1820 | 1821 | [[package]] 1822 | name = "typenum" 1823 | version = "1.18.0" 1824 | source = "registry+https://github.com/rust-lang/crates.io-index" 1825 | checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" 1826 | 1827 | [[package]] 1828 | name = "unicode-ident" 1829 | version = "1.0.18" 1830 | source = "registry+https://github.com/rust-lang/crates.io-index" 1831 | checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" 1832 | 1833 | [[package]] 1834 | name = "unicode-normalization" 1835 | version = "0.1.9" 1836 | source = "registry+https://github.com/rust-lang/crates.io-index" 1837 | checksum = "09c8070a9942f5e7cfccd93f490fdebd230ee3c3c9f107cb25bad5351ef671cf" 1838 | dependencies = [ 1839 | "smallvec 0.6.14", 1840 | ] 1841 | 1842 | [[package]] 1843 | name = "unicode-width" 1844 | version = "0.2.0" 1845 | source = "registry+https://github.com/rust-lang/crates.io-index" 1846 | checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" 1847 | 1848 | [[package]] 1849 | name = "universal-hash" 1850 | version = "0.5.1" 1851 | source = "registry+https://github.com/rust-lang/crates.io-index" 1852 | checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" 1853 | dependencies = [ 1854 | "crypto-common", 1855 | "subtle", 1856 | ] 1857 | 1858 | [[package]] 1859 | name = "url" 1860 | version = "2.5.4" 1861 | source = "registry+https://github.com/rust-lang/crates.io-index" 1862 | checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" 1863 | dependencies = [ 1864 | "form_urlencoded", 1865 | "idna", 1866 | "percent-encoding", 1867 | ] 1868 | 1869 | [[package]] 1870 | name = "utf16_iter" 1871 | version = "1.0.5" 1872 | source = "registry+https://github.com/rust-lang/crates.io-index" 1873 | checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" 1874 | 1875 | [[package]] 1876 | name = "utf8_iter" 1877 | version = "1.0.4" 1878 | source = "registry+https://github.com/rust-lang/crates.io-index" 1879 | checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 1880 | 1881 | [[package]] 1882 | name = "utf8parse" 1883 | version = "0.2.2" 1884 | source = "registry+https://github.com/rust-lang/crates.io-index" 1885 | checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" 1886 | 1887 | [[package]] 1888 | name = "vcpkg" 1889 | version = "0.2.15" 1890 | source = "registry+https://github.com/rust-lang/crates.io-index" 1891 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 1892 | 1893 | [[package]] 1894 | name = "version_check" 1895 | version = "0.9.5" 1896 | source = "registry+https://github.com/rust-lang/crates.io-index" 1897 | checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 1898 | 1899 | [[package]] 1900 | name = "want" 1901 | version = "0.3.1" 1902 | source = "registry+https://github.com/rust-lang/crates.io-index" 1903 | checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" 1904 | dependencies = [ 1905 | "try-lock", 1906 | ] 1907 | 1908 | [[package]] 1909 | name = "wasi" 1910 | version = "0.11.0+wasi-snapshot-preview1" 1911 | source = "registry+https://github.com/rust-lang/crates.io-index" 1912 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 1913 | 1914 | [[package]] 1915 | name = "wasi" 1916 | version = "0.13.3+wasi-0.2.2" 1917 | source = "registry+https://github.com/rust-lang/crates.io-index" 1918 | checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" 1919 | dependencies = [ 1920 | "wit-bindgen-rt", 1921 | ] 1922 | 1923 | [[package]] 1924 | name = "wasm-bindgen" 1925 | version = "0.2.100" 1926 | source = "registry+https://github.com/rust-lang/crates.io-index" 1927 | checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 1928 | dependencies = [ 1929 | "cfg-if", 1930 | "once_cell", 1931 | "rustversion", 1932 | "wasm-bindgen-macro", 1933 | ] 1934 | 1935 | [[package]] 1936 | name = "wasm-bindgen-backend" 1937 | version = "0.2.100" 1938 | source = "registry+https://github.com/rust-lang/crates.io-index" 1939 | checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" 1940 | dependencies = [ 1941 | "bumpalo", 1942 | "log", 1943 | "proc-macro2", 1944 | "quote", 1945 | "syn", 1946 | "wasm-bindgen-shared", 1947 | ] 1948 | 1949 | [[package]] 1950 | name = "wasm-bindgen-futures" 1951 | version = "0.4.50" 1952 | source = "registry+https://github.com/rust-lang/crates.io-index" 1953 | checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" 1954 | dependencies = [ 1955 | "cfg-if", 1956 | "js-sys", 1957 | "once_cell", 1958 | "wasm-bindgen", 1959 | "web-sys", 1960 | ] 1961 | 1962 | [[package]] 1963 | name = "wasm-bindgen-macro" 1964 | version = "0.2.100" 1965 | source = "registry+https://github.com/rust-lang/crates.io-index" 1966 | checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 1967 | dependencies = [ 1968 | "quote", 1969 | "wasm-bindgen-macro-support", 1970 | ] 1971 | 1972 | [[package]] 1973 | name = "wasm-bindgen-macro-support" 1974 | version = "0.2.100" 1975 | source = "registry+https://github.com/rust-lang/crates.io-index" 1976 | checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 1977 | dependencies = [ 1978 | "proc-macro2", 1979 | "quote", 1980 | "syn", 1981 | "wasm-bindgen-backend", 1982 | "wasm-bindgen-shared", 1983 | ] 1984 | 1985 | [[package]] 1986 | name = "wasm-bindgen-shared" 1987 | version = "0.2.100" 1988 | source = "registry+https://github.com/rust-lang/crates.io-index" 1989 | checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 1990 | dependencies = [ 1991 | "unicode-ident", 1992 | ] 1993 | 1994 | [[package]] 1995 | name = "web-sys" 1996 | version = "0.3.77" 1997 | source = "registry+https://github.com/rust-lang/crates.io-index" 1998 | checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" 1999 | dependencies = [ 2000 | "js-sys", 2001 | "wasm-bindgen", 2002 | ] 2003 | 2004 | [[package]] 2005 | name = "web-time" 2006 | version = "1.1.0" 2007 | source = "registry+https://github.com/rust-lang/crates.io-index" 2008 | checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" 2009 | dependencies = [ 2010 | "js-sys", 2011 | "wasm-bindgen", 2012 | ] 2013 | 2014 | [[package]] 2015 | name = "winapi" 2016 | version = "0.3.9" 2017 | source = "registry+https://github.com/rust-lang/crates.io-index" 2018 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 2019 | dependencies = [ 2020 | "winapi-i686-pc-windows-gnu", 2021 | "winapi-x86_64-pc-windows-gnu", 2022 | ] 2023 | 2024 | [[package]] 2025 | name = "winapi-i686-pc-windows-gnu" 2026 | version = "0.4.0" 2027 | source = "registry+https://github.com/rust-lang/crates.io-index" 2028 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 2029 | 2030 | [[package]] 2031 | name = "winapi-x86_64-pc-windows-gnu" 2032 | version = "0.4.0" 2033 | source = "registry+https://github.com/rust-lang/crates.io-index" 2034 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 2035 | 2036 | [[package]] 2037 | name = "windows-sys" 2038 | version = "0.48.0" 2039 | source = "registry+https://github.com/rust-lang/crates.io-index" 2040 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 2041 | dependencies = [ 2042 | "windows-targets 0.48.5", 2043 | ] 2044 | 2045 | [[package]] 2046 | name = "windows-sys" 2047 | version = "0.52.0" 2048 | source = "registry+https://github.com/rust-lang/crates.io-index" 2049 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 2050 | dependencies = [ 2051 | "windows-targets 0.52.6", 2052 | ] 2053 | 2054 | [[package]] 2055 | name = "windows-sys" 2056 | version = "0.59.0" 2057 | source = "registry+https://github.com/rust-lang/crates.io-index" 2058 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 2059 | dependencies = [ 2060 | "windows-targets 0.52.6", 2061 | ] 2062 | 2063 | [[package]] 2064 | name = "windows-targets" 2065 | version = "0.48.5" 2066 | source = "registry+https://github.com/rust-lang/crates.io-index" 2067 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 2068 | dependencies = [ 2069 | "windows_aarch64_gnullvm 0.48.5", 2070 | "windows_aarch64_msvc 0.48.5", 2071 | "windows_i686_gnu 0.48.5", 2072 | "windows_i686_msvc 0.48.5", 2073 | "windows_x86_64_gnu 0.48.5", 2074 | "windows_x86_64_gnullvm 0.48.5", 2075 | "windows_x86_64_msvc 0.48.5", 2076 | ] 2077 | 2078 | [[package]] 2079 | name = "windows-targets" 2080 | version = "0.52.6" 2081 | source = "registry+https://github.com/rust-lang/crates.io-index" 2082 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 2083 | dependencies = [ 2084 | "windows_aarch64_gnullvm 0.52.6", 2085 | "windows_aarch64_msvc 0.52.6", 2086 | "windows_i686_gnu 0.52.6", 2087 | "windows_i686_gnullvm", 2088 | "windows_i686_msvc 0.52.6", 2089 | "windows_x86_64_gnu 0.52.6", 2090 | "windows_x86_64_gnullvm 0.52.6", 2091 | "windows_x86_64_msvc 0.52.6", 2092 | ] 2093 | 2094 | [[package]] 2095 | name = "windows_aarch64_gnullvm" 2096 | version = "0.48.5" 2097 | source = "registry+https://github.com/rust-lang/crates.io-index" 2098 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 2099 | 2100 | [[package]] 2101 | name = "windows_aarch64_gnullvm" 2102 | version = "0.52.6" 2103 | source = "registry+https://github.com/rust-lang/crates.io-index" 2104 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 2105 | 2106 | [[package]] 2107 | name = "windows_aarch64_msvc" 2108 | version = "0.48.5" 2109 | source = "registry+https://github.com/rust-lang/crates.io-index" 2110 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 2111 | 2112 | [[package]] 2113 | name = "windows_aarch64_msvc" 2114 | version = "0.52.6" 2115 | source = "registry+https://github.com/rust-lang/crates.io-index" 2116 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 2117 | 2118 | [[package]] 2119 | name = "windows_i686_gnu" 2120 | version = "0.48.5" 2121 | source = "registry+https://github.com/rust-lang/crates.io-index" 2122 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 2123 | 2124 | [[package]] 2125 | name = "windows_i686_gnu" 2126 | version = "0.52.6" 2127 | source = "registry+https://github.com/rust-lang/crates.io-index" 2128 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 2129 | 2130 | [[package]] 2131 | name = "windows_i686_gnullvm" 2132 | version = "0.52.6" 2133 | source = "registry+https://github.com/rust-lang/crates.io-index" 2134 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 2135 | 2136 | [[package]] 2137 | name = "windows_i686_msvc" 2138 | version = "0.48.5" 2139 | source = "registry+https://github.com/rust-lang/crates.io-index" 2140 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 2141 | 2142 | [[package]] 2143 | name = "windows_i686_msvc" 2144 | version = "0.52.6" 2145 | source = "registry+https://github.com/rust-lang/crates.io-index" 2146 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 2147 | 2148 | [[package]] 2149 | name = "windows_x86_64_gnu" 2150 | version = "0.48.5" 2151 | source = "registry+https://github.com/rust-lang/crates.io-index" 2152 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 2153 | 2154 | [[package]] 2155 | name = "windows_x86_64_gnu" 2156 | version = "0.52.6" 2157 | source = "registry+https://github.com/rust-lang/crates.io-index" 2158 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 2159 | 2160 | [[package]] 2161 | name = "windows_x86_64_gnullvm" 2162 | version = "0.48.5" 2163 | source = "registry+https://github.com/rust-lang/crates.io-index" 2164 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 2165 | 2166 | [[package]] 2167 | name = "windows_x86_64_gnullvm" 2168 | version = "0.52.6" 2169 | source = "registry+https://github.com/rust-lang/crates.io-index" 2170 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 2171 | 2172 | [[package]] 2173 | name = "windows_x86_64_msvc" 2174 | version = "0.48.5" 2175 | source = "registry+https://github.com/rust-lang/crates.io-index" 2176 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 2177 | 2178 | [[package]] 2179 | name = "windows_x86_64_msvc" 2180 | version = "0.52.6" 2181 | source = "registry+https://github.com/rust-lang/crates.io-index" 2182 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 2183 | 2184 | [[package]] 2185 | name = "winreg" 2186 | version = "0.50.0" 2187 | source = "registry+https://github.com/rust-lang/crates.io-index" 2188 | checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" 2189 | dependencies = [ 2190 | "cfg-if", 2191 | "windows-sys 0.48.0", 2192 | ] 2193 | 2194 | [[package]] 2195 | name = "wit-bindgen-rt" 2196 | version = "0.33.0" 2197 | source = "registry+https://github.com/rust-lang/crates.io-index" 2198 | checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" 2199 | dependencies = [ 2200 | "bitflags 2.9.0", 2201 | ] 2202 | 2203 | [[package]] 2204 | name = "write16" 2205 | version = "1.0.0" 2206 | source = "registry+https://github.com/rust-lang/crates.io-index" 2207 | checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" 2208 | 2209 | [[package]] 2210 | name = "writeable" 2211 | version = "0.5.5" 2212 | source = "registry+https://github.com/rust-lang/crates.io-index" 2213 | checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" 2214 | 2215 | [[package]] 2216 | name = "yoke" 2217 | version = "0.7.5" 2218 | source = "registry+https://github.com/rust-lang/crates.io-index" 2219 | checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" 2220 | dependencies = [ 2221 | "serde", 2222 | "stable_deref_trait", 2223 | "yoke-derive", 2224 | "zerofrom", 2225 | ] 2226 | 2227 | [[package]] 2228 | name = "yoke-derive" 2229 | version = "0.7.5" 2230 | source = "registry+https://github.com/rust-lang/crates.io-index" 2231 | checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" 2232 | dependencies = [ 2233 | "proc-macro2", 2234 | "quote", 2235 | "syn", 2236 | "synstructure", 2237 | ] 2238 | 2239 | [[package]] 2240 | name = "zerocopy" 2241 | version = "0.8.23" 2242 | source = "registry+https://github.com/rust-lang/crates.io-index" 2243 | checksum = "fd97444d05a4328b90e75e503a34bad781f14e28a823ad3557f0750df1ebcbc6" 2244 | dependencies = [ 2245 | "zerocopy-derive", 2246 | ] 2247 | 2248 | [[package]] 2249 | name = "zerocopy-derive" 2250 | version = "0.8.23" 2251 | source = "registry+https://github.com/rust-lang/crates.io-index" 2252 | checksum = "6352c01d0edd5db859a63e2605f4ea3183ddbd15e2c4a9e7d32184df75e4f154" 2253 | dependencies = [ 2254 | "proc-macro2", 2255 | "quote", 2256 | "syn", 2257 | ] 2258 | 2259 | [[package]] 2260 | name = "zerofrom" 2261 | version = "0.1.6" 2262 | source = "registry+https://github.com/rust-lang/crates.io-index" 2263 | checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" 2264 | dependencies = [ 2265 | "zerofrom-derive", 2266 | ] 2267 | 2268 | [[package]] 2269 | name = "zerofrom-derive" 2270 | version = "0.1.6" 2271 | source = "registry+https://github.com/rust-lang/crates.io-index" 2272 | checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" 2273 | dependencies = [ 2274 | "proc-macro2", 2275 | "quote", 2276 | "syn", 2277 | "synstructure", 2278 | ] 2279 | 2280 | [[package]] 2281 | name = "zeroize" 2282 | version = "1.8.1" 2283 | source = "registry+https://github.com/rust-lang/crates.io-index" 2284 | checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" 2285 | 2286 | [[package]] 2287 | name = "zerovec" 2288 | version = "0.10.4" 2289 | source = "registry+https://github.com/rust-lang/crates.io-index" 2290 | checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" 2291 | dependencies = [ 2292 | "yoke", 2293 | "zerofrom", 2294 | "zerovec-derive", 2295 | ] 2296 | 2297 | [[package]] 2298 | name = "zerovec-derive" 2299 | version = "0.10.3" 2300 | source = "registry+https://github.com/rust-lang/crates.io-index" 2301 | checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" 2302 | dependencies = [ 2303 | "proc-macro2", 2304 | "quote", 2305 | "syn", 2306 | ] 2307 | -------------------------------------------------------------------------------- /soundness-cli/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "soundness-cli" 3 | version = "0.1.0" 4 | edition = "2021" 5 | authors = ["Rocky "] 6 | description = "A CLI tool for sending proofs to Soundness Layer" 7 | 8 | [dependencies] 9 | clap = { version = "4.4", features = ["derive"] } 10 | reqwest = { version = "0.11", features = ["json"] } 11 | anyhow = "1.0" 12 | indicatif = "0.17" 13 | base64 = "0.21" 14 | ed25519-dalek = { version = "2.0", features = ["rand_core"] } 15 | rand = "0.8" 16 | rand_core = "0.6" 17 | bip39 = { version = "1.0", features = ["rand"] } 18 | serde = { version = "1.0", features = ["derive"] } 19 | serde_json = "1.0" 20 | tokio = { version = "1.0", features = ["full"] } 21 | rand_chacha = "0.3" 22 | aes-gcm = "0.10" 23 | pbkdf2 = "0.12" 24 | rpassword = "7.3" 25 | hex = "0.4" 26 | sha2 = "0.10" 27 | generic-array = "0.14" 28 | typenum = "1.16" 29 | once_cell = "1.19" 30 | 31 | [dev-dependencies] 32 | tempfile = "3.8" 33 | -------------------------------------------------------------------------------- /soundness-cli/README.md: -------------------------------------------------------------------------------- 1 | # Soundness CLI 2 | 3 | A command-line interface tool for interacting with Soundness Layer testnet. 4 | 5 | ## Quick Installation 6 | 7 | Install the CLI with a single command: 8 | 9 | ```bash 10 | curl -sSL https://raw.githubusercontent.com/soundnesslabs/soundness-layer/main/soundnessup/install | bash 11 | ``` 12 | 13 | After installation, restart your terminal or run: 14 | ```bash 15 | source ~/.bashrc # for bash 16 | # or 17 | source ~/.zshenv # for zsh 18 | ``` 19 | 20 | Then you can use the CLI: 21 | ```bash 22 | soundnessup install # Install the CLI 23 | soundnessup update # Update to the latest version 24 | ``` 25 | 26 | ## Manual Installation 27 | 28 | If you prefer to install manually, you can use Cargo: 29 | 30 | ```bash 31 | cargo install --path . 32 | ``` 33 | 34 | ## Testnet Registration 35 | First of all, please follow us on [X](https://x.com/SoundnessLabs). 36 | To join the testnet, generate your keys and head to our `testnet-access` channel in [Discord](https://discord.gg/F4cGbdqgw8) and request access using: 37 | 38 | ```bash 39 | !access 40 | ``` 41 | 42 | ## Usage 43 | 44 | ### Generating a Key Pair 45 | 46 | To generate a new key pair for signing requests: 47 | 48 | ```bash 49 | soundness-cli generate-key --name my-key 50 | ``` 51 | 52 | ### Importing a Key Pair 53 | 54 | To import an existing key pair from a mnemonic phrase: 55 | 56 | ```bash 57 | soundness-cli import-key --name my-key 58 | ``` 59 | 60 | ### Listing Key Pairs 61 | 62 | To view all stored key pairs and their associated public keys: 63 | 64 | ```bash 65 | soundness-cli list-keys 66 | ``` 67 | 68 | ### Exporting Key Mnemonic 69 | 70 | To export the mnemonic phrase for a stored key pair: 71 | 72 | ```bash 73 | soundness-cli export-key --name my-key 74 | ``` 75 | 76 | > ⚠️ **Warning**: Keep your mnemonic phrase secure and never share it with anyone. Anyone with your mnemonic can access your key pair. 77 | 78 | 87 | -------------------------------------------------------------------------------- /soundness-cli/src/main.rs: -------------------------------------------------------------------------------- 1 | use aes_gcm::{ 2 | aead::{Aead, KeyInit}, 3 | Aes256Gcm, Key, Nonce, 4 | }; 5 | use anyhow::{Context, Result}; 6 | use base64::{engine::general_purpose::STANDARD as BASE64, Engine}; 7 | use bip39; 8 | use clap::{Parser, Subcommand}; 9 | use ed25519_dalek::{Signer, SigningKey}; 10 | use indicatif::{ProgressBar, ProgressStyle}; 11 | use once_cell::sync::Lazy; 12 | use pbkdf2::pbkdf2_hmac_array; 13 | use rand::{rngs::OsRng, RngCore}; 14 | use rpassword::prompt_password; 15 | use serde::{Deserialize, Serialize}; 16 | use sha2::{Digest, Sha256}; 17 | use std::collections::HashMap; 18 | use std::fs; 19 | use std::path::PathBuf; 20 | use std::sync::Mutex; 21 | use std::time::Duration; 22 | use std::str::FromStr; 23 | 24 | const SALT_LENGTH: usize = 32; 25 | const NONCE_LENGTH: usize = 12; 26 | const KEY_LENGTH: usize = 32; 27 | const ITERATIONS: u32 = 100_000; 28 | 29 | // Add a static variable to store the password and key store hash 30 | static PASSWORD_CACHE: Lazy>> = Lazy::new(|| Mutex::new(None)); 31 | 32 | #[derive(Parser, Debug)] 33 | #[command(author, version, about, long_about = None)] 34 | struct Args { 35 | /// API endpoint URL (default: http://localhost:3000) 36 | #[arg(short, long, default_value = "http://localhost:3000")] 37 | endpoint: String, 38 | 39 | #[command(subcommand)] 40 | command: Commands, 41 | } 42 | 43 | #[derive(Subcommand, Debug)] 44 | enum Commands { 45 | /// Generate a new key pair 46 | GenerateKey { 47 | /// Name for the key pair 48 | #[arg(short, long)] 49 | name: String, 50 | }, 51 | /// List all saved key pairs 52 | ListKeys, 53 | /// Export mnemonic for a key pair 54 | ExportKey { 55 | /// Name of the key pair to export 56 | #[arg(short, long)] 57 | name: String, 58 | }, 59 | /// Import a key pair from a mnemonic phrase 60 | ImportKey { 61 | /// Name for the imported key pair 62 | #[arg(short, long)] 63 | name: String, 64 | }, 65 | /// Send a proof and ELF file to the server 66 | Send { 67 | /// Path to the proof file 68 | #[arg(short, long)] 69 | proof_file: PathBuf, 70 | 71 | /// Path to the ELF file 72 | #[arg(short = 'l', long)] 73 | elf_file: PathBuf, 74 | 75 | /// Name of the key pair to use for signing 76 | #[arg(short, long)] 77 | key_name: String, 78 | 79 | /// Proving system to use (default: sp1) 80 | #[arg(short = 's', long, default_value = "sp1")] 81 | proving_system: ProvingSystem, 82 | }, 83 | } 84 | 85 | #[derive(Debug, Clone, Copy, PartialEq, Eq, clap::ValueEnum)] 86 | enum ProvingSystem { 87 | Sp1, 88 | Circom, 89 | Risc0, 90 | Starknet, 91 | } 92 | 93 | #[derive(Debug, Serialize, Deserialize)] 94 | struct KeyPair { 95 | public_key: Vec, 96 | public_key_string: String, 97 | #[serde(skip_serializing_if = "Option::is_none")] 98 | encrypted_secret_key: Option, 99 | } 100 | 101 | #[derive(Debug, Serialize, Deserialize)] 102 | struct EncryptedSecretKey { 103 | salt: Vec, 104 | nonce: Vec, 105 | encrypted_data: Vec, 106 | } 107 | 108 | #[derive(Debug, Serialize, Deserialize)] 109 | struct KeyStore { 110 | keys: HashMap, 111 | } 112 | 113 | fn derive_key(password: &str, salt: &[u8]) -> [u8; KEY_LENGTH] { 114 | pbkdf2_hmac_array::(password.as_bytes(), salt, ITERATIONS) 115 | } 116 | 117 | fn encrypt_secret_key(secret_key: &[u8], password: &str) -> Result { 118 | let mut rng = OsRng; 119 | let mut salt = [0u8; SALT_LENGTH]; 120 | let mut nonce = [0u8; NONCE_LENGTH]; 121 | rng.fill_bytes(&mut salt); 122 | rng.fill_bytes(&mut nonce); 123 | 124 | let key_bytes = derive_key(password, &salt); 125 | let key = Key::::from_slice(&key_bytes); 126 | let cipher = Aes256Gcm::new(key); 127 | 128 | let encrypted_data = cipher 129 | .encrypt(Nonce::from_slice(&nonce), secret_key) 130 | .map_err(|e| anyhow::anyhow!("Encryption failed: {}", e))?; 131 | 132 | Ok(EncryptedSecretKey { 133 | salt: salt.to_vec(), 134 | nonce: nonce.to_vec(), 135 | encrypted_data, 136 | }) 137 | } 138 | 139 | fn decrypt_secret_key(encrypted: &EncryptedSecretKey, password: &str) -> Result> { 140 | let key_bytes = derive_key(password, &encrypted.salt); 141 | let key = Key::::from_slice(&key_bytes); 142 | let cipher = Aes256Gcm::new(key); 143 | 144 | cipher 145 | .decrypt( 146 | Nonce::from_slice(&encrypted.nonce), 147 | encrypted.encrypted_data.as_slice(), 148 | ) 149 | .map_err(|e| anyhow::anyhow!("Decryption failed: {}", e)) 150 | } 151 | 152 | fn create_progress_bar(message: &str) -> ProgressBar { 153 | let pb = ProgressBar::new_spinner(); 154 | pb.set_style( 155 | ProgressStyle::default_spinner() 156 | .template("{spinner:.green} {msg}") 157 | .unwrap(), 158 | ); 159 | pb.set_message(message.to_string()); 160 | pb.enable_steady_tick(Duration::from_millis(120)); 161 | pb 162 | } 163 | 164 | fn load_key_store() -> Result { 165 | let key_store_path = PathBuf::from("key_store.json"); 166 | if key_store_path.exists() { 167 | let contents = fs::read_to_string(&key_store_path)?; 168 | let key_store: KeyStore = serde_json::from_str(&contents)?; 169 | Ok(key_store) 170 | } else { 171 | Ok(KeyStore { 172 | keys: HashMap::new(), 173 | }) 174 | } 175 | } 176 | 177 | fn save_key_store(key_store: &KeyStore) -> Result<()> { 178 | let key_store_path = PathBuf::from("key_store.json"); 179 | let contents = serde_json::to_string_pretty(key_store)?; 180 | fs::write(key_store_path, contents)?; 181 | Ok(()) 182 | } 183 | 184 | fn generate_key_pair(name: &str) -> Result<()> { 185 | let mut key_store = load_key_store()?; 186 | 187 | if key_store.keys.contains_key(name) { 188 | anyhow::bail!("Key pair with name '{}' already exists", name); 189 | } 190 | 191 | // Generate a new key pair 192 | let mut rng = OsRng; 193 | let signing_key = SigningKey::generate(&mut rng); 194 | let verifying_key = signing_key.verifying_key(); 195 | let public_key_bytes = verifying_key.to_bytes(); 196 | let public_key_string = BASE64.encode(&public_key_bytes); 197 | 198 | // Generate mnemonic from secret key 199 | let secret_key_bytes = signing_key.to_bytes(); 200 | let mnemonic = bip39::Mnemonic::from_entropy(&secret_key_bytes) 201 | .map_err(|e| anyhow::anyhow!("Failed to generate mnemonic: {}", e))?; 202 | let mnemonic_string = mnemonic.to_string(); 203 | 204 | println!("\n📝 IMPORTANT: Save this mnemonic phrase securely for your testnet participation!"); 205 | println!("⚠️ WARNING: This is the only time you'll see this mnemonic! You'll need it to recover your secret key if the key store is lost!\n"); 206 | println!("{}", mnemonic_string); 207 | 208 | // Get password for secret key encryption 209 | let password = prompt_password("\nEnter password for secret key: ") 210 | .map_err(|e| anyhow::anyhow!("Failed to read password: {}", e))?; 211 | let confirm_password = prompt_password("Confirm password: ") 212 | .map_err(|e| anyhow::anyhow!("Failed to read password: {}", e))?; 213 | 214 | if password != confirm_password { 215 | anyhow::bail!("Passwords do not match"); 216 | } 217 | 218 | // Encrypt the secret key 219 | let encrypted_secret = encrypt_secret_key(&secret_key_bytes, &password)?; 220 | 221 | // Save the key pair 222 | key_store.keys.insert( 223 | name.to_string(), 224 | KeyPair { 225 | public_key: public_key_bytes.to_vec(), 226 | public_key_string: public_key_string.clone(), 227 | encrypted_secret_key: Some(encrypted_secret), 228 | }, 229 | ); 230 | 231 | save_key_store(&key_store)?; 232 | println!("\n✅ Generated new key pair '{}'", name); 233 | println!("🔑 Public key: {}", public_key_string); 234 | Ok(()) 235 | } 236 | 237 | fn list_keys() -> Result<()> { 238 | let key_store = load_key_store()?; 239 | 240 | if key_store.keys.is_empty() { 241 | println!("No key pairs found. Generate one with 'generate-key' command."); 242 | return Ok(()); 243 | } 244 | 245 | println!("Available key pairs:"); 246 | for (name, key_pair) in key_store.keys { 247 | println!("- {} (Public key: {})", name, key_pair.public_key_string); 248 | } 249 | Ok(()) 250 | } 251 | 252 | // Calculate hash of key store contents 253 | fn calculate_key_store_hash(key_store: &KeyStore) -> String { 254 | let serialized = serde_json::to_string(key_store).unwrap_or_default(); 255 | format!("{:x}", Sha256::digest(serialized.as_bytes())) 256 | } 257 | 258 | fn sign_payload(payload: &[u8], key_name: &str) -> Result> { 259 | let key_store = load_key_store()?; 260 | let key_store_hash = calculate_key_store_hash(&key_store); 261 | 262 | let key_pair = key_store 263 | .keys 264 | .get(key_name) 265 | .ok_or_else(|| anyhow::anyhow!("Key pair '{}' not found", key_name))?; 266 | 267 | let encrypted_secret = key_pair 268 | .encrypted_secret_key 269 | .as_ref() 270 | .ok_or_else(|| anyhow::anyhow!("Secret key not found for '{}'", key_name))?; 271 | 272 | // Create a new scope for the password guard to ensure it's dropped properly 273 | let password = { 274 | let mut password_guard = PASSWORD_CACHE.lock().unwrap(); 275 | 276 | if let Some((stored_password, stored_hash)) = password_guard.as_ref() { 277 | // Check if key store has changed 278 | if stored_hash != &key_store_hash { 279 | *password_guard = None; 280 | drop(password_guard); 281 | return sign_payload(payload, key_name); 282 | } 283 | stored_password.clone() 284 | } else { 285 | // If no password is stored, prompt for it 286 | let new_password = prompt_password("Enter password to decrypt the secret key: ") 287 | .map_err(|e| anyhow::anyhow!("Failed to read password: {}", e))?; 288 | 289 | // Try to decrypt with the password to verify it's correct 290 | if let Err(e) = decrypt_secret_key(encrypted_secret, &new_password) { 291 | anyhow::bail!("Invalid password: {}", e); 292 | } 293 | 294 | // Store the password and key store hash 295 | *password_guard = Some((new_password.clone(), key_store_hash)); 296 | new_password 297 | } 298 | }; // password_guard is dropped here 299 | 300 | // Only show the progress bar after we have the password 301 | let pb = create_progress_bar("✍️ Signing payload..."); 302 | 303 | let secret_key_bytes = decrypt_secret_key(encrypted_secret, &password)?; 304 | let secret_key_array: [u8; 32] = secret_key_bytes.clone() 305 | .try_into() 306 | .map_err(|_| anyhow::anyhow!("Invalid secret key length"))?; 307 | 308 | let signing_key = SigningKey::from_bytes(&secret_key_array); 309 | let signature = signing_key.sign(payload); 310 | pb.finish_with_message("✍️ Payload signed successfully"); 311 | 312 | Ok(signature.to_bytes().to_vec()) 313 | } 314 | 315 | fn get_public_key(key_name: &str) -> Result> { 316 | let key_store = load_key_store()?; 317 | let key_pair = key_store 318 | .keys 319 | .get(key_name) 320 | .ok_or_else(|| anyhow::anyhow!("Key pair '{}' not found", key_name))?; 321 | Ok(key_pair.public_key.clone()) 322 | } 323 | 324 | fn export_key(name: &str) -> Result<()> { 325 | let key_store = load_key_store()?; 326 | let key_pair = key_store 327 | .keys 328 | .get(name) 329 | .ok_or_else(|| anyhow::anyhow!("Key pair '{}' not found", name))?; 330 | 331 | let encrypted_secret = key_pair 332 | .encrypted_secret_key 333 | .as_ref() 334 | .ok_or_else(|| anyhow::anyhow!("Secret key not found for '{}'", name))?; 335 | 336 | // Prompt for password 337 | let password = prompt_password("Enter password to decrypt the secret key: ") 338 | .map_err(|e| anyhow::anyhow!("Failed to read password: {}", e))?; 339 | 340 | // Decrypt the secret key with better error handling 341 | let secret_key_bytes = match decrypt_secret_key(encrypted_secret, &password) { 342 | Ok(bytes) => bytes, 343 | Err(_) => { 344 | println!("\n❌ Error: Invalid password. Please try again with the correct password."); 345 | return Ok(()); 346 | } 347 | }; 348 | 349 | // Generate mnemonic from secret key 350 | let mnemonic = bip39::Mnemonic::from_entropy(&secret_key_bytes) 351 | .map_err(|e| anyhow::anyhow!("Failed to generate mnemonic: {}", e))?; 352 | let mnemonic_string = mnemonic.to_string(); 353 | 354 | println!("\n🔑 Mnemonic for key pair '{}':\n", name); 355 | println!("{}", mnemonic_string); 356 | println!("\n⚠️ WARNING: Keep this mnemonic secure and never share it with anyone!"); 357 | Ok(()) 358 | } 359 | 360 | fn import_key(name: &str) -> Result<()> { 361 | let mut key_store = load_key_store()?; 362 | 363 | if key_store.keys.contains_key(name) { 364 | anyhow::bail!("Key pair with name '{}' already exists", name); 365 | } 366 | 367 | // Prompt for mnemonic 368 | println!("\nEnter your mnemonic phrase (12 or 24 words):"); 369 | let mut mnemonic_input = String::new(); 370 | std::io::stdin().read_line(&mut mnemonic_input)?; 371 | let mnemonic_input = mnemonic_input.trim(); 372 | 373 | // Parse mnemonic 374 | let mnemonic = bip39::Mnemonic::from_str(mnemonic_input) 375 | .map_err(|e| anyhow::anyhow!("Invalid mnemonic phrase: {}", e))?; 376 | 377 | // Convert mnemonic to secret key 378 | let secret_key_bytes = mnemonic.to_entropy(); 379 | let secret_key_array: [u8; 32] = secret_key_bytes.clone() 380 | .try_into() 381 | .map_err(|_| anyhow::anyhow!("Invalid secret key length"))?; 382 | 383 | // Create signing key and get public key 384 | let signing_key = SigningKey::from_bytes(&secret_key_array); 385 | let verifying_key = signing_key.verifying_key(); 386 | let public_key_bytes = verifying_key.to_bytes(); 387 | let public_key_string = BASE64.encode(&public_key_bytes); 388 | 389 | // Get password for secret key encryption 390 | let password = prompt_password("\nEnter password to encrypt the secret key: ") 391 | .map_err(|e| anyhow::anyhow!("Failed to read password: {}", e))?; 392 | let confirm_password = prompt_password("Confirm password: ") 393 | .map_err(|e| anyhow::anyhow!("Failed to read password: {}", e))?; 394 | 395 | if password != confirm_password { 396 | anyhow::bail!("Passwords do not match"); 397 | } 398 | 399 | // Encrypt the secret key 400 | let encrypted_secret = encrypt_secret_key(&secret_key_bytes, &password)?; 401 | 402 | // Save the key pair 403 | key_store.keys.insert( 404 | name.to_string(), 405 | KeyPair { 406 | public_key: public_key_bytes.to_vec(), 407 | public_key_string: public_key_string.clone(), 408 | encrypted_secret_key: Some(encrypted_secret), 409 | }, 410 | ); 411 | 412 | save_key_store(&key_store)?; 413 | println!("\n✅ Successfully imported key pair '{}'", name); 414 | println!("🔑 Public key: {}", public_key_string); 415 | Ok(()) 416 | } 417 | 418 | #[tokio::main] 419 | async fn main() -> Result<()> { 420 | let args = Args::parse(); 421 | let client = reqwest::Client::new(); 422 | 423 | match args.command { 424 | Commands::GenerateKey { name } => { 425 | generate_key_pair(&name)?; 426 | } 427 | Commands::ListKeys => { 428 | list_keys()?; 429 | } 430 | Commands::ExportKey { name } => { 431 | export_key(&name)?; 432 | } 433 | Commands::ImportKey { name } => { 434 | import_key(&name)?; 435 | } 436 | Commands::Send { 437 | proof_file, 438 | elf_file, 439 | key_name, 440 | proving_system, 441 | } => { 442 | // Create progress bars 443 | let reading_pb = create_progress_bar("📂 Reading files..."); 444 | 445 | // Read the files as binary data 446 | let proof_content = fs::read(&proof_file) 447 | .with_context(|| format!("Failed to read proof file: {}", proof_file.display()))?; 448 | 449 | let elf_content = fs::read(&elf_file) 450 | .with_context(|| format!("Failed to read ELF file: {}", elf_file.display()))?; 451 | 452 | reading_pb.finish_with_message("📂 Files read successfully"); 453 | 454 | // Create the request body with canonical string 455 | let request_body = serde_json::json!({ 456 | "proof": BASE64.encode(&proof_content), 457 | "elf": BASE64.encode(&elf_content), 458 | "proof_filename": proof_file.file_name() 459 | .and_then(|n| n.to_str()) 460 | .unwrap_or("unknown"), 461 | "elf_filename": elf_file.file_name() 462 | .and_then(|n| n.to_str()) 463 | .unwrap_or("unknown"), 464 | "proving_system": format!("{:?}", proving_system).to_lowercase(), 465 | "canonical_string": format!( 466 | "proof:{}\nelf:{}\nproof_filename:{}\nelf_filename:{}\nproving_system:{}", 467 | BASE64.encode(&proof_content), 468 | BASE64.encode(&elf_content), 469 | proof_file.file_name().and_then(|n| n.to_str()).unwrap_or("unknown"), 470 | elf_file.file_name().and_then(|n| n.to_str()).unwrap_or("unknown"), 471 | format!("{:?}", proving_system).to_lowercase() 472 | ) 473 | }); 474 | 475 | // Sign the canonical string 476 | let canonical_string = request_body["canonical_string"].as_str().unwrap(); 477 | let signature = sign_payload(canonical_string.as_bytes(), &key_name)?; 478 | let public_key = get_public_key(&key_name)?; 479 | 480 | // Send the request 481 | let sending_pb = create_progress_bar("🚀 Sending to server..."); 482 | let response = client 483 | .post(format!("{}/api/proof", args.endpoint)) 484 | .header("Content-Type", "application/json") 485 | .header("X-Signature", BASE64.encode(&signature)) 486 | .header("X-Public-Key", BASE64.encode(&public_key)) 487 | .json(&request_body) 488 | .send() 489 | .await 490 | .with_context(|| format!("Failed to send request to {}", args.endpoint))?; 491 | 492 | sending_pb.finish_with_message("🚀 Request sent successfully"); 493 | 494 | // Check if the request was successful 495 | if response.status().is_success() { 496 | println!("\n✅ Successfully sent files to {}", args.endpoint); 497 | let response_text = response.text().await?; 498 | println!("Server response: {}", response_text); 499 | } else { 500 | println!("\n❌ Error: Server returned status {}", response.status()); 501 | let error_text = response.text().await?; 502 | println!("Error details: {}", error_text); 503 | } 504 | } 505 | } 506 | 507 | Ok(()) 508 | } 509 | -------------------------------------------------------------------------------- /soundness-cli/test_files/sp1_fibonacci.elf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SoundnessLabs/soundness-layer/a3b49e3b98c736a28c05a24607c437eca7438ae2/soundness-cli/test_files/sp1_fibonacci.elf -------------------------------------------------------------------------------- /soundness-cli/test_files/sp1_fibonacci.proof: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SoundnessLabs/soundness-layer/a3b49e3b98c736a28c05a24607c437eca7438ae2/soundness-cli/test_files/sp1_fibonacci.proof -------------------------------------------------------------------------------- /soundness-cli/tests/e2e_test.rs: -------------------------------------------------------------------------------- 1 | use anyhow::Result; 2 | use std::fs; 3 | use std::process::Command; 4 | use tempfile::tempdir; 5 | 6 | fn run_cli_command(args: &[&str]) -> Result { 7 | let output = Command::new("cargo") 8 | .arg("run") 9 | .arg("--") 10 | .args(args) 11 | .output()?; 12 | 13 | if !output.status.success() { 14 | let stderr = String::from_utf8_lossy(&output.stderr); 15 | anyhow::bail!("Command failed: {}", stderr); 16 | } 17 | 18 | Ok(String::from_utf8_lossy(&output.stdout).to_string()) 19 | } 20 | 21 | #[test] 22 | fn test_signature_verification() -> Result<()> { 23 | // Create a temporary directory for test files 24 | let temp_dir = tempdir()?; 25 | let temp_path = temp_dir.path(); 26 | 27 | // Generate a test key pair 28 | let key_name = "test_key"; 29 | run_cli_command(&["generate-key", "--name", key_name])?; 30 | 31 | // Create test files 32 | let proof_content = "test proof content"; 33 | let elf_content = "test elf content"; 34 | 35 | let proof_path = temp_path.join("test.proof"); 36 | let elf_path = temp_path.join("test.elf"); 37 | 38 | fs::write(&proof_path, proof_content)?; 39 | fs::write(&elf_path, elf_content)?; 40 | 41 | // Send the files to the server 42 | let output = run_cli_command(&[ 43 | "send", 44 | "--proof-file", 45 | proof_path.to_str().unwrap(), 46 | "--elf-file", 47 | elf_path.to_str().unwrap(), 48 | "--key-name", 49 | key_name, 50 | ])?; 51 | 52 | // Verify the response contains success message 53 | assert!( 54 | output.contains("Successfully sent files"), 55 | "Expected success message, got: {}", 56 | output 57 | ); 58 | 59 | Ok(()) 60 | } 61 | -------------------------------------------------------------------------------- /soundness-cli/tests/run_e2e_tests.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Start the server in the background 4 | cd ../soundness-server 5 | cargo run & 6 | SERVER_PID=$! 7 | 8 | # Wait for the server to start 9 | sleep 2 10 | 11 | # Run the tests 12 | cd ../soundness-cli 13 | cargo test --test e2e_test -- --nocapture 14 | 15 | # Kill the server 16 | kill $SERVER_PID -------------------------------------------------------------------------------- /soundnessup/install: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -e 4 | 5 | echo "🚀 Installing soundnessup..." && echo 6 | 7 | BASE_DIR=$HOME 8 | SOUNDNESS_DIR=${SOUNDNESS_DIR-"$BASE_DIR/.soundness"} 9 | SOUNDNESS_BIN_DIR="$SOUNDNESS_DIR/bin" 10 | BIN_URL="https://raw.githubusercontent.com/soundnesslabs/soundness-layer/main/soundnessup/soundnessup" 11 | BIN_PATH="$SOUNDNESS_BIN_DIR/soundnessup" 12 | 13 | # Create the .soundness bin directory and soundnessup binary if it doesn't exist. 14 | mkdir -p $SOUNDNESS_BIN_DIR 15 | curl -# -L $BIN_URL -o $BIN_PATH 16 | chmod +x $BIN_PATH 17 | 18 | # Store the correct profile file (i.e. .profile for bash or .zshenv for ZSH). 19 | case $SHELL in 20 | */zsh) 21 | PROFILE=${ZDOTDIR-"$HOME"}/.zshenv 22 | PREF_SHELL=zsh 23 | ;; 24 | */bash) 25 | PROFILE=$HOME/.bashrc 26 | PREF_SHELL=bash 27 | ;; 28 | */fish) 29 | PROFILE=$HOME/.config/fish/config.fish 30 | PREF_SHELL=fish 31 | ;; 32 | */ash) 33 | PROFILE=$HOME/.profile 34 | PREF_SHELL=ash 35 | ;; 36 | *) 37 | echo "soundnessup: could not detect shell, manually add ${SOUNDNESS_BIN_DIR} to your PATH." 38 | exit 1 39 | esac 40 | 41 | # Only add soundnessup if it isn't already in PATH. 42 | if [[ ":$PATH:" != *":${SOUNDNESS_BIN_DIR}:"* ]]; then 43 | # Add the soundnessup directory to the path and ensure the old PATH variables remain. 44 | echo >> $PROFILE && echo "export PATH=\"\$PATH:$SOUNDNESS_BIN_DIR\"" >> $PROFILE 45 | fi 46 | 47 | echo && echo "✅ Installation complete!" 48 | echo && echo "🔍 Detected shell: ${PREF_SHELL}" 49 | echo "🔗 Added soundnessup to PATH" 50 | echo && echo "To start using soundnessup, please run:" 51 | echo && echo "▶ source ${PROFILE}" 52 | echo "▶ soundnessup" 53 | echo && echo "🎉 Enjoy using soundnessup! For help, type 'soundnessup --help'" -------------------------------------------------------------------------------- /soundnessup/soundnessup: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -e 4 | 5 | # Colors for output 6 | RED='\033[0;31m' 7 | GREEN='\033[0;32m' 8 | YELLOW='\033[1;33m' 9 | NC='\033[0m' # No Color 10 | 11 | # Version information 12 | VERSION="0.1.0" 13 | REPO="soundnesslabs/soundness-layer" 14 | CLI_BINARY="soundness-cli" 15 | 16 | # Installation directories 17 | BASE_DIR=$HOME 18 | SOUNDNESS_DIR=${SOUNDNESS_DIR-"$BASE_DIR/.soundness"} 19 | SOUNDNESS_BIN_DIR="$SOUNDNESS_DIR/bin" 20 | CLI_BINARY_PATH="$SOUNDNESS_BIN_DIR/$CLI_BINARY" 21 | 22 | # Function to print colored messages 23 | print_message() { 24 | echo -e "${2}${1}${NC}" 25 | } 26 | 27 | # Function to check if a command exists 28 | command_exists() { 29 | command -v "$1" >/dev/null 2>&1 30 | } 31 | 32 | # Function to check if cargo is installed 33 | check_cargo() { 34 | if ! command_exists cargo; then 35 | print_message "❌ Cargo is not installed. Please install Rust and Cargo first." "$RED" 36 | print_message "Visit https://rustup.rs/ for installation instructions." "$YELLOW" 37 | exit 1 38 | fi 39 | } 40 | 41 | # Function to install the CLI 42 | install_cli() { 43 | print_message "🚀 Installing $CLI_BINARY..." "$GREEN" 44 | 45 | # Create temporary directory for building 46 | TEMP_DIR=$(mktemp -d) 47 | trap 'rm -rf "$TEMP_DIR"' EXIT 48 | 49 | # Clone the repository 50 | git clone --depth 1 https://github.com/$REPO.git "$TEMP_DIR" 51 | 52 | # Build the CLI 53 | cd "$TEMP_DIR/soundness-cli" 54 | cargo build --release 55 | 56 | # Copy the binary to the bin directory 57 | mkdir -p "$SOUNDNESS_BIN_DIR" 58 | cp target/release/$CLI_BINARY "$CLI_BINARY_PATH" 59 | 60 | print_message "✅ Installation complete!" "$GREEN" 61 | } 62 | 63 | # Function to update the CLI 64 | update_cli() { 65 | print_message "🔄 Checking for updates..." "$YELLOW" 66 | 67 | # Create temporary directory for building 68 | TEMP_DIR=$(mktemp -d) 69 | trap 'rm -rf "$TEMP_DIR"' EXIT 70 | 71 | # Clone the repository 72 | git clone --depth 1 https://github.com/$REPO.git "$TEMP_DIR" 73 | 74 | # Get the latest version 75 | LATEST_VERSION=$(cd "$TEMP_DIR" && git describe --tags --abbrev=0 2>/dev/null || echo "v$VERSION") 76 | 77 | if [ "$LATEST_VERSION" = "v$VERSION" ]; then 78 | print_message "✅ You're already using the latest version ($VERSION)" "$GREEN" 79 | return 80 | fi 81 | 82 | print_message "📦 Updating to $LATEST_VERSION..." "$YELLOW" 83 | 84 | # Build the CLI 85 | cd "$TEMP_DIR/soundness-cli" 86 | cargo build --release 87 | 88 | # Copy the binary to the bin directory 89 | mkdir -p "$SOUNDNESS_BIN_DIR" 90 | cp target/release/$CLI_BINARY "$CLI_BINARY_PATH" 91 | 92 | print_message "✅ Update complete!" "$GREEN" 93 | } 94 | 95 | # Function to show help 96 | show_help() { 97 | echo "soundnessup v$VERSION" 98 | echo 99 | echo "Usage:" 100 | echo " soundnessup install Install the Soundness CLI" 101 | echo " soundnessup update Update the Soundness CLI to the latest version" 102 | echo " soundnessup version Show the current version" 103 | echo " soundnessup help Show this help message" 104 | echo 105 | echo "For more information, visit: https://github.com/$REPO" 106 | } 107 | 108 | # Main script 109 | case "$1" in 110 | install) 111 | check_cargo 112 | install_cli 113 | ;; 114 | update) 115 | check_cargo 116 | update_cli 117 | ;; 118 | version) 119 | print_message "soundnessup v$VERSION" "$GREEN" 120 | ;; 121 | help|--help|-h) 122 | show_help 123 | ;; 124 | *) 125 | if [ -z "$1" ]; then 126 | show_help 127 | else 128 | print_message "❌ Unknown command: $1" "$RED" 129 | show_help 130 | exit 1 131 | fi 132 | ;; 133 | esac --------------------------------------------------------------------------------