"Fossies" - the Fresh Open Source Software Archive

Member "src/Crypto/sha512_avx2_x64.asm" (10 Oct 2018, 27471 Bytes) of package /windows/misc/VeraCrypt_1.23-Hotfix-2_Source.zip:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) Generic Assembler source code syntax highlighting (style: standard) with prefixed line numbers. Alternatively you can here view or download the uninterpreted source code file.

    1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    2 ; Copyright (c) 2012, Intel Corporation 
    3 ; 
    4 ; All rights reserved. 
    5 ; 
    6 ; Redistribution and use in source and binary forms, with or without
    7 ; modification, are permitted provided that the following conditions are
    8 ; met: 
    9 ; 
   10 ; * Redistributions of source code must retain the above copyright
   11 ;   notice, this list of conditions and the following disclaimer.  
   12 ; 
   13 ; * Redistributions in binary form must reproduce the above copyright
   14 ;   notice, this list of conditions and the following disclaimer in the
   15 ;   documentation and/or other materials provided with the
   16 ;   distribution. 
   17 ; 
   18 ; * Neither the name of the Intel Corporation nor the names of its
   19 ;   contributors may be used to endorse or promote products derived from
   20 ;   this software without specific prior written permission. 
   21 ; 
   22 ; 
   23 ; THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS" AND ANY
   24 ; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   25 ; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   26 ; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION OR
   27 ; CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
   28 ; EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
   29 ; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
   30 ; PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
   31 ; LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
   32 ; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
   33 ; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   34 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   35 ;
   36 ; Example YASM command lines:
   37 ; Windows:  yasm -f x64 -D WINABI sha512_rorx.asm
   38 ; Linux:    yasm -f elf64 sha512_rorx.asm
   39 ;
   40 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   41 ; This code schedules 1 blocks at a time, with 4 lanes per block
   42 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   43 
   44 BITS 64
   45 section .text
   46 
   47 ; Virtual Registers
   48 %define Y_0 ymm4
   49 %define Y_1 ymm5
   50 %define Y_2 ymm6
   51 %define Y_3 ymm7
   52 
   53 %define YTMP0 ymm0
   54 %define YTMP1 ymm1
   55 %define YTMP2 ymm2
   56 %define YTMP3 ymm3
   57 %define YTMP4 ymm8
   58 %define XFER  YTMP0
   59 
   60 %define BYTE_FLIP_MASK  ymm9
   61 
   62 %ifdef WINABI
   63     %define INP         rcx ; 1st arg
   64     %define CTX         rdx ; 2nd arg
   65     %define NUM_BLKS    r8  ; 3rd arg
   66     %define c           rdi 
   67     %define d           rsi 
   68     %define e           r8
   69     %define y3          rcx
   70 %else
   71     %define INP         rdi ; 1st arg
   72     %define CTX         rsi ; 2nd arg
   73     %define NUM_BLKS    rdx ; 3rd arg
   74     %define c           rcx
   75     %define d           r8
   76     %define e           rdx
   77     %define y3          rdi
   78 %endif
   79 
   80 %define TBL   rbp
   81           
   82 %define a     rax
   83 %define b     rbx
   84           
   85 %define f     r9
   86 %define g     r10
   87 %define h     r11
   88 %define old_h r11
   89 
   90 %define T1    r12
   91 %define y0    r13
   92 %define y1    r14
   93 %define y2    r15
   94 
   95 %define y4    r12
   96 
   97 ; Local variables (stack frame)
   98 struc frame
   99     .XFER:    resq  4
  100     .SRND:    resq  1
  101     .INP:     resq  1
  102     .INPEND:  resq  1
  103     .RSPSAVE: resq  1
  104 
  105 %ifdef WINABI
  106     .XMMSAVE: resdq 4
  107     .GPRSAVE: resq  8
  108 %else
  109     .GPRSAVE: resq  6
  110 %endif
  111 endstruc
  112 
  113 %define VMOVDQ vmovdqu ;; assume buffers not aligned 
  114 
  115 ; addm [mem], reg
  116 ; Add reg to mem using reg-mem add and store
  117 %macro addm 2
  118     add %2, %1
  119     mov %1, %2
  120 %endm
  121 
  122 
  123 ; COPY_YMM_AND_BSWAP ymm, [mem], byte_flip_mask
  124 ; Load ymm with mem and byte swap each dword
  125 %macro COPY_YMM_AND_BSWAP 3
  126     VMOVDQ %1, %2
  127     vpshufb %1, %1 ,%3
  128 %endmacro
  129 ; rotate_Ys
  130 ; Rotate values of symbols Y0...Y3
  131 %macro rotate_Ys 0
  132     %xdefine %%Y_ Y_0
  133     %xdefine Y_0 Y_1
  134     %xdefine Y_1 Y_2
  135     %xdefine Y_2 Y_3
  136     %xdefine Y_3 %%Y_
  137 %endm
  138 
  139 ; RotateState
  140 %macro RotateState 0
  141     ; Rotate symbles a..h right
  142     %xdefine old_h  h
  143     %xdefine %%TMP_ h
  144     %xdefine h      g
  145     %xdefine g      f
  146     %xdefine f      e
  147     %xdefine e      d
  148     %xdefine d      c
  149     %xdefine c      b
  150     %xdefine b      a
  151     %xdefine a      %%TMP_
  152 %endm
  153 
  154 ; %macro MY_VPALIGNR    YDST, YSRC1, YSRC2, RVAL
  155 ; YDST = {YSRC1, YSRC2} >> RVAL*8
  156 %macro MY_VPALIGNR 4
  157 %define %%YDST  %1
  158 %define %%YSRC1 %2
  159 %define %%YSRC2 %3
  160 %define %%RVAL  %4
  161     vperm2f128  %%YDST, %%YSRC1, %%YSRC2, 0x3   ; YDST = {YS1_LO, YS2_HI}
  162     vpalignr    %%YDST, %%YDST, %%YSRC2, %%RVAL ; YDST = {YDS1, YS2} >> RVAL*8
  163 %endm
  164 
  165 %macro FOUR_ROUNDS_AND_SCHED 0
  166 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; RND N + 0 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  167 
  168         ; Extract w[t-7]
  169         MY_VPALIGNR YTMP0, Y_3, Y_2, 8      ; YTMP0 = W[-7]
  170         ; Calculate w[t-16] + w[t-7]
  171         vpaddq      YTMP0, YTMP0, Y_0       ; YTMP0 = W[-7] + W[-16]
  172         ; Extract w[t-15]
  173         MY_VPALIGNR YTMP1, Y_1, Y_0, 8      ; YTMP1 = W[-15]
  174 
  175         ; Calculate sigma0
  176 
  177         ; Calculate w[t-15] ror 1
  178         vpsrlq      YTMP2, YTMP1, 1
  179         vpsllq      YTMP3, YTMP1, (64-1)
  180         vpor        YTMP3, YTMP3, YTMP2     ; YTMP3 = W[-15] ror 1
  181         ; Calculate w[t-15] shr 7
  182         vpsrlq      YTMP4, YTMP1, 7         ; YTMP4 = W[-15] >> 7
  183 
  184     mov y3, a       ; y3 = a                                       ; MAJA   
  185     rorx    y0, e, 41   ; y0 = e >> 41                  ; S1A
  186     rorx    y1, e, 18   ; y1 = e >> 18                  ; S1B
  187 
  188     add h, [rsp+frame.XFER+0*8]     ; h = k + w + h                                ; -- 
  189     or  y3, c       ; y3 = a|c                                     ; MAJA   
  190     mov y2, f       ; y2 = f                                       ; CH 
  191     rorx    T1, a, 34   ; T1 = a >> 34                  ; S0B
  192 
  193     xor y0, y1      ; y0 = (e>>41) ^ (e>>18)            ; S1
  194     xor y2, g       ; y2 = f^g                                     ; CH 
  195     rorx    y1, e, 14   ; y1 = (e >> 14)                    ; S1
  196 
  197     and y2, e       ; y2 = (f^g)&e                                 ; CH 
  198     xor y0, y1      ; y0 = (e>>41) ^ (e>>18) ^ (e>>14)      ; S1
  199     rorx    y1, a, 39   ; y1 = a >> 39                  ; S0A
  200     add d, h        ; d = k + w + h + d                            ; -- 
  201 
  202     and y3, b       ; y3 = (a|c)&b                                 ; MAJA   
  203     xor y1, T1      ; y1 = (a>>39) ^ (a>>34)            ; S0
  204     rorx    T1, a, 28   ; T1 = (a >> 28)                    ; S0
  205 
  206     xor y2, g       ; y2 = CH = ((f^g)&e)^g                        ; CH 
  207     xor y1, T1      ; y1 = (a>>39) ^ (a>>34) ^ (a>>28)      ; S0
  208     mov T1, a       ; T1 = a                                       ; MAJB   
  209     and T1, c       ; T1 = a&c                                     ; MAJB   
  210 
  211     add y2, y0      ; y2 = S1 + CH                                 ; -- 
  212     or  y3, T1      ; y3 = MAJ = (a|c)&b)|(a&c)                    ; MAJ    
  213     add h, y1       ; h = k + w + h + S0                           ; -- 
  214 
  215     add d, y2       ; d = k + w + h + d + S1 + CH = d + t1         ; -- 
  216 
  217     add h, y2       ; h = k + w + h + S0 + S1 + CH = t1 + S0       ; -- 
  218     add h, y3       ; h = t1 + S0 + MAJ                            ; -- 
  219 
  220 RotateState
  221 
  222 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; RND N + 1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  223 
  224 ;;;;;;;;;;;;;;;;;;;;;;;;;;
  225 
  226         ; Calculate w[t-15] ror 8
  227         vpsrlq      YTMP2, YTMP1, 8
  228         vpsllq      YTMP1, YTMP1, (64-8)
  229         vpor        YTMP1, YTMP1, YTMP2     ; YTMP1 = W[-15] ror 8
  230         ; XOR the three components
  231         vpxor       YTMP3, YTMP3, YTMP4     ; YTMP3 = W[-15] ror 1 ^ W[-15] >> 7
  232         vpxor       YTMP1, YTMP3, YTMP1     ; YTMP1 = s0
  233 
  234 
  235         ; Add three components, w[t-16], w[t-7] and sigma0
  236         vpaddq      YTMP0, YTMP0, YTMP1     ; YTMP0 = W[-16] + W[-7] + s0
  237         ; Move to appropriate lanes for calculating w[16] and w[17]
  238         vperm2f128  Y_0, YTMP0, YTMP0, 0x0      ; Y_0 = W[-16] + W[-7] + s0 {BABA}
  239         ; Move to appropriate lanes for calculating w[18] and w[19]
  240         vpand       YTMP0, YTMP0, [MASK_YMM_LO wrt rip] ; YTMP0 = W[-16] + W[-7] + s0 {DC00}
  241 
  242         ; Calculate w[16] and w[17] in both 128 bit lanes
  243 
  244         ; Calculate sigma1 for w[16] and w[17] on both 128 bit lanes
  245         vperm2f128  YTMP2, Y_3, Y_3, 0x11       ; YTMP2 = W[-2] {BABA}
  246         vpsrlq      YTMP4, YTMP2, 6         ; YTMP4 = W[-2] >> 6 {BABA}
  247 
  248 
  249     mov y3, a       ; y3 = a                                       ; MAJA   
  250     rorx    y0, e, 41   ; y0 = e >> 41                  ; S1A
  251     rorx    y1, e, 18   ; y1 = e >> 18                  ; S1B
  252     add h, [rsp+frame.XFER+1*8]     ; h = k + w + h                                ; -- 
  253     or  y3, c       ; y3 = a|c                                     ; MAJA   
  254 
  255 
  256     mov y2, f       ; y2 = f                                       ; CH 
  257     rorx    T1, a, 34   ; T1 = a >> 34                  ; S0B
  258     xor y0, y1      ; y0 = (e>>41) ^ (e>>18)            ; S1
  259     xor y2, g       ; y2 = f^g                                     ; CH 
  260 
  261 
  262     rorx    y1, e, 14   ; y1 = (e >> 14)                    ; S1
  263     xor y0, y1      ; y0 = (e>>41) ^ (e>>18) ^ (e>>14)      ; S1
  264     rorx    y1, a, 39   ; y1 = a >> 39                  ; S0A
  265     and y2, e       ; y2 = (f^g)&e                                 ; CH 
  266     add d, h        ; d = k + w + h + d                            ; -- 
  267 
  268     and y3, b       ; y3 = (a|c)&b                                 ; MAJA   
  269     xor y1, T1      ; y1 = (a>>39) ^ (a>>34)            ; S0
  270 
  271     rorx    T1, a, 28   ; T1 = (a >> 28)                    ; S0
  272     xor y2, g       ; y2 = CH = ((f^g)&e)^g                        ; CH 
  273 
  274     xor y1, T1      ; y1 = (a>>39) ^ (a>>34) ^ (a>>28)      ; S0
  275     mov T1, a       ; T1 = a                                       ; MAJB   
  276     and T1, c       ; T1 = a&c                                     ; MAJB   
  277     add y2, y0      ; y2 = S1 + CH                                 ; -- 
  278 
  279     or  y3, T1      ; y3 = MAJ = (a|c)&b)|(a&c)                    ; MAJ    
  280     add h, y1       ; h = k + w + h + S0                           ; -- 
  281 
  282     add d, y2       ; d = k + w + h + d + S1 + CH = d + t1         ; -- 
  283     add h, y2       ; h = k + w + h + S0 + S1 + CH = t1 + S0       ; -- 
  284     add h, y3       ; h = t1 + S0 + MAJ                            ; -- 
  285 
  286 RotateState
  287 
  288 
  289 
  290 
  291 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; RND N + 2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  292 
  293 ;;;;;;;;;;;;;;;;;;;;;;;;;;
  294 
  295 
  296         vpsrlq      YTMP3, YTMP2, 19        ; YTMP3 = W[-2] >> 19 {BABA}
  297         vpsllq      YTMP1, YTMP2, (64-19)       ; YTMP1 = W[-2] << 19 {BABA}
  298         vpor        YTMP3, YTMP3, YTMP1     ; YTMP3 = W[-2] ror 19 {BABA}
  299         vpxor       YTMP4, YTMP4, YTMP3     ; YTMP4 = W[-2] ror 19 ^ W[-2] >> 6 {BABA}
  300         vpsrlq      YTMP3, YTMP2, 61        ; YTMP3 = W[-2] >> 61 {BABA}
  301         vpsllq      YTMP1, YTMP2, (64-61)       ; YTMP1 = W[-2] << 61 {BABA}
  302         vpor        YTMP3, YTMP3, YTMP1     ; YTMP3 = W[-2] ror 61 {BABA}
  303         vpxor       YTMP4, YTMP4, YTMP3     ; YTMP4 = s1 = (W[-2] ror 19) ^ (W[-2] ror 61) ^ (W[-2] >> 6) {BABA}
  304 
  305         ; Add sigma1 to the other compunents to get w[16] and w[17]
  306         vpaddq      Y_0, Y_0, YTMP4         ; Y_0 = {W[1], W[0], W[1], W[0]}
  307 
  308         ; Calculate sigma1 for w[18] and w[19] for upper 128 bit lane
  309         vpsrlq      YTMP4, Y_0, 6           ; YTMP4 = W[-2] >> 6 {DC--}
  310 
  311     mov y3, a       ; y3 = a                                       ; MAJA   
  312     rorx    y0, e, 41   ; y0 = e >> 41                  ; S1A
  313     add h, [rsp+frame.XFER+2*8]     ; h = k + w + h                                ; -- 
  314 
  315     rorx    y1, e, 18   ; y1 = e >> 18                  ; S1B
  316     or  y3, c       ; y3 = a|c                                     ; MAJA   
  317     mov y2, f       ; y2 = f                                       ; CH 
  318     xor y2, g       ; y2 = f^g                                     ; CH 
  319 
  320     rorx    T1, a, 34   ; T1 = a >> 34                  ; S0B
  321     xor y0, y1      ; y0 = (e>>41) ^ (e>>18)            ; S1
  322     and y2, e       ; y2 = (f^g)&e                                 ; CH 
  323 
  324     rorx    y1, e, 14   ; y1 = (e >> 14)                    ; S1
  325     add d, h        ; d = k + w + h + d                            ; -- 
  326     and y3, b       ; y3 = (a|c)&b                                 ; MAJA   
  327 
  328     xor y0, y1      ; y0 = (e>>41) ^ (e>>18) ^ (e>>14)      ; S1
  329     rorx    y1, a, 39   ; y1 = a >> 39                  ; S0A
  330     xor y2, g       ; y2 = CH = ((f^g)&e)^g                        ; CH 
  331 
  332     xor y1, T1      ; y1 = (a>>39) ^ (a>>34)            ; S0
  333     rorx    T1, a, 28   ; T1 = (a >> 28)                    ; S0
  334 
  335     xor y1, T1      ; y1 = (a>>39) ^ (a>>34) ^ (a>>28)      ; S0
  336     mov T1, a       ; T1 = a                                       ; MAJB   
  337     and T1, c       ; T1 = a&c                                     ; MAJB   
  338     add y2, y0      ; y2 = S1 + CH                                 ; -- 
  339 
  340     or  y3, T1      ; y3 = MAJ = (a|c)&b)|(a&c)                    ; MAJ    
  341     add h, y1       ; h = k + w + h + S0                           ; -- 
  342     add d, y2       ; d = k + w + h + d + S1 + CH = d + t1         ; -- 
  343     add h, y2       ; h = k + w + h + S0 + S1 + CH = t1 + S0       ; -- 
  344 
  345     add h, y3       ; h = t1 + S0 + MAJ                            ; -- 
  346 
  347 RotateState
  348 
  349 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; RND N + 3 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  350 
  351 ;;;;;;;;;;;;;;;;;;;;;;;;;;
  352 
  353         vpsrlq      YTMP3, Y_0, 19          ; YTMP3 = W[-2] >> 19 {DC--}
  354         vpsllq      YTMP1, Y_0, (64-19)     ; YTMP1 = W[-2] << 19 {DC--}
  355         vpor        YTMP3, YTMP3, YTMP1     ; YTMP3 = W[-2] ror 19 {DC--}
  356         vpxor       YTMP4, YTMP4, YTMP3     ; YTMP4 = W[-2] ror 19 ^ W[-2] >> 6 {DC--}
  357         vpsrlq      YTMP3, Y_0, 61          ; YTMP3 = W[-2] >> 61 {DC--}
  358         vpsllq      YTMP1, Y_0, (64-61)     ; YTMP1 = W[-2] << 61 {DC--}
  359         vpor        YTMP3, YTMP3, YTMP1     ; YTMP3 = W[-2] ror 61 {DC--}
  360         vpxor       YTMP4, YTMP4, YTMP3     ; YTMP4 = s1 = (W[-2] ror 19) ^ (W[-2] ror 61) ^ (W[-2] >> 6) {DC--}
  361 
  362         ; Add the sigma0 + w[t-7] + w[t-16] for w[18] and w[19] to newly calculated sigma1 to get w[18] and w[19]
  363         vpaddq      YTMP2, YTMP0, YTMP4     ; YTMP2 = {W[3], W[2], --, --}
  364 
  365         ; Form w[19, w[18], w17], w[16]
  366         vpblendd        Y_0, Y_0, YTMP2, 0xF0       ; Y_0 = {W[3], W[2], W[1], W[0]}
  367 ;       vperm2f128      Y_0, Y_0, YTMP2, 0x30
  368 
  369     mov y3, a       ; y3 = a                                       ; MAJA   
  370     rorx    y0, e, 41   ; y0 = e >> 41                  ; S1A
  371     rorx    y1, e, 18   ; y1 = e >> 18                  ; S1B
  372     add h, [rsp+frame.XFER+3*8]     ; h = k + w + h                                ; -- 
  373     or  y3, c       ; y3 = a|c                                     ; MAJA   
  374 
  375 
  376     mov y2, f       ; y2 = f                                       ; CH 
  377     rorx    T1, a, 34   ; T1 = a >> 34                  ; S0B
  378     xor y0, y1      ; y0 = (e>>41) ^ (e>>18)            ; S1
  379     xor y2, g       ; y2 = f^g                                     ; CH 
  380 
  381 
  382     rorx    y1, e, 14   ; y1 = (e >> 14)                    ; S1
  383     and y2, e       ; y2 = (f^g)&e                                 ; CH 
  384     add d, h        ; d = k + w + h + d                            ; -- 
  385     and y3, b       ; y3 = (a|c)&b                                 ; MAJA   
  386 
  387     xor y0, y1      ; y0 = (e>>41) ^ (e>>18) ^ (e>>14)      ; S1
  388     xor y2, g       ; y2 = CH = ((f^g)&e)^g                        ; CH 
  389 
  390     rorx    y1, a, 39   ; y1 = a >> 39                  ; S0A
  391     add y2, y0      ; y2 = S1 + CH                                 ; -- 
  392 
  393     xor y1, T1      ; y1 = (a>>39) ^ (a>>34)            ; S0
  394     add d, y2       ; d = k + w + h + d + S1 + CH = d + t1         ; -- 
  395 
  396     rorx    T1, a, 28   ; T1 = (a >> 28)                    ; S0
  397 
  398     xor y1, T1      ; y1 = (a>>39) ^ (a>>34) ^ (a>>28)      ; S0
  399     mov T1, a       ; T1 = a                                       ; MAJB   
  400     and T1, c       ; T1 = a&c                                     ; MAJB   
  401     or  y3, T1      ; y3 = MAJ = (a|c)&b)|(a&c)                    ; MAJ    
  402 
  403     add h, y1       ; h = k + w + h + S0                           ; -- 
  404     add h, y2       ; h = k + w + h + S0 + S1 + CH = t1 + S0       ; -- 
  405     add h, y3       ; h = t1 + S0 + MAJ                            ; -- 
  406 
  407 RotateState
  408 
  409 rotate_Ys
  410 %endm
  411 
  412 %macro DO_4ROUNDS 0
  413 
  414 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; RND N + 0 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  415 
  416     mov y2, f       ; y2 = f                                       ; CH 
  417     rorx    y0, e, 41   ; y0 = e >> 41                  ; S1A
  418     rorx    y1, e, 18   ; y1 = e >> 18                  ; S1B
  419     xor y2, g       ; y2 = f^g                                     ; CH 
  420 
  421     xor y0, y1      ; y0 = (e>>41) ^ (e>>18)            ; S1
  422     rorx    y1, e, 14   ; y1 = (e >> 14)                    ; S1
  423     and y2, e       ; y2 = (f^g)&e                                 ; CH 
  424 
  425     xor y0, y1      ; y0 = (e>>41) ^ (e>>18) ^ (e>>14)      ; S1
  426     rorx    T1, a, 34   ; T1 = a >> 34                  ; S0B
  427     xor y2, g       ; y2 = CH = ((f^g)&e)^g                        ; CH 
  428     rorx    y1, a, 39   ; y1 = a >> 39                  ; S0A
  429     mov y3, a       ; y3 = a                                       ; MAJA   
  430 
  431     xor y1, T1      ; y1 = (a>>39) ^ (a>>34)            ; S0
  432     rorx    T1, a, 28   ; T1 = (a >> 28)                    ; S0
  433     add h, [rsp + frame.XFER + 8*0]     ; h = k + w + h                                ; -- 
  434     or  y3, c       ; y3 = a|c                                     ; MAJA   
  435 
  436     xor y1, T1      ; y1 = (a>>39) ^ (a>>34) ^ (a>>28)      ; S0
  437     mov T1, a       ; T1 = a                                       ; MAJB   
  438     and y3, b       ; y3 = (a|c)&b                                 ; MAJA   
  439     and T1, c       ; T1 = a&c                                     ; MAJB   
  440     add y2, y0      ; y2 = S1 + CH                                 ; -- 
  441 
  442 
  443     add d, h        ; d = k + w + h + d                            ; -- 
  444     or  y3, T1      ; y3 = MAJ = (a|c)&b)|(a&c)                    ; MAJ    
  445     add h, y1       ; h = k + w + h + S0                           ; -- 
  446 
  447     add d, y2       ; d = k + w + h + d + S1 + CH = d + t1         ; -- 
  448 
  449 
  450     ;add    h, y2       ; h = k + w + h + S0 + S1 + CH = t1 + S0       ; -- 
  451 
  452     ;add    h, y3       ; h = t1 + S0 + MAJ                            ; -- 
  453 
  454     RotateState
  455 
  456 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; RND N + 1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  457 
  458     add old_h, y2   ; h = k + w + h + S0 + S1 + CH = t1 + S0       ; -- 
  459     mov y2, f       ; y2 = f                                       ; CH 
  460     rorx    y0, e, 41   ; y0 = e >> 41                  ; S1A
  461     rorx    y1, e, 18   ; y1 = e >> 18                  ; S1B
  462     xor y2, g       ; y2 = f^g                                     ; CH 
  463 
  464     xor y0, y1      ; y0 = (e>>41) ^ (e>>18)            ; S1
  465     rorx    y1, e, 14   ; y1 = (e >> 14)                    ; S1
  466     and y2, e       ; y2 = (f^g)&e                                 ; CH 
  467     add old_h, y3   ; h = t1 + S0 + MAJ                            ; -- 
  468 
  469     xor y0, y1      ; y0 = (e>>41) ^ (e>>18) ^ (e>>14)      ; S1
  470     rorx    T1, a, 34   ; T1 = a >> 34                  ; S0B
  471     xor y2, g       ; y2 = CH = ((f^g)&e)^g                        ; CH 
  472     rorx    y1, a, 39   ; y1 = a >> 39                  ; S0A
  473     mov y3, a       ; y3 = a                                       ; MAJA   
  474 
  475     xor y1, T1      ; y1 = (a>>39) ^ (a>>34)            ; S0
  476     rorx    T1, a, 28   ; T1 = (a >> 28)                    ; S0
  477     add h, [rsp + frame.XFER + 8*1]     ; h = k + w + h                                ; -- 
  478     or  y3, c       ; y3 = a|c                                     ; MAJA   
  479 
  480     xor y1, T1      ; y1 = (a>>39) ^ (a>>34) ^ (a>>28)      ; S0
  481     mov T1, a       ; T1 = a                                       ; MAJB   
  482     and y3, b       ; y3 = (a|c)&b                                 ; MAJA   
  483     and T1, c       ; T1 = a&c                                     ; MAJB   
  484     add y2, y0      ; y2 = S1 + CH                                 ; -- 
  485 
  486 
  487     add d, h        ; d = k + w + h + d                            ; -- 
  488     or  y3, T1      ; y3 = MAJ = (a|c)&b)|(a&c)                    ; MAJ    
  489     add h, y1       ; h = k + w + h + S0                           ; -- 
  490 
  491     add d, y2       ; d = k + w + h + d + S1 + CH = d + t1         ; -- 
  492 
  493 
  494     ;add    h, y2       ; h = k + w + h + S0 + S1 + CH = t1 + S0       ; -- 
  495 
  496     ;add    h, y3       ; h = t1 + S0 + MAJ                            ; -- 
  497 
  498     RotateState
  499 
  500 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; RND N + 2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  501 
  502     add old_h, y2       ; h = k + w + h + S0 + S1 + CH = t1 + S0       ; -- 
  503     mov y2, f       ; y2 = f                                       ; CH 
  504     rorx    y0, e, 41   ; y0 = e >> 41                  ; S1A
  505     rorx    y1, e, 18   ; y1 = e >> 18                  ; S1B
  506     xor y2, g       ; y2 = f^g                                     ; CH 
  507 
  508     xor y0, y1      ; y0 = (e>>41) ^ (e>>18)            ; S1
  509     rorx    y1, e, 14   ; y1 = (e >> 14)                    ; S1
  510     and y2, e       ; y2 = (f^g)&e                                 ; CH 
  511     add old_h, y3   ; h = t1 + S0 + MAJ                            ; -- 
  512 
  513     xor y0, y1      ; y0 = (e>>41) ^ (e>>18) ^ (e>>14)      ; S1
  514     rorx    T1, a, 34   ; T1 = a >> 34                  ; S0B
  515     xor y2, g       ; y2 = CH = ((f^g)&e)^g                        ; CH 
  516     rorx    y1, a, 39   ; y1 = a >> 39                  ; S0A
  517     mov y3, a       ; y3 = a                                       ; MAJA   
  518 
  519     xor y1, T1      ; y1 = (a>>39) ^ (a>>34)            ; S0
  520     rorx    T1, a, 28   ; T1 = (a >> 28)                    ; S0
  521     add h, [rsp + frame.XFER + 8*2]     ; h = k + w + h                                ; -- 
  522     or  y3, c       ; y3 = a|c                                     ; MAJA   
  523 
  524     xor y1, T1      ; y1 = (a>>39) ^ (a>>34) ^ (a>>28)      ; S0
  525     mov T1, a       ; T1 = a                                       ; MAJB   
  526     and y3, b       ; y3 = (a|c)&b                                 ; MAJA   
  527     and T1, c       ; T1 = a&c                                     ; MAJB   
  528     add y2, y0      ; y2 = S1 + CH                                 ; -- 
  529 
  530 
  531     add d, h        ; d = k + w + h + d                            ; -- 
  532     or  y3, T1      ; y3 = MAJ = (a|c)&b)|(a&c)                    ; MAJ    
  533     add h, y1       ; h = k + w + h + S0                           ; -- 
  534 
  535     add d, y2       ; d = k + w + h + d + S1 + CH = d + t1         ; -- 
  536 
  537 
  538     ;add    h, y2       ; h = k + w + h + S0 + S1 + CH = t1 + S0       ; -- 
  539 
  540     ;add    h, y3       ; h = t1 + S0 + MAJ                            ; -- 
  541 
  542     RotateState
  543 
  544 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; RND N + 3 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  545 
  546     add old_h, y2       ; h = k + w + h + S0 + S1 + CH = t1 + S0       ; -- 
  547     mov y2, f       ; y2 = f                                       ; CH 
  548     rorx    y0, e, 41   ; y0 = e >> 41                  ; S1A
  549     rorx    y1, e, 18   ; y1 = e >> 18                  ; S1B
  550     xor y2, g       ; y2 = f^g                                     ; CH 
  551 
  552     xor y0, y1      ; y0 = (e>>41) ^ (e>>18)            ; S1
  553     rorx    y1, e, 14   ; y1 = (e >> 14)                    ; S1
  554     and y2, e       ; y2 = (f^g)&e                                 ; CH 
  555     add old_h, y3   ; h = t1 + S0 + MAJ                            ; -- 
  556 
  557     xor y0, y1      ; y0 = (e>>41) ^ (e>>18) ^ (e>>14)      ; S1
  558     rorx    T1, a, 34   ; T1 = a >> 34                  ; S0B
  559     xor y2, g       ; y2 = CH = ((f^g)&e)^g                        ; CH 
  560     rorx    y1, a, 39   ; y1 = a >> 39                  ; S0A
  561     mov y3, a       ; y3 = a                                       ; MAJA   
  562 
  563     xor y1, T1      ; y1 = (a>>39) ^ (a>>34)            ; S0
  564     rorx    T1, a, 28   ; T1 = (a >> 28)                    ; S0
  565     add h, [rsp + frame.XFER + 8*3]     ; h = k + w + h                                ; -- 
  566     or  y3, c       ; y3 = a|c                                     ; MAJA   
  567 
  568     xor y1, T1      ; y1 = (a>>39) ^ (a>>34) ^ (a>>28)      ; S0
  569     mov T1, a       ; T1 = a                                       ; MAJB   
  570     and y3, b       ; y3 = (a|c)&b                                 ; MAJA   
  571     and T1, c       ; T1 = a&c                                     ; MAJB   
  572     add y2, y0      ; y2 = S1 + CH                                 ; -- 
  573 
  574 
  575     add d, h        ; d = k + w + h + d                            ; -- 
  576     or  y3, T1      ; y3 = MAJ = (a|c)&b)|(a&c)                    ; MAJ    
  577     add h, y1       ; h = k + w + h + S0                           ; -- 
  578 
  579     add d, y2       ; d = k + w + h + d + S1 + CH = d + t1         ; -- 
  580 
  581 
  582     add h, y2       ; h = k + w + h + S0 + S1 + CH = t1 + S0       ; -- 
  583 
  584     add h, y3       ; h = t1 + S0 + MAJ                            ; -- 
  585 
  586     RotateState
  587 
  588 %endm
  589 
  590 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  591 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  592 ; void sha512_rorx(const void* M, void* D, uint64_t L);
  593 ; Purpose: Updates the SHA512 digest stored at D with the message stored in M.
  594 ; The size of the message pointed to by M must be an integer multiple of SHA512
  595 ;   message blocks.
  596 ; L is the message length in SHA512 blocks
  597 global sha512_rorx:function
  598 global _sha512_rorx:function
  599 sha512_rorx:
  600 _sha512_rorx:
  601 
  602     ; Allocate Stack Space
  603     mov rax, rsp
  604     sub rsp, frame_size
  605     and rsp, ~(0x20 - 1)
  606     mov [rsp + frame.RSPSAVE], rax
  607 
  608     ; Save GPRs
  609     mov [rsp + frame.GPRSAVE + 8 * 0], rbp
  610     mov [rsp + frame.GPRSAVE + 8 * 1], rbx
  611     mov [rsp + frame.GPRSAVE + 8 * 2], r12
  612     mov [rsp + frame.GPRSAVE + 8 * 3], r13
  613     mov [rsp + frame.GPRSAVE + 8 * 4], r14
  614     mov [rsp + frame.GPRSAVE + 8 * 5], r15
  615 %ifdef WINABI
  616     mov [rsp + frame.GPRSAVE + 8 * 6], rsi
  617     mov [rsp + frame.GPRSAVE + 8 * 7], rdi
  618 %endif
  619 
  620 %ifdef WINABI
  621     vmovdqa [rsp + frame.XMMSAVE + 0*16], xmm6
  622     vmovdqa [rsp + frame.XMMSAVE + 1*16], xmm7
  623     vmovdqa [rsp + frame.XMMSAVE + 2*16], xmm8  
  624     vmovdqa [rsp + frame.XMMSAVE + 3*16], xmm9  
  625 %endif
  626 
  627     vpblendd    xmm0, xmm0, xmm1, 0xf0
  628     vpblendd    ymm0, ymm0, ymm1, 0xf0
  629 
  630     shl NUM_BLKS, 7 ; convert to bytes
  631     jz  done_hash
  632     add NUM_BLKS, INP   ; pointer to end of data
  633     mov [rsp + frame.INPEND], NUM_BLKS
  634 
  635     ;; load initial digest
  636     mov a,[8*0 + CTX]
  637     mov b,[8*1 + CTX]
  638     mov c,[8*2 + CTX]
  639     mov d,[8*3 + CTX]
  640     mov e,[8*4 + CTX]
  641     mov f,[8*5 + CTX]
  642     mov g,[8*6 + CTX]
  643     mov h,[8*7 + CTX]
  644 
  645     vmovdqa BYTE_FLIP_MASK, [PSHUFFLE_BYTE_FLIP_MASK wrt rip]
  646 
  647 loop0:
  648     lea TBL,[K512 wrt rip]
  649 
  650     ;; byte swap first 16 dwords
  651     COPY_YMM_AND_BSWAP  Y_0, [INP + 0*32], BYTE_FLIP_MASK
  652     COPY_YMM_AND_BSWAP  Y_1, [INP + 1*32], BYTE_FLIP_MASK
  653     COPY_YMM_AND_BSWAP  Y_2, [INP + 2*32], BYTE_FLIP_MASK
  654     COPY_YMM_AND_BSWAP  Y_3, [INP + 3*32], BYTE_FLIP_MASK
  655     
  656     mov [rsp + frame.INP], INP
  657 
  658     ;; schedule 64 input dwords, by doing 12 rounds of 4 each
  659     mov qword[rsp + frame.SRND],4
  660 
  661 align 16
  662 loop1:
  663     vpaddq  XFER, Y_0, [TBL + 0*32]
  664     vmovdqa [rsp + frame.XFER], XFER
  665     FOUR_ROUNDS_AND_SCHED
  666 
  667     vpaddq  XFER, Y_0, [TBL + 1*32]
  668     vmovdqa [rsp + frame.XFER], XFER
  669     FOUR_ROUNDS_AND_SCHED
  670 
  671     vpaddq  XFER, Y_0, [TBL + 2*32]
  672     vmovdqa [rsp + frame.XFER], XFER
  673     FOUR_ROUNDS_AND_SCHED
  674 
  675     vpaddq  XFER, Y_0, [TBL + 3*32]
  676     vmovdqa [rsp + frame.XFER], XFER
  677     add TBL, 4*32
  678     FOUR_ROUNDS_AND_SCHED
  679 
  680     sub qword[rsp + frame.SRND], 1
  681     jne loop1
  682 
  683     mov qword[rsp + frame.SRND], 2
  684 loop2:
  685     vpaddq  XFER, Y_0, [TBL + 0*32]
  686     vmovdqa [rsp + frame.XFER], XFER
  687     DO_4ROUNDS
  688     vpaddq  XFER, Y_1, [TBL + 1*32]
  689     vmovdqa [rsp + frame.XFER], XFER
  690     add TBL, 2*32
  691     DO_4ROUNDS
  692 
  693     vmovdqa Y_0, Y_2
  694     vmovdqa Y_1, Y_3
  695 
  696     sub qword[rsp + frame.SRND], 1
  697     jne loop2
  698 
  699     addm    [8*0 + CTX],a
  700     addm    [8*1 + CTX],b
  701     addm    [8*2 + CTX],c
  702     addm    [8*3 + CTX],d
  703     addm    [8*4 + CTX],e
  704     addm    [8*5 + CTX],f
  705     addm    [8*6 + CTX],g
  706     addm    [8*7 + CTX],h
  707 
  708     mov INP, [rsp + frame.INP]
  709     add INP, 128
  710     cmp INP, [rsp + frame.INPEND]
  711     jne loop0
  712 
  713     done_hash:
  714 %ifdef WINABI
  715     vmovdqa xmm6, [rsp + frame.XMMSAVE + 0*16]
  716     vmovdqa xmm7, [rsp + frame.XMMSAVE + 1*16]
  717     vmovdqa xmm8, [rsp + frame.XMMSAVE + 2*16]
  718     vmovdqa xmm9, [rsp + frame.XMMSAVE + 3*16]
  719 %endif
  720 
  721 ; Restore GPRs
  722     mov rbp, [rsp + frame.GPRSAVE + 8 * 0]
  723     mov rbx, [rsp + frame.GPRSAVE + 8 * 1]
  724     mov r12, [rsp + frame.GPRSAVE + 8 * 2]
  725     mov r13, [rsp + frame.GPRSAVE + 8 * 3]
  726     mov r14, [rsp + frame.GPRSAVE + 8 * 4]
  727     mov r15, [rsp + frame.GPRSAVE + 8 * 5]
  728 %ifdef WINABI
  729     mov rsi, [rsp + frame.GPRSAVE + 8 * 6]
  730     mov rdi, [rsp + frame.GPRSAVE + 8 * 7]
  731 %endif
  732     ; Restore Stack Pointer
  733     mov rsp, [rsp + frame.RSPSAVE]
  734 
  735     ret 
  736     
  737 
  738 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  739 ;;; Binary Data
  740 
  741 section .data
  742 
  743 align 64
  744 ; K[t] used in SHA512 hashing
  745 K512:
  746     dq  0x428a2f98d728ae22,0x7137449123ef65cd 
  747     dq  0xb5c0fbcfec4d3b2f,0xe9b5dba58189dbbc
  748     dq  0x3956c25bf348b538,0x59f111f1b605d019 
  749     dq  0x923f82a4af194f9b,0xab1c5ed5da6d8118
  750     dq  0xd807aa98a3030242,0x12835b0145706fbe 
  751     dq  0x243185be4ee4b28c,0x550c7dc3d5ffb4e2
  752     dq  0x72be5d74f27b896f,0x80deb1fe3b1696b1 
  753     dq  0x9bdc06a725c71235,0xc19bf174cf692694
  754     dq  0xe49b69c19ef14ad2,0xefbe4786384f25e3 
  755     dq  0x0fc19dc68b8cd5b5,0x240ca1cc77ac9c65
  756     dq  0x2de92c6f592b0275,0x4a7484aa6ea6e483 
  757     dq  0x5cb0a9dcbd41fbd4,0x76f988da831153b5
  758     dq  0x983e5152ee66dfab,0xa831c66d2db43210 
  759     dq  0xb00327c898fb213f,0xbf597fc7beef0ee4
  760     dq  0xc6e00bf33da88fc2,0xd5a79147930aa725 
  761     dq  0x06ca6351e003826f,0x142929670a0e6e70
  762     dq  0x27b70a8546d22ffc,0x2e1b21385c26c926 
  763     dq  0x4d2c6dfc5ac42aed,0x53380d139d95b3df
  764     dq  0x650a73548baf63de,0x766a0abb3c77b2a8 
  765     dq  0x81c2c92e47edaee6,0x92722c851482353b
  766     dq  0xa2bfe8a14cf10364,0xa81a664bbc423001 
  767     dq  0xc24b8b70d0f89791,0xc76c51a30654be30
  768     dq  0xd192e819d6ef5218,0xd69906245565a910 
  769     dq  0xf40e35855771202a,0x106aa07032bbd1b8
  770     dq  0x19a4c116b8d2d0c8,0x1e376c085141ab53 
  771     dq  0x2748774cdf8eeb99,0x34b0bcb5e19b48a8
  772     dq  0x391c0cb3c5c95a63,0x4ed8aa4ae3418acb 
  773     dq  0x5b9cca4f7763e373,0x682e6ff3d6b2b8a3
  774     dq  0x748f82ee5defb2fc,0x78a5636f43172f60 
  775     dq  0x84c87814a1f0ab72,0x8cc702081a6439ec
  776     dq  0x90befffa23631e28,0xa4506cebde82bde9 
  777     dq  0xbef9a3f7b2c67915,0xc67178f2e372532b
  778     dq  0xca273eceea26619c,0xd186b8c721c0c207 
  779     dq  0xeada7dd6cde0eb1e,0xf57d4f7fee6ed178
  780     dq  0x06f067aa72176fba,0x0a637dc5a2c898a6 
  781     dq  0x113f9804bef90dae,0x1b710b35131c471b
  782     dq  0x28db77f523047d84,0x32caab7b40c72493 
  783     dq  0x3c9ebe0a15c9bebc,0x431d67c49c100d4c
  784     dq  0x4cc5d4becb3e42b6,0x597f299cfc657e2a 
  785     dq  0x5fcb6fab3ad6faec,0x6c44198c4a475817
  786 
  787 align 32
  788 
  789 ; Mask for byte-swapping a couple of qwords in an XMM register using (v)pshufb.
  790 PSHUFFLE_BYTE_FLIP_MASK: ddq 0x08090a0b0c0d0e0f0001020304050607
  791                          ddq 0x18191a1b1c1d1e1f1011121314151617
  792 
  793 MASK_YMM_LO:         ddq 0x00000000000000000000000000000000
  794                      ddq 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
  795 
  796 %ifidn __OUTPUT_FORMAT__,elf
  797 section .note.GNU-stack noalloc noexec nowrite progbits
  798 %endif
  799 %ifidn __OUTPUT_FORMAT__,elf32
  800 section .note.GNU-stack noalloc noexec nowrite progbits
  801 %endif
  802 %ifidn __OUTPUT_FORMAT__,elf64
  803 section .note.GNU-stack noalloc noexec nowrite progbits
  804 %endif