libcrash: switch to standard init/update/final API

git-svn-id: svn://kolibrios.org@6461 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Ivan Baravy 2016-07-12 21:16:28 +00:00
parent 26c74ab3f2
commit 326d13ad14
10 changed files with 2217 additions and 1337 deletions

View File

@ -13,6 +13,12 @@ BUFFER_SIZE = 4096
start: start:
pushfd
pop eax
or eax, 1 SHL 18 ; Alignment Check flag
push eax
popfd
mcall 68, 11 mcall 68, 11
stdcall dll.Load, @IMPORT stdcall dll.Load, @IMPORT
@ -35,7 +41,7 @@ button:
redraw: redraw:
mcall 12, 1 mcall 12, 1
mcall 0, <0,900>, <0,150>, 0x34000000, 0x80000000, window_title mcall 0, <0,900>, <0,160>, 0x34000000, 0x80000000, window_title
mcall 4, < 0, 0>, 0xc0ffffff, message, , 0 mcall 4, < 0, 0>, 0xc0ffffff, message, , 0
@ -50,8 +56,8 @@ redraw:
xor eax, eax xor eax, eax
mov ecx, 1024/4 mov ecx, 1024/4
rep stosd rep stosd
invoke crash.hash, [hid], hash, data_buffer, 0, update_data_buffer, msglen invoke crash.hash, [hid], data_buffer, update_data_buffer, ctx
invoke crash.bin2hex, hash, hex, [hid] invoke crash.bin2hex, ctx, hex, [hid]
mov ebx, [text_pos_y] mov ebx, [text_pos_y]
mcall 4, , 0xc0ffffff, [hash_name], , 0 mcall 4, , 0xc0ffffff, [hash_name], , 0
mov ebx, [text_pos_y] mov ebx, [text_pos_y]
@ -98,17 +104,18 @@ szZ window_title ,'libcrash example'
szZ message , 'hash sums of this file' szZ message , 'hash sums of this file'
hash_strings: hash_strings:
md4 db 'md4 : ',0 db 'crc32 : ',0
md5 db 'md5 : ',0 db 'md4 : ',0
sha1 db 'sha1 : ',0 db 'md5 : ',0
sha224 db 'sha224 : ',0 db 'sha1 : ',0
sha256 db 'sha256 : ',0 db 'sha224 : ',0
sha384 db 'sha384 : ',0 db 'sha256 : ',0
sha512 db 'sha512 : ',0 db 'sha384 : ',0
sha3_224 db 'sha3-224 : ',0 db 'sha512 : ',0
sha3_256 db 'sha3-256 : ',0 db 'sha3-224 : ',0
sha3_384 db 'sha3-384 : ',0 db 'sha3-256 : ',0
sha3_512 db 'sha3-512 : ',0 db 'sha3-384 : ',0
db 'sha3-512 : ',0
f70_buf: f70_buf:
funcnum dd 0 funcnum dd 0
@ -141,5 +148,7 @@ hex rb 1024
data_buffer rb BUFFER_SIZE data_buffer rb BUFFER_SIZE
this_file_name rb 4096 this_file_name rb 4096
rb 0x800 ;stack rb 0x800 ;stack
align 16 ; should be enough
ctx rb 0x1000
e_end: e_end:

View File

@ -0,0 +1,121 @@
; libcrash -- cryptographic hash functions
;
; Copyright (C) 2012-2013,2016 Ivan Baravy (dunkaist)
;
; This program is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this program. If not, see <http://www.gnu.org/licenses/>.
CRC32_HASH_SIZE = 4
CRC32_ALIGN = 4
CRC32_ALIGN_MASK = CRC32_ALIGN - 1
struct ctx_crc32
hash rd 1
ends
proc crc32.init _ctx
mov ebx, [_ctx]
lea edi, [ebx + ctx_crc32.hash]
mov esi, crc32._.hash_init
mov ecx, 1
rep movsd
ret
endp
proc crc32.update _ctx, _msg, _size
mov ebx, [_ctx]
mov esi, [_msg]
lea edi, [ebx + ctx_crc32.hash]
mov eax, [edi]
mov ecx, [_size]
jecxz .quit
@@:
movzx edx, al
xor dl, byte[esi]
add esi, 1
shr eax, 8
xor eax, [crc32._.table + edx*4]
dec ecx
jnz @b
stosd
.quit:
ret
endp
proc crc32.final _ctx
mov ebx, [_ctx]
lea esi, [ebx + ctx_crc32.hash]
mov edi, esi
lodsd
xor eax, 0xffffffff
bswap eax
stosd
ret
endp
align CRC32_ALIGN
crc32._.hash_init dd 0xffffffff
crc32._.table dd \
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,\
0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,\
0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,\
0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,\
0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,\
0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,\
0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,\
0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,\
0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,\
0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,\
0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,\
0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,\
0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,\
0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,\
0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,\
0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,\
0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,\
0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,\
0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,\
0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,\
0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,\
0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,\
0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,\
0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,\
0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,\
0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,\
0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,\
0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,\
0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,\
0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,\
0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,\
0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,\
0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,\
0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,\
0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,\
0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,\
0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,\
0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,\
0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,\
0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,\
0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,\
0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,\
0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d

View File

@ -1,6 +1,6 @@
; libcrash -- cryptographic hash functions ; libcrash -- cryptographic hash functions
; ;
; Copyright (C) 2012-2013 Ivan Baravy (dunkaist) ; Copyright (C) 2012-2014,2016 Ivan Baravy (dunkaist)
; ;
; This program is free software: you can redistribute it and/or modify ; This program is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by ; it under the terms of the GNU General Public License as published by
@ -28,8 +28,8 @@ include '../../../../config.inc'
purge section,mov,add,sub purge section,mov,add,sub
section '.flat' code readable align 16 section '.flat' code readable align 16
include 'libcrash.inc' include 'libcrash.inc'
include 'crc32.asm'
include 'md4.asm' include 'md4.asm'
include 'md5.asm' include 'md5.asm'
include 'sha1.asm' include 'sha1.asm'
@ -43,256 +43,48 @@ proc lib_init
endp endp
proc crash.hash _hid, _hash, _data, _len, _callback, _msglen proc crash.hash _hid, _data, _callback, _ctx
locals locals
hash_func rd 1 size dd ?
final rd 1
hi rd 1
endl endl
mov [size], 0
mov eax, [_hid] mov eax, [_hid]
imul eax, sizeof.crash_item imul eax, sizeof.crash_item
lea eax, [crash._.table + eax] lea edx, [crash._.table + eax]
mov [hi], eax mov ebx, [_ctx]
mov eax, [hi] stdcall [edx + crash_item.init], [_ctx]
mov edx, [eax + crash_item.function]
mov esi, [eax + crash_item.init_val]
mov edi, [_hash]
mov [hash_func], edx
mov ecx, [hi]
mov ecx, [ecx + crash_item.len_in]
rep movsd
mov [final], 0 .hash:
.first:
mov eax, [_msglen]
mov ecx, [_len]
add [eax], ecx
mov esi, [_data] mov esi, [_data]
test ecx, ecx push edx
jz .callback stdcall [edx + crash_item.update], [_ctx], [_data], [size]
.begin: mov [size], 0
mov eax, [hi] pop edx
mov eax, [eax + crash_item.len_blk]
sub [_len], eax
jnc @f
add [_len], eax
jmp .endofblock
@@:
stdcall [hash_func], [_hash], [_data]
jmp .begin
.endofblock:
cmp [final], 1
je .quit
.callback: mov eax, [_callback]
mov edi, [_data]
mov ecx, [_len]
rep movsb
push esi edi
stdcall [_callback], [_len]
pop edi esi
test eax, eax test eax, eax
jz @f jz .quit
mov edx, [_msglen] push edx
mov ecx, [_len] stdcall [_callback], [size]
sub [edx], ecx pop edx
add [_len], eax mov [size], eax
jmp .first test eax, eax
@@: jnz .hash
mov eax, [_msglen] stdcall [edx + crash_item.final], [_ctx]
mov eax, [eax]
xor edx, edx
mov ecx, [hi]
mov ecx, [ecx + crash_item.len_blk]
div ecx
mov eax, edx
mov edx, [hi]
mov ecx, [edx + crash_item.len_blk]
sub ecx, [edx + crash_item.len_size]
sub ecx, eax
ja @f
add ecx, [edx + crash_item.len_blk]
@@:
add [_len], ecx
mov eax, [edx + crash_item.len_size]
add [_len], eax
mov eax, [hi]
stdcall [eax + crash_item.finalproc], [hi], [_msglen]
mov [final], 1
jmp .first
.quit: .quit:
mov eax, [hi]
stdcall [eax + crash_item.postproc], [eax + crash_item.len_out], [_hash]
ret ret
endp endp
crash._.md4_finalproc: proc crash.bin2hex _bin, _hex, _hid
proc crash._.md5_finalproc _hi, _msglen
mov byte[edi], 0x80
add edi, 1
sub ecx, 1
mov al, 0
rep stosb
push ecx
xor eax, eax
mov ecx, [_hi]
mov ecx, [ecx + crash_item.len_size]
sub ecx, 8 ; FIXME for > 2^64 input length
shr ecx, 2
rep stosd
pop ecx
mov eax, [_msglen]
mov eax, [eax]
mov edx, 8
mul edx
mov ecx, [_hi]
mov dword[edi], eax
mov dword[edi + 4], edx
ret
endp
crash._.sha1_finalproc:
crash._.sha224_finalproc:
proc crash._.sha256_finalproc _hi, _msglen
mov byte[edi], 0x80
add edi, 1
sub ecx, 1
mov al, 0
rep stosb
push ecx
xor eax, eax
mov ecx, [_hi]
mov ecx, [ecx + crash_item.len_size]
sub ecx, 8 ; FIXME for > 2^64 input length
shr ecx, 2
rep stosd
pop ecx
mov eax, [_msglen]
mov eax, [eax]
mov edx, 8
mul edx
mov ecx, [_hi]
bswap eax
bswap edx
xchg eax, edx
mov dword[edi], eax
mov dword[edi + 4], edx
ret
endp
crash._.sha384_finalproc:
proc crash._.sha512_finalproc _hi, _msglen
mov byte[edi], 0x80
add edi, 1
sub ecx, 1
mov al, 0
rep stosb
push ecx
xor eax, eax
mov ecx, [_hi]
mov ecx, [ecx + crash_item.len_size]
sub ecx, 8 ; FIXME for > 2^64 input length
shr ecx, 2
rep stosd
pop ecx
mov eax, [_msglen]
mov eax, [eax]
mov edx, 8
mul edx
mov ecx, [_hi]
bswap eax
bswap edx
xchg eax, edx
mov dword[edi], eax
mov dword[edi + 4], edx
ret
endp
crash._.sha3_224_finalproc:
crash._.sha3_256_finalproc:
crash._.sha3_384_finalproc:
proc crash._.sha3_512_finalproc _hi, _msglen
mov byte[edi], 0x01
add edi, 1
sub ecx, 1
mov eax, 0
rep stosb
or byte[edi - 1], 0x80
ret
endp
crash._.md4_postprocess:
proc crash._.md5_postprocess _len_out, _hash
ret
endp
crash._.sha1_postprocess:
crash._.sha224_postprocess:
proc crash._.sha256_postprocess _len_out, _hash
mov ecx, [_len_out]
mov esi, [_hash]
mov edi, esi
@@:
lodsd
bswap eax
stosd
dec ecx
jnz @b
ret
endp
crash._.sha384_postprocess:
proc crash._.sha512_postprocess _len_out, _hash
mov ecx, [_len_out]
mov esi, [_hash]
mov edi, esi
@@:
lodsd
mov ebx, eax
lodsd
bswap eax
bswap ebx
stosd
mov eax, ebx
stosd
dec ecx
jnz @b
emms
ret
endp
crash._.sha3_224_postprocess:
crash._.sha3_256_postprocess:
crash._.sha3_384_postprocess:
proc crash._.sha3_512_postprocess _len_out, _hash
emms
ret
endp
proc crash.bin2hex _bin, _hex, _hid ; FIXME _hid param?
mov eax, [_hid] mov eax, [_hid]
imul eax, sizeof.crash_item imul eax, sizeof.crash_item
mov ecx, [crash._.table + eax + crash_item.len_out] mov ecx, [crash._.table + eax + crash_item.len_out]
mov ebx, crash._.bin2hex_table mov ebx, crash._.bin2hex_table
mov esi, [_bin] mov esi, [_bin]
mov edi, [_hex] mov edi, [_hex]
shl ecx, 2
.next_byte: .next_byte:
xor eax, eax xor eax, eax
lodsb lodsb
@ -310,77 +102,22 @@ proc crash.bin2hex _bin, _hex, _hid ; FIXME _hid param?
endp endp
section '.data' data readable align 16
crash._.bin2hex_table db '0123456789abcdef' crash._.bin2hex_table db '0123456789abcdef'
; see crash_item struct for details crash._.table dd \
crash._.table dd crash.md4, crash._.md4_init, crash._.md4_finalproc, crash._.md4_postprocess, 4, 4, 64, 8 crc32.init, crc32.update, crc32.final, CRC32_HASH_SIZE, \
dd crash.md5, crash._.md5_init, crash._.md5_finalproc, crash._.md5_postprocess, 4, 4, 64, 8 md4.init, md4.update, md4.final, MD4_HASH_SIZE, \
dd crash.sha1, crash._.sha1_init, crash._.sha1_finalproc, crash._.sha1_postprocess, 5, 5, 64, 8 md5.init, md5.update, md5.final, MD5_HASH_SIZE, \
dd crash.sha256, crash._.sha224_init, crash._.sha224_finalproc, crash._.sha224_postprocess, 8, 7, 64, 8 sha1.init, sha1.update, sha1.final, SHA1_HASH_SIZE, \
dd crash.sha256, crash._.sha256_init, crash._.sha256_finalproc, crash._.sha256_postprocess, 8, 8, 64, 8 sha224.init, sha224256.update, sha224256.final, SHA224_HASH_SIZE, \
dd crash.sha512, crash._.sha384_init, crash._.sha384_finalproc, crash._.sha384_postprocess, 16, 12, 128, 16 sha256.init, sha224256.update, sha224256.final, SHA256_HASH_SIZE, \
dd crash.sha512, crash._.sha512_init, crash._.sha512_finalproc, crash._.sha512_postprocess, 16, 16, 128, 16 sha384.init, sha384512.update, sha384512.final, SHA384_HASH_SIZE, \
dd crash.sha3_224, crash._.sha3_224_init, crash._.sha3_224_finalproc, crash._.sha3_224_postprocess, 50, 7, 144, 0 sha512.init, sha384512.update, sha384512.final, SHA512_HASH_SIZE, \
dd crash.sha3_256, crash._.sha3_256_init, crash._.sha3_256_finalproc, crash._.sha3_256_postprocess, 50, 8, 136, 0 sha3224.init, sha3.update, sha3.final, SHA3224_HASH_SIZE,\
dd crash.sha3_384, crash._.sha3_384_init, crash._.sha3_384_finalproc, crash._.sha3_384_postprocess, 50, 12, 104, 0 sha3256.init, sha3.update, sha3.final, SHA3256_HASH_SIZE,\
dd crash.sha3_512, crash._.sha3_512_init, crash._.sha3_512_finalproc, crash._.sha3_512_postprocess, 50, 16, 72, 0 sha3384.init, sha3.update, sha3.final, SHA3384_HASH_SIZE,\
sha3512.init, sha3.update, sha3.final, SHA3512_HASH_SIZE
crash._.md4_init:
crash._.md5_init:
crash._.sha1_init dd 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0
crash._.sha224_init dd 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4
crash._.sha256_init dd 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19
crash._.sha384_init dq 0xcbbb9d5dc1059ed8, 0x629a292a367cd507, 0x9159015a3070dd17, 0x152fecd8f70e5939,\
0x67332667ffc00b31, 0x8eb44a8768581511, 0xdb0c2e0d64f98fa7, 0x47b5481dbefa4fa4
crash._.sha512_init dq 0x6a09e667f3bcc908, 0xbb67ae8584caa73b, 0x3c6ef372fe94f82b, 0xa54ff53a5f1d36f1,\
0x510e527fade682d1, 0x9b05688c2b3e6c1f, 0x1f83d9abfb41bd6b, 0x5be0cd19137e2179
crash._.sha3_512_init:
crash._.sha3_384_init:
crash._.sha3_256_init:
crash._.sha3_224_init dq 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
crash._.sha256_table dd 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\
0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\
0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\
0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\
0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
crash._.sha512_table dq 0x428a2f98d728ae22, 0x7137449123ef65cd, 0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc,\
0x3956c25bf348b538, 0x59f111f1b605d019, 0x923f82a4af194f9b, 0xab1c5ed5da6d8118,\
0xd807aa98a3030242, 0x12835b0145706fbe, 0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2,\
0x72be5d74f27b896f, 0x80deb1fe3b1696b1, 0x9bdc06a725c71235, 0xc19bf174cf692694,\
0xe49b69c19ef14ad2, 0xefbe4786384f25e3, 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65,\
0x2de92c6f592b0275, 0x4a7484aa6ea6e483, 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5,\
0x983e5152ee66dfab, 0xa831c66d2db43210, 0xb00327c898fb213f, 0xbf597fc7beef0ee4,\
0xc6e00bf33da88fc2, 0xd5a79147930aa725, 0x06ca6351e003826f, 0x142929670a0e6e70,\
0x27b70a8546d22ffc, 0x2e1b21385c26c926, 0x4d2c6dfc5ac42aed, 0x53380d139d95b3df,\
0x650a73548baf63de, 0x766a0abb3c77b2a8, 0x81c2c92e47edaee6, 0x92722c851482353b,\
0xa2bfe8a14cf10364, 0xa81a664bbc423001, 0xc24b8b70d0f89791, 0xc76c51a30654be30,\
0xd192e819d6ef5218, 0xd69906245565a910, 0xf40e35855771202a, 0x106aa07032bbd1b8,\
0x19a4c116b8d2d0c8, 0x1e376c085141ab53, 0x2748774cdf8eeb99, 0x34b0bcb5e19b48a8,\
0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb, 0x5b9cca4f7763e373, 0x682e6ff3d6b2b8a3,\
0x748f82ee5defb2fc, 0x78a5636f43172f60, 0x84c87814a1f0ab72, 0x8cc702081a6439ec,\
0x90befffa23631e28, 0xa4506cebde82bde9, 0xbef9a3f7b2c67915, 0xc67178f2e372532b,\
0xca273eceea26619c, 0xd186b8c721c0c207, 0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178,\
0x06f067aa72176fba, 0x0a637dc5a2c898a6, 0x113f9804bef90dae, 0x1b710b35131c471b,\
0x28db77f523047d84, 0x32caab7b40c72493, 0x3c9ebe0a15c9bebc, 0x431d67c49c100d4c,\
0x4cc5d4becb3e42b6, 0x597f299cfc657e2a, 0x5fcb6fab3ad6faec, 0x6c44198c4a475817
crash._.sha3_round dq 0x0000000000000001, 0x0000000000008082, 0x800000000000808A, 0x8000000080008000,\
0x000000000000808B, 0x0000000080000001, 0x8000000080008081, 0x8000000000008009,\
0x000000000000008A, 0x0000000000000088, 0x0000000080008009, 0x000000008000000A,\
0x000000008000808B, 0x800000000000008B, 0x8000000000008089, 0x8000000000008003,\
0x8000000000008002, 0x8000000000000080, 0x000000000000800A, 0x800000008000000A,\
0x8000000080008081, 0x8000000000008080, 0x0000000080000001, 0x8000000080008008
align 4 align 4
@EXPORT: @EXPORT:

