Blame lang/python/tests/t-keylist.py

Packit d7e8d0
#!/usr/bin/env python
Packit d7e8d0
Packit d7e8d0
# Copyright (C) 2016 g10 Code GmbH
Packit d7e8d0
#
Packit d7e8d0
# This file is part of GPGME.
Packit d7e8d0
#
Packit d7e8d0
# GPGME is free software; you can redistribute it and/or modify it
Packit d7e8d0
# under the terms of the GNU General Public License as published by
Packit d7e8d0
# the Free Software Foundation; either version 2 of the License, or
Packit d7e8d0
# (at your option) any later version.
Packit d7e8d0
#
Packit d7e8d0
# GPGME is distributed in the hope that it will be useful, but WITHOUT
Packit d7e8d0
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
Packit d7e8d0
# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General
Packit d7e8d0
# Public License for more details.
Packit d7e8d0
#
Packit d7e8d0
# You should have received a copy of the GNU Lesser General Public
Packit d7e8d0
# License along with this program; if not, see <http://www.gnu.org/licenses/>.
Packit d7e8d0
Packit d7e8d0
from __future__ import absolute_import, print_function, unicode_literals
Packit d7e8d0
del absolute_import, print_function, unicode_literals
Packit d7e8d0
Packit d7e8d0
import gpg
Packit d7e8d0
import support
Packit d7e8d0
Packit d7e8d0
c = gpg.Context()
Packit d7e8d0
Packit d7e8d0
# Check expration of keys.  This test assumes three subkeys of which
Packit d7e8d0
# 2 are expired; it is used with the "Whisky" test key.  It has
Packit d7e8d0
# already been checked that these 3 subkeys are available.
Packit d7e8d0
def check_whisky(name, key):
Packit d7e8d0
  sub1 = key.subkeys[2]
Packit d7e8d0
  sub2 = key.subkeys[3]
Packit d7e8d0
Packit d7e8d0
  assert sub1.expired and sub2.expired, \
Packit d7e8d0
      "Subkey of `{}' not flagged as expired".format(name)
Packit d7e8d0
  assert sub1.expires == 1129636886 and sub2.expires == 1129636939, \
Packit d7e8d0
      "Subkey of `{}' has wrong expiration date".format(name)
