ssl/libcrypto/src/crypto/des/set_key.c
changeset 0 e4d67989cc36
equal deleted inserted replaced
-1:000000000000 0:e4d67989cc36
       
     1 /* crypto/des/set_key.c */
       
     2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
       
     3  * All rights reserved.
       
     4  *
       
     5  * This package is an SSL implementation written
       
     6  * by Eric Young (eay@cryptsoft.com).
       
     7  * The implementation was written so as to conform with Netscapes SSL.
       
     8  * 
       
     9  * This library is free for commercial and non-commercial use as long as
       
    10  * the following conditions are aheared to.  The following conditions
       
    11  * apply to all code found in this distribution, be it the RC4, RSA,
       
    12  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
       
    13  * included with this distribution is covered by the same copyright terms
       
    14  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
       
    15  * 
       
    16  * Copyright remains Eric Young's, and as such any Copyright notices in
       
    17  * the code are not to be removed.
       
    18  * If this package is used in a product, Eric Young should be given attribution
       
    19  * as the author of the parts of the library used.
       
    20  * This can be in the form of a textual message at program startup or
       
    21  * in documentation (online or textual) provided with the package.
       
    22  * 
       
    23  * Redistribution and use in source and binary forms, with or without
       
    24  * modification, are permitted provided that the following conditions
       
    25  * are met:
       
    26  * 1. Redistributions of source code must retain the copyright
       
    27  *    notice, this list of conditions and the following disclaimer.
       
    28  * 2. Redistributions in binary form must reproduce the above copyright
       
    29  *    notice, this list of conditions and the following disclaimer in the
       
    30  *    documentation and/or other materials provided with the distribution.
       
    31  * 3. All advertising materials mentioning features or use of this software
       
    32  *    must display the following acknowledgement:
       
    33  *    "This product includes cryptographic software written by
       
    34  *     Eric Young (eay@cryptsoft.com)"
       
    35  *    The word 'cryptographic' can be left out if the rouines from the library
       
    36  *    being used are not cryptographic related :-).
       
    37  * 4. If you include any Windows specific code (or a derivative thereof) from 
       
    38  *    the apps directory (application code) you must include an acknowledgement:
       
    39  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
       
    40  * 
       
    41  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
       
    42  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
       
    43  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
       
    44  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
       
    45  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
       
    46  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
       
    47  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
       
    48  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
       
    49  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
       
    50  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
       
    51  * SUCH DAMAGE.
       
    52  * 
       
    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
       
    55  * copied and put under another distribution licence
       
    56  * [including the GNU Public Licence.]
       
    57  */
       
    58  /*
       
    59  © Portions copyright (c) 2006 Nokia Corporation.  All rights reserved.
       
    60  */
       
    61 
       
    62 
       
    63 
       
    64 /* set_key.c v 1.4 eay 24/9/91
       
    65  * 1.4 Speed up by 400% :-)
       
    66  * 1.3 added register declarations.
       
    67  * 1.2 unrolled make_key_sched a bit more
       
    68  * 1.1 added norm_expand_bits
       
    69  * 1.0 First working version
       
    70  */
       
    71 #include "des_locl.h"
       
    72 #if (defined(SYMBIAN) && (defined(__WINSCW__) || defined(__WINS__)))
       
    73 #include "libcrypto_wsd_macros.h"
       
    74 #include "libcrypto_wsd.h"
       
    75 #endif
       
    76 
       
    77 #ifndef EMULATOR
       
    78 OPENSSL_IMPLEMENT_GLOBAL(int,DES_check_key);	/* defaults to false */
       
    79 #else
       
    80 #define DES_check_key libcrypto_ImpurePtr()->_shadow_DES_check_key
       
    81 #endif
       
    82 static const unsigned char odd_parity[256]={
       
    83   1,  1,  2,  2,  4,  4,  7,  7,  8,  8, 11, 11, 13, 13, 14, 14,
       
    84  16, 16, 19, 19, 21, 21, 22, 22, 25, 25, 26, 26, 28, 28, 31, 31,
       
    85  32, 32, 35, 35, 37, 37, 38, 38, 41, 41, 42, 42, 44, 44, 47, 47,
       
    86  49, 49, 50, 50, 52, 52, 55, 55, 56, 56, 59, 59, 61, 61, 62, 62,
       
    87  64, 64, 67, 67, 69, 69, 70, 70, 73, 73, 74, 74, 76, 76, 79, 79,
       
    88  81, 81, 82, 82, 84, 84, 87, 87, 88, 88, 91, 91, 93, 93, 94, 94,
       
    89  97, 97, 98, 98,100,100,103,103,104,104,107,107,109,109,110,110,
       
    90 112,112,115,115,117,117,118,118,121,121,122,122,124,124,127,127,
       
    91 128,128,131,131,133,133,134,134,137,137,138,138,140,140,143,143,
       
    92 145,145,146,146,148,148,151,151,152,152,155,155,157,157,158,158,
       
    93 161,161,162,162,164,164,167,167,168,168,171,171,173,173,174,174,
       
    94 176,176,179,179,181,181,182,182,185,185,186,186,188,188,191,191,
       
    95 193,193,194,194,196,196,199,199,200,200,203,203,205,205,206,206,
       
    96 208,208,211,211,213,213,214,214,217,217,218,218,220,220,223,223,
       
    97 224,224,227,227,229,229,230,230,233,233,234,234,236,236,239,239,
       
    98 241,241,242,242,244,244,247,247,248,248,251,251,253,253,254,254};
       
    99 
       
   100 EXPORT_C void DES_set_odd_parity(DES_cblock *key)
       
   101 	{
       
   102 	unsigned int i;
       
   103 
       
   104 	for (i=0; i<DES_KEY_SZ; i++)
       
   105 		(*key)[i]=odd_parity[(*key)[i]];
       
   106 	}
       
   107 
       
   108 EXPORT_C int DES_check_key_parity(const_DES_cblock *key)
       
   109 	{
       
   110 	unsigned int i;
       
   111 
       
   112 	for (i=0; i<DES_KEY_SZ; i++)
       
   113 		{
       
   114 		if ((*key)[i] != odd_parity[(*key)[i]])
       
   115 			return(0);
       
   116 		}
       
   117 	return(1);
       
   118 	}
       
   119 
       
   120 /* Weak and semi week keys as take from
       
   121  * %A D.W. Davies
       
   122  * %A W.L. Price
       
   123  * %T Security for Computer Networks
       
   124  * %I John Wiley & Sons
       
   125  * %D 1984
       
   126  * Many thanks to smb@ulysses.att.com (Steven Bellovin) for the reference
       
   127  * (and actual cblock values).
       
   128  */
       
   129 #define NUM_WEAK_KEY	16
       
   130 #ifndef EMULATOR
       
   131 static DES_cblock weak_keys[NUM_WEAK_KEY]={
       
   132 	/* weak keys */
       
   133 	{0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01},
       
   134 	{0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE},
       
   135 	{0x1F,0x1F,0x1F,0x1F,0x0E,0x0E,0x0E,0x0E},
       
   136 	{0xE0,0xE0,0xE0,0xE0,0xF1,0xF1,0xF1,0xF1},
       
   137 	/* semi-weak keys */
       
   138 	{0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE},
       
   139 	{0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01},
       
   140 	{0x1F,0xE0,0x1F,0xE0,0x0E,0xF1,0x0E,0xF1},
       
   141 	{0xE0,0x1F,0xE0,0x1F,0xF1,0x0E,0xF1,0x0E},
       
   142 	{0x01,0xE0,0x01,0xE0,0x01,0xF1,0x01,0xF1},
       
   143 	{0xE0,0x01,0xE0,0x01,0xF1,0x01,0xF1,0x01},
       
   144 	{0x1F,0xFE,0x1F,0xFE,0x0E,0xFE,0x0E,0xFE},
       
   145 	{0xFE,0x1F,0xFE,0x1F,0xFE,0x0E,0xFE,0x0E},
       
   146 	{0x01,0x1F,0x01,0x1F,0x01,0x0E,0x01,0x0E},
       
   147 	{0x1F,0x01,0x1F,0x01,0x0E,0x01,0x0E,0x01},
       
   148 	{0xE0,0xFE,0xE0,0xFE,0xF1,0xFE,0xF1,0xFE},
       
   149 	{0xFE,0xE0,0xFE,0xE0,0xFE,0xF1,0xFE,0xF1}};
       
   150 #else
       
   151 const DES_cblock temp_weak_keys[NUM_WEAK_KEY]={
       
   152 	/* weak keys */
       
   153 	{0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01},
       
   154 	{0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE},
       
   155 	{0x1F,0x1F,0x1F,0x1F,0x0E,0x0E,0x0E,0x0E},
       
   156 	{0xE0,0xE0,0xE0,0xE0,0xF1,0xF1,0xF1,0xF1},
       
   157 	/* semi-weak keys */
       
   158 	{0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE},
       
   159 	{0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01},
       
   160 	{0x1F,0xE0,0x1F,0xE0,0x0E,0xF1,0x0E,0xF1},
       
   161 	{0xE0,0x1F,0xE0,0x1F,0xF1,0x0E,0xF1,0x0E},
       
   162 	{0x01,0xE0,0x01,0xE0,0x01,0xF1,0x01,0xF1},
       
   163 	{0xE0,0x01,0xE0,0x01,0xF1,0x01,0xF1,0x01},
       
   164 	{0x1F,0xFE,0x1F,0xFE,0x0E,0xFE,0x0E,0xFE},
       
   165 	{0xFE,0x1F,0xFE,0x1F,0xFE,0x0E,0xFE,0x0E},
       
   166 	{0x01,0x1F,0x01,0x1F,0x01,0x0E,0x01,0x0E},
       
   167 	{0x1F,0x01,0x1F,0x01,0x0E,0x01,0x0E,0x01},
       
   168 	{0xE0,0xFE,0xE0,0xFE,0xF1,0xFE,0xF1,0xFE},
       
   169 	{0xFE,0xE0,0xFE,0xE0,0xFE,0xF1,0xFE,0xF1}};
       
   170 
       
   171 GET_STATIC_ARRAY_FROM_TLS(weak_keys,set_key_c,DES_cblock)
       
   172 #define weak_keys (GET_WSD_VAR_NAME(weak_keys,set_key_c, s)())
       
   173 #endif
       
   174 
       
   175 EXPORT_C int DES_is_weak_key(const_DES_cblock *key)
       
   176 	{
       
   177 	int i;
       
   178 
       
   179 	for (i=0; i<NUM_WEAK_KEY; i++)
       
   180 		/* Added == 0 to comparison, I obviously don't run
       
   181 		 * this section very often :-(, thanks to
       
   182 		 * engineering@MorningStar.Com for the fix
       
   183 		 * eay 93/06/29
       
   184 		 * Another problem, I was comparing only the first 4
       
   185 		 * bytes, 97/03/18 */
       
   186 		if (memcmp(weak_keys[i],key,sizeof(DES_cblock)) == 0) return(1);
       
   187 	return(0);
       
   188 	}
       
   189 
       
   190 /* NOW DEFINED IN des_local.h
       
   191  * See ecb_encrypt.c for a pseudo description of these macros. 
       
   192  * #define PERM_OP(a,b,t,n,m) ((t)=((((a)>>(n))^(b))&(m)),\
       
   193  * 	(b)^=(t),\
       
   194  * 	(a)=((a)^((t)<<(n))))
       
   195  */
       
   196 
       
   197 #define HPERM_OP(a,t,n,m) ((t)=((((a)<<(16-(n)))^(a))&(m)),\
       
   198 	(a)=(a)^(t)^(t>>(16-(n))))
       
   199 
       
   200 static const DES_LONG des_skb[8][64]={
       
   201 	{
       
   202 	/* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
       
   203 	0x00000000L,0x00000010L,0x20000000L,0x20000010L,
       
   204 	0x00010000L,0x00010010L,0x20010000L,0x20010010L,
       
   205 	0x00000800L,0x00000810L,0x20000800L,0x20000810L,
       
   206 	0x00010800L,0x00010810L,0x20010800L,0x20010810L,
       
   207 	0x00000020L,0x00000030L,0x20000020L,0x20000030L,
       
   208 	0x00010020L,0x00010030L,0x20010020L,0x20010030L,
       
   209 	0x00000820L,0x00000830L,0x20000820L,0x20000830L,
       
   210 	0x00010820L,0x00010830L,0x20010820L,0x20010830L,
       
   211 	0x00080000L,0x00080010L,0x20080000L,0x20080010L,
       
   212 	0x00090000L,0x00090010L,0x20090000L,0x20090010L,
       
   213 	0x00080800L,0x00080810L,0x20080800L,0x20080810L,
       
   214 	0x00090800L,0x00090810L,0x20090800L,0x20090810L,
       
   215 	0x00080020L,0x00080030L,0x20080020L,0x20080030L,
       
   216 	0x00090020L,0x00090030L,0x20090020L,0x20090030L,
       
   217 	0x00080820L,0x00080830L,0x20080820L,0x20080830L,
       
   218 	0x00090820L,0x00090830L,0x20090820L,0x20090830L,
       
   219 	},{
       
   220 	/* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */
       
   221 	0x00000000L,0x02000000L,0x00002000L,0x02002000L,
       
   222 	0x00200000L,0x02200000L,0x00202000L,0x02202000L,
       
   223 	0x00000004L,0x02000004L,0x00002004L,0x02002004L,
       
   224 	0x00200004L,0x02200004L,0x00202004L,0x02202004L,
       
   225 	0x00000400L,0x02000400L,0x00002400L,0x02002400L,
       
   226 	0x00200400L,0x02200400L,0x00202400L,0x02202400L,
       
   227 	0x00000404L,0x02000404L,0x00002404L,0x02002404L,
       
   228 	0x00200404L,0x02200404L,0x00202404L,0x02202404L,
       
   229 	0x10000000L,0x12000000L,0x10002000L,0x12002000L,
       
   230 	0x10200000L,0x12200000L,0x10202000L,0x12202000L,
       
   231 	0x10000004L,0x12000004L,0x10002004L,0x12002004L,
       
   232 	0x10200004L,0x12200004L,0x10202004L,0x12202004L,
       
   233 	0x10000400L,0x12000400L,0x10002400L,0x12002400L,
       
   234 	0x10200400L,0x12200400L,0x10202400L,0x12202400L,
       
   235 	0x10000404L,0x12000404L,0x10002404L,0x12002404L,
       
   236 	0x10200404L,0x12200404L,0x10202404L,0x12202404L,
       
   237 	},{
       
   238 	/* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */
       
   239 	0x00000000L,0x00000001L,0x00040000L,0x00040001L,
       
   240 	0x01000000L,0x01000001L,0x01040000L,0x01040001L,
       
   241 	0x00000002L,0x00000003L,0x00040002L,0x00040003L,
       
   242 	0x01000002L,0x01000003L,0x01040002L,0x01040003L,
       
   243 	0x00000200L,0x00000201L,0x00040200L,0x00040201L,
       
   244 	0x01000200L,0x01000201L,0x01040200L,0x01040201L,
       
   245 	0x00000202L,0x00000203L,0x00040202L,0x00040203L,
       
   246 	0x01000202L,0x01000203L,0x01040202L,0x01040203L,
       
   247 	0x08000000L,0x08000001L,0x08040000L,0x08040001L,
       
   248 	0x09000000L,0x09000001L,0x09040000L,0x09040001L,
       
   249 	0x08000002L,0x08000003L,0x08040002L,0x08040003L,
       
   250 	0x09000002L,0x09000003L,0x09040002L,0x09040003L,
       
   251 	0x08000200L,0x08000201L,0x08040200L,0x08040201L,
       
   252 	0x09000200L,0x09000201L,0x09040200L,0x09040201L,
       
   253 	0x08000202L,0x08000203L,0x08040202L,0x08040203L,
       
   254 	0x09000202L,0x09000203L,0x09040202L,0x09040203L,
       
   255 	},{
       
   256 	/* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */
       
   257 	0x00000000L,0x00100000L,0x00000100L,0x00100100L,
       
   258 	0x00000008L,0x00100008L,0x00000108L,0x00100108L,
       
   259 	0x00001000L,0x00101000L,0x00001100L,0x00101100L,
       
   260 	0x00001008L,0x00101008L,0x00001108L,0x00101108L,
       
   261 	0x04000000L,0x04100000L,0x04000100L,0x04100100L,
       
   262 	0x04000008L,0x04100008L,0x04000108L,0x04100108L,
       
   263 	0x04001000L,0x04101000L,0x04001100L,0x04101100L,
       
   264 	0x04001008L,0x04101008L,0x04001108L,0x04101108L,
       
   265 	0x00020000L,0x00120000L,0x00020100L,0x00120100L,
       
   266 	0x00020008L,0x00120008L,0x00020108L,0x00120108L,
       
   267 	0x00021000L,0x00121000L,0x00021100L,0x00121100L,
       
   268 	0x00021008L,0x00121008L,0x00021108L,0x00121108L,
       
   269 	0x04020000L,0x04120000L,0x04020100L,0x04120100L,
       
   270 	0x04020008L,0x04120008L,0x04020108L,0x04120108L,
       
   271 	0x04021000L,0x04121000L,0x04021100L,0x04121100L,
       
   272 	0x04021008L,0x04121008L,0x04021108L,0x04121108L,
       
   273 	},{
       
   274 	/* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
       
   275 	0x00000000L,0x10000000L,0x00010000L,0x10010000L,
       
   276 	0x00000004L,0x10000004L,0x00010004L,0x10010004L,
       
   277 	0x20000000L,0x30000000L,0x20010000L,0x30010000L,
       
   278 	0x20000004L,0x30000004L,0x20010004L,0x30010004L,
       
   279 	0x00100000L,0x10100000L,0x00110000L,0x10110000L,
       
   280 	0x00100004L,0x10100004L,0x00110004L,0x10110004L,
       
   281 	0x20100000L,0x30100000L,0x20110000L,0x30110000L,
       
   282 	0x20100004L,0x30100004L,0x20110004L,0x30110004L,
       
   283 	0x00001000L,0x10001000L,0x00011000L,0x10011000L,
       
   284 	0x00001004L,0x10001004L,0x00011004L,0x10011004L,
       
   285 	0x20001000L,0x30001000L,0x20011000L,0x30011000L,
       
   286 	0x20001004L,0x30001004L,0x20011004L,0x30011004L,
       
   287 	0x00101000L,0x10101000L,0x00111000L,0x10111000L,
       
   288 	0x00101004L,0x10101004L,0x00111004L,0x10111004L,
       
   289 	0x20101000L,0x30101000L,0x20111000L,0x30111000L,
       
   290 	0x20101004L,0x30101004L,0x20111004L,0x30111004L,
       
   291 	},{
       
   292 	/* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */
       
   293 	0x00000000L,0x08000000L,0x00000008L,0x08000008L,
       
   294 	0x00000400L,0x08000400L,0x00000408L,0x08000408L,
       
   295 	0x00020000L,0x08020000L,0x00020008L,0x08020008L,
       
   296 	0x00020400L,0x08020400L,0x00020408L,0x08020408L,
       
   297 	0x00000001L,0x08000001L,0x00000009L,0x08000009L,
       
   298 	0x00000401L,0x08000401L,0x00000409L,0x08000409L,
       
   299 	0x00020001L,0x08020001L,0x00020009L,0x08020009L,
       
   300 	0x00020401L,0x08020401L,0x00020409L,0x08020409L,
       
   301 	0x02000000L,0x0A000000L,0x02000008L,0x0A000008L,
       
   302 	0x02000400L,0x0A000400L,0x02000408L,0x0A000408L,
       
   303 	0x02020000L,0x0A020000L,0x02020008L,0x0A020008L,
       
   304 	0x02020400L,0x0A020400L,0x02020408L,0x0A020408L,
       
   305 	0x02000001L,0x0A000001L,0x02000009L,0x0A000009L,
       
   306 	0x02000401L,0x0A000401L,0x02000409L,0x0A000409L,
       
   307 	0x02020001L,0x0A020001L,0x02020009L,0x0A020009L,
       
   308 	0x02020401L,0x0A020401L,0x02020409L,0x0A020409L,
       
   309 	},{
       
   310 	/* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */
       
   311 	0x00000000L,0x00000100L,0x00080000L,0x00080100L,
       
   312 	0x01000000L,0x01000100L,0x01080000L,0x01080100L,
       
   313 	0x00000010L,0x00000110L,0x00080010L,0x00080110L,
       
   314 	0x01000010L,0x01000110L,0x01080010L,0x01080110L,
       
   315 	0x00200000L,0x00200100L,0x00280000L,0x00280100L,
       
   316 	0x01200000L,0x01200100L,0x01280000L,0x01280100L,
       
   317 	0x00200010L,0x00200110L,0x00280010L,0x00280110L,
       
   318 	0x01200010L,0x01200110L,0x01280010L,0x01280110L,
       
   319 	0x00000200L,0x00000300L,0x00080200L,0x00080300L,
       
   320 	0x01000200L,0x01000300L,0x01080200L,0x01080300L,
       
   321 	0x00000210L,0x00000310L,0x00080210L,0x00080310L,
       
   322 	0x01000210L,0x01000310L,0x01080210L,0x01080310L,
       
   323 	0x00200200L,0x00200300L,0x00280200L,0x00280300L,
       
   324 	0x01200200L,0x01200300L,0x01280200L,0x01280300L,
       
   325 	0x00200210L,0x00200310L,0x00280210L,0x00280310L,
       
   326 	0x01200210L,0x01200310L,0x01280210L,0x01280310L,
       
   327 	},{
       
   328 	/* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */
       
   329 	0x00000000L,0x04000000L,0x00040000L,0x04040000L,
       
   330 	0x00000002L,0x04000002L,0x00040002L,0x04040002L,
       
   331 	0x00002000L,0x04002000L,0x00042000L,0x04042000L,
       
   332 	0x00002002L,0x04002002L,0x00042002L,0x04042002L,
       
   333 	0x00000020L,0x04000020L,0x00040020L,0x04040020L,
       
   334 	0x00000022L,0x04000022L,0x00040022L,0x04040022L,
       
   335 	0x00002020L,0x04002020L,0x00042020L,0x04042020L,
       
   336 	0x00002022L,0x04002022L,0x00042022L,0x04042022L,
       
   337 	0x00000800L,0x04000800L,0x00040800L,0x04040800L,
       
   338 	0x00000802L,0x04000802L,0x00040802L,0x04040802L,
       
   339 	0x00002800L,0x04002800L,0x00042800L,0x04042800L,
       
   340 	0x00002802L,0x04002802L,0x00042802L,0x04042802L,
       
   341 	0x00000820L,0x04000820L,0x00040820L,0x04040820L,
       
   342 	0x00000822L,0x04000822L,0x00040822L,0x04040822L,
       
   343 	0x00002820L,0x04002820L,0x00042820L,0x04042820L,
       
   344 	0x00002822L,0x04002822L,0x00042822L,0x04042822L,
       
   345 	}};
       
   346 
       
   347 EXPORT_C int DES_set_key(const_DES_cblock *key, DES_key_schedule *schedule)
       
   348 	{
       
   349 	if (DES_check_key)
       
   350 		{
       
   351 		return DES_set_key_checked(key, schedule);
       
   352 		}
       
   353 	else
       
   354 		{
       
   355 		DES_set_key_unchecked(key, schedule);
       
   356 		return 0;
       
   357 		}
       
   358 	}
       
   359 
       
   360 /* return 0 if key parity is odd (correct),
       
   361  * return -1 if key parity error,
       
   362  * return -2 if illegal weak key.
       
   363  */
       
   364 EXPORT_C int DES_set_key_checked(const_DES_cblock *key, DES_key_schedule *schedule)
       
   365 	{
       
   366 	if (!DES_check_key_parity(key))
       
   367 		return(-1);
       
   368 	if (DES_is_weak_key(key))
       
   369 		return(-2);
       
   370 	DES_set_key_unchecked(key, schedule);
       
   371 	return 0;
       
   372 	}
       
   373 
       
   374 EXPORT_C void DES_set_key_unchecked(const_DES_cblock *key, DES_key_schedule *schedule)
       
   375 	{
       
   376 #ifndef EMULATOR	
       
   377 	static int shifts2[16]={0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0};
       
   378 #else
       
   379     static const int shifts2[16]={0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0};
       
   380 #endif	
       
   381 	register DES_LONG c,d,t,s,t2;
       
   382 	register const unsigned char *in;
       
   383 	register DES_LONG *k;
       
   384 	register int i;
       
   385 
       
   386 #ifdef OPENBSD_DEV_CRYPTO
       
   387 	memcpy(schedule->key,key,sizeof schedule->key);
       
   388 	schedule->session=NULL;
       
   389 #endif
       
   390 	k = &schedule->ks->deslong[0];
       
   391 	in = &(*key)[0];
       
   392 
       
   393 	c2l(in,c);
       
   394 	c2l(in,d);
       
   395 
       
   396 	/* do PC1 in 47 simple operations :-)
       
   397 	 * Thanks to John Fletcher (john_fletcher@lccmail.ocf.llnl.gov)
       
   398 	 * for the inspiration. :-) */
       
   399 	PERM_OP (d,c,t,4,0x0f0f0f0fL);
       
   400 	HPERM_OP(c,t,-2,0xcccc0000L);
       
   401 	HPERM_OP(d,t,-2,0xcccc0000L);
       
   402 	PERM_OP (d,c,t,1,0x55555555L);
       
   403 	PERM_OP (c,d,t,8,0x00ff00ffL);
       
   404 	PERM_OP (d,c,t,1,0x55555555L);
       
   405 	d=	(((d&0x000000ffL)<<16L)| (d&0x0000ff00L)     |
       
   406 		 ((d&0x00ff0000L)>>16L)|((c&0xf0000000L)>>4L));
       
   407 	c&=0x0fffffffL;
       
   408 
       
   409 	for (i=0; i<ITERATIONS; i++)
       
   410 		{
       
   411 		if (shifts2[i])
       
   412 			{ c=((c>>2L)|(c<<26L)); d=((d>>2L)|(d<<26L)); }
       
   413 		else
       
   414 			{ c=((c>>1L)|(c<<27L)); d=((d>>1L)|(d<<27L)); }
       
   415 		c&=0x0fffffffL;
       
   416 		d&=0x0fffffffL;
       
   417 		/* could be a few less shifts but I am to lazy at this
       
   418 		 * point in time to investigate */
       
   419 		s=	des_skb[0][ (c    )&0x3f                ]|
       
   420 			des_skb[1][((c>> 6L)&0x03)|((c>> 7L)&0x3c)]|
       
   421 			des_skb[2][((c>>13L)&0x0f)|((c>>14L)&0x30)]|
       
   422 			des_skb[3][((c>>20L)&0x01)|((c>>21L)&0x06) |
       
   423 						  ((c>>22L)&0x38)];
       
   424 		t=	des_skb[4][ (d    )&0x3f                ]|
       
   425 			des_skb[5][((d>> 7L)&0x03)|((d>> 8L)&0x3c)]|
       
   426 			des_skb[6][ (d>>15L)&0x3f                ]|
       
   427 			des_skb[7][((d>>21L)&0x0f)|((d>>22L)&0x30)];
       
   428 
       
   429 		/* table contained 0213 4657 */
       
   430 		t2=((t<<16L)|(s&0x0000ffffL))&0xffffffffL;
       
   431 		*(k++)=ROTATE(t2,30)&0xffffffffL;
       
   432 
       
   433 		t2=((s>>16L)|(t&0xffff0000L));
       
   434 		*(k++)=ROTATE(t2,26)&0xffffffffL;
       
   435 		}
       
   436 	}
       
   437 
       
   438 EXPORT_C int DES_key_sched(const_DES_cblock *key, DES_key_schedule *schedule)
       
   439 	{
       
   440 	return(DES_set_key(key,schedule));
       
   441 	}
       
   442 /*
       
   443 #undef des_fixup_key_parity
       
   444 void des_fixup_key_parity(des_cblock *key)
       
   445 	{
       
   446 	des_set_odd_parity(key);
       
   447 	}
       
   448 */