2012-03-05 22:26:47 +04:00
/ *
* Camellia C i p h e r A l g o r i t h m ( x86 _ 6 4 )
*
* Copyright ( C ) 2 0 1 2 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>
*
* 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:05 +04:00
# include < l i n u x / l i n k a g e . h >
2012-03-05 22:26:47 +04:00
.file " camellia- x86 _ 6 4 - a s m _ 6 4 . S "
.text
.extern camellia_ s p10 0 1 1 1 1 0 ;
.extern camellia_ s p22 0 0 0 2 2 2 ;
.extern camellia_ s p03 3 0 3 0 3 3 ;
.extern camellia_ s p00 4 4 4 4 0 4 ;
.extern camellia_ s p02 2 2 0 2 2 2 ;
.extern camellia_ s p30 3 3 3 0 3 3 ;
.extern camellia_ s p44 0 4 4 4 0 4 ;
.extern camellia_ s p11 1 0 1 1 1 0 ;
# define s p10 0 1 1 1 1 0 c a m e l l i a _ s p10 0 1 1 1 1 0
# define s p22 0 0 0 2 2 2 c a m e l l i a _ s p22 0 0 0 2 2 2
# define s p03 3 0 3 0 3 3 c a m e l l i a _ s p03 3 0 3 0 3 3
# define s p00 4 4 4 4 0 4 c a m e l l i a _ s p00 4 4 4 4 0 4
# define s p02 2 2 0 2 2 2 c a m e l l i a _ s p02 2 2 0 2 2 2
# define s p30 3 3 3 0 3 3 c a m e l l i a _ s p30 3 3 3 0 3 3
# define s p44 0 4 4 4 0 4 c a m e l l i a _ s p44 0 4 4 4 0 4
# define s p11 1 0 1 1 1 0 c a m e l l i a _ s p11 1 0 1 1 1 0
# define C A M E L L I A _ T A B L E _ B Y T E _ L E N 2 7 2
/* struct camellia_ctx: */
# define k e y _ t a b l e 0
# define k e y _ l e n g t h C A M E L L I A _ T A B L E _ B Y T E _ L E N
/* register macros */
# define C T X % r d i
# define R I O % r s i
# define R I O d % e s i
# define R A B 0 % r a x
# define R C D 0 % r c x
# define R A B 1 % r b x
# define R C D 1 % r d x
# define R A B 0 d % e a x
# define R C D 0 d % e c x
# define R A B 1 d % e b x
# define R C D 1 d % e d x
# define R A B 0 b l % a l
# define R C D 0 b l % c l
# define R A B 1 b l % b l
# define R C D 1 b l % d l
# define R A B 0 b h % a h
# define R C D 0 b h % c h
# define R A B 1 b h % b h
# define R C D 1 b h % d h
# define R T 0 % r s i
# define R T 1 % r b p
# define R T 2 % r8
# define R T 0 d % e s i
# define R T 1 d % e b p
# define R T 2 d % r8 d
# define R T 2 b l % r8 b
# define R X O R % r9
# define R R B P % r10
# define R D S T % r11
# define R X O R d % r9 d
# define R X O R b l % r9 b
# define x o r2 r o r16 ( T 0 , T 1 , t m p1 , t m p2 , a b , d s t ) \
movzbl a b ## b l , t m p 2 ## d ; \
movzbl a b ## b h , t m p 1 ## d ; \
rorq $ 1 6 , a b ; \
xorq T 0 ( , t m p2 , 8 ) , d s t ; \
xorq T 1 ( , t m p1 , 8 ) , d s t ;
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
1 - way c a m e l l i a
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
# define r o u n d s m ( a b , s u b k e y , c d ) \
movq ( k e y _ t a b l e + ( ( s u b k e y ) * 2 ) * 4 ) ( C T X ) , R T 2 ; \
\
xor2 r o r16 ( s p00 4 4 4 4 0 4 , s p03 3 0 3 0 3 3 , R T 0 , R T 1 , a b ## 0 , c d ## 0 ) ; \
xor2 r o r16 ( s p22 0 0 0 2 2 2 , s p10 0 1 1 1 1 0 , R T 0 , R T 1 , a b ## 0 , R T 2 ) ; \
xor2 r o r16 ( s p11 1 0 1 1 1 0 , s p44 0 4 4 4 0 4 , R T 0 , R T 1 , a b ## 0 , c d ## 0 ) ; \
xor2 r o r16 ( s p30 3 3 3 0 3 3 , s p02 2 2 0 2 2 2 , R T 0 , R T 1 , a b ## 0 , R T 2 ) ; \
\
xorq R T 2 , c d ## 0 ;
# define f l s ( l , r , k l , k r ) \
movl ( k e y _ t a b l e + ( ( k l ) * 2 ) * 4 ) ( C T X ) , R T 0 d ; \
andl l ## 0 d , R T 0 d ; \
roll $ 1 , R T 0 d ; \
shlq $ 3 2 , R T 0 ; \
xorq R T 0 , l ## 0 ; \
movq ( k e y _ t a b l e + ( ( k r ) * 2 ) * 4 ) ( C T X ) , R T 1 ; \
orq r ## 0 , R T 1 ; \
shrq $ 3 2 , R T 1 ; \
xorq R T 1 , r ## 0 ; \
\
movq ( k e y _ t a b l e + ( ( k l ) * 2 ) * 4 ) ( C T X ) , R T 2 ; \
orq l ## 0 , R T 2 ; \
shrq $ 3 2 , R T 2 ; \
xorq R T 2 , l ## 0 ; \
movl ( k e y _ t a b l e + ( ( k r ) * 2 ) * 4 ) ( C T X ) , R T 0 d ; \
andl r ## 0 d , R T 0 d ; \
roll $ 1 , R T 0 d ; \
shlq $ 3 2 , R T 0 ; \
xorq R T 0 , r ## 0 ;
# define e n c _ r o u n d s ( i ) \
roundsm( R A B , i + 2 , R C D ) ; \
roundsm( R C D , i + 3 , R A B ) ; \
roundsm( R A B , i + 4 , R C D ) ; \
roundsm( R C D , i + 5 , R A B ) ; \
roundsm( R A B , i + 6 , R C D ) ; \
roundsm( R C D , i + 7 , R A B ) ;
# define e n c _ f l s ( i ) \
fls( R A B , R C D , i + 0 , i + 1 ) ;
# define e n c _ i n p a c k ( ) \
movq ( R I O ) , R A B 0 ; \
bswapq R A B 0 ; \
rolq $ 3 2 , R A B 0 ; \
movq 4 * 2 ( R I O ) , R C D 0 ; \
bswapq R C D 0 ; \
rorq $ 3 2 , R C D 0 ; \
xorq k e y _ t a b l e ( C T X ) , R A B 0 ;
# define e n c _ o u t u n p a c k ( o p , m a x ) \
xorq k e y _ t a b l e ( C T X , m a x , 8 ) , R C D 0 ; \
rorq $ 3 2 , R C D 0 ; \
bswapq R C D 0 ; \
op ## q R C D 0 , ( R I O ) ; \
rolq $ 3 2 , R A B 0 ; \
bswapq R A B 0 ; \
op ## q R A B 0 , 4 * 2 ( R I O ) ;
# define d e c _ r o u n d s ( i ) \
roundsm( R A B , i + 7 , R C D ) ; \
roundsm( R C D , i + 6 , R A B ) ; \
roundsm( R A B , i + 5 , R C D ) ; \
roundsm( R C D , i + 4 , R A B ) ; \
roundsm( R A B , i + 3 , R C D ) ; \
roundsm( R C D , i + 2 , R A B ) ;
# define d e c _ f l s ( i ) \
fls( R A B , R C D , i + 1 , i + 0 ) ;
# define d e c _ i n p a c k ( m a x ) \
movq ( R I O ) , R A B 0 ; \
bswapq R A B 0 ; \
rolq $ 3 2 , R A B 0 ; \
movq 4 * 2 ( R I O ) , R C D 0 ; \
bswapq R C D 0 ; \
rorq $ 3 2 , R C D 0 ; \
xorq k e y _ t a b l e ( C T X , m a x , 8 ) , R A B 0 ;
# define d e c _ o u t u n p a c k ( ) \
xorq k e y _ t a b l e ( C T X ) , R C D 0 ; \
rorq $ 3 2 , R C D 0 ; \
bswapq R C D 0 ; \
movq R C D 0 , ( R I O ) ; \
rolq $ 3 2 , R A B 0 ; \
bswapq R A B 0 ; \
movq R A B 0 , 4 * 2 ( R I O ) ;
2013-01-19 15:39:05 +04:00
ENTRY( _ _ c a m e l l i a _ e n c _ b l k )
2012-03-05 22:26:47 +04:00
/ * input :
* % rdi : ctx, C T X
* % rsi : dst
* % rdx : src
* % rcx : bool x o r
* /
movq % r b p , R R B P ;
movq % r c x , R X O R ;
movq % r s i , R D S T ;
movq % r d x , R I O ;
enc_ i n p a c k ( ) ;
enc_ r o u n d s ( 0 ) ;
enc_ f l s ( 8 ) ;
enc_ r o u n d s ( 8 ) ;
enc_ f l s ( 1 6 ) ;
enc_ r o u n d s ( 1 6 ) ;
movl $ 2 4 , R T 1 d ; /* max */
cmpb $ 1 6 , k e y _ l e n g t h ( C T X ) ;
2013-01-19 15:39:05 +04:00
je . L _ _ e n c _ d o n e ;
2012-03-05 22:26:47 +04:00
enc_ f l s ( 2 4 ) ;
enc_ r o u n d s ( 2 4 ) ;
movl $ 3 2 , R T 1 d ; /* max */
2013-01-19 15:39:05 +04:00
.L__enc_done :
2012-03-05 22:26:47 +04:00
testb R X O R b l , R X O R b l ;
movq R D S T , R I O ;
2013-01-19 15:39:05 +04:00
jnz . L _ _ e n c _ x o r ;
2012-03-05 22:26:47 +04:00
enc_ o u t u n p a c k ( m o v , R T 1 ) ;
movq R R B P , % r b p ;
ret;
2013-01-19 15:39:05 +04:00
.L__enc_xor :
2012-03-05 22:26:47 +04:00
enc_ o u t u n p a c k ( x o r , R T 1 ) ;
movq R R B P , % r b p ;
ret;
2013-01-19 15:39:05 +04:00
ENDPROC( _ _ c a m e l l i a _ e n c _ b l k )
2012-03-05 22:26:47 +04:00
2013-01-19 15:39:05 +04:00
ENTRY( c a m e l l i a _ d e c _ b l k )
2012-03-05 22:26:47 +04:00
/ * input :
* % rdi : ctx, C T X
* % rsi : dst
* % rdx : src
* /
cmpl $ 1 6 , k e y _ l e n g t h ( C T X ) ;
movl $ 3 2 , R T 2 d ;
movl $ 2 4 , R X O R d ;
cmovel R X O R d , R T 2 d ; /* max */
movq % r b p , R R B P ;
movq % r s i , R D S T ;
movq % r d x , R I O ;
dec_ i n p a c k ( R T 2 ) ;
cmpb $ 2 4 , R T 2 b l ;
2013-01-19 15:39:05 +04:00
je . L _ _ d e c _ r o u n d s16 ;
2012-03-05 22:26:47 +04:00
dec_ r o u n d s ( 2 4 ) ;
dec_ f l s ( 2 4 ) ;
2013-01-19 15:39:05 +04:00
.L__dec_rounds16 :
2012-03-05 22:26:47 +04:00
dec_ r o u n d s ( 1 6 ) ;
dec_ f l s ( 1 6 ) ;
dec_ r o u n d s ( 8 ) ;
dec_ f l s ( 8 ) ;
dec_ r o u n d s ( 0 ) ;
movq R D S T , R I O ;
dec_ o u t u n p a c k ( ) ;
movq R R B P , % r b p ;
ret;
2013-01-19 15:39:05 +04:00
ENDPROC( c a m e l l i a _ d e c _ b l k )
2012-03-05 22:26:47 +04:00
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
2 - way c a m e l l i a
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
# define r o u n d s m 2 ( a b , s u b k e y , c d ) \
movq ( k e y _ t a b l e + ( ( s u b k e y ) * 2 ) * 4 ) ( C T X ) , R T 2 ; \
xorq R T 2 , c d ## 1 ; \
\
xor2 r o r16 ( s p00 4 4 4 4 0 4 , s p03 3 0 3 0 3 3 , R T 0 , R T 1 , a b ## 0 , c d ## 0 ) ; \
xor2 r o r16 ( s p22 0 0 0 2 2 2 , s p10 0 1 1 1 1 0 , R T 0 , R T 1 , a b ## 0 , R T 2 ) ; \
xor2 r o r16 ( s p11 1 0 1 1 1 0 , s p44 0 4 4 4 0 4 , R T 0 , R T 1 , a b ## 0 , c d ## 0 ) ; \
xor2 r o r16 ( s p30 3 3 3 0 3 3 , s p02 2 2 0 2 2 2 , R T 0 , R T 1 , a b ## 0 , R T 2 ) ; \
\
xor2 r o r16 ( s p00 4 4 4 4 0 4 , s p03 3 0 3 0 3 3 , R T 0 , R T 1 , a b ## 1 , c d ## 1 ) ; \
xorq R T 2 , c d ## 0 ; \
xor2 r o r16 ( s p22 0 0 0 2 2 2 , s p10 0 1 1 1 1 0 , R T 0 , R T 1 , a b ## 1 , c d ## 1 ) ; \
xor2 r o r16 ( s p11 1 0 1 1 1 0 , s p44 0 4 4 4 0 4 , R T 0 , R T 1 , a b ## 1 , c d ## 1 ) ; \
xor2 r o r16 ( s p30 3 3 3 0 3 3 , s p02 2 2 0 2 2 2 , R T 0 , R T 1 , a b ## 1 , c d ## 1 ) ;
# define f l s2 ( l , r , k l , k r ) \
movl ( k e y _ t a b l e + ( ( k l ) * 2 ) * 4 ) ( C T X ) , R T 0 d ; \
andl l ## 0 d , R T 0 d ; \
roll $ 1 , R T 0 d ; \
shlq $ 3 2 , R T 0 ; \
xorq R T 0 , l ## 0 ; \
movq ( k e y _ t a b l e + ( ( k r ) * 2 ) * 4 ) ( C T X ) , R T 1 ; \
orq r ## 0 , R T 1 ; \
shrq $ 3 2 , R T 1 ; \
xorq R T 1 , r ## 0 ; \
\
movl ( k e y _ t a b l e + ( ( k l ) * 2 ) * 4 ) ( C T X ) , R T 2 d ; \
andl l ## 1 d , R T 2 d ; \
roll $ 1 , R T 2 d ; \
shlq $ 3 2 , R T 2 ; \
xorq R T 2 , l ## 1 ; \
movq ( k e y _ t a b l e + ( ( k r ) * 2 ) * 4 ) ( C T X ) , R T 0 ; \
orq r ## 1 , R T 0 ; \
shrq $ 3 2 , R T 0 ; \
xorq R T 0 , r ## 1 ; \
\
movq ( k e y _ t a b l e + ( ( k l ) * 2 ) * 4 ) ( C T X ) , R T 1 ; \
orq l ## 0 , R T 1 ; \
shrq $ 3 2 , R T 1 ; \
xorq R T 1 , l ## 0 ; \
movl ( k e y _ t a b l e + ( ( k r ) * 2 ) * 4 ) ( C T X ) , R T 2 d ; \
andl r ## 0 d , R T 2 d ; \
roll $ 1 , R T 2 d ; \
shlq $ 3 2 , R T 2 ; \
xorq R T 2 , r ## 0 ; \
\
movq ( k e y _ t a b l e + ( ( k l ) * 2 ) * 4 ) ( C T X ) , R T 0 ; \
orq l ## 1 , R T 0 ; \
shrq $ 3 2 , R T 0 ; \
xorq R T 0 , l ## 1 ; \
movl ( k e y _ t a b l e + ( ( k r ) * 2 ) * 4 ) ( C T X ) , R T 1 d ; \
andl r ## 1 d , R T 1 d ; \
roll $ 1 , R T 1 d ; \
shlq $ 3 2 , R T 1 ; \
xorq R T 1 , r ## 1 ;
# define e n c _ r o u n d s2 ( i ) \
roundsm2 ( R A B , i + 2 , R C D ) ; \
roundsm2 ( R C D , i + 3 , R A B ) ; \
roundsm2 ( R A B , i + 4 , R C D ) ; \
roundsm2 ( R C D , i + 5 , R A B ) ; \
roundsm2 ( R A B , i + 6 , R C D ) ; \
roundsm2 ( R C D , i + 7 , R A B ) ;
# define e n c _ f l s2 ( i ) \
fls2 ( R A B , R C D , i + 0 , i + 1 ) ;
# define e n c _ i n p a c k 2 ( ) \
movq ( R I O ) , R A B 0 ; \
bswapq R A B 0 ; \
rorq $ 3 2 , R A B 0 ; \
movq 4 * 2 ( R I O ) , R C D 0 ; \
bswapq R C D 0 ; \
rolq $ 3 2 , R C D 0 ; \
xorq k e y _ t a b l e ( C T X ) , R A B 0 ; \
\
movq 8 * 2 ( R I O ) , R A B 1 ; \
bswapq R A B 1 ; \
rorq $ 3 2 , R A B 1 ; \
movq 1 2 * 2 ( R I O ) , R C D 1 ; \
bswapq R C D 1 ; \
rolq $ 3 2 , R C D 1 ; \
xorq k e y _ t a b l e ( C T X ) , R A B 1 ;
# define e n c _ o u t u n p a c k 2 ( o p , m a x ) \
xorq k e y _ t a b l e ( C T X , m a x , 8 ) , R C D 0 ; \
rolq $ 3 2 , R C D 0 ; \
bswapq R C D 0 ; \
op ## q R C D 0 , ( R I O ) ; \
rorq $ 3 2 , R A B 0 ; \
bswapq R A B 0 ; \
op ## q R A B 0 , 4 * 2 ( R I O ) ; \
\
xorq k e y _ t a b l e ( C T X , m a x , 8 ) , R C D 1 ; \
rolq $ 3 2 , R C D 1 ; \
bswapq R C D 1 ; \
op ## q R C D 1 , 8 * 2 ( R I O ) ; \
rorq $ 3 2 , R A B 1 ; \
bswapq R A B 1 ; \
op ## q R A B 1 , 1 2 * 2 ( R I O ) ;
# define d e c _ r o u n d s2 ( i ) \
roundsm2 ( R A B , i + 7 , R C D ) ; \
roundsm2 ( R C D , i + 6 , R A B ) ; \
roundsm2 ( R A B , i + 5 , R C D ) ; \
roundsm2 ( R C D , i + 4 , R A B ) ; \
roundsm2 ( R A B , i + 3 , R C D ) ; \
roundsm2 ( R C D , i + 2 , R A B ) ;
# define d e c _ f l s2 ( i ) \
fls2 ( R A B , R C D , i + 1 , i + 0 ) ;
# define d e c _ i n p a c k 2 ( m a x ) \
movq ( R I O ) , R A B 0 ; \
bswapq R A B 0 ; \
rorq $ 3 2 , R A B 0 ; \
movq 4 * 2 ( R I O ) , R C D 0 ; \
bswapq R C D 0 ; \
rolq $ 3 2 , R C D 0 ; \
xorq k e y _ t a b l e ( C T X , m a x , 8 ) , R A B 0 ; \
\
movq 8 * 2 ( R I O ) , R A B 1 ; \
bswapq R A B 1 ; \
rorq $ 3 2 , R A B 1 ; \
movq 1 2 * 2 ( R I O ) , R C D 1 ; \
bswapq R C D 1 ; \
rolq $ 3 2 , R C D 1 ; \
xorq k e y _ t a b l e ( C T X , m a x , 8 ) , R A B 1 ;
# define d e c _ o u t u n p a c k 2 ( ) \
xorq k e y _ t a b l e ( C T X ) , R C D 0 ; \
rolq $ 3 2 , R C D 0 ; \
bswapq R C D 0 ; \
movq R C D 0 , ( R I O ) ; \
rorq $ 3 2 , R A B 0 ; \
bswapq R A B 0 ; \
movq R A B 0 , 4 * 2 ( R I O ) ; \
\
xorq k e y _ t a b l e ( C T X ) , R C D 1 ; \
rolq $ 3 2 , R C D 1 ; \
bswapq R C D 1 ; \
movq R C D 1 , 8 * 2 ( R I O ) ; \
rorq $ 3 2 , R A B 1 ; \
bswapq R A B 1 ; \
movq R A B 1 , 1 2 * 2 ( R I O ) ;
2013-01-19 15:39:05 +04:00
ENTRY( _ _ c a m e l l i a _ e n c _ b l k _ 2 w a y )
2012-03-05 22:26:47 +04:00
/ * input :
* % rdi : ctx, C T X
* % rsi : dst
* % rdx : src
* % rcx : bool x o r
* /
pushq % r b x ;
movq % r b p , R R B P ;
movq % r c x , R X O R ;
movq % r s i , R D S T ;
movq % r d x , R I O ;
enc_ i n p a c k 2 ( ) ;
enc_ r o u n d s2 ( 0 ) ;
enc_ f l s2 ( 8 ) ;
enc_ r o u n d s2 ( 8 ) ;
enc_ f l s2 ( 1 6 ) ;
enc_ r o u n d s2 ( 1 6 ) ;
movl $ 2 4 , R T 2 d ; /* max */
cmpb $ 1 6 , k e y _ l e n g t h ( C T X ) ;
2013-01-19 15:39:05 +04:00
je . L _ _ e n c2 _ d o n e ;
2012-03-05 22:26:47 +04:00
enc_ f l s2 ( 2 4 ) ;
enc_ r o u n d s2 ( 2 4 ) ;
movl $ 3 2 , R T 2 d ; /* max */
2013-01-19 15:39:05 +04:00
.L__enc2_done :
2012-03-05 22:26:47 +04:00
test R X O R b l , R X O R b l ;
movq R D S T , R I O ;
2013-01-19 15:39:05 +04:00
jnz . L _ _ e n c2 _ x o r ;
2012-03-05 22:26:47 +04:00
enc_ o u t u n p a c k 2 ( m o v , R T 2 ) ;
movq R R B P , % r b p ;
popq % r b x ;
ret;
2013-01-19 15:39:05 +04:00
.L__enc2_xor :
2012-03-05 22:26:47 +04:00
enc_ o u t u n p a c k 2 ( x o r , R T 2 ) ;
movq R R B P , % r b p ;
popq % r b x ;
ret;
2013-01-19 15:39:05 +04:00
ENDPROC( _ _ c a m e l l i a _ e n c _ b l k _ 2 w a y )
2012-03-05 22:26:47 +04:00
2013-01-19 15:39:05 +04:00
ENTRY( c a m e l l i a _ d e c _ b l k _ 2 w a y )
2012-03-05 22:26:47 +04:00
/ * input :
* % rdi : ctx, C T X
* % rsi : dst
* % rdx : src
* /
cmpl $ 1 6 , k e y _ l e n g t h ( C T X ) ;
movl $ 3 2 , R T 2 d ;
movl $ 2 4 , R X O R d ;
cmovel R X O R d , R T 2 d ; /* max */
movq % r b x , R X O R ;
movq % r b p , R R B P ;
movq % r s i , R D S T ;
movq % r d x , R I O ;
dec_ i n p a c k 2 ( R T 2 ) ;
cmpb $ 2 4 , R T 2 b l ;
2013-01-19 15:39:05 +04:00
je . L _ _ d e c2 _ r o u n d s16 ;
2012-03-05 22:26:47 +04:00
dec_ r o u n d s2 ( 2 4 ) ;
dec_ f l s2 ( 2 4 ) ;
2013-01-19 15:39:05 +04:00
.L__dec2_rounds16 :
2012-03-05 22:26:47 +04:00
dec_ r o u n d s2 ( 1 6 ) ;
dec_ f l s2 ( 1 6 ) ;
dec_ r o u n d s2 ( 8 ) ;
dec_ f l s2 ( 8 ) ;
dec_ r o u n d s2 ( 0 ) ;
movq R D S T , R I O ;
dec_ o u t u n p a c k 2 ( ) ;
movq R R B P , % r b p ;
movq R X O R , % r b x ;
ret;
2013-01-19 15:39:05 +04:00
ENDPROC( c a m e l l i a _ d e c _ b l k _ 2 w a y )