コード例 #1
0
ファイル: test_bitcoin.py プロジェクト: chrisglass/electrum
    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))
コード例 #2
0
    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))
コード例 #3
0
    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))
コード例 #4
0
    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))
コード例 #5
0
ファイル: test_bitcoin.py プロジェクト: ser/electrum-dash
    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))
コード例 #6
0
    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))
コード例 #7
0
    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))
コード例 #8
0
ファイル: test_bitcoin.py プロジェクト: shaggy34/electrum
    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))
コード例 #9
0
    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))
コード例 #10
0
    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))
コード例 #11
0
    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))
コード例 #12
0
    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()))
コード例 #13
0
    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()))
コード例 #14
0
 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
コード例 #15
0
    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))
コード例 #16
0
    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'))
コード例 #17
0
    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))
コード例 #18
0
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
コード例 #19
0
    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))
コード例 #20
0
    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))