def test_read_dictionary_from_file(self): some_dict = {"a":"b", "c":"d"} contents = json.dumps(some_dict) with open(self.wallet_path, "w") as f: contents = f.write(contents) storage = WalletStorage(self.wallet_path, manual_upgrades=True) self.assertEqual("b", storage.get("a")) self.assertEqual("d", storage.get("c"))
def test_read_dictionnary_from_file(self): some_dict = {"a": "b", "c": "d"} contents = json.dumps(some_dict) with open(self.wallet_path, "w") as f: contents = f.write(contents) storage = WalletStorage(self.wallet_path) self.assertEqual("b", storage.get("a")) self.assertEqual("d", storage.get("c"))
def setUp(self): bitcoin.set_testnet() self.user_dir = tempfile.mkdtemp() self.wallet_path = os.path.join(self.user_dir, "testwallet") self.storage = WalletStorage(self.wallet_path) k = keystore.from_seed('absent feel require game library trade march seven quantum recycle warfare tomorrow', '') self.storage.put('seed_type', 'standard') self.storage.put('keystore', k.dump()) self.wallet = wallet.Standard_Wallet(self.storage) for i in range(2): self.wallet.create_new_address(False) # normal addresses self.wallet.create_new_address(True) # change addresses self.wallet.storage.write()
def setUp(self): bitcoin.set_testnet() self.user_dir = tempfile.mkdtemp() self.wallet_path = os.path.join(self.user_dir, "multisig2") self.storage = WalletStorage(self.wallet_path) self.storage.put('wallet_type', "2of3") k = [keystore.from_seed('almost cross mistake border loud enable birth worth end helmet flash cliff', '')] k.append(keystore.from_keys('tpubD6NzVbkrYhZ4XikksiCN1DTVgBZUQcKeN5XkbeqhDZei5z15sb34cES57n7BS7zxuN5QSwRtFidx4VMYk9VBoX76CCsek6P2mzWkTj3UtiK')) k.append(keystore.from_keys('tpubD6NzVbkrYhZ4XgqM6axUN9ZhvBhCawMKRsT9Lqxs6fMjj5TAB9cE7vJATk1vuGrpBVaqVPKrSPXeDYJMbLWKN9svbKEW38WAWQq5nU3nqT1')) for i, one_k in enumerate(k): self.storage.put('x%d/' % (i + 1), one_k.dump()) self.wallet = wallet.Multisig_Wallet(self.storage) for i in range(2): self.wallet.create_new_address(False) # normal addresses self.wallet.create_new_address(True) # change addresses self.wallet.storage.write()
def test_write_dictionary_to_file(self): storage = WalletStorage(self.wallet_path) some_dict = { u"a": u"b", u"c": u"d", u"seed_version": FINAL_SEED_VERSION} for key, value in some_dict.items(): storage.put(key, value) storage.write() contents = "" with open(self.wallet_path, "r") as f: contents = f.read() self.assertEqual(some_dict, json.loads(contents))
def _load_storage_from_json_string(self, wallet_json, manual_upgrades=True): with open(self.wallet_path, "w") as f: f.write(wallet_json) storage = WalletStorage(self.wallet_path, manual_upgrades=manual_upgrades) return storage
def test_encrypt_message(self): key = WalletStorage.get_eckey_from_password('secret_password77') msgs = [bytes([0] * 555), b'cannot think of anything funny'] for plaintext in msgs: ciphertext1 = key.encrypt_message(plaintext) ciphertext2 = key.encrypt_message(plaintext) self.assertEqual(plaintext, key.decrypt_message(ciphertext1)) self.assertEqual(plaintext, key.decrypt_message(ciphertext2)) self.assertNotEqual(ciphertext1, ciphertext2)
def test_encrypt_message(self): key = WalletStorage.get_eckey_from_password('secret_password77') msgs = [ bytes([0] * 555), b'cannot think of anything funny' ] for plaintext in msgs: ciphertext1 = key.encrypt_message(plaintext) ciphertext2 = key.encrypt_message(plaintext) self.assertEqual(plaintext, key.decrypt_message(ciphertext1)) self.assertEqual(plaintext, key.decrypt_message(ciphertext2)) self.assertNotEqual(ciphertext1, ciphertext2)
def _create_standard_wallet(ks): store = WalletStorage('if_this_exists_mocking_failed_648151893') store.put('keystore', ks.dump()) store.put('gap_limit', NUM_OF_ADDRESSES_TO_GENERATE) w = Standard_Wallet(store) w.synchronize() return w
def _create_standard_wallet(ks): gap_limit = 1 # make tests run faster store = WalletStorage('if_this_exists_mocking_failed_648151893') store.put('keystore', ks.dump()) store.put('gap_limit', gap_limit) w = Standard_Wallet(store) w.synchronize() return w
def _upgrade_storage(self, wallet_json, accounts=1): storage = self._load_storage_from_json_string(wallet_json, manual_upgrades=True) if accounts == 1: self.assertFalse(storage.requires_split()) if storage.requires_upgrade(): storage.upgrade() self._sanity_check_upgraded_storage(storage) else: self.assertTrue(storage.requires_split()) new_paths = storage.split_accounts() self.assertEqual(accounts, len(new_paths)) for new_path in new_paths: new_storage = WalletStorage(new_path, manual_upgrades=False) self._sanity_check_upgraded_storage(new_storage)
def test_decrypt_message(self): key = WalletStorage.get_eckey_from_password('pw123') self.assertEqual( b'me<(s_s)>age', key.decrypt_message( b'QklFMQMDFtgT3zWSQsa+Uie8H/WvfUjlu9UN9OJtTt3KlgKeSTi6SQfuhcg1uIz9hp3WIUOFGTLr4RNQBdjPNqzXwhkcPi2Xsbiw6UCNJncVPJ6QBg==' )) self.assertEqual( b'me<(s_s)>age', key.decrypt_message( b'QklFMQKXOXbylOQTSMGfo4MFRwivAxeEEkewWQrpdYTzjPhqjHcGBJwdIhB7DyRfRQihuXx1y0ZLLv7XxLzrILzkl/H4YUtZB4uWjuOAcmxQH4i/Og==' )) self.assertEqual( b'hey_there' * 100, key.decrypt_message( b'QklFMQLOOsabsXtGQH8edAa6VOUa5wX8/DXmxX9NyHoAx1a5bWgllayGRVPeI2bf0ZdWK0tfal0ap0ZIVKbd2eOJybqQkILqT6E1/Syzq0Zicyb/AA1eZNkcX5y4gzloxinw00ubCA8M7gcUjJpOqbnksATcJ5y2YYXcHMGGfGurWu6uJ/UyrNobRidWppRMW5yR9/6utyNvT6OHIolCMEf7qLcmtneoXEiz51hkRdZS7weNf9mGqSbz9a2NL3sdh1A0feHIjAZgcCKcAvksNUSauf0/FnIjzTyPRpjRDMeDC8Ci3sGiuO3cvpWJwhZfbjcS26KmBv2CHWXfRRNFYOInHZNIXWNAoBB47Il5bGSMd+uXiGr+SQ9tNvcu+BiJNmFbxYqg+oQ8dGAl1DtvY2wJVY8k7vO9BIWSpyIxfGw7EDifhc5vnOmGe016p6a01C3eVGxgl23UYMrP7+fpjOcPmTSF4rk5U5ljEN3MSYqlf1QEv0OqlI9q1TwTK02VBCjMTYxDHsnt04OjNBkNO8v5uJ4NR+UUDBEp433z53I59uawZ+dbk4v4ZExcl8EGmKm3Gzbal/iJ/F7KQuX2b/ySEhLOFVYFWxK73X1nBvCSK2mC2/8fCw8oI5pmvzJwQhcCKTdEIrz3MMvAHqtPScDUOjzhXxInQOCb3+UBj1PPIdqkYLvZss1TEaBwYZjLkVnK2MBj7BaqT6Rp6+5A/fippUKHsnB6eYMEPR2YgDmCHL+4twxHJG6UWdP3ybaKiiAPy2OHNP6PTZ0HrqHOSJzBSDD+Z8YpaRg29QX3UEWlqnSKaan0VYAsV1VeaN0XFX46/TWO0L5tjhYVXJJYGqo6tIQJymxATLFRF6AZaD1Mwd27IAL04WkmoQoXfO6OFfwdp/shudY/1gBkDBvGPICBPtnqkvhGF+ZF3IRkuPwiFWeXmwBxKHsRx/3+aJu32Ml9+za41zVk2viaxcGqwTc5KMexQFLAUwqhv+aIik7U+5qk/gEVSuRoVkihoweFzKolNF+BknH2oB4rZdPixag5Zje3DvgjsSFlOl69W/67t/Gs8htfSAaHlsB8vWRQr9+v/lxTbrAw+O0E+sYGoObQ4qQMyQshNZEHbpPg63eWiHtJJnrVBvOeIbIHzoLDnMDsWVWZSMzAQ1vhX1H5QLgSEbRlKSliVY03kDkh/Nk/KOn+B2q37Ialq4JcRoIYFGJ8AoYEAD0tRuTqFddIclE75HzwaNG7NyKW1plsa72ciOPwsPJsdd5F0qdSQ3OSKtooTn7uf6dXOc4lDkfrVYRlZ0PX' ))
def test_write_dictionnary_to_file(self): storage = WalletStorage(self.wallet_path) some_dict = { u"a": u"b", u"c": u"d", u"seed_version": FINAL_SEED_VERSION} for key, value in some_dict.items(): storage.put(key, value) storage.write() contents = "" with open(self.wallet_path, "r") as f: contents = f.read() self.assertEqual(some_dict, json.loads(contents))
class TestMultiSigWallet(unittest.TestCase): def setUp(self): bitcoin.set_testnet() self.user_dir = tempfile.mkdtemp() self.wallet_path = os.path.join(self.user_dir, "multisig2") self.storage = WalletStorage(self.wallet_path) self.storage.put('wallet_type', "2of3") k = [keystore.from_seed('almost cross mistake border loud enable birth worth end helmet flash cliff', '')] k.append(keystore.from_keys('tpubD6NzVbkrYhZ4XikksiCN1DTVgBZUQcKeN5XkbeqhDZei5z15sb34cES57n7BS7zxuN5QSwRtFidx4VMYk9VBoX76CCsek6P2mzWkTj3UtiK')) k.append(keystore.from_keys('tpubD6NzVbkrYhZ4XgqM6axUN9ZhvBhCawMKRsT9Lqxs6fMjj5TAB9cE7vJATk1vuGrpBVaqVPKrSPXeDYJMbLWKN9svbKEW38WAWQq5nU3nqT1')) for i, one_k in enumerate(k): self.storage.put('x%d/' % (i + 1), one_k.dump()) self.wallet = wallet.Multisig_Wallet(self.storage) for i in range(2): self.wallet.create_new_address(False) # normal addresses self.wallet.create_new_address(True) # change addresses self.wallet.storage.write() def tearDown(self): del self.wallet del self.storage shutil.rmtree(self.user_dir) # restore back to mainnet bitcoin.TESTNET = False bitcoin.ADDRTYPE_P2PKH = 0 bitcoin.ADDRTYPE_P2SH = 5 bitcoin.ADDRTYPE_P2WPKH = 6 bitcoin.XPRV_HEADER = 0x0488ade4 bitcoin.XPUB_HEADER = 0x0488b21e bitcoin.HEADERS_URL = "http://bitcoincash.com/files/blockchain_headers" bitcoin.GENESIS = "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f" def test_signfromcmdline(self): # tx has been signed by one in 2of3 multisig - check that it can be completed by second raw_onesign = '0100000001f5c9f455b2321add71f307a9ee7a757770ffa679b42da21e2e1c025f09b0a80f01000000fd1f010001ff01ff483045022100ea5a8a813f70a0ed6919f49ab7b24a45858a66a433694d098f42df53fa2b152702205b2161ba4010a667e24b8a7e1bc18172b04d4e964a5a61e7803e14e68f7aa5c4414ccf524c53ff043587cf000000000000000000877214e20b564ea196f5849d59ee5df75f19c9653e51cbb1b36b5016127d6d7603717353e251530938e2f58e69e4241220a83de34c6a34531dbc8a2d9fab4bf1ef010000004c53ff043587cf000000000000000000496e2dc110ea22d9eccc4cf544073593cbd4cd8bd9cdbb990cfa4be8a1bc3735037fe33cf2c12ca4669a262c753da553af507c45776029d1373b36d995a5d1e3df010000002103f0e6194aadb6eb52d11e1f677af21251cda80a24d409230df6f94c4b4030893853aefeffffff0280969800000000001976a914b6d22863dfffe257f72ed5ad6daaef8ba970139e88ac7099c4040000000017a9140192877a30ab29b73abda5549bbb0a8db01d08128700000000' tx_onesign = { 'inputs': [{ 'redeemScript': '5221024e539282253ccc288f93966e94fecb637f9491718f1c573ced10aa052fea939a2103de64029a56a6a9fb78c8b8f030fc557db85a4f47d1278e556081cd7b2ca381f92103f0e6194aadb6eb52d11e1f677af21251cda80a24d409230df6f94c4b4030893853ae', 'signatures': [None, None, '3045022100ea5a8a813f70a0ed6919f49ab7b24a45858a66a433694d098f42df53fa2b152702205b2161ba4010a667e24b8a7e1bc18172b04d4e964a5a61e7803e14e68f7aa5c441'], 'prevout_hash': '0fa8b0095f021c2e1ea22db479a6ff7077757aeea907f371dd1a32b255f4c9f5', 'scriptSig': '0001ff01ff483045022100ea5a8a813f70a0ed6919f49ab7b24a45858a66a433694d098f42df53fa2b152702205b2161ba4010a667e24b8a7e1bc18172b04d4e964a5a61e7803e14e68f7aa5c4414ccf524c53ff043587cf000000000000000000877214e20b564ea196f5849d59ee5df75f19c9653e51cbb1b36b5016127d6d7603717353e251530938e2f58e69e4241220a83de34c6a34531dbc8a2d9fab4bf1ef010000004c53ff043587cf000000000000000000496e2dc110ea22d9eccc4cf544073593cbd4cd8bd9cdbb990cfa4be8a1bc3735037fe33cf2c12ca4669a262c753da553af507c45776029d1373b36d995a5d1e3df010000002103f0e6194aadb6eb52d11e1f677af21251cda80a24d409230df6f94c4b4030893853ae', 'sequence': 4294967294, 'x_pubkeys': ['ff043587cf000000000000000000877214e20b564ea196f5849d59ee5df75f19c9653e51cbb1b36b5016127d6d7603717353e251530938e2f58e69e4241220a83de34c6a34531dbc8a2d9fab4bf1ef01000000', 'ff043587cf000000000000000000496e2dc110ea22d9eccc4cf544073593cbd4cd8bd9cdbb990cfa4be8a1bc3735037fe33cf2c12ca4669a262c753da553af507c45776029d1373b36d995a5d1e3df01000000', '03f0e6194aadb6eb52d11e1f677af21251cda80a24d409230df6f94c4b40308938'], 'address': '2N5JTUQ7VJ3XBYh7LmK8Uuhs72UmJGSYcdE', 'num_sig': 2, 'pubkeys': ['024e539282253ccc288f93966e94fecb637f9491718f1c573ced10aa052fea939a', '03de64029a56a6a9fb78c8b8f030fc557db85a4f47d1278e556081cd7b2ca381f9', '03f0e6194aadb6eb52d11e1f677af21251cda80a24d409230df6f94c4b40308938'], 'type': 'p2sh', 'prevout_n': 1 }], 'lockTime': 0, 'version': 1, 'outputs': [{ 'prevout_n': 0, 'scriptPubKey': '76a914b6d22863dfffe257f72ed5ad6daaef8ba970139e88ac', 'type': 0, 'value': 10000000, 'address': 'mxBd2z6kJG48EJpi7oVZ5SWoKWMeJuJHsV' }, { 'prevout_n': 1, 'scriptPubKey': 'a9140192877a30ab29b73abda5549bbb0a8db01d081287', 'type': 0, 'value': 79993200, 'address': '2MsPYCWAYtRTPZWMQvX1ZGYgqoBuGgPF6wn' }] } tx = transaction.Transaction(raw_onesign) self.assertEqual(tx.deserialize(),tx_onesign) self.assertFalse(tx.is_complete()) # wallet has no tx history, so this should fail with self.assertRaises(transaction.InputValueMissing): self.wallet.sign_transaction(tx, None) # the tx that is used as input raw_src = '01000000010144a6dd5efda1f7f54ed7ba5dcce314f44a071ceb330ac3143dc694aeadb43400000000fdfd000047304402201f2e4d4357688201206168bb99de54a433a13d49160a5b5957fea794be5f1e38022021b4c6d146b2bf7374a46c00e1c7331f36ff1ff47afa29e2b9da8132a309b654414830450221009912b21f3ce1bff9fe6aa03d7da020c9b15dab7c311adbfac038193c6705b35402207625260c4f8a106ccee09946baae2c89d588087bc8e49cc9af474904a5f42157414c6952210348d80fbd95e620b150ca0be9a6090b4c98bc29fb32354d8f0b6b783bab24986d21036410bdf162b5695fc4b79368150480f2d0708303db03fcc7d23707c70b6efe2c2103f7412915e5e7fc72d1cf2829533c1557c9bb169bbbe7d4f7520fc69edaf55de453aefeffffff0280969800000000001976a914b6d22863dfffe257f72ed5ad6daaef8ba970139e88ac383d5d050000000017a914843e0387ccbf569be834e12b119eab167b47835d8700000000' srctx = transaction.Transaction(raw_src) self.assertTrue('2N5JTUQ7VJ3XBYh7LmK8Uuhs72UmJGSYcdE' in srctx.get_output_addresses()) self.wallet.add_transaction(srctx.txid(),srctx) # this fails, issue 169 self.wallet.sign_transaction(tx, None) self.assertTrue(tx.is_complete())
class TestStandardWallet(unittest.TestCase): def setUp(self): bitcoin.set_testnet() self.user_dir = tempfile.mkdtemp() self.wallet_path = os.path.join(self.user_dir, "testwallet") self.storage = WalletStorage(self.wallet_path) k = keystore.from_seed('absent feel require game library trade march seven quantum recycle warfare tomorrow', '') self.storage.put('seed_type', 'standard') self.storage.put('keystore', k.dump()) self.wallet = wallet.Standard_Wallet(self.storage) for i in range(2): self.wallet.create_new_address(False) # normal addresses self.wallet.create_new_address(True) # change addresses self.wallet.storage.write() def tearDown(self): del self.wallet del self.storage shutil.rmtree(self.user_dir) # restore back to mainnet bitcoin.TESTNET = False bitcoin.ADDRTYPE_P2PKH = 0 bitcoin.ADDRTYPE_P2SH = 5 bitcoin.ADDRTYPE_P2WPKH = 6 bitcoin.XPRV_HEADER = 0x0488ade4 bitcoin.XPUB_HEADER = 0x0488b21e bitcoin.HEADERS_URL = "http://bitcoincash.com/files/blockchain_headers" bitcoin.GENESIS = "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f" def test_addresses(self): self.assertTrue('mx6w8bqyDQHZUJP6vAUVgXAoL6U1QnDgEJ' in self.wallet.get_addresses()) self.assertTrue('n1xnWFMLF9xkcUxL3ZwQKbGkRNBpGKdFjt' in self.wallet.get_addresses()) self.assertFalse('invalid address' in self.wallet.get_addresses()) self.assertTrue(len(self.wallet.get_addresses()) >= 2) def test_add_transaction(self): addedtx = self.add_all_txs() self.assertEqual(len(self.wallet.transactions),len(addedtx)) # adding tx's does not automatically update the utxo's self.assertEqual(len(self.wallet.get_utxos()),0) # this fails, related to issue 169, being worked on def test_sign(self): for sample in sample_tx_testnet: if 'raw_unsigned' in sample: tx = transaction.Transaction(sample['raw_unsigned']) tx.deserialize() for i in tx.inputs(): self.assertTrue(i['address'] in self.wallet.get_addresses()) self.assertFalse(tx.is_complete()) # wallet has no tx history, so this should fail with self.assertRaises(transaction.InputValueMissing): self.wallet.sign_transaction(tx, None) self.assertFalse(tx.is_complete()) if 'input_txs' in sample: for i in sample['input_txs']: # add the txs for the inputs to the wallet itx = transaction.Transaction(i) self.wallet.add_transaction(itx.txid(),itx) self.wallet.sign_transaction(tx, None) self.assertTrue(tx.is_complete()) def add_all_txs(self): addedtx = [] for sample in sample_tx_testnet: if 'raw' in sample: tx = transaction.Transaction(sample['raw']) if tx.txid() not in addedtx: self.wallet.add_transaction(tx.txid(),tx) addedtx.append(tx.txid()) if 'input_txs' in sample: for i in sample['input_txs']: tx = transaction.Transaction(i) if tx.txid() not in addedtx: self.wallet.add_transaction(tx.txid(), tx) addedtx.append(tx.txid()) return addedtx
def test_inputs(self): try: with open(txintests_local) as f: testlist = json.load(f) print("Got script tests from %s; will not download." % (txintests_local, )) except IOError: print("Couldn't get script tests from %s; downloading from %s..." % (txintests_local, txintests_url)) testlist = requests.get(txintests_url).json() print("Starting %d tests on SLP's input validation" % len(testlist)) for test in testlist: description = test['description'] given_validity = {} #should_validity = {} txes = {} for d in test['when']: tx = Transaction(d['tx']) txid = tx.txid() txes[txid] = tx if d['valid'] is True: given_validity[txid] = 1 elif d['valid'] is False: given_validity[txid] = 2 else: raise ValueError(d['valid']) for d in test['should']: tx = Transaction(d['tx']) txid = tx.txid() txes[txid] = tx d['txid'] = txid #if d['valid'] is True: #should_validity[txid] = 1 #elif d['valid'] is False: #should_validity[txid] = 2 #else: #raise ValueError(d['valid']) graph_context, graph_context_nft1 = slp_validator_0x01.GraphContext( ), slp_validator_0x01_nft1.GraphContext_NFT1() for i, d in enumerate(test['should']): txid = d['txid'] with self.subTest(description=description, i=i): try: slp_msg = slp.SlpMessage.parseSlpOutputScript( txes[txid].outputs()[0][1]) if slp_msg.token_type == 1: graph, job_mgr = graph_context.setup_job( txes[txid], reset=True) elif slp_msg.token_type == 65 or slp_msg.token_type == 129: graph, job_mgr = graph_context_nft1.setup_job( txes[txid], reset=True) else: raise slp.SlpUnsupportedSlpTokenType( slp_msg.token_type) except slp.SlpInvalidOutputMessage: # If output 0 is not OP_RETURN self.assertEqual(d['valid'], False) continue except slp.SlpUnsupportedSlpTokenType: self.assertEqual(d['valid'], False) continue def fetch_hook(txids, job): l = [] for txid in txids: try: l.append(txes[txid]) except KeyError: #raise Exception('KEY ERROR ' + txid) pass ### Call proxy here! return l if slp_msg.token_type == 1: job = slp_validator_0x01.ValidationJob( graph, txid, None, fetch_hook=fetch_hook, validitycache=given_validity) elif slp_msg.token_type == 65: network = MockNetwork(txes) storage = WalletStorage(os.path.curdir, manual_upgrades=True, in_memory_only=True) wallet = Slp_ImportedAddressWallet(storage) wallet.slp_graph_0x01_nft = graph_context_nft1 #raise Exception(txid) job = slp_validator_0x01_nft1.ValidationJobNFT1Child( graph, txid, network, fetch_hook=fetch_hook, validitycache=None, ref=wallet) elif slp_msg.token_type == 129: job = slp_validator_0x01_nft1.ValidationJob( graph, txid, None, fetch_hook=fetch_hook, validitycache=given_validity) #if txid == '8a08b78ae434de0b1a26e56ae7e78bb11b20f8240eb3d97371fd46a609df7fc3': #graph.debugging = True #job.debugging_graph_state = True q = Queue() job.add_callback(q.put) job_mgr.add_job(job) while True: try: q.get(timeout=3) # unlimited timeout except Empty: raise RuntimeError( "Timeout during validation unit test") # if isinstance(job, ValidationJobNFT1Child) and not job.paused:# and job.stop_reason != 'inconclusive': # raise Exception(job.stop_reason) if not job.paused and not job.running: # and job.stop_reason != 'inconclusive': n = next(iter(job.nodes.values())) if d['valid'] is True: self.assertEqual(n.validity, 1) elif d['valid'] is False: if test.get( 'allow_inconclusive', False ): # "allow_inconclusive" allows for ending with an "unvalidated" state for harder corner-cases self.assertIn(n.validity, (0, 2, 3, 4)) else: self.assertIn(n.validity, (2, 3, 4)) else: raise ValueError(d['valid']) break else: if len(job.callbacks) > 1: raise Exception( "shouldn't have more than 1 callback") job.callbacks.clear() job.add_callback(q.put, allow_run_cb_now=False)
def test_decrypt_message(self): key = WalletStorage.get_eckey_from_password('pw123') self.assertEqual(b'me<(s_s)>age', key.decrypt_message(b'QklFMQMDFtgT3zWSQsa+Uie8H/WvfUjlu9UN9OJtTt3KlgKeSTi6SQfuhcg1uIz9hp3WIUOFGTLr4RNQBdjPNqzXwhkcPi2Xsbiw6UCNJncVPJ6QBg==')) self.assertEqual(b'me<(s_s)>age', key.decrypt_message(b'QklFMQKXOXbylOQTSMGfo4MFRwivAxeEEkewWQrpdYTzjPhqjHcGBJwdIhB7DyRfRQihuXx1y0ZLLv7XxLzrILzkl/H4YUtZB4uWjuOAcmxQH4i/Og==')) self.assertEqual(b'hey_there' * 100, key.decrypt_message(b'QklFMQLOOsabsXtGQH8edAa6VOUa5wX8/DXmxX9NyHoAx1a5bWgllayGRVPeI2bf0ZdWK0tfal0ap0ZIVKbd2eOJybqQkILqT6E1/Syzq0Zicyb/AA1eZNkcX5y4gzloxinw00ubCA8M7gcUjJpOqbnksATcJ5y2YYXcHMGGfGurWu6uJ/UyrNobRidWppRMW5yR9/6utyNvT6OHIolCMEf7qLcmtneoXEiz51hkRdZS7weNf9mGqSbz9a2NL3sdh1A0feHIjAZgcCKcAvksNUSauf0/FnIjzTyPRpjRDMeDC8Ci3sGiuO3cvpWJwhZfbjcS26KmBv2CHWXfRRNFYOInHZNIXWNAoBB47Il5bGSMd+uXiGr+SQ9tNvcu+BiJNmFbxYqg+oQ8dGAl1DtvY2wJVY8k7vO9BIWSpyIxfGw7EDifhc5vnOmGe016p6a01C3eVGxgl23UYMrP7+fpjOcPmTSF4rk5U5ljEN3MSYqlf1QEv0OqlI9q1TwTK02VBCjMTYxDHsnt04OjNBkNO8v5uJ4NR+UUDBEp433z53I59uawZ+dbk4v4ZExcl8EGmKm3Gzbal/iJ/F7KQuX2b/ySEhLOFVYFWxK73X1nBvCSK2mC2/8fCw8oI5pmvzJwQhcCKTdEIrz3MMvAHqtPScDUOjzhXxInQOCb3+UBj1PPIdqkYLvZss1TEaBwYZjLkVnK2MBj7BaqT6Rp6+5A/fippUKHsnB6eYMEPR2YgDmCHL+4twxHJG6UWdP3ybaKiiAPy2OHNP6PTZ0HrqHOSJzBSDD+Z8YpaRg29QX3UEWlqnSKaan0VYAsV1VeaN0XFX46/TWO0L5tjhYVXJJYGqo6tIQJymxATLFRF6AZaD1Mwd27IAL04WkmoQoXfO6OFfwdp/shudY/1gBkDBvGPICBPtnqkvhGF+ZF3IRkuPwiFWeXmwBxKHsRx/3+aJu32Ml9+za41zVk2viaxcGqwTc5KMexQFLAUwqhv+aIik7U+5qk/gEVSuRoVkihoweFzKolNF+BknH2oB4rZdPixag5Zje3DvgjsSFlOl69W/67t/Gs8htfSAaHlsB8vWRQr9+v/lxTbrAw+O0E+sYGoObQ4qQMyQshNZEHbpPg63eWiHtJJnrVBvOeIbIHzoLDnMDsWVWZSMzAQ1vhX1H5QLgSEbRlKSliVY03kDkh/Nk/KOn+B2q37Ialq4JcRoIYFGJ8AoYEAD0tRuTqFddIclE75HzwaNG7NyKW1plsa72ciOPwsPJsdd5F0qdSQ3OSKtooTn7uf6dXOc4lDkfrVYRlZ0PX'))