private SignatureStatus DecryptFile() { if (InStream.CanSeek) { InStream.Seek(0, SeekOrigin.Begin); } var inputStream = PgpUtilities.GetDecoderStream(InStream); try { PgpObjectFactory pgpF = new PgpObjectFactory(inputStream); PgpEncryptedDataList enc; PgpObject o = pgpF.NextPgpObject(); // // the first object might be a PGP marker packet. // if (o is PgpEncryptedDataList) { enc = (PgpEncryptedDataList)o; } else { enc = (PgpEncryptedDataList)pgpF.NextPgpObject(); } var privateKeys = GetAllPrivateKeys(); // // find the secret key // PgpPrivateKey sKey = null; PgpPublicKeyEncryptedData pbe = null; foreach (PgpPublicKeyEncryptedData pked in enc.GetEncryptedDataObjects()) { sKey = FindPrivateKey(privateKeys, pked.KeyId); if (sKey != null) { pbe = pked; break; } } if (sKey == null) { throw new SecretKeyNotFound("secret key for message not found."); } Stream clear = pbe.GetDataStream(sKey); PgpLiteralData pgpLiteralData = null; PgpOnePassSignatureList onePassSignatureList = null; PgpSignatureList signatureList = null; PgpObjectFactory pgpObjectFactory = new PgpObjectFactory(clear); var pgpObject = pgpObjectFactory.NextPgpObject(); while (pgpObject != null) { if (pgpObject is PgpCompressedData) { var compressedData = (PgpCompressedData)pgpObject; pgpObjectFactory = new PgpObjectFactory(compressedData.GetDataStream()); pgpObject = pgpObjectFactory.NextPgpObject(); } if (pgpObject is PgpLiteralData) { pgpLiteralData = pgpObject as PgpLiteralData; //must read directly to continue reading next pgp objects Stream unc = pgpLiteralData.GetInputStream(); Streams.PipeAll(unc, OutStream); } else if (pgpObject is PgpOnePassSignatureList) { onePassSignatureList = pgpObject as PgpOnePassSignatureList; } else if (pgpObject is PgpSignatureList) { signatureList = pgpObject as PgpSignatureList; } pgpObject = pgpObjectFactory.NextPgpObject(); } if (pgpLiteralData == null) { throw new PgpLitralDataNotFound("couldn't find pgp literal data"); } if (pbe.IsIntegrityProtected()) { if (!pbe.Verify()) { throw new PgpIntegrityCheckFailed("message failed integrity check"); } } if (CheckSignature) { if (onePassSignatureList == null || signatureList == null) { return(SignatureStatus.NoSignature); } else { return(VerifyFileSignature(OutStream, onePassSignatureList, signatureList)); } } else { return(SignatureStatus.NotChecked); } } catch { throw; } }