* Optional switch "--with-openssl=<PATH>" to use OpenSSL's
implementations of MD5, SHA-1 and SHA-256. The main benefit is that we get assembler-optimised implementations of MD5 and SHA-1 (though not SHA-256 (at least on x86), unfortunately). OpenSSL's SHA-1 implementation on Intel is twice as fast as ours.
This commit is contained in:
		
							parent
							
								
									e8475bbd5b
								
							
						
					
					
						commit
						d6f586d0ea
					
				
					 7 changed files with 59 additions and 40 deletions
				
			
		
							
								
								
									
										11
									
								
								configure.ac
									
										
									
									
									
								
							
							
						
						
									
										11
									
								
								configure.ac
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -143,6 +143,17 @@ AC_SUBST(aterm_lib)
 | 
			
		|||
AC_SUBST(aterm_include)
 | 
			
		||||
AC_SUBST(aterm_bin)
 | 
			
		||||
 | 
			
		||||
AC_ARG_WITH(openssl, AC_HELP_STRING([--with-openssl=PATH],
 | 
			
		||||
  [prefix of the OpenSSL library]),
 | 
			
		||||
  openssl=$withval, openssl=)
 | 
			
		||||
AM_CONDITIONAL(HAVE_OPENSSL, test -n "$openssl")
 | 
			
		||||
if test -n "$openssl"; then
 | 
			
		||||
  LDFLAGS="-L$openssl/lib -lcrypto $LDFLAGS"
 | 
			
		||||
  CFLAGS="-I$openssl/include $CFLAGS"
 | 
			
		||||
  CXXFLAGS="-I$openssl/include $CXXFLAGS"
 | 
			
		||||
  AC_DEFINE(HAVE_OPENSSL, 1, [whether to use OpenSSL])
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
AC_ARG_WITH(bzip2, AC_HELP_STRING([--with-bzip2=PATH],
 | 
			
		||||
  [prefix of bzip2]),
 | 
			
		||||
  bzip2=$withval, bzip2=)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,7 +1,11 @@
 | 
			
		|||
lib_LTLIBRARIES = libutil.la
 | 
			
		||||
 | 
			
		||||
libutil_la_SOURCES = util.cc util.hh hash.cc hash.hh \
 | 
			
		||||
 archive.cc archive.hh aterm.cc aterm.hh \
 | 
			
		||||
 archive.cc archive.hh aterm.cc aterm.hh
 | 
			
		||||
 | 
			
		||||
if !HAVE_OPENSSL
 | 
			
		||||
libutil_la_SOURCES += \
 | 
			
		||||
 md5.c md5.h sha1.c sha1.h sha256.c sha256.h md32_common.h
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
AM_CXXFLAGS = -Wall -I.. ${aterm_include}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,10 +1,17 @@
 | 
			
		|||
#include "config.h"
 | 
			
		||||
 | 
			
		||||
#include <iostream>
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_OPENSSL
 | 
			
		||||
#include <openssl/md5.h>
 | 
			
		||||
#include <openssl/sha.h>
 | 
			
		||||
#else
 | 
			
		||||
