]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
MD5 support for Squid's cache keys!
authorwessels <>
Tue, 2 Dec 1997 12:06:36 +0000 (12:06 +0000)
committerwessels <>
Tue, 2 Dec 1997 12:06:36 +0000 (12:06 +0000)
- moved md5.c from snmplib to lib
- changed md5.c's wierd typedefs (UINT4, POINTER)
- moved u_num32 typedefs to config.h, deleted from squid.h and
  asn1.h.
- more I'm sure

include/asn1.h
include/md5.h
lib/Makefile.in
lib/md5.c [new file with mode: 0644]
snmplib/snmp_api.c
src/Makefile.in
src/cf_gen.cc
src/squid.h
src/store.cc
src/store_key_md5.cc [new file with mode: 0644]
src/typedefs.h

index 8d0298fa8c96fe579cb4749d5b0190bc8e5b6574..1da07f8eaf3baca29f704bb634228a4c9c81b2a5 100644 (file)
@@ -68,19 +68,6 @@ typedef u_char oid;
 #define IS_CONSTRUCTOR(byte)   ((byte) & ASN_CONSTRUCTOR)
 #define IS_EXTENSION_ID(byte)  (((byte) & ASN_EXTENSION_ID) == ASN_EXTENSION_ID)
 
-/* 32 bit integer compatability hack */
-#if SIZEOF_INT == 4
-typedef int num32;
-typedef unsigned int u_num32;
-#elif SIZEOF_LONG == 4
-typedef long num32;
-typedef unsigned long u_num32;
-#else
-typedef long num32;            /* assume that long's are 32bit */
-typedef unsigned long u_num32;
-#endif
-#define NUM32LEN sizeof(num32) /* this should always be 4 */
-
 /* 
  * internal 64 bit representation:
  */
index 7e71b5d78c8737fc90fc6454767f3c8cd82ab82a..26a678998f8515bd8e85a5d6806b47aadf3f327c 100644 (file)
@@ -1,36 +1,5 @@
-/* taken from RFC-1321/Appendices A.1/A.2 */
-
-/* GLOBAL.H - RSAREF types and constants
- */
-
-/* PROTOTYPES should be set to one if and only if the compiler supports
- * function argument prototyping.
- * The following makes PROTOTYPES default to 0 if it has not already
- * been defined with C compiler flags.
- */
-#ifndef PROTOTYPES
-#define PROTOTYPES 0
-#endif
-
-/* POINTER defines a generic pointer type */
-typedef unsigned char *POINTER;
-
-/* UINT2 defines a two byte word */
-typedef unsigned short int UINT2;
-
-/* UINT4 defines a four byte word */
-typedef unsigned long int UINT4;
-
-/* PROTO_LIST is defined depending on how PROTOTYPES is defined above.
- * If using PROTOTYPES, then PROTO_LIST returns the list, otherwise it
- * returns an empty list.
- */
-#if PROTOTYPES
-#define PROTO_LIST(list) list
-#else
-#define PROTO_LIST(list) ()
-#endif
-
+#ifndef MD5_H
+#define MD5_H
 /* MD5.H - header file for MD5C.C
  */
 
@@ -58,12 +27,15 @@ typedef unsigned long int UINT4;
 
 /* MD5 context. */
 typedef struct {
-    UINT4 state[4];            /* state (ABCD) */
-    UINT4 count[2];            /* number of bits, modulo 2^64 (lsb first) */
+    u_num32 state[4];          /* state (ABCD) */
+    u_num32 count[2];          /* number of bits, modulo 2^64 (lsb first) */
     unsigned char buffer[64];  /* input buffer */
 } MD5_CTX;
 
-void MD5Init PROTO_LIST((MD5_CTX *));
-void MD5Update PROTO_LIST
-          ((MD5_CTX *, unsigned char *, unsigned int));
-void MD5Final PROTO_LIST((unsigned char[16], MD5_CTX *));
+void MD5Init (MD5_CTX *);
+void MD5Update (MD5_CTX *, unsigned char *, unsigned int);
+void MD5Final (unsigned char[16], MD5_CTX *);
+
+#define MD5_DIGEST_CHARS         16
+
+#endif MD5_H
index 712dd5eed00e642fb039b60b4d6f53ea1fc7cb9e..a08fbeab7486e4592f625e60188a9472e7b878d9 100644 (file)
@@ -3,7 +3,7 @@
 #
 #  Darren Hardy, hardy@cs.colorado.edu, April 1994
 #
