aes_asm.S 27 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139
  1. #include <linux/linkage.h>
  2. #include <asm/visasm.h>
  3. #define F3F(x,y,z) (((x)<<30)|((y)<<19)|((z)<<5))
  4. #define FPD_ENCODE(x) (((x) >> 5) | ((x) & ~(0x20)))
  5. #define RS1(x) (FPD_ENCODE(x) << 14)
  6. #define RS2(x) (FPD_ENCODE(x) << 0)
  7. #define RS3(x) (FPD_ENCODE(x) << 9)
  8. #define RD(x) (FPD_ENCODE(x) << 25)
  9. #define IMM5(x) ((x) << 9)
  10. #define AES_EROUND01(a,b,c,d) \
  11. .word (F3F(2, 0x19, 0)|RS1(a)|RS2(b)|RS3(c)|RD(d));
  12. #define AES_EROUND23(a,b,c,d) \
  13. .word (F3F(2, 0x19, 1)|RS1(a)|RS2(b)|RS3(c)|RD(d));
  14. #define AES_DROUND01(a,b,c,d) \
  15. .word (F3F(2, 0x19, 2)|RS1(a)|RS2(b)|RS3(c)|RD(d));
  16. #define AES_DROUND23(a,b,c,d) \
  17. .word (F3F(2, 0x19, 3)|RS1(a)|RS2(b)|RS3(c)|RD(d));
  18. #define AES_EROUND01_L(a,b,c,d) \
  19. .word (F3F(2, 0x19, 4)|RS1(a)|RS2(b)|RS3(c)|RD(d));
  20. #define AES_EROUND23_L(a,b,c,d) \
  21. .word (F3F(2, 0x19, 5)|RS1(a)|RS2(b)|RS3(c)|RD(d));
  22. #define AES_DROUND01_L(a,b,c,d) \
  23. .word (F3F(2, 0x19, 6)|RS1(a)|RS2(b)|RS3(c)|RD(d));
  24. #define AES_DROUND23_L(a,b,c,d) \
  25. .word (F3F(2, 0x19, 7)|RS1(a)|RS2(b)|RS3(c)|RD(d));
  26. #define AES_KEXPAND1(a,b,c,d) \
  27. .word (F3F(2, 0x19, 8)|RS1(a)|RS2(b)|IMM5(c)|RD(d));
  28. #define AES_KEXPAND0(a,b,c) \
  29. .word (F3F(2, 0x36, 0x130)|RS1(a)|RS2(b)|RD(c));
  30. #define AES_KEXPAND2(a,b,c) \
  31. .word (F3F(2, 0x36, 0x131)|RS1(a)|RS2(b)|RD(c));
  32. #define MOVXTOD_G3_F4 \
  33. .word 0x89b02303;
  34. #define MOVXTOD_G7_F6 \
  35. .word 0x8db02307;
  36. #define MOVXTOD_G3_F0 \
  37. .word 0x81b02303;
  38. #define MOVXTOD_G7_F2 \
  39. .word 0x85b02307;
  40. #define MOVXTOD_O0_F0 \
  41. .word 0x81b02308;
  42. #define MOVXTOD_O5_F2 \
  43. .word 0x85b0230d;
  44. #define ENCRYPT_TWO_ROUNDS(KEY_BASE, I0, I1, T0, T1) \
  45. AES_EROUND01(KEY_BASE + 0, I0, I1, T0) \
  46. AES_EROUND23(KEY_BASE + 2, I0, I1, T1) \
  47. AES_EROUND01(KEY_BASE + 4, T0, T1, I0) \
  48. AES_EROUND23(KEY_BASE + 6, T0, T1, I1)
  49. #define ENCRYPT_TWO_ROUNDS_LAST(KEY_BASE, I0, I1, T0, T1) \
  50. AES_EROUND01(KEY_BASE + 0, I0, I1, T0) \
  51. AES_EROUND23(KEY_BASE + 2, I0, I1, T1) \
  52. AES_EROUND01_L(KEY_BASE + 4, T0, T1, I0) \
  53. AES_EROUND23_L(KEY_BASE + 6, T0, T1, I1)
  54. /* 10 rounds */
  55. #define ENCRYPT_128(KEY_BASE, I0, I1, T0, T1) \
  56. ENCRYPT_TWO_ROUNDS(KEY_BASE + 0, I0, I1, T0, T1) \
  57. ENCRYPT_TWO_ROUNDS(KEY_BASE + 8, I0, I1, T0, T1) \
  58. ENCRYPT_TWO_ROUNDS(KEY_BASE + 16, I0, I1, T0, T1) \
  59. ENCRYPT_TWO_ROUNDS(KEY_BASE + 24, I0, I1, T0, T1) \
  60. ENCRYPT_TWO_ROUNDS_LAST(KEY_BASE + 32, I0, I1, T0, T1)
  61. /* 12 rounds */
  62. #define ENCRYPT_192(KEY_BASE, I0, I1, T0, T1) \
  63. ENCRYPT_TWO_ROUNDS(KEY_BASE + 0, I0, I1, T0, T1) \
  64. ENCRYPT_TWO_ROUNDS(KEY_BASE + 8, I0, I1, T0, T1) \
  65. ENCRYPT_TWO_ROUNDS(KEY_BASE + 16, I0, I1, T0, T1) \
  66. ENCRYPT_TWO_ROUNDS(KEY_BASE + 24, I0, I1, T0, T1) \
  67. ENCRYPT_TWO_ROUNDS(KEY_BASE + 32, I0, I1, T0, T1) \
  68. ENCRYPT_TWO_ROUNDS_LAST(KEY_BASE + 40, I0, I1, T0, T1)
  69. /* 14 rounds */
  70. #define ENCRYPT_256(KEY_BASE, I0, I1, T0, T1) \
  71. ENCRYPT_TWO_ROUNDS(KEY_BASE + 0, I0, I1, T0, T1) \
  72. ENCRYPT_TWO_ROUNDS(KEY_BASE + 8, I0, I1, T0, T1) \
  73. ENCRYPT_TWO_ROUNDS(KEY_BASE + 16, I0, I1, T0, T1) \
  74. ENCRYPT_TWO_ROUNDS(KEY_BASE + 24, I0, I1, T0, T1) \
  75. ENCRYPT_TWO_ROUNDS(KEY_BASE + 32, I0, I1, T0, T1) \
  76. ENCRYPT_TWO_ROUNDS(KEY_BASE + 40, I0, I1, T0, T1) \
  77. ENCRYPT_TWO_ROUNDS_LAST(KEY_BASE + 48, I0, I1, T0, T1)
  78. #define DECRYPT_TWO_ROUNDS(KEY_BASE, I0, I1, T0, T1) \
  79. AES_DROUND23(KEY_BASE + 0, I0, I1, T1) \
  80. AES_DROUND01(KEY_BASE + 2, I0, I1, T0) \
  81. AES_DROUND23(KEY_BASE + 4, T0, T1, I1) \
  82. AES_DROUND01(KEY_BASE + 6, T0, T1, I0)
  83. #define DECRYPT_TWO_ROUNDS_LAST(KEY_BASE, I0, I1, T0, T1) \
  84. AES_DROUND23(KEY_BASE + 0, I0, I1, T1) \
  85. AES_DROUND01(KEY_BASE + 2, I0, I1, T0) \
  86. AES_DROUND23_L(KEY_BASE + 4, T0, T1, I1) \
  87. AES_DROUND01_L(KEY_BASE + 6, T0, T1, I0)
  88. /* 10 rounds */
  89. #define DECRYPT_128(KEY_BASE, I0, I1, T0, T1) \
  90. DECRYPT_TWO_ROUNDS(KEY_BASE + 0, I0, I1, T0, T1) \
  91. DECRYPT_TWO_ROUNDS(KEY_BASE + 8, I0, I1, T0, T1) \
  92. DECRYPT_TWO_ROUNDS(KEY_BASE + 16, I0, I1, T0, T1) \
  93. DECRYPT_TWO_ROUNDS(KEY_BASE + 24, I0, I1, T0, T1) \
  94. DECRYPT_TWO_ROUNDS_LAST(KEY_BASE + 32, I0, I1, T0, T1)
  95. /* 12 rounds */
  96. #define DECRYPT_192(KEY_BASE, I0, I1, T0, T1) \
  97. DECRYPT_TWO_ROUNDS(KEY_BASE + 0, I0, I1, T0, T1) \
  98. DECRYPT_TWO_ROUNDS(KEY_BASE + 8, I0, I1, T0, T1) \
  99. DECRYPT_TWO_ROUNDS(KEY_BASE + 16, I0, I1, T0, T1) \
  100. DECRYPT_TWO_ROUNDS(KEY_BASE + 24, I0, I1, T0, T1) \
  101. DECRYPT_TWO_ROUNDS(KEY_BASE + 32, I0, I1, T0, T1) \
  102. DECRYPT_TWO_ROUNDS_LAST(KEY_BASE + 40, I0, I1, T0, T1)
  103. /* 14 rounds */
  104. #define DECRYPT_256(KEY_BASE, I0, I1, T0, T1) \
  105. DECRYPT_TWO_ROUNDS(KEY_BASE + 0, I0, I1, T0, T1) \
  106. DECRYPT_TWO_ROUNDS(KEY_BASE + 8, I0, I1, T0, T1) \
  107. DECRYPT_TWO_ROUNDS(KEY_BASE + 16, I0, I1, T0, T1) \
  108. DECRYPT_TWO_ROUNDS(KEY_BASE + 24, I0, I1, T0, T1) \
  109. DECRYPT_TWO_ROUNDS(KEY_BASE + 32, I0, I1, T0, T1) \
  110. DECRYPT_TWO_ROUNDS(KEY_BASE + 40, I0, I1, T0, T1) \
  111. DECRYPT_TWO_ROUNDS_LAST(KEY_BASE + 48, I0, I1, T0, T1)
  112. .align 32
  113. ENTRY(aes_sparc64_key_expand)
  114. /* %o0=input_key, %o1=output_key, %o2=key_len */
  115. VISEntry
  116. ld [%o0 + 0x00], %f0
  117. ld [%o0 + 0x04], %f1
  118. ld [%o0 + 0x08], %f2
  119. ld [%o0 + 0x0c], %f3
  120. std %f0, [%o1 + 0x00]
  121. std %f2, [%o1 + 0x08]
  122. add %o1, 0x10, %o1
  123. cmp %o2, 24
  124. bl 2f
  125. nop
  126. be 1f
  127. nop
  128. /* 256-bit key expansion */
  129. ld [%o0 + 0x10], %f4
  130. ld [%o0 + 0x14], %f5
  131. ld [%o0 + 0x18], %f6
  132. ld [%o0 + 0x1c], %f7
  133. std %f4, [%o1 + 0x00]
  134. std %f6, [%o1 + 0x08]
  135. add %o1, 0x10, %o1
  136. AES_KEXPAND1(0, 6, 0x0, 8)
  137. AES_KEXPAND2(2, 8, 10)
  138. AES_KEXPAND0(4, 10, 12)
  139. AES_KEXPAND2(6, 12, 14)
  140. AES_KEXPAND1(8, 14, 0x1, 16)
  141. AES_KEXPAND2(10, 16, 18)
  142. AES_KEXPAND0(12, 18, 20)
  143. AES_KEXPAND2(14, 20, 22)
  144. AES_KEXPAND1(16, 22, 0x2, 24)
  145. AES_KEXPAND2(18, 24, 26)
  146. AES_KEXPAND0(20, 26, 28)
  147. AES_KEXPAND2(22, 28, 30)
  148. AES_KEXPAND1(24, 30, 0x3, 32)
  149. AES_KEXPAND2(26, 32, 34)
  150. AES_KEXPAND0(28, 34, 36)
  151. AES_KEXPAND2(30, 36, 38)
  152. AES_KEXPAND1(32, 38, 0x4, 40)
  153. AES_KEXPAND2(34, 40, 42)
  154. AES_KEXPAND0(36, 42, 44)
  155. AES_KEXPAND2(38, 44, 46)
  156. AES_KEXPAND1(40, 46, 0x5, 48)
  157. AES_KEXPAND2(42, 48, 50)
  158. AES_KEXPAND0(44, 50, 52)
  159. AES_KEXPAND2(46, 52, 54)
  160. AES_KEXPAND1(48, 54, 0x6, 56)
  161. AES_KEXPAND2(50, 56, 58)
  162. std %f8, [%o1 + 0x00]
  163. std %f10, [%o1 + 0x08]
  164. std %f12, [%o1 + 0x10]
  165. std %f14, [%o1 + 0x18]
  166. std %f16, [%o1 + 0x20]
  167. std %f18, [%o1 + 0x28]
  168. std %f20, [%o1 + 0x30]
  169. std %f22, [%o1 + 0x38]
  170. std %f24, [%o1 + 0x40]
  171. std %f26, [%o1 + 0x48]
  172. std %f28, [%o1 + 0x50]
  173. std %f30, [%o1 + 0x58]
  174. std %f32, [%o1 + 0x60]
  175. std %f34, [%o1 + 0x68]
  176. std %f36, [%o1 + 0x70]
  177. std %f38, [%o1 + 0x78]
  178. std %f40, [%o1 + 0x80]
  179. std %f42, [%o1 + 0x88]
  180. std %f44, [%o1 + 0x90]
  181. std %f46, [%o1 + 0x98]
  182. std %f48, [%o1 + 0xa0]
  183. std %f50, [%o1 + 0xa8]
  184. std %f52, [%o1 + 0xb0]
  185. std %f54, [%o1 + 0xb8]
  186. std %f56, [%o1 + 0xc0]
  187. ba,pt %xcc, 80f
  188. std %f58, [%o1 + 0xc8]
  189. 1:
  190. /* 192-bit key expansion */
  191. ld [%o0 + 0x10], %f4
  192. ld [%o0 + 0x14], %f5
  193. std %f4, [%o1 + 0x00]
  194. add %o1, 0x08, %o1
  195. AES_KEXPAND1(0, 4, 0x0, 6)
  196. AES_KEXPAND2(2, 6, 8)
  197. AES_KEXPAND2(4, 8, 10)
  198. AES_KEXPAND1(6, 10, 0x1, 12)
  199. AES_KEXPAND2(8, 12, 14)
  200. AES_KEXPAND2(10, 14, 16)
  201. AES_KEXPAND1(12, 16, 0x2, 18)
  202. AES_KEXPAND2(14, 18, 20)
  203. AES_KEXPAND2(16, 20, 22)
  204. AES_KEXPAND1(18, 22, 0x3, 24)
  205. AES_KEXPAND2(20, 24, 26)
  206. AES_KEXPAND2(22, 26, 28)
  207. AES_KEXPAND1(24, 28, 0x4, 30)
  208. AES_KEXPAND2(26, 30, 32)
  209. AES_KEXPAND2(28, 32, 34)
  210. AES_KEXPAND1(30, 34, 0x5, 36)
  211. AES_KEXPAND2(32, 36, 38)
  212. AES_KEXPAND2(34, 38, 40)
  213. AES_KEXPAND1(36, 40, 0x6, 42)
  214. AES_KEXPAND2(38, 42, 44)
  215. AES_KEXPAND2(40, 44, 46)
  216. AES_KEXPAND1(42, 46, 0x7, 48)
  217. AES_KEXPAND2(44, 48, 50)
  218. std %f6, [%o1 + 0x00]
  219. std %f8, [%o1 + 0x08]
  220. std %f10, [%o1 + 0x10]
  221. std %f12, [%o1 + 0x18]
  222. std %f14, [%o1 + 0x20]
  223. std %f16, [%o1 + 0x28]
  224. std %f18, [%o1 + 0x30]
  225. std %f20, [%o1 + 0x38]
  226. std %f22, [%o1 + 0x40]
  227. std %f24, [%o1 + 0x48]
  228. std %f26, [%o1 + 0x50]
  229. std %f28, [%o1 + 0x58]
  230. std %f30, [%o1 + 0x60]
  231. std %f32, [%o1 + 0x68]
  232. std %f34, [%o1 + 0x70]
  233. std %f36, [%o1 + 0x78]
  234. std %f38, [%o1 + 0x80]
  235. std %f40, [%o1 + 0x88]
  236. std %f42, [%o1 + 0x90]
  237. std %f44, [%o1 + 0x98]
  238. std %f46, [%o1 + 0xa0]
  239. std %f48, [%o1 + 0xa8]
  240. ba,pt %xcc, 80f
  241. std %f50, [%o1 + 0xb0]
  242. 2:
  243. /* 128-bit key expansion */
  244. AES_KEXPAND1(0, 2, 0x0, 4)
  245. AES_KEXPAND2(2, 4, 6)
  246. AES_KEXPAND1(4, 6, 0x1, 8)
  247. AES_KEXPAND2(6, 8, 10)
  248. AES_KEXPAND1(8, 10, 0x2, 12)
  249. AES_KEXPAND2(10, 12, 14)
  250. AES_KEXPAND1(12, 14, 0x3, 16)
  251. AES_KEXPAND2(14, 16, 18)
  252. AES_KEXPAND1(16, 18, 0x4, 20)
  253. AES_KEXPAND2(18, 20, 22)
  254. AES_KEXPAND1(20, 22, 0x5, 24)
  255. AES_KEXPAND2(22, 24, 26)
  256. AES_KEXPAND1(24, 26, 0x6, 28)
  257. AES_KEXPAND2(26, 28, 30)
  258. AES_KEXPAND1(28, 30, 0x7, 32)
  259. AES_KEXPAND2(30, 32, 34)
  260. AES_KEXPAND1(32, 34, 0x8, 36)
  261. AES_KEXPAND2(34, 36, 38)
  262. AES_KEXPAND1(36, 38, 0x9, 40)
  263. AES_KEXPAND2(38, 40, 42)
  264. std %f4, [%o1 + 0x00]
  265. std %f6, [%o1 + 0x08]
  266. std %f8, [%o1 + 0x10]
  267. std %f10, [%o1 + 0x18]
  268. std %f12, [%o1 + 0x20]
  269. std %f14, [%o1 + 0x28]
  270. std %f16, [%o1 + 0x30]
  271. std %f18, [%o1 + 0x38]
  272. std %f20, [%o1 + 0x40]
  273. std %f22, [%o1 + 0x48]
  274. std %f24, [%o1 + 0x50]
  275. std %f26, [%o1 + 0x58]
  276. std %f28, [%o1 + 0x60]
  277. std %f30, [%o1 + 0x68]
  278. std %f32, [%o1 + 0x70]
  279. std %f34, [%o1 + 0x78]
  280. std %f36, [%o1 + 0x80]
  281. std %f38, [%o1 + 0x88]
  282. std %f40, [%o1 + 0x90]
  283. std %f42, [%o1 + 0x98]
  284. 80:
  285. retl
  286. VISExit
  287. ENDPROC(aes_sparc64_key_expand)
  288. .align 32
  289. ENTRY(aes_sparc64_encrypt_128)
  290. /* %o0=key, %o1=input, %o2=output */
  291. VISEntry
  292. ld [%o1 + 0x00], %f4
  293. ld [%o1 + 0x04], %f5
  294. ld [%o1 + 0x08], %f6
  295. ld [%o1 + 0x0c], %f7
  296. ldd [%o0 + 0x00], %f8
  297. ldd [%o0 + 0x08], %f10
  298. ldd [%o0 + 0x10], %f12
  299. ldd [%o0 + 0x18], %f14
  300. ldd [%o0 + 0x20], %f16
  301. ldd [%o0 + 0x28], %f18
  302. ldd [%o0 + 0x30], %f20
  303. ldd [%o0 + 0x38], %f22
  304. ldd [%o0 + 0x40], %f24
  305. ldd [%o0 + 0x48], %f26
  306. ldd [%o0 + 0x50], %f28
  307. ldd [%o0 + 0x58], %f30
  308. ldd [%o0 + 0x60], %f32
  309. ldd [%o0 + 0x68], %f34
  310. ldd [%o0 + 0x70], %f36
  311. ldd [%o0 + 0x78], %f38
  312. ldd [%o0 + 0x80], %f40
  313. ldd [%o0 + 0x88], %f42
  314. ldd [%o0 + 0x90], %f44
  315. ldd [%o0 + 0x98], %f46
  316. ldd [%o0 + 0xa0], %f48
  317. ldd [%o0 + 0xa8], %f50
  318. fxor %f8, %f4, %f4
  319. fxor %f10, %f6, %f6
  320. ENCRYPT_128(12, 4, 6, 0, 2)
  321. st %f4, [%o2 + 0x00]
  322. st %f5, [%o2 + 0x04]
  323. st %f6, [%o2 + 0x08]
  324. st %f7, [%o2 + 0x0c]
  325. retl
  326. VISExit
  327. ENDPROC(aes_sparc64_encrypt_128)
  328. .align 32
  329. ENTRY(aes_sparc64_encrypt_192)
  330. /* %o0=key, %o1=input, %o2=output */
  331. VISEntry
  332. ld [%o1 + 0x00], %f4
  333. ld [%o1 + 0x04], %f5
  334. ld [%o1 + 0x08], %f6
  335. ld [%o1 + 0x0c], %f7
  336. ldd [%o0 + 0x00], %f8
  337. ldd [%o0 + 0x08], %f10
  338. fxor %f8, %f4, %f4
  339. fxor %f10, %f6, %f6
  340. ldd [%o0 + 0x10], %f8
  341. ldd [%o0 + 0x18], %f10
  342. ldd [%o0 + 0x20], %f12
  343. ldd [%o0 + 0x28], %f14
  344. add %o0, 0x20, %o0
  345. ENCRYPT_TWO_ROUNDS(8, 4, 6, 0, 2)
  346. ldd [%o0 + 0x10], %f12
  347. ldd [%o0 + 0x18], %f14
  348. ldd [%o0 + 0x20], %f16
  349. ldd [%o0 + 0x28], %f18
  350. ldd [%o0 + 0x30], %f20
  351. ldd [%o0 + 0x38], %f22
  352. ldd [%o0 + 0x40], %f24
  353. ldd [%o0 + 0x48], %f26
  354. ldd [%o0 + 0x50], %f28
  355. ldd [%o0 + 0x58], %f30
  356. ldd [%o0 + 0x60], %f32
  357. ldd [%o0 + 0x68], %f34
  358. ldd [%o0 + 0x70], %f36
  359. ldd [%o0 + 0x78], %f38
  360. ldd [%o0 + 0x80], %f40
  361. ldd [%o0 + 0x88], %f42
  362. ldd [%o0 + 0x90], %f44
  363. ldd [%o0 + 0x98], %f46
  364. ldd [%o0 + 0xa0], %f48
  365. ldd [%o0 + 0xa8], %f50
  366. ENCRYPT_128(12, 4, 6, 0, 2)
  367. st %f4, [%o2 + 0x00]
  368. st %f5, [%o2 + 0x04]
  369. st %f6, [%o2 + 0x08]
  370. st %f7, [%o2 + 0x0c]
  371. retl
  372. VISExit
  373. ENDPROC(aes_sparc64_encrypt_192)
  374. .align 32
  375. ENTRY(aes_sparc64_encrypt_256)
  376. /* %o0=key, %o1=input, %o2=output */
  377. VISEntry
  378. ld [%o1 + 0x00], %f4
  379. ld [%o1 + 0x04], %f5
  380. ld [%o1 + 0x08], %f6
  381. ld [%o1 + 0x0c], %f7
  382. ldd [%o0 + 0x00], %f8
  383. ldd [%o0 + 0x08], %f10
  384. fxor %f8, %f4, %f4
  385. fxor %f10, %f6, %f6
  386. ldd [%o0 + 0x10], %f8
  387. ldd [%o0 + 0x18], %f10
  388. ldd [%o0 + 0x20], %f12
  389. ldd [%o0 + 0x28], %f14
  390. add %o0, 0x20, %o0
  391. ENCRYPT_TWO_ROUNDS(8, 4, 6, 0, 2)
  392. ldd [%o0 + 0x10], %f8
  393. ldd [%o0 + 0x18], %f10
  394. ldd [%o0 + 0x20], %f12
  395. ldd [%o0 + 0x28], %f14
  396. add %o0, 0x20, %o0
  397. ENCRYPT_TWO_ROUNDS(8, 4, 6, 0, 2)
  398. ldd [%o0 + 0x10], %f12
  399. ldd [%o0 + 0x18], %f14
  400. ldd [%o0 + 0x20], %f16
  401. ldd [%o0 + 0x28], %f18
  402. ldd [%o0 + 0x30], %f20
  403. ldd [%o0 + 0x38], %f22
  404. ldd [%o0 + 0x40], %f24
  405. ldd [%o0 + 0x48], %f26
  406. ldd [%o0 + 0x50], %f28
  407. ldd [%o0 + 0x58], %f30
  408. ldd [%o0 + 0x60], %f32
  409. ldd [%o0 + 0x68], %f34
  410. ldd [%o0 + 0x70], %f36
  411. ldd [%o0 + 0x78], %f38
  412. ldd [%o0 + 0x80], %f40
  413. ldd [%o0 + 0x88], %f42
  414. ldd [%o0 + 0x90], %f44
  415. ldd [%o0 + 0x98], %f46
  416. ldd [%o0 + 0xa0], %f48
  417. ldd [%o0 + 0xa8], %f50
  418. ENCRYPT_128(12, 4, 6, 0, 2)
  419. st %f4, [%o2 + 0x00]
  420. st %f5, [%o2 + 0x04]
  421. st %f6, [%o2 + 0x08]
  422. st %f7, [%o2 + 0x0c]
  423. retl
  424. VISExit
  425. ENDPROC(aes_sparc64_encrypt_256)
  426. .align 32
  427. ENTRY(aes_sparc64_decrypt_128)
  428. /* %o0=key, %o1=input, %o2=output */
  429. VISEntry
  430. ld [%o1 + 0x00], %f4
  431. ld [%o1 + 0x04], %f5
  432. ld [%o1 + 0x08], %f6
  433. ld [%o1 + 0x0c], %f7
  434. ldd [%o0 + 0xa0], %f8
  435. ldd [%o0 + 0xa8], %f10
  436. ldd [%o0 + 0x98], %f12
  437. ldd [%o0 + 0x90], %f14
  438. ldd [%o0 + 0x88], %f16
  439. ldd [%o0 + 0x80], %f18
  440. ldd [%o0 + 0x78], %f20
  441. ldd [%o0 + 0x70], %f22
  442. ldd [%o0 + 0x68], %f24
  443. ldd [%o0 + 0x60], %f26
  444. ldd [%o0 + 0x58], %f28
  445. ldd [%o0 + 0x50], %f30
  446. ldd [%o0 + 0x48], %f32
  447. ldd [%o0 + 0x40], %f34
  448. ldd [%o0 + 0x38], %f36
  449. ldd [%o0 + 0x30], %f38
  450. ldd [%o0 + 0x28], %f40
  451. ldd [%o0 + 0x20], %f42
  452. ldd [%o0 + 0x18], %f44
  453. ldd [%o0 + 0x10], %f46
  454. ldd [%o0 + 0x08], %f48
  455. ldd [%o0 + 0x00], %f50
  456. fxor %f8, %f4, %f4
  457. fxor %f10, %f6, %f6
  458. DECRYPT_128(12, 4, 6, 0, 2)
  459. st %f4, [%o2 + 0x00]
  460. st %f5, [%o2 + 0x04]
  461. st %f6, [%o2 + 0x08]
  462. st %f7, [%o2 + 0x0c]
  463. retl
  464. VISExit
  465. ENDPROC(aes_sparc64_decrypt_128)
  466. .align 32
  467. ENTRY(aes_sparc64_decrypt_192)
  468. /* %o0=key, %o1=input, %o2=output */
  469. VISEntry
  470. ld [%o1 + 0x00], %f4
  471. ld [%o1 + 0x04], %f5
  472. ld [%o1 + 0x08], %f6
  473. ld [%o1 + 0x0c], %f7
  474. ldd [%o0 + 0xc0], %f8
  475. ldd [%o0 + 0xc8], %f10
  476. ldd [%o0 + 0xb8], %f12
  477. ldd [%o0 + 0xb0], %f14
  478. ldd [%o0 + 0xa8], %f16
  479. ldd [%o0 + 0xa0], %f18
  480. fxor %f8, %f4, %f4
  481. fxor %f10, %f6, %f6
  482. ldd [%o0 + 0x98], %f20
  483. ldd [%o0 + 0x90], %f22
  484. ldd [%o0 + 0x88], %f24
  485. ldd [%o0 + 0x80], %f26
  486. DECRYPT_TWO_ROUNDS(12, 4, 6, 0, 2)
  487. ldd [%o0 + 0x78], %f28
  488. ldd [%o0 + 0x70], %f30
  489. ldd [%o0 + 0x68], %f32
  490. ldd [%o0 + 0x60], %f34
  491. ldd [%o0 + 0x58], %f36
  492. ldd [%o0 + 0x50], %f38
  493. ldd [%o0 + 0x48], %f40
  494. ldd [%o0 + 0x40], %f42
  495. ldd [%o0 + 0x38], %f44
  496. ldd [%o0 + 0x30], %f46
  497. ldd [%o0 + 0x28], %f48
  498. ldd [%o0 + 0x20], %f50
  499. ldd [%o0 + 0x18], %f52
  500. ldd [%o0 + 0x10], %f54
  501. ldd [%o0 + 0x08], %f56
  502. ldd [%o0 + 0x00], %f58
  503. DECRYPT_128(20, 4, 6, 0, 2)
  504. st %f4, [%o2 + 0x00]
  505. st %f5, [%o2 + 0x04]
  506. st %f6, [%o2 + 0x08]
  507. st %f7, [%o2 + 0x0c]
  508. retl
  509. VISExit
  510. ENDPROC(aes_sparc64_decrypt_192)
  511. .align 32
  512. ENTRY(aes_sparc64_decrypt_256)
  513. /* %o0=key, %o1=input, %o2=output */
  514. VISEntry
  515. ld [%o1 + 0x00], %f4
  516. ld [%o1 + 0x04], %f5
  517. ld [%o1 + 0x08], %f6
  518. ld [%o1 + 0x0c], %f7
  519. ldd [%o0 + 0xe0], %f8
  520. ldd [%o0 + 0xe8], %f10
  521. ldd [%o0 + 0xd8], %f12
  522. ldd [%o0 + 0xd0], %f14
  523. ldd [%o0 + 0xc8], %f16
  524. fxor %f8, %f4, %f4
  525. ldd [%o0 + 0xc0], %f18
  526. fxor %f10, %f6, %f6
  527. ldd [%o0 + 0xb8], %f20
  528. AES_DROUND23(12, 4, 6, 2)
  529. ldd [%o0 + 0xb0], %f22
  530. AES_DROUND01(14, 4, 6, 0)
  531. ldd [%o0 + 0xa8], %f24
  532. AES_DROUND23(16, 0, 2, 6)
  533. ldd [%o0 + 0xa0], %f26
  534. AES_DROUND01(18, 0, 2, 4)
  535. ldd [%o0 + 0x98], %f12
  536. AES_DROUND23(20, 4, 6, 2)
  537. ldd [%o0 + 0x90], %f14
  538. AES_DROUND01(22, 4, 6, 0)
  539. ldd [%o0 + 0x88], %f16
  540. AES_DROUND23(24, 0, 2, 6)
  541. ldd [%o0 + 0x80], %f18
  542. AES_DROUND01(26, 0, 2, 4)
  543. ldd [%o0 + 0x78], %f20
  544. AES_DROUND23(12, 4, 6, 2)
  545. ldd [%o0 + 0x70], %f22
  546. AES_DROUND01(14, 4, 6, 0)
  547. ldd [%o0 + 0x68], %f24
  548. AES_DROUND23(16, 0, 2, 6)
  549. ldd [%o0 + 0x60], %f26
  550. AES_DROUND01(18, 0, 2, 4)
  551. ldd [%o0 + 0x58], %f28
  552. AES_DROUND23(20, 4, 6, 2)
  553. ldd [%o0 + 0x50], %f30
  554. AES_DROUND01(22, 4, 6, 0)
  555. ldd [%o0 + 0x48], %f32
  556. AES_DROUND23(24, 0, 2, 6)
  557. ldd [%o0 + 0x40], %f34
  558. AES_DROUND01(26, 0, 2, 4)
  559. ldd [%o0 + 0x38], %f36
  560. AES_DROUND23(28, 4, 6, 2)
  561. ldd [%o0 + 0x30], %f38
  562. AES_DROUND01(30, 4, 6, 0)
  563. ldd [%o0 + 0x28], %f40
  564. AES_DROUND23(32, 0, 2, 6)
  565. ldd [%o0 + 0x20], %f42
  566. AES_DROUND01(34, 0, 2, 4)
  567. ldd [%o0 + 0x18], %f44
  568. AES_DROUND23(36, 4, 6, 2)
  569. ldd [%o0 + 0x10], %f46
  570. AES_DROUND01(38, 4, 6, 0)
  571. ldd [%o0 + 0x08], %f48
  572. AES_DROUND23(40, 0, 2, 6)
  573. ldd [%o0 + 0x00], %f50
  574. AES_DROUND01(42, 0, 2, 4)
  575. AES_DROUND23(44, 4, 6, 2)
  576. AES_DROUND01(46, 4, 6, 0)
  577. AES_DROUND23_L(48, 0, 2, 6)
  578. AES_DROUND01_L(50, 0, 2, 4)
  579. st %f4, [%o2 + 0x00]
  580. st %f5, [%o2 + 0x04]
  581. st %f6, [%o2 + 0x08]
  582. st %f7, [%o2 + 0x0c]
  583. retl
  584. VISExit
  585. ENDPROC(aes_sparc64_decrypt_256)
  586. .align 32
  587. ENTRY(aes_sparc64_load_encrypt_keys_128)
  588. /* %o0=key */
  589. VISEntry
  590. ldd [%o0 + 0x10], %f8
  591. ldd [%o0 + 0x18], %f10
  592. ldd [%o0 + 0x20], %f12
  593. ldd [%o0 + 0x28], %f14
  594. ldd [%o0 + 0x30], %f16
  595. ldd [%o0 + 0x38], %f18
  596. ldd [%o0 + 0x40], %f20
  597. ldd [%o0 + 0x48], %f22
  598. ldd [%o0 + 0x50], %f24
  599. ldd [%o0 + 0x58], %f26
  600. ldd [%o0 + 0x60], %f28
  601. ldd [%o0 + 0x68], %f30
  602. ldd [%o0 + 0x70], %f32
  603. ldd [%o0 + 0x78], %f34
  604. ldd [%o0 + 0x80], %f36
  605. ldd [%o0 + 0x88], %f38
  606. ldd [%o0 + 0x90], %f40
  607. ldd [%o0 + 0x98], %f42
  608. ldd [%o0 + 0xa0], %f44
  609. retl
  610. ldd [%o0 + 0xa8], %f46
  611. ENDPROC(aes_sparc64_load_encrypt_keys_128)
  612. .align 32
  613. ENTRY(aes_sparc64_load_encrypt_keys_192)
  614. /* %o0=key */
  615. VISEntry
  616. ldd [%o0 + 0x10], %f8
  617. ldd [%o0 + 0x18], %f10
  618. ldd [%o0 + 0x20], %f12
  619. ldd [%o0 + 0x28], %f14
  620. ldd [%o0 + 0x30], %f16
  621. ldd [%o0 + 0x38], %f18
  622. ldd [%o0 + 0x40], %f20
  623. ldd [%o0 + 0x48], %f22
  624. ldd [%o0 + 0x50], %f24
  625. ldd [%o0 + 0x58], %f26
  626. ldd [%o0 + 0x60], %f28
  627. ldd [%o0 + 0x68], %f30
  628. ldd [%o0 + 0x70], %f32
  629. ldd [%o0 + 0x78], %f34
  630. ldd [%o0 + 0x80], %f36
  631. ldd [%o0 + 0x88], %f38
  632. ldd [%o0 + 0x90], %f40
  633. ldd [%o0 + 0x98], %f42
  634. ldd [%o0 + 0xa0], %f44
  635. ldd [%o0 + 0xa8], %f46
  636. ldd [%o0 + 0xb0], %f48
  637. ldd [%o0 + 0xb8], %f50
  638. ldd [%o0 + 0xc0], %f52
  639. retl
  640. ldd [%o0 + 0xc8], %f54
  641. ENDPROC(aes_sparc64_load_encrypt_keys_192)
  642. .align 32
  643. ENTRY(aes_sparc64_load_encrypt_keys_256)
  644. /* %o0=key */
  645. VISEntry
  646. ldd [%o0 + 0x10], %f8
  647. ldd [%o0 + 0x18], %f10
  648. ldd [%o0 + 0x20], %f12
  649. ldd [%o0 + 0x28], %f14
  650. ldd [%o0 + 0x30], %f16
  651. ldd [%o0 + 0x38], %f18
  652. ldd [%o0 + 0x40], %f20
  653. ldd [%o0 + 0x48], %f22
  654. ldd [%o0 + 0x50], %f24
  655. ldd [%o0 + 0x58], %f26
  656. ldd [%o0 + 0x60], %f28
  657. ldd [%o0 + 0x68], %f30
  658. ldd [%o0 + 0x70], %f32
  659. ldd [%o0 + 0x78], %f34
  660. ldd [%o0 + 0x80], %f36
  661. ldd [%o0 + 0x88], %f38
  662. ldd [%o0 + 0x90], %f40
  663. ldd [%o0 + 0x98], %f42
  664. ldd [%o0 + 0xa0], %f44
  665. ldd [%o0 + 0xa8], %f46
  666. ldd [%o0 + 0xb0], %f48
  667. ldd [%o0 + 0xb8], %f50
  668. ldd [%o0 + 0xc0], %f52
  669. ldd [%o0 + 0xc8], %f54
  670. ldd [%o0 + 0xd0], %f56
  671. ldd [%o0 + 0xd8], %f58
  672. ldd [%o0 + 0xe0], %f60
  673. retl
  674. ldd [%o0 + 0xe8], %f62
  675. ENDPROC(aes_sparc64_load_encrypt_keys_256)
  676. .align 32
  677. ENTRY(aes_sparc64_load_decrypt_keys_128)
  678. /* %o0=key */
  679. VISEntry
  680. ldd [%o0 + 0x98], %f8
  681. ldd [%o0 + 0x90], %f10
  682. ldd [%o0 + 0x88], %f12
  683. ldd [%o0 + 0x80], %f14
  684. ldd [%o0 + 0x78], %f16
  685. ldd [%o0 + 0x70], %f18
  686. ldd [%o0 + 0x68], %f20
  687. ldd [%o0 + 0x60], %f22
  688. ldd [%o0 + 0x58], %f24
  689. ldd [%o0 + 0x50], %f26
  690. ldd [%o0 + 0x48], %f28
  691. ldd [%o0 + 0x40], %f30
  692. ldd [%o0 + 0x38], %f32
  693. ldd [%o0 + 0x30], %f34
  694. ldd [%o0 + 0x28], %f36
  695. ldd [%o0 + 0x20], %f38
  696. ldd [%o0 + 0x18], %f40
  697. ldd [%o0 + 0x10], %f42
  698. ldd [%o0 + 0x08], %f44
  699. retl
  700. ldd [%o0 + 0x00], %f46
  701. ENDPROC(aes_sparc64_load_decrypt_keys_128)
  702. .align 32
  703. ENTRY(aes_sparc64_load_decrypt_keys_192)
  704. /* %o0=key */
  705. VISEntry
  706. ldd [%o0 + 0xb8], %f8
  707. ldd [%o0 + 0xb0], %f10
  708. ldd [%o0 + 0xa8], %f12
  709. ldd [%o0 + 0xa0], %f14
  710. ldd [%o0 + 0x98], %f16
  711. ldd [%o0 + 0x90], %f18
  712. ldd [%o0 + 0x88], %f20
  713. ldd [%o0 + 0x80], %f22
  714. ldd [%o0 + 0x78], %f24
  715. ldd [%o0 + 0x70], %f26
  716. ldd [%o0 + 0x68], %f28
  717. ldd [%o0 + 0x60], %f30
  718. ldd [%o0 + 0x58], %f32
  719. ldd [%o0 + 0x50], %f34
  720. ldd [%o0 + 0x48], %f36
  721. ldd [%o0 + 0x40], %f38
  722. ldd [%o0 + 0x38], %f40
  723. ldd [%o0 + 0x30], %f42
  724. ldd [%o0 + 0x28], %f44
  725. ldd [%o0 + 0x20], %f46
  726. ldd [%o0 + 0x18], %f48
  727. ldd [%o0 + 0x10], %f50
  728. ldd [%o0 + 0x08], %f52
  729. retl
  730. ldd [%o0 + 0x00], %f54
  731. ENDPROC(aes_sparc64_load_decrypt_keys_192)
  732. .align 32
  733. ENTRY(aes_sparc64_load_decrypt_keys_256)
  734. /* %o0=key */
  735. VISEntry
  736. ldd [%o0 + 0xd8], %f8
  737. ldd [%o0 + 0xd0], %f10
  738. ldd [%o0 + 0xc8], %f12
  739. ldd [%o0 + 0xc0], %f14
  740. ldd [%o0 + 0xb8], %f16
  741. ldd [%o0 + 0xb0], %f18
  742. ldd [%o0 + 0xa8], %f20
  743. ldd [%o0 + 0xa0], %f22
  744. ldd [%o0 + 0x98], %f24
  745. ldd [%o0 + 0x90], %f26
  746. ldd [%o0 + 0x88], %f28
  747. ldd [%o0 + 0x80], %f30
  748. ldd [%o0 + 0x78], %f32
  749. ldd [%o0 + 0x70], %f34
  750. ldd [%o0 + 0x68], %f36
  751. ldd [%o0 + 0x60], %f38
  752. ldd [%o0 + 0x58], %f40
  753. ldd [%o0 + 0x50], %f42
  754. ldd [%o0 + 0x48], %f44
  755. ldd [%o0 + 0x40], %f46
  756. ldd [%o0 + 0x38], %f48
  757. ldd [%o0 + 0x30], %f50
  758. ldd [%o0 + 0x28], %f52
  759. ldd [%o0 + 0x20], %f54
  760. ldd [%o0 + 0x18], %f56
  761. ldd [%o0 + 0x10], %f58
  762. ldd [%o0 + 0x08], %f60
  763. retl
  764. ldd [%o0 + 0x00], %f62
  765. ENDPROC(aes_sparc64_load_decrypt_keys_256)
  766. .align 32
  767. ENTRY(aes_sparc64_ecb_encrypt_128)
  768. /* %o0=key, %o1=input, %o2=output, %o3=len */
  769. ldx [%o0 + 0x00], %g1
  770. ldx [%o0 + 0x08], %g2
  771. 1: ldx [%o1 + 0x00], %g3
  772. ldx [%o1 + 0x08], %g7
  773. add %o1, 0x10, %o1
  774. xor %g1, %g3, %g3
  775. xor %g2, %g7, %g7
  776. MOVXTOD_G3_F4
  777. MOVXTOD_G7_F6
  778. ENCRYPT_128(8, 4, 6, 0, 2)
  779. std %f4, [%o2 + 0x00]
  780. std %f6, [%o2 + 0x08]
  781. subcc %o3, 0x10, %o3
  782. bne,pt %xcc, 1b
  783. add %o2, 0x10, %o2
  784. retl
  785. nop
  786. ENDPROC(aes_sparc64_ecb_encrypt_128)
  787. .align 32
  788. ENTRY(aes_sparc64_ecb_encrypt_192)
  789. /* %o0=key, %o1=input, %o2=output, %o3=len */
  790. ldx [%o0 + 0x00], %g1
  791. ldx [%o0 + 0x08], %g2
  792. 1: ldx [%o1 + 0x00], %g3
  793. ldx [%o1 + 0x08], %g7
  794. add %o1, 0x10, %o1
  795. xor %g1, %g3, %g3
  796. xor %g2, %g7, %g7
  797. MOVXTOD_G3_F4
  798. MOVXTOD_G7_F6
  799. ENCRYPT_192(8, 4, 6, 0, 2)
  800. std %f4, [%o2 + 0x00]
  801. std %f6, [%o2 + 0x08]
  802. subcc %o3, 0x10, %o3
  803. bne,pt %xcc, 1b
  804. add %o2, 0x10, %o2
  805. retl
  806. nop
  807. ENDPROC(aes_sparc64_ecb_encrypt_192)
  808. .align 32
  809. ENTRY(aes_sparc64_ecb_encrypt_256)
  810. /* %o0=key, %o1=input, %o2=output, %o3=len */
  811. ldx [%o0 + 0x00], %g1
  812. ldx [%o0 + 0x08], %g2
  813. 1: ldx [%o1 + 0x00], %g3
  814. ldx [%o1 + 0x08], %g7
  815. add %o1, 0x10, %o1
  816. xor %g1, %g3, %g3
  817. xor %g2, %g7, %g7
  818. MOVXTOD_G3_F4
  819. MOVXTOD_G7_F6
  820. ENCRYPT_256(8, 4, 6, 0, 2)
  821. std %f4, [%o2 + 0x00]
  822. std %f6, [%o2 + 0x08]
  823. subcc %o3, 0x10, %o3
  824. bne,pt %xcc, 1b
  825. add %o2, 0x10, %o2
  826. retl
  827. nop
  828. ENDPROC(aes_sparc64_ecb_encrypt_256)
  829. .align 32
  830. ENTRY(aes_sparc64_ecb_decrypt_128)
  831. /* %o0=&key[key_len], %o1=input, %o2=output, %o3=len */
  832. ldx [%o0 - 0x10], %g1
  833. ldx [%o0 - 0x08], %g2
  834. 1: ldx [%o1 + 0x00], %g3
  835. ldx [%o1 + 0x08], %g7
  836. add %o1, 0x10, %o1
  837. xor %g1, %g3, %g3
  838. xor %g2, %g7, %g7
  839. MOVXTOD_G3_F4
  840. MOVXTOD_G7_F6
  841. DECRYPT_128(8, 4, 6, 0, 2)
  842. std %f4, [%o2 + 0x00]
  843. std %f6, [%o2 + 0x08]
  844. subcc %o3, 0x10, %o3
  845. bne,pt %xcc, 1b
  846. add %o2, 0x10, %o2
  847. retl
  848. nop
  849. ENDPROC(aes_sparc64_ecb_decrypt_128)
  850. .align 32
  851. ENTRY(aes_sparc64_ecb_decrypt_192)
  852. /* %o0=&key[key_len], %o1=input, %o2=output, %o3=len */
  853. ldx [%o0 - 0x10], %g1
  854. ldx [%o0 - 0x08], %g2
  855. 1: ldx [%o1 + 0x00], %g3
  856. ldx [%o1 + 0x08], %g7
  857. add %o1, 0x10, %o1
  858. xor %g1, %g3, %g3
  859. xor %g2, %g7, %g7
  860. MOVXTOD_G3_F4
  861. MOVXTOD_G7_F6
  862. DECRYPT_192(8, 4, 6, 0, 2)
  863. std %f4, [%o2 + 0x00]
  864. std %f6, [%o2 + 0x08]
  865. subcc %o3, 0x10, %o3
  866. bne,pt %xcc, 1b
  867. add %o2, 0x10, %o2
  868. retl
  869. nop
  870. ENDPROC(aes_sparc64_ecb_decrypt_192)
  871. .align 32
  872. ENTRY(aes_sparc64_ecb_decrypt_256)
  873. /* %o0=&key[key_len], %o1=input, %o2=output, %o3=len */
  874. ldx [%o0 - 0x10], %g1
  875. ldx [%o0 - 0x08], %g2
  876. 1: ldx [%o1 + 0x00], %g3
  877. ldx [%o1 + 0x08], %g7
  878. add %o1, 0x10, %o1
  879. xor %g1, %g3, %g3
  880. xor %g2, %g7, %g7
  881. MOVXTOD_G3_F4
  882. MOVXTOD_G7_F6
  883. DECRYPT_256(8, 4, 6, 0, 2)
  884. std %f4, [%o2 + 0x00]
  885. std %f6, [%o2 + 0x08]
  886. subcc %o3, 0x10, %o3
  887. bne,pt %xcc, 1b
  888. add %o2, 0x10, %o2
  889. retl
  890. nop
  891. ENDPROC(aes_sparc64_ecb_decrypt_256)
  892. .align 32
  893. ENTRY(aes_sparc64_cbc_encrypt_128)
  894. /* %o0=key, %o1=input, %o2=output, %o3=len, %o4=IV */
  895. ldd [%o4 + 0x00], %f4
  896. ldd [%o4 + 0x08], %f6
  897. ldx [%o0 + 0x00], %g1
  898. ldx [%o0 + 0x08], %g2
  899. 1: ldx [%o1 + 0x00], %g3
  900. ldx [%o1 + 0x08], %g7
  901. add %o1, 0x10, %o1
  902. xor %g1, %g3, %g3
  903. xor %g2, %g7, %g7
  904. MOVXTOD_G3_F0
  905. MOVXTOD_G7_F2
  906. fxor %f4, %f0, %f4
  907. fxor %f6, %f2, %f6
  908. ENCRYPT_128(8, 4, 6, 0, 2)
  909. std %f4, [%o2 + 0x00]
  910. std %f6, [%o2 + 0x08]
  911. subcc %o3, 0x10, %o3
  912. bne,pt %xcc, 1b
  913. add %o2, 0x10, %o2
  914. std %f4, [%o4 + 0x00]
  915. std %f6, [%o4 + 0x08]
  916. retl
  917. nop
  918. ENDPROC(aes_sparc64_cbc_encrypt_128)
  919. .align 32
  920. ENTRY(aes_sparc64_cbc_encrypt_192)
  921. /* %o0=key, %o1=input, %o2=output, %o3=len, %o4=IV */
  922. ldd [%o4 + 0x00], %f4
  923. ldd [%o4 + 0x08], %f6
  924. ldx [%o0 + 0x00], %g1
  925. ldx [%o0 + 0x08], %g2
  926. 1: ldx [%o1 + 0x00], %g3
  927. ldx [%o1 + 0x08], %g7
  928. add %o1, 0x10, %o1
  929. xor %g1, %g3, %g3
  930. xor %g2, %g7, %g7
  931. MOVXTOD_G3_F0
  932. MOVXTOD_G7_F2
  933. fxor %f4, %f0, %f4
  934. fxor %f6, %f2, %f6
  935. ENCRYPT_192(8, 4, 6, 0, 2)
  936. std %f4, [%o2 + 0x00]
  937. std %f6, [%o2 + 0x08]
  938. subcc %o3, 0x10, %o3
  939. bne,pt %xcc, 1b
  940. add %o2, 0x10, %o2
  941. std %f4, [%o4 + 0x00]
  942. std %f6, [%o4 + 0x08]
  943. retl
  944. nop
  945. ENDPROC(aes_sparc64_cbc_encrypt_192)
  946. .align 32
  947. ENTRY(aes_sparc64_cbc_encrypt_256)
  948. /* %o0=key, %o1=input, %o2=output, %o3=len, %o4=IV */
  949. ldd [%o4 + 0x00], %f4
  950. ldd [%o4 + 0x08], %f6
  951. ldx [%o0 + 0x00], %g1
  952. ldx [%o0 + 0x08], %g2
  953. 1: ldx [%o1 + 0x00], %g3
  954. ldx [%o1 + 0x08], %g7
  955. add %o1, 0x10, %o1
  956. xor %g1, %g3, %g3
  957. xor %g2, %g7, %g7
  958. MOVXTOD_G3_F0
  959. MOVXTOD_G7_F2
  960. fxor %f4, %f0, %f4
  961. fxor %f6, %f2, %f6
  962. ENCRYPT_256(8, 4, 6, 0, 2)
  963. std %f4, [%o2 + 0x00]
  964. std %f6, [%o2 + 0x08]
  965. subcc %o3, 0x10, %o3
  966. bne,pt %xcc, 1b
  967. add %o2, 0x10, %o2
  968. std %f4, [%o4 + 0x00]
  969. std %f6, [%o4 + 0x08]
  970. retl
  971. nop
  972. ENDPROC(aes_sparc64_cbc_encrypt_256)
  973. .align 32
  974. ENTRY(aes_sparc64_cbc_decrypt_128)
  975. /* %o0=&key[key_len], %o1=input, %o2=output, %o3=len, %o4=iv */
  976. ldx [%o0 - 0x10], %g1
  977. ldx [%o0 - 0x08], %g2
  978. ldx [%o4 + 0x00], %o0
  979. ldx [%o4 + 0x08], %o5
  980. 1: ldx [%o1 + 0x00], %g3
  981. ldx [%o1 + 0x08], %g7
  982. add %o1, 0x10, %o1
  983. xor %g1, %g3, %g3
  984. xor %g2, %g7, %g7
  985. MOVXTOD_G3_F4
  986. MOVXTOD_G7_F6
  987. DECRYPT_128(8, 4, 6, 0, 2)
  988. MOVXTOD_O0_F0
  989. MOVXTOD_O5_F2
  990. xor %g1, %g3, %o0
  991. xor %g2, %g7, %o5
  992. fxor %f4, %f0, %f4
  993. fxor %f6, %f2, %f6
  994. std %f4, [%o2 + 0x00]
  995. std %f6, [%o2 + 0x08]
  996. subcc %o3, 0x10, %o3
  997. bne,pt %xcc, 1b
  998. add %o2, 0x10, %o2
  999. stx %o0, [%o4 + 0x00]
  1000. stx %o5, [%o4 + 0x08]
  1001. retl
  1002. nop
  1003. ENDPROC(aes_sparc64_cbc_decrypt_128)
  1004. .align 32
  1005. ENTRY(aes_sparc64_cbc_decrypt_192)
  1006. /* %o0=&key[key_len], %o1=input, %o2=output, %o3=len, %o4=iv */
  1007. ldx [%o0 - 0x10], %g1
  1008. ldx [%o0 - 0x08], %g2
  1009. ldx [%o4 + 0x00], %o0
  1010. ldx [%o4 + 0x08], %o5
  1011. 1: ldx [%o1 + 0x00], %g3
  1012. ldx [%o1 + 0x08], %g7
  1013. add %o1, 0x10, %o1
  1014. xor %g1, %g3, %g3
  1015. xor %g2, %g7, %g7
  1016. MOVXTOD_G3_F4
  1017. MOVXTOD_G7_F6
  1018. DECRYPT_192(8, 4, 6, 0, 2)
  1019. MOVXTOD_O0_F0
  1020. MOVXTOD_O5_F2
  1021. xor %g1, %g3, %o0
  1022. xor %g2, %g7, %o5
  1023. fxor %f4, %f0, %f4
  1024. fxor %f6, %f2, %f6
  1025. std %f4, [%o2 + 0x00]
  1026. std %f6, [%o2 + 0x08]
  1027. subcc %o3, 0x10, %o3
  1028. bne,pt %xcc, 1b
  1029. add %o2, 0x10, %o2
  1030. stx %o0, [%o4 + 0x00]
  1031. stx %o5, [%o4 + 0x08]
  1032. retl
  1033. nop
  1034. ENDPROC(aes_sparc64_cbc_decrypt_192)
  1035. .align 32
  1036. ENTRY(aes_sparc64_cbc_decrypt_256)
  1037. /* %o0=&key[key_len], %o1=input, %o2=output, %o3=len, %o4=iv */
  1038. ldx [%o0 - 0x10], %g1
  1039. ldx [%o0 - 0x08], %g2
  1040. ldx [%o4 + 0x00], %o0
  1041. ldx [%o4 + 0x08], %o5
  1042. 1: ldx [%o1 + 0x00], %g3
  1043. ldx [%o1 + 0x08], %g7
  1044. add %o1, 0x10, %o1
  1045. xor %g1, %g3, %g3
  1046. xor %g2, %g7, %g7
  1047. MOVXTOD_G3_F4
  1048. MOVXTOD_G7_F6
  1049. DECRYPT_256(8, 4, 6, 0, 2)
  1050. MOVXTOD_O0_F0
  1051. MOVXTOD_O5_F2
  1052. xor %g1, %g3, %o0
  1053. xor %g2, %g7, %o5
  1054. fxor %f4, %f0, %f4
  1055. fxor %f6, %f2, %f6
  1056. std %f4, [%o2 + 0x00]
  1057. std %f6, [%o2 + 0x08]
  1058. subcc %o3, 0x10, %o3
  1059. bne,pt %xcc, 1b
  1060. add %o2, 0x10, %o2
  1061. stx %o0, [%o4 + 0x00]
  1062. stx %o5, [%o4 + 0x08]
  1063. retl
  1064. nop
  1065. ENDPROC(aes_sparc64_cbc_decrypt_256)