acme2_eab/
helpers.rs

1use crate::error::*;
2use data_encoding::BASE64URL_NOPAD;
3use openssl::ec::EcGroup;
4use openssl::ec::EcKey;
5use openssl::nid::Nid;
6use openssl::pkey::PKey;
7use openssl::pkey::Private;
8use openssl::rsa::Rsa;
9use serde::Deserialize;
10use serde::Serialize;
11
12/// This is a identifier for a resource that the ACME server
13/// can provision certificates for (a domain).
14#[derive(Deserialize, Serialize, Debug)]
15#[serde(rename_all = "camelCase")]
16pub struct Identifier {
17    /// The type of identifier.
18    pub r#type: String,
19    /// The identifier itself.
20    pub value: String,
21}
22
23pub(crate) fn b64(data: &[u8]) -> String {
24    BASE64URL_NOPAD.encode(data)
25}
26
27/// Generate a new RSA private key using the specified size,
28/// using the system random.
29pub fn gen_rsa_private_key(bits: u32) -> Result<PKey<Private>, Error> {
30    let rsa = Rsa::generate(bits)?;
31    let key = PKey::from_rsa(rsa)?;
32    Ok(key)
33}
34
35/// Generate a new P256 EC private key using the system random.
36pub fn gen_ec_p256_private_key() -> Result<PKey<Private>, Error> {
37    let group = EcGroup::from_curve_name(Nid::X9_62_PRIME256V1).unwrap();
38    let rsa = EcKey::generate(&group)?;
39    let key = PKey::from_ec_key(rsa)?;
40    Ok(key)
41}