sha1: provide another level of indirection for the SHA-1 functions

The git source uses git_SHA1_Update() and friends to call into the
code that computes the hashes.  Traditionally, we used to map these
directly to underlying implementation of the SHA-1 hash (e.g.
SHA1_Update() from OpenSSL or blk_SHA1_Update() from block-sha1/).

This arrangement however makes it hard to tweak behaviour of the
underlying implementation without fully replacing.  If we want to
introduce a tweaked_SHA1_Update() wrapper to implement the "Update"
in a slightly different way, for example, the implementation of the
wrapper still would want to call into the underlying implementation,
but tweaked_SHA1_Update() cannot call git_SHA1_Update() to get to
the underlying implementation (often but not always SHA1_Update()).

Add another level of indirection that maps platform_SHA1_Update()
and friends to their underlying implementations, and by default make
git_SHA1_Update() and friends map to platform_SHA1_* functions.

Doing it this way will later allow us to map git_SHA1_Update() to
tweaked_SHA1_Update(), and the latter can use platform_SHA1_Update()
in its implementation.

Signed-off-by: Atousa Pahlevan Duprat <apahlevan@ieee.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Atousa Pahlevan Duprat 2015-11-04 22:38:41 -08:00 коммит произвёл Junio C Hamano
Родитель 441c4a4017
Коммит 3bc72fde3f
3 изменённых файлов: 25 добавлений и 13 удалений

Просмотреть файл

@ -16,7 +16,7 @@ void blk_SHA1_Init(blk_SHA_CTX *ctx);
void blk_SHA1_Update(blk_SHA_CTX *ctx, const void *dataIn, unsigned long len); void blk_SHA1_Update(blk_SHA_CTX *ctx, const void *dataIn, unsigned long len);
void blk_SHA1_Final(unsigned char hashout[20], blk_SHA_CTX *ctx); void blk_SHA1_Final(unsigned char hashout[20], blk_SHA_CTX *ctx);
#define git_SHA_CTX blk_SHA_CTX #define platform_SHA_CTX blk_SHA_CTX
#define git_SHA1_Init blk_SHA1_Init #define platform_SHA1_Init blk_SHA1_Init
#define git_SHA1_Update blk_SHA1_Update #define platform_SHA1_Update blk_SHA1_Update
#define git_SHA1_Final blk_SHA1_Final #define platform_SHA1_Final blk_SHA1_Final

22
cache.h
Просмотреть файл

@ -11,13 +11,25 @@
#include "string-list.h" #include "string-list.h"
#include SHA1_HEADER #include SHA1_HEADER
#ifndef git_SHA_CTX #ifndef platform_SHA_CTX
#define git_SHA_CTX SHA_CTX /*
#define git_SHA1_Init SHA1_Init * platform's underlying implementation of SHA-1; could be OpenSSL,
#define git_SHA1_Update SHA1_Update * blk_SHA, Apple CommonCrypto, etc... Note that including
#define git_SHA1_Final SHA1_Final * SHA1_HEADER may have already defined platform_SHA_CTX for our
* own implementations like block-sha1 and ppc-sha1, so we list
* the default for OpenSSL compatible SHA-1 implementations here.
*/
#define platform_SHA_CTX SHA_CTX
#define platform_SHA1_Init SHA1_Init
#define platform_SHA1_Update SHA1_Update
#define platform_SHA1_Final SHA1_Final
#endif #endif
#define git_SHA_CTX platform_SHA_CTX
#define git_SHA1_Init platform_SHA1_Init
#define git_SHA1_Update platform_SHA1_Update
#define git_SHA1_Final platform_SHA1_Final
#include <zlib.h> #include <zlib.h>
typedef struct git_zstream { typedef struct git_zstream {
z_stream z; z_stream z;

Просмотреть файл

@ -19,7 +19,7 @@ int ppc_SHA1_Init(ppc_SHA_CTX *c);
int ppc_SHA1_Update(ppc_SHA_CTX *c, const void *p, unsigned long n); int ppc_SHA1_Update(ppc_SHA_CTX *c, const void *p, unsigned long n);
int ppc_SHA1_Final(unsigned char *hash, ppc_SHA_CTX *c); int ppc_SHA1_Final(unsigned char *hash, ppc_SHA_CTX *c);
#define git_SHA_CTX ppc_SHA_CTX #define platform_SHA_CTX ppc_SHA_CTX
#define git_SHA1_Init ppc_SHA1_Init #define platform_SHA1_Init ppc_SHA1_Init
#define git_SHA1_Update ppc_SHA1_Update #define platform_SHA1_Update ppc_SHA1_Update
#define git_SHA1_Final ppc_SHA1_Final #define platform_SHA1_Final ppc_SHA1_Final