Skip to content

Commit

Permalink
Rework the JwtWriter & JwtDescriptor for a easier building
Browse files Browse the repository at this point in the history
  • Loading branch information
ycrumeyrolle committed Nov 4, 2020
1 parent df8293d commit 79695d7
Show file tree
Hide file tree
Showing 42 changed files with 4,230 additions and 32 deletions.
103 changes: 96 additions & 7 deletions perf/Benchmarks/AesDecryptorBenchmark.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using BenchmarkDotNet.Attributes;
Expand All @@ -7,6 +8,99 @@

namespace JsonWebToken.Performance
{
[MemoryDiagnoser]
public class JwtWriterBenchmark
{
private static readonly SymmetricJwk _key = SymmetricJwk.GenerateKey(256);

[Benchmark(Baseline = true)]
public void Old_Encode()
{
var descriptor = new JwsDescriptor
{
SigningKey = _key,
Algorithm = SignatureAlgorithm.HmacSha256,
IssuedAt = new DateTime(2017, 7, 14, 4, 40, 0, DateTimeKind.Utc),
ExpirationTime = new DateTime(2033, 5, 18, 5, 33, 20, DateTimeKind.Utc),
Issuer = "https://idp.example.com/",
Audience = "636C69656E745F6964"
};

var bufferWriter = new PooledByteBufferWriter();
var context = new EncodingContext(bufferWriter, null, 0, false);
descriptor.Encode(context);
bufferWriter.Dispose();
}

[Benchmark(Baseline = false)]
public void New_Encode()
{
var descriptor = new JwsDescriptorX
{
SigningKey = _key,
Alg = SignatureAlgorithm.HmacSha256,
Payload = new JwtPayloadX
{
{ "iat", 1500000000L },
{ "exp", 2000000000L },
{ "iss", "https://idp.example.com/" },
{ "aud", "636C69656E745F6964" }
}
};

var bufferWriter = new PooledByteBufferWriter();
var context = new EncodingContext(bufferWriter, null, 0, false);
descriptor.Encode(context);
bufferWriter.Dispose();
}
}

[MemoryDiagnoser]
public class JwtWriterBenchmark2
{
private static readonly SymmetricJwk _key = SymmetricJwk.GenerateKey(256);
private static readonly JwsDescriptor _d1 = new JwsDescriptor
{
SigningKey = _key,
Algorithm = SignatureAlgorithm.HmacSha256,
IssuedAt = new DateTime(2017, 7, 14, 4, 40, 0, DateTimeKind.Utc),
ExpirationTime = new DateTime(2033, 5, 18, 5, 33, 20, DateTimeKind.Utc),
Issuer = "https://idp.example.com/",
Audience = "636C69656E745F6964"
};
private static readonly JwsDescriptorX _d2 = new JwsDescriptorX
{
SigningKey = _key,
Alg = SignatureAlgorithm.HmacSha256,
Payload = new JwtPayloadX
{
{ "iat", 1500000000L },
{ "exp", 2000000000L },
{ "iss", "https://idp.example.com/" },
{ "aud", "636C69656E745F6964" }
}
};


[Benchmark(Baseline = true)]
public void Old_Encode()
{
var bufferWriter = new PooledByteBufferWriter();
var context = new EncodingContext(bufferWriter, null, 0, false);
_d1.Encode(context);
bufferWriter.Dispose();
}

[Benchmark(Baseline = false)]
public void New_Encode()
{
var bufferWriter = new PooledByteBufferWriter();
var context = new EncodingContext(bufferWriter, null, 0, false);
_d2.Encode(context);
bufferWriter.Dispose();
}
}

[MemoryDiagnoser]
public class AesDecryptorBenchmark
{
Expand All @@ -31,12 +125,7 @@ static AesDecryptorBenchmark()
#endif
}

[Benchmark(Baseline = true)]
[ArgumentsSource(nameof(GetData))]
public bool Decrypt(Item data)
{
return _decryptor.TryDecrypt(key, data.Ciphertext, nonce, plaintext, out int bytesWritten);
}


public static IEnumerable<Item> GetData()
{
Expand Down
7 changes: 7 additions & 0 deletions perf/Benchmarks/WriteCompressedToken.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,13 @@ public override byte[] JsonWebToken(BenchmarkPayload payload)
return JwtCore(payload.JwtDescriptor);
}

[Benchmark(Baseline = false)]
[ArgumentsSource(nameof(GetPayloadValues))]
public override byte[] JsonWebTokenX(BenchmarkPayload payload)
{
return JwtCoreX(payload.JwtDescriptorX);
}

[Benchmark]
[ArgumentsSource(nameof(GetPayloadValues))]
public override string Wilson(BenchmarkPayload payload)
Expand Down
7 changes: 7 additions & 0 deletions perf/Benchmarks/WriteEncryptedToken.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,13 @@ public override byte[] JsonWebToken(BenchmarkPayload payload)
return JwtCore(payload.JwtDescriptor);
}

