Skip to content

Commit 7aebefd

Browse files
committed
Fix EnableRelaxedDecoding implementation and add test coverage
1 parent e11a2fd commit 7aebefd

File tree

2 files changed

+55
-3
lines changed

2 files changed

+55
-3
lines changed

Src/Fido2.Models/Converters/Base64UrlConverter.cs

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,29 @@ public override byte[] Read(ref Utf8JsonReader reader, Type typeToConvert, JsonS
3737
{
3838
return Base64Url.DecodeFromUtf8(source);
3939
}
40-
catch
40+
catch (Exception ex)
4141
{
4242
if (Base64.IsValid(source))
4343
{
44+
static byte[] DecodeBase64FromUtf8(scoped ReadOnlySpan<byte> source)
45+
{
46+
var rentedBuffer = ArrayPool<byte>.Shared.Rent(Base64.GetMaxDecodedFromUtf8Length(source.Length));
47+
48+
try
49+
{
50+
_ = Base64.DecodeFromUtf8(source, rentedBuffer, out _, out int written);
51+
52+
return rentedBuffer[0..written];
53+
}
54+
finally
55+
{
56+
ArrayPool<byte>.Shared.Return(rentedBuffer);
57+
}
58+
}
59+
4460
if (EnableRelaxedDecoding)
4561
{
46-
return Base64Url.DecodeFromUtf8(source);
62+
return DecodeBase64FromUtf8(source);
4763
}
4864
else
4965
{
@@ -52,7 +68,7 @@ public override byte[] Read(ref Utf8JsonReader reader, Type typeToConvert, JsonS
5268
}
5369
else
5470
{
55-
throw new JsonException("Invalid Base64Url data");
71+
throw new JsonException(ex.Message, ex);
5672
}
5773
}
5874
finally

Tests/Fido2.Tests/Fido2UserTests.cs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
using System.Text.Json;
2+
3+
namespace Fido2NetLib.Tests;
4+
5+
public class Base64UrlConverterTests
6+
{
7+
[Fact]
8+
public void RelaxedDecodingWorks()
9+
{
10+
string jsonText =
11+
"""
12+
{
13+
"name": "anders",
14+
"id": "7w80qsdaWWm5R+KK2O64MO/WSitunFbxH1H8mE9IVORxzbXdxXDY1VRQlayoK/Lmh3MI/p0M59Rh98D8r4EoJw==",
15+
"displayName": "anders"
16+
}
17+
""";
18+
19+
Base64UrlConverter.EnableRelaxedDecoding = false;
20+
21+
try
22+
{
23+
_ = JsonSerializer.Deserialize<Fido2User>(jsonText);
24+
}
25+
catch (JsonException ex)
26+
{
27+
Assert.Equal("Expected data to be in Base64Url format, but received Base64 encoding instead.", ex.Message);
28+
}
29+
30+
Base64UrlConverter.EnableRelaxedDecoding = true;
31+
32+
var user = JsonSerializer.Deserialize<Fido2User>(jsonText);
33+
34+
Assert.Equal("7w80qsdaWWm5R+KK2O64MO/WSitunFbxH1H8mE9IVORxzbXdxXDY1VRQlayoK/Lmh3MI/p0M59Rh98D8r4EoJw==", Convert.ToBase64String(user.Id));
35+
}
36+
}

0 commit comments

Comments
 (0)