Skip to content

Commit 1757dc0

Browse files
committed
Simplify NameIterator state
1 parent 4970895 commit 1757dc0

File tree

4 files changed

+24
-26
lines changed

4 files changed

+24
-26
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, true).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, true).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, true)
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, false).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, false)
6262
.filter_map(|result| Some(format!("{:?}", result.ok()?)))
6363
.collect(),
6464
}))

src/subject_name/mod.rs

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

2021
use crate::der::{self, FromDer};
2122
use crate::error::{DerTypeId, Error};
@@ -53,20 +54,19 @@ pub(crate) fn check_name_constraints(
5354
let excluded_subtrees = parse_subtrees(constraints, der::Tag::ContextSpecificConstructed1)?;
5455

5556
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-
};
57+
let result = NameIterator::new(path.cert.subject_alt_name, true).find_map(|result| {
58+
let name = match result {
59+
Ok(name) => name,
60+
Err(err) => return Some(Err(err)),
61+
};
6262

63-
check_presented_id_conforms_to_constraints(
64-
name,
65-
permitted_subtrees,
66-
excluded_subtrees,
67-
budget,
68-
)
69-
});
63+
check_presented_id_conforms_to_constraints(
64+
name,
65+
permitted_subtrees,
66+
excluded_subtrees,
67+
budget,
68+
)
69+
});
7070

7171
if let Some(Err(err)) = result {
7272
return Err(err);
@@ -203,19 +203,17 @@ enum Subtrees {
203203

204204
pub(crate) struct NameIterator<'a> {
205205
subject_alt_name: Option<untrusted::Reader<'a>>,
206-
subject_directory_name: Option<untrusted::Input<'a>>,
206+
directory_name: bool,
207207
}
208208

209209
impl<'a> NameIterator<'a> {
210210
pub(crate) fn new(
211-
subject: Option<untrusted::Input<'a>>,
212211
subject_alt_name: Option<untrusted::Input<'a>>,
212+
directory_name: bool,
213213
) -> Self {
214-
NameIterator {
214+
Self {
215215
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,
216+
directory_name,
219217
}
220218
}
221219
}
@@ -240,14 +238,14 @@ impl<'a> Iterator for NameIterator<'a> {
240238

241239
// Make sure we don't yield any items after this error.
242240
self.subject_alt_name = None;
243-
self.subject_directory_name = None;
241+
self.directory_name = false;
244242
return Some(Err(err));
245243
} else {
246244
self.subject_alt_name = None;
247245
}
248246
}
249247

250-
if self.subject_directory_name.take().is_some() {
248+
if mem::take(&mut self.directory_name) {
251249
return Some(Ok(GeneralName::DirectoryName));
252250
}
253251

0 commit comments

Comments
 (0)