Skip to content

Commit 0b058ba

Browse files
committed
Only check DirectoryName as part of name constraints
1 parent 340a07a commit 0b058ba

File tree

6 files changed

+26
-32
lines changed

6 files changed

+26
-32
lines changed

src/cert.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ impl<'a> Cert<'a> {
139139
///
140140
/// [EndEntityCert::verify_is_valid_for_subject_name]: crate::EndEntityCert::verify_is_valid_for_subject_name
141141
pub fn valid_dns_names(&self) -> impl Iterator<Item = &str> {
142-
NameIterator::new(self.subject_alt_name, true).filter_map(|result| {
142+
NameIterator::new(self.subject_alt_name).filter_map(|result| {
143143
let presented_id = match result.ok()? {
144144
GeneralName::DnsName(presented) => presented,
145145
_ => return None,

src/subject_name/dns_name.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ use crate::error::{Error, InvalidNameContext};
2626

2727
pub(crate) fn verify_dns_names(reference: &DnsName<'_>, cert: &Cert<'_>) -> Result<(), Error> {
2828
let dns_name = untrusted::Input::from(reference.as_ref().as_bytes());
29-
let result = NameIterator::new(cert.subject_alt_name, true).find_map(|result| {
29+
let result = NameIterator::new(cert.subject_alt_name).find_map(|result| {
3030
let name = match result {
3131
Ok(name) => name,
3232
Err(err) => return Some(Err(err)),
@@ -58,7 +58,7 @@ pub(crate) fn verify_dns_names(reference: &DnsName<'_>, cert: &Cert<'_>) -> Resu
5858
{
5959
Err(Error::CertNotValidForName(InvalidNameContext {
6060
expected: ServerName::DnsName(reference.to_owned()),
61-
presented: NameIterator::new(cert.subject_alt_name, true)
61+
presented: NameIterator::new(cert.subject_alt_name)
6262
.filter_map(|result| Some(format!("{:?}", result.ok()?)))
6363
.collect(),
6464
}))

src/subject_name/ip_address.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ pub(crate) fn verify_ip_address_names(reference: &IpAddr, cert: &Cert<'_>) -> Re
2929
IpAddr::V6(ip) => untrusted::Input::from(ip.as_ref()),
3030
};
3131

32-
let result = NameIterator::new(cert.subject_alt_name, false).find_map(|result| {
32+
let result = NameIterator::new(cert.subject_alt_name).find_map(|result| {
3333
let name = match result {
3434
Ok(name) => name,
3535
Err(err) => return Some(Err(err)),
@@ -58,7 +58,7 @@ pub(crate) fn verify_ip_address_names(reference: &IpAddr, cert: &Cert<'_>) -> Re
5858
{
5959
Err(Error::CertNotValidForName(InvalidNameContext {
6060
expected: ServerName::from(*reference),
61-
presented: NameIterator::new(cert.subject_alt_name, false)
61+
presented: NameIterator::new(cert.subject_alt_name)
6262
.filter_map(|result| Some(format!("{:?}", result.ok()?)))
6363
.collect(),
6464
}))

src/subject_name/mod.rs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
use alloc::string::String;
1717
#[cfg(feature = "alloc")]
1818
use core::fmt;
19-
use core::mem;
2019

2120
use crate::der::{self, FromDer};
2221
use crate::error::{DerTypeId, Error};
@@ -54,7 +53,7 @@ pub(crate) fn check_name_constraints(
5453
let excluded_subtrees = parse_subtrees(constraints, der::Tag::ContextSpecificConstructed1)?;
5554

5655
for path in path.iter() {
57-
let result = NameIterator::new(path.cert.subject_alt_name, true).find_map(|result| {
56+
let result = NameIterator::new(path.cert.subject_alt_name).find_map(|result| {
5857
let name = match result {
5958
Ok(name) => name,
6059
Err(err) => return Some(Err(err)),
@@ -71,6 +70,17 @@ pub(crate) fn check_name_constraints(
7170
if let Some(Err(err)) = result {
7271
return Err(err);
7372
}
73+
74+
let result = check_presented_id_conforms_to_constraints(
75+
GeneralName::DirectoryName,
76+
permitted_subtrees,
77+
excluded_subtrees,
78+
budget,
79+
);
80+
81+
if let Some(Err(err)) = result {
82+
return Err(err);
83+
}
7484
}
7585

7686
Ok(())
@@ -203,17 +213,12 @@ enum Subtrees {
203213

204214
pub(crate) struct NameIterator<'a> {
205215
subject_alt_name: Option<untrusted::Reader<'a>>,
206-
directory_name: bool,
207216
}
208217

209218
impl<'a> NameIterator<'a> {
210-
pub(crate) fn new(
211-
subject_alt_name: Option<untrusted::Input<'a>>,
212-
directory_name: bool,
213-
) -> Self {
219+
pub(crate) fn new(subject_alt_name: Option<untrusted::Input<'a>>) -> Self {
214220
Self {
215221
subject_alt_name: subject_alt_name.map(untrusted::Reader::new),
216-
directory_name,
217222
}
218223
}
219224
}
@@ -238,17 +243,12 @@ impl<'a> Iterator for NameIterator<'a> {
238243

239244
// Make sure we don't yield any items after this error.
240245
self.subject_alt_name = None;
241-
self.directory_name = false;
242246
return Some(Err(err));
243247
} else {
244248
self.subject_alt_name = None;
245249
}
246250
}
247251

248-
if mem::take(&mut self.directory_name) {
249-
return Some(Ok(GeneralName::DirectoryName));
250-
}
251-
252252
None
253253
}
254254
}

tests/generate.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -296,10 +296,6 @@ def generate_tls_server_cert_test(
296296
presented_names_str += f'"IpAddress({san.value})"'
297297

298298
ip_addr_sans = all(isinstance(san, x509.IPAddress) for san in (sans or []))
299-
if expected_error is None and not (ip_addr_sans and subject_common_name is None):
300-
if presented_names_str:
301-
presented_names_str += ", "
302-
presented_names_str += '"DirectoryName"'
303299

304300
print(
305301
"""

tests/tls_server_certs.rs

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ fn no_name_constraints() {
7373
ca,
7474
&["dns.example.com"],
7575
&["subject.example.com"],
76-
&["DnsName(\"dns.example.com\")", "DirectoryName"]
76+
&["DnsName(\"dns.example.com\")"]
7777
),
7878
Ok(())
7979
);
@@ -91,8 +91,7 @@ fn additional_dns_labels() {
9191
&["subject.example.com"],
9292
&[
9393
"DnsName(\"host1.example.com\")",
94-
"DnsName(\"host2.example.com\")",
95-
"DirectoryName"
94+
"DnsName(\"host2.example.com\")"
9695
]
9796
),
9897
Ok(())
@@ -114,7 +113,7 @@ fn allow_subject_common_name() {
114113
let ee = include_bytes!("tls_server_certs/allow_subject_common_name.ee.der");
115114
let ca = include_bytes!("tls_server_certs/allow_subject_common_name.ca.der");
116115
assert_eq!(
117-
check_cert(ee, ca, &[], &["allowed.example.com"], &["DirectoryName"]),
116+
check_cert(ee, ca, &[], &["allowed.example.com"], &[]),
118117
Ok(())
119118
);
120119
}
@@ -129,7 +128,7 @@ fn allow_dns_san() {
129128
ca,
130129
&["allowed.example.com"],
131130
&[],
132-
&["DnsName(\"allowed.example.com\")", "DirectoryName"]
131+
&["DnsName(\"allowed.example.com\")"]
133132
),
134133
Ok(())
135134
);
@@ -145,7 +144,7 @@ fn allow_dns_san_and_subject_common_name() {
145144
ca,
146145
&["allowed-san.example.com"],
147146
&["allowed-cn.example.com"],
148-
&["DnsName(\"allowed-san.example.com\")", "DirectoryName"]
147+
&["DnsName(\"allowed-san.example.com\")"]
149148
),
150149
Ok(())
151150
);
@@ -207,7 +206,7 @@ fn we_ignore_constraints_on_names_that_do_not_appear_in_cert() {
207206
ca,
208207
&["notexample.com"],
209208
&["example.com"],
210-
&["DnsName(\"notexample.com\")", "DirectoryName"]
209+
&["DnsName(\"notexample.com\")"]
211210
),
212211
Ok(())
213212
);
@@ -223,7 +222,7 @@ fn wildcard_san_accepted_if_in_subtree() {
223222
ca,
224223
&["bob.example.com", "jane.example.com"],
225224
&["example.com", "uh.oh.example.com"],
226-
&["DnsName(\"*.example.com\")", "DirectoryName"]
225+
&["DnsName(\"*.example.com\")"]
227226
),
228227
Ok(())
229228
);
@@ -399,8 +398,7 @@ fn invalid_dns_name_matching() {
399398
&[],
400399
&[
401400
"DnsName(\"{invalid}.example.com\")",
402-
"DnsName(\"dns.example.com\")",
403-
"DirectoryName"
401+
"DnsName(\"dns.example.com\")"
404402
]
405403
),
406404
Ok(())

0 commit comments

Comments
 (0)