1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2024-12-23 14:58:09 +00:00

stellar: init; get public key

This commit is contained in:
Tomas Susanka 2018-05-11 15:31:53 +02:00
parent dca61a4c7f
commit 4cfcfb4ff4
5 changed files with 103 additions and 0 deletions

View File

@ -43,3 +43,8 @@ def derive_node_without_passphrase(
node = bip32.from_seed(seed, curve_name) node = bip32.from_seed(seed, curve_name)
node.derive_path(path) node.derive_path(path)
return node return node
def remove_ed25519_public_key_prefix(pubkey: bytes) -> bytes:
# 0x01 prefix is not part of the actual public key, hence removed
return pubkey[1:]

View File

@ -0,0 +1,11 @@
# Stellar
MAINTAINER = Tomas Susanka <tomas.susanka@satoshilabs.com>
AUTHOR = Tomas Susanka <tomas.susanka@satoshilabs.com>
REVIEWER = Jan Pochyla <jan.pochyla@satoshilabs.com>
-----
TODO

View File

@ -0,0 +1,11 @@
from trezor.wire import register, protobuf_workflow
from trezor.messages.wire_types import StellarGetPublicKey
def dispatch_StellarGetPublicKey(*args, **kwargs):
from .get_public_key import get_public_key
return get_public_key(*args, **kwargs)
def boot():
register(StellarGetPublicKey, protobuf_workflow, dispatch_StellarGetPublicKey)

View File

@ -0,0 +1,74 @@
from apps.common import seed
from apps.common.confirm import confirm
from trezor import ui
from trezor.messages.StellarPublicKey import StellarPublicKey
from trezor.messages.StellarGetPublicKey import StellarGetPublicKey
from trezor.messages import ButtonRequestType
from trezor.ui.text import Text
from trezor.utils import chunks
from trezor.crypto import base32
import ustruct
STELLAR_CURVE = 'ed25519'
async def get_public_key(ctx, msg: StellarGetPublicKey):
node = await seed.derive_node(ctx, msg.address_n, STELLAR_CURVE)
pubkey = seed.remove_ed25519_public_key_prefix(node.public_key()) # todo better?
while True:
if await _show(ctx, _address_from_public_key(pubkey)):
break
return StellarPublicKey(public_key=pubkey)
async def _show(ctx, address: str):
lines = _split_address(address)
content = Text('Export Stellar ID', ui.ICON_RECEIVE,
ui.NORMAL, 'Share public account ID?',
ui.MONO, *lines,
icon_color=ui.GREEN)
return await confirm(
ctx,
content,
code=ButtonRequestType.Address,
cancel_style=ui.BTN_KEY)
def _split_address(address: str):
return chunks(address, 17)
def _address_from_public_key(pubkey: bytes):
"""Returns the base32-encoded version of public key bytes (G...)"""
address = bytearray()
address.append(6 << 3) # version -> 'G'
address.extend(pubkey)
address.extend(ustruct.pack("<H", _crc16_checksum(address))) # checksum
print(base32.encode(address))
return base32.encode(address)
def _crc16_checksum(data: bytearray):
"""Returns the CRC-16 checksum of bytearray bytes
Ported from Java implementation at: http://introcs.cs.princeton.edu/java/61data/CRC16CCITT.java.html
Initial value changed to 0x0000 to match Stellar configuration.
"""
crc = 0x0000
polynomial = 0x1021
for byte in data:
for i in range(8):
bit = ((byte >> (7 - i) & 1) == 1)
c15 = ((crc >> 15 & 1) == 1)
crc <<= 1
if c15 ^ bit:
crc ^= polynomial
return crc & 0xffff

View File

@ -15,6 +15,7 @@ import apps.wallet
import apps.ethereum import apps.ethereum
import apps.lisk import apps.lisk
import apps.nem import apps.nem
import apps.stellar
if __debug__: if __debug__:
import apps.debug import apps.debug
@ -28,6 +29,7 @@ apps.wallet.boot()
apps.ethereum.boot() apps.ethereum.boot()
apps.lisk.boot() apps.lisk.boot()
apps.nem.boot() apps.nem.boot()
apps.stellar.boot()
if __debug__: if __debug__:
apps.debug.boot() apps.debug.boot()
else: else: