Zadanie 4: Akcelerator szyfrowania¶
Data ogłoszenia: 22.12.2020
Termin oddania: 26.01.2021
Archiwum z plikami: z4_crypt.tar.gz
Napisać układ implementujący akcelerator szyfru TEA (https://en.wikipedia.org/wiki/Tiny_Encryption_Algorithm), podłączany do reszty systemu przez AXI.
Układ powinien być sterowany rejestrami MMIO, dostępnymi przez wyrównane
pojedyncze 32-bitowe transakcje AXI (wysłanie do układu innych transakcji
może powodować odpowiedź SLVERR
):
0x40000000, 0x40000004, 0x40000008, 0x4000000c
:K[4]
— klucz do szyfrowania i odszyfrowywania, dostępny tylko do zapisu (tak, by nie można było z układu wydostać już ustawionego klucza)0x40000010, 0x40000014
:STATE[2]
— obecny stan szyfru, używany w niektórych trybach szyfrowania, dostępny do zapisu i odczytu0x40000018
:SRC_ADDR
— adres bufora z danymi źródłowych do zaszyfrowania bądź odszyfrowania; powinien być zawsze wyrównany do jednego bloku szyfru (8 bajtów) — bity 0-2 powinny być zawsze równe 0, dostępny do zapisu i odczytu0x4000001c
:DST_ADDR
— adres bufora docelowego; jak wyżej0x40000020
:COUNT
— liczba bloków do zaszyfrowania bądź odszyfrowania, dostępny do zapisu i odczytu0x40000024
:TRIGGER
— rejestr tylko do zapisu, zapis uruchamia akcelerator; ma następujące pola bitowe:bit 0:
0: szyfrowanie
1: deszyfrowanie
bity 1-2: tryb szyfru
0: tryb
ECB
(surowy)1: tryb
CBC
2: tryb
CFB
3: tryb
CTR32
0x40000028
:STATUS
— rejestr tylko do odczytu, ma nstępujące pola:0:
BUSY
— jeśli 1, akcelerator pracuje i nie należy mu przeszkadzać (czyli dotykać rejestrów pozaSTATUS
); jeśli 0, akcelerator zakończył wszystkie zlecone mu zadania i można wysłać kolejne1:
ERROR
— jeśli 1, poprzednie zadanie zakończyło się błędem (któraś wychodząca transakcja AXI zwróciłaDECERR
bądźSLVERR
)
Układ operuje na zasadzie DMA — sam wczytuje dane z pamięci z wybranego adresu za pomocą szyny AXI (zalecana szyna to SAXIHP0
) i sam też je tam zapisuje.
Procedura użycia układu jest następująca:
Użytkownik umieszcza dane w buforze źródłowym.
Użytkownik ustawia klucz w rejestrach
K[0]..K[3]
(może to pominąć, jeśli klucz jest ten sam, co w poprzedniej operacji).Jeśli używany tryb jest inny niż
ECB
, użytkownik ustawia wartość początkową (IV
) w rejestrachSTATE[0], STATE[1]
(może to pominąć, jeśli chce kontynuować poprzednią operację).Użytkownik ustawia adresy buforów i długość operacji w rejestrach
SRC_ADDR, DST_ADDR, COUNT
.Użytkownik zapisuje żądany tryb operacji do rejestru
TRIGGER
, tym samym startując operację.Urządzenie rozpoczyna pracę, wczytuje bloki danych z bufora
SRC_ADDR
i zapisuje je do buforaDST_ADDR
.Użytkownik czyta w pętli rejestr
STATUS
aż bitBUSY
będzie równy 0.Użytkownik zbiera dane z bufora docelowego.
Użytkownik czyta rejestry
STATE[0], STATE[1]
jeśli zamierza kiedyś kontynuować operację.
Bloki w szyfrze TEA składają się z dwóch 32-bitowych liczb, tutaj zapisanych w formacie little-endian.
Pseudokod przetwarzania bloku dla różnych trybów jest następujący:
ECB, szyfrowanie:
DST = enc(SRC, K)
ECB, deszyfrowanie:
DST = dec(SRC, K)
CBC, szyfrowanie:
DST = STATE = enc(SRC ^ STATE, K)
CBC, deszyfrowanie:
DST = dec(SRC, K) ^ STATE STATE = SRC
CFB, szyfrowanie:
DST = STATE = SRC ^ enc(STATE, K)
CFB, deszyfrowanie:
DST = SRC ^ enc(STATE, K) STATE = SRC
CTR32, szyfrowanie i deszyfrowanie:
DST = SRC ^ enc(STATE, K) STATE[0] += 1