kanidm_lib_crypto/
serialise.rs

1pub mod pkeyb64 {
2    use base64::{engine::general_purpose, Engine as _};
3    use openssl::pkey::{PKey, Private};
4    use serde::{
5        de::Error as DeError, ser::Error as SerError, Deserialize, Deserializer, Serializer,
6    };
7    use tracing::error;
8
9    pub fn serialize<S>(key: &PKey<Private>, ser: S) -> Result<S::Ok, S::Error>
10    where
11        S: Serializer,
12    {
13        let der = key.private_key_to_der().map_err(|err| {
14            error!(?err, "openssl private_key_to_der");
15            S::Error::custom("openssl private_key_to_der")
16        })?;
17        let s = general_purpose::URL_SAFE_NO_PAD.encode(der);
18
19        ser.serialize_str(&s)
20    }
21
22    pub fn deserialize<'de, D>(des: D) -> Result<PKey<Private>, D::Error>
23    where
24        D: Deserializer<'de>,
25    {
26        let raw = <&str>::deserialize(des)?;
27        let s = general_purpose::URL_SAFE_NO_PAD
28            .decode(raw)
29            .or_else(|_| general_purpose::URL_SAFE.decode(raw))
30            .map_err(|err| {
31                error!(?err, "base64 url-safe invalid");
32                D::Error::custom("base64 url-safe invalid")
33            })?;
34
35        PKey::private_key_from_der(&s).map_err(|err| {
36            error!(?err, "openssl pkey invalid der");
37            D::Error::custom("openssl pkey invalid der")
38        })
39    }
40}
41
42pub mod x509b64 {
43    use crate::CryptoError;
44    use base64::{engine::general_purpose, Engine as _};
45    use openssl::x509::X509;
46    use serde::{
47        de::Error as DeError, ser::Error as SerError, Deserialize, Deserializer, Serializer,
48    };
49    use tracing::error;
50
51    pub fn cert_to_string(cert: &X509) -> Result<String, CryptoError> {
52        cert.to_der()
53            .map_err(|err| {
54                error!(?err, "openssl cert to_der");
55                err.into()
56            })
57            .map(|der| general_purpose::URL_SAFE.encode(der))
58    }
59
60    pub fn serialize<S>(cert: &X509, ser: S) -> Result<S::Ok, S::Error>
61    where
62        S: Serializer,
63    {
64        let der = cert.to_der().map_err(|err| {
65            error!(?err, "openssl cert to_der");
66            S::Error::custom("openssl private_key_to_der")
67        })?;
68        let s = general_purpose::URL_SAFE_NO_PAD.encode(der);
69
70        ser.serialize_str(&s)
71    }
72
73    pub fn deserialize<'de, D>(des: D) -> Result<X509, D::Error>
74    where
75        D: Deserializer<'de>,
76    {
77        let raw = <&str>::deserialize(des)?;
78        let s = general_purpose::URL_SAFE_NO_PAD
79            .decode(raw)
80            .or_else(|_| general_purpose::URL_SAFE.decode(raw))
81            .map_err(|err| {
82                error!(?err, "base64 url-safe invalid");
83                D::Error::custom("base64 url-safe invalid")
84            })?;
85
86        X509::from_der(&s).map_err(|err| {
87            error!(?err, "openssl x509 invalid der");
88            D::Error::custom("openssl x509 invalid der")
89        })
90    }
91}