2019-05-27 08:55:01 +02:00
/* SPDX-License-Identifier: GPL-2.0-or-later */
2015-02-22 09:59:54 +01:00
/ *
* Key h a n d l i n g f u n c t i o n s f o r P P C A E S i m p l e m e n t a t i o n
*
* Copyright ( c ) 2 0 1 5 M a r k u s S t o c k h a u s e n < s t o c k h a u s e n @collogia.de>
* /
# include < a s m / p p c _ a s m . h >
# ifdef _ _ B I G _ E N D I A N _ _
# define L O A D _ K E Y ( d , s , o f f ) \
lwz d ,o f f ( s ) ;
# else
# define L O A D _ K E Y ( d , s , o f f ) \
li r0 ,o f f ; \
lwbrx d ,s ,r0 ;
# endif
# define I N I T I A L I Z E _ K E Y \
stwu r1 ,- 3 2 ( r1 ) ; /* create stack frame */ \
stw r14 ,8 ( r1 ) ; /* save registers */ \
stw r15 ,1 2 ( r1 ) ; \
stw r16 ,1 6 ( r1 ) ;
# define F I N A L I Z E _ K E Y \
lwz r14 ,8 ( r1 ) ; /* restore registers */ \
lwz r15 ,1 2 ( r1 ) ; \
lwz r16 ,1 6 ( r1 ) ; \
xor r5 ,r5 ,r5 ; /* clear sensitive data */ \
xor r6 ,r6 ,r6 ; \
xor r7 ,r7 ,r7 ; \
xor r8 ,r8 ,r8 ; \
xor r9 ,r9 ,r9 ; \
xor r10 ,r10 ,r10 ; \
xor r11 ,r11 ,r11 ; \
xor r12 ,r12 ,r12 ; \
addi r1 ,r1 ,3 2 ; /* cleanup stack */
# define L S _ B O X ( r , t 1 , t 2 ) \
lis t 2 ,P P C _ A E S _ 4 K _ E N C T A B @h; \
ori t 2 ,t 2 ,P P C _ A E S _ 4 K _ E N C T A B @l; \
rlwimi t 2 ,r ,4 ,2 0 ,2 7 ; \
lbz t 1 ,8 ( t 2 ) ; \
rlwimi r ,t 1 ,0 ,2 4 ,3 1 ; \
rlwimi t 2 ,r ,2 8 ,2 0 ,2 7 ; \
lbz t 1 ,8 ( t 2 ) ; \
rlwimi r ,t 1 ,8 ,1 6 ,2 3 ; \
rlwimi t 2 ,r ,2 0 ,2 0 ,2 7 ; \
lbz t 1 ,8 ( t 2 ) ; \
rlwimi r ,t 1 ,1 6 ,8 ,1 5 ; \
rlwimi t 2 ,r ,1 2 ,2 0 ,2 7 ; \
lbz t 1 ,8 ( t 2 ) ; \
rlwimi r ,t 1 ,2 4 ,0 ,7 ;
# define G F 8 _ M U L ( o u t , i n , t 1 , t 2 ) \
lis t 1 ,0 x80 8 0 ; /* multiplication in GF8 */ \
ori t 1 ,t 1 ,0 x80 8 0 ; \
and t 1 ,t 1 ,i n ; \
srwi t 1 ,t 1 ,7 ; \
mulli t 1 ,t 1 ,0 x1 b ; \
lis t 2 ,0 x7 f7 f ; \
ori t 2 ,t 2 ,0 x7 f7 f ; \
and t 2 ,t 2 ,i n ; \
slwi t 2 ,t 2 ,1 ; \
xor o u t ,t 1 ,t 2 ;
/ *
* ppc_ e x p a n d _ k e y _ 1 2 8 ( u 3 2 * k e y _ e n c , c o n s t u 8 * k e y )
*
* Expand 1 2 8 b i t k e y i n t o 1 7 6 b y t e s e n c r y p t i o n k e y . I t c o n s i s t s o f
* key i t s e l f p l u s 1 0 r o u n d s w i t h 1 6 b y t e s e a c h
*
* /
_ GLOBAL( p p c _ e x p a n d _ k e y _ 1 2 8 )
INITIALIZE_ K E Y
LOAD_ K E Y ( r5 ,r4 ,0 )
LOAD_ K E Y ( r6 ,r4 ,4 )
LOAD_ K E Y ( r7 ,r4 ,8 )
LOAD_ K E Y ( r8 ,r4 ,1 2 )
stw r5 ,0 ( r3 ) / * k e y [ 0 . . 3 ] = i n p u t d a t a * /
stw r6 ,4 ( r3 )
stw r7 ,8 ( r3 )
stw r8 ,1 2 ( r3 )
li r16 ,1 0 / * 1 0 e x p a n s i o n r o u n d s * /
lis r0 ,0 x01 0 0 / * R C O ( 1 ) * /
ppc_expand_128_loop :
addi r3 ,r3 ,1 6
mr r14 ,r8 / * a p p l y L S _ B O X t o 4 t h t e m p * /
rotlwi r14 ,r14 ,8
LS_ B O X ( r14 , r15 , r4 )
xor r14 ,r14 ,r0
xor r5 ,r5 ,r14 / * x o r n e x t 4 k e y s * /
xor r6 ,r6 ,r5
xor r7 ,r7 ,r6
xor r8 ,r8 ,r7
stw r5 ,0 ( r3 ) / * s t o r e n e x t 4 k e y s * /
stw r6 ,4 ( r3 )
stw r7 ,8 ( r3 )
stw r8 ,1 2 ( r3 )
GF8 _ M U L ( r0 , r0 , r4 , r14 ) / * m u l t i p l y R C O b y 2 i n G F * /
subi r16 ,r16 ,1
cmpwi r16 ,0
bt e q ,p p c _ e x p a n d _ 1 2 8 _ e n d
b p p c _ e x p a n d _ 1 2 8 _ l o o p
ppc_expand_128_end :
FINALIZE_ K E Y
blr
/ *
* ppc_ e x p a n d _ k e y _ 1 9 2 ( u 3 2 * k e y _ e n c , c o n s t u 8 * k e y )
*
* Expand 1 9 2 b i t k e y i n t o 2 0 8 b y t e s e n c r y p t i o n k e y . I t c o n s i s t s o f k e y
* itself p l u s 1 2 r o u n d s w i t h 1 6 b y t e s e a c h
*
* /
_ GLOBAL( p p c _ e x p a n d _ k e y _ 1 9 2 )
INITIALIZE_ K E Y
LOAD_ K E Y ( r5 ,r4 ,0 )
LOAD_ K E Y ( r6 ,r4 ,4 )
LOAD_ K E Y ( r7 ,r4 ,8 )
LOAD_ K E Y ( r8 ,r4 ,1 2 )
LOAD_ K E Y ( r9 ,r4 ,1 6 )
LOAD_ K E Y ( r10 ,r4 ,2 0 )
stw r5 ,0 ( r3 )
stw r6 ,4 ( r3 )
stw r7 ,8 ( r3 )
stw r8 ,1 2 ( r3 )
stw r9 ,1 6 ( r3 )
stw r10 ,2 0 ( r3 )
li r16 ,8 / * 8 e x p a n s i o n r o u n d s * /
lis r0 ,0 x01 0 0 / * R C O ( 1 ) * /
ppc_expand_192_loop :
addi r3 ,r3 ,2 4
mr r14 ,r10 / * a p p l y L S _ B O X t o 6 t h t e m p * /
rotlwi r14 ,r14 ,8
LS_ B O X ( r14 , r15 , r4 )
xor r14 ,r14 ,r0
xor r5 ,r5 ,r14 / * x o r n e x t 6 k e y s * /
xor r6 ,r6 ,r5
xor r7 ,r7 ,r6
xor r8 ,r8 ,r7
xor r9 ,r9 ,r8
xor r10 ,r10 ,r9
stw r5 ,0 ( r3 )
stw r6 ,4 ( r3 )
stw r7 ,8 ( r3 )
stw r8 ,1 2 ( r3 )
subi r16 ,r16 ,1
cmpwi r16 ,0 / * l a s t r o u n d e a r l y k i c k o u t * /
bt e q ,p p c _ e x p a n d _ 1 9 2 _ e n d
stw r9 ,1 6 ( r3 )
stw r10 ,2 0 ( r3 )
GF8 _ M U L ( r0 , r0 , r4 , r14 ) / * m u l t i p l y R C O G F 8 * /
b p p c _ e x p a n d _ 1 9 2 _ l o o p
ppc_expand_192_end :
FINALIZE_ K E Y
blr
/ *
* ppc_ e x p a n d _ k e y _ 2 5 6 ( u 3 2 * k e y _ e n c , c o n s t u 8 * k e y )
*
* Expand 2 5 6 b i t k e y i n t o 2 4 0 b y t e s e n c r y p t i o n k e y . I t c o n s i s t s o f k e y
* itself p l u s 1 4 r o u n d s w i t h 1 6 b y t e s e a c h
*
* /
_ GLOBAL( p p c _ e x p a n d _ k e y _ 2 5 6 )
INITIALIZE_ K E Y
LOAD_ K E Y ( r5 ,r4 ,0 )
LOAD_ K E Y ( r6 ,r4 ,4 )
LOAD_ K E Y ( r7 ,r4 ,8 )
LOAD_ K E Y ( r8 ,r4 ,1 2 )
LOAD_ K E Y ( r9 ,r4 ,1 6 )
LOAD_ K E Y ( r10 ,r4 ,2 0 )
LOAD_ K E Y ( r11 ,r4 ,2 4 )
LOAD_ K E Y ( r12 ,r4 ,2 8 )
stw r5 ,0 ( r3 )
stw r6 ,4 ( r3 )
stw r7 ,8 ( r3 )
stw r8 ,1 2 ( r3 )
stw r9 ,1 6 ( r3 )
stw r10 ,2 0 ( r3 )
stw r11 ,2 4 ( r3 )
stw r12 ,2 8 ( r3 )
li r16 ,7 / * 7 e x p a n s i o n r o u n d s * /
lis r0 ,0 x01 0 0 / * R C O ( 1 ) * /
ppc_expand_256_loop :
addi r3 ,r3 ,3 2
mr r14 ,r12 / * a p p l y L S _ B O X t o 8 t h t e m p * /
rotlwi r14 ,r14 ,8
LS_ B O X ( r14 , r15 , r4 )
xor r14 ,r14 ,r0
xor r5 ,r5 ,r14 / * x o r 4 k e y s * /
xor r6 ,r6 ,r5
xor r7 ,r7 ,r6
xor r8 ,r8 ,r7
mr r14 ,r8
LS_ B O X ( r14 , r15 , r4 ) / * a p p l y L S _ B O X t o 4 t h t e m p * /
xor r9 ,r9 ,r14 / * x o r 4 k e y s * /
xor r10 ,r10 ,r9
xor r11 ,r11 ,r10
xor r12 ,r12 ,r11
stw r5 ,0 ( r3 )
stw r6 ,4 ( r3 )
stw r7 ,8 ( r3 )
stw r8 ,1 2 ( r3 )
subi r16 ,r16 ,1
cmpwi r16 ,0 / * l a s t r o u n d e a r l y k i c k o u t * /
bt e q ,p p c _ e x p a n d _ 2 5 6 _ e n d
stw r9 ,1 6 ( r3 )
stw r10 ,2 0 ( r3 )
stw r11 ,2 4 ( r3 )
stw r12 ,2 8 ( r3 )
GF8 _ M U L ( r0 , r0 , r4 , r14 )
b p p c _ e x p a n d _ 2 5 6 _ l o o p
ppc_expand_256_end :
FINALIZE_ K E Y
blr
/ *
* ppc_generate_decrypt_key : derive d e c r y p t i o n k e y f r o m e n c r y p t i o n k e y
* number o f b y t e s t o h a n d l e a r e c a l c u l a t e d f r o m l e n g t h o f k e y ( 1 6 / 2 4 / 3 2 )
*
* /
_ GLOBAL( p p c _ g e n e r a t e _ d e c r y p t _ k e y )
addi r6 ,r5 ,2 4
slwi r6 ,r6 ,2
lwzx r7 ,r4 ,r6 / * f i r s t / l a s t 4 w o r d s a r e s a m e * /
stw r7 ,0 ( r3 )
lwz r7 ,0 ( r4 )
stwx r7 ,r3 ,r6
addi r6 ,r6 ,4
lwzx r7 ,r4 ,r6
stw r7 ,4 ( r3 )
lwz r7 ,4 ( r4 )
stwx r7 ,r3 ,r6
addi r6 ,r6 ,4
lwzx r7 ,r4 ,r6
stw r7 ,8 ( r3 )
lwz r7 ,8 ( r4 )
stwx r7 ,r3 ,r6
addi r6 ,r6 ,4
lwzx r7 ,r4 ,r6
stw r7 ,1 2 ( r3 )
lwz r7 ,1 2 ( r4 )
stwx r7 ,r3 ,r6
addi r3 ,r3 ,1 6
add r4 ,r4 ,r6
subi r4 ,r4 ,2 8
addi r5 ,r5 ,2 0
srwi r5 ,r5 ,2
ppc_generate_decrypt_block :
li r6 ,4
mtctr r6
ppc_generate_decrypt_word :
lwz r6 ,0 ( r4 )
GF8 _ M U L ( r7 , r6 , r0 , r7 )
GF8 _ M U L ( r8 , r7 , r0 , r8 )
GF8 _ M U L ( r9 , r8 , r0 , r9 )
xor r10 ,r9 ,r6
xor r11 ,r7 ,r8
xor r11 ,r11 ,r9
xor r12 ,r7 ,r10
rotrwi r12 ,r12 ,2 4
xor r11 ,r11 ,r12
xor r12 ,r8 ,r10
rotrwi r12 ,r12 ,1 6
xor r11 ,r11 ,r12
rotrwi r12 ,r10 ,8
xor r11 ,r11 ,r12
stw r11 ,0 ( r3 )
addi r3 ,r3 ,4
addi r4 ,r4 ,4
bdnz p p c _ g e n e r a t e _ d e c r y p t _ w o r d
subi r4 ,r4 ,3 2
subi r5 ,r5 ,1
cmpwi r5 ,0
bt g t ,p p c _ g e n e r a t e _ d e c r y p t _ b l o c k
blr