diff --git a/matcher-rs/src/issuance.rs b/matcher-rs/src/issuance.rs index 766b5fa..d7c55d1 100644 --- a/matcher-rs/src/issuance.rs +++ b/matcher-rs/src/issuance.rs @@ -115,14 +115,12 @@ mod test { { "protocol": "openid4vci-1.1", "data": { - "credential_offer": { - "credential_issuer": "https://issuer.my", - "credential_configuration_ids": [ - "US_SOCIAL_SECURITY_NUMBER" - ], - "grants": { - "authorization_code": {} - } + "credential_issuer": "https://issuer.my", + "credential_configuration_ids": [ + "US_SOCIAL_SECURITY_NUMBER" + ], + "grants": { + "authorization_code": {} }, "credential_issuer_metadata": { "nonce_endpoint": "https://nonce.my" @@ -174,14 +172,12 @@ mod test { { "protocol": "openid4vci-1.1", "data": { - "credential_offer": { - "credential_issuer": "https://issuer.my", - "credential_configuration_ids": [ - "US_SOCIAL_SECURITY_NUMBER" - ], - "grants": { - "authorization_code": {} - } + "credential_issuer": "https://issuer.my", + "credential_configuration_ids": [ + "US_SOCIAL_SECURITY_NUMBER" + ], + "grants": { + "authorization_code": {} }, "credential_issuer_metadata": { "nonce_endpoint": "https://nonce.my" @@ -214,14 +210,12 @@ mod test { { "protocol": "openid4vci-1.1", "data": { - "credential_offer": { - "credential_issuer": "https://issuer.my", - "credential_configuration_ids": [ - "US_SOCIAL_SECURITY_NUMBER" - ], - "grants": { - "authorization_code": {} - } + "credential_issuer": "https://issuer.my", + "credential_configuration_ids": [ + "US_SOCIAL_SECURITY_NUMBER" + ], + "grants": { + "authorization_code": {} }, "credential_issuer_metadata": { "nonce_endpoint": "https://nonce.my" @@ -288,14 +282,12 @@ mod test { { "protocol": "openid4vci-1.1", "data": { - "credential_offer": { - "credential_issuer": "https://issuer.my", - "credential_configuration_ids": [ - "FICTITIOUS_STATE_MDL" - ], - "grants": { - "authorization_code": {} - } + "credential_issuer": "https://issuer.my", + "credential_configuration_ids": [ + "FICTITIOUS_STATE_MDL" + ], + "grants": { + "authorization_code": {} }, "credential_issuer_metadata": { "nonce_endpoint": "https://nonce.my", diff --git a/matcher-rs/src/issuance_matcher.rs b/matcher-rs/src/issuance_matcher.rs index 995dcd9..c20496a 100644 --- a/matcher-rs/src/issuance_matcher.rs +++ b/matcher-rs/src/issuance_matcher.rs @@ -36,19 +36,16 @@ impl OpenId4VciFilter { Self::Or { filters } => filters.iter().any(|f| f.matches(request)), Self::Not { filter } => !filter.matches(request), Self::AllowsIssuers { issuers } => { - issuers.contains(&request.credential_offer.credential_issuer) + issuers.contains(request.credential_issuer) } Self::AllowsConfigurationIds { configuration_ids } => request - .credential_offer .credential_configuration_ids .iter() .any(|id| configuration_ids.contains(id)), Self::SupportsAuthCodeFlow {} => request - .credential_offer .grants .contains_key("authorization_code"), Self::SupportsPreAuthFlow {} => request - .credential_offer .grants .contains_key("urn:ietf:params:oauth:grant-type:pre-authorized_code"), Self::SupportsNonceEndpoint {} => request diff --git a/matcher-rs/src/openid4vci.rs b/matcher-rs/src/openid4vci.rs index 30ab32d..2afc092 100644 --- a/matcher-rs/src/openid4vci.rs +++ b/matcher-rs/src/openid4vci.rs @@ -1,6 +1,7 @@ #![allow(unused)] use nanoserde::DeJson; +use std::collections::HashMap; #[derive(DeJson, Debug, Default)] #[nserde(default)] @@ -18,7 +19,9 @@ pub struct OpenId4VciRequest { #[derive(DeJson, Debug, Default)] #[nserde(default)] pub struct OpenId4VciRequestData { - pub credential_offer: credential_offer::CredentialOffer, + pub credential_issuer: String, + pub credential_configuration_ids: Vec, + pub grants: HashMap, pub credential_issuer_metadata: Option, } @@ -26,8 +29,9 @@ pub struct OpenId4VciRequestData { * This correlates the `credential_configuration_ids` in the offer and `credential_configurations_supported` in the issuer metadata. */ pub struct RegularizedOpenId4VciRequestData<'a> { - // Borrow the offer - pub credential_offer: &'a credential_offer::CredentialOffer, + pub credential_issuer: &'a str, + pub credential_configuration_ids: &'a [String], + pub grants: &'a HashMap, // Borrow the metadata pub credential_issuer_metadata: Option<&'a credential_issuer_metadata::CredentialIssuerMetadata>, @@ -37,11 +41,10 @@ pub struct RegularizedOpenId4VciRequestData<'a> { // Implement From on a Reference impl<'a> From<&'a OpenId4VciRequestData> for RegularizedOpenId4VciRequestData<'a> { fn from(value: &'a OpenId4VciRequestData) -> Self { - let mut configurations = - Vec::with_capacity(value.credential_offer.credential_configuration_ids.len()); + let mut configurations = Vec::with_capacity(value.credential_configuration_ids.len()); if let Some(metadata) = &value.credential_issuer_metadata { - for id in &value.credential_offer.credential_configuration_ids { + for id in &value.credential_configuration_ids { if let Some(config) = metadata.credential_configurations_supported.get(id) { configurations.push(config); } @@ -49,7 +52,9 @@ impl<'a> From<&'a OpenId4VciRequestData> for RegularizedOpenId4VciRequestData<'a } Self { - credential_offer: &value.credential_offer, + credential_issuer: &value.credential_issuer, + credential_configuration_ids: &value.credential_configuration_ids, + grants: &value.grants, credential_issuer_metadata: value.credential_issuer_metadata.as_ref(), credential_configurations: configurations, } @@ -58,19 +63,15 @@ impl<'a> From<&'a OpenId4VciRequestData> for RegularizedOpenId4VciRequestData<'a pub mod credential_offer { use nanoserde::DeJson; - use std::collections::HashMap; #[derive(DeJson, Debug, Default)] #[nserde(default)] - pub struct CredentialOffer { - pub credential_issuer: String, - pub credential_configuration_ids: Vec, - pub grants: HashMap, + pub struct Grant { + // Workaround for nanoserde bug: + // https://github.com/not-fl3/nanoserde/issues/157 + #[allow(unused)] + pub _dummy_not_in_use: i32, } - - #[derive(DeJson, Debug, Default)] - #[nserde(default)] - pub struct Grant {} } mod credential_issuer_metadata {