You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
1.9 KiB
64 lines
1.9 KiB
6 years ago
|
from trezor import wire
|
||
6 years ago
|
from trezor.crypto.curve import secp256k1
|
||
6 years ago
|
from trezor.messages.InputScriptType import SPENDADDRESS, SPENDP2SHWITNESS, SPENDWITNESS
|
||
6 years ago
|
from trezor.messages.Success import Success
|
||
6 years ago
|
|
||
4 years ago
|
from .addresses import (
|
||
6 years ago
|
address_p2wpkh,
|
||
|
address_p2wpkh_in_p2sh,
|
||
|
address_pkh,
|
||
|
address_short,
|
||
|
address_to_cashaddr,
|
||
|
)
|
||
6 years ago
|
|
||
4 years ago
|
from apps.common import coins
|
||
|
from apps.common.signverify import message_digest, require_confirm_verify_message
|
||
|
|
||
6 years ago
|
|
||
|
async def verify_message(ctx, msg):
|
||
|
message = msg.message
|
||
|
address = msg.address
|
||
|
signature = msg.signature
|
||
6 years ago
|
coin_name = msg.coin_name or "Bitcoin"
|
||
8 years ago
|
coin = coins.by_name(coin_name)
|
||
|
|
||
6 years ago
|
digest = message_digest(coin, message)
|
||
6 years ago
|
|
||
|
script_type = None
|
||
|
recid = signature[0]
|
||
|
if recid >= 27 and recid <= 34:
|
||
|
script_type = SPENDADDRESS # p2pkh
|
||
|
elif recid >= 35 and recid <= 38:
|
||
|
script_type = SPENDP2SHWITNESS # segwit-in-p2sh
|
||
|
signature = bytes([signature[0] - 4]) + signature[1:]
|
||
|
elif recid >= 39 and recid <= 42:
|
||
|
script_type = SPENDWITNESS # native segwit
|
||
|
signature = bytes([signature[0] - 8]) + signature[1:]
|
||
|
else:
|
||
6 years ago
|
raise wire.ProcessError("Invalid signature")
|
||
6 years ago
|
|
||
6 years ago
|
pubkey = secp256k1.verify_recover(signature, digest)
|
||
8 years ago
|
|
||
|
if not pubkey:
|
||
6 years ago
|
raise wire.ProcessError("Invalid signature")
|
||
8 years ago
|
|
||
6 years ago
|
if script_type == SPENDADDRESS:
|
||
6 years ago
|
addr = address_pkh(pubkey, coin)
|
||
6 years ago
|
if coin.cashaddr_prefix is not None:
|
||
|
addr = address_to_cashaddr(addr, coin)
|
||
6 years ago
|
elif script_type == SPENDP2SHWITNESS:
|
||
6 years ago
|
addr = address_p2wpkh_in_p2sh(pubkey, coin)
|
||
6 years ago
|
elif script_type == SPENDWITNESS:
|
||
6 years ago
|
addr = address_p2wpkh(pubkey, coin)
|
||
6 years ago
|
else:
|
||
6 years ago
|
raise wire.ProcessError("Invalid signature")
|
||
8 years ago
|
|
||
6 years ago
|
if addr != address:
|
||
6 years ago
|
raise wire.ProcessError("Invalid signature")
|
||
8 years ago
|
|
||
4 years ago
|
await require_confirm_verify_message(
|
||
|
ctx, address_short(coin, address), "Verify message", message
|
||
|
)
|
||
6 years ago
|
|
||
6 years ago
|
return Success(message="Message verified")
|