md: Optimize gcry_md_hash_buffers for SHA-256 and SHA-512.
authorWerner Koch <wk@gnupg.org>
Fri, 16 Jun 2017 14:53:33 +0000 (16:53 +0200)
committerWerner Koch <wk@gnupg.org>
Fri, 16 Jun 2017 14:53:33 +0000 (16:53 +0200)
* cipher/sha256.c (_gcry_sha256_hash_buffer): New.
(_gcry_sha256_hash_buffers): New.
* cipher/sha512.c (_gcry_sha512_hash_buffer): New.
(_gcry_sha512_hash_buffers): New.
* cipher/md.c (_gcry_md_hash_buffer): Optimize for SHA246 and SHA512.
(_gcry_md_hash_buffers): Ditto.

Signed-off-by: Werner Koch <wk@gnupg.org>
cipher/md.c
cipher/sha256.c
cipher/sha512.c
src/cipher.h

index 8df54fe..c1f585f 100644 (file)
@@ -1028,10 +1028,24 @@ void
 _gcry_md_hash_buffer (int algo, void *digest,
                       const void *buffer, size_t length)
 {
-  if (algo == GCRY_MD_SHA1)
+  if (0)
+    ;
+#if USE_SHA256
+  else if (algo == GCRY_MD_SHA256)
+    _gcry_sha256_hash_buffer (digest, buffer, length);
+#endif
+#if USE_SHA512
+  else if (algo == GCRY_MD_SHA512)
+    _gcry_sha512_hash_buffer (digest, buffer, length);
+#endif
+#if USE_SHA1
+  else if (algo == GCRY_MD_SHA1)
     _gcry_sha1_hash_buffer (digest, buffer, length);
+#endif
+#if USE_RMD160
   else if (algo == GCRY_MD_RMD160 && !fips_mode () )
     _gcry_rmd160_hash_buffer (digest, buffer, length);
+#endif
   else
     {
       /* For the others we do not have a fast function, so we use the
@@ -1091,12 +1105,24 @@ _gcry_md_hash_buffers (int algo, unsigned int flags, void *digest,
   if (hmac && iovcnt < 1)
     return GPG_ERR_INV_ARG;
 
-  if (algo == GCRY_MD_SHA1 && !hmac)
+  if (0)
+    ;
+#if USE_SHA256
+  else if (algo == GCRY_MD_SHA256 && !hmac)
+    _gcry_sha256_hash_buffers (digest, iov, iovcnt);
+#endif
+#if USE_SHA512
+  else if (algo == GCRY_MD_SHA512 && !hmac)
+    _gcry_sha512_hash_buffers (digest, iov, iovcnt);
+#endif
+#if USE_SHA1
+  else if (algo == GCRY_MD_SHA1 && !hmac)
     _gcry_sha1_hash_buffers (digest, iov, iovcnt);
+#endif
   else
     {
       /* For the others we do not have a fast function, so we use the
-        normal functions. */
+        normal functions.  */
       gcry_md_hd_t h;
       gpg_err_code_t rc;
       int dlen;
index b450a12..d174321 100644 (file)
@@ -509,6 +509,35 @@ sha256_read (void *context)
 }
 
 
+/* Shortcut functions which puts the hash value of the supplied buffer
+ * into outbuf which must have a size of 32 bytes.  */
+void
+_gcry_sha256_hash_buffer (void *outbuf, const void *buffer, size_t length)
+{
+  SHA256_CONTEXT hd;
+
+  sha256_init (&hd, 0);
+  _gcry_md_block_write (&hd, buffer, length);
+  sha256_final (&hd);
+  memcpy (outbuf, hd.bctx.buf, 32);
+}
+
+
+/* Variant of the above shortcut function using multiple buffers.  */
+void
+_gcry_sha256_hash_buffers (void *outbuf, const gcry_buffer_t *iov, int iovcnt)
+{
+  SHA256_CONTEXT hd;
+
+  sha256_init (&hd, 0);
+  for (;iovcnt > 0; iov++, iovcnt--)
+    _gcry_md_block_write (&hd,
+                          (const char*)iov[0].data + iov[0].off, iov[0].len);
+  sha256_final (&hd);
+  memcpy (outbuf, hd.bctx.buf, 32);
+}
+
+
 \f
 /*
      Self-test section.
index 5b25965..2ddc485 100644 (file)
@@ -739,6 +739,35 @@ sha512_read (void *context)
 }
 
 
+/* Shortcut functions which puts the hash value of the supplied buffer
+ * into outbuf which must have a size of 64 bytes.  */
+void
+_gcry_sha512_hash_buffer (void *outbuf, const void *buffer, size_t length)
+{
+  SHA512_CONTEXT hd;
+
+  sha512_init (&hd, 0);
+  _gcry_md_block_write (&hd, buffer, length);
+  sha512_final (&hd);
+  memcpy (outbuf, hd.bctx.buf, 64);
+}
+
+
+/* Variant of the above shortcut function using multiple buffers.  */
+void
+_gcry_sha512_hash_buffers (void *outbuf, const gcry_buffer_t *iov, int iovcnt)
+{
+  SHA512_CONTEXT hd;
+
+  sha512_init (&hd, 0);
+  for (;iovcnt > 0; iov++, iovcnt--)
+    _gcry_md_block_write (&hd,
+                          (const char*)iov[0].data + iov[0].off, iov[0].len);
+  sha512_final (&hd);
+  memcpy (outbuf, hd.bctx.buf, 64);
+}
+
+
 \f
 /*
      Self-test section.
index 725cc73..f2acb55 100644 (file)
@@ -120,6 +120,19 @@ void _gcry_sha1_hash_buffer (void *outbuf,
                              const void *buffer, size_t length);
 void _gcry_sha1_hash_buffers (void *outbuf,
                               const gcry_buffer_t *iov, int iovcnt);
+
+/*-- sha256.c --*/
+void _gcry_sha256_hash_buffer (void *outbuf,
+                               const void *buffer, size_t length);
+void _gcry_sha256_hash_buffers (void *outbuf,
+                                const gcry_buffer_t *iov, int iovcnt);
+
+/*-- sha512.c --*/
+void _gcry_sha512_hash_buffer (void *outbuf,
+                               const void *buffer, size_t length);
+void _gcry_sha512_hash_buffers (void *outbuf,
+                                const gcry_buffer_t *iov, int iovcnt);
+
 /*-- blake2.c --*/
 gcry_err_code_t _gcry_blake2_init_with_key(void *ctx, unsigned int flags,
                                           const unsigned char *key,