2012-05-28 15:54:24 +02:00
/ *
* Twofish 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 ( A V X / x86 _ 6 4 )
*
* Copyright ( C ) 2 0 1 2 J o h a n n e s G o e t z f r i e d
* < Johannes. G o e t z f r i e d @informatik.stud.uni-erlangen.de>
*
2013-04-08 21:51:00 +03:00
* Copyright © 2 0 1 2 - 2 0 1 3 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 @iki.fi>
2012-08-28 14:24:43 +03:00
*
2012-05-28 15:54:24 +02:00
* 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 13:39:46 +02:00
# include < l i n u x / l i n k a g e . h >
2012-10-20 15:06:46 +03:00
# include " g l u e _ h e l p e r - a s m - a v x . S "
2012-05-28 15:54:24 +02:00
.file " twofish- a v x - x86 _ 6 4 - a s m _ 6 4 . S "
2012-10-20 15:06:46 +03:00
.data
.align 16
.Lbswap128_mask :
.byte 1 5 , 1 4 , 1 3 , 1 2 , 1 1 , 1 0 , 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 , 0
2013-04-08 21:51:00 +03:00
.Lxts_gf128mul_and_shl1_mask :
.byte 0 x8 7 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0
2012-10-20 15:06:46 +03:00
2012-05-28 15:54:24 +02:00
.text
/* structure of crypto context */
# define s0 0
# define s1 1 0 2 4
# define s2 2 0 4 8
# define s3 3 0 7 2
# define w 4 0 9 6
# define k 4 1 2 8
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
8 - way A V X t w o f i s h
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
# define C T X % r d i
# 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 A 2 % x m m 4
# define R B 2 % x m m 5
# define R C 2 % x m m 6
# define R D 2 % x m m 7
2012-08-28 14:24:43 +03:00
# define R X 0 % x m m 8
# define R Y 0 % x m m 9
# define R X 1 % x m m 1 0
# define R Y 1 % x m m 1 1
2012-05-28 15:54:24 +02:00
2012-08-28 14:24:43 +03:00
# define R K 1 % x m m 1 2
# define R K 2 % x m m 1 3
2012-05-28 15:54:24 +02:00
2012-08-28 14:24:43 +03:00
# define R T % x m m 1 4
# define R R % x m m 1 5
# define R I D 1 % r b p
# define R I D 1 d % e b p
# define R I D 2 % r s i
# define R I D 2 d % e s i
2012-05-28 15:54:24 +02:00
# define R G I 1 % r d x
# define R G I 1 b l % d l
# define R G I 1 b h % d h
# define R G I 2 % r c x
# define R G I 2 b l % c l
# define R G I 2 b h % c h
2012-08-28 14:24:43 +03:00
# define R G I 3 % r a x
# define R G I 3 b l % a l
# define R G I 3 b h % a h
# define R G I 4 % r b x
# define R G I 4 b l % b l
# define R G I 4 b h % b h
2012-05-28 15:54:24 +02:00
# define R G S 1 % r8
# define R G S 1 d % r8 d
# define R G S 2 % r9
# define R G S 2 d % r9 d
# define R G S 3 % r10
# define R G S 3 d % r10 d
2012-08-28 14:24:43 +03:00
# define l o o k u p _ 3 2 b i t ( t 0 , t 1 , t 2 , t 3 , s r c , d s t , i n t e r l e a v e _ o p , i l _ r e g ) \
movzbl s r c ## b l , R I D 1 d ; \
movzbl s r c ## b h , R I D 2 d ; \
2012-05-28 15:54:24 +02:00
shrq $ 1 6 , s r c ; \
2012-08-28 14:24:43 +03:00
movl t 0 ( C T X , R I D 1 , 4 ) , d s t ## d ; \
movl t 1 ( C T X , R I D 2 , 4 ) , R I D 2 d ; \
movzbl s r c ## b l , R I D 1 d ; \
xorl R I D 2 d , d s t ## d ; \
movzbl s r c ## b h , R I D 2 d ; \
interleave_ o p ( i l _ r e g ) ; \
2012-05-28 15:54:24 +02:00
xorl t 2 ( C T X , R I D 1 , 4 ) , d s t ## d ; \
xorl t 3 ( C T X , R I D 2 , 4 ) , d s t ## d ;
2012-08-28 14:24:43 +03:00
# define d u m m y ( d ) / * d o n o t h i n g * /
# define s h r _ n e x t ( r e g ) \
shrq $ 1 6 , r e g ;
# define G ( g i 1 , g i 2 , x , t 0 , t 1 , t 2 , t 3 ) \
lookup_ 3 2 b i t ( t 0 , t 1 , t 2 , t 3 , ## g i 1 , R G S 1 , s h r _ n e x t , ## g i 1 ) ; \
lookup_ 3 2 b i t ( t 0 , t 1 , t 2 , t 3 , ## g i 2 , R G S 3 , s h r _ n e x t , ## g i 2 ) ; \
\
lookup_ 3 2 b i t ( t 0 , t 1 , t 2 , t 3 , ## g i 1 , R G S 2 , d u m m y , n o n e ) ; \
shlq $ 3 2 , R G S 2 ; \
orq R G S 1 , R G S 2 ; \
lookup_ 3 2 b i t ( t 0 , t 1 , t 2 , t 3 , ## g i 2 , R G S 1 , d u m m y , n o n e ) ; \
shlq $ 3 2 , R G S 1 ; \
orq R G S 1 , R G S 3 ;
# define r o u n d _ h e a d _ 2 ( a , b , x1 , y 1 , x2 , y 2 ) \
vmovq b ## 1 , R G I 3 ; \
vpextrq $ 1 , b ## 1 , R G I 4 ; \
2012-05-28 15:54:24 +02:00
\
2012-08-28 14:24:43 +03:00
G( R G I 1 , R G I 2 , x1 , s0 , s1 , s2 , s3 ) ; \
vmovq a ## 2 , R G I 1 ; \
vpextrq $ 1 , a ## 2 , R G I 2 ; \
vmovq R G S 2 , x1 ; \
vpinsrq $ 1 , R G S 3 , x1 , x1 ; \
2012-05-28 15:54:24 +02:00
\
2012-08-28 14:24:43 +03:00
G( R G I 3 , R G I 4 , y 1 , s1 , s2 , s3 , s0 ) ; \
vmovq b ## 2 , R G I 3 ; \
vpextrq $ 1 , b ## 2 , R G I 4 ; \
vmovq R G S 2 , y 1 ; \
vpinsrq $ 1 , R G S 3 , y 1 , y 1 ; \
2012-05-28 15:54:24 +02:00
\
2012-08-28 14:24:43 +03:00
G( R G I 1 , R G I 2 , x2 , s0 , s1 , s2 , s3 ) ; \
vmovq R G S 2 , x2 ; \
vpinsrq $ 1 , R G S 3 , x2 , x2 ; \
\
G( R G I 3 , R G I 4 , y 2 , s1 , s2 , s3 , s0 ) ; \
vmovq R G S 2 , y 2 ; \
vpinsrq $ 1 , R G S 3 , y 2 , y 2 ;
2012-05-28 15:54:24 +02:00
2012-08-28 14:24:43 +03:00
# define e n c r o u n d _ t a i l ( a , b , c , d , x , y , p r e r o t a t e ) \
2012-05-28 15:54:24 +02:00
vpaddd x , y , x ; \
2012-08-28 14:24:43 +03:00
vpaddd x , R K 1 , R T ;\
prerotate( b ) ; \
vpxor R T , c , c ; \
2012-05-28 15:54:24 +02:00
vpaddd y , x , y ; \
vpaddd y , R K 2 , y ; \
2012-08-28 14:24:43 +03:00
vpsrld $ 1 , c , R T ; \
2012-05-28 15:54:24 +02:00
vpslld $ ( 3 2 - 1 ) , c , c ; \
2012-08-28 14:24:43 +03:00
vpor c , R T , c ; \
vpxor d , y , d ; \
# define d e c r o u n d _ t a i l ( a , b , c , d , x , y , p r e r o t a t e ) \
2012-05-28 15:54:24 +02:00
vpaddd x , y , x ; \
2012-08-28 14:24:43 +03:00
vpaddd x , R K 1 , R T ;\
prerotate( a ) ; \
vpxor R T , c , c ; \
2012-05-28 15:54:24 +02:00
vpaddd y , x , y ; \
vpaddd y , R K 2 , y ; \
vpxor d , y , d ; \
vpsrld $ 1 , d , y ; \
vpslld $ ( 3 2 - 1 ) , d , d ; \
vpor d , y , d ; \
2012-08-28 14:24:43 +03:00
# define r o t a t e _ 1 l ( x ) \
vpslld $ 1 , x , R R ; \
vpsrld $ ( 3 2 - 1 ) , x , x ; \
vpor x , R R , x ;
# define p r e l o a d _ r g i ( c ) \
vmovq c , R G I 1 ; \
vpextrq $ 1 , c , R G I 2 ;
# define e n c r y p t _ r o u n d ( n , a , b , c , d , p r e l o a d , p r e r o t a t e ) \
vbroadcastss ( k + 4 * ( 2 * ( n ) ) ) ( C T X ) , R K 1 ; \
vbroadcastss ( k + 4 * ( 2 * ( n ) + 1 ) ) ( C T X ) , R K 2 ; \
round_ h e a d _ 2 ( a , b , R X 0 , R Y 0 , R X 1 , R Y 1 ) ; \
encround_ t a i l ( a ## 1 , b ## 1 , c ## 1 , d ## 1 , R X 0 , R Y 0 , p r e r o t a t e ) ; \
preload( c ## 1 ) ; \
encround_ t a i l ( a ## 2 , b ## 2 , c ## 2 , d ## 2 , R X 1 , R Y 1 , p r e r o t a t e ) ;
# define d e c r y p t _ r o u n d ( n , a , b , c , d , p r e l o a d , p r e r o t a t e ) \
vbroadcastss ( k + 4 * ( 2 * ( n ) ) ) ( C T X ) , R K 1 ; \
vbroadcastss ( k + 4 * ( 2 * ( n ) + 1 ) ) ( C T X ) , R K 2 ; \
round_ h e a d _ 2 ( a , b , R X 0 , R Y 0 , R X 1 , R Y 1 ) ; \
decround_ t a i l ( a ## 1 , b ## 1 , c ## 1 , d ## 1 , R X 0 , R Y 0 , p r e r o t a t e ) ; \
preload( c ## 1 ) ; \
decround_ t a i l ( a ## 2 , b ## 2 , c ## 2 , d ## 2 , R X 1 , R Y 1 , p r e r o t a t e ) ;
2012-05-28 15:54:24 +02:00
# define e n c r y p t _ c y c l e ( n ) \
2012-08-28 14:24:43 +03:00
encrypt_ r o u n d ( ( 2 * n ) , R A , R B , R C , R D , p r e l o a d _ r g i , r o t a t e _ 1 l ) ; \
encrypt_ r o u n d ( ( ( 2 * n ) + 1 ) , R C , R D , R A , R B , p r e l o a d _ r g i , r o t a t e _ 1 l ) ;
# define e n c r y p t _ c y c l e _ l a s t ( n ) \
encrypt_ r o u n d ( ( 2 * n ) , R A , R B , R C , R D , p r e l o a d _ r g i , r o t a t e _ 1 l ) ; \
encrypt_ r o u n d ( ( ( 2 * n ) + 1 ) , R C , R D , R A , R B , d u m m y , d u m m y ) ;
2012-05-28 15:54:24 +02:00
# define d e c r y p t _ c y c l e ( n ) \
2012-08-28 14:24:43 +03:00
decrypt_ r o u n d ( ( ( 2 * n ) + 1 ) , R C , R D , R A , R B , p r e l o a d _ r g i , r o t a t e _ 1 l ) ; \
decrypt_ r o u n d ( ( 2 * n ) , R A , R B , R C , R D , p r e l o a d _ r g i , r o t a t e _ 1 l ) ;
2012-05-28 15:54:24 +02:00
2012-08-28 14:24:43 +03:00
# define d e c r y p t _ c y c l e _ l a s t ( n ) \
decrypt_ r o u n d ( ( ( 2 * n ) + 1 ) , R C , R D , R A , R B , p r e l o a d _ r g i , r o t a t e _ 1 l ) ; \
decrypt_ r o u n d ( ( 2 * n ) , R A , R B , R C , R D , d u m m y , d u m m y ) ;
2012-05-28 15:54:24 +02:00
# define t r a n s p o s e _ 4 x4 ( x0 , x1 , x2 , x3 , t 0 , t 1 , t 2 ) \
vpunpckldq x1 , x0 , t 0 ; \
vpunpckhdq x1 , x0 , t 2 ; \
vpunpckldq x3 , x2 , t 1 ; \
vpunpckhdq x3 , x2 , x3 ; \
\
vpunpcklqdq t 1 , t 0 , x0 ; \
vpunpckhqdq t 1 , t 0 , x1 ; \
vpunpcklqdq x3 , t 2 , x2 ; \
vpunpckhqdq x3 , t 2 , x3 ;
2012-10-20 15:06:46 +03:00
# define i n p a c k _ b l o c k s ( x0 , x1 , x2 , x3 , w k e y , t 0 , t 1 , t 2 ) \
vpxor x0 , w k e y , x0 ; \
vpxor x1 , w k e y , x1 ; \
vpxor x2 , w k e y , x2 ; \
vpxor x3 , w k e y , x3 ; \
2012-05-28 15:54:24 +02:00
\
transpose_ 4 x4 ( x0 , x1 , x2 , x3 , t 0 , t 1 , t 2 )
2012-10-20 15:06:46 +03:00
# define o u t u n p a c k _ b l o c k s ( x0 , x1 , x2 , x3 , w k e y , t 0 , t 1 , t 2 ) \
2012-05-28 15:54:24 +02:00
transpose_ 4 x4 ( x0 , x1 , x2 , x3 , t 0 , t 1 , t 2 ) \
\
2012-10-20 15:06:46 +03:00
vpxor x0 , w k e y , x0 ; \
vpxor x1 , w k e y , x1 ; \
vpxor x2 , w k e y , x2 ; \
vpxor x3 , w k e y , x3 ;
2012-05-28 15:54:24 +02:00
.align 8
2012-10-20 15:06:46 +03:00
__twofish_enc_blk8 :
2012-05-28 15:54:24 +02:00
/ * input :
* % rdi : ctx, C T X
2012-10-20 15:06:46 +03:00
* RA1 , R B 1 , R C 1 , R D 1 , R A 2 , R B 2 , R C 2 , R D 2 : b l o c k s
* output :
* RC1 , R D 1 , R A 1 , R B 1 , R C 2 , R D 2 , R A 2 , R B 2 : e n c r y p t e d b l o c k s
2012-05-28 15:54:24 +02:00
* /
2012-10-20 15:06:46 +03:00
vmovdqu w ( C T X ) , R K 1 ;
2012-08-28 14:24:43 +03:00
pushq % r b p ;
2012-05-28 15:54:24 +02:00
pushq % r b x ;
pushq % r c x ;
2012-10-20 15:06:46 +03:00
inpack_ b l o c k s ( R A 1 , R B 1 , R C 1 , R D 1 , R K 1 , R X 0 , R Y 0 , R K 2 ) ;
2012-08-28 14:24:43 +03:00
preload_ r g i ( R A 1 ) ;
rotate_ 1 l ( R D 1 ) ;
2012-10-20 15:06:46 +03:00
inpack_ b l o c k s ( R A 2 , R B 2 , R C 2 , R D 2 , R K 1 , R X 0 , R Y 0 , R K 2 ) ;
2012-08-28 14:24:43 +03:00
rotate_ 1 l ( R D 2 ) ;
2012-05-28 15:54:24 +02:00
encrypt_ c y c l e ( 0 ) ;
encrypt_ c y c l e ( 1 ) ;
encrypt_ c y c l e ( 2 ) ;
encrypt_ c y c l e ( 3 ) ;
encrypt_ c y c l e ( 4 ) ;
encrypt_ c y c l e ( 5 ) ;
encrypt_ c y c l e ( 6 ) ;
2012-08-28 14:24:43 +03:00
encrypt_ c y c l e _ l a s t ( 7 ) ;
2012-05-28 15:54:24 +02:00
vmovdqu ( w + 4 * 4 ) ( C T X ) , R K 1 ;
popq % r c x ;
popq % r b x ;
2012-08-28 14:24:43 +03:00
popq % r b p ;
2012-05-28 15:54:24 +02:00
2012-10-20 15:06:46 +03:00
outunpack_ b l o c k s ( R C 1 , R D 1 , R A 1 , R B 1 , R K 1 , R X 0 , R Y 0 , R K 2 ) ;
outunpack_ b l o c k s ( R C 2 , R D 2 , R A 2 , R B 2 , R K 1 , R X 0 , R Y 0 , R K 2 ) ;
2012-05-28 15:54:24 +02:00
ret;
2013-01-19 13:39:46 +02:00
ENDPROC( _ _ t w o f i s h _ e n c _ b l k 8 )
2012-05-28 15:54:24 +02:00
.align 8
2012-10-20 15:06:46 +03:00
__twofish_dec_blk8 :
2012-05-28 15:54:24 +02:00
/ * input :
* % rdi : ctx, C T X
2012-10-20 15:06:46 +03:00
* RC1 , R D 1 , R A 1 , R B 1 , R C 2 , R D 2 , R A 2 , R B 2 : e n c r y p t e d b l o c k s
* output :
* RA1 , R B 1 , R C 1 , R D 1 , R A 2 , R B 2 , R C 2 , R D 2 : d e c r y p t e d b l o c k s
2012-05-28 15:54:24 +02:00
* /
2012-10-20 15:06:46 +03:00
vmovdqu ( w + 4 * 4 ) ( C T X ) , R K 1 ;
2012-08-28 14:24:43 +03:00
pushq % r b p ;
2012-05-28 15:54:24 +02:00
pushq % r b x ;
2012-10-20 15:06:46 +03:00
inpack_ b l o c k s ( R C 1 , R D 1 , R A 1 , R B 1 , R K 1 , R X 0 , R Y 0 , R K 2 ) ;
2012-08-28 14:24:43 +03:00
preload_ r g i ( R C 1 ) ;
rotate_ 1 l ( R A 1 ) ;
2012-10-20 15:06:46 +03:00
inpack_ b l o c k s ( R C 2 , R D 2 , R A 2 , R B 2 , R K 1 , R X 0 , R Y 0 , R K 2 ) ;
2012-08-28 14:24:43 +03:00
rotate_ 1 l ( R A 2 ) ;
2012-05-28 15:54:24 +02:00
decrypt_ c y c l e ( 7 ) ;
decrypt_ c y c l e ( 6 ) ;
decrypt_ c y c l e ( 5 ) ;
decrypt_ c y c l e ( 4 ) ;
decrypt_ c y c l e ( 3 ) ;
decrypt_ c y c l e ( 2 ) ;
decrypt_ c y c l e ( 1 ) ;
2012-08-28 14:24:43 +03:00
decrypt_ c y c l e _ l a s t ( 0 ) ;
2012-05-28 15:54:24 +02:00
vmovdqu ( w ) ( C T X ) , R K 1 ;
popq % r b x ;
2012-08-28 14:24:43 +03:00
popq % r b p ;
2012-05-28 15:54:24 +02:00
2012-10-20 15:06:46 +03:00
outunpack_ b l o c k s ( R A 1 , R B 1 , R C 1 , R D 1 , R K 1 , R X 0 , R Y 0 , R K 2 ) ;
outunpack_ b l o c k s ( R A 2 , R B 2 , R C 2 , R D 2 , R K 1 , R X 0 , R Y 0 , R K 2 ) ;
ret;
2013-01-19 13:39:46 +02:00
ENDPROC( _ _ t w o f i s h _ d e c _ b l k 8 )
2012-10-20 15:06:46 +03:00
2013-01-19 13:39:46 +02:00
ENTRY( t w o f i s h _ e c b _ e n c _ 8 w a y )
2012-10-20 15:06:46 +03:00
/ * input :
* % rdi : ctx, C T X
* % rsi : dst
* % rdx : src
* /
movq % r s i , % r11 ;
load_ 8 w a y ( % r d x , R A 1 , R B 1 , R C 1 , R D 1 , R A 2 , R B 2 , R C 2 , R D 2 ) ;
call _ _ t w o f i s h _ e n c _ b l k 8 ;
store_ 8 w a y ( % r11 , R C 1 , R D 1 , R A 1 , R B 1 , R C 2 , R D 2 , R A 2 , R B 2 ) ;
ret;
2013-01-19 13:39:46 +02:00
ENDPROC( t w o f i s h _ e c b _ e n c _ 8 w a y )
2012-10-20 15:06:46 +03:00
2013-01-19 13:39:46 +02:00
ENTRY( t w o f i s h _ e c b _ d e c _ 8 w a y )
2012-10-20 15:06:46 +03:00
/ * input :
* % rdi : ctx, C T X
* % rsi : dst
* % rdx : src
* /
movq % r s i , % r11 ;
load_ 8 w a y ( % r d x , R C 1 , R D 1 , R A 1 , R B 1 , R C 2 , R D 2 , R A 2 , R B 2 ) ;
call _ _ t w o f i s h _ d e c _ b l k 8 ;
store_ 8 w a y ( % r11 , R A 1 , R B 1 , R C 1 , R D 1 , R A 2 , R B 2 , R C 2 , R D 2 ) ;
ret;
2013-01-19 13:39:46 +02:00
ENDPROC( t w o f i s h _ e c b _ d e c _ 8 w a y )
2012-10-20 15:06:46 +03:00
2013-01-19 13:39:46 +02:00
ENTRY( t w o f i s h _ c b c _ d e c _ 8 w a y )
2012-10-20 15:06:46 +03:00
/ * input :
* % rdi : ctx, C T X
* % rsi : dst
* % rdx : src
* /
pushq % r12 ;
movq % r s i , % r11 ;
movq % r d x , % r12 ;
load_ 8 w a y ( % r d x , R C 1 , R D 1 , R A 1 , R B 1 , R C 2 , R D 2 , R A 2 , R B 2 ) ;
call _ _ t w o f i s h _ d e c _ b l k 8 ;
store_ c b c _ 8 w a y ( % r12 , % r11 , R A 1 , R B 1 , R C 1 , R D 1 , R A 2 , R B 2 , R C 2 , R D 2 ) ;
popq % r12 ;
ret;
2013-01-19 13:39:46 +02:00
ENDPROC( t w o f i s h _ c b c _ d e c _ 8 w a y )
2012-10-20 15:06:46 +03:00
2013-01-19 13:39:46 +02:00
ENTRY( t w o f i s h _ c t r _ 8 w a y )
2012-10-20 15:06:46 +03:00
/ * input :
* % rdi : ctx, C T X
* % rsi : dst
* % rdx : src
* % rcx : iv ( l i t t l e e n d i a n , 1 2 8 b i t )
* /
pushq % r12 ;
movq % r s i , % r11 ;
movq % r d x , % r12 ;
load_ c t r _ 8 w a y ( % r c x , . L b s w a p12 8 _ m a s k , R A 1 , R B 1 , R C 1 , R D 1 , R A 2 , R B 2 , R C 2 ,
RD2 , R X 0 , R X 1 , R Y 0 ) ;
call _ _ t w o f i s h _ e n c _ b l k 8 ;
store_ c t r _ 8 w a y ( % r12 , % r11 , R C 1 , R D 1 , R A 1 , R B 1 , R C 2 , R D 2 , R A 2 , R B 2 ) ;
popq % r12 ;
2012-05-28 15:54:24 +02:00
ret;
2013-01-19 13:39:46 +02:00
ENDPROC( t w o f i s h _ c t r _ 8 w a y )
2013-04-08 21:51:00 +03:00
ENTRY( t w o f i s h _ x t s _ e n c _ 8 w a y )
/ * input :
* % rdi : ctx, C T X
* % rsi : dst
* % rdx : src
* % rcx : iv ( t ⊕ α ⁿ ∈ G F ( 2 ¹ ² ⁸ ) )
* /
movq % r s i , % r11 ;
/* regs <= src, dst <= IVs, regs <= regs xor IVs */
load_ x t s _ 8 w a y ( % r c x , % r d x , % r s i , R A 1 , R B 1 , R C 1 , R D 1 , R A 2 , R B 2 , R C 2 , R D 2 ,
RX0 , R X 1 , R Y 0 , . L x t s _ g f12 8 m u l _ a n d _ s h l 1 _ m a s k ) ;
call _ _ t w o f i s h _ e n c _ b l k 8 ;
/* dst <= regs xor IVs(in dst) */
store_ x t s _ 8 w a y ( % r11 , R C 1 , R D 1 , R A 1 , R B 1 , R C 2 , R D 2 , R A 2 , R B 2 ) ;
ret;
ENDPROC( t w o f i s h _ x t s _ e n c _ 8 w a y )
ENTRY( t w o f i s h _ x t s _ d e c _ 8 w a y )
/ * input :
* % rdi : ctx, C T X
* % rsi : dst
* % rdx : src
* % rcx : iv ( t ⊕ α ⁿ ∈ G F ( 2 ¹ ² ⁸ ) )
* /
movq % r s i , % r11 ;
/* regs <= src, dst <= IVs, regs <= regs xor IVs */
load_ x t s _ 8 w a y ( % r c x , % r d x , % r s i , R C 1 , R D 1 , R A 1 , R B 1 , R C 2 , R D 2 , R A 2 , R B 2 ,
RX0 , R X 1 , R Y 0 , . L x t s _ g f12 8 m u l _ a n d _ s h l 1 _ m a s k ) ;
call _ _ t w o f i s h _ d e c _ b l k 8 ;
/* dst <= regs xor IVs(in dst) */
store_ x t s _ 8 w a y ( % r11 , R A 1 , R B 1 , R C 1 , R D 1 , R A 2 , R B 2 , R C 2 , R D 2 ) ;
ret;
ENDPROC( t w o f i s h _ x t s _ d e c _ 8 w a y )