示例#1
0
        private static byte[] ExportCertificate(X509Certificate certificate, AsymmetricCipherKeyPair subjectKeyPair, TCertificateFormat certificateFormat)
        {
            if (certificate == null)
            {
                throw new ArgumentNullException(nameof(certificate));
            }

            if (subjectKeyPair == null)
            {
                throw new ArgumentNullException(nameof(subjectKeyPair));
            }

            byte[] result = null;
            switch (certificateFormat)
            {
            case TCertificateFormat.NotSet:
            {
                break;
            }

            case TCertificateFormat.PEM:
            {
                using (var stream = new MemoryStream())
                {
                    using (var writer = new StreamWriter(stream))
                    {
                        var pemWriter = new PemWriter(writer);
                        if (subjectKeyPair.Private is ECKeyParameters)
                        {
                            var priv           = (ECPrivateKeyParameters)subjectKeyPair.Private;
                            var dp             = priv.Parameters;
                            var orderBitLength = dp.N.BitLength;
                            ECPrivateKeyStructure ec;
                            X962Parameters        x962;
                            if (priv.PublicKeyParamSet == null)
                            {
                                var ecP = new X9ECParameters(dp.Curve, dp.G, dp.N, dp.H, dp.GetSeed());
                                x962 = new X962Parameters(ecP);
                            }
                            else
                            {
                                x962 = new X962Parameters(priv.PublicKeyParamSet);
                            }
                            ec = new ECPrivateKeyStructure(orderBitLength, priv.D, SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(subjectKeyPair.Public).PublicKeyData, x962);
                            pemWriter.WriteObject(new Org.BouncyCastle.Utilities.IO.Pem.PemObject("EC PRIVATE KEY", ec.GetEncoded()));
                        }
                        else
                        {
                            pemWriter.WriteObject(new MiscPemGenerator(subjectKeyPair.Private));
                        }
                        pemWriter.WriteObject(new MiscPemGenerator(subjectKeyPair.Public));
                        pemWriter.WriteObject(new MiscPemGenerator(certificate));
                        writer.Flush();
                        result = stream.ToArray();
                    }
                }
            }
            break;

            case TCertificateFormat.PFX:
            {
                //Asn1Sequence asn1Sequence = Asn1Sequence.GetInstance(Asn1Object.FromByteArray(certificate.GetEncoded()));
                //asn1Sequence.GetObjects
                //Org.BouncyCastle.Asn1.Pkcs.Pfx pfx = new Org.BouncyCastle.Asn1.Pkcs.Pfx();
                //Org.BouncyCastle.Asn1.Pkcs.PrivateKeyInfo info = Org.BouncyCastle.Pkcs.PrivateKeyInfoFactory.CreatePrivateKeyInfo(subjectKeyPair.Private);
                //result = pfx.GetEncoded(Asn1Encodable.Der);
                break;
            }

            case TCertificateFormat.CER:
            {
                result = certificate.GetEncoded();
                break;
            }

            default:
            {
                break;
            }
            }
            return(result);
        }