DIPLOMOVÁ PRÁCA. Technická univerzita v Košiciach Fakulta elektrotechniky a informatiky Katedra elektroniky a multimediálnych telekomunikácií

Veľkosť: px
Začať zobrazovať zo stránky:

Download "DIPLOMOVÁ PRÁCA. Technická univerzita v Košiciach Fakulta elektrotechniky a informatiky Katedra elektroniky a multimediálnych telekomunikácií"

Prepis

1 Technická univerzita v Košiciach Fakulta elektrotechniky a informatiky Katedra elektroniky a multimediálnych telekomunikácií DIPLOMOVÁ PRÁCA Využitie SIMD a VLIW architektúry signálových procesorov Analog Devices v kryptografických algoritmoch SHA-384, SHA-512 a expanzii kľúča AES-Rijndael Košice, máj 2003 Anton Karabinoš

2 Čestné prehlásenie Prehlasujem, že som diplomovú prácu vypracoval samostatne s využitím uvedenej odbornej literatúry. V Košiciach, máj vlastnoručný podpis

3 Abstrakt Prezentovaná diplomová práca sa zaoberá využitím SIMD a VLIW architektúry signálových procesorov Analog Devices v kryptografických algoritmoch SHA- 384, SHA-512 a expanzii kľúča AES-Rijndael. Celý prístup bol postavený na predpoklade optimalizovať navrhnutú implementáciu z hľadiska rýchlosti a požiadavkov na pamäť. Hlavným prínosom tejto práce je ponuka metód pre implementáciu spomínaných kryptografických algoritmov na DSP. Spomínané metódy môžu nájsť uplatnenie v oblasti ďalšej implementácie programov pre ochranu dát na DSP. Abstract Presented thesis deals with the application of SIMD and VLIW architectures of Analog Devices DSP in SHA-384, SHA-512 and AES-Rijndael key-expansion cryptographic algorithms. Our approach is based on an assumption to optimise designed implementation from sight of speed and memory requirement. The main contribution of this thesis is the proposal of methods for implementation mentioned cryptographic algorithm on DSP. The mentioned above methods are can be useful for other implementation of programs in area of data protection on DSP.

4 Poďakovanie Týmto sa chcem poďakovať predovšetkým vedúcemu diplomovej práce Doc. Ing. M. Drutarovskému, CSc., ale i všetkým ostatným, za ich cenné rady a pripomienky, ktoré mi pomohli pri vypracovávaní tejto diplomovej práce. Vyjadrujem vďaku a uznanie svojim rodičom za podporu počas celého štúdia na Fakulte elektrotechniky a informatiky Technickej univerzity v Košiciach..

5 Zoznam skratiek AES Advanced Encryption Standard šifrovací štandard, nástupca šifrovacieho algoritmu DES. ALU Arithmetic Logic Unit aritmeticko-logická jednotka. Táto časť výpočtovej jednotky vykonáva aritmetické a logické operácie na vstupných dátach. DES Data Encryption Standard šifrovací algoritmus, predchodca AES. DMA Direct Memory Access mód s priamym prístupom do pamäte, bez účasti procesora. GF2 8 Galois Field galoisove pole s 256 prvkami. IALU Integer Arithmetic Logic Unit celočíselná aritmeticko-logická jednotka. Long Word operand o dĺžke 64-bitov, tvoria ho dve 32-bitové operandy. NIST National Institute of Standards and Technology Národný ústav pre štandardizáciu a technológie. PEx Processing Element x primárna výpočtová jednotka procesora. PEy Processing Element y sekundárna výpočtová jednotka procesora. Quad Word operand o dĺžke 128-bitov, tvoria ho štyri 32-bitové operandy. RISC Reduced Instruction Set Computer procesor s redukovanou inštrukčnou sadou. SHARC Super Harvard Architecture super harvardská architektúra procesora. SIMD Single Instruction Multiple Data režim procesora, keď sa v oboch jeho výpočtových jednotkách vykonáva rovnaká inštrukcia, ale nad rôznymi vstupnými dátami. SISD Single Instruction Single Data režim procesora, keď sa inštrukcia vykonáva iba v jednej výpočtovej jednotke procesora. SHA Secure Hash Algorithm algoritmus pre výpočet odtlačku správy. VLIW Very Long Instruction Word typ architektúry procesora umožňujúci paralelný výkon viacerých inštrukcií v jednom takte procesora.

6 Obsah 1. Úvod Opis procesora ADSP TS101 TigerSHARC Technické prostriedky procesora Súbor registrov ALU Aritmeticko-logická jednotka Násobička Multiplier Posúvač Shifter Celočíselné ALU Integer ALU - IALU Branch Target Buffer BTB Programové prostriedky procesora Typ prístupov k dátam Výkon inštrukcií Predávanie parametrov medzi kódom v jazyku C a asemblérom Koncepcia písania knižníc Vývojové prostredie Hashovacie algoritmy SHA SHA Implementácia SHA-512 a SHA-384 na procesore ADSP Opis knižnice sha.dlb na procesore ADSP SHARC Implementácia SHA-512 a SHA-384 na procesore ADSP TS Opis knižnice sha.dlb na procesore ADSP TS Zhodnotenie implementácie SHA-384 a SHA Testovanie správnosti implementácie Expanzia kľúča v algoritme AES-Rijndael Implementácia expanzie kľúča na procesore ADSP Opis knižnice key_exp.dlb na procesore ADSP Implementácia expanzie kľúča na procesore ADSP TS Opis knižnice key_exp.dlb na procesore ADSP TS Zhodnotenie implementácie expanzie kľúča pre AES-Rijndael Testovanie správnosti implementácie Záver Zoznam použitej literatúry Zoznam príloh Zoznam obrázkov a tabuliek...46

7 FEI TU v Košiciach Diplomová práca Strana 1 1. Úvod V súčasnosti preniká využitie výpočtovej techniky do všetkých oblastí života človeka. Internet a počítačové siete, ponúkajú veľké možnosti ich využitia, no aj zneužitia. Do popredia sa tak dostáva problém ochrany informácii pred ich zneužitím, a to aby sa k týmto informáciám dostal len oprávnený používateľ. V tejto oblasti nachádzajú uplatnenie hashovacie algoritmy Secure Hash Algorithm, ktorých úlohou je zaručiť, že prijatá informácia nebola počas prenosu pozmenená. Slúži nato výpočet tzv. odtlačku správy message digest. V oblasti utajenia prenášaných dát je významným predstaviteľom kryptografický algoritmus AES Advanced Encryption Standard, ktorý je nástupcom algoritmu DES Data Encryption Standard. Keďže parametre algoritmu DES napr. dĺžka kľúča už nepostačovali pre spoľahlivé utajenie obsahu šifrovaného textu a vzhľadom na vysoký nárast výpočtovej výkonnosti počítačov, bola národným ústavom pre štandardizáciu a technológie NIST-National Institute of Standards and Technology vyhlásená súťaž, ktorej cieľom bolo nájsť nástupcu algoritmu DES. Výhercom bol algoritmus Rijndael a teda sa stal základom pre algoritmus AES. Cieľom diplomovej práce je overiť možnosti využitia SIMD a VLIW architektúry digitálnych signálových procesorov ADSP SHARC a ADSP TS101 TigerSHARC pri implementácii algoritmov SHA-384, SHA-512 a expanzii kľúča v algoritme AES Rijndael. Pri implementácii bude kladený dôraz na čo najväčšie využitie výpočtového výkonu procesora a na čo najmenšie nároky navrhnutých knižničných funkcií na pamäť procesora. Výsledné knižnice budú taktiež obsahovať funkcie pre výpočet algoritmov SHA-1, SHA-256 a funkcie pre šifrovanie a dešifrovanie v algoritme AES-Rijndael. Návrh týchto funkcií je cieľom inej diplomovej práce [4]. V úvodnej časti diplomovej práce budú stručne opísané technické a programové prostriedky procesora ADSP TS101 TigerSHARC. Opis procesora ADSP SHARC je možné nájsť v [4]. Nasledujúca časť diplomovej práce je venovaná stručnému vysvetleniu činnosti implementovaných algoritmov spolu s popisom implementácie týchto algoritmov na oboch typoch procesorov. V diplomovej práci sú taktiež opísané dosiahnuté výsledky implementácie šifrovacích algoritmov na danom procesore, ako je výkon a pamäťové nároky navrhnutých knižničných funkcií. Dosiahnuté výsledky, ako aj stručný opis procesora TigerSHARC budú prezentované v rámci www stránky DSP laboratória.

