Chargement…
Chargement…
Le cœur SHA-256 calcule le hash d'un unique bloc de 512 bits présenté en parallèle sur 16 mots de 32 bits (i_msg0 à i_msg15). Le calcul démarre sur un pulse i_gen_hash='1'. Après ~68 cycles d'horloge, o_ready passe à '1' et o_hash (256 bits) contient le résultat.
L'architecture suit la spécification FIPS 180-4 :
a..h (32 bits chacun)c_K stocke les 64 constantes de la spécificationi_clki_rsti_gen_hashi_msg0..i_msg15o_readyo_hash est valideo_hashEtats : ST_IDLE, ST_INIT, ST_RUN, ST_M1..ST_M15, ST_WS.
i_gen_hash. Au depart, pulse w_gen_p (envoye dans le pipeline de delais) et reset du compteur r_cnt.msg_comp (w_rst_cmp='1'), demarrage du compteur.w_m = i_msg15, i_msg14, ..., i_msg0 vers l'entrée i_w de msg_comp. A ST_M15, on active w_rst_sch='1' pour figer le schedule.w_m prend la valeur w_w_j produite par le schedule. On sort de cet etat quand r_delay(66)='1'.Compteur : r_cnt s'incremente tant que w_start='1', ce qui selectionne la constante c_K(to_integer(r_cnt)) (lue en synchrone -> K_i decale d'un cycle, pipeline coherent avec msg_comp).
Un pipeline de 67 bascules (r_delay(0..66)) propage le pulse w_gen_p. Sa profondeur est calibree sur la latence combinee du schedule et de la compression.
r_delay(65)='1' : signal final d'addition. Le processus P_FINAL additionne alors a..h aux variables v_h0..v_h7, qui contiennent les IV FIPS initialises par i_rst : - H0 = 6a09e667, H1 = bb67ae85, H2 = 3c6ef372, H3 = a54ff53a
- H4 = 510e527f, H5 = 9b05688c, H6 = 1f83d9ab, H7 = 5be0cd19
r_delay(66) sert a la fois a signaler la fin (o_ready) et a ramener la FSM a ST_IDLE.Le testbench applique la chaine ASCII "test" (4 octets) avec son padding FIPS 180-4 :
msg_15 = 0x74657374 (les 4 octets de "test")msg_14 = 0x80000000 (bit de padding et zeros)msg_13..msg_1 = 0msg_0 = 0x00000020 (longueur = 32 bits)Le TB verifie o_ready puis les 8 mots du hash attendu :
9f86d081 884c7d65 9a2feaa0 c55ad015 a3bf4f1b 2b0b822c d15d6c15 b0f00a08.