update rustls (#7048)

## Summary of changes

Update rustls from 0.21 to 0.22.

reqwest/tonic/aws-smithy still use rustls 0.21. no upgrade route
available yet.
This commit is contained in:
Conrad Ludgate
2024-03-07 18:23:19 +00:00
committed by GitHub
parent 2fc89428c3
commit 02358b21a4
7 changed files with 281 additions and 154 deletions

293
Cargo.lock generated
View File

@@ -241,7 +241,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.32", "syn 2.0.52",
] ]
[[package]] [[package]]
@@ -252,7 +252,7 @@ checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.32", "syn 2.0.52",
] ]
[[package]] [[package]]
@@ -626,7 +626,7 @@ dependencies = [
"once_cell", "once_cell",
"pin-project-lite", "pin-project-lite",
"pin-utils", "pin-utils",
"rustls", "rustls 0.21.9",
"tokio", "tokio",
"tracing", "tracing",
] ]
@@ -907,6 +907,16 @@ version = "1.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b"
[[package]]
name = "bcder"
version = "0.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c627747a6774aab38beb35990d88309481378558875a41da1a4b2e373c906ef0"
dependencies = [
"bytes",
"smallvec",
]
[[package]] [[package]]
name = "bincode" name = "bincode"
version = "1.3.3" version = "1.3.3"
@@ -935,7 +945,7 @@ dependencies = [
"regex", "regex",
"rustc-hash", "rustc-hash",
"shlex", "shlex",
"syn 2.0.32", "syn 2.0.52",
"which", "which",
] ]
@@ -986,9 +996,9 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
[[package]] [[package]]
name = "bytes" name = "bytes"
version = "1.4.0" version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223"
dependencies = [ dependencies = [
"serde", "serde",
] ]
@@ -1149,7 +1159,7 @@ dependencies = [
"heck", "heck",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.32", "syn 2.0.52",
] ]
[[package]] [[package]]
@@ -1574,7 +1584,7 @@ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"strsim", "strsim",
"syn 2.0.32", "syn 2.0.52",
] ]
[[package]] [[package]]
@@ -1585,7 +1595,7 @@ checksum = "29a358ff9f12ec09c3e61fef9b5a9902623a695a46a917b07f269bff1445611a"
dependencies = [ dependencies = [
"darling_core", "darling_core",
"quote", "quote",
"syn 2.0.32", "syn 2.0.52",
] ]
[[package]] [[package]]
@@ -1627,6 +1637,16 @@ dependencies = [
"zeroize", "zeroize",
] ]
[[package]]
name = "der"
version = "0.7.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c"
dependencies = [
"const-oid",
"zeroize",
]
[[package]] [[package]]
name = "der-parser" name = "der-parser"
version = "8.2.0" version = "8.2.0"
@@ -1681,7 +1701,7 @@ dependencies = [
"diesel_table_macro_syntax", "diesel_table_macro_syntax",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.32", "syn 2.0.52",
] ]
[[package]] [[package]]
@@ -1701,7 +1721,7 @@ version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fc5557efc453706fed5e4fa85006fe9817c224c3f480a34c7e5959fd700921c5" checksum = "fc5557efc453706fed5e4fa85006fe9817c224c3f480a34c7e5959fd700921c5"
dependencies = [ dependencies = [
"syn 2.0.32", "syn 2.0.52",
] ]
[[package]] [[package]]
@@ -1723,7 +1743,7 @@ checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.32", "syn 2.0.52",
] ]
[[package]] [[package]]
@@ -1747,10 +1767,10 @@ version = "0.14.8"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c"
dependencies = [ dependencies = [
"der", "der 0.6.1",
"elliptic-curve", "elliptic-curve",
"rfc6979", "rfc6979",
"signature", "signature 1.6.4",
] ]
[[package]] [[package]]
@@ -1767,7 +1787,7 @@ checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3"
dependencies = [ dependencies = [
"base16ct", "base16ct",
"crypto-bigint 0.4.9", "crypto-bigint 0.4.9",
"der", "der 0.6.1",
"digest", "digest",
"ff", "ff",
"generic-array", "generic-array",
@@ -1827,7 +1847,7 @@ dependencies = [
"darling", "darling",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.32", "syn 2.0.52",
] ]
[[package]] [[package]]
@@ -2087,7 +2107,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.32", "syn 2.0.52",
] ]
[[package]] [[package]]
@@ -2470,10 +2490,10 @@ dependencies = [
"http 0.2.9", "http 0.2.9",
"hyper", "hyper",
"log", "log",
"rustls", "rustls 0.21.9",
"rustls-native-certs", "rustls-native-certs",
"tokio", "tokio",
"tokio-rustls", "tokio-rustls 0.24.0",
] ]
[[package]] [[package]]
@@ -2711,7 +2731,7 @@ checksum = "5c7ea04a7c5c055c175f189b6dc6ba036fd62306b58c66c9f6389036c503a3f4"
dependencies = [ dependencies = [
"base64 0.21.1", "base64 0.21.1",
"js-sys", "js-sys",
"pem 3.0.3", "pem",
"ring 0.17.6", "ring 0.17.6",
"serde", "serde",
"serde_json", "serde_json",
@@ -3234,7 +3254,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.32", "syn 2.0.52",
] ]
[[package]] [[package]]
@@ -3716,7 +3736,7 @@ dependencies = [
"parquet", "parquet",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.32", "syn 2.0.52",
] ]
[[package]] [[package]]
@@ -3754,16 +3774,6 @@ version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099"
[[package]]
name = "pem"
version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6b13fe415cdf3c8e44518e18a7c95a13431d9bdf6d15367d82b23c377fdd441a"
dependencies = [
"base64 0.21.1",
"serde",
]
[[package]] [[package]]
name = "pem" name = "pem"
version = "3.0.3" version = "3.0.3"
@@ -3825,7 +3835,7 @@ checksum = "39407670928234ebc5e6e580247dd567ad73a3578460c5990f9503df207e8f07"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.32", "syn 2.0.52",
] ]
[[package]] [[package]]
@@ -3846,8 +3856,8 @@ version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba"
dependencies = [ dependencies = [
"der", "der 0.6.1",
"spki", "spki 0.6.0",
] ]
[[package]] [[package]]
@@ -3946,14 +3956,14 @@ dependencies = [
"futures", "futures",
"once_cell", "once_cell",
"pq_proto", "pq_proto",
"rustls", "rustls 0.22.2",
"rustls-pemfile", "rustls-pemfile 2.1.1",
"serde", "serde",
"thiserror", "thiserror",
"tokio", "tokio",
"tokio-postgres", "tokio-postgres",
"tokio-postgres-rustls", "tokio-postgres-rustls",
"tokio-rustls", "tokio-rustls 0.25.0",
"tracing", "tracing",
"workspace_hack", "workspace_hack",
] ]
@@ -4042,7 +4052,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3b69d39aab54d069e7f2fe8cb970493e7834601ca2d8c65fd7bbd183578080d1" checksum = "3b69d39aab54d069e7f2fe8cb970493e7834601ca2d8c65fd7bbd183578080d1"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"syn 2.0.32", "syn 2.0.52",
] ]
[[package]] [[package]]
@@ -4053,9 +4063,9 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068"
[[package]] [[package]]
name = "proc-macro2" name = "proc-macro2"
version = "1.0.66" version = "1.0.78"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae"
dependencies = [ dependencies = [
"unicode-ident", "unicode-ident",
] ]
@@ -4202,8 +4212,8 @@ dependencies = [
"routerify", "routerify",
"rstest", "rstest",
"rustc-hash", "rustc-hash",
"rustls", "rustls 0.22.2",
"rustls-pemfile", "rustls-pemfile 2.1.1",
"scopeguard", "scopeguard",
"serde", "serde",
"serde_json", "serde_json",
@@ -4219,7 +4229,7 @@ dependencies = [
"tokio", "tokio",
"tokio-postgres", "tokio-postgres",
"tokio-postgres-rustls", "tokio-postgres-rustls",
"tokio-rustls", "tokio-rustls 0.25.0",
"tokio-util", "tokio-util",
"tracing", "tracing",
"tracing-opentelemetry", "tracing-opentelemetry",
@@ -4247,9 +4257,9 @@ dependencies = [
[[package]] [[package]]
name = "quote" name = "quote"
version = "1.0.32" version = "1.0.35"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
] ]
@@ -4370,12 +4380,12 @@ dependencies = [
[[package]] [[package]]
name = "rcgen" name = "rcgen"
version = "0.11.1" version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4954fbc00dcd4d8282c987710e50ba513d351400dbdd00e803a05172a90d8976" checksum = "48406db8ac1f3cbc7dcdb56ec355343817958a356ff430259bb07baf7607e1e1"
dependencies = [ dependencies = [
"pem 2.0.1", "pem",
"ring 0.16.20", "ring 0.17.6",
"time", "time",
"yasna", "yasna",
] ]
@@ -4393,15 +4403,15 @@ dependencies = [
"itoa", "itoa",
"percent-encoding", "percent-encoding",
"pin-project-lite", "pin-project-lite",
"rustls", "rustls 0.21.9",
"rustls-native-certs", "rustls-native-certs",
"rustls-pemfile", "rustls-pemfile 1.0.2",
"rustls-webpki 0.101.7", "rustls-webpki 0.101.7",
"ryu", "ryu",
"sha1_smol", "sha1_smol",
"socket2 0.4.9", "socket2 0.4.9",
"tokio", "tokio",
"tokio-rustls", "tokio-rustls 0.24.0",
"tokio-util", "tokio-util",
"url", "url",
] ]
@@ -4547,14 +4557,14 @@ dependencies = [
"once_cell", "once_cell",
"percent-encoding", "percent-encoding",
"pin-project-lite", "pin-project-lite",
"rustls", "rustls 0.21.9",
"rustls-pemfile", "rustls-pemfile 1.0.2",
"serde", "serde",
"serde_json", "serde_json",
"serde_urlencoded", "serde_urlencoded",
"tokio", "tokio",
"tokio-native-tls", "tokio-native-tls",
"tokio-rustls", "tokio-rustls 0.24.0",
"tokio-util", "tokio-util",
"tower-service", "tower-service",
"url", "url",
@@ -4720,7 +4730,7 @@ dependencies = [
"regex", "regex",
"relative-path", "relative-path",
"rustc_version", "rustc_version",
"syn 2.0.32", "syn 2.0.52",
"unicode-ident", "unicode-ident",
] ]
@@ -4804,6 +4814,20 @@ dependencies = [
"sct", "sct",
] ]
[[package]]
name = "rustls"
version = "0.22.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e87c9956bd9807afa1f77e0f7594af32566e830e088a5576d27c5b6f30f49d41"
dependencies = [
"log",
"ring 0.17.6",
"rustls-pki-types",
"rustls-webpki 0.102.2",
"subtle",
"zeroize",
]
[[package]] [[package]]
name = "rustls-native-certs" name = "rustls-native-certs"
version = "0.6.2" version = "0.6.2"
@@ -4811,7 +4835,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0167bac7a9f490495f3c33013e7722b53cb087ecbe082fb0c6387c96f634ea50" checksum = "0167bac7a9f490495f3c33013e7722b53cb087ecbe082fb0c6387c96f634ea50"
dependencies = [ dependencies = [
"openssl-probe", "openssl-probe",
"rustls-pemfile", "rustls-pemfile 1.0.2",
"schannel", "schannel",
"security-framework", "security-framework",
] ]
@@ -4825,6 +4849,22 @@ dependencies = [
"base64 0.21.1", "base64 0.21.1",
] ]
[[package]]
name = "rustls-pemfile"
version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f48172685e6ff52a556baa527774f61fcaa884f59daf3375c62a3f1cd2549dab"
dependencies = [
"base64 0.21.1",
"rustls-pki-types",
]
[[package]]
name = "rustls-pki-types"
version = "1.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5ede67b28608b4c60685c7d54122d4400d90f62b40caee7700e700380a390fa8"
[[package]] [[package]]
name = "rustls-webpki" name = "rustls-webpki"
version = "0.100.2" version = "0.100.2"
@@ -4845,6 +4885,17 @@ dependencies = [
"untrusted 0.9.0", "untrusted 0.9.0",
] ]
[[package]]
name = "rustls-webpki"
version = "0.102.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "faaa0a62740bedb9b2ef5afa303da42764c012f743917351dc9a237ea1663610"
dependencies = [
"ring 0.17.6",
"rustls-pki-types",
"untrusted 0.9.0",
]
[[package]] [[package]]
name = "rustversion" name = "rustversion"
version = "1.0.12" version = "1.0.12"
@@ -4887,7 +4938,7 @@ dependencies = [
"serde_with", "serde_with",
"thiserror", "thiserror",
"tokio", "tokio",
"tokio-rustls", "tokio-rustls 0.25.0",
"tokio-stream", "tokio-stream",
"tracing", "tracing",
"tracing-appender", "tracing-appender",
@@ -5022,7 +5073,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928"
dependencies = [ dependencies = [
"base16ct", "base16ct",
"der", "der 0.6.1",
"generic-array", "generic-array",
"pkcs8", "pkcs8",
"subtle", "subtle",
@@ -5066,7 +5117,7 @@ checksum = "2e95efd0cefa32028cdb9766c96de71d96671072f9fb494dc9fb84c0ef93e52b"
dependencies = [ dependencies = [
"httpdate", "httpdate",
"reqwest", "reqwest",
"rustls", "rustls 0.21.9",
"sentry-backtrace", "sentry-backtrace",
"sentry-contexts", "sentry-contexts",
"sentry-core", "sentry-core",
@@ -5188,7 +5239,7 @@ checksum = "aafe972d60b0b9bee71a91b92fee2d4fb3c9d7e8f6b179aa99f27203d99a4816"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.32", "syn 2.0.52",
] ]
[[package]] [[package]]
@@ -5269,7 +5320,7 @@ dependencies = [
"darling", "darling",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.32", "syn 2.0.52",
] ]
[[package]] [[package]]
@@ -5355,6 +5406,15 @@ dependencies = [
"rand_core 0.6.4", "rand_core 0.6.4",
] ]
[[package]]
name = "signature"
version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de"
dependencies = [
"rand_core 0.6.4",
]
[[package]] [[package]]
name = "simple_asn1" name = "simple_asn1"
version = "0.6.2" version = "0.6.2"
@@ -5439,7 +5499,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b"
dependencies = [ dependencies = [
"base64ct", "base64ct",
"der", "der 0.6.1",
]
[[package]]
name = "spki"
version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d"
dependencies = [
"base64ct",
"der 0.7.8",
] ]
[[package]] [[package]]
@@ -5542,9 +5612,9 @@ dependencies = [
[[package]] [[package]]
name = "syn" name = "syn"
version = "2.0.32" version = "2.0.52"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "239814284fd6f1a4ffe4ca893952cdd93c224b6a1571c9a9eadd670295c0c9e2" checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@@ -5659,22 +5729,22 @@ dependencies = [
[[package]] [[package]]
name = "thiserror" name = "thiserror"
version = "1.0.47" version = "1.0.57"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "97a802ec30afc17eee47b2855fc72e0c4cd62be9b4efe6591edde0ec5bd68d8f" checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b"
dependencies = [ dependencies = [
"thiserror-impl", "thiserror-impl",
] ]
[[package]] [[package]]
name = "thiserror-impl" name = "thiserror-impl"
version = "1.0.47" version = "1.0.57"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6bb623b56e39ab7dcd4b1b98bb6c8f8d907ed255b18de254088016b27a8ee19b" checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.32", "syn 2.0.52",
] ]
[[package]] [[package]]
@@ -5845,7 +5915,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.32", "syn 2.0.52",
] ]
[[package]] [[package]]
@@ -5883,16 +5953,17 @@ dependencies = [
[[package]] [[package]]
name = "tokio-postgres-rustls" name = "tokio-postgres-rustls"
version = "0.10.0" version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dd5831152cb0d3f79ef5523b357319ba154795d64c7078b2daa95a803b54057f" checksum = "0ea13f22eda7127c827983bdaf0d7fff9df21c8817bab02815ac277a21143677"
dependencies = [ dependencies = [
"futures", "futures",
"ring 0.16.20", "ring 0.17.6",
"rustls", "rustls 0.22.2",
"tokio", "tokio",
"tokio-postgres", "tokio-postgres",
"tokio-rustls", "tokio-rustls 0.25.0",
"x509-certificate",
] ]
[[package]] [[package]]
@@ -5901,7 +5972,18 @@ version = "0.24.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e0d409377ff5b1e3ca6437aa86c1eb7d40c134bfec254e44c830defa92669db5" checksum = "e0d409377ff5b1e3ca6437aa86c1eb7d40c134bfec254e44c830defa92669db5"
dependencies = [ dependencies = [
"rustls", "rustls 0.21.9",
"tokio",
]
[[package]]
name = "tokio-rustls"
version = "0.25.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f"
dependencies = [
"rustls 0.22.2",
"rustls-pki-types",
"tokio", "tokio",
] ]
@@ -6016,9 +6098,9 @@ dependencies = [
"pin-project", "pin-project",
"prost", "prost",
"rustls-native-certs", "rustls-native-certs",
"rustls-pemfile", "rustls-pemfile 1.0.2",
"tokio", "tokio",
"tokio-rustls", "tokio-rustls 0.24.0",
"tokio-stream", "tokio-stream",
"tower", "tower",
"tower-layer", "tower-layer",
@@ -6114,7 +6196,7 @@ checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.32", "syn 2.0.52",
] ]
[[package]] [[package]]
@@ -6330,7 +6412,7 @@ dependencies = [
"base64 0.21.1", "base64 0.21.1",
"log", "log",
"once_cell", "once_cell",
"rustls", "rustls 0.21.9",
"rustls-webpki 0.100.2", "rustls-webpki 0.100.2",
"url", "url",
"webpki-roots 0.23.1", "webpki-roots 0.23.1",
@@ -6572,7 +6654,7 @@ dependencies = [
"once_cell", "once_cell",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.32", "syn 2.0.52",
"wasm-bindgen-shared", "wasm-bindgen-shared",
] ]
@@ -6606,7 +6688,7 @@ checksum = "e128beba882dd1eb6200e1dc92ae6c5dbaa4311aa7bb211ca035779e5efc39f8"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.32", "syn 2.0.52",
"wasm-bindgen-backend", "wasm-bindgen-backend",
"wasm-bindgen-shared", "wasm-bindgen-shared",
] ]
@@ -6939,19 +7021,18 @@ dependencies = [
"regex-automata 0.4.3", "regex-automata 0.4.3",
"regex-syntax 0.8.2", "regex-syntax 0.8.2",
"reqwest", "reqwest",
"ring 0.16.20", "rustls 0.21.9",
"rustls",
"scopeguard", "scopeguard",
"serde", "serde",
"serde_json", "serde_json",
"smallvec", "smallvec",
"subtle", "subtle",
"syn 1.0.109", "syn 1.0.109",
"syn 2.0.32", "syn 2.0.52",
"time", "time",
"time-macros", "time-macros",
"tokio", "tokio",
"tokio-rustls", "tokio-rustls 0.24.0",
"tokio-util", "tokio-util",
"toml_datetime", "toml_datetime",
"toml_edit", "toml_edit",
@@ -6962,11 +7043,31 @@ dependencies = [
"tungstenite", "tungstenite",
"url", "url",
"uuid", "uuid",
"zeroize",
"zstd", "zstd",
"zstd-safe", "zstd-safe",
"zstd-sys", "zstd-sys",
] ]
[[package]]
name = "x509-certificate"
version = "0.23.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "66534846dec7a11d7c50a74b7cdb208b9a581cad890b7866430d438455847c85"
dependencies = [
"bcder",
"bytes",
"chrono",
"der 0.7.8",
"hex",
"pem",
"ring 0.17.6",
"signature 2.2.0",
"spki 0.7.3",
"thiserror",
"zeroize",
]
[[package]] [[package]]
name = "x509-parser" name = "x509-parser"
version = "0.15.0" version = "0.15.0"
@@ -7025,7 +7126,7 @@ checksum = "b3c129550b3e6de3fd0ba67ba5c81818f9805e58b8d7fee80a3a59d2c9fc601a"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.32", "syn 2.0.52",
] ]
[[package]] [[package]]
@@ -7033,6 +7134,20 @@ name = "zeroize"
version = "1.6.0" version = "1.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9"
dependencies = [
"zeroize_derive",
]
[[package]]
name = "zeroize_derive"
version = "1.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.52",
]
[[package]] [[package]]
name = "zstd" name = "zstd"

