Re: [PATCH] replace sha1 with another algorithm

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Jeff King venit, vidit, dixit 26.10.2011 02:12:
> SHA-1 is due to be cryptographically broken sometime in the
> next decade, with collision attacks becoming possible. But
> we don't have to wait! We can act now and replace it,
> treating us to all of the pain of a flag day without any
> delay!
> 
> We could of course use the SHA-2 family, or wait for the
> upcoming SHA-3. But any good cryptographer knows that you
> should _never_ use a standard algorithm. It's always better
> to roll your own. After all, if _you_ can't break it, how
> could anyone else?
> 
> Signed-off-by: Jeff King <peff@xxxxxxxx>
> Reviewed-by: Brandon Casey <drafnel@xxxxxxxxx>
> Mocked-by: Rick Balocca <richard.balocca@xxxxxxxxxxxx>
> Enjoyed-by: Elijah Newren <newren@xxxxxxxxx>
Awaited-by: Michael J Gruber <git@xxxxxxxxxxxxxxxxxxxx>

Still remembering an earlier GitTogether's l33t l10n....
> ---
>  block-sha1/sha1.h |    2 +-
>  cache.h           |    4 +++-
>  sha1_file.c       |   32 ++++++++++++++++++++++++++++++++
>  3 files changed, 36 insertions(+), 2 deletions(-)
> 
> diff --git a/block-sha1/sha1.h b/block-sha1/sha1.h
> index b864df6..49331e3 100644
> --- a/block-sha1/sha1.h
> +++ b/block-sha1/sha1.h
> @@ -19,4 +19,4 @@
>  #define git_SHA_CTX	blk_SHA_CTX
>  #define git_SHA1_Init	blk_SHA1_Init
>  #define git_SHA1_Update	blk_SHA1_Update
> -#define git_SHA1_Final	blk_SHA1_Final
> +#define real_git_SHA1_Final	blk_SHA1_Final
> diff --git a/cache.h b/cache.h
> index 2e6ad36..068062b 100644
> --- a/cache.h
> +++ b/cache.h
> @@ -13,9 +13,11 @@
>  #define git_SHA_CTX	SHA_CTX
>  #define git_SHA1_Init	SHA1_Init
>  #define git_SHA1_Update	SHA1_Update
> -#define git_SHA1_Final	SHA1_Final
> +#define real_git_SHA1_Final	SHA1_Final
>  #endif
>  
> +void git_SHA1_Final(unsigned char out[20], git_SHA_CTX *ctx);
> +
>  #include <zlib.h>
>  typedef struct git_zstream {
>  	z_stream z;
> diff --git a/sha1_file.c b/sha1_file.c
> index 27f3b9b..23e0107 100644
> --- a/sha1_file.c
> +++ b/sha1_file.c
> @@ -2833,3 +2833,35 @@ void assert_sha1_type(const unsigned char *sha1, enum object_type expect)
>  		die("%s is not a valid '%s' object", sha1_to_hex(sha1),
>  		    typename(expect));
>  }
> +
> +static void xor_bytes(unsigned char *out, unsigned char *a, unsigned char *b,
> +		      unsigned n)
> +{
> +	unsigned i;
> +	for (i = 0; i < n; i++)
> +		out[i] = a[i] ^ b[i];
> +}
> +
> +static void mix_hash(unsigned char *h, unsigned n)
> +{
> +	unsigned char out[20];

unsigned char out[n];

;)

> +	unsigned mid = n / 2;
> +
> +	if (2*mid < n)
> +		return;
> +
> +	xor_bytes(out, h, h + mid, mid);
> +	xor_bytes(out + mid, h + mid, h, mid);
> +	memcpy(h, out, n);
> +
> +	/* If a little bit of mixing is good, then a lot must be GREAT! */
> +	mix_hash(h, mid);
> +	mix_hash(h + mid, mid);

n a power of 2 anyone...

> +}
> +
> +void git_SHA1_Final(unsigned char out[20], git_SHA_CTX *ctx)
> +{
> +	/* We build on top of the regular SHA1, but then "enhance" it. */
> +	real_git_SHA1_Final(out, ctx);
> +	mix_hash(out, 20);
> +}
>--
>1.7.7.troll

;)
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]