[PATCH 0/5] core: update our SHA-1 docs, use sha1collisiondetection on OSX too
I wasn't able to find any on-list references to it being intentional, but it appears that while we made the sha1collisiondetection variant of SHA-1 the default in early 2017 we've never updated the OSX builds to do likewise.
I don't know what various git packages for OSX to, but our vanilla OSX distribution definitely uses Apple Common Crypto, and won't detect the https://shattered.io attack.
This series changes that, and while doing so in 2/5 updates our documentation and Makefile interface for the SHA-1 selection. Our INSTALL file was still claiming we used OpenSSL's SHA-1 by default.
Then since we'd made sha1collisiondetection the default we hadn't changed the code's default fallback to be that, it was still block-sha1. Now our fallback behavior is "error" instead, which makes it less likely that we'll get some foot-gun like the "OSX not using sha1collisiondetection" again.
The 4/5 and 5/5 then remove the PPC_SHA1 implementation. I submitted this before as [1], and the range-diff is to that submission (it wasn't picked up). I think it makes sense as part of this general SHA-1 cleanup.
1. https://lore.kernel.org/git/patch-1.1-05dcdca3877-20220319T005952Z-avarab@gmail.com/
Ævar Arnfjörð Bjarmason (5): Makefile: create and use sections for "define" flag listing Makefile: really use and document sha1collisiondetection by default Makefile: rephrase the discussion of *_SHA1 knobs Makefile + hash.h: remove PPC_SHA1 implementation Makefile: use $(OBJECTS) instead of $(C_OBJ)
INSTALL | 11 +- Makefile | 301 ++++++++++++++++------------ configure.ac | 3 - contrib/buildsystems/CMakeLists.txt | 3 +- hash.h | 12 +- ppc/sha1.c | 72 ------- ppc/sha1.h | 25 --- ppc/sha1ppc.S | 224 --------------------- t/t0013-sha1dc.sh | 4 +- 9 files changed, 191 insertions(+), 464 deletions(-) delete mode 100644 ppc/sha1.c delete mode 100644 ppc/sha1.h delete mode 100644 ppc/sha1ppc.S
Range-diff:
-: ----------- > 1: f799d30e82e Makefile: create and use sections for "define" flag listing
-: ----------- > 2: 5ffb68dc77b Makefile: really use and document sha1collisiondetection by default
-: ----------- > 3: d559e5212bc Makefile: rephrase the discussion of *_SHA1 knobs
1: 3a8caf62137 ! 4: 4b2d0b7b51a ppc: remove custom SHA-1 implementation
@@ Metadata
Author: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
## Commit message ##
- ppc: remove custom SHA-1 implementation
+ Makefile + hash.h: remove PPC_SHA1 implementation
Remove the PPC_SHA1 implementation added in a6ef3518f9a ([PATCH] PPC
assembly implementation of SHA1, 2005-04-22). When this was added
Apple consumer hardware used the PPC architecture, and the
implementation was intended to improve SHA-1 speed there.
- Since it was added we've moved to DC_SHA1 by default, and anyone
- wanting hard-rolled non-DC SHA-1 implementation can use OpenSSL's via
- the OPENSSL_SHA1 knob.
+ Since it was added we've moved to using sha1collisiondetection by
+ default, and anyone wanting hard-rolled non-DC SHA-1 implementation
+ can use OpenSSL's via the OPENSSL_SHA1 knob.
- I'm unsure if this was ever supposed to work on 64-bit PPC. It clearly
- originally targeted 32 bit PPC, but there's some mailing list
- references to this being tried on G5 (PPC 970). I can't get it to do
- anything but segfault on the BE POWER8 machine in the GCC compile
- farm. Anyone caring about speed on PPC these days is likely to be
- using IBM's POWER, not PPC 970.
+ Furthermore this doesn't run on the modern PPC processors which anyone
+ who's concerned about performance on PPC is likely to be using these
+ days, i.e. the IBM POWER series. It originally originally targeted 32
+ bit PPC, but there's some mailing list references to this being tried
+ on G5 (PPC 970).
- There have been proposals to entirely remove non-DC_SHA1
+ I can't get it to do anything but segfault on both the BE and LE POWER
+ machines in the GCC compile farm.
+
+ There have been proposals to entirely remove non-sha1collisiondetection
implementations from the tree[1]. I think per [2] that would be a bit
overzealous. I.e. there are various set-ups git's speed is going to be
more important than the relatively implausible SHA-1 collision attack,
or where such attacks are entirely mitigated by other means (e.g. by
incoming objects being checked with DC_SHA1).
- The main reason for doing so at this point is to simplify follow-up
- Makefile change. Since PPC_SHA1 included the only in-tree *.S assembly
- file we needed to keep around special support for building objects
- from it. By getting rid of it we know we'll always build *.o from *.c
- files, which makes the build process simpler.
+ But that really doesn't apply to PPC_SHA1 in particular, which seems
+ to have outlived its usefulness.
+
+ As this gets rid of the only in-tree *.S assembly file we can remove
+ the small bits of logic from the Makefile needed to build objects
+ from *.S (as opposed to *.c)
- As an aside the code being removed here was also throwing warnings
- with the "-pedantic" flag, but let's remove it instead of fixing it,
- as 544d93bc3b4 (block-sha1: remove use of obsolete x86 assembly,
- 2022-03-10) did for block-sha1/*.
+ The code being removed here was also throwing warnings with the
+ "-pedantic" flag, it could have been fixed as 544d93bc3b4 (block-sha1:
+ remove use of obsolete x86 assembly, 2022-03-10) did for block-sha1/*,
+ but as noted above let's remove it instead.
1. https://lore.kernel.org/git/20200223223758.120941-1-mh@glandium.org/
2. https://lore.kernel.org/git/20200224044732.GK1018190@coredump.intra.peff.net/
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
- ## INSTALL ##
-@@ INSTALL: Issues of note:
-
- By default, git uses OpenSSL for SHA1 but it will use its own
- library (inspired by Mozilla's) with either NO_OPENSSL or
-- BLK_SHA1. Also included is a version optimized for PowerPC
-- (PPC_SHA1).
-+ BLK_SHA1.
-
- - "libcurl" library is used for fetching and pushing
- repositories over http:// or https://, as well as by
-
## Makefile ##
@@ Makefile: include shared.mak
- # Define BLK_SHA1 environment variable to make use of the bundled
- # optimized C SHA1 routine.
+ # Define OPENSSL_SHA1 to link to the the SHA-1 routines from
+ # the OpenSSL library.
#
--# Define PPC_SHA1 environment variable when running make to make use of
--# a bundled SHA1 routine optimized for PowerPC.
+-# Define PPC_SHA1 to make use of optimized (in assembly)
+-# PowerPC SHA-1 routines.
-#
- # Define DC_SHA1 to unconditionally enable the collision-detecting sha1
- # algorithm. This is slower, but may detect attempted collision attacks.
- # Takes priority over other *_SHA1 knobs.
-@@ Makefile: ifdef OPENSSL_SHA1
- EXTLIBS += $(LIB_4_CRYPTO)
- BASIC_CFLAGS += -DSHA1_OPENSSL
- else
+ # Define APPLE_SHA1 to use Apple's CommonCrypto SHA-1 routines on
+ # Darwin/Mac OS X.
+ #
+@@ Makefile: endif
+ ifdef DC_SHA1
+ $(error the DC_SHA1 flag is no longer used, and has become the default. Adjust your build scripts accordingly)
+ endif
+ifdef PPC_SHA1
-+$(error PPC_SHA1 has been removed! Use DC_SHA1 instead, which is the default)
++$(error the PPC_SHA1 flag has been removed along with the PowerPC-specific SHA-1 implementation.)
+endif
- ifdef BLK_SHA1
+ ifndef NO_DC_SHA1
+- ifneq ($(OPENSSL_SHA1)$(BLK_SHA1)$(PPC_SHA1)$(APPLE_SHA1),)
++ ifneq ($(OPENSSL_SHA1)$(BLK_SHA1)$(APPLE_SHA1),)
+ $(error no other *_SHA1 option can be defined unless NO_DC_SHA1 is defined)
+ endif
+ LIB_OBJS += sha1dc_git.o
+@@ Makefile: ifdef BLK_SHA1
LIB_OBJS += block-sha1/sha1.o
BASIC_CFLAGS += -DSHA1_BLK
else
@@ Makefile: ifdef OPENSSL_SHA1
- LIB_OBJS += ppc/sha1.o ppc/sha1ppc.o
- BASIC_CFLAGS += -DSHA1_PPC
-else
- ifdef APPLE_COMMON_CRYPTO
+ ifdef APPLE_SHA1
COMPAT_CFLAGS += -DCOMMON_DIGEST_FOR_OPENSSL
BASIC_CFLAGS += -DSHA1_APPLE
@@ Makefile: endif
@@ configure.ac: AC_MSG_NOTICE([CHECKS for site configuration])
## hash.h ##
@@
- #include "git-compat-util.h"
- #include "repository.h"
--#if defined(SHA1_PPC)
+ #if !defined(NO_SHA1_DC)
+ #include "sha1dc_git.h"
+-#elif defined(SHA1_PPC)
-#include "ppc/sha1.h"
--#elif defined(SHA1_APPLE)
-+#if defined(SHA1_APPLE)
+ #elif defined(SHA1_APPLE)
#include <CommonCrypto/CommonDigest.h>
#elif defined(SHA1_OPENSSL)
- #include <openssl/sha.h>
@@
* platform's underlying implementation of SHA-1; could be OpenSSL,
* blk_SHA, Apple CommonCrypto, etc... Note that the relevant
-: ----------- > 5: 0575faebc30 Makefile: use $(OBJECTS) instead of $(C_OBJ)-- 2.36.0.879.g56a83971f3f