OLD | NEW |
1 /* crypto/rc4/rc4_skey.c */ | 1 /* crypto/rc4/rc4_skey.c */ |
2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
3 * All rights reserved. | 3 * All rights reserved. |
4 * | 4 * |
5 * This package is an SSL implementation written | 5 * This package is an SSL implementation written |
6 * by Eric Young (eay@cryptsoft.com). | 6 * by Eric Young (eay@cryptsoft.com). |
7 * The implementation was written so as to conform with Netscapes SSL. | 7 * The implementation was written so as to conform with Netscapes SSL. |
8 * | 8 * |
9 * This library is free for commercial and non-commercial use as long as | 9 * This library is free for commercial and non-commercial use as long as |
10 * the following conditions are aheared to. The following conditions | 10 * the following conditions are aheared to. The following conditions |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
52 * | 52 * |
53 * The licence and distribution terms for any publically available version or | 53 * The licence and distribution terms for any publically available version or |
54 * derivative of this code cannot be changed. i.e. this code cannot simply be | 54 * derivative of this code cannot be changed. i.e. this code cannot simply be |
55 * copied and put under another distribution licence | 55 * copied and put under another distribution licence |
56 * [including the GNU Public Licence.] | 56 * [including the GNU Public Licence.] |
57 */ | 57 */ |
58 | 58 |
59 #include <openssl/rc4.h> | 59 #include <openssl/rc4.h> |
60 #include "rc4_locl.h" | 60 #include "rc4_locl.h" |
61 #include <openssl/opensslv.h> | 61 #include <openssl/opensslv.h> |
62 #include <openssl/crypto.h> | |
63 #ifdef OPENSSL_FIPS | |
64 #include <openssl/fips.h> | |
65 #endif | |
66 | |
67 | 62 |
68 const char RC4_version[]="RC4" OPENSSL_VERSION_PTEXT; | 63 const char RC4_version[]="RC4" OPENSSL_VERSION_PTEXT; |
69 | 64 |
70 const char *RC4_options(void) | 65 const char *RC4_options(void) |
71 { | 66 { |
72 #ifdef RC4_INDEX | 67 #ifdef RC4_INDEX |
73 if (sizeof(RC4_INT) == 1) | 68 if (sizeof(RC4_INT) == 1) |
74 return("rc4(idx,char)"); | 69 return("rc4(idx,char)"); |
75 else | 70 else |
76 return("rc4(idx,int)"); | 71 return("rc4(idx,int)"); |
77 #else | 72 #else |
78 if (sizeof(RC4_INT) == 1) | 73 if (sizeof(RC4_INT) == 1) |
79 return("rc4(ptr,char)"); | 74 return("rc4(ptr,char)"); |
80 else | 75 else |
81 return("rc4(ptr,int)"); | 76 return("rc4(ptr,int)"); |
82 #endif | 77 #endif |
83 } | 78 } |
84 | 79 |
85 /* RC4 as implemented from a posting from | 80 /* RC4 as implemented from a posting from |
86 * Newsgroups: sci.crypt | 81 * Newsgroups: sci.crypt |
87 * From: sterndark@netcom.com (David Sterndark) | 82 * From: sterndark@netcom.com (David Sterndark) |
88 * Subject: RC4 Algorithm revealed. | 83 * Subject: RC4 Algorithm revealed. |
89 * Message-ID: <sternCvKL4B.Hyy@netcom.com> | 84 * Message-ID: <sternCvKL4B.Hyy@netcom.com> |
90 * Date: Wed, 14 Sep 1994 06:35:31 GMT | 85 * Date: Wed, 14 Sep 1994 06:35:31 GMT |
91 */ | 86 */ |
92 | 87 |
93 #ifdef OPENSSL_FIPS | |
94 void private_RC4_set_key(RC4_KEY *key, int len, const unsigned char *data) | |
95 #else | |
96 void RC4_set_key(RC4_KEY *key, int len, const unsigned char *data) | 88 void RC4_set_key(RC4_KEY *key, int len, const unsigned char *data) |
97 #endif | |
98 { | 89 { |
99 register RC4_INT tmp; | 90 register RC4_INT tmp; |
100 register int id1,id2; | 91 register int id1,id2; |
101 register RC4_INT *d; | 92 register RC4_INT *d; |
102 unsigned int i; | 93 unsigned int i; |
103 | 94 |
104 d= &(key->data[0]); | 95 d= &(key->data[0]); |
105 key->x = 0; | 96 key->x = 0; |
106 key->y = 0; | 97 key->y = 0; |
107 id1=id2=0; | 98 id1=id2=0; |
(...skipping 13 matching lines...) Expand all Loading... |
121 /* | 112 /* |
122 * Unlike all other x86 [and x86_64] implementations, | 113 * Unlike all other x86 [and x86_64] implementations, |
123 * Intel P4 core [including EM64T] was found to perform | 114 * Intel P4 core [including EM64T] was found to perform |
124 * poorly with wider RC4_INT. Performance improvement | 115 * poorly with wider RC4_INT. Performance improvement |
125 * for IA-32 hand-coded assembler turned out to be 2.8x | 116 * for IA-32 hand-coded assembler turned out to be 2.8x |
126 * if re-coded for RC4_CHAR! It's however inappropriate | 117 * if re-coded for RC4_CHAR! It's however inappropriate |
127 * to just switch to RC4_CHAR for x86[_64], as non-P4 | 118 * to just switch to RC4_CHAR for x86[_64], as non-P4 |
128 * implementations suffer from significant performance | 119 * implementations suffer from significant performance |
129 * losses then, e.g. PIII exhibits >2x deterioration, | 120 * losses then, e.g. PIII exhibits >2x deterioration, |
130 * and so does Opteron. In order to assure optimal | 121 * and so does Opteron. In order to assure optimal |
131 » » * all-round performance, we detect P4 at run-time by | 122 » » * all-round performance, let us [try to] detect P4 at |
132 » » * checking upon reserved bit 20 in CPU capability | 123 » » * run-time by checking upon HTT bit in CPU capability |
133 * vector and set up compressed key schedule, which is | 124 * vector and set up compressed key schedule, which is |
134 * recognized by correspondingly updated assembler | 125 * recognized by correspondingly updated assembler |
135 » » * module... Bit 20 is set up by OPENSSL_ia32_cpuid. | 126 » » * module... |
136 » » * | |
137 * <appro@fy.chalmers.se> | 127 * <appro@fy.chalmers.se> |
138 */ | 128 */ |
139 #ifdef OPENSSL_FIPS | |
140 unsigned long *ia32cap_ptr = OPENSSL_ia32cap_loc(); | |
141 if (ia32cap_ptr && (*ia32cap_ptr & (1<<28))) { | |
142 #else | |
143 if (OPENSSL_ia32cap_P & (1<<28)) { | 129 if (OPENSSL_ia32cap_P & (1<<28)) { |
144 #endif | |
145 unsigned char *cp=(unsigned char *)d; | 130 unsigned char *cp=(unsigned char *)d; |
146 | 131 |
147 for (i=0;i<256;i++) cp[i]=i; | 132 for (i=0;i<256;i++) cp[i]=i; |
148 for (i=0;i<256;i++) SK_LOOP(cp,i); | 133 for (i=0;i<256;i++) SK_LOOP(cp,i); |
149 /* mark schedule as compressed! */ | 134 /* mark schedule as compressed! */ |
150 d[256/sizeof(RC4_INT)]=-1; | 135 d[256/sizeof(RC4_INT)]=-1; |
151 return; | 136 return; |
152 } | 137 } |
153 } | 138 } |
154 # endif | 139 # endif |
155 #endif | 140 #endif |
156 for (i=0; i < 256; i++) d[i]=i; | 141 for (i=0; i < 256; i++) d[i]=i; |
157 for (i=0; i < 256; i+=4) | 142 for (i=0; i < 256; i+=4) |
158 { | 143 { |
159 SK_LOOP(d,i+0); | 144 SK_LOOP(d,i+0); |
160 SK_LOOP(d,i+1); | 145 SK_LOOP(d,i+1); |
161 SK_LOOP(d,i+2); | 146 SK_LOOP(d,i+2); |
162 SK_LOOP(d,i+3); | 147 SK_LOOP(d,i+3); |
163 } | 148 } |
164 } | 149 } |
165 | 150 |
OLD | NEW |