POK
/home/jaouen/pok_official/pok/trunk/libpok/protocols/des/set_key.c
00001 /*
00002  *                               POK header
00003  * 
00004  * The following file is a part of the POK project. Any modification should
00005  * made according to the POK licence. You CANNOT use this file or a part of
00006  * this file is this part of a file for your own project
00007  *
00008  * For more information on the POK licence, please see our LICENCE FILE
00009  *
00010  * Please follow the coding guidelines described in doc/CODING_GUIDELINES
00011  *
00012  *                                      Copyright (c) 2007-2009 POK team 
00013  *
00014  * Created by julien on Tue Dec  8 15:53:28 2009 
00015  */
00016 
00017 /* crypto/des/set_key.c */
00018 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
00019  * All rights reserved.
00020  *
00021  * This package is an SSL implementation written
00022  * by Eric Young (eay@cryptsoft.com).
00023  * The implementation was written so as to conform with Netscapes SSL.
00024  * 
00025  * This library is free for commercial and non-commercial use as long as
00026  * the following conditions are aheared to.  The following conditions
00027  * apply to all code found in this distribution, be it the RC4, RSA,
00028  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
00029  * included with this distribution is covered by the same copyright terms
00030  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
00031  * 
00032  * Copyright remains Eric Young's, and as such any Copyright notices in
00033  * the code are not to be removed.
00034  * If this package is used in a product, Eric Young should be given attribution
00035  * as the author of the parts of the library used.
00036  * This can be in the form of a textual message at program startup or
00037  * in documentation (online or textual) provided with the package.
00038  * 
00039  * Redistribution and use in source and binary forms, with or without
00040  * modification, are permitted provided that the following conditions
00041  * are met:
00042  * 1. Redistributions of source code must retain the copyright
00043  *    notice, this list of conditions and the following disclaimer.
00044  * 2. Redistributions in binary form must reproduce the above copyright
00045  *    notice, this list of conditions and the following disclaimer in the
00046  *    documentation and/or other materials provided with the distribution.
00047  * 3. All advertising materials mentioning features or use of this software
00048  *    must display the following acknowledgement:
00049  *    "This product includes cryptographic software written by
00050  *     Eric Young (eay@cryptsoft.com)"
00051  *    The word 'cryptographic' can be left out if the rouines from the library
00052  *    being used are not cryptographic related :-).
00053  * 4. If you include any Windows specific code (or a derivative thereof) from 
00054  *    the apps directory (application code) you must include an acknowledgement:
00055  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
00056  * 
00057  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
00058  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00059  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00060  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
00061  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
00062  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
00063  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
00064  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
00065  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
00066  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
00067  * SUCH DAMAGE.
00068  * 
00069  * The licence and distribution terms for any publically available version or
00070  * derivative of this code cannot be changed.  i.e. this code cannot simply be
00071  * copied and put under another distribution licence
00072  * [including the GNU Public Licence.]
00073  */
00074 
00075 /* set_key.c v 1.4 eay 24/9/91
00076  * 1.4 Speed up by 400% :-)
00077  * 1.3 added register declarations.
00078  * 1.2 unrolled make_key_sched a bit more
00079  * 1.1 added norm_expand_bits
00080  * 1.0 First working version
00081  */
00082 
00083 
00084 #ifdef POK_NEEDS_PROTOCOLS_DES
00085 
00086 #include "des_locl.h"
00087 #ifdef OPENSSL_FIPS
00088 #include <openssl/fips.h>
00089 #endif
00090 
00091 
00092 OPENSSL_IMPLEMENT_GLOBAL(int,DES_check_key);    /* defaults to false */
00093 
00094 static const unsigned char odd_parity[256]={
00095   1,  1,  2,  2,  4,  4,  7,  7,  8,  8, 11, 11, 13, 13, 14, 14,
00096  16, 16, 19, 19, 21, 21, 22, 22, 25, 25, 26, 26, 28, 28, 31, 31,
00097  32, 32, 35, 35, 37, 37, 38, 38, 41, 41, 42, 42, 44, 44, 47, 47,
00098  49, 49, 50, 50, 52, 52, 55, 55, 56, 56, 59, 59, 61, 61, 62, 62,
00099  64, 64, 67, 67, 69, 69, 70, 70, 73, 73, 74, 74, 76, 76, 79, 79,
00100  81, 81, 82, 82, 84, 84, 87, 87, 88, 88, 91, 91, 93, 93, 94, 94,
00101  97, 97, 98, 98,100,100,103,103,104,104,107,107,109,109,110,110,
00102 112,112,115,115,117,117,118,118,121,121,122,122,124,124,127,127,
00103 128,128,131,131,133,133,134,134,137,137,138,138,140,140,143,143,
00104 145,145,146,146,148,148,151,151,152,152,155,155,157,157,158,158,
00105 161,161,162,162,164,164,167,167,168,168,171,171,173,173,174,174,
00106 176,176,179,179,181,181,182,182,185,185,186,186,188,188,191,191,
00107 193,193,194,194,196,196,199,199,200,200,203,203,205,205,206,206,
00108 208,208,211,211,213,213,214,214,217,217,218,218,220,220,223,223,
00109 224,224,227,227,229,229,230,230,233,233,234,234,236,236,239,239,
00110 241,241,242,242,244,244,247,247,248,248,251,251,253,253,254,254};
00111 
00112 void DES_set_odd_parity(DES_cblock *key)
00113         {
00114         unsigned int i;
00115 
00116         for (i=0; i<DES_KEY_SZ; i++)
00117                 (*key)[i]=odd_parity[(*key)[i]];
00118         }
00119 
00120 int DES_check_key_parity(const_DES_cblock *key)
00121         {
00122         unsigned int i;
00123 
00124         for (i=0; i<DES_KEY_SZ; i++)
00125                 {
00126                 if ((*key)[i] != odd_parity[(*key)[i]])
00127                         return(0);
00128                 }
00129         return(1);
00130         }
00131 
00132 /* Weak and semi week keys as take from
00133  * %A D.W. Davies
00134  * %A W.L. Price
00135  * %T Security for Computer Networks
00136  * %I John Wiley & Sons
00137  * %D 1984
00138  * Many thanks to smb@ulysses.att.com (Steven Bellovin) for the reference
00139  * (and actual cblock values).
00140  */
00141 #define NUM_WEAK_KEY    16
00142 static const DES_cblock weak_keys[NUM_WEAK_KEY]={
00143         /* weak keys */
00144         {0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01},
00145         {0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE},
00146         {0x1F,0x1F,0x1F,0x1F,0x0E,0x0E,0x0E,0x0E},
00147         {0xE0,0xE0,0xE0,0xE0,0xF1,0xF1,0xF1,0xF1},
00148         /* semi-weak keys */
00149         {0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE},
00150         {0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01},
00151         {0x1F,0xE0,0x1F,0xE0,0x0E,0xF1,0x0E,0xF1},
00152         {0xE0,0x1F,0xE0,0x1F,0xF1,0x0E,0xF1,0x0E},
00153         {0x01,0xE0,0x01,0xE0,0x01,0xF1,0x01,0xF1},
00154         {0xE0,0x01,0xE0,0x01,0xF1,0x01,0xF1,0x01},
00155         {0x1F,0xFE,0x1F,0xFE,0x0E,0xFE,0x0E,0xFE},
00156         {0xFE,0x1F,0xFE,0x1F,0xFE,0x0E,0xFE,0x0E},
00157         {0x01,0x1F,0x01,0x1F,0x01,0x0E,0x01,0x0E},
00158         {0x1F,0x01,0x1F,0x01,0x0E,0x01,0x0E,0x01},
00159         {0xE0,0xFE,0xE0,0xFE,0xF1,0xFE,0xF1,0xFE},
00160         {0xFE,0xE0,0xFE,0xE0,0xFE,0xF1,0xFE,0xF1}};
00161 
00162 int DES_is_weak_key(const_DES_cblock *key)
00163         {
00164         int i;
00165 
00166         for (i=0; i<NUM_WEAK_KEY; i++)
00167                 /* Added == 0 to comparison, I obviously don't run
00168                  * this section very often :-(, thanks to
00169                  * engineering@MorningStar.Com for the fix
00170                  * eay 93/06/29
00171                  * Another problem, I was comparing only the first 4
00172                  * bytes, 97/03/18 */
00173                 if (memcmp(weak_keys[i],key,sizeof(DES_cblock)) == 0) return(1);
00174         return(0);
00175         }
00176 
00177 /* NOW DEFINED IN des_local.h
00178  * See ecb_encrypt.c for a pseudo description of these macros. 
00179  * #define PERM_OP(a,b,t,n,m) ((t)=((((a)>>(n))^(b))&(m)),\
00180  *      (b)^=(t),\
00181  *      (a)=((a)^((t)<<(n))))
00182  */
00183 
00184 #define HPERM_OP(a,t,n,m) ((t)=((((a)<<(16-(n)))^(a))&(m)),\
00185         (a)=(a)^(t)^(t>>(16-(n))))
00186 
00187 static const DES_LONG des_skb[8][64]={
00188         {
00189         /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
00190         0x00000000L,0x00000010L,0x20000000L,0x20000010L,
00191         0x00010000L,0x00010010L,0x20010000L,0x20010010L,
00192         0x00000800L,0x00000810L,0x20000800L,0x20000810L,
00193         0x00010800L,0x00010810L,0x20010800L,0x20010810L,
00194         0x00000020L,0x00000030L,0x20000020L,0x20000030L,
00195         0x00010020L,0x00010030L,0x20010020L,0x20010030L,
00196         0x00000820L,0x00000830L,0x20000820L,0x20000830L,
00197         0x00010820L,0x00010830L,0x20010820L,0x20010830L,
00198         0x00080000L,0x00080010L,0x20080000L,0x20080010L,
00199         0x00090000L,0x00090010L,0x20090000L,0x20090010L,
00200         0x00080800L,0x00080810L,0x20080800L,0x20080810L,
00201         0x00090800L,0x00090810L,0x20090800L,0x20090810L,
00202         0x00080020L,0x00080030L,0x20080020L,0x20080030L,
00203         0x00090020L,0x00090030L,0x20090020L,0x20090030L,
00204         0x00080820L,0x00080830L,0x20080820L,0x20080830L,
00205         0x00090820L,0x00090830L,0x20090820L,0x20090830L,
00206         },{
00207         /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */
00208         0x00000000L,0x02000000L,0x00002000L,0x02002000L,
00209         0x00200000L,0x02200000L,0x00202000L,0x02202000L,
00210         0x00000004L,0x02000004L,0x00002004L,0x02002004L,
00211         0x00200004L,0x02200004L,0x00202004L,0x02202004L,
00212         0x00000400L,0x02000400L,0x00002400L,0x02002400L,
00213         0x00200400L,0x02200400L,0x00202400L,0x02202400L,
00214         0x00000404L,0x02000404L,0x00002404L,0x02002404L,
00215         0x00200404L,0x02200404L,0x00202404L,0x02202404L,
00216         0x10000000L,0x12000000L,0x10002000L,0x12002000L,
00217         0x10200000L,0x12200000L,0x10202000L,0x12202000L,
00218         0x10000004L,0x12000004L,0x10002004L,0x12002004L,
00219         0x10200004L,0x12200004L,0x10202004L,0x12202004L,
00220         0x10000400L,0x12000400L,0x10002400L,0x12002400L,
00221         0x10200400L,0x12200400L,0x10202400L,0x12202400L,
00222         0x10000404L,0x12000404L,0x10002404L,0x12002404L,
00223         0x10200404L,0x12200404L,0x10202404L,0x12202404L,
00224         },{
00225         /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */
00226         0x00000000L,0x00000001L,0x00040000L,0x00040001L,
00227         0x01000000L,0x01000001L,0x01040000L,0x01040001L,
00228         0x00000002L,0x00000003L,0x00040002L,0x00040003L,
00229         0x01000002L,0x01000003L,0x01040002L,0x01040003L,
00230         0x00000200L,0x00000201L,0x00040200L,0x00040201L,
00231         0x01000200L,0x01000201L,0x01040200L,0x01040201L,
00232         0x00000202L,0x00000203L,0x00040202L,0x00040203L,
00233         0x01000202L,0x01000203L,0x01040202L,0x01040203L,
00234         0x08000000L,0x08000001L,0x08040000L,0x08040001L,
00235         0x09000000L,0x09000001L,0x09040000L,0x09040001L,
00236         0x08000002L,0x08000003L,0x08040002L,0x08040003L,
00237         0x09000002L,0x09000003L,0x09040002L,0x09040003L,
00238         0x08000200L,0x08000201L,0x08040200L,0x08040201L,
00239         0x09000200L,0x09000201L,0x09040200L,0x09040201L,
00240         0x08000202L,0x08000203L,0x08040202L,0x08040203L,
00241         0x09000202L,0x09000203L,0x09040202L,0x09040203L,
00242         },{
00243         /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */
00244         0x00000000L,0x00100000L,0x00000100L,0x00100100L,
00245         0x00000008L,0x00100008L,0x00000108L,0x00100108L,
00246         0x00001000L,0x00101000L,0x00001100L,0x00101100L,
00247         0x00001008L,0x00101008L,0x00001108L,0x00101108L,
00248         0x04000000L,0x04100000L,0x04000100L,0x04100100L,
00249         0x04000008L,0x04100008L,0x04000108L,0x04100108L,
00250         0x04001000L,0x04101000L,0x04001100L,0x04101100L,
00251         0x04001008L,0x04101008L,0x04001108L,0x04101108L,
00252         0x00020000L,0x00120000L,0x00020100L,0x00120100L,
00253         0x00020008L,0x00120008L,0x00020108L,0x00120108L,
00254         0x00021000L,0x00121000L,0x00021100L,0x00121100L,
00255         0x00021008L,0x00121008L,0x00021108L,0x00121108L,
00256         0x04020000L,0x04120000L,0x04020100L,0x04120100L,
00257         0x04020008L,0x04120008L,0x04020108L,0x04120108L,
00258         0x04021000L,0x04121000L,0x04021100L,0x04121100L,
00259         0x04021008L,0x04121008L,0x04021108L,0x04121108L,
00260         },{
00261         /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
00262         0x00000000L,0x10000000L,0x00010000L,0x10010000L,
00263         0x00000004L,0x10000004L,0x00010004L,0x10010004L,
00264         0x20000000L,0x30000000L,0x20010000L,0x30010000L,
00265         0x20000004L,0x30000004L,0x20010004L,0x30010004L,
00266         0x00100000L,0x10100000L,0x00110000L,0x10110000L,
00267         0x00100004L,0x10100004L,0x00110004L,0x10110004L,
00268         0x20100000L,0x30100000L,0x20110000L,0x30110000L,
00269         0x20100004L,0x30100004L,0x20110004L,0x30110004L,
00270         0x00001000L,0x10001000L,0x00011000L,0x10011000L,
00271         0x00001004L,0x10001004L,0x00011004L,0x10011004L,
00272         0x20001000L,0x30001000L,0x20011000L,0x30011000L,
00273         0x20001004L,0x30001004L,0x20011004L,0x30011004L,
00274         0x00101000L,0x10101000L,0x00111000L,0x10111000L,
00275         0x00101004L,0x10101004L,0x00111004L,0x10111004L,
00276         0x20101000L,0x30101000L,0x20111000L,0x30111000L,
00277         0x20101004L,0x30101004L,0x20111004L,0x30111004L,
00278         },{
00279         /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */
00280         0x00000000L,0x08000000L,0x00000008L,0x08000008L,
00281         0x00000400L,0x08000400L,0x00000408L,0x08000408L,
00282         0x00020000L,0x08020000L,0x00020008L,0x08020008L,
00283         0x00020400L,0x08020400L,0x00020408L,0x08020408L,
00284         0x00000001L,0x08000001L,0x00000009L,0x08000009L,
00285         0x00000401L,0x08000401L,0x00000409L,0x08000409L,
00286         0x00020001L,0x08020001L,0x00020009L,0x08020009L,
00287         0x00020401L,0x08020401L,0x00020409L,0x08020409L,
00288         0x02000000L,0x0A000000L,0x02000008L,0x0A000008L,
00289         0x02000400L,0x0A000400L,0x02000408L,0x0A000408L,
00290         0x02020000L,0x0A020000L,0x02020008L,0x0A020008L,
00291         0x02020400L,0x0A020400L,0x02020408L,0x0A020408L,
00292         0x02000001L,0x0A000001L,0x02000009L,0x0A000009L,
00293         0x02000401L,0x0A000401L,0x02000409L,0x0A000409L,
00294         0x02020001L,0x0A020001L,0x02020009L,0x0A020009L,
00295         0x02020401L,0x0A020401L,0x02020409L,0x0A020409L,
00296         },{
00297         /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */
00298         0x00000000L,0x00000100L,0x00080000L,0x00080100L,
00299         0x01000000L,0x01000100L,0x01080000L,0x01080100L,
00300         0x00000010L,0x00000110L,0x00080010L,0x00080110L,
00301         0x01000010L,0x01000110L,0x01080010L,0x01080110L,
00302         0x00200000L,0x00200100L,0x00280000L,0x00280100L,
00303         0x01200000L,0x01200100L,0x01280000L,0x01280100L,
00304         0x00200010L,0x00200110L,0x00280010L,0x00280110L,
00305         0x01200010L,0x01200110L,0x01280010L,0x01280110L,
00306         0x00000200L,0x00000300L,0x00080200L,0x00080300L,
00307         0x01000200L,0x01000300L,0x01080200L,0x01080300L,
00308         0x00000210L,0x00000310L,0x00080210L,0x00080310L,
00309         0x01000210L,0x01000310L,0x01080210L,0x01080310L,
00310         0x00200200L,0x00200300L,0x00280200L,0x00280300L,
00311         0x01200200L,0x01200300L,0x01280200L,0x01280300L,
00312         0x00200210L,0x00200310L,0x00280210L,0x00280310L,
00313         0x01200210L,0x01200310L,0x01280210L,0x01280310L,
00314         },{
00315         /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */
00316         0x00000000L,0x04000000L,0x00040000L,0x04040000L,
00317         0x00000002L,0x04000002L,0x00040002L,0x04040002L,
00318         0x00002000L,0x04002000L,0x00042000L,0x04042000L,
00319         0x00002002L,0x04002002L,0x00042002L,0x04042002L,
00320         0x00000020L,0x04000020L,0x00040020L,0x04040020L,
00321         0x00000022L,0x04000022L,0x00040022L,0x04040022L,
00322         0x00002020L,0x04002020L,0x00042020L,0x04042020L,
00323         0x00002022L,0x04002022L,0x00042022L,0x04042022L,
00324         0x00000800L,0x04000800L,0x00040800L,0x04040800L,
00325         0x00000802L,0x04000802L,0x00040802L,0x04040802L,
00326         0x00002800L,0x04002800L,0x00042800L,0x04042800L,
00327         0x00002802L,0x04002802L,0x00042802L,0x04042802L,
00328         0x00000820L,0x04000820L,0x00040820L,0x04040820L,
00329         0x00000822L,0x04000822L,0x00040822L,0x04040822L,
00330         0x00002820L,0x04002820L,0x00042820L,0x04042820L,
00331         0x00002822L,0x04002822L,0x00042822L,0x04042822L,
00332         }};
00333 
00334 int DES_set_key(const_DES_cblock *key, DES_key_schedule *schedule)
00335         {
00336         if (DES_check_key)
00337                 {
00338                 return DES_set_key_checked(key, schedule);
00339                 }
00340         else
00341                 {
00342                 DES_set_key_unchecked(key, schedule);
00343                 return 0;
00344                 }
00345         }
00346 
00347 /* return 0 if key parity is odd (correct),
00348  * return -1 if key parity error,
00349  * return -2 if illegal weak key.
00350  */
00351 int DES_set_key_checked(const_DES_cblock *key, DES_key_schedule *schedule)
00352         {
00353         if (!DES_check_key_parity(key))
00354                 return(-1);
00355         if (DES_is_weak_key(key))
00356                 return(-2);
00357         DES_set_key_unchecked(key, schedule);
00358         return 0;
00359         }
00360 
00361 void DES_set_key_unchecked(const_DES_cblock *key, DES_key_schedule *schedule)
00362         {
00363         static int shifts2[16]={0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0};
00364         register DES_LONG c,d,t,s,t2;
00365         register const unsigned char *in;
00366         register DES_LONG *k;
00367         register int i;
00368 
00369 #ifdef OPENBSD_DEV_CRYPTO
00370         memcpy(schedule->key,key,sizeof schedule->key);
00371         schedule->session=NULL;
00372 #endif
00373         k = &schedule->ks->deslong[0];
00374         in = &(*key)[0];
00375 
00376 #ifdef OPENSSL_FIPS
00377         FIPS_selftest_check();
00378 #endif
00379 
00380         c2l(in,c);
00381         c2l(in,d);
00382 
00383         /* do PC1 in 47 simple operations :-)
00384          * Thanks to John Fletcher (john_fletcher@lccmail.ocf.llnl.gov)
00385          * for the inspiration. :-) */
00386         PERM_OP (d,c,t,4,0x0f0f0f0fL);
00387         HPERM_OP(c,t,-2,0xcccc0000L);
00388         HPERM_OP(d,t,-2,0xcccc0000L);
00389         PERM_OP (d,c,t,1,0x55555555L);
00390         PERM_OP (c,d,t,8,0x00ff00ffL);
00391         PERM_OP (d,c,t,1,0x55555555L);
00392         d=      (((d&0x000000ffL)<<16L)| (d&0x0000ff00L)     |
00393                  ((d&0x00ff0000L)>>16L)|((c&0xf0000000L)>>4L));
00394         c&=0x0fffffffL;
00395 
00396         for (i=0; i<ITERATIONS; i++)
00397                 {
00398                 if (shifts2[i])
00399                         { c=((c>>2L)|(c<<26L)); d=((d>>2L)|(d<<26L)); }
00400                 else
00401                         { c=((c>>1L)|(c<<27L)); d=((d>>1L)|(d<<27L)); }
00402                 c&=0x0fffffffL;
00403                 d&=0x0fffffffL;
00404                 /* could be a few less shifts but I am to lazy at this
00405                  * point in time to investigate */
00406                 s=      des_skb[0][ (c    )&0x3f                ]|
00407                         des_skb[1][((c>> 6L)&0x03)|((c>> 7L)&0x3c)]|
00408                         des_skb[2][((c>>13L)&0x0f)|((c>>14L)&0x30)]|
00409                         des_skb[3][((c>>20L)&0x01)|((c>>21L)&0x06) |
00410                                                   ((c>>22L)&0x38)];
00411                 t=      des_skb[4][ (d    )&0x3f                ]|
00412                         des_skb[5][((d>> 7L)&0x03)|((d>> 8L)&0x3c)]|
00413                         des_skb[6][ (d>>15L)&0x3f                ]|
00414                         des_skb[7][((d>>21L)&0x0f)|((d>>22L)&0x30)];
00415 
00416                 /* table contained 0213 4657 */
00417                 t2=((t<<16L)|(s&0x0000ffffL))&0xffffffffL;
00418                 *(k++)=ROTATE(t2,30)&0xffffffffL;
00419 
00420                 t2=((s>>16L)|(t&0xffff0000L));
00421                 *(k++)=ROTATE(t2,26)&0xffffffffL;
00422                 }
00423         }
00424 
00425 int DES_key_sched(const_DES_cblock *key, DES_key_schedule *schedule)
00426         {
00427         return(DES_set_key(key,schedule));
00428         }
00429 /*
00430 #undef des_fixup_key_parity
00431 void des_fixup_key_parity(des_cblock *key)
00432         {
00433         des_set_odd_parity(key);
00434         }
00435 */
00436 
00437 #endif /* POK_NEEDS_ ...*/