IdentityShroud/IdentityShroud.Api/Apis/Mappers/KeyMapper.cs

52 lines
1.5 KiB
C#
Raw Normal View History

using System.Security.Cryptography;
using IdentityShroud.Core.Contracts;
using IdentityShroud.Core.Messages;
using IdentityShroud.Core.Model;
using IdentityShroud.Core.Security;
using Microsoft.AspNetCore.WebUtilities;
namespace IdentityShroud.Api.Mappers;
public class KeyMapper(IEncryptionService encryptionService)
{
2026-02-20 17:35:38 +01:00
public JsonWebKey? KeyToJsonWebKey(RealmKey realmKey)
{
2026-02-20 17:35:38 +01:00
JsonWebKey result = new()
{
2026-02-20 17:35:38 +01:00
KeyId = realmKey.Id.ToString(),
Use = "sig",
};
2026-02-20 17:35:38 +01:00
switch (realmKey.KeyType)
{
case "RSA":
using (var rsa = RsaHelper.LoadFromPkcs8(realmKey.GetPrivateKey(encryptionService)))
{
RSAParameters parameters = rsa.ExportParameters(includePrivateParameters: false);
result.KeyType = rsa.SignatureAlgorithm;
result.Exponent = WebEncoders.Base64UrlEncode(parameters.Exponent!);
result.Modulus = WebEncoders.Base64UrlEncode(parameters.Modulus!);
}
break;
default:
return null;
}
return result;
}
2026-02-20 17:35:38 +01:00
public JsonWebKeySet KeyListToJsonWebKeySet(IEnumerable<RealmKey> keys)
{
2026-02-20 17:35:38 +01:00
JsonWebKeySet wks = new();
foreach (var k in keys)
{
2026-02-20 17:35:38 +01:00
var wk = KeyToJsonWebKey(k);
if (wk is {})
{
wks.Keys.Add(wk);
}
}
return wks;
}
}