Git fork

sha256: avoid functions deprecated in OpenSSL 3+

OpenSSL 3+ deprecates the SHA256_Init, SHA256_Update, and SHA256_Final
functions, leading to errors when building with `DEVELOPER=1'.

Use the newer EVP_* API with OpenSSL 3+ despite being more
error-prone and less efficient due to heap allocations.

Signed-off-by: Eric Wong <e@80x24.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

authored by

Eric Wong and committed by
Junio C Hamano
3e440ea0 fb7d80ed

+57 -1
+3
Makefile
··· 3215 3215 sparse: $(SP_OBJ) 3216 3216 3217 3217 EXCEPT_HDRS := $(GENERATED_H) unicode-width.h compat/% xdiff/% 3218 + ifndef OPENSSL_SHA256 3219 + EXCEPT_HDRS += sha256/openssl.h 3220 + endif 3218 3221 ifndef NETTLE_SHA256 3219 3222 EXCEPT_HDRS += sha256/nettle.h 3220 3223 endif
+5 -1
hash-ll.h
··· 17 17 #define SHA256_NEEDS_CLONE_HELPER 18 18 #include "sha256/gcrypt.h" 19 19 #elif defined(SHA256_OPENSSL) 20 - #include <openssl/sha.h> 20 + # include <openssl/sha.h> 21 + # if defined(OPENSSL_API_LEVEL) && OPENSSL_API_LEVEL >= 3 22 + # define SHA256_NEEDS_CLONE_HELPER 23 + # include "sha256/openssl.h" 24 + # endif 21 25 #else 22 26 #include "sha256/block/sha256.h" 23 27 #endif
+49
sha256/openssl.h
··· 1 + /* wrappers for the EVP API of OpenSSL 3+ */ 2 + #ifndef SHA256_OPENSSL_H 3 + #define SHA256_OPENSSL_H 4 + #include <openssl/evp.h> 5 + 6 + struct openssl_SHA256_CTX { 7 + EVP_MD_CTX *ectx; 8 + }; 9 + 10 + typedef struct openssl_SHA256_CTX openssl_SHA256_CTX; 11 + 12 + static inline void openssl_SHA256_Init(struct openssl_SHA256_CTX *ctx) 13 + { 14 + const EVP_MD *type = EVP_sha256(); 15 + 16 + ctx->ectx = EVP_MD_CTX_new(); 17 + if (!ctx->ectx) 18 + die("EVP_MD_CTX_new: out of memory"); 19 + 20 + EVP_DigestInit_ex(ctx->ectx, type, NULL); 21 + } 22 + 23 + static inline void openssl_SHA256_Update(struct openssl_SHA256_CTX *ctx, 24 + const void *data, 25 + size_t len) 26 + { 27 + EVP_DigestUpdate(ctx->ectx, data, len); 28 + } 29 + 30 + static inline void openssl_SHA256_Final(unsigned char *digest, 31 + struct openssl_SHA256_CTX *ctx) 32 + { 33 + EVP_DigestFinal_ex(ctx->ectx, digest, NULL); 34 + EVP_MD_CTX_free(ctx->ectx); 35 + } 36 + 37 + static inline void openssl_SHA256_Clone(struct openssl_SHA256_CTX *dst, 38 + const struct openssl_SHA256_CTX *src) 39 + { 40 + EVP_MD_CTX_copy_ex(dst->ectx, src->ectx); 41 + } 42 + 43 + #define platform_SHA256_CTX openssl_SHA256_CTX 44 + #define platform_SHA256_Init openssl_SHA256_Init 45 + #define platform_SHA256_Clone openssl_SHA256_Clone 46 + #define platform_SHA256_Update openssl_SHA256_Update 47 + #define platform_SHA256_Final openssl_SHA256_Final 48 + 49 + #endif /* SHA256_OPENSSL_H */