Skip to content

Commit dcc6f92

Browse files
committed
crypto: Implement CertificateBuilder to generate certificates
The CertificateBuilder struct follows the builder pattern to add desired parameters incrementally before generating the certificate. Signed-off-by: Anderson Toshiyuki Sasaki <[email protected]>
1 parent aaff038 commit dcc6f92

File tree

5 files changed

+651
-176
lines changed

5 files changed

+651
-176
lines changed

keylime-agent/src/error.rs

+4
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,10 @@ pub(crate) enum Error {
8989
ListParser(#[from] keylime::list_parser::ListParsingError),
9090
#[error("Zip error: {0}")]
9191
Zip(#[from] zip::result::ZipError),
92+
#[error("Certificate generation error")]
93+
CertificateGeneration(
94+
#[from] keylime::crypto::x509::CertificateBuilderError,
95+
),
9296
#[error("{0}")]
9397
Other(String),
9498
}

keylime-agent/src/main.rs

+15-12
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,10 @@ use futures::{
5555
future::{ok, TryFutureExt},
5656
try_join,
5757
};
58-
use keylime::{crypto, ima::MeasurementList, list_parser::parse_list, tpm};
58+
use keylime::{
59+
crypto, crypto::x509::CertificateBuilder, ima::MeasurementList,
60+
list_parser::parse_list, tpm,
61+
};
5962
use log::*;
6063
use openssl::{
6164
pkey::{PKey, Private, Public},
@@ -586,16 +589,16 @@ async fn main() -> Result<()> {
586589
let mtls_cert;
587590
let ssl_context;
588591
if config.agent.enable_agent_mtls {
589-
let contact_ips = vec![config.agent.contact_ip.clone()];
592+
let contact_ips = vec![config.agent.contact_ip.as_str()];
590593
cert = match config.agent.server_cert.as_ref() {
591594
"" => {
592595
debug!("The server_cert option was not set in the configuration file");
593596

594-
crypto::generate_x509(
595-
&nk_priv,
596-
&agent_uuid,
597-
Some(contact_ips),
598-
)?
597+
crypto::x509::CertificateBuilder::new()
598+
.private_key(&nk_priv)
599+
.common_name(&agent_uuid)
600+
.add_ips(contact_ips)
601+
.build()?
599602
}
600603
path => {
601604
let cert_path = Path::new(&path);
@@ -607,11 +610,11 @@ async fn main() -> Result<()> {
607610
crypto::load_x509_pem(cert_path)?
608611
} else {
609612
debug!("Generating new mTLS certificate");
610-
let cert = crypto::generate_x509(
611-
&nk_priv,
612-
&agent_uuid,
613-
Some(contact_ips),
614-
)?;
613+
let cert = crypto::x509::CertificateBuilder::new()
614+
.private_key(&nk_priv)
615+
.common_name(&agent_uuid)
616+
.add_ips(contact_ips)
617+
.build()?;
615618
// Write the generated certificate
616619
crypto::write_x509(&cert, cert_path)?;
617620
cert

keylime-agent/src/registrar_agent.rs

+18-13
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ pub(crate) async fn do_register_agent(
204204
mod tests {
205205
use super::*;
206206
use crate::crypto;
207+
use keylime::crypto;
207208
use wiremock::matchers::{any, method};
208209
use wiremock::{Mock, MockServer, ResponseTemplate};
209210

@@ -233,12 +234,12 @@ mod tests {
233234

234235
let mock_data = [0u8; 1];
235236
let priv_key = crypto::testing::rsa_generate(2048).unwrap(); //#[allow_ci]
236-
let cert = crypto::generate_x509(
237-
&priv_key,
238-
"uuid",
239-
Some(vec!["1.2.3.4".to_string()]),
240-
)
241-
.unwrap(); //#[allow_ci]
237+
let cert = crypto::x509::CertificateBuilder::new()
238+
.private_key(&priv_key)
239+
.common_name("uuid")
240+
.add_ips(vec!["1.2.3.4"])
241+
.build()
242+
.unwrap(); //#[allow_ci]
242243
let response = do_register_agent(
243244
ip,
244245
port,
@@ -286,12 +287,12 @@ mod tests {
286287

287288
let mock_data = [0u8; 1];
288289
let priv_key = crypto::testing::rsa_generate(2048).unwrap(); //#[allow_ci]
289-
let cert = crypto::generate_x509(
290-
&priv_key,
291-
"uuid",
292-
Some(vec!["1.2.3.4".to_string(), "1.2.3.5".to_string()]),
293-
)
294-
.unwrap(); //#[allow_ci]
290+
let cert = crypto::x509::CertificateBuilder::new()
291+
.private_key(&priv_key)
292+
.common_name("uuid")
293+
.add_ips(vec!["1.2.3.4", "1.2.3.5"])
294+
.build()
295+
.unwrap(); //#[allow_ci]
295296
let response = do_register_agent(
296297
ip,
297298
port,
@@ -335,7 +336,11 @@ mod tests {
335336

336337
let mock_data = [0u8; 1];
337338
let priv_key = crypto::testing::rsa_generate(2048).unwrap(); //#[allow_ci]
338-
let cert = crypto::generate_x509(&priv_key, "uuid", None).unwrap(); //#[allow_ci]
339+
let cert = crypto::x509::CertificateBuilder::new()
340+
.private_key(&priv_key)
341+
.common_name("uuid")
342+
.build()
343+
.unwrap(); //#[allow_ci]
339344
let response = do_register_agent(
340345
ip,
341346
port,

0 commit comments

Comments
 (0)