diff --git a/Package.swift b/Package.swift index 99893dfc..181880cb 100644 --- a/Package.swift +++ b/Package.swift @@ -16,7 +16,7 @@ let package = Package( ), ], dependencies:[ - .package(path: "localPackages/Tor"), + .package(path: "localPackages/Arti"), .package(path: "localPackages/BitLogger"), .package(url: "https://github.com/21-DOT-DEV/swift-secp256k1", exact: "0.21.1") ], @@ -26,7 +26,7 @@ let package = Package( dependencies: [ .product(name: "P256K", package: "swift-secp256k1"), .product(name: "BitLogger", package: "BitLogger"), - .product(name: "Tor", package: "Tor") + .product(name: "Tor", package: "Arti") ], path: "bitchat", exclude: [ diff --git a/bitchat.xcodeproj/project.pbxproj b/bitchat.xcodeproj/project.pbxproj index 06f4bf1d..9b526671 100644 --- a/bitchat.xcodeproj/project.pbxproj +++ b/bitchat.xcodeproj/project.pbxproj @@ -14,7 +14,6 @@ A6E3E5722E7703760032EA8A /* BitLogger in Frameworks */ = {isa = PBXBuildFile; productRef = A6E3E5712E7703760032EA8A /* BitLogger */; }; A6E3EA7F2E7706720032EA8A /* Tor in Frameworks */ = {isa = PBXBuildFile; productRef = A6E3EA7E2E7706720032EA8A /* Tor */; }; A6E3EA812E7706A80032EA8A /* Tor in Frameworks */ = {isa = PBXBuildFile; productRef = A6E3EA802E7706A80032EA8A /* Tor */; }; - A6F183FD2E948783006A9046 /* tor-nolzma.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = A6F183FC2E948783006A9046 /* tor-nolzma.xcframework */; }; E0A1B2C3D4E5F6012345678D /* relays/online_relays_gps.csv in Resources */ = {isa = PBXBuildFile; fileRef = E0A1B2C3D4E5F6012345678A /* relays/online_relays_gps.csv */; }; E0A1B2C3D4E5F6012345678E /* relays/online_relays_gps.csv in Resources */ = {isa = PBXBuildFile; fileRef = E0A1B2C3D4E5F6012345678A /* relays/online_relays_gps.csv */; }; /* End PBXBuildFile section */ @@ -162,7 +161,6 @@ B5A5CC493FFB3D8966548140 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; files = ( - A6F183FD2E948783006A9046 /* tor-nolzma.xcframework in Frameworks */, A6E3E5702E77036A0032EA8A /* BitLogger in Frameworks */, 885BBED78092484A5B069461 /* P256K in Frameworks */, A6E3EA7F2E7706720032EA8A /* Tor in Frameworks */, @@ -345,7 +343,7 @@ packageReferences = ( B8C407587481BBB190741C93 /* XCRemoteSwiftPackageReference "swift-secp256k1" */, A6E3E56E2E77036A0032EA8A /* XCLocalSwiftPackageReference "localPackages/BitLogger" */, - A6E3EA7D2E7706720032EA8A /* XCLocalSwiftPackageReference "localPackages/Tor" */, + A6E3EA7D2E7706720032EA8A /* XCLocalSwiftPackageReference "localPackages/Arti" */, ); preferredProjectObjectVersion = 90; projectDirPath = ""; @@ -913,9 +911,9 @@ isa = XCLocalSwiftPackageReference; relativePath = localPackages/BitLogger; }; - A6E3EA7D2E7706720032EA8A /* XCLocalSwiftPackageReference "localPackages/Tor" */ = { + A6E3EA7D2E7706720032EA8A /* XCLocalSwiftPackageReference "localPackages/Arti" */ = { isa = XCLocalSwiftPackageReference; - relativePath = localPackages/Tor; + relativePath = localPackages/Arti; }; /* End XCLocalSwiftPackageReference section */ diff --git a/localPackages/Arti/.gitignore b/localPackages/Arti/.gitignore new file mode 100644 index 00000000..01730532 --- /dev/null +++ b/localPackages/Arti/.gitignore @@ -0,0 +1,3 @@ +/target/ +/.build/ +/.swiftpm/ diff --git a/localPackages/Arti/Cargo.lock b/localPackages/Arti/Cargo.lock new file mode 100644 index 00000000..8bf95c0a --- /dev/null +++ b/localPackages/Arti/Cargo.lock @@ -0,0 +1,5046 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", + "zeroize", +] + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloca" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a7d05ea6aea7e9e64d25b9156ba2fee3fdd659e34e41063cd2fc7cd020d7f4" +dependencies = [ + "cc", +] + +[[package]] +name = "amplify" +version = "4.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f7fb4ac7c881e54a8e7015e399b6112a2a5bc958b6c89ac510840ff20273b31" +dependencies = [ + "amplify_derive", + "amplify_num", + "ascii", + "getrandom 0.2.17", + "getrandom 0.3.4", + "wasm-bindgen", +] + +[[package]] +name = "amplify_derive" +version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a6309e6b8d89b36b9f959b7a8fa093583b94922a0f6438a24fb08936de4d428" +dependencies = [ + "amplify_syn", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "amplify_num" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99bcb75a2982047f733547042fc3968c0f460dfcf7d90b90dea3b2744580e9ad" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "amplify_syn" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7736fb8d473c0d83098b5bac44df6a561e20470375cd8bcae30516dc889fd62a" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anes" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" + +[[package]] +name = "anstyle" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "arti-bitchat" +version = "0.1.0" +dependencies = [ + "arti-client", + "libc", + "once_cell", + "tokio", + "tor-rtcompat", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "arti-client" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "489a235f252d3cb9a335d8e96bfc0d27e33371b769494096aa633a310ec01f3b" +dependencies = [ + "async-trait", + "cfg-if", + "derive-deftly", + "derive_builder_fork_arti", + "derive_more", + "educe", + "fs-mistrust", + "futures", + "hostname-validator", + "humantime", + "humantime-serde", + "libc", + "once_cell", + "postage", + "rand 0.9.2", + "safelog", + "serde", + "thiserror 2.0.17", + "time", + "tor-async-utils", + "tor-basic-utils", + "tor-chanmgr", + "tor-circmgr", + "tor-config", + "tor-config-path", + "tor-dircommon", + "tor-dirmgr", + "tor-error", + "tor-guardmgr", + "tor-keymgr", + "tor-linkspec", + "tor-llcrypto", + "tor-memquota", + "tor-netdir", + "tor-netdoc", + "tor-persist", + "tor-proto", + "tor-protover", + "tor-rtcompat", + "tracing", + "void", +] + +[[package]] +name = "ascii" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16" + +[[package]] +name = "asn1-rs" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56624a96882bb8c26d61312ae18cb45868e5a9992ea73c58e45c3101e56a1e60" +dependencies = [ + "asn1-rs-derive", + "asn1-rs-impl", + "displaydoc", + "nom", + "num-traits", + "rusticata-macros", + "thiserror 2.0.17", +] + +[[package]] +name = "asn1-rs-derive" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3109e49b1e4909e9db6515a30c633684d68cdeaa252f215214cb4fa1a5bfee2c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", + "synstructure", +] + +[[package]] +name = "asn1-rs-impl" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "assert_matches" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" + +[[package]] +name = "async-compression" +version = "0.4.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d10e4f991a553474232bc0a31799f6d24b034a84c0971d80d2e2f78b2e576e40" +dependencies = [ + "compression-codecs", + "compression-core", + "futures-io", + "pin-project-lite", +] + +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "async_executors" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a982d2f86de6137cc05c9db9a915a19886c97911f9790d04f174cede74be01a5" +dependencies = [ + "blanket", + "futures-core", + "futures-task", + "futures-util", + "pin-project", + "rustc_version", + "tokio", +] + +[[package]] +name = "asynchronous-codec" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a860072022177f903e59730004fb5dc13db9275b79bb2aef7ba8ce831956c233" +dependencies = [ + "bytes", + "futures-sink", + "futures-util", + "memchr", + "pin-project-lite", +] + +[[package]] +name = "atomic" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59bdb34bc650a32731b31bd8f0829cc15d24a708ee31559e0bb34f2bc320cba" + +[[package]] +name = "atomic" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89cbf775b137e9b968e67227ef7f775587cde3fd31b0d8599dbd0f598a48340" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" + +[[package]] +name = "bincode" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36eaf5d7b090263e8150820482d5d93cd964a81e4019913c972f4edcc6edb740" +dependencies = [ + "serde", + "unty", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "blanket" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0b121a9fe0df916e362fb3271088d071159cdf11db0e4182d02152850756eff" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bstr" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab" +dependencies = [ + "memchr", + "regex-automata", + "serde", +] + +[[package]] +name = "bumpalo" +version = "3.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" + +[[package]] +name = "by_address" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64fa3c856b712db6612c019f14756e64e4bcea13337a6b33b696333a9eaa2d06" + +[[package]] +name = "bytemuck" +version = "1.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" + +[[package]] +name = "caret" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82327861353370c5d92eac7e57842a9f2a95cd90cd88e24dc836cf20169be8df" + +[[package]] +name = "cast" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" + +[[package]] +name = "cc" +version = "1.2.52" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd4932aefd12402b36c60956a4fe0035421f544799057659ff86f923657aada3" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "chrono" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" +dependencies = [ + "iana-time-zone", + "num-traits", + "serde", + "windows-link 0.2.1", +] + +[[package]] +name = "ciborium" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" + +[[package]] +name = "ciborium-ll" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" +dependencies = [ + "ciborium-io", + "half", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", + "zeroize", +] + +[[package]] +name = "clap" +version = "4.5.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6e6ff9dcd79cff5cd969a17a545d79e84ab086e444102a591e288a8aa3ce394" +dependencies = [ + "clap_builder", +] + +[[package]] +name = "clap_builder" +version = "4.5.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa42cf4d2b7a41bc8f663a7cab4031ebafa1bf3875705bfaf8466dc60ab52c00" +dependencies = [ + "anstyle", + "clap_lex", +] + +[[package]] +name = "clap_lex" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e64b0cc0439b12df2fa678eae89a1c56a529fd067a9115f7827f1fffd22b32" + +[[package]] +name = "coarsetime" +version = "0.1.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e58eb270476aa4fc7843849f8a35063e8743b4dbcdf6dd0f8ea0886980c204c2" +dependencies = [ + "libc", + "wasix", + "wasm-bindgen", +] + +[[package]] +name = "compression-codecs" +version = "0.4.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00828ba6fd27b45a448e57dbfe84f1029d4c9f26b368157e9a448a5f49a2ec2a" +dependencies = [ + "compression-core", + "flate2", +] + +[[package]] +name = "compression-core" +version = "0.4.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75984efb6ed102a0d42db99afb6c1948f0380d1d91808d5529916e6c08b49d8d" + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "convert_case" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "cookie-factory" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9885fa71e26b8ab7855e2ec7cae6e9b380edff76cd052e07c683a0319d51b3a2" +dependencies = [ + "futures", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "criterion" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d883447757bb0ee46f233e9dc22eb84d93a9508c9b868687b274fc431d886bf" +dependencies = [ + "alloca", + "anes", + "cast", + "ciborium", + "clap", + "criterion-plot", + "itertools 0.13.0", + "num-traits", + "oorandom", + "page_size", + "plotters", + "rayon", + "regex", + "serde", + "serde_json", + "tinytemplate", + "walkdir", +] + +[[package]] +name = "criterion-cycles-per-byte" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5396de42a52e9e5d8f67ef0702dae30451f310a9ba1c3094dcf228f0be0e54bc" +dependencies = [ + "cfg-if", + "criterion", +] + +[[package]] +name = "criterion-plot" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed943f81ea2faa8dcecbbfa50164acf95d555afec96a27871663b300e387b2e4" +dependencies = [ + "cast", + "itertools 0.13.0", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + +[[package]] +name = "curve25519-dalek" +version = "4.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +dependencies = [ + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "digest", + "fiat-crypto", + "rustc_version", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "darling" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850" +dependencies = [ + "darling_core 0.14.4", + "darling_macro 0.14.4", +] + +[[package]] +name = "darling" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" +dependencies = [ + "darling_core 0.21.3", + "darling_macro 0.21.3", +] + +[[package]] +name = "darling_core" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.10.0", + "syn 1.0.109", +] + +[[package]] +name = "darling_core" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.11.1", + "syn 2.0.114", +] + +[[package]] +name = "darling_macro" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e" +dependencies = [ + "darling_core 0.14.4", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "darling_macro" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" +dependencies = [ + "darling_core 0.21.3", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "data-encoding" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + +[[package]] +name = "der-parser" +version = "10.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07da5016415d5a3c4dd39b11ed26f915f52fc4e0dc197d87908bc916e51bc1a6" +dependencies = [ + "asn1-rs", + "cookie-factory", + "displaydoc", + "nom", + "num-traits", + "rusticata-macros", +] + +[[package]] +name = "deranged" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" +dependencies = [ + "powerfmt", + "serde_core", +] + +[[package]] +name = "derive-deftly" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "284db66a66f03c3dafbe17360d959eb76b83f77cfe191677e2a7899c0da291f3" +dependencies = [ + "derive-deftly-macros", + "heck", +] + +[[package]] +name = "derive-deftly-macros" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caef6056a5788d05d173cdc3c562ac28ae093828f851f69378b74e4e3d578e41" +dependencies = [ + "heck", + "indexmap 2.13.0", + "itertools 0.14.0", + "proc-macro-crate", + "proc-macro2", + "quote", + "sha3", + "strum", + "syn 2.0.114", + "void", +] + +[[package]] +name = "derive_builder_core_fork_arti" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24c1b715c79be6328caa9a5e1a387a196ea503740f0722ec3dd8f67a9e72314d" +dependencies = [ + "darling 0.14.4", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "derive_builder_fork_arti" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3eae24d595f4d0ecc90a9a5a6d11c2bd8dafe2375ec4a1ec63250e5ade7d228" +dependencies = [ + "derive_builder_macro_fork_arti", +] + +[[package]] +name = "derive_builder_macro_fork_arti" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69887769a2489cd946bf782eb2b1bb2cb7bc88551440c94a765d4f040c08ebf3" +dependencies = [ + "derive_builder_core_fork_arti", + "syn 1.0.109", +] + +[[package]] +name = "derive_more" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.114", + "unicode-xid", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "directories" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16f5094c54661b38d03bd7e50df373292118db60b585c08a411c6d840017fe7d" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.61.2", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "downcast-rs" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "117240f60069e65410b3ae1bb213295bd828f707b5bec6596a1afc8793ce0cbc" + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + +[[package]] +name = "ed25519" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +dependencies = [ + "pkcs8", + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" +dependencies = [ + "curve25519-dalek", + "ed25519", + "merlin", + "rand_core 0.6.4", + "serde", + "sha2", + "subtle", + "zeroize", +] + +[[package]] +name = "educe" +version = "0.4.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f0042ff8246a363dbe77d2ceedb073339e85a804b9a47636c6e016a9a32c05f" +dependencies = [ + "enum-ordinalize", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "enum-ordinalize" +version = "3.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bf1fa3f06bbff1ea5b1a9c7b14aa992a39657db60a2759457328d7e058f49ee" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "enum_dispatch" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa18ce2bc66555b3218614519ac839ddb759a7d6720732f979ef8d13be147ecd" +dependencies = [ + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "enumset" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25b07a8dfbbbfc0064c0a6bdf9edcf966de6b1c33ce344bdeca3b41615452634" +dependencies = [ + "enumset_derive", +] + +[[package]] +name = "enumset_derive" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f43e744e4ea338060faee68ed933e46e722fb7f3617e722a5772d7e856d8b3ce" +dependencies = [ + "darling 0.21.3", + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "event-listener" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "fallible-iterator" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" + +[[package]] +name = "fallible-streaming-iterator" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "fiat-crypto" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" + +[[package]] +name = "figment" +version = "0.10.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cb01cd46b0cf372153850f4c6c272d9cbea2da513e07538405148f95bd789f3" +dependencies = [ + "atomic 0.6.1", + "serde", + "toml 0.8.23", + "uncased", + "version_check", +] + +[[package]] +name = "filetime" +version = "0.2.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc0505cd1b6fa6580283f6bdf70a73fcf4aba1184038c90902b92b3dd0df63ed" +dependencies = [ + "cfg-if", + "libc", + "libredox", + "windows-sys 0.60.2", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f449e6c6c08c865631d4890cfacf252b3d396c9bcc83adb6623cdb02a8336c41" + +[[package]] +name = "flate2" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b375d6465b98090a5f25b1c7703f3859783755aa9a80433b36e0379a3ec2f369" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fluid-let" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "749cff877dc1af878a0b31a41dd221a753634401ea0ef2f87b62d3171522485a" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "fs-mistrust" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9148d54c4a9b8e67264799a1becec9479a00f98d10349865ce3510eccf04a53" +dependencies = [ + "derive_builder_fork_arti", + "dirs", + "libc", + "pwd-grp", + "serde", + "thiserror 2.0.17", + "walkdir", +] + +[[package]] +name = "fslock" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04412b8935272e3a9bae6f48c7bfff74c2911f60525404edfdd28e49884c3bfb" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "futures-rustls" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f2f12607f92c69b12ed746fabf9ca4f5c482cba46679c1a75b874ed7c26adb" +dependencies = [ + "futures-io", + "rustls", + "rustls-pki-types", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi", + "wasip2", + "wasm-bindgen", +] + +[[package]] +name = "getset" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cf0fc11e47561d47397154977bc219f4cf809b2974facc3ccb3b89e2436f912" +dependencies = [ + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "glob-match" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9985c9503b412198aa4197559e9a318524ebc4519c229bfa05a535828c950b9d" + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "half" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +dependencies = [ + "cfg-if", + "crunchy", + "zerocopy", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" + +[[package]] +name = "hashlink" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" +dependencies = [ + "hashbrown 0.15.5", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "hostname-validator" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f558a64ac9af88b5ba400d99b579451af0d39c6d360980045b91aac966d705e2" + +[[package]] +name = "http" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "humantime" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" + +[[package]] +name = "humantime-serde" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57a3db5ea5923d99402c94e9feb261dc5ee9b4efa158b0315f788cf549cc200c" +dependencies = [ + "humantime", + "serde", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core 0.62.2", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +dependencies = [ + "equivalent", + "hashbrown 0.16.1", + "serde", + "serde_core", +] + +[[package]] +name = "inotify" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f37dccff2791ab604f9babef0ba14fbe0be30bd368dc541e2b08d07c8aa908f3" +dependencies = [ + "bitflags 2.10.0", + "inotify-sys", + "libc", +] + +[[package]] +name = "inotify-sys" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" +dependencies = [ + "libc", +] + +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array", +] + +[[package]] +name = "inventory" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc61209c082fbeb19919bee74b176221b27223e27b65d781eb91af24eb1fb46e" +dependencies = [ + "rustversion", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" + +[[package]] +name = "js-sys" +version = "0.3.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "kqueue" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac30106d7dce88daf4a3fcb4879ea939476d5074a9b7ddd0fb97fa4bed5596a" +dependencies = [ + "kqueue-sys", + "libc", +] + +[[package]] +name = "kqueue-sys" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b" +dependencies = [ + "bitflags 1.3.2", + "libc", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin", +] + +[[package]] +name = "libc" +version = "0.2.180" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc" + +[[package]] +name = "libm" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" + +[[package]] +name = "libredox" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616" +dependencies = [ + "bitflags 2.10.0", + "libc", + "redox_syscall 0.7.0", +] + +[[package]] +name = "libsqlite3-sys" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "133c182a6a2c87864fe97778797e46c7e999672690dc9fa3ee8e241aa4a9c13f" +dependencies = [ + "pkg-config", + "vcpkg", +] + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + +[[package]] +name = "matchers" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "memchr" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" + +[[package]] +name = "memmap2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "744133e4a0e0a658e1374cf3bf8e415c4052a15a111acd372764c55b4177d490" +dependencies = [ + "libc", +] + +[[package]] +name = "merlin" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" +dependencies = [ + "byteorder", + "keccak", + "rand_core 0.6.4", + "zeroize", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" +dependencies = [ + "libc", + "log", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "nonany" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6b8866ec53810a9a4b3d434a29801e78c707430a9ae11c2db4b8b62bb9675a0" + +[[package]] +name = "notify" +version = "8.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3" +dependencies = [ + "bitflags 2.10.0", + "inotify", + "kqueue", + "libc", + "log", + "mio", + "notify-types", + "walkdir", + "windows-sys 0.60.2", +] + +[[package]] +name = "notify-types" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e0826a989adedc2a244799e823aece04662b66609d96af8dff7ac6df9a8925d" + +[[package]] +name = "ntapi" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c70f219e21142367c70c0b30c6a9e3a14d55b4d12a204d897fbec83a0363f081" +dependencies = [ + "winapi", +] + +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-bigint-dig" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" +dependencies = [ + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand 0.8.5", + "smallvec", + "zeroize", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_enum" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags 2.10.0", +] + +[[package]] +name = "objc2-io-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33fafba39597d6dc1fb709123dfa8289d39406734be322956a69f0931c73bb15" +dependencies = [ + "libc", + "objc2-core-foundation", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "oneshot-fused-workaround" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd8232e2ac3a65370cd616e55bd33d5fe2f5473ccd322a7f5bfca8d0f6a6e3a9" +dependencies = [ + "futures", +] + +[[package]] +name = "oorandom" +version = "11.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "ordered-float" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" +dependencies = [ + "num-traits", +] + +[[package]] +name = "os_str_bytes" +version = "6.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" +dependencies = [ + "memchr", +] + +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2", +] + +[[package]] +name = "p384" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe42f1670a52a47d448f14b6a5c61dd78fce51856e68edaa38f7ae3a46b8d6b6" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2", +] + +[[package]] +name = "p521" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fc9e2161f1f215afdfce23677034ae137bbd45016a880c2eb3ba8eb95f085b2" +dependencies = [ + "base16ct", + "ecdsa", + "elliptic-curve", + "primeorder", + "rand_core 0.6.4", + "sha2", +] + +[[package]] +name = "page_size" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30d5b2194ed13191c1999ae0704b7839fb18384fa22e49b57eeaa97d79ce40da" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.5.18", + "smallvec", + "windows-link 0.2.1", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + +[[package]] +name = "phf" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" +dependencies = [ + "phf_macros", + "phf_shared", + "serde", +] + +[[package]] +name = "phf_generator" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" +dependencies = [ + "fastrand", + "phf_shared", +] + +[[package]] +name = "phf_macros" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "phf_shared" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkcs1" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +dependencies = [ + "der", + "pkcs8", + "spki", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "plotters" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747" +dependencies = [ + "num-traits", + "plotters-backend", + "plotters-svg", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "plotters-backend" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a" + +[[package]] +name = "plotters-svg" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670" +dependencies = [ + "plotters-backend", +] + +[[package]] +name = "postage" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af3fb618632874fb76937c2361a7f22afd393c982a2165595407edc75b06d3c1" +dependencies = [ + "atomic 0.5.3", + "crossbeam-queue", + "futures", + "parking_lot", + "pin-project", + "static_assertions", + "thiserror 1.0.69", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + +[[package]] +name = "priority-queue" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93980406f12d9f8140ed5abe7155acb10bb1e69ea55c88960b9c2f117445ef96" +dependencies = [ + "equivalent", + "indexmap 2.13.0", + "serde", +] + +[[package]] +name = "proc-macro-crate" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" +dependencies = [ + "toml_edit 0.23.10+spec-1.0.0", +] + +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "proc-macro2" +version = "1.0.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "pwd-grp" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e2023f41b5fcb7c30eb5300a5733edfaa9e0e0d502d51b586f65633fd39e40c" +dependencies = [ + "derive-deftly", + "libc", + "paste", + "thiserror 2.0.17", +] + +[[package]] +name = "quote" +version = "1.0.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.5", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.5", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.17", +] + +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom 0.3.4", +] + +[[package]] +name = "rand_jitter" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b16df48f071248e67b8fc5e866d9448d45c08ad8b672baaaf796e2f15e606ff0" +dependencies = [ + "libc", + "rand_core 0.9.5", + "winapi", +] + +[[package]] +name = "rayon" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "rdrand" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d92195228612ac8eed47adbc2ed0f04e513a4ccb98175b6f2bd04d963b533655" +dependencies = [ + "rand_core 0.6.4", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.10.0", +] + +[[package]] +name = "redox_syscall" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f3fe0889e69e2ae9e41f4d6c4c0181701d00e4697b356fb1f74173a5e0ee27" +dependencies = [ + "bitflags 2.10.0", +] + +[[package]] +name = "redox_users" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +dependencies = [ + "getrandom 0.2.17", + "libredox", + "thiserror 2.0.17", +] + +[[package]] +name = "ref-cast" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "regex" +version = "1.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" + +[[package]] +name = "retry-error" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea40f9c21de3a068f1097fe2348d718c63630e650429aefb72bd04668018d871" +dependencies = [ + "humantime", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.17", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rsa" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d" +dependencies = [ + "const-oid", + "digest", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core 0.6.4", + "sha2", + "signature", + "spki", + "subtle", + "zeroize", +] + +[[package]] +name = "rusqlite" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "165ca6e57b20e1351573e3729b958bc62f0e48025386970b6e4d29e7a7e71f3f" +dependencies = [ + "bitflags 2.10.0", + "fallible-iterator", + "fallible-streaming-iterator", + "hashlink", + "libsqlite3-sys", + "smallvec", + "time", +] + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rusticata-macros" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" +dependencies = [ + "nom", +] + +[[package]] +name = "rustls" +version = "0.23.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c665f33d38cea657d9614f766881e4d510e0eda4239891eea56b4cadcf01801b" +dependencies = [ + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pki-types" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21e6f2ab2928ca4291b86736a8bd920a277a399bba1589409d72154ff87c1282" +dependencies = [ + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "safelog" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aeea900f2ced752c3691263ddb6a99facded81c0d42e3122e198fbafb8f449d8" +dependencies = [ + "derive_more", + "educe", + "either", + "fluid-let", + "thiserror 2.0.17", +] + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "sanitize-filename" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc984f4f9ceb736a7bb755c3e3bd17dc56370af2600c9780dcc48c66453da34d" +dependencies = [ + "regex", +] + +[[package]] +name = "saturating-time" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b63583a1dd0647d1484228529ab4ecaa874048d2956f117362aa5f5826456230" + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54e910108742c57a770f492731f99be216a52fadd361b06c8fb59d74ccc267d2" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde-value" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c" +dependencies = [ + "ordered-float", + "serde", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "serde_ignored" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115dffd5f3853e06e746965a20dcbae6ee747ae30b543d91b0e089668bb07798" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_spanned" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8bbf91e5a4d6315eee45e704372590b30e260ee83af6639d64557f51b067776" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_with" +version = "3.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fa237f2807440d238e0364a218270b98f767a00d3dada77b1c53ae88940e2e7" +dependencies = [ + "base64", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.13.0", + "schemars 0.9.0", + "schemars 1.2.0", + "serde_core", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52a8e3ca0ca629121f70ab50f95249e5a6f925cc0f6ffe8256c45b728875706c" +dependencies = [ + "darling 0.21.3", + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest", + "keccak", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shellexpand" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b1fdf65dd6331831494dd616b30351c38e96e45921a27745cf98490458b90bb" +dependencies = [ + "bstr", + "dirs", + "os_str_bytes", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core 0.6.4", +] + +[[package]] +name = "simd-adler32" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" + +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + +[[package]] +name = "slab" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" + +[[package]] +name = "slotmap" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdd58c3c93c3d278ca835519292445cb4b0d4dc59ccfdf7ceadaab3f8aeb4038" +dependencies = [ + "serde", + "version_check", +] + +[[package]] +name = "slotmap-careful" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74f7816d6e84ea64d9898bc6c5ca1ce93f06cd5ca0ccab0f33ea12e1bcdd1b5d" +dependencies = [ + "paste", + "serde", + "slotmap", + "thiserror 2.0.17", + "void", +] + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "socket2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +dependencies = [ + "libc", + "windows-sys 0.60.2", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "ssh-cipher" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caac132742f0d33c3af65bfcde7f6aa8f62f0e991d80db99149eb9d44708784f" +dependencies = [ + "cipher", + "ssh-encoding", +] + +[[package]] +name = "ssh-encoding" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb9242b9ef4108a78e8cd1a2c98e193ef372437f8c22be363075233321dd4a15" +dependencies = [ + "base64ct", + "pem-rfc7468", + "sha2", +] + +[[package]] +name = "ssh-key" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b86f5297f0f04d08cabaa0f6bff7cb6aec4d9c3b49d87990d63da9d9156a8c3" +dependencies = [ + "num-bigint-dig", + "p256", + "p384", + "p521", + "rand_core 0.6.4", + "rsa", + "sec1", + "sha2", + "signature", + "ssh-cipher", + "ssh-encoding", + "subtle", + "zeroize", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "strum" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "sysinfo" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "252800745060e7b9ffb7b2badbd8b31cfa4aa2e61af879d0a3bf2a317c20217d" +dependencies = [ + "libc", + "memchr", + "ntapi", + "objc2-core-foundation", + "objc2-io-kit", + "windows", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +dependencies = [ + "thiserror-impl 2.0.17", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "thread_local" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "time" +version = "0.3.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9e442fc33d7fdb45aa9bfeb312c095964abdf596f7567261062b2a7107aaabd" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b36ee98fd31ec7426d599183e8fe26932a8dc1fb76ddb6214d05493377d34ca" + +[[package]] +name = "time-macros" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e552d1249bf61ac2a52db88179fd0673def1e1ad8243a00d9ec9ed71fee3dd" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +dependencies = [ + "displaydoc", + "serde_core", + "zerovec", +] + +[[package]] +name = "tinytemplate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "tokio" +version = "1.49.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" +dependencies = [ + "bytes", + "libc", + "mio", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "tokio-util" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +dependencies = [ + "bytes", + "futures-core", + "futures-io", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +dependencies = [ + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", + "toml_edit 0.22.27", +] + +[[package]] +name = "toml" +version = "0.9.11+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3afc9a848309fe1aaffaed6e1546a7a14de1f935dc9d89d32afd9a44bab7c46" +dependencies = [ + "indexmap 2.13.0", + "serde_core", + "serde_spanned 1.0.4", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow", +] + +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "0.7.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap 2.13.0", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", + "toml_write", + "winnow", +] + +[[package]] +name = "toml_edit" +version = "0.23.10+spec-1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" +dependencies = [ + "indexmap 2.13.0", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_parser" +version = "1.0.6+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3198b4b0a8e11f09dd03e133c0280504d0801269e9afa46362ffde1cbeebf44" +dependencies = [ + "winnow", +] + +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + +[[package]] +name = "toml_writer" +version = "1.0.6+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab16f14aed21ee8bfd8ec22513f7287cd4a91aa92e44edfe2c17ddd004e92607" + +[[package]] +name = "tor-async-utils" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19a6f7636681acec0883352b3f9d81140008da0b531890462c57cf3e47b92233" +dependencies = [ + "derive-deftly", + "educe", + "futures", + "oneshot-fused-workaround", + "pin-project", + "postage", + "thiserror 2.0.17", + "void", +] + +[[package]] +name = "tor-basic-utils" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bce18ecf54e1b363169252e19473ac21a5dcbe358f9940cc707c3f63e8c3f1da" +dependencies = [ + "derive_more", + "hex", + "itertools 0.14.0", + "libc", + "paste", + "rand 0.9.2", + "rand_chacha 0.9.0", + "serde", + "slab", + "smallvec", + "thiserror 2.0.17", + "weak-table", +] + +[[package]] +name = "tor-bytes" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83af3c52ea47df8f819397346b8e8a5e80ada141af2c3575b9db6fe95bf29fea" +dependencies = [ + "bytes", + "derive-deftly", + "digest", + "educe", + "getrandom 0.3.4", + "safelog", + "thiserror 2.0.17", + "tor-error", + "tor-llcrypto", + "zeroize", +] + +[[package]] +name = "tor-cell" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c50a0ce27b65ec54102a1006f4b8ceed1e3c13aebec0ae6fd765ec213e01d7a" +dependencies = [ + "amplify", + "bitflags 2.10.0", + "bytes", + "caret", + "derive-deftly", + "derive_more", + "educe", + "itertools 0.14.0", + "paste", + "rand 0.9.2", + "smallvec", + "thiserror 2.0.17", + "tor-basic-utils", + "tor-bytes", + "tor-cert", + "tor-error", + "tor-linkspec", + "tor-llcrypto", + "tor-memquota", + "tor-protover", + "tor-units", + "void", +] + +[[package]] +name = "tor-cert" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad035516493fcd6fbfb880dfbc607d1d667214fcf8195dd9e71e6dbaa412405e" +dependencies = [ + "caret", + "derive_builder_fork_arti", + "derive_more", + "digest", + "thiserror 2.0.17", + "tor-bytes", + "tor-checkable", + "tor-error", + "tor-llcrypto", +] + +[[package]] +name = "tor-chanmgr" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8aea34c1429732c2fb6124393b7f91e7ddfa83e88ab28aa50c4b17ab1301b75" +dependencies = [ + "async-trait", + "caret", + "derive_builder_fork_arti", + "derive_more", + "educe", + "futures", + "oneshot-fused-workaround", + "postage", + "rand 0.9.2", + "safelog", + "serde", + "thiserror 2.0.17", + "tor-async-utils", + "tor-basic-utils", + "tor-cell", + "tor-config", + "tor-error", + "tor-keymgr", + "tor-linkspec", + "tor-llcrypto", + "tor-memquota", + "tor-netdir", + "tor-proto", + "tor-rtcompat", + "tor-socksproto", + "tor-units", + "tracing", + "void", +] + +[[package]] +name = "tor-checkable" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597f90bef62f70da2e0ba8bff3f6e33b5478636ef8a67e6a1934950c16178a40" +dependencies = [ + "humantime", + "signature", + "thiserror 2.0.17", + "tor-llcrypto", +] + +[[package]] +name = "tor-circmgr" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0daee71fa0ad78e47f919b1482282f7e0e4cb2b5b0d11520d07faf4ac6eecca1" +dependencies = [ + "amplify", + "async-trait", + "cfg-if", + "derive-deftly", + "derive_builder_fork_arti", + "derive_more", + "downcast-rs", + "dyn-clone", + "educe", + "futures", + "humantime-serde", + "itertools 0.14.0", + "once_cell", + "oneshot-fused-workaround", + "pin-project", + "rand 0.9.2", + "retry-error", + "safelog", + "serde", + "thiserror 2.0.17", + "tor-async-utils", + "tor-basic-utils", + "tor-cell", + "tor-chanmgr", + "tor-config", + "tor-dircommon", + "tor-error", + "tor-guardmgr", + "tor-linkspec", + "tor-memquota", + "tor-netdir", + "tor-netdoc", + "tor-persist", + "tor-proto", + "tor-protover", + "tor-relay-selection", + "tor-rtcompat", + "tor-units", + "tracing", + "void", + "weak-table", +] + +[[package]] +name = "tor-config" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c367649cec10f2ed2747c2f16b71baae9e74a6840476aed272c24ebe568dc4" +dependencies = [ + "amplify", + "cfg-if", + "derive-deftly", + "derive_builder_fork_arti", + "educe", + "either", + "figment", + "fs-mistrust", + "futures", + "humantime-serde", + "itertools 0.14.0", + "notify", + "paste", + "postage", + "regex", + "serde", + "serde-value", + "serde_ignored", + "strum", + "thiserror 2.0.17", + "toml 0.9.11+spec-1.1.0", + "tor-basic-utils", + "tor-error", + "tor-rtcompat", + "tracing", + "void", +] + +[[package]] +name = "tor-config-path" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "076059b1971febb947e9c1e256e51fca698099c6c7842f2b6e8bfc8124a44a9a" +dependencies = [ + "directories", + "serde", + "shellexpand", + "thiserror 2.0.17", + "tor-error", + "tor-general-addr", +] + +[[package]] +name = "tor-consdiff" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d67f49ba9684552dd5d167b9867aaba3a2054b596d86973c82f0fde1d6b9d70c" +dependencies = [ + "digest", + "hex", + "thiserror 2.0.17", + "tor-llcrypto", +] + +[[package]] +name = "tor-dirclient" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46d1268e7093804aebfc385953f0b69a08f76c8fd78cc6726a8fe22b9b88979f" +dependencies = [ + "async-compression", + "base64ct", + "derive_more", + "futures", + "hex", + "http", + "httparse", + "httpdate", + "itertools 0.14.0", + "memchr", + "thiserror 2.0.17", + "tor-circmgr", + "tor-error", + "tor-linkspec", + "tor-llcrypto", + "tor-netdoc", + "tor-proto", + "tor-rtcompat", + "tracing", +] + +[[package]] +name = "tor-dircommon" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aa852fe29e34eb0b4e1ac56339e8a01726f904d87c2492ad0e5a22a5ec0bebe" +dependencies = [ + "base64ct", + "derive_builder_fork_arti", + "getset", + "humantime", + "humantime-serde", + "serde", + "tor-basic-utils", + "tor-checkable", + "tor-config", + "tor-linkspec", + "tor-llcrypto", + "tor-netdoc", + "tracing", +] + +[[package]] +name = "tor-dirmgr" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba7deaca1fa76713f16186f2d720a7da9c8d08703b8a0af970c8541751fb9d11" +dependencies = [ + "async-trait", + "base64ct", + "derive_builder_fork_arti", + "derive_more", + "digest", + "educe", + "event-listener", + "fs-mistrust", + "fslock", + "futures", + "hex", + "humantime", + "humantime-serde", + "itertools 0.14.0", + "memmap2", + "oneshot-fused-workaround", + "paste", + "postage", + "rand 0.9.2", + "rusqlite", + "safelog", + "scopeguard", + "serde", + "serde_json", + "signature", + "static_assertions", + "strum", + "thiserror 2.0.17", + "time", + "tor-async-utils", + "tor-basic-utils", + "tor-checkable", + "tor-circmgr", + "tor-config", + "tor-consdiff", + "tor-dirclient", + "tor-dircommon", + "tor-error", + "tor-guardmgr", + "tor-llcrypto", + "tor-netdir", + "tor-netdoc", + "tor-persist", + "tor-proto", + "tor-protover", + "tor-rtcompat", + "tracing", +] + +[[package]] +name = "tor-error" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2b140d3cc5d682b3327aa2e2813815062be7a6653250748ce837d26e69eda7" +dependencies = [ + "derive_more", + "futures", + "paste", + "retry-error", + "static_assertions", + "strum", + "thiserror 2.0.17", + "tracing", + "void", +] + +[[package]] +name = "tor-general-addr" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3102d541c70017e73495582c4652e9bdb6b7d8c71dd98461a210c63d8376dc3e" +dependencies = [ + "derive_more", + "thiserror 2.0.17", + "void", +] + +[[package]] +name = "tor-guardmgr" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8acfd78f0128206f7a6ff6cde765e4595b4280595ce1b6ce11fb8a20baafe218" +dependencies = [ + "amplify", + "base64ct", + "derive-deftly", + "derive_builder_fork_arti", + "derive_more", + "dyn-clone", + "educe", + "futures", + "humantime", + "humantime-serde", + "itertools 0.14.0", + "num_enum", + "oneshot-fused-workaround", + "pin-project", + "postage", + "rand 0.9.2", + "safelog", + "serde", + "strum", + "thiserror 2.0.17", + "tor-async-utils", + "tor-basic-utils", + "tor-config", + "tor-dircommon", + "tor-error", + "tor-linkspec", + "tor-llcrypto", + "tor-netdir", + "tor-netdoc", + "tor-persist", + "tor-proto", + "tor-relay-selection", + "tor-rtcompat", + "tor-units", + "tracing", +] + +[[package]] +name = "tor-hscrypto" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86ecc6829e56d89c1976ecc0266b1a717c263f27a365df07558d9170e939d445" +dependencies = [ + "data-encoding", + "derive-deftly", + "derive_more", + "digest", + "hex", + "humantime", + "itertools 0.14.0", + "paste", + "rand 0.9.2", + "safelog", + "serde", + "signature", + "subtle", + "thiserror 2.0.17", + "tor-basic-utils", + "tor-bytes", + "tor-error", + "tor-key-forge", + "tor-llcrypto", + "tor-units", + "void", +] + +[[package]] +name = "tor-key-forge" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4de2127932187c798975258212f58dbb0b61b2c06d6ce17a6545ba3843287dd" +dependencies = [ + "derive-deftly", + "derive_more", + "downcast-rs", + "paste", + "rand 0.9.2", + "rsa", + "signature", + "ssh-key", + "thiserror 2.0.17", + "tor-bytes", + "tor-cert", + "tor-checkable", + "tor-error", + "tor-llcrypto", +] + +[[package]] +name = "tor-keymgr" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14418bdd6179cf20b1462b27dadef88d645031d4ff5b02115f87f197275b7bc9" +dependencies = [ + "amplify", + "arrayvec", + "cfg-if", + "derive-deftly", + "derive_builder_fork_arti", + "derive_more", + "downcast-rs", + "dyn-clone", + "fs-mistrust", + "glob-match", + "humantime", + "inventory", + "itertools 0.14.0", + "rand 0.9.2", + "safelog", + "serde", + "signature", + "ssh-key", + "thiserror 2.0.17", + "tor-basic-utils", + "tor-bytes", + "tor-config", + "tor-config-path", + "tor-error", + "tor-hscrypto", + "tor-key-forge", + "tor-llcrypto", + "tor-persist", + "tracing", + "visibility", + "walkdir", + "zeroize", +] + +[[package]] +name = "tor-linkspec" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0a0960cbcd396ee630497af1eabcc38b899eedbddbf7e3629d8d893a38bcfce" +dependencies = [ + "base64ct", + "by_address", + "caret", + "derive-deftly", + "derive_builder_fork_arti", + "derive_more", + "hex", + "itertools 0.14.0", + "safelog", + "serde", + "serde_with", + "strum", + "thiserror 2.0.17", + "tor-basic-utils", + "tor-bytes", + "tor-config", + "tor-llcrypto", + "tor-memquota", + "tor-protover", +] + +[[package]] +name = "tor-llcrypto" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7354b38ac67af62e9cb7f8c3ab912d02357348da1cbdfc14577a21a5cf8754f0" +dependencies = [ + "aes", + "base64ct", + "ctr", + "curve25519-dalek", + "der-parser", + "derive-deftly", + "derive_more", + "digest", + "ed25519-dalek", + "educe", + "getrandom 0.3.4", + "hex", + "rand 0.9.2", + "rand_chacha 0.9.0", + "rand_core 0.6.4", + "rand_core 0.9.5", + "rand_jitter", + "rdrand", + "rsa", + "safelog", + "serde", + "sha1", + "sha2", + "sha3", + "signature", + "subtle", + "thiserror 2.0.17", + "tor-error", + "tor-memquota", + "visibility", + "x25519-dalek", + "zeroize", +] + +[[package]] +name = "tor-log-ratelim" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d75a576f236beeb2f5ec0506a06a041bd3c907f012ae547725d8079273473dd9" +dependencies = [ + "futures", + "humantime", + "thiserror 2.0.17", + "tor-error", + "tor-rtcompat", + "tracing", + "weak-table", +] + +[[package]] +name = "tor-memquota" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cb94c8d91c2faf4fdb625fb01d7739ca395fc531a2e20c870eb26efe2952a29" +dependencies = [ + "cfg-if", + "derive-deftly", + "derive_more", + "dyn-clone", + "educe", + "futures", + "itertools 0.14.0", + "paste", + "pin-project", + "serde", + "slotmap-careful", + "static_assertions", + "sysinfo", + "thiserror 2.0.17", + "tor-async-utils", + "tor-basic-utils", + "tor-config", + "tor-error", + "tor-log-ratelim", + "tor-rtcompat", + "tracing", + "void", +] + +[[package]] +name = "tor-netdir" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b1f9478369768e5d395267f3f81f37911b8cbde8a2a93a56d21df33bb885e5" +dependencies = [ + "async-trait", + "bitflags 2.10.0", + "derive_more", + "futures", + "humantime", + "itertools 0.14.0", + "num_enum", + "rand 0.9.2", + "serde", + "strum", + "thiserror 2.0.17", + "tor-basic-utils", + "tor-error", + "tor-linkspec", + "tor-llcrypto", + "tor-netdoc", + "tor-protover", + "tor-units", + "tracing", + "typed-index-collections", +] + +[[package]] +name = "tor-netdoc" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef316a739d1c904c9244208acb8df283d5ed4b348735198ef94ac7b16330be29" +dependencies = [ + "amplify", + "base64ct", + "cipher", + "derive-deftly", + "derive_builder_fork_arti", + "derive_more", + "digest", + "educe", + "enumset", + "hex", + "humantime", + "itertools 0.14.0", + "memchr", + "paste", + "phf", + "saturating-time", + "serde", + "serde_with", + "signature", + "smallvec", + "strum", + "subtle", + "thiserror 2.0.17", + "time", + "tinystr", + "tor-basic-utils", + "tor-bytes", + "tor-cell", + "tor-cert", + "tor-checkable", + "tor-error", + "tor-llcrypto", + "tor-protover", + "void", + "zeroize", +] + +[[package]] +name = "tor-persist" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78bb852b1a746a1dcf7d6a4d5f540a6bd7f906344a30459b91f2866bceed8c36" +dependencies = [ + "derive-deftly", + "derive_more", + "filetime", + "fs-mistrust", + "fslock", + "futures", + "itertools 0.14.0", + "oneshot-fused-workaround", + "paste", + "sanitize-filename", + "serde", + "serde_json", + "thiserror 2.0.17", + "time", + "tor-async-utils", + "tor-basic-utils", + "tor-error", + "tracing", + "void", +] + +[[package]] +name = "tor-proto" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df92c785e2b17d4b4fd071dd2b14236ef67b41d55b4ed75c4ace31c13b0f9c2b" +dependencies = [ + "amplify", + "asynchronous-codec", + "bitvec", + "bytes", + "caret", + "cfg-if", + "cipher", + "coarsetime", + "criterion-cycles-per-byte", + "derive-deftly", + "derive_builder_fork_arti", + "derive_more", + "digest", + "educe", + "enum_dispatch", + "futures", + "futures-util", + "hkdf", + "hmac", + "itertools 0.14.0", + "nonany", + "oneshot-fused-workaround", + "pin-project", + "postage", + "rand 0.9.2", + "rand_core 0.9.5", + "safelog", + "slotmap-careful", + "smallvec", + "static_assertions", + "subtle", + "sync_wrapper", + "thiserror 2.0.17", + "tokio", + "tokio-util", + "tor-async-utils", + "tor-basic-utils", + "tor-bytes", + "tor-cell", + "tor-cert", + "tor-checkable", + "tor-config", + "tor-error", + "tor-linkspec", + "tor-llcrypto", + "tor-log-ratelim", + "tor-memquota", + "tor-protover", + "tor-relay-crypto", + "tor-rtcompat", + "tor-rtmock", + "tor-units", + "tracing", + "typenum", + "visibility", + "void", + "zeroize", +] + +[[package]] +name = "tor-protover" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a39e6a44011640b42199658dcdaa87acf496b13f32f8c1432b1a794db5c58a9" +dependencies = [ + "caret", + "paste", + "serde_with", + "thiserror 2.0.17", + "tor-basic-utils", + "tor-bytes", +] + +[[package]] +name = "tor-relay-crypto" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d26f20968f2483e39727760bfe8eb94e85cf09bc5d59bf80994e1ca0409e162" +dependencies = [ + "derive-deftly", + "derive_more", + "humantime", + "tor-cert", + "tor-checkable", + "tor-error", + "tor-key-forge", + "tor-keymgr", + "tor-llcrypto", + "tor-persist", +] + +[[package]] +name = "tor-relay-selection" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "813a2234ddea983906c73c945a41dc0a054f4da771f8f6c12919a6423c88de13" +dependencies = [ + "rand 0.9.2", + "serde", + "tor-basic-utils", + "tor-linkspec", + "tor-netdir", + "tor-netdoc", +] + +[[package]] +name = "tor-rtcompat" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32679e552f960984484a7f4edb5649c4073d7b7a5532d57dcfe58af45dfd37bd" +dependencies = [ + "async-trait", + "async_executors", + "asynchronous-codec", + "coarsetime", + "derive_more", + "dyn-clone", + "educe", + "futures", + "futures-rustls", + "hex", + "libc", + "paste", + "pin-project", + "rustls-pki-types", + "rustls-webpki", + "socket2", + "thiserror 2.0.17", + "tokio", + "tokio-util", + "tor-error", + "tor-general-addr", + "tracing", + "void", +] + +[[package]] +name = "tor-rtmock" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ffec4dd7745274e9c2999b61a316f2b5a87d590883e28c8df47b7ce4e773f0e" +dependencies = [ + "amplify", + "assert_matches", + "async-trait", + "derive-deftly", + "derive_more", + "educe", + "futures", + "humantime", + "itertools 0.14.0", + "oneshot-fused-workaround", + "pin-project", + "priority-queue", + "slotmap-careful", + "strum", + "thiserror 2.0.17", + "tor-error", + "tor-general-addr", + "tor-rtcompat", + "tracing", + "tracing-test", + "void", +] + +[[package]] +name = "tor-socksproto" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7763d0b2fd4702d17bba4999815630ef7dc26cf5d945658fe8a77b43662a066" +dependencies = [ + "amplify", + "caret", + "derive-deftly", + "educe", + "safelog", + "subtle", + "thiserror 2.0.17", + "tor-bytes", + "tor-error", +] + +[[package]] +name = "tor-units" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42c347731d1802cc54d3d9c37b8040e6745dd33b61447a474aa0960adcd05794" +dependencies = [ + "derive-deftly", + "derive_more", + "serde", + "thiserror 2.0.17", + "tor-memquota", +] + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex-automata", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "tracing-test" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "557b891436fe0d5e0e363427fc7f217abf9ccd510d5136549847bdcbcd011d68" +dependencies = [ + "tracing-core", + "tracing-subscriber", + "tracing-test-macro", +] + +[[package]] +name = "tracing-test-macro" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04659ddb06c87d233c566112c1c9c5b9e98256d9af50ec3bc9c8327f873a7568" +dependencies = [ + "quote", + "syn 2.0.114", +] + +[[package]] +name = "typed-index-collections" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5318ee4ce62a4e948a33915574021a7a953d83e84fba6e25c72ffcfd7dad35ff" +dependencies = [ + "bincode", + "serde", +] + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "uncased" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1b88fcfe09e89d3866a5c11019378088af2d24c3fbd4f0543f96b479ec90697" +dependencies = [ + "version_check", +] + +[[package]] +name = "unicode-ident" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "unty" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d49784317cd0d1ee7ec5c716dd598ec5b4483ea832a2dced265471cc0f690ae" + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "visibility" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d674d135b4a8c1d7e813e2f8d1c9a58308aee4a680323066025e53132218bd91" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasix" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1757e0d1f8456693c7e5c6c629bdb54884e032aa0bb53c155f6a39f94440d332" +dependencies = [ + "wasi", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d759f433fa64a2d763d1340820e46e111a7a5ab75f993d1852d70b03dbb80fd" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48cb0d2638f8baedbc542ed444afc0644a29166f1595371af4fecf8ce1e7eeb3" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cefb59d5cd5f92d9dcf80e4683949f15ca4b511f4ac0a6e14d4e1ac60c6ecd40" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.114", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbc538057e648b67f72a982e708d485b2efa771e1ac05fec311f9f63e5800db4" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "weak-table" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "323f4da9523e9a669e1eaf9c6e763892769b1d38c623913647bfdc1532fe4549" + +[[package]] +name = "web-sys" +version = "0.3.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b32828d774c412041098d182a8b38b16ea816958e07cf40eec2bc080ae137ac" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.61.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +dependencies = [ + "windows-collections", + "windows-core 0.61.2", + "windows-future", + "windows-link 0.1.3", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core 0.61.2", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-numerics" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link 0.2.1", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[package]] +name = "windows-threading" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "winnow" +version = "0.7.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "x25519-dalek" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277" +dependencies = [ + "curve25519-dalek", + "rand_core 0.6.4", + "serde", + "zeroize", +] + +[[package]] +name = "zerocopy" +version = "0.8.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "668f5168d10b9ee831de31933dc111a459c97ec93225beb307aed970d1372dfd" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c7962b26b0a8685668b671ee4b54d007a67d4eaf05fda79ac0ecf41e32270f1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" + +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "zerovec" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +dependencies = [ + "serde", + "zerofrom", +] + +[[package]] +name = "zmij" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd8f3f50b848df28f887acb68e41201b5aea6bc8a8dacc00fb40635ff9a72fea" diff --git a/localPackages/Arti/Cargo.toml b/localPackages/Arti/Cargo.toml new file mode 100644 index 00000000..713d0b1f --- /dev/null +++ b/localPackages/Arti/Cargo.toml @@ -0,0 +1,10 @@ +[workspace] +resolver = "2" +members = ["arti-bitchat"] + +[profile.release] +opt-level = "z" +lto = "fat" +codegen-units = 1 +panic = "abort" +strip = "symbols" diff --git a/localPackages/Tor/Frameworks/tor-nolzma.xcframework/Info.plist b/localPackages/Arti/Frameworks/arti.xcframework/Info.plist similarity index 76% rename from localPackages/Tor/Frameworks/tor-nolzma.xcframework/Info.plist rename to localPackages/Arti/Frameworks/arti.xcframework/Info.plist index 595e8260..5e9b24d6 100644 --- a/localPackages/Tor/Frameworks/tor-nolzma.xcframework/Info.plist +++ b/localPackages/Arti/Frameworks/arti.xcframework/Info.plist @@ -6,27 +6,13 @@ BinaryPath - tor-nolzma.framework/tor-nolzma - LibraryIdentifier - ios-arm64-simulator - LibraryPath - tor-nolzma.framework - SupportedArchitectures - - arm64 - - SupportedPlatform - ios - SupportedPlatformVariant - simulator - - - BinaryPath - tor-nolzma.framework/Versions/A/tor-nolzma + libarti_bitchat.a + HeadersPath + Headers LibraryIdentifier macos-arm64 LibraryPath - tor-nolzma.framework + libarti_bitchat.a SupportedArchitectures arm64 @@ -36,11 +22,13 @@ BinaryPath - tor-nolzma.framework/tor-nolzma + libarti_bitchat.a + HeadersPath + Headers LibraryIdentifier ios-arm64 LibraryPath - tor-nolzma.framework + libarti_bitchat.a SupportedArchitectures arm64 @@ -48,6 +36,24 @@ SupportedPlatform ios + + BinaryPath + libarti_bitchat.a + HeadersPath + Headers + LibraryIdentifier + ios-arm64-simulator + LibraryPath + libarti_bitchat.a + SupportedArchitectures + + arm64 + + SupportedPlatform + ios + SupportedPlatformVariant + simulator + CFBundlePackageType XFWK diff --git a/localPackages/Arti/Frameworks/arti.xcframework/ios-arm64-simulator/Headers/arti.h b/localPackages/Arti/Frameworks/arti.xcframework/ios-arm64-simulator/Headers/arti.h new file mode 100644 index 00000000..5281299a --- /dev/null +++ b/localPackages/Arti/Frameworks/arti.xcframework/ios-arm64-simulator/Headers/arti.h @@ -0,0 +1,78 @@ +#ifndef ARTI_H +#define ARTI_H + +#include +#include + +/** + * Start Arti with a SOCKS5 proxy. + * + * # Arguments + * * `data_dir` - Path to data directory for Tor state (C string) + * * `socks_port` - Port for SOCKS5 proxy (e.g., 39050) + * + * # Returns + * * 0 on success + * * -1 if already running + * * -2 if data_dir is invalid + * * -3 if runtime initialization failed + * * -4 if bootstrap failed + */ +int arti_start(const char *data_dir, uint16_t socks_port); + +/** + * Stop Arti gracefully. + * + * # Returns + * * 0 on success + * * -1 if not running + */ +int arti_stop(void); + +/** + * Check if Arti is currently running. + * + * # Returns + * * 1 if running + * * 0 if not running + */ +int arti_is_running(void); + +/** + * Get the current bootstrap progress (0-100). + */ +int arti_bootstrap_progress(void); + +/** + * Get the current bootstrap summary string. + * + * # Arguments + * * `buf` - Buffer to write the summary into + * * `len` - Length of the buffer + * + * # Returns + * * Number of bytes written (not including null terminator) + * * -1 if buffer is null or too small + */ +int arti_bootstrap_summary(char *buf, int len); + +/** + * Signal Arti to go dormant (reduce resource usage). + * This is a hint; Arti may not fully support dormant mode yet. + * + * # Returns + * * 0 on success + * * -1 if not running + */ +int arti_go_dormant(void); + +/** + * Signal Arti to wake from dormant mode. + * + * # Returns + * * 0 on success + * * -1 if not running + */ +int arti_wake(void); + +#endif /* ARTI_H */ diff --git a/localPackages/Arti/Frameworks/arti.xcframework/ios-arm64-simulator/libarti_bitchat.a b/localPackages/Arti/Frameworks/arti.xcframework/ios-arm64-simulator/libarti_bitchat.a new file mode 100644 index 00000000..3b5d7176 Binary files /dev/null and b/localPackages/Arti/Frameworks/arti.xcframework/ios-arm64-simulator/libarti_bitchat.a differ diff --git a/localPackages/Arti/Frameworks/arti.xcframework/ios-arm64/Headers/arti.h b/localPackages/Arti/Frameworks/arti.xcframework/ios-arm64/Headers/arti.h new file mode 100644 index 00000000..5281299a --- /dev/null +++ b/localPackages/Arti/Frameworks/arti.xcframework/ios-arm64/Headers/arti.h @@ -0,0 +1,78 @@ +#ifndef ARTI_H +#define ARTI_H + +#include +#include + +/** + * Start Arti with a SOCKS5 proxy. + * + * # Arguments + * * `data_dir` - Path to data directory for Tor state (C string) + * * `socks_port` - Port for SOCKS5 proxy (e.g., 39050) + * + * # Returns + * * 0 on success + * * -1 if already running + * * -2 if data_dir is invalid + * * -3 if runtime initialization failed + * * -4 if bootstrap failed + */ +int arti_start(const char *data_dir, uint16_t socks_port); + +/** + * Stop Arti gracefully. + * + * # Returns + * * 0 on success + * * -1 if not running + */ +int arti_stop(void); + +/** + * Check if Arti is currently running. + * + * # Returns + * * 1 if running + * * 0 if not running + */ +int arti_is_running(void); + +/** + * Get the current bootstrap progress (0-100). + */ +int arti_bootstrap_progress(void); + +/** + * Get the current bootstrap summary string. + * + * # Arguments + * * `buf` - Buffer to write the summary into + * * `len` - Length of the buffer + * + * # Returns + * * Number of bytes written (not including null terminator) + * * -1 if buffer is null or too small + */ +int arti_bootstrap_summary(char *buf, int len); + +/** + * Signal Arti to go dormant (reduce resource usage). + * This is a hint; Arti may not fully support dormant mode yet. + * + * # Returns + * * 0 on success + * * -1 if not running + */ +int arti_go_dormant(void); + +/** + * Signal Arti to wake from dormant mode. + * + * # Returns + * * 0 on success + * * -1 if not running + */ +int arti_wake(void); + +#endif /* ARTI_H */ diff --git a/localPackages/Arti/Frameworks/arti.xcframework/ios-arm64/libarti_bitchat.a b/localPackages/Arti/Frameworks/arti.xcframework/ios-arm64/libarti_bitchat.a new file mode 100644 index 00000000..35bf4c67 Binary files /dev/null and b/localPackages/Arti/Frameworks/arti.xcframework/ios-arm64/libarti_bitchat.a differ diff --git a/localPackages/Arti/Frameworks/arti.xcframework/macos-arm64/Headers/arti.h b/localPackages/Arti/Frameworks/arti.xcframework/macos-arm64/Headers/arti.h new file mode 100644 index 00000000..5281299a --- /dev/null +++ b/localPackages/Arti/Frameworks/arti.xcframework/macos-arm64/Headers/arti.h @@ -0,0 +1,78 @@ +#ifndef ARTI_H +#define ARTI_H + +#include +#include + +/** + * Start Arti with a SOCKS5 proxy. + * + * # Arguments + * * `data_dir` - Path to data directory for Tor state (C string) + * * `socks_port` - Port for SOCKS5 proxy (e.g., 39050) + * + * # Returns + * * 0 on success + * * -1 if already running + * * -2 if data_dir is invalid + * * -3 if runtime initialization failed + * * -4 if bootstrap failed + */ +int arti_start(const char *data_dir, uint16_t socks_port); + +/** + * Stop Arti gracefully. + * + * # Returns + * * 0 on success + * * -1 if not running + */ +int arti_stop(void); + +/** + * Check if Arti is currently running. + * + * # Returns + * * 1 if running + * * 0 if not running + */ +int arti_is_running(void); + +/** + * Get the current bootstrap progress (0-100). + */ +int arti_bootstrap_progress(void); + +/** + * Get the current bootstrap summary string. + * + * # Arguments + * * `buf` - Buffer to write the summary into + * * `len` - Length of the buffer + * + * # Returns + * * Number of bytes written (not including null terminator) + * * -1 if buffer is null or too small + */ +int arti_bootstrap_summary(char *buf, int len); + +/** + * Signal Arti to go dormant (reduce resource usage). + * This is a hint; Arti may not fully support dormant mode yet. + * + * # Returns + * * 0 on success + * * -1 if not running + */ +int arti_go_dormant(void); + +/** + * Signal Arti to wake from dormant mode. + * + * # Returns + * * 0 on success + * * -1 if not running + */ +int arti_wake(void); + +#endif /* ARTI_H */ diff --git a/localPackages/Arti/Frameworks/arti.xcframework/macos-arm64/libarti_bitchat.a b/localPackages/Arti/Frameworks/arti.xcframework/macos-arm64/libarti_bitchat.a new file mode 100644 index 00000000..3884360b Binary files /dev/null and b/localPackages/Arti/Frameworks/arti.xcframework/macos-arm64/libarti_bitchat.a differ diff --git a/localPackages/Arti/Frameworks/include/arti.h b/localPackages/Arti/Frameworks/include/arti.h new file mode 100644 index 00000000..5281299a --- /dev/null +++ b/localPackages/Arti/Frameworks/include/arti.h @@ -0,0 +1,78 @@ +#ifndef ARTI_H +#define ARTI_H + +#include +#include + +/** + * Start Arti with a SOCKS5 proxy. + * + * # Arguments + * * `data_dir` - Path to data directory for Tor state (C string) + * * `socks_port` - Port for SOCKS5 proxy (e.g., 39050) + * + * # Returns + * * 0 on success + * * -1 if already running + * * -2 if data_dir is invalid + * * -3 if runtime initialization failed + * * -4 if bootstrap failed + */ +int arti_start(const char *data_dir, uint16_t socks_port); + +/** + * Stop Arti gracefully. + * + * # Returns + * * 0 on success + * * -1 if not running + */ +int arti_stop(void); + +/** + * Check if Arti is currently running. + * + * # Returns + * * 1 if running + * * 0 if not running + */ +int arti_is_running(void); + +/** + * Get the current bootstrap progress (0-100). + */ +int arti_bootstrap_progress(void); + +/** + * Get the current bootstrap summary string. + * + * # Arguments + * * `buf` - Buffer to write the summary into + * * `len` - Length of the buffer + * + * # Returns + * * Number of bytes written (not including null terminator) + * * -1 if buffer is null or too small + */ +int arti_bootstrap_summary(char *buf, int len); + +/** + * Signal Arti to go dormant (reduce resource usage). + * This is a hint; Arti may not fully support dormant mode yet. + * + * # Returns + * * 0 on success + * * -1 if not running + */ +int arti_go_dormant(void); + +/** + * Signal Arti to wake from dormant mode. + * + * # Returns + * * 0 on success + * * -1 if not running + */ +int arti_wake(void); + +#endif /* ARTI_H */ diff --git a/localPackages/Arti/Package.swift b/localPackages/Arti/Package.swift new file mode 100644 index 00000000..c32ad6cf --- /dev/null +++ b/localPackages/Arti/Package.swift @@ -0,0 +1,46 @@ +// swift-tools-version:5.9 +import PackageDescription + +let package = Package( + name: "Tor", // Keep name "Tor" for drop-in compatibility + platforms: [ + .iOS(.v16), + .macOS(.v13), + ], + products: [ + .library( + name: "Tor", + targets: ["Tor"] + ), + ], + dependencies: [ + .package(path: "../BitLogger"), + ], + targets: [ + // Main Swift target + .target( + name: "Tor", + dependencies: [ + "arti", + .product(name: "BitLogger", package: "BitLogger"), + ], + path: "Sources", + exclude: ["C"], + sources: [ + "TorManager.swift", + "TorURLSession.swift", + "TorNotifications.swift", + ], + linkerSettings: [ + .linkedLibrary("resolv"), + .linkedLibrary("z"), + .linkedLibrary("sqlite3"), + ] + ), + // Binary framework containing the Rust static library + .binaryTarget( + name: "arti", + path: "Frameworks/arti.xcframework" + ), + ] +) diff --git a/localPackages/Arti/Sources/C/arti_shim.c b/localPackages/Arti/Sources/C/arti_shim.c new file mode 100644 index 00000000..9ee21f52 --- /dev/null +++ b/localPackages/Arti/Sources/C/arti_shim.c @@ -0,0 +1,3 @@ +// Empty shim file to satisfy SPM target requirements. +// The actual implementation is in the Rust static library (arti.xcframework). +// This file exists only to make SPM happy with a C target. diff --git a/localPackages/Arti/Sources/C/include/arti.h b/localPackages/Arti/Sources/C/include/arti.h new file mode 100644 index 00000000..4a62bd21 --- /dev/null +++ b/localPackages/Arti/Sources/C/include/arti.h @@ -0,0 +1,71 @@ +#ifndef ARTI_H +#define ARTI_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Start Arti with a SOCKS5 proxy. + * + * @param data_dir Path to data directory for Tor state (C string) + * @param socks_port Port for SOCKS5 proxy (e.g., 39050) + * @return 0 on success, negative on error: + * -1: already running + * -2: invalid data_dir + * -3: runtime initialization failed + * -4: bootstrap failed + */ +int32_t arti_start(const char *data_dir, uint16_t socks_port); + +/** + * Stop Arti gracefully. + * + * @return 0 on success, -1 if not running + */ +int32_t arti_stop(void); + +/** + * Check if Arti is currently running. + * + * @return 1 if running, 0 if not running + */ +int32_t arti_is_running(void); + +/** + * Get the current bootstrap progress (0-100). + * + * @return Progress percentage + */ +int32_t arti_bootstrap_progress(void); + +/** + * Get the current bootstrap summary string. + * + * @param buf Buffer to write the summary into + * @param len Length of the buffer + * @return Number of bytes written, -1 on error + */ +int32_t arti_bootstrap_summary(char *buf, int32_t len); + +/** + * Signal Arti to go dormant (reduce resource usage). + * + * @return 0 on success, -1 if not running + */ +int32_t arti_go_dormant(void); + +/** + * Signal Arti to wake from dormant mode. + * + * @return 0 on success, -1 if not running + */ +int32_t arti_wake(void); + +#ifdef __cplusplus +} +#endif + +#endif /* ARTI_H */ diff --git a/localPackages/Arti/Sources/C/include/module.modulemap b/localPackages/Arti/Sources/C/include/module.modulemap new file mode 100644 index 00000000..a3973390 --- /dev/null +++ b/localPackages/Arti/Sources/C/include/module.modulemap @@ -0,0 +1,4 @@ +module ArtiC { + header "arti.h" + export * +} diff --git a/localPackages/Arti/Sources/TorManager.swift b/localPackages/Arti/Sources/TorManager.swift new file mode 100644 index 00000000..24d62d67 --- /dev/null +++ b/localPackages/Arti/Sources/TorManager.swift @@ -0,0 +1,498 @@ +import BitLogger +import Foundation +#if canImport(Network) +import Network +#endif + +#if !canImport(Network) +private final class NWPathMonitor { + var pathUpdateHandler: ((Any) -> Void)? + + func start(queue: DispatchQueue) { + // Path monitoring is unavailable on this platform; nothing to do. + } +} +#endif + +// FFI declarations for Arti (Rust) +@_silgen_name("arti_start") +private func arti_start(_ dataDir: UnsafePointer, _ socksPort: UInt16) -> Int32 + +@_silgen_name("arti_stop") +private func arti_stop() -> Int32 + +@_silgen_name("arti_is_running") +private func arti_is_running() -> Int32 + +@_silgen_name("arti_bootstrap_progress") +private func arti_bootstrap_progress() -> Int32 + +@_silgen_name("arti_bootstrap_summary") +private func arti_bootstrap_summary(_ buf: UnsafeMutablePointer, _ len: Int32) -> Int32 + +@_silgen_name("arti_go_dormant") +private func arti_go_dormant() -> Int32 + +@_silgen_name("arti_wake") +private func arti_wake() -> Int32 + +/// Arti-based Tor integration for BitChat. +/// - Boots a local Arti client and exposes a SOCKS5 proxy +/// on 127.0.0.1:socksPort. All app networking should await readiness and +/// route via this proxy. Fails closed by default when Tor is unavailable. +@MainActor +public final class TorManager: ObservableObject { + public static let shared = TorManager() + + // SOCKS endpoint where Arti listens + let socksHost: String = "127.0.0.1" + let socksPort: Int = 39050 + + // State + @Published private(set) public var isReady: Bool = false + @Published private(set) var isStarting: Bool = false + @Published private(set) var lastError: Error? + @Published private(set) var bootstrapProgress: Int = 0 + @Published private(set) var bootstrapSummary: String = "" + + // Internal readiness trackers + private var socksReady: Bool = false { didSet { recomputeReady() } } + private var restarting: Bool = false + + // Whether the app must enforce Tor for all connections (fail-closed). + public var torEnforced: Bool { + #if BITCHAT_DEV_ALLOW_CLEARNET + return false + #else + return true + #endif + } + + // Returns true only when Tor is actually up (or dev fallback is compiled). + var networkPermitted: Bool { + if torEnforced { return isReady } + return true + } + + private var didStart = false + private var bootstrapMonitorStarted = false + private var pathMonitor: NWPathMonitor? + private var isAppForeground: Bool = true + private var isDormant: Bool = false + private var lastRestartAt: Date? = nil + private var startedAt: Date? = nil // Tracks initial startup time for grace period + private(set) var allowAutoStart: Bool = false + + private init() {} + + // MARK: - Public API + + public func startIfNeeded() { + guard allowAutoStart else { return } + guard isAppForeground else { return } + guard !didStart else { return } + didStart = true + isDormant = false + isStarting = true + startedAt = Date() // Track startup time for grace period + SecureLogger.debug("TorManager: startIfNeeded() - startedAt set", category: .session) + lastError = nil + NotificationCenter.default.post(name: .TorWillStart, object: nil) + ensureFilesystemLayout() + startArti() + startPathMonitorIfNeeded() + } + + public func setAppForeground(_ foreground: Bool) { + isAppForeground = foreground + } + + public func isForeground() -> Bool { isAppForeground } + + nonisolated + public func awaitReady(timeout: TimeInterval = 25.0) async -> Bool { + await MainActor.run { + if self.isAppForeground { self.startIfNeeded() } + } + let deadline = Date().addingTimeInterval(timeout) + if await MainActor.run(body: { self.networkPermitted }) { return true } + while Date() < deadline { + try? await Task.sleep(nanoseconds: 200_000_000) + if await MainActor.run(body: { self.networkPermitted }) { return true } + } + return await MainActor.run(body: { self.networkPermitted }) + } + + // MARK: - Filesystem + + func dataDirectoryURL() -> URL? { + do { + let base = try FileManager.default.url( + for: .applicationSupportDirectory, + in: .userDomainMask, + appropriateFor: nil, + create: true + ) + let dir = base.appendingPathComponent("bitchat/arti", isDirectory: true) + return dir + } catch { + return nil + } + } + + private func ensureFilesystemLayout() { + guard let dir = dataDirectoryURL() else { return } + do { + try FileManager.default.createDirectory(at: dir, withIntermediateDirectories: true) + } catch { + // Non-fatal; Arti will surface errors during start if paths are missing + } + } + + // MARK: - Arti Integration + + private func startArti() { + guard let dir = dataDirectoryURL()?.path else { + isStarting = false + lastError = NSError(domain: "TorManager", code: -1, userInfo: [NSLocalizedDescriptionKey: "No data directory"]) + return + } + + // Check if already running + if arti_is_running() != 0 { + SecureLogger.info("TorManager: Arti already running", category: .session) + startBootstrapMonitor() + return + } + + let result = dir.withCString { dptr in + arti_start(dptr, UInt16(socksPort)) + } + + if result != 0 { + SecureLogger.error("TorManager: arti_start failed rc=\(result)", category: .session) + isStarting = false + lastError = NSError(domain: "TorManager", code: Int(result), userInfo: [NSLocalizedDescriptionKey: "Arti start failed"]) + return + } + + SecureLogger.info("TorManager: arti_start OK (SOCKS \(socksHost):\(socksPort))", category: .session) + startBootstrapMonitor() + + // Start SOCKS readiness probe + Task.detached(priority: .userInitiated) { [weak self] in + guard let self else { return } + let ready = await self.waitForSocksReady(timeout: 60.0) + await MainActor.run { + self.socksReady = ready + if ready { + SecureLogger.info("TorManager: SOCKS ready at \(self.socksHost):\(self.socksPort)", category: .session) + } else { + self.lastError = NSError(domain: "TorManager", code: -14, userInfo: [NSLocalizedDescriptionKey: "SOCKS not reachable"]) + SecureLogger.error("TorManager: SOCKS not reachable (timeout)", category: .session) + } + } + } + } + + private func waitForSocksReady(timeout: TimeInterval) async -> Bool { + let deadline = Date().addingTimeInterval(timeout) + while Date() < deadline { + if await probeSocksOnce() { return true } + try? await Task.sleep(nanoseconds: 250_000_000) + } + return false + } + + private func probeSocksOnce() async -> Bool { + #if canImport(Network) + await withCheckedContinuation { cont in + let params = NWParameters.tcp + let host = NWEndpoint.Host.ipv4(.loopback) + guard let port = NWEndpoint.Port(rawValue: UInt16(socksPort)) else { + cont.resume(returning: false) + return + } + let endpoint = NWEndpoint.hostPort(host: host, port: port) + let conn = NWConnection(to: endpoint, using: params) + + var resumed = false + let resumeOnce: (Bool) -> Void = { value in + if !resumed { + resumed = true + cont.resume(returning: value) + } + } + + conn.stateUpdateHandler = { state in + switch state { + case .ready: + resumeOnce(true) + conn.cancel() + case .failed, .cancelled: + resumeOnce(false) + conn.cancel() + default: + break + } + } + + DispatchQueue.global(qos: .utility).asyncAfter(deadline: .now() + 1.0) { + resumeOnce(false) + conn.cancel() + } + + conn.start(queue: DispatchQueue.global(qos: .utility)) + } + #else + return false + #endif + } + + // MARK: - Bootstrap Monitoring + + private func startBootstrapMonitor() { + guard !bootstrapMonitorStarted else { return } + bootstrapMonitorStarted = true + Task.detached(priority: .utility) { [weak self] in + await self?.bootstrapPollLoop() + } + } + + private func bootstrapPollLoop() async { + let deadline = Date().addingTimeInterval(75) + while Date() < deadline { + let progress = Int(arti_bootstrap_progress()) + let summary = getBootstrapSummary() + + await MainActor.run { + self.bootstrapProgress = progress + self.bootstrapSummary = summary + if progress >= 100 { self.isStarting = false } + self.recomputeReady() + } + + if progress >= 100 { break } + try? await Task.sleep(nanoseconds: 1_000_000_000) + } + } + + private func getBootstrapSummary() -> String { + var buf = [CChar](repeating: 0, count: 256) + let len = arti_bootstrap_summary(&buf, Int32(buf.count)) + if len > 0 { + return String(cString: buf) + } + return "" + } + + // MARK: - Foreground/Background + + public func ensureRunningOnForeground() { + if !allowAutoStart { return } + Task.detached(priority: .userInitiated) { [weak self] in + guard let self = self else { return } + let claimed: Bool = await MainActor.run { + if self.isStarting || self.restarting { return false } + self.restarting = true + return true + } + if !claimed { return } + + // Try to wake if dormant + if await self.wakeFromDormant() { + await MainActor.run { self.restarting = false } + return + } + + // Check if already ready + let alreadyReady = await MainActor.run { self.isReady } + if alreadyReady { + await MainActor.run { self.restarting = false } + return + } + + // Restart + await self.restartArti() + await MainActor.run { self.restarting = false } + } + } + + public func goDormantOnBackground() { + SecureLogger.debug("TorManager: goDormantOnBackground() called", category: .session) + Task.detached { [weak self] in + guard let self = self else { return } + let result = arti_go_dormant() + if result == 0 { + SecureLogger.info("TorManager: signalled DORMANT", category: .session) + await MainActor.run { + self.isDormant = true + self.isReady = false + self.socksReady = false + self.isStarting = false + } + } else { + // Dormant not supported, do full shutdown + SecureLogger.warning("TorManager: DORMANT failed; shutting down", category: .session) + _ = arti_stop() + await MainActor.run { + self.isDormant = false + self.isReady = false + self.socksReady = false + self.bootstrapProgress = 0 + self.bootstrapSummary = "" + self.isStarting = false + self.didStart = false + self.bootstrapMonitorStarted = false + // Note: Don't clear startedAt - it will be set fresh on next start + } + } + } + } + + public func shutdownCompletely() { + SecureLogger.debug("TorManager: shutdownCompletely() called", category: .session) + Task.detached { [weak self] in + guard let self = self else { return } + _ = arti_stop() + + // Wait for shutdown + var waited = 0 + while arti_is_running() != 0 && waited < 50 { + try? await Task.sleep(nanoseconds: 100_000_000) + waited += 1 + } + + await MainActor.run { + self.isDormant = false + self.isReady = false + self.socksReady = false + self.bootstrapProgress = 0 + self.bootstrapSummary = "" + self.isStarting = false + self.didStart = false + self.restarting = false + self.bootstrapMonitorStarted = false + // Note: Don't clear startedAt here - it will be set fresh on next startIfNeeded() + // Clearing it here races with startup and defeats the grace period + } + } + } + + private func wakeFromDormant() async -> Bool { + let wasDormant = await MainActor.run { self.isDormant } + if !wasDormant { return false } + + let result = arti_wake() + if result != 0 { return false } + + await MainActor.run { + self.isDormant = false + self.isStarting = true + self.socksReady = false + } + + let ready = await waitForSocksReady(timeout: 12.0) + await MainActor.run { + self.socksReady = ready + self.isStarting = !ready + } + + if ready { + SecureLogger.info("TorManager: woke from dormant", category: .session) + } + return ready + } + + private func restartArti() async { + SecureLogger.debug("TorManager: restartArti() starting", category: .session) + await MainActor.run { + NotificationCenter.default.post(name: .TorWillRestart, object: nil) + self.isReady = false + self.socksReady = false + self.bootstrapProgress = 0 + self.bootstrapSummary = "" + self.isStarting = true + self.isDormant = false + self.lastRestartAt = Date() + } + + _ = arti_stop() + + // Wait for stop + var waited = 0 + while arti_is_running() != 0 && waited < 40 { + try? await Task.sleep(nanoseconds: 100_000_000) + waited += 1 + } + + await MainActor.run { + self.bootstrapMonitorStarted = false + self.didStart = false + } + + await MainActor.run { self.startIfNeeded() } + } + + private func recomputeReady() { + let ready = socksReady && bootstrapProgress >= 100 + if ready != isReady { + if !ready { + SecureLogger.debug("TorManager: isReady -> false (socksReady=\(socksReady), bootstrap=\(bootstrapProgress))", category: .session) + } + isReady = ready + if ready { + NotificationCenter.default.post(name: .TorDidBecomeReady, object: nil) + } + } + } + + private func startPathMonitorIfNeeded() { + #if canImport(Network) + guard pathMonitor == nil else { return } + let monitor = NWPathMonitor() + pathMonitor = monitor + let queue = DispatchQueue(label: "TorPathMonitor") + monitor.pathUpdateHandler = { [weak self] _ in + Task { @MainActor in + guard let self = self else { return } + if self.isAppForeground { + self.pokeTorOnPathChange() + } + } + } + monitor.start(queue: queue) + #endif + } + + private func pokeTorOnPathChange() { + // Skip if we recently restarted + if let last = lastRestartAt, Date().timeIntervalSince(last) < 3.0 { + SecureLogger.debug("TorManager: pokeTorOnPathChange() skipped - recent restart", category: .session) + return + } + // Skip during initial startup grace period (15s) to avoid race conditions + if let started = startedAt, Date().timeIntervalSince(started) < 15.0 { + SecureLogger.debug("TorManager: pokeTorOnPathChange() skipped - startup grace period (\(Int(Date().timeIntervalSince(started)))s)", category: .session) + return + } + if isStarting || restarting { + SecureLogger.debug("TorManager: pokeTorOnPathChange() skipped - isStarting=\(isStarting) restarting=\(restarting)", category: .session) + return + } + if isReady { return } + SecureLogger.debug("TorManager: pokeTorOnPathChange() - Arti not ready, initiating recovery", category: .session) + ensureRunningOnForeground() + } +} + +// MARK: - Start policy configuration +extension TorManager { + @MainActor + public func setAutoStartAllowed(_ allow: Bool) { + allowAutoStart = allow + } + + @MainActor + public func isAutoStartAllowed() -> Bool { allowAutoStart } +} diff --git a/localPackages/Tor/Sources/TorNotifications.swift b/localPackages/Arti/Sources/TorNotifications.swift similarity index 100% rename from localPackages/Tor/Sources/TorNotifications.swift rename to localPackages/Arti/Sources/TorNotifications.swift diff --git a/localPackages/Tor/Sources/TorURLSession.swift b/localPackages/Arti/Sources/TorURLSession.swift similarity index 100% rename from localPackages/Tor/Sources/TorURLSession.swift rename to localPackages/Arti/Sources/TorURLSession.swift diff --git a/localPackages/Arti/arti-bitchat/Cargo.toml b/localPackages/Arti/arti-bitchat/Cargo.toml new file mode 100644 index 00000000..fcb8abf5 --- /dev/null +++ b/localPackages/Arti/arti-bitchat/Cargo.toml @@ -0,0 +1,38 @@ +[package] +name = "arti-bitchat" +version = "0.1.0" +edition = "2021" +rust-version = "1.86" + +[lib] +crate-type = ["staticlib"] + +[dependencies] +# Arti core - minimal features for client-only SOCKS proxy +arti-client = { version = "0.38", default-features = false, features = [ + "tokio", + "rustls", +] } + +# Async runtime +tokio = { version = "1", default-features = false, features = [ + "rt-multi-thread", + "net", + "sync", + "time", + "macros", +] } + +# Tor runtime compatibility +tor-rtcompat = { version = "0.38", default-features = false, features = ["tokio"] } + +# FFI utilities +libc = "0.2" +once_cell = "1" + +# Logging (minimal) +tracing = "0.1" +tracing-subscriber = { version = "0.3", default-features = false, features = ["fmt"] } + +[features] +default = [] diff --git a/localPackages/Arti/arti-bitchat/cbindgen.toml b/localPackages/Arti/arti-bitchat/cbindgen.toml new file mode 100644 index 00000000..12e5e47b --- /dev/null +++ b/localPackages/Arti/arti-bitchat/cbindgen.toml @@ -0,0 +1,13 @@ +language = "C" +include_guard = "ARTI_H" +no_includes = true +sys_includes = ["stdint.h", "stdbool.h"] + +[export] +include = ["arti_start", "arti_stop", "arti_is_running", "arti_bootstrap_progress", "arti_bootstrap_summary", "arti_go_dormant", "arti_wake"] + +[fn] +args = "Auto" + +[parse] +parse_deps = false diff --git a/localPackages/Arti/arti-bitchat/src/lib.rs b/localPackages/Arti/arti-bitchat/src/lib.rs new file mode 100644 index 00000000..e3139edd --- /dev/null +++ b/localPackages/Arti/arti-bitchat/src/lib.rs @@ -0,0 +1,315 @@ +//! arti-bitchat: Minimal FFI wrapper around arti-client for BitChat +//! +//! Provides a C-compatible interface for embedding Arti (Rust Tor) in iOS/macOS apps. +//! Exposes a SOCKS5 proxy on localhost that Swift code can route traffic through. + +use std::ffi::{c_char, c_int, CStr}; +use std::net::SocketAddr; +use std::path::PathBuf; +use std::sync::atomic::{AtomicBool, AtomicI32, Ordering}; +use std::sync::{Arc, Mutex}; + +use arti_client::TorClient; +use once_cell::sync::OnceCell; +use tokio::net::TcpListener; +use tokio::runtime::Runtime; +use tokio::sync::oneshot; +use tor_rtcompat::PreferredRuntime; + +mod socks; + +/// Global state for the Arti instance +struct ArtiState { + /// Tokio runtime (owned, single instance) + runtime: Runtime, + /// Shutdown signal sender + shutdown_tx: Option>, + /// TorClient handle for status queries + client: Option>>, +} + +static ARTI_STATE: OnceCell> = OnceCell::new(); +static BOOTSTRAP_PROGRESS: AtomicI32 = AtomicI32::new(0); +static IS_RUNNING: AtomicBool = AtomicBool::new(false); +static BOOTSTRAP_SUMMARY: Mutex = Mutex::new(String::new()); + +/// Initialize the global state with a new runtime +fn init_state() -> Result<(), &'static str> { + ARTI_STATE.get_or_try_init(|| -> Result, &'static str> { + let runtime = Runtime::new().map_err(|_| "Failed to create tokio runtime")?; + Ok(Mutex::new(ArtiState { + runtime, + shutdown_tx: None, + client: None, + })) + })?; + Ok(()) +} + +/// Start Arti with a SOCKS5 proxy. +/// +/// # Arguments +/// * `data_dir` - Path to data directory for Tor state (C string) +/// * `socks_port` - Port for SOCKS5 proxy (e.g., 39050) +/// +/// # Returns +/// * 0 on success +/// * -1 if already running +/// * -2 if data_dir is invalid +/// * -3 if runtime initialization failed +/// * -4 if bootstrap failed +#[no_mangle] +pub extern "C" fn arti_start(data_dir: *const c_char, socks_port: u16) -> c_int { + // Check if already running + if IS_RUNNING.load(Ordering::SeqCst) { + return -1; + } + + // Parse data directory + let data_path = match unsafe { CStr::from_ptr(data_dir) }.to_str() { + Ok(s) => PathBuf::from(s), + Err(_) => return -2, + }; + + // Initialize runtime if needed + if let Err(_) = init_state() { + return -3; + } + + let state = match ARTI_STATE.get() { + Some(s) => s, + None => return -3, + }; + + let mut guard = match state.lock() { + Ok(g) => g, + Err(_) => return -3, + }; + + // Create shutdown channel + let (shutdown_tx, shutdown_rx) = oneshot::channel(); + guard.shutdown_tx = Some(shutdown_tx); + + let socks_addr: SocketAddr = format!("127.0.0.1:{}", socks_port) + .parse() + .expect("valid addr"); + + // Spawn the main Arti task + let data_path_clone = data_path.clone(); + guard.runtime.spawn(async move { + match run_arti(data_path_clone, socks_addr, shutdown_rx).await { + Ok(_) => { + tracing::info!("Arti shutdown cleanly"); + } + Err(e) => { + tracing::error!("Arti error: {}", e); + update_summary(&format!("Error: {}", e)); + } + } + IS_RUNNING.store(false, Ordering::SeqCst); + BOOTSTRAP_PROGRESS.store(0, Ordering::SeqCst); + }); + + IS_RUNNING.store(true, Ordering::SeqCst); + BOOTSTRAP_PROGRESS.store(0, Ordering::SeqCst); + update_summary("Starting..."); + + 0 +} + +/// Stop Arti gracefully. +/// +/// # Returns +/// * 0 on success +/// * -1 if not running +#[no_mangle] +pub extern "C" fn arti_stop() -> c_int { + if !IS_RUNNING.load(Ordering::SeqCst) { + return -1; + } + + let state = match ARTI_STATE.get() { + Some(s) => s, + None => return -1, + }; + + let mut guard = match state.lock() { + Ok(g) => g, + Err(_) => return -1, + }; + + // Send shutdown signal + if let Some(tx) = guard.shutdown_tx.take() { + let _ = tx.send(()); + } + + // Clear client reference + guard.client = None; + + // Give async tasks time to complete + std::thread::sleep(std::time::Duration::from_millis(200)); + + IS_RUNNING.store(false, Ordering::SeqCst); + BOOTSTRAP_PROGRESS.store(0, Ordering::SeqCst); + update_summary(""); + + 0 +} + +/// Check if Arti is currently running. +/// +/// # Returns +/// * 1 if running +/// * 0 if not running +#[no_mangle] +pub extern "C" fn arti_is_running() -> c_int { + if IS_RUNNING.load(Ordering::SeqCst) { + 1 + } else { + 0 + } +} + +/// Get the current bootstrap progress (0-100). +#[no_mangle] +pub extern "C" fn arti_bootstrap_progress() -> c_int { + BOOTSTRAP_PROGRESS.load(Ordering::SeqCst) +} + +/// Get the current bootstrap summary string. +/// +/// # Arguments +/// * `buf` - Buffer to write the summary into +/// * `len` - Length of the buffer +/// +/// # Returns +/// * Number of bytes written (not including null terminator) +/// * -1 if buffer is null or too small +#[no_mangle] +pub extern "C" fn arti_bootstrap_summary(buf: *mut c_char, len: c_int) -> c_int { + if buf.is_null() || len <= 0 { + return -1; + } + + let summary = match BOOTSTRAP_SUMMARY.lock() { + Ok(s) => s.clone(), + Err(_) => return -1, + }; + + let bytes = summary.as_bytes(); + let copy_len = std::cmp::min(bytes.len(), (len - 1) as usize); + + unsafe { + std::ptr::copy_nonoverlapping(bytes.as_ptr(), buf as *mut u8, copy_len); + *buf.add(copy_len) = 0; // null terminator + } + + copy_len as c_int +} + +/// Signal Arti to go dormant (reduce resource usage). +/// This is a hint; Arti may not fully support dormant mode yet. +/// +/// # Returns +/// * 0 on success +/// * -1 if not running +#[no_mangle] +pub extern "C" fn arti_go_dormant() -> c_int { + if !IS_RUNNING.load(Ordering::SeqCst) { + return -1; + } + // Arti doesn't have explicit dormant mode yet, but we can note the intent + update_summary("Dormant"); + 0 +} + +/// Signal Arti to wake from dormant mode. +/// +/// # Returns +/// * 0 on success +/// * -1 if not running +#[no_mangle] +pub extern "C" fn arti_wake() -> c_int { + if !IS_RUNNING.load(Ordering::SeqCst) { + return -1; + } + update_summary("Active"); + 0 +} + +fn update_summary(s: &str) { + if let Ok(mut guard) = BOOTSTRAP_SUMMARY.lock() { + guard.clear(); + guard.push_str(s); + } +} + +/// Main async entry point for Arti +async fn run_arti( + data_dir: PathBuf, + socks_addr: SocketAddr, + mut shutdown_rx: oneshot::Receiver<()>, +) -> Result<(), Box> { + // Ensure data directory exists + std::fs::create_dir_all(&data_dir)?; + + update_summary("Configuring..."); + + // Build Arti configuration with custom directories + let cache_dir = data_dir.join("cache"); + let state_dir = data_dir.join("state"); + + // Use from_directories which sets up storage correctly + use arti_client::config::TorClientConfigBuilder; + let config = TorClientConfigBuilder::from_directories(state_dir, cache_dir) + .build()?; + + update_summary("Bootstrapping..."); + + // Create and bootstrap the Tor client + let client = TorClient::create_bootstrapped(config).await?; + let client = Arc::new(client); + + // Store client reference for status queries + if let Some(state) = ARTI_STATE.get() { + if let Ok(mut guard) = state.lock() { + guard.client = Some(client.clone()); + } + } + + // Mark bootstrap complete + BOOTSTRAP_PROGRESS.store(100, Ordering::SeqCst); + update_summary("Ready"); + + // Bind SOCKS listener + let listener = TcpListener::bind(socks_addr).await?; + tracing::info!("SOCKS5 proxy listening on {}", socks_addr); + + // Accept connections until shutdown + loop { + tokio::select! { + accept_result = listener.accept() => { + match accept_result { + Ok((stream, peer_addr)) => { + let client = client.clone(); + tokio::spawn(async move { + if let Err(e) = socks::handle_socks_connection(stream, peer_addr, client).await { + tracing::debug!("SOCKS connection error from {}: {}", peer_addr, e); + } + }); + } + Err(e) => { + tracing::warn!("Accept error: {}", e); + } + } + } + _ = &mut shutdown_rx => { + tracing::info!("Shutdown signal received"); + break; + } + } + } + + update_summary("Shutting down..."); + Ok(()) +} diff --git a/localPackages/Arti/arti-bitchat/src/socks.rs b/localPackages/Arti/arti-bitchat/src/socks.rs new file mode 100644 index 00000000..4795a7d9 --- /dev/null +++ b/localPackages/Arti/arti-bitchat/src/socks.rs @@ -0,0 +1,208 @@ +//! SOCKS5 protocol handler for Arti +//! +//! Implements a minimal SOCKS5 server that forwards connections through Tor. + +use std::io; +use std::net::SocketAddr; +use std::sync::Arc; + +use arti_client::{TorClient, IntoTorAddr}; +use tokio::io::{AsyncReadExt, AsyncWriteExt}; +use tokio::net::TcpStream; +use tor_rtcompat::PreferredRuntime; + +// SOCKS5 constants +const SOCKS5_VERSION: u8 = 0x05; +const SOCKS5_AUTH_NONE: u8 = 0x00; +const SOCKS5_CMD_CONNECT: u8 = 0x01; +const SOCKS5_ATYP_IPV4: u8 = 0x01; +const SOCKS5_ATYP_DOMAIN: u8 = 0x03; +const SOCKS5_ATYP_IPV6: u8 = 0x04; +const SOCKS5_REP_SUCCESS: u8 = 0x00; +const SOCKS5_REP_FAILURE: u8 = 0x01; +const SOCKS5_REP_CONN_REFUSED: u8 = 0x05; + +/// Handle a single SOCKS5 connection +pub async fn handle_socks_connection( + mut stream: TcpStream, + peer_addr: SocketAddr, + client: Arc>, +) -> io::Result<()> { + // --- Greeting --- + // Client sends: VER | NMETHODS | METHODS + let mut greeting = [0u8; 2]; + stream.read_exact(&mut greeting).await?; + + if greeting[0] != SOCKS5_VERSION { + return Err(io::Error::new( + io::ErrorKind::InvalidData, + "Not SOCKS5", + )); + } + + let nmethods = greeting[1] as usize; + let mut methods = vec![0u8; nmethods]; + stream.read_exact(&mut methods).await?; + + // We only support no-auth + if !methods.contains(&SOCKS5_AUTH_NONE) { + // Send failure: no acceptable methods + stream.write_all(&[SOCKS5_VERSION, 0xFF]).await?; + return Err(io::Error::new( + io::ErrorKind::PermissionDenied, + "No acceptable auth methods", + )); + } + + // Accept no-auth + stream.write_all(&[SOCKS5_VERSION, SOCKS5_AUTH_NONE]).await?; + + // --- Request --- + // Client sends: VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT + let mut request_header = [0u8; 4]; + stream.read_exact(&mut request_header).await?; + + if request_header[0] != SOCKS5_VERSION { + return Err(io::Error::new( + io::ErrorKind::InvalidData, + "Invalid SOCKS5 request version", + )); + } + + let cmd = request_header[1]; + let atyp = request_header[3]; + + if cmd != SOCKS5_CMD_CONNECT { + // We only support CONNECT + send_reply(&mut stream, SOCKS5_REP_FAILURE).await?; + return Err(io::Error::new( + io::ErrorKind::Unsupported, + "Only CONNECT supported", + )); + } + + // Parse destination address + let (dest_host, dest_port) = match atyp { + SOCKS5_ATYP_IPV4 => { + let mut addr = [0u8; 4]; + stream.read_exact(&mut addr).await?; + let mut port_buf = [0u8; 2]; + stream.read_exact(&mut port_buf).await?; + let port = u16::from_be_bytes(port_buf); + let host = format!("{}.{}.{}.{}", addr[0], addr[1], addr[2], addr[3]); + (host, port) + } + SOCKS5_ATYP_DOMAIN => { + let mut len_buf = [0u8; 1]; + stream.read_exact(&mut len_buf).await?; + let len = len_buf[0] as usize; + let mut domain = vec![0u8; len]; + stream.read_exact(&mut domain).await?; + let mut port_buf = [0u8; 2]; + stream.read_exact(&mut port_buf).await?; + let port = u16::from_be_bytes(port_buf); + let host = String::from_utf8_lossy(&domain).to_string(); + (host, port) + } + SOCKS5_ATYP_IPV6 => { + let mut addr = [0u8; 16]; + stream.read_exact(&mut addr).await?; + let mut port_buf = [0u8; 2]; + stream.read_exact(&mut port_buf).await?; + let port = u16::from_be_bytes(port_buf); + // Format IPv6 address + let segments: Vec = addr + .chunks(2) + .map(|c| format!("{:02x}{:02x}", c[0], c[1])) + .collect(); + let host = format!("[{}]", segments.join(":")); + (host, port) + } + _ => { + send_reply(&mut stream, SOCKS5_REP_FAILURE).await?; + return Err(io::Error::new( + io::ErrorKind::InvalidData, + "Unsupported address type", + )); + } + }; + + tracing::debug!("SOCKS5 CONNECT from {} to {}:{}", peer_addr, dest_host, dest_port); + + // Connect through Tor + let tor_addr = format!("{}:{}", dest_host, dest_port); + let tor_addr = match tor_addr.as_str().into_tor_addr() { + Ok(a) => a, + Err(e) => { + tracing::debug!("Invalid Tor address: {}", e); + send_reply(&mut stream, SOCKS5_REP_FAILURE).await?; + return Err(io::Error::new( + io::ErrorKind::InvalidInput, + format!("Invalid Tor address: {}", e), + )); + } + }; + + let tor_stream = match client.connect(tor_addr).await { + Ok(s) => s, + Err(e) => { + tracing::debug!("Tor connect failed: {}", e); + send_reply(&mut stream, SOCKS5_REP_CONN_REFUSED).await?; + return Err(io::Error::new( + io::ErrorKind::ConnectionRefused, + e.to_string(), + )); + } + }; + + // Send success reply + // Reply: VER | REP | RSV | ATYP | BND.ADDR | BND.PORT + // We use 0.0.0.0:0 as the bound address since we're proxying + let reply = [ + SOCKS5_VERSION, + SOCKS5_REP_SUCCESS, + 0x00, // RSV + SOCKS5_ATYP_IPV4, + 0, 0, 0, 0, // BND.ADDR + 0, 0, // BND.PORT + ]; + stream.write_all(&reply).await?; + + // Bidirectional copy + let (mut client_read, mut client_write) = stream.into_split(); + let (mut tor_read, mut tor_write) = tor_stream.split(); + + let client_to_tor = async { + tokio::io::copy(&mut client_read, &mut tor_write).await + }; + let tor_to_client = async { + tokio::io::copy(&mut tor_read, &mut client_write).await + }; + + tokio::select! { + result = client_to_tor => { + if let Err(e) = result { + tracing::debug!("Client to Tor copy error: {}", e); + } + } + result = tor_to_client => { + if let Err(e) = result { + tracing::debug!("Tor to client copy error: {}", e); + } + } + } + + Ok(()) +} + +async fn send_reply(stream: &mut TcpStream, rep: u8) -> io::Result<()> { + let reply = [ + SOCKS5_VERSION, + rep, + 0x00, // RSV + SOCKS5_ATYP_IPV4, + 0, 0, 0, 0, // BND.ADDR + 0, 0, // BND.PORT + ]; + stream.write_all(&reply).await +} diff --git a/localPackages/Arti/build-ios.sh b/localPackages/Arti/build-ios.sh new file mode 100755 index 00000000..3b16b52e --- /dev/null +++ b/localPackages/Arti/build-ios.sh @@ -0,0 +1,311 @@ +#!/bin/bash +# +# Build arti-bitchat for iOS/macOS with aggressive size optimization +# +# Output: Frameworks/arti.xcframework containing static libraries for: +# - aarch64-apple-ios (iOS device) +# - aarch64-apple-ios-sim (iOS simulator, Apple Silicon) +# - x86_64-apple-ios (iOS simulator, Intel - optional) +# - aarch64-apple-darwin (macOS) +# +set -e + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +cd "$SCRIPT_DIR" + +# Configuration +CRATE_NAME="arti-bitchat" +LIB_NAME="libarti_bitchat.a" +FRAMEWORK_NAME="arti" +OUTPUT_DIR="$SCRIPT_DIR/Frameworks" + +# Targets to build +TARGETS=( + "aarch64-apple-ios" # iOS device + "aarch64-apple-ios-sim" # iOS simulator (Apple Silicon) + "aarch64-apple-darwin" # macOS +) + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +log_info() { echo -e "${GREEN}[INFO]${NC} $1"; } +log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } +log_error() { echo -e "${RED}[ERROR]${NC} $1"; } + +# Check prerequisites +check_prerequisites() { + log_info "Checking prerequisites..." + + if ! command -v rustc &> /dev/null; then + log_error "Rust is not installed. Please install via rustup." + exit 1 + fi + + if ! command -v cargo &> /dev/null; then + log_error "Cargo is not installed. Please install via rustup." + exit 1 + fi + + # Check/install targets + for target in "${TARGETS[@]}"; do + if ! rustup target list --installed | grep -q "$target"; then + log_info "Installing target: $target" + rustup target add "$target" + fi + done + + # Install cbindgen if needed + if ! command -v cbindgen &> /dev/null; then + log_info "Installing cbindgen..." + cargo install cbindgen + fi + + log_info "Prerequisites OK" +} + +# Set up aggressive size optimization flags and deployment targets +setup_rustflags() { + local target="$1" + + # Base flags for size optimization + export RUSTFLAGS="-C opt-level=z -C lto=fat -C codegen-units=1 -C panic=abort -C strip=symbols" + + # Set deployment targets to suppress linker warnings about version mismatches + case "$target" in + *-apple-ios-sim*) + export IPHONEOS_DEPLOYMENT_TARGET="16.0" + # Simulator uses iPhone SDK but needs the sim target + ;; + *-apple-ios*) + export IPHONEOS_DEPLOYMENT_TARGET="16.0" + ;; + *-apple-darwin*) + export MACOSX_DEPLOYMENT_TARGET="13.0" + ;; + esac + + log_info "RUSTFLAGS: $RUSTFLAGS" + log_info "Deployment target: MACOSX=$MACOSX_DEPLOYMENT_TARGET IPHONEOS=$IPHONEOS_DEPLOYMENT_TARGET" +} + +# Build for a single target +build_target() { + local target="$1" + log_info "Building for target: $target" + + setup_rustflags "$target" + + # Build release + cargo build --release --target "$target" -p "$CRATE_NAME" + + # Check output + local lib_path="target/$target/release/$LIB_NAME" + if [[ -f "$lib_path" ]]; then + local size=$(du -h "$lib_path" | cut -f1) + log_info "Built $lib_path ($size)" + else + log_error "Build failed: $lib_path not found" + exit 1 + fi +} + +# Create xcframework from built libraries +create_xcframework() { + log_info "Creating xcframework..." + + local xcframework_path="$OUTPUT_DIR/$FRAMEWORK_NAME.xcframework" + + # Remove existing xcframework + rm -rf "$xcframework_path" + mkdir -p "$OUTPUT_DIR" + + # Build the xcodebuild command + local cmd="xcodebuild -create-xcframework" + + for target in "${TARGETS[@]}"; do + local lib_path="$SCRIPT_DIR/target/$target/release/$LIB_NAME" + if [[ -f "$lib_path" ]]; then + # Strip the library for additional size reduction + log_info "Stripping $target library..." + strip -x "$lib_path" 2>/dev/null || true + + cmd="$cmd -library $lib_path" + + # Add headers if they exist + local header_dir="$OUTPUT_DIR/include" + if [[ -d "$header_dir" ]]; then + cmd="$cmd -headers $header_dir" + fi + else + log_warn "Skipping missing library: $lib_path" + fi + done + + cmd="$cmd -output $xcframework_path" + + log_info "Running: $cmd" + eval "$cmd" + + if [[ -d "$xcframework_path" ]]; then + local size=$(du -sh "$xcframework_path" | cut -f1) + log_info "Created $xcframework_path ($size)" + else + log_error "Failed to create xcframework" + exit 1 + fi +} + +# Generate C header using cbindgen +generate_header() { + log_info "Generating C header..." + + local header_dir="$OUTPUT_DIR/include" + local header_path="$header_dir/arti.h" + + mkdir -p "$header_dir" + + # Create cbindgen.toml if it doesn't exist + if [[ ! -f "$CRATE_NAME/cbindgen.toml" ]]; then + cat > "$CRATE_NAME/cbindgen.toml" << 'EOF' +language = "C" +include_guard = "ARTI_H" +no_includes = true +sys_includes = ["stdint.h", "stdbool.h"] + +[export] +include = ["arti_start", "arti_stop", "arti_is_running", "arti_bootstrap_progress", "arti_bootstrap_summary", "arti_go_dormant", "arti_wake"] + +[fn] +args = "Auto" + +[parse] +parse_deps = false +EOF + fi + + cbindgen --config "$CRATE_NAME/cbindgen.toml" \ + --crate "$CRATE_NAME" \ + --output "$header_path" + + if [[ -f "$header_path" ]]; then + log_info "Generated $header_path" + cat "$header_path" + else + log_warn "cbindgen did not generate header, creating manually..." + # Fallback: create header manually + cat > "$header_path" << 'EOF' +#ifndef ARTI_H +#define ARTI_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Start Arti with a SOCKS5 proxy. + * + * @param data_dir Path to data directory for Tor state (C string) + * @param socks_port Port for SOCKS5 proxy (e.g., 39050) + * @return 0 on success, negative on error + */ +int32_t arti_start(const char *data_dir, uint16_t socks_port); + +/** + * Stop Arti gracefully. + * + * @return 0 on success, -1 if not running + */ +int32_t arti_stop(void); + +/** + * Check if Arti is currently running. + * + * @return 1 if running, 0 if not running + */ +int32_t arti_is_running(void); + +/** + * Get the current bootstrap progress (0-100). + * + * @return Progress percentage + */ +int32_t arti_bootstrap_progress(void); + +/** + * Get the current bootstrap summary string. + * + * @param buf Buffer to write the summary into + * @param len Length of the buffer + * @return Number of bytes written, -1 on error + */ +int32_t arti_bootstrap_summary(char *buf, int32_t len); + +/** + * Signal Arti to go dormant (reduce resource usage). + * + * @return 0 on success, -1 if not running + */ +int32_t arti_go_dormant(void); + +/** + * Signal Arti to wake from dormant mode. + * + * @return 0 on success, -1 if not running + */ +int32_t arti_wake(void); + +#ifdef __cplusplus +} +#endif + +#endif /* ARTI_H */ +EOF + log_info "Created manual header at $header_path" + fi +} + +# Print size report +print_size_report() { + log_info "=== Size Report ===" + for target in "${TARGETS[@]}"; do + local lib_path="$SCRIPT_DIR/target/$target/release/$LIB_NAME" + if [[ -f "$lib_path" ]]; then + local size=$(du -h "$lib_path" | cut -f1) + echo " $target: $size" + fi + done + + local xcframework_path="$OUTPUT_DIR/$FRAMEWORK_NAME.xcframework" + if [[ -d "$xcframework_path" ]]; then + local total_size=$(du -sh "$xcframework_path" | cut -f1) + echo " xcframework total: $total_size" + fi +} + +# Main +main() { + log_info "Building arti-bitchat for iOS/macOS" + log_info "==================================" + + check_prerequisites + generate_header + + for target in "${TARGETS[@]}"; do + build_target "$target" + done + + create_xcframework + print_size_report + + log_info "Build complete!" + log_info "xcframework: $OUTPUT_DIR/$FRAMEWORK_NAME.xcframework" +} + +# Run +main "$@" diff --git a/localPackages/Tor/Frameworks/BITCHAT_TOR.md b/localPackages/Tor/Frameworks/BITCHAT_TOR.md deleted file mode 100644 index d6eb86d3..00000000 --- a/localPackages/Tor/Frameworks/BITCHAT_TOR.md +++ /dev/null @@ -1,104 +0,0 @@ -**BitChat Tor Build Notes** - -- Date: See repo history for the commit you pulled -- Output: `tor-nolzma.xcframework` (static, C-only) -- Platforms: iOS device (arm64), iOS simulator (arm64), macOS (arm64) -- Goal: Minimize binary size while retaining client functionality - -**Overview** -- We built a minimal Tor static xcframework with LZMA disabled to reduce size and complexity. -- The artifact contains only the C libraries (Tor + libevent + OpenSSL) and their headers. Objective‑C wrappers (`TORThread`, `TORController`, etc.) are not compiled into this minimal artifact to keep size down. -- This xcframework is suitable for iOS and macOS targets that link the Objective‑C wrappers as source (or use CocoaPods to bring them in). - -**Component Versions** -- Tor: 0.4.8.21 -- libevent: 2.1.12 -- OpenSSL: 3.6.0 -- liblzma: not linked (intentionally disabled) - -**Build Environment** -- Xcode with iOS and macOS SDKs -- Homebrew tools: `autoconf`, `automake`, `libtool`, `gettext` -- Install prerequisites from repo root: `brew bundle` - -**Command Used** -- Minimal build (nolzma), size-optimized: `./build-minimal.sh` - - Build script located at: `~/Documents/vibe/Tor.framework-build/build-minimal.sh` - - Uses iCepa/Tor.framework as base, with custom size optimizations - - Outputs to: `~/Documents/vibe/Tor.framework-build/tor-nolzma.xcframework` - -**What Minimal Mode Does** -- Targets: `iphoneos/arm64`, `iphonesimulator/arm64`, `macosx/arm64`. -- Disables LZMA in Tor (`--enable-lzma=no`) and removes zstd. -- Aggressive OpenSSL trimming (removes ~3MB per slice): - - Protocol: `no-ssl3 no-tls1 no-tls1_1 no-dtls` - - Legacy ciphers: `no-des no-rc2 no-rc4 no-rc5 no-idea no-seed no-camellia no-aria no-bf no-cast` - - Unused hashes: `no-md4 no-mdc2 no-whirlpool no-rmd160` - - Post-quantum: `no-ml-dsa no-ml-kem no-slh-dsa no-lms` - - Chinese standards: `no-sm2 no-sm3 no-sm4` - - Certificate features: `no-cms no-ts no-cmp no-ct no-rfc3779` - - Other: `no-gost no-ec2m no-siphash no-scrypt no-legacy no-dso no-dgram no-http` - - See build script for full list -- Tor client-only: `--disable-module-relay --disable-module-dirauth --disable-module-pow` -- Compiles with size-first flags: `-Os -ffunction-sections -fdata-sections`; bitcode is not embedded. -- Statically links Tor, libevent, and OpenSSL into a single library per slice inside the framework. -- Copies public headers from Tor/libevent/OpenSSL into the framework `Headers` directory. - -**Resulting Slices (approx sizes)** -- Folder size: ~67 MB (`tor-nolzma.xcframework`) -- Binaries (non-fat, measured on this build): - - iOS arm64 (device): ~14 MB - - iOS arm64 (simulator): ~13.8 MB - - macOS arm64: ~13.8 MB - -Note: Sizes vary slightly by Xcode/SDK versions and environment. - -**Integrating in BitChat** -- Add `tor-nolzma.xcframework` to your app target(s). Xcode will select the correct slice for device/simulator/macOS. -- Link `libz.tbd` (Tor depends on zlib). -- Keep app link-time stripping enabled for best results: - - Other Linker Flags: add `-dead_strip` - - Avoid `-ObjC` if possible (prevents dead stripping) - - Consider enabling ThinLTO/LTO in the app for further size gains -- Objective‑C API (wrappers): - - Not included in this minimal xcframework. Use one of: - - CocoaPods: `Tor/CTor-NoLZMA` subspec (brings `TORThread`, `TORController` sources + links the xcframework), or - - Vendor the ObjC sources from `Tor/Classes/CTor` and `Tor/Classes/Core` directly into your project. - -**Rebuilding** -- Ensure prerequisites: `brew install automake autoconf libtool gettext` -- Clone iCepa/Tor.framework to `~/Documents/vibe/Tor.framework-build/` -- Run: `cd ~/Documents/vibe/Tor.framework-build && ./build-minimal.sh` -- Logs: `build/*.log` and per-component logs like `build/libtor-nolzma--.log` -- Copy output to project: `cp -R tor-nolzma.xcframework /path/to/bitchat/localPackages/Tor/Frameworks/` - -**LZMA Trade‑off (for reference)** -- We measured that enabling LZMA adds roughly ~0.25 MB per slice to the binary on this setup. For a 3‑slice xcframework, expect ~0.7–0.8 MB more overall. -- If you want the LZMA variant with the same minimal trimming: `./build-xcframework.sh -Md` (outputs `tor.xcframework`). - -**Key Flags (for auditing)** -- OpenSSL `./Configure` (aggressive trimming): - - `no-shared no-zlib no-comp no-ssl3 no-tls1 no-tls1_1 no-dtls` - - `no-srp no-psk no-weak-ssl-ciphers no-engine no-ocsp no-cms no-ts` - - `no-idea no-seed no-camellia no-aria no-bf no-cast no-des no-rc2 no-rc4` - - `no-md4 no-mdc2 no-whirlpool no-rmd160 no-sm2 no-sm3 no-sm4` - - `no-siphash no-scrypt no-legacy no-dso no-dgram no-http` -- libevent `./configure`: `--disable-openssl --disable-samples --disable-libevent-regress --enable-static --disable-shared` -- Tor `./configure` (highlights): - - `--enable-pic --disable-module-relay --disable-module-dirauth --disable-module-pow --disable-unittests` - - `--enable-static-openssl --enable-static-libevent` - - `--disable-asciidoc --disable-manpage --disable-html-manual --disable-zstd` - - `--enable-lzma=no` (in this build) -- Compiler flags: `-Os -ffunction-sections -fdata-sections`; no bitcode -- Linker flags: `-Wl,-dead_strip` -- Minimum OS: iOS 12.0, macOS 10.13 - -**Verification Tips** -- Check slices: `lipo -info tor-nolzma.xcframework/*/tor-nolzma.framework/tor-nolzma` -- Ensure headers present: `ls tor-nolzma.xcframework/*/tor-nolzma.framework/Headers` -- Link test: build a small app and add `-dead_strip`; confirm successful run and circuit establishment via control port. - -**Notes** -- This minimal build avoids bundling large GeoIP resources. If you need GeoIP, embed the GeoIP bundle (or use the `Tor/GeoIP-NoLZMA` subspec) and set `TORConfiguration.geoipFile`/`geoip6File`. -- Static linking maximizes the app’s ability to dead‑strip unused code across the boundary. - diff --git a/localPackages/Tor/Frameworks/build-minimal.sh b/localPackages/Tor/Frameworks/build-minimal.sh deleted file mode 100755 index f19a2ac3..00000000 --- a/localPackages/Tor/Frameworks/build-minimal.sh +++ /dev/null @@ -1,404 +0,0 @@ -#!/bin/sh -# Minimal size-optimized build script for BitChat -# Builds arm64-only tor-nolzma.xcframework with aggressive size optimization - -set -e - -PATH=$PATH:/usr/local/bin:/usr/local/opt/gettext/bin:/usr/local/opt/automake/bin:/usr/local/opt/aclocal/bin:/opt/homebrew/bin:/opt/homebrew/opt/libtool/libexec/gnubin - -OPENSSL_VERSION="openssl-3.6.0" -LIBEVENT_VERSION="release-2.1.12-stable" -TOR_VERSION="tor-0.4.8.21" - -cd "$(dirname "$0")" -ROOT="$(pwd -P)" - -BUILDDIR="$ROOT/build" -mkdir -p "$BUILDDIR" - -echo "Build dir: $BUILDDIR" -echo "Building minimal tor-nolzma.xcframework (arm64-only, size-optimized)" -echo "" - -# Size optimization flags -# Note: LTO (-flto=thin) disabled because it produces bitcode that xcodebuild can't read -# LTO would need to be applied at app link stage, not library build -SIZE_CFLAGS="-Os -ffunction-sections -fdata-sections" - -build_libssl() { - SDK=$1 - ARCH=$2 - MIN=$3 - - SOURCE="$BUILDDIR/openssl" - LOG="$BUILDDIR/libssl-$SDK-$ARCH.log" - - if [ ! -d "$SOURCE" ]; then - echo "- Check out OpenSSL project" - cd "$BUILDDIR" - git clone --recursive --shallow-submodules --depth 1 --branch "$OPENSSL_VERSION" https://github.com/openssl/openssl.git >> "$LOG" 2>&1 - fi - - echo "- Build OpenSSL for $ARCH ($SDK) [size-optimized]" - - cd "$SOURCE" - make distclean >> "$LOG" 2>&1 || true - - if [ "$SDK" = "iphoneos" ]; then - PLATFORM_FLAGS="no-async zlib-dynamic enable-ec_nistp_64_gcc_128" - CONFIG="ios64-xcrun" - elif [ "$SDK" = "iphonesimulator" ]; then - PLATFORM_FLAGS="no-async zlib-dynamic enable-ec_nistp_64_gcc_128" - CONFIG="iossimulator-xcrun" - elif [ "$SDK" = "macosx" ]; then - PLATFORM_FLAGS="no-asm enable-ec_nistp_64_gcc_128" - CONFIG="darwin64-arm64-cc" - fi - - # Tier 2: Aggressive OpenSSL trimming - remove unused ciphers, hashes, and features - ./Configure \ - no-shared \ - no-zlib \ - no-comp \ - no-ssl3 \ - no-tls1 \ - no-tls1_1 \ - no-dtls \ - no-srp \ - no-psk \ - no-weak-ssl-ciphers \ - no-engine \ - no-ocsp \ - no-cms \ - no-ts \ - no-idea \ - no-seed \ - no-camellia \ - no-aria \ - no-bf \ - no-cast \ - no-des \ - no-rc2 \ - no-rc4 \ - no-md4 \ - no-mdc2 \ - no-whirlpool \ - no-rmd160 \ - no-sm2 \ - no-sm3 \ - no-sm4 \ - no-siphash \ - no-scrypt \ - no-legacy \ - no-dso \ - no-dgram \ - no-http \ - no-ml-dsa \ - no-ml-kem \ - no-slh-dsa \ - no-lms \ - no-cmp \ - no-ct \ - no-gost \ - no-rfc3779 \ - no-ec2m \ - no-rc5 \ - ${PLATFORM_FLAGS} \ - --prefix="$BUILDDIR/$SDK/libssl-$ARCH" \ - ${CONFIG} \ - CC="$(xcrun --sdk $SDK --find clang) -isysroot $(xcrun --sdk $SDK --show-sdk-path) -arch ${ARCH} -m$SDK-version-min=$MIN $SIZE_CFLAGS" \ - >> "$LOG" 2>&1 - - make depend >> "$LOG" 2>&1 - make "-j$(sysctl -n hw.logicalcpu_max)" build_libs >> "$LOG" 2>&1 - make install_dev >> "$LOG" 2>&1 -} - -build_libevent() { - SDK=$1 - ARCH=$2 - MIN=$3 - - SOURCE="$BUILDDIR/libevent" - LOG="$BUILDDIR/libevent-$SDK-$ARCH.log" - - if [ ! -d "$SOURCE" ]; then - echo "- Check out libevent project" - cd "$BUILDDIR" - git clone --recursive --shallow-submodules --depth 1 --branch "$LIBEVENT_VERSION" https://github.com/libevent/libevent.git >> "$LOG" 2>&1 - fi - - echo "- Build libevent for $ARCH ($SDK) [size-optimized]" - - cd "$SOURCE" - make distclean 2>/dev/null 1>/dev/null || true - - if [ ! -f ./configure ]; then - ./autogen.sh >> "$LOG" 2>&1 - fi - - CLANG="$(xcrun -f --sdk ${SDK} clang)" - SDKPATH="$(xcrun --sdk ${SDK} --show-sdk-path)" - DEST="$BUILDDIR/$SDK/libevent-$ARCH" - - ./configure \ - --disable-shared \ - --disable-openssl \ - --disable-libevent-regress \ - --disable-samples \ - --disable-doxygen-html \ - --enable-static \ - --disable-debug-mode \ - --prefix="$DEST" \ - CC="$CLANG -arch ${ARCH}" \ - CPP="$CLANG -E -arch ${ARCH}" \ - CFLAGS="-isysroot ${SDKPATH} -m$SDK-version-min=$MIN $SIZE_CFLAGS" \ - LDFLAGS="-isysroot ${SDKPATH} -L$DEST" \ - cross_compiling="yes" \ - ac_cv_func_clock_gettime="no" \ - >> "$LOG" 2>&1 - - make -j$(sysctl -n hw.logicalcpu_max) >> "$LOG" 2>&1 - make install >> "$LOG" 2>&1 -} - -build_libtor_nolzma() { - SDK=$1 - ARCH=$2 - MIN=$3 - - SOURCE="$BUILDDIR/tor" - LOG="$BUILDDIR/libtor-nolzma-$SDK-$ARCH.log" - DEST="$BUILDDIR/$SDK/libtor-nolzma-$ARCH" - - if [ ! -d "$SOURCE" ]; then - echo "- Check out Tor project" - cd "$BUILDDIR" - git clone --recursive --shallow-submodules --depth 1 --branch "$TOR_VERSION" https://gitlab.torproject.org/tpo/core/tor.git >> "$LOG" 2>&1 - fi - - echo "- Build libtor-nolzma for $ARCH ($SDK) [size-optimized, client-only]" - - cd "$SOURCE" - make distclean 2>/dev/null 1>/dev/null || true - - # Apply patch if exists - if [ -f "$ROOT/Tor/mmap-cache.patch" ]; then - git checkout . 2>/dev/null || true - git apply --quiet "$ROOT/Tor/mmap-cache.patch" 2>/dev/null || true - fi - - if [ ! -f ./configure ]; then - sed -i'.backup' -e 's/all,error/no-obsolete,error/' autogen.sh - ./autogen.sh >> "$LOG" 2>&1 - rm autogen.sh && mv autogen.sh.backup autogen.sh - fi - - CLANG="$(xcrun -f --sdk ${SDK} clang)" - SDKPATH="$(xcrun --sdk ${SDK} --show-sdk-path)" - - # Tier 1 + 2: Client-only, minimal Tor build with aggressive size optimization - ./configure \ - --enable-silent-rules \ - --enable-pic \ - --disable-module-relay \ - --disable-module-dirauth \ - --disable-module-pow \ - --disable-tool-name-check \ - --disable-unittests \ - --enable-static-openssl \ - --enable-static-libevent \ - --disable-asciidoc \ - --disable-system-torrc \ - --disable-linker-hardening \ - --disable-dependency-tracking \ - --disable-manpage \ - --disable-html-manual \ - --disable-gcc-warnings-advisory \ - --enable-lzma=no \ - --disable-zstd \ - --with-libevent-dir="$BUILDDIR/$SDK/libevent-$ARCH" \ - --with-openssl-dir="$BUILDDIR/$SDK/libssl-$ARCH" \ - --prefix="$DEST" \ - CC="$CLANG -arch ${ARCH} -isysroot ${SDKPATH}" \ - CPP="$CLANG -E -arch ${ARCH} -isysroot ${SDKPATH}" \ - CFLAGS="$SIZE_CFLAGS -m$SDK-version-min=$MIN" \ - CPPFLAGS="-Isrc/core -I$BUILDDIR/$SDK/libssl-$ARCH/include -I$BUILDDIR/$SDK/libevent-$ARCH/include -m$SDK-version-min=$MIN" \ - LDFLAGS="-lz -Wl,-dead_strip" \ - cross_compiling="yes" \ - ac_cv_func__NSGetEnviron="no" \ - ac_cv_func_clock_gettime="no" \ - ac_cv_func_getentropy="no" \ - >> "$LOG" 2>&1 - - sleep 2 - rm -f src/lib/cc/orconfig.h >> "$LOG" 2>&1 - cp orconfig.h "src/lib/cc/" >> "$LOG" 2>&1 - - make libtor.a -j$(sysctl -n hw.logicalcpu_max) V=1 >> "$LOG" 2>&1 - - mkdir -p "$DEST/lib" >> "$LOG" 2>&1 - mkdir -p "$DEST/include" >> "$LOG" 2>&1 - mv libtor.a "$DEST/lib" >> "$LOG" 2>&1 - rsync --archive --include='*.h' -f 'hide,! */' --prune-empty-dirs src/* "$DEST/include" >> "$LOG" 2>&1 - cp orconfig.h "$DEST/include/" >> "$LOG" 2>&1 - mv micro-revision.i "$DEST" >> "$LOG" 2>&1 -} - -create_framework_nolzma() { - SDK=$1 - - LOG="$BUILDDIR/framework.log" - NAME="tor-nolzma" - - rm -rf "$BUILDDIR/$SDK/$NAME.framework" >> "$LOG" 2>&1 - - echo "- Create framework for $SDK (arm64-only)" - - LIBS=("$BUILDDIR/$SDK/libssl-arm64/lib/libssl.a" \ - "$BUILDDIR/$SDK/libssl-arm64/lib/libcrypto.a" \ - "$BUILDDIR/$SDK/libevent-arm64/lib/libevent.a" \ - "$BUILDDIR/$SDK/libtor-nolzma-arm64/lib/libtor.a") - - HEADERS=("$BUILDDIR/$SDK/libssl-arm64/include"/* \ - "$BUILDDIR/$SDK/libevent-arm64/include"/* \ - "$BUILDDIR/$SDK/libtor-nolzma-arm64/include"/*) - - if [ "$SDK" = "macosx" ]; then - # macOS frameworks need versioned bundle structure - mkdir -p "$BUILDDIR/$SDK/$NAME.framework/Versions/A/Headers" >> "$LOG" 2>&1 - mkdir -p "$BUILDDIR/$SDK/$NAME.framework/Versions/A/Resources" >> "$LOG" 2>&1 - - libtool -static -o "$BUILDDIR/$SDK/$NAME.framework/Versions/A/$NAME" "${LIBS[@]}" >> "$LOG" 2>&1 - cp -r "${HEADERS[@]}" "$BUILDDIR/$SDK/$NAME.framework/Versions/A/Headers" >> "$LOG" 2>&1 - - # Create symlinks - cd "$BUILDDIR/$SDK/$NAME.framework" - ln -s A Versions/Current - ln -s Versions/Current/Headers Headers - ln -s Versions/Current/Resources Resources - ln -s Versions/Current/$NAME $NAME - - # Create Info.plist for macOS - cat > Versions/A/Resources/Info.plist << 'PLIST' - - - - - CFBundleExecutable - tor-nolzma - CFBundleIdentifier - org.torproject.tor-nolzma - CFBundleName - tor-nolzma - CFBundlePackageType - FMWK - CFBundleShortVersionString - 0.4.8.21 - CFBundleVersion - 408.21 - MinimumOSVersion - 10.13 - - -PLIST - cd "$ROOT" - else - # iOS frameworks are flat - mkdir -p "$BUILDDIR/$SDK/$NAME.framework/Headers" >> "$LOG" 2>&1 - libtool -static -o "$BUILDDIR/$SDK/$NAME.framework/$NAME" "${LIBS[@]}" >> "$LOG" 2>&1 - cp -r "${HEADERS[@]}" "$BUILDDIR/$SDK/$NAME.framework/Headers" >> "$LOG" 2>&1 - - # Determine min OS version for Info.plist - if [ "$SDK" = "iphoneos" ] || [ "$SDK" = "iphonesimulator" ]; then - MIN_OS="12.0" - else - MIN_OS="10.13" - fi - - # Create Info.plist for iOS - cat > "$BUILDDIR/$SDK/$NAME.framework/Info.plist" << PLIST - - - - - CFBundleExecutable - tor-nolzma - CFBundleIdentifier - org.torproject.tor-nolzma - CFBundleName - tor-nolzma - CFBundlePackageType - FMWK - CFBundleShortVersionString - 0.4.8.21 - CFBundleVersion - 408.21 - MinimumOSVersion - $MIN_OS - - -PLIST - fi -} - -create_xcframework_nolzma() { - LOG="$BUILDDIR/framework.log" - NAME="tor-nolzma" - - echo "- Create xcframework for $NAME (arm64-only)" - - rm -rf "$ROOT/$NAME.xcframework" "$ROOT/$NAME.xcframework.zip" >> "$LOG" 2>&1 - - xcodebuild -create-xcframework \ - -framework "$BUILDDIR/iphoneos/$NAME.framework" \ - -framework "$BUILDDIR/iphonesimulator/$NAME.framework" \ - -framework "$BUILDDIR/macosx/$NAME.framework" \ - -output "$ROOT/$NAME.xcframework" >> "$LOG" 2>&1 - - echo "" - echo "=== Build Complete ===" - echo "Output: $ROOT/$NAME.xcframework" - echo "" - - # Show sizes - echo "Binary sizes:" - ls -lh "$ROOT/$NAME.xcframework/ios-arm64/$NAME.framework/$NAME" 2>/dev/null || true - ls -lh "$ROOT/$NAME.xcframework/ios-arm64-simulator/$NAME.framework/$NAME" 2>/dev/null || true - ls -lh "$ROOT/$NAME.xcframework/macos-arm64/$NAME.framework/$NAME" 2>/dev/null || true - - echo "" - du -sh "$ROOT/$NAME.xcframework" -} - -# Build for iOS device (arm64) -echo "=== Building for iOS device (arm64) ===" -build_libssl iphoneos arm64 12.0 -build_libevent iphoneos arm64 12.0 -build_libtor_nolzma iphoneos arm64 12.0 -create_framework_nolzma iphoneos - -# Build for iOS simulator (arm64 only - no Intel) -echo "" -echo "=== Building for iOS simulator (arm64) ===" -build_libssl iphonesimulator arm64 12.0 -build_libevent iphonesimulator arm64 12.0 -build_libtor_nolzma iphonesimulator arm64 12.0 -create_framework_nolzma iphonesimulator - -# Build for macOS (arm64 only - no Intel) -echo "" -echo "=== Building for macOS (arm64) ===" -build_libssl macosx arm64 10.13 -build_libevent macosx arm64 10.13 -build_libtor_nolzma macosx arm64 10.13 -create_framework_nolzma macosx - -# Create xcframework -echo "" -echo "=== Creating XCFramework ===" -create_xcframework_nolzma - -echo "" -echo "Done! To verify:" -echo " lipo -info $ROOT/tor-nolzma.xcframework/*/tor-nolzma.framework/tor-nolzma" diff --git a/localPackages/Tor/Frameworks/tor-nolzma.xcframework/ios-arm64-simulator/tor-nolzma.framework/Headers/app/config/config.h b/localPackages/Tor/Frameworks/tor-nolzma.xcframework/ios-arm64-simulator/tor-nolzma.framework/Headers/app/config/config.h deleted file mode 100644 index de198e20..00000000 --- a/localPackages/Tor/Frameworks/tor-nolzma.xcframework/ios-arm64-simulator/tor-nolzma.framework/Headers/app/config/config.h +++ /dev/null @@ -1,324 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2021, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file config.h - * \brief Header file for config.c. - **/ - -#ifndef TOR_CONFIG_H -#define TOR_CONFIG_H - -#include "app/config/or_options_st.h" -#include "lib/testsupport/testsupport.h" -#include "app/config/quiet_level.h" - -#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(DARWIN) -#define KERNEL_MAY_SUPPORT_IPFW -#endif - -/** Lowest allowable value for HeartbeatPeriod; if this is too low, we might - * expose more information than we're comfortable with. */ -#define MIN_HEARTBEAT_PERIOD (30*60) - -/** Maximum default value for MaxMemInQueues, in bytes. */ -#if SIZEOF_VOID_P >= 8 -#define MAX_DEFAULT_MEMORY_QUEUE_SIZE (UINT64_C(8) << 30) -#else -#define MAX_DEFAULT_MEMORY_QUEUE_SIZE (UINT64_C(2) << 30) -#endif - -MOCK_DECL(const or_options_t *, get_options, (void)); -MOCK_DECL(or_options_t *, get_options_mutable, (void)); -int set_options(or_options_t *new_val, char **msg); -void config_free_all(void); -const char *safe_str_client(const char *address); -const char *safe_str(const char *address); -const char *escaped_safe_str_client(const char *address); -const char *escaped_safe_str(const char *address); -void init_protocol_warning_severity_level(void); -int get_protocol_warning_severity_level(void); - -#define LOG_PROTOCOL_WARN (get_protocol_warning_severity_level()) - -/** Pattern for backing up configuration files */ -#define CONFIG_BACKUP_PATTERN "%s.orig.1" - -/** An error from options_trial_assign() or options_init_from_string(). */ -typedef enum setopt_err_t { - SETOPT_OK = 0, - SETOPT_ERR_MISC = -1, - SETOPT_ERR_PARSE = -2, - SETOPT_ERR_TRANSITION = -3, - SETOPT_ERR_SETTING = -4, -} setopt_err_t; -setopt_err_t options_trial_assign(struct config_line_t *list, unsigned flags, - char **msg); - -void options_init(or_options_t *options); - -#define OPTIONS_DUMP_MINIMAL 1 -#define OPTIONS_DUMP_ALL 2 -char *options_dump(const or_options_t *options, int how_to_dump); -int options_init_from_torrc(int argc, char **argv); -setopt_err_t options_init_from_string(const char *cf_defaults, const char *cf, - int command, const char *command_arg, char **msg); -int option_is_recognized(const char *key); -const char *option_get_canonical_name(const char *key); -struct config_line_t *option_get_assignment(const or_options_t *options, - const char *key); -int options_save_current(void); -const char *get_torrc_fname(int defaults_fname); -typedef enum { - DIRROOT_DATADIR, - DIRROOT_CACHEDIR, - DIRROOT_KEYDIR -} directory_root_t; - -MOCK_DECL(char *, - options_get_dir_fname2_suffix, - (const or_options_t *options, - directory_root_t roottype, - const char *sub1, const char *sub2, - const char *suffix)); - -/* These macros wrap options_get_dir_fname2_suffix to provide a more - * convenient API for finding filenames that Tor uses inside its storage - * They are named according to a pattern: - * (options_)?get_(cache|key|data)dir_fname(2)?(_suffix)? - * - * Macros that begin with options_ take an options argument; the others - * work with respect to the global options. - * - * Each macro works relative to the data directory, the key directory, - * or the cache directory, as determined by which one is mentioned. - * - * Macro variants with "2" in their name take two path components; others - * take one. - * - * Macro variants with "_suffix" at the end take an additional suffix - * that gets appended to the end of the file - */ -#define options_get_datadir_fname2_suffix(options, sub1, sub2, suffix) \ - options_get_dir_fname2_suffix((options), DIRROOT_DATADIR, \ - (sub1), (sub2), (suffix)) -#define options_get_cachedir_fname2_suffix(options, sub1, sub2, suffix) \ - options_get_dir_fname2_suffix((options), DIRROOT_CACHEDIR, \ - (sub1), (sub2), (suffix)) -#define options_get_keydir_fname2_suffix(options, sub1, sub2, suffix) \ - options_get_dir_fname2_suffix((options), DIRROOT_KEYDIR, \ - (sub1), (sub2), (suffix)) - -#define options_get_datadir_fname(opts,sub1) \ - options_get_datadir_fname2_suffix((opts),(sub1), NULL, NULL) -#define options_get_datadir_fname2(opts,sub1,sub2) \ - options_get_datadir_fname2_suffix((opts),(sub1), (sub2), NULL) - -#define get_datadir_fname2_suffix(sub1, sub2, suffix) \ - options_get_datadir_fname2_suffix(get_options(), (sub1), (sub2), (suffix)) -#define get_datadir_fname(sub1) \ - get_datadir_fname2_suffix((sub1), NULL, NULL) -#define get_datadir_fname2(sub1,sub2) \ - get_datadir_fname2_suffix((sub1), (sub2), NULL) -#define get_datadir_fname_suffix(sub1, suffix) \ - get_datadir_fname2_suffix((sub1), NULL, (suffix)) - -/** DOCDOC */ -#define options_get_keydir_fname(options, sub1) \ - options_get_keydir_fname2_suffix((options), (sub1), NULL, NULL) -#define get_keydir_fname_suffix(sub1, suffix) \ - options_get_keydir_fname2_suffix(get_options(), (sub1), NULL, suffix) -#define get_keydir_fname(sub1) \ - options_get_keydir_fname2_suffix(get_options(), (sub1), NULL, NULL) - -#define get_cachedir_fname(sub1) \ - options_get_cachedir_fname2_suffix(get_options(), (sub1), NULL, NULL) -#define get_cachedir_fname_suffix(sub1, suffix) \ - options_get_cachedir_fname2_suffix(get_options(), (sub1), NULL, (suffix)) - -#define safe_str_client(address) \ - safe_str_client_opts(NULL, address) -#define safe_str(address) \ - safe_str_opts(NULL, address) - -const char * safe_str_client_opts(const or_options_t *options, - const char *address); -const char * safe_str_opts(const or_options_t *options, - const char *address); - -int using_default_dir_authorities(const or_options_t *options); - -int create_keys_directory(const or_options_t *options); - -int check_or_create_data_subdir(const char *subdir); -int write_to_data_subdir(const char* subdir, const char* fname, - const char* str, const char* descr); - -int get_num_cpus(const or_options_t *options); - -MOCK_DECL(const smartlist_t *,get_configured_ports,(void)); -int port_binds_ipv4(const port_cfg_t *port); -int port_binds_ipv6(const port_cfg_t *port); -int portconf_get_first_advertised_port(int listener_type, - int address_family); -#define portconf_get_primary_dir_port() \ - (portconf_get_first_advertised_port(CONN_TYPE_DIR_LISTENER, AF_INET)) -const tor_addr_t *portconf_get_first_advertised_addr(int listener_type, - int address_family); -int port_exists_by_type_addr_port(int listener_type, const tor_addr_t *addr, - int port, int check_wildcard); -int port_exists_by_type_addr32h_port(int listener_type, uint32_t addr_ipv4h, - int port, int check_wildcard); - -char *get_first_listener_addrport_string(int listener_type); - -int options_need_geoip_info(const or_options_t *options, - const char **reason_out); - -int getinfo_helper_config(control_connection_t *conn, - const char *question, char **answer, - const char **errmsg); - -int init_cookie_authentication(const char *fname, const char *header, - int cookie_len, int group_readable, - uint8_t **cookie_out, int *cookie_is_set_out); - -or_options_t *options_new(void); - -/** Options settings parsed from the command-line. */ -typedef struct { - /** List of options that can only be set from the command-line */ - struct config_line_t *cmdline_opts; - /** List of other options, to be handled by the general Tor configuration - system. */ - struct config_line_t *other_opts; - /** Subcommand that Tor has been told to run */ - tor_cmdline_mode_t command; - /** Argument for the command mode, if any. */ - const char *command_arg; - /** How quiet have we been told to be? */ - quiet_level_t quiet_level; -} parsed_cmdline_t; - -parsed_cmdline_t *config_parse_commandline(int argc, char **argv, - int ignore_errors); -void parsed_cmdline_free_(parsed_cmdline_t *cmdline); -#define parsed_cmdline_free(c) \ - FREE_AND_NULL(parsed_cmdline_t, parsed_cmdline_free_, (c)) - -void config_register_addressmaps(const or_options_t *options); -/* XXXX move to connection_edge.h */ -int addressmap_register_auto(const char *from, const char *to, - time_t expires, - addressmap_entry_source_t addrmap_source, - const char **msg); - -int port_cfg_line_extract_addrport(const char *line, - char **addrport_out, - int *is_unix_out, - const char **rest_out); - -/** Represents the information stored in a torrc Bridge line. */ -typedef struct bridge_line_t { - tor_addr_t addr; /* The IP address of the bridge. */ - uint16_t port; /* The TCP port of the bridge. */ - char *transport_name; /* The name of the pluggable transport that - should be used to connect to the bridge. */ - char digest[DIGEST_LEN]; /* The bridge's identity key digest. */ - smartlist_t *socks_args; /* SOCKS arguments for the pluggable - transport proxy. */ -} bridge_line_t; - -void bridge_line_free_(bridge_line_t *bridge_line); -#define bridge_line_free(line) \ - FREE_AND_NULL(bridge_line_t, bridge_line_free_, (line)) -bridge_line_t *parse_bridge_line(const char *line); - -/* Port helper functions. */ -int options_any_client_port_set(const or_options_t *options); -int port_parse_config(smartlist_t *out, - const struct config_line_t *ports, - const char *portname, - int listener_type, - const char *defaultaddr, - int defaultport, - const unsigned flags); - -#define CL_PORT_NO_STREAM_OPTIONS (1u<<0) -#define CL_PORT_WARN_NONLOCAL (1u<<1) -/* Was CL_PORT_ALLOW_EXTRA_LISTENADDR (1u<<2) */ -#define CL_PORT_SERVER_OPTIONS (1u<<3) -#define CL_PORT_FORBID_NONLOCAL (1u<<4) -#define CL_PORT_TAKES_HOSTNAMES (1u<<5) -#define CL_PORT_IS_UNIXSOCKET (1u<<6) -#define CL_PORT_DFLT_GROUP_WRITABLE (1u<<7) - -port_cfg_t *port_cfg_new(size_t namelen); -#define port_cfg_free(port) \ - FREE_AND_NULL(port_cfg_t, port_cfg_free_, (port)) -void port_cfg_free_(port_cfg_t *port); - -int port_count_real_listeners(const smartlist_t *ports, - int listenertype, - int count_sockets); -int pt_parse_transport_line(const or_options_t *options, - const char *line, int validate_only, - int server); -int config_ensure_bandwidth_cap(uint64_t *value, const char *desc, char **msg); - -#ifdef CONFIG_PRIVATE - -MOCK_DECL(STATIC int, options_act,(const or_options_t *old_options)); -MOCK_DECL(STATIC int, options_act_reversible,(const or_options_t *old_options, - char **msg)); -struct config_mgr_t; -STATIC const struct config_mgr_t *get_options_mgr(void); - -#define or_options_free(opt) \ - FREE_AND_NULL(or_options_t, or_options_free_, (opt)) -STATIC void or_options_free_(or_options_t *options); -STATIC int options_validate_single_onion(or_options_t *options, - char **msg); -STATIC int parse_tcp_proxy_line(const char *line, or_options_t *options, - char **msg); -STATIC int consider_adding_dir_servers(const or_options_t *options, - const or_options_t *old_options); -STATIC void add_default_trusted_dir_authorities(dirinfo_type_t type); -MOCK_DECL(STATIC void, add_default_fallback_dir_servers, (void)); -STATIC int parse_dir_authority_line(const char *line, - dirinfo_type_t required_type, - int validate_only); -STATIC int parse_dir_fallback_line(const char *line, int validate_only); - -STATIC uint64_t compute_real_max_mem_in_queues(const uint64_t val, - bool is_server); -STATIC int open_and_add_file_log(const log_severity_list_t *severity, - const char *fname, - int truncate_log); -STATIC int options_init_logs(const or_options_t *old_options, - const or_options_t *options, int validate_only); - -STATIC int options_create_directories(char **msg_out); -struct log_transaction_t; -STATIC struct log_transaction_t *options_start_log_transaction( - const or_options_t *old_options, - char **msg_out); -STATIC void options_commit_log_transaction(struct log_transaction_t *xn); -STATIC void options_rollback_log_transaction(struct log_transaction_t *xn); - -#ifdef TOR_UNIT_TESTS -int options_validate(const or_options_t *old_options, - or_options_t *options, - char **msg); -#endif - -STATIC int parse_ports(or_options_t *options, int validate_only, - char **msg, int *n_ports_out, - int *world_writable_control_socket); - -#endif /* defined(CONFIG_PRIVATE) */ - -#endif /* !defined(TOR_CONFIG_H) */ diff --git a/localPackages/Tor/Frameworks/tor-nolzma.xcframework/ios-arm64-simulator/tor-nolzma.framework/Headers/app/config/or_options_st.h b/localPackages/Tor/Frameworks/tor-nolzma.xcframework/ios-arm64-simulator/tor-nolzma.framework/Headers/app/config/or_options_st.h deleted file mode 100644 index 789f2f2a..00000000 --- a/localPackages/Tor/Frameworks/tor-nolzma.xcframework/ios-arm64-simulator/tor-nolzma.framework/Headers/app/config/or_options_st.h +++ /dev/null @@ -1,1111 +0,0 @@ -/* Copyright (c) 2001 Matej Pfajfar. - * Copyright (c) 2001-2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2021, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file or_options_st.h - * - * \brief The or_options_t structure, which represents Tor's configuration. - */ - -#ifndef TOR_OR_OPTIONS_ST_H -#define TOR_OR_OPTIONS_ST_H - -#include "core/or/or.h" -#include "lib/cc/torint.h" -#include "lib/net/address.h" -#include "app/config/tor_cmdline_mode.h" - -struct smartlist_t; -struct config_line_t; -struct config_suite_t; -struct routerset_t; - -/** Enumeration of outbound address configuration types: - * Exit-only, OR-only, PT-only, or any of them */ -typedef enum { - /** Outbound IP address for Exit connections. Controlled by the - * `OutboundBindAddressExit` configuration entry in torrc. */ - OUTBOUND_ADDR_EXIT, - - /** Outbound IP address for OR connections. Controlled by the - * `OutboundBindAddressOR` configuration entry in torrc. */ - OUTBOUND_ADDR_OR, - - /** Outbound IP address for PT connections. Controlled by the - * `OutboundBindAddressPT` configuration entry in torrc. */ - OUTBOUND_ADDR_PT, - - /** Outbound IP address for any outgoing connections. Controlled by the - * OutboundBindAddress configuration entry in torrc. This value is used as - * fallback if the more specific OUTBOUND_ADDR_EXIT, OUTBOUND_ADDR_OR, and - * OUTBOUND_ADDR_PT are unset. */ - OUTBOUND_ADDR_ANY, - - /** Max value for this enum. Must be the last element in this enum. */ - OUTBOUND_ADDR_MAX -} outbound_addr_t; - -/** Which protocol to use for TCPProxy. */ -typedef enum { - /** Use the HAProxy proxy protocol. */ - TCP_PROXY_PROTOCOL_HAPROXY -} tcp_proxy_protocol_t; - -/** Enumeration of available time formats for output of --key-expiration */ -typedef enum { - KEY_EXPIRATION_FORMAT_ISO8601 = 0, - KEY_EXPIRATION_FORMAT_TIMESTAMP -} key_expiration_format_t; - -/** Configuration options for a Tor process. */ -struct or_options_t { - uint32_t magic_; - - /** What should the tor process actually do? */ - tor_cmdline_mode_t command; - char *command_arg; /**< Argument for command-line option. */ - - struct config_line_t *Logs; /**< New-style list of configuration lines - * for logs */ - int LogTimeGranularity; /**< Log resolution in milliseconds. */ - - int LogMessageDomains; /**< Boolean: Should we log the domain(s) in which - * each log message occurs? */ - int TruncateLogFile; /**< Boolean: Should we truncate the log file - before we start writing? */ - char *SyslogIdentityTag; /**< Identity tag to add for syslog logging. */ - - char *DebugLogFile; /**< Where to send verbose log messages. */ - char *DataDirectory_option; /**< Where to store long-term data, as - * configured by the user. */ - char *DataDirectory; /**< Where to store long-term data, as modified. */ - int DataDirectoryGroupReadable; /**< Boolean: Is the DataDirectory g+r? */ - - char *KeyDirectory_option; /**< Where to store keys, as - * configured by the user. */ - char *KeyDirectory; /**< Where to store keys data, as modified. */ - int KeyDirectoryGroupReadable; /**< Boolean: Is the KeyDirectory g+r? */ - - char *CacheDirectory_option; /**< Where to store cached data, as - * configured by the user. */ - char *CacheDirectory; /**< Where to store cached data, as modified. */ - int CacheDirectoryGroupReadable; /**< Boolean: Is the CacheDirectory g+r? */ - - char *Nickname; /**< OR only: nickname of this onion router. */ - /** OR only: configured address for this onion router. Up to two times this - * options is accepted as in IPv4 and IPv6. */ - struct config_line_t *Address; - - /** Boolean: If set, disable IPv6 address resolution, IPv6 ORPorts, IPv6 - * reachability checks, and publishing an IPv6 ORPort in its descriptor. */ - int AddressDisableIPv6; - - char *PidFile; /**< Where to store PID of Tor process. */ - - struct routerset_t *ExitNodes; /**< Structure containing nicknames, digests, - * country codes and IP address patterns of ORs to - * consider as exits. */ - struct routerset_t *MiddleNodes; /**< Structure containing nicknames, - * digests, country codes and IP address patterns - * of ORs to consider as middles. */ - struct routerset_t *EntryNodes;/**< Structure containing nicknames, digests, - * country codes and IP address patterns of ORs to - * consider as entry points. */ - int StrictNodes; /**< Boolean: When none of our EntryNodes or ExitNodes - * are up, or we need to access a node in ExcludeNodes, - * do we just fail instead? */ - struct routerset_t *ExcludeNodes;/**< Structure containing nicknames, - * digests, country codes and IP address patterns - * of ORs not to use in circuits. But see - * StrictNodes above. */ - struct routerset_t *ExcludeExitNodes;/**< Structure containing nicknames, - * digests, country codes and IP address - * patterns of ORs not to consider as - * exits. */ - - /** Union of ExcludeNodes and ExcludeExitNodes */ - struct routerset_t *ExcludeExitNodesUnion_; - - int DisableAllSwap; /**< Boolean: Attempt to call mlockall() on our - * process for all current and future memory. */ - - struct config_line_t *ExitPolicy; /**< Lists of exit policy components. */ - int ExitPolicyRejectPrivate; /**< Should we not exit to reserved private - * addresses, and our own published addresses? - */ - int ExitPolicyRejectLocalInterfaces; /**< Should we not exit to local - * interface addresses? - * Includes OutboundBindAddresses and - * configured ports. */ - int ReducedExitPolicy; /**