pykrete_jsonwebkey/
byte_vec.rs

1use serde::{Deserialize, Serialize};
2use zeroize::Zeroize;
3
4/// A zeroizing-on-drop container for a `Vec<u8>` that deserializes from base64.
5#[derive(Clone, PartialEq, Eq, Zeroize, Serialize, Deserialize)]
6#[zeroize(drop)]
7#[serde(transparent)]
8pub struct ByteVec(#[serde(with = "crate::utils::serde_base64")] Vec<u8>);
9
10impl std::fmt::Debug for ByteVec {
11    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
12        f.write_str(&crate::utils::base64_encode(&self.0))
13    }
14}
15
16impl<T: Into<Vec<u8>>> From<T> for ByteVec {
17    fn from(into_vec: T) -> Self {
18        Self(into_vec.into())
19    }
20}
21
22impl AsRef<[u8]> for ByteVec {
23    fn as_ref(&self) -> &[u8] {
24        &self.0
25    }
26}
27
28impl std::ops::Deref for ByteVec {
29    type Target = [u8];
30    fn deref(&self) -> &Self::Target {
31        &self.0
32    }
33}
34
35#[cfg(test)]
36mod tests {
37    use super::*;
38
39    static BYTES: &[u8] = &[1, 2, 3, 4, 5, 6, 7];
40    static BASE64_JSON: &str = "\"AQIDBAUGBw\"";
41
42    #[test]
43    fn test_serde_byte_vec() {
44        let b64 = serde_json::to_string(&ByteVec(BYTES.to_vec())).unwrap();
45        assert_eq!(b64, BASE64_JSON);
46        let bytes: ByteVec = serde_json::from_str(&b64).unwrap();
47        assert_eq!(bytes.as_ref(), BYTES);
48    }
49}