1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 /*
  22  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  23  * Use is subject to license terms.
  24  */
  25 
  26 #if defined(lint) || defined(__lint)
  27 
  28 #include "arcfour.h"
  29 
  30 /* ARGSUSED */
  31 void
  32 arcfour_crypt_aligned(ARCFour_key *key, size_t len, uchar_t *in, uchar_t *out)
  33 {}
  34 
  35 #else   /* lint || __lint */
  36 
  37         .register       %g2,#scratch
  38         .register       %g3,#scratch
  39 
  40         .section        ".text",#alloc,#execinstr
  41         .file   "arcfour_crypt_asm.s"
  42 
  43         .section        ".text",#alloc
  44         .align  32
  45 
  46         .section        ".text",#alloc,#execinstr
  47         .align  32
  48         .skip   32
  49 
  50 /*
  51  * SUBROUTINE arcfour_crypt_aligned
  52  *
  53  * void arcfour_crypt_aligned(ARCFour_key *key, size_t len,
  54  *                      uchar_t *in, uchar_t *out);
  55  *
  56  * in and out should be aligned on an 8-byte boundary, but len can be anything
  57  */
  58         .global arcfour_crypt_aligned
  59 
  60 
  61 arcfour_crypt_aligned:
  62 
  63 /* EXPORT DELETE START */
  64         save    %sp,-144,%sp
  65 
  66         srl     %i1, 3, %l7
  67         ldub    [%i0+256], %g1
  68 
  69         orcc    %l7, %g0, %g0
  70         ldub    [%i0+257], %g2
  71 
  72         add     %g1, 1, %o1
  73         bz      %icc, .Loop2
  74         add     %i0, 0, %i5
  75 
  76         add     %o1, 1, %g1
  77         and     %o1, 255, %o1
  78 
  79         and     %g1, 255, %g1
  80         ldub    [%i5 + %o1], %o3
  81 
  82         ldub    [%i5 + %g1], %g3
  83 
  84         add     %g2, %o3, %o2
  85 
  86         add     %o2, %g3, %g2
  87         and     %o2, 255, %o2
  88 
  89         and     %g2, 255, %g2
  90         ldub    [%i5 + %o2], %o4
  91 
  92         stb     %o3, [%i5+%o2]
  93         subcc   %o2, %g1, %g0
  94 
  95         stb     %o4, [%i5 + %o1]
  96         bz      %icc, .L1A
  97         add     %o3,%o4,%o5
  98 .L1B:
  99         and     %o5, 255, %o5
 100         ldub    [%i5 + %g2], %g4
 101 
 102         ldub    [%i5 + %o5], %o5
 103         add     %g1, 1, %o1
 104 
 105         and     %o1, 255, %o1
 106         stb     %g3, [%i5 + %g2]
 107         add     %g3, %g4, %g5
 108 
 109         and     %g5, 255, %g5
 110         stb     %g4, [%i5 + %g1]
 111         add     %o1, 1, %g1
 112 
 113 
 114         sllx    %o5, 56, %o0
 115         ldub    [%i5 + %o1], %o3
 116         and     %g1, 255, %g1
 117 
 118         ldub    [%i5 + %g1], %g3
 119 
 120         add     %g2, %o3, %o2
 121         ldub    [%i5 + %g5], %g5
 122 
 123         add     %o2, %g3, %g2
 124         and     %o2, 255, %o2
 125 
 126         sllx    %g5, 48, %g5
 127         ldub    [%i5 + %o2], %o4
 128         and     %g2, 255, %g2
 129 
 130         or      %o0, %g5, %o0
 131         stb     %o3, [%i5+%o2]
 132         subcc   %o2, %g1, %g0
 133 
 134         stb     %o4, [%i5 + %o1]
 135         bz      %icc, .L2A
 136         add     %o3,%o4,%o5
 137 .L2B:
 138         and     %o5, 255, %o5
 139         ldub    [%i5 + %g2], %g4
 140 
 141         ldub    [%i5 + %o5], %o5
 142         add     %g1, 1, %o1
 143 
 144         and     %o1, 255, %o1
 145         stb     %g3, [%i5 + %g2]
 146         add     %g3, %g4, %g5
 147 
 148         and     %g5, 255, %g5
 149         stb     %g4, [%i5 + %g1]
 150         add     %o1, 1, %g1
 151 
 152 
 153         sllx    %o5, 40, %o5
 154         ldub    [%i5 + %o1], %o3
 155         and     %g1, 255, %g1
 156 
 157         ldub    [%i5 + %g1], %g3
 158         or      %o0, %o5, %o0
 159 
 160         add     %g2, %o3, %o2
 161         ldub    [%i5 + %g5], %g5
 162 
 163         add     %o2, %g3, %g2
 164         and     %o2, 255, %o2
 165 
 166         sllx    %g5, 32, %g5
 167         ldub    [%i5 + %o2], %o4
 168         and     %g2, 255, %g2
 169 
 170         or      %o0, %g5, %o0
 171         stb     %o3, [%i5+%o2]
 172         subcc   %o2, %g1, %g0
 173 
 174         stb     %o4, [%i5 + %o1]
 175         bz      %icc, .L3A
 176         add     %o3,%o4,%o5
 177 .L3B:
 178         and     %o5, 255, %o5
 179         ldub    [%i5 + %g2], %g4
 180 
 181         ldub    [%i5 + %o5], %o5
 182         add     %g1, 1, %o1
 183 
 184         and     %o1, 255, %o1
 185         stb     %g3, [%i5 + %g2]
 186         add     %g3, %g4, %g5
 187 
 188         and     %g5, 255, %g5
 189         stb     %g4, [%i5 + %g1]
 190         add     %o1, 1, %g1
 191 
 192 
 193         sll     %o5, 24, %o5
 194         ldub    [%i5 + %o1], %o3
 195         and     %g1, 255, %g1
 196 
 197         sub     %i1, 8, %i1
 198         ldub    [%i5 + %g1], %g3
 199         or      %o0, %o5, %o0
 200 
 201         srl     %i1, 3, %l7
 202         ldub    [%i5 + %g5], %g5
 203         add     %g2, %o3, %o2
 204 
 205         add     %o2, %g3, %g2
 206         and     %o2, 255, %o2
 207 
 208         sll     %g5, 16, %g5
 209         ldub    [%i5 + %o2], %o4
 210         and     %g2, 255, %g2
 211 
 212         or      %o0, %g5, %o0
 213         stb     %o3, [%i5+%o2]
 214         subcc   %o2, %g1, %g0
 215 
 216         stb     %o4, [%i5 + %o1]
 217         bz      %icc, .L4A
 218         add     %o3,%o4,%o5
 219 .L4B:
 220         and     %o5, 255, %o5
 221         ldub    [%i5 + %g2], %g4
 222         add     %g1, 1, %o1
 223 
 224         orcc    %l7, %g0, %g0
 225         ldub    [%i5 + %o5], %o5
 226         and     %o1, 255, %o1
 227 
 228         add     %g3, %g4, %g5
 229         stb     %g4, [%i5 + %g1]
 230         add     %o1, 1, %g1
 231 
 232         stb     %g3, [%i5 + %g2]
 233         bz      %icc, .EndLoop1
 234         and     %g5, 255, %g5
 235 
 236 
 237 .Loop1:
 238         sll     %o5, 8, %o5
 239         ldub    [%i5 + %o1], %o3
 240         and     %g1, 255, %g1
 241 
 242         ldub    [%i5 + %g1], %g3
 243         or      %o0, %o5, %o0
 244 
 245         ldub    [%i5 + %g5], %g5
 246         add     %g2, %o3, %o2
 247 
 248         add     %o2, %g3, %g2
 249         ldx     [%i2], %o7
 250         and     %o2, 255, %o2
 251 
 252         and     %g2, 255, %g2
 253         ldub    [%i5 + %o2], %o4
 254 
 255         or      %o0, %g5, %o0
 256         stb     %o3, [%i5+%o2]
 257         subcc   %o2, %g1, %g0
 258 
 259         stb     %o4, [%i5 + %o1]
 260         bz      %icc, .L5A
 261         add     %o3,%o4,%o5
 262 .L5B:
 263         and     %o5, 255, %o5
 264         ldub    [%i5 + %g2], %g4
 265 
 266         ldub    [%i5 + %o5], %o5
 267         add     %g1, 1, %o1
 268 
 269         and     %o1, 255, %o1
 270         stb     %g3, [%i5 + %g2]
 271         add     %g3, %g4, %g5
 272 
 273         and     %g5, 255, %g5
 274         stb     %g4, [%i5 + %g1]
 275         add     %o1, 1, %g1
 276 
 277 
 278         xor     %o0, %o7, %o7
 279         ldub    [%i5 + %o1], %o3
 280         and     %g1, 255, %g1
 281 
 282         sllx    %o5, 56, %o0
 283         ldub    [%i5 + %g1], %g3
 284 
 285         add     %g2, %o3, %o2
 286         ldub    [%i5 + %g5], %g5
 287 
 288         add     %o2, %g3, %g2
 289         stx     %o7, [%i3]
 290         and     %o2, 255, %o2
 291 
 292         sllx    %g5, 48, %g5
 293         ldub    [%i5 + %o2], %o4
 294         and     %g2, 255, %g2
 295 
 296         or      %o0, %g5, %o0
 297         stb     %o3, [%i5+%o2]
 298         subcc   %o2, %g1, %g0
 299 
 300         stb     %o4, [%i5 + %o1]
 301         bz      %icc, .L6A
 302         add     %o3,%o4,%o5
 303 .L6B:
 304         and     %o5, 255, %o5
 305         ldub    [%i5 + %g2], %g4
 306         add     %i3, 8, %i3
 307 
 308         add     %i2, 8, %i2
 309         ldub    [%i5 + %o5], %o5
 310         add     %g1, 1, %o1
 311 
 312         and     %o1, 255, %o1
 313         stb     %g3, [%i5 + %g2]
 314         add     %g3, %g4, %g5
 315 
 316         and     %g5, 255, %g5
 317         stb     %g4, [%i5 + %g1]
 318         add     %o1, 1, %g1
 319 
 320 
 321         sllx    %o5, 40, %o5
 322         ldub    [%i5 + %o1], %o3
 323         and     %g1, 255, %g1
 324 
 325         ldub    [%i5 + %g1], %g3
 326         or      %o0, %o5, %o0
 327 
 328         add     %g2, %o3, %o2
 329         ldub    [%i5 + %g5], %g5
 330 
 331         add     %o2, %g3, %g2
 332         and     %o2, 255, %o2
 333 
 334         sllx    %g5, 32, %g5
 335         ldub    [%i5 + %o2], %o4
 336         and     %g2, 255, %g2
 337 
 338         or      %o0, %g5, %o0
 339         stb     %o3, [%i5 + %o2]
 340         subcc   %o2, %g1, %g0
 341 
 342         stb     %o4, [%i5 + %o1]
 343         bz      %icc, .L7A
 344         add     %o3,%o4,%o5
 345 .L7B:
 346         and     %o5, 255, %o5
 347         ldub    [%i5 + %g2], %g4
 348 
 349         ldub    [%i5 + %o5], %o5
 350         add     %g1, 1, %o1
 351 
 352         and     %o1, 255, %o1
 353         stb     %g3, [%i5 + %g2]
 354         add     %g3, %g4, %g5
 355 
 356         and     %g5, 255, %g5
 357         stb     %g4, [%i5 + %g1]
 358         add     %o1, 1, %g1
 359 
 360 
 361         sll     %o5, 24, %o5
 362         ldub    [%i5 + %o1], %o3
 363         and     %g1, 255, %g1
 364 
 365         sub     %i1, 8, %i1
 366         ldub    [%i5 + %g1], %g3
 367         or      %o0, %o5, %o0
 368 
 369         srl     %i1, 3, %l7
 370         ldub    [%i5 + %g5], %g5
 371         add     %g2, %o3, %o2
 372 
 373         add     %o2, %g3, %g2
 374         and     %o2, 255, %o2
 375 
 376         sll     %g5, 16, %g5
 377         ldub    [%i5 + %o2], %o4
 378         and     %g2, 255, %g2
 379 
 380         or      %o0, %g5, %o0
 381         stb     %o3, [%i5 + %o2]
 382         subcc   %o2, %g1, %g0
 383 
 384         stb     %o4, [%i5 + %o1]
 385         bz      %icc, .L8A
 386         add     %o3,%o4,%o5
 387 .L8B:
 388         and     %o5, 255, %o5
 389         ldub    [%i5 + %g2], %g4
 390         add     %g1, 1, %o1
 391 
 392         orcc    %l7, %g0, %g0
 393         ldub    [%i5 + %o5], %o5
 394         and     %o1, 255, %o1
 395 
 396         add     %g3, %g4, %g5
 397         stb     %g4, [%i5 + %g1]
 398         add     %o1, 1, %g1
 399 
 400         stb     %g3, [%i5 + %g2]
 401         bnz     %icc, .Loop1
 402         and     %g5, 255, %g5
 403 
 404 
 405 .EndLoop1:
 406         sll     %o5, 8, %o5
 407         ldub    [%i5 + %g5], %g5
 408         orcc    %i1, %g0, %g0
 409 
 410         or      %o0, %o5, %o0
 411         ldx     [%i2], %o7
 412         sub     %g1, 2, %g1
 413 
 414         and     %g1, 255, %g1
 415         stb     %g1, [%i0 + 256]
 416         or      %o0, %g5, %o0
 417 
 418         xor     %o0, %o7, %o7
 419         stx     %o7, [%i3]
 420         add     %i2, 8, %i2
 421 
 422         add     %i3, 8, %i3
 423         bnz     %icc, .Loop2_1
 424         stb     %g2, [%i0 + 257]
 425 
 426         ret
 427         restore %g0,%g0,%g0
 428 
 429 
 430 .Loop2:
 431         orcc    %i1, %g0, %g0
 432         bnz     .Loop2_1
 433         nop
 434         ret
 435         restore %g0,%g0,%g0
 436 
 437 .Loop2_1:
 438         and     %o1, 255, %g1
 439         ldub    [%i5 + %g1], %g3
 440 
 441         add     %g2, %g3, %g2
 442 
 443         and     %g2, 255, %g2
 444 
 445         ldub    [%i5 + %g2], %g4
 446 
 447         stb     %g3, [%i5 + %g2]
 448 
 449         add     %g3, %g4, %g5
 450         stb     %g4, [%i5 + %g1]
 451 
 452         and     %g5, 255, %g5
 453         ldub    [%i2], %o0
 454 
 455         add     %g1, 1, %o1
 456         ldub    [%i5 + %g5], %g5
 457         subcc   %i1, 1, %i1
 458 
 459         add     %i2, 1, %i2
 460         add     %i3, 1, %i3
 461 
 462         xor     %o0, %g5, %o0
 463         bnz     %icc, .Loop2_1
 464         stb     %o0, [%i3 - 1]
 465 
 466         stb     %g1, [%i0 + 256]
 467 
 468         stb     %g2, [%i0 + 257]
 469 
 470         ret
 471         restore %g0,%g0,%g0
 472 
 473 .L1A:
 474         add     %o2, %o3, %g2
 475         or      %o3, %g0, %g3
 476         ba      .L1B
 477         and     %g2, 255, %g2
 478 
 479 .L2A:
 480         add     %o2, %o3, %g2
 481         or      %o3, %g0, %g3
 482         ba      .L2B
 483         and     %g2, 255, %g2
 484 
 485 .L3A:
 486         add     %o2, %o3, %g2
 487         or      %o3, %g0, %g3
 488         ba      .L3B
 489         and     %g2, 255, %g2
 490 
 491 .L4A:
 492         add     %o2, %o3, %g2
 493         or      %o3, %g0, %g3
 494         ba      .L4B
 495         and     %g2, 255, %g2
 496 
 497 .L5A:
 498         add     %o2, %o3, %g2
 499         or      %o3, %g0, %g3
 500         ba      .L5B
 501         and     %g2, 255, %g2
 502 
 503 .L6A:
 504         add     %o2, %o3, %g2
 505         or      %o3, %g0, %g3
 506         ba      .L6B
 507         and     %g2, 255, %g2
 508 
 509 .L7A:
 510         add     %o2, %o3, %g2
 511         or      %o3, %g0, %g3
 512         ba      .L7B
 513         and     %g2, 255, %g2
 514 
 515 .L8A:
 516         add     %o2, %o3, %g2
 517         or      %o3, %g0, %g3
 518         ba      .L8B
 519         and     %g2, 255, %g2
 520 
 521 /* EXPORT DELETE END */
 522         .type   arcfour_crypt_aligned,2
 523         .size   arcfour_crypt_aligned,(. - arcfour_crypt_aligned)
 524 
 525 #endif  /* lint || __lint */