Add support for SHA256/192
authorFergus Dall <sidereal@google.com>
Mon, 12 Jun 2023 10:02:14 +0000 (20:02 +1000)
committerPauli <pauli@openssl.org>
Tue, 27 Jun 2023 22:00:43 +0000 (08:00 +1000)
This is defined in NIST SP 800-208 as the truncation to 192 bits of
SHA256. Unlike other truncated hashes in the SHA2 suite, this variant
doesn't have a different initial state, it is just a pure truncation
of the output.

Reviewed-by: Tomas Mraz <tomas@openssl.org>
Reviewed-by: Paul Dale <pauli@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/21180)

12 files changed:
CHANGES.md
crypto/sha/sha256.c
doc/man7/EVP_MD-SHA2.pod
include/crypto/sha.h
include/openssl/core_names.h.in
include/openssl/sha.h
providers/defltprov.c
providers/implementations/digests/sha2_prov.c
providers/implementations/include/prov/implementations.h
providers/implementations/include/prov/names.h
test/recipes/30-test_evp_data/evpmac_common.txt
test/recipes/30-test_evp_data/evpmd_sha.txt

index 62a7c3f7ca066918f7cb47e9748e8c407b375d4d..4fffd324ee3414d8c281178b8ba1759773070cca 100644 (file)
@@ -25,6 +25,10 @@ OpenSSL 3.2
 
 ### Changes between 3.1 and 3.2 [xx XXX xxxx]
 
+ * Added SHA256/192 algorithm support.
+
+   *Fergus Dall*
+
  * Provide a new configure option `no-http` that can be used to disable HTTP
    support.
 
index 649d25d6c6d0fe738a67d90fc5ef617649f315f7..2e844f8587f50fbdbd618548c197dfa0bcdda531 100644 (file)
@@ -22,6 +22,7 @@
 #include <openssl/sha.h>
 #include <openssl/opensslv.h>
 #include "internal/endian.h"
+#include "crypto/sha.h"
 
 int SHA224_Init(SHA256_CTX *c)
 {
@@ -53,6 +54,13 @@ int SHA256_Init(SHA256_CTX *c)
     return 1;
 }
 
