ssi_data_integrity/any/
sd.rs

1use 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}