use adk_core::AdkError;
pub struct EncryptionKey {
bytes: [u8; 32],
}
impl std::fmt::Debug for EncryptionKey {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("EncryptionKey").field("bytes", &"[REDACTED]").finish()
}
}
impl EncryptionKey {
pub fn generate() -> Self {
use rand::Rng;
let bytes: [u8; 32] = rand::rng().random();
Self { bytes }
}
pub fn from_env(var_name: &str) -> adk_core::Result<Self> {
use base64::Engine;
let raw = std::env::var(var_name).map_err(|_| {
AdkError::session(format!("environment variable {var_name} is not set"))
})?;
let decoded = base64::engine::general_purpose::STANDARD
.decode(&raw)
.map_err(|e| AdkError::session(format!("invalid base64 in {var_name}: {e}")))?;
let len = decoded.len();
if len != 32 {
return Err(AdkError::session(format!(
"{var_name} decoded to {len} bytes, expected 32"
)));
}
let mut bytes = [0u8; 32];
bytes.copy_from_slice(&decoded);
Ok(Self { bytes })
}
pub fn from_bytes(bytes: &[u8]) -> adk_core::Result<Self> {
let len = bytes.len();
if len != 32 {
return Err(AdkError::session(format!(
"encryption key must be exactly 32 bytes, got {len}"
)));
}
let mut arr = [0u8; 32];
arr.copy_from_slice(bytes);
Ok(Self { bytes: arr })
}
pub fn as_bytes(&self) -> &[u8; 32] {
&self.bytes
}
}