using System; using System.IO; using Org.BouncyCastle.Asn1.Pkcs; using Org.BouncyCastle.Asn1.X509; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Utilities; using Org.BouncyCastle.Utilities.IO; namespace Org.BouncyCastle.Pkcs { public class Pkcs8EncryptedPrivateKeyInfoBuilder { private PrivateKeyInfo privateKeyInfo; public Pkcs8EncryptedPrivateKeyInfoBuilder(byte[] privateKeyInfo): this(PrivateKeyInfo.GetInstance(privateKeyInfo)) { } public Pkcs8EncryptedPrivateKeyInfoBuilder(PrivateKeyInfo privateKeyInfo) { this.privateKeyInfo = privateKeyInfo; } /// /// Create the encrypted private key info using the passed in encryptor. /// /// The encryptor to use. /// An encrypted private key info containing the original private key info. public Pkcs8EncryptedPrivateKeyInfo Build(ICipherBuilder encryptor) { try { MemoryStream bOut = new MemoryStream(); ICipher cOut = encryptor.BuildCipher(bOut); byte[] keyData = privateKeyInfo.GetEncoded(); using (var str = cOut.Stream) { str.Write(keyData, 0, keyData.Length); } return new Pkcs8EncryptedPrivateKeyInfo( new EncryptedPrivateKeyInfo((AlgorithmIdentifier)encryptor.AlgorithmDetails, bOut.ToArray())); } catch (IOException) { throw new InvalidOperationException("cannot encode privateKeyInfo"); } } } }