bsaes-armv7.S 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536
  1. // This file is generated from a similarly-named Perl script in the BoringSSL
  2. // source tree. Do not edit by hand.
  3. #if !defined(__has_feature)
  4. #define __has_feature(x) 0
  5. #endif
  6. #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM)
  7. #define OPENSSL_NO_ASM
  8. #endif
  9. #if !defined(OPENSSL_NO_ASM)
  10. #if defined(BORINGSSL_PREFIX)
  11. #include <boringssl_prefix_symbols_asm.h>
  12. #endif
  13. @ Copyright 2012-2016 The OpenSSL Project Authors. All Rights Reserved.
  14. @
  15. @ Licensed under the OpenSSL license (the "License"). You may not use
  16. @ this file except in compliance with the License. You can obtain a copy
  17. @ in the file LICENSE in the source distribution or at
  18. @ https://www.openssl.org/source/license.html
  19. @ ====================================================================
  20. @ Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
  21. @ project. The module is, however, dual licensed under OpenSSL and
  22. @ CRYPTOGAMS licenses depending on where you obtain it. For further
  23. @ details see http://www.openssl.org/~appro/cryptogams/.
  24. @
  25. @ Specific modes and adaptation for Linux kernel by Ard Biesheuvel
  26. @ of Linaro. Permission to use under GPL terms is granted.
  27. @ ====================================================================
  28. @ Bit-sliced AES for ARM NEON
  29. @
  30. @ February 2012.
  31. @
  32. @ This implementation is direct adaptation of bsaes-x86_64 module for
  33. @ ARM NEON. Except that this module is endian-neutral [in sense that
  34. @ it can be compiled for either endianness] by courtesy of vld1.8's
  35. @ neutrality. Initial version doesn't implement interface to OpenSSL,
  36. @ only low-level primitives and unsupported entry points, just enough
  37. @ to collect performance results, which for Cortex-A8 core are:
  38. @
  39. @ encrypt 19.5 cycles per byte processed with 128-bit key
  40. @ decrypt 22.1 cycles per byte processed with 128-bit key
  41. @ key conv. 440 cycles per 128-bit key/0.18 of 8x block
  42. @
  43. @ Snapdragon S4 encrypts byte in 17.6 cycles and decrypts in 19.7,
  44. @ which is [much] worse than anticipated (for further details see
  45. @ http://www.openssl.org/~appro/Snapdragon-S4.html).
  46. @
  47. @ Cortex-A15 manages in 14.2/16.1 cycles [when integer-only code
  48. @ manages in 20.0 cycles].
  49. @
  50. @ When comparing to x86_64 results keep in mind that NEON unit is
  51. @ [mostly] single-issue and thus can't [fully] benefit from
  52. @ instruction-level parallelism. And when comparing to aes-armv4
  53. @ results keep in mind key schedule conversion overhead (see
  54. @ bsaes-x86_64.pl for further details)...
  55. @
  56. @ <appro@openssl.org>
  57. @ April-August 2013
  58. @ Add CBC, CTR and XTS subroutines and adapt for kernel use; courtesy of Ard.
  59. #ifndef __KERNEL__
  60. # include <openssl/arm_arch.h>
  61. # define VFP_ABI_PUSH vstmdb sp!,{d8-d15}
  62. # define VFP_ABI_POP vldmia sp!,{d8-d15}
  63. # define VFP_ABI_FRAME 0x40
  64. #else
  65. # define VFP_ABI_PUSH
  66. # define VFP_ABI_POP
  67. # define VFP_ABI_FRAME 0
  68. # define BSAES_ASM_EXTENDED_KEY
  69. # define XTS_CHAIN_TWEAK
  70. # define __ARM_ARCH__ __LINUX_ARM_ARCH__
  71. # define __ARM_MAX_ARCH__ 7
  72. #endif
  73. #ifdef __thumb__
  74. # define adrl adr
  75. #endif
  76. #if __ARM_MAX_ARCH__>=7
  77. .text
  78. .syntax unified @ ARMv7-capable assembler is expected to handle this
  79. #if defined(__thumb2__) && !defined(__APPLE__)
  80. .thumb
  81. #else
  82. .code 32
  83. # undef __thumb2__
  84. #endif
  85. #ifdef __thumb2__
  86. .thumb_func _bsaes_decrypt8
  87. #endif
  88. .align 4
  89. _bsaes_decrypt8:
  90. adr r6,.
  91. vldmia r4!, {q9} @ round 0 key
  92. #if defined(__thumb2__) || defined(__APPLE__)
  93. adr r6,LM0ISR
  94. #else
  95. add r6,r6,#LM0ISR-_bsaes_decrypt8
  96. #endif
  97. vldmia r6!, {q8} @ LM0ISR
  98. veor q10, q0, q9 @ xor with round0 key
  99. veor q11, q1, q9
  100. vtbl.8 d0, {q10}, d16
  101. vtbl.8 d1, {q10}, d17
  102. veor q12, q2, q9
  103. vtbl.8 d2, {q11}, d16
  104. vtbl.8 d3, {q11}, d17
  105. veor q13, q3, q9
  106. vtbl.8 d4, {q12}, d16
  107. vtbl.8 d5, {q12}, d17
  108. veor q14, q4, q9
  109. vtbl.8 d6, {q13}, d16
  110. vtbl.8 d7, {q13}, d17
  111. veor q15, q5, q9
  112. vtbl.8 d8, {q14}, d16
  113. vtbl.8 d9, {q14}, d17
  114. veor q10, q6, q9
  115. vtbl.8 d10, {q15}, d16
  116. vtbl.8 d11, {q15}, d17
  117. veor q11, q7, q9
  118. vtbl.8 d12, {q10}, d16
  119. vtbl.8 d13, {q10}, d17
  120. vtbl.8 d14, {q11}, d16
  121. vtbl.8 d15, {q11}, d17
  122. vmov.i8 q8,#0x55 @ compose LBS0
  123. vmov.i8 q9,#0x33 @ compose LBS1
  124. vshr.u64 q10, q6, #1
  125. vshr.u64 q11, q4, #1
  126. veor q10, q10, q7
  127. veor q11, q11, q5
  128. vand q10, q10, q8
  129. vand q11, q11, q8
  130. veor q7, q7, q10
  131. vshl.u64 q10, q10, #1
  132. veor q5, q5, q11
  133. vshl.u64 q11, q11, #1
  134. veor q6, q6, q10
  135. veor q4, q4, q11
  136. vshr.u64 q10, q2, #1
  137. vshr.u64 q11, q0, #1
  138. veor q10, q10, q3
  139. veor q11, q11, q1
  140. vand q10, q10, q8
  141. vand q11, q11, q8
  142. veor q3, q3, q10
  143. vshl.u64 q10, q10, #1
  144. veor q1, q1, q11
  145. vshl.u64 q11, q11, #1
  146. veor q2, q2, q10
  147. veor q0, q0, q11
  148. vmov.i8 q8,#0x0f @ compose LBS2
  149. vshr.u64 q10, q5, #2
  150. vshr.u64 q11, q4, #2
  151. veor q10, q10, q7
  152. veor q11, q11, q6
  153. vand q10, q10, q9
  154. vand q11, q11, q9
  155. veor q7, q7, q10
  156. vshl.u64 q10, q10, #2
  157. veor q6, q6, q11
  158. vshl.u64 q11, q11, #2
  159. veor q5, q5, q10
  160. veor q4, q4, q11
  161. vshr.u64 q10, q1, #2
  162. vshr.u64 q11, q0, #2
  163. veor q10, q10, q3
  164. veor q11, q11, q2
  165. vand q10, q10, q9
  166. vand q11, q11, q9
  167. veor q3, q3, q10
  168. vshl.u64 q10, q10, #2
  169. veor q2, q2, q11
  170. vshl.u64 q11, q11, #2
  171. veor q1, q1, q10
  172. veor q0, q0, q11
  173. vshr.u64 q10, q3, #4
  174. vshr.u64 q11, q2, #4
  175. veor q10, q10, q7
  176. veor q11, q11, q6
  177. vand q10, q10, q8
  178. vand q11, q11, q8
  179. veor q7, q7, q10
  180. vshl.u64 q10, q10, #4
  181. veor q6, q6, q11
  182. vshl.u64 q11, q11, #4
  183. veor q3, q3, q10
  184. veor q2, q2, q11
  185. vshr.u64 q10, q1, #4
  186. vshr.u64 q11, q0, #4
  187. veor q10, q10, q5
  188. veor q11, q11, q4
  189. vand q10, q10, q8
  190. vand q11, q11, q8
  191. veor q5, q5, q10
  192. vshl.u64 q10, q10, #4
  193. veor q4, q4, q11
  194. vshl.u64 q11, q11, #4
  195. veor q1, q1, q10
  196. veor q0, q0, q11
  197. sub r5,r5,#1
  198. b Ldec_sbox
  199. .align 4
  200. Ldec_loop:
  201. vldmia r4!, {q8,q9,q10,q11}
  202. veor q8, q8, q0
  203. veor q9, q9, q1
  204. vtbl.8 d0, {q8}, d24
  205. vtbl.8 d1, {q8}, d25
  206. vldmia r4!, {q8}
  207. veor q10, q10, q2
  208. vtbl.8 d2, {q9}, d24
  209. vtbl.8 d3, {q9}, d25
  210. vldmia r4!, {q9}
  211. veor q11, q11, q3
  212. vtbl.8 d4, {q10}, d24
  213. vtbl.8 d5, {q10}, d25
  214. vldmia r4!, {q10}
  215. vtbl.8 d6, {q11}, d24
  216. vtbl.8 d7, {q11}, d25
  217. vldmia r4!, {q11}
  218. veor q8, q8, q4
  219. veor q9, q9, q5
  220. vtbl.8 d8, {q8}, d24
  221. vtbl.8 d9, {q8}, d25
  222. veor q10, q10, q6
  223. vtbl.8 d10, {q9}, d24
  224. vtbl.8 d11, {q9}, d25
  225. veor q11, q11, q7
  226. vtbl.8 d12, {q10}, d24
  227. vtbl.8 d13, {q10}, d25
  228. vtbl.8 d14, {q11}, d24
  229. vtbl.8 d15, {q11}, d25
  230. Ldec_sbox:
  231. veor q1, q1, q4
  232. veor q3, q3, q4
  233. veor q4, q4, q7
  234. veor q1, q1, q6
  235. veor q2, q2, q7
  236. veor q6, q6, q4
  237. veor q0, q0, q1
  238. veor q2, q2, q5
  239. veor q7, q7, q6
  240. veor q3, q3, q0
  241. veor q5, q5, q0
  242. veor q1, q1, q3
  243. veor q11, q3, q0
  244. veor q10, q7, q4
  245. veor q9, q1, q6
  246. veor q13, q4, q0
  247. vmov q8, q10
  248. veor q12, q5, q2
  249. vorr q10, q10, q9
  250. veor q15, q11, q8
  251. vand q14, q11, q12
  252. vorr q11, q11, q12
  253. veor q12, q12, q9
  254. vand q8, q8, q9
  255. veor q9, q6, q2
  256. vand q15, q15, q12
  257. vand q13, q13, q9
  258. veor q9, q3, q7
  259. veor q12, q1, q5
  260. veor q11, q11, q13
  261. veor q10, q10, q13
  262. vand q13, q9, q12
  263. vorr q9, q9, q12
  264. veor q11, q11, q15
  265. veor q8, q8, q13
  266. veor q10, q10, q14
  267. veor q9, q9, q15
  268. veor q8, q8, q14
  269. vand q12, q4, q6
  270. veor q9, q9, q14
  271. vand q13, q0, q2
  272. vand q14, q7, q1
  273. vorr q15, q3, q5
  274. veor q11, q11, q12
  275. veor q9, q9, q14
  276. veor q8, q8, q15
  277. veor q10, q10, q13
  278. @ Inv_GF16 0, 1, 2, 3, s0, s1, s2, s3
  279. @ new smaller inversion
  280. vand q14, q11, q9
  281. vmov q12, q8
  282. veor q13, q10, q14
  283. veor q15, q8, q14
  284. veor q14, q8, q14 @ q14=q15
  285. vbsl q13, q9, q8
  286. vbsl q15, q11, q10
  287. veor q11, q11, q10
  288. vbsl q12, q13, q14
  289. vbsl q8, q14, q13
  290. vand q14, q12, q15
  291. veor q9, q9, q8
  292. veor q14, q14, q11
  293. veor q12, q5, q2
  294. veor q8, q1, q6
  295. veor q10, q15, q14
  296. vand q10, q10, q5
  297. veor q5, q5, q1
  298. vand q11, q1, q15
  299. vand q5, q5, q14
  300. veor q1, q11, q10
  301. veor q5, q5, q11
  302. veor q15, q15, q13
  303. veor q14, q14, q9
  304. veor q11, q15, q14
  305. veor q10, q13, q9
  306. vand q11, q11, q12
  307. vand q10, q10, q2
  308. veor q12, q12, q8
  309. veor q2, q2, q6
  310. vand q8, q8, q15
  311. vand q6, q6, q13
  312. vand q12, q12, q14
  313. vand q2, q2, q9
  314. veor q8, q8, q12
  315. veor q2, q2, q6
  316. veor q12, q12, q11
  317. veor q6, q6, q10
  318. veor q5, q5, q12
  319. veor q2, q2, q12
  320. veor q1, q1, q8
  321. veor q6, q6, q8
  322. veor q12, q3, q0
  323. veor q8, q7, q4
  324. veor q11, q15, q14
  325. veor q10, q13, q9
  326. vand q11, q11, q12
  327. vand q10, q10, q0
  328. veor q12, q12, q8
  329. veor q0, q0, q4
  330. vand q8, q8, q15
  331. vand q4, q4, q13
  332. vand q12, q12, q14
  333. vand q0, q0, q9
  334. veor q8, q8, q12
  335. veor q0, q0, q4
  336. veor q12, q12, q11
  337. veor q4, q4, q10
  338. veor q15, q15, q13
  339. veor q14, q14, q9
  340. veor q10, q15, q14
  341. vand q10, q10, q3
  342. veor q3, q3, q7
  343. vand q11, q7, q15
  344. vand q3, q3, q14
  345. veor q7, q11, q10
  346. veor q3, q3, q11
  347. veor q3, q3, q12
  348. veor q0, q0, q12
  349. veor q7, q7, q8
  350. veor q4, q4, q8
  351. veor q1, q1, q7
  352. veor q6, q6, q5
  353. veor q4, q4, q1
  354. veor q2, q2, q7
  355. veor q5, q5, q7
  356. veor q4, q4, q2
  357. veor q7, q7, q0
  358. veor q4, q4, q5
  359. veor q3, q3, q6
  360. veor q6, q6, q1
  361. veor q3, q3, q4
  362. veor q4, q4, q0
  363. veor q7, q7, q3
  364. subs r5,r5,#1
  365. bcc Ldec_done
  366. @ multiplication by 0x05-0x00-0x04-0x00
  367. vext.8 q8, q0, q0, #8
  368. vext.8 q14, q3, q3, #8
  369. vext.8 q15, q5, q5, #8
  370. veor q8, q8, q0
  371. vext.8 q9, q1, q1, #8
  372. veor q14, q14, q3
  373. vext.8 q10, q6, q6, #8
  374. veor q15, q15, q5
  375. vext.8 q11, q4, q4, #8
  376. veor q9, q9, q1
  377. vext.8 q12, q2, q2, #8
  378. veor q10, q10, q6
  379. vext.8 q13, q7, q7, #8
  380. veor q11, q11, q4
  381. veor q12, q12, q2
  382. veor q13, q13, q7
  383. veor q0, q0, q14
  384. veor q1, q1, q14
  385. veor q6, q6, q8
  386. veor q2, q2, q10
  387. veor q4, q4, q9
  388. veor q1, q1, q15
  389. veor q6, q6, q15
  390. veor q2, q2, q14
  391. veor q7, q7, q11
  392. veor q4, q4, q14
  393. veor q3, q3, q12
  394. veor q2, q2, q15
  395. veor q7, q7, q15
  396. veor q5, q5, q13
  397. vext.8 q8, q0, q0, #12 @ x0 <<< 32
  398. vext.8 q9, q1, q1, #12
  399. veor q0, q0, q8 @ x0 ^ (x0 <<< 32)
  400. vext.8 q10, q6, q6, #12
  401. veor q1, q1, q9
  402. vext.8 q11, q4, q4, #12
  403. veor q6, q6, q10
  404. vext.8 q12, q2, q2, #12
  405. veor q4, q4, q11
  406. vext.8 q13, q7, q7, #12
  407. veor q2, q2, q12
  408. vext.8 q14, q3, q3, #12
  409. veor q7, q7, q13
  410. vext.8 q15, q5, q5, #12
  411. veor q3, q3, q14
  412. veor q9, q9, q0
  413. veor q5, q5, q15
  414. vext.8 q0, q0, q0, #8 @ (x0 ^ (x0 <<< 32)) <<< 64)
  415. veor q10, q10, q1
  416. veor q8, q8, q5
  417. veor q9, q9, q5
  418. vext.8 q1, q1, q1, #8
  419. veor q13, q13, q2
  420. veor q0, q0, q8
  421. veor q14, q14, q7
  422. veor q1, q1, q9
  423. vext.8 q8, q2, q2, #8
  424. veor q12, q12, q4
  425. vext.8 q9, q7, q7, #8
  426. veor q15, q15, q3
  427. vext.8 q2, q4, q4, #8
  428. veor q11, q11, q6
  429. vext.8 q7, q5, q5, #8
  430. veor q12, q12, q5
  431. vext.8 q4, q3, q3, #8
  432. veor q11, q11, q5
  433. vext.8 q3, q6, q6, #8
  434. veor q5, q9, q13
  435. veor q11, q11, q2
  436. veor q7, q7, q15
  437. veor q6, q4, q14
  438. veor q4, q8, q12
  439. veor q2, q3, q10
  440. vmov q3, q11
  441. @ vmov q5, q9
  442. vldmia r6, {q12} @ LISR
  443. ite eq @ Thumb2 thing, sanity check in ARM
  444. addeq r6,r6,#0x10
  445. bne Ldec_loop
  446. vldmia r6, {q12} @ LISRM0
  447. b Ldec_loop
  448. .align 4
  449. Ldec_done:
  450. vmov.i8 q8,#0x55 @ compose LBS0
  451. vmov.i8 q9,#0x33 @ compose LBS1
  452. vshr.u64 q10, q3, #1
  453. vshr.u64 q11, q2, #1
  454. veor q10, q10, q5
  455. veor q11, q11, q7
  456. vand q10, q10, q8
  457. vand q11, q11, q8
  458. veor q5, q5, q10
  459. vshl.u64 q10, q10, #1
  460. veor q7, q7, q11
  461. vshl.u64 q11, q11, #1
  462. veor q3, q3, q10
  463. veor q2, q2, q11
  464. vshr.u64 q10, q6, #1
  465. vshr.u64 q11, q0, #1
  466. veor q10, q10, q4
  467. veor q11, q11, q1
  468. vand q10, q10, q8
  469. vand q11, q11, q8
  470. veor q4, q4, q10
  471. vshl.u64 q10, q10, #1
  472. veor q1, q1, q11
  473. vshl.u64 q11, q11, #1
  474. veor q6, q6, q10
  475. veor q0, q0, q11
  476. vmov.i8 q8,#0x0f @ compose LBS2
  477. vshr.u64 q10, q7, #2
  478. vshr.u64 q11, q2, #2
  479. veor q10, q10, q5
  480. veor q11, q11, q3
  481. vand q10, q10, q9
  482. vand q11, q11, q9
  483. veor q5, q5, q10
  484. vshl.u64 q10, q10, #2
  485. veor q3, q3, q11
  486. vshl.u64 q11, q11, #2
  487. veor q7, q7, q10
  488. veor q2, q2, q11
  489. vshr.u64 q10, q1, #2
  490. vshr.u64 q11, q0, #2
  491. veor q10, q10, q4
  492. veor q11, q11, q6
  493. vand q10, q10, q9
  494. vand q11, q11, q9
  495. veor q4, q4, q10
  496. vshl.u64 q10, q10, #2
  497. veor q6, q6, q11
  498. vshl.u64 q11, q11, #2
  499. veor q1, q1, q10
  500. veor q0, q0, q11
  501. vshr.u64 q10, q4, #4
  502. vshr.u64 q11, q6, #4
  503. veor q10, q10, q5
  504. veor q11, q11, q3
  505. vand q10, q10, q8
  506. vand q11, q11, q8
  507. veor q5, q5, q10
  508. vshl.u64 q10, q10, #4
  509. veor q3, q3, q11
  510. vshl.u64 q11, q11, #4
  511. veor q4, q4, q10
  512. veor q6, q6, q11
  513. vshr.u64 q10, q1, #4
  514. vshr.u64 q11, q0, #4
  515. veor q10, q10, q7
  516. veor q11, q11, q2
  517. vand q10, q10, q8
  518. vand q11, q11, q8
  519. veor q7, q7, q10
  520. vshl.u64 q10, q10, #4
  521. veor q2, q2, q11
  522. vshl.u64 q11, q11, #4
  523. veor q1, q1, q10
  524. veor q0, q0, q11
  525. vldmia r4, {q8} @ last round key
  526. veor q6, q6, q8
  527. veor q4, q4, q8
  528. veor q2, q2, q8
  529. veor q7, q7, q8
  530. veor q3, q3, q8
  531. veor q5, q5, q8
  532. veor q0, q0, q8
  533. veor q1, q1, q8
  534. bx lr
  535. .align 6
  536. _bsaes_const:
  537. LM0ISR:@ InvShiftRows constants
  538. .quad 0x0a0e0206070b0f03, 0x0004080c0d010509
  539. LISR:
  540. .quad 0x0504070602010003, 0x0f0e0d0c080b0a09
  541. LISRM0:
  542. .quad 0x01040b0e0205080f, 0x0306090c00070a0d
  543. LM0SR:@ ShiftRows constants
  544. .quad 0x0a0e02060f03070b, 0x0004080c05090d01
  545. LSR:
  546. .quad 0x0504070600030201, 0x0f0e0d0c0a09080b
  547. LSRM0:
  548. .quad 0x0304090e00050a0f, 0x01060b0c0207080d
  549. LM0:
  550. .quad 0x02060a0e03070b0f, 0x0004080c0105090d
  551. LREVM0SR:
  552. .quad 0x090d01050c000408, 0x03070b0f060a0e02
  553. .byte 66,105,116,45,115,108,105,99,101,100,32,65,69,83,32,102,111,114,32,78,69,79,78,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
  554. .align 2
  555. .align 6
  556. #ifdef __thumb2__
  557. .thumb_func _bsaes_encrypt8
  558. #endif
  559. .align 4
  560. _bsaes_encrypt8:
  561. adr r6,.
  562. vldmia r4!, {q9} @ round 0 key
  563. #if defined(__thumb2__) || defined(__APPLE__)
  564. adr r6,LM0SR
  565. #else
  566. sub r6,r6,#_bsaes_encrypt8-LM0SR
  567. #endif
  568. vldmia r6!, {q8} @ LM0SR
  569. _bsaes_encrypt8_alt:
  570. veor q10, q0, q9 @ xor with round0 key
  571. veor q11, q1, q9
  572. vtbl.8 d0, {q10}, d16
  573. vtbl.8 d1, {q10}, d17
  574. veor q12, q2, q9
  575. vtbl.8 d2, {q11}, d16
  576. vtbl.8 d3, {q11}, d17
  577. veor q13, q3, q9
  578. vtbl.8 d4, {q12}, d16
  579. vtbl.8 d5, {q12}, d17
  580. veor q14, q4, q9
  581. vtbl.8 d6, {q13}, d16
  582. vtbl.8 d7, {q13}, d17
  583. veor q15, q5, q9
  584. vtbl.8 d8, {q14}, d16
  585. vtbl.8 d9, {q14}, d17
  586. veor q10, q6, q9
  587. vtbl.8 d10, {q15}, d16
  588. vtbl.8 d11, {q15}, d17
  589. veor q11, q7, q9
  590. vtbl.8 d12, {q10}, d16
  591. vtbl.8 d13, {q10}, d17
  592. vtbl.8 d14, {q11}, d16
  593. vtbl.8 d15, {q11}, d17
  594. _bsaes_encrypt8_bitslice:
  595. vmov.i8 q8,#0x55 @ compose LBS0
  596. vmov.i8 q9,#0x33 @ compose LBS1
  597. vshr.u64 q10, q6, #1
  598. vshr.u64 q11, q4, #1
  599. veor q10, q10, q7
  600. veor q11, q11, q5
  601. vand q10, q10, q8
  602. vand q11, q11, q8
  603. veor q7, q7, q10
  604. vshl.u64 q10, q10, #1
  605. veor q5, q5, q11
  606. vshl.u64 q11, q11, #1
  607. veor q6, q6, q10
  608. veor q4, q4, q11
  609. vshr.u64 q10, q2, #1
  610. vshr.u64 q11, q0, #1
  611. veor q10, q10, q3
  612. veor q11, q11, q1
  613. vand q10, q10, q8
  614. vand q11, q11, q8
  615. veor q3, q3, q10
  616. vshl.u64 q10, q10, #1
  617. veor q1, q1, q11
  618. vshl.u64 q11, q11, #1
  619. veor q2, q2, q10
  620. veor q0, q0, q11
  621. vmov.i8 q8,#0x0f @ compose LBS2
  622. vshr.u64 q10, q5, #2
  623. vshr.u64 q11, q4, #2
  624. veor q10, q10, q7
  625. veor q11, q11, q6
  626. vand q10, q10, q9
  627. vand q11, q11, q9
  628. veor q7, q7, q10
  629. vshl.u64 q10, q10, #2
  630. veor q6, q6, q11
  631. vshl.u64 q11, q11, #2
  632. veor q5, q5, q10
  633. veor q4, q4, q11
  634. vshr.u64 q10, q1, #2
  635. vshr.u64 q11, q0, #2
  636. veor q10, q10, q3
  637. veor q11, q11, q2
  638. vand q10, q10, q9
  639. vand q11, q11, q9
  640. veor q3, q3, q10
  641. vshl.u64 q10, q10, #2
  642. veor q2, q2, q11
  643. vshl.u64 q11, q11, #2
  644. veor q1, q1, q10
  645. veor q0, q0, q11
  646. vshr.u64 q10, q3, #4
  647. vshr.u64 q11, q2, #4
  648. veor q10, q10, q7
  649. veor q11, q11, q6
  650. vand q10, q10, q8
  651. vand q11, q11, q8
  652. veor q7, q7, q10
  653. vshl.u64 q10, q10, #4
  654. veor q6, q6, q11
  655. vshl.u64 q11, q11, #4
  656. veor q3, q3, q10
  657. veor q2, q2, q11
  658. vshr.u64 q10, q1, #4
  659. vshr.u64 q11, q0, #4
  660. veor q10, q10, q5
  661. veor q11, q11, q4
  662. vand q10, q10, q8
  663. vand q11, q11, q8
  664. veor q5, q5, q10
  665. vshl.u64 q10, q10, #4
  666. veor q4, q4, q11
  667. vshl.u64 q11, q11, #4
  668. veor q1, q1, q10
  669. veor q0, q0, q11
  670. sub r5,r5,#1
  671. b Lenc_sbox
  672. .align 4
  673. Lenc_loop:
  674. vldmia r4!, {q8,q9,q10,q11}
  675. veor q8, q8, q0
  676. veor q9, q9, q1
  677. vtbl.8 d0, {q8}, d24
  678. vtbl.8 d1, {q8}, d25
  679. vldmia r4!, {q8}
  680. veor q10, q10, q2
  681. vtbl.8 d2, {q9}, d24
  682. vtbl.8 d3, {q9}, d25
  683. vldmia r4!, {q9}
  684. veor q11, q11, q3
  685. vtbl.8 d4, {q10}, d24
  686. vtbl.8 d5, {q10}, d25
  687. vldmia r4!, {q10}
  688. vtbl.8 d6, {q11}, d24
  689. vtbl.8 d7, {q11}, d25
  690. vldmia r4!, {q11}
  691. veor q8, q8, q4
  692. veor q9, q9, q5
  693. vtbl.8 d8, {q8}, d24
  694. vtbl.8 d9, {q8}, d25
  695. veor q10, q10, q6
  696. vtbl.8 d10, {q9}, d24
  697. vtbl.8 d11, {q9}, d25
  698. veor q11, q11, q7
  699. vtbl.8 d12, {q10}, d24
  700. vtbl.8 d13, {q10}, d25
  701. vtbl.8 d14, {q11}, d24
  702. vtbl.8 d15, {q11}, d25
  703. Lenc_sbox:
  704. veor q2, q2, q1
  705. veor q5, q5, q6
  706. veor q3, q3, q0
  707. veor q6, q6, q2
  708. veor q5, q5, q0
  709. veor q6, q6, q3
  710. veor q3, q3, q7
  711. veor q7, q7, q5
  712. veor q3, q3, q4
  713. veor q4, q4, q5
  714. veor q2, q2, q7
  715. veor q3, q3, q1
  716. veor q1, q1, q5
  717. veor q11, q7, q4
  718. veor q10, q1, q2
  719. veor q9, q5, q3
  720. veor q13, q2, q4
  721. vmov q8, q10
  722. veor q12, q6, q0
  723. vorr q10, q10, q9
  724. veor q15, q11, q8
  725. vand q14, q11, q12
  726. vorr q11, q11, q12
  727. veor q12, q12, q9
  728. vand q8, q8, q9
  729. veor q9, q3, q0
  730. vand q15, q15, q12
  731. vand q13, q13, q9
  732. veor q9, q7, q1
  733. veor q12, q5, q6
  734. veor q11, q11, q13
  735. veor q10, q10, q13
  736. vand q13, q9, q12
  737. vorr q9, q9, q12
  738. veor q11, q11, q15
  739. veor q8, q8, q13
  740. veor q10, q10, q14
  741. veor q9, q9, q15
  742. veor q8, q8, q14
  743. vand q12, q2, q3
  744. veor q9, q9, q14
  745. vand q13, q4, q0
  746. vand q14, q1, q5
  747. vorr q15, q7, q6
  748. veor q11, q11, q12
  749. veor q9, q9, q14
  750. veor q8, q8, q15
  751. veor q10, q10, q13
  752. @ Inv_GF16 0, 1, 2, 3, s0, s1, s2, s3
  753. @ new smaller inversion
  754. vand q14, q11, q9
  755. vmov q12, q8
  756. veor q13, q10, q14
  757. veor q15, q8, q14
  758. veor q14, q8, q14 @ q14=q15
  759. vbsl q13, q9, q8
  760. vbsl q15, q11, q10
  761. veor q11, q11, q10
  762. vbsl q12, q13, q14
  763. vbsl q8, q14, q13
  764. vand q14, q12, q15
  765. veor q9, q9, q8
  766. veor q14, q14, q11
  767. veor q12, q6, q0
  768. veor q8, q5, q3
  769. veor q10, q15, q14
  770. vand q10, q10, q6
  771. veor q6, q6, q5
  772. vand q11, q5, q15
  773. vand q6, q6, q14
  774. veor q5, q11, q10
  775. veor q6, q6, q11
  776. veor q15, q15, q13
  777. veor q14, q14, q9
  778. veor q11, q15, q14
  779. veor q10, q13, q9
  780. vand q11, q11, q12
  781. vand q10, q10, q0
  782. veor q12, q12, q8
  783. veor q0, q0, q3
  784. vand q8, q8, q15
  785. vand q3, q3, q13
  786. vand q12, q12, q14
  787. vand q0, q0, q9
  788. veor q8, q8, q12
  789. veor q0, q0, q3
  790. veor q12, q12, q11
  791. veor q3, q3, q10
  792. veor q6, q6, q12
  793. veor q0, q0, q12
  794. veor q5, q5, q8
  795. veor q3, q3, q8
  796. veor q12, q7, q4
  797. veor q8, q1, q2
  798. veor q11, q15, q14
  799. veor q10, q13, q9
  800. vand q11, q11, q12
  801. vand q10, q10, q4
  802. veor q12, q12, q8
  803. veor q4, q4, q2
  804. vand q8, q8, q15
  805. vand q2, q2, q13
  806. vand q12, q12, q14
  807. vand q4, q4, q9
  808. veor q8, q8, q12
  809. veor q4, q4, q2
  810. veor q12, q12, q11
  811. veor q2, q2, q10
  812. veor q15, q15, q13
  813. veor q14, q14, q9
  814. veor q10, q15, q14
  815. vand q10, q10, q7
  816. veor q7, q7, q1
  817. vand q11, q1, q15
  818. vand q7, q7, q14
  819. veor q1, q11, q10
  820. veor q7, q7, q11
  821. veor q7, q7, q12
  822. veor q4, q4, q12
  823. veor q1, q1, q8
  824. veor q2, q2, q8
  825. veor q7, q7, q0
  826. veor q1, q1, q6
  827. veor q6, q6, q0
  828. veor q4, q4, q7
  829. veor q0, q0, q1
  830. veor q1, q1, q5
  831. veor q5, q5, q2
  832. veor q2, q2, q3
  833. veor q3, q3, q5
  834. veor q4, q4, q5
  835. veor q6, q6, q3
  836. subs r5,r5,#1
  837. bcc Lenc_done
  838. vext.8 q8, q0, q0, #12 @ x0 <<< 32
  839. vext.8 q9, q1, q1, #12
  840. veor q0, q0, q8 @ x0 ^ (x0 <<< 32)
  841. vext.8 q10, q4, q4, #12
  842. veor q1, q1, q9
  843. vext.8 q11, q6, q6, #12
  844. veor q4, q4, q10
  845. vext.8 q12, q3, q3, #12
  846. veor q6, q6, q11
  847. vext.8 q13, q7, q7, #12
  848. veor q3, q3, q12
  849. vext.8 q14, q2, q2, #12
  850. veor q7, q7, q13
  851. vext.8 q15, q5, q5, #12
  852. veor q2, q2, q14
  853. veor q9, q9, q0
  854. veor q5, q5, q15
  855. vext.8 q0, q0, q0, #8 @ (x0 ^ (x0 <<< 32)) <<< 64)
  856. veor q10, q10, q1
  857. veor q8, q8, q5
  858. veor q9, q9, q5
  859. vext.8 q1, q1, q1, #8
  860. veor q13, q13, q3
  861. veor q0, q0, q8
  862. veor q14, q14, q7
  863. veor q1, q1, q9
  864. vext.8 q8, q3, q3, #8
  865. veor q12, q12, q6
  866. vext.8 q9, q7, q7, #8
  867. veor q15, q15, q2
  868. vext.8 q3, q6, q6, #8
  869. veor q11, q11, q4
  870. vext.8 q7, q5, q5, #8
  871. veor q12, q12, q5
  872. vext.8 q6, q2, q2, #8
  873. veor q11, q11, q5
  874. vext.8 q2, q4, q4, #8
  875. veor q5, q9, q13
  876. veor q4, q8, q12
  877. veor q3, q3, q11
  878. veor q7, q7, q15
  879. veor q6, q6, q14
  880. @ vmov q4, q8
  881. veor q2, q2, q10
  882. @ vmov q5, q9
  883. vldmia r6, {q12} @ LSR
  884. ite eq @ Thumb2 thing, samity check in ARM
  885. addeq r6,r6,#0x10
  886. bne Lenc_loop
  887. vldmia r6, {q12} @ LSRM0
  888. b Lenc_loop
  889. .align 4
  890. Lenc_done:
  891. vmov.i8 q8,#0x55 @ compose LBS0
  892. vmov.i8 q9,#0x33 @ compose LBS1
  893. vshr.u64 q10, q2, #1
  894. vshr.u64 q11, q3, #1
  895. veor q10, q10, q5
  896. veor q11, q11, q7
  897. vand q10, q10, q8
  898. vand q11, q11, q8
  899. veor q5, q5, q10
  900. vshl.u64 q10, q10, #1
  901. veor q7, q7, q11
  902. vshl.u64 q11, q11, #1
  903. veor q2, q2, q10
  904. veor q3, q3, q11
  905. vshr.u64 q10, q4, #1
  906. vshr.u64 q11, q0, #1
  907. veor q10, q10, q6
  908. veor q11, q11, q1
  909. vand q10, q10, q8
  910. vand q11, q11, q8
  911. veor q6, q6, q10
  912. vshl.u64 q10, q10, #1
  913. veor q1, q1, q11
  914. vshl.u64 q11, q11, #1
  915. veor q4, q4, q10
  916. veor q0, q0, q11
  917. vmov.i8 q8,#0x0f @ compose LBS2
  918. vshr.u64 q10, q7, #2
  919. vshr.u64 q11, q3, #2
  920. veor q10, q10, q5
  921. veor q11, q11, q2
  922. vand q10, q10, q9
  923. vand q11, q11, q9
  924. veor q5, q5, q10
  925. vshl.u64 q10, q10, #2
  926. veor q2, q2, q11
  927. vshl.u64 q11, q11, #2
  928. veor q7, q7, q10
  929. veor q3, q3, q11
  930. vshr.u64 q10, q1, #2
  931. vshr.u64 q11, q0, #2
  932. veor q10, q10, q6
  933. veor q11, q11, q4
  934. vand q10, q10, q9
  935. vand q11, q11, q9
  936. veor q6, q6, q10
  937. vshl.u64 q10, q10, #2
  938. veor q4, q4, q11
  939. vshl.u64 q11, q11, #2
  940. veor q1, q1, q10
  941. veor q0, q0, q11
  942. vshr.u64 q10, q6, #4
  943. vshr.u64 q11, q4, #4
  944. veor q10, q10, q5
  945. veor q11, q11, q2
  946. vand q10, q10, q8
  947. vand q11, q11, q8
  948. veor q5, q5, q10
  949. vshl.u64 q10, q10, #4
  950. veor q2, q2, q11
  951. vshl.u64 q11, q11, #4
  952. veor q6, q6, q10
  953. veor q4, q4, q11
  954. vshr.u64 q10, q1, #4
  955. vshr.u64 q11, q0, #4
  956. veor q10, q10, q7
  957. veor q11, q11, q3
  958. vand q10, q10, q8
  959. vand q11, q11, q8
  960. veor q7, q7, q10
  961. vshl.u64 q10, q10, #4
  962. veor q3, q3, q11
  963. vshl.u64 q11, q11, #4
  964. veor q1, q1, q10
  965. veor q0, q0, q11
  966. vldmia r4, {q8} @ last round key
  967. veor q4, q4, q8
  968. veor q6, q6, q8
  969. veor q3, q3, q8
  970. veor q7, q7, q8
  971. veor q2, q2, q8
  972. veor q5, q5, q8
  973. veor q0, q0, q8
  974. veor q1, q1, q8
  975. bx lr
  976. #ifdef __thumb2__
  977. .thumb_func _bsaes_key_convert
  978. #endif
  979. .align 4
  980. _bsaes_key_convert:
  981. adr r6,.
  982. vld1.8 {q7}, [r4]! @ load round 0 key
  983. #if defined(__thumb2__) || defined(__APPLE__)
  984. adr r6,LM0
  985. #else
  986. sub r6,r6,#_bsaes_key_convert-LM0
  987. #endif
  988. vld1.8 {q15}, [r4]! @ load round 1 key
  989. vmov.i8 q8, #0x01 @ bit masks
  990. vmov.i8 q9, #0x02
  991. vmov.i8 q10, #0x04
  992. vmov.i8 q11, #0x08
  993. vmov.i8 q12, #0x10
  994. vmov.i8 q13, #0x20
  995. vldmia r6, {q14} @ LM0
  996. #ifdef __ARMEL__
  997. vrev32.8 q7, q7
  998. vrev32.8 q15, q15
  999. #endif
  1000. sub r5,r5,#1
  1001. vstmia r12!, {q7} @ save round 0 key
  1002. b Lkey_loop
  1003. .align 4
  1004. Lkey_loop:
  1005. vtbl.8 d14,{q15},d28
  1006. vtbl.8 d15,{q15},d29
  1007. vmov.i8 q6, #0x40
  1008. vmov.i8 q15, #0x80
  1009. vtst.8 q0, q7, q8
  1010. vtst.8 q1, q7, q9
  1011. vtst.8 q2, q7, q10
  1012. vtst.8 q3, q7, q11
  1013. vtst.8 q4, q7, q12
  1014. vtst.8 q5, q7, q13
  1015. vtst.8 q6, q7, q6
  1016. vtst.8 q7, q7, q15
  1017. vld1.8 {q15}, [r4]! @ load next round key
  1018. vmvn q0, q0 @ "pnot"
  1019. vmvn q1, q1
  1020. vmvn q5, q5
  1021. vmvn q6, q6
  1022. #ifdef __ARMEL__
  1023. vrev32.8 q15, q15
  1024. #endif
  1025. subs r5,r5,#1
  1026. vstmia r12!,{q0,q1,q2,q3,q4,q5,q6,q7} @ write bit-sliced round key
  1027. bne Lkey_loop
  1028. vmov.i8 q7,#0x63 @ compose L63
  1029. @ don't save last round key
  1030. bx lr
  1031. .globl _bsaes_cbc_encrypt
  1032. .private_extern _bsaes_cbc_encrypt
  1033. #ifdef __thumb2__
  1034. .thumb_func _bsaes_cbc_encrypt
  1035. #endif
  1036. .align 5
  1037. _bsaes_cbc_encrypt:
  1038. @ In OpenSSL, this function had a fallback to aes_nohw_cbc_encrypt for
  1039. @ short inputs. We patch this out, using bsaes for all input sizes.
  1040. @ it is up to the caller to make sure we are called with enc == 0
  1041. mov ip, sp
  1042. stmdb sp!, {r4,r5,r6,r7,r8,r9,r10, lr}
  1043. VFP_ABI_PUSH
  1044. ldr r8, [ip] @ IV is 1st arg on the stack
  1045. mov r2, r2, lsr#4 @ len in 16 byte blocks
  1046. sub sp, #0x10 @ scratch space to carry over the IV
  1047. mov r9, sp @ save sp
  1048. ldr r10, [r3, #240] @ get # of rounds
  1049. #ifndef BSAES_ASM_EXTENDED_KEY
  1050. @ allocate the key schedule on the stack
  1051. sub r12, sp, r10, lsl#7 @ 128 bytes per inner round key
  1052. add r12, #96 @ sifze of bit-slices key schedule
  1053. @ populate the key schedule
  1054. mov r4, r3 @ pass key
  1055. mov r5, r10 @ pass # of rounds
  1056. mov sp, r12 @ sp is sp
  1057. bl _bsaes_key_convert
  1058. vldmia sp, {q6}
  1059. vstmia r12, {q15} @ save last round key
  1060. veor q7, q7, q6 @ fix up round 0 key
  1061. vstmia sp, {q7}
  1062. #else
  1063. ldr r12, [r3, #244]
  1064. eors r12, #1
  1065. beq 0f
  1066. @ populate the key schedule
  1067. str r12, [r3, #244]
  1068. mov r4, r3 @ pass key
  1069. mov r5, r10 @ pass # of rounds
  1070. add r12, r3, #248 @ pass key schedule
  1071. bl _bsaes_key_convert
  1072. add r4, r3, #248
  1073. vldmia r4, {q6}
  1074. vstmia r12, {q15} @ save last round key
  1075. veor q7, q7, q6 @ fix up round 0 key
  1076. vstmia r4, {q7}
  1077. .align 2
  1078. #endif
  1079. vld1.8 {q15}, [r8] @ load IV
  1080. b Lcbc_dec_loop
  1081. .align 4
  1082. Lcbc_dec_loop:
  1083. subs r2, r2, #0x8
  1084. bmi Lcbc_dec_loop_finish
  1085. vld1.8 {q0,q1}, [r0]! @ load input
  1086. vld1.8 {q2,q3}, [r0]!
  1087. #ifndef BSAES_ASM_EXTENDED_KEY
  1088. mov r4, sp @ pass the key
  1089. #else
  1090. add r4, r3, #248
  1091. #endif
  1092. vld1.8 {q4,q5}, [r0]!
  1093. mov r5, r10
  1094. vld1.8 {q6,q7}, [r0]
  1095. sub r0, r0, #0x60
  1096. vstmia r9, {q15} @ put aside IV
  1097. bl _bsaes_decrypt8
  1098. vldmia r9, {q14} @ reload IV
  1099. vld1.8 {q8,q9}, [r0]! @ reload input
  1100. veor q0, q0, q14 @ ^= IV
  1101. vld1.8 {q10,q11}, [r0]!
  1102. veor q1, q1, q8
  1103. veor q6, q6, q9
  1104. vld1.8 {q12,q13}, [r0]!
  1105. veor q4, q4, q10
  1106. veor q2, q2, q11
  1107. vld1.8 {q14,q15}, [r0]!
  1108. veor q7, q7, q12
  1109. vst1.8 {q0,q1}, [r1]! @ write output
  1110. veor q3, q3, q13
  1111. vst1.8 {q6}, [r1]!
  1112. veor q5, q5, q14
  1113. vst1.8 {q4}, [r1]!
  1114. vst1.8 {q2}, [r1]!
  1115. vst1.8 {q7}, [r1]!
  1116. vst1.8 {q3}, [r1]!
  1117. vst1.8 {q5}, [r1]!
  1118. b Lcbc_dec_loop
  1119. Lcbc_dec_loop_finish:
  1120. adds r2, r2, #8
  1121. beq Lcbc_dec_done
  1122. @ Set up most parameters for the _bsaes_decrypt8 call.
  1123. #ifndef BSAES_ASM_EXTENDED_KEY
  1124. mov r4, sp @ pass the key
  1125. #else
  1126. add r4, r3, #248
  1127. #endif
  1128. mov r5, r10
  1129. vstmia r9, {q15} @ put aside IV
  1130. vld1.8 {q0}, [r0]! @ load input
  1131. cmp r2, #2
  1132. blo Lcbc_dec_one
  1133. vld1.8 {q1}, [r0]!
  1134. beq Lcbc_dec_two
  1135. vld1.8 {q2}, [r0]!
  1136. cmp r2, #4
  1137. blo Lcbc_dec_three
  1138. vld1.8 {q3}, [r0]!
  1139. beq Lcbc_dec_four
  1140. vld1.8 {q4}, [r0]!
  1141. cmp r2, #6
  1142. blo Lcbc_dec_five
  1143. vld1.8 {q5}, [r0]!
  1144. beq Lcbc_dec_six
  1145. vld1.8 {q6}, [r0]!
  1146. sub r0, r0, #0x70
  1147. bl _bsaes_decrypt8
  1148. vldmia r9, {q14} @ reload IV
  1149. vld1.8 {q8,q9}, [r0]! @ reload input
  1150. veor q0, q0, q14 @ ^= IV
  1151. vld1.8 {q10,q11}, [r0]!
  1152. veor q1, q1, q8
  1153. veor q6, q6, q9
  1154. vld1.8 {q12,q13}, [r0]!
  1155. veor q4, q4, q10
  1156. veor q2, q2, q11
  1157. vld1.8 {q15}, [r0]!
  1158. veor q7, q7, q12
  1159. vst1.8 {q0,q1}, [r1]! @ write output
  1160. veor q3, q3, q13
  1161. vst1.8 {q6}, [r1]!
  1162. vst1.8 {q4}, [r1]!
  1163. vst1.8 {q2}, [r1]!
  1164. vst1.8 {q7}, [r1]!
  1165. vst1.8 {q3}, [r1]!
  1166. b Lcbc_dec_done
  1167. .align 4
  1168. Lcbc_dec_six:
  1169. sub r0, r0, #0x60
  1170. bl _bsaes_decrypt8
  1171. vldmia r9,{q14} @ reload IV
  1172. vld1.8 {q8,q9}, [r0]! @ reload input
  1173. veor q0, q0, q14 @ ^= IV
  1174. vld1.8 {q10,q11}, [r0]!
  1175. veor q1, q1, q8
  1176. veor q6, q6, q9
  1177. vld1.8 {q12}, [r0]!
  1178. veor q4, q4, q10
  1179. veor q2, q2, q11
  1180. vld1.8 {q15}, [r0]!
  1181. veor q7, q7, q12
  1182. vst1.8 {q0,q1}, [r1]! @ write output
  1183. vst1.8 {q6}, [r1]!
  1184. vst1.8 {q4}, [r1]!
  1185. vst1.8 {q2}, [r1]!
  1186. vst1.8 {q7}, [r1]!
  1187. b Lcbc_dec_done
  1188. .align 4
  1189. Lcbc_dec_five:
  1190. sub r0, r0, #0x50
  1191. bl _bsaes_decrypt8
  1192. vldmia r9, {q14} @ reload IV
  1193. vld1.8 {q8,q9}, [r0]! @ reload input
  1194. veor q0, q0, q14 @ ^= IV
  1195. vld1.8 {q10,q11}, [r0]!
  1196. veor q1, q1, q8
  1197. veor q6, q6, q9
  1198. vld1.8 {q15}, [r0]!
  1199. veor q4, q4, q10
  1200. vst1.8 {q0,q1}, [r1]! @ write output
  1201. veor q2, q2, q11
  1202. vst1.8 {q6}, [r1]!
  1203. vst1.8 {q4}, [r1]!
  1204. vst1.8 {q2}, [r1]!
  1205. b Lcbc_dec_done
  1206. .align 4
  1207. Lcbc_dec_four:
  1208. sub r0, r0, #0x40
  1209. bl _bsaes_decrypt8
  1210. vldmia r9, {q14} @ reload IV
  1211. vld1.8 {q8,q9}, [r0]! @ reload input
  1212. veor q0, q0, q14 @ ^= IV
  1213. vld1.8 {q10}, [r0]!
  1214. veor q1, q1, q8
  1215. veor q6, q6, q9
  1216. vld1.8 {q15}, [r0]!
  1217. veor q4, q4, q10
  1218. vst1.8 {q0,q1}, [r1]! @ write output
  1219. vst1.8 {q6}, [r1]!
  1220. vst1.8 {q4}, [r1]!
  1221. b Lcbc_dec_done
  1222. .align 4
  1223. Lcbc_dec_three:
  1224. sub r0, r0, #0x30
  1225. bl _bsaes_decrypt8
  1226. vldmia r9, {q14} @ reload IV
  1227. vld1.8 {q8,q9}, [r0]! @ reload input
  1228. veor q0, q0, q14 @ ^= IV
  1229. vld1.8 {q15}, [r0]!
  1230. veor q1, q1, q8
  1231. veor q6, q6, q9
  1232. vst1.8 {q0,q1}, [r1]! @ write output
  1233. vst1.8 {q6}, [r1]!
  1234. b Lcbc_dec_done
  1235. .align 4
  1236. Lcbc_dec_two:
  1237. sub r0, r0, #0x20
  1238. bl _bsaes_decrypt8
  1239. vldmia r9, {q14} @ reload IV
  1240. vld1.8 {q8}, [r0]! @ reload input
  1241. veor q0, q0, q14 @ ^= IV
  1242. vld1.8 {q15}, [r0]! @ reload input
  1243. veor q1, q1, q8
  1244. vst1.8 {q0,q1}, [r1]! @ write output
  1245. b Lcbc_dec_done
  1246. .align 4
  1247. Lcbc_dec_one:
  1248. sub r0, r0, #0x10
  1249. bl _bsaes_decrypt8
  1250. vldmia r9, {q14} @ reload IV
  1251. vld1.8 {q15}, [r0]! @ reload input
  1252. veor q0, q0, q14 @ ^= IV
  1253. vst1.8 {q0}, [r1]! @ write output
  1254. Lcbc_dec_done:
  1255. #ifndef BSAES_ASM_EXTENDED_KEY
  1256. vmov.i32 q0, #0
  1257. vmov.i32 q1, #0
  1258. Lcbc_dec_bzero:@ wipe key schedule [if any]
  1259. vstmia sp!, {q0,q1}
  1260. cmp sp, r9
  1261. bne Lcbc_dec_bzero
  1262. #endif
  1263. mov sp, r9
  1264. add sp, #0x10 @ add sp,r9,#0x10 is no good for thumb
  1265. vst1.8 {q15}, [r8] @ return IV
  1266. VFP_ABI_POP
  1267. ldmia sp!, {r4,r5,r6,r7,r8,r9,r10, pc}
  1268. .globl _bsaes_ctr32_encrypt_blocks
  1269. .private_extern _bsaes_ctr32_encrypt_blocks
  1270. #ifdef __thumb2__
  1271. .thumb_func _bsaes_ctr32_encrypt_blocks
  1272. #endif
  1273. .align 5
  1274. _bsaes_ctr32_encrypt_blocks:
  1275. @ In OpenSSL, short inputs fall back to aes_nohw_* here. We patch this
  1276. @ out to retain a constant-time implementation.
  1277. mov ip, sp
  1278. stmdb sp!, {r4,r5,r6,r7,r8,r9,r10, lr}
  1279. VFP_ABI_PUSH
  1280. ldr r8, [ip] @ ctr is 1st arg on the stack
  1281. sub sp, sp, #0x10 @ scratch space to carry over the ctr
  1282. mov r9, sp @ save sp
  1283. ldr r10, [r3, #240] @ get # of rounds
  1284. #ifndef BSAES_ASM_EXTENDED_KEY
  1285. @ allocate the key schedule on the stack
  1286. sub r12, sp, r10, lsl#7 @ 128 bytes per inner round key
  1287. add r12, #96 @ size of bit-sliced key schedule
  1288. @ populate the key schedule
  1289. mov r4, r3 @ pass key
  1290. mov r5, r10 @ pass # of rounds
  1291. mov sp, r12 @ sp is sp
  1292. bl _bsaes_key_convert
  1293. veor q7,q7,q15 @ fix up last round key
  1294. vstmia r12, {q7} @ save last round key
  1295. vld1.8 {q0}, [r8] @ load counter
  1296. #ifdef __APPLE__
  1297. mov r8, #:lower16:(LREVM0SR-LM0)
  1298. add r8, r6, r8
  1299. #else
  1300. add r8, r6, #LREVM0SR-LM0 @ borrow r8
  1301. #endif
  1302. vldmia sp, {q4} @ load round0 key
  1303. #else
  1304. ldr r12, [r3, #244]
  1305. eors r12, #1
  1306. beq 0f
  1307. @ populate the key schedule
  1308. str r12, [r3, #244]
  1309. mov r4, r3 @ pass key
  1310. mov r5, r10 @ pass # of rounds
  1311. add r12, r3, #248 @ pass key schedule
  1312. bl _bsaes_key_convert
  1313. veor q7,q7,q15 @ fix up last round key
  1314. vstmia r12, {q7} @ save last round key
  1315. .align 2
  1316. add r12, r3, #248
  1317. vld1.8 {q0}, [r8] @ load counter
  1318. adrl r8, LREVM0SR @ borrow r8
  1319. vldmia r12, {q4} @ load round0 key
  1320. sub sp, #0x10 @ place for adjusted round0 key
  1321. #endif
  1322. vmov.i32 q8,#1 @ compose 1<<96
  1323. veor q9,q9,q9
  1324. vrev32.8 q0,q0
  1325. vext.8 q8,q9,q8,#4
  1326. vrev32.8 q4,q4
  1327. vadd.u32 q9,q8,q8 @ compose 2<<96
  1328. vstmia sp, {q4} @ save adjusted round0 key
  1329. b Lctr_enc_loop
  1330. .align 4
  1331. Lctr_enc_loop:
  1332. vadd.u32 q10, q8, q9 @ compose 3<<96
  1333. vadd.u32 q1, q0, q8 @ +1
  1334. vadd.u32 q2, q0, q9 @ +2
  1335. vadd.u32 q3, q0, q10 @ +3
  1336. vadd.u32 q4, q1, q10
  1337. vadd.u32 q5, q2, q10
  1338. vadd.u32 q6, q3, q10
  1339. vadd.u32 q7, q4, q10
  1340. vadd.u32 q10, q5, q10 @ next counter
  1341. @ Borrow prologue from _bsaes_encrypt8 to use the opportunity
  1342. @ to flip byte order in 32-bit counter
  1343. vldmia sp, {q9} @ load round0 key
  1344. #ifndef BSAES_ASM_EXTENDED_KEY
  1345. add r4, sp, #0x10 @ pass next round key
  1346. #else
  1347. add r4, r3, #264
  1348. #endif
  1349. vldmia r8, {q8} @ LREVM0SR
  1350. mov r5, r10 @ pass rounds
  1351. vstmia r9, {q10} @ save next counter
  1352. #ifdef __APPLE__
  1353. mov r6, #:lower16:(LREVM0SR-LSR)
  1354. sub r6, r8, r6
  1355. #else
  1356. sub r6, r8, #LREVM0SR-LSR @ pass constants
  1357. #endif
  1358. bl _bsaes_encrypt8_alt
  1359. subs r2, r2, #8
  1360. blo Lctr_enc_loop_done
  1361. vld1.8 {q8,q9}, [r0]! @ load input
  1362. vld1.8 {q10,q11}, [r0]!
  1363. veor q0, q8
  1364. veor q1, q9
  1365. vld1.8 {q12,q13}, [r0]!
  1366. veor q4, q10
  1367. veor q6, q11
  1368. vld1.8 {q14,q15}, [r0]!
  1369. veor q3, q12
  1370. vst1.8 {q0,q1}, [r1]! @ write output
  1371. veor q7, q13
  1372. veor q2, q14
  1373. vst1.8 {q4}, [r1]!
  1374. veor q5, q15
  1375. vst1.8 {q6}, [r1]!
  1376. vmov.i32 q8, #1 @ compose 1<<96
  1377. vst1.8 {q3}, [r1]!
  1378. veor q9, q9, q9
  1379. vst1.8 {q7}, [r1]!
  1380. vext.8 q8, q9, q8, #4
  1381. vst1.8 {q2}, [r1]!
  1382. vadd.u32 q9,q8,q8 @ compose 2<<96
  1383. vst1.8 {q5}, [r1]!
  1384. vldmia r9, {q0} @ load counter
  1385. bne Lctr_enc_loop
  1386. b Lctr_enc_done
  1387. .align 4
  1388. Lctr_enc_loop_done:
  1389. add r2, r2, #8
  1390. vld1.8 {q8}, [r0]! @ load input
  1391. veor q0, q8
  1392. vst1.8 {q0}, [r1]! @ write output
  1393. cmp r2, #2
  1394. blo Lctr_enc_done
  1395. vld1.8 {q9}, [r0]!
  1396. veor q1, q9
  1397. vst1.8 {q1}, [r1]!
  1398. beq Lctr_enc_done
  1399. vld1.8 {q10}, [r0]!
  1400. veor q4, q10
  1401. vst1.8 {q4}, [r1]!
  1402. cmp r2, #4
  1403. blo Lctr_enc_done
  1404. vld1.8 {q11}, [r0]!
  1405. veor q6, q11
  1406. vst1.8 {q6}, [r1]!
  1407. beq Lctr_enc_done
  1408. vld1.8 {q12}, [r0]!
  1409. veor q3, q12
  1410. vst1.8 {q3}, [r1]!
  1411. cmp r2, #6
  1412. blo Lctr_enc_done
  1413. vld1.8 {q13}, [r0]!
  1414. veor q7, q13
  1415. vst1.8 {q7}, [r1]!
  1416. beq Lctr_enc_done
  1417. vld1.8 {q14}, [r0]
  1418. veor q2, q14
  1419. vst1.8 {q2}, [r1]!
  1420. Lctr_enc_done:
  1421. vmov.i32 q0, #0
  1422. vmov.i32 q1, #0
  1423. #ifndef BSAES_ASM_EXTENDED_KEY
  1424. Lctr_enc_bzero:@ wipe key schedule [if any]
  1425. vstmia sp!, {q0,q1}
  1426. cmp sp, r9
  1427. bne Lctr_enc_bzero
  1428. #else
  1429. vstmia sp, {q0,q1}
  1430. #endif
  1431. mov sp, r9
  1432. add sp, #0x10 @ add sp,r9,#0x10 is no good for thumb
  1433. VFP_ABI_POP
  1434. ldmia sp!, {r4,r5,r6,r7,r8,r9,r10, pc} @ return
  1435. @ OpenSSL contains aes_nohw_* fallback code here. We patch this
  1436. @ out to retain a constant-time implementation.
  1437. #endif
  1438. #endif // !OPENSSL_NO_ASM