Subversion Repositories Kolibri OS

Rev

Rev 3431 | Blame | Last modification | View Log | Download | RSS feed

  1. ;    libcrash -- cryptographic hash functions
  2. ;
  3. ;    Copyright (C) 2012-2013,2016 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.  
  19. SHA1_BLOCK_SIZE = 64
  20. SHA1_HASH_SIZE  = 20
  21. SHA1_ALIGN      = 4
  22. SHA1_ALIGN_MASK = SHA1_ALIGN - 1
  23.  
  24. struct ctx_sha1
  25.         hash            rb SHA1_HASH_SIZE
  26.         block           rb SHA1_BLOCK_SIZE
  27.         index           rd 1
  28.         msglen_0        rd 1
  29.         msglen_1        rd 1
  30. ends
  31.  
  32.  
  33. proc sha1._.f
  34.         push    ebx ecx edx
  35.         xor     ecx, edx
  36.         and     ebx, ecx
  37.         xor     ebx, edx
  38.         mov     esi, ebx
  39.         pop     edx ecx ebx
  40.         ret
  41. endp
  42.  
  43. proc sha1._.g
  44.         push    ebx ecx edx
  45.         xor     ebx, ecx
  46.         xor     ebx, edx
  47.         mov     esi, ebx
  48.         pop     edx ecx ebx
  49.         ret
  50. endp
  51.  
  52. proc sha1._.h
  53.         push    ebx ecx edx
  54.         mov     esi, ebx
  55.         and     ebx, ecx
  56.         and     ecx, edx
  57.         and     esi, edx
  58.         or      ebx, ecx
  59.         or      esi, ebx
  60.         pop     edx ecx ebx
  61.         ret
  62. endp
  63.  
  64. macro sha1._.round f, k, c
  65. {
  66.         mov     esi, eax
  67.         rol     esi, 5
  68.         mov     [temp], esi
  69.         call    f
  70.  
  71.         add     esi, edi
  72.         add     [temp], esi
  73.         mov     esi, [w + (c)*4]
  74.         add     esi, k
  75.         add     [temp], esi
  76.  
  77.         mov     edi, edx
  78.         mov     edx, ecx
  79.         mov     ecx, ebx
  80.         rol     ecx, 30
  81.         mov     ebx, eax
  82.         mov     eax, [temp]
  83. }
  84.  
  85.  
  86. proc sha1.init _ctx
  87.         mov     ebx, [_ctx]
  88.         lea     edi, [ebx + ctx_sha1.hash]
  89.         mov     esi, sha1._.hash_init
  90.         mov     ecx, SHA1_HASH_SIZE/4
  91.         rep     movsd
  92.         xor     eax, eax
  93.         mov     [ebx + ctx_sha1.index], eax
  94.         mov     [ebx + ctx_sha1.msglen_0], eax
  95.         mov     [ebx + ctx_sha1.msglen_1], eax
  96.         ret
  97. endp
  98.  
  99.  
  100. proc sha1._.block _hash
  101. locals
  102.         temp     rd 1
  103.         w        rd 80
  104. endl
  105.         lea     edi, [w]
  106.         xor     ecx, ecx
  107.     @@:
  108.         mov     eax, [esi]
  109.         add     esi, 4
  110.         bswap   eax
  111.         mov     [edi], eax
  112.         add     edi, 4
  113.         add     ecx, 1
  114.         cmp     ecx, 16
  115.         jne     @b
  116.     @@:
  117.         mov     eax, [w + (ecx -  3)*4]
  118.         xor     eax, [w + (ecx -  8)*4]
  119.         xor     eax, [w + (ecx - 14)*4]
  120.         xor     eax, [w + (ecx - 16)*4]
  121.         rol     eax, 1
  122.         mov     [w + ecx*4], eax
  123.         add     ecx, 1
  124.         cmp     ecx, 80
  125.         jne     @b
  126.  
  127.         mov     edi, [_hash]
  128.         mov     eax, [edi + 0x00]
  129.         mov     ebx, [edi + 0x04]
  130.         mov     ecx, [edi + 0x08]
  131.         mov     edx, [edi + 0x0c]
  132.         mov     edi, [edi + 0x10]
  133.  
  134.         push    esi
  135.  
  136. repeat 20
  137.         sha1._.round    sha1._.f, 0x5a827999, %-1
  138. end repeat
  139.  
  140. repeat 20
  141.         sha1._.round    sha1._.g, 0x6ed9eba1, %-1+20
  142. end repeat
  143.  
  144. repeat 20
  145.         sha1._.round    sha1._.h, 0x8f1bbcdc, %-1+40
  146. end repeat
  147.  
  148. repeat 20
  149.         sha1._.round    sha1._.g, 0xca62c1d6, %-1+60
  150. end repeat
  151.  
  152.         pop     esi
  153.  
  154.         mov     [temp], edi
  155.         mov     edi, [_hash]
  156.         add     [edi + 0x00], eax
  157.         add     [edi + 0x04], ebx
  158.         add     [edi + 0x08], ecx
  159.         add     [edi + 0x0c], edx
  160.         mov     eax, [temp]
  161.         add     [edi + 0x10], eax
  162.  
  163.         ret
  164. endp
  165.  
  166.  
  167. proc sha1.update _ctx, _msg, _size
  168.         mov     ebx, [_ctx]
  169.         mov     ecx, [_size]
  170.         add     [ebx + ctx_sha1.msglen_0], ecx
  171.         adc     [ebx + ctx_sha1.msglen_1], 0
  172.  
  173.   .next_block:
  174.         mov     ebx, [_ctx]
  175.         mov     esi, [_msg]
  176.         mov     eax, [ebx + ctx_sha1.index]
  177.         and     eax, SHA1_BLOCK_SIZE-1
  178.         jnz     .copy_to_buf
  179.         test    esi, SHA1_ALIGN_MASK
  180.         jnz     .copy_to_buf
  181.   .no_copy:
  182.         ; data is aligned, hash it in place without copying
  183.         mov     ebx, [_ctx]
  184.         cmp     [_size], SHA1_BLOCK_SIZE
  185.         jb      .copy_quit
  186.         lea     eax, [ebx + ctx_sha1.hash]
  187.         stdcall sha1._.block, eax
  188.         sub     [_size], SHA1_BLOCK_SIZE
  189. ;        add     esi, SHA1_BLOCK_SIZE           ; FIXME
  190.         jmp     .no_copy
  191.  
  192.   .copy_to_buf:
  193.         lea     edi, [ebx + ctx_sha1.block]
  194.         add     edi, eax
  195.         mov     ecx, SHA1_BLOCK_SIZE
  196.         sub     ecx, eax
  197.         cmp     [_size], ecx
  198.         jb      .copy_quit
  199.         sub     [_size], ecx
  200.         add     [_msg], ecx
  201.         add     [ebx + ctx_sha1.index], ecx
  202.         rep     movsb
  203.         lea     eax, [ebx + ctx_sha1.hash]
  204.         lea     esi, [ebx + ctx_sha1.block]
  205.         stdcall sha1._.block, eax
  206.         jmp     .next_block
  207.  
  208.   .copy_quit:
  209.         mov     ebx, [_ctx]
  210.         lea     edi, [ebx + ctx_sha1.block]
  211.         mov     eax, [ebx + ctx_sha1.index]
  212.         and     eax, SHA1_BLOCK_SIZE-1
  213.         add     edi, eax
  214.         mov     ecx, [_size]
  215.         add     [ebx + ctx_sha1.index], ecx
  216.         rep     movsb
  217.   .quit:
  218.  
  219.         ret
  220. endp
  221.  
  222.  
  223. proc sha1.final _ctx
  224.         mov     ebx, [_ctx]
  225.         lea     edi, [ebx + ctx_sha1.block]
  226.         mov     ecx, [ebx + ctx_sha1.msglen_0]
  227.         and     ecx, SHA1_BLOCK_SIZE-1
  228.         add     edi, ecx
  229.         mov     byte[edi], 0x80
  230.         inc     edi
  231.         neg     ecx
  232.         add     ecx, SHA1_BLOCK_SIZE
  233.         cmp     ecx, 8
  234.         ja      .last
  235.  
  236.         dec     ecx
  237.         xor     eax, eax
  238.         rep     stosb
  239.         lea     esi, [ebx + ctx_sha1.block]
  240.         lea     eax, [ebx + ctx_sha1.hash]
  241.         stdcall sha1._.block, eax
  242.         mov     ebx, [_ctx]
  243.         lea     edi, [ebx + ctx_sha1.block]
  244.         mov     ecx, SHA1_BLOCK_SIZE+1
  245.   .last:
  246.         dec     ecx
  247.         sub     ecx, 8
  248.         xor     eax, eax
  249.         rep     stosb
  250.         mov     eax, [ebx + ctx_sha1.msglen_0]
  251.         mov     edx, [ebx + ctx_sha1.msglen_1]
  252.         shld    edx, eax, 3
  253.         shl     eax, 3
  254.         bswap   eax
  255.         bswap   edx
  256.         mov     dword[edi], edx
  257.         mov     dword[edi+4], eax
  258.         lea     esi, [ebx + ctx_sha1.block]
  259.         lea     eax, [ebx + ctx_sha1.hash]
  260.         stdcall sha1._.block, eax
  261.  
  262.         mov     ebx, [_ctx]
  263.         lea     eax, [ebx + ctx_sha1.hash]
  264.         stdcall sha1._.postprocess, ebx, eax
  265.  
  266.         ret
  267. endp
  268.  
  269.  
  270. proc sha1._.postprocess _ctx, _hash
  271.         mov     ecx, 5
  272.         mov     esi, [_hash]
  273.         mov     edi, esi
  274.     @@:
  275.         lodsd
  276.         bswap   eax
  277.         stosd
  278.         dec     ecx
  279.         jnz     @b
  280.         ret
  281. endp
  282.  
  283.  
  284. align SHA1_ALIGN
  285.  
  286. sha1._.hash_init dd 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0
  287.  
  288.