shithub: choc

Download patch

ref: 42567795b30ae8e33a90f0fa956204408b419757
parent: 933839b0a2a95498c8c935339bb79ade11983dd5
author: Simon Howard <[email protected]>
date: Thu Oct 25 16:40:56 EDT 2012

Switch from MD5 to SHA-1 for network digests.

Subversion-branch: /trunk/chocolate-doom
Subversion-revision: 2530

--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -63,7 +63,7 @@
 m_fixed.c            m_fixed.h             \
 m_menu.c             m_menu.h              \
 m_misc.c             m_misc.h              \
-md5.c                md5.h                 \
+sha1.c               sha1.h                \
 memio.c              memio.h               \
 m_random.c           m_random.h            \
 p_ceilng.c                                 \
--- a/src/deh_ammo.c
+++ b/src/deh_ammo.c
@@ -89,14 +89,14 @@
     }
 }
 
-static void DEH_AmmoMD5Hash(md5_context_t *context)
+static void DEH_AmmoSHA1Hash(sha1_context_t *context)
 {
     int i;
 
     for (i=0; i<NUMAMMO; ++i)
     {
-        MD5_UpdateInt32(context, clipammo[i]);
-        MD5_UpdateInt32(context, maxammo[i]);
+        SHA1_UpdateInt32(context, clipammo[i]);
+        SHA1_UpdateInt32(context, maxammo[i]);
     }
 }
 
@@ -107,6 +107,6 @@
     DEH_AmmoStart,
     DEH_AmmoParseLine,
     NULL,
-    DEH_AmmoMD5Hash,
+    DEH_AmmoSHA1Hash,
 };
 
--- a/src/deh_defs.h
+++ b/src/deh_defs.h
@@ -27,7 +27,7 @@
 #ifndef DEH_DEFS_H
 #define DEH_DEFS_H
 
-#include "md5.h"
+#include "sha1.h"
 
 typedef struct deh_context_s deh_context_t;
 typedef struct deh_section_s deh_section_t;
@@ -35,7 +35,7 @@
 typedef void *(*deh_section_start_t)(deh_context_t *context, char *line);
 typedef void (*deh_section_end_t)(deh_context_t *context, void *tag);
 typedef void (*deh_line_parser_t)(deh_context_t *context, char *line, void *tag);
-typedef void (*deh_md5_hash_t)(md5_context_t *context);
+typedef void (*deh_sha1_hash_t)(sha1_context_t *context);
 
 struct deh_section_s
 {
@@ -58,9 +58,9 @@
 
     deh_section_end_t end;
 
-    // Called when generating an MD5 sum of the dehacked state
+    // Called when generating an SHA1 sum of the dehacked state
 
-    deh_md5_hash_t md5_hash;
+    deh_sha1_hash_t sha1_hash;
 };
 
 #endif /* #ifndef DEH_DEFS_H */
--- a/src/deh_frame.c
+++ b/src/deh_frame.c
@@ -148,13 +148,13 @@
     }
 }
 
-static void DEH_FrameMD5Sum(md5_context_t *context)
+static void DEH_FrameSHA1Sum(sha1_context_t *context)
 {
     int i;
 
     for (i=0; i<NUMSTATES; ++i)
     {
-        DEH_StructMD5Sum(context, &state_mapping, &states[i]);
+        DEH_StructSHA1Sum(context, &state_mapping, &states[i]);
     }
 }
 
@@ -165,6 +165,6 @@
     DEH_FrameStart,
     DEH_FrameParseLine,
     NULL,
-    DEH_FrameMD5Sum,
+    DEH_FrameSHA1Sum,
 };
 
--- a/src/deh_main.c
+++ b/src/deh_main.c
@@ -89,22 +89,22 @@
     &deh_section_weapon,
 };
 
-void DEH_Checksum(md5_digest_t digest)
+void DEH_Checksum(sha1_digest_t digest)
 {
-    md5_context_t md5_context;
+    sha1_context_t sha1_context;
     unsigned int i;
 
-    MD5_Init(&md5_context);
+    SHA1_Init(&sha1_context);
 
     for (i=0; i<arrlen(section_types); ++i)
     {
-        if (section_types[i]->md5_hash != NULL)
+        if (section_types[i]->sha1_hash != NULL)
         {
-            section_types[i]->md5_hash(&md5_context);
+            section_types[i]->sha1_hash(&sha1_context);
         }
     }
 
-    MD5_Final(digest, &md5_context);
+    SHA1_Final(digest, &sha1_context);
 }
 
 // Called on startup to call the Init functions
--- a/src/deh_main.h
+++ b/src/deh_main.h
@@ -31,7 +31,7 @@
 
 #include "doomtype.h"
 #include "doomfeatures.h"
-#include "md5.h"
+#include "sha1.h"
 
 // These are the limits that dehacked uses (from dheinit.h in the dehacked
 // source).  If these limits are exceeded, it does not generate an error, but
@@ -47,7 +47,7 @@
 
 boolean DEH_ParseAssignment(char *line, char **variable_name, char **value);
 
-void DEH_Checksum(md5_digest_t digest);
+void DEH_Checksum(sha1_digest_t digest);
 
 // deh_text.c:
 //
--- a/src/deh_mapping.c
+++ b/src/deh_mapping.c
@@ -89,8 +89,8 @@
     return false;
 }
 
