Blame lang/python/tests/t-keylist-from-data.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 Service 30b792
# License along with this program; if not, see <https://www.gnu.org/licenses/>.
Packit d7e8d0
Packit d7e8d0
from __future__ import absolute_import, print_function, unicode_literals
Packit d7e8d0
Packit d7e8d0
import gpg
Packit d7e8d0
import support
Packit d7e8d0
Packit Service 30b792
del absolute_import, print_function, unicode_literals
Packit Service 30b792
Packit d7e8d0
support.assert_gpg_version((2, 1, 14))
Packit d7e8d0
Packit Service 30b792
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 Service 30b792
    sub1 = key.subkeys[2]
Packit Service 30b792
    sub2 = key.subkeys[3]
Packit Service 30b792
Packit Service 30b792
    assert sub1.expired and sub2.expired, \
Packit Service 30b792
        "Subkey of `{}' not flagged as expired".format(name)
Packit Service 30b792
    assert sub1.expires == 1129636886 and sub2.expires == 1129636939, \
Packit Service 30b792
        "Subkey of `{}' has wrong expiration date".format(name)
Packit d7e8d0
Packit d7e8d0
Packit d7e8d0
keys = [
Packit Service 30b792
    [
Packit Service 30b792
        "A0FF4590BB6122EDEF6E3C542D727CC768697734", "6AE6D7EE46A871F8",
Packit Service 30b792
        [["Alfa Test", "demo key", "alfa@example.net"],
Packit Service 30b792
         ["Alpha Test", "demo key", "alpha@example.net"],
Packit Service 30b792
         ["Alice", "demo key", ""]], 1
Packit Service 30b792
    ],
Packit Service 30b792
    [
Packit Service 30b792
        "D695676BDCEDCC2CDD6152BCFE180B1DA9E3B0B2", "5381EA4EE29BA37F",
Packit Service 30b792
        [["Bob", "demo key", ""],
Packit Service 30b792
         ["Bravo Test", "demo key", "bravo@example.net"]], 1
Packit Service 30b792
    ],
Packit Service 30b792
    [
Packit Service 30b792
        "61EE841A2A27EB983B3B3C26413F4AF31AFDAB6C", "E71E72ACBC43DA60",
Packit Service 30b792
        [["Charlie Test", "demo key", "charlie@example.net"]], 1
Packit Service 30b792
    ],
Packit Service 30b792
    [
Packit Service 30b792
        "6560C59C43D031C54D7C588EEBA9F240EB9DC9E6", "06F22880B0C45424",
Packit Service 30b792
        [["Delta Test", "demo key", "delta@example.net"]], 1
Packit Service 30b792
    ],
Packit Service 30b792
    [
Packit Service 30b792
        "3531152DE293E26A07F504BC318C1FAEFAEF6D1B", "B5C79E1A7272144D",
Packit Service 30b792
        [["Echelon", "demo key",
Packit Service 30b792
          ""], ["Echo Test", "demo key", "echo@example.net"],
Packit Service 30b792
         ["Eve", "demo key", ""]], 1
Packit Service 30b792
    ],
Packit Service 30b792
    [
Packit Service 30b792
        "56D33268F7FE693FBB594762D4BF57F37372E243", "0A32EE79EE45198E",
Packit Service 30b792
        [["Foxtrot Test", "demo key", "foxtrot@example.net"]], 1
Packit Service 30b792
    ],
Packit Service 30b792
    [
Packit Service 30b792
        "C9C07DCC6621B9FB8D071B1D168410A48FC282E6", "247491CC9DCAD354",
Packit Service 30b792
        [["Golf Test", "demo key", "golf@example.net"]], 1
Packit Service 30b792
    ],
Packit Service 30b792
    [
Packit Service 30b792
        "9E91CBB11E4D4135583EF90513DB965534C6E3F1", "76E26537D622AD0A",
Packit Service 30b792
        [["Hotel Test", "demo key", "hotel@example.net"]], 1
Packit Service 30b792
    ],
Packit Service 30b792
    [
Packit Service 30b792
        "CD538D6CC9FB3D745ECDA5201FE8FC6F04259677", "C1C8EFDE61F76C73",
Packit Service 30b792
        [["India Test", "demo key", "india@example.net"]], 1
Packit Service 30b792
    ],
Packit Service 30b792
    [
Packit Service 30b792
        "F8F1EDC73995AB739AD54B380C820C71D2699313", "BD0B108735F8F136",
Packit Service 30b792
        [["Juliet Test", "demo key", "juliet@example.net"]], 1
Packit Service 30b792
    ],
Packit Service 30b792
    [
Packit Service 30b792
        "3FD11083779196C2ECDD9594AD1B0FAD43C2D0C7", "86CBB34A9AF64D02",
Packit Service 30b792
        [["Kilo Test", "demo key", "kilo@example.net"]], 1
Packit Service 30b792
    ],
Packit Service 30b792
    [
Packit Service 30b792
        "1DDD28CEF714F5B03B8C246937CAB51FB79103F8", "0363B449FE56350C",
Packit Service 30b792
        [["Lima Test", "demo key", "lima@example.net"]], 1
Packit Service 30b792
    ],
Packit Service 30b792
    [
Packit Service 30b792
        "2686AA191A278013992C72EBBE794852BE5CF886", "5F600A834F31EAE8",
Packit Service 30b792
        [["Mallory", "demo key", ""],
Packit Service 30b792
         ["Mike Test", "demo key", "mike@example.net"]], 1
Packit Service 30b792
    ],
Packit Service 30b792
    [
Packit Service 30b792
        "5AB9D6D7BAA1C95B3BAA3D9425B00FD430CEC684", "4C1D63308B70E472",
Packit Service 30b792
        [["November Test", "demo key", "november@example.net"]], 1
Packit Service 30b792
    ],
Packit Service 30b792
    [
Packit Service 30b792
        "43929E89F8F79381678CAE515F6356BA6D9732AC", "FF0785712681619F",
Packit Service 30b792
        [["Oscar Test", "demo key", "oscar@example.net"]], 1
Packit Service 30b792
    ],
Packit Service 30b792
    [
Packit Service 30b792
        "6FAA9C201E5E26DCBAEC39FD5D15E01D3FF13206", "2764E18263330D9C",
Packit Service 30b792
        [["Papa test", "demo key", "papa@example.net"]], 1
Packit Service 30b792
    ],
Packit Service 30b792
    [
Packit Service 30b792
        "A7969DA1C3297AA96D49843F1C67EC133C661C84", "6CDCFC44A029ACF4",
Packit Service 30b792
        [["Quebec Test", "demo key", "quebec@example.net"]], 1
Packit Service 30b792
    ],
Packit Service 30b792
    [
Packit Service 30b792
        "38FBE1E4BF6A5E1242C8F6A13BDBEDB1777FBED3", "9FAB805A11D102EA",
Packit Service 30b792
        [["Romeo Test", "demo key", "romeo@example.net"]], 1
Packit Service 30b792
    ],
Packit Service 30b792
    [
Packit Service 30b792
        "045B2334ADD69FC221076841A5E67F7FA3AE3EA1", "93B88B0F0F1B50B4",
Packit Service 30b792
        [["Sierra Test", "demo key", "sierra@example.net"]], 1
Packit Service 30b792
    ],
Packit Service 30b792
    [
Packit Service 30b792
        "ECAC774F4EEEB0620767044A58CB9A4C85A81F38", "97B60E01101C0402",
Packit Service 30b792
        [["Tango Test", "demo key", "tango@example.net"]], 1
Packit Service 30b792
    ],
Packit Service 30b792
    [
Packit Service 30b792
        "0DBCAD3F08843B9557C6C4D4A94C0F75653244D6", "93079B915522BDB9",
Packit Service 30b792
        [["Uniform Test", "demo key", "uniform@example.net"]], 1
Packit Service 30b792
    ],
Packit Service 30b792
    [
Packit Service 30b792
        "E8143C489C8D41124DC40D0B47AF4B6961F04784", "04071FB807287134",
Packit Service 30b792
        [["Victor Test", "demo key", "victor@example.org"]], 1
Packit Service 30b792
    ],
Packit Service 30b792
    [
Packit Service 30b792
        "E8D6C90B683B0982BD557A99DEF0F7B8EC67DBDE", "D7FBB421FD6E27F6",
Packit Service 30b792
        [["Whisky Test", "demo key", "whisky@example.net"]], 3, check_whisky
Packit Service 30b792
    ],
Packit Service 30b792
    [
Packit Service 30b792
        "04C1DF62EFA0EBB00519B06A8979A6C5567FB34A", "5CC6F87F41E408BE",
Packit Service 30b792
        [["XRay Test", "demo key", "xray@example.net"]], 1
Packit Service 30b792
    ],
Packit Service 30b792
    [
Packit Service 30b792
        "ED9B316F78644A58D042655A9EEF34CD4B11B25F", "5ADFD255F7B080AD",
Packit Service 30b792
        [["Yankee Test", "demo key", "yankee@example.net"]], 1
Packit Service 30b792
    ],
Packit Service 30b792
    [
Packit Service 30b792
        "23FD347A419429BACCD5E72D6BC4778054ACD246", "EF9DC276A172C881",
Packit Service 30b792
        [["Zulu Test", "demo key", "zulu@example.net"]], 1
Packit Service 30b792
    ],
Packit d7e8d0
]
Packit d7e8d0
Packit Service 30b792
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
    assert key.owner_trust == gpg.constants.validity.UNKNOWN, \
Packit d7e8d0
        "Key has unexpected owner trust: {}".format(key.owner_trust)
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 Service 30b792
    assert not subkey.pubkey_algo != \
Packit Service 30b792
        (gpg.constants.pk.DSA if which == "Primary"
Packit Service 30b792
         else gpg.constants.pk.ELG_E), \
Packit Service 30b792
         which + " key has unexpected public key algo: {}".format(subkey.
Packit Service 30b792
                                                                  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 Service 30b792
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 Service 30b792
        which + " user ID has unexpected validity: {}".format(uid.validity)
Packit d7e8d0
    assert not uid.signatures, which + " user ID unexpectedly signed"
Packit d7e8d0
    assert uid.name == ref[0], \
Packit Service 30b792
        "Unexpected name in {} user ID: {!r}".format(which.lower(), uid.name)
Packit d7e8d0
    assert uid.comment == ref[1], \
Packit Service 30b792
        "Unexpected comment in {} user ID: {!r}".format(which.lower(),
Packit Service 30b792
                                                        uid.comment)
Packit d7e8d0
    assert uid.email == ref[2], \
Packit Service 30b792
        "Unexpected email in {} user ID: {!r}".format(which.lower(), uid.email)
Packit Service 30b792
Packit d7e8d0
Packit d7e8d0
# Export all the data from our keyring...
Packit d7e8d0
key_data = gpg.Data()
Packit d7e8d0
with gpg.Context() as c:
Packit Service 30b792
    c.op_export_keys([c.get_key(k[0]) for k in keys], 0, key_data)
Packit d7e8d0
Packit d7e8d0
# ... rewind the tape...
Packit d7e8d0
key_data.rewind()
Packit d7e8d0
Packit d7e8d0
# ... and feed it into a keylist in an empty context.
Packit d7e8d0
with support.EphemeralContext() as c:
Packit d7e8d0
    for i, key in enumerate(c.keylist(source=key_data)):
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 Service 30b792
            check_uid("Second", uids[1], key.uids[1])
Packit d7e8d0
        if len(key.uids) > 2:
Packit Service 30b792
            check_uid("Third", uids[2], key.uids[2])
Packit d7e8d0
Packit d7e8d0
        if misc_check:
Packit Service 30b792
            misc_check(uids[0][0], key)
Packit d7e8d0
Packit d7e8d0
    assert len(list(c.keylist())) == 0, "Keys were imported"