diff --git a/TropicOfCancer-HenryMiller.txt.otp b/TropicOfCancer-HenryMiller.txt.otp deleted file mode 100644 index 47604ce..0000000 Binary files a/TropicOfCancer-HenryMiller.txt.otp and /dev/null differ diff --git a/otp.c b/otp.c index 1af3ce8..7cfffc5 100644 --- a/otp.c +++ b/otp.c @@ -257,8 +257,8 @@ int command_line_mode(int argc, char* argv[]) { void show_main_menu(void) { printf("=== Main Menu ===\n"); printf("\033[4mG\033[0menerate new pad\n"); - printf("\033[4mE\033[0mncrypt message\n"); - printf("\033[4mD\033[0mecrypt message\n"); + printf("\033[4mE\033[0mncrypt data (text/file)\n"); + printf("\033[4mD\033[0mecrypt data (text/file)\n"); printf("\033[4mL\033[0mist available pads\n"); printf("\033[4mS\033[0mhow pad information\n"); printf("E\033[4mx\033[0mit\n"); @@ -305,7 +305,7 @@ int handle_generate_menu(void) { } int handle_encrypt_menu(void) { - printf("\n=== Encrypt Message ===\n"); + printf("\n=== Encrypt Data ===\n"); int pad_count = list_available_pads(); if (pad_count == 0) { @@ -313,20 +313,143 @@ int handle_encrypt_menu(void) { return 1; } - printf("\nEnter pad selection (number, chksum, or prefix): "); - char input[MAX_HASH_LENGTH]; - if (!fgets(input, sizeof(input), stdin)) { + // Ask user to choose between text and file encryption + printf("\nSelect encryption type:\n"); + printf("1. Text message\n"); + printf("2. File\n"); + printf("Enter choice (1-2): "); + + char choice_input[10]; + if (!fgets(choice_input, sizeof(choice_input), stdin)) { printf("Error: Failed to read input\n"); return 1; } - input[strcspn(input, "\n")] = 0; - return encrypt_text(input, NULL); // NULL for interactive mode + int choice = atoi(choice_input); + + if (choice == 1) { + // Text encryption + printf("\nEnter pad selection (number, chksum, or prefix): "); + char input[MAX_HASH_LENGTH]; + if (!fgets(input, sizeof(input), stdin)) { + printf("Error: Failed to read input\n"); + return 1; + } + + input[strcspn(input, "\n")] = 0; + return encrypt_text(input, NULL); // NULL for interactive mode + } + else if (choice == 2) { + // File encryption + printf("\nEnter input file path: "); + char input_file[512]; + if (!fgets(input_file, sizeof(input_file), stdin)) { + printf("Error: Failed to read input\n"); + return 1; + } + input_file[strcspn(input_file, "\n")] = 0; + + // Check if file exists + if (access(input_file, R_OK) != 0) { + printf("Error: File '%s' not found or cannot be read\n", input_file); + return 1; + } + + printf("\nEnter pad selection (number, chksum, or prefix): "); + char pad_input[MAX_HASH_LENGTH]; + if (!fgets(pad_input, sizeof(pad_input), stdin)) { + printf("Error: Failed to read input\n"); + return 1; + } + pad_input[strcspn(pad_input, "\n")] = 0; + + // Ask for output format + printf("\nSelect output format:\n"); + printf("1. Binary (.otp) - preserves file permissions\n"); + printf("2. ASCII (.otp.asc) - text-safe format\n"); + printf("Enter choice (1-2): "); + + char format_input[10]; + if (!fgets(format_input, sizeof(format_input), stdin)) { + printf("Error: Failed to read input\n"); + return 1; + } + + int ascii_armor = (atoi(format_input) == 2) ? 1 : 0; + + // Ask for custom output filename (optional) + printf("\nEnter output filename (or press Enter for default): "); + char output_file[512]; + if (!fgets(output_file, sizeof(output_file), stdin)) { + printf("Error: Failed to read input\n"); + return 1; + } + output_file[strcspn(output_file, "\n")] = 0; + + const char* output_filename = (strlen(output_file) > 0) ? output_file : NULL; + + return encrypt_file(pad_input, input_file, output_filename, ascii_armor); + } + else { + printf("Invalid choice. Please enter 1 or 2.\n"); + return 1; + } } int handle_decrypt_menu(void) { - printf("\n=== Decrypt Message ===\n"); - return decrypt_text(NULL, NULL); // No pad selection needed - chksum comes from message + printf("\n=== Decrypt Data ===\n"); + + // Ask user to choose between text/message and file decryption + printf("\nSelect decryption type:\n"); + printf("1. Text message (ASCII armored)\n"); + printf("2. File (.otp or .otp.asc)\n"); + printf("Enter choice (1-2): "); + + char choice_input[10]; + if (!fgets(choice_input, sizeof(choice_input), stdin)) { + printf("Error: Failed to read input\n"); + return 1; + } + + int choice = atoi(choice_input); + + if (choice == 1) { + // Text/message decryption - interactive input + return decrypt_text(NULL, NULL); // No pad selection needed - chksum comes from message + } + else if (choice == 2) { + // File decryption + printf("\nEnter encrypted file path (.otp or .otp.asc): "); + char input_file[512]; + if (!fgets(input_file, sizeof(input_file), stdin)) { + printf("Error: Failed to read input\n"); + return 1; + } + input_file[strcspn(input_file, "\n")] = 0; + + // Check if file exists + if (access(input_file, R_OK) != 0) { + printf("Error: File '%s' not found or cannot be read\n", input_file); + return 1; + } + + // Ask for custom output filename (optional) + printf("\nEnter output filename (or press Enter for default): "); + char output_file[512]; + if (!fgets(output_file, sizeof(output_file), stdin)) { + printf("Error: Failed to read input\n"); + return 1; + } + output_file[strcspn(output_file, "\n")] = 0; + + const char* output_filename = (strlen(output_file) > 0) ? output_file : NULL; + + return decrypt_file(input_file, output_filename); + } + else { + printf("Invalid choice. Please enter 1 or 2.\n"); + return 1; + } } uint64_t parse_size_string(const char* size_str) {