Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Base64Url Id instead of byte[] #586

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion BlazorWasmDemo/Server/Controllers/UserController.cs
Original file line number Diff line number Diff line change
@@ -265,7 +265,7 @@ public async Task<string> MakeAssertionAsync([FromBody] AuthenticatorAssertionRa
_pendingAssertions.Remove(key);

// 2. Get registered credential from database
var creds = _demoStorage.GetCredentialById(clientResponse.Id) ?? throw new Exception("Unknown credentials");
var creds = _demoStorage.GetCredentialById(clientResponse.RawId) ?? throw new Exception("Unknown credentials");

// 3. Make the assertion
var res = await _fido2.MakeAssertionAsync(new MakeAssertionParams
2 changes: 1 addition & 1 deletion Demo/Controller.cs
Original file line number Diff line number Diff line change
@@ -194,7 +194,7 @@ public async Task<JsonResult> MakeAssertion([FromBody] AuthenticatorAssertionRaw
var options = AssertionOptions.FromJson(jsonOptions);

// 2. Get registered credential from database
var creds = DemoStorage.GetCredentialById(clientResponse.Id) ?? throw new Exception("Unknown credentials");
var creds = DemoStorage.GetCredentialById(clientResponse.RawId) ?? throw new Exception("Unknown credentials");

// 3. Get credential counter from database
var storedCounter = creds.SignCount;
2 changes: 1 addition & 1 deletion Demo/TestController.cs
Original file line number Diff line number Diff line change
@@ -181,7 +181,7 @@ public async Task<JsonResult> MakeAssertionTestAsync([FromBody] AuthenticatorAss
var options = AssertionOptions.FromJson(jsonOptions);

// 2. Get registered credential from database
var creds = _demoStorage.GetCredentialById(clientResponse.Id);
var creds = _demoStorage.GetCredentialById(clientResponse.RawId);

// 3. Get credential counter from database
var storedCounter = creds.SignCount;
6 changes: 4 additions & 2 deletions Src/Fido2.Models/AuthenticatorAssertionRawResponse.cs
Original file line number Diff line number Diff line change
@@ -12,9 +12,11 @@ namespace Fido2NetLib;
/// </summary>
public class AuthenticatorAssertionRawResponse
{
[JsonConverter(typeof(Base64UrlConverter))]
/// <summary>
/// A string containing the credential's identifier. Base64UrlEncoding of <seealso cref="RawId"/>.
/// </summary>
[JsonPropertyName("id"), Required]
public byte[] Id { get; init; }
public string Id { get; init; }

// might be wrong to base64url encode this...
[JsonConverter(typeof(Base64UrlConverter))]
6 changes: 4 additions & 2 deletions Src/Fido2.Models/AuthenticatorAttestationRawResponse.cs
Original file line number Diff line number Diff line change
@@ -9,9 +9,11 @@ namespace Fido2NetLib;

public sealed class AuthenticatorAttestationRawResponse
{
[JsonConverter(typeof(Base64UrlConverter))]
/// <summary>
/// A string containing the credential's identifier. Base64UrlEncoding of <seealso cref="RawId"/>.
/// </summary>
[JsonPropertyName("id"), Required]
public byte[] Id { get; init; }
public string Id { get; init; }

[JsonConverter(typeof(Base64UrlConverter))]
[JsonPropertyName("rawId"), Required]
6 changes: 3 additions & 3 deletions Src/Fido2/AuthenticatorAssertionResponse.cs
Original file line number Diff line number Diff line change
@@ -77,7 +77,7 @@ public async Task<VerifyAssertionResult> VerifyAsync(
if (options.AllowCredentials != null && options.AllowCredentials.Any())
{
// might need to transform x.Id and raw.id as described in https://www.w3.org/TR/webauthn/#publickeycredential
if (!options.AllowCredentials.Any(x => x.Id.SequenceEqual(Raw.Id)))
if (!options.AllowCredentials.Any(x => x.Id.SequenceEqual(Raw.RawId)))
throw new Fido2VerificationException(Fido2ErrorCode.InvalidAssertionResponse, Fido2ErrorMessages.CredentialIdNotInAllowedCredentials);
}

@@ -87,7 +87,7 @@ public async Task<VerifyAssertionResult> VerifyAsync(
if (UserHandle.Length is 0)
throw new Fido2VerificationException(Fido2ErrorMessages.UserHandleIsEmpty);

if (await isUserHandleOwnerOfCredId(new IsUserHandleOwnerOfCredentialIdParams(Raw.Id, UserHandle), cancellationToken) is false)
if (await isUserHandleOwnerOfCredId(new IsUserHandleOwnerOfCredentialIdParams(Raw.RawId, UserHandle), cancellationToken) is false)
{
throw new Fido2VerificationException(Fido2ErrorCode.InvalidAssertionResponse, Fido2ErrorMessages.UserHandleNotOwnerOfPublicKey);
}
@@ -177,7 +177,7 @@ public async Task<VerifyAssertionResult> VerifyAsync(

return new VerifyAssertionResult
{
CredentialId = Raw.Id,
CredentialId = Raw.RawId,
SignCount = authData.SignCount,
IsBackedUp = authData.IsBackedUp

2 changes: 1 addition & 1 deletion Tests/Fido2.Tests/Attestation/Apple.cs
Original file line number Diff line number Diff line change
@@ -224,7 +224,7 @@ public async Task TestApplePublicKeyMismatch()
var attestationResponse = new AuthenticatorAttestationRawResponse
{
Type = PublicKeyCredentialType.PublicKey,
Id = [0xf1, 0xd0],
Id = "8dA",
RawId = [0xf1, 0xd0],
Response = new AuthenticatorAttestationRawResponse.AttestationResponse
{
Loading