[Benchmark(Baseline = false)]
[ArgumentsSource(nameof(GetPayloadValues))]
public override byte[] JsonWebTokenX(BenchmarkPayload payload)
{
return JwtCoreX(payload.JwtDescriptorX);
}

[Benchmark]
[ArgumentsSource(nameof(GetPayloadValues))]
public override string Wilson(BenchmarkPayload payload)
Expand Down
1 change: 1 addition & 0 deletions perf/Benchmarks/WriteEncryptedTokenBenchmark.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ public class WriteEncryptedTokenBenchmark : WriteEncryptedToken
public override IEnumerable<string> GetPayloads()
{
yield return "JWE 6 claims";
yield return "JWE 16 claims";
}
}
}
6 changes: 6 additions & 0 deletions perf/Benchmarks/WriteSignedToken.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,12 @@ public override byte[] JsonWebToken(BenchmarkPayload payload)
{
return JwtCore(payload.JwtDescriptor);
}
[Benchmark(Baseline = false)]
[ArgumentsSource(nameof(GetPayloadValues))]
public override byte[] JsonWebTokenX(BenchmarkPayload payload)
{
return JwtCoreX(payload.JwtDescriptorX);
}

[Benchmark]
[ArgumentsSource(nameof(GetPayloadValues))]
Expand Down
1 change: 1 addition & 0 deletions perf/Benchmarks/WriteSignedTokenBenchmark.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ public class WriteSignedTokenBenchmark : WriteSignedToken
public override IEnumerable<string> GetPayloads()
{
yield return "JWS 6 claims";
yield return "JWS 16 claims";
}
}
}
109 changes: 109 additions & 0 deletions perf/Benchmarks/WriteToken.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ public abstract class WriteToken
public static readonly EncryptingCredentials encryptingCredentials = new EncryptingCredentials(new SymmetricSecurityKey(Tokens.EncryptionKey.ToArray()), "A128KW", "A128CBC-HS256");

public static readonly JwtWriter Writer = new JwtWriter() { EnableHeaderCaching = true };
public static readonly JwtWriterX WriterX = new JwtWriterX() { EnableHeaderCaching = true };


private static readonly FixedSizedBufferWriter _output = new FixedSizedBufferWriter(8192);
Expand All @@ -49,6 +50,15 @@ protected byte[] JwtCore(JwtDescriptor payload)
_output.Clear();
return _output.Buffer;
}

public abstract byte[] JsonWebTokenX(BenchmarkPayload payload);

protected byte[] JwtCoreX(JwtDescriptorX payload)
{
WriterX.WriteToken(payload, _output);
_output.Clear();
return _output.Buffer;
}

public abstract string Wilson(BenchmarkPayload payload);

Expand Down Expand Up @@ -154,13 +164,15 @@ public class BenchmarkPayload
private static readonly JsonWebKey WilsonSharedKey = JsonWebKey.Create(SigningKey.ToString());

private static readonly Dictionary<string, JwtDescriptor> JwtPayloads = CreateJwtDescriptors();
private static readonly Dictionary<string, JwtDescriptorX> JwtPayloadsX = CreateJwtDescriptorsX();
private static readonly Dictionary<string, Dictionary<string, object>> DictionaryPayloads = CreateDictionaryDescriptors();
private static readonly Dictionary<string, SecurityTokenDescriptor> WilsonPayloads = CreateWilsonDescriptors();

