From 9946fd2a6cafae0c6e08023e9929eca4943a6418 Mon Sep 17 00:00:00 2001
From: magnum <magnum>
Date: Fri, 16 Dec 2011 14:53:49 +0100
Subject: [PATCH 2/5] NT and NT2: No length check in set_key() but proper (and
 faster) checks in set_key_utf8()

---
 src/NT_fmt_plug.c  |   15 ++++++---------
 src/nt2_fmt_plug.c |   30 ++++++++++--------------------
 2 files changed, 16 insertions(+), 29 deletions(-)

diff --git a/src/NT_fmt_plug.c b/src/NT_fmt_plug.c
index 4777f29..eb52e3d 100644
--- a/src/NT_fmt_plug.c
+++ b/src/NT_fmt_plug.c
@@ -649,7 +649,7 @@ static inline void set_key_helper(unsigned int * keybuffer,
 {
 	unsigned int i=0;
 	unsigned int md4_size=0;
-	for(; key[md4_size] && md4_size < PLAINTEXT_LENGTH; i += xBuf, md4_size++)
+	for(; key[md4_size]; i += xBuf, md4_size++)
 	{
 		unsigned int temp;
 		if ((temp = key[++md4_size]))
@@ -741,7 +741,7 @@ static inline void set_key_helper_utf8(unsigned int * keybuffer, unsigned int xB
 		}
 		source++;
 		outlen++;
-		if (*source) {
+		if (*source && (target < targetEnd)) {
 			chh = *source;
 			if (chh >= 0xC0) {
 				unsigned int extraBytesToRead =
@@ -777,15 +777,12 @@ static inline void set_key_helper_utf8(unsigned int * keybuffer, unsigned int xB
 			outlen++;
 		} else {
 			chh = 0x80;
+			*target = chh << 16 | chl;
+			target += xBuf;
+			break;
 		}
 		*target = chh << 16 | chl;
 		target += xBuf;
-		if (*source == 0) {
-			break;
-		}
-		if (target >= targetEnd) {
-			break;
-		}
 	}
 	if (chh != 0x80 || outlen == 0) {
 		*target = 0x80;
@@ -845,7 +842,7 @@ static inline void set_key_helper_encoding(unsigned int * keybuffer,
 	} else {
 		unsigned int temp;
 		i = 0;
-		for(md4_size = 0; key[md4_size] && md4_size < PLAINTEXT_LENGTH; i += xBuf, md4_size++)
+		for(md4_size = 0; key[md4_size]; i += xBuf, md4_size++)
 			{
 				if ((temp = CP_to_Unicode[key[++md4_size]]))
 					keybuffer[i] = CP_to_Unicode[key[md4_size-1]] | (temp << 16);
diff --git a/src/nt2_fmt_plug.c b/src/nt2_fmt_plug.c
index 3e93d9c..9516257 100644
--- a/src/nt2_fmt_plug.c
+++ b/src/nt2_fmt_plug.c
@@ -281,9 +281,7 @@ static void set_key(char *_key, int index)
 {
 #ifdef MMX_COEF
 	const unsigned char *key = (unsigned char*)_key;
-	//unsigned int *keybuffer = (unsigned int*)&saved_key[GETPOS(0, index)];
-	unsigned int *keybuffer = buf_ptr[index];
-	unsigned int *keybuf_word = keybuffer;
+	unsigned int *keybuf_word = buf_ptr[index];
 	unsigned int len, temp2;
 
 #ifndef MD4_SSE_PARA
@@ -318,7 +316,7 @@ key_cleaning:
 	}
 
 #ifdef MD4_SSE_PARA
-	keybuffer[56] = len << 4;
+	((unsigned int *)saved_key)[14*MMX_COEF + (index&3) + (index>>2)*16*MMX_COEF] = len << 4;
 #else
 	total_len += len << (1 + ( (32/MMX_COEF) * index ) );
 #endif
@@ -349,9 +347,7 @@ static void set_key_CP(char *_key, int index)
 {
 #ifdef MMX_COEF
 	const unsigned char *key = (unsigned char*)_key;
-	//unsigned int *keybuffer = (unsigned int*)&saved_key[GETPOS(0, index)];
-	unsigned int *keybuffer = buf_ptr[index];
-	unsigned int *keybuf_word = keybuffer;
+	unsigned int *keybuf_word = buf_ptr[index];
 	unsigned int len;
 
 #ifndef MD4_SSE_PARA
@@ -381,7 +377,7 @@ key_cleaning_enc:
 	}
 
 #ifdef MD4_SSE_PARA
-	keybuffer[56] = len << 4;
+	((unsigned int *)saved_key)[14*MMX_COEF + (index&3) + (index>>2)*16*MMX_COEF] = len << 4;
 #else
 	total_len += len << (1 + ( (32/MMX_COEF) * index ) );
 #endif
@@ -400,10 +396,7 @@ static void set_key_utf8(char *_key, int index)
 {
 #ifdef MMX_COEF
 	const UTF8 *source = (UTF8*)_key;
-	//unsigned int *keybuffer = (unsigned int*)&saved_key[GETPOS(0, index)];
-	unsigned int *keybuffer = buf_ptr[index];
-	unsigned int *keybuf_word = keybuffer;
-	unsigned int *keybuf_end = &keybuf_word[MMX_COEF * ((PLAINTEXT_LENGTH + 1) >> 1)];
+	unsigned int *keybuf_word = buf_ptr[index];
 	UTF32 chl, chh = 0x80;
 	unsigned int len = 0;
 
@@ -439,7 +432,7 @@ static void set_key_utf8(char *_key, int index)
 		}
 		source++;
 		len++;
-		if (*source) {
+		if (*source && len < PLAINTEXT_LENGTH) {
 			chh = *source;
 			if (chh >= 0xC0) {
 				unsigned int extraBytesToRead =
@@ -470,15 +463,12 @@ static void set_key_utf8(char *_key, int index)
 			len++;
 		} else {
 			chh = 0x80;
+			*keybuf_word = (chh << 16) | chl;
+			keybuf_word += MMX_COEF;
+			break;
 		}
 		*keybuf_word = (chh << 16) | chl;
 		keybuf_word += MMX_COEF;
-		if (*source == 0) {
-			break;
-		}
-		if (keybuf_word >= keybuf_end) {
-			break;
-		}
 	}
 	if (chh != 0x80 || len == 0) {
 		*keybuf_word = 0x80;
@@ -491,7 +481,7 @@ static void set_key_utf8(char *_key, int index)
 	}
 
 #ifdef MD4_SSE_PARA
-	keybuffer[56] = len << 4;
+	((unsigned int *)saved_key)[14*MMX_COEF + (index&3) + (index>>2)*16*MMX_COEF] = len << 4;
 #else
 	total_len += len << (1 + ( (32/MMX_COEF) * index ) );
 #endif
-- 
1.7.5.4