View File

@ -1,6 +1,6 @@
; libcrash -- cryptographic hash functions ; libcrash -- cryptographic hash functions
; ;
; Copyright (C) 2012-2013 Ivan Baravy (dunkaist) ; Copyright (C) 2012-2014,2016 Ivan Baravy (dunkaist)
; ;
; This program is free software: you can redistribute it and/or modify ; This program is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by ; it under the terms of the GNU General Public License as published by
@ -15,25 +15,26 @@
; You should have received a copy of the GNU General Public License ; You should have received a copy of the GNU General Public License
; along with this program. If not, see <http://www.gnu.org/licenses/>. ; along with this program. If not, see <http://www.gnu.org/licenses/>.
LIBCRASH_MD4 = 0
LIBCRASH_MD5 = 1 LIBCRASH_CRC32 = 0
LIBCRASH_SHA1 = 2 LIBCRASH_MD4 = 1
LIBCRASH_SHA224 = 3 LIBCRASH_MD5 = 2
LIBCRASH_SHA256 = 4 LIBCRASH_SHA1 = 3
LIBCRASH_SHA384 = 5 LIBCRASH_SHA224 = 4
LIBCRASH_SHA512 = 6 LIBCRASH_SHA256 = 5
LIBCRASH_SHA3_224 = 7 LIBCRASH_SHA384 = 6
LIBCRASH_SHA3_256 = 8 LIBCRASH_SHA512 = 7
LIBCRASH_SHA3_384 = 9 LIBCRASH_SHA3_224 = 8
LIBCRASH_SHA3_512 = 10 LIBCRASH_SHA3_256 = 9
LIBCRASH_SHA3_384 = 10
LIBCRASH_SHA3_512 = 11
LIBCRASH_LAST = 11
struct crash_item struct crash_item
function dd ? init dd ?
init_val dd ? update dd ?
finalproc dd ? final dd ?
postproc dd ?
len_in dd ?
len_out dd ? len_out dd ?
len_blk dd ?
len_size dd ?
ends ends

View File

