public void VerifySignOneFileSha1()
        {
            PgpVerifyClearTextSignatureInput input = new PgpVerifyClearTextSignatureInput
            {
                InputFile     = _signature,
                PublicKeyFile = _publicKeyPath,
                OutputFile    = _output,
            };

            PgpVerifyClearTextSignatureResult resultObject = PgpTasks.VerifyFileClearTextSignature(input);

            Assert.That(resultObject.Verified);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Verifies clear text PGP signature. See documentation at https://github.com/CommunityHiQ/Frends.Community.PgpVerifyClearTextSignature Returns: Object {string FilePath, Boolean Verified}
        /// </summary>
        public static PgpVerifyClearTextSignatureResult VerifyFileClearTextSignature(PgpVerifyClearTextSignatureInput input)
        {
            using (var inStr = File.OpenRead(input.InputFile))
                using (var outStr = File.Create(input.OutputFile))
                    using (var keyStr = PgpUtilities.GetDecoderStream(File.OpenRead(input.PublicKeyFile)))
                    {
                        var aInputStr = new ArmoredInputStream(inStr);

                        //
                        // write out signed section using the local line separator.
                        // note: trailing white space needs to be removed from the end of
                        // each line RFC 4880 Section 7.1
                        //
                        var lineOut   = new MemoryStream();
                        var lookAhead = PgpServices.VerifyClearTextSignatureReadInputLine(lineOut, aInputStr);
                        var lineSep   = Encoding.ASCII.GetBytes(Environment.NewLine);


                        if (lookAhead != -1 && aInputStr.IsClearText())
                        {
                            var line = lineOut.ToArray();
                            outStr.Write(line, 0, PgpServices.GetLengthWithoutSeparatorOrTrailingWhitespace(line));
                            outStr.Write(lineSep, 0, lineSep.Length);

                            while (lookAhead != -1 && aInputStr.IsClearText())
                            {
                                lookAhead = PgpServices.VerifyClearTextSignatureReadInputLine(lineOut, lookAhead, aInputStr);

                                line = lineOut.ToArray();
                                outStr.Write(line, 0, PgpServices.GetLengthWithoutSeparatorOrTrailingWhitespace(line));
                                outStr.Write(lineSep, 0, lineSep.Length);
                            }
                        }
                        else
                        {
                            // a single line file
                            if (lookAhead != -1)
                            {
                                var line = lineOut.ToArray();
                                outStr.Write(line, 0, PgpServices.GetLengthWithoutSeparatorOrTrailingWhitespace(line));
                                outStr.Write(lineSep, 0, lineSep.Length);
                            }
                        }
                        outStr.Close();

                        var pgpRings = new PgpPublicKeyRingBundle(keyStr);

                        var pgpFact = new PgpObjectFactory(aInputStr);
                        var p3      = (PgpSignatureList)pgpFact.NextPgpObject();
                        var sig     = p3[0];
                        inStr.Close();


                        sig.InitVerify(pgpRings.GetPublicKey(sig.KeyId));
                        // read the input, making sure we ignore the last newline.
                        bool verified;
                        using (var sigIn = File.OpenRead(input.OutputFile))
                        {
                            lookAhead = PgpServices.VerifyClearTextSignatureReadInputLine(lineOut, sigIn);
                            PgpServices.ProcessLine(sig, lineOut.ToArray());
                            while (lookAhead != -1)
                            {
                                lookAhead = PgpServices.VerifyClearTextSignatureReadInputLine(lineOut, lookAhead, sigIn);

                                sig.Update((byte)'\r');
                                sig.Update((byte)'\n');

                                PgpServices.ProcessLine(sig, lineOut.ToArray());
                            }

                            verified = sig.Verify();
                            sigIn.Close();
                        }
                        var ret = new PgpVerifyClearTextSignatureResult
                        {
                            FilePath = input.OutputFile,
                            Verified = verified
                        };

                        return(ret);
                    }
        }