@ -56,38 +56,32 @@
# define R T 0 % r b p
# define R T 1 % r s i
# define R T 2 % r8
# define R T 3 % r9
# define R T 0 d % e b p
# define R T 1 d % e s i
# define R T 2 d % r8 d
# define R T 3 d % r9 d
# define R K 0 % r8
# define R K 1 % r9
# define R K 2 % r10
# define R K 3 % r11
# define R K 0 d % r8 d
# define R K 1 d % r9 d
# define R K 2 d % r10 d
# define R K 3 d % r11 d
# define R K E Y % r12
# define R K E Y % r10
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* 1 - way b l o w f i s h
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
# define F ( x , k ) \
rorq $ 1 6 , x ; \
movzbl x ## b h , R T 0 d ; \
movzbl x ## b l , R T 1 d ; \
rolq $ 1 6 , x ; \
movl s0 ( C T X ,R T 0 ,4 ) , k ## d ; \
addl s1 ( C T X ,R T 1 ,4 ) , k ## d ; \
movzbl x ## b h , R T 0 d ; \
movzbl x ## b l , R T 1 d ; \
rolq $ 3 2 , x ; \
xorl s2 ( C T X ,R T 0 ,4 ) , k ## d ; \
addl s3 ( C T X ,R T 1 ,4 ) , k ## d ; \
xorq k , x ;
# define F ( ) \
rorq $ 1 6 , R X 0 ; \
movzbl R X 0 b h , R T 0 d ; \
movzbl R X 0 b l , R T 1 d ; \
rolq $ 1 6 , R X 0 ; \
movl s0 ( C T X ,R T 0 ,4 ) , R T 0 d ; \
addl s1 ( C T X ,R T 1 ,4 ) , R T 0 d ; \
movzbl R X 0 b h , R T 1 d ; \
movzbl R X 0 b l , R T 2 d ; \
rolq $ 3 2 , R X 0 ; \
xorl s2 ( C T X ,R T 1 ,4 ) , R T 0 d ; \
addl s3 ( C T X ,R T 2 ,4 ) , R T 0 d ; \
xorq R T 0 , R X 0 ;
# define a d d _ r o u n d k e y _ e n c ( n ) \
xorq p + 4 * ( n ) ( C T X ) , R X 0 ;
@ -95,11 +89,8 @@
# define r o u n d _ e n c ( n ) \
add_ r o u n d k e y _ e n c ( n ) ; \
\
F( R X 0 , R K 0 ) ; \
F( R X 0 , R K 0 ) ;
# define r o u n d _ f i n a l _ e n c ( n ) \
xorq p + 4 * ( n ) ( C T X ) , R X 0 ;
F( ) ; \
F( ) ;
# define a d d _ r o u n d k e y _ d e c ( n ) \
movq p + 4 * ( n - 1 ) ( C T X ) , R T 0 ; \
@ -109,8 +100,8 @@
# define r o u n d _ d e c ( n ) \
add_ r o u n d k e y _ d e c ( n ) ; \
\
F( R X 0 , R K 0 ) ; \
F( R X 0 , R K 0 ) ; \
F( ) ; \
F( ) ; \
# define r e a d _ b l o c k ( ) \
movq ( R I O ) , R X 0 ; \
@ -130,16 +121,15 @@
.type _ _ blowfish_ e n c _ b l k ,@function;
__blowfish_enc_blk :
/ / input :
/ / % rdi : ctx, C T X
/ / % rsi : dst
/ / % rdx : src
/ / % rcx : bool x o r
pushq % r b p ;
pushq % r b x ;
pushq % r s i ;
pushq % r c x ;
/ * 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
* /
movq % r b p , % r11 ;
movq % r s i , % r10 ;
movq % r d x , R I O ;
read_ b l o c k ( ) ;
@ -154,38 +144,31 @@ __blowfish_enc_blk:
round_ e n c ( 1 4 ) ;
add_ r o u n d k e y _ e n c ( 1 6 ) ;
popq % r b p ;
popq R I O ;
movq % r11 , % r b p ;
test % b p l , % b p l ;
movq % r10 , R I O ;
test % c l , % c l ;
jnz _ _ e n c _ x o r ;
write_ b l o c k ( ) ;
__enc_ret :
popq % r b x ;
popq % r b p ;
ret;
__enc_xor :
xor_ b l o c k ( ) ;
jmp _ _ e n c _ r e t ;
ret;
.align 8
.global blowfish_dec_blk
.type blowfish_ d e c _ b l k ,@function;
blowfish_dec_blk :
/ / input :
/ / % rdi : ctx, C T X
/ / % rsi : dst
/ / % rdx : src
pushq % r b p ;
pushq % r b x ;
push q % r s i ;
/ * input :
* % rdi : ctx, C T X
* % rsi : dst
* % rdx : src
* /
movq % r b p , % r11 ;
mov q % r s i , % r10 ;
movq % r d x , R I O ;
read_ b l o c k ( ) ;
@ -200,17 +183,33 @@ blowfish_dec_blk:
round_ d e c ( 3 ) ;
add_ r o u n d k e y _ d e c ( 1 ) ;
popq R I O ;
movq % r10 , R I O ;
write_ b l o c k ( ) ;
popq % r b x ;
popq % r b p ;
movq % r11 , % r b p ;
ret;
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
4 - way b l o w f i s h , f o u r b l o c k s p a r a l l e l
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
/ * F( ) f o r 4 - w a y . S l o w e r w h e n u s e d a l o n e / 1 - w a y , b u t f a s t e r w h e n u s e d
* parallel/ 4 - w a y ( t e s t e d o n A M D P h e n o m I I & I n t e l X e o n E 7 3 3 0 ) .
* /
# define F 4 ( x ) \
movzbl x ## b h , R T 1 d ; \
movzbl x ## b l , R T 3 d ; \
rorq $ 1 6 , x ; \
movzbl x ## b h , R T 0 d ; \
movzbl x ## b l , R T 2 d ; \
rorq $ 1 6 , x ; \
movl s0 ( C T X ,R T 0 ,4 ) , R T 0 d ; \
addl s1 ( C T X ,R T 2 ,4 ) , R T 0 d ; \
xorl s2 ( C T X ,R T 1 ,4 ) , R T 0 d ; \
addl s3 ( C T X ,R T 3 ,4 ) , R T 0 d ; \
xorq R T 0 , x ;
# define a d d _ p r e l o a d e d _ r o u n d k e y 4 ( ) \
xorq R K E Y , R X 0 ; \
xorq R K E Y , R X 1 ; \
@ -227,15 +226,15 @@ blowfish_dec_blk:
# define r o u n d _ e n c4 ( n ) \
add_ r o u n d k e y _ e n c4 ( n ) ; \
\
F( R X 0 , R K 0 ) ; \
F( R X 1 , R K 1 ) ; \
F( R X 2 , R K 2 ) ; \
F( R X 3 , R K 3 ) ; \
F4 ( R X 0 ) ; \
F4 ( R X 1 ) ; \
F4 ( R X 2 ) ; \
F4 ( R X 3 ) ; \
\
F( R X 0 , R K 0 ) ; \
F( R X 1 , R K 1 ) ; \
F( R X 2 , R K 2 ) ; \
F( R X 3 , R K 3 ) ;
F4 ( R X 0 ) ; \
F4 ( R X 1 ) ; \
F4 ( R X 2 ) ; \
F4 ( R X 3 ) ;
# define p r e l o a d _ r o u n d k e y _ d e c ( n ) \
movq p + 4 * ( ( n ) - 1 ) ( C T X ) , R K E Y ; \
@ -248,15 +247,15 @@ blowfish_dec_blk:
# define r o u n d _ d e c4 ( n ) \
add_ r o u n d k e y _ d e c4 ( n ) ; \
\
F( R X 0 , R K 0 ) ; \
F( R X 1 , R K 1 ) ; \
F( R X 2 , R K 2 ) ; \
F( R X 3 , R K 3 ) ; \
F4 ( R X 0 ) ; \
F4 ( R X 1 ) ; \
F4 ( R X 2 ) ; \
F4 ( R X 3 ) ; \
\
F( R X 0 , R K 0 ) ; \
F( R X 1 , R K 1 ) ; \
F( R X 2 , R K 2 ) ; \
F( R X 3 , R K 3 ) ;
F4 ( R X 0 ) ; \
F4 ( R X 1 ) ; \
F4 ( R X 2 ) ; \
F4 ( R X 3 ) ;
# define r e a d _ b l o c k 4 ( ) \
movq ( R I O ) , R X 0 ; \
@ -306,18 +305,19 @@ blowfish_dec_blk:
.type _ _ blowfish_ e n c _ b l k _ 4 w a y ,@function;
__blowfish_enc_blk_4way :
/ / input :
/ / % rdi : ctx, C T X
/ / % rsi : dst
/ / % rdx : src
/ / % rcx : bool x o r
/ * 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
* /
pushq % r b p ;
pushq % r b x ;
pushq R K E Y ;
pushq % r c x ;
preload_ r o u n d k e y _ e n c ( 0 ) ;
pushq % r s i ;
pushq % r c x ;
movq % r s i , % r11 ;
movq % r d x , R I O ;
read_ b l o c k 4 ( ) ;
@ -333,40 +333,39 @@ __blowfish_enc_blk_4way:
add_ p r e l o a d e d _ r o u n d k e y 4 ( ) ;
popq % r b p ;
popq R I O ;
movq % r11 , R I O ;
test % b p l , % b p l ;
jnz _ _ e n c _ x o r4 ;
write_ b l o c k 4 ( ) ;
__enc_ret4 :
popq R K E Y ;
popq % r b x ;
popq % r b p ;
ret;
__enc_xor4 :
xor_ b l o c k 4 ( ) ;
jmp _ _ e n c _ r e t 4 ;
popq % r b x ;
popq % r b p ;
ret;
.align 8
.global blowfish_dec_blk_4way
.type blowfish_ d e c _ b l k _ 4 w a y ,@function;
blowfish_dec_blk_4way :
/ / input :
/ / % rdi : ctx, C T X
/ / % rsi : dst
/ / % rdx : src
/ * input :
* % rdi : ctx, C T X
* % rsi : dst
* % rdx : src
* /
pushq % r b p ;
pushq % r b x ;
pushq R K E Y ;
preload_ r o u n d k e y _ d e c ( 1 7 ) ;
push q % r s i ;
mov q % r s i , % r11 ;
movq % r d x , R I O ;
read_ b l o c k 4 ( ) ;
@ -381,10 +380,9 @@ blowfish_dec_blk_4way:
round_ d e c4 ( 3 ) ;
add_ p r e l o a d e d _ r o u n d k e y 4 ( ) ;
popq R I O ;
movq % r11 , R I O ;
write_ b l o c k 4 ( ) ;
popq R K E Y ;
popq % r b x ;
popq % r b p ;