@ -1,6 +1,6 @@
; libcrash -- cryptographic hash functions ; libcrash -- cryptographic hash functions
; ;
; Copyright (C) 2012-2013 Ivan Baravy (dunkaist) ; Copyright (C) 2012-2013,2016 Ivan Baravy (dunkaist)
; ;
; This program is free software: you can redistribute it and/or modify ; This program is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by ; it under the terms of the GNU General Public License as published by
@ -15,109 +15,237 @@
; You should have received a copy of the GNU General Public License ; You should have received a copy of the GNU General Public License
; along with this program. If not, see <http://www.gnu.org/licenses/>. ; along with this program. If not, see <http://www.gnu.org/licenses/>.
macro crash.md4.f b, c, d
MD4_BLOCK_SIZE = 64
MD4_HASH_SIZE = 16
MD4_ALIGN = 4
MD4_ALIGN_MASK = MD4_ALIGN - 1
struct ctx_md4
hash rb MD4_HASH_SIZE
block rb MD4_BLOCK_SIZE
index rd 1
msglen_0 rd 1
msglen_1 rd 1
ends
macro md4._.f b, c, d
{ {
push c mov eax, c
xor c, d xor eax, d
and b, c and eax, b
xor b, d xor eax, d
pop c
} }
macro crash.md4.g b, c, d macro md4._.g b, c, d
{ {
push c d push c d
mov edi, b mov eax, b
and b, c and eax, c
and c, d and c, d
and d, edi and d, b
or b, c or eax, c
or b, d or eax, d
pop d c pop d c
} }
macro crash.md4.h b, c, d macro md4._.h b, c, d
{ {
xor b, c mov eax, b
xor b, d xor eax, c
xor eax, d
} }
macro crash.md4.round func, a, b, c, d, index, shift, ac macro md4._.round func, a, b, c, d, index, shift, ac
{ {
push b
func b, c, d func b, c, d
lea a, [a + b + ac] add eax, [esi + index*4]
add a, [esi + index*4] lea a, [a + eax + ac]
rol a, shift rol a, shift
pop b
} }
proc crash.md4 _md4, _data proc md4.init _ctx
mov edi, [_md4] mov ebx, [_ctx]
mov eax, [edi + 0x0] lea edi, [ebx + ctx_md4.hash]
mov ebx, [edi + 0x4] mov esi, md4._.hash_init
mov ecx, [edi + 0x8] mov ecx, MD4_HASH_SIZE/4
mov edx, [edi + 0xc] rep movsd
xor eax, eax
mov [ebx + ctx_md4.index], eax
mov [ebx + ctx_md4.msglen_0], eax
mov [ebx + ctx_md4.msglen_1], eax
ret
endp
crash.md4.round crash.md4.f, eax, ebx, ecx, edx, 0, 3, 0x00000000
crash.md4.round crash.md4.f, edx, eax, ebx, ecx, 1, 7, 0x00000000
crash.md4.round crash.md4.f, ecx, edx, eax, ebx, 2, 11, 0x00000000
crash.md4.round crash.md4.f, ebx, ecx, edx, eax, 3, 19, 0x00000000
crash.md4.round crash.md4.f, eax, ebx, ecx, edx, 4, 3, 0x00000000
crash.md4.round crash.md4.f, edx, eax, ebx, ecx, 5, 7, 0x00000000
crash.md4.round crash.md4.f, ecx, edx, eax, ebx, 6, 11, 0x00000000
crash.md4.round crash.md4.f, ebx, ecx, edx, eax, 7, 19, 0x00000000
crash.md4.round crash.md4.f, eax, ebx, ecx, edx, 8, 3, 0x00000000
crash.md4.round crash.md4.f, edx, eax, ebx, ecx, 9, 7, 0x00000000
crash.md4.round crash.md4.f, ecx, edx, eax, ebx, 10, 11, 0x00000000
crash.md4.round crash.md4.f, ebx, ecx, edx, eax, 11, 19, 0x00000000
crash.md4.round crash.md4.f, eax, ebx, ecx, edx, 12, 3, 0x00000000
crash.md4.round crash.md4.f, edx, eax, ebx, ecx, 13, 7, 0x00000000
crash.md4.round crash.md4.f, ecx, edx, eax, ebx, 14, 11, 0x00000000
crash.md4.round crash.md4.f, ebx, ecx, edx, eax, 15, 19, 0x00000000
crash.md4.round crash.md4.g, eax, ebx, ecx, edx, 0, 3, 0x5a827999 proc md4._.block _hash
crash.md4.round crash.md4.g, edx, eax, ebx, ecx, 4, 5, 0x5a827999
crash.md4.round crash.md4.g, ecx, edx, eax, ebx, 8, 9, 0x5a827999
crash.md4.round crash.md4.g, ebx, ecx, edx, eax, 12, 13, 0x5a827999
crash.md4.round crash.md4.g, eax, ebx, ecx, edx, 1, 3, 0x5a827999
crash.md4.round crash.md4.g, edx, eax, ebx, ecx, 5, 5, 0x5a827999
crash.md4.round crash.md4.g, ecx, edx, eax, ebx, 9, 9, 0x5a827999
crash.md4.round crash.md4.g, ebx, ecx, edx, eax, 13, 13, 0x5a827999
crash.md4.round crash.md4.g, eax, ebx, ecx, edx, 2, 3, 0x5a827999
crash.md4.round crash.md4.g, edx, eax, ebx, ecx, 6, 5, 0x5a827999
crash.md4.round crash.md4.g, ecx, edx, eax, ebx, 10, 9, 0x5a827999
crash.md4.round crash.md4.g, ebx, ecx, edx, eax, 14, 13, 0x5a827999
crash.md4.round crash.md4.g, eax, ebx, ecx, edx, 3, 3, 0x5a827999
crash.md4.round crash.md4.g, edx, eax, ebx, ecx, 7, 5, 0x5a827999
crash.md4.round crash.md4.g, ecx, edx, eax, ebx, 11, 9, 0x5a827999
crash.md4.round crash.md4.g, ebx, ecx, edx, eax, 15, 13, 0x5a827999
crash.md4.round crash.md4.h, eax, ebx, ecx, edx, 0, 3, 0x6ed9eba1 mov eax, [_hash]
crash.md4.round crash.md4.h, edx, eax, ebx, ecx, 8, 9, 0x6ed9eba1 mov edi, [eax + 0x0]
crash.md4.round crash.md4.h, ecx, edx, eax, ebx, 4, 11, 0x6ed9eba1 mov ebx, [eax + 0x4]
crash.md4.round crash.md4.h, ebx, ecx, edx, eax, 12, 15, 0x6ed9eba1 mov ecx, [eax + 0x8]
crash.md4.round crash.md4.h, eax, ebx, ecx, edx, 2, 3, 0x6ed9eba1 mov edx, [eax + 0xc]
crash.md4.round crash.md4.h, edx, eax, ebx, ecx, 10, 9, 0x6ed9eba1
crash.md4.round crash.md4.h, ecx, edx, eax, ebx, 6, 11, 0x6ed9eba1
crash.md4.round crash.md4.h, ebx, ecx, edx, eax, 14, 15, 0x6ed9eba1
crash.md4.round crash.md4.h, eax, ebx, ecx, edx, 1, 3, 0x6ed9eba1
crash.md4.round crash.md4.h, edx, eax, ebx, ecx, 9, 9, 0x6ed9eba1
crash.md4.round crash.md4.h, ecx, edx, eax, ebx, 5, 11, 0x6ed9eba1
crash.md4.round crash.md4.h, ebx, ecx, edx, eax, 13, 15, 0x6ed9eba1
crash.md4.round crash.md4.h, eax, ebx, ecx, edx, 3, 3, 0x6ed9eba1
crash.md4.round crash.md4.h, edx, eax, ebx, ecx, 11, 9, 0x6ed9eba1
crash.md4.round crash.md4.h, ecx, edx, eax, ebx, 7, 11, 0x6ed9eba1
crash.md4.round crash.md4.h, ebx, ecx, edx, eax, 15, 15, 0x6ed9eba1
mov edi, [_md4] md4._.round md4._.f, edi, ebx, ecx, edx, 0, 3, 0x00000000
add [edi + 0x0], eax md4._.round md4._.f, edx, edi, ebx, ecx, 1, 7, 0x00000000
add [edi + 0x4], ebx md4._.round md4._.f, ecx, edx, edi, ebx, 2, 11, 0x00000000
add [edi + 0x8], ecx md4._.round md4._.f, ebx, ecx, edx, edi, 3, 19, 0x00000000
add [edi + 0xc], edx md4._.round md4._.f, edi, ebx, ecx, edx, 4, 3, 0x00000000
add esi, 64 md4._.round md4._.f, edx, edi, ebx, ecx, 5, 7, 0x00000000
md4._.round md4._.f, ecx, edx, edi, ebx, 6, 11, 0x00000000
md4._.round md4._.f, ebx, ecx, edx, edi, 7, 19, 0x00000000
md4._.round md4._.f, edi, ebx, ecx, edx, 8, 3, 0x00000000
md4._.round md4._.f, edx, edi, ebx, ecx, 9, 7, 0x00000000
md4._.round md4._.f, ecx, edx, edi, ebx, 10, 11, 0x00000000
md4._.round md4._.f, ebx, ecx, edx, edi, 11, 19, 0x00000000
md4._.round md4._.f, edi, ebx, ecx, edx, 12, 3, 0x00000000
md4._.round md4._.f, edx, edi, ebx, ecx, 13, 7, 0x00000000
md4._.round md4._.f, ecx, edx, edi, ebx, 14, 11, 0x00000000
md4._.round md4._.f, ebx, ecx, edx, edi, 15, 19, 0x00000000
md4._.round md4._.g, edi, ebx, ecx, edx, 0, 3, 0x5a827999
md4._.round md4._.g, edx, edi, ebx, ecx, 4, 5, 0x5a827999
md4._.round md4._.g, ecx, edx, edi, ebx, 8, 9, 0x5a827999
md4._.round md4._.g, ebx, ecx, edx, edi, 12, 13, 0x5a827999
md4._.round md4._.g, edi, ebx, ecx, edx, 1, 3, 0x5a827999
md4._.round md4._.g, edx, edi, ebx, ecx, 5, 5, 0x5a827999
md4._.round md4._.g, ecx, edx, edi, ebx, 9, 9, 0x5a827999
md4._.round md4._.g, ebx, ecx, edx, edi, 13, 13, 0x5a827999
md4._.round md4._.g, edi, ebx, ecx, edx, 2, 3, 0x5a827999
md4._.round md4._.g, edx, edi, ebx, ecx, 6, 5, 0x5a827999
md4._.round md4._.g, ecx, edx, edi, ebx, 10, 9, 0x5a827999
md4._.round md4._.g, ebx, ecx, edx, edi, 14, 13, 0x5a827999
md4._.round md4._.g, edi, ebx, ecx, edx, 3, 3, 0x5a827999
md4._.round md4._.g, edx, edi, ebx, ecx, 7, 5, 0x5a827999
md4._.round md4._.g, ecx, edx, edi, ebx, 11, 9, 0x5a827999
md4._.round md4._.g, ebx, ecx, edx, edi, 15, 13, 0x5a827999
md4._.round md4._.h, edi, ebx, ecx, edx, 0, 3, 0x6ed9eba1
md4._.round md4._.h, edx, edi, ebx, ecx, 8, 9, 0x6ed9eba1
md4._.round md4._.h, ecx, edx, edi, ebx, 4, 11, 0x6ed9eba1
md4._.round md4._.h, ebx, ecx, edx, edi, 12, 15, 0x6ed9eba1
md4._.round md4._.h, edi, ebx, ecx, edx, 2, 3, 0x6ed9eba1
md4._.round md4._.h, edx, edi, ebx, ecx, 10, 9, 0x6ed9eba1
md4._.round md4._.h, ecx, edx, edi, ebx, 6, 11, 0x6ed9eba1
md4._.round md4._.h, ebx, ecx, edx, edi, 14, 15, 0x6ed9eba1
md4._.round md4._.h, edi, ebx, ecx, edx, 1, 3, 0x6ed9eba1
md4._.round md4._.h, edx, edi, ebx, ecx, 9, 9, 0x6ed9eba1
md4._.round md4._.h, ecx, edx, edi, ebx, 5, 11, 0x6ed9eba1
md4._.round md4._.h, ebx, ecx, edx, edi, 13, 15, 0x6ed9eba1
md4._.round md4._.h, edi, ebx, ecx, edx, 3, 3, 0x6ed9eba1
md4._.round md4._.h, edx, edi, ebx, ecx, 11, 9, 0x6ed9eba1
md4._.round md4._.h, ecx, edx, edi, ebx, 7, 11, 0x6ed9eba1
md4._.round md4._.h, ebx, ecx, edx, edi, 15, 15, 0x6ed9eba1
mov eax, [_hash]
add [eax + 0x0], edi
add [eax + 0x4], ebx
add [eax + 0x8], ecx
add [eax + 0xc], edx
ret ret
endp endp
proc md4.update _ctx, _msg, _size
mov ebx, [_ctx]
mov ecx, [_size]
add [ebx + ctx_md4.msglen_0], ecx
adc [ebx + ctx_md4.msglen_1], 0
.next_block:
mov ebx, [_ctx]
mov esi, [_msg]
mov eax, [ebx + ctx_md4.index]
and eax, MD4_BLOCK_SIZE-1
jnz .copy_to_buf
test esi, MD4_ALIGN_MASK
jnz .copy_to_buf
.no_copy:
; data is aligned, hash it in place without copying
mov ebx, [_ctx]
cmp [_size], MD4_BLOCK_SIZE
jb .copy_quit
lea eax, [ebx + ctx_md4.hash]
stdcall md4._.block, eax
sub [_size], MD4_BLOCK_SIZE
add esi, MD4_BLOCK_SIZE
jmp .no_copy
.copy_to_buf:
lea edi, [ebx + ctx_md4.block]
add edi, eax
mov ecx, MD4_BLOCK_SIZE
sub ecx, eax
cmp [_size], ecx
jb .copy_quit
sub [_size], ecx
add [_msg], ecx
add [ebx + ctx_md4.index], ecx
rep movsb
lea eax, [ebx + ctx_md4.hash]
lea esi, [ebx + ctx_md4.block]
stdcall md4._.block, eax
jmp .next_block
.copy_quit:
mov ebx, [_ctx]
lea edi, [ebx + ctx_md4.block]
mov eax, [ebx + ctx_md4.index]
and eax, MD4_BLOCK_SIZE-1
add edi, eax
mov ecx, [_size]
add [ebx + ctx_md4.index], ecx
rep movsb
.quit:
ret
endp
proc md4.final _ctx
mov ebx, [_ctx]
lea edi, [ebx + ctx_md4.block]
mov ecx, [ebx + ctx_md4.msglen_0]
and ecx, MD4_BLOCK_SIZE-1
add edi, ecx
mov byte[edi], 0x80
inc edi
neg ecx
add ecx, MD4_BLOCK_SIZE
cmp ecx, 8
ja .last
dec ecx
xor eax, eax
rep stosb
lea esi, [ebx + ctx_md4.block]
lea eax, [ebx + ctx_md4.hash]
stdcall md4._.block, eax
mov ebx, [_ctx]
lea edi, [ebx + ctx_md4.block]
mov ecx, MD4_BLOCK_SIZE+1
.last:
dec ecx
sub ecx, 8
xor eax, eax
rep stosb
mov eax, [ebx + ctx_md4.msglen_0]
mov edx, [ebx + ctx_md4.msglen_1]
shld edx, eax, 3
shl eax, 3
mov dword[edi], eax
mov dword[edi+4], edx
lea esi, [ebx + ctx_md4.block]
lea eax, [ebx + ctx_md4.hash]
stdcall md4._.block, eax
ret
endp
align MD4_ALIGN
md4._.hash_init dd 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0

View File

