Subversion Repositories Kolibri OS

Rev

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

  1. ; Implementation of SHA-256 hash algorithm.
  2. ; Written by diamond in 2007.
  3.  
  4. iglobal
  5. align 4
  6. sha256_start_digest:
  7.         dd      0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A
  8.         dd      0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19
  9. sha256_const:
  10.         dd      0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5
  11.         dd      0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5
  12.         dd      0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3
  13.         dd      0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174
  14.         dd      0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC
  15.         dd      0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA
  16.         dd      0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7
  17.         dd      0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967
  18.         dd      0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13
  19.         dd      0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85
  20.         dd      0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3
  21.         dd      0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070
  22.         dd      0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5
  23.         dd      0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3
  24.         dd      0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208
  25.         dd      0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2
  26. endg
  27.  
  28. uglobal
  29. align 4
  30. sha256_buf      rb      64
  31. sha256_digest   rd      8
  32. sha256_count    dd      ?
  33. sha256_size     dq      ?
  34. endg
  35.  
  36. sha256_init:
  37.         mov     edi, sha256_digest
  38.         mov     esi, sha256_start_digest
  39.         push    8
  40.         pop     ecx
  41.         rep     movsd
  42.         xor     eax, eax
  43.         stosd           ; 0 bytes in buffer
  44.         stosd
  45.         stosd           ; 0 bytes processed
  46.         ret
  47.  
  48. ; Core of SHA-256: transform 64-byte 'sha256_buf' to updated 'sha256_digest'
  49. sha256_transform:
  50.         mov     esi, sha256_buf
  51.         mov     edi, esi
  52. rept 16
  53. {
  54.         lodsd
  55.         bswap   eax
  56.         stosd
  57. }
  58.         push    ebp
  59.         mov     ebp, [esi+7*4]
  60.         mov     edi, [esi+6*4]
  61.         push    dword [esi+5*4]
  62.         push    dword [esi+4*4]
  63.         push    dword [esi+3*4]
  64.         push    dword [esi+2*4]
  65.         push    dword [esi+1*4]
  66.         push    dword [esi+0*4]
  67.         xor     ecx, ecx
  68. .loop:
  69. macro cmd1 cmd,a,b
  70. {
  71. if (b and 7) = 7
  72.         cmd     a, ebp
  73. else if (b and 7) = 6
  74.         cmd     a, edi
  75. else
  76.         cmd     a, [esp+(b and 7)*4]
  77. end if
  78. }
  79. macro cmd2 cmd,a,b
  80. {
  81. if (a and 7) = 7
  82.         cmd     ebp, b
  83. else if (a and 7) = 6
  84.         cmd     edi, b
  85. else
  86.         cmd     [esp+(a and 7)*4], b
  87. end if
  88. }
  89. rept 16 counter
  90. {
  91. cmd1    mov,    eax, (5-counter)
  92.         ror     eax, 6
  93.         mov     edx, eax
  94.         ror     eax, 5
  95.         xor     edx, eax
  96.         ror     eax, 14
  97.         xor     edx, eax
  98. cmd1    mov,    eax, (6-counter)
  99. cmd1    mov,    esi, (7-counter)
  100.         xor     eax, esi
  101. cmd1    and,    eax, (5-counter)
  102.         xor     eax, esi
  103.         add     edx, eax
  104.         add     edx, [sha256_const+ecx+(counter-1)*4]
  105.         add     edx, dword [sha256_buf+(counter-1)*4]
  106.         test    ecx, ecx
  107.         jz      @f
  108.         mov     eax, dword [sha256_buf+((counter-3) and 15)*4]
  109.         mov     esi, eax
  110.         ror     eax, 17
  111.         shr     esi, 10
  112.         xor     esi, eax
  113.         ror     eax, 2
  114.         xor     esi, eax
  115.         add     esi, dword [sha256_buf+((counter-8) and 15)*4]
  116.         mov     eax, dword [sha256_buf+(counter and 15)*4]
  117.         mov     ebx, eax
  118.         ror     eax, 7
  119.         shr     ebx, 3
  120.         xor     ebx, eax
  121.         ror     eax, 11
  122.         xor     ebx, eax
  123.         add     esi, ebx
  124.         add     dword [sha256_buf+(counter-1)*4], esi
  125.         add     edx, esi
  126. @@:
  127. cmd1    add,    edx, (8-counter)
  128. cmd2    mov,    (8-counter), edx
  129. cmd2    add,    (4-counter), edx
  130. cmd1    mov,    ebx, (1-counter)
  131.         mov     eax, ebx
  132. cmd1    mov,    edx, (2-counter)
  133.         mov     esi, ebx
  134.         ror     eax, 2
  135.         or      esi, edx
  136.         and     ebx, edx
  137. cmd1    and,    esi, (3-counter)
  138.         mov     edx, eax
  139.         or      esi, ebx
  140.         ror     eax, 11
  141.         xor     edx, eax
  142.         ror     eax, 9
  143.         xor     edx, eax
  144.         add     esi, edx
  145. cmd2    add,    (8-counter), esi
  146. }
  147. purge cmd1,cmd2
  148.         add     cl, 64
  149.         jnz     .loop
  150.         mov     esi, sha256_digest
  151.         pop     eax
  152.         add     [esi+0*4], eax
  153.         pop     eax
  154.         add     [esi+1*4], eax
  155.         pop     eax
  156.         add     [esi+2*4], eax
  157.         pop     eax
  158.         add     [esi+3*4], eax
  159.         pop     eax
  160.         add     [esi+4*4], eax
  161.         pop     eax
  162.         add     [esi+5*4], eax
  163.         add     [esi+6*4], edi
  164.         add     [esi+7*4], ebp
  165.         pop     ebp
  166.         ret
  167.  
  168. sha256_update.transform:
  169.         push    esi edx
  170.         call    sha256_transform
  171.         pop     edx esi
  172.         mov     [sha256_count], ecx
  173.  
  174. sha256_update:
  175. ; in: esi->data, edx=size
  176.         mov     eax, 64
  177.         sub     eax, [sha256_count]
  178.         sub     eax, edx
  179.         sbb     ecx, ecx
  180.         and     ecx, eax
  181.         add     ecx, edx
  182.         sub     edx, ecx
  183.         mov     edi, sha256_buf
  184.         add     edi, [sha256_count]
  185.         add     [sha256_count], ecx
  186.         add     dword [sha256_size], ecx
  187.         adc     dword [sha256_size+4], 0
  188.         rep     movsb
  189.         cmp     edi, sha256_buf+64
  190.         jz      .transform
  191. .ret:
  192.         ret
  193.  
  194. sha256_final:
  195. ; out: edi->digest
  196.         push    edi
  197.         mov     eax, [sha256_count]
  198.         mov     [sha256_buf+eax], 0x80
  199.         inc     eax
  200.         cmp     al, 64-8
  201.         jbe     @f
  202.         lea     edi, [sha256_buf+eax]
  203.         push    64
  204.         pop     ecx
  205.         sub     ecx, eax
  206.         xor     eax, eax
  207.         rep     stosb
  208.         push    edx
  209.         call    sha256_transform
  210.         pop     edx
  211.         xor     eax, eax
  212. @@:
  213.         push    64-8
  214.         pop     ecx
  215.         sub     ecx, eax
  216.         lea     edi, [sha256_buf+eax]
  217.         xor     eax, eax
  218.         rep     stosb
  219.         mov     eax, dword [sha256_size]
  220.         mov     edx, dword [sha256_size+4]
  221.         shld    edx, eax, 3
  222.         shl     eax, 3
  223.         bswap   edx
  224.         bswap   eax
  225.         xchg    eax, edx
  226.         stosd
  227.         xchg    eax, edx
  228.         stosd
  229.         call    sha256_transform
  230.         mov     esi, sha256_digest
  231.         mov     cl, 8
  232.         pop     edi
  233. @@:
  234.         lodsd
  235.         bswap   eax
  236.         stosd
  237.         loop    @b
  238.         ret
  239.