diff options
Diffstat (limited to '')
-rw-r--r-- | libbb/pw_encrypt_des.c | 88 |
1 files changed, 17 insertions, 71 deletions
diff --git a/libbb/pw_encrypt_des.c b/libbb/pw_encrypt_des.c index fe8237cfe..ca8aa9bcc 100644 --- a/libbb/pw_encrypt_des.c +++ b/libbb/pw_encrypt_des.c | |||
@@ -186,39 +186,9 @@ static const uint8_t pbox[32] ALIGN1 = { | |||
186 | 2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25 | 186 | 2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25 |
187 | }; | 187 | }; |
188 | 188 | ||
189 | static const uint32_t bits32[32] ALIGN4 = { | ||
190 | 0x80000000, 0x40000000, 0x20000000, 0x10000000, | ||
191 | 0x08000000, 0x04000000, 0x02000000, 0x01000000, | ||
192 | 0x00800000, 0x00400000, 0x00200000, 0x00100000, | ||
193 | 0x00080000, 0x00040000, 0x00020000, 0x00010000, | ||
194 | 0x00008000, 0x00004000, 0x00002000, 0x00001000, | ||
195 | 0x00000800, 0x00000400, 0x00000200, 0x00000100, | ||
196 | 0x00000080, 0x00000040, 0x00000020, 0x00000010, | ||
197 | 0x00000008, 0x00000004, 0x00000002, 0x00000001 | ||
198 | }; | ||
199 | |||
200 | static const uint8_t bits8[8] ALIGN1 = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 }; | 189 | static const uint8_t bits8[8] ALIGN1 = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 }; |
201 | 190 | ||
202 | 191 | ||
203 | static int | ||
204 | ascii_to_bin(char ch) | ||
205 | { | ||
206 | if (ch > 'z') | ||
207 | return 0; | ||
208 | if (ch >= 'a') | ||
209 | return (ch - 'a' + 38); | ||
210 | if (ch > 'Z') | ||
211 | return 0; | ||
212 | if (ch >= 'A') | ||
213 | return (ch - 'A' + 12); | ||
214 | if (ch > '9') | ||
215 | return 0; | ||
216 | if (ch >= '.') | ||
217 | return (ch - '.'); | ||
218 | return 0; | ||
219 | } | ||
220 | |||
221 | |||
222 | /* Static stuff that stays resident and doesn't change after | 192 | /* Static stuff that stays resident and doesn't change after |
223 | * being initialized, and therefore doesn't need to be made | 193 | * being initialized, and therefore doesn't need to be made |
224 | * reentrant. */ | 194 | * reentrant. */ |
@@ -354,11 +324,18 @@ des_init(struct des_ctx *ctx, const struct const_des_ctx *cctx) | |||
354 | int i, j, b, k, inbit, obit; | 324 | int i, j, b, k, inbit, obit; |
355 | uint32_t p; | 325 | uint32_t p; |
356 | const uint32_t *bits28, *bits24; | 326 | const uint32_t *bits28, *bits24; |
327 | uint32_t bits32[32]; | ||
357 | 328 | ||
358 | if (!ctx) | 329 | if (!ctx) |
359 | ctx = xmalloc(sizeof(*ctx)); | 330 | ctx = xmalloc(sizeof(*ctx)); |
360 | const_ctx = cctx; | 331 | const_ctx = cctx; |
361 | 332 | ||
333 | p = 0x80000000U; | ||
334 | for (i = 0; p; i++) { | ||
335 | bits32[i] = p; | ||
336 | p >>= 1; | ||
337 | } | ||
338 | |||
362 | #if USE_REPETITIVE_SPEEDUP | 339 | #if USE_REPETITIVE_SPEEDUP |
363 | old_rawkey0 = old_rawkey1 = 0; | 340 | old_rawkey0 = old_rawkey1 = 0; |
364 | old_salt = 0; | 341 | old_salt = 0; |
@@ -694,21 +671,6 @@ do_des(struct des_ctx *ctx, /*uint32_t l_in, uint32_t r_in,*/ uint32_t *l_out, u | |||
694 | 671 | ||
695 | #define DES_OUT_BUFSIZE 21 | 672 | #define DES_OUT_BUFSIZE 21 |
696 | 673 | ||
697 | static void | ||
698 | to64_msb_first(char *s, unsigned v) | ||
699 | { | ||
700 | #if 0 | ||
701 | *s++ = ascii64[(v >> 18) & 0x3f]; /* bits 23..18 */ | ||
702 | *s++ = ascii64[(v >> 12) & 0x3f]; /* bits 17..12 */ | ||
703 | *s++ = ascii64[(v >> 6) & 0x3f]; /* bits 11..6 */ | ||
704 | *s = ascii64[v & 0x3f]; /* bits 5..0 */ | ||
705 | #endif | ||
706 | *s++ = i64c(v >> 18); /* bits 23..18 */ | ||
707 | *s++ = i64c(v >> 12); /* bits 17..12 */ | ||
708 | *s++ = i64c(v >> 6); /* bits 11..6 */ | ||
709 | *s = i64c(v); /* bits 5..0 */ | ||
710 | } | ||
711 | |||
712 | static char * | 674 | static char * |
713 | NOINLINE | 675 | NOINLINE |
714 | des_crypt(struct des_ctx *ctx, char output[DES_OUT_BUFSIZE], | 676 | des_crypt(struct des_ctx *ctx, char output[DES_OUT_BUFSIZE], |
@@ -740,44 +702,28 @@ des_crypt(struct des_ctx *ctx, char output[DES_OUT_BUFSIZE], | |||
740 | */ | 702 | */ |
741 | output[0] = salt_str[0]; | 703 | output[0] = salt_str[0]; |
742 | output[1] = salt_str[1]; | 704 | output[1] = salt_str[1]; |
743 | salt = (ascii_to_bin(salt_str[1]) << 6) | 705 | |
744 | | ascii_to_bin(salt_str[0]); | 706 | salt = a2i64(salt_str[0]); |
707 | if (salt >= 64) | ||
708 | return NULL; /* bad salt char */ | ||
709 | salt |= (a2i64(salt_str[1]) << 6); | ||
710 | if (salt >= (64 << 6)) | ||
711 | return NULL; /* bad salt char */ | ||
745 | setup_salt(ctx, salt); /* set ctx->saltbits for do_des() */ | 712 | setup_salt(ctx, salt); /* set ctx->saltbits for do_des() */ |
746 | 713 | ||
747 | /* Do it. */ | 714 | /* Do it. */ |
748 | do_des(ctx, /*0, 0,*/ &r0, &r1, 25 /* count */); | 715 | do_des(ctx, /*0, 0,*/ &r0, &r1, 25 /* count */); |
749 | 716 | ||
750 | /* Now encode the result. */ | 717 | /* Now encode the result. */ |
751 | #if 0 | ||
752 | { | ||
753 | uint32_t l = (r0 >> 8); | ||
754 | q = (uint8_t *)output + 2; | ||
755 | *q++ = ascii64[(l >> 18) & 0x3f]; /* bits 31..26 of r0 */ | ||
756 | *q++ = ascii64[(l >> 12) & 0x3f]; /* bits 25..20 of r0 */ | ||
757 | *q++ = ascii64[(l >> 6) & 0x3f]; /* bits 19..14 of r0 */ | ||
758 | *q++ = ascii64[l & 0x3f]; /* bits 13..8 of r0 */ | ||
759 | l = ((r0 << 16) | (r1 >> 16)); | ||
760 | *q++ = ascii64[(l >> 18) & 0x3f]; /* bits 7..2 of r0 */ | ||
761 | *q++ = ascii64[(l >> 12) & 0x3f]; /* bits 1..2 of r0 and 31..28 of r1 */ | ||
762 | *q++ = ascii64[(l >> 6) & 0x3f]; /* bits 27..22 of r1 */ | ||
763 | *q++ = ascii64[l & 0x3f]; /* bits 21..16 of r1 */ | ||
764 | l = r1 << 2; | ||
765 | *q++ = ascii64[(l >> 12) & 0x3f]; /* bits 15..10 of r1 */ | ||
766 | *q++ = ascii64[(l >> 6) & 0x3f]; /* bits 9..4 of r1 */ | ||
767 | *q++ = ascii64[l & 0x3f]; /* bits 3..0 of r1 + 00 */ | ||
768 | *q = 0; | ||
769 | } | ||
770 | #else | ||
771 | /* Each call takes low-order 24 bits and stores 4 chars */ | 718 | /* Each call takes low-order 24 bits and stores 4 chars */ |
772 | /* bits 31..8 of r0 */ | 719 | /* bits 31..8 of r0 */ |
773 | to64_msb_first(output + 2, (r0 >> 8)); | 720 | num2str64_4chars_msb_first(output + 2, (r0 >> 8)); |
774 | /* bits 7..0 of r0 and 31..16 of r1 */ | 721 | /* bits 7..0 of r0 and 31..16 of r1 */ |
775 | to64_msb_first(output + 6, (r0 << 16) | (r1 >> 16)); | 722 | num2str64_4chars_msb_first(output + 6, (r0 << 16) | (r1 >> 16)); |
776 | /* bits 15..0 of r1 and two zero bits (plus extra zero byte) */ | 723 | /* bits 15..0 of r1 and two zero bits (plus extra zero byte) */ |
777 | to64_msb_first(output + 10, (r1 << 8)); | 724 | num2str64_4chars_msb_first(output + 10, (r1 << 8)); |
778 | /* extra zero byte is encoded as '.', fixing it */ | 725 | /* extra zero byte is encoded as '.', fixing it */ |
779 | output[13] = '\0'; | 726 | output[13] = '\0'; |
780 | #endif | ||
781 | 727 | ||
782 | return output; | 728 | return output; |
783 | } | 729 | } |