parent
1ee2095c23
commit
dd7ca9ebf1
@ -0,0 +1,113 @@
|
||||
from common import * # isort:skip
|
||||
|
||||
from trezor import io
|
||||
from trezor.crypto import hashlib
|
||||
|
||||
|
||||
class TestTrezorIoFlashArea(unittest.TestCase):
|
||||
def test_firmware_hash(self):
|
||||
area = io.flash_area.FIRMWARE
|
||||
area.erase()
|
||||
self.assertEqual(
|
||||
area.hash(0, area.size()),
|
||||
b"\xd2\xdb\x90\xa7jV6\xa7\x00N\xc3\xb4\x8eq\xa9U\xe0\xcb\xb2\xcbZo\xd7\xae\x9f\xbe\xf8F\xbc\x16l\x8c",
|
||||
)
|
||||
self.assertEqual(
|
||||
area.hash(0, area.size(), b"0123456789abcdef"),
|
||||
b"\xa0\x93@\x98\xa6\x80\xdb\x07m\xdf~\xe2'E\xf1\x19\xd8\xfd\xa4`\x10H\xf0_\xdbf\xa6N\xdd\xc0\xcf\xed",
|
||||
)
|
||||
|
||||
def test_write(self):
|
||||
# let's trash the firmware :shrug:
|
||||
area = io.flash_area.FIRMWARE
|
||||
size = area.size()
|
||||
|
||||
area.write(0, b"")
|
||||
area.write(1024, b"")
|
||||
area.write(size, b"")
|
||||
with self.assertRaises(ValueError):
|
||||
area.write(size + 16, b"")
|
||||
|
||||
# fill whole area
|
||||
area.write(0, b"\x01" * size)
|
||||
# do it again
|
||||
area.write(0, b"\x01" * size)
|
||||
# can't write more
|
||||
with self.assertRaises(ValueError):
|
||||
area.write(0, b"\x01" * (size + 16))
|
||||
|
||||
with self.assertRaises(ValueError):
|
||||
area.write(1, b"\x01" * size)
|
||||
|
||||
def test_overwrite(self):
|
||||
area = io.flash_area.FIRMWARE
|
||||
size = area.size()
|
||||
|
||||
area.erase()
|
||||
area.write(0, b"\x00" * 1024)
|
||||
|
||||
# try writing the same thing
|
||||
area.write(0, b"\x00" * 1024)
|
||||
|
||||
# try writing some ones
|
||||
with self.assertRaises(ValueError):
|
||||
area.write(0, b"\x01" * 1024)
|
||||
|
||||
def test_read_write(self):
|
||||
area = io.flash_area.FIRMWARE
|
||||
size = area.size()
|
||||
area.erase()
|
||||
|
||||
buf = bytearray(256)
|
||||
for i in range(256):
|
||||
buf[i] = i
|
||||
|
||||
for start in range(0, size, 256):
|
||||
area.write(start, buf)
|
||||
|
||||
all_data = bytearray(size)
|
||||
area.read(0, all_data)
|
||||
for i in range(size):
|
||||
# avoid super-slow assertEqual
|
||||
if i % 256 != all_data[i]:
|
||||
self.fail(f"at {i} expected {i % 256}, found {all_data[i]}")
|
||||
|
||||
chunk = bytearray(1024)
|
||||
for start in range(0, size, 1024):
|
||||
area.read(start, chunk)
|
||||
for j in range(1024):
|
||||
# avoid super-slow assertEqual
|
||||
if (start + j) % 256 != chunk[j]:
|
||||
self.fail(
|
||||
f"at {start + j} expected {(start + j) % 256}, found {chunk[j]}"
|
||||
)
|
||||
|
||||
def test_hash(self):
|
||||
area = io.flash_area.FIRMWARE
|
||||
size = area.size()
|
||||
|
||||
|
||||
all_data = bytearray(size)
|
||||
for i in range(size):
|
||||
all_data[i] = i % 256
|
||||
|
||||
hasher = hashlib.blake2s()
|
||||
hasher.update(all_data)
|
||||
digest = hasher.digest()
|
||||
digest2 = area.hash(0, size)
|
||||
self.assertEqual(digest, digest2)
|
||||
|
||||
hasher = hashlib.blake2s()
|
||||
digest = hasher.digest()
|
||||
digest2 = area.hash(0, 0)
|
||||
self.assertEqual(digest, digest2)
|
||||
|
||||
hasher = hashlib.blake2s()
|
||||
hasher.update(all_data[1024:2048])
|
||||
digest = hasher.digest()
|
||||
digest2 = area.hash(1024, 1024)
|
||||
self.assertEqual(digest, digest2)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
Loading…
Reference in new issue