keri_core/prefix/
self_signing.rs1use 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#[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
77impl 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
87impl<'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}