From 4b5c058006f690006a9ef143b7a9fcaf21a30a75 Mon Sep 17 00:00:00 2001
From: magnum <magnum>
Date: Tue, 29 Nov 2011 13:16:06 +0100
Subject: [PATCH 19/22] Dynamic alloc of MKPC arrays for mskrb5, net*lm*,
 mschapv2 and sap formats

---
 src/MSCHAPv2_fmt_plug.c   |   12 ++++++++----
 src/NETLM_fmt_plug.c      |    9 ++++++---
 src/NETLMv2_fmt_plug.c    |   12 ++++++++----
 src/NETNTLM_fmt_plug.c    |   12 ++++++++----
 src/NETNTLMv2_fmt_plug.c  |   12 ++++++++----
 src/NETSPLITLM_fmt_plug.c |    9 ++++++---
 src/mskrb5_fmt_plug.c     |   14 ++++++++++----
 src/sapB_fmt_plug.c       |   24 +++++++++++++++++++-----
 src/sapG_fmt_plug.c       |   24 +++++++++++++++++-------
 9 files changed, 90 insertions(+), 38 deletions(-)

diff --git a/src/MSCHAPv2_fmt_plug.c b/src/MSCHAPv2_fmt_plug.c
index a607da6..b53f2a3 100644
--- a/src/MSCHAPv2_fmt_plug.c
+++ b/src/MSCHAPv2_fmt_plug.c
@@ -83,11 +83,11 @@ static struct fmt_tests tests[] = {
   {NULL}
 };
 
-static uchar saved_plain[MAX_KEYS_PER_CRYPT][PLAINTEXT_LENGTH + 1];
-static int saved_len[MAX_KEYS_PER_CRYPT];
-static uchar saved_key[MAX_KEYS_PER_CRYPT][21];
+static uchar (*saved_plain)[PLAINTEXT_LENGTH + 1];
+static int (*saved_len);
+static uchar (*saved_key)[21];
+static uchar (*output)[PARTIAL_BINARY_SIZE];
 static uchar *challenge;
-static ARCH_WORD_32 output[MAX_KEYS_PER_CRYPT][PARTIAL_BINARY_SIZE/sizeof(ARCH_WORD_32)];
 static int keys_prepared;
 
 #include "unicode.h"
@@ -107,6 +107,10 @@ static void init(struct fmt_main *pFmt)
 		n = MAX_KEYS_PER_CRYPT;
 	fmt_MSCHAPv2.params.max_keys_per_crypt = n;
 #endif
+	saved_plain = mem_alloc_tiny(sizeof(*saved_plain) * fmt_MSCHAPv2.params.max_keys_per_crypt, MEM_ALIGN_NONE);
+	saved_len = mem_alloc_tiny(sizeof(*saved_len) * fmt_MSCHAPv2.params.max_keys_per_crypt, MEM_ALIGN_WORD);
+	saved_key = mem_alloc_tiny(sizeof(*saved_key) * fmt_MSCHAPv2.params.max_keys_per_crypt, MEM_ALIGN_NONE);
+	output = mem_alloc_tiny(sizeof(*output) * fmt_MSCHAPv2.params.max_keys_per_crypt, MEM_ALIGN_WORD);
 }
 
 static int mschapv2_valid(char *ciphertext, struct fmt_main *pFmt)
diff --git a/src/NETLM_fmt_plug.c b/src/NETLM_fmt_plug.c
index c6d67a7..ee2015e 100644
--- a/src/NETLM_fmt_plug.c
+++ b/src/NETLM_fmt_plug.c
@@ -84,10 +84,10 @@ static struct fmt_tests tests[] = {
   {NULL}
 };
 
-static uchar saved_key[MAX_KEYS_PER_CRYPT][21];
-static uchar saved_plain[MAX_KEYS_PER_CRYPT][PLAINTEXT_LENGTH + 1];
+static uchar (*saved_key)[21];
+static uchar (*saved_plain)[PLAINTEXT_LENGTH + 1];
+static uchar (*output)[PARTIAL_BINARY_SIZE];
 static uchar *challenge;
-static ARCH_WORD_32 output[MAX_KEYS_PER_CRYPT][PARTIAL_BINARY_SIZE/sizeof(ARCH_WORD_32)];
 
 extern struct fmt_main fmt_NETLM;
 static void init(struct fmt_main *pFmt)