View File

@@ -129,8 +129,8 @@ reqwest-retry = "0.2.2"
routerify = "3" routerify = "3"
rpds = "0.13" rpds = "0.13"
rustc-hash = "1.1.0" rustc-hash = "1.1.0"
rustls = "0.21" rustls = "0.22"
rustls-pemfile = "1" rustls-pemfile = "2"
rustls-split = "0.3" rustls-split = "0.3"
scopeguard = "1.1" scopeguard = "1.1"
sysinfo = "0.29.2" sysinfo = "0.29.2"
@@ -159,8 +159,8 @@ tikv-jemalloc-ctl = "0.5"
tokio = { version = "1.17", features = ["macros"] } tokio = { version = "1.17", features = ["macros"] }
tokio-epoll-uring = { git = "https://github.com/neondatabase/tokio-epoll-uring.git" , branch = "main" } tokio-epoll-uring = { git = "https://github.com/neondatabase/tokio-epoll-uring.git" , branch = "main" }
tokio-io-timeout = "1.2.0" tokio-io-timeout = "1.2.0"
tokio-postgres-rustls = "0.10.0" tokio-postgres-rustls = "0.11.0"
tokio-rustls = "0.24" tokio-rustls = "0.25"
tokio-stream = "0.1" tokio-stream = "0.1"
tokio-tar = "0.3" tokio-tar = "0.3"
tokio-util = { version = "0.7.10", features = ["io", "rt"] } tokio-util = { version = "0.7.10", features = ["io", "rt"] }
@@ -219,7 +219,7 @@ workspace_hack = { version = "0.1", path = "./workspace_hack/" }
## Build dependencies ## Build dependencies
criterion = "0.5.1" criterion = "0.5.1"
rcgen = "0.11" rcgen = "0.12"
rstest = "0.18" rstest = "0.18"
camino-tempfile = "1.0.2" camino-tempfile = "1.0.2"
tonic-build = "0.9" tonic-build = "0.9"

