From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 70727 invoked by alias); 16 Oct 2017 14:23:01 -0000 Mailing-List: contact elfutils-devel-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Post: List-Help: List-Subscribe: Sender: elfutils-devel-owner@sourceware.org Received: (qmail 68031 invoked by uid 89); 16 Oct 2017 14:22:59 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Checked: by ClamAV 0.99.2 on sourceware.org X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.1 required=5.0 tests=BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_ASCII_DIVIDERS,KAM_LAZY_DOMAIN_SECURITY autolearn=ham version=3.3.2 spammy=Course, Colin, colin, 1995 X-Spam-Status: No, score=-25.1 required=5.0 tests=BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_ASCII_DIVIDERS,KAM_LAZY_DOMAIN_SECURITY autolearn=ham version=3.3.2 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on sourceware.org X-Spam-Level: X-HELO: gnu.wildebeest.org Received: from wildebeest.demon.nl (HELO gnu.wildebeest.org) (212.238.236.112) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 16 Oct 2017 14:22:54 +0000 Received: from tarox.wildebeest.org (tarox.wildebeest.org [172.31.17.39]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by gnu.wildebeest.org (Postfix) with ESMTPSA id D5E8030278BF; Mon, 16 Oct 2017 16:22:50 +0200 (CEST) Received: by tarox.wildebeest.org (Postfix, from userid 1000) id D04DB419BBAC; Mon, 16 Oct 2017 16:22:50 +0200 (CEST) From: Mark Wielaard To: elfutils-devel@sourceware.org Cc: Mark Wielaard Subject: [PATCH] lib: Remove md5 and sha1 implementations. Date: Mon, 16 Oct 2017 14:23:00 -0000 Message-Id: <1508163761-26300-1-git-send-email-mark@klomp.org> X-Mailer: git-send-email 1.8.3.1 X-Spam-Flag: NO X-IsSubscribed: yes X-SW-Source: 2017-q4/txt/msg00026.txt.bz2 Only the testcase md5-sha1-test used them. So also remove that testcase. Signed-off-by: Mark Wielaard --- .gitignore | 1 - ChangeLog | 4 + lib/ChangeLog | 7 + lib/Makefile.am | 4 +- lib/md5.c | 438 -------------------------------------------------- lib/md5.h | 110 ------------- lib/sha1.c | 380 ------------------------------------------- lib/sha1.h | 93 ----------- tests/ChangeLog | 7 + tests/Makefile.am | 7 +- tests/md5-sha1-test.c | 93 ----------- 11 files changed, 23 insertions(+), 1121 deletions(-) delete mode 100644 lib/md5.c delete mode 100644 lib/md5.h delete mode 100644 lib/sha1.c delete mode 100644 lib/sha1.h delete mode 100644 tests/md5-sha1-test.c diff --git a/.gitignore b/.gitignore index 43a8d6e..e8201dc 100644 --- a/.gitignore +++ b/.gitignore @@ -135,7 +135,6 @@ Makefile.in /tests/hash /tests/line2addr /tests/low_high_pc -/tests/md5-sha1-test /tests/msg_tst /tests/newdata /tests/newfile diff --git a/ChangeLog b/ChangeLog index cb87833..cd1a3f2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2017-10-16 Mark Wielaard + + * .gitignore: Remove tests/md5-sha1-test. + 2017-08-18 Ulf Hermann * configure.ac: Check if the compiler supports diff --git a/lib/ChangeLog b/lib/ChangeLog index 6123045..769c3dc 100644 --- a/lib/ChangeLog +++ b/lib/ChangeLog @@ -1,3 +1,10 @@ +2017-10-16 Mark Wielaard + + * md5.{c,h}: Removed. + * sha1.{c,h}: Likewise. + * Makefile.am (libeu_a_SOURCES): Remove md5.c and sha1.c. + (noinst_HEADERS): Remove md5.h and sha1.h. + 2017-08-18 Ulf Hermann * eu-config.h: Define attribute_packed to either diff --git a/lib/Makefile.am b/lib/Makefile.am index c30d38b..36d21a0 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -34,11 +34,11 @@ AM_CPPFLAGS += -I$(srcdir)/../libelf noinst_LIBRARIES = libeu.a libeu_a_SOURCES = xstrdup.c xstrndup.c xmalloc.c next_prime.c \ - crc32.c crc32_file.c md5.c sha1.c \ + crc32.c crc32_file.c \ color.c printversion.c noinst_HEADERS = fixedsizehash.h libeu.h system.h dynamicsizehash.h list.h \ - md5.h sha1.h eu-config.h color.h printversion.h bpf.h + eu-config.h color.h printversion.h bpf.h EXTRA_DIST = dynamicsizehash.c if !GPROF diff --git a/lib/md5.c b/lib/md5.c deleted file mode 100644 index 40f3044..0000000 --- a/lib/md5.c +++ /dev/null @@ -1,438 +0,0 @@ -/* Functions to compute MD5 message digest of files or memory blocks. - according to the definition of MD5 in RFC 1321 from April 1992. - Copyright (C) 1995-2011, 2015 Red Hat, Inc. - This file is part of elfutils. - Written by Ulrich Drepper , 1995. - - This file is free software; you can redistribute it and/or modify - it under the terms of either - - * the GNU Lesser General Public License as published by the Free - Software Foundation; either version 3 of the License, or (at - your option) any later version - - or - - * the GNU General Public License as published by the Free - Software Foundation; either version 2 of the License, or (at - your option) any later version - - or both in parallel, as here. - - elfutils 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 - General Public License for more details. - - You should have received copies of the GNU General Public License and - the GNU Lesser General Public License along with this program. If - not, see . */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include -#include -#include - -#include "md5.h" -#include "system.h" - -#define SWAP(n) LE32 (n) - -/* This array contains the bytes used to pad the buffer to the next - 64-byte boundary. (RFC 1321, 3.1: Step 1) */ -static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ }; - - -/* Initialize structure containing state of computation. - (RFC 1321, 3.3: Step 3) */ -void -md5_init_ctx (struct md5_ctx *ctx) -{ - ctx->A = 0x67452301; - ctx->B = 0xefcdab89; - ctx->C = 0x98badcfe; - ctx->D = 0x10325476; - - ctx->total[0] = ctx->total[1] = 0; - ctx->buflen = 0; -} - -/* Put result from CTX in first 16 bytes following RESBUF. The result - must be in little endian byte order. - - IMPORTANT: On some systems it is required that RESBUF is correctly - aligned for a 32 bits value. */ -void * -md5_read_ctx (const struct md5_ctx *ctx, void *resbuf) -{ - ((md5_uint32 *) resbuf)[0] = SWAP (ctx->A); - ((md5_uint32 *) resbuf)[1] = SWAP (ctx->B); - ((md5_uint32 *) resbuf)[2] = SWAP (ctx->C); - ((md5_uint32 *) resbuf)[3] = SWAP (ctx->D); - - return resbuf; -} - -static void -le64_copy (char *dest, uint64_t x) -{ - for (size_t i = 0; i < 8; ++i) - { - dest[i] = (uint8_t) x; - x >>= 8; - } -} - -/* Process the remaining bytes in the internal buffer and the usual - 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 bits value. */ -void * -md5_finish_ctx (struct md5_ctx *ctx, void *resbuf) -{ - /* Take yet unprocessed bytes into account. */ - md5_uint32 bytes = ctx->buflen; - size_t pad; - - /* Now count remaining bytes. */ - ctx->total[0] += bytes; - if (ctx->total[0] < bytes) - ++ctx->total[1]; - - pad = bytes >= 56 ? 64 + 56 - bytes : 56 - bytes; - memcpy (&ctx->buffer[bytes], fillbuf, pad); - - /* Put the 64-bit file length in *bits* at the end of the buffer. */ - const uint64_t bit_length = ((ctx->total[0] << 3) - + ((uint64_t) ((ctx->total[1] << 3) | - (ctx->total[0] >> 29)) << 32)); - le64_copy (&ctx->buffer[bytes + pad], bit_length); - - /* Process last bytes. */ - md5_process_block (ctx->buffer, bytes + pad + 8, ctx); - - return md5_read_ctx (ctx, resbuf); -} - - -#ifdef NEED_MD5_STREAM -/* Compute MD5 message digest for bytes read from STREAM. The - resulting message digest number will be written into the 16 bytes - beginning at RESBLOCK. */ -int -md5_stream (FILE *stream, void *resblock) -{ - /* Important: BLOCKSIZE must be a multiple of 64. */ -#define BLOCKSIZE 4096 - struct md5_ctx ctx; - char buffer[BLOCKSIZE + 72]; - size_t sum; - - /* Initialize the computation context. */ - md5_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. */ - do - { - n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream); - - sum += n; - } - while (sum < BLOCKSIZE && n != 0); - if (n == 0 && ferror (stream)) - return 1; - - /* If end of file is reached, end the loop. */ - if (n == 0) - break; - - /* Process buffer with BLOCKSIZE bytes. Note that - BLOCKSIZE % 64 == 0 - */ - md5_process_block (buffer, BLOCKSIZE, &ctx); - } - - /* Add the last bytes if necessary. */ - if (sum > 0) - md5_process_bytes (buffer, sum, &ctx); - - /* Construct result in desired memory. */ - md5_finish_ctx (&ctx, resblock); - return 0; -} -#endif - - -#ifdef NEED_MD5_BUFFER -/* Compute MD5 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 - digest. */ -void * -md5_buffer (const char *buffer, size_t len, void *resblock) -{ - struct md5_ctx ctx; - - /* Initialize the computation context. */ - md5_init_ctx (&ctx); - - /* Process whole buffer but last len % 64 bytes. */ - md5_process_bytes (buffer, len, &ctx); - - /* Put result in desired memory area. */ - return md5_finish_ctx (&ctx, resblock); -} -#endif - - -void -md5_process_bytes (const void *buffer, size_t len, struct md5_ctx *ctx) -{ - /* When we already have some bits in our internal buffer concatenate - both inputs first. */ - if (ctx->buflen != 0) - { - size_t left_over = ctx->buflen; - size_t add = 128 - left_over > len ? len : 128 - left_over; - - memcpy (&ctx->buffer[left_over], buffer, add); - ctx->buflen += add; - - if (ctx->buflen > 64) - { - md5_process_block (ctx->buffer, ctx->buflen & ~63, ctx); - - ctx->buflen &= 63; - /* The regions in the following copy operation cannot overlap. */ - memcpy (ctx->buffer, &ctx->buffer[(left_over + add) & ~63], - ctx->buflen); - } - - buffer = (const char *) buffer + add; - len -= add; - } - - /* Process available complete blocks. */ - if (len >= 64) - { -#if !_STRING_ARCH_unaligned -/* To check alignment gcc has an appropriate operator. Other - compilers don't. */ -# if __GNUC__ >= 2 -# define UNALIGNED_P(p) (((md5_uintptr) p) % __alignof__ (md5_uint32) != 0) -# else -# define UNALIGNED_P(p) (((md5_uintptr) p) % sizeof (md5_uint32) != 0) -# endif - if (UNALIGNED_P (buffer)) - while (len > 64) - { - md5_process_block (memcpy (ctx->buffer, buffer, 64), 64, ctx); - buffer = (const char *) buffer + 64; - len -= 64; - } - else -#endif - { - md5_process_block (buffer, len & ~63, ctx); - buffer = (const char *) buffer + (len & ~63); - len &= 63; - } - } - - /* Move remaining bytes in internal buffer. */ - if (len > 0) - { - size_t left_over = ctx->buflen; - - memcpy (&ctx->buffer[left_over], buffer, len); - left_over += len; - if (left_over >= 64) - { - md5_process_block (ctx->buffer, 64, ctx); - left_over -= 64; - memcpy (ctx->buffer, &ctx->buffer[64], left_over); - } - ctx->buflen = left_over; - } -} - - -/* These are the four functions used in the four steps of the MD5 algorithm - and defined in the RFC 1321. The first function is a little bit optimized - (as found in Colin Plumbs public domain implementation). */ -/* #define FF(b, c, d) ((b & c) | (~b & d)) */ -#define FF(b, c, d) (d ^ (b & (c ^ d))) -#define FG(b, c, d) FF (d, b, c) -#define FH(b, c, d) (b ^ c ^ d) -#define FI(b, c, d) (c ^ (b | ~d)) - -/* Process LEN bytes of BUFFER, accumulating context into CTX. - It is assumed that LEN % 64 == 0. */ - -void -md5_process_block (const void *buffer, size_t len, struct md5_ctx *ctx) -{ - md5_uint32 correct_words[16]; - const md5_uint32 *words = buffer; - size_t nwords = len / sizeof (md5_uint32); - const md5_uint32 *endp = words + nwords; - md5_uint32 A = ctx->A; - md5_uint32 B = ctx->B; - md5_uint32 C = ctx->C; - md5_uint32 D = ctx->D; - - /* First increment the byte count. RFC 1321 specifies the possible - length of the file up to 2^64 bits. Here we only compute the - number of bytes. Do a double word increment. */ - ctx->total[0] += len; - if (ctx->total[0] < len) - ++ctx->total[1]; - - /* Process all bytes in the buffer with 64 bytes in each round of - the loop. */ - while (words < endp) - { - md5_uint32 *cwp = correct_words; - md5_uint32 A_save = A; - md5_uint32 B_save = B; - md5_uint32 C_save = C; - md5_uint32 D_save = D; - - /* First round: using the given function, the context and a constant - the next context is computed. Because the algorithms processing - unit is a 32-bit word and it is determined to work on words in - little endian byte order we perhaps have to change the byte order - before the computation. To reduce the work for the next steps - we store the swapped words in the array CORRECT_WORDS. */ - -#define OP(a, b, c, d, s, T) \ - do \ - { \ - a += FF (b, c, d) + (*cwp++ = SWAP (*words)) + T; \ - ++words; \ - CYCLIC (a, s); \ - a += b; \ - } \ - while (0) - - /* It is unfortunate that C does not provide an operator for - cyclic rotation. Hope the C compiler is smart enough. */ -#define CYCLIC(w, s) (w = (w << s) | (w >> (32 - s))) - - /* Before we start, one word to the strange constants. - They are defined in RFC 1321 as - - T[i] = (int) (4294967296.0 * fabs (sin (i))), i=1..64 - */ - - /* Round 1. */ - OP (A, B, C, D, 7, 0xd76aa478); - OP (D, A, B, C, 12, 0xe8c7b756); - OP (C, D, A, B, 17, 0x242070db); - OP (B, C, D, A, 22, 0xc1bdceee); - OP (A, B, C, D, 7, 0xf57c0faf); - OP (D, A, B, C, 12, 0x4787c62a); - OP (C, D, A, B, 17, 0xa8304613); - OP (B, C, D, A, 22, 0xfd469501); - OP (A, B, C, D, 7, 0x698098d8); - OP (D, A, B, C, 12, 0x8b44f7af); - OP (C, D, A, B, 17, 0xffff5bb1); - OP (B, C, D, A, 22, 0x895cd7be); - OP (A, B, C, D, 7, 0x6b901122); - OP (D, A, B, C, 12, 0xfd987193); - OP (C, D, A, B, 17, 0xa679438e); - OP (B, C, D, A, 22, 0x49b40821); - - /* For the second to fourth round we have the possibly swapped words - in CORRECT_WORDS. Redefine the macro to take an additional first - argument specifying the function to use. */ -#undef OP -#define OP(f, a, b, c, d, k, s, T) \ - do \ - { \ - a += f (b, c, d) + correct_words[k] + T; \ - CYCLIC (a, s); \ - a += b; \ - } \ - while (0) - - /* Round 2. */ - OP (FG, A, B, C, D, 1, 5, 0xf61e2562); - OP (FG, D, A, B, C, 6, 9, 0xc040b340); - OP (FG, C, D, A, B, 11, 14, 0x265e5a51); - OP (FG, B, C, D, A, 0, 20, 0xe9b6c7aa); - OP (FG, A, B, C, D, 5, 5, 0xd62f105d); - OP (FG, D, A, B, C, 10, 9, 0x02441453); - OP (FG, C, D, A, B, 15, 14, 0xd8a1e681); - OP (FG, B, C, D, A, 4, 20, 0xe7d3fbc8); - OP (FG, A, B, C, D, 9, 5, 0x21e1cde6); - OP (FG, D, A, B, C, 14, 9, 0xc33707d6); - OP (FG, C, D, A, B, 3, 14, 0xf4d50d87); - OP (FG, B, C, D, A, 8, 20, 0x455a14ed); - OP (FG, A, B, C, D, 13, 5, 0xa9e3e905); - OP (FG, D, A, B, C, 2, 9, 0xfcefa3f8); - OP (FG, C, D, A, B, 7, 14, 0x676f02d9); - OP (FG, B, C, D, A, 12, 20, 0x8d2a4c8a); - - /* Round 3. */ - OP (FH, A, B, C, D, 5, 4, 0xfffa3942); - OP (FH, D, A, B, C, 8, 11, 0x8771f681); - OP (FH, C, D, A, B, 11, 16, 0x6d9d6122); - OP (FH, B, C, D, A, 14, 23, 0xfde5380c); - OP (FH, A, B, C, D, 1, 4, 0xa4beea44); - OP (FH, D, A, B, C, 4, 11, 0x4bdecfa9); - OP (FH, C, D, A, B, 7, 16, 0xf6bb4b60); - OP (FH, B, C, D, A, 10, 23, 0xbebfbc70); - OP (FH, A, B, C, D, 13, 4, 0x289b7ec6); - OP (FH, D, A, B, C, 0, 11, 0xeaa127fa); - OP (FH, C, D, A, B, 3, 16, 0xd4ef3085); - OP (FH, B, C, D, A, 6, 23, 0x04881d05); - OP (FH, A, B, C, D, 9, 4, 0xd9d4d039); - OP (FH, D, A, B, C, 12, 11, 0xe6db99e5); - OP (FH, C, D, A, B, 15, 16, 0x1fa27cf8); - OP (FH, B, C, D, A, 2, 23, 0xc4ac5665); - - /* Round 4. */ - OP (FI, A, B, C, D, 0, 6, 0xf4292244); - OP (FI, D, A, B, C, 7, 10, 0x432aff97); - OP (FI, C, D, A, B, 14, 15, 0xab9423a7); - OP (FI, B, C, D, A, 5, 21, 0xfc93a039); - OP (FI, A, B, C, D, 12, 6, 0x655b59c3); - OP (FI, D, A, B, C, 3, 10, 0x8f0ccc92); - OP (FI, C, D, A, B, 10, 15, 0xffeff47d); - OP (FI, B, C, D, A, 1, 21, 0x85845dd1); - OP (FI, A, B, C, D, 8, 6, 0x6fa87e4f); - OP (FI, D, A, B, C, 15, 10, 0xfe2ce6e0); - OP (FI, C, D, A, B, 6, 15, 0xa3014314); - OP (FI, B, C, D, A, 13, 21, 0x4e0811a1); - OP (FI, A, B, C, D, 4, 6, 0xf7537e82); - OP (FI, D, A, B, C, 11, 10, 0xbd3af235); - OP (FI, C, D, A, B, 2, 15, 0x2ad7d2bb); - OP (FI, B, C, D, A, 9, 21, 0xeb86d391); - - /* Add the starting values of the context. */ - A += A_save; - B += B_save; - C += C_save; - D += D_save; - } - - /* Put checksum in context given as argument. */ - ctx->A = A; - ctx->B = B; - ctx->C = C; - ctx->D = D; -} diff --git a/lib/md5.h b/lib/md5.h deleted file mode 100644 index f2d0f30..0000000 --- a/lib/md5.h +++ /dev/null @@ -1,110 +0,0 @@ -/* Declaration of functions and data types used for MD5 sum computing - library functions. - Copyright (C) 1995,1996,1997,1999-2001,2004,2005,2008 Red Hat, Inc. - This file is part of elfutils. - Written by Ulrich Drepper , 1995. - - This file is free software; you can redistribute it and/or modify - it under the terms of either - - * the GNU Lesser General Public License as published by the Free - Software Foundation; either version 3 of the License, or (at - your option) any later version - - or - - * the GNU General Public License as published by the Free - Software Foundation; either version 2 of the License, or (at - your option) any later version - - or both in parallel, as here. - - elfutils 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 - General Public License for more details. - - You should have received copies of the GNU General Public License and - the GNU Lesser General Public License along with this program. If - not, see . */ - -#ifndef _MD5_H -#define _MD5_H 1 - -#include -#include -#include - -#define MD5_DIGEST_SIZE 16 -#define MD5_BLOCK_SIZE 64 - -typedef uint32_t md5_uint32; -typedef uintptr_t md5_uintptr; - -/* Structure to save state of computation between the single steps. */ -struct md5_ctx -{ - md5_uint32 A; - md5_uint32 B; - md5_uint32 C; - md5_uint32 D; - - md5_uint32 total[2]; - md5_uint32 buflen; - char buffer[128] __attribute__ ((__aligned__ (__alignof__ (md5_uint32)))); -}; - -/* - * The following three functions are build up the low level used in - * the functions `md5_stream' and `md5_buffer'. - */ - -/* Initialize structure containing state of computation. - (RFC 1321, 3.3: Step 3) */ -extern void md5_init_ctx (struct md5_ctx *ctx); - -/* Starting with the result of former calls of this function (or the - initialization function update the context for the next LEN bytes - starting at BUFFER. - It is necessary that LEN is a multiple of 64!!! */ -extern void md5_process_block (const void *buffer, size_t len, - struct md5_ctx *ctx); - -/* Starting with the result of former calls of this function (or the - initialization function update the context for the next LEN bytes - starting at BUFFER. - It is NOT required that LEN is a multiple of 64. */ -extern void md5_process_bytes (const void *buffer, size_t len, - struct md5_ctx *ctx); - -/* Process the remaining bytes in the buffer and put result from CTX - in first 16 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. - - IMPORTANT: On some systems it is required that RESBUF is correctly - aligned for a 32 bits value. */ -extern void *md5_finish_ctx (struct md5_ctx *ctx, void *resbuf); - - -/* Put result from CTX in first 16 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. - - IMPORTANT: On some systems it is required that RESBUF is correctly - aligned for a 32 bits value. */ -extern void *md5_read_ctx (const struct md5_ctx *ctx, void *resbuf); - - -/* Compute MD5 message digest for bytes read from STREAM. The - resulting message digest number will be written into the 16 bytes - beginning at RESBLOCK. */ -extern int md5_stream (FILE *stream, void *resblock); - -/* Compute MD5 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 - digest. */ -extern void *md5_buffer (const char *buffer, size_t len, void *resblock); - -#endif /* md5.h */ diff --git a/lib/sha1.c b/lib/sha1.c deleted file mode 100644 index 6a9b61f..0000000 --- a/lib/sha1.c +++ /dev/null @@ -1,380 +0,0 @@ -/* Functions to compute SHA1 message digest of files or memory blocks. - according to the definition of SHA1 in FIPS 180-1 from April 1997. - Copyright (C) 2008-2011, 2015 Red Hat, Inc. - This file is part of elfutils. - Written by Ulrich Drepper , 2008. - - This file is free software; you can redistribute it and/or modify - it under the terms of either - - * the GNU Lesser General Public License as published by the Free - Software Foundation; either version 3 of the License, or (at - your option) any later version - - or - - * the GNU General Public License as published by the Free - Software Foundation; either version 2 of the License, or (at - your option) any later version - - or both in parallel, as here. - - elfutils 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 - General Public License for more details. - - You should have received copies of the GNU General Public License and - the GNU Lesser General Public License along with this program. If - not, see . */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include -#include -#include - -#include "sha1.h" -#include "system.h" - -#define SWAP(n) BE32 (n) - -/* 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, ... */ }; - - -/* Initialize structure containing state of computation. */ -void -sha1_init_ctx (struct sha1_ctx *ctx) -{ - ctx->A = 0x67452301; - ctx->B = 0xefcdab89; - ctx->C = 0x98badcfe; - ctx->D = 0x10325476; - ctx->E = 0xc3d2e1f0; - - ctx->total[0] = ctx->total[1] = 0; - ctx->buflen = 0; -} - -/* Put result from CTX in first 20 bytes following RESBUF. The result - must be in little endian byte order. - - IMPORTANT: On some systems it is required that RESBUF is correctly - aligned for a 32 bits value. */ -void * -sha1_read_ctx (const struct sha1_ctx *ctx, void *resbuf) -{ - ((sha1_uint32 *) resbuf)[0] = SWAP (ctx->A); - ((sha1_uint32 *) resbuf)[1] = SWAP (ctx->B); - ((sha1_uint32 *) resbuf)[2] = SWAP (ctx->C); - ((sha1_uint32 *) resbuf)[3] = SWAP (ctx->D); - ((sha1_uint32 *) resbuf)[4] = SWAP (ctx->E); - - return resbuf; -} - -static void -be64_copy (char *dest, uint64_t x) -{ - for (size_t i = 8; i-- > 0; x >>= 8) - dest[i] = (uint8_t) x; -} - -/* Process the remaining bytes in the internal buffer and the usual - 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 bits value. */ -void * -sha1_finish_ctx (struct sha1_ctx *ctx, void *resbuf) -{ - /* Take yet unprocessed bytes into account. */ - sha1_uint32 bytes = ctx->buflen; - size_t pad; - - /* Now count remaining bytes. */ - ctx->total[0] += bytes; - if (ctx->total[0] < bytes) - ++ctx->total[1]; - - pad = bytes >= 56 ? 64 + 56 - bytes : 56 - bytes; - memcpy (&ctx->buffer[bytes], fillbuf, pad); - - /* Put the 64-bit file length in *bits* at the end of the buffer. */ - const uint64_t bit_length = ((ctx->total[0] << 3) - + ((uint64_t) ((ctx->total[1] << 3) | - (ctx->total[0] >> 29)) << 32)); - be64_copy (&ctx->buffer[bytes + pad], bit_length); - - /* Process last bytes. */ - sha1_process_block (ctx->buffer, bytes + pad + 8, ctx); - - return sha1_read_ctx (ctx, resbuf); -} - - -void -sha1_process_bytes (const void *buffer, size_t len, struct sha1_ctx *ctx) -{ - /* When we already have some bits in our internal buffer concatenate - both inputs first. */ - if (ctx->buflen != 0) - { - size_t left_over = ctx->buflen; - size_t add = 128 - left_over > len ? len : 128 - left_over; - - memcpy (&ctx->buffer[left_over], buffer, add); - ctx->buflen += add; - - if (ctx->buflen > 64) - { - sha1_process_block (ctx->buffer, ctx->buflen & ~63, ctx); - - ctx->buflen &= 63; - /* The regions in the following copy operation cannot overlap. */ - memcpy (ctx->buffer, &ctx->buffer[(left_over + add) & ~63], - ctx->buflen); - } - - buffer = (const char *) buffer + add; - len -= add; - } - - /* Process available complete blocks. */ - if (len >= 64) - { -#if !_STRING_ARCH_unaligned -/* To check alignment gcc has an appropriate operator. Other - compilers don't. */ -# if __GNUC__ >= 2 -# define UNALIGNED_P(p) (((sha1_uintptr) p) % __alignof__ (sha1_uint32) != 0) -# else -# define UNALIGNED_P(p) (((sha1_uintptr) p) % sizeof (sha1_uint32) != 0) -# endif - if (UNALIGNED_P (buffer)) - while (len > 64) - { - sha1_process_block (memcpy (ctx->buffer, buffer, 64), 64, ctx); - buffer = (const char *) buffer + 64; - len -= 64; - } - else -#endif - { - sha1_process_block (buffer, len & ~63, ctx); - buffer = (const char *) buffer + (len & ~63); - len &= 63; - } - } - - /* Move remaining bytes in internal buffer. */ - if (len > 0) - { - size_t left_over = ctx->buflen; - - memcpy (&ctx->buffer[left_over], buffer, len); - left_over += len; - if (left_over >= 64) - { - sha1_process_block (ctx->buffer, 64, ctx); - left_over -= 64; - memcpy (ctx->buffer, &ctx->buffer[64], left_over); - } - ctx->buflen = left_over; - } -} - - -/* These are the four functions used in the four steps of the SHA1 algorithm - and defined in the FIPS 180-1. */ -/* #define FF(b, c, d) ((b & c) | (~b & d)) */ -#define FF(b, c, d) (d ^ (b & (c ^ d))) -#define FG(b, c, d) (b ^ c ^ d) -/* define FH(b, c, d) ((b & c) | (b & d) | (c & d)) */ -#define FH(b, c, d) (((b | c) & d) | (b & c)) - -/* It is unfortunate that C does not provide an operator for cyclic - rotation. Hope the C compiler is smart enough. */ -#define CYCLIC(w, s) (((w) << s) | ((w) >> (32 - s))) - -/* Magic constants. */ -#define K0 0x5a827999 -#define K1 0x6ed9eba1 -#define K2 0x8f1bbcdc -#define K3 0xca62c1d6 - - -/* Process LEN bytes of BUFFER, accumulating context into CTX. - It is assumed that LEN % 64 == 0. */ - -void -sha1_process_block (const void *buffer, size_t len, struct sha1_ctx *ctx) -{ - sha1_uint32 computed_words[16]; -#define W(i) computed_words[(i) % 16] - const sha1_uint32 *words = buffer; - size_t nwords = len / sizeof (sha1_uint32); - const sha1_uint32 *endp = words + nwords; - sha1_uint32 A = ctx->A; - sha1_uint32 B = ctx->B; - sha1_uint32 C = ctx->C; - sha1_uint32 D = ctx->D; - sha1_uint32 E = ctx->E; - - /* First increment the byte count. FIPS 180-1 specifies the possible - length of the file up to 2^64 bits. Here we only compute the - number of bytes. Do a double word increment. */ - ctx->total[0] += len; - if (ctx->total[0] < len) - ++ctx->total[1]; - - /* Process all bytes in the buffer with 64 bytes in each round of - the loop. */ - while (words < endp) - { - sha1_uint32 A_save = A; - sha1_uint32 B_save = B; - sha1_uint32 C_save = C; - sha1_uint32 D_save = D; - sha1_uint32 E_save = E; - - /* First round: using the given function, the context and a constant - the next context is computed. Because the algorithms processing - unit is a 32-bit word and it is determined to work on words in - little endian byte order we perhaps have to change the byte order - before the computation. */ - -#define OP(i, a, b, c, d, e) \ - do \ - { \ - W (i) = SWAP (*words); \ - e = CYCLIC (a, 5) + FF (b, c, d) + e + W (i) + K0; \ - ++words; \ - b = CYCLIC (b, 30); \ - } \ - while (0) - - /* Steps 0 to 15. */ - OP (0, A, B, C, D, E); - OP (1, E, A, B, C, D); - OP (2, D, E, A, B, C); - OP (3, C, D, E, A, B); - OP (4, B, C, D, E, A); - OP (5, A, B, C, D, E); - OP (6, E, A, B, C, D); - OP (7, D, E, A, B, C); - OP (8, C, D, E, A, B); - OP (9, B, C, D, E, A); - OP (10, A, B, C, D, E); - OP (11, E, A, B, C, D); - OP (12, D, E, A, B, C); - OP (13, C, D, E, A, B); - OP (14, B, C, D, E, A); - OP (15, A, B, C, D, E); - - /* For the remaining 64 steps we have a more complicated - computation of the input data-derived values. Redefine the - macro to take an additional second argument specifying the - function to use and a new last parameter for the magic - constant. */ -#undef OP -#define OP(i, f, a, b, c, d, e, K) \ - do \ - { \ - W (i) = CYCLIC (W (i - 3) ^ W (i - 8) ^ W (i - 14) ^ W (i - 16), 1);\ - e = CYCLIC (a, 5) + f (b, c, d) + e + W (i) + K; \ - b = CYCLIC (b, 30); \ - } \ - while (0) - - /* Steps 16 to 19. */ - OP (16, FF, E, A, B, C, D, K0); - OP (17, FF, D, E, A, B, C, K0); - OP (18, FF, C, D, E, A, B, K0); - OP (19, FF, B, C, D, E, A, K0); - - /* Steps 20 to 39. */ - OP (20, FG, A, B, C, D, E, K1); - OP (21, FG, E, A, B, C, D, K1); - OP (22, FG, D, E, A, B, C, K1); - OP (23, FG, C, D, E, A, B, K1); - OP (24, FG, B, C, D, E, A, K1); - OP (25, FG, A, B, C, D, E, K1); - OP (26, FG, E, A, B, C, D, K1); - OP (27, FG, D, E, A, B, C, K1); - OP (28, FG, C, D, E, A, B, K1); - OP (29, FG, B, C, D, E, A, K1); - OP (30, FG, A, B, C, D, E, K1); - OP (31, FG, E, A, B, C, D, K1); - OP (32, FG, D, E, A, B, C, K1); - OP (33, FG, C, D, E, A, B, K1); - OP (34, FG, B, C, D, E, A, K1); - OP (35, FG, A, B, C, D, E, K1); - OP (36, FG, E, A, B, C, D, K1); - OP (37, FG, D, E, A, B, C, K1); - OP (38, FG, C, D, E, A, B, K1); - OP (39, FG, B, C, D, E, A, K1); - - /* Steps 40 to 59. */ - OP (40, FH, A, B, C, D, E, K2); - OP (41, FH, E, A, B, C, D, K2); - OP (42, FH, D, E, A, B, C, K2); - OP (43, FH, C, D, E, A, B, K2); - OP (44, FH, B, C, D, E, A, K2); - OP (45, FH, A, B, C, D, E, K2); - OP (46, FH, E, A, B, C, D, K2); - OP (47, FH, D, E, A, B, C, K2); - OP (48, FH, C, D, E, A, B, K2); - OP (49, FH, B, C, D, E, A, K2); - OP (50, FH, A, B, C, D, E, K2); - OP (51, FH, E, A, B, C, D, K2); - OP (52, FH, D, E, A, B, C, K2); - OP (53, FH, C, D, E, A, B, K2); - OP (54, FH, B, C, D, E, A, K2); - OP (55, FH, A, B, C, D, E, K2); - OP (56, FH, E, A, B, C, D, K2); - OP (57, FH, D, E, A, B, C, K2); - OP (58, FH, C, D, E, A, B, K2); - OP (59, FH, B, C, D, E, A, K2); - - /* Steps 60 to 79. */ - OP (60, FG, A, B, C, D, E, K3); - OP (61, FG, E, A, B, C, D, K3); - OP (62, FG, D, E, A, B, C, K3); - OP (63, FG, C, D, E, A, B, K3); - OP (64, FG, B, C, D, E, A, K3); - OP (65, FG, A, B, C, D, E, K3); - OP (66, FG, E, A, B, C, D, K3); - OP (67, FG, D, E, A, B, C, K3); - OP (68, FG, C, D, E, A, B, K3); - OP (69, FG, B, C, D, E, A, K3); - OP (70, FG, A, B, C, D, E, K3); - OP (71, FG, E, A, B, C, D, K3); - OP (72, FG, D, E, A, B, C, K3); - OP (73, FG, C, D, E, A, B, K3); - OP (74, FG, B, C, D, E, A, K3); - OP (75, FG, A, B, C, D, E, K3); - OP (76, FG, E, A, B, C, D, K3); - OP (77, FG, D, E, A, B, C, K3); - OP (78, FG, C, D, E, A, B, K3); - OP (79, FG, B, C, D, E, A, K3); - - /* Add the starting values of the context. */ - A += A_save; - B += B_save; - C += C_save; - D += D_save; - E += E_save; - } - - /* Put checksum in context given as argument. */ - ctx->A = A; - ctx->B = B; - ctx->C = C; - ctx->D = D; - ctx->E = E; -} diff --git a/lib/sha1.h b/lib/sha1.h deleted file mode 100644 index 05301c8..0000000 --- a/lib/sha1.h +++ /dev/null @@ -1,93 +0,0 @@ -/* Declaration of functions and data types used for SHA1 sum computing - library functions. - Copyright (C) 2008 Red Hat, Inc. - This file is part of elfutils. - Written by Ulrich Drepper , 2008. - - This file is free software; you can redistribute it and/or modify - it under the terms of either - - * the GNU Lesser General Public License as published by the Free - Software Foundation; either version 3 of the License, or (at - your option) any later version - - or - - * the GNU General Public License as published by the Free - Software Foundation; either version 2 of the License, or (at - your option) any later version - - or both in parallel, as here. - - elfutils 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 - General Public License for more details. - - You should have received copies of the GNU General Public License and - the GNU Lesser General Public License along with this program. If - not, see . */ - -#ifndef _SHA1_H -#define _SHA1_H 1 - -#include -#include -#include - -#define SHA1_DIGEST_SIZE 20 -#define SHA1_BLOCK_SIZE 64 - -typedef uint32_t sha1_uint32; -typedef uintptr_t sha1_uintptr; - -/* Structure to save state of computation between the single steps. */ -struct sha1_ctx -{ - sha1_uint32 A; - sha1_uint32 B; - sha1_uint32 C; - sha1_uint32 D; - sha1_uint32 E; - - sha1_uint32 total[2]; - sha1_uint32 buflen; - char buffer[128] __attribute__ ((__aligned__ (__alignof__ (sha1_uint32)))); -}; - -/* Initialize structure containing state of computation. */ -extern void sha1_init_ctx (struct sha1_ctx *ctx); - -/* Starting with the result of former calls of this function (or the - initialization function update the context for the next LEN bytes - starting at BUFFER. - It is necessary that LEN is a multiple of 64!!! */ -extern void sha1_process_block (const void *buffer, size_t len, - struct sha1_ctx *ctx); - -/* Starting with the result of former calls of this function (or the - initialization function update the context for the next LEN bytes - starting at BUFFER. - It is NOT required that LEN is a multiple of 64. */ -extern void sha1_process_bytes (const void *buffer, size_t len, - struct sha1_ctx *ctx); - -/* Process the remaining bytes in the buffer and put result from CTX - in first 20 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. - - IMPORTANT: On some systems it is required that RESBUF is correctly - aligned for a 32 bits value. */ -extern void *sha1_finish_ctx (struct sha1_ctx *ctx, void *resbuf); - - -/* Put result from CTX in first 20 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. - - IMPORTANT: On some systems it is required that RESBUF is correctly - aligned for a 32 bits value. */ -extern void *sha1_read_ctx (const struct sha1_ctx *ctx, void *resbuf); - -#endif /* sha1.h */ diff --git a/tests/ChangeLog b/tests/ChangeLog index 35688dc..beac0e2 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,3 +1,10 @@ +2017-10-16 Mark Wielaard + + * md5-sha1-test.c: Removed. + * Makefile.am (check_PROGRAMS): Remove md5-sha1-test. + (TESTS): Likewise. + (md5_sha1_test_LDADD): Removed. + 2017-10-04 Mark Wielaard * msg_tst.c: Handle ELF_E_INVALID_ELF. diff --git a/tests/Makefile.am b/tests/Makefile.am index e583504..ec42b80 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -46,7 +46,7 @@ check_PROGRAMS = arextract arsymtest newfile saridx scnnames sectiondump \ dwfl-addr-sect dwfl-bug-report early-offscn \ dwfl-bug-getmodules dwarf-getmacros dwarf-ranges addrcfi \ test-flag-nobits dwarf-getstring rerequest_tag \ - alldts md5-sha1-test typeiter typeiter2 low_high_pc \ + alldts typeiter typeiter2 low_high_pc \ test-elf_cntl_gelf_getshdr dwflsyms dwfllines \ dwfl-report-elf-align varlocs backtrace backtrace-child \ backtrace-data backtrace-dwarf debuglink debugaltlink \ @@ -146,8 +146,8 @@ export ELFUTILS_DISABLE_DEMANGLE = 1 endif if !STANDALONE -check_PROGRAMS += msg_tst md5-sha1-test system-elf-libelf-test -TESTS += msg_tst md5-sha1-test system-elf-libelf-test +check_PROGRAMS += msg_tst system-elf-libelf-test +TESTS += msg_tst system-elf-libelf-test endif if LZMA @@ -463,7 +463,6 @@ addrcfi_LDADD = $(libdw) $(libebl) $(libelf) $(argp_LDADD) -ldl test_flag_nobits_LDADD = $(libelf) rerequest_tag_LDADD = $(libdw) alldts_LDADD = $(libdw) $(libelf) -md5_sha1_test_LDADD = $(libeu) typeiter_LDADD = $(libdw) $(libelf) typeiter2_LDADD = $(libdw) $(libelf) low_high_pc_LDADD = $(libdw) $(libelf) $(argp_LDADD) diff --git a/tests/md5-sha1-test.c b/tests/md5-sha1-test.c deleted file mode 100644 index d50355e..0000000 --- a/tests/md5-sha1-test.c +++ /dev/null @@ -1,93 +0,0 @@ -/* Copyright (C) 2011 Red Hat, Inc. - This file is part of elfutils. - - This file 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. - - elfutils 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 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 . */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include -#include - -#include "md5.h" -#include "sha1.h" - -static const struct expected -{ - const char *sample; - const char *md5_expected; - const char *sha1_expected; -} tests[] = - { - { - "abc", - "\x90\x01\x50\x98\x3c\xd2\x4f\xb0\xd6\x96\x3f\x7d\x28\xe1\x7f\x72", - "\xa9\x99\x3e\x36\x47\x06\x81\x6a\xba\x3e" - "\x25\x71\x78\x50\xc2\x6c\x9c\xd0\xd8\x9d" - }, - { - "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", - "\x82\x15\xef\x07\x96\xa2\x0b\xca\xaa\xe1\x16\xd3\x87\x6c\x66\x4a", - "\x84\x98\x3e\x44\x1c\x3b\xd2\x6e\xba\xae" - "\x4a\xa1\xf9\x51\x29\xe5\xe5\x46\x70\xf1" - }, - { - "\0a", - "\x77\x07\xd6\xae\x4e\x02\x7c\x70\xee\xa2\xa9\x35\xc2\x29\x6f\x21", - "\x34\xaa\x97\x3c\xd4\xc4\xda\xa4\xf6\x1e" - "\xeb\x2b\xdb\xad\x27\x31\x65\x34\x01\x6f", - }, - { - "When in the Course of human events it becomes necessary", - "\x62\x6b\x5e\x22\xcd\x3d\x02\xea\x07\xde\xd4\x50\x62\x3d\xb9\x96", - "\x66\xc3\xc6\x8d\x62\x91\xc5\x1e\x63\x0c" - "\x85\xc8\x6c\xc4\x4b\x3a\x79\x3e\x07\x28", - }, - }; -#define NTESTS (sizeof tests / sizeof tests[0]) - -#define md5_size 16 -#define sha1_size 20 - -#define TEST_HASH(ALGO, I) \ - { \ - struct ALGO##_ctx ctx; \ - uint32_t result_buffer[(ALGO##_size + 3) / 4]; \ - ALGO##_init_ctx (&ctx); \ - if (tests[I].sample[0] == '\0') \ - { \ - char input_buffer[1000]; \ - memset (input_buffer, tests[I].sample[1], sizeof input_buffer); \ - for (int rept = 0; rept < 1000; ++rept) \ - ALGO##_process_bytes (input_buffer, sizeof input_buffer, &ctx); \ - } \ - else \ - ALGO##_process_bytes (tests[I].sample, strlen (tests[I].sample), &ctx); \ - char *result = ALGO##_finish_ctx (&ctx, result_buffer); \ - if (result != (void *) result_buffer \ - || memcmp (result, tests[I].ALGO##_expected, ALGO##_size) != 0) \ - error (0, 0, #ALGO " test %zu failed", 1 + I); \ - } - -int -main (void) -{ - for (size_t i = 0; i < NTESTS; ++i) - { - TEST_HASH (md5, i); - TEST_HASH (sha1, i); - } - return error_message_count; -} -- 1.8.3.1