@@ -104,6 +104,9 @@ static void init(struct fmt_main *pFmt)
 		n = MAX_KEYS_PER_CRYPT;
 	fmt_NETLM.params.max_keys_per_crypt = n;
 #endif
+	saved_key = mem_alloc_tiny(sizeof(*saved_key) * fmt_NETLM.params.max_keys_per_crypt, MEM_ALIGN_NONE);
+	saved_plain = mem_alloc_tiny(sizeof(*saved_plain) * fmt_NETLM.params.max_keys_per_crypt, MEM_ALIGN_NONE);
+	output = mem_alloc_tiny(sizeof(*output) * fmt_NETLM.params.max_keys_per_crypt, MEM_ALIGN_WORD);
 }
 
 static int netlm_valid(char *ciphertext, struct fmt_main *pFmt)
diff --git a/src/NETLMv2_fmt_plug.c b/src/NETLMv2_fmt_plug.c
index 38d563c..b621a95 100644
--- a/src/NETLMv2_fmt_plug.c
+++ b/src/NETLMv2_fmt_plug.c
@@ -92,12 +92,12 @@ static struct fmt_tests tests[] = {
   {NULL}
 };
 
-static unsigned char saved_plain[MAX_KEYS_PER_CRYPT][PLAINTEXT_LENGTH + 1];
-static int saved_len[MAX_KEYS_PER_CRYPT];
+static uchar (*saved_plain)[PLAINTEXT_LENGTH + 1];
+static int (*saved_len);
+static uchar (*output)[BINARY_SIZE];
+static HMACMD5Context (*saved_ctx);
 static int keys_prepared;
-static HMACMD5Context saved_ctx[MAX_KEYS_PER_CRYPT];
 static unsigned char *challenge;
-static ARCH_WORD_32 output[MAX_KEYS_PER_CRYPT][BINARY_SIZE/sizeof(ARCH_WORD_32)];
 
 #if !defined(uint16) && !defined(HAVE_UINT16_FROM_RPC_RPC_H)
 #if (SIZEOF_SHORT == 4)
@@ -132,6 +132,10 @@ static void init(struct fmt_main *pFmt)
 		n = MAX_KEYS_PER_CRYPT;
 	fmt_NETLMv2.params.max_keys_per_crypt = n;
 #endif
+	saved_plain = mem_alloc_tiny(sizeof(*saved_plain) * fmt_NETLMv2.params.max_keys_per_crypt, MEM_ALIGN_NONE);
+	saved_len = mem_alloc_tiny(sizeof(*saved_len) * fmt_NETLMv2.params.max_keys_per_crypt, MEM_ALIGN_WORD);
+	output = mem_alloc_tiny(sizeof(*output) * fmt_NETLMv2.params.max_keys_per_crypt, MEM_ALIGN_WORD);
+	saved_ctx = mem_alloc_tiny(sizeof(*saved_ctx) * fmt_NETLMv2.params.max_keys_per_crypt, MEM_ALIGN_WORD);
 }
 
 static int netlmv2_valid(char *ciphertext, struct fmt_main *pFmt)
diff --git a/src/NETNTLM_fmt_plug.c b/src/NETNTLM_fmt_plug.c
index 952baf7..a832346 100644
--- a/src/NETNTLM_fmt_plug.c
+++ b/src/NETNTLM_fmt_plug.c
@@ -96,11 +96,11 @@ static struct fmt_tests tests[] = {
   {NULL}
 };
 
-static char saved_plain[MAX_KEYS_PER_CRYPT][PLAINTEXT_LENGTH + 1];
-static int saved_len[MAX_KEYS_PER_CRYPT];
+static char (*saved_plain)[PLAINTEXT_LENGTH + 1];
+static int (*saved_len);
+static uchar (*output)[PARTIAL_BINARY_SIZE];
+static uchar (*saved_key)[21]; // NT hash
 static uchar *challenge;
-static ARCH_WORD_32 output[MAX_KEYS_PER_CRYPT][PARTIAL_BINARY_SIZE/sizeof(ARCH_WORD_32)];
-static uchar saved_key[MAX_KEYS_PER_CRYPT][21]; // NT hash
 static int keys_prepared;
 
 extern struct fmt_main fmt_NETNTLM;