8 FEI TU v Košiciach Diplomová práca Strana 2 2. Opis procesora ADSP TS101 TigerSHARC TigerSHARC je 128-bitový digitálny signálový procesor, ktorý patrí do druhej generácie výkonných procesorov od firmy Analog Devices [8]. Popis jeho predchodcu, procesora ADSP SHARC je obsiahnutý v [4] a [5]. Vysoký výpočtový výkon tohoto procesora je dosiahnutý za pomoci viacerých výpočtových jednotiek, ktoré môžu pracovať v aritmetike s pevnou aj pohyblivou rádovou čiarkou a vďaka veľkej šírke inštrukčného slova VLIW. Procesor TigerSHARC obsahuje na čipe 6-Mbit SRAM, integrované I/O periférie, rozhranie pre pripojenie ďalšieho procesora, DMA kontrolér, linkové porty a spoločnú zbernicu pre podporu vytvárania viacprocesorových systémov. Procesor pracuje s dvoj-cyklovým zreťazením v prípade aritmetických operácii. Zreťazenie v prípade vetvenia je od dvoch do šiestich cyklov. Pre zníženie oneskorenia v prípade vetvenia procesor obsahuje Branch Target Buffer BTB. Vysvetlenie jeho činnosti sa nachádza v kapitole Veľká šírka inštrukčného slova umožňuje procesoru vykonať v jednom takte až štyri 32-bitové inštrukcie. Kvôli maximálnemu využitiu programovej pamäte, sú inštrukcie zapisované do pamäte za sebou a nie sú v nej zarovnávané, podľa toho ako sú zapísané v inštrukčnom riadku. Táto vlastnosť je ilustrovaná na nasledujúcom obrázku. Obr. 1.1: Zápis inštrukcií v pamäti procesora 6-Mbit-ová interná pamäť je rozdelená na tri 128-bitové pamäťové bloky. Každý tento pamäťový blok je pripojený pomocou jednej z troch dátových/adresových zberníc. Toto delenie pamäte do blokov umožňuje v jednom cykle pristúpiť ku každému pamäťovému bloku. Pre komunikáciu s vonkajším prostredím, procesor obsahuje externý port so 64- bitovou zbernicou, štyri linkové porty s hardvérovou podporou dvojsmernej komunikácie, štyri DMA kanály a podporu pre spoluprácu viacerých procesorov.

9 FEI TU v Košiciach Diplomová práca Strana 3 Obr. 1.2: Bloková schéma procesora ADSP TS Technické prostriedky procesora Procesor obsahuje dve výpočtové jednotky. Každá jednotka obsahuje súbor tridsiatich dvoch 32-bitových registrov a tri nezávislé výpočtové jednotky: aritmetickologickú jednotku ALU, násobičku multiplier a posúvač shifter. Výpočtové jednotky, môžu vykonávať výpočty nezávisle na sebe, alebo spoločne, v SIMD móde. Procesor môže v jednom inštrukčnom cykle spracovať až dve inštrukcie pripadajúce na jednu výpočtovú jednotku. Výpočtové jednotky môžu spracovávať dáta vo viacerých formátoch s pevnou a pohyblivou rádovou čiarkou: Formáty s pevnou rádovou čiarkou Fixed-point format 64 bitový formát long, 32 bitový formát word, 16 bitový formát short a byte. Formáty s pohyblivou rádovou čiarkou Floating-point format jednoduchý 32- bitový a 40-bitový formát s pohyblivou rádovou čiarkou. Jednoduchý formát je štandartný IEEE 754/854 formát, zatiaľ čo 40-bitový formát zaberá 64 bitov, a má osem dodatočných LSB bitov mantisy, kvôli dosiahnutiu lepšej presnosti.

10 FEI TU v Košiciach Diplomová práca Strana 4 Obr. 2.1: 32-bitový formát s pohyblivou rádovou čiarkou Obr. 2.2: 40-bitový formát s pohyblivou rádovou čiarkou Súbor registrov Procesor obsahuje spolu 128 univerzálnych 32-bitových registrov. Každá výpočtová jednotka obsahuje 32 registrov, označených podľa príslušnosti k danej jednotke ako xr, resp. yr. Okrem týchto jednotiek aj jednotky IALU obsahujú každá po 32 registrov označovaných ako J, resp. K podľa príslušnosti k danej celočíselnej ALU. Rozmiestnenie registrov je znázornené na obr Tieto univerzálne 32-bitové registre, ktoré obsahuje každá výpočtová jednotka sú určené na prenos dát medzí výpočtovými jednotkami a zbernicami, a taktiež na uloženie pomocných výsledkov. Inštrukcie umožňujú prístup k registrom individuálne single, prípadne k dvom dual alebo štyrom registrom quad súčasne. načítanie do jedného registra: xr23=[j4+=1];; načítanie do dvoch registrov súčasne: xr23:22=l[j4+=2];; načítanie do štyroch registrov súčasne: xr23:20=q[j4+=2];;

11 FEI TU v Košiciach Diplomová práca Strana 5 Obr. 2.3: Súbor univerzálnych registrov procesora ALU Aritmeticko-logická jednotka Úlohou tejto jednotky je vykonávanie štandartných aritmetických a logických operácii v oboch formátoch vstupných operandov, s pevnou aj pohyblivou rádovou čiarkou. Typické príklady inštrukcií: sčítanie obsahu registrov Rm a Rn: Rs = Rm + Rn odčítanie obsahu registrov Rm a Rn: Rs = Rm Rn logický súčin obsahu registrov Rm a Rn: Rs = Rm AND Rn logický súčet obsahu registrov Rm a Rn: Rs = Rm OR Rn porovnanie obsahu registrov Rm a Rn: COMP Rm, Rn výpočet absolútnej hodnoty z obsahu registra Rm: Rs = ABS Rm súčasne sčítanie a odčítanie obsahu registrov Rm a Rn: Rs = Rm + Rn, Ra = Rm Rn extrakcia mantisy: Rs = MANT FRn