Packit d7e8d0
Packit d7e8d0
keys = [
Packit d7e8d0
    [ "A0FF4590BB6122EDEF6E3C542D727CC768697734", "6AE6D7EE46A871F8",
Packit d7e8d0
      [ [ "Alfa Test", "demo key", "alfa@example.net" ],
Packit d7e8d0
        [ "Alpha Test", "demo key", "alpha@example.net" ],
Packit d7e8d0
	[ "Alice", "demo key", "" ] ], 1 ],
Packit d7e8d0
    [ "D695676BDCEDCC2CDD6152BCFE180B1DA9E3B0B2", "5381EA4EE29BA37F",
Packit d7e8d0
      [ [ "Bob", "demo key", "" ],
Packit d7e8d0
	[ "Bravo Test", "demo key", "bravo@example.net" ] ], 1 ],
Packit d7e8d0
    [ "61EE841A2A27EB983B3B3C26413F4AF31AFDAB6C", "E71E72ACBC43DA60",
Packit d7e8d0
      [ [ "Charlie Test", "demo key", "charlie@example.net" ] ], 1 ],
Packit d7e8d0
    [ "6560C59C43D031C54D7C588EEBA9F240EB9DC9E6", "06F22880B0C45424",
Packit d7e8d0
      [ [ "Delta Test", "demo key", "delta@example.net" ] ], 1 ],
Packit d7e8d0
    [ "3531152DE293E26A07F504BC318C1FAEFAEF6D1B", "B5C79E1A7272144D",
Packit d7e8d0
      [ [ "Echelon", "demo key", "" ],
Packit d7e8d0
	[ "Echo Test", "demo key", "echo@example.net" ],
Packit d7e8d0
	[ "Eve", "demo key", "" ] ], 1 ],
Packit d7e8d0
    [ "56D33268F7FE693FBB594762D4BF57F37372E243", "0A32EE79EE45198E",
Packit d7e8d0
      [ [ "Foxtrot Test", "demo key", "foxtrot@example.net" ] ], 1 ],
Packit d7e8d0
    [ "C9C07DCC6621B9FB8D071B1D168410A48FC282E6", "247491CC9DCAD354",
Packit d7e8d0
      [ [ "Golf Test", "demo key", "golf@example.net" ] ], 1 ],
Packit d7e8d0
    [ "9E91CBB11E4D4135583EF90513DB965534C6E3F1", "76E26537D622AD0A",
Packit d7e8d0
      [ [ "Hotel Test", "demo key", "hotel@example.net" ] ], 1 ],
Packit d7e8d0
    [ "CD538D6CC9FB3D745ECDA5201FE8FC6F04259677", "C1C8EFDE61F76C73",
Packit d7e8d0
      [ [ "India Test", "demo key", "india@example.net" ] ], 1 ],
Packit d7e8d0
    [ "F8F1EDC73995AB739AD54B380C820C71D2699313", "BD0B108735F8F136",
Packit d7e8d0
      [ [ "Juliet Test", "demo key", "juliet@example.net" ] ], 1 ],
Packit d7e8d0
    [ "3FD11083779196C2ECDD9594AD1B0FAD43C2D0C7", "86CBB34A9AF64D02",
Packit d7e8d0
      [ [ "Kilo Test", "demo key", "kilo@example.net" ] ], 1 ],
Packit d7e8d0
    [ "1DDD28CEF714F5B03B8C246937CAB51FB79103F8", "0363B449FE56350C",
Packit d7e8d0
      [ [ "Lima Test", "demo key", "lima@example.net" ] ], 1 ],
Packit d7e8d0
    [ "2686AA191A278013992C72EBBE794852BE5CF886", "5F600A834F31EAE8",
Packit d7e8d0
      [ [ "Mallory", "demo key", "" ],
Packit d7e8d0
	[ "Mike Test", "demo key", "mike@example.net" ] ], 1 ],
Packit d7e8d0
    [ "5AB9D6D7BAA1C95B3BAA3D9425B00FD430CEC684", "4C1D63308B70E472",
Packit d7e8d0
      [ [ "November Test", "demo key", "november@example.net" ] ], 1 ],
Packit d7e8d0
    [ "43929E89F8F79381678CAE515F6356BA6D9732AC", "FF0785712681619F",
Packit d7e8d0
      [ [ "Oscar Test", "demo key", "oscar@example.net" ] ], 1 ],
Packit d7e8d0
    [ "6FAA9C201E5E26DCBAEC39FD5D15E01D3FF13206", "2764E18263330D9C",
Packit d7e8d0
      [ [ "Papa test", "demo key", "papa@example.net" ] ], 1 ],
Packit d7e8d0
    [ "A7969DA1C3297AA96D49843F1C67EC133C661C84", "6CDCFC44A029ACF4",
Packit d7e8d0
      [ [ "Quebec Test", "demo key", "quebec@example.net" ] ], 1 ],
Packit d7e8d0
    [ "38FBE1E4BF6A5E1242C8F6A13BDBEDB1777FBED3", "9FAB805A11D102EA",
Packit d7e8d0
      [ [ "Romeo Test", "demo key", "romeo@example.net" ] ], 1 ],
Packit d7e8d0
    [ "045B2334ADD69FC221076841A5E67F7FA3AE3EA1", "93B88B0F0F1B50B4",
Packit d7e8d0
      [ [ "Sierra Test", "demo key", "sierra@example.net" ] ], 1 ],
Packit d7e8d0
    [ "ECAC774F4EEEB0620767044A58CB9A4C85A81F38", "97B60E01101C0402",
Packit d7e8d0
      [ [ "Tango Test", "demo key", "tango@example.net" ] ], 1 ],
Packit d7e8d0
    [ "0DBCAD3F08843B9557C6C4D4A94C0F75653244D6", "93079B915522BDB9",
Packit d7e8d0
      [ [ "Uniform Test", "demo key", "uniform@example.net" ] ], 1 ],
Packit d7e8d0
    [ "E8143C489C8D41124DC40D0B47AF4B6961F04784", "04071FB807287134",
Packit d7e8d0
      [ [ "Victor Test", "demo key", "victor@example.org" ] ], 1 ],
Packit d7e8d0
    [ "E8D6C90B683B0982BD557A99DEF0F7B8EC67DBDE", "D7FBB421FD6E27F6",
Packit d7e8d0
      [ [ "Whisky Test", "demo key", "whisky@example.net" ] ], 3,
Packit d7e8d0
      check_whisky ],
Packit d7e8d0
    [ "04C1DF62EFA0EBB00519B06A8979A6C5567FB34A", "5CC6F87F41E408BE",
Packit d7e8d0
      [ [ "XRay Test", "demo key", "xray@example.net" ] ], 1 ],
Packit d7e8d0
    [ "ED9B316F78644A58D042655A9EEF34CD4B11B25F", "5ADFD255F7B080AD",
Packit d7e8d0
      [ [ "Yankee Test", "demo key", "yankee@example.net" ] ], 1 ],
Packit d7e8d0
    [ "23FD347A419429BACCD5E72D6BC4778054ACD246", "EF9DC276A172C881",
Packit d7e8d0
      [ [ "Zulu Test", "demo key", "zulu@example.net" ] ], 1 ],
Packit d7e8d0
]
Packit d7e8d0
Packit d7e8d0
def check_global(key, uids, n_subkeys):
Packit d7e8d0
    assert not key.revoked, "Key unexpectedly revoked"