@@ -118,6 +118,10 @@ static void init(struct fmt_main *pFmt)
 		n = MAX_KEYS_PER_CRYPT;
 	fmt_NETNTLM.params.max_keys_per_crypt = n;
 #endif
+	saved_plain = mem_alloc_tiny(sizeof(*saved_plain) * fmt_NETNTLM.params.max_keys_per_crypt, MEM_ALIGN_NONE);
+	saved_len = mem_alloc_tiny(sizeof(*saved_len) * fmt_NETNTLM.params.max_keys_per_crypt, MEM_ALIGN_WORD);
+	output = mem_alloc_tiny(sizeof(*output) * fmt_NETNTLM.params.max_keys_per_crypt, MEM_ALIGN_WORD);
+	saved_key = mem_alloc_tiny(sizeof(*saved_key) * fmt_NETNTLM.params.max_keys_per_crypt, MEM_ALIGN_NONE);
 }
 
 static int netntlm_valid(char *ciphertext, struct fmt_main *pFmt)
diff --git a/src/NETNTLMv2_fmt_plug.c b/src/NETNTLMv2_fmt_plug.c
index 1f97264..fc5d72b 100644
--- a/src/NETNTLMv2_fmt_plug.c
+++ b/src/NETNTLMv2_fmt_plug.c
@@ -99,11 +99,11 @@ static struct fmt_tests tests[] = {
   {NULL}
 };
 
-static uchar saved_plain[MAX_KEYS_PER_CRYPT][PLAINTEXT_LENGTH + 1];
-static int saved_len[MAX_KEYS_PER_CRYPT];
+static uchar (*saved_plain)[PLAINTEXT_LENGTH + 1];
+static int (*saved_len);
+static uchar (*output)[BINARY_SIZE];
+static HMACMD5Context (*saved_ctx);
 static uchar *challenge;
-static ARCH_WORD_32 output[MAX_KEYS_PER_CRYPT][BINARY_SIZE/sizeof(ARCH_WORD_32)];
-static HMACMD5Context saved_ctx[MAX_KEYS_PER_CRYPT];
 static int keys_prepared;
 
 #if !defined(uint16) && !defined(HAVE_UINT16_FROM_RPC_RPC_H)
@@ -139,6 +139,10 @@ static void init(struct fmt_main *pFmt)
 		n = MAX_KEYS_PER_CRYPT;
 	fmt_NETNTLMv2.params.max_keys_per_crypt = n;
 #endif
+	saved_plain = mem_alloc_tiny(sizeof(*saved_plain) * fmt_NETNTLMv2.params.max_keys_per_crypt, MEM_ALIGN_NONE);
+	saved_len = mem_alloc_tiny(sizeof(*saved_len) * fmt_NETNTLMv2.params.max_keys_per_crypt, MEM_ALIGN_WORD);
+	output = mem_alloc_tiny(sizeof(*output) * fmt_NETNTLMv2.params.max_keys_per_crypt, MEM_ALIGN_WORD);
+	saved_ctx = mem_alloc_tiny(sizeof(*saved_ctx) * fmt_NETNTLMv2.params.max_keys_per_crypt, MEM_ALIGN_WORD);
 }
 
 static int netntlmv2_valid(char *ciphertext, struct fmt_main *pFmt)
diff --git a/src/NETSPLITLM_fmt_plug.c b/src/NETSPLITLM_fmt_plug.c
index 1ce197a..feb1ae0 100644
--- a/src/NETSPLITLM_fmt_plug.c
+++ b/src/NETSPLITLM_fmt_plug.c
@@ -63,10 +63,10 @@ static struct fmt_tests tests[] = {
   {NULL}
 };
 
-static uchar saved_plain[MAX_KEYS_PER_CRYPT][PLAINTEXT_LENGTH + 1];
-static uchar saved_pre[MAX_KEYS_PER_CRYPT][8];
+static uchar (*saved_plain)[PLAINTEXT_LENGTH + 1];
+static uchar (*saved_pre)[8];
+static uchar (*output)[BINARY_SIZE];
 static uchar *challenge;
-static uchar output[MAX_KEYS_PER_CRYPT][BINARY_SIZE];
 
 extern struct fmt_main fmt_NETHALFLM;
 static void init(struct fmt_main *pFmt)
