.. _z4-crypt: ================================== Zadanie 4: Akcelerator szyfrowania ================================== Data ogĹoszenia: 22.12.2020 Termin oddania: 26.01.2021 Archiwum z plikami: :download:`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 odczytu - ``0x40000018``: ``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 odczytu - ``0x4000001c``: ``DST_ADDR`` â adres bufora docelowego; jak wyĹźej - ``0x40000020``: ``COUNT`` â liczba blokĂłw do zaszyfrowania bÄ dĹş odszyfrowania, dostÄpny do zapisu i odczytu - ``0x40000024``: ``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 poza ``STATUS``); jeĹli 0, akcelerator zakoĹczyĹ wszystkie zlecone mu zadania i moĹźna wysĹaÄ kolejne - 1: ``ERROR`` â jeĹli 1, poprzednie zadanie zakoĹczyĹo siÄ bĹÄdem (ktĂłraĹ wychodzÄ ca transakcja AXI zwrĂłciĹa ``DECERR`` 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: 1. UĹźytkownik umieszcza dane w buforze ĹşrĂłdĹowym. 2. UĹźytkownik ustawia klucz w rejestrach ``K[0]..K[3]`` (moĹźe to pominÄ Ä, jeĹli klucz jest ten sam, co w poprzedniej operacji). 3. JeĹli uĹźywany tryb jest inny niĹź ``ECB``, uĹźytkownik ustawia wartoĹÄ poczÄ tkowÄ (``IV``) w rejestrach ``STATE[0], STATE[1]`` (moĹźe to pominÄ Ä, jeĹli chce kontynuowaÄ poprzedniÄ operacjÄ). 4. UĹźytkownik ustawia adresy buforĂłw i dĹugoĹÄ operacji w rejestrach ``SRC_ADDR, DST_ADDR, COUNT``. 5. UĹźytkownik zapisuje ĹźÄ dany tryb operacji do rejestru ``TRIGGER``, tym samym startujÄ c operacjÄ. 6. UrzÄ dzenie rozpoczyna pracÄ, wczytuje bloki danych z bufora ``SRC_ADDR`` i zapisuje je do bufora ``DST_ADDR``. 7. UĹźytkownik czyta w pÄtli rejestr ``STATUS`` aĹź bit ``BUSY`` bÄdzie rĂłwny 0. 8. UĹźytkownik zbiera dane z bufora docelowego. 9. 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