00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifdef _MSC_VER
00018 #include "des_locl.h"
00019 #include "podd.h"
00020 #include "sk.h"
00021 #else
00022 #include "libdes/des_locl.h"
00023 #include "libdes/podd.h"
00024 #include "libdes/sk.h"
00025 #endif
00026
00027 static int check_parity(des_cblock *key);
00028
00029 int des_check_key=0;
00030
00031 void des_set_odd_parity(key)
00032 des_cblock *key;
00033 {
00034 int i;
00035
00036 for (i=0; i<DES_KEY_SZ; i++)
00037 (*key)[i]=odd_parity[(*key)[i]];
00038 }
00039
00040 static int check_parity(key)
00041 des_cblock *key;
00042 {
00043 int i;
00044
00045 for (i=0; i<DES_KEY_SZ; i++)
00046 {
00047 if ((*key)[i] != odd_parity[(*key)[i]])
00048 return(0);
00049 }
00050 return(1);
00051 }
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062 #define NUM_WEAK_KEY 16
00063 static des_cblock weak_keys[NUM_WEAK_KEY]={
00064
00065 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
00066 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,
00067 0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,
00068 0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,
00069
00070 0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE,
00071 0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01,
00072 0x1F,0xE0,0x1F,0xE0,0x0E,0xF1,0x0E,0xF1,
00073 0xE0,0x1F,0xE0,0x1F,0xF1,0x0E,0xF1,0x0E,
00074 0x01,0xE0,0x01,0xE0,0x01,0xF1,0x01,0xF1,
00075 0xE0,0x01,0xE0,0x01,0xF1,0x01,0xF1,0x01,
00076 0x1F,0xFE,0x1F,0xFE,0x0E,0xFE,0x0E,0xFE,
00077 0xFE,0x1F,0xFE,0x1F,0xFE,0x0E,0xFE,0x0E,
00078 0x01,0x1F,0x01,0x1F,0x01,0x0E,0x01,0x0E,
00079 0x1F,0x01,0x1F,0x01,0x0E,0x01,0x0E,0x01,
00080 0xE0,0xFE,0xE0,0xFE,0xF1,0xFE,0xF1,0xFE,
00081 0xFE,0xE0,0xFE,0xE0,0xFE,0xF1,0xFE,0xF1};
00082
00083 int des_is_weak_key(key)
00084 des_cblock *key;
00085 {
00086 int i;
00087
00088 for (i=0; i<NUM_WEAK_KEY; i++)
00089
00090
00091
00092
00093 if (memcmp(weak_keys[i],key,sizeof(key)) == 0) return(1);
00094 return(0);
00095 }
00096
00097
00098
00099
00100
00101
00102
00103
00104 #define HPERM_OP(a,t,n,m) ((t)=((((a)<<(16-(n)))^(a))&(m)),\
00105 (a)=(a)^(t)^(t>>(16-(n))))
00106
00107 static char shifts2[16]={0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0};
00108
00109
00110
00111
00112
00113 int des_set_key(key,schedule)
00114 des_cblock *key;
00115 des_key_schedule schedule;
00116 {
00117 register unsigned long c,d,t,s;
00118 register unsigned char *in;
00119 register unsigned long *k;
00120 register int i;
00121
00122 if (des_check_key)
00123 {
00124 if (!check_parity(key))
00125 return(-1);
00126
00127 if (des_is_weak_key(key))
00128 return(-2);
00129 }
00130
00131 k=(unsigned long *)schedule;
00132 in=(unsigned char *)key;
00133
00134 c2l(in,c);
00135 c2l(in,d);
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153 PERM_OP (d,c,t,4,0x0f0f0f0fL);
00154 HPERM_OP(c,t,-2,0xcccc0000L);
00155 HPERM_OP(d,t,-2,0xcccc0000L);
00156 PERM_OP (d,c,t,1,0x55555555L);
00157 PERM_OP (c,d,t,8,0x00ff00ffL);
00158 PERM_OP (d,c,t,1,0x55555555L);
00159 d= (((d&0x000000ffL)<<16)| (d&0x0000ff00L) |
00160 ((d&0x00ff0000L)>>16)|((c&0xf0000000L)>>4));
00161 c&=0x0fffffffL;
00162
00163 for (i=0; i<ITERATIONS; i++)
00164 {
00165 if (shifts2[i])
00166 { c=((c>>2)|(c<<26)); d=((d>>2)|(d<<26)); }
00167 else
00168 { c=((c>>1)|(c<<27)); d=((d>>1)|(d<<27)); }
00169 c&=0x0fffffffL;
00170 d&=0x0fffffffL;
00171
00172
00173 s= des_skb[0][ (c )&0x3f ]|
00174 des_skb[1][((c>> 6)&0x03)|((c>> 7)&0x3c)]|
00175 des_skb[2][((c>>13)&0x0f)|((c>>14)&0x30)]|
00176 des_skb[3][((c>>20)&0x01)|((c>>21)&0x06) |
00177 ((c>>22)&0x38)];
00178 t= des_skb[4][ (d )&0x3f ]|
00179 des_skb[5][((d>> 7)&0x03)|((d>> 8)&0x3c)]|
00180 des_skb[6][ (d>>15)&0x3f ]|
00181 des_skb[7][((d>>21)&0x0f)|((d>>22)&0x30)];
00182
00183
00184 *(k++)=((t<<16)|(s&0x0000ffffL))&0xffffffffL;
00185 s= ((s>>16)|(t&0xffff0000L));
00186
00187 s=(s<<4)|(s>>28);
00188 *(k++)=s&0xffffffffL;
00189 }
00190 return(0);
00191 }
00192
00193 int des_key_sched(key,schedule)
00194 des_cblock *key;
00195 des_key_schedule schedule;
00196 {
00197 return(des_set_key(key,schedule));
00198 }