keri_core/prefix/
self_signing.rs

1use core::{fmt, str::FromStr};
2
3use cesrox::{
4    conversion::from_text_to_bytes,
5    derivation_code::DerivationCode,
6    primitives::codes::{self_signing::SelfSigning, PrimitiveCode},
7};
8use serde::{Deserialize, Deserializer, Serialize, Serializer};
9
10use super::{error::Error, CesrPrimitive};
11
12/// Self Signing Derivations
13///
14/// A self signing prefix derivation outputs a signature as its derivative (2.3.5)
15#[derive(PartialEq, Clone, Hash, Eq, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
16#[rkyv(compare(PartialEq), derive(Debug))]
17pub enum SelfSigningPrefix {
18    Ed25519Sha512(Vec<u8>),
19    ECDSAsecp256k1Sha256(Vec<u8>),
20    Ed448(Vec<u8>),
21}
22
23impl fmt::Debug for SelfSigningPrefix {
24    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
25        write!(f, "{:?}", self.to_str())
26    }
27}
28
29impl SelfSigningPrefix {
30    pub fn new(code: SelfSigning, signature: Vec<u8>) -> Self {
31        match code {
32            SelfSigning::Ed25519Sha512 => Self::Ed25519Sha512(signature),
33            SelfSigning::ECDSAsecp256k1Sha256 => Self::ECDSAsecp256k1Sha256(signature),
34            SelfSigning::Ed448 => Self::Ed448(signature),
35        }
36    }
37
38    pub fn get_code(&self) -> SelfSigning {
39        match self {
40            SelfSigningPrefix::Ed25519Sha512(_) => SelfSigning::Ed25519Sha512,
41            SelfSigningPrefix::ECDSAsecp256k1Sha256(_) => SelfSigning::ECDSAsecp256k1Sha256,
42            SelfSigningPrefix::Ed448(_) => SelfSigning::Ed448,
43        }
44    }
45}
46
47impl FromStr for SelfSigningPrefix {
48    type Err = Error;
49
50    fn from_str(s: &str) -> Result<Self, Self::Err> {
51        let code = SelfSigning::from_str(s)?;
52
53        if s.len() == code.full_size() {
54            Ok(Self::new(
55                code,
56                from_text_to_bytes(s[code.code_size()..].as_bytes())?[code.code_size()..].to_vec(),
57            ))
58        } else {
59            Err(Error::IncorrectLengthError(s.into()))
60        }
61    }
62}
63
64impl CesrPrimitive for SelfSigningPrefix {
65    fn derivative(&self) -> Vec<u8> {
66        match self {
67            SelfSigningPrefix::Ed25519Sha512(signature)
68            | SelfSigningPrefix::ECDSAsecp256k1Sha256(signature)
69            | SelfSigningPrefix::Ed448(signature) => signature.clone(),
70        }
71    }
72    fn derivation_code(&self) -> PrimitiveCode {
73        PrimitiveCode::SelfSigning(self.get_code())
74    }
75}
76
77/// Serde compatible Serialize
78impl Serialize for SelfSigningPrefix {
79    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
80    where
81        S: Serializer,
82    {
83        serializer.serialize_str(&self.to_str())
84    }
85}
86
87/// Serde compatible Deserialize
88impl<'de> Deserialize<'de> for SelfSigningPrefix {
89    fn deserialize<D>(deserializer: D) -> Result<SelfSigningPrefix, D::Error>
90    where
91        D: Deserializer<'de>,
92    {
93        let s = String::deserialize(deserializer)?;
94
95        SelfSigningPrefix::from_str(&s).map_err(serde::de::Error::custom)
96    }
97}