void tk_trap(int ec) { int i, m; #if defined (TK_USE_EMRGCY_CONSOLE) && (TK_USE_EMRGCY_CONSOLE != __tk_no) static const char trp_txt[] = "tk: TRAP"; #define MAX_LEN 80 #if (TK_USE_EMRGCY_CONSOLE == __tk_yes) char astr[MAX_LEN]; console_write(trp_txt, sizeof(trp_txt)); console_write("\n\r", 2); if (ec == 0) { console_write(trapcode_srings[0], strlen(trapcode_srings[0])); console_write("\n\r", 2); } else if (!(ec & TC_ISA_ERR)) { console_write(trapcode_srings[16], strlen(trapcode_srings[16])); _ntos(astr, ec, MAX_LEN); console_write(astr, strlen(astr)); console_write("\n\r", 2); } else { for (i = 0, m = 1; i < 15; i++, m = m << 1) { if (ec & m) { console_write("Bit #", 5); _ntos(astr, i, MAX_LEN); console_write(astr, strlen(astr)); console_write(": ", 2); console_write(trapcode_srings[i + 1], strlen(trapcode_srings[i + 1])); console_write("\n\r", 2); } } } #else char astr[MAX_LEN]; TK_USE_EMRGCY_CONSOLE(trp_txt, sizeof(trp_txt)); TK_USE_EMRGCY_CONSOLE("\n\r", 2); if (ec == 0) { TK_USE_EMRGCY_CONSOLE(trapcode_srings[0], strlen(trapcode_srings[0])); TK_USE_EMRGCY_CONSOLE("\n\r", 2); } else if (!(ec & TC_ISA_ERR)) { TK_USE_EMRGCY_CONSOLE(trapcode_srings[16], strlen(trapcode_srings[16])); _ntos(astr, ec, MAX_LEN); TK_USE_EMRGCY_CONSOLE(astr, strlen(astr)); TK_USE_EMRGCY_CONSOLE("\n\r", 2); } else { for (i = 0, m = 1; i < 15; i++, m = m << 1) { if (ec & m) { TK_USE_EMRGCY_CONSOLE("Bit #", 5); _ntos(astr, i, MAX_LEN); TK_USE_EMRGCY_CONSOLE(astr, strlen(astr)); TK_USE_EMRGCY_CONSOLE(": ", 2); TK_USE_EMRGCY_CONSOLE(trapcode_srings[i + 1], strlen(trapcode_srings [i + 1])); TK_USE_EMRGCY_CONSOLE("\n\r", 2); } } } #endif #else printk(("tk: TRAP CODE [0x%04x]: \n", ec)); if (ec == 0) { printk(("%s: \n", trapcode_srings[0])); } else if (!(ec & TC_ISA_ERR)) { printk(("%s: \n", trapcode_srings[16])); printk((" => Application exist with exit-code: %d \n", ec)); } else { for (i = 0, m = 1; i < 15; i++, m = m << 1) { if (ec & m) { printk((" - Bit #%d: %s\n", i + 1, trapcode_srings[i + 1])); } } } #endif #if defined(TK_COMP_FILESYS) && TK_COMP_FILESYS printk(("Trying to shut system down...\n")); fs_fini(); fprintf(stderr, "System terminated!\n"); #endif #if defined(__GNUC__) && TK_HOSTED exit(ec); #else while (1) ; #endif }
int main(int argc, char **argv) { struct goh_state st; int opt; struct fs_ctx s; enum action action = ACTION_CRACK; char *key = NULL; const char *filenamein = "-"; const char *filenameout = "-"; char *text = NULL; struct charset cs; struct crack_args cka; cs_init(&cs); memset(&cka, 0, sizeof(cka)); /* Parse the options. */ goh_init(&st, opt_desc, ARRAY_LENGTH(opt_desc), argc, argv, 1); st.usagehelp = "[options]\n"; while ((opt = goh_nextoption(&st)) >= 0) { switch (opt) { case 'i': filenamein = st.argval; break; case 'o': filenameout = st.argval; break; case 'e': action = ACTION_ENCRYPT; break; case 'd': action = ACTION_DECRYPT; break; case 'k': key = st.argval; break; case 'l': cka.klen = atoi(st.argval); break; case OPT_KASISKI_MIN_LENGTH: cka.ka_minlen = atoi(st.argval); break; case OPT_SHOW_KASISKI_TABLE: cka.ka_show_table = 1; break; case OPT_SHOW_KASISKI_LENGTH: cka.ka_show_length = 1; break; case 'c': cs_add(&cs, st.argval); break; default: custom_error("Unrecognized option (shouldn't happen)"); break; } } /* Common command line mistake. */ if (st.argidx != argc) custom_error("Useless argument %s", argv[st.argidx]); goh_fini(&st); /* Check for some invalid options combinations. */ if (action != ACTION_CRACK && key == NULL) custom_error("Encryption and decryption take a --key"); if (action == ACTION_CRACK && key != NULL) custom_error("--key need either --encrypt or --decrypt"); if (cka.klen > 0 && key != NULL) custom_warn("Unnecessary key length option with an actual key"); if (cka.klen > 0 && key != NULL && cka.klen != strlen(key)) custom_error("Key length option doesn't match " "the length of the key"); if (cka.ka_minlen > 0 && action != ACTION_CRACK) custom_error("--kasiski-min-length can only be used in " "cracking mode"); if (cka.ka_minlen > 0 && cka.klen > 0) custom_warn("Useless option --kasiski-min-length when the key " "length is given"); if (cka.ka_show_table != 0 && action != ACTION_CRACK) custom_error("--show-kasiski-table can only be used in " "cracking mode"); if (cka.ka_show_table != 0 && cka.klen > 0) custom_warn("Option --show-kasiski-table ignored when a key " "length is given"); if (cka.ka_show_length != 0 && action != ACTION_CRACK) custom_error("--show-kasiski-length can only be used in " "cracking mode"); if (cka.ka_show_length != 0 && cka.klen > 0) custom_warn("Option --show-kasiski-length ignored when a key " "length is given"); /* Default charset. */ if (cs.chars_size == 0) { cs_add(&cs, CHARSET_UPPER); cs_add(&cs, CHARSET_LOWER); } /* Start to do the job. */ text = read_file(filenamein); fs_init(&s, text, &cs); cka.str = &s; if (action == ACTION_CRACK) crack(&cka); else simple_action(&s, key, action); write_file(filenameout, text); fs_fini(&s); free(text); cs_fini(&cs); return EXIT_SUCCESS; }