2011-11-09 18:26:25 +04:00
/ *
* Serpent C i p h e r 8 - w a y p a r a l l e l a l g o r i t h m ( x86 _ 6 4 / S S E 2 )
*
* Copyright ( C ) 2 0 1 1 J u s s i K i v i l i n n a < j u s s i . k i v i l i n n a @mbnet.fi>
*
* Based o n c r y p t o / s e r p e n t . c b y
* Copyright ( C ) 2 0 0 2 D a g A r n e O s v i k < o s v i k @ii.uib.no>
* 2 0 0 3 Herbert V a l e r i o R i e d e l < h v r @gnu.org>
*
* This p r o g r a m i s f r e e s o f t w a r e ; you can redistribute it and/or modify
* it u n d e r t h e t e r m s o f t h e G N U G e n e r a l P u b l i c L i c e n s e a s p u b l i s h e d b y
* the F r e e S o f t w a r e F o u n d a t i o n ; either version 2 of the License, or
* ( at y o u r o p t i o n ) a n y l a t e r v e r s i o n .
*
* This p r o g r a m i s d i s t r i b u t e d i n t h e h o p e t h a t i t w i l l b e u s e f u l ,
* but W I T H O U T A N Y W A R R A N T Y ; without even the implied warranty of
* MERCHANTABILITY o r F I T N E S S F O R A P A R T I C U L A R P U R P O S E . S e e t h e
* GNU G e n e r a l P u b l i c L i c e n s e f o r m o r e d e t a i l s .
*
* You s h o u l d h a v e r e c e i v e d a c o p y o f t h e G N U G e n e r a l P u b l i c L i c e n s e
* along w i t h t h i s p r o g r a m ; if not, write to the Free Software
* Foundation, I n c . , 5 9 T e m p l e P l a c e , S u i t e 3 3 0 , B o s t o n , M A 0 2 1 1 1 - 1 3 0 7
* USA
*
* /
2013-01-19 15:39:36 +04:00
# include < l i n u x / l i n k a g e . h >
2011-11-09 18:26:25 +04:00
.file " serpent- s s e 2 - x86 _ 6 4 - a s m _ 6 4 . S "
.text
# define C T X % r d i
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
8 - way S S E 2 s e r p e n t
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
# define R A 1 % x m m 0
# define R B 1 % x m m 1
# define R C 1 % x m m 2
# define R D 1 % x m m 3
# define R E 1 % x m m 4
# define R A 2 % x m m 5
# define R B 2 % x m m 6
# define R C 2 % x m m 7
# define R D 2 % x m m 8
# define R E 2 % x m m 9
# define R N O T % x m m 1 0
# define R K 0 % x m m 1 1
# define R K 1 % x m m 1 2
# define R K 2 % x m m 1 3
# define R K 3 % x m m 1 4
# define S 0 _ 1 ( x0 , x1 , x2 , x3 , x4 ) \
movdqa x3 , x4 ; \
por x0 , x3 ; \
pxor x4 , x0 ; \
pxor x2 , x4 ; \
pxor R N O T , x4 ; \
pxor x1 , x3 ; \
pand x0 , x1 ; \
pxor x4 , x1 ; \
pxor x0 , x2 ;
# define S 0 _ 2 ( x0 , x1 , x2 , x3 , x4 ) \
pxor x3 , x0 ; \
por x0 , x4 ; \
pxor x2 , x0 ; \
pand x1 , x2 ; \
pxor x2 , x3 ; \
pxor R N O T , x1 ; \
pxor x4 , x2 ; \
pxor x2 , x1 ;
# define S 1 _ 1 ( x0 , x1 , x2 , x3 , x4 ) \
movdqa x1 , x4 ; \
pxor x0 , x1 ; \
pxor x3 , x0 ; \
pxor R N O T , x3 ; \
pand x1 , x4 ; \
por x1 , x0 ; \
pxor x2 , x3 ; \
pxor x3 , x0 ; \
pxor x3 , x1 ;
# define S 1 _ 2 ( x0 , x1 , x2 , x3 , x4 ) \
pxor x4 , x3 ; \
por x4 , x1 ; \
pxor x2 , x4 ; \
pand x0 , x2 ; \
pxor x1 , x2 ; \
por x0 , x1 ; \
pxor R N O T , x0 ; \
pxor x2 , x0 ; \
pxor x1 , x4 ;
# define S 2 _ 1 ( x0 , x1 , x2 , x3 , x4 ) \
pxor R N O T , x3 ; \
pxor x0 , x1 ; \
movdqa x0 , x4 ; \
pand x2 , x0 ; \
pxor x3 , x0 ; \
por x4 , x3 ; \
pxor x1 , x2 ; \
pxor x1 , x3 ; \
pand x0 , x1 ;
# define S 2 _ 2 ( x0 , x1 , x2 , x3 , x4 ) \
pxor x2 , x0 ; \
pand x3 , x2 ; \
por x1 , x3 ; \
pxor R N O T , x0 ; \
pxor x0 , x3 ; \
pxor x0 , x4 ; \
pxor x2 , x0 ; \
por x2 , x1 ;
# define S 3 _ 1 ( x0 , x1 , x2 , x3 , x4 ) \
movdqa x1 , x4 ; \
pxor x3 , x1 ; \
por x0 , x3 ; \
pand x0 , x4 ; \
pxor x2 , x0 ; \
pxor x1 , x2 ; \
pand x3 , x1 ; \
pxor x3 , x2 ; \
por x4 , x0 ; \
pxor x3 , x4 ;
# define S 3 _ 2 ( x0 , x1 , x2 , x3 , x4 ) \
pxor x0 , x1 ; \
pand x3 , x0 ; \
pand x4 , x3 ; \
pxor x2 , x3 ; \
por x1 , x4 ; \
pand x1 , x2 ; \
pxor x3 , x4 ; \
pxor x3 , x0 ; \
pxor x2 , x3 ;
# define S 4 _ 1 ( x0 , x1 , x2 , x3 , x4 ) \
movdqa x3 , x4 ; \
pand x0 , x3 ; \
pxor x4 , x0 ; \
pxor x2 , x3 ; \
por x4 , x2 ; \
pxor x1 , x0 ; \
pxor x3 , x4 ; \
por x0 , x2 ; \
pxor x1 , x2 ;
# define S 4 _ 2 ( x0 , x1 , x2 , x3 , x4 ) \
pand x0 , x1 ; \
pxor x4 , x1 ; \
pand x2 , x4 ; \
pxor x3 , x2 ; \
pxor x0 , x4 ; \
por x1 , x3 ; \
pxor R N O T , x1 ; \
pxor x0 , x3 ;
# define S 5 _ 1 ( x0 , x1 , x2 , x3 , x4 ) \
movdqa x1 , x4 ; \
por x0 , x1 ; \
pxor x1 , x2 ; \
pxor R N O T , x3 ; \
pxor x0 , x4 ; \
pxor x2 , x0 ; \
pand x4 , x1 ; \
por x3 , x4 ; \
pxor x0 , x4 ;
# define S 5 _ 2 ( x0 , x1 , x2 , x3 , x4 ) \
pand x3 , x0 ; \
pxor x3 , x1 ; \
pxor x2 , x3 ; \
pxor x1 , x0 ; \
pand x4 , x2 ; \
pxor x2 , x1 ; \
pand x0 , x2 ; \
pxor x2 , x3 ;
# define S 6 _ 1 ( x0 , x1 , x2 , x3 , x4 ) \
movdqa x1 , x4 ; \
pxor x0 , x3 ; \
pxor x2 , x1 ; \
pxor x0 , x2 ; \
pand x3 , x0 ; \
por x3 , x1 ; \
pxor R N O T , x4 ; \
pxor x1 , x0 ; \
pxor x2 , x1 ;
# define S 6 _ 2 ( x0 , x1 , x2 , x3 , x4 ) \
pxor x4 , x3 ; \
pxor x0 , x4 ; \
pand x0 , x2 ; \
pxor x1 , x4 ; \
pxor x3 , x2 ; \
pand x1 , x3 ; \
pxor x0 , x3 ; \
pxor x2 , x1 ;
# define S 7 _ 1 ( x0 , x1 , x2 , x3 , x4 ) \
pxor R N O T , x1 ; \
movdqa x1 , x4 ; \
pxor R N O T , x0 ; \
pand x2 , x1 ; \
pxor x3 , x1 ; \
por x4 , x3 ; \
pxor x2 , x4 ; \
pxor x3 , x2 ; \
pxor x0 , x3 ; \
por x1 , x0 ;
# define S 7 _ 2 ( x0 , x1 , x2 , x3 , x4 ) \
pand x0 , x2 ; \
pxor x4 , x0 ; \
pxor x3 , x4 ; \
pand x0 , x3 ; \
pxor x1 , x4 ; \
pxor x4 , x2 ; \
pxor x1 , x3 ; \
por x0 , x4 ; \
pxor x1 , x4 ;
# define S I 0 _ 1 ( x0 , x1 , x2 , x3 , x4 ) \
movdqa x3 , x4 ; \
pxor x0 , x1 ; \
por x1 , x3 ; \
pxor x1 , x4 ; \
pxor R N O T , x0 ; \
pxor x3 , x2 ; \
pxor x0 , x3 ; \
pand x1 , x0 ; \
pxor x2 , x0 ;
# define S I 0 _ 2 ( x0 , x1 , x2 , x3 , x4 ) \
pand x3 , x2 ; \
pxor x4 , x3 ; \
pxor x3 , x2 ; \
pxor x3 , x1 ; \
pand x0 , x3 ; \
pxor x0 , x1 ; \
pxor x2 , x0 ; \
pxor x3 , x4 ;
# define S I 1 _ 1 ( x0 , x1 , x2 , x3 , x4 ) \
pxor x3 , x1 ; \
movdqa x0 , x4 ; \
pxor x2 , x0 ; \
pxor R N O T , x2 ; \
por x1 , x4 ; \
pxor x3 , x4 ; \
pand x1 , x3 ; \
pxor x2 , x1 ; \
pand x4 , x2 ;
# define S I 1 _ 2 ( x0 , x1 , x2 , x3 , x4 ) \
pxor x1 , x4 ; \
por x3 , x1 ; \
pxor x0 , x3 ; \
pxor x0 , x2 ; \
por x4 , x0 ; \
pxor x4 , x2 ; \
pxor x0 , x1 ; \
pxor x1 , x4 ;
# define S I 2 _ 1 ( x0 , x1 , x2 , x3 , x4 ) \
pxor x1 , x2 ; \
movdqa x3 , x4 ; \
pxor R N O T , x3 ; \
por x2 , x3 ; \
pxor x4 , x2 ; \
pxor x0 , x4 ; \
pxor x1 , x3 ; \
por x2 , x1 ; \
pxor x0 , x2 ;
# define S I 2 _ 2 ( x0 , x1 , x2 , x3 , x4 ) \
pxor x4 , x1 ; \
por x3 , x4 ; \
pxor x3 , x2 ; \
pxor x2 , x4 ; \
pand x1 , x2 ; \
pxor x3 , x2 ; \
pxor x4 , x3 ; \
pxor x0 , x4 ;
# define S I 3 _ 1 ( x0 , x1 , x2 , x3 , x4 ) \
pxor x1 , x2 ; \
movdqa x1 , x4 ; \
pand x2 , x1 ; \
pxor x0 , x1 ; \
por x4 , x0 ; \
pxor x3 , x4 ; \
pxor x3 , x0 ; \
por x1 , x3 ; \
pxor x2 , x1 ;
# define S I 3 _ 2 ( x0 , x1 , x2 , x3 , x4 ) \
pxor x3 , x1 ; \
pxor x2 , x0 ; \
pxor x3 , x2 ; \
pand x1 , x3 ; \
pxor x0 , x1 ; \
pand x2 , x0 ; \
pxor x3 , x4 ; \
pxor x0 , x3 ; \
pxor x1 , x0 ;
# define S I 4 _ 1 ( x0 , x1 , x2 , x3 , x4 ) \
pxor x3 , x2 ; \
movdqa x0 , x4 ; \
pand x1 , x0 ; \
pxor x2 , x0 ; \
por x3 , x2 ; \
pxor R N O T , x4 ; \
pxor x0 , x1 ; \
pxor x2 , x0 ; \
pand x4 , x2 ;
# define S I 4 _ 2 ( x0 , x1 , x2 , x3 , x4 ) \
pxor x0 , x2 ; \
por x4 , x0 ; \
pxor x3 , x0 ; \
pand x2 , x3 ; \
pxor x3 , x4 ; \
pxor x1 , x3 ; \
pand x0 , x1 ; \
pxor x1 , x4 ; \
pxor x3 , x0 ;
# define S I 5 _ 1 ( x0 , x1 , x2 , x3 , x4 ) \
movdqa x1 , x4 ; \
por x2 , x1 ; \
pxor x4 , x2 ; \
pxor x3 , x1 ; \
pand x4 , x3 ; \
pxor x3 , x2 ; \
por x0 , x3 ; \
pxor R N O T , x0 ; \
pxor x2 , x3 ; \
por x0 , x2 ;
# define S I 5 _ 2 ( x0 , x1 , x2 , x3 , x4 ) \
pxor x1 , x4 ; \
pxor x4 , x2 ; \
pand x0 , x4 ; \
pxor x1 , x0 ; \
pxor x3 , x1 ; \
pand x2 , x0 ; \
pxor x3 , x2 ; \
pxor x2 , x0 ; \
pxor x4 , x2 ; \
pxor x3 , x4 ;
# define S I 6 _ 1 ( x0 , x1 , x2 , x3 , x4 ) \
pxor x2 , x0 ; \
movdqa x0 , x4 ; \
pand x3 , x0 ; \
pxor x3 , x2 ; \
pxor x2 , x0 ; \
pxor x1 , x3 ; \
por x4 , x2 ; \
pxor x3 , x2 ; \
pand x0 , x3 ;
# define S I 6 _ 2 ( x0 , x1 , x2 , x3 , x4 ) \
pxor R N O T , x0 ; \
pxor x1 , x3 ; \
pand x2 , x1 ; \
pxor x0 , x4 ; \
pxor x4 , x3 ; \
pxor x2 , x4 ; \
pxor x1 , x0 ; \
pxor x0 , x2 ;
# define S I 7 _ 1 ( x0 , x1 , x2 , x3 , x4 ) \
movdqa x3 , x4 ; \
pand x0 , x3 ; \
pxor x2 , x0 ; \
por x4 , x2 ; \
pxor x1 , x4 ; \
pxor R N O T , x0 ; \
por x3 , x1 ; \
pxor x0 , x4 ; \
pand x2 , x0 ; \
pxor x1 , x0 ;
# define S I 7 _ 2 ( x0 , x1 , x2 , x3 , x4 ) \
pand x2 , x1 ; \
pxor x2 , x3 ; \
pxor x3 , x4 ; \
pand x3 , x2 ; \
por x0 , x3 ; \
pxor x4 , x1 ; \
pxor x4 , x3 ; \
pand x0 , x4 ; \
pxor x2 , x4 ;
# define g e t _ k e y ( i , j , t ) \
movd ( 4 * ( i ) + ( j ) ) * 4 ( C T X ) , t ; \
pshufd $ 0 , t , t ;
# define K 2 ( x0 , x1 , x2 , x3 , x4 , i ) \
get_ k e y ( i , 0 , R K 0 ) ; \
get_ k e y ( i , 1 , R K 1 ) ; \
get_ k e y ( i , 2 , R K 2 ) ; \
get_ k e y ( i , 3 , R K 3 ) ; \
pxor R K 0 , x0 ## 1 ; \
pxor R K 1 , x1 ## 1 ; \
pxor R K 2 , x2 ## 1 ; \
pxor R K 3 , x3 ## 1 ; \
pxor R K 0 , x0 ## 2 ; \
pxor R K 1 , x1 ## 2 ; \
pxor R K 2 , x2 ## 2 ; \
pxor R K 3 , x3 ## 2 ;
# define L K 2 ( x0 , x1 , x2 , x3 , x4 , i ) \
movdqa x0 ## 1 , x4 ## 1 ; \
pslld $ 1 3 , x0 ## 1 ; \
psrld $ ( 3 2 - 1 3 ) , x4 ## 1 ; \
por x4 ## 1 , x0 ## 1 ; \
pxor x0 ## 1 , x1 ## 1 ; \
movdqa x2 ## 1 , x4 ## 1 ; \
pslld $ 3 , x2 ## 1 ; \
psrld $ ( 3 2 - 3 ) , x4 ## 1 ; \
por x4 ## 1 , x2 ## 1 ; \
pxor x2 ## 1 , x1 ## 1 ; \
movdqa x0 ## 2 , x4 ## 2 ; \
pslld $ 1 3 , x0 ## 2 ; \
psrld $ ( 3 2 - 1 3 ) , x4 ## 2 ; \
por x4 ## 2 , x0 ## 2 ; \
pxor x0 ## 2 , x1 ## 2 ; \
movdqa x2 ## 2 , x4 ## 2 ; \
pslld $ 3 , x2 ## 2 ; \
psrld $ ( 3 2 - 3 ) , x4 ## 2 ; \
por x4 ## 2 , x2 ## 2 ; \
pxor x2 ## 2 , x1 ## 2 ; \
movdqa x1 ## 1 , x4 ## 1 ; \
pslld $ 1 , x1 ## 1 ; \
psrld $ ( 3 2 - 1 ) , x4 ## 1 ; \
por x4 ## 1 , x1 ## 1 ; \
movdqa x0 ## 1 , x4 ## 1 ; \
pslld $ 3 , x4 ## 1 ; \
pxor x2 ## 1 , x3 ## 1 ; \
pxor x4 ## 1 , x3 ## 1 ; \
movdqa x3 ## 1 , x4 ## 1 ; \
get_ k e y ( i , 1 , R K 1 ) ; \
movdqa x1 ## 2 , x4 ## 2 ; \
pslld $ 1 , x1 ## 2 ; \
psrld $ ( 3 2 - 1 ) , x4 ## 2 ; \
por x4 ## 2 , x1 ## 2 ; \
movdqa x0 ## 2 , x4 ## 2 ; \
pslld $ 3 , x4 ## 2 ; \
pxor x2 ## 2 , x3 ## 2 ; \
pxor x4 ## 2 , x3 ## 2 ; \
movdqa x3 ## 2 , x4 ## 2 ; \
get_ k e y ( i , 3 , R K 3 ) ; \
pslld $ 7 , x3 ## 1 ; \
psrld $ ( 3 2 - 7 ) , x4 ## 1 ; \
por x4 ## 1 , x3 ## 1 ; \
movdqa x1 ## 1 , x4 ## 1 ; \
pslld $ 7 , x4 ## 1 ; \
pxor x1 ## 1 , x0 ## 1 ; \
pxor x3 ## 1 , x0 ## 1 ; \
pxor x3 ## 1 , x2 ## 1 ; \
pxor x4 ## 1 , x2 ## 1 ; \
get_ k e y ( i , 0 , R K 0 ) ; \
pslld $ 7 , x3 ## 2 ; \
psrld $ ( 3 2 - 7 ) , x4 ## 2 ; \
por x4 ## 2 , x3 ## 2 ; \
movdqa x1 ## 2 , x4 ## 2 ; \
pslld $ 7 , x4 ## 2 ; \
pxor x1 ## 2 , x0 ## 2 ; \
pxor x3 ## 2 , x0 ## 2 ; \
pxor x3 ## 2 , x2 ## 2 ; \
pxor x4 ## 2 , x2 ## 2 ; \
get_ k e y ( i , 2 , R K 2 ) ; \
pxor R K 1 , x1 ## 1 ; \
pxor R K 3 , x3 ## 1 ; \
movdqa x0 ## 1 , x4 ## 1 ; \
pslld $ 5 , x0 ## 1 ; \
psrld $ ( 3 2 - 5 ) , x4 ## 1 ; \
por x4 ## 1 , x0 ## 1 ; \
movdqa x2 ## 1 , x4 ## 1 ; \
pslld $ 2 2 , x2 ## 1 ; \
psrld $ ( 3 2 - 2 2 ) , x4 ## 1 ; \
por x4 ## 1 , x2 ## 1 ; \
pxor R K 0 , x0 ## 1 ; \
pxor R K 2 , x2 ## 1 ; \
pxor R K 1 , x1 ## 2 ; \
pxor R K 3 , x3 ## 2 ; \
movdqa x0 ## 2 , x4 ## 2 ; \
pslld $ 5 , x0 ## 2 ; \
psrld $ ( 3 2 - 5 ) , x4 ## 2 ; \
por x4 ## 2 , x0 ## 2 ; \
movdqa x2 ## 2 , x4 ## 2 ; \
pslld $ 2 2 , x2 ## 2 ; \
psrld $ ( 3 2 - 2 2 ) , x4 ## 2 ; \
por x4 ## 2 , x2 ## 2 ; \
pxor R K 0 , x0 ## 2 ; \
pxor R K 2 , x2 ## 2 ;
# define K L 2 ( x0 , x1 , x2 , x3 , x4 , i ) \
pxor R K 0 , x0 ## 1 ; \
pxor R K 2 , x2 ## 1 ; \
movdqa x0 ## 1 , x4 ## 1 ; \
psrld $ 5 , x0 ## 1 ; \
pslld $ ( 3 2 - 5 ) , x4 ## 1 ; \
por x4 ## 1 , x0 ## 1 ; \
pxor R K 3 , x3 ## 1 ; \
pxor R K 1 , x1 ## 1 ; \
movdqa x2 ## 1 , x4 ## 1 ; \
psrld $ 2 2 , x2 ## 1 ; \
pslld $ ( 3 2 - 2 2 ) , x4 ## 1 ; \
por x4 ## 1 , x2 ## 1 ; \
pxor x3 ## 1 , x2 ## 1 ; \
pxor R K 0 , x0 ## 2 ; \
pxor R K 2 , x2 ## 2 ; \
movdqa x0 ## 2 , x4 ## 2 ; \
psrld $ 5 , x0 ## 2 ; \
pslld $ ( 3 2 - 5 ) , x4 ## 2 ; \
por x4 ## 2 , x0 ## 2 ; \
pxor R K 3 , x3 ## 2 ; \
pxor R K 1 , x1 ## 2 ; \
movdqa x2 ## 2 , x4 ## 2 ; \
psrld $ 2 2 , x2 ## 2 ; \
pslld $ ( 3 2 - 2 2 ) , x4 ## 2 ; \
por x4 ## 2 , x2 ## 2 ; \
pxor x3 ## 2 , x2 ## 2 ; \
pxor x3 ## 1 , x0 ## 1 ; \
movdqa x1 ## 1 , x4 ## 1 ; \
pslld $ 7 , x4 ## 1 ; \
pxor x1 ## 1 , x0 ## 1 ; \
pxor x4 ## 1 , x2 ## 1 ; \
movdqa x1 ## 1 , x4 ## 1 ; \
psrld $ 1 , x1 ## 1 ; \
pslld $ ( 3 2 - 1 ) , x4 ## 1 ; \
por x4 ## 1 , x1 ## 1 ; \
pxor x3 ## 2 , x0 ## 2 ; \
movdqa x1 ## 2 , x4 ## 2 ; \
pslld $ 7 , x4 ## 2 ; \
pxor x1 ## 2 , x0 ## 2 ; \
pxor x4 ## 2 , x2 ## 2 ; \
movdqa x1 ## 2 , x4 ## 2 ; \
psrld $ 1 , x1 ## 2 ; \
pslld $ ( 3 2 - 1 ) , x4 ## 2 ; \
por x4 ## 2 , x1 ## 2 ; \
movdqa x3 ## 1 , x4 ## 1 ; \
psrld $ 7 , x3 ## 1 ; \
pslld $ ( 3 2 - 7 ) , x4 ## 1 ; \
por x4 ## 1 , x3 ## 1 ; \
pxor x0 ## 1 , x1 ## 1 ; \
movdqa x0 ## 1 , x4 ## 1 ; \
pslld $ 3 , x4 ## 1 ; \
pxor x4 ## 1 , x3 ## 1 ; \
movdqa x0 ## 1 , x4 ## 1 ; \
movdqa x3 ## 2 , x4 ## 2 ; \
psrld $ 7 , x3 ## 2 ; \
pslld $ ( 3 2 - 7 ) , x4 ## 2 ; \
por x4 ## 2 , x3 ## 2 ; \
pxor x0 ## 2 , x1 ## 2 ; \
movdqa x0 ## 2 , x4 ## 2 ; \
pslld $ 3 , x4 ## 2 ; \
pxor x4 ## 2 , x3 ## 2 ; \
movdqa x0 ## 2 , x4 ## 2 ; \
psrld $ 1 3 , x0 ## 1 ; \
pslld $ ( 3 2 - 1 3 ) , x4 ## 1 ; \
por x4 ## 1 , x0 ## 1 ; \
pxor x2 ## 1 , x1 ## 1 ; \
pxor x2 ## 1 , x3 ## 1 ; \
movdqa x2 ## 1 , x4 ## 1 ; \
psrld $ 3 , x2 ## 1 ; \
pslld $ ( 3 2 - 3 ) , x4 ## 1 ; \
por x4 ## 1 , x2 ## 1 ; \
psrld $ 1 3 , x0 ## 2 ; \
pslld $ ( 3 2 - 1 3 ) , x4 ## 2 ; \
por x4 ## 2 , x0 ## 2 ; \
pxor x2 ## 2 , x1 ## 2 ; \
pxor x2 ## 2 , x3 ## 2 ; \
movdqa x2 ## 2 , x4 ## 2 ; \
psrld $ 3 , x2 ## 2 ; \
pslld $ ( 3 2 - 3 ) , x4 ## 2 ; \
por x4 ## 2 , x2 ## 2 ;
# define S ( S B O X , x0 , x1 , x2 , x3 , x4 ) \
SBOX ## _ 1 ( x0 ## 1 , x1 ## 1 , x2 ## 1 , x3 ## 1 , x4 ## 1 ) ; \
SBOX ## _ 2 ( x0 ## 1 , x1 ## 1 , x2 ## 1 , x3 ## 1 , x4 ## 1 ) ; \
SBOX ## _ 1 ( x0 ## 2 , x1 ## 2 , x2 ## 2 , x3 ## 2 , x4 ## 2 ) ; \
SBOX ## _ 2 ( x0 ## 2 , x1 ## 2 , x2 ## 2 , x3 ## 2 , x4 ## 2 ) ;
# define S P ( S B O X , x0 , x1 , x2 , x3 , x4 , i ) \
get_ k e y ( i , 0 , R K 0 ) ; \
SBOX ## _ 1 ( x0 ## 1 , x1 ## 1 , x2 ## 1 , x3 ## 1 , x4 ## 1 ) ; \
get_ k e y ( i , 2 , R K 2 ) ; \
SBOX ## _ 1 ( x0 ## 2 , x1 ## 2 , x2 ## 2 , x3 ## 2 , x4 ## 2 ) ; \
get_ k e y ( i , 3 , R K 3 ) ; \
SBOX ## _ 2 ( x0 ## 1 , x1 ## 1 , x2 ## 1 , x3 ## 1 , x4 ## 1 ) ; \
get_ k e y ( i , 1 , R K 1 ) ; \
SBOX ## _ 2 ( x0 ## 2 , x1 ## 2 , x2 ## 2 , x3 ## 2 , x4 ## 2 ) ; \
2011-12-20 14:58:06 +04:00
# define t r a n s p o s e _ 4 x4 ( x0 , x1 , x2 , x3 , t 0 , t 1 , t 2 ) \
2011-11-09 18:26:25 +04:00
movdqa x0 , t 2 ; \
2011-12-20 14:58:06 +04:00
punpckldq x1 , x0 ; \
punpckhdq x1 , t 2 ; \
movdqa x2 , t 1 ; \
punpckhdq x3 , x2 ; \
punpckldq x3 , t 1 ; \
movdqa x0 , x1 ; \
punpcklqdq t 1 , x0 ; \
punpckhqdq t 1 , x1 ; \
movdqa t 2 , x3 ; \
punpcklqdq x2 , t 2 ; \
punpckhqdq x2 , x3 ; \
movdqa t 2 , x2 ;
2011-11-09 18:26:25 +04:00
# define r e a d _ b l o c k s ( i n , x0 , x1 , x2 , x3 , t 0 , t 1 , t 2 ) \
movdqu ( 0 * 4 * 4 ) ( i n ) , x0 ; \
movdqu ( 1 * 4 * 4 ) ( i n ) , x1 ; \
movdqu ( 2 * 4 * 4 ) ( i n ) , x2 ; \
movdqu ( 3 * 4 * 4 ) ( i n ) , x3 ; \
\
transpose_ 4 x4 ( x0 , x1 , x2 , x3 , t 0 , t 1 , t 2 )
# define w r i t e _ b l o c k s ( o u t , x0 , x1 , x2 , x3 , t 0 , t 1 , t 2 ) \
transpose_ 4 x4 ( x0 , x1 , x2 , x3 , t 0 , t 1 , t 2 ) \
\
movdqu x0 , ( 0 * 4 * 4 ) ( o u t ) ; \
movdqu x1 , ( 1 * 4 * 4 ) ( o u t ) ; \
movdqu x2 , ( 2 * 4 * 4 ) ( o u t ) ; \
movdqu x3 , ( 3 * 4 * 4 ) ( o u t ) ;
# define x o r _ b l o c k s ( o u t , x0 , x1 , x2 , x3 , t 0 , t 1 , t 2 ) \
transpose_ 4 x4 ( x0 , x1 , x2 , x3 , t 0 , t 1 , t 2 ) \
\
movdqu ( 0 * 4 * 4 ) ( o u t ) , t 0 ; \
pxor t 0 , x0 ; \
movdqu x0 , ( 0 * 4 * 4 ) ( o u t ) ; \
movdqu ( 1 * 4 * 4 ) ( o u t ) , t 0 ; \
pxor t 0 , x1 ; \
movdqu x1 , ( 1 * 4 * 4 ) ( o u t ) ; \
movdqu ( 2 * 4 * 4 ) ( o u t ) , t 0 ; \
pxor t 0 , x2 ; \
movdqu x2 , ( 2 * 4 * 4 ) ( o u t ) ; \
movdqu ( 3 * 4 * 4 ) ( o u t ) , t 0 ; \
pxor t 0 , x3 ; \
movdqu x3 , ( 3 * 4 * 4 ) ( o u t ) ;
2013-01-19 15:39:36 +04:00
ENTRY( _ _ s e r p e n t _ e n c _ b l k _ 8 w a y )
2011-11-09 18:26:25 +04:00
/ * input :
* % rdi : ctx, C T X
* % rsi : dst
* % rdx : src
* % rcx : bool, i f t r u e : x o r o u t p u t
* /
pcmpeqd R N O T , R N O T ;
leaq ( 4 * 4 * 4 ) ( % r d x ) , % r a x ;
read_ b l o c k s ( % r d x , R A 1 , R B 1 , R C 1 , R D 1 , R K 0 , R K 1 , R K 2 ) ;
read_ b l o c k s ( % r a x , R A 2 , R B 2 , R C 2 , R D 2 , R K 0 , R K 1 , R K 2 ) ;
K2 ( R A , R B , R C , R D , R E , 0 ) ;
S( S 0 , R A , R B , R C , R D , R E ) ; LK2(RC, RB, RD, RA, RE, 1);
S( S 1 , R C , R B , R D , R A , R E ) ; LK2(RE, RD, RA, RC, RB, 2);
S( S 2 , R E , R D , R A , R C , R B ) ; LK2(RB, RD, RE, RC, RA, 3);
S( S 3 , R B , R D , R E , R C , R A ) ; LK2(RC, RA, RD, RB, RE, 4);
S( S 4 , R C , R A , R D , R B , R E ) ; LK2(RA, RD, RB, RE, RC, 5);
S( S 5 , R A , R D , R B , R E , R C ) ; LK2(RC, RA, RD, RE, RB, 6);
S( S 6 , R C , R A , R D , R E , R B ) ; LK2(RD, RB, RA, RE, RC, 7);
S( S 7 , R D , R B , R A , R E , R C ) ; LK2(RC, RA, RE, RD, RB, 8);
S( S 0 , R C , R A , R E , R D , R B ) ; LK2(RE, RA, RD, RC, RB, 9);
S( S 1 , R E , R A , R D , R C , R B ) ; LK2(RB, RD, RC, RE, RA, 10);
S( S 2 , R B , R D , R C , R E , R A ) ; LK2(RA, RD, RB, RE, RC, 11);
S( S 3 , R A , R D , R B , R E , R C ) ; LK2(RE, RC, RD, RA, RB, 12);
S( S 4 , R E , R C , R D , R A , R B ) ; LK2(RC, RD, RA, RB, RE, 13);
S( S 5 , R C , R D , R A , R B , R E ) ; LK2(RE, RC, RD, RB, RA, 14);
S( S 6 , R E , R C , R D , R B , R A ) ; LK2(RD, RA, RC, RB, RE, 15);
S( S 7 , R D , R A , R C , R B , R E ) ; LK2(RE, RC, RB, RD, RA, 16);
S( S 0 , R E , R C , R B , R D , R A ) ; LK2(RB, RC, RD, RE, RA, 17);
S( S 1 , R B , R C , R D , R E , R A ) ; LK2(RA, RD, RE, RB, RC, 18);
S( S 2 , R A , R D , R E , R B , R C ) ; LK2(RC, RD, RA, RB, RE, 19);
S( S 3 , R C , R D , R A , R B , R E ) ; LK2(RB, RE, RD, RC, RA, 20);
S( S 4 , R B , R E , R D , R C , R A ) ; LK2(RE, RD, RC, RA, RB, 21);
S( S 5 , R E , R D , R C , R A , R B ) ; LK2(RB, RE, RD, RA, RC, 22);
S( S 6 , R B , R E , R D , R A , R C ) ; LK2(RD, RC, RE, RA, RB, 23);
S( S 7 , R D , R C , R E , R A , R B ) ; LK2(RB, RE, RA, RD, RC, 24);
S( S 0 , R B , R E , R A , R D , R C ) ; LK2(RA, RE, RD, RB, RC, 25);
S( S 1 , R A , R E , R D , R B , R C ) ; LK2(RC, RD, RB, RA, RE, 26);
S( S 2 , R C , R D , R B , R A , R E ) ; LK2(RE, RD, RC, RA, RB, 27);
S( S 3 , R E , R D , R C , R A , R B ) ; LK2(RA, RB, RD, RE, RC, 28);
S( S 4 , R A , R B , R D , R E , R C ) ; LK2(RB, RD, RE, RC, RA, 29);
S( S 5 , R B , R D , R E , R C , R A ) ; LK2(RA, RB, RD, RC, RE, 30);
S( S 6 , R A , R B , R D , R C , R E ) ; LK2(RD, RE, RB, RC, RA, 31);
S( S 7 , R D , R E , R B , R C , R A ) ; K2(RA, RB, RC, RD, RE, 32);
leaq ( 4 * 4 * 4 ) ( % r s i ) , % r a x ;
testb % c l , % c l ;
2013-01-19 15:39:36 +04:00
jnz . L _ _ e n c _ x o r8 ;
2011-11-09 18:26:25 +04:00
write_ b l o c k s ( % r s i , R A 1 , R B 1 , R C 1 , R D 1 , R K 0 , R K 1 , R K 2 ) ;
write_ b l o c k s ( % r a x , R A 2 , R B 2 , R C 2 , R D 2 , R K 0 , R K 1 , R K 2 ) ;
ret;
2013-01-19 15:39:36 +04:00
.L__enc_xor8 :
2011-11-09 18:26:25 +04:00
xor_ b l o c k s ( % r s i , R A 1 , R B 1 , R C 1 , R D 1 , R K 0 , R K 1 , R K 2 ) ;
xor_ b l o c k s ( % r a x , R A 2 , R B 2 , R C 2 , R D 2 , R K 0 , R K 1 , R K 2 ) ;
ret;
2013-01-19 15:39:36 +04:00
ENDPROC( _ _ s e r p e n t _ e n c _ b l k _ 8 w a y )
2011-11-09 18:26:25 +04:00
2013-01-19 15:39:36 +04:00
ENTRY( s e r p e n t _ d e c _ b l k _ 8 w a y )
2011-11-09 18:26:25 +04:00
/ * input :
* % rdi : ctx, C T X
* % rsi : dst
* % rdx : src
* /
pcmpeqd R N O T , R N O T ;
leaq ( 4 * 4 * 4 ) ( % r d x ) , % r a x ;
read_ b l o c k s ( % r d x , R A 1 , R B 1 , R C 1 , R D 1 , R K 0 , R K 1 , R K 2 ) ;
read_ b l o c k s ( % r a x , R A 2 , R B 2 , R C 2 , R D 2 , R K 0 , R K 1 , R K 2 ) ;
K2 ( R A , R B , R C , R D , R E , 3 2 ) ;
SP( S I 7 , R A , R B , R C , R D , R E , 3 1 ) ; KL2(RB, RD, RA, RE, RC, 31);
SP( S I 6 , R B , R D , R A , R E , R C , 3 0 ) ; KL2(RA, RC, RE, RB, RD, 30);
SP( S I 5 , R A , R C , R E , R B , R D , 2 9 ) ; KL2(RC, RD, RA, RE, RB, 29);
SP( S I 4 , R C , R D , R A , R E , R B , 2 8 ) ; KL2(RC, RA, RB, RE, RD, 28);
SP( S I 3 , R C , R A , R B , R E , R D , 2 7 ) ; KL2(RB, RC, RD, RE, RA, 27);
SP( S I 2 , R B , R C , R D , R E , R A , 2 6 ) ; KL2(RC, RA, RE, RD, RB, 26);
SP( S I 1 , R C , R A , R E , R D , R B , 2 5 ) ; KL2(RB, RA, RE, RD, RC, 25);
SP( S I 0 , R B , R A , R E , R D , R C , 2 4 ) ; KL2(RE, RC, RA, RB, RD, 24);
SP( S I 7 , R E , R C , R A , R B , R D , 2 3 ) ; KL2(RC, RB, RE, RD, RA, 23);
SP( S I 6 , R C , R B , R E , R D , R A , 2 2 ) ; KL2(RE, RA, RD, RC, RB, 22);
SP( S I 5 , R E , R A , R D , R C , R B , 2 1 ) ; KL2(RA, RB, RE, RD, RC, 21);
SP( S I 4 , R A , R B , R E , R D , R C , 2 0 ) ; KL2(RA, RE, RC, RD, RB, 20);
SP( S I 3 , R A , R E , R C , R D , R B , 1 9 ) ; KL2(RC, RA, RB, RD, RE, 19);
SP( S I 2 , R C , R A , R B , R D , R E , 1 8 ) ; KL2(RA, RE, RD, RB, RC, 18);
SP( S I 1 , R A , R E , R D , R B , R C , 1 7 ) ; KL2(RC, RE, RD, RB, RA, 17);
SP( S I 0 , R C , R E , R D , R B , R A , 1 6 ) ; KL2(RD, RA, RE, RC, RB, 16);
SP( S I 7 , R D , R A , R E , R C , R B , 1 5 ) ; KL2(RA, RC, RD, RB, RE, 15);
SP( S I 6 , R A , R C , R D , R B , R E , 1 4 ) ; KL2(RD, RE, RB, RA, RC, 14);
SP( S I 5 , R D , R E , R B , R A , R C , 1 3 ) ; KL2(RE, RC, RD, RB, RA, 13);
SP( S I 4 , R E , R C , R D , R B , R A , 1 2 ) ; KL2(RE, RD, RA, RB, RC, 12);
SP( S I 3 , R E , R D , R A , R B , R C , 1 1 ) ; KL2(RA, RE, RC, RB, RD, 11);
SP( S I 2 , R A , R E , R C , R B , R D , 1 0 ) ; KL2(RE, RD, RB, RC, RA, 10);
SP( S I 1 , R E , R D , R B , R C , R A , 9 ) ; KL2(RA, RD, RB, RC, RE, 9);
SP( S I 0 , R A , R D , R B , R C , R E , 8 ) ; KL2(RB, RE, RD, RA, RC, 8);
SP( S I 7 , R B , R E , R D , R A , R C , 7 ) ; KL2(RE, RA, RB, RC, RD, 7);
SP( S I 6 , R E , R A , R B , R C , R D , 6 ) ; KL2(RB, RD, RC, RE, RA, 6);
SP( S I 5 , R B , R D , R C , R E , R A , 5 ) ; KL2(RD, RA, RB, RC, RE, 5);
SP( S I 4 , R D , R A , R B , R C , R E , 4 ) ; KL2(RD, RB, RE, RC, RA, 4);
SP( S I 3 , R D , R B , R E , R C , R A , 3 ) ; KL2(RE, RD, RA, RC, RB, 3);
SP( S I 2 , R E , R D , R A , R C , R B , 2 ) ; KL2(RD, RB, RC, RA, RE, 2);
SP( S I 1 , R D , R B , R C , R A , R E , 1 ) ; KL2(RE, RB, RC, RA, RD, 1);
S( S I 0 , R E , R B , R C , R A , R D ) ; K2(RC, RD, RB, RE, RA, 0);
leaq ( 4 * 4 * 4 ) ( % r s i ) , % r a x ;
write_ b l o c k s ( % r s i , R C 1 , R D 1 , R B 1 , R E 1 , R K 0 , R K 1 , R K 2 ) ;
write_ b l o c k s ( % r a x , R C 2 , R D 2 , R B 2 , R E 2 , R K 0 , R K 1 , R K 2 ) ;
ret;
2013-01-19 15:39:36 +04:00
ENDPROC( s e r p e n t _ d e c _ b l k _ 8 w a y )