diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index cce3710df..98f0c89dd 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -12,6 +12,6 @@ assignees: '' # # There's a better way to get help! # -# Send your questions or issues to sdksupport@yoti.com +# Send your questions or issues to https://support.yoti.com # # diff --git a/.gitignore b/.gitignore index 82b0fcb20..6e27c66c1 100644 --- a/.gitignore +++ b/.gitignore @@ -34,9 +34,6 @@ Backup*/ # except build/, which is used as an MSBuild target. !**/packages/build/ -.DS_STORE -.DS_Store - # Coverage OpenCover/ diff --git a/README.md b/README.md index 64354c12d..0a1650864 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,7 @@ The Yoti SDK can be used for the following products, follow the links for more i ## Support -For any questions or support please email [clientsupport@yoti.com](mailto:clientsupport@yoti.com). +For any questions or support please contact us here: https://support.yoti.com Please provide the following to get you up and working as quickly as possible: * Computer type diff --git a/azure-pipelines.yml b/azure-pipelines.yml index c49c740f9..1bf2aa621 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -32,11 +32,11 @@ steps: scannerMode: 'MSBuild' projectKey: 'getyoti:dotnet' projectName: '.NET SDK' - projectVersion: '3.11.0' + projectVersion: '3.19.0' extraProperties: | sonar.cs.opencover.reportsPaths="**/coverage.opencover.xml" sonar.links.scm = https://github.com/getyoti/yoti-dotnet-sdk - sonar.exclusions = src/Yoti.Auth/ProtoBuf/**,src/Examples/**,**/obj/**,**/*.dll + sonar.exclusions = src/Yoti.Auth/ProtoBuf/**,src/Examples/**,**/obj/**,**/*.dll,src/Yoti.Auth/DigitalIdentity/** displayName: SonarCloud Prepare Analysis - task: NuGetToolInstaller@1 diff --git a/src/Examples/Aml/AmlExample/AmlExample.csproj b/src/Examples/Aml/AmlExample/AmlExample.csproj index 15bf388e9..ab68935fb 100644 --- a/src/Examples/Aml/AmlExample/AmlExample.csproj +++ b/src/Examples/Aml/AmlExample/AmlExample.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp2.1 + netcoreapp3.1 @@ -12,7 +12,7 @@ - + diff --git a/src/Examples/DigitalIdentity/DigitalIdentity/.dockerignore b/src/Examples/DigitalIdentity/DigitalIdentity/.dockerignore new file mode 100644 index 000000000..e7b690f11 --- /dev/null +++ b/src/Examples/DigitalIdentity/DigitalIdentity/.dockerignore @@ -0,0 +1,25 @@ +**/.classpath +**/.dockerignore +**/.env +**/.git +**/.gitignore +**/.project +**/.settings +**/.toolstarget +**/.vs +**/.vscode +**/*.*proj.user +**/*.dbmdl +**/*.jfm +**/azds.yaml +**/bin +**/charts +**/docker-compose* +**/Dockerfile* +**/node_modules +**/npm-debug.log +**/obj +**/secrets.dev.yaml +**/values.dev.yaml +LICENSE +README.md diff --git a/src/Examples/DigitalIdentity/DigitalIdentity/.env.example b/src/Examples/DigitalIdentity/DigitalIdentity/.env.example new file mode 100644 index 000000000..e8d11ad0c --- /dev/null +++ b/src/Examples/DigitalIdentity/DigitalIdentity/.env.example @@ -0,0 +1,2 @@ +YOTI_CLIENT_SDK_ID=yourClientSdkId +YOTI_KEY_FILE_PATH=yourKeyFilePath diff --git a/src/Examples/DigitalIdentity/DigitalIdentity/Controllers/AdvancedIdentityShareController.cs b/src/Examples/DigitalIdentity/DigitalIdentity/Controllers/AdvancedIdentityShareController.cs new file mode 100644 index 000000000..b6cf7f5b1 --- /dev/null +++ b/src/Examples/DigitalIdentity/DigitalIdentity/Controllers/AdvancedIdentityShareController.cs @@ -0,0 +1,94 @@ +using System; +using System.IO; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Yoti.Auth; +using Yoti.Auth.DigitalIdentity; +using Yoti.Auth.DigitalIdentity.Policy; + +namespace DigitalIdentityExample.Controllers +{ + public class AdvancedIdentityShareController : Controller + { + private readonly string _clientSdkId; + private readonly ILogger _logger; + public AdvancedIdentityShareController(ILogger logger) + { + _logger = logger; + + _clientSdkId = Environment.GetEnvironmentVariable("YOTI_CLIENT_SDK_ID"); + _logger.LogInformation(string.Format("Yoti Client SDK ID='{0}'", _clientSdkId)); + } + + // GET: /advanced-identity-share + [Route("advanced-identity-share")] + public IActionResult DigitalIdentity() + { + try + { + string yotiKeyFilePath = Environment.GetEnvironmentVariable("YOTI_KEY_FILE_PATH"); + _logger.LogInformation( + string.Format( + "yotiKeyFilePath='{0}'", + yotiKeyFilePath)); + + StreamReader privateKeyStream = System.IO.File.OpenText(yotiKeyFilePath); + + var yotiClient = new DigitalIdentityClient(_clientSdkId, privateKeyStream); + + string advancedIdentityProfileJson = @" + { + ""profiles"": [ + { + ""trust_framework"": ""YOTI_GLOBAL"", + ""schemes"": [ + { + ""label"": ""identity-AL-L1"", + ""type"": ""IDENTITY"", + ""objective"": ""AL_L1"", + + }, + { + ""label"": ""identity-AL-M1"", + ""type"": ""IDENTITY"", + ""objective"": ""AL_M1"", + + } + ] + } + ] + + }"; + + var advancedIdentityProfile = JsonConvert.DeserializeObject(advancedIdentityProfileJson); + + var policy = new PolicyBuilder() + .WithAdvancedIdentityProfileRequirements(advancedIdentityProfile) + .Build(); + + var sessionReq = new ShareSessionRequestBuilder().WithPolicy(policy) + .WithRedirectUri("https:/www.yoti.com") + .Build(); + + var SessionResult = yotiClient.CreateShareSession(sessionReq); + + var sharedReceiptResponse = new SharedReceiptResponse(); + ViewBag.YotiClientSdkId = _clientSdkId; + ViewBag.sessionID = SessionResult.Id; + + return View("AdvancedIdentityShare", sharedReceiptResponse); + } + catch (Exception e) + { + _logger.LogError( + exception: e, + message: e.Message); + + TempData["Error"] = e.Message; + TempData["InnerException"] = e.InnerException?.Message; + return RedirectToAction("Error", "Success"); + } + } + } +} diff --git a/src/Examples/DigitalIdentity/DigitalIdentity/Controllers/HomeController.cs b/src/Examples/DigitalIdentity/DigitalIdentity/Controllers/HomeController.cs new file mode 100644 index 000000000..04a06bfaf --- /dev/null +++ b/src/Examples/DigitalIdentity/DigitalIdentity/Controllers/HomeController.cs @@ -0,0 +1,90 @@ +using System; +using System.IO; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using Yoti.Auth; +using Yoti.Auth.DigitalIdentity; +using Yoti.Auth.DigitalIdentity.Policy; + +namespace DigitalIdentityExample.Controllers +{ + public class HomeController : Controller + { + private readonly string _clientSdkId; + private readonly ILogger _logger; + public HomeController(ILogger logger) + { + _logger = logger; + + _clientSdkId = Environment.GetEnvironmentVariable("YOTI_CLIENT_SDK_ID"); + _logger.LogInformation(string.Format("Yoti Client SDK ID='{0}'", _clientSdkId)); + } + + // GET: /generate-share + [Route("generate-share")] + public IActionResult DigitalIdentity() + { + try + { + string yotiKeyFilePath = Environment.GetEnvironmentVariable("YOTI_KEY_FILE_PATH"); + _logger.LogInformation( + string.Format( + "yotiKeyFilePath='{0}'", + yotiKeyFilePath)); + + StreamReader privateKeyStream = System.IO.File.OpenText(yotiKeyFilePath); + + var yotiClient = new DigitalIdentityClient(_clientSdkId, privateKeyStream); + + var givenNamesWantedAttribute = new WantedAttributeBuilder() + .WithName("given_names") + .WithOptional(false) + .Build(); + + var notification = new NotificationBuilder() + .WithUrl("https://example.com/webhook") + .WithMethod("POST") + .WithVerifyTls(true) + .Build(); + + var policy = new PolicyBuilder() + .WithWantedAttribute(givenNamesWantedAttribute) + .WithFullName() + .WithEmail() + .WithPhoneNumber() + .WithSelfie() + .WithAgeOver(18) + .WithNationality() + .WithGender() + .WithDocumentDetails() + .WithDocumentImages() + .Build(); + + var sessionReq = new ShareSessionRequestBuilder().WithPolicy(policy) + .WithNotification(notification) + .WithRedirectUri("https:/www.yoti.com").WithSubject(new + { + subject_id = "some_subject_id_string" + }).Build(); + + var SessionResult = yotiClient.CreateShareSession(sessionReq); + + var sharedReceiptResponse = new SharedReceiptResponse(); + ViewBag.YotiClientSdkId = _clientSdkId; + ViewBag.sessionID = SessionResult.Id; + + return View("DigitalIdentity", sharedReceiptResponse); + } + catch (Exception e) + { + _logger.LogError( + exception: e, + message: e.Message); + + TempData["Error"] = e.Message; + TempData["InnerException"] = e.InnerException?.Message; + return RedirectToAction("Error", "Success"); + } + } + } +} diff --git a/src/Examples/DigitalIdentity/DigitalIdentity/Controllers/SuccessController.cs b/src/Examples/DigitalIdentity/DigitalIdentity/Controllers/SuccessController.cs new file mode 100644 index 000000000..aeac61a24 --- /dev/null +++ b/src/Examples/DigitalIdentity/DigitalIdentity/Controllers/SuccessController.cs @@ -0,0 +1,163 @@ +using System; +using System.IO; +using DigitalIdentity.Models; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using Yoti.Auth; +using Yoti.Auth.Attribute; +using Yoti.Auth.Document; +using Yoti.Auth.Images; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using Newtonsoft.Json.Linq; + +namespace DigitalIdentityExample.Controllers +{ + public class SuccessController : Controller + { + private readonly string _clientSdkId; + private readonly ILogger _logger; + public SuccessController(ILogger logger) + { + _logger = logger; + + _clientSdkId = Environment.GetEnvironmentVariable("YOTI_CLIENT_SDK_ID"); + _logger.LogInformation(string.Format("Yoti Client SDK ID='{0}'", _clientSdkId)); + } + public ActionResult Error() + { + return View(); + } + [Route("receipt-info")] + // GET: receipt-info?ReceiptID + public IActionResult ReceiptInfo(string ReceiptID) + { + try + { + string yotiKeyFilePath = Environment.GetEnvironmentVariable("YOTI_KEY_FILE_PATH"); + _logger.LogInformation( + string.Format( + "yotiKeyFilePath='{0}'", + yotiKeyFilePath)); + + StreamReader privateKeyStream = System.IO.File.OpenText(yotiKeyFilePath); + + var yotiClient = new DigitalIdentityClient(_clientSdkId, privateKeyStream); + + var ReceiptResult = yotiClient.GetShareReceipt(ReceiptID); + + DisplayAttributes displayAttributes = CreateDisplayAttributes(ReceiptResult.UserContent.UserProfile.AttributeCollection); + if (ReceiptResult.UserContent.UserProfile.FullName != null) + { + displayAttributes.FullName = ReceiptResult.UserContent.UserProfile.FullName.GetValue(); + } + + YotiAttribute selfie = ReceiptResult.UserContent.UserProfile.Selfie; + if (ReceiptResult.UserContent.UserProfile.Selfie != null) + { + displayAttributes.Base64Selfie = selfie.GetValue().GetBase64URI(); + } + ViewBag.YotiClientSdkId = _clientSdkId; + + return View("SuccessResult", displayAttributes); + } + catch (Exception e) + { + _logger.LogError( + exception: e, + message: e.Message); + + TempData["Error"] = e.Message; + TempData["InnerException"] = e.InnerException?.Message; + return RedirectToAction("Error", "Success"); + } + } + + private static DisplayAttributes CreateDisplayAttributes(ReadOnlyCollection attributes) + { + var displayAttributes = new DisplayAttributes(); + + foreach (var yotiAttribute in attributes) + { + switch (yotiAttribute.GetName()) + { + case Yoti.Auth.Constants.UserProfile.FullNameAttribute: + // Do nothing - we are displaying this already + break; + + case Yoti.Auth.Constants.UserProfile.GivenNamesAttribute: + AddDisplayAttribute("Given name", "yoti-icon-profile", yotiAttribute, displayAttributes); + break; + + case Yoti.Auth.Constants.UserProfile.FamilyNameAttribute: + AddDisplayAttribute("Family name", "yoti-icon-profile", yotiAttribute, displayAttributes); + break; + + case Yoti.Auth.Constants.UserProfile.NationalityAttribute: + AddDisplayAttribute("Nationality", "yoti-icon-nationality", yotiAttribute, displayAttributes); + break; + + case Yoti.Auth.Constants.UserProfile.PostalAddressAttribute: + AddDisplayAttribute("Postal Address", "yoti-icon-address", yotiAttribute, displayAttributes); + break; + + case Yoti.Auth.Constants.UserProfile.StructuredPostalAddressAttribute: + AddDisplayAttribute>("Structured Postal Address", "yoti-icon-address", yotiAttribute, displayAttributes); + break; + + case Yoti.Auth.Constants.UserProfile.PhoneNumberAttribute: + AddDisplayAttribute("Mobile number", "yoti-icon-phone", yotiAttribute, displayAttributes); + break; + + case Yoti.Auth.Constants.UserProfile.EmailAddressAttribute: + AddDisplayAttribute("Email address", "yoti-icon-email", yotiAttribute, displayAttributes); + break; + + case Yoti.Auth.Constants.UserProfile.DateOfBirthAttribute: + AddDisplayAttribute("Date of birth", "yoti-icon-calendar", yotiAttribute, displayAttributes); + break; + + case Yoti.Auth.Constants.UserProfile.SelfieAttribute: + // Do nothing - we already display the selfie + break; + + case Yoti.Auth.Constants.UserProfile.GenderAttribute: + AddDisplayAttribute("Gender", "yoti-icon-gender", yotiAttribute, displayAttributes); + break; + + case Yoti.Auth.Constants.UserProfile.DocumentDetailsAttribute: + AddDisplayAttribute("Document Details", "yoti-icon-profile", yotiAttribute, displayAttributes); + break; + + case Yoti.Auth.Constants.UserProfile.DocumentImagesAttribute: + AddDisplayAttribute>("Document Images", "yoti-icon-profile", yotiAttribute, displayAttributes); + break; + + case Yoti.Auth.Constants.UserProfile.IdentityProfileReportAttribute: + AddDisplayAttribute>("Identity Profile Report", "yoti-icon-profile", yotiAttribute, displayAttributes); + break; + + default: + if (yotiAttribute is YotiAttribute stringAttribute) + { + if (stringAttribute.GetName().Contains(":")) + { + displayAttributes.Add(new DisplayAttribute("Age Verification/", "Age verified", "yoti-icon-verified", stringAttribute.GetAnchors(), stringAttribute.GetValue())); + break; + } + + AddDisplayAttribute(stringAttribute.GetName(), "yoti-icon-profile", yotiAttribute, displayAttributes); + } + break; + } + } + + return displayAttributes; + } + private static void AddDisplayAttribute(string name, string icon, BaseAttribute baseAttribute, DisplayAttributes displayAttributes) + { + if (baseAttribute is YotiAttribute yotiAttribute) + displayAttributes.Add(name, icon, yotiAttribute.GetAnchors(), yotiAttribute.GetValue()); + } + } +} diff --git a/src/Examples/DigitalIdentity/DigitalIdentity/DigitalIdentityExample.csproj b/src/Examples/DigitalIdentity/DigitalIdentity/DigitalIdentityExample.csproj new file mode 100644 index 000000000..b24d78cf1 --- /dev/null +++ b/src/Examples/DigitalIdentity/DigitalIdentity/DigitalIdentityExample.csproj @@ -0,0 +1,55 @@ + + + + net6.0 + Linux + 9c82fa55-c27e-4405-8983-72662528e16f + ..\..\docker-compose.dcproj + ..\..\.. + DigitalIdentityExample + DigitalIdentityExample + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PreserveNewest + + + + + + + + + <_ContentIncludedByDefault Remove="Pages\Success\SuccessResult.cshtml" /> + + \ No newline at end of file diff --git a/src/Examples/DigitalIdentity/DigitalIdentity/Dockerfile b/src/Examples/DigitalIdentity/DigitalIdentity/Dockerfile new file mode 100644 index 000000000..bfd9c6630 --- /dev/null +++ b/src/Examples/DigitalIdentity/DigitalIdentity/Dockerfile @@ -0,0 +1,20 @@ +FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base + +WORKDIR /app +EXPOSE 80 +EXPOSE 443 + +FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build +WORKDIR /src +COPY Examples/DigitalIdentity/DigitalIdentity/DigitalIdentityExample.csproj Examples/DigitalIdentity/DigitalIdentity/ +COPY Yoti.Auth/Yoti.Auth.csproj Yoti.Auth/ +COPY . . +WORKDIR /src/Examples/DigitalIdentity/DigitalIdentity + +FROM build AS publish +RUN dotnet publish DigitalIdentityExample.csproj -c Release -r linux-x64 -o /app -p:TargetFrameworks=netcoreapp6.0 -f netcoreapp6.0 + +FROM base AS final +WORKDIR /app +COPY --from=publish /app . +ENTRYPOINT ["dotnet", "./DigitalIdentityExample.dll"] diff --git a/src/Examples/DigitalIdentity/DigitalIdentity/GlobalSuppressions.cs b/src/Examples/DigitalIdentity/DigitalIdentity/GlobalSuppressions.cs new file mode 100644 index 000000000..87fc554ae --- /dev/null +++ b/src/Examples/DigitalIdentity/DigitalIdentity/GlobalSuppressions.cs @@ -0,0 +1,9 @@ +// This file is used by Code Analysis to maintain SuppressMessage +// attributes that are applied to this project. +// Project-level suppressions either have no target or are given +// a specific target and scoped to a namespace, type, member, etc. + +[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Performance", "CA1822:Mark members as static", Justification = "Auto-generated", Scope = "member", Target = "~M:DigitalIdentityExample.Startup.ConfigureServices(Microsoft.Extensions.DependencyInjection.IServiceCollection)")] +[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Performance", "CA1822:Mark members as static", Justification = "Auto-generated", Scope = "member", Target = "~M:DigitalIdentityExample.Startup.Configure(Microsoft.AspNetCore.Builder.IApplicationBuilder,Microsoft.AspNetCore.Hosting.IHostingEnvironment)")] +[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Design", "CA1031:Do not catch general exception types", Justification = "We want to show all errors here to aid debugging", Scope = "member", Target = "~M:DigitalIdentityExample.Controllers.AccountController.Connect(System.String)~Microsoft.AspNetCore.Mvc.ActionResult")] +[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Design", "CA1031:Do not catch general exception types", Justification = "We want to show all errors here to aid debugging", Scope = "member", Target = "~M:DigitalIdentityExample.Controllers.HomeController.DynamicScenario~Microsoft.AspNetCore.Mvc.IActionResult")] diff --git a/src/Examples/DigitalIdentity/DigitalIdentity/Models/DisplayAttribute.cs b/src/Examples/DigitalIdentity/DigitalIdentity/Models/DisplayAttribute.cs new file mode 100644 index 000000000..6625d295d --- /dev/null +++ b/src/Examples/DigitalIdentity/DigitalIdentity/Models/DisplayAttribute.cs @@ -0,0 +1,62 @@ +using System.Collections.Generic; +using Yoti.Auth.Anchors; + +namespace DigitalIdentity.Models +{ + public class DisplayAttribute + { + private readonly string _displayName; + private readonly string _preValue; + private readonly string _icon; + private readonly List _anchors; + private readonly object _value; + + public DisplayAttribute(string displayName, string icon, List anchors, object value) + { + _displayName = displayName; + _preValue = ""; + _icon = icon; + _anchors = anchors; + _value = value; + } + + public DisplayAttribute(string preValue, string displayName, string icon, List anchors, object value) + { + _displayName = displayName; + _preValue = preValue; + _icon = icon; + _anchors = anchors; + _value = value; + } + + public string GetDisplayName() + { + return _displayName; + } + + public string GetPreValue() + { + return _preValue; + } + + public string GetIcon() + { + return _icon; + } + + public List GetAnchors() + { + return _anchors; + } + + public string GetDisplayValue() + { + return _preValue + _value.ToString(); + } + + public object GetValue() + { + return _value; + } + } +} diff --git a/src/Examples/DigitalIdentity/DigitalIdentity/Models/DisplayAttributes.cs b/src/Examples/DigitalIdentity/DigitalIdentity/Models/DisplayAttributes.cs new file mode 100644 index 000000000..417d3e7ef --- /dev/null +++ b/src/Examples/DigitalIdentity/DigitalIdentity/Models/DisplayAttributes.cs @@ -0,0 +1,28 @@ +using System.Collections.Generic; +using Yoti.Auth.Anchors; + +namespace DigitalIdentity.Models +{ + public class DisplayAttributes + { + public List AttributeList { get; internal set; } + public string Base64Selfie { get; internal set; } + public string FullName { get; internal set; } + + internal DisplayAttributes() + { + AttributeList = new List(); + } + + internal void Add(DisplayAttribute displayAttribute) + { + AttributeList.Add(displayAttribute); + } + + internal void Add(string displayName, string icon, List anchors, object value) + { + DisplayAttribute displayAttribute = new DisplayAttribute(displayName, icon, anchors, value); + AttributeList.Add(displayAttribute); + } + } +} diff --git a/src/Examples/DigitalIdentity/DigitalIdentity/Program.cs b/src/Examples/DigitalIdentity/DigitalIdentity/Program.cs new file mode 100644 index 000000000..2e32c9abe --- /dev/null +++ b/src/Examples/DigitalIdentity/DigitalIdentity/Program.cs @@ -0,0 +1,17 @@ +using Microsoft.AspNetCore; +using Microsoft.AspNetCore.Hosting; + +namespace CoreExample +{ + public static class Program + { + public static void Main(string[] args) + { + CreateWebHostBuilder(args).Build().Run(); + } + + public static IWebHostBuilder CreateWebHostBuilder(string[] args) => + WebHost.CreateDefaultBuilder(args) + .UseStartup(); + } +} diff --git a/src/Examples/DigitalIdentity/DigitalIdentity/Properties/launchSettings.json b/src/Examples/DigitalIdentity/DigitalIdentity/Properties/launchSettings.json new file mode 100644 index 000000000..cb95eb61a --- /dev/null +++ b/src/Examples/DigitalIdentity/DigitalIdentity/Properties/launchSettings.json @@ -0,0 +1,26 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:55000", + "sslPort": 44380 + } + }, + "profiles": { + "CoreExample": { + "commandName": "Project", + "launchBrowser": true, + "applicationUrl": "https://localhost:44344;http://localhost:44343", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "Docker": { + "commandName": "Docker", + "launchBrowser": true, + "launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}", + "environmentVariables": {} + } + } +} diff --git a/src/Examples/DigitalIdentity/DigitalIdentity/README.md b/src/Examples/DigitalIdentity/DigitalIdentity/README.md new file mode 100644 index 000000000..64b310ce0 --- /dev/null +++ b/src/Examples/DigitalIdentity/DigitalIdentity/README.md @@ -0,0 +1,21 @@ +# .NET Core Example project + +## 1) Setup +1) Clone this repo +1) Navigate to this folder +1) Rename the [.env.example](.env.example) file to `.env` +1) Fill in the environment variables in this file with the ones specific to your application, generated in the [Yoti Hub](https://hub.yoti.com) when you create (and then publish) your application + +## 2a) Running With Docker +1) From the Yoti Hub, set the application domain to `localhost:44380` +1) `docker-compose build --no-cache` +1) `docker-compose up` +1) Navigate to + +>If you encounter a "permission denied" error when trying to access the mounted .pem file, try disabling and re-enabling your shared drive in Docker settings. + +## 2b) Running With .NET Core installed locally +1) From the Yoti Hub, set the application domain to `localhost:44344` +1) Download the .NET SDK for your operating system from step no.1 on ([Windows](https://www.microsoft.com/net/learn/get-started/windows) | [Linux](https://www.microsoft.com/net/learn/get-started/linux/rhel) | [MacOS](https://www.microsoft.com/net/learn/get-started/macos)) +1) Enter `dotnet run -p DigitalIdentityExample.csproj` into the terminal +1) Navigate to the page specified in the terminal window, which should be diff --git a/src/Examples/DigitalIdentity/DigitalIdentity/Startup.cs b/src/Examples/DigitalIdentity/DigitalIdentity/Startup.cs new file mode 100644 index 000000000..04dd39196 --- /dev/null +++ b/src/Examples/DigitalIdentity/DigitalIdentity/Startup.cs @@ -0,0 +1,87 @@ +using System.IO; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; + +namespace CoreExample +{ + public class Startup + { + public Startup(IConfiguration configuration, ILogger logger) + { + Configuration = configuration; + if (File.Exists(".env")) + { + logger.LogInformation("using environment variables from .env file"); + DotNetEnv.Env.Load(); + } + if (string.IsNullOrEmpty(System.Environment.GetEnvironmentVariable("YOTI_CLIENT_SDK_ID"))) + logger.LogCritical("'YOTI_CLIENT_SDK_ID' environment variable not found. " + + "Either pass these in the .env file, or as a standard environment variable."); + } + + public IConfiguration Configuration { get; } + + // This method gets called by the runtime. Use this method to add services to the container. + public void ConfigureServices(IServiceCollection services) + { + services.Configure(options => + { + // This lambda determines whether user consent for non-essential cookies is needed + // for a given request. + options.CheckConsentNeeded = context => true; + options.MinimumSameSitePolicy = SameSiteMode.None; + }); + + services.AddMvc() + .AddSessionStateTempDataProvider(); + services.AddMemoryCache(); + services.AddDistributedMemoryCache(); + services.AddSession(options => + { + options.Cookie.IsEssential = true; + }); + } + + // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. + public void Configure(IApplicationBuilder app, IWebHostEnvironment env) + { + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + } + else + { + app.UseExceptionHandler("/Home/Error"); + app.UseHsts(); + } + + app.UseRouting(); + app.UseHttpsRedirection(); + app.UseStaticFiles(); + app.UseSession(); + app.UseCookiePolicy(); + + app.UseEndpoints(endpoints => + { + endpoints.MapControllerRoute( + name: "default", + pattern: "{controller=Home}/{action=Index}/{id?}"); + }); + app.Use(async (context, next) => + { + if (context.Request.Path == "/") + { + context.Response.Redirect("/generate-share"); + return; + } + + await next(); + }); + } + } +} diff --git a/src/Examples/DigitalIdentity/DigitalIdentity/Views/AdvancedIdentityShare/AdvancedIdentityShare.cshtml b/src/Examples/DigitalIdentity/DigitalIdentity/Views/AdvancedIdentityShare/AdvancedIdentityShare.cshtml new file mode 100644 index 000000000..fe627f052 --- /dev/null +++ b/src/Examples/DigitalIdentity/DigitalIdentity/Views/AdvancedIdentityShare/AdvancedIdentityShare.cshtml @@ -0,0 +1,92 @@ +@{ + ViewData["Title"] = "Advanced Identity Share"; +} +@model Yoti.Auth.DigitalIdentity.SharedReceiptResponse + + + + + + + + Yoti Digital Identity Client Example + + + + + + +
+
+
+ Yoti +
+ +

Advanced Identity Share Example

+ +
+
+
+ +
+ +
+

The Yoti app is free to download and use:

+ +
+ + Download on the App Store + + + + get it on Google Play + +
+
+
+ + + + + diff --git a/src/Examples/DigitalIdentity/DigitalIdentity/Views/Home/DigitalIdentity.cshtml b/src/Examples/DigitalIdentity/DigitalIdentity/Views/Home/DigitalIdentity.cshtml new file mode 100644 index 000000000..841d32ac8 --- /dev/null +++ b/src/Examples/DigitalIdentity/DigitalIdentity/Views/Home/DigitalIdentity.cshtml @@ -0,0 +1,92 @@ +@{ + ViewData["Title"] = "Digital Identity"; +} +@model Yoti.Auth.DigitalIdentity.SharedReceiptResponse + + + + + + + + Yoti Digital Identity Client Example + + + + + + +
+
+
+ Yoti +
+ +

Digital Identity Share Example

+ +
+
+
+ +
+ +
+

The Yoti app is free to download and use:

+ +
+ + Download on the App Store + + + + get it on Google Play + +
+
+
+ + + + + diff --git a/src/Examples/DigitalIdentity/DigitalIdentity/Views/Success/Error.cshtml b/src/Examples/DigitalIdentity/DigitalIdentity/Views/Success/Error.cshtml new file mode 100644 index 000000000..9cd2d4599 --- /dev/null +++ b/src/Examples/DigitalIdentity/DigitalIdentity/Views/Success/Error.cshtml @@ -0,0 +1,19 @@ +@{ + ViewData["Title"] = "Error"; +} + + + + Welcome + + +

Home

+

+ Could not login user for the following reason: @TempData["Error"] +

+

Inner exception:

+

+ @TempData["InnerException"] +

+ + \ No newline at end of file diff --git a/src/Examples/DigitalIdentity/DigitalIdentity/Views/Success/SuccessResult.cshtml b/src/Examples/DigitalIdentity/DigitalIdentity/Views/Success/SuccessResult.cshtml new file mode 100644 index 000000000..a27d3c400 --- /dev/null +++ b/src/Examples/DigitalIdentity/DigitalIdentity/Views/Success/SuccessResult.cshtml @@ -0,0 +1,172 @@ +@{ + ViewData["Title"] = "Connect"; +} +@using System.Globalization; +@using Newtonsoft.Json +@using Newtonsoft.Json.Linq; +@using Yoti.Auth.Document; +@using Yoti.Auth.Images; +@model DigitalIdentity.Models.DisplayAttributes + + + + + + Yoti client example + + + + +
+
+ +
+ Powered by + Yoti +
+ +
+ @if (!string.IsNullOrEmpty(Model.Base64Selfie)) + { +
+ Yoti + + +
+ } + +
+ @Model.FullName +
+
+
+ +
+ + +
+
Attribute
+
Value
+
Anchors
+
+ +
+
+
S / V
+
Value
+
Sub type
+
+
+ +
+ @foreach (DigitalIdentity.Models.DisplayAttribute a in Model.AttributeList) + { +
+
+
+ + @a.GetDisplayName() +
+
+ +
+
+ @switch (a.GetDisplayName()) + { + case "Structured Postal Address": + + @foreach (var item in (Dictionary)a.GetValue()) + { + + + + + } +
@item.Key@item.Value
+ break; + + case "Identity Profile Report": + + @foreach (var item in (Dictionary)a.GetValue()) + { + + + + + + } +
+ @item.Key
+
+                                                            @Html.Raw(@item.Value.ToString(Formatting.Indented))
+                                                        
+
+ break; + + case "Document Details": + { + DocumentDetails documentDetailsValue = (DocumentDetails)a.GetValue(); + + + + + + + + + + + + + + + + + + + + + +
Type@documentDetailsValue.DocumentType
Issuing Country@documentDetailsValue.IssuingCountry
Issuing Authority@documentDetailsValue.IssuingAuthority
Document Number@documentDetailsValue.DocumentNumber
Expiration Date@documentDetailsValue.ExpirationDate.ToString()
+ } + break; + + case "Document Images": + foreach (var image in (List)a.GetValue()) + { + + } + break; + + default: + @a.GetDisplayValue() + break; + } +
+
+ +
+
S / V
+
Value
+
Sub type
+ + @foreach (var source in a.GetAnchors().Where(s => s.GetAnchorType() == Yoti.Auth.Anchors.AnchorType.SOURCE)) + { +
Source
+
@string.Join(", ", source.GetValue())
+
@source.GetSubType()
+ } + @foreach (var verifier in a.GetAnchors().Where(v => v.GetAnchorType() == Yoti.Auth.Anchors.AnchorType.VERIFIER)) + { +
Verifier
+
@string.Join(", ", verifier.GetValue())
+
@verifier.GetSubType()
+ } +
+
+ } +
+
+
+ + diff --git a/src/Examples/DigitalIdentity/DigitalIdentity/Views/Web.config b/src/Examples/DigitalIdentity/DigitalIdentity/Views/Web.config new file mode 100644 index 000000000..9bc7eab38 --- /dev/null +++ b/src/Examples/DigitalIdentity/DigitalIdentity/Views/Web.config @@ -0,0 +1,43 @@ + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Examples/DigitalIdentity/DigitalIdentity/appsettings.Development.json b/src/Examples/DigitalIdentity/DigitalIdentity/appsettings.Development.json new file mode 100644 index 000000000..e203e9407 --- /dev/null +++ b/src/Examples/DigitalIdentity/DigitalIdentity/appsettings.Development.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Debug", + "System": "Information", + "Microsoft": "Information" + } + } +} diff --git a/src/Examples/DigitalIdentity/DigitalIdentity/appsettings.json b/src/Examples/DigitalIdentity/DigitalIdentity/appsettings.json new file mode 100644 index 000000000..def9159a7 --- /dev/null +++ b/src/Examples/DigitalIdentity/DigitalIdentity/appsettings.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Warning" + } + }, + "AllowedHosts": "*" +} diff --git a/src/Examples/DigitalIdentity/DigitalIdentity/docker-compose.dcproj b/src/Examples/DigitalIdentity/DigitalIdentity/docker-compose.dcproj new file mode 100644 index 000000000..86377fe65 --- /dev/null +++ b/src/Examples/DigitalIdentity/DigitalIdentity/docker-compose.dcproj @@ -0,0 +1,18 @@ + + + + 2.1 + Linux + 85f77b23-0b47-448a-a498-fc0aa1a7b46a + LaunchBrowser + {Scheme}://localhost:{ServicePort} + digitalidentity + + + + docker-compose.yml + + + + + diff --git a/src/Examples/DigitalIdentity/DigitalIdentity/docker-compose.override.yml b/src/Examples/DigitalIdentity/DigitalIdentity/docker-compose.override.yml new file mode 100644 index 000000000..701f4c3f2 --- /dev/null +++ b/src/Examples/DigitalIdentity/DigitalIdentity/docker-compose.override.yml @@ -0,0 +1,18 @@ +version: '3.4' + +services: + digitalidentityexample: + environment: + - ASPNETCORE_ENVIRONMENT=Development + - ASPNETCORE_URLS=https://+:443;http://+:80 + - ASPNETCORE_HTTPS_PORT=44380 + - YOTI_SCENARIO_ID=${YOTI_SCENARIO_ID} + - YOTI_CLIENT_SDK_ID=${YOTI_CLIENT_SDK_ID} + - YOTI_KEY_FILE_PATH=/YotiKey.pem + - ASPNETCORE_Kestrel__Certificates__Default__Password=b0a3e118-0420-4e3c-920c-c2623296ffbf + - ASPNETCORE_Kestrel__Certificates__Default__Path=https/DigitalIdentityExample.pfx + ports: + - "55000:80" + - "44380:443" + volumes: + - ${YOTI_KEY_FILE_PATH}:/YotiKey.pem diff --git a/src/Examples/DigitalIdentity/DigitalIdentity/docker-compose.yml b/src/Examples/DigitalIdentity/DigitalIdentity/docker-compose.yml new file mode 100644 index 000000000..11d8ff637 --- /dev/null +++ b/src/Examples/DigitalIdentity/DigitalIdentity/docker-compose.yml @@ -0,0 +1,8 @@ +version: '3.4' + +services: + digitalidentityexample: + image: ${DOCKER_REGISTRY-}digitalidentityexample + build: + context: ../../../ + dockerfile: Examples/DigitalIdentity/DigitalIdentity/Dockerfile diff --git a/src/Examples/DigitalIdentity/DigitalIdentity/https/DigitalIdentityExample.pfx b/src/Examples/DigitalIdentity/DigitalIdentity/https/DigitalIdentityExample.pfx new file mode 100644 index 000000000..f1b4fc482 Binary files /dev/null and b/src/Examples/DigitalIdentity/DigitalIdentity/https/DigitalIdentityExample.pfx differ diff --git a/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/app-store-badge.png b/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/app-store-badge.png new file mode 100644 index 000000000..3ec996cc6 Binary files /dev/null and b/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/app-store-badge.png differ diff --git a/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/app-store-badge@2x.png b/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/app-store-badge@2x.png new file mode 100644 index 000000000..84b34068f Binary files /dev/null and b/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/app-store-badge@2x.png differ diff --git a/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/company-logo.jpg b/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/company-logo.jpg new file mode 100644 index 000000000..551474bfe Binary files /dev/null and b/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/company-logo.jpg differ diff --git a/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/google-play-badge.png b/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/google-play-badge.png new file mode 100644 index 000000000..761f237b1 Binary files /dev/null and b/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/google-play-badge.png differ diff --git a/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/google-play-badge@2x.png b/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/google-play-badge@2x.png new file mode 100644 index 000000000..46707cea8 Binary files /dev/null and b/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/google-play-badge@2x.png differ diff --git a/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/icons/address.svg b/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/icons/address.svg new file mode 100644 index 000000000..f7d9b2a70 --- /dev/null +++ b/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/icons/address.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/icons/calendar.svg b/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/icons/calendar.svg new file mode 100644 index 000000000..4f6b9bb77 --- /dev/null +++ b/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/icons/calendar.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/icons/chevron-down-grey.svg b/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/icons/chevron-down-grey.svg new file mode 100644 index 000000000..6753becbf --- /dev/null +++ b/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/icons/chevron-down-grey.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/icons/document.svg b/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/icons/document.svg new file mode 100644 index 000000000..4c41271e7 --- /dev/null +++ b/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/icons/document.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/icons/email.svg b/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/icons/email.svg new file mode 100644 index 000000000..c4582d6e4 --- /dev/null +++ b/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/icons/email.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/icons/gender.svg b/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/icons/gender.svg new file mode 100644 index 000000000..af5c5772d --- /dev/null +++ b/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/icons/gender.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/icons/nationality.svg b/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/icons/nationality.svg new file mode 100644 index 000000000..e57d75227 --- /dev/null +++ b/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/icons/nationality.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/icons/phone.svg b/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/icons/phone.svg new file mode 100644 index 000000000..b19cce046 --- /dev/null +++ b/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/icons/phone.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/icons/profile.svg b/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/icons/profile.svg new file mode 100644 index 000000000..5c514fc1d --- /dev/null +++ b/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/icons/profile.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/icons/verified.svg b/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/icons/verified.svg new file mode 100644 index 000000000..7ca4dbb3b --- /dev/null +++ b/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/icons/verified.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/logo.png b/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/logo.png new file mode 100644 index 000000000..c60227fab Binary files /dev/null and b/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/logo.png differ diff --git a/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/logo@2x.png b/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/logo@2x.png new file mode 100644 index 000000000..9f29784d1 Binary files /dev/null and b/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/assets/logo@2x.png differ diff --git a/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/index.css b/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/index.css new file mode 100644 index 000000000..e3184163d --- /dev/null +++ b/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/index.css @@ -0,0 +1,152 @@ +.yoti-body { + margin: 0; +} + +.yoti-top-section { + display: flex; + flex-direction: column; + padding: 38px 0; + background-color: #f7f8f9; + align-items: center; +} + +.yoti-logo-section { + margin-bottom: 25px; +} + +.yoti-logo-image { + display: block; +} + +.yoti-top-header { + font-family: Roboto, sans-serif; + font-size: 40px; + font-weight: 700; + line-height: 1.2; + margin-top: 0; + margin-bottom: 80px; + text-align: center; + color: #000; +} + +@media (min-width: 600px) { + .yoti-top-header { + line-height: 1.4; + } +} + +.yoti-sdk-integration-section { + margin: 30px 0; +} + +#yoti-share-button { + width: 250px; + height: 45px; +} + +.yoti-login-or-separator { + text-transform: uppercase; + font-family: Roboto; + font-size: 16px; + font-weight: bold; + line-height: 1.5; + text-align: center; + margin-top: 30px; +} + +.yoti-login-dialog { + display: grid; + box-sizing: border-box; + width: 100%; + padding: 35px 38px; + border-radius: 5px; + background: #fff; + grid-gap: 25px; +} + +@media (min-width: 600px) { + .yoti-login-dialog { + width: 560px; + padding: 35px 88px; + } +} + +.yoti-login-dialog-header { + font-family: Roboto, sans-serif; + font-size: 24px; + font-weight: 700; + line-height: 1.1; + margin: 0; + color: #000; +} + +.yoti-input { + font-family: Roboto, sans-serif; + font-size: 16px; + line-height: 1.5; + box-sizing: border-box; + padding: 12px 15px; + color: #000; + border: solid 2px #000; + border-radius: 4px; + background-color: #fff; +} + +.yoti-login-actions { + display: flex; + justify-content: space-between; + align-items: center; +} + +.yoti-login-forgot-button { + font-family: Roboto, sans-serif; + font-size: 16px; + text-transform: capitalize; +} + +.yoti-login-button { + font-family: Roboto, sans-serif; + font-size: 16px; + box-sizing: border-box; + width: 145px; + height: 50px; + text-transform: uppercase; + color: #fff; + border: 0; + background-color: #000; +} + +.yoti-sponsor-app-section { + display: flex; + flex-direction: column; + padding: 70px 0; + align-items: center; +} + +.yoti-sponsor-app-header { + font-family: Roboto, sans-serif; + font-size: 20px; + font-weight: 700; + line-height: 1.2; + margin: 0; + text-align: center; + color: #000; +} + +.yoti-store-buttons-section { + margin-top: 40px; + display: grid; + grid-gap: 10px; + grid-template-columns: 1fr; +} + +@media (min-width: 600px) { + .yoti-store-buttons-section { + grid-template-columns: 1fr 1fr; + grid-gap: 25px; + } +} + +.yoti-app-button-link { + text-decoration: none; +} diff --git a/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/profile.css b/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/profile.css new file mode 100644 index 000000000..80871acd0 --- /dev/null +++ b/src/Examples/DigitalIdentity/DigitalIdentity/wwwroot/static/profile.css @@ -0,0 +1,420 @@ +.yoti-html { + height: 100%; +} + +.yoti-body { + margin: 0; + height: 100%; +} + +.yoti-icon-profile, +.yoti-icon-phone, +.yoti-icon-email, +.yoti-icon-calendar, +.yoti-icon-verified, +.yoti-icon-address, +.yoti-icon-gender, +.yoti-icon-nationality { + display: inline-block; + height: 28px; + width: 28px; + flex-shrink: 0; +} + +.yoti-icon-profile { + background: no-repeat url('/static/assets/icons/profile.svg'); +} + +.yoti-icon-phone { + background: no-repeat url('/static/assets/icons/phone.svg'); +} + +.yoti-icon-email { + background: no-repeat url('/static/assets/icons/email.svg'); +} + +.yoti-icon-calendar { + background: no-repeat url('/static/assets/icons/calendar.svg'); +} + +.yoti-icon-verified { + background: no-repeat url('/static/assets/icons/verified.svg'); +} + +.yoti-icon-address { + background: no-repeat url('/static/assets/icons/address.svg'); +} + +.yoti-icon-gender { + background: no-repeat url('/static/assets/icons/gender.svg'); +} + +.yoti-icon-nationality { + background: no-repeat url('/static/assets/icons/nationality.svg'); +} + +.yoti-profile-layout { + display: grid; + grid-template-columns: 1fr; +} + +@media (min-width: 1100px) { + .yoti-profile-layout { + grid-template-columns: 360px 1fr; + height: 100%; + } +} + +.yoti-profile-user-section { + display: flex; + align-items: center; + justify-content: space-between; + flex-direction: column; + padding: 40px 0; + background-color: #f7f8f9; +} + +@media (min-width: 1100px) { + .yoti-profile-user-section { + display: grid; + grid-template-rows: repeat(3, min-content); + align-items: center; + justify-content: center; + position: relative; + } +} + +.yoti-profile-picture-image { + width: 220px; + height: 220px; + border-radius: 50%; + margin-left: auto; + margin-right: auto; + display: block; +} + +.yoti-profile-picture-powered, +.yoti-profile-picture-account-creation { + font-family: Roboto; + font-size: 14px; + color: #b6bfcb; +} + +.yoti-profile-picture-powered-section { + display: flex; + flex-direction: column; + text-align: center; + align-items: center; +} + +@media (min-width: 1100px) { + .yoti-profile-picture-powered-section { + align-self: start; + } +} + +.yoti-profile-picture-powered { + margin-bottom: 20px; +} + +.yoti-profile-picture-section { + display: flex; + flex-direction: column; + align-items: center; +} + +@media (min-width: 1100px) { + .yoti-profile-picture-section { + position: absolute; + top: 50%; + transform: translateY(-50%); + width: 100%; + } +} + +.yoti-logo-image { + margin-bottom: 25px; +} + +.yoti-profile-picture-area { + position: relative; + display: inline-block; +} + +.yoti-profile-picture-verified-icon { + display: block; + background: no-repeat url("/static/assets/icons/verified.svg"); + background-size: cover; + height: 40px; + width: 40px; + position: absolute; + top: 10px; + right: 10px; +} + +.yoti-profile-name { + margin-top: 20px; + font-family: Roboto, sans-serif; + font-size: 24px; + text-align: center; + color: #333b40; +} + +.yoti-attributes-section { + display: flex; + flex-direction: column; + justify-content: start; + align-items: center; + width: 100%; + padding: 40px 0; +} + + .yoti-attributes-section.-condensed { + padding: 0; + } + +@media (min-width: 1100px) { + .yoti-attributes-section { + padding: 60px 0; + align-items: start; + overflow-y: scroll; + } + + .yoti-attributes-section.-condensed { + padding: 0; + } +} + +.yoti-company-logo { + margin-bottom: 40px; +} + +@media (min-width: 1100px) { + .yoti-company-logo { + margin-left: 130px; + } +} + +/* extended layout list */ +.yoti-attribute-list-header, +.yoti-attribute-list-subheader { + display: none; +} + +@media (min-width: 1100px) { + .yoti-attribute-list-header, + .yoti-attribute-list-subheader { + width: 100%; + display: grid; + grid-template-columns: 200px 1fr 1fr; + grid-template-rows: 40px; + align-items: center; + text-align: center; + font-family: Roboto; + font-size: 14px; + color: #b6bfcb; + } +} + +.yoti-attribute-list-header-attribute, +.yoti-attribute-list-header-value { + justify-self: start; + padding: 0 20px; +} + +.yoti-attribute-list-subheader { + grid-template-rows: 30px; +} + +.yoti-attribute-list-subhead-layout { + grid-column: 3; + display: grid; + grid-template-columns: 1fr 1fr 1fr; +} + +.yoti-attribute-list { + display: grid; + width: 100%; +} + +.yoti-attribute-list-item:first-child { + border-top: 2px solid #f7f8f9; +} + +.yoti-attribute-list-item { + display: grid; + grid-template-columns: 1fr 1fr; + grid-template-rows: minmax(60px, auto); + border-bottom: 2px solid #f7f8f9; + border-right: none; + border-left: none; +} + + .yoti-attribute-list-item.-condensed { + grid-template-columns: 50% 50%; + padding: 5px 35px; + } + +@media (min-width: 1100px) { + .yoti-attribute-list-item { + display: grid; + grid-template-columns: 200px 1fr 1fr; + grid-template-rows: minmax(80px, auto); + } + + .yoti-attribute-list-item.-condensed { + grid-template-columns: 200px 1fr; + padding: 0 75px; + } +} + +.yoti-attribute-cell { + display: flex; + align-items: center; +} + +.yoti-attribute-name { + grid-column: 1 / 2; + display: flex; + align-items: center; + justify-content: center; + border-right: 2px solid #f7f8f9; + padding: 20px; +} + +@media (min-width: 1100px) { + .yoti-attribute-name { + justify-content: start; + } +} + +.yoti-attribute-name.-condensed { + justify-content: start; +} + +.yoti-attribute-name-cell { + display: flex; + align-items: center; +} + +.yoti-attribute-name-cell-text { + font-family: Roboto, sans-serif; + font-size: 16px; + color: #b6bfcb; + margin-left: 12px; +} + +.yoti-attribute-value { + grid-column: 2 / 3; + display: flex; + align-items: center; + justify-content: center; + padding: 20px; +} + +@media (min-width: 1100px) { + .yoti-attribute-value { + justify-content: start; + } +} + +.yoti-attribute-value.-condensed { + justify-content: start; +} + +.yoti-attribute-value-text { + font-family: Roboto, sans-serif; + font-size: 18px; + color: #333b40; + word-break: break-word; +} + + .yoti-attribute-value-text table { + font-size: 14px; + border-spacing: 0; + } + + .yoti-attribute-value-text table td:first-child { + font-weight: bold; + } + + .yoti-attribute-value-text table td { + border-bottom: 1px solid #f7f8f9; + padding: 5px; + } + + .yoti-attribute-value-text img { + width: 100%; + } + +.yoti-attribute-anchors-layout { + grid-column: 1 / 3; + grid-row: 2 / 2; + display: grid; + grid-template-columns: 1fr 1fr 1fr; + grid-auto-rows: minmax(40px, auto); + font-family: Roboto, sans-serif; + font-size: 14px; + background-color: #f7f8f9; + border: 5px solid white; +} + +@media (min-width: 1100px) { + .yoti-attribute-anchors-layout { + grid-column: 3 / 4; + grid-row: 1 / 2; + } +} + +.yoti-attribute-anchors-head { + border-bottom: 1px solid #dde2e5; + display: flex; + align-items: center; + justify-content: center; +} + +@media (min-width: 1100px) { + .yoti-attribute-anchors-head { + display: none; + } +} + +.yoti-attribute-anchors { + display: flex; + align-items: center; + justify-content: center; +} + +.yoti-attribute-anchors-head.-s-v { + grid-column-start: span 1 s-v; +} + +.yoti-attribute-anchors-head.-value { + grid-column-start: span 1 value; +} + +.yoti-attribute-anchors-head.-subtype { + grid-column-start: span 1 subtype; +} + +.yoti-attribute-anchors.-s-v { + grid-column-start: span 1 s-v; +} + +.yoti-attribute-anchors.-value { + grid-column-start: span 1 value; +} + +.yoti-attribute-anchors.-subtype { + grid-column-start: span 1 subtype; +} + +.yoti-edit-section { + padding: 50px 20px; +} + +@media (min-width: 1100px) { + .yoti-edit-section { + padding: 75px 110px; + } +} diff --git a/src/Examples/DocScan/DocScanExample/Controllers/DbsController.cs b/src/Examples/DocScan/DocScanExample/Controllers/DbsController.cs index a7d74c9f9..8de331040 100644 --- a/src/Examples/DocScan/DocScanExample/Controllers/DbsController.cs +++ b/src/Examples/DocScan/DocScanExample/Controllers/DbsController.cs @@ -34,6 +34,30 @@ public DbsController(IHttpContextAccessor httpContextAccessor) public IActionResult Index() { + string advancedIdentityProfileJson = @" + { + ""profiles"": [ + { + ""trust_framework"": ""UK_TFIDA"", + ""schemes"": [ + { + ""label"": ""LB912"", + ""type"": ""RTW"" + } + ] + }, + { + ""trust_framework"": ""YOTI_GLOBAL"", + ""schemes"": [ + { + ""label"": ""LB321"", + ""type"": ""IDENTITY"", + ""objective"": ""AL_L1"", + } + ] + } + ] + }"; //Build Session Spec var sessionSpec = new SessionSpecificationBuilder() @@ -55,7 +79,7 @@ public IActionResult Index() .Build() ) .WithCreateIdentityProfilePreview(true) - .WithIdentityProfileRequirements(new + /* .WithIdentityProfileRequirements(new { trust_framework = "UK_TFIDA", scheme = new @@ -63,7 +87,8 @@ public IActionResult Index() type = "DBS", objective = "BASIC" } - }) + })*/ + .WithAdvancedIdentityProfileRequirements(advancedIdentityProfileJson) .WithSubject(new { subject_id = "some_subject_id_string" @@ -127,4 +152,4 @@ public IActionResult PrivacyPolicy() return View(); } } -} \ No newline at end of file +} diff --git a/src/Examples/DocScan/DocScanExample/Controllers/HomeController.cs b/src/Examples/DocScan/DocScanExample/Controllers/HomeController.cs index f15ed5f4d..2aecebd1f 100644 --- a/src/Examples/DocScan/DocScanExample/Controllers/HomeController.cs +++ b/src/Examples/DocScan/DocScanExample/Controllers/HomeController.cs @@ -43,18 +43,17 @@ public IActionResult Index() //Build Session Spec var sessionSpec = new SessionSpecificationBuilder() .WithClientSessionTokenTtl(600) - .WithResourcesTtl(90000) + .WithResourcesTtl(90400) .WithUserTrackingId("some-user-tracking-id") //Add Checks (using builders) .WithRequestedCheck( new RequestedDocumentAuthenticityCheckBuilder() - .WithManualCheckAlways() + .WithManualCheckFallback() .Build() ) .WithRequestedCheck( new RequestedLivenessCheckBuilder() - .ForZoomLiveness() - //.ForStaticLiveness() + .ForStaticLiveness() .Build() ) //.WithRequestedCheck( @@ -64,7 +63,7 @@ public IActionResult Index() // ) .WithRequestedCheck( new RequestedFaceMatchCheckBuilder() - .WithManualCheckAlways() + .WithManualCheckFallback() .Build() ) .WithRequestedCheck( @@ -82,13 +81,13 @@ public IActionResult Index() //Add Tasks (using builders) .WithRequestedTask( new RequestedTextExtractionTaskBuilder() - .WithManualCheckAlways() + .WithManualCheckFallback() .WithChipDataDesired() .Build() ) .WithRequestedTask( new RequestedSupplementaryDocTextExtractionTaskBuilder() - .WithManualCheckAlways() + .WithManualCheckFallback() .Build() ) .WithNotifications(notificationConfig) @@ -191,4 +190,4 @@ public IActionResult PrivacyPolicy() return View(); } } -} \ No newline at end of file +} diff --git a/src/Examples/DocScan/DocScanExample/Controllers/IdentityProfileController.cs b/src/Examples/DocScan/DocScanExample/Controllers/IdentityProfileController.cs new file mode 100644 index 000000000..55c885876 --- /dev/null +++ b/src/Examples/DocScan/DocScanExample/Controllers/IdentityProfileController.cs @@ -0,0 +1,157 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Net.Http; +using DocScanExample.Models; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Yoti.Auth; +using Yoti.Auth.DocScan; +using Yoti.Auth.DocScan.Session.Create; +using Yoti.Auth.DocScan.Session.Create.Check; +using Yoti.Auth.DocScan.Session.Create.Filter; +using Yoti.Auth.DocScan.Session.Create.Objectives; +using Yoti.Auth.DocScan.Session.Create.Task; + +namespace DocScanExample.Controllers +{ + public class IdentityProfileController : Controller + { + private readonly DocScanClient _client; + + private readonly string _baseUrl; + private readonly Uri _apiUrl; + + public IdentityProfileController(IHttpContextAccessor httpContextAccessor) + { + var request = httpContextAccessor.HttpContext.Request; + + _baseUrl = $"{request.Scheme}://{request.Host}"; + _apiUrl = GetApiUrl(); + _client = GetDocScanClient(_apiUrl); + } + + public IActionResult Index() + { + // Build Structured Postal Address + var structuredPostalAddress = new StructuredPostalAddressBuilder() + .WithAddressFormat(1) + .WithBuildingNumber("74") + .WithAddressLine1("AddressLine1") + .WithTownCity("CityName") + .WithPostalCode("E143RN") + .WithCountryIso("GBR") + .WithCountry("United Kingdom") + .WithFormattedAddress("74\nAddressLine1\nCityName\nE143RN\nGBR") + .Build(); + + // Build Applicant Profile + var applicantProfile = new ApplicantProfileBuilder() + .WithFullName("John Doe") + .WithDateOfBirth("1988-11-02") + .WithNamePrefix("Mr") + .WithStructuredPostalAddress(structuredPostalAddress) + .Build(); + + // Build Resource Creation Container + var resources = new ResourceCreationContainerBuilder() + .WithApplicantProfile(applicantProfile) + .Build(); + + //Build Session Spec + var sessionSpec = new SessionSpecificationBuilder() + .WithClientSessionTokenTtl(600) + .WithResourcesTtl(96400) + .WithUserTrackingId("some-user-tracking-id") + //Add Sdk Config (with builder) + .WithSdkConfig( + new SdkConfigBuilder() + //.WithAllowsCameraAndUpload() + .WithPrimaryColour("#2d9fff") + .WithSecondaryColour("#FFFFFF") + .WithFontColour("#FFFFFF") + .WithLocale("en-GB") + .WithPresetIssuingCountry("GBR") + .WithSuccessUrl($"{_baseUrl}/idverify/success") + .WithErrorUrl($"{_baseUrl}/idverify/error") + .WithPrivacyPolicyUrl($"{_baseUrl}/privacy-policy") + .Build() + ) + .WithCreateIdentityProfilePreview(true) + .WithIdentityProfileRequirements(new + { + trust_framework = "UK_TFIDA", + scheme = new + { + type = "DBS", + objective = "BASIC" + } + }) + .WithSubject(new + { + subject_id = "some_subject_id_string" + }) + // Add Resources with Applicant Profile + .WithResources(resources) + .Build(); + + CreateSessionResult createSessionResult = _client.CreateSession(sessionSpec); + string sessionId = createSessionResult.SessionId; + + string path = $"web/index.html?sessionID={sessionId}&sessionToken={createSessionResult.ClientSessionToken}"; + Uri uri = new Uri(_apiUrl, path); + + ViewBag.iframeUrl = uri.ToString(); + + TempData["sessionId"] = sessionId; + return View(); + } + + public IActionResult Media(string mediaId, string sessionId) + { + MediaValue media = _client.GetMediaContent(sessionId, mediaId); + + return File(media.GetContent(), media.GetMIMEType()); + } + + [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] + public IActionResult Error() + { + return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier }); + } + + internal static DocScanClient GetDocScanClient(Uri apiUrl = null) + { + if (apiUrl == null) + apiUrl = GetApiUrl(); + + string keyFilePath = Environment.GetEnvironmentVariable("YOTI_KEY_FILE_PATH"); + using (StreamReader privateKeyStream = System.IO.File.OpenText(keyFilePath)) + { + var key = CryptoEngine.LoadRsaKey(privateKeyStream); + string clientSdkId = Environment.GetEnvironmentVariable("YOTI_CLIENT_SDK_ID"); + return new DocScanClient(clientSdkId, key, new HttpClient(), apiUrl); + } + } + + internal static Uri GetApiUrl() + { + string apiUrl = Environment.GetEnvironmentVariable("YOTI_DOC_SCAN_API_URL"); + if (string.IsNullOrEmpty(apiUrl)) + { + return Yoti.Auth.Constants.Api.DefaultYotiDocsUrl; + } + + if (!apiUrl.EndsWith("/", StringComparison.Ordinal)) + apiUrl += "/"; + + return new Uri(apiUrl); + } + + public IActionResult PrivacyPolicy() + { + return View(); + } + } +} diff --git a/src/Examples/DocScan/DocScanExample/DocScanExample.sln b/src/Examples/DocScan/DocScanExample/DocScanExample.sln deleted file mode 100644 index 52210ccfd..000000000 --- a/src/Examples/DocScan/DocScanExample/DocScanExample.sln +++ /dev/null @@ -1,25 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 25.0.1703.1 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DocScanExample", "DocScanExample.csproj", "{33DF7B65-3CBB-40B0-A08A-17A05AB7D071}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {33DF7B65-3CBB-40B0-A08A-17A05AB7D071}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {33DF7B65-3CBB-40B0-A08A-17A05AB7D071}.Debug|Any CPU.Build.0 = Debug|Any CPU - {33DF7B65-3CBB-40B0-A08A-17A05AB7D071}.Release|Any CPU.ActiveCfg = Release|Any CPU - {33DF7B65-3CBB-40B0-A08A-17A05AB7D071}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {D250BACD-0361-4529-98E0-EEE3F48D5863} - EndGlobalSection -EndGlobal diff --git a/src/Examples/DocScan/DocScanExample/Views/IdVerify/Success.cshtml b/src/Examples/DocScan/DocScanExample/Views/IdVerify/Success.cshtml index c3c2a1dbd..e822ed557 100644 --- a/src/Examples/DocScan/DocScanExample/Views/IdVerify/Success.cshtml +++ b/src/Examples/DocScan/DocScanExample/Views/IdVerify/Success.cshtml @@ -289,6 +289,31 @@ } + @if (Model.AdvancedIdentityProfilePreviewResponse != null && Model.AdvancedIdentityProfilePreviewResponse.Media != null) + { +
+
+

Advanced Identity Profile Preview

+
+
+ + } @@ -796,5 +821,90 @@ } } + @if (Model.Resources.ApplicantProfiles != null && Model.Resources.ApplicantProfiles.Count > 0) + { +
+
+

Applicant Profiles

+
+
+ + @foreach (var applicantProfile in Model.Resources.ApplicantProfiles) + { + var profileIndex = Model.Resources.ApplicantProfiles.IndexOf(applicantProfile); +
+
+

Applicant Profile @(profileIndex + 1)

+ + + + + + + @if (applicantProfile.Source != null) + { + + + + + } + @if (applicantProfile.CreatedAt.HasValue) + { + + + + + } + @if (applicantProfile.LastUpdated.HasValue) + { + + + + + } + +
ID@applicantProfile.Id
Source Type@applicantProfile.Source.Type
Created At@applicantProfile.CreatedAt.Value.ToString("o")
Last Updated@applicantProfile.LastUpdated.Value.ToString("o")
+ + @if (applicantProfile.Media != null) + { +
+
+
+

+ +

+
+
+
+ + + + + + + + + + + +
ID + + @applicantProfile.Media.Id + +
Type@applicantProfile.Media.Type
+
+
+
+
+ } +
+
+ } + } + } \ No newline at end of file diff --git a/src/Examples/DocScan/DocScanExample/Views/IdentityProfile/Index.cshtml b/src/Examples/DocScan/DocScanExample/Views/IdentityProfile/Index.cshtml new file mode 100644 index 000000000..161e7acda --- /dev/null +++ b/src/Examples/DocScan/DocScanExample/Views/IdentityProfile/Index.cshtml @@ -0,0 +1,4 @@ +@{ + ViewData["Title"] = "Identity Profile Page"; +} + diff --git a/src/Examples/Profile/CoreExample/Controllers/HomeController.cs b/src/Examples/Profile/CoreExample/Controllers/HomeController.cs index d51cca3ab..b72234321 100644 --- a/src/Examples/Profile/CoreExample/Controllers/HomeController.cs +++ b/src/Examples/Profile/CoreExample/Controllers/HomeController.cs @@ -50,6 +50,7 @@ public IActionResult DynamicScenario() var givenNamesWantedAttribute = new WantedAttributeBuilder() .WithName("given_names") + .WithOptional(false) .Build(); DynamicPolicy dynamicPolicy = new DynamicPolicyBuilder() @@ -137,4 +138,4 @@ public IActionResult DBSStandard() } } } -} \ No newline at end of file +} diff --git a/src/Examples/Profile/CoreExample/CoreExample.csproj b/src/Examples/Profile/CoreExample/CoreExample.csproj index 769193e74..e65661230 100644 --- a/src/Examples/Profile/CoreExample/CoreExample.csproj +++ b/src/Examples/Profile/CoreExample/CoreExample.csproj @@ -17,11 +17,11 @@ - - - + + + - + diff --git a/src/Yoti.Auth.sln b/src/Yoti.Auth.sln index f2630d1d1..7368b4488 100644 --- a/src/Yoti.Auth.sln +++ b/src/Yoti.Auth.sln @@ -28,6 +28,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DocScanExample", "Examples\ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DocScan", "DocScan", "{106324DB-4181-443F-85BA-6C3D3BD7E8DF}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DigitalIdentityExample", "Examples\DigitalIdentity\DigitalIdentity\DigitalIdentityExample.csproj", "{5FC08A25-9A60-483B-9957-73D61AA09B93}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -58,6 +60,10 @@ Global {FFA5585A-C7BA-4F34-96F1-8E2312E8758F}.Debug|Any CPU.Build.0 = Debug|Any CPU {FFA5585A-C7BA-4F34-96F1-8E2312E8758F}.Release|Any CPU.ActiveCfg = Release|Any CPU {FFA5585A-C7BA-4F34-96F1-8E2312E8758F}.Release|Any CPU.Build.0 = Release|Any CPU + {5FC08A25-9A60-483B-9957-73D61AA09B93}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5FC08A25-9A60-483B-9957-73D61AA09B93}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5FC08A25-9A60-483B-9957-73D61AA09B93}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5FC08A25-9A60-483B-9957-73D61AA09B93}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -69,6 +75,7 @@ Global {34AC42F8-1D13-4D12-9C77-DB7A42494918} = {C3CAC5F0-C455-4634-A989-7443EBDC09E3} {FFA5585A-C7BA-4F34-96F1-8E2312E8758F} = {106324DB-4181-443F-85BA-6C3D3BD7E8DF} {106324DB-4181-443F-85BA-6C3D3BD7E8DF} = {F3EB26B1-6385-4A89-A8F9-8BAFFEC581F9} + {5FC08A25-9A60-483B-9957-73D61AA09B93} = {F3EB26B1-6385-4A89-A8F9-8BAFFEC581F9} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {6A3AE710-68BB-4034-921C-EBAE5186F5DF} diff --git a/src/Yoti.Auth/Constants/Api.cs b/src/Yoti.Auth/Constants/Api.cs index 4cc0cfaf1..08bc4b75e 100644 --- a/src/Yoti.Auth/Constants/Api.cs +++ b/src/Yoti.Auth/Constants/Api.cs @@ -7,8 +7,11 @@ public static class Api public const string DefaultYotiHost = @"https://api.yoti.com"; public const string YotiApiPathPrefix = "api/v1"; + public const string YotiApiSharePathPrefix = "share"; public readonly static string DefaultYotiApiUrl = string.Join("/", DefaultYotiHost, YotiApiPathPrefix); + public readonly static string DefaultYotiShareApiUrl = string.Join("/", DefaultYotiHost, YotiApiSharePathPrefix); + public const string YotiDocsPathPrefix = "idverify/v1/"; public readonly static Uri DefaultYotiDocsUrl = new Uri(string.Join("/", DefaultYotiHost, YotiDocsPathPrefix)); diff --git a/src/Yoti.Auth/Constants/DocScanConstants.cs b/src/Yoti.Auth/Constants/DocScanConstants.cs index f97d375f8..e960cecf8 100644 --- a/src/Yoti.Auth/Constants/DocScanConstants.cs +++ b/src/Yoti.Auth/Constants/DocScanConstants.cs @@ -72,5 +72,7 @@ public static class DocScanConstants public const string Reclassification = "RECLASSIFICATION"; public const string Generic = "GENERIC"; + + public const string VerifyShareCodeTask = "VERIFY_SHARE_CODE_TASK"; } } \ No newline at end of file diff --git a/src/Yoti.Auth/Conversion.cs b/src/Yoti.Auth/Conversion.cs index 717727dbd..44928f576 100644 --- a/src/Yoti.Auth/Conversion.cs +++ b/src/Yoti.Auth/Conversion.cs @@ -31,7 +31,7 @@ public static byte[] Base64ToBytes(string base64) /// public static byte[] UrlSafeBase64ToBytes(string urlSafeBase64) { -#if NETCOREAPP2_2 || NETCOREAPP3_1 || NETSTANDARD2_1 +#if NETCOREAPP2_2 || NETCOREAPP3_1 || NETSTANDARD2_1 || NET5_0 string base64 = urlSafeBase64.Replace("-", "+", StringComparison.Ordinal).Replace("_", "/", StringComparison.Ordinal); #else string base64 = urlSafeBase64.Replace("-", "+").Replace("_", "/"); diff --git a/src/Yoti.Auth/CryptoEngine.cs b/src/Yoti.Auth/CryptoEngine.cs index d275c21cd..6951da935 100644 --- a/src/Yoti.Auth/CryptoEngine.cs +++ b/src/Yoti.Auth/CryptoEngine.cs @@ -1,5 +1,7 @@ using System; using System.IO; +using System.Security.Cryptography; +using Google.Protobuf; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Encodings; using Org.BouncyCastle.Crypto.Engines; @@ -41,10 +43,10 @@ internal static byte[] DecipherAes(byte[] key, byte[] iv, byte[] cipherBytes) var result = new byte[numOutputBytes]; Array.Copy(outputBuffer, result, numOutputBytes); - + return result; } - + internal static byte[] DecryptRsa(byte[] cipherBytes, AsymmetricCipherKeyPair keypair) { // decrypt using rsa with private key and PKCS 1 v1.5 padding @@ -82,7 +84,6 @@ internal static string GenerateNonce() internal static string DecryptToken(string encryptedConnectToken, AsymmetricCipherKeyPair keyPair) { Validation.NotNullOrEmpty(encryptedConnectToken, "one time use token"); - // token was encoded as a URL-safe base64 so it can be transferred in a URL byte[] cipherBytes = Conversion.UrlSafeBase64ToBytes(encryptedConnectToken); @@ -132,5 +133,62 @@ internal static string GetAuthKey(AsymmetricCipherKeyPair keyPair) return Conversion.BytesToBase64(publicKey); } + + public static byte[] DecryptAesGcm(byte[] cipherText, byte[] iv, byte[] secret) + { + try + { + GcmBlockCipher cipher = new GcmBlockCipher(new Org.BouncyCastle.Crypto.Engines.AesEngine()); + ParametersWithIV parameters = new ParametersWithIV(new KeyParameter(secret), iv); + + cipher.Init(false, parameters); + + byte[] plainText = new byte[cipher.GetOutputSize(cipherText.Length)]; + int length = cipher.ProcessBytes(cipherText, 0, cipherText.Length, plainText, 0); + cipher.DoFinal(plainText, length); + + return plainText; + } + catch (Exception ex) + { + throw new Exception($"Failed to decrypt receipt key: {ex.Message}", ex); + } + } + + public static byte[] UnwrapReceiptKey(byte[] wrappedReceiptKey, byte[] encryptedItemKey, byte[] itemKeyIv, AsymmetricCipherKeyPair key) + { + try + { + byte[] decryptedItemKey = DecryptRsa(encryptedItemKey, key); + + byte[] plainText = DecryptAesGcm(wrappedReceiptKey, itemKeyIv, decryptedItemKey); + + return plainText; + } + catch (Exception ex) + { + throw new Exception($"Failed to unwrap receipt key: {ex.Message}", ex); + } + } + + public static byte[] DecryptReceiptContent(byte[] content, byte[] receiptContentKey) + { + try + { + if (content == null) + { + throw new ArgumentNullException("content", "Failed to decrypt receipt content: content is null"); + } + + var decodedData = new EncryptedData(); + decodedData.MergeFrom(content); + + return DecipherAes(receiptContentKey, decodedData.Iv.ToByteArray(), decodedData.CipherText.ToByteArray()); + } + catch(Exception ex) + { + throw new Exception($"Failed to decrypt receipt content: {ex.Message}", ex); + } + } } -} \ No newline at end of file +} diff --git a/src/Yoti.Auth/DigitalIdentity/CreateQrResult.cs b/src/Yoti.Auth/DigitalIdentity/CreateQrResult.cs new file mode 100644 index 000000000..d06d380dd --- /dev/null +++ b/src/Yoti.Auth/DigitalIdentity/CreateQrResult.cs @@ -0,0 +1,18 @@ +using Newtonsoft.Json; + + +namespace Yoti.Auth.DigitalIdentity +{ + public class CreateQrResult + { +#pragma warning disable 0649 + // These fields are assigned to by JSON deserialization + [JsonProperty("id")] + public string Id { get; set; } + + [JsonProperty("uri")] + public string Uri { get; set; } +#pragma warning restore 0649 + + } +} diff --git a/src/Yoti.Auth/DigitalIdentity/DigitalIdentityService.cs b/src/Yoti.Auth/DigitalIdentity/DigitalIdentityService.cs new file mode 100644 index 000000000..3043fca82 --- /dev/null +++ b/src/Yoti.Auth/DigitalIdentity/DigitalIdentityService.cs @@ -0,0 +1,373 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; +using Google.Protobuf; +using Newtonsoft.Json; +using Org.BouncyCastle.Crypto; +using Yoti.Auth.Attribute; +using Yoti.Auth.Exceptions; +using Yoti.Auth.Profile; +using Yoti.Auth.Web; +using Yoti.Auth.ProtoBuf.Attribute; +using Yoti.Auth.Share; +using ApplicationProfile = Yoti.Auth.Profile.ApplicationProfile; + +namespace Yoti.Auth.DigitalIdentity +{ + public static class DigitalIdentityService + { + private const string receiptRetrieval = "/v2/receipts/{0}"; + private const string receiptKeyRetrieval = "/v2/wrapped-item-keys/{0}"; + private const string sessionCreation = "/v2/sessions"; + private const string yotiAuthId = "X-Yoti-Auth-Id"; + + internal static async Task CreateShareSession(HttpClient httpClient, Uri apiUrl, string sdkId, AsymmetricCipherKeyPair keyPair, ShareSessionRequest shareSessionRequestPayload) + { + Validation.NotNull(httpClient, nameof(httpClient)); + Validation.NotNull(apiUrl, nameof(apiUrl)); + Validation.NotNull(sdkId, nameof(sdkId)); + Validation.NotNull(keyPair, nameof(keyPair)); + Validation.NotNull(shareSessionRequestPayload, nameof(shareSessionRequestPayload)); + + string serializedScenario = JsonConvert.SerializeObject( + shareSessionRequestPayload, + new JsonSerializerSettings + { + NullValueHandling = NullValueHandling.Ignore + }); + byte[] body = Encoding.UTF8.GetBytes(serializedScenario); + + Request shareSessionRequest = new RequestBuilder() + .WithKeyPair(keyPair) + .WithBaseUri(apiUrl) + .WithHeader(yotiAuthId, sdkId) + .WithEndpoint(sessionCreation) + .WithQueryParam("sdkID", sdkId) + .WithHttpMethod(HttpMethod.Post) + .WithContent(body) + .Build(); + + using (HttpResponseMessage response = await shareSessionRequest.Execute(httpClient).ConfigureAwait(false)) + { + if (!response.IsSuccessStatusCode) + { + Response.CreateYotiExceptionFromStatusCode(response); + } + + var responseObject = await response.Content.ReadAsStringAsync(); + var deserialized = await Task.Factory.StartNew(() => JsonConvert.DeserializeObject(responseObject)); + + return deserialized; + } + } + + internal static async Task GetSession(HttpClient httpClient, Uri apiUrl, string sdkId, AsymmetricCipherKeyPair keyPair, string sessionId) + { + Validation.NotNull(httpClient, nameof(httpClient)); + Validation.NotNull(apiUrl, nameof(apiUrl)); + Validation.NotNull(sdkId, nameof(sdkId)); + Validation.NotNull(keyPair, nameof(keyPair)); + Validation.NotNull(sessionId, nameof(sessionId)); + + + Request getSessionRequest = new RequestBuilder() + .WithKeyPair(keyPair) + .WithBaseUri(apiUrl) + .WithHeader(yotiAuthId, sdkId) + .WithEndpoint(string.Format("{0}/{1}", sessionCreation, sessionId)) + .WithQueryParam("appId", sdkId) + .WithHttpMethod(HttpMethod.Get) + .Build(); + + using (HttpResponseMessage response = await getSessionRequest.Execute(httpClient).ConfigureAwait(false)) + { + if (!response.IsSuccessStatusCode) + { + Response.CreateYotiExceptionFromStatusCode(response); + } + + var responseObject = await response.Content.ReadAsStringAsync(); + var deserialized = await Task.Factory.StartNew(() => JsonConvert.DeserializeObject(responseObject)); + + return deserialized; + } + } + + internal static async Task CreateQrCode(HttpClient httpClient, Uri apiUrl, string sdkId, AsymmetricCipherKeyPair keyPair, string sessionId,QrRequest qrRequestPayload) + { + Validation.NotNull(httpClient, nameof(httpClient)); + Validation.NotNull(apiUrl, nameof(apiUrl)); + Validation.NotNull(sdkId, nameof(sdkId)); + Validation.NotNull(keyPair, nameof(keyPair)); + + string serializedQrCode = JsonConvert.SerializeObject( + qrRequestPayload, + new JsonSerializerSettings + { + NullValueHandling = NullValueHandling.Ignore + }); + byte[] body = Encoding.UTF8.GetBytes(serializedQrCode); + + + Request createQrRequest = new RequestBuilder() + .WithKeyPair(keyPair) + .WithBaseUri(apiUrl) + .WithHeader(yotiAuthId, sdkId) + .WithEndpoint(string.Format($"/v2/sessions/{0}/qr-codes", sessionId)) + .WithQueryParam("appId", sdkId) + .WithHttpMethod(HttpMethod.Post) + .WithContent(body) + .Build(); + + using (HttpResponseMessage response = await createQrRequest.Execute(httpClient).ConfigureAwait(false)) + { + if (!response.IsSuccessStatusCode) + { + Response.CreateYotiExceptionFromStatusCode(response); + } + + var responseObject = await response.Content.ReadAsStringAsync(); + var deserialized = await Task.Factory.StartNew(() => JsonConvert.DeserializeObject(responseObject)); + + return deserialized; + } + } + + internal static async Task GetQrCode(HttpClient httpClient, Uri apiUrl, string sdkId, AsymmetricCipherKeyPair keyPair, string qrCodeId) + { + Validation.NotNull(httpClient, nameof(httpClient)); + Validation.NotNull(apiUrl, nameof(apiUrl)); + Validation.NotNull(sdkId, nameof(sdkId)); + Validation.NotNull(keyPair, nameof(keyPair)); + Validation.NotNull(qrCodeId, nameof(qrCodeId)); + + Request QrCodeRequest = new RequestBuilder() + .WithKeyPair(keyPair) + .WithBaseUri(apiUrl) + .WithHeader(yotiAuthId, sdkId) + .WithEndpoint(string.Format($"/v2/qr-codes/{0}", qrCodeId)) + .WithQueryParam("appId", sdkId) + .WithHttpMethod(HttpMethod.Get) + .Build(); + + using (HttpResponseMessage response = await QrCodeRequest.Execute(httpClient).ConfigureAwait(false)) + { + if (!response.IsSuccessStatusCode) + { + Response.CreateYotiExceptionFromStatusCode(response); + } + + var responseObject = await response.Content.ReadAsStringAsync(); + var deserialized = await Task.Factory.StartNew(() => JsonConvert.DeserializeObject(responseObject)); + + return deserialized; + } + } + + private static async Task GetReceipt(HttpClient httpClient, string receiptId, string sdkId,Uri apiUrl, AsymmetricCipherKeyPair keyPair) + { + Validation.NotNull(httpClient, nameof(httpClient)); + Validation.NotNull(apiUrl, nameof(apiUrl)); + Validation.NotNull(sdkId, nameof(sdkId)); + Validation.NotNull(keyPair, nameof(keyPair)); + + string receiptUrl = Base64ToBase64URL(receiptId); + string endpoint = string.Format(receiptRetrieval, receiptUrl); + + Request ReceiptRequest = new RequestBuilder() + .WithKeyPair(keyPair) + .WithBaseUri(apiUrl) + .WithHeader(yotiAuthId, sdkId) + .WithEndpoint(endpoint) + .WithQueryParam("sdkID", sdkId) + .WithHttpMethod(HttpMethod.Get) + .Build(); + + using (HttpResponseMessage response = await ReceiptRequest.Execute(httpClient).ConfigureAwait(false)) + { + if (!response.IsSuccessStatusCode) + { + Response.CreateYotiExceptionFromStatusCode(response); + } + + var responseObject = await response.Content.ReadAsStringAsync(); + var deserialized = await Task.Factory.StartNew(() => JsonConvert.DeserializeObject(responseObject)); + + return deserialized; + } + } + + + public static string Base64ToBase64URL(string base64Str) + { + try + { + byte[] decodedBytes = Convert.FromBase64String(base64Str); + string base64URL = Convert.ToBase64String(decodedBytes) + .Replace('+', '-') + .Replace('/', '_') + .TrimEnd('='); + return base64URL; + } + catch (FormatException) + { + return ""; + } + } + + public static async Task GetShareReceipt(HttpClient httpClient, string clientSdkId, Uri apiUrl, AsymmetricCipherKeyPair key, string receiptId) + { + Validation.NotNullOrEmpty(receiptId, nameof(receiptId)); + try + { + var receiptResponse = await GetReceipt(httpClient, receiptId, clientSdkId, apiUrl, key); + var itemKeyId = receiptResponse.WrappedItemKeyId; + + var encryptedItemKeyResponse = await GetReceiptItemKey(httpClient, itemKeyId, clientSdkId, apiUrl, key); + + var receiptContentKey = CryptoEngine.UnwrapReceiptKey(receiptResponse.WrappedKey, encryptedItemKeyResponse.Value, encryptedItemKeyResponse.Iv, key); + + var (attrData, aextra, decryptAttrDataError) = DecryptReceiptContent(receiptResponse.Content, receiptContentKey); + if (decryptAttrDataError != null) + { + throw new Exception($"An unexpected error occurred: {decryptAttrDataError.Message}"); + } + + var parsedAttributesApp = AttributeConverter.ConvertToBaseAttributes(attrData); + var appProfile = new ApplicationProfile(parsedAttributesApp + ); + + var (attrOtherData, aOtherExtra, decryptOtherAttrDataError) = DecryptReceiptContent(receiptResponse.OtherPartyContent, receiptContentKey); + if (decryptAttrDataError != null) + { + throw new Exception($"An unexpected error occurred: {decryptAttrDataError.Message}"); + } + + var userProfile = new YotiProfile(); + if (attrOtherData != null) + { + var parsedAttributesUser = AttributeConverter.ConvertToBaseAttributes(attrOtherData); + userProfile = new YotiProfile(parsedAttributesUser); + } + + + ExtraData userExtraData = new ExtraData(); + if (aOtherExtra != null) + { + userExtraData = ExtraDataConverter.ParseExtraDataProto(aOtherExtra); + } + ExtraData appExtraData = new ExtraData(); + if (aextra != null) + { + + appExtraData = ExtraDataConverter.ParseExtraDataProto(aextra); + } + + var sharedReceiptResponse = new SharedReceiptResponse + { + ID = receiptResponse.ID, + SessionID = receiptResponse.SessionID, + RememberMeID = receiptResponse.RememberMeID, + ParentRememberMeID = receiptResponse.ParentRememberMeID, + Timestamp = receiptResponse.Timestamp, + UserContent = new UserContent + { + UserProfile = userProfile, + ExtraData = userExtraData + }, + ApplicationContent = new ApplicationContent + { + ApplicationProfile = appProfile, + ExtraData = appExtraData + }, + Error = receiptResponse.Error, + ErrorDetails = receiptResponse.ErrorDetails + + }; + + return sharedReceiptResponse; + } + catch (Exception ex) + { + throw new Exception($"An unexpected error occurred: {ex.Message}"); + + } + } + + private static async Task GetReceiptItemKey(HttpClient httpClient, string receiptItemKeyId, string sdkId, Uri apiUrl, AsymmetricCipherKeyPair keyPair) + { + Validation.NotNull(httpClient, nameof(httpClient)); + Validation.NotNull(apiUrl, nameof(apiUrl)); + Validation.NotNull(sdkId, nameof(sdkId)); + Validation.NotNull(keyPair, nameof(keyPair)); + string endpoint = string.Format(receiptKeyRetrieval, receiptItemKeyId); + + Request ReceiptItemKeyRequest = new RequestBuilder() + .WithKeyPair(keyPair) + .WithBaseUri(apiUrl) + .WithHeader(yotiAuthId, sdkId) + .WithEndpoint(endpoint) + .WithQueryParam("appId", sdkId) + .WithHttpMethod(HttpMethod.Get) + .Build(); + + using (HttpResponseMessage response = await ReceiptItemKeyRequest.Execute(httpClient).ConfigureAwait(false)) + { + if (!response.IsSuccessStatusCode) + { + Response.CreateYotiExceptionFromStatusCode(response); + } + + var responseObject = await response.Content.ReadAsStringAsync(); + var deserialized = await Task.Factory.StartNew(() => JsonConvert.DeserializeObject(responseObject)); + + return deserialized; + } + } + + public static (AttributeList attrData, byte[] aextra, Exception error) DecryptReceiptContent(Content content, byte[] key) + { + AttributeList attrData = null; + byte[] aextra = null; + Exception error = null; + + if (content != null) + { + if (content.Profile != null && content.Profile.Length > 0) + { + try + { + byte[] aattr = CryptoEngine.DecryptReceiptContent(content.Profile, key); + attrData = new AttributeList(); + attrData.MergeFrom(aattr); + } + catch (Exception ex) + { + error = new Exception($"failed to decrypt content profile: {ex.Message}", ex); + return (null, null, error); + } + } + + if (content.ExtraData != null && content.ExtraData.Length > 0) + { + try + { + aextra = CryptoEngine.DecryptReceiptContent(content.ExtraData, key); + } + catch (Exception ex) + { + error = new Exception($"failed to decrypt receipt content extra data: {ex.Message}", ex); + return (null, null, error); + } + } + } + + return (attrData, aextra, null); + } + } + + +} diff --git a/src/Yoti.Auth/DigitalIdentity/ErrorDetails.cs b/src/Yoti.Auth/DigitalIdentity/ErrorDetails.cs new file mode 100644 index 000000000..b100a87d4 --- /dev/null +++ b/src/Yoti.Auth/DigitalIdentity/ErrorDetails.cs @@ -0,0 +1,17 @@ +using Newtonsoft.Json; +using System.Collections.Generic; +using Yoti.Auth.DigitalIdentity; + +namespace Yoti.Auth.DigitalIdentity +{ + public class ErrorDetails + { + public ErrorReason ErrorReason { get; private set; } + + public ErrorReason GetErrorReason() + { + return ErrorReason; + } + } + +} diff --git a/src/Yoti.Auth/DigitalIdentity/ErrorReason.cs b/src/Yoti.Auth/DigitalIdentity/ErrorReason.cs new file mode 100644 index 000000000..f62445135 --- /dev/null +++ b/src/Yoti.Auth/DigitalIdentity/ErrorReason.cs @@ -0,0 +1,14 @@ +using Newtonsoft.Json; +using System.Collections.Generic; +using Yoti.Auth.DigitalIdentity; +using Yoti.DigitalIdentity; + +namespace Yoti.Auth.DigitalIdentity +{ + public class ErrorReason + { + public RequirementNotMetDetails RequirementNotMetDetails { get; private set; } + + } + +} diff --git a/src/Yoti.Auth/DigitalIdentity/Extensions/BaseExtension.cs b/src/Yoti.Auth/DigitalIdentity/Extensions/BaseExtension.cs new file mode 100644 index 000000000..71f96b96e --- /dev/null +++ b/src/Yoti.Auth/DigitalIdentity/Extensions/BaseExtension.cs @@ -0,0 +1,27 @@ +using Newtonsoft.Json; + +namespace Yoti.Auth.DigitalIdentity.Extensions +{ + public abstract class BaseExtension + { + [JsonProperty(PropertyName = "type")] + private readonly string _type; + + private protected BaseExtension(string type) + { + _type = type; + } + + /// + /// Get the feature's type + /// + [JsonIgnore] + public string ExtensionType + { + get + { + return _type; + } + } + } +} \ No newline at end of file diff --git a/src/Yoti.Auth/DigitalIdentity/Extensions/DeviceLocation.cs b/src/Yoti.Auth/DigitalIdentity/Extensions/DeviceLocation.cs new file mode 100644 index 000000000..fac070574 --- /dev/null +++ b/src/Yoti.Auth/DigitalIdentity/Extensions/DeviceLocation.cs @@ -0,0 +1,63 @@ +using Newtonsoft.Json; + +namespace Yoti.Auth.DigitalIdentity.Extensions +{ + public class DeviceLocation + { + [JsonProperty(PropertyName = "latitude")] + private readonly double _latitude; + + [JsonProperty(PropertyName = "longitude")] + private readonly double _longitude; + + [JsonProperty(PropertyName = "radius")] + private readonly double _radius; + + [JsonProperty(PropertyName = "max_uncertainty_radius")] + private readonly double _maxUncertainty; + + public DeviceLocation(double latitude, double longitude, double radius, double maxUncertainty) + { + _latitude = latitude; + _longitude = longitude; + _radius = radius; + _maxUncertainty = maxUncertainty; + } + + [JsonIgnore] + public double Latitude + { + get + { + return _latitude; + } + } + + [JsonIgnore] + public double Longitude + { + get + { + return _longitude; + } + } + + [JsonIgnore] + public double Radius + { + get + { + return _radius; + } + } + + [JsonIgnore] + public double MaxUncertainty + { + get + { + return _maxUncertainty; + } + } + } +} \ No newline at end of file diff --git a/src/Yoti.Auth/DigitalIdentity/Extensions/Extension.cs b/src/Yoti.Auth/DigitalIdentity/Extensions/Extension.cs new file mode 100644 index 000000000..da0243e8f --- /dev/null +++ b/src/Yoti.Auth/DigitalIdentity/Extensions/Extension.cs @@ -0,0 +1,33 @@ +using Newtonsoft.Json; + +namespace Yoti.Auth.DigitalIdentity.Extensions +{ + /// + /// Type and content of a feature for an application. Implemented , + /// and adds generic content on top + /// + /// Type of the extension's content + public class Extension : BaseExtension + { + [JsonProperty(PropertyName = "content")] + private readonly T _content; + + public Extension(string type, T content) : base(type) + { + _content = content; + } + + /// + /// Get the feature's details + /// + /// The payload of the operation + [JsonIgnore] + public T Content + { + get + { + return _content; + } + } + } +} \ No newline at end of file diff --git a/src/Yoti.Auth/DigitalIdentity/Extensions/ExtensionBuilder.cs b/src/Yoti.Auth/DigitalIdentity/Extensions/ExtensionBuilder.cs new file mode 100644 index 000000000..c5aea619d --- /dev/null +++ b/src/Yoti.Auth/DigitalIdentity/Extensions/ExtensionBuilder.cs @@ -0,0 +1,25 @@ +namespace Yoti.Auth.DigitalIdentity.Extensions +{ + public class ExtensionBuilder + { + private string _type; + private T _content; + + public ExtensionBuilder WithType(string type) + { + _type = type; + return this; + } + + public ExtensionBuilder WithContent(T content) + { + _content = content; + return this; + } + + public Extension Build() + { + return new Extension(_type, _content); + } + } +} \ No newline at end of file diff --git a/src/Yoti.Auth/DigitalIdentity/Extensions/LocationConstraintContent.cs b/src/Yoti.Auth/DigitalIdentity/Extensions/LocationConstraintContent.cs new file mode 100644 index 000000000..15e0cb32f --- /dev/null +++ b/src/Yoti.Auth/DigitalIdentity/Extensions/LocationConstraintContent.cs @@ -0,0 +1,24 @@ +using Newtonsoft.Json; + +namespace Yoti.Auth.DigitalIdentity.Extensions +{ + public class LocationConstraintContent + { + [JsonProperty(PropertyName = "expected_device_location")] + private readonly DeviceLocation _expectedDeviceLocation; + + public LocationConstraintContent(double latitude, double longitude, double radius, double maxUncertainty) + { + _expectedDeviceLocation = new DeviceLocation(latitude, longitude, radius, maxUncertainty); + } + + [JsonIgnore] + public DeviceLocation ExpectedDeviceLocation + { + get + { + return _expectedDeviceLocation; + } + } + } +} \ No newline at end of file diff --git a/src/Yoti.Auth/DigitalIdentity/Extensions/LocationConstraintExtensionBuilder.cs b/src/Yoti.Auth/DigitalIdentity/Extensions/LocationConstraintExtensionBuilder.cs new file mode 100644 index 000000000..0a633c913 --- /dev/null +++ b/src/Yoti.Auth/DigitalIdentity/Extensions/LocationConstraintExtensionBuilder.cs @@ -0,0 +1,66 @@ +namespace Yoti.Auth.DigitalIdentity.Extensions +{ + public class LocationConstraintExtensionBuilder + { + private double _latitude; + private double _longitude; + private double _radius = 150d; + private double _maxUncertainty = 150d; + + /// + /// Allows you to specify the Latitude of the user's expected location. + /// + /// + /// This LocationConstraintExtensionBuilder + public LocationConstraintExtensionBuilder WithLatitude(double latitude) + { + Validation.WithinRange(latitude, -90d, 90d, nameof(latitude)); + _latitude = latitude; + return this; + } + + /// + /// Allows you to specify the Longitude of the user's expected location. + /// + /// + /// This LocationConstraintExtensionBuilder + public LocationConstraintExtensionBuilder WithLongitude(double longitude) + { + Validation.WithinRange(longitude, -180d, 180d, nameof(longitude)); + _longitude = longitude; + return this; + } + + /// + /// Radius of the circle, centred on the specified location coordinates, where the device is + /// allowed to perform the share. If not provided, a default value of 150m will be used. + /// + /// The allowable distance, in metres, from the given lat/long location + /// This LocationConstraintExtensionBuilder + public LocationConstraintExtensionBuilder WithRadius(double radius) + { + Validation.NotLessThan(radius, 0d, nameof(radius)); + _radius = radius; + return this; + } + + /// + /// Maximum acceptable distance, in metres, of the area of uncertainty associated with the + /// device location coordinates. If not provided, a default value of 150m will be used. + /// + /// Maximum allowed measurement uncertainty, in metres + /// This LocationConstraintExtensionBuilder + public LocationConstraintExtensionBuilder WithMaxUncertainty(double maxUncertainty) + { + Validation.NotLessThan(maxUncertainty, 0d, nameof(maxUncertainty)); + _maxUncertainty = maxUncertainty; + return this; + } + + public Extension Build() + { + LocationConstraintContent content = new LocationConstraintContent(_latitude, _longitude, _radius, _maxUncertainty); + return new Extension(Constants.Extension.LocationConstraint, content); + } + } +} \ No newline at end of file diff --git a/src/Yoti.Auth/DigitalIdentity/Extensions/ThirdPartyAttributeContent.cs b/src/Yoti.Auth/DigitalIdentity/Extensions/ThirdPartyAttributeContent.cs new file mode 100644 index 000000000..7aa92fb81 --- /dev/null +++ b/src/Yoti.Auth/DigitalIdentity/Extensions/ThirdPartyAttributeContent.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using Newtonsoft.Json; +using Yoti.Auth.Share.ThirdParty; + +namespace Yoti.Auth.DigitalIdentity.Extensions +{ + public class ThirdPartyAttributeContent + { + private readonly DateTime _expiryDate; + + public ThirdPartyAttributeContent(DateTime expiryDate, List definitions) + { + _expiryDate = expiryDate; + Definitions = definitions; + } + + [JsonProperty(PropertyName = "definitions")] + public List Definitions { get; private set; } + + [JsonProperty(PropertyName = "expiry_date")] + public string ExpiryDate + { + get + { + return _expiryDate.ToString(Constants.Format.RFC3339PatternMilli, DateTimeFormatInfo.InvariantInfo); + } + } + } +} \ No newline at end of file diff --git a/src/Yoti.Auth/DigitalIdentity/Extensions/ThirdPartyAttributeExtensionBuilder.cs b/src/Yoti.Auth/DigitalIdentity/Extensions/ThirdPartyAttributeExtensionBuilder.cs new file mode 100644 index 000000000..92df28e6f --- /dev/null +++ b/src/Yoti.Auth/DigitalIdentity/Extensions/ThirdPartyAttributeExtensionBuilder.cs @@ -0,0 +1,67 @@ +using System; +using System.Collections.Generic; +using Yoti.Auth.Share.ThirdParty; + +namespace Yoti.Auth.DigitalIdentity.Extensions +{ + public class ThirdPartyAttributeExtensionBuilder : ExtensionBuilder + { + private DateTime _expiryDate; + private List _definitions; + + public ThirdPartyAttributeExtensionBuilder() + { + _definitions = new List(); + } + + /// + /// Allows you to specify the expiry date of the third party attribute + /// + /// + public ThirdPartyAttributeExtensionBuilder WithExpiryDate(DateTime expiryDate) + { + _expiryDate = expiryDate; + return this; + } + + /// + /// Add a definition to the list of specified third party attribute definitions + /// + /// + public ThirdPartyAttributeExtensionBuilder WithDefinition(string definition) + { + Validation.NotNullOrEmpty(definition, nameof(definition)); + + _definitions.Add(new AttributeDefinition(definition)); + return this; + } + + /// + /// Set the list of third party attribute definitions (will override any previously set definitions) + /// + /// + public ThirdPartyAttributeExtensionBuilder WithDefinitions(List definitions) + { + Validation.NotNull(definitions, nameof(definitions)); + + var attributeDefinitions = new List(); + + foreach (string definition in definitions) + { + attributeDefinitions.Add(new AttributeDefinition(definition)); + } + + _definitions = attributeDefinitions; + return this; + } + + public new Extension Build() + { + var thirdPartyAttributeContent = new ThirdPartyAttributeContent(_expiryDate, _definitions); + + return new Extension( + Constants.Extension.ThirdPartyAttribute, + thirdPartyAttributeContent); + } + } +} \ No newline at end of file diff --git a/src/Yoti.Auth/DigitalIdentity/Extensions/TransactionalFlowExtensionBuilder.cs b/src/Yoti.Auth/DigitalIdentity/Extensions/TransactionalFlowExtensionBuilder.cs new file mode 100644 index 000000000..05ac8fc88 --- /dev/null +++ b/src/Yoti.Auth/DigitalIdentity/Extensions/TransactionalFlowExtensionBuilder.cs @@ -0,0 +1,25 @@ +namespace Yoti.Auth.DigitalIdentity.Extensions +{ + /// + /// Allows you to provide a non-null object representing the content to be submitted in the + /// TRANSACTIONAL_FLOW extension. + /// + /// The type of the content + public class TransactionalFlowExtensionBuilder + { + private T _content; + + public TransactionalFlowExtensionBuilder WithContent(T content) + { + Validation.NotNull(content, nameof(content)); + + _content = content; + return this; + } + + public Extension Build() + { + return new Extension(Constants.Extension.TransactionalFlow, _content); + } + } +} \ No newline at end of file diff --git a/src/Yoti.Auth/DigitalIdentity/GetQrCodeResult.cs b/src/Yoti.Auth/DigitalIdentity/GetQrCodeResult.cs new file mode 100644 index 000000000..63ca5e45c --- /dev/null +++ b/src/Yoti.Auth/DigitalIdentity/GetQrCodeResult.cs @@ -0,0 +1,32 @@ +using System.Collections.Generic; +using Newtonsoft.Json; +using Yoti.Auth.DigitalIdentity.Extensions; + +namespace Yoti.Auth.DigitalIdentity +{ + public class GetQrCodeResult + { +#pragma warning disable 0649 + // These fields are assigned to by JSON deserialization + [JsonProperty("id")] + public string Id { get; set; } + + [JsonProperty("expiry")] + public string Expiry { get; set; } + + [JsonProperty("policy")] + public string Policy { get; set; } + + [JsonProperty("extensions")] + private List Extensions { get; set; } + + [JsonProperty("session")] + public ShareSessionResult Session { get; set; } + + [JsonProperty("redirectUri")] + public string RedirectUri { get; set; } + +#pragma warning restore 0649 + + } +} \ No newline at end of file diff --git a/src/Yoti.Auth/DigitalIdentity/GetReceipt.cs b/src/Yoti.Auth/DigitalIdentity/GetReceipt.cs new file mode 100644 index 000000000..e6dd05886 --- /dev/null +++ b/src/Yoti.Auth/DigitalIdentity/GetReceipt.cs @@ -0,0 +1,48 @@ +using Newtonsoft.Json; + +namespace Yoti.Auth.DigitalIdentity +{ + public class Content + { + [JsonProperty("profile")] + public byte[] Profile { get; set; } + + [JsonProperty("extraData")] + public byte[] ExtraData { get; set; } + } + + public class ReceiptResponse + { + [JsonProperty("id")] + public string ID { get; set; } + + [JsonProperty("sessionId")] + public string SessionID { get; set; } + + [JsonProperty("timestamp")] + public string Timestamp { get; set; } + + [JsonProperty("rememberMeId")] + public string RememberMeID { get; set; } + + [JsonProperty("parentRememberMeId")] + public string ParentRememberMeID { get; set; } + + [JsonProperty("content")] + public Content Content { get; set; } + + [JsonProperty("otherPartyContent")] + public Content OtherPartyContent { get; set; } + + [JsonProperty("wrappedItemKeyId")] + public string WrappedItemKeyId { get; set; } + + [JsonProperty("wrappedKey")] + public byte[] WrappedKey { get; set; } + + [JsonProperty("error")] + public string Error { get; set; } + [JsonProperty("error_details")] + public ErrorDetails ErrorDetails { get; set; } + } +} diff --git a/src/Yoti.Auth/DigitalIdentity/GetSessionResult.cs b/src/Yoti.Auth/DigitalIdentity/GetSessionResult.cs new file mode 100644 index 000000000..f5084f6b6 --- /dev/null +++ b/src/Yoti.Auth/DigitalIdentity/GetSessionResult.cs @@ -0,0 +1,48 @@ +using Newtonsoft.Json; + + +namespace Yoti.Auth.DigitalIdentity +{ + public class GetSessionResult + { +#pragma warning disable 0649 + // These fields are assigned to by JSON deserialization + [JsonProperty("id")] + public string Id { get; set; } + + [JsonProperty("status")] + public string Status { get; set; } + + [JsonProperty("expiry")] + public string Expiry { get; set; } + + [JsonProperty("created")] + public string Created { get; set; } + + [JsonProperty("updated")] + public string Updated { get; set; } + + [JsonProperty("qrCode")] + public qrCode QrCode { get; set; } + + [JsonProperty("receipt")] + public receipt Receipt { get; set; } + +#pragma warning restore 0649 + + } + + public class qrCode + { + [JsonProperty("id")] + public string Id { get; set; } + } + + public class receipt + { + [JsonProperty("id")] + public string Id { get; set; } + } + + +} diff --git a/src/Yoti.Auth/DigitalIdentity/Policy/AdvancedIdentityProfile.cs b/src/Yoti.Auth/DigitalIdentity/Policy/AdvancedIdentityProfile.cs new file mode 100644 index 000000000..40896fdd3 --- /dev/null +++ b/src/Yoti.Auth/DigitalIdentity/Policy/AdvancedIdentityProfile.cs @@ -0,0 +1,30 @@ +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace Yoti.Auth.DigitalIdentity.Policy +{ + public class AdvancedIdentityProfile + { + [JsonProperty(PropertyName = "profiles")] + public List Profiles { get; set; } + } + + public class Profile + { + [JsonProperty(PropertyName = "trust_framework")] + public string TrustFramework { get; set; } + [JsonProperty(PropertyName = "schemes")] + public List Schemes { get; set; } + } + + public class Scheme + { + [JsonProperty(PropertyName = "label")] + public string Label { get; set; } + [JsonProperty(PropertyName = "objective")] + public string Objective { get; set; } + [JsonProperty(PropertyName = "type")] + public string Type { get; set; } + } + +} diff --git a/src/Yoti.Auth/DigitalIdentity/Policy/Constraint.cs b/src/Yoti.Auth/DigitalIdentity/Policy/Constraint.cs new file mode 100644 index 000000000..df5fc9e4d --- /dev/null +++ b/src/Yoti.Auth/DigitalIdentity/Policy/Constraint.cs @@ -0,0 +1,16 @@ +using Newtonsoft.Json; + +namespace Yoti.Auth.DigitalIdentity.Policy +{ + public class Constraint + { + [JsonRequired] + [JsonProperty(PropertyName = "type")] + public string ConstraintType { get; private set; } + + public Constraint(string constraintType) + { + ConstraintType = constraintType; + } + } +} \ No newline at end of file diff --git a/src/Yoti.Auth/DigitalIdentity/Policy/Notification.cs b/src/Yoti.Auth/DigitalIdentity/Policy/Notification.cs new file mode 100644 index 000000000..a385526df --- /dev/null +++ b/src/Yoti.Auth/DigitalIdentity/Policy/Notification.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace Yoti.Auth.DigitalIdentity.Policy +{ + public class Notification + { + [JsonProperty(PropertyName = "url")] + public string Url { get; set; } // Required if 'notification' is defined + [JsonProperty(PropertyName = "method")] + public string Method { get; set; } = "POST"; // Optional, defaults to 'POST' + [JsonProperty(PropertyName = "headers")] + public Dictionary Headers { get; set; } // Optional + [JsonProperty(PropertyName = "verifyTls")] + public bool VerifyTls { get; set; } = true; // Optional, defaults to 'true' if URL is HTTPS + + public Notification(string url, string method, Dictionary headers, bool verifyTls) + { + Url = url; + Method = method; + Headers = headers; + VerifyTls = verifyTls; + } + } +} diff --git a/src/Yoti.Auth/DigitalIdentity/Policy/NotificationBuilder.cs b/src/Yoti.Auth/DigitalIdentity/Policy/NotificationBuilder.cs new file mode 100644 index 000000000..57ffe60e5 --- /dev/null +++ b/src/Yoti.Auth/DigitalIdentity/Policy/NotificationBuilder.cs @@ -0,0 +1,62 @@ +using System.Collections.Generic; + +namespace Yoti.Auth.DigitalIdentity.Policy +{ + public class NotificationBuilder + { + private string _url; + private string _method; + private Dictionary _headers; + private bool _verifyTls; + + /// + /// Set the URL for the notification, required if 'notification' is defined, required + /// + /// + /// + public NotificationBuilder WithUrl(string url) + { + _url = url; + return this; + } + + /// + /// Set the method for the notification, defaults to 'POST', optional + /// + /// + /// + public NotificationBuilder WithMethod(string method) + { + _method = method; + return this; + } + + /// + /// Set the headers for the notification, optional + /// + /// + /// + public NotificationBuilder WithHeaders(Dictionary headers) + { + _headers = headers; + return this; + } + + /// + /// Set to false to disable TLS verification, defaults to 'true' if URL is HTTPS, optional + /// + /// + /// + public NotificationBuilder WithVerifyTls(bool verifyTls) + { + _verifyTls = verifyTls; + return this; + } + + public Notification Build() + { + Validation.NotNullOrEmpty(_url, nameof(_url)); + return new Notification(_url, _method, _headers, _verifyTls); + } + } +} diff --git a/src/Yoti.Auth/DigitalIdentity/Policy/Policy.cs b/src/Yoti.Auth/DigitalIdentity/Policy/Policy.cs new file mode 100644 index 000000000..9bd799ecd --- /dev/null +++ b/src/Yoti.Auth/DigitalIdentity/Policy/Policy.cs @@ -0,0 +1,113 @@ +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace Yoti.Auth.DigitalIdentity.Policy +{ + /// + /// Set of data required to request a sharing transaction + /// + public class Policy + { + internal const int SelfieAuthType = 1; + internal const int PinAuthType = 2; + + [JsonProperty(PropertyName = "wanted")] + private readonly ICollection _wantedAttributes; + + [JsonProperty(PropertyName = "wanted_auth_types")] + private readonly HashSet _wantedAuthTypes; + + [JsonProperty(PropertyName = "wanted_remember_me")] + private readonly bool _wantedRememberMeId; + +#pragma warning disable 0414 //"Value never used" warning: the JsonProperty is used when creating the DynamicPolicy JSON + + [JsonProperty(PropertyName = "wanted_remember_me_optional")] + private readonly bool _isWantedRememberMeIdOptional; + +#pragma warning restore 0414 + + [JsonProperty(PropertyName = "identity_profile_requirements")] + private readonly object _identityProfileRequirements; + + [JsonProperty(PropertyName = "advanced_identity_profile_requirements")] + private readonly object _advancedIdentityProfileRequirements; + + public Policy( + ICollection wantedAttributes, + HashSet wantedAuthTypes, + bool wantedRememberMeId, + object identityProfileRequirements = null, + object advancedIdentityProfileRequirements = null + ) + { + _wantedAttributes = wantedAttributes; + _wantedAuthTypes = wantedAuthTypes; + _wantedRememberMeId = wantedRememberMeId; + _isWantedRememberMeIdOptional = false; + _identityProfileRequirements = identityProfileRequirements; + _advancedIdentityProfileRequirements = advancedIdentityProfileRequirements; + + } + + /// + /// Set of required + /// + [JsonIgnore] + public ICollection WantedAttributes + { + get + { + return _wantedAttributes; + } + } + + /// + /// Type of authentications + /// + [JsonIgnore] + public HashSet WantedAuthTypes + { + get + { + return _wantedAuthTypes; + } + } + + /// + /// Is RememberMeId wanted in the policy + /// + [JsonIgnore] + public bool WantedRememberMeId + { + get + { + return _wantedRememberMeId; + } + } + + /// + /// IdentityProfileRequirements requested in the policy + /// + [JsonIgnore] + public object IdentityProfileRequirements + { + get + { + return _identityProfileRequirements; + } + } + + /// + /// AdvancedIdentityProfileRequirements requested in the policy + /// + [JsonIgnore] + public object AdvancedIdentityProfileRequirements + { + get + { + return _advancedIdentityProfileRequirements; + } + } + } +} diff --git a/src/Yoti.Auth/DigitalIdentity/Policy/PolicyBuilder.cs b/src/Yoti.Auth/DigitalIdentity/Policy/PolicyBuilder.cs new file mode 100644 index 000000000..d85c96947 --- /dev/null +++ b/src/Yoti.Auth/DigitalIdentity/Policy/PolicyBuilder.cs @@ -0,0 +1,178 @@ +using System.Collections.Generic; +using Yoti.Auth.DocScan.Session.Create; + +namespace Yoti.Auth.DigitalIdentity.Policy +{ + public class PolicyBuilder + { + private readonly Dictionary _wantedAttributes = new Dictionary(); + private readonly HashSet _wantedAuthTypes = new HashSet(); + private bool _wantedRememberMeId; + private object _identityProfileRequirements; + private AdvancedIdentityProfile _advancedIdentityProfileRequirements; + + public PolicyBuilder WithWantedAttribute(WantedAttribute wantedAttribute) + { + Validation.NotNull(wantedAttribute, nameof(wantedAttribute)); + + string key = wantedAttribute.Derivation ?? wantedAttribute.Name; + + if (wantedAttribute.Constraints?.Count > 0) + { + key += "-" + wantedAttribute.Constraints.GetHashCode(); + } + + _wantedAttributes[key] = wantedAttribute; + return this; + } + + public PolicyBuilder WithWantedAttribute(string name, List constraints = null) + { + WantedAttribute wantedAttribute = new WantedAttributeBuilder() + .WithName(name) + .WithConstraints(constraints) + .Build(); + return WithWantedAttribute(wantedAttribute); + } + + public PolicyBuilder WithFamilyName(List constraints = null) + { + return WithWantedAttribute(Constants.UserProfile.FamilyNameAttribute, constraints); + } + + public PolicyBuilder WithGivenNames(List constraints = null) + { + return WithWantedAttribute(Constants.UserProfile.GivenNamesAttribute, constraints); + } + + public PolicyBuilder WithFullName(List constraints = null) + { + return WithWantedAttribute(Constants.UserProfile.FullNameAttribute, constraints); + } + + public PolicyBuilder WithDateOfBirth(List constraints = null) + { + return WithWantedAttribute(Constants.UserProfile.DateOfBirthAttribute, constraints); + } + + public PolicyBuilder WithAgeOver(int age, List constraints = null) + { + return WithAgeDerivedAttribute($"{Constants.UserProfile.AgeOverAttribute}:{age}", constraints); + } + + public PolicyBuilder WithAgeUnder(int age, List constraints = null) + { + return WithAgeDerivedAttribute($"{Constants.UserProfile.AgeUnderAttribute}:{age}", constraints); + } + + private PolicyBuilder WithAgeDerivedAttribute(string derivation, List constraints) + { + WantedAttribute wantedAttribute = new WantedAttributeBuilder() + .WithName(Constants.UserProfile.DateOfBirthAttribute) + .WithDerivation(derivation) + .WithConstraints(constraints) + .Build(); + return WithWantedAttribute(wantedAttribute); + } + + public PolicyBuilder WithGender(List constraints = null) + { + return WithWantedAttribute(Constants.UserProfile.GenderAttribute, constraints); + } + + public PolicyBuilder WithPostalAddress(List constraints = null) + { + return WithWantedAttribute(Constants.UserProfile.PostalAddressAttribute, constraints); + } + + public PolicyBuilder WithStructuredPostalAddress(List constraints = null) + { + return WithWantedAttribute(Constants.UserProfile.StructuredPostalAddressAttribute, constraints); + } + + public PolicyBuilder WithNationality(List constraints = null) + { + return WithWantedAttribute(Constants.UserProfile.NationalityAttribute, constraints); + } + + public PolicyBuilder WithPhoneNumber(List constraints = null) + { + return WithWantedAttribute(Constants.UserProfile.PhoneNumberAttribute, constraints); + } + + public PolicyBuilder WithSelfie(List constraints = null) + { + return WithWantedAttribute(Constants.UserProfile.SelfieAttribute, constraints); + } + + public PolicyBuilder WithEmail(List constraints = null) + { + return WithWantedAttribute(Constants.UserProfile.EmailAddressAttribute, constraints); + } + + public PolicyBuilder WithDocumentDetails(List constraints = null) + { + return WithWantedAttribute(Constants.UserProfile.DocumentDetailsAttribute, constraints); + } + + public PolicyBuilder WithDocumentImages(List constraints = null) + { + return WithWantedAttribute(Constants.UserProfile.DocumentImagesAttribute, constraints); + } + + public PolicyBuilder WithSelfieAuthentication(bool enabled) + { + return WithAuthType(Policy.SelfieAuthType, enabled); + } + + public PolicyBuilder WithPinAuthentication(bool enabled) + { + return WithAuthType(Policy.PinAuthType, enabled); + } + + public PolicyBuilder WithAuthType(int authType, bool enabled) + { + if (enabled) + { + _wantedAuthTypes.Add(authType); + return this; + } + + _wantedAuthTypes.Remove(authType); + return this; + } + + public PolicyBuilder WithRememberMeId(bool required) + { + _wantedRememberMeId = required; + return this; + } + + /// + /// Use an Identity Profile Requirement object for the share + /// + /// object describing the identity profile requirements to use + /// with the identity profile requirements + public PolicyBuilder WithIdentityProfileRequirements(object identityProfileRequirements) + { + _identityProfileRequirements = identityProfileRequirements; + return this; + } + + /// + /// Use an Advanced Identity Profile Requirement object for the share + /// + /// object describing the advanced identity profile requirements to use + /// with the advanced identity profile requirements + public PolicyBuilder WithAdvancedIdentityProfileRequirements(AdvancedIdentityProfile advancedIdentityProfileRequirements) + { + _advancedIdentityProfileRequirements = advancedIdentityProfileRequirements; + return this; + } + + public Policy Build() + { + return new Policy(_wantedAttributes.Values, _wantedAuthTypes, _wantedRememberMeId, _identityProfileRequirements, _advancedIdentityProfileRequirements); + } + } +} diff --git a/src/Yoti.Auth/DigitalIdentity/Policy/PreferredSources.cs b/src/Yoti.Auth/DigitalIdentity/Policy/PreferredSources.cs new file mode 100644 index 000000000..b315166ba --- /dev/null +++ b/src/Yoti.Auth/DigitalIdentity/Policy/PreferredSources.cs @@ -0,0 +1,20 @@ +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace Yoti.Auth.DigitalIdentity.Policy +{ + public class PreferredSources + { + [JsonProperty(PropertyName = "anchors")] + public List WantedAnchors { get; private set; } + + [JsonProperty(PropertyName = "soft_preference")] + public bool SoftPreference { get; private set; } + + public PreferredSources(List wantedAnchors, bool softPreference = false) + { + WantedAnchors = wantedAnchors; + SoftPreference = softPreference; + } + } +} \ No newline at end of file diff --git a/src/Yoti.Auth/DigitalIdentity/Policy/SourceConstraint.cs b/src/Yoti.Auth/DigitalIdentity/Policy/SourceConstraint.cs new file mode 100644 index 000000000..1430c5b62 --- /dev/null +++ b/src/Yoti.Auth/DigitalIdentity/Policy/SourceConstraint.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace Yoti.Auth.DigitalIdentity.Policy +{ + public class SourceConstraint : Constraint + { + private const string _constraintTypeSource = "SOURCE"; + + [JsonProperty(PropertyName = "preferred_sources")] + public PreferredSources PreferredSources { get; private set; } + + public SourceConstraint(List wantedAnchors, bool softPreference) : base(constraintType: _constraintTypeSource) + { + PreferredSources = new PreferredSources(wantedAnchors, softPreference); + } + } +} \ No newline at end of file diff --git a/src/Yoti.Auth/DigitalIdentity/Policy/SourceConstraintBuilder.cs b/src/Yoti.Auth/DigitalIdentity/Policy/SourceConstraintBuilder.cs new file mode 100644 index 000000000..f11dbf7fd --- /dev/null +++ b/src/Yoti.Auth/DigitalIdentity/Policy/SourceConstraintBuilder.cs @@ -0,0 +1,72 @@ +using System.Collections.Generic; + +namespace Yoti.Auth.DigitalIdentity.Policy +{ + public class SourceConstraintBuilder + { + private readonly List _wantedAnchors = new List(); + private bool _softPreference; + + /// + /// Add an anchor to the source constraints list. + /// This is ordered, from the most preferred one (first in the list) + /// to the least preferred one (last in the list). + /// + /// + public SourceConstraintBuilder WithAnchor(WantedAnchor anchor) + { + _wantedAnchors.Add(anchor); + return this; + } + + /// + /// If set to false, it means that only anchors in the list are + /// accepted, in order of preference. + /// If set to true, it instead means that if none of the anchors + /// in the list can be satisfied, then any other anchor that is + /// not in the list is accepted. + /// + /// + public SourceConstraintBuilder WithSoftPreference(bool softPreference) + { + _softPreference = softPreference; + return this; + } + + public SourceConstraintBuilder WithAnchorByValue(string value, string subType) + { + _wantedAnchors.Add( + new WantedAnchorBuilder() + .WithValue(value) + .WithSubType(subType) + .Build()); + + return this; + } + + public SourceConstraintBuilder WithPassport(string subType = "") + { + return WithAnchorByValue(Constants.DocumentDetails.DocumentTypePassport, subType); + } + + public SourceConstraintBuilder WithDrivingLicense(string subType = "") + { + return WithAnchorByValue(Constants.DocumentDetails.DocumentTypeDrivingLicense, subType); + } + + public SourceConstraintBuilder WithNationalId(string subType = "") + { + return WithAnchorByValue(Constants.DocumentDetails.DocumentTypeNationalId, subType); + } + + public SourceConstraintBuilder WithPasscard(string subType = "") + { + return WithAnchorByValue(Constants.DocumentDetails.DocumentTypePassCard, subType); + } + + public SourceConstraint Build() + { + return new SourceConstraint(_wantedAnchors, _softPreference); + } + } +} \ No newline at end of file diff --git a/src/Yoti.Auth/DigitalIdentity/Policy/WantedAnchor.cs b/src/Yoti.Auth/DigitalIdentity/Policy/WantedAnchor.cs new file mode 100644 index 000000000..7cf4e9da0 --- /dev/null +++ b/src/Yoti.Auth/DigitalIdentity/Policy/WantedAnchor.cs @@ -0,0 +1,19 @@ +using Newtonsoft.Json; + +namespace Yoti.Auth.DigitalIdentity.Policy +{ + public class WantedAnchor + { + [JsonProperty(PropertyName = "name")] + public string Name { get; private set; } + + [JsonProperty(PropertyName = "sub_type")] + public string SubType { get; private set; } + + public WantedAnchor(string name, string subType) + { + Name = name; + SubType = subType; + } + } +} \ No newline at end of file diff --git a/src/Yoti.Auth/DigitalIdentity/Policy/WantedAnchorBuilder.cs b/src/Yoti.Auth/DigitalIdentity/Policy/WantedAnchorBuilder.cs new file mode 100644 index 000000000..de66c6b7a --- /dev/null +++ b/src/Yoti.Auth/DigitalIdentity/Policy/WantedAnchorBuilder.cs @@ -0,0 +1,37 @@ +namespace Yoti.Auth.DigitalIdentity.Policy +{ + public class WantedAnchorBuilder + { + private string _name; + private string _subType; + + /// + /// WithValue sets the anchor's name + /// + /// Anchor name + public WantedAnchorBuilder WithValue(string name) + { + _name = name; + return this; + } + + /// + /// WithSubType sets the anchor's sub-type + /// + /// Anchor sub-type + public WantedAnchorBuilder WithSubType(string subType) + { + _subType = subType; + return this; + } + + /// + /// Builds the WantedAnchor + /// + /// + public WantedAnchor Build() + { + return new WantedAnchor(_name, _subType); + } + } +} \ No newline at end of file diff --git a/src/Yoti.Auth/DigitalIdentity/Policy/WantedAttribute.cs b/src/Yoti.Auth/DigitalIdentity/Policy/WantedAttribute.cs new file mode 100644 index 000000000..a53199389 --- /dev/null +++ b/src/Yoti.Auth/DigitalIdentity/Policy/WantedAttribute.cs @@ -0,0 +1,34 @@ +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace Yoti.Auth.DigitalIdentity.Policy +{ + public class WantedAttribute + { + [JsonRequired] + [JsonProperty(PropertyName = "name")] + public string Name { get; private set; } + + [JsonProperty(PropertyName = "derivation")] + public string Derivation { get; private set; } + + [JsonRequired] + [JsonProperty(PropertyName = "optional")] + public bool? Optional { get; private set; } + + [JsonProperty(PropertyName = "accept_self_asserted")] + public bool? AcceptSelfAsserted { get; private set; } + + [JsonProperty(PropertyName = "constraints")] + public List Constraints { get; private set; } + + public WantedAttribute(string name, string derivation, List constraints, bool? acceptSelfAsserted = null, bool? optional = false) + { + Name = name; + Derivation = derivation; + Optional = optional; + AcceptSelfAsserted = acceptSelfAsserted; + Constraints = constraints; + } + } +} diff --git a/src/Yoti.Auth/DigitalIdentity/Policy/WantedAttributeBuilder.cs b/src/Yoti.Auth/DigitalIdentity/Policy/WantedAttributeBuilder.cs new file mode 100644 index 000000000..34bfc1faa --- /dev/null +++ b/src/Yoti.Auth/DigitalIdentity/Policy/WantedAttributeBuilder.cs @@ -0,0 +1,69 @@ +using System.Collections.Generic; + +namespace Yoti.Auth.DigitalIdentity.Policy +{ + public class WantedAttributeBuilder + { + private string _name; + private string _derivation; + private List _constraints = new List(); + private bool? _acceptSelfAsserted; + private bool? _optional; + + public WantedAttributeBuilder WithName(string name) + { + _name = name; + return this; + } + + public WantedAttributeBuilder WithOptional(bool optional) + { + _optional = optional; + return this; + } + + public WantedAttributeBuilder WithDerivation(string derivation) + { + _derivation = derivation; + return this; + } + + /// + /// Adds a constraint to the wanted attribute. + /// + /// + public WantedAttributeBuilder WithConstraint(Constraint constraint) + { + _constraints.Add(constraint); + return this; + } + + /// + /// Add constraints to the wanted attribute. + /// Calling this will override any previously set constraints for this attribute. + /// + /// Constraints + public WantedAttributeBuilder WithConstraints(List constraints) + { + _constraints = constraints; + return this; + } + + /// + /// Allow or deny the acceptance of self asserted attributes + /// + /// + public WantedAttributeBuilder WithAcceptSelfAsserted(bool acceptSelfAsserted) + { + _acceptSelfAsserted = acceptSelfAsserted; + return this; + } + + public WantedAttribute Build() + { + Validation.NotNullOrEmpty(_name, nameof(_name)); + + return new WantedAttribute(_name, _derivation, _constraints, _acceptSelfAsserted, _optional); + } + } +} diff --git a/src/Yoti.Auth/DigitalIdentity/QrRequest.cs b/src/Yoti.Auth/DigitalIdentity/QrRequest.cs new file mode 100644 index 000000000..70ccd7c08 --- /dev/null +++ b/src/Yoti.Auth/DigitalIdentity/QrRequest.cs @@ -0,0 +1,40 @@ +using System.Collections.Generic; +using Newtonsoft.Json; +using Yoti.Auth.DigitalIdentity.Extensions; +using Yoti.Auth.DigitalIdentity.Policy; + +namespace Yoti.Auth.DigitalIdentity +{ + public class QrRequest + { + [JsonProperty(PropertyName = "transport")] + private readonly string _transport; + + [JsonProperty(PropertyName = "displayMode")] + private readonly string _displayMode; + + [JsonIgnore] + public string DisplayMode + { + get + { + return _displayMode; + } + } + + [JsonIgnore] + public string Transport + { + get + { + return _transport; + } + } + + public QrRequest(string transport = null, string displayMode = null) + { + _transport = transport; + _displayMode = displayMode; + } + } +} \ No newline at end of file diff --git a/src/Yoti.Auth/DigitalIdentity/QrRequestBuilder.cs b/src/Yoti.Auth/DigitalIdentity/QrRequestBuilder.cs new file mode 100644 index 000000000..2e066d3dd --- /dev/null +++ b/src/Yoti.Auth/DigitalIdentity/QrRequestBuilder.cs @@ -0,0 +1,39 @@ +using System.Collections.Generic; +using Yoti.Auth.DigitalIdentity.Extensions; +using Yoti.Auth.DigitalIdentity.Policy; + +namespace Yoti.Auth.DigitalIdentity +{ + public class QrRequestBuilder + { + private string _transport = ""; + private string _displayMode = ""; + + /// + /// Transport property. Optional - default is 'INLINE' + /// + /// + /// with a Transport added + public QrRequestBuilder WithTransport(string transport) + { + _transport = transport; + return this; + } + + /// + /// DisplayMode property. Optional - default is 'QR_CODE' + /// + /// + /// with a Display Mode added + public QrRequestBuilder WithDisplayMode(string displayMode) + { + _displayMode = displayMode ; + return this; + } + + public QrRequest Build() + { + return new QrRequest(_transport,_displayMode); + } + } +} diff --git a/src/Yoti.Auth/DigitalIdentity/ReceiptItemKeyResponse.cs b/src/Yoti.Auth/DigitalIdentity/ReceiptItemKeyResponse.cs new file mode 100644 index 000000000..da03a5ba1 --- /dev/null +++ b/src/Yoti.Auth/DigitalIdentity/ReceiptItemKeyResponse.cs @@ -0,0 +1,16 @@ +using Newtonsoft.Json; + +namespace Yoti.Auth.DigitalIdentity +{ + public class ReceiptItemKeyResponse + { + [JsonProperty("id")] + public string ID { get; set; } + + [JsonProperty("iv")] + public byte[] Iv { get; set; } + + [JsonProperty("value")] + public byte[] Value { get; set; } + } +} diff --git a/src/Yoti.Auth/DigitalIdentity/RequirementNotMetDetails.cs b/src/Yoti.Auth/DigitalIdentity/RequirementNotMetDetails.cs new file mode 100644 index 000000000..345a18678 --- /dev/null +++ b/src/Yoti.Auth/DigitalIdentity/RequirementNotMetDetails.cs @@ -0,0 +1,23 @@ +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace Yoti.DigitalIdentity +{ + public class RequirementNotMetDetails + { + [JsonProperty(PropertyName = "failure_type")] + public string FailureType { get; private set; } + + [JsonProperty(PropertyName = "details")] + public string Details { get; private set; } + + [JsonProperty(PropertyName = "audit_id")] + public string AuditId { get; private set; } + + [JsonProperty(PropertyName = "document_country_iso_code")] + public string DocumentCountryIsoCode { get; private set; } + + [JsonProperty(PropertyName = "document_type")] + public string DocumentType { get; private set; } + } +} diff --git a/src/Yoti.Auth/DigitalIdentity/ShareSessionRequest.cs b/src/Yoti.Auth/DigitalIdentity/ShareSessionRequest.cs new file mode 100644 index 000000000..c1d24ddce --- /dev/null +++ b/src/Yoti.Auth/DigitalIdentity/ShareSessionRequest.cs @@ -0,0 +1,83 @@ +using System.Collections.Generic; +using Newtonsoft.Json; +using Yoti.Auth.DigitalIdentity.Extensions; +using Yoti.Auth.DigitalIdentity.Policy; + +namespace Yoti.Auth.DigitalIdentity +{ + public class ShareSessionRequest + { + + [JsonProperty(PropertyName = "policy")] + private readonly Policy.Policy _dynamicPolicy; + + [JsonProperty(PropertyName = "extensions")] + private readonly List _extensions; + + [JsonProperty(PropertyName = "subject")] + private readonly object _subject; + + [JsonProperty(PropertyName = "redirectUri")] + public string _redirectUri { get; set; } + + [JsonProperty(PropertyName = "notification")] + public Notification _notification { get; set; } + + + + [JsonIgnore] + public Policy.Policy DynamicPolicy + { + get + { + return _dynamicPolicy; + } + } + + [JsonIgnore] + public List Extensions + { + get + { + return _extensions; + } + } + + + [JsonIgnore] + public object Subject + { + get + { + return _subject; + } + } + + [JsonIgnore] + public string RedirectUri + { + get + { + return _redirectUri; + } + } + + [JsonIgnore] + public Notification Notification + { + get + { + return _notification; + } + } + + public ShareSessionRequest(Policy.Policy dynamicPolicy, string redirectUri, Notification notification = null, List extensions = null, object subject = null) + { + _redirectUri = redirectUri; + _notification = notification; + _dynamicPolicy = dynamicPolicy; + _extensions = extensions ?? new List(); + _subject = subject; + } + } +} \ No newline at end of file diff --git a/src/Yoti.Auth/DigitalIdentity/ShareSessionRequestBuilder.cs b/src/Yoti.Auth/DigitalIdentity/ShareSessionRequestBuilder.cs new file mode 100644 index 000000000..fed8b1071 --- /dev/null +++ b/src/Yoti.Auth/DigitalIdentity/ShareSessionRequestBuilder.cs @@ -0,0 +1,76 @@ +using System.Collections.Generic; +using Yoti.Auth.DigitalIdentity.Extensions; +using Yoti.Auth.DigitalIdentity.Policy; + +namespace Yoti.Auth.DigitalIdentity +{ + public class ShareSessionRequestBuilder + { + private string _redirectUri; + private Policy.Policy _dynamicPolicy; + private Notification _notification; + private readonly List _extensions = new List(); + private object _subject; + + /// + /// The device's redirect url. Must be a URL relative to the Application Domain + /// specified in Yoti Hub + /// + /// + /// with a Redirect Uri added + public ShareSessionRequestBuilder WithRedirectUri(string redirectUri) + { + _redirectUri = redirectUri; + return this; + } + + /// + /// The customisable to use in the share + /// + /// + /// with a Dynamic Policy added + public ShareSessionRequestBuilder WithPolicy(Policy.Policy dynamicPolicy) + { + _dynamicPolicy = dynamicPolicy; + return this; + } + + /// + /// The customisable to use in the ShareSession + /// + /// + /// with a Notification added + public ShareSessionRequestBuilder WithNotification(Notification notification) + { + _notification = notification; + return this; + } + + /// + /// to be activated for the application + /// + /// to add + /// with an extension added + public ShareSessionRequestBuilder WithExtension(BaseExtension extension) + { + _extensions.Add(extension); + return this; + } + + /// + /// The subject object + /// + /// The object describing the subject + /// with the subject details provided + public ShareSessionRequestBuilder WithSubject(object subject) + { + _subject = subject; + return this; + } + + public ShareSessionRequest Build() + { + return new ShareSessionRequest(_dynamicPolicy, _redirectUri, _notification, _extensions, _subject); + } + } +} diff --git a/src/Yoti.Auth/DigitalIdentity/ShareSessionResult.cs b/src/Yoti.Auth/DigitalIdentity/ShareSessionResult.cs new file mode 100644 index 000000000..eb04f88da --- /dev/null +++ b/src/Yoti.Auth/DigitalIdentity/ShareSessionResult.cs @@ -0,0 +1,24 @@ +using Newtonsoft.Json; + + +namespace Yoti.Auth.DigitalIdentity +{ + public class ShareSessionResult + { +#pragma warning disable 0649 + // These fields are assigned to by JSON deserialization + [JsonProperty("id")] + public string Id { get; set; } + + [JsonProperty("status")] + public string Status { get; set; } + + [JsonProperty("expiry")] + public string Expiry { get; set; } + +#pragma warning restore 0649 + + } + + +} \ No newline at end of file diff --git a/src/Yoti.Auth/DigitalIdentity/SharedReceiptResponse.cs b/src/Yoti.Auth/DigitalIdentity/SharedReceiptResponse.cs new file mode 100644 index 000000000..01ca14d00 --- /dev/null +++ b/src/Yoti.Auth/DigitalIdentity/SharedReceiptResponse.cs @@ -0,0 +1,30 @@ +using Yoti.Auth.Profile; +using Yoti.Auth.Share; + +namespace Yoti.Auth.DigitalIdentity +{ + public class SharedReceiptResponse + { + public string ID { get; set; } + public string SessionID { get; set; } + public string RememberMeID { get; set; } + public string ParentRememberMeID { get; set; } + public string Timestamp { get; set; } + public string Error { get; set; } + public ErrorDetails ErrorDetails { get; set; } + public UserContent UserContent { get; set; } + public ApplicationContent ApplicationContent { get; set; } + } + + public class ApplicationContent + { + public ApplicationProfile ApplicationProfile { get; set; } + public ExtraData ExtraData { get; set; } + } + + public class UserContent + { + public YotiProfile UserProfile { get; set; } + public ExtraData ExtraData { get; set; } + } +} diff --git a/src/Yoti.Auth/DigitalIdentityClient.cs b/src/Yoti.Auth/DigitalIdentityClient.cs new file mode 100644 index 000000000..628a1a06c --- /dev/null +++ b/src/Yoti.Auth/DigitalIdentityClient.cs @@ -0,0 +1,130 @@ +using System; +using System.IO; +using System.Net.Http; +using System.Threading.Tasks; +using Org.BouncyCastle.Crypto; +using Yoti.Auth.DigitalIdentity; + +namespace Yoti.Auth +{ + public class DigitalIdentityClient + { + private readonly string _sdkId; + private readonly AsymmetricCipherKeyPair _keyPair; + private readonly DigitalIdentityClientEngine _yotiDigitalClientEngine; + internal Uri ApiUri { get; private set; } + + /// + /// Create a + /// + /// The client SDK ID provided on the Yoti Hub. + /// + /// The private key file provided on the Yoti Hub as a . + /// + public DigitalIdentityClient(string sdkId, StreamReader privateKeyStream) + : this(new HttpClient(), sdkId, CryptoEngine.LoadRsaKey(privateKeyStream)) + { + } + + /// + /// Create a with a specified + /// + /// Allows the specification of a HttpClient + /// The client SDK ID provided on the Yoti Hub. + /// + /// The private key file provided on the Yoti Hub as a . + /// + public DigitalIdentityClient(HttpClient httpClient, string sdkId, StreamReader privateKeyStream) + : this(httpClient, sdkId, CryptoEngine.LoadRsaKey(privateKeyStream)) + { + } + + /// + /// Create a with a specified + /// + /// Allows the specification of a HttpClient + /// The client SDK ID provided on the Yoti Hub. + /// The key pair from the Yoti Hub. + public DigitalIdentityClient(HttpClient httpClient, string sdkId, AsymmetricCipherKeyPair keyPair) + { + Validation.NotNullOrEmpty(sdkId, nameof(sdkId)); + Validation.NotNull(keyPair, nameof(keyPair)); + + _sdkId = sdkId; + _keyPair = keyPair; + + SetYotiApiUri(); + + _yotiDigitalClientEngine = new DigitalIdentityClientEngine(httpClient); + } + + /// + /// Initiate a sharing process based on a . + /// + /// + /// Details of the device's callback endpoint, and extensions for the application + /// + /// + public ShareSessionResult CreateShareSession(ShareSessionRequest shareSessionRequest) + { + Task task = Task.Run(async () => await CreateShareSessionAsync(shareSessionRequest).ConfigureAwait(false)); + + return task.Result; + } + + /// + /// Asynchronously initiate a sharing process based on a . + /// + /// + /// Details of the device's callback endpoint, and extensions for the application + /// + /// + public async Task CreateShareSessionAsync(ShareSessionRequest shareSessionRequest) + { + return await _yotiDigitalClientEngine.CreateShareSessionAsync(_sdkId, _keyPair, ApiUri, shareSessionRequest).ConfigureAwait(false); + } + + public SharedReceiptResponse GetShareReceipt(string receiptId) + { + Task task = Task.Run(async () => await _yotiDigitalClientEngine.GetShareReceipt(_sdkId, _keyPair, ApiUri, receiptId).ConfigureAwait(false)); + return task.Result; + } + + + public async Task CreateQrCode(string sessionId, QrRequest qrRequest) + { + return await _yotiDigitalClientEngine.CreateQrCodeAsync(_sdkId, _keyPair, ApiUri, sessionId, qrRequest).ConfigureAwait(false); + } + + public async Task GetQrCode(string qrCodeId) + { + return await _yotiDigitalClientEngine.GetQrCodeAsync(_sdkId, _keyPair, ApiUri, qrCodeId).ConfigureAwait(false); + } + + public async Task GetSession(string sessionId) + { + return await _yotiDigitalClientEngine.GetSession(_sdkId, _keyPair, ApiUri, sessionId).ConfigureAwait(false); + } + + internal void SetYotiApiUri() + { + if (!string.IsNullOrEmpty(Environment.GetEnvironmentVariable("YOTI_API_URL"))) + { + ApiUri = new Uri(Environment.GetEnvironmentVariable("YOTI_API_URL")); + } + else + { + ApiUri = new Uri(Constants.Api.DefaultYotiShareApiUrl); + } + } + + public DigitalIdentityClient OverrideApiUri(Uri apiUri) + { + ApiUri = apiUri; + + return this; + } + } +} diff --git a/src/Yoti.Auth/DigitalIdentityClientEngine.cs b/src/Yoti.Auth/DigitalIdentityClientEngine.cs new file mode 100644 index 000000000..0db680235 --- /dev/null +++ b/src/Yoti.Auth/DigitalIdentityClientEngine.cs @@ -0,0 +1,70 @@ +using System; +#pragma warning disable S1128 +using System.Net; +#pragma warning restore S1128 +using System.Net.Http; +using System.Threading.Tasks; +using Org.BouncyCastle.Crypto; +using Yoti.Auth.DigitalIdentity; + +namespace Yoti.Auth +{ + internal class DigitalIdentityClientEngine + { + private readonly HttpClient _httpClient; + + public DigitalIdentityClientEngine(HttpClient httpClient) + { + _httpClient = httpClient; + + #if NET452 || NET462 || NET472 || NET48 + ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; + #endif + } + + public async Task CreateShareSessionAsync(string sdkId, AsymmetricCipherKeyPair keyPair, Uri apiUrl, ShareSessionRequest shareSessionRequest) + { + ShareSessionResult result = await Task.Run(async () => await DigitalIdentityService.CreateShareSession( + _httpClient, apiUrl, sdkId, keyPair, shareSessionRequest).ConfigureAwait(false)) + .ConfigureAwait(false); + + return result; + } + + public async Task GetShareReceipt(string sdkId, AsymmetricCipherKeyPair keyPair, Uri apiUrl, string receiptId) + { + SharedReceiptResponse result = await Task.Run(async () => await DigitalIdentityService.GetShareReceipt( + _httpClient, sdkId, apiUrl, keyPair, receiptId).ConfigureAwait(false)) + .ConfigureAwait(false); + + return result; + } + + public async Task CreateQrCodeAsync(string sdkId, AsymmetricCipherKeyPair keyPair, Uri apiUrl, string sessionid, QrRequest qRRequest) + { + CreateQrResult result = await Task.Run(async () => await DigitalIdentityService.CreateQrCode( + _httpClient, apiUrl, sdkId, keyPair, sessionid, qRRequest).ConfigureAwait(false)) + .ConfigureAwait(false); + + return result; + } + + public async Task GetQrCodeAsync(string sdkId, AsymmetricCipherKeyPair keyPair, Uri apiUrl, string qrcodeId) + { + GetQrCodeResult result = await Task.Run(async () => await DigitalIdentityService.GetQrCode( + _httpClient, apiUrl, sdkId, keyPair, qrcodeId).ConfigureAwait(false)) + .ConfigureAwait(false); + + return result; + } + + public async Task GetSession(string sdkId, AsymmetricCipherKeyPair keyPair, Uri apiUrl, string sessionId) + { + var result = await Task.Run(async () => await DigitalIdentityService.GetSession( + _httpClient, apiUrl, sdkId, keyPair, sessionId).ConfigureAwait(false)) + .ConfigureAwait(false); + + return result; + } + } +} diff --git a/src/Yoti.Auth/DocScan/DocScanService.cs b/src/Yoti.Auth/DocScan/DocScanService.cs index 878756081..fff51c41a 100644 --- a/src/Yoti.Auth/DocScan/DocScanService.cs +++ b/src/Yoti.Auth/DocScan/DocScanService.cs @@ -155,10 +155,19 @@ public async Task GetMediaContent(string sdkId, AsymmetricCipherKeyP { return null; } + + if (response.Content.Headers.ContentType == null) + { + return null; + } + if (response.Content.Headers.ContentType == null) + { + return null; + } + string contentType = response.Content.Headers.ContentType.MediaType; - var responseObject = await response.Content.ReadAsByteArrayAsync(); var deserialized = await Task.Factory.StartNew(() => new MediaValue(contentType, responseObject)); @@ -351,4 +360,4 @@ private static string MediaEndpoint(string sessionId, string mediaId) private static JsonSerializerSettings YotiDefaultJsonSettings => new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }; } -} \ No newline at end of file +} diff --git a/src/Yoti.Auth/DocScan/Session/Create/ApplicantProfile.cs b/src/Yoti.Auth/DocScan/Session/Create/ApplicantProfile.cs new file mode 100644 index 000000000..aec54f35a --- /dev/null +++ b/src/Yoti.Auth/DocScan/Session/Create/ApplicantProfile.cs @@ -0,0 +1,34 @@ +using Newtonsoft.Json; + +namespace Yoti.Auth.DocScan.Session.Create +{ + /// + /// Represents an applicant profile to be used for verification against identity documents. + /// + public class ApplicantProfile + { + internal ApplicantProfile( + string fullName, + string dateOfBirth, + string namePrefix, + StructuredPostalAddress structuredPostalAddress) + { + FullName = fullName; + DateOfBirth = dateOfBirth; + NamePrefix = namePrefix; + StructuredPostalAddress = structuredPostalAddress; + } + + [JsonProperty(PropertyName = "full_name")] + public string FullName { get; } + + [JsonProperty(PropertyName = "date_of_birth")] + public string DateOfBirth { get; } + + [JsonProperty(PropertyName = "name_prefix")] + public string NamePrefix { get; } + + [JsonProperty(PropertyName = "structured_postal_address")] + public StructuredPostalAddress StructuredPostalAddress { get; } + } +} diff --git a/src/Yoti.Auth/DocScan/Session/Create/ApplicantProfileBuilder.cs b/src/Yoti.Auth/DocScan/Session/Create/ApplicantProfileBuilder.cs new file mode 100644 index 000000000..912b4d739 --- /dev/null +++ b/src/Yoti.Auth/DocScan/Session/Create/ApplicantProfileBuilder.cs @@ -0,0 +1,70 @@ +namespace Yoti.Auth.DocScan.Session.Create +{ + /// + /// Builder for . + /// + public class ApplicantProfileBuilder + { + private string _fullName; + private string _dateOfBirth; + private string _namePrefix; + private StructuredPostalAddress _structuredPostalAddress; + + /// + /// Sets the full name of the applicant + /// + /// The full name + /// the builder + public ApplicantProfileBuilder WithFullName(string fullName) + { + _fullName = fullName; + return this; + } + + /// + /// Sets the date of birth of the applicant + /// + /// The date of birth (e.g. "1988-11-02") + /// the builder + public ApplicantProfileBuilder WithDateOfBirth(string dateOfBirth) + { + _dateOfBirth = dateOfBirth; + return this; + } + + /// + /// Sets the name prefix of the applicant + /// + /// The name prefix (e.g. "Mr") + /// the builder + public ApplicantProfileBuilder WithNamePrefix(string namePrefix) + { + _namePrefix = namePrefix; + return this; + } + + /// + /// Sets the structured postal address of the applicant + /// + /// The + /// the builder + public ApplicantProfileBuilder WithStructuredPostalAddress(StructuredPostalAddress structuredPostalAddress) + { + _structuredPostalAddress = structuredPostalAddress; + return this; + } + + /// + /// Builds the based on the values supplied to the builder. + /// + /// The built + public ApplicantProfile Build() + { + return new ApplicantProfile( + _fullName, + _dateOfBirth, + _namePrefix, + _structuredPostalAddress); + } + } +} diff --git a/src/Yoti.Auth/DocScan/Session/Create/ResourceCreationContainer.cs b/src/Yoti.Auth/DocScan/Session/Create/ResourceCreationContainer.cs new file mode 100644 index 000000000..78426b649 --- /dev/null +++ b/src/Yoti.Auth/DocScan/Session/Create/ResourceCreationContainer.cs @@ -0,0 +1,21 @@ +using Newtonsoft.Json; + +namespace Yoti.Auth.DocScan.Session.Create +{ + /// + /// Container for resources to be created as part of a session. + /// + public class ResourceCreationContainer + { + internal ResourceCreationContainer(ApplicantProfile applicantProfile) + { + ApplicantProfile = applicantProfile; + } + + /// + /// The applicant profile to be used for verification against identity documents. + /// + [JsonProperty(PropertyName = "applicant_profile")] + public ApplicantProfile ApplicantProfile { get; } + } +} diff --git a/src/Yoti.Auth/DocScan/Session/Create/ResourceCreationContainerBuilder.cs b/src/Yoti.Auth/DocScan/Session/Create/ResourceCreationContainerBuilder.cs new file mode 100644 index 000000000..c3dc1356c --- /dev/null +++ b/src/Yoti.Auth/DocScan/Session/Create/ResourceCreationContainerBuilder.cs @@ -0,0 +1,30 @@ +namespace Yoti.Auth.DocScan.Session.Create +{ + /// + /// Builder for . + /// + public class ResourceCreationContainerBuilder + { + private ApplicantProfile _applicantProfile; + + /// + /// Sets the applicant profile to be used for verification against identity documents. + /// + /// The for the session + /// the builder + public ResourceCreationContainerBuilder WithApplicantProfile(ApplicantProfile applicantProfile) + { + _applicantProfile = applicantProfile; + return this; + } + + /// + /// Builds the based on the values supplied to the builder. + /// + /// The built + public ResourceCreationContainer Build() + { + return new ResourceCreationContainer(_applicantProfile); + } + } +} diff --git a/src/Yoti.Auth/DocScan/Session/Create/SessionSpecification.cs b/src/Yoti.Auth/DocScan/Session/Create/SessionSpecification.cs index e09a461a2..0d06c84b0 100644 --- a/src/Yoti.Auth/DocScan/Session/Create/SessionSpecification.cs +++ b/src/Yoti.Auth/DocScan/Session/Create/SessionSpecification.cs @@ -9,7 +9,7 @@ namespace Yoti.Auth.DocScan.Session.Create { public class SessionSpecification { - internal SessionSpecification(int? clientSessionTokenTtl, int? resourcesTtl, string userTrackingId, NotificationConfig notifications, List requestedChecks, List requestedTasks, SdkConfig sdkConfig, List requiredDocuments, bool? blockBiometricConsent, DateTimeOffset? sessionDeadline, object identityProfileRequirements, object subject, bool createIdentityProfilePreview) + internal SessionSpecification(int? clientSessionTokenTtl, int? resourcesTtl, string userTrackingId, NotificationConfig notifications, List requestedChecks, List requestedTasks, SdkConfig sdkConfig, List requiredDocuments, bool? blockBiometricConsent, DateTimeOffset? sessionDeadline, object identityProfileRequirements, object subject, bool createIdentityProfilePreview, object advancedIdentityProfileRequirements, ResourceCreationContainer resources) { ClientSessionTokenTtl = clientSessionTokenTtl; ResourcesTtl = resourcesTtl; @@ -24,6 +24,8 @@ internal SessionSpecification(int? clientSessionTokenTtl, int? resourcesTtl, str IdentityProfileRequirements = identityProfileRequirements; Subject = subject; CreateIdentityProfilePreview = createIdentityProfilePreview; + AdvancedIdentityProfileRequirements = advancedIdentityProfileRequirements; + Resources = resources; } [JsonProperty(PropertyName = "client_session_token_ttl")] @@ -64,5 +66,11 @@ internal SessionSpecification(int? clientSessionTokenTtl, int? resourcesTtl, str [JsonProperty(PropertyName = "subject")] public object Subject { get; } + + [JsonProperty(PropertyName = "advanced_identity_profile_requirements")] + public object AdvancedIdentityProfileRequirements { get; } + + [JsonProperty(PropertyName = "resources")] + public ResourceCreationContainer Resources { get; } } } diff --git a/src/Yoti.Auth/DocScan/Session/Create/SessionSpecificationBuilder.cs b/src/Yoti.Auth/DocScan/Session/Create/SessionSpecificationBuilder.cs index ba413ec26..9138f0eaf 100644 --- a/src/Yoti.Auth/DocScan/Session/Create/SessionSpecificationBuilder.cs +++ b/src/Yoti.Auth/DocScan/Session/Create/SessionSpecificationBuilder.cs @@ -21,6 +21,8 @@ public class SessionSpecificationBuilder private object _identityProfileRequirements; private object _subject; private bool _createIdentityProfilePreview; + private object _advancedIdentityProfileRequirements; + private ResourceCreationContainer _resources; /// /// Sets the client session token TTL (time-to-live) @@ -151,6 +153,7 @@ public SessionSpecificationBuilder WithIdentityProfileRequirements(object identi _identityProfileRequirements = identityProfileRequirements; return this; } + /// /// Sets the Subject object for the session @@ -174,6 +177,28 @@ public SessionSpecificationBuilder WithCreateIdentityProfilePreview(bool createI return this; } + /// + /// Sets the Advanced Identity Profile Requirements for the session + /// + /// The Advanced Identity Profile Requirements for the session + /// the builder + public SessionSpecificationBuilder WithAdvancedIdentityProfileRequirements(object advancedIdentityProfileRequirements) + { + _advancedIdentityProfileRequirements = advancedIdentityProfileRequirements; + return this; + } + + /// + /// Sets the for the session + /// + /// The for the session + /// the builder + public SessionSpecificationBuilder WithResources(ResourceCreationContainer resources) + { + _resources = resources; + return this; + } + /// /// Builds the based on the values supplied to the builder /// @@ -193,7 +218,9 @@ public SessionSpecification Build() _sessionDeadline, _identityProfileRequirements, _subject, - _createIdentityProfilePreview + _createIdentityProfilePreview, + _advancedIdentityProfileRequirements, + _resources ); } } diff --git a/src/Yoti.Auth/DocScan/Session/Create/StructuredPostalAddress.cs b/src/Yoti.Auth/DocScan/Session/Create/StructuredPostalAddress.cs new file mode 100644 index 000000000..1b6b98be3 --- /dev/null +++ b/src/Yoti.Auth/DocScan/Session/Create/StructuredPostalAddress.cs @@ -0,0 +1,54 @@ +using Newtonsoft.Json; + +namespace Yoti.Auth.DocScan.Session.Create +{ + /// + /// Represents a structured postal address for an applicant profile. + /// + public class StructuredPostalAddress + { + internal StructuredPostalAddress( + int? addressFormat, + string buildingNumber, + string addressLine1, + string townCity, + string postalCode, + string countryIso, + string country, + string formattedAddress) + { + AddressFormat = addressFormat; + BuildingNumber = buildingNumber; + AddressLine1 = addressLine1; + TownCity = townCity; + PostalCode = postalCode; + CountryIso = countryIso; + Country = country; + FormattedAddress = formattedAddress; + } + + [JsonProperty(PropertyName = "address_format")] + public int? AddressFormat { get; } + + [JsonProperty(PropertyName = "building_number")] + public string BuildingNumber { get; } + + [JsonProperty(PropertyName = "address_line1")] + public string AddressLine1 { get; } + + [JsonProperty(PropertyName = "town_city")] + public string TownCity { get; } + + [JsonProperty(PropertyName = "postal_code")] + public string PostalCode { get; } + + [JsonProperty(PropertyName = "country_iso")] + public string CountryIso { get; } + + [JsonProperty(PropertyName = "country")] + public string Country { get; } + + [JsonProperty(PropertyName = "formatted_address")] + public string FormattedAddress { get; } + } +} diff --git a/src/Yoti.Auth/DocScan/Session/Create/StructuredPostalAddressBuilder.cs b/src/Yoti.Auth/DocScan/Session/Create/StructuredPostalAddressBuilder.cs new file mode 100644 index 000000000..c87480129 --- /dev/null +++ b/src/Yoti.Auth/DocScan/Session/Create/StructuredPostalAddressBuilder.cs @@ -0,0 +1,122 @@ +namespace Yoti.Auth.DocScan.Session.Create +{ + /// + /// Builder for . + /// + public class StructuredPostalAddressBuilder + { + private int? _addressFormat; + private string _buildingNumber; + private string _addressLine1; + private string _townCity; + private string _postalCode; + private string _countryIso; + private string _country; + private string _formattedAddress; + + /// + /// Sets the address format + /// + /// The address format + /// the builder + public StructuredPostalAddressBuilder WithAddressFormat(int addressFormat) + { + _addressFormat = addressFormat; + return this; + } + + /// + /// Sets the building number + /// + /// The building number + /// the builder + public StructuredPostalAddressBuilder WithBuildingNumber(string buildingNumber) + { + _buildingNumber = buildingNumber; + return this; + } + + /// + /// Sets the address line 1 + /// + /// The first address line + /// the builder + public StructuredPostalAddressBuilder WithAddressLine1(string addressLine1) + { + _addressLine1 = addressLine1; + return this; + } + + /// + /// Sets the town or city + /// + /// The town or city + /// the builder + public StructuredPostalAddressBuilder WithTownCity(string townCity) + { + _townCity = townCity; + return this; + } + + /// + /// Sets the postal code + /// + /// The postal code + /// the builder + public StructuredPostalAddressBuilder WithPostalCode(string postalCode) + { + _postalCode = postalCode; + return this; + } + + /// + /// Sets the country ISO code + /// + /// The country ISO code (e.g. "GBR") + /// the builder + public StructuredPostalAddressBuilder WithCountryIso(string countryIso) + { + _countryIso = countryIso; + return this; + } + + /// + /// Sets the country name + /// + /// The country name + /// the builder + public StructuredPostalAddressBuilder WithCountry(string country) + { + _country = country; + return this; + } + + /// + /// Sets the formatted address + /// + /// The formatted address + /// the builder + public StructuredPostalAddressBuilder WithFormattedAddress(string formattedAddress) + { + _formattedAddress = formattedAddress; + return this; + } + + /// + /// Builds the based on the values supplied to the builder. + /// + /// The built + public StructuredPostalAddress Build() + { + return new StructuredPostalAddress( + _addressFormat, + _buildingNumber, + _addressLine1, + _townCity, + _postalCode, + _countryIso, + _country, + _formattedAddress); + } + } +} diff --git a/src/Yoti.Auth/DocScan/Session/Retrieve/AdvancedIdentityProfile/AdvancedIdentityProfilePreviewResponse.cs b/src/Yoti.Auth/DocScan/Session/Retrieve/AdvancedIdentityProfile/AdvancedIdentityProfilePreviewResponse.cs new file mode 100644 index 000000000..981bcac08 --- /dev/null +++ b/src/Yoti.Auth/DocScan/Session/Retrieve/AdvancedIdentityProfile/AdvancedIdentityProfilePreviewResponse.cs @@ -0,0 +1,12 @@ +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System.Collections.Generic; + +namespace Yoti.Auth.DocScan.Session.Retrieve.AdvancedIdentityProfilePreview +{ + public class AdvancedIdentityProfilePreviewResponse + { + [JsonProperty(PropertyName = "media")] + public MediaResponse Media { get; private set; } + } +} diff --git a/src/Yoti.Auth/DocScan/Session/Retrieve/AdvancedIdentityProfile/AdvancedIdentityProfileResponse.cs b/src/Yoti.Auth/DocScan/Session/Retrieve/AdvancedIdentityProfile/AdvancedIdentityProfileResponse.cs new file mode 100644 index 000000000..a2b843f5a --- /dev/null +++ b/src/Yoti.Auth/DocScan/Session/Retrieve/AdvancedIdentityProfile/AdvancedIdentityProfileResponse.cs @@ -0,0 +1,19 @@ +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System.Collections.Generic; + +namespace Yoti.Auth.DocScan.Session.Retrieve.AdvancedIdentityProfile +{ + public class AdvancedIdentityProfileResponse + { + [JsonProperty(PropertyName = "subject_id")] + public string SubjectId { get; private set; } + [JsonProperty(PropertyName = "result")] + public string Result { get; private set; } + [JsonProperty(PropertyName = "failure_reason")] + public FailureReasonResponse FailureReason { get; private set; } + [JsonProperty(PropertyName = "identity_profile_report")] + public Dictionary Report { get; private set; } + + } +} diff --git a/src/Yoti.Auth/DocScan/Session/Retrieve/AdvancedIdentityProfile/FailureReasonResponse.cs b/src/Yoti.Auth/DocScan/Session/Retrieve/AdvancedIdentityProfile/FailureReasonResponse.cs new file mode 100644 index 000000000..b55c83d8c --- /dev/null +++ b/src/Yoti.Auth/DocScan/Session/Retrieve/AdvancedIdentityProfile/FailureReasonResponse.cs @@ -0,0 +1,10 @@ +using Newtonsoft.Json; + +namespace Yoti.Auth.DocScan.Session.Retrieve.AdvancedIdentityProfile +{ + public class FailureReasonResponse + { + [JsonProperty(PropertyName = "reason_code")] + public string ReasonCode { get; private set; } + } +} diff --git a/src/Yoti.Auth/DocScan/Session/Retrieve/GetSessionResult.cs b/src/Yoti.Auth/DocScan/Session/Retrieve/GetSessionResult.cs index b34905a7f..89e67609e 100644 --- a/src/Yoti.Auth/DocScan/Session/Retrieve/GetSessionResult.cs +++ b/src/Yoti.Auth/DocScan/Session/Retrieve/GetSessionResult.cs @@ -56,6 +56,12 @@ public class GetSessionResult [JsonProperty(PropertyName = "identity_profile_preview")] public IdentityProfilePreviewResponse IdentityProfilePreviewResponse { get; internal set; } + [JsonProperty(PropertyName = "advanced_identity_profile")] + public IdentityProfileResponse AdvancedIdentityProfile { get; internal set; } + + [JsonProperty(PropertyName = "advanced_identity_profile_preview")] + public IdentityProfilePreviewResponse AdvancedIdentityProfilePreviewResponse { get; internal set; } + public List GetAuthenticityChecks() { if (Checks == null) diff --git a/src/Yoti.Auth/DocScan/Session/Retrieve/IdentityProfile/FailureReasonResponse.cs b/src/Yoti.Auth/DocScan/Session/Retrieve/IdentityProfile/FailureReasonResponse.cs index 3ee204fe0..682b69db2 100644 --- a/src/Yoti.Auth/DocScan/Session/Retrieve/IdentityProfile/FailureReasonResponse.cs +++ b/src/Yoti.Auth/DocScan/Session/Retrieve/IdentityProfile/FailureReasonResponse.cs @@ -5,6 +5,9 @@ namespace Yoti.Auth.DocScan.Session.Retrieve.IdentityProfile public class FailureReasonResponse { [JsonProperty(PropertyName = "reason_code")] - public string ReasonCode { get; private set; } + public string ReasonCode { get; private set; } + + [JsonProperty(PropertyName = "requirements_not_met_details")] + public RequirementNotMetDetails RequirementNotMetDetails { get; private set; } } } diff --git a/src/Yoti.Auth/DocScan/Session/Retrieve/IdentityProfile/RequirementNotMetDetails.cs b/src/Yoti.Auth/DocScan/Session/Retrieve/IdentityProfile/RequirementNotMetDetails.cs new file mode 100644 index 000000000..1ceee6347 --- /dev/null +++ b/src/Yoti.Auth/DocScan/Session/Retrieve/IdentityProfile/RequirementNotMetDetails.cs @@ -0,0 +1,17 @@ +using Newtonsoft.Json; + +namespace Yoti.Auth.DocScan.Session.Retrieve.IdentityProfile; + +public class RequirementNotMetDetails +{ + [JsonProperty(PropertyName = "failure_type")] + public string FailureType { get; private set; } + [JsonProperty(PropertyName = "document_type")] + public string DocumentType { get; private set; } + [JsonProperty(PropertyName = "document_country_iso_code")] + public string DocumentCountryIsoCode { get; private set; } + [JsonProperty(PropertyName = "audit_id")] + public string AuditId { get; private set; } + [JsonProperty(PropertyName = "details")] + public string Details { get; private set; } +} diff --git a/src/Yoti.Auth/DocScan/Session/Retrieve/Resource/ApplicantProfileResourceResponse.cs b/src/Yoti.Auth/DocScan/Session/Retrieve/Resource/ApplicantProfileResourceResponse.cs new file mode 100644 index 000000000..d820ce119 --- /dev/null +++ b/src/Yoti.Auth/DocScan/Session/Retrieve/Resource/ApplicantProfileResourceResponse.cs @@ -0,0 +1,20 @@ +using System; +using Newtonsoft.Json; + +namespace Yoti.Auth.DocScan.Session.Retrieve.Resource +{ + /// + /// Applicant Profile Resource Response wrapping a + /// + public class ApplicantProfileResourceResponse : ResourceResponse + { + [JsonProperty(PropertyName = "media")] + public MediaResponse Media { get; private set; } + + [JsonProperty(PropertyName = "created_at")] + public DateTime? CreatedAt { get; private set; } + + [JsonProperty(PropertyName = "last_updated")] + public DateTime? LastUpdated { get; private set; } + } +} diff --git a/src/Yoti.Auth/DocScan/Session/Retrieve/Resource/ResourceContainer.cs b/src/Yoti.Auth/DocScan/Session/Retrieve/Resource/ResourceContainer.cs index 0e851edcf..eeef5cd9c 100644 --- a/src/Yoti.Auth/DocScan/Session/Retrieve/Resource/ResourceContainer.cs +++ b/src/Yoti.Auth/DocScan/Session/Retrieve/Resource/ResourceContainer.cs @@ -17,6 +17,12 @@ public class ResourceContainer [JsonProperty(PropertyName = "face_capture")] public List FaceCapture { get; internal set; } + [JsonProperty(PropertyName = "share_codes")] + public List ShareCodes { get; internal set; } + + [JsonProperty(PropertyName = "applicant_profiles")] + public List ApplicantProfiles { get; internal set; } + public List ZoomLivenessResources { get diff --git a/src/Yoti.Auth/DocScan/Session/Retrieve/Resource/ShareCodeResourceResponse.cs b/src/Yoti.Auth/DocScan/Session/Retrieve/Resource/ShareCodeResourceResponse.cs new file mode 100644 index 000000000..d0220011f --- /dev/null +++ b/src/Yoti.Auth/DocScan/Session/Retrieve/Resource/ShareCodeResourceResponse.cs @@ -0,0 +1,43 @@ +using System.Collections.Generic; +using System.Linq; +using Newtonsoft.Json; +using Yoti.Auth.DocScan.Session.Retrieve.Task; + +namespace Yoti.Auth.DocScan.Session.Retrieve.Resource +{ + /// + /// Represents a Share Code resource for a given session + /// + public class ShareCodeResourceResponse : ResourceResponse + { + [JsonProperty(PropertyName = "created_at")] + public string CreatedAt { get; internal set; } + + [JsonProperty(PropertyName = "last_updated")] + public string LastUpdated { get; internal set; } + + [JsonProperty(PropertyName = "lookup_profile")] + public ShareCodeMediaResponse LookupProfile { get; internal set; } + + [JsonProperty(PropertyName = "returned_profile")] + public ShareCodeMediaResponse ReturnedProfile { get; internal set; } + + [JsonProperty(PropertyName = "id_photo")] + public ShareCodeMediaResponse IdPhoto { get; internal set; } + + [JsonProperty(PropertyName = "file")] + public ShareCodeMediaResponse File { get; internal set; } + + /// + /// Filters the tasks for the verify share code tasks associated with this resource + /// + /// Returns a list of verify share code tasks + public List GetVerifyShareCodeTasks() + { + if (Tasks == null) + return new List(); + + return Tasks.OfType().ToList(); + } + } +} diff --git a/src/Yoti.Auth/DocScan/Session/Retrieve/ShareCodeMediaResponse.cs b/src/Yoti.Auth/DocScan/Session/Retrieve/ShareCodeMediaResponse.cs new file mode 100644 index 000000000..37a5c5bc7 --- /dev/null +++ b/src/Yoti.Auth/DocScan/Session/Retrieve/ShareCodeMediaResponse.cs @@ -0,0 +1,13 @@ +using Newtonsoft.Json; + +namespace Yoti.Auth.DocScan.Session.Retrieve +{ + /// + /// Represents a media wrapper used within share code resources + /// + public class ShareCodeMediaResponse + { + [JsonProperty(PropertyName = "media")] + public MediaResponse Media { get; internal set; } + } +} diff --git a/src/Yoti.Auth/DocScan/Session/Retrieve/Task/TaskResponse.cs b/src/Yoti.Auth/DocScan/Session/Retrieve/Task/TaskResponse.cs index 07e07e685..8de12f372 100644 --- a/src/Yoti.Auth/DocScan/Session/Retrieve/Task/TaskResponse.cs +++ b/src/Yoti.Auth/DocScan/Session/Retrieve/Task/TaskResponse.cs @@ -11,6 +11,7 @@ namespace Yoti.Auth.DocScan.Session.Retrieve.Task [JsonConverter(typeof(JsonSubtypes), "type")] [JsonSubtypes.KnownSubType(typeof(TextExtractionTaskResponse), Constants.DocScanConstants.IdDocumentTextDataExtraction)] [JsonSubtypes.KnownSubType(typeof(SupplementaryDocTextExtractionTaskResponse), Constants.DocScanConstants.SupplementaryDocumentTextDataExtraction)] + [JsonSubtypes.KnownSubType(typeof(VerifyShareCodeTaskResponse), Constants.DocScanConstants.VerifyShareCodeTask)] public class TaskResponse { [JsonProperty(PropertyName = "id")] diff --git a/src/Yoti.Auth/DocScan/Session/Retrieve/Task/VerifyShareCodeTaskResponse.cs b/src/Yoti.Auth/DocScan/Session/Retrieve/Task/VerifyShareCodeTaskResponse.cs new file mode 100644 index 000000000..bf5d092e1 --- /dev/null +++ b/src/Yoti.Auth/DocScan/Session/Retrieve/Task/VerifyShareCodeTaskResponse.cs @@ -0,0 +1,9 @@ +namespace Yoti.Auth.DocScan.Session.Retrieve.Task +{ + /// + /// Represents a Verify Share Code task response + /// + public class VerifyShareCodeTaskResponse : TaskResponse + { + } +} diff --git a/src/Yoti.Auth/Exceptions/DigitalIdentityException.cs b/src/Yoti.Auth/Exceptions/DigitalIdentityException.cs new file mode 100644 index 000000000..cfbe594f6 --- /dev/null +++ b/src/Yoti.Auth/Exceptions/DigitalIdentityException.cs @@ -0,0 +1,22 @@ +using System; + +namespace Yoti.Auth.Exceptions +{ + public class DigitalIdentityException : YotiException + { + public DigitalIdentityException() + : base() + { + } + + public DigitalIdentityException(string message) + : base(message) + { + } + + public DigitalIdentityException(string message, Exception innerException) + : base(message, innerException) + { + } + } +} \ No newline at end of file diff --git a/src/Yoti.Auth/ShareUrl/Policy/DynamicPolicy.cs b/src/Yoti.Auth/ShareUrl/Policy/DynamicPolicy.cs index 488cb28dd..787ff990b 100644 --- a/src/Yoti.Auth/ShareUrl/Policy/DynamicPolicy.cs +++ b/src/Yoti.Auth/ShareUrl/Policy/DynamicPolicy.cs @@ -29,12 +29,16 @@ public class DynamicPolicy [JsonProperty(PropertyName = "identity_profile_requirements")] private readonly object _identityProfileRequirements; + + [JsonProperty(PropertyName = "advanced_identity_profile_requirements")] + private readonly object _advancedIdentityProfileRequirements; public DynamicPolicy( ICollection wantedAttributes, HashSet wantedAuthTypes, bool wantedRememberMeId, - object identityProfileRequirements = null + object identityProfileRequirements = null, + object advancedIdentityProfileRequirements = null ) { _wantedAttributes = wantedAttributes; @@ -42,6 +46,7 @@ public DynamicPolicy( _wantedRememberMeId = wantedRememberMeId; _isWantedRememberMeIdOptional = false; _identityProfileRequirements = identityProfileRequirements; + _advancedIdentityProfileRequirements = advancedIdentityProfileRequirements; } /// @@ -91,5 +96,17 @@ public object IdentityProfileRequirements return _identityProfileRequirements; } } + + /// + /// AdvancedIdentityProfileRequirements requested in the policy + /// + [JsonIgnore] + public object AdvancedIdentityProfileRequirements + { + get + { + return _advancedIdentityProfileRequirements; + } + } } } \ No newline at end of file diff --git a/src/Yoti.Auth/ShareUrl/Policy/DynamicPolicyBuilder.cs b/src/Yoti.Auth/ShareUrl/Policy/DynamicPolicyBuilder.cs index 8d4ba4e45..ee4767833 100644 --- a/src/Yoti.Auth/ShareUrl/Policy/DynamicPolicyBuilder.cs +++ b/src/Yoti.Auth/ShareUrl/Policy/DynamicPolicyBuilder.cs @@ -9,6 +9,7 @@ public class DynamicPolicyBuilder private readonly HashSet _wantedAuthTypes = new HashSet(); private bool _wantedRememberMeId; private object _identityProfileRequirements; + private object _advancedIdentityProfileRequirements; public DynamicPolicyBuilder WithWantedAttribute(WantedAttribute wantedAttribute) { @@ -29,6 +30,7 @@ public DynamicPolicyBuilder WithWantedAttribute(string name, List co { WantedAttribute wantedAttribute = new WantedAttributeBuilder() .WithName(name) + .WithOptional(false) .WithConstraints(constraints) .Build(); return WithWantedAttribute(wantedAttribute); @@ -157,10 +159,21 @@ public DynamicPolicyBuilder WithIdentityProfileRequirements(object identityProfi _identityProfileRequirements = identityProfileRequirements; return this; } + + /// + /// Use an AdvancedIdentity Profile Requirement object for the share + /// + /// object describing the advanced identity profile requirements to use + /// with the identity profile requirements + public DynamicPolicyBuilder WithAdvancedIdentityProfileRequirements(object advancedIdentityProfileRequirements) + { + _advancedIdentityProfileRequirements = advancedIdentityProfileRequirements; + return this; + } public DynamicPolicy Build() { - return new DynamicPolicy(_wantedAttributes.Values, _wantedAuthTypes, _wantedRememberMeId, _identityProfileRequirements); + return new DynamicPolicy(_wantedAttributes.Values, _wantedAuthTypes, _wantedRememberMeId, _identityProfileRequirements, _advancedIdentityProfileRequirements); } } -} \ No newline at end of file +} diff --git a/src/Yoti.Auth/ShareUrl/Policy/WantedAttribute.cs b/src/Yoti.Auth/ShareUrl/Policy/WantedAttribute.cs index 99e7b6637..fdacbcf50 100644 --- a/src/Yoti.Auth/ShareUrl/Policy/WantedAttribute.cs +++ b/src/Yoti.Auth/ShareUrl/Policy/WantedAttribute.cs @@ -14,7 +14,7 @@ public class WantedAttribute [JsonRequired] [JsonProperty(PropertyName = "optional")] - public bool Optional { get; private set; } + public bool? Optional { get; private set; } [JsonProperty(PropertyName = "accept_self_asserted")] public bool? AcceptSelfAsserted { get; private set; } @@ -22,13 +22,13 @@ public class WantedAttribute [JsonProperty(PropertyName = "constraints")] public List Constraints { get; private set; } - public WantedAttribute(string name, string derivation, List constraints, bool? acceptSelfAsserted = null) + public WantedAttribute(string name, string derivation, List constraints, bool? acceptSelfAsserted = null, bool? optional = false) { Name = name; Derivation = derivation; - Optional = false; + Optional = optional; AcceptSelfAsserted = acceptSelfAsserted; Constraints = constraints; } } -} \ No newline at end of file +} diff --git a/src/Yoti.Auth/ShareUrl/Policy/WantedAttributeBuilder.cs b/src/Yoti.Auth/ShareUrl/Policy/WantedAttributeBuilder.cs index 4bf1b2737..f4f35cb46 100644 --- a/src/Yoti.Auth/ShareUrl/Policy/WantedAttributeBuilder.cs +++ b/src/Yoti.Auth/ShareUrl/Policy/WantedAttributeBuilder.cs @@ -8,6 +8,7 @@ public class WantedAttributeBuilder private string _derivation; private List _constraints = new List(); private bool? _acceptSelfAsserted; + private bool? _optional; public WantedAttributeBuilder WithName(string name) { @@ -15,6 +16,12 @@ public WantedAttributeBuilder WithName(string name) return this; } + public WantedAttributeBuilder WithOptional(bool optional) + { + _optional = optional; + return this; + } + public WantedAttributeBuilder WithDerivation(string derivation) { _derivation = derivation; @@ -56,7 +63,7 @@ public WantedAttribute Build() { Validation.NotNullOrEmpty(_name, nameof(_name)); - return new WantedAttribute(_name, _derivation, _constraints, _acceptSelfAsserted); + return new WantedAttribute(_name, _derivation, _constraints, _acceptSelfAsserted, _optional); } } -} \ No newline at end of file +} diff --git a/src/Yoti.Auth/Yoti.Auth.csproj b/src/Yoti.Auth/Yoti.Auth.csproj index 167046de8..31378ca5d 100644 --- a/src/Yoti.Auth/Yoti.Auth.csproj +++ b/src/Yoti.Auth/Yoti.Auth.csproj @@ -1,7 +1,7 @@  - netstandard1.6;netstandard2.1;netcoreapp1.1;netcoreapp2.2;netcoreapp3.1;net452;net462;net472;net48; + netstandard1.6;netstandard2.1;netcoreapp3.1;net6.0;net452;net462;net472;net48; Yoti.Auth Yoti $(PackageTargetFallback);dnxcore50 @@ -19,7 +19,7 @@ False latest true - 3.12.0 + 3.19.0 @@ -37,17 +37,18 @@ - + - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + + @@ -58,6 +59,9 @@ + + + @@ -68,4 +72,32 @@ Resources.Designer.cs + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/.DS_Store b/test/.DS_Store deleted file mode 100644 index b493ede37..000000000 Binary files a/test/.DS_Store and /dev/null differ diff --git a/test/Yoti.Auth.Tests.Common/Yoti.Auth.Tests.Common.csproj b/test/Yoti.Auth.Tests.Common/Yoti.Auth.Tests.Common.csproj index 292d43db8..26c13804b 100644 --- a/test/Yoti.Auth.Tests.Common/Yoti.Auth.Tests.Common.csproj +++ b/test/Yoti.Auth.Tests.Common/Yoti.Auth.Tests.Common.csproj @@ -1,7 +1,7 @@  - netcoreapp2.1 + net8.0 diff --git a/test/Yoti.Auth.Tests/.DS_Store b/test/Yoti.Auth.Tests/.DS_Store deleted file mode 100644 index 077415fc1..000000000 Binary files a/test/Yoti.Auth.Tests/.DS_Store and /dev/null differ diff --git a/test/Yoti.Auth.Tests/CryptoEngineTests.cs b/test/Yoti.Auth.Tests/CryptoEngineTests.cs index 2f2cf09b2..134cdc957 100644 --- a/test/Yoti.Auth.Tests/CryptoEngineTests.cs +++ b/test/Yoti.Auth.Tests/CryptoEngineTests.cs @@ -1,5 +1,6 @@ using System; using Microsoft.VisualStudio.TestTools.UnitTesting; +using Org.BouncyCastle.Crypto; using Yoti.Auth.Tests.Common; namespace Yoti.Auth.Tests @@ -28,5 +29,65 @@ public void EmptyOneTimeUseTokenThrowsError() Assert.IsTrue(exception.Message.Contains("one time use token")); } + + [TestMethod] + public void DecryptAesGcm_EmptySecretsThrowsError() + { + byte[] iv = new byte[12]; + byte[] secret = new byte[16]; + byte[] cipherText = new byte[32]; + + var exception = Assert.ThrowsException(() => + { + CryptoEngine.DecryptAesGcm(cipherText, iv, secret); + }); + + Assert.IsTrue(exception.Message.Contains("Failed to decrypt receipt key")); + } + + [TestMethod] + public void UnwrapReceiptKey_EmptySecretsThrowsError() + { + byte[] wrappedReceiptKey = new byte[32]; + byte[] encryptedItemKey = new byte[32]; + byte[] itemKeyIv = new byte[12]; + AsymmetricCipherKeyPair key = null; + + var exception = Assert.ThrowsException(() => + { + byte[] unwrappedKey = CryptoEngine.UnwrapReceiptKey(wrappedReceiptKey, encryptedItemKey, itemKeyIv, key); + }); + + Assert.IsTrue(exception.Message.Contains("Failed to unwrap receipt key")); + } + + [TestMethod] + public void DecryptContent_EmptySecretsThrowsError() + { + byte[] content = new byte[] { 0x01, 0x02, 0x03 }; // Example content + byte[] receiptContentKey = new byte[16]; // Example receipt content key + + var exception = Assert.ThrowsException(() => + { + byte[] decryptedContent = CryptoEngine.DecryptReceiptContent(content, receiptContentKey); + + }); + + Assert.IsTrue(exception.Message.Contains("Failed to decrypt receipt content")); + } + + [TestMethod] + public void DecryptReceiptContent_NullContentThrowsError() + { + byte[] content = null; // Example content + byte[] receiptContentKey = new byte[] { 0x01, 0x02, 0x03 }; // Example receipt content key + + var exception = Assert.ThrowsException(() => + { + byte[] unwrappedKey = CryptoEngine.DecryptReceiptContent(content, receiptContentKey); + }); + + Assert.IsTrue(exception.Message.Contains("Failed to decrypt receipt content: Failed to decrypt receipt content: content is null ")); + } } -} \ No newline at end of file +} diff --git a/test/Yoti.Auth.Tests/DigitalIdentity/DigitalIdentityServiceTests.cs b/test/Yoti.Auth.Tests/DigitalIdentity/DigitalIdentityServiceTests.cs new file mode 100644 index 000000000..0e43838f4 --- /dev/null +++ b/test/Yoti.Auth.Tests/DigitalIdentity/DigitalIdentityServiceTests.cs @@ -0,0 +1,208 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Http; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Org.BouncyCastle.Crypto; +using Yoti.Auth.DigitalIdentity; +using Yoti.Auth.Tests.Common; +using static System.Net.Mime.MediaTypeNames; + +namespace Yoti.Auth.Tests.DigitalIdentity +{ + [TestClass] + public class DigitalIdentityServiceTests + { + private const string _sdkID = "sdkID"; + private readonly Uri _apiURL = new Uri("https://apiurl.com"); + private readonly Dictionary _someHeaders = new Dictionary(); + private readonly HttpClient _httpClient = new HttpClient(); + private readonly AsymmetricCipherKeyPair _keyPair = KeyPair.Get(); + private ShareSessionRequest _someShareSessionRequest; + private const string _sessionID = "someSessionID"; + private QrRequest _someCreateQrRequest; + + [TestInitialize] + public void Startup() + { + _someHeaders.Add("Key", "Value"); + _someCreateQrRequest = TestTools.CreateQr.CreateQrStandard(); + _someShareSessionRequest = TestTools.ShareSession.CreateStandardShareSessionRequest(); + } + + [TestMethod] + public void ShouldFailWithNullHttpClient() + { + var aggregateException = Assert.ThrowsException(() => + { + DigitalIdentityService.CreateShareSession(null, _apiURL, _sdkID, _keyPair, _someShareSessionRequest).Wait(); + }); + + Assert.IsTrue(TestTools.Exceptions.IsExceptionInAggregateException(aggregateException)); + Assert.IsTrue(aggregateException.InnerException.Message.Contains("httpClient")); + } + + [TestMethod] + public void ShouldFailWithNullApiUrl() + { + var aggregateException = Assert.ThrowsException(() => + { + DigitalIdentityService.CreateShareSession(_httpClient, null, _sdkID, _keyPair, _someShareSessionRequest).Wait(); + }); + + Assert.IsTrue(TestTools.Exceptions.IsExceptionInAggregateException(aggregateException)); + Assert.IsTrue(aggregateException.InnerException.Message.Contains("apiUrl")); + } + + [TestMethod] + public void ShouldFailWithNullSdkId() + { + var aggregateException = Assert.ThrowsException(() => + { + DigitalIdentityService.CreateShareSession(_httpClient, _apiURL, null, _keyPair, _someShareSessionRequest).Wait(); + }); + + Assert.IsTrue(TestTools.Exceptions.IsExceptionInAggregateException(aggregateException)); + Assert.IsTrue(aggregateException.InnerException.Message.Contains("sdkId")); + } + + [TestMethod] + public void ShouldFailWithNullKeyPair() + { + var aggregateException = Assert.ThrowsException(() => + { + DigitalIdentityService.CreateShareSession(_httpClient, _apiURL, _sdkID, null, _someShareSessionRequest).Wait(); + }); + + Assert.IsTrue(TestTools.Exceptions.IsExceptionInAggregateException(aggregateException)); + Assert.IsTrue(aggregateException.InnerException.Message.Contains("keyPair")); + } + + [TestMethod] + public void ShouldFailWithNullDynamicScenario() + { + var aggregateException = Assert.ThrowsException(() => + { + DigitalIdentityService.CreateShareSession(_httpClient, _apiURL, _sdkID, _keyPair, null).Wait(); + }); + + Assert.IsTrue(TestTools.Exceptions.IsExceptionInAggregateException(aggregateException)); + Assert.IsTrue(aggregateException.InnerException.Message.Contains("shareSessionRequest")); + } + + [TestMethod] + public void RetrieveSessionShouldThrowExceptionForMissingSdkId() + { + var exception = Assert.ThrowsExceptionAsync(async () => + { + await DigitalIdentityService.GetSession(_httpClient, _apiURL, null, _keyPair, _sessionID); + }); + + Assert.IsTrue(exception.Exception.InnerException.Message.Contains("sdkId")); + } + + [TestMethod] + public void RetrieveSessionShouldThrowExceptionForMissingKeyPair() + { + var exception = Assert.ThrowsExceptionAsync(async () => + { + await DigitalIdentityService.GetSession(_httpClient, _apiURL, _sdkID, null, _sessionID); + }).Result; + + Assert.IsTrue(exception.Message.Contains("keyPair")); + } + + [TestMethod] + public void RetrieveSessionShouldThrowExceptionForMissingSessionId() + { + var exception = Assert.ThrowsExceptionAsync(async () => + { + await DigitalIdentityService.GetSession(_httpClient, _apiURL, _sdkID, _keyPair, null); + }).Result; + + Assert.IsTrue(exception.Message.Contains("sessionId")); + } + + [TestMethod] + public void CreateQrCodeShouldFailWithNullHttpClient() + { + var aggregateException = Assert.ThrowsException(() => + { + DigitalIdentityService.CreateQrCode(null, _apiURL, _sdkID, _keyPair, _sessionID, _someCreateQrRequest).Wait(); + }); + + Assert.IsTrue(TestTools.Exceptions.IsExceptionInAggregateException(aggregateException)); + Assert.IsTrue(aggregateException.InnerException.Message.Contains("httpClient")); + } + + [TestMethod] + public void CreateQrCodeShouldFailWithNullApiUrl() + { + var aggregateException = Assert.ThrowsException(() => + { + DigitalIdentityService.CreateQrCode(_httpClient, null, _sdkID, _keyPair, _sessionID, _someCreateQrRequest).Wait(); + }); + + Assert.IsTrue(TestTools.Exceptions.IsExceptionInAggregateException(aggregateException)); + Assert.IsTrue(aggregateException.InnerException.Message.Contains("apiUrl")); + } + + [TestMethod] + public void CreateQrCodeShouldFailWithNullSdkId() + { + var aggregateException = Assert.ThrowsException(() => + { + DigitalIdentityService.CreateQrCode(_httpClient, _apiURL, null, _keyPair, _sessionID, _someCreateQrRequest).Wait(); + }); + + Assert.IsTrue(TestTools.Exceptions.IsExceptionInAggregateException(aggregateException)); + Assert.IsTrue(aggregateException.InnerException.Message.Contains("sdkId")); + } + + [TestMethod] + public void CreateQrCodeShouldFailWithNullKeyPair() + { + var aggregateException = Assert.ThrowsException(() => + { + DigitalIdentityService.CreateQrCode(_httpClient, _apiURL, _sdkID, null, _sessionID, _someCreateQrRequest).Wait(); + }); + + Assert.IsTrue(TestTools.Exceptions.IsExceptionInAggregateException(aggregateException)); + Assert.IsTrue(aggregateException.InnerException.Message.Contains("keyPair")); + } + + [TestMethod] + public void RetrieveQrShouldThrowExceptionForMissingSdkId() + { + var exception = Assert.ThrowsExceptionAsync(async () => + { + await DigitalIdentityService.GetQrCode(_httpClient, _apiURL, null, _keyPair, _sessionID); + }); + + Assert.IsTrue(exception.Exception.InnerException.Message.Contains("sdkId")); + } + + [TestMethod] + public void RetrieveQrCodeShouldThrowExceptionForMissingKeyPair() + { + var exception = Assert.ThrowsExceptionAsync(async () => + { + await DigitalIdentityService.GetQrCode(_httpClient, _apiURL, _sdkID, null, _sessionID); + }).Result; + + Assert.IsTrue(exception.Message.Contains("keyPair")); + } + + [TestMethod] + public void RetrieveQrCodeShouldThrowExceptionForMissingSessionId() + { + var exception = Assert.ThrowsExceptionAsync(async () => + { + await DigitalIdentityService.GetQrCode(_httpClient, _apiURL, _sdkID, _keyPair, null); + }).Result; + + Assert.IsTrue(exception.Message.Contains("qrCodeId")); + } + + } +} \ No newline at end of file diff --git a/test/Yoti.Auth.Tests/DigitalIdentity/Extensions/ExtensionBuilderTests.cs b/test/Yoti.Auth.Tests/DigitalIdentity/Extensions/ExtensionBuilderTests.cs new file mode 100644 index 000000000..901fb5159 --- /dev/null +++ b/test/Yoti.Auth.Tests/DigitalIdentity/Extensions/ExtensionBuilderTests.cs @@ -0,0 +1,25 @@ +using System.Collections.Generic; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Yoti.Auth.DigitalIdentity.Extensions; + +namespace Yoti.Auth.Tests.DigitalIdentity.Extensions +{ + [TestClass] + public class ExtensionBuilderTests + { + private const string _someType = "Some Type"; + private static readonly Dictionary _someContent = new Dictionary(); + + [TestMethod] + public void ShouldBuildWithTypeAndContent() + { + var extension = new ExtensionBuilder>() + .WithType(_someType) + .WithContent(_someContent) + .Build(); + + Assert.AreEqual(_someType, extension.ExtensionType); + Assert.AreEqual(_someContent, extension.Content); + } + } +} \ No newline at end of file diff --git a/test/Yoti.Auth.Tests/DigitalIdentity/Extensions/LocationConstraintExtensionBuilderTests.cs b/test/Yoti.Auth.Tests/DigitalIdentity/Extensions/LocationConstraintExtensionBuilderTests.cs new file mode 100644 index 000000000..eec03f9d4 --- /dev/null +++ b/test/Yoti.Auth.Tests/DigitalIdentity/Extensions/LocationConstraintExtensionBuilderTests.cs @@ -0,0 +1,100 @@ +using System; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Yoti.Auth.ShareUrl.Extensions; +using Assert = Microsoft.VisualStudio.TestTools.UnitTesting.Assert; + +namespace Yoti.Auth.Tests.DigitalIdentity.Extensions +{ + [TestClass] + public class LocationConstraintExtensionBuilderTests + { + private const double _someLatitude = 1d; + private const double _someLongitude = 2d; + private const double _someRadius = 3d; + private const double _someUncertainty = 4d; + + [DataTestMethod] + [DataRow(-91)] + [DataRow(91)] + [TestMethod] + public void ShouldFailForLatitudesOutsideOfRange(double latitude) + { + Assert.ThrowsException(() => + { + new LocationConstraintExtensionBuilder() + .WithLatitude(latitude) + .Build(); + }); + } + + [DataTestMethod] + [DataRow(-181)] + [DataRow(181)] + [TestMethod] + public void ShouldFailForLongitudesOutsideOfRange(double longitude) + { + Assert.ThrowsException(() => + { + new LocationConstraintExtensionBuilder() + .WithLongitude(longitude) + .Build(); + }); + } + + [TestMethod] + public void ShouldFailForRadiusLessThanZero() + { + Assert.ThrowsException(() => + { + new LocationConstraintExtensionBuilder() + .WithRadius(-1) + .Build(); + }); + } + + [TestMethod] + public void ShouldFailForUncertaintyLessThanZero() + { + Assert.ThrowsException(() => + { + new LocationConstraintExtensionBuilder() + .WithMaxUncertainty(-1) + .Build(); + }); + } + + [TestMethod] + public void ShouldBuildLocationConstraintWithGivenValues() + { + Extension extension = new LocationConstraintExtensionBuilder() + .WithLatitude(_someLatitude) + .WithLongitude(_someLongitude) + .WithRadius(_someRadius) + .WithMaxUncertainty(_someUncertainty) + .Build(); + + Assert.AreEqual(Constants.Extension.LocationConstraint, extension.ExtensionType); + DeviceLocation deviceLocation = extension.Content.ExpectedDeviceLocation; + Assert.AreEqual(_someLatitude, deviceLocation.Latitude); + Assert.AreEqual(_someLongitude, deviceLocation.Longitude); + Assert.AreEqual(_someRadius, deviceLocation.Radius); + Assert.AreEqual(_someUncertainty, deviceLocation.MaxUncertainty); + } + + [TestMethod] + public void ShouldBuildLocationConstraintWithDefaultValues() + { + Extension extension = new LocationConstraintExtensionBuilder() + .WithLatitude(_someLatitude) + .WithLongitude(_someLongitude) + .Build(); + + Assert.AreEqual(Constants.Extension.LocationConstraint, extension.ExtensionType); + DeviceLocation deviceLocation = extension.Content.ExpectedDeviceLocation; + Assert.AreEqual(_someLatitude, deviceLocation.Latitude); + Assert.AreEqual(_someLongitude, deviceLocation.Longitude); + Assert.AreEqual(150d, deviceLocation.Radius); + Assert.AreEqual(150d, deviceLocation.MaxUncertainty); + } + } +} \ No newline at end of file diff --git a/test/Yoti.Auth.Tests/DigitalIdentity/Extensions/ThirdPartyAttributeExtensionBuilderTests.cs b/test/Yoti.Auth.Tests/DigitalIdentity/Extensions/ThirdPartyAttributeExtensionBuilderTests.cs new file mode 100644 index 000000000..c610e9b18 --- /dev/null +++ b/test/Yoti.Auth.Tests/DigitalIdentity/Extensions/ThirdPartyAttributeExtensionBuilderTests.cs @@ -0,0 +1,132 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Yoti.Auth.Share.ThirdParty; +using Yoti.Auth.DigitalIdentity.Extensions; + +namespace Yoti.Auth.Tests.DigitalIdentity.Extensions +{ + [TestClass] + public class ThirdPartyAttributeExtensionBuilderTests + { + private readonly DateTime _someDate = DateTime.Today.AddDays(1); + private const string _someDefinition = "com.thirdparty.id"; + + [TestMethod] + public void ShouldFailForNullDefinition() + { + var exception = Assert.ThrowsException(() => + { + new ThirdPartyAttributeExtensionBuilder() + .WithDefinition(null) + .Build(); + }); + + Assert.IsTrue(exception.Message.Contains("definition")); + } + + [DataTestMethod] + [DataRow(null)] + [DataRow("")] + public void ShouldFailForInvalidDefinitions(string definition) + { + var exception = Assert.ThrowsException(() => + { + new ThirdPartyAttributeExtensionBuilder() + .WithDefinition(definition) + .Build(); + }); + + Assert.IsTrue(exception.Message.Contains("definition")); + } + + [TestMethod] + public void ShouldBuildThirdPartyAttributeExtensionWithGivenValues() + { + Extension extension = + new ThirdPartyAttributeExtensionBuilder() + .WithDefinition(_someDefinition) + .WithExpiryDate(_someDate) + .Build(); + + Assert.AreEqual(Constants.Extension.ThirdPartyAttribute, extension.ExtensionType); + + string expectedDate = _someDate.ToString(Constants.Format.RFC3339PatternMilli, CultureInfo.InvariantCulture); + Assert.AreEqual(expectedDate, extension.Content.ExpiryDate); + + List definitions = extension.Content.Definitions; + Assert.AreEqual(1, definitions.Count); + Assert.AreEqual(_someDefinition, definitions[0].Name); + } + + [DataTestMethod] + [DataRow("2006-01-02T22:04:05Z", "2006-01-02T22:04:05.000Z")] + [DataRow("2006-01-02T22:04:05.1Z", "2006-01-02T22:04:05.100Z")] + [DataRow("2006-01-02T22:04:05.12Z", "2006-01-02T22:04:05.120Z")] + [DataRow("2006-01-02T22:04:05.123Z", "2006-01-02T22:04:05.123Z")] + [DataRow("2006-01-02T22:04:05.1234Z", "2006-01-02T22:04:05.123Z")] + [DataRow("2006-01-02T22:04:05.999999Z", "2006-01-02T22:04:05.999Z")] + [DataRow("2006-01-02T22:04:05.123456Z", "2006-01-02T22:04:05.123Z")] + [DataRow("2002-10-02T10:00:00.1-05:00", "2002-10-02T15:00:00.100Z")] + [DataRow("2002-10-02T10:00:00.12345+11:00", "2002-10-01T23:00:00.123Z")] + [TestMethod] + public void ShouldBuildThirdPartyAttributeExtensionWithExpiryDates(string expiryDateInputString, string expectedExpiryDate) + { + bool parseSuccess = DateTime.TryParse( + expiryDateInputString, + CultureInfo.InvariantCulture, + DateTimeStyles.AdjustToUniversal, + out DateTime expiryDate); + + Assert.IsTrue(parseSuccess); + + Extension extension = + new ThirdPartyAttributeExtensionBuilder() + .WithDefinition(_someDefinition) + .WithExpiryDate(expiryDate) + .Build(); + + Assert.AreEqual(expectedExpiryDate, extension.Content.ExpiryDate); + } + + [TestMethod] + public void ShouldBuildThirdPartyAttributeExtensionWithMultipleDefinitions() + { + var definitions = new List { "firstDefinition", "secondDefinition" }; + + Extension extension = + new ThirdPartyAttributeExtensionBuilder() + .WithDefinitions(definitions) + .WithExpiryDate(_someDate) + .Build(); + + Assert.AreEqual(Constants.Extension.ThirdPartyAttribute, extension.ExtensionType); + + List result = extension.Content.Definitions; + Assert.AreEqual(2, result.Count); + Assert.AreEqual("firstDefinition", result[0].Name); + Assert.AreEqual("secondDefinition", result[1].Name); + } + + [TestMethod] + public void ShouldOverwriteSingularlyAddedDefinition() + { + var definitions = new List { "firstDefinition", "secondDefinition" }; + + Extension extension = + new ThirdPartyAttributeExtensionBuilder() + .WithExpiryDate(_someDate) + .WithDefinition(_someDefinition) + .WithDefinitions(definitions) + .Build(); + + Assert.AreEqual(Constants.Extension.ThirdPartyAttribute, extension.ExtensionType); + + List result = extension.Content.Definitions; + Assert.AreEqual(2, result.Count); + Assert.AreEqual("firstDefinition", result[0].Name); + Assert.AreEqual("secondDefinition", result[1].Name); + } + } +} \ No newline at end of file diff --git a/test/Yoti.Auth.Tests/DigitalIdentity/Extensions/TransactionalFlowExtensionBuilderTests.cs b/test/Yoti.Auth.Tests/DigitalIdentity/Extensions/TransactionalFlowExtensionBuilderTests.cs new file mode 100644 index 000000000..878a818af --- /dev/null +++ b/test/Yoti.Auth.Tests/DigitalIdentity/Extensions/TransactionalFlowExtensionBuilderTests.cs @@ -0,0 +1,44 @@ +using System; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Yoti.Auth.ShareUrl.Extensions; + +namespace Yoti.Auth.Tests.DigitalIdentity.Extensions +{ + [TestClass] + public class TransactionalFlowExtensionBuilderTests + { + private readonly object _objectContent = new object(); + private readonly DateTime _dateTimeContent = new DateTime(1980, 1, 1); + + [TestMethod] + public void ShouldFailForNullContent() + { + Assert.ThrowsException(() => + { + new TransactionalFlowExtensionBuilder() + .WithContent(null) + .Build(); + }); + } + + [TestMethod] + public void ShouldBuildWithObjectContent() + { + Extension extension = new TransactionalFlowExtensionBuilder() + .WithContent(_objectContent) + .Build(); + + Assert.AreEqual(_objectContent, extension.Content); + } + + [TestMethod] + public void ShouldBuildWithDateTimeContent() + { + Extension extension = new TransactionalFlowExtensionBuilder() + .WithContent(_dateTimeContent) + .Build(); + + Assert.AreEqual(_dateTimeContent, extension.Content); + } + } +} \ No newline at end of file diff --git a/test/Yoti.Auth.Tests/DigitalIdentity/Policy/DynamicPolicyBuilderTests.cs b/test/Yoti.Auth.Tests/DigitalIdentity/Policy/DynamicPolicyBuilderTests.cs new file mode 100644 index 000000000..b1fec0d31 --- /dev/null +++ b/test/Yoti.Auth.Tests/DigitalIdentity/Policy/DynamicPolicyBuilderTests.cs @@ -0,0 +1,345 @@ +using System.Collections.Generic; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Newtonsoft.Json; +using Yoti.Auth.Constants; +using Yoti.Auth.DigitalIdentity.Policy; +using Yoti.Auth.Tests.TestData; + +namespace Yoti.Auth.Tests.DigitalIdentity.Policy +{ + + [TestClass] + public class DynamicPolicyBuilderTests + { + private readonly int _expectedSelfieAuthValue = 1; + private readonly int _expectedPinAuthValue = 2; + + [TestMethod] + public void AttributeShouldOnlyExistOnce() + { + WantedAttribute wantedAttribute = new WantedAttributeBuilder() + .WithName("SomeAttributeName") + .Build(); + + Auth.DigitalIdentity.Policy.Policy result = new PolicyBuilder() + .WithWantedAttribute(wantedAttribute) + .WithWantedAttribute(wantedAttribute) + .Build(); + + Assert.AreEqual(1, result.WantedAttributes.Count); + Assert.IsTrue(result.WantedAttributes.Contains(wantedAttribute)); + } + + [TestMethod] + public void ShouldContainAllAddedAttributes() + { + Auth.DigitalIdentity.Policy.Policy dynamicPolicy = new PolicyBuilder() + .WithFamilyName() + .WithGivenNames() + .WithFullName() + .WithDateOfBirth() + .WithGender() + .WithPostalAddress() + .WithStructuredPostalAddress() + .WithNationality() + .WithPhoneNumber() + .WithSelfie() + .WithEmail() + .WithDocumentDetails() + .WithDocumentImages() + .WithAgeOver(55) + .WithAgeUnder(18) + .Build(); + + ICollection result = dynamicPolicy.WantedAttributes; + var attributeMatcher = new WantedAttributeMatcher(result); + + Assert.AreEqual(15, result.Count); + + Assert.IsTrue(attributeMatcher.ContainsAttribute(UserProfile.FamilyNameAttribute)); + Assert.IsTrue(attributeMatcher.ContainsAttribute(UserProfile.GivenNamesAttribute)); + Assert.IsTrue(attributeMatcher.ContainsAttribute(UserProfile.FullNameAttribute)); + Assert.IsTrue(attributeMatcher.ContainsAttribute(UserProfile.GenderAttribute)); + Assert.IsTrue(attributeMatcher.ContainsAttribute(UserProfile.PostalAddressAttribute)); + Assert.IsTrue(attributeMatcher.ContainsAttribute(UserProfile.StructuredPostalAddressAttribute)); + Assert.IsTrue(attributeMatcher.ContainsAttribute(UserProfile.NationalityAttribute)); + Assert.IsTrue(attributeMatcher.ContainsAttribute(UserProfile.PhoneNumberAttribute)); + Assert.IsTrue(attributeMatcher.ContainsAttribute(UserProfile.SelfieAttribute)); + Assert.IsTrue(attributeMatcher.ContainsAttribute(UserProfile.EmailAddressAttribute)); + Assert.IsTrue(attributeMatcher.ContainsAttribute(UserProfile.DocumentImagesAttribute)); + Assert.IsTrue(attributeMatcher.ContainsAttribute(UserProfile.DocumentDetailsAttribute)); + Assert.IsTrue(attributeMatcher.ContainsAttribute(UserProfile.DateOfBirthAttribute)); + Assert.IsTrue(attributeMatcher.ContainsAttribute(UserProfile.DateOfBirthAttribute, derivation: $"{Constants.UserProfile.AgeOverAttribute}:55")); + Assert.IsTrue(attributeMatcher.ContainsAttribute(UserProfile.DateOfBirthAttribute, derivation: $"{Constants.UserProfile.AgeUnderAttribute}:18")); + } + + [TestMethod] + public void ShouldBuildWithMultipleAgeDerivedAttributes() + { + Auth.DigitalIdentity.Policy.Policy dynamicPolicy = new PolicyBuilder() + .WithDateOfBirth() + .WithAgeOver(18) + .WithAgeUnder(30) + .WithAgeUnder(40) + .Build(); + + ICollection result = dynamicPolicy.WantedAttributes; + var attributeMatcher = new WantedAttributeMatcher(result); + + Assert.AreEqual(4, result.Count); + + Assert.IsTrue(attributeMatcher.ContainsAttribute(UserProfile.DateOfBirthAttribute)); + Assert.IsTrue(attributeMatcher.ContainsAttribute(UserProfile.DateOfBirthAttribute, derivation: $"{UserProfile.AgeOverAttribute}:{18}")); + Assert.IsTrue(attributeMatcher.ContainsAttribute(UserProfile.DateOfBirthAttribute, derivation: $"{UserProfile.AgeUnderAttribute}:{30}")); + Assert.IsTrue(attributeMatcher.ContainsAttribute(UserProfile.DateOfBirthAttribute, derivation: $"{UserProfile.AgeUnderAttribute}:{40}")); + } + + [TestMethod] + public void ShouldOverwriteIdenticalAgeVerificationToEnsureItOnlyExistsOnce() + { + Auth.DigitalIdentity.Policy.Policy dynamicPolicy = new PolicyBuilder() + .WithAgeUnder(30) + .WithAgeUnder(30) + .Build(); + + ICollection result = dynamicPolicy.WantedAttributes; + var attributeMatcher = new WantedAttributeMatcher(result); + + Assert.AreEqual(1, result.Count); + + Assert.IsTrue(attributeMatcher.ContainsAttribute(UserProfile.DateOfBirthAttribute, derivation: $"{UserProfile.AgeUnderAttribute}:{30}")); + } + + [TestMethod] + public void ShouldAddMultipleAttributesWithSameNameAndDifferentConstraints() + { + var passportConstraint = new SourceConstraintBuilder() + .WithPassport() + .Build(); + + var docImage1 = new WantedAttributeBuilder() + .WithName(Yoti.Auth.Constants.UserProfile.DocumentImagesAttribute) + .WithConstraint(passportConstraint) + .Build(); + + var drivingLicenseConstraint = new SourceConstraintBuilder() + .WithDrivingLicense() + .Build(); + + var docImage2 = new WantedAttributeBuilder() + .WithName(Yoti.Auth.Constants.UserProfile.DocumentImagesAttribute) + .WithConstraints(new List { drivingLicenseConstraint }) + .Build(); + + Auth.DigitalIdentity.Policy.Policy dynamicPolicy = new PolicyBuilder() + .WithWantedAttribute(docImage1) + .WithWantedAttribute(docImage2) + .Build(); + + ICollection result = dynamicPolicy.WantedAttributes; + var attributeMatcher = new WantedAttributeMatcher(result); + + Assert.AreEqual(2, result.Count); + + Assert.IsTrue(attributeMatcher.ContainsAttribute(UserProfile.DocumentImagesAttribute, null, new List { passportConstraint })); + Assert.IsTrue(attributeMatcher.ContainsAttribute(UserProfile.DocumentImagesAttribute, null, new List { drivingLicenseConstraint })); + } + + [TestMethod] + public void ShouldBuildWithAuthTypesTrue() + { + Auth.DigitalIdentity.Policy.Policy dynamicPolicy = new PolicyBuilder() + .WithSelfieAuthentication(enabled: true) + .WithPinAuthentication(enabled: true) + .WithAuthType(authType: 99, enabled: true) + .Build(); + + HashSet result = dynamicPolicy.WantedAuthTypes; + + Assert.AreEqual(3, result.Count); + Assert.IsTrue(result.SetEquals(new HashSet { _expectedSelfieAuthValue, _expectedPinAuthValue, 99 })); + } + + [TestMethod] + public void ShouoldBuildWithAuthTypesFalse() + { + Auth.DigitalIdentity.Policy.Policy dynamicPolicy = new PolicyBuilder() + .WithSelfieAuthentication(enabled: false) + .WithPinAuthentication(enabled: false) + .Build(); + + HashSet result = dynamicPolicy.WantedAuthTypes; + + Assert.AreEqual(0, result.Count); + } + + [TestMethod] + public void ShouldBuildWithAuthTypeEnabledThenDisabled() + { + Auth.DigitalIdentity.Policy.Policy dynamicPolicy = new PolicyBuilder() + .WithAuthType(24, enabled: true) + .WithAuthType(24, enabled: false) + .Build(); + + HashSet result = dynamicPolicy.WantedAuthTypes; + + Assert.AreEqual(0, result.Count); + } + + [TestMethod] + public void ShouldBuildWithAuthTypeDisabledThenEnabled() + { + Auth.DigitalIdentity.Policy.Policy dynamicPolicy = new PolicyBuilder() + .WithAuthType(23, enabled: false) + .WithAuthType(23, enabled: true) + .Build(); + + HashSet result = dynamicPolicy.WantedAuthTypes; + + Assert.AreEqual(1, result.Count); + Assert.IsTrue(result.SetEquals(new HashSet { 23 })); + } + + [TestMethod] + public void ShouldBuildWithSelfieAuthenticationEnabledThenDisabled() + { + Auth.DigitalIdentity.Policy.Policy dynamicPolicy = new PolicyBuilder() + .WithSelfieAuthentication(enabled: true) + .WithSelfieAuthentication(enabled: false) + .Build(); + + HashSet result = dynamicPolicy.WantedAuthTypes; + + Assert.AreEqual(0, result.Count); + } + + [TestMethod] + public void ShouldBuildWithSelfieAuthenticationDisabledThenEnabled() + { + Auth.DigitalIdentity.Policy.Policy dynamicPolicy = new PolicyBuilder() + .WithSelfieAuthentication(enabled: false) + .WithSelfieAuthentication(enabled: true) + .Build(); + + HashSet result = dynamicPolicy.WantedAuthTypes; + + Assert.AreEqual(1, result.Count); + Assert.IsTrue(result.SetEquals(new HashSet { _expectedSelfieAuthValue })); + } + + [TestMethod] + public void ShouldBuildWithSelfieAuthenticationDisabled() + { + Auth.DigitalIdentity.Policy.Policy dynamicPolicy = new PolicyBuilder() + .WithSelfieAuthentication(enabled: false) + .Build(); + + HashSet result = dynamicPolicy.WantedAuthTypes; + + Assert.AreEqual(0, result.Count); + } + + [TestMethod] + public void ShouldFilterSelfieAuthenticationDuplicates() + { + Auth.DigitalIdentity.Policy.Policy dynamicPolicy = new PolicyBuilder() + .WithSelfieAuthentication(enabled: true) + .WithAuthType(Auth.DigitalIdentity.Policy.Policy.SelfieAuthType, enabled: true) + .Build(); + + HashSet result = dynamicPolicy.WantedAuthTypes; + + Assert.AreEqual(1, result.Count); + Assert.IsTrue(result.SetEquals(new HashSet { _expectedSelfieAuthValue })); + } + + [TestMethod] + public void ShouldFilterPinAuthenticationDuplicates() + { + Auth.DigitalIdentity.Policy.Policy dynamicPolicy = new PolicyBuilder() + .WithPinAuthentication(enabled: true) + .WithAuthType(Auth.DigitalIdentity.Policy.Policy.PinAuthType, enabled: true) + .Build(); + + HashSet result = dynamicPolicy.WantedAuthTypes; + + Assert.AreEqual(1, result.Count); + Assert.IsTrue(result.SetEquals(new HashSet { _expectedPinAuthValue })); + } + + [TestMethod] + public void ShouldBuildWithPinAuthenticationEnabledThenDisabled() + { + Auth.DigitalIdentity.Policy.Policy dynamicPolicy = new PolicyBuilder() + .WithPinAuthentication(enabled: true) + .WithPinAuthentication(enabled: false) + .Build(); + + HashSet result = dynamicPolicy.WantedAuthTypes; + + Assert.AreEqual(0, result.Count); + } + + [TestMethod] + public void ShouldBuildWithPinAuthenticationDisabledThenEnabled() + { + Auth.DigitalIdentity.Policy.Policy dynamicPolicy = new PolicyBuilder() + .WithPinAuthentication(enabled: false) + .WithPinAuthentication(enabled: true) + .Build(); + + HashSet result = dynamicPolicy.WantedAuthTypes; + + Assert.AreEqual(1, result.Count); + Assert.IsTrue(result.SetEquals(new HashSet { _expectedPinAuthValue })); + } + + [TestMethod] + public void ShouldBuildWithPinAuthenticationDisabled() + { + Auth.DigitalIdentity.Policy.Policy dynamicPolicy = new PolicyBuilder() + .WithPinAuthentication(enabled: false) + .Build(); + + HashSet result = dynamicPolicy.WantedAuthTypes; + + Assert.AreEqual(0, result.Count); + } + + [TestMethod] + public void ShouldBuildWithRememberMeFlag() + { + Auth.DigitalIdentity.Policy.Policy result = new PolicyBuilder() + .WithRememberMeId(true) + .Build(); + + Assert.IsTrue(result.WantedRememberMeId); + } + + [TestMethod] + public void ShouldBuildWithIdentityProfileRequirements() + { + object identityProfileRequirements = IdentityProfiles.CreateStandardIdentityProfileRequirements(); + + Auth.DigitalIdentity.Policy.Policy result = new PolicyBuilder() + .WithIdentityProfileRequirements(identityProfileRequirements) + .Build(); + + Assert.AreEqual(identityProfileRequirements, result.IdentityProfileRequirements); + } + + [TestMethod] + public void ShouldBuildWithAdvancedIdentityProfileRequirements() + { + var advancedIdentityProfileRequirements = IdentityProfiles.CreateAdvancedIdentityProfileRequirements(); + + Auth.DigitalIdentity.Policy.Policy result = new PolicyBuilder() + .WithAdvancedIdentityProfileRequirements(advancedIdentityProfileRequirements) + .Build(); + + Assert.AreEqual(advancedIdentityProfileRequirements, result.AdvancedIdentityProfileRequirements); + } + } + + +} diff --git a/test/Yoti.Auth.Tests/DigitalIdentity/Policy/WantedAttributeBuilderTests.cs b/test/Yoti.Auth.Tests/DigitalIdentity/Policy/WantedAttributeBuilderTests.cs new file mode 100644 index 000000000..a856536cb --- /dev/null +++ b/test/Yoti.Auth.Tests/DigitalIdentity/Policy/WantedAttributeBuilderTests.cs @@ -0,0 +1,166 @@ +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Yoti.Auth.ShareUrl.Policy; + +namespace Yoti.Auth.Tests.DigitalIdentity.Policy +{ + [TestClass] + public class WantedAttributeBuilderTests + { + private const string _someName = "some name"; + private const string _someDerivation = "some derivation"; + + [TestMethod] + public void BuildsAnAttribute() + { + SourceConstraint sourceConstraint = new SourceConstraintBuilder() + .WithDrivingLicense() + .Build(); + + WantedAttribute result = new WantedAttributeBuilder() + .WithName(_someName) + .WithDerivation(_someDerivation) + .WithConstraint(sourceConstraint) + .Build(); + + Assert.AreEqual(1, result.Constraints.Count); + Assert.AreEqual(_someName, result.Name); + Assert.AreEqual(_someDerivation, result.Derivation); + } + + [TestMethod] + public void ShouldSetAcceptSelfAssertedToNullByDefault() + { + WantedAttribute result = new WantedAttributeBuilder() + .WithName("name") + .WithOptional(true) + .Build(); + + Assert.AreEqual(null, result.AcceptSelfAsserted); + Assert.AreEqual(true, result.Optional); + } + + [TestMethod] + public void ShouldRetainLatestAcceptSelfAsserted() + { + WantedAttribute result = new WantedAttributeBuilder() + .WithName("name") + .WithAcceptSelfAsserted(false) + .WithAcceptSelfAsserted(true) + .Build(); + + Assert.AreEqual(true, result.AcceptSelfAsserted); + } + + [TestMethod] + public void ShouldGenerateWithAnchor() + { + string wantedAnchorName = "name"; + string wantedAnchorSubType = "subType"; + Constraint sourceConstraint = new SourceConstraintBuilder() + .WithAnchor(new WantedAnchor(wantedAnchorName, wantedAnchorSubType)) + .Build(); + + WantedAttribute wantedAttribute = new WantedAttributeBuilder() + .WithName("attribute_name") + .WithConstraint(sourceConstraint) + .Build(); + + var result = (SourceConstraint)wantedAttribute.Constraints.Single(); + + Assert.AreEqual(wantedAnchorName, result.PreferredSources.WantedAnchors.Single().Name); + Assert.AreEqual(wantedAnchorSubType, result.PreferredSources.WantedAnchors.Single().SubType); + } + + [TestMethod] + public void ShouldGenerateWithPasscard() + { + Constraint sourceConstraint = new SourceConstraintBuilder() + .WithPasscard() + .Build(); + + WantedAttribute wantedAttribute = new WantedAttributeBuilder() + .WithName("attribute_name") + .WithConstraint(sourceConstraint) + .Build(); + + var result = (SourceConstraint)wantedAttribute.Constraints.Single(); + Assert.AreEqual("PASS_CARD", result.PreferredSources.WantedAnchors[0].Name); + Assert.AreEqual("", result.PreferredSources.WantedAnchors[0].SubType); + } + + [TestMethod] + public void ShouldGenerateTwoSourceConstraints() + { + Constraint sourceConstraint = new SourceConstraintBuilder() + .WithPassport() + .WithNationalId("AADHAR") + .WithSoftPreference(true) + .Build(); + + WantedAttribute wantedAttribute = new WantedAttributeBuilder() + .WithName("attribute_name") + .WithConstraint(sourceConstraint) + .Build(); + + var result = (SourceConstraint)wantedAttribute.Constraints.Single(); + Assert.IsTrue(result.PreferredSources.SoftPreference); + Assert.AreEqual("SOURCE", result.ConstraintType); + + Assert.AreEqual("PASSPORT", result.PreferredSources.WantedAnchors[0].Name); + Assert.AreEqual("", result.PreferredSources.WantedAnchors[0].SubType); + + Assert.AreEqual("NATIONAL_ID", result.PreferredSources.WantedAnchors[1].Name); + Assert.AreEqual("AADHAR", result.PreferredSources.WantedAnchors[1].SubType); + } + + [TestMethod] + public void WithConstraintShouldAddToCurrentConstraints() + { + Constraint drivingLicenseConstraint = new SourceConstraintBuilder() + .WithDrivingLicense() + .Build(); + + Constraint passcardConstraint = new SourceConstraintBuilder() + .WithPasscard() + .Build(); + + WantedAttribute wantedAttribute = new WantedAttributeBuilder() + .WithName("attribute_name") + .WithConstraints(new List { drivingLicenseConstraint }) + .WithConstraint(passcardConstraint) + .Build(); + + Assert.AreEqual(2, wantedAttribute.Constraints.Count); + + var sourceConstraint1 = (SourceConstraint)wantedAttribute.Constraints.First(); + Assert.AreEqual("DRIVING_LICENCE", sourceConstraint1.PreferredSources.WantedAnchors[0].Name); + + var sourceConstraint2 = (SourceConstraint)wantedAttribute.Constraints.Last(); + Assert.AreEqual("PASS_CARD", sourceConstraint2.PreferredSources.WantedAnchors[0].Name); + } + + [TestMethod] + public void WithConstraintsShouldOverrideCurrentConstraint() + { + Constraint drivingLicenseConstraint = new SourceConstraintBuilder() + .WithDrivingLicense() + .Build(); + + Constraint passcardConstraint = new SourceConstraintBuilder() + .WithPasscard() + .Build(); + + WantedAttribute wantedAttribute = new WantedAttributeBuilder() + .WithName("attribute_name") + .WithConstraint(passcardConstraint) + .WithConstraints(new List { drivingLicenseConstraint }) + .Build(); + + var result = (SourceConstraint)wantedAttribute.Constraints.Single(); + Assert.AreEqual(1, result.PreferredSources.WantedAnchors.Count); + Assert.AreEqual("DRIVING_LICENCE", result.PreferredSources.WantedAnchors[0].Name); + } + } +} diff --git a/test/Yoti.Auth.Tests/DigitalIdentity/Policy/WantedAttributeMatcher.cs b/test/Yoti.Auth.Tests/DigitalIdentity/Policy/WantedAttributeMatcher.cs new file mode 100644 index 000000000..e3497323c --- /dev/null +++ b/test/Yoti.Auth.Tests/DigitalIdentity/Policy/WantedAttributeMatcher.cs @@ -0,0 +1,41 @@ +using System.Collections.Generic; +using System.Linq; +using Yoti.Auth.DigitalIdentity.Policy; + +namespace Yoti.Auth.Tests.DigitalIdentity.Policy +{ + internal class WantedAttributeMatcher + { + private readonly ICollection _attributes; + + public WantedAttributeMatcher(ICollection attributes) + { + _attributes = attributes; + } + + public bool ContainsAttribute(string name, string derivation = null, List constraints = null) + { + var expectedAttribute = new WantedAttribute(name, derivation, constraints); + + foreach (var attribute in _attributes) + { + if (attribute.Name == expectedAttribute.Name + && attribute.Derivation == expectedAttribute.Derivation + && ConstraintsMatch(expectedAttribute.Constraints, attribute.Constraints)) + { + return true; + } + } + + return false; + } + + private static bool ConstraintsMatch(List expectedConstraints, List attributeConstraint) + { + if (expectedConstraints == null && attributeConstraint == null) + return true; + + return Enumerable.SequenceEqual(expectedConstraints, attributeConstraint); + } + } +} \ No newline at end of file diff --git a/test/Yoti.Auth.Tests/DigitalIdentity/QrRequestBuilderTests.cs b/test/Yoti.Auth.Tests/DigitalIdentity/QrRequestBuilderTests.cs new file mode 100644 index 000000000..422957153 --- /dev/null +++ b/test/Yoti.Auth.Tests/DigitalIdentity/QrRequestBuilderTests.cs @@ -0,0 +1,30 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Yoti.Auth.DigitalIdentity; +using Yoti.Auth.Tests.TestData; + +namespace Yoti.Auth.Tests.DigitalIdentity +{ + [TestClass] + public class QrRequestBuilderTests + { + + private const string _someTransportString = "someTransport"; + private const string _someDisplayMode = "someDisplay"; + + + + [TestMethod] + public void ShouldBuildADynamicScenario() + { + QrRequest result = new QrRequestBuilder() + .WithDisplayMode(_someDisplayMode) + .WithTransport(_someTransportString) + .Build(); + + + Assert.AreEqual(_someDisplayMode, result.DisplayMode); + Assert.AreEqual(_someTransportString, result.Transport); + } + + } +} \ No newline at end of file diff --git a/test/Yoti.Auth.Tests/DigitalIdentity/RequirementNotMetDetails.cs b/test/Yoti.Auth.Tests/DigitalIdentity/RequirementNotMetDetails.cs new file mode 100644 index 000000000..9fb6a1322 --- /dev/null +++ b/test/Yoti.Auth.Tests/DigitalIdentity/RequirementNotMetDetails.cs @@ -0,0 +1,53 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Newtonsoft.Json; + +namespace Yoti.DigitalIdentity.Tests +{ + [TestClass] + public class RequirementNotMetDetailsTests + { + [TestMethod] + public void DeserializeValidJsonCreatesRequirementNotMetDetails() + { + var json = @" + { + ""failure_type"": ""DOCUMENT_EXPIRED"", + ""details"": ""The document has expired."", + ""audit_id"": ""AUDIT123"", + ""document_country_iso_code"": ""USA"", + ""document_type"": ""PASSPORT"" + }"; + + var details = JsonConvert.DeserializeObject(json); + + Assert.IsNotNull(details); + Assert.AreEqual("DOCUMENT_EXPIRED", details.FailureType); + Assert.AreEqual("The document has expired.", details.Details); + Assert.AreEqual("AUDIT123", details.AuditId); + Assert.AreEqual("USA", details.DocumentCountryIsoCode); + Assert.AreEqual("PASSPORT", details.DocumentType); + } + + + [TestMethod] + public void PropertyGettersReturnCorrectValues() + { + var json = @" + { + ""failure_type"": ""DOCUMENT_EXPIRED"", + ""details"": ""The document has expired."", + ""audit_id"": ""AUDIT123"", + ""document_country_iso_code"": ""USA"", + ""document_type"": ""PASSPORT"" + }"; + + var details = JsonConvert.DeserializeObject(json); + + Assert.AreEqual("DOCUMENT_EXPIRED", details.FailureType); + Assert.AreEqual("The document has expired.", details.Details); + Assert.AreEqual("AUDIT123", details.AuditId); + Assert.AreEqual("USA", details.DocumentCountryIsoCode); + Assert.AreEqual("PASSPORT", details.DocumentType); + } + } +} diff --git a/test/Yoti.Auth.Tests/DigitalIdentity/ShareSessionRequestBuilderTests.cs b/test/Yoti.Auth.Tests/DigitalIdentity/ShareSessionRequestBuilderTests.cs new file mode 100644 index 000000000..bc52fe01f --- /dev/null +++ b/test/Yoti.Auth.Tests/DigitalIdentity/ShareSessionRequestBuilderTests.cs @@ -0,0 +1,72 @@ +using System.Collections.Generic; +using System.IO; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Newtonsoft.Json; +using Yoti.Auth.DigitalIdentity; +using Yoti.Auth.DigitalIdentity.Extensions; +using Yoti.Auth.DigitalIdentity.Policy; +using Yoti.Auth.Tests.TestData; + +namespace Yoti.Auth.Tests.DigitalIdentity +{ + [TestClass] + public class ShareSessionRequestBuilderTests + { + private const string _someEndpoint = "someEndpoint"; + + private readonly BaseExtension extension1 = new ExtensionBuilder() + .WithContent("content") + .WithType("string type") + .Build(); + + private readonly BaseExtension extension2 = new LocationConstraintExtensionBuilder() + .WithLatitude(51.5044772) + .WithLongitude(-0.082161) + .WithMaxUncertainty(300) + .WithRadius(1500) + .Build(); + + + [TestMethod] + public void ShouldBuildADynamicScenario() + { + Auth.DigitalIdentity.Policy.Policy somePolicy = TestTools.ShareSession.CreateStandardPolicy(); + object someSubject = IdentityProfiles.CreateStandardSubject(); + + ShareSessionRequest result = new ShareSessionRequestBuilder() + .WithRedirectUri(_someEndpoint) + .WithPolicy(somePolicy) + .WithExtension(extension1) + .WithExtension(extension2) + .WithSubject(someSubject) + .Build(); + + var expectedExtensions = new List { extension1, extension2 }; + + Assert.AreEqual(_someEndpoint, result.RedirectUri); + Assert.AreEqual(somePolicy, result.DynamicPolicy); + CollectionAssert.AreEqual(expectedExtensions, result.Extensions); + Assert.AreEqual(someSubject, result.Subject); + + string serializedScenario = JsonConvert.SerializeObject( + result, + + new JsonSerializerSettings + { + NullValueHandling = NullValueHandling.Ignore + }); + + object deserializedObject; + using (StreamReader r = File.OpenText("TestData/DigitalIdentity.json")) + { + string json = r.ReadToEnd(); + deserializedObject = JsonConvert.DeserializeObject(json); + } + + string expectedJson = JsonConvert.SerializeObject(deserializedObject); + + Assert.AreEqual(expectedJson, serializedScenario); + } + + } +} \ No newline at end of file diff --git a/test/Yoti.Auth.Tests/DigitalIdentityClientEngineTests.cs b/test/Yoti.Auth.Tests/DigitalIdentityClientEngineTests.cs new file mode 100644 index 000000000..8dddfe73b --- /dev/null +++ b/test/Yoti.Auth.Tests/DigitalIdentityClientEngineTests.cs @@ -0,0 +1,388 @@ +using System; +using System.Net; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using Moq.Protected; +using Org.BouncyCastle.Crypto; +using Yoti.Auth.DigitalIdentity; +using Yoti.Auth.Exceptions; +using Yoti.Auth.Tests.Common; + +namespace Yoti.Auth.Tests +{ + [TestClass] + public class DigitalIdentityClientEngineTests + { + private const string EncryptedToken = "b6H19bUCJhwh6WqQX/sEHWX9RP+A/ANr1fkApwA4Dp2nJQFAjrF9e6YCXhNBpAIhfHnN0iXubyXxXZMNwNMSQ5VOxkqiytrvPykfKQWHC6ypSbfy0ex8ihndaAXG5FUF+qcU8QaFPMy6iF3x0cxnY0Ij0kZj0Ng2t6oiNafb7AhT+VGXxbFbtZu1QF744PpWMuH0LVyBsAa5N5GJw2AyBrnOh67fWMFDKTJRziP5qCW2k4h5vJfiYr/EOiWKCB1d/zINmUm94ZffGXxcDAkq+KxhN1ZuNhGlJ2fKcFh7KxV0BqlUWPsIEiwS0r9CJ2o1VLbEs2U/hCEXaqseEV7L29EnNIinEPVbL4WR7vkF6zQCbK/cehlk2Qwda+VIATqupRO5grKZN78R9lBitvgilDaoE7JB/VFcPoljGQ48kX0wje1mviX4oJHhuO8GdFITS5LTbojGVQWT7LUNgAUe0W0j+FLHYYck3v84OhWTqads5/jmnnLkp9bdJSRuJF0e8pNdePnn2lgF+GIcyW/0kyGVqeXZrIoxnObLpF+YeUteRBKTkSGFcy7a/V/DLiJMPmH8UXDLOyv8TVt3ppzqpyUrLN2JVMbL5wZ4oriL2INEQKvw/boDJjZDGeRlu5m1y7vGDNBRDo64+uQM9fRUULPw+YkABNwC0DeShswzT00="; + private readonly AsymmetricCipherKeyPair _keyPair = KeyPair.Get(); + private static HttpRequestMessage _httpRequestMessage; + private const string SdkId = "fake-sdk-id"; + + [TestMethod] + public async Task CreateSessionAsyncShouldReturnCorrectValues() + { + string refId = "NpdmVVGC-28356678-c236-4518-9de4-7a93009ccaf0-c5f92f2a-5539-453e-babc-9b06e1d6b7de"; + + Mock handlerMock = SetupMockMessageHandler( + HttpStatusCode.OK, + "{\"id\":\"" + refId + "\",\"status\":\"SOME_STATUS\",\"expiry\":\"SOME_EXPIRY\",\"created\":\"SOME_CREATED\",\"updated\":\"SOME_UPDATED\",\"qrCode\":{\"id\":\"SOME_QRCODE_ID\"},\"receipt\":{\"id\":\"SOME_RECEIPT_ID\"}}"); + + var engine = new DigitalIdentityClientEngine(new HttpClient(handlerMock.Object)); + ShareSessionRequest shareSessionRequest = TestTools.ShareSession.CreateStandardShareSessionRequest(); + + ShareSessionResult shareSessionResult = await engine.CreateShareSessionAsync(SdkId, _keyPair, new Uri(Constants.Api.DefaultYotiShareApiUrl), shareSessionRequest); + + Assert.IsNotNull(shareSessionResult); + Assert.AreEqual(refId, shareSessionResult.Id); + } + + [TestMethod] + public async Task CreateQrCodeAsyncShouldReturnCorrectValues() + { + string qrCodeId = "test-qr-code-id"; + string qrCodeUri = "https://code.yoti.com/CAEaJDlkOGI4ZGFjLTEyMzQtNTY3OC05MDEyLWFiY2RlZjEyMzQ1Ng=="; + + Mock handlerMock = SetupMockMessageHandler( + HttpStatusCode.OK, + "{\"id\":\"" + qrCodeId + "\",\"uri\":\"" + qrCodeUri + "\"}"); + + var engine = new DigitalIdentityClientEngine(new HttpClient(handlerMock.Object)); + QrRequest qrRequest = TestTools.CreateQr.CreateQrStandard(); + string sessionId = "test-session-id"; + + CreateQrResult result = await engine.CreateQrCodeAsync(SdkId, _keyPair, new Uri(Constants.Api.DefaultYotiShareApiUrl), sessionId, qrRequest); + + Assert.IsNotNull(result); + Assert.AreEqual(qrCodeId, result.Id); + Assert.AreEqual(qrCodeUri, result.Uri); + } + + [TestMethod] + public async Task GetQrCodeAsyncShouldReturnCorrectValues() + { + string qrCodeId = "test-qr-code-id"; + string expiry = "2025-12-31T23:59:59Z"; + string policy = "test-policy"; + + Mock handlerMock = SetupMockMessageHandler( + HttpStatusCode.OK, + "{\"id\":\"" + qrCodeId + "\",\"expiry\":\"" + expiry + "\",\"policy\":\"" + policy + "\",\"session\":{\"id\":\"session-123\",\"status\":\"ACTIVE\"},\"redirectUri\":\"https://example.com/redirect\"}"); + + var engine = new DigitalIdentityClientEngine(new HttpClient(handlerMock.Object)); + + GetQrCodeResult result = await engine.GetQrCodeAsync(SdkId, _keyPair, new Uri(Constants.Api.DefaultYotiShareApiUrl), qrCodeId); + + Assert.IsNotNull(result); + Assert.AreEqual(qrCodeId, result.Id); + Assert.AreEqual(expiry, result.Expiry); + Assert.AreEqual(policy, result.Policy); + } + + [TestMethod] + public async Task GetSessionShouldReturnCorrectValues() + { + string sessionId = "test-session-id"; + string status = "ACTIVE"; + string expiry = "2025-12-31T23:59:59Z"; + + Mock handlerMock = SetupMockMessageHandler( + HttpStatusCode.OK, + "{\"id\":\"" + sessionId + "\",\"status\":\"" + status + "\",\"expiry\":\"" + expiry + "\",\"created\":\"2025-06-27T10:00:00Z\",\"updated\":\"2025-06-27T11:00:00Z\",\"qrCode\":{\"id\":\"qr-123\"},\"receipt\":{\"id\":\"receipt-123\"}}"); + + var engine = new DigitalIdentityClientEngine(new HttpClient(handlerMock.Object)); + + GetSessionResult result = await engine.GetSession(SdkId, _keyPair, new Uri(Constants.Api.DefaultYotiShareApiUrl), sessionId); + + Assert.IsNotNull(result); + Assert.AreEqual(sessionId, result.Id); + Assert.AreEqual(status, result.Status); + Assert.AreEqual(expiry, result.Expiry); + } + + [DataTestMethod] + [DataRow(HttpStatusCode.BadRequest)] + [DataRow(HttpStatusCode.Unauthorized)] + [DataRow(HttpStatusCode.InternalServerError)] + [DataRow(HttpStatusCode.RequestTimeout)] + [DataRow(HttpStatusCode.NotFound)] + [DataRow(HttpStatusCode.Forbidden)] + public void CreateShareSessionNonSuccessStatusCodesShouldThrowException(HttpStatusCode httpStatusCode) + { + Mock handlerMock = SetupMockMessageHandler( + httpStatusCode, + "{\"status\":\"bad\""); + + var engine = new DigitalIdentityClientEngine(new HttpClient(handlerMock.Object)); + + ShareSessionRequest shareSessionRequest = TestTools.ShareSession.CreateStandardShareSessionRequest(); + + var aggregateException = Assert.ThrowsException(() => + { + engine.CreateShareSessionAsync(SdkId, _keyPair, new Uri(Constants.Api.DefaultYotiApiUrl), shareSessionRequest).Wait(); + }); + + Assert.IsTrue(TestTools.Exceptions.IsExceptionInAggregateException(aggregateException)); + } + + [DataTestMethod] + [DataRow(HttpStatusCode.BadRequest)] + [DataRow(HttpStatusCode.Unauthorized)] + [DataRow(HttpStatusCode.InternalServerError)] + [DataRow(HttpStatusCode.RequestTimeout)] + [DataRow(HttpStatusCode.NotFound)] + [DataRow(HttpStatusCode.Forbidden)] + public void GetShareReceiptNonSuccessStatusCodesShouldThrowException(HttpStatusCode httpStatusCode) + { + Mock handlerMock = SetupMockMessageHandler( + httpStatusCode, + "{\"status\":\"bad\"}"); + + var engine = new DigitalIdentityClientEngine(new HttpClient(handlerMock.Object)); + Uri apiUrl = new Uri("https://example.com/api"); + string receiptId = "some_receiptid"; + + var aggregateException = Assert.ThrowsException(() => + { + engine.GetShareReceipt(SdkId, _keyPair, apiUrl, receiptId).Wait(); + }); + + Assert.IsTrue(TestTools.Exceptions.IsExceptionInAggregateException(aggregateException)); + } + + [DataTestMethod] + [DataRow(HttpStatusCode.BadRequest)] + [DataRow(HttpStatusCode.Unauthorized)] + [DataRow(HttpStatusCode.InternalServerError)] + [DataRow(HttpStatusCode.RequestTimeout)] + [DataRow(HttpStatusCode.NotFound)] + [DataRow(HttpStatusCode.Forbidden)] + public void CreateQrCodeAsyncNonSuccessStatusCodesShouldThrowException(HttpStatusCode httpStatusCode) + { + Mock handlerMock = SetupMockMessageHandler( + httpStatusCode, + "{\"status\":\"bad\"}"); + + var engine = new DigitalIdentityClientEngine(new HttpClient(handlerMock.Object)); + QrRequest qrRequest = TestTools.CreateQr.CreateQrStandard(); + string sessionId = "test-session-id"; + + var aggregateException = Assert.ThrowsException(() => + { + engine.CreateQrCodeAsync(SdkId, _keyPair, new Uri(Constants.Api.DefaultYotiShareApiUrl), sessionId, qrRequest).Wait(); + }); + + Assert.IsTrue(TestTools.Exceptions.IsExceptionInAggregateException(aggregateException)); + } + + [DataTestMethod] + [DataRow(HttpStatusCode.BadRequest)] + [DataRow(HttpStatusCode.Unauthorized)] + [DataRow(HttpStatusCode.InternalServerError)] + [DataRow(HttpStatusCode.RequestTimeout)] + [DataRow(HttpStatusCode.NotFound)] + [DataRow(HttpStatusCode.Forbidden)] + public void GetQrCodeAsyncNonSuccessStatusCodesShouldThrowException(HttpStatusCode httpStatusCode) + { + Mock handlerMock = SetupMockMessageHandler( + httpStatusCode, + "{\"status\":\"bad\"}"); + + var engine = new DigitalIdentityClientEngine(new HttpClient(handlerMock.Object)); + string qrCodeId = "test-qr-code-id"; + + var aggregateException = Assert.ThrowsException(() => + { + engine.GetQrCodeAsync(SdkId, _keyPair, new Uri(Constants.Api.DefaultYotiShareApiUrl), qrCodeId).Wait(); + }); + + Assert.IsTrue(TestTools.Exceptions.IsExceptionInAggregateException(aggregateException)); + } + + [DataTestMethod] + [DataRow(HttpStatusCode.BadRequest)] + [DataRow(HttpStatusCode.Unauthorized)] + [DataRow(HttpStatusCode.InternalServerError)] + [DataRow(HttpStatusCode.RequestTimeout)] + [DataRow(HttpStatusCode.NotFound)] + [DataRow(HttpStatusCode.Forbidden)] + public void GetSessionNonSuccessStatusCodesShouldThrowException(HttpStatusCode httpStatusCode) + { + Mock handlerMock = SetupMockMessageHandler( + httpStatusCode, + "{\"status\":\"bad\"}"); + + var engine = new DigitalIdentityClientEngine(new HttpClient(handlerMock.Object)); + string sessionId = "test-session-id"; + + var aggregateException = Assert.ThrowsException(() => + { + engine.GetSession(SdkId, _keyPair, new Uri(Constants.Api.DefaultYotiShareApiUrl), sessionId).Wait(); + }); + + Assert.IsTrue(TestTools.Exceptions.IsExceptionInAggregateException(aggregateException)); + } + + private static Mock SetupMockMessageHandler(HttpStatusCode httpStatusCode, string responseContent) + { + var handlerMock = new Mock(MockBehavior.Loose); + handlerMock + .Protected() + .Setup>( + "SendAsync", + ItExpr.IsAny(), + ItExpr.IsAny() + ) + .ReturnsAsync(new HttpResponseMessage() + { + StatusCode = httpStatusCode, + Content = new StringContent(responseContent) + }) + .Callback((http, token) => _httpRequestMessage = http) + .Verifiable(); + + return handlerMock; + } + + [TestMethod] + public void ConstructorShouldAcceptHttpClient() + { + var httpClient = new HttpClient(); + + var engine = new DigitalIdentityClientEngine(httpClient); + + Assert.IsNotNull(engine); + } + + [TestMethod] + public async Task GetShareReceiptShouldThrowWhenReceiptIdIsEmpty() + { + var httpClient = new HttpClient(); + var engine = new DigitalIdentityClientEngine(httpClient); + Uri apiUrl = new Uri("https://example.com/api"); + + await Assert.ThrowsExceptionAsync(() => + engine.GetShareReceipt(SdkId, _keyPair, apiUrl, "")); + } + + [TestMethod] + public async Task CreateShareSessionAsyncShouldHandleEmptyResponse() + { + Mock handlerMock = SetupMockMessageHandler( + HttpStatusCode.OK, + "{}"); + + var engine = new DigitalIdentityClientEngine(new HttpClient(handlerMock.Object)); + ShareSessionRequest shareSessionRequest = TestTools.ShareSession.CreateStandardShareSessionRequest(); + + ShareSessionResult shareSessionResult = await engine.CreateShareSessionAsync(SdkId, _keyPair, new Uri(Constants.Api.DefaultYotiShareApiUrl), shareSessionRequest); + + Assert.IsNotNull(shareSessionResult); + } + + [TestMethod] + public async Task CreateQrCodeAsyncShouldHandleEmptyResponse() + { + Mock handlerMock = SetupMockMessageHandler( + HttpStatusCode.OK, + "{}"); + + var engine = new DigitalIdentityClientEngine(new HttpClient(handlerMock.Object)); + QrRequest qrRequest = TestTools.CreateQr.CreateQrStandard(); + string sessionId = "test-session-id"; + + CreateQrResult result = await engine.CreateQrCodeAsync(SdkId, _keyPair, new Uri(Constants.Api.DefaultYotiShareApiUrl), sessionId, qrRequest); + + Assert.IsNotNull(result); + } + + [TestMethod] + public async Task GetQrCodeAsyncShouldHandleEmptyResponse() + { + string qrCodeId = "test-qr-code-id"; + + Mock handlerMock = SetupMockMessageHandler( + HttpStatusCode.OK, + "{}"); + + var engine = new DigitalIdentityClientEngine(new HttpClient(handlerMock.Object)); + + GetQrCodeResult result = await engine.GetQrCodeAsync(SdkId, _keyPair, new Uri(Constants.Api.DefaultYotiShareApiUrl), qrCodeId); + + Assert.IsNotNull(result); + } + + [TestMethod] + public async Task GetSessionShouldHandleEmptyResponse() + { + string sessionId = "test-session-id"; + + Mock handlerMock = SetupMockMessageHandler( + HttpStatusCode.OK, + "{}"); + + var engine = new DigitalIdentityClientEngine(new HttpClient(handlerMock.Object)); + + GetSessionResult result = await engine.GetSession(SdkId, _keyPair, new Uri(Constants.Api.DefaultYotiShareApiUrl), sessionId); + + Assert.IsNotNull(result); + } + + [TestMethod] + public async Task CreateShareSessionAsyncShouldHandleSpecialCharactersInId() + { + string refId = "session-with-special-chars-123456"; + + Mock handlerMock = SetupMockMessageHandler( + HttpStatusCode.OK, + "{\"id\":\"" + refId + "\",\"status\":\"ACTIVE\"}"); + + var engine = new DigitalIdentityClientEngine(new HttpClient(handlerMock.Object)); + ShareSessionRequest shareSessionRequest = TestTools.ShareSession.CreateStandardShareSessionRequest(); + + ShareSessionResult shareSessionResult = await engine.CreateShareSessionAsync(SdkId, _keyPair, new Uri(Constants.Api.DefaultYotiShareApiUrl), shareSessionRequest); + + Assert.IsNotNull(shareSessionResult); + Assert.AreEqual(refId, shareSessionResult.Id); + } + + [TestMethod] + public async Task GetQrCodeAsyncShouldHandleNullSessionInResponse() + { + string qrCodeId = "test-qr-code-id"; + + Mock handlerMock = SetupMockMessageHandler( + HttpStatusCode.OK, + "{\"id\":\"" + qrCodeId + "\",\"session\":null}"); + + var engine = new DigitalIdentityClientEngine(new HttpClient(handlerMock.Object)); + + GetQrCodeResult result = await engine.GetQrCodeAsync(SdkId, _keyPair, new Uri(Constants.Api.DefaultYotiShareApiUrl), qrCodeId); + + Assert.IsNotNull(result); + Assert.AreEqual(qrCodeId, result.Id); + Assert.IsNull(result.Session); + } + + [TestMethod] + public async Task GetSessionShouldHandleNullQrCodeAndReceiptInResponse() + { + string sessionId = "test-session-id"; + + Mock handlerMock = SetupMockMessageHandler( + HttpStatusCode.OK, + "{\"id\":\"" + sessionId + "\",\"qrCode\":null,\"receipt\":null}"); + + var engine = new DigitalIdentityClientEngine(new HttpClient(handlerMock.Object)); + + GetSessionResult result = await engine.GetSession(SdkId, _keyPair, new Uri(Constants.Api.DefaultYotiShareApiUrl), sessionId); + + Assert.IsNotNull(result); + Assert.AreEqual(sessionId, result.Id); + Assert.IsNull(result.QrCode); + Assert.IsNull(result.Receipt); + } + } +} diff --git a/test/Yoti.Auth.Tests/DigitalIdentityClientTests.cs b/test/Yoti.Auth.Tests/DigitalIdentityClientTests.cs new file mode 100644 index 000000000..805165dee --- /dev/null +++ b/test/Yoti.Auth.Tests/DigitalIdentityClientTests.cs @@ -0,0 +1,158 @@ +using System; +using System.IO; +using System.Net.Http; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Org.BouncyCastle.Crypto; +using Yoti.Auth.Tests.Common; + +namespace Yoti.Auth.Tests +{ + [TestClass] + public class DigitalIdentityClientTests + { + private const string _someSdkId = "some-sdk-id"; + private readonly Uri _expectedDefaultUri = new Uri(Constants.Api.DefaultYotiShareApiUrl); + + [TestInitialize] + public void BeforeTests() + { + Environment.SetEnvironmentVariable("YOTI_API_URL", null); + } + + [TestMethod] + public void NullSdkIdShouldThrowException() + { + StreamReader keystream = KeyPair.GetValidKeyStream(); + string sdkId = null; + Assert.ThrowsException(() => + { + new DigitalIdentityClient(sdkId, keystream); + }); + } + + [TestMethod] + public void EmptySdkIdShouldThrowException() + { + StreamReader keystream = KeyPair.GetValidKeyStream(); + string sdkId = string.Empty; + Assert.ThrowsException(() => + { + new DigitalIdentityClient(sdkId, keystream); + }); + } + + [TestMethod] + public void NoKeyStreamShouldThrowException() + { + StreamReader keystream = null; + Assert.ThrowsException(() => + { + new DigitalIdentityClient(_someSdkId, keystream); + }); + } + + [TestMethod] + public void InvalidKeyStreamShouldThrowException() + { + StreamReader keystream = KeyPair.GetInvalidFormatKeyStream(); + Assert.ThrowsException(() => + { + new DigitalIdentityClient(_someSdkId, keystream); + }); + } + + [TestMethod] + public void NullDynamicScenarioShouldThrowException() + { + DigitalIdentityClient client = CreateDigitalIdentityClient(); + + var aggregateException = Assert.ThrowsException(() => + { + client.CreateShareSession(null); + }); + + Assert.IsTrue(TestTools.Exceptions.IsExceptionInAggregateException(aggregateException)); + } + + [TestMethod] + public void EmptyReceiptShouldThrowException() + { + DigitalIdentityClient client = CreateDigitalIdentityClient(); + var aggregateException = Assert.ThrowsException(() => + { + client.GetShareReceipt(""); + }); + var status = + TestTools.Exceptions.IsExceptionInAggregateException(aggregateException); + Assert.IsTrue(!status); + } + + [DataTestMethod] + [DataRow("")] + [DataRow(null)] + public void ApiUriDefaultIsUsedForNullOrEmpty(string envVar) + { + Environment.SetEnvironmentVariable("YOTI_API_URL", envVar); + DigitalIdentityClient client = CreateDigitalIdentityClient(); + + Assert.AreEqual(_expectedDefaultUri, client.ApiUri); + } + + [TestMethod] + public void ApiUriOverriddenOverEnvVariable() + { + Uri overriddenApiUri = new Uri("https://overridden.com"); + Environment.SetEnvironmentVariable("YOTI_API_URL", "https://envapiuri.com"); + DigitalIdentityClient client = CreateDigitalIdentityClient(); + client.OverrideApiUri(overriddenApiUri); + + Assert.AreEqual(overriddenApiUri, client.ApiUri); + } + + [TestMethod] + public void ApiUriEnvVariableIsUsed() + { + Environment.SetEnvironmentVariable("YOTI_API_URL", "https://envapiuri.com"); + DigitalIdentityClient client = CreateDigitalIdentityClient(); + + Uri expectedApiUri = new Uri("https://envapiuri.com"); + Assert.AreEqual(expectedApiUri, client.ApiUri); + } + private static DigitalIdentityClient CreateDigitalIdentityClient() + { + StreamReader privateStreamKey = KeyPair.GetValidKeyStream(); + + return new DigitalIdentityClient(_someSdkId, privateStreamKey); + } + + [TestMethod] + public void ApiUriSetForPrivateKeyInitialisationHttpClient() + { + AsymmetricCipherKeyPair keyPair = KeyPair.Get(); + + DigitalIdentityClient yotiClient = new DigitalIdentityClient(new HttpClient(), _someSdkId, keyPair); + + Assert.AreEqual(_expectedDefaultUri, yotiClient.ApiUri); + } + + [TestMethod] + public void ApiUriSetForStreamInitialisation() + { + StreamReader privateStreamKey = KeyPair.GetValidKeyStream(); + + DigitalIdentityClient yotiClient = new DigitalIdentityClient(_someSdkId, privateStreamKey); + + Assert.AreEqual(_expectedDefaultUri, yotiClient.ApiUri); + } + + [TestMethod] + public void ApiUriSetForStreamInitialisationHttpClient() + { + StreamReader privateStreamKey = KeyPair.GetValidKeyStream(); + + DigitalIdentityClient yotiClient = new DigitalIdentityClient(new HttpClient(), _someSdkId, privateStreamKey); + + Assert.AreEqual(_expectedDefaultUri, yotiClient.ApiUri); + } + } +} diff --git a/test/Yoti.Auth.Tests/DigitalIdentityExceptionTests.cs b/test/Yoti.Auth.Tests/DigitalIdentityExceptionTests.cs new file mode 100644 index 000000000..c3bdf6608 --- /dev/null +++ b/test/Yoti.Auth.Tests/DigitalIdentityExceptionTests.cs @@ -0,0 +1,36 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using Yoti.Auth.Exceptions; + +namespace Yoti.Auth.Tests +{ + [TestClass] + public class DigitalIdentityExceptionTests + { + [TestMethod] + public void DigitalIdentityException_NoParameters_ErrorMessageIsNull() + { + + var exception = new DigitalIdentityException(); + Assert.IsNotNull(exception.Message); + } + + [TestMethod] + public void DigitalIdentityException_WithMessage_MessageIsSet() + { + var message = "Test message"; + var exception = new DigitalIdentityException(message); + Assert.AreEqual(message, exception.Message); + } + + [TestMethod] + public void DigitalIdentityException_WithMessageAndInnerException_MessageAndInnerExceptionAreSet() + { + var message = "Test message"; + var innerException = new Exception("Inner exception message"); + var exception = new DigitalIdentityException(message, innerException); + Assert.AreEqual(message, exception.Message); + Assert.AreEqual(innerException, exception.InnerException); + } + } +} diff --git a/test/Yoti.Auth.Tests/DocScan/.DS_Store b/test/Yoti.Auth.Tests/DocScan/.DS_Store deleted file mode 100644 index 35cfc3a98..000000000 Binary files a/test/Yoti.Auth.Tests/DocScan/.DS_Store and /dev/null differ diff --git a/test/Yoti.Auth.Tests/DocScan/DocScanClientTests.cs b/test/Yoti.Auth.Tests/DocScan/DocScanClientTests.cs index 944a6127d..243aec813 100644 --- a/test/Yoti.Auth.Tests/DocScan/DocScanClientTests.cs +++ b/test/Yoti.Auth.Tests/DocScan/DocScanClientTests.cs @@ -686,6 +686,37 @@ public void ShouldParseIdentityProfileResponse() Assert.AreEqual(mediaId, result.IdentityProfile.Report["media"]["id"]); } + + [TestMethod] + public void ShouldParseAdvancedIdentityProfileResponse() + { + string mediaId = "c69ff2db-6caf-4e74-8386-037711bbc8d7"; + string getSessionResult; + using (StreamReader r = File.OpenText("TestData/GetSessionResultWithAdvancedIdentityProfile.json")) + { + getSessionResult = r.ReadToEnd(); + } + + var successResponse = new HttpResponseMessage + { + StatusCode = HttpStatusCode.OK, + Content = new StringContent(getSessionResult), + }; + + Mock handlerMock = Auth.Tests.Common.Http.SetupMockMessageHandler(successResponse); + var httpClient = new HttpClient(handlerMock.Object); + + DocScanClient docScanClient = new DocScanClient(_sdkId, _keyPair, httpClient); + + GetSessionResult result = docScanClient.GetSession("some-session-id"); + + Assert.AreEqual("DONE", result.AdvancedIdentityProfile.Result); + Assert.AreEqual("someStringHere", result.AdvancedIdentityProfile.SubjectId); + Assert.AreEqual("MANDATORY_DOCUMENT_COULD_NOT_BE_PROVIDED", result.AdvancedIdentityProfile.FailureReason.ReasonCode); + + Assert.AreEqual("UK_TFIDA", result.AdvancedIdentityProfile.Report["compliance"][0]["trust_framework"]); + Assert.AreEqual(mediaId, result.AdvancedIdentityProfile.Report["media"]["id"].Value()); + } private DocScanClient SetupDocScanClient(dynamic responseContent) { diff --git a/test/Yoti.Auth.Tests/DocScan/Session/.DS_Store b/test/Yoti.Auth.Tests/DocScan/Session/.DS_Store deleted file mode 100644 index 3f7e57b3c..000000000 Binary files a/test/Yoti.Auth.Tests/DocScan/Session/.DS_Store and /dev/null differ diff --git a/test/Yoti.Auth.Tests/DocScan/Session/Create/.DS_Store b/test/Yoti.Auth.Tests/DocScan/Session/Create/.DS_Store deleted file mode 100644 index 415710a70..000000000 Binary files a/test/Yoti.Auth.Tests/DocScan/Session/Create/.DS_Store and /dev/null differ diff --git a/test/Yoti.Auth.Tests/DocScan/Session/Create/ApplicantProfileBuilderTests.cs b/test/Yoti.Auth.Tests/DocScan/Session/Create/ApplicantProfileBuilderTests.cs new file mode 100644 index 000000000..ceed7f898 --- /dev/null +++ b/test/Yoti.Auth.Tests/DocScan/Session/Create/ApplicantProfileBuilderTests.cs @@ -0,0 +1,86 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Newtonsoft.Json; +using Yoti.Auth.DocScan.Session.Create; + +namespace Yoti.Auth.Tests.DocScan.Session.Create +{ + [TestClass] + public class ApplicantProfileBuilderTests + { + [TestMethod] + public void ShouldBuildWithFullName() + { + var profile = new ApplicantProfileBuilder() + .WithFullName("John Doe") + .Build(); + + Assert.AreEqual("John Doe", profile.FullName); + } + + [TestMethod] + public void ShouldBuildWithDateOfBirth() + { + var profile = new ApplicantProfileBuilder() + .WithDateOfBirth("1988-11-02") + .Build(); + + Assert.AreEqual("1988-11-02", profile.DateOfBirth); + } + + [TestMethod] + public void ShouldBuildWithNamePrefix() + { + var profile = new ApplicantProfileBuilder() + .WithNamePrefix("Mr") + .Build(); + + Assert.AreEqual("Mr", profile.NamePrefix); + } + + [TestMethod] + public void ShouldBuildWithStructuredPostalAddress() + { + var address = new StructuredPostalAddressBuilder() + .WithBuildingNumber("74") + .WithPostalCode("E143RN") + .Build(); + + var profile = new ApplicantProfileBuilder() + .WithStructuredPostalAddress(address) + .Build(); + + Assert.AreEqual("74", profile.StructuredPostalAddress.BuildingNumber); + Assert.AreEqual("E143RN", profile.StructuredPostalAddress.PostalCode); + } + + [TestMethod] + public void ShouldCorrectlySerializeWithAllProperties() + { + var address = new StructuredPostalAddressBuilder() + .WithAddressFormat(1) + .WithBuildingNumber("74") + .WithAddressLine1("AddressLine1") + .WithTownCity("CityName") + .WithPostalCode("E143RN") + .WithCountryIso("GBR") + .WithCountry("United Kingdom") + .Build(); + + var profile = new ApplicantProfileBuilder() + .WithFullName("John Doe") + .WithDateOfBirth("1988-11-02") + .WithNamePrefix("Mr") + .WithStructuredPostalAddress(address) + .Build(); + + string json = JsonConvert.SerializeObject(profile); + + Assert.IsTrue(json.Contains("\"full_name\":\"John Doe\"")); + Assert.IsTrue(json.Contains("\"date_of_birth\":\"1988-11-02\"")); + Assert.IsTrue(json.Contains("\"name_prefix\":\"Mr\"")); + Assert.IsTrue(json.Contains("\"structured_postal_address\"")); + Assert.IsTrue(json.Contains("\"building_number\":\"74\"")); + Assert.IsTrue(json.Contains("\"country_iso\":\"GBR\"")); + } + } +} diff --git a/test/Yoti.Auth.Tests/DocScan/Session/Create/ResourceCreationContainerBuilderTests.cs b/test/Yoti.Auth.Tests/DocScan/Session/Create/ResourceCreationContainerBuilderTests.cs new file mode 100644 index 000000000..14518c437 --- /dev/null +++ b/test/Yoti.Auth.Tests/DocScan/Session/Create/ResourceCreationContainerBuilderTests.cs @@ -0,0 +1,74 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Newtonsoft.Json; +using Yoti.Auth.DocScan.Session.Create; + +namespace Yoti.Auth.Tests.DocScan.Session.Create +{ + [TestClass] + public class ResourceCreationContainerBuilderTests + { + [TestMethod] + public void ShouldBuildWithApplicantProfile() + { + var applicantProfile = new ApplicantProfileBuilder() + .WithFullName("John Doe") + .WithDateOfBirth("1988-11-02") + .Build(); + + ResourceCreationContainer container = + new ResourceCreationContainerBuilder() + .WithApplicantProfile(applicantProfile) + .Build(); + + Assert.AreEqual(applicantProfile, container.ApplicantProfile); + Assert.AreEqual("John Doe", container.ApplicantProfile.FullName); + Assert.AreEqual("1988-11-02", container.ApplicantProfile.DateOfBirth); + } + + [TestMethod] + public void ShouldCorrectlySerializeApplicantProfile() + { + var address = new StructuredPostalAddressBuilder() + .WithAddressFormat(1) + .WithBuildingNumber("74") + .WithAddressLine1("AddressLine1") + .WithTownCity("CityName") + .WithPostalCode("E143RN") + .WithCountryIso("GBR") + .WithCountry("United Kingdom") + .Build(); + + var applicantProfile = new ApplicantProfileBuilder() + .WithFullName("John Doe") + .WithDateOfBirth("1988-11-02") + .WithNamePrefix("Mr") + .WithStructuredPostalAddress(address) + .Build(); + + ResourceCreationContainer container = + new ResourceCreationContainerBuilder() + .WithApplicantProfile(applicantProfile) + .Build(); + + string json = JsonConvert.SerializeObject(container); + + Assert.IsTrue(json.Contains("\"applicant_profile\"")); + Assert.IsTrue(json.Contains("\"full_name\":\"John Doe\"")); + Assert.IsTrue(json.Contains("\"date_of_birth\":\"1988-11-02\"")); + Assert.IsTrue(json.Contains("\"name_prefix\":\"Mr\"")); + Assert.IsTrue(json.Contains("\"structured_postal_address\"")); + Assert.IsTrue(json.Contains("\"building_number\":\"74\"")); + Assert.IsTrue(json.Contains("\"country_iso\":\"GBR\"")); + } + + [TestMethod] + public void ShouldBuildWithNullApplicantProfile() + { + ResourceCreationContainer container = + new ResourceCreationContainerBuilder() + .Build(); + + Assert.IsNull(container.ApplicantProfile); + } + } +} diff --git a/test/Yoti.Auth.Tests/DocScan/Session/Create/SessionSpecificationBuilderTests.cs b/test/Yoti.Auth.Tests/DocScan/Session/Create/SessionSpecificationBuilderTests.cs index 9b332b150..871165a2c 100644 --- a/test/Yoti.Auth.Tests/DocScan/Session/Create/SessionSpecificationBuilderTests.cs +++ b/test/Yoti.Auth.Tests/DocScan/Session/Create/SessionSpecificationBuilderTests.cs @@ -163,6 +163,61 @@ public void ShoudBuildWithIdentityProfileRequirements() Assert.IsTrue(sessionSpecJson.Contains("BASIC")); } + [TestMethod] + public void ShoudBuildWithAdvancedIdentityProfileRequirements() + { + string advancedIdentityProfileJson = @" + { + ""profiles"": [ + { + ""trust_framework"": ""UK_TFIDA"", + ""schemes"": [ + { + ""label"": ""LB912"", + ""type"": ""RTW"" + }, + { + ""label"": ""LB777"", + ""type"": ""DBS"", + ""objective"": ""BASIC"" + } + ] + }, + { + ""trust_framework"": ""YOTI_GLOBAL"", + ""schemes"": [ + { + ""label"": ""LB321"", + ""type"": ""IDENTITY"", + ""objective"": ""AL_L1"", + ""config"": {} + } + ] + } + ] + }"; + + var sessionSpec = new SessionSpecificationBuilder() + .WithIdentityProfileRequirements(advancedIdentityProfileJson) + .Build(); + + string sessionSpecJson = JsonConvert.SerializeObject(sessionSpec); + Assert.IsTrue(sessionSpecJson.Contains("UK_TFIDA")); + Assert.IsTrue(sessionSpecJson.Contains("YOTI_GLOBAL")); + Assert.IsTrue(sessionSpecJson.Contains("IDENTITY")); + + } + + [TestMethod] + public void ShouldNotImplicitlySetAValueForAdvancedIdentityProfileRequirements() + { + SessionSpecification sessionSpec = + new SessionSpecificationBuilder() + .Build(); + + Assert.IsNull(sessionSpec.AdvancedIdentityProfileRequirements); + } + [TestMethod] public void ShoudBuildWithSubject() { @@ -287,6 +342,33 @@ public void ShouldBuildWithIdentityProfilePreview() Assert.AreEqual(identityProfileRequirements, sessionSpec.IdentityProfileRequirements); } + + [TestMethod] + public void ShouldBuildWithAdvancedIdentityProfilePreview() + { + object advancedIdentityProfileRequirements = IdentityProfiles.CreateStandardAdvancedIdentityProfileRequirements(); + + SessionSpecification sessionSpec = + new SessionSpecificationBuilder() + .WithAdvancedIdentityProfileRequirements(advancedIdentityProfileRequirements) + .WithCreateIdentityProfilePreview(true) + .Build(); + + Assert.AreEqual(advancedIdentityProfileRequirements, sessionSpec.AdvancedIdentityProfileRequirements); + } + + [TestMethod] + public void ShouldBuildWithAdvancedIdentityProfileRequirements() + { + object advancedIdentityProfileRequirements = IdentityProfiles.CreateStandardAdvancedIdentityProfileRequirements(); + + SessionSpecification sessionSpec = + new SessionSpecificationBuilder() + .WithAdvancedIdentityProfileRequirements(advancedIdentityProfileRequirements) + .Build(); + + Assert.AreEqual(advancedIdentityProfileRequirements, sessionSpec.AdvancedIdentityProfileRequirements); + } [TestMethod] public void ShouldNotImplicitlySetAValueForIdentityProfileRequirements() @@ -320,5 +402,62 @@ public void ShouldNotImplicitlySetAValueForSubject() Assert.IsNull(sessionSpec.Subject); } + + [TestMethod] + public void ShouldBuildWithResources() + { + var applicantProfile = new ApplicantProfileBuilder() + .WithFullName("John Doe") + .WithDateOfBirth("1988-11-02") + .Build(); + + ResourceCreationContainer resources = + new ResourceCreationContainerBuilder() + .WithApplicantProfile(applicantProfile) + .Build(); + + SessionSpecification sessionSpec = + new SessionSpecificationBuilder() + .WithResources(resources) + .Build(); + + Assert.AreEqual(resources, sessionSpec.Resources); + Assert.AreEqual("John Doe", sessionSpec.Resources.ApplicantProfile.FullName); + } + + [TestMethod] + public void ShouldNotImplicitlySetAValueForResources() + { + SessionSpecification sessionSpec = + new SessionSpecificationBuilder() + .Build(); + + Assert.IsNull(sessionSpec.Resources); + } + + [TestMethod] + public void ShouldCorrectlySerializeResources() + { + var applicantProfile = new ApplicantProfileBuilder() + .WithFullName("John Doe") + .WithDateOfBirth("1988-11-02") + .Build(); + + ResourceCreationContainer resources = + new ResourceCreationContainerBuilder() + .WithApplicantProfile(applicantProfile) + .Build(); + + SessionSpecification sessionSpec = + new SessionSpecificationBuilder() + .WithResources(resources) + .Build(); + + string json = JsonConvert.SerializeObject(sessionSpec); + + Assert.IsTrue(json.Contains("\"resources\":{\"applicant_profile\":{")); + Assert.IsTrue(json.Contains("\"full_name\":\"John Doe\"")); + Assert.IsTrue(json.Contains("\"date_of_birth\":\"1988-11-02\"")); + } } } \ No newline at end of file diff --git a/test/Yoti.Auth.Tests/DocScan/Session/Create/StructuredPostalAddressBuilderTests.cs b/test/Yoti.Auth.Tests/DocScan/Session/Create/StructuredPostalAddressBuilderTests.cs new file mode 100644 index 000000000..e9ca7d212 --- /dev/null +++ b/test/Yoti.Auth.Tests/DocScan/Session/Create/StructuredPostalAddressBuilderTests.cs @@ -0,0 +1,118 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Newtonsoft.Json; +using Yoti.Auth.DocScan.Session.Create; + +namespace Yoti.Auth.Tests.DocScan.Session.Create +{ + [TestClass] + public class StructuredPostalAddressBuilderTests + { + [TestMethod] + public void ShouldBuildWithAddressFormat() + { + var address = new StructuredPostalAddressBuilder() + .WithAddressFormat(1) + .Build(); + + Assert.AreEqual(1, address.AddressFormat); + } + + [TestMethod] + public void ShouldBuildWithBuildingNumber() + { + var address = new StructuredPostalAddressBuilder() + .WithBuildingNumber("74") + .Build(); + + Assert.AreEqual("74", address.BuildingNumber); + } + + [TestMethod] + public void ShouldBuildWithAddressLine1() + { + var address = new StructuredPostalAddressBuilder() + .WithAddressLine1("AddressLine1") + .Build(); + + Assert.AreEqual("AddressLine1", address.AddressLine1); + } + + [TestMethod] + public void ShouldBuildWithTownCity() + { + var address = new StructuredPostalAddressBuilder() + .WithTownCity("CityName") + .Build(); + + Assert.AreEqual("CityName", address.TownCity); + } + + [TestMethod] + public void ShouldBuildWithPostalCode() + { + var address = new StructuredPostalAddressBuilder() + .WithPostalCode("E143RN") + .Build(); + + Assert.AreEqual("E143RN", address.PostalCode); + } + + [TestMethod] + public void ShouldBuildWithCountryIso() + { + var address = new StructuredPostalAddressBuilder() + .WithCountryIso("GBR") + .Build(); + + Assert.AreEqual("GBR", address.CountryIso); + } + + [TestMethod] + public void ShouldBuildWithCountry() + { + var address = new StructuredPostalAddressBuilder() + .WithCountry("United Kingdom") + .Build(); + + Assert.AreEqual("United Kingdom", address.Country); + } + + [TestMethod] + public void ShouldBuildWithFormattedAddress() + { + var formattedAddress = "74\nAddressLine1\nCityName\nE143RN\nGBR"; + + var address = new StructuredPostalAddressBuilder() + .WithFormattedAddress(formattedAddress) + .Build(); + + Assert.AreEqual(formattedAddress, address.FormattedAddress); + } + + [TestMethod] + public void ShouldCorrectlySerializeAllProperties() + { + var address = new StructuredPostalAddressBuilder() + .WithAddressFormat(1) + .WithBuildingNumber("74") + .WithAddressLine1("AddressLine1") + .WithTownCity("CityName") + .WithPostalCode("E143RN") + .WithCountryIso("GBR") + .WithCountry("United Kingdom") + .WithFormattedAddress("74\nAddressLine1\nCityName\nE143RN\nGBR") + .Build(); + + string json = JsonConvert.SerializeObject(address); + + Assert.IsTrue(json.Contains("\"address_format\":1")); + Assert.IsTrue(json.Contains("\"building_number\":\"74\"")); + Assert.IsTrue(json.Contains("\"address_line1\":\"AddressLine1\"")); + Assert.IsTrue(json.Contains("\"town_city\":\"CityName\"")); + Assert.IsTrue(json.Contains("\"postal_code\":\"E143RN\"")); + Assert.IsTrue(json.Contains("\"country_iso\":\"GBR\"")); + Assert.IsTrue(json.Contains("\"country\":\"United Kingdom\"")); + Assert.IsTrue(json.Contains("\"formatted_address\"")); + } + } +} diff --git a/test/Yoti.Auth.Tests/DocScan/Session/Retrieve/GetSessionResultTests.cs b/test/Yoti.Auth.Tests/DocScan/Session/Retrieve/GetSessionResultTests.cs index 8f73dafcb..bdf2cb561 100644 --- a/test/Yoti.Auth.Tests/DocScan/Session/Retrieve/GetSessionResultTests.cs +++ b/test/Yoti.Auth.Tests/DocScan/Session/Retrieve/GetSessionResultTests.cs @@ -4,6 +4,8 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using Newtonsoft.Json; using Yoti.Auth.DocScan.Session.Retrieve; +using Yoti.Auth.DocScan.Session.Retrieve.AdvancedIdentityProfile; +using Yoti.Auth.DocScan.Session.Retrieve.AdvancedIdentityProfilePreview; using Yoti.Auth.DocScan.Session.Retrieve.Check; using Yoti.Auth.DocScan.Session.Retrieve.IdentityProfilePreview; @@ -346,6 +348,21 @@ public void CheckIdentityProfilePreviewResponseIsParsed() AssertMediaValuesCorrect(identityProfilePreviewResponse.media, response.Media, typeof(MediaResponse)); } + + [TestMethod] + public void CheckAdvancedIdentityProfilePreviewResponseIsParsed() + { + dynamic advancedIdentityProfilePreviewResponse = new + { + media = GetMediaResponse() + }; + + string json = JsonConvert.SerializeObject(advancedIdentityProfilePreviewResponse); + AdvancedIdentityProfilePreviewResponse response = + JsonConvert.DeserializeObject(json); + + AssertMediaValuesCorrect(advancedIdentityProfilePreviewResponse.media, response.Media, typeof(MediaResponse)); + } private void AssertMediaValuesCorrect(dynamic originalData, MediaResponse response, Type requiredType) { diff --git a/test/Yoti.Auth.Tests/DocScan/Session/Retrieve/IdentityProfile/FailureReasonResponseTest.cs b/test/Yoti.Auth.Tests/DocScan/Session/Retrieve/IdentityProfile/FailureReasonResponseTest.cs new file mode 100644 index 000000000..505e255c1 --- /dev/null +++ b/test/Yoti.Auth.Tests/DocScan/Session/Retrieve/IdentityProfile/FailureReasonResponseTest.cs @@ -0,0 +1,39 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Newtonsoft.Json; +using System.Collections.Generic; + +namespace Yoti.Auth.DocScan.Session.Retrieve.IdentityProfile.Tests +{ + [TestClass] + public class FailureReasonResponseTests + { + [TestMethod] + public void Deserialize_ValidJson_CreatesFailureReasonResponse() + { + // Arrange + var json = @" + { + ""reason_code"": ""CODE123"", + ""requirements_not_met_details"": { + ""failure_type"": ""DOCUMENT_EXPIRED"", + ""details"": ""The document has expired."", + ""audit_id"": ""AUDIT123"", + ""document_country_iso_code"": ""USA"", + ""document_type"": ""PASSPORT"" + } + }"; + + var response = JsonConvert.DeserializeObject(json); + + Assert.IsNotNull(response); + Assert.AreEqual("CODE123", response.ReasonCode); + Assert.IsNotNull(response.RequirementNotMetDetails); + Assert.AreEqual("DOCUMENT_EXPIRED", response.RequirementNotMetDetails.FailureType); + Assert.AreEqual("The document has expired.", response.RequirementNotMetDetails.Details); + Assert.AreEqual("AUDIT123", response.RequirementNotMetDetails.AuditId); + Assert.AreEqual("USA", response.RequirementNotMetDetails.DocumentCountryIsoCode); + Assert.AreEqual("PASSPORT", response.RequirementNotMetDetails.DocumentType); + } + } + +} diff --git a/test/Yoti.Auth.Tests/DocScan/Session/Retrieve/Resource/ApplicantProfileResourceResponseTests.cs b/test/Yoti.Auth.Tests/DocScan/Session/Retrieve/Resource/ApplicantProfileResourceResponseTests.cs new file mode 100644 index 000000000..a2a8156ab --- /dev/null +++ b/test/Yoti.Auth.Tests/DocScan/Session/Retrieve/Resource/ApplicantProfileResourceResponseTests.cs @@ -0,0 +1,114 @@ +using System; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Newtonsoft.Json; +using Yoti.Auth.DocScan.Session.Retrieve; +using Yoti.Auth.DocScan.Session.Retrieve.Resource; + +namespace Yoti.Auth.Tests.DocScan.Session.Retrieve.Resource +{ + [TestClass] + public class ApplicantProfileResourceResponseTests + { + private const string ApplicantProfileJson = @"{ + ""resources"": { + ""applicant_profiles"": [ + { + ""id"": ""3fa85f64-5717-4562-b3fc-2c963f66afa6"", + ""source"": { + ""type"": ""END_USER"" + }, + ""media"": { + ""id"": ""media-id-123"", + ""type"": ""IMAGE"", + ""created"": ""2021-06-11T11:39:24Z"", + ""last_updated"": ""2021-06-11T11:39:24Z"" + }, + ""created_at"": ""2021-06-11T11:39:24Z"", + ""last_updated"": ""2021-06-11T12:00:00Z"", + ""tasks"": [] + } + ] + } + }"; + + [TestMethod] + public void ShouldDeserializeApplicantProfilesFromGetSessionResult() + { + var result = JsonConvert.DeserializeObject(ApplicantProfileJson); + + Assert.IsNotNull(result.Resources); + Assert.IsNotNull(result.Resources.ApplicantProfiles); + Assert.AreEqual(1, result.Resources.ApplicantProfiles.Count); + } + + [TestMethod] + public void ShouldDeserializeApplicantProfileId() + { + var result = JsonConvert.DeserializeObject(ApplicantProfileJson); + + var applicantProfile = result.Resources.ApplicantProfiles[0]; + Assert.AreEqual("3fa85f64-5717-4562-b3fc-2c963f66afa6", applicantProfile.Id); + } + + [TestMethod] + public void ShouldDeserializeApplicantProfileSource() + { + var result = JsonConvert.DeserializeObject(ApplicantProfileJson); + + var applicantProfile = result.Resources.ApplicantProfiles[0]; + Assert.IsNotNull(applicantProfile.Source); + Assert.AreEqual("END_USER", applicantProfile.Source.Type); + } + + [TestMethod] + public void ShouldDeserializeApplicantProfileMedia() + { + var result = JsonConvert.DeserializeObject(ApplicantProfileJson); + + var applicantProfile = result.Resources.ApplicantProfiles[0]; + Assert.IsNotNull(applicantProfile.Media); + Assert.AreEqual("media-id-123", applicantProfile.Media.Id); + Assert.AreEqual("IMAGE", applicantProfile.Media.Type); + } + + [TestMethod] + public void ShouldDeserializeApplicantProfileCreatedAt() + { + var result = JsonConvert.DeserializeObject(ApplicantProfileJson); + + var applicantProfile = result.Resources.ApplicantProfiles[0]; + Assert.IsNotNull(applicantProfile.CreatedAt); + Assert.AreEqual(new DateTime(2021, 6, 11, 11, 39, 24, DateTimeKind.Utc), applicantProfile.CreatedAt.Value); + } + + [TestMethod] + public void ShouldDeserializeApplicantProfileLastUpdated() + { + var result = JsonConvert.DeserializeObject(ApplicantProfileJson); + + var applicantProfile = result.Resources.ApplicantProfiles[0]; + Assert.IsNotNull(applicantProfile.LastUpdated); + Assert.AreEqual(new DateTime(2021, 6, 11, 12, 0, 0, DateTimeKind.Utc), applicantProfile.LastUpdated.Value); + } + + [TestMethod] + public void ShouldDeserializeApplicantProfileTasks() + { + var result = JsonConvert.DeserializeObject(ApplicantProfileJson); + + var applicantProfile = result.Resources.ApplicantProfiles[0]; + Assert.IsNotNull(applicantProfile.Tasks); + Assert.AreEqual(0, applicantProfile.Tasks.Count); + } + + [TestMethod] + public void ShouldHandleNullApplicantProfiles() + { + const string jsonWithoutApplicantProfiles = @"{ ""resources"": {} }"; + var result = JsonConvert.DeserializeObject(jsonWithoutApplicantProfiles); + + Assert.IsNotNull(result.Resources); + Assert.IsNull(result.Resources.ApplicantProfiles); + } + } +} diff --git a/test/Yoti.Auth.Tests/DocScan/Session/Retrieve/Resource/ShareCodeResourceResponseTests.cs b/test/Yoti.Auth.Tests/DocScan/Session/Retrieve/Resource/ShareCodeResourceResponseTests.cs new file mode 100644 index 000000000..e5b9f4399 --- /dev/null +++ b/test/Yoti.Auth.Tests/DocScan/Session/Retrieve/Resource/ShareCodeResourceResponseTests.cs @@ -0,0 +1,158 @@ +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Yoti.Auth.DocScan.Session.Retrieve; +using Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.Source; +using Yoti.Auth.DocScan.Session.Retrieve.Resource; +using Yoti.Auth.DocScan.Session.Retrieve.Task; + +namespace Yoti.Auth.Tests.DocScan.Session.Retrieve.Resource +{ + [TestClass] + public class ShareCodeResourceResponseTests + { + [TestMethod] + public void ShouldFilterVerifyShareCodeTasks() + { + var tasks = new List + { + new VerifyShareCodeTaskResponse(), + new TaskResponse() + }; + + var shareCodes = new List + { + new ShareCodeResourceResponse { Tasks = tasks } + }; + + GetSessionResult getSessionResult = new GetSessionResult + { + Resources = new ResourceContainer { ShareCodes = shareCodes } + }; + + var result = getSessionResult.Resources.ShareCodes.Single(); + + Assert.AreEqual(2, result.Tasks.Count); + Assert.AreEqual(1, result.GetVerifyShareCodeTasks().Count); + } + + [TestMethod] + public void ShouldReturnEmptyListWhenNoVerifyShareCodeTasks() + { + var shareCodes = new List + { + new ShareCodeResourceResponse { Tasks = null } + }; + + GetSessionResult getSessionResult = new GetSessionResult + { + Resources = new ResourceContainer { ShareCodes = shareCodes } + }; + + var result = getSessionResult.Resources.ShareCodes.Single(); + + Assert.IsNull(result.Tasks); + Assert.AreEqual(0, result.GetVerifyShareCodeTasks().Count); + } + + [TestMethod] + public void ShouldReturnEmptyListForEmptyVerifyShareCodeTaskResponse() + { + var shareCodes = new List + { + new ShareCodeResourceResponse { Tasks = new List() } + }; + + GetSessionResult getSessionResult = new GetSessionResult + { + Resources = new ResourceContainer { ShareCodes = shareCodes } + }; + + CollectionAssert.AreEqual( + new List(), + getSessionResult.Resources.ShareCodes.Single().GetVerifyShareCodeTasks()); + } + + [TestMethod] + public void ShouldReturnEmptyListForSingleParentVerifyShareCodeTaskResponse() + { + var tasks = new List + { + new TaskResponse() + }; + + var shareCodes = new List + { + new ShareCodeResourceResponse { Tasks = tasks } + }; + + GetSessionResult getSessionResult = new GetSessionResult + { + Resources = new ResourceContainer { ShareCodes = shareCodes } + }; + + var result = getSessionResult.Resources.ShareCodes.Single(); + + Assert.AreEqual(1, result.Tasks.Count); + Assert.AreEqual(0, result.GetVerifyShareCodeTasks().Count); + } + + [TestMethod] + public void ShouldReturnCorrectShareCodeResourceProperties() + { + var lookupMedia = new ShareCodeMediaResponse(); + var returnedMedia = new ShareCodeMediaResponse(); + var idPhotoMedia = new ShareCodeMediaResponse(); + var fileMedia = new ShareCodeMediaResponse(); + var source = new EndUserAllowedSourceResponse(); + + var shareCode = new ShareCodeResourceResponse + { + Source = source, + CreatedAt = "2026-01-01T00:00:00Z", + LastUpdated = "2026-01-02T00:00:00Z", + LookupProfile = lookupMedia, + ReturnedProfile = returnedMedia, + IdPhoto = idPhotoMedia, + File = fileMedia, + }; + + Assert.AreEqual(source, shareCode.Source); + Assert.AreEqual("2026-01-01T00:00:00Z", shareCode.CreatedAt); + Assert.AreEqual("2026-01-02T00:00:00Z", shareCode.LastUpdated); + Assert.IsNotNull(shareCode.LookupProfile); + Assert.IsNotNull(shareCode.ReturnedProfile); + Assert.IsNotNull(shareCode.IdPhoto); + Assert.IsNotNull(shareCode.File); + } + + [TestMethod] + public void ShouldDeserializeShareCodeFromJson() + { + var shareCodes = new List + { + new ShareCodeResourceResponse + { + Source = new EndUserAllowedSourceResponse(), + CreatedAt = "2026-01-01T00:00:00Z", + LastUpdated = "2026-01-02T00:00:00Z", + Tasks = new List + { + new VerifyShareCodeTaskResponse() + } + } + }; + + GetSessionResult getSessionResult = new GetSessionResult + { + Resources = new ResourceContainer { ShareCodes = shareCodes } + }; + + string json = Newtonsoft.Json.JsonConvert.SerializeObject(getSessionResult); + GetSessionResult deserialized = Newtonsoft.Json.JsonConvert.DeserializeObject(json); + + Assert.IsNotNull(deserialized.Resources.ShareCodes); + Assert.AreEqual(1, deserialized.Resources.ShareCodes.Count); + } + } +} diff --git a/test/Yoti.Auth.Tests/DocScan/Session/Retrieve/Task/VerifyShareCodeTaskResponseTests.cs b/test/Yoti.Auth.Tests/DocScan/Session/Retrieve/Task/VerifyShareCodeTaskResponseTests.cs new file mode 100644 index 000000000..25f5aeeb4 --- /dev/null +++ b/test/Yoti.Auth.Tests/DocScan/Session/Retrieve/Task/VerifyShareCodeTaskResponseTests.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Newtonsoft.Json; +using Yoti.Auth.Constants; +using Yoti.Auth.DocScan.Session.Retrieve; +using Yoti.Auth.DocScan.Session.Retrieve.Resource; +using Yoti.Auth.DocScan.Session.Retrieve.Task; + +namespace Yoti.Auth.Tests.DocScan.Session.Retrieve.Task +{ + [TestClass] + public class VerifyShareCodeTaskResponseTests + { + [DataTestMethod] + [DataRow(DocScanConstants.VerifyShareCodeTask, typeof(VerifyShareCodeTaskResponse))] + [DataRow("OTHER", typeof(TaskResponse))] + [DataRow("", typeof(TaskResponse))] + [DataRow(null, typeof(TaskResponse))] + public void VerifyShareCodeTaskResponsesAreParsed(string taskTypeString, Type expectedType) + { + var tasks = new List + { + new TaskResponse + { + Id = "someId", + Type = taskTypeString + } + }; + + var shareCodes = new List + { + new ShareCodeResourceResponse { Tasks = tasks } + }; + + var initialGetSessionResult = new GetSessionResult + { + Resources = new ResourceContainer { ShareCodes = shareCodes } + }; + + string json = JsonConvert.SerializeObject(initialGetSessionResult); + + GetSessionResult getSessionResultWithConverter = + JsonConvert.DeserializeObject(json); + + Assert.IsInstanceOfType( + getSessionResultWithConverter.Resources.ShareCodes.Single().Tasks.Single(), + expectedType); + } + } +} diff --git a/test/Yoti.Auth.Tests/ShareUrl/DynamicScenarioBuilderTests.cs b/test/Yoti.Auth.Tests/ShareUrl/DynamicScenarioBuilderTests.cs index 22781fb6b..3bdb9fec9 100644 --- a/test/Yoti.Auth.Tests/ShareUrl/DynamicScenarioBuilderTests.cs +++ b/test/Yoti.Auth.Tests/ShareUrl/DynamicScenarioBuilderTests.cs @@ -37,6 +37,7 @@ public void ShouldBuildADynamicScenario() .WithPolicy(somePolicy) .WithExtension(extension1) .WithExtension(extension2) + .WithSubject(someSubject) .Build(); @@ -67,4 +68,4 @@ public void ShouldBuildADynamicScenario() Assert.AreEqual(expectedJson, serializedScenario); } } -} \ No newline at end of file +} diff --git a/test/Yoti.Auth.Tests/ShareUrl/Policy/DynamicPolicyBuilderTests.cs b/test/Yoti.Auth.Tests/ShareUrl/Policy/DynamicPolicyBuilderTests.cs index 8d4f87c13..d65f4d1b7 100644 --- a/test/Yoti.Auth.Tests/ShareUrl/Policy/DynamicPolicyBuilderTests.cs +++ b/test/Yoti.Auth.Tests/ShareUrl/Policy/DynamicPolicyBuilderTests.cs @@ -325,5 +325,18 @@ public void ShouldBuildWithIdentityProfileRequirements() Assert.AreEqual(identityProfileRequirements, result.IdentityProfileRequirements); } + + [TestMethod] + public void ShouldBuildWithAdvancedIdentityProfileRequirements() + { + object advancedIdentityProfileRequirements = + IdentityProfiles.CreateStandardAdvancedIdentityProfileRequirements(); + + DynamicPolicy result = new DynamicPolicyBuilder() + .WithAdvancedIdentityProfileRequirements(advancedIdentityProfileRequirements) + .Build(); + + Assert.AreEqual(advancedIdentityProfileRequirements, result.AdvancedIdentityProfileRequirements); + } } } \ No newline at end of file diff --git a/test/Yoti.Auth.Tests/ShareUrl/Policy/WantedAttributeBuilderTests.cs b/test/Yoti.Auth.Tests/ShareUrl/Policy/WantedAttributeBuilderTests.cs index b39fead0b..733871f0f 100644 --- a/test/Yoti.Auth.Tests/ShareUrl/Policy/WantedAttributeBuilderTests.cs +++ b/test/Yoti.Auth.Tests/ShareUrl/Policy/WantedAttributeBuilderTests.cs @@ -10,6 +10,7 @@ public class WantedAttributeBuilderTests { private const string _someName = "some name"; private const string _someDerivation = "some derivation"; + private const bool _someOptional = true; [TestMethod] public void BuildsAnAttribute() @@ -22,11 +23,13 @@ public void BuildsAnAttribute() .WithName(_someName) .WithDerivation(_someDerivation) .WithConstraint(sourceConstraint) + .WithOptional(_someOptional) .Build(); Assert.AreEqual(1, result.Constraints.Count); Assert.AreEqual(_someName, result.Name); Assert.AreEqual(_someDerivation, result.Derivation); + Assert.AreEqual(_someOptional, result.Optional); } [TestMethod] @@ -34,9 +37,11 @@ public void ShouldSetAcceptSelfAssertedToNullByDefault() { WantedAttribute result = new WantedAttributeBuilder() .WithName("name") + .WithOptional(true) .Build(); Assert.AreEqual(null, result.AcceptSelfAsserted); + Assert.AreEqual(true, result.Optional); } [TestMethod] @@ -161,4 +166,4 @@ public void WithConstraintsShouldOverrideCurrentConstraint() Assert.AreEqual("DRIVING_LICENCE", result.PreferredSources.WantedAnchors[0].Name); } } -} \ No newline at end of file +} diff --git a/test/Yoti.Auth.Tests/TestData/DigitalIdentity.json b/test/Yoti.Auth.Tests/TestData/DigitalIdentity.json new file mode 100644 index 000000000..1aa053d81 --- /dev/null +++ b/test/Yoti.Auth.Tests/TestData/DigitalIdentity.json @@ -0,0 +1,52 @@ +{ + "policy": { + "wanted": [ + { + "name": "date_of_birth" + }, + { + "name": "date_of_birth", + "derivation": "age_over:18" + }, + { + "name": "date_of_birth", + "derivation": "age_under:30" + }, + { + "name": "date_of_birth", + "derivation": "age_under:40" + } + ], + "wanted_auth_types": [ 2 ], + "wanted_remember_me": false, + "wanted_remember_me_optional": false, + "identity_profile_requirements": { + "trust_framework": "UK_TFIDA", + "scheme": { + "type": "DBS", + "objective": "STANDARD" + } + } + }, + "extensions": [ + { + "content": "content", + "type": "string type" + }, + { + "content": { + "expected_device_location": { + "latitude": 51.5044772, + "longitude": -0.082161, + "radius": 1500.0, + "max_uncertainty_radius": 300.0 + } + }, + "type": "LOCATION_CONSTRAINT" + } + ], + "subject": { + "subject_id": "some_subject_id_string" + }, + "redirectUri": "someEndpoint" +} diff --git a/test/Yoti.Auth.Tests/TestData/DynamicPolicy.json b/test/Yoti.Auth.Tests/TestData/DynamicPolicy.json index 86b8ba46f..e65922887 100644 --- a/test/Yoti.Auth.Tests/TestData/DynamicPolicy.json +++ b/test/Yoti.Auth.Tests/TestData/DynamicPolicy.json @@ -8,18 +8,15 @@ }, { "name": "date_of_birth", - "derivation": "age_over:18", - "optional": false + "derivation": "age_over:18" }, { "name": "date_of_birth", - "derivation": "age_under:30", - "optional": false + "derivation": "age_under:30" }, { "name": "date_of_birth", - "derivation": "age_under:40", - "optional": false + "derivation": "age_under:40" } ], "wanted_auth_types": [ 2 ], @@ -53,4 +50,4 @@ "subject": { "subject_id": "some_subject_id_string" } -} \ No newline at end of file +} diff --git a/test/Yoti.Auth.Tests/TestData/GetSessionResultWithAdvancedIdentityProfile.json b/test/Yoti.Auth.Tests/TestData/GetSessionResultWithAdvancedIdentityProfile.json new file mode 100644 index 000000000..80791cd98 --- /dev/null +++ b/test/Yoti.Auth.Tests/TestData/GetSessionResultWithAdvancedIdentityProfile.json @@ -0,0 +1,42 @@ +{ + "session_id": "a1746488-efcc-4c59-bd28-f849dcb933a2", + "client_session_token_ttl": 599, + "user_tracking_id": "user-tracking-id", + "biometric_consent": "2022-03-29T11:39:08.473Z", + "state": "COMPLETED", + "client_session_token": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "advanced_identity_profile": { + "subject_id": "someStringHere", + "result": "DONE", + "failure_reason": { + "reason_code": "MANDATORY_DOCUMENT_COULD_NOT_BE_PROVIDED" + }, + "identity_profile_report": { + "compliance": [{ + "trust_framework": "UK_TFIDA", + "schemes_compliance": [{ + "scheme": { + "type": "DBS", + "objective": "STANDARD" + }, + "requirements_met": true, + "requirements_not_met_info": "some string here" + }] + }], + "media": { + "id": "c69ff2db-6caf-4e74-8386-037711bbc8d7", + "type": "IMAGE", + "created": "2022-03-29T11:39:24Z", + "last_updated": "2022-03-29T11:39:24Z" + } + } + }, + "advanced_identity_profile_preview": { + "media": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "type": "IMAGE", + "created": "2021-06-11T11:39:24Z", + "last_updated": "2021-06-11T11:39:24Z" + } + } +} \ No newline at end of file diff --git a/test/Yoti.Auth.Tests/TestData/IdentityProfiles.cs b/test/Yoti.Auth.Tests/TestData/IdentityProfiles.cs index 5d81d7a7b..1ad071051 100644 --- a/test/Yoti.Auth.Tests/TestData/IdentityProfiles.cs +++ b/test/Yoti.Auth.Tests/TestData/IdentityProfiles.cs @@ -1,4 +1,7 @@ -namespace Yoti.Auth.Tests.TestData +using Newtonsoft.Json; +using Yoti.Auth.DigitalIdentity.Policy; + +namespace Yoti.Auth.Tests.TestData { internal static class IdentityProfiles { @@ -14,6 +17,42 @@ public static object CreateStandardIdentityProfileRequirements() } }; } + + public static AdvancedIdentityProfile CreateAdvancedIdentityProfileRequirements() + { + string advancedIdentityProfileJson = @" + { + ""profiles"": [ + { + ""trust_framework"": ""UK_TFIDA"", + ""schemes"": [ + { + ""label"": ""LB912"", + ""type"": ""RTW"" + }, + { + ""label"": ""LB777"", + ""type"": ""DBS"", + ""objective"": ""BASIC"" + } + ] + }, + { + ""trust_framework"": ""YOTI_GLOBAL"", + ""schemes"": [ + { + ""label"": ""LB321"", + ""type"": ""IDENTITY"", + ""objective"": ""AL_L1"", + ""config"": {} + } + ] + } + ] + }"; + var advancedIdentityProfile = JsonConvert.DeserializeObject(advancedIdentityProfileJson); + return advancedIdentityProfile; + } public static object CreateStandardSubject() { @@ -22,5 +61,41 @@ public static object CreateStandardSubject() subject_id = "some_subject_id_string" }; } + + public static object CreateStandardAdvancedIdentityProfileRequirements() + { + string advancedIdentityProfileJson = @" + { + ""profiles"": [ + { + ""trust_framework"": ""UK_TFIDA"", + ""schemes"": [ + { + ""label"": ""LB912"", + ""type"": ""RTW"" + }, + { + ""label"": ""LB777"", + ""type"": ""DBS"", + ""objective"": ""BASIC"" + } + ] + }, + { + ""trust_framework"": ""YOTI_GLOBAL"", + ""schemes"": [ + { + ""label"": ""LB321"", + ""type"": ""IDENTITY"", + ""objective"": ""AL_L1"", + ""config"": {} + } + ] + } + ] + }"; + + return advancedIdentityProfileJson; + } } } diff --git a/test/Yoti.Auth.Tests/TestTools/CreateQr.cs b/test/Yoti.Auth.Tests/TestTools/CreateQr.cs new file mode 100644 index 000000000..0474d4303 --- /dev/null +++ b/test/Yoti.Auth.Tests/TestTools/CreateQr.cs @@ -0,0 +1,15 @@ +using Yoti.Auth.ShareUrl; +using Yoti.Auth.DigitalIdentity.Policy; +using Yoti.Auth.Tests.TestData; +using Yoti.Auth.DigitalIdentity; + +namespace Yoti.Auth.Tests.TestTools +{ + internal static class CreateQr + { + public static QrRequest CreateQrStandard() + { + return new QrRequest(); + } + } +} diff --git a/test/Yoti.Auth.Tests/TestTools/ShareSession.cs b/test/Yoti.Auth.Tests/TestTools/ShareSession.cs new file mode 100644 index 000000000..7be4792a6 --- /dev/null +++ b/test/Yoti.Auth.Tests/TestTools/ShareSession.cs @@ -0,0 +1,27 @@ +using Yoti.Auth.ShareUrl; +using Yoti.Auth.DigitalIdentity.Policy; +using Yoti.Auth.Tests.TestData; +using Yoti.Auth.DigitalIdentity; + +namespace Yoti.Auth.Tests.TestTools +{ + internal static class ShareSession + { + public static ShareSessionRequest CreateStandardShareSessionRequest() + { + return new ShareSessionRequest(CreateStandardPolicy(), "redirecturi"); + } + + public static Policy CreateStandardPolicy() + { + return new PolicyBuilder() + .WithDateOfBirth() + .WithAgeOver(18) + .WithAgeUnder(30) + .WithAgeUnder(40) + .WithPinAuthentication(true) + .WithIdentityProfileRequirements(IdentityProfiles.CreateStandardIdentityProfileRequirements()) + .Build(); + } + } +} diff --git a/test/Yoti.Auth.Tests/Yoti.Auth.Tests.csproj b/test/Yoti.Auth.Tests/Yoti.Auth.Tests.csproj index cc28ada40..9f8e3811c 100644 --- a/test/Yoti.Auth.Tests/Yoti.Auth.Tests.csproj +++ b/test/Yoti.Auth.Tests/Yoti.Auth.Tests.csproj @@ -1,7 +1,7 @@ - netcoreapp3.1 + net8.0 Yoti.Auth.Tests Yoti.Auth.Tests true @@ -28,7 +28,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive @@ -36,9 +36,12 @@ - + + + + PreserveNewest @@ -67,5 +70,14 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + \ No newline at end of file diff --git a/test/Yoti.Auth.Tests/coverage.opencover.xml b/test/Yoti.Auth.Tests/coverage.opencover.xml new file mode 100644 index 000000000..3e821d9de --- /dev/null +++ b/test/Yoti.Auth.Tests/coverage.opencover.xml @@ -0,0 +1,24409 @@ + + + + + + Yoti.Auth.Tests.Common.dll + 2026-03-11T03:48:39 + Yoti.Auth.Tests.Common + + + + + + + + Yoti.Auth.Tests.Common.Http + + + + + Moq.Mock`1<System.Net.Http.HttpMessageHandler> Yoti.Auth.Tests.Common.Http::SetupMockMessageHandler(System.Net.Http.HttpResponseMessage) + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.Tests.Common.KeyPair + + + + + Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair Yoti.Auth.Tests.Common.KeyPair::Get() + + + + + + + + + + + + + Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair Yoti.Auth.Tests.Common.KeyPair::GetInvalidKeyPair() + + + + + + + + + + + + + System.IO.StreamReader Yoti.Auth.Tests.Common.KeyPair::GetValidKeyStream() + + + + + + + + + + + System.IO.StreamReader Yoti.Auth.Tests.Common.KeyPair::GetInvalidFormatKeyStream() + + + + + + + + + + + + + Yoti.Auth.dll + 2026-03-11T03:48:39 + Yoti.Auth + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Yoti.DigitalIdentity.RequirementNotMetDetails + + + + + System.String Yoti.DigitalIdentity.RequirementNotMetDetails::get_FailureType() + + + + + + + + + + + System.String Yoti.DigitalIdentity.RequirementNotMetDetails::get_Details() + + + + + + + + + + + System.String Yoti.DigitalIdentity.RequirementNotMetDetails::get_AuditId() + + + + + + + + + + + System.String Yoti.DigitalIdentity.RequirementNotMetDetails::get_DocumentCountryIsoCode() + + + + + + + + + + + System.String Yoti.DigitalIdentity.RequirementNotMetDetails::get_DocumentType() + + + + + + + + + + + + Yoti.Auth.ActivityDetails + + + + + System.String Yoti.Auth.ActivityDetails::get_RememberMeId() + + + + + + + + + + + System.String Yoti.Auth.ActivityDetails::get_ParentRememberMeId() + + + + + + + + + + + System.Nullable`1<System.DateTime> Yoti.Auth.ActivityDetails::get_Timestamp() + + + + + + + + + + + Yoti.Auth.Profile.YotiProfile Yoti.Auth.ActivityDetails::get_Profile() + + + + + + + + + + + Yoti.Auth.Profile.ApplicationProfile Yoti.Auth.ActivityDetails::get_ApplicationProfile() + + + + + + + + + + + System.String Yoti.Auth.ActivityDetails::get_ReceiptId() + + + + + + + + + + + Yoti.Auth.Share.ExtraData Yoti.Auth.ActivityDetails::get_ExtraData() + + + + + + + + + + + System.Void Yoti.Auth.ActivityDetails::.ctor(System.String,System.String,System.Nullable`1<System.DateTime>,Yoti.Auth.Profile.YotiProfile,Yoti.Auth.Profile.ApplicationProfile,System.String,Yoti.Auth.Share.ExtraData) + + + + + + + + + + + + + + + + + + + + Yoti.Auth.ActivityDetailsParser + + + + + Yoti.Auth.ActivityDetails Yoti.Auth.ActivityDetailsParser::HandleResponse(Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair,System.String) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + System.Collections.Generic.Dictionary`2<System.String,System.Collections.Generic.List`1<Yoti.Auth.Attribute.BaseAttribute>> Yoti.Auth.ActivityDetailsParser::ParseProfileContent(Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair,System.String,System.String) + + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ActivityDetailsParser::SetAddressToBeFormattedAddressIfNull(Yoti.Auth.Profile.YotiProfile) + + + + + + + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.Conversion + + + + + System.String Yoti.Auth.Conversion::BytesToUtf8(System.Byte[]) + + + + + + + + + + + System.String Yoti.Auth.Conversion::BytesToBase64(System.Byte[]) + + + + + + + + + + + System.Byte[] Yoti.Auth.Conversion::UtfToBytes(System.String) + + + + + + + + + + + System.Byte[] Yoti.Auth.Conversion::Base64ToBytes(System.String) + + + + + + + + + + + System.Byte[] Yoti.Auth.Conversion::UrlSafeBase64ToBytes(System.String) + + + + + + + + + + + + + Yoti.Auth.CryptoEngine + + + + + Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair Yoti.Auth.CryptoEngine::LoadRsaKey(System.IO.StreamReader) + + + + + + + + + + + + System.Byte[] Yoti.Auth.CryptoEngine::DecipherAes(System.Byte[],System.Byte[],System.Byte[]) + + + + + + + + + + + + + + + + + + + + + + System.Byte[] Yoti.Auth.CryptoEngine::DecryptRsa(System.Byte[],Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair) + + + + + + + + + + + + + + System.Byte[] Yoti.Auth.CryptoEngine::SignDigest(System.Byte[],Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair) + + + + + + + + + + + + + + System.Byte[] Yoti.Auth.CryptoEngine::GetDerEncodedPublicKey(Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair) + + + + + + + + + + + System.String Yoti.Auth.CryptoEngine::GenerateNonce() + + + + + + + + + + + + + + System.String Yoti.Auth.CryptoEngine::DecryptToken(System.String,Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair) + + + + + + + + + + + + + + System.Byte[] Yoti.Auth.CryptoEngine::UnwrapKey(System.String,Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair) + + + + + + + + + + + + Yoti.Auth.ProtoBuf.Attribute.AttributeList Yoti.Auth.CryptoEngine::DecryptAttributeList(System.String,System.String,Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair) + + + + + + + + + + + + Yoti.Auth.Share.ExtraData Yoti.Auth.CryptoEngine::DecryptExtraData(System.String,System.String,Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair) + + + + + + + + + + + + System.Byte[] Yoti.Auth.CryptoEngine::DecipherContent(System.String,System.String,Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair) + + + + + + + + + + + + + + + + + System.String Yoti.Auth.CryptoEngine::GetAuthKey(Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair) + + + + + + + + + + + + System.Byte[] Yoti.Auth.CryptoEngine::DecryptAesGcm(System.Byte[],System.Byte[],System.Byte[]) + + + + + + + + + + + + + + + + + + + + System.Byte[] Yoti.Auth.CryptoEngine::UnwrapReceiptKey(System.Byte[],System.Byte[],System.Byte[],Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair) + + + + + + + + + + + + + + + + System.Byte[] Yoti.Auth.CryptoEngine::DecryptReceiptContent(System.Byte[],System.Byte[]) + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.DigitalIdentityClient + + + + + System.Uri Yoti.Auth.DigitalIdentityClient::get_ApiUri() + + + + + + + + + + + Yoti.Auth.DigitalIdentity.ShareSessionResult Yoti.Auth.DigitalIdentityClient::CreateShareSession(Yoti.Auth.DigitalIdentity.ShareSessionRequest) + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.SharedReceiptResponse Yoti.Auth.DigitalIdentityClient::GetShareReceipt(System.String) + + + + + + + + + + + + System.Void Yoti.Auth.DigitalIdentityClient::SetYotiApiUri() + + + + + + + + + + + + + + + + + Yoti.Auth.DigitalIdentityClient Yoti.Auth.DigitalIdentityClient::OverrideApiUri(System.Uri) + + + + + + + + + + + + System.Void Yoti.Auth.DigitalIdentityClient::.ctor(System.String,System.IO.StreamReader) + + + + + + + + + + + + System.Void Yoti.Auth.DigitalIdentityClient::.ctor(System.Net.Http.HttpClient,System.String,System.IO.StreamReader) + + + + + + + + + + + + System.Void Yoti.Auth.DigitalIdentityClient::.ctor(System.Net.Http.HttpClient,System.String,Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair) + + + + + + + + + + + + + + + + + + + Yoti.Auth.DigitalIdentityClient/<CreateQrCode>d__13 + + + + + System.Void Yoti.Auth.DigitalIdentityClient/<CreateQrCode>d__13::MoveNext() + + + + + + + + + + + + + Yoti.Auth.DigitalIdentityClient/<CreateShareSessionAsync>d__11 + + + + + System.Void Yoti.Auth.DigitalIdentityClient/<CreateShareSessionAsync>d__11::MoveNext() + + + + + + + + + + + + + Yoti.Auth.DigitalIdentityClient/<GetQrCode>d__14 + + + + + System.Void Yoti.Auth.DigitalIdentityClient/<GetQrCode>d__14::MoveNext() + + + + + + + + + + + + + Yoti.Auth.DigitalIdentityClient/<GetSession>d__15 + + + + + System.Void Yoti.Auth.DigitalIdentityClient/<GetSession>d__15::MoveNext() + + + + + + + + + + + + + Yoti.Auth.DigitalIdentityClientEngine + + + + + System.Void Yoti.Auth.DigitalIdentityClientEngine::.ctor(System.Net.Http.HttpClient) + + + + + + + + + + + + + + Yoti.Auth.DigitalIdentityClientEngine/<>c__DisplayClass2_0/<<CreateShareSessionAsync>b__0>d + + + + + System.Void Yoti.Auth.DigitalIdentityClientEngine/<>c__DisplayClass2_0/<<CreateShareSessionAsync>b__0>d::MoveNext() + + + + + + + + + + + + + Yoti.Auth.DigitalIdentityClientEngine/<>c__DisplayClass3_0/<<GetShareReceipt>b__0>d + + + + + System.Void Yoti.Auth.DigitalIdentityClientEngine/<>c__DisplayClass3_0/<<GetShareReceipt>b__0>d::MoveNext() + + + + + + + + + + + + + Yoti.Auth.DigitalIdentityClientEngine/<>c__DisplayClass4_0/<<CreateQrCodeAsync>b__0>d + + + + + System.Void Yoti.Auth.DigitalIdentityClientEngine/<>c__DisplayClass4_0/<<CreateQrCodeAsync>b__0>d::MoveNext() + + + + + + + + + + + + + Yoti.Auth.DigitalIdentityClientEngine/<>c__DisplayClass5_0/<<GetQrCodeAsync>b__0>d + + + + + System.Void Yoti.Auth.DigitalIdentityClientEngine/<>c__DisplayClass5_0/<<GetQrCodeAsync>b__0>d::MoveNext() + + + + + + + + + + + + + Yoti.Auth.DigitalIdentityClientEngine/<>c__DisplayClass6_0/<<GetSession>b__0>d + + + + + System.Void Yoti.Auth.DigitalIdentityClientEngine/<>c__DisplayClass6_0/<<GetSession>b__0>d::MoveNext() + + + + + + + + + + + + + Yoti.Auth.DigitalIdentityClientEngine/<CreateQrCodeAsync>d__4 + + + + + System.Void Yoti.Auth.DigitalIdentityClientEngine/<CreateQrCodeAsync>d__4::MoveNext() + + + + + + + + + + + + + + Yoti.Auth.DigitalIdentityClientEngine/<CreateShareSessionAsync>d__2 + + + + + System.Void Yoti.Auth.DigitalIdentityClientEngine/<CreateShareSessionAsync>d__2::MoveNext() + + + + + + + + + + + + + + Yoti.Auth.DigitalIdentityClientEngine/<GetQrCodeAsync>d__5 + + + + + System.Void Yoti.Auth.DigitalIdentityClientEngine/<GetQrCodeAsync>d__5::MoveNext() + + + + + + + + + + + + + + Yoti.Auth.DigitalIdentityClientEngine/<GetSession>d__6 + + + + + System.Void Yoti.Auth.DigitalIdentityClientEngine/<GetSession>d__6::MoveNext() + + + + + + + + + + + + + + Yoti.Auth.DigitalIdentityClientEngine/<GetShareReceipt>d__3 + + + + + System.Void Yoti.Auth.DigitalIdentityClientEngine/<GetShareReceipt>d__3::MoveNext() + + + + + + + + + + + + + + Yoti.Auth.MediaValue + + + + + System.String Yoti.Auth.MediaValue::GetMIMEType() + + + + + + + + + + + System.Byte[] Yoti.Auth.MediaValue::GetContent() + + + + + + + + + + + System.String Yoti.Auth.MediaValue::GetBase64URI() + + + + + + + + + + + System.Void Yoti.Auth.MediaValue::.ctor(System.String,System.Byte[]) + + + + + + + + + + + + + + + Yoti.Auth.Validation + + + + + System.Void Yoti.Auth.Validation::IsNull(System.Object,System.String) + + + + + + + + + + + + + + + + System.Void Yoti.Auth.Validation::NotNull(System.Object,System.String) + + + + + + + + + + + + + + + + System.Void Yoti.Auth.Validation::NotNullOrEmpty(System.String,System.String) + + + + + + + + + + + + + + + + System.Void Yoti.Auth.Validation::NotNullOrWhiteSpace(System.String,System.String) + + + + + + + + + + + + + + + + System.Void Yoti.Auth.Validation::NotGreaterThan(T,T,System.String) + + + + + + + + + + + + + + + + System.Void Yoti.Auth.Validation::NotLessThan(T,T,System.String) + + + + + + + + + + + + + + + + System.Void Yoti.Auth.Validation::WithinRange(T,T,T,System.String) + + + + + + + + + + + + + System.Void Yoti.Auth.Validation::CollectionNotEmpty(System.Collections.ICollection,System.String) + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.Validation::IsNotDefault(System.Object,System.String) + + + + + + + + + + + + + + + + + System.Boolean Yoti.Auth.Validation::IsDefault(System.Object) + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.YotiClient + + + + + System.Uri Yoti.Auth.YotiClient::get_ApiUri() + + + + + + + + + + + Yoti.Auth.ActivityDetails Yoti.Auth.YotiClient::GetActivityDetails(System.String) + + + + + + + + + + + + Yoti.Auth.Aml.AmlResult Yoti.Auth.YotiClient::PerformAmlCheck(Yoti.Auth.Aml.IAmlProfile) + + + + + + + + + + + + Yoti.Auth.ShareUrl.ShareUrlResult Yoti.Auth.YotiClient::CreateShareUrl(Yoti.Auth.ShareUrl.DynamicScenario) + + + + + + + + + + + + System.Void Yoti.Auth.YotiClient::SetYotiApiUri() + + + + + + + + + + + + + + + + + Yoti.Auth.YotiClient Yoti.Auth.YotiClient::OverrideApiUri(System.Uri) + + + + + + + + + + + + System.Void Yoti.Auth.YotiClient::.ctor(System.String,System.IO.StreamReader) + + + + + + + + + + + + System.Void Yoti.Auth.YotiClient::.ctor(System.Net.Http.HttpClient,System.String,System.IO.StreamReader) + + + + + + + + + + + + System.Void Yoti.Auth.YotiClient::.ctor(System.Net.Http.HttpClient,System.String,Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair) + + + + + + + + + + + + + + + + + + + Yoti.Auth.YotiClient/<CreateShareUrlAsync>d__15 + + + + + System.Void Yoti.Auth.YotiClient/<CreateShareUrlAsync>d__15::MoveNext() + + + + + + + + + + + + + Yoti.Auth.YotiClient/<GetActivityDetailsAsync>d__11 + + + + + System.Void Yoti.Auth.YotiClient/<GetActivityDetailsAsync>d__11::MoveNext() + + + + + + + + + + + + + Yoti.Auth.YotiClient/<PerformAmlCheckAsync>d__13 + + + + + System.Void Yoti.Auth.YotiClient/<PerformAmlCheckAsync>d__13::MoveNext() + + + + + + + + + + + + + Yoti.Auth.YotiClientEngine + + + + + System.Threading.Tasks.Task`1<Yoti.Auth.Aml.AmlResult> Yoti.Auth.YotiClientEngine::PerformAmlCheckAsync(System.String,Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair,System.Uri,Yoti.Auth.Aml.IAmlProfile) + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.YotiClientEngine::.ctor(System.Net.Http.HttpClient) + + + + + + + + + + + + + + Yoti.Auth.YotiClientEngine/<>c__DisplayClass4_0/<<PerformAmlCheckInternalAsync>b__0>d + + + + + System.Void Yoti.Auth.YotiClientEngine/<>c__DisplayClass4_0/<<PerformAmlCheckInternalAsync>b__0>d::MoveNext() + + + + + + + + + + + + + + Yoti.Auth.YotiClientEngine/<>c__DisplayClass5_0/<<CreateShareURLAsync>b__0>d + + + + + System.Void Yoti.Auth.YotiClientEngine/<>c__DisplayClass5_0/<<CreateShareURLAsync>b__0>d::MoveNext() + + + + + + + + + + + + + Yoti.Auth.YotiClientEngine/<CreateShareURLAsync>d__5 + + + + + System.Void Yoti.Auth.YotiClientEngine/<CreateShareURLAsync>d__5::MoveNext() + + + + + + + + + + + + + + Yoti.Auth.YotiClientEngine/<GetActivityDetailsAsync>d__2 + + + + + System.Void Yoti.Auth.YotiClientEngine/<GetActivityDetailsAsync>d__2::MoveNext() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.YotiClientEngine/<PerformAmlCheckInternalAsync>d__4 + + + + + System.Void Yoti.Auth.YotiClientEngine/<PerformAmlCheckInternalAsync>d__4::MoveNext() + + + + + + + + + + + + + + + + Yoti.Auth.Web.HeadersFactory + + + + + System.Net.Http.HttpRequestMessage Yoti.Auth.Web.HeadersFactory::AddHeaders(System.Net.Http.HttpRequestMessage,Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair,System.Net.Http.HttpMethod,System.String,System.Byte[]) + + + + + + + + + + + + + System.Net.Http.HttpRequestMessage Yoti.Auth.Web.HeadersFactory::PutHeaders(System.Net.Http.HttpRequestMessage,System.String,System.String) + + + + + + + + + + + + + + + Yoti.Auth.Web.Request + + + + + System.Net.Http.HttpRequestMessage Yoti.Auth.Web.Request::get_RequestMessage() + + + + + + + + + + + System.Void Yoti.Auth.Web.Request::.ctor(System.Net.Http.HttpRequestMessage) + + + + + + + + + + + + + + Yoti.Auth.Web.Request/<Execute>d__5 + + + + + System.Void Yoti.Auth.Web.Request/<Execute>d__5::MoveNext() + + + + + + + + + + + + + + Yoti.Auth.Web.RequestBuilder + + + + + Yoti.Auth.Web.RequestBuilder Yoti.Auth.Web.RequestBuilder::WithBaseUri(System.Uri) + + + + + + + + + + + + + Yoti.Auth.Web.RequestBuilder Yoti.Auth.Web.RequestBuilder::WithEndpoint(System.String) + + + + + + + + + + + + + + + + + + Yoti.Auth.Web.RequestBuilder Yoti.Auth.Web.RequestBuilder::WithQueryParam(System.String,System.String) + + + + + + + + + + + + Yoti.Auth.Web.RequestBuilder Yoti.Auth.Web.RequestBuilder::WithStreamReader(System.IO.StreamReader) + + + + + + + + + + + + Yoti.Auth.Web.RequestBuilder Yoti.Auth.Web.RequestBuilder::WithKeyPair(Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair) + + + + + + + + + + + + Yoti.Auth.Web.RequestBuilder Yoti.Auth.Web.RequestBuilder::WithHeader(System.String,System.String) + + + + + + + + + + + + Yoti.Auth.Web.RequestBuilder Yoti.Auth.Web.RequestBuilder::WithContentHeader(System.String,System.String) + + + + + + + + + + + + Yoti.Auth.Web.RequestBuilder Yoti.Auth.Web.RequestBuilder::WithHttpMethod(System.Net.Http.HttpMethod) + + + + + + + + + + + + Yoti.Auth.Web.RequestBuilder Yoti.Auth.Web.RequestBuilder::WithContent(System.Byte[]) + + + + + + + + + + + + + Yoti.Auth.Web.RequestBuilder Yoti.Auth.Web.RequestBuilder::WithMultipartBoundary(System.String) + + + + + + + + + + + + + + Yoti.Auth.Web.RequestBuilder Yoti.Auth.Web.RequestBuilder::WithMultipartBinaryContent(System.String,System.Byte[],System.String,System.String) + + + + + + + + + + + + + + + + + + + Yoti.Auth.Web.Request Yoti.Auth.Web.RequestBuilder::Build() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + System.Uri Yoti.Auth.Web.RequestBuilder::GenerateRequestUri(System.String) + + + + + + + + + + + + System.Void Yoti.Auth.Web.RequestBuilder::AddCustomHeaders(System.Net.Http.HttpRequestMessage) + + + + + + + + + + + + + + + + System.Void Yoti.Auth.Web.RequestBuilder::AddCustomContentHeaders(System.Net.Http.HttpRequestMessage) + + + + + + + + + + + + + + + + + + + + + + System.String Yoti.Auth.Web.RequestBuilder::AddQueryParametersToEndpoint() + + + + + + + + + + + + + + + + + + + + + System.Object Yoti.Auth.Web.RequestBuilder::GetTimestamp() + + + + + + + + + + + + System.Void Yoti.Auth.Web.RequestBuilder::.ctor() + + + + + + + + + + + + + + + + Yoti.Auth.Web.Response + + + + + System.Boolean Yoti.Auth.Web.Response::get_Success() + + + + + + + + + + + System.Int32 Yoti.Auth.Web.Response::get_StatusCode() + + + + + + + + + + + System.String Yoti.Auth.Web.Response::get_Content() + + + + + + + + + + + System.String Yoti.Auth.Web.Response::get_ReasonPhrase() + + + + + + + + + + + System.Void Yoti.Auth.Web.Response::CreateYotiExceptionFromStatusCode(System.Net.Http.HttpResponseMessage) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.Web.SignedMessageFactory + + + + + System.String Yoti.Auth.Web.SignedMessageFactory::SignMessage(System.Net.Http.HttpMethod,System.String,Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair,System.Byte[]) + + + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.Verifications.AgeVerification + + + + + System.Int32 Yoti.Auth.Verifications.AgeVerification::Age() + + + + + + + + + + + System.String Yoti.Auth.Verifications.AgeVerification::CheckType() + + + + + + + + + + + System.Boolean Yoti.Auth.Verifications.AgeVerification::Result() + + + + + + + + + + + Yoti.Auth.Attribute.YotiAttribute`1<System.String> Yoti.Auth.Verifications.AgeVerification::Attribute() + + + + + + + + + + + System.Void Yoti.Auth.Verifications.AgeVerification::.ctor(Yoti.Auth.Attribute.YotiAttribute`1<System.String>) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.Verifications.AgeVerificationParser + + + + + System.Collections.ObjectModel.ReadOnlyCollection`1<Yoti.Auth.Verifications.AgeVerification> Yoti.Auth.Verifications.AgeVerificationParser::FindAllAgeVerifications() + + + + + + + + + + + Yoti.Auth.Verifications.AgeVerification Yoti.Auth.Verifications.AgeVerificationParser::FindAgeUnderVerification(System.Int32) + + + + + + + + + + + + + + + + Yoti.Auth.Verifications.AgeVerification Yoti.Auth.Verifications.AgeVerificationParser::FindAgeOverVerification(System.Int32) + + + + + + + + + + + + + + + + System.Collections.Generic.Dictionary`2<System.String,Yoti.Auth.Verifications.AgeVerification> Yoti.Auth.Verifications.AgeVerificationParser::FindVerifications(System.String,Yoti.Auth.Profile.IBaseProfile) + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.Verifications.AgeVerificationParser::.ctor(Yoti.Auth.Profile.IBaseProfile) + + + + + + + + + + + + + + + + + Yoti.Auth.ShareUrl.DynamicScenario + + + + + System.String Yoti.Auth.ShareUrl.DynamicScenario::get_CallbackEndpoint() + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.DynamicPolicy Yoti.Auth.ShareUrl.DynamicScenario::get_DynamicPolicy() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.ShareUrl.Extensions.BaseExtension> Yoti.Auth.ShareUrl.DynamicScenario::get_Extensions() + + + + + + + + + + + System.Object Yoti.Auth.ShareUrl.DynamicScenario::get_Subject() + + + + + + + + + + + System.Void Yoti.Auth.ShareUrl.DynamicScenario::.ctor(System.String,Yoti.Auth.ShareUrl.Policy.DynamicPolicy,System.Collections.Generic.List`1<Yoti.Auth.ShareUrl.Extensions.BaseExtension>,System.Object) + + + + + + + + + + + + + + + + + + + + Yoti.Auth.ShareUrl.DynamicScenarioBuilder + + + + + Yoti.Auth.ShareUrl.DynamicScenarioBuilder Yoti.Auth.ShareUrl.DynamicScenarioBuilder::WithCallbackEndpoint(System.String) + + + + + + + + + + + + Yoti.Auth.ShareUrl.DynamicScenarioBuilder Yoti.Auth.ShareUrl.DynamicScenarioBuilder::WithPolicy(Yoti.Auth.ShareUrl.Policy.DynamicPolicy) + + + + + + + + + + + + Yoti.Auth.ShareUrl.DynamicScenarioBuilder Yoti.Auth.ShareUrl.DynamicScenarioBuilder::WithExtension(Yoti.Auth.ShareUrl.Extensions.BaseExtension) + + + + + + + + + + + + Yoti.Auth.ShareUrl.DynamicScenarioBuilder Yoti.Auth.ShareUrl.DynamicScenarioBuilder::WithSubject(System.Object) + + + + + + + + + + + + Yoti.Auth.ShareUrl.DynamicScenario Yoti.Auth.ShareUrl.DynamicScenarioBuilder::Build() + + + + + + + + + + + System.Void Yoti.Auth.ShareUrl.DynamicScenarioBuilder::.ctor() + + + + + + + + + + + + Yoti.Auth.ShareUrl.DynamicSharingService/<>c__DisplayClass0_0 + + + + + Yoti.Auth.ShareUrl.ShareUrlResult Yoti.Auth.ShareUrl.DynamicSharingService/<>c__DisplayClass0_0::<CreateShareURL>b__0() + + + + + + + + + + + + Yoti.Auth.ShareUrl.DynamicSharingService/<CreateShareURL>d__0 + + + + + System.Void Yoti.Auth.ShareUrl.DynamicSharingService/<CreateShareURL>d__0::MoveNext() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.ShareUrl.ShareUrlResult + + + + + System.Uri Yoti.Auth.ShareUrl.ShareUrlResult::get_Url() + + + + + + + + + + + System.String Yoti.Auth.ShareUrl.ShareUrlResult::get_RefId() + + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.Constraint + + + + + System.String Yoti.Auth.ShareUrl.Policy.Constraint::get_ConstraintType() + + + + + + + + + + + System.Void Yoti.Auth.ShareUrl.Policy.Constraint::.ctor(System.String) + + + + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.DynamicPolicy + + + + + System.Collections.Generic.ICollection`1<Yoti.Auth.ShareUrl.Policy.WantedAttribute> Yoti.Auth.ShareUrl.Policy.DynamicPolicy::get_WantedAttributes() + + + + + + + + + + + System.Collections.Generic.HashSet`1<System.Int32> Yoti.Auth.ShareUrl.Policy.DynamicPolicy::get_WantedAuthTypes() + + + + + + + + + + + System.Boolean Yoti.Auth.ShareUrl.Policy.DynamicPolicy::get_WantedRememberMeId() + + + + + + + + + + + System.Object Yoti.Auth.ShareUrl.Policy.DynamicPolicy::get_IdentityProfileRequirements() + + + + + + + + + + + System.Object Yoti.Auth.ShareUrl.Policy.DynamicPolicy::get_AdvancedIdentityProfileRequirements() + + + + + + + + + + + System.Void Yoti.Auth.ShareUrl.Policy.DynamicPolicy::.ctor(System.Collections.Generic.ICollection`1<Yoti.Auth.ShareUrl.Policy.WantedAttribute>,System.Collections.Generic.HashSet`1<System.Int32>,System.Boolean,System.Object,System.Object) + + + + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder + + + + + Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder::WithWantedAttribute(Yoti.Auth.ShareUrl.Policy.WantedAttribute) + + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder::WithWantedAttribute(System.String,System.Collections.Generic.List`1<Yoti.Auth.ShareUrl.Policy.Constraint>) + + + + + + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder::WithFamilyName(System.Collections.Generic.List`1<Yoti.Auth.ShareUrl.Policy.Constraint>) + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder::WithGivenNames(System.Collections.Generic.List`1<Yoti.Auth.ShareUrl.Policy.Constraint>) + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder::WithFullName(System.Collections.Generic.List`1<Yoti.Auth.ShareUrl.Policy.Constraint>) + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder::WithDateOfBirth(System.Collections.Generic.List`1<Yoti.Auth.ShareUrl.Policy.Constraint>) + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder::WithAgeOver(System.Int32,System.Collections.Generic.List`1<Yoti.Auth.ShareUrl.Policy.Constraint>) + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder::WithAgeUnder(System.Int32,System.Collections.Generic.List`1<Yoti.Auth.ShareUrl.Policy.Constraint>) + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder::WithAgeDerivedAttribute(System.String,System.Collections.Generic.List`1<Yoti.Auth.ShareUrl.Policy.Constraint>) + + + + + + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder::WithGender(System.Collections.Generic.List`1<Yoti.Auth.ShareUrl.Policy.Constraint>) + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder::WithPostalAddress(System.Collections.Generic.List`1<Yoti.Auth.ShareUrl.Policy.Constraint>) + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder::WithStructuredPostalAddress(System.Collections.Generic.List`1<Yoti.Auth.ShareUrl.Policy.Constraint>) + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder::WithNationality(System.Collections.Generic.List`1<Yoti.Auth.ShareUrl.Policy.Constraint>) + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder::WithPhoneNumber(System.Collections.Generic.List`1<Yoti.Auth.ShareUrl.Policy.Constraint>) + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder::WithSelfie(System.Collections.Generic.List`1<Yoti.Auth.ShareUrl.Policy.Constraint>) + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder::WithEmail(System.Collections.Generic.List`1<Yoti.Auth.ShareUrl.Policy.Constraint>) + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder::WithDocumentDetails(System.Collections.Generic.List`1<Yoti.Auth.ShareUrl.Policy.Constraint>) + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder::WithDocumentImages(System.Collections.Generic.List`1<Yoti.Auth.ShareUrl.Policy.Constraint>) + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder::WithSelfieAuthentication(System.Boolean) + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder::WithPinAuthentication(System.Boolean) + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder::WithAuthType(System.Int32,System.Boolean) + + + + + + + + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder::WithRememberMeId(System.Boolean) + + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder::WithIdentityProfileRequirements(System.Object) + + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder::WithAdvancedIdentityProfileRequirements(System.Object) + + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.DynamicPolicy Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder::Build() + + + + + + + + + + + System.Void Yoti.Auth.ShareUrl.Policy.DynamicPolicyBuilder::.ctor() + + + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.PreferredSources + + + + + System.Collections.Generic.List`1<Yoti.Auth.ShareUrl.Policy.WantedAnchor> Yoti.Auth.ShareUrl.Policy.PreferredSources::get_WantedAnchors() + + + + + + + + + + + System.Boolean Yoti.Auth.ShareUrl.Policy.PreferredSources::get_SoftPreference() + + + + + + + + + + + System.Void Yoti.Auth.ShareUrl.Policy.PreferredSources::.ctor(System.Collections.Generic.List`1<Yoti.Auth.ShareUrl.Policy.WantedAnchor>,System.Boolean) + + + + + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.SourceConstraint + + + + + Yoti.Auth.ShareUrl.Policy.PreferredSources Yoti.Auth.ShareUrl.Policy.SourceConstraint::get_PreferredSources() + + + + + + + + + + + System.Void Yoti.Auth.ShareUrl.Policy.SourceConstraint::.ctor(System.Collections.Generic.List`1<Yoti.Auth.ShareUrl.Policy.WantedAnchor>,System.Boolean) + + + + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.SourceConstraintBuilder + + + + + Yoti.Auth.ShareUrl.Policy.SourceConstraintBuilder Yoti.Auth.ShareUrl.Policy.SourceConstraintBuilder::WithAnchor(Yoti.Auth.ShareUrl.Policy.WantedAnchor) + + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.SourceConstraintBuilder Yoti.Auth.ShareUrl.Policy.SourceConstraintBuilder::WithSoftPreference(System.Boolean) + + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.SourceConstraintBuilder Yoti.Auth.ShareUrl.Policy.SourceConstraintBuilder::WithAnchorByValue(System.String,System.String) + + + + + + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.SourceConstraintBuilder Yoti.Auth.ShareUrl.Policy.SourceConstraintBuilder::WithPassport(System.String) + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.SourceConstraintBuilder Yoti.Auth.ShareUrl.Policy.SourceConstraintBuilder::WithDrivingLicense(System.String) + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.SourceConstraintBuilder Yoti.Auth.ShareUrl.Policy.SourceConstraintBuilder::WithNationalId(System.String) + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.SourceConstraintBuilder Yoti.Auth.ShareUrl.Policy.SourceConstraintBuilder::WithPasscard(System.String) + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.SourceConstraint Yoti.Auth.ShareUrl.Policy.SourceConstraintBuilder::Build() + + + + + + + + + + + System.Void Yoti.Auth.ShareUrl.Policy.SourceConstraintBuilder::.ctor() + + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.WantedAnchor + + + + + System.String Yoti.Auth.ShareUrl.Policy.WantedAnchor::get_Name() + + + + + + + + + + + System.String Yoti.Auth.ShareUrl.Policy.WantedAnchor::get_SubType() + + + + + + + + + + + System.Void Yoti.Auth.ShareUrl.Policy.WantedAnchor::.ctor(System.String,System.String) + + + + + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.WantedAnchorBuilder + + + + + Yoti.Auth.ShareUrl.Policy.WantedAnchorBuilder Yoti.Auth.ShareUrl.Policy.WantedAnchorBuilder::WithValue(System.String) + + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.WantedAnchorBuilder Yoti.Auth.ShareUrl.Policy.WantedAnchorBuilder::WithSubType(System.String) + + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.WantedAnchor Yoti.Auth.ShareUrl.Policy.WantedAnchorBuilder::Build() + + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.WantedAttribute + + + + + System.String Yoti.Auth.ShareUrl.Policy.WantedAttribute::get_Name() + + + + + + + + + + + System.String Yoti.Auth.ShareUrl.Policy.WantedAttribute::get_Derivation() + + + + + + + + + + + System.Nullable`1<System.Boolean> Yoti.Auth.ShareUrl.Policy.WantedAttribute::get_Optional() + + + + + + + + + + + System.Nullable`1<System.Boolean> Yoti.Auth.ShareUrl.Policy.WantedAttribute::get_AcceptSelfAsserted() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.ShareUrl.Policy.Constraint> Yoti.Auth.ShareUrl.Policy.WantedAttribute::get_Constraints() + + + + + + + + + + + System.Void Yoti.Auth.ShareUrl.Policy.WantedAttribute::.ctor(System.String,System.String,System.Collections.Generic.List`1<Yoti.Auth.ShareUrl.Policy.Constraint>,System.Nullable`1<System.Boolean>,System.Nullable`1<System.Boolean>) + + + + + + + + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.WantedAttributeBuilder + + + + + Yoti.Auth.ShareUrl.Policy.WantedAttributeBuilder Yoti.Auth.ShareUrl.Policy.WantedAttributeBuilder::WithName(System.String) + + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.WantedAttributeBuilder Yoti.Auth.ShareUrl.Policy.WantedAttributeBuilder::WithOptional(System.Boolean) + + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.WantedAttributeBuilder Yoti.Auth.ShareUrl.Policy.WantedAttributeBuilder::WithDerivation(System.String) + + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.WantedAttributeBuilder Yoti.Auth.ShareUrl.Policy.WantedAttributeBuilder::WithConstraint(Yoti.Auth.ShareUrl.Policy.Constraint) + + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.WantedAttributeBuilder Yoti.Auth.ShareUrl.Policy.WantedAttributeBuilder::WithConstraints(System.Collections.Generic.List`1<Yoti.Auth.ShareUrl.Policy.Constraint>) + + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.WantedAttributeBuilder Yoti.Auth.ShareUrl.Policy.WantedAttributeBuilder::WithAcceptSelfAsserted(System.Boolean) + + + + + + + + + + + + Yoti.Auth.ShareUrl.Policy.WantedAttribute Yoti.Auth.ShareUrl.Policy.WantedAttributeBuilder::Build() + + + + + + + + + + + + System.Void Yoti.Auth.ShareUrl.Policy.WantedAttributeBuilder::.ctor() + + + + + + + + + + + + Yoti.Auth.ShareUrl.Extensions.BaseExtension + + + + + System.String Yoti.Auth.ShareUrl.Extensions.BaseExtension::get_ExtensionType() + + + + + + + + + + + System.Void Yoti.Auth.ShareUrl.Extensions.BaseExtension::.ctor(System.String) + + + + + + + + + + + + + + Yoti.Auth.ShareUrl.Extensions.DeviceLocation + + + + + System.Double Yoti.Auth.ShareUrl.Extensions.DeviceLocation::get_Latitude() + + + + + + + + + + + System.Double Yoti.Auth.ShareUrl.Extensions.DeviceLocation::get_Longitude() + + + + + + + + + + + System.Double Yoti.Auth.ShareUrl.Extensions.DeviceLocation::get_Radius() + + + + + + + + + + + System.Double Yoti.Auth.ShareUrl.Extensions.DeviceLocation::get_MaxUncertainty() + + + + + + + + + + + System.Void Yoti.Auth.ShareUrl.Extensions.DeviceLocation::.ctor(System.Double,System.Double,System.Double,System.Double) + + + + + + + + + + + + + + + + + Yoti.Auth.ShareUrl.Extensions.Extension`1 + + + + + T Yoti.Auth.ShareUrl.Extensions.Extension`1::get_Content() + + + + + + + + + + + System.Void Yoti.Auth.ShareUrl.Extensions.Extension`1::.ctor(System.String,T) + + + + + + + + + + + + + + Yoti.Auth.ShareUrl.Extensions.ExtensionBuilder`1 + + + + + Yoti.Auth.ShareUrl.Extensions.ExtensionBuilder`1<T> Yoti.Auth.ShareUrl.Extensions.ExtensionBuilder`1::WithType(System.String) + + + + + + + + + + + + Yoti.Auth.ShareUrl.Extensions.ExtensionBuilder`1<T> Yoti.Auth.ShareUrl.Extensions.ExtensionBuilder`1::WithContent(T) + + + + + + + + + + + + Yoti.Auth.ShareUrl.Extensions.Extension`1<T> Yoti.Auth.ShareUrl.Extensions.ExtensionBuilder`1::Build() + + + + + + + + + + + + Yoti.Auth.ShareUrl.Extensions.LocationConstraintContent + + + + + Yoti.Auth.ShareUrl.Extensions.DeviceLocation Yoti.Auth.ShareUrl.Extensions.LocationConstraintContent::get_ExpectedDeviceLocation() + + + + + + + + + + + System.Void Yoti.Auth.ShareUrl.Extensions.LocationConstraintContent::.ctor(System.Double,System.Double,System.Double,System.Double) + + + + + + + + + + + + + + Yoti.Auth.ShareUrl.Extensions.LocationConstraintExtensionBuilder + + + + + Yoti.Auth.ShareUrl.Extensions.LocationConstraintExtensionBuilder Yoti.Auth.ShareUrl.Extensions.LocationConstraintExtensionBuilder::WithLatitude(System.Double) + + + + + + + + + + + + + Yoti.Auth.ShareUrl.Extensions.LocationConstraintExtensionBuilder Yoti.Auth.ShareUrl.Extensions.LocationConstraintExtensionBuilder::WithLongitude(System.Double) + + + + + + + + + + + + + Yoti.Auth.ShareUrl.Extensions.LocationConstraintExtensionBuilder Yoti.Auth.ShareUrl.Extensions.LocationConstraintExtensionBuilder::WithRadius(System.Double) + + + + + + + + + + + + + Yoti.Auth.ShareUrl.Extensions.LocationConstraintExtensionBuilder Yoti.Auth.ShareUrl.Extensions.LocationConstraintExtensionBuilder::WithMaxUncertainty(System.Double) + + + + + + + + + + + + + Yoti.Auth.ShareUrl.Extensions.Extension`1<Yoti.Auth.ShareUrl.Extensions.LocationConstraintContent> Yoti.Auth.ShareUrl.Extensions.LocationConstraintExtensionBuilder::Build() + + + + + + + + + + + + System.Void Yoti.Auth.ShareUrl.Extensions.LocationConstraintExtensionBuilder::.ctor() + + + + + + + + + + + + + Yoti.Auth.ShareUrl.Extensions.ThirdPartyAttributeContent + + + + + System.Collections.Generic.List`1<Yoti.Auth.Share.ThirdParty.AttributeDefinition> Yoti.Auth.ShareUrl.Extensions.ThirdPartyAttributeContent::get_Definitions() + + + + + + + + + + + System.String Yoti.Auth.ShareUrl.Extensions.ThirdPartyAttributeContent::get_ExpiryDate() + + + + + + + + + + + System.Void Yoti.Auth.ShareUrl.Extensions.ThirdPartyAttributeContent::.ctor(System.DateTime,System.Collections.Generic.List`1<Yoti.Auth.Share.ThirdParty.AttributeDefinition>) + + + + + + + + + + + + + + + Yoti.Auth.ShareUrl.Extensions.ThirdPartyAttributeExtensionBuilder + + + + + Yoti.Auth.ShareUrl.Extensions.ThirdPartyAttributeExtensionBuilder Yoti.Auth.ShareUrl.Extensions.ThirdPartyAttributeExtensionBuilder::WithExpiryDate(System.DateTime) + + + + + + + + + + + + Yoti.Auth.ShareUrl.Extensions.ThirdPartyAttributeExtensionBuilder Yoti.Auth.ShareUrl.Extensions.ThirdPartyAttributeExtensionBuilder::WithDefinition(System.String) + + + + + + + + + + + + + Yoti.Auth.ShareUrl.Extensions.ThirdPartyAttributeExtensionBuilder Yoti.Auth.ShareUrl.Extensions.ThirdPartyAttributeExtensionBuilder::WithDefinitions(System.Collections.Generic.List`1<System.String>) + + + + + + + + + + + + + + + + + + + Yoti.Auth.ShareUrl.Extensions.Extension`1<Yoti.Auth.ShareUrl.Extensions.ThirdPartyAttributeContent> Yoti.Auth.ShareUrl.Extensions.ThirdPartyAttributeExtensionBuilder::Build() + + + + + + + + + + + + + + System.Void Yoti.Auth.ShareUrl.Extensions.ThirdPartyAttributeExtensionBuilder::.ctor() + + + + + + + + + + + + + + Yoti.Auth.ShareUrl.Extensions.TransactionalFlowExtensionBuilder`1 + + + + + Yoti.Auth.ShareUrl.Extensions.TransactionalFlowExtensionBuilder`1<T> Yoti.Auth.ShareUrl.Extensions.TransactionalFlowExtensionBuilder`1::WithContent(T) + + + + + + + + + + + + + Yoti.Auth.ShareUrl.Extensions.Extension`1<T> Yoti.Auth.ShareUrl.Extensions.TransactionalFlowExtensionBuilder`1::Build() + + + + + + + + + + + + Yoti.Auth.Share.DataEntryConverter + + + + + System.Object Yoti.Auth.Share.DataEntryConverter::ConvertDataEntry(Yoti.Auth.ProtoBuf.Share.DataEntry) + + + + + + + + + + + + + + + System.Object Yoti.Auth.Share.DataEntryConverter::ConvertValue(Yoti.Auth.ProtoBuf.Share.DataEntry/Types/Type,Google.Protobuf.ByteString) + + + + + + + + + + + + + + + + + + Yoti.Auth.Share.ExtraData + + + + + Yoti.Auth.Share.ThirdParty.AttributeIssuanceDetails Yoti.Auth.Share.ExtraData::get_AttributeIssuanceDetails() + + + + + + + + + + + System.Collections.ObjectModel.ReadOnlyCollection`1<T> Yoti.Auth.Share.ExtraData::FilterForType(System.Collections.Generic.List`1<System.Object>) + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.Share.ExtraData::.ctor() + + + + + + + + + + + + + System.Void Yoti.Auth.Share.ExtraData::.ctor(System.Collections.Generic.List`1<System.Object>) + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.Share.ExtraDataConverter + + + + + Yoti.Auth.Share.ExtraData Yoti.Auth.Share.ExtraDataConverter::ParseExtraDataProto(System.Byte[]) + + + + + + + + + + + + System.Collections.Generic.List`1<System.Object> Yoti.Auth.Share.ExtraDataConverter::ParseDataEntries(System.Byte[]) + + + + + + + + + + + + + + + + + + + + Yoti.Auth.Share.ThirdParty.AttributeDefinition + + + + + System.String Yoti.Auth.Share.ThirdParty.AttributeDefinition::get_Name() + + + + + + + + + + + System.Void Yoti.Auth.Share.ThirdParty.AttributeDefinition::.ctor(System.String) + + + + + + + + + + + + + + Yoti.Auth.Share.ThirdParty.AttributeIssuanceDetails + + + + + System.Nullable`1<System.DateTime> Yoti.Auth.Share.ThirdParty.AttributeIssuanceDetails::get_ExpiryDate() + + + + + + + + + + + System.String Yoti.Auth.Share.ThirdParty.AttributeIssuanceDetails::get_Token() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.Share.ThirdParty.AttributeDefinition> Yoti.Auth.Share.ThirdParty.AttributeIssuanceDetails::get_IssuingAttributes() + + + + + + + + + + + System.Void Yoti.Auth.Share.ThirdParty.AttributeIssuanceDetails::.ctor(System.String,System.Nullable`1<System.DateTime>,System.Collections.Generic.List`1<Yoti.Auth.Share.ThirdParty.AttributeDefinition>) + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.Share.ThirdParty.IssuingAttributes + + + + + System.Nullable`1<System.DateTime> Yoti.Auth.Share.ThirdParty.IssuingAttributes::get_ExpiryDate() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.Share.ThirdParty.AttributeDefinition> Yoti.Auth.Share.ThirdParty.IssuingAttributes::get_AttributeDefinitions() + + + + + + + + + + + System.Void Yoti.Auth.Share.ThirdParty.IssuingAttributes::.ctor(System.Nullable`1<System.DateTime>,System.Collections.Generic.List`1<Yoti.Auth.Share.ThirdParty.AttributeDefinition>) + + + + + + + + + + + + + + + Yoti.Auth.Share.ThirdParty.ThirdPartyAttributeConverter + + + + + Yoti.Auth.Share.ThirdParty.AttributeIssuanceDetails Yoti.Auth.Share.ThirdParty.ThirdPartyAttributeConverter::ParseThirdPartyAttribute(System.Byte[]) + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.Share.ThirdParty.IssuingAttributes Yoti.Auth.Share.ThirdParty.ThirdPartyAttributeConverter::ParseIssuingAttributes(Yoti.Auth.ProtoBuf.Share.IssuingAttributes) + + + + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.Share.ThirdParty.AttributeDefinition> Yoti.Auth.Share.ThirdParty.ThirdPartyAttributeConverter::ParseDefinitions(Google.Protobuf.Collections.RepeatedField`1<Yoti.Auth.ProtoBuf.Share.Definition>) + + + + + + + + + + + + + + + + + System.Nullable`1<System.DateTime> Yoti.Auth.Share.ThirdParty.ThirdPartyAttributeConverter::ParseExpiryDateTime(System.String) + + + + + + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.ProtoBuf.Share.DataEntryReflection + + + + + Google.Protobuf.Reflection.FileDescriptor Yoti.Auth.ProtoBuf.Share.DataEntryReflection::get_Descriptor() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.DataEntryReflection::.cctor() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.ProtoBuf.Share.DataEntry + + + + + Google.Protobuf.MessageParser`1<Yoti.Auth.ProtoBuf.Share.DataEntry> Yoti.Auth.ProtoBuf.Share.DataEntry::get_Parser() + + + + + + + + + + + Google.Protobuf.Reflection.MessageDescriptor Yoti.Auth.ProtoBuf.Share.DataEntry::get_Descriptor() + + + + + + + + + + + Google.Protobuf.Reflection.MessageDescriptor Yoti.Auth.ProtoBuf.Share.DataEntry::pb::Google.Protobuf.IMessage.get_Descriptor() + + + + + + + + + + + Yoti.Auth.ProtoBuf.Share.DataEntry Yoti.Auth.ProtoBuf.Share.DataEntry::Clone() + + + + + + + + + + + Yoti.Auth.ProtoBuf.Share.DataEntry/Types/Type Yoti.Auth.ProtoBuf.Share.DataEntry::get_Type() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.DataEntry::set_Type(Yoti.Auth.ProtoBuf.Share.DataEntry/Types/Type) + + + + + + + + + + + + Google.Protobuf.ByteString Yoti.Auth.ProtoBuf.Share.DataEntry::get_Value() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.DataEntry::set_Value(Google.Protobuf.ByteString) + + + + + + + + + + + + System.Boolean Yoti.Auth.ProtoBuf.Share.DataEntry::Equals(System.Object) + + + + + + + + + + + System.Boolean Yoti.Auth.ProtoBuf.Share.DataEntry::Equals(Yoti.Auth.ProtoBuf.Share.DataEntry) + + + + + + + + + + + + + + + + + + + + + + + + + + System.Int32 Yoti.Auth.ProtoBuf.Share.DataEntry::GetHashCode() + + + + + + + + + + + + + + + + + + + + + + + System.String Yoti.Auth.ProtoBuf.Share.DataEntry::ToString() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.DataEntry::WriteTo(Google.Protobuf.CodedOutputStream) + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.DataEntry::pb::Google.Protobuf.IBufferMessage.InternalWriteTo(Google.Protobuf.WriteContext&) + + + + + + + + + + + + + + + + + + + + + + + + + + System.Int32 Yoti.Auth.ProtoBuf.Share.DataEntry::CalculateSize() + + + + + + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.DataEntry::MergeFrom(Yoti.Auth.ProtoBuf.Share.DataEntry) + + + + + + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.DataEntry::MergeFrom(Google.Protobuf.CodedInputStream) + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.DataEntry::pb::Google.Protobuf.IBufferMessage.InternalMergeFrom(Google.Protobuf.ParseContext&) + + + + + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.DataEntry::.ctor() + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.DataEntry::.ctor(Yoti.Auth.ProtoBuf.Share.DataEntry) + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.DataEntry::.cctor() + + + + + + + + + + + + Yoti.Auth.ProtoBuf.Share.ExtraDataReflection + + + + + Google.Protobuf.Reflection.FileDescriptor Yoti.Auth.ProtoBuf.Share.ExtraDataReflection::get_Descriptor() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.ExtraDataReflection::.cctor() + + + + + + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.ProtoBuf.Share.ExtraData + + + + + Google.Protobuf.MessageParser`1<Yoti.Auth.ProtoBuf.Share.ExtraData> Yoti.Auth.ProtoBuf.Share.ExtraData::get_Parser() + + + + + + + + + + + Google.Protobuf.Reflection.MessageDescriptor Yoti.Auth.ProtoBuf.Share.ExtraData::get_Descriptor() + + + + + + + + + + + Google.Protobuf.Reflection.MessageDescriptor Yoti.Auth.ProtoBuf.Share.ExtraData::pb::Google.Protobuf.IMessage.get_Descriptor() + + + + + + + + + + + Yoti.Auth.ProtoBuf.Share.ExtraData Yoti.Auth.ProtoBuf.Share.ExtraData::Clone() + + + + + + + + + + + Google.Protobuf.Collections.RepeatedField`1<Yoti.Auth.ProtoBuf.Share.DataEntry> Yoti.Auth.ProtoBuf.Share.ExtraData::get_List() + + + + + + + + + + + System.Boolean Yoti.Auth.ProtoBuf.Share.ExtraData::Equals(System.Object) + + + + + + + + + + + System.Boolean Yoti.Auth.ProtoBuf.Share.ExtraData::Equals(Yoti.Auth.ProtoBuf.Share.ExtraData) + + + + + + + + + + + + + + + + + + + + + + + System.Int32 Yoti.Auth.ProtoBuf.Share.ExtraData::GetHashCode() + + + + + + + + + + + + + + + + + + System.String Yoti.Auth.ProtoBuf.Share.ExtraData::ToString() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.ExtraData::WriteTo(Google.Protobuf.CodedOutputStream) + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.ExtraData::pb::Google.Protobuf.IBufferMessage.InternalWriteTo(Google.Protobuf.WriteContext&) + + + + + + + + + + + + + + + + + System.Int32 Yoti.Auth.ProtoBuf.Share.ExtraData::CalculateSize() + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.ExtraData::MergeFrom(Yoti.Auth.ProtoBuf.Share.ExtraData) + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.ExtraData::MergeFrom(Google.Protobuf.CodedInputStream) + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.ExtraData::pb::Google.Protobuf.IBufferMessage.InternalMergeFrom(Google.Protobuf.ParseContext&) + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.ExtraData::.ctor() + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.ExtraData::.ctor(Yoti.Auth.ProtoBuf.Share.ExtraData) + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.ExtraData::.cctor() + + + + + + + + + + + + + + Yoti.Auth.ProtoBuf.Share.IssuingAttributesReflection + + + + + Google.Protobuf.Reflection.FileDescriptor Yoti.Auth.ProtoBuf.Share.IssuingAttributesReflection::get_Descriptor() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.IssuingAttributesReflection::.cctor() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.ProtoBuf.Share.IssuingAttributes + + + + + Google.Protobuf.MessageParser`1<Yoti.Auth.ProtoBuf.Share.IssuingAttributes> Yoti.Auth.ProtoBuf.Share.IssuingAttributes::get_Parser() + + + + + + + + + + + Google.Protobuf.Reflection.MessageDescriptor Yoti.Auth.ProtoBuf.Share.IssuingAttributes::get_Descriptor() + + + + + + + + + + + Google.Protobuf.Reflection.MessageDescriptor Yoti.Auth.ProtoBuf.Share.IssuingAttributes::pb::Google.Protobuf.IMessage.get_Descriptor() + + + + + + + + + + + Yoti.Auth.ProtoBuf.Share.IssuingAttributes Yoti.Auth.ProtoBuf.Share.IssuingAttributes::Clone() + + + + + + + + + + + System.String Yoti.Auth.ProtoBuf.Share.IssuingAttributes::get_ExpiryDate() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.IssuingAttributes::set_ExpiryDate(System.String) + + + + + + + + + + + + Google.Protobuf.Collections.RepeatedField`1<Yoti.Auth.ProtoBuf.Share.Definition> Yoti.Auth.ProtoBuf.Share.IssuingAttributes::get_Definitions() + + + + + + + + + + + System.Boolean Yoti.Auth.ProtoBuf.Share.IssuingAttributes::Equals(System.Object) + + + + + + + + + + + System.Boolean Yoti.Auth.ProtoBuf.Share.IssuingAttributes::Equals(Yoti.Auth.ProtoBuf.Share.IssuingAttributes) + + + + + + + + + + + + + + + + + + + + + + + + + + System.Int32 Yoti.Auth.ProtoBuf.Share.IssuingAttributes::GetHashCode() + + + + + + + + + + + + + + + + + + + + + System.String Yoti.Auth.ProtoBuf.Share.IssuingAttributes::ToString() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.IssuingAttributes::WriteTo(Google.Protobuf.CodedOutputStream) + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.IssuingAttributes::pb::Google.Protobuf.IBufferMessage.InternalWriteTo(Google.Protobuf.WriteContext&) + + + + + + + + + + + + + + + + + + + + + + System.Int32 Yoti.Auth.ProtoBuf.Share.IssuingAttributes::CalculateSize() + + + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.IssuingAttributes::MergeFrom(Yoti.Auth.ProtoBuf.Share.IssuingAttributes) + + + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.IssuingAttributes::MergeFrom(Google.Protobuf.CodedInputStream) + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.IssuingAttributes::pb::Google.Protobuf.IBufferMessage.InternalMergeFrom(Google.Protobuf.ParseContext&) + + + + + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.IssuingAttributes::.ctor() + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.IssuingAttributes::.ctor(Yoti.Auth.ProtoBuf.Share.IssuingAttributes) + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.IssuingAttributes::.cctor() + + + + + + + + + + + + + + Yoti.Auth.ProtoBuf.Share.Definition + + + + + Google.Protobuf.MessageParser`1<Yoti.Auth.ProtoBuf.Share.Definition> Yoti.Auth.ProtoBuf.Share.Definition::get_Parser() + + + + + + + + + + + Google.Protobuf.Reflection.MessageDescriptor Yoti.Auth.ProtoBuf.Share.Definition::get_Descriptor() + + + + + + + + + + + Google.Protobuf.Reflection.MessageDescriptor Yoti.Auth.ProtoBuf.Share.Definition::pb::Google.Protobuf.IMessage.get_Descriptor() + + + + + + + + + + + Yoti.Auth.ProtoBuf.Share.Definition Yoti.Auth.ProtoBuf.Share.Definition::Clone() + + + + + + + + + + + System.String Yoti.Auth.ProtoBuf.Share.Definition::get_Name() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.Definition::set_Name(System.String) + + + + + + + + + + + + System.Boolean Yoti.Auth.ProtoBuf.Share.Definition::Equals(System.Object) + + + + + + + + + + + System.Boolean Yoti.Auth.ProtoBuf.Share.Definition::Equals(Yoti.Auth.ProtoBuf.Share.Definition) + + + + + + + + + + + + + + + + + + + + + + + System.Int32 Yoti.Auth.ProtoBuf.Share.Definition::GetHashCode() + + + + + + + + + + + + + + + + + + + + System.String Yoti.Auth.ProtoBuf.Share.Definition::ToString() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.Definition::WriteTo(Google.Protobuf.CodedOutputStream) + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.Definition::pb::Google.Protobuf.IBufferMessage.InternalWriteTo(Google.Protobuf.WriteContext&) + + + + + + + + + + + + + + + + + + + + + System.Int32 Yoti.Auth.ProtoBuf.Share.Definition::CalculateSize() + + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.Definition::MergeFrom(Yoti.Auth.ProtoBuf.Share.Definition) + + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.Definition::MergeFrom(Google.Protobuf.CodedInputStream) + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.Definition::pb::Google.Protobuf.IBufferMessage.InternalMergeFrom(Google.Protobuf.ParseContext&) + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.Definition::.ctor() + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.Definition::.ctor(Yoti.Auth.ProtoBuf.Share.Definition) + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.Definition::.cctor() + + + + + + + + + + + + Yoti.Auth.ProtoBuf.Share.ThirdPartyAttributeReflection + + + + + Google.Protobuf.Reflection.FileDescriptor Yoti.Auth.ProtoBuf.Share.ThirdPartyAttributeReflection::get_Descriptor() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.ThirdPartyAttributeReflection::.cctor() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.ProtoBuf.Share.ThirdPartyAttribute + + + + + Google.Protobuf.MessageParser`1<Yoti.Auth.ProtoBuf.Share.ThirdPartyAttribute> Yoti.Auth.ProtoBuf.Share.ThirdPartyAttribute::get_Parser() + + + + + + + + + + + Google.Protobuf.Reflection.MessageDescriptor Yoti.Auth.ProtoBuf.Share.ThirdPartyAttribute::get_Descriptor() + + + + + + + + + + + Google.Protobuf.Reflection.MessageDescriptor Yoti.Auth.ProtoBuf.Share.ThirdPartyAttribute::pb::Google.Protobuf.IMessage.get_Descriptor() + + + + + + + + + + + Yoti.Auth.ProtoBuf.Share.ThirdPartyAttribute Yoti.Auth.ProtoBuf.Share.ThirdPartyAttribute::Clone() + + + + + + + + + + + Google.Protobuf.ByteString Yoti.Auth.ProtoBuf.Share.ThirdPartyAttribute::get_IssuanceToken() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.ThirdPartyAttribute::set_IssuanceToken(Google.Protobuf.ByteString) + + + + + + + + + + + + Yoti.Auth.ProtoBuf.Share.IssuingAttributes Yoti.Auth.ProtoBuf.Share.ThirdPartyAttribute::get_IssuingAttributes() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.ThirdPartyAttribute::set_IssuingAttributes(Yoti.Auth.ProtoBuf.Share.IssuingAttributes) + + + + + + + + + + + + System.Boolean Yoti.Auth.ProtoBuf.Share.ThirdPartyAttribute::Equals(System.Object) + + + + + + + + + + + System.Boolean Yoti.Auth.ProtoBuf.Share.ThirdPartyAttribute::Equals(Yoti.Auth.ProtoBuf.Share.ThirdPartyAttribute) + + + + + + + + + + + + + + + + + + + + + + + + + + System.Int32 Yoti.Auth.ProtoBuf.Share.ThirdPartyAttribute::GetHashCode() + + + + + + + + + + + + + + + + + + + + + + + System.String Yoti.Auth.ProtoBuf.Share.ThirdPartyAttribute::ToString() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.ThirdPartyAttribute::WriteTo(Google.Protobuf.CodedOutputStream) + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.ThirdPartyAttribute::pb::Google.Protobuf.IBufferMessage.InternalWriteTo(Google.Protobuf.WriteContext&) + + + + + + + + + + + + + + + + + + + + + + + + + + System.Int32 Yoti.Auth.ProtoBuf.Share.ThirdPartyAttribute::CalculateSize() + + + + + + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.ThirdPartyAttribute::MergeFrom(Yoti.Auth.ProtoBuf.Share.ThirdPartyAttribute) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.ThirdPartyAttribute::MergeFrom(Google.Protobuf.CodedInputStream) + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.ThirdPartyAttribute::pb::Google.Protobuf.IBufferMessage.InternalMergeFrom(Google.Protobuf.ParseContext&) + + + + + + + + + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.ThirdPartyAttribute::.ctor() + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.ThirdPartyAttribute::.ctor(Yoti.Auth.ProtoBuf.Share.ThirdPartyAttribute) + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Share.ThirdPartyAttribute::.cctor() + + + + + + + + + + + + Yoti.Auth.ProtoBuf.Common.EncryptedDataReflection + + + + + Google.Protobuf.Reflection.FileDescriptor Yoti.Auth.ProtoBuf.Common.EncryptedDataReflection::get_Descriptor() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Common.EncryptedDataReflection::.cctor() + + + + + + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.ProtoBuf.Common.EncryptedData + + + + + Google.Protobuf.MessageParser`1<Yoti.Auth.ProtoBuf.Common.EncryptedData> Yoti.Auth.ProtoBuf.Common.EncryptedData::get_Parser() + + + + + + + + + + + Google.Protobuf.Reflection.MessageDescriptor Yoti.Auth.ProtoBuf.Common.EncryptedData::get_Descriptor() + + + + + + + + + + + Google.Protobuf.Reflection.MessageDescriptor Yoti.Auth.ProtoBuf.Common.EncryptedData::pb::Google.Protobuf.IMessage.get_Descriptor() + + + + + + + + + + + Yoti.Auth.ProtoBuf.Common.EncryptedData Yoti.Auth.ProtoBuf.Common.EncryptedData::Clone() + + + + + + + + + + + Google.Protobuf.ByteString Yoti.Auth.ProtoBuf.Common.EncryptedData::get_Iv() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Common.EncryptedData::set_Iv(Google.Protobuf.ByteString) + + + + + + + + + + + + Google.Protobuf.ByteString Yoti.Auth.ProtoBuf.Common.EncryptedData::get_CipherText() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Common.EncryptedData::set_CipherText(Google.Protobuf.ByteString) + + + + + + + + + + + + System.Boolean Yoti.Auth.ProtoBuf.Common.EncryptedData::Equals(System.Object) + + + + + + + + + + + System.Boolean Yoti.Auth.ProtoBuf.Common.EncryptedData::Equals(Yoti.Auth.ProtoBuf.Common.EncryptedData) + + + + + + + + + + + + + + + + + + + + + + + + + + System.Int32 Yoti.Auth.ProtoBuf.Common.EncryptedData::GetHashCode() + + + + + + + + + + + + + + + + + + + + + + + System.String Yoti.Auth.ProtoBuf.Common.EncryptedData::ToString() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Common.EncryptedData::WriteTo(Google.Protobuf.CodedOutputStream) + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Common.EncryptedData::pb::Google.Protobuf.IBufferMessage.InternalWriteTo(Google.Protobuf.WriteContext&) + + + + + + + + + + + + + + + + + + + + + + + + + + System.Int32 Yoti.Auth.ProtoBuf.Common.EncryptedData::CalculateSize() + + + + + + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Common.EncryptedData::MergeFrom(Yoti.Auth.ProtoBuf.Common.EncryptedData) + + + + + + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Common.EncryptedData::MergeFrom(Google.Protobuf.CodedInputStream) + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Common.EncryptedData::pb::Google.Protobuf.IBufferMessage.InternalMergeFrom(Google.Protobuf.ParseContext&) + + + + + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Common.EncryptedData::.ctor() + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Common.EncryptedData::.ctor(Yoti.Auth.ProtoBuf.Common.EncryptedData) + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Common.EncryptedData::.cctor() + + + + + + + + + + + + Yoti.Auth.ProtoBuf.Common.SignedTimestampReflection + + + + + Google.Protobuf.Reflection.FileDescriptor Yoti.Auth.ProtoBuf.Common.SignedTimestampReflection::get_Descriptor() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Common.SignedTimestampReflection::.cctor() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.ProtoBuf.Common.SignedTimestamp + + + + + Google.Protobuf.MessageParser`1<Yoti.Auth.ProtoBuf.Common.SignedTimestamp> Yoti.Auth.ProtoBuf.Common.SignedTimestamp::get_Parser() + + + + + + + + + + + Google.Protobuf.Reflection.MessageDescriptor Yoti.Auth.ProtoBuf.Common.SignedTimestamp::get_Descriptor() + + + + + + + + + + + Google.Protobuf.Reflection.MessageDescriptor Yoti.Auth.ProtoBuf.Common.SignedTimestamp::pb::Google.Protobuf.IMessage.get_Descriptor() + + + + + + + + + + + Yoti.Auth.ProtoBuf.Common.SignedTimestamp Yoti.Auth.ProtoBuf.Common.SignedTimestamp::Clone() + + + + + + + + + + + System.Int32 Yoti.Auth.ProtoBuf.Common.SignedTimestamp::get_Version() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Common.SignedTimestamp::set_Version(System.Int32) + + + + + + + + + + + + System.UInt64 Yoti.Auth.ProtoBuf.Common.SignedTimestamp::get_Timestamp() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Common.SignedTimestamp::set_Timestamp(System.UInt64) + + + + + + + + + + + + Google.Protobuf.ByteString Yoti.Auth.ProtoBuf.Common.SignedTimestamp::get_MessageDigest() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Common.SignedTimestamp::set_MessageDigest(Google.Protobuf.ByteString) + + + + + + + + + + + + Google.Protobuf.ByteString Yoti.Auth.ProtoBuf.Common.SignedTimestamp::get_ChainDigest() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Common.SignedTimestamp::set_ChainDigest(Google.Protobuf.ByteString) + + + + + + + + + + + + Google.Protobuf.ByteString Yoti.Auth.ProtoBuf.Common.SignedTimestamp::get_ChainDigestSkip1() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Common.SignedTimestamp::set_ChainDigestSkip1(Google.Protobuf.ByteString) + + + + + + + + + + + + Google.Protobuf.ByteString Yoti.Auth.ProtoBuf.Common.SignedTimestamp::get_ChainDigestSkip2() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Common.SignedTimestamp::set_ChainDigestSkip2(Google.Protobuf.ByteString) + + + + + + + + + + + + System.Boolean Yoti.Auth.ProtoBuf.Common.SignedTimestamp::Equals(System.Object) + + + + + + + + + + + System.Boolean Yoti.Auth.ProtoBuf.Common.SignedTimestamp::Equals(Yoti.Auth.ProtoBuf.Common.SignedTimestamp) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + System.Int32 Yoti.Auth.ProtoBuf.Common.SignedTimestamp::GetHashCode() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + System.String Yoti.Auth.ProtoBuf.Common.SignedTimestamp::ToString() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Common.SignedTimestamp::WriteTo(Google.Protobuf.CodedOutputStream) + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Common.SignedTimestamp::pb::Google.Protobuf.IBufferMessage.InternalWriteTo(Google.Protobuf.WriteContext&) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + System.Int32 Yoti.Auth.ProtoBuf.Common.SignedTimestamp::CalculateSize() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Common.SignedTimestamp::MergeFrom(Yoti.Auth.ProtoBuf.Common.SignedTimestamp) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Common.SignedTimestamp::MergeFrom(Google.Protobuf.CodedInputStream) + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Common.SignedTimestamp::pb::Google.Protobuf.IBufferMessage.InternalMergeFrom(Google.Protobuf.ParseContext&) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Common.SignedTimestamp::.ctor() + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Common.SignedTimestamp::.ctor(Yoti.Auth.ProtoBuf.Common.SignedTimestamp) + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Common.SignedTimestamp::.cctor() + + + + + + + + + + + + Yoti.Auth.ProtoBuf.Attribute.AttributeReflection + + + + + Google.Protobuf.Reflection.FileDescriptor Yoti.Auth.ProtoBuf.Attribute.AttributeReflection::get_Descriptor() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.AttributeReflection::.cctor() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.ProtoBuf.Attribute.Attribute + + + + + Google.Protobuf.MessageParser`1<Yoti.Auth.ProtoBuf.Attribute.Attribute> Yoti.Auth.ProtoBuf.Attribute.Attribute::get_Parser() + + + + + + + + + + + Google.Protobuf.Reflection.MessageDescriptor Yoti.Auth.ProtoBuf.Attribute.Attribute::get_Descriptor() + + + + + + + + + + + Google.Protobuf.Reflection.MessageDescriptor Yoti.Auth.ProtoBuf.Attribute.Attribute::pb::Google.Protobuf.IMessage.get_Descriptor() + + + + + + + + + + + Yoti.Auth.ProtoBuf.Attribute.Attribute Yoti.Auth.ProtoBuf.Attribute.Attribute::Clone() + + + + + + + + + + + System.String Yoti.Auth.ProtoBuf.Attribute.Attribute::get_Name() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.Attribute::set_Name(System.String) + + + + + + + + + + + + Google.Protobuf.ByteString Yoti.Auth.ProtoBuf.Attribute.Attribute::get_Value() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.Attribute::set_Value(Google.Protobuf.ByteString) + + + + + + + + + + + + Yoti.Auth.ProtoBuf.Attribute.ContentType Yoti.Auth.ProtoBuf.Attribute.Attribute::get_ContentType() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.Attribute::set_ContentType(Yoti.Auth.ProtoBuf.Attribute.ContentType) + + + + + + + + + + + + Google.Protobuf.Collections.RepeatedField`1<Yoti.Auth.ProtoBuf.Attribute.Anchor> Yoti.Auth.ProtoBuf.Attribute.Attribute::get_Anchors() + + + + + + + + + + + Google.Protobuf.Collections.RepeatedField`1<Yoti.Auth.ProtoBuf.Attribute.UserMetadata> Yoti.Auth.ProtoBuf.Attribute.Attribute::get_UserMetadata() + + + + + + + + + + + Yoti.Auth.ProtoBuf.Attribute.Metadata Yoti.Auth.ProtoBuf.Attribute.Attribute::get_Metadata() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.Attribute::set_Metadata(Yoti.Auth.ProtoBuf.Attribute.Metadata) + + + + + + + + + + + + System.String Yoti.Auth.ProtoBuf.Attribute.Attribute::get_EphemeralId() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.Attribute::set_EphemeralId(System.String) + + + + + + + + + + + + System.Boolean Yoti.Auth.ProtoBuf.Attribute.Attribute::Equals(System.Object) + + + + + + + + + + + System.Boolean Yoti.Auth.ProtoBuf.Attribute.Attribute::Equals(Yoti.Auth.ProtoBuf.Attribute.Attribute) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + System.Int32 Yoti.Auth.ProtoBuf.Attribute.Attribute::GetHashCode() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + System.String Yoti.Auth.ProtoBuf.Attribute.Attribute::ToString() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.Attribute::WriteTo(Google.Protobuf.CodedOutputStream) + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.Attribute::pb::Google.Protobuf.IBufferMessage.InternalWriteTo(Google.Protobuf.WriteContext&) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + System.Int32 Yoti.Auth.ProtoBuf.Attribute.Attribute::CalculateSize() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.Attribute::MergeFrom(Yoti.Auth.ProtoBuf.Attribute.Attribute) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.Attribute::MergeFrom(Google.Protobuf.CodedInputStream) + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.Attribute::pb::Google.Protobuf.IBufferMessage.InternalMergeFrom(Google.Protobuf.ParseContext&) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.Attribute::.ctor() + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.Attribute::.ctor(Yoti.Auth.ProtoBuf.Attribute.Attribute) + + + + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.Attribute::.cctor() + + + + + + + + + + + + + + + + Yoti.Auth.ProtoBuf.Attribute.Metadata + + + + + Google.Protobuf.MessageParser`1<Yoti.Auth.ProtoBuf.Attribute.Metadata> Yoti.Auth.ProtoBuf.Attribute.Metadata::get_Parser() + + + + + + + + + + + Google.Protobuf.Reflection.MessageDescriptor Yoti.Auth.ProtoBuf.Attribute.Metadata::get_Descriptor() + + + + + + + + + + + Google.Protobuf.Reflection.MessageDescriptor Yoti.Auth.ProtoBuf.Attribute.Metadata::pb::Google.Protobuf.IMessage.get_Descriptor() + + + + + + + + + + + Yoti.Auth.ProtoBuf.Attribute.Metadata Yoti.Auth.ProtoBuf.Attribute.Metadata::Clone() + + + + + + + + + + + System.String Yoti.Auth.ProtoBuf.Attribute.Metadata::get_SupersededTimeStamp() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.Metadata::set_SupersededTimeStamp(System.String) + + + + + + + + + + + + System.Boolean Yoti.Auth.ProtoBuf.Attribute.Metadata::get_Deletable() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.Metadata::set_Deletable(System.Boolean) + + + + + + + + + + + + Google.Protobuf.ByteString Yoti.Auth.ProtoBuf.Attribute.Metadata::get_ReceiptId() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.Metadata::set_ReceiptId(Google.Protobuf.ByteString) + + + + + + + + + + + + System.Boolean Yoti.Auth.ProtoBuf.Attribute.Metadata::get_Revoked() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.Metadata::set_Revoked(System.Boolean) + + + + + + + + + + + + System.Boolean Yoti.Auth.ProtoBuf.Attribute.Metadata::get_Locked() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.Metadata::set_Locked(System.Boolean) + + + + + + + + + + + + System.Boolean Yoti.Auth.ProtoBuf.Attribute.Metadata::Equals(System.Object) + + + + + + + + + + + System.Boolean Yoti.Auth.ProtoBuf.Attribute.Metadata::Equals(Yoti.Auth.ProtoBuf.Attribute.Metadata) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + System.Int32 Yoti.Auth.ProtoBuf.Attribute.Metadata::GetHashCode() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + System.String Yoti.Auth.ProtoBuf.Attribute.Metadata::ToString() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.Metadata::WriteTo(Google.Protobuf.CodedOutputStream) + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.Metadata::pb::Google.Protobuf.IBufferMessage.InternalWriteTo(Google.Protobuf.WriteContext&) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + System.Int32 Yoti.Auth.ProtoBuf.Attribute.Metadata::CalculateSize() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.Metadata::MergeFrom(Yoti.Auth.ProtoBuf.Attribute.Metadata) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.Metadata::MergeFrom(Google.Protobuf.CodedInputStream) + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.Metadata::pb::Google.Protobuf.IBufferMessage.InternalMergeFrom(Google.Protobuf.ParseContext&) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.Metadata::.ctor() + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.Metadata::.ctor(Yoti.Auth.ProtoBuf.Attribute.Metadata) + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.Metadata::.cctor() + + + + + + + + + + + + Yoti.Auth.ProtoBuf.Attribute.Anchor + + + + + Google.Protobuf.MessageParser`1<Yoti.Auth.ProtoBuf.Attribute.Anchor> Yoti.Auth.ProtoBuf.Attribute.Anchor::get_Parser() + + + + + + + + + + + Google.Protobuf.Reflection.MessageDescriptor Yoti.Auth.ProtoBuf.Attribute.Anchor::get_Descriptor() + + + + + + + + + + + Google.Protobuf.Reflection.MessageDescriptor Yoti.Auth.ProtoBuf.Attribute.Anchor::pb::Google.Protobuf.IMessage.get_Descriptor() + + + + + + + + + + + Yoti.Auth.ProtoBuf.Attribute.Anchor Yoti.Auth.ProtoBuf.Attribute.Anchor::Clone() + + + + + + + + + + + Google.Protobuf.ByteString Yoti.Auth.ProtoBuf.Attribute.Anchor::get_ArtifactLink() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.Anchor::set_ArtifactLink(Google.Protobuf.ByteString) + + + + + + + + + + + + Google.Protobuf.Collections.RepeatedField`1<Google.Protobuf.ByteString> Yoti.Auth.ProtoBuf.Attribute.Anchor::get_OriginServerCerts() + + + + + + + + + + + Google.Protobuf.ByteString Yoti.Auth.ProtoBuf.Attribute.Anchor::get_ArtifactSignature() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.Anchor::set_ArtifactSignature(Google.Protobuf.ByteString) + + + + + + + + + + + + System.String Yoti.Auth.ProtoBuf.Attribute.Anchor::get_SubType() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.Anchor::set_SubType(System.String) + + + + + + + + + + + + Google.Protobuf.ByteString Yoti.Auth.ProtoBuf.Attribute.Anchor::get_Signature() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.Anchor::set_Signature(Google.Protobuf.ByteString) + + + + + + + + + + + + Google.Protobuf.ByteString Yoti.Auth.ProtoBuf.Attribute.Anchor::get_SignedTimeStamp() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.Anchor::set_SignedTimeStamp(Google.Protobuf.ByteString) + + + + + + + + + + + + System.String Yoti.Auth.ProtoBuf.Attribute.Anchor::get_AssociatedSource() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.Anchor::set_AssociatedSource(System.String) + + + + + + + + + + + + System.Boolean Yoti.Auth.ProtoBuf.Attribute.Anchor::Equals(System.Object) + + + + + + + + + + + System.Boolean Yoti.Auth.ProtoBuf.Attribute.Anchor::Equals(Yoti.Auth.ProtoBuf.Attribute.Anchor) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + System.Int32 Yoti.Auth.ProtoBuf.Attribute.Anchor::GetHashCode() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + System.String Yoti.Auth.ProtoBuf.Attribute.Anchor::ToString() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.Anchor::WriteTo(Google.Protobuf.CodedOutputStream) + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.Anchor::pb::Google.Protobuf.IBufferMessage.InternalWriteTo(Google.Protobuf.WriteContext&) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + System.Int32 Yoti.Auth.ProtoBuf.Attribute.Anchor::CalculateSize() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.Anchor::MergeFrom(Yoti.Auth.ProtoBuf.Attribute.Anchor) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.Anchor::MergeFrom(Google.Protobuf.CodedInputStream) + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.Anchor::pb::Google.Protobuf.IBufferMessage.InternalMergeFrom(Google.Protobuf.ParseContext&) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.Anchor::.ctor() + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.Anchor::.ctor(Yoti.Auth.ProtoBuf.Attribute.Anchor) + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.Anchor::.cctor() + + + + + + + + + + + + + + Yoti.Auth.ProtoBuf.Attribute.UserMetadata + + + + + Google.Protobuf.MessageParser`1<Yoti.Auth.ProtoBuf.Attribute.UserMetadata> Yoti.Auth.ProtoBuf.Attribute.UserMetadata::get_Parser() + + + + + + + + + + + Google.Protobuf.Reflection.MessageDescriptor Yoti.Auth.ProtoBuf.Attribute.UserMetadata::get_Descriptor() + + + + + + + + + + + Google.Protobuf.Reflection.MessageDescriptor Yoti.Auth.ProtoBuf.Attribute.UserMetadata::pb::Google.Protobuf.IMessage.get_Descriptor() + + + + + + + + + + + Yoti.Auth.ProtoBuf.Attribute.UserMetadata Yoti.Auth.ProtoBuf.Attribute.UserMetadata::Clone() + + + + + + + + + + + System.String Yoti.Auth.ProtoBuf.Attribute.UserMetadata::get_Key() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.UserMetadata::set_Key(System.String) + + + + + + + + + + + + System.String Yoti.Auth.ProtoBuf.Attribute.UserMetadata::get_Value() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.UserMetadata::set_Value(System.String) + + + + + + + + + + + + System.Boolean Yoti.Auth.ProtoBuf.Attribute.UserMetadata::Equals(System.Object) + + + + + + + + + + + System.Boolean Yoti.Auth.ProtoBuf.Attribute.UserMetadata::Equals(Yoti.Auth.ProtoBuf.Attribute.UserMetadata) + + + + + + + + + + + + + + + + + + + + + + + + + + System.Int32 Yoti.Auth.ProtoBuf.Attribute.UserMetadata::GetHashCode() + + + + + + + + + + + + + + + + + + + + + + + System.String Yoti.Auth.ProtoBuf.Attribute.UserMetadata::ToString() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.UserMetadata::WriteTo(Google.Protobuf.CodedOutputStream) + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.UserMetadata::pb::Google.Protobuf.IBufferMessage.InternalWriteTo(Google.Protobuf.WriteContext&) + + + + + + + + + + + + + + + + + + + + + + + + + + System.Int32 Yoti.Auth.ProtoBuf.Attribute.UserMetadata::CalculateSize() + + + + + + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.UserMetadata::MergeFrom(Yoti.Auth.ProtoBuf.Attribute.UserMetadata) + + + + + + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.UserMetadata::MergeFrom(Google.Protobuf.CodedInputStream) + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.UserMetadata::pb::Google.Protobuf.IBufferMessage.InternalMergeFrom(Google.Protobuf.ParseContext&) + + + + + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.UserMetadata::.ctor() + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.UserMetadata::.ctor(Yoti.Auth.ProtoBuf.Attribute.UserMetadata) + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.UserMetadata::.cctor() + + + + + + + + + + + + Yoti.Auth.ProtoBuf.Attribute.MultiValue + + + + + Google.Protobuf.MessageParser`1<Yoti.Auth.ProtoBuf.Attribute.MultiValue> Yoti.Auth.ProtoBuf.Attribute.MultiValue::get_Parser() + + + + + + + + + + + Google.Protobuf.Reflection.MessageDescriptor Yoti.Auth.ProtoBuf.Attribute.MultiValue::get_Descriptor() + + + + + + + + + + + Google.Protobuf.Reflection.MessageDescriptor Yoti.Auth.ProtoBuf.Attribute.MultiValue::pb::Google.Protobuf.IMessage.get_Descriptor() + + + + + + + + + + + Yoti.Auth.ProtoBuf.Attribute.MultiValue Yoti.Auth.ProtoBuf.Attribute.MultiValue::Clone() + + + + + + + + + + + Google.Protobuf.Collections.RepeatedField`1<Yoti.Auth.ProtoBuf.Attribute.MultiValue/Types/Value> Yoti.Auth.ProtoBuf.Attribute.MultiValue::get_Values() + + + + + + + + + + + System.Boolean Yoti.Auth.ProtoBuf.Attribute.MultiValue::Equals(System.Object) + + + + + + + + + + + System.Boolean Yoti.Auth.ProtoBuf.Attribute.MultiValue::Equals(Yoti.Auth.ProtoBuf.Attribute.MultiValue) + + + + + + + + + + + + + + + + + + + + + + + System.Int32 Yoti.Auth.ProtoBuf.Attribute.MultiValue::GetHashCode() + + + + + + + + + + + + + + + + + + System.String Yoti.Auth.ProtoBuf.Attribute.MultiValue::ToString() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.MultiValue::WriteTo(Google.Protobuf.CodedOutputStream) + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.MultiValue::pb::Google.Protobuf.IBufferMessage.InternalWriteTo(Google.Protobuf.WriteContext&) + + + + + + + + + + + + + + + + + System.Int32 Yoti.Auth.ProtoBuf.Attribute.MultiValue::CalculateSize() + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.MultiValue::MergeFrom(Yoti.Auth.ProtoBuf.Attribute.MultiValue) + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.MultiValue::MergeFrom(Google.Protobuf.CodedInputStream) + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.MultiValue::pb::Google.Protobuf.IBufferMessage.InternalMergeFrom(Google.Protobuf.ParseContext&) + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.MultiValue::.ctor() + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.MultiValue::.ctor(Yoti.Auth.ProtoBuf.Attribute.MultiValue) + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.MultiValue::.cctor() + + + + + + + + + + + + + + Yoti.Auth.ProtoBuf.Attribute.MultiValue/Types/Value + + + + + Google.Protobuf.MessageParser`1<Yoti.Auth.ProtoBuf.Attribute.MultiValue/Types/Value> Yoti.Auth.ProtoBuf.Attribute.MultiValue/Types/Value::get_Parser() + + + + + + + + + + + Google.Protobuf.Reflection.MessageDescriptor Yoti.Auth.ProtoBuf.Attribute.MultiValue/Types/Value::get_Descriptor() + + + + + + + + + + + Google.Protobuf.Reflection.MessageDescriptor Yoti.Auth.ProtoBuf.Attribute.MultiValue/Types/Value::pb::Google.Protobuf.IMessage.get_Descriptor() + + + + + + + + + + + Yoti.Auth.ProtoBuf.Attribute.MultiValue/Types/Value Yoti.Auth.ProtoBuf.Attribute.MultiValue/Types/Value::Clone() + + + + + + + + + + + Yoti.Auth.ProtoBuf.Attribute.ContentType Yoti.Auth.ProtoBuf.Attribute.MultiValue/Types/Value::get_ContentType() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.MultiValue/Types/Value::set_ContentType(Yoti.Auth.ProtoBuf.Attribute.ContentType) + + + + + + + + + + + + Google.Protobuf.ByteString Yoti.Auth.ProtoBuf.Attribute.MultiValue/Types/Value::get_Data() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.MultiValue/Types/Value::set_Data(Google.Protobuf.ByteString) + + + + + + + + + + + + System.Boolean Yoti.Auth.ProtoBuf.Attribute.MultiValue/Types/Value::Equals(System.Object) + + + + + + + + + + + System.Boolean Yoti.Auth.ProtoBuf.Attribute.MultiValue/Types/Value::Equals(Yoti.Auth.ProtoBuf.Attribute.MultiValue/Types/Value) + + + + + + + + + + + + + + + + + + + + + + + + + + System.Int32 Yoti.Auth.ProtoBuf.Attribute.MultiValue/Types/Value::GetHashCode() + + + + + + + + + + + + + + + + + + + + + + + System.String Yoti.Auth.ProtoBuf.Attribute.MultiValue/Types/Value::ToString() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.MultiValue/Types/Value::WriteTo(Google.Protobuf.CodedOutputStream) + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.MultiValue/Types/Value::pb::Google.Protobuf.IBufferMessage.InternalWriteTo(Google.Protobuf.WriteContext&) + + + + + + + + + + + + + + + + + + + + + + + + + + System.Int32 Yoti.Auth.ProtoBuf.Attribute.MultiValue/Types/Value::CalculateSize() + + + + + + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.MultiValue/Types/Value::MergeFrom(Yoti.Auth.ProtoBuf.Attribute.MultiValue/Types/Value) + + + + + + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.MultiValue/Types/Value::MergeFrom(Google.Protobuf.CodedInputStream) + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.MultiValue/Types/Value::pb::Google.Protobuf.IBufferMessage.InternalMergeFrom(Google.Protobuf.ParseContext&) + + + + + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.MultiValue/Types/Value::.ctor() + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.MultiValue/Types/Value::.ctor(Yoti.Auth.ProtoBuf.Attribute.MultiValue/Types/Value) + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.MultiValue/Types/Value::.cctor() + + + + + + + + + + + + Yoti.Auth.ProtoBuf.Attribute.ContentTypeReflection + + + + + Google.Protobuf.Reflection.FileDescriptor Yoti.Auth.ProtoBuf.Attribute.ContentTypeReflection::get_Descriptor() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.ContentTypeReflection::.cctor() + + + + + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.ProtoBuf.Attribute.ListReflection + + + + + Google.Protobuf.Reflection.FileDescriptor Yoti.Auth.ProtoBuf.Attribute.ListReflection::get_Descriptor() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.ListReflection::.cctor() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.ProtoBuf.Attribute.AttributeAndId + + + + + Google.Protobuf.MessageParser`1<Yoti.Auth.ProtoBuf.Attribute.AttributeAndId> Yoti.Auth.ProtoBuf.Attribute.AttributeAndId::get_Parser() + + + + + + + + + + + Google.Protobuf.Reflection.MessageDescriptor Yoti.Auth.ProtoBuf.Attribute.AttributeAndId::get_Descriptor() + + + + + + + + + + + Google.Protobuf.Reflection.MessageDescriptor Yoti.Auth.ProtoBuf.Attribute.AttributeAndId::pb::Google.Protobuf.IMessage.get_Descriptor() + + + + + + + + + + + Yoti.Auth.ProtoBuf.Attribute.AttributeAndId Yoti.Auth.ProtoBuf.Attribute.AttributeAndId::Clone() + + + + + + + + + + + Yoti.Auth.ProtoBuf.Attribute.Attribute Yoti.Auth.ProtoBuf.Attribute.AttributeAndId::get_Attribute() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.AttributeAndId::set_Attribute(Yoti.Auth.ProtoBuf.Attribute.Attribute) + + + + + + + + + + + + Google.Protobuf.ByteString Yoti.Auth.ProtoBuf.Attribute.AttributeAndId::get_AttributeId() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.AttributeAndId::set_AttributeId(Google.Protobuf.ByteString) + + + + + + + + + + + + System.Boolean Yoti.Auth.ProtoBuf.Attribute.AttributeAndId::Equals(System.Object) + + + + + + + + + + + System.Boolean Yoti.Auth.ProtoBuf.Attribute.AttributeAndId::Equals(Yoti.Auth.ProtoBuf.Attribute.AttributeAndId) + + + + + + + + + + + + + + + + + + + + + + + + + + System.Int32 Yoti.Auth.ProtoBuf.Attribute.AttributeAndId::GetHashCode() + + + + + + + + + + + + + + + + + + + + + + + System.String Yoti.Auth.ProtoBuf.Attribute.AttributeAndId::ToString() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.AttributeAndId::WriteTo(Google.Protobuf.CodedOutputStream) + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.AttributeAndId::pb::Google.Protobuf.IBufferMessage.InternalWriteTo(Google.Protobuf.WriteContext&) + + + + + + + + + + + + + + + + + + + + + + + + + + System.Int32 Yoti.Auth.ProtoBuf.Attribute.AttributeAndId::CalculateSize() + + + + + + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.AttributeAndId::MergeFrom(Yoti.Auth.ProtoBuf.Attribute.AttributeAndId) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.AttributeAndId::MergeFrom(Google.Protobuf.CodedInputStream) + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.AttributeAndId::pb::Google.Protobuf.IBufferMessage.InternalMergeFrom(Google.Protobuf.ParseContext&) + + + + + + + + + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.AttributeAndId::.ctor() + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.AttributeAndId::.ctor(Yoti.Auth.ProtoBuf.Attribute.AttributeAndId) + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.AttributeAndId::.cctor() + + + + + + + + + + + + Yoti.Auth.ProtoBuf.Attribute.AttributeAndIdList + + + + + Google.Protobuf.MessageParser`1<Yoti.Auth.ProtoBuf.Attribute.AttributeAndIdList> Yoti.Auth.ProtoBuf.Attribute.AttributeAndIdList::get_Parser() + + + + + + + + + + + Google.Protobuf.Reflection.MessageDescriptor Yoti.Auth.ProtoBuf.Attribute.AttributeAndIdList::get_Descriptor() + + + + + + + + + + + Google.Protobuf.Reflection.MessageDescriptor Yoti.Auth.ProtoBuf.Attribute.AttributeAndIdList::pb::Google.Protobuf.IMessage.get_Descriptor() + + + + + + + + + + + Yoti.Auth.ProtoBuf.Attribute.AttributeAndIdList Yoti.Auth.ProtoBuf.Attribute.AttributeAndIdList::Clone() + + + + + + + + + + + Google.Protobuf.Collections.RepeatedField`1<Yoti.Auth.ProtoBuf.Attribute.AttributeAndId> Yoti.Auth.ProtoBuf.Attribute.AttributeAndIdList::get_AttributeAndIdList_() + + + + + + + + + + + System.Boolean Yoti.Auth.ProtoBuf.Attribute.AttributeAndIdList::Equals(System.Object) + + + + + + + + + + + System.Boolean Yoti.Auth.ProtoBuf.Attribute.AttributeAndIdList::Equals(Yoti.Auth.ProtoBuf.Attribute.AttributeAndIdList) + + + + + + + + + + + + + + + + + + + + + + + System.Int32 Yoti.Auth.ProtoBuf.Attribute.AttributeAndIdList::GetHashCode() + + + + + + + + + + + + + + + + + + System.String Yoti.Auth.ProtoBuf.Attribute.AttributeAndIdList::ToString() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.AttributeAndIdList::WriteTo(Google.Protobuf.CodedOutputStream) + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.AttributeAndIdList::pb::Google.Protobuf.IBufferMessage.InternalWriteTo(Google.Protobuf.WriteContext&) + + + + + + + + + + + + + + + + + System.Int32 Yoti.Auth.ProtoBuf.Attribute.AttributeAndIdList::CalculateSize() + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.AttributeAndIdList::MergeFrom(Yoti.Auth.ProtoBuf.Attribute.AttributeAndIdList) + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.AttributeAndIdList::MergeFrom(Google.Protobuf.CodedInputStream) + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.AttributeAndIdList::pb::Google.Protobuf.IBufferMessage.InternalMergeFrom(Google.Protobuf.ParseContext&) + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.AttributeAndIdList::.ctor() + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.AttributeAndIdList::.ctor(Yoti.Auth.ProtoBuf.Attribute.AttributeAndIdList) + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.AttributeAndIdList::.cctor() + + + + + + + + + + + + + + Yoti.Auth.ProtoBuf.Attribute.AttributeList + + + + + Google.Protobuf.MessageParser`1<Yoti.Auth.ProtoBuf.Attribute.AttributeList> Yoti.Auth.ProtoBuf.Attribute.AttributeList::get_Parser() + + + + + + + + + + + Google.Protobuf.Reflection.MessageDescriptor Yoti.Auth.ProtoBuf.Attribute.AttributeList::get_Descriptor() + + + + + + + + + + + Google.Protobuf.Reflection.MessageDescriptor Yoti.Auth.ProtoBuf.Attribute.AttributeList::pb::Google.Protobuf.IMessage.get_Descriptor() + + + + + + + + + + + Yoti.Auth.ProtoBuf.Attribute.AttributeList Yoti.Auth.ProtoBuf.Attribute.AttributeList::Clone() + + + + + + + + + + + Google.Protobuf.Collections.RepeatedField`1<Yoti.Auth.ProtoBuf.Attribute.Attribute> Yoti.Auth.ProtoBuf.Attribute.AttributeList::get_Attributes() + + + + + + + + + + + System.Boolean Yoti.Auth.ProtoBuf.Attribute.AttributeList::Equals(System.Object) + + + + + + + + + + + System.Boolean Yoti.Auth.ProtoBuf.Attribute.AttributeList::Equals(Yoti.Auth.ProtoBuf.Attribute.AttributeList) + + + + + + + + + + + + + + + + + + + + + + + System.Int32 Yoti.Auth.ProtoBuf.Attribute.AttributeList::GetHashCode() + + + + + + + + + + + + + + + + + + System.String Yoti.Auth.ProtoBuf.Attribute.AttributeList::ToString() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.AttributeList::WriteTo(Google.Protobuf.CodedOutputStream) + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.AttributeList::pb::Google.Protobuf.IBufferMessage.InternalWriteTo(Google.Protobuf.WriteContext&) + + + + + + + + + + + + + + + + + System.Int32 Yoti.Auth.ProtoBuf.Attribute.AttributeList::CalculateSize() + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.AttributeList::MergeFrom(Yoti.Auth.ProtoBuf.Attribute.AttributeList) + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.AttributeList::MergeFrom(Google.Protobuf.CodedInputStream) + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.AttributeList::pb::Google.Protobuf.IBufferMessage.InternalMergeFrom(Google.Protobuf.ParseContext&) + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.AttributeList::.ctor() + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.AttributeList::.ctor(Yoti.Auth.ProtoBuf.Attribute.AttributeList) + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.AttributeList::.cctor() + + + + + + + + + + + + + + Yoti.Auth.ProtoBuf.Attribute.SigningReflection + + + + + Google.Protobuf.Reflection.FileDescriptor Yoti.Auth.ProtoBuf.Attribute.SigningReflection::get_Descriptor() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.SigningReflection::.cctor() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.ProtoBuf.Attribute.AttributeSigning + + + + + Google.Protobuf.MessageParser`1<Yoti.Auth.ProtoBuf.Attribute.AttributeSigning> Yoti.Auth.ProtoBuf.Attribute.AttributeSigning::get_Parser() + + + + + + + + + + + Google.Protobuf.Reflection.MessageDescriptor Yoti.Auth.ProtoBuf.Attribute.AttributeSigning::get_Descriptor() + + + + + + + + + + + Google.Protobuf.Reflection.MessageDescriptor Yoti.Auth.ProtoBuf.Attribute.AttributeSigning::pb::Google.Protobuf.IMessage.get_Descriptor() + + + + + + + + + + + Yoti.Auth.ProtoBuf.Attribute.AttributeSigning Yoti.Auth.ProtoBuf.Attribute.AttributeSigning::Clone() + + + + + + + + + + + System.String Yoti.Auth.ProtoBuf.Attribute.AttributeSigning::get_Name() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.AttributeSigning::set_Name(System.String) + + + + + + + + + + + + Google.Protobuf.ByteString Yoti.Auth.ProtoBuf.Attribute.AttributeSigning::get_Value() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.AttributeSigning::set_Value(Google.Protobuf.ByteString) + + + + + + + + + + + + Yoti.Auth.ProtoBuf.Attribute.ContentType Yoti.Auth.ProtoBuf.Attribute.AttributeSigning::get_ContentType() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.AttributeSigning::set_ContentType(Yoti.Auth.ProtoBuf.Attribute.ContentType) + + + + + + + + + + + + Google.Protobuf.ByteString Yoti.Auth.ProtoBuf.Attribute.AttributeSigning::get_ArtifactSignature() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.AttributeSigning::set_ArtifactSignature(Google.Protobuf.ByteString) + + + + + + + + + + + + System.String Yoti.Auth.ProtoBuf.Attribute.AttributeSigning::get_SubType() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.AttributeSigning::set_SubType(System.String) + + + + + + + + + + + + Google.Protobuf.ByteString Yoti.Auth.ProtoBuf.Attribute.AttributeSigning::get_SignedTimeStamp() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.AttributeSigning::set_SignedTimeStamp(Google.Protobuf.ByteString) + + + + + + + + + + + + System.String Yoti.Auth.ProtoBuf.Attribute.AttributeSigning::get_AssociatedSource() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.AttributeSigning::set_AssociatedSource(System.String) + + + + + + + + + + + + System.Boolean Yoti.Auth.ProtoBuf.Attribute.AttributeSigning::Equals(System.Object) + + + + + + + + + + + System.Boolean Yoti.Auth.ProtoBuf.Attribute.AttributeSigning::Equals(Yoti.Auth.ProtoBuf.Attribute.AttributeSigning) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + System.Int32 Yoti.Auth.ProtoBuf.Attribute.AttributeSigning::GetHashCode() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + System.String Yoti.Auth.ProtoBuf.Attribute.AttributeSigning::ToString() + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.AttributeSigning::WriteTo(Google.Protobuf.CodedOutputStream) + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.AttributeSigning::pb::Google.Protobuf.IBufferMessage.InternalWriteTo(Google.Protobuf.WriteContext&) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + System.Int32 Yoti.Auth.ProtoBuf.Attribute.AttributeSigning::CalculateSize() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.AttributeSigning::MergeFrom(Yoti.Auth.ProtoBuf.Attribute.AttributeSigning) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.AttributeSigning::MergeFrom(Google.Protobuf.CodedInputStream) + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.AttributeSigning::pb::Google.Protobuf.IBufferMessage.InternalMergeFrom(Google.Protobuf.ParseContext&) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.AttributeSigning::.ctor() + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.AttributeSigning::.ctor(Yoti.Auth.ProtoBuf.Attribute.AttributeSigning) + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.ProtoBuf.Attribute.AttributeSigning::.cctor() + + + + + + + + + + + + Yoti.Auth.Properties.Resources + + + + + System.Resources.ResourceManager Yoti.Auth.Properties.Resources::get_ResourceManager() + + + + + + + + + + + + + + + + + System.Globalization.CultureInfo Yoti.Auth.Properties.Resources::get_Culture() + + + + + + + + + + + System.Void Yoti.Auth.Properties.Resources::set_Culture(System.Globalization.CultureInfo) + + + + + + + + + + + + System.String Yoti.Auth.Properties.Resources::get_DataEntryError() + + + + + + + + + + + System.String Yoti.Auth.Properties.Resources::get_DataEntryParsingFail() + + + + + + + + + + + System.String Yoti.Auth.Properties.Resources::get_DocDetailsMultipleConsecutiveSpaces() + + + + + + + + + + + System.String Yoti.Auth.Properties.Resources::get_EmptyValueInvalid() + + + + + + + + + + + System.String Yoti.Auth.Properties.Resources::get_EndpointMustBeginWithSlash() + + + + + + + + + + + System.String Yoti.Auth.Properties.Resources::get_FormatMismatch() + + + + + + + + + + + System.String Yoti.Auth.Properties.Resources::get_InvalidCastDateTime() + + + + + + + + + + + System.String Yoti.Auth.Properties.Resources::get_InvalidDocumentDetails() + + + + + + + + + + + System.String Yoti.Auth.Properties.Resources::get_IssuanceTokenMissing() + + + + + + + + + + + System.String Yoti.Auth.Properties.Resources::get_NullHTTPContent() + + + + + + + + + + + System.String Yoti.Auth.Properties.Resources::get_NullOrEmptyResponseContent() + + + + + + + + + + + System.String Yoti.Auth.Properties.Resources::get_NullParsedResponse() + + + + + + + + + + + System.String Yoti.Auth.Properties.Resources::get_UnsupportedImageType() + + + + + + + + + + + System.String Yoti.Auth.Properties.Resources::get_UseRelativePath() + + + + + + + + + + + System.Void Yoti.Auth.Properties.Resources::.ctor() + + + + + + + + + + + + + Yoti.Auth.Profile.ApplicationProfile + + + + + Yoti.Auth.Attribute.YotiAttribute`1<System.String> Yoti.Auth.Profile.ApplicationProfile::get_Name() + + + + + + + + + + + Yoti.Auth.Attribute.YotiAttribute`1<System.String> Yoti.Auth.Profile.ApplicationProfile::get_URL() + + + + + + + + + + + Yoti.Auth.Attribute.YotiAttribute`1<Yoti.Auth.Images.Image> Yoti.Auth.Profile.ApplicationProfile::get_Logo() + + + + + + + + + + + Yoti.Auth.Attribute.YotiAttribute`1<System.String> Yoti.Auth.Profile.ApplicationProfile::get_ReceiptBackgroundColor() + + + + + + + + + + + System.Void Yoti.Auth.Profile.ApplicationProfile::.ctor() + + + + + + + + + + + + System.Void Yoti.Auth.Profile.ApplicationProfile::.ctor(System.Collections.Generic.Dictionary`2<System.String,System.Collections.Generic.List`1<Yoti.Auth.Attribute.BaseAttribute>>) + + + + + + + + + + + + + Yoti.Auth.Profile.BaseProfile + + + + + System.Collections.Generic.Dictionary`2<System.String,Yoti.Auth.Attribute.BaseAttribute> Yoti.Auth.Profile.BaseProfile::get_Attributes() + + + + + + + + + + + System.Collections.ObjectModel.ReadOnlyCollection`1<Yoti.Auth.Attribute.BaseAttribute> Yoti.Auth.Profile.BaseProfile::get_AttributeCollection() + + + + + + + + + + + + + + System.Void Yoti.Auth.Profile.BaseProfile::TryAddAttribute(Yoti.Auth.Attribute.BaseAttribute) + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.Profile.BaseProfile::Add(Yoti.Auth.Attribute.YotiAttribute`1<T>) + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.Attribute.YotiAttribute`1<T> Yoti.Auth.Profile.BaseProfile::GetAttributeByName(System.String) + + + + + + + + + + + + + + + + + System.Collections.ObjectModel.ReadOnlyCollection`1<Yoti.Auth.Attribute.YotiAttribute`1<T>> Yoti.Auth.Profile.BaseProfile::GetAttributesByName(System.String) + + + + + + + + + + + + + + + + + + + + Yoti.Auth.Attribute.YotiAttribute`1<T> Yoti.Auth.Profile.BaseProfile::GetAttributeById(System.String) + + + + + + + + + + + + + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.Attribute.YotiAttribute`1<T>> Yoti.Auth.Profile.BaseProfile::FindAttributesStartingWith(System.String) + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.Profile.BaseProfile::.ctor() + + + + + + + + + + + + + + System.Void Yoti.Auth.Profile.BaseProfile::.ctor(System.Collections.Generic.Dictionary`2<System.String,System.Collections.Generic.List`1<Yoti.Auth.Attribute.BaseAttribute>>) + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.Profile.YotiProfile + + + + + Yoti.Auth.Attribute.YotiAttribute`1<Yoti.Auth.Images.Image> Yoti.Auth.Profile.YotiProfile::get_Selfie() + + + + + + + + + + + Yoti.Auth.Attribute.YotiAttribute`1<System.String> Yoti.Auth.Profile.YotiProfile::get_FullName() + + + + + + + + + + + Yoti.Auth.Attribute.YotiAttribute`1<System.String> Yoti.Auth.Profile.YotiProfile::get_GivenNames() + + + + + + + + + + + Yoti.Auth.Attribute.YotiAttribute`1<System.String> Yoti.Auth.Profile.YotiProfile::get_FamilyName() + + + + + + + + + + + Yoti.Auth.Attribute.YotiAttribute`1<System.String> Yoti.Auth.Profile.YotiProfile::get_MobileNumber() + + + + + + + + + + + Yoti.Auth.Attribute.YotiAttribute`1<System.String> Yoti.Auth.Profile.YotiProfile::get_EmailAddress() + + + + + + + + + + + Yoti.Auth.Attribute.YotiAttribute`1<System.DateTime> Yoti.Auth.Profile.YotiProfile::get_DateOfBirth() + + + + + + + + + + + Yoti.Auth.Attribute.YotiAttribute`1<System.String> Yoti.Auth.Profile.YotiProfile::get_Address() + + + + + + + + + + + Yoti.Auth.Attribute.YotiAttribute`1<System.Collections.Generic.Dictionary`2<System.String,Newtonsoft.Json.Linq.JToken>> Yoti.Auth.Profile.YotiProfile::get_StructuredPostalAddress() + + + + + + + + + + + Yoti.Auth.Attribute.YotiAttribute`1<System.String> Yoti.Auth.Profile.YotiProfile::get_Gender() + + + + + + + + + + + Yoti.Auth.Attribute.YotiAttribute`1<System.String> Yoti.Auth.Profile.YotiProfile::get_Nationality() + + + + + + + + + + + Yoti.Auth.Attribute.YotiAttribute`1<Yoti.Auth.Document.DocumentDetails> Yoti.Auth.Profile.YotiProfile::get_DocumentDetails() + + + + + + + + + + + Yoti.Auth.Attribute.YotiAttribute`1<System.Collections.Generic.List`1<Yoti.Auth.Images.Image>> Yoti.Auth.Profile.YotiProfile::get_DocumentImages() + + + + + + + + + + + Yoti.Auth.Attribute.YotiAttribute`1<System.Collections.Generic.Dictionary`2<System.String,Newtonsoft.Json.Linq.JToken>> Yoti.Auth.Profile.YotiProfile::get_IdentityProfileReport() + + + + + + + + + + + System.Collections.ObjectModel.ReadOnlyCollection`1<Yoti.Auth.Verifications.AgeVerification> Yoti.Auth.Profile.YotiProfile::get_AgeVerifications() + + + + + + + + + + + Yoti.Auth.Verifications.AgeVerification Yoti.Auth.Profile.YotiProfile::FindAgeUnderVerification(System.Int32) + + + + + + + + + + + Yoti.Auth.Verifications.AgeVerification Yoti.Auth.Profile.YotiProfile::FindAgeOverVerification(System.Int32) + + + + + + + + + + + System.Void Yoti.Auth.Profile.YotiProfile::.ctor() + + + + + + + + + + + + + System.Void Yoti.Auth.Profile.YotiProfile::.ctor(Yoti.Auth.Profile.IBaseProfile) + + + + + + + + + + + + + System.Void Yoti.Auth.Profile.YotiProfile::.ctor(System.Collections.Generic.Dictionary`2<System.String,System.Collections.Generic.List`1<Yoti.Auth.Attribute.BaseAttribute>>) + + + + + + + + + + + + + + Yoti.Auth.Images.Image + + + + + System.Void Yoti.Auth.Images.Image::.ctor(System.String,System.Byte[]) + + + + + + + + + + + + + Yoti.Auth.Images.JpegImage + + + + + System.Void Yoti.Auth.Images.JpegImage::.ctor(System.Byte[]) + + + + + + + + + + + + + Yoti.Auth.Images.PngImage + + + + + System.Void Yoti.Auth.Images.PngImage::.ctor(System.Byte[]) + + + + + + + + + + + + + Yoti.Auth.Exceptions.AmlException + + + + + System.Void Yoti.Auth.Exceptions.AmlException::.ctor() + + + + + + + + + + + + System.Void Yoti.Auth.Exceptions.AmlException::.ctor(System.String) + + + + + + + + + + + + System.Void Yoti.Auth.Exceptions.AmlException::.ctor(System.String,System.Exception) + + + + + + + + + + + + + Yoti.Auth.Exceptions.DigitalIdentityException + + + + + System.Void Yoti.Auth.Exceptions.DigitalIdentityException::.ctor() + + + + + + + + + + + + System.Void Yoti.Auth.Exceptions.DigitalIdentityException::.ctor(System.String) + + + + + + + + + + + + System.Void Yoti.Auth.Exceptions.DigitalIdentityException::.ctor(System.String,System.Exception) + + + + + + + + + + + + + Yoti.Auth.Exceptions.DocScanException + + + + + System.Void Yoti.Auth.Exceptions.DocScanException::.ctor() + + + + + + + + + + + + System.Void Yoti.Auth.Exceptions.DocScanException::.ctor(System.String) + + + + + + + + + + + + System.Void Yoti.Auth.Exceptions.DocScanException::.ctor(System.String,System.Exception) + + + + + + + + + + + + + Yoti.Auth.Exceptions.DynamicShareException + + + + + System.Void Yoti.Auth.Exceptions.DynamicShareException::.ctor() + + + + + + + + + + + + System.Void Yoti.Auth.Exceptions.DynamicShareException::.ctor(System.String) + + + + + + + + + + + + System.Void Yoti.Auth.Exceptions.DynamicShareException::.ctor(System.String,System.Exception) + + + + + + + + + + + + + Yoti.Auth.Exceptions.ExtraDataException + + + + + System.Void Yoti.Auth.Exceptions.ExtraDataException::.ctor() + + + + + + + + + + + + System.Void Yoti.Auth.Exceptions.ExtraDataException::.ctor(System.String) + + + + + + + + + + + + System.Void Yoti.Auth.Exceptions.ExtraDataException::.ctor(System.String,System.Exception) + + + + + + + + + + + + + Yoti.Auth.Exceptions.YotiException + + + + + System.Net.Http.HttpResponseMessage Yoti.Auth.Exceptions.YotiException::get_HttpResponseMessage() + + + + + + + + + + + System.Void Yoti.Auth.Exceptions.YotiException::.ctor() + + + + + + + + + + + + System.Void Yoti.Auth.Exceptions.YotiException::.ctor(System.String) + + + + + + + + + + + + System.Void Yoti.Auth.Exceptions.YotiException::.ctor(System.String,System.Exception) + + + + + + + + + + + + + Yoti.Auth.Exceptions.YotiProfileException + + + + + System.String Yoti.Auth.Exceptions.YotiProfileException::get_ResponseContent() + + + + + + + + + + + System.String Yoti.Auth.Exceptions.YotiProfileException::get_ErrorCode() + + + + + + + + + + + System.Void Yoti.Auth.Exceptions.YotiProfileException::.ctor() + + + + + + + + + + + + System.Void Yoti.Auth.Exceptions.YotiProfileException::.ctor(System.String) + + + + + + + + + + + + System.Void Yoti.Auth.Exceptions.YotiProfileException::.ctor(System.String,System.String) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.Exceptions.YotiProfileException::.ctor(System.String,System.Exception) + + + + + + + + + + + + + Yoti.Auth.Document.DocumentDetails + + + + + System.String Yoti.Auth.Document.DocumentDetails::get_IssuingCountry() + + + + + + + + + + + System.String Yoti.Auth.Document.DocumentDetails::get_DocumentNumber() + + + + + + + + + + + System.Nullable`1<System.DateTime> Yoti.Auth.Document.DocumentDetails::get_ExpirationDate() + + + + + + + + + + + System.String Yoti.Auth.Document.DocumentDetails::get_DocumentType() + + + + + + + + + + + System.String Yoti.Auth.Document.DocumentDetails::get_IssuingAuthority() + + + + + + + + + + + System.String Yoti.Auth.Document.DocumentDetails::ToString() + + + + + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.Document.DocumentDetails::.ctor(System.String,System.String,System.String,System.Nullable`1<System.DateTime>,System.String) + + + + + + + + + + + + + + + + + + Yoti.Auth.Document.DocumentDetailsAttributeParser + + + + + Yoti.Auth.Document.DocumentDetails Yoti.Auth.Document.DocumentDetailsAttributeParser::ParseFrom(System.String) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + System.Nullable`1<System.DateTime> Yoti.Auth.Document.DocumentDetailsAttributeParser::GetDateSafely(System.String[],System.Int32) + + + + + + + + + + + + + + + + + + + + + + + + + + + + System.String Yoti.Auth.Document.DocumentDetailsAttributeParser::GetSafely(System.String[],System.Int32) + + + + + + + + + + + + + + + + + + Yoti.Auth.Document.DocumentDetailsBuilder + + + + + Yoti.Auth.Document.DocumentDetailsBuilder Yoti.Auth.Document.DocumentDetailsBuilder::WithType(System.String) + + + + + + + + + + + + Yoti.Auth.Document.DocumentDetailsBuilder Yoti.Auth.Document.DocumentDetailsBuilder::WithIssuingCountry(System.String) + + + + + + + + + + + + Yoti.Auth.Document.DocumentDetailsBuilder Yoti.Auth.Document.DocumentDetailsBuilder::WithNumber(System.String) + + + + + + + + + + + + Yoti.Auth.Document.DocumentDetailsBuilder Yoti.Auth.Document.DocumentDetailsBuilder::WithDate(System.Nullable`1<System.DateTime>) + + + + + + + + + + + + Yoti.Auth.Document.DocumentDetailsBuilder Yoti.Auth.Document.DocumentDetailsBuilder::WithAuthority(System.String) + + + + + + + + + + + + Yoti.Auth.Document.DocumentDetails Yoti.Auth.Document.DocumentDetailsBuilder::Build() + + + + + + + + + + + + + + System.Void Yoti.Auth.Document.DocumentDetailsBuilder::.ctor() + + + + + + + + + + + + + Yoti.Auth.DocScan.DocScanClient + + + + + Yoti.Auth.DocScan.Session.Create.CreateSessionResult Yoti.Auth.DocScan.DocScanClient::CreateSession(Yoti.Auth.DocScan.Session.Create.SessionSpecification) + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.GetSessionResult Yoti.Auth.DocScan.DocScanClient::GetSession(System.String) + + + + + + + + + + + System.Void Yoti.Auth.DocScan.DocScanClient::DeleteSession(System.String) + + + + + + + + + + + + Yoti.Auth.MediaValue Yoti.Auth.DocScan.DocScanClient::GetMediaContent(System.String,System.String) + + + + + + + + + + + System.Void Yoti.Auth.DocScan.DocScanClient::DeleteMediaContent(System.String,System.String) + + + + + + + + + + + + Yoti.Auth.DocScan.Support.SupportedDocumentsResponse Yoti.Auth.DocScan.DocScanClient::GetSupportedDocuments(System.Boolean) + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.CreateFaceCaptureResourceResponse.CreateFaceCaptureResourceResponse Yoti.Auth.DocScan.DocScanClient::CreateFaceCaptureResource(System.String,Yoti.Auth.DocScan.Session.Create.FaceCapture.CreateFaceCaptureResourcePayload) + + + + + + + + + + + System.Void Yoti.Auth.DocScan.DocScanClient::UploadFaceCaptureImage(System.String,System.String,Yoti.Auth.DocScan.Session.Create.FaceCapture.UploadFaceCaptureImagePayload) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.Configuration.SessionConfigurationResponse Yoti.Auth.DocScan.DocScanClient::GetSessionConfiguration(System.String) + + + + + + + + + + + System.Void Yoti.Auth.DocScan.DocScanClient::.ctor(System.String,System.IO.StreamReader,System.Net.Http.HttpClient,System.Uri) + + + + + + + + + + + + System.Void Yoti.Auth.DocScan.DocScanClient::.ctor(System.String,Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair,System.Net.Http.HttpClient,System.Uri) + + + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.DocScan.DocScanClient/<CreateFaceCaptureResourceAsync>d__19 + + + + + System.Void Yoti.Auth.DocScan.DocScanClient/<CreateFaceCaptureResourceAsync>d__19::MoveNext() + + + + + + + + + + + + + + Yoti.Auth.DocScan.DocScanClient/<CreateSessionAsync>d__6 + + + + + System.Void Yoti.Auth.DocScan.DocScanClient/<CreateSessionAsync>d__6::MoveNext() + + + + + + + + + + + + + + Yoti.Auth.DocScan.DocScanClient/<DeleteMediaContentAsync>d__15 + + + + + System.Void Yoti.Auth.DocScan.DocScanClient/<DeleteMediaContentAsync>d__15::MoveNext() + + + + + + + + + + + + + + Yoti.Auth.DocScan.DocScanClient/<DeleteSessionAsync>d__10 + + + + + System.Void Yoti.Auth.DocScan.DocScanClient/<DeleteSessionAsync>d__10::MoveNext() + + + + + + + + + + + + + + Yoti.Auth.DocScan.DocScanClient/<GetMediaContentAsync>d__12 + + + + + System.Void Yoti.Auth.DocScan.DocScanClient/<GetMediaContentAsync>d__12::MoveNext() + + + + + + + + + + + + + + Yoti.Auth.DocScan.DocScanClient/<GetSessionAsync>d__8 + + + + + System.Void Yoti.Auth.DocScan.DocScanClient/<GetSessionAsync>d__8::MoveNext() + + + + + + + + + + + + + + Yoti.Auth.DocScan.DocScanClient/<GetSessionConfigurationAsync>d__23 + + + + + System.Void Yoti.Auth.DocScan.DocScanClient/<GetSessionConfigurationAsync>d__23::MoveNext() + + + + + + + + + + + + + + Yoti.Auth.DocScan.DocScanClient/<GetSupportedDocumentsAsync>d__17 + + + + + System.Void Yoti.Auth.DocScan.DocScanClient/<GetSupportedDocumentsAsync>d__17::MoveNext() + + + + + + + + + + + + + + Yoti.Auth.DocScan.DocScanClient/<UploadFaceCaptureImageAsync>d__21 + + + + + System.Void Yoti.Auth.DocScan.DocScanClient/<UploadFaceCaptureImageAsync>d__21::MoveNext() + + + + + + + + + + + + + + Yoti.Auth.DocScan.DocScanService + + + + + System.Uri Yoti.Auth.DocScan.DocScanService::get_ApiUri() + + + + + + + + + + + System.Uri Yoti.Auth.DocScan.DocScanService::GetApiUri() + + + + + + + + + + + + + + + + Yoti.Auth.Web.RequestBuilder Yoti.Auth.DocScan.DocScanService::GetSignedRequestBuilder() + + + + + + + + + + + System.String Yoti.Auth.DocScan.DocScanService::SessionEndpoint(System.String) + + + + + + + + + + + System.String Yoti.Auth.DocScan.DocScanService::MediaEndpoint(System.String,System.String) + + + + + + + + + + + Newtonsoft.Json.JsonSerializerSettings Yoti.Auth.DocScan.DocScanService::get_YotiDefaultJsonSettings() + + + + + + + + + + + System.Void Yoti.Auth.DocScan.DocScanService::.ctor(System.Net.Http.HttpClient,System.Uri) + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.DocScan.DocScanService/<>c__DisplayClass10_0 + + + + + Yoti.Auth.MediaValue Yoti.Auth.DocScan.DocScanService/<>c__DisplayClass10_0::<GetMediaContent>b__0() + + + + + + + + + + + + Yoti.Auth.DocScan.DocScanService/<>c__DisplayClass12_0 + + + + + Yoti.Auth.DocScan.Support.SupportedDocumentsResponse Yoti.Auth.DocScan.DocScanService/<>c__DisplayClass12_0::<GetSupportedDocuments>b__0() + + + + + + + + + + + + Yoti.Auth.DocScan.DocScanService/<>c__DisplayClass13_0 + + + + + Yoti.Auth.DocScan.Session.Retrieve.CreateFaceCaptureResourceResponse.CreateFaceCaptureResourceResponse Yoti.Auth.DocScan.DocScanService/<>c__DisplayClass13_0::<CreateFaceCaptureResource>b__0() + + + + + + + + + + + + Yoti.Auth.DocScan.DocScanService/<>c__DisplayClass15_0 + + + + + Yoti.Auth.DocScan.Session.Retrieve.Configuration.SessionConfigurationResponse Yoti.Auth.DocScan.DocScanService/<>c__DisplayClass15_0::<GetSessionConfiguration>b__0() + + + + + + + + + + + + Yoti.Auth.DocScan.DocScanService/<>c__DisplayClass7_0 + + + + + Yoti.Auth.DocScan.Session.Create.CreateSessionResult Yoti.Auth.DocScan.DocScanService/<>c__DisplayClass7_0::<CreateSession>b__0() + + + + + + + + + + + + Yoti.Auth.DocScan.DocScanService/<>c__DisplayClass8_0 + + + + + Yoti.Auth.DocScan.Session.Retrieve.GetSessionResult Yoti.Auth.DocScan.DocScanService/<>c__DisplayClass8_0::<GetSession>b__0() + + + + + + + + + + + + Yoti.Auth.DocScan.DocScanService/<CreateFaceCaptureResource>d__13 + + + + + System.Void Yoti.Auth.DocScan.DocScanService/<CreateFaceCaptureResource>d__13::MoveNext() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.DocScan.DocScanService/<CreateSession>d__7 + + + + + System.Void Yoti.Auth.DocScan.DocScanService/<CreateSession>d__7::MoveNext() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.DocScan.DocScanService/<DeleteMediaContent>d__11 + + + + + System.Void Yoti.Auth.DocScan.DocScanService/<DeleteMediaContent>d__11::MoveNext() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.DocScan.DocScanService/<DeleteSession>d__9 + + + + + System.Void Yoti.Auth.DocScan.DocScanService/<DeleteSession>d__9::MoveNext() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.DocScan.DocScanService/<GetMediaContent>d__10 + + + + + System.Void Yoti.Auth.DocScan.DocScanService/<GetMediaContent>d__10::MoveNext() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.DocScan.DocScanService/<GetSession>d__8 + + + + + System.Void Yoti.Auth.DocScan.DocScanService/<GetSession>d__8::MoveNext() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.DocScan.DocScanService/<GetSessionConfiguration>d__15 + + + + + System.Void Yoti.Auth.DocScan.DocScanService/<GetSessionConfiguration>d__15::MoveNext() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.DocScan.DocScanService/<GetSupportedDocuments>d__12 + + + + + System.Void Yoti.Auth.DocScan.DocScanService/<GetSupportedDocuments>d__12::MoveNext() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.DocScan.DocScanService/<UploadFaceCaptureImage>d__14 + + + + + System.Void Yoti.Auth.DocScan.DocScanService/<UploadFaceCaptureImage>d__14::MoveNext() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.DocScan.Support.SupportedCountry + + + + + System.String Yoti.Auth.DocScan.Support.SupportedCountry::get_Code() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Support.SupportedDocument> Yoti.Auth.DocScan.Support.SupportedCountry::get_SupportedDocuments() + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Support.SupportedCountry::.ctor(System.String,System.Collections.Generic.List`1<Yoti.Auth.DocScan.Support.SupportedDocument>) + + + + + + + + + + + + + + + Yoti.Auth.DocScan.Support.SupportedDocument + + + + + System.String Yoti.Auth.DocScan.Support.SupportedDocument::get_Type() + + + + + + + + + + + System.Boolean Yoti.Auth.DocScan.Support.SupportedDocument::get_IsStrictlyLatin() + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Support.SupportedDocument::.ctor(System.String,System.Boolean) + + + + + + + + + + + + + + + Yoti.Auth.DocScan.Support.SupportedDocumentsResponse + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Support.SupportedCountry> Yoti.Auth.DocScan.Support.SupportedDocumentsResponse::get_SupportedCountries() + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Support.SupportedDocumentsResponse::.ctor(System.Collections.Generic.List`1<Yoti.Auth.DocScan.Support.SupportedCountry>) + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.BreakdownResponse + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.BreakdownResponse::get_SubCheck() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.BreakdownResponse::get_Result() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Retrieve.DetailsResponse> Yoti.Auth.DocScan.Session.Retrieve.BreakdownResponse::get_Details() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.ReportResponse + + + + + Yoti.Auth.DocScan.Session.Retrieve.RecommendationResponse Yoti.Auth.DocScan.Session.Retrieve.ReportResponse::get_Recommendation() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Retrieve.BreakdownResponse> Yoti.Auth.DocScan.Session.Retrieve.ReportResponse::get_Breakdown() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.DetailsResponse + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.DetailsResponse::get_Name() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.DetailsResponse::get_Value() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.DocumentFieldsResponse + + + + + Yoti.Auth.DocScan.Session.Retrieve.MediaResponse Yoti.Auth.DocScan.Session.Retrieve.DocumentFieldsResponse::get_Media() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.DocumentIdPhotoResponse + + + + + Yoti.Auth.DocScan.Session.Retrieve.MediaResponse Yoti.Auth.DocScan.Session.Retrieve.DocumentIdPhotoResponse::get_Media() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.FaceCaptureImageResponse + + + + + Yoti.Auth.DocScan.Session.Retrieve.MediaResponse Yoti.Auth.DocScan.Session.Retrieve.FaceCaptureImageResponse::get_Media() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.FaceCaptureResourceResponse + + + + + Yoti.Auth.DocScan.Session.Retrieve.FaceCaptureImageResponse Yoti.Auth.DocScan.Session.Retrieve.FaceCaptureResourceResponse::get_Image() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.FaceMapResponse + + + + + Yoti.Auth.DocScan.Session.Retrieve.MediaResponse Yoti.Auth.DocScan.Session.Retrieve.FaceMapResponse::get_Media() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.FileResponse + + + + + Yoti.Auth.DocScan.Session.Retrieve.MediaResponse Yoti.Auth.DocScan.Session.Retrieve.FileResponse::get_Media() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.FrameResponse + + + + + Yoti.Auth.DocScan.Session.Retrieve.MediaResponse Yoti.Auth.DocScan.Session.Retrieve.FrameResponse::get_Media() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.GeneratedMedia + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.GeneratedMedia::get_Id() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.GeneratedMedia::get_Type() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.GetSessionResult + + + + + System.Int32 Yoti.Auth.DocScan.Session.Retrieve.GetSessionResult::get_ClientSessionTokenTtl() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.GetSessionResult::get_ClientSessionToken() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.GetSessionResult::get_SessionId() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.GetSessionResult::get_UserTrackingId() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.GetSessionResult::get_State() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Retrieve.Check.CheckResponse> Yoti.Auth.DocScan.Session.Retrieve.GetSessionResult::get_Checks() + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.Resource.ResourceContainer Yoti.Auth.DocScan.Session.Retrieve.GetSessionResult::get_Resources() + + + + + + + + + + + System.Nullable`1<System.DateTime> Yoti.Auth.DocScan.Session.Retrieve.GetSessionResult::get_BiometricConsentTimestamp() + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.IdentityProfile.IdentityProfileResponse Yoti.Auth.DocScan.Session.Retrieve.GetSessionResult::get_IdentityProfile() + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.IdentityProfilePreview.IdentityProfilePreviewResponse Yoti.Auth.DocScan.Session.Retrieve.GetSessionResult::get_IdentityProfilePreviewResponse() + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.IdentityProfile.IdentityProfileResponse Yoti.Auth.DocScan.Session.Retrieve.GetSessionResult::get_AdvancedIdentityProfile() + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.IdentityProfilePreview.IdentityProfilePreviewResponse Yoti.Auth.DocScan.Session.Retrieve.GetSessionResult::get_AdvancedIdentityProfilePreviewResponse() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Retrieve.Check.AuthenticityCheckResponse> Yoti.Auth.DocScan.Session.Retrieve.GetSessionResult::GetAuthenticityChecks() + + + + + + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Retrieve.Check.FaceMatchCheckResponse> Yoti.Auth.DocScan.Session.Retrieve.GetSessionResult::GetFaceMatchChecks() + + + + + + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Retrieve.Check.TextDataCheckResponse> Yoti.Auth.DocScan.Session.Retrieve.GetSessionResult::GetTextDataChecks() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Retrieve.Check.TextDataCheckResponse> Yoti.Auth.DocScan.Session.Retrieve.GetSessionResult::GetIdDocumentTextDataChecks() + + + + + + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Retrieve.Check.LivenessCheckResponse> Yoti.Auth.DocScan.Session.Retrieve.GetSessionResult::GetLivenessChecks() + + + + + + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Retrieve.Check.IdDocumentComparisonCheckResponse> Yoti.Auth.DocScan.Session.Retrieve.GetSessionResult::GetIdDocumentComparisonChecks() + + + + + + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Retrieve.Check.SupplementaryDocTextDataCheckResponse> Yoti.Auth.DocScan.Session.Retrieve.GetSessionResult::GetSupplementaryDocTextDataChecks() + + + + + + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Retrieve.Check.ThirdPartyIdentityCheckResponse> Yoti.Auth.DocScan.Session.Retrieve.GetSessionResult::GetThirdPartyIdentityChecks() + + + + + + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Retrieve.Check.ThirdPartyIdentityFraudOneCheckResponse> Yoti.Auth.DocScan.Session.Retrieve.GetSessionResult::GetThirdPartyIdentityFraudOneChecks() + + + + + + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Retrieve.Check.WatchlistScreeningCheckResponse> Yoti.Auth.DocScan.Session.Retrieve.GetSessionResult::GetWatchlistScreeningChecks() + + + + + + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Retrieve.Check.WatchlistAdvancedCaCheckResponse> Yoti.Auth.DocScan.Session.Retrieve.GetSessionResult::GetWatchlistAdvancedCaChecks() + + + + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.MediaResponse + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.MediaResponse::get_Id() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.MediaResponse::get_Type() + + + + + + + + + + + System.DateTime Yoti.Auth.DocScan.Session.Retrieve.MediaResponse::get_Created() + + + + + + + + + + + System.DateTime Yoti.Auth.DocScan.Session.Retrieve.MediaResponse::get_LastUpdated() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.PageResponse + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.PageResponse::get_CaptureMethod() + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.MediaResponse Yoti.Auth.DocScan.Session.Retrieve.PageResponse::get_Media() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Retrieve.FrameResponse> Yoti.Auth.DocScan.Session.Retrieve.PageResponse::get_Frames() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.RecommendationResponse + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.RecommendationResponse::get_Value() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.RecommendationResponse::get_Reason() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.RecommendationResponse::get_RecoverySuggestion() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.ShareCodeMediaResponse + + + + + Yoti.Auth.DocScan.Session.Retrieve.MediaResponse Yoti.Auth.DocScan.Session.Retrieve.ShareCodeMediaResponse::get_Media() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.StaticLivenessImageResponse + + + + + Yoti.Auth.DocScan.Session.Retrieve.MediaResponse Yoti.Auth.DocScan.Session.Retrieve.StaticLivenessImageResponse::get_Media() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.StaticLivenessResourceResponse + + + + + Yoti.Auth.DocScan.Session.Retrieve.StaticLivenessImageResponse Yoti.Auth.DocScan.Session.Retrieve.StaticLivenessResourceResponse::get_image() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.ZoomLivenessResourceResponse + + + + + Yoti.Auth.DocScan.Session.Retrieve.FaceMapResponse Yoti.Auth.DocScan.Session.Retrieve.ZoomLivenessResourceResponse::get_FaceMap() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Retrieve.FrameResponse> Yoti.Auth.DocScan.Session.Retrieve.ZoomLivenessResourceResponse::get_Frames() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.Task.GeneratedCheckResponse + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.Task.GeneratedCheckResponse::get_Id() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.Task.GeneratedCheckResponse::get_Type() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.Task.TaskResponse + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.Task.TaskResponse::get_Id() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.Task.TaskResponse::get_Type() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.Task.TaskResponse::get_State() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.Task.TaskResponse::get_Created() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.Task.TaskResponse::get_LastUpdated() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Retrieve.Task.GeneratedCheckResponse> Yoti.Auth.DocScan.Session.Retrieve.Task.TaskResponse::get_GeneratedChecks() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Retrieve.GeneratedMedia> Yoti.Auth.DocScan.Session.Retrieve.Task.TaskResponse::get_GeneratedMedia() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Retrieve.Task.GeneratedTextDataCheckResponse> Yoti.Auth.DocScan.Session.Retrieve.Task.TaskResponse::GetGeneratedTextDataChecks() + + + + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.Resource.AllowedSourceResponse + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.Resource.AllowedSourceResponse::get_Type() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.Resource.ApplicantProfileResourceResponse + + + + + Yoti.Auth.DocScan.Session.Retrieve.MediaResponse Yoti.Auth.DocScan.Session.Retrieve.Resource.ApplicantProfileResourceResponse::get_Media() + + + + + + + + + + + System.Nullable`1<System.DateTime> Yoti.Auth.DocScan.Session.Retrieve.Resource.ApplicantProfileResourceResponse::get_CreatedAt() + + + + + + + + + + + System.Nullable`1<System.DateTime> Yoti.Auth.DocScan.Session.Retrieve.Resource.ApplicantProfileResourceResponse::get_LastUpdated() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.Resource.IdDocumentResourceResponse + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.Resource.IdDocumentResourceResponse::get_DocumentType() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.Resource.IdDocumentResourceResponse::get_IssuingCountry() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Retrieve.PageResponse> Yoti.Auth.DocScan.Session.Retrieve.Resource.IdDocumentResourceResponse::get_Pages() + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.DocumentFieldsResponse Yoti.Auth.DocScan.Session.Retrieve.Resource.IdDocumentResourceResponse::get_DocumentFields() + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.DocumentIdPhotoResponse Yoti.Auth.DocScan.Session.Retrieve.Resource.IdDocumentResourceResponse::get_DocumentIdPhoto() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Retrieve.Task.TextExtractionTaskResponse> Yoti.Auth.DocScan.Session.Retrieve.Resource.IdDocumentResourceResponse::GetTextExtractionTasks() + + + + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.Resource.LivenessResourceResponse + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.Resource.LivenessResourceResponse::get_LivenessType() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.Resource.ResourceContainer + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Retrieve.Resource.IdDocumentResourceResponse> Yoti.Auth.DocScan.Session.Retrieve.Resource.ResourceContainer::get_IdDocuments() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Retrieve.Resource.SupplementaryDocResourceResponse> Yoti.Auth.DocScan.Session.Retrieve.Resource.ResourceContainer::get_SupplementaryDocuments() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Retrieve.Resource.LivenessResourceResponse> Yoti.Auth.DocScan.Session.Retrieve.Resource.ResourceContainer::get_LivenessCapture() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Retrieve.FaceCaptureResourceResponse> Yoti.Auth.DocScan.Session.Retrieve.Resource.ResourceContainer::get_FaceCapture() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Retrieve.Resource.ShareCodeResourceResponse> Yoti.Auth.DocScan.Session.Retrieve.Resource.ResourceContainer::get_ShareCodes() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Retrieve.Resource.ApplicantProfileResourceResponse> Yoti.Auth.DocScan.Session.Retrieve.Resource.ResourceContainer::get_ApplicantProfiles() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Retrieve.ZoomLivenessResourceResponse> Yoti.Auth.DocScan.Session.Retrieve.Resource.ResourceContainer::get_ZoomLivenessResources() + + + + + + + + + + + + + + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Retrieve.StaticLivenessResourceResponse> Yoti.Auth.DocScan.Session.Retrieve.Resource.ResourceContainer::get_StaticLivenessResources() + + + + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.Resource.ResourceResponse + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.Resource.ResourceResponse::get_Id() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Retrieve.Task.TaskResponse> Yoti.Auth.DocScan.Session.Retrieve.Resource.ResourceResponse::get_Tasks() + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.Resource.AllowedSourceResponse Yoti.Auth.DocScan.Session.Retrieve.Resource.ResourceResponse::get_Source() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.Resource.ShareCodeResourceResponse + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.Resource.ShareCodeResourceResponse::get_CreatedAt() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.Resource.ShareCodeResourceResponse::get_LastUpdated() + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.ShareCodeMediaResponse Yoti.Auth.DocScan.Session.Retrieve.Resource.ShareCodeResourceResponse::get_LookupProfile() + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.ShareCodeMediaResponse Yoti.Auth.DocScan.Session.Retrieve.Resource.ShareCodeResourceResponse::get_ReturnedProfile() + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.ShareCodeMediaResponse Yoti.Auth.DocScan.Session.Retrieve.Resource.ShareCodeResourceResponse::get_IdPhoto() + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.ShareCodeMediaResponse Yoti.Auth.DocScan.Session.Retrieve.Resource.ShareCodeResourceResponse::get_File() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Retrieve.Task.VerifyShareCodeTaskResponse> Yoti.Auth.DocScan.Session.Retrieve.Resource.ShareCodeResourceResponse::GetVerifyShareCodeTasks() + + + + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.Resource.SupplementaryDocResourceResponse + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.Resource.SupplementaryDocResourceResponse::get_DocumentType() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.Resource.SupplementaryDocResourceResponse::get_IssuingCountry() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Retrieve.PageResponse> Yoti.Auth.DocScan.Session.Retrieve.Resource.SupplementaryDocResourceResponse::get_Pages() + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.DocumentFieldsResponse Yoti.Auth.DocScan.Session.Retrieve.Resource.SupplementaryDocResourceResponse::get_DocumentFields() + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.FileResponse Yoti.Auth.DocScan.Session.Retrieve.Resource.SupplementaryDocResourceResponse::get_DocumentFile() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Retrieve.Task.SupplementaryDocTextExtractionTaskResponse> Yoti.Auth.DocScan.Session.Retrieve.Resource.SupplementaryDocResourceResponse::GetTextExtractionTasks() + + + + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.IdentityProfilePreview.IdentityProfilePreviewResponse + + + + + Yoti.Auth.DocScan.Session.Retrieve.MediaResponse Yoti.Auth.DocScan.Session.Retrieve.IdentityProfilePreview.IdentityProfilePreviewResponse::get_Media() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.IdentityProfile.FailureReasonResponse + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.IdentityProfile.FailureReasonResponse::get_ReasonCode() + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.IdentityProfile.RequirementNotMetDetails Yoti.Auth.DocScan.Session.Retrieve.IdentityProfile.FailureReasonResponse::get_RequirementNotMetDetails() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.IdentityProfile.IdentityProfileResponse + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.IdentityProfile.IdentityProfileResponse::get_SubjectId() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.IdentityProfile.IdentityProfileResponse::get_Result() + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.IdentityProfile.FailureReasonResponse Yoti.Auth.DocScan.Session.Retrieve.IdentityProfile.IdentityProfileResponse::get_FailureReason() + + + + + + + + + + + System.Collections.Generic.Dictionary`2<System.String,Newtonsoft.Json.Linq.JToken> Yoti.Auth.DocScan.Session.Retrieve.IdentityProfile.IdentityProfileResponse::get_Report() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.IdentityProfile.RequirementNotMetDetails + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.IdentityProfile.RequirementNotMetDetails::get_FailureType() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.IdentityProfile.RequirementNotMetDetails::get_DocumentType() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.IdentityProfile.RequirementNotMetDetails::get_DocumentCountryIsoCode() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.IdentityProfile.RequirementNotMetDetails::get_AuditId() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.IdentityProfile.RequirementNotMetDetails::get_Details() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.CreateFaceCaptureResourceResponse.CreateFaceCaptureResourceResponse + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.CreateFaceCaptureResourceResponse.CreateFaceCaptureResourceResponse::get_Id() + + + + + + + + + + + System.Int32 Yoti.Auth.DocScan.Session.Retrieve.CreateFaceCaptureResourceResponse.CreateFaceCaptureResourceResponse::get_Frames() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.Configuration.SessionConfigurationResponse + + + + + System.Int32 Yoti.Auth.DocScan.Session.Retrieve.Configuration.SessionConfigurationResponse::get_ClientSessionTokenTtl() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.Configuration.SessionConfigurationResponse::get_SessionId() + + + + + + + + + + + System.Collections.Generic.List`1<System.String> Yoti.Auth.DocScan.Session.Retrieve.Configuration.SessionConfigurationResponse::get_RequestedChecks() + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.CaptureResponse Yoti.Auth.DocScan.Session.Retrieve.Configuration.SessionConfigurationResponse::get_Capture() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.CaptureResponse + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.CaptureResponse::get_BiometricConsent() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.RequiredResourceResponse> Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.CaptureResponse::get_RequiredResources() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.Document.RequiredDocumentResourceResponse> Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.CaptureResponse::GetDocumentResourceRequirements() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.Document.RequiredIdDocumentResourceResponse> Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.CaptureResponse::GetIdDocumentResourceRequirements() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.Document.RequiredSupplementaryDocumentResourceResponse> Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.CaptureResponse::GetSupplementaryResourceRequirements() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.Liveness.RequiredLivenessResourceResponse> Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.CaptureResponse::GetLivenessResourceRequirements() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.Liveness.RequiredZoomLivenessResourceResponse> Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.CaptureResponse::GetZoomLivenessResourceRequirements() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.FaceCapture.RequiredFaceCaptureResourceResponse> Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.CaptureResponse::GetFaceCaptureResourceRequirements() + + + + + + + + + + + System.Collections.Generic.List`1<TResourceType> Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.CaptureResponse::FilterRequiredResources() + + + + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.RequiredResourceResponse + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.RequiredResourceResponse::get_Type() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.RequiredResourceResponse::get_Id() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.RequiredResourceResponse::get_State() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Retrieve.Resource.AllowedSourceResponse> Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.RequiredResourceResponse::get_AllowedSources() + + + + + + + + + + + System.Boolean Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.RequiredResourceResponse::get_IsRelyingBusinessAllowed() + + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.Task.RequestedTaskResponse + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.Task.RequestedTaskResponse::get_Type() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.Task.RequestedTaskResponse::get_State() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.Liveness.RequiredLivenessResourceResponse + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.Liveness.RequiredLivenessResourceResponse::get_LivenessType() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.Document.ObjectiveResponse + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.Document.ObjectiveResponse::get_Type() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.Document.RequiredDocumentResourceResponse + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.Task.RequestedTaskResponse> Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.Document.RequiredDocumentResourceResponse::get_RequestedTasks() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.Document.RequiredIdDocumentResourceResponse + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.Document.SupportedCountryResponse> Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.Document.RequiredIdDocumentResourceResponse::get_SupportedCountries() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.Document.RequiredIdDocumentResourceResponse::get_AllowedCaptureMethods() + + + + + + + + + + + System.Collections.Generic.Dictionary`2<System.String,System.Int32> Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.Document.RequiredIdDocumentResourceResponse::get_AttemptsRemaining() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.Document.RequiredSupplementaryDocumentResourceResponse + + + + + System.Collections.Generic.List`1<System.String> Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.Document.RequiredSupplementaryDocumentResourceResponse::get_DocumentTypes() + + + + + + + + + + + System.Collections.Generic.List`1<System.String> Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.Document.RequiredSupplementaryDocumentResourceResponse::get_CountryCodes() + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.Document.ObjectiveResponse Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.Document.RequiredSupplementaryDocumentResourceResponse::get_Objective() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.Document.SupportedCountryResponse + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.Document.SupportedCountryResponse::get_Code() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.Document.SupportedDocumentResponse> Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.Document.SupportedCountryResponse::get_SupportedDocuments() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.Document.SupportedDocumentResponse + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.Document.SupportedDocumentResponse::get_Type() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.Configuration.Capture.Document.SupportedDocumentResponse::get_IsStrictlyLatin() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.Check.CheckResponse + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.Check.CheckResponse::get_Id() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.Check.CheckResponse::get_Type() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.Check.CheckResponse::get_State() + + + + + + + + + + + System.Collections.Generic.List`1<System.String> Yoti.Auth.DocScan.Session.Retrieve.Check.CheckResponse::get_ResourcesUsed() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Retrieve.GeneratedMedia> Yoti.Auth.DocScan.Session.Retrieve.Check.CheckResponse::get_GeneratedMedia() + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.ReportResponse Yoti.Auth.DocScan.Session.Retrieve.Check.CheckResponse::get_Report() + + + + + + + + + + + System.DateTime Yoti.Auth.DocScan.Session.Retrieve.Check.CheckResponse::get_Created() + + + + + + + + + + + System.DateTime Yoti.Auth.DocScan.Session.Retrieve.Check.CheckResponse::get_LastUpdated() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.Check.GeneratedProfileResponse + + + + + Yoti.Auth.DocScan.Session.Retrieve.MediaResponse Yoti.Auth.DocScan.Session.Retrieve.Check.GeneratedProfileResponse::get_Media() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.Check.ProfileCheckResponse + + + + + Yoti.Auth.DocScan.Session.Retrieve.Check.GeneratedProfileResponse Yoti.Auth.DocScan.Session.Retrieve.Check.ProfileCheckResponse::get_GeneratedProfile() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.Check.WatchlistSummary.CaMatchingStrategyResponse + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.Check.WatchlistSummary.CaMatchingStrategyResponse::get_Type() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.Check.WatchlistSummary.CaSourcesResponse + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.Check.WatchlistSummary.CaSourcesResponse::get_Type() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.Check.WatchlistSummary.ExactMatchingStrategyResponse + + + + + System.Boolean Yoti.Auth.DocScan.Session.Retrieve.Check.WatchlistSummary.ExactMatchingStrategyResponse::get_ExactMatch() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.Check.WatchlistSummary.FuzzyMatchingStrategyResponse + + + + + System.Double Yoti.Auth.DocScan.Session.Retrieve.Check.WatchlistSummary.FuzzyMatchingStrategyResponse::get_Fuzziness() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.Check.WatchlistSummary.RawResults + + + + + Yoti.Auth.DocScan.Session.Retrieve.MediaResponse Yoti.Auth.DocScan.Session.Retrieve.Check.WatchlistSummary.RawResults::get_Media() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.Check.WatchlistSummary.ReportResponseWithSummary + + + + + Yoti.Auth.DocScan.Session.Retrieve.Check.WatchlistSummary.WatchlistSummary Yoti.Auth.DocScan.Session.Retrieve.Check.WatchlistSummary.ReportResponseWithSummary::get_WatchlistSummary() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.Check.WatchlistSummary.SearchProfileSourcesResponse + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.Check.WatchlistSummary.SearchProfileSourcesResponse::get_SearchProfile() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.Check.WatchlistSummary.TypeListSourcesResponse + + + + + System.Collections.Generic.List`1<System.String> Yoti.Auth.DocScan.Session.Retrieve.Check.WatchlistSummary.TypeListSourcesResponse::get_Types() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.Check.WatchlistSummary.WatchlistAdvancedCaSearchConfigResponse + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.Check.WatchlistSummary.WatchlistAdvancedCaSearchConfigResponse::get_Type() + + + + + + + + + + + System.Boolean Yoti.Auth.DocScan.Session.Retrieve.Check.WatchlistSummary.WatchlistAdvancedCaSearchConfigResponse::get_RemoveDeceased() + + + + + + + + + + + System.Boolean Yoti.Auth.DocScan.Session.Retrieve.Check.WatchlistSummary.WatchlistAdvancedCaSearchConfigResponse::get_ShareUrl() + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.Check.WatchlistSummary.CaSourcesResponse Yoti.Auth.DocScan.Session.Retrieve.Check.WatchlistSummary.WatchlistAdvancedCaSearchConfigResponse::get_Sources() + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.Check.WatchlistSummary.CaMatchingStrategyResponse Yoti.Auth.DocScan.Session.Retrieve.Check.WatchlistSummary.WatchlistAdvancedCaSearchConfigResponse::get_MatchingStrategy() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.Check.WatchlistSummary.WatchlistAdvancedCaSearchConfigResponseCustomAccount + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.Check.WatchlistSummary.WatchlistAdvancedCaSearchConfigResponseCustomAccount::get_ApiKey() + + + + + + + + + + + System.Boolean Yoti.Auth.DocScan.Session.Retrieve.Check.WatchlistSummary.WatchlistAdvancedCaSearchConfigResponseCustomAccount::get_Monitoring() + + + + + + + + + + + System.Collections.Generic.Dictionary`2<System.String,System.String> Yoti.Auth.DocScan.Session.Retrieve.Check.WatchlistSummary.WatchlistAdvancedCaSearchConfigResponseCustomAccount::get_Tags() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.Check.WatchlistSummary.WatchlistAdvancedCaSearchConfigResponseCustomAccount::get_ClientRef() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.Check.WatchlistSummary.WatchlistScreeningConfig + + + + + System.Collections.Generic.List`1<System.String> Yoti.Auth.DocScan.Session.Retrieve.Check.WatchlistSummary.WatchlistScreeningConfig::get_Categories() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.Check.WatchlistSummary.WatchlistSummary + + + + + System.Int32 Yoti.Auth.DocScan.Session.Retrieve.Check.WatchlistSummary.WatchlistSummary::get_TotalHits() + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.Check.WatchlistSummary.RawResults Yoti.Auth.DocScan.Session.Retrieve.Check.WatchlistSummary.WatchlistSummary::get_RawResults() + + + + + + + + + + + System.Collections.Generic.List`1<System.String> Yoti.Auth.DocScan.Session.Retrieve.Check.WatchlistSummary.WatchlistSummary::get_AssociatedCountryCodes() + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.Check.WatchlistSummary.ISearchConfig Yoti.Auth.DocScan.Session.Retrieve.Check.WatchlistSummary.WatchlistSummary::get_SearchConfig() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.AdvancedIdentityProfile.AdvancedIdentityProfileResponse + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.AdvancedIdentityProfile.AdvancedIdentityProfileResponse::get_SubjectId() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.AdvancedIdentityProfile.AdvancedIdentityProfileResponse::get_Result() + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.AdvancedIdentityProfile.FailureReasonResponse Yoti.Auth.DocScan.Session.Retrieve.AdvancedIdentityProfile.AdvancedIdentityProfileResponse::get_FailureReason() + + + + + + + + + + + System.Collections.Generic.Dictionary`2<System.String,Newtonsoft.Json.Linq.JToken> Yoti.Auth.DocScan.Session.Retrieve.AdvancedIdentityProfile.AdvancedIdentityProfileResponse::get_Report() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.AdvancedIdentityProfile.FailureReasonResponse + + + + + System.String Yoti.Auth.DocScan.Session.Retrieve.AdvancedIdentityProfile.FailureReasonResponse::get_ReasonCode() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Retrieve.AdvancedIdentityProfilePreview.AdvancedIdentityProfilePreviewResponse + + + + + Yoti.Auth.DocScan.Session.Retrieve.MediaResponse Yoti.Auth.DocScan.Session.Retrieve.AdvancedIdentityProfilePreview.AdvancedIdentityProfilePreviewResponse::get_Media() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.ApplicantProfile + + + + + System.String Yoti.Auth.DocScan.Session.Create.ApplicantProfile::get_FullName() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Create.ApplicantProfile::get_DateOfBirth() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Create.ApplicantProfile::get_NamePrefix() + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.StructuredPostalAddress Yoti.Auth.DocScan.Session.Create.ApplicantProfile::get_StructuredPostalAddress() + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Session.Create.ApplicantProfile::.ctor(System.String,System.String,System.String,Yoti.Auth.DocScan.Session.Create.StructuredPostalAddress) + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.ApplicantProfileBuilder + + + + + Yoti.Auth.DocScan.Session.Create.ApplicantProfileBuilder Yoti.Auth.DocScan.Session.Create.ApplicantProfileBuilder::WithFullName(System.String) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.ApplicantProfileBuilder Yoti.Auth.DocScan.Session.Create.ApplicantProfileBuilder::WithDateOfBirth(System.String) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.ApplicantProfileBuilder Yoti.Auth.DocScan.Session.Create.ApplicantProfileBuilder::WithNamePrefix(System.String) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.ApplicantProfileBuilder Yoti.Auth.DocScan.Session.Create.ApplicantProfileBuilder::WithStructuredPostalAddress(Yoti.Auth.DocScan.Session.Create.StructuredPostalAddress) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.ApplicantProfile Yoti.Auth.DocScan.Session.Create.ApplicantProfileBuilder::Build() + + + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.AttemptsConfiguration + + + + + System.Collections.Generic.Dictionary`2<System.String,System.Int32> Yoti.Auth.DocScan.Session.Create.AttemptsConfiguration::get_IdDocumentTextDataExtraction() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.CreateSessionResult + + + + + System.Int32 Yoti.Auth.DocScan.Session.Create.CreateSessionResult::get_ClientSessionTokenTtl() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Create.CreateSessionResult::get_ClientSessionToken() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Create.CreateSessionResult::get_SessionId() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.NotificationConfig + + + + + System.String Yoti.Auth.DocScan.Session.Create.NotificationConfig::get_AuthToken() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Create.NotificationConfig::get_AuthType() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Create.NotificationConfig::get_Endpoint() + + + + + + + + + + + System.Collections.Generic.List`1<System.String> Yoti.Auth.DocScan.Session.Create.NotificationConfig::get_Topics() + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Session.Create.NotificationConfig::.ctor(System.String,System.String,System.Collections.Generic.List`1<System.String>,System.String) + + + + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.NotificationConfigBuilder + + + + + Yoti.Auth.DocScan.Session.Create.NotificationConfigBuilder Yoti.Auth.DocScan.Session.Create.NotificationConfigBuilder::WithAuthToken(System.String) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.NotificationConfigBuilder Yoti.Auth.DocScan.Session.Create.NotificationConfigBuilder::WithAuthTypeBearer() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.NotificationConfigBuilder Yoti.Auth.DocScan.Session.Create.NotificationConfigBuilder::WithAuthTypeBasic() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.NotificationConfigBuilder Yoti.Auth.DocScan.Session.Create.NotificationConfigBuilder::WithEndpoint(System.String) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.NotificationConfigBuilder Yoti.Auth.DocScan.Session.Create.NotificationConfigBuilder::ForResourceUpdate() + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.NotificationConfigBuilder Yoti.Auth.DocScan.Session.Create.NotificationConfigBuilder::ForTaskCompletion() + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.NotificationConfigBuilder Yoti.Auth.DocScan.Session.Create.NotificationConfigBuilder::ForCheckCompletion() + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.NotificationConfigBuilder Yoti.Auth.DocScan.Session.Create.NotificationConfigBuilder::ForSessionCompletion() + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.NotificationConfigBuilder Yoti.Auth.DocScan.Session.Create.NotificationConfigBuilder::ForClientSessionCompletion() + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.NotificationConfigBuilder Yoti.Auth.DocScan.Session.Create.NotificationConfigBuilder::WithTopic(System.String) + + + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.NotificationConfig Yoti.Auth.DocScan.Session.Create.NotificationConfigBuilder::Build() + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Session.Create.NotificationConfigBuilder::.ctor() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.ResourceCreationContainer + + + + + Yoti.Auth.DocScan.Session.Create.ApplicantProfile Yoti.Auth.DocScan.Session.Create.ResourceCreationContainer::get_ApplicantProfile() + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Session.Create.ResourceCreationContainer::.ctor(Yoti.Auth.DocScan.Session.Create.ApplicantProfile) + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.ResourceCreationContainerBuilder + + + + + Yoti.Auth.DocScan.Session.Create.ResourceCreationContainerBuilder Yoti.Auth.DocScan.Session.Create.ResourceCreationContainerBuilder::WithApplicantProfile(Yoti.Auth.DocScan.Session.Create.ApplicantProfile) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.ResourceCreationContainer Yoti.Auth.DocScan.Session.Create.ResourceCreationContainerBuilder::Build() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.SdkConfig + + + + + System.String Yoti.Auth.DocScan.Session.Create.SdkConfig::get_AllowedCaptureMethods() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Create.SdkConfig::get_PrimaryColour() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Create.SdkConfig::get_SecondaryColour() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Create.SdkConfig::get_FontColour() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Create.SdkConfig::get_Locale() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Create.SdkConfig::get_PresetIssuingCountry() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Create.SdkConfig::get_SuccessUrl() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Create.SdkConfig::get_ErrorUrl() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Create.SdkConfig::get_PrivacyPolicyUrl() + + + + + + + + + + + System.Nullable`1<System.Boolean> Yoti.Auth.DocScan.Session.Create.SdkConfig::get_AllowHandoff() + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.AttemptsConfiguration Yoti.Auth.DocScan.Session.Create.SdkConfig::get_AttemptsConfiguration() + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Session.Create.SdkConfig::.ctor(System.String,System.String,System.String,System.String,System.String,System.String,System.String,System.String,System.String,System.Nullable`1<System.Boolean>,System.Collections.Generic.Dictionary`2<System.String,System.Int32>) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.SdkConfigBuilder + + + + + Yoti.Auth.DocScan.Session.Create.SdkConfigBuilder Yoti.Auth.DocScan.Session.Create.SdkConfigBuilder::WithAllowsCamera() + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.SdkConfigBuilder Yoti.Auth.DocScan.Session.Create.SdkConfigBuilder::WithAllowsCameraAndUpload() + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.SdkConfigBuilder Yoti.Auth.DocScan.Session.Create.SdkConfigBuilder::WithAllowedCaptureMethods(System.String) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.SdkConfigBuilder Yoti.Auth.DocScan.Session.Create.SdkConfigBuilder::WithPrimaryColour(System.String) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.SdkConfigBuilder Yoti.Auth.DocScan.Session.Create.SdkConfigBuilder::WithSecondaryColour(System.String) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.SdkConfigBuilder Yoti.Auth.DocScan.Session.Create.SdkConfigBuilder::WithFontColour(System.String) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.SdkConfigBuilder Yoti.Auth.DocScan.Session.Create.SdkConfigBuilder::WithLocale(System.String) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.SdkConfigBuilder Yoti.Auth.DocScan.Session.Create.SdkConfigBuilder::WithPresetIssuingCountry(System.String) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.SdkConfigBuilder Yoti.Auth.DocScan.Session.Create.SdkConfigBuilder::WithSuccessUrl(System.String) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.SdkConfigBuilder Yoti.Auth.DocScan.Session.Create.SdkConfigBuilder::WithErrorUrl(System.String) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.SdkConfigBuilder Yoti.Auth.DocScan.Session.Create.SdkConfigBuilder::WithPrivacyPolicyUrl(System.String) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.SdkConfigBuilder Yoti.Auth.DocScan.Session.Create.SdkConfigBuilder::WithAllowHandoff(System.Boolean) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.SdkConfigBuilder Yoti.Auth.DocScan.Session.Create.SdkConfigBuilder::WithIdDocumentTextExtractionCategoryAttempts(System.String,System.Int32) + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.SdkConfigBuilder Yoti.Auth.DocScan.Session.Create.SdkConfigBuilder::WithIdDocumentTextExtractionReclassificationAttempts(System.Int32) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.SdkConfigBuilder Yoti.Auth.DocScan.Session.Create.SdkConfigBuilder::WithIdDocumentTextExtractionGenericAttempts(System.Int32) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.SdkConfig Yoti.Auth.DocScan.Session.Create.SdkConfigBuilder::Build() + + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.SessionSpecification + + + + + System.Nullable`1<System.Int32> Yoti.Auth.DocScan.Session.Create.SessionSpecification::get_ClientSessionTokenTtl() + + + + + + + + + + + System.Nullable`1<System.Int32> Yoti.Auth.DocScan.Session.Create.SessionSpecification::get_ResourcesTtl() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Create.SessionSpecification::get_UserTrackingId() + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.NotificationConfig Yoti.Auth.DocScan.Session.Create.SessionSpecification::get_Notifications() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Create.Check.BaseRequestedCheck> Yoti.Auth.DocScan.Session.Create.SessionSpecification::get_RequestedChecks() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Create.Task.BaseRequestedTask> Yoti.Auth.DocScan.Session.Create.SessionSpecification::get_RequestedTasks() + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.SdkConfig Yoti.Auth.DocScan.Session.Create.SessionSpecification::get_SdkConfig() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Create.Filter.RequiredDocument> Yoti.Auth.DocScan.Session.Create.SessionSpecification::get_RequiredDocuments() + + + + + + + + + + + System.Nullable`1<System.Boolean> Yoti.Auth.DocScan.Session.Create.SessionSpecification::get_BlockBiometricConsent() + + + + + + + + + + + System.Nullable`1<System.DateTimeOffset> Yoti.Auth.DocScan.Session.Create.SessionSpecification::get_SessionDeadline() + + + + + + + + + + + System.Object Yoti.Auth.DocScan.Session.Create.SessionSpecification::get_IdentityProfileRequirements() + + + + + + + + + + + System.Object Yoti.Auth.DocScan.Session.Create.SessionSpecification::get_Subject() + + + + + + + + + + + System.Object Yoti.Auth.DocScan.Session.Create.SessionSpecification::get_AdvancedIdentityProfileRequirements() + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.ResourceCreationContainer Yoti.Auth.DocScan.Session.Create.SessionSpecification::get_Resources() + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Session.Create.SessionSpecification::.ctor(System.Nullable`1<System.Int32>,System.Nullable`1<System.Int32>,System.String,Yoti.Auth.DocScan.Session.Create.NotificationConfig,System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Create.Check.BaseRequestedCheck>,System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Create.Task.BaseRequestedTask>,Yoti.Auth.DocScan.Session.Create.SdkConfig,System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Create.Filter.RequiredDocument>,System.Nullable`1<System.Boolean>,System.Nullable`1<System.DateTimeOffset>,System.Object,System.Object,System.Boolean,System.Object,Yoti.Auth.DocScan.Session.Create.ResourceCreationContainer) + + + + + + + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.SessionSpecificationBuilder + + + + + Yoti.Auth.DocScan.Session.Create.SessionSpecificationBuilder Yoti.Auth.DocScan.Session.Create.SessionSpecificationBuilder::WithClientSessionTokenTtl(System.Int32) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.SessionSpecificationBuilder Yoti.Auth.DocScan.Session.Create.SessionSpecificationBuilder::WithResourcesTtl(System.Int32) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.SessionSpecificationBuilder Yoti.Auth.DocScan.Session.Create.SessionSpecificationBuilder::WithUserTrackingId(System.String) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.SessionSpecificationBuilder Yoti.Auth.DocScan.Session.Create.SessionSpecificationBuilder::WithNotifications(Yoti.Auth.DocScan.Session.Create.NotificationConfig) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.SessionSpecificationBuilder Yoti.Auth.DocScan.Session.Create.SessionSpecificationBuilder::WithRequestedCheck(Yoti.Auth.DocScan.Session.Create.Check.BaseRequestedCheck) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.SessionSpecificationBuilder Yoti.Auth.DocScan.Session.Create.SessionSpecificationBuilder::WithRequestedTask(Yoti.Auth.DocScan.Session.Create.Task.BaseRequestedTask) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.SessionSpecificationBuilder Yoti.Auth.DocScan.Session.Create.SessionSpecificationBuilder::WithSdkConfig(Yoti.Auth.DocScan.Session.Create.SdkConfig) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.SessionSpecificationBuilder Yoti.Auth.DocScan.Session.Create.SessionSpecificationBuilder::WithRequiredDocument(Yoti.Auth.DocScan.Session.Create.Filter.RequiredDocument) + + + + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.SessionSpecificationBuilder Yoti.Auth.DocScan.Session.Create.SessionSpecificationBuilder::WithBlockBiometricConsent(System.Boolean) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.SessionSpecificationBuilder Yoti.Auth.DocScan.Session.Create.SessionSpecificationBuilder::WithSessionDeadline(System.DateTimeOffset) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.SessionSpecificationBuilder Yoti.Auth.DocScan.Session.Create.SessionSpecificationBuilder::WithIdentityProfileRequirements(System.Object) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.SessionSpecificationBuilder Yoti.Auth.DocScan.Session.Create.SessionSpecificationBuilder::WithSubject(System.Object) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.SessionSpecificationBuilder Yoti.Auth.DocScan.Session.Create.SessionSpecificationBuilder::WithCreateIdentityProfilePreview(System.Boolean) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.SessionSpecificationBuilder Yoti.Auth.DocScan.Session.Create.SessionSpecificationBuilder::WithAdvancedIdentityProfileRequirements(System.Object) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.SessionSpecificationBuilder Yoti.Auth.DocScan.Session.Create.SessionSpecificationBuilder::WithResources(Yoti.Auth.DocScan.Session.Create.ResourceCreationContainer) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.SessionSpecification Yoti.Auth.DocScan.Session.Create.SessionSpecificationBuilder::Build() + + + + + + + + + + + + + + + + + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Session.Create.SessionSpecificationBuilder::.ctor() + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.StructuredPostalAddress + + + + + System.Nullable`1<System.Int32> Yoti.Auth.DocScan.Session.Create.StructuredPostalAddress::get_AddressFormat() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Create.StructuredPostalAddress::get_BuildingNumber() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Create.StructuredPostalAddress::get_AddressLine1() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Create.StructuredPostalAddress::get_TownCity() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Create.StructuredPostalAddress::get_PostalCode() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Create.StructuredPostalAddress::get_CountryIso() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Create.StructuredPostalAddress::get_Country() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Create.StructuredPostalAddress::get_FormattedAddress() + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Session.Create.StructuredPostalAddress::.ctor(System.Nullable`1<System.Int32>,System.String,System.String,System.String,System.String,System.String,System.String,System.String) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.StructuredPostalAddressBuilder + + + + + Yoti.Auth.DocScan.Session.Create.StructuredPostalAddressBuilder Yoti.Auth.DocScan.Session.Create.StructuredPostalAddressBuilder::WithAddressFormat(System.Int32) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.StructuredPostalAddressBuilder Yoti.Auth.DocScan.Session.Create.StructuredPostalAddressBuilder::WithBuildingNumber(System.String) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.StructuredPostalAddressBuilder Yoti.Auth.DocScan.Session.Create.StructuredPostalAddressBuilder::WithAddressLine1(System.String) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.StructuredPostalAddressBuilder Yoti.Auth.DocScan.Session.Create.StructuredPostalAddressBuilder::WithTownCity(System.String) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.StructuredPostalAddressBuilder Yoti.Auth.DocScan.Session.Create.StructuredPostalAddressBuilder::WithPostalCode(System.String) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.StructuredPostalAddressBuilder Yoti.Auth.DocScan.Session.Create.StructuredPostalAddressBuilder::WithCountryIso(System.String) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.StructuredPostalAddressBuilder Yoti.Auth.DocScan.Session.Create.StructuredPostalAddressBuilder::WithCountry(System.String) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.StructuredPostalAddressBuilder Yoti.Auth.DocScan.Session.Create.StructuredPostalAddressBuilder::WithFormattedAddress(System.String) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.StructuredPostalAddress Yoti.Auth.DocScan.Session.Create.StructuredPostalAddressBuilder::Build() + + + + + + + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Task.RequestedSupplementaryDocTextExtractionTask + + + + + Yoti.Auth.DocScan.Session.Create.Task.RequestedSupplementaryDocTextExtractionTaskConfig Yoti.Auth.DocScan.Session.Create.Task.RequestedSupplementaryDocTextExtractionTask::get_Config() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Create.Task.RequestedSupplementaryDocTextExtractionTask::get_Type() + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Session.Create.Task.RequestedSupplementaryDocTextExtractionTask::.ctor(Yoti.Auth.DocScan.Session.Create.Task.RequestedSupplementaryDocTextExtractionTaskConfig) + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Task.RequestedSupplementaryDocTextExtractionTaskBuilder + + + + + Yoti.Auth.DocScan.Session.Create.Task.RequestedSupplementaryDocTextExtractionTaskBuilder Yoti.Auth.DocScan.Session.Create.Task.RequestedSupplementaryDocTextExtractionTaskBuilder::WithManualCheckAlways() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Task.RequestedSupplementaryDocTextExtractionTaskBuilder Yoti.Auth.DocScan.Session.Create.Task.RequestedSupplementaryDocTextExtractionTaskBuilder::WithManualCheckFallback() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Task.RequestedSupplementaryDocTextExtractionTaskBuilder Yoti.Auth.DocScan.Session.Create.Task.RequestedSupplementaryDocTextExtractionTaskBuilder::WithManualCheckNever() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Task.RequestedSupplementaryDocTextExtractionTask Yoti.Auth.DocScan.Session.Create.Task.RequestedSupplementaryDocTextExtractionTaskBuilder::Build() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Task.RequestedSupplementaryDocTextExtractionTaskConfig + + + + + System.String Yoti.Auth.DocScan.Session.Create.Task.RequestedSupplementaryDocTextExtractionTaskConfig::get_ManualCheck() + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Session.Create.Task.RequestedSupplementaryDocTextExtractionTaskConfig::.ctor(System.String) + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Task.RequestedTextExtractionTask + + + + + Yoti.Auth.DocScan.Session.Create.Task.RequestedTextExtractionTaskConfig Yoti.Auth.DocScan.Session.Create.Task.RequestedTextExtractionTask::get_Config() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Create.Task.RequestedTextExtractionTask::get_Type() + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Session.Create.Task.RequestedTextExtractionTask::.ctor(Yoti.Auth.DocScan.Session.Create.Task.RequestedTextExtractionTaskConfig) + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Task.RequestedTextExtractionTaskBuilder + + + + + Yoti.Auth.DocScan.Session.Create.Task.RequestedTextExtractionTaskBuilder Yoti.Auth.DocScan.Session.Create.Task.RequestedTextExtractionTaskBuilder::WithManualCheckAlways() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Task.RequestedTextExtractionTaskBuilder Yoti.Auth.DocScan.Session.Create.Task.RequestedTextExtractionTaskBuilder::WithManualCheckFallback() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Task.RequestedTextExtractionTaskBuilder Yoti.Auth.DocScan.Session.Create.Task.RequestedTextExtractionTaskBuilder::WithManualCheckNever() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Task.RequestedTextExtractionTaskBuilder Yoti.Auth.DocScan.Session.Create.Task.RequestedTextExtractionTaskBuilder::WithChipDataDesired() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Task.RequestedTextExtractionTaskBuilder Yoti.Auth.DocScan.Session.Create.Task.RequestedTextExtractionTaskBuilder::WithChipDataIgnore() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Task.RequestedTextExtractionTask Yoti.Auth.DocScan.Session.Create.Task.RequestedTextExtractionTaskBuilder::Build() + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Task.RequestedTextExtractionTaskConfig + + + + + System.String Yoti.Auth.DocScan.Session.Create.Task.RequestedTextExtractionTaskConfig::get_ManualCheck() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Create.Task.RequestedTextExtractionTaskConfig::get_ChipData() + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Session.Create.Task.RequestedTextExtractionTaskConfig::.ctor(System.String,System.String) + + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Objectives.Objective + + + + + System.String Yoti.Auth.DocScan.Session.Create.Objectives.Objective::get_Type() + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Session.Create.Objectives.Objective::.ctor(System.String) + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Objectives.ProofOfAddressObjective + + + + + System.Void Yoti.Auth.DocScan.Session.Create.Objectives.ProofOfAddressObjective::.ctor() + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Objectives.ProofOfAddressObjectiveBuilder + + + + + Yoti.Auth.DocScan.Session.Create.Objectives.ProofOfAddressObjective Yoti.Auth.DocScan.Session.Create.Objectives.ProofOfAddressObjectiveBuilder::Build() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Filter.CountryRestriction + + + + + System.String Yoti.Auth.DocScan.Session.Create.Filter.CountryRestriction::get_Inclusion() + + + + + + + + + + + System.Collections.Generic.List`1<System.String> Yoti.Auth.DocScan.Session.Create.Filter.CountryRestriction::get_CountryCodes() + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Session.Create.Filter.CountryRestriction::.ctor(System.String,System.Collections.Generic.List`1<System.String>) + + + + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Filter.DocumentFilter + + + + + System.String Yoti.Auth.DocScan.Session.Create.Filter.DocumentFilter::get_Type() + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Session.Create.Filter.DocumentFilter::.ctor(System.String) + + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Filter.DocumentRestriction + + + + + System.Collections.Generic.List`1<System.String> Yoti.Auth.DocScan.Session.Create.Filter.DocumentRestriction::get_CountryCodes() + + + + + + + + + + + System.Collections.Generic.List`1<System.String> Yoti.Auth.DocScan.Session.Create.Filter.DocumentRestriction::get_DocumentTypes() + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Session.Create.Filter.DocumentRestriction::.ctor(System.Collections.Generic.List`1<System.String>,System.Collections.Generic.List`1<System.String>) + + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Filter.DocumentRestrictionBuilder + + + + + Yoti.Auth.DocScan.Session.Create.Filter.DocumentRestrictionBuilder Yoti.Auth.DocScan.Session.Create.Filter.DocumentRestrictionBuilder::WithCountries(System.Collections.Generic.List`1<System.String>) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Filter.DocumentRestrictionBuilder Yoti.Auth.DocScan.Session.Create.Filter.DocumentRestrictionBuilder::WithDocumentTypes(System.Collections.Generic.List`1<System.String>) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Filter.DocumentRestriction Yoti.Auth.DocScan.Session.Create.Filter.DocumentRestrictionBuilder::Build() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Filter.DocumentRestrictionsFilter + + + + + System.String Yoti.Auth.DocScan.Session.Create.Filter.DocumentRestrictionsFilter::get_Inclusion() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Create.Filter.DocumentRestriction> Yoti.Auth.DocScan.Session.Create.Filter.DocumentRestrictionsFilter::get_Documents() + + + + + + + + + + + System.Boolean Yoti.Auth.DocScan.Session.Create.Filter.DocumentRestrictionsFilter::get_AllowExpiredDocuments() + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Session.Create.Filter.DocumentRestrictionsFilter::.ctor(System.String,System.Collections.Generic.List`1<Yoti.Auth.DocScan.Session.Create.Filter.DocumentRestriction>,System.Boolean) + + + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Filter.DocumentRestrictionsFilterBuilder + + + + + Yoti.Auth.DocScan.Session.Create.Filter.DocumentRestrictionsFilterBuilder Yoti.Auth.DocScan.Session.Create.Filter.DocumentRestrictionsFilterBuilder::ForIncludeList() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Filter.DocumentRestrictionsFilterBuilder Yoti.Auth.DocScan.Session.Create.Filter.DocumentRestrictionsFilterBuilder::ForExcludeList() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Filter.DocumentRestrictionsFilterBuilder Yoti.Auth.DocScan.Session.Create.Filter.DocumentRestrictionsFilterBuilder::WithDocumentRestriction(System.Collections.Generic.List`1<System.String>,System.Collections.Generic.List`1<System.String>) + + + + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Filter.DocumentRestrictionsFilterBuilder Yoti.Auth.DocScan.Session.Create.Filter.DocumentRestrictionsFilterBuilder::WithDocumentRestriction(Yoti.Auth.DocScan.Session.Create.Filter.DocumentRestriction) + + + + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Filter.DocumentRestrictionsFilterBuilder Yoti.Auth.DocScan.Session.Create.Filter.DocumentRestrictionsFilterBuilder::withAllowExpiredDocuments() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Filter.DocumentRestrictionsFilterBuilder Yoti.Auth.DocScan.Session.Create.Filter.DocumentRestrictionsFilterBuilder::withDenyExpiredDocuments() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Filter.DocumentRestrictionsFilter Yoti.Auth.DocScan.Session.Create.Filter.DocumentRestrictionsFilterBuilder::Build() + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Filter.OrthogonalRestrictionsFilter + + + + + Yoti.Auth.DocScan.Session.Create.Filter.CountryRestriction Yoti.Auth.DocScan.Session.Create.Filter.OrthogonalRestrictionsFilter::get_CountryRestriction() + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Filter.TypeRestriction Yoti.Auth.DocScan.Session.Create.Filter.OrthogonalRestrictionsFilter::get_TypeRestriction() + + + + + + + + + + + System.Boolean Yoti.Auth.DocScan.Session.Create.Filter.OrthogonalRestrictionsFilter::get_AllowExpiredDocuments() + + + + + + + + + + + System.Boolean Yoti.Auth.DocScan.Session.Create.Filter.OrthogonalRestrictionsFilter::get_AllowNonLatinDocuments() + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Session.Create.Filter.OrthogonalRestrictionsFilter::.ctor(Yoti.Auth.DocScan.Session.Create.Filter.CountryRestriction,Yoti.Auth.DocScan.Session.Create.Filter.TypeRestriction,System.Boolean,System.Boolean) + + + + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Filter.OrthogonalRestrictionsFilterBuilder + + + + + Yoti.Auth.DocScan.Session.Create.Filter.OrthogonalRestrictionsFilterBuilder Yoti.Auth.DocScan.Session.Create.Filter.OrthogonalRestrictionsFilterBuilder::WithIncludedCountries(System.Collections.Generic.List`1<System.String>) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Filter.OrthogonalRestrictionsFilterBuilder Yoti.Auth.DocScan.Session.Create.Filter.OrthogonalRestrictionsFilterBuilder::WithExcludedCountries(System.Collections.Generic.List`1<System.String>) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Filter.OrthogonalRestrictionsFilterBuilder Yoti.Auth.DocScan.Session.Create.Filter.OrthogonalRestrictionsFilterBuilder::WithIncludedDocumentTypes(System.Collections.Generic.List`1<System.String>) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Filter.OrthogonalRestrictionsFilterBuilder Yoti.Auth.DocScan.Session.Create.Filter.OrthogonalRestrictionsFilterBuilder::WithExcludedDocumentTypes(System.Collections.Generic.List`1<System.String>) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Filter.OrthogonalRestrictionsFilterBuilder Yoti.Auth.DocScan.Session.Create.Filter.OrthogonalRestrictionsFilterBuilder::isAllowNonLatinDocuments(System.Boolean) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Filter.OrthogonalRestrictionsFilterBuilder Yoti.Auth.DocScan.Session.Create.Filter.OrthogonalRestrictionsFilterBuilder::withAllowExpiredDocuments() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Filter.OrthogonalRestrictionsFilterBuilder Yoti.Auth.DocScan.Session.Create.Filter.OrthogonalRestrictionsFilterBuilder::withDenyExpiredDocuments() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Filter.OrthogonalRestrictionsFilter Yoti.Auth.DocScan.Session.Create.Filter.OrthogonalRestrictionsFilterBuilder::Build() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Filter.RequiredIdDocument + + + + + Yoti.Auth.DocScan.Session.Create.Filter.DocumentFilter Yoti.Auth.DocScan.Session.Create.Filter.RequiredIdDocument::get_Filter() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Create.Filter.RequiredIdDocument::get_Type() + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Session.Create.Filter.RequiredIdDocument::.ctor(Yoti.Auth.DocScan.Session.Create.Filter.DocumentFilter) + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Filter.RequiredIdDocumentBuilder + + + + + Yoti.Auth.DocScan.Session.Create.Filter.RequiredIdDocumentBuilder Yoti.Auth.DocScan.Session.Create.Filter.RequiredIdDocumentBuilder::WithFilter(Yoti.Auth.DocScan.Session.Create.Filter.DocumentFilter) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Filter.RequiredIdDocument Yoti.Auth.DocScan.Session.Create.Filter.RequiredIdDocumentBuilder::Build() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Filter.RequiredSupplementaryDocument + + + + + Yoti.Auth.DocScan.Session.Create.Objectives.Objective Yoti.Auth.DocScan.Session.Create.Filter.RequiredSupplementaryDocument::get_Objective() + + + + + + + + + + + System.Collections.Generic.List`1<System.String> Yoti.Auth.DocScan.Session.Create.Filter.RequiredSupplementaryDocument::get_DocumentTypes() + + + + + + + + + + + System.Collections.Generic.List`1<System.String> Yoti.Auth.DocScan.Session.Create.Filter.RequiredSupplementaryDocument::get_CountryCodes() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Create.Filter.RequiredSupplementaryDocument::get_Type() + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Session.Create.Filter.RequiredSupplementaryDocument::.ctor(Yoti.Auth.DocScan.Session.Create.Objectives.Objective,System.Collections.Generic.List`1<System.String>,System.Collections.Generic.List`1<System.String>) + + + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Filter.RequiredSupplementaryDocumentBuilder + + + + + Yoti.Auth.DocScan.Session.Create.Filter.RequiredSupplementaryDocumentBuilder Yoti.Auth.DocScan.Session.Create.Filter.RequiredSupplementaryDocumentBuilder::WithObjective(Yoti.Auth.DocScan.Session.Create.Objectives.Objective) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Filter.RequiredSupplementaryDocumentBuilder Yoti.Auth.DocScan.Session.Create.Filter.RequiredSupplementaryDocumentBuilder::WithDocumentTypes(System.Collections.Generic.List`1<System.String>) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Filter.RequiredSupplementaryDocumentBuilder Yoti.Auth.DocScan.Session.Create.Filter.RequiredSupplementaryDocumentBuilder::WithCountries(System.Collections.Generic.List`1<System.String>) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Filter.RequiredSupplementaryDocument Yoti.Auth.DocScan.Session.Create.Filter.RequiredSupplementaryDocumentBuilder::Build() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Filter.TypeRestriction + + + + + System.String Yoti.Auth.DocScan.Session.Create.Filter.TypeRestriction::get_Inclusion() + + + + + + + + + + + System.Collections.Generic.List`1<System.String> Yoti.Auth.DocScan.Session.Create.Filter.TypeRestriction::get_DocumentTypes() + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Session.Create.Filter.TypeRestriction::.ctor(System.String,System.Collections.Generic.List`1<System.String>) + + + + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.FaceCapture.CreateFaceCaptureResourcePayload + + + + + System.String Yoti.Auth.DocScan.Session.Create.FaceCapture.CreateFaceCaptureResourcePayload::get_RequirementId() + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Session.Create.FaceCapture.CreateFaceCaptureResourcePayload::.ctor(System.String) + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.FaceCapture.CreateFaceCaptureResourcePayloadBuilder + + + + + Yoti.Auth.DocScan.Session.Create.FaceCapture.CreateFaceCaptureResourcePayloadBuilder Yoti.Auth.DocScan.Session.Create.FaceCapture.CreateFaceCaptureResourcePayloadBuilder::WithRequirementId(System.String) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.FaceCapture.CreateFaceCaptureResourcePayload Yoti.Auth.DocScan.Session.Create.FaceCapture.CreateFaceCaptureResourcePayloadBuilder::Build() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.FaceCapture.UploadFaceCaptureImagePayload + + + + + System.String Yoti.Auth.DocScan.Session.Create.FaceCapture.UploadFaceCaptureImagePayload::get_ImageContentType() + + + + + + + + + + + System.Byte[] Yoti.Auth.DocScan.Session.Create.FaceCapture.UploadFaceCaptureImagePayload::get_ImageContents() + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Session.Create.FaceCapture.UploadFaceCaptureImagePayload::.ctor(System.String,System.Byte[]) + + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.FaceCapture.UploadFaceCaptureImagePayloadBuilder + + + + + Yoti.Auth.DocScan.Session.Create.FaceCapture.UploadFaceCaptureImagePayloadBuilder Yoti.Auth.DocScan.Session.Create.FaceCapture.UploadFaceCaptureImagePayloadBuilder::ForJpeg() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.FaceCapture.UploadFaceCaptureImagePayloadBuilder Yoti.Auth.DocScan.Session.Create.FaceCapture.UploadFaceCaptureImagePayloadBuilder::ForPng() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.FaceCapture.UploadFaceCaptureImagePayloadBuilder Yoti.Auth.DocScan.Session.Create.FaceCapture.UploadFaceCaptureImagePayloadBuilder::WithImageContents(System.Byte[]) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.FaceCapture.UploadFaceCaptureImagePayload Yoti.Auth.DocScan.Session.Create.FaceCapture.UploadFaceCaptureImagePayloadBuilder::Build() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.IssuingAuthoritySubCheck + + + + + System.Boolean Yoti.Auth.DocScan.Session.Create.Check.IssuingAuthoritySubCheck::get_Requested() + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Filter.DocumentFilter Yoti.Auth.DocScan.Session.Create.Check.IssuingAuthoritySubCheck::get_Filter() + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Session.Create.Check.IssuingAuthoritySubCheck::.ctor(System.Boolean,Yoti.Auth.DocScan.Session.Create.Filter.DocumentFilter) + + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.IssuingAuthoritySubCheckBuilder + + + + + Yoti.Auth.DocScan.Session.Create.Check.IssuingAuthoritySubCheckBuilder Yoti.Auth.DocScan.Session.Create.Check.IssuingAuthoritySubCheckBuilder::WithRequested(System.Boolean) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.IssuingAuthoritySubCheckBuilder Yoti.Auth.DocScan.Session.Create.Check.IssuingAuthoritySubCheckBuilder::WithFilter(Yoti.Auth.DocScan.Session.Create.Filter.DocumentFilter) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.IssuingAuthoritySubCheck Yoti.Auth.DocScan.Session.Create.Check.IssuingAuthoritySubCheckBuilder::Build() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedDocumentAuthenticityCheck + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedDocumentAuthenticityConfig Yoti.Auth.DocScan.Session.Create.Check.RequestedDocumentAuthenticityCheck::get_Config() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Create.Check.RequestedDocumentAuthenticityCheck::get_Type() + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Session.Create.Check.RequestedDocumentAuthenticityCheck::.ctor(Yoti.Auth.DocScan.Session.Create.Check.RequestedDocumentAuthenticityConfig) + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedDocumentAuthenticityCheckBuilder + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedDocumentAuthenticityCheckBuilder Yoti.Auth.DocScan.Session.Create.Check.RequestedDocumentAuthenticityCheckBuilder::WithManualCheckAlways() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedDocumentAuthenticityCheckBuilder Yoti.Auth.DocScan.Session.Create.Check.RequestedDocumentAuthenticityCheckBuilder::WithManualCheckFallback() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedDocumentAuthenticityCheckBuilder Yoti.Auth.DocScan.Session.Create.Check.RequestedDocumentAuthenticityCheckBuilder::WithManualCheckNever() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedDocumentAuthenticityCheckBuilder Yoti.Auth.DocScan.Session.Create.Check.RequestedDocumentAuthenticityCheckBuilder::WithIssuingAuthoritySubCheck() + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedDocumentAuthenticityCheckBuilder Yoti.Auth.DocScan.Session.Create.Check.RequestedDocumentAuthenticityCheckBuilder::WithIssuingAuthoritySubCheck(Yoti.Auth.DocScan.Session.Create.Filter.DocumentFilter) + + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedDocumentAuthenticityCheck Yoti.Auth.DocScan.Session.Create.Check.RequestedDocumentAuthenticityCheckBuilder::Build() + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedDocumentAuthenticityConfig + + + + + System.String Yoti.Auth.DocScan.Session.Create.Check.RequestedDocumentAuthenticityConfig::get_ManualCheck() + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.IssuingAuthoritySubCheck Yoti.Auth.DocScan.Session.Create.Check.RequestedDocumentAuthenticityConfig::get_IssuingAuthoritySubCheck() + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Session.Create.Check.RequestedDocumentAuthenticityConfig::.ctor(System.String,Yoti.Auth.DocScan.Session.Create.Check.IssuingAuthoritySubCheck) + + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedFaceComparisonCheck + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedFaceComparisonConfig Yoti.Auth.DocScan.Session.Create.Check.RequestedFaceComparisonCheck::get_Config() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Create.Check.RequestedFaceComparisonCheck::get_Type() + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Session.Create.Check.RequestedFaceComparisonCheck::.ctor(Yoti.Auth.DocScan.Session.Create.Check.RequestedFaceComparisonConfig) + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedFaceComparisonCheckBuilder + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedFaceComparisonCheckBuilder Yoti.Auth.DocScan.Session.Create.Check.RequestedFaceComparisonCheckBuilder::WithManualCheckNever() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedFaceComparisonCheck Yoti.Auth.DocScan.Session.Create.Check.RequestedFaceComparisonCheckBuilder::Build() + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedFaceComparisonConfig + + + + + System.String Yoti.Auth.DocScan.Session.Create.Check.RequestedFaceComparisonConfig::get_ManualCheck() + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Session.Create.Check.RequestedFaceComparisonConfig::.ctor(System.String) + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedFaceMatchCheck + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedFaceMatchConfig Yoti.Auth.DocScan.Session.Create.Check.RequestedFaceMatchCheck::get_Config() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Create.Check.RequestedFaceMatchCheck::get_Type() + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Session.Create.Check.RequestedFaceMatchCheck::.ctor(Yoti.Auth.DocScan.Session.Create.Check.RequestedFaceMatchConfig) + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedFaceMatchCheckBuilder + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedFaceMatchCheckBuilder Yoti.Auth.DocScan.Session.Create.Check.RequestedFaceMatchCheckBuilder::WithManualCheckAlways() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedFaceMatchCheckBuilder Yoti.Auth.DocScan.Session.Create.Check.RequestedFaceMatchCheckBuilder::WithManualCheckFallback() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedFaceMatchCheckBuilder Yoti.Auth.DocScan.Session.Create.Check.RequestedFaceMatchCheckBuilder::WithManualCheckNever() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedFaceMatchCheck Yoti.Auth.DocScan.Session.Create.Check.RequestedFaceMatchCheckBuilder::Build() + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedFaceMatchConfig + + + + + System.String Yoti.Auth.DocScan.Session.Create.Check.RequestedFaceMatchConfig::get_ManualCheck() + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Session.Create.Check.RequestedFaceMatchConfig::.ctor(System.String) + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedIdDocumentComparisonCheck + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedIdDocumentComparisonConfig Yoti.Auth.DocScan.Session.Create.Check.RequestedIdDocumentComparisonCheck::get_Config() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Create.Check.RequestedIdDocumentComparisonCheck::get_Type() + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Session.Create.Check.RequestedIdDocumentComparisonCheck::.ctor(Yoti.Auth.DocScan.Session.Create.Check.RequestedIdDocumentComparisonConfig) + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedIdDocumentComparisonCheckBuilder + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedIdDocumentComparisonCheck Yoti.Auth.DocScan.Session.Create.Check.RequestedIdDocumentComparisonCheckBuilder::Build() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedIdDocumentComparisonConfig + + + + + System.Void Yoti.Auth.DocScan.Session.Create.Check.RequestedIdDocumentComparisonConfig::.ctor() + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedLivenessCheck + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedLivenessConfig Yoti.Auth.DocScan.Session.Create.Check.RequestedLivenessCheck::get_Config() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Create.Check.RequestedLivenessCheck::get_Type() + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Session.Create.Check.RequestedLivenessCheck::.ctor(Yoti.Auth.DocScan.Session.Create.Check.RequestedLivenessConfig) + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedLivenessCheckBuilder + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedLivenessCheckBuilder Yoti.Auth.DocScan.Session.Create.Check.RequestedLivenessCheckBuilder::ForZoomLiveness() + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedLivenessCheckBuilder Yoti.Auth.DocScan.Session.Create.Check.RequestedLivenessCheckBuilder::ForStaticLiveness() + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedLivenessCheckBuilder Yoti.Auth.DocScan.Session.Create.Check.RequestedLivenessCheckBuilder::WithManualCheck(System.String) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedLivenessCheckBuilder Yoti.Auth.DocScan.Session.Create.Check.RequestedLivenessCheckBuilder::ForLivenessType(System.String) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedLivenessCheckBuilder Yoti.Auth.DocScan.Session.Create.Check.RequestedLivenessCheckBuilder::WithMaxRetries(System.Int32) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedLivenessCheck Yoti.Auth.DocScan.Session.Create.Check.RequestedLivenessCheckBuilder::Build() + + + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Session.Create.Check.RequestedLivenessCheckBuilder::.ctor() + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedLivenessConfig + + + + + System.String Yoti.Auth.DocScan.Session.Create.Check.RequestedLivenessConfig::get_LivenessType() + + + + + + + + + + + System.Int32 Yoti.Auth.DocScan.Session.Create.Check.RequestedLivenessConfig::get_MaxRetries() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Create.Check.RequestedLivenessConfig::get_ManualCheck() + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Session.Create.Check.RequestedLivenessConfig::.ctor(System.Int32,System.String,System.String) + + + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedThirdPartyIdentityCheck + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedThirdPartyIdentityCheckConfig Yoti.Auth.DocScan.Session.Create.Check.RequestedThirdPartyIdentityCheck::get_Config() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Create.Check.RequestedThirdPartyIdentityCheck::get_Type() + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Session.Create.Check.RequestedThirdPartyIdentityCheck::.ctor(Yoti.Auth.DocScan.Session.Create.Check.RequestedThirdPartyIdentityCheckConfig) + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedThirdPartyIdentityCheckBuilder + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedThirdPartyIdentityCheck Yoti.Auth.DocScan.Session.Create.Check.RequestedThirdPartyIdentityCheckBuilder::Build() + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedThirdPartyIdentityCheckConfig + + + + + System.Void Yoti.Auth.DocScan.Session.Create.Check.RequestedThirdPartyIdentityCheckConfig::.ctor() + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistAdvancedCaCheck + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistAdvancedCaConfig Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistAdvancedCaCheck::get_Config() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistAdvancedCaCheck::get_Type() + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistAdvancedCaCheck::.ctor(Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistAdvancedCaConfig) + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistAdvancedCaCheckBuilder + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistAdvancedCaCheckBuilder Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistAdvancedCaCheckBuilder::WithRemoveDeceased(System.Boolean) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistAdvancedCaCheckBuilder Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistAdvancedCaCheckBuilder::WithShareUrl(System.Boolean) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistAdvancedCaCheckBuilder Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistAdvancedCaCheckBuilder::WithSources(Yoti.Auth.DocScan.Session.Create.Check.Advanced.RequestedCaSources) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistAdvancedCaCheckBuilder Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistAdvancedCaCheckBuilder::WithMatchingStrategy(Yoti.Auth.DocScan.Session.Create.Check.Advanced.RequestedCaMatchingStrategy) + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistAdvancedCaCheckBuilderCustomAccount + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistAdvancedCaCheckBuilderCustomAccount Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistAdvancedCaCheckBuilderCustomAccount::WithApiKey(System.String) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistAdvancedCaCheckBuilderCustomAccount Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistAdvancedCaCheckBuilderCustomAccount::WithMonitoring(System.Boolean) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistAdvancedCaCheckBuilderCustomAccount Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistAdvancedCaCheckBuilderCustomAccount::WithTags(System.Collections.Generic.Dictionary`2<System.String,System.String>) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistAdvancedCaCheckBuilderCustomAccount Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistAdvancedCaCheckBuilderCustomAccount::WithClientRef(System.String) + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistAdvancedCaCheck Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistAdvancedCaCheckBuilderCustomAccount::Build() + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistAdvancedCaCheckBuilderYotiAccount + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistAdvancedCaCheck Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistAdvancedCaCheckBuilderYotiAccount::Build() + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistAdvancedCaConfig + + + + + System.Boolean Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistAdvancedCaConfig::get_RemoveDeceased() + + + + + + + + + + + System.Boolean Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistAdvancedCaConfig::get_ShareUrl() + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.Advanced.RequestedCaSources Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistAdvancedCaConfig::get_Sources() + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.Advanced.RequestedCaMatchingStrategy Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistAdvancedCaConfig::get_MatchingStrategy() + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistAdvancedCaConfig::.ctor(System.Boolean,System.Boolean,Yoti.Auth.DocScan.Session.Create.Check.Advanced.RequestedCaSources,Yoti.Auth.DocScan.Session.Create.Check.Advanced.RequestedCaMatchingStrategy) + + + + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistScreeningCheck + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistScreeningConfig Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistScreeningCheck::get_Config() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistScreeningCheck::get_Type() + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistScreeningCheck::.ctor(Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistScreeningConfig) + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistScreeningCheckBuilder + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistScreeningCheckBuilder Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistScreeningCheckBuilder::ForSanctions() + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistScreeningCheckBuilder Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistScreeningCheckBuilder::ForAdverseMedia() + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistScreeningCheckBuilder Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistScreeningCheckBuilder::WithCategory(System.String) + + + + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistScreeningCheck Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistScreeningCheckBuilder::Build() + + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistScreeningCheckBuilder::.ctor() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistScreeningConfig + + + + + System.Collections.Generic.List`1<System.String> Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistScreeningConfig::get_Categories() + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Session.Create.Check.RequestedWatchlistScreeningConfig::.ctor(System.Collections.Generic.List`1<System.String>) + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.Advanced.RequestedExactMatchingStrategy + + + + + System.String Yoti.Auth.DocScan.Session.Create.Check.Advanced.RequestedExactMatchingStrategy::get_Type() + + + + + + + + + + + System.Boolean Yoti.Auth.DocScan.Session.Create.Check.Advanced.RequestedExactMatchingStrategy::get_ExactMatch() + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.Advanced.RequestedFuzzyMatchingStrategy + + + + + System.String Yoti.Auth.DocScan.Session.Create.Check.Advanced.RequestedFuzzyMatchingStrategy::get_Type() + + + + + + + + + + + System.Double Yoti.Auth.DocScan.Session.Create.Check.Advanced.RequestedFuzzyMatchingStrategy::get_Fuzziness() + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Session.Create.Check.Advanced.RequestedFuzzyMatchingStrategy::.ctor(System.Double) + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.Advanced.RequestedSearchProfileSources + + + + + System.String Yoti.Auth.DocScan.Session.Create.Check.Advanced.RequestedSearchProfileSources::get_Type() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Create.Check.Advanced.RequestedSearchProfileSources::get_SearchProfile() + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Session.Create.Check.Advanced.RequestedSearchProfileSources::.ctor(System.String) + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.Advanced.RequestedTypeListSources + + + + + System.String Yoti.Auth.DocScan.Session.Create.Check.Advanced.RequestedTypeListSources::get_Type() + + + + + + + + + + + System.Collections.Generic.List`1<System.String> Yoti.Auth.DocScan.Session.Create.Check.Advanced.RequestedTypeListSources::get_Types() + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Session.Create.Check.Advanced.RequestedTypeListSources::.ctor(System.Collections.Generic.List`1<System.String>) + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.Advanced.RequestedWatchlistAdvancedCaConfigCustomAccount + + + + + System.String Yoti.Auth.DocScan.Session.Create.Check.Advanced.RequestedWatchlistAdvancedCaConfigCustomAccount::get_Type() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Create.Check.Advanced.RequestedWatchlistAdvancedCaConfigCustomAccount::get_ApiKey() + + + + + + + + + + + System.Boolean Yoti.Auth.DocScan.Session.Create.Check.Advanced.RequestedWatchlistAdvancedCaConfigCustomAccount::get_Monitoring() + + + + + + + + + + + System.Collections.Generic.Dictionary`2<System.String,System.String> Yoti.Auth.DocScan.Session.Create.Check.Advanced.RequestedWatchlistAdvancedCaConfigCustomAccount::get_Tags() + + + + + + + + + + + System.String Yoti.Auth.DocScan.Session.Create.Check.Advanced.RequestedWatchlistAdvancedCaConfigCustomAccount::get_ClientRef() + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Session.Create.Check.Advanced.RequestedWatchlistAdvancedCaConfigCustomAccount::.ctor(System.Boolean,System.Boolean,Yoti.Auth.DocScan.Session.Create.Check.Advanced.RequestedCaSources,Yoti.Auth.DocScan.Session.Create.Check.Advanced.RequestedCaMatchingStrategy,System.String,System.Boolean,System.Collections.Generic.Dictionary`2<System.String,System.String>,System.String) + + + + + + + + + + + + + + + + + Yoti.Auth.DocScan.Session.Create.Check.Advanced.RequestedWatchlistAdvancedCaConfigYotiAccount + + + + + System.String Yoti.Auth.DocScan.Session.Create.Check.Advanced.RequestedWatchlistAdvancedCaConfigYotiAccount::get_Type() + + + + + + + + + + + System.Void Yoti.Auth.DocScan.Session.Create.Check.Advanced.RequestedWatchlistAdvancedCaConfigYotiAccount::.ctor(System.Boolean,System.Boolean,Yoti.Auth.DocScan.Session.Create.Check.Advanced.RequestedCaSources,Yoti.Auth.DocScan.Session.Create.Check.Advanced.RequestedCaMatchingStrategy) + + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.CreateQrResult + + + + + System.String Yoti.Auth.DigitalIdentity.CreateQrResult::get_Id() + + + + + + + + + + + System.String Yoti.Auth.DigitalIdentity.CreateQrResult::get_Uri() + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.DigitalIdentityService + + + + + System.String Yoti.Auth.DigitalIdentity.DigitalIdentityService::Base64ToBase64URL(System.String) + + + + + + + + + + + + + + + + + + + System.ValueTuple`3<Yoti.Auth.ProtoBuf.Attribute.AttributeList,System.Byte[],System.Exception> Yoti.Auth.DigitalIdentity.DigitalIdentityService::DecryptReceiptContent(Yoti.Auth.DigitalIdentity.Content,System.Byte[]) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.DigitalIdentityService/<>c__DisplayClass11_0 + + + + + Yoti.Auth.DigitalIdentity.ReceiptItemKeyResponse Yoti.Auth.DigitalIdentity.DigitalIdentityService/<>c__DisplayClass11_0::<GetReceiptItemKey>b__0() + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.DigitalIdentityService/<>c__DisplayClass4_0 + + + + + Yoti.Auth.DigitalIdentity.ShareSessionResult Yoti.Auth.DigitalIdentity.DigitalIdentityService/<>c__DisplayClass4_0::<CreateShareSession>b__0() + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.DigitalIdentityService/<>c__DisplayClass5_0 + + + + + Yoti.Auth.DigitalIdentity.GetSessionResult Yoti.Auth.DigitalIdentity.DigitalIdentityService/<>c__DisplayClass5_0::<GetSession>b__0() + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.DigitalIdentityService/<>c__DisplayClass6_0 + + + + + Yoti.Auth.DigitalIdentity.CreateQrResult Yoti.Auth.DigitalIdentity.DigitalIdentityService/<>c__DisplayClass6_0::<CreateQrCode>b__0() + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.DigitalIdentityService/<>c__DisplayClass7_0 + + + + + Yoti.Auth.DigitalIdentity.GetQrCodeResult Yoti.Auth.DigitalIdentity.DigitalIdentityService/<>c__DisplayClass7_0::<GetQrCode>b__0() + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.DigitalIdentityService/<>c__DisplayClass8_0 + + + + + Yoti.Auth.DigitalIdentity.ReceiptResponse Yoti.Auth.DigitalIdentity.DigitalIdentityService/<>c__DisplayClass8_0::<GetReceipt>b__0() + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.DigitalIdentityService/<CreateQrCode>d__6 + + + + + System.Void Yoti.Auth.DigitalIdentity.DigitalIdentityService/<CreateQrCode>d__6::MoveNext() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.DigitalIdentityService/<CreateShareSession>d__4 + + + + + System.Void Yoti.Auth.DigitalIdentity.DigitalIdentityService/<CreateShareSession>d__4::MoveNext() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.DigitalIdentityService/<GetQrCode>d__7 + + + + + System.Void Yoti.Auth.DigitalIdentity.DigitalIdentityService/<GetQrCode>d__7::MoveNext() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.DigitalIdentityService/<GetReceipt>d__8 + + + + + System.Void Yoti.Auth.DigitalIdentity.DigitalIdentityService/<GetReceipt>d__8::MoveNext() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.DigitalIdentityService/<GetReceiptItemKey>d__11 + + + + + System.Void Yoti.Auth.DigitalIdentity.DigitalIdentityService/<GetReceiptItemKey>d__11::MoveNext() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.DigitalIdentityService/<GetSession>d__5 + + + + + System.Void Yoti.Auth.DigitalIdentity.DigitalIdentityService/<GetSession>d__5::MoveNext() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.DigitalIdentityService/<GetShareReceipt>d__10 + + + + + System.Void Yoti.Auth.DigitalIdentity.DigitalIdentityService/<GetShareReceipt>d__10::MoveNext() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.ErrorDetails + + + + + Yoti.Auth.DigitalIdentity.ErrorReason Yoti.Auth.DigitalIdentity.ErrorDetails::get_ErrorReason() + + + + + + + + + + + Yoti.Auth.DigitalIdentity.ErrorReason Yoti.Auth.DigitalIdentity.ErrorDetails::GetErrorReason() + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.ErrorReason + + + + + Yoti.DigitalIdentity.RequirementNotMetDetails Yoti.Auth.DigitalIdentity.ErrorReason::get_RequirementNotMetDetails() + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.GetQrCodeResult + + + + + System.String Yoti.Auth.DigitalIdentity.GetQrCodeResult::get_Id() + + + + + + + + + + + System.String Yoti.Auth.DigitalIdentity.GetQrCodeResult::get_Expiry() + + + + + + + + + + + System.String Yoti.Auth.DigitalIdentity.GetQrCodeResult::get_Policy() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DigitalIdentity.Extensions.BaseExtension> Yoti.Auth.DigitalIdentity.GetQrCodeResult::get_Extensions() + + + + + + + + + + + Yoti.Auth.DigitalIdentity.ShareSessionResult Yoti.Auth.DigitalIdentity.GetQrCodeResult::get_Session() + + + + + + + + + + + System.String Yoti.Auth.DigitalIdentity.GetQrCodeResult::get_RedirectUri() + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Content + + + + + System.Byte[] Yoti.Auth.DigitalIdentity.Content::get_Profile() + + + + + + + + + + + System.Byte[] Yoti.Auth.DigitalIdentity.Content::get_ExtraData() + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.ReceiptResponse + + + + + System.String Yoti.Auth.DigitalIdentity.ReceiptResponse::get_ID() + + + + + + + + + + + System.String Yoti.Auth.DigitalIdentity.ReceiptResponse::get_SessionID() + + + + + + + + + + + System.String Yoti.Auth.DigitalIdentity.ReceiptResponse::get_Timestamp() + + + + + + + + + + + System.String Yoti.Auth.DigitalIdentity.ReceiptResponse::get_RememberMeID() + + + + + + + + + + + System.String Yoti.Auth.DigitalIdentity.ReceiptResponse::get_ParentRememberMeID() + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Content Yoti.Auth.DigitalIdentity.ReceiptResponse::get_Content() + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Content Yoti.Auth.DigitalIdentity.ReceiptResponse::get_OtherPartyContent() + + + + + + + + + + + System.String Yoti.Auth.DigitalIdentity.ReceiptResponse::get_WrappedItemKeyId() + + + + + + + + + + + System.Byte[] Yoti.Auth.DigitalIdentity.ReceiptResponse::get_WrappedKey() + + + + + + + + + + + System.String Yoti.Auth.DigitalIdentity.ReceiptResponse::get_Error() + + + + + + + + + + + Yoti.Auth.DigitalIdentity.ErrorDetails Yoti.Auth.DigitalIdentity.ReceiptResponse::get_ErrorDetails() + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.GetSessionResult + + + + + System.String Yoti.Auth.DigitalIdentity.GetSessionResult::get_Id() + + + + + + + + + + + System.String Yoti.Auth.DigitalIdentity.GetSessionResult::get_Status() + + + + + + + + + + + System.String Yoti.Auth.DigitalIdentity.GetSessionResult::get_Expiry() + + + + + + + + + + + System.String Yoti.Auth.DigitalIdentity.GetSessionResult::get_Created() + + + + + + + + + + + System.String Yoti.Auth.DigitalIdentity.GetSessionResult::get_Updated() + + + + + + + + + + + Yoti.Auth.DigitalIdentity.qrCode Yoti.Auth.DigitalIdentity.GetSessionResult::get_QrCode() + + + + + + + + + + + Yoti.Auth.DigitalIdentity.receipt Yoti.Auth.DigitalIdentity.GetSessionResult::get_Receipt() + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.qrCode + + + + + System.String Yoti.Auth.DigitalIdentity.qrCode::get_Id() + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.receipt + + + + + System.String Yoti.Auth.DigitalIdentity.receipt::get_Id() + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.QrRequest + + + + + System.String Yoti.Auth.DigitalIdentity.QrRequest::get_DisplayMode() + + + + + + + + + + + System.String Yoti.Auth.DigitalIdentity.QrRequest::get_Transport() + + + + + + + + + + + System.Void Yoti.Auth.DigitalIdentity.QrRequest::.ctor(System.String,System.String) + + + + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.QrRequestBuilder + + + + + Yoti.Auth.DigitalIdentity.QrRequestBuilder Yoti.Auth.DigitalIdentity.QrRequestBuilder::WithTransport(System.String) + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.QrRequestBuilder Yoti.Auth.DigitalIdentity.QrRequestBuilder::WithDisplayMode(System.String) + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.QrRequest Yoti.Auth.DigitalIdentity.QrRequestBuilder::Build() + + + + + + + + + + + System.Void Yoti.Auth.DigitalIdentity.QrRequestBuilder::.ctor() + + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.ReceiptItemKeyResponse + + + + + System.String Yoti.Auth.DigitalIdentity.ReceiptItemKeyResponse::get_ID() + + + + + + + + + + + System.Byte[] Yoti.Auth.DigitalIdentity.ReceiptItemKeyResponse::get_Iv() + + + + + + + + + + + System.Byte[] Yoti.Auth.DigitalIdentity.ReceiptItemKeyResponse::get_Value() + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.SharedReceiptResponse + + + + + System.String Yoti.Auth.DigitalIdentity.SharedReceiptResponse::get_ID() + + + + + + + + + + + System.String Yoti.Auth.DigitalIdentity.SharedReceiptResponse::get_SessionID() + + + + + + + + + + + System.String Yoti.Auth.DigitalIdentity.SharedReceiptResponse::get_RememberMeID() + + + + + + + + + + + System.String Yoti.Auth.DigitalIdentity.SharedReceiptResponse::get_ParentRememberMeID() + + + + + + + + + + + System.String Yoti.Auth.DigitalIdentity.SharedReceiptResponse::get_Timestamp() + + + + + + + + + + + System.String Yoti.Auth.DigitalIdentity.SharedReceiptResponse::get_Error() + + + + + + + + + + + Yoti.Auth.DigitalIdentity.ErrorDetails Yoti.Auth.DigitalIdentity.SharedReceiptResponse::get_ErrorDetails() + + + + + + + + + + + Yoti.Auth.DigitalIdentity.UserContent Yoti.Auth.DigitalIdentity.SharedReceiptResponse::get_UserContent() + + + + + + + + + + + Yoti.Auth.DigitalIdentity.ApplicationContent Yoti.Auth.DigitalIdentity.SharedReceiptResponse::get_ApplicationContent() + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.ApplicationContent + + + + + Yoti.Auth.Profile.ApplicationProfile Yoti.Auth.DigitalIdentity.ApplicationContent::get_ApplicationProfile() + + + + + + + + + + + Yoti.Auth.Share.ExtraData Yoti.Auth.DigitalIdentity.ApplicationContent::get_ExtraData() + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.UserContent + + + + + Yoti.Auth.Profile.YotiProfile Yoti.Auth.DigitalIdentity.UserContent::get_UserProfile() + + + + + + + + + + + Yoti.Auth.Share.ExtraData Yoti.Auth.DigitalIdentity.UserContent::get_ExtraData() + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.ShareSessionRequest + + + + + System.String Yoti.Auth.DigitalIdentity.ShareSessionRequest::get__redirectUri() + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.Notification Yoti.Auth.DigitalIdentity.ShareSessionRequest::get__notification() + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.Policy Yoti.Auth.DigitalIdentity.ShareSessionRequest::get_DynamicPolicy() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DigitalIdentity.Extensions.BaseExtension> Yoti.Auth.DigitalIdentity.ShareSessionRequest::get_Extensions() + + + + + + + + + + + System.Object Yoti.Auth.DigitalIdentity.ShareSessionRequest::get_Subject() + + + + + + + + + + + System.String Yoti.Auth.DigitalIdentity.ShareSessionRequest::get_RedirectUri() + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.Notification Yoti.Auth.DigitalIdentity.ShareSessionRequest::get_Notification() + + + + + + + + + + + System.Void Yoti.Auth.DigitalIdentity.ShareSessionRequest::.ctor(Yoti.Auth.DigitalIdentity.Policy.Policy,System.String,Yoti.Auth.DigitalIdentity.Policy.Notification,System.Collections.Generic.List`1<Yoti.Auth.DigitalIdentity.Extensions.BaseExtension>,System.Object) + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.ShareSessionRequestBuilder + + + + + Yoti.Auth.DigitalIdentity.ShareSessionRequestBuilder Yoti.Auth.DigitalIdentity.ShareSessionRequestBuilder::WithRedirectUri(System.String) + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.ShareSessionRequestBuilder Yoti.Auth.DigitalIdentity.ShareSessionRequestBuilder::WithPolicy(Yoti.Auth.DigitalIdentity.Policy.Policy) + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.ShareSessionRequestBuilder Yoti.Auth.DigitalIdentity.ShareSessionRequestBuilder::WithNotification(Yoti.Auth.DigitalIdentity.Policy.Notification) + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.ShareSessionRequestBuilder Yoti.Auth.DigitalIdentity.ShareSessionRequestBuilder::WithExtension(Yoti.Auth.DigitalIdentity.Extensions.BaseExtension) + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.ShareSessionRequestBuilder Yoti.Auth.DigitalIdentity.ShareSessionRequestBuilder::WithSubject(System.Object) + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.ShareSessionRequest Yoti.Auth.DigitalIdentity.ShareSessionRequestBuilder::Build() + + + + + + + + + + + System.Void Yoti.Auth.DigitalIdentity.ShareSessionRequestBuilder::.ctor() + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.ShareSessionResult + + + + + System.String Yoti.Auth.DigitalIdentity.ShareSessionResult::get_Id() + + + + + + + + + + + System.String Yoti.Auth.DigitalIdentity.ShareSessionResult::get_Status() + + + + + + + + + + + System.String Yoti.Auth.DigitalIdentity.ShareSessionResult::get_Expiry() + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.AdvancedIdentityProfile + + + + + System.Collections.Generic.List`1<Yoti.Auth.DigitalIdentity.Policy.Profile> Yoti.Auth.DigitalIdentity.Policy.AdvancedIdentityProfile::get_Profiles() + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.Profile + + + + + System.String Yoti.Auth.DigitalIdentity.Policy.Profile::get_TrustFramework() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DigitalIdentity.Policy.Scheme> Yoti.Auth.DigitalIdentity.Policy.Profile::get_Schemes() + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.Scheme + + + + + System.String Yoti.Auth.DigitalIdentity.Policy.Scheme::get_Label() + + + + + + + + + + + System.String Yoti.Auth.DigitalIdentity.Policy.Scheme::get_Objective() + + + + + + + + + + + System.String Yoti.Auth.DigitalIdentity.Policy.Scheme::get_Type() + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.Constraint + + + + + System.String Yoti.Auth.DigitalIdentity.Policy.Constraint::get_ConstraintType() + + + + + + + + + + + System.Void Yoti.Auth.DigitalIdentity.Policy.Constraint::.ctor(System.String) + + + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.Notification + + + + + System.String Yoti.Auth.DigitalIdentity.Policy.Notification::get_Url() + + + + + + + + + + + System.String Yoti.Auth.DigitalIdentity.Policy.Notification::get_Method() + + + + + + + + + + + System.Collections.Generic.Dictionary`2<System.String,System.String> Yoti.Auth.DigitalIdentity.Policy.Notification::get_Headers() + + + + + + + + + + + System.Boolean Yoti.Auth.DigitalIdentity.Policy.Notification::get_VerifyTls() + + + + + + + + + + + System.Void Yoti.Auth.DigitalIdentity.Policy.Notification::.ctor(System.String,System.String,System.Collections.Generic.Dictionary`2<System.String,System.String>,System.Boolean) + + + + + + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.NotificationBuilder + + + + + Yoti.Auth.DigitalIdentity.Policy.NotificationBuilder Yoti.Auth.DigitalIdentity.Policy.NotificationBuilder::WithUrl(System.String) + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.NotificationBuilder Yoti.Auth.DigitalIdentity.Policy.NotificationBuilder::WithMethod(System.String) + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.NotificationBuilder Yoti.Auth.DigitalIdentity.Policy.NotificationBuilder::WithHeaders(System.Collections.Generic.Dictionary`2<System.String,System.String>) + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.NotificationBuilder Yoti.Auth.DigitalIdentity.Policy.NotificationBuilder::WithVerifyTls(System.Boolean) + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.Notification Yoti.Auth.DigitalIdentity.Policy.NotificationBuilder::Build() + + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.Policy + + + + + System.Collections.Generic.ICollection`1<Yoti.Auth.DigitalIdentity.Policy.WantedAttribute> Yoti.Auth.DigitalIdentity.Policy.Policy::get_WantedAttributes() + + + + + + + + + + + System.Collections.Generic.HashSet`1<System.Int32> Yoti.Auth.DigitalIdentity.Policy.Policy::get_WantedAuthTypes() + + + + + + + + + + + System.Boolean Yoti.Auth.DigitalIdentity.Policy.Policy::get_WantedRememberMeId() + + + + + + + + + + + System.Object Yoti.Auth.DigitalIdentity.Policy.Policy::get_IdentityProfileRequirements() + + + + + + + + + + + System.Object Yoti.Auth.DigitalIdentity.Policy.Policy::get_AdvancedIdentityProfileRequirements() + + + + + + + + + + + System.Void Yoti.Auth.DigitalIdentity.Policy.Policy::.ctor(System.Collections.Generic.ICollection`1<Yoti.Auth.DigitalIdentity.Policy.WantedAttribute>,System.Collections.Generic.HashSet`1<System.Int32>,System.Boolean,System.Object,System.Object) + + + + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder + + + + + Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder::WithWantedAttribute(Yoti.Auth.DigitalIdentity.Policy.WantedAttribute) + + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder::WithWantedAttribute(System.String,System.Collections.Generic.List`1<Yoti.Auth.DigitalIdentity.Policy.Constraint>) + + + + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder::WithFamilyName(System.Collections.Generic.List`1<Yoti.Auth.DigitalIdentity.Policy.Constraint>) + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder::WithGivenNames(System.Collections.Generic.List`1<Yoti.Auth.DigitalIdentity.Policy.Constraint>) + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder::WithFullName(System.Collections.Generic.List`1<Yoti.Auth.DigitalIdentity.Policy.Constraint>) + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder::WithDateOfBirth(System.Collections.Generic.List`1<Yoti.Auth.DigitalIdentity.Policy.Constraint>) + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder::WithAgeOver(System.Int32,System.Collections.Generic.List`1<Yoti.Auth.DigitalIdentity.Policy.Constraint>) + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder::WithAgeUnder(System.Int32,System.Collections.Generic.List`1<Yoti.Auth.DigitalIdentity.Policy.Constraint>) + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder::WithAgeDerivedAttribute(System.String,System.Collections.Generic.List`1<Yoti.Auth.DigitalIdentity.Policy.Constraint>) + + + + + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder::WithGender(System.Collections.Generic.List`1<Yoti.Auth.DigitalIdentity.Policy.Constraint>) + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder::WithPostalAddress(System.Collections.Generic.List`1<Yoti.Auth.DigitalIdentity.Policy.Constraint>) + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder::WithStructuredPostalAddress(System.Collections.Generic.List`1<Yoti.Auth.DigitalIdentity.Policy.Constraint>) + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder::WithNationality(System.Collections.Generic.List`1<Yoti.Auth.DigitalIdentity.Policy.Constraint>) + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder::WithPhoneNumber(System.Collections.Generic.List`1<Yoti.Auth.DigitalIdentity.Policy.Constraint>) + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder::WithSelfie(System.Collections.Generic.List`1<Yoti.Auth.DigitalIdentity.Policy.Constraint>) + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder::WithEmail(System.Collections.Generic.List`1<Yoti.Auth.DigitalIdentity.Policy.Constraint>) + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder::WithDocumentDetails(System.Collections.Generic.List`1<Yoti.Auth.DigitalIdentity.Policy.Constraint>) + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder::WithDocumentImages(System.Collections.Generic.List`1<Yoti.Auth.DigitalIdentity.Policy.Constraint>) + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder::WithSelfieAuthentication(System.Boolean) + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder::WithPinAuthentication(System.Boolean) + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder::WithAuthType(System.Int32,System.Boolean) + + + + + + + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder::WithRememberMeId(System.Boolean) + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder::WithIdentityProfileRequirements(System.Object) + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder::WithAdvancedIdentityProfileRequirements(Yoti.Auth.DigitalIdentity.Policy.AdvancedIdentityProfile) + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.Policy Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder::Build() + + + + + + + + + + + System.Void Yoti.Auth.DigitalIdentity.Policy.PolicyBuilder::.ctor() + + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.PreferredSources + + + + + System.Collections.Generic.List`1<Yoti.Auth.DigitalIdentity.Policy.WantedAnchor> Yoti.Auth.DigitalIdentity.Policy.PreferredSources::get_WantedAnchors() + + + + + + + + + + + System.Boolean Yoti.Auth.DigitalIdentity.Policy.PreferredSources::get_SoftPreference() + + + + + + + + + + + System.Void Yoti.Auth.DigitalIdentity.Policy.PreferredSources::.ctor(System.Collections.Generic.List`1<Yoti.Auth.DigitalIdentity.Policy.WantedAnchor>,System.Boolean) + + + + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.SourceConstraint + + + + + Yoti.Auth.DigitalIdentity.Policy.PreferredSources Yoti.Auth.DigitalIdentity.Policy.SourceConstraint::get_PreferredSources() + + + + + + + + + + + System.Void Yoti.Auth.DigitalIdentity.Policy.SourceConstraint::.ctor(System.Collections.Generic.List`1<Yoti.Auth.DigitalIdentity.Policy.WantedAnchor>,System.Boolean) + + + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.SourceConstraintBuilder + + + + + Yoti.Auth.DigitalIdentity.Policy.SourceConstraintBuilder Yoti.Auth.DigitalIdentity.Policy.SourceConstraintBuilder::WithAnchor(Yoti.Auth.DigitalIdentity.Policy.WantedAnchor) + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.SourceConstraintBuilder Yoti.Auth.DigitalIdentity.Policy.SourceConstraintBuilder::WithSoftPreference(System.Boolean) + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.SourceConstraintBuilder Yoti.Auth.DigitalIdentity.Policy.SourceConstraintBuilder::WithAnchorByValue(System.String,System.String) + + + + + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.SourceConstraintBuilder Yoti.Auth.DigitalIdentity.Policy.SourceConstraintBuilder::WithPassport(System.String) + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.SourceConstraintBuilder Yoti.Auth.DigitalIdentity.Policy.SourceConstraintBuilder::WithDrivingLicense(System.String) + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.SourceConstraintBuilder Yoti.Auth.DigitalIdentity.Policy.SourceConstraintBuilder::WithNationalId(System.String) + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.SourceConstraintBuilder Yoti.Auth.DigitalIdentity.Policy.SourceConstraintBuilder::WithPasscard(System.String) + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.SourceConstraint Yoti.Auth.DigitalIdentity.Policy.SourceConstraintBuilder::Build() + + + + + + + + + + + System.Void Yoti.Auth.DigitalIdentity.Policy.SourceConstraintBuilder::.ctor() + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.WantedAnchor + + + + + System.String Yoti.Auth.DigitalIdentity.Policy.WantedAnchor::get_Name() + + + + + + + + + + + System.String Yoti.Auth.DigitalIdentity.Policy.WantedAnchor::get_SubType() + + + + + + + + + + + System.Void Yoti.Auth.DigitalIdentity.Policy.WantedAnchor::.ctor(System.String,System.String) + + + + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.WantedAnchorBuilder + + + + + Yoti.Auth.DigitalIdentity.Policy.WantedAnchorBuilder Yoti.Auth.DigitalIdentity.Policy.WantedAnchorBuilder::WithValue(System.String) + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.WantedAnchorBuilder Yoti.Auth.DigitalIdentity.Policy.WantedAnchorBuilder::WithSubType(System.String) + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.WantedAnchor Yoti.Auth.DigitalIdentity.Policy.WantedAnchorBuilder::Build() + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.WantedAttribute + + + + + System.String Yoti.Auth.DigitalIdentity.Policy.WantedAttribute::get_Name() + + + + + + + + + + + System.String Yoti.Auth.DigitalIdentity.Policy.WantedAttribute::get_Derivation() + + + + + + + + + + + System.Nullable`1<System.Boolean> Yoti.Auth.DigitalIdentity.Policy.WantedAttribute::get_Optional() + + + + + + + + + + + System.Nullable`1<System.Boolean> Yoti.Auth.DigitalIdentity.Policy.WantedAttribute::get_AcceptSelfAsserted() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.DigitalIdentity.Policy.Constraint> Yoti.Auth.DigitalIdentity.Policy.WantedAttribute::get_Constraints() + + + + + + + + + + + System.Void Yoti.Auth.DigitalIdentity.Policy.WantedAttribute::.ctor(System.String,System.String,System.Collections.Generic.List`1<Yoti.Auth.DigitalIdentity.Policy.Constraint>,System.Nullable`1<System.Boolean>,System.Nullable`1<System.Boolean>) + + + + + + + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.WantedAttributeBuilder + + + + + Yoti.Auth.DigitalIdentity.Policy.WantedAttributeBuilder Yoti.Auth.DigitalIdentity.Policy.WantedAttributeBuilder::WithName(System.String) + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.WantedAttributeBuilder Yoti.Auth.DigitalIdentity.Policy.WantedAttributeBuilder::WithOptional(System.Boolean) + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.WantedAttributeBuilder Yoti.Auth.DigitalIdentity.Policy.WantedAttributeBuilder::WithDerivation(System.String) + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.WantedAttributeBuilder Yoti.Auth.DigitalIdentity.Policy.WantedAttributeBuilder::WithConstraint(Yoti.Auth.DigitalIdentity.Policy.Constraint) + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.WantedAttributeBuilder Yoti.Auth.DigitalIdentity.Policy.WantedAttributeBuilder::WithConstraints(System.Collections.Generic.List`1<Yoti.Auth.DigitalIdentity.Policy.Constraint>) + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.WantedAttributeBuilder Yoti.Auth.DigitalIdentity.Policy.WantedAttributeBuilder::WithAcceptSelfAsserted(System.Boolean) + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Policy.WantedAttribute Yoti.Auth.DigitalIdentity.Policy.WantedAttributeBuilder::Build() + + + + + + + + + + + + System.Void Yoti.Auth.DigitalIdentity.Policy.WantedAttributeBuilder::.ctor() + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Extensions.BaseExtension + + + + + System.String Yoti.Auth.DigitalIdentity.Extensions.BaseExtension::get_ExtensionType() + + + + + + + + + + + System.Void Yoti.Auth.DigitalIdentity.Extensions.BaseExtension::.ctor(System.String) + + + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Extensions.DeviceLocation + + + + + System.Double Yoti.Auth.DigitalIdentity.Extensions.DeviceLocation::get_Latitude() + + + + + + + + + + + System.Double Yoti.Auth.DigitalIdentity.Extensions.DeviceLocation::get_Longitude() + + + + + + + + + + + System.Double Yoti.Auth.DigitalIdentity.Extensions.DeviceLocation::get_Radius() + + + + + + + + + + + System.Double Yoti.Auth.DigitalIdentity.Extensions.DeviceLocation::get_MaxUncertainty() + + + + + + + + + + + System.Void Yoti.Auth.DigitalIdentity.Extensions.DeviceLocation::.ctor(System.Double,System.Double,System.Double,System.Double) + + + + + + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Extensions.Extension`1 + + + + + T Yoti.Auth.DigitalIdentity.Extensions.Extension`1::get_Content() + + + + + + + + + + + System.Void Yoti.Auth.DigitalIdentity.Extensions.Extension`1::.ctor(System.String,T) + + + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Extensions.ExtensionBuilder`1 + + + + + Yoti.Auth.DigitalIdentity.Extensions.ExtensionBuilder`1<T> Yoti.Auth.DigitalIdentity.Extensions.ExtensionBuilder`1::WithType(System.String) + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Extensions.ExtensionBuilder`1<T> Yoti.Auth.DigitalIdentity.Extensions.ExtensionBuilder`1::WithContent(T) + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Extensions.Extension`1<T> Yoti.Auth.DigitalIdentity.Extensions.ExtensionBuilder`1::Build() + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Extensions.LocationConstraintContent + + + + + Yoti.Auth.DigitalIdentity.Extensions.DeviceLocation Yoti.Auth.DigitalIdentity.Extensions.LocationConstraintContent::get_ExpectedDeviceLocation() + + + + + + + + + + + System.Void Yoti.Auth.DigitalIdentity.Extensions.LocationConstraintContent::.ctor(System.Double,System.Double,System.Double,System.Double) + + + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Extensions.LocationConstraintExtensionBuilder + + + + + Yoti.Auth.DigitalIdentity.Extensions.LocationConstraintExtensionBuilder Yoti.Auth.DigitalIdentity.Extensions.LocationConstraintExtensionBuilder::WithLatitude(System.Double) + + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Extensions.LocationConstraintExtensionBuilder Yoti.Auth.DigitalIdentity.Extensions.LocationConstraintExtensionBuilder::WithLongitude(System.Double) + + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Extensions.LocationConstraintExtensionBuilder Yoti.Auth.DigitalIdentity.Extensions.LocationConstraintExtensionBuilder::WithRadius(System.Double) + + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Extensions.LocationConstraintExtensionBuilder Yoti.Auth.DigitalIdentity.Extensions.LocationConstraintExtensionBuilder::WithMaxUncertainty(System.Double) + + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Extensions.Extension`1<Yoti.Auth.DigitalIdentity.Extensions.LocationConstraintContent> Yoti.Auth.DigitalIdentity.Extensions.LocationConstraintExtensionBuilder::Build() + + + + + + + + + + + + System.Void Yoti.Auth.DigitalIdentity.Extensions.LocationConstraintExtensionBuilder::.ctor() + + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Extensions.ThirdPartyAttributeContent + + + + + System.Collections.Generic.List`1<Yoti.Auth.Share.ThirdParty.AttributeDefinition> Yoti.Auth.DigitalIdentity.Extensions.ThirdPartyAttributeContent::get_Definitions() + + + + + + + + + + + System.String Yoti.Auth.DigitalIdentity.Extensions.ThirdPartyAttributeContent::get_ExpiryDate() + + + + + + + + + + + System.Void Yoti.Auth.DigitalIdentity.Extensions.ThirdPartyAttributeContent::.ctor(System.DateTime,System.Collections.Generic.List`1<Yoti.Auth.Share.ThirdParty.AttributeDefinition>) + + + + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Extensions.ThirdPartyAttributeExtensionBuilder + + + + + Yoti.Auth.DigitalIdentity.Extensions.ThirdPartyAttributeExtensionBuilder Yoti.Auth.DigitalIdentity.Extensions.ThirdPartyAttributeExtensionBuilder::WithExpiryDate(System.DateTime) + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Extensions.ThirdPartyAttributeExtensionBuilder Yoti.Auth.DigitalIdentity.Extensions.ThirdPartyAttributeExtensionBuilder::WithDefinition(System.String) + + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Extensions.ThirdPartyAttributeExtensionBuilder Yoti.Auth.DigitalIdentity.Extensions.ThirdPartyAttributeExtensionBuilder::WithDefinitions(System.Collections.Generic.List`1<System.String>) + + + + + + + + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Extensions.Extension`1<Yoti.Auth.DigitalIdentity.Extensions.ThirdPartyAttributeContent> Yoti.Auth.DigitalIdentity.Extensions.ThirdPartyAttributeExtensionBuilder::Build() + + + + + + + + + + + + + + System.Void Yoti.Auth.DigitalIdentity.Extensions.ThirdPartyAttributeExtensionBuilder::.ctor() + + + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Extensions.TransactionalFlowExtensionBuilder`1 + + + + + Yoti.Auth.DigitalIdentity.Extensions.TransactionalFlowExtensionBuilder`1<T> Yoti.Auth.DigitalIdentity.Extensions.TransactionalFlowExtensionBuilder`1::WithContent(T) + + + + + + + + + + + + + Yoti.Auth.DigitalIdentity.Extensions.Extension`1<T> Yoti.Auth.DigitalIdentity.Extensions.TransactionalFlowExtensionBuilder`1::Build() + + + + + + + + + + + + Yoti.Auth.DataObjects.ProfileDO + + + + + Yoti.Auth.DataObjects.ReceiptDO Yoti.Auth.DataObjects.ProfileDO::get_Receipt() + + + + + + + + + + + + Yoti.Auth.DataObjects.ReceiptDO + + + + + System.String Yoti.Auth.DataObjects.ReceiptDO::get_ReceiptId() + + + + + + + + + + + System.String Yoti.Auth.DataObjects.ReceiptDO::get_OtherPartyProfileContent() + + + + + + + + + + + System.String Yoti.Auth.DataObjects.ReceiptDO::get_ProfileContent() + + + + + + + + + + + System.String Yoti.Auth.DataObjects.ReceiptDO::get_OtherPartyExtraDataContent() + + + + + + + + + + + System.String Yoti.Auth.DataObjects.ReceiptDO::get_ExtraDataContent() + + + + + + + + + + + System.String Yoti.Auth.DataObjects.ReceiptDO::get_WrappedReceiptKey() + + + + + + + + + + + System.String Yoti.Auth.DataObjects.ReceiptDO::get_PolicyURI() + + + + + + + + + + + System.String Yoti.Auth.DataObjects.ReceiptDO::get_PersonalKey() + + + + + + + + + + + System.String Yoti.Auth.DataObjects.ReceiptDO::get_RememberMeId() + + + + + + + + + + + System.String Yoti.Auth.DataObjects.ReceiptDO::get_ParentRememberMeId() + + + + + + + + + + + System.String Yoti.Auth.DataObjects.ReceiptDO::get_SharingOutcome() + + + + + + + + + + + System.String Yoti.Auth.DataObjects.ReceiptDO::get_Timestamp() + + + + + + + + + + + + Yoti.Auth.Constants.Api + + + + + System.Void Yoti.Auth.Constants.Api::.cctor() + + + + + + + + + + + + + + Yoti.Auth.Attribute.AttributeConverter + + + + + System.Collections.Generic.Dictionary`2<System.String,System.Collections.Generic.List`1<Yoti.Auth.Attribute.BaseAttribute>> Yoti.Auth.Attribute.AttributeConverter::ConvertToBaseAttributes(Yoti.Auth.ProtoBuf.Attribute.AttributeList) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.Attribute.BaseAttribute Yoti.Auth.Attribute.AttributeConverter::ConvertToBaseAttribute(Yoti.Auth.ProtoBuf.Attribute.Attribute) + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.Attribute.BaseAttribute Yoti.Auth.Attribute.AttributeConverter::CreateYotiAttribute(Yoti.Auth.ProtoBuf.Attribute.Attribute,NLog.Logger,System.Byte[]) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + System.Object Yoti.Auth.Attribute.AttributeConverter::ParseAttributeValue(Yoti.Auth.ProtoBuf.Attribute.ContentType,NLog.Logger,System.Byte[]) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.Anchors.Anchor> Yoti.Auth.Attribute.AttributeConverter::ParseAnchors(Yoti.Auth.ProtoBuf.Attribute.Attribute) + + + + + + + + + + + + + + + + + System.Collections.Generic.Dictionary`2<System.String,Newtonsoft.Json.Linq.JToken> Yoti.Auth.Attribute.AttributeConverter::GetJsonValue(System.Byte[]) + + + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.Attribute.MultiValueItem> Yoti.Auth.Attribute.AttributeConverter::ConvertMultiValue(System.Byte[]) + + + + + + + + + + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.Images.Image> Yoti.Auth.Attribute.AttributeConverter::CreateImageListFromMultiValue(System.Collections.Generic.List`1<Yoti.Auth.Attribute.MultiValueItem>) + + + + + + + + + + + + + + + + + + + + + + + + + System.DateTime Yoti.Auth.Attribute.AttributeConverter::GetDateValue(System.Byte[]) + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.Attribute.BaseAttribute + + + + + System.String Yoti.Auth.Attribute.BaseAttribute::GetName() + + + + + + + + + + + System.String Yoti.Auth.Attribute.BaseAttribute::GetId() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.Anchors.Anchor> Yoti.Auth.Attribute.BaseAttribute::GetAnchors() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.Anchors.Anchor> Yoti.Auth.Attribute.BaseAttribute::GetSources() + + + + + + + + + + + System.Collections.Generic.List`1<Yoti.Auth.Anchors.Anchor> Yoti.Auth.Attribute.BaseAttribute::GetVerifiers() + + + + + + + + + + + System.Void Yoti.Auth.Attribute.BaseAttribute::.ctor(System.String,System.Collections.Generic.List`1<Yoti.Auth.Anchors.Anchor>,System.String) + + + + + + + + + + + + + + + + Yoti.Auth.Attribute.MultiValueItem + + + + + System.Object Yoti.Auth.Attribute.MultiValueItem::get_Value() + + + + + + + + + + + Yoti.Auth.ProtoBuf.Attribute.ContentType Yoti.Auth.Attribute.MultiValueItem::get_ContentType() + + + + + + + + + + + System.Void Yoti.Auth.Attribute.MultiValueItem::.ctor(System.Object,Yoti.Auth.ProtoBuf.Attribute.ContentType) + + + + + + + + + + + + + + + Yoti.Auth.Attribute.YotiAttribute`1 + + + + + T Yoti.Auth.Attribute.YotiAttribute`1::GetValue() + + + + + + + + + + + System.Void Yoti.Auth.Attribute.YotiAttribute`1::.ctor(System.String,T,System.Collections.Generic.List`1<Yoti.Auth.Anchors.Anchor>,System.String) + + + + + + + + + + + + + + Yoti.Auth.Anchors.Anchor + + + + + System.Collections.Generic.List`1<System.Security.Cryptography.X509Certificates.X509Certificate2> Yoti.Auth.Anchors.Anchor::ConvertRawCertToX509List(Google.Protobuf.Collections.RepeatedField`1<Google.Protobuf.ByteString>) + + + + + + + + + + + + + + + + + + Yoti.Auth.Anchors.AnchorType Yoti.Auth.Anchors.Anchor::GetAnchorType() + + + + + + + + + + + System.String Yoti.Auth.Anchors.Anchor::GetValue() + + + + + + + + + + + System.Collections.Generic.List`1<System.Security.Cryptography.X509Certificates.X509Certificate2> Yoti.Auth.Anchors.Anchor::GetOriginServerCerts() + + + + + + + + + + + System.Byte[] Yoti.Auth.Anchors.Anchor::GetSignature() + + + + + + + + + + + Yoti.Auth.Anchors.SignedTimestamp Yoti.Auth.Anchors.Anchor::GetSignedTimeStamp() + + + + + + + + + + + System.String Yoti.Auth.Anchors.Anchor::GetSubType() + + + + + + + + + + + System.Void Yoti.Auth.Anchors.Anchor::.ctor(Yoti.Auth.ProtoBuf.Attribute.Anchor) + + + + + + + + + + + + + + + + + + + + + + Yoti.Auth.Anchors.AnchorCertificateParser + + + + + Yoti.Auth.Anchors.AnchorVerifierSourceData Yoti.Auth.Anchors.AnchorCertificateParser::GetTypesFromAnchor(Yoti.Auth.ProtoBuf.Attribute.Anchor) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + System.Collections.Generic.List`1<System.String> Yoti.Auth.Anchors.AnchorCertificateParser::GetListOfStringsFromExtension(System.Security.Cryptography.X509Certificates.X509Certificate2,System.String) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + System.String Yoti.Auth.Anchors.AnchorCertificateParser::ExtensionOid(System.Enum) + + + + + + + + + + + + + + + + + + Yoti.Auth.Anchors.AnchorVerifierSourceData + + + + + System.Collections.Generic.HashSet`1<System.String> Yoti.Auth.Anchors.AnchorVerifierSourceData::GetEntries() + + + + + + + + + + + Yoti.Auth.Anchors.AnchorType Yoti.Auth.Anchors.AnchorVerifierSourceData::GetAnchorType() + + + + + + + + + + + System.Void Yoti.Auth.Anchors.AnchorVerifierSourceData::.ctor(System.Collections.Generic.HashSet`1<System.String>,Yoti.Auth.Anchors.AnchorType) + + + + + + + + + + + + + + + Yoti.Auth.Anchors.ExtensionOidAttribute + + + + + System.Void Yoti.Auth.Anchors.ExtensionOidAttribute::.ctor(System.String) + + + + + + + + + + + + + + Yoti.Auth.Anchors.SignedTimestamp + + + + + System.DateTime Yoti.Auth.Anchors.SignedTimestamp::ConvertMicroSecondsSinceEpochToDateTime(Yoti.Auth.ProtoBuf.Common.SignedTimestamp) + + + + + + + + + + + + + + System.Int32 Yoti.Auth.Anchors.SignedTimestamp::GetVersion() + + + + + + + + + + + System.DateTime Yoti.Auth.Anchors.SignedTimestamp::GetTimestamp() + + + + + + + + + + + System.Byte[] Yoti.Auth.Anchors.SignedTimestamp::GetMessageDigest() + + + + + + + + + + + System.Byte[] Yoti.Auth.Anchors.SignedTimestamp::GetChainDigest() + + + + + + + + + + + System.Byte[] Yoti.Auth.Anchors.SignedTimestamp::GetChainDigestSkip1() + + + + + + + + + + + System.Byte[] Yoti.Auth.Anchors.SignedTimestamp::GetChainDigestSkip2() + + + + + + + + + + + System.Void Yoti.Auth.Anchors.SignedTimestamp::.ctor(Yoti.Auth.ProtoBuf.Common.SignedTimestamp) + + + + + + + + + + + + + + + + + + + + Yoti.Auth.Aml.AmlAddress + + + + + System.String Yoti.Auth.Aml.AmlAddress::GetCountry() + + + + + + + + + + + System.String Yoti.Auth.Aml.AmlAddress::GetPostcode() + + + + + + + + + + + System.Void Yoti.Auth.Aml.AmlAddress::.ctor(System.String,System.String) + + + + + + + + + + + + + + + Yoti.Auth.Aml.AmlProfile + + + + + Yoti.Auth.Aml.IAmlAddress Yoti.Auth.Aml.AmlProfile::GetAmlAddress() + + + + + + + + + + + System.String Yoti.Auth.Aml.AmlProfile::GetFamilyName() + + + + + + + + + + + System.String Yoti.Auth.Aml.AmlProfile::GetGivenNames() + + + + + + + + + + + System.String Yoti.Auth.Aml.AmlProfile::GetSsn() + + + + + + + + + + + System.Void Yoti.Auth.Aml.AmlProfile::.ctor(System.String,System.String,Yoti.Auth.Aml.AmlAddress,System.String) + + + + + + + + + + + + + + + + + Yoti.Auth.Aml.AmlResult + + + + + System.Boolean Yoti.Auth.Aml.AmlResult::IsOnFraudList() + + + + + + + + + + + System.Boolean Yoti.Auth.Aml.AmlResult::IsOnPepList() + + + + + + + + + + + System.Boolean Yoti.Auth.Aml.AmlResult::IsOnWatchList() + + + + + + + + + + + + Yoti.Auth.Aml.RemoteAmlService/<PerformCheck>d__0 + + + + + System.Void Yoti.Auth.Aml.RemoteAmlService/<PerformCheck>d__0::MoveNext() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file