]> Savannah Git Hosting - gnulib.git/commitdiff
sm3-buffer: New module.
authorBruno Haible <bruno@clisp.org>
Sat, 18 Sep 2021 23:42:57 +0000 (01:42 +0200)
committerBruno Haible <bruno@clisp.org>
Sat, 18 Sep 2021 23:42:57 +0000 (01:42 +0200)
* lib/sm3-stream.c: New file, extracted from lib/sm3.c.
* lib/sm3.c: Don't include stdlib.h, unlocked-io.h.
(BLOCKSIZE, sm3_stream): Moved to sm3-stream.c.
* lib/sm3.h: Tweak.
* modules/crypto/sm3-buffer: New file, based on modules/crypto/sm3.
* modules/crypto/sm3: Rewritten.

ChangeLog
lib/sm3-stream.c [new file with mode: 0644]
lib/sm3.c
lib/sm3.h
modules/crypto/sm3
modules/crypto/sm3-buffer [new file with mode: 0644]

index 398c8cfe717af5f29e168f950e2656f647dc49b2..074bd3caf7f29e108189cebbf38669920884b04f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2021-09-18  Bruno Haible  <bruno@clisp.org>
+
+       sm3-buffer: New module.
+       * lib/sm3-stream.c: New file, extracted from lib/sm3.c.
+       * lib/sm3.c: Don't include stdlib.h, unlocked-io.h.
+       (BLOCKSIZE, sm3_stream): Moved to sm3-stream.c.
+       * lib/sm3.h: Tweak.
+       * modules/crypto/sm3-buffer: New file, based on modules/crypto/sm3.
+       * modules/crypto/sm3: Rewritten.
+
 2021-09-18  Bruno Haible  <bruno@clisp.org>
 
        sha512-buffer tests: New module.
diff --git a/lib/sm3-stream.c b/lib/sm3-stream.c
new file mode 100644 (file)
index 0000000..de91b80
--- /dev/null
@@ -0,0 +1,123 @@
+/* sm3.c - Functions to compute SM3 message digest of files or memory blocks
+   according to the specification GM/T 004-2012 Cryptographic Hash Algorithm
+   SM3, published by State Encryption Management Bureau, China.
+
+   SM3 cryptographic hash algorithm.
+   <http://www.sca.gov.cn/sca/xwdt/2010-12/17/content_1002389.shtml>
+
+   Copyright (C) 2017-2021 Free Software Foundation, Inc.
+
+   This file is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 of the
+   License, or (at your option) any later version.
+
+   This file is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Jia Zhang <qianyue.zj@alibaba-inc.com>, 2017,
+   considerably copypasting from David Madore's sha256.c */
+
+#include <config.h>
+
+/* Specification.  */
+#if HAVE_OPENSSL_SM3
+# define GL_OPENSSL_INLINE _GL_EXTERN_INLINE
+#endif
+#include "sm3.h"
+
+#include <stdlib.h>
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+#define BLOCKSIZE 32768
+#if BLOCKSIZE % 64 != 0
+# error "invalid BLOCKSIZE"
+#endif
+
+/* Compute SM3 message digest for bytes read from STREAM.  The
+   resulting message digest number will be written into the 32 bytes
+   beginning at RESBLOCK.  */
+int
+sm3_stream (FILE *stream, void *resblock)
+{
+  struct sm3_ctx ctx;
+  size_t sum;
+
+  char *buffer = malloc (BLOCKSIZE + 72);
+  if (!buffer)
+    return 1;
+
+  /* Initialize the computation context.  */
+  sm3_init_ctx (&ctx);
+
+  /* Iterate over full file contents.  */
+  while (1)
+    {
+      /* We read the file in blocks of BLOCKSIZE bytes.  One call of the
+         computation function processes the whole buffer so that with the
+         next round of the loop another block can be read.  */
+      size_t n;
+      sum = 0;
+
+      /* Read block.  Take care for partial reads.  */
+      while (1)
+        {
+          n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream);
+
+          sum += n;
+
+          if (sum == BLOCKSIZE)
+            break;
+
+          if (n == 0)
+            {
+              /* Check for the error flag IFF N == 0, so that we don't
+                 exit the loop after a partial read due to e.g., EAGAIN
+                 or EWOULDBLOCK.  */
+              if (ferror (stream))
+                {
+                  free (buffer);
+                  return 1;
+                }
+              goto process_partial_block;
+            }
+
+          /* We've read at least one byte, so ignore errors.  But always
+             check for EOF, since feof may be true even though N > 0.
+             Otherwise, we could end up calling fread after EOF.  */
+          if (feof (stream))
+            goto process_partial_block;
+        }
+
+      /* Process buffer with BLOCKSIZE bytes.  Note that
+                        BLOCKSIZE % 64 == 0
+       */
+      sm3_process_block (buffer, BLOCKSIZE, &ctx);
+    }
+
+ process_partial_block:;
+
+  /* Process any remaining bytes.  */
+  if (sum > 0)
+    sm3_process_bytes (buffer, sum, &ctx);
+
+  /* Construct result in desired memory.  */
+  sm3_finish_ctx (&ctx, resblock);
+  free (buffer);
+  return 0;
+}
+
+/*
+ * Hey Emacs!
+ * Local Variables:
+ * coding: utf-8
+ * End:
+ */
index bc4769b3dc80b8230fad3c4997ca845e99d33a26..0f3b83e7cc2317b72a0c4df8af820aff71bad3f5 100644 (file)
--- a/lib/sm3.c
+++ b/lib/sm3.c
 /* Written by Jia Zhang <qianyue.zj@alibaba-inc.com>, 2017,
    considerably copypasting from David Madore's sha256.c */
 
