0001
0002
0003
0004
0005
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); \
0021 stw r14,8(r1); \
0022 stw r15,12(r1); \
0023 stw r16,16(r1);
0024
0025 #define FINALIZE_KEY \
0026 lwz r14,8(r1); \
0027 lwz r15,12(r1); \
0028 lwz r16,16(r1); \
0029 xor r5,r5,r5; \
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;
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; \
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
0069
0070
0071
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)
0081 stw r6,4(r3)
0082 stw r7,8(r3)
0083 stw r8,12(r3)
0084 li r16,10
0085 lis r0,0x0100
0086 ppc_expand_128_loop:
0087 addi r3,r3,16
0088 mr r14,r8
0089 rotlwi r14,r14,8
0090 LS_BOX(r14, r15, r4)
0091 xor r14,r14,r0
0092 xor r5,r5,r14
0093 xor r6,r6,r5
0094 xor r7,r7,r6
0095 xor r8,r8,r7
0096 stw r5,0(r3)
0097 stw r6,4(r3)
0098 stw r7,8(r3)
0099 stw r8,12(r3)
0100 GF8_MUL(r0, r0, r4, r14)
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
0111
0112
0113
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
0131 lis r0,0x0100
0132 ppc_expand_192_loop:
0133 addi r3,r3,24
0134 mr r14,r10
0135 rotlwi r14,r14,8
0136 LS_BOX(r14, r15, r4)
0137 xor r14,r14,r0
0138 xor r5,r5,r14
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
0150 bt eq,ppc_expand_192_end
0151 stw r9,16(r3)
0152 stw r10,20(r3)
0153 GF8_MUL(r0, r0, r4, r14)
0154 b ppc_expand_192_loop
0155 ppc_expand_192_end:
0156 FINALIZE_KEY
0157 blr
0158
0159
0160
0161
0162
0163
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
0185 lis r0,0x0100
0186 ppc_expand_256_loop:
0187 addi r3,r3,32
0188 mr r14,r12
0189 rotlwi r14,r14,8
0190 LS_BOX(r14, r15, r4)
0191 xor r14,r14,r0
0192 xor r5,r5,r14
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)
0198 xor r9,r9,r14
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
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
0221
0222
0223
0224 _GLOBAL(ppc_generate_decrypt_key)
0225 addi r6,r5,24
0226 slwi r6,r6,2
0227 lwzx r7,r4,r6
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