From f8ff581ce70974b0b04208b0e4b93eedd6e9e9b5 Mon Sep 17 00:00:00 2001 From: Ivan Baravy Date: Fri, 29 Mar 2013 20:13:07 +0000 Subject: [PATCH] libcrash: move common code parts from all the *hash*.asm files to libcrash.asm replace procedures to macroses in sha1 in favour of readability and uniformity add license notes git-svn-id: svn://kolibrios.org@3431 a494cfbc-eb01-0410-851d-a64ba20cac60 --- .../libraries/libcrash/trunk/crashtest.asm | 11 +- .../libraries/libcrash/trunk/crc32.asm | 73 ------ .../libraries/libcrash/trunk/libcrash.asm | 232 ++++++++++++++---- .../libraries/libcrash/trunk/libcrash.inc | 46 +++- .../develop/libraries/libcrash/trunk/md4.asm | 78 ++---- .../develop/libraries/libcrash/trunk/md5.asm | 78 ++---- .../develop/libraries/libcrash/trunk/sha1.asm | 228 ++++------------- .../libraries/libcrash/trunk/sha224_256.asm | 87 ++----- .../libraries/libcrash/trunk/sha384_512.asm | 96 ++------ 9 files changed, 346 insertions(+), 583 deletions(-) delete mode 100644 programs/develop/libraries/libcrash/trunk/crc32.asm diff --git a/programs/develop/libraries/libcrash/trunk/crashtest.asm b/programs/develop/libraries/libcrash/trunk/crashtest.asm index 7b49127b6d..299a684661 100644 --- a/programs/develop/libraries/libcrash/trunk/crashtest.asm +++ b/programs/develop/libraries/libcrash/trunk/crashtest.asm @@ -1,7 +1,7 @@ use32 org 0x0 db 'MENUET01' - dd 0x01,start,i_end,e_end,e_end,0,0 + dd 0x01,start,i_end,e_end,e_end,0,this_file_name include '../../../../proc32.inc' include '../../../../macros.inc' @@ -19,12 +19,12 @@ start: or eax, eax jnz quit - invoke file.open, input_file, O_READ + invoke file.open, this_file_name, O_READ or eax, eax jz quit mov [fh], eax - invoke file.size, input_file + invoke file.size, this_file_name mov [file_len], ebx stdcall mem.Alloc, ebx @@ -101,8 +101,6 @@ sz msg_few_args , '2 arguments required',0x0a sz msg_bad_hash_type , 'invalid hash type',0x0a sz msg_file_not_found , 'file not found: ' -input_file db '/hd0/1/crashtest',0 - f70_buf: funcnum dd 0 src dd 0 @@ -110,7 +108,7 @@ f70_buf: count dd BUFFER_SIZE dst dd data_buffer res2 db 0 - fname dd input_file + fname dd this_file_name align 4 @IMPORT: @@ -142,6 +140,7 @@ data_buffer rb BUFFER_SIZE file_data rd 1 file_len rd 1 +this_file_name rb 4096 rb 0x400 ;stack e_end: diff --git a/programs/develop/libraries/libcrash/trunk/crc32.asm b/programs/develop/libraries/libcrash/trunk/crc32.asm deleted file mode 100644 index 7681ac1d9b..0000000000 --- a/programs/develop/libraries/libcrash/trunk/crc32.asm +++ /dev/null @@ -1,73 +0,0 @@ -proc crash.crc32 _crc, _data, _len, _callback, _msglen - .begin: - mov ecx, [_len] - test ecx, ecx - jz .callback - mov eax, [_crc] - mov eax, [eax] - mov esi, [_data] - .head: - mov ebx, [_data] - and ebx, 3 - jz .body - @@: - dec ecx - js .done - movzx edx, al - xor dl, byte[esi] - add esi, 1 - shr eax, 8 - xor eax, [crash._.crc32_table + edx*4] - dec ebx - jnz @b - .body: - mov ebx, ecx - and ecx, 15 - shr ebx, 4 - test ebx, ebx - jz .tail - @@: -repeat 4 - mov edx, eax - mov eax, [esi] - add esi, 4 - xor eax, edx -repeat 4 - movzx edx, al - shr eax, 8 - xor eax, [crash._.crc32_table + edx*4] -end repeat -end repeat - dec ebx - jnz @b - .tail: - test ecx, ecx - jz .done - @@: - movzx edx, al - xor dl, byte[esi] - add esi, 1 - shr eax, 8 - xor eax, [crash._.crc32_table + edx*4] - dec ecx - jnz @b - .done: - mov ecx, [_crc] - mov [ecx], eax - .callback: - mov eax, [_callback] - test eax, eax - jz @f - call eax - mov [_len], eax - test eax, eax - jnz .begin - @@: - mov ecx, [_crc] - mov eax, [ecx] - xor eax, 0xffffffff - bswap eax - mov [ecx], eax - - ret -endp diff --git a/programs/develop/libraries/libcrash/trunk/libcrash.asm b/programs/develop/libraries/libcrash/trunk/libcrash.asm index b2dea57e63..316427b458 100644 --- a/programs/develop/libraries/libcrash/trunk/libcrash.asm +++ b/programs/develop/libraries/libcrash/trunk/libcrash.asm @@ -1,3 +1,20 @@ +; libcrash -- cryptographic hash functions +; +; Copyright (C) 2012-2013 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 . + format MS COFF public @EXPORT as 'EXPORTS' @@ -11,8 +28,8 @@ include '../../../../config.inc' purge section,mov,add,sub section '.flat' code readable align 16 + include 'libcrash.inc' -include 'crc32.asm' include 'md4.asm' include 'md5.asm' include 'sha1.asm' @@ -21,101 +38,207 @@ include 'sha384_512.asm' proc lib_init - ; generate crc32 table - bts [crash._.init_flags], 0 - jc .crc32_table_done - - mov edi, crash._.crc32_table - xor ecx, ecx - mov edx, 0xedb88320 - .1: - mov ebx, 8 - mov eax, ecx - .2: - shr eax, 1 - jnc @f - xor eax, edx - @@: - dec ebx - jnz .2 - stosd - inc cl - jnz .1 - - .crc32_table_done: ret endp -proc crash.hash _type, _hash, _data, _len, _callback, _msglen +proc crash.hash _hid, _hash, _data, _len, _callback, _msglen locals hash_func rd 1 + final rd 1 + hi rd 1 endl - mov eax, [_type] - mov ecx, eax - and eax, 0x000000ff - sub eax, 1 - mov edx, [crash._.table + eax*8] - mov esi, [crash._.table + eax*8 + 4] + mov eax, [_hid] + imul eax, sizeof.crash_item + lea eax, [crash._.table + eax] + mov [hi], eax + + mov eax, [hi] + mov edx, [eax + crash_item.function] + mov esi, [eax + crash_item.init_val] mov edi, [_hash] mov [hash_func], edx - and ecx, 0x0000ff00 - shr ecx, 8 + mov ecx, [hi] + mov ecx, [ecx + crash_item.len_in] rep movsd - stdcall [hash_func], [_hash], [_data], [_len], [_callback], [_msglen] + mov [final], 0 + .first: + mov eax, [_msglen] + mov ecx, [_len] + add [eax], ecx + mov esi, [_data] + test ecx, ecx + jz .callback + .begin: + mov eax, [hi] + 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: + call [_callback] + test eax, eax + jz @f + mov [_len], eax + jmp .first + @@: + + mov edi, [_data] + mov ecx, [_len] + rep movsb + mov eax, [_msglen] + mov eax, [eax] + mov edx, [hi] + mov edx, [edx + crash_item.len_blk] + sub edx, 1 + and 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, [hi] + 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] + cmp [ecx + crash_item.endianness], LIBCRASH_ENDIAN_BIG + jne @f + bswap eax + bswap edx + xchg eax, edx + @@: + mov dword[edi], eax + mov dword[edi + 4], edx + mov ecx, [hi] + mov eax, [ecx + crash_item.len_size] + add [_len], eax + mov [final], 1 + jmp .first + .quit: + mov eax, [hi] + stdcall [eax + crash_item.postproc], [eax + crash_item.len_out], [_hash] ret endp -proc crash.bin2hex _bin, _hex, _type - xor eax, eax +proc crash._.md4_md5_postprocess _len_out, _hash + ret +endp + + +proc crash._.sha1_224_256_postprocess _len_out, _hash + mov ecx, [_len_out] + mov esi, [_hash] + mov edi, esi + @@: + lodsd + bswap eax + stosd + dec ecx + jnz @b + ret +endp + + +proc crash._.sha384_512_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 + + +proc crash.bin2hex _bin, _hex, _hid ; FIXME _hid param? + mov eax, [_hid] + imul eax, sizeof.crash_item + mov ecx, [crash._.table + eax + crash_item.len_out] mov ebx, crash._.bin2hex_table mov esi, [_bin] mov edi, [_hex] - mov ecx, [_type] - and ecx, 0x00ff0000 - shr ecx, 16 - 2 - .byte: + shl ecx, 2 + .next_byte: + xor eax, eax lodsb - mov ah, al - shr ah, 4 - and al, 0x0f + shl eax, 4 + shr al, 4 xlatb xchg al, ah xlatb stosw dec ecx - jnz .byte - + jnz .next_byte + xor al, al + stosb ret endp crash._.bin2hex_table db '0123456789abcdef' -crash._.table: ; hash function, address of initial hash value - dd crash.crc32, crash._.crc_init - dd crash.md4, crash._.md4_init - dd crash.md5, crash._.md5_init - dd crash.sha1, crash._.sha1_init - dd crash.sha256, crash._.sha224_init - dd crash.sha256, crash._.sha256_init - dd crash.sha512, crash._.sha384_init - dd crash.sha512, crash._.sha512_init + +; see crash_item struct for details +crash._.table dd crash.md4, crash._.md4_init, crash._.md4_md5_postprocess, 4, 4, 64, 8, 0 + dd crash.md5, crash._.md5_init, crash._.md4_md5_postprocess, 4, 4, 64, 8, 0 + dd crash.sha1, crash._.sha1_init, crash._.sha1_224_256_postprocess, 5, 5, 64, 8, 1 + dd crash.sha256, crash._.sha224_init, crash._.sha1_224_256_postprocess, 8, 7, 64, 8, 1 + dd crash.sha256, crash._.sha256_init, crash._.sha1_224_256_postprocess, 8, 8, 64, 8, 1 + dd crash.sha512, crash._.sha384_init, crash._.sha384_512_postprocess, 16, 12, 128, 16, 1 + dd crash.sha512, crash._.sha512_init, crash._.sha384_512_postprocess, 16, 16, 128, 16, 1 crash._.crc_init dd 0xffffffff + 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._.init_flags dd 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,\ @@ -146,6 +269,7 @@ crash._.sha512_table dq 0x428a2f98d728ae22, 0x7137449123ef65cd, 0xb5c0fbcfec4d3b 0x28db77f523047d84, 0x32caab7b40c72493, 0x3c9ebe0a15c9bebc, 0x431d67c49c100d4c,\ 0x4cc5d4becb3e42b6, 0x597f299cfc657e2a, 0x5fcb6fab3ad6faec, 0x6c44198c4a475817 + align 4 @EXPORT: diff --git a/programs/develop/libraries/libcrash/trunk/libcrash.inc b/programs/develop/libraries/libcrash/trunk/libcrash.inc index c9839db41b..333e640c18 100644 --- a/programs/develop/libraries/libcrash/trunk/libcrash.inc +++ b/programs/develop/libraries/libcrash/trunk/libcrash.inc @@ -1,8 +1,38 @@ -LIBCRASH_CRC32 = 0x00010101 -LIBCRASH_MD4 = 0x00040402 -LIBCRASH_MD5 = 0x00040403 -LIBCRASH_SHA1 = 0x00050504 -LIBCRASH_SHA224 = 0x00070805 -LIBCRASH_SHA256 = 0x00080806 -LIBCRASH_SHA384 = 0x000c1007 -LIBCRASH_SHA512 = 0x00101008 +; libcrash -- cryptographic hash functions +; +; Copyright (C) 2012-2013 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 . + +LIBCRASH_ENDIAN_LITTLE = 0 +LIBCRASH_ENDIAN_BIG = 1 + +LIBCRASH_MD4 = 0 +LIBCRASH_MD5 = 1 +LIBCRASH_SHA1 = 2 +LIBCRASH_SHA224 = 3 +LIBCRASH_SHA256 = 4 +LIBCRASH_SHA384 = 5 +LIBCRASH_SHA512 = 6 + +struct crash_item + function dd ? + init_val dd ? + postproc dd ? + len_in dd ? + len_out dd ? + len_blk dd ? + len_size dd ? + endianness dd ? +ends diff --git a/programs/develop/libraries/libcrash/trunk/md4.asm b/programs/develop/libraries/libcrash/trunk/md4.asm index beee908be7..9e0c0d0c54 100644 --- a/programs/develop/libraries/libcrash/trunk/md4.asm +++ b/programs/develop/libraries/libcrash/trunk/md4.asm @@ -1,3 +1,20 @@ +; libcrash -- cryptographic hash functions +; +; Copyright (C) 2012-2013 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 . + macro crash.md4.f b, c, d { push c @@ -36,24 +53,7 @@ macro crash.md4.round func, a, b, c, d, index, shift, ac } -proc crash.md4 _md4, _data, _len, _callback, _msglen -locals - final rd 1 -endl - mov [final], 0 - .first: - mov eax, [_msglen] - mov ecx, [_len] - add [eax], ecx - mov esi, [_data] - test ecx, ecx - jz .callback - .begin: - sub [_len], 64 - jnc @f - add [_len], 64 - jmp .endofblock - @@: +proc crash.md4 _md4, _data mov edi, [_md4] mov eax, [edi + 0x0] mov ebx, [edi + 0x4] @@ -117,49 +117,7 @@ endl add [edi + 0x8], ecx add [edi + 0xc], edx add esi, 64 - jmp .begin - .endofblock: - cmp [final], 1 - je .quit - .callback: - mov eax, [_callback] - test eax, eax - jz @f - call eax - test eax, eax - jz @f - mov [_len], eax - jmp .first - @@: - - mov edi, [_data] - mov ecx, [_len] - rep movsb - mov eax, [_msglen] - mov eax, [eax] - and eax, 63 - mov ecx, 56 - sub ecx, eax - ja @f - add ecx, 64 - @@: - add [_len], ecx - mov byte[edi], 0x80 - add edi, 1 - sub ecx, 1 - mov al, 0 - rep stosb - mov eax, [_msglen] - mov eax, [eax] - mov edx, 8 - mul edx - mov dword[edi], eax - mov dword[edi + 4], edx - add [_len], 8 - mov [final], 1 - jmp .first - .quit: ret endp diff --git a/programs/develop/libraries/libcrash/trunk/md5.asm b/programs/develop/libraries/libcrash/trunk/md5.asm index f994c7260f..83078397df 100644 --- a/programs/develop/libraries/libcrash/trunk/md5.asm +++ b/programs/develop/libraries/libcrash/trunk/md5.asm @@ -1,3 +1,20 @@ +; libcrash -- cryptographic hash functions +; +; Copyright (C) 2012-2013 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 . + macro crash.md5.f b, c, d { push c @@ -44,24 +61,7 @@ macro crash.md5.round func, a, b, c, d, index, shift, ac } -proc crash.md5 _md5, _data, _len, _callback, _msglen -locals - final rd 1 -endl - mov [final], 0 - .first: - mov eax, [_msglen] - mov ecx, [_len] - add [eax], ecx - mov esi, [_data] - test ecx, ecx - jz .callback - .begin: - sub [_len], 64 - jnc @f - add [_len], 64 - jmp .endofblock - @@: +proc crash.md5 _md5, _data mov edi, [_md5] mov eax, [edi + 0x0] mov ebx, [edi + 0x4] @@ -142,49 +142,7 @@ endl add [edi + 0x8], ecx add [edi + 0xc], edx add esi, 64 - jmp .begin - .endofblock: - cmp [final], 1 - je .quit - .callback: - mov eax, [_callback] - test eax, eax - jz @f - call eax - test eax, eax - jz @f - mov [_len], eax - jmp .first - @@: - - mov edi, [_data] - mov ecx, [_len] - rep movsb - mov eax, [_msglen] - mov eax, [eax] - and eax, 63 - mov ecx, 56 - sub ecx, eax - ja @f - add ecx, 64 - @@: - add [_len], ecx - mov byte[edi], 0x80 - add edi, 1 - sub ecx, 1 - mov al, 0 - rep stosb - mov eax, [_msglen] - mov eax, [eax] - mov edx, 8 - mul edx - mov dword[edi], eax - mov dword[edi + 4], edx - add [_len], 8 - mov [final], 1 - jmp .first - .quit: ret endp diff --git a/programs/develop/libraries/libcrash/trunk/sha1.asm b/programs/develop/libraries/libcrash/trunk/sha1.asm index 73c61c4503..023c3a3084 100644 --- a/programs/develop/libraries/libcrash/trunk/sha1.asm +++ b/programs/develop/libraries/libcrash/trunk/sha1.asm @@ -1,3 +1,20 @@ +; libcrash -- cryptographic hash functions +; +; Copyright (C) 2012-2013 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 . + proc crash.sha1.f push ebx ecx edx xor ecx, edx @@ -29,30 +46,33 @@ proc crash.sha1.h ret endp +macro crash.sha1.round f, k, c +{ + mov esi, eax + rol esi, 5 + mov [temp], esi + call f -proc crash.sha1 _sha1, _data, _len, _callback, _msglen + add esi, edi + add [temp], esi + mov esi, [w + (c)*4] + add esi, k + add [temp], esi + + mov edi, edx + mov edx, ecx + mov ecx, ebx + rol ecx, 30 + mov ebx, eax + mov eax, [temp] +} + + +proc crash.sha1 _sha1, _data locals - final rd 1 - temp rd 1 - counter rd 1 - summand rd 1 - shafunc rd 1 - w rd 80 + temp rd 1 + w rd 80 endl - mov [final], 0 - .first: - mov eax, [_msglen] - mov ecx, [_len] - add [eax], ecx - mov esi, [_data] - test ecx, ecx - jz .callback - .begin: - sub [_len], 64 - jnc @f - add [_len], 64 - jmp .endofblock - @@: lea edi, [w] xor ecx, ecx @@: @@ -84,110 +104,21 @@ endl push esi - mov [counter], 0 - mov [summand], 0x5a827999 - mov [shafunc], crash.sha1.f - @@: - mov esi, eax - rol esi, 5 - mov [temp], esi - call [shafunc] +repeat 20 + crash.sha1.round crash.sha1.f, 0x5a827999, %-1 +end repeat - add esi, edi - add [temp], esi - mov esi, [counter] - mov esi, [w + esi*4] - add esi, [summand] - add [temp], esi +repeat 20 + crash.sha1.round crash.sha1.g, 0x6ed9eba1, %-1+20 +end repeat - mov edi, edx - mov edx, ecx - mov ecx, ebx - rol ecx, 30 - mov ebx, eax - mov eax, [temp] +repeat 20 + crash.sha1.round crash.sha1.h, 0x8f1bbcdc, %-1+40 +end repeat - add [counter], 1 - cmp [counter], 20 - jne @b - - mov [summand], 0x6ed9eba1 - mov [shafunc], crash.sha1.g - @@: - mov esi, eax - rol esi, 5 - mov [temp], esi - call dword[shafunc] - - add esi, edi - add [temp], esi - mov esi, [counter] - mov esi, [w + esi*4] - add esi, [summand] - add [temp], esi - - mov edi, edx - mov edx, ecx - mov ecx, ebx - rol ecx, 30 - mov ebx, eax - mov eax, [temp] - - add [counter], 1 - cmp [counter], 40 - jne @b - - mov [summand], 0x8f1bbcdc - mov [shafunc], crash.sha1.h - @@: - mov esi, eax - rol esi, 5 - mov [temp], esi - call dword[shafunc] - - add esi, edi - add [temp], esi - mov esi, [counter] - mov esi, [w + esi*4] - add esi, [summand] - add [temp], esi - - mov edi, edx - mov edx, ecx - mov ecx, ebx - rol ecx, 30 - mov ebx, eax - mov eax, [temp] - - add [counter], 1 - cmp [counter], 60 - jne @b - - mov [summand], 0xca62c1d6 - mov [shafunc], crash.sha1.g - @@: - mov esi, eax - rol esi, 5 - mov [temp], esi - call dword[shafunc] - - add esi, edi - add [temp], esi - mov esi, [counter] - mov esi, [w + esi*4] - add esi, [summand] - add [temp], esi - - mov edi, edx - mov edx, ecx - mov ecx, ebx - rol ecx, 30 - mov ebx, eax - mov eax, [temp] - - add [counter], 1 - cmp [counter], 80 - jne @b +repeat 20 + crash.sha1.round crash.sha1.g, 0xca62c1d6, %-1+60 +end repeat pop esi @@ -199,60 +130,7 @@ endl add [edi + 0x0c], edx mov eax, [temp] add [edi + 0x10], eax - jmp .begin - .endofblock: - cmp [final], 1 - je .quit - .callback: - mov eax, [_callback] - test eax, eax - jz @f - call eax - test eax, eax - jz @f - mov [_len], eax - jmp .first - @@: - - mov edi, [_data] - mov ecx, [_len] - rep movsb - mov eax, [_msglen] - mov eax, [eax] - and eax, 63 - mov ecx, 56 - sub ecx, eax - ja @f - add ecx, 64 - @@: - add [_len], ecx - mov byte[edi], 0x80 - add edi, 1 - sub ecx, 1 - mov al, 0 - rep stosb - mov eax, [_msglen] - mov eax, [eax] - mov edx, 8 - mul edx - bswap eax - bswap edx - mov dword[edi], edx - mov dword[edi + 4], eax - add [_len], 8 - mov [final], 1 - jmp .first - .quit: - mov esi, [_sha1] - mov edi, esi - mov ecx, 5 - @@: - lodsd - bswap eax - stosd - sub ecx, 1 - jnz @b ret endp diff --git a/programs/develop/libraries/libcrash/trunk/sha224_256.asm b/programs/develop/libraries/libcrash/trunk/sha224_256.asm index fbacabbe92..d0b4170bdf 100644 --- a/programs/develop/libraries/libcrash/trunk/sha224_256.asm +++ b/programs/develop/libraries/libcrash/trunk/sha224_256.asm @@ -1,3 +1,20 @@ +; libcrash -- cryptographic hash functions +; +; Copyright (C) 2012-2013 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 . + macro chn x, y, z { mov eax, [y] @@ -120,9 +137,8 @@ macro crash.sha256.round_17_64 a, b, c, d, e, f, g, h, n, rep_num } -proc crash.sha256 _sha256, _data, _len, _callback, _msglen +proc crash.sha256 _sha256, _data locals - final rd 1 w rd 64 A rd 1 B rd 1 @@ -133,20 +149,6 @@ locals G rd 1 H rd 1 endl - mov [final], 0 - .first: - mov eax, [_msglen] - mov ecx, [_len] - add [eax], ecx - mov esi, [_data] - test ecx, ecx - jz .callback - .begin: - sub [_len], 64 - jnc @f - add [_len], 64 - jmp .endofblock - @@: mov edi, [_sha256] mov eax, [edi + 0x00] mov [A], eax @@ -219,60 +221,7 @@ end repeat mov eax, [H] add [edi + 0x1c], eax add esi, 64 - jmp .begin - .endofblock: - cmp [final], 1 - je .quit - .callback: - mov eax, [_callback] - test eax, eax - jz @f - call eax - test eax, eax - jz @f - mov [_len], eax - jmp .first - @@: - - mov edi, [_data] - mov ecx, [_len] - rep movsb - mov eax, [_msglen] - mov eax, [eax] - and eax, 63 - mov ecx, 56 - sub ecx, eax - ja @f - add ecx, 64 - @@: - add [_len], ecx - mov byte[edi], 0x80 - add edi, 1 - sub ecx, 1 - mov al, 0 - rep stosb - mov eax, [_msglen] - mov eax, [eax] - mov edx, 8 - mul edx - bswap eax - bswap edx - mov dword[edi], edx - mov dword[edi + 4], eax - add [_len], 8 - mov [final], 1 - jmp .first - .quit: - mov esi, [_sha256] - mov edi, esi - mov ecx, 8 - @@: - lodsd - bswap eax - stosd - sub ecx, 1 - jnz @b ret endp diff --git a/programs/develop/libraries/libcrash/trunk/sha384_512.asm b/programs/develop/libraries/libcrash/trunk/sha384_512.asm index da441f5a23..4cc68006fe 100644 --- a/programs/develop/libraries/libcrash/trunk/sha384_512.asm +++ b/programs/develop/libraries/libcrash/trunk/sha384_512.asm @@ -1,3 +1,20 @@ +; libcrash -- cryptographic hash functions +; +; Copyright (C) 2012-2013 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 . + macro chn x, y, z { movq mm0, [y] @@ -158,9 +175,8 @@ macro crash.sha512.round_17_64 a, b, c, d, e, f, g, h, n, rep_num } -proc crash.sha512 _sha512, _data, _len, _callback, _msglen +proc crash.sha512 _sha512, _data locals - final rd 1 w rq 80 A rq 1 B rq 1 @@ -172,20 +188,6 @@ locals H rq 1 temp rq 1 endl - mov [final], 0 - .first: - mov eax, [_msglen] - mov ecx, [_len] - add [eax], ecx - mov esi, [_data] - test ecx, ecx - jz .callback - .begin: - sub [_len], 128 - jnc @f - add [_len], 128 - jmp .endofblock - @@: mov edi, [_sha512] movq mm0, [edi + 0x00] movq [A], mm0 @@ -268,69 +270,7 @@ end repeat paddq mm0, [edi + 0x38] movq [edi + 0x38], mm0 add esi, 128 - jmp .begin - .endofblock: - cmp [final], 1 - je .quit - .callback: - mov eax, [_callback] - test eax, eax - jz @f - call eax - test eax, eax - jz @f - mov [_len], eax - jmp .first - @@: - - mov edi, [_data] - mov ecx, [_len] - rep movsb - mov eax, [_msglen] - mov eax, [eax] - and eax, 127 - mov ecx, 112 - sub ecx, eax - ja @f - add ecx, 128 - @@: - add [_len], ecx - mov byte[edi], 0x80 - add edi, 1 - sub ecx, 1 - mov al, 0 - rep stosb - xor eax, eax - stosd - stosd - mov eax, [_msglen] - mov eax, [eax] - mov edx, 8 - mul edx - bswap eax - bswap edx - mov dword[edi], edx - mov dword[edi + 4], eax - add [_len], 16 - mov [final], 1 - jmp .first - .quit: - mov esi, [_sha512] - mov edi, esi - mov ecx, 8 - @@: - lodsd - bswap eax - mov ebx, eax - lodsd - bswap eax - stosd - mov eax, ebx - stosd - sub ecx, 1 - jnz @b - emms ret endp