diff --git a/src/rust/src/pkcs7.rs b/src/rust/src/pkcs7.rs index 05f3bec6565a..ae1d15d5ec78 100644 --- a/src/rust/src/pkcs7.rs +++ b/src/rust/src/pkcs7.rs @@ -770,6 +770,7 @@ where cached_extensions: pyo3::sync::PyOnceLock::new(), cached_issuer: pyo3::sync::PyOnceLock::new(), cached_subject: pyo3::sync::PyOnceLock::new(), + cached_public_key: pyo3::sync::PyOnceLock::new(), }, )?)?; diff --git a/src/rust/src/x509/certificate.rs b/src/rust/src/x509/certificate.rs index a63dcc9a970f..fe01e625f13c 100644 --- a/src/rust/src/x509/certificate.rs +++ b/src/rust/src/x509/certificate.rs @@ -43,6 +43,7 @@ pub(crate) struct Certificate { pub(crate) cached_extensions: pyo3::sync::PyOnceLock>, pub(crate) cached_issuer: pyo3::sync::PyOnceLock>, pub(crate) cached_subject: pyo3::sync::PyOnceLock>, + pub(crate) cached_public_key: pyo3::sync::PyOnceLock>, } #[pyo3::pymethods] @@ -80,10 +81,17 @@ impl Certificate { &self, py: pyo3::Python<'p>, ) -> CryptographyResult> { - keys::load_der_public_key_bytes( - py, - self.raw.borrow_dependent().tbs_cert.spki.tlv().full_data(), - ) + Ok(self + .cached_public_key + .get_or_try_init(py, || { + keys::load_der_public_key_bytes( + py, + self.raw.borrow_dependent().tbs_cert.spki.tlv().full_data(), + ) + .map(|v| v.unbind()) + })? + .bind(py) + .clone()) } #[getter] @@ -459,6 +467,7 @@ pub(crate) fn load_der_x509_certificate( cached_extensions: pyo3::sync::PyOnceLock::new(), cached_issuer: pyo3::sync::PyOnceLock::new(), cached_subject: pyo3::sync::PyOnceLock::new(), + cached_public_key: pyo3::sync::PyOnceLock::new(), }) } diff --git a/src/rust/src/x509/ocsp_resp.rs b/src/rust/src/x509/ocsp_resp.rs index 6acb0970f85b..bc1779e6ebc9 100644 --- a/src/rust/src/x509/ocsp_resp.rs +++ b/src/rust/src/x509/ocsp_resp.rs @@ -267,6 +267,7 @@ impl OCSPResponse { cached_extensions: pyo3::sync::PyOnceLock::new(), cached_issuer: pyo3::sync::PyOnceLock::new(), cached_subject: pyo3::sync::PyOnceLock::new(), + cached_public_key: pyo3::sync::PyOnceLock::new(), }, )?)?; }