File 1341-Add-SHA2-512-224-and-SHA2-512-256-truncated-hashes.patch of Package erlang

From ef7fadd24ba6881ad41cc0be594e3cc722fbf638 Mon Sep 17 00:00:00 2001
From: Dunya Kokoschka <DunyaKokoschka@protonmail.com>
Date: Mon, 14 Apr 2025 14:10:53 +0100
Subject: [PATCH 1/2] Add SHA2 512/224 and SHA2 512/256 truncated hashes

---
 lib/crypto/c_src/digest.c                  | 16 ++++
 lib/crypto/c_src/openssl_config.h          | 10 +++
 lib/crypto/doc/guides/algorithm_details.md |  4 +-
 lib/crypto/src/crypto.erl                  |  4 +-
 lib/crypto/test/crypto_SUITE.erl           | 97 +++++++++++++++++++++-
 5 files changed, 124 insertions(+), 7 deletions(-)

diff --git a/lib/crypto/c_src/digest.c b/lib/crypto/c_src/digest.c
index eac6457293..e43db7e457 100644
--- a/lib/crypto/c_src/digest.c
+++ b/lib/crypto/c_src/digest.c
@@ -84,6 +84,22 @@ static struct digest_type_t digest_types[] =
 #endif
     },
 
+    {"sha512_224", "SHA2-512/224", 0, PBKDF2_ELIGIBLE_DIGEST,
+#ifdef HAVE_SHA512_224
+     {&EVP_sha512_224,NULL}
+#else
+     {NULL,NULL}
+#endif
+    },
+
+    {"sha512_256", "SHA2-512/256", 0, PBKDF2_ELIGIBLE_DIGEST,
+#ifdef HAVE_SHA512_256
+     {&EVP_sha512_256,NULL}
+#else
+     {NULL,NULL}
+#endif
+    },
+
     {"sha3_224", "SHA3-224", 0, 0,
 #ifdef HAVE_SHA3_224
      {&EVP_sha3_224,NULL}
diff --git a/lib/crypto/c_src/openssl_config.h b/lib/crypto/c_src/openssl_config.h
index 3ccd21f939..68f2c94a67 100644
--- a/lib/crypto/c_src/openssl_config.h
+++ b/lib/crypto/c_src/openssl_config.h
@@ -199,6 +199,16 @@
 # define HAVE_SM4_CCM
 #endif
 
+#if OPENSSL_VERSION_NUMBER >= PACKED_OPENSSL_VERSION_PLAIN(1,1,1)	\
+    && !defined(OPENSSL_NO_SHA512) && defined(NID_sha512_224)
+# define HAVE_SHA512_224
+#endif
+
+#if OPENSSL_VERSION_NUMBER >= PACKED_OPENSSL_VERSION_PLAIN(1,1,1)	\
+    && !defined(OPENSSL_NO_SHA512) && defined(NID_sha512_256)
+# define HAVE_SHA512_256
+#endif
+
 // SHA3:
 #if OPENSSL_VERSION_NUMBER >= PACKED_OPENSSL_VERSION_PLAIN(1,1,1)
 // An error in beta releases of 1.1.1 fixed in production release
diff --git a/lib/crypto/doc/guides/algorithm_details.md b/lib/crypto/doc/guides/algorithm_details.md
index 136559b315..750838ff37 100644
--- a/lib/crypto/doc/guides/algorithm_details.md
+++ b/lib/crypto/doc/guides/algorithm_details.md
@@ -178,6 +178,8 @@ name is present in the list returned by
 | `sha256`    | 32                                                     |
 | `sha384`    | 48                                                     |
 | `sha512`    | 64                                                     |
+| `sha512_224`| 28                                                     |
+| `sha512_256`| 32                                                     |
 | `sha3_224`  | 28                                                     |
 | `sha3_256`  | 32                                                     |
 | `sha3_384`  | 48                                                     |
@@ -211,7 +213,7 @@ column is present in the list returned by
 | **Type** | **Names**                                                  | **Limited to** **OpenSSL versions** |
 | -------- | ---------------------------------------------------------- | ----------------------------------- |
 | SHA1     | sha                                                        |                                     |
-| SHA2     | sha224, sha256, sha384, sha512                             |                                     |
+| SHA2     | sha224, sha256, sha384, sha512, sha512_224, sha512_256     |                                     |
 | SHA3     | sha3_224, sha3_256, sha3_384, sha3_512, shake128, shake256 | ≥1.1.1                              |
 | SM3      | sm3                                                        | ≥1.1.1                              |
 | MD4      | md4                                                        |                                     |
diff --git a/lib/crypto/src/crypto.erl b/lib/crypto/src/crypto.erl
index a2c66bad54..25c24efda4 100644
--- a/lib/crypto/src/crypto.erl
+++ b/lib/crypto/src/crypto.erl
@@ -699,7 +699,7 @@ support all of them.
 -doc(#{title => <<"Digests and hash">>,equiv => blake2()}).
 -type sha1() :: sha .
 -doc(#{title => <<"Digests and hash">>,equiv => blake2()}).
--type sha2() :: sha224 | sha256 | sha384 | sha512 .
+-type sha2() :: sha224 | sha256 | sha384 | sha512 | sha512_224 | sha512_256 .
 -doc(#{title => <<"Digests and hash">>,equiv => blake2()}).
 -type sha3() :: sha3_224 | sha3_256 | sha3_384 | sha3_512 .
 -doc(#{title => <<"Digests and hash">>,equiv => blake2()}).
@@ -998,7 +998,7 @@ Uses the [3-tuple style](`m:crypto#error_3tup`) for error handling.
 """.
 -doc(#{title => <<"Engine API">>,since => <<"OTP 24.2">>}).
 -spec pbkdf2_hmac(Digest, Pass, Salt, Iter, KeyLen) -> Result
-          when Digest :: sha | sha224 | sha256 | sha384 | sha512,
+          when Digest :: sha | sha224 | sha256 | sha384 | sha512 | sha512_224 | sha512_256,
                Pass :: binary(),
                Salt :: binary(),
                Iter :: pos_integer(),
diff --git a/lib/crypto/test/crypto_SUITE.erl b/lib/crypto/test/crypto_SUITE.erl
index dfdf8d8ffb..74f9294947 100644
--- a/lib/crypto/test/crypto_SUITE.erl
+++ b/lib/crypto/test/crypto_SUITE.erl
@@ -257,6 +257,8 @@ groups() ->
                      {group, sha3_384},
                      {group, sha3_512},
                      {group, sha512},
+                     {group, sha512_224},
+                     {group, sha512_256},
                      {group, shake128},
                      {group, shake256},
                      {group, sha},
@@ -390,6 +392,8 @@ groups() ->
      {sha256,               [], [hash, hmac, hmac_update]},
      {sha384,               [], [hash, hmac, hmac_update]},
      {sha512,               [], [hash, hmac, hmac_update]},
+     {sha512_224,           [], [hash, hmac, hmac_update]},
+     {sha512_256,           [], [hash, hmac, hmac_update]},
      {sha3_224,             [], [hash, hmac, hmac_update]},
      {sha3_256,             [], [hash, hmac, hmac_update]},
      {sha3_384,             [], [hash, hmac, hmac_update]},
@@ -2232,6 +2236,16 @@ group_config(sha512 = Type, Config) ->
     Msgs =  [rfc_4634_test1(), rfc_4634_test2(), long_msg()],
     Digests = rfc_4634_sha512_digests() ++ [long_sha512_digest()],
     [{hash, {Type, Msgs, Digests}} | Config];
+group_config(sha512_224 = Type, Config) ->
+    % https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha512_224.pdf
+    Msgs =  [rfc_4634_test1(), rfc_4634_test2(), long_msg()],
+    Digests = rfc_4634_sha512_224_digests() ++ [long_sha512_224_digest()],
+    [{hash, {Type, Msgs, Digests}} | Config];
+group_config(sha512_256 = Type, Config) ->
+    % https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha512_224.pdf
+    Msgs =  [rfc_4634_test1(), rfc_4634_test2(), long_msg()],
+    Digests = rfc_4634_sha512_256_digests() ++ [long_sha512_256_digest()],
+    [{hash, {Type, Msgs, Digests}} | Config];
 group_config(sha3_224 = Type, Config) ->
     {Msgs,Digests} = sha3_test_vectors(Type),
     [{hash, {Type, Msgs, Digests}} | Config];
@@ -2408,6 +2422,16 @@ do_configure_mac(hmac, Type, _Config) ->
             Data = rfc_4231_msgs() ++ [long_msg()],
             Hmac = rfc4231_hmac_sha512() ++ [long_hmac(sha512)],
             zip3_special(hmac, Type, Keys, Data, Hmac);
+        sha512_224 ->
+            Keys = rfc_4231_keys() ++ [long_hmac_key(sha512_224)],
+            Data = rfc_4231_msgs() ++ [long_msg()],
+            Hmac = rfc4231_hmac_sha512_224() ++ [long_hmac(sha512_224)],
+            zip3_special(hmac, Type, Keys, Data, Hmac);
+        sha512_256 ->
+            Keys = rfc_4231_keys() ++ [long_hmac_key(sha512_256)],
+            Data = rfc_4231_msgs() ++ [long_msg()],
+            Hmac = rfc4231_hmac_sha512_256() ++ [long_hmac(sha512_256)],
+            zip3_special(hmac, Type, Keys, Data, Hmac);
         sm3 ->
             Keys = sm3_keys(),
             Data = sm3_msgs(),
@@ -2911,6 +2935,16 @@ rfc_4634_sha512_digests() ->
 		"454D4423643CE80E2A9AC94FA54CA49F"),
      hexstr2bin("8E959B75DAE313DA8CF4F72814FC143F8F7779C6EB9F7FA17299AEADB6889018501D289E4900F7E4331B99DEC4B5433AC7D329EEB6DD26545E96E55B874BE909")].
 
+rfc_4634_sha512_224_digests() ->
+  [hexstr2bin("4634270F707B6A54DAAE7530460842E20E37ED265CEEE9A43E8924AA"),
+   hexstr2bin("23FEC5BB94D60B23308192640B0C453335D664734FE40E7268674AF9")
+  ].
+
+rfc_4634_sha512_256_digests() ->
+  [hexstr2bin("53048E2681941EF99B2E29B76B4C7DABE4C2D0C634FC6D46E0E2F13107E7AF23"),
+   hexstr2bin("3928E184FB8690F840DA3988121D31BE65CB9D3EF83EE6146FEAC861E19B563A")
+  ].
+
 long_msg() ->
     fun() -> lists:duplicate(1000000, $a) end.
 
@@ -2937,6 +2971,14 @@ long_sha512_digest() ->
     hexstr2bin("e718483d0ce76964" "4e2e42c7bc15b463" "8e1f98b13b204428" "5632a803afa973eb"
 	       "de0ff244877ea60a" "4cb0432ce577c31b" "eb009c5c2c49aa2e" "4eadb217ad8cc09b").
 
+long_sha512_224_digest() ->
+    % test vector generated from openssl
+    hexstr2bin("37AB331D76F0D36DE422BD0EDEB22A28ACCD487B7A8453AE965DD287").
+
+long_sha512_256_digest() ->
+    % test vector generated from openssl
+    hexstr2bin("9a59a052930187a97038cae692f30708aa6491923ef5194394dc68d56c74fb21").
+
 ripemd160_msgs() ->
     [<<"">>,
      <<"a">>,
@@ -3011,7 +3053,9 @@ cmac_inc(_) ->
 
 %% https://www.cosic.esat.kuleuven.be/nessie/testvectors/
 long_hmac_key(Type) when Type == sha384;
-			 Type == sha512 ->
+			 Type == sha512;
+                         Type == sha512_256;
+                         Type == sha512_224 ->
     hexstr2bin("00112233445566778899AABBCCDDEEFF"
 	       "0123456789ABCDEF0011223344556677"
 	       "8899AABBCCDDEEFF0123456789ABCDEF"
@@ -3036,7 +3080,18 @@ long_hmac(sha512) ->
     hexstr2bin("D116BF471AAE1264854F1906025E846A"
 	       "61618A965FCA30B695220EA2D6E547E3"
 	       "F3B5A4B54E6778928C26D5D3D810498E"
-	       "8DF86CB3CC1E9F66A00419B13B6B0C9A").
+	       "8DF86CB3CC1E9F66A00419B13B6B0C9A");
+
+long_hmac(sha512_256) ->
+  %% test vectors generated from openssl
+
+  hexstr2bin("a5c5701071e79b0e208f13d50b96fc90"
+             "4ceefd45b7a1e9e69afbdc805121f904");
+
+long_hmac(sha512_224) ->
+  %% test vectors generated from openssl
+  hexstr2bin("534d74563c873444d485569369c209ee"
+             "6734de4c8cb81d5eee148e2e").
 
 rfc_2202_hmac_md5() ->
     [
@@ -3104,8 +3159,8 @@ rfc4231_hmac_sha256() ->
 		"5a003f089d2739839dec58b964ec3843"),
      hexstr2bin("773ea91e36800e46854db8ebd09181a7"
 		"2959098b3ef8c122d9635514ced565fe"),
-    hexstr2bin("82558a389a443c0ea4cc819899f2083a"
-	       "85f0faa3e578f8077a2e3ff46729665b"),
+     hexstr2bin("82558a389a443c0ea4cc819899f2083a"
+	        "85f0faa3e578f8077a2e3ff46729665b"),
      hexstr2bin("a3b6167473100ee06e0c796c2955552b"),
      hexstr2bin("60e431591ee0b67f0d8a26aacbf5b77f"
 		"8e0bc6213728c5140546040f0ee37f54"),
@@ -3159,6 +3214,40 @@ rfc4231_hmac_sha512() ->
 		"b6022cac3c4982b10d5eeb55c3e4de15"
 		"134676fb6de0446065c97440fa8c6a58")].
 
+rfc4231_hmac_sha512_256() ->
+    % test vectors generated from openssl
+    [hexstr2bin("9f9126c3d9c3c330d760425ca8a217e3"
+                "1feae31bfe70196ff81642b868402eab"),
+     hexstr2bin("6df7b24630d5ccb2ee335407081a8718"
+                "8c221489768fa2020513b2d593359456"),
+     hexstr2bin("229006391d66c8ecddf43ba5cf8f8353"
+                "0ef221a4e9401840d1bead5137c8a2ea"),
+     hexstr2bin("36d60c8aa1d0be856e10804cf836e821"
+                "e8733cbafeae87630589fd0b9b0a2f4c"),
+     hexstr2bin("337f526924766971bf72b82ad19c2c82"),
+     hexstr2bin("87123c45f7c537a404f8f47cdbedda1f"
+                "c9bec60eeb971982ce7ef10e774e6539"),
+     hexstr2bin("6ea83f8e7315072c0bdaa33b93a26fc1"
+                "659974637a9db8a887d06c05a7f35a66")].
+
+
+rfc4231_hmac_sha512_224() ->
+    % test vectors generated from openssl
+    [hexstr2bin("b244ba01307c0e7a8ccaad13b1067a4c"
+                "f6b961fe0c6a20bda3d92039"),
+     hexstr2bin("4a530b31a79ebcce36916546317c45f2"
+                "47d83241dfb818fd37254bde"),
+     hexstr2bin("db34ea525c2c216ee5a6ccb6608bea87"
+                "0bbef12fd9b96a5109e2b6fc"),
+     hexstr2bin("c2391863cda465c6828af06ac5d4b72d"
+                "0b792109952da530e11a0d26"),
+     hexstr2bin("1df8eae8baeedd4eddfb555ec0ba768f"),
+     hexstr2bin("29bef8ce88b54d4226c3c7718ea9e32a"
+                "ce2429026f089e38cea9aeda"),
+     hexstr2bin("82a9619b47af0cea73a8b9741355ce90"
+                "2d807ad87ee9078522a246e1")].
+
+
 %% HMAC-SM3 from GM/T 0042-2015 Appendix D.3
 %% https://github.com/openssl/openssl/pull/18714
 sm3_keys() ->
-- 
2.43.0

openSUSE Build Service is sponsored by