mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-11-22 15:38:11 +00:00
legacy, tests: Check for invalid PIN.
This commit is contained in:
parent
ac78d1e2f3
commit
b2dc5813fe
@ -63,18 +63,21 @@ void pinmatrix_start(const char *text) {
|
|||||||
pinmatrix_draw(text);
|
pinmatrix_draw(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
void pinmatrix_done(char *pin) {
|
secbool pinmatrix_done(char *pin) {
|
||||||
int i = 0, k = 0;
|
int i = 0, k = 0;
|
||||||
|
secbool ret = sectrue;
|
||||||
while (pin && pin[i]) {
|
while (pin && pin[i]) {
|
||||||
k = pin[i] - '1';
|
k = pin[i] - '1';
|
||||||
if (k >= 0 && k <= 8) {
|
if (k >= 0 && k <= 8) {
|
||||||
pin[i] = pinmatrix_perm[k];
|
pin[i] = pinmatrix_perm[k];
|
||||||
} else {
|
} else {
|
||||||
pin[i] = 'X';
|
pin[i] = 'X';
|
||||||
|
ret = secfalse;
|
||||||
}
|
}
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
memset(pinmatrix_perm, 'X', sizeof(pinmatrix_perm) - 1);
|
memset(pinmatrix_perm, 'X', sizeof(pinmatrix_perm) - 1);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if DEBUG_LINK
|
#if DEBUG_LINK
|
||||||
|
@ -20,8 +20,10 @@
|
|||||||
#ifndef __PINMATRIX_H__
|
#ifndef __PINMATRIX_H__
|
||||||
#define __PINMATRIX_H__
|
#define __PINMATRIX_H__
|
||||||
|
|
||||||
|
#include "secbool.h"
|
||||||
|
|
||||||
void pinmatrix_start(const char *text);
|
void pinmatrix_start(const char *text);
|
||||||
void pinmatrix_done(char *pin);
|
secbool pinmatrix_done(char *pin);
|
||||||
const char *pinmatrix_get(void);
|
const char *pinmatrix_get(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -124,9 +124,11 @@ const char *requestPin(PinMatrixRequestType type, const char *text) {
|
|||||||
if (msg_tiny_id == MessageType_MessageType_PinMatrixAck) {
|
if (msg_tiny_id == MessageType_MessageType_PinMatrixAck) {
|
||||||
msg_tiny_id = 0xFFFF;
|
msg_tiny_id = 0xFFFF;
|
||||||
PinMatrixAck *pma = (PinMatrixAck *)msg_tiny;
|
PinMatrixAck *pma = (PinMatrixAck *)msg_tiny;
|
||||||
pinmatrix_done(pma->pin); // convert via pinmatrix
|
|
||||||
usbTiny(0);
|
usbTiny(0);
|
||||||
|
if (sectrue == pinmatrix_done(pma->pin)) // convert via pinmatrix
|
||||||
return pma->pin;
|
return pma->pin;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
// check for Cancel / Initialize
|
// check for Cancel / Initialize
|
||||||
protectAbortedByCancel = (msg_tiny_id == MessageType_MessageType_Cancel);
|
protectAbortedByCancel = (msg_tiny_id == MessageType_MessageType_Cancel);
|
||||||
@ -243,7 +245,7 @@ bool protectChangePin(bool removal) {
|
|||||||
if (!removal) {
|
if (!removal) {
|
||||||
pin = requestPin(PinMatrixRequestType_PinMatrixRequestType_NewFirst,
|
pin = requestPin(PinMatrixRequestType_PinMatrixRequestType_NewFirst,
|
||||||
_("Please enter new PIN:"));
|
_("Please enter new PIN:"));
|
||||||
if (pin == NULL) {
|
if (pin == NULL || pin[0] == '\0') {
|
||||||
memzero(old_pin, sizeof(old_pin));
|
memzero(old_pin, sizeof(old_pin));
|
||||||
fsm_sendFailure(FailureType_Failure_PinCancelled, NULL);
|
fsm_sendFailure(FailureType_Failure_PinCancelled, NULL);
|
||||||
return false;
|
return false;
|
||||||
|
@ -174,3 +174,26 @@ def test_set_pin_to_wipe_code(client):
|
|||||||
assert client.features.pin_protection is False
|
assert client.features.pin_protection is False
|
||||||
resp = client.call_raw(messages.GetAddress())
|
resp = client.call_raw(messages.GetAddress())
|
||||||
assert isinstance(resp, messages.Address)
|
assert isinstance(resp, messages.Address)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize("invalid_wipe_code", ("1204", "", "1234567891"))
|
||||||
|
def test_set_wipe_code_invalid(client, invalid_wipe_code):
|
||||||
|
# Let's set the wipe code
|
||||||
|
ret = client.call_raw(messages.ChangeWipeCode())
|
||||||
|
assert isinstance(ret, messages.ButtonRequest)
|
||||||
|
|
||||||
|
# Confirm
|
||||||
|
client.debug.press_yes()
|
||||||
|
ret = client.call_raw(messages.ButtonAck())
|
||||||
|
|
||||||
|
# Enter a wipe code containing an invalid digit
|
||||||
|
assert isinstance(ret, messages.PinMatrixRequest)
|
||||||
|
assert ret.type == PinType.WipeCodeFirst
|
||||||
|
ret = client.call_raw(messages.PinMatrixAck(pin=invalid_wipe_code))
|
||||||
|
|
||||||
|
# Ensure the invalid wipe code is detected
|
||||||
|
assert isinstance(ret, messages.Failure)
|
||||||
|
|
||||||
|
# Check that there's still no wipe code protection.
|
||||||
|
client.init_device()
|
||||||
|
assert client.features.wipe_code_protection is False
|
||||||
|
@ -138,7 +138,7 @@ class TestMsgChangepin:
|
|||||||
ret = client.call_raw(proto.GetAddress())
|
ret = client.call_raw(proto.GetAddress())
|
||||||
assert isinstance(ret, proto.Address)
|
assert isinstance(ret, proto.Address)
|
||||||
|
|
||||||
def test_set_failed(self, client):
|
def test_set_mismatch(self, client):
|
||||||
features = client.call_raw(proto.Initialize())
|
features = client.call_raw(proto.Initialize())
|
||||||
assert features.pin_protection is False
|
assert features.pin_protection is False
|
||||||
|
|
||||||
@ -174,7 +174,7 @@ class TestMsgChangepin:
|
|||||||
assert isinstance(ret, proto.Address)
|
assert isinstance(ret, proto.Address)
|
||||||
|
|
||||||
@pytest.mark.setup_client(pin=True)
|
@pytest.mark.setup_client(pin=True)
|
||||||
def test_set_failed_2(self, client):
|
def test_change_mismatch(self, client):
|
||||||
features = client.call_raw(proto.Initialize())
|
features = client.call_raw(proto.Initialize())
|
||||||
assert features.pin_protection is True
|
assert features.pin_protection is True
|
||||||
|
|
||||||
@ -209,6 +209,58 @@ class TestMsgChangepin:
|
|||||||
assert features.pin_protection is True
|
assert features.pin_protection is True
|
||||||
self.check_pin(client, PIN4)
|
self.check_pin(client, PIN4)
|
||||||
|
|
||||||
|
@pytest.mark.parametrize("invalid_pin", ("1204", "", "1234567891"))
|
||||||
|
def test_set_invalid(self, client, invalid_pin):
|
||||||
|
features = client.call_raw(proto.Initialize())
|
||||||
|
assert features.pin_protection is False
|
||||||
|
|
||||||
|
# Let's set an invalid PIN
|
||||||
|
ret = client.call_raw(proto.ChangePin())
|
||||||
|
assert isinstance(ret, proto.ButtonRequest)
|
||||||
|
|
||||||
|
# Press button
|
||||||
|
client.debug.press_yes()
|
||||||
|
ret = client.call_raw(proto.ButtonAck())
|
||||||
|
|
||||||
|
# Send a PIN containing an invalid digit
|
||||||
|
assert isinstance(ret, proto.PinMatrixRequest)
|
||||||
|
ret = client.call_raw(proto.PinMatrixAck(pin=invalid_pin))
|
||||||
|
|
||||||
|
# Ensure the invalid PIN is detected
|
||||||
|
assert isinstance(ret, proto.Failure)
|
||||||
|
|
||||||
|
# Check that there's still no PIN protection now
|
||||||
|
features = client.call_raw(proto.Initialize())
|
||||||
|
assert features.pin_protection is False
|
||||||
|
ret = client.call_raw(proto.GetAddress())
|
||||||
|
assert isinstance(ret, proto.Address)
|
||||||
|
|
||||||
|
@pytest.mark.parametrize("invalid_pin", ("1204", "", "1234567891"))
|
||||||
|
@pytest.mark.setup_client(pin=True)
|
||||||
|
def test_remove_invalid(self, client, invalid_pin):
|
||||||
|
features = client.call_raw(proto.Initialize())
|
||||||
|
assert features.pin_protection is True
|
||||||
|
|
||||||
|
# Let's change the PIN
|
||||||
|
ret = client.call_raw(proto.ChangePin(remove=True))
|
||||||
|
assert isinstance(ret, proto.ButtonRequest)
|
||||||
|
|
||||||
|
# Press button
|
||||||
|
client.debug.press_yes()
|
||||||
|
ret = client.call_raw(proto.ButtonAck())
|
||||||
|
|
||||||
|
# Instead of the old PIN, send a PIN containing an invalid digit
|
||||||
|
assert isinstance(ret, proto.PinMatrixRequest)
|
||||||
|
ret = client.call_raw(proto.PinMatrixAck(pin=invalid_pin))
|
||||||
|
|
||||||
|
# Ensure the invalid PIN is detected
|
||||||
|
assert isinstance(ret, proto.Failure)
|
||||||
|
|
||||||
|
# Check that there's still old PIN protection
|
||||||
|
features = client.call_raw(proto.Initialize())
|
||||||
|
assert features.pin_protection is True
|
||||||
|
self.check_pin(client, PIN4)
|
||||||
|
|
||||||
def check_pin(self, client, pin):
|
def check_pin(self, client, pin):
|
||||||
client.clear_session()
|
client.clear_session()
|
||||||
ret = client.call_raw(proto.GetAddress())
|
ret = client.call_raw(proto.GetAddress())
|
||||||
|
Loading…
Reference in New Issue
Block a user