@@ -83,6 +83,9 @@ static void init(struct fmt_main *pFmt)
 		n = MAX_KEYS_PER_CRYPT;
 	fmt_NETHALFLM.params.max_keys_per_crypt = n;
 #endif
+	saved_plain = mem_alloc_tiny(sizeof(*saved_plain) * fmt_NETHALFLM.params.max_keys_per_crypt, MEM_ALIGN_NONE);
+	saved_pre = mem_alloc_tiny(sizeof(*saved_pre) * fmt_NETHALFLM.params.max_keys_per_crypt, MEM_ALIGN_NONE);
+	output = mem_alloc_tiny(sizeof(*output) * fmt_NETHALFLM.params.max_keys_per_crypt, MEM_ALIGN_WORD);
 }
 
 static int nethalflm_valid(char *ciphertext, struct fmt_main *pFmt)
diff --git a/src/mskrb5_fmt_plug.c b/src/mskrb5_fmt_plug.c
index 12e183a..e7153db 100644
--- a/src/mskrb5_fmt_plug.c
+++ b/src/mskrb5_fmt_plug.c
@@ -93,10 +93,11 @@ static struct fmt_tests tests[] = {
 	{NULL}
 };
 
-static ARCH_WORD_32 saved_plain[MAX_KEYS_PER_CRYPT][(PLAINTEXT_LENGTH+4)/sizeof(ARCH_WORD_32)];
-static int saved_len[MAX_KEYS_PER_CRYPT];
-static ARCH_WORD_32 output[MAX_KEYS_PER_CRYPT][CRYPT_BINARY_SIZE/sizeof(ARCH_WORD_32)];
-static HMACMD5Context saved_ctx[MAX_KEYS_PER_CRYPT];
+static char (*saved_plain)[(PLAINTEXT_LENGTH+4)];
+static int (*saved_len);
+static char (*output)[CRYPT_BINARY_SIZE];
+static HMACMD5Context (*saved_ctx);
+
 static int keys_prepared;
 static unsigned char *saltblob = NULL;
 #define CHECKSUM  saltblob
@@ -117,6 +118,11 @@ static void init(struct fmt_main *pFmt)
 		n = MAX_KEYS_PER_CRYPT;
 	fmt_mskrb5.params.max_keys_per_crypt = n;
 #endif
