All pastes #447940 Raw Edit

Miscellany

public text v1 · immutable
·published 2007-04-19 11:58 UTC
rendered paste body
    public class CA
    {
        public static void Issue(string subject, X509Certificate2 signingCert)
        {
            X509CertificateParser pas = new X509CertificateParser();
            X509Certificate bouncySigningCert = pas.ReadCertificate(signingCert.GetRawCertData());


            AsymmetricKeyParameter signingPrivateKey; // ding
            if (signingCert.HasPrivateKey && signingCert.PrivateKey is RSA)
            {
                RSAParameters signingParams = ((RSACryptoServiceProvider)signingCert.PrivateKey).ExportParameters(true);
                RSAParameters publicSigningParams =
                    ((RSACryptoServiceProvider) signingCert.PublicKey.Key).ExportParameters(false);

                signingPrivateKey =
                    new Org.BouncyCastle.Crypto.Parameters.RsaPrivateCrtKeyParameters(
                        new BigInteger(1, signingParams.Modulus),
                        new BigInteger(1, publicSigningParams.Exponent),
                        new BigInteger(1, signingParams.Exponent),
                        new BigInteger(1, signingParams.P),
                        new BigInteger(1, signingParams.Q),
                        new BigInteger(1, signingParams.DP),
                        new BigInteger(1, signingParams.DQ),
                        new BigInteger(1, signingParams.InverseQ));
            }
            else throw new Exception("boom!");


            RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
            RSAParameters param = rsa.ExportParameters(true);
            //RsaKeyParameters privateKey = new RsaKeyParameters(true, new BigInteger(1, param.Modulus), new BigInteger(1, param.Exponent));
            RsaKeyParameters publicKey = new RsaKeyParameters(false, new BigInteger(1, param.Modulus), new BigInteger(1, param.Exponent));


            X509V3CertificateGenerator gen = new X509V3CertificateGenerator();


            X509Name email = new X509Name("CN=" + subject);
            gen.SetSubjectDN(email);

            X509Name issuer = new X509Name(signingCert.Subject);
            gen.SetIssuerDN(issuer);

            gen.SetNotBefore(DateTime.Now.AddYears(-1));
            gen.SetNotAfter(DateTime.Now.AddYears(1));

            gen.SetSerialNumber(new BigInteger(128, new Random()));
            
            gen.SetPublicKey(publicKey);

            gen.SetSignatureAlgorithm("MD5withRSA");

            
            //RSAParameters signingCertPublicParams = ((RSA)signingCert.PublicKey.Key).ExportParameters(false);

            //RsaKeyParameters signingCertPublicKey = 
            //    new RsaKeyParameters(false, new BigInteger(1, signingCertPublicParams.Modulus),
            //                         new BigInteger(1, signingCertPublicParams.Exponent));

            gen.AddExtension(X509Extensions.AuthorityKeyIdentifier, false,
                             new AuthorityKeyIdentifierStructure(bouncySigningCert));

            X509Certificate cert = gen.Generate(signingPrivateKey);

            X509Certificate2 l = new X509Certificate2(cert.GetEncoded());
            l.PrivateKey = rsa;
            byte[] pkcs12File = l.Export(X509ContentType.Cert);

            using (FileStream stream = new FileStream("c:\\Certificate.cer", FileMode.Create))
            {
                stream.Write(pkcs12File, 0, pkcs12File.Length);
                stream.Flush();
            }

            
        }
    }