summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authortedu <>2014-11-25 03:23:22 +0000
committertedu <>2014-11-25 03:23:22 +0000
commitb0057c9d56740b0d496b5d06e31f8678c6620501 (patch)
tree16be0afbcb77607e23b2a260b3f7809ce18572ad /src/lib
parent7635c59d42cf0e911e47961db9474ca293af1214 (diff)
downloadopenbsd-b0057c9d56740b0d496b5d06e31f8678c6620501.tar.gz
openbsd-b0057c9d56740b0d496b5d06e31f8678c6620501.tar.bz2
openbsd-b0057c9d56740b0d496b5d06e31f8678c6620501.zip
revert the bludgeoning of DES. if we need a thread safe crypt, maybe it's
better to find one instead of continuing to mangle this mess.
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/libc/crypt/crypt.c64
1 files changed, 33 insertions, 31 deletions
diff --git a/src/lib/libc/crypt/crypt.c b/src/lib/libc/crypt/crypt.c
index c74a6784bb..a4c864dea3 100644
--- a/src/lib/libc/crypt/crypt.c
+++ b/src/lib/libc/crypt/crypt.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: crypt.c,v 1.23 2014/11/25 03:04:22 tedu Exp $ */ 1/* $OpenBSD: crypt.c,v 1.24 2014/11/25 03:23:22 tedu Exp $ */
2 2
3/* 3/*
4 * FreeSec: libcrypt 4 * FreeSec: libcrypt
@@ -162,8 +162,8 @@ const u_char _des_bits8[8] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 };
162 162
163static const u_int32_t *bits28, *bits24; 163static const u_int32_t *bits28, *bits24;
164static u_char init_perm[64], final_perm[64]; 164static u_char init_perm[64], final_perm[64];
165static u_int32_t g_en_keysl[16], g_en_keysr[16]; 165static u_int32_t en_keysl[16], en_keysr[16];
166static u_int32_t g_de_keysl[16], g_de_keysr[16]; 166static u_int32_t de_keysl[16], de_keysr[16];
167int _des_initialised = 0; 167int _des_initialised = 0;
168static u_char m_sbox[4][4096]; 168static u_char m_sbox[4][4096];
169static u_int32_t psbox[4][256]; 169static u_int32_t psbox[4][256];
@@ -171,6 +171,7 @@ static u_int32_t ip_maskl[8][256], ip_maskr[8][256];
171static u_int32_t fp_maskl[8][256], fp_maskr[8][256]; 171static u_int32_t fp_maskl[8][256], fp_maskr[8][256];
172static u_int32_t key_perm_maskl[8][128], key_perm_maskr[8][128]; 172static u_int32_t key_perm_maskl[8][128], key_perm_maskr[8][128];
173static u_int32_t comp_maskl[8][128], comp_maskr[8][128]; 173static u_int32_t comp_maskl[8][128], comp_maskr[8][128];
174static u_int32_t old_rawkey0, old_rawkey1;
174 175
175static u_char ascii64[] = 176static u_char ascii64[] =
176 "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; 177 "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
@@ -201,6 +202,7 @@ _des_init(void)
201 int i, j, b, k, inbit, obit; 202 int i, j, b, k, inbit, obit;
202 u_int32_t *p, *il, *ir, *fl, *fr; 203 u_int32_t *p, *il, *ir, *fl, *fr;
203 204
205 old_rawkey0 = old_rawkey1 = 0;
204 bits24 = (bits28 = _des_bits32 + 4) + 4; 206 bits24 = (bits28 = _des_bits32 + 4) + 4;
205 207
206 /* 208 /*
@@ -340,8 +342,8 @@ _des_setup_salt(int32_t salt)
340 return saltbits; 342 return saltbits;
341} 343}
342 344
343static int 345int
344_des_do_setkey(const char *key, u_int32_t *en_keysl, u_int32_t *en_keysr) 346des_setkey(const char *key)
345{ 347{
346 u_int32_t k0, k1, rawkey0, rawkey1; 348 u_int32_t k0, k1, rawkey0, rawkey1;
347 int shifts, round; 349 int shifts, round;
@@ -352,6 +354,20 @@ _des_do_setkey(const char *key, u_int32_t *en_keysl, u_int32_t *en_keysr)
352 rawkey0 = ntohl(*(u_int32_t *) key); 354 rawkey0 = ntohl(*(u_int32_t *) key);
353 rawkey1 = ntohl(*(u_int32_t *) (key + 4)); 355 rawkey1 = ntohl(*(u_int32_t *) (key + 4));
354 356
357 if ((rawkey0 | rawkey1)
358 && rawkey0 == old_rawkey0
359 && rawkey1 == old_rawkey1) {
360 /*
361 * Already setup for this key.
362 * This optimisation fails on a zero key (which is weak and
363 * has bad parity anyway) in order to simplify the starting
364 * conditions.
365 */
366 return(0);
367 }
368 old_rawkey0 = rawkey0;
369 old_rawkey1 = rawkey1;
370
355 /* 371 /*
356 * Do key permutation and split into two 28-bit subkeys. 372 * Do key permutation and split into two 28-bit subkeys.
357 */ 373 */
@@ -383,7 +399,7 @@ _des_do_setkey(const char *key, u_int32_t *en_keysl, u_int32_t *en_keysr)
383 t0 = (k0 << shifts) | (k0 >> (28 - shifts)); 399 t0 = (k0 << shifts) | (k0 >> (28 - shifts));
384 t1 = (k1 << shifts) | (k1 >> (28 - shifts)); 400 t1 = (k1 << shifts) | (k1 >> (28 - shifts));
385 401
386 g_de_keysl[15 - round] = /* XXX global */ 402 de_keysl[15 - round] =
387 en_keysl[round] = comp_maskl[0][(t0 >> 21) & 0x7f] 403 en_keysl[round] = comp_maskl[0][(t0 >> 21) & 0x7f]
388 | comp_maskl[1][(t0 >> 14) & 0x7f] 404 | comp_maskl[1][(t0 >> 14) & 0x7f]
389 | comp_maskl[2][(t0 >> 7) & 0x7f] 405 | comp_maskl[2][(t0 >> 7) & 0x7f]
@@ -393,7 +409,7 @@ _des_do_setkey(const char *key, u_int32_t *en_keysl, u_int32_t *en_keysr)
393 | comp_maskl[6][(t1 >> 7) & 0x7f] 409 | comp_maskl[6][(t1 >> 7) & 0x7f]
394 | comp_maskl[7][t1 & 0x7f]; 410 | comp_maskl[7][t1 & 0x7f];
395 411
396 g_de_keysr[15 - round] = /* XXX global */ 412 de_keysr[15 - round] =
397 en_keysr[round] = comp_maskr[0][(t0 >> 21) & 0x7f] 413 en_keysr[round] = comp_maskr[0][(t0 >> 21) & 0x7f]
398 | comp_maskr[1][(t0 >> 14) & 0x7f] 414 | comp_maskr[1][(t0 >> 14) & 0x7f]
399 | comp_maskr[2][(t0 >> 7) & 0x7f] 415 | comp_maskr[2][(t0 >> 7) & 0x7f]
@@ -407,14 +423,8 @@ _des_do_setkey(const char *key, u_int32_t *en_keysl, u_int32_t *en_keysr)
407} 423}
408 424
409int 425int
410des_setkey(const char *key)
411{
412 return _des_do_setkey(key, g_en_keysl, g_en_keysr);
413}
414
415int
416_des_do_des(u_int32_t l_in, u_int32_t r_in, u_int32_t *l_out, u_int32_t *r_out, 426_des_do_des(u_int32_t l_in, u_int32_t r_in, u_int32_t *l_out, u_int32_t *r_out,
417 int count, u_int32_t saltbits, u_int32_t *en_keysl, u_int32_t *en_keysr) 427 int count, u_int32_t saltbits)
418{ 428{
419 /* 429 /*
420 * l_in, r_in, l_out, and r_out are in pseudo-"big-endian" format. 430 * l_in, r_in, l_out, and r_out are in pseudo-"big-endian" format.
@@ -433,11 +443,11 @@ _des_do_des(u_int32_t l_in, u_int32_t r_in, u_int32_t *l_out, u_int32_t *r_out,
433 kr1 = en_keysr; 443 kr1 = en_keysr;
434 } else { 444 } else {
435 /* 445 /*
436 * Decrypting XXX global 446 * Decrypting
437 */ 447 */
438 count = -count; 448 count = -count;
439 kl1 = g_de_keysl; 449 kl1 = de_keysl;
440 kr1 = g_de_keysr; 450 kr1 = de_keysr;
441 } 451 }
442 452
443 /* 453 /*
@@ -530,8 +540,7 @@ _des_do_des(u_int32_t l_in, u_int32_t r_in, u_int32_t *l_out, u_int32_t *r_out,
530} 540}
531 541
532int 542int
533_des_do_cipher(const char *in, char *out, int32_t salt, int count, 543des_cipher(const char *in, char *out, int32_t salt, int count)
534 u_int32_t *en_keysl, u_int32_t *en_keysr)
535{ 544{
536 u_int32_t l_out, r_out, rawl, rawr, saltbits; 545 u_int32_t l_out, r_out, rawl, rawr, saltbits;
537 u_int32_t x[2]; 546 u_int32_t x[2];
@@ -545,7 +554,7 @@ _des_do_cipher(const char *in, char *out, int32_t salt, int count,
545 memcpy(x, in, sizeof x); 554 memcpy(x, in, sizeof x);
546 rawl = ntohl(x[0]); 555 rawl = ntohl(x[0]);
547 rawr = ntohl(x[1]); 556 rawr = ntohl(x[1]);
548 retval = _des_do_des(rawl, rawr, &l_out, &r_out, count, saltbits, en_keysl, en_keysr); 557 retval = _des_do_des(rawl, rawr, &l_out, &r_out, count, saltbits);
549 558
550 x[0] = htonl(l_out); 559 x[0] = htonl(l_out);
551 x[1] = htonl(r_out); 560 x[1] = htonl(r_out);
@@ -553,16 +562,9 @@ _des_do_cipher(const char *in, char *out, int32_t salt, int count,
553 return(retval); 562 return(retval);
554} 563}
555 564
556int
557des_cipher(const char *in, char *out, int32_t salt, int count)
558{
559 return _des_do_cipher(in, out, salt, count, g_en_keysl, g_en_keysr);
560}
561
562static int 565static int
563crypt_hashpass(const char *key, const char *setting, char *output) 566crypt_hashpass(const char *key, const char *setting, char *output)
564{ 567{
565 u_int32_t en_keysl[16], en_keysr[16];
566 int i; 568 int i;
567 u_int32_t count, salt, l, r0, r1, saltbits, keybuf[2]; 569 u_int32_t count, salt, l, r0, r1, saltbits, keybuf[2];
568 u_char *p, *q; 570 u_char *p, *q;
@@ -579,7 +581,7 @@ crypt_hashpass(const char *key, const char *setting, char *output)
579 if ((*q++ = *key << 1)) 581 if ((*q++ = *key << 1))
580 key++; 582 key++;
581 } 583 }
582 if (_des_do_setkey((char *)keybuf, en_keysl, en_keysr)) 584 if (des_setkey((char *) keybuf))
583 return(-1); 585 return(-1);
584 586
585 if (*setting == _PASSWORD_EFMT1) { 587 if (*setting == _PASSWORD_EFMT1) {
@@ -598,7 +600,7 @@ crypt_hashpass(const char *key, const char *setting, char *output)
598 /* 600 /*
599 * Encrypt the key with itself. 601 * Encrypt the key with itself.
600 */ 602 */
601 if (_des_do_cipher((char *)keybuf, (char *)keybuf, 0, 1, en_keysl, en_keysr)) 603 if (des_cipher((char *)keybuf, (char *)keybuf, 0, 1))
602 return(-1); 604 return(-1);
603 /* 605 /*
604 * And XOR with the next 8 characters of the key. 606 * And XOR with the next 8 characters of the key.
@@ -608,7 +610,7 @@ crypt_hashpass(const char *key, const char *setting, char *output)
608 *key) 610 *key)
609 *q++ ^= *key++ << 1; 611 *q++ ^= *key++ << 1;
610 612
611 if (_des_do_setkey((char *)keybuf, en_keysl, en_keysr)) 613 if (des_setkey((char *) keybuf))
612 return(-1); 614 return(-1);
613 } 615 }
614 strlcpy((char *)output, setting, 10); 616 strlcpy((char *)output, setting, 10);
@@ -648,7 +650,7 @@ crypt_hashpass(const char *key, const char *setting, char *output)
648 /* 650 /*
649 * Do it. 651 * Do it.
650 */ 652 */
651 if (_des_do_des(0, 0, &r0, &r1, count, saltbits, en_keysl, en_keysr)) 653 if (_des_do_des(0, 0, &r0, &r1, count, saltbits))
652 return(-1); 654 return(-1);
653 /* 655 /*
654 * Now encode the result... 656 * Now encode the result...