-void DEH_StructMD5Sum(md5_context_t *context, deh_mapping_t *mapping,
-                      void *structptr)
+void DEH_StructSHA1Sum(sha1_context_t *context, deh_mapping_t *mapping,
+                       void *structptr)
 {
     int i;
 
@@ -115,13 +115,13 @@
         switch (entry->size)
         {
             case 1:
-                MD5_UpdateInt32(context, *((uint8_t *) location));
+                SHA1_UpdateInt32(context, *((uint8_t *) location));
                 break;
             case 2:
-                MD5_UpdateInt32(context, *((uint16_t *) location));
+                SHA1_UpdateInt32(context, *((uint16_t *) location));
                 break;
             case 4:
-                MD5_UpdateInt32(context, *((uint32_t *) location));
+                SHA1_UpdateInt32(context, *((uint32_t *) location));
                 break;
             default:
                 I_Error("Unknown dehacked mapping field type for '%s' (BUG)", 
--- a/src/deh_mapping.h
+++ b/src/deh_mapping.h
@@ -31,7 +31,7 @@
 
 #include "doomtype.h"
 #include "deh_io.h"
-#include "md5.h"
+#include "sha1.h"
 
 #define DEH_BEGIN_MAPPING(mapping_name, structname)           \
     static structname deh_mapping_base;                       \
@@ -83,8 +83,8 @@
 
 boolean DEH_SetMapping(deh_context_t *context, deh_mapping_t *mapping, 
                        void *structptr, char *name, int value);
-void DEH_StructMD5Sum(md5_context_t *context, deh_mapping_t *mapping,
-                      void *structptr);
+void DEH_StructSHA1Sum(sha1_context_t *context, deh_mapping_t *mapping,
+                       void *structptr);
 
 #endif /* #ifndef DEH_MAPPING_H */
 
--- a/src/deh_misc.c
+++ b/src/deh_misc.c
@@ -216,13 +216,13 @@
     DEH_Warning(context, "Unknown Misc variable '%s'", variable_name);
 }
 
-static void DEH_MiscMD5Sum(md5_context_t *context)
+static void DEH_MiscSHA1Sum(sha1_context_t *context)
 {
     unsigned int i;
 
     for (i=0; i<arrlen(misc_settings); ++i)
     {
-        MD5_UpdateInt32(context, *misc_settings[i].value);
+        SHA1_UpdateInt32(context, *misc_settings[i].value);
     }
 }
 
@@ -233,6 +233,6 @@
     DEH_MiscStart,
     DEH_MiscParseLine,
     NULL,
-    DEH_MiscMD5Sum,
+    DEH_MiscSHA1Sum,
 };
 
--- a/src/deh_ptr.c
+++ b/src/deh_ptr.c
@@ -129,13 +129,13 @@
     }
 }
 
-static void DEH_PointerMD5Sum(md5_context_t *context)
+static void DEH_PointerSHA1Sum(sha1_context_t *context)
 {
     int i;
 
     for (i=0; i<NUMSTATES; ++i)
     {
-        MD5_UpdateInt32(context, CodePointerIndex(&states[i].action));
+        SHA1_UpdateInt32(context, CodePointerIndex(&states[i].action));
     }
 }
 
@@ -146,6 +146,6 @@
     DEH_PointerStart,
     DEH_PointerParseLine,
     NULL,
-    DEH_PointerMD5Sum,
+    DEH_PointerSHA1Sum,
 };
 
--- a/src/deh_thing.c
+++ b/src/deh_thing.c
@@ -118,13 +118,13 @@
     DEH_SetMapping(context, &thing_mapping, mobj, variable_name, ivalue);
 }
 
-static void DEH_ThingMD5Sum(md5_context_t *context)
+static void DEH_ThingSHA1Sum(sha1_context_t *context)
 {
     int i;
 
     for (i=0; i<NUMMOBJTYPES; ++i)
     {
-        DEH_StructMD5Sum(context, &thing_mapping, &mobjinfo[i]);
+        DEH_StructSHA1Sum(context, &thing_mapping, &mobjinfo[i]);
     }
 }
 
@@ -135,6 +135,6 @@
     DEH_ThingStart,
     DEH_ThingParseLine,
     NULL,
-    DEH_ThingMD5Sum,
+    DEH_ThingSHA1Sum,
 };
 
--- a/src/deh_weapon.c
+++ b/src/deh_weapon.c
@@ -88,13 +88,13 @@
     DEH_SetMapping(context, &weapon_mapping, weapon, variable_name, ivalue);
 }
 
-static void DEH_WeaponMD5Sum(md5_context_t *context)
+static void DEH_WeaponSHA1Sum(sha1_context_t *context)
 {
     int i;
 
     for (i=0; i<NUMWEAPONS ;++i)
     {
-        DEH_StructMD5Sum(context, &weapon_mapping, &weaponinfo[i]);
+        DEH_StructSHA1Sum(context, &weapon_mapping, &weaponinfo[i]);
     }
 }
 
@@ -105,6 +105,6 @@
     DEH_WeaponStart,
     DEH_WeaponParseLine,
     NULL,
-    DEH_WeaponMD5Sum,
+    DEH_WeaponSHA1Sum,
 };
 