-#  $Id: Makefile.in,v 1.26 1997/11/04 00:32:14 wessels Exp $
+#  $Id: Makefile.in,v 1.27 1997/12/02 05:06:38 wessels Exp $
 #
 prefix         = @prefix@
 srcdir         = @srcdir@
@@ -36,6 +36,7 @@ UTILOBJS      = rfc1123.o \
                  iso3307.o \
                  snprintf.o \
                  sha.o \
+                 md5.o \
                  $(LIBOBJS)
 REGEXOBJS      = GNUregex.o
 LIBS           = libmiscutil.a @LIBREGEX@
diff --git a/lib/md5.c b/lib/md5.c
new file mode 100644 (file)
index 0000000..0a3cab6
--- /dev/null
+++ b/lib/md5.c
@@ -0,0 +1,337 @@
+
+
+/* taken from RFC-1321/Appendix A.3 */
+
+/*
+ * MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm
+ */
+
+/*
+ * Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All rights
+ * reserved.
+ * 
+ * License to copy and use this software is granted provided that it is
+ * identified as the "RSA Data Security, Inc. MD5 Message-Digest Algorithm"
+ * in all material mentioning or referencing this software or this function.
+ * 
+ * License is also granted to make and use derivative works provided that such
+ * works are identified as "derived from the RSA Data Security, Inc. MD5
+ * Message-Digest Algorithm" in all material mentioning or referencing the
+ * derived work.
+ * 
+ * RSA Data Security, Inc. makes no representations concerning either the
+ * merchantability of this software or the suitability of this software for
+ * any particular purpose. It is provided "as is" without express or implied
+ * warranty of any kind.
+ * 
+ * These notices must be retained in any copies of any part of this
+ * documentation and/or software.
+ */
+
+#include "config.h"
+#include "md5.h"
+
+/*
+ * Constants for MD5Transform routine.
+ */
+#define S11 7
+#define S12 12
+#define S13 17
+#define S14 22
+#define S21 5
+#define S22 9
+#define S23 14
+#define S24 20
+#define S31 4
+#define S32 11
+#define S33 16
+#define S34 23
+#define S41 6
+#define S42 10
+#define S43 15
+#define S44 21
+
+static void MD5Transform (u_num32[4], unsigned char[64]);
+static void Encode (unsigned char *, u_num32 *, unsigned int);
+static void Decode (u_num32 *, unsigned char *, unsigned int);
+static void MD5_memcpy (char *, char *, unsigned int);
+static void MD5_memset (char *, int, unsigned int);
+
+static unsigned char PADDING[64] =
+{
+    0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+/*
+ * F, G, H and I are basic MD5 functions.
+ */
+#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
+#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
+#define H(x, y, z) ((x) ^ (y) ^ (z))
+#define I(x, y, z) ((y) ^ ((x) | (~z)))
+
+/*
+ * ROTATE_LEFT rotates x left n bits.
+ */
+#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
+
+/*
+ * FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4. Rotation is
+ * separate from addition to prevent recomputation.
+ */
+#define FF(a, b, c, d, x, s, ac) { \
+ (a) += F ((b), (c), (d)) + (x) + (u_num32)(ac); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+  }
+#define GG(a, b, c, d, x, s, ac) { \
+ (a) += G ((b), (c), (d)) + (x) + (u_num32)(ac); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+  }
+#define HH(a, b, c, d, x, s, ac) { \
+ (a) += H ((b), (c), (d)) + (x) + (u_num32)(ac); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+  }
+#define II(a, b, c, d, x, s, ac) { \
+ (a) += I ((b), (c), (d)) + (x) + (u_num32)(ac); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+  }
+
+/*
+ * MD5 initialization. Begins an MD5 operation, writing a new context.
+ */
+void
+MD5Init(MD5_CTX *context)
+{
+    context->count[0] = context->count[1] = 0;
+    /*
+     * Load magic initialization constants.
+     */
+    context->state[0] = 0x67452301;
+    context->state[1] = 0xefcdab89;
+    context->state[2] = 0x98badcfe;
+    context->state[3] = 0x10325476;
+}
+
+/*
+ * MD5 block update operation. Continues an MD5 message-digest operation,
+ * processing another message block, and updating the context.
+ */
+void
+MD5Update(MD5_CTX *context, unsigned char *input, unsigned int inputLen)
+{
+    unsigned int i, index, partLen;
+
+    /* Compute number of bytes mod 64 */
+    index = (unsigned int) ((context->count[0] >> 3) & 0x3F);
+
+    /* Update number of bits */
+    if ((context->count[0] += ((u_num32) inputLen << 3))
+       < ((u_num32) inputLen << 3))
+       context->count[1]++;
+    context->count[1] += ((u_num32) inputLen >> 29);
+
+    partLen = 64 - index;
+
+    /*
+     * Transform as many times as possible.
+     */
+    if (inputLen >= partLen) {
+       MD5_memcpy(&context->buffer[index], input, partLen);
+       MD5Transform(context->state, context->buffer);
+
+       for (i = partLen; i + 63 < inputLen; i += 64)
+           MD5Transform(context->state, &input[i]);
+
+       index = 0;
+    } else
+       i = 0;
+
+    /* Buffer remaining input */
+    MD5_memcpy
+       (&context->buffer[index], &input[i],
+       inputLen - i);
+}
+
+/*
+ * MD5 finalization. Ends an MD5 message-digest operation, writing the the
+ * message digest and zeroizing the context.
+ */
+void
+MD5Final(unsigned char digest[16], MD5_CTX *context)
+{
+    unsigned char bits[8];
+    unsigned int index, padLen;
+
+    /* Save number of bits */
+    Encode(bits, context->count, 8);
+
+    /*
+     * Pad out to 56 mod 64.
+     */
+    index = (unsigned int) ((context->count[0] >> 3) & 0x3f);
+    padLen = (index < 56) ? (56 - index) : (120 - index);
+    MD5Update(context, PADDING, padLen);
+
+    /* Append length (before padding) */
+    MD5Update(context, bits, 8);
+    /* Store state in digest */
+    Encode(digest, context->state, 16);
+
+    /*
+     * Zeroize sensitive information.
+     */
+    MD5_memset((char *)context, 0, sizeof(*context));
+}
+
+/*
+ * MD5 basic transformation. Transforms state based on block.
+ */
+static void
+MD5Transform(u_num32 state[4], unsigned char block[64])
+{
+    u_num32 a = state[0], b = state[1], c = state[2], d = state[3], x[16];
+
+    Decode(x, block, 64);
+
+    /* Round 1 */
+    FF(a, b, c, d, x[0], S11, 0xd76aa478);     /* 1 */
+    FF(d, a, b, c, x[1], S12, 0xe8c7b756);     /* 2 */
+    FF(c, d, a, b, x[2], S13, 0x242070db);     /* 3 */
+    FF(b, c, d, a, x[3], S14, 0xc1bdceee);     /* 4 */
+    FF(a, b, c, d, x[4], S11, 0xf57c0faf);     /* 5 */
+    FF(d, a, b, c, x[5], S12, 0x4787c62a);     /* 6 */
+    FF(c, d, a, b, x[6], S13, 0xa8304613);     /* 7 */
+    FF(b, c, d, a, x[7], S14, 0xfd469501);     /* 8 */
+    FF(a, b, c, d, x[8], S11, 0x698098d8);     /* 9 */
+    FF(d, a, b, c, x[9], S12, 0x8b44f7af);     /* 10 */
+    FF(c, d, a, b, x[10], S13, 0xffff5bb1);    /* 11 */
+    FF(b, c, d, a, x[11], S14, 0x895cd7be);    /* 12 */
+    FF(a, b, c, d, x[12], S11, 0x6b901122);    /* 13 */
+    FF(d, a, b, c, x[13], S12, 0xfd987193);    /* 14 */
+    FF(c, d, a, b, x[14], S13, 0xa679438e);    /* 15 */
+    FF(b, c, d, a, x[15], S14, 0x49b40821);    /* 16 */
+
+    /* Round 2 */
+    GG(a, b, c, d, x[1], S21, 0xf61e2562);     /* 17 */
+    GG(d, a, b, c, x[6], S22, 0xc040b340);     /* 18 */
+    GG(c, d, a, b, x[11], S23, 0x265e5a51);    /* 19 */
+    GG(b, c, d, a, x[0], S24, 0xe9b6c7aa);     /* 20 */
+    GG(a, b, c, d, x[5], S21, 0xd62f105d);     /* 21 */
+    GG(d, a, b, c, x[10], S22, 0x2441453);     /* 22 */
+    GG(c, d, a, b, x[15], S23, 0xd8a1e681);    /* 23 */
+    GG(b, c, d, a, x[4], S24, 0xe7d3fbc8);     /* 24 */
+    GG(a, b, c, d, x[9], S21, 0x21e1cde6);     /* 25 */
+    GG(d, a, b, c, x[14], S22, 0xc33707d6);    /* 26 */
+    GG(c, d, a, b, x[3], S23, 0xf4d50d87);     /* 27 */
+    GG(b, c, d, a, x[8], S24, 0x455a14ed);     /* 28 */
+    GG(a, b, c, d, x[13], S21, 0xa9e3e905);    /* 29 */
+    GG(d, a, b, c, x[2], S22, 0xfcefa3f8);     /* 30 */
+    GG(c, d, a, b, x[7], S23, 0x676f02d9);     /* 31 */
+    GG(b, c, d, a, x[12], S24, 0x8d2a4c8a);    /* 32 */
+
+    /* Round 3 */
+    HH(a, b, c, d, x[5], S31, 0xfffa3942);     /* 33 */
+    HH(d, a, b, c, x[8], S32, 0x8771f681);     /* 34 */
+    HH(c, d, a, b, x[11], S33, 0x6d9d6122);    /* 35 */
+    HH(b, c, d, a, x[14], S34, 0xfde5380c);    /* 36 */
+    HH(a, b, c, d, x[1], S31, 0xa4beea44);     /* 37 */
+    HH(d, a, b, c, x[4], S32, 0x4bdecfa9);     /* 38 */
+    HH(c, d, a, b, x[7], S33, 0xf6bb4b60);     /* 39 */
+    HH(b, c, d, a, x[10], S34, 0xbebfbc70);    /* 40 */
+    HH(a, b, c, d, x[13], S31, 0x289b7ec6);    /* 41 */
+    HH(d, a, b, c, x[0], S32, 0xeaa127fa);     /* 42 */
+    HH(c, d, a, b, x[3], S33, 0xd4ef3085);     /* 43 */
+    HH(b, c, d, a, x[6], S34, 0x4881d05);      /* 44 */
+    HH(a, b, c, d, x[9], S31, 0xd9d4d039);     /* 45 */
+    HH(d, a, b, c, x[12], S32, 0xe6db99e5);    /* 46 */
+    HH(c, d, a, b, x[15], S33, 0x1fa27cf8);    /* 47 */
+    HH(b, c, d, a, x[2], S34, 0xc4ac5665);     /* 48 */
+
+    /* Round 4 */
+    II(a, b, c, d, x[0], S41, 0xf4292244);     /* 49 */
+    II(d, a, b, c, x[7], S42, 0x432aff97);     /* 50 */
+    II(c, d, a, b, x[14], S43, 0xab9423a7);    /* 51 */
+    II(b, c, d, a, x[5], S44, 0xfc93a039);     /* 52 */
+    II(a, b, c, d, x[12], S41, 0x655b59c3);    /* 53 */
+    II(d, a, b, c, x[3], S42, 0x8f0ccc92);     /* 54 */
+    II(c, d, a, b, x[10], S43, 0xffeff47d);    /* 55 */
+    II(b, c, d, a, x[1], S44, 0x85845dd1);     /* 56 */
+    II(a, b, c, d, x[8], S41, 0x6fa87e4f);     /* 57 */
+    II(d, a, b, c, x[15], S42, 0xfe2ce6e0);    /* 58 */
+    II(c, d, a, b, x[6], S43, 0xa3014314);     /* 59 */
+    II(b, c, d, a, x[13], S44, 0x4e0811a1);    /* 60 */
+    II(a, b, c, d, x[4], S41, 0xf7537e82);     /* 61 */
+    II(d, a, b, c, x[11], S42, 0xbd3af235);    /* 62 */
+    II(c, d, a, b, x[2], S43, 0x2ad7d2bb);     /* 63 */
+    II(b, c, d, a, x[9], S44, 0xeb86d391);     /* 64 */
+
+    state[0] += a;
+    state[1] += b;
+    state[2] += c;
+    state[3] += d;
+
+    /*
+     * Zeroize sensitive information.
+     */
+    MD5_memset((char *)x, 0, sizeof(x));
+}
+
+/*
+ * Encodes input (u_num32) into output (unsigned char). Assumes len is a
+ * multiple of 4.
+ */
+static void
+Encode(unsigned char *output, u_num32 *input, unsigned int len)
+{
+    unsigned int i, j;
+
+    for (i = 0, j = 0; j < len; i++, j += 4) {
+       output[j] = (unsigned char) (input[i] & 0xff);
+       output[j + 1] = (unsigned char) ((input[i] >> 8) & 0xff);
+       output[j + 2] = (unsigned char) ((input[i] >> 16) & 0xff);
+       output[j + 3] = (unsigned char) ((input[i] >> 24) & 0xff);
+    }
+}
+
+/*
+ * Decodes input (unsigned char) into output (u_num32). Assumes len is a
+ * multiple of 4.
+ */
+static void
+Decode(u_num32 *output, unsigned char *input, unsigned int len)
+{
+    unsigned int i, j;
+
+    for (i = 0, j = 0; j < len; i++, j += 4)
+       output[i] = ((u_num32) input[j]) | (((u_num32) input[j + 1]) << 8) |
+           (((u_num32) input[j + 2]) << 16) | (((u_num32) input[j + 3]) << 24);
+}
+
+/*
+ * Note: Replace "for loop" with standard memcpy if possible.
+ */
+
+static void
+MD5_memcpy(char * output, char * input, unsigned int len)
+{
+    unsigned int i;
+    for (i = 0; i < len; i++)
+       output[i] = input[i];
+}
+
+/*
+ * Note: Replace "for loop" with standard memset if possible.
+ */
+static void
+MD5_memset(char * output, int value, unsigned int len)
+{
+    unsigned int i;
+    for (i = 0; i < len; i++)
+       output[i] = (char) value;
+}
index 1e12043f817db5af072055fca5d5e0b2952bc6cd..fecf64f9be418a0c46939a304009bb667929f591 100644 (file)
@@ -135,8 +135,7 @@ void sync_with_agent();
 int parse_app_community_string();
 void snmp_synch_setup();
 int snmp_synch_response();
