X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Fsha1.c;h=f989005a2ffcb7b17c7a294cefc4e30d46ad3fca;hp=27e0daf3a4badc7d449cd575f61bc83dbe152ff5;hb=e8c3ca2d1d0cac3d64985b45a9f654d2029a7518;hpb=774e09230145ee2d8ba58868573213da84a348eb diff --git a/src/sha1.c b/src/sha1.c index 27e0daf3..f989005a 100644 --- a/src/sha1.c +++ b/src/sha1.c @@ -4,29 +4,31 @@ * Parts of this file are based on public domain code written by Steve Reid. */ -/* - * Copyright (C) 2012 Eric Biggers +/* + * Copyright (C) 2012, 2013 Eric Biggers * * This file is part of wimlib, a library for working with WIM files. * * wimlib 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) + * 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. * * wimlib 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 + * A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * - * You should have received a copy of the GNU Lesser General Public License + * You should have received a copy of the GNU General Public License * along with wimlib; if not, see http://www.gnu.org/licenses/. */ -#include "util.h" -#include "wimlib.h" -#include "sha1.h" -#include "endianness.h" +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "wimlib/sha1.h" + #include /* The SHA1 support in wimlib can use an external libcrypto (part of openssl) or @@ -34,11 +36,19 @@ * Steve Reid's public domain code, or based on Intel's SSSE3 SHA1 code. */ -#ifndef WITH_LIBCRYPTO +const u8 zero_hash[SHA1_HASH_SIZE] = { + 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, +}; + +#ifndef WITH_LIBCRYPTO /* Initialize new context */ -void sha1_init(SHA_CTX* context) +void +sha1_init(SHA_CTX* context) { /* SHA1 initialization constants */ context->state[0] = 0x67452301; @@ -50,19 +60,23 @@ void sha1_init(SHA_CTX* context) } #ifdef ENABLE_SSSE3_SHA1 -extern void sha1_update_intel(int *hash, const char* input, size_t num_blocks); +extern void +sha1_update_intel(int *hash, const void* input, size_t num_blocks); -void sha1_update(SHA_CTX *context, const u8 data[], size_t len) +void +sha1_update(SHA_CTX *context, const void *data, size_t len) { sha1_update_intel((int*)&context->state, data, len / 64); size_t j = (context->count[0] >> 3) & 63; - if ((context->count[0] += len << 3) < (len << 3)) context->count[1]++; + if ((context->count[0] += len << 3) < (len << 3)) + context->count[1]++; context->count[1] += (len >> 29); } #include -void ssse3_not_found() +void +ssse3_not_found() { - fprintf(stderr, + fprintf(stderr, "Cannot calculate SHA1 message digest: CPU does not support SSSE3\n" "instructions! Recompile wimlib without the --enable-ssse3-sha1 flag\n" "to use wimlib on this CPU.\n"); @@ -92,7 +106,8 @@ void ssse3_not_found() #define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30); /* Hash a single 512-bit block. This is the core of the algorithm. */ -static void sha1_transform(u32 state[5], const u8 buffer[64]) +static void +sha1_transform(u32 state[5], const u8 buffer[64]) { u32 a, b, c, d, e; typedef union { @@ -142,7 +157,8 @@ static void sha1_transform(u32 state[5], const u8 buffer[64]) state[4] += e; } -void sha1_update(SHA_CTX* context, const u8 data[], const size_t len) +void +sha1_update(SHA_CTX* context, const void *data, const size_t len) { size_t i, j; @@ -160,13 +176,14 @@ void sha1_update(SHA_CTX* context, const u8 data[], const size_t len) } else { i = 0; } - memcpy(&context->buffer[j], &data[i], len - i); + memcpy(&context->buffer[j], data + i, len - i); } #endif /* !ENABLE_SSSE3_SHA1 */ /* Add padding and return the message digest. */ -void sha1_final(u8 md[SHA1_HASH_SIZE], SHA_CTX* context) +void +sha1_final(u8 md[SHA1_HASH_SIZE], SHA_CTX* context) { u32 i; u8 finalcount[8]; @@ -185,7 +202,8 @@ void sha1_final(u8 md[SHA1_HASH_SIZE], SHA_CTX* context) } } -void sha1_buffer(const u8 buffer[], size_t len, u8 md[SHA1_HASH_SIZE]) +void +sha1_buffer(const void *buffer, size_t len, u8 md[SHA1_HASH_SIZE]) { SHA_CTX ctx; sha1_init(&ctx); @@ -194,46 +212,3 @@ void sha1_buffer(const u8 buffer[], size_t len, u8 md[SHA1_HASH_SIZE]) } #endif /* !WITH_LIBCRYPTO */ - -static int sha1_stream(FILE *fp, u8 md[SHA1_HASH_SIZE]) -{ - char buf[BUFFER_SIZE]; - size_t bytes_read; - SHA_CTX ctx; - sha1_init(&ctx); - while (1) { - bytes_read = fread(buf, 1, sizeof(buf), fp); - sha1_update(&ctx, buf, bytes_read); - if (bytes_read < sizeof(buf)) { - if (ferror(fp)) - return WIMLIB_ERR_READ; - break; - } - } - sha1_final(md, &ctx); - return 0; - -} - -/* Calculates the SHA1 message digest given the name of a file. @md must point - * to a buffer of length 20 bytes into which the message digest is written. - */ -int sha1sum(const char *filename, u8 md[SHA1_HASH_SIZE]) -{ - FILE *fp; - int ret; - - fp = fopen(filename, "rb"); - if (!fp) { - ERROR_WITH_ERRNO("Cannot open the file `%s' for reading", - filename); - return WIMLIB_ERR_OPEN; - } - ret = sha1_stream(fp, md); - if (ret != 0) { - ERROR_WITH_ERRNO("Error calculating SHA1 message digest of " - "`%s'", filename); - } - fclose(fp); - return ret; -}