--- a/src/md5.c
+++ /dev/null
@@ -1,265 +1,0 @@
-/*
- * This code implements the MD5 message-digest algorithm.
- * The algorithm is due to Ron Rivest.  This code was
- * written by Colin Plumb in 1993, no copyright is claimed.
- * This code is in the public domain; do with it what you wish.
- *
- * Equivalent code is available from RSA Data Security, Inc.
- * This code has been tested against that, and is equivalent,
- * except that you don't need to include two pages of legalese
- * with every copy.
- *
- * To compute the message digest of a chunk of bytes, declare an
- * MD5Context structure, pass it to MD5_Init, call MD5_Update as
- * needed on buffers full of bytes, and then call MD5_Final, which
- * will fill a supplied 16-byte array with the digest.
- *
- * Changed so as no longer to depend on Colin Plumb's `usual.h' header
- * definitions; now uses stuff from dpkg's config.h.
- *  - Ian Jackson <[email protected]>.
- * Still in the public domain.
- */
-
-#include "doomdef.h"
-#include "i_swap.h"
-
-#include <string.h>             /* for memcpy() */
-#include <sys/types.h>          /* for stupid systems */
-
-#include "md5.h"
-
-#ifdef SYS_LITTLE_ENDIAN
-
-// Little endian system - no byte swapping required
-
-#define ByteSwapBlock(x, y)
-
-#else
-
-void ByteSwapBlock(uint32_t *buf, unsigned words)
-{
-        byte *p = (byte *)buf;
-
-        do {
-                *buf++ = (uint32_t)((unsigned)p[3] << 8 | p[2]) << 16 |
-                        ((unsigned)p[1] << 8 | p[0]);
-                p += 4;
-        } while (--words);
-}
-
-#endif /* #ifndef SYS_LITTLE_ENDIAN */
-
-/*
- * Start MD5 accumulation.  Set bit count to 0 and buffer to mysterious
- * initialization constants.
- */
-void
-MD5_Init(md5_context_t *ctx)
-{
-        ctx->buf[0] = 0x67452301;
-        ctx->buf[1] = 0xefcdab89;
-        ctx->buf[2] = 0x98badcfe;
-        ctx->buf[3] = 0x10325476;
-
-        ctx->bytes[0] = 0;
-        ctx->bytes[1] = 0;
-}
-
-/*
- * Update context to reflect the concatenation of another buffer full
- * of bytes.
- */
-void
-MD5_Update(md5_context_t *ctx, byte const *buf, unsigned len)
-{
-        uint32_t t;
-
-        /* Update byte count */
-
-        t = ctx->bytes[0];
-        if ((ctx->bytes[0] = t + len) < t)
-                ctx->bytes[1]++;        /* Carry from low to high */
-
-        t = 64 - (t & 0x3f);    /* Space available in ctx->in (at least 1) */
-        if (t > len) {
-                memcpy((byte *)ctx->in + 64 - t, buf, len);
-                return;
-        }
-        /* First chunk is an odd size */
-        memcpy((byte *)ctx->in + 64 - t, buf, t);
-        ByteSwapBlock(ctx->in, 16);
-        MD5_Transform(ctx->buf, ctx->in);
-        buf += t;
-        len -= t;
-
-        /* Process data in 64-byte chunks */
-        while (len >= 64) {
-                memcpy(ctx->in, buf, 64);
-                ByteSwapBlock(ctx->in, 16);
-                MD5_Transform(ctx->buf, ctx->in);
-                buf += 64;
-                len -= 64;
-        }
-
-        /* Handle any remaining bytes of data. */
-        memcpy(ctx->in, buf, len);
-}
-
-void MD5_UpdateInt32(md5_context_t *context, unsigned int val)
-{
-        byte buf[4];
-
-        buf[0] = (val >> 24) & 0xff;
-        buf[1] = (val >> 16) & 0xff;
-        buf[2] = (val >> 8) & 0xff;
-        buf[3] = val & 0xff;
-
-        MD5_Update(context, buf, 4);
-}
-
-void MD5_UpdateString(md5_context_t *context, char *str)
-{
-        MD5_Update(context, (byte *) str, strlen(str) + 1);
-}
-
-/*
- * Final wrapup - pad to 64-byte boundary with the bit pattern 
- * 1 0* (64-bit count of bits processed, MSB-first)
- */
-void
-MD5_Final(byte digest[16], md5_context_t *ctx)
-{
-        int count = ctx->bytes[0] & 0x3f;       /* Number of bytes in ctx->in */
-        byte *p = (byte *)ctx->in + count;
-
-        /* Set the first char of padding to 0x80.  There is always room. */
-        *p++ = 0x80;
-
-        /* Bytes of padding needed to make 56 bytes (-8..55) */
-        count = 56 - 1 - count;
-
-        if (count < 0) {        /* Padding forces an extra block */
-                memset(p, 0, count + 8);
-                ByteSwapBlock(ctx->in, 16);
-                MD5_Transform(ctx->buf, ctx->in);
-                p = (byte *)ctx->in;
-                count = 56;
-        }
-        memset(p, 0, count);
-        ByteSwapBlock(ctx->in, 14);
-
-        /* Append length in bits and transform */
-        ctx->in[14] = ctx->bytes[0] << 3;
-        ctx->in[15] = ctx->bytes[1] << 3 | ctx->bytes[0] >> 29;
-        MD5_Transform(ctx->buf, ctx->in);
-
-        ByteSwapBlock(ctx->buf, 4);
-        memcpy(digest, ctx->buf, 16);
-        memset(ctx, 0, sizeof(ctx));    /* In case it's sensitive */
-}
-
-#ifndef ASM_MD5
-
-/* The four core functions - F1 is optimized somewhat */
-
-/* #define F1(x, y, z) (x & y | ~x & z) */
-#define F1(x, y, z) (z ^ (x & (y ^ z)))
-#define F2(x, y, z) F1(z, x, y)
-#define F3(x, y, z) (x ^ y ^ z)
-#define F4(x, y, z) (y ^ (x | ~z))
-
-/* This is the central step in the MD5 algorithm. */
-#define MD5STEP(f,w,x,y,z,in,s) \
-         (w += f(x,y,z) + in, w = (w<<s | w>>(32-s)) + x)
-
-/*
- * The core of the MD5 algorithm, this alters an existing MD5 hash to
- * reflect the addition of 16 longwords of new data.  MD5_Update blocks
- * the data and converts bytes into longwords for this routine.
- */
-void
-MD5_Transform(uint32_t buf[4], uint32_t const in[16])
-{
-        register uint32_t a, b, c, d;
-
-        a = buf[0];
-        b = buf[1];
-        c = buf[2];
-        d = buf[3];
-
-        MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7);
-        MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12);
-        MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17);
-        MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22);
-        MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7);
-        MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12);
-        MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17);
-        MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22);
-        MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7);
-        MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12);
-        MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
-        MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);
-        MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7);
-        MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12);
-        MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);
-        MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);
-
-        MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5);
-        MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9);
-        MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);
-        MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);
-        MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5);
-        MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9);
-        MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
-        MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);
-        MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5);
-        MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9);
-        MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14);
-        MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20);
-        MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5);
-        MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);
-        MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14);
-        MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);
-
-        MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4);
-        MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11);
-        MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
-        MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);
-        MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4);
-        MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);
-        MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);
-        MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
-        MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4);
-        MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11);
-        MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16);
-        MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23);
-        MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4);
-        MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
-        MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
-        MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23);
-
-        MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6);
-        MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10);
-        MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15);
-        MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21);
-        MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6);
-        MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);
-        MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);
-        MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21);
-        MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);
-        MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
-        MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15);
-        MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
-        MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6);
-        MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);
-        MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);
-        MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21);
-
-        buf[0] += a;
-        buf[1] += b;
-        buf[2] += c;
-        buf[3] += d;
-}
-
-#endif
-
--- a/src/md5.h
+++ /dev/null
@@ -1,45 +1,0 @@
-/*
- * This is the header file for the MD5 message-digest algorithm.
- * The algorithm is due to Ron Rivest.  This code was
- * written by Colin Plumb in 1993, no copyright is claimed.
- * This code is in the public domain; do with it what you wish.
- *
- * Equivalent code is available from RSA Data Security, Inc.
- * This code has been tested against that, and is equivalent,
- * except that you don't need to include two pages of legalese
- * with every copy.
- *
- * To compute the message digest of a chunk of bytes, declare an
- * md5_context_s structure, pass it to MD5_Init, call MD5_Update as
- * needed on buffers full of bytes, and then call MD5_Final, which
- * will fill a supplied 16-byte array with the digest.
- *
- * Changed so as no longer to depend on Colin Plumb's `usual.h'
- * header definitions; now uses stuff from dpkg's config.h
- *  - Ian Jackson <[email protected]>.
- * Still in the public domain.
- */
-
-#ifndef MD5_H
-#define MD5_H
-
-#include "doomtype.h"
-
-typedef struct md5_context_s md5_context_t;
-typedef byte md5_digest_t[16];
-
-struct md5_context_s {
-        uint32_t buf[4];
-        uint32_t bytes[2];
-        uint32_t in[16];
-};
-
-void MD5_Init(md5_context_t *context);
-void MD5_Update(md5_context_t *context, byte const *buf, unsigned len);
-void MD5_UpdateInt32(md5_context_t *context, unsigned int val);
-void MD5_UpdateString(md5_context_t *context, char *str);
-void MD5_Final(unsigned char digest[16], md5_context_t *context);
-void MD5_Transform(uint32_t buf[4], uint32_t const in[16]);
-
-#endif /* !MD5_H */
-
--- a/src/net_client.c
+++ b/src/net_client.c
@@ -128,11 +128,11 @@
 char net_player_addresses[MAXPLAYERS][MAXPLAYERNAME];
 char net_player_names[MAXPLAYERS][MAXPLAYERNAME];
 