Packit d7e8d0
    assert not key.expired, "Key unexpectedly expired"
Packit d7e8d0
    assert not key.disabled, "Key unexpectedly disabled"
Packit d7e8d0
    assert not key.invalid, "Key unexpectedly invalid"
Packit d7e8d0
    assert key.can_sign, "Key unexpectedly unusable for signing"
Packit d7e8d0
    assert key.can_certify, "Key unexpectedly unusable for certifications"
Packit d7e8d0
    assert not key.secret, "Key unexpectedly secret"
Packit d7e8d0
    assert not key.protocol != gpg.constants.protocol.OpenPGP, \
Packit d7e8d0
        "Key has unexpected protocol: {}".format(key.protocol)
Packit d7e8d0
    assert not key.issuer_serial, \
Packit d7e8d0
        "Key unexpectedly carries issuer serial: {}".format(key.issuer_serial)
Packit d7e8d0
    assert not key.issuer_name, \
Packit d7e8d0
        "Key unexpectedly carries issuer name: {}".format(key.issuer_name)
Packit d7e8d0
    assert not key.chain_id, \
Packit d7e8d0
        "Key unexpectedly carries chain ID: {}".format(key.chain_id)
Packit d7e8d0
Packit d7e8d0
    # Only key Alfa is trusted
Packit d7e8d0
    assert key.uids[0].name == 'Alfa Test' \
Packit d7e8d0
      or key.owner_trust == gpg.constants.validity.UNKNOWN, \
Packit d7e8d0
        "Key has unexpected owner trust: {}".format(key.owner_trust)
Packit d7e8d0
    assert key.uids[0].name != 'Alfa Test' \
Packit d7e8d0
      or key.owner_trust == gpg.constants.validity.ULTIMATE, \
Packit d7e8d0
        "Key has unexpected owner trust: {}".format(key.owner_trust)
Packit d7e8d0
Packit d7e8d0
    assert len(key.subkeys) - 1 == n_subkeys, \
Packit d7e8d0
        "Key `{}' has unexpected number of subkeys".format(uids[0][0])
Packit d7e8d0
Packit d7e8d0
Packit d7e8d0
def check_subkey(fpr, which, subkey):
Packit d7e8d0
    assert not subkey.revoked, which + " key unexpectedly revoked"
Packit d7e8d0
    assert not subkey.expired, which + " key unexpectedly expired"
Packit d7e8d0
    assert not subkey.disabled, which + " key unexpectedly disabled"
Packit d7e8d0
    assert not subkey.invalid, which + " key unexpectedly invalid"
Packit d7e8d0
Packit d7e8d0
    if which == "Primary":
Packit d7e8d0
        assert not subkey.can_encrypt, \
Packit d7e8d0
            which + " key unexpectedly usable for encryption"
Packit d7e8d0
        assert subkey.can_sign, \
Packit d7e8d0
            which + " key unexpectedly unusable for signing"
Packit d7e8d0
        assert subkey.can_certify, \
Packit d7e8d0
            which + " key unexpectedly unusable for certifications"
Packit d7e8d0
    else:
Packit d7e8d0
        assert subkey.can_encrypt, \
Packit d7e8d0
            which + " key unexpectedly unusable for encryption"
Packit d7e8d0
        assert not subkey.can_sign, \
Packit d7e8d0
            which + " key unexpectedly usable for signing"
Packit d7e8d0
        assert not subkey.can_certify, \
Packit d7e8d0
            which + " key unexpectedly usable for certifications"
Packit d7e8d0
Packit d7e8d0
    assert not subkey.secret, which + " key unexpectedly secret"
Packit d7e8d0
    assert not subkey.is_cardkey, "Public key marked as card key"
Packit d7e8d0
    assert not subkey.card_number, "Public key with card number set"
Packit d7e8d0
    assert not subkey.pubkey_algo != (gpg.constants.pk.DSA if which == "Primary"
Packit d7e8d0
                                      else gpg.constants.pk.ELG_E), \
Packit d7e8d0
        which + " key has unexpected public key algo: {}".\
Packit d7e8d0
            format(subkey.pubkey_algo)
Packit d7e8d0
    assert subkey.length == 1024, \
Packit d7e8d0
        which + " key has unexpected length: {}".format(subkey.length)
Packit d7e8d0
    assert fpr.endswith(subkey.keyid), \
Packit d7e8d0
        which + " key has unexpected key ID: {}".format(subkey.keyid)
Packit d7e8d0
    assert which == "Secondary" or subkey.fpr == fpr, \
Packit d7e8d0
        which + " key has unexpected fingerprint: {}".format(subkey.fpr)
Packit d7e8d0
    assert not subkey.expires, \
Packit d7e8d0
        which + " key unexpectedly expires: {}".format(subkey.expires)
Packit d7e8d0
Packit d7e8d0
def check_uid(which, ref, uid):
Packit d7e8d0
    assert not uid.revoked, which + " user ID unexpectedly revoked"
Packit d7e8d0
    assert not uid.invalid, which + " user ID unexpectedly invalid"
Packit d7e8d0
    assert uid.validity == (gpg.constants.validity.UNKNOWN
Packit d7e8d0
                            if uid.name.split()[0]
Packit d7e8d0
                            not in {'Alfa', 'Alpha', 'Alice'} else
Packit d7e8d0
                            gpg.constants.validity.ULTIMATE), \
Packit d7e8d0
      which + " user ID has unexpectedly validity: {}".format(uid.validity)
Packit d7e8d0
    assert not uid.signatures, which + " user ID unexpectedly signed"
Packit d7e8d0
    assert uid.name == ref[0], \
Packit d7e8d0
      "Unexpected name in {} user ID: {!r}".format(which.lower(), uid.name)
Packit d7e8d0
    assert uid.comment == ref[1], \
Packit d7e8d0
      "Unexpected comment in {} user ID: {!r}".format(which.lower(),
Packit d7e8d0
                                                      uid.comment)
Packit d7e8d0
    assert uid.email == ref[2], \
Packit d7e8d0
      "Unexpected email in {} user ID: {!r}".format(which.lower(), uid.email)
Packit d7e8d0
Packit d7e8d0
i = 0
Packit d7e8d0
c.op_keylist_start(None, False)
Packit d7e8d0
key = c.op_keylist_next ()
Packit d7e8d0
while key:
Packit d7e8d0
    try:
Packit d7e8d0
        if len(keys[i]) == 4:
Packit d7e8d0
            fpr, sec_keyid, uids, n_subkeys = keys[i]
Packit d7e8d0
            misc_check = None
Packit d7e8d0
        else:
Packit d7e8d0
            fpr, sec_keyid, uids, n_subkeys, misc_check = keys[i]
Packit d7e8d0
    except IndexError:
Packit d7e8d0
        # There are more keys.  We don't check for that.
Packit d7e8d0
        break
Packit d7e8d0
Packit d7e8d0
    # Global key flags.
Packit d7e8d0
    check_global(key, uids, n_subkeys)
Packit d7e8d0
    check_subkey(fpr, "Primary", key.subkeys[0])
Packit d7e8d0
    check_subkey(sec_keyid, "Secondary", key.subkeys[1])
Packit d7e8d0
Packit d7e8d0
    assert len(key.uids) == len(uids)
Packit d7e8d0
    check_uid("First", uids[0], key.uids[0])
