diff -urpN john-1.7.8-jumbo-7a/src/crc32_fmt_plug.c john-1.7.8-jumbo-7b/src/crc32_fmt_plug.c
--- john-1.7.8-jumbo-7a/src/crc32_fmt_plug.c	2011-10-05 16:38:08.486250000 +0000
+++ john-1.7.8-jumbo-7b/src/crc32_fmt_plug.c	2011-09-26 19:14:08.093750000 +0000
@@ -29,6 +29,10 @@
 #include "formats.h"
 #include "pkzip.h"  // includes the 'inline' crc table.
 
+#ifdef _OPENMP
+#include <omp.h>
+#endif
+
 #define FORMAT_LABEL			"crc32"
 #define FORMAT_NAME				"crc32"
 #define ALGORITHM_NAME			"N/A"
@@ -36,18 +40,24 @@
 #define BENCHMARK_COMMENT		""
 #define BENCHMARK_LENGTH		0
 
-#define PLAINTEXT_LENGTH		31
+#define PLAINTEXT_LENGTH		15
 
 #define BINARY_SIZE				4
 #define SALT_SIZE				4
 
 #define MIN_KEYS_PER_CRYPT		1
-#define MAX_KEYS_PER_CRYPT		(0x4000 / (PLAINTEXT_LENGTH + 1))
+//#ifdef _OPENMP
+#define MAX_KEYS_PER_CRYPT		16384
+//#else
+//#define MAX_KEYS_PER_CRYPT		(0x4000 / (PLAINTEXT_LENGTH + 1))
+//#endif
 
 static struct fmt_tests tests[] = {
+	{"$crc32$00000000.fa455f6b", "ripper"},
 	{"$crc32$00000000.4ff4f23f", "dummy"},
-	{"$crc32$00000000.00000000", ""},
+//	{"$crc32$00000000.00000000", ""},         // this one ends up skewing the benchmark time, WAY too much.
 	{"$crc32$4ff4f23f.ce6eb863", "password"}, // this would be for file with contents:   'dummy'  and we want to find a password to append that is 'password'
+	{"$crc32$fa455f6b.c59b2aeb", "123456"},   // ripper123456
 	{NULL}
 };
 
@@ -93,6 +103,9 @@ static void *binary(char *ciphertext)
 	if (!out)
 		out = mem_alloc_tiny(sizeof(ARCH_WORD_32), MEM_ALIGN_WORD);
 	sscanf(&ciphertext[16], "%x", out);
+	// Performing the complement here, allows us to not have to complement
+	// at the end of each crypt_all call.
+	*out = ~(*out);
 	return out;
 }
 
@@ -102,22 +115,22 @@ static void *salt(char *ciphertext)
 	if (!out)
 		out = mem_alloc_tiny(sizeof(ARCH_WORD_32), MEM_ALIGN_WORD);
 	sscanf(&ciphertext[7], "%x", out);
+	// since we ask for the crc of a file, or zero, we need to complement here,
+	// to get it into 'proper' working order.
+	*out = ~(*out);
 	return out;
 }
 
 static void set_salt(void *salt)
 {
 	crcsalt = *((ARCH_WORD_32 *)salt);
-	// since we ask for the crc of a file, or zero, we need to complement here, and then
-	// complement when done.  This is to observe 'proper' CSITT crc methods.
-	crcsalt = ~crcsalt;
 }
 
 static void set_key(char *key, int index)
 {
 	char *p = saved_key[index];
-	*p = 0;
-	strncat(p, key, PLAINTEXT_LENGTH);
+	while ( (*p++ = *key++) )
+		;
 }
 
 static char *get_key(int index)
@@ -127,20 +140,23 @@ static char *get_key(int index)
 
 static void crypt_all(int count)
 {
-	ARCH_WORD_32 crc, i;
-	unsigned char *p;
+	int i;
+#ifdef _OPENMP
+#pragma omp parallel for private(i)
+#endif
 	for (i = 0; i < count; ++i) {
-		p = (unsigned char*)saved_key[i];
-		crc = crcsalt;
+		ARCH_WORD_32 crc = crcsalt;
+		unsigned char *p = (unsigned char*)saved_key[i];
 		while (*p)
 			crc = pkzip_crc32(crc, *p++);
-		crcs[i] = ~crc;
-	}	
+		//crcs[i] = ~crc;
+		crcs[i] = crc;
+	}
 }
 
 static int cmp_all(void *binary, int count)
 {
-	ARCH_WORD_32 crc=((ARCH_WORD_32*)binary)[0], i;
+	ARCH_WORD_32 crc=*((ARCH_WORD_32*)binary), i;
 	for (i = 0; i < count; ++i)
 		if (crc == crcs[i]) return 1;
 	return 0;
@@ -148,7 +164,7 @@ static int cmp_all(void *binary, int cou
 
 static int cmp_one(void *binary, int index)
 {
-	return ((ARCH_WORD_32*)binary)[0] == crcs[index];
+	return *((ARCH_WORD_32*)binary) == crcs[index];
 }
 
 static int cmp_exact(char *source, int index)
@@ -168,7 +184,7 @@ struct fmt_main fmt_crc32 = {
 		SALT_SIZE,
 		MIN_KEYS_PER_CRYPT,
 		MAX_KEYS_PER_CRYPT,
-		FMT_CASE | FMT_8_BIT | FMT_NOT_EXACT,
+		FMT_CASE | FMT_8_BIT | FMT_NOT_EXACT | FMT_OMP,
 		tests
 	}, {
 		fmt_default_init,
diff -urpN john-1.7.8-jumbo-7a/src/dummy.c john-1.7.8-jumbo-7b/src/dummy.c
--- john-1.7.8-jumbo-7a/src/dummy.c	2011-05-17 16:13:02.000000000 +0000
+++ john-1.7.8-jumbo-7b/src/dummy.c	2011-09-26 17:25:02.750000000 +0000
@@ -31,7 +31,8 @@ typedef struct {
 
 static struct fmt_tests tests[] = {
 	{"$dummy$64756d6d79", "dummy"},
-	{"$dummy$", ""},
+//	{"$dummy$", ""},
+	{"$dummy$726970706572", "ripper"},
 	{"$dummy$70617373776f7264", "password"},
 	{NULL}
 };
