Module Name: src Committed By: riastradh Date: Fri Mar 15 18:10:37 UTC 2024
Modified Files: src/crypto/external/bsd/openssl/dist/crypto/evp: legacy_sha.c src/crypto/external/bsd/openssl/dist/include/crypto: sha.h src/crypto/external/bsd/openssl/dist/providers/implementations/digests: sha2_prov.c src/crypto/external/bsd/openssl/lib/libcrypto: libc-sha2xx.c src/tests/crypto/libcrypto: t_sha512trunc.c Log Message: libcrypto: Fix buffer overrun in truncated SHA-512 functions. Further fallout from the libc/openssl sha2 symbol collision. PR lib/58039 To generate a diff of this commit: cvs rdiff -u -r1.1.1.2 -r1.2 \ src/crypto/external/bsd/openssl/dist/crypto/evp/legacy_sha.c cvs rdiff -u -r1.1.1.2 -r1.2 \ src/crypto/external/bsd/openssl/dist/include/crypto/sha.h cvs rdiff -u -r1.1.1.1 -r1.2 \ src/crypto/external/bsd/openssl/dist/providers/implementations/digests/sha2_prov.c cvs rdiff -u -r1.3 -r1.4 \ src/crypto/external/bsd/openssl/lib/libcrypto/libc-sha2xx.c cvs rdiff -u -r1.1 -r1.2 src/tests/crypto/libcrypto/t_sha512trunc.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/crypto/external/bsd/openssl/dist/crypto/evp/legacy_sha.c diff -u src/crypto/external/bsd/openssl/dist/crypto/evp/legacy_sha.c:1.1.1.2 src/crypto/external/bsd/openssl/dist/crypto/evp/legacy_sha.c:1.2 --- src/crypto/external/bsd/openssl/dist/crypto/evp/legacy_sha.c:1.1.1.2 Wed Oct 25 17:13:53 2023 +++ src/crypto/external/bsd/openssl/dist/crypto/evp/legacy_sha.c Fri Mar 15 18:10:37 2024 @@ -49,9 +49,9 @@ static int nm##_init(EVP_MD_CTX *ctx) #define sha512_256_Init sha512_256_init #define sha512_224_Update SHA512_Update -#define sha512_224_Final SHA512_Final +#define sha512_224_Final sha512_224_final /* XXX NetBSD libc sha2 */ #define sha512_256_Update SHA512_Update -#define sha512_256_Final SHA512_Final +#define sha512_256_Final sha512_256_final /* XXX NetBSD libc sha2 */ IMPLEMENT_LEGACY_EVP_MD_METH(sha1, SHA1) IMPLEMENT_LEGACY_EVP_MD_METH(sha224, SHA224) Index: src/crypto/external/bsd/openssl/dist/include/crypto/sha.h diff -u src/crypto/external/bsd/openssl/dist/include/crypto/sha.h:1.1.1.2 src/crypto/external/bsd/openssl/dist/include/crypto/sha.h:1.2 --- src/crypto/external/bsd/openssl/dist/include/crypto/sha.h:1.1.1.2 Sun May 7 18:29:28 2023 +++ src/crypto/external/bsd/openssl/dist/include/crypto/sha.h Fri Mar 15 18:10:37 2024 @@ -16,6 +16,8 @@ int sha512_224_init(SHA512_CTX *); int sha512_256_init(SHA512_CTX *); +int sha512_224_final(unsigned char *, SHA512_CTX *); /* XXX NetBSD libc sha2 */ +int sha512_256_final(unsigned char *, SHA512_CTX *); /* XXX NetBSD libc sha2 */ int ossl_sha1_ctrl(SHA_CTX *ctx, int cmd, int mslen, void *ms); unsigned char *ossl_sha1(const unsigned char *d, size_t n, unsigned char *md); Index: src/crypto/external/bsd/openssl/dist/providers/implementations/digests/sha2_prov.c diff -u src/crypto/external/bsd/openssl/dist/providers/implementations/digests/sha2_prov.c:1.1.1.1 src/crypto/external/bsd/openssl/dist/providers/implementations/digests/sha2_prov.c:1.2 --- src/crypto/external/bsd/openssl/dist/providers/implementations/digests/sha2_prov.c:1.1.1.1 Sun May 7 18:29:30 2023 +++ src/crypto/external/bsd/openssl/dist/providers/implementations/digests/sha2_prov.c Fri Mar 15 18:10:37 2024 @@ -86,10 +86,12 @@ IMPLEMENT_digest_functions(sha512, SHA51 /* ossl_sha512_224_functions */ IMPLEMENT_digest_functions(sha512_224, SHA512_CTX, SHA512_CBLOCK, SHA224_DIGEST_LENGTH, SHA2_FLAGS, - sha512_224_init, SHA512_Update, SHA512_Final) + sha512_224_init, SHA512_Update, + /* XXX NetBSD libc sha2 */sha512_224_final) /* ossl_sha512_256_functions */ IMPLEMENT_digest_functions(sha512_256, SHA512_CTX, SHA512_CBLOCK, SHA256_DIGEST_LENGTH, SHA2_FLAGS, - sha512_256_init, SHA512_Update, SHA512_Final) + sha512_256_init, SHA512_Update, + /* XXX NetBSD libc sha2 */sha512_256_final) Index: src/crypto/external/bsd/openssl/lib/libcrypto/libc-sha2xx.c diff -u src/crypto/external/bsd/openssl/lib/libcrypto/libc-sha2xx.c:1.3 src/crypto/external/bsd/openssl/lib/libcrypto/libc-sha2xx.c:1.4 --- src/crypto/external/bsd/openssl/lib/libcrypto/libc-sha2xx.c:1.3 Sat May 6 17:07:23 2023 +++ src/crypto/external/bsd/openssl/lib/libcrypto/libc-sha2xx.c Fri Mar 15 18:10:37 2024 @@ -47,6 +47,20 @@ sha512_224_init(SHA512_CTX *context) } extern int +sha512_224_final(unsigned char *md, SHA512_CTX *context); +int +sha512_224_final(unsigned char *md, SHA512_CTX *context) +{ + unsigned char tmp[64]; + + SHA512_Final(tmp, context); + memcpy(md, tmp, 28); + explicit_memset(tmp, 0, sizeof(tmp)); + return 1; + +} + +extern int sha512_256_init(SHA512_CTX *context); int sha512_256_init(SHA512_CTX *context) @@ -61,3 +75,16 @@ sha512_256_init(SHA512_CTX *context) return 1; } + +extern int +sha512_256_final(unsigned char *md, SHA512_CTX *context); +int +sha512_256_final(unsigned char *md, SHA512_CTX *context) +{ + unsigned char tmp[64]; + + SHA512_Final(tmp, context); + memcpy(md, tmp, 32); + explicit_memset(tmp, 0, sizeof(tmp)); + return 1; +} Index: src/tests/crypto/libcrypto/t_sha512trunc.c diff -u src/tests/crypto/libcrypto/t_sha512trunc.c:1.1 src/tests/crypto/libcrypto/t_sha512trunc.c:1.2 --- src/tests/crypto/libcrypto/t_sha512trunc.c:1.1 Fri Mar 15 15:32:07 2024 +++ src/tests/crypto/libcrypto/t_sha512trunc.c Fri Mar 15 18:10:37 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: t_sha512trunc.c,v 1.1 2024/03/15 15:32:07 riastradh Exp $ */ +/* $NetBSD: t_sha512trunc.c,v 1.2 2024/03/15 18:10:37 riastradh Exp $ */ /*- * Copyright (c) 2024 The NetBSD Foundation, Inc. @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: t_sha512trunc.c,v 1.1 2024/03/15 15:32:07 riastradh Exp $"); +__RCSID("$NetBSD: t_sha512trunc.c,v 1.2 2024/03/15 18:10:37 riastradh Exp $"); #include <stddef.h> @@ -123,8 +123,6 @@ ATF_TC_BODY(sha512_224, tc) }, }; - atf_tc_expect_fail("PR lib/58039:" - " Buffer overflow when writing a SHA512_224 or SHA512_256 digest"); check(C, __arraycount(C), 28, EVP_sha512_224()); } @@ -159,8 +157,6 @@ ATF_TC_BODY(sha512_256, tc) }, }; - atf_tc_expect_fail("PR lib/58039:" - " Buffer overflow when writing a SHA512_224 or SHA512_256 digest"); check(C, __arraycount(C), 32, EVP_sha512_256()); }