@ -1,6 +1,6 @@
; libcrash -- cryptographic hash functions ; libcrash -- cryptographic hash functions
; ;
; Copyright (C) 2012-2013 Ivan Baravy (dunkaist) ; Copyright (C) 2012-2013,2016 Ivan Baravy (dunkaist)
; ;
; This program is free software: you can redistribute it and/or modify ; This program is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by ; it under the terms of the GNU General Public License as published by
@ -15,7 +15,22 @@
; You should have received a copy of the GNU General Public License ; You should have received a copy of the GNU General Public License
; along with this program. If not, see <http://www.gnu.org/licenses/>. ; along with this program. If not, see <http://www.gnu.org/licenses/>.
macro crash.md5.f b, c, d
MD5_BLOCK_SIZE = 64
MD5_HASH_SIZE = 16
MD5_ALIGN = 4
MD5_ALIGN_MASK = MD5_ALIGN - 1
struct ctx_md5
hash rb MD5_HASH_SIZE
block rb MD5_BLOCK_SIZE
index rd 1
msglen_0 rd 1
msglen_1 rd 1
ends
macro md5._.f b, c, d
{ {
push c push c
xor c, d xor c, d
@ -24,7 +39,7 @@ macro crash.md5.f b, c, d
pop c pop c
} }
macro crash.md5.g b, c, d macro md5._.g b, c, d
{ {
push c d push c d
and b, d and b, d
@ -34,13 +49,13 @@ macro crash.md5.g b, c, d
pop d c pop d c
} }
macro crash.md5.h b, c, d macro md5._.h b, c, d
{ {
xor b, c xor b, c
xor b, d xor b, d
} }
macro crash.md5.i b, c, d macro md5._.i b, c, d
{ {
push d push d
not d not d
@ -49,7 +64,7 @@ macro crash.md5.i b, c, d
pop d pop d
} }
macro crash.md5.round func, a, b, c, d, index, shift, ac macro md5._.round func, a, b, c, d, index, shift, ac
{ {
push b push b
func b, c, d func b, c, d
@ -61,88 +76,204 @@ macro crash.md5.round func, a, b, c, d, index, shift, ac
} }
proc crash.md5 _md5, _data proc md5.init _ctx
mov edi, [_md5] mov ebx, [_ctx]
lea edi, [ebx + ctx_md5.hash]
mov esi, md5._.hash_init
mov ecx, MD5_HASH_SIZE/4
rep movsd
xor eax, eax
mov [ebx + ctx_md5.index], eax
mov [ebx + ctx_md5.msglen_0], eax
mov [ebx + ctx_md5.msglen_1], eax
ret
endp
proc md5._.block _hash
mov edi, [_hash]
mov eax, [edi + 0x0] mov eax, [edi + 0x0]
mov ebx, [edi + 0x4] mov ebx, [edi + 0x4]
mov ecx, [edi + 0x8] mov ecx, [edi + 0x8]
mov edx, [edi + 0xc] mov edx, [edi + 0xc]
crash.md5.round crash.md5.f, eax, ebx, ecx, edx, 0, 7, 0xd76aa478 md5._.round md5._.f, eax, ebx, ecx, edx, 0, 7, 0xd76aa478
crash.md5.round crash.md5.f, edx, eax, ebx, ecx, 1, 12, 0xe8c7b756 md5._.round md5._.f, edx, eax, ebx, ecx, 1, 12, 0xe8c7b756
crash.md5.round crash.md5.f, ecx, edx, eax, ebx, 2, 17, 0x242070db md5._.round md5._.f, ecx, edx, eax, ebx, 2, 17, 0x242070db
crash.md5.round crash.md5.f, ebx, ecx, edx, eax, 3, 22, 0xc1bdceee md5._.round md5._.f, ebx, ecx, edx, eax, 3, 22, 0xc1bdceee
crash.md5.round crash.md5.f, eax, ebx, ecx, edx, 4, 7, 0xf57c0faf md5._.round md5._.f, eax, ebx, ecx, edx, 4, 7, 0xf57c0faf
crash.md5.round crash.md5.f, edx, eax, ebx, ecx, 5, 12, 0x4787c62a md5._.round md5._.f, edx, eax, ebx, ecx, 5, 12, 0x4787c62a
crash.md5.round crash.md5.f, ecx, edx, eax, ebx, 6, 17, 0xa8304613 md5._.round md5._.f, ecx, edx, eax, ebx, 6, 17, 0xa8304613
crash.md5.round crash.md5.f, ebx, ecx, edx, eax, 7, 22, 0xfd469501 md5._.round md5._.f, ebx, ecx, edx, eax, 7, 22, 0xfd469501
crash.md5.round crash.md5.f, eax, ebx, ecx, edx, 8, 7, 0x698098d8 md5._.round md5._.f, eax, ebx, ecx, edx, 8, 7, 0x698098d8
crash.md5.round crash.md5.f, edx, eax, ebx, ecx, 9, 12, 0x8b44f7af md5._.round md5._.f, edx, eax, ebx, ecx, 9, 12, 0x8b44f7af
crash.md5.round crash.md5.f, ecx, edx, eax, ebx, 10, 17, 0xffff5bb1 md5._.round md5._.f, ecx, edx, eax, ebx, 10, 17, 0xffff5bb1
crash.md5.round crash.md5.f, ebx, ecx, edx, eax, 11, 22, 0x895cd7be md5._.round md5._.f, ebx, ecx, edx, eax, 11, 22, 0x895cd7be
crash.md5.round crash.md5.f, eax, ebx, ecx, edx, 12, 7, 0x6b901122 md5._.round md5._.f, eax, ebx, ecx, edx, 12, 7, 0x6b901122
crash.md5.round crash.md5.f, edx, eax, ebx, ecx, 13, 12, 0xfd987193 md5._.round md5._.f, edx, eax, ebx, ecx, 13, 12, 0xfd987193
crash.md5.round crash.md5.f, ecx, edx, eax, ebx, 14, 17, 0xa679438e md5._.round md5._.f, ecx, edx, eax, ebx, 14, 17, 0xa679438e
crash.md5.round crash.md5.f, ebx, ecx, edx, eax, 15, 22, 0x49b40821 md5._.round md5._.f, ebx, ecx, edx, eax, 15, 22, 0x49b40821
crash.md5.round crash.md5.g, eax, ebx, ecx, edx, 1, 5, 0xf61e2562 md5._.round md5._.g, eax, ebx, ecx, edx, 1, 5, 0xf61e2562
crash.md5.round crash.md5.g, edx, eax, ebx, ecx, 6, 9, 0xc040b340 md5._.round md5._.g, edx, eax, ebx, ecx, 6, 9, 0xc040b340
crash.md5.round crash.md5.g, ecx, edx, eax, ebx, 11, 14, 0x265e5a51 md5._.round md5._.g, ecx, edx, eax, ebx, 11, 14, 0x265e5a51
crash.md5.round crash.md5.g, ebx, ecx, edx, eax, 0, 20, 0xe9b6c7aa md5._.round md5._.g, ebx, ecx, edx, eax, 0, 20, 0xe9b6c7aa
crash.md5.round crash.md5.g, eax, ebx, ecx, edx, 5, 5, 0xd62f105d md5._.round md5._.g, eax, ebx, ecx, edx, 5, 5, 0xd62f105d
crash.md5.round crash.md5.g, edx, eax, ebx, ecx, 10, 9, 0x02441453 md5._.round md5._.g, edx, eax, ebx, ecx, 10, 9, 0x02441453
crash.md5.round crash.md5.g, ecx, edx, eax, ebx, 15, 14, 0xd8a1e681 md5._.round md5._.g, ecx, edx, eax, ebx, 15, 14, 0xd8a1e681
crash.md5.round crash.md5.g, ebx, ecx, edx, eax, 4, 20, 0xe7d3fbc8 md5._.round md5._.g, ebx, ecx, edx, eax, 4, 20, 0xe7d3fbc8
crash.md5.round crash.md5.g, eax, ebx, ecx, edx, 9, 5, 0x21e1cde6 md5._.round md5._.g, eax, ebx, ecx, edx, 9, 5, 0x21e1cde6
crash.md5.round crash.md5.g, edx, eax, ebx, ecx, 14, 9, 0xc33707d6 md5._.round md5._.g, edx, eax, ebx, ecx, 14, 9, 0xc33707d6
crash.md5.round crash.md5.g, ecx, edx, eax, ebx, 3, 14, 0xf4d50d87 md5._.round md5._.g, ecx, edx, eax, ebx, 3, 14, 0xf4d50d87
crash.md5.round crash.md5.g, ebx, ecx, edx, eax, 8, 20, 0x455a14ed md5._.round md5._.g, ebx, ecx, edx, eax, 8, 20, 0x455a14ed
crash.md5.round crash.md5.g, eax, ebx, ecx, edx, 13, 5, 0xa9e3e905 md5._.round md5._.g, eax, ebx, ecx, edx, 13, 5, 0xa9e3e905
crash.md5.round crash.md5.g, edx, eax, ebx, ecx, 2, 9, 0xfcefa3f8 md5._.round md5._.g, edx, eax, ebx, ecx, 2, 9, 0xfcefa3f8
crash.md5.round crash.md5.g, ecx, edx, eax, ebx, 7, 14, 0x676f02d9 md5._.round md5._.g, ecx, edx, eax, ebx, 7, 14, 0x676f02d9
crash.md5.round crash.md5.g, ebx, ecx, edx, eax, 12, 20, 0x8d2a4c8a md5._.round md5._.g, ebx, ecx, edx, eax, 12, 20, 0x8d2a4c8a
crash.md5.round crash.md5.h, eax, ebx, ecx, edx, 5, 4, 0xfffa3942 md5._.round md5._.h, eax, ebx, ecx, edx, 5, 4, 0xfffa3942
crash.md5.round crash.md5.h, edx, eax, ebx, ecx, 8, 11, 0x8771f681 md5._.round md5._.h, edx, eax, ebx, ecx, 8, 11, 0x8771f681
crash.md5.round crash.md5.h, ecx, edx, eax, ebx, 11, 16, 0x6d9d6122 md5._.round md5._.h, ecx, edx, eax, ebx, 11, 16, 0x6d9d6122
crash.md5.round crash.md5.h, ebx, ecx, edx, eax, 14, 23, 0xfde5380c md5._.round md5._.h, ebx, ecx, edx, eax, 14, 23, 0xfde5380c
crash.md5.round crash.md5.h, eax, ebx, ecx, edx, 1, 4, 0xa4beea44 md5._.round md5._.h, eax, ebx, ecx, edx, 1, 4, 0xa4beea44
crash.md5.round crash.md5.h, edx, eax, ebx, ecx, 4, 11, 0x4bdecfa9 md5._.round md5._.h, edx, eax, ebx, ecx, 4, 11, 0x4bdecfa9
crash.md5.round crash.md5.h, ecx, edx, eax, ebx, 7, 16, 0xf6bb4b60 md5._.round md5._.h, ecx, edx, eax, ebx, 7, 16, 0xf6bb4b60
crash.md5.round crash.md5.h, ebx, ecx, edx, eax, 10, 23, 0xbebfbc70 md5._.round md5._.h, ebx, ecx, edx, eax, 10, 23, 0xbebfbc70
crash.md5.round crash.md5.h, eax, ebx, ecx, edx, 13, 4, 0x289b7ec6 md5._.round md5._.h, eax, ebx, ecx, edx, 13, 4, 0x289b7ec6
crash.md5.round crash.md5.h, edx, eax, ebx, ecx, 0, 11, 0xeaa127fa md5._.round md5._.h, edx, eax, ebx, ecx, 0, 11, 0xeaa127fa
crash.md5.round crash.md5.h, ecx, edx, eax, ebx, 3, 16, 0xd4ef3085 md5._.round md5._.h, ecx, edx, eax, ebx, 3, 16, 0xd4ef3085
crash.md5.round crash.md5.h, ebx, ecx, edx, eax, 6, 23, 0x04881d05 md5._.round md5._.h, ebx, ecx, edx, eax, 6, 23, 0x04881d05
crash.md5.round crash.md5.h, eax, ebx, ecx, edx, 9, 4, 0xd9d4d039 md5._.round md5._.h, eax, ebx, ecx, edx, 9, 4, 0xd9d4d039
crash.md5.round crash.md5.h, edx, eax, ebx, ecx, 12, 11, 0xe6db99e5 md5._.round md5._.h, edx, eax, ebx, ecx, 12, 11, 0xe6db99e5
crash.md5.round crash.md5.h, ecx, edx, eax, ebx, 15, 16, 0x1fa27cf8 md5._.round md5._.h, ecx, edx, eax, ebx, 15, 16, 0x1fa27cf8
crash.md5.round crash.md5.h, ebx, ecx, edx, eax, 2, 23, 0xc4ac5665 md5._.round md5._.h, ebx, ecx, edx, eax, 2, 23, 0xc4ac5665
crash.md5.round crash.md5.i, eax, ebx, ecx, edx, 0, 6, 0xf4292244 md5._.round md5._.i, eax, ebx, ecx, edx, 0, 6, 0xf4292244
crash.md5.round crash.md5.i, edx, eax, ebx, ecx, 7, 10, 0x432aff97 md5._.round md5._.i, edx, eax, ebx, ecx, 7, 10, 0x432aff97
crash.md5.round crash.md5.i, ecx, edx, eax, ebx, 14, 15, 0xab9423a7 md5._.round md5._.i, ecx, edx, eax, ebx, 14, 15, 0xab9423a7
crash.md5.round crash.md5.i, ebx, ecx, edx, eax, 5, 21, 0xfc93a039 md5._.round md5._.i, ebx, ecx, edx, eax, 5, 21, 0xfc93a039
crash.md5.round crash.md5.i, eax, ebx, ecx, edx, 12, 6, 0x655b59c3 md5._.round md5._.i, eax, ebx, ecx, edx, 12, 6, 0x655b59c3
crash.md5.round crash.md5.i, edx, eax, ebx, ecx, 3, 10, 0x8f0ccc92 md5._.round md5._.i, edx, eax, ebx, ecx, 3, 10, 0x8f0ccc92
crash.md5.round crash.md5.i, ecx, edx, eax, ebx, 10, 15, 0xffeff47d md5._.round md5._.i, ecx, edx, eax, ebx, 10, 15, 0xffeff47d
crash.md5.round crash.md5.i, ebx, ecx, edx, eax, 1, 21, 0x85845dd1 md5._.round md5._.i, ebx, ecx, edx, eax, 1, 21, 0x85845dd1
crash.md5.round crash.md5.i, eax, ebx, ecx, edx, 8, 6, 0x6fa87e4f md5._.round md5._.i, eax, ebx, ecx, edx, 8, 6, 0x6fa87e4f
crash.md5.round crash.md5.i, edx, eax, ebx, ecx, 15, 10, 0xfe2ce6e0 md5._.round md5._.i, edx, eax, ebx, ecx, 15, 10, 0xfe2ce6e0
crash.md5.round crash.md5.i, ecx, edx, eax, ebx, 6, 15, 0xa3014314 md5._.round md5._.i, ecx, edx, eax, ebx, 6, 15, 0xa3014314
crash.md5.round crash.md5.i, ebx, ecx, edx, eax, 13, 21, 0x4e0811a1 md5._.round md5._.i, ebx, ecx, edx, eax, 13, 21, 0x4e0811a1
crash.md5.round crash.md5.i, eax, ebx, ecx, edx, 4, 6, 0xf7537e82 md5._.round md5._.i, eax, ebx, ecx, edx, 4, 6, 0xf7537e82
crash.md5.round crash.md5.i, edx, eax, ebx, ecx, 11, 10, 0xbd3af235 md5._.round md5._.i, edx, eax, ebx, ecx, 11, 10, 0xbd3af235
crash.md5.round crash.md5.i, ecx, edx, eax, ebx, 2, 15, 0x2ad7d2bb md5._.round md5._.i, ecx, edx, eax, ebx, 2, 15, 0x2ad7d2bb
crash.md5.round crash.md5.i, ebx, ecx, edx, eax, 9, 21, 0xeb86d391 md5._.round md5._.i, ebx, ecx, edx, eax, 9, 21, 0xeb86d391
mov edi, [_md5] mov edi, [_hash]
add [edi + 0x0], eax add [edi + 0x0], eax
add [edi + 0x4], ebx add [edi + 0x4], ebx
add [edi + 0x8], ecx add [edi + 0x8], ecx
add [edi + 0xc], edx add [edi + 0xc], edx
add esi, 64
ret ret
endp endp
proc md5.update _ctx, _msg, _size
mov ebx, [_ctx]
mov ecx, [_size]
add [ebx + ctx_md5.msglen_0], ecx
adc [ebx + ctx_md5.msglen_1], 0
.next_block:
mov ebx, [_ctx]
mov esi, [_msg]
mov eax, [ebx + ctx_md5.index]
and eax, MD5_BLOCK_SIZE-1
jnz .copy_to_buf
test esi, MD5_ALIGN_MASK
jnz .copy_to_buf
.no_copy:
; data is aligned, hash it in place without copying
mov ebx, [_ctx]
cmp [_size], MD5_BLOCK_SIZE
jb .copy_quit
lea eax, [ebx + ctx_md5.hash]
stdcall md5._.block, eax
sub [_size], MD5_BLOCK_SIZE
add esi, MD5_BLOCK_SIZE
jmp .no_copy
.copy_to_buf:
lea edi, [ebx + ctx_md5.block]
add edi, eax
mov ecx, MD5_BLOCK_SIZE
sub ecx, eax
cmp [_size], ecx
jb .copy_quit
sub [_size], ecx
add [_msg], ecx
add [ebx + ctx_md5.index], ecx
rep movsb
lea eax, [ebx + ctx_md5.hash]
lea esi, [ebx + ctx_md5.block]
stdcall md5._.block, eax
jmp .next_block
.copy_quit:
mov ebx, [_ctx]
lea edi, [ebx + ctx_md5.block]
mov eax, [ebx + ctx_md5.index]
and eax, MD5_BLOCK_SIZE-1
add edi, eax
mov ecx, [_size]
add [ebx + ctx_md5.index], ecx
rep movsb
.quit:
ret
endp
proc md5.final _ctx
mov ebx, [_ctx]
lea edi, [ebx + ctx_md5.block]
mov ecx, [ebx + ctx_md5.msglen_0]
and ecx, MD5_BLOCK_SIZE-1
add edi, ecx
mov byte[edi], 0x80
inc edi
neg ecx
add ecx, MD5_BLOCK_SIZE
cmp ecx, 8
ja .last
dec ecx
xor eax, eax
rep stosb
lea esi, [ebx + ctx_md5.block]
lea eax, [ebx + ctx_md5.hash]
stdcall md5._.block, eax
mov ebx, [_ctx]
lea edi, [ebx + ctx_md5.block]
mov ecx, MD5_BLOCK_SIZE+1
.last:
dec ecx
sub ecx, 8
xor eax, eax
rep stosb
mov eax, [ebx + ctx_md5.msglen_0]
mov edx, [ebx + ctx_md5.msglen_1]
shld edx, eax, 3
shl eax, 3
mov dword[edi], eax
mov dword[edi+4], edx
lea esi, [ebx + ctx_md5.block]
lea eax, [ebx + ctx_md5.hash]
stdcall md5._.block, eax
ret
endp
align MD5_ALIGN
md5._.hash_init dd 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0

View File

