diff options
Diffstat (limited to 'lib/sm3.c')
-rw-r--r-- | lib/sm3.c | 104 |
1 files changed, 11 insertions, 93 deletions
@@ -23,12 +23,9 @@ /* 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 @@ -36,19 +33,8 @@ #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) @@ -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 /* |