def test_msg_signing(self): msg1 = b'Chancellor on brink of second bailout for banks' msg2 = b'Electrum' def sign_message_with_wif_privkey(wif_privkey, msg): txin_type, privkey, compressed = deserialize_privkey(wif_privkey) key = regenerate_key(privkey) return key.sign_message(msg, compressed) sig1 = sign_message_with_wif_privkey( 'L1TnU2zbNaAqMoVh65Cyvmcjzbrj41Gs9iTLcWbpJCMynXuap6UN', msg1) addr1 = '15hETetDmcXm1mM4sEf7U2KXC9hDHFMSzz' sig2 = sign_message_with_wif_privkey( '5Hxn5C4SQuiV6e62A1MtZmbSeQyrLFhu5uYks62pU5VBUygK2KD', msg2) addr2 = '1GPHVTY8UD9my6jyP4tb2TYJwUbDetyNC6' sig1_b64 = base64.b64encode(sig1) sig2_b64 = base64.b64encode(sig2) self.assertEqual(sig1_b64, b'H/9jMOnj4MFbH3d7t4yCQ9i7DgZU/VZ278w3+ySv2F4yIsdqjsc5ng3kmN8OZAThgyfCZOQxZCWza9V5XzlVY0Y=') self.assertEqual(sig2_b64, b'G84dmJ8TKIDKMT9qBRhpX2sNmR0y5t+POcYnFFJCs66lJmAs3T8A6Sbpx7KA6yTQ9djQMabwQXRrDomOkIKGn18=') self.assertTrue(verify_message(addr1, sig1, msg1)) self.assertTrue(verify_message(addr2, sig2, msg2)) self.assertFalse(verify_message(addr1, b'wrong', msg1)) self.assertFalse(verify_message(addr1, sig2, msg1))
def test_msg_signing(self): msg1 = b'Chancellor on brink of second bailout for banks' msg2 = b'Electrum' def sign_message_with_wif_privkey(wif_privkey, msg): txin_type, privkey, compressed = deserialize_privkey(wif_privkey) key = regenerate_key(privkey) return key.sign_message(msg, compressed) sig1 = sign_message_with_wif_privkey( 'L1TnU2zbNaAqMoVh65Cyvmcjzbrj41Gs9iTLcWbpJCMynXuap6UN', msg1) addr1 = '15hETetDmcXm1mM4sEf7U2KXC9hDHFMSzz' sig2 = sign_message_with_wif_privkey( '5Hxn5C4SQuiV6e62A1MtZmbSeQyrLFhu5uYks62pU5VBUygK2KD', msg2) addr2 = '1GPHVTY8UD9my6jyP4tb2TYJwUbDetyNC6' sig1_b64 = base64.b64encode(sig1) sig2_b64 = base64.b64encode(sig2) self.assertEqual( sig1_b64, b'H/9jMOnj4MFbH3d7t4yCQ9i7DgZU/VZ278w3+ySv2F4yIsdqjsc5ng3kmN8OZAThgyfCZOQxZCWza9V5XzlVY0Y=' ) self.assertEqual( sig2_b64, b'G84dmJ8TKIDKMT9qBRhpX2sNmR0y5t+POcYnFFJCs66lJmAs3T8A6Sbpx7KA6yTQ9djQMabwQXRrDomOkIKGn18=' ) self.assertTrue(verify_message(addr1, sig1, msg1)) self.assertTrue(verify_message(addr2, sig2, msg2)) self.assertFalse(verify_message(addr1, b'wrong', msg1)) self.assertFalse(verify_message(addr1, sig2, msg1))
def test_msg_signing(self): msg1 = b'Chancellor on brink of second bailout for banks' msg2 = b'Electrum' def sign_message_with_wif_privkey(wif_privkey, msg): txin_type, privkey, compressed = deserialize_privkey(wif_privkey) key = regenerate_key(privkey) return key.sign_message(msg, compressed) sig1 = sign_message_with_wif_privkey( 'YV56icVrjNioXn9kpZeL3DvtC7aN7kt8tr5ur2wqpMaXeJ3YQirG', msg1) addr1 = 'XJtSNWxWufU5XAh59JfXPx9peodJwTqPqf' sig2 = sign_message_with_wif_privkey( 'YQ6GbE34bXDgMgJEEJ87Buri6MCCcCNZoozpc34ima1PBjKqA8fj', msg2) addr2 = 'XMy7W6qnXjKQzjKCD4JpkNBccMXwqQdGjn' sig1_b64 = base64.b64encode(sig1) sig2_b64 = base64.b64encode(sig2) self.assertEqual( sig1_b64, b'IHYVCxIT0kzepHW6fv7B81XpIoPBx+wG3edTbp30fEyKB9XGhvrGRBXe6lzJIyJYqA9w/htv0Y0nOOliBW16HXM=' ) self.assertEqual( sig2_b64, b'IFeJZNmr/sEwyGXLQJCIOpfhFxRpgBpTD1n4lctVSl0fNThURwCkvayJ+0YXFZEJ7HSDmaKRyzLvPIH5FGLPaAM=' ) self.assertTrue(verify_message(addr1, sig1, msg1)) self.assertTrue(verify_message(addr2, sig2, msg2)) self.assertFalse(verify_message(addr1, b'wrong', msg1)) self.assertFalse(verify_message(addr1, sig2, msg1))
def test_msg_signing(self): msg1 = b'Chancellor on brink of second bailout for banks' msg2 = b'Electrum' def sign_message_with_wif_privkey(wif_privkey, msg): txin_type, privkey, compressed = deserialize_privkey(wif_privkey) key = regenerate_key(privkey) return key.sign_message(msg, compressed) sig1 = sign_message_with_wif_privkey( 'UtFcmicZso95prHnGctZhDHxvfus97YUvDqABmPVkuaggPrP4Ux3', msg1) addr1 = 'RDyRYAmWNSLL5miGLQeEZYeixR9ovN7Swb' sig2 = sign_message_with_wif_privkey( '7JbSf6zMYSJ5BrxLYnbqo1ZubFvwLWGSJFoDW5Jc7PtT6GeoLWr', msg2) addr2 = 'RQfUZyRR52xM377ArEsi7ysWhk3pH1ruEw' sig1_b64 = base64.b64encode(sig1) sig2_b64 = base64.b64encode(sig2) print('sig1_b64', sig1_b64) print('sig2_b64', sig2_b64) self.assertEqual( sig1_b64, b'IAcowIh4U6j342ioNfu/jH4OCcy+qtLp9O6P3aoFVk5NbC+UpsCDhBYwlg2R7gsw18TV1QKjDX7JkWaYb9pGdGo=' ) self.assertEqual( sig2_b64, b'HIszHegFNJvGYqJYvzSqrBtfc1PdbR1fai93xIZUeXr6coc3XrEmEvjKvcyas2mermVUnaCVox944itoZg3bwt8=' ) self.assertTrue(verify_message(addr1, sig1, msg1)) self.assertTrue(verify_message(addr2, sig2, msg2)) self.assertFalse(verify_message(addr1, b'wrong', msg1)) self.assertFalse(verify_message(addr1, sig2, msg1))
def test_msg_signing(self): msg1 = b'Chancellor on brink of second bailout for banks' msg2 = b'Electrum' def sign_message_with_wif_privkey(wif_privkey, msg): txin_type, privkey, compressed = deserialize_privkey(wif_privkey) key = regenerate_key(privkey) return key.sign_message(msg, compressed) sig1 = sign_message_with_wif_privkey( 'XFXhvJNxgFoHR8W57qCrRzokud8JVot7XHoF92w1cZe5Bh55unMK', msg1) addr1 = 'XfP5HuY7jKkMAhwej7yLKZ1K2VGuPwGCye' sig2 = sign_message_with_wif_privkey( '7qhMUpAsBF7hLzFd44Xq49AJF5nRjmkStUvwQUJx1szezCkAb7s', msg2) addr2 = 'Xr58KiC2RvNN83LZExCoszE6mpAudBqQwK' sig1_b64 = base64.b64encode(sig1) sig2_b64 = base64.b64encode(sig2) self.assertEqual( sig1_b64, b'Hziq9TTbuJcXyg3BC7kkUqxTOqYjHJLix6lTi5cum4plBFq7BwJvCqAba9yD6K/2OKpu9ZuLAktzqaAPzvsdEa0=' ) self.assertEqual( sig2_b64, b'G3G4u7v0VYtbNRxGJ+elKL0udQGIGby47677kKwyaw+xE2Z0xeZnQBSBDpR3Ekr+ycHlCPE3FHSZRN+vL8Nl/x4=' ) self.assertTrue(verify_message(addr1, sig1, msg1)) self.assertTrue(verify_message(addr2, sig2, msg2)) self.assertFalse(verify_message(addr1, b'wrong', msg1)) self.assertFalse(verify_message(addr1, sig2, msg1))
def test_msg_signing(self): msg1 = b'Chancellor on brink of second bailout for banks' msg2 = b'Electrum' def sign_message_with_wif_privkey(wif_privkey, msg): txin_type, privkey, compressed = deserialize_privkey(wif_privkey) key = regenerate_key(privkey) return key.sign_message(msg, compressed) sig1 = sign_message_with_wif_privkey( 'L1TnU2zbNaAqMoVh65Cyvmcjzbrj41Gs9iTLcWbpJCMynXuap6UN', msg1) addr1 = 't1NZqTzJMjwKMcQPxofUEbqRSSotJ7VVJSZ' sig2 = sign_message_with_wif_privkey( '5Hxn5C4SQuiV6e62A1MtZmbSeQyrLFhu5uYks62pU5VBUygK2KD', msg2) addr2 = 't1ZFtVnxGSXwNZjnsKVhiAGeEC8nJPuJDDp' sig1_b64 = base64.b64encode(sig1) sig2_b64 = base64.b64encode(sig2) print('sig1_b64', sig1_b64) print('sig2_b64', sig2_b64) self.assertEqual( sig1_b64, b'H21pkXZ9GzHxUOYwHhQs+qgiIUjBRsDnWgQ3JEIPghHbQRHxZWMu9fQWcHVn5YcjS/paPLS9WxDb2g/+3URFmhE=' ) self.assertEqual( sig2_b64, b'HOs3IQvLuO5wAk/YSS6Ah3Dh7hLk51JQ+c38iMHLk2xifq77AcMM7GNQ3udnMkbLUsICeSRZZqyINFpFQcbArWE=' ) self.assertTrue(verify_message(addr1, sig1, msg1)) self.assertTrue(verify_message(addr2, sig2, msg2)) self.assertFalse(verify_message(addr1, b'wrong', msg1)) self.assertFalse(verify_message(addr1, sig2, msg1))
def test_msg_signing(self): msg1 = b'Chancellor on brink of second bailout for banks' msg2 = b'Electrum' def sign_message_with_wif_privkey(wif_privkey, msg): txin_type, privkey, compressed = deserialize_privkey(wif_privkey) key = regenerate_key(privkey) return key.sign_message(msg, compressed) sig1 = sign_message_with_wif_privkey( 'WWdZ4VaToVDbYYSEMTEPT8LKfT83KiXUi5gbLmCYAAsWn32H3P62', msg1) addr1 = 'Veh4NN3gBRRy5YFDc2JjtveNsxzBkbUht8' sig2 = sign_message_with_wif_privkey( '7fydbevhv7jZftM6XARqHYARfWhqVFY4xHaQBisU3bxiX7cAxjg', msg2) addr2 = 'VqP7QAhat23z2se87rYDTMsAdHtC8m9Kqn' sig1_b64 = base64.b64encode(sig1) sig2_b64 = base64.b64encode(sig2) self.assertEqual( sig1_b64, b'IPmubmx5MRu2LrLg81+R88TxJmS4/6sd+nTIaZkyKEosEnz2rOvvohOFwUM+Kk+hzrJHk+Za6DDDRiB+IUJuRBc=' ) self.assertEqual( sig2_b64, b'HOE5WcZqk8xTnOQ3zOkZ0JO1UbpHlMetC1SmbOJ+k5bSASDY/qLULclUUfuBqFl25KkZMJ+Q7EYWWOpNp2CXPE4=' ) self.assertTrue(verify_message(addr1, sig1, msg1)) self.assertTrue(verify_message(addr2, sig2, msg2)) self.assertFalse(verify_message(addr1, b'wrong', msg1)) self.assertFalse(verify_message(addr1, sig2, msg1))
def test_msg_signing(self): msg1 = b'Chancellor on brink of second bailout for banks' msg2 = b'Electrum' sig1 = sign_message_with_wif_privkey( 'L1TnU2zbNaAqMoVh65Cyvmcjzbrj41Gs9iTLcWbpJCMynXuap6UN', msg1) sig2 = sign_message_with_wif_privkey( 'KzyK8J8eQDLdFtd2Cr2K5w5YFKg6EnAudbGahzMvq5dVSpwyheCa', msg2) sig1_b64 = base64.b64encode(sig1) sig2_b64 = base64.b64encode(sig2) self.assertEqual( sig1_b64, b'H/9jMOnj4MFbH3d7t4yCQ9i7DgZU/VZ278w3+ySv2F4yIsdqjsc5ng3kmN8OZAThgyfCZOQxZCWza9V5XzlVY0Y=' ) self.assertEqual( sig2_b64, b'H/9tRQQ2cB/nv02yj6klatxGnrrDTfslM+0YOoUBHlkvHsAYhx+ldRNAPslSj/VI3nwjP2veNhqqidVlkr7IsFI=' ) self.assertTrue( verify_message('15hETetDmcXm1mM4sEf7U2KXC9hDHFMSzz', sig1, msg1)) self.assertTrue( verify_message('1LcXfWmCJmvqgpFKDBRhjyN3QqzmawmEAj', sig2, msg2))
def test_msg_signing(self): msg1 = b'Chancellor on brink of second bailout for banks' msg2 = b'Electrum' def sign_message_with_wif_privkey(wif_privkey, msg): txin_type, privkey, compressed = deserialize_privkey(wif_privkey) key = regenerate_key(privkey) return key.sign_message(msg, compressed) sig1 = sign_message_with_wif_privkey( 'Rfd29FLmJPm3UrAwuvTNSnLFuXokukh1DkoQWAePpsX7LbvDnUgc', msg1) addr1 = 'GYastr1RxW8Pjcn1Y8jQCZd65wcGVAf8Xb' sig2 = sign_message_with_wif_privkey( 'Rc6WAao84gE1JpEidxxKhD9dMW1f658z4Q1dXz555c1iN92EXGTm', msg2) addr2 = 'GWJCHdaZFn8Jz14n6nbE5f7kcBTR7LDDcX' sig1_b64 = base64.b64encode(sig1) sig2_b64 = base64.b64encode(sig2) self.assertEqual( sig1_b64, b'IOwDHUX63aNqof3nYbrCII1bcj2r/PPCLo0MBTMVUqE5K3S3fFBM4h4Byb7J5X1/Hhn/Q1alyhQU9BePZKK2Hjc=' ) self.assertEqual( sig2_b64, b'H4vdswKgIePJtQ6wP297LylWFQSUSSXFGacXcvxMyUEOf6nmUp41AerLPljMlbsMz2SZEGUOGSJcGpcHOM1Xp6E=' ) self.assertTrue(verify_message(addr1, sig1, msg1)) self.assertTrue(verify_message(addr2, sig2, msg2)) self.assertFalse(verify_message(addr1, b'wrong', msg1)) self.assertFalse(verify_message(addr1, sig2, msg1))
def test_msg_signing(self): msg1 = b'Chancellor on brink of second bailout for banks' msg2 = b'Electrum' def sign_message_with_wif_privkey(wif_privkey, msg): txin_type, privkey, compressed = deserialize_privkey(wif_privkey) key = regenerate_key(privkey) return key.sign_message(msg, compressed) sig1 = sign_message_with_wif_privkey( 'T7J3unHmmx9S8e8Zdi9r98A7wTW386HkxvMbUKEMsAY9JRWfbSe6', msg1) addr1 = 'LPvBisC3rGmpGa3E3NeQk3PHQN4VS237y2' sig2 = sign_message_with_wif_privkey( '6uGWYKbyKLBMa1ysfq9rMANcbtYKY49vrawvaH3rBXooApLq6t2', msg2) addr2 = 'LacEkfqxYsPqDuS8ZCstJUc59gxVm2DQaT' sig1_b64 = base64.b64encode(sig1) sig2_b64 = base64.b64encode(sig2) self.assertEqual(sig1_b64, b'IHGAMaPxjrn3CD19S7J5KAq4xF6mdLznsSL8SrqhNwficUHlK5wSth6/J*Z/pEyo92nkUoA+kL9VJpjLnKJKTmM=') self.assertEqual(sig2_b64, b'G14KtfFZQYjyhz4PUzX/yz8eEC1BFHsaEKZOJGLeTWJoNp/umpi5zPeCvhUcgSoMtAkmw3pATrM2bcDdYi1tqIs=') self.assertTrue(verify_message(addr1, sig1, msg1)) self.assertTrue(verify_message(addr2, sig2, msg2)) self.assertFalse(verify_message(addr1, b'wrong', msg1)) self.assertFalse(verify_message(addr1, sig2, msg1))
def test_msg_signing(self): msg1 = b'Chancellor on brink of second bailout for banks' msg2 = b'Electrum' def sign_message_with_wif_privkey(wif_privkey, msg): txin_type, privkey, compressed = deserialize_privkey(wif_privkey) key = regenerate_key(privkey) return key.sign_message(msg, compressed) sig1 = sign_message_with_wif_privkey( 'N5acUJ3Bpizm13gSq8jV5CwZUgfrjs53RuBASsT9AtuwjAgetARW', msg1) addr1 = '6iRgFB4Fi922TqJHD7KaFn8Y1DJRHNy9BL' sig2 = sign_message_with_wif_privkey( '5mBCYSLtLsBez8Dtr83svFzHU1buS7WA6rYGHBfNPFacPfYWwuT', msg2) addr2 = '6u7jGyiAQje3RAhBiwZ3pDMKkYCRXuLu76' sig1_b64 = base64.b64encode(sig1) sig2_b64 = base64.b64encode(sig2) self.assertEqual( sig1_b64, b'IMJ177QE+PonT9RcqHL5/aFjo635kMmE6sDi9PAtvqm1PaqCVU16L0Mb3d64z7nNnrDpVWa+2UqaQ1r2oqEkgsE=' ) self.assertEqual( sig2_b64, b'HOrxiXh8D4ddJSG2x3oV7OVYSOC45DuLst/uS+G3tc70OZyuqet67q1r+7fKDXEBkhTSXbt+gl+iC7/okXLXYec=' ) self.assertTrue(verify_message(addr1, sig1, msg1)) self.assertTrue(verify_message(addr2, sig2, msg2)) self.assertFalse(verify_message(addr1, b'wrong', msg1)) self.assertFalse(verify_message(addr1, sig2, msg1))
def test_create_and_sign(self): collateral_pub = '038ae57bd0fa5b45640e771614ec571c7326a2266c78bb444f1971c85188411ba1' # XahPxwmCuKjPq69hzVxP18V1eASwDWbUrn delegate_pub = '02526201c87c1b4630aabbd04572eec3e2545e442503e57e60880fafcc1f684dbc' # Xx2nSdhaT7c9SREKBPAgzpkhu518XFgkgh protocol_version = 70103 ip = '0.0.0.0' port = 20000 addr = NetworkAddress(ip=ip, port=port) vin = { 'prevout_hash': '00' * 32, 'prevout_n': 0, 'scriptSig': '', 'sequence': 0xffffffff } last_ping = MasternodePing(vin=vin, block_hash='ff' * 32) announce = MasternodeAnnounce(vin=vin, addr=addr, collateral_key=collateral_pub, delegate_key=delegate_pub, protocol_version=protocol_version, last_ping=last_ping) collateral_wif = 'XJqCcyfnLYK4Y7ZDVjLrgPnsrq2cWMF6MX9cyhKgfMajwqrCwZaS' delegate_wif = 'XCbhXBc2N9q8kxqBF41rSuLWVpVVbDm7P1oPv9GxcrS9QXYBWZkB' announce.last_ping.sign(delegate_wif, bfh(delegate_pub), 1461858375) sig = announce.sign(collateral_wif, 1461858375) address = 'XahPxwmCuKjPq69hzVxP18V1eASwDWbUrn' self.assertTrue(announce.verify(address)) self.assertTrue( bitcoin.verify_message(address, sig, announce.serialize_for_sig()))
def test_create_and_sign(self): collateral_pub = '02c59b76fabcfc146c75365da6475f33d8fa596ef76b4b301d66da74180c429c78' # XJtSNWxWufU5XAh59JfXPx9peodJwTqPqf delegate_pub = '03fa334250ddb2a51b30b31a98922a5e1c107042a482b68fc74999c6962ae3276e' # XMy7W6qnXjKQzjKCD4JpkNBccMXwqQdGjn protocol_version = 70103 ip = '0.0.0.0' port = 20000 addr = NetworkAddress(ip=ip, port=port) vin = { 'prevout_hash': '00' * 32, 'prevout_n': 0, 'scriptSig': '', 'sequence': 0xffffffff } last_ping = MasternodePing(vin=vin, block_hash='ff' * 32) announce = MasternodeAnnounce(vin=vin, addr=addr, collateral_key=collateral_pub, delegate_key=delegate_pub, protocol_version=protocol_version, last_ping=last_ping) collateral_wif = 'YV56icVrjNioXn9kpZeL3DvtC7aN7kt8tr5ur2wqpMaXeJ3YQirG' delegate_wif = 'YQ6GbE34bXDgMgJEEJ87Buri6MCCcCNZoozpc34ima1PBjKqA8fj' announce.last_ping.sign(delegate_wif, bfh(delegate_pub), 1461858375) sig = announce.sign(collateral_wif, 1461858375) address = 'XJtSNWxWufU5XAh59JfXPx9peodJwTqPqf' self.assertTrue(announce.verify(address)) self.assertTrue( bitcoin.verify_message(address, sig, announce.serialize_for_sig()))
def verify_json(self, json_data): data = json_data try: _ = data['task_data_signed'] signature = bytes(data['task_data_signed'].encode('utf8')) decoded_sign = base64.b64decode(signature) temporary_json = json.loads(data['task_data']) owner_public_key = temporary_json['task_owner'] add = address_generator.address_from_public(bytes(owner_public_key.encode('utf8')), VERSION_BYTE) encoded_address = address_generator.base58_check_encoding(add) json_string = json.dumps(data['task_data']) result = bitcoin.verify_message(encoded_address, decoded_sign, bytes(data['task_data'].encode('utf8'))) if not result: print( "Sign not valid") raise APIError(1, 'Signature is not valid') return result if temporary_json['task_type'].lower() == 'request': json_result = self.verify_request(temporary_json) elif temporary_json['task_type'].lower() == 'offer': json_result = self.verify_offer(temporary_json) else: return False, 0 if not json_result: return False, 0 result = temporary_json # print(result, temporary_json['task_type'].lower()) return result, 0 except KeyError: signature = bytes(data['message_data_signed'].encode('utf8')) decoded_sign = base64.b64decode(signature) temporary_json = json.loads(data['message_data']) if not self.verify_message(temporary_json): print(temporary_json) return False, 1 public_key = temporary_json['public_key'] add = address_generator.address_from_public(bytes(public_key.encode('utf8')), VERSION_BYTE) encoded_address = address_generator.base58_check_encoding(add) json_string = json.dumps(data['message_data']) result = bitcoin.verify_message(encoded_address, decoded_sign, bytes(data['message_data'].encode('utf8'))) if not result: print( "Sign not valid") raise APIError(1, 'Signature is not valid') return result, 1 return temporary_json, 1
def test_sign(self): vin = {'prevout_hash': '00'*32, 'prevout_n': 0, 'scriptSig': '', 'sequence':0xffffffff} block_hash = 'ff'*32 current_time = 1461858375 ping = MasternodePing(vin=vin, block_hash=block_hash, sig_time=current_time) expected_sig = 'H6k0M7G15GLnJ7i7Zcs8uCHcVRsn1P0hKK4lVMkgY4byaOvUECCsfxA9ktUiFT8scfFYYb/sxkcD8ifU/SEnBUg=' wif = 'XCbhXBc2N9q8kxqBF41rSuLWVpVVbDm7P1oPv9GxcrS9QXYBWZkB' sig = ping.sign(wif, current_time = current_time) address = bitcoin.address_from_private_key(wif) self.assertTrue(bitcoin.verify_message(address, sig, ping.serialize_for_sig())) self.assertEqual(expected_sig, base64.b64encode(sig))
def test_sign(self): vin = { 'prevout_hash': '00' * 32, 'prevout_n': 0, 'scriptSig': '', 'sequence': 0xffffffff } block_hash = 'ff' * 32 current_time = 1461858375 ping = MasternodePing(vin=vin, block_hash=block_hash, sig_time=current_time) expected_sig = 'H0Vh6xI0by9A1OcghrUz2vFxDPbLwyO63L45p7sNTo7QR/TvzTu9tMUlP4QBSl2KVLusoDvDkiyk+BZu3mMqJU4=' wif = 'YV56icVrjNioXn9kpZeL3DvtC7aN7kt8tr5ur2wqpMaXeJ3YQirG' sig = ping.sign(wif, current_time=current_time) address = bitcoin.address_from_private_key(wif) self.assertTrue( bitcoin.verify_message(address, sig, ping.serialize_for_sig())) self.assertEqual(expected_sig, base64.b64encode(sig).decode('utf-8'))
def test_msg_signing(self): msg1 = b'wakiyama tamami chan' msg2 = b'tottemo kawaii' msg3 = b'yone' msg4 = b'watanabe thanks' def sign_message_with_wif_privkey(wif_privkey, msg): txin_type, privkey, compressed = deserialize_privkey(wif_privkey) key = regenerate_key(privkey) return key.sign_message(msg, compressed) def sign_message_with_wif_privkey_old(wif_privkey, msg): txin_type, privkey, compressed = deserialize_privkey_old( wif_privkey) key = regenerate_key(privkey) return key.sign_message(msg, compressed) sig1 = sign_message_with_wif_privkey( 'T8UqLXgii9iBbQAoypL8Yz7Zta7w8QTt2qq66ViLSGXGQCGbo7rv', msg1) addr1 = 'MRHx4jW2KAQeEDMuK7pGLUGWvPRQT1Epmj' sig2 = sign_message_with_wif_privkey( 'T3o9vVd82bASRouYDpSHo2KyFR82LB7FezpZAFDpLcbNd7AGuEJQ', msg2) addr2 = 'MLBCmvG4A7AqCD6MMYjf7YdV96YK5teZ5N' sig3 = sign_message_with_wif_privkey_old( 'TM3TwXiEnEmKs64zCvXw2Jr9mkwgUgxNSvGyVC2nTYQMn2LcxM5C', msg3) addr3 = 'MEexKwbCkfepLkRPi6EfWReurzxL9eBvkU' sig4 = sign_message_with_wif_privkey_old( 'TPNSUD1m5JUFLRKZ5agm5H9JVACJDEPxwS1fYjiHB6khvvbefUR5', msg4) addr4 = 'MNUye8sS7A5yeZVfgZD3XUwwcBgX9f27AS' sig1_b64 = base64.b64encode(sig1) sig2_b64 = base64.b64encode(sig2) sig3_b64 = base64.b64encode(sig3) sig4_b64 = base64.b64encode(sig4) self.assertEqual( sig1_b64, b'IDldTozCVViZ/m/gzvSf6EmZZ3ItDdM+RsI4PAxZdsb6ZQUmv3IgaJK+U4naOExaoTIVn0IY3Hoky0MWFAO6ac4=' ) self.assertEqual( sig2_b64, b'IOr6v1UPcFEoeon11dPNo+TbbLuAu8k8ccG527zmmDf/a26W6z+yAbsfTt01PKF7/UGhwJeCwybdnRXpPC2x4Hk=' ) self.assertEqual( sig3_b64, b'IIr2gW2LrTNJV4EAm6PuBXzvZBv3PbumrJNJQIf96ofxLrylCQftFeZ/Y3070dW+GcEmLXxau6/sVQb0hcGX2MY=' ) self.assertEqual( sig4_b64, b'H7WvBRrEqce85Kf56MtNZOoC3BcDR9mCqSL90Kt4swy0G4nbglT+CcKqojubEALUOJLY3ntm+hCbhD5rKzpyKCw=' ) self.assertTrue(verify_message(addr1, sig1, msg1)) self.assertTrue(verify_message(addr2, sig2, msg2)) self.assertTrue(verify_message(addr3, sig3, msg3)) self.assertTrue(verify_message(addr4, sig4, msg4)) self.assertFalse(verify_message(addr1, b'wrong', msg1)) self.assertFalse(verify_message(addr1, sig2, msg1)) self.assertFalse(verify_message(addr3, b'wrong', msg3)) self.assertFalse(verify_message(addr3, sig4, msg3))
class Taskhive(object): def __init__(self): self.api = '' self.run_bm = '' self.bitmessage_dict = {} self.db = DatabaseConnection() def find_running_bitmessage_port(self): self.bitmessage_dict = {} for process in psutil.process_iter(): process_name = process.name() process_path = None if sys.platform.startswith('win'): if 'python' in process_name: for each in process.cmdline(): if 'bitmessagemain' in each: self.bitmessage_dict[process.pid] = {} process_path = each else: print(process_name) if 'bitmessagemain.' in process_name: for each in process.cmdline(): if 'bitmessagemain.' in each: self.bitmessage_dict[process.pid] = {} process_path = each if process_path is not None: keysfile = os.path.join(os.path.dirname(process_path), 'keys.dat') if os.path.isfile(keysfile): CONFIG.read(keysfile) else: keysfile = os.path.join(self.lookup_appdata_folder(), 'keys.dat') if os.path.isfile(keysfile): CONFIG.read(keysfile) else: print("Can't find keysfile?") break try: bitmessage_port = CONFIG.getint('bitmessagesettings', 'port') except configparser.NoOptionError: print('port is missing from', keysfile) except configparser.NoSectionError: print('bitmessagesettings section is missing from', keysfile) try: bitmessage_apiport = CONFIG.getint('bitmessagesettings', 'apiport') except configparser.NoOptionError: print('apiport is missing from', keysfile) except configparser.NoSectionError: print('bitmessagesettings section is missing from', keysfile) self.bitmessage_dict[process.pid]['file'] = each.replace('.', '') self.bitmessage_dict[process.pid]['port'] = bitmessage_port self.bitmessage_dict[process.pid]['apiport'] = bitmessage_apiport return self.bitmessage_dict def bitmessage_port_picker(self): check_bitmessage_ports = self.find_running_bitmessage_port() port_list = [] apiport_list = [] bitmessage_port = None bitmessage_apiport = None try: for each in check_bitmessage_ports.values(): port_list.append(each['port']) apiport_list.append(each['apiport']) except (AttributeError, KeyError): pass # 17600 - 17650 is set for OnionShare in the Tails OS. # If this is randomized, it won't work. # Thus, won't connect using xmlrpclib. for each in range(8444, 8501): if each not in port_list: bitmessage_port = each break for each in range(17600, 17651): if each not in apiport_list: bitmessage_apiport = each break # This should never happen, because that would mean 66 ports are # being taken up for the Bitmessage port, or 50 for the apiport. # This should be done better, but even psutil isn't giving us # xmlrpc ports in-use. if bitmessage_port is None or bitmessage_apiport is None: return None else: return bitmessage_port, bitmessage_apiport def create_settings(self): bitmessage_port, bitmessage_apiport = self.bitmessage_port_picker() try: CONFIG.add_section('bitmessagesettings') except configparser.DuplicateSectionError: pass CONFIG.set('bitmessagesettings', 'port', str(bitmessage_port)) CONFIG.set('bitmessagesettings', 'settingsversion', '10') CONFIG.set('bitmessagesettings', 'apiport', str(bitmessage_apiport)) CONFIG.set('bitmessagesettings', 'apiinterface', 'localhost') CONFIG.set('bitmessagesettings', 'apiusername', ''.join([SECURE_RANDOM.choice(CHARACTERS) for x in range(RANDOM_INT)])) CONFIG.set('bitmessagesettings', 'apipassword', ''.join([SECURE_RANDOM.choice(CHARACTERS) for x in range(RANDOM_INT)])) CONFIG.set('bitmessagesettings', 'apienabled', 'True') CONFIG.set('bitmessagesettings', 'daemon', 'True') CONFIG.set('bitmessagesettings', 'timeformat', '%%c') CONFIG.set('bitmessagesettings', 'blackwhitelist', 'black') CONFIG.set('bitmessagesettings', 'startonlogon', 'False') CONFIG.set('bitmessagesettings', 'minimizetotray', 'False') CONFIG.set('bitmessagesettings', 'showtraynotifications', 'True') CONFIG.set('bitmessagesettings', 'startintray', 'False') CONFIG.set('bitmessagesettings', 'socksproxytype', '') CONFIG.set('bitmessagesettings', 'sockshostname', '') CONFIG.set('bitmessagesettings', 'socksport', '') CONFIG.set('bitmessagesettings', 'socksauthentication', 'False') CONFIG.set('bitmessagesettings', 'sockslisten', 'False') CONFIG.set('bitmessagesettings', 'socksusername', '') CONFIG.set('bitmessagesettings', 'sockspassword', '') CONFIG.set('bitmessagesettings', 'smtpdeliver', '') # https://www.reddit.com/r/bitmessage/comments/5vt3la/sha1_and_bitmessage/deev8je/ CONFIG.set('bitmessagesettings', 'digestalg', 'sha256') CONFIG.set('bitmessagesettings', 'keysencrypted', 'False') CONFIG.set('bitmessagesettings', 'messagesencrypted', 'False') CONFIG.set('bitmessagesettings', 'defaultnoncetrialsperbyte', '1000') CONFIG.set('bitmessagesettings', 'defaultpayloadlengthextrabytes', '1000') CONFIG.set('bitmessagesettings', 'minimizeonclose', 'False') CONFIG.set('bitmessagesettings', 'maxacceptablenoncetrialsperbyte', '20000000000') CONFIG.set('bitmessagesettings', 'maxacceptablepayloadlengthextrabytes', '20000000000') CONFIG.set('bitmessagesettings', 'userlocale', 'system') CONFIG.set('bitmessagesettings', 'useidenticons', 'False') CONFIG.set('bitmessagesettings', 'identiconsuffix', '') CONFIG.set('bitmessagesettings', 'replybelow', 'False') CONFIG.set('bitmessagesettings', 'maxdownloadrate', '0') CONFIG.set('bitmessagesettings', 'maxuploadrate', '0') CONFIG.set('bitmessagesettings', 'maxoutboundconnections', '8') CONFIG.set('bitmessagesettings', 'ttl', '367200') CONFIG.set('bitmessagesettings', 'stopresendingafterxdays', '') CONFIG.set('bitmessagesettings', 'stopresendingafterxmonths', '') CONFIG.set('bitmessagesettings', 'namecoinrpctype', 'namecoind') CONFIG.set('bitmessagesettings', 'namecoinrpchost', 'localhost') CONFIG.set('bitmessagesettings', 'namecoinrpcuser', '') CONFIG.set('bitmessagesettings', 'namecoinrpcpassword', '') CONFIG.set('bitmessagesettings', 'namecoinrpcport', '') CONFIG.set('bitmessagesettings', 'sendoutgoingconnections', 'True') CONFIG.set('bitmessagesettings', 'onionhostname', '') CONFIG.set('bitmessagesettings', 'onionbindip', '') CONFIG.set('bitmessagesettings', 'onionport', '') CONFIG.set('bitmessagesettings', 'hidetrayconnectionnotifications', 'False') CONFIG.set('bitmessagesettings', 'trayonclose', 'False') CONFIG.set('bitmessagesettings', 'willinglysendtomobile', 'False') CONFIG.set('bitmessagesettings', 'opencl', 'None') with open(KEYS_FILE, 'w') as configfile: CONFIG.write(configfile) # def set_proxy_hostname(self, hostname): # CONFIG.read(KEY_FILE) # try: # ipaddress.ip_address(hostname) # except ValueError: # return 'invalid hostname' # else: # CONFIG.set('bitmessagesettings', 'sockshostname', hostname) # with open(KEYS_FILE, 'wb') as configfile: # CONFIG.write(configfile) # def set_proxy_type(self, proxy): # proxy_types = {'none': 'none', 'socks4a': 'SOCKS4a', 'socks5': 'SOCKS5'} # if proxy in proxy_types: # CONFIG.set('bitmessagesettings', 'socksproxytype', proxy) # with open(KEYS_FILE, 'wb') as configfile: # CONFIG.write(configfile) def verify_settings(self, keyfile): CONFIG.read(keyfile) missing_options = [] extra_options = [] incorrect_options = [] if 'bitmessagesettings' in CONFIG.sections(): bitmessagesettings = CONFIG.options('bitmessagesettings') for each in EXPECTED_SETTINGS: if each in bitmessagesettings: pass else: missing_options.append(each) for each in bitmessagesettings: if each in EXPECTED_SETTINGS: pass else: extra_options.append(each) if len(missing_options) >= 1 or len(extra_options) >= 1: return missing_options, extra_options else: return True else: return 'bitmessagesettings section missing' def keys_file_exists(self, keyfile): if os.path.isfile(keyfile): return True else: return False def create_bitmessage_api(self): key_file_existence = self.keys_file_exists(KEYS_FILE) verifying_settings = self.verify_settings(KEYS_FILE) if key_file_existence is True: if verifying_settings is True: api_username = CONFIG.get('bitmessagesettings', 'apiusername') api_password = CONFIG.get('bitmessagesettings', 'apipassword') api_interface = CONFIG.get('bitmessagesettings', 'apiinterface') api_port = CONFIG.getint('bitmessagesettings', 'apiport') api_info = 'http://{0}:{1}@{2}:{3}/'.format(api_username, api_password, api_interface, api_port) self.api = xmlrpc.client.ServerProxy(api_info) else: return 'invalid keys_file settings' else: return 'keyfile does not exist' def generate_and_store_keys(self): private_key = address_generator.generate_key() public_key = address_generator.private_to_public(private_key) address = address_generator.address_from_public(public_key, VERSION_BYTE) address_encoded = address_generator.base58_check_encoding(address) self.keys_file_exists(KEYS_FILE) self.verify_settings(KEYS_FILE) if 'taskhivekeys' not in CONFIG.sections(): CONFIG.add_section('taskhivekeys') CONFIG.set('taskhivekeys', 'private', private_key) CONFIG.set('taskhivekeys', 'public', public_key) CONFIG.set('taskhivekeys', 'address', address) CONFIG.set('taskhivekeys', 'address_encoded', address_encoded) with open(KEYS_FILE, 'w') as configfile: CONFIG.write(configfile) return private_key, public_key, address, address_encoded def create_reputation_channel(self, public_key): bitmessage_add = self.create_chan("reputation_{}".format(public_key)) return bitmessage_add def join_reputation_channel(self, bitmessage_add, public_key): return self.join_chan(bitmessage_add, "reputation_{}".format(public_key)) def verify_reputation(self, json_data): # REPUTATION JSON STRUCTURE: # { # "payload": "{ # "task_id": "TASKHIVE-ID", # "message": "User was a really good worker. +1", # "score": 5, # "date": "27/06/2018", # "pub_key": "TASKHIVE-PUB" # }", # "signature": "TASKHIVE-SIGNED-" # } payload = json_data['payload'] if 'task_id' in payload: # check if task_id is valid else: return False if 'message' not in payload: return False if 'score' not in payload: return False if 'date' not in payload: return False signature = bytes(json_data['signature'].encode('utf8')) decoded_sign = base64.b64decode(signature) temporary_json = json.loads(data['payload']) pub_key = temporary_json['pub_key'] add = address_generator.address_from_public(bytes(pub_key.encode('utf8')), VERSION_BYTE) encoded_address = address_generator.base58_check_encoding(add) result = bitcoin.verify_message(encoded_address, decoded_sign, bytes(data['task_data'].encode('utf8'))) if not result: raise APIError(1, 'Signature is not valid') else: return True
def test_msg_signing(self): msg1 = b'wakiyama tamami chan' msg2 = b'tottemo kawaii' msg3 = b'yone' msg4 = b'watanabe thanks' def sign_message_with_wif_privkey(wif_privkey, msg): txin_type, privkey, compressed = deserialize_privkey(wif_privkey) key = regenerate_key(privkey) return key.sign_message(msg, compressed) def sign_message_with_wif_privkey_old(wif_privkey, msg): txin_type, privkey, compressed = deserialize_privkey_old( wif_privkey) key = regenerate_key(privkey) return key.sign_message(msg, compressed) sig1 = sign_message_with_wif_privkey( 'T8UqLXgii9iBbQAoypL8Yz7Zta7w8QTt2qq66ViLSGXGQCGbo7rv', msg1) addr1 = 'MRHx4jW2KAQeEDMuK7pGLUGWvPRQT1Epmj' sig2 = sign_message_with_wif_privkey( 'T3o9vVd82bASRouYDpSHo2KyFR82LB7FezpZAFDpLcbNd7AGuEJQ', msg2) addr2 = 'MLBCmvG4A7AqCD6MMYjf7YdV96YK5teZ5N' sig3 = sign_message_with_wif_privkey_old( 'TM3TwXiEnEmKs64zCvXw2Jr9mkwgUgxNSvGyVC2nTYQMn2LcxM5C', msg3) addr3 = 'MEexKwbCkfepLkRPi6EfWReurzxL9eBvkU' sig4 = sign_message_with_wif_privkey_old( 'TPNSUD1m5JUFLRKZ5agm5H9JVACJDEPxwS1fYjiHB6khvvbefUR5', msg4) addr4 = 'MNUye8sS7A5yeZVfgZD3XUwwcBgX9f27AS' sig1_b64 = base64.b64encode(sig1) sig2_b64 = base64.b64encode(sig2) sig3_b64 = base64.b64encode(sig3) sig4_b64 = base64.b64encode(sig4) self.assertEqual( sig1_b64, b'H6xd6TvFWTozs2RggXrItARkvZ3/7iQijgP5j7+KpiVgP2z1JuGQqkdhaDXyVgtKehTaTamf1/uVa+2uDszWxbE=' ) self.assertEqual( sig2_b64, b'H/9iSTCgZZ1h34cKQ9nhGlb6VLy5vyeha15Zgu+KQQzZa7s/+xV2QXD3Sd9smvptHlFC8VIu52miup7vQ82gD3k=' ) self.assertEqual( sig3_b64, b'H9AgGi/VN4kbi48KFD8UvFlx1x/PxmxZmIzmM5ffK0hDFwxVo9n47elRhfryoUznpkm1bKJA4n0L/t1wRShlBrE=' ) self.assertEqual( sig4_b64, b'IDiwhqCV0wiQ+NyoBArfYoU3gZG+E1BYd0Zq8XZvqlMkXcZcePzbgMnn08h8tpVAXnsvhA0HbvqxKrkzl/gfvB8=' ) self.assertTrue(verify_message(addr1, sig1, msg1)) self.assertTrue(verify_message(addr2, sig2, msg2)) self.assertTrue(verify_message(addr3, sig3, msg3)) self.assertTrue(verify_message(addr4, sig4, msg4)) self.assertFalse(verify_message(addr1, b'wrong', msg1)) self.assertFalse(verify_message(addr1, sig2, msg1)) self.assertFalse(verify_message(addr3, b'wrong', msg3)) self.assertFalse(verify_message(addr3, sig4, msg3))
def test_msg_signing(self): msg1 = b'a new decentralised, open source, community driven digital currency, focusing on e-commerce utility' msg2 = b'squbs' msg3 = b'Lyra2 is simple tunable password hashing scheme' msg4 = b'straks skarts' def sign_message_with_wif_privkey(wif_privkey, msg): txin_type, privkey, compressed = deserialize_privkey(wif_privkey) key = regenerate_key(privkey) return key.sign_message(msg, compressed) def sign_message_with_wif_privkey_old(wif_privkey, msg): txin_type, privkey, compressed = deserialize_privkey_old( wif_privkey) key = regenerate_key(privkey) return key.sign_message(msg, compressed) sig1 = sign_message_with_wif_privkey( 'XH1ec7RMJjuwbxWV8pG96ia8A1LC518enVmijprQpZLYd3KRbu9x', msg1) addr1 = 'SSv2WFzmWDeaaQm6N7mA7bVwvqc1wJRW57' sig2 = sign_message_with_wif_privkey( 'XFkeZXtrRmi3iRgrRaQwjXJiTYCJJYY5mKWz6P6M6TsaTRPALu58', msg2) addr2 = 'SVa1dihVh7sukfedLmmKaeVtZo3aT9srro' sig3 = sign_message_with_wif_privkey( 'XD3jeaFmaFNv1cMEYSQJk7opiQ1PqecPEygBvV6hgvCCFGPypCtj', msg3) addr3 = 'SWTbYdYvzFGNiAz99X74EPUig7ngeF5KG8' sig4 = sign_message_with_wif_privkey( 'XDXTzRWANBsMrxySeeDNKnNmgKkh8xn3gLr35uG2z7RjPJCMcqKP', msg4) addr4 = 'SV7JUKvDaPSfzSYB6iA6jXvoAF7NsJbx86' sig1_b64 = base64.b64encode(sig1) sig2_b64 = base64.b64encode(sig2) sig3_b64 = base64.b64encode(sig3) sig4_b64 = base64.b64encode(sig4) self.assertEqual( sig1_b64, b'HzGt4Bjzehb8uGH0YFreY4Zzcf7iP1X7mQSmkUg0yEU5MaaVwTuwBOvKGfrH2wSqAYu18F3Gqd9v4Pe+Tr1HWFo=' ) self.assertEqual( sig2_b64, b'IHmlIX9idOJY9L2M2+sqd3saTyXx/07CT7dGj2aqqxeSDlfVKrDkQtT0Eigd6EIILZYHGOH5H+qlvzDgpPhKNYo=' ) self.assertEqual( sig3_b64, b'INWK6s7uDC8U44HDTpNGuJH7GPYlW6+/6td7C5hZlX2kaZBcTevhTtya4OHwWVVmVAqky33Bxi/0sYTEopZyJ04=' ) self.assertEqual( sig4_b64, b'H8Tsgp9qvTKO1uwe32lhHqTb3b8guDUUO7n5XmSH/GEcMz4xa3q0ZNKGJq8XCQ98FMIKveXwNaHhp6Tc0Pm+o6E=' ) self.assertTrue(verify_message(addr1, sig1, msg1)) self.assertTrue(verify_message(addr2, sig2, msg2)) self.assertTrue(verify_message(addr3, sig3, msg3)) self.assertTrue(verify_message(addr4, sig4, msg4)) self.assertFalse(verify_message(addr1, b'wrong', msg1)) self.assertFalse(verify_message(addr1, sig2, msg1)) self.assertFalse(verify_message(addr3, b'wrong', msg3)) self.assertFalse(verify_message(addr3, sig4, msg3))