ssi_data_integrity_core/suite/
mod.rs1use ssi_claims_core::{
2 ProofPreparationError, ProofValidationError, SignatureEnvironment, SignatureError,
3};
4use ssi_verification_methods::VerificationMethod;
5
6mod signature;
7pub use signature::*;
8
9mod verification;
10pub use verification::*;
11
12use crate::{DataIntegrity, ProofConfiguration, TypeRef};
13
14mod configuration;
15pub use configuration::*;
16
17pub mod bounds;
18pub use bounds::{
19 CloneCryptographicSuite, DebugCryptographicSuite, DeserializeCryptographicSuite,
20 DeserializeCryptographicSuiteOwned, SerializeCryptographicSuite,
21};
22
23use self::standard::{HashingError, TransformationError};
24
25pub mod standard;
26pub use standard::StandardCryptographicSuite;
27
28mod sd;
29pub use sd::*;
30
31pub trait CryptographicSuite: Clone {
35 type PreparedClaims;
39
40 type Configuration: ConfigurationAlgorithm<Self>;
47
48 type VerificationMethod: VerificationMethod;
50
51 type ProofOptions;
53
54 type Signature: AsRef<str>;
59
60 fn type_(&'_ self) -> TypeRef<'_>;
62
63 fn configure_signature(
65 &self,
66 proof_options: InputProofOptions<Self>,
67 signature_options: InputSignatureOptions<Self>,
68 ) -> Result<(ProofConfiguration<Self>, TransformationOptions<Self>), ConfigurationError> {
69 Self::Configuration::configure_signature(self, proof_options, signature_options)
70 }
71
72 fn configure_verification(
74 &self,
75 verification_options: &InputVerificationOptions<Self>,
76 ) -> Result<TransformationOptions<Self>, ConfigurationError> {
77 Self::Configuration::configure_verification(self, verification_options)
78 }
79
80 #[allow(async_fn_in_trait)]
82 async fn sign_with<T, C, R, S>(
83 &self,
84 context: C,
85 unsecured_document: T,
86 resolver: R,
87 signer: S,
88 proof_options: InputProofOptions<Self>,
89 signature_options: InputSignatureOptions<Self>,
90 ) -> Result<DataIntegrity<T, Self>, SignatureError>
91 where
92 Self: CryptographicSuiteSigning<T, C, R, S>,
93 {
94 let (proof_configuration, transformation_options) =
95 self.configure_signature(proof_options, signature_options)?;
96 let proof_configuration_ref = proof_configuration.borrowed();
97 let signature = self
98 .generate_signature(
99 &context,
100 resolver,
101 signer,
102 &unsecured_document,
103 proof_configuration_ref,
104 transformation_options,
105 )
106 .await?;
107
108 let proof = proof_configuration.into_proof(signature);
109 Ok(DataIntegrity::new(unsecured_document, proof.into()))
110 }
111
112 #[allow(async_fn_in_trait)]
114 async fn sign<T, R, S>(
115 &self,
116 unsecured_document: T,
117 resolver: R,
118 signer: S,
119 proof_options: InputProofOptions<Self>,
120 ) -> Result<DataIntegrity<T, Self>, SignatureError>
121 where
122 Self: CryptographicSuiteSigning<T, SignatureEnvironment, R, S>,
123 InputSignatureOptions<Self>: Default,
124 {
125 self.sign_with(
126 SignatureEnvironment::default(),
127 unsecured_document,
128 resolver,
129 signer,
130 proof_options,
131 Default::default(),
132 )
133 .await
134 }
135}
136
137#[derive(Debug, thiserror::Error)]
138pub enum ClaimsPreparationError {
139 #[error("proof configuration failed: {0}")]
140 Configuration(#[from] ConfigurationError),
141
142 #[error("claims transformation failed: {0}")]
143 Transformation(#[from] TransformationError),
144
145 #[error("hashing failed: {0}")]
146 Hashing(#[from] HashingError),
147}
148
149impl From<ClaimsPreparationError> for SignatureError {
150 fn from(value: ClaimsPreparationError) -> Self {
151 Self::other(value)
152 }
153}
154
155impl From<ClaimsPreparationError> for ProofValidationError {
156 fn from(value: ClaimsPreparationError) -> Self {
157 Self::Other(value.to_string())
158 }
159}
160
161impl From<ClaimsPreparationError> for ProofPreparationError {
162 fn from(value: ClaimsPreparationError) -> Self {
163 Self::Claims(value.to_string())
164 }
165}