Skip to content

Commit e1b9561

Browse files
committed
Inline CSR serialization
1 parent 4726abc commit e1b9561

File tree

1 file changed

+38
-40
lines changed

1 file changed

+38
-40
lines changed

rcgen/src/certificate.rs

Lines changed: 38 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use pem::Pem;
66
use pki_types::{CertificateDer, CertificateSigningRequestDer};
77
use time::{Date, Month, OffsetDateTime, PrimitiveDateTime, Time};
88
use yasna::models::ObjectIdentifier;
9-
use yasna::{DERWriter, DERWriterSeq, Tag};
9+
use yasna::{DERWriter, Tag};
1010

1111
use crate::crl::CrlDistributionPoint;
1212
use crate::csr::CertificateSigningRequest;
@@ -480,14 +480,6 @@ impl CertificateParams {
480480
&self,
481481
subject_key: &KeyPair,
482482
) -> Result<CertificateSigningRequest, Error> {
483-
subject_key
484-
.sign_der(|writer| self.write_request(subject_key, writer))
485-
.map(|der| CertificateSigningRequest {
486-
der: CertificateSigningRequestDer::from(der),
487-
})
488-
}
489-
490-
fn write_request(&self, pub_key: &KeyPair, writer: &mut DERWriterSeq) -> Result<(), Error> {
491483
// No .. pattern, we use this to ensure every field is used
492484
#[deny(unused)]
493485
let Self {
@@ -523,40 +515,46 @@ impl CertificateParams {
523515
return Err(Error::UnsupportedInCsr);
524516
}
525517

526-
// Write version
527-
writer.next().write_u8(0);
528-
// Write subject name
529-
write_distinguished_name(writer.next(), distinguished_name);
530-
// Write subjectPublicKeyInfo
531-
pub_key.serialize_public_key_der(writer.next());
532-
// Write extensions
533-
// According to the spec in RFC 2986, even if attributes are empty we need the empty attribute tag
534-
writer.next().write_tagged(Tag::context(0), |writer| {
535-
if !subject_alt_names.is_empty() || !custom_extensions.is_empty() {
536-
writer.write_sequence(|writer| {
537-
let oid = ObjectIdentifier::from_slice(oid::PKCS_9_AT_EXTENSION_REQUEST);
538-
writer.next().write_oid(&oid);
539-
writer.next().write_set(|writer| {
540-
writer.next().write_sequence(|writer| {
541-
// Write subject_alt_names
542-
self.write_subject_alt_names(writer.next());
543-
544-
// Write custom extensions
545-
for ext in custom_extensions {
546-
write_x509_extension(
547-
writer.next(),
548-
&ext.oid,
549-
ext.critical,
550-
|writer| writer.write_der(ext.content()),
551-
);
552-
}
518+
let der = subject_key.sign_der(|writer| {
519+
// Write version
520+
writer.next().write_u8(0);
521+
// Write subject name
522+
write_distinguished_name(writer.next(), distinguished_name);
523+
// Write subjectPublicKeyInfo
524+
subject_key.serialize_public_key_der(writer.next());
525+
// Write extensions
526+
// According to the spec in RFC 2986, even if attributes are empty we need the empty attribute tag
527+
writer.next().write_tagged(Tag::context(0), |writer| {
528+
if !subject_alt_names.is_empty() || !custom_extensions.is_empty() {
529+
writer.write_sequence(|writer| {
530+
let oid = ObjectIdentifier::from_slice(oid::PKCS_9_AT_EXTENSION_REQUEST);
531+
writer.next().write_oid(&oid);
532+
writer.next().write_set(|writer| {
533+
writer.next().write_sequence(|writer| {
534+
// Write subject_alt_names
535+
self.write_subject_alt_names(writer.next());
536+
537+
// Write custom extensions
538+
for ext in custom_extensions {
539+
write_x509_extension(
540+
writer.next(),
541+
&ext.oid,
542+
ext.critical,
543+
|writer| writer.write_der(ext.content()),
544+
);
545+
}
546+
});
553547
});
554548
});
555-
});
556-
}
557-
});
549+
}
550+
});
551+
552+
Ok(())
553+
})?;
558554

559-
Ok(())
555+
Ok(CertificateSigningRequest {
556+
der: CertificateSigningRequestDer::from(der),
557+
})
560558
}
561559
pub(crate) fn serialize_der_with_signer<K: PublicKeyData>(
562560
&self,

0 commit comments

Comments
 (0)