aesbs-core.S_shipped 52 KB

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