diff options
-rw-r--r-- | configure.ac | 4 | ||||
-rw-r--r-- | libopkg/sha256.c | 50 | ||||
-rw-r--r-- | libopkg/sha256.h | 35 |
3 files changed, 39 insertions, 50 deletions
diff --git a/configure.ac b/configure.ac index 7b38116..fb38df7 100644 --- a/configure.ac +++ b/configure.ac @@ -7,7 +7,7 @@ AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_MACRO_DIR([shave]) AM_INIT_AUTOMAKE -AC_CONFIG_HEADERS(libopkg/config.h) +AC_CONFIG_HEADERS(config.h) AC_CANONICAL_HOST AC_GNU_SOURCE @@ -66,7 +66,7 @@ fi # check for sha256 AC_ARG_ENABLE(sha256, AC_HELP_STRING([--enable-sha256], [Enable sha256sum check - (sha256.{c,h} are GPLv3 licensed) [[default=no]] ]), + [[default=no]] ]), [want_sha256="$enableval"], [want_sha256="no"]) if test "x$want_sha256" = "xyes"; then diff --git a/libopkg/sha256.c b/libopkg/sha256.c index 0ad9444..d23c509 100644 --- a/libopkg/sha256.c +++ b/libopkg/sha256.c @@ -1,12 +1,12 @@ /* sha256.c - Functions to compute SHA256 and SHA224 message digest of files or memory blocks according to the NIST specification FIPS-180-2. - Copyright (C) 2005, 2006, 2008 Free Software Foundation, Inc. + Copyright (C) 2005, 2006 Free Software Foundation, Inc. - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -14,7 +14,8 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. */ + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Written by David Madore, considerably copypasting from Scott G. Miller's sha1.c @@ -85,25 +86,18 @@ sha224_init_ctx (struct sha256_ctx *ctx) ctx->buflen = 0; } -/* Copy the value from v into the memory location pointed to by *cp, - If your architecture allows unaligned access this is equivalent to - * (uint32_t *) cp = v */ -static inline void -set_uint32 (char *cp, uint32_t v) -{ - memcpy (cp, &v, sizeof v); -} - /* Put result from CTX in first 32 bytes following RESBUF. The result - must be in little endian byte order. */ + must be in little endian byte order. + + IMPORTANT: On some systems it is required that RESBUF is correctly + aligned for a 32-bit value. */ void * sha256_read_ctx (const struct sha256_ctx *ctx, void *resbuf) { int i; - char *r = resbuf; for (i = 0; i < 8; i++) - set_uint32 (r + i * sizeof ctx->state[0], SWAP (ctx->state[i])); + ((uint32_t *) resbuf)[i] = SWAP (ctx->state[i]); return resbuf; } @@ -112,21 +106,23 @@ void * sha224_read_ctx (const struct sha256_ctx *ctx, void *resbuf) { int i; - char *r = resbuf; for (i = 0; i < 7; i++) - set_uint32 (r + i * sizeof ctx->state[0], SWAP (ctx->state[i])); + ((uint32_t *) resbuf)[i] = SWAP (ctx->state[i]); return resbuf; } /* Process the remaining bytes in the internal buffer and the usual - prolog according to the standard and write the result to RESBUF. */ + prolog according to the standard and write the result to RESBUF. + + IMPORTANT: On some systems it is required that RESBUF is correctly + aligned for a 32-bit value. */ static void sha256_conclude_ctx (struct sha256_ctx *ctx) { /* Take yet unprocessed bytes into account. */ - size_t bytes = ctx->buflen; + uint32_t bytes = ctx->buflen; size_t size = (bytes < 56) ? 64 / 4 : 64 * 2 / 4; /* Now count remaining bytes. */ @@ -134,13 +130,9 @@ sha256_conclude_ctx (struct sha256_ctx *ctx) if (ctx->total[0] < bytes) ++ctx->total[1]; - /* Put the 64-bit file length in *bits* at the end of the buffer. - Use set_uint32 rather than a simple assignment, to avoid risk of - unaligned access. */ - set_uint32 ((char *) &ctx->buffer[size - 2], - SWAP ((ctx->total[1] << 3) | (ctx->total[0] >> 29))); - set_uint32 ((char *) &ctx->buffer[size - 1], - SWAP (ctx->total[0] << 3)); + /* Put the 64-bit file length in *bits* at the end of the buffer. */ + ctx->buffer[size - 2] = SWAP ((ctx->total[1] << 3) | (ctx->total[0] >> 29)); + ctx->buffer[size - 1] = SWAP (ctx->total[0] << 3); memcpy (&((char *) ctx->buffer)[bytes], fillbuf, (size - 2) * 4 - bytes); diff --git a/libopkg/sha256.h b/libopkg/sha256.h index 6a9aed4..ccbe6cf 100644 --- a/libopkg/sha256.h +++ b/libopkg/sha256.h @@ -1,11 +1,11 @@ /* Declarations of functions and data types used for SHA256 and SHA224 sum library functions. - Copyright (C) 2005, 2006, 2008, 2009 Free Software Foundation, Inc. + Copyright (C) 2005, 2006 Free Software Foundation, Inc. - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -13,7 +13,8 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. */ + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef SHA256_H # define SHA256_H 1 @@ -21,22 +22,16 @@ # include <stdio.h> # include <stdint.h> -# ifdef __cplusplus -extern "C" { -# endif - /* Structure to save state of computation between the single steps. */ struct sha256_ctx { uint32_t state[8]; uint32_t total[2]; - size_t buflen; + uint32_t buflen; uint32_t buffer[32]; }; -enum { SHA224_DIGEST_SIZE = 224 / 8 }; -enum { SHA256_DIGEST_SIZE = 256 / 8 }; /* Initialize structure containing state of computation. */ extern void sha256_init_ctx (struct sha256_ctx *ctx); @@ -59,14 +54,20 @@ extern void sha256_process_bytes (const void *buffer, size_t len, /* Process the remaining bytes in the buffer and put result from CTX in first 32 (28) bytes following RESBUF. The result is always in little endian byte order, so that a byte-wise output yields to the wanted - ASCII representation of the message digest. */ + ASCII representation of the message digest. + + IMPORTANT: On some systems it is required that RESBUF be correctly + aligned for a 32 bits value. */ extern void *sha256_finish_ctx (struct sha256_ctx *ctx, void *resbuf); extern void *sha224_finish_ctx (struct sha256_ctx *ctx, void *resbuf); /* Put result from CTX in first 32 (28) bytes following RESBUF. The result is always in little endian byte order, so that a byte-wise output yields - to the wanted ASCII representation of the message digest. */ + to the wanted ASCII representation of the message digest. + + IMPORTANT: On some systems it is required that RESBUF is correctly + aligned for a 32 bits value. */ extern void *sha256_read_ctx (const struct sha256_ctx *ctx, void *resbuf); extern void *sha224_read_ctx (const struct sha256_ctx *ctx, void *resbuf); @@ -84,8 +85,4 @@ extern int sha224_stream (FILE *stream, void *resblock); extern void *sha256_buffer (const char *buffer, size_t len, void *resblock); extern void *sha224_buffer (const char *buffer, size_t len, void *resblock); -# ifdef __cplusplus -} -# endif - #endif |