diff --git a/Cargo.lock b/Cargo.lock index d1bb9b97c..6ea18d669 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -685,9 +685,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.47" +version = "0.4.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef217a77a86a6e3dab9a5b3c81dc445b603fe743a90c1cb10a2f2144628d8cfa" +checksum = "fb61aea1a7def73ee7c350a184f0e70b32c182344e2e75bf70c9b621b83417fd" dependencies = [ "compression-codecs", "compression-core", @@ -812,7 +812,7 @@ checksum = "82f6aeea286b8eb4dd3431a1be1b59d290ace00f5bfd8e2a159bc2a05e2c1667" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] @@ -961,9 +961,9 @@ dependencies = [ [[package]] name = "aws-runtime" -version = "1.9.2" +version = "1.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef47857a1d4488b528f4a5d5715fa7c3300820897824152234d3fa22b1426657" +checksum = "25b43ad47adc2517efe3d706559d94b97e50e80e0321b3cadbc9f77cee88adcd" dependencies = [ "aws-credential-types", "aws-sigv4", @@ -989,9 +989,9 @@ dependencies = [ [[package]] name = "aws-sdk-kms" -version = "1.118.0" +version = "1.120.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c243864bc3754be9f0001414e0162fdf1370fa62c70b0cfbe1da6a6221d553c7" +checksum = "d6b0fe38fee2ba5b6cd24d32d08365b314ae1adea123649e061a7eb6300b6f5b" dependencies = [ "arc-swap", "aws-credential-types", @@ -1015,9 +1015,9 @@ dependencies = [ [[package]] name = "aws-sdk-s3" -version = "1.146.1" +version = "1.148.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cd651b4400d4011b8927b83a9552bf90ff11e6e5da0b9f0a7583247aceec971" +checksum = "8a61c1db3987ab6c8740fb87f248864687d50549401115244a84f02c3047b2d5" dependencies = [ "arc-swap", "aws-credential-types", @@ -1052,9 +1052,9 @@ dependencies = [ [[package]] name = "aws-sdk-sso" -version = "1.109.0" +version = "1.111.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3cfe74df5d9ad2fedd691973ad3521ebf4f27a3c68c792556686aedb5519bab" +checksum = "65700d75f6da78c89a61a49f1539979400a4609d3329376b1dc2133d7a1b2b90" dependencies = [ "arc-swap", "aws-credential-types", @@ -1078,9 +1078,9 @@ dependencies = [ [[package]] name = "aws-sdk-ssooidc" -version = "1.111.0" +version = "1.113.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81b0ec31ed6191bd11350aae4b2004198f2db21350cb0a20c57e0a92e55dd161" +checksum = "eb1147c254af7b6cee3ace90ae7da6f21366ce9a9b899035fa8a0fdf586eb75a" dependencies = [ "arc-swap", "aws-credential-types", @@ -1104,9 +1104,9 @@ dependencies = [ [[package]] name = "aws-sdk-sts" -version = "1.114.0" +version = "1.116.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef45745026107ec30c4ef86bd8ae4b002e7e5f6a86e4225240bdf6b06a0b944a" +checksum = "035c7392e751d20bf1060d625d023587eb14099646110a9cff7c697bfe4b253a" dependencies = [ "arc-swap", "aws-credential-types", @@ -1131,9 +1131,9 @@ dependencies = [ [[package]] name = "aws-sigv4" -version = "1.5.1" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "723c2234ad7511ceef63eab016b7ba6ff7c55590fefb96fa8467af014a07309f" +checksum = "31d955e76ff96acd555bf06fa0fa6d5bf9335fa84ae7c64481b20ae61d231f70" dependencies = [ "aws-credential-types", "aws-smithy-eventstream", @@ -1737,7 +1737,7 @@ dependencies = [ "prettyplease 0.3.0", "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] @@ -1996,9 +1996,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 = "cfg_aliases" @@ -2141,7 +2141,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] @@ -2222,9 +2222,9 @@ dependencies = [ [[package]] name = "compression-codecs" -version = "0.4.42" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "257c7085cbb71be72d8fb97edff08b03d86d5d9f2222b9cc34a6bec87093bc10" +checksum = "bef16c47ba2797aa6a909cc37d39911f3a6743811fe7408ac0b0cc0276b656e9" dependencies = [ "brotli 8.0.4", "bzip2", @@ -2798,7 +2798,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] @@ -2842,7 +2842,7 @@ checksum = "2ac7135c3ef02b2f7833bbeb1be5ba7f966dcde8a87c6b87f65a778d71a02785" dependencies = [ "darling_core 0.24.1", "quote", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] @@ -3343,7 +3343,7 @@ checksum = "3a711bd5a06ec85d9683e142d28a98ad0679a7220669f5c1b8589e57e9b29e46" dependencies = [ "datafusion-doc", "quote", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] @@ -3715,7 +3715,7 @@ checksum = "2e2b94854e8576378ccda7c8de8a66ed8b4e8acbd2c50ec3418ea6c8aaf4b567" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] @@ -3991,7 +3991,7 @@ checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] @@ -4597,7 +4597,7 @@ checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] @@ -5306,9 +5306,9 @@ dependencies = [ [[package]] name = "hotpath" -version = "0.25.1" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "366c5db5a8e4643bdde121a1d6f35cfa035e7850b8b8ea94c6960a139d44e93a" +checksum = "f37234f85a8d1bda6b84d486245dd0847c5b33cca10d5f3691375e66704de0f8" dependencies = [ "arc-swap", "async-channel", @@ -5318,7 +5318,7 @@ dependencies = [ "flate2", "futures-channel", "futures-core", - "futures-util", + "futures-sink", "hdrhistogram", "hotpath-macros", "http 1.5.0", @@ -5339,9 +5339,9 @@ dependencies = [ [[package]] name = "hotpath-macros" -version = "0.25.1" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "846bde0d9600d98434e1aac376977d7718bfe3d2f5312a041b7c59a6a466c51a" +checksum = "2ac39b5517f540cab511bdbd5a4dc8cfc62858d6cd26a095463c1d2acfb3f290" dependencies = [ "proc-macro2", "quote", @@ -6751,7 +6751,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] @@ -8220,7 +8220,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2bfe0f4c752e450fc2faf62654f1c134747922825d5b04ca717b8874f41a40c0" dependencies = [ "proc-macro2", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] @@ -9054,7 +9054,7 @@ checksum = "92ecd8964f8453721699a1ed72037b0db49ce2f5a5138486ee89bed6f67cdf3a" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] @@ -11111,9 +11111,9 @@ dependencies = [ [[package]] name = "rustix" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +checksum = "891efababe418670775f199f0d233d84843c227a0949a883ce15b37c78d6629d" dependencies = [ "bitflags 2.13.2", "errno", @@ -11258,9 +11258,9 @@ checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" [[package]] name = "s3s" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d29a4db6a51f1cd3269a36354ce4aa7db2be8816cee42a642b9c85cd3769577" +checksum = "87d22507a8ebd0ea64972c76dfedbc477418dc70afd98bfce928263894067d2f" dependencies = [ "arc-swap", "arrayvec", @@ -11317,9 +11317,9 @@ dependencies = [ [[package]] name = "s3s-rfc2047" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9370a2f353a7929b79ae7b5f692b4758c59aa19526b18feff6a977e8ff17da5a" +checksum = "f9d3e6b36be7cca3da377b4cabcd668ffe5b16c3b73a83f7a8f7b63ff6a178ee" dependencies = [ "base64-simd", "thiserror 2.0.20", @@ -11327,9 +11327,9 @@ dependencies = [ [[package]] name = "s3s-sigv2" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f277b63ffc9a2135c49d52726199b7436c2f86746d625496984f5bb5cabef050" +checksum = "d96880b5ad8d639c9224155126741708aeb62ad3682e0476d2fd14290af808ef" dependencies = [ "base64-simd", "hmac 0.13.0", @@ -11341,9 +11341,9 @@ dependencies = [ [[package]] name = "s3s-sigv4" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a979a401f6ae4035bc22e4ac0f7a9a5923ba93841c931e8e28652fe211d991bc" +checksum = "fed605cbaaa1cf4d82e8ee15098fb3e42d49c92bb6215eb1359f63bfc0c6b020" dependencies = [ "arrayvec", "base64-simd", @@ -11575,7 +11575,7 @@ checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] @@ -11639,7 +11639,7 @@ checksum = "8d3b1629de253c70a0508c3899572da79ca359fdab27c7920ff00406df418906" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] @@ -11684,7 +11684,7 @@ dependencies = [ "darling 0.24.1", "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] @@ -11719,7 +11719,7 @@ checksum = "a22144e767da4ddd8416dbf383700542ffd8a5dc493dfecedfe1fe3ad03c98ae" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] @@ -12316,9 +12316,9 @@ dependencies = [ [[package]] name = "syn" -version = "3.0.5" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12df2e0110f65b775f769bb17ef989067a1d931b2eb822bd4346631eeada89f9" +checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee" dependencies = [ "proc-macro2", "quote", @@ -12365,7 +12365,7 @@ checksum = "901704edd0dfe137f1987838ee4f259e4e063c31371bdb423f7ae38ec6f77f02" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] @@ -12559,7 +12559,7 @@ checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] @@ -12696,7 +12696,7 @@ checksum = "78773a2a397f451582ce068015985c33193cf6dea8b74d2a639fe457b2f07b0e" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] @@ -13212,9 +13212,9 @@ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.24" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" +checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954" [[package]] name = "unicode-normalization" @@ -13456,7 +13456,7 @@ dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.6", "wasm-bindgen-shared", ] @@ -14031,7 +14031,7 @@ checksum = "33811428bee40dbceb6d545e95754741d17a6aef9a4849f0fd62e2ba4f412a78" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.6", "synstructure 0.14.0", ] @@ -14072,7 +14072,7 @@ checksum = "f75b4683f6c7f45248d4d64056a24298c6281e0993356d7d1b4a1a962ef10d4a" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.6", "synstructure 0.14.0", ] @@ -14126,7 +14126,7 @@ checksum = "34df6fc39dbd26ddc9c10e6a2984476e13acce22e64e4487636ef494369225da" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 7e13ba392..9f54a3087 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -145,7 +145,7 @@ rustfs-zip = { path = "./crates/zip", version = "1.0.1" } async-channel = "2.5.0" async_zip = { default-features = false, version = "0.0.19" } mysql_async = { default-features = false, version = "0.37.1" } -async-compression = { version = "0.4.47" } +async-compression = { version = "0.4.48" } async-recursion = "1.1.1" async-trait = "0.1.92" async-nats = { version = "0.50.0", default-features = false } @@ -244,9 +244,9 @@ atoi = "3.1.0" atomic_enum = "0.3.0" aws-config = { version = "1.12.0" } aws-credential-types = { version = "1.3.0" } -aws-sdk-kms = { default-features = false, version = "1.118.0" } -aws-sdk-s3 = { default-features = false, version = "1.146.1" } -aws-sdk-sts = { default-features = false, version = "1.114.0" } +aws-sdk-kms = { default-features = false, version = "1.120.0" } +aws-sdk-s3 = { default-features = false, version = "1.148.0" } +aws-sdk-sts = { default-features = false, version = "1.116.0" } aws-smithy-async = { version = "1.3.0" } aws-smithy-http-client = { default-features = false, version = "1.4.2" } aws-smithy-runtime-api = { version = "1.16.2" } @@ -310,11 +310,11 @@ regex = { version = "1.13.1" } rumqttc = { package = "rumqttc-next", version = "0.34.0" } redis = { version = "1.7.0" } rustify = { version = "0.7", default-features = false } -rustix = { version = "1.1.4" } +rustix = { version = "1.1.5" } rust-embed = { version = "8.12.0" } rustc-hash = { version = "2.1.3" } -s3s = { version = "0.16.0", features = ["minio"] } -s3s-sigv4 = { version = "0.16.0" } +s3s = { version = "0.16.1", features = ["minio"] } +s3s-sigv4 = { version = "0.16.1" } serial_test = "4.0.1" shadow-rs = { default-features = false, version = "2.0.0" } siphasher = "1.0.3" @@ -375,7 +375,7 @@ dav-server = "0.11.0" # Performance Analysis and Memory Profiling rustfs-mimalloc = { version = "0.5.4" } # Preserve Unicode focus filters until rustfs/backlog#2302 is resolved. -hotpath = { version = "0.25.1", default-features = false } +hotpath = { version = "0.26.0", default-features = false } # Snapshot testing for output format regression detection insta = { version = "1.48" } diff --git a/rustfs/src/app/object/request_body/tests/protocol.rs b/rustfs/src/app/object/request_body/tests/protocol.rs index 773411521..320df6fb5 100644 --- a/rustfs/src/app/object/request_body/tests/protocol.rs +++ b/rustfs/src/app/object/request_body/tests/protocol.rs @@ -90,36 +90,42 @@ struct SignedRequest { /// Constructs a real SigV4 fixture using the production crypto primitives. /// S3S verifies both the request authorization and every signed chunk. fn signed_request(payload: &[u8], unsigned_trailer: bool) -> SignedRequest { - use rustfs_utils::{hex_sha256, hmac_sha256}; - const DATE: &str = "20130524T000000Z"; const SCOPE: &str = "20130524/us-east-1/s3/aws4_request"; + const REGION: &str = "us-east-1"; + const SERVICE: &str = "s3"; + const SECRET_KEY: &str = "test-secret"; let mode = if unsigned_trailer { "STREAMING-UNSIGNED-PAYLOAD-TRAILER" } else { "STREAMING-AWS4-HMAC-SHA256-PAYLOAD" }; - let signed_headers = "host;x-amz-content-sha256;x-amz-date;x-amz-decoded-content-length"; - let headers = format!( - "host:s3.amazonaws.com\nx-amz-content-sha256:{mode}\nx-amz-date:{DATE}\nx-amz-decoded-content-length:{}\n", - payload.len() - ); - let canonical = format!("PUT\n/test-bucket/test-key\npartNumber=1&uploadId=test-upload\n{headers}\n{signed_headers}\n{mode}"); - let key = hmac_sha256("AWS4test-secret", "20130524"); - let key = hmac_sha256(key, "us-east-1"); - let key = hmac_sha256(key, "s3"); - let key = hmac_sha256(key, "aws4_request"); - let digest = |data: &[u8]| hex_sha256(data, str::to_owned); - let encode = |data: [u8; 32]| hex_simd::encode_to_string(data, hex_simd::AsciiCase::Lower); - let seed = encode(hmac_sha256( - key, - format!("AWS4-HMAC-SHA256\n{DATE}\n{SCOPE}\n{}", digest(canonical.as_bytes())), - )); + let decoded_length = payload.len().to_string(); + let mut signed_headers = vec![ + ("content-encoding", "aws-chunked"), + ("host", "s3.amazonaws.com"), + ("x-amz-content-sha256", mode), + ("x-amz-date", DATE), + ("x-amz-decoded-content-length", decoded_length.as_str()), + ]; + if unsigned_trailer { + signed_headers.push(("x-amz-trailer", "x-amz-checksum-crc32")); + } + signed_headers.sort_unstable_by(|lhs, rhs| lhs.0.cmp(rhs.0)); + let signed_header_names = signed_headers.iter().map(|(name, _)| *name).collect::>().join(";"); + let query = [("partNumber", "1"), ("uploadId", "test-upload")]; + let payload_mode = if unsigned_trailer { + s3s_sigv4::Payload::UnsignedMultipleChunksWithTrailer + } else { + s3s_sigv4::Payload::MultipleChunks + }; + let date = s3s_sigv4::AmzDate::parse(DATE).expect("fixture date"); + let canonical = s3s_sigv4::create_canonical_request("PUT", "/test-bucket/test-key", &query, &signed_headers, payload_mode); + let string_to_sign = s3s_sigv4::create_string_to_sign(&canonical, &date, REGION, SERVICE); + let seed = s3s_sigv4::calculate_signature(&string_to_sign, SECRET_KEY, &date, REGION, SERVICE); let chunk_signature = |previous: &str, data: &[u8]| { - encode(hmac_sha256( - key, - format!("AWS4-HMAC-SHA256-PAYLOAD\n{DATE}\n{SCOPE}\n{previous}\n{}\n{}", digest(b""), digest(data)), - )) + let string_to_sign = s3s_sigv4::create_chunk_string_to_sign(&date, REGION, SERVICE, previous, &[data]); + s3s_sigv4::calculate_signature(&string_to_sign, SECRET_KEY, &date, REGION, SERVICE) }; let (prefix, suffix) = if unsigned_trailer { ( @@ -147,7 +153,7 @@ fn signed_request(payload: &[u8], unsigned_trailer: bool) -> SignedRequest { .header("x-amz-decoded-content-length", payload.len()) .header( "authorization", - format!("AWS4-HMAC-SHA256 Credential=test-access/{SCOPE}, SignedHeaders={signed_headers}, Signature={seed}"), + format!("AWS4-HMAC-SHA256 Credential=test-access/{SCOPE}, SignedHeaders={signed_header_names}, Signature={seed}"), ); if unsigned_trailer { builder = builder.header("x-amz-trailer", "x-amz-checksum-crc32");