Skip to content

Commit 94b00b7

Browse files
authored
x509-cert: make RelativeDistinguishedName field private (#1510)
Like #1508 did to `RdnSequence`, this makes the inner field of the `RelativeDistinguishedName` struct private, instead explicitly delegating the `iter`, `len`, and `push` methods.
1 parent 42510cb commit 94b00b7

File tree

8 files changed

+47
-28
lines changed

8 files changed

+47
-28
lines changed

x509-cert/src/builder/profile/cabf.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,11 @@ pub fn check_names_encoding(name: &Name, multiple_allowed: bool) -> Result<()> {
4444
let mut seen = HashSet::new();
4545

4646
for rdn in name.iter() {
47-
if rdn.0.len() != 1 {
47+
if rdn.len() != 1 {
4848
return Err(Error::NonUniqueRdn);
4949
}
5050

51-
for atv in rdn.0.iter() {
51+
for atv in rdn.iter() {
5252
if !multiple_allowed && !seen.insert(atv.oid) {
5353
return Err(Error::NonUniqueATV);
5454
}
@@ -88,7 +88,7 @@ pub fn ca_certificate_naming(subject: &Name) -> Result<()> {
8888
check_names_encoding(subject, false)?;
8989

9090
for rdn in subject.iter() {
91-
for atv in rdn.0.iter() {
91+
for atv in rdn.iter() {
9292
if !allowed.remove(&atv.oid) {
9393
return Err(Error::InvalidAttribute { oid: atv.oid });
9494
}

x509-cert/src/builder/profile/cabf/tls.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -148,16 +148,15 @@ impl CertificateType {
148148
.iter()
149149
.filter_map(|rdn| {
150150
let out = SetOfVec::<AttributeTypeAndValue>::from_iter(
151-
rdn.0
152-
.iter()
151+
rdn.iter()
153152
.filter(|attr_value| attr_value.oid == rfc4519::COUNTRY_NAME)
154153
.cloned(),
155154
)
156155
.ok()?;
157156

158157
Some(RelativeDistinguishedName(out))
159158
})
160-
.filter(|rdn| !rdn.0.is_empty())
159+
.filter(|rdn| !rdn.is_empty())
161160
.collect();
162161

163162
let subject: Name = rdns.into();

x509-cert/src/name.rs

+23-1
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,29 @@ pub type DistinguishedName = RdnSequence;
153153
/// [RFC 5280 Section 4.1.2.4]: https://datatracker.ietf.org/doc/html/rfc5280#section-4.1.2.4
154154
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
155155
#[derive(Clone, Debug, Default, PartialEq, Eq)]
156-
pub struct RelativeDistinguishedName(pub SetOfVec<AttributeTypeAndValue>);
156+
pub struct RelativeDistinguishedName(pub(crate) SetOfVec<AttributeTypeAndValue>);
157+
158+
impl RelativeDistinguishedName {
159+
/// Is this [`RelativeDistinguishedName`] empty?
160+
pub fn is_empty(&self) -> bool {
161+
self.0.is_empty()
162+
}
163+
164+
/// Iterate over this [`RelativeDistinguishedName`].
165+
pub fn iter(&self) -> impl Iterator<Item = &AttributeTypeAndValue> {
166+
self.0.iter()
167+
}
168+
169+
/// Length of this [`RelativeDistinguishedName`].
170+
pub fn len(&self) -> usize {
171+
self.0.len()
172+
}
173+
174+
/// Insert an [`AttributeTypeAndValue`] into this [`RelativeDistinguishedName`]. Must be unique.
175+
pub fn insert(&mut self, item: AttributeTypeAndValue) -> Result<(), der::Error> {
176+
self.0.insert(item)
177+
}
178+
}
157179

158180
/// Parse a [`RelativeDistinguishedName`] string.
159181
///

x509-cert/tests/certificate.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ fn decode_cert() {
241241
let mut counter = 0;
242242
let i = cert.tbs_certificate().issuer().iter();
243243
for rdn in i {
244-
let i1 = rdn.0.iter();
244+
let i1 = rdn.iter();
245245
for atav in i1 {
246246
if 0 == counter {
247247
assert_eq!(atav.oid.to_string(), "2.5.4.6");
@@ -296,7 +296,7 @@ fn decode_cert() {
296296
counter = 0;
297297
let i = cert.tbs_certificate().subject().iter();
298298
for rdn in i {
299-
let i1 = rdn.0.iter();
299+
let i1 = rdn.iter();
300300
for atav in i1 {
301301
// Yes, this cert features RDNs encoded in reverse order
302302
if 0 == counter {

x509-cert/tests/certreq.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -37,15 +37,15 @@ fn decode_rsa_2048_der() {
3737
// Check all the RDNs.
3838
assert_eq!(cr.info.subject.len(), NAMES.len());
3939
for (name, (oid, val)) in cr.info.subject.iter().zip(NAMES) {
40-
let kind = name.0.get(0).unwrap();
40+
let kind = name.iter().next().unwrap();
4141
let value = match kind.value.tag() {
4242
Tag::Utf8String => Utf8StringRef::try_from(&kind.value).unwrap().as_str(),
4343
Tag::PrintableString => PrintableStringRef::try_from(&kind.value).unwrap().as_str(),
4444
_ => panic!("unexpected tag"),
4545
};
4646

4747
assert_eq!(kind.oid, oid.parse().unwrap());
48-
assert_eq!(name.0.len(), 1);
48+
assert_eq!(name.len(), 1);
4949
assert_eq!(value, *val);
5050
}
5151

x509-cert/tests/name.rs

+7-9
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ fn decode_name() {
3636
let mut counter = 0;
3737
let i = rdn1a.iter();
3838
for rdn in i {
39-
let i1 = rdn.0.iter();
39+
let i1 = rdn.iter();
4040
for atav in i1 {
4141
if 0 == counter {
4242
assert_eq!(atav.oid.to_string(), "2.5.4.6");
@@ -99,7 +99,7 @@ fn decode_rdn() {
9999
// : }
100100
let rdn1 =
101101
RelativeDistinguishedName::from_der(&hex!("310B3009060355040613025553")[..]).unwrap();
102-
let i = rdn1.0.iter();
102+
let i = rdn1.iter();
103103
for atav in i {
104104
let oid = atav.oid;
105105
assert_eq!(oid.to_string(), "2.5.4.6");
@@ -125,7 +125,7 @@ fn decode_rdn() {
125125
&hex!("311F300A060355040A0C03313233301106035504030C0A4A4F484E20534D495448")[..],
126126
)
127127
.unwrap();
128-
let mut i = rdn2a.0.iter();
128+
let mut i = rdn2a.iter();
129129
let atav1a = i.next().unwrap();
130130
let oid2 = atav1a.oid;
131131
assert_eq!(oid2.to_string(), "2.5.4.10");
@@ -143,18 +143,16 @@ fn decode_rdn() {
143143
assert_eq!(utf8a.to_string(), "JOHN SMITH");
144144

145145
let mut from_scratch = RelativeDistinguishedName::default();
146-
assert!(from_scratch.0.insert(atav1a.clone()).is_ok());
147-
assert!(from_scratch.0.insert(atav2a.clone()).is_ok());
146+
assert!(from_scratch.insert(atav1a.clone()).is_ok());
147+
assert!(from_scratch.insert(atav2a.clone()).is_ok());
148148
let reencoded = from_scratch.to_der().unwrap();
149149
assert_eq!(
150150
reencoded,
151151
&hex!("311F300A060355040A0C03313233301106035504030C0A4A4F484E20534D495448")
152152
);
153153

154154
let mut from_scratch2 = RelativeDistinguishedName::default();
155-
assert!(from_scratch2.0.insert_ordered(atav2a.clone()).is_ok());
156-
// fails when caller adds items not in DER lexicographical order
157-
assert!(from_scratch2.0.insert_ordered(atav1a.clone()).is_err());
155+
assert!(from_scratch2.insert(atav2a.clone()).is_ok());
158156

159157
// allow out-of-order RDNs (see: RustCrypto/formats#625)
160158
assert!(RelativeDistinguishedName::from_der(
@@ -357,7 +355,7 @@ fn rdns_serde() {
357355
let rdns = RdnSequence::from_der(&der).unwrap();
358356

359357
for (l, r) in brdns.iter().zip(rdns.iter()) {
360-
for (ll, rr) in l.0.iter().zip(r.0.iter()) {
358+
for (ll, rr) in l.iter().zip(r.iter()) {
361359
assert_eq!(ll, rr);
362360
}
363361

x509-cert/tests/pkix_extensions.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -583,7 +583,7 @@ fn decode_cert() {
583583
let mut counter = 0;
584584
let i = cert.tbs_certificate().issuer().iter();
585585
for rdn in i {
586-
let i1 = rdn.0.iter();
586+
let i1 = rdn.iter();
587587
for atav in i1 {
588588
if 0 == counter {
589589
assert_eq!(atav.oid.to_string(), "2.5.4.6");
@@ -634,7 +634,7 @@ fn decode_cert() {
634634
counter = 0;
635635
let i = cert.tbs_certificate().subject().iter();
636636
for rdn in i {
637-
let i1 = rdn.0.iter();
637+
let i1 = rdn.iter();
638638
for atav in i1 {
639639
if 0 == counter {
640640
assert_eq!(atav.oid.to_string(), "2.5.4.6");

x509-cert/tests/trust_anchor_format.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ fn decode_ta1() {
9292
counter = 0;
9393
let i = cert_path.ta_name.iter();
9494
for rdn in i {
95-
let i1 = rdn.0.iter();
95+
let i1 = rdn.iter();
9696
for atav in i1 {
9797
if 0 == counter {
9898
assert_eq!(atav.oid.to_string(), "2.5.4.6");
@@ -169,7 +169,7 @@ fn decode_ta2() {
169169
let mut counter = 0;
170170
let i = cert_path.ta_name.iter();
171171
for rdn in i {
172-
let i1 = rdn.0.iter();
172+
let i1 = rdn.iter();
173173
for atav in i1 {
174174
if 0 == counter {
175175
assert_eq!(atav.oid.to_string(), "2.5.4.6");
@@ -216,7 +216,7 @@ fn decode_ta2() {
216216
GeneralName::DirectoryName(dn) => {
217217
let i = dn.iter();
218218
for rdn in i {
219-
let i1 = rdn.0.iter();
219+
let i1 = rdn.iter();
220220
for atav in i1 {
221221
if 0 == counter {
222222
assert_eq!(atav.oid.to_string(), "2.5.4.6");
@@ -296,7 +296,7 @@ fn decode_ta3() {
296296
let mut counter = 0;
297297
let i = cert_path.ta_name.iter();
298298
for rdn in i {
299-
let i1 = rdn.0.iter();
299+
let i1 = rdn.iter();
300300
for atav in i1 {
301301
if 0 == counter {
302302
assert_eq!(atav.oid.to_string(), "2.5.4.6");
@@ -343,7 +343,7 @@ fn decode_ta3() {
343343
GeneralName::DirectoryName(dn) => {
344344
let i = dn.iter();
345345
for rdn in i {
346-
let i1 = rdn.0.iter();
346+
let i1 = rdn.iter();
347347
for atav in i1 {
348348
if 0 == counter {
349349
assert_eq!(atav.oid.to_string(), "2.5.4.6");
@@ -416,7 +416,7 @@ fn decode_ta4() {
416416
let mut counter = 0;
417417
let i = cert_path.ta_name.iter();
418418
for rdn in i {
419-
let i1 = rdn.0.iter();
419+
let i1 = rdn.iter();
420420
for atav in i1 {
421421
if 0 == counter {
422422
assert_eq!(atav.oid.to_string(), "0.9.2342.19200300.100.1.25");

0 commit comments

Comments
 (0)