Skip to content

Commit c944c94

Browse files
committed
Unbundle params from output types
1 parent ff67669 commit c944c94

File tree

10 files changed

+127
-159
lines changed

10 files changed

+127
-159
lines changed

rcgen/examples/sign-leaf-with-ca.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ use time::{Duration, OffsetDateTime};
66

77
/// Example demonstrating signing end-entity certificate with ca
88
fn main() {
9-
let (ca, ca_key) = new_ca();
10-
let end_entity = new_end_entity(&ca, &ca_key);
9+
let (ca_params, ca, ca_key) = new_ca();
10+
let end_entity = new_end_entity(&ca_params, &ca_key);
1111

1212
let end_entity_pem = end_entity.pem();
1313
println!("directly signed end-entity certificate: {end_entity_pem}");
@@ -16,7 +16,7 @@ fn main() {
1616
println!("ca certificate: {ca_cert_pem}");
1717
}
1818

19-
fn new_ca() -> (Certificate, KeyPair) {
19+
fn new_ca() -> (CertificateParams, Certificate, KeyPair) {
2020
let mut params =
2121
CertificateParams::new(Vec::default()).expect("empty subject alt name can't produce error");
2222
let (yesterday, tomorrow) = validity_period();
@@ -36,10 +36,11 @@ fn new_ca() -> (Certificate, KeyPair) {
3636
params.not_after = tomorrow;
3737

3838
let key_pair = KeyPair::generate().unwrap();
39-
(params.self_signed(&key_pair).unwrap(), key_pair)
39+
let cert = params.self_signed(&key_pair).unwrap();
40+
(params, cert, key_pair)
4041
}
4142

42-
fn new_end_entity(ca: &Certificate, ca_key: &KeyPair) -> Certificate {
43+
fn new_end_entity(ca: &CertificateParams, ca_key: &KeyPair) -> Certificate {
4344
let name = "entity.other.host";
4445
let mut params = CertificateParams::new(vec![name.into()]).expect("we know the name is valid");
4546
let (yesterday, tomorrow) = validity_period();

rcgen/src/certificate.rs

Lines changed: 15 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -24,22 +24,18 @@ use crate::{
2424
/// An issued certificate together with the parameters used to generate it.
2525
#[derive(Debug, Clone)]
2626
pub struct Certificate {
27-
pub(crate) params: CertificateParams,
2827
pub(crate) der: CertificateDer<'static>,
2928
}
3029

3130
impl Certificate {
32-
/// Returns the certificate parameters
33-
pub fn params(&self) -> &CertificateParams {
34-
&self.params
35-
}
3631
/// Get the certificate in DER encoded format.
3732
///
3833
/// [`CertificateDer`] implements `Deref<Target = [u8]>` and `AsRef<[u8]>`, so you can easily
3934
/// extract the DER bytes from the return value.
4035
pub fn der(&self) -> &CertificateDer<'static> {
4136
&self.der
4237
}
38+
4339
/// Get the certificate in PEM encoded format.
4440
#[cfg(feature = "pem")]
4541
pub fn pem(&self) -> String {
@@ -53,12 +49,6 @@ impl From<Certificate> for CertificateDer<'static> {
5349
}
5450
}
5551

56-
impl AsRef<CertificateParams> for Certificate {
57-
fn as_ref(&self) -> &CertificateParams {
58-
&self.params
59-
}
60-
}
61-
6252
/// Parameters used for certificate generation
6353
#[allow(missing_docs)]
6454
#[non_exhaustive]
@@ -148,36 +138,38 @@ impl CertificateParams {
148138
/// The returned [`Certificate`] may be serialized using [`Certificate::der`] and
149139
/// [`Certificate::pem`].
150140
pub fn signed_by(
151-
self,
141+
&self,
152142
public_key: &impl PublicKeyData,
153-
issuer: &Certificate,
143+
issuer: &CertificateParams,
154144
issuer_key: &impl SigningKey,
155145
) -> Result<Certificate, Error> {
156146
let issuer = Issuer {
157-
distinguished_name: &issuer.params.distinguished_name,
158-
key_identifier_method: &issuer.params.key_identifier_method,
159-
key_usages: &issuer.params.key_usages,
147+
distinguished_name: &issuer.distinguished_name,
148+
key_identifier_method: &issuer.key_identifier_method,
149+
key_usages: &issuer.key_usages,
160150
key_pair: issuer_key,
161151
};
162152

163-
let der = self.serialize_der_with_signer(public_key, issuer)?;
164-
Ok(Certificate { params: self, der })
153+
Ok(Certificate {
154+
der: self.serialize_der_with_signer(public_key, issuer)?,
155+
})
165156
}
166157

167158
/// Generates a new self-signed certificate from the given parameters.
168159
///
169160
/// The returned [`Certificate`] may be serialized using [`Certificate::der`] and
170161
/// [`Certificate::pem`].
171-
pub fn self_signed(self, key_pair: &impl SigningKey) -> Result<Certificate, Error> {
162+
pub fn self_signed(&self, key_pair: &impl SigningKey) -> Result<Certificate, Error> {
172163
let issuer = Issuer {
173164
distinguished_name: &self.distinguished_name,
174165
key_identifier_method: &self.key_identifier_method,
175166
key_usages: &self.key_usages,
176167
key_pair,
177168
};
178169

179-
let der = self.serialize_der_with_signer(key_pair, issuer)?;
180-
Ok(Certificate { params: self, der })
170+
Ok(Certificate {
171+
der: self.serialize_der_with_signer(key_pair, issuer)?,
172+
})
181173
}
182174

183175
/// Calculates a subject key identifier for the certificate subject's public key.
@@ -1481,9 +1473,8 @@ PITGdT9dgN88nHPCle0B1+OY+OZ5
14811473
);
14821474

14831475
let ca_kp = KeyPair::from_pem(ca_key).unwrap();
1484-
let key_id = params.key_identifier(&ca_kp);
14851476
let ca_cert = params.self_signed(&ca_kp).unwrap();
1486-
assert_eq!(&ca_ski, &key_id);
1477+
assert_eq!(ca_ski, params.key_identifier(&ca_kp));
14871478

14881479
let (_, x509_ca) = x509_parser::parse_x509_certificate(ca_cert.der()).unwrap();
14891480
assert_eq!(
@@ -1502,7 +1493,7 @@ PITGdT9dgN88nHPCle0B1+OY+OZ5
15021493
let ee_key = KeyPair::generate().unwrap();
15031494
let mut ee_params = CertificateParams::default();
15041495
ee_params.use_authority_key_identifier_extension = true;
1505-
let ee_cert = ee_params.signed_by(&ee_key, &ca_cert, &ee_key).unwrap();
1496+
let ee_cert = ee_params.signed_by(&ee_key, &params, &ee_key).unwrap();
15061497

15071498
let (_, x509_ee) = x509_parser::parse_x509_certificate(ee_cert.der()).unwrap();
15081499
assert_eq!(

rcgen/src/crl.rs

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use crate::key_pair::sign_der;
1010
use crate::ENCODE_CONFIG;
1111
use crate::{
1212
oid, write_distinguished_name, write_dt_utc_or_generalized,
13-
write_x509_authority_key_identifier, write_x509_extension, Certificate, Error, Issuer,
13+
write_x509_authority_key_identifier, write_x509_extension, CertificateParams, Error, Issuer,
1414
KeyIdMethod, KeyUsagePurpose, SerialNumber, SigningKey,
1515
};
1616

@@ -62,20 +62,14 @@ use crate::{
6262
/// key_identifier_method: KeyIdMethod::Sha256,
6363
/// #[cfg(not(feature = "crypto"))]
6464
/// key_identifier_method: KeyIdMethod::PreSpecified(vec![]),
65-
/// }.signed_by(&issuer, &key_pair).unwrap();
65+
/// }.signed_by(&issuer_params, &key_pair).unwrap();
6666
///# }
6767
#[derive(Debug)]
6868
pub struct CertificateRevocationList {
69-
params: CertificateRevocationListParams,
7069
der: CertificateRevocationListDer<'static>,
7170
}
7271

7372
impl CertificateRevocationList {
74-
/// Returns the certificate revocation list (CRL) parameters.
75-
pub fn params(&self) -> &CertificateRevocationListParams {
76-
&self.params
77-
}
78-
7973
/// Get the CRL in PEM encoded format.
8074
#[cfg(feature = "pem")]
8175
pub fn pem(&self) -> Result<String, Error> {
@@ -191,18 +185,18 @@ impl CertificateRevocationListParams {
191185
///
192186
/// Including a signature from the issuing certificate authority's key.
193187
pub fn signed_by(
194-
self,
195-
issuer: &Certificate,
188+
&self,
189+
issuer: &CertificateParams,
196190
issuer_key: &impl SigningKey,
197191
) -> Result<CertificateRevocationList, Error> {
198192
if self.next_update.le(&self.this_update) {
199193
return Err(Error::InvalidCrlNextUpdate);
200194
}
201195

202196
let issuer = Issuer {
203-
distinguished_name: &issuer.params.distinguished_name,
204-
key_identifier_method: &issuer.params.key_identifier_method,
205-
key_usages: &issuer.params.key_usages,
197+
distinguished_name: &issuer.distinguished_name,
198+
key_identifier_method: &issuer.key_identifier_method,
199+
key_usages: &issuer.key_usages,
206200
key_pair: issuer_key,
207201
};
208202

@@ -212,7 +206,6 @@ impl CertificateRevocationListParams {
212206

213207
Ok(CertificateRevocationList {
214208
der: self.serialize_der(issuer)?.into(),
215-
params: self,
216209
})
217210
}
218211

rcgen/src/csr.rs

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -201,24 +201,21 @@ impl CertificateSigningRequestParams {
201201
/// The returned [`Certificate`] may be serialized using [`Certificate::der`] and
202202
/// [`Certificate::pem`].
203203
pub fn signed_by(
204-
self,
205-
issuer: &Certificate,
204+
&self,
205+
issuer: &CertificateParams,
206206
issuer_key: &impl SigningKey,
207207
) -> Result<Certificate, Error> {
208208
let issuer = Issuer {
209-
distinguished_name: &issuer.params.distinguished_name,
210-
key_identifier_method: &issuer.params.key_identifier_method,
211-
key_usages: &issuer.params.key_usages,
209+
distinguished_name: &issuer.distinguished_name,
210+
key_identifier_method: &issuer.key_identifier_method,
211+
key_usages: &issuer.key_usages,
212212
key_pair: issuer_key,
213213
};
214214

215-
let der = self
216-
.params
217-
.serialize_der_with_signer(&self.public_key, issuer)?;
218-
219215
Ok(Certificate {
220-
params: self.params,
221-
der,
216+
der: self
217+
.params
218+
.serialize_der_with_signer(&self.public_key, issuer)?,
222219
})
223220
}
224221
}

rcgen/tests/botan.rs

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -128,9 +128,9 @@ fn test_botan_rsa_given() {
128128

129129
#[test]
130130
fn test_botan_separate_ca() {
131-
let (mut params, ca_key) = default_params();
132-
params.is_ca = IsCa::Ca(BasicConstraints::Unconstrained);
133-
let ca_cert = params.self_signed(&ca_key).unwrap();
131+
let (mut ca_params, ca_key) = default_params();
132+
ca_params.is_ca = IsCa::Ca(BasicConstraints::Unconstrained);
133+
let ca_cert = ca_params.self_signed(&ca_key).unwrap();
134134

135135
let mut params = CertificateParams::new(vec!["crabs.crabs".to_string()]).unwrap();
136136
params
@@ -143,7 +143,7 @@ fn test_botan_separate_ca() {
143143
params.not_after = rcgen::date_time_ymd(3016, 1, 1);
144144

145145
let key_pair = KeyPair::generate().unwrap();
146-
let cert = params.signed_by(&key_pair, &ca_cert, &ca_key).unwrap();
146+
let cert = params.signed_by(&key_pair, &ca_params, &ca_key).unwrap();
147147
check_cert_ca(cert.der(), &cert, ca_cert.der());
148148
}
149149

@@ -157,7 +157,6 @@ fn test_botan_imported_ca() {
157157
let ca_cert_der = ca_cert.der();
158158

159159
let imported_ca_cert_params = CertificateParams::from_ca_cert_der(ca_cert_der).unwrap();
160-
let imported_ca_cert = imported_ca_cert_params.self_signed(&ca_key).unwrap();
161160

162161
let mut params = CertificateParams::new(vec!["crabs.crabs".to_string()]).unwrap();
163162
params
@@ -171,7 +170,7 @@ fn test_botan_imported_ca() {
171170

172171
let key_pair = KeyPair::generate().unwrap();
173172
let cert = params
174-
.signed_by(&key_pair, &imported_ca_cert, &ca_key)
173+
.signed_by(&key_pair, &imported_ca_cert_params, &ca_key)
175174
.unwrap();
176175
check_cert_ca(cert.der(), &cert, ca_cert_der);
177176
}
@@ -190,9 +189,6 @@ fn test_botan_imported_ca_with_printable_string() {
190189
let ca_cert_der = ca_cert.der();
191190

192191
let imported_ca_cert_params = CertificateParams::from_ca_cert_der(ca_cert_der).unwrap();
193-
let imported_ca_cert = imported_ca_cert_params
194-
.self_signed(&imported_ca_key)
195-
.unwrap();
196192

197193
let mut params = CertificateParams::new(vec!["crabs.crabs".to_string()]).unwrap();
198194
params
@@ -205,7 +201,7 @@ fn test_botan_imported_ca_with_printable_string() {
205201
params.not_after = rcgen::date_time_ymd(3016, 1, 1);
206202
let key_pair = KeyPair::generate().unwrap();
207203
let cert = params
208-
.signed_by(&key_pair, &imported_ca_cert, &imported_ca_key)
204+
.signed_by(&key_pair, &imported_ca_cert_params, &imported_ca_key)
209205
.unwrap();
210206

211207
check_cert_ca(cert.der(), &cert, ca_cert_der);
@@ -223,7 +219,6 @@ fn test_botan_crl_parse() {
223219
KeyUsagePurpose::CrlSign,
224220
];
225221
let issuer_key = KeyPair::generate_for(alg).unwrap();
226-
let issuer = issuer.self_signed(&issuer_key).unwrap();
227222

228223
// Create an end entity cert issued by the issuer.
229224
let (mut ee, _) = util::default_params();
@@ -232,8 +227,8 @@ fn test_botan_crl_parse() {
232227
// Botan has a sanity check that enforces a maximum expiration date
233228
ee.not_after = rcgen::date_time_ymd(3016, 1, 1);
234229
let ee_key = KeyPair::generate_for(alg).unwrap();
235-
let ee = ee.signed_by(&ee_key, &issuer, &issuer_key).unwrap();
236-
let botan_ee = botan::Certificate::load(ee.der()).unwrap();
230+
let ee_cert = ee.signed_by(&ee_key, &issuer, &issuer_key).unwrap();
231+
let botan_ee = botan::Certificate::load(ee_cert.der()).unwrap();
237232

238233
// Generate a CRL with the issuer that revokes the EE cert.
239234
let now = OffsetDateTime::now_utc();
@@ -243,7 +238,7 @@ fn test_botan_crl_parse() {
243238
crl_number: rcgen::SerialNumber::from(1234),
244239
issuing_distribution_point: None,
245240
revoked_certs: vec![RevokedCertParams {
246-
serial_number: ee.params().serial_number.clone().unwrap(),
241+
serial_number: ee.serial_number.clone().unwrap(),
247242
revocation_time: now,
248243
reason_code: Some(RevocationReason::KeyCompromise),
249244
invalidity_date: None,

rcgen/tests/generic.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ mod test_x509_custom_ext {
107107
assert_eq!(favorite_drink_ext.value, test_ext);
108108

109109
// Generate a CSR with the custom extension, parse it with x509-parser.
110-
let test_cert_csr = test_cert.params().serialize_request(&test_key).unwrap();
110+
let test_cert_csr = params.serialize_request(&test_key).unwrap();
111111
let (_, x509_csr) = X509CertificationRequest::from_der(test_cert_csr.der()).unwrap();
112112

113113
// We should find that the CSR contains requested extensions.
@@ -204,8 +204,8 @@ mod test_x509_parser_crl {
204204
#[test]
205205
fn parse_crl() {
206206
// Create a CRL with one revoked cert, and an issuer to sign the CRL.
207-
let (crl, issuer) = util::test_crl();
208-
let revoked_cert = crl.params().revoked_certs.first().unwrap();
207+
let (crl_params, crl, issuer) = util::test_crl();
208+
let revoked_cert = crl_params.revoked_certs.first().unwrap();
209209
let revoked_cert_serial = BigUint::from_bytes_be(revoked_cert.serial_number.as_ref());
210210
let (_, x509_issuer) = X509Certificate::from_der(issuer.der()).unwrap();
211211

@@ -218,17 +218,17 @@ mod test_x509_parser_crl {
218218
assert_eq!(x509_crl.issuer(), x509_issuer.subject());
219219
assert_eq!(
220220
x509_crl.last_update().to_datetime().unix_timestamp(),
221-
crl.params().this_update.unix_timestamp()
221+
crl_params.this_update.unix_timestamp()
222222
);
223223
assert_eq!(
224224
x509_crl
225225
.next_update()
226226
.unwrap()
227227
.to_datetime()
228228
.unix_timestamp(),
229-
crl.params().next_update.unix_timestamp()
229+
crl_params.next_update.unix_timestamp()
230230
);
231-
let crl_number = BigUint::from_bytes_be(crl.params().crl_number.as_ref());
231+
let crl_number = BigUint::from_bytes_be(crl_params.crl_number.as_ref());
232232
assert_eq!(x509_crl.crl_number().unwrap(), &crl_number);
233233

234234
// We should find the expected revoked certificate serial with the correct reason code.

0 commit comments

Comments
 (0)