+	saved_plain = mem_alloc_tiny(sizeof(*saved_plain) * fmt_mskrb5.params.max_keys_per_crypt, MEM_ALIGN_WORD);
+	saved_len = mem_alloc_tiny(sizeof(*saved_len) * fmt_mskrb5.params.max_keys_per_crypt, MEM_ALIGN_WORD);
+	output = mem_alloc_tiny(sizeof(*output) * fmt_mskrb5.params.max_keys_per_crypt, MEM_ALIGN_WORD);
+	saved_ctx = mem_alloc_tiny(sizeof(*saved_ctx) * fmt_mskrb5.params.max_keys_per_crypt, MEM_ALIGN_WORD);
+
 	if (options.utf8) {
 		tests[1].plaintext = "\xC3\xBC"; // German u-umlaut in UTF-8
 		tests[1].ciphertext = "$mskrb5$$$958db4ddb514a6cc8be1b1ccf82b0191$090408357a6f41852d17f3b4bb4634adfd388db1be64d3fe1a1d75ee4338d2a4aea387e5";
diff --git a/src/sapB_fmt_plug.c b/src/sapB_fmt_plug.c
index 1cda48e..ceb4771 100644
--- a/src/sapB_fmt_plug.c
+++ b/src/sapB_fmt_plug.c
@@ -78,13 +78,27 @@ static struct fmt_tests sapbcode_tests[] = {
 	{NULL}
 };
 
-static char saved_key[MAX_KEYS_PER_CRYPT][PLAINTEXT_LENGTH + 1];
-static ARCH_WORD_32 crypt_key[MAX_KEYS_PER_CRYPT][BINARY_SIZE/sizeof(ARCH_WORD_32)];
-static char pwConverted[MAX_KEYS_PER_CRYPT][PLAINTEXT_LENGTH+1];
-static int strlenPW[MAX_KEYS_PER_CRYPT];
+static char (*saved_key)[PLAINTEXT_LENGTH + 1];
+static ARCH_WORD_32 (*crypt_key)[BINARY_SIZE/sizeof(ARCH_WORD_32)];
+static char (*pwConverted)[PLAINTEXT_LENGTH+1];
+static int (*strlenPW);
+#define setzero(var) memset(var, 0, sizeof(*var) * MAX_KEYS_PER_CRYPT)
+
 static char unConverted[SALT_SIZE+1];
 static int strlenUN;
 
+static void sapbcode_init(struct fmt_main *pFmt)
+{
+	saved_key = mem_alloc_tiny(sizeof(*saved_key) * MAX_KEYS_PER_CRYPT, MEM_ALIGN_NONE);
+	crypt_key = mem_alloc_tiny(sizeof(*crypt_key) * MAX_KEYS_PER_CRYPT, MEM_ALIGN_WORD);
+	pwConverted = mem_alloc_tiny(sizeof(*pwConverted) * MAX_KEYS_PER_CRYPT, MEM_ALIGN_NONE);
+	strlenPW = mem_alloc_tiny(sizeof(*strlenPW) * MAX_KEYS_PER_CRYPT, MEM_ALIGN_WORD);
+	setzero(saved_key);
+	setzero(crypt_key);
+	setzero(pwConverted);
+	setzero(strlenPW);
+}
+
 static int sapbcode_valid(char *ciphertext, struct fmt_main *pFmt)
 {
 	int i;
@@ -358,7 +372,7 @@ struct fmt_main fmt_sapB = {
 		FMT_8_BIT | FMT_SPLIT_UNIFIES_CASE | FMT_OMP,
 		sapbcode_tests
 	}, {
-		fmt_default_init,
+		sapbcode_init,
 		fmt_default_prepare,
 		sapbcode_valid,
 		sapbcode_split,
diff --git a/src/sapG_fmt_plug.c b/src/sapG_fmt_plug.c
index 65220e1..65237c3 100644
--- a/src/sapG_fmt_plug.c
+++ b/src/sapG_fmt_plug.c
@@ -67,14 +67,27 @@ static struct fmt_tests sapcodvng_tests[] = {
 	{NULL}
 };
 
-static char saved_key[MAX_KEYS_PER_CRYPT][PLAINTEXT_LENGTH + 1];
-static UTF8 trPassword[MAX_KEYS_PER_CRYPT][PLAINTEXT_LENGTH + 1];
-static int pwLen[MAX_KEYS_PER_CRYPT];
-static ARCH_WORD_32 crypt_key[MAX_KEYS_PER_CRYPT][BINARY_SIZE / 4];
+static char (*saved_key)[PLAINTEXT_LENGTH + 1];
+static UTF8 (*trPassword)[PLAINTEXT_LENGTH + 1];
+static int (*pwLen);
+static ARCH_WORD_32 (*crypt_key)[BINARY_SIZE / sizeof(ARCH_WORD_32)];
+#define setzero(var) memset(var, 0, sizeof(*var) * MAX_KEYS_PER_CRYPT)
 
 static char theSalt[SALT_SIZE];
 static unsigned int unLen;
 
+static void sapcodvng_init(struct fmt_main *pFmt)
+{
+	saved_key = mem_alloc_tiny(sizeof(*saved_key) * MAX_KEYS_PER_CRYPT, MEM_ALIGN_NONE);
+	trPassword = mem_alloc_tiny(sizeof(*trPassword) * MAX_KEYS_PER_CRYPT, MEM_ALIGN_NONE);
+	pwLen = mem_alloc_tiny(sizeof(*pwLen) * MAX_KEYS_PER_CRYPT, MEM_ALIGN_WORD);
+	crypt_key = mem_alloc_tiny(sizeof(*crypt_key) * MAX_KEYS_PER_CRYPT, MEM_ALIGN_WORD);
+	setzero(saved_key);
+	setzero(trPassword);
+	setzero(pwLen);
+	setzero(crypt_key);
+}
+
 static int sapcodvng_valid(char *ciphertext, struct fmt_main *pFmt)
 {
 	int i;
@@ -129,9 +142,6 @@ static void *sapcodvng_get_salt(char *ciphertext)
 	return sssalt;
 }
 
-static void sapcodvng_init(struct fmt_main *pFmt)
-{ }
-
 static void sapcodvng_set_key(char *key, int index)
 {
 	strnzcpy(saved_key[index], key, PLAINTEXT_LENGTH + 1);
-- 
1.7.5.4

