Tessio.Verifier.OpenId4Vp 0.11.0

Prefix Reserved
dotnet add package Tessio.Verifier.OpenId4Vp --version 0.11.0
                    
NuGet\Install-Package Tessio.Verifier.OpenId4Vp -Version 0.11.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Tessio.Verifier.OpenId4Vp" Version="0.11.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Tessio.Verifier.OpenId4Vp" Version="0.11.0" />
                    
Directory.Packages.props
<PackageReference Include="Tessio.Verifier.OpenId4Vp" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Tessio.Verifier.OpenId4Vp --version 0.11.0
                    
#r "nuget: Tessio.Verifier.OpenId4Vp, 0.11.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Tessio.Verifier.OpenId4Vp@0.11.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Tessio.Verifier.OpenId4Vp&version=0.11.0
                    
Install as a Cake Addin
#tool nuget:?package=Tessio.Verifier.OpenId4Vp&version=0.11.0
                    
Install as a Cake Tool

Tessio.Verifier

The .NET / ASP.NET Core verifier for the EU Digital Identity (EUDI) Wallet.

CI NuGet License: Apache 2.0

Verify credentials presented by EUDI Wallets directly from your .NET backend, over OpenID4VP 1.0 with SD-JWT VC and mdoc credentials. Native to ASP.NET Core and Azure, with a built-in demo mode so you can run a full verification flow today, before any production wallet ships.

Relying-party (verifier) side only. This library never acts as a wallet or an issuer.

Status: the full pipeline runs on main, and the quickstart below works end to end. Version 0.9.1 is on NuGet. SD-JWT VC and mso_mdoc credentials (ISO 18013-5/-7 mobile documents, e.g. the mDL) are verified through the same pipeline, over either the OpenID4VP redirect flow or the W3C Digital Credentials API transport (ISO/IEC 18013-7 Annex C), and every layer is validated against external artifacts rather than fixtures we wrote ourselves. What changed in each release lives in the release notes, which is the only place it is maintained.

Why this exists

The EUDI Wallet arrives under Regulation (EU) 2024/1183. Member states must make a wallet available by 24 December 2026. From 24 December 2027 a relying party that is required to use strong user authentication for online identification must also accept a wallet, and only when the user chooses to present one. Micro and small enterprises are out of scope, and both dates run from the implementing acts that entered into force on 24 December 2024 rather than from the regulation itself.

If you verify those credentials from .NET, this library does the protocol and the cryptography and then proves it against tests written by someone else. It passes the OpenID Foundation conformance suite for OpenID4VP 1.0 HAIP verifiers in both credential formats the wallet uses, and every run is pinned to the source tree it ran against in conformance-record.json.

