def test_cancel_signature(self):
        # source of testing data
        # https://github.com/binance-chain/javascript-sdk/blob/master/__tests__/fixtures/cancelOrder.json
        json_msg = '{"account_number":"34","chain_id":"Binance-Chain-Nile","data":null,"memo":"","msgs":[{"refid":"BA36F0FAD74D8F41045463E4774F328F4AF779E5-29","sender":"tbnb1hgm0p7khfk85zpz5v0j8wnej3a90w709zzlffd","symbol":"BCHSV.B-10F_BNB"}],"sequence":"33","source":"1"}'
        expected_signature = "d93fb0402b2b30e7ea08e123bb139ad68bf0a1577f38592eb22d11e127f09bbd3380f29b4bf15bdfa973454c5c8ed444f2e256e956fe98cfd21e886a946e21e5"
        public_key = "029729a52e4e3c2b4a4e52aa74033eedaf8ba1df5ab6d1f518fd69e67bbd309b0e"
        private_key = "90335b9d2153ad1a9799a3ccc070bd64b4164e9642ee1dd48053c33f9a3a05e9"

        # Testing data for object creation is decoded from json_msg
        envelope = BinanceSignTx(msg_count=1,
                                 account_number=34,
                                 chain_id="Binance-Chain-Nile",
                                 memo="",
                                 sequence=33,
                                 source=1)
        msg = BinanceCancelMsg(
            refid="BA36F0FAD74D8F41045463E4774F328F4AF779E5-29",
            sender="tbnb1hgm0p7khfk85zpz5v0j8wnej3a90w709zzlffd",
            symbol="BCHSV.B-10F_BNB")

        msg_json = produce_json_for_signing(envelope, msg)

        # check if our json string produced for signing is the same as test vector
        self.assertEqual(msg_json, json_msg)

        # verify signature against public key
        signature = generate_content_signature(msg_json.encode(),
                                               unhexlify(private_key))
        self.assertTrue(
            verify_content_signature(unhexlify(public_key), signature,
                                     json_msg))

        #check if the signed data is the same as test vector
        self.assertEqual(signature, unhexlify(expected_signature))
