1
0
mirror of https://github.com/hashcat/hashcat.git synced 2025-07-04 05:42:35 +00:00

add workaround for false positives on 22931

This commit is contained in:
Gabriele Gristina 2025-04-25 18:02:18 +02:00
parent 6716447dfc
commit fb892e01a8
3 changed files with 219 additions and 0 deletions

View File

@ -26,6 +26,71 @@ typedef struct pem
} pem_t;
DECLSPEC int asn1_check_int_tag (PRIVATE_AS const u32 *buf, const int len)
{
const u8 *bytes = (const u8 *) buf;
int seq_len_offset = 0;
if (bytes[1] < 0x80)
{
seq_len_offset = 2;
}
else if (bytes[1] == 0x81)
{
seq_len_offset = 3;
}
else if (bytes[1] == 0x82)
{
seq_len_offset = 4;
}
else
{
return 0;
}
int pos = seq_len_offset;
if (pos >= len) return 0;
if (pos + 2 > len) return 0;
u8 tag = bytes[pos];
if (tag != 0x02) return 0;
u8 len_byte = bytes[pos + 1];
int val_len = 0;
int tmp_len = 1;
if (len_byte < 0x80)
{
val_len = len_byte;
}
else if (len_byte == 0x81)
{
if (pos + 2 >= len) return 0;
val_len = bytes[pos + 2];
tmp_len = 2;
}
else if (len_byte == 0x82)
{
if (pos + 3 >= len) return 0;
val_len = (bytes[pos + 2] << 8) | bytes[pos + 3];
tmp_len = 3;
}
else
{
return 0;
}
if (pos + 1 + tmp_len + val_len > len) return 0;
if (val_len != 1) return 0;
return 1;
}
KERNEL_FQ void m22931_mxx (KERN_ATTR_RULES_ESALT (pem_t))
{
const u64 gid = get_global_id (0);
@ -224,6 +289,10 @@ KERNEL_FQ void m22931_mxx (KERN_ATTR_RULES_ESALT (pem_t))
if (asn1_ok == 0) continue;
const int asn1_tag_ok = asn1_check_int_tag (dec, real_len);
if (asn1_tag_ok == 0) continue;
const u32 r0 = search[0];
const u32 r1 = search[1];
const u32 r2 = search[2];
@ -431,6 +500,10 @@ KERNEL_FQ void m22931_sxx (KERN_ATTR_RULES_ESALT (pem_t))
if (asn1_ok == 0) continue;
const int asn1_tag_ok = asn1_check_int_tag (dec, real_len);
if (asn1_tag_ok == 0) continue;
const u32 r0 = search[0];
const u32 r1 = search[1];
const u32 r2 = search[2];

View File

@ -24,6 +24,71 @@ typedef struct pem
} pem_t;
DECLSPEC int asn1_check_int_tag (PRIVATE_AS const u32 *buf, const int len)
{
const u8 *bytes = (const u8 *) buf;
int seq_len_offset = 0;
if (bytes[1] < 0x80)
{
seq_len_offset = 2;
}
else if (bytes[1] == 0x81)
{
seq_len_offset = 3;
}
else if (bytes[1] == 0x82)
{
seq_len_offset = 4;
}
else
{
return 0;
}
int pos = seq_len_offset;
if (pos >= len) return 0;
if (pos + 2 > len) return 0;
u8 tag = bytes[pos];
if (tag != 0x02) return 0;
u8 len_byte = bytes[pos + 1];
int val_len = 0;
int tmp_len = 1;
if (len_byte < 0x80)
{
val_len = len_byte;
}
else if (len_byte == 0x81)
{
if (pos + 2 >= len) return 0;
val_len = bytes[pos + 2];
tmp_len = 2;
}
else if (len_byte == 0x82)
{
if (pos + 3 >= len) return 0;
val_len = (bytes[pos + 2] << 8) | bytes[pos + 3];
tmp_len = 3;
}
else
{
return 0;
}
if (pos + 1 + tmp_len + val_len > len) return 0;
if (val_len != 1) return 0;
return 1;
}
KERNEL_FQ void m22931_mxx (KERN_ATTR_ESALT (pem_t))
{
const u64 gid = get_global_id (0);
@ -218,6 +283,10 @@ KERNEL_FQ void m22931_mxx (KERN_ATTR_ESALT (pem_t))
if (asn1_ok == 0) continue;
const int asn1_tag_ok = asn1_check_int_tag (dec, real_len);
if (asn1_tag_ok == 0) continue;
const u32 r0 = search[0];
const u32 r1 = search[1];
const u32 r2 = search[2];
@ -421,6 +490,10 @@ KERNEL_FQ void m22931_sxx (KERN_ATTR_ESALT (pem_t))
if (asn1_ok == 0) continue;
const int asn1_tag_ok = asn1_check_int_tag (dec, real_len);
if (asn1_tag_ok == 0) continue;
const u32 r0 = search[0];
const u32 r1 = search[1];
const u32 r2 = search[2];

View File

@ -24,6 +24,71 @@ typedef struct pem
} pem_t;
DECLSPEC int asn1_check_int_tag (PRIVATE_AS const u32 *buf, const int len)
{
const u8 *bytes = (const u8 *) buf;
int seq_len_offset = 0;
if (bytes[1] < 0x80)
{
seq_len_offset = 2;
}
else if (bytes[1] == 0x81)
{
seq_len_offset = 3;
}
else if (bytes[1] == 0x82)
{
seq_len_offset = 4;
}
else
{
return 0;
}
int pos = seq_len_offset;
if (pos >= len) return 0;
if (pos + 2 > len) return 0;
u8 tag = bytes[pos];
if (tag != 0x02) return 0;
u8 len_byte = bytes[pos + 1];
int val_len = 0;
int tmp_len = 1;
if (len_byte < 0x80)
{
val_len = len_byte;
}
else if (len_byte == 0x81)
{
if (pos + 2 >= len) return 0;
val_len = bytes[pos + 2];
tmp_len = 2;
}
else if (len_byte == 0x82)
{
if (pos + 3 >= len) return 0;
val_len = (bytes[pos + 2] << 8) | bytes[pos + 3];
tmp_len = 3;
}
else
{
return 0;
}
if (pos + 1 + tmp_len + val_len > len) return 0;
if (val_len != 1) return 0;
return 1;
}
KERNEL_FQ void m22931_mxx (KERN_ATTR_VECTOR_ESALT (pem_t))
{
const u64 gid = get_global_id (0);
@ -237,6 +302,10 @@ KERNEL_FQ void m22931_mxx (KERN_ATTR_VECTOR_ESALT (pem_t))
if (asn1_ok == 0) continue;
const int asn1_tag_ok = asn1_check_int_tag (dec, real_len);
if (asn1_tag_ok == 0) continue;
const u32 r0 = search[0];
const u32 r1 = search[1];
const u32 r2 = search[2];
@ -459,6 +528,10 @@ KERNEL_FQ void m22931_sxx (KERN_ATTR_VECTOR_ESALT (pem_t))
if (asn1_ok == 0) continue;
const int asn1_tag_ok = asn1_check_int_tag (dec, real_len);
if (asn1_tag_ok == 0) continue;
const u32 r0 = search[0];
const u32 r1 = search[1];
const u32 r2 = search[2];