-// MD5 checksums of the wad directory and dehacked data that the server
+// SHA1 checksums of the wad directory and dehacked data that the server
 // has sent to us.
 
-md5_digest_t net_server_wad_md5sum;
-md5_digest_t net_server_deh_md5sum;
+sha1_digest_t net_server_wad_sha1sum;
+sha1_digest_t net_server_deh_sha1sum;
 
 // Is the server a freedoom game?
 
@@ -172,8 +172,8 @@
 
 // Hash checksums of our wad directory and dehacked data.
 
-md5_digest_t net_local_wad_md5sum;
-md5_digest_t net_local_deh_md5sum;
+sha1_digest_t net_local_wad_sha1sum;
+sha1_digest_t net_local_deh_sha1sum;
 
 // Are we playing with the freedoom IWAD?
 
@@ -558,7 +558,7 @@
     signed int player_number;
     char *player_names[MAXPLAYERS];
     char *player_addr[MAXPLAYERS];
-    md5_digest_t wad_md5sum, deh_md5sum;
+    sha1_digest_t wad_sha1sum, deh_sha1sum;
     unsigned int server_is_freedoom;
     size_t i;
 
@@ -601,8 +601,8 @@
         }
     }
 
-    if (!NET_ReadMD5Sum(packet, wad_md5sum)
-     || !NET_ReadMD5Sum(packet, deh_md5sum)
+    if (!NET_ReadSHA1Sum(packet, wad_sha1sum)
+     || !NET_ReadSHA1Sum(packet, deh_sha1sum)
      || !NET_ReadInt8(packet, &server_is_freedoom))
     {
         return;
@@ -621,8 +621,8 @@
         net_player_addresses[i][MAXPLAYERNAME-1] = '\0';
     }
 
-    memcpy(net_server_wad_md5sum, wad_md5sum, sizeof(md5_digest_t));
-    memcpy(net_server_deh_md5sum, deh_md5sum, sizeof(md5_digest_t));
+    memcpy(net_server_wad_sha1sum, wad_sha1sum, sizeof(sha1_digest_t));
+    memcpy(net_server_deh_sha1sum, deh_sha1sum, sizeof(sha1_digest_t));
     net_server_is_freedoom = server_is_freedoom;
 
     net_client_received_wait_data = true;
@@ -1116,8 +1116,8 @@
     NET_WriteInt16(packet, gamemission);
     NET_WriteInt8(packet, lowres_turn);
     NET_WriteInt8(packet, drone);
-    NET_WriteMD5Sum(packet, net_local_wad_md5sum);
-    NET_WriteMD5Sum(packet, net_local_deh_md5sum);
+    NET_WriteSHA1Sum(packet, net_local_wad_sha1sum);
+    NET_WriteSHA1Sum(packet, net_local_deh_sha1sum);
     NET_WriteInt8(packet, net_local_is_freedoom);
     NET_WriteString(packet, net_player_name);
     NET_Conn_SendPacket(&client_connection, packet);
@@ -1142,8 +1142,8 @@
 
     // Read checksums of our WAD directory and dehacked information
 
-    W_Checksum(net_local_wad_md5sum);
-    DEH_Checksum(net_local_deh_md5sum);
+    W_Checksum(net_local_wad_sha1sum);
+    DEH_Checksum(net_local_deh_sha1sum);
 
     // Are we playing with the Freedoom IWAD?
 
--- a/src/net_client.h
+++ b/src/net_client.h
@@ -27,7 +27,7 @@
 #include "doomdef.h"
 #include "doomtype.h"
 #include "d_ticcmd.h"
-#include "md5.h"
+#include "sha1.h"
 #include "net_defs.h"
 
 #define MAXPLAYERNAME 30
@@ -51,11 +51,11 @@
 extern int net_player_number;
 extern char *net_player_name;
 
-extern md5_digest_t net_server_wad_md5sum;
-extern md5_digest_t net_server_deh_md5sum;
+extern sha1_digest_t net_server_wad_sha1sum;
+extern sha1_digest_t net_server_deh_sha1sum;
 extern unsigned int net_server_is_freedoom;
-extern md5_digest_t net_local_wad_md5sum;
-extern md5_digest_t net_local_deh_md5sum;
+extern sha1_digest_t net_local_wad_sha1sum;
+extern sha1_digest_t net_local_deh_sha1sum;
 extern unsigned int net_local_is_freedoom;
 
 
--- a/src/net_gui.c
+++ b/src/net_gui.c
@@ -153,13 +153,13 @@
     TXT_SetWindowAction(window, TXT_HORIZ_RIGHT, startgame);
 }
 
