from hashlib import blake2s

import pytest

from trezorlib import firmware
from trezorlib.debuglink import TrezorClientDebugLink as Client

FIRMWARE_LENGTHS = {
    "1": 7 * 128 * 1024 + 64 * 1024,
    "T": 13 * 128 * 1024,
}


def test_firmware_hash_emu(client: Client) -> None:
    if client.features.fw_vendor != "EMULATOR":
        pytest.skip("Only for emulator")

    data = b"\xff" * FIRMWARE_LENGTHS[client.features.model]

    expected_hash = blake2s(data).digest()
    hash = firmware.get_hash(client, None)
    assert hash == expected_hash

    challenge = b"Hello Trezor"
    expected_hash = blake2s(data, key=challenge).digest()
    hash = firmware.get_hash(client, challenge)
    assert hash == expected_hash


def test_firmware_hash_hw(client: Client) -> None:
    if client.features.fw_vendor == "EMULATOR":
        pytest.skip("Only for hardware")

    # TODO get firmware image from outside the environment, check for actual result
    challenge = b"Hello Trezor"
    empty_data = b"\xff" * FIRMWARE_LENGTHS[client.features.model]
    empty_hash = blake2s(empty_data).digest()
    empty_hash_challenge = blake2s(empty_data, key=challenge).digest()

    hash = firmware.get_hash(client, None)
    assert hash != empty_hash

    hash2 = firmware.get_hash(client, challenge)
    assert hash != hash2
    assert hash2 != empty_hash_challenge