Tesi di Laurea
Transcript
Tesi di Laurea
POLITECNICO DI MILANO Facolta di Ingegneria Dipartimento di Elettronica e Informazione REALIZZAZIONE DI UN'ARCHITETTURA DI CIFRATURA SIMMETRICA AES SU FPGA Relatore: Prof. Fabrizio FERRANDI Correlatore: Ing. Marco Domenico SANTAMBROGIO Tesi di Laurea di: Alain VAILATI Matr. 654434 Anno Accademico 2003/2004 Tesi di Laurea Alain Vailati Ottobre 2004 POSSESSO Io so che nulla mi appartiene al mondo fuorche il pensiero, utto imperturbato che vuol sgorgare dall'anima mia, e ogni istante giocondo in cui benigno un fato di goder mi concede dal profondo Goethe. Indice Indice 1 Introduzione 2 1 Introduzione alla crittograa 6 1.1 Cos'e la crittograa . . . . . . . . . . . . . . . . . . 1.2 Classicazioni dei cifrari . . . . . . . . . . . . . . . 1.2.1 Cifrari con chiave simmetrica e asimmetrica 1.2.2 Cifrari a blocco e a usso . . . . . . . . . . . 1.3 Le diverse funzioni della crittograa . . . . . . . . . 1.4 Utilizzi della Crittograa . . . . . . . . . . . . . . . 1.5 L'AES . . . . . . . . . . . . . . . . . . . . . . . . . 1.5.1 Denizioni . . . . . . . . . . . . . . . . . . . 1.5.2 L'algoritmo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Gli strumenti e la metodologia 2.1 L'FPGA . . . . . . . . . . . . . . . . . . . . . 2.1.1 Cos'e una FPGA . . . . . . . . . . . . 2.1.2 Perche un' FPGA . . . . . . . . . . . . 2.1.3 Struttura di una FPGA: Virtex II Pro 2.2 VHDL . . . . . . . . . . . . . . . . . . . . . . 2.2.1 Entita e processi . . . . . . . . . . . . 2.3 Software e strumenti . . . . . . . . . . . . . . 2.3.1 ISE . . . . . . . . . . . . . . . . . . . . 6 8 8 9 9 10 12 13 15 19 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 20 21 22 23 24 25 25 1 INDICE 2.3.2 Modelsim . . . . . . . . . . . . . . . . . . . . . . . . . 27 2.3.3 EDK . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 2.4 La Metodologia . . . . . . . . . . . . . . . . . . . . . . . . . . 33 3 Implementazione 36 3.1 Traduzione dell'algoritmo in codice VHDL 3.1.1 La libreria util . . . . . . . . . . . . 3.1.2 Il KeyExpander . . . . . . . . . . . 3.1.3 Il Cipher . . . . . . . . . . . . . . . 3.2 Adattamento per FPGA . . . . . . . . . . 3.2.1 L'architettura . . . . . . . . . . . . 3.2.2 L'IP Core Kver . . . . . . . . . . . 3.2.3 Interfacciamento con bus opb . . . 3.2.4 Sintesi con Project Navigator . . . 3.2.5 I Driver e il le System.c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Test e conclusioni 4.1 Verica del codice VHDL . . . . . . . 4.2 Prove su FPGA . . . . . . . . . . . . 4.2.1 Generare il bitstream . . . . . 4.2.2 Download del BitStream . . . 4.3 Risultati sperimentali . . . . . . . . . 4.3.1 Tempistiche . . . . . . . . . . 4.3.2 Consumo delle risorse . . . . . 4.4 Conclusione e possibili sviluppi futuri Legenda Bibliograa 36 37 38 40 41 42 42 44 46 48 50 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 52 52 53 54 54 55 56 58 63 Introduzione La scrittura di messaggi segreti e antica, forse, quanto la comunicazione tra gli uomini. La tecnica di rendere inintelligibile un messaggio e detta crittograa e l'atto si dice criptare. Criptare e una parola che viene dal greco cryptos -nascosto- e infatti, la sua funzione e nascondere il signicato di un messaggio; si hanno traccia di applicazioni di crittograa (in special modo sulle comunicazioni) risalenti persino agli antichi egizi: infatti nelle societa primitive qualunque tipo di scrittura era di per se magico e segreto. Storicamente l'utilizzo della crittograa e stato proprio di diversi gruppi di persone: i militari, i corpi diplomatici, i diaristi e gli amanti. I militari hanno sicuramente giocato il ruolo piu importante perche la crittograa applicata a scopi bellici ha rappresentato per molti secoli un'arma decisiva nelle mani di chi sapeva come usarla. La Scitala Lacedemonica e un antico esempio di un sistema per cifrare messaggi tramite l'utilizzo di un bastone cilindrico (secondo gli scritti di Plutarco, in uso dai tempi di Licurgo, IX sec a. C.), sicuramente si tratta di uno dei primi sistemi crittograci con tecnica di trasposizione. Figura 1: La Scitala Lacedemonica La tecnica consiste nell'avvolgere un bastone con una striscia di carta 3 Introduzione e scrivere il messaggio dall'alto verso il basso, nito di scrivere si svolge il nastro con un messaggio dicilmente interpretabile senza un bastone della stessa circonferenza dell'originale. Un altro storico e famoso impiego della crittograa si ritrova nell'epoca dell'Impero Romano, con la tecnica di trasposizione inventata da Giulio Cesare. Essa consisteva nella sostituzione di ogni lettera dell'alfabeto con la terza successiva nell'ordine. Nel Medioevo poi, Gabriele Lavinde scrisse il primo manuale (1379) a riguardo, conservato ancora in Vaticano. Successive applicazioni si ebbero in Francia all'epoca del cardinale Richelieu con Antonio Rossignol e soprattutto in Italia con L. B. Alberti, G. B. Porta, G. B. Bellaso, G. Cardano. All'inizio del secolo durante la prima guerra mondiale il generale Luigi Sacco, dell'esercito italiano, scrisse il famoso Nozioni di crittograa (1925). Il periodo d'oro della crittologia pero e certamente quello della seconda guerra mondiale quando Alan Turing, il padre dell'informatica teorica, insieme al gruppo di ricerca del Bletchley Park formalizzo la matematica necessaria per uno studio sistematico dei cifrari. In seguito Claude Shannon, ideatore della moderna teoria dell'informazione, pubblico nel 1949 un articolo rimasto nella storia Communication theory of secrecy systems. Alla seconda guerra mondiale si deve la nascita d'Enigma la piu famosa macchina crittograca, usata dall'esercito tedesco. Figura 2: La macchina Enigma Introduzione 4 In questo periodo, infatti, tutte le comunicazioni avvenivano via radio, un canale, com'e ovvio, facile da individuare ed ascoltare da parte di chiunque disponesse di un ricevitore. Per rendere sicure le comunicazioni, i tedeschi crittavano i messaggi con Enigma uno strumento che, solo dall'esterno, somiglia vagamente ad una macchina da scrivere. In realta all'interno contiene, a seconda del modello, tre o quattro rotori e una serie di spinotti elettrici. La sostituzione del messaggio con uno criptato e sempre diversa se cambia lo stato iniziale della macchina, quindi per decifrare un messaggio e necessario avere Enigma e conoscere lo stato iniziale della macchina usata per criptarlo, oppure servirsi d'enormi macchine, chiamate appunto Colossi ( che sono gli antenati dei moderni calcolatori) come fece Turing. Da venti anni a questa parte si e vericata l'esplosione del fenomeno internet e la velocissima evoluzione dei computer, in questi anni per criptare messaggi ci si adava ad algoritmi implementati su software come programmi ed eseguiti su computer. In questo periodo con l'aumento della mole di dati da crittografare, la crescente complessita dei calcoli e l'elevata velocita richiesta rendono necessario un ulteriore salto di qualita nell'elaborazione. Tale salto puo essere ottenuto eliminando dalla catena di elaborazione dei messaggi, il sistema operativo e il generico computer con processore generico. La programmazione di una FPGA puo essere una soluzione veloce ed economica al problema, questo e cio che si e fatto e che si spieghera in questo documento. Il presente lavoro di tesi e principalmente organizzato in quattro parti. Il primo capitolo introduce la crittograa come scienza e potente strumento di comunicazione, fornendo inizialmente un breve glossario dei termini specici, spiegando i principi teorici della crittograa e le diverse forme sviluppate, mostrando le principali tecniche di crittograa oggi usate e approfondendo particolarmente quelle riguardanti l'AES. Inne se presenta il supporto sul quale e stato implementato l'algoritmo ovvero il chip FPGA. Del supporto si da una descrizione delle componenti e del funzionamento e si presentano i tool adottati per programmarla. Introduzione 5 Nel secondo capitolo si spiega la metodologia che si e seguita per lo svolgimento del lavoro descrivendola passo per passo specicando i tool utilizzati e motivando le scelte attuate. Il terzo capitolo mostra il processo di analisi del documento di specica che e stato fatto evidenziandone le interpretazioni e le decisioni di implementazione prese in questa fase del lavoro. Inne si presentano i risultati sperimentali e i possibili sviluppi futuri. Nel quarto capitolo si spiegano le modalita di test e i risultati sperimentali della prova sul chip,si traggono le conclusioni sul lavoro svolto e si ipotizzano possibili sviluppi del lavoro. Capitolo 1 Introduzione alla crittograa In questo capitolo si presenta una panoramica del mondo della crittograa mostrandone gli aspetti salienti per questo progetto. Si orira una breve denizione dei termini, si mostrera uno schema tipico di funzionamento di una comunicazione criptata e inne si mostreranno due standard: l'SSL e l'AES. Il primo e un protocollo mentre l'altro e lo standard di crittograa piu recente ed e il caso di studio di questo lavoro. 1.1 Cos'e la crittograa Quando si parla di crittograa, ci si riferisce a quella scienza che fornisce uno strumento adatto a mantenere segrete tutte quelle informazioni che non si vogliono divulgare pubblicamente in maniera tale che la possibilita di accedervi sia data soltanto ad uno o ad un ristretto numero di persone autorizzate. Lo scenario tipico in cui si usa la crittograa consta di due attori e di diverse parti: il mittente A e il destinatario B, un messaggio Pt, una chiave di cifratura Kc e una di decifratura Kd, un cifrario C e un crittogramma Ct che interagiscono come in Figura 1.1 L'operazione tramite la quale si nascondono le informazioni e chiamata cifratura oppure crittazione, ed e eettuata tramite un apposito algoritmo chiamato cifrario; l'informazione o il messaggio da cifrare e noto come testo chiaro (plaintext) che, insieme alla chiave detta 7 1.1 Cos'e la crittograa Figura 1.1: Scenario chiave del cifrario viene convertito da testo chiaro a testo cifrato o crittogramma (ciphertext). Con decrittazione invece, si intende la conversione da testo cifrato a testo chiaro, anch'essa sfrutta la chiave del cifrario. L'ambito nel quale sono eettuate le operazioni di crittazione e di decrittazione e chiamato crittosistema. La pratica del rivelare cio che la crittograa tenta di nascondere e detta crittoanalisi ed e un campo che, si puo dire, si sviluppi pari passo con la crittograa per molteplici scopi: perfezionare l'algoritmo di crittograa, rompere sistemi di crittograa, che signica avere accesso al signicato dei messaggi crittati senza disporre di una chiave. L'obbiettivo principale della crittograa e la realizzazione del cifrario perfetto, ossia un sistema nel quale dal crittogramma e impossibile trarre informazioni sul testo in chiaro. Il teorema di Shennon aerma l'esistenza e anche la scarsa praticabilita del cifrario perfetto, che, infatti, e stato in alcuni casi realizzato e impiegato con dispendio di ingenti risorse. Un esempio e il cifrario chiamato One-time pad: esso cifra il testo in chiaro con una chiave ottenuta da una sorgente modellata con un processo stocastico binario, il cifrario fa lo xor bit a bit della chiave, di cui ogni bit e usato una sola volta, e il testo. Percui nel solito caso tipico si possono vedere i due attori che si incontrano e si scambiano una chiave, essi potranno poi comunicare con messaggi crittati ntanto 1.2 Classicazioni dei cifrari 8 che la chiave non si esaurisce, dopodiche dovranno scambiarsene una nuova . 1.2 Classicazioni dei cifrari Un primo criterio di classicazione puo essere attuato in base al tipo di chiave utilizzata dall'algoritmo. Esistono, infatti, sostanzialmente due sistemi diversi: i sistemi a chiave asimmetrica e i sistemi a chiave simmetrica. Un secondo importante criterio di classicazione consiste nel suddividere i cifrari in due categorie: cifrari a blocchi e cifrari a usso. 1.2.1 Cifrari con chiave simmetrica e asimmetrica I sistemi a chiave asimmetrica hanno due chiavi che vengono generate insieme e sono strettamente collegate: una, detta pubblica, che viene distribuita a tutte le possibili entita interessate alla comunicazione sicura, mentre l'altra chiave, detta privata, e nota solo ad un'entita. Il legame fra le due chiavi consiste nel fatto che il messaggio viene crittato con una chiave e puo essere decifrato solo con l'altra chiave, legame questo che da origine a diversi scenari, possibilita di comunicazioni e funzioni diverse come si spiega nel paragrafo sulle diverse funzioni della crittograa. Il secondo sistema e detto a chiave simmetrica perche appunto le due chiavi, per crittare e decrittare il crittogramma, sono uguali. Questo sistema e solitamente molto piu veloce, semplice e leggero di quello a chiave asimmetrica ed e usato per comunicazioni lunghe e che necessitano di quelle caratteristiche, ad esempio le trasmissioni sicure via web, piu avanti approfondite. Una delle debolezze principali di questo sistema e che entrambi gli attori devono avere la stessa chiave e se non possono scambiarla di persona devono in qualche modo spedirsela aumentando cos i rischi di intercettazione, il metodo e di crittare la chiave simmetrica con una chiave asimmetrica come fa Secure Socket Layer, SSL, un protocollo per trasmissioni sicure piu avanti mostrato. 1.3 Le diverse funzioni della crittograa 9 1.2.2 Cifrari a blocco e a usso Un cifrario a blocchi cifra il testo in chiaro in blocco o comunque suddividendolo di blocchi di dimensione predenita ed elaborandoli sequenzialmente. Dall'altra parte il cifrario a usso lavora su un usso di dati, di solito di singoli bit per volta e, appena arrivato il bit, il cifrario restituisce subito il bit criptato senza attendere l'arrivo di altri bit o blocchi di bit. Inoltre, un cifrario a blocchi con lo stesso testo in chiaro e con la stessa chiave restituisce sempre lo stesso crittogramma, mentre con un sistema a usso l'uscita dipende anche dalla storia pregressa del cifrario. Un cifrario puo operare in diversi modi per quanto riguarda il procedimento col quale testo in chiaro, chiave e cifrario interagiscono l'un l'altro. Il metodo chiamato Electronic Codebook , ECB, rappresenta la via piu semplice e diretta per un cifrario a blocchi: una volta ssata la chiave, il sistema crittera sempre lo stesso blocco alla stessa maniera, sistema questo, che puo essere immaginato come una tabella a doppia entrata chiave/blocco. Mentre l'implementazione puo essere molto veloce, questo sistema consuma moltissima memoria dato che e necessaria una cella della tabella per ogni coppia chiave-blocco possibile. La controparte del ECB e il Cipher Block Chaining , CBC, metodo nel quale i nuovi crittogrammi dipendono dagli stati precedenti dell'algoritmo e dalle sue precedenti uscite. Tra ECB e CBC, Ciphertext Feedback , CFB, rappresenta una metodologia per far funzionare cifratori a blocchi come cifratori a usso: i valori in uscita da un crittosistema sono serializzati come in un cifrario a usso, ma l'uscita dipende oltre che dalla chiave e dal testo in chiaro attuale, anche dal crittogramma precedente che viene messo in Xor bit a bit con il testo in chiaro [1]. 1.3 Le diverse funzioni della crittograa Finora si e parlato della crittograa come sistema per proteggere la privacy di una comunicazione, in realta l'ingegno umano ha sfruttato questo mezzo per diverse altre applicazioni per rendere una comunicazione sicura anche 1.4 Utilizzi della Crittograa 10 ad altri livelli che sono: l'identicazione, l'autenticazione, l'integrita dei dati, autenticita e il non ripudio. Queste funzioni sono per lo piu ottenibili per mezzo della crittograa a chiave asimmetrica che permette la realizzazione della cosiddetta rma digitale. La rma digitale consiste nel crittare con la propria chiave segreta, alcuni dati personali che potrebbero essere nome, cognome, codice scale e chiave pubblica; questa rma quindi e decifrabile solo con la chiave pubblica relativa che deve corrispondere con quell'inserita all'interno tra i dati, in questa maniera si e certi dell'autenticita della rma. Se poi si inserisce la rma all'interno di un documento e si cripta si ottiene l'autenticita, ma non l'integrita. Per avere l'integrita di un messaggio crittato bisogna aggiungere alla rma il digest del messaggio, il digest e una funzione di estrazione dal messaggio di un blocco di dati solitamente delle dimensioni inferiori ai 150 bit per mezzo del quale sia impossibile risalire al messaggio originale ma allo stesso tempo sia impossibile da modicare per alterare il messaggio. In Figura 1.2 si vede un esempio di trasmissione sicura con l'utilizzo della rma digitale e del digest ottenuto tramite hash function. Come si vede con questa tecnica si ottengono tutte le funzionalita desiderate eccetto che per il non ripudio da parte del destinatario, non si puo, infatti, garantire che il ricevente abbia letto il messaggio. 1.4 Utilizzi della Crittograa Dopo aver descritto il funzionamento e le potenzialita delle tecniche di crittograa se ne vuole mostrare una famosa e importante implementazione nel mondo delle comunicazioni via web, mondo in cui questa scienza e massicciamente impiegata. Questa non puo che essere il protocollo Secure Socket Layer, SSL, esistente in svariate versioni e utilizzato per moltissime applicazioni. SSL e uno dei protocolli piu diusi nelle comunicazioni sicure, proposto dalla Netscape Communication Corporation garantisce la condenzialita e l'adabilita delle comunicazioni su Internet proteggendole da intrusioni, modiche o falsicazioni. Lo scenario che si considera e quello di un utente 1.4 Utilizzi della Crittograa 11 Figura 1.2: Trasmissione sicura U che deve accedere a dei servizi in tutta sicurezza da un sistema S. Utilizzando SSL si garantira la condenzialita della comunicazione grazie ad un sistema di cifratura ibrido tra una cifratura a chiave simmetrica e uno a chiave asimmetrica. Questo sistema prevede, infatti, che per concordare la chiave simmetrica per la comunicazione, si ricorda che la cifratura con chiave simmetrica e di solito piu veloce, si utilizzi un sistema di cifratura a chiave asimmetrica col quale si cifrare la chiave simmetrica da scambiare tra le due identita, il tutto e eseguito tramite un processo chiamato Handshake, che e un suo sotto protocollo. Questo sotto protocollo prevede che le due parti in gioco, una volta accertato che una delle due desidera una connessione SSL, si scambino i rispettivi certicati con lo scopo di autenticarsi e i propri cifrari e chiavi supportate allo scopo di accordarsi sull'algoritmo simmetrico da utilizzare per la comunicazione. Questo procedimento conseguentemente esclude ogni possibilita di falsicazione o comunque di intrusione indesiderata nella comunicazione, anche nel caso pessimo del man in the middle. Secondo 1.5 L'AES 12 requisito fondamentale di una comunicazione sicura e l'autenticita, caratteristica che SSL garantisce ricorrendo all'utilizzo di certicati e di un cifrario asimmetrico. SSL e un protocollo che si situa tra un protocollo di trasporto come il TCP/IP ed un protocollo applicativo come HTTP mantenendo, pero, indipendenza da questi livelli cosi' da aumentarne la portabilita e riutilizzabilita. Non sono mancate in ogni caso integrazioni fra questi protocolli come nel caso del Hyper Text Transfert Protocol Secure ,HTTPS, utilizzato da numerosi web server sicuri. 1.5 L'AES L'acronimo AES signica Advanced Encryption Standard ed e il nome che il NIST ,National Institution of Standards and Technology, il 26 Novembre 2001 ha scelto per il nuovo standard di crittograa di dati. Prima di questa data, lo standard uciale Americano era, sin dal 1977, il Data Encryption Standard ,DES. Questo protocollo di crittograa col passare degli anni ha iniziato a mostrare diverse vulnerabilita tanto che negli ultimi anni le macchine del NIST erano in grado di decifrare un crittogramma in un secondo. A causa di queste diverse debolezze riscontrate, no alla ne degli anni 90, ne furono realizzate diverse varianti come il Triple-DES ma ormai continuare a fare modiche non era piu' suciente. Fu cos che fu indetto il concorso vinto dall'algoritmo originalmente chiamato Rijndael. Il nome Rijndael e composto di parti dei cognomi degli autori ,RIJ e DAE, Joan Daemen e Vincent Rijmen . Il progetto di Rijndael e stato fortemente inuenzato dal block cipher Square, e altamente sicuro ed ha subito un'estensiva crittoanalisi: no al Novembre 2002 non sono stati riscontrati punti deboli. Lo standard prevede la possibilita di crittare blocchi di dati da 128 bit per mezzo di chiavi da 128, 192 o 256 bit con una procedura algoritmica facilmente implementabile sia via software che via hardware. Non si intende, in questa sede descrivere dettagliatamente il funzionamento dell'algoritmo AES, per quello si rimanda al documento uciale ps [10], ma darne una descrizione generale, indicandone 1.5 L'AES 13 le modalita con le quali si e scelto di implementarlo. 1.5.1 Denizioni Prima di addentrarsi nella descrizione delle procedure si elencano i termini maggiormente usati e i loro signicati: Strutture Dati Bit: un valore binario che puo assumere i valori 0 e 1. Byte: un gruppo di 8 bit che e trattato come una singola entita o come un vettore di 8 bit individuali. Parola: gruppo di 32 bit che e trattato come una singola entita o come un array di 4 byte. Array: una collezione enumerata di entita con caratteristiche simili. Blocco: sequenza di bit che puo rappresentare input, output, Stato o Round Key. La lunghezza della sequenza e rappresentata dal numero di bit che contiene. I blocchi possono anche essere interpretati come array di byte. Variabili dell'algoritmo AES Chiave di cifratura: chiave segreta che e utilizzata dalla funzione Key Expansion per generare un insieme di Round Key; puo essere rappresentata come una matrice quadrata di byte, con 4 righe e 4 colonne. Stato: risultato intermedio della cifratura che puo essere rappresentato come una matrice quadrata di byte, con 4 righe e 4 colonne. Round Key: valori derivati dalla chiave di cifratura usando la funzione Key Expansion. Sono applicate allo Stato nella cifratura e nella cifratura inversa. Dati originali: dati che sono in ingresso al processo di cifratura o sono usciti dal processo di cifratura inversa. Dati cifrati: dati che sono usciti dal processo di cifratura o sono in ingresso al processo di cifratura inversa. S-box: tabella di sostituzione non lineare usata in molte trasformazioni di sostituzione di byte. 1.5 L'AES 14 Funzioni e costanti AddRoundKey (): trasformazione nella cifratura e nella cifratura inversa in cui una Round Key viene aggiunta allo Stato usando un'operazione di XOR MixColumns (): trasformazione nella cifratura che prende tutte le colonne dello Stato e mischia il loro contenuto (indipendentemente l'una dall'altra) per produrre nuove colonne. RotWord (): funzione usata nella funzione Key Expansion che prende una parola di 4 byte e fa una permutazione ciclica. ShiftRows (): trasformazione nella cifratura che elabora lo stato spostando ciclicamente le ultime 3 righe dello Stato di oset dierenti. SubBytes (): trasformazione nella cifratura che elabora lo Stato usando una tabella (S-box) non lineare per la sostituzione dei byte, che opera indipendentemente in ognuno dei byte dello stato. SubWord (): funzione usata nella funzione Key Expansion che prende in ingresso una parola di 4 byte e applica la S-box a ognuno dei 4 byte per produrre una parola in uscita. Rcon: la matrice di round word costanti. XOR: operazione di OR esclusivo. : operazione di OR esclusivo. : moltiplicazione di due polinomi (ognuno di grado minore di 4) modulo 4 x +1. : moltiplicazione su un campo nito. Altre denizioni AES: Advanced Encryption Standard. Rijndael: algoritmo di crittograa su cui si basa l'Advanced Encryption Standard, AES. Trasformazione Ane: una trasformazione che consiste in una moltiplicazione per una matrice seguita dalla somma di un vettore. 15 1.5 L'AES 1.5.2 L'algoritmo La procedura consta di due parti: l'espansione della chiave e il blocco cifratore. L'espansione della chiave crea, dato in ingresso un blocco di 128 bit, chiave, un blocco 44 parole da 32 bit che all'interno dell'algoritmo costituiscono la chiave espansa indispensabile per il processo di criptazione. Il blocco cifratore a partire dalla chiave espansa e dal blocco di dati da cifrare, successivamente chiamato come stato, restituendone il blocco cifrato. Sotto si puo vedere in pseudo codice la procedura di espansione. Nk, Nb e Nr va- Figura 1.3: Pseudo codice del KeyExpander riano a seconda della chiave che si utilizza, in questo ambito pero Nk e Nb saranno uguali a 4 e Nr varra 10. Come si puo capire dalla Figura 1.3 la procedura copia la chiave nelle prime quattro righe della chiave espansa e riempie le restanti quaranta righe facendo sostituzioni mediante la funzione SubWord,Rcon e xor con le righe precedenti. La funzione SubWord e una funzione di sostituzione di parole da 32 bit 16 1.5 L'AES mediante la tabella SBOX ,Figura 1.4, i cui valori nelle celle sono calcolabili mediante un procedimento specicato sempre nel ps-197. La RotWord Figura 1.4: S-Box per la funzione SubWord consiste in una rotazione delle posizioni dei byte all'interno della parola da 32 bit traslandoli in questa maniera: se la parola la rappresentiamo come [a0,a1,a2,a3] la funzione restituisce [a1,a2,a3, a0]. Rcon invece e un array di costanti dove Rcon[i] e dato da [xi-1, 00,00,00] e xi-1 e una potenza di x (02 nel campo GF(28) ). La parte nale dell'algoritmo e chiamata Cipher: un procedimento che prende in ingresso il blocco da 128 bit da codicare e il registro con la chiave espansa dal Keyexpander e restituisce il blocco criptato. Uno schema in pseudo codice lo si puo vedere in Figura 1.5. In questo schema compaiono 4 funzioni nuove: AddRoundKey, SubBytes, ShiftRows e MixColumns. La prima e una semplice funzione di Xor bit a bit di una riga della chiave espansa con 32bit dello stato. SubBytes e una funzione di sostituzione dal funzionamento simile a quello della funzione di SubWord ma operante su parole di 8 bit; se rappresentiamo lo stato come una tabella di 16 elementi di 8, la funzione si puo rappresentare come in Figura 1.6. 17 1.5 L'AES Figura 1.5: Blocco cifratore Cipher La funzione ShiftRows ruota le righe dello stato dipendentemente dall'or- Figura 1.6: Funzione SubBytes dine della riga: nessuna rotazione per la riga 0, una rotazione di uno per la riga 1, 2 per la 2 e una rotazione di tre posti per la terza. MixColumns invece lavora sulle colonne dello stato e calcola lo stato di uscita applicando, ad ogni colonna la moltiplicazione matriciale come in Figura 1.7, nella quale la moltiplicazione e la moltiplicazione nel campo GF(28), Galosi Field e la somma e uno xor bit a bit. 18 1.5 L'AES Figura 1.7: Moltiplicazione per mixcolumns Capitolo 2 Gli strumenti e la metodologia La realizzazione dell'architettura di cifratura ha implicato la scelta del sistema da utilizzare e l'impiego di diversi software di sviluppo secondo una precisa metodologia. Scopo di questo capitolo e presentare l'architettura di riferimento per l'implementazione di questo specico caso, gli strumenti utilizzati e mostrare la metodologia adottata. Per quanto riguarda l'architettura, si dara una breve descrizione della sua struttura e del suo funzionamento oltre che motivarne l'impiego. Degli strumenti utilizzati, che sono ISE, Modelsim e EDK, si descriveranno le funzionalita generiche dando particolare attenzione a quelle piu utilizzate. Si presentera inoltre anche il linguaggio di descrizione hardware adottato, VHDL, e inne grazie alla metodologia si dara una descrizione delle fasi seguite durante il lavoro. 2.1 L'FPGA L'architettura di riferimento impiegata, ovvero l'FPGA, e un ritrovato tecnologico piuttosto recente, la conoscenza della sua esistenza e circoscritta agli ambiti specializzati nei sistemi embedded, quindi, nei paragra che seguono si cercera di fare chiarezza su cosa sia, come funzioni e sui suoi impieghi. 20 2.1 L'FPGA 2.1.1 Cos'e una FPGA La Field-Programmable Gate Array , FPGA, e un tipo di dispositivo riprogrammabile direttamente dall'utente e, come suggerisce il nome, esso e costituito da banchi di componenti logici collegabili tra loro dinamicamente. I banchi e le connessioni logiche variano da chip a chip ma sostanzialmente Figura 2.1: L'FPGA Virtex sono di due tipologie ciascuna: ci sono banchi di componenti complessi, con semplicita di uso ma di scarsa ecienza, e banchi di componenti semplici, piu dicili da utilizzare ma molto piu ecienti perche permettono di curare i dettagli dell'implementazione. Per quanto riguarda le connessioni, la FPGA dispone di connessioni brevi e veloci e di connessioni piu lente ma piu lunghe che, attraversando tutto il dispositivo, possono quindi essere condivise da piu parti dell'architettura e farle comunicare. Il risultato di un integrato cosi' realizzato e un compromesso sotto molti aspetti. Bisogna sapere infatti, che nel campo dei circuiti integrati vi e una vasta scelta: in questo campo si trovano ASIC, MPGA, PLD ed inne FPGA che, date le sue caratteristiche si crea uno spazio di mercato sempre piu consistente. Le Application Specic Integrated Circuit, ASIC, sono dei chip personalizzati in base alle necessita del costruttore dell'apparato su cui e montato e progettati per svolgere una determinata applicazione. Questa personalizzazione avviene pero interamen- 2.1 L'FPGA 21 te in fase produzione e ha conseguentemente alti costi e tempi per le fasi di progettazione e prototipazione. Inoltre, una volta prodotto non e piu modicabile, ne consegue uno strumento decisamente poco essibile e pratico per i piccoli produttori e specialmente per degli studenti. Tra i dispositivi riprogrammabili si trovano MPGA FPGA e PLD. La Mask Programmable Array , MPGA, e il dispositivo piu grande e veloce. La MPGA consiste in una base di transistor gia impostati in fase di produzione secondo le esigenze dell'utente a cui poi resta il compito di collegarli secondo le necessita pre-programmate che vincolano anche eventuali cambiamenti di struttura; il risultato e un chip piuttosto costoso e non molto essibile sempre a causa del processo di produzione dal quale bisogna passare. Le Programmable Logic Device , PLD, sono invece i dispositivi piu piccoli e meno costosi ma anche con meno potenzialita; di solito sono ROM, ad esempio E2PROM , PAL, PLA e altre simili. La FPGA si colloca per granularita di personalizzazione e quantita di risorse disponibili nel mezzo fra le tre ma anche per i costi. Quest'ultima eettivamente, costa poco per produzioni in piccola scala e la fase di prototipazione e piu veloce e semplice. 2.1.2 Perche un' FPGA La scelta di una piattaforma, che sia software, ASIC o FPGA, e guidata da diversi aspetti, come prestazioni in termini di velocita di elaborazione, costi e essibilita. Gli svantaggi nel servirsi di una piattaforma hardware come ASIC sono da trovarsi negli elevati costi e tempi di prototipazione, la scarsa essibilita del sistema e nelle mancanze nelle esecuzioni di operazioni matematiche come moltiplicazione divisione che hanno costi elevati di realizzazione. Dall'altra parte il software si presenta come antitesi caratteriale dell'hardware, infatti, tra le sue caratteristiche si ha un'elevata essibilita, portabilita su diverse piattaforme e possibilita di rapidi aggiornamenti. I suoi punti a sfavore non sono pero pochi. Primo fra tutti, un algoritmo implementato via software non sore solo delle debolezze dovute alla sua struttura ma anche quelle ereditate dal sistema operativo in oltre le sue prestazioni sono deci- 2.1 L'FPGA 22 samente inferiori a quelle hardware. La soluzione a questi problemi c'e ed e a portata di mano: un'architettura basata su un hardware ricongurabile, come per esempio un FPGA. Dato che gli algoritmi crittograci sono in continua evoluzione, dall'89 ad oggi ci sono state piu di dieci veriche sul DES e TripleDES e il passaggio all'AES, l'alta essibilita e quasi indispensabile: facilita di aggiornamenti e possibilita di spostare sui driver alcune funzioni troppo pesanti per lo hardware rende questa soluzione ottimale. La scelta e stata poi guidata anche dalle necessita didattiche: era infatti impossibile per uno studente, realizzare con i pochi mezzi a disposizione un chip su ASIC visto i costi elevati quando con una scheda Avnet gia presente nel laboratorio Micro si possono fare tutte le prove che si desidera in tempi brevissimi. 2.1.3 Struttura di una FPGA: Virtex II Pro Come si e precedentemente accennato una FPGA e un chip riprogrammabile dall'utente composto da banchi di logica connesse in maniera non denitiva ma modicabile a piacimento. Le soluzioni tecniche adottate per ottenere questi obiettivi sono diverse, in particolare la Xilinx ha sviluppato uno dei dispositivi FPGA piu prestanti e vendute al mondo: la Virtex II Pro. Questa e costituita da migliaia di Blocchi Logici Congurabili , CLB, che possono essere liberamente interconnessi tra loro. Questi Blocchi Logici nel caso del chip Xilinx sono logiche combinatorie a quattro ingressi e una uscita detti: Look Up Table, LUT, costituiti da una SRAM. All'uscita di questi LUT sono presenti due FLIP-FLOP allo scopo di memorizzare l'uscita del sistema combinatorio. I vari LUT sono poi interconnessi tra loro da canali di connessione che, nel caso del dispositivo in esame, sono disposti a matrice come si puo vedere in Figura 2.2 Sia la programmazione delle LUT che quella delle matrici di interconnessione, avviene tramite celle di memoria volatile che possono essere congurate a piacere, tipicamente all'accensione, ma anche a run-time. 23 2.2 VHDL Figura 2.2: Esempio di FPGA: le connessioni 2.2 VHDL Per la descrizione dello hardware esistono due diversi tipi linguaggi di programmazione: 1. Linguaggi di programmazione gia esistenti estesi nelle funzionalita e sintassi per permettere di descrivere anche oggetti hardware, questo e il caso di Hardware-C denito nell'ambito dell'Universita di Stanford, ed e il linguaggio SystemC. 2. Linguaggi costruiti ex novo, specici per la descrizione di architetture ma comunque con strutture simili a quelle dei linguaggi di programmazione comuni, allo scopo di semplicarne l'uso per chi gia programma in altri ambiti. Questo e il caso dei linguaggi di Hardware Denition, HD, come il Veri Hight Speed Integrated Circuit, VHSIC, Hardware Description Language, VHDL, e Verilog. Il linguaggio scelto per descrivere l'architettura implementata e il VHDL '93 per motivi didattici, essendo stato materia di studio per il corso di Reti Logiche A, e per l'ampio utilizzo che se ne fa praticamente in tutta Europa per la progettazione hardware che lo porta a essere uno standard de facto in materia. Il VHDL e nato, inizialmente, come progetto del ministero della difesa ame- 2.2 VHDL 24 ricano ed e diventato standard pubblico nel 1987 tramite l'IEEE, passando attraverso diversi aggiornamenti e arrivato all'ultima versione il VHDL '93. Come in ADA, in VHDL si e adottata la losoa specify and body che implica la distinzione ed esplicitazione dell'interfaccia e corpo di un componente. Questa divisione e molto utile nel momento in cui si desideri realizzare diverse implementazioni di uno stesso componente, magari con diverse prestazioni, struttura o logica utilizzata, perche infatti VHDL e uno strumento molto potente che permette di realizzare un oggetto in moltissimi modi e approcci diversi. La caratteristica principale di questo linguaggio, che permette di arontare problemi con logiche diverse, e la possibilita di scegliere il livello infatti possibile descrivere i componenti in di astrazione dello hardware. E due maniere diverse: una, la piu ostica forse e piu impegnativa in termini di codice da scrivere, e la cosiddetta architetturale l'altra, piu semplice per un programmatore e anche piu naturale, e la comportamentale, behavioural. La prima consiste nel descrivere il componente nella sua struttura logica, descrivendo quindi le connessioni fra le porte logiche, gli ingressi e le uscite, il usso di lavoro fra le varie parti avviene in parallelo. La seconda invece permette una descrizione molto simile alla programmazione imperativa, quindi, avremo i costrutti tipici di questo stile come i cicli for e while, l'if then else e molti altri, il usso di esecuzione, ovviamente, all'interno di queste strutture, sara di tipo sequenziale. 2.2.1 Entita e processi Circoscrivere e dividere questi due stili profondamente diversi e indispensabile. Infatti, sono previsti due ambiti diversi per il loro utilizzo. L'ambito di utilizzo previsto per lo stile architetturale e quello delle entita mentre per scrivere codice di tipo comportamentale bisogna servirsi dei processi. Entita e processi non sono allo stesso livello nella programmazione ma piuttosto la prima contiene la seconda che puo anche non venir utilizzata. In altre parole, per descrivere un componente bisogna denirne un'entita e la sua interfaccia: l'interfaccia specica il nome del componente e le sue porte 2.3 Software e strumenti 25 di ingresso e uscita all'interno dell'entita, si scrive il codice descrittivo in stile architetturale inserendo se necessario, uno o piu process, che saranno eseguiti parallelamente, all'interno dei quali si usa lo stile comportamentale. 2.3 Software e strumenti Per sviluppare l' IP Core e curarne il codice, compilarlo, sintetizzarlo e inne usarlo per poter programmare la scheda si sono utilizzati tre software: ISE con ProjectNavigator, ModelSim e la Enbedded Development Kit EDK con Xilinx Plataform Studio che verranno presentati in questo paragrafo. 2.3.1 ISE Il primo strumento presentato e stato anche il primo ad essere utilizzato: Integrated Software Environment ISE, e un software sviluppato da Xilinx con la collaborazione della Mentor Graphics per l'interfaccia graca Project Navigator. ISE e un'ambiente di sviluppo per progetti di architetture per FPGA; anch'esso contiene un editor di testi e una serie di strumenti utili per lo sviluppo del progetto in tutte le sue fasi a partire dal VHDL o Verilog per nire con il codice sintetizzato e adatto ad essere portato su EDK. Le principali funzionalita oerte da ISE sono accessibili direttamente da Project Navigator nel riquadro D visibile in Figura 2.3 e sono organizzate in cinque gruppi: Design Entry Utilities, User Constraints, Synthesize-XST, Implement Design, Generate Programming File. Tramite User Constraints l'utente ha la possibilita di imporre vincoli, in termine di tempi e spazi utilizzati su chip e di collegare al IP Core dei pin sici della scheda per poter, ad esempio, utilizzare dei led. Il gruppo Synthesize, invece, contiene il compilatore per controllare la sintassi del codice ed il comando per sintetizzare il codice, operazione indispensabile per la trasposizione del lavoro su un dispositivo FPGA. Sotto Implement Design si trovano tutte gli strumenti dediti alla nale traduzione del codice sintetizzato e mappatura su chip, per alcuni di questi procedimenti si da la possibilita di farli fare manualmente all'utente. Inne,nell'ultima fase 2.3 Software e strumenti 26 Figura 2.3: Interfaccia graca di Project Navigator di lavoro, e assistito dai programmi del gruppo Generate Programming File, qui si crea il bitstream e tramite Impact si eettua il download del bitstream sul chip. Questi ultimi due gruppi non sono pero stati utilizzati, a questi si sono preferiti gli strumenti forniti con EDK per motivi di comodita e maggior supporto nella gestione dell'architettura embedded come si vedra tra due paragra. Grazie all'interfaccia graca si puo avere sempre sottocchio la struttura del progetto nella nestra Sources in Project, riquadro A, come si puo vedere in Figura 2.3. Il suo uso e semplice: si inizia creando un progetto dal menu File New project e da qui si scelgono: locazione del progetto, le sorgenti e tutte le impostazioni riguardanti il tipo di chip utilizzato perche in questa fase sono subito importanti i dettagli tecnici del mezzo per permettere la sintesi e le ottimizzazioni. Nel caso ci sia bisogno di apportare modiche al codice nel riquadro B, si puo visulizzare e modicare con l'editor incorporato il codice, mentre nella nestra bianca in basso,riquadro C, si puo notare la 2.3 Software e strumenti 27 consolle con tutto lo spazio dedito a comunicare i messaggi restituiti dai compilatori. L'utilizzo di questo software, che in pratica fa le stesse cose che fanno alcuni strumenti di EDK, e motivato dalla sua comodita. A dierenza di EDK, che come si vedra nei prossimi paragra non lo permette, in questo ambiente e possibile controllare la correttezza e sintetizzabilita del codice in breve tempo, con il comando compile, ed e possibile sintetizzare il codice un in un secondo tempo, inoltre si possono sintetizzare anche singole parti e non tutto l'IP Core, cos da ridurre i tempi nel caso si riscontrino problemi in una parte del lavoro. 2.3.2 Modelsim Modelsim e un'ambiente di sviluppo per codice VHDL e Verilog sviluppato dalla Mentor Graphics e supportato dalla Xilinx per sviluppare codice per le sue FPGA. Questo ambiente integra svariati strumenti tra i quali si segnalano oltre al compilatore: un editor di testo per modicare il codice, un workspace per la gestione delle librerie dei progetti, un prompt di comandi per integrare e completare i comandi selezionabili tramite l'interfaccia graca visibile in Figura 2.4Inoltre attraverso il menu tools e possibile accedere a tutta una serie di funzionalita indispensabili per testare il codice tra i quali: Dataow: che consente di visualizzare gracamente il dispositivo mostrando in modo schematico le porte d'ingresso e d'uscita. Il Dataow puo essere molto utile per far maggior chiarezza sulla struttura del nostro componente, ed e possibile vericare se sono stati commessi eventuali errori nel denire le porte. Wave: consente di visualizzare un area graca sulla quale sono ripor- tati un asse Y per rappresentare i vari segnali (I/O) del dispositivo e un asse temporale X.L'utility wave risulta fondamentale per il nostro scopo, in quanto permette di visualizzare le forme d'onda associate ai 2.3 Software e strumenti 28 Figura 2.4: Interfaccia graca di Modelsim vari segnali nel corso dell'esecuzione della simulazione. Signal: permette di visualizzare tutti i segnali in ingresso e in uscita dal dispositivo; da qui e possibile impostare un valore ben denito per ciascuno di essi. Il lavoro sotto Modelsim viene organizzato all'interno di un progetto facilmente generabile con una procedura automatizzata che permette di crearlo secondo le proprie esigenze, potendo scegliere ubicazione, linguaggio adottato, VHDL o Verilog sono i linguaggi supportati, e permette di aggiungere nuovi le o le gia esistenti in qualita di testbench o di architettura. Questi progetti contengono tutte le informazioni riguardanti il lavoro e la sessione di lavoro, sono organizzati in una directory che contiene, quindi, i le con i 2.3 Software e strumenti 29 sorgenti, la working library, metadati riguardanti la sessione, le librerie locali ed eventuale documentazione. Le principali funzionalita utilizzate sono la compilazione e la simulazione. Per compilare e suciente selezionare il le del progetto che si desidera compilare e clickare sull'icona compile, si avviera il processo di compilazione e i risultati saranno comunicati dalla nestra di prompt. Per simulare, invece, bisogna selezionare simulate dal menu a tendina Simulate in alto come si vede in Figura 2.5 Figura 2.5: Menu di simulazione 2.3.3 EDK Embedded development kit ,EDK) e l'ultimo strumento presentato. Come suggerisce il nome, EDK e una raccolta di applicazioni indispensabili per la realizzazione di software e descrizione hardware per un sistema embedded. Tramite EDK infatti si possono creare e modicare i le Microprocessor Hardware Specication, MHS, ed Microprocessor Software Specication, MSS, le utilizzati dai tool; si possono inoltre personalizzare le librerie, i driver e i gestori di interrupt. Tra le sue molteplici funzionalita, EDK annovera la possibilita di aggiungere e modicare core e i relativi parametri, aggiungere bus e segnali di connessione per la generazione di un MHS le e anche 2.3 Software e strumenti 30 MSS, supporta tutta una serie di strumenti di sviluppo successivamente elencati, dispone di un editor che permette di visualizzare il lavoro e modicarlo sotto forma di diagrammi a blocchi ed ha un completo sistema di gestione del progetto come si puo vedere in Figura 2.6 che mostra l'interfaccia graca dell'ambiente di sviluppo. Figura 2.6: Interfaccia graca di EDK Come si vede in Figura 2.6 il piano di lavoro e diviso in quattro parti: in alto sviluppata per tutta la larghezza sono presenti i menu a tendina dai quali si accede a tutte le opzioni e funzinalita di EDK. Sotto i menu a tendina si trovano i bottoni di accesso rapido ai tool principali in seguito mostrati oltre ai classici bottoni per il salvataggio e apertura di progetti. In Figura 2.6 lo spazio e diviso in tre grandi riquadri dall'aspetto familiare a quelli di Project Navigator, infatti la casa realizzatrice dell'interfaccia graca e la medesima 2.3 Software e strumenti 31 per entrambe le applicazioni. Nel riquadro A, sulla sinistra, tramite click sulle linguette in alto, e possibile accedere a diverse schermate. Nella sezione System, si ha una visione d'insieme del progetto e di tutti i sui le cos da poterli aprire e visualizzare sul riquadro grigio sulla destra. Con Application di accede alle opzioni dei tool utilizzati come per esempio quelli di compilazione e al le System.c che contiene i comandi eseguiti dal processore. Con Options invece si gestiscono alcuni parametri di compilazione. Inne, tramite Symbols si accede al menu di tutti i componenti disponibili in libreria per aggiungerli a un progetto. Tutto il progetto e accessibile quindi, dal menu System rappresentato in Figura 2.7, le prime voci, precedute da un'incona a forma di chip, sono i componenti presenti in tutta l'architettura e sempre clickandoci sopra si accede a un menu con la voce proprieta in cui si possono vedere e modicare i principali parametri. Sotto la voce projectFiles ci sono i le di sistema che sono MHS, che descrive l'hardware presente nel progetto sotto forma di elenco con nomi e valori di bus, MSS che denisce le interfacce dei componenti, PBD che e una descrizione stile CAD del progetto e che sara successivamente descritta. I principali tool supportati e ai quali si e prima accennato sono: Library Generator , LibGen, per la personalizzazione delle librerie, drivers e gestori di interrupt. Partendo dai le .mdd, che contengono l'elenco delle librerie necessarie alla compilazione dei driver e la locazione di questi ultimi, compila i driver seguendo le indicazioni contenute nel le makele per ogni singolo core presente nel sistema dedicato. Compilatori GNU per compilare, assemblare e linkare i programmi. Compile Program Sources, tramite il compilatore GNU GCC compila i le del sistema, tipicamente chiamati System0.c, System1.c System[numero processori presenti].c, generando il le executable.elf. 2.3 Software e strumenti 32 Figura 2.7: Menu System di EDK Plataform Generator, PlatGen, richiamato col bottone generate netlist, genera una gerarchia di netlist NGC che fa capo a un le NGD, Native Generic Database, cio signica che ogni core presente nel le MHS e quindi nel sistema viene sintetizzato, quindi si ottengono le che contengono elenchi di componenti, porte logiche e interconnessioni adeguatamente collegate tra loro. Generate BitStream: richiama il programma XFlow con le opzioni contenute nei le fast runtime.opt e bitgen.ut che si trovano nella cartella etc del progetto. A sua volta XFlow richiama gli strumenti di implementazione di ISE che generano il bitstream. 2.4 La Metodologia 33 Update Bitstream, questo comando invoca il programma bitinit, in questo stadio si ha che la parte hardware e la parte software del lavoro si fondono a formare una unica entita sotto forma di le download.bit pronta a essere copiata sul chip tramite il programma IMPACT o tramite il programma situato in etc/download.cmd richiamato dal tasto Download. Simulation Model Generator , SimGen, genera il modello hardware per la simulazione e i le di compilazione per il sistema, cos da permettere la simulazione dell'intero sistema in ambiente modelsim. Inne particolare attenzione meritano due strumenti per comodita e utilita: l'editor CAD per l'architettura e il wizard per importare IP Core. Per attivare l'editor CAD e suciente fare doppio click sul le .pbd prima descritto nel riquadro A, per far comparire nel riquadro B il disegno schematizzato dell'architettura che si sta realizzando. Da questo schema facendo doppio click si puo' accedere a sommario delle caratteristiche di ogni componente come lo spazio di indirizzi, gli eventuali parametri, le porte utilizzate ed eventuali gestori di interrupt. Inoltre usando gli strumenti, comparsi insieme al CAD nel menu in alto, si possono disegnare altre reti o aggiungere altri componenti. Il wizard per importare IP Core e particolarmente utile dal momento che in pochi passi guida l'utente all'inserimento di un nuovo core sgravando l'utente del compito di indicare le porte di ingresso e uscita di dover copiare a mano i le nelle cartelle adatte e di molti altri compiti ora divenuti automatici e quindi meno soggetti a errori. 2.4 La Metodologia In questa sezione si spiega il modus operandi seguito per svolgere il progetto, cos da permettere un usso di lavoro ordinato, eciente e veloce. 2.4 La Metodologia 34 Comprensione del Problema Il primo passo seguito e stato quello di comprendere al meglio le speciche del problema: capire che cosa si deve realizzare, studiando il documento del NIST riguardante l'AES, e come realizzarlo, cercando di semplicarlo dividendolo in subproblemi da sviluppare singolarmente nelle fasi successive. Creazione delle entita e funzioni in VHDL Una volta identicati i subproblemi si e scelto quali implementare come entita e quali come funzioni all'interno di un package. Si sono realizzate tutte le interfacce e, dopo un'attenta analisi, si sono creati i tipi principali di segnali coi quali far comunicare e funzionare queste interfacce, segnali che avrebbero inuenzato tutto il lavoro dall'inizio alla ne. Implementazione Successivamente si e passati alla fase implementativa: tranne poche eccezioni, per la maggior parte delle entita si e scelto di implementarle in VHDL usando i process. Cio signica che si e scelto di scrivere in stile behavioral, e lo si e fatto per motivi di comodita e per la semplicita col quale un informatico puo imparare questo stile. Per le funzioni all'interno del package invece non c'e stata scelta dato che la sintassi VHDL prevede solo costrutti behavioral per la descrizione di queste ultime. Verica Ogni funzione ed entita e stata testata inserendola in un apposita architettura nel quale si controllavano i valori restituiti dell'entita/funzione a seconda dell'ingresso forzato dall'autore. I valori utilizzati erano solitamente quelli forniti nel documento del NIST e di cui si conoscono gia i risultati relativi generati dalla coppia valore-processo. Sintesi La sintesi si e fatta una volta vericato il funzionamento dell'intero sistema tramite Project Navigator e la si avvia con il comando Synthesize. Questa operazione ha triplice funzionalita: 1. Controlla la presenza di eventuali errori nel codice mediante il compilatore incorporato. 2.4 La Metodologia 35 2. Controlla l'assenza di strutture VHDL non supportate dai dispositivi FPGA e con le quali quindi l'IP Core non puo essere descritto. 3. Sintetizza, misura le prestazioni e le risorse occupate dal core permettendo di vericare quindi la possibilita di inserire il core all'interno di una determinata archittura. Adattamento per FPGA L'adattamento del codice ad una architettura sincrona e un'operazione indispensabile per poter portare il codice scritto come archittura autonoma all'interno di una architettura piu grande con un clock, piu bus e un processore. Per questa operazione bisogna ridisegnare le interfaccie delle entita anche siano compatibili col bus di sistema. Inoltre, per far da tramite tra il software della scheda e la IP Core progettata, bisogna scrivere dei driver e il le sistem0.c. Verica nale e test Per testare il lavoro di trasporto su FPGA prima accennato, si utilizza sempre modelsim per il codice e una volta appurato il suo funzionamento si possono testare i driver e il sistem.c su scheda provando a programmarla. Capitolo 3 Implementazione In questo capitolo si esporrera tutto il procedimento di implementazione del progetto, evidenziandone i passi principali, le dicolta incontrate e le scelte prese. Nell' esporre questo processo si seguira l'ordine temporale col quale sono stati arontati. Si iniziera dunque con la descrizione dell'architettura in VHDL analizzando il codice suddiviso secondo il criterio di funzionalita e anche di modularita col quale era stato inizialmente concepito. 3.1 Traduzione dell'algoritmo in codice VHDL Il primo passo per codicare tutto l'algoritmo e stato quello di dividere il lavoro in diverse parti piu semplici da codicare, da testare e soprattutto da poter riutilizzare o aggiornare. La scelta e stata quella di creare una libreria o package poi chiamata util che si sarebbe sviluppata con codice e relativo testing, parallelamente a quello di due architetture separate: il keyexpander e il cipher sviluppati necessariamente in ordine di apparizione e testati separatemente Per scrivere il codice dell'algoritmo si sono utilizzate soluzioni diverse a seconda del problema incontrato; il risultato nale sono stati comunque due le: il motivo di questo passaggio dalle 2 architetture piu package ad una architettura piu libreria e dovuta ad una scelta di semplicita e di maggiore velocita. L' implementazione che comportava il completamento del keyexpan- 3.1 Traduzione dell'algoritmo in codice VHDL 37 der con la parte relativa al cipher, infatti, risparmia la creazione di una terza architettura necessaria per far comunicare una architettura keyexpander e il cipher. L'architettura, presente nel le algo.vhd e nominata cipher mentre per il package, si veda il le util. In linea di massima si e preferito scrivere il codice VHDL attenendosi allo stile di programmazione imperativa, sfruttando quindi i process con le sue costruzioni tipiche con cicli for e while e l'uso delle funzioni implementate nel package util. 3.1.1 La libreria util La libreria util e divisibile idealmente in due parti: una parte in cui si dichiarano tipi e costanti e una in cui si deniscono le funzioni. Nella prima si trovano due livelli di tipi: Type e Subtype, ovvero tipo e sottotipo; i sottotipi sono bit4, bit8 e word, che sono raggruppamenti di segnali in half-byte, byte e word utili per la costruzione degli altri tipi e ottenuti come std logic vector di lunghezze diverse. Al secondo livello dichiarati come TYPE si trovano segnali composti dai SubType essi sono: Stato type: che rappresenta lo stato della computazione, qui implementato come un array di 16 bit8. key type: un array di 16 std logic vector da 8 bit che e utilizzato per variabili che conterranno la chiave. reg w: un array di 44 word che contiene la chiave espansa. Successivamente si trovano i tipi con type, sbox type e div type: sono vettori di interi utilizzati successivamente per dichiarare costanti piu avanti descritte. Dopo la dichiarazione dei tipi, si trovano quindi le costanti indispensabili per risolvere semplicemente funzioni che richiederebbero complesse 3.1 Traduzione dell'algoritmo in codice VHDL 38 e costose operazioni matematiche, facendo semplicemente delle lookup su tabelle. La prima, con type, la si usa nella dichiarazione del vettore di costanti Rcon, la seconda, sbox type, per la costante S box mentre la terza, Div type, la si usa per ottenere l'operazione mod. Nella seconda ideale parte della libreria sono presenti le funzioni: Rotword, Sostituisci, Sostituisci 4. La funzione Rotword implementa l'omonima funzione specicata dallo standard: molto semplicemente prende in ingresso una parola da 32 bit composta idealmente da 4 byte: a, b, c, d e da in uscita una parola da 32 con i byte nell'ordine b, c, d, a scomponendo l'input in 4 variabili da 1 byte e ricomponendolo in uscita nell'ordine desiderato servendosi dell'operatore di concatenamento. La funzione Sostituisci 4 implementa la funzione AES chiamata SuBWord e applica ad ogni singolo byte della parola da 32 bit di ingresso la seguente istruzione: TO UNSIGNED(SBOX(To INTEGER(unsigned(input(31 downto 24)))), 8) che prende un gruppo di 8 bit lo trasforma in un numero intero che viene usato come indice del vettore di costanti SBOX, ottenendo cosi' la sostituzione da tabella desiderata, ma in forma di intero. Per restituire un vettore di std logic vector si e la funzione to unsigned al quale poi si applica un cast a std logic vector. La stessa cosa viene fatta da Sostituisci, ma su un solo byte. 3.1.2 Il KeyExpander L'algoritmo e codicato sul le CodAlgo.vhd in maniera molto simile allo pseudo codice dato dal ps-197 e presente in questo documento in Figura 1.3. L'entita si presenta come un'archittura con tre porte: key e clock come segnali di ingresso ed s come segnale di uscita contenente la chiave espansa. Subito dal codice si puo notare che si e preferito istanziare delle variabili di appoggio alla computazione piuttosto che dei segnali per la loro continuita di aggiornamento piu semplice e familiare ad un programmatore per la gestione, 3.1 Traduzione dell'algoritmo in codice VHDL 39 Figura 3.1: Immagine RTL dell'archittettura tra queste variabili si segnala la variabile w che contiene la chiave espansa no alla ne del procedimento. Una volta testata la funzionalita del codice, con la metodologia indicata nel capitolo sul testing, per esigenze di sviluppi futuri del lavoro come periferica per FPGA, si e provato a sintetizzare questa parte di lavoro con Project Navigator e si e constatato, come si spiega meglio nel capitolo Sintetisi con Project Navigator, che era necessario un passaggio della forma del codice con for ad una forma con macchine a stati, forma che ovviamente e rimasta anche per la codica successiva del cipher. Nella macchina a stati rappresentata in Figura 3.2 i cicli for sono stati trasfomati in stati ai quali, mediante l'utilizzo di contatori per determinare la terminazione del loop, ci si ritorna ciclicamente no all'esaurimento del numero di iterazioni predeterminato e il conseguente passaggio a un altro stato. In cod2 si nota che all'interno dello stato '0' si trova un ciclo col quale si copia la chiave nelle prime quattro celle del registro della chiave espansa. Al termine del ciclo, ip, che e il contatore delle iterazioni, viene incrementato di 4 e lo stato prossimo statop passa a uno, nel successivo fronte di clock anche lo stato passera a uno, grazie al processo controlla che si occupa appunto di aggiornare lo stato ad ogni fronte. Nello stato uno invece si esegue del codice equivalente al secondo ciclo for che si vede in Figura n.1, sempre con l'ausilio del segnale ip che una 3.1 Traduzione dell'algoritmo in codice VHDL 40 Figura 3.2: Schema della macchina a stati volta superato il valore 43 provochera il passaggio allo stato 2, stato in cui termina il calcolo e si assegna alla porta di uscita s il valore contenuto in w. 3.1.3 Il Cipher Come precedentemente esposto, si e preferito scrivere il cipher come completamento del codice scritto per il keyexpander, aggiungendo altri stati a quelli gia precedenti. Per prima cosa si e modicata l'interfaccia dell'entita: ora ha come porte di input la chiave, il blocco da cifrare e il segnale di clock; in uscita invece ha un output di tipo stato type che e il blocco cifrato. In questa fase sono state aggiunte nuove funzioni alla libreria del progetto, util. La prima e AddRoundKey, descritta nell'introduzione all'AES, e stata qui implementata facendo uno xor tra lo stato in input e celle del registro di chiave espansa determinata dal round, ovvero dal numero di iterazioni di calcolo gia svolte. La funzione ShiftRows e stata ottenuta assegnando direttamente a ogni singola cella dello stato attuale la cella dello stato successivo 3.2 Adattamento per FPGA 41 che si puo determinare guardando la Figura 3.3 La funzione SubBytes scorre Figura 3.3: funzione shiftRows tutto l'array dello stato e per ogni cella applica la funzione Sostituisci. In ultimo la Mix Columns e stata implementata con l'ausilio di altre 3 funzioni: la LoShift, che fa lo shift a sinistra di un bit per un bit8, creata pur sapendo dell'esistenza della funzione ssh che non si e riuscita ad utilizzare. La funzione xtime02 ottenuta facendo uno shitf a sinistra con LoShift e uno xor con la parola 1b condizionato dal valore del primo bit della parola di ingresso alla funzione. L'ultima funzione utilizzata e stata xtime03 che fa uno xor tra la parola in ingresso e il risultato della xtime02 sempre sulla parola d'ingresso. Tornando alla codica dello pseudo codice si inizia con una modica allo stato '2': non c'e piu l'assegnazione verso la porta d'uscita, visto che e stata eliminata, ma si applica il primo AddRoundKey e si passa allo stato 3. Il terzo stato si esegue 10 volte come il ciclo for in Figura 1.3 e infatti, ciclo e stato eseguono la stessa serie di operazioni che una volta terminati portano allo stato 4 e da li' al 5 con l'assegnazione del valore contenuto nella variabile temporanea al segnale di uscita. 3.2 Adattamento per FPGA In questa sezione si aronta il problema di portare il codice n qui realizzato in un'architettura piu grande funzionante su FPGA e tutti i relativi problemi 3.2 Adattamento per FPGA 42 di interfacciamento con il bus dell'architettura e gestione di interrupt. 3.2.1 L'architettura L'architettura utilizzata, mostrata in Figura 3.4 , e basata sul un processore Microblaze connesso a diversi bus che gli permettono di raggiungere diversi altri componenti tra cui un modulo di debug, un opb gpio, un opb uartlite e l'IP Core Kver la cui istanza e qui chiamata kver 1 e, come suggeriscono i primi due nomi, tutte e tre questi componenti sono connessi via On-chip Peripheral Bus, OPB. Il processore Microblaze e un soft core dedicato, con un set ridotto di istruzioni a 32 bit, Reduced Instruction Set Computer, RISC, ottimizzato per l'implementazione su FPGA Xilinx. Tra le caratteristiche di questo processore ci sono i data bus a 32-bit conformi alla specica IBM per il bus OPB che, come abbiamo detto, e il bus principalmente utilizzato in questo lavoro. Questo bus e parte della architettura CoreConnect progettata da IBM, ed si tratta di un bus sincrono generico, ideato per una semplice connessione di dispositivi onchip. La Opb gpio viene utilizzata semplicemente per l'accensione di un led mentre la Uartlite viene usata per comunicare via HyperTerminal eventuali messaggi durante l'esecuzione del programma eseguito dal processore. 3.2.2 L'IP Core Kver Il nome Kver deriva da un susseguirsi di vicende di sviluppo, prove, test, riscrittura e rinominazioni tipiche di questi lavori; comunque K sta per KeyExpander mentre ver e l'abbreviazione di versione; il nome pero e rimasto questo nonostante la funzionalita si sia decisamente modicata. Come abbiamo detto l'IP Core e tutto il dispositivo e per funzionare ha bisogno di diversi altri elementi. Per avere un quadro d'insieme si mostra un'immagine della gerarchia delle cartelle che lo contengono. Questo IP Core e quindi frutto del lavoro n qui fatto, lavoro che e stato riorganizzato nello schema in Figura 3.2 Adattamento per FPGA 43 Figura 3.4: Architettura 3.5. Il codice VHDL si trova sotto la cartella hdl, li si trovano due le ora: il kver core.vhd contiene appunto il core comprensivo di libreria util, keyexpander/chiper con l'aggiunta di nuovi processi che saranno spiegati piu avanti. I le sotto data sono le necessari nella gestione da parte di EDK della IP Core e contengono i settaggi della stessa come l'indirizzo di base, locazione dei driver, porte, bus a cui e collegata e altre simili. In source si trovano i le dei driver, sono due: uno contiene il driver vero e proprio ed e un le .c, l'altro e un le di header .h il funzionamento di entrambi sara mostrato nel paragrafo 3.2.5. Inne il le makele e un le di script con le indicazioni per i compilatori. 3.2 Adattamento per FPGA 44 Figura 3.5: Gerarchia dell'IP Core 3.2.3 Interfacciamento con bus opb In questa fase l'obiettivo e inserire il codice n qui realizzato nell'interfaccia che poi comunichera con il bus opb. A tale scopo si utilizza la periferica Pselect. Tale core, utilizzato anche in altri core della libreria di IP Core della Xilinx come opb timer e opb uartlite, ha come compito quello di selezionare la periferica, dal nome peripheral select, ovvero abilitarla e renderla attiva; in particolare esso alza il segnale CS, per fornire alla periferica una sorta di enable grazie al quale essa risulta sensibile ad eventuali dati provenienti dal bus o viceversa. Il segnale CS viene attivato nel momento in cui lo spazio di indirizzamento del bus utilizzato coincide con lo spazio di indirizzamento 3.2 Adattamento per FPGA 45 Figura 3.6: Interfacciamento al bus assegnato alla periferica. Al processo Calc del le cod3, sono stati aancati due processi: read from registers e write to registers per la lettura e scrittura sui registri per la comunicazione del core con l'esterno. In opb kver si dichiarano le interfacce e si uniscono tramite portmap la periferica di pselect e il core creato, inoltre si sviluppa il processo di latch indispensabile per l'i/o della periferica. All'interno di ver module e presente il core vero e proprio. Per far fronte alla necessita di interfacciamento il codice e stato notevolmente modicato a partire dall'interfaccia dell'architettura. Essa non presenta piu le porte di tipo key type e stato type per l'input e output bens una porta read data e write data che insieme alla porta di interrupt saranno fondamentali per la comunicazione da e verso l'esterno con un processo piu avanti descritto. Dopo la descrizione delle varie porte inizia la descrizione dell'architettura con i segnali interni per far funzionare i process che seguono. Il primo process che si vede e il process Calc che e praticamente lo stesso codice derivante dal lavoro con Project Navigator con una modica: il processo di espansione della chiave non parte ntanto che la variabile key ready, di tipo intero non varra zero. Quindi il process inizia dallo stato 5 e rimane li' nche la key ready non verra modicata a zero con conseguente modica dello stato prossimo, statop. Questa variazione era necessaria perche, ovviamente, bisogna aspettare che la chiave sia presente in qualche registro della periferica, 3.2 Adattamento per FPGA 46 Figura 3.7: Interfaccia di pselect prima che si inizi a fare calcoli su di essa e sul blocco di input. Della copia del plaintext e della chiave da utilizzare sui registri, se ne occupa il processo Write to register e lo fa nel seguente modo: a fronte di un evento di clock con livello alto, segnale di enable alto e RD NWR basso a seconda dell'oset dell'indirizzo, memorizza il dato sul registro indirizzato, ogni registro viene copiato con la stessa procedura con eccezione dell'ultimo che alza il segnale key ready e fa partire il processo Calc. Via driver si garantira che l'address 0C, ovvero quello che alza key ready, sara inviato per ultimo cosi' che tutta la chiave e plain text sara sicuramente copiata sui registri e il processo di espansione della chiave potra partire facendo calcoli su dati utili. Una volta elaborato il crittogramma Calc salva il risultato sul registro output e alza il segnale di interrupt reg intr diretto al driver che richiedera quindi la disponibilita della soluzione su registri mediante la funzione read to register. Quest'ultima funzione a seconda dell'oset dell'indirizzo rende disponibile sul registro reg data una corrispondente riga del registro output. 3.2.4 Sintesi con Project Navigator Questa fase consiste nella compilazione e nella sintesi del codice tramite Project Navigator per renderlo eseguibile su una FPGA che impone restrizioni 3.2 Adattamento per FPGA 47 sulla sintassi VHDL e sulle dimensioni dell'architettura: il fatto e che all'inizio VHDL non fu ideato come possibile passaggio di progettazione in prospettiva di una sintesi e molti suoi costrutti non sono supportati da questi processi. Tuttavia per quanto riguarda la sintassi non si sono riscontrati problemi, come si nota dal codice del le cod3 ed util nei quali infatti non sono presenti cicli while o altri operatori non consentiti, per cui la compilazione ha avuto successo al primo tentativo. Nella fase di sintesi, invece, si sono trovate delle dicolta dovute alla procedura di elaborazione, da parte del software, dei cicli for. La procedura per la sintesi dei for prevede che tutte le strutture, necessarie per completare un ciclo for, vengano ripetute tante volte quante sono le iterazioni per un utilizzo in parallelo, con un notevole assorbimento di risorse in termini di slice. In particolare cio succedeva al codice del le codAlgo, spiegato precedentemente, in quanto e basato sostanzialmente su un ciclo ripetuto 40 volte, all'interno del quale si costruiscono 4 tabelle da 256 numeri interi che portava puntualmente a utilizzare piu del 390% delle risorse. Tale problema e stato risolto ristrutturando l'architettura come una macchina a stati; ricorrendo infatti a questa tecnica, il sintetizzatore non ripete piu le strutture ma, anzi, riconosce e identica l'algoritmo come macchina a stati e ottimizza la netlist per tale struttura come si vede dall'estratto di un report di sintesi dell'IP Core in Figura 3.8. Questo sistema che Figura 3.8: Riconoscimento della macchina a stati oltre ad essere molto costoso in termini di spazio e anche inutile agli scopi dell'algoritmo che attende comunque sempre la computazione del ciclo precedente. La prima macchina a stati sviluppata, osservabile nel le cod2 consta di 2 stati, che altro non sono che i 2 cicli for precedenti riscritti in maniera 3.2 Adattamento per FPGA 48 diversa, tali da essere meglio sintetizzati, e da un altro processo che gestisce l'aggiornamento del segnale rappresentante lo stato per il passaggio da uno stato all'altro. Lo stato della macchina e rappresentata da un segnale di tipo intero chiamato stato. Questo segnale e inizializzato a zero cosi' che, quando inizia la computazione, si entra subito nella prima parte di codice nella quale si copia la chiave nel registro. Una volta nita questa fase il segnale di stato si porta al valore di uno che portera l'esecuzione alla seconda parte. Una volta terminata lo stato della macchina passa a 2 in cui si copia il contenuto della variabile w nel segnale di uscita s. Inoltre, nel tentativo di diminuire le risorse impiegate, si e realizzato l'operazione di divisione per 4 utilizzando una tabella monodimensionale al cui interno sono inseriti i risultati della divisione dell'indice del array per 4, cosi' che un accesso per lookup al vettore fornisce il risultato della divisione. Il risultato della sintesi sara poi punto di partenza per l'analisi per le prestazione nel capitolo sui risultati sperimentali 3.2.5 I Driver e il le System.c I Driver e il le System.c hanno la funzione di permettere al processore MicroBlaze di utilizzare la IP Core in tutte le sue parti: dalle funzioni di scrittura sui registri per l'ingresso e uscita alla gestione degli interrupt. Per adesso si e scelto di scrivere driver di basso livello infatti li si puo trovare sotto src con nome kver I a indicare che sono di livello 0, in pratica sono deniti nel le .h e sfruttano la libreria Xio.h e le funzioni Xio Out32 e Xio In32. Arrivati a questo punto e necessario, se non indispensabile, dare uno sguardo complessivo al funzionamento di tutto il meccanismo n'ora creato, soprattutto per scrivere il le System.c. Nel le kver module i tre processi piu interessanti sono: Calc che fa i calcoli di espansione della chiave secondo l'algoritmo Rijndael; Read from registers che a seconda dell'indirizzo mandato rende disponibile sulla porta reg data una sola parola della chiave espansa e il processo write to register che copia, a seconda sempre dell'indirizzo passato, il dato presente sulla porta Write data sul registro di key relativo. Quello che deve fare System.c e di coordinare queste operazioni: quindi per 3.2 Adattamento per FPGA 49 prima cosa invia tramite la funzione kver mWriteReg, all'oset dato dalla costante denita in libreria KEY0/1/2/3, un intero unsigned che sarebbe la prima/seconda/terza/quarta parte di chiave. Una volta consegnato l'ultimo bit della chiave, si alza una specie di interrupt interno alla periferica: il segnale key ready di cui sopra si e parlato, esso causa l'inizio dell'elaborazione che, a sua volta, una volta terminata, alza l'interrupt alzando il segnale reg intr a signicare che il risultato e disponibile. All'interno del System.c quindi si trova una funzione per gestire gli interrupt che kver interrupt hundler. Per gestire gli interrupt non fa altro che controllare se il registro con l'interrupt e settato alto e nel caso fa partire una routine. La routine consiste nel copiare i registri con il testo cifrato disponibile sugli oset BLOCK0, BLOCK1 ecc... Inne abbassa il segnale di interrupt. Capitolo 4 Test e conclusioni In questo capitolo si espongono le metodologie di verica del funzionamento dell'IP Core in tutte le fasi di sviluppo secondo l'ordine col quale sono state eseguite. Si mostrara prima il test del codice VHDL e successivamente i passi seguiti per provare l'IP Core sul chip. Inne si tireranno le somme del lavoro n qui eseguito e si prospetteranno i possibili sviluppi futuri. 4.1 Verica del codice VHDL Il test del codice e stato eettuato in diversi modi a seconda del problema arontato. Questa sezione serve a mostrare come si e eseguito il testing di tutto il codice VHDL nelle varie versioni e parti. Partendo dalla fase iniziale col testing delle singole funzioni arrivando alla prova nale di tutto l'IP Core nel complesso. Ogni funzione, quindi, e' stata testata singolarmente richiamandola, in una generico testbench in Figura 4.1 con dati presi dalle tabelle presenti nel documento ps-197. I risultati si sono ottenuti simulando l'architettura mediante Modelsim e osservando i valori di res1 e res2 sul monitor dei segnali o della memoria presenti in nel medesimo programma. Per testare invece nella totalita' il codice del cipher, si e' utilizzata una architettura, testcipher.vhd, che al suo interno crea un istanza del cipher, gli passa una chiave in ingresso e ne registra l'uscita su un altro registro. Il confronto dei 4.1 Verica del codice VHDL 51 Figura 4.1: Architettura per il test dati e stato attuato poi a mano con dati sicuramente corretti, forniti dal documento ps-197, che in una tabella fornisce chiave e relativa chiave espansa calcolata. La chiave data e': 2b 7e 15 16 28 ae d2 a6 ab f7 15 88 09 cf 4f 3c La chiave espansa la si puo' leggere a pagina 52 del documento ps-197 [10] nell'ultima colonna. Anche per il testing del cipher si e' usata un'architettura simile ma con ingressi ovviamente diversi. Questa volta quindi i dati sono la chiave e il blocco in ingresso e in uscita si ottiene un altro blocco di tipo stato type che poi e il crittogramma. Si e' provato con i dati: 4.2 Prove su FPGA 52 Plain Text = 32 43 f6 a8 88 5a 30 8d 31 31 98 a2 e0 37 07 34 Cipher Key = 2b 7e 15 16 28 ae d2 a6 ab f7 15 88 09 cf 4f 3c Che hanno dato in uscita Output : 39 25 84 1d 02 dc 09 fb dc 11 85 97 19 6a 0b 32 Plain text: 00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee Key: 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f Output : 69 c4 e0 d8 6a 7b 04 30 d8 cd b7 80 70 b4 c5 5a Anch'esso con esito positivo. 4.2 Prove su FPGA In questo sottocapitolo si presenta la fase in cui, una volta vericato il funzionamento del codice, si prova a programmare il chip. Strumenti fondamentali per questa parte sono EDK con il generatore di bitstream, l'inizializzatore di bram e il programmatore, download bitstream. 4.2.1 Generare il bitstream Arrivati a questo punto, ci si trova con l'IP Core gia sintetizzato con Project Navigator e inserito nella gerarchia corretta, a questo punto si ripete l'operazione di sintesi con il programma di EDK. Bisogna, infatti, essere stati abbondanti con le risorse inutilizzate segnalate dalla sintesi di ProjectNavigator nel riassunto Resource Report di cui si puo vedere un esempio in Figura 4.2. Gia un utilizzo del 90 % segnalato da quest'ultimo su qualsiasi valore, quale quo essere Number of Slices o Number of 4 input LUTs, e con la sintesi con EDK si avra un sovrautilizzo, overmap, delle risorse, da cio, l'indicazione di stare sotto il 90%, questo comportamento e dovuto ai diversi parametri che i due compilatori possono avere. Una volta eettuata la sintesi con Generate Netlist si ha il responso denitivo, se non ci sono errori si puo generare il bitstream col comando apposito. 4.2 Prove su FPGA 53 Figura 4.2: Resource Report sotto Project Navigator 4.2.2 Download del BitStream La programmazzione vera e propria del chip avviene ora: una volta resettata tutta la scheda, per fare cio e suciente staccare e riattaccare l'alimentazione, si puo dare il comando ad EDK di eettuare il download del bitstream. Si copiera quindi il bitstream in memoria e si programmera la scheda tutto in automatico. Prima pero di partire con il download si deve aprire una sessione di telnet sulla porta COM impostata alla velocita di 19,200bit per secondo. Una volta completato il download del bitstream la periferica iniziera subito a Figura 4.3: Icona del comando Download svolgere le sue funzioni secondo le direzioni del processore e del le System0.c, eventuali output si possono vedere dalla sessione di telnet. 4.3 Risultati sperimentali 54 4.3 Risultati sperimentali Dalla sintesi e generazione del bitstream si ottengono diverse informazioni sulle tempistiche e sulle risorse utilizzate che verranno in questa sede esaminate. 4.3.1 Tempistiche Il sommario sui risultati dei tempi, visibile in Figura 4.4 indica l'assenza di errori, 190130 possibili percorsi del core e 11949 connessioni fra i vari banchi logici. Indica inoltre che il periodo minimo di clock col quale e sicamente possibile far girare la periferica e di 17, 788ns corrispondenti a una frequenza massima di 56,218MHz. Mediante Modelsim inne mediante la simulazione Figura 4.4: Sommario delle tempistiche del core si e misurato il tempo di crittazione di un blocco di 128, andando a cercare dopo quanto tempo si ottenessero i risultati. Il tempo misurato e di 1,41 microsecondi che rapportati al blocco di dati da 128 bit indicano una velocita di: 128 = 91; 4 1 41 ; bit M egabit microsec s 4.3 Risultati sperimentali 55 4.3.2 Consumo delle risorse Le risorse utilizzate da questa IP Core sono calcolate in quantita di LUT, Slice, Flip Flop e Latch utilizzate sul totale. Dalla Figura 4.6 si vede che non sono state utilizzate tutte le risorse disponibili rispetto alla dimensione Figura 4.5: Sommario delle risorse di kver totale della scheda ma una buona parte. In eetti il consumo di risorse non e, facendo un confronto con i dati sul consumo di risorse da parte della sola IP Core Kver, ai limiti della capacita del chip ma, nei calcoli bisogna inserire anche il consumo di risorse degli altri IP Core per svolgere funzioni collaterali quali, ad esempio, quelle di input-output. Figura 4.6: Sommario delle risorse di tutto il sistema 4.4 Conclusione e possibili sviluppi futuri 56 4.4 Conclusione e possibili sviluppi futuri Un lavoro simile e stato fatto in un elaborato di tesi in cui si e svolta un'implementazione AES a 512 bit, i risultati sperimentali segnalati in questo hanno mostrato una velocita di criptazione piu alta [14]. Questa dierenza delle velocita e dovuto ad una dierenza essenziale della realizzazione: mentre in quel lavoro la parte relativa al KeyExpansion e stata realizzata via software, in questo lavoro di tesi invece, ci si e concentrati sull'obiettivo di realizzare l'intero procedimento di crittograa via hardware. I risultati sono stati: un'allungamento del path e conseguentemente un peggioramento delle prestazioni. L'utilizzo di risorse da parte del IP Core Kver e, come si realizza dai paragra precedenti, quasi totale. Questa situazione rende dicile eventuali lavori futuri di espansione del progetto come la realizzazione della logica per la decrittazione o per la crittazione di blocchi di dati piu grandi. Per fronteggiare questo problema si possono attuare diversi miglioramenti al codice VHDL e alla struttura generica del IP Core. Per prima cosa si puo riscrivere il codice VHDL dell'algoritmo utilizzando un descrizione piu a basso livello cos da ottimizzare la sintesi del medesimo. Un'altro risparmio delle risorse lo si puo ottenere sfruttando il processore PPC gia presente sulla FPGA risparmiando cos lo spazio occupato dal softcore Microblaze. Inne e possibile diminuire ancora le risorse utilizzate spostando eventualmente la funzione di espansione della chiave, spiegata nel paragrafo 3.1.2, dall'originale descrizione VHDL e quindi hardware a una implementazione software all'interno del System0.c come fatto nel lavoro citato precendentemente [14]. La perdita di performance e sicura, ma contenuta. Questa soluzione sarebbe ottima per sessioni di crittograa di grandi quantita di dati con la stessa chiave, dato che la procedura di espansione della chiave, che fa da collo di bottiglia del sistema, verrebbe eseguita una sola volta all'inizio della sessione di crittograa. Oppure in maniera diametralmente opposta si possono aumentare le prestazioni del dispositivo aumentando il parallelismo dell'architettura, a scapito, questo, dello spazio lasciato libero 4.4 Conclusione e possibili sviluppi futuri 57 per altre applicazioni. Un tale parallelismo puo essere inserito nell'architettura all'interno della procedura di espasione della chiave: dopo ogni ciclo di espansione si potrebbero rendere disponibili le quattro chiavi che non sarebbero poi piu modicate dalla procedura cos da portare avanti il processo di crittazione. Tale modica velocizzerebbe, in particolare, quelle sessioni di crittograa nelle quali si cambia spesso chiave di crittazione. Legenda AES: Advanced Encryption Standard ASIC: Application Specic Integrated Circuit BRAM: Block RAM CBC: Cipher Block Chaining CFB: Ciphertext Feedback CLB: Congurable Logic Block DES: Data Encryption Standard DLMB: Data Local Memory Bus ECB: Electronic Codebook EDK: Embedded Development Kit EEPROM: Electrically Erasable Programmable Read Only Memory EPROM: Erasable Programmable Read Only Memory FPGA: Field Programmable Gate Arrays (array logico (ri)programmabile a campi) GF: Galois Field GPIO: General Purpose Input/Output Legenda HDL: Hardware Description Language I/O: Input/Output IDEA: International Data Encryption Algorithm IP: Intellectual Properties IPIC: Intellectual Properties InterConnect IPIF: Intellectual Properties InterFace LB: Logic Block LMB: Local Memory Bus LUT: Look-Up Table MB: MicroBlaze MDD: Microprocessor Driver Specication le MHS: Microprocessor Hardware Specication le MPD: Microprocessor Peripheral Description le MPGA: Mask Programmable Logic Array MSS: Microprocessor Software Specication le NGD: Native Generic Database NIST: National Institution of Standards and Technology OPB: On-chip Peripheral Bus PAL: Programmable Array Logic PAO: Peripheral Analyze Order le PAR: Place And Route 59 Legenda 60 PLA: Programmable Logic Array PLB: Processor Local Bus PLD: Programmable Logic Device PPC: Power PC Pselect: Peripheral select RAM: Random Access Memory ROM: Read Only Memory RSA: Algoritmo di di crittograa SRAM: Static Random Access Memory SSL: Secure Socket Layer VHDL: Very high speed integrated circuit Hardware Description Language Ringraziamenti Con questo lavoro si concludono tre anni di fatiche, sacrici e a volte delusioni, ma soprattutto gioie e soddisfazioni che non ho provato solo io, ma anche tutte le persone che mi sono state vicino e mi vogliono bene. Approtto di queste poche righe per ringraziarle di cuore. Un grazie alla Mamma, che non poteva che essere la prima, perche per prima sempre presente, sollecita verso i miei bisogni e paziente con le mie "sclerate" in casa dei periodi piu stressanti. Al Babbo, mai estroverso nell'esprimere i suoi sentimenti ma sempre pronto a spronarmi nello studio e le cui rare parole di elogio, sono state musica per le mie orecchie e carica di energia per la mia mente. A Sarah che, nonostante la giovane eta, si e sforzata di comprendere le mie necessita e i miei brutti periodi, sopportandomi. Dulcis in fundo, la nonnina: paziente e gentile che, con le sue preghiere a Padre Pio, mi sosteneva sempre prima di una prova di esame. Voglio ringraziare il prof. Ferrandi che gentilmente mi ha dato la possibilita di svolgere questa tesi e che si e sempre dimostrato disponibile e gentile. Grazie al Mega Correlatore Santambrogio che nel periodo durante il quale abbiamo lavorato insieme mi ha insegnato tanto e tanto aiutato. Inne voglio ringraziare tutti gli amici del Micro che mi hanno aiutato nelle varie fasi del lavoro (l'ordine e un po casuale e un po secondo l'ordine con cui gli ho incontrati): Stefano, Diego, Alessandro, Mattia, Massimo, Fabio ed Edo. Ed inne un grazie a tutti gli amici del corso di studi che mi hanno Legenda allietato le gionate al Politecnico. 62 Bibliograa , "Crittograa: principi, algoritmi [1] Paolo Ferragina e Fabrizio Luccio [2] Franco Fummi, Maria Giovanna Sami, Cristina Silvano [3] Alessandro Mele, Francesca Malcotti [4] e applicazioni", . , "Progetta- zione Digitale", . , "Denizione e utilizzo dei DRIVER in EDK", . ,Utilizzo di Modelsim per la simulazione comportamentale di un componente,. Massimo Ratti, Fabio Rizzato [5] Xilinx ,User Core Templates Reference Guide,Gennaio 2004. [6] Xilinx ,Processor IP Reference Guide,Gennaio 2004. [7] Xilinx ,User Core Template Reference Guide,Gennaio 2004. [8] Xilinx ,Microblaze Processor Reference Guide,Dicembre 2003. [9] Peter J. Ashenden, "The VHDL Cookbook rst edition", Luglio 1990. [10] National Institute of Standards and Technology (NIST), "Federal In- formation Processing Standards Publication 197 - Announcing the Advanced Encryption Standard (AES)", 26 Novembre 2001. [11] J. Daemen, V. Rijmen, " AES Proposal: Rijndael", 1999 BIBLIOGRAFIA 64 [12] Malcotti Francesca, Mele Alessandro, "Gestione degli interrupt con EDK", Politecnico di Milano - Laboratori di Micro Architetture, 2004. [13] Davide Murrai, Diego Nichetti, Stefano Orlandi, "Wizard per importare periferiche custom in un progetto EDK", Politecnico di Milano - Laboratori di Micro Architetture, 2004. [14] Roberto Palazzo, Davide Pavoni, "Realizzazione di un componente per un sistema dedicato: codica AES a 512 bit", Politecnico di Milano, 2004
Documenti analoghi
cv_Francesco Villella
Progettazione dell’architettura hardware di una centralina general purpose basata su
microcontrollore ATMEGA644
Progettazione dell'architettura hardware della piattaforma inerziale, dotata di
accel...