Myslím, že jsou výpočty v pořádku jen mám problém, že si nejsem zcela jistý, že počítám SHA-1 správně, pokud je délka zprávy delší než 64 znaků a překročí tedy 512 bitů.
Pokud je zpráva např. "Ahoj1234" uložím ji na začátek 512 bitů, za poslední znak přidám 1 dodatečný bit tj 0x80, zbytek doplním "0" bity a na posledních 32 bitů zadám původní délku zprávy v bitech tj. 8 znaků * 8 = 64 (jde o délku zprávy, která musí být ve tvaru 64 bitů, horních 32 bitů ale nikdy nepoužiju, nastavím je na 0). U této zprávy program spočítá výsledek SHA-1 správně.
U zprávy o délce 80 znaků, která přesáhne 512 bitů postupuji v programu takto (a dělám to určitě chybně). Do prvního pole 512 bitů uložím prvních 64 znaků zprávy. Do druhého navazující pole 512 bitů pak zbylých 80-64=16 znaků, za poslední znak přidám 1 bit tj. 0x80, zbylé bity do konce 512 bitů vynuluji a do posledních 32 bitů zadám celkovou délku původní zprávy tj. 80 znaků * 8 = 640.
SHA-1 pak je
50abf570 6a150990 a08b2c5e a40fa0e5 85554732 (správně)
14a5f567 f881dad3 721e1fa9 a09cde30 6efd7632 (vyjde mi chybně)Vstupní zpráva je 80 znaků "
12345678901234567890123456789012345678901234567890123456789012345678901234567890"
V programu zadám vstupní údaje takto (můj CPU i7-7500U umí AVX2 tj. max 256 bitů):
indata[0] = _mm256_setr_epi32(0x31323334, 0x35363738, 0x39303132, 0x33343536, 0x37383930, 0x31323334, 0x35363738, 0x39303132);
indata[1] = _mm256_setr_epi32(0x33343536, 0x37383930, 0x31323334, 0x35363738, 0x39303132, 0x33343536, 0x37383930, 0x31323334);
indata[2] = _mm256_setr_epi32(0x35363738, 0x39303132, 0x33343536, 0x37383930, 0x80000000, 0, 0, 0);
indata[3] = _mm256_setr_epi32(0, 0, 0, 0, 0, 0, 0, 640);
V popisu SHA-1
Breaking Down: SHA-1 Algorithm se píše, že by se snad delší zpráva měla dělit na části po 448 bitech. To by ale znamenalo, že délka zprávy by měla být v každém 512 bitovém bloku na konci (posledních 64 bitů)?
Jak mám tedy správně zadat hodnoty do bloků 512 bitů jedna a dva ?