![]() |
A52HackTool 1.3.0
Turnkey & easy to use tool for cracking the GSM A5/2 cipher
|
Utilitary tools & Macros. More...
#include <sys/time.h>Go to the source code of this file.
Defines | |
| #define | DEBUG_INFO 0 |
| Debug Flag. Set to non-zero to activate debug info display. | |
| #define | MIN(a, b) (((a)<(b)) ? (a) : (b)) |
| Standard min math function, returns the minimum of a and b. | |
| #define | MAX(a, b) (((a)>(b)) ? (a) : (b)) |
| Standard max math function, returns the maximum of a and b. | |
| #define | MSBIT(i) (((i) & 0x80000000) >> 31) |
| Returns the most significant bit of a given 32bit-Integer i. | |
| #define | SET_INTARRAY_BIT(a, i, bit) |
| Sets the i-th bit of the compact int storage array a (32bit per int) to the value bit. | |
| #define | GET_INTARRAY_BIT(a, i) (((int)(i)<0) ? 0 : ((a)[(i)/32] >> (31-((i)%32)))&1) |
| Gets the i-th bit of the compact int storage array a (32bit per int) | |
| #define | SET_CHARARRAY_BIT(a, i, bit) |
| Sets the i-th bit of the compact byte storage array a (8bit per byte) to the value bit. | |
| #define | GET_CHARARRAY_BIT(a, i) (((int)(i)<0) ? 0 : ((a)[(i)/8] >> (7-((i)%8)))&1) |
| Gets the i-th bit of the compact byte storage array a (8bit per byte) | |
| #define | XOR_CHARARRAYS(V1, V2, len) |
| XOR operation on two byte vectors V1 & V2 of length len, returning the result in V1. | |
| #define | MAJORITY(bit1, bit2, bit3) ( ( ((bit1)!=0) + ((bit2)!=0) + ((bit3)!=0) >= 2 ) & 1 ) |
| Returns 1 if and only if at least 2 bits out of 3 are non-zero. | |
| #define | DUMP_CHAR_MATRIX(M, lines, cols, name) |
| Displays a char matrix M of lines lines and cols columns, labelled name. | |
| #define | DUMP_CHAR_VECTOR(V, len, name) |
| Displays a char vector V of len elements, labelled name (single-line display) | |
| #define | DUMP_INT_VECTOR(V, len, name) |
| Displays a int vector V of len elements, labelled name (multi-line display) | |
| #define | DEBUG(msg,...) |
| Displays some debug (includes file name and line, along with parent function) | |
| #define | DEBUG_LF |
| Simply prints a new line. | |
| #define | CHAR_IDENTITY(I, size) |
| Initializes Matrix I to Identity matrix of size size. | |
| #define | BINPRODUCT_MATRIX_MATRIX(M1, M2, PROD, PROD_lines, PROD_cols, depth) |
| Processes the result of binary char matrix multiplication (M1 × M2) into PROD. PROD_lines represent the result line size, PROD_cols represent the result col size, depth represent the common dimension of M1 and M2. | |
| #define | BINPRODUCT_MATRIX_VECTOR(M, V, PROD, M_lines, M_cols) |
| Processes the result of binary char matrix vector multiplication (M × V) into PROD. M_lines represent the matrix line size, M_cols represent the matrix col size. | |
| #define | BINPRODUCT_VECTOR_MATRIX(V, M, PROD, M_lines, M_cols) |
| Processes the result of binary char vector matrix multiplication (V × M) into PROD. M_lines represent the matrix line size, M_cols represent the matrix col size. | |
| #define | CHAR_VECTOR_TO_INT_VECTOR(CHAR_V, INT_V, CHAR_V_size) |
| Translates a sparse-byte representation (1bit per byte) into a full-integer one (32bit per int) | |
| #define | INT_VECTOR_TO_CHAR_VECTOR(INT_V, CHAR_V, CHAR_V_size) |
| Translates a full-integer representation (32bit per int) into a sparse-byte one (1bit per byte) | |
| #define | BIT_VECTOR_TO_BYTE_VECTOR(BIT_V, BYTE_V, BIT_V_size) |
| Translates a sparse-byte representation (1bit per byte) into a full-byte one (8bit per byte) | |
| #define | BYTE_VECTOR_TO_BIT_VECTOR(BYTE_V, BIT_V, BIT_V_size) |
| Translates a full-byte representation (8bit per byte) into a sparse-byte one (1bit per byte) | |
| #define | PROGRESSBAR(percent) |
| Displays a console progress bar (single line, with ending LF) | |
| #define | PROGRESSBAR_NOLF(percent) |
| Displays a console progress bar (single line, without ending LF) | |
| #define | CLEARLINE |
| Erases the last 80 characters on the current console line. | |
Typedefs | |
| typedef unsigned char | byte |
| Type byte is defined here to improve portability. | |
Functions | |
| int | stringToByteArray (char *s, byte a[], unsigned int len) |
| Translates a string composed of "0"s or "1"s into a byte array. | |
| int | fileExists (const char *filename) |
| Checks the accessibility of a file for reading. | |
| long long | timeval_diff (struct timeval *difference, struct timeval *end_time, struct timeval *start_time) |
| Computes the difference between two time values. | |
Utilitary tools & Macros.
| #define BINPRODUCT_MATRIX_MATRIX | ( | M1, | |
| M2, | |||
| PROD, | |||
| PROD_lines, | |||
| PROD_cols, | |||
| depth | |||
| ) |
do { \ unsigned int __PROD_lines__ = (PROD_lines); \ unsigned int __PROD_cols__ = (PROD_cols); \ unsigned int __depth__ = (depth); \ memset((PROD), 0, __PROD_lines__*__PROD_cols__*sizeof(byte)); \ for (unsigned int __line__=0 ; __line__<__PROD_lines__ ; ++__line__) { \ for (unsigned int __col__=0 ; __col__<__PROD_cols__ ; ++__col__) { \ for (unsigned int __i__=0 ; __i__<__depth__ ; ++__i__) { \ (PROD)[__line__][__col__] ^= ((M1)[__line__][__i__]) \ & ((M2)[__i__][__col__]) & 1; \ } \ } \ } \ } while (0)
Processes the result of binary char matrix multiplication (M1 × M2) into PROD. PROD_lines represent the result line size, PROD_cols represent the result col size, depth represent the common dimension of M1 and M2.
Referenced by matrices_generation_exportMatrices(), and processFullEncodingHMatrix().
| #define BINPRODUCT_MATRIX_VECTOR | ( | M, | |
| V, | |||
| PROD, | |||
| M_lines, | |||
| M_cols | |||
| ) |
do { \ unsigned int __M_lines__ = (M_lines); \ unsigned int __M_cols__ = (M_cols); \ memset((PROD), 0, __M_lines__*sizeof(byte)); \ for (unsigned int __line__=0 ; __line__<__M_lines__ ; ++__line__) { \ for (unsigned int __i__=0 ; __i__<__M_cols__ ; ++__i__) { \ (PROD)[__line__] ^= ((M)[__line__][__i__]) & ((V)[__i__]) & 1; \ } \ } \ } while (0)
Processes the result of binary char matrix vector multiplication (M × V) into PROD. M_lines represent the matrix line size, M_cols represent the matrix col size.
Referenced by attack_decipherSecretKey().
| #define BINPRODUCT_VECTOR_MATRIX | ( | V, | |
| M, | |||
| PROD, | |||
| M_lines, | |||
| M_cols | |||
| ) |
do { \ unsigned int __M_lines__ = (M_lines); \ unsigned int __M_cols__ = (M_cols); \ memset((PROD), 0, __M_cols__*sizeof(byte)); \ for (unsigned int __col__=0 ; __col__<__M_cols__ ; ++__col__) { \ for (unsigned int __i__=0 ; __i__<__M_lines__ ; ++__i__) { \ (PROD)[__col__] ^= ((M)[__i__][__col__]) & ((V)[__i__]) & 1; \ } \ } \ } while (0)
Processes the result of binary char vector matrix multiplication (V × M) into PROD. M_lines represent the matrix line size, M_cols represent the matrix col size.
Referenced by attack_test(), code_test(), and main().
| #define BIT_VECTOR_TO_BYTE_VECTOR | ( | BIT_V, | |
| BYTE_V, | |||
| BIT_V_size | |||
| ) |
do { \ unsigned int __BIT_V_size__ = (BIT_V_size); \ memset((BYTE_V), 0, ((__BIT_V_size__+7)/8)*sizeof(byte)); \ for (unsigned int __k__=0 ; __k__<__BIT_V_size__ ; ++__k__) { \ SET_CHARARRAY_BIT((BYTE_V), __k__, ((BIT_V)[__k__])); \ } \ } while (0)
Translates a sparse-byte representation (1bit per byte) into a full-byte one (8bit per byte)
Referenced by main().
| #define BYTE_VECTOR_TO_BIT_VECTOR | ( | BYTE_V, | |
| BIT_V, | |||
| BIT_V_size | |||
| ) |
do { \ unsigned int __BIT_V_size__ = (BIT_V_size); \ memset((BIT_V), 0, __BIT_V_size__*sizeof(byte)); \ for (unsigned int __k__=0 ; __k__<__BIT_V_size__ ; ++__k__) { \ (BIT_V)[__k__] = GET_CHARARRAY_BIT((BYTE_V), __k__); \ } \ } while (0)
Translates a full-byte representation (8bit per byte) into a sparse-byte one (1bit per byte)
Referenced by main().
| #define CHAR_IDENTITY | ( | I, | |
| size | |||
| ) |
do { \ unsigned int __size__ = (size); \ memset((I), 0, __size__*__size__*sizeof(char)); \ for(unsigned int __i__=0 ; __i__<__size__ ; ++__i__){ \ (I)[__i__][__i__]=1; \ } \ } while(0)
Initializes Matrix I to Identity matrix of size size.
Referenced by InvertMatrixL(), and processFullEncodingGSystematicMatrix().
| #define CHAR_VECTOR_TO_INT_VECTOR | ( | CHAR_V, | |
| INT_V, | |||
| CHAR_V_size | |||
| ) |
do { \ unsigned int __CHAR_V_size__ = (CHAR_V_size); \ memset((INT_V), 0, ((__CHAR_V_size__+31)/32)*sizeof(unsigned int)); \ for (unsigned int __k__=0 ; __k__<__CHAR_V_size__ ; ++__k__) { \ SET_INTARRAY_BIT((INT_V), __k__, ((CHAR_V)[__k__])); \ } \ } while (0)
Translates a sparse-byte representation (1bit per byte) into a full-integer one (32bit per int)
| #define CLEARLINE |
do { \ for (int __c__=0 ; __c__<80 ; ++__c__) printf("\b"); \ } while (0)
Erases the last 80 characters on the current console line.
Referenced by main().
| #define DEBUG | ( | msg, | |
| ... | |||
| ) |
do \ printf("[%s: %s, l.%u] " msg "\n", __FILE__, \ __func__, \ __LINE__, \ ##__VA_ARGS__); \ while (0)
Displays some debug (includes file name and line, along with parent function)
Referenced by attack(), attack_test(), code_test(), exportAllMatrices(), initializeRAM(), keygen_clockReg(), keygen_test(), keysetup_reverse_test(), matrices_generation_doubleProduct(), matrices_generation_exportMatrices(), matrices_generation_getRealVariableIndex(), matrices_generation_processKeystreamEqns(), matrices_generation_test(), and reverseKeysetup().
| #define DEBUG_LF |
| #define DUMP_CHAR_MATRIX | ( | M, | |
| lines, | |||
| cols, | |||
| name | |||
| ) |
do { \ unsigned int __lines__ = (lines); \ unsigned int __cols__ = (cols); \ printf("[%s: %s, l.%u] Matrix " name "\n", __FILE__, __func__, __LINE__); \ for (unsigned int __i__=0 ; __i__<__lines__ ; ++__i__) { \ for (unsigned int __j__=0 ; __j__<__cols__ ; ++__j__) { \ printf("%d", (M)[__i__][__j__]); \ } \ printf("\n"); \ } \ } while (0)
Displays a char matrix M of lines lines and cols columns, labelled name.
| #define DUMP_CHAR_VECTOR | ( | V, | |
| len, | |||
| name | |||
| ) |
do { \ unsigned int __len__ = (len); \ printf("[%s: %s, l.%u] Vector " name "\n", __FILE__, __func__, __LINE__); \ for (unsigned int __i__=0 ; __i__<__len__ ; ++__i__) { \ printf("%d", (V)[__i__]); \ } \ printf("\n"); \ } while (0)
Displays a char vector V of len elements, labelled name (single-line display)
Referenced by attack(), attack_test(), code_test(), keysetup_reverse_test(), and reverseFire().
| #define DUMP_INT_VECTOR | ( | V, | |
| len, | |||
| name | |||
| ) |
do { \ unsigned int __len__ = (len); \ printf("[%s: %s, l.%u] Vector " name "\n", __FILE__, __func__, __LINE__); \ for (unsigned int __i__=0 ; __i__<__len__ ; ++__i__) { \ printf("%08X\n", (V)[__i__]); \ } \ } while (0)
Displays a int vector V of len elements, labelled name (multi-line display)
| #define INT_VECTOR_TO_CHAR_VECTOR | ( | INT_V, | |
| CHAR_V, | |||
| CHAR_V_size | |||
| ) |
do { \ unsigned int __CHAR_V_size__ = (CHAR_V_size); \ memset((CHAR_V), 0, __CHAR_V_size__*sizeof(byte)); \ for (unsigned int __k__=0 ; __k__<__CHAR_V_size__ ; ++__k__) { \ (CHAR_V)[__k__] = GET_INTARRAY_BIT((INT_V), __k__); \ } \ } while (0)
Translates a full-integer representation (32bit per int) into a sparse-byte one (1bit per byte)
| #define PROGRESSBAR | ( | percent | ) |
do { \ printf("["); \ unsigned int __percent__ = (percent); \ unsigned int __steps__ = __percent__*20/100; \ for (unsigned int __i__=0 ; __i__<__steps__ ; ++__i__) \ printf("="); \ for (unsigned int __i__=0 ; __i__<20-__steps__ ; ++__i__) \ printf("-"); \ printf("] %d%%\n", __percent__); \ } while (0)
Displays a console progress bar (single line, with ending LF)
Referenced by attack_decipherSecretKey(), and matrices_generation_exportMatrices().
| #define PROGRESSBAR_NOLF | ( | percent | ) |
do { \ printf("["); \ unsigned int __percent__ = (percent); \ unsigned int __steps__ = __percent__*20/100; \ for (unsigned int __i__=0 ; __i__<__steps__ ; ++__i__) \ printf("="); \ for (unsigned int __i__=0 ; __i__<20-__steps__ ; ++__i__) \ printf("-"); \ printf("] %d%%", __percent__); \ } while (0)
Displays a console progress bar (single line, without ending LF)
Referenced by main().
| #define SET_CHARARRAY_BIT | ( | a, | |
| i, | |||
| bit | |||
| ) |
do { \ unsigned int __i__ = (i); \ byte __tmp__ = (bit)&1; \ (a)[__i__/8] &= ~(1 << (7-(__i__%8))); \ (a)[__i__/8] |= ((__tmp__) << (7-(__i__%8))); \ } while (0)
Sets the i-th bit of the compact byte storage array a (8bit per byte) to the value bit.
| #define SET_INTARRAY_BIT | ( | a, | |
| i, | |||
| bit | |||
| ) |
do { \ unsigned int __i__ = (i); \ byte __tmp__ = (bit)&1; \ (a)[__i__/32] &= ~(1 << (31-(__i__%32))); \ (a)[__i__/32] |= ((__tmp__) << (31-(__i__%32))); \ } while (0)
Sets the i-th bit of the compact int storage array a (32bit per int) to the value bit.
| #define XOR_CHARARRAYS | ( | V1, | |
| V2, | |||
| len | |||
| ) |
do { \ unsigned int __len__ = (len); \ for (unsigned int __i__=0 ; __i__<__len__ ; ++__i__) { \ (V1)[__i__] ^= (V2)[__i__]; \ } \ } while (0)
XOR operation on two byte vectors V1 & V2 of length len, returning the result in V1.
Referenced by attack_test(), keysetup_reverse_clockRegs(), main(), matrices_generation_clockR1(), matrices_generation_clockR2(), matrices_generation_clockR3(), matrices_generation_getOutBit(), and reverseKeysetup().
| int fileExists | ( | const char * | filename | ) |
Checks the accessibility of a file for reading.
| [in] | filename | Path of the file to test |
Referenced by main().
| int stringToByteArray | ( | char * | s, |
| byte | a[], | ||
| unsigned int | len | ||
| ) |
Translates a string composed of "0"s or "1"s into a byte array.
| [in] | s | Input string |
| [out] | a | Array to construct |
| [in] | len | Length of the string |
Referenced by main().
| long long timeval_diff | ( | struct timeval * | difference, |
| struct timeval * | end_time, | ||
| struct timeval * | start_time | ||
| ) |
Computes the difference between two time values.
| [out] | difference | Processed difference |
| [in] | end_time | End time |
| [in] | start_time | Start time |
1.7.4