Skip to content

Commit 2ea1065

Browse files
committed
x509-cert: builder: follow rules from RFC5280 to set certificate's version
Follow the rules from RFC 5280 Section 4.1.2.1 to set the certificate's version depending on the presence of the extensions and identifiers. Signed-off-by: Dmitry Baryshkov <[email protected]>
1 parent c20c098 commit 2ea1065

File tree

2 files changed

+19
-27
lines changed

2 files changed

+19
-27
lines changed

x509-cert/src/builder.rs

+16-14
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,6 @@ impl Profile {
197197
/// ```
198198
/// use der::Decode;
199199
/// use x509_cert::spki::SubjectPublicKeyInfoOwned;
200-
/// use x509_cert::certificate::Version;
201200
/// use x509_cert::builder::{CertificateBuilder, Profile};
202201
/// use x509_cert::name::Name;
203202
/// use x509_cert::serial_number::SerialNumber;
@@ -226,7 +225,6 @@ impl Profile {
226225
/// let mut signer = rsa_signer();
227226
/// let mut builder = CertificateBuilder::new(
228227
/// profile,
229-
/// Version::V3,
230228
/// serial_number,
231229
/// validity,
232230
/// subject,
@@ -248,7 +246,6 @@ where
248246
/// Creates a new certificate builder
249247
pub fn new<Signature>(
250248
profile: Profile,
251-
version: Version,
252249
serial_number: SerialNumber,
253250
mut validity: Validity,
254251
subject: Name,
@@ -270,7 +267,7 @@ where
270267
validity.not_after.rfc5280_adjust_utc_time()?;
271268

272269
let mut tbs = TbsCertificate {
273-
version,
270+
version: Version::V3,
274271
serial_number,
275272
signature: signature_alg,
276273
issuer,
@@ -288,15 +285,13 @@ where
288285
subject_unique_id: None,
289286
};
290287

291-
if tbs.version == Version::V3 {
292-
let extensions = profile.build_extensions(
293-
tbs.subject_public_key_info.owned_to_ref(),
294-
signer_pub.owned_to_ref(),
295-
&tbs,
296-
)?;
297-
if !extensions.is_empty() {
298-
tbs.extensions = Some(extensions);
299-
}
288+
let extensions = profile.build_extensions(
289+
tbs.subject_public_key_info.owned_to_ref(),
290+
signer_pub.owned_to_ref(),
291+
&tbs,
292+
)?;
293+
if !extensions.is_empty() {
294+
tbs.extensions = Some(extensions);
300295
}
301296

302297
Ok(Self { tbs, signer })
@@ -319,11 +314,18 @@ where
319314
}
320315

321316
/// Run the certificate through the signer and build the end certificate.
322-
pub fn build<Signature>(self) -> Result<Certificate>
317+
pub fn build<Signature>(mut self) -> Result<Certificate>
323318
where
324319
S: Signer<Signature>,
325320
Signature: SignatureEncoding,
326321
{
322+
if self.tbs.extensions.is_none() {
323+
if self.tbs.issuer_unique_id.is_some() || self.tbs.subject_unique_id.is_some() {
324+
self.tbs.version = Version::V2;
325+
} else {
326+
self.tbs.version = Version::V1;
327+
}
328+
}
327329
let signature = self.signer.try_sign(&self.tbs.to_der()?)?;
328330
let signature = BitString::from_bytes(signature.to_bytes().as_ref())?;
329331

x509-cert/tests/builder.rs

+3-13
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ use spki::SubjectPublicKeyInfoOwned;
99
use std::{str::FromStr, time::Duration};
1010
use x509_cert::{
1111
builder::{CertificateBuilder, Profile},
12-
certificate::Version,
1312
name::Name,
1413
serial_number::SerialNumber,
1514
time::Validity,
@@ -32,16 +31,9 @@ fn root_ca_certificate() {
3231
SubjectPublicKeyInfoOwned::try_from(RSA_2048_DER_EXAMPLE).expect("get rsa pub key");
3332

3433
let signer = rsa_signer();
35-
let builder = CertificateBuilder::new(
36-
profile,
37-
Version::V3,
38-
serial_number,
39-
validity,
40-
subject,
41-
pub_key,
42-
&signer,
43-
)
44-
.expect("Create certificate");
34+
let builder =
35+
CertificateBuilder::new(profile, serial_number, validity, subject, pub_key, &signer)
36+
.expect("Create certificate");
4537

4638
let certificate = builder.build().unwrap();
4739

@@ -78,7 +70,6 @@ fn sub_ca_certificate() {
7870
let signer = ecdsa_signer();
7971
let builder = CertificateBuilder::new::<ecdsa::Signature<NistP256>>(
8072
profile,
81-
Version::V3,
8273
serial_number,
8374
validity,
8475
subject,
@@ -130,7 +121,6 @@ fn leaf_certificate() {
130121
let signer = ecdsa_signer();
131122
let builder = CertificateBuilder::new::<ecdsa::Signature<NistP256>>(
132123
profile,
133-
Version::V3,
134124
serial_number,
135125
validity,
136126
subject,

0 commit comments

Comments
 (0)