Subversion Repositories Kolibri OS

Rev

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

  1. macro chn x, y, z
  2. {
  3.         movq    mm0, [y]
  4.         pxor    mm0, [z]
  5.         pand    mm0, [x]
  6.         pxor    mm0, [z]
  7. }
  8.  
  9. macro maj x, y, z
  10. {
  11.         movq    mm0, [x]
  12.         pxor    mm0, [y]
  13.         pand    mm0, [z]
  14.         movq    mm2, [x]
  15.         pand    mm2, [y]
  16.         pxor    mm0, mm2
  17. }
  18.  
  19. macro Sigma0 x
  20. {
  21.         movq    mm0, x
  22.         movq    mm2, mm0
  23.         movq    mm7, mm2
  24.         psrlq   mm2, 28
  25.         psllq   mm7, 36
  26.         por     mm2, mm7
  27.         movq    mm7, mm0
  28.         psrlq   mm0, 34
  29.         psllq   mm7, 30
  30.         por     mm0, mm7
  31.         pxor    mm0, mm2
  32.         movq    mm2, x
  33.         movq    mm7, mm2
  34.         psrlq   mm2, 39
  35.         psllq   mm7, 25
  36.         por     mm2, mm7
  37.         pxor    mm0, mm2
  38. }
  39.  
  40. macro Sigma1 x
  41. {
  42.         movq    mm0, x
  43.         movq    mm2, mm0
  44.         movq    mm7, mm2
  45.         psrlq   mm2, 14
  46.         psllq   mm7, 50
  47.         por     mm2, mm7
  48.         movq    mm7, mm0
  49.         psrlq   mm0, 18
  50.         psllq   mm7, 46
  51.         por     mm0, mm7
  52.         pxor    mm0, mm2
  53.         movq    mm2, x
  54.         movq    mm7, mm2
  55.         psrlq   mm2, 41
  56.         psllq   mm7, 23
  57.         por     mm2, mm7
  58.         pxor    mm0, mm2
  59. }
  60.  
  61. macro sigma0 x
  62. {
  63.         movq    mm0, x
  64.         movq    mm2, mm0
  65.         movq    mm7, mm2
  66.         psrlq   mm2, 1
  67.         psllq   mm7, 63
  68.         por     mm2, mm7
  69.         movq    mm7, mm0
  70.         psrlq   mm0, 8
  71.         psllq   mm7, 56
  72.         por     mm0, mm7
  73.         pxor    mm0, mm2
  74.         movq    mm2, x
  75.         psrlq   mm2, 7
  76.         pxor    mm0, mm2
  77. }
  78.  
  79. macro sigma1 x
  80. {
  81.         movq    mm0, x
  82.         movq    mm2, mm0
  83.         movq    mm7, mm2
  84.         psrlq   mm2, 19
  85.         psllq   mm7, 45
  86.         por     mm2, mm7
  87.         movq    mm7, mm0
  88.         psrlq   mm0, 61
  89.         psllq   mm7, 3
  90.         por     mm0, mm7
  91.         pxor    mm0, mm2
  92.         movq    mm2, x
  93.         psrlq   mm2, 6
  94.         pxor    mm0, mm2
  95. }
  96.  
  97. macro recalculate_w n
  98. {
  99.         movq    mm3, [w + ((n-2) and 15)*8]
  100.         sigma1  mm3
  101.         paddq   mm0, [w + ((n-7) and 15)*8]
  102.         movq    mm6, mm0
  103.         movq    mm3, [w + ((n-15) and 15)*8]
  104.         sigma0  mm3
  105.         movq    mm2, mm6
  106.         paddq   mm0, mm2
  107.         movq    mm7, [w + (n)*8]
  108.         paddq   mm7, mm0
  109.         movq    [w + (n)*8], mm7
  110. }
  111.  
  112. macro crash.sha512.round a, b, c, d, e, f, g, h, k
  113. {
  114.         movq    mm1, [h]
  115.         movq    mm3, [e]
  116.         Sigma1  mm3
  117.         paddq   mm1, mm0
  118.         chn     e, f, g
  119.         paddq   mm1, mm0
  120.         paddq   mm1, [k]
  121.         paddq   mm1, mm5
  122.         movq    mm7, [d]
  123.         paddq   mm7, mm1
  124.         movq    [d], mm7
  125.         movq    mm3, [a]
  126.         Sigma0  mm3
  127.         paddq   mm1, mm0
  128.         maj     a, b, c
  129.         paddq   mm0, mm1
  130.         movq    [h], mm0
  131. }
  132.  
  133.  
  134. macro crash.sha512.round_1_16 a, b, c, d, e, f, g, h, n
  135. {
  136.  
  137.         movq    mm0, [esi + (n)*8]
  138.         movq    [temp], mm0
  139.         mov     eax, dword[temp]
  140.         bswap   eax
  141.         push    eax
  142.         mov     eax, dword[temp + 4]
  143.         bswap   eax
  144.         mov     dword[temp], eax
  145.         pop     eax
  146.         mov     dword[temp + 4], eax
  147.         movq    mm0, [temp]
  148.         movq    [w + (n)*8], mm0
  149.         movq    mm5, mm0
  150.         crash.sha512.round a, b, c, d, e, f, g, h, (crash._.sha512_table + (n)*8)
  151. }
  152.  
  153. macro crash.sha512.round_17_64 a, b, c, d, e, f, g, h, n, rep_num
  154. {
  155.         recalculate_w n
  156.         movq    mm5, [w + (n)*8]
  157.         crash.sha512.round a, b, c, d, e, f, g, h, (crash._.sha512_table + (n+16*rep_num)*8)
  158. }
  159.  
  160.  
  161. proc crash.sha512 _sha512, _data, _len, _callback, _msglen
  162. locals
  163.         final   rd 1
  164.         w       rq 80
  165.         A       rq 1
  166.         B       rq 1
  167.         C       rq 1
  168.         D       rq 1
  169.         E       rq 1
  170.         F       rq 1
  171.         G       rq 1
  172.         H       rq 1
  173.         temp    rq 1
  174. endl
  175.         mov     [final], 0
  176.   .first:
  177.         mov     eax, [_msglen]
  178.         mov     ecx, [_len]
  179.         add     [eax], ecx
  180.         mov     esi, [_data]
  181.         test    ecx, ecx
  182.         jz      .callback
  183.   .begin:
  184.         sub     [_len], 128
  185.         jnc     @f
  186.         add     [_len], 128
  187.         jmp     .endofblock
  188.     @@:
  189.         mov     edi, [_sha512]
  190.         movq    mm0, [edi + 0x00]
  191.         movq    [A], mm0
  192.         movq    mm0, [edi + 0x08]
  193.         movq    [B], mm0
  194.         movq    mm0, [edi + 0x10]
  195.         movq    [C], mm0
  196.         movq    mm0, [edi + 0x18]
  197.         movq    [D], mm0
  198.         movq    mm0, [edi + 0x20]
  199.         movq    [E], mm0
  200.         movq    mm0, [edi + 0x28]
  201.         movq    [F], mm0
  202.         movq    mm0, [edi + 0x30]
  203.         movq    [G], mm0
  204.         movq    mm0, [edi + 0x38]
  205.         movq    [H], mm0
  206.  
  207.  
  208.         crash.sha512.round_1_16         A, B, C, D, E, F, G, H,  0
  209.         crash.sha512.round_1_16         H, A, B, C, D, E, F, G,  1
  210.         crash.sha512.round_1_16         G, H, A, B, C, D, E, F,  2
  211.         crash.sha512.round_1_16         F, G, H, A, B, C, D, E,  3
  212.         crash.sha512.round_1_16         E, F, G, H, A, B, C, D,  4
  213.         crash.sha512.round_1_16         D, E, F, G, H, A, B, C,  5
  214.         crash.sha512.round_1_16         C, D, E, F, G, H, A, B,  6
  215.         crash.sha512.round_1_16         B, C, D, E, F, G, H, A,  7
  216.         crash.sha512.round_1_16         A, B, C, D, E, F, G, H,  8
  217.         crash.sha512.round_1_16         H, A, B, C, D, E, F, G,  9
  218.         crash.sha512.round_1_16         G, H, A, B, C, D, E, F, 10
  219.         crash.sha512.round_1_16         F, G, H, A, B, C, D, E, 11
  220.         crash.sha512.round_1_16         E, F, G, H, A, B, C, D, 12
  221.         crash.sha512.round_1_16         D, E, F, G, H, A, B, C, 13
  222.         crash.sha512.round_1_16         C, D, E, F, G, H, A, B, 14
  223.         crash.sha512.round_1_16         B, C, D, E, F, G, H, A, 15
  224.  
  225. repeat 4
  226.         crash.sha512.round_17_64        A, B, C, D, E, F, G, H,  0, %
  227.         crash.sha512.round_17_64        H, A, B, C, D, E, F, G,  1, %
  228.         crash.sha512.round_17_64        G, H, A, B, C, D, E, F,  2, %
  229.         crash.sha512.round_17_64        F, G, H, A, B, C, D, E,  3, %
  230.         crash.sha512.round_17_64        E, F, G, H, A, B, C, D,  4, %
  231.         crash.sha512.round_17_64        D, E, F, G, H, A, B, C,  5, %
  232.         crash.sha512.round_17_64        C, D, E, F, G, H, A, B,  6, %
  233.         crash.sha512.round_17_64        B, C, D, E, F, G, H, A,  7, %
  234.         crash.sha512.round_17_64        A, B, C, D, E, F, G, H,  8, %
  235.         crash.sha512.round_17_64        H, A, B, C, D, E, F, G,  9, %
  236.         crash.sha512.round_17_64        G, H, A, B, C, D, E, F, 10, %
  237.         crash.sha512.round_17_64        F, G, H, A, B, C, D, E, 11, %
  238.         crash.sha512.round_17_64        E, F, G, H, A, B, C, D, 12, %
  239.         crash.sha512.round_17_64        D, E, F, G, H, A, B, C, 13, %
  240.         crash.sha512.round_17_64        C, D, E, F, G, H, A, B, 14, %
  241.         crash.sha512.round_17_64        B, C, D, E, F, G, H, A, 15, %
  242. end repeat
  243.  
  244.  
  245.         mov     edi, [_sha512]
  246.         movq    mm0, [A]
  247.         paddq   mm0, [edi + 0x00]
  248.         movq    [edi + 0x00], mm0
  249.         movq    mm0, [B]
  250.         paddq   mm0, [edi + 0x08]
  251.         movq    [edi + 0x08], mm0
  252.         movq    mm0, [C]
  253.         paddq   mm0, [edi + 0x10]
  254.         movq    [edi + 0x10], mm0
  255.         movq    mm0, [D]
  256.         paddq   mm0, [edi + 0x18]
  257.         movq    [edi + 0x18], mm0
  258.         movq    mm0, [E]
  259.         paddq   mm0, [edi + 0x20]
  260.         movq    [edi + 0x20], mm0
  261.         movq    mm0, [F]
  262.         paddq   mm0, [edi + 0x28]
  263.         movq    [edi + 0x28], mm0
  264.         movq    mm0, [G]
  265.         paddq   mm0, [edi + 0x30]
  266.         movq    [edi + 0x30], mm0
  267.         movq    mm0, [H]
  268.         paddq   mm0, [edi + 0x38]
  269.         movq    [edi + 0x38], mm0
  270.         add     esi, 128
  271.         jmp     .begin
  272.   .endofblock:
  273.         cmp     [final], 1
  274.         je      .quit
  275.  
  276.   .callback:
  277.         mov     eax, [_callback]
  278.         test    eax, eax
  279.         jz      @f
  280.         call    eax
  281.         test    eax, eax
  282.         jz      @f
  283.         mov     [_len], eax
  284.         jmp     .first
  285.     @@:
  286.  
  287.         mov     edi, [_data]
  288.         mov     ecx, [_len]
  289.         rep     movsb
  290.         mov     eax, [_msglen]
  291.         mov     eax, [eax]
  292.         and     eax, 127
  293.         mov     ecx, 112
  294.         sub     ecx, eax
  295.         ja      @f
  296.         add     ecx, 128
  297.     @@:
  298.         add     [_len], ecx
  299.         mov     byte[edi], 0x80
  300.         add     edi, 1
  301.         sub     ecx, 1
  302.         mov     al, 0
  303.         rep     stosb
  304.         xor     eax, eax
  305.         stosd
  306.         stosd
  307.         mov     eax, [_msglen]
  308.         mov     eax, [eax]
  309.         mov     edx, 8
  310.         mul     edx
  311.         bswap   eax
  312.         bswap   edx
  313.         mov     dword[edi], edx
  314.         mov     dword[edi + 4], eax
  315.         add     [_len], 16
  316.         mov     [final], 1
  317.         jmp     .first
  318.   .quit:
  319.         mov     esi, [_sha512]
  320.         mov     edi, esi
  321.         mov     ecx, 8
  322.     @@:
  323.         lodsd
  324.         bswap   eax
  325.         mov     ebx, eax
  326.         lodsd
  327.         bswap   eax
  328.         stosd
  329.         mov     eax, ebx
  330.         stosd
  331.         sub     ecx, 1
  332.         jnz     @b
  333.         emms
  334.         ret
  335. endp
  336.  
  337.