diff --git a/src/WalletFramework.Oid4Vc/Oid4Vci/AuthFlow/Models/ClientAttestationPopDetails.cs b/src/WalletFramework.Oid4Vc/ClientAttestation/ClientAttestationPopDetails.cs similarity index 93% rename from src/WalletFramework.Oid4Vc/Oid4Vci/AuthFlow/Models/ClientAttestationPopDetails.cs rename to src/WalletFramework.Oid4Vc/ClientAttestation/ClientAttestationPopDetails.cs index fe5c859..d62c65c 100644 --- a/src/WalletFramework.Oid4Vc/Oid4Vci/AuthFlow/Models/ClientAttestationPopDetails.cs +++ b/src/WalletFramework.Oid4Vc/ClientAttestation/ClientAttestationPopDetails.cs @@ -1,7 +1,7 @@ using LanguageExt; using static System.String; -namespace WalletFramework.Oid4Vc.Oid4Vci.AuthFlow.Models; +namespace WalletFramework.Oid4Vc.ClientAttestation; public record ClientAttestationPopDetails { diff --git a/src/WalletFramework.Oid4Vc/Oid4Vci/AuthFlow/Models/CombinedWalletAttestation.cs b/src/WalletFramework.Oid4Vc/ClientAttestation/CombinedWalletAttestation.cs similarity index 91% rename from src/WalletFramework.Oid4Vc/Oid4Vci/AuthFlow/Models/CombinedWalletAttestation.cs rename to src/WalletFramework.Oid4Vc/ClientAttestation/CombinedWalletAttestation.cs index 80b2d39..fcc6f49 100644 --- a/src/WalletFramework.Oid4Vc/Oid4Vci/AuthFlow/Models/CombinedWalletAttestation.cs +++ b/src/WalletFramework.Oid4Vc/ClientAttestation/CombinedWalletAttestation.cs @@ -1,4 +1,6 @@ -namespace WalletFramework.Oid4Vc.Oid4Vci.AuthFlow.Models; +using WalletFramework.Oid4Vc.Oid4Vci.AuthFlow.Models; + +namespace WalletFramework.Oid4Vc.ClientAttestation; public record CombinedWalletAttestation { diff --git a/src/WalletFramework.Oid4Vc/ClientAttestation/HttpClientExtensions.cs b/src/WalletFramework.Oid4Vc/ClientAttestation/HttpClientExtensions.cs new file mode 100644 index 0000000..61f7394 --- /dev/null +++ b/src/WalletFramework.Oid4Vc/ClientAttestation/HttpClientExtensions.cs @@ -0,0 +1,10 @@ +namespace WalletFramework.Oid4Vc.ClientAttestation; + +public static class HttpClientExtensions +{ + public static void AddClientAttestationPopHeader(this HttpClient client, CombinedWalletAttestation clientAttestation) + { + client.DefaultRequestHeaders.Add("OAuth-Client-Attestation", clientAttestation.WalletInstanceAttestationJwt); + client.DefaultRequestHeaders.Add("OAuth-Client-Attestation-PoP", clientAttestation.WalletInstanceAttestationPopJwt); + } +} diff --git a/src/WalletFramework.Oid4Vc/Oid4Vci/AuthFlow/Models/WalletInstanceAttestationJwt.cs b/src/WalletFramework.Oid4Vc/ClientAttestation/WalletInstanceAttestationJwt.cs similarity index 92% rename from src/WalletFramework.Oid4Vc/Oid4Vci/AuthFlow/Models/WalletInstanceAttestationJwt.cs rename to src/WalletFramework.Oid4Vc/ClientAttestation/WalletInstanceAttestationJwt.cs index 691f64e..7b94151 100644 --- a/src/WalletFramework.Oid4Vc/Oid4Vci/AuthFlow/Models/WalletInstanceAttestationJwt.cs +++ b/src/WalletFramework.Oid4Vc/ClientAttestation/WalletInstanceAttestationJwt.cs @@ -1,7 +1,7 @@ using WalletFramework.Core.Functional; using WalletFramework.Core.Functional.Errors; -namespace WalletFramework.Oid4Vc.Oid4Vci.AuthFlow.Models; +namespace WalletFramework.Oid4Vc.ClientAttestation; public struct WalletInstanceAttestationJwt { diff --git a/src/WalletFramework.Oid4Vc/Oid4Vci/AuthFlow/Models/WalletInstanceAttestationPopJwt.cs b/src/WalletFramework.Oid4Vc/ClientAttestation/WalletInstanceAttestationPopJwt.cs similarity index 86% rename from src/WalletFramework.Oid4Vc/Oid4Vci/AuthFlow/Models/WalletInstanceAttestationPopJwt.cs rename to src/WalletFramework.Oid4Vc/ClientAttestation/WalletInstanceAttestationPopJwt.cs index 1cd8e84..bfc19e0 100644 --- a/src/WalletFramework.Oid4Vc/Oid4Vci/AuthFlow/Models/WalletInstanceAttestationPopJwt.cs +++ b/src/WalletFramework.Oid4Vc/ClientAttestation/WalletInstanceAttestationPopJwt.cs @@ -1,4 +1,4 @@ -namespace WalletFramework.Oid4Vc.Oid4Vci.AuthFlow.Models; +namespace WalletFramework.Oid4Vc.ClientAttestation; public struct WalletInstanceAttestationPopJwt { diff --git a/src/WalletFramework.Oid4Vc/Oid4Vp/Models/HaipAuthorizationRequestUri.cs b/src/WalletFramework.Oid4Vc/Oid4Vp/Models/HaipAuthorizationRequestUri.cs index 81e72c8..2cc271c 100644 --- a/src/WalletFramework.Oid4Vc/Oid4Vp/Models/HaipAuthorizationRequestUri.cs +++ b/src/WalletFramework.Oid4Vc/Oid4Vp/Models/HaipAuthorizationRequestUri.cs @@ -25,9 +25,6 @@ public class HaipAuthorizationRequestUri /// public static HaipAuthorizationRequestUri FromUri(Uri uri) { - if (uri.Scheme is not ("haip" or "openid4vp" or "mdoc-openid4vp")) - throw new InvalidOperationException("Invalid Scheme. Must be haip or openid4vp"); - var request = uri.GetQueryParam("request_uri"); if (string.IsNullOrEmpty(request)) throw new InvalidOperationException("HAIP requires request_uri parameter"); diff --git a/src/WalletFramework.Oid4Vc/Oid4Vp/Services/IOid4VpClientService.cs b/src/WalletFramework.Oid4Vc/Oid4Vp/Services/IOid4VpClientService.cs index b79a436..bf722d8 100644 --- a/src/WalletFramework.Oid4Vc/Oid4Vp/Services/IOid4VpClientService.cs +++ b/src/WalletFramework.Oid4Vc/Oid4Vp/Services/IOid4VpClientService.cs @@ -1,5 +1,6 @@ using WalletFramework.Oid4Vc.Oid4Vp.Models; +using WalletFramework.Oid4Vc.ClientAttestation; namespace WalletFramework.Oid4Vc.Oid4Vp.Services; /// @@ -22,10 +23,12 @@ public interface IOid4VpClientService /// /// /// + /// /// /// A task representing the asynchronous operation. The task result contains the Callback Url of the Authorization Response if present. /// Task SendAuthorizationResponseAsync( AuthorizationRequest authorizationRequest, - IEnumerable selectedCredentials); + IEnumerable selectedCredentials, + CombinedWalletAttestation? combinedWalletAttestation = null); } diff --git a/src/WalletFramework.Oid4Vc/Oid4Vp/Services/Oid4VpClientService.cs b/src/WalletFramework.Oid4Vc/Oid4Vp/Services/Oid4VpClientService.cs index 4d8eb77..3696823 100644 --- a/src/WalletFramework.Oid4Vc/Oid4Vp/Services/Oid4VpClientService.cs +++ b/src/WalletFramework.Oid4Vc/Oid4Vp/Services/Oid4VpClientService.cs @@ -2,6 +2,7 @@ using LanguageExt; using Microsoft.Extensions.Logging; using SD_JWT.Models; +using WalletFramework.Oid4Vc.ClientAttestation; using WalletFramework.Core.Credentials.Abstractions; using WalletFramework.Core.Functional; using WalletFramework.MdocLib; @@ -10,7 +11,6 @@ using WalletFramework.MdocLib.Elements; using WalletFramework.MdocLib.Security; using WalletFramework.MdocVc; -using WalletFramework.Oid4Vc.Oid4Vci.Abstractions; using WalletFramework.Oid4Vc.Oid4Vci.CredConfiguration.Models; using WalletFramework.Oid4Vc.Oid4Vp.Models; using WalletFramework.Oid4Vc.Oid4Vp.PresentationExchange.Services; @@ -82,7 +82,8 @@ public Oid4VpClientService( /// public async Task SendAuthorizationResponseAsync( AuthorizationRequest authorizationRequest, - IEnumerable selectedCredentials) + IEnumerable selectedCredentials, + CombinedWalletAttestation? clientAttestation = null) { var credentials = selectedCredentials.ToList(); @@ -171,6 +172,8 @@ from path in field.Path.Select(path => path.TrimStart('$', '.')) var httpClient = _httpClientFactory.CreateClient(); httpClient.DefaultRequestHeaders.Clear(); + if (clientAttestation is not null) + httpClient.AddClientAttestationPopHeader(clientAttestation); var json = SerializeObject(authorizationResponse); var nameValueCollection = DeserializeObject>(json)!.ToList();