/// <summary>
 /// Convert to service model
 /// </summary>
 /// <param name="request"></param>
 /// <returns></returns>
 public static CertificationRequest ToCertificationRequest(
     this CertificateRequest request)
 {
     return(new CertificationRequest {
         Subject = request.SubjectName,
         Extensions = request.CertificateExtensions.ToList(),
         PublicKey = request.GetPublicKey(),
         RawData = request.CreateSigningRequest()
     });
 }
        public static void RsaCertificateRequestTest()
        {
            const string TestCN       = "CN=Test";
            const string LeafCN       = "CN=Leaf";
            var          serialNumber = new byte[20];
            var          rand         = new Random();

            rand.NextBytes(serialNumber);
            serialNumber[0] = 0x80;

            using (var rsa1 = RSA.Create())
                using (var rsa2 = RSA.Create()) {
                    var request1 = new CertificateRequest(TestCN, rsa1, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
                    request1.CertificateExtensions.Add(new X509BasicConstraintsExtension(true, false, 0, false));
                    Assert.NotNull(request1.PublicKey);
                    Assert.NotNull(request1.CertificateExtensions);
                    Assert.NotEmpty(request1.CertificateExtensions);
                    Assert.Equal(TestCN, request1.SubjectName.Name);

                    var ca = request1.CreateSelfSigned(DateTimeOffset.UtcNow,
                                                       DateTimeOffset.UtcNow + TimeSpan.FromDays(1));
                    Assert.Equal(ca.Subject, TestCN);

                    var request2 = new CertificateRequest(LeafCN, rsa2, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
                    Assert.NotNull(request2.PublicKey);
                    Assert.NotNull(request2.CertificateExtensions);
                    Assert.Empty(request2.CertificateExtensions);
                    Assert.Equal(LeafCN, request2.SubjectName.Name);

                    var leaf = request2.Create(ca, DateTimeOffset.UtcNow,
                                               DateTimeOffset.UtcNow + TimeSpan.FromHours(1), serialNumber);
                    Assert.Equal(leaf.Subject, LeafCN);
                    Assert.Equal(new SerialNumber(serialNumber).ToString(), leaf.SerialNumber);

                    var buffer = request2.CreateSigningRequest();

                    var info = buffer.ToCertificationRequestInfo();
                    Assert.True(info.GetPublicKey().SameAs(rsa2.ToPublicKey()));
                    Assert.Equal(LeafCN, new X500DistinguishedName(info.Subject.GetEncoded()).Name);

                    var csr  = buffer.ToCertificateRequest(SignatureType.PS256);
                    var pubk = csr.PublicKey.ToKey();
                    Assert.True(pubk.SameAs(rsa2.ToPublicKey()));
                    Assert.Equal(LeafCN, csr.SubjectName.Name);

                    var leaf2 = csr.Create(ca.IssuerName,
                                           X509SignatureGenerator.CreateForRSA(ca.GetRSAPrivateKey(), RSASignaturePadding.Pkcs1),
                                           DateTimeOffset.UtcNow, DateTimeOffset.UtcNow + TimeSpan.FromHours(1), serialNumber);
                    Assert.True(leaf2.GetRSAPublicKey().ToPublicKey().SameAs(rsa2.ToPublicKey()));
                    Assert.Equal(leaf.Subject, leaf2.Subject);
                    Assert.Equal(leaf.SerialNumber, leaf2.SerialNumber);
                }
        }
        /// <summary>
        /// Get public key from request
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public static Key GetPublicKey(this CertificateRequest request)
        {
            var csr = request.CreateSigningRequest().ToCertificationRequestInfo();

            return(csr.GetPublicKey());
        }