Skip to main content
This is unreleased documentation for the main (development) branch of crypto-glue.

crypto_glue/x509/
serialise.rs

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