summaryrefslogtreecommitdiff
path: root/src/rust/src/x509/certificate.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/rust/src/x509/certificate.rs')
-rw-r--r--src/rust/src/x509/certificate.rs28
1 files changed, 18 insertions, 10 deletions
diff --git a/src/rust/src/x509/certificate.rs b/src/rust/src/x509/certificate.rs
index 03d8ae883..3784b1c9a 100644
--- a/src/rust/src/x509/certificate.rs
+++ b/src/rust/src/x509/certificate.rs
@@ -9,13 +9,13 @@ use crate::error::{CryptographyError, CryptographyResult};
use crate::x509::{extensions, sct, sign};
use crate::{exceptions, x509};
use cryptography_x509::common::Asn1ReadableOrWritable;
+use cryptography_x509::extensions::Extension;
use cryptography_x509::extensions::{
AuthorityKeyIdentifier, BasicConstraints, DisplayText, DistributionPoint,
DistributionPointName, MSCertificateTemplate, NameConstraints, PolicyConstraints,
- PolicyInformation, PolicyQualifierInfo, Qualifier, SequenceOfAccessDescriptions,
+ PolicyInformation, PolicyQualifierInfo, Qualifier, RawExtensions, SequenceOfAccessDescriptions,
SequenceOfSubtrees, UserNotice,
};
-use cryptography_x509::extensions::{Extension, Extensions};
use cryptography_x509::{common, name, oid};
use once_cell::sync::Lazy;
use pyo3::{IntoPy, ToPyObject};
@@ -193,9 +193,9 @@ impl Certificate {
let val = self.raw.borrow_value();
let mut tbs_precert = val.tbs_cert.clone();
// Remove the SCT list extension
- match tbs_precert.extensions {
- Some(extensions) => {
- let readable_extensions = extensions.unwrap_read().clone();
+ match val.tbs_cert.extensions() {
+ Ok(Some(extensions)) => {
+ let readable_extensions = extensions.as_raw().unwrap_read().clone();
let ext_count = readable_extensions.len();
let filtered_extensions: Vec<Extension<'_>> = readable_extensions
.filter(|x| x.extn_id != oid::PRECERT_SIGNED_CERTIFICATE_TIMESTAMPS_OID)
@@ -207,18 +207,26 @@ impl Certificate {
),
));
}
- let filtered_extensions: Extensions<'_> = Asn1ReadableOrWritable::new_write(
+ let filtered_extensions: RawExtensions<'_> = Asn1ReadableOrWritable::new_write(
asn1::SequenceOfWriter::new(filtered_extensions),
);
- tbs_precert.extensions = Some(filtered_extensions);
+ tbs_precert.raw_extensions = Some(filtered_extensions);
let result = asn1::write_single(&tbs_precert)?;
Ok(pyo3::types::PyBytes::new(py, &result))
}
- None => Err(CryptographyError::from(
+ Ok(None) => Err(CryptographyError::from(
pyo3::exceptions::PyValueError::new_err(
"Could not find any extensions in TBS certificate",
),
)),
+ Err(oid) => {
+ let oid_obj = oid_to_py_oid(py, &oid)?;
+ Err(exceptions::DuplicateExtension::new_err((
+ format!("Duplicate {} extension found", oid),
+ oid_obj.into_py(py),
+ ))
+ .into())
+ }
}
}
@@ -360,7 +368,7 @@ impl Certificate {
x509::parse_and_cache_extensions(
py,
&mut self.cached_extensions,
- &self.raw.borrow_value().tbs_cert.extensions,
+ &self.raw.borrow_value().tbs_cert.raw_extensions,
|oid, ext_data| match *oid {
oid::PRECERT_POISON_OID => {
asn1::parse_single::<()>(ext_data)?;
@@ -1035,7 +1043,7 @@ fn create_x509_certificate(
spki: asn1::parse_single(spki_bytes)?,
issuer_unique_id: None,
subject_unique_id: None,
- extensions: x509::common::encode_extensions(
+ raw_extensions: x509::common::encode_extensions(
py,
builder.getattr(pyo3::intern!(py, "_extensions"))?,
extensions::encode_extension,