; libcrash -- cryptographic hash functions ; ; Copyright (C) 2012-2014,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 . format MS COFF public @EXPORT as 'EXPORTS' include 'struct.inc' include 'proc32.inc' include 'macros.inc' include 'config.inc' include 'kglobals.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' include 'sha224_256.asm' include 'sha384_512.asm' include 'sha3.asm' proc lib_init ret endp proc crash.hash _hid, _data, _callback, _ctx locals size dd ? endl mov [size], 0 mov eax, [_hid] imul eax, sizeof.crash_item lea edx, [crash._.table + eax] mov ebx, [_ctx] stdcall [edx + crash_item.init], [_ctx] .hash: mov esi, [_data] push edx stdcall [edx + crash_item.update], [_ctx], [_data], [size] mov [size], 0 pop edx mov eax, [_callback] test eax, eax jz .quit push edx stdcall [_callback], [size] pop edx mov [size], eax test eax, eax jnz .hash stdcall [edx + crash_item.final], [_ctx] .quit: ret endp proc crash.bin2hex _bin, _hex, _hid 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] .next_byte: xor eax, eax lodsb shl eax, 4 shr al, 4 xlatb xchg al, ah xlatb stosw dec ecx jnz .next_byte xor al, al stosb ret endp section '.data' data readable align 16 crash._.bin2hex_table db '0123456789abcdef' crash._.table dd \ crc32.init, crc32.update, crc32.final, crc32.oneshot, CRC32_HASH_SIZE, \ md4.init, md4.update, md4.final, md4.oneshot, MD4_HASH_SIZE, \ md5.init, md5.update, md5.final, md5.oneshot, MD5_HASH_SIZE, \ sha1.init, sha1.update, sha1.final, sha1.oneshot, SHA1_HASH_SIZE, \ sha224.init, sha224.update, sha224.final, sha224.oneshot, SHA224_HASH_SIZE, \ sha256.init, sha256.update, sha256.final, sha256.oneshot, SHA256_HASH_SIZE, \ sha384.init, sha384.update, sha384.final, sha384.oneshot, SHA384_HASH_SIZE, \ sha512.init, sha512.update, sha512.final, sha512.oneshot, SHA512_HASH_SIZE, \ sha3_224.init, sha3_224.update, sha3_224.final, sha3_224.oneshot, SHA3_224_HASH_SIZE,\ sha3_256.init, sha3_256.update, sha3_256.final, sha3_256.oneshot, SHA3_256_HASH_SIZE,\ sha3_384.init, sha3_384.update, sha3_384.final, sha3_384.oneshot, SHA3_384_HASH_SIZE,\ sha3_512.init, sha3_512.update, sha3_512.final, sha3_512.oneshot, SHA3_512_HASH_SIZE IncludeIGlobals align 4 @EXPORT: export \ lib_init, 'lib_init' , \ crash.hash, 'crash_hash' , \ crash.bin2hex, 'crash_bin2hex' , \ crc32.init, 'crc32_init' , \ crc32.update, 'crc32_update' , \ crc32.final, 'crc32_final' , \ crc32.oneshot, 'crc32_oneshot' , \ md4.init, 'md4_init' , \ md4.update, 'md4_update' , \ md4.final, 'md4_final' , \ md4.oneshot, 'md4_oneshot' , \ md5.init, 'md5_init' , \ md5.update, 'md5_update' , \ md5.final, 'md5_final' , \ md5.oneshot, 'md5_oneshot' , \ sha1.init, 'sha1_init' , \ sha1.update, 'sha1_update' , \ sha1.final, 'sha1_final' , \ sha1.oneshot, 'sha1_oneshot' , \ sha224.init, 'sha224_init' , \ sha224.update, 'sha224_update' , \ sha224.final, 'sha224_final' , \ sha224.oneshot, 'sha224_oneshot' , \ sha256.init, 'sha256_init' , \ sha256.update, 'sha256_update' , \ sha256.final, 'sha256_final' , \ sha256.oneshot, 'sha256_oneshot' , \ sha384.init, 'sha384_init' , \ sha384.update, 'sha384_update' , \ sha384.final, 'sha384_final' , \ sha384.oneshot, 'sha384_oneshot' , \ sha512.init, 'sha512_init' , \ sha512.update, 'sha512_update' , \ sha512.final, 'sha512_final' , \ sha512.oneshot, 'sha512_oneshot' , \ sha3_224.init, 'sha3_224_init' , \ sha3_224.update, 'sha3_224_update' , \ sha3_224.final, 'sha3_224_final' , \ sha3_224.oneshot, 'sha3_224_oneshot' , \ sha3_256.init, 'sha3_256_init' , \ sha3_256.update, 'sha3_256_update' , \ sha3_256.final, 'sha3_256_final' , \ sha3_256.oneshot, 'sha3_256_oneshot' , \ sha3_384.init, 'sha3_384_init' , \ sha3_384.update, 'sha3_384_update' , \ sha3_384.final, 'sha3_384_final' , \ sha3_384.oneshot, 'sha3_384_oneshot' , \ sha3_512.init, 'sha3_512_init' , \ sha3_512.update, 'sha3_512_update' , \ sha3_512.final, 'sha3_512_final' , \ sha3_512.oneshot, 'sha3_512_oneshot'