Skip to content

Commit

Permalink
Initial update to Microsoft.IdentityModel v7
Browse files Browse the repository at this point in the history
  • Loading branch information
scottbrady91 committed Mar 31, 2024
1 parent 664bc73 commit 514de35
Show file tree
Hide file tree
Showing 6 changed files with 34 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.28" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="8.0.3" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="8.0.3" />
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="8.0.3" />
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="8.0.3" />
Expand Down
6 changes: 3 additions & 3 deletions src/ScottBrady.IdentityModel/ScottBrady.IdentityModel.csproj
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFrameworks>net6.0;net8.0</TargetFrameworks>
<TargetFramework>net8.0</TargetFramework>
<Authors>Scott Brady</Authors>
<Description>Extensions for Microsoft.IdentityModel, including support for EdDSA signed JWTs.</Description>
<PackageIcon>icon.png</PackageIcon>
Expand All @@ -18,8 +18,8 @@

<ItemGroup>
<PackageReference Include="BouncyCastle.Cryptography" Version="2.3.0" />
<PackageReference Include="Microsoft.IdentityModel.Tokens" Version="6.*" />
<PackageReference Include="Microsoft.IdentityModel.JsonWebTokens" Version="6.*" />
<PackageReference Include="Microsoft.IdentityModel.Tokens" Version="7.5.0" />
<PackageReference Include="Microsoft.IdentityModel.JsonWebTokens" Version="7.5.0" />
<PackageReference Include="SecurityCodeScan.VS2019" Version="5.6.7" PrivateAssets="all" />
</ItemGroup>

Expand Down
17 changes: 17 additions & 0 deletions src/ScottBrady.IdentityModel/Tokens/EdDsaSignatureProvider.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
using System;
using Microsoft.IdentityModel.Tokens;

namespace ScottBrady.IdentityModel.Tokens;
Expand All @@ -14,6 +15,22 @@ public EdDsaSignatureProvider(EdDsaSecurityKey key, string algorithm)

protected override void Dispose(bool disposing) { }
public override byte[] Sign(byte[] input) => edDsaKey.EdDsa.Sign(input);

public override bool Sign(ReadOnlySpan<byte> data, Span<byte> destination, out int bytesWritten)
{
var signature = edDsaKey.EdDsa.Sign(data.ToArray());
signature.CopyTo(destination);
bytesWritten = signature.Length;
return true;
}

public override byte[] Sign(byte[] input, int offset, int count)
{
var data = new byte[count];
Buffer.BlockCopy(input, offset, data, 0, count);
return edDsaKey.EdDsa.Sign(data);
}

public override bool Verify(byte[] input, byte[] signature) => edDsaKey.EdDsa.Verify(input, signature);
public override bool Verify(byte[] input, int inputOffset, int inputLength, byte[] signature, int signatureOffset, int signatureLength)
=> edDsaKey.EdDsa.Verify(input, inputOffset, inputLength, signature, signatureOffset, signatureLength);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFrameworks>net6.0;net8.0</TargetFrameworks>
<TargetFramework>net8.0</TargetFramework>
<LangVersion>latest</LangVersion>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="AutoFixture" Version="4.18.1" />
<PackageReference Include="FluentAssertions" Version="6.12.0" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.28" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="8.0.3" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.9.0" />
<PackageReference Include="Moq" Version="4.20.70" />
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="6.35.0" />
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="7.5.0" />
<PackageReference Include="xunit" Version="2.7.0" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.7">
<PrivateAssets>all</PrivateAssets>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,6 @@ public void ImportFromEncryptedPem_WithPasswordBytes_ExpectNotImplementedExcepti
public void ImportFromPem_WithPasswordBytes_ExpectNotImplementedException(EdDsa key, int _)
=> Assert.Throws<NotImplementedException>(() => key.ImportFromPem(Array.Empty<char>()));

#if NET8
[Theory, MemberData(nameof(Keys))]
public void ExportPkcs8PrivateKeyPem_ExpectNotImplementedException(EdDsa key, int _)
=> Assert.Throws<NotImplementedException>(() => key.ExportPkcs8PrivateKeyPem());
Expand All @@ -128,7 +127,7 @@ public void ExportEncryptedPkcs8PrivateKeyPem_WithPasswordBytes_ExpectNotImpleme