@ -1,6 +1,6 @@
; libcrash -- cryptographic hash functions ; libcrash -- cryptographic hash functions
; ;
; Copyright (C) 2012-2013 Ivan Baravy (dunkaist) ; Copyright (C) 2012-2013,2016 Ivan Baravy (dunkaist)
; ;
; This program is free software: you can redistribute it and/or modify ; This program is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by ; it under the terms of the GNU General Public License as published by
@ -15,7 +15,22 @@
; You should have received a copy of the GNU General Public License ; You should have received a copy of the GNU General Public License
; along with this program. If not, see <http://www.gnu.org/licenses/>. ; along with this program. If not, see <http://www.gnu.org/licenses/>.
proc crash.sha1.f
SHA1_BLOCK_SIZE = 64
SHA1_HASH_SIZE = 20
SHA1_ALIGN = 4
SHA1_ALIGN_MASK = SHA1_ALIGN - 1
struct ctx_sha1
hash rb SHA1_HASH_SIZE
block rb SHA1_BLOCK_SIZE
index rd 1
msglen_0 rd 1
msglen_1 rd 1
ends
proc sha1._.f
push ebx ecx edx push ebx ecx edx
xor ecx, edx xor ecx, edx
and ebx, ecx and ebx, ecx
@ -25,7 +40,7 @@ proc crash.sha1.f
ret ret
endp endp
proc crash.sha1.g proc sha1._.g
push ebx ecx edx push ebx ecx edx
xor ebx, ecx xor ebx, ecx
xor ebx, edx xor ebx, edx
@ -34,7 +49,7 @@ proc crash.sha1.g
ret ret
endp endp
proc crash.sha1.h proc sha1._.h
push ebx ecx edx push ebx ecx edx
mov esi, ebx mov esi, ebx
and ebx, ecx and ebx, ecx
@ -46,7 +61,7 @@ proc crash.sha1.h
ret ret
endp endp
macro crash.sha1.round f, k, c macro sha1._.round f, k, c
{ {
mov esi, eax mov esi, eax
rol esi, 5 rol esi, 5
@ -68,7 +83,21 @@ macro crash.sha1.round f, k, c
} }
proc crash.sha1 _sha1, _data proc sha1.init _ctx
mov ebx, [_ctx]
lea edi, [ebx + ctx_sha1.hash]
mov esi, sha1._.hash_init
mov ecx, SHA1_HASH_SIZE/4
rep movsd
xor eax, eax
mov [ebx + ctx_sha1.index], eax
mov [ebx + ctx_sha1.msglen_0], eax
mov [ebx + ctx_sha1.msglen_1], eax
ret
endp
proc sha1._.block _hash
locals locals
temp rd 1 temp rd 1
w rd 80 w rd 80
@ -95,7 +124,7 @@ endl
cmp ecx, 80 cmp ecx, 80
jne @b jne @b
mov edi, [_sha1] mov edi, [_hash]
mov eax, [edi + 0x00] mov eax, [edi + 0x00]
mov ebx, [edi + 0x04] mov ebx, [edi + 0x04]
mov ecx, [edi + 0x08] mov ecx, [edi + 0x08]
@ -105,25 +134,25 @@ endl
push esi push esi
repeat 20 repeat 20
crash.sha1.round crash.sha1.f, 0x5a827999, %-1 sha1._.round sha1._.f, 0x5a827999, %-1
end repeat end repeat
repeat 20 repeat 20
crash.sha1.round crash.sha1.g, 0x6ed9eba1, %-1+20 sha1._.round sha1._.g, 0x6ed9eba1, %-1+20
end repeat end repeat
repeat 20 repeat 20
crash.sha1.round crash.sha1.h, 0x8f1bbcdc, %-1+40 sha1._.round sha1._.h, 0x8f1bbcdc, %-1+40
end repeat end repeat
repeat 20 repeat 20
crash.sha1.round crash.sha1.g, 0xca62c1d6, %-1+60 sha1._.round sha1._.g, 0xca62c1d6, %-1+60
end repeat end repeat
pop esi pop esi
mov [temp], edi mov [temp], edi
mov edi, [_sha1] mov edi, [_hash]
add [edi + 0x00], eax add [edi + 0x00], eax
add [edi + 0x04], ebx add [edi + 0x04], ebx
add [edi + 0x08], ecx add [edi + 0x08], ecx
@ -134,3 +163,125 @@ end repeat
ret ret
endp endp
proc sha1.update _ctx, _msg, _size
mov ebx, [_ctx]
mov ecx, [_size]
add [ebx + ctx_sha1.msglen_0], ecx
adc [ebx + ctx_sha1.msglen_1], 0
.next_block:
mov ebx, [_ctx]
mov esi, [_msg]
mov eax, [ebx + ctx_sha1.index]
and eax, SHA1_BLOCK_SIZE-1
jnz .copy_to_buf
test esi, SHA1_ALIGN_MASK
jnz .copy_to_buf
.no_copy:
; data is aligned, hash it in place without copying
mov ebx, [_ctx]
cmp [_size], SHA1_BLOCK_SIZE
jb .copy_quit
lea eax, [ebx + ctx_sha1.hash]
stdcall sha1._.block, eax
sub [_size], SHA1_BLOCK_SIZE
; add esi, SHA1_BLOCK_SIZE ; FIXME
jmp .no_copy
.copy_to_buf:
lea edi, [ebx + ctx_sha1.block]
add edi, eax
mov ecx, SHA1_BLOCK_SIZE
sub ecx, eax
cmp [_size], ecx
jb .copy_quit
sub [_size], ecx
add [_msg], ecx
add [ebx + ctx_sha1.index], ecx
rep movsb
lea eax, [ebx + ctx_sha1.hash]
lea esi, [ebx + ctx_sha1.block]
stdcall sha1._.block, eax
jmp .next_block
.copy_quit:
mov ebx, [_ctx]
lea edi, [ebx + ctx_sha1.block]
mov eax, [ebx + ctx_sha1.index]
and eax, SHA1_BLOCK_SIZE-1
add edi, eax
mov ecx, [_size]
add [ebx + ctx_sha1.index], ecx
rep movsb
.quit:
ret
endp
proc sha1.final _ctx
mov ebx, [_ctx]
lea edi, [ebx + ctx_sha1.block]
mov ecx, [ebx + ctx_sha1.msglen_0]
and ecx, SHA1_BLOCK_SIZE-1
add edi, ecx
mov byte[edi], 0x80
inc edi
neg ecx
add ecx, SHA1_BLOCK_SIZE
cmp ecx, 8
ja .last
dec ecx
xor eax, eax
rep stosb
lea esi, [ebx + ctx_sha1.block]
lea eax, [ebx + ctx_sha1.hash]
stdcall sha1._.block, eax
mov ebx, [_ctx]
lea edi, [ebx + ctx_sha1.block]
mov ecx, SHA1_BLOCK_SIZE+1
.last:
dec ecx
sub ecx, 8
xor eax, eax
rep stosb
mov eax, [ebx + ctx_sha1.msglen_0]
mov edx, [ebx + ctx_sha1.msglen_1]
shld edx, eax, 3
shl eax, 3
bswap eax
bswap edx
mov dword[edi], edx
mov dword[edi+4], eax
lea esi, [ebx + ctx_sha1.block]
lea eax, [ebx + ctx_sha1.hash]
stdcall sha1._.block, eax
mov ebx, [_ctx]
lea eax, [ebx + ctx_sha1.hash]
stdcall sha1._.postprocess, ebx, eax
ret
endp
proc sha1._.postprocess _ctx, _hash
mov ecx, 5
mov esi, [_hash]
mov edi, esi
@@:
lodsd
bswap eax
stosd
dec ecx
jnz @b
ret
endp
align SHA1_ALIGN
sha1._.hash_init dd 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0

View File