-static void PrintMD5Digest(char *s, byte *digest)
+static void PrintSHA1Digest(char *s, byte *digest)
 {
     unsigned int i;
 
     printf("%s: ", s);
 
-    for (i=0; i<sizeof(md5_digest_t); ++i)
+    for (i=0; i<sizeof(sha1_digest_t); ++i)
     {
         printf("%02x", digest[i]);
     }
@@ -167,7 +167,7 @@
     printf("\n");
 }
 
-static void CheckMD5Sums(void)
+static void CheckSHA1Sums(void)
 {
     boolean correct_wad, correct_deh;
     boolean same_freedoom;
@@ -178,10 +178,10 @@
         return;
     }
 
-    correct_wad = memcmp(net_local_wad_md5sum, net_server_wad_md5sum, 
-                         sizeof(md5_digest_t)) == 0;
-    correct_deh = memcmp(net_local_deh_md5sum, net_server_deh_md5sum, 
-                         sizeof(md5_digest_t)) == 0;
+    correct_wad = memcmp(net_local_wad_sha1sum, net_server_wad_sha1sum, 
+                         sizeof(sha1_digest_t)) == 0;
+    correct_deh = memcmp(net_local_deh_sha1sum, net_server_deh_sha1sum, 
+                         sizeof(sha1_digest_t)) == 0;
     same_freedoom = net_server_is_freedoom == net_local_is_freedoom;
 
     if (correct_wad && correct_deh && same_freedoom)
