keri_core/prefix/
cesr_adapter.rs

1use cesrox::primitives::{
2    codes::attached_signature_code::{AttachedSignatureCode, Index as CesrIndex},
3    CesrPrimitive, Digest, Identifier, IdentifierCode, IndexedSignature as CesrIndexedSignature,
4    PublicKey, Signature,
5};
6use said::SelfAddressingIdentifier;
7
8use crate::{
9    event::sections::seal::{EventSeal, SourceSeal},
10    prefix::{BasicPrefix, IdentifierPrefix, IndexedSignature, SelfSigningPrefix},
11};
12
13use super::attached_signature::Index;
14
15impl From<CesrIndexedSignature> for IndexedSignature {
16    fn from((code, value): CesrIndexedSignature) -> Self {
17        match code.index {
18            CesrIndex::BothSame(i) => {
19                IndexedSignature::new_both_same(SelfSigningPrefix::new(code.code, value), i)
20            }
21            CesrIndex::Dual(i, pi) => {
22                IndexedSignature::new_both_diffrent(SelfSigningPrefix::new(code.code, value), i, pi)
23            }
24            CesrIndex::BigDual(i, pi) => {
25                IndexedSignature::new_both_diffrent(SelfSigningPrefix::new(code.code, value), i, pi)
26            }
27            CesrIndex::CurrentOnly(i) => {
28                IndexedSignature::new_current_only(SelfSigningPrefix::new(code.code, value), i)
29            }
30            CesrIndex::BigCurrentOnly(i) => {
31                IndexedSignature::new_current_only(SelfSigningPrefix::new(code.code, value), i)
32            }
33        }
34    }
35}
36
37impl From<CesrIndex> for Index {
38    fn from(value: CesrIndex) -> Self {
39        match value {
40            CesrIndex::BothSame(i) => Index::BothSame(i),
41            CesrIndex::Dual(i, pi) | CesrIndex::BigDual(i, pi) => Index::BothDifferent(i, pi),
42            CesrIndex::CurrentOnly(i) | CesrIndex::BigCurrentOnly(i) => Index::CurrentOnly(i),
43        }
44    }
45}
46
47impl From<PublicKey> for BasicPrefix {
48    fn from(pk: PublicKey) -> Self {
49        BasicPrefix::new(pk.0, crate::keys::PublicKey::new(pk.1))
50    }
51}
52
53impl From<Signature> for SelfSigningPrefix {
54    fn from((code, value): Signature) -> Self {
55        SelfSigningPrefix::new(code, value)
56    }
57}
58
59impl From<(u64, Digest)> for SourceSeal {
60    fn from((sn, digest): (u64, Digest)) -> Self {
61        SourceSeal {
62            sn,
63            digest: digest.into(),
64        }
65    }
66}
67
68impl From<(Digest, u64, Digest)> for EventSeal {
69    fn from((identifier, sn, digest): (Digest, u64, Digest)) -> Self {
70        let said: SelfAddressingIdentifier = identifier.into();
71        let digest_said: SelfAddressingIdentifier = digest.into();
72        EventSeal::new(
73            IdentifierPrefix::SelfAddressing(said.into()),
74            sn,
75            digest_said.into(),
76        )
77    }
78}
79
80impl From<(PublicKey, u64, Digest)> for EventSeal {
81    fn from((identifier, sn, digest): (PublicKey, u64, Digest)) -> Self {
82        let digest_said: SelfAddressingIdentifier = digest.into();
83        EventSeal::new(
84            IdentifierPrefix::Basic(identifier.into()),
85            sn,
86            digest_said.into(),
87        )
88    }
89}
90
91impl From<Identifier> for IdentifierPrefix {
92    fn from(identifier: Identifier) -> Self {
93        match identifier.0 {
94            IdentifierCode::Basic(bp) => IdentifierPrefix::Basic(BasicPrefix::new(
95                bp,
96                crate::keys::PublicKey::new(identifier.1),
97            )),
98            IdentifierCode::SelfAddressing(sa) => IdentifierPrefix::SelfAddressing(
99                SelfAddressingIdentifier::new(sa.into(), identifier.1).into(),
100            ),
101        }
102    }
103}
104
105impl Into<Signature> for SelfSigningPrefix {
106    fn into(self) -> Signature {
107        (self.get_code(), self.derivative())
108    }
109}
110
111impl Into<PublicKey> for BasicPrefix {
112    fn into(self) -> PublicKey {
113        (self.get_code(), self.derivative())
114    }
115}
116
117impl Into<CesrIndexedSignature> for IndexedSignature {
118    fn into(self) -> CesrIndexedSignature {
119        (
120            AttachedSignatureCode::new(self.signature.get_code(), (&self.index).into()),
121            self.derivative(),
122        )
123    }
124}
125
126impl Into<CesrIndex> for &Index {
127    fn into(self) -> CesrIndex {
128        match self {
129            Index::CurrentOnly(i) => {
130                if *i < 64 {
131                    CesrIndex::CurrentOnly(*i)
132                } else {
133                    CesrIndex::BigCurrentOnly(*i)
134                }
135            }
136            Index::BothSame(i) => CesrIndex::BothSame(*i),
137            Index::BothDifferent(i, pi) => {
138                if *i < 64 {
139                    CesrIndex::Dual(*i, *pi)
140                } else {
141                    CesrIndex::BigDual(*i, *pi)
142                }
143            }
144        }
145    }
146}
147
148impl Into<Identifier> for IdentifierPrefix {
149    fn into(self) -> Identifier {
150        match &self {
151            IdentifierPrefix::Basic(bp) => {
152                (IdentifierCode::Basic(bp.get_code()), self.derivative())
153            }
154            IdentifierPrefix::SelfAddressing(sa) => (
155                IdentifierCode::SelfAddressing((&sa.said.derivation).into()),
156                self.derivative(),
157            ),
158            IdentifierPrefix::SelfSigning(_ss) => todo!(),
159        }
160    }
161}