aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Landley <rob@landley.net>2019-08-13 07:05:52 -0500
committerRob Landley <rob@landley.net>2019-08-13 07:05:52 -0500
commit168c9820628f9ebc447904cb68e54b042e3bcfba (patch)
tree23db8be40b52a41f13eae30fdda666a2d432f090
parent09ff0595ee949c34e9d244a3042b28adc36e2136 (diff)
downloadtoybox-168c9820628f9ebc447904cb68e54b042e3bcfba.tar.gz
Return md5sum/sha1sum to the slightly slower but more explicit version
(revert afe951b19c0f with the table of magic constants). If you want speed, there's already a config option to use the libssl version instead.
-rw-r--r--toys/lsb/md5sum.c48
1 files changed, 23 insertions, 25 deletions
diff --git a/toys/lsb/md5sum.c b/toys/lsb/md5sum.c
index 14024184..3db25f9c 100644
--- a/toys/lsb/md5sum.c
+++ b/toys/lsb/md5sum.c
@@ -102,8 +102,6 @@ GLOBALS(
} buffer;
)
-#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
-
// for(i=0; i<64; i++) md5table[i] = abs(sin(i+1))*(1<<32); But calculating
// that involves not just floating point but pulling in -lm (and arguing with
// C about whether 1<<32 is a valid thing to do on 32 bit platforms) so:
@@ -122,45 +120,44 @@ static uint32_t md5table[64] = {
0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391
};
-static const uint8_t md5rot[64] = {
- 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22,
- 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20,
- 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23,
- 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21
-};
-
// Mix next 64 bytes of data into md5 hash
static void md5_transform(void)
{
- unsigned x[4], *b = TT.buffer.i;
+ unsigned x[4], *b = (unsigned *)TT.buffer.c;
int i;
memcpy(x, TT.state, sizeof(x));
for (i=0; i<64; i++) {
- unsigned int in, temp, swap;
+ unsigned int in, a, rot, temp;
+
+ a = (-i)&3;
if (i<16) {
in = i;
- temp = x[1];
- temp = (temp & x[2]) | ((~temp) & x[3]);
+ rot = 7+(5*(i&3));
+ temp = x[(a+1)&3];
+ temp = (temp & x[(a+2)&3]) | ((~temp) & x[(a+3)&3]);
} else if (i<32) {
in = (1+(5*i))&15;
- temp = x[3];
- temp = (x[1] & temp) | (x[2] & ~temp);
+ temp = (i&3)+1;
+ rot = temp*5;
+ if (temp&2) rot--;
+ temp = x[(a+3)&3];
+ temp = (x[(a+1)&3] & temp) | (x[(a+2)&3] & ~temp);
} else if (i<48) {
- in = (3*i+5)&15;
- temp = x[1] ^ x[2] ^ x[3];
+ in = (5+(3*(i&15)))&15;
+ rot = i&3;
+ rot = 4+(5*rot)+((rot+1)&6);
+ temp = x[(a+1)&3] ^ x[(a+2)&3] ^ x[(a+3)&3];
} else {
- in = (7*i)&15;
- temp = x[2] ^ (x[1] | ~x[3]);
+ in = (7*(i&15))&15;
+ rot = (i&3)+1;
+ rot = (5*rot)+(((rot+2)&2)>>1);
+ temp = x[(a+2)&3] ^ (x[(a+1)&3] | ~x[(a+3)&3]);
}
- temp += x[0] + b[in] + md5table[i];
- swap = x[3];
- x[3] = x[2];
- x[2] = x[1];
- x[1] += rol(temp, md5rot[i]);
- x[0] = swap;
+ temp += x[a] + b[in] + md5table[i];
+ x[a] = x[(a+1)&3] + ((temp<<rot) | (temp>>(32-rot)));
}
for (i=0; i<4; i++) TT.state[i] += x[i];
}
@@ -168,6 +165,7 @@ static void md5_transform(void)
// Mix next 64 bytes of data into sha1 hash.
static const unsigned rconsts[]={0x5A827999,0x6ED9EBA1,0x8F1BBCDC,0xCA62C1D6};
+#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
static void sha1_transform(void)
{