What you get

  • OpenID4VP 1.0 verifier flow (cross-device / QR), DCQL queries, JAR-signed requests (RFC 9101)
  • SD-JWT VC verification: issuer signature (JWT VC Issuer Metadata and X.509), selective disclosure, key binding (KB-JWT), transaction data
  • mdoc (mso_mdoc) verification: ISO 18013-5/-7 mobile documents like the mDL, validated against the spec's own vectors and an independent implementation
  • W3C Digital Credentials API transport (ISO/IEC 18013-7 Annex C): build the {deviceRequest, encryptionInfo} request pair, open the HPKE-encrypted response (RFC 9180, checked against the RFC's own vectors) and verify device auth over the Annex C session transcript (Iso18013AnnexC)
  • Token Status List revocation checking
  • Demo / Mock / Test / Live modes so you can build before wallets exist, then serve real ones
  • Idiomatic ASP.NET Core integration (DI + minimal APIs) and a runnable sample
  • Self-driving and multi-tenant hosting: verify wallet callbacks for many tenants in one process, each against its own request (IWalletResponseVerifier)
  • A pluggable trust seam (ITrustListResolver) for production trust lists

Install

dotnet add package Tessio.Verifier.AspNetCore

Runs on .NET 8, 9 and 10. The packages target .NET 8 and .NET 10 (both LTS); apps on .NET 9 use the .NET 8 build.

Quickstart in 5 minutes (DEMO mode)

using Tessio.Verifier.AspNetCore;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddTessioVerifier(options =>
{
    options.Mode = VerifierMode.Demo;          // auto-completes locally, no real wallet needed
    options.RequestedClaims = ["age_over_18"]; // selective disclosure: ask only for what you need
});

var app = builder.Build();

app.MapTessioVerifier();   // request-init, wallet-callback and result-stream (SSE) endpoints

app.MapGet("/", () => Results.Content(
    """<a href="/verify/start">Start a verification</a>""", "text/html"));

app.Run();

Run it, open the page, start a verification, and DEMO mode returns a verified age_over_18 claim over Server-Sent Events.

Modes

  • Demo: auto-completes in seconds, for showcases and first-run experience.
  • Mock: a built-in mock wallet posts freshly signed credentials through the full verification pipeline, encrypted responses included. Set options.CredentialFormat = "mso_mdoc" to run the mdoc pipeline instead of SD-JWT VC.
  • Test: replays the RFC 9901 conformance vector (the spec's German PID example) through the real verifier, so you see the verifier agree with the specification's own bytes.
  • Live: sessions wait for real wallets on the callback endpoint. docs/going-live.md covers the setup: signed requests, trust lists, session stores and response encryption.

Packages

Package Purpose
Tessio.Verifier.Core Credential verification (SD-JWT VC, disclosures, KB-JWT). No web dependencies.
Tessio.Verifier.Core.Mdoc mdoc verification (ISO 18013-5/-7: MSO, digests, device auth).
Tessio.Verifier.OpenId4Vp OpenID4VP protocol layer (request build, JAR, response parsing, Dcql query builders).
Tessio.Verifier.AspNetCore DI, endpoints, session management, the multi-tenant verification seam, demo/mock/test modes.
Tessio.Verifier.Trust ITrustListResolver interface + a basic implementation.

Going to production

docs/going-live.md walks through the code side: signed requests (Key Vault/HSM included), real trust lists, distributed session stores and shared response-encryption keys. For self-driving or multi-tenant hosting (your own store, one process serving many tenants), see docs/self-driving-and-multi-tenant.md. Beyond the code, live verification against real wallets requires a registered Relying Party and a WRPAC (Wallet Relying Party Access Certificate) from a Qualified Trust Service Provider, plus maintained EU trust lists. This library handles the protocol and credential verification. The trust and compliance layer is provided separately (see docs/production.md). Relying parties do not need their own HSM/QSCD, since the QTSP holds those.

Standards

Free validators

When a credential will not verify, the quickest way to find out why is to look at it outside your own code. These are free, need no account, and cover the formats this library handles:

Validator What it answers
SD-JWT VC Validator Does each disclosure bind to a signed _sd digest?
mdoc / mDL Validator Is the Mobile Security Object intact, and does the IACA chain hold?
eIDAS Signature Validator Is this PAdES, CAdES or JAdES signature valid, and is it qualified?
EU Trusted List Checker Is this certificate a qualified CA on an EU trusted list?
EUDI Trusted Entity Checker Does the EUDI ecosystem trust this certificate, and in which role?

The SD-JWT VC validator runs in your browser by default, so nothing you paste leaves the machine unless you opt into issuer-trust anchoring. The other four check against EU trust data that only a server can fetch, so they post what you give them to the hosted service. Each tool states which it is doing. They are built by the maintainers of this library, on the same verification engine, and nothing here depends on them.

Repository

License

Apache-2.0

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on Tessio.Verifier.OpenId4Vp:

Package Downloads
Tessio.Verifier.AspNetCore

Open source .NET and ASP.NET Core verifier for the EU Digital Identity Wallet, relying party side. OpenID4VP 1.0 with DCQL, SD-JWT VC and ISO 18013-5 mdoc, with COSE, CBOR and X.509 chain validation. Apache-2.0.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
0.11.0 37 9/26/2026
0.10.0 227 9/20/2026
0.9.1 200 9/11/2026
0.9.0 120 9/11/2026
0.8.2 268 9/4/2026
0.8.1 151 8/31/2026
0.8.0 144 8/27/2026
0.7.0 135 8/26/2026
0.6.0 155 8/21/2026
0.5.0 135 8/21/2026
0.4.1 178 8/12/2026
0.4.0 124 8/11/2026
0.3.3 152 8/5/2026
0.3.2 146 8/5/2026
0.3.1 139 8/4/2026
0.3.0 277 7/28/2026
0.3.0-preview.1 73 7/28/2026
0.2.1 147 7/23/2026
0.2.0 143 7/22/2026
0.2.0-preview.2 72 7/22/2026
Loading failed