twizzler_security/
flags.rs

1use core::fmt::{Debug, Display};
2
3use bitflags::bitflags;
4
5use crate::SecurityError;
6
7#[derive(PartialEq, Copy, Clone, Eq, Ord, PartialOrd)]
8pub struct CapFlags(u16);
9
10#[rustfmt::skip] // so the bits are all nice and neat
11bitflags! {
12    impl CapFlags: u16 {
13        //NOTE: flags here indicate which algorithm was used for hashing
14        const Blake3 =   1;
15        const Sha256 = 2;
16    }
17}
18
19impl Display for CapFlags {
20    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
21        f.write_str("CapFlags {")?;
22        for flag in self.iter() {
23            match flag {
24                CapFlags::Blake3 => f.write_str(" Blake3 ")?,
25                CapFlags::Sha256 => f.write_str(" SHA256 ")?,
26                _ => (),
27            };
28        }
29
30        f.write_str("}")?;
31
32        Ok(())
33    }
34}
35
36impl Debug for CapFlags {
37    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
38        f.debug_set().entries(self.iter()).finish()
39    }
40}
41
42#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Default)]
43pub enum SigningScheme {
44    #[default]
45    Ecdsa,
46}
47
48#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Default)]
49pub enum HashingAlgo {
50    #[default]
51    Blake3,
52    Sha256,
53}
54
55impl TryFrom<CapFlags> for HashingAlgo {
56    type Error = SecurityError;
57    fn try_from(value: CapFlags) -> Result<Self, Self::Error> {
58        let mut result = None;
59
60        for flag in value.iter() {
61            if let Some(algo) = match flag {
62                CapFlags::Sha256 => Some(HashingAlgo::Sha256),
63                CapFlags::Blake3 => Some(HashingAlgo::Blake3),
64                _ => None,
65            } {
66                if result.is_some() {
67                    return Err(SecurityError::InvalidScheme);
68                }
69
70                result = Some(algo);
71            }
72        }
73
74        result.ok_or(SecurityError::InvalidScheme)
75    }
76}
77
78impl From<HashingAlgo> for CapFlags {
79    fn from(value: HashingAlgo) -> Self {
80        match value {
81            HashingAlgo::Blake3 => CapFlags::Blake3,
82            HashingAlgo::Sha256 => CapFlags::Sha256,
83        }
84    }
85}