use base64::{Engine, prelude::BASE64_URL_SAFE_NO_PAD};
use biscuit_auth::{Algorithm, KeyPair, PrivateKey, PublicKey};
use serde::Deserialize;
pub fn deserialize_base64_vec<'de, D>(deserializer: D) -> Result<Vec<u8>, D::Error>
where
D: serde::Deserializer<'de>,
{
let s: &str = Deserialize::deserialize(deserializer)?;
BASE64_URL_SAFE_NO_PAD
.decode(s)
.map_err(serde::de::Error::custom)
}
pub fn deserialize_base64_pubkey<'de, D>(deserializer: D) -> Result<PublicKey, D::Error>
where
D: serde::Deserializer<'de>,
{
let s: &str = Deserialize::deserialize(deserializer)?;
let bytes = BASE64_URL_SAFE_NO_PAD
.decode(s)
.map_err(serde::de::Error::custom)?;
PublicKey::from_bytes(&bytes, Algorithm::Ed25519).map_err(serde::de::Error::custom)
}
pub fn deserialize_base64_keypair<'de, D>(deserializer: D) -> Result<KeyPair, D::Error>
where
D: serde::Deserializer<'de>,
{
let s: &str = Deserialize::deserialize(deserializer)?;
let bytes = BASE64_URL_SAFE_NO_PAD
.decode(s)
.map_err(serde::de::Error::custom)?;
let private =
PrivateKey::from_bytes(&bytes, Algorithm::Ed25519).map_err(serde::de::Error::custom)?;
Ok(KeyPair::from(&private))
}
pub fn serialize_base64_vec<S>(bytes: &Vec<u8>, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
serializer.serialize_str(&BASE64_URL_SAFE_NO_PAD.encode(bytes))
}
pub fn serialize_base64_pubkey<S>(bytes: &PublicKey, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
serializer.serialize_str(&BASE64_URL_SAFE_NO_PAD.encode(bytes.to_bytes()))
}
pub fn serialize_base64_keypair<S>(bytes: &KeyPair, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
serializer.serialize_str(&BASE64_URL_SAFE_NO_PAD.encode(bytes.private().to_bytes()))
}