diff options
Diffstat (limited to 'src/lib/libcrypto/des/set_key.c')
-rw-r--r-- | src/lib/libcrypto/des/set_key.c | 37 |
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 | ||
148 | int 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 | */ |
152 | int des_set_key(const_des_cblock *key, des_key_schedule schedule) | 165 | int 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 | |||
175 | void 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 | ||
231 | int des_key_sched(const_des_cblock *key, des_key_schedule schedule) | 244 | int des_key_sched(const_des_cblock *key, des_key_schedule schedule) |