ssi_data_integrity/any/
signature.rs1use 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}