Skip to main content

crypto/
state_signing.rs

1// SPDX-License-Identifier: Apache-2.0
2//! Signing extension trait for core State.
3
4use 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}