wire_e2e_identity/acme/
certificate.rs1use rusty_jwt_tools::prelude::{JwsAlgorithm, Pem};
2use x509_cert::{Certificate, der::Decode as _};
3
4use crate::acme::{AcmeAccount, AcmeFinalize, AcmeJws, AcmeOrder, RustyAcme, RustyAcmeError, RustyAcmeResult};
5
6impl RustyAcme {
7 pub fn certificate_req(
10 finalize: &AcmeFinalize,
11 account: &AcmeAccount,
12 alg: JwsAlgorithm,
13 kp: &Pem,
14 previous_nonce: String,
15 ) -> RustyAcmeResult<AcmeJws> {
16 let acct_url = account.acct_url()?;
18
19 let payload = None::<serde_json::Value>;
21 let req = AcmeJws::new(alg, previous_nonce, &finalize.certificate, Some(&acct_url), payload, kp)?;
22 Ok(req)
23 }
24
25 pub fn certificate_response(response: String, order: AcmeOrder) -> RustyAcmeResult<Vec<Certificate>> {
27 order.verify()?;
28 let pems: Vec<pem::Pem> = pem::parse_many(response)?;
29
30 if pems.is_empty() {
35 return Err(RustyAcmeError::SmallstepImplementationError(
36 "the ACME server response contains no certificates",
37 ));
38 }
39
40 let mut certs = Vec::with_capacity(pems.len());
41 for pem in pems {
42 certs.push(Certificate::from_der(pem.contents())?);
43 }
44 Ok(certs)
45 }
46}