1use objects::object::State;
5
6use crate::{
7 Signer,
8 state_signature::{
9 StateSignatureError, state_signature_from_signer, verify_state_signature_bytes,
10 },
11};
12
13pub trait StateSigningExt {
14 fn sign(&mut self, signer: &dyn Signer) -> Result<(), StateSignatureError>;
15 fn verify_signature(&self) -> Result<(), StateSignatureError>;
16}
17
18impl StateSigningExt for State {
19 fn sign(&mut self, signer: &dyn Signer) -> Result<(), StateSignatureError> {
20 let hash = self.compute_hash();
21 self.signature = Some(state_signature_from_signer(&hash, signer)?);
22 Ok(())
23 }
24
25 fn verify_signature(&self) -> Result<(), StateSignatureError> {
26 match &self.signature {
27 Some(signature) => verify_state_signature_bytes(signature, &self.compute_hash()),
28 None => Err(StateSignatureError::InvalidSignature(
29 "state has no signature".to_string(),
30 )),
31 }
32 }
33}