projects
/
oweals
/
busybox.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
libbb/md5: code shrink
[oweals/busybox.git]
/
libbb
/
pw_encrypt_sha.c
diff --git
a/libbb/pw_encrypt_sha.c
b/libbb/pw_encrypt_sha.c
index 08b0647501e7938484323ba3e98b5ce287cbfd8b..070e0d442cd8c66a35b4508bf18547671eaa83f2 100644
(file)
--- a/
libbb/pw_encrypt_sha.c
+++ b/
libbb/pw_encrypt_sha.c
@@
-20,22
+20,28
@@
sha_crypt(/*const*/ char *key_data, /*const*/ char *salt_data)
{
void (*sha_begin)(void *ctx) FAST_FUNC;
void (*sha_hash)(const void *buffer, size_t len, void *ctx) FAST_FUNC;
{
void (*sha_begin)(void *ctx) FAST_FUNC;
void (*sha_hash)(const void *buffer, size_t len, void *ctx) FAST_FUNC;
- void
*
(*sha_end)(void *resbuf, void *ctx) FAST_FUNC;
+ void (*sha_end)(void *resbuf, void *ctx) FAST_FUNC;
int _32or64;
char *result, *resptr;
/* btw, sha256 needs [32] and uint32_t only */
int _32or64;
char *result, *resptr;
/* btw, sha256 needs [32] and uint32_t only */
- unsigned char alt_result[64] __attribute__((__aligned__(__alignof__(uint64_t))));
- unsigned char temp_result[64] __attribute__((__aligned__(__alignof__(uint64_t))));
- union {
- sha256_ctx_t x;
- sha512_ctx_t y;
- } ctx;
- union {
- sha256_ctx_t x;
- sha512_ctx_t y;
- } alt_ctx;
+ struct {
+ unsigned char alt_result[64];
+ unsigned char temp_result[64];
+ union {
+ sha256_ctx_t x;
+ sha512_ctx_t y;
+ } ctx;
+ union {
+ sha256_ctx_t x;
+ sha512_ctx_t y;
+ } alt_ctx;
+ } L __attribute__((__aligned__(__alignof__(uint64_t))));
+#define alt_result (L.alt_result )
+#define temp_result (L.temp_result)
+#define ctx (L.ctx )
+#define alt_ctx (L.alt_ctx )
unsigned salt_len;
unsigned key_len;
unsigned cnt;
unsigned salt_len;
unsigned key_len;
unsigned cnt;
@@
-186,7
+192,6
@@
sha_crypt(/*const*/ char *key_data, /*const*/ char *salt_data)
sha_end(alt_result, &ctx);
}
sha_end(alt_result, &ctx);
}
-
/* Append encrypted password to result buffer */
//TODO: replace with something like
// bb_uuencode(cp, src, length, bb_uuenc_tbl_XXXbase64);
/* Append encrypted password to result buffer */
//TODO: replace with something like
// bb_uuencode(cp, src, length, bb_uuenc_tbl_XXXbase64);
@@
-197,24
+202,20
@@
do { \
} while (0)
if (is_sha512 == '5') {
unsigned i = 0;
} while (0)
if (is_sha512 == '5') {
unsigned i = 0;
- unsigned j = 10;
- unsigned k = 20;
- /* strange swap of one byte (see below why) */
- unsigned char alt_result_31 = alt_result[31];
- alt_result[31] = alt_result[1];
while (1) {
while (1) {
+ unsigned j = i + 10;
+ unsigned k = i + 20;
+ if (j >= 30) j -= 30;
+ if (k >= 30) k -= 30;
b64_from_24bit(alt_result[i], alt_result[j], alt_result[k], 4);
b64_from_24bit(alt_result[i], alt_result[j], alt_result[k], 4);
- if (
i ==
9)
+ if (
k == 2
9)
break;
break;
- i += 21; i = (((i >> 4) & 2) + i) & 0x1f;
- j += 21; j = (((j >> 4) & 2) + j) & 0x1f;
- k += 21; k = (((k >> 4) & 2) + k) & 0x1f;
+ i = k + 1;
}
}
- b64_from_24bit(0, alt_result
_31
, alt_result[30], 3);
+ b64_from_24bit(0, alt_result
[31]
, alt_result[30], 3);
/* was:
b64_from_24bit(alt_result[0], alt_result[10], alt_result[20], 4);
b64_from_24bit(alt_result[21], alt_result[1], alt_result[11], 4);
/* was:
b64_from_24bit(alt_result[0], alt_result[10], alt_result[20], 4);
b64_from_24bit(alt_result[21], alt_result[1], alt_result[11], 4);
- ...............................^^^^^^^^^^^^^ why [1] and not [31]?
b64_from_24bit(alt_result[12], alt_result[22], alt_result[2], 4);
b64_from_24bit(alt_result[3], alt_result[13], alt_result[23], 4);
b64_from_24bit(alt_result[24], alt_result[4], alt_result[14], 4);
b64_from_24bit(alt_result[12], alt_result[22], alt_result[2], 4);
b64_from_24bit(alt_result[3], alt_result[13], alt_result[23], 4);
b64_from_24bit(alt_result[24], alt_result[4], alt_result[14], 4);
@@
-227,15
+228,15
@@
do { \
*/
} else {
unsigned i = 0;
*/
} else {
unsigned i = 0;
- unsigned j = 21;
- unsigned k = 42;
while (1) {
while (1) {
+ unsigned j = i + 21;
+ unsigned k = i + 42;
+ if (j >= 63) j -= 63;
+ if (k >= 63) k -= 63;
b64_from_24bit(alt_result[i], alt_result[j], alt_result[k], 4);
b64_from_24bit(alt_result[i], alt_result[j], alt_result[k], 4);
- if (
i == 62
)
+ if (
j == 20
)
break;
break;
- i += 22; i = ((i >> 6) + i) & 0x3f;
- j += 22; j = ((j >> 6) + j) & 0x3f;
- k += 22; k = ((k >> 6) + k) & 0x3f;
+ i = j + 1;
}
b64_from_24bit(0, 0, alt_result[63], 2);
/* was:
}
b64_from_24bit(0, 0, alt_result[63], 2);
/* was:
@@
-269,10
+270,7
@@
do { \
/* Clear the buffer for the intermediate result so that people
attaching to processes or reading core dumps cannot get any
information. */
/* Clear the buffer for the intermediate result so that people
attaching to processes or reading core dumps cannot get any
information. */
- memset(temp_result, 0, sizeof(temp_result));
- memset(alt_result, 0, sizeof(alt_result));
- memset(&ctx, 0, sizeof(ctx));
- memset(&alt_ctx, 0, sizeof(alt_ctx));
+ memset(&L, 0, sizeof(L)); /* [alt]_ctx and XXX_result buffers */
memset(key_data, 0, key_len); /* also p_bytes */
memset(salt_data, 0, salt_len); /* also s_bytes */
free(key_data);
memset(key_data, 0, key_len); /* also p_bytes */
memset(salt_data, 0, salt_len); /* also s_bytes */
free(key_data);
@@
-281,4
+279,8
@@
do { \
#undef s_bytes
return result;
#undef s_bytes
return result;
+#undef alt_result
+#undef temp_result
+#undef ctx
+#undef alt_ctx
}
}