Takashi Iwai <tiwai@xxxxxxx> writes: > Some distros provide SHA1 collision detect code as a shared library. > It's the very same code as we have in git tree, and git can link with > it as well; at least, it may make maintenance easier, according to our > security guys. > > This patch allows user to build git linking with the external sha1dc > library instead of the built-in sha1dc code. User needs to define > DC_SHA1_EXTERNAL explicitly. As default, the built-in sha1dc code is > used like before. > > Signed-off-by: Takashi Iwai <tiwai@xxxxxxx> > --- I do not have such an environment to test this patch, but it looks like a very sensible thing to do. Will queue; thanks. > Makefile | 12 ++++++++++++ > hash.h | 4 +++- > sha1dc_git_ext.c | 11 +++++++++++ > sha1dc_git_ext.h | 25 +++++++++++++++++++++++++ > 4 files changed, 51 insertions(+), 1 deletion(-) > create mode 100644 sha1dc_git_ext.c > create mode 100644 sha1dc_git_ext.h > > diff --git a/Makefile b/Makefile > index 461c845d33cb..f1a262d56254 100644 > --- a/Makefile > +++ b/Makefile > @@ -162,6 +162,12 @@ all:: > # algorithm. This is slower, but may detect attempted collision attacks. > # Takes priority over other *_SHA1 knobs. > # > +# Define DC_SHA1_EXTERNAL in addition to DC_SHA1 if you want to build / link > +# git with the external sha1collisiondetection library. > +# Without this option, i.e. the default behavior is to build git with its > +# own sha1dc code. If any extra linker option is required, define them in > +# DC_SHA1_LINK variable in addition. > +# > # Define DC_SHA1_SUBMODULE in addition to DC_SHA1 to use the > # sha1collisiondetection shipped as a submodule instead of the > # non-submodule copy in sha1dc/. This is an experimental option used > @@ -1472,6 +1478,11 @@ ifdef APPLE_COMMON_CRYPTO > BASIC_CFLAGS += -DSHA1_APPLE > else > DC_SHA1 := YesPlease > +ifdef DC_SHA1_EXTERNAL > + LIB_OBJS += sha1dc_git_ext.o > + BASIC_CFLAGS += -DSHA1_DC -DDC_SHA1_EXTERNAL > + EXTLIBS += $(DC_SHA1_LINK) -lsha1detectcoll > +else > ifdef DC_SHA1_SUBMODULE > LIB_OBJS += sha1collisiondetection/lib/sha1.o > LIB_OBJS += sha1collisiondetection/lib/ubc_check.o > @@ -1492,6 +1503,7 @@ endif > endif > endif > endif > +endif > > ifdef SHA1_MAX_BLOCK_SIZE > LIB_OBJS += compat/sha1-chunked.o > diff --git a/hash.h b/hash.h > index bef3e630a093..dce327d58d07 100644 > --- a/hash.h > +++ b/hash.h > @@ -8,7 +8,9 @@ > #elif defined(SHA1_OPENSSL) > #include <openssl/sha.h> > #elif defined(SHA1_DC) > -#ifdef DC_SHA1_SUBMODULE > +#if defined(DC_SHA1_EXTERNAL) > +#include "sha1dc_git_ext.h" > +#elif defined(DC_SHA1_SUBMODULE) > #include "sha1collisiondetection/lib/sha1.h" > #else > #include "sha1dc/sha1.h" > diff --git a/sha1dc_git_ext.c b/sha1dc_git_ext.c > new file mode 100644 > index 000000000000..359439fc3d93 > --- /dev/null > +++ b/sha1dc_git_ext.c > @@ -0,0 +1,11 @@ > +/* Only for DC_SHA1_EXTERNAL; sharing the same hooks as built-in sha1dc */ > + > +#include "cache.h" > +#include <sha1.h> > +#include "sha1dc_git.c" > + > +void git_SHA1DCInit(SHA1_CTX *ctx) > +{ > + SHA1DCInit(ctx); > + SHA1DCSetSafeHash(ctx, 0); > +} > diff --git a/sha1dc_git_ext.h b/sha1dc_git_ext.h > new file mode 100644 > index 000000000000..d0ea8ce518db > --- /dev/null > +++ b/sha1dc_git_ext.h > @@ -0,0 +1,25 @@ > +/* > + * This file is included by hash.h for DC_SHA1_EXTERNAL > + */ > + > +#include <sha1.h> > + > +/* > + * Same as SHA1DCInit, but with default save_hash=0 > + */ > +void git_SHA1DCInit(SHA1_CTX *); > + > +/* > + * Same as SHA1DCFinal, but convert collision attack case into a verbose die(). > + */ > +void git_SHA1DCFinal(unsigned char [20], SHA1_CTX *); > + > +/* > + * Same as SHA1DCUpdate, but adjust types to match git's usual interface. > + */ > +void git_SHA1DCUpdate(SHA1_CTX *ctx, const void *data, unsigned long len); > + > +#define platform_SHA_CTX SHA1_CTX > +#define platform_SHA1_Init git_SHA1DCInit > +#define platform_SHA1_Update git_SHA1DCUpdate > +#define platform_SHA1_Final git_SHA1DCFinal