diff --git a/sha-256.asm b/sha-256.asm index fb17433..8d07005 100644 --- a/sha-256.asm +++ b/sha-256.asm @@ -158,9 +158,13 @@ Sha256 proc CF_Addr:QWORD,CF_FullSize:QWORD,CF_CurrSize:QWORD,CF_digests:QWORD,C Inithash: ;Инициирую R12D-r15D (ХЭШ) mov rax,CF_digests mov r12,QWORD PTR [rax] + ;bswap r12 ;привожу в прямой порядок байт r12 mov r13,QWORD PTR [rax+8] + ;bswap r13 ;привожу в прямой порядок байт r13 mov r14,QWORD PTR [rax+16] - mov r15,QWORD PTR [rax+24] + ;bswap r14 ;привожу в прямой порядок байт r14 + mov r15,QWORD PTR [rax+24] + ;bswap r15 ;привожу в прямой порядок байт r15 ;Является ли массив последним? mov rax,CF_Last cmp rax,1 ;1-блок является последним @@ -188,7 +192,7 @@ Sha256 proc CF_Addr:QWORD,CF_FullSize:QWORD,CF_CurrSize:QWORD,CF_digests:QWORD,C lea rcx,lastblock ;rcx - указатель ┃ endingofsegment2: ; ┃ mov bl,[rax] ; перебрасываю хвост в локальную область ┃ - mov [rcx],bl ; ┃ + mov [rcx],bl ; оптимизировать!!! наверняка - жуткий тормоз!!! ┃ inc rax ; ┃ inc rcx ; ┃ dec rdx ; ┃ @@ -243,6 +247,8 @@ Sha256 proc CF_Addr:QWORD,CF_FullSize:QWORD,CF_CurrSize:QWORD,CF_digests:QWORD,C movdqu XMM2,XMMWORD PTR [rax+32] movdqu XMM3,XMMWORD PTR [rax+48] call Wt ; + ;Хэширую их + call CompCycle ret Sha256 Endp ;Инициализация хэш функции, ввод исходных значений @@ -2073,7 +2079,7 @@ Wt proc; вынес в отдельную процедуру заполнени ;pshufd xmm15,xmm15,11100100b ;-0 (Rec) ;bswap edx movd xmm15,edx - ;W61---------начать с этого. Нужно заполнить XMM15z\------------------------------------------------------------------ + ;W61--------------------------------------------------------------------------- sub rsp,16 movdqu [rsp],xmm0; сохраняю в стеке XMM0, чтобы он заменил XMM15 xor rcx,rcx ;в ecx будет xor трёх вращений @@ -2194,4 +2200,43 @@ Wt proc; вынес в отдельную процедуру заполнени add rsp,16 ret Wt Endp +CompCycle proc; Цикл сжатия. Вынес в отдельную процедуру + ; на входе: R12-R15 текущий хэш + ; XMM0 - XMM15 - Wt + ;Инициирую значениа a,b,c,d,e,f,g,h (копирую r12-r15 в r8-r11) + mov r8,r12 + mov r9,r13 + mov r10,r14 + mov r11,r15 + ;i=0 + rol r12,32 ;B=A + shl r13,32 ;D=C + rol r14,32 ;F=E + shl r15,32 ;H=G + mov eax,r12d + or r13,rax ;C=B + mov eax,r14d + or r15,rax ;G=F + mov rax,0ffffffffh + shl rax,32 + and r12,rax ;A=null + and r14,rax ;E=null + ;Ma + mov eax,r8d ;eax=A + mov rbx,r8 + shr rbx,32 ;ebx=B + mov ecx,r9d ;ecx=C + and eax,ebx ;A and B + and ebx,ecx ;B and C + mov edx,r8d ;edx=A + and edx,ecx ;A and C + or eax,ebx ;(A and B) or (B and C) + or edx,eax ;(A and C) or ((A and B) or (B and C)) + ;edx=Ma + + + + + ret +CompCycle Endp end \ No newline at end of file diff --git a/sha-256.dll b/sha-256.dll index beef1b0..41f4e84 100644 Binary files a/sha-256.dll and b/sha-256.dll differ diff --git a/На чём остановился.txt b/На чём остановился.txt index ba14bb3..3c2bc04 100644 --- a/На чём остановился.txt +++ b/На чём остановился.txt @@ -16,4 +16,9 @@ искомое слово на младшие 32 бита XMM регистра - Сделано -Закончил расчёт w16, считает павильно. Но пока не получилось правильно сохранить в XMM4 \ No newline at end of file +Закончил расчёт w16, считает павильно. Но пока не получилось правильно сохранить в XMM4 +-Сделано. Причина - при сохренении из памяти в регистр меняется порядок байт. Делал BSWAP и в XMM записывалось нормально. Также был косяк, когда на уже записанные регистры + делал BSWAP, что меняло порядок байт (начиная с XMM4) там, где это не нужно. + +Приступаю к смешиванию... +