Skip to content

Commit df38a5a

Browse files
build(deps): bump the rustls group across 1 directory with 3 updates (#3908)
* build(deps): bump the rustls group across 1 directory with 3 updates Bumps the rustls group with 3 updates in the / directory: [rustls-webpki](https://github.com/rustls/webpki), [rustls](https://github.com/rustls/rustls) and [rustls-pki-types](https://github.com/rustls/pki-types). Updates `rustls-webpki` from 0.103.1 to 0.103.2 - [Release notes](https://github.com/rustls/webpki/releases) - [Commits](rustls/webpki@v/0.103.1...v/0.103.2) Updates `rustls` from 0.23.26 to 0.23.27 - [Release notes](https://github.com/rustls/rustls/releases) - [Changelog](https://github.com/rustls/rustls/blob/main/CHANGELOG.md) - [Commits](rustls/rustls@v/0.23.26...v/0.23.27) Updates `rustls-pki-types` from 1.11.0 to 1.12.0 - [Release notes](https://github.com/rustls/pki-types/releases) - [Commits](rustls/pki-types@v/1.11.0...v/1.12.0) --- updated-dependencies: - dependency-name: rustls-webpki dependency-version: 0.103.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: rustls - dependency-name: rustls dependency-version: 0.23.27 dependency-type: indirect update-type: version-update:semver-patch dependency-group: rustls - dependency-name: rustls-pki-types dependency-version: 1.12.0 dependency-type: indirect update-type: version-update:semver-minor dependency-group: rustls ... Signed-off-by: dependabot[bot] <support@github.com> * fix(rustls): Remove dependency on most rustls internal types We only used these types for generating a ClientHello message for testing. Instead, we can manually encode a sample message based on the TLS spec. Signed-off-by: Scott Fleener <scott@buoyant.io> --------- Signed-off-by: dependabot[bot] <support@github.com> Signed-off-by: Scott Fleener <scott@buoyant.io> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Scott Fleener <scott@buoyant.io>
1 parent 7c6882b commit df38a5a

File tree

3 files changed

+121
-41
lines changed

3 files changed

+121
-41
lines changed

Cargo.lock

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1450,7 +1450,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
14501450
checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667"
14511451
dependencies = [
14521452
"cfg-if",
1453-
"windows-targets 0.52.6",
1453+
"windows-targets 0.48.5",
14541454
]
14551455

14561456
[[package]]
@@ -3754,9 +3754,9 @@ dependencies = [
37543754

37553755
[[package]]
37563756
name = "rustls"
3757-
version = "0.23.26"
3757+
version = "0.23.28"
37583758
source = "registry+https://github.com/rust-lang/crates.io-index"
3759-
checksum = "df51b5869f3a441595eac5e8ff14d486ff285f7b8c0df8770e49c3b56351f0f0"
3759+
checksum = "7160e3e10bf4535308537f3c4e1641468cd0e485175d6163087c0393c7d46643"
37603760
dependencies = [
37613761
"aws-lc-rs",
37623762
"log",
@@ -3779,15 +3779,18 @@ dependencies = [
37793779

37803780
[[package]]
37813781
name = "rustls-pki-types"
3782-
version = "1.11.0"
3782+
version = "1.12.0"
37833783
source = "registry+https://github.com/rust-lang/crates.io-index"
3784-
checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c"
3784+
checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79"
3785+
dependencies = [
3786+
"zeroize",
3787+
]
37853788

37863789
[[package]]
37873790
name = "rustls-webpki"
3788-
version = "0.103.1"
3791+
version = "0.103.3"
37893792
source = "registry+https://github.com/rust-lang/crates.io-index"
3790-
checksum = "fef8b8769aaccf73098557a87cd1816b4f9c7c16811c9c77142aa695c16f2c03"
3793+
checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435"
37913794
dependencies = [
37923795
"aws-lc-rs",
37933796
"ring",

linkerd/app/outbound/src/tls/logical/tests.rs

Lines changed: 110 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,18 @@ use linkerd_proxy_client_policy::{self as client_policy, tls::sni};
1111
use parking_lot::Mutex;
1212
use std::{
1313
collections::HashMap,
14+
marker::PhantomData,
1415
net::SocketAddr,
1516
sync::Arc,
1617
task::{Context, Poll},
1718
time::Duration,
1819
};
1920
use tokio::sync::watch;
20-
use tokio_rustls::rustls::pki_types::DnsName;
21+
use tokio_rustls::rustls::{
22+
internal::msgs::codec::{Codec, Reader},
23+
pki_types::DnsName,
24+
InvalidMessage,
25+
};
2126

2227
mod basic;
2328

@@ -170,44 +175,57 @@ fn sni_route(backend: client_policy::Backend, sni: sni::MatchSni) -> client_poli
170175
// generates a sample ClientHello TLS message for testing
171176
fn generate_client_hello(sni: &str) -> Vec<u8> {
172177
use tokio_rustls::rustls::{
173-
internal::msgs::{
174-
base::Payload,
175-
codec::{Codec, Reader},
176-
enums::Compression,
177-
handshake::{
178-
ClientExtension, ClientHelloPayload, HandshakeMessagePayload, HandshakePayload,
179-
Random, ServerName, SessionId,
180-
},
181-
message::{MessagePayload, PlainMessage},
182-
},
183-
CipherSuite, ContentType, HandshakeType, ProtocolVersion,
178+
internal::msgs::{base::Payload, codec::Codec, message::PlainMessage},
179+
ContentType, ProtocolVersion,
184180
};
185181

186182
let sni = DnsName::try_from(sni.to_string()).unwrap();
187183
let sni = trim_hostname_trailing_dot_for_sni(&sni);
188184

189-
let mut server_name_bytes = vec![];
190-
0u8.encode(&mut server_name_bytes); // encode the type first
191-
(sni.as_ref().len() as u16).encode(&mut server_name_bytes); // then the length as u16
192-
server_name_bytes.extend_from_slice(sni.as_ref().as_bytes()); // then the server name itself
193-
194-
let server_name =
195-
ServerName::read(&mut Reader::init(&server_name_bytes)).expect("Server name is valid");
196-
197-
let hs_payload = HandshakeMessagePayload {
198-
typ: HandshakeType::ClientHello,
199-
payload: HandshakePayload::ClientHello(ClientHelloPayload {
200-
client_version: ProtocolVersion::TLSv1_2,
201-
random: Random::from([0; 32]),
202-
session_id: SessionId::read(&mut Reader::init(&[0])).unwrap(),
203-
cipher_suites: vec![CipherSuite::TLS_NULL_WITH_NULL_NULL],
204-
compression_methods: vec![Compression::Null],
205-
extensions: vec![ClientExtension::ServerName(vec![server_name])],
206-
}),
207-
};
185+
// rustls has internal-only types that can encode a ClientHello, but they are mostly
186+
// inaccessible and an unstable part of the public API anyway. Manually encode one here for
187+
// testing only instead.
188+
189+
let mut hs_payload_bytes = vec![];
190+
1u8.encode(&mut hs_payload_bytes); // client hello ID
191+
192+
let client_hello_body = {
193+
let mut payload = LengthPayload::<U24>::empty();
194+
195+
payload.buf.extend_from_slice(&[0x03, 0x03]); // client version, TLSv1.2
196+
197+
payload.buf.extend_from_slice(&[0u8; 32]); // random
198+
199+
0u8.encode(&mut payload.buf); // session ID
200+
201+
LengthPayload::<u16>::from_slice(&[0x00, 0x00] /* TLS_NULL_WITH_NULL_NULL */)
202+
.encode(&mut payload.buf);
208203

209-
let mut hs_payload_bytes = Vec::default();
210-
MessagePayload::handshake(hs_payload).encode(&mut hs_payload_bytes);
204+
LengthPayload::<u8>::from_slice(&[0x00] /* no compression */).encode(&mut payload.buf);
205+
206+
let extensions = {
207+
let mut payload = LengthPayload::<u16>::empty();
208+
0u16.encode(&mut payload.buf); // server name extension ID
209+
210+
let server_name_extension = {
211+
let mut payload = LengthPayload::<u16>::empty();
212+
let server_name = {
213+
let mut payload = LengthPayload::<u16>::empty();
214+
0u8.encode(&mut payload.buf); // DNS hostname ID
215+
LengthPayload::<u16>::from_slice(sni.as_ref().as_bytes())
216+
.encode(&mut payload.buf);
217+
payload
218+
};
219+
server_name.encode(&mut payload.buf);
220+
payload
221+
};
222+
server_name_extension.encode(&mut payload.buf);
223+
payload
224+
};
225+
extensions.encode(&mut payload.buf);
226+
payload
227+
};
228+
client_hello_body.encode(&mut hs_payload_bytes);
211229

212230
let message = PlainMessage {
213231
typ: ContentType::Handshake,
@@ -218,6 +236,65 @@ fn generate_client_hello(sni: &str) -> Vec<u8> {
218236
message.into_unencrypted_opaque().encode()
219237
}
220238

239+
#[derive(Debug)]
240+
struct LengthPayload<T> {
241+
buf: Vec<u8>,
242+
_boo: PhantomData<fn() -> T>,
243+
}
244+
245+
impl<T> LengthPayload<T> {
246+
fn empty() -> Self {
247+
Self {
248+
buf: vec![],
249+
_boo: PhantomData,
250+
}
251+
}
252+
253+
fn from_slice(s: &[u8]) -> Self {
254+
Self {
255+
buf: s.to_vec(),
256+
_boo: PhantomData,
257+
}
258+
}
259+
}
260+
261+
impl Codec<'_> for LengthPayload<u8> {
262+
fn encode(&self, bytes: &mut Vec<u8>) {
263+
(self.buf.len() as u8).encode(bytes);
264+
bytes.extend_from_slice(&self.buf);
265+
}
266+
267+
fn read(_: &mut Reader<'_>) -> std::result::Result<Self, InvalidMessage> {
268+
unimplemented!()
269+
}
270+
}
271+
272+
impl Codec<'_> for LengthPayload<u16> {
273+
fn encode(&self, bytes: &mut Vec<u8>) {
274+
(self.buf.len() as u16).encode(bytes);
275+
bytes.extend_from_slice(&self.buf);
276+
}
277+
278+
fn read(_: &mut Reader<'_>) -> std::result::Result<Self, InvalidMessage> {
279+
unimplemented!()
280+
}
281+
}
282+
283+
#[derive(Debug)]
284+
struct U24;
285+
286+
impl Codec<'_> for LengthPayload<U24> {
287+
fn encode(&self, bytes: &mut Vec<u8>) {
288+
let len = self.buf.len() as u32;
289+
bytes.extend_from_slice(&len.to_be_bytes()[1..]);
290+
bytes.extend_from_slice(&self.buf);
291+
}
292+
293+
fn read(_: &mut Reader<'_>) -> std::result::Result<Self, InvalidMessage> {
294+
unimplemented!()
295+
}
296+
}
297+
221298
fn trim_hostname_trailing_dot_for_sni(dns_name: &DnsName<'_>) -> DnsName<'static> {
222299
let dns_name_str = dns_name.as_ref();
223300

linkerd/meshtls/rustls/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ test-util = ["linkerd-tls-test-util"]
1717
futures = { version = "0.3", default-features = false }
1818
ring = { version = "0.17", features = ["std"] }
1919
rustls-pemfile = "2.2"
20-
rustls-webpki = { version = "0.103.1", default-features = false, features = ["std"] }
20+
rustls-webpki = { version = "0.103.3", default-features = false, features = ["std"] }
2121
thiserror = "2"
2222
tokio = { version = "1", features = ["macros", "rt", "sync"] }
2323
tokio-rustls = { workspace = true }

0 commit comments

Comments
 (0)