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