12 FEI TU v Košiciach Diplomová práca Strana Násobička Multiplier Táto jednotka vykonáva násobenie s pevnou a pohyblivou rádovou čiarkou, a v prípade operácií s dátami v pevnej rádovej čiarke aj MAC operácie Multiply-and- Accumulate, kedy sa vykoná operácia násobenia a sčítania. Typické príklady inštrukcií: násobenie obsahov registrov Rm a Rn: Rs = Rm * Rn MAC operácia, vynásobí obsahy Rm a Rn a výsledok sčíta s obsahom Mr: Mr += Rm * Rn MAC operácia, vynásobí obsahy Rm a Rn a výsledok odčíta od obsahu registra Mr: Mr -= Rm * Rn MAC operácia, vynásobí komplexné hodnoty v registroch Rm a Rn, a výsledok pripočíta k obsahu registra Mr: Mr += Rm ** Rn Posúvač Shifter 64-bitový posúvač vykonáva operácie logického a aritmetického posunu, bitovú manipuláciu, výber a vkladanie bitov do registra. Príklady inštrukcií: logický posun obsahu registra Rm o počet bitov udaných hodnotou v registri Rn: Rs = LSHIFT Rm BY Rn aritmetický posun obsahu registra Rm o počet bitov udaných hodnotou v registri Rn: Rs = ASHIFT Rm BY Rn rotácia obsahu registra Rm o počet bitov daný hodnotou v registri Rn: Rs = ROT Rm BY Rn extrakcia bitov z registra Rm, počet bitov a ich pozícia v registri Rm je daná hodnotou v registri Rn: Rs = FEXT Rm BY Rn Celočíselné ALU Integer ALU - IALU Tieto jednotky poskytujú pamäťové adresy, keď sú dáta prenášané medzi pamäťou a registrami. Umožňujú výkon výpočtových operácii s maximálnou efektivitou, keďže výpočtové jednotky sa môžu sústrediť len na spracovanie dát. Dve IALU umožňujú simultánne adresovať viacero operandov pre čítanie alebo zápis. Každá IALU má súbor 32 registrov, ktorých šírka je 32-bitov. Operácie, ktoré sú vykonávané v IALU niesu zreťazené. Tieto adresovacie jednotky, umožňujú pre-modify alebo post-modify adresovanie, a taktiež implementáciu kruhových bufrov. V prípade pre-modify adresovania je hodnota v registri ktorý je použitý na adresovanie upravená

13 FEI TU v Košiciach Diplomová práca Strana 7 pred načítaním dát, pri post-modify adresovaní je táto hodnota upravená až po načítaní dát. Pri nepriamom adresovaní, môže byť jeden register modifikovaný buď iným registrom zo súboru registrov IALU, alebo priamo 8, prípadne 32-bitovou hodnotou. Pre implementáciu kruhových bufrov je možné použiť prvé štyri registre z každej IALU. Príklady inštrukcií: príklady budú uvádzané iba pre JALU, to však neznamená, že tie isté operácie nie je možné realizovať pomocou jednotky KALU. post-modify adresovanie: Rs = [j8 += 8] pre-modify adresovanie: Rs = [j8 + 8 ] sčítanie obsahu registrov Jm a Jn: Js = Jm + Jn odčítanie obsahu registrov Jm a Jn: Js = Jm Jn porovnanie obsahu registrov Jm a Jn: COMP Jm, Jn logický súčin obsahov registrov Jm a Jn: Js = Jm AND Jn rotácia obsahu registra Jm o jeden bit vpravo: Js = ROTR Jm rotácia obsahu registra Jm o jeden bit vľavo: Js = ROTL Jm logický posun obsahu registra Jm o jeden bit vpravo: Js = LSHIFT Jm Branch Target Buffer BTB Úlohou tohto bufra je znížiť výkonové straty procesora, ktoré vnikajú v dôsledku vetvenia programu. Štruktúra tohto bufra je znázornená na nasledujúcom obrázku. Obr. 2.4: Štruktúra BTB

14 FEI TU v Košiciach Diplomová práca Strana 8 Každá inštrukcia vetvenia, ktorá využíva predikciu môže byť zapísaná do BTB. Hodnota PC Program Counter inštrukčného riadku, v ktorom nastáva vetvenie sa zapisuje do časti TAG a cieľová adresa do časti TARGET. Princíp činnosti je nasledujúci, BTB sleduje adresy inštrukcií pri ich čítaní z pamäte. Ak detekuje inštrukciu, ktorá už spôsobila vetvenie počas doterajšieho behu programu, adresa v časti TAG je zhodná s adresou v PC, nahradí hodnotu v PC hodnotou TARGET v BTB. Takto sa začínajú dekódovať inštrukcie od adresy TARGET. Ak bola predikcia správna a nastalo vetvenie, výkonové straty procesora sú redukované zo šiestich, prípadne troch stall cyklov na nulu. Do BTB bufra sú ukladané iba vetvenia v rámci internej pamäte procesora. 2.2 Programové prostriedky procesora Typ prístupov k dátam Inštrukcie umožňujú uloženie alebo načítanie jedného, dvoch alebo štyroch slov. Vo všeobecnosti v prípade načítavania štyroch slov quad-word musia byť tieto slova zarovnané tak aby ich pamäťová adresa bola deliteľná štyrmi a musia byť zoradené za sebou. To isté platí v prípade načítavania alebo zápisu dvoch slov long-word, v tomto prípade musí byť adresa deliteľná dvomi. načítanie jedného 32-bitového slova: xr23=[j4+=1];; načítanie do dvoch 32-bitových slov 64 bitov: xr23:22=l[j4+=2];; načítanie do štyroch 32-bitových slov: 128 bitov xr23:20=q[j4+=2];; Nie vždy je však možné a výhodné aby tieto slová boli zoradené za sebou, v tomto prípade je možné využiť dátový zarovnávací bufer DAB Data Alignment Buffer. Prístup pomocou DAB je možný len v prípade quad prístupu a len pre registre výpočtových jednotiek. DAB tvorí FIFO o veľkosti dvoch quad slov 256 bitov. Pri čítaní z pamäte do DAB sú dáta zarovnávané podľa požiadaviek v prípade quad prístupu musia byť čítané štyri slova za sebou, od adresy deliteľnej štyrmi. Zatiaľ čo prenos z DAB do registra už nieje zarovnávaný podľa adresy. Nezarovnané dáta sú tvorené z dát z predchádzajúcej transakcie medzi DAB a pamäťou a zo súčasného čítania z pamäte pomocou DAB. Pri čítaní z pamäte pomocou DAB je možné použiť iba registre J0 až J3, prípadne K0 až K3.

15 FEI TU v Košiciach Diplomová práca Strana Výkon inštrukcií Procesor TigerSHARC môže vykonať až štyri inštrukcie z jedného pamäťového bloku v jednom cykle vďaka 128 bitovému prístupu. Táto vlastnosť, vykonať viacero inštrukcií v jednom cykle, vychádza z jeho static superscalar architektúry. Tento typ architektúry je odlišný od superscalar architektúry, pretože v tomto prípade inštrukcie, ktoré sú vykonané v jednom cykle určuje programátor alebo kompilátor, a nie hardvér. V prípade procesora TigerSHARC nedochádza k žiadnej úprave poradia vykonávaných inštrukcií. Závislosti medzi použitými registrami sú zisťované hardvérom a v prípade nutnosti sú generované tzv. stall cykly. Sú to cykly procesora, kedy procesor čaká, kým budú k dispozícii výsledky predchádzajúcich inštrukcií potrebné na výkon danej inštrukcie. Proces načítavania, dekódovania a výkonu inštrukcií predstavuje osem cyklov procesora TigerSHARC. Spracovanie inštrukcií je zreťazené, pričom v jednom cykle je vykonaný jeden inštrukčný riadok Predávanie parametrov medzi kódom v jazyku C a asemblérom Parametre funkcií sa pri prechode medzi jazykom C a asemblérom nachádzajú v zásobníku. Prvé štyri parametre sú naviac predávané aj formou registrov. To v ktorých registroch budú uložené parametre funkcie, závisí od ich typu. V tabuľke 2.1 sú uvedené typy parametrov a príslušné registre, ktoré slúžia na ich predávanie. Pre predávanie návratových hodnôt sa používajú registre J8 alebo xr8 a xr9. To ktorý register sa použije závisí rovnako ako v prípade vstupných parametrov od typu návratovej hodnoty. Použitý register Parameter typ int alebo smerník typ float alebo double parameter 1 J4 xr4 parameter 2 J5 xr5 parameter 3 J6 xr6 parameter 4 J7 xr7 Tab. 2.1: Predávanie parametrov funkcie

