summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/des/set_key.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/des/set_key.c')
-rw-r--r--src/lib/libcrypto/des/set_key.c37
1 files changed, 25 insertions, 12 deletions
diff --git a/src/lib/libcrypto/des/set_key.c b/src/lib/libcrypto/des/set_key.c
index 52553a4c16..bbdc71ba6b 100644
--- a/src/lib/libcrypto/des/set_key.c
+++ b/src/lib/libcrypto/des/set_key.c
@@ -125,7 +125,7 @@ int des_is_weak_key(const_des_cblock *key)
125 int i; 125 int i;
126 126
127 for (i=0; i<NUM_WEAK_KEY; i++) 127 for (i=0; i<NUM_WEAK_KEY; i++)
128 /* Added == 0 to comparision, I obviously don't run 128 /* Added == 0 to comparison, I obviously don't run
129 * this section very often :-(, thanks to 129 * this section very often :-(, thanks to
130 * engineering@MorningStar.Com for the fix 130 * engineering@MorningStar.Com for the fix
131 * eay 93/06/29 131 * eay 93/06/29
@@ -145,11 +145,34 @@ int des_is_weak_key(const_des_cblock *key)
145#define HPERM_OP(a,t,n,m) ((t)=((((a)<<(16-(n)))^(a))&(m)),\ 145#define HPERM_OP(a,t,n,m) ((t)=((((a)<<(16-(n)))^(a))&(m)),\
146 (a)=(a)^(t)^(t>>(16-(n)))) 146 (a)=(a)^(t)^(t>>(16-(n))))
147 147
148int des_set_key(const_des_cblock *key, des_key_schedule schedule)
149 {
150 if (des_check_key)
151 {
152 return des_set_key_checked(key, schedule);
153 }
154 else
155 {
156 des_set_key_unchecked(key, schedule);
157 return 0;
158 }
159 }
160
148/* return 0 if key parity is odd (correct), 161/* return 0 if key parity is odd (correct),
149 * return -1 if key parity error, 162 * return -1 if key parity error,
150 * return -2 if illegal weak key. 163 * return -2 if illegal weak key.
151 */ 164 */
152int des_set_key(const_des_cblock *key, des_key_schedule schedule) 165int des_set_key_checked(const_des_cblock *key, des_key_schedule schedule)
166 {
167 if (!check_parity(key))
168 return(-1);
169 if (des_is_weak_key(key))
170 return(-2);
171 des_set_key_unchecked(key, schedule);
172 return 0;
173 }
174
175void des_set_key_unchecked(const_des_cblock *key, des_key_schedule schedule)
153 { 176 {
154 static int shifts2[16]={0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0}; 177 static int shifts2[16]={0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0};
155 register DES_LONG c,d,t,s,t2; 178 register DES_LONG c,d,t,s,t2;
@@ -157,15 +180,6 @@ int des_set_key(const_des_cblock *key, des_key_schedule schedule)
157 register DES_LONG *k; 180 register DES_LONG *k;
158 register int i; 181 register int i;
159 182
160 if (des_check_key)
161 {
162 if (!check_parity(key))
163 return(-1);
164
165 if (des_is_weak_key(key))
166 return(-2);
167 }
168
169 k = &schedule->ks.deslong[0]; 183 k = &schedule->ks.deslong[0];
170 in = &(*key)[0]; 184 in = &(*key)[0];
171 185
@@ -225,7 +239,6 @@ int des_set_key(const_des_cblock *key, des_key_schedule schedule)
225 t2=((s>>16L)|(t&0xffff0000L)); 239 t2=((s>>16L)|(t&0xffff0000L));
226 *(k++)=ROTATE(t2,26)&0xffffffffL; 240 *(k++)=ROTATE(t2,26)&0xffffffffL;
227 } 241 }
228 return(0);
229 } 242 }
230 243
231int des_key_sched(const_des_cblock *key, des_key_schedule schedule) 244int des_key_sched(const_des_cblock *key, des_key_schedule schedule)