/** * Author......: Jens Steube * License.....: MIT */ #include #include #include #include #define RULES_PER_PLAIN_MIN 1 #define RULES_PER_PLAIN_MAX 99 #define RP_GEN_FUNC_MIN 1 #define RP_GEN_FUNC_MAX 4 #define PW_MAX 32 #define LINE_SIG_LEN RP_GEN_FUNC_MAX * 2 + 1 int max_len = 0; #include "cpu_rules.h" #include "rp_gpu_on_cpu.h" void print_plain (char *plain, int plain_len) { int need_hexifly = 0; unsigned char *plain_ptr = (unsigned char*) plain; int k; for (k = 0; k < plain_len; k++) { if ((plain_ptr[k] < 0x20) || (plain_ptr[k] > 0x7f)) { need_hexifly = 1; break; } } if (need_hexifly) { printf ("$HEX["); for (k = 0; k < plain_len; k++) { printf ("%02x", plain_ptr[k]); } printf ("]"); } else { for (k = 0; k < plain_len; k++) { printf ("%c", plain_ptr[k]); } } } int main (int argc, char **argv) { FILE *fp = stdin; char rule_buf[BUFSIZ]; int rp_gen_func_min = RP_GEN_FUNC_MIN; int rp_gen_func_max = RP_GEN_FUNC_MAX; while (1) { /* * line */ if (feof (fp)) break; char line_buf[BUFSIZ + 1]; char *line_ptr = fgets (line_buf, BUFSIZ, fp); if (line_ptr == NULL) continue; int line_len = strlen (line_ptr); line_len--; if (line_len < 0) continue; if (line_len > PW_MAX) continue; memset (line_ptr + line_len, 0, PW_MAX - line_len); /* * generate random rule and apply it afterwards */ uint max; if (argc < 2) { max = get_random_num (RULES_PER_PLAIN_MIN, RULES_PER_PLAIN_MAX); } else { max = 1; } uint i; for (i = 0; i < max; i++) { int rule_len; memset (rule_buf, 0, BLOCK_SIZE); if (argc < 2) { rule_len = (int) generate_random_rule (rule_buf, rp_gen_func_min, rp_gen_func_max); } else { strncpy (rule_buf, argv[1], BUFSIZ); rule_len = strlen (rule_buf); } gpu_rule_t gpu_rule_buf; memset (&gpu_rule_buf, 0, sizeof (gpu_rule_t)); if (cpu_rule_to_gpu_rule (rule_buf, rule_len, &gpu_rule_buf) == -1) continue; // cpu char rule_buf_cpu[BLOCK_SIZE]; memset (rule_buf_cpu, 0, BLOCK_SIZE); max_len = 0; int out_len_cpu = apply_rule_cpu (rule_buf, rule_len, line_ptr, line_len, rule_buf_cpu); if (max_len >= 32) continue; // gpu char rule_buf_gpu[BLOCK_SIZE]; memset (rule_buf_gpu, 0, sizeof (rule_buf_gpu)); memcpy (rule_buf_gpu, line_buf, line_len); uint32_t *plain_ptr = (uint32_t *) rule_buf_gpu; int out_len_gpu = apply_rules (gpu_rule_buf.cmds, &plain_ptr[0], &plain_ptr[4], line_len); /* * compare */ if (out_len_cpu >= 0 && out_len_cpu < 32) { int failed = 1; if (out_len_gpu == out_len_cpu) { if (memcmp (rule_buf_gpu, rule_buf_cpu, out_len_gpu) == 0) { failed = 0; } } /* * print if failed */ if (failed == 1) { printf ("Rule: %s", rule_buf); // nicer output int spaces = LINE_SIG_LEN - rule_len; if (rule_len > 10) spaces++; if (rule_len > 100) spaces++; while (spaces--) printf ("."); printf (": "); // initial line print_plain (line_buf, line_len); printf (" %i => ", line_len); // modified by cpu print_plain (rule_buf_cpu, out_len_cpu); printf (" %i vs ", out_len_cpu); // modified by gpu print_plain (rule_buf_gpu, out_len_gpu); printf (" %i\n", out_len_gpu); } } } } fclose (fp); return 0; }