Subversion Repositories Kolibri OS

Rev

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

  1. ;    libcrash -- cryptographic hash functions
  2. ;
  3. ;    Copyright (C) 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. macro sha3._.rol_xor nd, ncl, ncr
  20. {
  21.         movq    mm0, [C + 8*(ncl)]
  22.         movq    mm1, mm0
  23.         psllq   mm0, 1
  24.         psrlq   mm1, 63
  25.         por     mm0, mm1
  26.         pxor    mm0, [C + 8*(ncr)]
  27.         movq    [D + 8*(nd)], mm0
  28. }
  29.  
  30. proc sha3._.theta
  31. ;locals
  32. ;        C       rq 5
  33. ;        D       rq 5
  34. ;endl
  35. C equ ebx + ctx_sha3.C
  36. D equ ebx + ctx_sha3.D
  37.  
  38. repeat 5
  39.         movq    mm0, [edi + 8*(%-1 +  0)]
  40.         pxor    mm0, [edi + 8*(%-1 +  5)]
  41.         pxor    mm0, [edi + 8*(%-1 + 10)]
  42.         pxor    mm0, [edi + 8*(%-1 + 15)]
  43.         pxor    mm0, [edi + 8*(%-1 + 20)]
  44.         movq    [C + 8*(%-1)], mm0
  45. end repeat
  46.  
  47.         sha3._.rol_xor  0, 1, 4
  48.         sha3._.rol_xor  1, 2, 0
  49.         sha3._.rol_xor  2, 3, 1
  50.         sha3._.rol_xor  3, 4, 2
  51.         sha3._.rol_xor  4, 0, 3
  52.  
  53. repeat 5
  54.         movq    mm1, [D + 8*(%-1)]
  55.         movq    mm0, mm1
  56.         pxor    mm0, [edi + 8*(%-1 +  0)]
  57.         movq    [edi + 8*(%-1 +  0)], mm0
  58.         movq    mm0, mm1
  59.         pxor    mm0, [edi + 8*(%-1 +  5)]
  60.         movq    [edi + 8*(%-1 +  5)], mm0
  61.         movq    mm0, mm1
  62.         pxor    mm0, [edi + 8*(%-1 + 10)]
  63.         movq    [edi + 8*(%-1 + 10)], mm0
  64.         movq    mm0, mm1
  65.         pxor    mm0, [edi + 8*(%-1 + 15)]
  66.         movq    [edi + 8*(%-1 + 15)], mm0
  67.         movq    mm0, mm1
  68.         pxor    mm0, [edi + 8*(%-1 + 20)]
  69.         movq    [edi + 8*(%-1 + 20)], mm0
  70. end repeat
  71.  
  72. restore C,D
  73.         ret
  74. endp
  75.  
  76.  
  77. proc sha3._.pi
  78.         movq    mm1, [edi + 8*1]
  79.         movq    mm0, [edi + 8*6]
  80.         movq    [edi + 8*1], mm0
  81.         movq    mm0, [edi + 8*9]
  82.         movq    [edi + 8*6], mm0
  83.         movq    mm0, [edi + 8*22]
  84.         movq    [edi + 8*9], mm0
  85.         movq    mm0, [edi + 8*14]
  86.         movq    [edi + 8*22], mm0
  87.         movq    mm0, [edi + 8*20]
  88.         movq    [edi + 8*14], mm0
  89.         movq    mm0, [edi + 8*2]
  90.         movq    [edi + 8*20], mm0
  91.         movq    mm0, [edi + 8*12]
  92.         movq    [edi + 8*2], mm0
  93.         movq    mm0, [edi + 8*13]
  94.         movq    [edi + 8*12], mm0
  95.         movq    mm0, [edi + 8*19]
  96.         movq    [edi + 8*13], mm0
  97.         movq    mm0, [edi + 8*23]
  98.         movq    [edi + 8*19], mm0
  99.         movq    mm0, [edi + 8*15]
  100.         movq    [edi + 8*23], mm0
  101.         movq    mm0, [edi + 8*4]
  102.         movq    [edi + 8*15], mm0
  103.         movq    mm0, [edi + 8*24]
  104.         movq    [edi + 8*4], mm0
  105.         movq    mm0, [edi + 8*21]
  106.         movq    [edi + 8*24], mm0
  107.         movq    mm0, [edi + 8*8]
  108.         movq    [edi + 8*21], mm0
  109.         movq    mm0, [edi + 8*16]
  110.         movq    [edi + 8*8], mm0
  111.         movq    mm0, [edi + 8*5]
  112.         movq    [edi + 8*16], mm0
  113.         movq    mm0, [edi + 8*3]
  114.         movq    [edi + 8*5], mm0
  115.         movq    mm0, [edi + 8*18]
  116.         movq    [edi + 8*3], mm0
  117.         movq    mm0, [edi + 8*17]
  118.         movq    [edi + 8*18], mm0
  119.         movq    mm0, [edi + 8*11]
  120.         movq    [edi + 8*17], mm0
  121.         movq    mm0, [edi + 8*7]
  122.         movq    [edi + 8*11], mm0
  123.         movq    mm0, [edi + 8*10]
  124.         movq    [edi + 8*7], mm0
  125.         movq    [edi + 8*10], mm1
  126.  
  127.         ret
  128. endp
  129.  
  130.  
  131. proc sha3._.chi
  132.  
  133.         mov     eax, 0xffffffff
  134.         movd    mm0, eax
  135.         movq    mm2, mm0
  136.         punpckldq       mm2, mm0
  137.  
  138. repeat 5
  139.         movq    mm6, [edi + 8*(0 + 5*(%-1))]
  140.         movq    mm7, [edi + 8*(1 + 5*(%-1))]
  141.  
  142.         movq    mm0, [edi + 8*(0 + 5*(%-1))]
  143.         movq    mm1, mm7
  144.         pandn   mm1, mm2
  145.         pand    mm1, [edi + 8*(2 + 5*(%-1))]
  146.         pxor    mm0, mm1
  147.         movq    [edi + 8*(0 + 5*(%-1))], mm0
  148.  
  149.         movq    mm0, [edi + 8*(1 + 5*(%-1))]
  150.         movq    mm1, [edi + 8*(2 + 5*(%-1))]
  151.         pandn   mm1, mm2
  152.         pand    mm1, [edi + 8*(3 + 5*(%-1))]
  153.         pxor    mm0, mm1
  154.         movq    [edi + 8*(1 + 5*(%-1))], mm0
  155.  
  156.         movq    mm0, [edi + 8*(2 + 5*(%-1))]
  157.         movq    mm1, [edi + 8*(3 + 5*(%-1))]
  158.         pandn   mm1, mm2
  159.         pand    mm1, [edi + 8*(4 + 5*(%-1))]
  160.         pxor    mm0, mm1
  161.         movq    [edi + 8*(2 + 5*(%-1))], mm0
  162.  
  163.         movq    mm0, [edi + 8*(3 + 5*(%-1))]
  164.         movq    mm1, [edi + 8*(4 + 5*(%-1))]
  165.         pandn   mm1, mm2
  166.         pand    mm1, mm6
  167.         pxor    mm0, mm1
  168.         movq    [edi + 8*(3 + 5*(%-1))], mm0
  169.  
  170.         movq    mm0, [edi + 8*(4 + 5*(%-1))]
  171.         movq    mm1, mm6
  172.         pandn   mm1, mm2
  173.         pand    mm1, mm7
  174.         pxor    mm0, mm1
  175.         movq    [edi + 8*(4 + 5*(%-1))], mm0
  176. end repeat
  177.         ret
  178. endp
  179.  
  180.  
  181. macro sha3._.rol_mov n, c
  182. {
  183.         movq    mm0, [edi + 8*(n)]
  184.         movq    mm1, mm0
  185.         psllq   mm0, (c)
  186.         psrlq   mm1, (64-(c))
  187.         por     mm0, mm1
  188.         movq    [edi + 8*(n)], mm0
  189. }
  190.  
  191. proc sha3._.permutation
  192.  
  193. repeat 24
  194.         stdcall sha3._.theta
  195.  
  196.         sha3._.rol_mov   1,  1
  197.         sha3._.rol_mov   2, 62
  198.         sha3._.rol_mov   3, 28
  199.         sha3._.rol_mov   4, 27
  200.         sha3._.rol_mov   5, 36
  201.         sha3._.rol_mov   6, 44
  202.         sha3._.rol_mov   7,  6
  203.         sha3._.rol_mov   8, 55
  204.         sha3._.rol_mov   9, 20
  205.         sha3._.rol_mov  10,  3
  206.         sha3._.rol_mov  11, 10
  207.         sha3._.rol_mov  12, 43
  208.         sha3._.rol_mov  13, 25
  209.         sha3._.rol_mov  14, 39
  210.         sha3._.rol_mov  15, 41
  211.         sha3._.rol_mov  16, 45
  212.         sha3._.rol_mov  17, 15
  213.         sha3._.rol_mov  18, 21
  214.         sha3._.rol_mov  19,  8
  215.         sha3._.rol_mov  20, 18
  216.         sha3._.rol_mov  21,  2
  217.         sha3._.rol_mov  22, 61
  218.         sha3._.rol_mov  23, 56
  219.         sha3._.rol_mov  24, 14
  220.  
  221.         stdcall sha3._.pi
  222.         stdcall sha3._.chi
  223.  
  224.         movq    mm0, [edi + 8*(0)]
  225.         pxor    mm0, [sha3._.round + 8*(%-1)]
  226.         movq    [edi + 8*(0)], mm0
  227. end repeat
  228.  
  229.         ret
  230. endp
  231.  
  232.  
  233. proc sha3._.init _ctx
  234.         mov     [ebx + ctx_sha3.block_size], eax
  235.         shr     eax, 3
  236.         dec     eax
  237.         mov     [ebx + ctx_sha3.rounds_cnt], eax
  238.         xor     eax, eax
  239.         lea     edi, [ebx + ctx_sha3.hash]
  240.         mov     ecx, SHA3_INIT_SIZE/4
  241.         rep     stosd
  242.         mov     [ebx + ctx_sha3.index], eax
  243.         ret
  244. endp
  245.  
  246.  
  247. proc sha3224.init _ctx
  248.         mov     ebx, [_ctx]
  249.         mov     eax, SHA3224_BLOCK_SIZE
  250.         stdcall sha3._.init
  251.         ret
  252. endp
  253.  
  254.  
  255. proc sha3256.init _ctx
  256.         mov     ebx, [_ctx]
  257.         mov     eax, SHA3256_BLOCK_SIZE
  258.         stdcall sha3._.init
  259.         ret
  260. endp
  261.  
  262.  
  263. proc sha3384.init _ctx
  264.         mov     ebx, [_ctx]
  265.         mov     eax, SHA3384_BLOCK_SIZE
  266.         stdcall sha3._.init
  267.         ret
  268. endp
  269.  
  270.  
  271. proc sha3512.init _ctx
  272.         mov     ebx, [_ctx]
  273.         mov     eax, SHA3512_BLOCK_SIZE
  274.         stdcall sha3._.init
  275.         ret
  276. endp
  277.  
  278.  
  279. proc sha3._.block _hash
  280.         mov     ecx, [ebx + ctx_sha3.rounds_cnt]
  281.         mov     edi, [_hash]
  282.  
  283.     @@:
  284.         movq    mm0, [esi + 8*ecx]
  285.         pxor    mm0, [edi + 8*ecx]
  286.         movq    [edi + 8*ecx], mm0
  287.         dec     ecx
  288.         jns     @b
  289.  
  290.         stdcall sha3._.permutation
  291.  
  292.         ret
  293. endp
  294.  
  295.  
  296. sha3224.update = sha3.update
  297. sha3256.update = sha3.update
  298. sha3384.update = sha3.update
  299. sha3512.update = sha3.update
  300. proc sha3.update _ctx, _msg, _size
  301.   .next_block:
  302.         mov     ebx, [_ctx]
  303.         mov     esi, [_msg]
  304.         mov     eax, [ebx + ctx_sha3.index]
  305.         test    eax, eax
  306.         jnz     .copy_to_buf
  307.         test    esi, SHA3_ALIGN_MASK
  308.         jnz     .copy_to_buf
  309.   .no_copy:
  310.         ; data is aligned, hash it in place without copying
  311.         mov     ebx, [_ctx]
  312.         mov     eax, [ebx + ctx_sha3.block_size]
  313.         cmp     [_size], eax
  314.         jb      .copy_quit
  315.         lea     eax, [ebx + ctx_sha3.hash]
  316.         push    ebx esi
  317.         stdcall sha3._.block, eax
  318.         pop     esi ebx
  319.         mov     eax, [ebx + ctx_sha3.block_size]
  320.         sub     [_size], eax
  321.         add     esi, [ebx + ctx_sha3.block_size]
  322.         jmp     .no_copy
  323.  
  324.   .copy_to_buf:
  325.         lea     edi, [ebx + ctx_sha3.block]
  326.         add     edi, eax
  327.         mov     ecx, [ebx + ctx_sha3.block_size]
  328.         sub     ecx, eax
  329.         cmp     [_size], ecx
  330.         jb      .copy_quit
  331.         sub     [_size], ecx
  332.         add     [_msg], ecx
  333.         add     [ebx + ctx_sha3.index], ecx
  334.         mov     eax, [ebx + ctx_sha3.block_size]
  335.         cmp     [ebx + ctx_sha3.index], eax
  336.         jb      @f
  337.         sub     [ebx + ctx_sha3.index], eax
  338.     @@:
  339.         rep     movsb
  340.         lea     eax, [ebx + ctx_sha3.hash]
  341.         lea     esi, [ebx + ctx_sha3.block]
  342.         stdcall sha3._.block, eax
  343.         jmp     .next_block
  344.  
  345.   .copy_quit:
  346.         mov     ebx, [_ctx]
  347.         lea     edi, [ebx + ctx_sha3.block]
  348.         mov     eax, [ebx + ctx_sha3.index]
  349.         add     edi, eax
  350.         mov     ecx, [_size]
  351.         add     [ebx + ctx_sha3.index], ecx
  352.         rep     movsb
  353.   .quit:
  354.         ret
  355. endp
  356.  
  357.  
  358. sha3224.final = sha3.final
  359. sha3256.final = sha3.final
  360. sha3384.final = sha3.final
  361. sha3512.final = sha3.final
  362. proc sha3.final _ctx
  363.         pushad
  364.         mov     ebx, [_ctx]
  365.         mov     eax, [ebx + ctx_sha3.index]
  366.         xor     edx, edx
  367.         mov     ecx, [ebx + ctx_sha3.block_size]
  368.         div     ecx
  369.         sub     ecx, edx
  370.         ja      @f
  371.         add     ecx, [ebx + ctx_sha3.block_size]
  372.     @@:
  373.         add     [ebx + ctx_sha3.index], ecx
  374.         mov     eax, [ebx + ctx_sha3.block_size]
  375.         cmp     [ebx + ctx_sha3.index], eax
  376.         jb      @f
  377.         sub     [ebx + ctx_sha3.index], eax
  378.     @@:
  379.  
  380.         mov     byte[edi], 0x06
  381.         inc     edi
  382.         dec     ecx
  383.         xor     eax, eax
  384.         rep     stosb
  385.         or      byte[edi - 1], 0x80
  386.  
  387.         mov     ebx, [_ctx]
  388.         lea     esi, [ebx + ctx_sha3.block]
  389.         lea     eax, [ebx + ctx_sha3.hash]
  390.         stdcall sha3._.block, eax
  391.  
  392.         mov     ebx, [_ctx]
  393.         lea     eax, [ebx + ctx_sha3.hash]
  394.         stdcall sha3._.postprocess, ebx, eax
  395.  
  396.         popad
  397.         ret
  398. endp
  399.  
  400.  
  401. proc sha3._.postprocess _ctx, _hash
  402.         emms
  403.         ret
  404. endp
  405.  
  406.  
  407. align SHA3_ALIGN
  408.  
  409. sha3._.round    dq 0x0000000000000001, 0x0000000000008082, 0x800000000000808A,\
  410.                    0x8000000080008000, 0x000000000000808B, 0x0000000080000001,\
  411.                    0x8000000080008081, 0x8000000000008009, 0x000000000000008A,\
  412.                    0x0000000000000088, 0x0000000080008009, 0x000000008000000A,\
  413.                    0x000000008000808B, 0x800000000000008B, 0x8000000000008089,\
  414.                    0x8000000000008003, 0x8000000000008002, 0x8000000000000080,\
  415.                    0x000000000000800A, 0x800000008000000A, 0x8000000080008081,\
  416.                    0x8000000000008080, 0x0000000080000001, 0x8000000080008008
  417.  
  418.