aesbs-core.S_shipped 52 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545
  1. @ ====================================================================
  2. @ Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
  3. @ project. The module is, however, dual licensed under OpenSSL and
  4. @ CRYPTOGAMS licenses depending on where you obtain it. For further
  5. @ details see http://www.openssl.org/~appro/cryptogams/.
  6. @
  7. @ Specific modes and adaptation for Linux kernel by Ard Biesheuvel
  8. @ <ard.biesheuvel@linaro.org>. Permission to use under GPL terms is
  9. @ granted.
  10. @ ====================================================================
  11. @ Bit-sliced AES for ARM NEON
  12. @
  13. @ February 2012.
  14. @
  15. @ This implementation is direct adaptation of bsaes-x86_64 module for
  16. @ ARM NEON. Except that this module is endian-neutral [in sense that
  17. @ it can be compiled for either endianness] by courtesy of vld1.8's
  18. @ neutrality. Initial version doesn't implement interface to OpenSSL,
  19. @ only low-level primitives and unsupported entry points, just enough
  20. @ to collect performance results, which for Cortex-A8 core are:
  21. @
  22. @ encrypt 19.5 cycles per byte processed with 128-bit key
  23. @ decrypt 22.1 cycles per byte processed with 128-bit key
  24. @ key conv. 440 cycles per 128-bit key/0.18 of 8x block
  25. @
  26. @ Snapdragon S4 encrypts byte in 17.6 cycles and decrypts in 19.7,
  27. @ which is [much] worse than anticipated (for further details see
  28. @ http://www.openssl.org/~appro/Snapdragon-S4.html).
  29. @
  30. @ Cortex-A15 manages in 14.2/16.1 cycles [when integer-only code
  31. @ manages in 20.0 cycles].
  32. @
  33. @ When comparing to x86_64 results keep in mind that NEON unit is
  34. @ [mostly] single-issue and thus can't [fully] benefit from
  35. @ instruction-level parallelism. And when comparing to aes-armv4
  36. @ results keep in mind key schedule conversion overhead (see
  37. @ bsaes-x86_64.pl for further details)...
  38. @
  39. @ <appro@openssl.org>
  40. @ April-August 2013
  41. @
  42. @ Add CBC, CTR and XTS subroutines, adapt for kernel use.
  43. @
  44. @ <ard.biesheuvel@linaro.org>
  45. #ifndef __KERNEL__
  46. # include "arm_arch.h"
  47. # define VFP_ABI_PUSH vstmdb sp!,{d8-d15}
  48. # define VFP_ABI_POP vldmia sp!,{d8-d15}
  49. # define VFP_ABI_FRAME 0x40
  50. #else
  51. # define VFP_ABI_PUSH
  52. # define VFP_ABI_POP
  53. # define VFP_ABI_FRAME 0
  54. # define BSAES_ASM_EXTENDED_KEY
  55. # define XTS_CHAIN_TWEAK
  56. # define __ARM_ARCH__ 7
  57. #endif
  58. #ifdef __thumb__
  59. # define adrl adr
  60. #endif
  61. #if __ARM_ARCH__>=7
  62. .text
  63. .syntax unified @ ARMv7-capable assembler is expected to handle this
  64. #ifdef __thumb2__
  65. .thumb
  66. #else
  67. .code 32
  68. #endif
  69. .fpu neon
  70. .type _bsaes_decrypt8,%function
  71. .align 4
  72. _bsaes_decrypt8:
  73. adr r6,_bsaes_decrypt8
  74. vldmia r4!, {q9} @ round 0 key
  75. add r6,r6,#.LM0ISR-_bsaes_decrypt8
  76. vldmia r6!, {q8} @ .LM0ISR
  77. veor q10, q0, q9 @ xor with round0 key
  78. veor q11, q1, q9
  79. vtbl.8 d0, {q10}, d16
  80. vtbl.8 d1, {q10}, d17
  81. veor q12, q2, q9
  82. vtbl.8 d2, {q11}, d16
  83. vtbl.8 d3, {q11}, d17
  84. veor q13, q3, q9
  85. vtbl.8 d4, {q12}, d16
  86. vtbl.8 d5, {q12}, d17
  87. veor q14, q4, q9
  88. vtbl.8 d6, {q13}, d16
  89. vtbl.8 d7, {q13}, d17
  90. veor q15, q5, q9
  91. vtbl.8 d8, {q14}, d16
  92. vtbl.8 d9, {q14}, d17
  93. veor q10, q6, q9
  94. vtbl.8 d10, {q15}, d16
  95. vtbl.8 d11, {q15}, d17
  96. veor q11, q7, q9
  97. vtbl.8 d12, {q10}, d16
  98. vtbl.8 d13, {q10}, d17
  99. vtbl.8 d14, {q11}, d16
  100. vtbl.8 d15, {q11}, d17
  101. vmov.i8 q8,#0x55 @ compose .LBS0
  102. vmov.i8 q9,#0x33 @ compose .LBS1
  103. vshr.u64 q10, q6, #1
  104. vshr.u64 q11, q4, #1
  105. veor q10, q10, q7
  106. veor q11, q11, q5
  107. vand q10, q10, q8
  108. vand q11, q11, q8
  109. veor q7, q7, q10
  110. vshl.u64 q10, q10, #1
  111. veor q5, q5, q11
  112. vshl.u64 q11, q11, #1
  113. veor q6, q6, q10
  114. veor q4, q4, q11
  115. vshr.u64 q10, q2, #1
  116. vshr.u64 q11, q0, #1
  117. veor q10, q10, q3
  118. veor q11, q11, q1
  119. vand q10, q10, q8
  120. vand q11, q11, q8
  121. veor q3, q3, q10
  122. vshl.u64 q10, q10, #1
  123. veor q1, q1, q11
  124. vshl.u64 q11, q11, #1
  125. veor q2, q2, q10
  126. veor q0, q0, q11
  127. vmov.i8 q8,#0x0f @ compose .LBS2
  128. vshr.u64 q10, q5, #2
  129. vshr.u64 q11, q4, #2
  130. veor q10, q10, q7
  131. veor q11, q11, q6
  132. vand q10, q10, q9
  133. vand q11, q11, q9
  134. veor q7, q7, q10
  135. vshl.u64 q10, q10, #2
  136. veor q6, q6, q11
  137. vshl.u64 q11, q11, #2
  138. veor q5, q5, q10
  139. veor q4, q4, q11
  140. vshr.u64 q10, q1, #2
  141. vshr.u64 q11, q0, #2
  142. veor q10, q10, q3
  143. veor q11, q11, q2
  144. vand q10, q10, q9
  145. vand q11, q11, q9
  146. veor q3, q3, q10
  147. vshl.u64 q10, q10, #2
  148. veor q2, q2, q11
  149. vshl.u64 q11, q11, #2
  150. veor q1, q1, q10
  151. veor q0, q0, q11
  152. vshr.u64 q10, q3, #4
  153. vshr.u64 q11, q2, #4
  154. veor q10, q10, q7
  155. veor q11, q11, q6
  156. vand q10, q10, q8
  157. vand q11, q11, q8
  158. veor q7, q7, q10
  159. vshl.u64 q10, q10, #4
  160. veor q6, q6, q11
  161. vshl.u64 q11, q11, #4
  162. veor q3, q3, q10
  163. veor q2, q2, q11
  164. vshr.u64 q10, q1, #4
  165. vshr.u64 q11, q0, #4
  166. veor q10, q10, q5
  167. veor q11, q11, q4
  168. vand q10, q10, q8
  169. vand q11, q11, q8
  170. veor q5, q5, q10
  171. vshl.u64 q10, q10, #4
  172. veor q4, q4, q11
  173. vshl.u64 q11, q11, #4
  174. veor q1, q1, q10
  175. veor q0, q0, q11
  176. sub r5,r5,#1
  177. b .Ldec_sbox
  178. .align 4
  179. .Ldec_loop:
  180. vldmia r4!, {q8-q11}
  181. veor q8, q8, q0
  182. veor q9, q9, q1
  183. vtbl.8 d0, {q8}, d24
  184. vtbl.8 d1, {q8}, d25
  185. vldmia r4!, {q8}
  186. veor q10, q10, q2
  187. vtbl.8 d2, {q9}, d24
  188. vtbl.8 d3, {q9}, d25
  189. vldmia r4!, {q9}
  190. veor q11, q11, q3
  191. vtbl.8 d4, {q10}, d24
  192. vtbl.8 d5, {q10}, d25
  193. vldmia r4!, {q10}
  194. vtbl.8 d6, {q11}, d24
  195. vtbl.8 d7, {q11}, d25
  196. vldmia r4!, {q11}
  197. veor q8, q8, q4
  198. veor q9, q9, q5
  199. vtbl.8 d8, {q8}, d24
  200. vtbl.8 d9, {q8}, d25
  201. veor q10, q10, q6
  202. vtbl.8 d10, {q9}, d24
  203. vtbl.8 d11, {q9}, d25
  204. veor q11, q11, q7
  205. vtbl.8 d12, {q10}, d24
  206. vtbl.8 d13, {q10}, d25
  207. vtbl.8 d14, {q11}, d24
  208. vtbl.8 d15, {q11}, d25
  209. .Ldec_sbox:
  210. veor q1, q1, q4
  211. veor q3, q3, q4
  212. veor q4, q4, q7
  213. veor q1, q1, q6
  214. veor q2, q2, q7
  215. veor q6, q6, q4
  216. veor q0, q0, q1
  217. veor q2, q2, q5
  218. veor q7, q7, q6
  219. veor q3, q3, q0
  220. veor q5, q5, q0
  221. veor q1, q1, q3
  222. veor q11, q3, q0
  223. veor q10, q7, q4
  224. veor q9, q1, q6
  225. veor q13, q4, q0
  226. vmov q8, q10
  227. veor q12, q5, q2
  228. vorr q10, q10, q9
  229. veor q15, q11, q8
  230. vand q14, q11, q12
  231. vorr q11, q11, q12
  232. veor q12, q12, q9
  233. vand q8, q8, q9
  234. veor q9, q6, q2
  235. vand q15, q15, q12
  236. vand q13, q13, q9
  237. veor q9, q3, q7
  238. veor q12, q1, q5
  239. veor q11, q11, q13
  240. veor q10, q10, q13
  241. vand q13, q9, q12
  242. vorr q9, q9, q12
  243. veor q11, q11, q15
  244. veor q8, q8, q13
  245. veor q10, q10, q14
  246. veor q9, q9, q15
  247. veor q8, q8, q14
  248. vand q12, q4, q6
  249. veor q9, q9, q14
  250. vand q13, q0, q2
  251. vand q14, q7, q1
  252. vorr q15, q3, q5
  253. veor q11, q11, q12
  254. veor q9, q9, q14
  255. veor q8, q8, q15
  256. veor q10, q10, q13
  257. @ Inv_GF16 0, 1, 2, 3, s0, s1, s2, s3
  258. @ new smaller inversion
  259. vand q14, q11, q9
  260. vmov q12, q8
  261. veor q13, q10, q14
  262. veor q15, q8, q14
  263. veor q14, q8, q14 @ q14=q15
  264. vbsl q13, q9, q8
  265. vbsl q15, q11, q10
  266. veor q11, q11, q10
  267. vbsl q12, q13, q14
  268. vbsl q8, q14, q13
  269. vand q14, q12, q15
  270. veor q9, q9, q8
  271. veor q14, q14, q11
  272. veor q12, q5, q2
  273. veor q8, q1, q6
  274. veor q10, q15, q14
  275. vand q10, q10, q5
  276. veor q5, q5, q1
  277. vand q11, q1, q15
  278. vand q5, q5, q14
  279. veor q1, q11, q10
  280. veor q5, q5, q11
  281. veor q15, q15, q13
  282. veor q14, q14, q9
  283. veor q11, q15, q14
  284. veor q10, q13, q9
  285. vand q11, q11, q12
  286. vand q10, q10, q2
  287. veor q12, q12, q8
  288. veor q2, q2, q6
  289. vand q8, q8, q15
  290. vand q6, q6, q13
  291. vand q12, q12, q14
  292. vand q2, q2, q9
  293. veor q8, q8, q12
  294. veor q2, q2, q6
  295. veor q12, q12, q11
  296. veor q6, q6, q10
  297. veor q5, q5, q12
  298. veor q2, q2, q12
  299. veor q1, q1, q8
  300. veor q6, q6, q8
  301. veor q12, q3, q0
  302. veor q8, q7, q4
  303. veor q11, q15, q14
  304. veor q10, q13, q9
  305. vand q11, q11, q12
  306. vand q10, q10, q0
  307. veor q12, q12, q8
  308. veor q0, q0, q4
  309. vand q8, q8, q15
  310. vand q4, q4, q13
  311. vand q12, q12, q14
  312. vand q0, q0, q9
  313. veor q8, q8, q12
  314. veor q0, q0, q4
  315. veor q12, q12, q11
  316. veor q4, q4, q10
  317. veor q15, q15, q13
  318. veor q14, q14, q9
  319. veor q10, q15, q14
  320. vand q10, q10, q3
  321. veor q3, q3, q7
  322. vand q11, q7, q15
  323. vand q3, q3, q14
  324. veor q7, q11, q10
  325. veor q3, q3, q11
  326. veor q3, q3, q12
  327. veor q0, q0, q12
  328. veor q7, q7, q8
  329. veor q4, q4, q8
  330. veor q1, q1, q7
  331. veor q6, q6, q5
  332. veor q4, q4, q1
  333. veor q2, q2, q7
  334. veor q5, q5, q7
  335. veor q4, q4, q2
  336. veor q7, q7, q0
  337. veor q4, q4, q5
  338. veor q3, q3, q6
  339. veor q6, q6, q1
  340. veor q3, q3, q4
  341. veor q4, q4, q0
  342. veor q7, q7, q3
  343. subs r5,r5,#1
  344. bcc .Ldec_done
  345. @ multiplication by 0x05-0x00-0x04-0x00
  346. vext.8 q8, q0, q0, #8
  347. vext.8 q14, q3, q3, #8
  348. vext.8 q15, q5, q5, #8
  349. veor q8, q8, q0
  350. vext.8 q9, q1, q1, #8
  351. veor q14, q14, q3
  352. vext.8 q10, q6, q6, #8
  353. veor q15, q15, q5
  354. vext.8 q11, q4, q4, #8
  355. veor q9, q9, q1
  356. vext.8 q12, q2, q2, #8
  357. veor q10, q10, q6
  358. vext.8 q13, q7, q7, #8
  359. veor q11, q11, q4
  360. veor q12, q12, q2
  361. veor q13, q13, q7
  362. veor q0, q0, q14
  363. veor q1, q1, q14
  364. veor q6, q6, q8
  365. veor q2, q2, q10
  366. veor q4, q4, q9
  367. veor q1, q1, q15
  368. veor q6, q6, q15
  369. veor q2, q2, q14
  370. veor q7, q7, q11
  371. veor q4, q4, q14
  372. veor q3, q3, q12
  373. veor q2, q2, q15
  374. veor q7, q7, q15
  375. veor q5, q5, q13
  376. vext.8 q8, q0, q0, #12 @ x0 <<< 32
  377. vext.8 q9, q1, q1, #12
  378. veor q0, q0, q8 @ x0 ^ (x0 <<< 32)
  379. vext.8 q10, q6, q6, #12
  380. veor q1, q1, q9
  381. vext.8 q11, q4, q4, #12
  382. veor q6, q6, q10
  383. vext.8 q12, q2, q2, #12
  384. veor q4, q4, q11
  385. vext.8 q13, q7, q7, #12
  386. veor q2, q2, q12
  387. vext.8 q14, q3, q3, #12
  388. veor q7, q7, q13
  389. vext.8 q15, q5, q5, #12
  390. veor q3, q3, q14
  391. veor q9, q9, q0
  392. veor q5, q5, q15
  393. vext.8 q0, q0, q0, #8 @ (x0 ^ (x0 <<< 32)) <<< 64)
  394. veor q10, q10, q1
  395. veor q8, q8, q5
  396. veor q9, q9, q5
  397. vext.8 q1, q1, q1, #8
  398. veor q13, q13, q2
  399. veor q0, q0, q8
  400. veor q14, q14, q7
  401. veor q1, q1, q9
  402. vext.8 q8, q2, q2, #8
  403. veor q12, q12, q4
  404. vext.8 q9, q7, q7, #8
  405. veor q15, q15, q3
  406. vext.8 q2, q4, q4, #8
  407. veor q11, q11, q6
  408. vext.8 q7, q5, q5, #8
  409. veor q12, q12, q5
  410. vext.8 q4, q3, q3, #8
  411. veor q11, q11, q5
  412. vext.8 q3, q6, q6, #8
  413. veor q5, q9, q13
  414. veor q11, q11, q2
  415. veor q7, q7, q15
  416. veor q6, q4, q14
  417. veor q4, q8, q12
  418. veor q2, q3, q10
  419. vmov q3, q11
  420. @ vmov q5, q9
  421. vldmia r6, {q12} @ .LISR
  422. ite eq @ Thumb2 thing, sanity check in ARM
  423. addeq r6,r6,#0x10
  424. bne .Ldec_loop
  425. vldmia r6, {q12} @ .LISRM0
  426. b .Ldec_loop
  427. .align 4
  428. .Ldec_done:
  429. vmov.i8 q8,#0x55 @ compose .LBS0
  430. vmov.i8 q9,#0x33 @ compose .LBS1
  431. vshr.u64 q10, q3, #1
  432. vshr.u64 q11, q2, #1
  433. veor q10, q10, q5
  434. veor q11, q11, q7
  435. vand q10, q10, q8
  436. vand q11, q11, q8
  437. veor q5, q5, q10
  438. vshl.u64 q10, q10, #1
  439. veor q7, q7, q11
  440. vshl.u64 q11, q11, #1
  441. veor q3, q3, q10
  442. veor q2, q2, q11
  443. vshr.u64 q10, q6, #1
  444. vshr.u64 q11, q0, #1
  445. veor q10, q10, q4
  446. veor q11, q11, q1
  447. vand q10, q10, q8
  448. vand q11, q11, q8
  449. veor q4, q4, q10
  450. vshl.u64 q10, q10, #1
  451. veor q1, q1, q11
  452. vshl.u64 q11, q11, #1
  453. veor q6, q6, q10
  454. veor q0, q0, q11
  455. vmov.i8 q8,#0x0f @ compose .LBS2
  456. vshr.u64 q10, q7, #2
  457. vshr.u64 q11, q2, #2
  458. veor q10, q10, q5
  459. veor q11, q11, q3
  460. vand q10, q10, q9
  461. vand q11, q11, q9
  462. veor q5, q5, q10
  463. vshl.u64 q10, q10, #2
  464. veor q3, q3, q11
  465. vshl.u64 q11, q11, #2
  466. veor q7, q7, q10
  467. veor q2, q2, q11
  468. vshr.u64 q10, q1, #2
  469. vshr.u64 q11, q0, #2
  470. veor q10, q10, q4
  471. veor q11, q11, q6
  472. vand q10, q10, q9
  473. vand q11, q11, q9
  474. veor q4, q4, q10
  475. vshl.u64 q10, q10, #2
  476. veor q6, q6, q11
  477. vshl.u64 q11, q11, #2
  478. veor q1, q1, q10
  479. veor q0, q0, q11
  480. vshr.u64 q10, q4, #4
  481. vshr.u64 q11, q6, #4
  482. veor q10, q10, q5
  483. veor q11, q11, q3
  484. vand q10, q10, q8
  485. vand q11, q11, q8
  486. veor q5, q5, q10
  487. vshl.u64 q10, q10, #4
  488. veor q3, q3, q11
  489. vshl.u64 q11, q11, #4
  490. veor q4, q4, q10
  491. veor q6, q6, q11
  492. vshr.u64 q10, q1, #4
  493. vshr.u64 q11, q0, #4
  494. veor q10, q10, q7
  495. veor q11, q11, q2
  496. vand q10, q10, q8
  497. vand q11, q11, q8
  498. veor q7, q7, q10
  499. vshl.u64 q10, q10, #4
  500. veor q2, q2, q11
  501. vshl.u64 q11, q11, #4
  502. veor q1, q1, q10
  503. veor q0, q0, q11
  504. vldmia r4, {q8} @ last round key
  505. veor q6, q6, q8
  506. veor q4, q4, q8
  507. veor q2, q2, q8
  508. veor q7, q7, q8
  509. veor q3, q3, q8
  510. veor q5, q5, q8
  511. veor q0, q0, q8
  512. veor q1, q1, q8
  513. bx lr
  514. .size _bsaes_decrypt8,.-_bsaes_decrypt8
  515. .type _bsaes_const,%object
  516. .align 6
  517. _bsaes_const:
  518. .LM0ISR: @ InvShiftRows constants
  519. .quad 0x0a0e0206070b0f03, 0x0004080c0d010509
  520. .LISR:
  521. .quad 0x0504070602010003, 0x0f0e0d0c080b0a09
  522. .LISRM0:
  523. .quad 0x01040b0e0205080f, 0x0306090c00070a0d
  524. .LM0SR: @ ShiftRows constants
  525. .quad 0x0a0e02060f03070b, 0x0004080c05090d01
  526. .LSR:
  527. .quad 0x0504070600030201, 0x0f0e0d0c0a09080b
  528. .LSRM0:
  529. .quad 0x0304090e00050a0f, 0x01060b0c0207080d
  530. .LM0:
  531. .quad 0x02060a0e03070b0f, 0x0004080c0105090d
  532. .LREVM0SR:
  533. .quad 0x090d01050c000408, 0x03070b0f060a0e02
  534. .asciz "Bit-sliced AES for NEON, CRYPTOGAMS by <appro@openssl.org>"
  535. .align 6
  536. .size _bsaes_const,.-_bsaes_const
  537. .type _bsaes_encrypt8,%function
  538. .align 4
  539. _bsaes_encrypt8:
  540. adr r6,_bsaes_encrypt8
  541. vldmia r4!, {q9} @ round 0 key
  542. sub r6,r6,#_bsaes_encrypt8-.LM0SR
  543. vldmia r6!, {q8} @ .LM0SR
  544. _bsaes_encrypt8_alt:
  545. veor q10, q0, q9 @ xor with round0 key
  546. veor q11, q1, q9
  547. vtbl.8 d0, {q10}, d16
  548. vtbl.8 d1, {q10}, d17
  549. veor q12, q2, q9
  550. vtbl.8 d2, {q11}, d16
  551. vtbl.8 d3, {q11}, d17
  552. veor q13, q3, q9
  553. vtbl.8 d4, {q12}, d16
  554. vtbl.8 d5, {q12}, d17
  555. veor q14, q4, q9
  556. vtbl.8 d6, {q13}, d16
  557. vtbl.8 d7, {q13}, d17
  558. veor q15, q5, q9
  559. vtbl.8 d8, {q14}, d16
  560. vtbl.8 d9, {q14}, d17
  561. veor q10, q6, q9
  562. vtbl.8 d10, {q15}, d16
  563. vtbl.8 d11, {q15}, d17
  564. veor q11, q7, q9
  565. vtbl.8 d12, {q10}, d16
  566. vtbl.8 d13, {q10}, d17
  567. vtbl.8 d14, {q11}, d16
  568. vtbl.8 d15, {q11}, d17
  569. _bsaes_encrypt8_bitslice:
  570. vmov.i8 q8,#0x55 @ compose .LBS0
  571. vmov.i8 q9,#0x33 @ compose .LBS1
  572. vshr.u64 q10, q6, #1
  573. vshr.u64 q11, q4, #1
  574. veor q10, q10, q7
  575. veor q11, q11, q5
  576. vand q10, q10, q8
  577. vand q11, q11, q8
  578. veor q7, q7, q10
  579. vshl.u64 q10, q10, #1
  580. veor q5, q5, q11
  581. vshl.u64 q11, q11, #1
  582. veor q6, q6, q10
  583. veor q4, q4, q11
  584. vshr.u64 q10, q2, #1
  585. vshr.u64 q11, q0, #1
  586. veor q10, q10, q3
  587. veor q11, q11, q1
  588. vand q10, q10, q8
  589. vand q11, q11, q8
  590. veor q3, q3, q10
  591. vshl.u64 q10, q10, #1
  592. veor q1, q1, q11
  593. vshl.u64 q11, q11, #1
  594. veor q2, q2, q10
  595. veor q0, q0, q11
  596. vmov.i8 q8,#0x0f @ compose .LBS2
  597. vshr.u64 q10, q5, #2
  598. vshr.u64 q11, q4, #2
  599. veor q10, q10, q7
  600. veor q11, q11, q6
  601. vand q10, q10, q9
  602. vand q11, q11, q9
  603. veor q7, q7, q10
  604. vshl.u64 q10, q10, #2
  605. veor q6, q6, q11
  606. vshl.u64 q11, q11, #2
  607. veor q5, q5, q10
  608. veor q4, q4, q11
  609. vshr.u64 q10, q1, #2
  610. vshr.u64 q11, q0, #2
  611. veor q10, q10, q3
  612. veor q11, q11, q2
  613. vand q10, q10, q9
  614. vand q11, q11, q9
  615. veor q3, q3, q10
  616. vshl.u64 q10, q10, #2
  617. veor q2, q2, q11
  618. vshl.u64 q11, q11, #2
  619. veor q1, q1, q10
  620. veor q0, q0, q11
  621. vshr.u64 q10, q3, #4
  622. vshr.u64 q11, q2, #4
  623. veor q10, q10, q7
  624. veor q11, q11, q6
  625. vand q10, q10, q8
  626. vand q11, q11, q8
  627. veor q7, q7, q10
  628. vshl.u64 q10, q10, #4
  629. veor q6, q6, q11
  630. vshl.u64 q11, q11, #4
  631. veor q3, q3, q10
  632. veor q2, q2, q11
  633. vshr.u64 q10, q1, #4
  634. vshr.u64 q11, q0, #4
  635. veor q10, q10, q5
  636. veor q11, q11, q4
  637. vand q10, q10, q8
  638. vand q11, q11, q8
  639. veor q5, q5, q10
  640. vshl.u64 q10, q10, #4
  641. veor q4, q4, q11
  642. vshl.u64 q11, q11, #4
  643. veor q1, q1, q10
  644. veor q0, q0, q11
  645. sub r5,r5,#1
  646. b .Lenc_sbox
  647. .align 4
  648. .Lenc_loop:
  649. vldmia r4!, {q8-q11}
  650. veor q8, q8, q0
  651. veor q9, q9, q1
  652. vtbl.8 d0, {q8}, d24
  653. vtbl.8 d1, {q8}, d25
  654. vldmia r4!, {q8}
  655. veor q10, q10, q2
  656. vtbl.8 d2, {q9}, d24
  657. vtbl.8 d3, {q9}, d25
  658. vldmia r4!, {q9}
  659. veor q11, q11, q3
  660. vtbl.8 d4, {q10}, d24
  661. vtbl.8 d5, {q10}, d25
  662. vldmia r4!, {q10}
  663. vtbl.8 d6, {q11}, d24
  664. vtbl.8 d7, {q11}, d25
  665. vldmia r4!, {q11}
  666. veor q8, q8, q4
  667. veor q9, q9, q5
  668. vtbl.8 d8, {q8}, d24
  669. vtbl.8 d9, {q8}, d25
  670. veor q10, q10, q6
  671. vtbl.8 d10, {q9}, d24
  672. vtbl.8 d11, {q9}, d25
  673. veor q11, q11, q7
  674. vtbl.8 d12, {q10}, d24
  675. vtbl.8 d13, {q10}, d25
  676. vtbl.8 d14, {q11}, d24
  677. vtbl.8 d15, {q11}, d25
  678. .Lenc_sbox:
  679. veor q2, q2, q1
  680. veor q5, q5, q6
  681. veor q3, q3, q0
  682. veor q6, q6, q2
  683. veor q5, q5, q0
  684. veor q6, q6, q3
  685. veor q3, q3, q7
  686. veor q7, q7, q5
  687. veor q3, q3, q4
  688. veor q4, q4, q5
  689. veor q2, q2, q7
  690. veor q3, q3, q1
  691. veor q1, q1, q5
  692. veor q11, q7, q4
  693. veor q10, q1, q2
  694. veor q9, q5, q3
  695. veor q13, q2, q4
  696. vmov q8, q10
  697. veor q12, q6, q0
  698. vorr q10, q10, q9
  699. veor q15, q11, q8
  700. vand q14, q11, q12
  701. vorr q11, q11, q12
  702. veor q12, q12, q9
  703. vand q8, q8, q9
  704. veor q9, q3, q0
  705. vand q15, q15, q12
  706. vand q13, q13, q9
  707. veor q9, q7, q1
  708. veor q12, q5, q6
  709. veor q11, q11, q13
  710. veor q10, q10, q13
  711. vand q13, q9, q12
  712. vorr q9, q9, q12
  713. veor q11, q11, q15
  714. veor q8, q8, q13
  715. veor q10, q10, q14
  716. veor q9, q9, q15
  717. veor q8, q8, q14
  718. vand q12, q2, q3
  719. veor q9, q9, q14
  720. vand q13, q4, q0
  721. vand q14, q1, q5
  722. vorr q15, q7, q6
  723. veor q11, q11, q12
  724. veor q9, q9, q14
  725. veor q8, q8, q15
  726. veor q10, q10, q13
  727. @ Inv_GF16 0, 1, 2, 3, s0, s1, s2, s3
  728. @ new smaller inversion
  729. vand q14, q11, q9
  730. vmov q12, q8
  731. veor q13, q10, q14
  732. veor q15, q8, q14
  733. veor q14, q8, q14 @ q14=q15
  734. vbsl q13, q9, q8
  735. vbsl q15, q11, q10
  736. veor q11, q11, q10
  737. vbsl q12, q13, q14
  738. vbsl q8, q14, q13
  739. vand q14, q12, q15
  740. veor q9, q9, q8
  741. veor q14, q14, q11
  742. veor q12, q6, q0
  743. veor q8, q5, q3
  744. veor q10, q15, q14
  745. vand q10, q10, q6
  746. veor q6, q6, q5
  747. vand q11, q5, q15
  748. vand q6, q6, q14
  749. veor q5, q11, q10
  750. veor q6, q6, q11
  751. veor q15, q15, q13
  752. veor q14, q14, q9
  753. veor q11, q15, q14
  754. veor q10, q13, q9
  755. vand q11, q11, q12
  756. vand q10, q10, q0
  757. veor q12, q12, q8
  758. veor q0, q0, q3
  759. vand q8, q8, q15
  760. vand q3, q3, q13
  761. vand q12, q12, q14
  762. vand q0, q0, q9
  763. veor q8, q8, q12
  764. veor q0, q0, q3
  765. veor q12, q12, q11
  766. veor q3, q3, q10
  767. veor q6, q6, q12
  768. veor q0, q0, q12
  769. veor q5, q5, q8
  770. veor q3, q3, q8
  771. veor q12, q7, q4
  772. veor q8, q1, q2
  773. veor q11, q15, q14
  774. veor q10, q13, q9
  775. vand q11, q11, q12
  776. vand q10, q10, q4
  777. veor q12, q12, q8
  778. veor q4, q4, q2
  779. vand q8, q8, q15
  780. vand q2, q2, q13
  781. vand q12, q12, q14
  782. vand q4, q4, q9
  783. veor q8, q8, q12
  784. veor q4, q4, q2
  785. veor q12, q12, q11
  786. veor q2, q2, q10
  787. veor q15, q15, q13
  788. veor q14, q14, q9
  789. veor q10, q15, q14
  790. vand q10, q10, q7
  791. veor q7, q7, q1
  792. vand q11, q1, q15
  793. vand q7, q7, q14
  794. veor q1, q11, q10
  795. veor q7, q7, q11
  796. veor q7, q7, q12
  797. veor q4, q4, q12
  798. veor q1, q1, q8
  799. veor q2, q2, q8
  800. veor q7, q7, q0
  801. veor q1, q1, q6
  802. veor q6, q6, q0
  803. veor q4, q4, q7
  804. veor q0, q0, q1
  805. veor q1, q1, q5
  806. veor q5, q5, q2
  807. veor q2, q2, q3
  808. veor q3, q3, q5
  809. veor q4, q4, q5
  810. veor q6, q6, q3
  811. subs r5,r5,#1
  812. bcc .Lenc_done
  813. vext.8 q8, q0, q0, #12 @ x0 <<< 32
  814. vext.8 q9, q1, q1, #12
  815. veor q0, q0, q8 @ x0 ^ (x0 <<< 32)
  816. vext.8 q10, q4, q4, #12
  817. veor q1, q1, q9
  818. vext.8 q11, q6, q6, #12
  819. veor q4, q4, q10
  820. vext.8 q12, q3, q3, #12
  821. veor q6, q6, q11
  822. vext.8 q13, q7, q7, #12
  823. veor q3, q3, q12
  824. vext.8 q14, q2, q2, #12
  825. veor q7, q7, q13
  826. vext.8 q15, q5, q5, #12
  827. veor q2, q2, q14
  828. veor q9, q9, q0
  829. veor q5, q5, q15
  830. vext.8 q0, q0, q0, #8 @ (x0 ^ (x0 <<< 32)) <<< 64)
  831. veor q10, q10, q1
  832. veor q8, q8, q5
  833. veor q9, q9, q5
  834. vext.8 q1, q1, q1, #8
  835. veor q13, q13, q3
  836. veor q0, q0, q8
  837. veor q14, q14, q7
  838. veor q1, q1, q9
  839. vext.8 q8, q3, q3, #8
  840. veor q12, q12, q6
  841. vext.8 q9, q7, q7, #8
  842. veor q15, q15, q2
  843. vext.8 q3, q6, q6, #8
  844. veor q11, q11, q4
  845. vext.8 q7, q5, q5, #8
  846. veor q12, q12, q5
  847. vext.8 q6, q2, q2, #8
  848. veor q11, q11, q5
  849. vext.8 q2, q4, q4, #8
  850. veor q5, q9, q13
  851. veor q4, q8, q12
  852. veor q3, q3, q11
  853. veor q7, q7, q15
  854. veor q6, q6, q14
  855. @ vmov q4, q8
  856. veor q2, q2, q10
  857. @ vmov q5, q9
  858. vldmia r6, {q12} @ .LSR
  859. ite eq @ Thumb2 thing, samity check in ARM
  860. addeq r6,r6,#0x10
  861. bne .Lenc_loop
  862. vldmia r6, {q12} @ .LSRM0
  863. b .Lenc_loop
  864. .align 4
  865. .Lenc_done:
  866. vmov.i8 q8,#0x55 @ compose .LBS0
  867. vmov.i8 q9,#0x33 @ compose .LBS1
  868. vshr.u64 q10, q2, #1
  869. vshr.u64 q11, q3, #1
  870. veor q10, q10, q5
  871. veor q11, q11, q7
  872. vand q10, q10, q8
  873. vand q11, q11, q8
  874. veor q5, q5, q10
  875. vshl.u64 q10, q10, #1
  876. veor q7, q7, q11
  877. vshl.u64 q11, q11, #1
  878. veor q2, q2, q10
  879. veor q3, q3, q11
  880. vshr.u64 q10, q4, #1
  881. vshr.u64 q11, q0, #1
  882. veor q10, q10, q6
  883. veor q11, q11, q1
  884. vand q10, q10, q8
  885. vand q11, q11, q8
  886. veor q6, q6, q10
  887. vshl.u64 q10, q10, #1
  888. veor q1, q1, q11
  889. vshl.u64 q11, q11, #1
  890. veor q4, q4, q10
  891. veor q0, q0, q11
  892. vmov.i8 q8,#0x0f @ compose .LBS2
  893. vshr.u64 q10, q7, #2
  894. vshr.u64 q11, q3, #2
  895. veor q10, q10, q5
  896. veor q11, q11, q2
  897. vand q10, q10, q9
  898. vand q11, q11, q9
  899. veor q5, q5, q10
  900. vshl.u64 q10, q10, #2
  901. veor q2, q2, q11
  902. vshl.u64 q11, q11, #2
  903. veor q7, q7, q10
  904. veor q3, q3, q11
  905. vshr.u64 q10, q1, #2
  906. vshr.u64 q11, q0, #2
  907. veor q10, q10, q6
  908. veor q11, q11, q4
  909. vand q10, q10, q9
  910. vand q11, q11, q9
  911. veor q6, q6, q10
  912. vshl.u64 q10, q10, #2
  913. veor q4, q4, q11
  914. vshl.u64 q11, q11, #2
  915. veor q1, q1, q10
  916. veor q0, q0, q11
  917. vshr.u64 q10, q6, #4
  918. vshr.u64 q11, q4, #4
  919. veor q10, q10, q5
  920. veor q11, q11, q2
  921. vand q10, q10, q8
  922. vand q11, q11, q8
  923. veor q5, q5, q10
  924. vshl.u64 q10, q10, #4
  925. veor q2, q2, q11
  926. vshl.u64 q11, q11, #4
  927. veor q6, q6, q10
  928. veor q4, q4, q11
  929. vshr.u64 q10, q1, #4
  930. vshr.u64 q11, q0, #4
  931. veor q10, q10, q7
  932. veor q11, q11, q3
  933. vand q10, q10, q8
  934. vand q11, q11, q8
  935. veor q7, q7, q10
  936. vshl.u64 q10, q10, #4
  937. veor q3, q3, q11
  938. vshl.u64 q11, q11, #4
  939. veor q1, q1, q10
  940. veor q0, q0, q11
  941. vldmia r4, {q8} @ last round key
  942. veor q4, q4, q8
  943. veor q6, q6, q8
  944. veor q3, q3, q8
  945. veor q7, q7, q8
  946. veor q2, q2, q8
  947. veor q5, q5, q8
  948. veor q0, q0, q8
  949. veor q1, q1, q8
  950. bx lr
  951. .size _bsaes_encrypt8,.-_bsaes_encrypt8
  952. .type _bsaes_key_convert,%function
  953. .align 4
  954. _bsaes_key_convert:
  955. adr r6,_bsaes_key_convert
  956. vld1.8 {q7}, [r4]! @ load round 0 key
  957. sub r6,r6,#_bsaes_key_convert-.LM0
  958. vld1.8 {q15}, [r4]! @ load round 1 key
  959. vmov.i8 q8, #0x01 @ bit masks
  960. vmov.i8 q9, #0x02
  961. vmov.i8 q10, #0x04
  962. vmov.i8 q11, #0x08
  963. vmov.i8 q12, #0x10
  964. vmov.i8 q13, #0x20
  965. vldmia r6, {q14} @ .LM0
  966. #ifdef __ARMEL__
  967. vrev32.8 q7, q7
  968. vrev32.8 q15, q15
  969. #endif
  970. sub r5,r5,#1
  971. vstmia r12!, {q7} @ save round 0 key
  972. b .Lkey_loop
  973. .align 4
  974. .Lkey_loop:
  975. vtbl.8 d14,{q15},d28
  976. vtbl.8 d15,{q15},d29
  977. vmov.i8 q6, #0x40
  978. vmov.i8 q15, #0x80
  979. vtst.8 q0, q7, q8
  980. vtst.8 q1, q7, q9
  981. vtst.8 q2, q7, q10
  982. vtst.8 q3, q7, q11
  983. vtst.8 q4, q7, q12
  984. vtst.8 q5, q7, q13
  985. vtst.8 q6, q7, q6
  986. vtst.8 q7, q7, q15
  987. vld1.8 {q15}, [r4]! @ load next round key
  988. vmvn q0, q0 @ "pnot"
  989. vmvn q1, q1
  990. vmvn q5, q5
  991. vmvn q6, q6
  992. #ifdef __ARMEL__
  993. vrev32.8 q15, q15
  994. #endif
  995. subs r5,r5,#1
  996. vstmia r12!,{q0-q7} @ write bit-sliced round key
  997. bne .Lkey_loop
  998. vmov.i8 q7,#0x63 @ compose .L63
  999. @ don't save last round key
  1000. bx lr
  1001. .size _bsaes_key_convert,.-_bsaes_key_convert
  1002. .extern AES_cbc_encrypt
  1003. .extern AES_decrypt
  1004. .global bsaes_cbc_encrypt
  1005. .type bsaes_cbc_encrypt,%function
  1006. .align 5
  1007. bsaes_cbc_encrypt:
  1008. #ifndef __KERNEL__
  1009. cmp r2, #128
  1010. #ifndef __thumb__
  1011. blo AES_cbc_encrypt
  1012. #else
  1013. bhs 1f
  1014. b AES_cbc_encrypt
  1015. 1:
  1016. #endif
  1017. #endif
  1018. @ it is up to the caller to make sure we are called with enc == 0
  1019. mov ip, sp
  1020. stmdb sp!, {r4-r10, lr}
  1021. VFP_ABI_PUSH
  1022. ldr r8, [ip] @ IV is 1st arg on the stack
  1023. mov r2, r2, lsr#4 @ len in 16 byte blocks
  1024. sub sp, #0x10 @ scratch space to carry over the IV
  1025. mov r9, sp @ save sp
  1026. ldr r10, [r3, #240] @ get # of rounds
  1027. #ifndef BSAES_ASM_EXTENDED_KEY
  1028. @ allocate the key schedule on the stack
  1029. sub r12, sp, r10, lsl#7 @ 128 bytes per inner round key
  1030. add r12, #96 @ sifze of bit-slices key schedule
  1031. @ populate the key schedule
  1032. mov r4, r3 @ pass key
  1033. mov r5, r10 @ pass # of rounds
  1034. mov sp, r12 @ sp is sp
  1035. bl _bsaes_key_convert
  1036. vldmia sp, {q6}
  1037. vstmia r12, {q15} @ save last round key
  1038. veor q7, q7, q6 @ fix up round 0 key
  1039. vstmia sp, {q7}
  1040. #else
  1041. ldr r12, [r3, #244]
  1042. eors r12, #1
  1043. beq 0f
  1044. @ populate the key schedule
  1045. str r12, [r3, #244]
  1046. mov r4, r3 @ pass key
  1047. mov r5, r10 @ pass # of rounds
  1048. add r12, r3, #248 @ pass key schedule
  1049. bl _bsaes_key_convert
  1050. add r4, r3, #248
  1051. vldmia r4, {q6}
  1052. vstmia r12, {q15} @ save last round key
  1053. veor q7, q7, q6 @ fix up round 0 key
  1054. vstmia r4, {q7}
  1055. .align 2
  1056. 0:
  1057. #endif
  1058. vld1.8 {q15}, [r8] @ load IV
  1059. b .Lcbc_dec_loop
  1060. .align 4
  1061. .Lcbc_dec_loop:
  1062. subs r2, r2, #0x8
  1063. bmi .Lcbc_dec_loop_finish
  1064. vld1.8 {q0-q1}, [r0]! @ load input
  1065. vld1.8 {q2-q3}, [r0]!
  1066. #ifndef BSAES_ASM_EXTENDED_KEY
  1067. mov r4, sp @ pass the key
  1068. #else
  1069. add r4, r3, #248
  1070. #endif
  1071. vld1.8 {q4-q5}, [r0]!
  1072. mov r5, r10
  1073. vld1.8 {q6-q7}, [r0]
  1074. sub r0, r0, #0x60
  1075. vstmia r9, {q15} @ put aside IV
  1076. bl _bsaes_decrypt8
  1077. vldmia r9, {q14} @ reload IV
  1078. vld1.8 {q8-q9}, [r0]! @ reload input
  1079. veor q0, q0, q14 @ ^= IV
  1080. vld1.8 {q10-q11}, [r0]!
  1081. veor q1, q1, q8
  1082. veor q6, q6, q9
  1083. vld1.8 {q12-q13}, [r0]!
  1084. veor q4, q4, q10
  1085. veor q2, q2, q11
  1086. vld1.8 {q14-q15}, [r0]!
  1087. veor q7, q7, q12
  1088. vst1.8 {q0-q1}, [r1]! @ write output
  1089. veor q3, q3, q13
  1090. vst1.8 {q6}, [r1]!
  1091. veor q5, q5, q14
  1092. vst1.8 {q4}, [r1]!
  1093. vst1.8 {q2}, [r1]!
  1094. vst1.8 {q7}, [r1]!
  1095. vst1.8 {q3}, [r1]!
  1096. vst1.8 {q5}, [r1]!
  1097. b .Lcbc_dec_loop
  1098. .Lcbc_dec_loop_finish:
  1099. adds r2, r2, #8
  1100. beq .Lcbc_dec_done
  1101. vld1.8 {q0}, [r0]! @ load input
  1102. cmp r2, #2
  1103. blo .Lcbc_dec_one
  1104. vld1.8 {q1}, [r0]!
  1105. #ifndef BSAES_ASM_EXTENDED_KEY
  1106. mov r4, sp @ pass the key
  1107. #else
  1108. add r4, r3, #248
  1109. #endif
  1110. mov r5, r10
  1111. vstmia r9, {q15} @ put aside IV
  1112. beq .Lcbc_dec_two
  1113. vld1.8 {q2}, [r0]!
  1114. cmp r2, #4
  1115. blo .Lcbc_dec_three
  1116. vld1.8 {q3}, [r0]!
  1117. beq .Lcbc_dec_four
  1118. vld1.8 {q4}, [r0]!
  1119. cmp r2, #6
  1120. blo .Lcbc_dec_five
  1121. vld1.8 {q5}, [r0]!
  1122. beq .Lcbc_dec_six
  1123. vld1.8 {q6}, [r0]!
  1124. sub r0, r0, #0x70
  1125. bl _bsaes_decrypt8
  1126. vldmia r9, {q14} @ reload IV
  1127. vld1.8 {q8-q9}, [r0]! @ reload input
  1128. veor q0, q0, q14 @ ^= IV
  1129. vld1.8 {q10-q11}, [r0]!
  1130. veor q1, q1, q8
  1131. veor q6, q6, q9
  1132. vld1.8 {q12-q13}, [r0]!
  1133. veor q4, q4, q10
  1134. veor q2, q2, q11
  1135. vld1.8 {q15}, [r0]!
  1136. veor q7, q7, q12
  1137. vst1.8 {q0-q1}, [r1]! @ write output
  1138. veor q3, q3, q13
  1139. vst1.8 {q6}, [r1]!
  1140. vst1.8 {q4}, [r1]!
  1141. vst1.8 {q2}, [r1]!
  1142. vst1.8 {q7}, [r1]!
  1143. vst1.8 {q3}, [r1]!
  1144. b .Lcbc_dec_done
  1145. .align 4
  1146. .Lcbc_dec_six:
  1147. sub r0, r0, #0x60
  1148. bl _bsaes_decrypt8
  1149. vldmia r9,{q14} @ reload IV
  1150. vld1.8 {q8-q9}, [r0]! @ reload input
  1151. veor q0, q0, q14 @ ^= IV
  1152. vld1.8 {q10-q11}, [r0]!
  1153. veor q1, q1, q8
  1154. veor q6, q6, q9
  1155. vld1.8 {q12}, [r0]!
  1156. veor q4, q4, q10
  1157. veor q2, q2, q11
  1158. vld1.8 {q15}, [r0]!
  1159. veor q7, q7, q12
  1160. vst1.8 {q0-q1}, [r1]! @ write output
  1161. vst1.8 {q6}, [r1]!
  1162. vst1.8 {q4}, [r1]!
  1163. vst1.8 {q2}, [r1]!
  1164. vst1.8 {q7}, [r1]!
  1165. b .Lcbc_dec_done
  1166. .align 4
  1167. .Lcbc_dec_five:
  1168. sub r0, r0, #0x50
  1169. bl _bsaes_decrypt8
  1170. vldmia r9, {q14} @ reload IV
  1171. vld1.8 {q8-q9}, [r0]! @ reload input
  1172. veor q0, q0, q14 @ ^= IV
  1173. vld1.8 {q10-q11}, [r0]!
  1174. veor q1, q1, q8
  1175. veor q6, q6, q9
  1176. vld1.8 {q15}, [r0]!
  1177. veor q4, q4, q10
  1178. vst1.8 {q0-q1}, [r1]! @ write output
  1179. veor q2, q2, q11
  1180. vst1.8 {q6}, [r1]!
  1181. vst1.8 {q4}, [r1]!
  1182. vst1.8 {q2}, [r1]!
  1183. b .Lcbc_dec_done
  1184. .align 4
  1185. .Lcbc_dec_four:
  1186. sub r0, r0, #0x40
  1187. bl _bsaes_decrypt8
  1188. vldmia r9, {q14} @ reload IV
  1189. vld1.8 {q8-q9}, [r0]! @ reload input
  1190. veor q0, q0, q14 @ ^= IV
  1191. vld1.8 {q10}, [r0]!
  1192. veor q1, q1, q8
  1193. veor q6, q6, q9
  1194. vld1.8 {q15}, [r0]!
  1195. veor q4, q4, q10
  1196. vst1.8 {q0-q1}, [r1]! @ write output
  1197. vst1.8 {q6}, [r1]!
  1198. vst1.8 {q4}, [r1]!
  1199. b .Lcbc_dec_done
  1200. .align 4
  1201. .Lcbc_dec_three:
  1202. sub r0, r0, #0x30
  1203. bl _bsaes_decrypt8
  1204. vldmia r9, {q14} @ reload IV
  1205. vld1.8 {q8-q9}, [r0]! @ reload input
  1206. veor q0, q0, q14 @ ^= IV
  1207. vld1.8 {q15}, [r0]!
  1208. veor q1, q1, q8
  1209. veor q6, q6, q9
  1210. vst1.8 {q0-q1}, [r1]! @ write output
  1211. vst1.8 {q6}, [r1]!
  1212. b .Lcbc_dec_done
  1213. .align 4
  1214. .Lcbc_dec_two:
  1215. sub r0, r0, #0x20
  1216. bl _bsaes_decrypt8
  1217. vldmia r9, {q14} @ reload IV
  1218. vld1.8 {q8}, [r0]! @ reload input
  1219. veor q0, q0, q14 @ ^= IV
  1220. vld1.8 {q15}, [r0]! @ reload input
  1221. veor q1, q1, q8
  1222. vst1.8 {q0-q1}, [r1]! @ write output
  1223. b .Lcbc_dec_done
  1224. .align 4
  1225. .Lcbc_dec_one:
  1226. sub r0, r0, #0x10
  1227. mov r10, r1 @ save original out pointer
  1228. mov r1, r9 @ use the iv scratch space as out buffer
  1229. mov r2, r3
  1230. vmov q4,q15 @ just in case ensure that IV
  1231. vmov q5,q0 @ and input are preserved
  1232. bl AES_decrypt
  1233. vld1.8 {q0}, [r9,:64] @ load result
  1234. veor q0, q0, q4 @ ^= IV
  1235. vmov q15, q5 @ q5 holds input
  1236. vst1.8 {q0}, [r10] @ write output
  1237. .Lcbc_dec_done:
  1238. #ifndef BSAES_ASM_EXTENDED_KEY
  1239. vmov.i32 q0, #0
  1240. vmov.i32 q1, #0
  1241. .Lcbc_dec_bzero: @ wipe key schedule [if any]
  1242. vstmia sp!, {q0-q1}
  1243. cmp sp, r9
  1244. bne .Lcbc_dec_bzero
  1245. #endif
  1246. mov sp, r9
  1247. add sp, #0x10 @ add sp,r9,#0x10 is no good for thumb
  1248. vst1.8 {q15}, [r8] @ return IV
  1249. VFP_ABI_POP
  1250. ldmia sp!, {r4-r10, pc}
  1251. .size bsaes_cbc_encrypt,.-bsaes_cbc_encrypt
  1252. .extern AES_encrypt
  1253. .global bsaes_ctr32_encrypt_blocks
  1254. .type bsaes_ctr32_encrypt_blocks,%function
  1255. .align 5
  1256. bsaes_ctr32_encrypt_blocks:
  1257. cmp r2, #8 @ use plain AES for
  1258. blo .Lctr_enc_short @ small sizes
  1259. mov ip, sp
  1260. stmdb sp!, {r4-r10, lr}
  1261. VFP_ABI_PUSH
  1262. ldr r8, [ip] @ ctr is 1st arg on the stack
  1263. sub sp, sp, #0x10 @ scratch space to carry over the ctr
  1264. mov r9, sp @ save sp
  1265. ldr r10, [r3, #240] @ get # of rounds
  1266. #ifndef BSAES_ASM_EXTENDED_KEY
  1267. @ allocate the key schedule on the stack
  1268. sub r12, sp, r10, lsl#7 @ 128 bytes per inner round key
  1269. add r12, #96 @ size of bit-sliced key schedule
  1270. @ populate the key schedule
  1271. mov r4, r3 @ pass key
  1272. mov r5, r10 @ pass # of rounds
  1273. mov sp, r12 @ sp is sp
  1274. bl _bsaes_key_convert
  1275. veor q7,q7,q15 @ fix up last round key
  1276. vstmia r12, {q7} @ save last round key
  1277. vld1.8 {q0}, [r8] @ load counter
  1278. add r8, r6, #.LREVM0SR-.LM0 @ borrow r8
  1279. vldmia sp, {q4} @ load round0 key
  1280. #else
  1281. ldr r12, [r3, #244]
  1282. eors r12, #1
  1283. beq 0f
  1284. @ populate the key schedule
  1285. str r12, [r3, #244]
  1286. mov r4, r3 @ pass key
  1287. mov r5, r10 @ pass # of rounds
  1288. add r12, r3, #248 @ pass key schedule
  1289. bl _bsaes_key_convert
  1290. veor q7,q7,q15 @ fix up last round key
  1291. vstmia r12, {q7} @ save last round key
  1292. .align 2
  1293. 0: add r12, r3, #248
  1294. vld1.8 {q0}, [r8] @ load counter
  1295. adrl r8, .LREVM0SR @ borrow r8
  1296. vldmia r12, {q4} @ load round0 key
  1297. sub sp, #0x10 @ place for adjusted round0 key
  1298. #endif
  1299. vmov.i32 q8,#1 @ compose 1<<96
  1300. veor q9,q9,q9
  1301. vrev32.8 q0,q0
  1302. vext.8 q8,q9,q8,#4
  1303. vrev32.8 q4,q4
  1304. vadd.u32 q9,q8,q8 @ compose 2<<96
  1305. vstmia sp, {q4} @ save adjusted round0 key
  1306. b .Lctr_enc_loop
  1307. .align 4
  1308. .Lctr_enc_loop:
  1309. vadd.u32 q10, q8, q9 @ compose 3<<96
  1310. vadd.u32 q1, q0, q8 @ +1
  1311. vadd.u32 q2, q0, q9 @ +2
  1312. vadd.u32 q3, q0, q10 @ +3
  1313. vadd.u32 q4, q1, q10
  1314. vadd.u32 q5, q2, q10
  1315. vadd.u32 q6, q3, q10
  1316. vadd.u32 q7, q4, q10
  1317. vadd.u32 q10, q5, q10 @ next counter
  1318. @ Borrow prologue from _bsaes_encrypt8 to use the opportunity
  1319. @ to flip byte order in 32-bit counter
  1320. vldmia sp, {q9} @ load round0 key
  1321. #ifndef BSAES_ASM_EXTENDED_KEY
  1322. add r4, sp, #0x10 @ pass next round key
  1323. #else
  1324. add r4, r3, #264
  1325. #endif
  1326. vldmia r8, {q8} @ .LREVM0SR
  1327. mov r5, r10 @ pass rounds
  1328. vstmia r9, {q10} @ save next counter
  1329. sub r6, r8, #.LREVM0SR-.LSR @ pass constants
  1330. bl _bsaes_encrypt8_alt
  1331. subs r2, r2, #8
  1332. blo .Lctr_enc_loop_done
  1333. vld1.8 {q8-q9}, [r0]! @ load input
  1334. vld1.8 {q10-q11}, [r0]!
  1335. veor q0, q8
  1336. veor q1, q9
  1337. vld1.8 {q12-q13}, [r0]!
  1338. veor q4, q10
  1339. veor q6, q11
  1340. vld1.8 {q14-q15}, [r0]!
  1341. veor q3, q12
  1342. vst1.8 {q0-q1}, [r1]! @ write output
  1343. veor q7, q13
  1344. veor q2, q14
  1345. vst1.8 {q4}, [r1]!
  1346. veor q5, q15
  1347. vst1.8 {q6}, [r1]!
  1348. vmov.i32 q8, #1 @ compose 1<<96
  1349. vst1.8 {q3}, [r1]!
  1350. veor q9, q9, q9
  1351. vst1.8 {q7}, [r1]!
  1352. vext.8 q8, q9, q8, #4
  1353. vst1.8 {q2}, [r1]!
  1354. vadd.u32 q9,q8,q8 @ compose 2<<96
  1355. vst1.8 {q5}, [r1]!
  1356. vldmia r9, {q0} @ load counter
  1357. bne .Lctr_enc_loop
  1358. b .Lctr_enc_done
  1359. .align 4
  1360. .Lctr_enc_loop_done:
  1361. add r2, r2, #8
  1362. vld1.8 {q8}, [r0]! @ load input
  1363. veor q0, q8
  1364. vst1.8 {q0}, [r1]! @ write output
  1365. cmp r2, #2
  1366. blo .Lctr_enc_done
  1367. vld1.8 {q9}, [r0]!
  1368. veor q1, q9
  1369. vst1.8 {q1}, [r1]!
  1370. beq .Lctr_enc_done
  1371. vld1.8 {q10}, [r0]!
  1372. veor q4, q10
  1373. vst1.8 {q4}, [r1]!
  1374. cmp r2, #4
  1375. blo .Lctr_enc_done
  1376. vld1.8 {q11}, [r0]!
  1377. veor q6, q11
  1378. vst1.8 {q6}, [r1]!
  1379. beq .Lctr_enc_done
  1380. vld1.8 {q12}, [r0]!
  1381. veor q3, q12
  1382. vst1.8 {q3}, [r1]!
  1383. cmp r2, #6
  1384. blo .Lctr_enc_done
  1385. vld1.8 {q13}, [r0]!
  1386. veor q7, q13
  1387. vst1.8 {q7}, [r1]!
  1388. beq .Lctr_enc_done
  1389. vld1.8 {q14}, [r0]
  1390. veor q2, q14
  1391. vst1.8 {q2}, [r1]!
  1392. .Lctr_enc_done:
  1393. vmov.i32 q0, #0
  1394. vmov.i32 q1, #0
  1395. #ifndef BSAES_ASM_EXTENDED_KEY
  1396. .Lctr_enc_bzero: @ wipe key schedule [if any]
  1397. vstmia sp!, {q0-q1}
  1398. cmp sp, r9
  1399. bne .Lctr_enc_bzero
  1400. #else
  1401. vstmia sp, {q0-q1}
  1402. #endif
  1403. mov sp, r9
  1404. add sp, #0x10 @ add sp,r9,#0x10 is no good for thumb
  1405. VFP_ABI_POP
  1406. ldmia sp!, {r4-r10, pc} @ return
  1407. .align 4
  1408. .Lctr_enc_short:
  1409. ldr ip, [sp] @ ctr pointer is passed on stack
  1410. stmdb sp!, {r4-r8, lr}
  1411. mov r4, r0 @ copy arguments
  1412. mov r5, r1
  1413. mov r6, r2
  1414. mov r7, r3
  1415. ldr r8, [ip, #12] @ load counter LSW
  1416. vld1.8 {q1}, [ip] @ load whole counter value
  1417. #ifdef __ARMEL__
  1418. rev r8, r8
  1419. #endif
  1420. sub sp, sp, #0x10
  1421. vst1.8 {q1}, [sp,:64] @ copy counter value
  1422. sub sp, sp, #0x10
  1423. .Lctr_enc_short_loop:
  1424. add r0, sp, #0x10 @ input counter value
  1425. mov r1, sp @ output on the stack
  1426. mov r2, r7 @ key
  1427. bl AES_encrypt
  1428. vld1.8 {q0}, [r4]! @ load input
  1429. vld1.8 {q1}, [sp,:64] @ load encrypted counter
  1430. add r8, r8, #1
  1431. #ifdef __ARMEL__
  1432. rev r0, r8
  1433. str r0, [sp, #0x1c] @ next counter value
  1434. #else
  1435. str r8, [sp, #0x1c] @ next counter value
  1436. #endif
  1437. veor q0,q0,q1
  1438. vst1.8 {q0}, [r5]! @ store output
  1439. subs r6, r6, #1
  1440. bne .Lctr_enc_short_loop
  1441. vmov.i32 q0, #0
  1442. vmov.i32 q1, #0
  1443. vstmia sp!, {q0-q1}
  1444. ldmia sp!, {r4-r8, pc}
  1445. .size bsaes_ctr32_encrypt_blocks,.-bsaes_ctr32_encrypt_blocks
  1446. .globl bsaes_xts_encrypt
  1447. .type bsaes_xts_encrypt,%function
  1448. .align 4
  1449. bsaes_xts_encrypt:
  1450. mov ip, sp
  1451. stmdb sp!, {r4-r10, lr} @ 0x20
  1452. VFP_ABI_PUSH
  1453. mov r6, sp @ future r3
  1454. mov r7, r0
  1455. mov r8, r1
  1456. mov r9, r2
  1457. mov r10, r3
  1458. sub r0, sp, #0x10 @ 0x10
  1459. bic r0, #0xf @ align at 16 bytes
  1460. mov sp, r0
  1461. #ifdef XTS_CHAIN_TWEAK
  1462. ldr r0, [ip] @ pointer to input tweak
  1463. #else
  1464. @ generate initial tweak
  1465. ldr r0, [ip, #4] @ iv[]
  1466. mov r1, sp
  1467. ldr r2, [ip, #0] @ key2
  1468. bl AES_encrypt
  1469. mov r0,sp @ pointer to initial tweak
  1470. #endif
  1471. ldr r1, [r10, #240] @ get # of rounds
  1472. mov r3, r6
  1473. #ifndef BSAES_ASM_EXTENDED_KEY
  1474. @ allocate the key schedule on the stack
  1475. sub r12, sp, r1, lsl#7 @ 128 bytes per inner round key
  1476. @ add r12, #96 @ size of bit-sliced key schedule
  1477. sub r12, #48 @ place for tweak[9]
  1478. @ populate the key schedule
  1479. mov r4, r10 @ pass key
  1480. mov r5, r1 @ pass # of rounds
  1481. mov sp, r12
  1482. add r12, #0x90 @ pass key schedule
  1483. bl _bsaes_key_convert
  1484. veor q7, q7, q15 @ fix up last round key
  1485. vstmia r12, {q7} @ save last round key
  1486. #else
  1487. ldr r12, [r10, #244]
  1488. eors r12, #1
  1489. beq 0f
  1490. str r12, [r10, #244]
  1491. mov r4, r10 @ pass key
  1492. mov r5, r1 @ pass # of rounds
  1493. add r12, r10, #248 @ pass key schedule
  1494. bl _bsaes_key_convert
  1495. veor q7, q7, q15 @ fix up last round key
  1496. vstmia r12, {q7}
  1497. .align 2
  1498. 0: sub sp, #0x90 @ place for tweak[9]
  1499. #endif
  1500. vld1.8 {q8}, [r0] @ initial tweak
  1501. adr r2, .Lxts_magic
  1502. subs r9, #0x80
  1503. blo .Lxts_enc_short
  1504. b .Lxts_enc_loop
  1505. .align 4
  1506. .Lxts_enc_loop:
  1507. vldmia r2, {q5} @ load XTS magic
  1508. vshr.s64 q6, q8, #63
  1509. mov r0, sp
  1510. vand q6, q6, q5
  1511. vadd.u64 q9, q8, q8
  1512. vst1.64 {q8}, [r0,:128]!
  1513. vswp d13,d12
  1514. vshr.s64 q7, q9, #63
  1515. veor q9, q9, q6
  1516. vand q7, q7, q5
  1517. vadd.u64 q10, q9, q9
  1518. vst1.64 {q9}, [r0,:128]!
  1519. vswp d15,d14
  1520. vshr.s64 q6, q10, #63
  1521. veor q10, q10, q7
  1522. vand q6, q6, q5
  1523. vld1.8 {q0}, [r7]!
  1524. vadd.u64 q11, q10, q10
  1525. vst1.64 {q10}, [r0,:128]!
  1526. vswp d13,d12
  1527. vshr.s64 q7, q11, #63
  1528. veor q11, q11, q6
  1529. vand q7, q7, q5
  1530. vld1.8 {q1}, [r7]!
  1531. veor q0, q0, q8
  1532. vadd.u64 q12, q11, q11
  1533. vst1.64 {q11}, [r0,:128]!
  1534. vswp d15,d14
  1535. vshr.s64 q6, q12, #63
  1536. veor q12, q12, q7
  1537. vand q6, q6, q5
  1538. vld1.8 {q2}, [r7]!
  1539. veor q1, q1, q9
  1540. vadd.u64 q13, q12, q12
  1541. vst1.64 {q12}, [r0,:128]!
  1542. vswp d13,d12
  1543. vshr.s64 q7, q13, #63
  1544. veor q13, q13, q6
  1545. vand q7, q7, q5
  1546. vld1.8 {q3}, [r7]!
  1547. veor q2, q2, q10
  1548. vadd.u64 q14, q13, q13
  1549. vst1.64 {q13}, [r0,:128]!
  1550. vswp d15,d14
  1551. vshr.s64 q6, q14, #63
  1552. veor q14, q14, q7
  1553. vand q6, q6, q5
  1554. vld1.8 {q4}, [r7]!
  1555. veor q3, q3, q11
  1556. vadd.u64 q15, q14, q14
  1557. vst1.64 {q14}, [r0,:128]!
  1558. vswp d13,d12
  1559. vshr.s64 q7, q15, #63
  1560. veor q15, q15, q6
  1561. vand q7, q7, q5
  1562. vld1.8 {q5}, [r7]!
  1563. veor q4, q4, q12
  1564. vadd.u64 q8, q15, q15
  1565. vst1.64 {q15}, [r0,:128]!
  1566. vswp d15,d14
  1567. veor q8, q8, q7
  1568. vst1.64 {q8}, [r0,:128] @ next round tweak
  1569. vld1.8 {q6-q7}, [r7]!
  1570. veor q5, q5, q13
  1571. #ifndef BSAES_ASM_EXTENDED_KEY
  1572. add r4, sp, #0x90 @ pass key schedule
  1573. #else
  1574. add r4, r10, #248 @ pass key schedule
  1575. #endif
  1576. veor q6, q6, q14
  1577. mov r5, r1 @ pass rounds
  1578. veor q7, q7, q15
  1579. mov r0, sp
  1580. bl _bsaes_encrypt8
  1581. vld1.64 {q8-q9}, [r0,:128]!
  1582. vld1.64 {q10-q11}, [r0,:128]!
  1583. veor q0, q0, q8
  1584. vld1.64 {q12-q13}, [r0,:128]!
  1585. veor q1, q1, q9
  1586. veor q8, q4, q10
  1587. vst1.8 {q0-q1}, [r8]!
  1588. veor q9, q6, q11
  1589. vld1.64 {q14-q15}, [r0,:128]!
  1590. veor q10, q3, q12
  1591. vst1.8 {q8-q9}, [r8]!
  1592. veor q11, q7, q13
  1593. veor q12, q2, q14
  1594. vst1.8 {q10-q11}, [r8]!
  1595. veor q13, q5, q15
  1596. vst1.8 {q12-q13}, [r8]!
  1597. vld1.64 {q8}, [r0,:128] @ next round tweak
  1598. subs r9, #0x80
  1599. bpl .Lxts_enc_loop
  1600. .Lxts_enc_short:
  1601. adds r9, #0x70
  1602. bmi .Lxts_enc_done
  1603. vldmia r2, {q5} @ load XTS magic
  1604. vshr.s64 q7, q8, #63
  1605. mov r0, sp
  1606. vand q7, q7, q5
  1607. vadd.u64 q9, q8, q8
  1608. vst1.64 {q8}, [r0,:128]!
  1609. vswp d15,d14
  1610. vshr.s64 q6, q9, #63
  1611. veor q9, q9, q7
  1612. vand q6, q6, q5
  1613. vadd.u64 q10, q9, q9
  1614. vst1.64 {q9}, [r0,:128]!
  1615. vswp d13,d12
  1616. vshr.s64 q7, q10, #63
  1617. veor q10, q10, q6
  1618. vand q7, q7, q5
  1619. vld1.8 {q0}, [r7]!
  1620. subs r9, #0x10
  1621. bmi .Lxts_enc_1
  1622. vadd.u64 q11, q10, q10
  1623. vst1.64 {q10}, [r0,:128]!
  1624. vswp d15,d14
  1625. vshr.s64 q6, q11, #63
  1626. veor q11, q11, q7
  1627. vand q6, q6, q5
  1628. vld1.8 {q1}, [r7]!
  1629. subs r9, #0x10
  1630. bmi .Lxts_enc_2
  1631. veor q0, q0, q8
  1632. vadd.u64 q12, q11, q11
  1633. vst1.64 {q11}, [r0,:128]!
  1634. vswp d13,d12
  1635. vshr.s64 q7, q12, #63
  1636. veor q12, q12, q6
  1637. vand q7, q7, q5
  1638. vld1.8 {q2}, [r7]!
  1639. subs r9, #0x10
  1640. bmi .Lxts_enc_3
  1641. veor q1, q1, q9
  1642. vadd.u64 q13, q12, q12
  1643. vst1.64 {q12}, [r0,:128]!
  1644. vswp d15,d14
  1645. vshr.s64 q6, q13, #63
  1646. veor q13, q13, q7
  1647. vand q6, q6, q5
  1648. vld1.8 {q3}, [r7]!
  1649. subs r9, #0x10
  1650. bmi .Lxts_enc_4
  1651. veor q2, q2, q10
  1652. vadd.u64 q14, q13, q13
  1653. vst1.64 {q13}, [r0,:128]!
  1654. vswp d13,d12
  1655. vshr.s64 q7, q14, #63
  1656. veor q14, q14, q6
  1657. vand q7, q7, q5
  1658. vld1.8 {q4}, [r7]!
  1659. subs r9, #0x10
  1660. bmi .Lxts_enc_5
  1661. veor q3, q3, q11
  1662. vadd.u64 q15, q14, q14
  1663. vst1.64 {q14}, [r0,:128]!
  1664. vswp d15,d14
  1665. vshr.s64 q6, q15, #63
  1666. veor q15, q15, q7
  1667. vand q6, q6, q5
  1668. vld1.8 {q5}, [r7]!
  1669. subs r9, #0x10
  1670. bmi .Lxts_enc_6
  1671. veor q4, q4, q12
  1672. sub r9, #0x10
  1673. vst1.64 {q15}, [r0,:128] @ next round tweak
  1674. vld1.8 {q6}, [r7]!
  1675. veor q5, q5, q13
  1676. #ifndef BSAES_ASM_EXTENDED_KEY
  1677. add r4, sp, #0x90 @ pass key schedule
  1678. #else
  1679. add r4, r10, #248 @ pass key schedule
  1680. #endif
  1681. veor q6, q6, q14
  1682. mov r5, r1 @ pass rounds
  1683. mov r0, sp
  1684. bl _bsaes_encrypt8
  1685. vld1.64 {q8-q9}, [r0,:128]!
  1686. vld1.64 {q10-q11}, [r0,:128]!
  1687. veor q0, q0, q8
  1688. vld1.64 {q12-q13}, [r0,:128]!
  1689. veor q1, q1, q9
  1690. veor q8, q4, q10
  1691. vst1.8 {q0-q1}, [r8]!
  1692. veor q9, q6, q11
  1693. vld1.64 {q14}, [r0,:128]!
  1694. veor q10, q3, q12
  1695. vst1.8 {q8-q9}, [r8]!
  1696. veor q11, q7, q13
  1697. veor q12, q2, q14
  1698. vst1.8 {q10-q11}, [r8]!
  1699. vst1.8 {q12}, [r8]!
  1700. vld1.64 {q8}, [r0,:128] @ next round tweak
  1701. b .Lxts_enc_done
  1702. .align 4
  1703. .Lxts_enc_6:
  1704. vst1.64 {q14}, [r0,:128] @ next round tweak
  1705. veor q4, q4, q12
  1706. #ifndef BSAES_ASM_EXTENDED_KEY
  1707. add r4, sp, #0x90 @ pass key schedule
  1708. #else
  1709. add r4, r10, #248 @ pass key schedule
  1710. #endif
  1711. veor q5, q5, q13
  1712. mov r5, r1 @ pass rounds
  1713. mov r0, sp
  1714. bl _bsaes_encrypt8
  1715. vld1.64 {q8-q9}, [r0,:128]!
  1716. vld1.64 {q10-q11}, [r0,:128]!
  1717. veor q0, q0, q8
  1718. vld1.64 {q12-q13}, [r0,:128]!
  1719. veor q1, q1, q9
  1720. veor q8, q4, q10
  1721. vst1.8 {q0-q1}, [r8]!
  1722. veor q9, q6, q11
  1723. veor q10, q3, q12
  1724. vst1.8 {q8-q9}, [r8]!
  1725. veor q11, q7, q13
  1726. vst1.8 {q10-q11}, [r8]!
  1727. vld1.64 {q8}, [r0,:128] @ next round tweak
  1728. b .Lxts_enc_done
  1729. @ put this in range for both ARM and Thumb mode adr instructions
  1730. .align 5
  1731. .Lxts_magic:
  1732. .quad 1, 0x87
  1733. .align 5
  1734. .Lxts_enc_5:
  1735. vst1.64 {q13}, [r0,:128] @ next round tweak
  1736. veor q3, q3, q11
  1737. #ifndef BSAES_ASM_EXTENDED_KEY
  1738. add r4, sp, #0x90 @ pass key schedule
  1739. #else
  1740. add r4, r10, #248 @ pass key schedule
  1741. #endif
  1742. veor q4, q4, q12
  1743. mov r5, r1 @ pass rounds
  1744. mov r0, sp
  1745. bl _bsaes_encrypt8
  1746. vld1.64 {q8-q9}, [r0,:128]!
  1747. vld1.64 {q10-q11}, [r0,:128]!
  1748. veor q0, q0, q8
  1749. vld1.64 {q12}, [r0,:128]!
  1750. veor q1, q1, q9
  1751. veor q8, q4, q10
  1752. vst1.8 {q0-q1}, [r8]!
  1753. veor q9, q6, q11
  1754. veor q10, q3, q12
  1755. vst1.8 {q8-q9}, [r8]!
  1756. vst1.8 {q10}, [r8]!
  1757. vld1.64 {q8}, [r0,:128] @ next round tweak
  1758. b .Lxts_enc_done
  1759. .align 4
  1760. .Lxts_enc_4:
  1761. vst1.64 {q12}, [r0,:128] @ next round tweak
  1762. veor q2, q2, q10
  1763. #ifndef BSAES_ASM_EXTENDED_KEY
  1764. add r4, sp, #0x90 @ pass key schedule
  1765. #else
  1766. add r4, r10, #248 @ pass key schedule
  1767. #endif
  1768. veor q3, q3, q11
  1769. mov r5, r1 @ pass rounds
  1770. mov r0, sp
  1771. bl _bsaes_encrypt8
  1772. vld1.64 {q8-q9}, [r0,:128]!
  1773. vld1.64 {q10-q11}, [r0,:128]!
  1774. veor q0, q0, q8
  1775. veor q1, q1, q9
  1776. veor q8, q4, q10
  1777. vst1.8 {q0-q1}, [r8]!
  1778. veor q9, q6, q11
  1779. vst1.8 {q8-q9}, [r8]!
  1780. vld1.64 {q8}, [r0,:128] @ next round tweak
  1781. b .Lxts_enc_done
  1782. .align 4
  1783. .Lxts_enc_3:
  1784. vst1.64 {q11}, [r0,:128] @ next round tweak
  1785. veor q1, q1, q9
  1786. #ifndef BSAES_ASM_EXTENDED_KEY
  1787. add r4, sp, #0x90 @ pass key schedule
  1788. #else
  1789. add r4, r10, #248 @ pass key schedule
  1790. #endif
  1791. veor q2, q2, q10
  1792. mov r5, r1 @ pass rounds
  1793. mov r0, sp
  1794. bl _bsaes_encrypt8
  1795. vld1.64 {q8-q9}, [r0,:128]!
  1796. vld1.64 {q10}, [r0,:128]!
  1797. veor q0, q0, q8
  1798. veor q1, q1, q9
  1799. veor q8, q4, q10
  1800. vst1.8 {q0-q1}, [r8]!
  1801. vst1.8 {q8}, [r8]!
  1802. vld1.64 {q8}, [r0,:128] @ next round tweak
  1803. b .Lxts_enc_done
  1804. .align 4
  1805. .Lxts_enc_2:
  1806. vst1.64 {q10}, [r0,:128] @ next round tweak
  1807. veor q0, q0, q8
  1808. #ifndef BSAES_ASM_EXTENDED_KEY
  1809. add r4, sp, #0x90 @ pass key schedule
  1810. #else
  1811. add r4, r10, #248 @ pass key schedule
  1812. #endif
  1813. veor q1, q1, q9
  1814. mov r5, r1 @ pass rounds
  1815. mov r0, sp
  1816. bl _bsaes_encrypt8
  1817. vld1.64 {q8-q9}, [r0,:128]!
  1818. veor q0, q0, q8
  1819. veor q1, q1, q9
  1820. vst1.8 {q0-q1}, [r8]!
  1821. vld1.64 {q8}, [r0,:128] @ next round tweak
  1822. b .Lxts_enc_done
  1823. .align 4
  1824. .Lxts_enc_1:
  1825. mov r0, sp
  1826. veor q0, q8
  1827. mov r1, sp
  1828. vst1.8 {q0}, [sp,:128]
  1829. mov r2, r10
  1830. mov r4, r3 @ preserve fp
  1831. bl AES_encrypt
  1832. vld1.8 {q0}, [sp,:128]
  1833. veor q0, q0, q8
  1834. vst1.8 {q0}, [r8]!
  1835. mov r3, r4
  1836. vmov q8, q9 @ next round tweak
  1837. .Lxts_enc_done:
  1838. #ifndef XTS_CHAIN_TWEAK
  1839. adds r9, #0x10
  1840. beq .Lxts_enc_ret
  1841. sub r6, r8, #0x10
  1842. .Lxts_enc_steal:
  1843. ldrb r0, [r7], #1
  1844. ldrb r1, [r8, #-0x10]
  1845. strb r0, [r8, #-0x10]
  1846. strb r1, [r8], #1
  1847. subs r9, #1
  1848. bhi .Lxts_enc_steal
  1849. vld1.8 {q0}, [r6]
  1850. mov r0, sp
  1851. veor q0, q0, q8
  1852. mov r1, sp
  1853. vst1.8 {q0}, [sp,:128]
  1854. mov r2, r10
  1855. mov r4, r3 @ preserve fp
  1856. bl AES_encrypt
  1857. vld1.8 {q0}, [sp,:128]
  1858. veor q0, q0, q8
  1859. vst1.8 {q0}, [r6]
  1860. mov r3, r4
  1861. #endif
  1862. .Lxts_enc_ret:
  1863. bic r0, r3, #0xf
  1864. vmov.i32 q0, #0
  1865. vmov.i32 q1, #0
  1866. #ifdef XTS_CHAIN_TWEAK
  1867. ldr r1, [r3, #0x20+VFP_ABI_FRAME] @ chain tweak
  1868. #endif
  1869. .Lxts_enc_bzero: @ wipe key schedule [if any]
  1870. vstmia sp!, {q0-q1}
  1871. cmp sp, r0
  1872. bne .Lxts_enc_bzero
  1873. mov sp, r3
  1874. #ifdef XTS_CHAIN_TWEAK
  1875. vst1.8 {q8}, [r1]
  1876. #endif
  1877. VFP_ABI_POP
  1878. ldmia sp!, {r4-r10, pc} @ return
  1879. .size bsaes_xts_encrypt,.-bsaes_xts_encrypt
  1880. .globl bsaes_xts_decrypt
  1881. .type bsaes_xts_decrypt,%function
  1882. .align 4
  1883. bsaes_xts_decrypt:
  1884. mov ip, sp
  1885. stmdb sp!, {r4-r10, lr} @ 0x20
  1886. VFP_ABI_PUSH
  1887. mov r6, sp @ future r3
  1888. mov r7, r0
  1889. mov r8, r1
  1890. mov r9, r2
  1891. mov r10, r3
  1892. sub r0, sp, #0x10 @ 0x10
  1893. bic r0, #0xf @ align at 16 bytes
  1894. mov sp, r0
  1895. #ifdef XTS_CHAIN_TWEAK
  1896. ldr r0, [ip] @ pointer to input tweak
  1897. #else
  1898. @ generate initial tweak
  1899. ldr r0, [ip, #4] @ iv[]
  1900. mov r1, sp
  1901. ldr r2, [ip, #0] @ key2
  1902. bl AES_encrypt
  1903. mov r0, sp @ pointer to initial tweak
  1904. #endif
  1905. ldr r1, [r10, #240] @ get # of rounds
  1906. mov r3, r6
  1907. #ifndef BSAES_ASM_EXTENDED_KEY
  1908. @ allocate the key schedule on the stack
  1909. sub r12, sp, r1, lsl#7 @ 128 bytes per inner round key
  1910. @ add r12, #96 @ size of bit-sliced key schedule
  1911. sub r12, #48 @ place for tweak[9]
  1912. @ populate the key schedule
  1913. mov r4, r10 @ pass key
  1914. mov r5, r1 @ pass # of rounds
  1915. mov sp, r12
  1916. add r12, #0x90 @ pass key schedule
  1917. bl _bsaes_key_convert
  1918. add r4, sp, #0x90
  1919. vldmia r4, {q6}
  1920. vstmia r12, {q15} @ save last round key
  1921. veor q7, q7, q6 @ fix up round 0 key
  1922. vstmia r4, {q7}
  1923. #else
  1924. ldr r12, [r10, #244]
  1925. eors r12, #1
  1926. beq 0f
  1927. str r12, [r10, #244]
  1928. mov r4, r10 @ pass key
  1929. mov r5, r1 @ pass # of rounds
  1930. add r12, r10, #248 @ pass key schedule
  1931. bl _bsaes_key_convert
  1932. add r4, r10, #248
  1933. vldmia r4, {q6}
  1934. vstmia r12, {q15} @ save last round key
  1935. veor q7, q7, q6 @ fix up round 0 key
  1936. vstmia r4, {q7}
  1937. .align 2
  1938. 0: sub sp, #0x90 @ place for tweak[9]
  1939. #endif
  1940. vld1.8 {q8}, [r0] @ initial tweak
  1941. adr r2, .Lxts_magic
  1942. tst r9, #0xf @ if not multiple of 16
  1943. it ne @ Thumb2 thing, sanity check in ARM
  1944. subne r9, #0x10 @ subtract another 16 bytes
  1945. subs r9, #0x80
  1946. blo .Lxts_dec_short
  1947. b .Lxts_dec_loop
  1948. .align 4
  1949. .Lxts_dec_loop:
  1950. vldmia r2, {q5} @ load XTS magic
  1951. vshr.s64 q6, q8, #63
  1952. mov r0, sp
  1953. vand q6, q6, q5
  1954. vadd.u64 q9, q8, q8
  1955. vst1.64 {q8}, [r0,:128]!
  1956. vswp d13,d12
  1957. vshr.s64 q7, q9, #63
  1958. veor q9, q9, q6
  1959. vand q7, q7, q5
  1960. vadd.u64 q10, q9, q9
  1961. vst1.64 {q9}, [r0,:128]!
  1962. vswp d15,d14
  1963. vshr.s64 q6, q10, #63
  1964. veor q10, q10, q7
  1965. vand q6, q6, q5
  1966. vld1.8 {q0}, [r7]!
  1967. vadd.u64 q11, q10, q10
  1968. vst1.64 {q10}, [r0,:128]!
  1969. vswp d13,d12
  1970. vshr.s64 q7, q11, #63
  1971. veor q11, q11, q6
  1972. vand q7, q7, q5
  1973. vld1.8 {q1}, [r7]!
  1974. veor q0, q0, q8
  1975. vadd.u64 q12, q11, q11
  1976. vst1.64 {q11}, [r0,:128]!
  1977. vswp d15,d14
  1978. vshr.s64 q6, q12, #63
  1979. veor q12, q12, q7
  1980. vand q6, q6, q5
  1981. vld1.8 {q2}, [r7]!
  1982. veor q1, q1, q9
  1983. vadd.u64 q13, q12, q12
  1984. vst1.64 {q12}, [r0,:128]!
  1985. vswp d13,d12
  1986. vshr.s64 q7, q13, #63
  1987. veor q13, q13, q6
  1988. vand q7, q7, q5
  1989. vld1.8 {q3}, [r7]!
  1990. veor q2, q2, q10
  1991. vadd.u64 q14, q13, q13
  1992. vst1.64 {q13}, [r0,:128]!
  1993. vswp d15,d14
  1994. vshr.s64 q6, q14, #63
  1995. veor q14, q14, q7
  1996. vand q6, q6, q5
  1997. vld1.8 {q4}, [r7]!
  1998. veor q3, q3, q11
  1999. vadd.u64 q15, q14, q14
  2000. vst1.64 {q14}, [r0,:128]!
  2001. vswp d13,d12
  2002. vshr.s64 q7, q15, #63
  2003. veor q15, q15, q6
  2004. vand q7, q7, q5
  2005. vld1.8 {q5}, [r7]!
  2006. veor q4, q4, q12
  2007. vadd.u64 q8, q15, q15
  2008. vst1.64 {q15}, [r0,:128]!
  2009. vswp d15,d14
  2010. veor q8, q8, q7
  2011. vst1.64 {q8}, [r0,:128] @ next round tweak
  2012. vld1.8 {q6-q7}, [r7]!
  2013. veor q5, q5, q13
  2014. #ifndef BSAES_ASM_EXTENDED_KEY
  2015. add r4, sp, #0x90 @ pass key schedule
  2016. #else
  2017. add r4, r10, #248 @ pass key schedule
  2018. #endif
  2019. veor q6, q6, q14
  2020. mov r5, r1 @ pass rounds
  2021. veor q7, q7, q15
  2022. mov r0, sp
  2023. bl _bsaes_decrypt8
  2024. vld1.64 {q8-q9}, [r0,:128]!
  2025. vld1.64 {q10-q11}, [r0,:128]!
  2026. veor q0, q0, q8
  2027. vld1.64 {q12-q13}, [r0,:128]!
  2028. veor q1, q1, q9
  2029. veor q8, q6, q10
  2030. vst1.8 {q0-q1}, [r8]!
  2031. veor q9, q4, q11
  2032. vld1.64 {q14-q15}, [r0,:128]!
  2033. veor q10, q2, q12
  2034. vst1.8 {q8-q9}, [r8]!
  2035. veor q11, q7, q13
  2036. veor q12, q3, q14
  2037. vst1.8 {q10-q11}, [r8]!
  2038. veor q13, q5, q15
  2039. vst1.8 {q12-q13}, [r8]!
  2040. vld1.64 {q8}, [r0,:128] @ next round tweak
  2041. subs r9, #0x80
  2042. bpl .Lxts_dec_loop
  2043. .Lxts_dec_short:
  2044. adds r9, #0x70
  2045. bmi .Lxts_dec_done
  2046. vldmia r2, {q5} @ load XTS magic
  2047. vshr.s64 q7, q8, #63
  2048. mov r0, sp
  2049. vand q7, q7, q5
  2050. vadd.u64 q9, q8, q8
  2051. vst1.64 {q8}, [r0,:128]!
  2052. vswp d15,d14
  2053. vshr.s64 q6, q9, #63
  2054. veor q9, q9, q7
  2055. vand q6, q6, q5
  2056. vadd.u64 q10, q9, q9
  2057. vst1.64 {q9}, [r0,:128]!
  2058. vswp d13,d12
  2059. vshr.s64 q7, q10, #63
  2060. veor q10, q10, q6
  2061. vand q7, q7, q5
  2062. vld1.8 {q0}, [r7]!
  2063. subs r9, #0x10
  2064. bmi .Lxts_dec_1
  2065. vadd.u64 q11, q10, q10
  2066. vst1.64 {q10}, [r0,:128]!
  2067. vswp d15,d14
  2068. vshr.s64 q6, q11, #63
  2069. veor q11, q11, q7
  2070. vand q6, q6, q5
  2071. vld1.8 {q1}, [r7]!
  2072. subs r9, #0x10
  2073. bmi .Lxts_dec_2
  2074. veor q0, q0, q8
  2075. vadd.u64 q12, q11, q11
  2076. vst1.64 {q11}, [r0,:128]!
  2077. vswp d13,d12
  2078. vshr.s64 q7, q12, #63
  2079. veor q12, q12, q6
  2080. vand q7, q7, q5
  2081. vld1.8 {q2}, [r7]!
  2082. subs r9, #0x10
  2083. bmi .Lxts_dec_3
  2084. veor q1, q1, q9
  2085. vadd.u64 q13, q12, q12
  2086. vst1.64 {q12}, [r0,:128]!
  2087. vswp d15,d14
  2088. vshr.s64 q6, q13, #63
  2089. veor q13, q13, q7
  2090. vand q6, q6, q5
  2091. vld1.8 {q3}, [r7]!
  2092. subs r9, #0x10
  2093. bmi .Lxts_dec_4
  2094. veor q2, q2, q10
  2095. vadd.u64 q14, q13, q13
  2096. vst1.64 {q13}, [r0,:128]!
  2097. vswp d13,d12
  2098. vshr.s64 q7, q14, #63
  2099. veor q14, q14, q6
  2100. vand q7, q7, q5
  2101. vld1.8 {q4}, [r7]!
  2102. subs r9, #0x10
  2103. bmi .Lxts_dec_5
  2104. veor q3, q3, q11
  2105. vadd.u64 q15, q14, q14
  2106. vst1.64 {q14}, [r0,:128]!
  2107. vswp d15,d14
  2108. vshr.s64 q6, q15, #63
  2109. veor q15, q15, q7
  2110. vand q6, q6, q5
  2111. vld1.8 {q5}, [r7]!
  2112. subs r9, #0x10
  2113. bmi .Lxts_dec_6
  2114. veor q4, q4, q12
  2115. sub r9, #0x10
  2116. vst1.64 {q15}, [r0,:128] @ next round tweak
  2117. vld1.8 {q6}, [r7]!
  2118. veor q5, q5, q13
  2119. #ifndef BSAES_ASM_EXTENDED_KEY
  2120. add r4, sp, #0x90 @ pass key schedule
  2121. #else
  2122. add r4, r10, #248 @ pass key schedule
  2123. #endif
  2124. veor q6, q6, q14
  2125. mov r5, r1 @ pass rounds
  2126. mov r0, sp
  2127. bl _bsaes_decrypt8
  2128. vld1.64 {q8-q9}, [r0,:128]!
  2129. vld1.64 {q10-q11}, [r0,:128]!
  2130. veor q0, q0, q8
  2131. vld1.64 {q12-q13}, [r0,:128]!
  2132. veor q1, q1, q9
  2133. veor q8, q6, q10
  2134. vst1.8 {q0-q1}, [r8]!
  2135. veor q9, q4, q11
  2136. vld1.64 {q14}, [r0,:128]!
  2137. veor q10, q2, q12
  2138. vst1.8 {q8-q9}, [r8]!
  2139. veor q11, q7, q13
  2140. veor q12, q3, q14
  2141. vst1.8 {q10-q11}, [r8]!
  2142. vst1.8 {q12}, [r8]!
  2143. vld1.64 {q8}, [r0,:128] @ next round tweak
  2144. b .Lxts_dec_done
  2145. .align 4
  2146. .Lxts_dec_6:
  2147. vst1.64 {q14}, [r0,:128] @ next round tweak
  2148. veor q4, q4, q12
  2149. #ifndef BSAES_ASM_EXTENDED_KEY
  2150. add r4, sp, #0x90 @ pass key schedule
  2151. #else
  2152. add r4, r10, #248 @ pass key schedule
  2153. #endif
  2154. veor q5, q5, q13
  2155. mov r5, r1 @ pass rounds
  2156. mov r0, sp
  2157. bl _bsaes_decrypt8
  2158. vld1.64 {q8-q9}, [r0,:128]!
  2159. vld1.64 {q10-q11}, [r0,:128]!
  2160. veor q0, q0, q8
  2161. vld1.64 {q12-q13}, [r0,:128]!
  2162. veor q1, q1, q9
  2163. veor q8, q6, q10
  2164. vst1.8 {q0-q1}, [r8]!
  2165. veor q9, q4, q11
  2166. veor q10, q2, q12
  2167. vst1.8 {q8-q9}, [r8]!
  2168. veor q11, q7, q13
  2169. vst1.8 {q10-q11}, [r8]!
  2170. vld1.64 {q8}, [r0,:128] @ next round tweak
  2171. b .Lxts_dec_done
  2172. .align 4
  2173. .Lxts_dec_5:
  2174. vst1.64 {q13}, [r0,:128] @ next round tweak
  2175. veor q3, q3, q11
  2176. #ifndef BSAES_ASM_EXTENDED_KEY
  2177. add r4, sp, #0x90 @ pass key schedule
  2178. #else
  2179. add r4, r10, #248 @ pass key schedule
  2180. #endif
  2181. veor q4, q4, q12
  2182. mov r5, r1 @ pass rounds
  2183. mov r0, sp
  2184. bl _bsaes_decrypt8
  2185. vld1.64 {q8-q9}, [r0,:128]!
  2186. vld1.64 {q10-q11}, [r0,:128]!
  2187. veor q0, q0, q8
  2188. vld1.64 {q12}, [r0,:128]!
  2189. veor q1, q1, q9
  2190. veor q8, q6, q10
  2191. vst1.8 {q0-q1}, [r8]!
  2192. veor q9, q4, q11
  2193. veor q10, q2, q12
  2194. vst1.8 {q8-q9}, [r8]!
  2195. vst1.8 {q10}, [r8]!
  2196. vld1.64 {q8}, [r0,:128] @ next round tweak
  2197. b .Lxts_dec_done
  2198. .align 4
  2199. .Lxts_dec_4:
  2200. vst1.64 {q12}, [r0,:128] @ next round tweak
  2201. veor q2, q2, q10
  2202. #ifndef BSAES_ASM_EXTENDED_KEY
  2203. add r4, sp, #0x90 @ pass key schedule
  2204. #else
  2205. add r4, r10, #248 @ pass key schedule
  2206. #endif
  2207. veor q3, q3, q11
  2208. mov r5, r1 @ pass rounds
  2209. mov r0, sp
  2210. bl _bsaes_decrypt8
  2211. vld1.64 {q8-q9}, [r0,:128]!
  2212. vld1.64 {q10-q11}, [r0,:128]!
  2213. veor q0, q0, q8
  2214. veor q1, q1, q9
  2215. veor q8, q6, q10
  2216. vst1.8 {q0-q1}, [r8]!
  2217. veor q9, q4, q11
  2218. vst1.8 {q8-q9}, [r8]!
  2219. vld1.64 {q8}, [r0,:128] @ next round tweak
  2220. b .Lxts_dec_done
  2221. .align 4
  2222. .Lxts_dec_3:
  2223. vst1.64 {q11}, [r0,:128] @ next round tweak
  2224. veor q1, q1, q9
  2225. #ifndef BSAES_ASM_EXTENDED_KEY
  2226. add r4, sp, #0x90 @ pass key schedule
  2227. #else
  2228. add r4, r10, #248 @ pass key schedule
  2229. #endif
  2230. veor q2, q2, q10
  2231. mov r5, r1 @ pass rounds
  2232. mov r0, sp
  2233. bl _bsaes_decrypt8
  2234. vld1.64 {q8-q9}, [r0,:128]!
  2235. vld1.64 {q10}, [r0,:128]!
  2236. veor q0, q0, q8
  2237. veor q1, q1, q9
  2238. veor q8, q6, q10
  2239. vst1.8 {q0-q1}, [r8]!
  2240. vst1.8 {q8}, [r8]!
  2241. vld1.64 {q8}, [r0,:128] @ next round tweak
  2242. b .Lxts_dec_done
  2243. .align 4
  2244. .Lxts_dec_2:
  2245. vst1.64 {q10}, [r0,:128] @ next round tweak
  2246. veor q0, q0, q8
  2247. #ifndef BSAES_ASM_EXTENDED_KEY
  2248. add r4, sp, #0x90 @ pass key schedule
  2249. #else
  2250. add r4, r10, #248 @ pass key schedule
  2251. #endif
  2252. veor q1, q1, q9
  2253. mov r5, r1 @ pass rounds
  2254. mov r0, sp
  2255. bl _bsaes_decrypt8
  2256. vld1.64 {q8-q9}, [r0,:128]!
  2257. veor q0, q0, q8
  2258. veor q1, q1, q9
  2259. vst1.8 {q0-q1}, [r8]!
  2260. vld1.64 {q8}, [r0,:128] @ next round tweak
  2261. b .Lxts_dec_done
  2262. .align 4
  2263. .Lxts_dec_1:
  2264. mov r0, sp
  2265. veor q0, q8
  2266. mov r1, sp
  2267. vst1.8 {q0}, [sp,:128]
  2268. mov r2, r10
  2269. mov r4, r3 @ preserve fp
  2270. mov r5, r2 @ preserve magic
  2271. bl AES_decrypt
  2272. vld1.8 {q0}, [sp,:128]
  2273. veor q0, q0, q8
  2274. vst1.8 {q0}, [r8]!
  2275. mov r3, r4
  2276. mov r2, r5
  2277. vmov q8, q9 @ next round tweak
  2278. .Lxts_dec_done:
  2279. #ifndef XTS_CHAIN_TWEAK
  2280. adds r9, #0x10
  2281. beq .Lxts_dec_ret
  2282. @ calculate one round of extra tweak for the stolen ciphertext
  2283. vldmia r2, {q5}
  2284. vshr.s64 q6, q8, #63
  2285. vand q6, q6, q5
  2286. vadd.u64 q9, q8, q8
  2287. vswp d13,d12
  2288. veor q9, q9, q6
  2289. @ perform the final decryption with the last tweak value
  2290. vld1.8 {q0}, [r7]!
  2291. mov r0, sp
  2292. veor q0, q0, q9
  2293. mov r1, sp
  2294. vst1.8 {q0}, [sp,:128]
  2295. mov r2, r10
  2296. mov r4, r3 @ preserve fp
  2297. bl AES_decrypt
  2298. vld1.8 {q0}, [sp,:128]
  2299. veor q0, q0, q9
  2300. vst1.8 {q0}, [r8]
  2301. mov r6, r8
  2302. .Lxts_dec_steal:
  2303. ldrb r1, [r8]
  2304. ldrb r0, [r7], #1
  2305. strb r1, [r8, #0x10]
  2306. strb r0, [r8], #1
  2307. subs r9, #1
  2308. bhi .Lxts_dec_steal
  2309. vld1.8 {q0}, [r6]
  2310. mov r0, sp
  2311. veor q0, q8
  2312. mov r1, sp
  2313. vst1.8 {q0}, [sp,:128]
  2314. mov r2, r10
  2315. bl AES_decrypt
  2316. vld1.8 {q0}, [sp,:128]
  2317. veor q0, q0, q8
  2318. vst1.8 {q0}, [r6]
  2319. mov r3, r4
  2320. #endif
  2321. .Lxts_dec_ret:
  2322. bic r0, r3, #0xf
  2323. vmov.i32 q0, #0
  2324. vmov.i32 q1, #0
  2325. #ifdef XTS_CHAIN_TWEAK
  2326. ldr r1, [r3, #0x20+VFP_ABI_FRAME] @ chain tweak
  2327. #endif
  2328. .Lxts_dec_bzero: @ wipe key schedule [if any]
  2329. vstmia sp!, {q0-q1}
  2330. cmp sp, r0
  2331. bne .Lxts_dec_bzero
  2332. mov sp, r3
  2333. #ifdef XTS_CHAIN_TWEAK
  2334. vst1.8 {q8}, [r1]
  2335. #endif
  2336. VFP_ABI_POP
  2337. ldmia sp!, {r4-r10, pc} @ return
  2338. .size bsaes_xts_decrypt,.-bsaes_xts_decrypt
  2339. #endif