Exemple #2
0
async def sign_tx(ctx, envelope, keychain):
    # create transaction message -> sign it -> create signature/pubkey message -> serialize all
    if envelope.msg_count > 1:
        raise ValueError("Multiple messages not supported")
    await paths.validate_path(ctx, helpers.validate_full_path, keychain,
                              envelope.address_n, CURVE)

    node = keychain.derive(envelope.address_n)

    tx_req = BinanceTxRequest()

    msg = await ctx.call_any(
        tx_req,
        MessageType.BinanceCancelMsg,
        MessageType.BinanceOrderMsg,
        MessageType.BinanceTransferMsg,
    )

    msg_json = helpers.produce_json_for_signing(envelope, msg)

    if isinstance(msg, BinanceTransferMsg):
        await layout.require_confirm_transfer(ctx, msg)
    elif isinstance(msg, BinanceOrderMsg):
        await layout.require_confirm_order(ctx, msg)
    elif isinstance(msg, BinanceCancelMsg):
        await layout.require_confirm_cancel(ctx, msg)
    else:
        raise ValueError("input message unrecognized, is of type " +
                         type(msg).__name__)

    signature_bytes = generate_content_signature(msg_json.encode(),
                                                 node.private_key())

    return BinanceSignedTx(signature=signature_bytes,
                           public_key=node.public_key())
    def test_cancel_signature(self):
        # source of testing data
        # https://github.com/binance-chain/javascript-sdk/blob/master/__tests__/fixtures/cancelOrder.json
        json_hex_msg = "7b226163636f756e745f6e756d626572223a223334222c22636861696e5f6964223a2242696e616e63652d436861696e2d4e696c65222c2264617461223a6e756c6c2c226d656d6f223a22222c226d736773223a5b7b227265666964223a22424133364630464144373444384634313034353436334534373734463332384634414637373945352d3239222c2273656e646572223a2274626e623168676d3070376b68666b38357a707a3576306a38776e656a33613930773730397a7a6c666664222c2273796d626f6c223a2242434853562e422d3130465f424e42227d5d2c2273657175656e6365223a223333222c22736f75726365223a2231227d"
        expected_signature = "d93fb0402b2b30e7ea08e123bb139ad68bf0a1577f38592eb22d11e127f09bbd3380f29b4bf15bdfa973454c5c8ed444f2e256e956fe98cfd21e886a946e21e5"
        public_key = "029729a52e4e3c2b4a4e52aa74033eedaf8ba1df5ab6d1f518fd69e67bbd309b0e"
        private_key = "90335b9d2153ad1a9799a3ccc070bd64b4164e9642ee1dd48053c33f9a3a05e9"

        # Testing data for object creation is decoded from json_hex_msg
        envelope = BinanceSignTx(msg_count=1,
                                 account_number=34,
                                 chain_id="Binance-Chain-Nile",
                                 memo="",
                                 sequence=33,
                                 source=1)
        msg = BinanceCancelMsg(
            refid="BA36F0FAD74D8F41045463E4774F328F4AF779E5-29",
            sender="tbnb1hgm0p7khfk85zpz5v0j8wnej3a90w709zzlffd",
            symbol="BCHSV.B-10F_BNB")

        msg_json = produce_json_for_signing(envelope, msg)

        #check if our json string produced for signing is the same as test vector
        self.assertEqual(hexlify(msg_json).decode(), json_hex_msg)

        #verify signature against public key
        signature = generate_content_signature(msg_json.encode(),
                                               unhexlify(private_key))
        self.assertTrue(
            verify_content_signature(unhexlify(public_key), signature,
                                     unhexlify(json_hex_msg)))

        #check if the signed data is the same as test vector
        self.assertEqual(signature, unhexlify(expected_signature))
    def test_order_signature(self):
        # source of testing data
        # https://github.com/binance-chain/javascript-sdk/blob/master/__tests__/fixtures/placeOrder.json
        json_msg = '{"account_number":"34","chain_id":"Binance-Chain-Nile","data":null,"memo":"","msgs":[{"id":"BA36F0FAD74D8F41045463E4774F328F4AF779E5-33","ordertype":2,"price":100000000,"quantity":100000000,"sender":"tbnb1hgm0p7khfk85zpz5v0j8wnej3a90w709zzlffd","side":1,"symbol":"ADA.B-B63_BNB","timeinforce":1}],"sequence":"32","source":"1"}'
        expected_signature = "851fc9542342321af63ecbba7d3ece545f2a42bad01ba32cff5535b18e54b6d3106e10b6a4525993d185a1443d9a125186960e028eabfdd8d76cf70a3a7e3100"
        public_key = "029729a52e4e3c2b4a4e52aa74033eedaf8ba1df5ab6d1f518fd69e67bbd309b0e"
        private_key = "90335b9d2153ad1a9799a3ccc070bd64b4164e9642ee1dd48053c33f9a3a05e9"

        # Testing data for object creation is decoded from json_msg
        envelope = BinanceSignTx(msg_count=1,
                                 account_number=34,
                                 chain_id="Binance-Chain-Nile",
                                 memo="",
                                 sequence=32,
                                 source=1)
        msg = BinanceOrderMsg(
            id="BA36F0FAD74D8F41045463E4774F328F4AF779E5-33",
            ordertype=2,
            price=100000000,
            quantity=100000000,
            sender="tbnb1hgm0p7khfk85zpz5v0j8wnej3a90w709zzlffd",
            side=1,
            symbol="ADA.B-B63_BNB",
            timeinforce=1)

        msg_json = produce_json_for_signing(envelope, msg)

        # check if our json string produced for signing is the same as test vector
        self.assertEqual(msg_json, json_msg)

        # verify signature against public key
        signature = generate_content_signature(msg_json.encode(),
                                               unhexlify(private_key))
        self.assertTrue(
            verify_content_signature(unhexlify(public_key), signature,
                                     json_msg))

        # check if the signed data is the same as test vector
        self.assertEqual(signature, unhexlify(expected_signature))
    def test_order_signature(self):
        # source of testing data
        # https://github.com/binance-chain/javascript-sdk/blob/master/__tests__/fixtures/placeOrder.json
        json_hex_msg = "7b226163636f756e745f6e756d626572223a223334222c22636861696e5f6964223a2242696e616e63652d436861696e2d4e696c65222c2264617461223a6e756c6c2c226d656d6f223a22222c226d736773223a5b7b226964223a22424133364630464144373444384634313034353436334534373734463332384634414637373945352d3333222c226f7264657274797065223a322c227072696365223a3130303030303030302c227175616e74697479223a3130303030303030302c2273656e646572223a2274626e623168676d3070376b68666b38357a707a3576306a38776e656a33613930773730397a7a6c666664222c2273696465223a312c2273796d626f6c223a224144412e422d4236335f424e42222c2274696d65696e666f726365223a317d5d2c2273657175656e6365223a223332222c22736f75726365223a2231227d"
        expected_signature = "851fc9542342321af63ecbba7d3ece545f2a42bad01ba32cff5535b18e54b6d3106e10b6a4525993d185a1443d9a125186960e028eabfdd8d76cf70a3a7e3100"
        public_key = "029729a52e4e3c2b4a4e52aa74033eedaf8ba1df5ab6d1f518fd69e67bbd309b0e"
        private_key = "90335b9d2153ad1a9799a3ccc070bd64b4164e9642ee1dd48053c33f9a3a05e9"

        # Testing data for object creation is decoded from json_hex_msg
        envelope = BinanceSignTx(msg_count=1,
                                 account_number=34,
                                 chain_id="Binance-Chain-Nile",
                                 memo="",
                                 sequence=32,
                                 source=1)
        msg = BinanceOrderMsg(
            id="BA36F0FAD74D8F41045463E4774F328F4AF779E5-33",
            ordertype=2,
            price=100000000,
            quantity=100000000,
            sender="tbnb1hgm0p7khfk85zpz5v0j8wnej3a90w709zzlffd",
            side=1,
            symbol="ADA.B-B63_BNB",
            timeinforce=1)

        msg_json = produce_json_for_signing(envelope, msg)

        #check if our json string produced for signing is the same as test vector
        self.assertEqual(hexlify(msg_json).decode(), json_hex_msg)

        #verify signature against public key
        signature = generate_content_signature(msg_json.encode(),
                                               unhexlify(private_key))
        self.assertTrue(
            verify_content_signature(unhexlify(public_key), signature,
                                     unhexlify(json_hex_msg)))

        #check if the signed data is the same as test vector
        self.assertEqual(signature, unhexlify(expected_signature))
    def test_transfer_signature(self):
        # source of testing data
        # https://github.com/binance-chain/javascript-sdk/blob/master/__tests__/fixtures/transfer.json
        json_msg = '{"account_number":"34","chain_id":"Binance-Chain-Nile","data":null,"memo":"test","msgs":[{"inputs":[{"address":"tbnb1hgm0p7khfk85zpz5v0j8wnej3a90w709zzlffd","coins":[{"amount":1000000000,"denom":"BNB"}]}],"outputs":[{"address":"tbnb1ss57e8sa7xnwq030k2ctr775uac9gjzglqhvpy","coins":[{"amount":1000000000,"denom":"BNB"}]}]}],"sequence":"31","source":"1"}'
        expected_signature = "faf5b908d6c4ec0c7e2e7d8f7e1b9ca56ac8b1a22b01655813c62ce89bf84a4c7b14f58ce51e85d64c13f47e67d6a9187b8f79f09e0a9b82019f47ae190a4db3"
        public_key = "029729a52e4e3c2b4a4e52aa74033eedaf8ba1df5ab6d1f518fd69e67bbd309b0e"
        private_key = "90335b9d2153ad1a9799a3ccc070bd64b4164e9642ee1dd48053c33f9a3a05e9"

        # Testing data for object creation is decoded from json_msg
        envelope = BinanceSignTx(msg_count=1,
                                 account_number=34,
                                 chain_id="Binance-Chain-Nile",
                                 memo="test",
                                 sequence=31,
                                 source=1)
        coin = BinanceCoin(denom="BNB", amount=1000000000)
        first_input = BinanceInputOutput(
            address="tbnb1hgm0p7khfk85zpz5v0j8wnej3a90w709zzlffd",
            coins=[coin])
        first_output = BinanceInputOutput(
            address="tbnb1ss57e8sa7xnwq030k2ctr775uac9gjzglqhvpy",
            coins=[coin])
        msg = BinanceTransferMsg(inputs=[first_input], outputs=[first_output])

        msg_json = produce_json_for_signing(envelope, msg)

        # check if our json string produced for signing is the same as test vector
        self.assertEqual(msg_json, json_msg)

        # verify signature against public key
        signature = generate_content_signature(msg_json.encode(),
                                               unhexlify(private_key))
        self.assertTrue(
            verify_content_signature(unhexlify(public_key), signature,
                                     json_msg))

        # check if the signed data is the same as test vector
        self.assertEqual(signature, unhexlify(expected_signature))
    def test_transfer_signature(self):
        # source of testing data
        # https://github.com/binance-chain/javascript-sdk/blob/master/__tests__/fixtures/transfer.json
        json_hex_msg = "7b226163636f756e745f6e756d626572223a223334222c22636861696e5f6964223a2242696e616e63652d436861696e2d4e696c65222c2264617461223a6e756c6c2c226d656d6f223a2274657374222c226d736773223a5b7b22696e70757473223a5b7b2261646472657373223a2274626e623168676d3070376b68666b38357a707a3576306a38776e656a33613930773730397a7a6c666664222c22636f696e73223a5b7b22616d6f756e74223a2231303030303030303030222c2264656e6f6d223a22424e42227d5d7d5d2c226f757470757473223a5b7b2261646472657373223a2274626e6231737335376538736137786e77713033306b3263747237373575616339676a7a676c7168767079222c22636f696e73223a5b7b22616d6f756e74223a2231303030303030303030222c2264656e6f6d223a22424e42227d5d7d5d7d5d2c2273657175656e6365223a223331222c22736f75726365223a2231227d"
        expected_signature = "97b4c2e41b0d0f61ddcf4020fff0ecb227d6df69b3dd7e657b34be0e32b956e22d0c6be5832d25353ae24af0bb223d4a5337320518c4e7708b84c8e05eb6356b"
        public_key = "029729a52e4e3c2b4a4e52aa74033eedaf8ba1df5ab6d1f518fd69e67bbd309b0e"
        private_key = "90335b9d2153ad1a9799a3ccc070bd64b4164e9642ee1dd48053c33f9a3a05e9"

        # Testing data for object creation is decoded from json_hex_msg
        envelope = BinanceSignTx(msg_count=1,
                                 account_number=34,
                                 chain_id="Binance-Chain-Nile",
                                 memo="test",
                                 sequence=31,
                                 source=1)
        coin = BinanceCoin(denom="BNB", amount=1000000000)
        first_input = BinanceInputOutput(
            address="tbnb1hgm0p7khfk85zpz5v0j8wnej3a90w709zzlffd",
            coins=[coin])
        first_output = BinanceInputOutput(
            address="tbnb1ss57e8sa7xnwq030k2ctr775uac9gjzglqhvpy",
            coins=[coin])
        msg = BinanceTransferMsg(inputs=[first_input], outputs=[first_output])

        msg_json = produce_json_for_signing(envelope, msg)

        #check if our json string produced for signing is the same as test vector
        self.assertEqual(hexlify(msg_json).decode(), json_hex_msg)

        #verify signature against public key
        signature = generate_content_signature(msg_json.encode(),
                                               unhexlify(private_key))
        self.assertTrue(
            verify_content_signature(unhexlify(public_key), signature,
                                     unhexlify(json_hex_msg)))

        #check if the signed data is the same as test vector
        self.assertEqual(signature, unhexlify(expected_signature))