-#ifndef DEBUG_SM3
-# define DEBUG_SM3 0
-#endif
-
 #include <config.h>
 
+/* Specification.  */
 #if HAVE_OPENSSL_SM3
 # define GL_OPENSSL_INLINE _GL_EXTERN_INLINE
 #endif
 
 #include <stdalign.h>
 #include <stdint.h>
-#include <stdlib.h>
 #include <string.h>
 
-#if USE_UNLOCKED_IO
-# include "unlocked-io.h"
-#endif
-
-#if ! DEBUG_SM3
-# define dbg_printf(fmt, ...) do { } while (0)
-#else
-# define dbg_printf printf
-#endif
-
 #include <byteswap.h>
 #ifdef WORDS_BIGENDIAN
 # define SWAP(n) (n)
 # define SWAP(n) bswap_32 (n)
 #endif
 
-#define BLOCKSIZE 32768
-#if BLOCKSIZE % 64 != 0
-# error "invalid BLOCKSIZE"
+#ifndef DEBUG_SM3
+# define DEBUG_SM3 0
+#endif
+
+#if ! DEBUG_SM3
+# define dbg_printf(fmt, ...) do { } while (0)
+#else
+# define dbg_printf printf
 #endif
 
 #if ! HAVE_OPENSSL_SM3
+
 /* This array contains the bytes used to pad the buffer to the next
    64-byte boundary.  */
 static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ...  */ };
@@ -145,82 +137,7 @@ sm3_finish_ctx (struct sm3_ctx *ctx, void *resbuf)
   sm3_conclude_ctx (ctx);
   return sm3_read_ctx (ctx, resbuf);
 }
