Subversion Repositories Kolibri OS

Rev

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

  1. ;    libcrash -- cryptographic hash functions
  2. ;
  3. ;    Copyright (C) 2012-2013,2016,2019 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. SHA384512_BLOCK_SIZE = 128
  20. SHA384_BLOCK_SIZE    = SHA384512_BLOCK_SIZE
  21. SHA512_BLOCK_SIZE    = SHA384512_BLOCK_SIZE
  22. SHA384_HASH_SIZE     = 48
  23. SHA512_HASH_SIZE     = 64
  24.  
  25. SHA384512_INIT_SIZE  = 64
  26. SHA384512_ALIGN      = 16
  27. SHA384512_ALIGN_MASK = SHA384512_ALIGN - 1
  28.  
  29. struct ctx_sha384512
  30.         hash            rb SHA384512_INIT_SIZE
  31.         block           rb SHA384512_BLOCK_SIZE
  32.         index           rd 1
  33.         msglen_0        rd 1
  34.         msglen_1        rd 1
  35.         msglen_2        rd 1
  36.         msglen_3        rd 1
  37.                         rd 3    ; align
  38.         ; tmp vars
  39.         w               rq 80
  40.         A               rq 1
  41.         B               rq 1
  42.         C               rq 1
  43.         D               rq 1
  44.         E               rq 1
  45.         F               rq 1
  46.         G               rq 1
  47.         H               rq 1
  48.         temp            rq 1
  49. ends
  50.  
  51. if defined sizeof.crash_ctx
  52.   assert sizeof.crash_ctx >= sizeof.ctx_sha384512
  53. end if
  54.  
  55. macro sha384512._.chn x, y, z
  56. {
  57.         movq    mm0, [y]
  58.         pxor    mm0, [z]
  59.         pand    mm0, [x]
  60.         pxor    mm0, [z]
  61. }
  62.  
  63. macro sha384512._.maj x, y, z
  64. {
  65.         movq    mm0, [x]
  66.         pxor    mm0, [y]
  67.         pand    mm0, [z]
  68.         movq    mm2, [x]
  69.         pand    mm2, [y]
  70.         pxor    mm0, mm2
  71. }
  72.  
  73. macro sha384512._.Sigma0 x
  74. {
  75.         movq    mm0, x
  76.         movq    mm2, mm0
  77.         movq    mm7, mm2
  78.         psrlq   mm2, 28
  79.         psllq   mm7, 36
  80.         por     mm2, mm7
  81.         movq    mm7, mm0
  82.         psrlq   mm0, 34
  83.         psllq   mm7, 30
  84.         por     mm0, mm7
  85.         pxor    mm0, mm2
  86.         movq    mm2, x
  87.         movq    mm7, mm2
  88.         psrlq   mm2, 39
  89.         psllq   mm7, 25
  90.         por     mm2, mm7
  91.         pxor    mm0, mm2
  92. }
  93.  
  94. macro sha384512._.Sigma1 x
  95. {
  96.         movq    mm0, x
  97.         movq    mm2, mm0
  98.         movq    mm7, mm2
  99.         psrlq   mm2, 14
  100.         psllq   mm7, 50
  101.         por     mm2, mm7
  102.         movq    mm7, mm0
  103.         psrlq   mm0, 18
  104.         psllq   mm7, 46
  105.         por     mm0, mm7
  106.         pxor    mm0, mm2
  107.         movq    mm2, x
  108.         movq    mm7, mm2
  109.         psrlq   mm2, 41
  110.         psllq   mm7, 23
  111.         por     mm2, mm7
  112.         pxor    mm0, mm2
  113. }
  114.  
  115. macro sha384512._.sigma0 x
  116. {
  117.         movq    mm0, x
  118.         movq    mm2, mm0
  119.         movq    mm7, mm2
  120.         psrlq   mm2, 1
  121.         psllq   mm7, 63
  122.         por     mm2, mm7
  123.         movq    mm7, mm0
  124.         psrlq   mm0, 8
  125.         psllq   mm7, 56
  126.         por     mm0, mm7
  127.         pxor    mm0, mm2
  128.         movq    mm2, x
  129.         psrlq   mm2, 7
  130.         pxor    mm0, mm2
  131. }
  132.  
  133. macro sha384512._.sigma1 x
  134. {
  135.         movq    mm0, x
  136.         movq    mm2, mm0
  137.         movq    mm7, mm2
  138.         psrlq   mm2, 19
  139.         psllq   mm7, 45
  140.         por     mm2, mm7
  141.         movq    mm7, mm0
  142.         psrlq   mm0, 61
  143.         psllq   mm7, 3
  144.         por     mm0, mm7
  145.         pxor    mm0, mm2
  146.         movq    mm2, x
  147.         psrlq   mm2, 6
  148.         pxor    mm0, mm2
  149. }
  150.  
  151. macro sha384512._.recalculate_w n
  152. {
  153.         movq    mm3, [w + ((n-2) and 15)*8]
  154.         sha384512._.sigma1  mm3
  155.         paddq   mm0, [w + ((n-7) and 15)*8]
  156.         movq    mm6, mm0
  157.         movq    mm3, [w + ((n-15) and 15)*8]
  158.         sha384512._.sigma0  mm3
  159.         movq    mm2, mm6
  160.         paddq   mm0, mm2
  161.         movq    mm7, [w + (n)*8]
  162.         paddq   mm7, mm0
  163.         movq    [w + (n)*8], mm7
  164. }
  165.  
  166. macro sha384512._.round a, b, c, d, e, f, g, h, k
  167. {
  168.         movq    mm1, [h]
  169.         movq    mm3, [e]
  170.         sha384512._.Sigma1  mm3
  171.         paddq   mm1, mm0
  172.         sha384512._.chn     e, f, g
  173.         paddq   mm1, mm0
  174.         paddq   mm1, [k]
  175.         paddq   mm1, mm5
  176.         movq    mm7, [d]
  177.         paddq   mm7, mm1
  178.         movq    [d], mm7
  179.         movq    mm3, [a]
  180.         sha384512._.Sigma0  mm3
  181.         paddq   mm1, mm0
  182.         sha384512._.maj     a, b, c
  183.         paddq   mm0, mm1
  184.         movq    [h], mm0
  185. }
  186.  
  187.  
  188. macro sha384512._.round_1_16 a, b, c, d, e, f, g, h, n
  189. {
  190.  
  191.         movq    mm0, [esi + (n)*8]
  192.         movq    [temp], mm0
  193.         mov     eax, dword[temp]
  194.         bswap   eax
  195.         push    eax
  196.         mov     eax, dword[temp + 4]
  197.         bswap   eax
  198.         mov     dword[temp], eax
  199.         pop     eax
  200.         mov     dword[temp + 4], eax
  201.         movq    mm0, [temp]
  202.         movq    [w + (n)*8], mm0
  203.         movq    mm5, mm0
  204.         sha384512._.round a, b, c, d, e, f, g, h, (sha384512._.table + (n)*8)
  205. }
  206.  
  207. macro sha384512._.round_17_64 a, b, c, d, e, f, g, h, n, rep_num
  208. {
  209.         sha384512._.recalculate_w n
  210.         movq    mm5, [w + (n)*8]
  211.         sha384512._.round a, b, c, d, e, f, g, h, (sha384512._.table + (n+16*rep_num)*8)
  212. }
  213.  
  214.  
  215. proc sha384.init _ctx
  216.         mov     ebx, [_ctx]
  217.         lea     edi, [ebx + ctx_sha384512.hash]
  218.         mov     esi, sha384._.hash_init
  219.         mov     ecx, SHA384512_INIT_SIZE/4
  220.         rep     movsd
  221.         xor     eax, eax
  222.         mov     [ebx + ctx_sha384512.index], eax
  223.         mov     [ebx + ctx_sha384512.msglen_0], eax
  224.         mov     [ebx + ctx_sha384512.msglen_1], eax
  225.         mov     [ebx + ctx_sha384512.msglen_2], eax
  226.         mov     [ebx + ctx_sha384512.msglen_3], eax
  227.         ret
  228. endp
  229.  
  230.  
  231. proc sha512.init _ctx
  232.         mov     ebx, [_ctx]
  233.         lea     edi, [ebx + ctx_sha384512.hash]
  234.         mov     esi, sha512._.hash_init
  235.         mov     ecx, SHA384512_INIT_SIZE/4
  236.         rep     movsd
  237.         xor     eax, eax
  238.         mov     [ebx + ctx_sha384512.index], eax
  239.         mov     [ebx + ctx_sha384512.msglen_0], eax
  240.         mov     [ebx + ctx_sha384512.msglen_1], eax
  241.         mov     [ebx + ctx_sha384512.msglen_2], eax
  242.         mov     [ebx + ctx_sha384512.msglen_3], eax
  243.         ret
  244. endp
  245.  
  246.  
  247. proc sha384512._.block _hash
  248. ;locals
  249. ;        w       rq 80
  250. ;        A       rq 1
  251. ;        B       rq 1
  252. ;        C       rq 1
  253. ;        D       rq 1
  254. ;        E       rq 1
  255. ;        F       rq 1
  256. ;        G       rq 1
  257. ;        H       rq 1
  258. ;        temp    rq 1
  259. ;endl
  260. w equ ebx + ctx_sha384512.w
  261. A equ ebx + ctx_sha384512.A
  262. B equ ebx + ctx_sha384512.B
  263. C equ ebx + ctx_sha384512.C
  264. D equ ebx + ctx_sha384512.D
  265. E equ ebx + ctx_sha384512.E
  266. F equ ebx + ctx_sha384512.F
  267. G equ ebx + ctx_sha384512.G
  268. H equ ebx + ctx_sha384512.H
  269. temp equ ebx + ctx_sha384512.temp
  270.  
  271.         mov     edi, [_hash]
  272.         movq    mm0, [edi + 0x00]
  273.         movq    [A], mm0
  274.         movq    mm0, [edi + 0x08]
  275.         movq    [B], mm0
  276.         movq    mm0, [edi + 0x10]
  277.         movq    [C], mm0
  278.         movq    mm0, [edi + 0x18]
  279.         movq    [D], mm0
  280.         movq    mm0, [edi + 0x20]
  281.         movq    [E], mm0
  282.         movq    mm0, [edi + 0x28]
  283.         movq    [F], mm0
  284.         movq    mm0, [edi + 0x30]
  285.         movq    [G], mm0
  286.         movq    mm0, [edi + 0x38]
  287.         movq    [H], mm0
  288.  
  289.  
  290.         sha384512._.round_1_16  A, B, C, D, E, F, G, H,  0
  291.         sha384512._.round_1_16  H, A, B, C, D, E, F, G,  1
  292.         sha384512._.round_1_16  G, H, A, B, C, D, E, F,  2
  293.         sha384512._.round_1_16  F, G, H, A, B, C, D, E,  3
  294.         sha384512._.round_1_16  E, F, G, H, A, B, C, D,  4
  295.         sha384512._.round_1_16  D, E, F, G, H, A, B, C,  5
  296.         sha384512._.round_1_16  C, D, E, F, G, H, A, B,  6
  297.         sha384512._.round_1_16  B, C, D, E, F, G, H, A,  7
  298.         sha384512._.round_1_16  A, B, C, D, E, F, G, H,  8
  299.         sha384512._.round_1_16  H, A, B, C, D, E, F, G,  9
  300.         sha384512._.round_1_16  G, H, A, B, C, D, E, F, 10
  301.         sha384512._.round_1_16  F, G, H, A, B, C, D, E, 11
  302.         sha384512._.round_1_16  E, F, G, H, A, B, C, D, 12
  303.         sha384512._.round_1_16  D, E, F, G, H, A, B, C, 13
  304.         sha384512._.round_1_16  C, D, E, F, G, H, A, B, 14
  305.         sha384512._.round_1_16  B, C, D, E, F, G, H, A, 15
  306.  
  307. repeat 4
  308.         sha384512._.round_17_64 A, B, C, D, E, F, G, H,  0, %
  309.         sha384512._.round_17_64 H, A, B, C, D, E, F, G,  1, %
  310.         sha384512._.round_17_64 G, H, A, B, C, D, E, F,  2, %
  311.         sha384512._.round_17_64 F, G, H, A, B, C, D, E,  3, %
  312.         sha384512._.round_17_64 E, F, G, H, A, B, C, D,  4, %
  313.         sha384512._.round_17_64 D, E, F, G, H, A, B, C,  5, %
  314.         sha384512._.round_17_64 C, D, E, F, G, H, A, B,  6, %
  315.         sha384512._.round_17_64 B, C, D, E, F, G, H, A,  7, %
  316.         sha384512._.round_17_64 A, B, C, D, E, F, G, H,  8, %
  317.         sha384512._.round_17_64 H, A, B, C, D, E, F, G,  9, %
  318.         sha384512._.round_17_64 G, H, A, B, C, D, E, F, 10, %
  319.         sha384512._.round_17_64 F, G, H, A, B, C, D, E, 11, %
  320.         sha384512._.round_17_64 E, F, G, H, A, B, C, D, 12, %
  321.         sha384512._.round_17_64 D, E, F, G, H, A, B, C, 13, %
  322.         sha384512._.round_17_64 C, D, E, F, G, H, A, B, 14, %
  323.         sha384512._.round_17_64 B, C, D, E, F, G, H, A, 15, %
  324. end repeat
  325.  
  326.  
  327.         mov     edi, [_hash]
  328.         movq    mm0, [A]
  329.         paddq   mm0, [edi + 0x00]
  330.         movq    [edi + 0x00], mm0
  331.         movq    mm0, [B]
  332.         paddq   mm0, [edi + 0x08]
  333.         movq    [edi + 0x08], mm0
  334.         movq    mm0, [C]
  335.         paddq   mm0, [edi + 0x10]
  336.         movq    [edi + 0x10], mm0
  337.         movq    mm0, [D]
  338.         paddq   mm0, [edi + 0x18]
  339.         movq    [edi + 0x18], mm0
  340.         movq    mm0, [E]
  341.         paddq   mm0, [edi + 0x20]
  342.         movq    [edi + 0x20], mm0
  343.         movq    mm0, [F]
  344.         paddq   mm0, [edi + 0x28]
  345.         movq    [edi + 0x28], mm0
  346.         movq    mm0, [G]
  347.         paddq   mm0, [edi + 0x30]
  348.         movq    [edi + 0x30], mm0
  349.         movq    mm0, [H]
  350.         paddq   mm0, [edi + 0x38]
  351.         movq    [edi + 0x38], mm0
  352.  
  353.         ret
  354. restore w,A,B,C,D,E,F,G,H,temp
  355. endp
  356.  
  357.  
  358. sha384.update = sha384512.update
  359. sha512.update = sha384512.update
  360. proc sha384512.update _ctx, _msg, _size
  361.         mov     ebx, [_ctx]
  362.         mov     ecx, [_size]
  363.         add     [ebx + ctx_sha384512.msglen_0], ecx
  364.         adc     [ebx + ctx_sha384512.msglen_1], 0
  365.         adc     [ebx + ctx_sha384512.msglen_2], 0
  366.         adc     [ebx + ctx_sha384512.msglen_3], 0
  367.  
  368.   .next_block:
  369.         mov     ebx, [_ctx]
  370.         mov     esi, [_msg]
  371.         mov     eax, [ebx + ctx_sha384512.index]
  372.         and     eax, SHA384512_BLOCK_SIZE-1
  373.         jnz     .copy_to_buf
  374.         test    esi, SHA384512_ALIGN_MASK
  375.         jnz     .copy_to_buf
  376.   .no_copy:
  377.         ; data is aligned, hash it in place without copying
  378.         mov     ebx, [_ctx]
  379.         cmp     [_size], SHA384512_BLOCK_SIZE
  380.         jb      .copy_quit
  381.         lea     eax, [ebx + ctx_sha384512.hash]
  382.         stdcall sha384512._.block, eax
  383.         sub     [_size], SHA384512_BLOCK_SIZE
  384.         add     esi, SHA384512_BLOCK_SIZE           ; FIXME
  385.         jmp     .no_copy
  386.  
  387.   .copy_to_buf:
  388.         lea     edi, [ebx + ctx_sha384512.block]
  389.         add     edi, eax
  390.         mov     ecx, SHA384512_BLOCK_SIZE
  391.         sub     ecx, eax
  392.         cmp     [_size], ecx
  393.         jb      .copy_quit
  394.         sub     [_size], ecx
  395.         add     [_msg], ecx
  396.         add     [ebx + ctx_sha384512.index], ecx
  397.         rep     movsb
  398.         lea     eax, [ebx + ctx_sha384512.hash]
  399.         lea     esi, [ebx + ctx_sha384512.block]
  400.         stdcall sha384512._.block, eax
  401.         jmp     .next_block
  402.  
  403.   .copy_quit:
  404.         mov     ebx, [_ctx]
  405.         lea     edi, [ebx + ctx_sha384512.block]
  406.         mov     eax, [ebx + ctx_sha384512.index]
  407.         and     eax, SHA384512_BLOCK_SIZE-1
  408.         add     edi, eax
  409.         mov     ecx, [_size]
  410.         add     [ebx + ctx_sha384512.index], ecx
  411.         rep     movsb
  412.   .quit:
  413.  
  414.         ret
  415. endp
  416.  
  417.  
  418. sha384.final = sha384512.final
  419. sha512.final = sha384512.final
  420. proc sha384512.final _ctx
  421.         mov     ebx, [_ctx]
  422.         lea     edi, [ebx + ctx_sha384512.block]
  423.         mov     ecx, [ebx + ctx_sha384512.msglen_0]
  424.         and     ecx, SHA384512_BLOCK_SIZE-1
  425.         add     edi, ecx
  426.         mov     byte[edi], 0x80
  427.         inc     edi
  428.         neg     ecx
  429.         add     ecx, SHA384512_BLOCK_SIZE
  430.         cmp     ecx, 16
  431.         ja      .last
  432.  
  433.         dec     ecx
  434.         xor     eax, eax
  435.         rep     stosb
  436.         lea     esi, [ebx + ctx_sha384512.block]
  437.         lea     eax, [ebx + ctx_sha384512.hash]
  438.         stdcall sha384512._.block, eax
  439.         mov     ebx, [_ctx]
  440.         lea     edi, [ebx + ctx_sha384512.block]
  441.         mov     ecx, SHA384512_BLOCK_SIZE+1
  442.   .last:
  443.         dec     ecx
  444.         sub     ecx, 16
  445.         xor     eax, eax
  446.         rep     stosb
  447.         mov     eax, [ebx + ctx_sha384512.msglen_1]
  448.         shld    [ebx + ctx_sha384512.msglen_0], eax, 3
  449.         mov     eax, [ebx + ctx_sha384512.msglen_2]
  450.         shld    [ebx + ctx_sha384512.msglen_1], eax, 3
  451.         mov     eax, [ebx + ctx_sha384512.msglen_3]
  452.         shld    [ebx + ctx_sha384512.msglen_2], eax, 3
  453.         shl     eax, 3
  454.         bswap   eax
  455.         mov     dword[edi + 0], eax
  456.         mov     eax, [ebx + ctx_sha384512.msglen_2]
  457.         bswap   eax
  458.         mov     dword[edi + 4], eax
  459.         mov     eax, [ebx + ctx_sha384512.msglen_1]
  460.         bswap   eax
  461.         mov     dword[edi + 8], eax
  462.         mov     eax, [ebx + ctx_sha384512.msglen_0]
  463.         bswap   eax
  464.         mov     dword[edi + 12], eax
  465.         mov     ebx, [_ctx]
  466.         lea     esi, [ebx + ctx_sha384512.block]
  467.         lea     eax, [ebx + ctx_sha384512.hash]
  468.         stdcall sha384512._.block, eax
  469.  
  470.         mov     ebx, [_ctx]
  471.         lea     eax, [ebx + ctx_sha384512.hash]
  472.         stdcall sha384512._.postprocess, ebx, eax
  473.  
  474.         ret
  475. endp
  476.  
  477.  
  478. proc sha384512._.postprocess _ctx, _hash
  479.         mov     ecx, 8
  480.         mov     esi, [_hash]
  481.         mov     edi, esi
  482.     @@:
  483.         lodsd
  484.         mov     ebx, eax
  485.         lodsd
  486.         bswap   eax
  487.         bswap   ebx
  488.         stosd
  489.         mov     eax, ebx
  490.         stosd
  491.         dec     ecx     ; FIXME: what should I fix here?
  492.         jnz     @b
  493.         emms
  494.         ret
  495. endp
  496.  
  497.  
  498. proc sha384.oneshot _ctx, _data, _len
  499.         stdcall sha384.init, [_ctx]
  500.         stdcall sha384.update, [_ctx], [_data], [_len]
  501.         stdcall sha384.final, [_ctx]
  502.         ret
  503. endp
  504.  
  505.  
  506. proc sha512.oneshot _ctx, _data, _len
  507.         stdcall sha512.init, [_ctx]
  508.         stdcall sha512.update, [_ctx], [_data], [_len]
  509.         stdcall sha512.final, [_ctx]
  510.         ret
  511. endp
  512.  
  513.  
  514. iglobal
  515. align SHA384512_ALIGN
  516. sha384._.hash_init      dq 0xcbbb9d5dc1059ed8, 0x629a292a367cd507,\
  517.                            0x9159015a3070dd17, 0x152fecd8f70e5939,\
  518.                            0x67332667ffc00b31, 0x8eb44a8768581511,\
  519.                            0xdb0c2e0d64f98fa7, 0x47b5481dbefa4fa4
  520.  
  521. sha512._.hash_init      dq 0x6a09e667f3bcc908, 0xbb67ae8584caa73b,\
  522.                            0x3c6ef372fe94f82b, 0xa54ff53a5f1d36f1,\
  523.                            0x510e527fade682d1, 0x9b05688c2b3e6c1f,\
  524.                            0x1f83d9abfb41bd6b, 0x5be0cd19137e2179
  525.  
  526. sha384512._.table       dq 0x428a2f98d728ae22, 0x7137449123ef65cd,\
  527.                            0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc,\
  528.                            0x3956c25bf348b538, 0x59f111f1b605d019,\
  529.                            0x923f82a4af194f9b, 0xab1c5ed5da6d8118,\
  530.                            0xd807aa98a3030242, 0x12835b0145706fbe,\
  531.                            0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2,\
  532.                            0x72be5d74f27b896f, 0x80deb1fe3b1696b1,\
  533.                            0x9bdc06a725c71235, 0xc19bf174cf692694,\
  534.                            0xe49b69c19ef14ad2, 0xefbe4786384f25e3,\
  535.                            0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65,\
  536.                            0x2de92c6f592b0275, 0x4a7484aa6ea6e483,\
  537.                            0x5cb0a9dcbd41fbd4, 0x76f988da831153b5,\
  538.                            0x983e5152ee66dfab, 0xa831c66d2db43210,\
  539.                            0xb00327c898fb213f, 0xbf597fc7beef0ee4,\
  540.                            0xc6e00bf33da88fc2, 0xd5a79147930aa725,\
  541.                            0x06ca6351e003826f, 0x142929670a0e6e70,\
  542.                            0x27b70a8546d22ffc, 0x2e1b21385c26c926,\
  543.                            0x4d2c6dfc5ac42aed, 0x53380d139d95b3df,\
  544.                            0x650a73548baf63de, 0x766a0abb3c77b2a8,\
  545.                            0x81c2c92e47edaee6, 0x92722c851482353b,\
  546.                            0xa2bfe8a14cf10364, 0xa81a664bbc423001,\
  547.                            0xc24b8b70d0f89791, 0xc76c51a30654be30,\
  548.                            0xd192e819d6ef5218, 0xd69906245565a910,\
  549.                            0xf40e35855771202a, 0x106aa07032bbd1b8,\
  550.                            0x19a4c116b8d2d0c8, 0x1e376c085141ab53,\
  551.                            0x2748774cdf8eeb99, 0x34b0bcb5e19b48a8,\
  552.                            0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb,\
  553.                            0x5b9cca4f7763e373, 0x682e6ff3d6b2b8a3,\
  554.                            0x748f82ee5defb2fc, 0x78a5636f43172f60,\
  555.                            0x84c87814a1f0ab72, 0x8cc702081a6439ec,\
  556.                            0x90befffa23631e28, 0xa4506cebde82bde9,\
  557.                            0xbef9a3f7b2c67915, 0xc67178f2e372532b,\
  558.                            0xca273eceea26619c, 0xd186b8c721c0c207,\
  559.                            0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178,\
  560.                            0x06f067aa72176fba, 0x0a637dc5a2c898a6,\
  561.                            0x113f9804bef90dae, 0x1b710b35131c471b,\
  562.                            0x28db77f523047d84, 0x32caab7b40c72493,\
  563.                            0x3c9ebe0a15c9bebc, 0x431d67c49c100d4c,\
  564.                            0x4cc5d4becb3e42b6, 0x597f299cfc657e2a,\
  565.                            0x5fcb6fab3ad6faec, 0x6c44198c4a475817
  566. endg
  567.