@@ -191,9 +191,9 @@
 
     if (!correct_wad)
     {
-        printf("Warning: WAD MD5 does not match server:\n");
-        PrintMD5Digest("Local", net_local_wad_md5sum);
-        PrintMD5Digest("Server", net_server_wad_md5sum);
+        printf("Warning: WAD SHA1 does not match server:\n");
+        PrintSHA1Digest("Local", net_local_wad_sha1sum);
+        PrintSHA1Digest("Server", net_server_wad_sha1sum);
     }
 
     if (!same_freedoom)
@@ -206,9 +206,9 @@
 
     if (!correct_deh)
     {
-        printf("Warning: Dehacked MD5 does not match server:\n");
-        PrintMD5Digest("Local", net_local_deh_md5sum);
-        PrintMD5Digest("Server", net_server_deh_md5sum);
+        printf("Warning: Dehacked SHA1 does not match server:\n");
+        PrintSHA1Digest("Local", net_local_deh_sha1sum);
+        PrintSHA1Digest("Server", net_server_deh_sha1sum);
     }
 
     window = TXT_NewWindow("WARNING");
@@ -274,7 +274,7 @@
     while (net_waiting_for_start)
     {
         UpdateGUI();
-        CheckMD5Sums();
+        CheckSHA1Sums();
 
         TXT_DispatchEvents();
         TXT_DrawDesktop();
--- a/src/net_server.c
+++ b/src/net_server.c
@@ -100,10 +100,10 @@
 
     boolean drone;
 
-    // MD5 hash sums of the client's WAD directory and dehacked data
+    // SHA1 hash sums of the client's WAD directory and dehacked data
 
-    md5_digest_t wad_md5sum;
-    md5_digest_t deh_md5sum;
+    sha1_digest_t wad_sha1sum;
+    sha1_digest_t deh_sha1sum;
 
     // Is this client is playing with the Freedoom IWAD?
 
@@ -481,7 +481,7 @@
     unsigned int cl_recording_lowres;
     unsigned int cl_drone;
     unsigned int is_freedoom;
-    md5_digest_t deh_md5sum, wad_md5sum;
+    sha1_digest_t deh_sha1sum, wad_sha1sum;
     char *player_name;
     char *client_version;
     int i;
@@ -535,8 +535,8 @@
      || !NET_ReadInt16(packet, &cl_gamemission)
      || !NET_ReadInt8(packet, &cl_recording_lowres)
      || !NET_ReadInt8(packet, &cl_drone)
-     || !NET_ReadMD5Sum(packet, wad_md5sum)
-     || !NET_ReadMD5Sum(packet, deh_md5sum)
+     || !NET_ReadSHA1Sum(packet, wad_sha1sum)
+     || !NET_ReadSHA1Sum(packet, deh_sha1sum)
      || !NET_ReadInt8(packet, &is_freedoom))
     {
         return;
@@ -628,10 +628,10 @@
             sv_gamemission = cl_gamemission;
         }
 
-        // Save the MD5 checksums
+        // Save the SHA1 checksums
 
-        memcpy(client->wad_md5sum, wad_md5sum, sizeof(md5_digest_t));
-        memcpy(client->deh_md5sum, deh_md5sum, sizeof(md5_digest_t));
+        memcpy(client->wad_sha1sum, wad_sha1sum, sizeof(sha1_digest_t));
+        memcpy(client->deh_sha1sum, deh_sha1sum, sizeof(sha1_digest_t));
         client->is_freedoom = is_freedoom;
 
         // Check the connecting client is playing the same game as all
@@ -1280,14 +1280,14 @@
 
     if (controller != NULL)
     {
-        NET_WriteMD5Sum(packet, controller->wad_md5sum);
-        NET_WriteMD5Sum(packet, controller->deh_md5sum);
+        NET_WriteSHA1Sum(packet, controller->wad_sha1sum);
+        NET_WriteSHA1Sum(packet, controller->deh_sha1sum);
         NET_WriteInt8(packet, controller->is_freedoom);
     }
     else
     {
-        NET_WriteMD5Sum(packet, client->wad_md5sum);
-        NET_WriteMD5Sum(packet, client->deh_md5sum);
+        NET_WriteSHA1Sum(packet, client->wad_sha1sum);
+        NET_WriteSHA1Sum(packet, client->deh_sha1sum);
         NET_WriteInt8(packet, client->is_freedoom);
     }
 
--- a/src/net_structrw.c
+++ b/src/net_structrw.c
@@ -321,12 +321,12 @@
     }
 }
 
