From 3e50dd75d6bbde26155a2822bce7be758709e996 Mon Sep 17 00:00:00 2001 From: zarzet <42882290+zarzet@users.noreply.github.com> Date: Thu, 17 Sep 2026 02:59:14 +0700 Subject: [PATCH] chore(rust): update crypto, network and UniFFI dependencies --- rust_backend/Cargo.lock | 519 ++++++++++-------- rust_backend/Cargo.toml | 22 +- rust_backend/crates/extensions/Cargo.toml | 1 + rust_backend/crates/extensions/src/auth.rs | 8 +- .../extensions/src/backend/downloads.rs | 8 +- rust_backend/crates/extensions/src/crypto.rs | 39 +- .../crates/extensions/src/crypto_host.rs | 5 +- .../crates/extensions/src/download/mod.rs | 12 +- .../extensions/src/download/segments.rs | 2 +- rust_backend/crates/extensions/src/files.rs | 5 +- rust_backend/crates/extensions/src/host.rs | 34 +- .../extensions/src/repository/package.rs | 2 +- .../extensions/src/signed_session/exchange.rs | 3 +- .../extensions/src/signed_session/protocol.rs | 7 +- rust_backend/crates/extensions/src/storage.rs | 41 +- scripts/build_rust_backend.sh | 7 +- scripts/check_rust_backend.sh | 3 +- 17 files changed, 437 insertions(+), 281 deletions(-) diff --git a/rust_backend/Cargo.lock b/rust_backend/Cargo.lock index 80f58907..9c073afc 100644 --- a/rust_backend/Cargo.lock +++ b/rust_backend/Cargo.lock @@ -10,38 +10,38 @@ checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "aead" -version = "0.5.2" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +checksum = "1973cfbc1a2daf9cf550e74e1f088c28e7f7d8c1e1418fb6c9dc5184b7e84c99" dependencies = [ "crypto-common", - "generic-array", + "inout", ] [[package]] name = "aes" -version = "0.8.4" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +checksum = "35f0f96ce78e38c3dc6d8948aa8163d06385be74000f3c7a95bf1eef35d3ea32" dependencies = [ - "cfg-if", "cipher", - "cpufeatures 0.2.17", + "cpubits", + "cpufeatures", "zeroize", ] [[package]] name = "aes-gcm" -version = "0.10.3" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" +checksum = "7f2b8006a0c83f52b62ba44a97b58bf76fe2f70a329e588f67f89691d93d498f" dependencies = [ "aead", "aes", "cipher", "ctr", + "ctutils", "ghash", - "subtle", ] [[package]] @@ -88,11 +88,11 @@ checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" [[package]] name = "askama" -version = "0.14.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f75363874b771be265f4ffe307ca705ef6f3baa19011c149da8674a87f1b75c4" +checksum = "6024d73179f43f15ccd2b881bfea6fee7f3a46ec53f33b52210dea749ebebaa4" dependencies = [ - "askama_derive", + "askama_macros", "itoa", "percent-encoding", "serde", @@ -101,31 +101,42 @@ dependencies = [ [[package]] name = "askama_derive" -version = "0.14.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "129397200fe83088e8a68407a8e2b1f826cf0086b21ccdb866a722c8bcd3a94f" +checksum = "071ee5ebf2138e3ad180e0aacf6940c2cab5e6d8333741d9925c7bee2b153f39" dependencies = [ "askama_parser", "basic-toml", + "glob", "memchr", "proc-macro2", "quote", "rustc-hash", "serde", "serde_derive", - "syn 2.0.119", + "syn 3.0.5", +] + +[[package]] +name = "askama_macros" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "643e1c7cbb6aec1d920332fe51a7c0d8219e273dcb8602db03f5263e4d16487b" +dependencies = [ + "askama_derive", ] [[package]] name = "askama_parser" -version = "0.14.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6ab5630b3d5eaf232620167977f95eb51f3432fc76852328774afbd242d4358" +checksum = "2c5ae75772275d268b03ab8bdccdd12117b6169ee23256942b34e46c9f476583" dependencies = [ - "memchr", + "rustc-hash", "serde", "serde_derive", - "winnow 0.7.15", + "unicode-ident", + "winnow", ] [[package]] @@ -153,7 +164,7 @@ dependencies = [ "proc-macro2", "quote", "syn 2.0.119", - "synstructure", + "synstructure 0.13.2", ] [[package]] @@ -169,9 +180,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.46" +version = "0.4.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f10dafd0c8d2e51ae9a748805777613ed0bbe17bf586b76c8311f45c020a32f" +checksum = "ef217a77a86a6e3dab9a5b3c81dc445b603fe743a90c1cb10a2f2144628d8cfa" dependencies = [ "compression-codecs", "compression-core", @@ -191,12 +202,6 @@ version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - [[package]] name = "base64" version = "0.23.1" @@ -243,24 +248,25 @@ dependencies = [ [[package]] name = "bitflags" -version = "2.13.1" +version = "2.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" +checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" [[package]] name = "block-buffer" -version = "0.10.4" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +checksum = "d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa" dependencies = [ - "generic-array", + "hybrid-array", + "zeroize", ] [[package]] name = "blowfish" -version = "0.9.1" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e412e2cd0f2b2d93e02543ceae7917b3c70331573df19ee046bcbc35e45e87d7" +checksum = "62ce3946557b35e71d1bbe07ec385073ce9eda05043f95de134eb578fcf1a298" dependencies = [ "byteorder", "cipher", @@ -298,9 +304,9 @@ checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" [[package]] name = "camino" -version = "1.2.5" +version = "1.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb1307f12aa967b5a58416e87b3653360e0fd614a016b6e970db08fecbb1b80d" +checksum = "bbbad30e4b4c14a39e3cc8aed085a12a327257c316619c93581e017bc52be591" dependencies = [ "serde_core", ] @@ -337,18 +343,19 @@ dependencies = [ [[package]] name = "cargo-platform" -version = "0.1.9" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +checksum = "dd0061da739915fae12ea00e16397555ed4371a6bb285431aab930f61b0aa4ba" dependencies = [ "serde", + "serde_core", ] [[package]] name = "cargo_metadata" -version = "0.19.2" +version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +checksum = "ef987d17b0a113becdd19d3d0022d04d7ef41f9efe4f3fb63ac44ba61df3ade9" dependencies = [ "camino", "cargo-platform", @@ -360,9 +367,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.4.5" +version = "1.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "005ec2760ca554fae18df7a11195552ec576cd665632a881bc011d5bb2fd4d80" +checksum = "a3eb0f42d6c360dc3f8a821f6bf2fdea7f72bfd36b3076eb0e6d1e9e0752fff4" dependencies = [ "find-msvc-tools", "shlex 2.0.1", @@ -379,9 +386,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" +checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" [[package]] name = "chacha20" @@ -390,8 +397,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "65c35e4b699c7e15ccbe7ee35c005e4fc0a278d22238a2857e6ce2dadeda1b06" dependencies = [ "cfg-if", - "cpufeatures 0.3.1", - "rand_core 0.10.1", + "cpufeatures", + "rand_core", ] [[package]] @@ -407,10 +414,11 @@ dependencies = [ [[package]] name = "cipher" -version = "0.4.4" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +checksum = "e8cf2a2c93cd704877c0858356ed03480ff301ee950b43f1cbe4573b088bfa6c" dependencies = [ + "block-buffer", "crypto-common", "inout", "zeroize", @@ -429,9 +437,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.6.6" +version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "473c7e07f409a8d772161724aa8db6a765a2532a70f9667eeb7b49d3d02fbdca" +checksum = "aa8876b300ab35ba921adea3dfd70157a46249b33f95c9084ae5709785478946" dependencies = [ "clap_builder", "clap_derive", @@ -439,9 +447,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.6.6" +version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b48fea5a88e9ae728a2dcbedbfc0e730f7d60da42e1cb049a83c9fb8b789889" +checksum = "ec0797fb7aeb1406c84efac526901f7ec3ead2124f946b494e72879d4b54704d" dependencies = [ "anstyle", "clap_lex", @@ -450,9 +458,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.6.4" +version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061" +checksum = "f9c751b79415d4e559e3d1fcf128e09e720eb673a06d26cf6f392d37d75b66e0" dependencies = [ "heck", "proc-macro2", @@ -462,9 +470,15 @@ dependencies = [ [[package]] name = "clap_lex" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" +checksum = "1c133bc6a41be0d194c306b5506d15e6feeea7b1d6604bd3f8310dfb2ca96486" + +[[package]] +name = "cmov" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c9ea0ac24bc397ab3c98583a3c9ba74fa56b09a4449bbe172b9b1ddb016027a" [[package]] name = "color_quant" @@ -484,9 +498,9 @@ dependencies = [ [[package]] name = "compression-codecs" -version = "0.4.41" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58a6d0db8759036a783bc7c3f7a07f8cef3bf9470eb1db3bc86e8bcd1c5d0fe8" +checksum = "257c7085cbb71be72d8fb97edff08b03d86d5d9f2222b9cc34a6bec87093bc10" dependencies = [ "compression-core", "flate2", @@ -499,6 +513,12 @@ version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e8ccc4ea9f6acc32d102c0f6d471d11d913ad15f20c04de743374861fa1d414" +[[package]] +name = "const-oid" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" + [[package]] name = "convert_case" version = "0.12.0" @@ -535,13 +555,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] -name = "cpufeatures" -version = "0.2.17" +name = "cpubits" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" -dependencies = [ - "libc", -] +checksum = "15b85f9c39137c3a891689859392b1bd49812121d0d61c9caf00d46ed5ce06ae" [[package]] name = "cpufeatures" @@ -554,9 +571,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.5.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8498c871161e1742aaa9d52551b2d6ebdd4c3d45a3be423e3728f33b955be550" +checksum = "01a7799fd6b852db0e61728dde9a204c423b44d689dbd432522543614b490e78" dependencies = [ "cfg-if", ] @@ -569,13 +586,13 @@ checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" [[package]] name = "crypto-common" -version = "0.1.7" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" dependencies = [ - "generic-array", - "rand_core 0.6.4", - "typenum", + "getrandom 0.4.3", + "hybrid-array", + "rand_core", ] [[package]] @@ -603,13 +620,22 @@ dependencies = [ [[package]] name = "ctr" -version = "0.9.2" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +checksum = "baaca1c4b237092596f64d571e9db6ce4109c4ef9742e27590f1709594461f21" dependencies = [ "cipher", ] +[[package]] +name = "ctutils" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5515a3834141de9eafb9717ad39eea8247b5674e6066c404e8c4b365d2a29e" +dependencies = [ + "cmov", +] + [[package]] name = "data-encoding" version = "2.11.1" @@ -659,13 +685,14 @@ dependencies = [ [[package]] name = "digest" -version = "0.10.7" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" dependencies = [ "block-buffer", + "const-oid", "crypto-common", - "subtle", + "ctutils", ] [[package]] @@ -777,9 +804,9 @@ dependencies = [ [[package]] name = "fs-err" -version = "2.11.0" +version = "3.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88a41f105fe1d5b6b34b2055e3dc59bb79b46b48b2040b9e6c7b4b5de097aa41" +checksum = "b91aa448ca50d7e79433bdf3ee8d99215430d2ec02ade5aefab2a073a1822e8a" dependencies = [ "autocfg", ] @@ -792,7 +819,7 @@ checksum = "94e7099f6313ecacbe1256e8ff9d617b75d1bcb16a6fddef94866d225a01a14a" dependencies = [ "io-lifetimes 2.0.4", "rustix", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -846,16 +873,6 @@ dependencies = [ "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", -] - [[package]] name = "getrandom" version = "0.2.17" @@ -876,16 +893,15 @@ dependencies = [ "cfg-if", "libc", "r-efi", - "rand_core 0.10.1", + "rand_core", ] [[package]] name = "ghash" -version = "0.5.1" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" +checksum = "2eecf2d5dc9b66b732b97707a0210906b1d30523eb773193ab777c0c84b3e8d5" dependencies = [ - "opaque-debug", "polyval", ] @@ -954,9 +970,9 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hickory-proto" -version = "0.26.2" +version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e2da0694c15b44c6f68a6b05e0233617008c54080e31d6eb848d858a9c5b38d" +checksum = "12b92608f679a6fa515dd1d15c1ff89443026e391200a2c840c7afcba482893d" dependencies = [ "data-encoding", "idna", @@ -973,9 +989,9 @@ dependencies = [ [[package]] name = "hmac" -version = "0.12.1" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +checksum = "6303bc9732ae41b04cb554b844a762b4115a61bfaa81e3e83050991eeb56863f" dependencies = [ "digest", ] @@ -1035,6 +1051,16 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" +[[package]] +name = "hybrid-array" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27f864f10dfb56725ce5ce5472bc52252c8f93a4ab86327122cebf62c5f59a17" +dependencies = [ + "typenum", + "zeroize", +] + [[package]] name = "hyper" version = "1.11.1" @@ -1267,11 +1293,11 @@ dependencies = [ [[package]] name = "inout" -version = "0.1.4" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +checksum = "4250ce6452e92010fdf7268ccc5d14faa80bb12fc741938534c58f16804e03c7" dependencies = [ - "generic-array", + "hybrid-array", ] [[package]] @@ -1281,7 +1307,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20fd6de4ccfcc187e38bc21cfa543cb5a302cb86a8b114eb7f0bf0dc9f8ac00f" dependencies = [ "io-lifetimes 3.0.1", - "windows-sys 0.52.0", + "windows-sys 0.60.2", ] [[package]] @@ -1445,9 +1471,9 @@ checksum = "4facc753ae494aeb6e3c22f839b158aebd4f9270f55cd3c79906c45476c47ab4" [[package]] name = "md-5" -version = "0.10.6" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +checksum = "69b6441f590336821bb897fb28fc622898ccceb1d6cea3fde5ea86b090c4de98" dependencies = [ "cfg-if", "digest", @@ -1575,12 +1601,6 @@ dependencies = [ "portable-atomic", ] -[[package]] -name = "opaque-debug" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" - [[package]] name = "openssl-probe" version = "0.2.1" @@ -1616,7 +1636,7 @@ version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d354a98a3d1251555de99e8fdd8afda05573c31b82f59063a7b0a29b5527f120" dependencies = [ - "base64 0.23.1", + "base64", "serde_core", ] @@ -1706,13 +1726,12 @@ dependencies = [ [[package]] name = "polyval" -version = "0.6.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" +checksum = "f0fa31d631f2b2cb2a544d0aa321ce847a94764d701ca2becc411138b93d49cd" dependencies = [ - "cfg-if", - "cpufeatures 0.2.17", - "opaque-debug", + "cpubits", + "cpufeatures", "universal-hash", ] @@ -1806,16 +1825,7 @@ checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" dependencies = [ "chacha20", "getrandom 0.4.3", - "rand_core 0.10.1", -] - -[[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", + "rand_core", ] [[package]] @@ -1996,9 +2006,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.44" +version = "0.23.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6725596c3f2c3a0aef021139e145d4eafe314a6623e4680ca83852b2c67ab2ba" +checksum = "0d41d731c7d2f962d1ccc364cec258de3c0e93b38c2fb3ba97ac74513048d634" dependencies = [ "once_cell", "ring", @@ -2255,23 +2265,23 @@ dependencies = [ [[package]] name = "sha1" -version = "0.10.7" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a978451301f4db1d02937a4ab3ccce137717b81826e79b7d49ffe3244a13c3b8" +checksum = "aacc4cc499359472b4abe1bf11d0b12e688af9a805fa5e3016f9a386dc2d0214" dependencies = [ "cfg-if", - "cpufeatures 0.2.17", + "cpufeatures", "digest", ] [[package]] name = "sha2" -version = "0.10.9" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" dependencies = [ "cfg-if", - "cpufeatures 0.2.17", + "cpufeatures", "digest", ] @@ -2323,9 +2333,9 @@ checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "smallvec" -version = "1.16.0" +version = "1.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9be42f50aa861c555654aa3a37f52f4b1074bacf4e48fe0ef7fa584e80f1f0f" +checksum = "ba467056f1b547ed52077911161fc86985becbc60e8e1857c8a144dab0def891" [[package]] name = "smawk" @@ -2354,7 +2364,7 @@ dependencies = [ name = "spotiflac-core" version = "0.1.0" dependencies = [ - "base64 0.22.1", + "base64", "chrono", "image", "regex", @@ -2372,10 +2382,11 @@ version = "0.1.0" dependencies = [ "aes", "aes-gcm", - "base64 0.22.1", + "base64", "blowfish", "cap-std", "chrono", + "getrandom 0.4.3", "hmac", "httpdate", "md-5", @@ -2443,7 +2454,7 @@ dependencies = [ name = "spotiflac-providers" version = "0.1.0" dependencies = [ - "base64 0.22.1", + "base64", "html5ever", "httpdate", "regex", @@ -2539,6 +2550,17 @@ dependencies = [ "syn 2.0.119", ] +[[package]] +name = "synstructure" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "901704edd0dfe137f1987838ee4f259e4e063c31371bdb423f7ae38ec6f77f02" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.5", +] + [[package]] name = "tempfile" version = "3.27.0" @@ -2563,11 +2585,12 @@ dependencies = [ [[package]] name = "textwrap" -version = "0.16.2" +version = "0.16.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" +checksum = "6ecfad6c3abc80a577f2b91c1e412ee57e7a060d430b553c1b0c940974ebcd49" dependencies = [ "smawk", + "unicode-width", ] [[package]] @@ -2632,18 +2655,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.13.2" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cf0ded5c4e56918d8f8a339e1bb67d038d3bc6d144ac407904015ba2e4cde9b" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" +checksum = "fd3ca314f692efd6c868f8408f53fe444634a845f96c028b97d35f6a1f79f0ee" [[package]] name = "tokio" @@ -2697,26 +2711,17 @@ dependencies = [ [[package]] name = "toml" -version = "0.9.12+spec-1.1.0" +version = "1.1.6+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" +checksum = "920602543f0911ab71da12c50d59701da54c196d1a2bf5cb4b75667f137a406a" dependencies = [ "indexmap", "serde_core", "serde_spanned", - "toml_datetime 0.7.5+spec-1.1.0", + "toml_datetime", "toml_parser", "toml_writer", - "winnow 0.7.15", -] - -[[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", + "winnow", ] [[package]] @@ -2730,14 +2735,14 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.25.13+spec-1.1.0" +version = "0.25.15+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b" +checksum = "1340ea94a5856333492c9064b02c778b191dd2c853778d9609debdcdfea3a614" dependencies = [ "indexmap", - "toml_datetime 1.1.1+spec-1.1.0", + "toml_datetime", "toml_parser", - "winnow 1.0.4", + "winnow", ] [[package]] @@ -2746,7 +2751,7 @@ version = "1.1.3+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" dependencies = [ - "winnow 1.0.4", + "winnow", ] [[package]] @@ -2832,10 +2837,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" [[package]] -name = "uniffi" -version = "0.31.2" +name = "unicode-width" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46eefd5468602930da46b1f49d3448c6dfc2e81295f93120f23f8174fd70267f" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + +[[package]] +name = "uniffi" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edf78ecfb9bb8d7c4f8da11e8eb2ab6304e8ec0adb3ab32d8fc77c21a5bb0b86" dependencies = [ "anyhow", "camino", @@ -2849,9 +2860,9 @@ dependencies = [ [[package]] name = "uniffi_bindgen" -version = "0.31.2" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a0c9b375d32e1365cdb2bdd7cb495eecf6fac851ddbad077412b4ee1888514" +checksum = "cdea7c4574723928bef87dfc04b203d96321d0bf34ab295a56379e633be579f3" dependencies = [ "anyhow", "askama", @@ -2875,9 +2886,9 @@ dependencies = [ [[package]] name = "uniffi_core" -version = "0.31.2" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eec017b112701681f6fbbe5d92014b5c468eb0b177a94389de03ceec40665095" +checksum = "f8b1c62ee415b805f063c82e8ef6bbcaa1b87f8eed360cf217537b7724e05601" dependencies = [ "anyhow", "bytes", @@ -2887,9 +2898,9 @@ dependencies = [ [[package]] name = "uniffi_internal_macros" -version = "0.31.2" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4641669b48fefbc5e80ff08c5004d9c7617fb91232131a6734ab6712779cb04c" +checksum = "c79d4a3129d6c2c15e367d3954886a0533dd3e85d445ce4d93379f62c6949d7b" dependencies = [ "anyhow", "indexmap", @@ -2900,9 +2911,9 @@ dependencies = [ [[package]] name = "uniffi_macros" -version = "0.31.2" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeb8617ee814de22caf7417bf514715ba0b3f46bd9d5a5d794413fd8282cb737" +checksum = "2f6a9826a83f1140b2ec67c7944f562e1ef616e6eaf40e76247adccbd5b8a091" dependencies = [ "camino", "fs-err", @@ -2917,9 +2928,9 @@ dependencies = [ [[package]] name = "uniffi_meta" -version = "0.31.2" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58d5b94fc92803d21b2928bd15c6f06e57609b95caf98ea561c99cda1b6d2a25" +checksum = "cf233eb014b595e8997c98df4ac6863b486a4ac6d54bd00230c7700753d7ef13" dependencies = [ "anyhow", "siphasher", @@ -2929,9 +2940,9 @@ dependencies = [ [[package]] name = "uniffi_pipeline" -version = "0.31.2" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "032739b3ec725576914c15899dedaf080163ced86b6934566c20ec2b20ce90ca" +checksum = "55179706fbb6e7a23e729780d2c6165e6afe1ce725fa63754bcf217b440afc04" dependencies = [ "anyhow", "heck", @@ -2942,9 +2953,9 @@ dependencies = [ [[package]] name = "uniffi_udl" -version = "0.31.2" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0a1d0a0252ce1af9e8ce78ba67ac0d8937fb2bedaf10cbddd43d3614d06ec6" +checksum = "421a9add7a19c5a264a2aba760514125ef3840a8b246ec88237fc91e3f2f79b1" dependencies = [ "anyhow", "textwrap", @@ -2954,12 +2965,12 @@ dependencies = [ [[package]] name = "universal-hash" -version = "0.5.1" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +checksum = "f4987bdc12753382e0bec4a65c50738ffaabc998b9cdd1f952fb5f39b0048a96" dependencies = [ "crypto-common", - "subtle", + "ctutils", ] [[package]] @@ -3172,7 +3183,25 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +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]] @@ -3190,14 +3219,31 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "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", + "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]] @@ -3206,42 +3252,84 @@ 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" @@ -3249,13 +3337,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] -name = "winnow" -version = "0.7.15" +name = "windows_x86_64_msvc" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" -dependencies = [ - "memchr", -] +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" @@ -3273,7 +3358,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f3fd376f71958b862e7afb20cfe5a22830e1963462f3a17f49d82a6c1d1f42d" dependencies = [ "bitflags", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -3323,14 +3408,14 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" +checksum = "33811428bee40dbceb6d545e95754741d17a6aef9a4849f0fd62e2ba4f412a78" dependencies = [ "proc-macro2", "quote", - "syn 2.0.119", - "synstructure", + "syn 3.0.5", + "synstructure 0.14.0", ] [[package]] @@ -3344,14 +3429,14 @@ dependencies = [ [[package]] name = "zerofrom-derive" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" +checksum = "f75b4683f6c7f45248d4d64056a24298c6281e0993356d7d1b4a1a962ef10d4a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.119", - "synstructure", + "syn 3.0.5", + "synstructure 0.14.0", ] [[package]] @@ -3408,9 +3493,9 @@ dependencies = [ [[package]] name = "zlib-rs" -version = "0.6.7" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34b31d188d9d685a4f9c7b46d6e36631b07058d2cfe190267adce54dc230bf12" +checksum = "b268e58e7c693d7c271f93ffc4ba3b380412554231c85bf61ca7af91042a4112" [[package]] name = "zmij" diff --git a/rust_backend/Cargo.toml b/rust_backend/Cargo.toml index 56cbf632..46b22362 100644 --- a/rust_backend/Cargo.toml +++ b/rust_backend/Cargo.toml @@ -16,21 +16,22 @@ spotiflac-extensions = { path = "crates/extensions" } spotiflac-network = { path = "crates/network" } spotiflac-providers = { path = "crates/providers" } rquickjs = { version = "=0.13.0", features = ["bindgen"] } -base64 = "0.22" -sha2 = "0.10" -sha1 = "0.10" -md-5 = "0.10" -hmac = "0.12" -aes-gcm = "=0.10.3" -aes = { version = "=0.8.4", features = ["zeroize"] } -blowfish = { version = "=0.9.1", features = ["zeroize"] } +base64 = "0.23" +sha2 = "0.11" +sha1 = "0.11" +md-5 = "0.11" +hmac = "0.13" +aes-gcm = "=0.11.1" +aes = { version = "=0.9.3", features = ["zeroize"] } +blowfish = { version = "=0.10.0", features = ["zeroize"] } zeroize = "1.8" +getrandom = "0.4" tempfile = "3.27" zip = { version = "=8.6.0", default-features = false, features = ["deflate-flate2-zlib-rs"] } serde = { version = "1.0", features = ["derive"] } serde_json = { version = "1.0", features = ["float_roundtrip", "raw_value"] } thiserror = "2.0" -uniffi = { version = "=0.31.2", default-features = false } +uniffi = { version = "=0.32.1", default-features = false } tokio = { version = "=1.53.1", features = ["rt-multi-thread", "net", "time", "sync", "io-util", "macros"] } hyper = { version = "=1.11.1", features = ["client", "http1", "http2"] } hyper-util = { version = "=0.1.20", features = ["client-legacy", "http1", "http2", "tokio"] } @@ -46,11 +47,12 @@ futures-util = "0.3" tokio-util = { version = "0.7", features = ["io"] } async-compression = { version = "0.4", features = ["tokio", "gzip"] } tower-service = "0.3" -hickory-proto = { version = "=0.26.2", default-features = false, features = ["std"] } +hickory-proto = { version = "=0.26.3", default-features = false, features = ["std"] } cookie = "0.18" url = "2.5" regex = "=1.13.1" scraper = { version = "=0.27.0", default-features = false } +# Keep the parser compatible with scraper's HtmlTreeSink implementation. html5ever = "=0.39.0" # Match the Unicode 15 tables used by the Go backend's title/artist matching. unicode-normalization = "=0.1.22" diff --git a/rust_backend/crates/extensions/Cargo.toml b/rust_backend/crates/extensions/Cargo.toml index cfdad077..db06f2f7 100644 --- a/rust_backend/crates/extensions/Cargo.toml +++ b/rust_backend/crates/extensions/Cargo.toml @@ -24,6 +24,7 @@ aes-gcm.workspace = true aes.workspace = true blowfish.workspace = true zeroize.workspace = true +getrandom.workspace = true tempfile.workspace = true zip.workspace = true regex.workspace = true diff --git a/rust_backend/crates/extensions/src/auth.rs b/rust_backend/crates/extensions/src/auth.rs index 0368e700..1d32c073 100644 --- a/rust_backend/crates/extensions/src/auth.rs +++ b/rust_backend/crates/extensions/src/auth.rs @@ -1,6 +1,5 @@ //! Shared OAuth state and one-time callback ownership for managed runtimes. -use aes_gcm::aead::{OsRng, rand_core::RngCore}; use base64::{Engine, engine::general_purpose::URL_SAFE_NO_PAD}; use serde::Serialize; use serde_json::{Value, json}; @@ -297,8 +296,7 @@ impl AuthRegistry { pub fn callback_state() -> Result { let mut random = Zeroizing::new([0_u8; 32]); - OsRng - .try_fill_bytes(random.as_mut()) + getrandom::fill(random.as_mut()) .map_err(|error| format!("generate callback state: {error}"))?; Ok(URL_SAFE_NO_PAD.encode(random.as_ref())) } @@ -306,9 +304,7 @@ pub fn callback_state() -> Result { pub fn pkce_verifier(length: usize) -> Result { let length = length.clamp(43, 128); let mut random = Zeroizing::new(vec![0; length]); - OsRng - .try_fill_bytes(&mut random) - .map_err(|error| error.to_string())?; + getrandom::fill(&mut random).map_err(|error| error.to_string())?; let mut verifier = URL_SAFE_NO_PAD.encode(random.as_slice()); verifier.truncate(length); Ok(verifier) diff --git a/rust_backend/crates/extensions/src/backend/downloads.rs b/rust_backend/crates/extensions/src/backend/downloads.rs index 9c7c32f8..571e9bb8 100644 --- a/rust_backend/crates/extensions/src/backend/downloads.rs +++ b/rust_backend/crates/extensions/src/backend/downloads.rs @@ -646,8 +646,12 @@ impl Backend { // Reclaim only that namespace after a process restart, including when // a complete file already exists but its finalizer still needs to run. let staging_prefix = format!( - ".spotiflac-download-{:x}-", - Sha256::digest(output.display().to_lowercase().as_bytes()) + ".spotiflac-download-{}-", + crate::binary::encode( + &Sha256::digest(output.display().to_lowercase().as_bytes()), + "hex" + ) + .expect("hex encoding") ); if directory.exists() { for entry in directory.read_dir().map_err(|error| error.to_string())? { diff --git a/rust_backend/crates/extensions/src/crypto.rs b/rust_backend/crates/extensions/src/crypto.rs index 73a8540f..2f621fb4 100644 --- a/rust_backend/crates/extensions/src/crypto.rs +++ b/rust_backend/crates/extensions/src/crypto.rs @@ -1,6 +1,6 @@ //! Block modes retained for the existing extension API and media transforms. -use aes::cipher::{Block, BlockDecrypt, BlockEncrypt, KeyInit}; +use aes::cipher::{Block, BlockCipherDecrypt, BlockCipherEncrypt, KeyInit}; use zeroize::Zeroizing; pub enum BlockCipher { @@ -81,7 +81,7 @@ impl BlockCipher { } } -fn transform( +fn transform( cipher: &C, data: &mut [u8], iv: &[u8], @@ -89,7 +89,7 @@ fn transform( decrypt: bool, check: &dyn Fn() -> Result<(), String>, ) -> Result<(), String> { - let mut state = Block::::clone_from_slice(iv); + let mut state = Block::::try_from(iv).expect("validated IV length"); for (index, chunk) in data.chunks_mut(iv.len()).enumerate() { if index % 1024 == 0 { check()?; @@ -107,7 +107,7 @@ fn transform( } } } else if decrypt { - let encrypted = Block::::clone_from_slice(chunk); + let encrypted = Block::::try_from(&*chunk).expect("aligned encrypted block"); let mut block = encrypted.clone(); cipher.decrypt_block(&mut block); for ((byte, plain), previous) in chunk.iter_mut().zip(block.iter()).zip(state.iter()) { @@ -118,7 +118,7 @@ fn transform( for (byte, previous) in chunk.iter_mut().zip(state.iter()) { *byte ^= previous; } - let block = Block::::from_mut_slice(chunk); + let block = <&mut Block>::try_from(chunk).expect("aligned plaintext block"); cipher.encrypt_block(block); state.clone_from(block); } @@ -148,3 +148,32 @@ pub fn unpad(data: &mut Vec, block_size: usize) -> Result<(), String> { data.truncate(data.len() - count); Ok(()) } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn block_cipher_upgrade_preserves_known_ciphertexts_and_inverse() { + for (algorithm, key, expected) in [ + ("aes", vec![0; 16], "66e94bd4ef8a2c3b884cfa59ca342b2e"), + ("aes", vec![0; 24], "aae06992acbf52a3e8f4a96ec9300bd7"), + ("aes", vec![0; 32], "dc95c078a2408989ad48a21492842087"), + ("blowfish", vec![0; 8], "4ef997456198dd78"), + ] { + let cipher = BlockCipher::new(algorithm, &key).unwrap(); + let iv = vec![0; cipher.block_size()]; + for mode in ["cbc", "ctr"] { + let mut data = iv.clone(); + cipher + .transform(&mut data, &iv, mode, false, &|| Ok(())) + .unwrap(); + assert_eq!(crate::binary::encode(&data, "hex").unwrap(), expected); + cipher + .transform(&mut data, &iv, mode, true, &|| Ok(())) + .unwrap(); + assert_eq!(data, iv); + } + } + } +} diff --git a/rust_backend/crates/extensions/src/crypto_host.rs b/rust_backend/crates/extensions/src/crypto_host.rs index 4d46f930..5a75349d 100644 --- a/rust_backend/crates/extensions/src/crypto_host.rs +++ b/rust_backend/crates/extensions/src/crypto_host.rs @@ -5,7 +5,6 @@ use crate::{ runtime::Control, storage, }; -use aes_gcm::aead::{OsRng, rand_core::RngCore}; use base64::{Engine, engine::general_purpose::STANDARD}; use rquickjs::{ArrayBuffer, Ctx, Function, Object, Value}; use sha2::{Digest, Sha256}; @@ -61,9 +60,7 @@ pub(crate) fn register<'js>( return Err("key length must be an integer between 1 and 4096 bytes".to_owned()); } let mut bytes = Zeroizing::new(vec![0; length as usize]); - OsRng - .try_fill_bytes(&mut bytes) - .map_err(|error| error.to_string())?; + getrandom::fill(&mut bytes).map_err(|error| error.to_string())?; Ok(bytes) })(); let object = result_object(&ctx, result.as_ref().err())?; diff --git a/rust_backend/crates/extensions/src/download/mod.rs b/rust_backend/crates/extensions/src/download/mod.rs index 208403ae..e2d05ca6 100644 --- a/rust_backend/crates/extensions/src/download/mod.rs +++ b/rust_backend/crates/extensions/src/download/mod.rs @@ -6,7 +6,6 @@ mod store; use crate::files::{ExtensionFiles, FilePath}; use crate::transfer_policy::DownloadTransferPolicy; -use aes_gcm::aead::{OsRng, rand_core::RngCore}; use serde::Serialize; use sha2::{Digest, Sha256}; use spotiflac_core::app_version::AppVersion; @@ -419,15 +418,16 @@ fn validator(response: &HttpResponse) -> String { fn fingerprint(url: &str) -> String { UrlParts::parse(url).map_or(String::new(), |url| { - format!( - "{:x}", - Sha256::digest(format!( + crate::binary::encode( + &Sha256::digest(format!( "{}://{}{}", url.scheme.to_lowercase(), url.authority().to_lowercase(), url.escaped_path() - )) + )), + "hex", ) + .expect("hex encoding") }) } @@ -483,7 +483,7 @@ fn next_delay(current: Duration, policy: &DownloadTransferPolicy) -> Duration { return ceiling; } let mut random = [0; 8]; - if OsRng.try_fill_bytes(&mut random).is_err() { + if getrandom::fill(&mut random).is_err() { return ceiling; } floor diff --git a/rust_backend/crates/extensions/src/download/segments.rs b/rust_backend/crates/extensions/src/download/segments.rs index ac0ea592..3993c5fe 100644 --- a/rust_backend/crates/extensions/src/download/segments.rs +++ b/rust_backend/crates/extensions/src/download/segments.rs @@ -43,7 +43,7 @@ pub(crate) fn download( } let mut output = SegmentOutput::open( path, - format!("{:x}", hash.finalize()), + crate::binary::encode(&hash.finalize(), "hex").expect("hex encoding"), segments.len(), options.persistent, ) diff --git a/rust_backend/crates/extensions/src/files.rs b/rust_backend/crates/extensions/src/files.rs index 3ca5d56f..8a296521 100644 --- a/rust_backend/crates/extensions/src/files.rs +++ b/rust_backend/crates/extensions/src/files.rs @@ -491,7 +491,6 @@ impl FilePath { create_parent: bool, source: Option<(&Self, &File)>, ) -> io::Result<(StagedFile, bool)> { - use aes_gcm::aead::{OsRng, rand_core::RngCore}; if create_parent { self.mkdir_parent()?; } @@ -503,9 +502,7 @@ impl FilePath { .to_owned(); for _ in 0..8 { let mut nonce = [0; 16]; - OsRng - .try_fill_bytes(&mut nonce) - .map_err(|error| io::Error::other(error.to_string()))?; + getrandom::fill(&mut nonce).map_err(|error| io::Error::other(error.to_string()))?; let name = format!( ".spotiflac-{}.partial", crate::binary::encode(&nonce, "hex").expect("hex encoding") diff --git a/rust_backend/crates/extensions/src/host.rs b/rust_backend/crates/extensions/src/host.rs index b3fccdb9..40b703c7 100644 --- a/rust_backend/crates/extensions/src/host.rs +++ b/rust_backend/crates/extensions/src/host.rs @@ -3,7 +3,7 @@ use crate::storage::{StorageError, StoreKind}; use base64::Engine; use base64::alphabet; use base64::engine::general_purpose::{GeneralPurpose, GeneralPurposeConfig, STANDARD}; -use hmac::{Hmac, Mac}; +use hmac::{Hmac, KeyInit, Mac}; use md5::Md5; use rquickjs::{Ctx, Function, Object}; use sha1::Sha1; @@ -174,13 +174,13 @@ pub(crate) fn register<'js>( host.set( "md5", Function::new(ctx.clone(), |value: String| { - format!("{:x}", Md5::digest(value)) + crate::binary::encode(&Md5::digest(value), "hex").expect("hex encoding") })?, )?; host.set( "sha256", Function::new(ctx.clone(), |value: String| { - format!("{:x}", Sha256::digest(value)) + crate::binary::encode(&Sha256::digest(value), "hex").expect("hex encoding") })?, )?; host.set( @@ -189,7 +189,7 @@ pub(crate) fn register<'js>( let mut mac = Hmac::::new_from_slice(key.as_bytes()) .expect("HMAC accepts any key length"); mac.update(message.as_bytes()); - format!("{:x}", mac.finalize().into_bytes()) + crate::binary::encode(&mac.finalize().into_bytes(), "hex").expect("hex encoding") })?, )?; host.set( @@ -269,3 +269,29 @@ pub(crate) fn decode_go_utf8(mut bytes: &[u8]) -> String { } decoded } + +#[cfg(test)] +mod tests { + #[test] + fn digest_upgrade_preserves_extension_hash_and_hmac_encodings() { + let runtime = crate::ExtensionRuntime::load( + r#"registerExtension({run() { return [ + utils.md5('abc'), utils.sha256('abc'), utils.hmacSHA256('message', 'key') + ]; }});"#, + "{}", + crate::RuntimeLimits::default(), + ) + .unwrap(); + let result: serde_json::Value = + serde_json::from_str(&runtime.call("run", "[]", None, 1000).unwrap()).unwrap(); + assert_eq!( + result, + serde_json::json!([ + "900150983cd24fb0d6963f7d28e17f72", + "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad", + "6e9ef29b75fffc5b7abae527d58fdadb2fe42e7219011976917343065f58ed4a", + ]) + ); + runtime.shutdown(); + } +} diff --git a/rust_backend/crates/extensions/src/repository/package.rs b/rust_backend/crates/extensions/src/repository/package.rs index 65f6502d..c302df17 100644 --- a/rust_backend/crates/extensions/src/repository/package.rs +++ b/rust_backend/crates/extensions/src/repository/package.rs @@ -81,7 +81,7 @@ pub fn write_verified_package( )); } if !normalized.is_empty() { - let actual = format!("{:x}", hasher.finalize()); + let actual = crate::binary::encode(&hasher.finalize(), "hex").expect("hex encoding"); // The checksum is public, but keep the comparison independent of its // first mismatching byte, matching the Go implementation. if actual diff --git a/rust_backend/crates/extensions/src/signed_session/exchange.rs b/rust_backend/crates/extensions/src/signed_session/exchange.rs index a9682dc5..a16e3651 100644 --- a/rust_backend/crates/extensions/src/signed_session/exchange.rs +++ b/rust_backend/crates/extensions/src/signed_session/exchange.rs @@ -317,7 +317,8 @@ impl SignedSessionClient { } fn exchange_owned(&self, grant: &str, generation: u64, check: Check<'_>) -> Result<(), String> { - let grant_hash = format!("{:x}", Sha256::digest(grant)); + let grant_hash = + crate::binary::encode(&Sha256::digest(grant), "hex").expect("hex encoding"); let record = { let mut state = self.scope.lock().expect("signed session coordinator lock"); if state.clear_generation != generation { diff --git a/rust_backend/crates/extensions/src/signed_session/protocol.rs b/rust_backend/crates/extensions/src/signed_session/protocol.rs index 4e833086..7b5626c8 100644 --- a/rust_backend/crates/extensions/src/signed_session/protocol.rs +++ b/rust_backend/crates/extensions/src/signed_session/protocol.rs @@ -1,7 +1,6 @@ use crate::manifest::SignedSession; -use aes_gcm::aead::{OsRng, rand_core::RngCore}; use base64::{Engine, engine::general_purpose::URL_SAFE_NO_PAD}; -use hmac::{Hmac, Mac}; +use hmac::{Hmac, KeyInit, Mac}; use serde::{Deserialize, Serialize}; use serde_json::{Value, json}; use sha2::{Digest, Sha256}; @@ -371,9 +370,7 @@ impl Record { pub fn random_hex(count: usize) -> Result { let mut bytes = Zeroizing::new(vec![0; count]); - OsRng - .try_fill_bytes(&mut bytes) - .map_err(|error| error.to_string())?; + getrandom::fill(&mut bytes).map_err(|error| error.to_string())?; Ok(hex(&bytes)) } diff --git a/rust_backend/crates/extensions/src/storage.rs b/rust_backend/crates/extensions/src/storage.rs index bf576941..9fc5146a 100644 --- a/rust_backend/crates/extensions/src/storage.rs +++ b/rust_backend/crates/extensions/src/storage.rs @@ -1,6 +1,6 @@ //! Go-compatible extension persistence. Each file is serialized across runtimes. -use aes_gcm::aead::{Aead, KeyInit, OsRng, rand_core::RngCore}; +use aes_gcm::aead::{Aead, KeyInit}; use aes_gcm::{Aes256Gcm, Nonce}; use base64::Engine; use base64::alphabet; @@ -64,7 +64,7 @@ impl StorageMasterKey { } pub fn derive(&self, extension_id: &str, purpose: &str) -> Zeroizing<[u8; 32]> { - let mut mac = as Mac>::new_from_slice(self.0.as_ref()) + let mut mac = as KeyInit>::new_from_slice(self.0.as_ref()) .expect("HMAC accepts any key length"); mac.update(b"SpotiFLAC Mobile extension storage v2\0"); mac.update(purpose.as_bytes()); @@ -77,12 +77,10 @@ impl StorageMasterKey { /// Go's wire format: 12-byte nonce, ciphertext, then the 16-byte authentication tag. pub fn encrypt(plaintext: &[u8], key: &[u8; 32]) -> Result, StorageError> { let mut nonce = [0u8; 12]; - OsRng - .try_fill_bytes(&mut nonce) - .map_err(|error| StorageError::Random(error.to_string()))?; + getrandom::fill(&mut nonce).map_err(|error| StorageError::Random(error.to_string()))?; let cipher = Aes256Gcm::new(key.into()); let ciphertext = cipher - .encrypt(Nonce::from_slice(&nonce), plaintext) + .encrypt(&Nonce::from(nonce), plaintext) .map_err(|_| StorageError::Authentication)?; let mut result = Vec::with_capacity(nonce.len() + ciphertext.len()); result.extend_from_slice(&nonce); @@ -96,7 +94,10 @@ pub fn decrypt(ciphertext: &[u8], key: &[u8; 32]) -> Result>, } let cipher = Aes256Gcm::new(key.into()); let plaintext = cipher - .decrypt(Nonce::from_slice(&ciphertext[..12]), &ciphertext[12..]) + .decrypt( + ciphertext[..12].try_into().expect("checked nonce length"), + &ciphertext[12..], + ) .map_err(|_| StorageError::Authentication)?; Ok(Zeroizing::new(plaintext)) } @@ -282,8 +283,7 @@ impl ExtensionStore { Some(salt) if salt.len() == 32 => salt, _ => { let mut salt = vec![0u8; 32]; - OsRng - .try_fill_bytes(&mut salt) + getrandom::fill(&mut salt) .map_err(|error| StorageError::Random(error.to_string()))?; atomic_write(&path, &salt)?; salt @@ -450,6 +450,29 @@ pub(crate) fn atomic_write(path: &Path, data: &[u8]) -> Result<(), StorageError> mod tests { use super::*; + #[test] + fn aes_gcm_upgrade_reads_existing_wire_format_and_rejects_tampering() { + let mut stored = vec![0; 12]; + stored.extend( + crate::binary::decode_string( + "cea7403d4d606b6e074ec5d3baf39d18d0d1c8a799996bf0265b98b5d48ab919", + "hex", + ) + .unwrap(), + ); + assert_eq!(&*decrypt(&stored, &[0; 32]).unwrap(), &[0; 16]); + stored[15] ^= 1; + assert!(matches!( + decrypt(&stored, &[0; 32]), + Err(StorageError::Authentication) + )); + let generated = encrypt(b"example persisted settings", &[7; 32]).unwrap(); + assert_eq!( + &*decrypt(&generated, &[7; 32]).unwrap(), + b"example persisted settings" + ); + } + #[test] fn retired_store_cannot_read_or_overwrite_a_reinstalled_extension() { let directory = tempfile::tempdir().unwrap(); diff --git a/scripts/build_rust_backend.sh b/scripts/build_rust_backend.sh index 9edfaf2f..48a10b2f 100644 --- a/scripts/build_rust_backend.sh +++ b/scripts/build_rust_backend.sh @@ -27,9 +27,8 @@ fi cd "$RUST_BACKEND_DIR" export CARGO_TARGET_DIR="$RUST_BACKEND_DIR/target" -# AES 0.8 requires this opt-in on ARM64. Runtime detection retains the software -# fallback on CPUs without AES; do not force target-feature=+aes on Android. -export RUSTFLAGS="${RUSTFLAGS:-} --cfg aes_armv8" +# AES 0.9 detects ARM64 AES at runtime and retains the software fallback; +# do not force target-feature=+aes on Android. case "$(uname -s)" in Darwin) @@ -44,10 +43,10 @@ esac # Build separately from bindgen so CLI and cargo-metadata features are not # enabled in the shipped library through Cargo's workspace feature unification. cargo build --locked --release -p spotiflac-mobile +# Bindgen discovers each crate's uniffi.toml through Cargo metadata. for language in kotlin swift; do cargo run --locked -p spotiflac-bindgen -- generate \ --library "$HOST_LIBRARY" \ - --config crates/mobile/uniffi.toml \ --language "$language" \ --out-dir "$CARGO_TARGET_DIR/bindings/$language" \ --no-format diff --git a/scripts/check_rust_backend.sh b/scripts/check_rust_backend.sh index d50c91c9..74a079ac 100644 --- a/scripts/check_rust_backend.sh +++ b/scripts/check_rust_backend.sh @@ -35,8 +35,7 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_DIR="$(dirname "$SCRIPT_DIR")" cd "$PROJECT_DIR/rust_backend" -# Exercise the same runtime-detected AES backend as the release build. -export RUSTFLAGS="${RUSTFLAGS:-} --cfg aes_armv8" +# AES 0.9 uses the same runtime-detected backend as the release build. cargo fmt --all -- --check cargo clippy --workspace --all-targets --locked -- -D warnings cargo test --workspace --locked