16 FEI TU v Košiciach Diplomová práca Strana Koncepcia písania knižníc Pri tvorbe knižníc je výhodné použiť kombináciu jazyka C a asembléru. Použitie jazyka C umožní jednoduchšie volanie a deklaráciu funkcií knižnice. Nemalou výhodou je taktiež to, že kód je prehľadnejší ako v prípade použitia iba asembléru. Na druhej strane napísanie jadra knižnice v asembléry zníži jej náročnosť na počet cyklov procesora. V prípade implementácie kryptografických algoritmov, ktorá je cieľom tejto diplomovej práce bude použitá práve kombinácia jazyka C a asembléru. Funkcie budú deklarované v jazyku C, ale samotné telo funkcie bude tvorené asemblérom Vývojové prostredie Pri tvorbe knižníc bude použitá najnovšia verzia vývojového prostredia VisualDSP++. Ide o softvérový balík od firmy Analog Devices. V súčasnosti sa prechádza na verziu 3.0 tohto systému. Verzia VisualDSP bola vyvinutá, aby umožnila vývojovým pracovníkom vytvárať ich aplikácie rýchlejšie a s novou flexibilitou. Už s uvedením VisualDSP firma Analog Devices spojila vývojové prostredie, komponenty ako napr. DSP knižnice, plne integrovaný IDE/debuger, možnosť výberu medzi C/C++ a asemblérom, konfigurovateľný linker/loader a najnovší komponent VisualDSP++ Kernel VDK, vďaka ktorému dostali vývojári do rúk nástroj, ktorý urýchľuje vytváranie aplikácii založených na DSP. VDK je malý a prispôsobiteľný operačný systém reálneho času špeciálne vytvorený na efektívnu prácu so signálovými procesormi firmy Analog Devices. Základnými časťami vývojového prostredia sú: Integrované vývojové prostredie IDE poskytuje flexibilnú správu projektu pre vývoj aplikácii pre DSP. IDE umožňuje prístup k všetkým aktivitám nevyhnutným pre vývoj a ladenie aplikácii. Pomocou editora možno vytvárať a meniť zdrojové súbory a listovať v mape súborov, ktoré obsahuje daný projekt. Vývojové prostredie umožňuje prístup k C/C++ kompilátoru, C/C++ knižniciam, asembléru, linkéru, loaderu a spliteru. Nastavenie týchto nástrojov je možné v špeciálnom okne, pričom tieto nastavenia môžu byť definované pri vytváraní projektu, alebo môžu byť podľa potreby kedykoľvek zmenené. Spúšťanie a nastavovanie týchto nástrojov je možné aj z príkazového riadku. VisualDSP++ debuger má jednoduché rozhranie, ktoré je spoločné pre všetky simulátory a emulátory, ktoré sú dostupné od firmy Analog Devices. V debugery je možné nastavovať breakpointy, pozorovať a nastavovať obsahy pamäte a vybraných registrov. Registre je možné vybrať podľa príslušnosti k danej časti hardvéru DSP, alebo je možné si dať zobrazovať obsahy registrov podľa vlastného výberu. Táto možnosť uľahčuje hľadanie a odstraňovanie chýb v aplikácii. Debuger, ak je použitý

17 FEI TU v Košiciach Diplomová práca Strana 11 so simulátorom dokáže generovať vstupy, výstupy a prerušenia ktoré umožňujú simulovať podmienky v akých bude daná aplikácia pracovať v reálnom prostredí. Podpora multiprocesorových systémov umožňuje užívateľovi paralelne pracovať so všetkými procesormi v systéme. Poskytuje možnosť zastavenia, krokovania a spustenia ktoréhokoľvek procesora. Užívateľ má možnosť nechať si zobraziť vo vývojovom prostredí obsahy registrov alebo pamäte jednotlivých procesorov v systéme. Statistical profiling táto unikátna vlastnosť VisualDSP++ umožňuje tvorcovi softvéru rýchlo a efektívne zistiť, ktoré časti kódu najviac zaťažujú procesor, a teda najviac spomaľujú výkon aplikácie. Programátor sa potom môže plne sústrediť nato, ako tieto časti kódu čo najviac zefektívniť. Pipeline Viewer umožňuje zobraziť tok inštrukcií. Zobrazenie zreťazenia umožňuje lepšie pochopiť okolnosti kvôli ktorým vznikajú pri vykonávaní programu stall cykly a následne optimalizovať zdrojový kód.

18 FEI TU v Košiciach Diplomová práca Strana Hashovacie algoritmy 3.1 SHA-512 Tento algoritmus slúži na kompresiu vstupných dát a jeho výsledkom je 512 bitový obsah z týchto dát, tzv. odtlačok správy message digest. SHA-512 pracuje s 1024 bitovým vstupným blokom šestnásť 64 bitových slov a 512 bitovou inicializačnou hashovacou konštantou osem 64 bitových slov. Hodnoty týchto inicializačných slov sú nasledujúce: H 0 1 H 0 2 H 0 3 H 0 4 H 0 5 H 0 6 H 0 7 H 0 8 = 6A09E668F3BCC908 = BB67AE8584CAA73B = 3C6EF372FE94F82B = A54FF53A5F1D36F1 = 510E527FADE682D1 = 9B05688C2B3E6C1F = 1F83D9ABFB41BD6B = 5BE0CD19137E2179 Pred spracovaním sa vstupný blok formátuje na požadovaný tvar. Celá správa sa rozdelí na 1024 bitové vstupné bloky, ktoré sú postupne spracovávané. V poslednom vstupnom bloku je na koniec správy doplnený jednotkový zakončovací bit. Za týmto bitom sa doplní správa nulami tak, aby platila rovnica: počet informačných bitov v poslednom bloku + zakončovací bit + k-nulových bitov = 896 K takto upravenému bloku sa nakoniec pripojí 128 bitový údaj o celkovej dĺžke hashovanej správy. Pripojením informácie o dĺžke dostávame posledný 1024 bitový vstupný blok. Pri tomto formátovaní môžu nastať tieto špeciálne prípady: počet informačných bitov v poslednom bloku je rovný 1024, v tomto prípade je potrebné spracovať ešte jeden 1024 bitový blok, ktorý obsahuje zakončovací bit, 895 nulových bitov a 128 bitovú informáciu o dĺžke hashovanej správy. počet informačných bitov v poslednom bloku je viac ako 895 a teda po pridaní zakončovacieho bitu, nezostáva dostatok miesta na doplnenie 128 bitov s informáciou o dĺžke správy. V tomto prípade sa posledný vstupný informačný blok doplní nulami na dĺžku 1024 bitov a vytvorí sa ďalší vstupný blok, ktorý bude obsahovať 896 nulových bitov a 128 bitov s dĺžkou správy.

