On Sun, Feb 26, 2017 at 10:30 PM, Jeff King <peff@xxxxxxxx> wrote: > On Sun, Feb 26, 2017 at 07:57:19PM +0100, Thomas Braun wrote: >> While reading about the subject I came across [1]. The author reduced >> the hash size to 4bits and then played around with git. >> >> Diff taken from the posting (not my code) >> --- git-2.7.0~rc0+next.20151210.orig/block-sha1/sha1.c >> +++ git-2.7.0~rc0+next.20151210/block-sha1/sha1.c >> @@ -246,6 +246,8 @@ void blk_SHA1_Final(unsigned char hashou >> blk_SHA1_Update(ctx, padlen, 8); >> >> /* Output hash */ >> - for (i = 0; i < 5; i++) >> - put_be32(hashout + i * 4, ctx->H[i]); >> + for (i = 0; i < 1; i++) >> + put_be32(hashout + i * 4, (ctx->H[i] & 0xf000000)); >> + for (i = 1; i < 5; i++) >> + put_be32(hashout + i * 4, 0); >> } > > Yeah, that is a lot more flexible for experimenting. Though I'd think > you'd probably want more than 4 bits just to avoid accidental > collisions. Something like 24 bits gives you some breathing space (you'd > expect a random collision after 4096 objects), but it's still easy to > do a preimage attack if you need to. Just shortening the hash causes lots of collisions between objects of different types. While it's valuable to test git behavior for those cases, you probably want some way to explicitly test collisions that do not change the object type, as they're not trivial to detect. Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@xxxxxxxxxxxxxx In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds