private byte[] MakePFX(byte[] cert, EncryptionMethod p) { var wr = new DerWriter(); using (wr.BeginSequence()) { wr.WriteInteger(3); using (wr.BeginSequence()) { OuterDataObject(cert, p, wr); } } return(wr.ToArray()); }
/// <summary> /// Generate a new X509Certificate using the passed in SignatureCalculator. /// </summary> /// <returns>An X509Certificate.</returns> public X509Certificate2 Generate() { EncryptionMethod method; switch (CipherEngine) { case CipherEngine.RSACryptoServiceProvider: method = new RSAMode(SignatureBits, KeySize, false); break; case CipherEngine.RSACng: method = new RSAMode(SignatureBits, KeySize, true); break; case CipherEngine.ECDsaCng: method = new ECDSAMode(SignatureBits, KeySize); break; default: throw new ArgumentOutOfRangeException(); } using (method) { if (SerialNumber <= 0 || string.IsNullOrWhiteSpace(Issuer) || string.IsNullOrWhiteSpace(Subject)) { throw new InvalidOperationException("not all mandatory fields set"); } DerWriter tbsCertificate = new DerWriter(); using (tbsCertificate.BeginSequence()) { using (tbsCertificate.BeginSequence()) { using (tbsCertificate.BeginTaggedObject(0)) { tbsCertificate.WriteInteger(2); } tbsCertificate.WriteInteger(SerialNumber); using (tbsCertificate.BeginSequence()) { tbsCertificate.WriteOID(method.SignatureOID); } using (tbsCertificate.BeginSequence()) using (tbsCertificate.BeginSet()) using (tbsCertificate.BeginSequence()) { tbsCertificate.WriteOID(Cn); tbsCertificate.Write(Issuer); } using (tbsCertificate.BeginSequence()) { tbsCertificate.Write(NotBefore); tbsCertificate.Write(NotAfter); } using (tbsCertificate.BeginSequence()) using (tbsCertificate.BeginSet()) using (tbsCertificate.BeginSequence()) { tbsCertificate.WriteOID(Cn); tbsCertificate.Write(Subject); } using (tbsCertificate.BeginSequence()) { method.WritePublicKey(tbsCertificate); } } byte[] encoded = tbsCertificate.ToArray(); using (tbsCertificate.BeginSequence()) tbsCertificate.WriteOID(method.SignatureOID); method.SignData(encoded, tbsCertificate); } byte[] data = tbsCertificate.ToArray(); byte[] data2 = MakePFX(data, method); return(new X509Certificate2(data2, "", X509KeyStorageFlags.Exportable)); } }