twizzler_security/
flags.rs1use 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] bitflags! {
12 impl CapFlags: u16 {
13 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}