bsaes-armv7.S 52 KB

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