Subversion Repositories Kolibri OS

Rev

Rev 3431 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. ;    libcrash -- cryptographic hash functions
  2. ;
  3. ;    Copyright (C) 2012-2013 Ivan Baravy (dunkaist)
  4. ;
  5. ;    This program is free software: you can redistribute it and/or modify
  6. ;    it under the terms of the GNU General Public License as published by
  7. ;    the Free Software Foundation, either version 3 of the License, or
  8. ;    (at your option) any later version.
  9. ;
  10. ;    This program is distributed in the hope that it will be useful,
  11. ;    but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. ;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. ;    GNU General Public License for more details.
  14. ;
  15. ;    You should have received a copy of the GNU General Public License
  16. ;    along with this program.  If not, see <http://www.gnu.org/licenses/>.
  17.  
  18. format MS COFF
  19.  
  20. public @EXPORT as 'EXPORTS'
  21.  
  22. include '../../../../struct.inc'
  23. include '../../../../proc32.inc'
  24. include '../../../../macros.inc'
  25. include '../../../../config.inc'
  26. ;include '../../../../debug.inc'
  27.  
  28. purge section,mov,add,sub
  29. section '.flat' code readable align 16
  30.  
  31.  
  32. include 'libcrash.inc'
  33. include 'md4.asm'
  34. include 'md5.asm'
  35. include 'sha1.asm'
  36. include 'sha224_256.asm'
  37. include 'sha384_512.asm'
  38. include 'sha3.asm'
  39.  
  40.  
  41. proc lib_init
  42.         ret
  43. endp
  44.  
  45.  
  46. proc crash.hash  _hid, _hash, _data, _len, _callback, _msglen
  47. locals
  48.         hash_func       rd      1
  49.         final           rd      1
  50.         hi              rd      1
  51. endl
  52.         mov     eax, [_hid]
  53.         imul    eax, sizeof.crash_item
  54.         lea     eax, [crash._.table + eax]
  55.         mov     [hi], eax
  56.  
  57.         mov     eax, [hi]
  58.         mov     edx, [eax + crash_item.function]
  59.         mov     esi, [eax + crash_item.init_val]
  60.         mov     edi, [_hash]
  61.         mov     [hash_func], edx
  62.         mov     ecx, [hi]
  63.         mov     ecx, [ecx + crash_item.len_in]
  64.         rep     movsd
  65.  
  66.         mov     [final], 0
  67.   .first:
  68.         mov     eax, [_msglen]
  69.         mov     ecx, [_len]
  70.         add     [eax], ecx
  71.         mov     esi, [_data]
  72.         test    ecx, ecx
  73.         jz      .callback
  74.   .begin:
  75.         mov     eax, [hi]
  76.         mov     eax, [eax + crash_item.len_blk]
  77.         sub     [_len], eax
  78.         jnc     @f
  79.         add     [_len], eax
  80.         jmp     .endofblock
  81.     @@:
  82.         stdcall [hash_func], [_hash], [_data]
  83.         jmp     .begin
  84.   .endofblock:
  85.         cmp     [final], 1
  86.         je      .quit
  87.  
  88.   .callback:
  89.         mov     edi, [_data]
  90.         mov     ecx, [_len]
  91.         rep     movsb
  92.         push    esi edi
  93.         stdcall [_callback], [_len]
  94.         pop     edi esi
  95.         test    eax, eax
  96.         jz      @f
  97.         mov     edx, [_msglen]
  98.         mov     ecx, [_len]
  99.         sub     [edx], ecx
  100.         add     [_len], eax
  101.         jmp     .first
  102.     @@:
  103.  
  104.         mov     eax, [_msglen]
  105.         mov     eax, [eax]
  106.         xor     edx, edx
  107.         mov     ecx, [hi]
  108.         mov     ecx, [ecx + crash_item.len_blk]
  109.         div     ecx
  110.         mov     eax, edx
  111.         mov     edx, [hi]
  112.         mov     ecx, [edx + crash_item.len_blk]
  113.         sub     ecx, [edx + crash_item.len_size]
  114.         sub     ecx, eax
  115.         ja      @f
  116.         add     ecx, [edx + crash_item.len_blk]
  117.     @@:
  118.         add     [_len], ecx
  119.  
  120.         mov     eax, [edx + crash_item.len_size]
  121.         add     [_len], eax
  122.  
  123.         mov     eax, [hi]
  124.         stdcall [eax + crash_item.finalproc], [hi], [_msglen]
  125.  
  126.         mov     [final], 1
  127.         jmp     .first
  128.   .quit:
  129.         mov     eax, [hi]
  130.         stdcall [eax + crash_item.postproc], [eax + crash_item.len_out], [_hash]
  131.         ret
  132. endp
  133.  
  134.  
  135. crash._.md4_finalproc:
  136. proc crash._.md5_finalproc _hi, _msglen
  137.         mov     byte[edi], 0x80
  138.         add     edi, 1
  139.         sub     ecx, 1
  140.         mov     al, 0
  141.         rep     stosb
  142.         push    ecx
  143.         xor     eax, eax
  144.         mov     ecx, [_hi]
  145.         mov     ecx, [ecx + crash_item.len_size]
  146.         sub     ecx, 8                  ; FIXME for > 2^64 input length
  147.         shr     ecx, 2
  148.         rep     stosd
  149.         pop     ecx
  150.         mov     eax, [_msglen]
  151.         mov     eax, [eax]
  152.         mov     edx, 8
  153.         mul     edx
  154.         mov     ecx, [_hi]
  155.         mov     dword[edi], eax
  156.         mov     dword[edi + 4], edx
  157.         ret
  158. endp
  159.  
  160.  
  161. crash._.sha1_finalproc:
  162. crash._.sha224_finalproc:
  163. proc crash._.sha256_finalproc _hi, _msglen
  164.         mov     byte[edi], 0x80
  165.         add     edi, 1
  166.         sub     ecx, 1
  167.         mov     al, 0
  168.         rep     stosb
  169.         push    ecx
  170.         xor     eax, eax
  171.         mov     ecx, [_hi]
  172.         mov     ecx, [ecx + crash_item.len_size]
  173.         sub     ecx, 8                  ; FIXME for > 2^64 input length
  174.         shr     ecx, 2
  175.         rep     stosd
  176.         pop     ecx
  177.         mov     eax, [_msglen]
  178.         mov     eax, [eax]
  179.         mov     edx, 8
  180.         mul     edx
  181.         mov     ecx, [_hi]
  182.         bswap   eax
  183.         bswap   edx
  184.         xchg    eax, edx
  185.         mov     dword[edi], eax
  186.         mov     dword[edi + 4], edx
  187.  
  188.         ret
  189. endp
  190.  
  191.  
  192. crash._.sha384_finalproc:
  193. proc crash._.sha512_finalproc _hi, _msglen
  194.         mov     byte[edi], 0x80
  195.         add     edi, 1
  196.         sub     ecx, 1
  197.         mov     al, 0
  198.         rep     stosb
  199.         push    ecx
  200.         xor     eax, eax
  201.         mov     ecx, [_hi]
  202.         mov     ecx, [ecx + crash_item.len_size]
  203.         sub     ecx, 8                  ; FIXME for > 2^64 input length
  204.         shr     ecx, 2
  205.         rep     stosd
  206.         pop     ecx
  207.         mov     eax, [_msglen]
  208.         mov     eax, [eax]
  209.         mov     edx, 8
  210.         mul     edx
  211.         mov     ecx, [_hi]
  212.         bswap   eax
  213.         bswap   edx
  214.         xchg    eax, edx
  215.         mov     dword[edi], eax
  216.         mov     dword[edi + 4], edx
  217.  
  218.         ret
  219. endp
  220.  
  221.  
  222. crash._.sha3_224_finalproc:
  223. crash._.sha3_256_finalproc:
  224. crash._.sha3_384_finalproc:
  225. proc crash._.sha3_512_finalproc _hi, _msglen
  226.         mov     byte[edi], 0x01
  227.         add     edi, 1
  228.         sub     ecx, 1
  229.         mov     eax, 0
  230.         rep     stosb
  231.         or      byte[edi - 1], 0x80
  232.         ret
  233. endp
  234.  
  235.  
  236. crash._.md4_postprocess:
  237. proc crash._.md5_postprocess _len_out, _hash
  238.         ret
  239. endp
  240.  
  241.  
  242. crash._.sha1_postprocess:
  243. crash._.sha224_postprocess:
  244. proc crash._.sha256_postprocess _len_out, _hash
  245.         mov     ecx, [_len_out]
  246.         mov     esi, [_hash]
  247.         mov     edi, esi
  248.     @@:
  249.         lodsd
  250.         bswap   eax
  251.         stosd
  252.         dec     ecx
  253.         jnz     @b
  254.         ret
  255. endp
  256.  
  257.  
  258. crash._.sha384_postprocess:
  259. proc crash._.sha512_postprocess _len_out, _hash
  260.         mov     ecx, [_len_out]
  261.         mov     esi, [_hash]
  262.         mov     edi, esi
  263.     @@:
  264.         lodsd
  265.         mov     ebx, eax
  266.         lodsd
  267.         bswap   eax
  268.         bswap   ebx
  269.         stosd
  270.         mov     eax, ebx
  271.         stosd
  272.         dec     ecx
  273.         jnz     @b
  274.         emms
  275.         ret
  276. endp
  277.  
  278.  
  279. crash._.sha3_224_postprocess:
  280. crash._.sha3_256_postprocess:
  281. crash._.sha3_384_postprocess:
  282. proc crash._.sha3_512_postprocess _len_out, _hash
  283.         emms
  284.         ret
  285. endp
  286.  
  287.  
  288. proc crash.bin2hex _bin, _hex, _hid     ; FIXME _hid param?
  289.         mov     eax, [_hid]
  290.         imul    eax, sizeof.crash_item
  291.         mov     ecx, [crash._.table + eax + crash_item.len_out]
  292.         mov     ebx, crash._.bin2hex_table
  293.         mov     esi, [_bin]
  294.         mov     edi, [_hex]
  295.         shl     ecx, 2
  296.   .next_byte:
  297.         xor     eax, eax
  298.         lodsb
  299.         shl     eax, 4
  300.         shr     al, 4
  301.         xlatb
  302.         xchg    al, ah
  303.         xlatb
  304.         stosw
  305.         dec     ecx
  306.         jnz     .next_byte
  307.         xor     al, al
  308.         stosb
  309.         ret
  310. endp
  311.  
  312.  
  313. crash._.bin2hex_table   db      '0123456789abcdef'
  314.  
  315. ; see crash_item struct for details
  316. crash._.table           dd      crash.md4,      crash._.md4_init,      crash._.md4_finalproc,      crash._.md4_postprocess,       4,  4,  64,  8
  317.                         dd      crash.md5,      crash._.md5_init,      crash._.md5_finalproc,      crash._.md5_postprocess,       4,  4,  64,  8
  318.                         dd      crash.sha1,     crash._.sha1_init,     crash._.sha1_finalproc,     crash._.sha1_postprocess,      5,  5,  64,  8
  319.                         dd      crash.sha256,   crash._.sha224_init,   crash._.sha224_finalproc,   crash._.sha224_postprocess,    8,  7,  64,  8
  320.                         dd      crash.sha256,   crash._.sha256_init,   crash._.sha256_finalproc,   crash._.sha256_postprocess,    8,  8,  64,  8
  321.                         dd      crash.sha512,   crash._.sha384_init,   crash._.sha384_finalproc,   crash._.sha384_postprocess,   16, 12, 128, 16
  322.                         dd      crash.sha512,   crash._.sha512_init,   crash._.sha512_finalproc,   crash._.sha512_postprocess,   16, 16, 128, 16
  323.                         dd      crash.sha3_224, crash._.sha3_224_init, crash._.sha3_224_finalproc, crash._.sha3_224_postprocess, 50,  7, 144,  0
  324.                         dd      crash.sha3_256, crash._.sha3_256_init, crash._.sha3_256_finalproc, crash._.sha3_256_postprocess, 50,  8, 136,  0
  325.                         dd      crash.sha3_384, crash._.sha3_384_init, crash._.sha3_384_finalproc, crash._.sha3_384_postprocess, 50, 12, 104,  0
  326.                         dd      crash.sha3_512, crash._.sha3_512_init, crash._.sha3_512_finalproc, crash._.sha3_512_postprocess, 50, 16,  72,  0
  327.  
  328. crash._.md4_init:
  329. crash._.md5_init:
  330. crash._.sha1_init       dd      0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0
  331.  
  332. crash._.sha224_init     dd      0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4
  333.  
  334. crash._.sha256_init     dd      0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19
  335.  
  336. crash._.sha384_init     dq      0xcbbb9d5dc1059ed8, 0x629a292a367cd507, 0x9159015a3070dd17, 0x152fecd8f70e5939,\
  337.                                 0x67332667ffc00b31, 0x8eb44a8768581511, 0xdb0c2e0d64f98fa7, 0x47b5481dbefa4fa4
  338.  
  339. crash._.sha512_init     dq      0x6a09e667f3bcc908, 0xbb67ae8584caa73b, 0x3c6ef372fe94f82b, 0xa54ff53a5f1d36f1,\
  340.                                 0x510e527fade682d1, 0x9b05688c2b3e6c1f, 0x1f83d9abfb41bd6b, 0x5be0cd19137e2179
  341.  
  342. crash._.sha3_512_init:
  343. crash._.sha3_384_init:
  344. crash._.sha3_256_init:
  345. 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
  346.  
  347. crash._.sha256_table    dd      0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\
  348.                                 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\
  349.                                 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\
  350.                                 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\
  351.                                 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\
  352.                                 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\
  353.                                 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\
  354.                                 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
  355.  
  356. crash._.sha512_table    dq      0x428a2f98d728ae22, 0x7137449123ef65cd, 0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc,\
  357.                                 0x3956c25bf348b538, 0x59f111f1b605d019, 0x923f82a4af194f9b, 0xab1c5ed5da6d8118,\
  358.                                 0xd807aa98a3030242, 0x12835b0145706fbe, 0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2,\
  359.                                 0x72be5d74f27b896f, 0x80deb1fe3b1696b1, 0x9bdc06a725c71235, 0xc19bf174cf692694,\
  360.                                 0xe49b69c19ef14ad2, 0xefbe4786384f25e3, 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65,\
  361.                                 0x2de92c6f592b0275, 0x4a7484aa6ea6e483, 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5,\
  362.                                 0x983e5152ee66dfab, 0xa831c66d2db43210, 0xb00327c898fb213f, 0xbf597fc7beef0ee4,\
  363.                                 0xc6e00bf33da88fc2, 0xd5a79147930aa725, 0x06ca6351e003826f, 0x142929670a0e6e70,\
  364.                                 0x27b70a8546d22ffc, 0x2e1b21385c26c926, 0x4d2c6dfc5ac42aed, 0x53380d139d95b3df,\
  365.                                 0x650a73548baf63de, 0x766a0abb3c77b2a8, 0x81c2c92e47edaee6, 0x92722c851482353b,\
  366.                                 0xa2bfe8a14cf10364, 0xa81a664bbc423001, 0xc24b8b70d0f89791, 0xc76c51a30654be30,\
  367.                                 0xd192e819d6ef5218, 0xd69906245565a910, 0xf40e35855771202a, 0x106aa07032bbd1b8,\
  368.                                 0x19a4c116b8d2d0c8, 0x1e376c085141ab53, 0x2748774cdf8eeb99, 0x34b0bcb5e19b48a8,\
  369.                                 0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb, 0x5b9cca4f7763e373, 0x682e6ff3d6b2b8a3,\
  370.                                 0x748f82ee5defb2fc, 0x78a5636f43172f60, 0x84c87814a1f0ab72, 0x8cc702081a6439ec,\
  371.                                 0x90befffa23631e28, 0xa4506cebde82bde9, 0xbef9a3f7b2c67915, 0xc67178f2e372532b,\
  372.                                 0xca273eceea26619c, 0xd186b8c721c0c207, 0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178,\
  373.                                 0x06f067aa72176fba, 0x0a637dc5a2c898a6, 0x113f9804bef90dae, 0x1b710b35131c471b,\
  374.                                 0x28db77f523047d84, 0x32caab7b40c72493, 0x3c9ebe0a15c9bebc, 0x431d67c49c100d4c,\
  375.                                 0x4cc5d4becb3e42b6, 0x597f299cfc657e2a, 0x5fcb6fab3ad6faec, 0x6c44198c4a475817
  376.  
  377. crash._.sha3_round      dq      0x0000000000000001, 0x0000000000008082, 0x800000000000808A, 0x8000000080008000,\
  378.                                 0x000000000000808B, 0x0000000080000001, 0x8000000080008081, 0x8000000000008009,\
  379.                                 0x000000000000008A, 0x0000000000000088, 0x0000000080008009, 0x000000008000000A,\
  380.                                 0x000000008000808B, 0x800000000000008B, 0x8000000000008089, 0x8000000000008003,\
  381.                                 0x8000000000008002, 0x8000000000000080, 0x000000000000800A, 0x800000008000000A,\
  382.                                 0x8000000080008081, 0x8000000000008080, 0x0000000080000001, 0x8000000080008008
  383.  
  384.  
  385. align 4
  386. @EXPORT:
  387.  
  388. export                                   \
  389.     lib_init        , 'lib_init'       , \
  390.     crash.hash      , 'crash_hash'     , \
  391.     crash.bin2hex   , 'crash_bin2hex'
  392.  
  393.