-boolean NET_ReadMD5Sum(net_packet_t *packet, md5_digest_t digest)
+boolean NET_ReadSHA1Sum(net_packet_t *packet, sha1_digest_t digest)
 {
     unsigned int b;
     int i;
 
-    for (i=0; i<16; ++i)
+    for (i=0; i<sizeof(sha1_digest_t); ++i)
     {
         if (!NET_ReadInt8(packet, &b))
         {
@@ -339,11 +339,11 @@
     return true;
 }
 
-void NET_WriteMD5Sum(net_packet_t *packet, md5_digest_t digest)
+void NET_WriteSHA1Sum(net_packet_t *packet, sha1_digest_t digest)
 {
     int i;
 
-    for (i=0; i<16; ++i)
+    for (i=0; i<sizeof(sha1_digest_t); ++i)
     {
         NET_WriteInt8(packet, digest[i]);
     }
--- a/src/net_structrw.h
+++ b/src/net_structrw.h
@@ -22,7 +22,7 @@
 #ifndef NET_STRUCTRW_H
 #define NET_STRUCTRW_H
 
-#include "md5.h"
+#include "sha1.h"
 #include "net_defs.h"
 #include "net_packet.h"
 
@@ -40,8 +40,8 @@
 boolean NET_ReadFullTiccmd(net_packet_t *packet, net_full_ticcmd_t *cmd, boolean lowres_turn);
 void NET_WriteFullTiccmd(net_packet_t *packet, net_full_ticcmd_t *cmd, boolean lowres_turn);
 
-boolean NET_ReadMD5Sum(net_packet_t *packet, md5_digest_t digest);
-void NET_WriteMD5Sum(net_packet_t *packet, md5_digest_t digest);
+boolean NET_ReadSHA1Sum(net_packet_t *packet, sha1_digest_t digest);
+void NET_WriteSHA1Sum(net_packet_t *packet, sha1_digest_t digest);
 
 #endif /* #ifndef NET_STRUCTRW_H */
 
--- /dev/null
+++ b/src/sha1.c
@@ -1,0 +1,319 @@
+/* sha1.c - SHA1 hash function
+ *	Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+ *
+ * Please see below for more legal information!
+ *
+ * This file is part of GnuPG.
+ *
+ * GnuPG is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GnuPG is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+/*  Test vectors:
+ *
+ *  "abc"
+ *  A999 3E36 4706 816A BA3E  2571 7850 C26C 9CD0 D89D
+ *
+ *  "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
+ *  8498 3E44 1C3B D26E BAAE  4AA1 F951 29E5 E546 70F1
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#include "i_swap.h"
+#include "sha1.h"
+
+void SHA1_Init(sha1_context_t *hd)
+{
+    hd->h0 = 0x67452301;
+    hd->h1 = 0xefcdab89;
+    hd->h2 = 0x98badcfe;
+    hd->h3 = 0x10325476;
+    hd->h4 = 0xc3d2e1f0;
+    hd->nblocks = 0;
+    hd->count = 0;
+}
+
+
+/****************
+ * Transform the message X which consists of 16 32-bit-words
+ */
+static void Transform(sha1_context_t *hd, byte *data)
+{
+    uint32_t a,b,c,d,e,tm;
+    uint32_t x[16];
+
+    /* get values from the chaining vars */
+    a = hd->h0;
+    b = hd->h1;
+    c = hd->h2;
+    d = hd->h3;
+    e = hd->h4;
+
+#ifdef SYS_BIG_ENDIAN
+    memcpy(x, data, 64);
+#else
+    {
+        int i;
+        byte *p2;
+        for(i=0, p2=(byte*)x; i < 16; i++, p2 += 4 )
+        {
+            p2[3] = *data++;
+            p2[2] = *data++;
+            p2[1] = *data++;
+            p2[0] = *data++;
+        }
+    }
+#endif
+
+
+#define K1  0x5A827999L
+#define K2  0x6ED9EBA1L
+#define K3  0x8F1BBCDCL
+#define K4  0xCA62C1D6L
+#define F1(x,y,z)   ( z ^ ( x & ( y ^ z ) ) )
+#define F2(x,y,z)   ( x ^ y ^ z )
+#define F3(x,y,z)   ( ( x & y ) | ( z & ( x | y ) ) )
+#define F4(x,y,z)   ( x ^ y ^ z )
+
+#define rol(x,n) ( ((x) << (n)) | ((x) >> (32-(n))) )
+
+#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)
+    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) );
+
+    /* update chainig vars */
+    hd->h0 += a;
+    hd->h1 += b;
+    hd->h2 += c;
+    hd->h3 += d;
+    hd->h4 += e;
+}
+
+
+/* Update the message digest with the contents
+ * of INBUF with length INLEN.
+ */
+void SHA1_Update(sha1_context_t *hd, byte *inbuf, size_t inlen)
+{
+    if (hd->count == 64)
+    {
+        /* flush the buffer */
+	Transform(hd, hd->buf);
+	hd->count = 0;
+	hd->nblocks++;
+    }
+    if (!inbuf)
+	return;
+    if (hd->count)
+    {
+	for (; inlen && hd->count < 64; inlen--)
+	    hd->buf[hd->count++] = *inbuf++;
+	SHA1_Update(hd, NULL, 0);
+	if (!inlen)
+	    return;
+    }
+
+    while (inlen >= 64)
+    {
+	Transform(hd, inbuf);
+	hd->count = 0;
+	hd->nblocks++;
+	inlen -= 64;
+	inbuf += 64;
+    }
+    for (; inlen && hd->count < 64; inlen--)
+	hd->buf[hd->count++] = *inbuf++;
+}
+
+
+/* The routine final terminates the computation and
+ * returns the digest.
+ * The handle is prepared for a new cycle, but adding bytes to the
+ * handle will the destroy the returned buffer.
+ * Returns: 20 bytes representing the digest.
+ */
+
+void SHA1_Final(sha1_digest_t digest, sha1_context_t *hd)
+{
+    uint32_t t, msb, lsb;
+    byte *p;
+
+    SHA1_Update(hd, NULL, 0); /* flush */;
+
+    t = hd->nblocks;
+    /* multiply by 64 to make a byte count */
+    lsb = t << 6;
+    msb = t >> 26;
+    /* add the count */
+    t = lsb;
+    if ((lsb += hd->count) < t)
+	msb++;
+    /* multiply by 8 to make a bit count */
+    t = lsb;
+    lsb <<= 3;
+    msb <<= 3;
+    msb |= t >> 29;
+
+    if (hd->count < 56)
+    {
+        /* enough room */
+	hd->buf[hd->count++] = 0x80; /* pad */
+	while (hd->count < 56)
+	    hd->buf[hd->count++] = 0;  /* pad */
+    }
+    else
+    {
+        /* need one extra block */
+	hd->buf[hd->count++] = 0x80; /* pad character */
+	while (hd->count < 64)
+	    hd->buf[hd->count++] = 0;
+	SHA1_Update(hd, NULL, 0);  /* flush */;
+	memset(hd->buf, 0, 56 ); /* fill next block with zeroes */
+    }
+    /* append the 64 bit count */
+    hd->buf[56] = msb >> 24;
+    hd->buf[57] = msb >> 16;
+    hd->buf[58] = msb >>  8;
+    hd->buf[59] = msb	   ;
+    hd->buf[60] = lsb >> 24;
+    hd->buf[61] = lsb >> 16;
+    hd->buf[62] = lsb >>  8;
+    hd->buf[63] = lsb	   ;
+    Transform(hd, hd->buf);
+
+    p = hd->buf;
+#ifdef SYS_BIG_ENDIAN
+#define X(a) do { *(uint32_t*)p = hd->h##a ; p += 4; } while(0)
+#else /* little endian */
+#define X(a) do { *p++ = hd->h##a >> 24; *p++ = hd->h##a >> 16;	 \
+		      *p++ = hd->h##a >> 8; *p++ = hd->h##a; } while(0)
+#endif
+    X(0);
+    X(1);
+    X(2);
+    X(3);
+    X(4);
+#undef X
+
+    memcpy(digest, hd->buf, sizeof(sha1_digest_t));
+}
+
+void SHA1_UpdateInt32(sha1_context_t *context, unsigned int val)
+{
+    byte buf[4];
+
+    buf[0] = (val >> 24) & 0xff;
+    buf[1] = (val >> 16) & 0xff;
+    buf[2] = (val >> 8) & 0xff;
+    buf[3] = val & 0xff;
+
+    SHA1_Update(context, buf, 4);
+}
+
+void SHA1_UpdateString(sha1_context_t *context, char *str)
+{
+    SHA1_Update(context, (byte *) str, strlen(str) + 1);
+}
+
--- a/src/w_checksum.c
+++ b/src/w_checksum.c
@@ -27,7 +27,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include "md5.h"
+#include "sha1.h"
 #include "w_checksum.h"
 #include "w_wad.h"
 
@@ -60,35 +60,35 @@
     return result;
 }
 
