public static string EncodeAsBase64Url(CertificateRequestData requestData)
        {
            var    bytes       = EncodeAsDer(requestData);
            var    base64      = bytes.Base64UrlEncoded();
            string base64lines = "";

            for (int i = 0; i < base64.Length; i += 64)
            {
                base64lines += base64.Substring(i, Math.Min(64, base64.Length - i)) + "\n";
            }

            return($"-----BEGIN NEW CERTIFICATE REQUEST-----\n{base64lines}-----END NEW CERTIFICATE REQUEST-----");
        }
        public static CertificationRequest Encode(CertificateRequestData requestData)
        {
            var publicKeyBytes = Asn1.Encode(new Sequence(
                                                 new DerInteger(requestData.Key.Modulus),
                                                 new DerInteger(requestData.Key.Exponent)
                                                 ));

            var certificationRequestInfo = new CertificationRequestInfo(
                new DerInteger(0),
                new Name(

                    /*new RelativeDistinguishedName(
                     *  new AttributeTypeAndValue(new ObjectIdentifier(Oid.Attribute.C),
                     *      new PrintableString(requestData.C))),
                     * new RelativeDistinguishedName(
                     *  new AttributeTypeAndValue(new ObjectIdentifier(Oid.Attribute.S), new UTF8String(requestData.S))),
                     * new RelativeDistinguishedName(
                     *  new AttributeTypeAndValue(new ObjectIdentifier(Oid.Attribute.L), new UTF8String(requestData.L))),
                     * new RelativeDistinguishedName(
                     *  new AttributeTypeAndValue(new ObjectIdentifier(Oid.Attribute.O), new UTF8String(requestData.O))),
                     * new RelativeDistinguishedName(
                     *  new AttributeTypeAndValue(new ObjectIdentifier(Oid.Attribute.OU), new UTF8String(requestData.OU))),*/
                    new RelativeDistinguishedName(
                        new AttributeTypeAndValue(new ObjectIdentifier(Oids.Attribute.CN), new UTF8String(requestData.CN)))),
                new SubjectPublicKeyInfo(
                    new AlgorithmIdentifier(Oids.Algorithm.RSA),
                    new BitString(publicKeyBytes)),
                new ContextSpecific());

            var certificationRequestInfoBytes = Asn1.Encode(certificationRequestInfo);

            var rsa = new RSACryptoServiceProvider();

            rsa.ImportParameters(requestData.Key);

            var signatureBytes = rsa.SignData(certificationRequestInfoBytes, SHA256.Create());

            return(new CertificationRequest(
                       certificationRequestInfo: certificationRequestInfo,
                       signatureAlgorithm: new AlgorithmIdentifier(Oids.Algorithm.Sha256RSA),
                       signature: new BitString(signatureBytes)
                       ));
        }
        public static string EncodeAsBase64(CertificateRequestData requestData)
        {
            var bytes = EncodeAsDer(requestData);

            return(Pem.Encode(bytes, "NEW CERTIFICATE REQUEST"));
        }
        public static byte[] EncodeAsDer(CertificateRequestData requestData)
        {
            var asn1 = Encode(requestData);

            return(Asn1.Encode(asn1));
        }