Skip to content

Commit f628286

Browse files
authored
Apply the Asn1Operation API to several extensions (#12019)
1 parent 750f34e commit f628286

File tree

5 files changed

+37
-38
lines changed

5 files changed

+37
-38
lines changed

src/rust/cryptography-x509-verification/src/policy/extension.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -530,6 +530,7 @@ pub(crate) mod ca {
530530
pub(crate) mod common {
531531
use cryptography_x509::{
532532
certificate::Certificate,
533+
common::Asn1Read,
533534
extensions::{Extension, SequenceOfAccessDescriptions},
534535
};
535536

@@ -546,7 +547,7 @@ pub(crate) mod common {
546547
if let Some(extn) = extn {
547548
// We don't currently do anything useful with these, but we
548549
// do check that they're well-formed.
549-
let _: SequenceOfAccessDescriptions<'_> = extn.value()?;
550+
let _: SequenceOfAccessDescriptions<'_, Asn1Read> = extn.value()?;
550551
}
551552

552553
Ok(())

src/rust/cryptography-x509/src/common.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,16 +264,27 @@ impl<T: asn1::SimpleAsn1Writable, U: asn1::SimpleAsn1Writable> asn1::SimpleAsn1W
264264
}
265265

266266
pub trait Asn1Operation {
267+
type SequenceOfVec<'a, T>
268+
where
269+
T: 'a;
267270
type OwnedBitString<'a>;
268271
}
269272

270273
pub struct Asn1Read;
271274
pub struct Asn1Write;
272275

273276
impl Asn1Operation for Asn1Read {
277+
type SequenceOfVec<'a, T>
278+
= asn1::SequenceOf<'a, T>
279+
where
280+
T: 'a;
274281
type OwnedBitString<'a> = asn1::BitString<'a>;
275282
}
276283
impl Asn1Operation for Asn1Write {
284+
type SequenceOfVec<'a, T>
285+
= asn1::SequenceOfWriter<'a, T, Vec<T>>
286+
where
287+
T: 'a;
277288
type OwnedBitString<'a> = asn1::OwnedBitString;
278289
}
279290

src/rust/cryptography-x509/src/extensions.rs

Lines changed: 14 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -94,48 +94,41 @@ pub struct AccessDescription<'a> {
9494
pub access_location: name::GeneralName<'a>,
9595
}
9696

97-
pub type SequenceOfAccessDescriptions<'a> = common::Asn1ReadableOrWritable<
98-
asn1::SequenceOf<'a, AccessDescription<'a>>,
99-
asn1::SequenceOfWriter<'a, AccessDescription<'a>, Vec<AccessDescription<'a>>>,
100-
>;
97+
pub type SequenceOfAccessDescriptions<'a, Op> =
98+
<Op as Asn1Operation>::SequenceOfVec<'a, AccessDescription<'a>>;
10199

102100
// Needed due to clippy type complexity warning.
103-
type SequenceOfPolicyQualifiers<'a> = common::Asn1ReadableOrWritable<
104-
asn1::SequenceOf<'a, PolicyQualifierInfo<'a>>,
105-
asn1::SequenceOfWriter<'a, PolicyQualifierInfo<'a>, Vec<PolicyQualifierInfo<'a>>>,
106-
>;
101+
type SequenceOfPolicyQualifiers<'a, Op> =
102+
<Op as Asn1Operation>::SequenceOfVec<'a, PolicyQualifierInfo<'a, Op>>;
107103

108104
#[derive(asn1::Asn1Read, asn1::Asn1Write)]
109-
pub struct PolicyInformation<'a> {
105+
pub struct PolicyInformation<'a, Op: Asn1Operation + 'a> {
110106
pub policy_identifier: asn1::ObjectIdentifier,
111-
pub policy_qualifiers: Option<SequenceOfPolicyQualifiers<'a>>,
107+
pub policy_qualifiers: Option<SequenceOfPolicyQualifiers<'a, Op>>,
112108
}
113109

114110
#[derive(asn1::Asn1Read, asn1::Asn1Write)]
115-
pub struct PolicyQualifierInfo<'a> {
111+
pub struct PolicyQualifierInfo<'a, Op: Asn1Operation> {
116112
pub policy_qualifier_id: asn1::ObjectIdentifier,
117-
pub qualifier: Qualifier<'a>,
113+
pub qualifier: Qualifier<'a, Op>,
118114
}
119115

120116
#[derive(asn1::Asn1Read, asn1::Asn1Write)]
121-
pub enum Qualifier<'a> {
117+
pub enum Qualifier<'a, Op: Asn1Operation> {
122118
CpsUri(asn1::IA5String<'a>),
123-
UserNotice(UserNotice<'a>),
119+
UserNotice(UserNotice<'a, Op>),
124120
}
125121

126122
#[derive(asn1::Asn1Read, asn1::Asn1Write)]
127-
pub struct UserNotice<'a> {
128-
pub notice_ref: Option<NoticeReference<'a>>,
123+
pub struct UserNotice<'a, Op: Asn1Operation> {
124+
pub notice_ref: Option<NoticeReference<'a, Op>>,
129125
pub explicit_text: Option<DisplayText<'a>>,
130126
}
131127

132128
#[derive(asn1::Asn1Read, asn1::Asn1Write)]
133-
pub struct NoticeReference<'a> {
129+
pub struct NoticeReference<'a, Op: Asn1Operation> {
134130
pub organization: DisplayText<'a>,
135-
pub notice_numbers: common::Asn1ReadableOrWritable<
136-
asn1::SequenceOf<'a, asn1::BigUint<'a>>,
137-
asn1::SequenceOfWriter<'a, asn1::BigUint<'a>, Vec<asn1::BigUint<'a>>>,
138-
>,
131+
pub notice_numbers: Op::SequenceOfVec<'a, asn1::BigUint<'a>>,
139132
}
140133

141134
// DisplayText also allows BMPString, which we currently do not support.

src/rust/src/x509/certificate.rs

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -498,7 +498,7 @@ fn parse_display_text<'p>(
498498

499499
fn parse_user_notice<'p>(
500500
py: pyo3::Python<'p>,
501-
un: UserNotice<'_>,
501+
un: UserNotice<'_, Asn1Read>,
502502
) -> CryptographyResult<pyo3::Bound<'p, pyo3::PyAny>> {
503503
let et = match un.explicit_text {
504504
Some(data) => parse_display_text(py, data)?,
@@ -508,7 +508,7 @@ fn parse_user_notice<'p>(
508508
Some(data) => {
509509
let org = parse_display_text(py, data.organization)?;
510510
let numbers = pyo3::types::PyList::empty(py);
511-
for num in data.notice_numbers.unwrap_read().clone() {
511+
for num in data.notice_numbers.clone() {
512512
numbers.append(big_byte_slice_to_py_int(py, num.as_bytes())?)?;
513513
}
514514
types::NOTICE_REFERENCE.get(py)?.call1((org, numbers))?
@@ -520,7 +520,7 @@ fn parse_user_notice<'p>(
520520

521521
fn parse_policy_qualifiers<'a>(
522522
py: pyo3::Python<'a>,
523-
policy_qualifiers: &asn1::SequenceOf<'a, PolicyQualifierInfo<'a>>,
523+
policy_qualifiers: &asn1::SequenceOf<'a, PolicyQualifierInfo<'a, Asn1Read>>,
524524
) -> CryptographyResult<pyo3::Bound<'a, pyo3::PyAny>> {
525525
let py_pq = pyo3::types::PyList::empty(py);
526526
for pqi in policy_qualifiers.clone() {
@@ -556,14 +556,12 @@ fn parse_cp<'p>(
556556
py: pyo3::Python<'p>,
557557
ext: &Extension<'_>,
558558
) -> CryptographyResult<pyo3::Bound<'p, pyo3::PyAny>> {
559-
let cp = ext.value::<asn1::SequenceOf<'_, PolicyInformation<'_>>>()?;
559+
let cp = ext.value::<asn1::SequenceOf<'_, PolicyInformation<'_, Asn1Read>>>()?;
560560
let certificate_policies = pyo3::types::PyList::empty(py);
561561
for policyinfo in cp {
562562
let pi_oid = oid_to_py_oid(py, &policyinfo.policy_identifier)?;
563563
let py_pqis = match policyinfo.policy_qualifiers {
564-
Some(policy_qualifiers) => {
565-
parse_policy_qualifiers(py, policy_qualifiers.unwrap_read())?
566-
}
564+
Some(policy_qualifiers) => parse_policy_qualifiers(py, &policy_qualifiers)?,
567565
None => py.None().into_bound(py),
568566
};
569567
let pi = types::POLICY_INFORMATION
@@ -695,8 +693,8 @@ pub(crate) fn parse_access_descriptions<'p>(
695693
ext: &Extension<'_>,
696694
) -> CryptographyResult<pyo3::Bound<'p, pyo3::PyAny>> {
697695
let ads = pyo3::types::PyList::empty(py);
698-
let parsed = ext.value::<SequenceOfAccessDescriptions<'_>>()?;
699-
for access in parsed.unwrap_read().clone() {
696+
let parsed = ext.value::<SequenceOfAccessDescriptions<'_, Asn1Read>>()?;
697+
for access in parsed {
700698
let py_oid = oid_to_py_oid(py, &access.access_method)?;
701699
let gn = x509::parse_general_name(py, access.access_location)?;
702700
let ad = types::ACCESS_DESCRIPTION.get(py)?.call1((py_oid, gn))?;

src/rust/src/x509/extensions.rs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -275,9 +275,7 @@ fn encode_certificate_policies(
275275
organization: extensions::DisplayText::Utf8String(
276276
asn1::Utf8String::new(py_notice_str),
277277
),
278-
notice_numbers: common::Asn1ReadableOrWritable::new_write(
279-
asn1::SequenceOfWriter::new(notice_numbers),
280-
),
278+
notice_numbers: asn1::SequenceOfWriter::new(notice_numbers),
281279
})
282280
} else {
283281
None
@@ -304,14 +302,12 @@ fn encode_certificate_policies(
304302
};
305303
qualifiers.push(qualifier);
306304
}
307-
Some(common::Asn1ReadableOrWritable::new_write(
308-
asn1::SequenceOfWriter::new(qualifiers),
309-
))
305+
Some(asn1::SequenceOfWriter::new(qualifiers))
310306
} else {
311307
None
312308
};
313309
let py_policy_id = py_policy_info.getattr(pyo3::intern!(py, "policy_identifier"))?;
314-
policy_informations.push(extensions::PolicyInformation {
310+
policy_informations.push(extensions::PolicyInformation::<Asn1Write> {
315311
policy_identifier: py_oid_to_oid(py_policy_id)?,
316312
policy_qualifiers: qualifiers,
317313
});

0 commit comments

Comments
 (0)