19 FEI TU v Košiciach Diplomová práca Strana 13 počet informačných bitov je rovný 895, po pridaní zakončovacieho bitu sa už nepridávajú žiadne nulové bity, čiže k=0. Za zakončovací bit sa pridá 128 bitová informácia o dĺžke správy. Pred samotným výpočtom sa vstupné 1024 bitové bloky rozdelia na šestnásť 64 bitových slov. Postup spracovania jedného 1024 bitového bloku Mj i je nasledujúci: Zo šestnástich vstupných slov je vypočítaných ďalších 64 slov. Postup expanzie zo šestnástich vstupných slov na osemdesiat je opísaný v nasledujúcich vzťahoch: i Wj = Mj pre j = 0, pre { Wj σ } j = 16 až 79 1 W j 2 + W j 7 + σ 0 W j 15 + W j 16 Pričom funkcie σ 1 a σ 0 sú definované nasledovne: σ 0 1 x = S σ x = S 1 10 x S 8 x S x R 61 7 x R x 6 x kde: S 1 x - predstavuje rotáciu 64 bitového slova o 1 bit vpravo R 7 x - predstavuje logický posun 64 bitového slova o 7 bitov vpravo Po expanzii vstupných slov, dochádza ich k spracovávaniu v hlavnej slučke, ktorá je definovaná: inicializujú sa registre a = H i 1 1 b = H i 1 2 L h = H i 1 8 v prípade že ide o spracovanie prvého bloku, výrazy i 1 predstavujú inicializačné konštanty pre SHA-512 alebo SHA-384, v opačnom prípade tieto výrazy predstavujú výsledok hashovania predchádzajúceho 1024 bitového bloku H j

20 FEI TU v Košiciach Diplomová práca Strana 14 pre až 79 = 0 j { ,,,,,,,, T T a a b b c c d T d e e f f g g h c b a Maj a T Wj Kj g f e Ch e h T e S e S e S e a S a S a S a AND c b AND c a a AND b c b a Maj e AND g e AND f g f e Ch = = = = výraz prestavuje jednu z osemdesiatich 64-bitových konštánt, ktoré sú definované v [1] K j } Po ukončení slučky sa pomocou nasledujúcich vzťahov určia hashovacie konštanty pre nasledujúci blok: i i i i i i H h H H b H H a H L Po spracovaní celej správy hashovacie konštanty, ktoré vypočítame po spracovaní posledného bloku predstavujú odtlačok správy:,,,,,,, N N N N N N N N N H H H H H H H H H = 3.2 SHA-384 Tento algoritmus je identický s algoritmom pre SHA-512 s dvoma rozdielmi: 1. sú definované iné inicializačné konštanty: H 1 0 = CBBB9D5DC1059ED8 H 2 0 = 629A292A367CD507 H 3 0 = A3070DD17 H 4 0 = 152FECD8F70E5939 H 5 0 = FFC00B31 H 6 0 = 8EB44A H 7 0 = DB0C2E0D64F98FA7 H 8 0 = 47B5481DBEFA4FA4 2. výsledok hashovania posledného bloku je skrátený na 384 bitov:,,,,, i i i i i i N H H H H H H H =

21 FEI TU v Košiciach Diplomová práca Strana Implementácia SHA-512 a SHA-384 na procesore ADSP Pri implementácii hashovacich algoritmov na tomto procesore, bolo potrebné vyriešiť problém realizácie aritmeticko-logických operácii na 64 bitových vstupných slovách, keďže tento procesor pracuje s 32 bitovými operandami. Vzhľadom nato, je počet cyklov potrebných na spracovanie jedného bloku, asi trikrát väčší ako v prípade spracovania toho istého bloku na procesore TigerSHARC. V nasledujúcom texte bude opísaná knižnica, ktorej vypracovanie bolo jedným z cieľov tejto diplomovej práce. Táto knižnica obsahuje viacero funkcií, ktoré budú opísane v poradí v akom sú volané pri výpočte odtlačku správy. Pre realizáciu výpočtu oboch algoritmov SHA-384 a SHA-512 sa používajú tie isté funkcie. Opis činnosti funkcií pre výpočet odtlačkov správy podľa algoritmu SHA-1 a SHA-256, ktoré sú tiež súčasťou knižnice sa nachádza v [4]. Vytvorená knižnica a zdrojové súbory jednotlivých funkcií sa nachádzajú na priloženom CD. Zdrojové kódy všetkých funkcií sú plne komentované v anglickom jazyku. 4.1 Opis knižnice sha.dlb na procesore ADSP SHARC Ako prvá bude opísaná funkcia, ktorej úlohou je inicializácia hashovacích konštánt, pred začiatkom spracovania prvého bloku správy. Deklarácia tejto funkcie je nasledujúca: void SHA512_384_Init unsigned int dm *Hash_Constant, size_t dm Digest_Length; Vstupné parametre tejto funkcie sú: smerník na miesto dátovej v pamäti, kde majú byť uložené inicializačné hashovacie konštanty. Zároveň je to miesto, kde budú po spracovaní bloku uložené nové vypočítané hashovacie konštanty. V pamäti je potrebné vyhradiť miesto pre šestnásť 32 bitových konštánt, keďže procesor nedokáže pracovať so 64 bitovými vstupmi. Každá z ôsmych inicializačných konštánt zaberá dve pamäťové miesta. druhým parametrom funkcie je dĺžka odtlačku správy, tento parameter môže nadobúdať dve hodnoty a to 512, ak ide o výpočet podľa algoritmu SHA-512, alebo 384 ak ide o výpočet podľa algoritmu SHA-384. Podľa hodnoty tohto parametra sú použité na inicializáciu buď inicializačné konštanty pre SHA-512 alebo pre SHA- 384.

22 FEI TU v Košiciach Diplomová práca Strana 16 V tele funkcie sú podľa toho akú hodnotu nadobúda parameter funkcie Digest_Length nakopírované inicializačné konštanty na pamäťové miesto dané parametrom Hash_Constant. Čítanie a zápis konštánt prebieha v SIMD móde. Ďalšou funkciou knižnice je funkcia, ktorá realizuje hashovanie úplného 1024 bitového bloku správy. Táto funkcia realizuje hlavný výpočet a všetky ostatné funkcie slúžia len na prípravu vstupných parametrov pre túto funkciu. Deklarácia tejto funkcie je nasledovná: void SHA512_384_1024bit_Block unsigned int dm *Block, unsigned int dm *Hash_Constant; Vstupné parametre tejto funkcie sú nasledovné: prvým parametrom je smerník na vstupný 1024 bitový blok. Tento blok zaberá 32 pamäťových miest každé vstupné 64 bitové slovo zaberá dve pamäťové miesta v dátovej pamäti. Uloženie tohto bloku v dátovej pamäti je nevyhnutné pre správnu činnosť tejto funkcie. Funkcia predpokladá, že tento vstupný blok je naformátovaný, tak ako definuje algoritmus. Funkcia tento vstupný blok už nijako neupravuje. Požadovaný tvar vstupného bloku je na nasledujúcom obrázku. Obr. 4.1: Formát vstupného bloku druhým parametrom funkcie je smerník na miesto v pamäti, kde sa nachádzajú hashovacie konštanty, ktoré pripadajú na daný spracovávaný blok správy. Tieto konštanty musia byť taktiež uložené v dátovej pamäti. V prípade spracovávania prvého bloku správy ide o inicializačné konštanty, ak je spracovávaný j-ty vstupný blok správy ide o hashovacie konštanty, ktoré sú výsledkom spracovania j-1 vstupného bloku. V nasledujúcom texte bude vysvetlený spôsob činnosti tejto funkcie a to, ako boli realizované aritmeticko-logické operácie so 64 bitovým operandami, pomocou inštrukcií, ktoré pracujú s 32 bitovými vstupmi. Funkcia po zálohovaní registrov, u ktorých je potrebné obnoviť ich pôvodnú hodnotu pred návratom do jazyka C, nakopíruje 32 bitové slová zo vstupného poľa, do

