set_key.c revision 109998
155714Skris/* crypto/des/set_key.c */ 255714Skris/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 355714Skris * All rights reserved. 455714Skris * 555714Skris * This package is an SSL implementation written 655714Skris * by Eric Young (eay@cryptsoft.com). 755714Skris * The implementation was written so as to conform with Netscapes SSL. 855714Skris * 955714Skris * This library is free for commercial and non-commercial use as long as 1055714Skris * the following conditions are aheared to. The following conditions 1155714Skris * apply to all code found in this distribution, be it the RC4, RSA, 1255714Skris * lhash, DES, etc., code; not just the SSL code. The SSL documentation 1355714Skris * included with this distribution is covered by the same copyright terms 1455714Skris * except that the holder is Tim Hudson (tjh@cryptsoft.com). 1555714Skris * 1655714Skris * Copyright remains Eric Young's, and as such any Copyright notices in 1755714Skris * the code are not to be removed. 1855714Skris * If this package is used in a product, Eric Young should be given attribution 1955714Skris * as the author of the parts of the library used. 2055714Skris * This can be in the form of a textual message at program startup or 2155714Skris * in documentation (online or textual) provided with the package. 2255714Skris * 2355714Skris * Redistribution and use in source and binary forms, with or without 2455714Skris * modification, are permitted provided that the following conditions 2555714Skris * are met: 2655714Skris * 1. Redistributions of source code must retain the copyright 2755714Skris * notice, this list of conditions and the following disclaimer. 2855714Skris * 2. Redistributions in binary form must reproduce the above copyright 2955714Skris * notice, this list of conditions and the following disclaimer in the 3055714Skris * documentation and/or other materials provided with the distribution. 3155714Skris * 3. All advertising materials mentioning features or use of this software 3255714Skris * must display the following acknowledgement: 3355714Skris * "This product includes cryptographic software written by 3455714Skris * Eric Young (eay@cryptsoft.com)" 3555714Skris * The word 'cryptographic' can be left out if the rouines from the library 3655714Skris * being used are not cryptographic related :-). 3755714Skris * 4. If you include any Windows specific code (or a derivative thereof) from 3855714Skris * the apps directory (application code) you must include an acknowledgement: 3955714Skris * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 4055714Skris * 4155714Skris * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 4255714Skris * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 4355714Skris * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 4455714Skris * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 4555714Skris * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 4655714Skris * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 4755714Skris * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 4855714Skris * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 4955714Skris * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 5055714Skris * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 5155714Skris * SUCH DAMAGE. 5255714Skris * 5355714Skris * The licence and distribution terms for any publically available version or 5455714Skris * derivative of this code cannot be changed. i.e. this code cannot simply be 5555714Skris * copied and put under another distribution licence 5655714Skris * [including the GNU Public Licence.] 5755714Skris */ 5855714Skris 5955714Skris/* set_key.c v 1.4 eay 24/9/91 6055714Skris * 1.4 Speed up by 400% :-) 6155714Skris * 1.3 added register declarations. 6255714Skris * 1.2 unrolled make_key_sched a bit more 6355714Skris * 1.1 added norm_expand_bits 6455714Skris * 1.0 First working version 6555714Skris */ 6655714Skris#include "des_locl.h" 6755714Skris 68109998SmarkmOPENSSL_IMPLEMENT_GLOBAL(int,DES_check_key); /* defaults to false */ 6955714Skris 7059191Skrisstatic const unsigned char odd_parity[256]={ 7159191Skris 1, 1, 2, 2, 4, 4, 7, 7, 8, 8, 11, 11, 13, 13, 14, 14, 7259191Skris 16, 16, 19, 19, 21, 21, 22, 22, 25, 25, 26, 26, 28, 28, 31, 31, 7359191Skris 32, 32, 35, 35, 37, 37, 38, 38, 41, 41, 42, 42, 44, 44, 47, 47, 7459191Skris 49, 49, 50, 50, 52, 52, 55, 55, 56, 56, 59, 59, 61, 61, 62, 62, 7559191Skris 64, 64, 67, 67, 69, 69, 70, 70, 73, 73, 74, 74, 76, 76, 79, 79, 7659191Skris 81, 81, 82, 82, 84, 84, 87, 87, 88, 88, 91, 91, 93, 93, 94, 94, 7759191Skris 97, 97, 98, 98,100,100,103,103,104,104,107,107,109,109,110,110, 7859191Skris112,112,115,115,117,117,118,118,121,121,122,122,124,124,127,127, 7959191Skris128,128,131,131,133,133,134,134,137,137,138,138,140,140,143,143, 8059191Skris145,145,146,146,148,148,151,151,152,152,155,155,157,157,158,158, 8159191Skris161,161,162,162,164,164,167,167,168,168,171,171,173,173,174,174, 8259191Skris176,176,179,179,181,181,182,182,185,185,186,186,188,188,191,191, 8359191Skris193,193,194,194,196,196,199,199,200,200,203,203,205,205,206,206, 8459191Skris208,208,211,211,213,213,214,214,217,217,218,218,220,220,223,223, 8559191Skris224,224,227,227,229,229,230,230,233,233,234,234,236,236,239,239, 8659191Skris241,241,242,242,244,244,247,247,248,248,251,251,253,253,254,254}; 8759191Skris 88109998Smarkmvoid DES_set_odd_parity(DES_cblock *key) 8955714Skris { 9055714Skris int i; 9155714Skris 9255714Skris for (i=0; i<DES_KEY_SZ; i++) 9355714Skris (*key)[i]=odd_parity[(*key)[i]]; 9455714Skris } 9555714Skris 96109998Smarkmint DES_check_key_parity(const_DES_cblock *key) 9755714Skris { 9855714Skris int i; 9955714Skris 10055714Skris for (i=0; i<DES_KEY_SZ; i++) 10155714Skris { 10255714Skris if ((*key)[i] != odd_parity[(*key)[i]]) 10355714Skris return(0); 10455714Skris } 10555714Skris return(1); 10655714Skris } 10755714Skris 10855714Skris/* Weak and semi week keys as take from 10955714Skris * %A D.W. Davies 11055714Skris * %A W.L. Price 11155714Skris * %T Security for Computer Networks 11255714Skris * %I John Wiley & Sons 11355714Skris * %D 1984 11455714Skris * Many thanks to smb@ulysses.att.com (Steven Bellovin) for the reference 11555714Skris * (and actual cblock values). 11655714Skris */ 11755714Skris#define NUM_WEAK_KEY 16 118109998Smarkmstatic DES_cblock weak_keys[NUM_WEAK_KEY]={ 11955714Skris /* weak keys */ 12055714Skris {0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01}, 12155714Skris {0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE}, 12255714Skris {0x1F,0x1F,0x1F,0x1F,0x0E,0x0E,0x0E,0x0E}, 12355714Skris {0xE0,0xE0,0xE0,0xE0,0xF1,0xF1,0xF1,0xF1}, 12455714Skris /* semi-weak keys */ 12555714Skris {0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE}, 12655714Skris {0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01}, 12755714Skris {0x1F,0xE0,0x1F,0xE0,0x0E,0xF1,0x0E,0xF1}, 12855714Skris {0xE0,0x1F,0xE0,0x1F,0xF1,0x0E,0xF1,0x0E}, 12955714Skris {0x01,0xE0,0x01,0xE0,0x01,0xF1,0x01,0xF1}, 13055714Skris {0xE0,0x01,0xE0,0x01,0xF1,0x01,0xF1,0x01}, 13155714Skris {0x1F,0xFE,0x1F,0xFE,0x0E,0xFE,0x0E,0xFE}, 13255714Skris {0xFE,0x1F,0xFE,0x1F,0xFE,0x0E,0xFE,0x0E}, 13355714Skris {0x01,0x1F,0x01,0x1F,0x01,0x0E,0x01,0x0E}, 13455714Skris {0x1F,0x01,0x1F,0x01,0x0E,0x01,0x0E,0x01}, 13555714Skris {0xE0,0xFE,0xE0,0xFE,0xF1,0xFE,0xF1,0xFE}, 13655714Skris {0xFE,0xE0,0xFE,0xE0,0xFE,0xF1,0xFE,0xF1}}; 13755714Skris 138109998Smarkmint DES_is_weak_key(const_DES_cblock *key) 13955714Skris { 14055714Skris int i; 14155714Skris 14255714Skris for (i=0; i<NUM_WEAK_KEY; i++) 14359191Skris /* Added == 0 to comparison, I obviously don't run 14455714Skris * this section very often :-(, thanks to 14555714Skris * engineering@MorningStar.Com for the fix 14655714Skris * eay 93/06/29 14755714Skris * Another problem, I was comparing only the first 4 14855714Skris * bytes, 97/03/18 */ 149109998Smarkm if (memcmp(weak_keys[i],key,sizeof(DES_cblock)) == 0) return(1); 15055714Skris return(0); 15155714Skris } 15255714Skris 15355714Skris/* NOW DEFINED IN des_local.h 15455714Skris * See ecb_encrypt.c for a pseudo description of these macros. 15555714Skris * #define PERM_OP(a,b,t,n,m) ((t)=((((a)>>(n))^(b))&(m)),\ 15655714Skris * (b)^=(t),\ 15755714Skris * (a)=((a)^((t)<<(n)))) 15855714Skris */ 15955714Skris 16055714Skris#define HPERM_OP(a,t,n,m) ((t)=((((a)<<(16-(n)))^(a))&(m)),\ 16155714Skris (a)=(a)^(t)^(t>>(16-(n)))) 16255714Skris 16359191Skrisstatic const DES_LONG des_skb[8][64]={ 16459191Skris { 16559191Skris /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ 16659191Skris 0x00000000L,0x00000010L,0x20000000L,0x20000010L, 16759191Skris 0x00010000L,0x00010010L,0x20010000L,0x20010010L, 16859191Skris 0x00000800L,0x00000810L,0x20000800L,0x20000810L, 16959191Skris 0x00010800L,0x00010810L,0x20010800L,0x20010810L, 17059191Skris 0x00000020L,0x00000030L,0x20000020L,0x20000030L, 17159191Skris 0x00010020L,0x00010030L,0x20010020L,0x20010030L, 17259191Skris 0x00000820L,0x00000830L,0x20000820L,0x20000830L, 17359191Skris 0x00010820L,0x00010830L,0x20010820L,0x20010830L, 17459191Skris 0x00080000L,0x00080010L,0x20080000L,0x20080010L, 17559191Skris 0x00090000L,0x00090010L,0x20090000L,0x20090010L, 17659191Skris 0x00080800L,0x00080810L,0x20080800L,0x20080810L, 17759191Skris 0x00090800L,0x00090810L,0x20090800L,0x20090810L, 17859191Skris 0x00080020L,0x00080030L,0x20080020L,0x20080030L, 17959191Skris 0x00090020L,0x00090030L,0x20090020L,0x20090030L, 18059191Skris 0x00080820L,0x00080830L,0x20080820L,0x20080830L, 18159191Skris 0x00090820L,0x00090830L,0x20090820L,0x20090830L, 18259191Skris },{ 18359191Skris /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */ 18459191Skris 0x00000000L,0x02000000L,0x00002000L,0x02002000L, 18559191Skris 0x00200000L,0x02200000L,0x00202000L,0x02202000L, 18659191Skris 0x00000004L,0x02000004L,0x00002004L,0x02002004L, 18759191Skris 0x00200004L,0x02200004L,0x00202004L,0x02202004L, 18859191Skris 0x00000400L,0x02000400L,0x00002400L,0x02002400L, 18959191Skris 0x00200400L,0x02200400L,0x00202400L,0x02202400L, 19059191Skris 0x00000404L,0x02000404L,0x00002404L,0x02002404L, 19159191Skris 0x00200404L,0x02200404L,0x00202404L,0x02202404L, 19259191Skris 0x10000000L,0x12000000L,0x10002000L,0x12002000L, 19359191Skris 0x10200000L,0x12200000L,0x10202000L,0x12202000L, 19459191Skris 0x10000004L,0x12000004L,0x10002004L,0x12002004L, 19559191Skris 0x10200004L,0x12200004L,0x10202004L,0x12202004L, 19659191Skris 0x10000400L,0x12000400L,0x10002400L,0x12002400L, 19759191Skris 0x10200400L,0x12200400L,0x10202400L,0x12202400L, 19859191Skris 0x10000404L,0x12000404L,0x10002404L,0x12002404L, 19959191Skris 0x10200404L,0x12200404L,0x10202404L,0x12202404L, 20059191Skris },{ 20159191Skris /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */ 20259191Skris 0x00000000L,0x00000001L,0x00040000L,0x00040001L, 20359191Skris 0x01000000L,0x01000001L,0x01040000L,0x01040001L, 20459191Skris 0x00000002L,0x00000003L,0x00040002L,0x00040003L, 20559191Skris 0x01000002L,0x01000003L,0x01040002L,0x01040003L, 20659191Skris 0x00000200L,0x00000201L,0x00040200L,0x00040201L, 20759191Skris 0x01000200L,0x01000201L,0x01040200L,0x01040201L, 20859191Skris 0x00000202L,0x00000203L,0x00040202L,0x00040203L, 20959191Skris 0x01000202L,0x01000203L,0x01040202L,0x01040203L, 21059191Skris 0x08000000L,0x08000001L,0x08040000L,0x08040001L, 21159191Skris 0x09000000L,0x09000001L,0x09040000L,0x09040001L, 21259191Skris 0x08000002L,0x08000003L,0x08040002L,0x08040003L, 21359191Skris 0x09000002L,0x09000003L,0x09040002L,0x09040003L, 21459191Skris 0x08000200L,0x08000201L,0x08040200L,0x08040201L, 21559191Skris 0x09000200L,0x09000201L,0x09040200L,0x09040201L, 21659191Skris 0x08000202L,0x08000203L,0x08040202L,0x08040203L, 21759191Skris 0x09000202L,0x09000203L,0x09040202L,0x09040203L, 21859191Skris },{ 21959191Skris /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */ 22059191Skris 0x00000000L,0x00100000L,0x00000100L,0x00100100L, 22159191Skris 0x00000008L,0x00100008L,0x00000108L,0x00100108L, 22259191Skris 0x00001000L,0x00101000L,0x00001100L,0x00101100L, 22359191Skris 0x00001008L,0x00101008L,0x00001108L,0x00101108L, 22459191Skris 0x04000000L,0x04100000L,0x04000100L,0x04100100L, 22559191Skris 0x04000008L,0x04100008L,0x04000108L,0x04100108L, 22659191Skris 0x04001000L,0x04101000L,0x04001100L,0x04101100L, 22759191Skris 0x04001008L,0x04101008L,0x04001108L,0x04101108L, 22859191Skris 0x00020000L,0x00120000L,0x00020100L,0x00120100L, 22959191Skris 0x00020008L,0x00120008L,0x00020108L,0x00120108L, 23059191Skris 0x00021000L,0x00121000L,0x00021100L,0x00121100L, 23159191Skris 0x00021008L,0x00121008L,0x00021108L,0x00121108L, 23259191Skris 0x04020000L,0x04120000L,0x04020100L,0x04120100L, 23359191Skris 0x04020008L,0x04120008L,0x04020108L,0x04120108L, 23459191Skris 0x04021000L,0x04121000L,0x04021100L,0x04121100L, 23559191Skris 0x04021008L,0x04121008L,0x04021108L,0x04121108L, 23659191Skris },{ 23759191Skris /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ 23859191Skris 0x00000000L,0x10000000L,0x00010000L,0x10010000L, 23959191Skris 0x00000004L,0x10000004L,0x00010004L,0x10010004L, 24059191Skris 0x20000000L,0x30000000L,0x20010000L,0x30010000L, 24159191Skris 0x20000004L,0x30000004L,0x20010004L,0x30010004L, 24259191Skris 0x00100000L,0x10100000L,0x00110000L,0x10110000L, 24359191Skris 0x00100004L,0x10100004L,0x00110004L,0x10110004L, 24459191Skris 0x20100000L,0x30100000L,0x20110000L,0x30110000L, 24559191Skris 0x20100004L,0x30100004L,0x20110004L,0x30110004L, 24659191Skris 0x00001000L,0x10001000L,0x00011000L,0x10011000L, 24759191Skris 0x00001004L,0x10001004L,0x00011004L,0x10011004L, 24859191Skris 0x20001000L,0x30001000L,0x20011000L,0x30011000L, 24959191Skris 0x20001004L,0x30001004L,0x20011004L,0x30011004L, 25059191Skris 0x00101000L,0x10101000L,0x00111000L,0x10111000L, 25159191Skris 0x00101004L,0x10101004L,0x00111004L,0x10111004L, 25259191Skris 0x20101000L,0x30101000L,0x20111000L,0x30111000L, 25359191Skris 0x20101004L,0x30101004L,0x20111004L,0x30111004L, 25459191Skris },{ 25559191Skris /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */ 25659191Skris 0x00000000L,0x08000000L,0x00000008L,0x08000008L, 25759191Skris 0x00000400L,0x08000400L,0x00000408L,0x08000408L, 25859191Skris 0x00020000L,0x08020000L,0x00020008L,0x08020008L, 25959191Skris 0x00020400L,0x08020400L,0x00020408L,0x08020408L, 26059191Skris 0x00000001L,0x08000001L,0x00000009L,0x08000009L, 26159191Skris 0x00000401L,0x08000401L,0x00000409L,0x08000409L, 26259191Skris 0x00020001L,0x08020001L,0x00020009L,0x08020009L, 26359191Skris 0x00020401L,0x08020401L,0x00020409L,0x08020409L, 26459191Skris 0x02000000L,0x0A000000L,0x02000008L,0x0A000008L, 26559191Skris 0x02000400L,0x0A000400L,0x02000408L,0x0A000408L, 26659191Skris 0x02020000L,0x0A020000L,0x02020008L,0x0A020008L, 26759191Skris 0x02020400L,0x0A020400L,0x02020408L,0x0A020408L, 26859191Skris 0x02000001L,0x0A000001L,0x02000009L,0x0A000009L, 26959191Skris 0x02000401L,0x0A000401L,0x02000409L,0x0A000409L, 27059191Skris 0x02020001L,0x0A020001L,0x02020009L,0x0A020009L, 27159191Skris 0x02020401L,0x0A020401L,0x02020409L,0x0A020409L, 27259191Skris },{ 27359191Skris /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */ 27459191Skris 0x00000000L,0x00000100L,0x00080000L,0x00080100L, 27559191Skris 0x01000000L,0x01000100L,0x01080000L,0x01080100L, 27659191Skris 0x00000010L,0x00000110L,0x00080010L,0x00080110L, 27759191Skris 0x01000010L,0x01000110L,0x01080010L,0x01080110L, 27859191Skris 0x00200000L,0x00200100L,0x00280000L,0x00280100L, 27959191Skris 0x01200000L,0x01200100L,0x01280000L,0x01280100L, 28059191Skris 0x00200010L,0x00200110L,0x00280010L,0x00280110L, 28159191Skris 0x01200010L,0x01200110L,0x01280010L,0x01280110L, 28259191Skris 0x00000200L,0x00000300L,0x00080200L,0x00080300L, 28359191Skris 0x01000200L,0x01000300L,0x01080200L,0x01080300L, 28459191Skris 0x00000210L,0x00000310L,0x00080210L,0x00080310L, 28559191Skris 0x01000210L,0x01000310L,0x01080210L,0x01080310L, 28659191Skris 0x00200200L,0x00200300L,0x00280200L,0x00280300L, 28759191Skris 0x01200200L,0x01200300L,0x01280200L,0x01280300L, 28859191Skris 0x00200210L,0x00200310L,0x00280210L,0x00280310L, 28959191Skris 0x01200210L,0x01200310L,0x01280210L,0x01280310L, 29059191Skris },{ 29159191Skris /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */ 29259191Skris 0x00000000L,0x04000000L,0x00040000L,0x04040000L, 29359191Skris 0x00000002L,0x04000002L,0x00040002L,0x04040002L, 29459191Skris 0x00002000L,0x04002000L,0x00042000L,0x04042000L, 29559191Skris 0x00002002L,0x04002002L,0x00042002L,0x04042002L, 29659191Skris 0x00000020L,0x04000020L,0x00040020L,0x04040020L, 29759191Skris 0x00000022L,0x04000022L,0x00040022L,0x04040022L, 29859191Skris 0x00002020L,0x04002020L,0x00042020L,0x04042020L, 29959191Skris 0x00002022L,0x04002022L,0x00042022L,0x04042022L, 30059191Skris 0x00000800L,0x04000800L,0x00040800L,0x04040800L, 30159191Skris 0x00000802L,0x04000802L,0x00040802L,0x04040802L, 30259191Skris 0x00002800L,0x04002800L,0x00042800L,0x04042800L, 30359191Skris 0x00002802L,0x04002802L,0x00042802L,0x04042802L, 30459191Skris 0x00000820L,0x04000820L,0x00040820L,0x04040820L, 30559191Skris 0x00000822L,0x04000822L,0x00040822L,0x04040822L, 30659191Skris 0x00002820L,0x04002820L,0x00042820L,0x04042820L, 30759191Skris 0x00002822L,0x04002822L,0x00042822L,0x04042822L, 30859191Skris }}; 30959191Skris 310109998Smarkmint DES_set_key(const_DES_cblock *key, DES_key_schedule *schedule) 31159191Skris { 312109998Smarkm if (DES_check_key) 31359191Skris { 314109998Smarkm return DES_set_key_checked(key, schedule); 31559191Skris } 31659191Skris else 31759191Skris { 318109998Smarkm DES_set_key_unchecked(key, schedule); 31959191Skris return 0; 32059191Skris } 32159191Skris } 32259191Skris 32355714Skris/* return 0 if key parity is odd (correct), 32455714Skris * return -1 if key parity error, 32555714Skris * return -2 if illegal weak key. 32655714Skris */ 327109998Smarkmint DES_set_key_checked(const_DES_cblock *key, DES_key_schedule *schedule) 32855714Skris { 329109998Smarkm if (!DES_check_key_parity(key)) 33059191Skris return(-1); 331109998Smarkm if (DES_is_weak_key(key)) 33259191Skris return(-2); 333109998Smarkm DES_set_key_unchecked(key, schedule); 33459191Skris return 0; 33559191Skris } 33659191Skris 337109998Smarkmvoid DES_set_key_unchecked(const_DES_cblock *key, DES_key_schedule *schedule) 33859191Skris { 33955714Skris static int shifts2[16]={0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0}; 34055714Skris register DES_LONG c,d,t,s,t2; 34155714Skris register const unsigned char *in; 34255714Skris register DES_LONG *k; 34355714Skris register int i; 34455714Skris 345109998Smarkm#ifdef OPENBSD_DEV_CRYPTO 346109998Smarkm memcpy(schedule->key,key,sizeof schedule->key); 347109998Smarkm schedule->session=NULL; 348109998Smarkm#endif 349109998Smarkm k = &schedule->ks->deslong[0]; 35055714Skris in = &(*key)[0]; 35155714Skris 35255714Skris c2l(in,c); 35355714Skris c2l(in,d); 35455714Skris 35559191Skris /* do PC1 in 47 simple operations :-) 35655714Skris * Thanks to John Fletcher (john_fletcher@lccmail.ocf.llnl.gov) 35755714Skris * for the inspiration. :-) */ 35855714Skris PERM_OP (d,c,t,4,0x0f0f0f0fL); 35955714Skris HPERM_OP(c,t,-2,0xcccc0000L); 36055714Skris HPERM_OP(d,t,-2,0xcccc0000L); 36155714Skris PERM_OP (d,c,t,1,0x55555555L); 36255714Skris PERM_OP (c,d,t,8,0x00ff00ffL); 36355714Skris PERM_OP (d,c,t,1,0x55555555L); 36455714Skris d= (((d&0x000000ffL)<<16L)| (d&0x0000ff00L) | 36555714Skris ((d&0x00ff0000L)>>16L)|((c&0xf0000000L)>>4L)); 36655714Skris c&=0x0fffffffL; 36755714Skris 36855714Skris for (i=0; i<ITERATIONS; i++) 36955714Skris { 37055714Skris if (shifts2[i]) 37155714Skris { c=((c>>2L)|(c<<26L)); d=((d>>2L)|(d<<26L)); } 37255714Skris else 37355714Skris { c=((c>>1L)|(c<<27L)); d=((d>>1L)|(d<<27L)); } 37455714Skris c&=0x0fffffffL; 37555714Skris d&=0x0fffffffL; 37655714Skris /* could be a few less shifts but I am to lazy at this 37755714Skris * point in time to investigate */ 37855714Skris s= des_skb[0][ (c )&0x3f ]| 37959191Skris des_skb[1][((c>> 6L)&0x03)|((c>> 7L)&0x3c)]| 38059191Skris des_skb[2][((c>>13L)&0x0f)|((c>>14L)&0x30)]| 38159191Skris des_skb[3][((c>>20L)&0x01)|((c>>21L)&0x06) | 38255714Skris ((c>>22L)&0x38)]; 38355714Skris t= des_skb[4][ (d )&0x3f ]| 38455714Skris des_skb[5][((d>> 7L)&0x03)|((d>> 8L)&0x3c)]| 38555714Skris des_skb[6][ (d>>15L)&0x3f ]| 38655714Skris des_skb[7][((d>>21L)&0x0f)|((d>>22L)&0x30)]; 38755714Skris 38855714Skris /* table contained 0213 4657 */ 38955714Skris t2=((t<<16L)|(s&0x0000ffffL))&0xffffffffL; 39055714Skris *(k++)=ROTATE(t2,30)&0xffffffffL; 39155714Skris 39255714Skris t2=((s>>16L)|(t&0xffff0000L)); 39355714Skris *(k++)=ROTATE(t2,26)&0xffffffffL; 39455714Skris } 39555714Skris } 39655714Skris 397109998Smarkmint DES_key_sched(const_DES_cblock *key, DES_key_schedule *schedule) 39855714Skris { 399109998Smarkm return(DES_set_key(key,schedule)); 40055714Skris } 401109998Smarkm/* 40259191Skris#undef des_fixup_key_parity 40359191Skrisvoid des_fixup_key_parity(des_cblock *key) 40459191Skris { 40559191Skris des_set_odd_parity(key); 40659191Skris } 407109998Smarkm*/ 408