aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Landley <rob@landley.net>2020-04-07 18:25:46 -0500
committerRob Landley <rob@landley.net>2020-04-07 18:25:46 -0500
commit9d084c8ffc5e6442efcb2ec2d8f069475f8bd060 (patch)
tree8df99365dd8f4bca56284f5bdd2b180f9e246788
parentd5680f026fb83c8ff73a404eeabcc28211c5708d (diff)
downloadtoybox-9d084c8ffc5e6442efcb2ec2d8f069475f8bd060.tar.gz
Calculate table when float enabled, and rely on LP64 types.
-rw-r--r--toys/lsb/md5sum.c31
1 files changed, 20 insertions, 11 deletions
diff --git a/toys/lsb/md5sum.c b/toys/lsb/md5sum.c
index 31770ed5..65346675 100644
--- a/toys/lsb/md5sum.c
+++ b/toys/lsb/md5sum.c
@@ -92,21 +92,19 @@ typedef int SHA512_CTX;
GLOBALS(
int sawline;
+ unsigned *md5table;
// Crypto variables blanked after summing
- unsigned state[5];
- unsigned oldstate[5];
- uint64_t count;
+ unsigned state[5], oldstate[5];
+ unsigned long long count;
union {
char c[64];
unsigned i[16];
} buffer;
)
-// 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:
-
-static uint32_t md5table[64] = {
+// Static table for when we haven't got floating point support
+#if ! CFG_TOYBOX_FLOAT
+static unsigned md5nofloat[64] = {
0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, 0xf57c0faf, 0x4787c62a,
0xa8304613, 0xfd469501, 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be,
0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, 0xf61e2562, 0xc040b340,
@@ -119,6 +117,9 @@ static uint32_t md5table[64] = {
0xffeff47d, 0x85845dd1, 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1,
0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391
};
+#else
+#define md5nofloat 0
+#endif
// Mix next 64 bytes of data into md5 hash
@@ -156,7 +157,7 @@ static void md5_transform(void)
rot = (5*rot)+(((rot+2)&2)>>1);
temp = x[(a+2)&3] ^ (x[(a+1)&3] | ~x[(a+3)&3]);
}
- temp += x[a] + b[in] + md5table[i];
+ temp += x[a] + b[in] + TT.md5table[i];
x[a] = x[(a+1)&3] + ((temp<<rot) | (temp>>(32-rot)));
}
for (i=0; i<4; i++) TT.state[i] += x[i];
@@ -286,8 +287,8 @@ static void do_lib_hash(int fd, char *name)
static void do_builtin_hash(int fd, char *name)
{
- uint64_t count;
- int i, sha1=toys.which->name[0]=='s';
+ unsigned long long count;
+ int i, sha1 = toys.which->name[0]=='s';
char buf, *pp;
void (*transform)(void);
@@ -405,6 +406,14 @@ static void do_c_file(char *name)
void md5sum_main(void)
{
char **arg;
+ int i;
+
+ // Calculate table if we have floating point. Static version should drop
+ // out at compile time when we don't need it.
+ if (CFG_TOYBOX_FLOAT) {
+ TT.md5table = xmalloc(64*4);
+ for (i = 0; i<64; i++) TT.md5table[i] = fabs(sin(i+1))*(1LL<<32);
+ } else TT.md5table = md5nofloat;
if (FLAG(c)) for (arg = toys.optargs; *arg; arg++) do_c_file(*arg);
else {