Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-or-later */
0002 /*
0003  * Key handling functions for PPC AES implementation
0004  *
0005  * Copyright (c) 2015 Markus Stockhausen <stockhausen@collogia.de>
0006  */
0007 
0008 #include <asm/ppc_asm.h>
0009 
0010 #ifdef __BIG_ENDIAN__
0011 #define LOAD_KEY(d, s, off) \
0012     lwz     d,off(s);
0013 #else
0014 #define LOAD_KEY(d, s, off) \
0015     li      r0,off; \
0016     lwbrx       d,s,r0;
0017 #endif
0018 
0019 #define INITIALIZE_KEY \
0020     stwu        r1,-32(r1); /* create stack frame       */ \
0021     stw     r14,8(r1);  /* save registers       */ \
0022     stw     r15,12(r1);                    \
0023     stw     r16,16(r1);
0024 
0025 #define FINALIZE_KEY \
0026     lwz     r14,8(r1);  /* restore registers        */ \
0027     lwz     r15,12(r1);                    \
0028     lwz     r16,16(r1);                    \
0029     xor     r5,r5,r5;   /* clear sensitive data     */ \
0030     xor     r6,r6,r6;                      \
0031     xor     r7,r7,r7;                      \
0032     xor     r8,r8,r8;                      \
0033     xor     r9,r9,r9;                      \
0034     xor     r10,r10,r10;                       \
0035     xor     r11,r11,r11;                       \
0036     xor     r12,r12,r12;                       \
0037     addi        r1,r1,32;   /* cleanup stack        */
0038 
0039 #define LS_BOX(r, t1, t2) \
0040     lis     t2,PPC_AES_4K_ENCTAB@h;                \
0041     ori     t2,t2,PPC_AES_4K_ENCTAB@l;             \
0042     rlwimi      t2,r,4,20,27;                      \
0043     lbz     t1,8(t2);                      \
0044     rlwimi      r,t1,0,24,31;                      \
0045     rlwimi      t2,r,28,20,27;                     \
0046     lbz     t1,8(t2);                      \
0047     rlwimi      r,t1,8,16,23;                      \
0048     rlwimi      t2,r,20,20,27;                     \
0049     lbz     t1,8(t2);                      \
0050     rlwimi      r,t1,16,8,15;                      \
0051     rlwimi      t2,r,12,20,27;                     \
0052     lbz     t1,8(t2);                      \
0053     rlwimi      r,t1,24,0,7;
0054 
0055 #define GF8_MUL(out, in, t1, t2) \
0056     lis t1,0x8080;          /* multiplication in GF8    */ \
0057     ori t1,t1,0x8080;                          \
0058     and t1,t1,in;                              \
0059     srwi t1,t1,7;                              \
0060     mulli t1,t1,0x1b;                          \
0061     lis t2,0x7f7f;                             \
0062     ori t2,t2,0x7f7f;                          \
0063     and t2,t2,in;                              \
0064     slwi t2,t2,1;                              \
0065     xor out,t1,t2;
0066 
0067 /*
0068  * ppc_expand_key_128(u32 *key_enc, const u8 *key)
0069  *
0070  * Expand 128 bit key into 176 bytes encryption key. It consists of
0071  * key itself plus 10 rounds with 16 bytes each
0072  *
0073  */
0074 _GLOBAL(ppc_expand_key_128)
0075     INITIALIZE_KEY
0076     LOAD_KEY(r5,r4,0)
0077     LOAD_KEY(r6,r4,4)
0078     LOAD_KEY(r7,r4,8)
0079     LOAD_KEY(r8,r4,12)
0080     stw     r5,0(r3)    /* key[0..3] = input data   */
0081     stw     r6,4(r3)
0082     stw     r7,8(r3)
0083     stw     r8,12(r3)
0084     li      r16,10      /* 10 expansion rounds      */
0085     lis     r0,0x0100   /* RCO(1)           */
0086 ppc_expand_128_loop:
0087     addi        r3,r3,16
0088     mr      r14,r8      /* apply LS_BOX to 4th temp */
0089     rotlwi      r14,r14,8
0090     LS_BOX(r14, r15, r4)
0091     xor     r14,r14,r0
0092     xor     r5,r5,r14   /* xor next 4 keys      */
0093     xor     r6,r6,r5
0094     xor     r7,r7,r6
0095     xor     r8,r8,r7
0096     stw     r5,0(r3)    /* store next 4 keys        */
0097     stw     r6,4(r3)
0098     stw     r7,8(r3)
0099     stw     r8,12(r3)
0100     GF8_MUL(r0, r0, r4, r14)    /* multiply RCO by 2 in GF  */
0101     subi        r16,r16,1
0102     cmpwi       r16,0
0103     bt      eq,ppc_expand_128_end
0104     b       ppc_expand_128_loop
0105 ppc_expand_128_end:
0106     FINALIZE_KEY
0107     blr
0108 
0109 /*
0110  * ppc_expand_key_192(u32 *key_enc, const u8 *key)
0111  *
0112  * Expand 192 bit key into 208 bytes encryption key. It consists of key
0113  * itself plus 12 rounds with 16 bytes each
0114  *
0115  */
0116 _GLOBAL(ppc_expand_key_192)
0117     INITIALIZE_KEY
0118     LOAD_KEY(r5,r4,0)
0119     LOAD_KEY(r6,r4,4)
0120     LOAD_KEY(r7,r4,8)
0121     LOAD_KEY(r8,r4,12)
0122     LOAD_KEY(r9,r4,16)
0123     LOAD_KEY(r10,r4,20)
0124     stw     r5,0(r3)
0125     stw     r6,4(r3)
0126     stw     r7,8(r3)
0127     stw     r8,12(r3)
0128     stw     r9,16(r3)
0129     stw     r10,20(r3)
0130     li      r16,8       /* 8 expansion rounds       */
0131     lis     r0,0x0100   /* RCO(1)           */
0132 ppc_expand_192_loop:
0133     addi        r3,r3,24
0134     mr      r14,r10     /* apply LS_BOX to 6th temp */
0135     rotlwi      r14,r14,8
0136     LS_BOX(r14, r15, r4)
0137     xor     r14,r14,r0
0138     xor     r5,r5,r14   /* xor next 6 keys      */
0139     xor     r6,r6,r5
0140     xor     r7,r7,r6
0141     xor     r8,r8,r7
0142     xor     r9,r9,r8
0143     xor     r10,r10,r9
0144     stw     r5,0(r3)
0145     stw     r6,4(r3)
0146     stw     r7,8(r3)
0147     stw     r8,12(r3)
0148     subi        r16,r16,1
0149     cmpwi       r16,0       /* last round early kick out    */
0150     bt      eq,ppc_expand_192_end
0151     stw     r9,16(r3)
0152     stw     r10,20(r3)
0153     GF8_MUL(r0, r0, r4, r14)    /* multiply RCO GF8     */
0154     b       ppc_expand_192_loop
0155 ppc_expand_192_end:
0156     FINALIZE_KEY
0157     blr
0158 
0159 /*
0160  * ppc_expand_key_256(u32 *key_enc, const u8 *key)
0161  *
0162  * Expand 256 bit key into 240 bytes encryption key. It consists of key
0163  * itself plus 14 rounds with 16 bytes each
0164  *
0165  */
0166 _GLOBAL(ppc_expand_key_256)
0167     INITIALIZE_KEY
0168     LOAD_KEY(r5,r4,0)
0169     LOAD_KEY(r6,r4,4)
0170     LOAD_KEY(r7,r4,8)
0171     LOAD_KEY(r8,r4,12)
0172     LOAD_KEY(r9,r4,16)
0173     LOAD_KEY(r10,r4,20)
0174     LOAD_KEY(r11,r4,24)
0175     LOAD_KEY(r12,r4,28)
0176     stw     r5,0(r3)
0177     stw     r6,4(r3)
0178     stw     r7,8(r3)
0179     stw     r8,12(r3)
0180     stw     r9,16(r3)
0181     stw     r10,20(r3)
0182     stw     r11,24(r3)
0183     stw     r12,28(r3)
0184     li      r16,7       /* 7 expansion rounds       */
0185     lis     r0,0x0100   /* RCO(1)           */
0186 ppc_expand_256_loop:
0187     addi        r3,r3,32
0188     mr      r14,r12     /* apply LS_BOX to 8th temp */
0189     rotlwi      r14,r14,8
0190     LS_BOX(r14, r15, r4)
0191     xor     r14,r14,r0
0192     xor     r5,r5,r14   /* xor 4 keys           */
0193     xor     r6,r6,r5
0194     xor     r7,r7,r6
0195     xor     r8,r8,r7
0196     mr      r14,r8
0197     LS_BOX(r14, r15, r4)        /* apply LS_BOX to 4th temp */
0198     xor     r9,r9,r14   /* xor 4 keys           */
0199     xor     r10,r10,r9
0200     xor     r11,r11,r10
0201     xor     r12,r12,r11
0202     stw     r5,0(r3)
0203     stw     r6,4(r3)
0204     stw     r7,8(r3)
0205     stw     r8,12(r3)
0206     subi        r16,r16,1
0207     cmpwi       r16,0       /* last round early kick out    */
0208     bt      eq,ppc_expand_256_end
0209     stw     r9,16(r3)
0210     stw     r10,20(r3)
0211     stw     r11,24(r3)
0212     stw     r12,28(r3)
0213     GF8_MUL(r0, r0, r4, r14)
0214     b       ppc_expand_256_loop
0215 ppc_expand_256_end:
0216     FINALIZE_KEY
0217     blr
0218 
0219 /*
0220  * ppc_generate_decrypt_key: derive decryption key from encryption key
0221  * number of bytes to handle are calculated from length of key (16/24/32)
0222  *
0223  */
0224 _GLOBAL(ppc_generate_decrypt_key)
0225     addi        r6,r5,24
0226     slwi        r6,r6,2
0227     lwzx        r7,r4,r6    /* first/last 4 words are same  */
0228     stw     r7,0(r3)
0229     lwz     r7,0(r4)
0230     stwx        r7,r3,r6
0231     addi        r6,r6,4
0232     lwzx        r7,r4,r6
0233     stw     r7,4(r3)
0234     lwz     r7,4(r4)
0235     stwx        r7,r3,r6
0236     addi        r6,r6,4
0237     lwzx        r7,r4,r6
0238     stw     r7,8(r3)
0239     lwz     r7,8(r4)
0240     stwx        r7,r3,r6
0241     addi        r6,r6,4
0242     lwzx        r7,r4,r6
0243     stw     r7,12(r3)
0244     lwz     r7,12(r4)
0245     stwx        r7,r3,r6
0246     addi        r3,r3,16
0247     add     r4,r4,r6
0248     subi        r4,r4,28
0249     addi        r5,r5,20
0250     srwi        r5,r5,2
0251 ppc_generate_decrypt_block:
0252     li  r6,4
0253     mtctr   r6
0254 ppc_generate_decrypt_word:
0255     lwz     r6,0(r4)
0256     GF8_MUL(r7, r6, r0, r7)
0257     GF8_MUL(r8, r7, r0, r8)
0258     GF8_MUL(r9, r8, r0, r9)
0259     xor     r10,r9,r6
0260     xor     r11,r7,r8
0261     xor     r11,r11,r9
0262     xor     r12,r7,r10
0263     rotrwi      r12,r12,24
0264     xor     r11,r11,r12
0265     xor     r12,r8,r10
0266     rotrwi      r12,r12,16
0267     xor     r11,r11,r12
0268     rotrwi      r12,r10,8
0269     xor     r11,r11,r12
0270     stw     r11,0(r3)
0271     addi        r3,r3,4
0272     addi        r4,r4,4
0273     bdnz        ppc_generate_decrypt_word
0274     subi        r4,r4,32
0275     subi        r5,r5,1
0276     cmpwi       r5,0
0277     bt      gt,ppc_generate_decrypt_block
0278     blr