aes-armv8-aarch32.S 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527
  1. #define __ARM_ARCH__ __LINUX_ARM_ARCH__
  2. #include <linux/linkage.h>
  3. #if __ARM_ARCH__>=7
  4. .fpu crypto-neon-fp-armv8
  5. .text
  6. # AES assembly implementation for ARMv8 AArch32
  7. # - AES_encrypt_ce
  8. # - AES_decrypt_ce
  9. # - private_AES_set_encrypt_key_ce
  10. # - private_AES_set_decrypt_key_ce
  11. # void AES_encrypt_ce(const unsigned char *in, unsigned char *out,
  12. # const AES_KEY *key) {
  13. .align 5
  14. ENTRY(AES_encrypt_ce)
  15. vld1.8 {d24-d25}, [r2]!
  16. vld1.8 {d0-d1}, [r0]
  17. ldr r3, [r2, #240-16]
  18. vld1.8 {d26-d27}, [r2]!
  19. aese.8 q0, q12
  20. aesmc.8 q0, q0
  21. sub r3, r3, #4
  22. vld1.8 {d28-d29}, [r2]!
  23. .LPrivateEncLoop:
  24. subs r3, r3, #2
  25. aese.8 q0, q13
  26. aesmc.8 q0, q0
  27. vld1.8 {d26-d27}, [r2]!
  28. aese.8 q0, q14
  29. aesmc.8 q0, q0
  30. vld1.8 {d28-d29}, [r2]!
  31. bpl .LPrivateEncLoop
  32. aese.8 q0, q13
  33. veor.8 q0, q0, q14
  34. vst1.8 {d0-d1}, [r1]
  35. bx lr
  36. ENDPROC(AES_encrypt_ce)
  37. # void AES_decrypt_ce(const unsigned char *in, unsigned char *out,
  38. # const AES_KEY *key) {
  39. .align 5
  40. ENTRY(AES_decrypt_ce)
  41. vld1.8 {d24-d25}, [r2]!
  42. vld1.8 {d0-d1}, [r0]
  43. ldr r3, [r2, #240-16]
  44. vld1.8 {d26-d27}, [r2]!
  45. aesd.8 q0, q12
  46. aesimc.8 q0, q0
  47. sub r3, r3, #4
  48. vld1.8 {d28-d29}, [r2]!
  49. .LPrivateDecLoop:
  50. subs r3, r3, #2
  51. aesd.8 q0, q13
  52. aesimc.8 q0, q0
  53. vld1.8 {d26-d27}, [r2]!
  54. aesd.8 q0, q14
  55. aesimc.8 q0, q0
  56. vld1.8 {d28-d29}, [r2]!
  57. bpl .LPrivateDecLoop
  58. aesd.8 q0, q13
  59. veor.8 q0, q0, q14
  60. vst1.8 {d0-d1}, [r1]
  61. bx lr
  62. ENDPROC(AES_decrypt_ce)
  63. .align 5
  64. private_rcon:
  65. .long 0x00000001,0x00000001,0x00000001,0x00000001
  66. .long 0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d
  67. .long 0x0000001b,0x0000001b,0x0000001b,0x0000001b
  68. # int private_AES_set_encrypt_key_ce(const unsigned char *userKey, const int bits,
  69. # AES_KEY *key) {
  70. .align 5
  71. ENTRY(private_AES_set_encrypt_key_ce)
  72. adr r3, private_rcon
  73. cmp r1, #192
  74. veor q0, q0, q0
  75. vld1.8 {q8},[r0]!
  76. mov r1, #8
  77. vld1.32 {q1,q2},[r3]!
  78. beq .LPrivateExpandEnc192
  79. bgt .LPrivateExpandEnc256
  80. .LPrivateExpandEnc128:
  81. .LPrivateLoopEnc128:
  82. vst1.32 {q8},[r2]!
  83. vtbl.8 d6, {q8},d4
  84. vtbl.8 d7, {q8},d5
  85. vext.8 q14, q0, q8, #12
  86. veor q15, q8, q14
  87. vext.8 q14, q0, q14, #12
  88. veor q15, q15, q14
  89. vext.8 q14, q0, q14, #12
  90. veor q15, q15, q14
  91. aese.8 q3, q0
  92. subs r1, r1, #1
  93. veor q3, q3, q1
  94. vshl.u8 q1, q1, #1
  95. veor q8, q3, q15
  96. bne .LPrivateLoopEnc128
  97. vld1.32 {q1},[r3]
  98. vst1.32 {q8},[r2]!
  99. vtbl.8 d6, {q8},d4
  100. vtbl.8 d7, {q8},d5
  101. vext.8 q14, q0, q8, #12
  102. veor q15, q8, q14
  103. vext.8 q14, q0, q14, #12
  104. veor q15, q15, q14
  105. vext.8 q14, q0, q14, #12
  106. veor q15, q15, q14
  107. aese.8 q3, q0
  108. veor q3, q3, q1
  109. vshl.u8 q1, q1, #1
  110. veor q8, q3, q15
  111. vst1.32 {q8},[r2]!
  112. vtbl.8 d6, {q8},d4
  113. vtbl.8 d7, {q8},d5
  114. vext.8 q14, q0, q8, #12
  115. veor q15, q8, q14
  116. vext.8 q14, q0, q14, #12
  117. veor q15, q15, q14
  118. vext.8 q14, q0, q14, #12
  119. veor q15, q15, q14
  120. aese.8 q3, q0
  121. veor q3, q3, q1
  122. veor q8, q3, q15
  123. vst1.32 {q8},[r2]
  124. add r2, r2, #0x50
  125. mov r12, #10
  126. str r12, [r2]
  127. eor r0, r0, r0
  128. bx lr
  129. .align 4
  130. .LPrivateExpandEnc192:
  131. vld1.8 {d18},[r0]
  132. vmov.i8 q3, #8
  133. vst1.32 {q8},[r2]!
  134. vsub.i8 q2, q2, q3
  135. vst1.32 {d18},[r2]!
  136. vext.8 q14, q0, q8, #12
  137. veor q15, q8, q14
  138. vtbl.8 d6, {q9},d4
  139. vtbl.8 d7, {q9},d5
  140. vext.8 q14, q0, q14, #12
  141. veor q15, q15, q14
  142. vext.8 q14, q0, q14, #12
  143. veor q15, q15, q14
  144. aese.8 q3, q0
  145. mov r1, #3
  146. veor q3, q3, q1
  147. vshl.u8 q1, q1, #1
  148. veor q8, q3, q15
  149. vdup.32 q15, d31[1]
  150. veor q15, q15, q9
  151. vext.8 q14, q0, q9, #12
  152. veor q15, q15, q14
  153. vst1.32 {q8},[r2]!
  154. veor q9, q3, q15
  155. vst1.32 {d18},[r2]!
  156. .LPrivateLoopEnc192:
  157. vext.8 q14, q0, q8, #12
  158. veor q15, q8, q14
  159. vtbl.8 d6, {q9},d4
  160. vtbl.8 d7, {q9},d5
  161. vext.8 q14, q0, q14, #12
  162. veor q15, q15, q14
  163. vext.8 q14, q0, q14, #12
  164. veor q15, q15, q14
  165. aese.8 q3, q0
  166. subs r1, r1, #1
  167. veor q3, q3, q1
  168. vshl.u8 q1, q1, #1
  169. veor q10, q3, q15
  170. vdup.32 q15, d31[1]
  171. veor q15, q15, q9
  172. vext.8 q14, q0, q9, #12
  173. veor q15, q15, q14
  174. vst1.32 {q10},[r2]!
  175. veor q11, q3, q15
  176. vst1.32 {d22},[r2]!
  177. vext.8 q14, q0, q10, #12
  178. veor q15, q10, q14
  179. vtbl.8 d6, {q11},d4
  180. vtbl.8 d7, {q11},d5
  181. vext.8 q14, q0, q14, #12
  182. veor q15, q15, q14
  183. vext.8 q14, q0, q14, #12
  184. veor q15, q15, q14
  185. aese.8 q3, q0
  186. veor q3, q3, q1
  187. vshl.u8 q1, q1, #1
  188. veor q8, q3, q15
  189. vdup.32 q15, d31[1]
  190. veor q15, q15, q11
  191. vext.8 q14, q0, q11, #12
  192. veor q15, q15, q14
  193. vst1.32 {q8},[r2]!
  194. veor q9, q3, q15
  195. vst1.32 {d18},[r2]!
  196. bne .LPrivateLoopEnc192
  197. vext.8 q14, q0, q8, #12
  198. veor q15, q8, q14
  199. vtbl.8 d6, {q9},d4
  200. vtbl.8 d7, {q9},d5
  201. vext.8 q14, q0, q14, #12
  202. veor q15, q15, q14
  203. vext.8 q14, q0, q14, #12
  204. veor q15, q15, q14
  205. aese.8 q3, q0
  206. veor q3, q3, q1
  207. veor q8, q3, q15
  208. vst1.32 {q8},[r2]!
  209. mov r12, #12
  210. add r2, r2, #0x20
  211. str r12, [r2]
  212. eor r0, r0, r0
  213. bx lr
  214. .align 4
  215. .LPrivateExpandEnc256:
  216. vld1.8 {q9},[r0]
  217. mov r1, #6
  218. .LPrivateLoopEnc256:
  219. vext.8 q14, q0, q8, #12
  220. veor q15, q8, q14
  221. vst1.32 {q8},[r2]!
  222. vtbl.8 d6, {q9},d4
  223. vst1.32 {q9},[r2]!
  224. vtbl.8 d7, {q9},d5
  225. vext.8 q14, q0, q14, #12
  226. veor q15, q15, q14
  227. vext.8 q14, q0, q14, #12
  228. veor q15, q15, q14
  229. aese.8 q3, q0
  230. subs r1, r1, #1
  231. veor q3, q3, q1
  232. vshl.u8 q1, q1, #1
  233. veor q8, q3, q15
  234. vext.8 q14, q0, q9, #12
  235. veor q15, q9, q14
  236. vdup.32 q3, d17[1]
  237. vext.8 q14, q0, q14, #12
  238. veor q15, q15, q14
  239. vext.8 q14, q0, q14, #12
  240. veor q15, q15, q14
  241. aese.8 q3, q0
  242. veor q9, q3, q15
  243. bne .LPrivateLoopEnc256
  244. vst1.32 {q8},[r2]!
  245. vtbl.8 d6, {q9},d4
  246. vst1.32 {q9},[r2]!
  247. vtbl.8 d7, {q9},d5
  248. vext.8 q14, q0, q8, #12
  249. veor q15, q8, q14
  250. vext.8 q14, q0, q14, #12
  251. veor q15, q15, q14
  252. vext.8 q14, q0, q14, #12
  253. veor q15, q15, q14
  254. aese.8 q3, q0
  255. veor q3, q3, q1
  256. veor q8, q3, q15
  257. vst1.32 {q8},[r2]!
  258. mov r12, #14
  259. str r12, [r2]
  260. eor r0, r0, r0
  261. bx lr
  262. ENDPROC(private_AES_set_encrypt_key_ce)
  263. # int private_AES_set_decrypt_key_ce(const unsigned char *userKey, const int bits,
  264. # AES_KEY *key) {
  265. .align 5
  266. ENTRY(private_AES_set_decrypt_key_ce)
  267. adr r3, private_rcon
  268. cmp r1, #192
  269. veor q0, q0, q0
  270. vld1.8 {q8},[r0]!
  271. add r2, r2, #160
  272. vld1.32 {q1,q2},[r3]!
  273. beq .LPrivateExpandDec192
  274. bgt .LPrivateExpandDec256
  275. .LPrivateExpandDec128:
  276. vst1.32 {q8},[r2]
  277. vtbl.8 d6, {q8},d4
  278. vtbl.8 d7, {q8},d5
  279. vext.8 q14, q0, q8, #12
  280. veor q15, q8, q14
  281. vext.8 q14, q0, q14, #12
  282. veor q15, q15, q14
  283. vext.8 q14, q0, q14, #12
  284. veor q15, q15, q14
  285. sub r2, r2, #16
  286. aese.8 q3, q0
  287. mov r1, #7
  288. veor q3, q3, q1
  289. vshl.u8 q1, q1, #1
  290. veor q8, q3, q15
  291. aesimc.8 q12, q8
  292. .LPrivateLoopDec128:
  293. vst1.32 {q12},[r2]
  294. vtbl.8 d6, {q8},d4
  295. vtbl.8 d7, {q8},d5
  296. vext.8 q14, q0, q8, #12
  297. veor q15, q8, q14
  298. vext.8 q14, q0, q14, #12
  299. veor q15, q15, q14
  300. vext.8 q14, q0, q14, #12
  301. veor q15, q15, q14
  302. sub r2, r2, #16
  303. aese.8 q3, q0
  304. subs r1, r1, #1
  305. veor q3, q3, q1
  306. vshl.u8 q1, q1, #1
  307. veor q8, q3, q15
  308. aesimc.8 q12, q8
  309. bne .LPrivateLoopDec128
  310. vld1.32 {q1},[r3]
  311. vst1.32 {q12},[r2]
  312. vtbl.8 d6, {q8},d4
  313. vtbl.8 d7, {q8},d5
  314. vext.8 q14, q0, q8, #12
  315. veor q15, q8, q14
  316. vext.8 q14, q0, q14, #12
  317. veor q15, q15, q14
  318. vext.8 q14, q0, q14, #12
  319. veor q15, q15, q14
  320. sub r2, r2, #16
  321. aese.8 q3, q0
  322. veor q3, q3, q1
  323. vshl.u8 q1, q1, #1
  324. veor q8, q3, q15
  325. aesimc.8 q12, q8
  326. vst1.32 {q12},[r2]
  327. vtbl.8 d6, {q8},d4
  328. vtbl.8 d7, {q8},d5
  329. vext.8 q14, q0, q8, #12
  330. veor q15, q8, q14
  331. vext.8 q14, q0, q14, #12
  332. veor q15, q15, q14
  333. vext.8 q14, q0, q14, #12
  334. veor q15, q15, q14
  335. sub r2, r2, #16
  336. aese.8 q3, q0
  337. veor q3, q3, q1
  338. veor q8, q3, q15
  339. vst1.32 {q8},[r2]
  340. add r2, r2, #240
  341. mov r12, #10
  342. str r12, [r2]
  343. eor r0, r0, r0
  344. bx lr
  345. .align 4
  346. .LPrivateExpandDec192:
  347. vld1.8 {d18},[r0]
  348. add r2, r2, #32
  349. vmov.i8 q3, #8
  350. mov r1, #3
  351. vst1.32 {q8},[r2]
  352. sub r2, r2, #16
  353. vsub.i8 q2, q2, q3
  354. vext.8 q14, q0, q8, #12
  355. veor q15, q8, q14
  356. vtbl.8 d6, {q9},d4
  357. vtbl.8 d7, {q9},d5
  358. vext.8 q14, q0, q14, #12
  359. veor q15, q15, q14
  360. vext.8 q14, q0, q14, #12
  361. veor q15, q15, q14
  362. aese.8 q3, q0
  363. vmov d26, d18
  364. veor q3, q3, q1
  365. vshl.u8 q1, q1, #1
  366. veor q8, q3, q15
  367. vdup.32 q15, d31[1]
  368. vmov d27, d16
  369. veor q15, q15, q9
  370. aesimc.8 q13, q13
  371. vmov d24, d17
  372. vext.8 q14, q0, q9, #12
  373. veor q15, q15, q14
  374. vst1.32 {q13},[r2]
  375. sub r2, r2, #16
  376. veor q9, q3, q15
  377. vmov d25, d18
  378. .LPrivateLoopDec192:
  379. vext.8 q14, q0, q8, #12
  380. veor q15, q8, q14
  381. aesimc.8 q12, q12
  382. vtbl.8 d6, {q9},d4
  383. vtbl.8 d7, {q9},d5
  384. vst1.32 {q12},[r2]
  385. sub r2, r2, #16
  386. vext.8 q14, q0, q14, #12
  387. veor q15, q15, q14
  388. vext.8 q14, q0, q14, #12
  389. veor q15, q15, q14
  390. aese.8 q3, q0
  391. subs r1, r1, #1
  392. veor q3, q3, q1
  393. vshl.u8 q1, q1, #1
  394. veor q10, q3, q15
  395. vdup.32 q15, d31[1]
  396. veor q15, q15, q9
  397. aesimc.8 q12, q10
  398. vext.8 q14, q0, q9, #12
  399. veor q15, q15, q14
  400. vst1.32 {q12},[r2]
  401. sub r2, r2, #16
  402. veor q11, q3, q15
  403. vext.8 q14, q0, q10, #12
  404. veor q15, q10, q14
  405. vtbl.8 d6, {q11},d4
  406. vtbl.8 d7, {q11},d5
  407. vext.8 q14, q0, q14, #12
  408. veor q15, q15, q14
  409. vext.8 q14, q0, q14, #12
  410. veor q15, q15, q14
  411. aese.8 q3, q0
  412. vmov d26, d22
  413. veor q3, q3, q1
  414. vshl.u8 q1, q1, #1
  415. veor q8, q3, q15
  416. vdup.32 q15, d31[1]
  417. vmov d27, d16
  418. veor q15, q15, q11
  419. aesimc.8 q13, q13
  420. vmov d24, d17
  421. vext.8 q14, q0, q11, #12
  422. veor q15, q15, q14
  423. vst1.32 {q13},[r2]
  424. sub r2, r2, #16
  425. veor q9, q3, q15
  426. vmov d25, d18
  427. bne .LPrivateLoopDec192
  428. vext.8 q14, q0, q8, #12
  429. veor q15, q8, q14
  430. aesimc.8 q12, q12
  431. vtbl.8 d6, {q9},d4
  432. vtbl.8 d7, {q9},d5
  433. vst1.32 {q12},[r2]
  434. sub r2, r2, #16
  435. vext.8 q14, q0, q14, #12
  436. veor q15, q15, q14
  437. vext.8 q14, q0, q14, #12
  438. veor q15, q15, q14
  439. aese.8 q3, q0
  440. veor q3, q3, q1
  441. veor q8, q3, q15
  442. vst1.32 {q8},[r2]
  443. add r2, r2, #240
  444. mov r12, #12
  445. str r12, [r2]
  446. eor r0, r0, r0
  447. bx lr
  448. .align 4
  449. .LPrivateExpandDec256:
  450. vld1.8 {q9},[r0]
  451. add r2, r2, #80
  452. vmov q12, q8
  453. mov r1, #14
  454. str r1, [r2]
  455. sub r2, r2, #16
  456. mov r1, #6
  457. .LPrivateLoopDec256:
  458. vext.8 q14, q0, q8, #12
  459. veor q15, q8, q14
  460. aesimc.8 q13, q9
  461. vst1.32 {q12},[r2]
  462. sub r2, r2, #16
  463. vtbl.8 d6, {q9},d4
  464. vst1.32 {q13},[r2]
  465. sub r2, r2, #16
  466. vtbl.8 d7, {q9},d5
  467. vext.8 q14, q0, q14, #12
  468. veor q15, q15, q14
  469. vext.8 q14, q0, q14, #12
  470. veor q15, q15, q14
  471. aese.8 q3, q0
  472. subs r1, r1, #1
  473. veor q3, q3, q1
  474. vshl.u8 q1, q1, #1
  475. veor q8, q3, q15
  476. vext.8 q14, q0, q9, #12
  477. veor q15, q9, q14
  478. aesimc.8 q12, q8
  479. vdup.32 q3, d17[1]
  480. vext.8 q14, q0, q14, #12
  481. veor q15, q15, q14
  482. vext.8 q14, q0, q14, #12
  483. veor q15, q15, q14
  484. aese.8 q3, q0
  485. veor q9, q3, q15
  486. bne .LPrivateLoopDec256
  487. aesimc.8 q13, q9
  488. vst1.32 {q12},[r2]
  489. sub r2, r2, #16
  490. vtbl.8 d6, {q9},d4
  491. vst1.32 {q13},[r2]
  492. sub r2, r2, #16
  493. vtbl.8 d7, {q9},d5
  494. vext.8 q14, q0, q8, #12
  495. veor q15, q8, q14
  496. vext.8 q14, q0, q14, #12
  497. veor q15, q15, q14
  498. vext.8 q14, q0, q14, #12
  499. veor q15, q15, q14
  500. aese.8 q3, q0
  501. veor q3, q3, q1
  502. veor q8, q3, q15
  503. vst1.32 {q8},[r2]
  504. eor r0, r0, r0
  505. bx lr
  506. ENDPROC(private_AES_set_decrypt_key_ce)
  507. .align 2
  508. #endif