From 864c0356daa36541a4df434f3a855346aa646872 Mon Sep 17 00:00:00 2001 From: Laan Tungir Date: Wed, 13 Aug 2025 13:43:27 -0400 Subject: [PATCH] Version v0.2.43 - restored smart decrypt functionality with enhanced interactive input and cleaned up old code --- otp.c | 149 ++++++++++++++++++++++++++-------------------------------- 1 file changed, 66 insertions(+), 83 deletions(-) diff --git a/otp.c b/otp.c index 7df50b9..f6fa240 100644 --- a/otp.c +++ b/otp.c @@ -101,7 +101,6 @@ int handle_encrypt_menu(void); int handle_decrypt_menu(void); int handle_text_encrypt(void); int handle_file_encrypt(void); -int handle_smart_decrypt(void); // Enhanced input functions int get_filename_with_default(const char* prompt, const char* default_path, char* result, size_t result_size); @@ -498,46 +497,30 @@ int handle_encrypt_menu(void) { } int handle_decrypt_menu(void) { - printf("\n=== Decrypt Data ===\n"); + printf("\n=== Smart Decrypt ===\n"); + printf("Enter encrypted data (paste ASCII armor), file path, or press Enter to browse files:\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)) { + char input_line[MAX_LINE_LENGTH]; + if (!fgets(input_line, sizeof(input_line), stdin)) { printf("Error: Failed to read input\n"); return 1; } - int choice = atoi(choice_input); + // Remove newline + input_line[strcspn(input_line, "\n")] = 0; - 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); + if (strlen(input_line) == 0) { + // Empty input - launch file manager to browse for files + char selected_file[512]; + if (launch_file_manager(get_files_directory(), selected_file, sizeof(selected_file)) != 0) { + printf("Error: Could not launch file manager\n"); return 1; } // Generate smart default output filename with files directory and use enhanced input function char temp_default[512]; char default_output[512]; - strncpy(temp_default, input_file, sizeof(temp_default) - 1); + strncpy(temp_default, selected_file, sizeof(temp_default) - 1); temp_default[sizeof(temp_default) - 1] = '\0'; // Remove common encrypted extensions to get a better default @@ -563,13 +546,63 @@ int handle_decrypt_menu(void) { return 1; } - const char* output_filename = output_file; + return decrypt_file(selected_file, output_file); + } + else if (strncmp(input_line, "-----BEGIN OTP MESSAGE-----", 27) == 0) { + // Looks like ASCII armor - collect the full message + char full_message[MAX_INPUT_SIZE * 4] = {0}; + strcat(full_message, input_line); + strcat(full_message, "\n"); - return decrypt_file(input_file, output_filename); + printf("Continue pasting the message (end with -----END OTP MESSAGE-----):\n"); + + char line[MAX_LINE_LENGTH]; + while (fgets(line, sizeof(line), stdin)) { + strncat(full_message, line, sizeof(full_message) - strlen(full_message) - 1); + if (strstr(line, "-----END OTP MESSAGE-----")) { + break; + } + } + + return decrypt_text(NULL, full_message); } else { - printf("Invalid choice. Please enter 1 or 2.\n"); - return 1; + // Check if it looks like a file path + if (access(input_line, R_OK) == 0) { + // It's a valid file - decrypt it with enhanced input for output filename + char temp_default[512]; + char default_output[512]; + strncpy(temp_default, input_line, sizeof(temp_default) - 1); + temp_default[sizeof(temp_default) - 1] = '\0'; + + // Remove common encrypted extensions to get a better default + if (strstr(temp_default, ".otp.asc")) { + // Replace .otp.asc with original extension or no extension + char* ext_pos = strstr(temp_default, ".otp.asc"); + *ext_pos = '\0'; + } else if (strstr(temp_default, ".otp")) { + // Replace .otp with original extension or no extension + char* ext_pos = strstr(temp_default, ".otp"); + *ext_pos = '\0'; + } else { + // No recognized encrypted extension, add .decrypted suffix + strncat(temp_default, ".decrypted", sizeof(temp_default) - strlen(temp_default) - 1); + } + + // Apply files directory default path + get_default_file_path(temp_default, default_output, sizeof(default_output)); + + char output_file[512]; + if (get_filename_with_default("Output filename:", default_output, output_file, sizeof(output_file)) != 0) { + printf("Error: Failed to read input\n"); + return 1; + } + + return decrypt_file(input_line, output_file); + } else { + printf("Input not recognized as ASCII armor or valid file path.\n"); + return 1; + } } } @@ -2843,56 +2876,6 @@ int handle_file_encrypt(void) { return encrypt_file(pad_input, input_file, output_filename, ascii_armor); } -int handle_smart_decrypt(void) { - printf("\n=== Smart Decrypt ===\n"); - printf("Enter encrypted data (paste ASCII armor) or press Enter to browse files:\n"); - - char input_line[MAX_LINE_LENGTH]; - if (!fgets(input_line, sizeof(input_line), stdin)) { - printf("Error: Failed to read input\n"); - return 1; - } - - // Remove newline - input_line[strcspn(input_line, "\n")] = 0; - - if (strlen(input_line) == 0) { - // Empty input - launch file manager - char selected_file[512]; - if (launch_file_manager(".", selected_file, sizeof(selected_file)) != 0) { - printf("Error: Could not launch file manager\n"); - return 1; - } - - // Decrypt selected file - return decrypt_file(selected_file, NULL); - } else if (strncmp(input_line, "-----BEGIN OTP MESSAGE-----", 27) == 0) { - // Looks like ASCII armor - collect the full message - char full_message[MAX_INPUT_SIZE * 4] = {0}; - strcat(full_message, input_line); - strcat(full_message, "\n"); - - printf("Continue pasting the message (end with -----END OTP MESSAGE-----):\n"); - - char line[MAX_LINE_LENGTH]; - while (fgets(line, sizeof(line), stdin)) { - strncat(full_message, line, sizeof(full_message) - strlen(full_message) - 1); - if (strstr(line, "-----END OTP MESSAGE-----")) { - break; - } - } - - return decrypt_text(NULL, full_message); - } else { - // Check if it looks like a file path - if (access(input_line, R_OK) == 0) { - return decrypt_file(input_line, NULL); - } else { - printf("Input not recognized as ASCII armor or valid file path.\n"); - return 1; - } - } -} void print_usage(const char* program_name) { printf("OTP Cipher - One Time Pad Implementation %s\n", get_version());