aes_asm.S 33 KB

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