aes_asm.S 38 KB

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