1pub mod cesr_adapter;
2pub mod dummy_event;
3pub mod event_msg_builder;
4pub mod key_event_message;
5pub mod msg;
6pub mod serializer;
7pub mod signature;
8pub mod signed_event_message;
9pub mod timestamped;
10
11use std::cmp::Ordering;
12
13use crate::event::KeyEvent;
14use chrono::{DateTime, Local};
15use serde::{Deserialize, Serialize};
16
17use self::msg::KeriEvent;
18
19pub trait Typeable {
20 type TypeTag;
21 fn get_type(&self) -> Self::TypeTag;
22}
23
24#[derive(
25 Clone,
26 Debug,
27 Serialize,
28 Deserialize,
29 PartialEq,
30 rkyv::Archive,
31 rkyv::Serialize,
32 rkyv::Deserialize,
33)]
34#[serde(rename_all = "lowercase")]
35pub enum EventTypeTag {
36 Icp,
37 Rot,
38 Ixn,
39 Dip,
40 Drt,
41 Rct,
42 Exn,
43 #[cfg(feature = "query")]
44 Rpy,
45 Qry,
47}
48
49#[derive(Serialize, Deserialize, PartialEq)]
50pub struct TimestampedEventMessage {
51 pub timestamp: DateTime<Local>,
52 pub event_message: KeriEvent<KeyEvent>,
53}
54
55impl TimestampedEventMessage {
56 pub fn new(event: KeriEvent<KeyEvent>) -> Self {
57 Self {
58 timestamp: Local::now(),
59 event_message: event,
60 }
61 }
62}
63
64impl PartialOrd for TimestampedEventMessage {
65 fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
66 Some(
67 match self.event_message.data.get_sn() == other.event_message.data.get_sn() {
68 true => Ordering::Equal,
69 false => {
70 match self.event_message.data.get_sn() > other.event_message.data.get_sn() {
71 true => Ordering::Greater,
72 false => Ordering::Less,
73 }
74 }
75 },
76 )
77 }
78}
79
80impl Ord for TimestampedEventMessage {
81 fn cmp(&self, other: &Self) -> Ordering {
82 match self.event_message.data.get_sn() == other.event_message.data.get_sn() {
83 true => Ordering::Equal,
84 false => match self.event_message.data.get_sn() > other.event_message.data.get_sn() {
85 true => Ordering::Greater,
86 false => Ordering::Less,
87 },
88 }
89 }
90}
91
92impl Eq for TimestampedEventMessage {}
93
94impl From<TimestampedEventMessage> for KeriEvent<KeyEvent> {
95 fn from(event: TimestampedEventMessage) -> KeriEvent<KeyEvent> {
96 event.event_message
97 }
98}
99
100impl From<KeriEvent<KeyEvent>> for TimestampedEventMessage {
102 fn from(event: KeriEvent<KeyEvent>) -> TimestampedEventMessage {
103 TimestampedEventMessage::new(event)
104 }
105}
106
107#[cfg(test)]
108mod tests {
109 mod test_utils;
110
111 use self::test_utils::test_mock_event_sequence;
112 use super::{event_msg_builder::EventMsgBuilder, *};
113 use crate::{
114 error::Error,
115 event::{
116 event_data::{inception::InceptionEvent, EventData},
117 sections::{
118 key_config::nxt_commitment, threshold::SignatureThreshold, InceptionWitnessConfig,
119 KeyConfig,
120 },
121 KeyEvent,
122 },
123 keys::{PrivateKey, PublicKey},
124 prefix::{BasicPrefix, IdentifierPrefix, IndexedSignature, SelfSigningPrefix},
125 signer::setup_signers,
126 state::{EventSemantics, IdentifierState},
127 };
128 use cesrox::primitives::CesrPrimitive;
129 use ed25519_dalek::Keypair;
130 use rand::rngs::OsRng;
131 use said::derivation::HashFunctionCode;
132 use said::version::format::SerializationFormats;
133
134 #[test]
135 fn basic_create() -> Result<(), Error> {
136 let kp0 = Keypair::generate(&mut OsRng);
138 let kp1 = Keypair::generate(&mut OsRng);
139
140 let pub_key0 = PublicKey::new(kp0.public.to_bytes().to_vec());
142 let priv_key0 = PrivateKey::new(kp0.secret.to_bytes().to_vec());
143 let (pub_key1, _priv_key1) = (
144 PublicKey::new(kp1.public.to_bytes().to_vec()),
145 PrivateKey::new(kp1.secret.to_bytes().to_vec()),
146 );
147
148 let pref0 = BasicPrefix::Ed25519(pub_key0);
150
151 let pref1 = BasicPrefix::Ed25519(pub_key1);
153 let nxt = nxt_commitment(
154 SignatureThreshold::Simple(1),
155 &vec![pref1],
156 &HashFunctionCode::Blake3_256.into(),
157 );
158
159 let icp = KeyEvent::new(
161 IdentifierPrefix::Basic(pref0.clone()),
162 0,
163 EventData::Icp(InceptionEvent {
164 key_config: KeyConfig::new(
165 vec![pref0.clone()],
166 nxt.clone(),
167 Some(SignatureThreshold::Simple(1)),
168 ),
169 witness_config: InceptionWitnessConfig::default(),
170 inception_configuration: vec![],
171 data: vec![],
172 }),
173 );
174
175 let icp_m = icp.to_message(
176 SerializationFormats::JSON,
177 HashFunctionCode::Blake3_256.into(),
178 )?;
179
180 let ser: Vec<_> = icp_m.encode()?;
182
183 let sig = priv_key0.sign_ed(&ser)?;
185 let attached_sig =
186 IndexedSignature::new_both_same(SelfSigningPrefix::Ed25519Sha512(sig), 0);
187
188 assert!(pref0.verify(&ser, &attached_sig.signature)?);
189
190 let signed_event = icp_m.sign(vec![attached_sig], None, None);
191
192 let s_ = IdentifierState::default();
193
194 let s0 = s_.apply(&signed_event)?;
195
196 assert!(s0.current.verify(&ser, &signed_event.signatures)?);
197
198 assert_eq!(s0.prefix, IdentifierPrefix::Basic(pref0.clone()));
199 assert_eq!(s0.sn, 0);
200 assert!(icp_m.compare_digest(&s0.last_event_digest)?);
201 assert_eq!(s0.current.public_keys.len(), 1);
202 assert_eq!(s0.current.public_keys[0], pref0);
203 assert_eq!(s0.current.threshold, SignatureThreshold::Simple(1));
204 assert_eq!(s0.current.next_keys_data, nxt);
205 assert!(s0.witness_config.witnesses.is_empty());
206 assert_eq!(s0.witness_config.tally, SignatureThreshold::Simple(0));
207
208 Ok(())
209 }
210
211 #[test]
212 fn self_addressing_create() -> Result<(), Error> {
213 let kp0 = Keypair::generate(&mut OsRng);
215 let kp1 = Keypair::generate(&mut OsRng);
216 let kp2 = Keypair::generate(&mut OsRng);
217
218 let pub_key0 = PublicKey::new(kp0.public.to_bytes().to_vec());
220 let priv_key0 = PrivateKey::new(kp0.secret.to_bytes().to_vec());
221 let (pub_key1, sig_key_1) = (
222 PublicKey::new(kp1.public.to_bytes().to_vec()),
223 PrivateKey::new(kp1.secret.to_bytes().to_vec()),
224 );
225
226 let (enc_key_0, _enc_priv_0) = (PublicKey::new(kp2.public.to_bytes().to_vec()), sig_key_1);
231 let (enc_key_1, _enc_priv_1) = (
232 PublicKey::new(kp2.public.to_bytes().to_vec()),
233 PrivateKey::new(kp2.secret.to_bytes().to_vec()),
234 );
235
236 let sig_pref_0 = BasicPrefix::Ed25519(pub_key0);
238 let enc_pref_0 = BasicPrefix::X25519(enc_key_0);
239
240 let sig_pref_1 = BasicPrefix::Ed25519(pub_key1);
242 let enc_pref_1 = BasicPrefix::X25519(enc_key_1);
243
244 let nexter_pref = nxt_commitment(
246 SignatureThreshold::default(),
247 &[sig_pref_1, enc_pref_1],
248 &HashFunctionCode::Blake3_256.into(),
249 );
250
251 let icp = InceptionEvent::new(
252 KeyConfig::new(
253 vec![sig_pref_0.clone(), enc_pref_0.clone()],
254 nexter_pref.clone(),
255 Some(SignatureThreshold::default()),
256 ),
257 None,
258 None,
259 )
260 .incept_self_addressing(
261 HashFunctionCode::Blake3_256.into(),
262 SerializationFormats::JSON,
263 )?;
264
265 let serialized: Vec<_> = icp.encode()?;
267
268 let sk = priv_key0;
270 let sig = sk.sign_ed(&serialized)?;
271 let attached_sig =
272 IndexedSignature::new_both_same(SelfSigningPrefix::Ed25519Sha512(sig), 0);
273
274 assert!(sig_pref_0.verify(&serialized, &attached_sig.signature)?);
275
276 let signed_event = icp.sign(vec![attached_sig], None, None);
277
278 let s_ = IdentifierState::default();
279
280 let s0 = s_.apply(&signed_event)?;
281
282 assert!(s0.current.verify(&serialized, &signed_event.signatures)?);
283
284 assert_eq!(s0.prefix, icp.data.get_prefix());
285 assert_eq!(s0.sn, 0);
286 assert!(icp.compare_digest(&s0.last_event_digest)?);
287 assert_eq!(s0.current.public_keys.len(), 2);
288 assert_eq!(s0.current.public_keys[0], sig_pref_0);
289 assert_eq!(s0.current.public_keys[1], enc_pref_0);
290 assert_eq!(s0.current.threshold, SignatureThreshold::default());
291 assert_eq!(s0.current.next_keys_data, nexter_pref);
292 assert!(s0.witness_config.witnesses.is_empty());
293 assert_eq!(s0.witness_config.tally, SignatureThreshold::Simple(0));
294
295 Ok(())
296 }
297
298 #[test]
299 fn test_basic_establishment_sequence() -> Result<(), Error> {
300 let no_inception_seq = vec![EventTypeTag::Rot, EventTypeTag::Rot];
302 assert!(test_mock_event_sequence(no_inception_seq).is_err());
303
304 let rotation_first_seq = vec![EventTypeTag::Rot, EventTypeTag::Icp];
306 assert!(test_mock_event_sequence(rotation_first_seq).is_err());
307
308 let wrong_seq = vec![
310 EventTypeTag::Icp,
311 EventTypeTag::Rot,
312 EventTypeTag::Rot,
313 EventTypeTag::Icp,
314 ];
315 assert!(test_mock_event_sequence(wrong_seq).is_err());
316
317 let ok_seq = vec![EventTypeTag::Icp, EventTypeTag::Rot, EventTypeTag::Rot];
318 assert!(test_mock_event_sequence(ok_seq).is_ok());
319
320 let wrong_delegated_sequence =
322 vec![EventTypeTag::Dip, EventTypeTag::Drt, EventTypeTag::Rot];
323 assert!(test_mock_event_sequence(wrong_delegated_sequence).is_err());
324
325 let delegated_sequence = vec![EventTypeTag::Dip, EventTypeTag::Drt, EventTypeTag::Ixn];
327 assert!(test_mock_event_sequence(delegated_sequence).is_ok());
328
329 Ok(())
330 }
331
332 #[test]
333 fn test_basic_sequence() -> Result<(), Error> {
334 let ok_seq = vec![
335 EventTypeTag::Icp,
336 EventTypeTag::Ixn,
337 EventTypeTag::Ixn,
338 EventTypeTag::Ixn,
339 EventTypeTag::Rot,
340 EventTypeTag::Ixn,
341 ];
342 assert!(test_mock_event_sequence(ok_seq).is_ok());
343
344 let delegated_sequence = vec![
345 EventTypeTag::Dip,
346 EventTypeTag::Drt,
347 EventTypeTag::Ixn,
348 EventTypeTag::Drt,
349 ];
350 assert!(test_mock_event_sequence(delegated_sequence).is_ok());
351
352 Ok(())
353 }
354
355 #[test]
356 pub fn test_partial_rotation() -> Result<(), Error> {
357 let signers = setup_signers();
359
360 let keys = vec![BasicPrefix::Ed25519(signers[0].public_key())];
361
362 let next_pks = signers[1..6]
363 .iter()
364 .map(|signer| BasicPrefix::Ed25519(signer.public_key()))
365 .collect::<Vec<_>>();
366 let icp = EventMsgBuilder::new(EventTypeTag::Icp)
368 .with_keys(keys)
369 .with_threshold(&SignatureThreshold::Simple(1))
370 .with_next_keys(next_pks)
371 .with_next_threshold(&SignatureThreshold::single_weighted(vec![
372 (1, 2),
373 (1, 2),
374 (1, 3),
375 (1, 3),
376 (1, 3),
377 ]))
378 .build()
379 .unwrap();
380
381 let id_prefix = icp.data.get_prefix();
382 let icp_digest = icp.digest()?;
383 assert_eq!(
384 id_prefix,
385 IdentifierPrefix::self_addressing(icp_digest.clone())
386 );
387 assert_eq!(
388 id_prefix.to_str(),
389 "EM2y0cPBcua33FMaji79hQ2NVq7mzIIEX8Zlw0Ch5OQQ"
390 );
391
392 let state = IdentifierState::default();
393 let state = icp.apply_to(state)?;
394
395 let current_signers = [&signers[3], &signers[4], &signers[5]];
398 let current_public_keys = current_signers
399 .iter()
400 .map(|sig| BasicPrefix::Ed25519(sig.public_key()))
401 .collect::<Vec<_>>();
402 let next_public_keys = signers[11..16]
403 .iter()
404 .map(|sig| BasicPrefix::Ed25519(sig.public_key()))
405 .collect::<Vec<_>>();
406
407 let rotation = EventMsgBuilder::new(EventTypeTag::Rot)
409 .with_prefix(&id_prefix)
410 .with_previous_event(&icp_digest)
411 .with_keys(current_public_keys.clone())
412 .with_threshold(&SignatureThreshold::single_weighted(vec![
413 (1, 2),
414 (1, 2),
415 (1, 3),
416 ]))
417 .with_next_keys(next_public_keys)
418 .with_next_threshold(&SignatureThreshold::single_weighted(vec![
419 (1, 2),
420 (1, 2),
421 (1, 3),
422 (1, 3),
423 (1, 3),
424 ]))
425 .build()?;
426
427 let rot_digest = rotation.digest()?;
428 let state = rotation.apply_to(state)?;
429
430 assert_eq!(state.sn, 1);
431 assert_eq!(&state.current.public_keys, ¤t_public_keys);
432 assert_eq!(
433 serde_json::to_string(&state.current.threshold).unwrap(),
434 "[\"1/2\",\"1/2\",\"1/3\"]"
435 );
436
437 let current_signers = [&signers[13], &signers[14]];
438 let next_public_keys = vec![];
439 let current_public_keys = current_signers
440 .iter()
441 .map(|sig| BasicPrefix::Ed25519(sig.public_key()))
442 .collect::<Vec<_>>();
443
444 let rotation = EventMsgBuilder::new(EventTypeTag::Rot)
447 .with_prefix(&id_prefix)
448 .with_keys(current_public_keys)
449 .with_threshold(&SignatureThreshold::Simple(2))
450 .with_next_keys(next_public_keys)
451 .with_next_threshold(&SignatureThreshold::Simple(0))
452 .with_sn(2)
453 .with_previous_event(&rot_digest)
454 .build()?;
455
456 let res = rotation.apply_to(state);
457 assert!(matches!(res.unwrap_err(), Error::NotEnoughSigsError));
458
459 Ok(())
460 }
461}