public BenchmarkPayload(string name)
{
Name = name ?? throw new ArgumentNullException(nameof(name));
JwtDescriptor = JwtPayloads[name];
JwtDescriptorX = JwtPayloadsX[name];
JoseDescriptor = DictionaryPayloads[name];
WilsonDescriptor = WilsonPayloads[name];
WilsonJwtDescriptor = Tokens.Payloads[name.Substring(name.LastIndexOf('6') - 1).Trim().Substring(0, 1)].ToString();
Expand All @@ -169,6 +181,7 @@ public BenchmarkPayload(string name)
public string Name { get; }

public JwtDescriptor JwtDescriptor { get; }
public JwtDescriptorX JwtDescriptorX { get; }

public Dictionary<string, object> JoseDescriptor { get; }

Expand Down Expand Up @@ -277,6 +290,102 @@ public override string ToString()

return descriptors;
}
private static Dictionary<string, JwtDescriptorX> CreateJwtDescriptorsX()
{
var descriptors = new Dictionary<string, JwtDescriptorX>();
foreach (var payload in Tokens.Payloads)
{
var descriptor = new JwsDescriptorX()
{
Alg = SignatureAlgorithm.None
};

foreach (var property in payload.Value.Properties())
{
switch (property.Name)
{
case "iat":
case "nbf":
case "exp":
descriptor.Payload.Add(property.Name, (long)property.Value);
break;
default:
descriptor.Payload.Add(property.Name, (string)property.Value);
break;
}
}

descriptors.Add("JWT " + (payload.Key == "0" ? "" : payload.Key) + "6 claims", descriptor);
}

foreach (var payload in Tokens.Payloads)
{
var descriptor = new JwsDescriptorX()
{
SigningKey = SigningKey
};

foreach (var property in payload.Value.Properties())
{
switch (property.Name)
{
case "iat":
case "nbf":
case "exp":
descriptor.Payload.Add(property.Name, (long)property.Value);
break;
default:
descriptor.Payload.Add(property.Name, (string)property.Value);
break;
}
}

descriptors.Add("JWS " + (payload.Key == "0" ? "" : payload.Key) + "6 claims", descriptor);
}

foreach (var payload in Tokens.Payloads)
{
var descriptor = new JwsDescriptorX()
{
SigningKey = SigningKey
};

foreach (var property in payload.Value.Properties())
{
switch (property.Name)
{
case "iat":
case "nbf":
case "exp":
descriptor.Payload.Add(property.Name, (long)property.Value);
break;
default:
descriptor.Payload.Add(property.Name, (string)property.Value);
break;
}
}

var jwe = new JweDescriptorX
{
Payload = descriptor,
EncryptionKey = EncryptionKey,
Enc = EncryptionAlgorithm.Aes128CbcHmacSha256
};

descriptors.Add("JWE " + (payload.Key == "0" ? "" : payload.Key) + "6 claims", jwe);

var jwc = new JweDescriptorX
{
Payload = descriptor,
EncryptionKey = EncryptionKey,
Enc = EncryptionAlgorithm.Aes128CbcHmacSha256,
Zip = CompressionAlgorithm.Deflate
};
descriptors.Add("JWE DEF " + (payload.Key == "0" ? "" : payload.Key) + "6 claims", jwc);
}

return descriptors;
}

private static Dictionary<string, SecurityTokenDescriptor> CreateWilsonDescriptors()
{
Expand Down
8 changes: 7 additions & 1 deletion perf/Benchmarks/WriteUnsignedToken.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,12 @@ public override byte[] JsonWebToken(BenchmarkPayload payload)
{
return JwtCore(payload.JwtDescriptor);
}
[Benchmark(Baseline = false)]
[ArgumentsSource(nameof(GetPayloadValues))]
public override byte[] JsonWebTokenX(BenchmarkPayload payload)
{
return JwtCoreX(payload.JwtDescriptorX);
}

[Benchmark]
[ArgumentsSource(nameof(GetPayloadValues))]
Expand All @@ -46,7 +52,7 @@ public override string jose_jwt(BenchmarkPayload payload)

public override string Jwt_Net(BenchmarkPayload payload)
{
throw new NotImplementedException();
return string.Empty;
}

public override IEnumerable<string> GetPayloads()
Expand Down
1 change: 1 addition & 0 deletions perf/Benchmarks/WriteUnsignedTokenBenchmark.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ public class WriteUnsignedTokenBenchmark : WriteUnsignedToken
public override IEnumerable<string> GetPayloads()
{
yield return "JWT 6 claims";
yield return "JWT 16 claims";
}
}
}

0 comments on commit 79695d7

Please sign in to comment.