@ -1,6 +1,6 @@
; libcrash -- cryptographic hash functions ; libcrash -- cryptographic hash functions
; ;
; Copyright (C) 2012-2013 Ivan Baravy (dunkaist) ; Copyright (C) 2012-2013,2016 Ivan Baravy (dunkaist)
; ;
; This program is free software: you can redistribute it and/or modify ; This program is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by ; it under the terms of the GNU General Public License as published by
@ -15,7 +15,24 @@
; You should have received a copy of the GNU General Public License ; You should have received a copy of the GNU General Public License
; along with this program. If not, see <http://www.gnu.org/licenses/>. ; along with this program. If not, see <http://www.gnu.org/licenses/>.
macro chn x, y, z
SHA224256_BLOCK_SIZE = 64
SHA224256_INIT_SIZE = 32
SHA224_HASH_SIZE = 28
SHA256_HASH_SIZE = 32
SHA224256_ALIGN = 4
SHA224256_ALIGN_MASK = SHA224256_ALIGN - 1
struct ctx_sha224256
hash rb SHA224256_INIT_SIZE
block rb SHA224256_BLOCK_SIZE
index rd 1
msglen_0 rd 1
msglen_1 rd 1
ends
macro sha224256._.chn x, y, z
{ {
mov eax, [y] mov eax, [y]
xor eax, [z] xor eax, [z]
@ -23,7 +40,7 @@ macro chn x, y, z
xor eax, [z] xor eax, [z]
} }
macro maj x, y, z macro sha224256._.maj x, y, z
{ {
mov eax, [x] mov eax, [x]
xor eax, [y] xor eax, [y]
@ -33,7 +50,7 @@ macro maj x, y, z
xor eax, ecx xor eax, ecx
} }
macro Sigma0 x macro sha224256._.Sigma0 x
{ {
mov eax, x mov eax, x
mov ecx, eax mov ecx, eax
@ -45,7 +62,7 @@ macro Sigma0 x
xor eax, ecx xor eax, ecx
} }
macro Sigma1 x macro sha224256._.Sigma1 x
{ {
mov eax, x mov eax, x
mov ecx, eax mov ecx, eax
@ -57,7 +74,7 @@ macro Sigma1 x
xor eax, ecx xor eax, ecx
} }
macro sigma0 x macro sha224256._.sigma0 x
{ {
mov eax, x mov eax, x
mov ecx, eax mov ecx, eax
@ -69,7 +86,7 @@ macro sigma0 x
xor eax, ecx xor eax, ecx
} }
macro sigma1 x macro sha224256._.sigma1 x
{ {
mov eax, x mov eax, x
mov ecx, eax mov ecx, eax
@ -81,27 +98,27 @@ macro sigma1 x
xor eax, ecx xor eax, ecx
} }
macro recalculate_w n macro sha224256._.recalculate_w n
{ {
mov edx, [w + ((n-2) and 15)*4] mov edx, [w + ((n-2) and 15)*4]
sigma1 edx sha224256._.sigma1 edx
add eax, [w + ((n-7) and 15)*4] add eax, [w + ((n-7) and 15)*4]
push eax push eax
mov edx, [w + ((n-15) and 15)*4] mov edx, [w + ((n-15) and 15)*4]
sigma0 edx sha224256._.sigma0 edx
pop ecx pop ecx
add eax, ecx add eax, ecx
add [w + (n)*4], eax add [w + (n)*4], eax
} }
macro crash.sha256.round a, b, c, d, e, f, g, h, k macro sha224256._.round a, b, c, d, e, f, g, h, k
{ {
mov ebx, [h] mov ebx, [h]
mov edx, [e] mov edx, [e]
Sigma1 edx sha224256._.Sigma1 edx
add ebx, eax add ebx, eax
chn e, f, g sha224256._.chn e, f, g
add ebx, eax add ebx, eax
add ebx, [k] add ebx, [k]
@ -110,15 +127,15 @@ macro crash.sha256.round a, b, c, d, e, f, g, h, k
add [d], ebx add [d], ebx
mov edx, [a] mov edx, [a]
Sigma0 edx sha224256._.Sigma0 edx
add ebx, eax add ebx, eax
maj a, b, c sha224256._.maj a, b, c
add eax, ebx add eax, ebx
mov [h], eax mov [h], eax
} }
macro crash.sha256.round_1_16 a, b, c, d, e, f, g, h, n macro sha224256._.round_1_16 a, b, c, d, e, f, g, h, n
{ {
mov eax, [esi + (n)*4] mov eax, [esi + (n)*4]
@ -126,18 +143,46 @@ macro crash.sha256.round_1_16 a, b, c, d, e, f, g, h, n
mov dword[w + (n)*4], eax mov dword[w + (n)*4], eax
mov edi, eax mov edi, eax
crash.sha256.round a, b, c, d, e, f, g, h, (crash._.sha256_table + (n)*4) sha224256._.round a, b, c, d, e, f, g, h, (sha256_table + (n)*4)
} }
macro crash.sha256.round_17_64 a, b, c, d, e, f, g, h, n, rep_num macro sha224256._.round_17_64 a, b, c, d, e, f, g, h, n, rep_num
{ {
recalculate_w n sha224256._.recalculate_w n
mov edi, [w + (n)*4] mov edi, [w + (n)*4]
crash.sha256.round a, b, c, d, e, f, g, h, (crash._.sha256_table + (n+16*rep_num)*4) sha224256._.round a, b, c, d, e, f, g, h, (sha256_table + (n+16*rep_num)*4)
} }
proc crash.sha256 _sha256, _data proc sha224.init _ctx
mov ebx, [_ctx]
lea edi, [ebx + ctx_sha224256.hash]
mov esi, sha224._.hash_init
mov ecx, SHA224256_INIT_SIZE/4
rep movsd
xor eax, eax
mov [ebx + ctx_sha224256.index], eax
mov [ebx + ctx_sha224256.msglen_0], eax
mov [ebx + ctx_sha224256.msglen_1], eax
ret
endp
proc sha256.init _ctx
mov ebx, [_ctx]
lea edi, [ebx + ctx_sha224256.hash]
mov esi, sha256._.hash_init
mov ecx, SHA224256_INIT_SIZE/4
rep movsd
xor eax, eax
mov [ebx + ctx_sha224256.index], eax
mov [ebx + ctx_sha224256.msglen_0], eax
mov [ebx + ctx_sha224256.msglen_1], eax
ret
endp
proc sha224256._.block _hash
locals locals
w rd 64 w rd 64
A rd 1 A rd 1
@ -149,7 +194,7 @@ locals
G rd 1 G rd 1
H rd 1 H rd 1
endl endl
mov edi, [_sha256] mov edi, [_hash]
mov eax, [edi + 0x00] mov eax, [edi + 0x00]
mov [A], eax mov [A], eax
mov eax, [edi + 0x04] mov eax, [edi + 0x04]
@ -167,43 +212,43 @@ endl
mov eax, [edi + 0x1c] mov eax, [edi + 0x1c]
mov [H], eax mov [H], eax
crash.sha256.round_1_16 A, B, C, D, E, F, G, H, 0 sha224256._.round_1_16 A, B, C, D, E, F, G, H, 0
crash.sha256.round_1_16 H, A, B, C, D, E, F, G, 1 sha224256._.round_1_16 H, A, B, C, D, E, F, G, 1
crash.sha256.round_1_16 G, H, A, B, C, D, E, F, 2 sha224256._.round_1_16 G, H, A, B, C, D, E, F, 2
crash.sha256.round_1_16 F, G, H, A, B, C, D, E, 3 sha224256._.round_1_16 F, G, H, A, B, C, D, E, 3
crash.sha256.round_1_16 E, F, G, H, A, B, C, D, 4 sha224256._.round_1_16 E, F, G, H, A, B, C, D, 4
crash.sha256.round_1_16 D, E, F, G, H, A, B, C, 5 sha224256._.round_1_16 D, E, F, G, H, A, B, C, 5
crash.sha256.round_1_16 C, D, E, F, G, H, A, B, 6 sha224256._.round_1_16 C, D, E, F, G, H, A, B, 6
crash.sha256.round_1_16 B, C, D, E, F, G, H, A, 7 sha224256._.round_1_16 B, C, D, E, F, G, H, A, 7
crash.sha256.round_1_16 A, B, C, D, E, F, G, H, 8 sha224256._.round_1_16 A, B, C, D, E, F, G, H, 8
crash.sha256.round_1_16 H, A, B, C, D, E, F, G, 9 sha224256._.round_1_16 H, A, B, C, D, E, F, G, 9
crash.sha256.round_1_16 G, H, A, B, C, D, E, F, 10 sha224256._.round_1_16 G, H, A, B, C, D, E, F, 10
crash.sha256.round_1_16 F, G, H, A, B, C, D, E, 11 sha224256._.round_1_16 F, G, H, A, B, C, D, E, 11
crash.sha256.round_1_16 E, F, G, H, A, B, C, D, 12 sha224256._.round_1_16 E, F, G, H, A, B, C, D, 12
crash.sha256.round_1_16 D, E, F, G, H, A, B, C, 13 sha224256._.round_1_16 D, E, F, G, H, A, B, C, 13
crash.sha256.round_1_16 C, D, E, F, G, H, A, B, 14 sha224256._.round_1_16 C, D, E, F, G, H, A, B, 14
crash.sha256.round_1_16 B, C, D, E, F, G, H, A, 15 sha224256._.round_1_16 B, C, D, E, F, G, H, A, 15
repeat 3 repeat 3
crash.sha256.round_17_64 A, B, C, D, E, F, G, H, 0, % sha224256._.round_17_64 A, B, C, D, E, F, G, H, 0, %
crash.sha256.round_17_64 H, A, B, C, D, E, F, G, 1, % sha224256._.round_17_64 H, A, B, C, D, E, F, G, 1, %
crash.sha256.round_17_64 G, H, A, B, C, D, E, F, 2, % sha224256._.round_17_64 G, H, A, B, C, D, E, F, 2, %
crash.sha256.round_17_64 F, G, H, A, B, C, D, E, 3, % sha224256._.round_17_64 F, G, H, A, B, C, D, E, 3, %
crash.sha256.round_17_64 E, F, G, H, A, B, C, D, 4, % sha224256._.round_17_64 E, F, G, H, A, B, C, D, 4, %
crash.sha256.round_17_64 D, E, F, G, H, A, B, C, 5, % sha224256._.round_17_64 D, E, F, G, H, A, B, C, 5, %
crash.sha256.round_17_64 C, D, E, F, G, H, A, B, 6, % sha224256._.round_17_64 C, D, E, F, G, H, A, B, 6, %
crash.sha256.round_17_64 B, C, D, E, F, G, H, A, 7, % sha224256._.round_17_64 B, C, D, E, F, G, H, A, 7, %
crash.sha256.round_17_64 A, B, C, D, E, F, G, H, 8, % sha224256._.round_17_64 A, B, C, D, E, F, G, H, 8, %
crash.sha256.round_17_64 H, A, B, C, D, E, F, G, 9, % sha224256._.round_17_64 H, A, B, C, D, E, F, G, 9, %
crash.sha256.round_17_64 G, H, A, B, C, D, E, F, 10, % sha224256._.round_17_64 G, H, A, B, C, D, E, F, 10, %
crash.sha256.round_17_64 F, G, H, A, B, C, D, E, 11, % sha224256._.round_17_64 F, G, H, A, B, C, D, E, 11, %
crash.sha256.round_17_64 E, F, G, H, A, B, C, D, 12, % sha224256._.round_17_64 E, F, G, H, A, B, C, D, 12, %
crash.sha256.round_17_64 D, E, F, G, H, A, B, C, 13, % sha224256._.round_17_64 D, E, F, G, H, A, B, C, 13, %
crash.sha256.round_17_64 C, D, E, F, G, H, A, B, 14, % sha224256._.round_17_64 C, D, E, F, G, H, A, B, 14, %
crash.sha256.round_17_64 B, C, D, E, F, G, H, A, 15, % sha224256._.round_17_64 B, C, D, E, F, G, H, A, 15, %
end repeat end repeat
mov edi, [_sha256] mov edi, [_hash]
mov eax, [A] mov eax, [A]
add [edi + 0x00], eax add [edi + 0x00], eax
mov eax, [B] mov eax, [B]
@ -220,8 +265,150 @@ end repeat
add [edi + 0x18], eax add [edi + 0x18], eax
mov eax, [H] mov eax, [H]
add [edi + 0x1c], eax add [edi + 0x1c], eax
add esi, 64
ret ret
endp endp
proc sha224256.update _ctx, _msg, _size
mov ebx, [_ctx]
mov ecx, [_size]
add [ebx + ctx_sha224256.msglen_0], ecx
adc [ebx + ctx_sha224256.msglen_1], 0
.next_block:
mov ebx, [_ctx]
mov esi, [_msg]
mov eax, [ebx + ctx_sha224256.index]
and eax, SHA224256_BLOCK_SIZE-1
jnz .copy_to_buf
test esi, SHA224256_ALIGN_MASK
jnz .copy_to_buf
.no_copy:
; data is aligned, hash it in place without copying
mov ebx, [_ctx]
cmp [_size], SHA224256_BLOCK_SIZE
jb .copy_quit
lea eax, [ebx + ctx_sha224256.hash]
stdcall sha224256._.block, eax
sub [_size], SHA224256_BLOCK_SIZE
add esi, SHA224256_BLOCK_SIZE ; FIXME
jmp .no_copy
.copy_to_buf:
lea edi, [ebx + ctx_sha224256.block]
add edi, eax
mov ecx, SHA224256_BLOCK_SIZE
sub ecx, eax
cmp [_size], ecx
jb .copy_quit
sub [_size], ecx
add [_msg], ecx
add [ebx + ctx_sha224256.index], ecx
rep movsb
lea eax, [ebx + ctx_sha224256.hash]
lea esi, [ebx + ctx_sha224256.block]
stdcall sha224256._.block, eax
jmp .next_block
.copy_quit:
mov ebx, [_ctx]
lea edi, [ebx + ctx_sha224256.block]
mov eax, [ebx + ctx_sha224256.index]
and eax, SHA224256_BLOCK_SIZE-1
add edi, eax
mov ecx, [_size]
add [ebx + ctx_sha224256.index], ecx
rep movsb
.quit:
ret
endp
proc sha224256.final _ctx
mov ebx, [_ctx]
lea edi, [ebx + ctx_sha224256.block]
mov ecx, [ebx + ctx_sha224256.msglen_0]
and ecx, SHA224256_BLOCK_SIZE-1
add edi, ecx
mov byte[edi], 0x80
inc edi
neg ecx
add ecx, SHA224256_BLOCK_SIZE
cmp ecx, 8
ja .last
dec ecx
xor eax, eax
rep stosb
lea esi, [ebx + ctx_sha224256.block]
lea eax, [ebx + ctx_sha224256.hash]
stdcall sha224256._.block, eax
mov ebx, [_ctx]
lea edi, [ebx + ctx_sha224256.block]
mov ecx, SHA224256_BLOCK_SIZE+1
.last:
dec ecx
sub ecx, 8
xor eax, eax
rep stosb
mov eax, [ebx + ctx_sha224256.msglen_0]
mov edx, [ebx + ctx_sha224256.msglen_1]
shld edx, eax, 3
shl eax, 3
bswap eax
bswap edx
mov dword[edi], edx
mov dword[edi+4], eax
lea esi, [ebx + ctx_sha224256.block]
lea eax, [ebx + ctx_sha224256.hash]
stdcall sha224256._.block, eax
mov ebx, [_ctx]
lea eax, [ebx + ctx_sha224256.hash]
stdcall sha224256._.postprocess, ebx, eax
ret
endp
proc sha224256._.postprocess _ctx, _hash
mov ecx, 8
mov esi, [_hash]
mov edi, esi
@@:
lodsd
bswap eax
stosd
dec ecx
jnz @b
ret
endp
align SHA224256_ALIGN
sha224._.hash_init dd 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939,\
0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4
sha256._.hash_init dd 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,\
0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19
sha256_table dd 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,\
0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\
0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,\
0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\
0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,\
0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,\
0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\
0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,\
0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\
0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,\
0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,\
0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,\
0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2

View File

