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::SigningKey;
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 = SigningKey::generate(&mut OsRng);
138 let kp1 = SigningKey::generate(&mut OsRng);
139
140 let pub_key0 = PublicKey::new(kp0.verifying_key().to_bytes().to_vec());
142 let priv_key0 = PrivateKey::new(kp0.to_bytes().to_vec());
143 let (pub_key1, _priv_key1) = (
144 PublicKey::new(kp1.verifying_key().to_bytes().to_vec()),
145 PrivateKey::new(kp1.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.into())?);
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 = SigningKey::generate(&mut OsRng);
215 let kp1 = SigningKey::generate(&mut OsRng);
216 let kp2 = SigningKey::generate(&mut OsRng);
217
218 let pub_key0 = PublicKey::new(kp0.verifying_key().to_bytes().to_vec());
220 let priv_key0 = PrivateKey::new(kp0.to_bytes().to_vec());
221 let (pub_key1, sig_key_1) = (
222 PublicKey::new(kp1.verifying_key().to_bytes().to_vec()),
223 PrivateKey::new(kp1.to_bytes().to_vec()),
224 );
225
226 let (enc_key_0, _enc_priv_0) = (
231 PublicKey::new(kp2.verifying_key().to_bytes().to_vec()),
232 sig_key_1,
233 );
234 let (enc_key_1, _enc_priv_1) = (
235 PublicKey::new(kp2.verifying_key().to_bytes().to_vec()),
236 PrivateKey::new(kp2.to_bytes().to_vec()),
237 );
238
239 let sig_pref_0 = BasicPrefix::Ed25519(pub_key0);
241 let enc_pref_0 = BasicPrefix::X25519(enc_key_0);
242
243 let sig_pref_1 = BasicPrefix::Ed25519(pub_key1);
245 let enc_pref_1 = BasicPrefix::X25519(enc_key_1);
246
247 let nexter_pref = nxt_commitment(
249 SignatureThreshold::default(),
250 &[sig_pref_1, enc_pref_1],
251 &HashFunctionCode::Blake3_256.into(),
252 );
253
254 let icp = InceptionEvent::new(
255 KeyConfig::new(
256 vec![sig_pref_0.clone(), enc_pref_0.clone()],
257 nexter_pref.clone(),
258 Some(SignatureThreshold::default()),
259 ),
260 None,
261 None,
262 )
263 .incept_self_addressing(
264 HashFunctionCode::Blake3_256.into(),
265 SerializationFormats::JSON,
266 )?;
267
268 let serialized: Vec<_> = icp.encode()?;
270
271 let sk = priv_key0;
273 let sig = sk.sign_ed(&serialized)?;
274 let attached_sig =
275 IndexedSignature::new_both_same(SelfSigningPrefix::Ed25519Sha512(sig), 0);
276
277 assert!(sig_pref_0.verify(&serialized, &attached_sig.signature)?);
278
279 let signed_event = icp.sign(vec![attached_sig], None, None);
280
281 let s_ = IdentifierState::default();
282
283 let s0 = s_.apply(&signed_event)?;
284
285 assert!(s0.current.verify(&serialized, &signed_event.signatures)?);
286
287 assert_eq!(s0.prefix, icp.data.get_prefix());
288 assert_eq!(s0.sn, 0);
289 assert!(icp.compare_digest(&s0.last_event_digest.into())?);
290 assert_eq!(s0.current.public_keys.len(), 2);
291 assert_eq!(s0.current.public_keys[0], sig_pref_0);
292 assert_eq!(s0.current.public_keys[1], enc_pref_0);
293 assert_eq!(s0.current.threshold, SignatureThreshold::default());
294 assert_eq!(s0.current.next_keys_data, nexter_pref);
295 assert!(s0.witness_config.witnesses.is_empty());
296 assert_eq!(s0.witness_config.tally, SignatureThreshold::Simple(0));
297
298 Ok(())
299 }
300
301 #[test]
302 fn test_basic_establishment_sequence() -> Result<(), Error> {
303 let no_inception_seq = vec![EventTypeTag::Rot, EventTypeTag::Rot];
305 assert!(test_mock_event_sequence(no_inception_seq).is_err());
306
307 let rotation_first_seq = vec![EventTypeTag::Rot, EventTypeTag::Icp];
309 assert!(test_mock_event_sequence(rotation_first_seq).is_err());
310
311 let wrong_seq = vec![
313 EventTypeTag::Icp,
314 EventTypeTag::Rot,
315 EventTypeTag::Rot,
316 EventTypeTag::Icp,
317 ];
318 assert!(test_mock_event_sequence(wrong_seq).is_err());
319
320 let ok_seq = vec![EventTypeTag::Icp, EventTypeTag::Rot, EventTypeTag::Rot];
321 assert!(test_mock_event_sequence(ok_seq).is_ok());
322
323 let wrong_delegated_sequence =
325 vec![EventTypeTag::Dip, EventTypeTag::Drt, EventTypeTag::Rot];
326 assert!(test_mock_event_sequence(wrong_delegated_sequence).is_err());
327
328 let delegated_sequence = vec![EventTypeTag::Dip, EventTypeTag::Drt, EventTypeTag::Ixn];
330 assert!(test_mock_event_sequence(delegated_sequence).is_ok());
331
332 Ok(())
333 }
334
335 #[test]
336 fn test_basic_sequence() -> Result<(), Error> {
337 let ok_seq = vec![
338 EventTypeTag::Icp,
339 EventTypeTag::Ixn,
340 EventTypeTag::Ixn,
341 EventTypeTag::Ixn,
342 EventTypeTag::Rot,
343 EventTypeTag::Ixn,
344 ];
345 assert!(test_mock_event_sequence(ok_seq).is_ok());
346
347 let delegated_sequence = vec![
348 EventTypeTag::Dip,
349 EventTypeTag::Drt,
350 EventTypeTag::Ixn,
351 EventTypeTag::Drt,
352 ];
353 assert!(test_mock_event_sequence(delegated_sequence).is_ok());
354
355 Ok(())
356 }
357
358 #[test]
359 pub fn test_partial_rotation() -> Result<(), Error> {
360 let signers = setup_signers();
362
363 let keys = vec![BasicPrefix::Ed25519(signers[0].public_key())];
364
365 let next_pks = signers[1..6]
366 .iter()
367 .map(|signer| BasicPrefix::Ed25519(signer.public_key()))
368 .collect::<Vec<_>>();
369 let icp = EventMsgBuilder::new(EventTypeTag::Icp)
371 .with_keys(keys)
372 .with_threshold(&SignatureThreshold::Simple(1))
373 .with_next_keys(next_pks)
374 .with_next_threshold(&SignatureThreshold::single_weighted(vec![
375 (1, 2),
376 (1, 2),
377 (1, 3),
378 (1, 3),
379 (1, 3),
380 ]))
381 .build()
382 .unwrap();
383
384 let id_prefix = icp.data.get_prefix();
385 let icp_digest = icp.digest()?;
386 assert_eq!(
387 id_prefix,
388 IdentifierPrefix::self_addressing(icp_digest.clone())
389 );
390 assert_eq!(
391 id_prefix.to_str(),
392 "EM2y0cPBcua33FMaji79hQ2NVq7mzIIEX8Zlw0Ch5OQQ"
393 );
394
395 let state = IdentifierState::default();
396 let state = icp.apply_to(state)?;
397
398 let current_signers = [&signers[3], &signers[4], &signers[5]];
401 let current_public_keys = current_signers
402 .iter()
403 .map(|sig| BasicPrefix::Ed25519(sig.public_key()))
404 .collect::<Vec<_>>();
405 let next_public_keys = signers[11..16]
406 .iter()
407 .map(|sig| BasicPrefix::Ed25519(sig.public_key()))
408 .collect::<Vec<_>>();
409
410 let rotation = EventMsgBuilder::new(EventTypeTag::Rot)
412 .with_prefix(&id_prefix)
413 .with_previous_event(&icp_digest)
414 .with_keys(current_public_keys.clone())
415 .with_threshold(&SignatureThreshold::single_weighted(vec![
416 (1, 2),
417 (1, 2),
418 (1, 3),
419 ]))
420 .with_next_keys(next_public_keys)
421 .with_next_threshold(&SignatureThreshold::single_weighted(vec![
422 (1, 2),
423 (1, 2),
424 (1, 3),
425 (1, 3),
426 (1, 3),
427 ]))
428 .build()?;
429
430 let rot_digest = rotation.digest()?;
431 let state = rotation.apply_to(state)?;
432
433 assert_eq!(state.sn, 1);
434 assert_eq!(&state.current.public_keys, ¤t_public_keys);
435 assert_eq!(
436 serde_json::to_string(&state.current.threshold).unwrap(),
437 "[\"1/2\",\"1/2\",\"1/3\"]"
438 );
439
440 let current_signers = [&signers[13], &signers[14]];
441 let next_public_keys = vec![];
442 let current_public_keys = current_signers
443 .iter()
444 .map(|sig| BasicPrefix::Ed25519(sig.public_key()))
445 .collect::<Vec<_>>();
446
447 let rotation = EventMsgBuilder::new(EventTypeTag::Rot)
450 .with_prefix(&id_prefix)
451 .with_keys(current_public_keys)
452 .with_threshold(&SignatureThreshold::Simple(2))
453 .with_next_keys(next_public_keys)
454 .with_next_threshold(&SignatureThreshold::Simple(0))
455 .with_sn(2)
456 .with_previous_event(&rot_digest)
457 .build()?;
458
459 let res = rotation.apply_to(state);
460 assert!(matches!(res.unwrap_err(), Error::NotEnoughSigsError));
461
462 Ok(())
463 }
464}