libextractor

GNU libextractor
Log | Files | Refs | Submodules | README | LICENSE

commit 7e93648c27b64f01990b7f4ff10ce48d2b397c39
parent 2579fff926e019060d22f2adeb78b3bc7fe50f51
Author: Christian Grothoff <christian@grothoff.org>
Date:   Wed, 13 Jan 2010 14:42:13 +0000

bye bye hash

Diffstat:
Dsrc/plugins/hash/Makefile.am | 23-----------------------
Dsrc/plugins/hash/README | 2--
Dsrc/plugins/hash/md5extractor.c | 455-------------------------------------------------------------------------------
Dsrc/plugins/hash/rmd160extractor.c | 625-------------------------------------------------------------------------------
Dsrc/plugins/hash/sha1extractor.c | 475-------------------------------------------------------------------------------
5 files changed, 0 insertions(+), 1580 deletions(-)

diff --git a/src/plugins/hash/Makefile.am b/src/plugins/hash/Makefile.am @@ -1,23 +0,0 @@ -include ../Makefile-plugins.am - -SUBDIRS = . - -plugin_LTLIBRARIES = \ - libextractor_hash_md5.la \ - libextractor_hash_sha1.la \ - libextractor_hash_rmd160.la - -libextractor_hash_md5_la_SOURCES = \ - md5extractor.c -libextractor_hash_md5_la_LDFLAGS = \ - $(PLUGINFLAGS) $(retaincommand) - -libextractor_hash_sha1_la_SOURCES = \ - sha1extractor.c -libextractor_hash_sha1_la_LDFLAGS = \ - $(PLUGINFLAGS) $(retaincommand) - -libextractor_hash_rmd160_la_SOURCES = \ - rmd160extractor.c -libextractor_hash_rmd160_la_LDFLAGS = \ - $(PLUGINFLAGS) $(retaincommand) diff --git a/src/plugins/hash/README b/src/plugins/hash/README @@ -1,2 +0,0 @@ -This code is based on code from md5sum (GNU coreutils / textutils) and -http://rmd160.slashusr.org/ (both GPL). diff --git a/src/plugins/hash/md5extractor.c b/src/plugins/hash/md5extractor.c @@ -1,455 +0,0 @@ -/* - This file is part of libextractor. - (C) 2004, 2005 Vidyut Samanta and Christian Grothoff - - Copyright (C) 1995, 1996, 1999, 2000, 2003 Free Software Foundation, Inc. - NOTE: The canonical source of the MD5 code from this file is maintained - with the GNU C Library. Bugs can be reported to bug-glibc@prep.ai.mit.edu. - - libextractor 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. - - libextractor 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 libextractor; see the file COPYING. If not, write to the - Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include "platform.h" -#include "extractor.h" -#include <stdio.h> -#include <limits.h> - -#ifdef _LIBC -#include <stdint.h> -typedef uint32_t md5_uint32; -typedef uintptr_t md5_uintptr; -#else -# define UINT_MAX_32_BITS 4294967295U - -# if UINT_MAX == UINT_MAX_32_BITS -typedef unsigned int md5_uint32; -# else -# if USHRT_MAX == UINT_MAX_32_BITS -typedef unsigned short md5_uint32; -# else -# if ULONG_MAX == UINT_MAX_32_BITS -typedef unsigned long md5_uint32; -# else - /* The following line is intended to evoke an error. - Using #error is not portable enough. */ -"Cannot determine unsigned 32-bit data type." -# endif -# endif -# endif -/* We have to make a guess about the integer type equivalent in size - to pointers which should always be correct. */ -typedef unsigned long int md5_uintptr; -#endif - -/* 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]; -}; - -#define rol(x,n) ( ((x) << (n)) | ((x) >> (32-(n))) ) - -#if __BYTE_ORDER == __BIG_ENDIAN -#define WORDS_BIGENDIAN 1 -#endif - -#ifdef WORDS_BIGENDIAN -# define SWAP(n) \ - (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24)) -#else -# define SWAP(n) (n) -#endif - -#define BLOCKSIZE 4096 -/* Ensure that BLOCKSIZE is a multiple of 64. */ -#if BLOCKSIZE % 64 != 0 -#error "invalid BLOCKSIZE" -#endif - -/* 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, ... */ }; - - - - -/* 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. */ - -static 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; \ - a = rol (a, s); \ - a += b; \ - } \ - while (0) - - /* 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, or - perl -e 'foreach(1..64){printf "0x%08x\n", int (4294967296 * abs (sin $_))}' - */ - - /* 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; \ - a = rol (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; -} - - -static 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; - } -} - - -/* Initialize structure containing state of computation. - (RFC 1321, 3.3: Step 3) */ -static 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. */ -static 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; -} - -/* 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. */ -static 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. */ - *(md5_uint32 *) & ctx->buffer[bytes + pad] = SWAP (ctx->total[0] << 3); - *(md5_uint32 *) & ctx->buffer[bytes + pad + 4] = - SWAP ((ctx->total[1] << 3) | (ctx->total[0] >> 29)); - - /* Process last bytes. */ - md5_process_block (ctx->buffer, bytes + pad + 8, ctx); - - return md5_read_ctx (ctx, resbuf); -} - -/* 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. */ -static 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); -} - - - - -static struct EXTRACTOR_Keywords * -addKeyword (EXTRACTOR_KeywordList * oldhead, - const char *phrase, EXTRACTOR_KeywordType type) -{ - - EXTRACTOR_KeywordList *keyword; - keyword = (EXTRACTOR_KeywordList *) malloc (sizeof (EXTRACTOR_KeywordList)); - keyword->next = oldhead; - keyword->keyword = strdup (phrase); - keyword->keywordType = type; - return keyword; -} - - - -#define DIGEST_BITS 128 -#define DIGEST_HEX_BYTES (DIGEST_BITS / 4) -#define DIGEST_BIN_BYTES (DIGEST_BITS / 8) -#define MAX_DIGEST_BIN_BYTES DIGEST_BIN_BYTES - -struct EXTRACTOR_Keywords * -libextractor_hash_md5_extract (const char *filename, - const char *data, - size_t size, struct EXTRACTOR_Keywords *prev) -{ - unsigned char bin_buffer[MAX_DIGEST_BIN_BYTES]; - char hash[8 * MAX_DIGEST_BIN_BYTES]; - char buf[16]; - int i; - - md5_buffer (data, size, bin_buffer); - hash[0] = '\0'; - for (i = 0; i < DIGEST_HEX_BYTES / 2; i++) - { - snprintf (buf, 16, "%02x", bin_buffer[i]); - strcat (hash, buf); - } - prev = addKeyword (prev, hash, EXTRACTOR_HASH_MD5); - - return prev; -} diff --git a/src/plugins/hash/rmd160extractor.c b/src/plugins/hash/rmd160extractor.c @@ -1,625 +0,0 @@ -/* - This file is part of libextractor. - (C) 2004 Vidyut Samanta and Christian Grothoff - Copyright © 1999 - Philip Howard - - libextractor 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. - - libextractor 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 libextractor; see the file COPYING. If not, write to the - Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. - - RMD code: - package rmd160 - version 1.2.1 - homepage http://phil.ipal.org/freeware/rmd160/ - - author Philip Howard - email phil@ipal.org - homepage http://phil.ipal.org/ - - */ - -#include "platform.h" -#include "extractor.h" - -#if ULONG_MAX>4294967295U -#if UINT_MAX>4294967295U -#if USHRT_MAX>4294967295U -#if UCHAR_MAX>=4294967295U -typedef unsigned char rmd160uint32; -#else -typedef unsigned short rmd160uint32; -#endif /*UCHAR_MAX */ -#else -typedef unsigned int rmd160uint32; -#endif /*USHRT_MAX */ -#else -typedef unsigned long rmd160uint32; -#endif /*UINT_MAX */ -#else -typedef unsigned long rmd160uint32; -#endif - -struct rmd160_object -{ - rmd160uint32 data[16]; - rmd160uint32 state[5]; - rmd160uint32 len[2]; - rmd160uint32 *wptr; - rmd160uint32 *wend; - unsigned int bpos; -}; -typedef struct rmd160_object *RMD160; - -#define RMD160_OK 0 -#define RMD160_ERR_INVALID_ARG 1 -#define RMD160_ERR_READ 2 - - -#define RMD160_BUFSIZ 1024 - -#define RMD160_INIT0 0x67452301UL -#define RMD160_INIT1 0xefcdab89UL -#define RMD160_INIT2 0x98badcfeUL -#define RMD160_INIT3 0x10325476UL -#define RMD160_INIT4 0xc3d2e1f0UL - -static int -_rmd160_calc (rmd160uint32 * state, rmd160uint32 * data) -{ - rmd160uint32 x0, x1, x2, x3, x4; - rmd160uint32 y0, y1, y2, y3, y4; - - x0 = y0 = state[0]; - x1 = y1 = state[1]; - x2 = y2 = state[2]; - x3 = y3 = state[3]; - x4 = y4 = state[4]; - - -#define RL(x,n) (((x) << (n)) | ((x) >> (32-(n)))) - -#define F1(x,y,z) ((x) ^ (y) ^ (z)) -#define F2(x,y,z) (((x) & (y)) | (~(x) & (z))) -#define F3(x,y,z) (((x) | ~(y)) ^ (z)) -#define F4(x,y,z) (((x) & (z)) | ((y) & ~(z))) -#define F5(x,y,z) ((x) ^ ((y) | ~(z))) - -#define T1(a,b,c,d,e,x,s) { \ - (a) += F1((b),(c),(d)) + (x); \ - (a) = RL((a),(s)) + (e); \ - (c) = RL((c),10);} -#define T2(a,b,c,d,e,x,s) { \ - (a) += F2((b),(c),(d)) + (x) + 0x5a827999UL; \ - (a) = RL((a),(s)) + (e); \ - (c) = RL((c),10);} -#define T3(a,b,c,d,e,x,s) { \ - (a) += F3((b),(c),(d)) + (x) + 0x6ed9eba1UL; \ - (a) = RL((a),(s)) + (e); \ - (c) = RL((c),10);} -#define T4(a,b,c,d,e,x,s) { \ - (a) += F4((b),(c),(d)) + (x) + 0x8f1bbcdcUL; \ - (a) = RL((a),(s)) + (e); \ - (c) = RL((c),10);} -#define T5(a,b,c,d,e,x,s) { \ - (a) += F5((b),(c),(d)) + (x) + 0xa953fd4eUL; \ - (a) = RL((a),(s)) + (e); \ - (c) = RL((c),10);} - -#define S1(a,b,c,d,e,x,s) { \ - (a) += F1((b),(c),(d)) + (x); \ - (a) = RL((a),(s)) + (e); \ - (c) = RL((c),10);} -#define S2(a,b,c,d,e,x,s) { \ - (a) += F2((b),(c),(d)) + (x) + 0x7a6d76e9UL; \ - (a) = RL((a),(s)) + (e); \ - (c) = RL((c),10);} -#define S3(a,b,c,d,e,x,s) { \ - (a) += F3((b),(c),(d)) + (x) + 0x6d703ef3UL; \ - (a) = RL((a),(s)) + (e); \ - (c) = RL((c),10);} -#define S4(a,b,c,d,e,x,s) { \ - (a) += F4((b),(c),(d)) + (x) + 0x5c4dd124UL; \ - (a) = RL((a),(s)) + (e); \ - (c) = RL((c),10);} -#define S5(a,b,c,d,e,x,s) { \ - (a) += F5((b),(c),(d)) + (x) + 0x50a28be6UL; \ - (a) = RL((a),(s)) + (e); \ - (c) = RL((c),10);} - - T1 (x0, x1, x2, x3, x4, data[0], 11); - T1 (x4, x0, x1, x2, x3, data[1], 14); - T1 (x3, x4, x0, x1, x2, data[2], 15); - T1 (x2, x3, x4, x0, x1, data[3], 12); - T1 (x1, x2, x3, x4, x0, data[4], 5); - T1 (x0, x1, x2, x3, x4, data[5], 8); - T1 (x4, x0, x1, x2, x3, data[6], 7); - T1 (x3, x4, x0, x1, x2, data[7], 9); - T1 (x2, x3, x4, x0, x1, data[8], 11); - T1 (x1, x2, x3, x4, x0, data[9], 13); - T1 (x0, x1, x2, x3, x4, data[10], 14); - T1 (x4, x0, x1, x2, x3, data[11], 15); - T1 (x3, x4, x0, x1, x2, data[12], 6); - T1 (x2, x3, x4, x0, x1, data[13], 7); - T1 (x1, x2, x3, x4, x0, data[14], 9); - T1 (x0, x1, x2, x3, x4, data[15], 8); - - T2 (x4, x0, x1, x2, x3, data[7], 7); - T2 (x3, x4, x0, x1, x2, data[4], 6); - T2 (x2, x3, x4, x0, x1, data[13], 8); - T2 (x1, x2, x3, x4, x0, data[1], 13); - T2 (x0, x1, x2, x3, x4, data[10], 11); - T2 (x4, x0, x1, x2, x3, data[6], 9); - T2 (x3, x4, x0, x1, x2, data[15], 7); - T2 (x2, x3, x4, x0, x1, data[3], 15); - T2 (x1, x2, x3, x4, x0, data[12], 7); - T2 (x0, x1, x2, x3, x4, data[0], 12); - T2 (x4, x0, x1, x2, x3, data[9], 15); - T2 (x3, x4, x0, x1, x2, data[5], 9); - T2 (x2, x3, x4, x0, x1, data[2], 11); - T2 (x1, x2, x3, x4, x0, data[14], 7); - T2 (x0, x1, x2, x3, x4, data[11], 13); - T2 (x4, x0, x1, x2, x3, data[8], 12); - - T3 (x3, x4, x0, x1, x2, data[3], 11); - T3 (x2, x3, x4, x0, x1, data[10], 13); - T3 (x1, x2, x3, x4, x0, data[14], 6); - T3 (x0, x1, x2, x3, x4, data[4], 7); - T3 (x4, x0, x1, x2, x3, data[9], 14); - T3 (x3, x4, x0, x1, x2, data[15], 9); - T3 (x2, x3, x4, x0, x1, data[8], 13); - T3 (x1, x2, x3, x4, x0, data[1], 15); - T3 (x0, x1, x2, x3, x4, data[2], 14); - T3 (x4, x0, x1, x2, x3, data[7], 8); - T3 (x3, x4, x0, x1, x2, data[0], 13); - T3 (x2, x3, x4, x0, x1, data[6], 6); - T3 (x1, x2, x3, x4, x0, data[13], 5); - T3 (x0, x1, x2, x3, x4, data[11], 12); - T3 (x4, x0, x1, x2, x3, data[5], 7); - T3 (x3, x4, x0, x1, x2, data[12], 5); - - T4 (x2, x3, x4, x0, x1, data[1], 11); - T4 (x1, x2, x3, x4, x0, data[9], 12); - T4 (x0, x1, x2, x3, x4, data[11], 14); - T4 (x4, x0, x1, x2, x3, data[10], 15); - T4 (x3, x4, x0, x1, x2, data[0], 14); - T4 (x2, x3, x4, x0, x1, data[8], 15); - T4 (x1, x2, x3, x4, x0, data[12], 9); - T4 (x0, x1, x2, x3, x4, data[4], 8); - T4 (x4, x0, x1, x2, x3, data[13], 9); - T4 (x3, x4, x0, x1, x2, data[3], 14); - T4 (x2, x3, x4, x0, x1, data[7], 5); - T4 (x1, x2, x3, x4, x0, data[15], 6); - T4 (x0, x1, x2, x3, x4, data[14], 8); - T4 (x4, x0, x1, x2, x3, data[5], 6); - T4 (x3, x4, x0, x1, x2, data[6], 5); - T4 (x2, x3, x4, x0, x1, data[2], 12); - - T5 (x1, x2, x3, x4, x0, data[4], 9); - T5 (x0, x1, x2, x3, x4, data[0], 15); - T5 (x4, x0, x1, x2, x3, data[5], 5); - T5 (x3, x4, x0, x1, x2, data[9], 11); - T5 (x2, x3, x4, x0, x1, data[7], 6); - T5 (x1, x2, x3, x4, x0, data[12], 8); - T5 (x0, x1, x2, x3, x4, data[2], 13); - T5 (x4, x0, x1, x2, x3, data[10], 12); - T5 (x3, x4, x0, x1, x2, data[14], 5); - T5 (x2, x3, x4, x0, x1, data[1], 12); - T5 (x1, x2, x3, x4, x0, data[3], 13); - T5 (x0, x1, x2, x3, x4, data[8], 14); - T5 (x4, x0, x1, x2, x3, data[11], 11); - T5 (x3, x4, x0, x1, x2, data[6], 8); - T5 (x2, x3, x4, x0, x1, data[15], 5); - T5 (x1, x2, x3, x4, x0, data[13], 6); - - S5 (y0, y1, y2, y3, y4, data[5], 8); - S5 (y4, y0, y1, y2, y3, data[14], 9); - S5 (y3, y4, y0, y1, y2, data[7], 9); - S5 (y2, y3, y4, y0, y1, data[0], 11); - S5 (y1, y2, y3, y4, y0, data[9], 13); - S5 (y0, y1, y2, y3, y4, data[2], 15); - S5 (y4, y0, y1, y2, y3, data[11], 15); - S5 (y3, y4, y0, y1, y2, data[4], 5); - S5 (y2, y3, y4, y0, y1, data[13], 7); - S5 (y1, y2, y3, y4, y0, data[6], 7); - S5 (y0, y1, y2, y3, y4, data[15], 8); - S5 (y4, y0, y1, y2, y3, data[8], 11); - S5 (y3, y4, y0, y1, y2, data[1], 14); - S5 (y2, y3, y4, y0, y1, data[10], 14); - S5 (y1, y2, y3, y4, y0, data[3], 12); - S5 (y0, y1, y2, y3, y4, data[12], 6); - - S4 (y4, y0, y1, y2, y3, data[6], 9); - S4 (y3, y4, y0, y1, y2, data[11], 13); - S4 (y2, y3, y4, y0, y1, data[3], 15); - S4 (y1, y2, y3, y4, y0, data[7], 7); - S4 (y0, y1, y2, y3, y4, data[0], 12); - S4 (y4, y0, y1, y2, y3, data[13], 8); - S4 (y3, y4, y0, y1, y2, data[5], 9); - S4 (y2, y3, y4, y0, y1, data[10], 11); - S4 (y1, y2, y3, y4, y0, data[14], 7); - S4 (y0, y1, y2, y3, y4, data[15], 7); - S4 (y4, y0, y1, y2, y3, data[8], 12); - S4 (y3, y4, y0, y1, y2, data[12], 7); - S4 (y2, y3, y4, y0, y1, data[4], 6); - S4 (y1, y2, y3, y4, y0, data[9], 15); - S4 (y0, y1, y2, y3, y4, data[1], 13); - S4 (y4, y0, y1, y2, y3, data[2], 11); - - S3 (y3, y4, y0, y1, y2, data[15], 9); - S3 (y2, y3, y4, y0, y1, data[5], 7); - S3 (y1, y2, y3, y4, y0, data[1], 15); - S3 (y0, y1, y2, y3, y4, data[3], 11); - S3 (y4, y0, y1, y2, y3, data[7], 8); - S3 (y3, y4, y0, y1, y2, data[14], 6); - S3 (y2, y3, y4, y0, y1, data[6], 6); - S3 (y1, y2, y3, y4, y0, data[9], 14); - S3 (y0, y1, y2, y3, y4, data[11], 12); - S3 (y4, y0, y1, y2, y3, data[8], 13); - S3 (y3, y4, y0, y1, y2, data[12], 5); - S3 (y2, y3, y4, y0, y1, data[2], 14); - S3 (y1, y2, y3, y4, y0, data[10], 13); - S3 (y0, y1, y2, y3, y4, data[0], 13); - S3 (y4, y0, y1, y2, y3, data[4], 7); - S3 (y3, y4, y0, y1, y2, data[13], 5); - - S2 (y2, y3, y4, y0, y1, data[8], 15); - S2 (y1, y2, y3, y4, y0, data[6], 5); - S2 (y0, y1, y2, y3, y4, data[4], 8); - S2 (y4, y0, y1, y2, y3, data[1], 11); - S2 (y3, y4, y0, y1, y2, data[3], 14); - S2 (y2, y3, y4, y0, y1, data[11], 14); - S2 (y1, y2, y3, y4, y0, data[15], 6); - S2 (y0, y1, y2, y3, y4, data[0], 14); - S2 (y4, y0, y1, y2, y3, data[5], 6); - S2 (y3, y4, y0, y1, y2, data[12], 9); - S2 (y2, y3, y4, y0, y1, data[2], 12); - S2 (y1, y2, y3, y4, y0, data[13], 9); - S2 (y0, y1, y2, y3, y4, data[9], 12); - S2 (y4, y0, y1, y2, y3, data[7], 5); - S2 (y3, y4, y0, y1, y2, data[10], 15); - S2 (y2, y3, y4, y0, y1, data[14], 8); - - S1 (y1, y2, y3, y4, y0, data[12], 8); - S1 (y0, y1, y2, y3, y4, data[15], 5); - S1 (y4, y0, y1, y2, y3, data[10], 12); - S1 (y3, y4, y0, y1, y2, data[4], 9); - S1 (y2, y3, y4, y0, y1, data[1], 12); - S1 (y1, y2, y3, y4, y0, data[5], 5); - S1 (y0, y1, y2, y3, y4, data[8], 14); - S1 (y4, y0, y1, y2, y3, data[7], 6); - S1 (y3, y4, y0, y1, y2, data[6], 8); - S1 (y2, y3, y4, y0, y1, data[2], 13); - S1 (y1, y2, y3, y4, y0, data[13], 6); - S1 (y0, y1, y2, y3, y4, data[14], 5); - S1 (y4, y0, y1, y2, y3, data[0], 15); - S1 (y3, y4, y0, y1, y2, data[3], 13); - S1 (y2, y3, y4, y0, y1, data[9], 11); - S1 (y1, y2, y3, y4, y0, data[11], 11); - - y3 += x2 + state[1]; - state[1] = state[2] + x3 + y4; - state[2] = state[3] + x4 + y0; - state[3] = state[4] + x0 + y1; - state[4] = state[0] + x1 + y2; - state[0] = y3; - - return RMD160_OK; -} - - -static int -rmd160_append (RMD160 arg_obj, size_t arg_len, const unsigned char *arg_data) -{ - size_t alen; - - rmd160uint32 *wend; - rmd160uint32 *wptr; - - unsigned int bpos; - - - if (!arg_obj) - return RMD160_ERR_INVALID_ARG; - - if (arg_len == 0) - return RMD160_OK; - if (!arg_data) - return RMD160_ERR_INVALID_ARG; - - alen = arg_len; - wend = arg_obj->wend; - wptr = arg_obj->wptr; - bpos = arg_obj->bpos; - - if (bpos) - { - register rmd160uint32 w; - w = *wptr; - if (bpos == 1) - { - w |= ((rmd160uint32) (0xff & *(arg_data++))) << 8; - --alen; - ++bpos; - } - if (bpos == 2 && alen) - { - w |= ((rmd160uint32) (0xff & *(arg_data++))) << 16; - --alen; - ++bpos; - } - if (bpos == 3 && alen) - { - w |= ((rmd160uint32) (0xff & *(arg_data++))) << 24; - --alen; - ++bpos; - } - *wptr = w; - if (!alen) - { - arg_obj->wptr = wptr; - arg_obj->bpos = bpos; - if ((arg_obj->len[0] = arg_len + arg_obj->len[0]) < arg_len) - { - arg_obj->len[1]++; - } - return RMD160_OK; - } - bpos = 0; - ++wptr; - } - - for (;;) - { - while (alen >= 4 && wptr < wend) - { - -#if defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && __BYTE_ORDER == __LITTLE_ENDIAN - *wptr = *(const rmd160uint32 *) arg_data; -#else - *wptr = - ((rmd160uint32) (0xff & arg_data[0])) | - ((rmd160uint32) (0xff & arg_data[1])) << 8 | - ((rmd160uint32) (0xff & arg_data[2])) << 16 | - ((rmd160uint32) (0xff & arg_data[3])) << 24; -#endif - - ++wptr; - arg_data += 4; - alen -= 4; - } - if (wptr < wend) - break; - _rmd160_calc (arg_obj->state, arg_obj->data); - wptr = arg_obj->data; - } - - if (alen) - { - rmd160uint32 w; - w = ((rmd160uint32) (0xff & *(arg_data++))); - if (alen >= 2) - { - w |= ((rmd160uint32) (0xff & *(arg_data++))) << 8; - if (alen >= 3) - { - w |= ((rmd160uint32) (0xff & *(arg_data++))) << 16; - } - } - bpos = alen; - *wptr = w; - } - - arg_obj->wptr = wptr; - arg_obj->bpos = bpos; - if ((arg_obj->len[0] = arg_len + arg_obj->len[0]) < arg_len) - { - arg_obj->len[1]++; - } - return RMD160_OK; - -} - - -static int -rmd160_destroy (RMD160 ptr) -{ - if (!ptr) - { - return RMD160_ERR_INVALID_ARG; - } - free (ptr); - return RMD160_OK; -} - - - -static RMD160 -rmd160_copy (RMD160 target_p, RMD160 source_p) -{ - if (!target_p) - { - if (! - (target_p = - (struct rmd160_object *) malloc (sizeof (struct rmd160_object)))) - { - return NULL; - } - } - - if (source_p) - { - target_p->state[0] = source_p->state[0]; - target_p->state[1] = source_p->state[1]; - target_p->state[2] = source_p->state[2]; - target_p->state[3] = source_p->state[3]; - target_p->state[4] = source_p->state[4]; - { - int i; - for (i = 0; i < 16; ++i) - { - target_p->data[i] = source_p->data[i]; - } - } - target_p->len[0] = source_p->len[0]; - target_p->len[1] = source_p->len[1]; - target_p->bpos = source_p->bpos; - target_p->wptr = source_p->wptr - source_p->data + target_p->data; - target_p->wend = 16 + target_p->data; - } - else - { - target_p->state[0] = RMD160_INIT0; - target_p->state[1] = RMD160_INIT1; - target_p->state[2] = RMD160_INIT2; - target_p->state[3] = RMD160_INIT3; - target_p->state[4] = RMD160_INIT4; - { - int i; - for (i = 0; i < 16; ++i) - { - target_p->data[i] = 0U; - } - } - target_p->len[0] = 0U; - target_p->len[1] = 0U; - target_p->bpos = 0; - target_p->wptr = target_p->data; - target_p->wend = 16 + target_p->data; - } - - return target_p; -} - - - -static rmd160uint32 * -rmd160_sum_words (RMD160 arg_handle, rmd160uint32 * arg_result_p) -{ - struct rmd160_object work; - - - if (!arg_handle) - return NULL; - - if (!arg_result_p - && !(arg_result_p = - (rmd160uint32 *) malloc (5 * sizeof (rmd160uint32)))) - { - return NULL; - } - - rmd160_copy (&work, arg_handle); - - { - rmd160uint32 *p; - p = work.wptr; - if (work.bpos) - ++p; - while (p < work.wend) - *(p++) = 0U; - } - *(work.wptr) |= ((rmd160uint32) 0x80) << (work.bpos << 3); - - if ((work.wend - work.wptr) <= 2) - { - _rmd160_calc (work.state, work.data); - - memset (work.data, 0U, 14 * sizeof (rmd160uint32)); - } - - work.data[14] = work.len[0] << 3; - work.data[15] = (work.len[1] << 3) | (work.len[0] >> 29); - - _rmd160_calc (work.state, work.data); - - memcpy (arg_result_p, work.state, 5 * sizeof (rmd160uint32)); - - return arg_result_p; - -} - - - -static void -rmd160_sum_bytes (RMD160 arg_handle, unsigned char *result_p) -{ - rmd160uint32 temp[5]; - rmd160uint32 *ptemp; - - if (!rmd160_sum_words (arg_handle, temp)) - return; - - ptemp = temp; - { - int i; - for (i = 0; i < 5; ++i) - { - rmd160uint32 w; - *(result_p++) = 0xff & (w = *ptemp); - *(result_p++) = 0xff & (w >> 8); - *(result_p++) = 0xff & (w >> 16); - *(result_p++) = 0xff & (w >> 24); - ++ptemp; - } - } -} - - - -static struct EXTRACTOR_Keywords * -addKeyword (EXTRACTOR_KeywordList * oldhead, - const char *phrase, EXTRACTOR_KeywordType type) -{ - - EXTRACTOR_KeywordList *keyword; - keyword = malloc (sizeof (EXTRACTOR_KeywordList)); - keyword->next = oldhead; - keyword->keyword = strdup (phrase); - keyword->keywordType = type; - return keyword; -} - -#define DIGEST_BITS 160 -#define DIGEST_HEX_BYTES (DIGEST_BITS / 4) -#define DIGEST_BIN_BYTES (DIGEST_BITS / 8) -#define MAX_DIGEST_BIN_BYTES DIGEST_BIN_BYTES -#define rmd160_init(t) rmd160_copy((t),NULL) -#define rmd160_new() rmd160_copy(NULL,NULL) - - -struct EXTRACTOR_Keywords * -libextractor_hash_rmd160_extract (const char *filename, - const unsigned char *data, - size_t size, - struct EXTRACTOR_Keywords *prev) -{ - unsigned char bin_buffer[MAX_DIGEST_BIN_BYTES]; - char hash[8 * MAX_DIGEST_BIN_BYTES]; - char buf[16]; - RMD160 ptr; - int i; - - ptr = rmd160_new (); - rmd160_append (ptr, size, data); - rmd160_sum_bytes (ptr, bin_buffer); - rmd160_destroy (ptr); - hash[0] = '\0'; - for (i = 0; i < DIGEST_HEX_BYTES / 2; i++) - { - snprintf (buf, 16, "%02x", bin_buffer[i]); - strcat (hash, buf); - } - prev = addKeyword (prev, hash, EXTRACTOR_HASH_RMD160); - return prev; -} diff --git a/src/plugins/hash/sha1extractor.c b/src/plugins/hash/sha1extractor.c @@ -1,475 +0,0 @@ -/* - This file is part of libextractor. - (C) 2004 Vidyut Samanta and Christian Grothoff - - libextractor 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. - - libextractor 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 libextractor; see the file COPYING. If not, write to the - Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. - */ - -#include "platform.h" -#include "extractor.h" - -/* sha.c - Functions to compute SHA1 message digest of files or - memory blocks according to the NIST specification FIPS-180-1. - - Copyright (C) 2000, 2001, 2003 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 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 - 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, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* Written by Scott G. Miller - Credits: - Robert Klep <robert@ilse.nl> -- Expansion function fix -*/ - -#ifdef _LIBC -#include <stdint.h> -typedef uint32_t md5_uint32; -typedef uintptr_t md5_uintptr; -#else -# define UINT_MAX_32_BITS 4294967295U - -# if UINT_MAX == UINT_MAX_32_BITS -typedef unsigned int md5_uint32; -# else -# if USHRT_MAX == UINT_MAX_32_BITS -typedef unsigned short md5_uint32; -# else -# if ULONG_MAX == UINT_MAX_32_BITS -typedef unsigned long md5_uint32; -# else - /* The following line is intended to evoke an error. - Using #error is not portable enough. */ -"Cannot determine unsigned 32-bit data type." -# endif -# endif -# endif -/* We have to make a guess about the integer type equivalent in size - to pointers which should always be correct. */ -typedef unsigned long int md5_uintptr; -#endif - - -/* Structure to save state of computation between the single steps. */ -struct sha_ctx -{ - md5_uint32 A; - md5_uint32 B; - md5_uint32 C; - md5_uint32 D; - md5_uint32 E; - - md5_uint32 total[2]; - md5_uint32 buflen; - char buffer[128]; -}; - - -/* --- Code below is the primary difference between md5.c and sha.c --- */ - -/* SHA1 round constants */ -#define K1 0x5a827999L -#define K2 0x6ed9eba1L -#define K3 0x8f1bbcdcL -#define K4 0xca62c1d6L - -/* Round functions. Note that F2 is the same as F4. */ -#define F1(B,C,D) ( D ^ ( B & ( C ^ D ) ) ) -#define F2(B,C,D) (B ^ C ^ D) -#define F3(B,C,D) ( ( B & C ) | ( D & ( B | C ) ) ) -#define F4(B,C,D) (B ^ C ^ D) - -#define rol(x,n) ( ((x) << (n)) | ((x) >> (32-(n))) ) - -/* - Not-swap is a macro that does an endian swap on architectures that are - big-endian, as SHA needs some data in a little-endian format -*/ - -#ifdef WORDS_BIGENDIAN -# define NOTSWAP(n) (n) -# define SWAP(n) \ - (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24)) -#else -# define NOTSWAP(n) \ - (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24)) -# define SWAP(n) (n) -#endif - -#define BLOCKSIZE 4096 -/* Ensure that BLOCKSIZE is a multiple of 64. */ -#if BLOCKSIZE % 64 != 0 -/* FIXME-someday (soon?): use #error instead of this kludge. */ -"invalid BLOCKSIZE" -#endif -/* 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, ... */ }; - - - -/* Process LEN bytes of BUFFER, accumulating context into CTX. - It is assumed that LEN % 64 == 0. - Most of this code comes from GnuPG's cipher/sha1.c. */ - -static void -sha_process_block (const void *buffer, size_t len, struct sha_ctx *ctx) -{ - const md5_uint32 *words = buffer; - size_t nwords = len / sizeof (md5_uint32); - const md5_uint32 *endp = words + nwords; - md5_uint32 x[16]; - md5_uint32 a = ctx->A; - md5_uint32 b = ctx->B; - md5_uint32 c = ctx->C; - md5_uint32 d = ctx->D; - md5_uint32 e = ctx->E; - - /* 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]; - -#define M(I) ( tm = x[I&0x0f] ^ x[(I-14)&0x0f] \ - ^ x[(I-8)&0x0f] ^ x[(I-3)&0x0f] \ - , (x[I&0x0f] = rol(tm, 1)) ) - -#define R(A,B,C,D,E,F,K,M) do { E += rol( A, 5 ) \ - + F( B, C, D ) \ - + K \ - + M; \ - B = rol( B, 30 ); \ - } while(0) - - while (words < endp) - { - md5_uint32 tm; - int t; - /* FIXME: see sha1.c for a better implementation. */ - for (t = 0; t < 16; t++) - { - x[t] = NOTSWAP (*words); - words++; - } - - R (a, b, c, d, e, F1, K1, x[0]); - R (e, a, b, c, d, F1, K1, x[1]); - R (d, e, a, b, c, F1, K1, x[2]); - R (c, d, e, a, b, F1, K1, x[3]); - R (b, c, d, e, a, F1, K1, x[4]); - R (a, b, c, d, e, F1, K1, x[5]); - R (e, a, b, c, d, F1, K1, x[6]); - R (d, e, a, b, c, F1, K1, x[7]); - R (c, d, e, a, b, F1, K1, x[8]); - R (b, c, d, e, a, F1, K1, x[9]); - R (a, b, c, d, e, F1, K1, x[10]); - R (e, a, b, c, d, F1, K1, x[11]); - R (d, e, a, b, c, F1, K1, x[12]); - R (c, d, e, a, b, F1, K1, x[13]); - R (b, c, d, e, a, F1, K1, x[14]); - R (a, b, c, d, e, F1, K1, x[15]); - R (e, a, b, c, d, F1, K1, M (16)); - R (d, e, a, b, c, F1, K1, M (17)); - R (c, d, e, a, b, F1, K1, M (18)); - R (b, c, d, e, a, F1, K1, M (19)); - R (a, b, c, d, e, F2, K2, M (20)); - R (e, a, b, c, d, F2, K2, M (21)); - R (d, e, a, b, c, F2, K2, M (22)); - R (c, d, e, a, b, F2, K2, M (23)); - R (b, c, d, e, a, F2, K2, M (24)); - R (a, b, c, d, e, F2, K2, M (25)); - R (e, a, b, c, d, F2, K2, M (26)); - R (d, e, a, b, c, F2, K2, M (27)); - R (c, d, e, a, b, F2, K2, M (28)); - R (b, c, d, e, a, F2, K2, M (29)); - R (a, b, c, d, e, F2, K2, M (30)); - R (e, a, b, c, d, F2, K2, M (31)); - R (d, e, a, b, c, F2, K2, M (32)); - R (c, d, e, a, b, F2, K2, M (33)); - R (b, c, d, e, a, F2, K2, M (34)); - R (a, b, c, d, e, F2, K2, M (35)); - R (e, a, b, c, d, F2, K2, M (36)); - R (d, e, a, b, c, F2, K2, M (37)); - R (c, d, e, a, b, F2, K2, M (38)); - R (b, c, d, e, a, F2, K2, M (39)); - R (a, b, c, d, e, F3, K3, M (40)); - R (e, a, b, c, d, F3, K3, M (41)); - R (d, e, a, b, c, F3, K3, M (42)); - R (c, d, e, a, b, F3, K3, M (43)); - R (b, c, d, e, a, F3, K3, M (44)); - R (a, b, c, d, e, F3, K3, M (45)); - R (e, a, b, c, d, F3, K3, M (46)); - R (d, e, a, b, c, F3, K3, M (47)); - R (c, d, e, a, b, F3, K3, M (48)); - R (b, c, d, e, a, F3, K3, M (49)); - R (a, b, c, d, e, F3, K3, M (50)); - R (e, a, b, c, d, F3, K3, M (51)); - R (d, e, a, b, c, F3, K3, M (52)); - R (c, d, e, a, b, F3, K3, M (53)); - R (b, c, d, e, a, F3, K3, M (54)); - R (a, b, c, d, e, F3, K3, M (55)); - R (e, a, b, c, d, F3, K3, M (56)); - R (d, e, a, b, c, F3, K3, M (57)); - R (c, d, e, a, b, F3, K3, M (58)); - R (b, c, d, e, a, F3, K3, M (59)); - R (a, b, c, d, e, F4, K4, M (60)); - R (e, a, b, c, d, F4, K4, M (61)); - R (d, e, a, b, c, F4, K4, M (62)); - R (c, d, e, a, b, F4, K4, M (63)); - R (b, c, d, e, a, F4, K4, M (64)); - R (a, b, c, d, e, F4, K4, M (65)); - R (e, a, b, c, d, F4, K4, M (66)); - R (d, e, a, b, c, F4, K4, M (67)); - R (c, d, e, a, b, F4, K4, M (68)); - R (b, c, d, e, a, F4, K4, M (69)); - R (a, b, c, d, e, F4, K4, M (70)); - R (e, a, b, c, d, F4, K4, M (71)); - R (d, e, a, b, c, F4, K4, M (72)); - R (c, d, e, a, b, F4, K4, M (73)); - R (b, c, d, e, a, F4, K4, M (74)); - R (a, b, c, d, e, F4, K4, M (75)); - R (e, a, b, c, d, F4, K4, M (76)); - R (d, e, a, b, c, F4, K4, M (77)); - R (c, d, e, a, b, F4, K4, M (78)); - R (b, c, d, e, a, F4, K4, M (79)); - - a = ctx->A += a; - b = ctx->B += b; - c = ctx->C += c; - d = ctx->D += d; - e = ctx->E += e; - } -} - - - -static void -sha_process_bytes (const void *buffer, size_t len, struct sha_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) - { - sha_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) - { - sha_process_block (memcpy (ctx->buffer, buffer, 64), 64, ctx); - buffer = (const char *) buffer + 64; - len -= 64; - } - else -#endif - { - sha_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) - { - sha_process_block (ctx->buffer, 64, ctx); - left_over -= 64; - memcpy (ctx->buffer, &ctx->buffer[64], left_over); - } - ctx->buflen = left_over; - } -} - - -/* - Takes a pointer to a 160 bit block of data (five 32 bit ints) and - intializes it to the start constants of the SHA1 algorithm. This - must be called before using hash in the call to sha_hash -*/ -static void -sha_init_ctx (struct sha_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. */ -static void * -sha_read_ctx (const struct sha_ctx *ctx, void *resbuf) -{ - ((md5_uint32 *) resbuf)[0] = NOTSWAP (ctx->A); - ((md5_uint32 *) resbuf)[1] = NOTSWAP (ctx->B); - ((md5_uint32 *) resbuf)[2] = NOTSWAP (ctx->C); - ((md5_uint32 *) resbuf)[3] = NOTSWAP (ctx->D); - ((md5_uint32 *) resbuf)[4] = NOTSWAP (ctx->E); - - return resbuf; -} - -/* 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. */ -static void * -sha_finish_ctx (struct sha_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. */ - *(md5_uint32 *) & ctx->buffer[bytes + pad + 4] = - NOTSWAP (ctx->total[0] << 3); - *(md5_uint32 *) & ctx->buffer[bytes + pad] = - NOTSWAP ((ctx->total[1] << 3) | (ctx->total[0] >> 29)); - - /* Process last bytes. */ - sha_process_block (ctx->buffer, bytes + pad + 8, ctx); - - return sha_read_ctx (ctx, resbuf); -} - - -/* 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. */ -static void * -sha_buffer (const char *buffer, size_t len, void *resblock) -{ - struct sha_ctx ctx; - - /* Initialize the computation context. */ - sha_init_ctx (&ctx); - - /* Process whole buffer but last len % 64 bytes. */ - sha_process_bytes (buffer, len, &ctx); - - /* Put result in desired memory area. */ - return sha_finish_ctx (&ctx, resblock); -} - - - - - - - -static struct EXTRACTOR_Keywords * -addKeyword (EXTRACTOR_KeywordList * oldhead, - const char *phrase, EXTRACTOR_KeywordType type) -{ - - EXTRACTOR_KeywordList *keyword; - keyword = (EXTRACTOR_KeywordList *) malloc (sizeof (EXTRACTOR_KeywordList)); - keyword->next = oldhead; - keyword->keyword = strdup (phrase); - keyword->keywordType = type; - return keyword; -} - -#define DIGEST_BITS 160 -#define DIGEST_HEX_BYTES (DIGEST_BITS / 4) -#define DIGEST_BIN_BYTES (DIGEST_BITS / 8) - -#define MAX_DIGEST_BIN_BYTES DIGEST_BIN_BYTES - -struct EXTRACTOR_Keywords * -libextractor_hash_sha1_extract (const char *filename, - char *data, - size_t size, struct EXTRACTOR_Keywords *prev) -{ - unsigned char bin_buffer[MAX_DIGEST_BIN_BYTES]; - char hash[8 * MAX_DIGEST_BIN_BYTES]; - char buf[16]; - int i; - - sha_buffer (data, size, bin_buffer); - - hash[0] = '\0'; - for (i = 0; i < DIGEST_HEX_BYTES / 2; i++) - { - snprintf (buf, 16, "%02x", bin_buffer[i]); - strcat (hash, buf); - } - prev = addKeyword (prev, hash, EXTRACTOR_HASH_SHA1); - return prev; -}