ssi_data_integrity/any/
signature.rs

1use std::borrow::Cow;
2
3use ssi_claims_core::{MessageSignatureError, SignatureError};
4use ssi_crypto::algorithm::SignatureAlgorithmType;
5use ssi_verification_methods::{protocol::WithProtocol, VerificationMethod};
6
7use crate::AnyProtocol;
8
9pub struct AnySigner<S>(pub S);
10
11impl<M, S> ssi_verification_methods::Signer<M> for AnySigner<S>
12where
13    M: VerificationMethod + Into<ssi_verification_methods::AnyMethod>,
14    S: ssi_verification_methods::Signer<ssi_verification_methods::AnyMethod>,
15{
16    type MessageSigner = AnyMessageSigner<S::MessageSigner>;
17
18    async fn for_method(
19        &self,
20        method: Cow<'_, M>,
21    ) -> Result<Option<Self::MessageSigner>, SignatureError> {
22        let any_method = method.into_owned().into();
23        Ok(self
24            .0
25            .for_method(Cow::Owned(any_method))
26            .await?
27            .map(AnyMessageSigner))
28    }
29}
30
31pub struct AnyMessageSigner<S>(pub S);
32
33impl<S, A: SignatureAlgorithmType> ssi_verification_methods::MessageSigner<A>
34    for AnyMessageSigner<S>
35where
36    S: ssi_verification_methods::MessageSigner<AnySignatureAlgorithm>,
37    A::Instance: IntoAnySignatureAlgorithm,
38{
39    async fn sign(
40        self,
41        algorithm: A::Instance,
42        message: &[u8],
43    ) -> Result<Vec<u8>, MessageSignatureError> {
44        self.0
45            .sign(algorithm.into_any_signature_algorithm(), message)
46            .await
47    }
48
49    async fn sign_multi(
50        self,
51        algorithm: <A as SignatureAlgorithmType>::Instance,
52        messages: &[Vec<u8>],
53    ) -> Result<Vec<u8>, MessageSignatureError> {
54        self.0
55            .sign_multi(algorithm.into_any_signature_algorithm(), messages)
56            .await
57    }
58}
59
60pub type AnySignatureAlgorithm = WithProtocol<ssi_crypto::Algorithm, AnyProtocol>;
61
62pub type AnySignatureAlgorithmInstance = WithProtocol<ssi_crypto::AlgorithmInstance, AnyProtocol>;
63
64pub trait IntoAnySignatureAlgorithm {
65    fn into_any_signature_algorithm(self) -> AnySignatureAlgorithmInstance;
66}
67
68impl IntoAnySignatureAlgorithm for ssi_jwk::Algorithm {
69    fn into_any_signature_algorithm(self) -> AnySignatureAlgorithmInstance {
70        WithProtocol(self.into(), AnyProtocol::None)
71    }
72}
73
74impl IntoAnySignatureAlgorithm for ssi_crypto::AlgorithmInstance {
75    fn into_any_signature_algorithm(self) -> AnySignatureAlgorithmInstance {
76        WithProtocol(self, AnyProtocol::None)
77    }
78}
79
80impl IntoAnySignatureAlgorithm for ssi_crypto::algorithm::RS256 {
81    fn into_any_signature_algorithm(self) -> AnySignatureAlgorithmInstance {
82        WithProtocol(self.into(), AnyProtocol::None)
83    }
84}
85
86impl IntoAnySignatureAlgorithm for ssi_crypto::algorithm::ES256 {
87    fn into_any_signature_algorithm(self) -> AnySignatureAlgorithmInstance {
88        WithProtocol(self.into(), AnyProtocol::None)
89    }
90}
91
92impl IntoAnySignatureAlgorithm for ssi_crypto::algorithm::ES256K {
93    fn into_any_signature_algorithm(self) -> AnySignatureAlgorithmInstance {
94        WithProtocol(self.into(), AnyProtocol::None)
95    }
96}
97
98impl IntoAnySignatureAlgorithm for ssi_crypto::algorithm::ES256KR {
99    fn into_any_signature_algorithm(self) -> AnySignatureAlgorithmInstance {
100        WithProtocol(self.into(), AnyProtocol::None)
101    }
102}
103
104impl IntoAnySignatureAlgorithm for ssi_crypto::algorithm::AnyESKeccakK {
105    fn into_any_signature_algorithm(self) -> AnySignatureAlgorithmInstance {
106        WithProtocol(self.into(), AnyProtocol::None)
107    }
108}
109
110impl IntoAnySignatureAlgorithm for ssi_crypto::algorithm::EdDSA {
111    fn into_any_signature_algorithm(self) -> AnySignatureAlgorithmInstance {
112        WithProtocol(self.into(), AnyProtocol::None)
113    }
114}
115
116impl IntoAnySignatureAlgorithm for ssi_crypto::algorithm::EdBlake2b {
117    fn into_any_signature_algorithm(self) -> AnySignatureAlgorithmInstance {
118        WithProtocol(self.into(), AnyProtocol::None)
119    }
120}
121
122impl IntoAnySignatureAlgorithm for ssi_crypto::algorithm::ESBlake2b {
123    fn into_any_signature_algorithm(self) -> AnySignatureAlgorithmInstance {
124        WithProtocol(self.into(), AnyProtocol::None)
125    }
126}
127
128impl IntoAnySignatureAlgorithm for ssi_crypto::algorithm::ES256OrES384 {
129    fn into_any_signature_algorithm(self) -> AnySignatureAlgorithmInstance {
130        WithProtocol(self.into(), AnyProtocol::None)
131    }
132}
133
134#[cfg(all(feature = "w3c", feature = "bbs"))]
135impl IntoAnySignatureAlgorithm for ssi_crypto::algorithm::BbsInstance {
136    fn into_any_signature_algorithm(self) -> AnySignatureAlgorithmInstance {
137        WithProtocol(self.into(), AnyProtocol::None)
138    }
139}
140
141#[cfg(feature = "tezos")]
142impl IntoAnySignatureAlgorithm
143    for WithProtocol<ssi_crypto::algorithm::AnyBlake2b, ssi_data_integrity_suites::TezosWallet>
144{
145    fn into_any_signature_algorithm(self) -> AnySignatureAlgorithmInstance {
146        WithProtocol(self.0.into(), self.1.into())
147    }
148}
149
150impl IntoAnySignatureAlgorithm
151    for WithProtocol<
152        ssi_crypto::algorithm::AnyESKeccakK,
153        ssi_verification_methods::protocol::EthereumWallet,
154    >
155{
156    fn into_any_signature_algorithm(self) -> AnySignatureAlgorithmInstance {
157        WithProtocol(self.0.into(), self.1.into())
158    }
159}
160
161#[cfg(feature = "solana")]
162impl IntoAnySignatureAlgorithm
163    for WithProtocol<ssi_jwk::Algorithm, ssi_verification_methods::protocol::Base58Btc>
164{
165    fn into_any_signature_algorithm(self) -> AnySignatureAlgorithmInstance {
166        WithProtocol(self.0.into(), self.1.into())
167    }
168}
169
170#[cfg(feature = "aleo")]
171impl IntoAnySignatureAlgorithm
172    for WithProtocol<ssi_jwk::Algorithm, ssi_verification_methods::protocol::Base58BtcMultibase>
173{
174    fn into_any_signature_algorithm(self) -> AnySignatureAlgorithmInstance {
175        WithProtocol(self.0.into(), self.1.into())
176    }
177}