23 FEI TU v Košiciach Diplomová práca Strana 17 pracovného poľa, ktorého veľkosť je 160 pamäťových miest. Táto veľkosť je daná tým, že po expanzii vstupných slov zo šestnásť na osemdesiat, bude každé slovo zaberať dve pamäťové miesta. Toto kopírovanie prebieha v SIMD móde, kedy sa načítajú v jednom cykle dve slova. Využitie SIMD módu redukuje počet cyklov potrebných na kopírovanie na polovicu. Po načítaní zo vstupného poľa dochádza k výmene obsahu registrov, do ktorých sa načítali vstupné slová medzi sebou, a k ich nasledovnému zápisu do pracovného poľa. Touto operáciou sa dosiahne toho, že v pracovnom poli sú jednotlivé slova zapísane v tvare ako je to znázornené na obr Obr. 4.2: Tvar zápisu slov v pracovnom poli Po nakopírovaní vstupných slov do pracovného poľa, funkcia vypočíta zvyšných 64 slov a zapíše ich do pracovného poľa. Pri výpočte týchto slov je potrebné realizovať podľa algoritmu operácie logického posunu a rotácie na 64 bitových slovách. Keďže procesor ADSP 21160, nemá v inštrukčnej sade inštrukcie, ktoré dokážu pracovať so 64 bitovými slovami, bolo potrebné realizovať tieto operácie ako postupnosť inštrukcií, ktoré pracujú s 32 bitovými slovami. To ako bola implementovaná rotácia, je opísané v nasledujúcom texte. V SIMD móde procesora sa načítajú dve 32 bitové slová, jedno do registra r v jednotke PEx Primary Processing Element a druhé do registra s v PEy Secondary Processing Element. Spôsob načítania je znázornený na obr Obr. 4.3: Spôsob načítania vstupných slov

24 FEI TU v Košiciach Diplomová práca Strana 18 Predpokladajme, že je potrebné zarotovať vstupné slovo o devätnásť bitov vpravo. Procesor je nastavený pre prácu v SIMD móde, kedy sa vykonáva identická operácia v oboch výpočtových jednotkách procesora, ale na rôznych vstupných dátach. Bližší popis je možné nájsť v [4]. V prvom kroku sa realizuje logický posun dolných aj horných 32 bitov o devätnásť bitov vpravo. r14=lshift r0 by -19; predpokladáme, že vstupné slovo sa nachádza v registroch r0 a s0, výsledok operácie bude v registroch r14 a s14. Po tejto operácii je potrebné urobiť opäť logický posun dolných aj horných 32 bitov o 13 bitov ale vľavo. r15=lshift r0 by 13; inštrukcia realizuje logický posun obsahu registrov r0 a s0 o trinásť bitov vľavo, a výsledok zapíše do registrov r15 a s15. Nasleduje výmena obsahov registrov r15 a s15, čím sa horných 32 bitov výsledku poslednej operácie dostane do registra r15, a naopak dolných 32 bitov do registra s15. r15 <-> s15; Ako posledná operácia sa vykoná sčítanie obsahov registrov r14 a r15, keďže procesor je stále v SIMD móde vykoná sa taktiež sčítanie obsahu registrov s14 a s15. Výsledok, teda rotácia vstupného 64 bitového slova sa nachádza v registroch r15 a s15. r15=r15 + r14; Celý tento postup je znázornený na obrázku 4.4.

25 FEI TU v Košiciach Diplomová práca Strana 19 Obr. 4.4: Realizácia rotácie na 64 bitových slovách Realizácia logického posunu vpravo, na 64 bitovom vstupnom slove je podobná realizácii rotácie. Naviac je tu potrebné vynulovať toľko bitov zo vstupného slova o koľko sa realizoval logický posun. Realizácia logického posunu je nasledovná, predpokladajme, že je potrebné realizovať logický posun o šesť bitov vpravo. Vykonáme rotáciu vstupného slova o šesť bitov, pričom výsledok tejto operácie bude v registroch r13 dolných 32 bitov a s13 horných 32 bitov. bit clr MODE1 PEYEN; prepneme procesor do SISD módu, nastavením bitu PEYEN v registri procesora MODE1 do nuly. r13 <-> s13; vymeníme obsah registrov r13 a s13 medzi sebou. Táto výmena prebieha ešte v SIMD móde, pretože na prechod medzi SISD a SIMD režimom procesora je potrebný jeden cyklus. Touto operáciou dostaneme horných 32 bitov do registra r13, a dolných 32 bitov do registra s13.

26 FEI TU v Košiciach Diplomová práca Strana 20 bit set MODE1 PEYEN; prepneme procesor späť do SIMD režimu, nastavením bitu PEYEN v registri MODE1 na jednotku. Keďže ide o logický posun, je potrebné vynulovať šesť MSB bitov v registri r13. Túto operáciu urobíme pomocou inštrukcie fext, ktorá vyberie z registra daný počet bitov od zadanej pozície a ostatné doplní nulami. r13=fext r13 by 0:26; do registra r13 sa uloží dvadsaťšesť bitov sprava z registra r13. Ostatné bity sa doplnia nulami. Činnosť tejto inštrukcie je znázornená na obrázku 4.5. Táto inštrukcia sa vykonáva ešte v SISD móde, kedy sa výpočet vykonáva iba v PEx. Nastavenie procesora pre prácu v SIMD móde sa prejaví až v nasledujúcej inštrukcii. r13 <-> s13; urobíme výmenu obsahu registrov r13 a s13. Táto výmena sa vykonáva v SIMD móde. Takto máme výsledok logického posunu v registroch r13 dolných 32 bitov a s13 horných 32 bitov. Pri realizácii logického posunu bolo potrebné nastavovať režim procesora pre prácu v SISD a v SIMD móde. Keďže zmena režimu sa prejaví až z jednocyklovým oneskorením, bolo potrebné upraviť algoritmus tak, aby pri tejto zmene nenastávali prázdne cykly procesora. To sa podarilo, a teda pri prechode medzi jednotlivými režimami procesora nevzniká žiadne oneskorenie. Obr. 4.5: Činnosť funkcie fext

27 FEI TU v Košiciach Diplomová práca Strana 21 V algoritme pre expanziu vstupných slov sa taktiež nachádza sčítanie 64 bitových slov, ktoré je realizované v aritmetike mod Tento problém, sa dal vyriešiť o niečo jednoduchšie ako v prípade rotácie, či logického posunu. V tomto prípade, bolo možné využiť inštrukciu procesora, ktorá pri sčítaní berie do úvahy prenos, ktorý nastal pri predchádzajúcom sčítaní. Sčítanie bolo teda realizované v dvoch krokoch, najprv sa vykonalo sčítanie dolných 32 bitov a potom sa sčítalo horných 32 bitov s prípadným prenosom, ak nastal pri sčítaní dolných 32 bitov. Celé sčítanie sa realizuje v SISD móde. V nasledujúcom texte je uvedený príklad realizácie sčítania. r14=r14+r9; do registra r14 sa uloží súčet obsahov registrov r14 a r9. Registre r14 a r9 obsahujú dolných 32-bitov sčítavaných operandov. r5=r15+r10+ci; do registra r5 sa uloží súčet obsahov registrov r15 a r10 plus prípadný prenos, ak nastal pri predchádzajúcom sčítaní. Registre r15 a r10 obsahujú horných 32-bitov sčítavaných operandov. Po expanzii vstupných slov, sa začína samotný výpočet hashovacích konštánt, podľa algoritmu. Tento výpočet je realizovaný v slučke, ktorá sa vykoná spolu osemdesiat krát. Počas jej vykonávania je procesor nastavený na prácu v SIMD móde, okrem častí, v ktorých sa vykonáva sčítanie mod Pre samotným začiatkom výkonu hlavnej slučky sa inicializačné konštanty pripadajúce pre daný spracovávaný blok, načítajú z pamäte do registrov. Načítavanie je vykonávané v SIMD móde, kedy sa dolných 32 bitov načítava do registrov primárnej výpočtovej jednotky PEx a horných 32 bitov sa načítava do registrov sekundárnej výpočtovej jednotky PEy. Po ukončení hlavnej slučky, sa nuluje obsah vstupného poľa a vypočítavajú sa nové hodnoty hashovacích konštánt, podľa pravidiel, ktoré sú definované v algoritme [1]. Tieto nové konštanty sa zapisujú na miesto v dátovej pamäti, určené smerníkom *Hash_Constant. Takto dôjde k prepisu starých konštánt novými. Poslednou funkciou, ktorá sa vykonáva pri výpočte odtlačku správy, je funkcia na spracovanie posledného bloku správy. Veľkosť tohto bloku môže byť menšia ako 1024 bitov.