@ -1,6 +1,6 @@
; libcrash -- cryptographic hash functions ; libcrash -- cryptographic hash functions
; ;
; Copyright (C) 2013 Ivan Baravy (dunkaist) ; Copyright (C) 2013,2016 Ivan Baravy (dunkaist)
; ;
; This program is free software: you can redistribute it and/or modify ; This program is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by ; it under the terms of the GNU General Public License as published by
@ -15,7 +15,39 @@
; You should have received a copy of the GNU General Public License ; You should have received a copy of the GNU General Public License
; along with this program. If not, see <http://www.gnu.org/licenses/>. ; along with this program. If not, see <http://www.gnu.org/licenses/>.
macro keccak_rol_xor nd, ncl, ncr
SHA3224_BLOCK_SIZE = 144
SHA3256_BLOCK_SIZE = 136
SHA3384_BLOCK_SIZE = 104
SHA3512_BLOCK_SIZE = 72
SHA3MAX_BLOCK_SIZE = SHA3224_BLOCK_SIZE
SHA3_INIT_SIZE = 200
SHA3224_HASH_SIZE = 28
SHA3256_HASH_SIZE = 32
SHA3384_HASH_SIZE = 48
SHA3512_HASH_SIZE = 64
SHA3_ALIGN = 16
SHA3_ALIGN_MASK = SHA3_ALIGN-1
struct ctx_sha3
hash rb SHA3_INIT_SIZE
rb SHA3_ALIGN - (SHA3_INIT_SIZE mod SHA3_ALIGN)
block rb SHA3MAX_BLOCK_SIZE
rb SHA3_ALIGN - (SHA3MAX_BLOCK_SIZE mod SHA3_ALIGN)
index rd 1
block_size rd 1
rounds_cnt rd 1
rd 1 ; align
; tmp vars
C rq 5
D rq 5
ends
macro sha3._.rol_xor nd, ncl, ncr
{ {
movq mm0, [C + 8*(ncl)] movq mm0, [C + 8*(ncl)]
movq mm1, mm0 movq mm1, mm0
@ -26,11 +58,13 @@ macro keccak_rol_xor nd, ncl, ncr
movq [D + 8*(nd)], mm0 movq [D + 8*(nd)], mm0
} }
proc keccak_theta proc sha3._.theta
locals ;locals
C rq 5 ; C rq 5
D rq 5 ; D rq 5
endl ;endl
C equ ebx + ctx_sha3.C
D equ ebx + ctx_sha3.D
repeat 5 repeat 5
movq mm0, [edi + 8*(%-1 + 0)] movq mm0, [edi + 8*(%-1 + 0)]
@ -41,11 +75,11 @@ repeat 5
movq [C + 8*(%-1)], mm0 movq [C + 8*(%-1)], mm0
end repeat end repeat
keccak_rol_xor 0, 1, 4 sha3._.rol_xor 0, 1, 4
keccak_rol_xor 1, 2, 0 sha3._.rol_xor 1, 2, 0
keccak_rol_xor 2, 3, 1 sha3._.rol_xor 2, 3, 1
keccak_rol_xor 3, 4, 2 sha3._.rol_xor 3, 4, 2
keccak_rol_xor 4, 0, 3 sha3._.rol_xor 4, 0, 3
repeat 5 repeat 5
movq mm1, [D + 8*(%-1)] movq mm1, [D + 8*(%-1)]
@ -66,11 +100,12 @@ repeat 5
movq [edi + 8*(%-1 + 20)], mm0 movq [edi + 8*(%-1 + 20)], mm0
end repeat end repeat
restore C,D
ret ret
endp endp
proc keccak_pi proc sha3._.pi
movq mm1, [edi + 8*1] movq mm1, [edi + 8*1]
movq mm0, [edi + 8*6] movq mm0, [edi + 8*6]
movq [edi + 8*1], mm0 movq [edi + 8*1], mm0
@ -124,7 +159,7 @@ proc keccak_pi
endp endp
proc keccak_chi proc sha3._.chi
mov eax, 0xffffffff mov eax, 0xffffffff
movd mm0, eax movd mm0, eax
@ -174,7 +209,7 @@ end repeat
endp endp
macro keccak_rol_mov n, c macro sha3._.rol_mov n, c
{ {
movq mm0, [edi + 8*(n)] movq mm0, [edi + 8*(n)]
movq mm1, mm0 movq mm1, mm0
@ -184,41 +219,41 @@ macro keccak_rol_mov n, c
movq [edi + 8*(n)], mm0 movq [edi + 8*(n)], mm0
} }
proc keccak_permutation proc sha3._.permutation
repeat 24 repeat 24
stdcall keccak_theta stdcall sha3._.theta
keccak_rol_mov 1, 1 sha3._.rol_mov 1, 1
keccak_rol_mov 2, 62 sha3._.rol_mov 2, 62
keccak_rol_mov 3, 28 sha3._.rol_mov 3, 28
keccak_rol_mov 4, 27 sha3._.rol_mov 4, 27
keccak_rol_mov 5, 36 sha3._.rol_mov 5, 36
keccak_rol_mov 6, 44 sha3._.rol_mov 6, 44
keccak_rol_mov 7, 6 sha3._.rol_mov 7, 6
keccak_rol_mov 8, 55 sha3._.rol_mov 8, 55
keccak_rol_mov 9, 20 sha3._.rol_mov 9, 20
keccak_rol_mov 10, 3 sha3._.rol_mov 10, 3
keccak_rol_mov 11, 10 sha3._.rol_mov 11, 10
keccak_rol_mov 12, 43 sha3._.rol_mov 12, 43
keccak_rol_mov 13, 25 sha3._.rol_mov 13, 25
keccak_rol_mov 14, 39 sha3._.rol_mov 14, 39
keccak_rol_mov 15, 41 sha3._.rol_mov 15, 41
keccak_rol_mov 16, 45 sha3._.rol_mov 16, 45
keccak_rol_mov 17, 15 sha3._.rol_mov 17, 15
keccak_rol_mov 18, 21 sha3._.rol_mov 18, 21
keccak_rol_mov 19, 8 sha3._.rol_mov 19, 8
keccak_rol_mov 20, 18 sha3._.rol_mov 20, 18
keccak_rol_mov 21, 2 sha3._.rol_mov 21, 2
keccak_rol_mov 22, 61 sha3._.rol_mov 22, 61
keccak_rol_mov 23, 56 sha3._.rol_mov 23, 56
keccak_rol_mov 24, 14 sha3._.rol_mov 24, 14
stdcall keccak_pi stdcall sha3._.pi
stdcall keccak_chi stdcall sha3._.chi
movq mm0, [edi + 8*(0)] movq mm0, [edi + 8*(0)]
pxor mm0, [crash._.sha3_round + 8*(%-1)] pxor mm0, [sha3._.round + 8*(%-1)]
movq [edi + 8*(0)], mm0 movq [edi + 8*(0)], mm0
end repeat end repeat
@ -226,66 +261,180 @@ end repeat
endp endp
proc crash.sha3_224 _hash, _data proc sha3._.init _ctx
mov edi, [_hash] mov [ebx + ctx_sha3.block_size], eax
shr eax, 3
repeat 18 dec eax
movq mm0, [esi + 8*(%-1)] mov [ebx + ctx_sha3.rounds_cnt], eax
pxor mm0, [edi + 8*(%-1)] xor eax, eax
movq [edi + 8*(%-1)], mm0 lea edi, [ebx + ctx_sha3.hash]
end repeat mov ecx, SHA3_INIT_SIZE/4
rep stosd
stdcall keccak_permutation mov [ebx + ctx_sha3.index], eax
add esi, 144
ret ret
endp endp
proc crash.sha3_256 _hash, _data proc sha3224.init _ctx
mov edi, [_hash] mov ebx, [_ctx]
mov eax, SHA3224_BLOCK_SIZE
repeat 17 stdcall sha3._.init
movq mm0, [esi + 8*(%-1)]
pxor mm0, [edi + 8*(%-1)]
movq [edi + 8*(%-1)], mm0
end repeat
stdcall keccak_permutation
add esi, 136
ret ret
endp endp
proc crash.sha3_384 _hash, _data proc sha3256.init _ctx
mov edi, [_hash] mov ebx, [_ctx]
mov eax, SHA3256_BLOCK_SIZE
repeat 13 stdcall sha3._.init
movq mm0, [esi + 8*(%-1)]
pxor mm0, [edi + 8*(%-1)]
movq [edi + 8*(%-1)], mm0
end repeat
stdcall keccak_permutation
add esi, 104
ret ret
endp endp
proc crash.sha3_512 _hash, _data proc sha3384.init _ctx
mov edi, [_hash] mov ebx, [_ctx]
mov eax, SHA3384_BLOCK_SIZE
repeat 9 stdcall sha3._.init
movq mm0, [esi + 8*(%-1)]
pxor mm0, [edi + 8*(%-1)]
movq [edi + 8*(%-1)], mm0
end repeat
stdcall keccak_permutation
add esi, 72
ret ret
endp endp
proc sha3512.init _ctx
mov ebx, [_ctx]
mov eax, SHA3512_BLOCK_SIZE
stdcall sha3._.init
ret
endp
proc sha3._.block _hash
mov ecx, [ebx + ctx_sha3.rounds_cnt]
mov edi, [_hash]
@@:
movq mm0, [esi + 8*ecx]
pxor mm0, [edi + 8*ecx]
movq [edi + 8*ecx], mm0
dec ecx
jns @b
stdcall sha3._.permutation
ret
endp
proc sha3.update _ctx, _msg, _size
.next_block:
mov ebx, [_ctx]
mov esi, [_msg]
mov eax, [ebx + ctx_sha3.index]
test eax, eax
jnz .copy_to_buf
test esi, SHA3_ALIGN_MASK
jnz .copy_to_buf
.no_copy:
; data is aligned, hash it in place without copying
mov ebx, [_ctx]
mov eax, [ebx + ctx_sha3.block_size]
cmp [_size], eax
jb .copy_quit
lea eax, [ebx + ctx_sha3.hash]
push ebx esi
stdcall sha3._.block, eax
pop esi ebx
mov eax, [ebx + ctx_sha3.block_size]
sub [_size], eax
add esi, [ebx + ctx_sha3.block_size]
jmp .no_copy
.copy_to_buf:
lea edi, [ebx + ctx_sha3.block]
add edi, eax
mov ecx, [ebx + ctx_sha3.block_size]
sub ecx, eax
cmp [_size], ecx
jb .copy_quit
sub [_size], ecx
add [_msg], ecx
add [ebx + ctx_sha3.index], ecx
mov eax, [ebx + ctx_sha3.block_size]
cmp [ebx + ctx_sha3.index], eax
jb @f
sub [ebx + ctx_sha3.index], eax
@@:
rep movsb
lea eax, [ebx + ctx_sha3.hash]
lea esi, [ebx + ctx_sha3.block]
stdcall sha3._.block, eax
jmp .next_block
.copy_quit:
mov ebx, [_ctx]
lea edi, [ebx + ctx_sha3.block]
mov eax, [ebx + ctx_sha3.index]
add edi, eax
mov ecx, [_size]
add [ebx + ctx_sha3.index], ecx
rep movsb
.quit:
ret
endp
proc sha3.final _ctx
pushad
mov ebx, [_ctx]
mov eax, [ebx + ctx_sha3.index]
xor edx, edx
mov ecx, [ebx + ctx_sha3.block_size]
div ecx
sub ecx, edx
ja @f
add ecx, [ebx + ctx_sha3.block_size]
@@:
add [ebx + ctx_sha3.index], ecx
mov eax, [ebx + ctx_sha3.block_size]
cmp [ebx + ctx_sha3.index], eax
jb @f
sub [ebx + ctx_sha3.index], eax
@@:
mov byte[edi], 0x06
inc edi
dec ecx
xor eax, eax
rep stosb
or byte[edi - 1], 0x80
mov ebx, [_ctx]
lea esi, [ebx + ctx_sha3.block]
lea eax, [ebx + ctx_sha3.hash]
stdcall sha3._.block, eax
mov ebx, [_ctx]
lea eax, [ebx + ctx_sha3.hash]
stdcall sha3._.postprocess, ebx, eax
popad
ret
endp
proc sha3._.postprocess _ctx, _hash
emms
ret
endp
align SHA3_ALIGN
sha3._.round dq 0x0000000000000001, 0x0000000000008082, 0x800000000000808A,\
0x8000000080008000, 0x000000000000808B, 0x0000000080000001,\
0x8000000080008081, 0x8000000000008009, 0x000000000000008A,\
0x0000000000000088, 0x0000000080008009, 0x000000008000000A,\
0x000000008000808B, 0x800000000000008B, 0x8000000000008089,\
0x8000000000008003, 0x8000000000008002, 0x8000000000000080,\
0x000000000000800A, 0x800000008000000A, 0x8000000080008081,\
0x8000000000008080, 0x0000000080000001, 0x8000000080008008

View File

