private static Stream ChainEncryptedOut(Stream outputStream, PgpEncryptionKeys m_encryptionKeys)
        {
            PgpEncryptedDataGenerator encryptedDataGenerator;

            encryptedDataGenerator = new PgpEncryptedDataGenerator(SymmetricKeyAlgorithmTag.TripleDes, new SecureRandom());
            encryptedDataGenerator.AddMethod(m_encryptionKeys.PublicKey);
            return(encryptedDataGenerator.Open(outputStream, new byte[BufferSize]));
        }
        /// <summary>
        /// Encrypt and sign the file pointed to by unencryptedFileInfo.
        /// </summary>
        /// <param name="inputFile">The input file.</param>
        /// <param name="outputFile">The output file.</param>
        /// <param name="publicKeyFile">The public key file.</param>
        /// <param name="privateKeyFile">The private key file.</param>
        /// <param name="passPhrase">The pass phrase.</param>
        /// <param name="armor">if set to <c>true</c> [armor].</param>
        /// <exception cref="System.IO.FileNotFoundException">
        /// </exception>
        /// <exception cref="System.ArgumentNullException">Invalid Pass Phrase.
        /// or
        /// Encryption Key not found.</exception>
        public static void EncryptAndSign(string inputFile, string outputFile, string publicKeyFile, string privateKeyFile, string passPhrase, bool armor)
        {
            PgpEncryptionKeys encryptionKeys = new PgpEncryptionKeys(publicKeyFile, privateKeyFile, passPhrase);

            if (!File.Exists(inputFile))
            {
                throw new FileNotFoundException(String.Format("Input file does not exist.: [{0}]", inputFile));
            }

            if (!File.Exists(publicKeyFile))
            {
                throw new FileNotFoundException(String.Format("Public Key file does not exist: [{0}]", publicKeyFile));
            }

            if (!File.Exists(privateKeyFile))
            {
                throw new FileNotFoundException(String.Format("Private Key file does not exist: [{0}]", privateKeyFile));
            }

            if (String.IsNullOrEmpty(passPhrase))
            {
                throw new ArgumentNullException("Invalid Pass Phrase.");
            }

            if (encryptionKeys == null)
            {
                throw new ArgumentNullException("Encryption Key not found.");
            }

            using (Stream outputStream = File.Create(outputFile))
            {
                if (armor)
                {
                    using (ArmoredOutputStream armoredOutputStream = new ArmoredOutputStream(outputStream))
                    {
                        OutputEncrypted(inputFile, armoredOutputStream, encryptionKeys);
                    }
                }
                else
                {
                    OutputEncrypted(inputFile, outputStream, encryptionKeys);
                }
            }
        }
 /// <summary>
 /// Outputs the encrypted.
 /// </summary>
 /// <param name="inputFile">The input file.</param>
 /// <param name="outputStream">The output stream.</param>
 /// <param name="encryptionKeys">The encryption keys.</param>
 private static void OutputEncrypted(string inputFile, Stream outputStream, PgpEncryptionKeys encryptionKeys)
 {
     using (Stream encryptedOut = ChainEncryptedOut(outputStream, encryptionKeys))
     {
         FileInfo unencryptedFileInfo = new FileInfo(inputFile);
         using (Stream compressedOut = ChainCompressedOut(encryptedOut))
         {
             PgpSignatureGenerator signatureGenerator = InitSignatureGenerator(compressedOut, encryptionKeys);
             using (Stream literalOut = ChainLiteralOut(compressedOut, unencryptedFileInfo))
             {
                 using (FileStream inputFileStream = unencryptedFileInfo.OpenRead())
                 {
                     WriteOutputAndSign(compressedOut, literalOut, inputFileStream, signatureGenerator);
                     inputFileStream.Close();
                 }
             }
         }
     }
 }
        private static PgpSignatureGenerator InitSignatureGenerator(Stream compressedOut, PgpEncryptionKeys m_encryptionKeys)
        {
            const bool            IsCritical            = false;
            const bool            IsNested              = false;
            PublicKeyAlgorithmTag tag                   = m_encryptionKeys.SecretKey.PublicKey.Algorithm;
            PgpSignatureGenerator pgpSignatureGenerator = new PgpSignatureGenerator(tag, HashAlgorithmTag.Sha1);

            pgpSignatureGenerator.InitSign(PgpSignature.BinaryDocument, m_encryptionKeys.PrivateKey);
            foreach (string userId in m_encryptionKeys.SecretKey.PublicKey.GetUserIds())
            {
                PgpSignatureSubpacketGenerator subPacketGenerator = new PgpSignatureSubpacketGenerator();
                subPacketGenerator.SetSignerUserId(IsCritical, userId);
                pgpSignatureGenerator.SetHashedSubpackets(subPacketGenerator.Generate());
                // Just the first one!
                break;
            }
            pgpSignatureGenerator.GenerateOnePassVersion(IsNested).Encode(compressedOut);
            return(pgpSignatureGenerator);
        }
        /// <summary>
        /// Encrypt and sign the file pointed to by unencryptedFileInfo.
        /// </summary>
        /// <param name="inputFile">The input file.</param>
        /// <param name="outputFile">The output file.</param>
        /// <param name="publicKeyFile">The public key file.</param>
        /// <param name="privateKeyFile">The private key file.</param>
        /// <param name="passPhrase">The pass phrase.</param>
        /// <param name="armor">if set to <c>true</c> [armor].</param>
        /// <exception cref="System.IO.FileNotFoundException">
        /// </exception>
        /// <exception cref="System.ArgumentNullException">Invalid Pass Phrase.
        /// or
        /// Encryption Key not found.</exception>
        public static void EncryptAndSign(string inputFile, string outputFile, string publicKeyFile, string privateKeyFile, string passPhrase, bool armor)
        {
            PgpEncryptionKeys encryptionKeys = new PgpEncryptionKeys(publicKeyFile, privateKeyFile, passPhrase);

            if (!File.Exists(inputFile))
                throw new FileNotFoundException(String.Format("Input file does not exist.: [{0}]", inputFile));

            if (!File.Exists(publicKeyFile))
                throw new FileNotFoundException(String.Format("Public Key file does not exist: [{0}]", publicKeyFile));

            if (!File.Exists(privateKeyFile))
                throw new FileNotFoundException(String.Format("Private Key file does not exist: [{0}]", privateKeyFile));

            if (String.IsNullOrEmpty(passPhrase))
                throw new ArgumentNullException("Invalid Pass Phrase.");

            if (encryptionKeys == null)
                throw new ArgumentNullException("Encryption Key not found.");

            using (Stream outputStream = File.Create(outputFile))
            {

                if (armor)
                    using (ArmoredOutputStream armoredOutputStream = new ArmoredOutputStream(outputStream))
                    {
                        OutputEncrypted(inputFile, armoredOutputStream, encryptionKeys);
                    }
                else
                    OutputEncrypted(inputFile, outputStream, encryptionKeys);

            }
        }
 private static PgpSignatureGenerator InitSignatureGenerator(Stream compressedOut, PgpEncryptionKeys m_encryptionKeys)
 {
     const bool IsCritical = false;
     const bool IsNested = false;
     PublicKeyAlgorithmTag tag = m_encryptionKeys.SecretKey.PublicKey.Algorithm;
     PgpSignatureGenerator pgpSignatureGenerator = new PgpSignatureGenerator(tag, HashAlgorithmTag.Sha1);
     pgpSignatureGenerator.InitSign(PgpSignature.BinaryDocument, m_encryptionKeys.PrivateKey);
     foreach (string userId in m_encryptionKeys.SecretKey.PublicKey.GetUserIds())
     {
         PgpSignatureSubpacketGenerator subPacketGenerator = new PgpSignatureSubpacketGenerator();
         subPacketGenerator.SetSignerUserId(IsCritical, userId);
         pgpSignatureGenerator.SetHashedSubpackets(subPacketGenerator.Generate());
         // Just the first one!
         break;
     }
     pgpSignatureGenerator.GenerateOnePassVersion(IsNested).Encode(compressedOut);
     return pgpSignatureGenerator;
 }
 private static Stream ChainEncryptedOut(Stream outputStream, PgpEncryptionKeys m_encryptionKeys)
 {
     PgpEncryptedDataGenerator encryptedDataGenerator;
     encryptedDataGenerator = new PgpEncryptedDataGenerator(SymmetricKeyAlgorithmTag.TripleDes, new SecureRandom());
     encryptedDataGenerator.AddMethod(m_encryptionKeys.PublicKey);
     return encryptedDataGenerator.Open(outputStream, new byte[BufferSize]);
 }
 /// <summary>
 /// Outputs the encrypted.
 /// </summary>
 /// <param name="inputFile">The input file.</param>
 /// <param name="outputStream">The output stream.</param>
 /// <param name="encryptionKeys">The encryption keys.</param>
 private static void OutputEncrypted(string inputFile, Stream outputStream, PgpEncryptionKeys encryptionKeys)
 {
     using (Stream encryptedOut = ChainEncryptedOut(outputStream, encryptionKeys))
     {
         FileInfo unencryptedFileInfo = new FileInfo(inputFile);
         using (Stream compressedOut = ChainCompressedOut(encryptedOut))
         {
             PgpSignatureGenerator signatureGenerator = InitSignatureGenerator(compressedOut, encryptionKeys);
             using (Stream literalOut = ChainLiteralOut(compressedOut, unencryptedFileInfo))
             {
                 using (FileStream inputFileStream = unencryptedFileInfo.OpenRead())
                 {
                     WriteOutputAndSign(compressedOut, literalOut, inputFileStream, signatureGenerator);
                     inputFileStream.Close();
                 }
             }
         }
     }
 }