28 FEI TU v Košiciach Diplomová práca Strana 22 Deklarácia tejto funkcie je nasledovná: void SHA512_384_Last_Blockunsigned int dm *Block, unsigned int dm *Hash_Constant, size_t dm Block_Length, unsigned int dm *Message_Length, size_t dm Digest_Length; Vstupné parametre tejto funkcie sú: prvým parametrom je smerník na spracovávaný blok. Tento blok musí byť rovnako ako v prípade funkcie na spracovanie úplného 1024 bitového bloku uložený v dátovej časti pamäte. Veľkosť tohto bloku môže byť maximálne 1024 bitov. druhým parametrom je smerník na miesto v dátovej časti pamäte, kde sa nachádzajú inicializačné hashovacie konštanty pre posledný blok. Ide o konštanty získané na základe spracovania predchádzajúcich blokov správy, alebo ak má správa iba jeden vstupný blok, v tomto prípade sú to konštanty definované algoritmom. tretím parametrom je dĺžka posledného bloku. Táto dĺžka musí byť zadaná v bitoch. Dĺžka posledného bloku môže byť v rozsahu 0 až 1024 bitov. ďalším parametrom je smerník na miesto v dátovej pamäti, kde je uložená celková dĺžka správy, ktorá musí byť taktiež zadaná v bitoch. Požiadavka zadania celkovej dĺžky správy v bitoch nie je nutná z hľadiska správnej činnosti tejto funkcie, ale kvôli požiadavkám algoritmu. Dĺžka správy musí byť v pamäti uložená v tomto tvare: bit bit bit bit Tento tvar zápisu je potrebný pre správne naformátovanie posledného bloku. posledným parametrom je zadanie dĺžky odtlačku správy v bitoch. Tento parameter, môže nadobúdať dve hodnoty, a to 512 ak ide o výpočet algoritmu SHA-512, alebo 384 ak ide o SHA-384. Funkcia na základe tohto parametra upraví vypočítaný odtlačok správy podľa definícií pre jednotlivé algoritmy. Na začiatku činnosti funkcia načíta svoje posledné dva vstupné parametre zo zásobníka. Tieto parametre sa nachádzajú v zásobníku, pretože priame odovzdávanie parametrov pomocou registrov medzi zdrojovým kódom v jazyku C a asemblérom je možné iba v prípade prvých troch parametrov. Tieto parametre sa nachádzajú v registroch primárnej výpočtovej jednotky PEx. Ide o registre r4, r8 a r12. Všetky hodnoty ostatných parametrov sa potom predávajú pomocou zásobníka. Bližší opis predávania parametrov sa nachádza v [7]. Po načítaní parametrov a výkone inštrukcií, ktoré sú nutné z hľadiska správnej spolupráce medzi jazykom C a asemblérom, funkcia zisťuje, či dĺžka posledného bloku nie je rovná 1024 bitom. V tomto prípade je volaná funkcia pre spracovanie plného bloku a formátovaný bude až ďalší spracovávaný blok.

29 FEI TU v Košiciach Diplomová práca Strana 23 r0=sha512_block_length; do registra r0 sa vloží konštanta 1024, ktorá predstavuje veľkosť bloku pre algoritmus SHA-512, resp. SHA-384. compur0,r12; porovná sa obsah registra r0 s obsahom registra r12, ktorý obsahuje údaj o dĺžke posledného bloku bit tst ASTAT ASTAT_AZ; testuje sa hodnota bitu AZ v registri ASTAT, ktorý sa nastaví na jednotku ak je hodnota v registri r12 rovnaká ako hodnota v registri r0. Na hodnotu tohto bitu sa nastaví testovací bit TF. if not TF jump Less_1024; ccall_sha512_384_1024bit_block; ak je hodnota bitu TF rovná jednej je volaná funkcia na spracovanie úplného bloku, keďže dĺžka posledného bloku je rovná Ak má bit TF hodnotu nula, znamená to, že dĺžka posledného bloku je menej ako 1024 bitov. Ak je dĺžka bloku menšia ako 1024 bitov, tento blok bude formátovaný podľa definície algoritmu. Na základe dĺžky posledného bloku funkcia zistí pozíciu posledného bitu správy a na nasledujúcu pozíciu doplní zakončovací bit. Po doplnení zakončovacieho bitu funkcia zisťuje, či je vo vstupnom poli dostatok miesta na doplnenie 128 bitovej informácie o celkovej dĺžke správy, teda či dĺžka posledného bloku bez zakončovacieho bitu je menšia ako 896 bitov. Ak táto podmienka nie je splnená, je volaná funkcia na spracovanie úplného bloku a dĺžka správy sa bude spracovávať až v nasledujúcom bloku. Ak má posledný blok menej ako 896 bitov, pridá sa informácia o dĺžke správy do posledných štyroch slov vstupného poľa a volá sa funkcia na spracovanie úplného bloku. Po jeho spracovaní, sa zisťuje či ide o výpočet odtlačku správy podľa algoritmu SHA-512 alebo SHA-384. Ak ide o algoritmus SHA-512, na mieste v dátovej pamäti, kde boli predtým inicializačné konštanty pre posledný blok sa teraz nachádza odtlačok správy. V prípade výpočtu odtlačku správy podľa algoritmu SHA-384, sa posledné dve hashovacie konštanty vynulujú, čím sa dosiahne orezanie odtlačku správy o 128 bitov zľava ako definuje algoritmus. Dĺžka odtlačku správy v tomto prípade bude 384 bitov a bude sa taktiež nachádzať na mieste v dátovej pamäti, kde boli predtým inicializačné konštanty pre posledný blok správy.

