async def setnym(ini_path: str) -> int: """ Set configuration. Open pool, trustee anchor, and wallet of anchor whose nym to send. Register exit hooks to close pool and trustee anchor. Engage trustee anchor to send nym for VON anchor, if it differs on the ledger from configuration. :param ini_path: path to configuration file :return: 0 for OK, 1 for failure """ config = inis2dict(ini_path) if config['Trustee Anchor']['name'] == config['VON Anchor']['name']: raise ExtantWallet( 'Wallet names must differ between VON Anchor and Trustee Anchor') cfg_van_role = config['VON Anchor'].get( 'role', None) or None # nudge empty value from '' to None if not ok_role(cfg_van_role): raise BadRole('Configured role {} is not valid'.format(cfg_van_role)) pool_data = NodePoolData( config['Node Pool']['name'], config['Node Pool'].get('genesis.txn.path', None) or None) an_data = { 'tan': AnchorData( Role.TRUSTEE, config['Trustee Anchor']['name'], config['Trustee Anchor'].get('seed', None) or None, config['Trustee Anchor'].get('did', None) or None, config['Trustee Anchor'].get('wallet.create', '0').lower() in ['1', 'true', 'yes'], config['Trustee Anchor'].get('wallet.type', None) or None, config['Trustee Anchor'].get('wallet.access', None) or None), 'van': AnchorData( Role.get(cfg_van_role), config['VON Anchor']['name'], config['VON Anchor'].get('seed', None) or None, config['VON Anchor'].get('did', None) or None, config['VON Anchor'].get('wallet.create', '0').lower() in ['1', 'true', 'yes'], config['VON Anchor'].get('wallet.type', None) or None, config['VON Anchor'].get('wallet.access', None) or None) } an_wallet = await _set_wallets(an_data) p_mgr = NodePoolManager() if pool_data.name not in await p_mgr.list(): if pool_data.genesis_txn_path: await p_mgr.add_config(pool_data.name, pool_data.genesis_txn_path) else: raise AbsentPool( 'Node pool {} has no ledger configuration, but {} specifies no genesis txn path' .format(pool_data.name, ini_path)) async with an_wallet['tan'] as w_tan, (an_wallet['van']) as w_van, ( p_mgr.get(pool_data.name)) as pool, (TrusteeAnchor( w_tan, pool)) as tan, (NominalAnchor(w_van, pool)) as van: send_verkey = van.verkey try: nym_role = await tan.get_nym_role(van.did) if an_data['van'].role == nym_role: return 0 # ledger is as per configuration send_verkey = None # only owner can touch verkey if nym_role != Role.USER: # only remove role when it is not already None on the ledger await tan.send_nym(van.did, send_verkey, van.wallet.name, Role.ROLE_REMOVE) except AbsentNym: pass # cryptonym not there yet, fall through await tan.send_nym(van.did, send_verkey, van.wallet.name, an_data['van'].role) return 0
async def setnym(ini_path: str) -> int: """ Set configuration. Open pool, trustee anchor, and wallet of anchor whose nym to send. Register exit hooks to close pool and trustee anchor. Engage trustee anchor to send nym for VON anchor, if it differs on the ledger from configuration. :param ini_path: path to configuration file :return: 0 for OK, 1 for failure """ config = inis2dict(ini_path) cfg_van_role = config['VON Anchor'].get( 'role', None) or None # nudge empty value from '' to None if not ok_role(cfg_van_role): raise BadRole('Configured role {} is not valid'.format(cfg_van_role)) if config['Trustee Anchor']['wallet.name'] == config['VON Anchor'][ 'wallet.name']: raise ExtantWallet( 'Wallet names must differ between VON Anchor and Trustee Anchor') pool_data = NodePoolData( config['Node Pool']['name'], config['Node Pool'].get('genesis.txn.path', None) or None) an_data = { 'tan': AnchorData(Role.TRUSTEE, config['Trustee Anchor'].get('seed', None) or None, config['Trustee Anchor']['wallet.name'], config['Trustee Anchor'].get('wallet.type', None) or None, config['Trustee Anchor'].get('wallet.key', None) or None), 'van': AnchorData(Role.get(cfg_van_role), config['VON Anchor'].get('seed', None) or None, config['VON Anchor']['wallet.name'], config['VON Anchor'].get('wallet.type', None) or None, config['VON Anchor'].get('wallet.key', None) or None) } an_wallet = { an: Wallet(an_data[an].wallet_name, an_data[an].wallet_type, None, {'key': an_data[an].wallet_key} if an_data[an].wallet_key else None) for an in an_data } for anchor in an_data: # create wallet if seed configured, silently continue if extant if an_data[anchor].seed: try: await an_wallet[anchor].create(an_data[anchor].seed) except ExtantWallet: pass manager = NodePoolManager() if pool_data.name not in await manager.list(): if pool_data.genesis_txn_path: await manager.add_config(pool_data.name, pool_data.genesis_txn_path) else: raise AbsentPool( 'Node pool {} has no ledger configuration, but {} specifies no genesis txn path' .format(pool_data.name, ini_path)) async with an_wallet['tan'] as w_tan, (an_wallet['van']) as w_van, ( manager.get(pool_data.name)) as pool, (TrusteeAnchor( w_tan, pool)) as tan, (NominalAnchor(w_van, pool)) as van: send_verkey = van.verkey try: nym_role = await tan.get_nym_role(van.did) if an_data['van'].role == nym_role: return 0 # ledger is as per configuration send_verkey = None # only owner can touch verkey await tan.send_nym(van.did, send_verkey, van.wallet.name, Role.ROLE_REMOVE) except AbsentNym: pass # cryptonym not there yet, fall through await tan.send_nym(van.did, send_verkey, van.wallet.name, an_data['van'].role) return 0
async def test_box_ids(): print(Ink.YELLOW('\n\n== Testing Identifier Checks ==')) assert ok_wallet_reft('49ad0727-8663-45ae-a115-12b09860f9c6') assert not ok_wallet_reft('Q4zqM7aXqm7gDQkUVLng9I') assert not ok_wallet_reft('49ad0727-45ae-a115-12b09860f9c6') assert ok_did( 'Q4zqM7aXqm7gDQkUVLng9h') # quibble: not technically a box id assert not ok_did('Q4zqM7aXqm7gDQkUVLng9I') assert not ok_did('Q4zqM7aXqm7gDQkUVLng') for value in (None, 'TRUSTEE', 'STEWARD', 'TRUST_ANCHOR', ''): assert ok_role(value) for value in (123, 'TRUSTY', 'STEW', 'ANCHOR', ' '): assert not ok_role(value) assert Tails.ok_hash('Q4zqM7aXqm7gDQkUVLng9hQ4zqM7aXqm7gDQkUVLng9h') assert Tails.ok_hash('Q4zqM7aXqm7gDQkUVLng9hQ4zqM7aXqm7gDQkUVLng') assert not Tails.ok_hash('Q4zqM7aXqm7gDQkUVLng9h') assert not Tails.ok_hash('Q4zqM7aXqm7gDQkUVLng9hQ4zqM7aXqm7gDQkUVLng9hx') assert not Tails.ok_hash('Q4zqM7aXqm7gDQkUVLng9hQ4zqM7aXqm7gDQkUVLng90') assert ok_schema_id('Q4zqM7aXqm7gDQkUVLng9h:2:bc-reg:1.0') assert not ok_schema_id('Q4zqM7aXqm7gDQkUVLng9h:3:bc-reg:1.0') assert not ok_schema_id('Q4zqM7aXqm7gDQkUVLng9h::bc-reg:1.0') assert not ok_schema_id('Q4zqM7aXqm7gDQkUVLng9h:bc-reg:1.0') assert not ok_schema_id('Q4zqM7aXqm7gDQkUVLng9h:2:1.0') assert not ok_schema_id('Q4zqM7aXqm7gDQkUVLng9h:2::1.0') assert not ok_schema_id('Q4zqM7aXqm7gDQkUVLng9h:2:bc-reg:') assert not ok_schema_id('Q4zqM7aXqm7gDQkUVLng9h:2:bc-reg:1.0a') assert not ok_schema_id( 'Q4zqM7aXqm7gDQkUVLng9I:2:bc-reg:1.0') # I is not in base58 assert ok_cred_def_id( 'Q4zqM7aXqm7gDQkUVLng9h:3:CL:18:tag') # protocol >= 1.4 assert ok_cred_def_id('Q4zqM7aXqm7gDQkUVLng9h:3:CL:18:tag', 'Q4zqM7aXqm7gDQkUVLng9h') assert not ok_cred_def_id('Q4zqM7aXqm7gDQkUVLng9h:3:CL:18:tag', 'Xxxxxxxxxxxxxxxxxxxxxx') assert not ok_cred_def_id('Q4zqM7aXqm7gDQkUVLng9h:4:CL:18:0') assert not ok_cred_def_id('Q4zqM7aXqm7gDQkUVLng9h::CL:18:0') assert not ok_cred_def_id('Q4zqM7aXqm7gDQkUVLng9I:3:CL:18:tag') assert not ok_cred_def_id('Q4zqM7aXqm7gDQkUVLng9h:3::18:tag') assert not ok_cred_def_id('Q4zqM7aXqm7gDQkUVLng9h:3:18:tag') assert not ok_cred_def_id('Q4zqM7aXqm7gDQkUVLng9h:3:CL:18z:tag') assert ok_cred_def_id('Q4zqM7aXqm7gDQkUVLng9h:3:CL:18') # protocol == 1.3 assert ok_cred_def_id('Q4zqM7aXqm7gDQkUVLng9h:3:CL:18', 'Q4zqM7aXqm7gDQkUVLng9h') assert not ok_cred_def_id('Q4zqM7aXqm7gDQkUVLng9h:3:CL:18', 'Xxxxxxxxxxxxxxxxxxxxxx') assert ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:3:CL:20:tag:CL_ACCUM:1' ) # protocol >= 1.4 assert ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:3:CL:20:tag:CL_ACCUM:1', 'LjgpST2rjsoxYegQDRm7EL') assert not ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:3:CL:20:tag:CL_ACCUM:1', 'Xxxxxxxxxxxxxxxxxxxxxx') assert not ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:5:LjgpST2rjsoxYegQDRm7EL:3:CL:20:tag:CL_ACCUM:1' ) assert not ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:4:CL:20:0:CL_ACCUM:1') assert not ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL::CL:20:0:CL_ACCUM:1') assert not ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:3:NOT_CL:20:tag:CL_ACCUM:1' ) assert not ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:3:CL:20z:tag:CL_ACCUM:1' ) assert not ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:3:CL:20::CL_ACCUM:1') assert not ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:3:CL:20:tag::1') assert not ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:3:CL:20:tag:1') assert not ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:3:CL:20:tag:CL_ACCUM:' ) assert not ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:3:CL:20:tag:CL_ACCUM') assert ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:3:CL:20:CL_ACCUM:1' ) # protocol == 1.3 assert ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:3:CL:20:CL_ACCUM:1', 'LjgpST2rjsoxYegQDRm7EL') assert not ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:3:CL:20:CL_ACCUM:1', 'Xxxxxxxxxxxxxxxxxxxxxx') assert ok_endpoint('10.0.0.2:9702') assert ok_endpoint('0.0.0.0:0') assert not ok_endpoint('canada.gc.ca:8088') assert not ok_endpoint(':37') assert not ok_endpoint('http://url-wrong') assert not ok_endpoint('2.3.4.5') assert not ok_endpoint('2.3.4:8080') assert not ok_endpoint('1.2.3.4:abc') assert not ok_endpoint('1.2.3.4:1234.56')
async def test_ids(): print(Ink.YELLOW('\n\n== Testing Identifier Checks ==')) assert ok_wallet_reft('49ad0727-8663-45ae-a115-12b09860f9c6') assert not ok_wallet_reft('Q4zqM7aXqm7gDQkUVLng9I') assert not ok_wallet_reft('49ad0727-45ae-a115-12b09860f9c6') print('\n\n== 1 == Wallet referent identifier checks pass OK') assert ok_did('Q4zqM7aXqm7gDQkUVLng9h') assert not ok_did('Q4zqM7aXqm7gDQkUVLng9I') # 'I' not a base58 char assert not ok_did('Q4zqM7aXqm7gDQkUVLng') # too short print('\n\n== 2 == Distributed identifier checks pass OK') for value in (None, 'TRUSTEE', 'STEWARD', 'TRUST_ANCHOR', ''): assert ok_role(value) for value in (123, 'TRUSTY', 'STEW', 'ANCHOR', ' '): assert not ok_role(value) print('\n\n== 3 == Role identifier checks pass OK') assert Tails.ok_hash('Q4zqM7aXqm7gDQkUVLng9hQ4zqM7aXqm7gDQkUVLng9h') assert Tails.ok_hash('Q4zqM7aXqm7gDQkUVLng9hQ4zqM7aXqm7gDQkUVLng') assert not Tails.ok_hash('Q4zqM7aXqm7gDQkUVLng9h') assert not Tails.ok_hash('Q4zqM7aXqm7gDQkUVLng9hQ4zqM7aXqm7gDQkUVLng9hx') assert not Tails.ok_hash('Q4zqM7aXqm7gDQkUVLng9hQ4zqM7aXqm7gDQkUVLng90') print('\n\n== 4 == Tails hash identifier checks pass OK') assert ok_schema_id('Q4zqM7aXqm7gDQkUVLng9h:2:bc-reg:1.0') assert not ok_schema_id('Q4zqM7aXqm7gDQkUVLng9h:3:bc-reg:1.0') assert not ok_schema_id('Q4zqM7aXqm7gDQkUVLng9h::bc-reg:1.0') assert not ok_schema_id('Q4zqM7aXqm7gDQkUVLng9h:bc-reg:1.0') assert not ok_schema_id('Q4zqM7aXqm7gDQkUVLng9h:2:1.0') assert not ok_schema_id('Q4zqM7aXqm7gDQkUVLng9h:2::1.0') assert not ok_schema_id('Q4zqM7aXqm7gDQkUVLng9h:2:bc-reg:') assert not ok_schema_id('Q4zqM7aXqm7gDQkUVLng9h:2:bc-reg:1.0a') assert not ok_schema_id( 'Q4zqM7aXqm7gDQkUVLng9I:2:bc-reg:1.0') # I is not in base58 print('\n\n== 5 == Schema identifier checks pass OK') assert ok_cred_def_id( 'Q4zqM7aXqm7gDQkUVLng9h:3:CL:18:tag') # protocol >= 1.4 assert ok_cred_def_id( 'Q4zqM7aXqm7gDQkUVLng9h:3:CL:Q4zqM7aXqm7gDQkUVLng9h:2:schema_name:1.0:tag' ) # long form assert ok_cred_def_id('Q4zqM7aXqm7gDQkUVLng9h:3:CL:18:tag', 'Q4zqM7aXqm7gDQkUVLng9h') # issuer-did assert ok_cred_def_id( 'Q4zqM7aXqm7gDQkUVLng9h:3:CL:Q999999999999999999999:2:schema_name:1.0:tag', 'Q4zqM7aXqm7gDQkUVLng9h') # long form, issuer-did assert not ok_cred_def_id('Q4zqM7aXqm7gDQkUVLng9h:3:CL:18:tag', 'Xxxxxxxxxxxxxxxxxxxxxx') assert not ok_cred_def_id( 'Q4zqM7aXqm7gDQkUVLng9h:3:CL:Q4zqM7aXqm7gDQkUVLng9h:2:schema_name:1.0:tag', 'Xxxxxxxxxxxxxxxxxxxxxx') # long form, issuer-did assert ok_cred_def_id( 'Q4zqM7aXqm7gDQkUVLng9h:3:CL:Q4zqM7aXqm7gDQkUVLng9h:2:schema_name:1.0:tag' ) # long form assert not ok_cred_def_id( 'Q4zqM7aXqm7gDQkUVLng9h:3:CL:Q4zqM7aXqm7gDQkUVLng9h:schema_name:1.0:tag' ) # no :2: assert not ok_cred_def_id( 'Q4zqM7aXqm7gDQkUVLng9h:3:CL:QIIIIIIIII7gDQkUVLng9h:schema_name:1.0:tag' ) # I not base58 assert not ok_cred_def_id( 'Q4zqM7aXqm7gDQkUVLng9h:3:CL:QIIIIIIIII7gDQkUVLng9h:schema_name:v1.0:tag' ) # bad version assert not ok_cred_def_id('Q4zqM7aXqm7gDQkUVLng9h:4:CL:18:0') assert not ok_cred_def_id('Q4zqM7aXqm7gDQkUVLng9h::CL:18:0') assert not ok_cred_def_id('Q4zqM7aXqm7gDQkUVLng9I:3:CL:18:tag') assert not ok_cred_def_id('Q4zqM7aXqm7gDQkUVLng9h:3::18:tag') assert not ok_cred_def_id('Q4zqM7aXqm7gDQkUVLng9h:3:18:tag') assert not ok_cred_def_id('Q4zqM7aXqm7gDQkUVLng9h:3:CL:18z:tag') assert ok_cred_def_id('Q4zqM7aXqm7gDQkUVLng9h:3:CL:18') # protocol == 1.3 assert ok_cred_def_id('Q4zqM7aXqm7gDQkUVLng9h:3:CL:18', 'Q4zqM7aXqm7gDQkUVLng9h') assert not ok_cred_def_id('Q4zqM7aXqm7gDQkUVLng9h:3:CL:18', 'Xxxxxxxxxxxxxxxxxxxxxx') assert ok_cred_def_id( rev_reg_id2cred_def_id( 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:3:CL:Q4zqM7aXqm7gDQkUVLng9h:2:schema_name:1.0:tag:CL_ACCUM:1' )) print('\n\n== 6 == Credential definition identifier checks pass OK') assert ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:3:CL:20:tag:CL_ACCUM:1' ) # protocol >= 1.4 assert ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:3:CL:20:tag:CL_ACCUM:1', 'LjgpST2rjsoxYegQDRm7EL') assert ok_rev_reg_id( # long form 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:3:CL:Q4zqM7aXqm7gDQkUVLng9h:2:schema_name:1.0:tag:CL_ACCUM:1' ) assert ok_rev_reg_id( # long form 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:3:CL:Q4zqM7aXqm7gDQkUVLng9h:2:schema_name:1.0:tag:CL_ACCUM:1', 'LjgpST2rjsoxYegQDRm7EL') assert not ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:3:CL:20:tag:CL_ACCUM:1', 'Xxxxxxxxxxxxxxxxxxxxxx') assert not ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:5:LjgpST2rjsoxYegQDRm7EL:3:CL:20:tag:CL_ACCUM:1' ) assert not ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:4:CL:20:0:CL_ACCUM:1') assert not ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL::CL:20:0:CL_ACCUM:1') assert not ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:3:NOT_CL:20:tag:CL_ACCUM:1' ) assert not ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:3:CL:20z:tag:CL_ACCUM:1' ) assert not ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:3:CL:20::CL_ACCUM:1') assert not ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:3:CL:20:tag::1') assert not ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:3:CL:20:tag:1') assert not ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:3:CL:20:tag:CL_ACCUM:' ) assert not ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:3:CL:20:tag:CL_ACCUM') assert ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:3:CL:20:CL_ACCUM:1' ) # protocol == 1.3 assert ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:3:CL:20:CL_ACCUM:1', 'LjgpST2rjsoxYegQDRm7EL') assert not ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:3:CL:20:CL_ACCUM:1', 'Xxxxxxxxxxxxxxxxxxxxxx') print('\n\n== 7 == Revocation registry identifier checks pass OK')
async def test_ids(): print(Ink.YELLOW('\n\n== Testing Identifier Checks ==')) assert ok_wallet_reft('49ad0727-8663-45ae-a115-12b09860f9c6') assert not ok_wallet_reft('Q4zqM7aXqm7gDQkUVLng9I') assert not ok_wallet_reft('49ad0727-45ae-a115-12b09860f9c6') print('\n\n== 1 == Wallet referent identifier checks pass OK') assert ok_did('Q4zqM7aXqm7gDQkUVLng9h') assert not ok_did('Q4zqM7aXqm7gDQkUVLng9I') # 'I' not a base58 char assert not ok_did('Q4zqM7aXqm7gDQkUVLng') # too short print('\n\n== 2 == Distributed identifier checks pass OK') for value in (None, 'TRUSTEE', 'STEWARD', 'TRUST_ANCHOR', ''): assert ok_role(value) for value in (123, 'TRUSTY', 'STEW', 'ANCHOR', ' '): assert not ok_role(value) print('\n\n== 3 == Role identifier checks pass OK') assert Tails.ok_hash('Q4zqM7aXqm7gDQkUVLng9hQ4zqM7aXqm7gDQkUVLng9h') assert Tails.ok_hash('Q4zqM7aXqm7gDQkUVLng9hQ4zqM7aXqm7gDQkUVLng') assert not Tails.ok_hash('Q4zqM7aXqm7gDQkUVLng9h') assert not Tails.ok_hash('Q4zqM7aXqm7gDQkUVLng9hQ4zqM7aXqm7gDQkUVLng9hx') assert not Tails.ok_hash('Q4zqM7aXqm7gDQkUVLng9hQ4zqM7aXqm7gDQkUVLng90') print('\n\n== 4 == Tails hash identifier checks pass OK') assert ok_schema_id('Q4zqM7aXqm7gDQkUVLng9h:2:bc-reg:1.0') assert not ok_schema_id('Q4zqM7aXqm7gDQkUVLng9h:3:bc-reg:1.0') assert not ok_schema_id('Q4zqM7aXqm7gDQkUVLng9h::bc-reg:1.0') assert not ok_schema_id('Q4zqM7aXqm7gDQkUVLng9h:bc-reg:1.0') assert not ok_schema_id('Q4zqM7aXqm7gDQkUVLng9h:2:1.0') assert not ok_schema_id('Q4zqM7aXqm7gDQkUVLng9h:2::1.0') assert not ok_schema_id('Q4zqM7aXqm7gDQkUVLng9h:2:bc-reg:') assert not ok_schema_id('Q4zqM7aXqm7gDQkUVLng9h:2:bc-reg:1.0a') assert not ok_schema_id( 'Q4zqM7aXqm7gDQkUVLng9I:2:bc-reg:1.0') # I is not in base58 print('\n\n== 5 == Schema identifier checks pass OK') assert ok_cred_def_id( 'Q4zqM7aXqm7gDQkUVLng9h:3:CL:18:tag') # protocol >= 1.4 assert ok_cred_def_id('Q4zqM7aXqm7gDQkUVLng9h:3:CL:18:tag', 'Q4zqM7aXqm7gDQkUVLng9h') assert not ok_cred_def_id('Q4zqM7aXqm7gDQkUVLng9h:3:CL:18:tag', 'Xxxxxxxxxxxxxxxxxxxxxx') assert not ok_cred_def_id('Q4zqM7aXqm7gDQkUVLng9h:4:CL:18:0') assert not ok_cred_def_id('Q4zqM7aXqm7gDQkUVLng9h::CL:18:0') assert not ok_cred_def_id('Q4zqM7aXqm7gDQkUVLng9I:3:CL:18:tag') assert not ok_cred_def_id('Q4zqM7aXqm7gDQkUVLng9h:3::18:tag') assert not ok_cred_def_id('Q4zqM7aXqm7gDQkUVLng9h:3:18:tag') assert not ok_cred_def_id('Q4zqM7aXqm7gDQkUVLng9h:3:CL:18z:tag') assert ok_cred_def_id('Q4zqM7aXqm7gDQkUVLng9h:3:CL:18') # protocol == 1.3 assert ok_cred_def_id('Q4zqM7aXqm7gDQkUVLng9h:3:CL:18', 'Q4zqM7aXqm7gDQkUVLng9h') assert not ok_cred_def_id('Q4zqM7aXqm7gDQkUVLng9h:3:CL:18', 'Xxxxxxxxxxxxxxxxxxxxxx') print('\n\n== 6 == Credential definition identifier checks pass OK') assert ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:3:CL:20:tag:CL_ACCUM:1' ) # protocol >= 1.4 assert ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:3:CL:20:tag:CL_ACCUM:1', 'LjgpST2rjsoxYegQDRm7EL') assert not ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:3:CL:20:tag:CL_ACCUM:1', 'Xxxxxxxxxxxxxxxxxxxxxx') assert not ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:5:LjgpST2rjsoxYegQDRm7EL:3:CL:20:tag:CL_ACCUM:1' ) assert not ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:4:CL:20:0:CL_ACCUM:1') assert not ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL::CL:20:0:CL_ACCUM:1') assert not ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:3:NOT_CL:20:tag:CL_ACCUM:1' ) assert not ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:3:CL:20z:tag:CL_ACCUM:1' ) assert not ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:3:CL:20::CL_ACCUM:1') assert not ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:3:CL:20:tag::1') assert not ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:3:CL:20:tag:1') assert not ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:3:CL:20:tag:CL_ACCUM:' ) assert not ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:3:CL:20:tag:CL_ACCUM') assert ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:3:CL:20:CL_ACCUM:1' ) # protocol == 1.3 assert ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:3:CL:20:CL_ACCUM:1', 'LjgpST2rjsoxYegQDRm7EL') assert not ok_rev_reg_id( 'LjgpST2rjsoxYegQDRm7EL:4:LjgpST2rjsoxYegQDRm7EL:3:CL:20:CL_ACCUM:1', 'Xxxxxxxxxxxxxxxxxxxxxx') print('\n\n== 7 == Revocation registry identifier checks pass OK') assert ok_endpoint('10.0.0.2:9702') assert ok_endpoint('0.0.0.0:0') assert not ok_endpoint('canada.gc.ca:8088') assert not ok_endpoint(':37') assert not ok_endpoint('http://url-wrong') assert not ok_endpoint('2.3.4.5') assert not ok_endpoint('2.3.4:8080') assert not ok_endpoint('1.2.3.4:abc') assert not ok_endpoint('1.2.3.4:1234.56') print('\n\n== 8 == Endpoint checks pass OK')