keri_controller/controller/
verifying.rs1use cesrox::{parse_many, payload::Payload, ParsedData};
2use itertools::Itertools;
3use keri_core::{
4 event_message::signature::{get_signatures, Signature},
5 oobi::Oobi,
6 processor::validator::{EventValidator, VerificationError},
7};
8
9use crate::{error::ControllerError, known_events::KnownEvents};
10
11impl KnownEvents {
12 pub fn verify(&self, data: &[u8], signature: &Signature) -> Result<(), VerificationError> {
13 let verifier = EventValidator::new(self.storage.events_db.clone());
14 verifier.verify(data, signature)
15 }
16
17 fn _parse_cesr_stream(
20 &self,
21 stream: &str,
22 ) -> Result<(Vec<Oobi>, Vec<ParsedData>), ControllerError> {
23 let (_rest, data) =
24 parse_many(stream.as_bytes()).map_err(|_e| ControllerError::CesrFormatError)?;
25 let (oobis, to_verify): (Vec<Oobi>, Vec<_>) = data.into_iter().partition_map(|d| {
27 let oobi: Result<Oobi, _> = match &d.payload {
28 Payload::JSON(json) => serde_json::from_slice(json)
29 .map_err(|_e| ControllerError::OtherError("Wrong JSON".to_string())),
30 Payload::CBOR(_) => Err(ControllerError::OtherError(
31 "CBOR format not implemented yet".to_string(),
32 )),
33 Payload::MGPK(_) => Err(ControllerError::OtherError(
34 "MGPK format not implemented yet".to_string(),
35 )),
36 };
37 match oobi {
38 Ok(oobi) => itertools::Either::Left(oobi),
39 Err(_) => itertools::Either::Right(d),
40 }
41 });
42
43 Ok((oobis, to_verify))
44 }
45
46 pub fn verify_from_cesr(&self, stream: &[u8]) -> Result<(), ControllerError> {
47 let (_rest, data) = parse_many(stream).map_err(|_e| ControllerError::CesrFormatError)?;
48 self.verify_parsed(&data)
49 }
50
51 fn verify_parsed(&self, data: &[ParsedData]) -> Result<(), ControllerError> {
53 let mut err_reasons: Vec<VerificationError> = vec![];
54 let (_oks, errs): (Vec<_>, Vec<_>) = data.iter().partition(|d| {
55 match d
56 .attachments
57 .iter()
58 .flat_map(|a| get_signatures(a.clone()).unwrap())
59 .try_for_each(|s| {
60 let payload = match &d.payload {
61 Payload::JSON(json) => json,
62 Payload::CBOR(cbor) => cbor,
63 Payload::MGPK(mgpk) => mgpk,
64 };
65 self.verify(payload, &s)
66 }) {
67 Ok(_) => true,
68 Err(err) => {
69 err_reasons.push(err);
70 false
71 }
72 }
73 });
74 if errs.is_empty() {
75 Ok(())
76 } else {
77 let err = err_reasons.into_iter().zip(
78 errs.iter()
79 .map(|d| String::from_utf8(d.to_cesr().unwrap()).unwrap()),
80 );
81 Err(ControllerError::VerificationError(err.collect()))
82 }
83 }
84}