[Theory, MemberData(nameof(Keys))]
public void ExportSubjectPublicKeyInfoPem_ExpectNotImplementedException(EdDsa key, int _)
=> Assert.Throws<NotImplementedException>(() => key.ExportSubjectPublicKeyInfoPem();
=> Assert.Throws<NotImplementedException>(key.ExportSubjectPublicKeyInfoPem);

[Theory, MemberData(nameof(Keys))]
public void TryExportSubjectPublicKeyInfoPem_ExpectNotImplementedException(EdDsa key, int _)
Expand All @@ -140,12 +139,11 @@ public void TryExportPkcs8PrivateKeyPem_ExpectNotImplementedException(EdDsa key,

[Theory, MemberData(nameof(Keys))]
public void TryExportEncryptedPkcs8PrivateKeyPem_WithPasswordString_ExpectNotImplementedException(EdDsa key, int _)
=> Assert.Throws<NotImplementedException>(() => key.TryExportEncryptedPkcs8PrivateKeyPem(Array.Empty<char>(), _fixture.Create<PbeParameters>()), Array.Empty<char>(), out var _));
=> Assert.Throws<NotImplementedException>(() => key.TryExportEncryptedPkcs8PrivateKeyPem(Array.Empty<char>(), _fixture.Create<PbeParameters>(), Array.Empty<char>(), out var _));

[Theory, MemberData(nameof(Keys))]
public void TryExportEncryptedPkcs8PrivateKeyPem_WithPasswordBytes_ExpectNotImplementedException(EdDsa key, int _)
=> Assert.Throws<NotImplementedException>(() => key.TryExportEncryptedPkcs8PrivateKeyPem(Array.Empty<byte>(), _fixture.Create<PbeParameters>()), Array.Empty<char>(), out var _));
#endif
=> Assert.Throws<NotImplementedException>(() => key.TryExportEncryptedPkcs8PrivateKeyPem(Array.Empty<byte>(), _fixture.Create<PbeParameters>(), Array.Empty<char>(), out var _));

[Theory, MemberData(nameof(Keys))]
public void Clear_WhenDisposed_ExpectNoException(EdDsa key, int _)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using FluentAssertions;
using Microsoft.IdentityModel.JsonWebTokens;
using Microsoft.IdentityModel.Tokens;
Expand Down Expand Up @@ -32,7 +33,7 @@ public class JsonWebTokenHandlerTests
};

[Fact]
public void WhenEd25519TokenGenerated_ExpectEdDsaTokenVerifiable()
public async Task WhenEd25519TokenGenerated_ExpectEdDsaTokenVerifiable()
{
var key = EdDsa.Create(ExtendedSecurityAlgorithms.Curves.Ed25519);

Expand All @@ -42,14 +43,14 @@ public void WhenEd25519TokenGenerated_ExpectEdDsaTokenVerifiable()

var jwt = handler.CreateToken(securityTokenDescriptor);

var validationResult = handler.ValidateToken(jwt, tokenValidationParameters);
var validationResult = await handler.ValidateTokenAsync(jwt, tokenValidationParameters);

validationResult.IsValid.Should().BeTrue();
validationResult.ClaimsIdentity.Claims.Should().Contain(x => x.Type == "sub" && x.Value == Subject);
}

[Fact]
public void WhenEd448TokenGenerated_ExpectEdDsaTokenVerifiable()
public async Task WhenEd448TokenGenerated_ExpectEdDsaTokenVerifiable()
{
var key = EdDsa.Create(ExtendedSecurityAlgorithms.Curves.Ed448);

Expand All @@ -59,14 +60,14 @@ public void WhenEd448TokenGenerated_ExpectEdDsaTokenVerifiable()

var jwt = handler.CreateToken(securityTokenDescriptor);

var validationResult = handler.ValidateToken(jwt, tokenValidationParameters);
var validationResult = await handler.ValidateTokenAsync(jwt, tokenValidationParameters);

validationResult.IsValid.Should().BeTrue();
validationResult.ClaimsIdentity.Claims.Should().Contain(x => x.Type == "sub" && x.Value == Subject);
}

[Fact]
public void WhenEd25519SignatureValidatedUsingEs448_ExpectInvalidToken()
public async Task WhenEd25519SignatureValidatedUsingEs448_ExpectInvalidToken()
{
var signingKey = EdDsa.Create(ExtendedSecurityAlgorithms.Curves.Ed25519);
var validationKey = EdDsa.Create(ExtendedSecurityAlgorithms.Curves.Ed448);
Expand All @@ -77,7 +78,7 @@ public void WhenEd25519SignatureValidatedUsingEs448_ExpectInvalidToken()

var jwt = handler.CreateToken(securityTokenDescriptor);

var validationResult = handler.ValidateToken(jwt, tokenValidationParameters);
var validationResult = await handler.ValidateTokenAsync(jwt, tokenValidationParameters);

validationResult.IsValid.Should().BeFalse();
}
Expand Down

0 comments on commit 514de35

Please sign in to comment.