Skip to main content

ssi_verification_methods_core/signature/signer/
local.rs

1use std::ops::Deref;
2
3use ssi_claims_core::{MessageSignatureError, SignatureError};
4use ssi_crypto::algorithm::{SignatureAlgorithmInstance, SignatureAlgorithmType};
5
6use crate::{protocol::WithProtocol, MessageSigner, SignatureProtocol, Signer, VerificationMethod};
7
8pub struct LocalSigner<S>(pub S);
9
10impl<M: VerificationMethod, S: Signer<M>> Signer<M> for LocalSigner<S> {
11    type MessageSigner = LocalMessageSigner<S::MessageSigner>;
12
13    async fn for_method(
14        &self,
15        method: std::borrow::Cow<'_, M>,
16    ) -> Result<Option<Self::MessageSigner>, SignatureError> {
17        Ok(self.0.for_method(method).await?.map(LocalMessageSigner))
18    }
19}
20
21impl<S> Deref for LocalSigner<S> {
22    type Target = S;
23
24    fn deref(&self) -> &Self::Target {
25        &self.0
26    }
27}
28
29pub struct LocalMessageSigner<S>(pub S);
30
31impl<A: SignatureAlgorithmType, P: SignatureProtocol<A>, S: MessageSigner<A>>
32    MessageSigner<WithProtocol<A, P>> for LocalMessageSigner<S>
33{
34    async fn sign(
35        self,
36        WithProtocol(algorithm_instance, protocol): WithProtocol<A::Instance, P>,
37        message: &[u8],
38    ) -> Result<Vec<u8>, MessageSignatureError> {
39        let algorithm = algorithm_instance.algorithm();
40        let message = protocol.prepare_message(message);
41        let signature = self.0.sign(algorithm_instance, &message).await?;
42        protocol.encode_signature(algorithm, signature)
43    }
44
45    async fn sign_multi(
46        self,
47        WithProtocol(algorithm_instance, protocol): WithProtocol<A::Instance, P>,
48        messages: &[Vec<u8>],
49    ) -> Result<Vec<u8>, MessageSignatureError> {
50        let algorithm = algorithm_instance.algorithm();
51        let messages = protocol.prepare_messages(messages);
52        let signature = self.0.sign_multi(algorithm_instance, &messages).await?;
53        protocol.encode_signature(algorithm, signature)
54    }
55}