Openwall GNU/*/Linux - a small security-enhanced Linux distro for servers
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Date: Wed, 21 Aug 2013 21:38:17 -0300
From: Claudio André <claudioandre.br@...il.com>
To: john-dev@...ts.openwall.com
Subject: Cisco-4 type format deprecated

Hi, the attached patch unifies OpenCL raw-sha256 and cisco-4 (as the CPU 
format does).

It needs some real testing on real OpenCL hardware, but it seems to be 
ok to me. Please, take a look.

Claudio



diff --git a/src/cryptsha512_fmt_plug.c b/src/cryptsha512_fmt_plug.c
index f0c8a85..3ec67a5 100644
--- a/src/cryptsha512_fmt_plug.c
+++ b/src/cryptsha512_fmt_plug.c
@@ -44,7 +44,7 @@
 #define MIN_KEYS_PER_CRYPT		1
 #define MAX_KEYS_PER_CRYPT		1
 
-#include "cryptsha512_valid.h"
+#include "cryptsha512_common.h"
 
 static struct fmt_tests tests[] = {
 	{"$6$LKO/Ute40T3FNF95$6S/6T2YuOIHY0N3XpLKABJ3soYcXD9mB7uVbtEZDj/LNscVhZoZ9DEH.sBciDrMsHOWOoASbNLTypH/5X26gN0", "U*U*U*U*"},
diff --git a/src/john.c b/src/john.c
index ed1a7e2..c00cf35 100644
--- a/src/john.c
+++ b/src/john.c
@@ -162,7 +162,6 @@ extern struct fmt_main fmt_opencl_NT;
 extern struct fmt_main fmt_opencl_NTLMv2;
 extern struct fmt_main fmt_opencl_agilekeychain;
 extern struct fmt_main fmt_opencl_bf;
-extern struct fmt_main fmt_opencl_cisco4;
 extern struct fmt_main fmt_opencl_cryptMD5;
 extern struct fmt_main fmt_opencl_cryptsha256;
 extern struct fmt_main fmt_opencl_cryptsha512;
@@ -376,7 +375,6 @@ static void john_register_all(void)
 	john_register_one(&fmt_opencl_agilekeychain);
 	john_register_one(&fmt_opencl_bf);
 	john_register_one(&fmt_opencl_blockchain);
-	john_register_one(&fmt_opencl_cisco4);
 	john_register_one(&fmt_opencl_cryptMD5);
 	john_register_one(&fmt_opencl_cryptsha256);
 	john_register_one(&fmt_opencl_cryptsha512);
diff --git a/src/opencl_cryptsha512_fmt.c b/src/opencl_cryptsha512_fmt.c
index 7f329e7..6659c86 100644
--- a/src/opencl_cryptsha512_fmt.c
+++ b/src/opencl_cryptsha512_fmt.c
@@ -18,7 +18,7 @@
 #include "config.h"
 #include "options.h"
 #include "opencl_cryptsha512.h"
-#include "cryptsha512_valid.h"
+#include "cryptsha512_common.h"
 
 #define FORMAT_LABEL			"sha512crypt-opencl"
 #define ALGORITHM_NAME			"SHA512 OpenCL"
diff --git a/src/opencl_rawsha256.h b/src/opencl_rawsha256.h
index ab68467..6968b25 100644
--- a/src/opencl_rawsha256.h
+++ b/src/opencl_rawsha256.h
@@ -21,9 +21,6 @@
 #define RAW_PLAINTEXT_LENGTH    56      /* 55 characters + 0x80 */
 #define CISCO_PLAINTEXT_LENGTH  26      /* 25 characters + 0x80 */
 
-#define RAW_CIPHERTEXT_LENGTH   64
-#define CISCO_CIPHERTEXT_LENGTH 43
-
 #define BUFFER_SIZE             56      /* RAW_PLAINTEXT_LENGTH multiple of 4 */
 #define CIPHERTEXT_LENGTH       64
 #define BINARY_SIZE             4
diff --git a/src/opencl_rawsha256_fmt.c b/src/opencl_rawsha256_fmt.c
index fba2918..7038893 100644
--- a/src/opencl_rawsha256_fmt.c
+++ b/src/opencl_rawsha256_fmt.c
@@ -21,17 +21,13 @@
 #include "config.h"
 #include "options.h"
 #include "opencl_rawsha256.h"