extern "C" {
 | 
			
		||||
#include "md5.h"
 | 
			
		||||
#include "sha1.h"
 | 
			
		||||
#include "sha256.h"
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "hash.hh"
 | 
			
		||||
#include "archive.hh"
 | 
			
		||||
| 
						 | 
				
			
			@ -199,16 +206,16 @@ bool isHash(const string & s)
 | 
			
		|||
 | 
			
		||||
union Ctx
 | 
			
		||||
{
 | 
			
		||||
    md5_ctx md5;
 | 
			
		||||
    sha_ctx sha1;
 | 
			
		||||
    MD5_CTX md5;
 | 
			
		||||
    SHA_CTX sha1;
 | 
			
		||||
    SHA256_CTX sha256;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void start(HashType ht, Ctx & ctx)
 | 
			
		||||
{
 | 
			
		||||
    if (ht == htMD5) md5_init_ctx(&ctx.md5);
 | 
			
		||||
    else if (ht == htSHA1) sha_init(&ctx.sha1);
 | 
			
		||||
    if (ht == htMD5) MD5_Init(&ctx.md5);
 | 
			
		||||
    else if (ht == htSHA1) SHA1_Init(&ctx.sha1);
 | 
			
		||||
    else if (ht == htSHA256) SHA256_Init(&ctx.sha256);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -216,19 +223,16 @@ static void start(HashType ht, Ctx & ctx)
 | 
			
		|||
static void update(HashType ht, Ctx & ctx,
 | 
			
		||||
    const unsigned char * bytes, unsigned int len)
 | 
			
		||||
{
 | 
			
		||||
    if (ht == htMD5) md5_process_bytes(bytes, len, &ctx.md5);
 | 
			
		||||
    else if (ht == htSHA1) sha_update(&ctx.sha1, bytes, len);
 | 
			
		||||
    if (ht == htMD5) MD5_Update(&ctx.md5, bytes, len);
 | 
			
		||||
    else if (ht == htSHA1) SHA1_Update(&ctx.sha1, bytes, len);
 | 
			
		||||
    else if (ht == htSHA256) SHA256_Update(&ctx.sha256, bytes, len);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void finish(HashType ht, Ctx & ctx, unsigned char * hash)
 | 
			
		||||
{
 | 
			
		||||
    if (ht == htMD5) md5_finish_ctx(&ctx.md5, hash);
 | 
			
		||||
    else if (ht == htSHA1) {
 | 
			
		||||
        sha_final(&ctx.sha1);
 | 
			
		||||
        sha_digest(&ctx.sha1, hash);
 | 
			
		||||
    }
 | 
			
		||||
    if (ht == htMD5) MD5_Final(hash, &ctx.md5);
 | 
			
		||||
    else if (ht == htSHA1) SHA1_Final(hash, &ctx.sha1);
 | 
			
		||||
    else if (ht == htSHA256) SHA256_Final(hash, &ctx.sha256);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -56,8 +56,8 @@ 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 (ctx)
 | 
			
		||||
     struct md5_ctx *ctx;
 | 
			
		||||
MD5_Init (ctx)
 | 
			
		||||
     struct MD5_CTX *ctx;
 | 
			
		||||
{
 | 
			
		||||
  ctx->A = 0x67452301;
 | 
			
		||||
  ctx->B = 0xefcdab89;
 | 
			
		||||
| 
						 | 
				
			
			@ -75,7 +75,7 @@ md5_init_ctx (ctx)
 | 
			
		|||
   aligned for a 32 bits value.  */
 | 
			
		||||
void *
 | 
			
		||||
md5_read_ctx (ctx, resbuf)
 | 
			
		||||
     const struct md5_ctx *ctx;
 | 
			
		||||
     const struct MD5_CTX *ctx;
 | 
			
		||||
     void *resbuf;
 | 
			
		||||
{
 | 
			
		||||
  ((md5_uint32 *) resbuf)[0] = SWAP (ctx->A);
 | 
			
		||||
| 
						 | 
				
			
			@ -92,9 +92,9 @@ md5_read_ctx (ctx, resbuf)
 | 
			
		|||
   IMPORTANT: On some systems it is required that RESBUF is correctly
 | 
			
		||||
   aligned for a 32 bits value.  */
 | 
			
		||||
void *
 | 
			
		||||
md5_finish_ctx (ctx, resbuf)
 | 
			
		||||
     struct md5_ctx *ctx;
 | 
			
		||||
MD5_Final (resbuf, ctx)
 | 
			
		||||
     void *resbuf;
 | 
			
		||||
     struct MD5_CTX *ctx;
 | 
			
		||||
{
 | 
			
		||||
  /* Take yet unprocessed bytes into account.  */
 | 
			
		||||
  md5_uint32 bytes = ctx->buflen;
 | 
			
		||||
| 
						 | 
				
			
			@ -120,10 +120,10 @@ md5_finish_ctx (ctx, resbuf)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
md5_process_bytes (buffer, len, ctx)
 | 
			
		||||
MD5_Update (ctx, buffer, len)
 | 
			
		||||
     struct MD5_CTX *ctx;
 | 
			
		||||
     const void *buffer;
 | 
			
		||||
     size_t len;
 | 
			
		||||
     struct md5_ctx *ctx;
 | 
			
		||||
{
 | 
			
		||||
  /* When we already have some bits in our internal buffer concatenate
 | 
			
		||||
     both inputs first.  */
 | 
			
		||||
| 
						 | 
				
			
			@ -210,7 +210,7 @@ void
 | 
			
		|||
md5_process_block (buffer, len, ctx)
 | 
			
		||||
     const void *buffer;
 | 
			
		||||
     size_t len;
 | 
			
		||||
     struct md5_ctx *ctx;
 | 
			
		||||
     struct MD5_CTX *ctx;
 | 
			
		||||
{
 | 
			
		||||
  md5_uint32 correct_words[16];
 | 
			
		||||
  const md5_uint32 *words = buffer;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,7 +26,7 @@ typedef uint32_t md5_uint32;
 | 
			
		|||
typedef uintptr_t md5_uintptr;
 | 
			
		||||
 | 
			
		||||
/* Structure to save state of computation between the single steps.  */
 | 
			
		||||
struct md5_ctx
 | 
			
		||||
struct MD5_CTX
 | 
			
		||||
{
 | 
			
		||||
  md5_uint32 A;
 | 
			
		||||
  md5_uint32 B;
 | 
			
		||||
| 
						 | 
				
			
			@ -45,21 +45,20 @@ struct md5_ctx
 | 
			
		|||
 | 
			
		||||
/* Initialize structure containing state of computation.
 | 
			
		||||
   (RFC 1321, 3.3: Step 3)  */
 | 
			
		||||
extern void md5_init_ctx __P ((struct md5_ctx *ctx));
 | 
			
		||||
extern void MD5_Init __P ((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 __P ((const void *buffer, size_t len,
 | 
			
		||||
				      struct md5_ctx *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 NOT required that LEN is a multiple of 64.  */
 | 
			
		||||
extern void md5_process_bytes __P ((const void *buffer, size_t len,
 | 
			
		||||
				      struct md5_ctx *ctx));
 | 
			
		||||
extern void MD5_Update __P ((struct MD5_CTX *ctx, const void *buffer, size_t len));
 | 
			
		||||
 | 
			
		||||
/* Process the remaining bytes in the buffer and put result from CTX
 | 
			
		||||
   in first 16 bytes following RESBUF.  The result is always in little
 | 
			
		||||
| 
						 | 
				
			
			@ -68,7 +67,7 @@ extern void md5_process_bytes __P ((const void *buffer, size_t len,
 | 
			
		|||
 | 
			
		||||
   IMPORTANT: On some systems it is required that RESBUF is correctly
 | 
			
		||||
   aligned for a 32 bits value.  */
 | 
			
		||||
extern void *md5_finish_ctx __P ((struct md5_ctx *ctx, void *resbuf));
 | 
			
		||||
extern void *MD5_Final __P ((void *resbuf, struct MD5_CTX *ctx));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Put result from CTX in first 16 bytes following RESBUF.  The result is
 | 
			
		||||
| 
						 | 
				
			
			@ -77,7 +76,7 @@ extern void *md5_finish_ctx __P ((struct md5_ctx *ctx, void *resbuf));
 | 
			
		|||
 | 
			
		||||
   IMPORTANT: On some systems it is required that RESBUF is correctly
 | 
			
		||||
   aligned for a 32 bits value.  */
 | 
			
		||||
extern void *md5_read_ctx __P ((const struct md5_ctx *ctx, void *resbuf));
 | 
			
		||||
extern void *md5_read_ctx __P ((const struct MD5_CTX *ctx, void *resbuf));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif /* md5.h */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -37,7 +37,7 @@ effort (for example the reengineering of a great many Capstone chips).
 | 
			
		|||
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
void sha_copy(struct sha_ctx *dest, struct sha_ctx *src)
 | 
			
		||||
void sha_copy(struct SHA_CTX *dest, struct SHA_CTX *src)
 | 
			
		||||
{
 | 
			
		||||
  unsigned int i;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -118,7 +118,7 @@ void sha_copy(struct sha_ctx *dest, struct sha_ctx *src)
 | 
			
		|||
 | 
			
		||||
/* Initialize the SHA values */
 | 
			
		||||
 | 
			
		||||
void sha_init(struct sha_ctx *ctx)
 | 
			
		||||
void SHA1_Init(struct SHA_CTX *ctx)
 | 
			
		||||
{
 | 
			
		||||
  /* Set the h-vars to their initial values */
 | 
			
		||||
  ctx->digest[ 0 ] = h0init;
 | 
			
		||||
| 
						 | 
				
			
			@ -141,7 +141,7 @@ void sha_init(struct sha_ctx *ctx)
 | 
			
		|||
 | 
			
		||||
   Note that this function destroys the data area */
 | 
			
		||||
 | 
			
		||||
static void sha_transform(struct sha_ctx *ctx, uint32_t *data )
 | 
			
		||||
static void sha_transform(struct SHA_CTX *ctx, uint32_t *data )
 | 
			
		||||
{
 | 
			
		||||
  uint32_t A, B, C, D, E;     /* Local vars */
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -267,7 +267,7 @@ uint32_t STRING2INT(unsigned char *s)
 | 
			
		|||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
static void sha_block(struct sha_ctx *ctx, const unsigned char *block)
 | 
			
		||||
static void sha_block(struct SHA_CTX *ctx, const unsigned char *block)
 | 
			
		||||
{
 | 
			
		||||
  uint32_t data[SHA_DATALEN];
 | 
			
		||||
  unsigned int i;
 | 
			
		||||
| 
						 | 
				
			
			@ -283,7 +283,7 @@ static void sha_block(struct sha_ctx *ctx, const unsigned char *block)
 | 
			
		|||
  sha_transform(ctx, data);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void sha_update(struct sha_ctx *ctx, const unsigned char *buffer, uint32_t len)
 | 
			
		||||
void SHA1_Update(struct SHA_CTX *ctx, const unsigned char *buffer, uint32_t len)
 | 
			
		||||
{
 | 
			
		||||
  if (ctx->index)
 | 
			
		||||
    { /* Try to fill partial block */
 | 
			
		||||
| 
						 | 
				
			
			@ -316,7 +316,7 @@ void sha_update(struct sha_ctx *ctx, const unsigned char *buffer, uint32_t len)
 | 
			
		|||
/* Final wrapup - pad to SHA_DATASIZE-byte boundary with the bit pattern
 | 
			
		||||
   1 0* (64-bit count of bits processed, MSB-first) */
 | 
			
		||||
 | 
			
		||||
void sha_final(struct sha_ctx *ctx)
 | 
			
		||||
void SHA1_Final(unsigned char *s, struct SHA_CTX *ctx)
 | 
			
		||||
{
 | 
			
		||||
  uint32_t data[SHA_DATALEN];
 | 
			
		||||
  unsigned int i;
 | 
			
		||||
| 
						 | 
				
			
			@ -352,9 +352,10 @@ void sha_final(struct sha_ctx *ctx)
 | 
			
		|||
  data[SHA_DATALEN-2] = (ctx->count_h << 9) | (ctx->count_l >> 23);
 | 
			
		||||
  data[SHA_DATALEN-1] = (ctx->count_l << 9) | (ctx->index << 3);
 | 
			
		||||
  sha_transform(ctx, data);
 | 
			
		||||
  sha_digest(ctx, s);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void sha_digest(struct sha_ctx *ctx, unsigned char *s)
 | 
			
		||||
void sha_digest(struct SHA_CTX *ctx, unsigned char *s)
 | 
			
		||||
{
 | 
			
		||||
  unsigned int i;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,18 +11,18 @@
 | 
			
		|||
#define SHA_DIGESTLEN    5
 | 
			
		||||
/* The structure for storing SHA info */
 | 
			
		||||
 | 
			
		||||
struct sha_ctx {
 | 
			
		||||
struct SHA_CTX {
 | 
			
		||||
  uint32_t digest[SHA_DIGESTLEN];  /* Message digest */
 | 
			
		||||
  uint32_t count_l, count_h;       /* 64-bit block count */
 | 
			
		||||
  uint8_t block[SHA_DATASIZE];     /* SHA data buffer */
 | 
			
		||||
  unsigned int index;            /* index into buffer */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void sha_init(struct sha_ctx *ctx);
 | 
			
		||||
void sha_update(struct sha_ctx *ctx, const unsigned char *buffer, uint32_t len);
 | 
			
		||||
void sha_final(struct sha_ctx *ctx);
 | 
			
		||||
void sha_digest(struct sha_ctx *ctx, unsigned char *s);
 | 
			
		||||
void sha_copy(struct sha_ctx *dest, struct sha_ctx *src);
 | 
			
		||||
void SHA1_Init(struct SHA_CTX *ctx);
 | 
			
		||||
void SHA1_Update(struct SHA_CTX *ctx, const unsigned char *buffer, uint32_t len);
 | 
			
		||||
void SHA1_Final(unsigned char *s, struct SHA_CTX *ctx);
 | 
			
		||||
void sha_digest(struct SHA_CTX *ctx, unsigned char *s);
 | 
			
		||||
void sha_copy(struct SHA_CTX *dest, struct SHA_CTX *src);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif /* !_SHA_H */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue