ssi_data_integrity/any/
sd.rs1use serde::{Deserialize, Serialize};
2use ssi_claims_core::ResolverProvider;
3use ssi_core::JsonPointerBuf;
4use ssi_data_integrity_core::{
5 suite::{CryptographicSuiteSelect, SelectionError, SelectiveCryptographicSuite},
6 DataIntegrity, ProofRef,
7};
8use ssi_json_ld::{Expandable, ExpandedDocument, JsonLdLoaderProvider, JsonLdNodeObject};
9use ssi_rdf::LexicalInterpretation;
10use ssi_verification_methods::{AnyMethod, VerificationMethodResolver};
11
12use crate::AnySuite;
13
14#[derive(Debug, Default, Deserialize)]
15#[serde(rename_all = "camelCase")]
16#[non_exhaustive]
17pub struct AnySelectionOptions {
18 pub selective_pointers: Vec<JsonPointerBuf>,
19 pub presentation_header: Option<Vec<u8>>,
20}
21
22#[cfg(all(feature = "w3c", feature = "bbs"))]
23impl From<AnySelectionOptions> for ssi_data_integrity_suites::bbs_2023::DeriveOptions {
24 fn from(value: AnySelectionOptions) -> Self {
25 Self {
26 selective_pointers: value.selective_pointers,
27 presentation_header: value.presentation_header,
28 feature_option: Default::default(),
29 }
30 }
31}
32
33#[cfg(all(feature = "w3c", feature = "secp256r1"))]
34impl From<AnySelectionOptions> for ssi_data_integrity_suites::ecdsa_sd_2023::DeriveOptions {
35 fn from(value: AnySelectionOptions) -> Self {
36 Self {
37 selective_pointers: value.selective_pointers,
38 }
39 }
40}
41
42impl SelectiveCryptographicSuite for AnySuite {
43 type SelectionOptions = AnySelectionOptions;
44}
45
46impl<T, P> CryptographicSuiteSelect<T, P> for AnySuite
47where
48 T: Serialize + JsonLdNodeObject + Expandable,
49 T::Expanded<LexicalInterpretation, ()>: Into<ExpandedDocument>,
50 P: JsonLdLoaderProvider + ResolverProvider,
51 P::Resolver: VerificationMethodResolver<Method = AnyMethod>,
52{
53 #[allow(unused_variables)]
54 async fn select(
55 &self,
56 unsecured_document: &T,
57 proof: ProofRef<'_, Self>,
58 params: P,
59 options: Self::SelectionOptions,
60 ) -> Result<DataIntegrity<ssi_json_ld::syntax::Object, Self>, SelectionError> {
61 let params = crate::AnyVerifier {
62 resolver: crate::AnyResolver::<_, ssi_verification_methods::Multikey>::new(
63 params.resolver(),
64 ),
65 json_ld_loader: params.loader(),
66 eip712_loader: (),
67 };
68
69 match self {
70 #[cfg(all(feature = "w3c", feature = "secp256r1"))]
71 Self::EcdsaSd2023 => {
72 let DataIntegrity { claims, proofs } = ssi_data_integrity_suites::EcdsaSd2023
73 .select(
74 unsecured_document,
75 crate::Project::project_proof(proof),
76 params,
77 options.into(),
78 )
79 .await?;
80
81 Ok(DataIntegrity {
82 claims,
83 proofs: proofs
84 .into_iter()
85 .map(|p| {
86 p.map_type(
87 |_| Self::EcdsaSd2023,
88 crate::AnySuiteVerificationMethod::EcdsaSd2023,
89 |_| crate::AnyProofOptions::EcdsaSd2023(()),
90 crate::AnySignature::EcdsaSd2023,
91 )
92 })
93 .collect(),
94 })
95 }
96 #[cfg(all(feature = "w3c", feature = "bbs"))]
97 Self::Bbs2023 => {
98 let DataIntegrity { claims, proofs } = ssi_data_integrity_suites::Bbs2023
99 .select(
100 unsecured_document,
101 crate::Project::project_proof(proof),
102 params,
103 options.into(),
104 )
105 .await?;
106
107 Ok(DataIntegrity {
108 claims,
109 proofs: proofs
110 .into_iter()
111 .map(|p| {
112 p.map_type(
113 |_| Self::Bbs2023,
114 crate::AnySuiteVerificationMethod::Bbs2023,
115 |_| crate::AnyProofOptions::Bbs2023(()),
116 crate::AnySignature::Bbs2023,
117 )
118 })
119 .collect(),
120 })
121 }
122 _ => Err(SelectionError::NonSelectiveSuite),
123 }
124 }
125}