mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-11-22 15:38:11 +00:00
all: do not send state in PassphraseAck (not needed for compatibility)
This commit is contained in:
parent
3959600760
commit
e61b7d28e9
@ -120,7 +120,7 @@ message PassphraseRequest {
|
|||||||
*/
|
*/
|
||||||
message PassphraseAck {
|
message PassphraseAck {
|
||||||
optional string passphrase = 1;
|
optional string passphrase = 1;
|
||||||
optional bytes _state = 2 [deprecated=true]; // <2.3.0
|
// optional bytes state = 2; DEPRECATED since 2.3.0
|
||||||
optional bool on_device = 3; // user wants to enter passphrase on the device
|
optional bool on_device = 3; // user wants to enter passphrase on the device
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -16,17 +16,14 @@ class PassphraseAck(p.MessageType):
|
|||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
passphrase: str = None,
|
passphrase: str = None,
|
||||||
_state: bytes = None,
|
|
||||||
on_device: bool = None,
|
on_device: bool = None,
|
||||||
) -> None:
|
) -> None:
|
||||||
self.passphrase = passphrase
|
self.passphrase = passphrase
|
||||||
self._state = _state
|
|
||||||
self.on_device = on_device
|
self.on_device = on_device
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_fields(cls) -> Dict:
|
def get_fields(cls) -> Dict:
|
||||||
return {
|
return {
|
||||||
1: ('passphrase', p.UnicodeType, 0),
|
1: ('passphrase', p.UnicodeType, 0),
|
||||||
2: ('_state', p.BytesType, 0),
|
|
||||||
3: ('on_device', p.BoolType, 0),
|
3: ('on_device', p.BoolType, 0),
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,6 @@ Failure.message max_size:256
|
|||||||
PinMatrixAck.pin max_size:10
|
PinMatrixAck.pin max_size:10
|
||||||
|
|
||||||
PassphraseAck.passphrase max_size:51
|
PassphraseAck.passphrase max_size:51
|
||||||
PassphraseAck._state max_size:32
|
|
||||||
|
|
||||||
Deprecated_PassphraseStateRequest.state max_size:1
|
Deprecated_PassphraseStateRequest.state max_size:1
|
||||||
|
|
||||||
|
@ -187,9 +187,7 @@ class TrezorClient:
|
|||||||
available_on_device = Capability.PassphraseEntry in self.features.capabilities
|
available_on_device = Capability.PassphraseEntry in self.features.capabilities
|
||||||
|
|
||||||
def send_passphrase(passphrase=None, on_device=None):
|
def send_passphrase(passphrase=None, on_device=None):
|
||||||
msg = messages.PassphraseAck(
|
msg = messages.PassphraseAck(passphrase=passphrase, on_device=on_device)
|
||||||
_state=self.session_id, passphrase=passphrase, on_device=on_device
|
|
||||||
)
|
|
||||||
resp = self.call_raw(msg)
|
resp = self.call_raw(msg)
|
||||||
if isinstance(resp, messages.Deprecated_PassphraseStateRequest):
|
if isinstance(resp, messages.Deprecated_PassphraseStateRequest):
|
||||||
self.session_id = resp.state
|
self.session_id = resp.state
|
||||||
|
@ -16,17 +16,14 @@ class PassphraseAck(p.MessageType):
|
|||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
passphrase: str = None,
|
passphrase: str = None,
|
||||||
_state: bytes = None,
|
|
||||||
on_device: bool = None,
|
on_device: bool = None,
|
||||||
) -> None:
|
) -> None:
|
||||||
self.passphrase = passphrase
|
self.passphrase = passphrase
|
||||||
self._state = _state
|
|
||||||
self.on_device = on_device
|
self.on_device = on_device
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_fields(cls) -> Dict:
|
def get_fields(cls) -> Dict:
|
||||||
return {
|
return {
|
||||||
1: ('passphrase', p.UnicodeType, 0),
|
1: ('passphrase', p.UnicodeType, 0),
|
||||||
2: ('_state', p.BytesType, 0),
|
|
||||||
3: ('on_device', p.BoolType, 0),
|
3: ('on_device', p.BoolType, 0),
|
||||||
}
|
}
|
||||||
|
116
tests/upgrade_tests/test_passphrase_consistency.py
Normal file
116
tests/upgrade_tests/test_passphrase_consistency.py
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
# This file is part of the Trezor project.
|
||||||
|
#
|
||||||
|
# Copyright (C) 2012-2019 SatoshiLabs and contributors
|
||||||
|
#
|
||||||
|
# This library is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Lesser General Public License version 3
|
||||||
|
# as published by the Free Software Foundation.
|
||||||
|
#
|
||||||
|
# This library is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU Lesser General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the License along with this library.
|
||||||
|
# If not, see <https://www.gnu.org/licenses/lgpl-3.0.html>.
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
from trezorlib import MINIMUM_FIRMWARE_VERSION, btc, device, mapping, messages, protobuf
|
||||||
|
from trezorlib.tools import parse_path
|
||||||
|
|
||||||
|
from ..emulators import EmulatorWrapper
|
||||||
|
from . import for_all
|
||||||
|
|
||||||
|
SOURCE_ASK = 0
|
||||||
|
SOURCE_DEVICE = 1
|
||||||
|
SOURCE_HOST = 2
|
||||||
|
|
||||||
|
|
||||||
|
class ApplySettingsCompat(protobuf.MessageType):
|
||||||
|
MESSAGE_WIRE_TYPE = 25
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_fields(cls):
|
||||||
|
return {
|
||||||
|
3: ("use_passphrase", protobuf.BoolType, 0),
|
||||||
|
5: ("passphrase_source", protobuf.UVarintType, 0),
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
mapping.map_class_to_type[ApplySettingsCompat] = ApplySettingsCompat.MESSAGE_WIRE_TYPE
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def emulator(gen, tag):
|
||||||
|
with EmulatorWrapper(gen, tag) as emu:
|
||||||
|
# set up a passphrase-protected device
|
||||||
|
device.reset(
|
||||||
|
emu.client, pin_protection=False, skip_backup=True,
|
||||||
|
)
|
||||||
|
resp = emu.client.call(
|
||||||
|
ApplySettingsCompat(use_passphrase=True, passphrase_source=SOURCE_HOST)
|
||||||
|
)
|
||||||
|
assert isinstance(resp, messages.Success)
|
||||||
|
|
||||||
|
yield emu
|
||||||
|
|
||||||
|
|
||||||
|
@for_all(
|
||||||
|
core_minimum_version=MINIMUM_FIRMWARE_VERSION["T"],
|
||||||
|
legacy_minimum_version=MINIMUM_FIRMWARE_VERSION["1"],
|
||||||
|
)
|
||||||
|
def test_passphrase_works(emulator):
|
||||||
|
"""Check that passphrase handling in trezorlib works correctly in all versions."""
|
||||||
|
if emulator.client.features.model == "T" and emulator.client.version < (2, 3, 0):
|
||||||
|
expected_responses = [
|
||||||
|
messages.PassphraseRequest(),
|
||||||
|
messages.Deprecated_PassphraseStateRequest(),
|
||||||
|
messages.Address(),
|
||||||
|
]
|
||||||
|
else:
|
||||||
|
expected_responses = [
|
||||||
|
messages.PassphraseRequest(),
|
||||||
|
messages.Address(),
|
||||||
|
]
|
||||||
|
|
||||||
|
with emulator.client:
|
||||||
|
emulator.client.use_passphrase("TREZOR")
|
||||||
|
emulator.client.set_expected_responses(expected_responses)
|
||||||
|
btc.get_address(emulator.client, "Testnet", parse_path("44h/1h/0h/0/0"))
|
||||||
|
|
||||||
|
|
||||||
|
@for_all(
|
||||||
|
core_minimum_version=MINIMUM_FIRMWARE_VERSION["T"],
|
||||||
|
legacy_minimum_version=(1, 9, 0),
|
||||||
|
)
|
||||||
|
def test_init_device(emulator):
|
||||||
|
"""Check that passphrase caching and session_id retaining works correctly across
|
||||||
|
supported versions.
|
||||||
|
"""
|
||||||
|
if emulator.client.features.model == "T" and emulator.client.version < (2, 3, 0):
|
||||||
|
expected_responses = [
|
||||||
|
messages.PassphraseRequest(),
|
||||||
|
messages.Deprecated_PassphraseStateRequest(),
|
||||||
|
messages.Address(),
|
||||||
|
messages.Features(),
|
||||||
|
messages.Address(),
|
||||||
|
]
|
||||||
|
else:
|
||||||
|
expected_responses = [
|
||||||
|
messages.PassphraseRequest(),
|
||||||
|
messages.Address(),
|
||||||
|
messages.Features(),
|
||||||
|
messages.Address(),
|
||||||
|
]
|
||||||
|
|
||||||
|
with emulator.client:
|
||||||
|
emulator.client.use_passphrase("TREZOR")
|
||||||
|
emulator.client.set_expected_responses(expected_responses)
|
||||||
|
|
||||||
|
btc.get_address(emulator.client, "Testnet", parse_path("44h/1h/0h/0/0"))
|
||||||
|
# in TT < 2.3.0 session_id will only be available after PassphraseStateRequest
|
||||||
|
session_id = emulator.client.session_id
|
||||||
|
emulator.client.init_device()
|
||||||
|
btc.get_address(emulator.client, "Testnet", parse_path("44h/1h/0h/0/0"))
|
||||||
|
assert session_id == emulator.client.session_id
|
Loading…
Reference in New Issue
Block a user