Path: blob/main/crypto/krb5/src/tests/gssapi/t_negoex.py
34889 views
from k5test import *12# The next arc after 2.25 is supposed to be a single-integer UUID, but3# since our gss_str_to_oid() can't handle arc values that don't fit in4# an unsigned long, we use random unsigned 32-bit integers instead.5# The final octet if the OID encoding will be used to identify the6# mechanism when changing the behavior of just one mech.7nxtest_oid1 = '2.25.1414534758' # final octet is 102 (0x66)8nxtest_oid2 = '2.25.1175737388' # final octet is 44 (0x2C)9nxtest_path = os.path.join(buildtop, 'plugins', 'gssapi', 'negoextest',10'gss_negoextest.so')1112# Test gss_add_cred().13realm = K5Realm(create_kdb=False)14with open(realm.gss_mech_config, 'w') as f:15f.write('negoextest %s %s\n' % (nxtest_oid1, nxtest_path))16f.write('negoextest %s %s\n' % (nxtest_oid2, nxtest_path))1718def test(envvars, **kw):19# Python 3.5: e = {**realm.env, **vars}20e = realm.env.copy()21e.update(envvars)22realm.run(['./t_context', 'h:host'], env=e, **kw)2324# Test varying numbers of hops, and spot-check that messages are sent25# in the appropriate sequence.2627mark('One hop')28msgs = ('sending [0]INITIATOR_NEGO: c0a28569-66ac-0000-0000-000000000000 '29'd1b08469-2ca8-0000-0000-000000000000',30'sending [1]INITIATOR_META_DATA: c0a28569-66ac',31'sending [2]INITIATOR_META_DATA: d1b08469-2ca8',32'sending [3]AP_REQUEST: c0a28569-66ac',33'sending [4]VERIFY: c0a28569-66ac',34'received [0]INITIATOR_NEGO: c0a28569-66ac-0000-0000-000000000000 '35'd1b08469-2ca8-0000-0000-000000000000',36'received [1]INITIATOR_META_DATA: c0a28569-66ac',37'received [2]INITIATOR_META_DATA: d1b08469-2ca8',38'received [3]AP_REQUEST: c0a28569-66ac',39'received [4]VERIFY: c0a28569-66ac',40'sending [5]ACCEPTOR_NEGO: c0a28569-66ac-0000-0000-000000000000 '41'd1b08469-2ca8-0000-0000-000000000000',42'sending [6]ACCEPTOR_META_DATA: c0a28569-66ac',43'sending [7]ACCEPTOR_META_DATA: d1b08469-2ca8',44'sending [8]VERIFY: c0a28569-66ac',45'received [5]ACCEPTOR_NEGO: c0a28569-66ac-0000-0000-000000000000 '46'd1b08469-2ca8-0000-0000-000000000000',47'received [6]ACCEPTOR_META_DATA: c0a28569-66ac',48'received [7]ACCEPTOR_META_DATA: d1b08469-2ca8',49'received [8]VERIFY: c0a28569-66ac')50test({'HOPS': '1'}, expected_trace=msgs)5152mark('Two hops')53msgs = ('sending [7]CHALLENGE', 'sending [8]VERIFY', 'received [8]VERIFY',54'sending [9]VERIFY')55test({'HOPS': '2'}, expected_trace=msgs)5657mark('Three hops')58msgs = ('sending [8]AP_REQUEST', 'sending [9]VERIFY', 'received [8]AP_REQUEST',59'sending [10]VERIFY')60test({'HOPS': '3'}, expected_trace=msgs)6162mark('Four hops')63msgs = ('sending [9]CHALLENGE', 'sending [10]VERIFY', 'received [9]CHALLENGE',64'sending [11]VERIFY')65test({'HOPS': '4'}, expected_trace=msgs)6667mark('Early keys, three hops')68msgs = ('sending [4]VERIFY', 'sending [9]VERIFY', 'sending [10]AP_REQUEST')69test({'HOPS': '3', 'KEY': 'always'}, expected_trace=msgs)7071mark('Early keys, four hops')72msgs = ('sending [4]VERIFY', 'sending [9]VERIFY', 'sending [10]AP_REQUEST',73'sending [11]CHALLENGE')74test({'HOPS': '4', 'KEY': 'always'}, expected_trace=msgs)7576mark('No keys')77test({'KEY': 'never'}, expected_code=1, expected_msg='No NegoEx verify key')7879mark('No optimistic token')80msgs = ('sending [3]ACCEPTOR_NEGO', 'sending [6]AP_REQUEST',81'sending [7]VERIFY', 'sending [8]VERIFY')82test({'NEGOEX_NO_OPTIMISTIC_TOKEN': ''}, expected_trace=msgs)8384mark('First mech initiator query fail')85msgs = ('sending [0]INITIATOR_NEGO: d1b08469-2ca8-0000-0000-000000000000',86'sending [2]AP_REQUEST', 'sending [3]VERIFY',87'sending [4]ACCEPTOR_NEGO: d1b08469-2ca8-0000-0000-000000000000',88'sending [6]VERIFY')89test({'INIT_QUERY_FAIL': '102'}, expected_trace=msgs)9091mark('First mech acceptor query fail')92msgs = ('sending [0]INITIATOR_NEGO: c0a28569-66ac-0000-0000-000000000000 '93'd1b08469-2ca8-0000-0000-000000000000',94'sending [3]AP_REQUEST: c0a28569-66ac',95'sending [4]VERIFY: c0a28569-66ac',96'sending [5]ACCEPTOR_NEGO: d1b08469-2ca8-0000-0000-000000000000',97'sending [7]AP_REQUEST: d1b08469-2ca8',98'sending [8]VERIFY: d1b08469-2ca8',99'sending [9]VERIFY: d1b08469-2ca8')100test({'ACCEPT_QUERY_FAIL': '102'}, expected_trace=msgs)101102# Same messages as previous test.103mark('First mech acceptor exchange fail')104test({'ACCEPT_EXCHANGE_FAIL': '102'}, expected_trace=msgs)105106# Fail the optimistic mech's gss_exchange_meta_data() in the107# initiator. Since the acceptor has effectively selected the108# optimistic mech, this causes the authentication to fail.109mark('First mech initiator exchange fail, one hop')110test({'HOPS': '1', 'INIT_EXCHANGE_FAIL': '102'}, expected_code=1,111expected_msg='No mutually supported NegoEx authentication schemes')112mark('First mech initiator exchange fail, two hops, early keys')113test({'HOPS': '2', 'INIT_EXCHANGE_FAIL': '102', 'KEY': 'always'},114expected_code=1,115expected_msg='No mutually supported NegoEx authentication schemes')116mark('First mech initiator exchange fail, two hops')117test({'HOPS': '2', 'INIT_EXCHANGE_FAIL': '102'}, expected_code=1,118expected_msg='No mutually supported NegoEx authentication schemes')119120mark('First mech init_sec_context fail')121msgs = ('sending [0]INITIATOR_NEGO: d1b08469-2ca8-0000-0000-000000000000',122'sending [2]AP_REQUEST', 'sending [3]VERIFY', 'sending [6]VERIFY')123test({'INIT_FAIL': '102'}, expected_trace=msgs)124125mark('First mech accept_sec_context fail')126test({'HOPS': '2', 'ACCEPT_FAIL': '102'}, expected_code=1,127expected_msg='failure from acceptor')128129mark('ALERT from acceptor to initiator')130msgs = ('sending [3]AP_REQUEST', 'sending [4]VERIFY', 'sending [8]CHALLENGE',131'sending [9]ALERT', 'received [9]ALERT', 'sending [10]AP_REQUEST',132'sending [11]VERIFY', 'sending [12]VERIFY')133test({'HOPS': '3', 'KEY': 'init-always'}, expected_trace=msgs)134135mark('ALERT from initiator to acceptor')136msgs = ('sending [3]AP_REQUEST', 'sending [7]CHALLENGE', 'sending [8]VERIFY',137'sending [9]AP_REQUEST', 'sending [10]ALERT', 'received [10]ALERT',138'sending [11]CHALLENGE', 'sending [12]VERIFY', 'sending [13]VERIFY')139test({'HOPS': '4', 'KEY': 'accept-always'}, expected_trace=())140141mark('channel bindings')142e = realm.env.copy()143e.update({'HOPS': '1', 'GSS_INIT_BINDING': 'a', 'GSS_ACCEPT_BINDING': 'b'})144# The test mech will verify that the bindings are communicated to the145# mech, but does not set the channel-bound flag.146realm.run(['./t_bindings', '-s', 'h:host', 'a', 'b'], env=e, expected_msg='no')147148success('NegoEx tests')149150151