-void md5Digest();
-
+void md5Digest(u_char *msg, int length, u_char *key, u_char *digest);
 
 #if NO_PRINTFS
 static char *
index 1d706a4f4f288c1a985e8862fe1cfe68394be814..2804bcdace64253ffdf44dea8fcb527eb5caf0a3 100644 (file)
@@ -1,7 +1,7 @@
 #
 #  Makefile for the Squid Object Cache server
 #
-#  $Id: Makefile.in,v 1.103 1997/12/01 22:45:47 wessels Exp $
+#  $Id: Makefile.in,v 1.104 1997/12/02 05:06:41 wessels Exp $
 #
 #  Uncomment and customize the following to suit your needs:
 #
@@ -15,6 +15,7 @@ USE_SPLAY_TREE  = # -DUSE_SPLAY_TREE
 USE_BIN_TREE    = # -DUSE_BIN_TREE
 ALARM_UPDATES_TIME = # -DALARM_UPDATES_TIME=1
 STORE_KEY_SHA  = # -DSTORE_KEY_SHA=1
+STORE_KEY_MD5  = # -DSTORE_KEY_MD5=1
 USE_ASYNC_IO   = # -DUSE_ASYNC_IO=1
 
 # define all three for SNMP support
@@ -26,7 +27,8 @@ DEFINES         = $(HOST_OPT) \
                   $(ICMP_OPT) $(DELAY_HACK) $(USERAGENT_OPT) \
                   $(KILL_PARENT_OPT) $(USE_POLL_OPT) \
                   $(USE_SPLAY_TREE) $(USE_BIN_TREE) \