View File

@@ -72,14 +72,19 @@ async fn simple_select() {
} }
} }
static KEY: Lazy<rustls::PrivateKey> = Lazy::new(|| { static KEY: Lazy<rustls::pki_types::PrivateKeyDer<'static>> = Lazy::new(|| {
let mut cursor = Cursor::new(include_bytes!("key.pem")); let mut cursor = Cursor::new(include_bytes!("key.pem"));
rustls::PrivateKey(rustls_pemfile::rsa_private_keys(&mut cursor).unwrap()[0].clone()) let key = rustls_pemfile::rsa_private_keys(&mut cursor)
.next()
.unwrap()
.unwrap();
rustls::pki_types::PrivateKeyDer::Pkcs1(key)
}); });
static CERT: Lazy<rustls::Certificate> = Lazy::new(|| { static CERT: Lazy<rustls::pki_types::CertificateDer<'static>> = Lazy::new(|| {
let mut cursor = Cursor::new(include_bytes!("cert.pem")); let mut cursor = Cursor::new(include_bytes!("cert.pem"));
rustls::Certificate(rustls_pemfile::certs(&mut cursor).unwrap()[0].clone()) let cert = rustls_pemfile::certs(&mut cursor).next().unwrap().unwrap();
cert
}); });
// test that basic select with ssl works // test that basic select with ssl works
@@ -88,9 +93,8 @@ async fn simple_select_ssl() {
let (client_sock, server_sock) = make_tcp_pair().await; let (client_sock, server_sock) = make_tcp_pair().await;
let server_cfg = rustls::ServerConfig::builder() let server_cfg = rustls::ServerConfig::builder()
.with_safe_defaults()
.with_no_client_auth() .with_no_client_auth()
.with_single_cert(vec![CERT.clone()], KEY.clone()) .with_single_cert(vec![CERT.clone()], KEY.clone_key())
.unwrap(); .unwrap();
let tls_config = Some(Arc::new(server_cfg)); let tls_config = Some(Arc::new(server_cfg));
let pgbackend = let pgbackend =
@@ -102,10 +106,9 @@ async fn simple_select_ssl() {
}); });
let client_cfg = rustls::ClientConfig::builder() let client_cfg = rustls::ClientConfig::builder()
.with_safe_defaults()
.with_root_certificates({ .with_root_certificates({
let mut store = rustls::RootCertStore::empty(); let mut store = rustls::RootCertStore::empty();
store.add(&CERT).unwrap(); store.add(CERT.clone()).unwrap();
store store
}) })
.with_no_client_auth(); .with_no_client_auth();

