Skip to content

Commit 6180d55

Browse files
committed
Merge branch 'develop' into gpg_secp256k1
2 parents 1e565a8 + 5522761 commit 6180d55

3 files changed

Lines changed: 126 additions & 8 deletions

File tree

src/krux/pages/device_tests.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ def print_test(self):
5757
def test_suite(self, interactive=False):
5858
"""run each on-device tests in all_tests, report summary and details"""
5959
all_tests = [
60+
self.multi_layer_decrypt,
6061
self.hw_acc_hashing,
6162
self.deflate_compression,
6263
self.touch_gestures,
@@ -202,6 +203,62 @@ def run_one_test(self, test):
202203
# * return something True on success
203204
# * return False/empty/None/Exception on failure
204205

206+
def multi_layer_decrypt(self, interactive=False):
207+
"""
208+
Decrypts a matryoshka of all kef versions built w/ Crypto.Cipher --
209+
outside-of MaixyPy's ucryptolib on k210 devices.
210+
Runs as very first test because it's suspected that an uninitialized
211+
hasher (in uhashlib_hw.pbkdf2_hmac_sha256()) can cause problems when
212+
booted from ktool (until something is hashed), as opposed to booting
213+
from flash where both bootloaders and firmware are hashed during Kboot.
214+
"""
215+
from binascii import hexlify
216+
from krux import kef
217+
218+
results = []
219+
err = ""
220+
expected_plain = b"\xde\xad\xbe\xef"
221+
kef_envelope = (
222+
b"\x00\x15\x00\x00\x01OR\xa1\x93l>2q \x9e\x9ddZt\xe3e\xfa\x93`"
223+
b"\x97 \xa4\xf5)\xddp~I[\xd0\xb7*\xe8\xe4s\xed\x06ca\x9c'5\x0eb"
224+
b"\xd8\x82\xc28\xeelP~&\x0b\xf8\x98\xea*S\xf00\xed7EFk\xa6a\xce"
225+
b"\x80~`\xaeAK\nT\xcd6d\x0c\x16\x88\xb4R\xfe\xe2\xfc#5\xf8\x8f5"
226+
b".\x0c\xfa\xa2iN\x02W\x16\xce\x88\x88\x99)\xc8=\xe11\x0ey\xe6"
227+
b"\xa1\xcb3&\xac\x01\xb0\xb8\xd5#\xce\xa6\xfd-k(+\x97\xe6\x07\x02"
228+
b'\x8d\\\xdc51<\xe3K_\xba\x0b\xf5]"O6\x03\xe3\x9aV\xec=\xda\xfa'
229+
b"\xec.;@CmPc\x01\x9a\x1eG\xde\xd2\x13\xcc\n\x0e\xf4\x80/\xea\xec"
230+
b"\xf0\x05q\xe0\x0c\x01\xfeK\xc5v\xc9|A\x0eM.\xd95\x7f\x16\xc8/%"
231+
b"\xbb\x1aX\xecoi\x9e\x92bd\xf7\x90\xc2I\xa6\x13\xc1j\xa5\xee\xc0"
232+
b"\x7f/c\xc8yOp\x8d&\x17\xfe\xd5*Q\x12s\xd3\x8d/\x9dhjG\xc6{G\xee"
233+
b"\xef\x07H\x86\xeat\x1e\xb5\xa6\xb1\x94\x80\x83\x15\x98<0i\xb5"
234+
b"\xb5\x8eQ~\x0b\x84\x97\xc1H\x0e\xbf\x9c\x83\x98\xc9\xb8\xe4i"
235+
b"\xab\x8fx\xa8*\xb2z\x85\x97W\xd5\xd67\xe0\x9c\xec,\x02\xed\x1b"
236+
b"(\xec\x1d\x0c6\xb7\x95\xcf"
237+
)
238+
while True:
239+
try:
240+
id_, version, iterations, cipherpayload = kef.unwrap(kef_envelope)
241+
results.append(kef.VERSIONS[version]["name"])
242+
except:
243+
break
244+
decryptor = kef.Cipher(b"abc", id_, iterations)
245+
kef_envelope = decryptor.decrypt(cipherpayload, version)
246+
if kef_envelope is None:
247+
err += "FAILED {}\n".format(kef.VERSIONS[version]["name"])
248+
break
249+
250+
if kef_envelope != expected_plain:
251+
err += "unexpected plain text: {}".format(kef_envelope)
252+
253+
if err:
254+
raise AssertionError(err)
255+
256+
results.append(
257+
"expected plaintext revealed: 0x{}".format(hexlify(kef_envelope).decode())
258+
)
259+
260+
return results
261+
205262
def hw_acc_hashing(self, interactive=False):
206263
"""
207264
churns nonce through sha256() and pbkdf_hmac(sha256,) calls,

tests/pages/test_device_tests.py

Lines changed: 68 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,15 @@ def mocked_run_one_test(mocker):
1414
return mocker.patch("krux.pages.device_tests.DeviceTests.run_one_test")
1515

1616

17+
@pytest.fixture
18+
def mock_multi_layer_decrypt(mocker):
19+
"""Fixture to mock multi_layer_decrypt failing"""
20+
21+
return mocker.patch(
22+
"krux.kef.Cipher.decrypt", side_effect=lambda cpl, version: None
23+
)
24+
25+
1726
@pytest.fixture
1827
def mock_hw_acc_hashing(mocker):
1928
"""Fixture to mock the hardware acceleration hashing test to fail"""
@@ -165,6 +174,37 @@ def test_skip_all_tests(m5stickv, mocker, mocked_print_qr, mocked_run_one_test):
165174
assert ctx.input.wait_for_button.call_count == len(BTN_SEQUENCE)
166175

167176

177+
def test_fail_multi_layer_decrypt(m5stickv, mocker, mock_multi_layer_decrypt):
178+
"""Directly test multi_layer_decrypt() hitting the except block"""
179+
from krux.pages.device_tests import DeviceTests
180+
from krux.input import BUTTON_ENTER, BUTTON_PAGE_PREV
181+
182+
BTN_SEQUENCE = (
183+
BUTTON_PAGE_PREV, # select back
184+
BUTTON_ENTER, # go back
185+
)
186+
187+
ctx = create_ctx(mocker, BTN_SEQUENCE)
188+
page = DeviceTests(ctx)
189+
page.test_suite()
190+
191+
# assert that kef.Cipher.decrypt was called
192+
decrypt = mock_multi_layer_decrypt
193+
assert decrypt.call_count > 0
194+
195+
# assert that the test suite results are displayed correctly
196+
# and that the on-device-test failed
197+
page.ctx.display.draw_hcentered_text.assert_has_calls(
198+
[
199+
mocker.call(
200+
"Test Suite Results\nsuccess rate: 75%\nfailed: 1/4", info_box=True
201+
)
202+
]
203+
)
204+
205+
assert ctx.input.wait_for_button.call_count == len(BTN_SEQUENCE)
206+
207+
168208
def test_fail_hw_acc_hashing(m5stickv, mocker, mock_hw_acc_hashing):
169209
"""Directly test hw_acc_hashing() hmac hitting the except block"""
170210
from krux.pages.device_tests import DeviceTests
@@ -189,7 +229,7 @@ def test_fail_hw_acc_hashing(m5stickv, mocker, mock_hw_acc_hashing):
189229
page.ctx.display.draw_hcentered_text.assert_has_calls(
190230
[
191231
mocker.call(
192-
"Test Suite Results\nsuccess rate: 66%\nfailed: 1/3", info_box=True
232+
"Test Suite Results\nsuccess rate: 50%\nfailed: 2/4", info_box=True
193233
)
194234
]
195235
)
@@ -223,7 +263,7 @@ def test_fail_sha256(m5stickv, mocker, mock_hashlib_sha256):
223263
page.ctx.display.draw_hcentered_text.assert_has_calls(
224264
[
225265
mocker.call(
226-
"Test Suite Results\nsuccess rate: 66%\nfailed: 1/3", info_box=True
266+
"Test Suite Results\nsuccess rate: 75%\nfailed: 1/4", info_box=True
227267
)
228268
]
229269
)
@@ -259,7 +299,7 @@ def test_fail_hexilify(m5stickv, mocker, mock_hexlify_endianess):
259299
page.ctx.display.draw_hcentered_text.assert_has_calls(
260300
[
261301
mocker.call(
262-
"Test Suite Results\nsuccess rate: 66%\nfailed: 1/3", info_box=True
302+
"Test Suite Results\nsuccess rate: 75%\nfailed: 1/4", info_box=True
263303
)
264304
]
265305
)
@@ -295,7 +335,7 @@ def test_fail_b2a_base64(m5stickv, mocker, mock_b2a_base64_endianess):
295335
page.ctx.display.draw_hcentered_text.assert_has_calls(
296336
[
297337
mocker.call(
298-
"Test Suite Results\nsuccess rate: 66%\nfailed: 1/3", info_box=True
338+
"Test Suite Results\nsuccess rate: 75%\nfailed: 1/4", info_box=True
299339
)
300340
]
301341
)
@@ -340,7 +380,7 @@ def test_fail_deflate_compression(m5stickv, mocker, mock_deflate):
340380
page.ctx.display.draw_hcentered_text.assert_has_calls(
341381
[
342382
mocker.call(
343-
"Test Suite Results\nsuccess rate: 66%\nfailed: 1/3", info_box=True
383+
"Test Suite Results\nsuccess rate: 75%\nfailed: 1/4", info_box=True
344384
)
345385
]
346386
)
@@ -371,7 +411,7 @@ def test_fail_maixpy_code(m5stickv, mocker, mock_maixpy_code):
371411
page.ctx.display.draw_hcentered_text.assert_has_calls(
372412
[
373413
mocker.call(
374-
"Test Suite Results\nsuccess rate: 66%\nfailed: 1/3", info_box=True
414+
"Test Suite Results\nsuccess rate: 75%\nfailed: 1/4", info_box=True
375415
)
376416
]
377417
)
@@ -402,7 +442,7 @@ def test_fail_zlib_code(m5stickv, mocker, mock_zlib_code):
402442
page.ctx.display.draw_hcentered_text.assert_has_calls(
403443
[
404444
mocker.call(
405-
"Test Suite Results\nsuccess rate: 66%\nfailed: 1/3", info_box=True
445+
"Test Suite Results\nsuccess rate: 75%\nfailed: 1/4", info_box=True
406446
)
407447
]
408448
)
@@ -476,6 +516,27 @@ def test_run_intreactively(m5stickv, mocker):
476516
assert ctx.input.wait_for_button.call_count == len(BTN_SEQUENCE)
477517

478518

519+
def test_run_one_test_multi_layer_decrypt(m5stickv, mocker):
520+
from krux.pages.device_tests import DeviceTests
521+
from krux.input import BUTTON_ENTER, BUTTON_PAGE_PREV
522+
523+
BTN_SEQUENCE = (
524+
BUTTON_ENTER, # hit enter to proceed
525+
BUTTON_PAGE_PREV, #
526+
BUTTON_ENTER, # go back
527+
)
528+
529+
ctx = create_ctx(mocker, BTN_SEQUENCE)
530+
page = DeviceTests(ctx)
531+
532+
# since bypassing test-suite, fake existing results
533+
page.results = [(page.multi_layer_decrypt, False)]
534+
page.run_one_test(page.multi_layer_decrypt)
535+
assert page.results == [(page.multi_layer_decrypt, True)]
536+
537+
assert ctx.input.wait_for_button.call_count == len(BTN_SEQUENCE)
538+
539+
479540
def test_run_one_test_test_hw_acc_hashing(m5stickv, mocker):
480541
from krux.pages.device_tests import DeviceTests
481542
from krux.input import BUTTON_ENTER, BUTTON_PAGE_PREV

0 commit comments

Comments
 (0)