2018-02-27 07:35:21 -08:00
|
|
|
from trezor.crypto import hashlib, hmac, random
|
|
|
|
from apps.common import storage
|
2018-02-24 09:58:02 -08:00
|
|
|
|
2018-02-21 06:04:49 -08:00
|
|
|
memory = {}
|
|
|
|
_seed = None
|
2018-02-24 09:58:02 -08:00
|
|
|
_passphrase = None
|
|
|
|
|
|
|
|
|
2018-02-28 15:07:45 -08:00
|
|
|
def get_state(state: bytes=None, passphrase: str=None):
|
|
|
|
|
|
|
|
if state is None:
|
|
|
|
salt = random.bytes(32) # generate a random salt if no state provided
|
2018-02-24 09:58:02 -08:00
|
|
|
else:
|
2018-02-28 15:07:45 -08:00
|
|
|
salt = state[:32] # use salt from provided state
|
2017-05-08 13:31:21 -07:00
|
|
|
|
2018-02-24 09:58:02 -08:00
|
|
|
if passphrase is None:
|
2018-02-28 15:07:45 -08:00
|
|
|
global _passphrase
|
|
|
|
if _passphrase is None:
|
|
|
|
return None
|
|
|
|
passphrase = _passphrase # use cached passphrase
|
|
|
|
|
|
|
|
# state = HMAC(passphrase, salt || device_id)
|
|
|
|
msg = salt + storage.get_device_id().encode()
|
|
|
|
state = hmac.new(passphrase.encode(), msg, hashlib.sha256).digest()
|
2017-05-08 13:31:21 -07:00
|
|
|
|
2018-02-28 15:07:45 -08:00
|
|
|
return salt + state
|
2018-02-09 09:59:26 -08:00
|
|
|
|
|
|
|
|
|
|
|
def get_seed():
|
|
|
|
global _seed
|
|
|
|
return _seed
|
|
|
|
|
|
|
|
|
2018-02-24 09:58:02 -08:00
|
|
|
def set_seed(seed, passphrase):
|
|
|
|
global _seed, _passphrase
|
|
|
|
_seed, _passphrase = seed, _passphrase
|
2018-02-09 09:07:47 -08:00
|
|
|
|
|
|
|
|
2018-02-27 11:48:01 -08:00
|
|
|
def has_passphrase():
|
|
|
|
global _passphrase
|
|
|
|
return _passphrase is not None
|
|
|
|
|
|
|
|
|
2017-05-08 13:31:21 -07:00
|
|
|
def clear():
|
2018-02-24 09:58:02 -08:00
|
|
|
global _seed, _passphrase
|
|
|
|
_seed, _passphrase = None, None
|