{"id":13594224,"url":"https://github.com/passwordless-lib/fido2-net-lib","last_synced_at":"2026-01-14T04:15:49.984Z","repository":{"id":38279204,"uuid":"135551045","full_name":"passwordless-lib/fido2-net-lib","owner":"passwordless-lib","description":"Passkeys, FIDO2 and WebAuhtn .NET library.","archived":false,"fork":false,"pushed_at":"2025-12-11T18:50:40.000Z","size":4543,"stargazers_count":1380,"open_issues_count":36,"forks_count":193,"subscribers_count":41,"default_branch":"main","last_synced_at":"2025-12-21T03:33:36.032Z","etag":null,"topics":["asp-net-core","ctap","fido","fido2","net-core","passkeys","passwordless","webauthn"],"latest_commit_sha":null,"homepage":"https://fido2.andersaberg.com","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/passwordless-lib.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"open_collective":"passwordless","github":"passwordless-lib"}},"created_at":"2018-05-31T07:51:51.000Z","updated_at":"2025-12-17T07:39:26.000Z","dependencies_parsed_at":"2022-07-12T17:22:50.688Z","dependency_job_id":"e39216e1-c4c6-406b-9050-e4795192d276","html_url":"https://github.com/passwordless-lib/fido2-net-lib","commit_stats":{"total_commits":586,"total_committers":55,"mean_commits":"10.654545454545454","dds":0.7337883959044369,"last_synced_commit":"ea6cd8f39e332b8b3e1f1a65d53b0ddb9a136d0b"},"previous_names":["abergs/fido2-net-lib"],"tags_count":29,"template":false,"template_full_name":null,"purl":"pkg:github/passwordless-lib/fido2-net-lib","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/passwordless-lib%2Ffido2-net-lib","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/passwordless-lib%2Ffido2-net-lib/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/passwordless-lib%2Ffido2-net-lib/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/passwordless-lib%2Ffido2-net-lib/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/passwordless-lib","download_url":"https://codeload.github.com/passwordless-lib/fido2-net-lib/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/passwordless-lib%2Ffido2-net-lib/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28255576,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2026-01-09T02:00:07.210Z","response_time":75,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["asp-net-core","ctap","fido","fido2","net-core","passkeys","passwordless","webauthn"],"created_at":"2024-08-01T16:01:30.419Z","updated_at":"2026-01-14T04:15:49.977Z","avatar_url":"https://github.com/passwordless-lib.png","language":"C#","readme":"# Passkeys - FIDO2 .NET Library (WebAuthn)\n\nA fully working and battle tested library for passkeys ([FIDO2](https://fidoalliance.org/fido2/) and [WebAuthn](https://www.w3.org/TR/webauthn/)) on [.NET](https://dotnet.microsoft.com/)\n\n[![codecov](https://codecov.io/gh/passwordless-lib/fido2-net-lib/branch/main/graph/badge.svg)](https://codecov.io/gh/passwordless-lib/fido2-net-lib)\n[![Financial Contributors on Open Collective](https://opencollective.com/passwordless/all/badge.svg?label=financial+contributors)](https://opencollective.com/passwordless)\n[![NuGet Status](http://img.shields.io/nuget/v/Fido2.svg?style=flat-square)](https://www.nuget.org/packages/Fido2/)\n\n[Releases \u0026 Change log](https://github.com/passwordless-lib/fido2-net-lib/releases)\n\n\u003e ### 💡 Bitwarden Passwordless API\n\u003e\n\u003e The quickest way to get started with FIDO2 and WebAuthn is with the [Bitwarden Passwordless API](https://passwordless.dev?gh). It's free up to 10k users and a faster way to start using passkeys on your website or mobile app.\n\u003e\n\u003e Bitwarden Passwordless.dev supports .NET Framework as well as the latest .net 8+.\n\u003e\n\u003e [Get started with passwordless.dev](https://docs.passwordless.dev/guide/get-started.html)\n\n### Purpose\n\n\u003cimg align=\"right\" width=\"100px\" src=\"https://user-images.githubusercontent.com/357283/188737052-4735ba0a-08b5-47e8-9b2c-02c8829d2413.png\" /\u003e\nOur purpose is to enable passwordless sign in for all .NET apps (asp, core, native).\n\nTo provide a developer friendly and well tested [.NET](https://dotnet.microsoft.com/) [FIDO2 Server](https://fidoalliance.org/specs/fido-v2.0-rd-20180702/fido-server-v2.0-rd-20180702.html) / [WebAuthn relying party](https://www.w3.org/TR/webauthn/#relying-party) library for the easy validation of [registration](https://www.w3.org/TR/webauthn/#usecase-registration) ([attestation](https://www.w3.org/TR/webauthn/#attestation)) and [authentication](https://www.w3.org/TR/webauthn/#usecase-authentication) ([assertion](https://www.w3.org/TR/webauthn/#authentication-assertion)) of [FIDO2](https://fidoalliance.org/fido2/) / [WebAuthn](https://www.w3.org/TR/webauthn/) credentials, in order to increase the adoption of the technology, ultimately defeating phishing attacks.\n\nThis project is part of the [.NET foundation](https://dotnetfoundation.org)\n\n## .NET 10 Passkeys vs this library?\n\nWondering if you should use what's in .NET 10 or this library? I've worked together with Microsoft on their passkey implementation and how it relates to this library, so I can share some perspective that may be aid in your decision:\n\n- The passkey support announced Microsoft in .NET 10 **is only available as part of ASP.NET Identity**.\n- Fido2-net-lib is a more capable implementation, and Microsoft recommends you to use this (or any other 3p library) if you want to use more advanced features like attestation. They built a plugin interface so you can combine this library with theirs.\n- Since the passkey specification is evolving, I think using this library will give you access to new parts of the standard faster than using ASP.NET Identity.\n\n**When picking Microsoft asp.net identity is a good idea:**\n\n- You're using ASP.NET Identity and need passkeys.\n- You don't want to use attestation or newer passkey features\n\n**When picking this library is a good idea:**\n\n- You don't want to be tied to using ASP.NET Identity\n- You're building a SPA and doing auth without asp.net identity\n- You want to use modern passkey features\n- You want to use attestation (Could combine this library with the asp.net identity version)\n\nI'm happy that Microsoft is finally joining the passkey train, but this library is probably still what you want to use unless you're running the vanilla asp.net Identity-stack. At least for the time beeing.\n\n## Installation\n\n**Requirements**: .NET 8.0 or later\n\n```bash\ndotnet add package Fido2\n```\n\nTo use the ASP.NET Core helpers:\n\n```bash\ndotnet add package Fido2.AspNet\n```\n\nFor Blazor WebAssembly support:\n\n```bash\ndotnet add package Fido2.BlazorWebAssembly\n```\n\n\u003e **⚠️ Breaking Changes**: If upgrading from v3.x, see the [Upgrade Guide](upgrade-guide.md) for migration instructions.\n\n### Demo\n\n- **Library website**: https://fido2.andersaberg.com\n- [Code examples](#examples)\n\n## What is FIDO2?\n\n**The passwordless web is here.**\n[FIDO2](https://fidoalliance.org/fido2/) / [WebAuthn](https://www.w3.org/TR/webauthn/) is a modern, stable and open authentication standard, supported by [browsers](https://www.w3.org/Consortium/Member/List) and [many large tech companies](https://fidoalliance.org/members/) such as Microsoft, Google etc. The main driver is to allow a user to login without passwords, creating _passwordless flows_ or strong MFA for user signup/login on websites. The standard is not limited to web applications with support coming to native apps. The technology builds on public/private keys, allowing authentication to happen without sharing a secret between the user \u0026 website. This brings many benefits, such as easier and safer logins and makes phishing attempts extremely hard.\n\nRead more:\n\n- [Why it's exciting](http://ideasof.andersaberg.com/development/the-passwordless-web)\n- [Medium](https://medium.com/tokenring/fido-2-0-what-is-it-and-why-are-we-excited-31a66df6e113)\n- [FIDO Alliance](https://fidoalliance.org/fido2/)\n- [Yubico](https://www.yubico.com/2018/08/10-things-youve-been-wondering-about-fido2-webauthn-and-a-passwordless-world/)\n- [WebAuthn.Guide](https://webauthn.guide/) from Duo Security\n- [WebAuthn.io](https://webauthn.io/)\n- [WebAuthn Awesome](https://github.com/herrjemand/WebauthnAwesome)\n\n## Supported features\n\n- ✅ Attestation API \u0026 verification (Register and verify credentials/authenticators)\n- ✅ Assertion API \u0026 verification (Authenticate users)\n- ✅ 100% pass rate in [conformance testing](#conformance-testing-tool) ([results](https://github.com/passwordless-lib/fido2-net-lib/issues/13#issuecomment-457318859))\n- ✅ FIDO2 security keys aka roaming authenticators ([spec](https://www.w3.org/TR/webauthn/#roaming-authenticators)), like SoloKeys [Solo](https://github.com/solokeys/solo/blob/master/README.md), Yubico [YubiKey](https://www.yubico.com/products/yubikey-hardware/), and Feitian [BioPass FIDO2](https://www.ftsafe.com/Products/FIDO2))\n- ✅ Device embedded authenticators aka platform authenticators ([spec](https://www.w3.org/TR/webauthn/#platform-authenticators)), like [Android Key](https://source.android.com/security/keystore/attestation) and [TPM](https://trustedcomputinggroup.org/resource/trusted-platform-module-2-0-a-brief-introduction/))\n- ✅ Backwards compatibility with FIDO U2F authenticators ([spec](https://www.w3.org/TR/#conforming-authenticators-u2f))\n- ✅ [Windows Hello](https://docs.microsoft.com/en-us/microsoft-edge/dev-guide/windows-integration/web-authentication)\n- ✅ [Face ID and Touch ID for the Web](https://webkit.org/blog/11312/meet-face-id-and-touch-id-for-the-web/) (aka \"Apple Hello\")\n- ✅ All currently referenced cryptographic algorithms for FIDO2 Server ([spec](https://fidoalliance.org/specs/fido-v2.0-rd-20180702/fido-server-v2.0-rd-20180702.html#other))\n- ✅ All current attestation formats: \"packed\", \"tpm\", \"android-key\", \"android-safetynet\", \"fido-u2f\", \"apple\", \"apple-appattest\", and \"none\" ([spec](https://www.iana.org/assignments/webauthn/webauthn.xhtml))\n- ✅ FIDO2 Server attestation validation via FIDO Metadata Service V3 ([spec](https://fidoalliance.org/specs/mds/fido-metadata-service-v3.0-ps-20210518.html))\n- ✅ WebAuthn extensions ([spec](https://www.w3.org/TR/webauthn/#extensions)) including PRF, Large Blob, Credential Protection\n- ✅ Blazor WebAssembly support for client-side applications\n- ✅ Examples \u0026 demos (ASP.NET Core and Blazor WebAssembly)\n- ✅ Intellisense documentation\n\n## Configuration\n\n_Only some options are mentioned here, see the [Configuration](https://github.com/passwordless-lib/fido2-net-lib/blob/master/Src/Fido2.Models/Fido2Configuration.cs) class for all options_\n\n- `fido2:MDSCacheDirPath` - App Secret / environment variable that sets the cache path for the MDS. Defaults to \"current user's temporary folder\"/fido2mdscache. _Optional when using the default [MetadataService provider](https://fidoalliance.org/mds/)._\n\n## Quick Start\n\n### 1. Configure Services (ASP.NET Core)\n\n```csharp\nservices.AddFido2(options =\u003e\n{\n    options.ServerDomain = \"example.com\";\n    options.ServerName = \"Example App\";\n    options.Origins = new HashSet\u003cstring\u003e { \"https://example.com\" };\n});\n```\n\n### 2. Inject IFido2 Service\n\n```csharp\npublic class AuthController : Controller\n{\n    private readonly IFido2 _fido2;\n\n    public AuthController(IFido2 fido2)\n    {\n        _fido2 = fido2;\n    }\n}\n```\n\n## Examples\n\n- **[ASP.NET Core Demo](Demo/)** - Complete implementation with registration and authentication\n- **[Demo Controller](Demo/DemoController.cs)** - Main demo API endpoints for registration and authentication\n- **[Blazor WebAssembly Demo](BlazorWasmDemo/)** - Client-side Blazor example\n- **[Conformance Test Controller](Demo/ConformanceTestController.cs)** - Conformance testing endpoints\n\nFor integration patterns, see:\n\n- [Active Directory Store information](https://github.com/passwordless-lib/fido2-net-lib/issues/68#issuecomment-451758622)\n- [Example credential store](https://github.com/passwordless-lib/fido2-net-lib/blob/ActiveDirectory/fido2-net-lib/ActiveDirectoryStore.cs)\n\n### Create Attestation Options\n\nTo add FIDO2 credentials to an existing user account, start by creating options for the client.\n\n```csharp\n// 1. Get user from DB by username (in our example, auto create missing users)\nvar user = DemoStorage.GetOrAddUser(username, () =\u003e new User\n{\n    DisplayName = \"Display \" + username,\n    Name = username,\n    Id = Encoding.UTF8.GetBytes(username) // byte representation of userID is required\n});\n\n// 2. Get user existing keys by username\nvar existingKeys = DemoStorage.GetCredentialsByUser(user)\n    .Select(c =\u003e c.Descriptor)\n    .ToList();\n\n// 3. Create options using new parameter wrapper\nvar options = _fido2.RequestNewCredential(new RequestNewCredentialParams\n{\n    User = user,\n    ExcludeCredentials = existingKeys,\n    AuthenticatorSelection = AuthenticatorSelection.Default,\n    AttestationPreference = AttestationConveyancePreference.Parse(attType),\n    Extensions = new AuthenticationExtensionsClientInputs\n    {\n        CredProps = true  // Enable credential properties extension\n    }\n});\n\n// 4. Temporarily store options, session/in-memory cache/redis/db\nHttpContext.Session.SetString(\"fido2.attestationOptions\", options.ToJson());\n\n// 5. Return options to client\nreturn Json(options);\n```\n\n### Register Credentials\n\nWhen the client returns a response, verify and register the credentials.\n\n```csharp\n// 1. Get the options we sent the client and remove from storage\nvar jsonOptions = HttpContext.Session.GetString(\"fido2.attestationOptions\");\nHttpContext.Session.Remove(\"fido2.attestationOptions\");\nvar options = CredentialCreateOptions.FromJson(jsonOptions);\n\n// 2. Create callback so that lib can verify credential id is unique to this user\nIsCredentialIdUniqueToUserAsyncDelegate callback = async (IsCredentialIdUniqueToUserParams args) =\u003e\n{\n    var users = await DemoStorage.GetUsersByCredentialIdAsync(args.CredentialId);\n    return users.Count == 0; // Return true if credential ID is unique\n};\n\n// 3. Verify and make the credentials using new parameter wrapper\nvar result = await _fido2.MakeNewCredentialAsync(new MakeNewCredentialParams\n{\n    AttestationResponse = attestationResponse,\n    OriginalOptions = options,\n    IsCredentialIdUniqueToUserCallback = callback\n});\n\n// 4. Store the credentials in database\nDemoStorage.AddCredentialToUser(options.User, new StoredCredential\n{\n    Descriptor = new PublicKeyCredentialDescriptor(result.Id),\n    PublicKey = result.PublicKey,\n    UserHandle = result.User.Id\n});\n\n// 5. Return success to client\nreturn Json(result);\n```\n\n### Create Assertion Options\n\nFor user authentication, create assertion options based on registered credentials.\n\n```csharp\n// 1. Get user from DB\nvar user = DemoStorage.GetUser(username);\nif (user == null) return NotFound(\"Username was not registered\");\n\n// 2. Get registered credentials from database\nvar existingCredentials = DemoStorage.GetCredentialsByUser(user)\n    .Select(c =\u003e c.Descriptor)\n    .ToList();\n\n// 3. Create options using new parameter wrapper\nvar options = _fido2.GetAssertionOptions(new GetAssertionOptionsParams\n{\n    AllowedCredentials = existingCredentials,\n    UserVerification = UserVerificationRequirement.Preferred,\n    Extensions = new AuthenticationExtensionsClientInputs\n    {\n        Extensions = true\n    }\n});\n\n// 4. Temporarily store options, session/in-memory cache/redis/db\nHttpContext.Session.SetString(\"fido2.assertionOptions\", options.ToJson());\n\n// 5. Return options to client\nreturn Json(options);\n```\n\n### Verify the Assertion Response\n\nWhen the client returns a response, verify it and accept the login.\n\n```csharp\n// 1. Get the assertion options we sent the client and remove from storage\nvar jsonOptions = HttpContext.Session.GetString(\"fido2.assertionOptions\");\nHttpContext.Session.Remove(\"fido2.assertionOptions\");\nvar options = AssertionOptions.FromJson(jsonOptions);\n\n// 2. Get registered credential from database\nvar creds = DemoStorage.GetCredentialById(clientResponse.Id);\n\n// 3. Create callback to check if userhandle owns the credentialId\nIsUserHandleOwnerOfCredentialIdAsync callback = async (args) =\u003e\n{\n    var storedCreds = await DemoStorage.GetCredentialsByUserHandleAsync(args.UserHandle);\n    return storedCreds.Exists(c =\u003e c.Descriptor.Id.SequenceEqual(args.CredentialId));\n};\n\n// 4. Make the assertion using new parameter wrapper\nvar result = await _fido2.MakeAssertionAsync(new MakeAssertionParams\n{\n    AssertionResponse = clientResponse,\n    OriginalOptions = options,\n    StoredPublicKey = creds.PublicKey,\n    StoredSignatureCounter = creds.SignatureCounter,\n    IsUserHandleOwnerOfCredentialIdCallback = callback\n});\n\n// 5. Store the updated counter\nDemoStorage.UpdateCounter(result.CredentialId, result.Counter);\n\n// 6. Return success to client\nreturn Json(result);\n```\n\n## Nuget package\n\nhttps://www.nuget.org/packages/Fido2/ and https://www.nuget.org/packages/Fido2.Models/\n\n# Contributing\n\nSee [Contributing](CONTRIBUTING.md) for information about contributing to the project.\n\nThis project has adopted the code of conduct defined by the Contributor Covenant to clarify expected behavior in our community.\nFor more information see the [.NET Foundation Code of Conduct](https://dotnetfoundation.org/code-of-conduct).\n\nFor security and penetration testing, please see our [Vulnerability Disclosure Program](./VDP.md)\n\n## Contributors\n\n### Code Contributors\n\nThis project exists thanks to all the people who contribute. [[Contribute](https://github.com/passwordless-lib/fido2-net-lib/tree/master#contributing)].\n\u003ca href=\"https://github.com/passwordless-lib/fido2-net-lib/graphs/contributors\"\u003e\u003cimg src=\"https://opencollective.com/passwordless/contributors.svg?width=890\u0026button=false\" /\u003e\u003c/a\u003e\n\n### Financial Contributors\n\nBecome a financial contributor and help us sustain our community. [[Contribute](https://opencollective.com/passwordless/contribute)]\n\n#### Individuals\n\n\u003ca href=\"https://opencollective.com/passwordless\"\u003e\u003cimg src=\"https://opencollective.com/passwordless/individuals.svg?width=890\"\u003e\u003c/a\u003e\n\n#### Organizations\n\nSupport this project with your organization. Your logo will show up here with a link to your website. [[Contribute](https://opencollective.com/passwordless/contribute)]\n\n\u003ca href=\"https://opencollective.com/passwordless/organization/0/website\"\u003e\u003cimg src=\"https://opencollective.com/passwordless/organization/0/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/passwordless/organization/1/website\"\u003e\u003cimg src=\"https://opencollective.com/passwordless/organization/1/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/passwordless/organization/2/website\"\u003e\u003cimg src=\"https://opencollective.com/passwordless/organization/2/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/passwordless/organization/3/website\"\u003e\u003cimg src=\"https://opencollective.com/passwordless/organization/3/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/passwordless/organization/4/website\"\u003e\u003cimg src=\"https://opencollective.com/passwordless/organization/4/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/passwordless/organization/5/website\"\u003e\u003cimg src=\"https://opencollective.com/passwordless/organization/5/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/passwordless/organization/6/website\"\u003e\u003cimg src=\"https://opencollective.com/passwordless/organization/6/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/passwordless/organization/7/website\"\u003e\u003cimg src=\"https://opencollective.com/passwordless/organization/7/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/passwordless/organization/8/website\"\u003e\u003cimg src=\"https://opencollective.com/passwordless/organization/8/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/passwordless/organization/9/website\"\u003e\u003cimg src=\"https://opencollective.com/passwordless/organization/9/avatar.svg\"\u003e\u003c/a\u003e\n\n### .NET Foundation\n\nThis project is supported by the [.NET Foundation](https://dotnetfoundation.org).\n","funding_links":["https://opencollective.com/passwordless","https://github.com/sponsors/passwordless-lib","https://opencollective.com/passwordless/contribute","https://opencollective.com/passwordless/organization/0/website","https://opencollective.com/passwordless/organization/1/website","https://opencollective.com/passwordless/organization/2/website","https://opencollective.com/passwordless/organization/3/website","https://opencollective.com/passwordless/organization/4/website","https://opencollective.com/passwordless/organization/5/website","https://opencollective.com/passwordless/organization/6/website","https://opencollective.com/passwordless/organization/7/website","https://opencollective.com/passwordless/organization/8/website","https://opencollective.com/passwordless/organization/9/website"],"categories":["C#","C\\#","Demo"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpasswordless-lib%2Ffido2-net-lib","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpasswordless-lib%2Ffido2-net-lib","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpasswordless-lib%2Ffido2-net-lib/lists"}