aes-spe-modes.S 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630
  1. /*
  2. * AES modes (ECB/CBC/CTR/XTS) for PPC AES implementation
  3. *
  4. * Copyright (c) 2015 Markus Stockhausen <stockhausen@collogia.de>
  5. *
  6. * This program is free software; you can redistribute it and/or modify it
  7. * under the terms of the GNU General Public License as published by the Free
  8. * Software Foundation; either version 2 of the License, or (at your option)
  9. * any later version.
  10. *
  11. */
  12. #include <asm/ppc_asm.h>
  13. #include "aes-spe-regs.h"
  14. #ifdef __BIG_ENDIAN__ /* Macros for big endian builds */
  15. #define LOAD_DATA(reg, off) \
  16. lwz reg,off(rSP); /* load with offset */
  17. #define SAVE_DATA(reg, off) \
  18. stw reg,off(rDP); /* save with offset */
  19. #define NEXT_BLOCK \
  20. addi rSP,rSP,16; /* increment pointers per bloc */ \
  21. addi rDP,rDP,16;
  22. #define LOAD_IV(reg, off) \
  23. lwz reg,off(rIP); /* IV loading with offset */
  24. #define SAVE_IV(reg, off) \
  25. stw reg,off(rIP); /* IV saving with offset */
  26. #define START_IV /* nothing to reset */
  27. #define CBC_DEC 16 /* CBC decrement per block */
  28. #define CTR_DEC 1 /* CTR decrement one byte */
  29. #else /* Macros for little endian */
  30. #define LOAD_DATA(reg, off) \
  31. lwbrx reg,0,rSP; /* load reversed */ \
  32. addi rSP,rSP,4; /* and increment pointer */
  33. #define SAVE_DATA(reg, off) \
  34. stwbrx reg,0,rDP; /* save reversed */ \
  35. addi rDP,rDP,4; /* and increment pointer */
  36. #define NEXT_BLOCK /* nothing todo */
  37. #define LOAD_IV(reg, off) \
  38. lwbrx reg,0,rIP; /* load reversed */ \
  39. addi rIP,rIP,4; /* and increment pointer */
  40. #define SAVE_IV(reg, off) \
  41. stwbrx reg,0,rIP; /* load reversed */ \
  42. addi rIP,rIP,4; /* and increment pointer */
  43. #define START_IV \
  44. subi rIP,rIP,16; /* must reset pointer */
  45. #define CBC_DEC 32 /* 2 blocks because of incs */
  46. #define CTR_DEC 17 /* 1 block because of incs */
  47. #endif
  48. #define SAVE_0_REGS
  49. #define LOAD_0_REGS
  50. #define SAVE_4_REGS \
  51. stw rI0,96(r1); /* save 32 bit registers */ \
  52. stw rI1,100(r1); \
  53. stw rI2,104(r1); \
  54. stw rI3,108(r1);
  55. #define LOAD_4_REGS \
  56. lwz rI0,96(r1); /* restore 32 bit registers */ \
  57. lwz rI1,100(r1); \
  58. lwz rI2,104(r1); \
  59. lwz rI3,108(r1);
  60. #define SAVE_8_REGS \
  61. SAVE_4_REGS \
  62. stw rG0,112(r1); /* save 32 bit registers */ \
  63. stw rG1,116(r1); \
  64. stw rG2,120(r1); \
  65. stw rG3,124(r1);
  66. #define LOAD_8_REGS \
  67. LOAD_4_REGS \
  68. lwz rG0,112(r1); /* restore 32 bit registers */ \
  69. lwz rG1,116(r1); \
  70. lwz rG2,120(r1); \
  71. lwz rG3,124(r1);
  72. #define INITIALIZE_CRYPT(tab,nr32bitregs) \
  73. mflr r0; \
  74. stwu r1,-160(r1); /* create stack frame */ \
  75. lis rT0,tab@h; /* en-/decryption table pointer */ \
  76. stw r0,8(r1); /* save link register */ \
  77. ori rT0,rT0,tab@l; \
  78. evstdw r14,16(r1); \
  79. mr rKS,rKP; \
  80. evstdw r15,24(r1); /* We must save non volatile */ \
  81. evstdw r16,32(r1); /* registers. Take the chance */ \
  82. evstdw r17,40(r1); /* and save the SPE part too */ \
  83. evstdw r18,48(r1); \
  84. evstdw r19,56(r1); \
  85. evstdw r20,64(r1); \
  86. evstdw r21,72(r1); \
  87. evstdw r22,80(r1); \
  88. evstdw r23,88(r1); \
  89. SAVE_##nr32bitregs##_REGS
  90. #define FINALIZE_CRYPT(nr32bitregs) \
  91. lwz r0,8(r1); \
  92. evldw r14,16(r1); /* restore SPE registers */ \
  93. evldw r15,24(r1); \
  94. evldw r16,32(r1); \
  95. evldw r17,40(r1); \
  96. evldw r18,48(r1); \
  97. evldw r19,56(r1); \
  98. evldw r20,64(r1); \
  99. evldw r21,72(r1); \
  100. evldw r22,80(r1); \
  101. evldw r23,88(r1); \
  102. LOAD_##nr32bitregs##_REGS \
  103. mtlr r0; /* restore link register */ \
  104. xor r0,r0,r0; \
  105. stw r0,16(r1); /* delete sensitive data */ \
  106. stw r0,24(r1); /* that we might have pushed */ \
  107. stw r0,32(r1); /* from other context that runs */ \
  108. stw r0,40(r1); /* the same code */ \
  109. stw r0,48(r1); \
  110. stw r0,56(r1); \
  111. stw r0,64(r1); \
  112. stw r0,72(r1); \
  113. stw r0,80(r1); \
  114. stw r0,88(r1); \
  115. addi r1,r1,160; /* cleanup stack frame */
  116. #define ENDIAN_SWAP(t0, t1, s0, s1) \
  117. rotrwi t0,s0,8; /* swap endianness for 2 GPRs */ \
  118. rotrwi t1,s1,8; \
  119. rlwimi t0,s0,8,8,15; \
  120. rlwimi t1,s1,8,8,15; \
  121. rlwimi t0,s0,8,24,31; \
  122. rlwimi t1,s1,8,24,31;
  123. #define GF128_MUL(d0, d1, d2, d3, t0) \
  124. li t0,0x87; /* multiplication in GF128 */ \
  125. cmpwi d3,-1; \
  126. iselgt t0,0,t0; \
  127. rlwimi d3,d2,0,0,0; /* propagate "carry" bits */ \
  128. rotlwi d3,d3,1; \
  129. rlwimi d2,d1,0,0,0; \
  130. rotlwi d2,d2,1; \
  131. rlwimi d1,d0,0,0,0; \
  132. slwi d0,d0,1; /* shift left 128 bit */ \
  133. rotlwi d1,d1,1; \
  134. xor d0,d0,t0;
  135. #define START_KEY(d0, d1, d2, d3) \
  136. lwz rW0,0(rKP); \
  137. mtctr rRR; \
  138. lwz rW1,4(rKP); \
  139. lwz rW2,8(rKP); \
  140. lwz rW3,12(rKP); \
  141. xor rD0,d0,rW0; \
  142. xor rD1,d1,rW1; \
  143. xor rD2,d2,rW2; \
  144. xor rD3,d3,rW3;
  145. /*
  146. * ppc_encrypt_aes(u8 *out, const u8 *in, u32 *key_enc,
  147. * u32 rounds)
  148. *
  149. * called from glue layer to encrypt a single 16 byte block
  150. * round values are AES128 = 4, AES192 = 5, AES256 = 6
  151. *
  152. */
  153. _GLOBAL(ppc_encrypt_aes)
  154. INITIALIZE_CRYPT(PPC_AES_4K_ENCTAB, 0)
  155. LOAD_DATA(rD0, 0)
  156. LOAD_DATA(rD1, 4)
  157. LOAD_DATA(rD2, 8)
  158. LOAD_DATA(rD3, 12)
  159. START_KEY(rD0, rD1, rD2, rD3)
  160. bl ppc_encrypt_block
  161. xor rD0,rD0,rW0
  162. SAVE_DATA(rD0, 0)
  163. xor rD1,rD1,rW1
  164. SAVE_DATA(rD1, 4)
  165. xor rD2,rD2,rW2
  166. SAVE_DATA(rD2, 8)
  167. xor rD3,rD3,rW3
  168. SAVE_DATA(rD3, 12)
  169. FINALIZE_CRYPT(0)
  170. blr
  171. /*
  172. * ppc_decrypt_aes(u8 *out, const u8 *in, u32 *key_dec,
  173. * u32 rounds)
  174. *
  175. * called from glue layer to decrypt a single 16 byte block
  176. * round values are AES128 = 4, AES192 = 5, AES256 = 6
  177. *
  178. */
  179. _GLOBAL(ppc_decrypt_aes)
  180. INITIALIZE_CRYPT(PPC_AES_4K_DECTAB,0)
  181. LOAD_DATA(rD0, 0)
  182. addi rT1,rT0,4096
  183. LOAD_DATA(rD1, 4)
  184. LOAD_DATA(rD2, 8)
  185. LOAD_DATA(rD3, 12)
  186. START_KEY(rD0, rD1, rD2, rD3)
  187. bl ppc_decrypt_block
  188. xor rD0,rD0,rW0
  189. SAVE_DATA(rD0, 0)
  190. xor rD1,rD1,rW1
  191. SAVE_DATA(rD1, 4)
  192. xor rD2,rD2,rW2
  193. SAVE_DATA(rD2, 8)
  194. xor rD3,rD3,rW3
  195. SAVE_DATA(rD3, 12)
  196. FINALIZE_CRYPT(0)
  197. blr
  198. /*
  199. * ppc_encrypt_ecb(u8 *out, const u8 *in, u32 *key_enc,
  200. * u32 rounds, u32 bytes);
  201. *
  202. * called from glue layer to encrypt multiple blocks via ECB
  203. * Bytes must be larger or equal 16 and only whole blocks are
  204. * processed. round values are AES128 = 4, AES192 = 5 and
  205. * AES256 = 6
  206. *
  207. */
  208. _GLOBAL(ppc_encrypt_ecb)
  209. INITIALIZE_CRYPT(PPC_AES_4K_ENCTAB, 0)
  210. ppc_encrypt_ecb_loop:
  211. LOAD_DATA(rD0, 0)
  212. mr rKP,rKS
  213. LOAD_DATA(rD1, 4)
  214. subi rLN,rLN,16
  215. LOAD_DATA(rD2, 8)
  216. cmpwi rLN,15
  217. LOAD_DATA(rD3, 12)
  218. START_KEY(rD0, rD1, rD2, rD3)
  219. bl ppc_encrypt_block
  220. xor rD0,rD0,rW0
  221. SAVE_DATA(rD0, 0)
  222. xor rD1,rD1,rW1
  223. SAVE_DATA(rD1, 4)
  224. xor rD2,rD2,rW2
  225. SAVE_DATA(rD2, 8)
  226. xor rD3,rD3,rW3
  227. SAVE_DATA(rD3, 12)
  228. NEXT_BLOCK
  229. bt gt,ppc_encrypt_ecb_loop
  230. FINALIZE_CRYPT(0)
  231. blr
  232. /*
  233. * ppc_decrypt_ecb(u8 *out, const u8 *in, u32 *key_dec,
  234. * u32 rounds, u32 bytes);
  235. *
  236. * called from glue layer to decrypt multiple blocks via ECB
  237. * Bytes must be larger or equal 16 and only whole blocks are
  238. * processed. round values are AES128 = 4, AES192 = 5 and
  239. * AES256 = 6
  240. *
  241. */
  242. _GLOBAL(ppc_decrypt_ecb)
  243. INITIALIZE_CRYPT(PPC_AES_4K_DECTAB, 0)
  244. addi rT1,rT0,4096
  245. ppc_decrypt_ecb_loop:
  246. LOAD_DATA(rD0, 0)
  247. mr rKP,rKS
  248. LOAD_DATA(rD1, 4)
  249. subi rLN,rLN,16
  250. LOAD_DATA(rD2, 8)
  251. cmpwi rLN,15
  252. LOAD_DATA(rD3, 12)
  253. START_KEY(rD0, rD1, rD2, rD3)
  254. bl ppc_decrypt_block
  255. xor rD0,rD0,rW0
  256. SAVE_DATA(rD0, 0)
  257. xor rD1,rD1,rW1
  258. SAVE_DATA(rD1, 4)
  259. xor rD2,rD2,rW2
  260. SAVE_DATA(rD2, 8)
  261. xor rD3,rD3,rW3
  262. SAVE_DATA(rD3, 12)
  263. NEXT_BLOCK
  264. bt gt,ppc_decrypt_ecb_loop
  265. FINALIZE_CRYPT(0)
  266. blr
  267. /*
  268. * ppc_encrypt_cbc(u8 *out, const u8 *in, u32 *key_enc,
  269. * 32 rounds, u32 bytes, u8 *iv);
  270. *
  271. * called from glue layer to encrypt multiple blocks via CBC
  272. * Bytes must be larger or equal 16 and only whole blocks are
  273. * processed. round values are AES128 = 4, AES192 = 5 and
  274. * AES256 = 6
  275. *
  276. */
  277. _GLOBAL(ppc_encrypt_cbc)
  278. INITIALIZE_CRYPT(PPC_AES_4K_ENCTAB, 4)
  279. LOAD_IV(rI0, 0)
  280. LOAD_IV(rI1, 4)
  281. LOAD_IV(rI2, 8)
  282. LOAD_IV(rI3, 12)
  283. ppc_encrypt_cbc_loop:
  284. LOAD_DATA(rD0, 0)
  285. mr rKP,rKS
  286. LOAD_DATA(rD1, 4)
  287. subi rLN,rLN,16
  288. LOAD_DATA(rD2, 8)
  289. cmpwi rLN,15
  290. LOAD_DATA(rD3, 12)
  291. xor rD0,rD0,rI0
  292. xor rD1,rD1,rI1
  293. xor rD2,rD2,rI2
  294. xor rD3,rD3,rI3
  295. START_KEY(rD0, rD1, rD2, rD3)
  296. bl ppc_encrypt_block
  297. xor rI0,rD0,rW0
  298. SAVE_DATA(rI0, 0)
  299. xor rI1,rD1,rW1
  300. SAVE_DATA(rI1, 4)
  301. xor rI2,rD2,rW2
  302. SAVE_DATA(rI2, 8)
  303. xor rI3,rD3,rW3
  304. SAVE_DATA(rI3, 12)
  305. NEXT_BLOCK
  306. bt gt,ppc_encrypt_cbc_loop
  307. START_IV
  308. SAVE_IV(rI0, 0)
  309. SAVE_IV(rI1, 4)
  310. SAVE_IV(rI2, 8)
  311. SAVE_IV(rI3, 12)
  312. FINALIZE_CRYPT(4)
  313. blr
  314. /*
  315. * ppc_decrypt_cbc(u8 *out, const u8 *in, u32 *key_dec,
  316. * u32 rounds, u32 bytes, u8 *iv);
  317. *
  318. * called from glue layer to decrypt multiple blocks via CBC
  319. * round values are AES128 = 4, AES192 = 5, AES256 = 6
  320. *
  321. */
  322. _GLOBAL(ppc_decrypt_cbc)
  323. INITIALIZE_CRYPT(PPC_AES_4K_DECTAB, 4)
  324. li rT1,15
  325. LOAD_IV(rI0, 0)
  326. andc rLN,rLN,rT1
  327. LOAD_IV(rI1, 4)
  328. subi rLN,rLN,16
  329. LOAD_IV(rI2, 8)
  330. add rSP,rSP,rLN /* reverse processing */
  331. LOAD_IV(rI3, 12)
  332. add rDP,rDP,rLN
  333. LOAD_DATA(rD0, 0)
  334. addi rT1,rT0,4096
  335. LOAD_DATA(rD1, 4)
  336. LOAD_DATA(rD2, 8)
  337. LOAD_DATA(rD3, 12)
  338. START_IV
  339. SAVE_IV(rD0, 0)
  340. SAVE_IV(rD1, 4)
  341. SAVE_IV(rD2, 8)
  342. cmpwi rLN,16
  343. SAVE_IV(rD3, 12)
  344. bt lt,ppc_decrypt_cbc_end
  345. ppc_decrypt_cbc_loop:
  346. mr rKP,rKS
  347. START_KEY(rD0, rD1, rD2, rD3)
  348. bl ppc_decrypt_block
  349. subi rLN,rLN,16
  350. subi rSP,rSP,CBC_DEC
  351. xor rW0,rD0,rW0
  352. LOAD_DATA(rD0, 0)
  353. xor rW1,rD1,rW1
  354. LOAD_DATA(rD1, 4)
  355. xor rW2,rD2,rW2
  356. LOAD_DATA(rD2, 8)
  357. xor rW3,rD3,rW3
  358. LOAD_DATA(rD3, 12)
  359. xor rW0,rW0,rD0
  360. SAVE_DATA(rW0, 0)
  361. xor rW1,rW1,rD1
  362. SAVE_DATA(rW1, 4)
  363. xor rW2,rW2,rD2
  364. SAVE_DATA(rW2, 8)
  365. xor rW3,rW3,rD3
  366. SAVE_DATA(rW3, 12)
  367. cmpwi rLN,15
  368. subi rDP,rDP,CBC_DEC
  369. bt gt,ppc_decrypt_cbc_loop
  370. ppc_decrypt_cbc_end:
  371. mr rKP,rKS
  372. START_KEY(rD0, rD1, rD2, rD3)
  373. bl ppc_decrypt_block
  374. xor rW0,rW0,rD0
  375. xor rW1,rW1,rD1
  376. xor rW2,rW2,rD2
  377. xor rW3,rW3,rD3
  378. xor rW0,rW0,rI0 /* decrypt with initial IV */
  379. SAVE_DATA(rW0, 0)
  380. xor rW1,rW1,rI1
  381. SAVE_DATA(rW1, 4)
  382. xor rW2,rW2,rI2
  383. SAVE_DATA(rW2, 8)
  384. xor rW3,rW3,rI3
  385. SAVE_DATA(rW3, 12)
  386. FINALIZE_CRYPT(4)
  387. blr
  388. /*
  389. * ppc_crypt_ctr(u8 *out, const u8 *in, u32 *key_enc,
  390. * u32 rounds, u32 bytes, u8 *iv);
  391. *
  392. * called from glue layer to encrypt/decrypt multiple blocks
  393. * via CTR. Number of bytes does not need to be a multiple of
  394. * 16. Round values are AES128 = 4, AES192 = 5, AES256 = 6
  395. *
  396. */
  397. _GLOBAL(ppc_crypt_ctr)
  398. INITIALIZE_CRYPT(PPC_AES_4K_ENCTAB, 4)
  399. LOAD_IV(rI0, 0)
  400. LOAD_IV(rI1, 4)
  401. LOAD_IV(rI2, 8)
  402. cmpwi rLN,16
  403. LOAD_IV(rI3, 12)
  404. START_IV
  405. bt lt,ppc_crypt_ctr_partial
  406. ppc_crypt_ctr_loop:
  407. mr rKP,rKS
  408. START_KEY(rI0, rI1, rI2, rI3)
  409. bl ppc_encrypt_block
  410. xor rW0,rD0,rW0
  411. xor rW1,rD1,rW1
  412. xor rW2,rD2,rW2
  413. xor rW3,rD3,rW3
  414. LOAD_DATA(rD0, 0)
  415. subi rLN,rLN,16
  416. LOAD_DATA(rD1, 4)
  417. LOAD_DATA(rD2, 8)
  418. LOAD_DATA(rD3, 12)
  419. xor rD0,rD0,rW0
  420. SAVE_DATA(rD0, 0)
  421. xor rD1,rD1,rW1
  422. SAVE_DATA(rD1, 4)
  423. xor rD2,rD2,rW2
  424. SAVE_DATA(rD2, 8)
  425. xor rD3,rD3,rW3
  426. SAVE_DATA(rD3, 12)
  427. addic rI3,rI3,1 /* increase counter */
  428. addze rI2,rI2
  429. addze rI1,rI1
  430. addze rI0,rI0
  431. NEXT_BLOCK
  432. cmpwi rLN,15
  433. bt gt,ppc_crypt_ctr_loop
  434. ppc_crypt_ctr_partial:
  435. cmpwi rLN,0
  436. bt eq,ppc_crypt_ctr_end
  437. mr rKP,rKS
  438. START_KEY(rI0, rI1, rI2, rI3)
  439. bl ppc_encrypt_block
  440. xor rW0,rD0,rW0
  441. SAVE_IV(rW0, 0)
  442. xor rW1,rD1,rW1
  443. SAVE_IV(rW1, 4)
  444. xor rW2,rD2,rW2
  445. SAVE_IV(rW2, 8)
  446. xor rW3,rD3,rW3
  447. SAVE_IV(rW3, 12)
  448. mtctr rLN
  449. subi rIP,rIP,CTR_DEC
  450. subi rSP,rSP,1
  451. subi rDP,rDP,1
  452. ppc_crypt_ctr_xorbyte:
  453. lbzu rW4,1(rIP) /* bytewise xor for partial block */
  454. lbzu rW5,1(rSP)
  455. xor rW4,rW4,rW5
  456. stbu rW4,1(rDP)
  457. bdnz ppc_crypt_ctr_xorbyte
  458. subf rIP,rLN,rIP
  459. addi rIP,rIP,1
  460. addic rI3,rI3,1
  461. addze rI2,rI2
  462. addze rI1,rI1
  463. addze rI0,rI0
  464. ppc_crypt_ctr_end:
  465. SAVE_IV(rI0, 0)
  466. SAVE_IV(rI1, 4)
  467. SAVE_IV(rI2, 8)
  468. SAVE_IV(rI3, 12)
  469. FINALIZE_CRYPT(4)
  470. blr
  471. /*
  472. * ppc_encrypt_xts(u8 *out, const u8 *in, u32 *key_enc,
  473. * u32 rounds, u32 bytes, u8 *iv, u32 *key_twk);
  474. *
  475. * called from glue layer to encrypt multiple blocks via XTS
  476. * If key_twk is given, the initial IV encryption will be
  477. * processed too. Round values are AES128 = 4, AES192 = 5,
  478. * AES256 = 6
  479. *
  480. */
  481. _GLOBAL(ppc_encrypt_xts)
  482. INITIALIZE_CRYPT(PPC_AES_4K_ENCTAB, 8)
  483. LOAD_IV(rI0, 0)
  484. LOAD_IV(rI1, 4)
  485. LOAD_IV(rI2, 8)
  486. cmpwi rKT,0
  487. LOAD_IV(rI3, 12)
  488. bt eq,ppc_encrypt_xts_notweak
  489. mr rKP,rKT
  490. START_KEY(rI0, rI1, rI2, rI3)
  491. bl ppc_encrypt_block
  492. xor rI0,rD0,rW0
  493. xor rI1,rD1,rW1
  494. xor rI2,rD2,rW2
  495. xor rI3,rD3,rW3
  496. ppc_encrypt_xts_notweak:
  497. ENDIAN_SWAP(rG0, rG1, rI0, rI1)
  498. ENDIAN_SWAP(rG2, rG3, rI2, rI3)
  499. ppc_encrypt_xts_loop:
  500. LOAD_DATA(rD0, 0)
  501. mr rKP,rKS
  502. LOAD_DATA(rD1, 4)
  503. subi rLN,rLN,16
  504. LOAD_DATA(rD2, 8)
  505. LOAD_DATA(rD3, 12)
  506. xor rD0,rD0,rI0
  507. xor rD1,rD1,rI1
  508. xor rD2,rD2,rI2
  509. xor rD3,rD3,rI3
  510. START_KEY(rD0, rD1, rD2, rD3)
  511. bl ppc_encrypt_block
  512. xor rD0,rD0,rW0
  513. xor rD1,rD1,rW1
  514. xor rD2,rD2,rW2
  515. xor rD3,rD3,rW3
  516. xor rD0,rD0,rI0
  517. SAVE_DATA(rD0, 0)
  518. xor rD1,rD1,rI1
  519. SAVE_DATA(rD1, 4)
  520. xor rD2,rD2,rI2
  521. SAVE_DATA(rD2, 8)
  522. xor rD3,rD3,rI3
  523. SAVE_DATA(rD3, 12)
  524. GF128_MUL(rG0, rG1, rG2, rG3, rW0)
  525. ENDIAN_SWAP(rI0, rI1, rG0, rG1)
  526. ENDIAN_SWAP(rI2, rI3, rG2, rG3)
  527. cmpwi rLN,0
  528. NEXT_BLOCK
  529. bt gt,ppc_encrypt_xts_loop
  530. START_IV
  531. SAVE_IV(rI0, 0)
  532. SAVE_IV(rI1, 4)
  533. SAVE_IV(rI2, 8)
  534. SAVE_IV(rI3, 12)
  535. FINALIZE_CRYPT(8)
  536. blr
  537. /*
  538. * ppc_decrypt_xts(u8 *out, const u8 *in, u32 *key_dec,
  539. * u32 rounds, u32 blocks, u8 *iv, u32 *key_twk);
  540. *
  541. * called from glue layer to decrypt multiple blocks via XTS
  542. * If key_twk is given, the initial IV encryption will be
  543. * processed too. Round values are AES128 = 4, AES192 = 5,
  544. * AES256 = 6
  545. *
  546. */
  547. _GLOBAL(ppc_decrypt_xts)
  548. INITIALIZE_CRYPT(PPC_AES_4K_DECTAB, 8)
  549. LOAD_IV(rI0, 0)
  550. addi rT1,rT0,4096
  551. LOAD_IV(rI1, 4)
  552. LOAD_IV(rI2, 8)
  553. cmpwi rKT,0
  554. LOAD_IV(rI3, 12)
  555. bt eq,ppc_decrypt_xts_notweak
  556. subi rT0,rT0,4096
  557. mr rKP,rKT
  558. START_KEY(rI0, rI1, rI2, rI3)
  559. bl ppc_encrypt_block
  560. xor rI0,rD0,rW0
  561. xor rI1,rD1,rW1
  562. xor rI2,rD2,rW2
  563. xor rI3,rD3,rW3
  564. addi rT0,rT0,4096
  565. ppc_decrypt_xts_notweak:
  566. ENDIAN_SWAP(rG0, rG1, rI0, rI1)
  567. ENDIAN_SWAP(rG2, rG3, rI2, rI3)
  568. ppc_decrypt_xts_loop:
  569. LOAD_DATA(rD0, 0)
  570. mr rKP,rKS
  571. LOAD_DATA(rD1, 4)
  572. subi rLN,rLN,16
  573. LOAD_DATA(rD2, 8)
  574. LOAD_DATA(rD3, 12)
  575. xor rD0,rD0,rI0
  576. xor rD1,rD1,rI1
  577. xor rD2,rD2,rI2
  578. xor rD3,rD3,rI3
  579. START_KEY(rD0, rD1, rD2, rD3)
  580. bl ppc_decrypt_block
  581. xor rD0,rD0,rW0
  582. xor rD1,rD1,rW1
  583. xor rD2,rD2,rW2
  584. xor rD3,rD3,rW3
  585. xor rD0,rD0,rI0
  586. SAVE_DATA(rD0, 0)
  587. xor rD1,rD1,rI1
  588. SAVE_DATA(rD1, 4)
  589. xor rD2,rD2,rI2
  590. SAVE_DATA(rD2, 8)
  591. xor rD3,rD3,rI3
  592. SAVE_DATA(rD3, 12)
  593. GF128_MUL(rG0, rG1, rG2, rG3, rW0)
  594. ENDIAN_SWAP(rI0, rI1, rG0, rG1)
  595. ENDIAN_SWAP(rI2, rI3, rG2, rG3)
  596. cmpwi rLN,0
  597. NEXT_BLOCK
  598. bt gt,ppc_decrypt_xts_loop
  599. START_IV
  600. SAVE_IV(rI0, 0)
  601. SAVE_IV(rI1, 4)
  602. SAVE_IV(rI2, 8)
  603. SAVE_IV(rI3, 12)
  604. FINALIZE_CRYPT(8)
  605. blr