Skip to content

Commit 4bc703b

Browse files
committed
Support PEM decoding for EchConfigListBytes
1 parent fb2d9a8 commit 4bc703b

File tree

5 files changed

+45
-4
lines changed

5 files changed

+45
-4
lines changed

src/lib.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -762,6 +762,11 @@ impl EchConfigListBytes<'_> {
762762
}
763763
}
764764

765+
#[cfg(feature = "alloc")]
766+
impl PemObjectFilter for EchConfigListBytes<'static> {
767+
const KIND: SectionKind = SectionKind::EchConfigList;
768+
}
769+
765770
impl fmt::Debug for EchConfigListBytes<'_> {
766771
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
767772
hex(f, self.as_ref())

src/pem.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -357,13 +357,21 @@ pub enum SectionKind {
357357
///
358358
/// Appears as "CERTIFICATE REQUEST" in PEM files.
359359
Csr,
360+
361+
/// An EchConfigList structure, as specified in
362+
/// <https://www.ietf.org/archive/id/draft-farrell-tls-pemesni-05.html>.
363+
///
364+
/// Appears as "ECHCONFIG" in PEM files.
365+
EchConfigList,
360366
}
361367

362368
impl SectionKind {
363369
fn secret(&self) -> bool {
364370
match self {
365371
Self::RsaPrivateKey | Self::PrivateKey | Self::EcPrivateKey => true,
366-
Self::Certificate | Self::PublicKey | Self::Crl | Self::Csr => false,
372+
Self::Certificate | Self::PublicKey | Self::Crl | Self::Csr | Self::EchConfigList => {
373+
false
374+
}
367375
}
368376
}
369377
}
@@ -380,6 +388,7 @@ impl TryFrom<&[u8]> for SectionKind {
380388
b"EC PRIVATE KEY" => Self::EcPrivateKey,
381389
b"X509 CRL" => Self::Crl,
382390
b"CERTIFICATE REQUEST" => Self::Csr,
391+
b"ECHCONFIG" => Self::EchConfigList,
383392
_ => return Err(()),
384393
})
385394
}

tests/data/ech.pem

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
-----BEGIN PRIVATE KEY-----
2+
MC4CAQAwBQYDK2VuBCIEICjd4yGRdsoP9gU7YT7My8DHx1Tjme8GYDXrOMCi8v1V
3+
-----END PRIVATE KEY-----
4+
-----BEGIN ECHCONFIG-----
5+
AD7+DQA65wAgACA8wVN2BtscOl3vQheUzHeIkVmKIiydUhDCliA4iyQRCwAEAAEA
6+
AQALZXhhbXBsZS5jb20AAA==
7+
-----END ECHCONFIG-----

tests/data/zen.pem

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,4 +162,8 @@ gdiZyLcf1VDCCUGaskEi2CsggCQQJNyGi+8BSQ8MPKm/m0KrSchGQ157eWCCjopz
162162
f5GQe2UGOg5T7g8+S4GdECMwkMlTGUwlAM6LuOG/NZqP528PCAYQv0eOYdSwALQT
163163
GwTyU4AZ9y1uBFuaFxABew9GbDEtNY/XHTF8308edUwGBk6jfD+UuTeEwRZGs9E=
164164
-----END CERTIFICATE REQUEST-----
165+
-----BEGIN ECHCONFIG-----
166+
AD7+DQA65wAgACA8wVN2BtscOl3vQheUzHeIkVmKIiydUhDCliA4iyQRCwAEAAEA
167+
AQALZXhhbXBsZS5jb20AAA==
168+
-----END ECHCONFIG-----
165169
... that's all folks!

tests/pem.rs

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@ use std::io::Cursor;
44

55
use rustls_pki_types::pem::PemObject;
66
use rustls_pki_types::{
7-
pem, CertificateDer, CertificateRevocationListDer, CertificateSigningRequestDer, PrivateKeyDer,
8-
PrivatePkcs1KeyDer, PrivatePkcs8KeyDer, PrivateSec1KeyDer, SubjectPublicKeyInfoDer,
7+
pem, CertificateDer, CertificateRevocationListDer, CertificateSigningRequestDer,
8+
EchConfigListBytes, PrivateKeyDer, PrivatePkcs1KeyDer, PrivatePkcs8KeyDer, PrivateSec1KeyDer,
9+
SubjectPublicKeyInfoDer,
910
};
1011

1112
#[test]
@@ -180,6 +181,20 @@ fn crls() {
180181
);
181182
}
182183

184+
#[test]
185+
fn ech_config() {
186+
let data = include_bytes!("data/zen.pem");
187+
188+
EchConfigListBytes::from_pem_slice(data).unwrap();
189+
EchConfigListBytes::from_pem_reader(&mut Cursor::new(&data[..])).unwrap();
190+
EchConfigListBytes::from_pem_file("tests/data/zen.pem").unwrap();
191+
192+
assert!(matches!(
193+
EchConfigListBytes::from_pem_file("tests/data/certificate.chain.pem").unwrap_err(),
194+
pem::Error::NoItemsFound
195+
));
196+
}
197+
183198
#[test]
184199
fn certificates_with_binary() {
185200
let data = include_bytes!("data/gunk.pem");
@@ -212,7 +227,7 @@ fn parse_in_order() {
212227
let items = <(pem::SectionKind, Vec<u8>) as PemObject>::pem_slice_iter(data)
213228
.collect::<Result<Vec<_>, _>>()
214229
.unwrap();
215-
assert_eq!(items.len(), 11);
230+
assert_eq!(items.len(), 12);
216231
assert!(matches!(items[0], (pem::SectionKind::Certificate, _)));
217232
assert!(matches!(items[1], (pem::SectionKind::Certificate, _)));
218233
assert!(matches!(items[2], (pem::SectionKind::Certificate, _)));
@@ -224,6 +239,7 @@ fn parse_in_order() {
224239
assert!(matches!(items[8], (pem::SectionKind::PrivateKey, _)));
225240
assert!(matches!(items[9], (pem::SectionKind::Crl, _)));
226241
assert!(matches!(items[10], (pem::SectionKind::Csr, _)));
242+
assert!(matches!(items[11], (pem::SectionKind::EchConfigList, _)));
227243
}
228244

229245
#[test]

0 commit comments

Comments
 (0)