-                 $(ALARM_UPDATES_TIME) $(STORE_KEY_SHA) \
+                 $(ALARM_UPDATES_TIME) \
+                 $(STORE_KEY_SHA) $(STORE_KEY_MD5) \
                  $(USE_ASYNC_IO) $(SQUID_SNMP)
 
 prefix         = @prefix@
@@ -136,6 +138,7 @@ OBJS                = \
                store.o \
                store_clean.o \
                store_dir.o \
+               store_key_md5.o \
                store_key_sha.o \
                store_key_url.o \
                string_arrays.o \
index 1477bed0a5a4e8b9eb417018e51a2d90dbda40af..edcf95ae0dbc7f3ca26c164e6d6f01744dca9a99 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: cf_gen.cc,v 1.17 1997/12/02 03:30:22 wessels Exp $
+ * $Id: cf_gen.cc,v 1.18 1997/12/02 05:06:41 wessels Exp $
  *
  * DEBUG: section 1     Startup and Main Loop
  * AUTHOR: Max Okumoto
  *                      administrator.
  *****************************************************************************/
 
+#include "config.h"
+
+#if HAVE_STDIO_H
 #include <stdio.h>
+#endif
+#if HAVE_STRING_H
 #include <string.h>
+#endif
+#if HAVE_STDLIB_H
 #include <stdlib.h>
