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         save    %sp,-144,%sp
  63 
  64         srl     %i1, 3, %l7
  65         ldub    [%i0+256], %g1
  66 
  67         orcc    %l7, %g0, %g0
  68         ldub    [%i0+257], %g2
  69 
  70         add     %g1, 1, %o1
  71         bz      %icc, .Loop2
  72         add     %i0, 0, %i5
  73 
  74         add     %o1, 1, %g1
  75         and     %o1, 255, %o1
  76 
  77         and     %g1, 255, %g1
  78         ldub    [%i5 + %o1], %o3
  79 
  80         ldub    [%i5 + %g1], %g3
  81 
  82         add     %g2, %o3, %o2
  83 
  84         add     %o2, %g3, %g2
  85         and     %o2, 255, %o2
  86 
  87         and     %g2, 255, %g2
  88         ldub    [%i5 + %o2], %o4
  89 
  90         stb     %o3, [%i5+%o2]
  91         subcc   %o2, %g1, %g0
  92 
  93         stb     %o4, [%i5 + %o1]
  94         bz      %icc, .L1A
  95         add     %o3,%o4,%o5
  96 .L1B:
  97         and     %o5, 255, %o5
  98         ldub    [%i5 + %g2], %g4
  99 
 100         ldub    [%i5 + %o5], %o5
 101         add     %g1, 1, %o1
 102 
 103         and     %o1, 255, %o1
 104         stb     %g3, [%i5 + %g2]
 105         add     %g3, %g4, %g5
 106 
 107         and     %g5, 255, %g5
 108         stb     %g4, [%i5 + %g1]
 109         add     %o1, 1, %g1
 110 
 111 
 112         sllx    %o5, 56, %o0
 113         ldub    [%i5 + %o1], %o3
 114         and     %g1, 255, %g1
 115 
 116         ldub    [%i5 + %g1], %g3
 117 
 118         add     %g2, %o3, %o2
 119         ldub    [%i5 + %g5], %g5
 120 
 121         add     %o2, %g3, %g2
 122         and     %o2, 255, %o2
 123 
 124         sllx    %g5, 48, %g5
 125         ldub    [%i5 + %o2], %o4
 126         and     %g2, 255, %g2
 127 
 128         or      %o0, %g5, %o0
 129         stb     %o3, [%i5+%o2]
 130         subcc   %o2, %g1, %g0
 131 
 132         stb     %o4, [%i5 + %o1]
 133         bz      %icc, .L2A
 134         add     %o3,%o4,%o5
 135 .L2B:
 136         and     %o5, 255, %o5
 137         ldub    [%i5 + %g2], %g4
 138 
 139         ldub    [%i5 + %o5], %o5
 140         add     %g1, 1, %o1
 141 
 142         and     %o1, 255, %o1
 143         stb     %g3, [%i5 + %g2]
 144         add     %g3, %g4, %g5
 145 
 146         and     %g5, 255, %g5
 147         stb     %g4, [%i5 + %g1]
 148         add     %o1, 1, %g1
 149 
 150 
 151         sllx    %o5, 40, %o5
 152         ldub    [%i5 + %o1], %o3
 153         and     %g1, 255, %g1
 154 
 155         ldub    [%i5 + %g1], %g3
 156         or      %o0, %o5, %o0
 157 
 158         add     %g2, %o3, %o2
 159         ldub    [%i5 + %g5], %g5
 160 
 161         add     %o2, %g3, %g2
 162         and     %o2, 255, %o2
 163 
 164         sllx    %g5, 32, %g5
 165         ldub    [%i5 + %o2], %o4
 166         and     %g2, 255, %g2
 167 
 168         or      %o0, %g5, %o0
 169         stb     %o3, [%i5+%o2]
 170         subcc   %o2, %g1, %g0
 171 
 172         stb     %o4, [%i5 + %o1]
 173         bz      %icc, .L3A
 174         add     %o3,%o4,%o5
 175 .L3B:
 176         and     %o5, 255, %o5
 177         ldub    [%i5 + %g2], %g4
 178 
 179         ldub    [%i5 + %o5], %o5
 180         add     %g1, 1, %o1
 181 
 182         and     %o1, 255, %o1
 183         stb     %g3, [%i5 + %g2]
 184         add     %g3, %g4, %g5
 185 
 186         and     %g5, 255, %g5
 187         stb     %g4, [%i5 + %g1]
 188         add     %o1, 1, %g1
 189 
 190 
 191         sll     %o5, 24, %o5
 192         ldub    [%i5 + %o1], %o3
 193         and     %g1, 255, %g1
 194 
 195         sub     %i1, 8, %i1
 196         ldub    [%i5 + %g1], %g3
 197         or      %o0, %o5, %o0
 198 
 199         srl     %i1, 3, %l7
 200         ldub    [%i5 + %g5], %g5
 201         add     %g2, %o3, %o2
 202 
 203         add     %o2, %g3, %g2
 204         and     %o2, 255, %o2
 205 
 206         sll     %g5, 16, %g5
 207         ldub    [%i5 + %o2], %o4
 208         and     %g2, 255, %g2
 209 
 210         or      %o0, %g5, %o0
 211         stb     %o3, [%i5+%o2]
 212         subcc   %o2, %g1, %g0
 213 
 214         stb     %o4, [%i5 + %o1]
 215         bz      %icc, .L4A
 216         add     %o3,%o4,%o5
 217 .L4B:
 218         and     %o5, 255, %o5
 219         ldub    [%i5 + %g2], %g4
 220         add     %g1, 1, %o1
 221 
 222         orcc    %l7, %g0, %g0
 223         ldub    [%i5 + %o5], %o5
 224         and     %o1, 255, %o1
 225 
 226         add     %g3, %g4, %g5
 227         stb     %g4, [%i5 + %g1]
 228         add     %o1, 1, %g1
 229 
 230         stb     %g3, [%i5 + %g2]
 231         bz      %icc, .EndLoop1
 232         and     %g5, 255, %g5
 233 
 234 
 235 .Loop1:
 236         sll     %o5, 8, %o5
 237         ldub    [%i5 + %o1], %o3
 238         and     %g1, 255, %g1
 239 
 240         ldub    [%i5 + %g1], %g3
 241         or      %o0, %o5, %o0
 242 
 243         ldub    [%i5 + %g5], %g5
 244         add     %g2, %o3, %o2
 245 
 246         add     %o2, %g3, %g2
 247         ldx     [%i2], %o7
 248         and     %o2, 255, %o2
 249 
 250         and     %g2, 255, %g2
 251         ldub    [%i5 + %o2], %o4
 252 
 253         or      %o0, %g5, %o0
 254         stb     %o3, [%i5+%o2]
 255         subcc   %o2, %g1, %g0
 256 
 257         stb     %o4, [%i5 + %o1]
 258         bz      %icc, .L5A
 259         add     %o3,%o4,%o5
 260 .L5B:
 261         and     %o5, 255, %o5
 262         ldub    [%i5 + %g2], %g4
 263 
 264         ldub    [%i5 + %o5], %o5
 265         add     %g1, 1, %o1
 266 
 267         and     %o1, 255, %o1
 268         stb     %g3, [%i5 + %g2]
 269         add     %g3, %g4, %g5
 270 
 271         and     %g5, 255, %g5
 272         stb     %g4, [%i5 + %g1]
 273         add     %o1, 1, %g1
 274 
 275 
 276         xor     %o0, %o7, %o7
 277         ldub    [%i5 + %o1], %o3
 278         and     %g1, 255, %g1
 279 
 280         sllx    %o5, 56, %o0
 281         ldub    [%i5 + %g1], %g3
 282 
 283         add     %g2, %o3, %o2
 284         ldub    [%i5 + %g5], %g5
 285 
 286         add     %o2, %g3, %g2
 287         stx     %o7, [%i3]
 288         and     %o2, 255, %o2
 289 
 290         sllx    %g5, 48, %g5
 291         ldub    [%i5 + %o2], %o4
 292         and     %g2, 255, %g2
 293 
 294         or      %o0, %g5, %o0
 295         stb     %o3, [%i5+%o2]
 296         subcc   %o2, %g1, %g0
 297 
 298         stb     %o4, [%i5 + %o1]
 299         bz      %icc, .L6A
 300         add     %o3,%o4,%o5
 301 .L6B:
 302         and     %o5, 255, %o5
 303         ldub    [%i5 + %g2], %g4
 304         add     %i3, 8, %i3
 305 
 306         add     %i2, 8, %i2
 307         ldub    [%i5 + %o5], %o5
 308         add     %g1, 1, %o1
 309 
 310         and     %o1, 255, %o1
 311         stb     %g3, [%i5 + %g2]
 312         add     %g3, %g4, %g5
 313 
 314         and     %g5, 255, %g5
 315         stb     %g4, [%i5 + %g1]
 316         add     %o1, 1, %g1
 317 
 318 
 319         sllx    %o5, 40, %o5
 320         ldub    [%i5 + %o1], %o3
 321         and     %g1, 255, %g1
 322 
 323         ldub    [%i5 + %g1], %g3
 324         or      %o0, %o5, %o0
 325 
 326         add     %g2, %o3, %o2
 327         ldub    [%i5 + %g5], %g5
 328 
 329         add     %o2, %g3, %g2
 330         and     %o2, 255, %o2
 331 
 332         sllx    %g5, 32, %g5
 333         ldub    [%i5 + %o2], %o4
 334         and     %g2, 255, %g2
 335 
 336         or      %o0, %g5, %o0
 337         stb     %o3, [%i5 + %o2]
 338         subcc   %o2, %g1, %g0
 339 
 340         stb     %o4, [%i5 + %o1]
 341         bz      %icc, .L7A
 342         add     %o3,%o4,%o5
 343 .L7B:
 344         and     %o5, 255, %o5
 345         ldub    [%i5 + %g2], %g4
 346 
 347         ldub    [%i5 + %o5], %o5
 348         add     %g1, 1, %o1
 349 
 350         and     %o1, 255, %o1
 351         stb     %g3, [%i5 + %g2]
 352         add     %g3, %g4, %g5
 353 
 354         and     %g5, 255, %g5
 355         stb     %g4, [%i5 + %g1]
 356         add     %o1, 1, %g1
 357 
 358 
 359         sll     %o5, 24, %o5
 360         ldub    [%i5 + %o1], %o3
 361         and     %g1, 255, %g1
 362 
 363         sub     %i1, 8, %i1
 364         ldub    [%i5 + %g1], %g3
 365         or      %o0, %o5, %o0
 366 
 367         srl     %i1, 3, %l7
 368         ldub    [%i5 + %g5], %g5
 369         add     %g2, %o3, %o2
 370 
 371         add     %o2, %g3, %g2
 372         and     %o2, 255, %o2
 373 
 374         sll     %g5, 16, %g5
 375         ldub    [%i5 + %o2], %o4
 376         and     %g2, 255, %g2
 377 
 378         or      %o0, %g5, %o0
 379         stb     %o3, [%i5 + %o2]
 380         subcc   %o2, %g1, %g0
 381 
 382         stb     %o4, [%i5 + %o1]
 383         bz      %icc, .L8A
 384         add     %o3,%o4,%o5
 385 .L8B:
 386         and     %o5, 255, %o5
 387         ldub    [%i5 + %g2], %g4
 388         add     %g1, 1, %o1
 389 
 390         orcc    %l7, %g0, %g0
 391         ldub    [%i5 + %o5], %o5
 392         and     %o1, 255, %o1
 393 
 394         add     %g3, %g4, %g5
 395         stb     %g4, [%i5 + %g1]
 396         add     %o1, 1, %g1
 397 
 398         stb     %g3, [%i5 + %g2]
 399         bnz     %icc, .Loop1
 400         and     %g5, 255, %g5
 401 
 402 
 403 .EndLoop1:
 404         sll     %o5, 8, %o5
 405         ldub    [%i5 + %g5], %g5
 406         orcc    %i1, %g0, %g0
 407 
 408         or      %o0, %o5, %o0
 409         ldx     [%i2], %o7
 410         sub     %g1, 2, %g1
 411 
 412         and     %g1, 255, %g1
 413         stb     %g1, [%i0 + 256]
 414         or      %o0, %g5, %o0
 415 
 416         xor     %o0, %o7, %o7
 417         stx     %o7, [%i3]
 418         add     %i2, 8, %i2
 419 
 420         add     %i3, 8, %i3
 421         bnz     %icc, .Loop2_1
 422         stb     %g2, [%i0 + 257]
 423 
 424         ret
 425         restore %g0,%g0,%g0
 426 
 427 
 428 .Loop2:
 429         orcc    %i1, %g0, %g0
 430         bnz     .Loop2_1
 431         nop
 432         ret
 433         restore %g0,%g0,%g0
 434 
 435 .Loop2_1:
 436         and     %o1, 255, %g1
 437         ldub    [%i5 + %g1], %g3
 438 
 439         add     %g2, %g3, %g2
 440 
 441         and     %g2, 255, %g2
 442 
 443         ldub    [%i5 + %g2], %g4
 444 
 445         stb     %g3, [%i5 + %g2]
 446 
 447         add     %g3, %g4, %g5
 448         stb     %g4, [%i5 + %g1]
 449 
 450         and     %g5, 255, %g5
 451         ldub    [%i2], %o0
 452 
 453         add     %g1, 1, %o1
 454         ldub    [%i5 + %g5], %g5
 455         subcc   %i1, 1, %i1
 456 
 457         add     %i2, 1, %i2
 458         add     %i3, 1, %i3
 459 
 460         xor     %o0, %g5, %o0
 461         bnz     %icc, .Loop2_1
 462         stb     %o0, [%i3 - 1]
 463 
 464         stb     %g1, [%i0 + 256]
 465 
 466         stb     %g2, [%i0 + 257]
 467 
 468         ret
 469         restore %g0,%g0,%g0
 470 
 471 .L1A:
 472         add     %o2, %o3, %g2
 473         or      %o3, %g0, %g3
 474         ba      .L1B
 475         and     %g2, 255, %g2
 476 
 477 .L2A:
 478         add     %o2, %o3, %g2
 479         or      %o3, %g0, %g3
 480         ba      .L2B
 481         and     %g2, 255, %g2
 482 
 483 .L3A:
 484         add     %o2, %o3, %g2
 485         or      %o3, %g0, %g3
 486         ba      .L3B
 487         and     %g2, 255, %g2
 488 
 489 .L4A:
 490         add     %o2, %o3, %g2
 491         or      %o3, %g0, %g3
 492         ba      .L4B
 493         and     %g2, 255, %g2
 494 
 495 .L5A:
 496         add     %o2, %o3, %g2
 497         or      %o3, %g0, %g3
 498         ba      .L5B
 499         and     %g2, 255, %g2
 500 
 501 .L6A:
 502         add     %o2, %o3, %g2
 503         or      %o3, %g0, %g3
 504         ba      .L6B
 505         and     %g2, 255, %g2
 506 
 507 .L7A:
 508         add     %o2, %o3, %g2
 509         or      %o3, %g0, %g3
 510         ba      .L7B
 511         and     %g2, 255, %g2
 512 
 513 .L8A:
 514         add     %o2, %o3, %g2
 515         or      %o3, %g0, %g3
 516         ba      .L8B
 517         and     %g2, 255, %g2
 518 
 519         .type   arcfour_crypt_aligned,2
 520         .size   arcfour_crypt_aligned,(. - arcfour_crypt_aligned)
 521 
 522 #endif  /* lint || __lint */