Add a base implementation of SHA-256 support
SHA-1 is weak and we need to transition to a new hash function. For some time, we have referred to this new function as NewHash. Recently, we decided to pick SHA-256 as NewHash. The reasons behind the choice of SHA-256 are outlined in the thread starting at [1] and in the commit history for the hash function transition document. Add a basic implementation of SHA-256 based off libtomcrypt, which is in the public domain. Optimize it and restructure it to meet our coding standards. Pull in the update and final functions from the SHA-1 block implementation, as we know these function correctly with all compilers. This implementation is slower than SHA-1, but more performant implementations will be introduced in future commits. Wire up SHA-256 in the list of hash algorithms, and add a test that the algorithm works correctly. Note that with this patch, it is still not possible to switch to using SHA-256 in Git. Additional patches are needed to prepare the code to handle a larger hash algorithm and further test fixes are needed. [1] https://public-inbox.org/git/20180609224913.GC38834@genre.crustytoothpaste.net/ Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
c166599862
commit
13eeedb5d1
45
sha1-file.c
45
sha1-file.c
@ -40,10 +40,20 @@
|
||||
#define EMPTY_TREE_SHA1_BIN_LITERAL \
|
||||
"\x4b\x82\x5d\xc6\x42\xcb\x6e\xb9\xa0\x60" \
|
||||
"\xe5\x4b\xf8\xd6\x92\x88\xfb\xee\x49\x04"
|
||||
#define EMPTY_TREE_SHA256_BIN_LITERAL \
|
||||
"\x6e\xf1\x9b\x41\x22\x5c\x53\x69\xf1\xc1" \
|
||||
"\x04\xd4\x5d\x8d\x85\xef\xa9\xb0\x57\xb5" \
|
||||
"\x3b\x14\xb4\xb9\xb9\x39\xdd\x74\xde\xcc" \
|
||||
"\x53\x21"
|
||||
|
||||
#define EMPTY_BLOB_SHA1_BIN_LITERAL \
|
||||
"\xe6\x9d\xe2\x9b\xb2\xd1\xd6\x43\x4b\x8b" \
|
||||
"\x29\xae\x77\x5a\xd8\xc2\xe4\x8c\x53\x91"
|
||||
#define EMPTY_BLOB_SHA256_BIN_LITERAL \
|
||||
"\x47\x3a\x0f\x4c\x3b\xe8\xa9\x36\x81\xa2" \
|
||||
"\x67\xe3\xb1\xe9\xa7\xdc\xda\x11\x85\x43" \
|
||||
"\x6f\xe1\x41\xf7\x74\x91\x20\xa3\x03\x72" \
|
||||
"\x18\x13"
|
||||
|
||||
const unsigned char null_sha1[GIT_MAX_RAWSZ];
|
||||
const struct object_id null_oid;
|
||||
@ -53,6 +63,12 @@ static const struct object_id empty_tree_oid = {
|
||||
static const struct object_id empty_blob_oid = {
|
||||
EMPTY_BLOB_SHA1_BIN_LITERAL
|
||||
};
|
||||
static const struct object_id empty_tree_oid_sha256 = {
|
||||
EMPTY_TREE_SHA256_BIN_LITERAL
|
||||
};
|
||||
static const struct object_id empty_blob_oid_sha256 = {
|
||||
EMPTY_BLOB_SHA256_BIN_LITERAL
|
||||
};
|
||||
|
||||
static void git_hash_sha1_init(git_hash_ctx *ctx)
|
||||
{
|
||||
@ -69,6 +85,22 @@ static void git_hash_sha1_final(unsigned char *hash, git_hash_ctx *ctx)
|
||||
git_SHA1_Final(hash, &ctx->sha1);
|
||||
}
|
||||
|
||||
|
||||
static void git_hash_sha256_init(git_hash_ctx *ctx)
|
||||
{
|
||||
git_SHA256_Init(&ctx->sha256);
|
||||
}
|
||||
|
||||
static void git_hash_sha256_update(git_hash_ctx *ctx, const void *data, size_t len)
|
||||
{
|
||||
git_SHA256_Update(&ctx->sha256, data, len);
|
||||
}
|
||||
|
||||
static void git_hash_sha256_final(unsigned char *hash, git_hash_ctx *ctx)
|
||||
{
|
||||
git_SHA256_Final(hash, &ctx->sha256);
|
||||
}
|
||||
|
||||
static void git_hash_unknown_init(git_hash_ctx *ctx)
|
||||
{
|
||||
BUG("trying to init unknown hash");
|
||||
@ -110,6 +142,19 @@ const struct git_hash_algo hash_algos[GIT_HASH_NALGOS] = {
|
||||
&empty_tree_oid,
|
||||
&empty_blob_oid,
|
||||
},
|
||||
{
|
||||
"sha256",
|
||||
/* "s256", big-endian */
|
||||
0x73323536,
|
||||
GIT_SHA256_RAWSZ,
|
||||
GIT_SHA256_HEXSZ,
|
||||
GIT_SHA256_BLKSZ,
|
||||
git_hash_sha256_init,
|
||||
git_hash_sha256_update,
|
||||
git_hash_sha256_final,
|
||||
&empty_tree_oid_sha256,
|
||||
&empty_blob_oid_sha256,
|
||||
}
|
||||
};
|
||||
|
||||
const char *empty_tree_oid_hex(void)
|
||||
|
Reference in New Issue
Block a user