-#endif
-
-/* Compute SM3 message digest for bytes read from STREAM.  The
-   resulting message digest number will be written into the 32 bytes
-   beginning at RESBLOCK.  */
-int
-sm3_stream (FILE *stream, void *resblock)
-{
-  struct sm3_ctx ctx;
-  size_t sum;
-
-  char *buffer = malloc (BLOCKSIZE + 72);
-  if (!buffer)
-    return 1;
-
-  /* Initialize the computation context.  */
-  sm3_init_ctx (&ctx);
-
-  /* Iterate over full file contents.  */
-  while (1)
-    {
-      /* We read the file in blocks of BLOCKSIZE bytes.  One call of the
-         computation function processes the whole buffer so that with the
-         next round of the loop another block can be read.  */
-      size_t n;
-      sum = 0;
-
-      /* Read block.  Take care for partial reads.  */
-      while (1)
-        {
-          n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream);
-
-          sum += n;
-
-          if (sum == BLOCKSIZE)
-            break;
-
-          if (n == 0)
-            {
-              /* Check for the error flag IFF N == 0, so that we don't
-                 exit the loop after a partial read due to e.g., EAGAIN
-                 or EWOULDBLOCK.  */
-              if (ferror (stream))
-                {
-                  free (buffer);
-                  return 1;
-                }
-              goto process_partial_block;
-            }
-
-          /* We've read at least one byte, so ignore errors.  But always
-             check for EOF, since feof may be true even though N > 0.
-             Otherwise, we could end up calling fread after EOF.  */
-          if (feof (stream))
-            goto process_partial_block;
-        }
-
-      /* Process buffer with BLOCKSIZE bytes.  Note that
-                        BLOCKSIZE % 64 == 0
-       */
-      sm3_process_block (buffer, BLOCKSIZE, &ctx);
-    }
-
- process_partial_block:;
 
-  /* Process any remaining bytes.  */
-  if (sum > 0)
-    sm3_process_bytes (buffer, sum, &ctx);
-
-  /* Construct result in desired memory.  */
-  sm3_finish_ctx (&ctx, resblock);
-  free (buffer);
-  return 0;
-}
-
-#if ! HAVE_OPENSSL_SM3
 /* Compute SM3 message digest for LEN bytes beginning at BUFFER.  The
    result is always in little endian byte order, so that a byte-wise
    output yields to the wanted ASCII representation of the message
@@ -488,6 +405,7 @@ sm3_process_block (const void *buffer, size_t len, struct sm3_ctx *ctx)
       h = ctx->state[7] ^= h;
     }
 }
+
 #endif
 
 /*
index e1b6d908596f40f39ddbfa7c87ec3dd6b9cffd26..dda4d981413f0d1e4fef78a057cb27b0b7eac753 100644 (file)
--- a/lib/sm3.h
+++ b/lib/sm3.h
@@ -90,6 +90,7 @@ extern void *sm3_buffer (const char *buffer, size_t len,
                          void *restrict resblock);
 
 # endif
+
 /* Compute SM3 message digest for bytes read from STREAM.  The
    resulting message digest number will be written into the 32 bytes
    beginning at RESBLOCK.  */
index 3df7d88259207f25bd3f85f358816b2fb92cf114..773f0fa91be9c741263fa1338f3c25f846b50259 100644 (file)
@@ -2,22 +2,15 @@ Description:
 Compute SM3 checksums.
 
 Files:
-lib/sm3.h
-lib/sm3.c
-m4/sm3.m4
+lib/sm3-stream.c
 
 Depends-on:
-byteswap
-c99
-extern-inline
-stdalign
-stdint
+crypto/sm3-buffer
 
 configure.ac:
-gl_SM3
 
 Makefile.am:
-lib_SOURCES += sm3.c
+lib_SOURCES += sm3-stream.c
 
 Include:
 "sm3.h"
diff --git a/modules/crypto/sm3-buffer b/modules/crypto/sm3-buffer
new file mode 100644 (file)
index 0000000..3df7d88
--- /dev/null
@@ -0,0 +1,32 @@
+Description:
+Compute SM3 checksums.
+
+Files:
+lib/sm3.h
+lib/sm3.c
+m4/sm3.m4
+
+Depends-on:
+byteswap
+c99
+extern-inline
+stdalign
+stdint
+
+configure.ac:
+gl_SM3
+
+Makefile.am:
+lib_SOURCES += sm3.c
+
+Include:
+"sm3.h"
+
+Link:
+$(LIB_CRYPTO)
+
+License:
+LGPLv2+
+
+Maintainer:
+Jia Zhang