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