mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-12-16 19:38:09 +00:00
Merge pull request #217 from alepop/restore-lisk-sign-verify-message
Lisk sign/verify functionality
This commit is contained in:
commit
f72667c761
@ -1,6 +1,6 @@
|
||||
from trezor.wire import register, protobuf_workflow
|
||||
from trezor.messages.wire_types import \
|
||||
LiskGetAddress, LiskSignTx, LiskGetPublicKey
|
||||
LiskGetAddress, LiskSignTx, LiskGetPublicKey, LiskSignMessage, LiskVerifyMessage
|
||||
|
||||
|
||||
def dispatch_LiskGetAddress(*args, **kwargs):
|
||||
@ -18,7 +18,19 @@ def dispatch_LiskSignTx(*args, **kwargs):
|
||||
return lisk_sign_tx(*args, **kwargs)
|
||||
|
||||
|
||||
def dispatch_LiskSignMessage(*args, **kwargs):
|
||||
from .sign_message import lisk_sign_message
|
||||
return lisk_sign_message(*args, **kwargs)
|
||||
|
||||
|
||||
def dispatch_LiskVerifyMessage(*args, **kwargs):
|
||||
from .verify_message import lisk_verify_message
|
||||
return lisk_verify_message(*args, **kwargs)
|
||||
|
||||
|
||||
def boot():
|
||||
register(LiskGetPublicKey, protobuf_workflow, dispatch_LiskGetPublicKey)
|
||||
register(LiskGetAddress, protobuf_workflow, dispatch_LiskGetAddress)
|
||||
register(LiskSignMessage, protobuf_workflow, dispatch_LiskSignMessage)
|
||||
register(LiskVerifyMessage, protobuf_workflow, dispatch_LiskVerifyMessage)
|
||||
register(LiskSignTx, protobuf_workflow, dispatch_LiskSignTx)
|
||||
|
44
src/apps/lisk/sign_message.py
Normal file
44
src/apps/lisk/sign_message.py
Normal file
@ -0,0 +1,44 @@
|
||||
from apps.common import seed
|
||||
from apps.common.confirm import require_confirm
|
||||
from apps.common.signverify import split_message
|
||||
from apps.wallet.sign_tx.signing import write_varint
|
||||
from trezor import ui
|
||||
from trezor.crypto.curve import ed25519
|
||||
from trezor.crypto.hashlib import sha256
|
||||
from trezor.messages.LiskMessageSignature import LiskMessageSignature
|
||||
from trezor.ui.text import Text
|
||||
from trezor.utils import HashWriter
|
||||
|
||||
from .helpers import LISK_CURVE
|
||||
|
||||
|
||||
def message_digest(message):
|
||||
h = HashWriter(sha256)
|
||||
signed_message_header = 'Lisk Signed Message:\n'
|
||||
write_varint(h, len(signed_message_header))
|
||||
h.extend(signed_message_header)
|
||||
write_varint(h, len(message))
|
||||
h.extend(message)
|
||||
return sha256(h.get_digest()).digest()
|
||||
|
||||
|
||||
async def lisk_sign_message(ctx, msg):
|
||||
message = msg.message
|
||||
address_n = msg.address_n or ()
|
||||
|
||||
await require_confirm_sign_message(ctx, message)
|
||||
|
||||
node = await seed.derive_node(ctx, address_n, LISK_CURVE)
|
||||
seckey = node.private_key()
|
||||
pubkey = node.public_key()
|
||||
pubkey = pubkey[1:] # skip ed25519 pubkey marker
|
||||
|
||||
signature = ed25519.sign(seckey, message_digest(message))
|
||||
|
||||
return LiskMessageSignature(public_key=pubkey, signature=signature)
|
||||
|
||||
|
||||
async def require_confirm_sign_message(ctx, message):
|
||||
message = split_message(message)
|
||||
content = Text('Sign Lisk message', ui.ICON_DEFAULT, max_lines=5, *message)
|
||||
await require_confirm(ctx, content)
|
19
src/apps/lisk/verify_message.py
Normal file
19
src/apps/lisk/verify_message.py
Normal file
@ -0,0 +1,19 @@
|
||||
from apps.wallet.verify_message import require_confirm_verify_message
|
||||
from trezor import wire
|
||||
from trezor.crypto.curve import ed25519
|
||||
from trezor.messages.Success import Success
|
||||
|
||||
from .helpers import get_address_from_public_key
|
||||
from .sign_message import message_digest
|
||||
|
||||
|
||||
async def lisk_verify_message(ctx, msg):
|
||||
digest = message_digest(msg.message)
|
||||
verified = ed25519.verify(msg.public_key, msg.signature, digest)
|
||||
if not verified:
|
||||
raise wire.ProcessError('Invalid signature')
|
||||
|
||||
address = get_address_from_public_key(msg.public_key)
|
||||
await require_confirm_verify_message(ctx, address, msg.message)
|
||||
|
||||
return Success(message='Message verified')
|
18
src/trezor/messages/LiskMessageSignature.py
Normal file
18
src/trezor/messages/LiskMessageSignature.py
Normal file
@ -0,0 +1,18 @@
|
||||
# Automatically generated by pb2py
|
||||
import protobuf as p
|
||||
|
||||
|
||||
class LiskMessageSignature(p.MessageType):
|
||||
MESSAGE_WIRE_TYPE = 119
|
||||
FIELDS = {
|
||||
1: ('public_key', p.BytesType, 0),
|
||||
2: ('signature', p.BytesType, 0),
|
||||
}
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
public_key: bytes = None,
|
||||
signature: bytes = None
|
||||
) -> None:
|
||||
self.public_key = public_key
|
||||
self.signature = signature
|
23
src/trezor/messages/LiskSignMessage.py
Normal file
23
src/trezor/messages/LiskSignMessage.py
Normal file
@ -0,0 +1,23 @@
|
||||
# Automatically generated by pb2py
|
||||
import protobuf as p
|
||||
if __debug__:
|
||||
try:
|
||||
from typing import List
|
||||
except ImportError:
|
||||
List = None
|
||||
|
||||
|
||||
class LiskSignMessage(p.MessageType):
|
||||
MESSAGE_WIRE_TYPE = 118
|
||||
FIELDS = {
|
||||
1: ('address_n', p.UVarintType, p.FLAG_REPEATED),
|
||||
2: ('message', p.BytesType, 0),
|
||||
}
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
address_n: List[int] = None,
|
||||
message: bytes = None
|
||||
) -> None:
|
||||
self.address_n = address_n if address_n is not None else []
|
||||
self.message = message
|
21
src/trezor/messages/LiskVerifyMessage.py
Normal file
21
src/trezor/messages/LiskVerifyMessage.py
Normal file
@ -0,0 +1,21 @@
|
||||
# Automatically generated by pb2py
|
||||
import protobuf as p
|
||||
|
||||
|
||||
class LiskVerifyMessage(p.MessageType):
|
||||
MESSAGE_WIRE_TYPE = 120
|
||||
FIELDS = {
|
||||
1: ('public_key', p.BytesType, 0),
|
||||
2: ('signature', p.BytesType, 0),
|
||||
3: ('message', p.BytesType, 0),
|
||||
}
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
public_key: bytes = None,
|
||||
signature: bytes = None,
|
||||
message: bytes = None
|
||||
) -> None:
|
||||
self.public_key = public_key
|
||||
self.signature = signature
|
||||
self.message = message
|
@ -88,6 +88,9 @@ LiskGetAddress = 114
|
||||
LiskAddress = 115
|
||||
LiskSignTx = 116
|
||||
LiskSignedTx = 117
|
||||
LiskSignMessage = 118
|
||||
LiskMessageSignature = 119
|
||||
LiskVerifyMessage = 120
|
||||
LiskGetPublicKey = 121
|
||||
LiskPublicKey = 122
|
||||
StellarGetPublicKey = 200
|
||||
|
@ -88,6 +88,9 @@ LiskGetAddress = 114
|
||||
LiskAddress = 115
|
||||
LiskSignTx = 116
|
||||
LiskSignedTx = 117
|
||||
LiskSignMessage = 118
|
||||
LiskMessageSignature = 119
|
||||
LiskVerifyMessage = 120
|
||||
LiskGetPublicKey = 121
|
||||
LiskPublicKey = 122
|
||||
StellarGetPublicKey = 200
|
||||
|
2
vendor/trezor-common
vendored
2
vendor/trezor-common
vendored
@ -1 +1 @@
|
||||
Subproject commit 018eebac7e64ed082486d746d78d279fe815c65d
|
||||
Subproject commit babc60a48ec95df8de0ddd11b9d7e24b0e7e1d46
|
Loading…
Reference in New Issue
Block a user