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::new(sn, digest.into())
62    }
63}
64
65impl From<(Digest, u64, Digest)> for EventSeal {
66    fn from((identifier, sn, digest): (Digest, u64, Digest)) -> Self {
67        let said: SelfAddressingIdentifier = identifier.into();
68        let digest_said: SelfAddressingIdentifier = digest.into();
69        EventSeal::new(
70            IdentifierPrefix::SelfAddressing(said.into()),
71            sn,
72            digest_said.into(),
73        )
74    }
75}
76
77impl From<(PublicKey, u64, Digest)> for EventSeal {
78    fn from((identifier, sn, digest): (PublicKey, u64, Digest)) -> Self {
79        let digest_said: SelfAddressingIdentifier = digest.into();
80        EventSeal::new(
81            IdentifierPrefix::Basic(identifier.into()),
82            sn,
83            digest_said.into(),
84        )
85    }
86}
87
88impl From<Identifier> for IdentifierPrefix {
89    fn from(identifier: Identifier) -> Self {
90        match identifier.0 {
91            IdentifierCode::Basic(bp) => IdentifierPrefix::Basic(BasicPrefix::new(
92                bp,
93                crate::keys::PublicKey::new(identifier.1),
94            )),
95            IdentifierCode::SelfAddressing(sa) => IdentifierPrefix::SelfAddressing(
96                SelfAddressingIdentifier::new(sa.into(), identifier.1).into(),
97            ),
98        }
99    }
100}
101
102impl Into<Signature> for SelfSigningPrefix {
103    fn into(self) -> Signature {
104        (self.get_code(), self.derivative())
105    }
106}
107
108impl Into<PublicKey> for BasicPrefix {
109    fn into(self) -> PublicKey {
110        (self.get_code(), self.derivative())
111    }
112}
113
114impl Into<CesrIndexedSignature> for IndexedSignature {
115    fn into(self) -> CesrIndexedSignature {
116        (
117            AttachedSignatureCode::new(self.signature.get_code(), (&self.index).into()),
118            self.derivative(),
119        )
120    }
121}
122
123impl Into<CesrIndex> for &Index {
124    fn into(self) -> CesrIndex {
125        match self {
126            Index::CurrentOnly(i) => {
127                if *i < 64 {
128                    CesrIndex::CurrentOnly(*i)
129                } else {
130                    CesrIndex::BigCurrentOnly(*i)
131                }
132            }
133            Index::BothSame(i) => CesrIndex::BothSame(*i),
134            Index::BothDifferent(i, pi) => {
135                if *i < 64 {
136                    CesrIndex::Dual(*i, *pi)
137                } else {
138                    CesrIndex::BigDual(*i, *pi)
139                }
140            }
141        }
142    }
143}
144
145impl Into<Identifier> for IdentifierPrefix {
146    fn into(self) -> Identifier {
147        match &self {
148            IdentifierPrefix::Basic(bp) => {
149                (IdentifierCode::Basic(bp.get_code()), self.derivative())
150            }
151            IdentifierPrefix::SelfAddressing(sa) => (
152                IdentifierCode::SelfAddressing((&sa.said.derivation).into()),
153                self.derivative(),
154            ),
155            IdentifierPrefix::SelfSigning(_ss) => todo!(),
156        }
157    }
158}