+int ossl_sha256_192_init(SHA256_CTX *c)
+{
+    SHA256_Init(c);
+    c->md_len = SHA256_192_DIGEST_LENGTH;
+    return 1;
+}
+
 int SHA224_Update(SHA256_CTX *c, const void *data, size_t len)
 {
     return SHA256_Update(c, data, len);
@@ -81,7 +89,11 @@ int SHA224_Final(unsigned char *md, SHA256_CTX *c)
         unsigned long ll;               \
         unsigned int  nn;               \
         switch ((c)->md_len)            \
-        {   case SHA224_DIGEST_LENGTH:  \
+        {   case SHA256_192_DIGEST_LENGTH: \
+                for (nn=0;nn<SHA256_192_DIGEST_LENGTH/4;nn++)   \
+                {   ll=(c)->h[nn]; (void)HOST_l2c(ll,(s));   }  \
+                break;                  \
+            case SHA224_DIGEST_LENGTH:  \
                 for (nn=0;nn<SHA224_DIGEST_LENGTH/4;nn++)       \
                 {   ll=(c)->h[nn]; (void)HOST_l2c(ll,(s));   }  \
                 break;                  \
index 2a2e799d895428c6ac390489c721edd486917408..ffee7d1231a1ee7ba4c7a61a8a598e130ddca87b 100644 (file)
@@ -44,6 +44,10 @@ Available with the default provider:
 
 =over 4
 
+=item SHA2-256/192
+
+Known names are "SHA2-256/192", "SHA-256/192" and "SHA256-192".
+
 =item SHA2-512/224
 
 Known names are "SHA2-512/224", "SHA-512/224" and "SHA512-224".
index 64305d1790b2ea64960ba5c96cacb255fc425cc3..3f32e96086fc2d2bfa812dbf0d1054a1b547c428 100644 (file)
@@ -14,6 +14,7 @@
 
 # include <openssl/sha.h>
 
+int ossl_sha256_192_init(SHA256_CTX *c);
 int sha512_224_init(SHA512_CTX *);
 int sha512_256_init(SHA512_CTX *);
 int ossl_sha1_ctrl(SHA_CTX *ctx, int cmd, int mslen, void *ms);
index 133f7830eea6b3263dd77c83a243afff1b2ac0d3..da1767d1e95eb10148e1f960192ac5b3af9ab24d 100644 (file)
@@ -36,6 +36,7 @@ extern "C" {
 # define OSSL_DIGEST_NAME_SHA1           "SHA1"
 # define OSSL_DIGEST_NAME_SHA2_224       "SHA2-224"
 # define OSSL_DIGEST_NAME_SHA2_256       "SHA2-256"
+# define OSSL_DIGEST_NAME_SHA2_256_192   "SHA2-256/192"
 # define OSSL_DIGEST_NAME_SHA2_384       "SHA2-384"
 # define OSSL_DIGEST_NAME_SHA2_512       "SHA2-512"
 # define OSSL_DIGEST_NAME_SHA2_512_224   "SHA2-512/224"
index 6e65a0408969e3cdc1dd4822bda23ecc52792b76..67f89da8f0697c74bbbf1d4cdab4ddd2b8871427 100644 (file)
@@ -81,6 +81,7 @@ OSSL_DEPRECATEDIN_3_0 void SHA256_Transform(SHA256_CTX *c,
 unsigned char *SHA224(const unsigned char *d, size_t n, unsigned char *md);
 unsigned char *SHA256(const unsigned char *d, size_t n, unsigned char *md);
 
+# define SHA256_192_DIGEST_LENGTH 24
 # define SHA224_DIGEST_LENGTH    28
 # define SHA256_DIGEST_LENGTH    32
 # define SHA384_DIGEST_LENGTH    48
index 8b2ae6bfbfbca7f85e0f2b4f6bb71a8fd5074d99..fa4165b365792dba18e0b222c1682be037410c6b 100644 (file)
@@ -103,6 +103,7 @@ static const OSSL_ALGORITHM deflt_digests[] = {
     { PROV_NAMES_SHA1, "provider=default", ossl_sha1_functions },
     { PROV_NAMES_SHA2_224, "provider=default", ossl_sha224_functions },
     { PROV_NAMES_SHA2_256, "provider=default", ossl_sha256_functions },
+    { PROV_NAMES_SHA2_256_192, "provider=default", ossl_sha256_192_functions },
     { PROV_NAMES_SHA2_384, "provider=default", ossl_sha384_functions },
     { PROV_NAMES_SHA2_512, "provider=default", ossl_sha512_functions },
     { PROV_NAMES_SHA2_512_224, "provider=default", ossl_sha512_224_functions },
index 6f9c41a3a695871e20befed18911f6c576dd9ddd..039c616095667c5e5c613aa00a8437b9155d1cf7 100644 (file)
@@ -71,7 +71,12 @@ IMPLEMENT_digest_functions(sha224, SHA256_CTX,
 IMPLEMENT_digest_functions(sha256, SHA256_CTX,
                            SHA256_CBLOCK, SHA256_DIGEST_LENGTH, SHA2_FLAGS,
                            SHA256_Init, SHA256_Update, SHA256_Final)
-
+#ifndef FIPS_MODULE
+/* ossl_sha256_192_functions */
+IMPLEMENT_digest_functions(sha256_192, SHA256_CTX,
+                           SHA256_CBLOCK, SHA256_192_DIGEST_LENGTH, SHA2_FLAGS,
+                           ossl_sha256_192_init, SHA256_Update, SHA256_Final)
+#endif
 /* ossl_sha384_functions */
 IMPLEMENT_digest_functions(sha384, SHA512_CTX,
                            SHA512_CBLOCK, SHA384_DIGEST_LENGTH, SHA2_FLAGS,
index 2c3c54155f79cc97dd319b0a3189ed4320270e2e..1c7bb4ab8d8676bb80e7edeff73e759803663115 100644 (file)
@@ -14,6 +14,7 @@
 extern const OSSL_DISPATCH ossl_sha1_functions[];
 extern const OSSL_DISPATCH ossl_sha224_functions[];
 extern const OSSL_DISPATCH ossl_sha256_functions[];
+extern const OSSL_DISPATCH ossl_sha256_192_functions[];
 extern const OSSL_DISPATCH ossl_sha384_functions[];
 extern const OSSL_DISPATCH ossl_sha512_functions[];
 extern const OSSL_DISPATCH ossl_sha512_224_functions[];
index dd40a6a8ed3562720d80ff4989e0ca88aa15a301..af7e45a3f6e3a06300da01cfeeb82c62582e02d6 100644 (file)
 #define PROV_NAMES_SHA1 "SHA1:SHA-1:SSL3-SHA1:1.3.14.3.2.26"
 #define PROV_NAMES_SHA2_224 "SHA2-224:SHA-224:SHA224:2.16.840.1.101.3.4.2.4"
 #define PROV_NAMES_SHA2_256 "SHA2-256:SHA-256:SHA256:2.16.840.1.101.3.4.2.1"
+#define PROV_NAMES_SHA2_256_192 "SHA2-256/192:SHA-256/192:SHA256-192"
 #define PROV_NAMES_SHA2_384 "SHA2-384:SHA-384:SHA384:2.16.840.1.101.3.4.2.2"
 #define PROV_NAMES_SHA2_512 "SHA2-512:SHA-512:SHA512:2.16.840.1.101.3.4.2.3"
 #define PROV_NAMES_SHA2_512_224 "SHA2-512/224:SHA-512/224:SHA512-224:2.16.840.1.101.3.4.2.5"
index d9c8a15c01d8216aadaef5bbbefc1dffb60a88d8..7bcce7d9204b2dba25b4649e803620611762426f 100644 (file)
@@ -67,6 +67,29 @@ BlockSize = 64
 
 Title = SHA2
 
+Availablein = default
+MAC = HMAC
+Algorithm = SHA256-192
+Input = "Sample message for keylen=blocklen"
+Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F
+Output = 48C07F4015447032622F0F1F368EBB02EE1424F3529739D6
+OutputSize = 24
+BlockSize = 64
+
+Availablein = default
+MAC = HMAC
+Algorithm = SHA256-192
+Input = "Sample message for keylen<blocklen"
+Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B
+Output = 6ECCAB0BE3F7657CAF65CAD9784C8177C9F83A685AB52F4C
+
+Availablein = default
+MAC = HMAC
+Algorithm = SHA256-192
+Input = "Sample message for keylen=blocklen"
+Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60616263
+Output = 4FC15185394271A626627835B912A9CF641C9CD84F7909A4
+
 MAC = HMAC
 Algorithm = SHA224
 Input = "Sample message for keylen=blocklen"
index 1b417bfca73b9e857d80369a65df8badb29e0802..149137b7122d146d9dadbca401f81244ca8a9c40 100644 (file)
@@ -58,6 +58,25 @@ Input = "a"
 Ncopy = 64
 Output = cdc76e5c9914fb9281a1c7e284d73e67f1809a48a497200e046d39ccc7112cd0
 
+Availablein = default
+Digest = SHA256-192
+Input = "abc"
+Output = ba7816bf8f01cfea414140de5dae2223b00361a396177a9c
+
+Availablein = default
+Digest = SHA256-192
+Input = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
+Output = 248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167
+
+Availablein = default
+Digest = SHA256-192
+Input = "a"
+Ncopy = 288
+Count = 3472
+Input = "a"
+Ncopy = 64
+Output = cdc76e5c9914fb9281a1c7e284d73e67f1809a48a497200e
+
 Digest = SHA384
 Input = "abc"
 Output = cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7