commit d296a0c73787537ad9ea087f213083f29fbd6f8f
parent ced5bcb273a17a31058dd58ab413f7c83cfe4508
Author: Louis Burda <quent.burda@gmail.com>
Date: Mon, 31 May 2021 21:29:50 +0200
fix bug in revhash that generated false preimages
Diffstat:
1 file changed, 22 insertions(+), 14 deletions(-)
diff --git a/checker/src/revhash/main.c b/checker/src/revhash/main.c
@@ -9,18 +9,12 @@
#define MIN(x,y) ((x) < (y) ? (x) : (y))
int
-hash()
+mhash(const char *str, size_t len)
{
static char buf[MHASHLEN + 1];
- char str[256];
int i, k, v;
char c, *bp;
- size_t len;
-
- if (!fgets(str, sizeof(str), stdin))
- return EXIT_FAILURE;
- len = strlen(str) -1;
if (len <= 0) return EXIT_FAILURE;
for (v = 0, i = 0; i < len; i++) v += str[i];
@@ -35,19 +29,26 @@ hash()
}
int
+hash()
+{
+ char str[256];
+ size_t len;
+
+ if (!fgets(str, sizeof(str), stdin))
+ return EXIT_FAILURE;
+
+ return mhash(str, strlen(str) - 1);
+}
+
+int
revhash(const char *hashstr)
{
- char c, hexbuf[3] = { 0 }, *end, *buf;
- int i, k, v, maxlen, sum, *hash, sublen, aftersum;
+ char c, hexbuf[3] = { 0 }, *end, buf[256];
+ int i, k, v, maxlen, sum, hash[256], sublen, aftersum;
if (strlen(hashstr) % 2 != 0)
goto invalid;
-
- /* alloc */
maxlen = strlen(hashstr) / 2;
- hash = calloc(maxlen, sizeof(int));
- buf = malloc(strlen(hashstr));
- if (!hash) return EXIT_FAILURE;
/* convert hex to int array */
for (i = 0; i < maxlen; i++) {
@@ -74,6 +75,8 @@ revhash(const char *hashstr)
buf[k] = (char) hash[k] ^ (rand() % 256);
if (buf[k] < 0 || buf[k] != buf[k % sublen]) break;
}
+ } else {
+ sublen = maxlen;
}
if (k < maxlen) continue;
@@ -86,9 +89,14 @@ revhash(const char *hashstr)
c = MIN(127, sum);
printf("%c", c);
sum -= c;
+ buf[k++] = c;
}
printf("\n");
+
+ if (getenv("OUTPUT_HASH"))
+ mhash(buf, k);
+
return EXIT_SUCCESS;
}