From 777512e862a5321d76801d0a21585dc6ca6820ec Mon Sep 17 00:00:00 2001 From: Jens Steube Date: Tue, 20 Jul 2021 11:31:31 +0200 Subject: [PATCH] Fixed false negative in all VeraCrypt hash-modes if both conditions are met: 1. use CPU for cracking and 2. PIM range was used --- OpenCL/inc_simd.h | 24 ++++++++++++++++++++++++ OpenCL/m13711-pure.cl | 2 +- OpenCL/m13712-pure.cl | 2 +- OpenCL/m13713-pure.cl | 2 +- OpenCL/m13721-pure.cl | 2 +- OpenCL/m13722-pure.cl | 2 +- OpenCL/m13723-pure.cl | 2 +- OpenCL/m13731-pure.cl | 2 +- OpenCL/m13732-pure.cl | 2 +- OpenCL/m13733-pure.cl | 2 +- OpenCL/m13751-pure.cl | 2 +- OpenCL/m13752-pure.cl | 2 +- OpenCL/m13753-pure.cl | 2 +- OpenCL/m13771-pure.cl | 2 +- OpenCL/m13772-pure.cl | 2 +- OpenCL/m13773-pure.cl | 2 +- docs/changes.txt | 2 +- 17 files changed, 40 insertions(+), 16 deletions(-) diff --git a/OpenCL/inc_simd.h b/OpenCL/inc_simd.h index f30f07dc3..c3577b297 100644 --- a/OpenCL/inc_simd.h +++ b/OpenCL/inc_simd.h @@ -1049,6 +1049,18 @@ #define MATCHES_NONE_VV(a,b) !(MATCHES_ONE_VV ((a), (b))) #define MATCHES_NONE_VS(a,b) !(MATCHES_ONE_VS ((a), (b))) +#if VECT_SIZE == 1 +#define pack(arr,var,gid,idx) make_u32x ((arr)[((gid) * 1) + 0].var) +#elif VECT_SIZE == 2 +#define pack(arr,var,gid,idx) make_u32x ((arr)[((gid) * 2) + 0].var, (arr)[((gid) * 2) + 1].var) +#elif VECT_SIZE == 4 +#define pack(arr,var,gid,idx) make_u32x ((arr)[((gid) * 4) + 0].var, (arr)[((gid) * 4) + 1].var, (arr)[((gid) * 4) + 2].var, (arr)[((gid) * 4) + 3].var) +#elif VECT_SIZE == 8 +#define pack(arr,var,gid,idx) make_u32x ((arr)[((gid) * 8) + 0].var, (arr)[((gid) * 8) + 1].var, (arr)[((gid) * 8) + 2].var, (arr)[((gid) * 8) + 3].var, (arr)[((gid) * 8) + 4].var, (arr)[((gid) * 8) + 5].var, (arr)[((gid) * 8) + 6].var, (arr)[((gid) * 8) + 7].var) +#elif VECT_SIZE == 16 +#define pack(arr,var,gid,idx) make_u32x ((arr)[((gid) * 16) + 0].var, (arr)[((gid) * 16) + 1].var, (arr)[((gid) * 16) + 2].var, (arr)[((gid) * 16) + 3].var, (arr)[((gid) * 16) + 4].var, (arr)[((gid) * 16) + 5].var, (arr)[((gid) * 16) + 6].var, (arr)[((gid) * 16) + 7].var, (arr)[((gid) * 16) + 8].var, (arr)[((gid) * 16) + 9].var, (arr)[((gid) * 16) + 10].var, (arr)[((gid) * 16) + 11].var, (arr)[((gid) * 16) + 12].var, (arr)[((gid) * 16) + 13].var, (arr)[((gid) * 16) + 14].var, (arr)[((gid) * 16) + 15].var) +#endif + #if VECT_SIZE == 1 #define packv(arr,var,gid,idx) make_u32x ((arr)[((gid) * 1) + 0].var[(idx)]) #elif VECT_SIZE == 2 @@ -1097,6 +1109,18 @@ #define pack64vf(arr,var,gid) make_u64x ((arr)[((gid) * 16) + 0].var, (arr)[((gid) * 16) + 1].var, (arr)[((gid) * 16) + 2].var, (arr)[((gid) * 16) + 3].var, (arr)[((gid) * 16) + 4].var, (arr)[((gid) * 16) + 5].var, (arr)[((gid) * 16) + 6].var, (arr)[((gid) * 16) + 7].var, (arr)[((gid) * 16) + 8].var, (arr)[((gid) * 16) + 9].var, (arr)[((gid) * 16) + 10].var, (arr)[((gid) * 16) + 11].var, (arr)[((gid) * 16) + 12].var, (arr)[((gid) * 16) + 13].var, (arr)[((gid) * 16) + 14].var, (arr)[((gid) * 16) + 15].var) #endif +#if VECT_SIZE == 1 +#define unpack(arr,var,gid,val) (arr)[((gid) * 1) + 0].var = val; +#elif VECT_SIZE == 2 +#define unpack(arr,var,gid,val) (arr)[((gid) * 2) + 0].var = val.s0; (arr)[((gid) * 2) + 1].var = val.s1; +#elif VECT_SIZE == 4 +#define unpack(arr,var,gid,val) (arr)[((gid) * 4) + 0].var = val.s0; (arr)[((gid) * 4) + 1].var = val.s1; (arr)[((gid) * 4) + 2].var = val.s2; (arr)[((gid) * 4) + 3].var = val.s3; +#elif VECT_SIZE == 8 +#define unpack(arr,var,gid,val) (arr)[((gid) * 8) + 0].var = val.s0; (arr)[((gid) * 8) + 1].var = val.s1; (arr)[((gid) * 8) + 2].var = val.s2; (arr)[((gid) * 8) + 3].var = val.s3; (arr)[((gid) * 8) + 4].var = val.s4; (arr)[((gid) * 8) + 5].var = val.s5; (arr)[((gid) * 8) + 6].var = val.s6; (arr)[((gid) * 8) + 7].var = val.s7; +#elif VECT_SIZE == 16 +#define unpack(arr,var,gid,val) (arr)[((gid) * 16) + 0].var = val.s0; (arr)[((gid) * 16) + 1].var = val.s1; (arr)[((gid) * 16) + 2].var = val.s2; (arr)[((gid) * 16) + 3].var = val.s3; (arr)[((gid) * 16) + 4].var = val.s4; (arr)[((gid) * 16) + 5].var = val.s5; (arr)[((gid) * 16) + 6].var = val.s6; (arr)[((gid) * 16) + 7].var = val.s7; (arr)[((gid) * 16) + 8].var = val.s8; (arr)[((gid) * 16) + 9].var = val.s9; (arr)[((gid) * 16) + 10].var = val.sa; (arr)[((gid) * 16) + 11].var = val.sb; (arr)[((gid) * 16) + 12].var = val.sc; (arr)[((gid) * 16) + 13].var = val.sd; (arr)[((gid) * 16) + 14].var = val.se; (arr)[((gid) * 16) + 15].var = val.sf; +#endif + #if VECT_SIZE == 1 #define unpackv(arr,var,gid,idx,val) (arr)[((gid) * 1) + 0].var[(idx)] = val; #elif VECT_SIZE == 2 diff --git a/OpenCL/m13711-pure.cl b/OpenCL/m13711-pure.cl index 812a9ecfc..a69f57b43 100644 --- a/OpenCL/m13711-pure.cl +++ b/OpenCL/m13711-pure.cl @@ -366,7 +366,7 @@ KERNEL_FQ void m13711_loop (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) unpackv (tmps, pim_key, gid, i + 3, out[3]); unpackv (tmps, pim_key, gid, i + 4, out[4]); - tmps[gid].pim_check = pim; + unpack (tmps, pim_check, gid, make_u32x (pim)); } } diff --git a/OpenCL/m13712-pure.cl b/OpenCL/m13712-pure.cl index f60004897..9cc3a25d8 100644 --- a/OpenCL/m13712-pure.cl +++ b/OpenCL/m13712-pure.cl @@ -417,7 +417,7 @@ KERNEL_FQ void m13712_loop (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) unpackv (tmps, pim_key, gid, i + 3, out[3]); unpackv (tmps, pim_key, gid, i + 4, out[4]); - tmps[gid].pim_check = pim; + unpack (tmps, pim_check, gid, make_u32x (pim)); } } diff --git a/OpenCL/m13713-pure.cl b/OpenCL/m13713-pure.cl index 4a18a3885..512ae761b 100644 --- a/OpenCL/m13713-pure.cl +++ b/OpenCL/m13713-pure.cl @@ -482,7 +482,7 @@ KERNEL_FQ void m13713_loop (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) unpackv (tmps, pim_key, gid, i + 3, out[3]); unpackv (tmps, pim_key, gid, i + 4, out[4]); - tmps[gid].pim_check = pim; + unpack (tmps, pim_check, gid, make_u32x (pim)); } } diff --git a/OpenCL/m13721-pure.cl b/OpenCL/m13721-pure.cl index dd1b8f752..fa376f320 100644 --- a/OpenCL/m13721-pure.cl +++ b/OpenCL/m13721-pure.cl @@ -458,7 +458,7 @@ KERNEL_FQ void m13721_loop (KERN_ATTR_TMPS_ESALT (vc64_tmp_t, vc_t)) unpack64v (tmps, pim_key, gid, i + 6, out[6]); unpack64v (tmps, pim_key, gid, i + 7, out[7]); - tmps[gid].pim_check = pim; + unpack (tmps, pim_check, gid, make_u32x (pim)); } } diff --git a/OpenCL/m13722-pure.cl b/OpenCL/m13722-pure.cl index 80a9fb1b6..06c7ed369 100644 --- a/OpenCL/m13722-pure.cl +++ b/OpenCL/m13722-pure.cl @@ -509,7 +509,7 @@ KERNEL_FQ void m13722_loop (KERN_ATTR_TMPS_ESALT (vc64_tmp_t, vc_t)) unpack64v (tmps, pim_key, gid, i + 6, out[6]); unpack64v (tmps, pim_key, gid, i + 7, out[7]); - tmps[gid].pim_check = pim; + unpack (tmps, pim_check, gid, make_u32x (pim)); } } diff --git a/OpenCL/m13723-pure.cl b/OpenCL/m13723-pure.cl index 465c5000d..56c1a67b8 100644 --- a/OpenCL/m13723-pure.cl +++ b/OpenCL/m13723-pure.cl @@ -574,7 +574,7 @@ KERNEL_FQ void m13723_loop (KERN_ATTR_TMPS_ESALT (vc64_tmp_t, vc_t)) unpack64v (tmps, pim_key, gid, i + 6, out[6]); unpack64v (tmps, pim_key, gid, i + 7, out[7]); - tmps[gid].pim_check = pim; + unpack (tmps, pim_check, gid, make_u32x (pim)); } } diff --git a/OpenCL/m13731-pure.cl b/OpenCL/m13731-pure.cl index 53c0aee63..3e7321c0c 100644 --- a/OpenCL/m13731-pure.cl +++ b/OpenCL/m13731-pure.cl @@ -622,7 +622,7 @@ KERNEL_FQ void m13731_loop (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) unpackv (tmps, pim_key, gid, i + 14, out[14]); unpackv (tmps, pim_key, gid, i + 15, out[15]); - tmps[gid].pim_check = pim; + unpack (tmps, pim_check, gid, make_u32x (pim)); } } diff --git a/OpenCL/m13732-pure.cl b/OpenCL/m13732-pure.cl index fde64f5cd..512ac4475 100644 --- a/OpenCL/m13732-pure.cl +++ b/OpenCL/m13732-pure.cl @@ -673,7 +673,7 @@ KERNEL_FQ void m13732_loop (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) unpackv (tmps, pim_key, gid, i + 14, out[14]); unpackv (tmps, pim_key, gid, i + 15, out[15]); - tmps[gid].pim_check = pim; + unpack (tmps, pim_check, gid, make_u32x (pim)); } } diff --git a/OpenCL/m13733-pure.cl b/OpenCL/m13733-pure.cl index 63d5b1a4c..23c85c1fa 100644 --- a/OpenCL/m13733-pure.cl +++ b/OpenCL/m13733-pure.cl @@ -738,7 +738,7 @@ KERNEL_FQ void m13733_loop (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) unpackv (tmps, pim_key, gid, i + 14, out[14]); unpackv (tmps, pim_key, gid, i + 15, out[15]); - tmps[gid].pim_check = pim; + unpack (tmps, pim_check, gid, make_u32x (pim)); } } diff --git a/OpenCL/m13751-pure.cl b/OpenCL/m13751-pure.cl index e795fe1e6..faba1b96f 100644 --- a/OpenCL/m13751-pure.cl +++ b/OpenCL/m13751-pure.cl @@ -435,7 +435,7 @@ KERNEL_FQ void m13751_loop (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) unpackv (tmps, pim_key, gid, i + 6, out[6]); unpackv (tmps, pim_key, gid, i + 7, out[7]); - tmps[gid].pim_check = pim; + unpack (tmps, pim_check, gid, make_u32x (pim)); } } diff --git a/OpenCL/m13752-pure.cl b/OpenCL/m13752-pure.cl index 5ae1b2468..dddb5c96d 100644 --- a/OpenCL/m13752-pure.cl +++ b/OpenCL/m13752-pure.cl @@ -457,7 +457,7 @@ KERNEL_FQ void m13752_loop (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) unpackv (tmps, pim_key, gid, i + 6, out[6]); unpackv (tmps, pim_key, gid, i + 7, out[7]); - tmps[gid].pim_check = pim; + unpack (tmps, pim_check, gid, make_u32x (pim)); } } diff --git a/OpenCL/m13753-pure.cl b/OpenCL/m13753-pure.cl index 0d33af281..05312e832 100644 --- a/OpenCL/m13753-pure.cl +++ b/OpenCL/m13753-pure.cl @@ -522,7 +522,7 @@ KERNEL_FQ void m13753_loop (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) unpackv (tmps, pim_key, gid, i + 6, out[6]); unpackv (tmps, pim_key, gid, i + 7, out[7]); - tmps[gid].pim_check = pim; + unpack (tmps, pim_check, gid, make_u32x (pim)); } } diff --git a/OpenCL/m13771-pure.cl b/OpenCL/m13771-pure.cl index 2c5e24985..a382703df 100644 --- a/OpenCL/m13771-pure.cl +++ b/OpenCL/m13771-pure.cl @@ -537,7 +537,7 @@ KERNEL_FQ void m13771_loop (KERN_ATTR_TMPS_ESALT (vc64_sbog_tmp_t, vc_t)) unpack64v (tmps, pim_key, gid, i + 6, out[6]); unpack64v (tmps, pim_key, gid, i + 7, out[7]); - tmps[gid].pim_check = pim; + unpack (tmps, pim_check, gid, make_u32x (pim)); } } diff --git a/OpenCL/m13772-pure.cl b/OpenCL/m13772-pure.cl index 449a2c2b9..1e556621f 100644 --- a/OpenCL/m13772-pure.cl +++ b/OpenCL/m13772-pure.cl @@ -588,7 +588,7 @@ KERNEL_FQ void m13772_loop (KERN_ATTR_TMPS_ESALT (vc64_sbog_tmp_t, vc_t)) unpack64v (tmps, pim_key, gid, i + 6, out[6]); unpack64v (tmps, pim_key, gid, i + 7, out[7]); - tmps[gid].pim_check = pim; + unpack (tmps, pim_check, gid, make_u32x (pim)); } } diff --git a/OpenCL/m13773-pure.cl b/OpenCL/m13773-pure.cl index 7299593f8..66845a28a 100644 --- a/OpenCL/m13773-pure.cl +++ b/OpenCL/m13773-pure.cl @@ -653,7 +653,7 @@ KERNEL_FQ void m13773_loop (KERN_ATTR_TMPS_ESALT (vc64_sbog_tmp_t, vc_t)) unpack64v (tmps, pim_key, gid, i + 6, out[6]); unpack64v (tmps, pim_key, gid, i + 7, out[7]); - tmps[gid].pim_check = pim; + unpack (tmps, pim_check, gid, make_u32x (pim)); } } diff --git a/docs/changes.txt b/docs/changes.txt index e0400ad09..04ad521d0 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -6,7 +6,7 @@ - Fixed autotune unitialized tmps variable for slow hashes by calling _init kernel before calling _loop kernel - Fixed datatype in function sha384_hmac_init_vector_128() that could come into effect if vector datatype was manually set - +- Fixed false negative in all VeraCrypt hash-modes if both conditions are met: 1. use CPU for cracking and 2. PIM range was used ## ## Improvements