bsaes-armv7.S 32 KB

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