commit 7e93648c27b64f01990b7f4ff10ce48d2b397c39
parent 2579fff926e019060d22f2adeb78b3bc7fe50f51
Author: Christian Grothoff <christian@grothoff.org>
Date: Wed, 13 Jan 2010 14:42:13 +0000
bye bye hash
Diffstat:
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;
-}