--- generic/sha.c.orig	2009-06-18 04:54:44 UTC
+++ generic/sha.c
@@ -27,15 +27,11 @@
  * CVS: $Id: sha.c,v 1.4 2007/10/05 23:12:21 andreas_kupries Exp $
  */
 
-#include "transformInt.h"
-#include "sha/sha.h"
+#include <openssl/opensslconf.h>
+#ifndef OPENSSL_NO_SHA0
 
-#ifdef WORDS_BIGENDIAN
-#undef  LITTLE_ENDIAN
-#else
-#undef  LITTLE_ENDIAN
-#define LITTLE_ENDIAN
-#endif
+#include "transformInt.h"
+#include <openssl/sha.h>
 
 /*
  * Generator description
@@ -45,32 +41,10 @@
  * message digest.
  */
 
-#define DIGEST_SIZE               (SHA_DIGESTSIZE)
-#define CTX_TYPE                  sha_trf_info
+#define DIGEST_SIZE               (20)
+#define CTX_TYPE                  SHA_CTX
 #define CHUNK_SIZE                256
 
-/* We cannot use SHA_INFO directly as context cause 'sha_update' handles
- * a chunk smaller then CHUNK_SIZE bytes correct if and only if it is
- * the last chunk. This forces us to buffer the incoming bytes till a chunk
- * is complete before doing an update.
- */
-
-typedef struct _sha_trf_info {
-  SHA_INFO       s;
-  unsigned short count;
-  unsigned char  buf [CHUNK_SIZE]; /* SHA block */
-} sha_trf_info;
-
-
-/*
- * Declarations of internal procedures.
- */
-
-static void MDsha_Start     _ANSI_ARGS_ ((VOID* context));
-static void MDsha_Update    _ANSI_ARGS_ ((VOID* context, unsigned int character));
-static void MDsha_UpdateBuf _ANSI_ARGS_ ((VOID* context, unsigned char* buffer, int bufLen));
-static void MDsha_Final     _ANSI_ARGS_ ((VOID* context, VOID* digest));
-
 /*
  * Generator definition.
  */
@@ -79,10 +53,10 @@ static Trf_MessageDigestDescription mdDe
   "sha",
   sizeof (CTX_TYPE),
   DIGEST_SIZE,
-  MDsha_Start,
-  MDsha_Update,
-  MDsha_UpdateBuf,
-  MDsha_Final,
+  (Trf_MDStart *)SHA_Init,
+  NULL,
+  (Trf_MDUpdateBuf *)SHA_Update,
+  (Trf_MDFinal *)SHA_Final,
   NULL
 };
 
@@ -110,182 +84,5 @@ Tcl_Interp* interp;
 {
   return Trf_RegisterMessageDigest (interp, &mdDescription);
 }
-
-/*
- *------------------------------------------------------*
- *
- *	MDsha_Start --
- *
- *	------------------------------------------------*
- *	Initialize the internal state of the message
- *	digest generator.
- *	------------------------------------------------*
- *
- *	Sideeffects:
- *		As of the called procedure.
- *
- *	Result:
- *		None.
- *
- *------------------------------------------------------*
- */
-
-static void
-MDsha_Start (context)
-VOID* context;
-{
-  sha_trf_info* s = (sha_trf_info*) context;
-
-  memset (s, '\0', sizeof (sha_trf_info));
-  sha_init (&s->s);
-}
-
-/*
- *------------------------------------------------------*
- *
- *	MDsha_Update --
- *
- *	------------------------------------------------*
- *	Update the internal state of the message digest
- *	generator for a single character.
- *	------------------------------------------------*
- *
- *	Sideeffects:
- *		As of the called procedure.
- *
- *	Result:
- *		None.
- *
- *------------------------------------------------------*
- */
-
-static void
-MDsha_Update (context, character)
-VOID* context;
-unsigned int   character;
-{
-  sha_trf_info* s = (sha_trf_info*) context;
 
-  s->buf [s->count] = character;
-  s->count ++;
-
-  if (s->count == CHUNK_SIZE) {
-    sha_update (&s->s, s->buf, s->count);
-    s->count = 0;
-  }
-}
-
-/*
- *------------------------------------------------------*
- *
- *	MDsha_UpdateBuf --
- *
- *	------------------------------------------------*
- *	Update the internal state of the message digest
- *	generator for a character buffer.
- *	------------------------------------------------*
- *
- *	Sideeffects:
- *		As of the called procedure.
- *
- *	Result:
- *		None.
- *
- *------------------------------------------------------*
- */
-
-static void
-MDsha_UpdateBuf (context, buffer, bufLen)
-VOID* context;
-unsigned char* buffer;
-int   bufLen;
-{
-  sha_trf_info* s = (sha_trf_info*) context;
-
-  if ((s->count + bufLen) < CHUNK_SIZE) {
-    /*
-     * Not enough for full chunk. Remember incoming
-     * data and wait for another call containing more data.
-     */
-
-    memcpy ((VOID*) (s->buf + s->count), (VOID*) buffer, bufLen);
-    s->count += bufLen;
-  } else {
-    /*
-     * Complete chunk with incoming data, update digest,
-     * then use all chunks contained in the buffer. Remember
-     * an incomplete chunk and wait for further calls.
-     */
-
-    int k = CHUNK_SIZE - s->count;
-
-    if (k < CHUNK_SIZE) {
-      memcpy ((VOID*) (s->buf + s->count), (VOID*) buffer, k);
-
-      sha_update (&s->s, s->buf, CHUNK_SIZE);
-
-      buffer += k;
-      bufLen -= k;
-    } /* k == CHUNK_SIZE => internal buffer was empty, so skip it entirely */
-
-    while (bufLen > CHUNK_SIZE) {
-      sha_update (&s->s, buffer, CHUNK_SIZE);
-
-      buffer += CHUNK_SIZE;
-      bufLen -= CHUNK_SIZE;
-    }
-
-    s->count = bufLen;
-    if (bufLen > 0)
-      memcpy ((VOID*) s->buf, (VOID*) buffer, bufLen);
-  }
-}
-
-/*
- *------------------------------------------------------*
- *
- *	MDsha_Final --
- *
- *	------------------------------------------------*
- *	Generate the digest from the internal state of
- *	the message digest generator.
- *	------------------------------------------------*
- *
- *	Sideeffects:
- *		As of the called procedure.
- *
- *	Result:
- *		None.
- *
- *------------------------------------------------------*
- */
-
-static void
-MDsha_Final (context, digest)
-VOID* context;
-VOID* digest;
-{
-  sha_trf_info* s = (sha_trf_info*) context;
-
-  if (s->count > 0) {
-    sha_update (&s->s, s->buf, s->count);
-  }
-
-  sha_final  (&s->s);
-
-#ifndef WORDS_BIGENDIAN
-  Trf_FlipRegisterLong (s->s.digest, SHA_DIGESTSIZE);
 #endif
-
-  memcpy (digest, s->s.digest, SHA_DIGESTSIZE);
-}
-
-/*
- * External code from here on.
- *
- * To make smaller object code, but run a little slower, don't use UNROLL_LOOPS.
- * To use NIST's modified SHA of 7/11/94, define USE_MODIFIED_SHA
- */
-
-#define UNROLL_LOOPS
-#include "sha/sha.c"
