10Sstevel@tonic-gate /* crypto/rc4/rc4_skey.c */ 20Sstevel@tonic-gate /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 30Sstevel@tonic-gate * All rights reserved. 40Sstevel@tonic-gate * 50Sstevel@tonic-gate * This package is an SSL implementation written 60Sstevel@tonic-gate * by Eric Young (eay@cryptsoft.com). 70Sstevel@tonic-gate * The implementation was written so as to conform with Netscapes SSL. 80Sstevel@tonic-gate * 90Sstevel@tonic-gate * This library is free for commercial and non-commercial use as long as 100Sstevel@tonic-gate * the following conditions are aheared to. The following conditions 110Sstevel@tonic-gate * apply to all code found in this distribution, be it the RC4, RSA, 120Sstevel@tonic-gate * lhash, DES, etc., code; not just the SSL code. The SSL documentation 130Sstevel@tonic-gate * included with this distribution is covered by the same copyright terms 140Sstevel@tonic-gate * except that the holder is Tim Hudson (tjh@cryptsoft.com). 150Sstevel@tonic-gate * 160Sstevel@tonic-gate * Copyright remains Eric Young's, and as such any Copyright notices in 170Sstevel@tonic-gate * the code are not to be removed. 180Sstevel@tonic-gate * If this package is used in a product, Eric Young should be given attribution 190Sstevel@tonic-gate * as the author of the parts of the library used. 200Sstevel@tonic-gate * This can be in the form of a textual message at program startup or 210Sstevel@tonic-gate * in documentation (online or textual) provided with the package. 220Sstevel@tonic-gate * 230Sstevel@tonic-gate * Redistribution and use in source and binary forms, with or without 240Sstevel@tonic-gate * modification, are permitted provided that the following conditions 250Sstevel@tonic-gate * are met: 260Sstevel@tonic-gate * 1. Redistributions of source code must retain the copyright 270Sstevel@tonic-gate * notice, this list of conditions and the following disclaimer. 280Sstevel@tonic-gate * 2. Redistributions in binary form must reproduce the above copyright 290Sstevel@tonic-gate * notice, this list of conditions and the following disclaimer in the 300Sstevel@tonic-gate * documentation and/or other materials provided with the distribution. 310Sstevel@tonic-gate * 3. All advertising materials mentioning features or use of this software 320Sstevel@tonic-gate * must display the following acknowledgement: 330Sstevel@tonic-gate * "This product includes cryptographic software written by 340Sstevel@tonic-gate * Eric Young (eay@cryptsoft.com)" 350Sstevel@tonic-gate * The word 'cryptographic' can be left out if the rouines from the library 360Sstevel@tonic-gate * being used are not cryptographic related :-). 370Sstevel@tonic-gate * 4. If you include any Windows specific code (or a derivative thereof) from 380Sstevel@tonic-gate * the apps directory (application code) you must include an acknowledgement: 390Sstevel@tonic-gate * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 400Sstevel@tonic-gate * 410Sstevel@tonic-gate * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 420Sstevel@tonic-gate * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 430Sstevel@tonic-gate * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 440Sstevel@tonic-gate * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 450Sstevel@tonic-gate * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 460Sstevel@tonic-gate * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 470Sstevel@tonic-gate * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 480Sstevel@tonic-gate * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 490Sstevel@tonic-gate * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 500Sstevel@tonic-gate * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 510Sstevel@tonic-gate * SUCH DAMAGE. 520Sstevel@tonic-gate * 530Sstevel@tonic-gate * The licence and distribution terms for any publically available version or 540Sstevel@tonic-gate * derivative of this code cannot be changed. i.e. this code cannot simply be 550Sstevel@tonic-gate * copied and put under another distribution licence 560Sstevel@tonic-gate * [including the GNU Public Licence.] 570Sstevel@tonic-gate */ 580Sstevel@tonic-gate 590Sstevel@tonic-gate /* 60*2139Sjp161948 * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 610Sstevel@tonic-gate * Use is subject to license terms. 620Sstevel@tonic-gate */ 63*2139Sjp161948 640Sstevel@tonic-gate #pragma ident "%Z%%M% %I% %E% SMI" 650Sstevel@tonic-gate 660Sstevel@tonic-gate #include <openssl/rc4.h> 670Sstevel@tonic-gate #include "rc4_locl.h" 680Sstevel@tonic-gate #include <openssl/opensslv.h> 690Sstevel@tonic-gate 700Sstevel@tonic-gate const char *RC4_version="RC4" OPENSSL_VERSION_PTEXT; 710Sstevel@tonic-gate 720Sstevel@tonic-gate const char *RC4_options(void) 730Sstevel@tonic-gate { 740Sstevel@tonic-gate #ifdef RC4_INDEX 750Sstevel@tonic-gate if (sizeof(RC4_INT) == 1) 760Sstevel@tonic-gate return("rc4(idx,char)"); 770Sstevel@tonic-gate else 780Sstevel@tonic-gate return("rc4(idx,int)"); 790Sstevel@tonic-gate #else 800Sstevel@tonic-gate if (sizeof(RC4_INT) == 1) 810Sstevel@tonic-gate return("rc4(ptr,char)"); 820Sstevel@tonic-gate else 830Sstevel@tonic-gate return("rc4(ptr,int)"); 840Sstevel@tonic-gate #endif 850Sstevel@tonic-gate } 860Sstevel@tonic-gate 870Sstevel@tonic-gate /* RC4 as implemented from a posting from 880Sstevel@tonic-gate * Newsgroups: sci.crypt 890Sstevel@tonic-gate * From: sterndark@netcom.com (David Sterndark) 900Sstevel@tonic-gate * Subject: RC4 Algorithm revealed. 910Sstevel@tonic-gate * Message-ID: <sternCvKL4B.Hyy@netcom.com> 920Sstevel@tonic-gate * Date: Wed, 14 Sep 1994 06:35:31 GMT 930Sstevel@tonic-gate */ 940Sstevel@tonic-gate 950Sstevel@tonic-gate void RC4_set_key(RC4_KEY *key, int len, const unsigned char *data) 960Sstevel@tonic-gate { 970Sstevel@tonic-gate register RC4_INT tmp; 980Sstevel@tonic-gate register int id1,id2; 990Sstevel@tonic-gate register RC4_INT *d; 1000Sstevel@tonic-gate unsigned int i; 1010Sstevel@tonic-gate 1020Sstevel@tonic-gate #ifndef CRYPTO_UNLIMITED 1030Sstevel@tonic-gate if (len > 16) 1040Sstevel@tonic-gate len = 16; 1050Sstevel@tonic-gate #endif /* CRYPTO_UNLIMITED */ 1060Sstevel@tonic-gate d= &(key->data[0]); 1070Sstevel@tonic-gate key->x = 0; 1080Sstevel@tonic-gate key->y = 0; 1090Sstevel@tonic-gate id1=id2=0; 1100Sstevel@tonic-gate 111*2139Sjp161948 #define SK_LOOP(d,n) { \ 1120Sstevel@tonic-gate tmp=d[(n)]; \ 1130Sstevel@tonic-gate id2 = (data[id1] + tmp + id2) & 0xff; \ 1140Sstevel@tonic-gate if (++id1 == len) id1=0; \ 1150Sstevel@tonic-gate d[(n)]=d[id2]; \ 1160Sstevel@tonic-gate d[id2]=tmp; } 1170Sstevel@tonic-gate 118*2139Sjp161948 #if defined(OPENSSL_CPUID_OBJ) && !defined(OPENSSL_NO_ASM) 119*2139Sjp161948 # if defined(__i386) || defined(__i386__) || defined(_M_IX86) || \ 120*2139Sjp161948 defined(__INTEL__) || \ 121*2139Sjp161948 defined(__x86_64) || defined(__x86_64__) || defined(_M_AMD64) 122*2139Sjp161948 if (sizeof(RC4_INT) > 1) { 123*2139Sjp161948 /* 124*2139Sjp161948 * Unlike all other x86 [and x86_64] implementations, 125*2139Sjp161948 * Intel P4 core [including EM64T] was found to perform 126*2139Sjp161948 * poorly with wider RC4_INT. Performance improvement 127*2139Sjp161948 * for IA-32 hand-coded assembler turned out to be 2.8x 128*2139Sjp161948 * if re-coded for RC4_CHAR! It's however inappropriate 129*2139Sjp161948 * to just switch to RC4_CHAR for x86[_64], as non-P4 130*2139Sjp161948 * implementations suffer from significant performance 131*2139Sjp161948 * losses then, e.g. PIII exhibits >2x deterioration, 132*2139Sjp161948 * and so does Opteron. In order to assure optimal 133*2139Sjp161948 * all-round performance, let us [try to] detect P4 at 134*2139Sjp161948 * run-time by checking upon HTT bit in CPU capability 135*2139Sjp161948 * vector and set up compressed key schedule, which is 136*2139Sjp161948 * recognized by correspondingly updated assembler 137*2139Sjp161948 * module... 138*2139Sjp161948 * <appro@fy.chalmers.se> 139*2139Sjp161948 */ 140*2139Sjp161948 if (OPENSSL_ia32cap_P & (1<<28)) { 141*2139Sjp161948 unsigned char *cp=(unsigned char *)d; 142*2139Sjp161948 143*2139Sjp161948 for (i=0;i<256;i++) cp[i]=i; 144*2139Sjp161948 for (i=0;i<256;i++) SK_LOOP(cp,i); 145*2139Sjp161948 /* mark schedule as compressed! */ 146*2139Sjp161948 d[256/sizeof(RC4_INT)]=-1; 147*2139Sjp161948 return; 148*2139Sjp161948 } 149*2139Sjp161948 } 150*2139Sjp161948 # endif 151*2139Sjp161948 #endif 152*2139Sjp161948 for (i=0; i < 256; i++) d[i]=i; 1530Sstevel@tonic-gate for (i=0; i < 256; i+=4) 1540Sstevel@tonic-gate { 155*2139Sjp161948 SK_LOOP(d,i+0); 156*2139Sjp161948 SK_LOOP(d,i+1); 157*2139Sjp161948 SK_LOOP(d,i+2); 158*2139Sjp161948 SK_LOOP(d,i+3); 1590Sstevel@tonic-gate } 1600Sstevel@tonic-gate } 1610Sstevel@tonic-gate 162