+#include "rawSHA256_common.h"
 
-#define RAW_FORMAT_LABEL		"Raw-SHA256-opencl"
-#define RAW_FORMAT_NAME			""
-#define CISCO_FORMAT_LABEL		"cisco4-opencl"
-#define CISCO_FORMAT_NAME		"Cisco \"type 4\" hashes"
+#define FORMAT_LABEL			"Raw-SHA256-opencl"
+#define FORMAT_NAME			""
 
 #define ALGORITHM_NAME			"SHA256 OpenCL (inefficient, development use mostly)"
 
-#define BENCHMARK_COMMENT		""
-#define BENCHMARK_LENGTH		-1
-
 #define CONFIG_NAME			"rawsha256"
 
 static uint32_t				* plaintext, * saved_idx;	// plaintext ciphertexts
@@ -53,7 +49,7 @@ static size_t offset = 0, offset_idx = 0;
 static int crypt_all(int *pcount, struct db_salt *_salt);
 static int crypt_all_benchmark(int *pcount, struct db_salt *_salt);
 
-static struct fmt_tests raw_tests[] = {
+static struct fmt_tests tests[] = {
 	{"5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8", "password"},
 	{"$SHA256$ef797c8118f02dfb649607dd5d3f8c7623048c9c063d532cc95c5ed7a898a64f", "12345678"},
 	{"$SHA256$e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ""},
@@ -66,11 +62,6 @@ static struct fmt_tests raw_tests[] = {
 	{"f58fffba129aa67ec63bf12571a42977c0b785d3b2a93cc0538557c91da2115d", "12345678901234567890123456789012345678901234567890"},
 	{"3874d5c9cc5ab726e6bbebadee22c680ce530004d4f0bb32f765d42a0a6c6dc1", "123456789012345678901234567890123456789012345678901"},
 	{"03c3a70e99ed5eeccd80f73771fcf1ece643d939d9ecc76f25544b0233f708e9", "1234567890123456789012345678901234567890123456789012345"},
-#endif
-	{NULL}
-};
-
-static struct fmt_tests cisco_tests[] = {
 	{"$cisco4$OsOmQzwozC4ROs/CzpczJoShdCeW9lp7k/tGrPS5Kog", "1"},
 	{"$cisco4$LcV6aBcc/53FoCJjXQMd7rBUDEpeevrK8V5jQVoJEhU", "password"},
 	{"$cisco4$d7kgbEk.P6mpKdduC66fUy1BF0MImo3eyJ9uI/JbMRk", "openwall"},
@@ -81,6 +72,7 @@ static struct fmt_tests cisco_tests[] = {
 	{"$cisco4$fLUL1VG98zYDf9Q.M40nZ5blVT3M6UBex74Blw.UDCc", "thismaximumpasswordlength"},
 	{"$cisco4$Xq81UiuCj7bz9B..EX2BZumsU/d8pF5gs2NlRMW6sTk", "applesucks"},
 	{"$cisco4$O/D/cn1nawcByQoJfBxrNnUx6jjfWV.FNFx5TzmzihU", "AppleSucks"},
+#endif
 	{NULL}
 };
 
@@ -104,29 +96,6 @@ static size_t get_default_workgroup(){
 		return 64;
 }
 
-static void decode64(unsigned char * dst, unsigned char * src) {
-	int i, j;
-	unsigned int ch;
-
-	for (i = 0, j = 0; j < SHA256_DIGEST_LENGTH; j += 3) {
-		// Get 1st byte of input (1st and 2nd)
-	        ch = src[i++];
-		dst[j] = ((atoi64[ch] << 2) & 252) + (atoi64[src[i]] >> 4 & 0x03);
-
-		// Get 2nd byte of input (2nd and 3rd)
-		ch = src[i++];
-		dst[j + 1] = ((atoi64[ch] << 4) & 240) + (atoi64[src[i]] >> 2 & 0x0f);
-
-		// Size of destination string.
-		if (j + 2 == SHA256_DIGEST_LENGTH) {
-			break;
-		}
-		// Get 3rd byte of input (3rd and 4th)
-		ch = src[i++];
-		dst[j + 2] = ((atoi64[ch] << 6) & 192) + (atoi64[src[i++]] & 0x3f);
-	}
-}
-
 static void crypt_one(int index, sha256_hash * hash) {
 	SHA256_CTX ctx;
 
@@ -403,58 +372,6 @@ static void done(void) {
 	HANDLE_CLERROR(clReleaseProgram(program[ocl_gpu_id]), "Release Program");
 }
 
-/* ------- Check if the ciphertext if a valid SHA-256 ------- */
-static int valid(char * ciphertext, struct fmt_main * self) {
-	char *p, *q;
-
-	p = ciphertext;
-	if (!strncmp(p, "$SHA256$", 8))
-		p += 8;
-
-	q = p;
-	while (atoi16[ARCH_INDEX(*q)] != 0x7F)
-		q++;
-	return !*q && q - p == CIPHERTEXT_LENGTH;
-}
-
-static char *split(char *ciphertext, int index, struct fmt_main *pFmt) {
-
-	static char out[8 + CIPHERTEXT_LENGTH + 1];
-
-	if (!strncmp(ciphertext, "$SHA256$", 8))
-		return ciphertext;
-
-	memcpy(out, "$SHA256$", 8);
-	memcpy(out + 8, ciphertext, CIPHERTEXT_LENGTH + 1);
-	strlwr(out + 8);
-	return out;
-}
-
-static int valid_cisco(char * ciphertext, struct fmt_main * self) {
-	char *p, *q;
-
-	p = ciphertext;
-	if (!strncmp(p, "$cisco4$", 8))
-		p += 8;
-
-	q = p;
-	while (atoi64[ARCH_INDEX(*q)] != 0x7F)
-		q++;
-	return !*q && q - p == CISCO_CIPHERTEXT_LENGTH;
-}
-
-static char *split_cisco(char *ciphertext, int index, struct fmt_main *pFmt) {
-
-	static char out[8 + CISCO_CIPHERTEXT_LENGTH + 1];
-
-	if (!strncmp(ciphertext, "$cisco4$", 8))
-		return ciphertext;
-
-	memcpy(out, "$cisco4$", 8);
-	memcpy(out + 8, ciphertext, CISCO_CIPHERTEXT_LENGTH + 1);
-	return out;
-}
-
 /* ------- To binary functions ------- */
 static void * get_binary(char *ciphertext) {
 	static unsigned char *out;
@@ -495,39 +412,6 @@ static void * get_full_binary(char *ciphertext) {
 	return out;
 }
 
-static void * get_cisco_binary(char *ciphertext) {
-	static unsigned char *out;
-	uint32_t * b;
-	unsigned char *p;
-
-	if (!out) out = mem_alloc_tiny(FULL_BINARY_SIZE, MEM_ALIGN_WORD);
-
-	p = (unsigned char *) ciphertext + 8;
-
-	//Decode for CISCO-4.
-	decode64(out, p);
-
-	//Undo some computation.
-	b = (uint32_t *) out;
-	b[0] = SWAP32(b[3]) - H3;
-
-	return out;
-}
-
-static void * get_cisco_full_binary(char *ciphertext) {
-	static unsigned char *out;
-	unsigned char *p;
-
-	if (!out) out = mem_alloc_tiny(FULL_BINARY_SIZE, MEM_ALIGN_WORD);
-
-	p = (unsigned char *) ciphertext + 8;
-
-	//Decode for CISCO-4.
-	decode64(out, p);
-
-	return out;
-}
-
 /* ------- Crypt function ------- */
 static int crypt_all_benchmark(int *pcount, struct db_salt *_salt) {
 	int count = *pcount;
@@ -651,21 +535,6 @@ static int cmp_exact(char *source, int index) {
 	return !memcmp(binary, (void *) &full_hash, FULL_BINARY_SIZE);
 }
 
-static int cmp_exact_cisco(char *source, int index) {
-	//I don't know why, but this is called and i have to recheck.
-	//If i skip this final test i get:
-	//form=raw-sha512-ng-opencl	 guesses: 1468 time: 0:00:00:02 : Expected count(s) (1500)  [!!!FAILED!!!]
-	//.pot CHK:raw-sha512-ng-opencl	 guesses: 1452 time: 0:00:00:02 : Expected count(s) (1500)  [!!!FAILED!!!]
-
-	uint32_t * binary;
-	sha256_hash full_hash;
-
-	crypt_one(index, &full_hash);
-
-	binary = (uint32_t *) get_cisco_full_binary(source);
-	return !memcmp(binary, (void *) &full_hash, FULL_BINARY_SIZE);
-}
-
 /* ------- Binary Hash functions group ------- */
 #ifdef DEBUG
 static void print_binary(void * binary) {
@@ -708,8 +577,8 @@ static int get_hash_6(int index) { return calculated_hash[index] & 0x7ffffff; }
 /* ------- Format structure ------- */
 struct fmt_main fmt_opencl_rawsha256 = {
 	{
-		RAW_FORMAT_LABEL,
-		RAW_FORMAT_NAME,
+		FORMAT_LABEL,
+		FORMAT_NAME,
 		ALGORITHM_NAME,
 		BENCHMARK_COMMENT,
 		BENCHMARK_LENGTH,
@@ -721,12 +590,12 @@ struct fmt_main fmt_opencl_rawsha256 = {
 		MIN_KEYS_PER_CRYPT,
 		MAX_KEYS_PER_CRYPT,
 		FMT_CASE | FMT_8_BIT | FMT_SPLIT_UNIFIES_CASE,
-		raw_tests
+		tests
 	}, {
 		init,
 		done,
 		fmt_default_reset,
-		fmt_default_prepare,
+		prepare,
 		valid,
 		split,
 		get_binary,
@@ -760,61 +629,4 @@ struct fmt_main fmt_opencl_rawsha256 = {
 		cmp_one,
 		cmp_exact
 	}
-};
-
-/* ------- Format structure ------- */
-struct fmt_main fmt_opencl_cisco4 = {
-	{
-		CISCO_FORMAT_LABEL,
-		CISCO_FORMAT_NAME,
-		ALGORITHM_NAME,
-		BENCHMARK_COMMENT,
-		BENCHMARK_LENGTH,
-		CISCO_PLAINTEXT_LENGTH - 1,
-		BINARY_SIZE,
-		BINARY_ALIGN,
-		SALT_SIZE,
-		SALT_ALIGN,
-		MIN_KEYS_PER_CRYPT,
-		MAX_KEYS_PER_CRYPT,
-		FMT_CASE | FMT_8_BIT,
-		cisco_tests
-	}, {
-		init,
-		done,
-		fmt_default_reset,
-		fmt_default_prepare,
-		valid_cisco,
-		split_cisco,
-		get_cisco_binary,
-		fmt_default_salt,
-		fmt_default_source,
-		{
-			fmt_default_binary_hash_0,
-			fmt_default_binary_hash_1,
-			fmt_default_binary_hash_2,
-			fmt_default_binary_hash_3,
-			fmt_default_binary_hash_4,
-			fmt_default_binary_hash_5,
-			fmt_default_binary_hash_6
-		},
-		fmt_default_salt_hash,
-		fmt_default_set_salt,
-		set_key,
-		get_key,
-		clear_keys,
-		crypt_all,
-		{
-			get_hash_0,
-			get_hash_1,
-			get_hash_2,
-			get_hash_3,
-			get_hash_4,
-			get_hash_5,
-			get_hash_6
-		},
-		cmp_all,
-		cmp_one,
-		cmp_exact_cisco
-	}
-};
+};
\ No newline at end of file
diff --git a/src/rawSHA256_fmt_plug.c b/src/rawSHA256_fmt_plug.c
index 3ba629f..04c2a13 100644
--- a/src/rawSHA256_fmt_plug.c
+++ b/src/rawSHA256_fmt_plug.c
@@ -23,6 +23,7 @@
 #include "common.h"
 #include "johnswap.h"
 #include "formats.h"
+#include "rawSHA256_common.h"
 
 #ifdef _OPENMP
 #ifdef MMX_COEF_SHA256
@@ -36,11 +37,6 @@
 
 #define FORMAT_LABEL            "Raw-SHA256"
 #define FORMAT_NAME             ""
-#define HEX_TAG                 "$SHA256$"
-#define CISCO_TAG               "$cisco4$"
-
-#define HEX_TAG_LEN             (sizeof(HEX_TAG) - 1)
-#define CISCO_TAG_LEN           (sizeof(CISCO_TAG) - 1)
 
 #ifdef MMX_COEF_SHA256
 #define ALGORITHM_NAME          SHA256_ALGORITHM_NAME
@@ -48,17 +44,12 @@
 #define ALGORITHM_NAME          "32/" ARCH_BITS_STR " " SHA2_LIB
 #endif
 
-#define BENCHMARK_COMMENT       ""
-#define BENCHMARK_LENGTH        -1
-
 /* Note: Cisco hashes are truncated at length 25. We currently ignore this. */
 #ifdef MMX_COEF_SHA256
 #define PLAINTEXT_LENGTH        55
 #else
 #define PLAINTEXT_LENGTH        125
 #endif
-#define HEX_CIPHERTEXT_LENGTH   64
-#define CISCO_CIPHERTEXT_LENGTH 43
 
 #define BINARY_SIZE             32
 #define BINARY_ALIGN			MEM_ALIGN_WORD
@@ -112,98 +103,6 @@ static void init(struct fmt_main *self)
 #endif
 }
 
-static int valid_cisco(char *ciphertext)
-{
-	char *p, *q;
-
-	p = ciphertext;
-	if (!strncmp(p, CISCO_TAG, CISCO_TAG_LEN))
-		p += CISCO_TAG_LEN;
-
-	q = p;
-	while (atoi64[ARCH_INDEX(*q)] != 0x7F)
-		q++;
-	return !*q && q - p == CISCO_CIPHERTEXT_LENGTH;
-}
-
-static int valid_hex(char *ciphertext)
-{
-	char *p, *q;
-
-	p = ciphertext;
-	if (!strncmp(p, HEX_TAG, HEX_TAG_LEN))
-		p += HEX_TAG_LEN;
-
-	q = p;
-	while (atoi16[ARCH_INDEX(*q)] != 0x7F)
-		q++;
-	return !*q && q - p == HEX_CIPHERTEXT_LENGTH;
-}
-
-static int valid(char *ciphertext, struct fmt_main *self)
-{
-	return (valid_hex(ciphertext) || valid_cisco(ciphertext));
-}
-
-/* Convert Cisco hashes to hex ones, so .pot entries are compatible */
-static char *prepare(char *split_fields[10], struct fmt_main *self)
-{
-	static char out[HEX_TAG_LEN + HEX_CIPHERTEXT_LENGTH + 1];
-	char *o, *p = split_fields[1];
-
-	if (!valid_cisco(p))
-		return p;
-
-	if (!strncmp(p, CISCO_TAG, CISCO_TAG_LEN))
-		p += CISCO_TAG_LEN;
-
-	strcpy(out, HEX_TAG);
-	o = out + HEX_TAG_LEN;
-
-	while(*p) {
-		unsigned int ch, b;
-
-		// Get 1st byte of input (1st and 2nd)
-		ch = *p++;
-		b = ((atoi64[ch] << 2) & 252) +
-			(atoi64[ARCH_INDEX(*p)] >> 4 & 0x03);
-		*o++ = itoa16[b >> 4];
-		*o++ = itoa16[b & 0x0f];
-
-		// Get 2nd byte of input (2nd and 3rd)
-		ch = *p++;
-		b = ((atoi64[ch] << 4) & 240) +
-			(atoi64[ARCH_INDEX(*p)] >> 2 & 0x0f);
-		*o++ = itoa16[b >> 4];
-		*o++ = itoa16[b & 0x0f];
-
-		if (!p[1])
-			return out;
-
-		// Get 3rd byte of input (3rd and 4th)
-		ch = *p++;
-		b = ((atoi64[ch] << 6) & 192) +
-			(atoi64[ARCH_INDEX(*p++)] & 0x3f);
-		*o++ = itoa16[b >> 4];
-		*o++ = itoa16[b & 0x0f];
-	}
-	printf("Error in prepare()");
-	exit(1);
-}
-
-static char *split(char *ciphertext, int index, struct fmt_main *self)
-{
-	static char out[HEX_TAG_LEN + HEX_CIPHERTEXT_LENGTH + 1];
-
-	if (!strncmp(ciphertext, HEX_TAG, HEX_TAG_LEN))
-		return ciphertext;
-
-	memcpy(out, HEX_TAG, HEX_TAG_LEN);
-	memcpy(out + HEX_TAG_LEN, ciphertext, HEX_CIPHERTEXT_LENGTH + 1);
-	strlwr(out + HEX_TAG_LEN);
-	return out;
-}
-
 static void *binary(char *ciphertext)
 {
 	static unsigned char *out;

Powered by blists - more mailing lists

Your e-mail address:

Powered by Openwall GNU/*/Linux - Powered by OpenVZ