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); }