using System.Buffers.Text; using System.Security.Cryptography; using IdentityShroud.Core.Messages; namespace IdentityShroud.Core.Security.Keys.Rsa; public class RsaProvider : IKeyProvider { public bool IsPublic => true; public KeyData CreateKey(KeyPolicy policy) { if (policy is RsaKeyPolicy p) { using var rsa = RSA.Create(p.KeySize); var publicParamaters = rsa.ExportParameters(includePrivateParameters: false); return new KeyData( rsa.ExportPkcs8PrivateKey(), new() { ["e"] = Base64Url.EncodeToString(publicParamaters.Exponent), ["n"] = Base64Url.EncodeToString(publicParamaters.Modulus), }); } throw new ArgumentException("Incorrect policy type", nameof(policy)); } public void SetJwkParameters(Dictionary parameters, JsonWebKey jwk) { jwk.Exponent = parameters["e"]; jwk.Modulus = parameters["n"]; } }