mirror of
git://git.gnupg.org/gnupg.git
synced 2025-01-17 14:07:03 +01:00
tests/openpgp: Reimplement tests in Scheme.
* Makefile.am: Build the test infrastructure on Windows. * tests/openpgp/Makefile.am (required_pgms): Add gpgscm. (TESTS_ENVIRONMENT): Make sure gpgscm and the libraries are found. (TESTS): Replace tests with the new Scheme implementations. * tests/openpgp/4gb-packet.scm: New file. * tests/openpgp/README: Likewise. * tests/openpgp/armdetach.scm: Likewise. * tests/openpgp/armdetachm.scm: Likewise. * tests/openpgp/armencrypt.scm: Likewise. * tests/openpgp/armencryptp.scm: Likewise. * tests/openpgp/armor.scm: Likewise. * tests/openpgp/armsignencrypt.scm: Likewise. * tests/openpgp/armsigs.scm: Likewise. * tests/openpgp/clearsig.scm: Likewise. * tests/openpgp/conventional-mdc.scm: Likewise. * tests/openpgp/conventional.scm: Likewise. * tests/openpgp/decrypt-dsa.scm: Likewise. * tests/openpgp/decrypt.scm: Likewise. * tests/openpgp/default-key.scm: Likewise. * tests/openpgp/defs.scm: Likewise. * tests/openpgp/detach.scm: Likewise. * tests/openpgp/detachm.scm: Likewise. * tests/openpgp/ecc.scm: Likewise. * tests/openpgp/encrypt-dsa.scm: Likewise. * tests/openpgp/encrypt.scm: Likewise. * tests/openpgp/encryptp.scm: Likewise. * tests/openpgp/finish.scm: Likewise. * tests/openpgp/genkey1024.scm: Likewise. * tests/openpgp/gpgtar.scm: Likewise. * tests/openpgp/import.scm: Likewise. * tests/openpgp/mds.scm: Likewise. * tests/openpgp/multisig.scm: Likewise. * tests/openpgp/run-tests.scm: Likewise. * tests/openpgp/seat.scm: Likewise. * tests/openpgp/setup.scm: Likewise. * tests/openpgp/signencrypt-dsa.scm: Likewise. * tests/openpgp/signencrypt.scm: Likewise. * tests/openpgp/sigs-dsa.scm: Likewise. * tests/openpgp/sigs.scm: Likewise. * tests/openpgp/use-exact-key.scm: Likewise. * tests/openpgp/verify.scm: Likewise. * tests/openpgp/version.scm: Likewise. Signed-off-by: Justus Winter <justus@g10code.com>
This commit is contained in:
parent
e3e51316f1
commit
2f4ad05fcd
@ -92,7 +92,7 @@ endif
|
|||||||
if RUN_TESTS
|
if RUN_TESTS
|
||||||
tests = tests
|
tests = tests
|
||||||
else
|
else
|
||||||
tests =
|
tests = tests/gpgscm tests/openpgp
|
||||||
endif
|
endif
|
||||||
|
|
||||||
SUBDIRS = m4 common kbx \
|
SUBDIRS = m4 common kbx \
|
||||||
|
10
tests/openpgp/4gb-packet.scm
Executable file
10
tests/openpgp/4gb-packet.scm
Executable file
@ -0,0 +1,10 @@
|
|||||||
|
#!/usr/bin/env gpgscm
|
||||||
|
|
||||||
|
;; GnuPG through 2.1.7 would incorrect mark packets whose size is
|
||||||
|
;; 2^32-1 as invalid and exit with status code 2.
|
||||||
|
|
||||||
|
(load (with-path "defs.scm"))
|
||||||
|
|
||||||
|
(if (= 0 (call `(,@GPG --list-packets ,(in-srcdir "4gb-packet.asc"))))
|
||||||
|
(info "Can parse 4GB packets.")
|
||||||
|
(error "Failed to parse 4GB packet."))
|
@ -22,7 +22,8 @@
|
|||||||
# Programs required before we can run these tests.
|
# Programs required before we can run these tests.
|
||||||
required_pgms = ../../g10/gpg$(EXEEXT) ../../agent/gpg-agent$(EXEEXT) \
|
required_pgms = ../../g10/gpg$(EXEEXT) ../../agent/gpg-agent$(EXEEXT) \
|
||||||
../../tools/gpg-connect-agent$(EXEEXT) \
|
../../tools/gpg-connect-agent$(EXEEXT) \
|
||||||
../../tools/mk-tdata$(EXEEXT)
|
../../tools/mk-tdata$(EXEEXT) \
|
||||||
|
../gpgscm/gpgscm$(EXEEXT)
|
||||||
|
|
||||||
AM_CPPFLAGS = -I$(top_srcdir)/common
|
AM_CPPFLAGS = -I$(top_srcdir)/common
|
||||||
include $(top_srcdir)/am/cmacros.am
|
include $(top_srcdir)/am/cmacros.am
|
||||||
@ -33,7 +34,11 @@ noinst_PROGRAMS = fake-pinentry
|
|||||||
|
|
||||||
fake_pinentry_SOURCES = fake-pinentry.c
|
fake_pinentry_SOURCES = fake-pinentry.c
|
||||||
|
|
||||||
TESTS_ENVIRONMENT = GNUPGHOME=$(abs_builddir) GPG_AGENT_INFO= LC_ALL=C
|
TESTS_ENVIRONMENT = GNUPGHOME=$(abs_builddir) GPG_AGENT_INFO= LC_ALL=C \
|
||||||
|
EXEEXT=$(EXEEXT) \
|
||||||
|
PATH=../gpgscm:$(PATH) \
|
||||||
|
objdir=$(shell readlink -f ../..) \
|
||||||
|
GPGSCM_PATH=$(top_srcdir)/tests/gpgscm:$(top_srcdir)/tests/openpgp
|
||||||
|
|
||||||
if SQLITE3
|
if SQLITE3
|
||||||
sqlite3_dependent_tests = tofu.test
|
sqlite3_dependent_tests = tofu.test
|
||||||
@ -41,23 +46,44 @@ else
|
|||||||
sqlite3_dependent_tests =
|
sqlite3_dependent_tests =
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Note: version.test needs to be the first test to run and finish.test
|
# Note: setup.scm needs to be the first test to run and finish.scm
|
||||||
# the last one
|
# the last one
|
||||||
TESTS = version.test mds.test \
|
TESTS = setup.scm \
|
||||||
decrypt.test decrypt-dsa.test \
|
version.scm \
|
||||||
sigs.test sigs-dsa.test \
|
mds.scm \
|
||||||
encrypt.test encrypt-dsa.test \
|
decrypt.scm \
|
||||||
seat.test clearsig.test encryptp.test detach.test \
|
decrypt-dsa.scm \
|
||||||
armsigs.test armencrypt.test armencryptp.test \
|
sigs.scm \
|
||||||
signencrypt.test signencrypt-dsa.test \
|
sigs-dsa.scm \
|
||||||
armsignencrypt.test armdetach.test \
|
encrypt.scm \
|
||||||
armdetachm.test detachm.test genkey1024.test \
|
encrypt-dsa.scm \
|
||||||
conventional.test conventional-mdc.test \
|
seat.scm \
|
||||||
multisig.test verify.test armor.test \
|
clearsig.scm \
|
||||||
import.test ecc.test 4gb-packet.test \
|
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 \
|
||||||
|
armor.scm \
|
||||||
|
import.scm \
|
||||||
|
ecc.scm \
|
||||||
|
4gb-packet.scm \
|
||||||
$(sqlite3_dependent_tests) \
|
$(sqlite3_dependent_tests) \
|
||||||
gpgtar.test use-exact-key.test default-key.test \
|
gpgtar.scm \
|
||||||
finish.test
|
use-exact-key.scm \
|
||||||
|
default-key.scm \
|
||||||
|
finish.scm
|
||||||
|
|
||||||
|
|
||||||
TEST_FILES = pubring.asc secring.asc plain-1o.asc plain-2o.asc plain-3o.asc \
|
TEST_FILES = pubring.asc secring.asc plain-1o.asc plain-2o.asc plain-3o.asc \
|
||||||
|
160
tests/openpgp/README
Normal file
160
tests/openpgp/README
Normal file
@ -0,0 +1,160 @@
|
|||||||
|
Emacs, this is an -*- org -*- file.
|
||||||
|
|
||||||
|
* How to run the test suite
|
||||||
|
** using the legacy driver
|
||||||
|
On POSIX you can just use
|
||||||
|
|
||||||
|
$ make -C tests/openpgp check
|
||||||
|
|
||||||
|
or
|
||||||
|
|
||||||
|
$ make -C tests/openpgp check TESTS="setup.scm your-test.scm finish.scm"
|
||||||
|
|
||||||
|
as before.
|
||||||
|
** using the Scheme driver
|
||||||
|
This is a bit tricky because one needs to manually set some
|
||||||
|
environment variables. We should make that easier. See discussion
|
||||||
|
below. From your build directory, do:
|
||||||
|
|
||||||
|
obj $ srcdir=<path to>/tests/openpgp \
|
||||||
|
GPGSCM_PATH=<path to>/tests/gpgscm:<path to>/tests/openpgp \
|
||||||
|
$(pwd)/tests/gpgscm/gpgscm [gpgscm args] \
|
||||||
|
run-tests.scm [test suite runner args]
|
||||||
|
|
||||||
|
*** Arguments supported by the test suite runner
|
||||||
|
The test suite runner supports four modes of operation,
|
||||||
|
{sequential,parallel}x{isolated,shared}. You can select the mode of
|
||||||
|
operation using a combination of the flags --parallel, --sequential,
|
||||||
|
--shared, and --isolated.
|
||||||
|
|
||||||
|
By default the tests are run in sequential order, each one in a clean
|
||||||
|
environment.
|
||||||
|
|
||||||
|
You can specify the tests to run as positional arguments relative to
|
||||||
|
srcdir (e.g. just 'version.scm'). By default all tests listed in
|
||||||
|
run-tests.scm are executed. Note that you do not have to specify
|
||||||
|
setup.scm and finish.scm, they are executed implicitly.
|
||||||
|
|
||||||
|
The test suite runner can be executed in any location that the current
|
||||||
|
user can write to. It will create temporary files and directories,
|
||||||
|
but will in general clean up all of them.
|
||||||
|
*** Discussion of the various environment variables
|
||||||
|
**** srcdir
|
||||||
|
Must be set to the source of the openpgp test suite. Used to locate
|
||||||
|
data files.
|
||||||
|
**** GPGSCM_PATH
|
||||||
|
Used to locate the Scheme library as well as code used by the test
|
||||||
|
suite.
|
||||||
|
**** BIN_PREFIX
|
||||||
|
The test suite does not hardcode any paths to tools. If set it is
|
||||||
|
used to locate the tools to test, otherwise the test suite assumes to
|
||||||
|
be run from the build directory.
|
||||||
|
**** MKTDATA and GPG_PRESET_PASSPHRASE
|
||||||
|
These two tools are not installed by 'make install', hence we need to
|
||||||
|
explicitly override their position. In fact, the location of any tool
|
||||||
|
used by the test suite can be overridden this way. See defs.scm.
|
||||||
|
**** argv[0]
|
||||||
|
run-tests.scm depends on being able to re-exec gpgscm. It uses
|
||||||
|
argv[0] for that. Therefore you must use an absolute path to invoke
|
||||||
|
gpgscm.
|
||||||
|
* How to write tests
|
||||||
|
gpgscm provides a number of functions to aid you in writing tests, as
|
||||||
|
well as bindings to process management abstractions provided by GnuPG.
|
||||||
|
For the Scheme environment provided by TinySCHEME, see the TinySCHEME
|
||||||
|
manual that is included in tests/gpgscm/Manual.txt.
|
||||||
|
|
||||||
|
For a quick start, please have a look at various tests that are
|
||||||
|
already implemented, e.g. 'encrypt.scm'.
|
||||||
|
** The test framework
|
||||||
|
The functions info, error, and skip display their first argument and
|
||||||
|
flush the output buffers. error and skip will also terminate the
|
||||||
|
process, signaling that the test failed or should be skipped.
|
||||||
|
|
||||||
|
(for-each-p msg proc list) will display msg, and call proc with each
|
||||||
|
element of list while displaying the progress appropriately.
|
||||||
|
for-each-p' is similar, but accepts another callback before the 'list'
|
||||||
|
argument to format each item. for-each-p can be safely nested, and
|
||||||
|
the inner progress indicator will be abbreviated using '.'.
|
||||||
|
** Temporary files
|
||||||
|
(lettmp <bindings> <body>) will create and delete temporary files that
|
||||||
|
you can use in <body>. (with-temporary-working-directory <body>) will
|
||||||
|
create a temporary director, change to that, and clean it up after
|
||||||
|
executing <body>).
|
||||||
|
|
||||||
|
make-temporary-file will create a temporary file. You can optionally
|
||||||
|
provide an argument to that function that will serve as tag so you can
|
||||||
|
distinguish the files for debugging. remove-temporary-file will
|
||||||
|
delete a file created using make-temporary-file.
|
||||||
|
|
||||||
|
** Monadic transformer and pipe support
|
||||||
|
Tests often perform sequential transformations on files, or connect
|
||||||
|
processes using pipes. To aid you in this, the test framework
|
||||||
|
provides two monadic data structures.
|
||||||
|
|
||||||
|
(Currently, the implementation mashes the 'bind' operation together
|
||||||
|
with the application of the monad. Also, there is no 'return'
|
||||||
|
operation. I guess all of that could be implemented on top of
|
||||||
|
call/cc, but it isn't at the moment.)
|
||||||
|
*** pipe
|
||||||
|
The pipe monad constructs pipe lines. It consists of a function
|
||||||
|
pipe:do that binds the functions together and manages the execution of
|
||||||
|
the child processes, a family of functions that act as sources, a
|
||||||
|
function to spawn processes, and a family of functions acting as
|
||||||
|
sinks.
|
||||||
|
|
||||||
|
Sources are pipe:open, pipe:defer, pipe:echo. To spawn a process use
|
||||||
|
pipe:spawn, or the convenience function pipe:gpg. To sink the data
|
||||||
|
use pipe:splice, or pipe:write-to.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
(pipe:do
|
||||||
|
(pipe:echo "3\n1\n2\n")
|
||||||
|
(pipe:spawn '("/usr/bin/sort"))
|
||||||
|
(pipe:write-to "sorted" (logior O_WRONLY O_CREAT) #o600))
|
||||||
|
|
||||||
|
Caveats: Due to the single-threaded nature of gpgscm you cannot use
|
||||||
|
both a source and sink that is implemented in Scheme. pipe:defer and
|
||||||
|
pipe:echo are executing in gpgscm, and so does pipe:splice.
|
||||||
|
*** tr
|
||||||
|
The transformer monad describes sequential file transformations.
|
||||||
|
|
||||||
|
There is one source function, tr:open. To describe a transformation
|
||||||
|
using some process, use tr:spawn, tr:gpg, or tr:pipe-do. There are
|
||||||
|
several sinks, although sink is not quite the right term, because the
|
||||||
|
data is not consumed, and hence one can use them at any position. The
|
||||||
|
"sinks" are tr:write-to, tr:call-with-content, tr:assert-identity, and
|
||||||
|
tr:assert-weak-identity.
|
||||||
|
|
||||||
|
A somewhat contrived example demonstrating many functions is:
|
||||||
|
|
||||||
|
(tr:do
|
||||||
|
(tr:pipe-do
|
||||||
|
(pipe:echo "3\n1\n2\n")
|
||||||
|
(pipe:spawn '("/usr/bin/sort")))
|
||||||
|
(tr:write-to "reference")
|
||||||
|
(tr:call-with-content
|
||||||
|
(lambda (c)
|
||||||
|
(echo "currently, c contains" (string-length c) "bytes")))
|
||||||
|
(tr:spawn "" '("/usr/bin/gcc" -x c "-E" -o **out** **in**))
|
||||||
|
(tr:pipe-do
|
||||||
|
(pipe:spawn '("/bin/grep" -v "#")))
|
||||||
|
(tr:assert-identity "reference"))
|
||||||
|
|
||||||
|
Caveats: As a convenience, gpgscm allows one to specify command line
|
||||||
|
arguments as Scheme symbols. Scheme symbols, however, are
|
||||||
|
case-insensitive, and get converted to lower case. Therefore, the -E
|
||||||
|
argument must be given as a string in the example above. Similarly,
|
||||||
|
you need to quote numerical values.
|
||||||
|
** Process management
|
||||||
|
If you just need to execute a single command, there is (call-with-fds
|
||||||
|
cmdline infd outfd errfd) which executes cmdline with the given file
|
||||||
|
descriptors bound to it, and waits for its completion returning the
|
||||||
|
status code. There is (call cmdline) which is similar, but calls the
|
||||||
|
command with a closed stdin, connecting stdout and stderr to stderr if
|
||||||
|
gpgscm is executed with --verbose. (call-check cmdline) raises an
|
||||||
|
exception if the command does not return 0.
|
||||||
|
|
||||||
|
(call-popen cmdline input) calls a command, writes input to its stdin,
|
||||||
|
and returns any output from stdout, or raises an exception containing
|
||||||
|
stderr on failure.
|
14
tests/openpgp/armdetach.scm
Executable file
14
tests/openpgp/armdetach.scm
Executable file
@ -0,0 +1,14 @@
|
|||||||
|
#!/usr/bin/env gpgscm
|
||||||
|
|
||||||
|
(load (with-path "defs.scm"))
|
||||||
|
|
||||||
|
(for-each-p
|
||||||
|
"Checking armored detached signatures"
|
||||||
|
(lambda (source)
|
||||||
|
(lettmp (tmp)
|
||||||
|
(call-popen `(,@GPG --yes --passphrase-fd "0" -sab
|
||||||
|
--output ,tmp ,source ) usrpass1)
|
||||||
|
(pipe:do
|
||||||
|
(pipe:open source (logior O_RDONLY O_BINARY))
|
||||||
|
(pipe:spawn `(,@GPG --yes ,tmp)))))
|
||||||
|
(append plain-files data-files))
|
18
tests/openpgp/armdetachm.scm
Executable file
18
tests/openpgp/armdetachm.scm
Executable file
@ -0,0 +1,18 @@
|
|||||||
|
#!/usr/bin/env gpgscm
|
||||||
|
|
||||||
|
(load (with-path "defs.scm"))
|
||||||
|
|
||||||
|
(define files (append plain-files data-files))
|
||||||
|
|
||||||
|
(info "Checking armored detached signatures of multiple files")
|
||||||
|
(lettmp (tmp)
|
||||||
|
(call-popen `(,@GPG --yes --passphrase-fd "0" -sab
|
||||||
|
--output ,tmp ,@files) usrpass1)
|
||||||
|
(pipe:do
|
||||||
|
(pipe:defer (lambda (sink)
|
||||||
|
(for-each (lambda (file)
|
||||||
|
(pipe:do
|
||||||
|
(pipe:open file (logior O_RDONLY O_BINARY))
|
||||||
|
(pipe:splice sink)))
|
||||||
|
files)))
|
||||||
|
(pipe:spawn `(,@GPG --yes ,tmp))))
|
13
tests/openpgp/armencrypt.scm
Executable file
13
tests/openpgp/armencrypt.scm
Executable file
@ -0,0 +1,13 @@
|
|||||||
|
#!/usr/bin/env gpgscm
|
||||||
|
|
||||||
|
(load (with-path "defs.scm"))
|
||||||
|
|
||||||
|
(for-each-p
|
||||||
|
"Checking armored encryption"
|
||||||
|
(lambda (source)
|
||||||
|
(tr:do
|
||||||
|
(tr:open source)
|
||||||
|
(tr:gpg usrpass1 `(--yes --passphrase-fd "0" -ea --recipient ,usrname2))
|
||||||
|
(tr:gpg "" '(--yes))
|
||||||
|
(tr:assert-identity source)))
|
||||||
|
(append plain-files data-files))
|
14
tests/openpgp/armencryptp.scm
Executable file
14
tests/openpgp/armencryptp.scm
Executable file
@ -0,0 +1,14 @@
|
|||||||
|
#!/usr/bin/env gpgscm
|
||||||
|
|
||||||
|
(load (with-path "defs.scm"))
|
||||||
|
|
||||||
|
(for-each-p
|
||||||
|
"Checking armored encryption and decryption using pipes"
|
||||||
|
(lambda (source)
|
||||||
|
(tr:do
|
||||||
|
(tr:open source)
|
||||||
|
(tr:pipe-do
|
||||||
|
(pipe:gpg `(--yes -ea --recipient ,usrname2))
|
||||||
|
(pipe:gpg '(--yes)))
|
||||||
|
(tr:assert-identity source)))
|
||||||
|
(append plain-files data-files))
|
749
tests/openpgp/armor.scm
Executable file
749
tests/openpgp/armor.scm
Executable file
@ -0,0 +1,749 @@
|
|||||||
|
#!/usr/bin/env gpgscm
|
||||||
|
|
||||||
|
(load (with-path "defs.scm"))
|
||||||
|
|
||||||
|
(define armored_key_8192 "-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||||
|
Version: SKS 1.0.9
|
||||||
|
|
||||||
|
mQGiBDnKLQkRBACVlYh6HivoRjHzGedNpnYPISxImK3eFgt+qs/DD9rqhBOSUTYvmKfa1u7M
|
||||||
|
W4XDc23YEoq3MyhtC35IL2RH6rmeIPz7ZVK5rUKWMqzf94n58gIkgdDZgCcaDWImtZFSjji4
|
||||||
|
TGhepaIz75iIbymvtnjr9d++fH/lFkz0HDjbOkXCfwCg9GeOjiWw1yBK8cO11acAjk+QpW8D
|
||||||
|
/i8ftC1hV0iuh9mswYeG05pBbeeaOW4I2Ps4IcecpXhSyPaP1YiXKRqg9GX2brNgXwc3MEiq
|
||||||
|
Wn4UU407RzjrUNF4/d20Q7N2g2MDUDzBtmMytfT2LLKlj53Cq+p510yXESA7UHjiOpRrHPN9
|
||||||
|
R69wHmHPsLPkdkB/jRTSM1gzQNtXA/96bRpfGMtCssfB449gBA/kYF14iXUM5KTF6YPSFhCC
|
||||||
|
xPGNMoP1uxTk0NHvcYZe4zW2O6b/f9x5Lh15RI1ozWXakX6u3xEV3OqsvVTtXupe4MljHQlX
|
||||||
|
YwMDI3MUzFtnHR+He1Bw5lkBVWtkV7rX2kX749J1EgADwlNEP1KFRdjqi7QhU3VzdW11IE9T
|
||||||
|
QVdBIDxzdXN1bXVvQGRlYmlhbi5vcmc+iEYEEBECAAYFAjvNYPUACgkQU+WZW1FVMwrlTACf
|
||||||
|
RigokAWd1OqYtcOt3v829fhNqYEAnR9uUslZr6B6RaW0z8/BZZuhGuLViEYEEBECAAYFAjzG
|
||||||
|
evgACgkQfGUzr9MtPXGWyACg066aP5SSkBHWqqYGGLZv9sVRMNIAoIEHBI1gq4rPJatYDdau
|
||||||
|
Ni6DUTkGiEYEEBECAAYFAjzGfBAACgkQ9D5yZjzIjAlTqACeJmtp9kpfljkARhfa3QTc2Q56
|
||||||
|
WKkAoJmUchp+fAceVeFncpFeo6leM1YhiEYEEBECAAYFAjzGftIACgkQ2QCnNZ2xmQQCegCg
|
||||||
|
rdTsTWzaZk6gF+mtvIDwKsUx8gwAnRUbdDfOP0qL+83Bbz2r/IzPxjCEiEYEEBECAAYFAj2T
|
||||||
|
Rd0ACgkQFwU5DuZsm7BfXQCeNVG09VZ2VnuuWTRbgoANXGIyRb0AoI/giUU4DcIpAPbcoNV7
|
||||||
|
PzCIreyviEYEExECAAYFAj2508wACgkQ0pu//EQuY8KiUwCdHijK7Wkim2FUPU6i6KxwRH/k
|
||||||
|
kFwAn1sOAWVOrLfRBfrNNQBANpbr5ufniEYEExECAAYFAj27vpsACgkQKb5dImj9VJ9m2wCc
|
||||||
|
DeL9IkWpytXLPFhKCH9U9XhzPA4AnRjiY3y6AdNhbUgG/eS8Dumch0dniEYEExECAAYFAj5q
|
||||||
|
MCcACgkQO/YJxouvzb2O5QCghtxYfrIcbfTcBwvz9vG1sBHkQSkAnj3PMjN9dk1x1e4rUD9d
|
||||||
|
S00JOoI0iFYEExECABYFAjnKLQkECwoEAwMVAwIDFgIBAheAAAoJEN7sjAneQVsOUfcAoNgN
|
||||||
|
xaeqMn5EWO2MkwVvVrLjWI2FAKDLnp19rJsU69OK7qHqfMeGWFXsQYheBBMRAgAWBQI5yi0J
|
||||||
|
BAsKBAMDFQMCAxYCAQIXgAASCRDe7IwJ3kFbDgdlR1BHAAEBUfcAoNgNxaeqMn5EWO2MkwVv
|
||||||
|
VrLjWI2FAKDLnp19rJsU69OK7qHqfMeGWFXsQYiVAwUQOcrkWi2pLp/VI9wNAQE5mAP/WW9g
|
||||||
|
shqGqWN/rWevpVKlzwqGSqMUq6E2K34dHrFdqd/WnY8ng5zAd66Ey3OLS5x9/+KI6W9MU5OI
|
||||||
|
WmxOfrp7PxwqLrQH/BruPTHe9mZbkSyjWIS/V+W8/lYtzIUYTd0584+1x7cK6jah3mAdFu5t
|
||||||
|
8fr1k3NyVXFH66dLrLF0bBu0JFN1c3VtdSBPU0FXQSA8c3VzdW11LW9AZGViaWFuLm9yLmpw
|
||||||
|
PohGBBARAgAGBQI7zWD4AAoJEFPlmVtRVTMKpEEAn0Oxl1tcdFf6LxiG2URD7kmHNm+iAJ9l
|
||||||
|
uLXjsYvo0OXlG1HlaFkFduhgp4hGBBARAgAGBQI8xnr7AAoJEHxlM6/TLT1xZlEAnjSeGhDQ
|
||||||
|
mbidMrjv4nOaWWDePjN7AKDXoHEhZbpUIJLJBgS4jZfuGtT3VYhGBBARAgAGBQI8xnwTAAoJ
|
||||||
|
EPQ+cmY8yIwJTjEAnAllI6IPXWJlHjtwqlHHwprrZG4eAJwMTl5Rbqu1lf+Lmz3N8QBrcTjn
|
||||||
|
zYhGBBARAgAGBQI8xn7VAAoJENkApzWdsZkE6M4AoIpVj26AQLU6dtiJuLNMio8jKx/AAJ9n
|
||||||
|
8VzpA4GFEL3Rg2eqNvuQC0bJp4hGBBARAgAGBQI9k0XgAAoJEBcFOQ7mbJuwsaUAnRIT1q2W
|
||||||
|
kEgui423U/TVWLvSp2/aAKDG6xkJ+tdAmBnO5CcQcNswRmK4NIhGBBMRAgAGBQI9u76dAAoJ
|
||||||
|
ECm+XSJo/VSfDJQAn0pZLQJhXUWzasjG2s2L8egRvvkmAJ4yTxKBoZbvtruTf//8HwNLRs9W
|
||||||
|
v4hGBBMRAgAGBQI+ajAuAAoJEDv2CcaLr829bTYAoJzZa95z3Ty/rVS8Q5viOnicJwtOAKCG
|
||||||
|
RKoaw3UZfpm6RLHZ4aHlYxCA0YhXBBMRAgAXBQI6aHxFBQsHCgMEAxUDAgMWAgECF4AACgkQ
|
||||||
|
3uyMCd5BWw4I+ACfQhdkd2tu9qqWuWW7O1GsLpb359oAoLleotCCH4La5L5ZE/cPIde9+p8o
|
||||||
|
iF8EExECABcFAjpofEUFCwcKAwQDFQMCAxYCAQIXgAASCRDe7IwJ3kFbDgdlR1BHAAEBCPgA
|
||||||
|
n0IXZHdrbvaqlrlluztRrC6W9+faAKC5XqLQgh+C2uS+WRP3DyHXvfqfKLQlU3VzdW11IE9T
|
||||||
|
QVdBIDxzdXN1bXUtb0Bnb2ZvcndhcmQub3JnPohGBBARAgAGBQI7zWD4AAoJEFPlmVtRVTMK
|
||||||
|
aY0An0oI4Fwko9YsVWS+0M3/Tpc8FB2eAJ4oALojFgFkOWYT97dh8rTQW8BhyohGBBARAgAG
|
||||||
|
BQI8xnr7AAoJEHxlM6/TLT1xsXcAoJV/9zoudxvWy+LwktkGyCB7aTx4AJ0Z8GWmx2/C4W2M
|
||||||
|
tSyaUscY3X19uYhGBBARAgAGBQI8xnwTAAoJEPQ+cmY8yIwJpxQAn3efnPpctMJFDQomRDbo
|
||||||
|
7Q8rg6r4AKCq7LZmOaXvyrBF/JcYjOCLtYMPIIhGBBARAgAGBQI8xn7VAAoJENkApzWdsZkE
|
||||||
|
iB0AnRQs0XjhpGOpR1lyEOuZkm2xxHPzAJ9Is3sG9UMOr+YS5V1GXXiFM29S3YhGBBARAgAG
|
||||||
|
BQI9k0XgAAoJEBcFOQ7mbJuwjiAAn2wcQP9HreVLCSQruB1wnX/s79ZcAKCRcecLF+wiRo59
|
||||||
|
JJvwtnxp2W24EYhGBBMRAgAGBQI9u76dAAoJECm+XSJo/VSftKUAoJQ/cYKqkyOLSOelU8eM
|
||||||
|
plFiFJlPAJwK7B0HrN+tDmR7r8Hc0GrRrbAuvYhGBBMRAgAGBQI+ajAuAAoJEDv2CcaLr829
|
||||||
|
PX0An2kfEs+3iR5qV35EQlCdL5ITZCSNAKCf8HErpT620TUhU6hI7vW5R3LNgohXBBMRAgAX
|
||||||
|
BQI6aHxeBQsHCgMEAxUDAgMWAgECF4AACgkQ3uyMCd5BWw5HzwCdF8w3WjnwTvktko3ZB7IM
|
||||||
|
mFLKvSQAn3GbioDBdV+j6xuhSI90osLMu1jgiF8EExECABcFAjpofF4FCwcKAwQDFQMCAxYC
|
||||||
|
AQIXgAASCRDe7IwJ3kFbDgdlR1BHAAEBR88AnRfMN1o58E75LZKN2QeyDJhSyr0kAJ9xm4qA
|
||||||
|
wXVfo+sboUiPdKLCzLtY4IkBIgQQAQIADAUCQpGGggUDABJ1AAAKCRCXELibyletfJEKCACw
|
||||||
|
Yf5qY4J3RtHnC56HmGiW4GXaahJpBQ1JcWmfx7CkTqJPQveg+KQ4pfLuJvZ8v4YqPZCxPOeK
|
||||||
|
/ZhIO48UB4obcD8BZdSkRA4QBamRp8iqcgrCot/LA5xQu9tivIhUJP/1dT6PmDy4DAV3Flgt
|
||||||
|
HgED5niVESDPfz3Gjff5iWWIs6dM3bycxoTcFWLz++578aOasoq9T8Tfua9H8UrouVz3+6TK
|
||||||
|
xG0rGeb2jOQOQcbLCn3soU/Z60H3SvJYHzgxlS5bqIybrjo3sAnuus/kisrmNjeFfQBdl9v+
|
||||||
|
GnK65D1tmBa1+6a95uHb+OG4eHzIXmvnDI4A1RhRKiZ/kpVsT7RViQEiBBABAgAMBQJCo1H8
|
||||||
|
BQMAEnUAAAoJEJcQuJvKV618bJgIAMb9Xiv8ps3quJ9ByHhbIQtBOymH0fFiodsutPrcR2Af
|
||||||
|
1lc/eh3Ik20Z9Ba3g5V6eUW+3sjpDsjKtI1CXuRq0Zgmze3hrUTMRmyrLoaHPocrqfj2G9mW
|
||||||
|
y2OomLHMDurcJFQkSUJioI4Kxo+1NBZmylPKUEeIEoP8UBJbKxf78dVh00ZUecwZcn9lLiZA
|
||||||
|
TycRQ0WTT1Yv1fI+tBmvSrpMSe+0k+JS+QigvINN5vUxaV1cN6mkREPYVm7oHzPCQ2C9NX1q
|
||||||
|
cI/Wkc38ieZw1Sv9vyPCCL6MYd/2t1209a/ZKADaw5l+mhyWUqIT6SXPLxMDy0NvPhTKdDr1
|
||||||
|
7S5LOcKhwPqJASIEEAECAAwFAkK2pukFAwASdQAACgkQlxC4m8pXrXxvUQgAlfw6doD0JHtY
|
||||||
|
iN9uCp2M1orLKS/zm66e9eiYPJwbim96KiwP98Ti5J+QO5hZdT3dhW2Avw5JPFiQukSc/rjT
|
||||||
|
1YHRyuhZfXKhQhsjom5JmyFSdeIzjnz0PIM2qZaK4OfFihleQfQ8Y94wkPwYtkEXxpBQSClg
|
||||||
|
Xk6QJEql34sQexIDM7VsREwv/eIQ73RMquat4RZP1L3h4nj1UJu/X7ey3HVVo61gH0RIAR+A
|
||||||
|
adv59AAp//TkKUNIRCHOsIpFCXHjJsJxRvJKhiz3T6FhqFEQNF2tDJKHFV1FcLAIEZheuGOV
|
||||||
|
fKNXgmvVATPHrJsg5HsZACg/aRFq9NL9FYskFyGcB4kBIgQQAQIADAUCQrdR0QUDABJ1AAAK
|
||||||
|
CRCXELibyletfMNMB/49u9oQzbmTtmHaoKuvou7OA6zmrfeu5X9vV1efZgItF78J7G19fVt8
|
||||||
|
K3e6kn0KGYVL+FTbPdEbvrYTb+jfMkzrHooxQYSr0j8Baqfh2bMuZzuw2pVtgBUTYHoihNjQ
|
||||||
|
lv6GPtF7Y3CVWLUYXZ25yqY3Hzh9YneoH8bUVFZWxRFitqGB+noFpvm0YXrCJZ19BDNTQlx7
|
||||||
|
5quAl4KTNOAxapsKaBrz/4PrnNbuwZBkzP5EEuEyjTM+6UBhxibXfdWKnZw6ky7k6tuUsc68
|
||||||
|
qfQJBK6KBmVLflZ5nrd2N90Ueb0m3xfzdncBAZb43THGhi6XyZ4jvbMjvjm3MCGuUosYYbT6
|
||||||
|
iQEiBBABAgAMBQJCyQLdBQMAEnUAAAoJEJcQuJvKV618Jz0IAKstm2VX39p4Lt4k55ZdOqXG
|
||||||
|
CqHCFT5YYOVcnptx8dKTpHWQXpI2lUJBAcWz0IAXXFhyUbGpvS1E9T/pYF97RSSsQyTncQll
|
||||||
|
mLbzy3fESVkGT9xpEvF7ZaK+61BKuWFpbKRdpy5wWakk0GRyF0156vxm7vQh4XI91TwXj7DA
|
||||||
|
v6KYWdjnHcEB8O9jLw6RlD4Y6dKjb/v7vTY6dGmYYyOQVK+Bmr/8vVcNDf+tevExsytTu4FZ
|
||||||
|
tL9yp+yHODfHP5LZk3mC7UGR/mUKFDYhuEzzIU5ozc6qUfC5ViGt2Hjg45i2T79WeSV0UHSE
|
||||||
|
8c3JOgE3e7A71bQEUJygPC9S+RTuc8aJASIEEAECAAwFAkLMT3oFAwASdQAACgkQlxC4m8pX
|
||||||
|
rXwoBgf+MEjA/hx7UMl6LHwheZ9qzH/4P1d4CU46SzoC/XEPqWGs9sJw0dKxEAnRZgrG1WMP
|
||||||
|
Ml127bOHby5WWDa/xGi0siYM64F386SG0W42FD67vPK9mMPnCDIQ4xn5gGoqUUl8ZzFG0eNv
|
||||||
|
XRg0bmMVmoZFvaUyf0uah/0dYCYplgAjJtmC3cmNuJ98PoYEVHMKKGtPW4fVf+TcN90HVjXU
|
||||||
|
kr0GnAvRegb3ZXnte3GrOe3jOfXjfjZMyEM6a16FFuKHmykgfyX/I4tS9GqoxPZ6s0KARKn0
|
||||||
|
YLZUuxxFL7i1VaGJR/9duyUc8T0BLc9O4TxNuvd1vd5UKVVmTL04fe0q1Bfu4okBIgQQAQIA
|
||||||
|
DAUCQtGX8QUDABJ1AAAKCRCXELibyletfNEoCACtKtfWhAfkxLqPihQMbvwXTuSszG61XNYb
|
||||||
|
a41gTOpjADF2jQAQ2y8oilVyr5RgSvug8knik3EitSpBOOg0o5Y9NHF3e+85r27m8T5cP3g5
|
||||||
|
GHAeugRFDqMXXioiAw9WoyvG9ruMY4caD3gAuogM4hB/3EMEHSlMylMrXLUtbGkQKqkLVJQn
|
||||||
|
7V/3SVG8zfUyGb0lSFaGtHFa6LaIIuvJwkQYGMT/SiK7ISqPKOPD7kKRWhxjgcfzVthqGORn
|
||||||
|
uQGi+316fdA+JzEYOI/gGdcZsbN/KrMSNQ0DOdSRIeiATy9M0fd+8QtUPOCtaDKLYISSrm72
|
||||||
|
xgnKbussJRxAPjxo66dPiQEiBBABAgAMBQJC42DIBQMAEnUAAAoJEJcQuJvKV6181SUIAL/P
|
||||||
|
gZhrwepyFUhr+nlYvxeflrxgR9Yl1aNtTngcOYlFU273cs3XnkczIpkg4fVikY5s56Y42G8F
|
||||||
|
NvqRu0M0eL5kJvYi50NNMQnf39GkZZp2LrL9bZ9n7ysWU5tiOJsxCBnaOiAg/p6vCUVN3NV+
|
||||||
|
t8vRP1fHwPsd5tYEBqA/g4g1U0xJAG+JqJftSDRDLxfTZ16hBdHzlQ3opqMMmW5Mv005p4o+
|
||||||
|
buh4HzQLmBHDE98BeZ7CpjYeXY23bu8oi0tvkcTjCEeBWrXWfA3pKSX5HH63nmG3ryKuP0tr
|
||||||
|
1A2gTgs9JtLXnGFJUdVYULiQbU781wR6+9o/0h6NuCJDPmJMNmmJASIEEAECAAwFAkLmBFIF
|
||||||
|
AwASdQAACgkQlxC4m8pXrXxYZwf/ah4IaTK3CbtqF1+4uz7VVRKemSaNg3jMKLey2simqAQs
|
||||||
|
1JwqkLuwEgrwF7XiejfLAvX0/yFqJZkdtDFqeK0VrwOq3WIpfj7+g5B9YSW0CkasD0HUci/l
|
||||||
|
oXQiT9CN7PAe1vM5X4X3cqlXfC9tmU7fH7kc0kULxYHAfn96nZQklZS9aVecJ0H+pqMlPoDt
|
||||||
|
xtxweNa7UJWAanO9kbPZ/xEdSlkuqzk1CK6ThURedc2lCE+qobPpUZri1FEvMBjyXoQ9MyD6
|
||||||
|
AFWfax9eNn1ZSRq9t2WpPyFSQmCvyGETHyvM2BBiFR6UAQUKdr+d4ZE09cR0wXpEtoqaNeJ8
|
||||||
|
AidTEGkuLYkBIgQQAQIADAUCQuydlwUDABJ1AAAKCRCXELibyletfLsbB/0X/Jafv+v43U26
|
||||||
|
W3HD5XdmHaNdxm7uthGzGGzATGcTAUd3/t8fyVFk2XgmUYxtz0wHUdM8GiyK0tpKBu6wqcbO
|
||||||
|
nGkBlvC1m6Blxy+PvpJxQ2sK4ycN8ToEEn/7HCCJesS2fvDudXkvdvskXkxZprPWe7JTHNxj
|
||||||
|
fvESUAbLLmSpNGflZnMAOfuQP0hFBQr4D5FEA+zMf7FtrwkBanXt6W65xxEIJ/239ctCsRe8
|
||||||
|
jIQ4LesYQN7hyX6x9bP9h3tEw6+OtvjYbMH+2B/3muNVac/9bYqi9rnuGew9eAjmdmm0u8T5
|
||||||
|
7Iboy5mUDH2wjpRo6MGU1cHe4oZscW0f9TPE+6XbiQEiBBABAgAMBQJC7UXaBQMAEnUAAAoJ
|
||||||
|
EJcQuJvKV618zbcH/RlUtrZSBcUafmhY29s9BYycwWx/UoeJRIJmi852TguSGsoPuAYEGeaW
|
||||||
|
WxCdSru2ibn7GPBXowM5u+4MqYqaRB695sg/Ajxho2Djys3lV0TPeSIbyZ7cXbjoSDnSVw/N
|
||||||
|
eWGKJLwbFVZPjjC7mcGIMhE1NGGxyRO5H1Z6GA8dEP3zR0rIivklN8KEngfyLRVvB5WYPBs+
|
||||||
|
buaNF5HflsBXl2bOP5ueThcal1PSE4HNoQXz79t0Cw7kpsWy3FyFUVVRHPyvwVpJSdYjz8Ur
|
||||||
|
L4cD3Dj9SOPwa4AvM7WX+JXbPEIFxi+NA4R0TVxIZXJ/HX8AZj87RFxGYlTfP3GFFw+52QaJ
|
||||||
|
ASIEEAECAAwFAkMHCEAFAwASdQAACgkQlxC4m8pXrXxGXQgAwFY5RYFHKcYkL9nDfblQDjXW
|
||||||
|
Ictj1rlP2yPsy8dKX579ejhdd8o0TGJf8AzYRaDEpffPf/ZvyfRltqKd979GzdAE3smkrGeD
|
||||||
|
kPuUY2rEF6Eon549Tn7omGYNueDuO27QQ4zIs0k9h4m+pE6PxPTgC5BsEVF8Hrz647/XSTf2
|
||||||
|
G0Wo11y/KBWGJ9BYvZ1YSxwmk5zicGF4sYNktO1Yl6CGS1ugP9zitCuwSiUm+gJrMCZ3am/D
|
||||||
|
+Of+80Ui7e/V9yOOeyC7/gqQq4okPZbdVzJ3hiG2Y3eip19ewHYlYSiLoBW3rr3M3mKBTcbx
|
||||||
|
+nLfVOTUHp8HdqxIyI782SaZlpg0mYkBIgQQAQIADAUCQwhbTQUDABJ1AAAKCRCXELibylet
|
||||||
|
fD7WB/9ydWuVT1DeeL3UBqqeRRN+mt5DChdFeCjJhWcAjds8R6Z8Q9c+kpKEk+MeSevKaOAf
|
||||||
|
iiM2JBtruIxt1sfh/vVEFgjHP/M0sF1il6TwZEKqVn5c3ikMYCMXy75xheslCJoX7fi4jZut
|
||||||
|
TO8+JqjVN+z+SYzeRrvQFcjJoIOLRnshh2XgUiXVf/xo/My+fM9rKnMHxF/75PaFVVz8cXz1
|
||||||
|
X3jsuUOVLxnUZHsOaP9r1h3bq8uHJxkxPElVPbCuKLdCWrNOHHX6/+TAH9xohUvrBm6HXqbv
|
||||||
|
O/aVGqf+Bip6oWSB6rSIe9+0GmXLRe4Ph3ekBvyGUJM/nFhN4hQHX69xZS7yiQEiBBABAgAM
|
||||||
|
BQJDEOyRBQMAEnUAAAoJEJcQuJvKV618IlwIAIPbWp20TBCnU0D3kE6JFqRaVKqNAFaJbmRn
|
||||||
|
48qxX10NmHnBAluU1iJiUsVL2kOpvf2eyFUsX+sQfVJPzmWkUU2gED/+WZNkcmxPZ72FtJCs
|
||||||
|
hW30BcJnLjcRo8wv/6nhdEZ2JYNiBIFHxNQ6iiB7BzVpYsMp1l5tI6mIhbxYxMNETTMrb+hK
|
||||||
|
NNAhxjrqiWxPNlrzw6TaKnBOE0Au/Asjz9n37hsPV5Q9xY3zXbff3yDirVkBC4l0Vc+U6drX
|
||||||
|
XiFBjQj77yt6AjTYUzBZY7UuGQ0W6o/6QF3KfiC3WAoFJL7SLujIaALkALs+lFzsu3CA9KoB
|
||||||
|
X8Ca4hA7kzOP1H76VZKJASIEEAECAAwFAkMSPXoFAwASdQAACgkQlxC4m8pXrXx3cQf9GBPO
|
||||||
|
XIrdbvUWIKTofiwftiy6j3MhKOszHkzR9quCu6aLu/aVvIA/avTZHjfj0EvYaQaSNMWplMiX
|
||||||
|
i2UhkPHe4cgJYkbjmXEz16GtXYPZXGP1FubQ/RwQ7yQKaVtXSCgz+ZdR5tKhU5kruxAsVjly
|
||||||
|
KcQvST95wlqxLuvXzSCjPdWj4qBvkuEt6QADx8EYCafraIiHPRkKtAAiK0sXJSkLevXn3zAN
|
||||||
|
6X6ngvZZiNQFvfWLFV8Rodz1vI4S6Af2MTSlVV9Vw0voJGprcsNDlB8k5B/Kl9LigeKdkFa8
|
||||||
|
JVfwOQppAtU+Nq3pHjquEafZrPVF9HWY0G0Szh5tOFEpVMF6g4kBIgQQAQIADAUCQxQ7iwUD
|
||||||
|
ABJ1AAAKCRCXELibyletfBVfB/9ydVsiBrNWLt0RwbAdMvHRceHz1twh+YeSnpr9Equ7aDMG
|
||||||
|
qou4ppl/nTbnZIizdWn3dnRKt+vKY/puuPIT9kEVF7DlfBOcWBdLBvJz34eBt29BCFgvsfOS
|
||||||
|
fwESMNKgquZmrraGpEvj4cSTOmW3DJPevB+6ajsN87BC5Qp2MjDGVkwT/Nj6R60pz/vmeSwl
|
||||||
|
0BmzgthrBd+NfHSA116HEAF1V21/2UhA1hbkPKe40jWp6HK+GcXDC3+PucTJeS8nX4LLQnWZ
|
||||||
|
JCr1QUbkaW6jHCw7i/pgCLfqBBdIh7xJE7d+6mut1AKtq2qUSpEM4qTvrR89DLz3OtNiMnr9
|
||||||
|
hq7s5SyduQINBDnKLe0QCACUXlS4TkpEZZP06rJ2IVWZ2v7ZSPkLXjDRcC8h6ESQeZdBOSbd
|
||||||
|
dciiWYiHtGq2kyx+eoltwooP7EgJ9m35wn0FGV+5hpKbhSwz2Up9oYsSbexjx/hlopUYGCL4
|
||||||
|
kgezCUWQsKypsitJChjV8MHgePDQcF3ho+qK+0ZJeevbYKSZ9bLyzt/i3/b3Jnt0f8tsFP3P
|
||||||
|
djel4N76DyQiTyuoOxzZJUJDKx1zr745PUMGcur79oAxuahUfPcRpuwcHFOB0yO7SwEY8fe2
|
||||||
|
68U5/AZrGwX+UAZhN7y2MMkU/xK/4BIDY5/W4NY3EX2APAYMRanI+mFW3idui8EEzpzKZ1K1
|
||||||
|
8RODAAMFCACOAfgCjg7cgjZe58k0lAV0SANrJbMqgAT1M7v4f5mOf5e3B4si9z8Mk1hx5cRX
|
||||||
|
I3dDz/W4LPh8eONmMPjov42NOz8z84PksQBbnjlfZ5UCotPS2fZ2actJPhYCho+a4iXwRm8B
|
||||||
|
aXQ3DFa1CsWdXvkGsNIouuSkGoGh6+sEgAdP6JXanM9YGTQINy9Xsg9YOj1UWInSwRqUmJnj
|
||||||
|
aNQhxJfj8j5W0uXixzkbKB+Is92mfo8Km3TAi9u0Ge/Acb5Cz0c5sqs+oWqcouaTS3o8/1n6
|
||||||
|
CZVmvcHyGI0APiALwU84z7YT9srpXHrjiHo2oS3M4sLxl0nuSFqD6uiIFrg7yF+HiEYEGBEC
|
||||||
|
AAYFAjnKLe0ACgkQ3uyMCd5BWw6XgQCg7Gu7XOzqnEcnCYR7v6rub5d0zwwAoOsQ9TNDYmVl
|
||||||
|
nW1ff9rt1YcTH9LiiE4EGBECAAYFAjnKLe0AEgkQ3uyMCd5BWw4HZUdQRwABAZeBAKDsa7tc
|
||||||
|
7OqcRycJhHu/qu5vl3TPDACg6xD1M0NiZWWdbV9/2u3VhxMf0uI=
|
||||||
|
=oXxa
|
||||||
|
-----END PGP PUBLIC KEY BLOCK-----
|
||||||
|
")
|
||||||
|
|
||||||
|
;; Bug solved 2005-04-07:
|
||||||
|
;; Try importing the attached key file. As the key is exactly 8192
|
||||||
|
;; bytes long, radix64_read is called twice - the first time to read
|
||||||
|
;; the 8192 bytes, and then once again, to handle the pad '=' on the
|
||||||
|
;; last four character radix64 block '0uI='. gpg bails out with
|
||||||
|
;; gpg: [don't know]: invalid packet (ctb=2d)
|
||||||
|
;; On a read for only the = sign, radix64_read returns -1 for EOF.
|
||||||
|
;; This causes the iobuf code to pop the armor filter and thus the next
|
||||||
|
;; byte read is the '-' from the END header line, causing an error.
|
||||||
|
(info "Checking armored_key_8192")
|
||||||
|
(pipe:do
|
||||||
|
(pipe:echo armored_key_8192)
|
||||||
|
(pipe:gpg '(--import)))
|
||||||
|
|
||||||
|
(define nopad_armored_msg "-----BEGIN PGP MESSAGE-----
|
||||||
|
Version: GnuPG v1.4.11-svn5139 (GNU/Linux)
|
||||||
|
|
||||||
|
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
|
||||||
|
=3akT
|
||||||
|
-----END PGP MESSAGE-----
|
||||||
|
|
||||||
|
")
|
||||||
|
|
||||||
|
(define alpha_seckey "-----BEGIN PGP PRIVATE KEY BLOCK-----
|
||||||
|
Version: GnuPG v1.4.8 (GNU/Linux)
|
||||||
|
|
||||||
|
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
|
||||||
|
wg7Md81a5RI3F2FG8747t9gX
|
||||||
|
=VM1e
|
||||||
|
-----END PGP PRIVATE KEY BLOCK-----
|
||||||
|
")
|
||||||
|
|
||||||
|
;; Bug 1179 solved 2010-05-12:
|
||||||
|
;; It occured for messages of a multiple of the iobuf block size where
|
||||||
|
;; the last line had no pad character. Due to premature poppng of thea
|
||||||
|
;; rmor filter gpg swalled the CRC line and passed the '-----END...'
|
||||||
|
;; line on to the decryption layer.
|
||||||
|
|
||||||
|
(info "Importing alpha_seckey")
|
||||||
|
(pipe:do
|
||||||
|
(pipe:echo alpha_seckey)
|
||||||
|
(pipe:gpg '(--import)))
|
||||||
|
|
||||||
|
(info "Checking for bug #1179")
|
||||||
|
(tr:do
|
||||||
|
(tr:pipe-do
|
||||||
|
(pipe:echo nopad_armored_msg)
|
||||||
|
(pipe:gpg '())))
|
13
tests/openpgp/armsignencrypt.scm
Executable file
13
tests/openpgp/armsignencrypt.scm
Executable file
@ -0,0 +1,13 @@
|
|||||||
|
#!/usr/bin/env gpgscm
|
||||||
|
|
||||||
|
(load (with-path "defs.scm"))
|
||||||
|
|
||||||
|
(for-each-p
|
||||||
|
"Checking armored signing and encryption"
|
||||||
|
(lambda (source)
|
||||||
|
(tr:do
|
||||||
|
(tr:open source)
|
||||||
|
(tr:gpg usrpass1 `(--yes --passphrase-fd "0" -sea --recipient ,usrname2))
|
||||||
|
(tr:gpg "" '(--yes))
|
||||||
|
(tr:assert-identity source)))
|
||||||
|
(append plain-files data-files))
|
13
tests/openpgp/armsigs.scm
Executable file
13
tests/openpgp/armsigs.scm
Executable file
@ -0,0 +1,13 @@
|
|||||||
|
#!/usr/bin/env gpgscm
|
||||||
|
|
||||||
|
(load (with-path "defs.scm"))
|
||||||
|
|
||||||
|
(for-each-p
|
||||||
|
"Checking armored signatures"
|
||||||
|
(lambda (source)
|
||||||
|
(tr:do
|
||||||
|
(tr:open source)
|
||||||
|
(tr:gpg usrpass1 `(--yes --passphrase-fd "0" -sa --recipient ,usrname2))
|
||||||
|
(tr:gpg "" '(--yes))
|
||||||
|
(tr:assert-identity source)))
|
||||||
|
(append plain-files data-files))
|
90
tests/openpgp/clearsig.scm
Executable file
90
tests/openpgp/clearsig.scm
Executable file
@ -0,0 +1,90 @@
|
|||||||
|
#!/usr/bin/env gpgscm
|
||||||
|
|
||||||
|
(load (with-path "defs.scm"))
|
||||||
|
|
||||||
|
(define (check-signing args input)
|
||||||
|
(lambda (source sink)
|
||||||
|
(lettmp (signed)
|
||||||
|
(call-popen `(,@GPG --output ,signed --yes
|
||||||
|
,@args ,source) input)
|
||||||
|
(call-popen `(,@GPG --output ,sink --yes ,signed) ""))))
|
||||||
|
|
||||||
|
(for-each-p
|
||||||
|
"Checking signing and verifying plain text messages"
|
||||||
|
(lambda (source)
|
||||||
|
((if (equal? "plain-3" source)
|
||||||
|
;; plain-3 does not end in a newline, and gpg will add one.
|
||||||
|
;; Therefore, we merely check that the verification is ok.
|
||||||
|
check-execution
|
||||||
|
;; Otherwise, we do check that we recover the original file.
|
||||||
|
check-identity)
|
||||||
|
source
|
||||||
|
(check-signing '(--passphrase-fd "0" --clearsign) usrpass1)))
|
||||||
|
(append plain-files '("plain-large")))
|
||||||
|
|
||||||
|
;; The test vectors are lists of length three, containing
|
||||||
|
;; - a string to be signed,
|
||||||
|
;; - a flag indicating whether we verify that the exact message is
|
||||||
|
;; reconstructed (whitespace at the end is normalized for plain text
|
||||||
|
;; messages),
|
||||||
|
;; - and a list of arguments to add to gpg when encoding
|
||||||
|
;; the string.
|
||||||
|
|
||||||
|
(define :string car)
|
||||||
|
(define :check-equality cadr)
|
||||||
|
(define :options caddr)
|
||||||
|
|
||||||
|
(define
|
||||||
|
vectors
|
||||||
|
'(;; one with long lines
|
||||||
|
("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyx
|
||||||
|
|
||||||
|
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
" #t ())
|
||||||
|
|
||||||
|
;; one with only one long line
|
||||||
|
("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyx
|
||||||
|
" #t ())
|
||||||
|
|
||||||
|
;; and one with an empty body
|
||||||
|
("" #f ())
|
||||||
|
|
||||||
|
;; and one with one empty line at the end
|
||||||
|
("line 1
|
||||||
|
line 2
|
||||||
|
line 3
|
||||||
|
there is a blank line after this
|
||||||
|
|
||||||
|
" #t ())
|
||||||
|
|
||||||
|
;; I think this file will be constructed wrong (gpg 0.9.3) but it
|
||||||
|
;; should verify okay anyway.
|
||||||
|
("this is a sig test
|
||||||
|
" #f ())
|
||||||
|
|
||||||
|
;; check our special diff mode
|
||||||
|
("--- mainproc.c Tue Jun 27 09:28:11 2000
|
||||||
|
+++ mainproc.c~ Thu Jun 8 22:50:25 2000
|
||||||
|
@@ -1190,16 +1190,13 @@
|
||||||
|
md_enable( c->mfx.md, n1->pkt->pkt.signature->digest_algo);
|
||||||
|
}
|
||||||
|
/* ask for file and hash it */
|
||||||
|
- if( c->sigs_only ) {
|
||||||
|
+ if( c->sigs_only )
|
||||||
|
rc = hash_datafiles( c->mfx.md, NULL,
|
||||||
|
c->signed_data, c->sigfilename,
|
||||||
|
n1? (n1->pkt->pkt.onepass_sig->sig_class == 0x01):0 );
|
||||||
|
" #t (--not-dash-escaped))))
|
||||||
|
|
||||||
|
(let ((counter (make-counter)))
|
||||||
|
(for-each-p'
|
||||||
|
"Checking signing and verifying test vectors"
|
||||||
|
(lambda (vec)
|
||||||
|
(lettmp (tmp)
|
||||||
|
(with-output-to-file tmp (lambda () (display (:string vec))))
|
||||||
|
((if (:check-equality vec) check-identity check-execution)
|
||||||
|
tmp
|
||||||
|
(check-signing `(--passphrase-fd "0" --clearsign ,@(:options vec))
|
||||||
|
usrpass1))))
|
||||||
|
(lambda (vec) (counter))
|
||||||
|
vectors))
|
48
tests/openpgp/conventional-mdc.scm
Executable file
48
tests/openpgp/conventional-mdc.scm
Executable file
@ -0,0 +1,48 @@
|
|||||||
|
#!/usr/bin/env gpgscm
|
||||||
|
|
||||||
|
(load (with-path "defs.scm"))
|
||||||
|
|
||||||
|
(define s2k '--s2k-count=65536)
|
||||||
|
(define passphrase "Hier spricht HAL")
|
||||||
|
|
||||||
|
(define (file-copy-n from to n)
|
||||||
|
(catch '() (unlink to))
|
||||||
|
(letfd ((source (open from (logior O_RDONLY O_BINARY)))
|
||||||
|
(sink (open to (logior O_WRONLY O_CREAT O_BINARY) #o600)))
|
||||||
|
(splice source sink n)))
|
||||||
|
|
||||||
|
(define test-files
|
||||||
|
(map (lambda (size)
|
||||||
|
(let ((tmp (make-temporary-file
|
||||||
|
(string-append "data-80000-" (number->string size)))))
|
||||||
|
(file-copy-n "data-80000" tmp size)
|
||||||
|
tmp))
|
||||||
|
'(0 1 2 3 9 10 11 19 20 21 22 23 39 40 41 8192 32000)))
|
||||||
|
|
||||||
|
(for-each-p
|
||||||
|
"Checking conventional encryption with MDC"
|
||||||
|
(lambda (algo)
|
||||||
|
(for-each-p
|
||||||
|
""
|
||||||
|
(lambda (source)
|
||||||
|
(tr:do
|
||||||
|
(tr:open source)
|
||||||
|
(tr:gpg passphrase `(--yes --passphrase-fd "0" ,s2k
|
||||||
|
--force-mdc -c
|
||||||
|
--cipher-algo ,algo))
|
||||||
|
(tr:gpg passphrase `(--yes --passphrase-fd "0" ,s2k))
|
||||||
|
(tr:assert-identity source)))
|
||||||
|
test-files))
|
||||||
|
all-cipher-algos)
|
||||||
|
|
||||||
|
(for-each remove-temporary-file test-files)
|
||||||
|
|
||||||
|
(for-each-p
|
||||||
|
"Checking sign+symencrypt"
|
||||||
|
(lambda (source)
|
||||||
|
(tr:do
|
||||||
|
(tr:open source)
|
||||||
|
(tr:gpg passphrase `(--yes --passphrase-fd "0" ,s2k -cs))
|
||||||
|
(tr:gpg passphrase `(--yes --passphrase-fd "0" ,s2k))
|
||||||
|
(tr:assert-identity source)))
|
||||||
|
(append plain-files data-files))
|
31
tests/openpgp/conventional.scm
Executable file
31
tests/openpgp/conventional.scm
Executable file
@ -0,0 +1,31 @@
|
|||||||
|
#!/usr/bin/env gpgscm
|
||||||
|
|
||||||
|
(load (with-path "defs.scm"))
|
||||||
|
|
||||||
|
(define s2k '--s2k-count=65536)
|
||||||
|
(define passphrase "Hier spricht HAL")
|
||||||
|
|
||||||
|
(for-each-p
|
||||||
|
"Checking conventional encryption"
|
||||||
|
(lambda (source)
|
||||||
|
(tr:do
|
||||||
|
(tr:open source)
|
||||||
|
(tr:gpg passphrase `(--yes --passphrase-fd "0" ,s2k -c))
|
||||||
|
(tr:gpg passphrase `(--yes --passphrase-fd "0" ,s2k))
|
||||||
|
(tr:assert-identity source)))
|
||||||
|
'("plain-2" "data-32000"))
|
||||||
|
|
||||||
|
(for-each-p
|
||||||
|
"Checking conventional encryption using a specific cipher"
|
||||||
|
(lambda (algo)
|
||||||
|
(for-each-p
|
||||||
|
""
|
||||||
|
(lambda (source)
|
||||||
|
(tr:do
|
||||||
|
(tr:open source)
|
||||||
|
(tr:gpg passphrase `(--yes --passphrase-fd "0" ,s2k -c
|
||||||
|
--cipher-algo ,algo))
|
||||||
|
(tr:gpg passphrase `(--yes --passphrase-fd "0" ,s2k))
|
||||||
|
(tr:assert-identity source)))
|
||||||
|
'("plain-1" "data-80000")))
|
||||||
|
all-cipher-algos)
|
12
tests/openpgp/decrypt-dsa.scm
Executable file
12
tests/openpgp/decrypt-dsa.scm
Executable file
@ -0,0 +1,12 @@
|
|||||||
|
#!/usr/bin/env gpgscm
|
||||||
|
|
||||||
|
(load (with-path "defs.scm"))
|
||||||
|
|
||||||
|
(for-each-p
|
||||||
|
"Checking decryption of supplied DSA encrypted file"
|
||||||
|
(lambda (name)
|
||||||
|
(tr:do
|
||||||
|
(tr:open (in-srcdir (string-append name "-pgp.asc")))
|
||||||
|
(tr:gpg "" '(--yes))
|
||||||
|
(tr:assert-identity name)))
|
||||||
|
(list (car plain-files)))
|
12
tests/openpgp/decrypt.scm
Executable file
12
tests/openpgp/decrypt.scm
Executable file
@ -0,0 +1,12 @@
|
|||||||
|
#!/usr/bin/env gpgscm
|
||||||
|
|
||||||
|
(load (with-path "defs.scm"))
|
||||||
|
|
||||||
|
(for-each-p
|
||||||
|
"Checking decryption of supplied files"
|
||||||
|
(lambda (name)
|
||||||
|
(tr:do
|
||||||
|
(tr:open (in-srcdir (string-append name ".asc")))
|
||||||
|
(tr:gpg "" '(--yes))
|
||||||
|
(tr:assert-identity name)))
|
||||||
|
plain-files)
|
59
tests/openpgp/default-key.scm
Executable file
59
tests/openpgp/default-key.scm
Executable file
@ -0,0 +1,59 @@
|
|||||||
|
#!/usr/bin/env gpgscm
|
||||||
|
|
||||||
|
(load (with-path "defs.scm"))
|
||||||
|
|
||||||
|
;; Import the sample key
|
||||||
|
;;
|
||||||
|
;; pub 1024R/8BC90111 2015-12-02
|
||||||
|
;; Key fingerprint = E657 FB60 7BB4 F21C 90BB 6651 BC06 7AF2 8BC9 0111
|
||||||
|
;; uid [ultimate] Barrett Brown <barrett@example.org>
|
||||||
|
;; sub 1024R/3E880CFF 2015-12-02 (encryption)
|
||||||
|
;; sub 1024R/F5F77B83 2015-12-02 (signing)
|
||||||
|
;; sub 1024R/45117079 2015-12-02 (encryption)
|
||||||
|
;; sub 1024R/1EA97479 2015-12-02 (signing)
|
||||||
|
|
||||||
|
(info "Importing public key.")
|
||||||
|
(call-check
|
||||||
|
`(,(tool 'gpg) --import
|
||||||
|
,(in-srcdir "samplekeys/E657FB607BB4F21C90BB6651BC067AF28BC90111.asc")))
|
||||||
|
|
||||||
|
;; By default, the most recent, valid signing subkey (1EA97479).
|
||||||
|
(for-each-p
|
||||||
|
"Checking that the most recent, valid signing subkey is used by default"
|
||||||
|
(lambda (keyid)
|
||||||
|
(tr:do
|
||||||
|
(tr:pipe-do
|
||||||
|
(pipe:defer (lambda (sink) (display "" (fdopen sink "w"))))
|
||||||
|
(pipe:gpg `(--default-key ,keyid -s))
|
||||||
|
(pipe:gpg '(--verify --status-fd=1)))
|
||||||
|
(tr:call-with-content
|
||||||
|
(lambda (c)
|
||||||
|
(unless (string-contains?
|
||||||
|
c "VALIDSIG 5FBA84ACE02DCB17DA3DFF6BBCA43C441EA97479")
|
||||||
|
(exit 1))))))
|
||||||
|
'("8BC90111" "3E880CFF" "F5F77B83" "45117079" "1EA97479"))
|
||||||
|
|
||||||
|
;; But, if we request a particular signing key, we should get it.
|
||||||
|
(for-each-p
|
||||||
|
"Checking that the most recent, valid encryption subkey is used by default"
|
||||||
|
(lambda (keyid)
|
||||||
|
(tr:do
|
||||||
|
(tr:pipe-do
|
||||||
|
(pipe:defer (lambda (sink) (display "" (fdopen sink "w"))))
|
||||||
|
;; We need another recipient, because --encrypt-to-default-key is
|
||||||
|
;; not considered a recipient and gpg doesn't encrypt without any
|
||||||
|
;; recipients.
|
||||||
|
;;
|
||||||
|
;; Note: it doesn't matter whether we specify the primary key or
|
||||||
|
;; a subkey: the newest encryption subkey will be used.
|
||||||
|
(pipe:gpg `(--default-key ,keyid --encrypt-to-default-key
|
||||||
|
-r "439F02CA" -e))
|
||||||
|
(pipe:gpg '(--list-packets)))
|
||||||
|
(tr:call-with-content
|
||||||
|
(lambda (c)
|
||||||
|
(unless (any (lambda (line)
|
||||||
|
(and (string-prefix? line ":pubkey enc packet:")
|
||||||
|
(string-suffix? line "45117079")))
|
||||||
|
(string-split c #\newline))
|
||||||
|
(exit 1))))))
|
||||||
|
'("8BC90111" "3E880CFF" "F5F77B83" "45117079" "1EA97479"))
|
130
tests/openpgp/defs.scm
Normal file
130
tests/openpgp/defs.scm
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
;; Common definitions for the OpenPGP test scripts.
|
||||||
|
;;
|
||||||
|
;; 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 <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
;;
|
||||||
|
;; Constants.
|
||||||
|
;;
|
||||||
|
|
||||||
|
(define usrname1 "one@example.com")
|
||||||
|
(define usrpass1 "def")
|
||||||
|
(define usrname2 "two@example.com")
|
||||||
|
(define usrpass2 "")
|
||||||
|
(define usrname3 "three@example.com")
|
||||||
|
(define usrpass3 "")
|
||||||
|
|
||||||
|
(define dsa-usrname1 "pgp5")
|
||||||
|
;; we use the sub key because we do not yet have the logic to to derive
|
||||||
|
;; the first encryption key from a keyblock (I guess) (Well of course
|
||||||
|
;; we have this by now and the notation below will lookup the primary
|
||||||
|
;; first and then search for the encryption subkey.)
|
||||||
|
(define dsa-usrname2 "0xCB879DE9")
|
||||||
|
|
||||||
|
(define plain-files '("plain-1" "plain-2" "plain-3"))
|
||||||
|
(define data-files '("data-500" "data-9000" "data-32000" "data-80000"))
|
||||||
|
(define exp-files '())
|
||||||
|
|
||||||
|
(define (qualify executable)
|
||||||
|
(string-append executable (getenv "EXEEXT")))
|
||||||
|
|
||||||
|
(define (getenv' key default)
|
||||||
|
(let ((value (getenv key)))
|
||||||
|
(if (string=? "" value)
|
||||||
|
default
|
||||||
|
value)))
|
||||||
|
|
||||||
|
(define tools
|
||||||
|
'((gpg "GPG" "g10/gpg")
|
||||||
|
(gpg-agent "GPG_AGENT" "agent/gpg-agent")
|
||||||
|
(gpg-connect-agent "GPG_CONNECT_AGENT" "tools/gpg-connect-agent")
|
||||||
|
(gpgconf "GPGCONF" "tools/gpgconf")
|
||||||
|
(gpg-preset-passphrase "GPG_PRESET_PASSPHRASE"
|
||||||
|
"agent/gpg-preset-passphrase")
|
||||||
|
(mktdata "MKTDATA" "tools/mk-tdata")
|
||||||
|
(gpgtar "GPGTAR" "tools/gpgtar")
|
||||||
|
(gpg-zip "GPGZIP" "tools/gpg-zip")))
|
||||||
|
|
||||||
|
(define (tool which)
|
||||||
|
(let ((t (assoc which tools))
|
||||||
|
(prefix (getenv "BIN_PREFIX")))
|
||||||
|
(getenv' (cadr t)
|
||||||
|
(qualify (if (string=? prefix "")
|
||||||
|
(string-append (getenv "objdir") "/" (caddr t))
|
||||||
|
(string-append prefix "/" (basename (caddr t))))))))
|
||||||
|
|
||||||
|
|
||||||
|
(define have-opt-always-trust
|
||||||
|
(string-contains? (call-popen `(,(tool 'gpg) --dump-options) "")
|
||||||
|
"--always-trust"))
|
||||||
|
|
||||||
|
(define GPG `(,(tool 'gpg) --no-permission-warning
|
||||||
|
,@(if have-opt-always-trust '(--always-trust) '())))
|
||||||
|
(define PINENTRY (string-append (getcwd) "/" (qualify "fake-pinentry")))
|
||||||
|
|
||||||
|
(define (tr:gpg input args)
|
||||||
|
(tr:spawn input `(,@GPG --output **out** ,@args **in**)))
|
||||||
|
|
||||||
|
(define (pipe:gpg args)
|
||||||
|
(pipe:spawn `(,@GPG --output - ,@args -)))
|
||||||
|
|
||||||
|
(define (get-config what)
|
||||||
|
(let* ((config-string
|
||||||
|
(call-popen `(,@GPG --with-colons --list-config ,what) ""))
|
||||||
|
(config (string-splitn
|
||||||
|
(string-rtrim char-whitespace? config-string) #\: 2)))
|
||||||
|
(string-split (caddr config) #\;)))
|
||||||
|
|
||||||
|
(define all-pubkey-algos (get-config "pubkeyname"))
|
||||||
|
(define all-hash-algos (get-config "digestname"))
|
||||||
|
(define all-cipher-algos (get-config "ciphername"))
|
||||||
|
|
||||||
|
(define (have-pubkey-algo? x)
|
||||||
|
(not (not (member x all-pubkey-algos))))
|
||||||
|
(define (have-hash-algo? x)
|
||||||
|
(not (not (member x all-hash-algos))))
|
||||||
|
(define (have-cipher-algo? x)
|
||||||
|
(not (not (member x all-cipher-algos))))
|
||||||
|
|
||||||
|
(define (gpg-pipe args0 args1 errfd)
|
||||||
|
(lambda (source sink)
|
||||||
|
(let* ((p (pipe))
|
||||||
|
(task0 (spawn-process-fd `(,@GPG ,@args0)
|
||||||
|
source (:write-end p) errfd))
|
||||||
|
(_ (close (:write-end p)))
|
||||||
|
(task1 (spawn-process-fd `(,@GPG ,@args1)
|
||||||
|
(:read-end p) sink errfd)))
|
||||||
|
(close (:read-end p))
|
||||||
|
(wait-processes (list GPG GPG) (list task0 task1) #t))))
|
||||||
|
|
||||||
|
(setenv "GPG_AGENT_INFO" "" #t)
|
||||||
|
(setenv "GNUPGHOME" (getcwd) #t)
|
||||||
|
|
||||||
|
;;
|
||||||
|
;; GnuPG helper.
|
||||||
|
;;
|
||||||
|
|
||||||
|
;; Call GPG to obtain the hash sums. Either specify an input file in
|
||||||
|
;; ARGS, or an string in INPUT. Returns a list of (<algo>
|
||||||
|
;; "<hashsum>") lists.
|
||||||
|
(define (gpg-hash-string args input)
|
||||||
|
(map
|
||||||
|
(lambda (line)
|
||||||
|
(let ((p (string-split line #\:)))
|
||||||
|
(list (string->number (cadr p)) (caddr p))))
|
||||||
|
(string-split
|
||||||
|
(call-popen `(,@GPG --with-colons ,@args) input) #\newline)))
|
14
tests/openpgp/detach.scm
Executable file
14
tests/openpgp/detach.scm
Executable file
@ -0,0 +1,14 @@
|
|||||||
|
#!/usr/bin/env gpgscm
|
||||||
|
|
||||||
|
(load (with-path "defs.scm"))
|
||||||
|
|
||||||
|
(for-each-p
|
||||||
|
"Checking detached signatures"
|
||||||
|
(lambda (source)
|
||||||
|
(lettmp (tmp)
|
||||||
|
(call-popen `(,@GPG --yes --passphrase-fd "0" -sb
|
||||||
|
--output ,tmp ,source ) usrpass1)
|
||||||
|
(pipe:do
|
||||||
|
(pipe:open source (logior O_RDONLY O_BINARY))
|
||||||
|
(pipe:spawn `(,@GPG --yes ,tmp)))))
|
||||||
|
(append plain-files data-files))
|
18
tests/openpgp/detachm.scm
Executable file
18
tests/openpgp/detachm.scm
Executable file
@ -0,0 +1,18 @@
|
|||||||
|
#!/usr/bin/env gpgscm
|
||||||
|
|
||||||
|
(load (with-path "defs.scm"))
|
||||||
|
|
||||||
|
(define files (append plain-files data-files))
|
||||||
|
|
||||||
|
(info "Checking detached signatures of multiple files")
|
||||||
|
(lettmp (tmp)
|
||||||
|
(call-popen `(,@GPG --yes --passphrase-fd "0" -sb
|
||||||
|
--output ,tmp ,@files) usrpass1)
|
||||||
|
(pipe:do
|
||||||
|
(pipe:defer (lambda (sink)
|
||||||
|
(for-each (lambda (file)
|
||||||
|
(pipe:do
|
||||||
|
(pipe:open file (logior O_RDONLY O_BINARY))
|
||||||
|
(pipe:splice sink)))
|
||||||
|
files)))
|
||||||
|
(pipe:spawn `(,@GPG --yes ,tmp))))
|
232
tests/openpgp/ecc.scm
Executable file
232
tests/openpgp/ecc.scm
Executable file
@ -0,0 +1,232 @@
|
|||||||
|
#!/usr/bin/env gpgscm
|
||||||
|
|
||||||
|
(load (with-path "defs.scm"))
|
||||||
|
|
||||||
|
(define keygrips '("8E06A180EFFE4C65B812150CAF19BF30C0689A4C"
|
||||||
|
"E4403F3FD7A443FAC29FEF288FA0D20AC212851E"
|
||||||
|
"0B7554421FFB14A06CB9F63FB49A85A58E97ABAC"
|
||||||
|
"303ACC892C2D786C8A789677C0BE54DA8538F903"
|
||||||
|
"9FE5C36985351524B6AFA19FDCBC1A3A750B6F5F"
|
||||||
|
"145A52CC7ED3FD41C5B0A26BE220FEED36AF24DE"))
|
||||||
|
(define mainkeyids '("BAA59D9C" "0F54719F" "45AF2FFE"))
|
||||||
|
|
||||||
|
(unless (have-pubkey-algo? "ECDH")
|
||||||
|
(skip "No ECC support due to an old Libgcrypt"))
|
||||||
|
|
||||||
|
(info "Preparing for ECC test")
|
||||||
|
(for-each
|
||||||
|
(lambda (grip)
|
||||||
|
(catch '() (unlink (string-append "private-keys-v1.d/" grip ".key")))
|
||||||
|
(call-check `(,(tool 'gpg-preset-passphrase)
|
||||||
|
--preset --passphrase ecc ,grip)))
|
||||||
|
keygrips)
|
||||||
|
|
||||||
|
(info "Importing ECC public keys")
|
||||||
|
(for-each
|
||||||
|
(lambda (keyid)
|
||||||
|
(call `(,(tool 'gpg) --delete-key --batch --yes ,keyid)))
|
||||||
|
mainkeyids)
|
||||||
|
|
||||||
|
(for-each
|
||||||
|
(lambda (n)
|
||||||
|
(call-check `(,(tool 'gpg) --import
|
||||||
|
,(in-srcdir (string-append
|
||||||
|
"samplekeys/ecc-sample-"
|
||||||
|
(number->string n)
|
||||||
|
"-pub.asc")))))
|
||||||
|
'(1 2 3))
|
||||||
|
|
||||||
|
;; The following is an opaque ECDSA signature on a message "This is one
|
||||||
|
;; line\n" (17 byte long) by the primary 256 bit key:
|
||||||
|
(define msg_opaque_signed_256 "-----BEGIN PGP MESSAGE-----
|
||||||
|
Version: GnuPG v2.1.0-ecc (GNU/Linux)
|
||||||
|
|
||||||
|
owGbwMvMwCHMvVT3w66lc+cwrlFK4k5N1k3KT6nUK6ko8Zl8MSEkI7NYAYjy81IV
|
||||||
|
cjLzUrk64lgYhDkY2FiZQNIMXJwCMO31rxgZ+tW/zesUPxWzdKWrtLGW/LkP5rXL
|
||||||
|
V/Yvnr/EKjBbQuvZSYa/klsum6XFmTze+maVgclT6Rc6hzqqxNy6o6qdTTmLJuvp
|
||||||
|
AQA=
|
||||||
|
=GDv4
|
||||||
|
-----END PGP MESSAGE----")
|
||||||
|
|
||||||
|
;; The following is an opaque ECDSA signature on a message "This is one
|
||||||
|
;; line\n" (17 byte long) by the primary 384 bit key:
|
||||||
|
(define msg_opaque_signed_384 "-----BEGIN PGP MESSAGE-----
|
||||||
|
Version: PGP Command Line v10.0.0 (Linux)
|
||||||
|
|
||||||
|
qANQR1DIqwE7wsvMwCnM2WDcwR9SOJ/xtFISd25qcXFieqpeSUUJAxCEZGQWKwBR
|
||||||
|
fl6qQk5mXirXoXJmVgbfYC5xmC5hzsDPjHXqbDLzpXpTBXSZV3L6bAgP3Kq7Ykmo
|
||||||
|
7Ds1v4UfBS+3CSSon7Pzq79WLjzXXEH54MkjPxnrw+8cfMVnY7Bi18J702Nnsa7a
|
||||||
|
9lMv/PM0/ao9CZ3KX7Q+Tv1rllTZ5Hj4V1frw431QnHfAA==
|
||||||
|
=elKT
|
||||||
|
-----END PGP MESSAGE-----")
|
||||||
|
|
||||||
|
;; The following is an opaque ECDSA signature on a message "This is one
|
||||||
|
;; line\n" (17 byte long) by the primary 521 bit key:
|
||||||
|
(define msg_opaque_signed_521 "-----BEGIN PGP MESSAGE-----
|
||||||
|
Version: PGP Command Line v10.0.0 (Linux)
|
||||||
|
|
||||||
|
qANQR1DIwA8BO8LLzMAlnO3Y8tB1vf4/xtNKSdy5qcXFiempeiUVJQxAEJKRWawA
|
||||||
|
RPl5qQo5mXmpXIdmMLMy+AaLnoLpEubatpeJY2Lystd7Qt32q2UcvRS5kNPWtDB7
|
||||||
|
ryufvcrWtFM7Jx8qXKDxZuqr7b9PGv1Ssk+I8TzB2O9dZC+n/jv+PAdbuu7mLe33
|
||||||
|
Gf9pLd3weV3Qno6FOqxGa5ZszQx+uer2xH3/El9x/2pVeO4l15ScsL7qWMTmffmG
|
||||||
|
Ic1RdzgeCfosMF+l/zVRchcLKzenEQA=
|
||||||
|
=ATtX
|
||||||
|
-----END PGP MESSAGE-----")
|
||||||
|
|
||||||
|
(lettmp (z)
|
||||||
|
(letfd ((fd (open z (logior O_WRONLY O_CREAT O_BINARY) #o600)))
|
||||||
|
(display "This is one line\n" (fdopen fd "wb")))
|
||||||
|
|
||||||
|
(for-each-p
|
||||||
|
"Checking opaque ECDSA signatures"
|
||||||
|
(lambda (test)
|
||||||
|
(lettmp (x y)
|
||||||
|
(call-with-output-file
|
||||||
|
x (lambda (p) (display (eval test (current-environment)) p)))
|
||||||
|
(call-check `(,(tool 'gpg) --verify ,x))
|
||||||
|
(call-check `(,(tool 'gpg) --output ,y ,x))
|
||||||
|
(unless (file=? y z) (error "mismatch"))))
|
||||||
|
'(msg_opaque_signed_256 msg_opaque_signed_384 msg_opaque_signed_521)))
|
||||||
|
|
||||||
|
;;
|
||||||
|
;; Import the secret keys so that we now can sign and decrypt.
|
||||||
|
;;
|
||||||
|
;; Note that the PGP generated secret keys are not self-signed, thus we
|
||||||
|
;; need to pass an appropriate option.
|
||||||
|
;;
|
||||||
|
(info "Importing ECC secret keys")
|
||||||
|
(setenv "PINENTRY_USER_DATA" "ecc" #t)
|
||||||
|
(for-each
|
||||||
|
(lambda (n)
|
||||||
|
(call-check `(,(tool 'gpg) --import
|
||||||
|
,@(if (> n 1) '(--allow-non-selfsigned-uid) '())
|
||||||
|
,(in-srcdir (string-append
|
||||||
|
"samplekeys/ecc-sample-"
|
||||||
|
(number->string n)
|
||||||
|
"-sec.asc")))))
|
||||||
|
'(1 2 3))
|
||||||
|
|
||||||
|
;;
|
||||||
|
;; Check a few sample encrtpted messages.
|
||||||
|
;;
|
||||||
|
(info "Checking ECC encryption")
|
||||||
|
|
||||||
|
;; The following block encrypts the text "This is one line\n", 17 bytes,
|
||||||
|
;; with the subkey 4089AB73.
|
||||||
|
(define msg_encrypted_256 "-----BEGIN PGP MESSAGE-----
|
||||||
|
Version: GnuPG v2.1.0-ecc (GNU/Linux)
|
||||||
|
|
||||||
|
hH4Dd863o0CJq3MSAgMEHdIYZQx+rV1cjy7qitIOEICFFzp4cjsRX4r+rDdMcQUs
|
||||||
|
h7VZmbP1c9C0s9sgCKwubWfkcYUl2ZOju4gy+s4MYTBb4/j8JjnJ9Bqn6LWutTXJ
|
||||||
|
zwsdP13VIJLnhiNqISdR3/6xWQ0ICRYzwb95nUZ1c1DSVgFpjPgUvi4pgYbTpcDB
|
||||||
|
jzILKWBfBDT/jck169XE8vgtbcqVQYZ7lZpaY9CzEbC+4dXZmV1gm5MafpTyFWgH
|
||||||
|
VnyrZB4gad9Lp9e0RKHHcOOE7s/NeLuu
|
||||||
|
=odUZ
|
||||||
|
-----END PGP MESSAGE-----")
|
||||||
|
|
||||||
|
;; The following block encrypts the text "This is one line\n", 17 bytes,
|
||||||
|
;; with the subkey 9A201946:
|
||||||
|
(define msg_encrypted_384 "-----BEGIN PGP MESSAGE-----
|
||||||
|
Version: PGP Command Line v10.0.0 (Linux)
|
||||||
|
|
||||||
|
qANQR1DBngOqi5OPmiAZRhIDAwQqIr/00cJyf+QP+VA4QKVkk77KMHdz9OVaR2XK
|
||||||
|
0VYu0F/HPm89vL2orfm2hrAZxY9G2R0PG4Wk5Lg04UjKca/O72uWtjdPYulFidmo
|
||||||
|
uB0QpzXFz22ZZinxeVPLPEr19Pow0EwCc95cg4HAgrD0nV9vRcTJ/+juVfvsJhAO
|
||||||
|
isMKqrFNMvwnK5A1ECeyVXe7oLZl0lUBRhLr59QTtvf85QJjg/m5kaGy8XCJvLv3
|
||||||
|
61pZa6KUmw89PjtPak7ebcjnINL01vwmyeg1PAyW/xjeGGvcO+R4P1b4ewyFnJyR
|
||||||
|
svzIJcP7d4DqYOw7
|
||||||
|
=oiTJ
|
||||||
|
-----END PGP MESSAGE-----")
|
||||||
|
|
||||||
|
;; The following block encrypts the text "This is one line\n", 17 bytes,
|
||||||
|
;; with the subkey A81C4838:
|
||||||
|
(define msg_encrypted_521 "-----BEGIN PGP MESSAGE-----
|
||||||
|
Version: PGP Command Line v10.0.0 (Linux)
|
||||||
|
|
||||||
|
qANQR1DBwAIDB+qqSKgcSDgSBCMEAKpzTUxB4c56C7g09ekD9I+ttC5ER/xzDmXU
|
||||||
|
OJmFqU5w3FllhFj4TgGxxdH+8fv4W2Ag0IKoJvIY9V1V7oUCClfqAR01QbN7jGH/
|
||||||
|
I9GFFnH19AYEgMKgFmh14ZwN1BS6/VHh+H4apaYqapbx8/09EL+DV9zWLX4GRLXQ
|
||||||
|
VqCR1N2rXE29MJFzGmDOCueQNkUjcbuenoCSKcNT+6xhO27U9IYVCg4BhRUDGfD6
|
||||||
|
dhfRzBLxL+bKR9JVAe46+K8NLjRVu/bd4Iounx4UF5dBk8ERy+/8k9XantDoQgo6
|
||||||
|
RPqCad4Dg/QqkpbK3y574ds3VFNJmc4dVpsXm7lGV5w0FBxhVNPoWNhhECMlTroX
|
||||||
|
Rg==
|
||||||
|
=5GqW
|
||||||
|
-----END PGP MESSAGE-----")
|
||||||
|
|
||||||
|
(lettmp (z)
|
||||||
|
(letfd ((fd (open z (logior O_WRONLY O_CREAT O_BINARY) #o600)))
|
||||||
|
(display "This is one line\n" (fdopen fd "wb")))
|
||||||
|
|
||||||
|
(for-each-p
|
||||||
|
"Checking ECDSA decryption"
|
||||||
|
(lambda (test)
|
||||||
|
(lettmp (x y)
|
||||||
|
(call-with-output-file
|
||||||
|
x (lambda (p) (display (eval test (current-environment)) p)))
|
||||||
|
(call-check `(,@GPG --yes --output ,y ,x))
|
||||||
|
(unless (file=? y z) (error "mismatch"))))
|
||||||
|
'(msg_encrypted_256 msg_encrypted_384 msg_encrypted_521)))
|
||||||
|
|
||||||
|
;;
|
||||||
|
;; Now check that we can encrypt and decrypt our own messages.
|
||||||
|
;;
|
||||||
|
;; Note that we don't need to provide a passppharse because we already
|
||||||
|
;; preset the passphrase into the gpg-agent.
|
||||||
|
;;
|
||||||
|
(for-each-p
|
||||||
|
"Checking ECC encryption and decryption"
|
||||||
|
(lambda (source)
|
||||||
|
(for-each-p
|
||||||
|
""
|
||||||
|
(lambda (keyid)
|
||||||
|
(tr:do
|
||||||
|
(tr:open source)
|
||||||
|
(tr:gpg "" `(--yes --encrypt --recipient ,keyid))
|
||||||
|
(tr:gpg "" '(--yes))
|
||||||
|
(tr:assert-identity source)))
|
||||||
|
mainkeyids))
|
||||||
|
(append plain-files data-files))
|
||||||
|
|
||||||
|
;;
|
||||||
|
;; Now check that we can sign and verify our own messages.
|
||||||
|
;;
|
||||||
|
(for-each-p
|
||||||
|
"Checking ECC signing and verifiction"
|
||||||
|
(lambda (source)
|
||||||
|
(for-each-p
|
||||||
|
""
|
||||||
|
(lambda (keyid)
|
||||||
|
(tr:do
|
||||||
|
(tr:open source)
|
||||||
|
(tr:gpg "" `(--yes --sign --local-user ,keyid))
|
||||||
|
(tr:gpg "" '(--yes))
|
||||||
|
(tr:assert-identity source)))
|
||||||
|
mainkeyids))
|
||||||
|
(append plain-files data-files))
|
||||||
|
|
||||||
|
;;
|
||||||
|
;; Let us also try to import the keys only from a secret keyblock.
|
||||||
|
;;
|
||||||
|
;; Because PGP does not sign the UID, it is not very useful to work
|
||||||
|
;; with this key unless we go into the trouble of adding the
|
||||||
|
;; self-signature.
|
||||||
|
;;
|
||||||
|
(info "Importing ECC secret keys directly")
|
||||||
|
(for-each
|
||||||
|
(lambda (keyid)
|
||||||
|
(catch '() (unlink (string-append "private-keys-v1.d/" keyid ".key"))))
|
||||||
|
keygrips)
|
||||||
|
(for-each
|
||||||
|
(lambda (keyid)
|
||||||
|
(call `(,(tool 'gpg) --delete-key --batch --yes ,keyid)))
|
||||||
|
mainkeyids)
|
||||||
|
|
||||||
|
(for-each
|
||||||
|
(lambda (n)
|
||||||
|
(call-check `(,(tool 'gpg) --import
|
||||||
|
,@(if (> n 1) '(--allow-non-selfsigned-uid) '())
|
||||||
|
,(in-srcdir (string-append
|
||||||
|
"samplekeys/ecc-sample-"
|
||||||
|
(number->string n)
|
||||||
|
"-sec.asc")))))
|
||||||
|
'(1 2 3))
|
28
tests/openpgp/encrypt-dsa.scm
Executable file
28
tests/openpgp/encrypt-dsa.scm
Executable file
@ -0,0 +1,28 @@
|
|||||||
|
#!/usr/bin/env gpgscm
|
||||||
|
|
||||||
|
(load (with-path "defs.scm"))
|
||||||
|
|
||||||
|
(for-each-p
|
||||||
|
"Checking encryption using DSA"
|
||||||
|
(lambda (source)
|
||||||
|
(tr:do
|
||||||
|
(tr:open source)
|
||||||
|
(tr:gpg "" `(--yes --encrypt --recipient ,dsa-usrname2))
|
||||||
|
(tr:gpg "" '(--yes))
|
||||||
|
(tr:assert-identity source)))
|
||||||
|
(append plain-files data-files))
|
||||||
|
|
||||||
|
(for-each-p
|
||||||
|
"Checking encryption using DSA and a specific cipher algorithm"
|
||||||
|
(lambda (cipher)
|
||||||
|
(for-each-p
|
||||||
|
""
|
||||||
|
(lambda (source)
|
||||||
|
(tr:do
|
||||||
|
(tr:open source)
|
||||||
|
(tr:gpg "" `(--yes --encrypt --recipient ,dsa-usrname2
|
||||||
|
--cipher-algo ,cipher))
|
||||||
|
(tr:gpg "" '(--yes))
|
||||||
|
(tr:assert-identity source)))
|
||||||
|
(append plain-files data-files)))
|
||||||
|
all-cipher-algos)
|
28
tests/openpgp/encrypt.scm
Executable file
28
tests/openpgp/encrypt.scm
Executable file
@ -0,0 +1,28 @@
|
|||||||
|
#!/usr/bin/env gpgscm
|
||||||
|
|
||||||
|
(load (with-path "defs.scm"))
|
||||||
|
|
||||||
|
(for-each-p
|
||||||
|
"Checking encryption"
|
||||||
|
(lambda (source)
|
||||||
|
(tr:do
|
||||||
|
(tr:open source)
|
||||||
|
(tr:gpg "" `(--yes --encrypt --recipient ,usrname2))
|
||||||
|
(tr:gpg "" '(--yes))
|
||||||
|
(tr:assert-identity source)))
|
||||||
|
(append plain-files data-files))
|
||||||
|
|
||||||
|
(for-each-p
|
||||||
|
"Checking encryption using a specific cipher algorithm"
|
||||||
|
(lambda (cipher)
|
||||||
|
(for-each-p
|
||||||
|
""
|
||||||
|
(lambda (source)
|
||||||
|
(tr:do
|
||||||
|
(tr:open source)
|
||||||
|
(tr:gpg "" `(--yes --encrypt --recipient ,usrname2
|
||||||
|
--cipher-algo ,cipher))
|
||||||
|
(tr:gpg "" '(--yes))
|
||||||
|
(tr:assert-identity source)))
|
||||||
|
(append plain-files data-files)))
|
||||||
|
all-cipher-algos)
|
14
tests/openpgp/encryptp.scm
Executable file
14
tests/openpgp/encryptp.scm
Executable file
@ -0,0 +1,14 @@
|
|||||||
|
#!/usr/bin/env gpgscm
|
||||||
|
|
||||||
|
(load (with-path "defs.scm"))
|
||||||
|
|
||||||
|
(for-each-p
|
||||||
|
"Checking encryption and decryption using pipes"
|
||||||
|
(lambda (source)
|
||||||
|
(tr:do
|
||||||
|
(tr:open source)
|
||||||
|
(tr:pipe-do
|
||||||
|
(pipe:gpg `(--yes --encrypt --recipient ,usrname2))
|
||||||
|
(pipe:gpg '(--yes)))
|
||||||
|
(tr:assert-identity source)))
|
||||||
|
(append plain-files data-files))
|
6
tests/openpgp/finish.scm
Executable file
6
tests/openpgp/finish.scm
Executable file
@ -0,0 +1,6 @@
|
|||||||
|
#!/usr/bin/env gpgscm
|
||||||
|
|
||||||
|
(load (with-path "defs.scm"))
|
||||||
|
|
||||||
|
(echo "Killing gpg-agent...")
|
||||||
|
(call-check `(,(tool 'gpg-connect-agent) --verbose killagent /bye))
|
35
tests/openpgp/genkey1024.scm
Executable file
35
tests/openpgp/genkey1024.scm
Executable file
@ -0,0 +1,35 @@
|
|||||||
|
#!/usr/bin/env gpgscm
|
||||||
|
|
||||||
|
(load (with-path "defs.scm"))
|
||||||
|
|
||||||
|
(define (genkey config)
|
||||||
|
(pipe:do
|
||||||
|
(pipe:echo config)
|
||||||
|
(pipe:spawn `(,(tool 'gpg) --quiet --batch --gen-key))))
|
||||||
|
|
||||||
|
(info "Checking batch key generation")
|
||||||
|
(genkey "Key-Type: DSA
|
||||||
|
Key-Length: 1024
|
||||||
|
Subkey-Type: ELG
|
||||||
|
Subkey-Length: 1024
|
||||||
|
Name-Real: Harry H.
|
||||||
|
Name-Comment: test key
|
||||||
|
Name-Email: hh@@ddorf.de
|
||||||
|
Expire-Date: 1
|
||||||
|
%no-protection
|
||||||
|
%transient-key
|
||||||
|
%commit
|
||||||
|
")
|
||||||
|
|
||||||
|
(if (have-pubkey-algo? "RSA")
|
||||||
|
(genkey "Key-Type: RSA
|
||||||
|
Key-Length: 1024
|
||||||
|
Key-Usage: sign,encrypt
|
||||||
|
Name-Real: Harry A.
|
||||||
|
Name-Comment: RSA test key
|
||||||
|
Name-Email: hh@@ddorf.de
|
||||||
|
Expire-Date: 2
|
||||||
|
%no-protection
|
||||||
|
%transient-key
|
||||||
|
%commit
|
||||||
|
"))
|
71
tests/openpgp/gpgtar.scm
Executable file
71
tests/openpgp/gpgtar.scm
Executable file
@ -0,0 +1,71 @@
|
|||||||
|
#!/usr/bin/env gpgscm
|
||||||
|
|
||||||
|
(load (with-path "defs.scm"))
|
||||||
|
|
||||||
|
(unless (= 0 (call `(,(tool 'gpgtar) --help)))
|
||||||
|
(skip "gpgtar not installed"))
|
||||||
|
|
||||||
|
(define testfiles (append plain-files data-files))
|
||||||
|
(define gpgargs
|
||||||
|
(if have-opt-always-trust
|
||||||
|
"--no-permission-warning --always-trust"
|
||||||
|
"--no-permission-warning"))
|
||||||
|
|
||||||
|
(define (do-test create-flags inspect-flags extract-flags)
|
||||||
|
(lettmp (archive)
|
||||||
|
(call-check `(,(tool 'gpgtar) --gpg ,(tool 'gpg) --gpg-args ,gpgargs
|
||||||
|
,@create-flags
|
||||||
|
--output ,archive
|
||||||
|
,@testfiles))
|
||||||
|
(tr:do
|
||||||
|
(tr:pipe-do
|
||||||
|
(pipe:spawn `(,(tool 'gpgtar) --gpg ,(tool 'gpg) --gpg-args ,gpgargs
|
||||||
|
--list-archive ,@inspect-flags
|
||||||
|
,archive)))
|
||||||
|
(tr:call-with-content
|
||||||
|
(lambda (c)
|
||||||
|
(unless (all (lambda (f) (string-contains? c f)) testfiles)
|
||||||
|
(error "some file(s) are missing from archive")))))
|
||||||
|
|
||||||
|
(with-temporary-working-directory
|
||||||
|
(call-check `(,(tool 'gpgtar) --gpg ,(tool 'gpg) --gpg-args ,gpgargs
|
||||||
|
--tar-args --directory=.
|
||||||
|
--decrypt
|
||||||
|
,@extract-flags
|
||||||
|
,archive))
|
||||||
|
|
||||||
|
(for-each
|
||||||
|
(lambda (f) (unless (call-with-input-file f (lambda (x) #t))
|
||||||
|
(error (string-append "missing file: " f))))
|
||||||
|
testfiles))))
|
||||||
|
|
||||||
|
(info "Checking gpgtar without encryption")
|
||||||
|
(do-test `(--skip-crypto --encrypt) '(--skip-crypto) '(--skip-crypto))
|
||||||
|
|
||||||
|
(info "Checking gpgtar with asymmetric encryption")
|
||||||
|
(do-test `(--encrypt --recipient ,usrname2) '() '())
|
||||||
|
|
||||||
|
(info "Checking gpgtar with asymmetric encryption and signature")
|
||||||
|
(do-test `(--encrypt --recipient ,usrname2 --sign --local-user ,usrname3)
|
||||||
|
'() '())
|
||||||
|
|
||||||
|
(info "Checking gpgtar with signature")
|
||||||
|
(do-test `(--sign --local-user ,usrname3) '() '())
|
||||||
|
|
||||||
|
(lettmp (passphrasefile)
|
||||||
|
(letfd ((fd (open passphrasefile (logior O_WRONLY O_CREAT O_BINARY) #o600)))
|
||||||
|
(display "streng geheimes hupsipupsi" (fdopen fd "wb")))
|
||||||
|
|
||||||
|
(let ((ppflags `(--gpg-args ,(string-append "--passphrase-file="
|
||||||
|
passphrasefile))))
|
||||||
|
(info "Checking gpgtar with symmetric encryption")
|
||||||
|
(do-test `(,@ppflags --symmetric) ppflags ppflags)
|
||||||
|
|
||||||
|
(info "Checking gpgtar with symmetric encryption and chosen cipher")
|
||||||
|
(do-test `(,@ppflags --symmetric --gpg-args
|
||||||
|
,(string-append "--cipher=" (car all-cipher-algos)))
|
||||||
|
ppflags ppflags)
|
||||||
|
|
||||||
|
(info "Checking gpgtar with both symmetric and asymmetric encryption")
|
||||||
|
(do-test `(,@ppflags --symmetric --encrypt --recipient ,usrname2
|
||||||
|
--sign --local-user ,usrname3) ppflags ppflags)))
|
43
tests/openpgp/import.scm
Executable file
43
tests/openpgp/import.scm
Executable file
@ -0,0 +1,43 @@
|
|||||||
|
#!/usr/bin/env gpgscm
|
||||||
|
|
||||||
|
(load (with-path "defs.scm"))
|
||||||
|
|
||||||
|
(info "Checking bug 894: segv importing certain keys.")
|
||||||
|
(call-check `(,(tool 'gpg) --import ,(in-srcdir "bug894-test.asc")))
|
||||||
|
|
||||||
|
(define keyid "0xC108E83A")
|
||||||
|
(info "Checking bug 1223: designated revoker sigs are not properly merged.")
|
||||||
|
(call `(,(tool 'gpg) --delete-key --batch --yes ,keyid))
|
||||||
|
(call `(,(tool 'gpg) --import ,(in-srcdir "bug1223-bogus.asc")))
|
||||||
|
(call `(,(tool 'gpg) --import ,(in-srcdir "bug1223-good.asc")))
|
||||||
|
(tr:do
|
||||||
|
(tr:pipe-do
|
||||||
|
(pipe:gpg `(--list-keys --with-colons ,keyid)))
|
||||||
|
(tr:call-with-content
|
||||||
|
(lambda (c)
|
||||||
|
;; XXX we do not have a regexp library
|
||||||
|
(unless (any (lambda (line)
|
||||||
|
(and (string-prefix? line "rvk:")
|
||||||
|
(string-contains? line ":0EE5BE979282D80B9F7540F1CCD2ED94D21739E9:")))
|
||||||
|
(string-split c #\newline))
|
||||||
|
(exit 1)))))
|
||||||
|
|
||||||
|
(define fpr1 "9E669861368BCA0BE42DAF7DDDA252EBB8EBE1AF")
|
||||||
|
(define fpr2 "A55120427374F3F7AA5F1166DDA252EBB8EBE1AF")
|
||||||
|
(info "Checking import of two keys with colliding long key ids.")
|
||||||
|
(call `(,(tool 'gpg) --delete-key --batch --yes ,fpr1 ,fpr2))
|
||||||
|
(call `(,(tool 'gpg) --import ,(in-srcdir "samplekeys/dda252ebb8ebe1af-1.asc")))
|
||||||
|
(call `(,(tool 'gpg) --import ,(in-srcdir "samplekeys/dda252ebb8ebe1af-2.asc")))
|
||||||
|
(tr:do
|
||||||
|
(tr:pipe-do
|
||||||
|
(pipe:gpg `(--list-keys --with-colons ,fpr1 ,fpr2)))
|
||||||
|
(tr:call-with-content
|
||||||
|
(lambda (c)
|
||||||
|
;; XXX we do not have a regexp library
|
||||||
|
(let ((keys (filter
|
||||||
|
(lambda (line)
|
||||||
|
(and (string-prefix? line "pub:")
|
||||||
|
(string-contains? line ":4096:1:DDA252EBB8EBE1AF:")))
|
||||||
|
(string-split c #\newline))))
|
||||||
|
(unless (= 2 (length keys))
|
||||||
|
(error "Importing keys with long id collision failed"))))))
|
51
tests/openpgp/mds.scm
Executable file
51
tests/openpgp/mds.scm
Executable file
@ -0,0 +1,51 @@
|
|||||||
|
#!/usr/bin/env gpgscm
|
||||||
|
|
||||||
|
(load (with-path "defs.scm"))
|
||||||
|
|
||||||
|
(define empty-string-hashes
|
||||||
|
`((1 "D41D8CD98F00B204E9800998ECF8427E" "MD5")
|
||||||
|
(2 "DA39A3EE5E6B4B0D3255BFEF95601890AFD80709" "SHA1")
|
||||||
|
(3 "9C1185A5C5E9FC54612808977EE8F548B2258D31" "RIPEMD160")
|
||||||
|
(11 "D14A028C2A3A2BC9476102BB288234C415A2B01F828EA62AC5B3E42F" "SHA224")
|
||||||
|
(8 "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855" "SHA256")
|
||||||
|
(9 "38B060A751AC96384CD9327EB1B1E36A21FDB71114BE07434C0CC7BF63F6E1DA274EDEBFE76F65FBD51AD2F14898B95B" "SHA384")
|
||||||
|
(10
|
||||||
|
"CF83E1357EEFB8BDF1542850D66D8007D620E4050B5715DC83F4A921D36CE9CE47D0D13C5D85F2B0FF8318D2877EEC2F63B931BD47417A81A538327AF927DA3E"
|
||||||
|
"SHA512")))
|
||||||
|
|
||||||
|
(define abc-hashes
|
||||||
|
`((1 "C3FCD3D76192E4007DFB496CCA67E13B" "MD5")
|
||||||
|
(2 "32D10C7B8CF96570CA04CE37F2A19D84240D3A89" "SHA1")
|
||||||
|
(3 "F71C27109C692C1B56BBDCEB5B9D2865B3708DBC" "RIPEMD160")
|
||||||
|
(11 "45A5F72C39C5CFF2522EB3429799E49E5F44B356EF926BCF390DCCC2" "SHA224")
|
||||||
|
(8 "71C480DF93D6AE2F1EFAD1447C66C9525E316218CF51FC8D9ED832F2DAF18B73" "SHA256")
|
||||||
|
(9 "FEB67349DF3DB6F5924815D6C3DC133F091809213731FE5C7B5F4999E463479FF2877F5F2936FA63BB43784B12F3EBB4" "SHA384")
|
||||||
|
(10 "4DBFF86CC2CA1BAE1E16468A05CB9881C97F1753BCE3619034898FAA1AABE429955A1BF8EC483D7421FE3C1646613A59ED5441FB0F321389F77F48A879C7B1F1" "SHA512")))
|
||||||
|
|
||||||
|
;; Symbolic names for the triples above.
|
||||||
|
(define :algo car)
|
||||||
|
(define :value cadr)
|
||||||
|
(define :name caddr)
|
||||||
|
|
||||||
|
;; Test whether HASH matches REF.
|
||||||
|
(define (test-hash hash ref)
|
||||||
|
(unless (eq? #f ref)
|
||||||
|
(if (not (string=? (:value hash) (:value ref)))
|
||||||
|
(error "failed"))))
|
||||||
|
|
||||||
|
;; Test whether the hashes computed over S match the REFERENCE set.
|
||||||
|
(define (test-hashes msg s reference)
|
||||||
|
(for-each-p'
|
||||||
|
msg
|
||||||
|
(lambda (hash) (test-hash hash (assv (:algo hash) reference)))
|
||||||
|
(lambda (hash)
|
||||||
|
(let ((ref (assv (:algo hash) reference)))
|
||||||
|
(if (eq? #f ref)
|
||||||
|
(string-append "no-ref-for:" (number->string (:algo hash)))
|
||||||
|
(:name ref))))
|
||||||
|
(gpg-hash-string '(--print-mds) s)))
|
||||||
|
|
||||||
|
(test-hashes "Hashing the empty string"
|
||||||
|
"" empty-string-hashes)
|
||||||
|
(test-hashes "Hashing the string \"abcdefghijklmnopqrstuvwxyz\""
|
||||||
|
"abcdefghijklmnopqrstuvwxyz" abc-hashes)
|
155
tests/openpgp/multisig.scm
Executable file
155
tests/openpgp/multisig.scm
Executable file
@ -0,0 +1,155 @@
|
|||||||
|
#!/usr/bin/env gpgscm
|
||||||
|
|
||||||
|
;; Check that gpg verifies only signatures where there is no ambiguity
|
||||||
|
;; in the order of packets. Needs the Demo Keys Lima and Mike.
|
||||||
|
;;
|
||||||
|
;; Note: We do not support multiple signatures anymore thus this test is
|
||||||
|
;; not really needed because verify could do the same. We keep it anyway.
|
||||||
|
|
||||||
|
(load (with-path "defs.scm"))
|
||||||
|
|
||||||
|
(define sig-1ls1ls-valid "
|
||||||
|
-----BEGIN PGP ARMORED FILE-----
|
||||||
|
|
||||||
|
kA0DAAIRN8q1H7eRA/gBrCdiBXRleHQxOogq9EkgYW0gc29ycnksIEkgY2FuJ3Qg
|
||||||
|
ZG8gdGhhdAqIPwMFADqIKvQ3yrUft5ED+BEC2joAoJaSaXOZEtSZqQ780HIXG77e
|
||||||
|
8PB7AJ4wCprmaFTO0fBaTcXDuEOBdAWnOZANAwACETfKtR+3kQP4AawnYgV0ZXh0
|
||||||
|
MTqIKvRJIGFtIHNvcnJ5LCBJIGNhbid0IGRvIHRoYXQKiD8DBQA6iCr0N8q1H7eR
|
||||||
|
A/gRAto6AKCWkmlzmRLUmakO/NByFxu+3vDwewCeMAqa5mhUztHwWk3Fw7hDgXQF
|
||||||
|
pzk=
|
||||||
|
=8jSC
|
||||||
|
-----END PGP ARMORED FILE-----
|
||||||
|
")
|
||||||
|
(define sig-ls-valid "
|
||||||
|
-----BEGIN PGP ARMORED FILE-----
|
||||||
|
|
||||||
|
rCdiBXRleHQxOogrS0kgYW0gc29ycnksIEkgY2FuJ3QgZG8gdGhhdAqIPwMFADqI
|
||||||
|
K0s3yrUft5ED+BECLQMAn2jZUNOpB4OuurSQkc2TRfg6ek02AJ9+oJS0frQ+yUsT
|
||||||
|
QDUFTH2PvZRxjw==
|
||||||
|
=J+lb
|
||||||
|
-----END PGP ARMORED FILE-----
|
||||||
|
")
|
||||||
|
(define sig-sl-valid "
|
||||||
|
-----BEGIN PGP ARMORED FILE-----
|
||||||
|
|
||||||
|
iD8DBQA6iCtLN8q1H7eRA/gRAi0DAJ9o2VDTqQeDrrq0kJHNk0X4OnpNNgCffqCU
|
||||||
|
tH60PslLE0A1BUx9j72UcY+sJ2IFdGV4dDE6iCtLSSBhbSBzb3JyeSwgSSBjYW4n
|
||||||
|
dCBkbyB0aGF0Cg==
|
||||||
|
=N9MP
|
||||||
|
-----END PGP ARMORED FILE-----
|
||||||
|
")
|
||||||
|
(define sig-11lss-valid-but-is-not "
|
||||||
|
-----BEGIN PGP ARMORED FILE-----
|
||||||
|
|
||||||
|
kA0DAAIRN8q1H7eRA/gAkA0DAAIRN8q1H7eRA/gBrCdiBXRleHQxOogyXUkgYW0g
|
||||||
|
c29ycnksIEkgY2FuJ3QgZG8gdGhhdAqIPwMFADqIMl03yrUft5ED+BECwQAAnRXT
|
||||||
|
mXjVd385oD38W80XuheWKTGcAJ9pZ6/flaKDfw+SLido7xaUHuhp5Yg/AwUAOogy
|
||||||
|
XTfKtR+3kQP4EQLBAACgnN0IP+NztE0aAc/DZ17yHWR9diwAniN0P01WmbgZJoZB
|
||||||
|
Q341WRXKS/at
|
||||||
|
=Ekrs
|
||||||
|
-----END PGP ARMORED FILE-----
|
||||||
|
")
|
||||||
|
(define sig-11lss11lss-valid-but-is-not "
|
||||||
|
-----BEGIN PGP ARMORED FILE-----
|
||||||
|
|
||||||
|
kA0DAAIRN8q1H7eRA/gAkA0DAAIRN8q1H7eRA/gBrCdiBXRleHQxOogyXUkgYW0g
|
||||||
|
c29ycnksIEkgY2FuJ3QgZG8gdGhhdAqIPwMFADqIMl03yrUft5ED+BECwQAAnRXT
|
||||||
|
mXjVd385oD38W80XuheWKTGcAJ9pZ6/flaKDfw+SLido7xaUHuhp5Yg/AwUAOogy
|
||||||
|
XTfKtR+3kQP4EQLBAACgnN0IP+NztE0aAc/DZ17yHWR9diwAniN0P01WmbgZJoZB
|
||||||
|
Q341WRXKS/atkA0DAAIRN8q1H7eRA/gAkA0DAAIRN8q1H7eRA/gBrCdiBXRleHQx
|
||||||
|
OogyXUkgYW0gc29ycnksIEkgY2FuJ3QgZG8gdGhhdAqIPwMFADqIMl03yrUft5ED
|
||||||
|
+BECwQAAnRXTmXjVd385oD38W80XuheWKTGcAJ9pZ6/flaKDfw+SLido7xaUHuhp
|
||||||
|
5Yg/AwUAOogyXTfKtR+3kQP4EQLBAACgnN0IP+NztE0aAc/DZ17yHWR9diwAniN0
|
||||||
|
P01WmbgZJoZBQ341WRXKS/at
|
||||||
|
=P1Mu
|
||||||
|
-----END PGP ARMORED FILE-----
|
||||||
|
")
|
||||||
|
(define sig-ssl-valid-but-is-not "
|
||||||
|
-----BEGIN PGP ARMORED FILE-----
|
||||||
|
|
||||||
|
iD8DBQA6iCtLN8q1H7eRA/gRAi0DAJ9o2VDTqQeDrrq0kJHNk0X4OnpNNgCffqCU
|
||||||
|
tH60PslLE0A1BUx9j72UcY+IPwMFADqIK0s3yrUft5ED+BECLQMAn2jZUNOpB4Ou
|
||||||
|
urSQkc2TRfg6ek02AJ9+oJS0frQ+yUsTQDUFTH2PvZRxj6wnYgV0ZXh0MTqIK0tJ
|
||||||
|
IGFtIHNvcnJ5LCBJIGNhbid0IGRvIHRoYXQK
|
||||||
|
=Zven
|
||||||
|
-----END PGP ARMORED FILE-----
|
||||||
|
")
|
||||||
|
(define sig-1lsls-invalid "
|
||||||
|
-----BEGIN PGP ARMORED FILE-----
|
||||||
|
|
||||||
|
kA0DAAIRN8q1H7eRA/gBrCdiBXRleHQxOogq9EkgYW0gc29ycnksIEkgY2FuJ3Qg
|
||||||
|
ZG8gdGhhdAqIPwMFADqIKvQ3yrUft5ED+BEC2joAoJaSaXOZEtSZqQ780HIXG77e
|
||||||
|
8PB7AJ4wCprmaFTO0fBaTcXDuEOBdAWnOawnYgV0ZXh0MTqIK0tJIGFtIHNvcnJ5
|
||||||
|
LCBJIGNhbid0IGRvIHRoYXQKiD8DBQA6iCtLN8q1H7eRA/gRAi0DAJ9o2VDTqQeD
|
||||||
|
rrq0kJHNk0X4OnpNNgCffqCUtH60PslLE0A1BUx9j72UcY8=
|
||||||
|
=nkeu
|
||||||
|
-----END PGP ARMORED FILE-----
|
||||||
|
")
|
||||||
|
(define sig-lsls-invalid "
|
||||||
|
-----BEGIN PGP ARMORED FILE-----
|
||||||
|
|
||||||
|
rCdiBXRleHQxOogrS0kgYW0gc29ycnksIEkgY2FuJ3QgZG8gdGhhdAqIPwMFADqI
|
||||||
|
K0s3yrUft5ED+BECLQMAn2jZUNOpB4OuurSQkc2TRfg6ek02AJ9+oJS0frQ+yUsT
|
||||||
|
QDUFTH2PvZRxj6wnYgV0ZXh0MTqIK0tJIGFtIHNvcnJ5LCBJIGNhbid0IGRvIHRo
|
||||||
|
YXQKiD8DBQA6iCtLN8q1H7eRA/gRAi0DAJ9o2VDTqQeDrrq0kJHNk0X4OnpNNgCf
|
||||||
|
fqCUtH60PslLE0A1BUx9j72UcY8=
|
||||||
|
=BlZH
|
||||||
|
-----END PGP ARMORED FILE-----
|
||||||
|
")
|
||||||
|
(define sig-lss-invalid "
|
||||||
|
-----BEGIN PGP ARMORED FILE-----
|
||||||
|
|
||||||
|
rCdiBXRleHQxOogrS0kgYW0gc29ycnksIEkgY2FuJ3QgZG8gdGhhdAqIPwMFADqI
|
||||||
|
K0s3yrUft5ED+BECLQMAn2jZUNOpB4OuurSQkc2TRfg6ek02AJ9+oJS0frQ+yUsT
|
||||||
|
QDUFTH2PvZRxj4g/AwUAOogrSzfKtR+3kQP4EQItAwCfaNlQ06kHg666tJCRzZNF
|
||||||
|
+Dp6TTYAn36glLR+tD7JSxNANQVMfY+9lHGP
|
||||||
|
=jmt6
|
||||||
|
-----END PGP ARMORED FILE-----
|
||||||
|
")
|
||||||
|
(define sig-slsl-invalid "
|
||||||
|
-----BEGIN PGP ARMORED FILE-----
|
||||||
|
|
||||||
|
iD8DBQA6iCtLN8q1H7eRA/gRAi0DAJ9o2VDTqQeDrrq0kJHNk0X4OnpNNgCffqCU
|
||||||
|
tH60PslLE0A1BUx9j72UcY+sJ2IFdGV4dDE6iCtLSSBhbSBzb3JyeSwgSSBjYW4n
|
||||||
|
dCBkbyB0aGF0Cog/AwUAOogrSzfKtR+3kQP4EQItAwCfaNlQ06kHg666tJCRzZNF
|
||||||
|
+Dp6TTYAn36glLR+tD7JSxNANQVMfY+9lHGPrCdiBXRleHQxOogrS0kgYW0gc29y
|
||||||
|
cnksIEkgY2FuJ3QgZG8gdGhhdAo=
|
||||||
|
=phBF
|
||||||
|
-----END PGP ARMORED FILE-----
|
||||||
|
")
|
||||||
|
|
||||||
|
(for-each-p
|
||||||
|
"Checking that a valid signature is verified as such"
|
||||||
|
(lambda (armored-file)
|
||||||
|
(tr:do
|
||||||
|
(tr:pipe-do
|
||||||
|
(pipe:echo (eval armored-file (current-environment)))
|
||||||
|
(pipe:spawn `(,@GPG --dearmor)))
|
||||||
|
(tr:spawn "" `(,@GPG --verify **in**))))
|
||||||
|
'(sig-sl-valid))
|
||||||
|
|
||||||
|
;; ???
|
||||||
|
;;
|
||||||
|
;; #for i in "$sig-11lss-valid-but-is-not" "$sig-11lss11lss-valid-but-is-not" \
|
||||||
|
;; # "$sig-ssl-valid-but-is-not"; do
|
||||||
|
;; # echo "$i" | $GPG --dearmor >x
|
||||||
|
;; # $GPG --verify <x 2>/dev/null || error "valid is invalid"
|
||||||
|
;; #done
|
||||||
|
|
||||||
|
(for-each-p
|
||||||
|
"Checking that an invalid signature is verified as such"
|
||||||
|
(lambda (armored-file)
|
||||||
|
(tr:do
|
||||||
|
(tr:pipe-do
|
||||||
|
(pipe:echo (eval armored-file (current-environment)))
|
||||||
|
(pipe:spawn `(,@GPG --dearmor)))
|
||||||
|
;; XXX: this is ugly
|
||||||
|
(lambda args
|
||||||
|
(if (catch #f ;; verifikation failed, this is what we want
|
||||||
|
(apply (tr:spawn "" `(,@GPG --verify **in**)) args)
|
||||||
|
;; verification succeded, this is an error.
|
||||||
|
#t)
|
||||||
|
(error "invalid signature is valid")
|
||||||
|
args))))
|
||||||
|
'(sig-1ls1ls-valid sig-ls-valid sig-1lsls-invalid
|
||||||
|
sig-lsls-invalid sig-lss-invalid sig-slsl-invalid))
|
209
tests/openpgp/run-tests.scm
Normal file
209
tests/openpgp/run-tests.scm
Normal file
@ -0,0 +1,209 @@
|
|||||||
|
;; Test-suite runner.
|
||||||
|
;;
|
||||||
|
;; 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 <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
(if (string=? "" (getenv "srcdir"))
|
||||||
|
(begin
|
||||||
|
(echo "Environment variable 'srcdir' not set. Please point it to"
|
||||||
|
"tests/openpgp.")
|
||||||
|
(exit 2)))
|
||||||
|
|
||||||
|
;; Set objdir so that the tests can locate built programs.
|
||||||
|
(setenv "objdir" (getcwd) #f)
|
||||||
|
|
||||||
|
(define test-pool
|
||||||
|
(package
|
||||||
|
(define (new procs)
|
||||||
|
(package
|
||||||
|
(define (add test)
|
||||||
|
(new (cons test procs)))
|
||||||
|
(define (wait)
|
||||||
|
(let ((unfinished (filter (lambda (t) (not t::retcode)) procs)))
|
||||||
|
(if (null? unfinished)
|
||||||
|
(package)
|
||||||
|
(let* ((commands (map (lambda (t) t::command) unfinished))
|
||||||
|
(pids (map (lambda (t) t::pid) unfinished))
|
||||||
|
(results
|
||||||
|
(map (lambda (pid retcode) (list pid retcode))
|
||||||
|
pids
|
||||||
|
(wait-processes (map stringify commands) pids #t))))
|
||||||
|
(new
|
||||||
|
(map (lambda (t)
|
||||||
|
(if t::retcode
|
||||||
|
t
|
||||||
|
(t::set-retcode (cadr (assoc t::pid results)))))
|
||||||
|
procs))))))
|
||||||
|
(define (passed)
|
||||||
|
(filter (lambda (p) (= 0 p::retcode)) procs))
|
||||||
|
(define (skipped)
|
||||||
|
(filter (lambda (p) (= 77 p::retcode)) procs))
|
||||||
|
(define (hard-errored)
|
||||||
|
(filter (lambda (p) (= 99 p::retcode)) procs))
|
||||||
|
(define (failed)
|
||||||
|
(filter (lambda (p)
|
||||||
|
(not (or (= 0 p::retcode) (= 77 p::retcode)
|
||||||
|
(= 99 p::retcode))))
|
||||||
|
procs))
|
||||||
|
(define (report)
|
||||||
|
(echo (length procs) "tests run,"
|
||||||
|
(length (passed)) "succeeded,"
|
||||||
|
(length (failed)) "failed,"
|
||||||
|
(length (skipped)) "skipped.")
|
||||||
|
(length (failed)))))))
|
||||||
|
|
||||||
|
(define (verbosity n)
|
||||||
|
(if (= 0 n) '() (cons '--verbose (verbosity (- n 1)))))
|
||||||
|
|
||||||
|
(define test
|
||||||
|
(package
|
||||||
|
(define (scm name . args)
|
||||||
|
(new name #f `(,*argv0* ,@(verbosity *verbose*) ,@args
|
||||||
|
,(in-srcdir name)) #f #f))
|
||||||
|
(define (new name directory command pid retcode)
|
||||||
|
(package
|
||||||
|
(define (set-directory x)
|
||||||
|
(new name x command pid retcode))
|
||||||
|
(define (set-retcode x)
|
||||||
|
(new name directory command pid x))
|
||||||
|
(define (set-pid x)
|
||||||
|
(new name directory command x retcode))
|
||||||
|
(define (run-sync)
|
||||||
|
(with-working-directory directory
|
||||||
|
(let* ((p (inbound-pipe))
|
||||||
|
(pid (spawn-process-fd command CLOSED_FD
|
||||||
|
(:write-end p) (:write-end p))))
|
||||||
|
(close (:write-end p))
|
||||||
|
(splice (:read-end p) STDERR_FILENO)
|
||||||
|
(close (:read-end p))
|
||||||
|
(let ((t' (set-retcode (wait-process name pid #t))))
|
||||||
|
(t'::report)
|
||||||
|
t'))))
|
||||||
|
(define (run-sync-quiet)
|
||||||
|
(with-working-directory directory
|
||||||
|
(set-retcode
|
||||||
|
(wait-process
|
||||||
|
name (spawn-process-fd command CLOSED_FD CLOSED_FD CLOSED_FD) #t))))
|
||||||
|
(define (run-async)
|
||||||
|
(with-working-directory directory
|
||||||
|
(set-pid (spawn-process-fd command CLOSED_FD CLOSED_FD CLOSED_FD))))
|
||||||
|
(define (status)
|
||||||
|
(let ((t (assoc retcode '((0 "PASS") (77 "SKIP") (99 "ERROR")))))
|
||||||
|
(if (not t) "FAIL" (cadr t))))
|
||||||
|
(define (report)
|
||||||
|
(echo (string-append (status retcode) ":") name))))))
|
||||||
|
|
||||||
|
(define (run-tests-parallel-shared setup teardown . tests)
|
||||||
|
(setup::run-sync)
|
||||||
|
(let loop ((pool (test-pool::new '())) (tests' tests))
|
||||||
|
(if (null? tests')
|
||||||
|
(let ((results (pool::wait)))
|
||||||
|
(for-each (lambda (t) (t::report)) results::procs)
|
||||||
|
(teardown::run-sync)
|
||||||
|
(exit (results::report)))
|
||||||
|
(let ((test (car tests')))
|
||||||
|
(loop (pool::add (test::run-async)) (cdr tests'))))))
|
||||||
|
|
||||||
|
(define (run-tests-parallel-isolated setup teardown . tests)
|
||||||
|
(let loop ((pool (test-pool::new '())) (tests' tests))
|
||||||
|
(if (null? tests')
|
||||||
|
(let ((results (pool::wait)))
|
||||||
|
(for-each (lambda (t)
|
||||||
|
(let ((teardown' (teardown::set-directory t::directory)))
|
||||||
|
(teardown'::run-sync-quiet))
|
||||||
|
(unlink-recursively t::directory)
|
||||||
|
(t::report)) results::procs)
|
||||||
|
(exit (results::report)))
|
||||||
|
(let* ((wd (mkdtemp "gpgscm-XXXXXX"))
|
||||||
|
(test (car tests'))
|
||||||
|
(test' (test::set-directory wd))
|
||||||
|
(setup' (setup::set-directory wd)))
|
||||||
|
(setup'::run-sync-quiet)
|
||||||
|
(loop (pool::add (test'::run-async)) (cdr tests'))))))
|
||||||
|
|
||||||
|
(define (run-tests-sequential-shared setup teardown . tests)
|
||||||
|
(let loop ((pool (test-pool::new '()))
|
||||||
|
(tests' `(,setup ,@tests ,teardown)))
|
||||||
|
(if (null? tests')
|
||||||
|
(let ((results (pool::wait)))
|
||||||
|
(exit (results::report)))
|
||||||
|
(let ((test (car tests')))
|
||||||
|
(loop (pool::add (test::run-sync)) (cdr tests'))))))
|
||||||
|
|
||||||
|
(define (run-tests-sequential-isolated setup teardown . tests)
|
||||||
|
(let loop ((pool (test-pool::new '())) (tests' tests))
|
||||||
|
(if (null? tests')
|
||||||
|
(let ((results (pool::wait)))
|
||||||
|
(for-each (lambda (t)
|
||||||
|
(let ((teardown' (teardown::set-directory t::directory)))
|
||||||
|
(teardown'::run-sync-quiet))
|
||||||
|
(unlink-recursively t::directory))
|
||||||
|
results::procs)
|
||||||
|
(exit (results::report)))
|
||||||
|
(let* ((wd (mkdtemp "gpgscm-XXXXXX"))
|
||||||
|
(test (car tests'))
|
||||||
|
(test' (test::set-directory wd))
|
||||||
|
(setup' (setup::set-directory wd)))
|
||||||
|
(setup'::run-sync-quiet)
|
||||||
|
(loop (pool::add (test'::run-sync)) (cdr tests'))))))
|
||||||
|
|
||||||
|
(define all-tests
|
||||||
|
'("version.scm"
|
||||||
|
"mds.scm"
|
||||||
|
"decrypt.scm"
|
||||||
|
"decrypt-dsa.scm"
|
||||||
|
"sigs.scm"
|
||||||
|
"sigs-dsa.scm"
|
||||||
|
"encrypt.scm"
|
||||||
|
"encrypt-dsa.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"
|
||||||
|
"armor.scm"
|
||||||
|
"import.scm"
|
||||||
|
"ecc.scm"
|
||||||
|
"4gb-packet.scm"
|
||||||
|
"gpgtar.scm"
|
||||||
|
"use-exact-key.scm"
|
||||||
|
"default-key.scm"))
|
||||||
|
|
||||||
|
(let* ((runner (if (member "--parallel" *args*)
|
||||||
|
(if (member "--shared" *args*)
|
||||||
|
run-tests-parallel-shared
|
||||||
|
run-tests-parallel-isolated)
|
||||||
|
(if (member "--shared" *args*)
|
||||||
|
run-tests-sequential-shared
|
||||||
|
run-tests-sequential-isolated)))
|
||||||
|
(tests' (filter (lambda (arg) (not (string-prefix? arg "--"))) *args*))
|
||||||
|
(tests (if (null? tests') all-tests tests')))
|
||||||
|
(apply runner (append (list (test::scm "setup.scm") (test::scm "finish.scm"))
|
||||||
|
(map test::scm tests))))
|
13
tests/openpgp/seat.scm
Executable file
13
tests/openpgp/seat.scm
Executable file
@ -0,0 +1,13 @@
|
|||||||
|
#!/usr/bin/env gpgscm
|
||||||
|
|
||||||
|
(load (with-path "defs.scm"))
|
||||||
|
|
||||||
|
(for-each-p
|
||||||
|
"Checking encryption, signing, and producing armored output"
|
||||||
|
(lambda (source)
|
||||||
|
(tr:do
|
||||||
|
(tr:open source)
|
||||||
|
(tr:gpg usrpass1 '(--yes -seat -r two@example.com --passphrase-fd "0"))
|
||||||
|
(tr:gpg "" '(--yes))
|
||||||
|
(tr:assert-weak-identity source)))
|
||||||
|
plain-files)
|
104
tests/openpgp/setup.scm
Executable file
104
tests/openpgp/setup.scm
Executable file
@ -0,0 +1,104 @@
|
|||||||
|
#!/usr/bin/env gpgscm
|
||||||
|
|
||||||
|
(load (with-path "defs.scm"))
|
||||||
|
|
||||||
|
(echo "Creating test environment...")
|
||||||
|
|
||||||
|
(letfd ((fd (open "random_seed" (logior O_WRONLY O_CREAT O_BINARY) #o600)))
|
||||||
|
(call-with-fds (list (tool 'mktdata) "600") CLOSED_FD fd STDERR_FILENO))
|
||||||
|
|
||||||
|
(for-each-p
|
||||||
|
"Creating configuration files"
|
||||||
|
(lambda (name)
|
||||||
|
(file-copy (in-srcdir (string-append name ".tmpl")) name)
|
||||||
|
(let ((p (open-input-output-file name)))
|
||||||
|
(cond
|
||||||
|
((string=? "gpg.conf" name)
|
||||||
|
(if have-opt-always-trust
|
||||||
|
(display "no-auto-check-trustdb\n" p))
|
||||||
|
(display (string-append "agent-program "
|
||||||
|
(tool 'gpg-agent)
|
||||||
|
"|--debug-quick-random\n") p)
|
||||||
|
(display "allow-weak-digest-algos\n" p))
|
||||||
|
((string=? "gpg-agent.conf" name)
|
||||||
|
(display (string-append "pinentry-program " PINENTRY "\n") p)))))
|
||||||
|
'("gpg.conf" "gpg-agent.conf"))
|
||||||
|
|
||||||
|
(echo "Starting gpg-agent...")
|
||||||
|
(call-check `(,(tool 'gpg-connect-agent) --verbose
|
||||||
|
,(string-append "--agent-program=" (tool 'gpg-agent)
|
||||||
|
"|--debug-quick-random")
|
||||||
|
/bye))
|
||||||
|
|
||||||
|
(for-each-p "Creating sample data files"
|
||||||
|
(lambda (size)
|
||||||
|
(letfd ((fd (open (string-append "data-" (number->string size))
|
||||||
|
(logior O_WRONLY O_CREAT O_BINARY) #o600)))
|
||||||
|
(call-with-fds (list (tool 'mktdata) (number->string size))
|
||||||
|
CLOSED_FD fd STDERR_FILENO)))
|
||||||
|
'(500 9000 32000 80000))
|
||||||
|
|
||||||
|
(define (dearmor source-name sink-name)
|
||||||
|
(letfd ((source (open source-name (logior O_RDONLY O_BINARY)))
|
||||||
|
(sink (open sink-name (logior O_WRONLY O_CREAT O_BINARY) #o600)))
|
||||||
|
(call-with-fds `(,@GPG --dearmor) source sink STDERR_FILENO)))
|
||||||
|
|
||||||
|
(for-each-p "Unpacking samples"
|
||||||
|
(lambda (name)
|
||||||
|
(dearmor (in-srcdir (string-append name "o.asc")) name))
|
||||||
|
'("plain-1" "plain-2" "plain-3" "plain-large"))
|
||||||
|
|
||||||
|
;; XXX implement cleanup
|
||||||
|
(catch '()
|
||||||
|
(mkdir "private-keys-v1.d" "-rwx"))
|
||||||
|
|
||||||
|
(define counter (make-counter))
|
||||||
|
(for-each-p' "Storing private keys"
|
||||||
|
(lambda (name)
|
||||||
|
(dearmor (in-srcdir (string-append "/privkeys/" name ".asc"))
|
||||||
|
(string-append "private-keys-v1.d/" name ".key")))
|
||||||
|
(lambda (name) (counter))
|
||||||
|
'("50B2D4FA4122C212611048BC5FC31BD44393626E"
|
||||||
|
"7E201E28B6FEB2927B321F443205F4724EBE637E"
|
||||||
|
"13FDB8809B17C5547779F9D205C45F47CE0217CE"
|
||||||
|
"343D8AF79796EE107D645A2787A9D9252F924E6F"
|
||||||
|
"8B5ABF3EF9EB8D96B91A0B8C2C4401C91C834C34"
|
||||||
|
"0D6F6AD4C4C803B25470F9104E9F4E6A4CA64255"
|
||||||
|
"FD692BD59D6640A84C8422573D469F84F3B98E53"
|
||||||
|
"76F7E2B35832976B50A27A282D9B87E44577EB66"
|
||||||
|
"A0747D5F9425E6664F4FFBEED20FBCA79FDED2BD"
|
||||||
|
"00FE67F28A52A8AA08FFAED20AF832DA916D1985"
|
||||||
|
"1DF48228FEFF3EC2481B106E0ACA8C465C662CC5"
|
||||||
|
"A2832820DC9F40751BDCD375BB0945BA33EC6B4C"
|
||||||
|
"ADE710D74409777B7729A7653373D820F67892E0"
|
||||||
|
"CEFC51AF91F68A2904FBFF62C4F075A4785B803F"))
|
||||||
|
|
||||||
|
(info "Importing public demo and test keys")
|
||||||
|
(call-check `(,@GPG --yes --import
|
||||||
|
,(in-srcdir "pubdemo.asc")
|
||||||
|
,(in-srcdir "pubring.asc")))
|
||||||
|
;; (letfd ((source (open (in-srcdir "pubring.pkr.asc") O_RDONLY)))
|
||||||
|
;; ((gpg-pipe '(--dearmor) '(--yes --import) STDERR_FILENO)
|
||||||
|
;; source CLOSED_FD))
|
||||||
|
(pipe:do
|
||||||
|
(pipe:open (in-srcdir "pubring.pkr.asc") (logior O_RDONLY O_BINARY))
|
||||||
|
(pipe:spawn `(,@GPG --dearmor))
|
||||||
|
(pipe:spawn `(,@GPG --yes --import)))
|
||||||
|
|
||||||
|
(info "Preset passphrases")
|
||||||
|
;; one@example.com
|
||||||
|
(call-check `(,(tool 'gpg-preset-passphrase)
|
||||||
|
--preset --passphrase def
|
||||||
|
"50B2D4FA4122C212611048BC5FC31BD44393626E"))
|
||||||
|
(call-check `(,(tool 'gpg-preset-passphrase)
|
||||||
|
--preset --passphrase def
|
||||||
|
"7E201E28B6FEB2927B321F443205F4724EBE637E"))
|
||||||
|
;; alpha@example.net
|
||||||
|
(call-check `(,(tool 'gpg-preset-passphrase)
|
||||||
|
--preset --passphrase abc
|
||||||
|
"76F7E2B35832976B50A27A282D9B87E44577EB66"))
|
||||||
|
(call-check `(,(tool 'gpg-preset-passphrase)
|
||||||
|
--preset --passphrase abc
|
||||||
|
"A0747D5F9425E6664F4FFBEED20FBCA79FDED2BD"))
|
||||||
|
|
||||||
|
(echo "All set up.")
|
31
tests/openpgp/signencrypt-dsa.scm
Executable file
31
tests/openpgp/signencrypt-dsa.scm
Executable file
@ -0,0 +1,31 @@
|
|||||||
|
#!/usr/bin/env gpgscm
|
||||||
|
|
||||||
|
(load (with-path "defs.scm"))
|
||||||
|
|
||||||
|
(for-each-p
|
||||||
|
"Checking signing and encryption using DSA"
|
||||||
|
(lambda (source)
|
||||||
|
(tr:do
|
||||||
|
(tr:open source)
|
||||||
|
(tr:gpg usrpass1 `(--yes --passphrase-fd "0" -se
|
||||||
|
-u ,dsa-usrname1
|
||||||
|
--recipient ,dsa-usrname2))
|
||||||
|
(tr:gpg "" '(--yes))
|
||||||
|
(tr:assert-identity source)))
|
||||||
|
(append plain-files data-files))
|
||||||
|
|
||||||
|
(define algos (if (have-hash-algo? "RIPEMD160")
|
||||||
|
'("SHA1" "RIPEMD160")
|
||||||
|
'("SHA1")))
|
||||||
|
(for-each-p
|
||||||
|
"Checking signing and encryption using DSA with a specific hash algorithm"
|
||||||
|
(lambda (hash)
|
||||||
|
(tr:do
|
||||||
|
(tr:open (car plain-files))
|
||||||
|
(tr:gpg usrpass1 `(--yes --passphrase-fd "0" -se
|
||||||
|
-u ,dsa-usrname1
|
||||||
|
--recipient ,dsa-usrname2
|
||||||
|
--digest-algo ,hash))
|
||||||
|
(tr:gpg "" '(--yes))
|
||||||
|
(tr:assert-identity (car plain-files))))
|
||||||
|
algos)
|
22
tests/openpgp/signencrypt.scm
Executable file
22
tests/openpgp/signencrypt.scm
Executable file
@ -0,0 +1,22 @@
|
|||||||
|
#!/usr/bin/env gpgscm
|
||||||
|
|
||||||
|
(load (with-path "defs.scm"))
|
||||||
|
|
||||||
|
(for-each-p
|
||||||
|
"Checking signing and encryption"
|
||||||
|
(lambda (source)
|
||||||
|
(tr:do
|
||||||
|
(tr:open source)
|
||||||
|
(tr:gpg usrpass1 `(--yes --passphrase-fd "0" -se --recipient ,usrname2))
|
||||||
|
(tr:gpg "" '(--yes))
|
||||||
|
(tr:assert-identity source)))
|
||||||
|
(append plain-files data-files))
|
||||||
|
|
||||||
|
(info "Checking bug 537: MDC problem with old style compressed packets.")
|
||||||
|
(lettmp (tmp)
|
||||||
|
(call-popen `(,@GPG --yes --passphrase-fd "0"
|
||||||
|
--output ,tmp ,(in-srcdir "bug537-test.data.asc"))
|
||||||
|
usrpass1)
|
||||||
|
(if (not (string=? "4336AE2A528FAE091E73E59E325B588FEE795F9B"
|
||||||
|
(cadar (gpg-hash-string `(--print-md SHA1 ,tmp) ""))))
|
||||||
|
(error "bug537-test.data.asc: mismatch (bug 537)")))
|
26
tests/openpgp/sigs-dsa.scm
Executable file
26
tests/openpgp/sigs-dsa.scm
Executable file
@ -0,0 +1,26 @@
|
|||||||
|
#!/usr/bin/env gpgscm
|
||||||
|
|
||||||
|
(load (with-path "defs.scm"))
|
||||||
|
|
||||||
|
(for-each-p
|
||||||
|
"Checking signing using DSA with the default hash algorithm"
|
||||||
|
(lambda (source)
|
||||||
|
(tr:do
|
||||||
|
(tr:open source)
|
||||||
|
(tr:gpg "" `(--yes --sign --user ,dsa-usrname1))
|
||||||
|
(tr:gpg "" '(--yes))
|
||||||
|
(tr:assert-identity source)))
|
||||||
|
(append plain-files data-files))
|
||||||
|
|
||||||
|
(define algos (if (have-hash-algo? "RIPEMD160")
|
||||||
|
'("SHA1" "RIPEMD160")
|
||||||
|
'("SHA1")))
|
||||||
|
(for-each-p
|
||||||
|
"Checking signing using DSA with a specific hash algorithm"
|
||||||
|
(lambda (hash)
|
||||||
|
(tr:do
|
||||||
|
(tr:open (car plain-files))
|
||||||
|
(tr:gpg "" `(--yes --sign --user ,dsa-usrname1 --digest-algo ,hash))
|
||||||
|
(tr:gpg "" '(--yes))
|
||||||
|
(tr:assert-identity (car plain-files))))
|
||||||
|
algos)
|
33
tests/openpgp/sigs.scm
Executable file
33
tests/openpgp/sigs.scm
Executable file
@ -0,0 +1,33 @@
|
|||||||
|
#!/usr/bin/env gpgscm
|
||||||
|
|
||||||
|
(load (with-path "defs.scm"))
|
||||||
|
|
||||||
|
(for-each-p
|
||||||
|
"Checking signing with the default hash algorithm"
|
||||||
|
(lambda (source)
|
||||||
|
(tr:do
|
||||||
|
(tr:open source)
|
||||||
|
(tr:gpg "" '(--yes --sign))
|
||||||
|
(tr:gpg "" '(--yes))
|
||||||
|
(tr:assert-identity source)))
|
||||||
|
(append plain-files data-files))
|
||||||
|
|
||||||
|
(for-each-p
|
||||||
|
"Checking signing with a specific hash algorithm"
|
||||||
|
(lambda (hash)
|
||||||
|
(if (have-pubkey-algo? "RSA")
|
||||||
|
;; RSA key, so any hash is okay.
|
||||||
|
(tr:do
|
||||||
|
(tr:open (car plain-files))
|
||||||
|
(tr:gpg "" `(--yes --sign --user ,usrname3 --digest-algo ,hash))
|
||||||
|
(tr:gpg "" '(--yes))
|
||||||
|
(tr:assert-identity (car plain-files))))
|
||||||
|
(if (not (equal? "MD5" hash))
|
||||||
|
;; Using the DSA sig key - only 160 bit or larger hashes
|
||||||
|
(tr:do
|
||||||
|
(tr:open (car plain-files))
|
||||||
|
(tr:gpg usrpass1
|
||||||
|
`(--yes --sign --passphrase-fd "0" --digest-algo ,hash))
|
||||||
|
(tr:gpg "" '(--yes))
|
||||||
|
(tr:assert-identity (car plain-files)))))
|
||||||
|
all-hash-algos)
|
51
tests/openpgp/use-exact-key.scm
Executable file
51
tests/openpgp/use-exact-key.scm
Executable file
@ -0,0 +1,51 @@
|
|||||||
|
#!/usr/bin/env gpgscm
|
||||||
|
|
||||||
|
(load (with-path "defs.scm"))
|
||||||
|
|
||||||
|
;; Import the sample key
|
||||||
|
;;
|
||||||
|
;; pub 1024R/8BC90111 2015-12-02
|
||||||
|
;; Key fingerprint = E657 FB60 7BB4 F21C 90BB 6651 BC06 7AF2 8BC9 0111
|
||||||
|
;; uid [ultimate] Barrett Brown <barrett@example.org>
|
||||||
|
;; sub 1024R/3E880CFF 2015-12-02 (encryption)
|
||||||
|
;; sub 1024R/F5F77B83 2015-12-02 (signing)
|
||||||
|
;; sub 1024R/45117079 2015-12-02 (encryption)
|
||||||
|
;; sub 1024R/1EA97479 2015-12-02 (signing)
|
||||||
|
|
||||||
|
(info "Importing public key.")
|
||||||
|
(call-check
|
||||||
|
`(,(tool 'gpg) --import
|
||||||
|
,(in-srcdir "samplekeys/E657FB607BB4F21C90BB6651BC067AF28BC90111.asc")))
|
||||||
|
|
||||||
|
;; By default, the most recent, valid signing subkey (1EA97479).
|
||||||
|
(for-each-p
|
||||||
|
"Checking that the most recent, valid signing subkey is used by default"
|
||||||
|
(lambda (keyid)
|
||||||
|
(tr:do
|
||||||
|
(tr:pipe-do
|
||||||
|
(pipe:defer (lambda (sink) (display "" (fdopen sink "w"))))
|
||||||
|
(pipe:gpg `(-s -u ,keyid))
|
||||||
|
(pipe:gpg '(--verify --status-fd=1)))
|
||||||
|
(tr:call-with-content
|
||||||
|
(lambda (c)
|
||||||
|
(unless (string-contains?
|
||||||
|
c "VALIDSIG 5FBA84ACE02DCB17DA3DFF6BBCA43C441EA97479")
|
||||||
|
(exit 1))))))
|
||||||
|
'("8BC90111" "3E880CFF" "F5F77B83" "45117079" "1EA97479"))
|
||||||
|
|
||||||
|
;; But, if we request a particular signing key, we should get it.
|
||||||
|
(for-each-p
|
||||||
|
"Checking that we can select a specific signing key"
|
||||||
|
(lambda (keyid)
|
||||||
|
(tr:do
|
||||||
|
(tr:pipe-do
|
||||||
|
(pipe:defer (lambda (sink) (display "" (fdopen sink "w"))))
|
||||||
|
(pipe:gpg `(-s -u ,(string-append keyid "!")))
|
||||||
|
(pipe:gpg '(--verify --status-fd=1)))
|
||||||
|
(tr:call-with-content
|
||||||
|
(lambda (c)
|
||||||
|
;; XXX we do not have a regexp library
|
||||||
|
(unless (and (string-contains? c "VALIDSIG")
|
||||||
|
(string-contains? c keyid))
|
||||||
|
(exit 1))))))
|
||||||
|
'("8BC90111" "F5F77B83" "1EA97479"))
|
257
tests/openpgp/verify.scm
Executable file
257
tests/openpgp/verify.scm
Executable file
@ -0,0 +1,257 @@
|
|||||||
|
#!/usr/bin/env gpgscm
|
||||||
|
|
||||||
|
(load (with-path "defs.scm"))
|
||||||
|
|
||||||
|
;;
|
||||||
|
;; Two simple tests to check that verify fails for bad input data
|
||||||
|
;;
|
||||||
|
(for-each-p
|
||||||
|
"Checking bogus signature"
|
||||||
|
(lambda (char)
|
||||||
|
(lettmp (x)
|
||||||
|
(pipe:do
|
||||||
|
(pipe:spawn `(,(tool 'mktdata) --char ,char "64"))
|
||||||
|
(pipe:write-to x (logior O_WRONLY O_CREAT O_BINARY) #o600))
|
||||||
|
(if (= 0 (call `(,@GPG --verify ,x data-500)))
|
||||||
|
(error "no error code from verify"))))
|
||||||
|
'("0x2d" "0xca"))
|
||||||
|
|
||||||
|
;; 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))
|
||||||
|
|
||||||
|
;; 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)))
|
||||||
|
(error "verification succeded 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)))
|
||||||
|
(error "verification succeded but should not")))
|
||||||
|
'(bad_ls_asc bad_fols_asc bad_olsf_asc bad_ools_asc))
|
8
tests/openpgp/version.scm
Executable file
8
tests/openpgp/version.scm
Executable file
@ -0,0 +1,8 @@
|
|||||||
|
#!/usr/bin/env gpgscm
|
||||||
|
|
||||||
|
(load (with-path "defs.scm"))
|
||||||
|
|
||||||
|
(info "Printing the GPG version")
|
||||||
|
(assert (= 0 (call `(,@GPG --version))))
|
||||||
|
|
||||||
|
;; fixme: check that the output is as expected
|
Loading…
x
Reference in New Issue
Block a user