+#endif
+#if HAVE_CTYPE_H
 #include <ctype.h>
+#endif
+#if HAVE_ASSERT_H
 #include <assert.h>
+#endif
+
+#if SQUID_SNMP
 #include "snmp.h"
 #include "snmp_config.h"
+#endif
 
 #define MAX_LINE       1024    /* longest configuration line */
 #define _PATH_PARSER           "cf_parser.c"
index c17a49e3afc0f850dd277c57ea0500974d7ac68b..e51fee272753c1b3057e5a53eac3cc74ac1249ed 100644 (file)
@@ -1,6 +1,6 @@
 
 /*
- * $Id: squid.h,v 1.139 1997/12/02 03:33:08 wessels Exp $
+ * $Id: squid.h,v 1.140 1997/12/02 05:06:43 wessels Exp $
  *
  * AUTHOR: Duane Wessels
  *
 
 #if STORE_KEY_SHA
 #undef STORE_KEY_URL
+#undef STORE_KEY_MD5
 #include "sha.h"
+#elif STORE_KEY_MD5
+#undef STORE_KEY_URL
+#undef STORE_KEY_SHA
+#include "md5.h"
 #else
 #undef STORE_KEY_SHA
+#undef STORE_KEY_MD5
 #define STORE_KEY_URL 1
 #define storeKeyHashCmp urlcmp
 #define storeKeyHashHash hash4
index 9d5df5b171babb0efb845e968f1dfc4e737a1a9f..f3b7db67721fdd478c54f24afa3b35f906709f03 100644 (file)
@@ -1,6 +1,6 @@
 
 /*
- * $Id: store.cc,v 1.353 1997/12/01 02:15:25 wessels Exp $
+ * $Id: store.cc,v 1.354 1997/12/02 05:06:44 wessels Exp $
  *
  * DEBUG: section 20    Storeage Manager
  * AUTHOR: Harvest Derived
@@ -1133,6 +1133,10 @@ storeDoRebuildFromDisk(void *data)
        size = (off_t) scan5;
 
        key = storeKeyScan(keytext);
+       if (key == NULL) {
+           debug(20,1)("storeDoRebuildFromDisk: bad key: '%s'\n", keytext);
+           continue;
+       }
        e = storeGet(key);
        used = storeDirMapBitTest(sfileno);
        /* If this URL already exists in the cache, does the swap log
diff --git a/src/store_key_md5.cc b/src/store_key_md5.cc
new file mode 100644 (file)
index 0000000..0e2fd54
--- /dev/null
@@ -0,0 +1,124 @@
+#include "squid.h"
+
+#if STORE_KEY_MD5
+
+const char *
+storeKeyText(const unsigned char *key)
+{
+    LOCAL_ARRAY(char, buf, 33);
+    int i;
+    int o;
+    for (i = 0; i < MD5_DIGEST_CHARS; i++) {
+       o = i << 1;
+       snprintf(buf + o, 33 - o, "%02X", *(key + i));
+    }
+    return buf;
+}
+
+const unsigned char *
+storeKeyScan(const char *buf)
+{
+    static unsigned char digest[MD5_DIGEST_CHARS];
+    int i;
+    int j = 0;
+    unsigned char t[3];
+    for (i=0; i<MD5_DIGEST_CHARS; i++) {
+       t[0] = *(buf+(j++));
+       t[1] = *(buf+(j++));
+       t[2] = '\0';
+       *(digest+i) = (unsigned char) strtol(t, NULL, 16);
+    }
+    return digest;
+}
+
+int
+storeKeyHashCmp(const void *a, const void *b)
+{
+    const unsigned char *A = a;
+    const unsigned char *B = b;
+    int i;
+    for (i = 0; i < MD5_DIGEST_CHARS; i++) {
+       if (A[i] < B[i])
+           return -1;
+       if (A[i] > B[i])
+           return 1;
+    }
+    return 0;
+}
+
+unsigned int
+storeKeyHashHash(const void *key, unsigned int n)
+{
+    /* note, n must be a power of 2! */
+    const unsigned char *digest = key;
+    unsigned int i = digest[0]
+       | digest[1] << 8
+       | digest[2] <<16 
+       | digest[3] <<24;
+    return (i & (--n));
+}
+
+const cache_key *
+storeKeyPrivate(const char *url, method_t method, int num)
+{
+    static cache_key digest[MD5_DIGEST_CHARS];
+    MD5_CTX M;
+    int n;
+    char key_buf[MAX_URL + 100];
+    assert(num > 0);
+    debug(20, 3) ("storeKeyPrivate: '%s'\n", url);
+    n = snprintf(key_buf, MAX_URL + 100, "%d %s %s",
+       num,
+       RequestMethodStr[method],
+       url);
+    MD5Init(&M);
+    MD5Update(&M, key_buf, n);
+    MD5Final(digest, &M);
+    return digest;
+}
+
+const cache_key *
+storeKeyPublic(const char *url, method_t method)
+{
+    static cache_key digest[MD5_DIGEST_CHARS];
+    MD5_CTX M;
+    int n;
+    char key_buf[MAX_URL + 100];
+    n = snprintf(key_buf, MAX_URL + 100, "%s %s",
+       RequestMethodStr[method],
+       url);
+    MD5Init(&M);
+    MD5Update(&M, key_buf, n);
+    MD5Final(digest, &M);
+    return digest;
+}
+
+const cache_key *
+storeKeyDup(const cache_key * key)
+{
+    cache_key *dup = xmalloc(MD5_DIGEST_CHARS);
+    xmemcpy(dup, key, MD5_DIGEST_CHARS);
+    meta_data.store_keys += MD5_DIGEST_CHARS;
+    return dup;
+}
+
+void
+storeKeyFree(const cache_key * key)
+{
+    xfree((void *) key);
+    meta_data.store_keys -= MD5_DIGEST_CHARS;
+}
+
+int
+storeKeyHashBuckets(int nobj)
+{
+    if (nobj < 0x2000)
+       return 0x2000;
+    if (nobj < 0x4000)
+       return 0x4000;
+    if (nobj < 0x8000)
+       return 0x8000;
+    return 0x10000;
+}
+
+#endif /* STORE_KEY_MD5 */
index 9062975d85c33b8356dc08c70b48f3f3b577a880..d10089868d9d57b0b53a48ea67c38cf28f6dcf78 100644 (file)
@@ -103,22 +103,12 @@ typedef void ERCB(int fd, void *, size_t);
 typedef void OBJH(StoreEntry *);
 typedef void SIGHDLR(int sig);
 
-/* 32 bit integer compatability hack */
-#if SIZEOF_INT == 4
-typedef int num32;
-typedef unsigned int u_num32;
-#elif SIZEOF_LONG == 4
-typedef long num32;
-typedef unsigned long u_num32;
-#else
-typedef long num32;            /* assume that long's are 32bit */
-typedef unsigned long u_num32;
-#endif
-#define NUM32LEN sizeof(num32) /* this should always be 4 */
-
 #if STORE_KEY_SHA
 typedef int cache_key;
 #endif
+#if STORE_KEY_MD5
+typedef unsigned char cache_key;
+#endif
 #if STORE_KEY_URL
 typedef char cache_key;
 #endif