parent
e47aa9f0c4
commit
d6593e710b
@ -0,0 +1,34 @@
|
||||
from trezor.utils import unimport
|
||||
|
||||
|
||||
def message_digest(message):
|
||||
from apps.wallet.sign_tx.signing import write_varint
|
||||
from trezor.crypto.hashlib import sha3_256
|
||||
from apps.common.hash_writer import HashWriter
|
||||
|
||||
h = HashWriter(sha3_256)
|
||||
signed_message_header = 'Ethereum Signed Message:\n'
|
||||
write_varint(h, len(signed_message_header))
|
||||
h.extend(signed_message_header)
|
||||
write_varint(h, len(message))
|
||||
h.extend(message)
|
||||
|
||||
return h.get_digest(True)
|
||||
|
||||
|
||||
@unimport
|
||||
async def ethereum_sign_message(ctx, msg):
|
||||
from trezor.messages.EthereumMessageSignature import EthereumMessageSignature
|
||||
from trezor.crypto.curve import secp256k1
|
||||
from ..common import seed
|
||||
|
||||
address_n = msg.address_n or ()
|
||||
node = await seed.get_root(ctx)
|
||||
node.derive_path(address_n)
|
||||
|
||||
signature = secp256k1.sign(node.private_key(), message_digest(msg.message), False)
|
||||
|
||||
sig = EthereumMessageSignature()
|
||||
sig.address = node.ethereum_pubkeyhash()
|
||||
sig.signature = signature[1:] + bytearray([signature[0]])
|
||||
return sig
|
@ -0,0 +1,30 @@
|
||||
from trezor.utils import unimport
|
||||
|
||||
|
||||
@unimport
|
||||
async def ethereum_verify_message(ctx, msg):
|
||||
from .sign_message import message_digest
|
||||
from trezor.crypto.curve import secp256k1
|
||||
from trezor.crypto.hashlib import sha3_256
|
||||
from trezor import ui
|
||||
from trezor.messages.Success import Success
|
||||
|
||||
digest = message_digest(msg.message)
|
||||
sig = bytearray([msg.signature[64]]) + msg.signature[:64]
|
||||
pubkey = secp256k1.verify_recover(sig, digest)
|
||||
|
||||
if not pubkey:
|
||||
raise ValueError('Invalid signature')
|
||||
|
||||
pkh = sha3_256(pubkey[1:]).digest(True)[-20:]
|
||||
|
||||
if msg.address != pkh:
|
||||
raise ValueError('Invalid signature')
|
||||
|
||||
ui.display.clear()
|
||||
ui.display.text(10, 30, 'Verifying message',
|
||||
ui.BOLD, ui.LIGHT_GREEN, ui.BG)
|
||||
ui.display.text(10, 60, msg.message, ui.MONO, ui.FG, ui.BG)
|
||||
ui.display.text(10, 80, msg.address, ui.MONO, ui.FG, ui.BG)
|
||||
|
||||
return Success(message='Message verified')
|
@ -1 +0,0 @@
|
||||
.cache/
|
Loading…
Reference in new issue