diff --git a/tests/openpgp/Makefile.am b/tests/openpgp/Makefile.am index bf9673f74..506bce526 100644 --- a/tests/openpgp/Makefile.am +++ b/tests/openpgp/Makefile.am @@ -1,269 +1,270 @@ # Makefile.am - For tests/openpgp # Copyright (C) 1998, 1999, 2000, 2001, 2003, # 2010 Free Software Foundation, Inc. # # This file is part of GnuPG. # # GnuPG is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # GnuPG is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # Process this file with automake to create Makefile.in # Programs required before we can run these tests. required_pgms = ../../g10/gpg$(EXEEXT) ../../agent/gpg-agent$(EXEEXT) \ ../../tools/gpg-connect-agent$(EXEEXT) \ ../gpgscm/gpgscm$(EXEEXT) AM_CPPFLAGS = -I$(top_srcdir)/common include $(top_srcdir)/am/cmacros.am AM_CFLAGS = noinst_PROGRAMS = fake-pinentry fake_pinentry_SOURCES = fake-pinentry.c TESTS_ENVIRONMENT = LC_ALL=C \ EXEEXT=$(EXEEXT) \ PATH=../gpgscm:$(PATH) \ abs_top_srcdir=$(abs_top_srcdir) \ objdir=$(abs_top_builddir) \ GPGSCM_PATH=$(abs_top_srcdir)/tests/gpgscm XTESTS = \ version.scm \ enarmor.scm \ mds.scm \ decrypt.scm \ decrypt-multifile.scm \ decrypt-dsa.scm \ decrypt-session-key.scm \ decrypt-unwrap-verify.scm \ sigs.scm \ sigs-dsa.scm \ encrypt.scm \ encrypt-multifile.scm \ encrypt-dsa.scm \ compression.scm \ seat.scm \ clearsig.scm \ encryptp.scm \ detach.scm \ detachm.scm \ armsigs.scm \ armencrypt.scm \ armencryptp.scm \ signencrypt.scm \ signencrypt-dsa.scm \ armsignencrypt.scm \ armdetach.scm \ armdetachm.scm \ genkey1024.scm \ conventional.scm \ conventional-mdc.scm \ multisig.scm \ verify.scm \ verify-multifile.scm \ + gpgv.scm \ gpgv-forged-keyring.scm \ armor.scm \ import.scm \ import-revocation-certificate.scm \ ecc.scm \ 4gb-packet.scm \ tofu.scm \ gpgtar.scm \ use-exact-key.scm \ default-key.scm \ export.scm \ ssh-import.scm \ ssh-export.scm \ quick-key-manipulation.scm \ key-selection.scm \ delete-keys.scm \ gpgconf.scm \ issue2015.scm \ issue2346.scm \ issue2417.scm \ issue2419.scm \ issue2929.scm \ issue2941.scm # XXX: Currently, one cannot override automake's 'check' target. As a # workaround, we avoid defining 'TESTS', thus automake will not emit # the 'check' target. For extra robustness, we merely define a # dependency on 'xcheck', so this hack should also work even if # automake would emit the 'check' target, as adding dependencies to # targets is okay. check: xcheck .PHONY: xcheck xcheck: $(TESTS_ENVIRONMENT) $(abs_top_builddir)/tests/gpgscm/gpgscm \ $(abs_srcdir)/run-tests.scm $(TESTFLAGS) $(TESTS) TEST_FILES = pubring.asc secring.asc plain-1o.asc plain-2o.asc plain-3o.asc \ plain-1.asc plain-2.asc plain-3.asc plain-1-pgp.asc \ plain-largeo.asc plain-large.asc \ pubring.pkr.asc secring.skr.asc secdemo.asc pubdemo.asc \ bug537-test.data.asc bug894-test.asc \ bug1223-good.asc bug1223-bogus.asc 4gb-packet.asc \ tofu/conflicting/1C005AF3.gpg \ tofu/conflicting/1C005AF3-secret.gpg \ tofu/conflicting/1C005AF3-1.txt \ tofu/conflicting/1C005AF3-2.txt \ tofu/conflicting/1C005AF3-3.txt \ tofu/conflicting/1C005AF3-4.txt \ tofu/conflicting/1C005AF3-5.txt \ tofu/conflicting/B662E42F.gpg \ tofu/conflicting/B662E42F-secret.gpg \ tofu/conflicting/B662E42F-1.txt \ tofu/conflicting/B662E42F-2.txt \ tofu/conflicting/B662E42F-3.txt \ tofu/conflicting/B662E42F-4.txt \ tofu/conflicting/B662E42F-5.txt \ tofu/conflicting/BE04EB2B.gpg \ tofu/conflicting/BE04EB2B-secret.gpg \ tofu/conflicting/BE04EB2B-1.txt \ tofu/conflicting/BE04EB2B-2.txt \ tofu/conflicting/BE04EB2B-3.txt \ tofu/conflicting/BE04EB2B-4.txt \ tofu/conflicting/BE04EB2B-5.txt \ tofu/cross-sigs/EC38277E-secret.gpg \ tofu/cross-sigs/EC38277E-1.gpg \ tofu/cross-sigs/EC38277E-1.txt \ tofu/cross-sigs/EC38277E-2.gpg \ tofu/cross-sigs/EC38277E-2.txt \ tofu/cross-sigs/EC38277E-3.txt \ tofu/cross-sigs/871C2247-secret.gpg \ tofu/cross-sigs/871C2247-1.gpg \ tofu/cross-sigs/871C2247-1.txt \ tofu/cross-sigs/871C2247-2.gpg \ tofu/cross-sigs/871C2247-2.txt \ tofu/cross-sigs/871C2247-3.gpg \ tofu/cross-sigs/871C2247-3.txt \ tofu/cross-sigs/871C2247-4.gpg \ tofu/cross-sigs/README \ key-selection/0.asc \ key-selection/1.asc \ key-selection/2.asc \ key-selection/3.asc \ key-selection/4.asc data_files = data-500 data-9000 data-32000 data-80000 plain-large priv_keys = privkeys/50B2D4FA4122C212611048BC5FC31BD44393626E.asc \ privkeys/7E201E28B6FEB2927B321F443205F4724EBE637E.asc \ privkeys/13FDB8809B17C5547779F9D205C45F47CE0217CE.asc \ privkeys/343D8AF79796EE107D645A2787A9D9252F924E6F.asc \ privkeys/8B5ABF3EF9EB8D96B91A0B8C2C4401C91C834C34.asc \ privkeys/0D6F6AD4C4C803B25470F9104E9F4E6A4CA64255.asc \ privkeys/FD692BD59D6640A84C8422573D469F84F3B98E53.asc \ privkeys/76F7E2B35832976B50A27A282D9B87E44577EB66.asc \ privkeys/A0747D5F9425E6664F4FFBEED20FBCA79FDED2BD.asc \ privkeys/0DD40284FF992CD24DC4AAC367037E066FCEE26A.asc \ privkeys/2BC997C0B8691D41D29A4EC81CCBCF08454E4961.asc \ privkeys/3C9D5ECA70130C2DBB1FC6AC0076BEEEC197716F.asc \ privkeys/449E644892C951A37525654730DD32C202079926.asc \ privkeys/58FFE844087634E62440224908BDE44BEA7EB730.asc \ privkeys/4DF9172D6FF428C97A0E9AA96F03E8BCE3B2F188.asc \ privkeys/9D7CD8F53F2F14C3E2177D1E9D1D11F39513A4A4.asc \ privkeys/6E6B7ED0BD4425018FFC54F3921D5467A3AE00EB.asc \ privkeys/C905D0AB6AE9655C5A35975939997BBF3325D6DD.asc \ privkeys/B2BAA7144303DF19BB6FDE23781DD3FDD97918D4.asc \ privkeys/CF60965BF51F67CF80DECE853E0D2D343468571D.asc \ privkeys/DF00E361D34F80868D06879AC21D7A7D4E4FAD76.asc \ privkeys/00FE67F28A52A8AA08FFAED20AF832DA916D1985.asc \ privkeys/1DF48228FEFF3EC2481B106E0ACA8C465C662CC5.asc \ privkeys/A2832820DC9F40751BDCD375BB0945BA33EC6B4C.asc \ privkeys/ADE710D74409777B7729A7653373D820F67892E0.asc \ privkeys/CEFC51AF91F68A2904FBFF62C4F075A4785B803F.asc \ privkeys/1E28F20E41B54C2D1234D896096495FF57E08D18.asc \ privkeys/EB33B687EB8581AB64D04852A54453E85F3DF62D.asc \ privkeys/C6A6390E9388CDBAD71EAEA698233FE5E04F001E.asc \ privkeys/D69102E0F5AC6B6DB8E4D16DA8E18CF46D88CAE3.asc sample_keys = samplekeys/README \ samplekeys/ecc-sample-1-pub.asc \ samplekeys/ecc-sample-2-pub.asc \ samplekeys/ecc-sample-3-pub.asc \ samplekeys/ecc-sample-1-sec.asc \ samplekeys/ecc-sample-2-sec.asc \ samplekeys/ecc-sample-3-sec.asc \ samplekeys/eddsa-sample-1-pub.asc \ samplekeys/eddsa-sample-1-sec.asc \ samplekeys/dda252ebb8ebe1af-1.asc \ samplekeys/dda252ebb8ebe1af-2.asc \ samplekeys/whats-new-in-2.1.asc \ samplekeys/e2e-p256-1-clr.asc \ samplekeys/e2e-p256-1-prt.asc \ samplekeys/E657FB607BB4F21C90BB6651BC067AF28BC90111.asc \ samplekeys/rsa-rsa-sample-1.asc \ samplekeys/ed25519-cv25519-sample-1.asc \ samplekeys/silent-running.asc \ samplekeys/ssh-dsa.key \ samplekeys/ssh-ecdsa.key \ samplekeys/ssh-ed25519.key \ samplekeys/ssh-rsa.key \ samplekeys/issue2346.gpg \ samplekeys/authenticate-only.pub.asc \ samplekeys/authenticate-only.sec.asc sample_msgs = samplemsgs/clearsig-1-key-1.asc \ samplemsgs/clearsig-2-keys-1.asc \ samplemsgs/clearsig-2-keys-2.asc \ samplemsgs/enc-1-key-1.asc \ samplemsgs/enc-1-key-2.asc \ samplemsgs/enc-2-keys-1.asc \ samplemsgs/enc-2-keys-2.asc \ samplemsgs/enc-2-keys-hh-1.asc \ samplemsgs/enc-2-keys-hr-1.asc \ samplemsgs/enc-2-keys-rh-1.asc \ samplemsgs/encsig-2-2-keys-3.asc \ samplemsgs/encsig-2-2-keys-4.asc \ samplemsgs/encsig-2-keys-1.asc \ samplemsgs/encsig-2-keys-2.asc \ samplemsgs/encsig-2-keys-3.asc \ samplemsgs/encsig-2-keys-4.asc \ samplemsgs/encz0-1-key-1.asc \ samplemsgs/encz0-1-key-2.asc \ samplemsgs/issue2419.asc \ samplemsgs/revoke-2D727CC768697734.asc \ samplemsgs/sig-1-key-1.asc \ samplemsgs/sig-1-key-2.asc \ samplemsgs/sig-2-keys-1.asc \ samplemsgs/sig-2-keys-2.asc \ samplemsgs/signed-1-key-1.asc \ samplemsgs/signed-1-key-2.asc \ samplemsgs/signed-2-keys-1.asc \ samplemsgs/signed-2-keys-2.asc EXTRA_DIST = defs.scm $(XTESTS) $(TEST_FILES) \ mkdemodirs signdemokey $(priv_keys) $(sample_keys) \ $(sample_msgs) ChangeLog-2011 run-tests.scm \ - setup.scm shell.scm all-tests.scm + setup.scm shell.scm all-tests.scm signed-messages.scm CLEANFILES = prepared.stamp x y yy z out err $(data_files) \ plain-1 plain-2 plain-3 trustdb.gpg *.lock .\#lk* \ *.log gpg_dearmor gpg.conf gpg-agent.conf S.gpg-agent \ pubring.gpg pubring.gpg~ pubring.kbx pubring.kbx~ \ secring.gpg pubring.pkr secring.skr \ gnupg-test.stop random_seed gpg-agent.log tofu.db \ passphrases sshcontrol S.gpg-agent.ssh report.xml clean-local: -rm -rf private-keys-v1.d openpgp-revocs.d tofu.d gpgtar.d # We need to depend on a couple of programs so that the tests don't # start before all programs are built. all-local: $(required_pgms) diff --git a/tests/openpgp/gpgv.scm b/tests/openpgp/gpgv.scm new file mode 100755 index 000000000..819d15f1b --- /dev/null +++ b/tests/openpgp/gpgv.scm @@ -0,0 +1,75 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016-2017 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see . + +(load (in-srcdir "tests" "openpgp" "defs.scm")) +(load (in-srcdir "tests" "openpgp" "signed-messages.scm")) +(setup-legacy-environment) + +(define keyring (if (file-exists? "pubring.kbx") "pubring.kbx" "pubring.gpg")) + +;; +;; Two simple tests to check that verify fails for bad input data +;; +(for-each-p + "Checking bogus signature" + (lambda (char) + (lettmp (x) + (call-with-binary-output-file + x + (lambda (port) + (display (make-string 64 (integer->char (string->number char))) + port))) + (if (= 0 (call `(,@gpgv --keyring ,keyring ,x data-500))) + (fail "no error code from verify")))) + '("#x2d" "#xca")) + +;; Fixme: We need more tests with manipulated cleartext signatures. + +;; +;; Now run the tests. +;; +(for-each-p + "Checking that a valid signature is verified as such" + (lambda (armored-file) + (pipe:do + (pipe:echo (eval armored-file (current-environment))) + (pipe:spawn `(,@gpgv --keyring ,keyring)))) + '(msg_ols_asc msg_cols_asc msg_sl_asc msg_oolss_asc msg_cls_asc msg_clss_asc)) + +(for-each-p + "Checking that an invalid signature is verified as such" + (lambda (armored-file) + (catch '() + (pipe:do + (pipe:echo (eval armored-file (current-environment))) + (pipe:spawn `(,@gpgv --keyring ,keyring))) + (fail "verification succeeded but should not"))) + '(bad_ls_asc bad_fols_asc bad_olsf_asc bad_ools_asc)) + + +;; Need to import the ed25519 sample key used for the next two tests. +(call-check `(,@gpg --quiet --yes + --import ,(in-srcdir "tests" "openpgp" key-file2))) +(for-each-p + "Checking that a valid Ed25519 signature is verified as such" + (lambda (armored-file) + (pipe:do + (pipe:echo (eval armored-file (current-environment))) + (pipe:spawn `(,@gpgv --keyring ,keyring)))) + '(msg_ed25519_rshort msg_ed25519_sshort)) diff --git a/tests/openpgp/verify.scm b/tests/openpgp/signed-messages.scm old mode 100755 new mode 100644 similarity index 84% copy from tests/openpgp/verify.scm copy to tests/openpgp/signed-messages.scm index cb6eb59e4..d012f2f20 --- a/tests/openpgp/verify.scm +++ b/tests/openpgp/signed-messages.scm @@ -1,353 +1,281 @@ -#!/usr/bin/env gpgscm - ;; Copyright (C) 2016 g10 Code GmbH ;; ;; This file is part of GnuPG. ;; ;; GnuPG is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 3 of the License, or ;; (at your option) any later version. ;; ;; GnuPG is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with this program; if not, see . -(load (in-srcdir "tests" "openpgp" "defs.scm")) -(setup-legacy-environment) - -;; -;; Two simple tests to check that verify fails for bad input data -;; -(for-each-p - "Checking bogus signature" - (lambda (char) - (lettmp (x) - (call-with-binary-output-file - x - (lambda (port) - (display (make-string 64 (integer->char (string->number char))) - port))) - (if (= 0 (call `(,@GPG --verify ,x data-500))) - (fail "no error code from verify")))) - '("#x2d" "#xca")) - ;; A plain signed message created using ;; echo abc | gpg --homedir . --passphrase-fd 0 -u Alpha -z0 -sa msg (define msg_ols_asc " -----BEGIN PGP MESSAGE----- kA0DAAIRLXJ8x2hpdzQBrQEHYgNtc2dEDFJaSSB0aGluayB0aGF0IGFsbCByaWdo dC10aGlua2luZyBwZW9wbGUgaW4gdGhpcyBjb3VudHJ5IGFyZSBzaWNrIGFuZAp0 aXJlZCBvZiBiZWluZyB0b2xkIHRoYXQgb3JkaW5hcnkgZGVjZW50IHBlb3BsZSBh cmUgZmVkIHVwIGluIHRoaXMKY291bnRyeSB3aXRoIGJlaW5nIHNpY2sgYW5kIHRp cmVkLiAgSSdtIGNlcnRhaW5seSBub3QuICBCdXQgSSdtCnNpY2sgYW5kIHRpcmVk IG9mIGJlaW5nIHRvbGQgdGhhdCBJIGFtLgotIE1vbnR5IFB5dGhvbgqIPwMFAEQM UlotcnzHaGl3NBECR4IAoJlEGTY+bHjD2HYuCixLQCmk01pbAKCIjkzLOAmkZNm0 D8luT78c/1x45Q== =a29i -----END PGP MESSAGE----- ") ;; A plain signed message created using ;; echo abc | gpg --homedir . --passphrase-fd 0 -u Alpha -sa msg (define msg_cols_asc " -----BEGIN PGP MESSAGE----- owGbwMvMwCSoW1RzPCOz3IRxLSN7EnNucboLT6Cgp0JJRmZeNpBMLFFIzMlRKMpM zyjRBQtm5qUrFKTmF+SkKmTmgdQVKyTnl+aVFFUqJBalKhRnJmcrJOalcJVkFqWm KOSnKSSlgrSU5OekQMzLL0rJzEsEKk9JTU7NK4EZBtKcBtRRWgAzlwtmbnlmSQbU GJjxCmDj9RQUPNVzFZJTi0oSM/NyKhXy8kuAYk6lJSBxLlTF2NziqZCYq8elq+Cb n1dSqRBQWZKRn8fVYc/MygAKBljYCDIFiTDMT+9seu836Q+bevyHTJ0dzPNuvCjn ZpgrwX38z58rJsfYDhwOSS4SkN/d6vUAAA== =s6sY -----END PGP MESSAGE----- ") ;; A PGP 2 style message. (define msg_sl_asc " -----BEGIN PGP MESSAGE----- iD8DBQBEDFJaLXJ8x2hpdzQRAkeCAKCZRBk2Pmx4w9h2LgosS0AppNNaWwCgiI5M yzgJpGTZtA/Jbk+/HP9ceOWtAQdiA21zZ0QMUlpJIHRoaW5rIHRoYXQgYWxsIHJp Z2h0LXRoaW5raW5nIHBlb3BsZSBpbiB0aGlzIGNvdW50cnkgYXJlIHNpY2sgYW5k CnRpcmVkIG9mIGJlaW5nIHRvbGQgdGhhdCBvcmRpbmFyeSBkZWNlbnQgcGVvcGxl IGFyZSBmZWQgdXAgaW4gdGhpcwpjb3VudHJ5IHdpdGggYmVpbmcgc2ljayBhbmQg dGlyZWQuICBJJ20gY2VydGFpbmx5IG5vdC4gIEJ1dCBJJ20Kc2ljayBhbmQgdGly ZWQgb2YgYmVpbmcgdG9sZCB0aGF0IEkgYW0uCi0gTW9udHkgUHl0aG9uCg== =0ukK -----END PGP MESSAGE----- ") ;; An OpenPGP message lacking the onepass packet. We used to accept ;; such messages but now consider them invalid. (define bad_ls_asc " -----BEGIN PGP MESSAGE----- rQEHYgNtc2dEDFJaSSB0aGluayB0aGF0IGFsbCByaWdodC10aGlua2luZyBwZW9w bGUgaW4gdGhpcyBjb3VudHJ5IGFyZSBzaWNrIGFuZAp0aXJlZCBvZiBiZWluZyB0 b2xkIHRoYXQgb3JkaW5hcnkgZGVjZW50IHBlb3BsZSBhcmUgZmVkIHVwIGluIHRo aXMKY291bnRyeSB3aXRoIGJlaW5nIHNpY2sgYW5kIHRpcmVkLiAgSSdtIGNlcnRh aW5seSBub3QuICBCdXQgSSdtCnNpY2sgYW5kIHRpcmVkIG9mIGJlaW5nIHRvbGQg dGhhdCBJIGFtLgotIE1vbnR5IFB5dGhvbgqIPwMFAEQMUlotcnzHaGl3NBECR4IA oJlEGTY+bHjD2HYuCixLQCmk01pbAKCIjkzLOAmkZNm0D8luT78c/1x45Q== =Mpiu -----END PGP MESSAGE----- ") ;; A signed message prefixed with an unsigned literal packet. ;; (fols = faked-literal-data, one-pass, literal-data, signature) ;; This should throw an error because running gpg to extract the ;; signed data will return both literal data packets (define bad_fols_asc " -----BEGIN PGP MESSAGE----- rF1iDG1zZy51bnNpZ25lZEQMY0x0aW1lc2hhcmluZywgbjoKCUFuIGFjY2VzcyBt ZXRob2Qgd2hlcmVieSBvbmUgY29tcHV0ZXIgYWJ1c2VzIG1hbnkgcGVvcGxlLgqQ DQMAAhEtcnzHaGl3NAGtAQdiA21zZ0QMUlpJIHRoaW5rIHRoYXQgYWxsIHJpZ2h0 LXRoaW5raW5nIHBlb3BsZSBpbiB0aGlzIGNvdW50cnkgYXJlIHNpY2sgYW5kCnRp cmVkIG9mIGJlaW5nIHRvbGQgdGhhdCBvcmRpbmFyeSBkZWNlbnQgcGVvcGxlIGFy ZSBmZWQgdXAgaW4gdGhpcwpjb3VudHJ5IHdpdGggYmVpbmcgc2ljayBhbmQgdGly ZWQuICBJJ20gY2VydGFpbmx5IG5vdC4gIEJ1dCBJJ20Kc2ljayBhbmQgdGlyZWQg b2YgYmVpbmcgdG9sZCB0aGF0IEkgYW0uCi0gTW9udHkgUHl0aG9uCog/AwUARAxS Wi1yfMdoaXc0EQJHggCgmUQZNj5seMPYdi4KLEtAKaTTWlsAoIiOTMs4CaRk2bQP yW5Pvxz/XHjl =UNM4 -----END PGP MESSAGE----- ") ;; A signed message suffixed with an unsigned literal packet. ;; (fols = faked-literal-data, one-pass, literal-data, signature) ;; This should throw an error because running gpg to extract the ;; signed data will return both literal data packets (define bad_olsf_asc " -----BEGIN PGP MESSAGE----- kA0DAAIRLXJ8x2hpdzQBrQEHYgNtc2dEDFJaSSB0aGluayB0aGF0IGFsbCByaWdo dC10aGlua2luZyBwZW9wbGUgaW4gdGhpcyBjb3VudHJ5IGFyZSBzaWNrIGFuZAp0 aXJlZCBvZiBiZWluZyB0b2xkIHRoYXQgb3JkaW5hcnkgZGVjZW50IHBlb3BsZSBh cmUgZmVkIHVwIGluIHRoaXMKY291bnRyeSB3aXRoIGJlaW5nIHNpY2sgYW5kIHRp cmVkLiAgSSdtIGNlcnRhaW5seSBub3QuICBCdXQgSSdtCnNpY2sgYW5kIHRpcmVk IG9mIGJlaW5nIHRvbGQgdGhhdCBJIGFtLgotIE1vbnR5IFB5dGhvbgqIPwMFAEQM UlotcnzHaGl3NBECR4IAoJlEGTY+bHjD2HYuCixLQCmk01pbAKCIjkzLOAmkZNm0 D8luT78c/1x45axdYgxtc2cudW5zaWduZWREDGNMdGltZXNoYXJpbmcsIG46CglB biBhY2Nlc3MgbWV0aG9kIHdoZXJlYnkgb25lIGNvbXB1dGVyIGFidXNlcyBtYW55 IHBlb3BsZS4K =3gnG -----END PGP MESSAGE----- ") ;; Two standard signed messages in a row (define msg_olsols_asc_multiple " -----BEGIN PGP MESSAGE----- kA0DAAIRLXJ8x2hpdzQBrQEHYgNtc2dEDFJaSSB0aGluayB0aGF0IGFsbCByaWdo dC10aGlua2luZyBwZW9wbGUgaW4gdGhpcyBjb3VudHJ5IGFyZSBzaWNrIGFuZAp0 aXJlZCBvZiBiZWluZyB0b2xkIHRoYXQgb3JkaW5hcnkgZGVjZW50IHBlb3BsZSBh cmUgZmVkIHVwIGluIHRoaXMKY291bnRyeSB3aXRoIGJlaW5nIHNpY2sgYW5kIHRp cmVkLiAgSSdtIGNlcnRhaW5seSBub3QuICBCdXQgSSdtCnNpY2sgYW5kIHRpcmVk IG9mIGJlaW5nIHRvbGQgdGhhdCBJIGFtLgotIE1vbnR5IFB5dGhvbgqIPwMFAEQM UlotcnzHaGl3NBECR4IAoJlEGTY+bHjD2HYuCixLQCmk01pbAKCIjkzLOAmkZNm0 D8luT78c/1x45ZANAwACES1yfMdoaXc0Aa0BB2IDbXNnRAxSWkkgdGhpbmsgdGhh dCBhbGwgcmlnaHQtdGhpbmtpbmcgcGVvcGxlIGluIHRoaXMgY291bnRyeSBhcmUg c2ljayBhbmQKdGlyZWQgb2YgYmVpbmcgdG9sZCB0aGF0IG9yZGluYXJ5IGRlY2Vu dCBwZW9wbGUgYXJlIGZlZCB1cCBpbiB0aGlzCmNvdW50cnkgd2l0aCBiZWluZyBz aWNrIGFuZCB0aXJlZC4gIEknbSBjZXJ0YWlubHkgbm90LiAgQnV0IEknbQpzaWNr IGFuZCB0aXJlZCBvZiBiZWluZyB0b2xkIHRoYXQgSSBhbS4KLSBNb250eSBQeXRo b24KiD8DBQBEDFJaLXJ8x2hpdzQRAkeCAKCZRBk2Pmx4w9h2LgosS0AppNNaWwCg iI5MyzgJpGTZtA/Jbk+/HP9ceOU= =8nLN -----END PGP MESSAGE----- ") ;; A standard message with two signatures (actually the same signature ;; duplicated). (define msg_oolss_asc " -----BEGIN PGP MESSAGE----- kA0DAAIRLXJ8x2hpdzQBkA0DAAIRLXJ8x2hpdzQBrQEHYgNtc2dEDFJaSSB0aGlu ayB0aGF0IGFsbCByaWdodC10aGlua2luZyBwZW9wbGUgaW4gdGhpcyBjb3VudHJ5 IGFyZSBzaWNrIGFuZAp0aXJlZCBvZiBiZWluZyB0b2xkIHRoYXQgb3JkaW5hcnkg ZGVjZW50IHBlb3BsZSBhcmUgZmVkIHVwIGluIHRoaXMKY291bnRyeSB3aXRoIGJl aW5nIHNpY2sgYW5kIHRpcmVkLiAgSSdtIGNlcnRhaW5seSBub3QuICBCdXQgSSdt CnNpY2sgYW5kIHRpcmVkIG9mIGJlaW5nIHRvbGQgdGhhdCBJIGFtLgotIE1vbnR5 IFB5dGhvbgqIPwMFAEQMUlotcnzHaGl3NBECR4IAoJlEGTY+bHjD2HYuCixLQCmk 01pbAKCIjkzLOAmkZNm0D8luT78c/1x45Yg/AwUARAxSWi1yfMdoaXc0EQJHggCg mUQZNj5seMPYdi4KLEtAKaTTWlsAoIiOTMs4CaRk2bQPyW5Pvxz/XHjl =KVw5 -----END PGP MESSAGE----- ") ;; A standard message with two one-pass packet but only one signature ;; packet (define bad_ools_asc " -----BEGIN PGP MESSAGE----- kA0DAAIRLXJ8x2hpdzQBkA0DAAIRLXJ8x2hpdzQBrQEHYgNtc2dEDFJaSSB0aGlu ayB0aGF0IGFsbCByaWdodC10aGlua2luZyBwZW9wbGUgaW4gdGhpcyBjb3VudHJ5 IGFyZSBzaWNrIGFuZAp0aXJlZCBvZiBiZWluZyB0b2xkIHRoYXQgb3JkaW5hcnkg ZGVjZW50IHBlb3BsZSBhcmUgZmVkIHVwIGluIHRoaXMKY291bnRyeSB3aXRoIGJl aW5nIHNpY2sgYW5kIHRpcmVkLiAgSSdtIGNlcnRhaW5seSBub3QuICBCdXQgSSdt CnNpY2sgYW5kIHRpcmVkIG9mIGJlaW5nIHRvbGQgdGhhdCBJIGFtLgotIE1vbnR5 IFB5dGhvbgqIPwMFAEQMUlotcnzHaGl3NBECR4IAoJlEGTY+bHjD2HYuCixLQCmk 01pbAKCIjkzLOAmkZNm0D8luT78c/1x45Q== =1/ix -----END PGP MESSAGE----- ") ;; Standard cleartext signature (define msg_cls_asc " -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 I think that all right-thinking people in this country are sick and tired of being told that ordinary decent people are fed up in this country with being sick and tired. I'm certainly not. But I'm sick and tired of being told that I am. - - Monty Python -----BEGIN PGP SIGNATURE----- iD8DBQFEDVp1LXJ8x2hpdzQRAplUAKCMfpG3GPw/TLN52tosgXP5lNECkwCfQhAa emmev7IuQjWYrGF9Lxj+zj8= =qJsY -----END PGP SIGNATURE----- ") ;; Cleartext signature with two signatures (define msg_clss_asc " -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 What is the difference between a Turing machine and the modern computer? It's the same as that between Hillary's ascent of Everest and the establishment of a Hilton on its peak. -----BEGIN PGP SIGNATURE----- iD8DBQFEDVz6LXJ8x2hpdzQRAtkGAKCeMhNbHnh339fpjNj9owsYcC4zBwCfYO5l 2u+KEfXX0FKyk8SMzLjZ536IPwMFAUQNXPr+GAsdqeOwshEC2QYAoPOWAiQm0EF/ FWIAQUplk7JWbyRKAJ92ZJyJpWfzb0yc1s7MY65r2qEHrg== =1Xvv -----END PGP SIGNATURE----- ") ;; Two clear text signatures in a row (define msg_clsclss_asc_multiple (string-append msg_cls_asc msg_clss_asc)) ;; An Ed25519 cleartext message with an R parameter of only 247 bits ;; so that the code to re-insert the stripped zero byte kicks in. The ;; S parameter has 253 bits but that does not strip a full byte. ;; ;; Note that the message has a typo ("the the"), but this should not ;; be fixed because it breaks this test. (define msg_ed25519_rshort " -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 Dear Emily: I'm still confused as to what groups articles should be posted to. How about an example? -- Still Confused Dear Still: Ok. Let's say you want to report that Gretzky has been traded from the Oilers to the Kings. Now right away you might think rec.sport.hockey would be enough. WRONG. Many more people might be interested. This is a big trade! Since it's a NEWS article, it belongs in the news.* hierarchy as well. If you are a news admin, or there is one on your machine, try news.admin. If not, use news.misc. The Oilers are probably interested in geology, so try sci.physics. He is a big star, so post to sci.astro, and sci.space because they are also interested in stars. Next, his name is Polish sounding. So post to soc.culture.polish. But that group doesn't exist, so cross-post to news.groups suggesting it should be created. With this many groups of interest, your article will be quite bizarre, so post to talk.bizarre as well. (And post to comp.std.mumps, since they hardly get any articles there, and a \"comp\" group will propagate your article further.) You may also find it is more fun to post the article once in each group. If you list all the newsgroups in the same article, some newsreaders will only show the the article to the reader once! Don't tolerate this. -- Emily Postnews Answers Your Questions on Netiquette -----BEGIN PGP SIGNATURE----- iJEEARYIADoWIQSyHeq0+HX7PaQvHR0TlWNoKgINCgUCV772DhwccGF0cmljZS5s dW11bWJhQGV4YW1wbGUubmV0AAoJEBOVY2gqAg0KMAIA90EtUwAja0iJGpO91wyz GLh9pS5v495V0r94yU6uUyUA/RT/StyPWe1wbnEZuacZnLbUV6Yy/aTXCVAlxf0r TusO =vQ3f -----END PGP SIGNATURE----- ") ;; An Ed25519 cleartext message with an S parameter of only 248 bits ;; so that the code to re-insert the stripped zero byte kicks in. (define msg_ed25519_sshort " -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 All articles that coruscate with resplendence are not truly auriferous. -----BEGIN PGP SIGNATURE----- iJEEARYIADoWIQSyHeq0+HX7PaQvHR0TlWNoKgINCgUCV771QhwccGF0cmljZS5s dW11bWJhQGV4YW1wbGUubmV0AAoJEBOVY2gqAg0KHVEBAI66OPDYXKWO3r6SaFT+ uxmh8x4ZerW41vMA9gkJ4AEKAPjoe/Z7fDqo1lCptIFutFAGbfNxcm/53prfx2fT GisM =L7sk -----END PGP SIGNATURE----- ") - - - -;; Fixme: We need more tests with manipulated cleartext signatures. - -;; -;; Now run the tests. -;; -(for-each-p - "Checking that a valid signature is verified as such" - (lambda (armored-file) - (pipe:do - (pipe:echo (eval armored-file (current-environment))) - (pipe:spawn `(,@GPG --verify)))) - '(msg_ols_asc msg_cols_asc msg_sl_asc msg_oolss_asc msg_cls_asc msg_clss_asc)) - -(for-each-p - "Checking that a valid signature over multiple messages is verified as such" - (lambda (armored-file) - (pipe:do - (pipe:echo (eval armored-file (current-environment))) - (pipe:spawn `(,@GPG --verify --allow-multiple-messages))) - (catch '() - (pipe:do - (pipe:defer (lambda (sink) - (display armored-file (fdopen sink "w")))) - (pipe:spawn `(,@GPG --verify))) - (fail "verification succeeded but should not"))) - '(msg_olsols_asc_multiple msg_clsclss_asc_multiple)) - -(for-each-p - "Checking that an invalid signature is verified as such" - (lambda (armored-file) - (catch '() - (pipe:do - (pipe:echo (eval armored-file (current-environment))) - (pipe:spawn `(,@GPG --verify))) - (fail "verification succeeded but should not"))) - '(bad_ls_asc bad_fols_asc bad_olsf_asc bad_ools_asc)) - - -;;; Need to import the ed25519 sample key used for -;;; the next two tests. -(call-check `(,@GPG --quiet --yes --import ,(in-srcdir "tests" "openpgp" key-file2))) -(for-each-p - "Checking that a valid Ed25519 signature is verified as such" - (lambda (armored-file) - (pipe:do - (pipe:echo (eval armored-file (current-environment))) - (pipe:spawn `(,@GPG --verify)))) - '(msg_ed25519_rshort msg_ed25519_sshort)) diff --git a/tests/openpgp/verify.scm b/tests/openpgp/verify.scm index cb6eb59e4..b4dd49b76 100755 --- a/tests/openpgp/verify.scm +++ b/tests/openpgp/verify.scm @@ -1,353 +1,87 @@ #!/usr/bin/env gpgscm ;; Copyright (C) 2016 g10 Code GmbH ;; ;; This file is part of GnuPG. ;; ;; GnuPG is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 3 of the License, or ;; (at your option) any later version. ;; ;; GnuPG is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with this program; if not, see . (load (in-srcdir "tests" "openpgp" "defs.scm")) +(load (in-srcdir "tests" "openpgp" "signed-messages.scm")) (setup-legacy-environment) ;; ;; Two simple tests to check that verify fails for bad input data ;; (for-each-p "Checking bogus signature" (lambda (char) (lettmp (x) (call-with-binary-output-file x (lambda (port) (display (make-string 64 (integer->char (string->number char))) port))) (if (= 0 (call `(,@GPG --verify ,x data-500))) (fail "no error code from verify")))) '("#x2d" "#xca")) -;; A plain signed message created using -;; echo abc | gpg --homedir . --passphrase-fd 0 -u Alpha -z0 -sa msg -(define msg_ols_asc " ------BEGIN PGP MESSAGE----- - -kA0DAAIRLXJ8x2hpdzQBrQEHYgNtc2dEDFJaSSB0aGluayB0aGF0IGFsbCByaWdo -dC10aGlua2luZyBwZW9wbGUgaW4gdGhpcyBjb3VudHJ5IGFyZSBzaWNrIGFuZAp0 -aXJlZCBvZiBiZWluZyB0b2xkIHRoYXQgb3JkaW5hcnkgZGVjZW50IHBlb3BsZSBh -cmUgZmVkIHVwIGluIHRoaXMKY291bnRyeSB3aXRoIGJlaW5nIHNpY2sgYW5kIHRp -cmVkLiAgSSdtIGNlcnRhaW5seSBub3QuICBCdXQgSSdtCnNpY2sgYW5kIHRpcmVk -IG9mIGJlaW5nIHRvbGQgdGhhdCBJIGFtLgotIE1vbnR5IFB5dGhvbgqIPwMFAEQM -UlotcnzHaGl3NBECR4IAoJlEGTY+bHjD2HYuCixLQCmk01pbAKCIjkzLOAmkZNm0 -D8luT78c/1x45Q== -=a29i ------END PGP MESSAGE----- -") - -;; A plain signed message created using -;; echo abc | gpg --homedir . --passphrase-fd 0 -u Alpha -sa msg -(define msg_cols_asc " ------BEGIN PGP MESSAGE----- - -owGbwMvMwCSoW1RzPCOz3IRxLSN7EnNucboLT6Cgp0JJRmZeNpBMLFFIzMlRKMpM -zyjRBQtm5qUrFKTmF+SkKmTmgdQVKyTnl+aVFFUqJBalKhRnJmcrJOalcJVkFqWm -KOSnKSSlgrSU5OekQMzLL0rJzEsEKk9JTU7NK4EZBtKcBtRRWgAzlwtmbnlmSQbU -GJjxCmDj9RQUPNVzFZJTi0oSM/NyKhXy8kuAYk6lJSBxLlTF2NziqZCYq8elq+Cb -n1dSqRBQWZKRn8fVYc/MygAKBljYCDIFiTDMT+9seu836Q+bevyHTJ0dzPNuvCjn -ZpgrwX38z58rJsfYDhwOSS4SkN/d6vUAAA== -=s6sY ------END PGP MESSAGE----- -") - -;; A PGP 2 style message. -(define msg_sl_asc " ------BEGIN PGP MESSAGE----- - -iD8DBQBEDFJaLXJ8x2hpdzQRAkeCAKCZRBk2Pmx4w9h2LgosS0AppNNaWwCgiI5M -yzgJpGTZtA/Jbk+/HP9ceOWtAQdiA21zZ0QMUlpJIHRoaW5rIHRoYXQgYWxsIHJp -Z2h0LXRoaW5raW5nIHBlb3BsZSBpbiB0aGlzIGNvdW50cnkgYXJlIHNpY2sgYW5k -CnRpcmVkIG9mIGJlaW5nIHRvbGQgdGhhdCBvcmRpbmFyeSBkZWNlbnQgcGVvcGxl -IGFyZSBmZWQgdXAgaW4gdGhpcwpjb3VudHJ5IHdpdGggYmVpbmcgc2ljayBhbmQg -dGlyZWQuICBJJ20gY2VydGFpbmx5IG5vdC4gIEJ1dCBJJ20Kc2ljayBhbmQgdGly -ZWQgb2YgYmVpbmcgdG9sZCB0aGF0IEkgYW0uCi0gTW9udHkgUHl0aG9uCg== -=0ukK ------END PGP MESSAGE----- -") - -;; An OpenPGP message lacking the onepass packet. We used to accept -;; such messages but now consider them invalid. -(define bad_ls_asc " ------BEGIN PGP MESSAGE----- - -rQEHYgNtc2dEDFJaSSB0aGluayB0aGF0IGFsbCByaWdodC10aGlua2luZyBwZW9w -bGUgaW4gdGhpcyBjb3VudHJ5IGFyZSBzaWNrIGFuZAp0aXJlZCBvZiBiZWluZyB0 -b2xkIHRoYXQgb3JkaW5hcnkgZGVjZW50IHBlb3BsZSBhcmUgZmVkIHVwIGluIHRo -aXMKY291bnRyeSB3aXRoIGJlaW5nIHNpY2sgYW5kIHRpcmVkLiAgSSdtIGNlcnRh -aW5seSBub3QuICBCdXQgSSdtCnNpY2sgYW5kIHRpcmVkIG9mIGJlaW5nIHRvbGQg -dGhhdCBJIGFtLgotIE1vbnR5IFB5dGhvbgqIPwMFAEQMUlotcnzHaGl3NBECR4IA -oJlEGTY+bHjD2HYuCixLQCmk01pbAKCIjkzLOAmkZNm0D8luT78c/1x45Q== -=Mpiu ------END PGP MESSAGE----- -") - - -;; A signed message prefixed with an unsigned literal packet. -;; (fols = faked-literal-data, one-pass, literal-data, signature) -;; This should throw an error because running gpg to extract the -;; signed data will return both literal data packets -(define bad_fols_asc " ------BEGIN PGP MESSAGE----- - -rF1iDG1zZy51bnNpZ25lZEQMY0x0aW1lc2hhcmluZywgbjoKCUFuIGFjY2VzcyBt -ZXRob2Qgd2hlcmVieSBvbmUgY29tcHV0ZXIgYWJ1c2VzIG1hbnkgcGVvcGxlLgqQ -DQMAAhEtcnzHaGl3NAGtAQdiA21zZ0QMUlpJIHRoaW5rIHRoYXQgYWxsIHJpZ2h0 -LXRoaW5raW5nIHBlb3BsZSBpbiB0aGlzIGNvdW50cnkgYXJlIHNpY2sgYW5kCnRp -cmVkIG9mIGJlaW5nIHRvbGQgdGhhdCBvcmRpbmFyeSBkZWNlbnQgcGVvcGxlIGFy -ZSBmZWQgdXAgaW4gdGhpcwpjb3VudHJ5IHdpdGggYmVpbmcgc2ljayBhbmQgdGly -ZWQuICBJJ20gY2VydGFpbmx5IG5vdC4gIEJ1dCBJJ20Kc2ljayBhbmQgdGlyZWQg -b2YgYmVpbmcgdG9sZCB0aGF0IEkgYW0uCi0gTW9udHkgUHl0aG9uCog/AwUARAxS -Wi1yfMdoaXc0EQJHggCgmUQZNj5seMPYdi4KLEtAKaTTWlsAoIiOTMs4CaRk2bQP -yW5Pvxz/XHjl -=UNM4 ------END PGP MESSAGE----- -") - -;; A signed message suffixed with an unsigned literal packet. -;; (fols = faked-literal-data, one-pass, literal-data, signature) -;; This should throw an error because running gpg to extract the -;; signed data will return both literal data packets -(define bad_olsf_asc " ------BEGIN PGP MESSAGE----- - -kA0DAAIRLXJ8x2hpdzQBrQEHYgNtc2dEDFJaSSB0aGluayB0aGF0IGFsbCByaWdo -dC10aGlua2luZyBwZW9wbGUgaW4gdGhpcyBjb3VudHJ5IGFyZSBzaWNrIGFuZAp0 -aXJlZCBvZiBiZWluZyB0b2xkIHRoYXQgb3JkaW5hcnkgZGVjZW50IHBlb3BsZSBh -cmUgZmVkIHVwIGluIHRoaXMKY291bnRyeSB3aXRoIGJlaW5nIHNpY2sgYW5kIHRp -cmVkLiAgSSdtIGNlcnRhaW5seSBub3QuICBCdXQgSSdtCnNpY2sgYW5kIHRpcmVk -IG9mIGJlaW5nIHRvbGQgdGhhdCBJIGFtLgotIE1vbnR5IFB5dGhvbgqIPwMFAEQM -UlotcnzHaGl3NBECR4IAoJlEGTY+bHjD2HYuCixLQCmk01pbAKCIjkzLOAmkZNm0 -D8luT78c/1x45axdYgxtc2cudW5zaWduZWREDGNMdGltZXNoYXJpbmcsIG46CglB -biBhY2Nlc3MgbWV0aG9kIHdoZXJlYnkgb25lIGNvbXB1dGVyIGFidXNlcyBtYW55 -IHBlb3BsZS4K -=3gnG ------END PGP MESSAGE----- -") - - -;; Two standard signed messages in a row -(define msg_olsols_asc_multiple " ------BEGIN PGP MESSAGE----- - -kA0DAAIRLXJ8x2hpdzQBrQEHYgNtc2dEDFJaSSB0aGluayB0aGF0IGFsbCByaWdo -dC10aGlua2luZyBwZW9wbGUgaW4gdGhpcyBjb3VudHJ5IGFyZSBzaWNrIGFuZAp0 -aXJlZCBvZiBiZWluZyB0b2xkIHRoYXQgb3JkaW5hcnkgZGVjZW50IHBlb3BsZSBh -cmUgZmVkIHVwIGluIHRoaXMKY291bnRyeSB3aXRoIGJlaW5nIHNpY2sgYW5kIHRp -cmVkLiAgSSdtIGNlcnRhaW5seSBub3QuICBCdXQgSSdtCnNpY2sgYW5kIHRpcmVk -IG9mIGJlaW5nIHRvbGQgdGhhdCBJIGFtLgotIE1vbnR5IFB5dGhvbgqIPwMFAEQM -UlotcnzHaGl3NBECR4IAoJlEGTY+bHjD2HYuCixLQCmk01pbAKCIjkzLOAmkZNm0 -D8luT78c/1x45ZANAwACES1yfMdoaXc0Aa0BB2IDbXNnRAxSWkkgdGhpbmsgdGhh -dCBhbGwgcmlnaHQtdGhpbmtpbmcgcGVvcGxlIGluIHRoaXMgY291bnRyeSBhcmUg -c2ljayBhbmQKdGlyZWQgb2YgYmVpbmcgdG9sZCB0aGF0IG9yZGluYXJ5IGRlY2Vu -dCBwZW9wbGUgYXJlIGZlZCB1cCBpbiB0aGlzCmNvdW50cnkgd2l0aCBiZWluZyBz -aWNrIGFuZCB0aXJlZC4gIEknbSBjZXJ0YWlubHkgbm90LiAgQnV0IEknbQpzaWNr -IGFuZCB0aXJlZCBvZiBiZWluZyB0b2xkIHRoYXQgSSBhbS4KLSBNb250eSBQeXRo -b24KiD8DBQBEDFJaLXJ8x2hpdzQRAkeCAKCZRBk2Pmx4w9h2LgosS0AppNNaWwCg -iI5MyzgJpGTZtA/Jbk+/HP9ceOU= -=8nLN ------END PGP MESSAGE----- -") - -;; A standard message with two signatures (actually the same signature -;; duplicated). -(define msg_oolss_asc " ------BEGIN PGP MESSAGE----- - -kA0DAAIRLXJ8x2hpdzQBkA0DAAIRLXJ8x2hpdzQBrQEHYgNtc2dEDFJaSSB0aGlu -ayB0aGF0IGFsbCByaWdodC10aGlua2luZyBwZW9wbGUgaW4gdGhpcyBjb3VudHJ5 -IGFyZSBzaWNrIGFuZAp0aXJlZCBvZiBiZWluZyB0b2xkIHRoYXQgb3JkaW5hcnkg -ZGVjZW50IHBlb3BsZSBhcmUgZmVkIHVwIGluIHRoaXMKY291bnRyeSB3aXRoIGJl -aW5nIHNpY2sgYW5kIHRpcmVkLiAgSSdtIGNlcnRhaW5seSBub3QuICBCdXQgSSdt -CnNpY2sgYW5kIHRpcmVkIG9mIGJlaW5nIHRvbGQgdGhhdCBJIGFtLgotIE1vbnR5 -IFB5dGhvbgqIPwMFAEQMUlotcnzHaGl3NBECR4IAoJlEGTY+bHjD2HYuCixLQCmk -01pbAKCIjkzLOAmkZNm0D8luT78c/1x45Yg/AwUARAxSWi1yfMdoaXc0EQJHggCg -mUQZNj5seMPYdi4KLEtAKaTTWlsAoIiOTMs4CaRk2bQPyW5Pvxz/XHjl -=KVw5 ------END PGP MESSAGE----- -") - -;; A standard message with two one-pass packet but only one signature -;; packet -(define bad_ools_asc " ------BEGIN PGP MESSAGE----- - -kA0DAAIRLXJ8x2hpdzQBkA0DAAIRLXJ8x2hpdzQBrQEHYgNtc2dEDFJaSSB0aGlu -ayB0aGF0IGFsbCByaWdodC10aGlua2luZyBwZW9wbGUgaW4gdGhpcyBjb3VudHJ5 -IGFyZSBzaWNrIGFuZAp0aXJlZCBvZiBiZWluZyB0b2xkIHRoYXQgb3JkaW5hcnkg -ZGVjZW50IHBlb3BsZSBhcmUgZmVkIHVwIGluIHRoaXMKY291bnRyeSB3aXRoIGJl -aW5nIHNpY2sgYW5kIHRpcmVkLiAgSSdtIGNlcnRhaW5seSBub3QuICBCdXQgSSdt -CnNpY2sgYW5kIHRpcmVkIG9mIGJlaW5nIHRvbGQgdGhhdCBJIGFtLgotIE1vbnR5 -IFB5dGhvbgqIPwMFAEQMUlotcnzHaGl3NBECR4IAoJlEGTY+bHjD2HYuCixLQCmk -01pbAKCIjkzLOAmkZNm0D8luT78c/1x45Q== -=1/ix ------END PGP MESSAGE----- -") - -;; Standard cleartext signature -(define msg_cls_asc " ------BEGIN PGP SIGNED MESSAGE----- -Hash: SHA1 - -I think that all right-thinking people in this country are sick and -tired of being told that ordinary decent people are fed up in this -country with being sick and tired. I'm certainly not. But I'm -sick and tired of being told that I am. -- - Monty Python ------BEGIN PGP SIGNATURE----- - -iD8DBQFEDVp1LXJ8x2hpdzQRAplUAKCMfpG3GPw/TLN52tosgXP5lNECkwCfQhAa -emmev7IuQjWYrGF9Lxj+zj8= -=qJsY ------END PGP SIGNATURE----- -") - -;; Cleartext signature with two signatures -(define msg_clss_asc " ------BEGIN PGP SIGNED MESSAGE----- -Hash: SHA1 - -What is the difference between a Turing machine and the modern computer? -It's the same as that between Hillary's ascent of Everest and the -establishment of a Hilton on its peak. ------BEGIN PGP SIGNATURE----- - -iD8DBQFEDVz6LXJ8x2hpdzQRAtkGAKCeMhNbHnh339fpjNj9owsYcC4zBwCfYO5l -2u+KEfXX0FKyk8SMzLjZ536IPwMFAUQNXPr+GAsdqeOwshEC2QYAoPOWAiQm0EF/ -FWIAQUplk7JWbyRKAJ92ZJyJpWfzb0yc1s7MY65r2qEHrg== -=1Xvv ------END PGP SIGNATURE----- -") - -;; Two clear text signatures in a row -(define msg_clsclss_asc_multiple (string-append msg_cls_asc msg_clss_asc)) - - -;; An Ed25519 cleartext message with an R parameter of only 247 bits -;; so that the code to re-insert the stripped zero byte kicks in. The -;; S parameter has 253 bits but that does not strip a full byte. -;; -;; Note that the message has a typo ("the the"), but this should not -;; be fixed because it breaks this test. -(define msg_ed25519_rshort " ------BEGIN PGP SIGNED MESSAGE----- -Hash: SHA256 - -Dear Emily: - I'm still confused as to what groups articles should be posted -to. How about an example? - -- Still Confused - -Dear Still: - Ok. Let's say you want to report that Gretzky has been traded from -the Oilers to the Kings. Now right away you might think rec.sport.hockey -would be enough. WRONG. Many more people might be interested. This is a -big trade! Since it's a NEWS article, it belongs in the news.* hierarchy -as well. If you are a news admin, or there is one on your machine, try -news.admin. If not, use news.misc. - The Oilers are probably interested in geology, so try sci.physics. -He is a big star, so post to sci.astro, and sci.space because they are also -interested in stars. Next, his name is Polish sounding. So post to -soc.culture.polish. But that group doesn't exist, so cross-post to -news.groups suggesting it should be created. With this many groups of -interest, your article will be quite bizarre, so post to talk.bizarre as -well. (And post to comp.std.mumps, since they hardly get any articles -there, and a \"comp\" group will propagate your article further.) - You may also find it is more fun to post the article once in each -group. If you list all the newsgroups in the same article, some newsreaders -will only show the the article to the reader once! Don't tolerate this. - -- Emily Postnews Answers Your Questions on Netiquette ------BEGIN PGP SIGNATURE----- - -iJEEARYIADoWIQSyHeq0+HX7PaQvHR0TlWNoKgINCgUCV772DhwccGF0cmljZS5s -dW11bWJhQGV4YW1wbGUubmV0AAoJEBOVY2gqAg0KMAIA90EtUwAja0iJGpO91wyz -GLh9pS5v495V0r94yU6uUyUA/RT/StyPWe1wbnEZuacZnLbUV6Yy/aTXCVAlxf0r -TusO -=vQ3f ------END PGP SIGNATURE----- -") - -;; An Ed25519 cleartext message with an S parameter of only 248 bits -;; so that the code to re-insert the stripped zero byte kicks in. -(define msg_ed25519_sshort " ------BEGIN PGP SIGNED MESSAGE----- -Hash: SHA256 - -All articles that coruscate with resplendence are not truly auriferous. ------BEGIN PGP SIGNATURE----- - -iJEEARYIADoWIQSyHeq0+HX7PaQvHR0TlWNoKgINCgUCV771QhwccGF0cmljZS5s -dW11bWJhQGV4YW1wbGUubmV0AAoJEBOVY2gqAg0KHVEBAI66OPDYXKWO3r6SaFT+ -uxmh8x4ZerW41vMA9gkJ4AEKAPjoe/Z7fDqo1lCptIFutFAGbfNxcm/53prfx2fT -GisM -=L7sk ------END PGP SIGNATURE----- -") - - - ;; Fixme: We need more tests with manipulated cleartext signatures. ;; ;; Now run the tests. ;; (for-each-p "Checking that a valid signature is verified as such" (lambda (armored-file) (pipe:do (pipe:echo (eval armored-file (current-environment))) (pipe:spawn `(,@GPG --verify)))) '(msg_ols_asc msg_cols_asc msg_sl_asc msg_oolss_asc msg_cls_asc msg_clss_asc)) (for-each-p "Checking that a valid signature over multiple messages is verified as such" (lambda (armored-file) (pipe:do (pipe:echo (eval armored-file (current-environment))) (pipe:spawn `(,@GPG --verify --allow-multiple-messages))) (catch '() (pipe:do (pipe:defer (lambda (sink) (display armored-file (fdopen sink "w")))) (pipe:spawn `(,@GPG --verify))) (fail "verification succeeded but should not"))) '(msg_olsols_asc_multiple msg_clsclss_asc_multiple)) (for-each-p "Checking that an invalid signature is verified as such" (lambda (armored-file) (catch '() (pipe:do (pipe:echo (eval armored-file (current-environment))) (pipe:spawn `(,@GPG --verify))) (fail "verification succeeded but should not"))) '(bad_ls_asc bad_fols_asc bad_olsf_asc bad_ools_asc)) ;;; Need to import the ed25519 sample key used for ;;; the next two tests. (call-check `(,@GPG --quiet --yes --import ,(in-srcdir "tests" "openpgp" key-file2))) (for-each-p "Checking that a valid Ed25519 signature is verified as such" (lambda (armored-file) (pipe:do (pipe:echo (eval armored-file (current-environment))) (pipe:spawn `(,@GPG --verify)))) '(msg_ed25519_rshort msg_ed25519_sshort))