30 FEI TU v Košiciach Diplomová práca Strana Implementácia SHA-512 a SHA-384 na procesore ADSP TS101 Tento procesor na rozdiel od procesora ADSP SHARC umožňuje vykonávať aritmeticko-logické operácie na 64 bitových vstupoch. Táto vlastnosť výrazne znížila počet cyklov potrebných na spracovanie bloku správy. Tento procesor, však pracuje s osem úrovňovým zreťazením, ktoré zvyšuje zložitosť vývoja efektívne pracujúceho kódu. To, že výsledky nie sú k dispozícii, hneď v nasledujúcom cykle v niektorých prípadoch núti procesor čakať, čím zostáva časť jeho výpočtového výkonu nevyužitá. Počet cyklov procesora, kedy čakal na potrebné výsledky iných inštrukcií, sa nie vždy podarilo znížiť na nulu, no aj napriek tomu je výpočet odtlačku správy pomocou tohto procesora asi trikrát rýchlejší, čo sa počtu inštrukčných cyklov týka, ako v prípade procesora ADSP SHARC. Funkcie pre výpočet odtlačku správy podľa algoritmov SHA-512 a SHA-384 sú tie isté ako v prípade implementácie na ADSP Vytvorená knižnica a zdrojové súbory jednotlivých funkcií sa nachádzajú na priloženom CD. Zdrojové kódy všetkých funkcií sú plne komentované v anglickom jazyku. 5.1 Opis knižnice sha.dlb na procesore ADSP TS101 Podobne ako v prípade opisu knižničných funkcií pre procesor ADSP 21160, aj teraz budú funkcie opísané v poradí, v akom je nutné ich vykonávať pri výpočte odtlačku správy. Názvy funkcií, aj ich parametrov sú v prípade tejto knižnice zhodné s názvami použitými v prípade funkcií pre procesor ADSP Ako prvá bude opísaná činnosť funkcie na inicializáciu hashovacích konštánt, jej deklarácia je nasledovná: void SHA512_384_Init unsigned int dm *Hash_Constant, size_t dm Digest_Length; Vstupné parametre funkcie sú: prvým parametrom je smerník na adresu v pamäti, kde majú byť uložené inicializačné konštanty. Adresa pamäťového miesta, kde budú uložené tieto konštanty, musí byť deliteľná štyrmi, pretože funkcie knižnice využívajú tzv. quad word" prístup pri čítaní a zápise týchto konštánt. Pri tomto prístupe sa naraz načítavajú/zapisujú štyri 32-bitové slová do/zo susedných registrov napr. xr0 až xr3. Tento prístup je bližšie opísaný v kapitole, ktorá sa venuje opisu procesora TigerSHARC.

31 FEI TU v Košiciach Diplomová práca Strana 25 druhý parameter, slúži na určenie toho, podľa akého algoritmu sa bude vypočítavať odtlačok správy. Tento parameter môže nadobúdať dve hodnoty, 512 ak ide o algoritmus SHA-512, alebo 384 v prípade algoritmu SHA-384. Podľa algoritmu, ktorý sa použije na výpočet odtlačku správy sa nainicializujú hashovacie konštanty. Funkcia pri inicializácii využíva prístup do pamäte, pri ktorom je možné v jednom cykle načítať 128 bitov, čo v tomto prípade znamená dva inicializačné konštanty. Vďaka tomu sa zníži počet cyklov potrebných na inicializáciu, oproti procesoru ADSP o viac ako polovicu. Základnou funkciou, podobne ako v prípade implementácie pre procesor ADSP je funkcia na spracovanie úplného 1024 bitového bloku. Táto funkcia predpokladá, že vstupný blok, ktorý sa bude spracovávať je už naformátovaný podľa pravidiel, ktoré definuje algoritmus. Deklarácia tejto funkcie je: void SHA512_384_1024bit_Block unsigned int dm *Block, unsigned int dm *Hash_Constant; Vstupné parametre funkcie sú: prvým parametrom je smerník na vstupný blok, pre ktorý sa budú počítať hashovacie konštanty. Adresa tohto bloku v pamäti musí byť deliteľná dvomi, kvôli možnosti tzv. long word prístupu do pamäte procesora. Veľkosť bloku je 32 slov, čo predstavuje 1024 bitov. druhým parametrom funkcie je smerník na inicializačné hashovacie konštanty, ktoré pripadajú na daný spracovávaný blok. Tieto konštanty dostaneme ako výsledok spracovania predchádzajúceho bloku, alebo ak ide o prvý blok správy, sú tieto inicializačné konštanty definované algoritmom. Funkcia v prvom kroku nakopíruje 64 bitové slová zo vstupného bloku do pracovného poľa, ktorého veľkosť je 160 slov, čo predstavuje 5120 bitov. Veľkosť tohto poľa je odvodená od počtu slov, ktoré dostaneme ako výsledok expanzie vstupných 64 bitových slov. Počet slov po expanzii je osemdesiat, pričom každé slovo má 64 bitov. Jedno slovo teda v pamäti procesora zaberá dve pamäťové miesta, preto veľkosť pracovného poľa dostaneme ako dvojnásobok počtu slov. Pri kopírovaní slov zároveň dochádza k výmene pozície horných a dolných 32 bitov, tak že do pracovného poľa sa najprv zapíše dolných 32 bitov a na nasledujúcu pozíciu horných 32 bitov. Spôsob akým sú vstupné slová uložené v pracovnom poli dokumentuje obr Po prekopírovaní obsahu vstupného bloku do pracovného poľa, funkcia začne v slučke, vypočítavať zvyšných 64 slov. V tejto slučke bolo možné využiť VLIW architektúru procesora, ktorá umožňuje vykonať v jednom cykle až štyri inštrukcie. Táto vlastnosť procesora umožnila využiť obe výpočtové jednotky procesora, pričom

32 FEI TU v Košiciach Diplomová práca Strana 26 každá jednotka vykonávala inú operáciu. Týmto sa znížil počet cyklov potrebných na expanziu vstupných slov. Problém však spôsobovalo zreťazenie s ktorým pracuje procesor. Toto zreťazenie spôsobilo, že nie v každom inštrukčnom riadku bolo možné a efektívne využiť všetky štyri inštrukcie. Tým že výsledky operácii vykonaných v danom inštrukčnom riadku neboli k dispozícii v nasledujúcom inštrukčnom riadku, vznikali prázdne cykly procesora, kedy procesor čakal na potrebné výsledky, aby mohol vykonať dané inštrukcie. Preto bolo výhodné radšej vykonať v jednom inštrukčnom riadku menej inštrukcií, ale procesor potom pracoval plynulo, bez čakania na výsledky operácii. Popis spôsobu výkonu inštrukcii, a počet cyklov kedy je výsledok k dispozícii, je opísaný v prvej kapitole tejto diplomovej práce. V nasledujúcej tabuľke je uvedený údaj o počte cyklov procesora potrebných na spracovanie jedného bloku spolu s údajom o počte cyklov, kedy procesor čakal na potrebné údaje, kvôli zreťazeniu. Počet cyklov potrebných na spracovanie jedného bloku* Počet stall cyklov pri spracovaní jedného bloku Tab. 5.1: Využitie výkonu procesora pri spracovávaní bloku *v údaji o počte cyklov sú zahrnuté aj stall cykly Keďže v niektorých inštrukčných riadkoch nebolo možné využiť všetky štyri dostupné inštrukcie, tieto prázdne miesta boli využité na načítanie inicializačných konštánt do registrov. Tieto konštanty sa síce načítavajú znova a znova pri každom opakovaní slučky, no to nemá vplyv na nárast počtu cyklov. Príklad takéhoto načítania inicializačnej konštanty je demonštrovaný na nasledujúcom inštrukčnom riadku. xlr17:16=lshift r23:22 by -6; ylr15:14=rot r23:22 by -8; xlr5:4=l[j5+10];; v uvedenom inštrukčnom riadku sa okrem logického posunu obsahu registrov xr23 a xr22 o šesť bitov vpravo a rotácie obsahu registrov yr23 a yr22 o osem bitov vpravo vykonáva načítanie inicializačnej konštanty do registrov xr5 a xr4 z pamäťového miesta daného súčtom obsahu registra j5 a konštanty 10. Po expanzii vstupných slov sa začína vykonávať hlavná slučka na výpočet hashovacích konštánt spracovávaného bloku. Táto slučka sa vykoná spolu osemdesiat krát, pričom v tejto slučke bolo možné opäť využiť VLIW architektúru procesora ako v prípade expanzie vstupných slov. Pri výkone hlavnej slučky sú použité oba výpočtové jednotky procesora, pričom v každej z nich sa vykonáva iný výpočet, takto je možné paralelne vykonávať jednotlivé časti algoritmu na výpočet hashovacích konštánt. V rámci výkonu tejto slučky, sú pri každom výpočte vypočítavané výsledné hashovacie konštanty