2018-09-30 18:02:42 -07:00
/ / Copyright 2 0 1 8 T h e G o A u t h o r s . A l l r i g h t s r e s e r v e d .
/ / Use o f t h i s s o u r c e c o d e i s g o v e r n e d b y a B S D - s t y l e
/ / license t h a t c a n b e f o u n d i n t h e L I C E N S E f i l e .
/ / + build s39 0 x ,g o 1 . 1 1 ,! g c c g o ,! a p p e n g i n e
# include " t e x t f l a g . h "
/ / Implementation o f P o l y 1 3 0 5 u s i n g t h e v e c t o r f a c i l i t y ( v x ) .
/ / constants
# define M O D 2 6 V 0
# define E X 0 V 1
# define E X 1 V 2
# define E X 2 V 3
/ / temporaries
# define T _ 0 V 4
# define T _ 1 V 5
# define T _ 2 V 6
# define T _ 3 V 7
# define T _ 4 V 8
/ / key ( r )
# define R _ 0 V 9
# define R _ 1 V 1 0
# define R _ 2 V 1 1
# define R _ 3 V 1 2
# define R _ 4 V 1 3
# define R 5 _ 1 V 1 4
# define R 5 _ 2 V 1 5
# define R 5 _ 3 V 1 6
# define R 5 _ 4 V 1 7
# define R S A V E _ 0 R 5
# define R S A V E _ 1 R 6
# define R S A V E _ 2 R 7
# define R S A V E _ 3 R 8
# define R S A V E _ 4 R 9
# define R 5 S A V E _ 1 V 2 8
# define R 5 S A V E _ 2 V 2 9
# define R 5 S A V E _ 3 V 3 0
# define R 5 S A V E _ 4 V 3 1
/ / message b l o c k
# define F _ 0 V 1 8
# define F _ 1 V 1 9
# define F _ 2 V 2 0
# define F _ 3 V 2 1
# define F _ 4 V 2 2
/ / accumulator
# define H _ 0 V 2 3
# define H _ 1 V 2 4
# define H _ 2 V 2 5
# define H _ 3 V 2 6
# define H _ 4 V 2 7
GLOBL · k e y M a s k < > ( S B ) , R O D A T A , $ 1 6
DATA · k e y M a s k < > + 0 ( S B ) / 8 , $ 0 x f f f f f f0 f f c f f f f0 f
DATA · k e y M a s k < > + 8 ( S B ) / 8 , $ 0 x f c f f f f0 f f c f f f f0 f
GLOBL · b s w a p M a s k < > ( S B ) , R O D A T A , $ 1 6
DATA · b s w a p M a s k < > + 0 ( S B ) / 8 , $ 0 x0 f0 e 0 d0 c0 b0 a09 0 8
DATA · b s w a p M a s k < > + 8 ( S B ) / 8 , $ 0 x07 0 6 0 5 0 4 0 3 0 2 0 1 0 0
GLOBL · c o n s t a n t s < > ( S B ) , R O D A T A , $ 6 4
/ / MOD2 6
DATA · c o n s t a n t s < > + 0 ( S B ) / 8 , $ 0 x3 f f f f f f
DATA · c o n s t a n t s < > + 8 ( S B ) / 8 , $ 0 x3 f f f f f f
/ / EX0
DATA · c o n s t a n t s < > + 1 6 ( S B ) / 8 , $ 0 x00 0 6 0 5 0 4 0 3 0 2 0 1 0 0
DATA · c o n s t a n t s < > + 2 4 ( S B ) / 8 , $ 0 x10 1 6 1 5 1 4 1 3 1 2 1 1 1 0
/ / EX1
DATA · c o n s t a n t s < > + 3 2 ( S B ) / 8 , $ 0 x06 0 c0 b0 a09 0 8 0 7 0 6
DATA · c o n s t a n t s < > + 4 0 ( S B ) / 8 , $ 0 x16 1 c1 b1 a19 1 8 1 7 1 6
/ / EX2
DATA · c o n s t a n t s < > + 4 8 ( S B ) / 8 , $ 0 x0 d0 d0 d0 d0 d0 f0 e 0 d
DATA · c o n s t a n t s < > + 5 6 ( S B ) / 8 , $ 0 x1 d1 d1 d1 d1 d1 f1 e 1 d
/ / h = ( f * g ) % ( 2 * * 1 3 0 - 5 ) [ p a r t i a l r e d u c t i o n ]
# define M U L T I P L Y ( f0 , f1 , f2 , f3 , f4 , g 0 , g 1 , g 2 , g 3 , g 4 , g 5 1 , g 5 2 , g 5 3 , g 5 4 , h0 , h1 , h2 , h3 , h4 ) \
VMLOF f0 , g 0 , h0 \
VMLOF f0 , g 1 , h1 \
VMLOF f0 , g 2 , h2 \
VMLOF f0 , g 3 , h3 \
VMLOF f0 , g 4 , h4 \
VMLOF f1 , g 5 4 , T _ 0 \
VMLOF f1 , g 0 , T _ 1 \
VMLOF f1 , g 1 , T _ 2 \
VMLOF f1 , g 2 , T _ 3 \
VMLOF f1 , g 3 , T _ 4 \
VMALOF f2 , g 5 3 , h0 , h0 \
VMALOF f2 , g 5 4 , h1 , h1 \
VMALOF f2 , g 0 , h2 , h2 \
VMALOF f2 , g 1 , h3 , h3 \
VMALOF f2 , g 2 , h4 , h4 \
VMALOF f3 , g 5 2 , T _ 0 , T _ 0 \
VMALOF f3 , g 5 3 , T _ 1 , T _ 1 \
VMALOF f3 , g 5 4 , T _ 2 , T _ 2 \
VMALOF f3 , g 0 , T _ 3 , T _ 3 \
VMALOF f3 , g 1 , T _ 4 , T _ 4 \
VMALOF f4 , g 5 1 , h0 , h0 \
VMALOF f4 , g 5 2 , h1 , h1 \
VMALOF f4 , g 5 3 , h2 , h2 \
VMALOF f4 , g 5 4 , h3 , h3 \
VMALOF f4 , g 0 , h4 , h4 \
VAG T _ 0 , h0 , h0 \
VAG T _ 1 , h1 , h1 \
VAG T _ 2 , h2 , h2 \
VAG T _ 3 , h3 , h3 \
VAG T _ 4 , h4 , h4
/ / carry h0 - > h1 h3 - > h4 , h1 - > h2 h4 - > h0 , h0 - > h1 h2 - > h3 , h3 - > h4
# define R E D U C E ( h0 , h1 , h2 , h3 , h4 ) \
VESRLG $ 2 6 , h0 , T _ 0 \
VESRLG $ 2 6 , h3 , T _ 1 \
VN M O D 2 6 , h0 , h0 \
VN M O D 2 6 , h3 , h3 \
VAG T _ 0 , h1 , h1 \
VAG T _ 1 , h4 , h4 \
VESRLG $ 2 6 , h1 , T _ 2 \
VESRLG $ 2 6 , h4 , T _ 3 \
VN M O D 2 6 , h1 , h1 \
VN M O D 2 6 , h4 , h4 \
VESLG $ 2 , T _ 3 , T _ 4 \
VAG T _ 3 , T _ 4 , T _ 4 \
VAG T _ 2 , h2 , h2 \
VAG T _ 4 , h0 , h0 \
VESRLG $ 2 6 , h2 , T _ 0 \
VESRLG $ 2 6 , h0 , T _ 1 \
VN M O D 2 6 , h2 , h2 \
VN M O D 2 6 , h0 , h0 \
VAG T _ 0 , h3 , h3 \
VAG T _ 1 , h1 , h1 \
VESRLG $ 2 6 , h3 , T _ 2 \
VN M O D 2 6 , h3 , h3 \
VAG T _ 2 , h4 , h4
/ / expand i n 0 i n t o d [ 0 ] a n d i n 1 i n t o d [ 1 ]
# define E X P A N D ( i n 0 , i n 1 , d0 , d1 , d2 , d3 , d4 ) \
VGBM $ 0 x07 0 7 , d1 \ / / d1 =tmp
VPERM i n 0 , i n 1 , E X 2 , d4 \
VPERM i n 0 , i n 1 , E X 0 , d0 \
VPERM i n 0 , i n 1 , E X 1 , d2 \
VN d1 , d4 , d4 \
VESRLG $ 2 6 , d0 , d1 \
VESRLG $ 3 0 , d2 , d3 \
VESRLG $ 4 , d2 , d2 \
VN M O D 2 6 , d0 , d0 \
VN M O D 2 6 , d1 , d1 \
VN M O D 2 6 , d2 , d2 \
VN M O D 2 6 , d3 , d3
/ / pack h4 : h0 i n t o h1 : h0 ( n o c a r r y )
# define P A C K ( h0 , h1 , h2 , h3 , h4 ) \
VESLG $ 2 6 , h1 , h1 \
VESLG $ 2 6 , h3 , h3 \
VO h0 , h1 , h0 \
VO h2 , h3 , h2 \
VESLG $ 4 , h2 , h2 \
VLEIB $ 7 , $ 4 8 , h1 \
VSLB h1 , h2 , h2 \
VO h0 , h2 , h0 \
VLEIB $ 7 , $ 1 0 4 , h1 \
VSLB h1 , h4 , h3 \
VO h3 , h0 , h0 \
VLEIB $ 7 , $ 2 4 , h1 \
VSRLB h1 , h4 , h1
/ / if h > 2 * * 1 3 0 - 5 t h e n h - = 2 * * 1 3 0 - 5
# define M O D ( h0 , h1 , t 0 , t 1 , t 2 ) \
VZERO t 0 \
VLEIG $ 1 , $ 5 , t 0 \
VACCQ h0 , t 0 , t 1 \
VAQ h0 , t 0 , t 0 \
VONE t 2 \
VLEIG $ 1 , $ - 4 , t 2 \
VAQ t 2 , t 1 , t 1 \
VACCQ h1 , t 1 , t 1 \
VONE t 2 \
VAQ t 2 , t 1 , t 1 \
VN h0 , t 1 , t 2 \
VNC t 0 , t 1 , t 1 \
VO t 1 , t 2 , h0
/ / func p o l y 1 3 0 5 v x ( o u t * [ 1 6 ] b y t e , m * b y t e , m l e n u i n t 6 4 , k e y * [ 3 2 ] k e y )
TEXT · p o l y 1 3 0 5 v x ( S B ) , $ 0 - 3 2
/ / This c o d e p r o c e s s e s u p t o 2 b l o c k s ( 3 2 b y t e s ) p e r i t e r a t i o n
/ / using t h e a l g o r i t h m d e s c r i b e d i n :
/ / NEON c r y p t o , D a n i e l J . B e r n s t e i n & P e t e r S c h w a b e
/ / https : / / cryptojedi. o r g / p a p e r s / n e o n c r y p t o - 2 0 1 2 0 3 2 0 . p d f
LMG o u t + 0 ( F P ) , R 1 , R 4 / / R 1 =out , R 2 =m , R 3 =mlen , R 4 =key
/ / load M O D 2 6 , E X 0 , E X 1 a n d E X 2
MOVD $ · c o n s t a n t s < > ( S B ) , R 5
VLM ( R 5 ) , M O D 2 6 , E X 2
/ / setup r
VL ( R 4 ) , T _ 0
MOVD $ · k e y M a s k < > ( S B ) , R 6
VL ( R 6 ) , T _ 1
VN T _ 0 , T _ 1 , T _ 0
EXPAND( T _ 0 , T _ 0 , R _ 0 , R _ 1 , R _ 2 , R _ 3 , R _ 4 )
/ / setup r * 5
VLEIG $ 0 , $ 5 , T _ 0
VLEIG $ 1 , $ 5 , T _ 0
/ / store r ( f o r f i n a l b l o c k )
VMLOF T _ 0 , R _ 1 , R 5 S A V E _ 1
VMLOF T _ 0 , R _ 2 , R 5 S A V E _ 2
VMLOF T _ 0 , R _ 3 , R 5 S A V E _ 3
VMLOF T _ 0 , R _ 4 , R 5 S A V E _ 4
VLGVG $ 0 , R _ 0 , R S A V E _ 0
VLGVG $ 0 , R _ 1 , R S A V E _ 1
VLGVG $ 0 , R _ 2 , R S A V E _ 2
VLGVG $ 0 , R _ 3 , R S A V E _ 3
VLGVG $ 0 , R _ 4 , R S A V E _ 4
/ / skip r * * 2 c a l c u l a t i o n
CMPBLE R 3 , $ 1 6 , s k i p
/ / calculate r * * 2
MULTIPLY( R _ 0 , R _ 1 , R _ 2 , R _ 3 , R _ 4 , R _ 0 , R _ 1 , R _ 2 , R _ 3 , R _ 4 , R 5 S A V E _ 1 , R 5 S A V E _ 2 , R 5 S A V E _ 3 , R 5 S A V E _ 4 , H _ 0 , H _ 1 , H _ 2 , H _ 3 , H _ 4 )
REDUCE( H _ 0 , H _ 1 , H _ 2 , H _ 3 , H _ 4 )
VLEIG $ 0 , $ 5 , T _ 0
VLEIG $ 1 , $ 5 , T _ 0
VMLOF T _ 0 , H _ 1 , R 5 _ 1
VMLOF T _ 0 , H _ 2 , R 5 _ 2
VMLOF T _ 0 , H _ 3 , R 5 _ 3
VMLOF T _ 0 , H _ 4 , R 5 _ 4
VLR H _ 0 , R _ 0
VLR H _ 1 , R _ 1
VLR H _ 2 , R _ 2
VLR H _ 3 , R _ 3
VLR H _ 4 , R _ 4
/ / initialize h
VZERO H _ 0
VZERO H _ 1
VZERO H _ 2
VZERO H _ 3
VZERO H _ 4
loop :
CMPBLE R 3 , $ 3 2 , b2
VLM ( R 2 ) , T _ 0 , T _ 1
SUB $ 3 2 , R 3
MOVD $ 3 2 ( R 2 ) , R 2
EXPAND( T _ 0 , T _ 1 , F _ 0 , F _ 1 , F _ 2 , F _ 3 , F _ 4 )
VLEIB $ 4 , $ 1 , F _ 4
VLEIB $ 1 2 , $ 1 , F _ 4
multiply :
VAG H _ 0 , F _ 0 , F _ 0
VAG H _ 1 , F _ 1 , F _ 1
VAG H _ 2 , F _ 2 , F _ 2
VAG H _ 3 , F _ 3 , F _ 3
VAG H _ 4 , F _ 4 , F _ 4
MULTIPLY( F _ 0 , F _ 1 , F _ 2 , F _ 3 , F _ 4 , R _ 0 , R _ 1 , R _ 2 , R _ 3 , R _ 4 , R 5 _ 1 , R 5 _ 2 , R 5 _ 3 , R 5 _ 4 , H _ 0 , H _ 1 , H _ 2 , H _ 3 , H _ 4 )
REDUCE( H _ 0 , H _ 1 , H _ 2 , H _ 3 , H _ 4 )
CMPBNE R 3 , $ 0 , l o o p
finish :
/ / sum v e c t o r s
VZERO T _ 0
VSUMQG H _ 0 , T _ 0 , H _ 0
VSUMQG H _ 1 , T _ 0 , H _ 1
VSUMQG H _ 2 , T _ 0 , H _ 2
VSUMQG H _ 3 , T _ 0 , H _ 3
VSUMQG H _ 4 , T _ 0 , H _ 4
/ / h m a y b e > = 2 * ( 2 * * 1 3 0 - 5 ) s o w e n e e d t o r e d u c e i t a g a i n
REDUCE( H _ 0 , H _ 1 , H _ 2 , H _ 3 , H _ 4 )
/ / carry h1 - > h4
VESRLG $ 2 6 , H _ 1 , T _ 1
VN M O D 2 6 , H _ 1 , H _ 1
VAQ T _ 1 , H _ 2 , H _ 2
VESRLG $ 2 6 , H _ 2 , T _ 2
VN M O D 2 6 , H _ 2 , H _ 2
VAQ T _ 2 , H _ 3 , H _ 3
VESRLG $ 2 6 , H _ 3 , T _ 3
VN M O D 2 6 , H _ 3 , H _ 3
VAQ T _ 3 , H _ 4 , H _ 4
/ / h i s n o w < 2 * ( 2 * * 1 3 0 - 5 )
/ / pack h i n t o h1 ( h i ) a n d h0 ( l o )
PACK( H _ 0 , H _ 1 , H _ 2 , H _ 3 , H _ 4 )
/ / if h > 2 * * 1 3 0 - 5 t h e n h - = 2 * * 1 3 0 - 5
MOD( H _ 0 , H _ 1 , T _ 0 , T _ 1 , T _ 2 )
/ / h + = s
MOVD $ · b s w a p M a s k < > ( S B ) , R 5
VL ( R 5 ) , T _ 1
VL 1 6 ( R 4 ) , T _ 0
VPERM T _ 0 , T _ 0 , T _ 1 , T _ 0 / / r e v e r s e b y t e s ( t o b i g )
VAQ T _ 0 , H _ 0 , H _ 0
VPERM H _ 0 , H _ 0 , T _ 1 , H _ 0 / / r e v e r s e b y t e s ( t o l i t t l e )
VST H _ 0 , ( R 1 )
RET
b2 :
CMPBLE R 3 , $ 1 6 , b1
/ / 2 blocks r e m a i n i n g
SUB $ 1 7 , R 3
VL ( R 2 ) , T _ 0
VLL R 3 , 1 6 ( R 2 ) , T _ 1
ADD $ 1 , R 3
MOVBZ $ 1 , R 0
CMPBEQ R 3 , $ 1 6 , 2 ( P C )
VLVGB R 3 , R 0 , T _ 1
EXPAND( T _ 0 , T _ 1 , F _ 0 , F _ 1 , F _ 2 , F _ 3 , F _ 4 )
CMPBNE R 3 , $ 1 6 , 2 ( P C )
VLEIB $ 1 2 , $ 1 , F _ 4
VLEIB $ 4 , $ 1 , F _ 4
/ / setup [ r ² ,r ]
VLVGG $ 1 , R S A V E _ 0 , R _ 0
VLVGG $ 1 , R S A V E _ 1 , R _ 1
VLVGG $ 1 , R S A V E _ 2 , R _ 2
VLVGG $ 1 , R S A V E _ 3 , R _ 3
VLVGG $ 1 , R S A V E _ 4 , R _ 4
VPDI $ 0 , R 5 _ 1 , R 5 S A V E _ 1 , R 5 _ 1
VPDI $ 0 , R 5 _ 2 , R 5 S A V E _ 2 , R 5 _ 2
VPDI $ 0 , R 5 _ 3 , R 5 S A V E _ 3 , R 5 _ 3
VPDI $ 0 , R 5 _ 4 , R 5 S A V E _ 4 , R 5 _ 4
MOVD $ 0 , R 3
BR m u l t i p l y
skip :
VZERO H _ 0
VZERO H _ 1
VZERO H _ 2
VZERO H _ 3
VZERO H _ 4
CMPBEQ R 3 , $ 0 , f i n i s h
b1 :
/ / 1 block r e m a i n i n g
SUB $ 1 , R 3
VLL R 3 , ( R 2 ) , T _ 0
ADD $ 1 , R 3
MOVBZ $ 1 , R 0
CMPBEQ R 3 , $ 1 6 , 2 ( P C )
VLVGB R 3 , R 0 , T _ 0
VZERO T _ 1
EXPAND( T _ 0 , T _ 1 , F _ 0 , F _ 1 , F _ 2 , F _ 3 , F _ 4 )
CMPBNE R 3 , $ 1 6 , 2 ( P C )
VLEIB $ 4 , $ 1 , F _ 4
VLEIG $ 1 , $ 1 , R _ 0
VZERO R _ 1
VZERO R _ 2
VZERO R _ 3
VZERO R _ 4
VZERO R 5 _ 1
VZERO R 5 _ 2
VZERO R 5 _ 3
VZERO R 5 _ 4
/ / setup [ r , 1 ]
VLVGG $ 0 , R S A V E _ 0 , R _ 0
VLVGG $ 0 , R S A V E _ 1 , R _ 1
VLVGG $ 0 , R S A V E _ 2 , R _ 2
VLVGG $ 0 , R S A V E _ 3 , R _ 3
VLVGG $ 0 , R S A V E _ 4 , R _ 4
VPDI $ 0 , R 5 S A V E _ 1 , R 5 _ 1 , R 5 _ 1
VPDI $ 0 , R 5 S A V E _ 2 , R 5 _ 2 , R 5 _ 2
VPDI $ 0 , R 5 S A V E _ 3 , R 5 _ 3 , R 5 _ 3
VPDI $ 0 , R 5 S A V E _ 4 , R 5 _ 4 , R 5 _ 4
MOVD $ 0 , R 3
BR m u l t i p l y
2019-10-24 19:55:06 -04:00
TEXT · h a s V e c t o r F a c i l i t y ( S B ) , N O S P L I T , $ 2 4 - 1
MOVD $ x - 2 4 ( S P ) , R 1
XC $ 2 4 , 0 ( R 1 ) , 0 ( R 1 ) / / c l e a r t h e s t o r a g e
MOVD $ 2 , R 0 / / R 0 i s t h e n u m b e r o f d o u b l e w o r d s s t o r e d - 1
WORD $ 0 x B 2 B 0 1 0 0 0 / / S T F L E 0 ( R 1 )
XOR R 0 , R 0 / / r e s e t t h e v a l u e o f R 0
MOVBZ z - 8 ( S P ) , R 1
AND $ 0 x40 , R 1
BEQ n o v e c t o r
vectorinstalled :
/ / check i f t h e v e c t o r i n s t r u c t i o n h a s b e e n e n a b l e d
VLEIB $ 0 , $ 0 x F , V 1 6
VLGVB $ 0 , V 1 6 , R 1
CMPBNE R 1 , $ 0 x F , n o v e c t o r
MOVB $ 1 , r e t + 0 ( F P ) / / h a v e v x
RET
novector :
MOVB $ 0 , r e t + 0 ( F P ) / / n o v x
RET