Packit d7e8d0
    if len(key.uids) > 1:
Packit d7e8d0
      check_uid("Second", uids[1], key.uids[1])
Packit d7e8d0
    if len(key.uids) > 2:
Packit d7e8d0
      check_uid("Third", uids[2], key.uids[2])
Packit d7e8d0
Packit d7e8d0
    if misc_check:
Packit d7e8d0
        misc_check (uids[0][0], key)
Packit d7e8d0
    key = c.op_keylist_next ()
Packit d7e8d0
    i += 1
Packit d7e8d0
Packit d7e8d0
c.op_keylist_end()
Packit d7e8d0
result = c.op_keylist_result()
Packit d7e8d0
assert not result.truncated, "Key listing unexpectedly truncated"
Packit d7e8d0
Packit d7e8d0
Packit d7e8d0
# We test for a parameter-less keylist
Packit d7e8d0
keyring_length = len(list(c.op_keylist_all()))
Packit d7e8d0
assert keyring_length > 1,\
Packit d7e8d0
                "Expected to find some keys, but got %r" % keyring_length
Packit d7e8d0
Packit d7e8d0
# Then we do want to call with a pattern, only
Packit d7e8d0
# i.e. without giving secret=0
Packit d7e8d0
alpha_keys = list(c.op_keylist_all(b"Alpha"))
Packit d7e8d0
assert len(alpha_keys) == 1, "Expected only one key for 'Alpha', got %r" % len(alpha_keys)
Packit d7e8d0
Packit d7e8d0
Packit d7e8d0
# Check negative result.
Packit d7e8d0
assert len(list(c.keylist("no such key in sight"))) == 0
Packit d7e8d0
Packit d7e8d0
Packit d7e8d0
for i, key in enumerate(c.keylist()):
Packit d7e8d0
    try:
Packit d7e8d0
        if len(keys[i]) == 4:
Packit d7e8d0
            fpr, sec_keyid, uids, n_subkeys = keys[i]
Packit d7e8d0
            misc_check = None
Packit d7e8d0
        else:
Packit d7e8d0
            fpr, sec_keyid, uids, n_subkeys, misc_check = keys[i]
Packit d7e8d0
    except IndexError:
Packit d7e8d0
        # There are more keys.  We don't check for that.
Packit d7e8d0
        break
Packit d7e8d0
Packit d7e8d0
    # Global key flags.
Packit d7e8d0
    check_global(key, uids, n_subkeys)
Packit d7e8d0
    check_subkey(fpr, "Primary", key.subkeys[0])
Packit d7e8d0
    check_subkey(sec_keyid, "Secondary", key.subkeys[1])
Packit d7e8d0
Packit d7e8d0
    assert len(key.uids) == len(uids)
Packit d7e8d0
    check_uid("First", uids[0], key.uids[0])
Packit d7e8d0
    if len(key.uids) > 1:
Packit d7e8d0
      check_uid("Second", uids[1], key.uids[1])
Packit d7e8d0
    if len(key.uids) > 2:
Packit d7e8d0
      check_uid("Third", uids[2], key.uids[2])
Packit d7e8d0
Packit d7e8d0
    if misc_check:
Packit d7e8d0
        misc_check (uids[0][0], key)
Packit d7e8d0
Packit d7e8d0
Packit d7e8d0
# check get_key()
Packit d7e8d0
with gpg.Context() as c:
Packit d7e8d0
  c.get_key(support.alpha)
Packit d7e8d0
  c.get_key(support.alpha, secret=True)
Packit d7e8d0
Packit d7e8d0
  c.get_key(support.bob)
Packit d7e8d0
  try:
Packit d7e8d0
    c.get_key(support.bob, secret=True)
Packit d7e8d0
  except KeyError:
Packit d7e8d0
    pass
Packit d7e8d0
  else:
Packit d7e8d0
    assert False, "Expected KeyError"
Packit d7e8d0
Packit d7e8d0
  # Legacy error
Packit d7e8d0
  try:
Packit d7e8d0
    c.get_key(support.no_such_key)
Packit d7e8d0
  except gpg.errors.GPGMEError:
Packit d7e8d0
    pass
Packit d7e8d0
  else:
Packit d7e8d0
    assert False, "Expected GPGMEError"