1import textwrap
2import unittest
3
4from pycoin.symbols.btc import network as BTC
5from pycoin.symbols.xtn import network as XTN
6
7
8def test_against_myself():
9    """
10    Test code that verifies against ourselves only. Useful but not so great.
11    """
12
13    for wif, right_addr in [
14                    ('L4gXBvYrXHo59HLeyem94D9yLpRkURCHmCwQtPuWW9m6o1X8p8sp',
15                     '1LsPb3D1o1Z7CzEt1kv5QVxErfqzXxaZXv'),
16                    ('5KYZdUEo39z3FPrtuX2QbbwGnNP5zTd7yyr2SC1j299sBCnWjss',
17                     '1HZwkjkeaoZfTSaJxDw6aKkxp45agDiEzN'),
18                ]:
19        k = BTC.parse.wif(wif)
20        assert k.address() == right_addr
21
22        vk2 = BTC.parse.address(right_addr)
23        assert vk2.address() == right_addr
24
25        for i in range(1, 30, 10):
26            msg = 'test message %s' % ('A'*i)
27            sig = BTC.msg.sign(k, msg, verbose=1)
28            assert right_addr in sig
29
30            # check parsing works
31            m, a, s = BTC.msg.parse_signed(sig)
32            assert m == msg, m
33            assert a == right_addr, a
34
35            sig2 = BTC.msg.sign(k, msg, verbose=0)
36            assert sig2 in sig, (sig, sig2)
37
38            assert s == sig2, s
39
40            ok = BTC.msg.verify(k, sig2, msg)
41            assert ok
42
43            ok = BTC.msg.verify(k, sig2.encode('ascii'), msg)
44            assert ok
45
46
47def test_msg_parse():
48    """
49        Test against real-world signatures found in the wild.
50    """
51
52    # Output from brainwallet in "multibit" mode.
53    multibit = '''
54
55-----BEGIN BITCOIN SIGNED MESSAGE-----
56This is an example of a signed message.
57-----BEGIN BITCOIN SIGNATURE-----
58Version: Bitcoin-qt (1.0)
59Address: 1HZwkjkeaoZfTSaJxDw6aKkxp45agDiEzN
60
61HCT1esk/TWlF/o9UNzLDANqsPXntkMErf7erIrjH5IBOZP98cNcmWmnW0GpSAi3wbr6CwpUAN4ctNn1T71UBwSc=
62-----END BITCOIN SIGNATURE-----
63
64'''
65    m, a, s = BTC.msg.parse_signed(multibit)
66    assert m == 'This is an example of a signed message.'
67    assert a == '1HZwkjkeaoZfTSaJxDw6aKkxp45agDiEzN'
68    assert s == ('HCT1esk/TWlF/o9UNzLDANqsPXntkMErf7erIrjH5IBOZ'
69                 'P98cNcmWmnW0GpSAi3wbr6CwpUAN4ctNn1T71UBwSc=')
70    ok = BTC.msg.verify(a, s, m)
71    assert ok
72
73    # Sampled from: https://www.bitrated.com/u/Bit2c.txt on Sep 3/2014
74    bit2c = textwrap.dedent(
75        '''
76        Username: Bit2c
77        Public key: 0396267072e597ad5d043db7c73e13af84a77a7212871f1aade607fb0f2f96e1a8
78        Public key address: 15etuU8kwLFCBbCNRsgQTvWgrGWY9829ej
79        URL: https://www.bitrated.com/u/Bit2c
80
81        -----BEGIN BITCOIN SIGNED MESSAGE-----
82        ''' +
83        'We will try to contact both parties to gather information and evidence, and do my '
84        'best to make rightful judgement. Evidence may be submitted to us on'
85        ' https://www.bit2c.co.il/home/contact or in a private message to info@bit2c.co.il'
86        ' or in any agreed way.' + '''
87
88        https://www.bit2c.co.il
89        -----BEGIN SIGNATURE-----
90        15etuU8kwLFCBbCNRsgQTvWgrGWY9829ej
91        H2utKkquLbyEJamGwUfS9J0kKT4uuMTEr2WX2dPU9YImg4LeRpyjBelrqEqfM4QC8pJ+hVlQgZI5IPpLyRNxvK8=
92        -----END BITCOIN SIGNED MESSAGE-----
93        ''')
94    m, a, s = BTC.msg.parse_signed(bit2c)
95    assert a == '15etuU8kwLFCBbCNRsgQTvWgrGWY9829ej'
96    assert s == ('H2utKkquLbyEJamGwUfS9J0kKT4uuMTEr2WX2dPU9YI'
97                 'mg4LeRpyjBelrqEqfM4QC8pJ+hVlQgZI5IPpLyRNxvK8=')
98    ok = BTC.msg.verify(a, s, m)
99    assert ok
100
101    # testnet example
102    # Sampled from: http://testnet.bitrated.com/u/bearbin.txt on Sep 3/2014
103    # NOTE: Testnet3
104    bearbin = textwrap.dedent('''\
105        Username: bearbin
106        Public key: 03fc594c16779054fc5e119c309215c1f40f2ce104b0169cddeb6d20445bd28f67
107        Public key address: n2D9XsQX1mDpFGgYqsfmePTy61LJFQnXQM
108        URL: http://testnet.bitrated.com/u/bearbin
109
110        -----BEGIN BITCOIN SIGNED MESSAGE-----
111        Contact
112        -----------
113
114        bearbin@gmail.com - Email or hangouts (text only).
115
116        /u/bearbin on reddit (slow response, not preferred for use with the service, just for contact).
117
118        Resolution Guidelines:
119        -----------------------------
120
121         * Evidence is needed. (e.g. pictures w/ proof that it's you).
122         * If anybody fails to respond, money goes to the other person after 2 weeks.
123         * Additional terms available on request.
124
125        Pricing
126        ----------
127
128         * 0.7% Min 0.003 Max 0.15
129         * Payment in advance.
130        -----BEGIN SIGNATURE-----
131        n2D9XsQX1mDpFGgYqsfmePTy61LJFQnXQM
132        IEackZgifpBJs3SqQQ6leUwzvakTZgUKTDuCCn6rVMOQgHlIEzWSYZGQu2H+1chvu68uutzt04cGmsHy/kRIaEc=
133        -----END BITCOIN SIGNED MESSAGE-----
134        ''')
135    m, a, s = XTN.msg.parse_signed(bearbin)
136    assert a == 'n2D9XsQX1mDpFGgYqsfmePTy61LJFQnXQM'
137    assert s == ('IEackZgifpBJs3SqQQ6leUwzvakTZgUKTDuCCn6rVMOQgH'
138                 'lIEzWSYZGQu2H+1chvu68uutzt04cGmsHy/kRIaEc=')
139    assert ok
140
141
142if __name__ == "__main__":
143    unittest.main()
144