Add SHA-512-256. (Not wired up into all the signature verifiers because we don't need or recommend that.) Change-Id: Ia212a1f0e1c389a31d303e00a6fafb0ec3db7c71 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/40704 Commit-Queue: Adam Langley <agl@google.com> Reviewed-by: David Benjamin <davidben@google.com>
diff --git a/include/openssl/digest.h b/include/openssl/digest.h index c3ceb7f..7b0ed06 100644 --- a/include/openssl/digest.h +++ b/include/openssl/digest.h
@@ -83,6 +83,7 @@ OPENSSL_EXPORT const EVP_MD *EVP_sha256(void); OPENSSL_EXPORT const EVP_MD *EVP_sha384(void); OPENSSL_EXPORT const EVP_MD *EVP_sha512(void); +OPENSSL_EXPORT const EVP_MD *EVP_sha512_256(void); // EVP_md5_sha1 is a TLS-specific |EVP_MD| which computes the concatenation of // MD5 and SHA-1, as used in TLS 1.1 and below.
diff --git a/include/openssl/nid.h b/include/openssl/nid.h index a15f4e3..bf7f3da 100644 --- a/include/openssl/nid.h +++ b/include/openssl/nid.h
@@ -4246,6 +4246,11 @@ #define NID_X448 961 #define OBJ_X448 1L, 3L, 101L, 111L +#define SN_sha512_256 "SHA512-256" +#define LN_sha512_256 "sha512-256" +#define NID_sha512_256 962 +#define OBJ_sha512_256 2L, 16L, 840L, 1L, 101L, 3L, 4L, 2L, 6L + #if defined(__cplusplus) } /* extern C */
diff --git a/include/openssl/sha.h b/include/openssl/sha.h index b163e6a..b113798 100644 --- a/include/openssl/sha.h +++ b/include/openssl/sha.h
@@ -261,6 +261,32 @@ }; +// SHA-512-256 +// +// See https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf section 5.3.6 + +#define SHA512_256_DIGEST_LENGTH 32 + +// SHA512_256_Init initialises |sha| and returns 1. +OPENSSL_EXPORT int SHA512_256_Init(SHA512_CTX *sha); + +// SHA512_256_Update adds |len| bytes from |data| to |sha| and returns 1. +OPENSSL_EXPORT int SHA512_256_Update(SHA512_CTX *sha, const void *data, + size_t len); + +// SHA512_256_Final adds the final padding to |sha| and writes the resulting +// digest to |out|, which must have at least |SHA512_256_DIGEST_LENGTH| bytes of +// space. It returns one on success and zero on programmer error. +OPENSSL_EXPORT int SHA512_256_Final(uint8_t out[SHA512_256_DIGEST_LENGTH], + SHA512_CTX *sha); + +// SHA512_256 writes the digest of |len| bytes from |data| to |out| and returns +// |out|. There must be at least |SHA512_256_DIGEST_LENGTH| bytes of space in +// |out|. +OPENSSL_EXPORT uint8_t *SHA512_256(const uint8_t *data, size_t len, + uint8_t out[SHA512_256_DIGEST_LENGTH]); + + #if defined(__cplusplus) } // extern C #endif