using System.Buffers.Text; using System.Security.Cryptography; using IdentityShroud.Core.Contracts; using IdentityShroud.Core.Messages; using IdentityShroud.Core.Model; namespace IdentityShroud.Core.Security.Keys.Rsa; public class RsaKeyPolicy : KeyPolicy { public override string KeyType => "RSA"; public int KeySize { get; } = 2048; } public class RsaProvider : IKeyProvider { public byte[] CreateKey(KeyPolicy policy) { if (policy is RsaKeyPolicy p) { using var rsa = RSA.Create(p.KeySize); return rsa.ExportPkcs8PrivateKey(); } throw new ArgumentException("Incorrect policy type", nameof(policy)); } public void SetJwkParameters(byte[] key, JsonWebKey jwk) { using var rsa = RSA.Create(); rsa.ImportPkcs8PrivateKey(key, out _); var parameters = rsa.ExportParameters(includePrivateParameters: false); jwk.Exponent = Base64Url.EncodeToString(parameters.Exponent); jwk.Modulus = Base64Url.EncodeToString(parameters.Modulus); } }