1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
|
# SPDX-License-Identifier: MIT
import sys, pathlib
sys.path.append(str(pathlib.Path(__file__).resolve().parents[1]))
from m1n1.setup import *
from m1n1.shell import run_shell
from m1n1.hw.dart import DART
from m1n1.hw.aes import *
def aes_set_custom_key(
aes,
key,
encrypt=True,
mode=AES_SET_KEY_BLOCK_MODE.CTR,
keyslot=0,
keygen=0,
):
keylen = {
16: AES_SET_KEY_LEN.AES128,
24: AES_SET_KEY_LEN.AES192,
32: AES_SET_KEY_LEN.AES256,
}[len(key)]
aes.R_CMD_FIFO = AESSetKeyCommand(
KEY_SELECT=0,
KEYLEN=keylen,
ENCRYPT=1 if encrypt else 0,
BLOCK_MODE=mode,
SLOT=keyslot,
KEYGEN=keygen,
).value
for i in range(0, len(key), 4):
aes.R_CMD_FIFO = struct.unpack(">I", key[i : i + 4])[0]
def aes_set_hw_key(
aes,
key,
keylen=AES_SET_KEY_LEN.AES128,
encrypt=True,
mode=AES_SET_KEY_BLOCK_MODE.CTR,
slot=0,
keygen=0,
):
aes.R_CMD_FIFO = AESSetKeyCommand(
KEY_SELECT=key,
KEYLEN=keylen,
ENCRYPT=1 if encrypt else 0,
BLOCK_MODE=mode,
SLOT=slot,
KEYGEN=keygen,
).value
def aes_set_iv(aes, iv, slot=0):
assert len(iv) == 16
aes.R_CMD_FIFO = AESSetIVCommand(SLOT=slot)
for i in range(0, len(iv), 4):
aes.R_CMD_FIFO = struct.unpack(">I", iv[i : i + 4])[0]
def aes_crypt(aes, dart, data, key_slot=0, iv_slot=0):
assert len(data) % 16 == 0
bfr = p.memalign(0x4000, len(data))
iova = dart.iomap(1, bfr, len(data))
dart.iowrite(1, iova, data)
aes.R_CMD_FIFO = AESCryptCommand(LEN=len(data), KEY_SLOT=key_slot, IV_SLOT=iv_slot)
aes.R_CMD_FIFO = 0 # actually upper bits of addr
aes.R_CMD_FIFO = iova # src
aes.R_CMD_FIFO = iova # dst
aes.R_CMD_FIFO = AESBarrierCommand(IRQ=1).value
time.sleep(0.1)
# while aes.R_IRQ_STATUS.reg.FLAG != 1:
# pass
# aes.dump_regs()
aes.R_IRQ_STATUS = aes.R_IRQ_STATUS.val
res = dart.ioread(1, iova, len(data))
return res
def test_hw_key(key, keylen, keygen=0):
aes.R_IRQ_STATUS = aes.R_IRQ_STATUS.val
aes.R_CONTROL.set(CLEAR_FIFO=1)
aes.R_CONTROL.set(RESET=1)
aes.R_CONTROL.set(START=1)
# aes.dump_regs()
aes_set_hw_key(aes, key, keylen, slot=0, keygen=keygen)
# print(aes.R_IRQ_STATUS)
aes_set_iv(aes, b"\x00" * 16, slot=0)
chexdump(aes_crypt(aes, dart, b"\x00" * 16, key_slot=0, iv_slot=1))
# aes.dump_regs()
aes.R_CONTROL.set(STOP=1)
def test_custom_key(key, keygen=0):
aes.R_IRQ_STATUS = aes.R_IRQ_STATUS.val
aes.R_CONTROL.set(CLEAR_FIFO=1)
aes.R_CONTROL.set(RESET=1)
aes.R_CONTROL.set(START=1)
# aes.dump_regs()
aes_set_custom_key(aes, key, keyslot=0, keygen=keygen)
aes_set_iv(aes, b"\x00" * 16)
aes_set_iv(aes, b"\x11" * 16, slot=1)
chexdump(aes_crypt(aes, dart, b"\x00" * 16, key_slot=0, iv_slot=0))
# aes.dump_regs()
aes.R_CONTROL.set(STOP=1)
p.pmgr_adt_clocks_enable("/arm-io/aes")
dart = DART.from_adt(u, "/arm-io/dart-sio")
dart.initialize()
aes_base, _ = u.adt["/arm-io/aes"].get_reg(0)
aes = AESRegs(u, aes_base)
aes.dump_regs()
dart.dump_all()
for keygen in range(4):
print(f"zero key, keygen={keygen}", end="")
test_custom_key(b"\x00" * 16, keygen=keygen)
for keygen in range(4):
print("#" * 10)
for keylen in [
AES_SET_KEY_LEN.AES128,
AES_SET_KEY_LEN.AES192,
AES_SET_KEY_LEN.AES256,
]:
for i in (1, 3):
print(f"key = {i}, keylen={keylen}, keygen={keygen}", end="")
test_hw_key(i, keylen, keygen=keygen)
dart.dump_all()
run_shell(globals(), msg="Have fun!")
|