This series provides a functional SHA-256 implementation and wires it
up, along with some housekeeping patches to make it suitable for
testing.
Changes from v5:
* Remove inclusion of "git-compat-util.h" in header.
* Remove "inline" from definition of hash_to_hex_algop_r.
* Switch perl invocations in t0015 to use -e instead of -E.
* Switch perl invocations in t0015 to use autoflush and postfix for.
Changes from v4:
* Downcase hex constants for consistency.
* Remove needless parentheses in return statement.
* Remove braces for single statement loops.
* Switch to +=.
* Add references to rationale for SHA-256.
Changes from v3:
* Switch to using inline functions instead of macros in many cases.
* Undefine remaining macros at the top.
Changes from v2:
* Improve commit messages to include timing and performance information.
* Improve commit messages to be less ambiguous and more friendly to a
wider variety of English speakers.
* Prefer functions taking struct git_hash_algo in hex.c.
* Port pieces of the block-sha1 implementation over to the block-sha256
implementation for better compatibility.
* Drop patch 13 in favor of further discussion about the best way
forward for versioning commit graph.
* Rename the test so as to have a different number from other tests.
* Rebase on master.
Changes from v1:
* Add a hash_to_hex function mirroring sha1_to_hex, but for
the_hash_algo.
* Strip commit message explanation about why we chose SHA-256.
* Rebase on master
* Strip leading whitespace from commit message.
* Improve commit-graph patch to cover new code added since v1.
* Be more honest about the scope of work involved in porting the SHA-256
implementation out of libtomcrypt.
* Revert change to limit hashcmp to 20 bytes.
brian m. carlson (12):
sha1-file: rename algorithm to "sha1"
sha1-file: provide functions to look up hash algorithms
hex: introduce functions to print arbitrary hashes
cache: make hashcmp and hasheq work with larger hashes
t: add basic tests for our SHA-1 implementation
t: make the sha1 test-tool helper generic
sha1-file: add a constant for hash block size
t/helper: add a test helper to compute hash speed
commit-graph: convert to using the_hash_algo
Add a base implementation of SHA-256 support
sha256: add an SHA-256 implementation using libgcrypt
hash: add an SHA-256 implementation using OpenSSL
Makefile | 22 +++
cache.h | 51 ++++---
commit-graph.c | 33 ++---
hash.h | 41 +++++-
hex.c | 32 +++--
sha1-file.c | 70 ++++++++-
sha256/block/sha256.c | 196 ++++++++++++++++++++++++++
sha256/block/sha256.h | 24 ++++
sha256/gcrypt.h | 30 ++++
t/helper/test-hash-speed.c | 61 ++++++++
t/helper/{test-sha1.c => test-hash.c} | 19 +--
t/helper/test-sha1.c | 52 +------
t/helper/test-sha256.c | 7 +
t/helper/test-tool.c | 2 +
t/helper/test-tool.h | 4 +
t/t0015-hash.sh | 55 ++++++++
16 files changed, 595 insertions(+), 104 deletions(-)
create mode 100644 sha256/block/sha256.c
create mode 100644 sha256/block/sha256.h
create mode 100644 sha256/gcrypt.h
create mode 100644 t/helper/test-hash-speed.c
copy t/helper/{test-sha1.c => test-hash.c} (65%)
create mode 100644 t/helper/test-sha256.c
create mode 100755 t/t0015-hash.sh
Range-diff against v5:
1: a004a4c982 < -: ---------- :hash-impl
2: cf9f7f5620 = 1: fa21b5948c sha1-file: rename algorithm to "sha1"
3: 0144deaebe = 2: 4e146c92af sha1-file: provide functions to look up hash
algorithms
4: b74858fb03 ! 3: 10e7893242 hex: introduce functions to print arbitrary
hashes
@@ -64,8 +64,8 @@
}
-char *sha1_to_hex_r(char *buffer, const unsigned char *sha1)
-+inline char *hash_to_hex_algop_r(char *buffer, const unsigned char *hash,
-+ const struct git_hash_algo *algop)
++char *hash_to_hex_algop_r(char *buffer, const unsigned char *hash,
++ const struct git_hash_algo *algop)
{
static const char hex[] = "0123456789abcdef";
char *buf = buffer;
5: e9703017a4 = 4: 6396a0ff57 cache: make hashcmp and hasheq work with
larger hashes
6: ab85a834fd ! 5: a51a8b5638 t: add basic tests for our SHA-1
implementation
@@ -33,7 +33,7 @@
+ grep c12252ceda8be8994d5fa0290a47231c1d16aae3 actual &&
+ printf "abcdefghijklmnopqrstuvwxyz" | test-tool sha1 >actual &&
+ grep 32d10c7b8cf96570ca04ce37f2a19d84240d3a89 actual &&
-+ perl -E "for (1..100000) { print q{aaaaaaaaaa}; }" | \
++ perl -e "$| = 1; print q{aaaaaaaaaa} for 1..100000;" | \
+ test-tool sha1 >actual &&
+ grep 34aa973cd4c4daa4f61eeb2bdbad27316534016f actual &&
+ printf "blob 0\0" | test-tool sha1 >actual &&
7: 962f6d8903 = 6: d50b040b33 t: make the sha1 test-tool helper generic
8: 53addf4d58 = 7: cbe15d32ed sha1-file: add a constant for hash block size
9: 9ace10faa2 = 8: dbb916ff26 t/helper: add a test helper to compute hash
speed
10: 9adc56d01e = 9: 77a741aa3f commit-graph: convert to using the_hash_algo
11: 90544c504c ! 10: ff7ec3b1ef Add a base implementation of SHA-256 support
@@ -413,8 +413,6 @@
+#ifndef SHA256_BLOCK_SHA256_H
+#define SHA256_BLOCK_SHA256_H
+
-+#include "git-compat-util.h"
-+
+#define blk_SHA256_BLKSIZE 64
+
+struct blk_SHA256_CTX {
@@ -492,10 +490,11 @@
+ grep f7846f55cf23e14eebeab5b4e1550cad5b509e3348fbc4efa3a1413d393cb650
actual &&
+ printf "abcdefghijklmnopqrstuvwxyz" | test-tool sha256 >actual &&
+ grep 71c480df93d6ae2f1efad1447c66c9525e316218cf51fc8d9ed832f2daf18b73
actual &&
-+ perl -E "for (1..100000) { print q{aaaaaaaaaa}; }" | \
++ # Try to exercise the chunking code by turning autoflush on.
++ perl -e "$| = 1; print q{aaaaaaaaaa} for 1..100000;" | \
+ test-tool sha256 >actual &&
+ grep cdc76e5c9914fb9281a1c7e284d73e67f1809a48a497200e046d39ccc7112cd0
actual &&
-+ perl -E "for (1..100000) { print q{abcdefghijklmnopqrstuvwxyz}; }" | \
++ perl -e "$| = 1; print q{abcdefghijklmnopqrstuvwxyz} for 1..100000;" | \
+ test-tool sha256 >actual &&
+ grep e406ba321ca712ad35a698bf0af8d61fc4dc40eca6bdcea4697962724ccbde35
actual &&
+ printf "blob 0\0" | test-tool sha256 >actual &&
12: 467c86e878 = 11: 46f443809b sha256: add an SHA-256 implementation using
libgcrypt
13: 73e4bc17d0 = 12: 6d358417d9 hash: add an SHA-256 implementation using
OpenSSL