mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-12-16 03:18: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.wire import register, protobuf_workflow
|
||||||
from trezor.messages.wire_types import \
|
from trezor.messages.wire_types import \
|
||||||
LiskGetAddress, LiskSignTx, LiskGetPublicKey
|
LiskGetAddress, LiskSignTx, LiskGetPublicKey, LiskSignMessage, LiskVerifyMessage
|
||||||
|
|
||||||
|
|
||||||
def dispatch_LiskGetAddress(*args, **kwargs):
|
def dispatch_LiskGetAddress(*args, **kwargs):
|
||||||
@ -18,7 +18,19 @@ def dispatch_LiskSignTx(*args, **kwargs):
|
|||||||
return lisk_sign_tx(*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():
|
def boot():
|
||||||
register(LiskGetPublicKey, protobuf_workflow, dispatch_LiskGetPublicKey)
|
register(LiskGetPublicKey, protobuf_workflow, dispatch_LiskGetPublicKey)
|
||||||
register(LiskGetAddress, protobuf_workflow, dispatch_LiskGetAddress)
|
register(LiskGetAddress, protobuf_workflow, dispatch_LiskGetAddress)
|
||||||
|
register(LiskSignMessage, protobuf_workflow, dispatch_LiskSignMessage)
|
||||||
|
register(LiskVerifyMessage, protobuf_workflow, dispatch_LiskVerifyMessage)
|
||||||
register(LiskSignTx, protobuf_workflow, dispatch_LiskSignTx)
|
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
|
LiskAddress = 115
|
||||||
LiskSignTx = 116
|
LiskSignTx = 116
|
||||||
LiskSignedTx = 117
|
LiskSignedTx = 117
|
||||||
|
LiskSignMessage = 118
|
||||||
|
LiskMessageSignature = 119
|
||||||
|
LiskVerifyMessage = 120
|
||||||
LiskGetPublicKey = 121
|
LiskGetPublicKey = 121
|
||||||
LiskPublicKey = 122
|
LiskPublicKey = 122
|
||||||
StellarGetPublicKey = 200
|
StellarGetPublicKey = 200
|
||||||
|
@ -88,6 +88,9 @@ LiskGetAddress = 114
|
|||||||
LiskAddress = 115
|
LiskAddress = 115
|
||||||
LiskSignTx = 116
|
LiskSignTx = 116
|
||||||
LiskSignedTx = 117
|
LiskSignedTx = 117
|
||||||
|
LiskSignMessage = 118
|
||||||
|
LiskMessageSignature = 119
|
||||||
|
LiskVerifyMessage = 120
|
||||||
LiskGetPublicKey = 121
|
LiskGetPublicKey = 121
|
||||||
LiskPublicKey = 122
|
LiskPublicKey = 122
|
||||||
StellarGetPublicKey = 200
|
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