mirror of
https://github.com/veracrypt/VeraCrypt
synced 2024-12-03 00:13:32 +01:00
GOST89 parameters swap (6.3)
Cached boot password added
This commit is contained in:
parent
9b1c447df1
commit
17eeaa43cf
@ -5,7 +5,8 @@ Copyright (c) 2016. Disk Cryptography Services for EFI (DCS), Alex Kolotnikov
|
|||||||
|
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions
|
are licensed and made available under the terms and conditions
|
||||||
of the Apache License, Version 2.0. The full text of the license may be found at
|
of the Apache License, Version 2.0.
|
||||||
|
The full text of the license may be found at
|
||||||
https://opensource.org/licenses/Apache-2.0
|
https://opensource.org/licenses/Apache-2.0
|
||||||
|
|
||||||
Dynamic SBOX idea is from GostCrypt project. Copyright (c) 2008-2011 TrueCrypt Developers Association
|
Dynamic SBOX idea is from GostCrypt project. Copyright (c) 2008-2011 TrueCrypt Developers Association
|
||||||
|
@ -5,7 +5,9 @@
|
|||||||
;
|
;
|
||||||
; This program and the accompanying materials
|
; This program and the accompanying materials
|
||||||
; are licensed and made available under the terms and conditions
|
; are licensed and made available under the terms and conditions
|
||||||
; of the Apache License, Version 2.0. The full text of the license may be found at
|
; of the Apache License, Version 2.0.
|
||||||
|
;
|
||||||
|
; The full text of the license may be found at
|
||||||
; https://opensource.org/licenses/Apache-2.0
|
; https://opensource.org/licenses/Apache-2.0
|
||||||
;
|
;
|
||||||
; Some ideas from article https://xakep.ru/2013/10/19/shifrovanie-gost-28147-89/
|
; Some ideas from article https://xakep.ru/2013/10/19/shifrovanie-gost-28147-89/
|
||||||
@ -107,17 +109,17 @@
|
|||||||
mov eax, [r8 + %2*4] ; read key
|
mov eax, [r8 + %2*4] ; read key
|
||||||
%endmacro
|
%endmacro
|
||||||
|
|
||||||
; input: r8 - &key, rdx - &IN
|
; input: r8 - &key, rcx - &IN
|
||||||
; returns: (r13) & (r10)
|
; returns: (r13) & (r10)
|
||||||
GostEncrypt2x64:
|
GostEncrypt2x64:
|
||||||
; 1st
|
; 1st
|
||||||
mov r13d, [rdx]
|
mov r13d, [rcx]
|
||||||
mov r14, [rdx]
|
mov r14, [rcx]
|
||||||
shr r14, 32
|
shr r14, 32
|
||||||
|
|
||||||
; 2nd
|
; 2nd
|
||||||
mov r10d, [rdx + 16]
|
mov r10d, [rcx + 16]
|
||||||
mov r11, [rdx + 16]
|
mov r11, [rcx + 16]
|
||||||
shr r11, 32
|
shr r11, 32
|
||||||
|
|
||||||
mov ecx, [r8]
|
mov ecx, [r8]
|
||||||
@ -150,17 +152,17 @@ GostEncrypt2x64:
|
|||||||
or r10, r11
|
or r10, r11
|
||||||
ret
|
ret
|
||||||
|
|
||||||
; input: r8 - &key, rdx - &IN
|
; input: r8 - &key, rcx - &IN
|
||||||
; returns: (r13) & (r10)
|
; returns: (r13) & (r10)
|
||||||
GostDecrypt2x64:
|
GostDecrypt2x64:
|
||||||
; 1st
|
; 1st
|
||||||
mov r13d, [rdx]
|
mov r13d, [rcx]
|
||||||
mov r14, [rdx]
|
mov r14, [rcx]
|
||||||
shr r14, 32
|
shr r14, 32
|
||||||
|
|
||||||
; 2nd
|
; 2nd
|
||||||
mov r10d, [rdx + 16]
|
mov r10d, [rcx + 16]
|
||||||
mov r11, [rdx + 16]
|
mov r11, [rcx + 16]
|
||||||
shr r11, 32
|
shr r11, 32
|
||||||
|
|
||||||
mov ecx, [r8]
|
mov ecx, [r8]
|
||||||
@ -227,11 +229,11 @@ ret
|
|||||||
mov ecx, [r8 + %2*4] ; read key
|
mov ecx, [r8 + %2*4] ; read key
|
||||||
%endmacro
|
%endmacro
|
||||||
|
|
||||||
; input: r8 - &gost_kds rdx - &IN
|
; input: r8 - &gost_kds rcx - &IN
|
||||||
; returns: r13
|
; returns: r13
|
||||||
GostEncrypt1x64:
|
GostEncrypt1x64:
|
||||||
mov r13d, [rdx]
|
mov r13d, [rcx]
|
||||||
mov r14, [rdx]
|
mov r14, [rcx]
|
||||||
shr r14, 32
|
shr r14, 32
|
||||||
mov ecx, [r8]
|
mov ecx, [r8]
|
||||||
|
|
||||||
@ -259,11 +261,11 @@ GostEncrypt1x64:
|
|||||||
or r13, r14
|
or r13, r14
|
||||||
ret
|
ret
|
||||||
|
|
||||||
; input: r8 - &gost_kds rdx - IN
|
; input: r8 - &gost_kds rcx - IN
|
||||||
; returns: r13
|
; returns: r13
|
||||||
GostDecrypt1x64:
|
GostDecrypt1x64:
|
||||||
mov r13d, [rdx]
|
mov r13d, [rcx]
|
||||||
mov r14, [rdx]
|
mov r14, [rcx]
|
||||||
shr r14, 32
|
shr r14, 32
|
||||||
mov ecx, [r8]
|
mov ecx, [r8]
|
||||||
|
|
||||||
@ -291,17 +293,17 @@ GostDecrypt1x64:
|
|||||||
or r13, r14
|
or r13, r14
|
||||||
ret
|
ret
|
||||||
|
|
||||||
global gost_encrypt_128_CBC_asm ; gost_encrypt_128_CBC_asm(uint64* out, uint64* in, gost_kds* kds, uint64 count);
|
global gost_encrypt_128_CBC_asm ; gost_encrypt_128_CBC_asm(uint64* in, uint64* out, gost_kds* kds, uint64 count);
|
||||||
; rcx - &out
|
; rcx - &in
|
||||||
; rdx - &in
|
; rdx - &out
|
||||||
; r8 - &gost_kds
|
; r8 - &gost_kds
|
||||||
; r9 - count
|
; r9 - count
|
||||||
gost_encrypt_128_CBC_asm:
|
gost_encrypt_128_CBC_asm:
|
||||||
SaveRegs ; Saving
|
SaveRegs ; Saving
|
||||||
|
|
||||||
sub rsp, 32
|
sub rsp, 32
|
||||||
mov [rsp], rcx ; Save out addr
|
mov [rsp], rdx ; Save out addr
|
||||||
mov [rsp + 8], rdx ; Save in addr
|
mov [rsp + 8], rcx ; Save in addr
|
||||||
mov [rsp + 16], r8 ; key addr
|
mov [rsp + 16], r8 ; key addr
|
||||||
|
|
||||||
.do:
|
.do:
|
||||||
@ -314,32 +316,32 @@ gost_encrypt_128_CBC_asm:
|
|||||||
|
|
||||||
; One 128 block encryption
|
; One 128 block encryption
|
||||||
.blk1:
|
.blk1:
|
||||||
mov rdx, [rsp + 8] ; set in addr
|
mov rcx, [rsp + 8] ; set in addr
|
||||||
call GostEncrypt1x64
|
call GostEncrypt1x64
|
||||||
|
|
||||||
mov rcx, [rsp] ; Restore out
|
mov rdx, [rsp] ; Restore out
|
||||||
mov rdx, [rsp + 8] ; restore in
|
mov rcx, [rsp + 8] ; restore in
|
||||||
|
|
||||||
mov [rcx], r13
|
mov [rdx], r13
|
||||||
mov rax, [rdx + 8]
|
mov rax, [rcx + 8]
|
||||||
xor rax, r13 ; CBC
|
xor rax, r13 ; CBC
|
||||||
|
|
||||||
add rcx, 8 ;next 8 bytes
|
add rdx, 8 ;next 8 bytes
|
||||||
mov [rcx], rax
|
mov [rdx], rax
|
||||||
|
|
||||||
mov rdx, rcx
|
mov rcx, rdx
|
||||||
call GostEncrypt1x64
|
call GostEncrypt1x64
|
||||||
|
|
||||||
mov rcx, [rsp] ; Restore out addr
|
mov rdx, [rsp] ; Restore out addr
|
||||||
mov rdx, [rsp+8] ; Restore in addr
|
mov rcx, [rsp+8] ; Restore in addr
|
||||||
|
|
||||||
mov [rcx + 8], r13
|
mov [rdx + 8], r13
|
||||||
|
|
||||||
add rcx,16
|
|
||||||
mov [rsp], rcx
|
|
||||||
|
|
||||||
add rdx,16
|
add rdx,16
|
||||||
mov [rsp+8], rdx
|
mov [rsp], rdx
|
||||||
|
|
||||||
|
add rcx, 16
|
||||||
|
mov [rsp+8], rcx
|
||||||
|
|
||||||
mov r9, [rsp + 24]
|
mov r9, [rsp + 24]
|
||||||
dec r9
|
dec r9
|
||||||
@ -347,41 +349,41 @@ gost_encrypt_128_CBC_asm:
|
|||||||
jmp .do
|
jmp .do
|
||||||
|
|
||||||
.blk2:
|
.blk2:
|
||||||
mov rdx, [rsp + 8] ; set in addr
|
mov rcx, [rsp + 8] ; set in addr
|
||||||
call GostEncrypt2x64
|
call GostEncrypt2x64
|
||||||
|
|
||||||
mov rcx, [rsp] ; Restore out
|
mov rdx, [rsp] ; Restore out
|
||||||
mov rdx, [rsp + 8] ; restore in
|
mov rcx, [rsp + 8] ; restore in
|
||||||
|
|
||||||
mov [rcx], r13
|
mov [rdx], r13
|
||||||
|
|
||||||
mov rax, [rdx + 8]
|
mov rax, [rcx + 8]
|
||||||
xor rax, r13 ; CBC
|
xor rax, r13 ; CBC
|
||||||
|
|
||||||
mov [rcx + 16], r10
|
mov [rdx + 16], r10
|
||||||
|
|
||||||
mov rbx, [rdx + 24]
|
mov rbx, [rcx + 24]
|
||||||
xor rbx, r10 ; CBC
|
xor rbx, r10 ; CBC
|
||||||
|
|
||||||
mov [rcx + 8], rax
|
mov [rdx + 8], rax
|
||||||
mov [rcx + 24], rbx
|
mov [rdx + 24], rbx
|
||||||
|
|
||||||
add rcx, 8 ;next 8 bytes
|
add rdx, 8 ;next 8 bytes
|
||||||
|
|
||||||
mov rdx, rcx
|
mov rcx, rdx
|
||||||
call GostEncrypt2x64
|
call GostEncrypt2x64
|
||||||
|
|
||||||
mov rcx, [rsp] ; Restore out addr
|
mov rdx, [rsp] ; Restore out addr
|
||||||
mov rdx, [rsp+8] ; Restore in addr
|
mov rcx, [rsp+8] ; Restore in addr
|
||||||
|
|
||||||
mov [rcx + 8], r13
|
mov [rdx + 8], r13
|
||||||
mov [rcx + 24], r10
|
mov [rdx + 24], r10
|
||||||
|
|
||||||
add rcx,32
|
|
||||||
mov [rsp], rcx
|
|
||||||
|
|
||||||
add rdx,32
|
add rdx,32
|
||||||
mov [rsp+8], rdx
|
mov [rsp], rdx
|
||||||
|
|
||||||
|
add rcx, 32
|
||||||
|
mov [rsp+8], rcx
|
||||||
|
|
||||||
mov r9, [rsp + 24]
|
mov r9, [rsp + 24]
|
||||||
sub r9, 2
|
sub r9, 2
|
||||||
@ -393,9 +395,9 @@ gost_encrypt_128_CBC_asm:
|
|||||||
RestoreRegs ; Load
|
RestoreRegs ; Load
|
||||||
ret
|
ret
|
||||||
|
|
||||||
global gost_decrypt_128_CBC_asm ; gost_decrypt_128_CBC_asm(uint64* out, uint64* in, const gost_kds* kds, uint64 count);
|
global gost_decrypt_128_CBC_asm ; gost_decrypt_128_CBC_asm(uint64* in, uint64* out, const gost_kds* kds, uint64 count);
|
||||||
; rcx - &out
|
; rcx - &in
|
||||||
; rdx - &in
|
; rdx - &out
|
||||||
; r8 - &gost_kds
|
; r8 - &gost_kds
|
||||||
; r9 - count
|
; r9 - count
|
||||||
gost_decrypt_128_CBC_asm:
|
gost_decrypt_128_CBC_asm:
|
||||||
@ -416,26 +418,26 @@ gost_decrypt_128_CBC_asm:
|
|||||||
|
|
||||||
; One 128 block decryption
|
; One 128 block decryption
|
||||||
.blk1:
|
.blk1:
|
||||||
add rdx, 8
|
add rcx, 8
|
||||||
call GostDecrypt1x64
|
call GostDecrypt1x64
|
||||||
mov rcx, [rsp] ; Restore out
|
mov rdx, [rsp] ; Restore out
|
||||||
mov rdx, [rsp + 8] ; Restore in
|
mov rcx, [rsp + 8] ; Restore in
|
||||||
mov rax, [rdx]
|
mov rax, [rcx]
|
||||||
xor rax, r13 ; CBC
|
xor rax, r13 ; CBC
|
||||||
mov [rcx + 8], rax
|
mov [rdx + 8], rax
|
||||||
|
|
||||||
call GostDecrypt1x64
|
call GostDecrypt1x64
|
||||||
|
|
||||||
mov rcx, [rsp] ; Restore out addr
|
mov rdx, [rsp] ; Restore out addr
|
||||||
mov rdx, [rsp+8] ; Restore in addr
|
mov rcx, [rsp+8] ; Restore in addr
|
||||||
|
|
||||||
mov [rcx], r13
|
mov [rdx], r13
|
||||||
|
|
||||||
add rcx,16
|
|
||||||
mov [rsp], rcx
|
|
||||||
|
|
||||||
add rdx,16
|
add rdx,16
|
||||||
mov [rsp+8], rdx
|
mov [rsp], rdx
|
||||||
|
|
||||||
|
add rcx, 16
|
||||||
|
mov [rsp+8], rcx
|
||||||
|
|
||||||
mov r9, [rsp + 24]
|
mov r9, [rsp + 24]
|
||||||
dec r9
|
dec r9
|
||||||
@ -443,32 +445,32 @@ gost_decrypt_128_CBC_asm:
|
|||||||
jmp .do
|
jmp .do
|
||||||
|
|
||||||
.blk2:
|
.blk2:
|
||||||
add rdx, 8
|
add rcx, 8
|
||||||
call GostDecrypt2x64
|
call GostDecrypt2x64
|
||||||
mov rcx, [rsp] ; Restore out
|
mov rdx, [rsp] ; Restore out
|
||||||
mov rdx, [rsp + 8] ; Restore in
|
mov rcx, [rsp + 8] ; Restore in
|
||||||
|
|
||||||
mov rax, [rdx]
|
mov rax, [rcx]
|
||||||
xor rax, r13 ; CBC
|
xor rax, r13 ; CBC
|
||||||
mov [rcx + 8], rax
|
mov [rdx + 8], rax
|
||||||
|
|
||||||
mov rbx, [rdx+16]
|
mov rbx, [rcx+16]
|
||||||
xor rbx, r10 ; CBC
|
xor rbx, r10 ; CBC
|
||||||
mov [rcx + 24], rbx
|
mov [rdx + 24], rbx
|
||||||
|
|
||||||
call GostDecrypt2x64
|
call GostDecrypt2x64
|
||||||
|
|
||||||
mov rcx, [rsp] ; Restore out addr
|
mov rdx, [rsp] ; Restore out addr
|
||||||
mov rdx, [rsp+8] ; Restore in addr
|
mov rcx, [rsp+8] ; Restore in addr
|
||||||
|
|
||||||
mov [rcx], r13
|
mov [rdx], r13
|
||||||
mov [rcx+16], r10
|
mov [rdx+16], r10
|
||||||
|
|
||||||
add rcx,32
|
|
||||||
mov [rsp], rcx
|
|
||||||
|
|
||||||
add rdx,32
|
add rdx,32
|
||||||
mov [rsp+8], rdx
|
mov [rsp], rdx
|
||||||
|
|
||||||
|
add rcx,32
|
||||||
|
mov [rsp+8], rcx
|
||||||
|
|
||||||
mov r9, [rsp + 24]
|
mov r9, [rsp + 24]
|
||||||
sub r9, 2
|
sub r9, 2
|
||||||
|
Loading…
Reference in New Issue
Block a user