-static void ChecksumAddLump(md5_context_t *md5_context, lumpinfo_t *lump)
+static void ChecksumAddLump(sha1_context_t *sha1_context, lumpinfo_t *lump)
 {
     char buf[9];
 
     strncpy(buf, lump->name, 8);
     buf[8] = '\0';
-    MD5_UpdateString(md5_context, buf);
-    MD5_UpdateInt32(md5_context, GetFileNumber(lump->wad_file));
-    MD5_UpdateInt32(md5_context, lump->position);
-    MD5_UpdateInt32(md5_context, lump->size);
+    SHA1_UpdateString(sha1_context, buf);
+    SHA1_UpdateInt32(sha1_context, GetFileNumber(lump->wad_file));
+    SHA1_UpdateInt32(sha1_context, lump->position);
+    SHA1_UpdateInt32(sha1_context, lump->size);
 }
 
-void W_Checksum(md5_digest_t digest)
+void W_Checksum(sha1_digest_t digest)
 {
-    md5_context_t md5_context;
+    sha1_context_t sha1_context;
     unsigned int i;
 
-    MD5_Init(&md5_context);
+    SHA1_Init(&sha1_context);
 
     num_open_wadfiles = 0;
 
     // Go through each entry in the WAD directory, adding information
-    // about each entry to the MD5 hash.
+    // about each entry to the SHA1 hash.
 
     for (i=0; i<numlumps; ++i)
     {
-        ChecksumAddLump(&md5_context, &lumpinfo[i]);
+        ChecksumAddLump(&sha1_context, &lumpinfo[i]);
     }
     
-    MD5_Final(digest, &md5_context);
+    SHA1_Final(digest, &sha1_context);
 }
 
--- a/src/w_checksum.h
+++ b/src/w_checksum.h
@@ -28,7 +28,7 @@
 
 #include "doomtype.h"
 
-extern void W_Checksum(md5_digest_t digest);
+extern void W_Checksum(sha1_digest_t digest);
 
 #endif /* #ifndef W_CHECKSUM_H */