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
CBC2: tryb
CFB3: 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łaDECERRbą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_ADDRi zapisuje je do buforaDST_ADDR.Użytkownik czyta w pętli rejestr
STATUSaż bitBUSYbę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