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#[derive(Deserialize, Serialize, Debug)]
15#[serde(rename_all = "camelCase")]
16pub struct Identifier {
17 pub r#type: String,
19 pub value: String,
21}
22
23pub(crate) fn b64(data: &[u8]) -> String {
24 BASE64URL_NOPAD.encode(data)
25}
26
27pub 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
35pub 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}