From fe53c0311c94943b162fcd12dc0974fb1b672ca0 Mon Sep 17 00:00:00 2001
From: penturalabs <andy.davies@pentura.com>
Date: Fri, 2 May 2014 23:30:03 +0100
Subject: [PATCH] improved calc_iclass_mac to work independant of size

---
 client/cmdhficlass.c    |  2 +-
 client/loclass/cipher.c | 13 +++++++------
 client/loclass/cipher.h |  2 +-
 3 files changed, 9 insertions(+), 8 deletions(-)

diff --git a/client/cmdhficlass.c b/client/cmdhficlass.c
index 34e8f6d9..389fb5c1 100644
--- a/client/cmdhficlass.c
+++ b/client/cmdhficlass.c
@@ -308,7 +308,7 @@ int CmdHFiClassReader_Dump(const char *Cmd)
   hash0(crypted_id,div_key);
   //memcpy(div_key,result,8);
   PrintAndLog("Div Key: %s",sprint_hex(div_key,8));
-  calc_iclass_mac(CCNR,div_key,MAC);
+  calc_iclass_mac(CCNR,12,div_key,MAC);
 
   UsbCommand c = {CMD_READER_ICLASS_REPLAY, {readerType}};
   memcpy(c.d.asBytes, MAC, 4);
diff --git a/client/loclass/cipher.c b/client/loclass/cipher.c
index d7c9abda..aad77a2e 100644
--- a/client/loclass/cipher.c
+++ b/client/loclass/cipher.c
@@ -238,15 +238,16 @@ int testMAC()
 	return 0;
 }
 
-int calc_iclass_mac(uint8_t *cc_nr_p, uint8_t *div_key_p, uint8_t *mac)
+int calc_iclass_mac(uint8_t *cc_nr_p, int length, uint8_t *div_key_p, uint8_t *mac)
 {
-    uint8_t cc_nr[12];
+    uint8_t *cc_nr;
     uint8_t div_key[8];
-    memcpy(cc_nr,cc_nr_p,12);
+    cc_nr=(uint8_t*)malloc(length+1);
+    memcpy(cc_nr,cc_nr_p,length);
     memcpy(div_key,div_key_p,8);
     
-	reverse_arraybytes(cc_nr,sizeof(cc_nr));
-	BitstreamIn bitstream = {cc_nr,sizeof(cc_nr) * 8,0};
+	reverse_arraybytes(cc_nr,length);
+	BitstreamIn bitstream = {cc_nr,length * 8,0};
 	uint8_t dest []= {0,0,0,0,0,0,0,0};
 	BitstreamOut out = { dest, sizeof(dest)*8, 0 };
 	MAC(div_key,bitstream, out);
@@ -255,6 +256,6 @@ int calc_iclass_mac(uint8_t *cc_nr_p, uint8_t *div_key_p, uint8_t *mac)
 	
 	printf("Calculated_MAC\t%02x%02x%02x%02x\n", dest[0],dest[1],dest[2],dest[3]);
 	memcpy(mac,dest,4);
-	
+	free(cc_nr);
 	return 1;
 }
\ No newline at end of file
diff --git a/client/loclass/cipher.h b/client/loclass/cipher.h
index 10ea8059..4af92b16 100644
--- a/client/loclass/cipher.h
+++ b/client/loclass/cipher.h
@@ -41,6 +41,6 @@ typedef struct {
 } State;
 
 void printarr(char * name, uint8_t* arr, int len);
-int calc_iclass_mac(uint8_t *cc_nr_p, uint8_t *div_key_p, uint8_t *mac);
+int calc_iclass_mac(uint8_t *cc_nr_p, int length, uint8_t *div_key_p, uint8_t *mac);
 
 #endif // CIPHER_H
-- 
2.39.5