diff options
author | Justus Winter <justus@g10code.com> | 2016-10-27 18:48:51 +0200 |
---|---|---|
committer | Justus Winter <justus@g10code.com> | 2016-11-03 15:04:18 +0100 |
commit | ab89164be02012f1bf159c971853b8610e966301 (patch) | |
tree | 98026764c92c0b2d34134a327738b65f0c896386 /tests/openpgp/key-selection.scm | |
parent | gpgscm,tests: Add new functions to the test environment. (diff) | |
download | gnupg2-ab89164be02012f1bf159c971853b8610e966301.tar.xz gnupg2-ab89164be02012f1bf159c971853b8610e966301.zip |
g10: Improve and unify key selection for -r and --locate-keys.
* g10/getkey.c (struct pubkey_cmp_cookie): New type.
(key_is_ok, uid_is_ok, subkey_is_ok): New functions.
(pubkey_cmp): Likewise.
(get_best_pubkey_byname): Likewise.
* g10/keydb.h (get_best_pubkey_byname): New prototype.
* g10/keylist.c (locate_one): Use the new function.
* g10/pkclist.c (find_and_check_key): Likewise.
* tests/openpgp/Makefile.am (XTESTS): Add new test.
(TEST_FILES): Add new files.
* tests/openpgp/key-selection.scm: New file.
* tests/openpgp/key-selection/0.asc: Likewise.
* tests/openpgp/key-selection/1.asc: Likewise.
* tests/openpgp/key-selection/2.asc: Likewise.
* tests/openpgp/key-selection/3.asc: Likewise.
* tests/openpgp/key-selection/4.asc: Likewise.
--
When a name resembling a mail address is given to either --locate-keys
or --recipient, rank the search results and use only the most relevant
key.
This also lets us query which key will be used for encryption using
--locate-keys. However, note that --locate-keys may also return keys
incapable of encryption, though it will prefer keys that have an
encryption subkey.
GnuPG-bug-id: 2359
Signed-off-by: Justus Winter <justus@g10code.com>
Diffstat (limited to 'tests/openpgp/key-selection.scm')
-rw-r--r-- | tests/openpgp/key-selection.scm | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/tests/openpgp/key-selection.scm b/tests/openpgp/key-selection.scm new file mode 100644 index 000000000..536f60773 --- /dev/null +++ b/tests/openpgp/key-selection.scm @@ -0,0 +1,82 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2016 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +(load (with-path "defs.scm")) + +;; This test assumes a fixed time of 2004-01-01. + + ;; Redefine gpg with a fixed time. +(define gpg `(,@gpg --faked-system-time=1072911600)) + +;; We have a number of keys for Mr. Acejlnu Acdipr <acdipr@example.org>. +(define mailbox "acdipr@example.org") + +;; The keys are sorted, from the least relevant to the most relevant +;; key. +(define keys + '(("ED087E9D3394340738E20A244892A3CF8F65EBAC" + "no encryption-capable subkey, created: 2003-11-30, expires: 2006-11-29" + 4) + ("D7388651A1B7466D03B538428178E04B0BAA385B" + "encryption-capable subkey, created: 2000-12-31, expired: 2001-12-31" + 0) + ("DDEF1BEC66C8BAC8D69CED2AEABED840EC98B024" + "encryption-capable subkey, created: 2001-12-31, expires: 2006-12-30" + 1) + ("03FCFEDE014027DD897AD2F23D32670A96A9C2BF" + "encryption-capable subkey, created: 2002-12-31, expires: 2005-12-30" + 2) + ("B95BD6175CB6339244355BA160B8117E6119CED6" + "encryption-capable subkeys, last created: 2003-05-31, expires: 2005-05-30" + 3))) + +;; Accessors for the elements of KEYS. +(define :fpr car) +(define :comment cadr) +(define :number caddr) +(define (:filename key) + (in-srcdir "key-selection" + (string-append (number->string (:number key)) ".asc"))) + +(define (delete-keys which) + (call-check `(,@gpg --delete-keys ,@(map :fpr which)))) + +(define (import-keys which) + (call-check `(,@gpg --import ,@(map :filename which)))) + +(for-each-p' + "Checking key selection" + (lambda (set) + (import-keys set) + (let ((fpr (list-ref (assoc "fpr" + (gpg-with-colons `(--locate-key ,mailbox))) + 9)) + (expected (:fpr (last set)))) + (unless (equal? fpr expected) + (display "Given keys ") + (apply echo (map :fpr set)) + (echo "This is what --locate-key says:") + (display (call-popen `(,@gpg --locate-key ,mailbox) "")) + (echo "This is the key we expected:") + (display (call-popen `(,@gpg --list-keys ,expected) "")) + (error "Expected" expected "but got" fpr))) + (delete-keys set)) + (lambda (set) + (length set)) + (filter (lambda (x) (not (null? x))) (powerset keys))) |