aes-spe-keys.S 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. /* SPDX-License-Identifier: GPL-2.0-or-later */
  2. /*
  3. * Key handling functions for PPC AES implementation
  4. *
  5. * Copyright (c) 2015 Markus Stockhausen <stockhausen@collogia.de>
  6. */
  7. #include <asm/ppc_asm.h>
  8. #ifdef __BIG_ENDIAN__
  9. #define LOAD_KEY(d, s, off) \
  10. lwz d,off(s);
  11. #else
  12. #define LOAD_KEY(d, s, off) \
  13. li r0,off; \
  14. lwbrx d,s,r0;
  15. #endif
  16. #define INITIALIZE_KEY \
  17. stwu r1,-32(r1); /* create stack frame */ \
  18. stw r14,8(r1); /* save registers */ \
  19. stw r15,12(r1); \
  20. stw r16,16(r1);
  21. #define FINALIZE_KEY \
  22. lwz r14,8(r1); /* restore registers */ \
  23. lwz r15,12(r1); \
  24. lwz r16,16(r1); \
  25. xor r5,r5,r5; /* clear sensitive data */ \
  26. xor r6,r6,r6; \
  27. xor r7,r7,r7; \
  28. xor r8,r8,r8; \
  29. xor r9,r9,r9; \
  30. xor r10,r10,r10; \
  31. xor r11,r11,r11; \
  32. xor r12,r12,r12; \
  33. addi r1,r1,32; /* cleanup stack */
  34. #define LS_BOX(r, t1, t2) \
  35. lis t2,PPC_AES_4K_ENCTAB@h; \
  36. ori t2,t2,PPC_AES_4K_ENCTAB@l; \
  37. rlwimi t2,r,4,20,27; \
  38. lbz t1,8(t2); \
  39. rlwimi r,t1,0,24,31; \
  40. rlwimi t2,r,28,20,27; \
  41. lbz t1,8(t2); \
  42. rlwimi r,t1,8,16,23; \
  43. rlwimi t2,r,20,20,27; \
  44. lbz t1,8(t2); \
  45. rlwimi r,t1,16,8,15; \
  46. rlwimi t2,r,12,20,27; \
  47. lbz t1,8(t2); \
  48. rlwimi r,t1,24,0,7;
  49. #define GF8_MUL(out, in, t1, t2) \
  50. lis t1,0x8080; /* multiplication in GF8 */ \
  51. ori t1,t1,0x8080; \
  52. and t1,t1,in; \
  53. srwi t1,t1,7; \
  54. mulli t1,t1,0x1b; \
  55. lis t2,0x7f7f; \
  56. ori t2,t2,0x7f7f; \
  57. and t2,t2,in; \
  58. slwi t2,t2,1; \
  59. xor out,t1,t2;
  60. /*
  61. * ppc_expand_key_128(u32 *key_enc, const u8 *key)
  62. *
  63. * Expand 128 bit key into 176 bytes encryption key. It consists of
  64. * key itself plus 10 rounds with 16 bytes each
  65. *
  66. */
  67. _GLOBAL(ppc_expand_key_128)
  68. INITIALIZE_KEY
  69. LOAD_KEY(r5,r4,0)
  70. LOAD_KEY(r6,r4,4)
  71. LOAD_KEY(r7,r4,8)
  72. LOAD_KEY(r8,r4,12)
  73. stw r5,0(r3) /* key[0..3] = input data */
  74. stw r6,4(r3)
  75. stw r7,8(r3)
  76. stw r8,12(r3)
  77. li r16,10 /* 10 expansion rounds */
  78. lis r0,0x0100 /* RCO(1) */
  79. ppc_expand_128_loop:
  80. addi r3,r3,16
  81. mr r14,r8 /* apply LS_BOX to 4th temp */
  82. rotlwi r14,r14,8
  83. LS_BOX(r14, r15, r4)
  84. xor r14,r14,r0
  85. xor r5,r5,r14 /* xor next 4 keys */
  86. xor r6,r6,r5
  87. xor r7,r7,r6
  88. xor r8,r8,r7
  89. stw r5,0(r3) /* store next 4 keys */
  90. stw r6,4(r3)
  91. stw r7,8(r3)
  92. stw r8,12(r3)
  93. GF8_MUL(r0, r0, r4, r14) /* multiply RCO by 2 in GF */
  94. subi r16,r16,1
  95. cmpwi r16,0
  96. bt eq,ppc_expand_128_end
  97. b ppc_expand_128_loop
  98. ppc_expand_128_end:
  99. FINALIZE_KEY
  100. blr
  101. /*
  102. * ppc_expand_key_192(u32 *key_enc, const u8 *key)
  103. *
  104. * Expand 192 bit key into 208 bytes encryption key. It consists of key
  105. * itself plus 12 rounds with 16 bytes each
  106. *
  107. */
  108. _GLOBAL(ppc_expand_key_192)
  109. INITIALIZE_KEY
  110. LOAD_KEY(r5,r4,0)
  111. LOAD_KEY(r6,r4,4)
  112. LOAD_KEY(r7,r4,8)
  113. LOAD_KEY(r8,r4,12)
  114. LOAD_KEY(r9,r4,16)
  115. LOAD_KEY(r10,r4,20)
  116. stw r5,0(r3)
  117. stw r6,4(r3)
  118. stw r7,8(r3)
  119. stw r8,12(r3)
  120. stw r9,16(r3)
  121. stw r10,20(r3)
  122. li r16,8 /* 8 expansion rounds */
  123. lis r0,0x0100 /* RCO(1) */
  124. ppc_expand_192_loop:
  125. addi r3,r3,24
  126. mr r14,r10 /* apply LS_BOX to 6th temp */
  127. rotlwi r14,r14,8
  128. LS_BOX(r14, r15, r4)
  129. xor r14,r14,r0
  130. xor r5,r5,r14 /* xor next 6 keys */
  131. xor r6,r6,r5
  132. xor r7,r7,r6
  133. xor r8,r8,r7
  134. xor r9,r9,r8
  135. xor r10,r10,r9
  136. stw r5,0(r3)
  137. stw r6,4(r3)
  138. stw r7,8(r3)
  139. stw r8,12(r3)
  140. subi r16,r16,1
  141. cmpwi r16,0 /* last round early kick out */
  142. bt eq,ppc_expand_192_end
  143. stw r9,16(r3)
  144. stw r10,20(r3)
  145. GF8_MUL(r0, r0, r4, r14) /* multiply RCO GF8 */
  146. b ppc_expand_192_loop
  147. ppc_expand_192_end:
  148. FINALIZE_KEY
  149. blr
  150. /*
  151. * ppc_expand_key_256(u32 *key_enc, const u8 *key)
  152. *
  153. * Expand 256 bit key into 240 bytes encryption key. It consists of key
  154. * itself plus 14 rounds with 16 bytes each
  155. *
  156. */
  157. _GLOBAL(ppc_expand_key_256)
  158. INITIALIZE_KEY
  159. LOAD_KEY(r5,r4,0)
  160. LOAD_KEY(r6,r4,4)
  161. LOAD_KEY(r7,r4,8)
  162. LOAD_KEY(r8,r4,12)
  163. LOAD_KEY(r9,r4,16)
  164. LOAD_KEY(r10,r4,20)
  165. LOAD_KEY(r11,r4,24)
  166. LOAD_KEY(r12,r4,28)
  167. stw r5,0(r3)
  168. stw r6,4(r3)
  169. stw r7,8(r3)
  170. stw r8,12(r3)
  171. stw r9,16(r3)
  172. stw r10,20(r3)
  173. stw r11,24(r3)
  174. stw r12,28(r3)
  175. li r16,7 /* 7 expansion rounds */
  176. lis r0,0x0100 /* RCO(1) */
  177. ppc_expand_256_loop:
  178. addi r3,r3,32
  179. mr r14,r12 /* apply LS_BOX to 8th temp */
  180. rotlwi r14,r14,8
  181. LS_BOX(r14, r15, r4)
  182. xor r14,r14,r0
  183. xor r5,r5,r14 /* xor 4 keys */
  184. xor r6,r6,r5
  185. xor r7,r7,r6
  186. xor r8,r8,r7
  187. mr r14,r8
  188. LS_BOX(r14, r15, r4) /* apply LS_BOX to 4th temp */
  189. xor r9,r9,r14 /* xor 4 keys */
  190. xor r10,r10,r9
  191. xor r11,r11,r10
  192. xor r12,r12,r11
  193. stw r5,0(r3)
  194. stw r6,4(r3)
  195. stw r7,8(r3)
  196. stw r8,12(r3)
  197. subi r16,r16,1
  198. cmpwi r16,0 /* last round early kick out */
  199. bt eq,ppc_expand_256_end
  200. stw r9,16(r3)
  201. stw r10,20(r3)
  202. stw r11,24(r3)
  203. stw r12,28(r3)
  204. GF8_MUL(r0, r0, r4, r14)
  205. b ppc_expand_256_loop
  206. ppc_expand_256_end:
  207. FINALIZE_KEY
  208. blr
  209. /*
  210. * ppc_generate_decrypt_key: derive decryption key from encryption key
  211. * number of bytes to handle are calculated from length of key (16/24/32)
  212. *
  213. */
  214. _GLOBAL(ppc_generate_decrypt_key)
  215. addi r6,r5,24
  216. slwi r6,r6,2
  217. lwzx r7,r4,r6 /* first/last 4 words are same */
  218. stw r7,0(r3)
  219. lwz r7,0(r4)
  220. stwx r7,r3,r6
  221. addi r6,r6,4
  222. lwzx r7,r4,r6
  223. stw r7,4(r3)
  224. lwz r7,4(r4)
  225. stwx r7,r3,r6
  226. addi r6,r6,4
  227. lwzx r7,r4,r6
  228. stw r7,8(r3)
  229. lwz r7,8(r4)
  230. stwx r7,r3,r6
  231. addi r6,r6,4
  232. lwzx r7,r4,r6
  233. stw r7,12(r3)
  234. lwz r7,12(r4)
  235. stwx r7,r3,r6
  236. addi r3,r3,16
  237. add r4,r4,r6
  238. subi r4,r4,28
  239. addi r5,r5,20
  240. srwi r5,r5,2
  241. ppc_generate_decrypt_block:
  242. li r6,4
  243. mtctr r6
  244. ppc_generate_decrypt_word:
  245. lwz r6,0(r4)
  246. GF8_MUL(r7, r6, r0, r7)
  247. GF8_MUL(r8, r7, r0, r8)
  248. GF8_MUL(r9, r8, r0, r9)
  249. xor r10,r9,r6
  250. xor r11,r7,r8
  251. xor r11,r11,r9
  252. xor r12,r7,r10
  253. rotrwi r12,r12,24
  254. xor r11,r11,r12
  255. xor r12,r8,r10
  256. rotrwi r12,r12,16
  257. xor r11,r11,r12
  258. rotrwi r12,r10,8
  259. xor r11,r11,r12
  260. stw r11,0(r3)
  261. addi r3,r3,4
  262. addi r4,r4,4
  263. bdnz ppc_generate_decrypt_word
  264. subi r4,r4,32
  265. subi r5,r5,1
  266. cmpwi r5,0
  267. bt gt,ppc_generate_decrypt_block
  268. blr