@ -1,6 +1,6 @@
; libcrash -- cryptographic hash functions ; libcrash -- cryptographic hash functions
; ;
; Copyright (C) 2012-2013 Ivan Baravy (dunkaist) ; Copyright (C) 2012-2013,2016 Ivan Baravy (dunkaist)
; ;
; This program is free software: you can redistribute it and/or modify ; This program is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by ; it under the terms of the GNU General Public License as published by
@ -15,7 +15,40 @@
; You should have received a copy of the GNU General Public License ; You should have received a copy of the GNU General Public License
; along with this program. If not, see <http://www.gnu.org/licenses/>. ; along with this program. If not, see <http://www.gnu.org/licenses/>.
macro chn x, y, z
SHA384512_BLOCK_SIZE = 128
SHA384512_INIT_SIZE = 64
SHA384_HASH_SIZE = 48
SHA512_HASH_SIZE = 64
SHA384512_ALIGN = 16
SHA384512_ALIGN_MASK = SHA384512_ALIGN - 1
struct ctx_sha384512
hash rb SHA384512_INIT_SIZE
block rb SHA384512_BLOCK_SIZE
index rd 1
msglen_0 rd 1
msglen_1 rd 1
msglen_2 rd 1
msglen_3 rd 1
rd 3 ; align
; tmp vars
w rq 80
A rq 1
B rq 1
C rq 1
D rq 1
E rq 1
F rq 1
G rq 1
H rq 1
temp rq 1
ends
macro sha384512._.chn x, y, z
{ {
movq mm0, [y] movq mm0, [y]
pxor mm0, [z] pxor mm0, [z]
@ -23,7 +56,7 @@ macro chn x, y, z
pxor mm0, [z] pxor mm0, [z]
} }
macro maj x, y, z macro sha384512._.maj x, y, z
{ {
movq mm0, [x] movq mm0, [x]
pxor mm0, [y] pxor mm0, [y]
@ -33,7 +66,7 @@ macro maj x, y, z
pxor mm0, mm2 pxor mm0, mm2
} }
macro Sigma0 x macro sha384512._.Sigma0 x
{ {
movq mm0, x movq mm0, x
movq mm2, mm0 movq mm2, mm0
@ -54,7 +87,7 @@ macro Sigma0 x
pxor mm0, mm2 pxor mm0, mm2
} }
macro Sigma1 x macro sha384512._.Sigma1 x
{ {
movq mm0, x movq mm0, x
movq mm2, mm0 movq mm2, mm0
@ -75,7 +108,7 @@ macro Sigma1 x
pxor mm0, mm2 pxor mm0, mm2
} }
macro sigma0 x macro sha384512._.sigma0 x
{ {
movq mm0, x movq mm0, x
movq mm2, mm0 movq mm2, mm0
@ -93,7 +126,7 @@ macro sigma0 x
pxor mm0, mm2 pxor mm0, mm2
} }
macro sigma1 x macro sha384512._.sigma1 x
{ {
movq mm0, x movq mm0, x
movq mm2, mm0 movq mm2, mm0
@ -111,14 +144,14 @@ macro sigma1 x
pxor mm0, mm2 pxor mm0, mm2
} }
macro recalculate_w n macro sha384512._.recalculate_w n
{ {
movq mm3, [w + ((n-2) and 15)*8] movq mm3, [w + ((n-2) and 15)*8]
sigma1 mm3 sha384512._.sigma1 mm3
paddq mm0, [w + ((n-7) and 15)*8] paddq mm0, [w + ((n-7) and 15)*8]
movq mm6, mm0 movq mm6, mm0
movq mm3, [w + ((n-15) and 15)*8] movq mm3, [w + ((n-15) and 15)*8]
sigma0 mm3 sha384512._.sigma0 mm3
movq mm2, mm6 movq mm2, mm6
paddq mm0, mm2 paddq mm0, mm2
movq mm7, [w + (n)*8] movq mm7, [w + (n)*8]
@ -126,13 +159,13 @@ macro recalculate_w n
movq [w + (n)*8], mm7 movq [w + (n)*8], mm7
} }
macro crash.sha512.round a, b, c, d, e, f, g, h, k macro sha384512._.round a, b, c, d, e, f, g, h, k
{ {
movq mm1, [h] movq mm1, [h]
movq mm3, [e] movq mm3, [e]
Sigma1 mm3 sha384512._.Sigma1 mm3
paddq mm1, mm0 paddq mm1, mm0
chn e, f, g sha384512._.chn e, f, g
paddq mm1, mm0 paddq mm1, mm0
paddq mm1, [k] paddq mm1, [k]
paddq mm1, mm5 paddq mm1, mm5
@ -140,15 +173,15 @@ macro crash.sha512.round a, b, c, d, e, f, g, h, k
paddq mm7, mm1 paddq mm7, mm1
movq [d], mm7 movq [d], mm7
movq mm3, [a] movq mm3, [a]
Sigma0 mm3 sha384512._.Sigma0 mm3
paddq mm1, mm0 paddq mm1, mm0
maj a, b, c sha384512._.maj a, b, c
paddq mm0, mm1 paddq mm0, mm1
movq [h], mm0 movq [h], mm0
} }
macro crash.sha512.round_1_16 a, b, c, d, e, f, g, h, n macro sha384512._.round_1_16 a, b, c, d, e, f, g, h, n
{ {
movq mm0, [esi + (n)*8] movq mm0, [esi + (n)*8]
@ -164,31 +197,74 @@ macro crash.sha512.round_1_16 a, b, c, d, e, f, g, h, n
movq mm0, [temp] movq mm0, [temp]
movq [w + (n)*8], mm0 movq [w + (n)*8], mm0
movq mm5, mm0 movq mm5, mm0
crash.sha512.round a, b, c, d, e, f, g, h, (crash._.sha512_table + (n)*8) sha384512._.round a, b, c, d, e, f, g, h, (sha384512._.table + (n)*8)
} }
macro crash.sha512.round_17_64 a, b, c, d, e, f, g, h, n, rep_num macro sha384512._.round_17_64 a, b, c, d, e, f, g, h, n, rep_num
{ {
recalculate_w n sha384512._.recalculate_w n
movq mm5, [w + (n)*8] movq mm5, [w + (n)*8]
crash.sha512.round a, b, c, d, e, f, g, h, (crash._.sha512_table + (n+16*rep_num)*8) sha384512._.round a, b, c, d, e, f, g, h, (sha384512._.table + (n+16*rep_num)*8)
} }
proc crash.sha512 _sha512, _data proc sha384.init _ctx
locals mov ebx, [_ctx]
w rq 80 lea edi, [ebx + ctx_sha384512.hash]
A rq 1 mov esi, sha384._.hash_init
B rq 1 mov ecx, SHA384512_INIT_SIZE/4
C rq 1 rep movsd
D rq 1 xor eax, eax
E rq 1 mov [ebx + ctx_sha384512.index], eax
F rq 1 mov [ebx + ctx_sha384512.msglen_0], eax
G rq 1 mov [ebx + ctx_sha384512.msglen_1], eax
H rq 1 mov [ebx + ctx_sha384512.msglen_2], eax
temp rq 1 mov [ebx + ctx_sha384512.msglen_3], eax
endl ret
mov edi, [_sha512] endp
proc sha512.init _ctx
mov ebx, [_ctx]
lea edi, [ebx + ctx_sha384512.hash]
mov esi, sha512._.hash_init
mov ecx, SHA384512_INIT_SIZE/4
rep movsd
xor eax, eax
mov [ebx + ctx_sha384512.index], eax
mov [ebx + ctx_sha384512.msglen_0], eax
mov [ebx + ctx_sha384512.msglen_1], eax
mov [ebx + ctx_sha384512.msglen_2], eax
mov [ebx + ctx_sha384512.msglen_3], eax
ret
endp
proc sha384512._.block _hash
;locals
; w rq 80
; A rq 1
; B rq 1
; C rq 1
; D rq 1
; E rq 1
; F rq 1
; G rq 1
; H rq 1
; temp rq 1
;endl
w equ ebx + ctx_sha384512.w
A equ ebx + ctx_sha384512.A
B equ ebx + ctx_sha384512.B
C equ ebx + ctx_sha384512.C
D equ ebx + ctx_sha384512.D
E equ ebx + ctx_sha384512.E
F equ ebx + ctx_sha384512.F
G equ ebx + ctx_sha384512.G
H equ ebx + ctx_sha384512.H
temp equ ebx + ctx_sha384512.temp
mov edi, [_hash]
movq mm0, [edi + 0x00] movq mm0, [edi + 0x00]
movq [A], mm0 movq [A], mm0
movq mm0, [edi + 0x08] movq mm0, [edi + 0x08]
@ -207,44 +283,44 @@ endl
movq [H], mm0 movq [H], mm0
crash.sha512.round_1_16 A, B, C, D, E, F, G, H, 0 sha384512._.round_1_16 A, B, C, D, E, F, G, H, 0
crash.sha512.round_1_16 H, A, B, C, D, E, F, G, 1 sha384512._.round_1_16 H, A, B, C, D, E, F, G, 1
crash.sha512.round_1_16 G, H, A, B, C, D, E, F, 2 sha384512._.round_1_16 G, H, A, B, C, D, E, F, 2
crash.sha512.round_1_16 F, G, H, A, B, C, D, E, 3 sha384512._.round_1_16 F, G, H, A, B, C, D, E, 3
crash.sha512.round_1_16 E, F, G, H, A, B, C, D, 4 sha384512._.round_1_16 E, F, G, H, A, B, C, D, 4
crash.sha512.round_1_16 D, E, F, G, H, A, B, C, 5 sha384512._.round_1_16 D, E, F, G, H, A, B, C, 5
crash.sha512.round_1_16 C, D, E, F, G, H, A, B, 6 sha384512._.round_1_16 C, D, E, F, G, H, A, B, 6
crash.sha512.round_1_16 B, C, D, E, F, G, H, A, 7 sha384512._.round_1_16 B, C, D, E, F, G, H, A, 7
crash.sha512.round_1_16 A, B, C, D, E, F, G, H, 8 sha384512._.round_1_16 A, B, C, D, E, F, G, H, 8
crash.sha512.round_1_16 H, A, B, C, D, E, F, G, 9 sha384512._.round_1_16 H, A, B, C, D, E, F, G, 9
crash.sha512.round_1_16 G, H, A, B, C, D, E, F, 10 sha384512._.round_1_16 G, H, A, B, C, D, E, F, 10
crash.sha512.round_1_16 F, G, H, A, B, C, D, E, 11 sha384512._.round_1_16 F, G, H, A, B, C, D, E, 11
crash.sha512.round_1_16 E, F, G, H, A, B, C, D, 12 sha384512._.round_1_16 E, F, G, H, A, B, C, D, 12
crash.sha512.round_1_16 D, E, F, G, H, A, B, C, 13 sha384512._.round_1_16 D, E, F, G, H, A, B, C, 13
crash.sha512.round_1_16 C, D, E, F, G, H, A, B, 14 sha384512._.round_1_16 C, D, E, F, G, H, A, B, 14
crash.sha512.round_1_16 B, C, D, E, F, G, H, A, 15 sha384512._.round_1_16 B, C, D, E, F, G, H, A, 15
repeat 4 repeat 4
crash.sha512.round_17_64 A, B, C, D, E, F, G, H, 0, % sha384512._.round_17_64 A, B, C, D, E, F, G, H, 0, %
crash.sha512.round_17_64 H, A, B, C, D, E, F, G, 1, % sha384512._.round_17_64 H, A, B, C, D, E, F, G, 1, %
crash.sha512.round_17_64 G, H, A, B, C, D, E, F, 2, % sha384512._.round_17_64 G, H, A, B, C, D, E, F, 2, %
crash.sha512.round_17_64 F, G, H, A, B, C, D, E, 3, % sha384512._.round_17_64 F, G, H, A, B, C, D, E, 3, %
crash.sha512.round_17_64 E, F, G, H, A, B, C, D, 4, % sha384512._.round_17_64 E, F, G, H, A, B, C, D, 4, %
crash.sha512.round_17_64 D, E, F, G, H, A, B, C, 5, % sha384512._.round_17_64 D, E, F, G, H, A, B, C, 5, %
crash.sha512.round_17_64 C, D, E, F, G, H, A, B, 6, % sha384512._.round_17_64 C, D, E, F, G, H, A, B, 6, %
crash.sha512.round_17_64 B, C, D, E, F, G, H, A, 7, % sha384512._.round_17_64 B, C, D, E, F, G, H, A, 7, %
crash.sha512.round_17_64 A, B, C, D, E, F, G, H, 8, % sha384512._.round_17_64 A, B, C, D, E, F, G, H, 8, %
crash.sha512.round_17_64 H, A, B, C, D, E, F, G, 9, % sha384512._.round_17_64 H, A, B, C, D, E, F, G, 9, %
crash.sha512.round_17_64 G, H, A, B, C, D, E, F, 10, % sha384512._.round_17_64 G, H, A, B, C, D, E, F, 10, %
crash.sha512.round_17_64 F, G, H, A, B, C, D, E, 11, % sha384512._.round_17_64 F, G, H, A, B, C, D, E, 11, %
crash.sha512.round_17_64 E, F, G, H, A, B, C, D, 12, % sha384512._.round_17_64 E, F, G, H, A, B, C, D, 12, %
crash.sha512.round_17_64 D, E, F, G, H, A, B, C, 13, % sha384512._.round_17_64 D, E, F, G, H, A, B, C, 13, %
crash.sha512.round_17_64 C, D, E, F, G, H, A, B, 14, % sha384512._.round_17_64 C, D, E, F, G, H, A, B, 14, %
crash.sha512.round_17_64 B, C, D, E, F, G, H, A, 15, % sha384512._.round_17_64 B, C, D, E, F, G, H, A, 15, %
end repeat end repeat
mov edi, [_sha512] mov edi, [_hash]
movq mm0, [A] movq mm0, [A]
paddq mm0, [edi + 0x00] paddq mm0, [edi + 0x00]
movq [edi + 0x00], mm0 movq [edi + 0x00], mm0
@ -269,8 +345,198 @@ end repeat
movq mm0, [H] movq mm0, [H]
paddq mm0, [edi + 0x38] paddq mm0, [edi + 0x38]
movq [edi + 0x38], mm0 movq [edi + 0x38], mm0
add esi, 128
ret
restore w,A,B,C,D,E,F,G,H,temp
endp
proc sha384512.update _ctx, _msg, _size
mov ebx, [_ctx]
mov ecx, [_size]
add [ebx + ctx_sha384512.msglen_0], ecx
adc [ebx + ctx_sha384512.msglen_1], 0
adc [ebx + ctx_sha384512.msglen_2], 0
adc [ebx + ctx_sha384512.msglen_3], 0
.next_block:
mov ebx, [_ctx]
mov esi, [_msg]
mov eax, [ebx + ctx_sha384512.index]
and eax, SHA384512_BLOCK_SIZE-1
jnz .copy_to_buf
test esi, SHA384512_ALIGN_MASK
jnz .copy_to_buf
.no_copy:
; data is aligned, hash it in place without copying
mov ebx, [_ctx]
cmp [_size], SHA384512_BLOCK_SIZE
jb .copy_quit
lea eax, [ebx + ctx_sha384512.hash]
stdcall sha384512._.block, eax
sub [_size], SHA384512_BLOCK_SIZE
add esi, SHA384512_BLOCK_SIZE ; FIXME
jmp .no_copy
.copy_to_buf:
lea edi, [ebx + ctx_sha384512.block]
add edi, eax
mov ecx, SHA384512_BLOCK_SIZE
sub ecx, eax
cmp [_size], ecx
jb .copy_quit
sub [_size], ecx
add [_msg], ecx
add [ebx + ctx_sha384512.index], ecx
rep movsb
lea eax, [ebx + ctx_sha384512.hash]
lea esi, [ebx + ctx_sha384512.block]
stdcall sha384512._.block, eax
jmp .next_block
.copy_quit:
mov ebx, [_ctx]
lea edi, [ebx + ctx_sha384512.block]
mov eax, [ebx + ctx_sha384512.index]
and eax, SHA384512_BLOCK_SIZE-1
add edi, eax
mov ecx, [_size]
add [ebx + ctx_sha384512.index], ecx
rep movsb
.quit:
ret ret
endp endp
proc sha384512.final _ctx
mov ebx, [_ctx]
lea edi, [ebx + ctx_sha384512.block]
mov ecx, [ebx + ctx_sha384512.msglen_0]
and ecx, SHA384512_BLOCK_SIZE-1
add edi, ecx
mov byte[edi], 0x80
inc edi
neg ecx
add ecx, SHA384512_BLOCK_SIZE
cmp ecx, 16
ja .last
dec ecx
xor eax, eax
rep stosb
lea esi, [ebx + ctx_sha384512.block]
lea eax, [ebx + ctx_sha384512.hash]
stdcall sha384512._.block, eax
mov ebx, [_ctx]
lea edi, [ebx + ctx_sha384512.block]
mov ecx, SHA384512_BLOCK_SIZE+1
.last:
dec ecx
sub ecx, 16
xor eax, eax
rep stosb
mov eax, [ebx + ctx_sha384512.msglen_1]
shld [ebx + ctx_sha384512.msglen_0], eax, 3
mov eax, [ebx + ctx_sha384512.msglen_2]
shld [ebx + ctx_sha384512.msglen_1], eax, 3
mov eax, [ebx + ctx_sha384512.msglen_3]
shld [ebx + ctx_sha384512.msglen_2], eax, 3
shl eax, 3
bswap eax
mov dword[edi + 0], eax
mov eax, [ebx + ctx_sha384512.msglen_2]
bswap eax
mov dword[edi + 4], eax
mov eax, [ebx + ctx_sha384512.msglen_1]
bswap eax
mov dword[edi + 8], eax
mov eax, [ebx + ctx_sha384512.msglen_0]
bswap eax
mov dword[edi + 12], eax
mov ebx, [_ctx]
lea esi, [ebx + ctx_sha384512.block]
lea eax, [ebx + ctx_sha384512.hash]
stdcall sha384512._.block, eax
mov ebx, [_ctx]
lea eax, [ebx + ctx_sha384512.hash]
stdcall sha384512._.postprocess, ebx, eax
ret
endp
proc sha384512._.postprocess _ctx, _hash
mov ecx, 8
mov esi, [_hash]
mov edi, esi
@@:
lodsd
mov ebx, eax
lodsd
bswap eax
bswap ebx
stosd
mov eax, ebx
stosd
dec ecx ; FIXME: what should I fix here?
jnz @b
emms
ret
endp
align SHA384512_ALIGN
sha384._.hash_init dq 0xcbbb9d5dc1059ed8, 0x629a292a367cd507,\
0x9159015a3070dd17, 0x152fecd8f70e5939,\
0x67332667ffc00b31, 0x8eb44a8768581511,\
0xdb0c2e0d64f98fa7, 0x47b5481dbefa4fa4
sha512._.hash_init dq 0x6a09e667f3bcc908, 0xbb67ae8584caa73b,\
0x3c6ef372fe94f82b, 0xa54ff53a5f1d36f1,\
0x510e527fade682d1, 0x9b05688c2b3e6c1f,\
0x1f83d9abfb41bd6b, 0x5be0cd19137e2179
sha384512._.table dq 0x428a2f98d728ae22, 0x7137449123ef65cd,\
0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc,\
0x3956c25bf348b538, 0x59f111f1b605d019,\
0x923f82a4af194f9b, 0xab1c5ed5da6d8118,\
0xd807aa98a3030242, 0x12835b0145706fbe,\
0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2,\
0x72be5d74f27b896f, 0x80deb1fe3b1696b1,\
0x9bdc06a725c71235, 0xc19bf174cf692694,\
0xe49b69c19ef14ad2, 0xefbe4786384f25e3,\
0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65,\
0x2de92c6f592b0275, 0x4a7484aa6ea6e483,\
0x5cb0a9dcbd41fbd4, 0x76f988da831153b5,\
0x983e5152ee66dfab, 0xa831c66d2db43210,\
0xb00327c898fb213f, 0xbf597fc7beef0ee4,\
0xc6e00bf33da88fc2, 0xd5a79147930aa725,\
0x06ca6351e003826f, 0x142929670a0e6e70,\
0x27b70a8546d22ffc, 0x2e1b21385c26c926,\
0x4d2c6dfc5ac42aed, 0x53380d139d95b3df,\
0x650a73548baf63de, 0x766a0abb3c77b2a8,\
0x81c2c92e47edaee6, 0x92722c851482353b,\
0xa2bfe8a14cf10364, 0xa81a664bbc423001,\
0xc24b8b70d0f89791, 0xc76c51a30654be30,\
0xd192e819d6ef5218, 0xd69906245565a910,\
0xf40e35855771202a, 0x106aa07032bbd1b8,\
0x19a4c116b8d2d0c8, 0x1e376c085141ab53,\
0x2748774cdf8eeb99, 0x34b0bcb5e19b48a8,\
0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb,\
0x5b9cca4f7763e373, 0x682e6ff3d6b2b8a3,\
0x748f82ee5defb2fc, 0x78a5636f43172f60,\
0x84c87814a1f0ab72, 0x8cc702081a6439ec,\
0x90befffa23631e28, 0xa4506cebde82bde9,\
0xbef9a3f7b2c67915, 0xc67178f2e372532b,\
0xca273eceea26619c, 0xd186b8c721c0c207,\
0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178,\
0x06f067aa72176fba, 0x0a637dc5a2c898a6,\
0x113f9804bef90dae, 0x1b710b35131c471b,\
0x28db77f523047d84, 0x32caab7b40c72493,\
0x3c9ebe0a15c9bebc, 0x431d67c49c100d4c,\
0x4cc5d4becb3e42b6, 0x597f299cfc657e2a,\
0x5fcb6fab3ad6faec, 0x6c44198c4a475817