ssi_verification_methods_core/signature/signer/
local.rs1use 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}