Add verification of checksum for -m 13100
[hashcat.git] / src / shared.c
index 3feb053..08bcd90 100644 (file)
@@ -1,6 +1,7 @@
 /**
  * Authors.....: Jens Steube <jens.steube@gmail.com>
  *               Gabriele Gristina <matrix@hashcat.net>
+ *               magnum <john.magnum@hushmail.com>
  *
  * License.....: MIT
  */
  * basic bit handling
  */
 
+u32 is_power_of_2(u32 v)
+{
+  return (v && !(v & (v - 1)));
+}
+
 u32 rotl32 (const u32 a, const u32 n)
 {
   return ((a << n) | (a >> (32 - n)));
@@ -4348,6 +4354,14 @@ void *rulefind (const void *key, void *base, int nmemb, size_t size, int (*compa
   return NULL;
 }
 
+int sort_by_u32 (const void *v1, const void *v2)
+{
+  const u32 *s1 = (const u32 *) v1;
+  const u32 *s2 = (const u32 *) v2;
+
+  return *s1 - *s2;
+}
+
 int sort_by_salt (const void *v1, const void *v2)
 {
   const salt_t *s1 = (const salt_t *) v1;
@@ -8288,7 +8302,7 @@ void ascii_digest (char out_buf[4096], uint salt_pos, uint digest_pos)
     u8 *ptr_checksum  = (u8 *) krb5tgs->checksum;
     u8 *ptr_edata2 = (u8 *) krb5tgs->edata2;
 
-    char data[256] = { 0 };
+    char data[2560 * 4 * 2] = { 0 };
 
     char *ptr_data = data;
 
@@ -8298,11 +8312,9 @@ void ascii_digest (char out_buf[4096], uint salt_pos, uint digest_pos)
     /* skip '$' */
     ptr_data++;
 
-    for (uint i = 0; i < 32; i++, ptr_data += 2)
+    for (uint i = 0; i < krb5tgs->edata2_len; i++, ptr_data += 2)
       sprintf (ptr_data, "%02x", ptr_edata2[i]);
 
-    *ptr_data = 0;
-
     snprintf (out_buf, len-1, "%s$%s$%s$%s",
       SIGNATURE_KRB5TGS,
       (char *) krb5tgs->account_info,
@@ -18719,8 +18731,8 @@ int krb5tgs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
    */
 
   /* Skip '$' */
-  char *account_pos = input_buf + 11 + 1; 
-  
+  char *account_pos = input_buf + 11 + 1;
+
   char *data_pos;
 
   uint data_len;
@@ -18780,14 +18792,17 @@ int krb5tgs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
     *edata_ptr++ = hex_convert (p1) << 0
                     | hex_convert (p0) << 4;
   }
+
+ /* this is needed for hmac_md5 */
+  *edata_ptr++ = 0x80;
   
-  krb5tgs->edata2_len = strlen(edata_ptr - input_len)/(2 * 4);
+  krb5tgs->edata2_len = (data_len - 32) / 2 ;
 
   salt->salt_buf[0] = krb5tgs->checksum[0];
   salt->salt_buf[1] = krb5tgs->checksum[1];
   salt->salt_buf[2] = krb5tgs->checksum[2];
   salt->salt_buf[3] = krb5tgs->checksum[3];
-  
+
   salt->salt_len = 32;
 
   digest[0] = krb5tgs->checksum[0];