Skip to content

Commit b73e2c4

Browse files
committed
Only check DirectoryName as part of name constraints
1 parent c3e201e commit b73e2c4

File tree

6 files changed

+38
-46
lines changed

6 files changed

+38
-46
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(Some(self.subject), self.subject_alt_name).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(Some(cert.subject), cert.subject_alt_name).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(Some(cert.subject), cert.subject_alt_name)
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(None, cert.subject_alt_name).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(None, cert.subject_alt_name)
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: 25 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -53,20 +53,30 @@ pub(crate) fn check_name_constraints(
5353
let excluded_subtrees = parse_subtrees(constraints, der::Tag::ContextSpecificConstructed1)?;
5454

5555
for path in path.iter() {
56-
let result = NameIterator::new(Some(path.cert.subject), path.cert.subject_alt_name)
57-
.find_map(|result| {
58-
let name = match result {
59-
Ok(name) => name,
60-
Err(err) => return Some(Err(err)),
61-
};
56+
let result = NameIterator::new(path.cert.subject_alt_name).find_map(|result| {
57+
let name = match result {
58+
Ok(name) => name,
59+
Err(err) => return Some(Err(err)),
60+
};
61+
62+
check_presented_id_conforms_to_constraints(
63+
name,
64+
permitted_subtrees,
65+
excluded_subtrees,
66+
budget,
67+
)
68+
});
69+
70+
if let Some(Err(err)) = result {
71+
return Err(err);
72+
}
6273

63-
check_presented_id_conforms_to_constraints(
64-
name,
65-
permitted_subtrees,
66-
excluded_subtrees,
67-
budget,
68-
)
69-
});
74+
let result = check_presented_id_conforms_to_constraints(
75+
GeneralName::DirectoryName,
76+
permitted_subtrees,
77+
excluded_subtrees,
78+
budget,
79+
);
7080

7181
if let Some(Err(err)) = result {
7282
return Err(err);
@@ -203,19 +213,12 @@ enum Subtrees {
203213

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

209218
impl<'a> NameIterator<'a> {
210-
pub(crate) fn new(
211-
subject: Option<untrusted::Input<'a>>,
212-
subject_alt_name: Option<untrusted::Input<'a>>,
213-
) -> Self {
214-
NameIterator {
219+
pub(crate) fn new(subject_alt_name: Option<untrusted::Input<'a>>) -> Self {
220+
Self {
215221
subject_alt_name: subject_alt_name.map(untrusted::Reader::new),
216-
217-
// If `subject` is present, we always consider it as a `DirectoryName`.
218-
subject_directory_name: subject,
219222
}
220223
}
221224
}
@@ -240,17 +243,12 @@ impl<'a> Iterator for NameIterator<'a> {
240243

241244
// Make sure we don't yield any items after this error.
242245
self.subject_alt_name = None;
243-
self.subject_directory_name = None;
244246
return Some(Err(err));
245247
} else {
246248
self.subject_alt_name = None;
247249
}
248250
}
249251

250-
if self.subject_directory_name.take().is_some() {
251-
return Some(Ok(GeneralName::DirectoryName));
252-
}
253-
254252
None
255253
}
256254
}

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)