>From 81ca30b0dedb08c6ef54c308cd264bc234a060c4 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Sun, 19 Sep 2021 01:42:57 +0200 Subject: [PATCH 13/14] 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. --- ChangeLog | 10 ++++ lib/sm3-stream.c | 123 ++++++++++++++++++++++++++++++++++++++ lib/sm3.c | 104 ++++---------------------------- lib/sm3.h | 1 + modules/crypto/sm3 | 13 +--- modules/crypto/sm3-buffer | 32 ++++++++++ 6 files changed, 180 insertions(+), 103 deletions(-) create mode 100644 lib/sm3-stream.c create mode 100644 modules/crypto/sm3-buffer diff --git a/ChangeLog b/ChangeLog index 398c8cfe7..074bd3caf 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2021-09-18 Bruno Haible + + 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 sha512-buffer tests: New module. diff --git a/lib/sm3-stream.c b/lib/sm3-stream.c new file mode 100644 index 000000000..de91b8002 --- /dev/null +++ b/lib/sm3-stream.c @@ -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. + + + 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 . */ + +/* Written by Jia Zhang , 2017, + considerably copypasting from David Madore's sha256.c */ + +#include + +/* Specification. */ +#if HAVE_OPENSSL_SM3 +# define GL_OPENSSL_INLINE _GL_EXTERN_INLINE +#endif +#include "sm3.h" + +#include + +#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: + */ diff --git a/lib/sm3.c b/lib/sm3.c index bc4769b3d..0f3b83e7c 100644 --- a/lib/sm3.c +++ b/lib/sm3.c @@ -23,12 +23,9 @@ /* Written by Jia Zhang , 2017, considerably copypasting from David Madore's sha256.c */ -#ifndef DEBUG_SM3 -# define DEBUG_SM3 0 -#endif - #include +/* Specification. */ #if HAVE_OPENSSL_SM3 # define GL_OPENSSL_INLINE _GL_EXTERN_INLINE #endif @@ -36,19 +33,8 @@ #include #include -#include #include -#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 #ifdef WORDS_BIGENDIAN # define SWAP(n) (n) @@ -56,12 +42,18 @@ # 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 /* diff --git a/lib/sm3.h b/lib/sm3.h index e1b6d9085..dda4d9814 100644 --- 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. */ diff --git a/modules/crypto/sm3 b/modules/crypto/sm3 index 3df7d8825..773f0fa91 100644 --- a/modules/crypto/sm3 +++ b/modules/crypto/sm3 @@ -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 index 000000000..3df7d8825 --- /dev/null +++ b/modules/crypto/sm3-buffer @@ -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 -- 2.25.1