VHDL Realisation of SHA-256 Algorithm
VHDL Realisation of SHA-256 Algorithm
Elektrotehnički fakultet
mentor:
doc. dr Jelena Popović-Božović
1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2 Hash algoritmi . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.1 Kriptografski hash algoritmi . . . . . . . . . . . . . . . . . . . 6
2.2 Uvod u SHA funkcije . . . . . . . . . . . . . . . . . . . . . . . 9
2.3 SHA-256 algoritam . . . . . . . . . . . . . . . . . . . . . . . . 11
2.3.1 Pregled algoritma . . . . . . . . . . . . . . . . . . . . . 11
2.3.2 Opis algoritma . . . . . . . . . . . . . . . . . . . . . . 12
2.4 Poređenje SHA-1 i SHA-256 . . . . . . . . . . . . . . . . . . . 17
4 Simulacije . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
4.1 Modul Constants ROM . . . . . . . . . . . . . . . . . . . . . . 28
4.2 Modul Counter64 . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.3 Modul MainLoop . . . . . . . . . . . . . . . . . . . . . . . . . 30
4.4 Top Module SHA256 . . . . . . . . . . . . . . . . . . . . . . . 31
4.4.1 Simulacija obrade 1 bloka poruke . . . . . . . . . . . . 31
4.4.2 Simulacija obrade 2 bloka poruke . . . . . . . . . . . . 35
1
5 Zaključak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Literatura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
2
Slike
3
Tabele
4
Glava 1
Uvod
5
Glava 2
Hash algoritmi
Uopšteno, hash funkcija je bilo koja funkcija koja mapira podatke pro-
izvoljne veličine u podatke fiksne veličine. Vrednost koju vraćaju funkcije,
odnosno ti izlazni podaci zovu se često sažetak poruke, hash poruke, hash
suma, hash vrednost ili samo hash. Hash može da služi kao referenca na
originalni podatak. Uopštene hash funkcije ne moraju biti sigurne, čak po-
stoji zahtev da hash funkcija mapira slične ulazne vrednosti u slične izlazne
vrednosti, što je kontradiktorno sa osnovnim zahtevom kriptografskih i si-
gurnih/bezbednih hash funkcija.
6
• Preimage otpornost, funkcija treba da bude ireverzibilna
• Collision otpornost
Ova svojstva između ostalog podrazumevaju da ulazni podaci ne mogu
biti modifikovani a da se pri tome ne promeni hash vrednost poruke. Dakle,
ako dve poruke imaju isti hash sa velikom pouzdanošću možemo pretpostaviti
da su one iste. To podrazumeva da hash funkcija bude u velikoj meri otporna
na koliziju (collision resistant), što znači da treba da bude neizvodljivo naći
više različitih podataka koji generišu isti hash. Otpornost na koliziju delom
se postiže generisanjem velikih hash vrednosti, npr. SHA-1 generiše hash
dužine 160 bita dok SHA-256 generiše hash dužine 256 bita. Kriptografske
hash funkcije moraju biti što otpornije na napade na integritet podataka.
Neke vrste „napada” na kriptografske hash funkcije su:
• Pre-image napad, predstavlja napad kome je cilj da pronađe poruku
koja ima određenu hash vrednost. Definišu se dve otpornosti na ovaj
napad: preimage resistance i second preimage resistance. Preimage
resistance se ogleda u tome da je za gotovo svaki predodređen izlaz,
računski neizvodljivo naći ulaz koji, primenom hash funkcije, rezultuje
istim hash-om. Drugim rečima, ako nam je poznat hash h neke poruke,
neizvodljivo je naći originalnu poruku x takvu da je h = hash(x). Zbog
postojanja kolizije podataka, definiše se i second preimage resistance što
označava da je računski neizvodjivo naći poruku različitu od originalne
poruke ali takvu da je njen hash isti kao i hash originalne poruke.
• Collision napad, ili sudar, je napad koji pokušava da pronađe dve ula-
zne vrednosti koje daju isti hash. Za razliku od Pre-image napada, kod
collision napada hash nije specificiran.
7
• Birthday attack je napad koji je baziran na matematičkom problemu
Birthday problem ili Bithday paradox po čemu je i imenovan.
• Brute-force napad, je vrsta napada koja se, u teoriji, može koristiti pro-
tiv bilo kog enkriptovanog podatka. Često se koristi kada je nemoguće
iskoristiti neke slabosti enkripcionog algoritma. Ovaj napad je zapravo
isprobavanje svih mogućih kombinacija kod pogađanja šifre ili ključa, i
njegovo izvršavanje mnogo zavisi od dužine pogađane šifre
• Whirlpool
• Tiger
• GOST-3411
8
• SHA-3
• ...
9
• SHA-0: prvobitna verzija SHA algoritma koja je imala 160-bitne hash
vrednosti. Objavila ga je NSA 1993 pod imenom „SHA”, ali je ubrzo
povučena iz upotrebe zbog značajne mane koja nije otkrivena javnosti
i zamenjena modifikovanom verzijom pod imenom „SHA-1”.
10
Tabela 2.1: Pregled SHA funkcija
11
Da bi se poruka podelila u blokove fiksne dužine, najpre se mora dopuniti
odgovarajućim brojem bita. U slučaju SHA-256 funkcije, dodaje se jedan bit
vrednosti „1”, zatim se dopunjava bitima sa vrednošću „0” tako da preostane
64 bita do celobrojnog umnoška 512. Preostala 64 bita označavaju binarnu
predstavu dužine originalne poruke. Zatim se tako dobijena poruka podeli
na blokove od po 512 bita (M (1) , M (2) ...M (N ) ), i blokovi se obrađuju pojedi-
načno. Počevši računanje od fiksne inicijalne vrednosti međurezultata H (0)
sračunava se iterativno
Definicije
Korišćena je notacija prikazana u tabeli 2.2. Sve operacije podrazumevaju
32-bitne operande.
12
Inicijalna hash vrednost H (0) je predstavljena u tabeli 2.3. Ove 32-bitne
vrednosti su predstavljene u heksadecimalnom zapisu i predstavljaju razlo-
mljeni deo kvadratnog korena prvih 8 prostih brojeva.
13
σ1 σ0 W j
Pripremanje poruke
Kao što je rečeno ranije, pre početka sračunavanja hash vrednosti, poruka
se najpre mora pripremiti. To podrazumeva:
14
2. Poruka se deli u blokove od po 512 bita M (1) , M (2) , ..., M (N ) . Ovaj
postupak je već prikazan na slici 2.1. Prva 32 bita bloka i označavaju
(i) (i) (i)
se M0 , naredna 32 bita su M1 , sve do M15 . Koristi se big endian
format, odnosno u svakoj 32-bitnoj reči bit na skroz levoj poziciji je bit
najveće težine.
Glavna petlja
Sračunavanje hash vrednosti se nastavlja po sledećem postupku:
For i = 0 to N − 1 (N = broj blokova u proširenoj poruci)
{
15
• Sračunava se i-ti međurezultat hash vrednosti H (i) •
(i) (i−1)
H1 ← a + H0
(i) (i−1)
H2 ← b + H1
..
.
(i) (i−1)
H8 ← h + H7
}
(N ) (N ) (N )
Sada je H (N ) = (H0 , H1 , . . . , H7 ) hash poruke M .
Dijagram funkcije kompresije, odnosno glavne petlje, prikazan je na slici 2.3.
a b c d e f g h
∑0 Maj(a,b,c) ∑1 Ch(e,f,g)
Wj+Kj
Slika 2.3: Slikoviti prikaz izvršavanja j-te iteracije funkcije kompresije.
Primer
Uzmimo za primer prostu poruku „abc”. Karakteri su u ASCII formatu
pa poruka ima 24 bita. Proširenja poruka predstavljena je u tabeli 2.6 (u
heksadecimalnoj predstavi).
16
Uzmimo kao drugi primer poruku „acb”, iste dužine i istih karaktera ali
malo promenjenog redosleda. Proširena poruka predstavljena je u tabeli 2.7.
17
5. Inicijalizacija 5 radnih registara, a, b, ... , e sa vrednošću međurezultata
iz prethodne iteracije
(i−1)
a ← H0
..
.
(i−1)
e ← H4
6. For i 1 to N
{
T ← ROT L5 (a) + ft (b, c, d) + e + Kt + Wt
e←d
d←c
c ← ROT L30 (b)
b←a
a←T
}
5a827999 0 ≤ t ≤ 19
20 ≤ t ≤ 39
6ed9eba1
Kt =
8f1bbcdc 40 ≤ t ≤ 59
60 ≤ t ≤ 79
ca62c1d6
18
funkcije zavise od trenutne iteracije:
Ch(x, y, z) = (x ∧ y) ⊕ (¬x ∧ z) 0 ≤ t ≤ 19
P arity(x, y, z) = x ⊕ y ⊕ z
20 ≤ t ≤ 39
ft (x, y, z) =
M aj(x, y, z) = (x ∧ y) ⊕ (x ∧ z) ⊕ (y ∧ z)
40 ≤ t ≤ 59
P arity(x, y, z) = x ⊕ y ⊕ z)
60 ≤ t ≤ 79
19
Glava 3
3.1 VHDL
VHDL je jezik za opis hardvera koji se koristi u elektronskom dizajnu za
opis digitalnih sistema i sistema mešovitih signala kao što su FPGA (Field
Programmable Gate Array) čipovi i integrisana kola. VHDL se takođe može
koristiti kao opštenamenski jezik za paralelno (konkurentno) programiranje.
Standardizovan je od strane IEEE (Institute of Electrical and Electronics
Engineers) kao standard 1076 [5], na koji se vremenom nadovezuje veliki
broj dodatnih standarda.
VHDL je originalno osmišljen na inicijativu Ministarstva Odbrane Uje-
dinjenih Američkih država (U.S Department of Defense) kako bi proizvođači
jednoznačno dokumentovali ponašanje ASIC (Application Specific Integrated
Circuit) čipova ugrađivanih u uređaje. Sama ideja o mogućnosti simuliranja
ASIC čipova na osnovu ove dokumentacije je očigledno bila atraktivna da
su vremenom razvijeni logički simulatori koji mogu da čitaju VHDL kôd.
Naredni korak je bio razvijanje sofisticiranih alata za sintezu za VHDL kôd
koji proizvodi fizičku implementaciju opisanog kola (dizajn na nivou logičkih
gejtova).
Velika prednost VHDL, pri korišćenju za dizajn sistema, je to što je mo-
20
guće da se sistem opiše (modeluje) na nivou ponašanja, simulira i verifikuje
pre sinteze. Takođe velika prednost što VHDL omogućava opis konkurent-
nog sistema. VHDL je dataflow language za razliku od proceduralnih jezika
(„C”, assembler . . . ) kod kojih se instrukcije izvršavaju sekvencijalno, jedna
instrukcija u jednom trenutku. Projekat pisan u VHDL jeziku je portabilan
i ne zavisi od tehnologije.
3.3 Realizacija
Realizacija algoritma se sastoji iz više VHDL modula. Korišćena su 2
hijerarhijska nivoa. Na nižem hijerarhijskom nivou nalaze se 3 modula, dok
je na višem nivou modul koji ih objedinjuje, i svojim dodatnim funkcional-
nostima obezbeđuje pravilno izvršavanje algoritma. Hijerarhijski niži moduli
su opisani modelom ponašanja (behavioral model ), dok je hijerarhijski viši
nivo (top module) opisan mešovitim modelom, tj. i strukturnim (structural
model )i modelom ponašanja. Definisani su i opisani sledeći moduli sistema:
21
• „Counter64 ” - Brojač po modulu 64 koji se koristi za praćenje broja
iteracija pri izračunavanju hash vrednosti, kao i za adresiranje lokacija
u ROM-u. Modul je nižeg hijerarhijskog nivoa i opisan je modelom
ponašanja. Više o ovom modulu u poglavlju Counter64.
22
nih tipova i korišćenih konstanti. Definisan je tip „state” koji, sa svoje tri
moguće vrednosti (idle, hashing i output) predstavlja stanja kroz koja prolazi
konačna mašina stanja (Finite State Machine) opisana u modulu SHA256.
Takođe, radi lakšeg manipulisanja signalima, definisani tipovi „ArrayOfVec-
tors” (niz od 8 vektora tipa std_logic_vector dužine 32 bita) za potrebe
signala H0 , ..., H7 i a, b, ...h, kao i „MsgSchedule” (niz od 16 vektora tipa
std_logic_vector dužine 32 bita) za potrebe reda poruka, odnosno signala
koji pamti prethodnih 16 delova poruka (Wj ) kao što je prikazano u pogla-
vlju Definicije. Definisana je i vrednost konstante H_Init, odnosno inicijalna
vrednost signala H0 , ..., H7 kao što je prikazano u tabeli 2.3. VHDL kôd ovog
paketa može se videti u prilogu.
23
smeštanje u red poruka, narednih vrednosti a, b, ..., h). U glavnom modulu
(Top Module) brojač je instanciran i povezan sa ROM komponentom. Izvorni
VHDL kôd za opis ove komponente može se videti u prilogu.
24
init=’1’
reset inače
idle hashing
block_done=’1’
(bezuslovno, and
posle 1clk) last=’1’
output
Stanje FSM je tipa state definisanog u VHDL paketu i može imati sledeće
vrednosti:
• „idle” - Ovo je stanje mirovanja FSM. FSM prelazi u ovo stanje nakon
reseta sistema, kao i iz stanja „output” nakon završetka hash-ovanja
poruke. Izlazak iz ovog stanja određen je postavljanjem signala init na
vrednost „1”, nakon čega se prelazi u stanje „hashing”. Kako se u ovom
stanju ne vrše nikakve operacije, brojač je zaustavljen postavljanjem
njegovog resetnog signala na vrednost „1”, a u MainLoop modul se ne
šalju nikakvi korisni podaci.
25
inLoop, i one se koriste za ažuriranje reda poruka, i signala H0 , ..., H7
ukoliko je završena obrada jednog bloka. Ako se pri završetku obrade
jednog 512bitnog bloka detektuje aktivan signal last prelazi se u stanje
„output”, dok se u suprotnom ostaje u ovom stanju i očekuje se pri-
jem prvog dela poruke narednog bloka. Završetak obrade jednog bloka
naznačava se aktiviranjem signala block_done.
26
signalhash_valid. Spisak portova ovog modula dat je u tabeli 3.4, a izvorni
VHDL kôd za opis ove komponente može se videti u prilogu.
27
Glava 4
Simulacije
28
4.2 Modul Counter64
Za potrebe prikaza rezultata simulacija ConstantsROM modula napisan
je kratak Test Bench. Radi preglednosti, na vremenskim dijagramima pri-
kazano je samo nekoliko takt signala, odnosno nekoliko promena vrednosti
brojača koje prikazuju način funkcionisanja ovog modula, što se može videti
na slikama 4.2 i 4.3. Na prvoj slici prikazan je slučaj u kom brojač dostiže
vrednost 15, i njegov izlaz done_15, a na drugoj slici slučaj kada brojač
završi brojanje, i aktivira se njegov izlaz done_63.
29
Slika 4.4: Vremenski dijagram: simulacija ROM-a povezanog na brojač
30
prve dve iteracije obrade poruke „abc”, signal K uzima prve dve vredno-
sti konstanti iz ROM-a (ove vrednosti mogu se uporediti sa vrednostima iz
tabele 2.4). Signali a, b, ..., h (predstavljeni nizom a_h_in(0..7)) uzimaju
inicijalnu hash vrednost (tabela 2.3), obzirom da se simulira početak obrade
poruke. Signal plave boje na slici, a_h_out(0..7), predstavlja nove vrednosti
a, b, ..., h, odnosno vrednosti koje će se koristiti u narednoj iteraciji.
Radi poređenja sa rezultatima simulacija prikazanih na slici, u tabeli 4.1
prikazane su vrednosti a, b, ..., h u prvih nekoliko iteracija glavne petlje. Pre-
gled ovih vrednosti pri izvršavanju sve 64 iteracije glavne petlje pri obradi
poruke „abc”, i prikaz krajnje hash vrednosti može se videti u [1].
31
i obrada, najpre se postavlja na aktivnu vrednost signal init, a prva 32 bita
proširene poruke se postavlja na linije signala mblock koji je na slici označen
tamno plavom bojom.
32
elemenata niza koji im prethode, pa je nepotrebno prikazivati ih. Ovo će se
primenjivati i na preostale vremenske dijagrame u poglavlju. ****
Na slici 4.7 prikazani su vremenski dijagrami iste simulacije, pri učitava-
nju poslednja 32 bita poruke (u trenutku t = 235ns, signal narandžaste boje,
W main, uzima vrednost 0x00000018 sa ulaza mblock koji nije prikazan radi
preglednosti). Kada brojač stigne do vrednosti „15” (trenutak t = 235ns) nje-
gov izlaz done15 postaje aktivan, a signal W c (na slici signal zelene boje) do-
bija rezultat funkcije kompresije (Wc = σ1 (Wj−2 )+Wj−7 +σ0 (Wj−15 )+Wj−16 )
koja je u ovom slučaju 0x61626380, i počevši od naredne uzlazne ivice signala
takta (trenutak t=245ns) signal W main počinje da uzima vrednosti signala
W c. Signal hout(0..7) (tamno plava boja) i dalje ostaje nepromenjen.
Slika 4.7: Vremenski dijagram: simulacija modula SHA256 - učitan prvi blok
33
Tabela 4.2: Vrednosti a, b, ..., h u iteracijama 14–17 glavne petlje
a b c d e f g h
t=14 c0645fde d932eb16 87912990 f71fc5a9 0b92f20c 745a48de 1e578218 816fd6e9
t=15 b0fa238e c0645fde d932eb16 87912990 07590dcd 0b92f20c 745a48de 1e578218
t=16 21da9a9b b0fa238e c0645fde d932eb16 8034229c 07590dcd 0b92f20c 745a48de
t=17 c2fbd9d1 21da9a9b b0fa238e c0645fde 846ee454 8034229c 07590dcd 0b92f20c
.
. .
. .
. .
. .
. .
. .
. .
.
t=18 . . . . . . . .
34
4.4.2 Simulacija obrade 2 bloka poruke
U ovoj simulaciji prikazana je obrada poruke „abcdbcdecdefdefgefghfghig-
hijhijkijkljklmklmnlmnomnopnopq”. Uzimajući u obzir kodiranje karaktera
u ASCII formatu, dužina originalne poruke je 448 bita. Po pravilu, proširiva-
nje poruke se vrši dodavanjem „1” na kraj poruke, i onda potreban broj nula
kako bi se postigla dužina poruke koja je za 64 bita manja od celobrojnog
umnoška 512 bita. Dakle, ova poruka se mora proširiti tako da se dobiju 2
bloka od po 512 bita. Izgled proširene poruke dat je u sledećoj tabeli.
35
sleđuje signalu W main (signal narandžaste boje). Pošto je u ovom trenutku
obrada pauzirana za vreme trajanja 2 taktna intervala (ovo je postignuto
resetovanjem brojača, i signal reseta brojača traje 1 taktni interval) signal
W main već ima vrednost 0x00000000 pa se ova dodela vrednosti ne vidi na
dijagramu. Sa slike se takođe može primetiti da je izlaz iz ROM-a (signal
zelene boje const(31..0)) u ovom trenutku ima vrednost prve konstante, što
je i očekivano, jer je vrednost brojača „0”.
Slika 4.9: Vremenski dijagram: simulacija modula SHA256 - kraj obrade prvog bloka
36
Tabela 4.4: Vrednosti a, b, ..., h na početku obrade drugog bloka poruke
„abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq”
a b c d e f g h
init: 85e655d6 417a1795 3363376a 624cde5c 76e09589 cac5f811 cc4b32c1 f20e533a
t=0 7c20c838 85e655d6 417a1795 3363376a 4670ae6e 76e09589 cac5f811 cc4b32c1
.
. .
. .
. .
. .
. .
. .
. .
.
t=1 . . . . . . . .
Slika 4.10: Vremenski dijagram: simulacija modula SHA256 - kraj obrade drugog bloka
37
gefghfghighijhijkijkljklmklmnlmnomnopnopq”. Posmatrajući vrednosti dobi-
jene simulacijama, i vrednosti preuzete iz [1], može se primetiti da se vred-
nosti poklapaju, odnosno da sistem funkcioniše ispravno.
Hash vrednost poruke
„abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq” je:
38
Glava 5
Zaključak
39
Literatura
[8] http://www.xilinx.com/
[9] Spartan-3E FPGA Starter Kit Board User Guide UG230 (v1.2), Jan.20,
2011
40
Prilog - Izvorni kôd
src1/MyPackage.vhd
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-- Company : School of Electrical Engineering ,
-- University of Belgrade
-- Engineer : Aleksandar Zujovic
--
-- Design Name : VHDL realisation of SHA -256 algorithm
-- Project Name : SHA256
-- Module Name : MyPackage
-- Target Device :
-- Tool versions : ISE Design Suite v14 .06
-- Description : MyPackage is a user defined VHDL
-- library package which contains
-- additional types and constants
-- declaration .
--
-- Revision :
-- Revision 0.01 - File Created
-- Additional Comments :
--
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
library IEEE ;
use IEEE . STD_LOGIC_1164 . all ;
package MyPackage is
41
-- odnosno za nizove od 16 clanova 32 bitnih podataka
type MsgSchedule is
array (0 to 15) of std_logic_vector (31 downto 0);
42
src1/ConstantsROM.vhd
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-- Company : School of Electrical Engineering ,
-- University of Belgrade
-- Engineer : Aleksandar Zujovic
--
-- Design Name : VHDL realisation of SHA -256 algorithm
-- Project Name : SHA256
-- Module Name : ConstantsROM
-- Target Device :
-- Tool versions : ISE Design Suite v14 .06
-- Description : 32 bit ROM , with 64 constants which are
-- used for calculating the hash output
--
-- Revision :
-- Revision 0.01 - File Created
-- Additional Comments :
--
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
library IEEE ;
use IEEE . STD_LOGIC_1164 . ALL ;
entity ConstantsROM is
Port ( address : in STD_LOGIC_VECTOR (5 downto 0);
const : out STD_LOGIC_VECTOR (31 downto 0));
end ConstantsROM ;
begin
with address (5 downto 0) select
const <= x "428 a2f98 " when B "000000" ,
x "71374491" when B "000001" ,
x " b5c0fbcf " when B "000010" ,
x " e9b5dba5 " when B "000011" ,
x "3956 c25b " when B "000100" ,
x "59 f111f1 " when B "000101" ,
x "923 f82a4 " when B "000110" ,
x " ab1c5ed5 " when B "000111" ,
43
x "9 bdc06a7 " when B "001110" ,
x " c19bf174 " when B "001111" ,
44
x "78 a5636f " when B "111001" ,
x "84 c87814 " when B "111010" ,
x "8 cc70208 " when B "111011" ,
x "90 befffa " when B "111100" ,
x " a4506ceb " when B "111101" ,
x " bef9a3f7 " when B "111110" ,
x " c67178f2 " when B "111111" ,
end Behavioral ;
45
src1/Counter64.vhd
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-- Company : School of Electrical Engineering ,
-- University of Belgrade
-- Engineer : Aleksandar Zujovic
--
-- Design Name : VHDL realisation of SHA -256 algorithm
-- Project Name : SHA256
-- Module Name : Counter64
-- Target Device :
-- Tool versions : ISE Design Suite v14 .06
-- Description : 6 bit counter , with additional counting
-- flags .
--
-- Revision :
-- Revision 0.01 - File Created
-- Additional Comments :
--
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
library IEEE ;
use IEEE . STD_LOGIC_1164 . ALL ;
use IEEE . NUMERIC_STD . ALL ;
use IEEE . S TD_ LO GI C_U NS IG NED . all ;
entity Counter64 is
Port ( clk : in STD_LOGIC ;
reset : in STD_LOGIC ;
count : out STD_LOGIC_VECTOR (5 downto 0);
done_15 : out STD_LOGIC ;
done_63 : out STD_LOGIC
);
end Counter64 ;
46
done_15 <= ’0 ’;
end if ;
if ( output = "111111") then
output <=( others = > ’0 ’);
done_63 <= ’1 ’;
else
output <= output + 1;
done_63 <= ’0 ’;
end if ;
end if ;
end process ;
count <= output ;
end Behavioral ;
47
src1/MainLoop.vhd
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-- Company : School of Electrical Engineering ,
-- University of Belgrade
-- Engineer : Aleksandar Zujovic
--
-- Design Name : VHDL realisation of SHA -256 algorithm
-- Project Name : SHA256
-- Module Name : MainLoop
-- Target Device :
-- Tool versions : ISE Design Suite v14 .06
-- Description : This module takes neccessary 32 bit
-- inputs , does appropriate calculations
-- and provides updated values to be used
-- in next round of iterations .
--
-- Revision :
-- Revision 0.01 - File Created
-- Additional Comments :
--
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
library IEEE ;
use IEEE . STD_LOGIC_1164 . ALL ;
use IEEE . NUMERIC_STD . all ;
use IEEE . S TD_ LO GI C_U NS IG NED . all ;
use work . MyPackage . all ;
entity MainLoop is
Port ( W : in STD_LOGIC_VECTOR (31 downto 0);
K : in STD_LOGIC_VECTOR (31 downto 0);
a_h_in : in ArrayOfVectors ;
a_h_out : out ArrayOfVectors
);
end MainLoop ;
48
-- signal za rezultat logicke funkcije Sigma0 ( a )
signal Sigma0 : std_logic_vector (31 downto 0):=( others = > ’0 ’);
-- signal za rezultat logicke funkcije Sigma1 ( e )
signal Sigma1 : std_logic_vector (31 downto 0):=( others = > ’0 ’);
begin
-- sracunavanje Ch (e ,f , g )= ( e ^ f ) xor (~ e ^ g )
Ch <= (( a_h_in (4) and a_h_in (5)) xor
(( not a_h_in (4)) and a_h_in (6)));
-- b = a
a_h_out (1) <= a_h_in (0);
-- c = b
a_h_out (2) <= a_h_in (1);
-- d = c
a_h_out (3) <= a_h_in (2);
49
-- f = e
a_h_out (5) <= a_h_in (4);
-- g = f
a_h_out (6) <= a_h_in (5);
-- h = g
a_h_out (7) <= a_h_in (6);
end Behavioral ;
50
src1/sha256.vhd
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-- Company : School of Electrical Engineering ,
-- University of Belgrade
-- Engineer : Aleksandar Zujovic
--
-- Design Name : VHDL realisation of SHA -256 algorithm
-- Project Name : SHA256
-- Module Name : sha256
-- Target Device :
-- Tool versions : ISE Design Suite v14 .06
-- Description : This is the highes hierarchy level module
-- ( top module ) in this design . It
-- instantiates and connects all the other
-- modules , and provides additional
-- functionalities for the correct working
-- of the design
--
-- Revision :
-- Revision 0.01 - File Created
-- Additional Comments :
--
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
library IEEE ;
use IEEE . STD_LOGIC_1164 . ALL ;
use IEEE . NUMERIC_STD . ALL ;
use IEEE . S TD_ LO GI C_U NS IG NED . all ;
use work . MyPackage . all ;
entity sha256 is
Port ( clk : in STD_LOGIC ;
reset : in STD_LOGIC ;
msg : in STD_LOGIC_VECTOR (31 downto 0);
init : in STD_LOGIC ;
last : in STD_LOGIC ;
block_done : out STD_LOGIC ;
hash : out STD_LOGIC_VECTOR (255 downto 0);
hash_valid : out STD_LOGIC
);
end sha256 ;
51
reset : in std_logic ;
count : out std_logic_vector (5 downto 0);
done_15 : out std_logic ;
done_63 : out std_logic
);
end component ;
end component ;
52
signal W : std_logic_vector (31 downto 0);
begin
53
Wc1 <= sigma0 + sigma1 ;
Wc2 <= Wj (6) + Wj (15);
-- pripremanje poruke za smestanje u red poruka . Ovaj podatak
-- se smesta u Wj ukoliko je broj iteracija veci od 15
Wc <= Wc1 + Wc2 ;
-- DEFAULT VREDNOSTI
NextState <= CurrentState ;
count_reset <= ’1 ’;
Wmain <= ( others = > ’0 ’);
a_h_main <= ( others = > ( others = > ’0 ’));
hash_valid <= ’0 ’;
block_done <= ’0 ’;
hash_valid <= ’0 ’;
hash <= ( others = > ’0 ’);
case CurrentState is
when idle = >
-- u idle stanju brojac je zaustavljen ,
-- a u main loop se salju nulti podaci .
-- ukoliko so pojavi aktivan ulazni
-- signal init , prelazi se u hashing stanje
count_reset <= ’1 ’;
Wmain <= ( others = > ’0 ’);
a_h_main <= ( others = >( others = > ’0 ’));
if ( init = ’1 ’) then
NextState <= hashing ;
else
NextState <= idle ;
end if ;
54
-- drugim procesima
count_reset <= ’0 ’;
Wmain <= W ;
a_h_main <= a_h_prev ;
if ( done63 = ’1 ’) then
Wmain <= ( others = > ’0 ’);
a_h_main <= ( others = >( others = > ’0 ’));
block_done <= ’1 ’;
55
-- ako se prima prva poruka , H0 .. H7 , uzimaju inicijalne vrednosti
if ( init = ’1 ’) then
Hout <= H_Init ;
-- ako je zavrsena obrada trenutnog bloka od 512 bita , azuriraju se
-- H0 .. H7
elsif ( done63 = ’1 ’) then
Hout (0) <= a_h_prev (0) + Hout (0);
Hout (1) <= a_h_prev (1) + Hout (1);
Hout (2) <= a_h_prev (2) + Hout (2);
Hout (3) <= a_h_prev (3) + Hout (3);
Hout (4) <= a_h_prev (4) + Hout (4);
Hout (5) <= a_h_prev (5) + Hout (5);
Hout (6) <= a_h_prev (6) + Hout (6);
Hout (7) <= a_h_prev (7) + Hout (7);
end if ;
end if ;
end process ;
56
Wj <= ( others = >( others = > ’0 ’));
elsif ( clk ’ event and clk = ’1 ’) then
end Behavioral ;
57