internal static AsymmetricKeyParameter GetPrivateKeyFromPEM(Org.BouncyCastle.Utilities.IO.Pem.PemObject pem) { AsymmetricKeyParameter result = null; if (pem.Type.EndsWith("EC PRIVATE KEY")) { Asn1Sequence sequence = Asn1Sequence.GetInstance(pem.Content); IEnumerator e = sequence.GetEnumerator(); e.MoveNext(); BigInteger version = ((DerInteger)e.Current).Value; PrivateKeyInfo privateKeyInfo; if (version.IntValue == 0) //V1 { privateKeyInfo = PrivateKeyInfo.GetInstance(sequence); } else { Org.BouncyCastle.Asn1.Sec.ECPrivateKeyStructure ec = Org.BouncyCastle.Asn1.Sec.ECPrivateKeyStructure.GetInstance(sequence); AlgorithmIdentifier algId = new AlgorithmIdentifier(Org.BouncyCastle.Asn1.X9.X9ObjectIdentifiers.IdECPublicKey, ec.GetParameters()); privateKeyInfo = new PrivateKeyInfo(algId, ec.ToAsn1Object()); } result = Org.BouncyCastle.Security.PrivateKeyFactory.CreateKey(privateKeyInfo); } else if (pem.Type.EndsWith("PRIVATE KEY")) { result = Org.BouncyCastle.Security.PrivateKeyFactory.CreateKey(pem.Content); } return(result); }
private static byte[] ExportCertificate(X509Certificate certificate, AsymmetricCipherKeyPair subjectKeyPair, TCertificateFormat certificateFormat) { byte[] result = null; switch (certificateFormat) { case TCertificateFormat.NotSet: break; case TCertificateFormat.PEM: using (MemoryStream stream = new MemoryStream()) { using (StreamWriter writer = new StreamWriter(stream)) { Org.BouncyCastle.Utilities.IO.Pem.PemWriter pemWriter = new Org.BouncyCastle.Utilities.IO.Pem.PemWriter(writer); if (subjectKeyPair.Private is ECKeyParameters) { ECPrivateKeyParameters priv = (ECPrivateKeyParameters)subjectKeyPair.Private; ECDomainParameters dp = priv.Parameters; int orderBitLength = dp.N.BitLength; Org.BouncyCastle.Asn1.Sec.ECPrivateKeyStructure ec; Org.BouncyCastle.Asn1.X9.X962Parameters x962; if (priv.PublicKeyParamSet == null) { Org.BouncyCastle.Asn1.X9.X9ECParameters ecP = new Org.BouncyCastle.Asn1.X9.X9ECParameters(dp.Curve, dp.G, dp.N, dp.H, dp.GetSeed()); x962 = new Org.BouncyCastle.Asn1.X9.X962Parameters(ecP); } else { x962 = new Org.BouncyCastle.Asn1.X9.X962Parameters(priv.PublicKeyParamSet); } ec = new Org.BouncyCastle.Asn1.Sec.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 Org.BouncyCastle.OpenSsl.MiscPemGenerator(subjectKeyPair.Private)); } pemWriter.WriteObject(new Org.BouncyCastle.OpenSsl.MiscPemGenerator(subjectKeyPair.Public)); pemWriter.WriteObject(new Org.BouncyCastle.OpenSsl.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); }
private static byte[] ExportCertificate(X509Certificate certificate, AsymmetricCipherKeyPair subjectKeyPair, TCertificateFormat certificateFormat) { byte[] result = null; switch (certificateFormat) { case TCertificateFormat.NotSet: break; case TCertificateFormat.PEM: using (MemoryStream stream = new MemoryStream()) { using (StreamWriter writer = new StreamWriter(stream)) { Org.BouncyCastle.Utilities.IO.Pem.PemWriter pemWriter = new Org.BouncyCastle.Utilities.IO.Pem.PemWriter(writer); if (subjectKeyPair.Private is ECKeyParameters) { ECPrivateKeyParameters priv = (ECPrivateKeyParameters)subjectKeyPair.Private; ECDomainParameters dp = priv.Parameters; int orderBitLength = dp.N.BitLength; Org.BouncyCastle.Asn1.Sec.ECPrivateKeyStructure ec; Org.BouncyCastle.Asn1.X9.X962Parameters x962; if (priv.PublicKeyParamSet == null) { Org.BouncyCastle.Asn1.X9.X9ECParameters ecP = new Org.BouncyCastle.Asn1.X9.X9ECParameters(dp.Curve, dp.G, dp.N, dp.H, dp.GetSeed()); x962 = new Org.BouncyCastle.Asn1.X9.X962Parameters(ecP); } else { x962 = new Org.BouncyCastle.Asn1.X9.X962Parameters(priv.PublicKeyParamSet); } ec = new Org.BouncyCastle.Asn1.Sec.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 Org.BouncyCastle.OpenSsl.MiscPemGenerator(subjectKeyPair.Private)); } pemWriter.WriteObject(new Org.BouncyCastle.OpenSsl.MiscPemGenerator(subjectKeyPair.Public)); pemWriter.WriteObject(new Org.BouncyCastle.OpenSsl.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; }