keri_controller/controller/
verifying.rs

1use 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    /// Parse elements from CESR stream and splits them into OOBIs to be
18    /// resolved and signed credentials.
19    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        // Split into OOBIs and other data
26        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    /// Verify signed data that was parsed from cesr stream.
52    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}