View File

@@ -10,6 +10,7 @@ use itertools::Itertools;
use proxy::config::TlsServerEndPoint; use proxy::config::TlsServerEndPoint;
use proxy::context::RequestMonitoring; use proxy::context::RequestMonitoring;
use proxy::proxy::run_until_cancelled; use proxy::proxy::run_until_cancelled;
use rustls::pki_types::PrivateKeyDer;
use tokio::net::TcpListener; use tokio::net::TcpListener;
use anyhow::{anyhow, bail, ensure, Context}; use anyhow::{anyhow, bail, ensure, Context};
@@ -76,37 +77,40 @@ async fn main() -> anyhow::Result<()> {
(Some(key_path), Some(cert_path)) => { (Some(key_path), Some(cert_path)) => {
let key = { let key = {
let key_bytes = std::fs::read(key_path).context("TLS key file")?; let key_bytes = std::fs::read(key_path).context("TLS key file")?;
let mut keys = rustls_pemfile::pkcs8_private_keys(&mut &key_bytes[..])
.context(format!("Failed to read TLS keys at '{key_path}'"))?; let mut keys =
rustls_pemfile::pkcs8_private_keys(&mut &key_bytes[..]).collect_vec();
ensure!(keys.len() == 1, "keys.len() = {} (should be 1)", keys.len()); ensure!(keys.len() == 1, "keys.len() = {} (should be 1)", keys.len());
keys.pop().map(rustls::PrivateKey).unwrap() PrivateKeyDer::Pkcs8(
keys.pop()
.unwrap()
.context(format!("Failed to read TLS keys at '{key_path}'"))?,
)
}; };
let cert_chain_bytes = std::fs::read(cert_path) let cert_chain_bytes = std::fs::read(cert_path)
.context(format!("Failed to read TLS cert file at '{cert_path}.'"))?; .context(format!("Failed to read TLS cert file at '{cert_path}.'"))?;
let cert_chain = { let cert_chain: Vec<_> = {
rustls_pemfile::certs(&mut &cert_chain_bytes[..]) rustls_pemfile::certs(&mut &cert_chain_bytes[..])
.context(format!( .try_collect()
"Failed to read TLS certificate chain from bytes from file at '{cert_path}'." .with_context(|| {
))? format!("Failed to read TLS certificate chain from bytes from file at '{cert_path}'.")
.into_iter() })?
.map(rustls::Certificate)
.collect_vec()
}; };
// needed for channel bindings // needed for channel bindings
let first_cert = cert_chain.first().context("missing certificate")?; let first_cert = cert_chain.first().context("missing certificate")?;
let tls_server_end_point = TlsServerEndPoint::new(first_cert)?; let tls_server_end_point = TlsServerEndPoint::new(first_cert)?;
let tls_config = rustls::ServerConfig::builder() let tls_config = rustls::ServerConfig::builder_with_protocol_versions(&[
.with_safe_default_cipher_suites() &rustls::version::TLS13,
.with_safe_default_kx_groups() &rustls::version::TLS12,
.with_protocol_versions(&[&rustls::version::TLS13, &rustls::version::TLS12])? ])
.with_no_client_auth() .with_no_client_auth()
.with_single_cert(cert_chain, key)? .with_single_cert(cert_chain, key)?
.into(); .into();
(tls_config, tls_server_end_point) (tls_config, tls_server_end_point)
} }

View File

@@ -1,6 +1,10 @@
use crate::{auth, rate_limiter::RateBucketInfo, serverless::GlobalConnPoolOptions}; use crate::{auth, rate_limiter::RateBucketInfo, serverless::GlobalConnPoolOptions};
use anyhow::{bail, ensure, Context, Ok}; use anyhow::{bail, ensure, Context, Ok};
use rustls::{sign, Certificate, PrivateKey}; use itertools::Itertools;
use rustls::{
crypto::ring::sign,
pki_types::{CertificateDer, PrivateKeyDer},
};
use sha2::{Digest, Sha256}; use sha2::{Digest, Sha256};
use std::{ use std::{
collections::{HashMap, HashSet}, collections::{HashMap, HashSet},
@@ -88,14 +92,14 @@ pub fn configure_tls(
let cert_resolver = Arc::new(cert_resolver); let cert_resolver = Arc::new(cert_resolver);
let config = rustls::ServerConfig::builder() // allow TLS 1.2 to be compatible with older client libraries
.with_safe_default_cipher_suites() let config = rustls::ServerConfig::builder_with_protocol_versions(&[
.with_safe_default_kx_groups() &rustls::version::TLS13,
// allow TLS 1.2 to be compatible with older client libraries &rustls::version::TLS12,
.with_protocol_versions(&[&rustls::version::TLS13, &rustls::version::TLS12])? ])
.with_no_client_auth() .with_no_client_auth()
.with_cert_resolver(cert_resolver.clone()) .with_cert_resolver(cert_resolver.clone())
.into(); .into();
Ok(TlsConfig { Ok(TlsConfig {
config, config,
@@ -133,14 +137,14 @@ pub enum TlsServerEndPoint {
} }
impl TlsServerEndPoint { impl TlsServerEndPoint {
pub fn new(cert: &Certificate) -> anyhow::Result<Self> { pub fn new(cert: &CertificateDer) -> anyhow::Result<Self> {
let sha256_oids = [ let sha256_oids = [
// I'm explicitly not adding MD5 or SHA1 here... They're bad. // I'm explicitly not adding MD5 or SHA1 here... They're bad.
oid_registry::OID_SIG_ECDSA_WITH_SHA256, oid_registry::OID_SIG_ECDSA_WITH_SHA256,
oid_registry::OID_PKCS1_SHA256WITHRSA, oid_registry::OID_PKCS1_SHA256WITHRSA,
]; ];
let pem = x509_parser::parse_x509_certificate(&cert.0) let pem = x509_parser::parse_x509_certificate(cert)
.context("Failed to parse PEM object from cerficiate")? .context("Failed to parse PEM object from cerficiate")?
.1; .1;
@@ -150,8 +154,7 @@ impl TlsServerEndPoint {
let oid = pem.signature_algorithm.oid(); let oid = pem.signature_algorithm.oid();
let alg = reg.get(oid); let alg = reg.get(oid);
if sha256_oids.contains(oid) { if sha256_oids.contains(oid) {
let tls_server_end_point: [u8; 32] = let tls_server_end_point: [u8; 32] = Sha256::new().chain_update(cert).finalize().into();
Sha256::new().chain_update(&cert.0).finalize().into();
info!(subject = %pem.subject, signature_algorithm = alg.map(|a| a.description()), tls_server_end_point = %base64::encode(tls_server_end_point), "determined channel binding"); info!(subject = %pem.subject, signature_algorithm = alg.map(|a| a.description()), tls_server_end_point = %base64::encode(tls_server_end_point), "determined channel binding");
Ok(Self::Sha256(tls_server_end_point)) Ok(Self::Sha256(tls_server_end_point))
} else { } else {
@@ -165,7 +168,7 @@ impl TlsServerEndPoint {
} }
} }
#[derive(Default)] #[derive(Default, Debug)]
pub struct CertResolver { pub struct CertResolver {
certs: HashMap<String, (Arc<rustls::sign::CertifiedKey>, TlsServerEndPoint)>, certs: HashMap<String, (Arc<rustls::sign::CertifiedKey>, TlsServerEndPoint)>,
default: Option<(Arc<rustls::sign::CertifiedKey>, TlsServerEndPoint)>, default: Option<(Arc<rustls::sign::CertifiedKey>, TlsServerEndPoint)>,
@@ -185,11 +188,14 @@ impl CertResolver {
let priv_key = { let priv_key = {
let key_bytes = std::fs::read(key_path) let key_bytes = std::fs::read(key_path)
.context(format!("Failed to read TLS keys at '{key_path}'"))?; .context(format!("Failed to read TLS keys at '{key_path}'"))?;
let mut keys = rustls_pemfile::pkcs8_private_keys(&mut &key_bytes[..]) let mut keys = rustls_pemfile::pkcs8_private_keys(&mut &key_bytes[..]).collect_vec();
.context(format!("Failed to parse TLS keys at '{key_path}'"))?;
ensure!(keys.len() == 1, "keys.len() = {} (should be 1)", keys.len()); ensure!(keys.len() == 1, "keys.len() = {} (should be 1)", keys.len());
keys.pop().map(rustls::PrivateKey).unwrap() PrivateKeyDer::Pkcs8(
keys.pop()
.unwrap()
.context(format!("Failed to parse TLS keys at '{key_path}'"))?,
)
}; };
let cert_chain_bytes = std::fs::read(cert_path) let cert_chain_bytes = std::fs::read(cert_path)
@@ -197,14 +203,10 @@ impl CertResolver {
let cert_chain = { let cert_chain = {
rustls_pemfile::certs(&mut &cert_chain_bytes[..]) rustls_pemfile::certs(&mut &cert_chain_bytes[..])
.try_collect()
.with_context(|| { .with_context(|| {
format!( format!("Failed to read TLS certificate chain from bytes from file at '{cert_path}'.")
"Failed to read TLS certificate chain from bytes from file at '{cert_path}'."
)
})? })?
.into_iter()
.map(rustls::Certificate)
.collect()
}; };
self.add_cert(priv_key, cert_chain, is_default) self.add_cert(priv_key, cert_chain, is_default)
@@ -212,15 +214,15 @@ impl CertResolver {
pub fn add_cert( pub fn add_cert(
&mut self, &mut self,
priv_key: PrivateKey, priv_key: PrivateKeyDer<'static>,
cert_chain: Vec<Certificate>, cert_chain: Vec<CertificateDer<'static>>,
is_default: bool, is_default: bool,
) -> anyhow::Result<()> { ) -> anyhow::Result<()> {
let key = sign::any_supported_type(&priv_key).context("invalid private key")?; let key = sign::any_supported_type(&priv_key).context("invalid private key")?;
let first_cert = &cert_chain[0]; let first_cert = &cert_chain[0];
let tls_server_end_point = TlsServerEndPoint::new(first_cert)?; let tls_server_end_point = TlsServerEndPoint::new(first_cert)?;
let pem = x509_parser::parse_x509_certificate(&first_cert.0) let pem = x509_parser::parse_x509_certificate(first_cert)
.context("Failed to parse PEM object from cerficiate")? .context("Failed to parse PEM object from cerficiate")?
.1; .1;

View File

@@ -20,6 +20,7 @@ use crate::{http, sasl, scram};
use anyhow::{bail, Context}; use anyhow::{bail, Context};
use async_trait::async_trait; use async_trait::async_trait;
use rstest::rstest; use rstest::rstest;
use rustls::pki_types;
use tokio_postgres::config::SslMode; use tokio_postgres::config::SslMode;
use tokio_postgres::tls::{MakeTlsConnect, NoTls}; use tokio_postgres::tls::{MakeTlsConnect, NoTls};
use tokio_postgres_rustls::{MakeRustlsConnect, RustlsStream}; use tokio_postgres_rustls::{MakeRustlsConnect, RustlsStream};
@@ -28,7 +29,11 @@ use tokio_postgres_rustls::{MakeRustlsConnect, RustlsStream};
fn generate_certs( fn generate_certs(
hostname: &str, hostname: &str,
common_name: &str, common_name: &str,
) -> anyhow::Result<(rustls::Certificate, rustls::Certificate, rustls::PrivateKey)> { ) -> anyhow::Result<(
pki_types::CertificateDer<'static>,
pki_types::CertificateDer<'static>,
pki_types::PrivateKeyDer<'static>,
)> {
let ca = rcgen::Certificate::from_params({ let ca = rcgen::Certificate::from_params({
let mut params = rcgen::CertificateParams::default(); let mut params = rcgen::CertificateParams::default();
params.is_ca = rcgen::IsCa::Ca(rcgen::BasicConstraints::Unconstrained); params.is_ca = rcgen::IsCa::Ca(rcgen::BasicConstraints::Unconstrained);
@@ -45,9 +50,9 @@ fn generate_certs(
})?; })?;
Ok(( Ok((
rustls::Certificate(ca.serialize_der()?), pki_types::CertificateDer::from(ca.serialize_der()?),
rustls::Certificate(cert.serialize_der_with_signer(&ca)?), pki_types::CertificateDer::from(cert.serialize_der_with_signer(&ca)?),
rustls::PrivateKey(cert.serialize_private_key_der()), pki_types::PrivateKeyDer::Pkcs8(cert.serialize_private_key_der().into()),
)) ))
} }
@@ -82,9 +87,8 @@ fn generate_tls_config<'a>(
let tls_config = { let tls_config = {
let config = rustls::ServerConfig::builder() let config = rustls::ServerConfig::builder()
.with_safe_defaults()
.with_no_client_auth() .with_no_client_auth()
.with_single_cert(vec![cert.clone()], key.clone())? .with_single_cert(vec![cert.clone()], key.clone_key())?
.into(); .into();
let mut cert_resolver = CertResolver::new(); let mut cert_resolver = CertResolver::new();
@@ -101,10 +105,9 @@ fn generate_tls_config<'a>(
let client_config = { let client_config = {
let config = rustls::ClientConfig::builder() let config = rustls::ClientConfig::builder()
.with_safe_defaults()
.with_root_certificates({ .with_root_certificates({
let mut store = rustls::RootCertStore::empty(); let mut store = rustls::RootCertStore::empty();
store.add(&ca)?; store.add(ca)?;
store store
}) })
.with_no_client_auth(); .with_no_client_auth();

View File

@@ -60,7 +60,6 @@ regex = { version = "1" }
regex-automata = { version = "0.4", default-features = false, features = ["dfa-onepass", "hybrid", "meta", "nfa-backtrack", "perf-inline", "perf-literal", "unicode"] } regex-automata = { version = "0.4", default-features = false, features = ["dfa-onepass", "hybrid", "meta", "nfa-backtrack", "perf-inline", "perf-literal", "unicode"] }
regex-syntax = { version = "0.8" } regex-syntax = { version = "0.8" }
reqwest = { version = "0.11", default-features = false, features = ["blocking", "default-tls", "json", "multipart", "rustls-tls", "stream"] } reqwest = { version = "0.11", default-features = false, features = ["blocking", "default-tls", "json", "multipart", "rustls-tls", "stream"] }
ring = { version = "0.16" }
rustls = { version = "0.21", features = ["dangerous_configuration"] } rustls = { version = "0.21", features = ["dangerous_configuration"] }
scopeguard = { version = "1" } scopeguard = { version = "1" }
serde = { version = "1", features = ["alloc", "derive"] } serde = { version = "1", features = ["alloc", "derive"] }
@@ -80,6 +79,7 @@ tracing-core = { version = "0.1" }
tungstenite = { version = "0.20" } tungstenite = { version = "0.20" }
url = { version = "2", features = ["serde"] } url = { version = "2", features = ["serde"] }
uuid = { version = "1", features = ["serde", "v4", "v7"] } uuid = { version = "1", features = ["serde", "v4", "v7"] }
zeroize = { version = "1", features = ["derive"] }
zstd = { version = "0.13" } zstd = { version = "0.13" }
zstd-safe = { version = "7", default-features = false, features = ["arrays", "legacy", "std", "zdict_builder"] } zstd-safe = { version = "7", default-features = false, features = ["arrays", "legacy", "std", "zdict_builder"] }
zstd-sys = { version = "2", default-features = false, features = ["legacy", "std", "zdict_builder"] } zstd-sys = { version = "2", default-features = false, features = ["legacy", "std", "zdict_builder"] }