use base64::engine::general_purpose::STANDARD as B64;
use base64::Engine as _;
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct SealedSecret {
pub name: String,
pub version: u32,
pub key_id: String,
pub ciphertext_b64: String,
}
#[derive(Debug, thiserror::Error)]
pub enum SealedError {
#[error("base64 decode failed: {0}")]
Decode(#[from] base64::DecodeError),
#[error("ciphertext invalid length: {0}")]
InvalidLength(usize),
#[error("encryption failed")]
Encrypt,
#[error("decryption failed")]
Decrypt,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct RecipientPublicKey([u8; 32]);
impl RecipientPublicKey {
#[must_use]
pub fn from_bytes(b: [u8; 32]) -> Self {
Self(b)
}
pub fn from_base64(s: &str) -> Result<Self, SealedError> {
let bytes = B64.decode(s)?;
if bytes.len() != 32 {
return Err(SealedError::InvalidLength(bytes.len()));
}
let mut buf = [0u8; 32];
buf.copy_from_slice(&bytes);
Ok(Self(buf))
}
#[must_use]
pub fn to_base64(&self) -> String {
B64.encode(self.0)
}
#[must_use]
pub fn as_bytes(&self) -> &[u8; 32] {
&self.0
}
}