mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-12-27 00:28:10 +00:00
ethereum: implement checksum in ethereum_get_address
This commit is contained in:
parent
69d030a8fa
commit
18fcf826d6
@ -9,8 +9,10 @@ async def layout_ethereum_get_address(ctx, msg):
|
|||||||
from trezor.crypto.hashlib import sha3_256
|
from trezor.crypto.hashlib import sha3_256
|
||||||
from ..common import seed
|
from ..common import seed
|
||||||
|
|
||||||
|
address_n = msg.address_n or ()
|
||||||
|
|
||||||
node = await seed.get_root(ctx)
|
node = await seed.get_root(ctx)
|
||||||
node.derive_path(msg.address_n or ())
|
node.derive_path(address_n)
|
||||||
|
|
||||||
seckey = node.private_key()
|
seckey = node.private_key()
|
||||||
public_key = secp256k1.publickey(seckey, False) # uncompressed
|
public_key = secp256k1.publickey(seckey, False) # uncompressed
|
||||||
@ -18,21 +20,46 @@ async def layout_ethereum_get_address(ctx, msg):
|
|||||||
|
|
||||||
if msg.show_display:
|
if msg.show_display:
|
||||||
await _show_address(ctx, address)
|
await _show_address(ctx, address)
|
||||||
|
|
||||||
return EthereumAddress(address=address)
|
return EthereumAddress(address=address)
|
||||||
|
|
||||||
|
|
||||||
async def _show_address(ctx, address):
|
async def _show_address(ctx, address):
|
||||||
from trezor.messages.ButtonRequestType import Address
|
from trezor.messages.ButtonRequestType import Address
|
||||||
from trezor.ui.text import Text
|
from trezor.ui.text import Text
|
||||||
|
from trezor.ui.qr import Qr
|
||||||
|
from trezor.ui.container import Container
|
||||||
from ..common.confirm import require_confirm
|
from ..common.confirm import require_confirm
|
||||||
|
|
||||||
# TODO: qr code
|
address = _ethereum_address_hex(address)
|
||||||
|
lines = _split_address(address)
|
||||||
content = Text('Confirm address', ui.ICON_RESET,
|
content = Container(
|
||||||
ui.MONO, *_split_address(address))
|
Qr(address, (120, 135), 3),
|
||||||
|
Text('Confirm address', ui.ICON_RESET, ui.MONO, *lines))
|
||||||
await require_confirm(ctx, content, code=Address)
|
await require_confirm(ctx, content, code=Address)
|
||||||
|
|
||||||
|
|
||||||
def _split_address(address):
|
def _split_address(address):
|
||||||
from trezor.utils import chunks
|
from trezor.utils import chunks
|
||||||
return chunks(address, 20)
|
return chunks(address, 21)
|
||||||
|
|
||||||
|
|
||||||
|
def _ethereum_address_hex(address):
|
||||||
|
from ubinascii import hexlify
|
||||||
|
from trezor.crypto.hashlib import sha3_256
|
||||||
|
|
||||||
|
hx = hexlify(address).decode()
|
||||||
|
hs = sha3_256(hx).digest(True)
|
||||||
|
h = ''
|
||||||
|
|
||||||
|
for i in range(20):
|
||||||
|
l = hx[i * 2]
|
||||||
|
if hs[i] & 0x80 and l >= 'a' and l <= 'f':
|
||||||
|
l = l.upper()
|
||||||
|
h += l
|
||||||
|
l = hx[i * 2 + 1]
|
||||||
|
if hs[i] & 0x08 and l >= 'a' and l <= 'f':
|
||||||
|
l = l.upper()
|
||||||
|
h += l
|
||||||
|
|
||||||
|
return '0x' + h
|
||||||
|
Loading…
Reference in New Issue
Block a user