Skip to content

Commit a8d9d5f

Browse files
authored
Use JSON source generator & enable trimming (#304)
* Use JSON source generator and enable trimming on Fido2.Models * [Ctap2] Enable trimming * Rename FidoModelSerializer -> FidoModelSerializerContext * Use JSON source generator & enable trimming on main project
1 parent f539c2f commit a8d9d5f

14 files changed

+75
-16
lines changed

Src/Fido2.Ctap2/Fido2.Ctap2.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
<TargetFramework>net6.0</TargetFramework>
55
<ImplicitUsings>enable</ImplicitUsings>
66
<Nullable>enable</Nullable>
7+
<IsTrimmable>true</IsTrimmable>
78
</PropertyGroup>
89

910
<ItemGroup>

Src/Fido2.Models/AssertionOptions.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.Text.Json.Serialization;
55

66
using Fido2NetLib.Objects;
7+
using Fido2NetLib.Serialization;
78

89
namespace Fido2NetLib
910
{
@@ -67,12 +68,12 @@ public static AssertionOptions Create(Fido2Configuration config, byte[] challeng
6768

6869
public string ToJson()
6970
{
70-
return JsonSerializer.Serialize(this);
71+
return JsonSerializer.Serialize(this, FidoModelSerializerContext.Default.AssertionOptions);
7172
}
7273

7374
public static AssertionOptions FromJson(string json)
7475
{
75-
return JsonSerializer.Deserialize<AssertionOptions>(json);
76+
return JsonSerializer.Deserialize(json, FidoModelSerializerContext.Default.AssertionOptions);
7677
}
7778
}
7879
}

Src/Fido2.Models/CredentialCreateOptions.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
using System.Text.Json.Serialization;
44

55
using Fido2NetLib.Objects;
6-
6+
using Fido2NetLib.Serialization;
7+
78
namespace Fido2NetLib
89
{
910
public sealed class CredentialCreateOptions : Fido2ResponseBase
@@ -101,12 +102,12 @@ public static CredentialCreateOptions Create(Fido2Configuration config, byte[] c
101102

102103
public string ToJson()
103104
{
104-
return JsonSerializer.Serialize(this);
105+
return JsonSerializer.Serialize(this, FidoModelSerializerContext.Default.CredentialCreateOptions);
105106
}
106107

107108
public static CredentialCreateOptions FromJson(string json)
108109
{
109-
return JsonSerializer.Deserialize<CredentialCreateOptions>(json);
110+
return JsonSerializer.Deserialize(json, FidoModelSerializerContext.Default.CredentialCreateOptions);
110111
}
111112
}
112113

Src/Fido2.Models/Fido2.Models.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
<TargetFrameworks>$(SupportedTargetFrameworks)</TargetFrameworks>
44
<GenerateDocumentationFile>true</GenerateDocumentationFile>
55
<RootNamespace>Fido2NetLib</RootNamespace>
6+
<IsTrimmable>true</IsTrimmable>
67
<NoWarn>$(NoWarn);CS1591</NoWarn>
78
</PropertyGroup>
89

Src/Fido2.Models/Objects/PublicKeyCredentialUserEntity.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ namespace Fido2NetLib.Objects
55
public sealed class PublicKeyCredentialUserEntity
66
{
77
[MaxLength(64)]
8+
#pragma warning disable IL2026 // Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code
89
public byte[] Id { get; set; }
10+
#pragma warning restore IL2026 // Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code
911

1012
public string Name { get; set; }
1113

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using System.Text.Json.Serialization;
2+
3+
namespace Fido2NetLib.Serialization;
4+
5+
[JsonSerializable(typeof(AssertionOptions))]
6+
[JsonSerializable(typeof(AuthenticatorAssertionRawResponse))]
7+
[JsonSerializable(typeof(MetadataBLOBPayload))]
8+
[JsonSerializable(typeof(CredentialCreateOptions))]
9+
[JsonSerializable(typeof(MetadataStatement))]
10+
public partial class FidoModelSerializerContext : JsonSerializerContext
11+
{
12+
}

Src/Fido2/AuthenticatorResponse.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
using System.Text.Json;
55
using System.Text.Json.Serialization;
66

7+
using Fido2NetLib.Serialization;
8+
79
namespace Fido2NetLib
810
{
911
/// <summary>
@@ -24,7 +26,7 @@ protected AuthenticatorResponse(ReadOnlySpan<byte> utf8EncodedJson)
2426
AuthenticatorResponse response;
2527
try
2628
{
27-
response = JsonSerializer.Deserialize<AuthenticatorResponse>(utf8EncodedJson)!;
29+
response = JsonSerializer.Deserialize(utf8EncodedJson, FidoSerializerContext.Default.AuthenticatorResponse)!;
2830
}
2931
catch (Exception e) when (e is JsonException)
3032
{

Src/Fido2/Fido2.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
<TargetFrameworks>$(SupportedTargetFrameworks)</TargetFrameworks>
44
<Nullable>enable</Nullable>
55
<RootNamespace>Fido2NetLib</RootNamespace>
6+
<IsTrimmable>true</IsTrimmable>
67
</PropertyGroup>
78

89
<ItemGroup>

Src/Fido2/Internal/GetBLOBRequest.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
using System.Text.Json.Serialization;
2+
3+
namespace Fido2NetLib.Internal;
4+
5+
public readonly struct GetBLOBRequest
6+
{
7+
[JsonConstructor]
8+
public GetBLOBRequest(string endpoint)
9+
{
10+
Endpoint = endpoint;
11+
}
12+
13+
[JsonPropertyName("endpoint")]
14+
public string Endpoint { get; }
15+
}

Src/Fido2/Metadata/ConformanceMetadataRepository.cs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,18 @@
33
using System.IdentityModel.Tokens.Jwt;
44
using System.Linq;
55
using System.Net.Http;
6+
using System.Net.Http.Json;
67
using System.Security.Cryptography;
78
using System.Security.Cryptography.X509Certificates;
89
using System.Text;
910
using System.Text.Json;
11+
using System.Text.Json.Serialization;
1012
using System.Threading;
1113
using System.Threading.Tasks;
14+
15+
using Fido2NetLib.Internal;
16+
using Fido2NetLib.Serialization;
17+
1218
using Microsoft.IdentityModel.Tokens;
1319

1420
namespace Fido2NetLib
@@ -48,15 +54,16 @@ public ConformanceMetadataRepository(HttpClient? client, string origin)
4854

4955
public async Task<MetadataBLOBPayload> GetBLOBAsync(CancellationToken cancellationToken = default)
5056
{
51-
var req = new
57+
var req = new GetBLOBRequest(_origin);
58+
59+
var content = new ByteArrayContent(JsonSerializer.SerializeToUtf8Bytes(req, FidoSerializerContext.Default.GetBLOBRequest))
5260
{
53-
endpoint = _origin
61+
Headers = { { "Content-Type", "application/json" } }
5462
};
5563

56-
var content = new StringContent(JsonSerializer.Serialize(req), Encoding.UTF8, "application/json");
5764
using var response = await _httpClient.PostAsync(_getEndpointsUrl, content, cancellationToken);
5865
await using var responseStream = await response.Content.ReadAsStreamAsync(cancellationToken);
59-
var result = await JsonSerializer.DeserializeAsync<MDSGetEndpointResponse>(responseStream, cancellationToken: cancellationToken);
66+
MDSGetEndpointResponse? result = await JsonSerializer.DeserializeAsync(responseStream, FidoSerializerContext.Default.MDSGetEndpointResponse, cancellationToken: cancellationToken);
6067
var conformanceEndpoints = result!.Result;
6168

6269
var combinedBlob = new MetadataBLOBPayload
@@ -231,7 +238,7 @@ public async Task<MetadataBLOBPayload> DeserializeAndValidateBlob(string rawBLOB
231238

232239
var blobPayload = ((JwtSecurityToken)validatedToken).Payload.SerializeToJson();
233240

234-
var blob = JsonSerializer.Deserialize<MetadataBLOBPayload>(blobPayload)!;
241+
MetadataBLOBPayload blob = JsonSerializer.Deserialize(blobPayload, FidoModelSerializerContext.Default.MetadataBLOBPayload)!;
235242
blob.JwtAlg = blobAlg;
236243
return blob;
237244
}

0 commit comments

Comments
 (0)