Compare commits

..

6 Commits

5 changed files with 223 additions and 19 deletions

233
otp.c
View File

@@ -95,6 +95,12 @@ void show_main_menu(void);
int handle_generate_menu(void);
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);
void print_usage(const char* program_name);
@@ -107,7 +113,7 @@ int main(int argc, char* argv[]) {
}
int interactive_mode(void) {
printf("=== OTP Cipher %s ===\n\n", get_version());
printf("\n\n\n\n=== OTP Cipher %s ===\n\n", get_version());
while (1) {
show_main_menu();
@@ -116,14 +122,17 @@ int interactive_mode(void) {
char choice = toupper(input[0]);
switch (choice) {
case 'G':
handle_generate_menu();
case 'T':
handle_text_encrypt();
break;
case 'E':
handle_encrypt_menu();
case 'F':
handle_file_encrypt();
break;
case 'D':
handle_decrypt_menu();
handle_smart_decrypt();
break;
case 'G':
handle_generate_menu();
break;
case 'L':
list_available_pads();
@@ -142,10 +151,11 @@ int interactive_mode(void) {
break;
}
case 'X':
case 'Q':
printf("Goodbye!\n");
return 0;
default:
printf("Invalid option. Please select G, E, D, L, S, or X.\n");
printf("Invalid option. Please select T, F, D, G, L, S, or X.\n");
continue;
}
} else {
@@ -261,10 +271,11 @@ int command_line_mode(int argc, char* argv[]) {
}
void show_main_menu(void) {
printf("=== Main Menu ===\n");
printf("=== Main Menu ===\n\n");
printf("\033[4mT\033[0mext encrypt\n");
printf("\033[4mF\033[0mile encrypt\n");
printf("\033[4mD\033[0mecrypt\n");
printf("\033[4mG\033[0menerate new pad\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");
@@ -2289,6 +2300,59 @@ void simple_entropy_mix(unsigned char* urandom_buffer, size_t buffer_size,
}
}
// Enhanced input function for filename with directory separation
int get_filename_with_default(const char* prompt, const char* default_path, char* result, size_t result_size) {
// Find the last directory separator
char* last_slash = strrchr(default_path, '/');
char directory[1024] = "";
char filename[512] = "";
if (last_slash) {
// Extract directory path
size_t dir_len = last_slash - default_path + 1; // Include the trailing slash
if (dir_len < sizeof(directory)) {
strncpy(directory, default_path, dir_len);
directory[dir_len] = '\0';
}
// Extract filename
strncpy(filename, last_slash + 1, sizeof(filename) - 1);
filename[sizeof(filename) - 1] = '\0';
} else {
// No directory separator, treat as filename only
strncpy(filename, default_path, sizeof(filename) - 1);
filename[sizeof(filename) - 1] = '\0';
}
// Display the enhanced prompt with directory and filename separated by colon
printf("\n%s\n%s: %s", prompt, directory, filename);
fflush(stdout);
char input_buffer[512];
if (!fgets(input_buffer, sizeof(input_buffer), stdin)) {
return 1; // Error reading input
}
// Remove newline
input_buffer[strcspn(input_buffer, "\n")] = 0;
// If user just pressed Enter, use the default filename
if (strlen(input_buffer) == 0) {
strncpy(result, default_path, result_size - 1);
result[result_size - 1] = '\0';
} else {
// Combine directory with user input
if (strlen(directory) > 0) {
snprintf(result, result_size, "%s%s", directory, input_buffer);
} else {
strncpy(result, input_buffer, result_size - 1);
result[result_size - 1] = '\0';
}
}
return 0; // Success
}
// Editor and file manager implementations
char* get_preferred_editor(void) {
@@ -2473,6 +2537,155 @@ int launch_file_manager(const char* start_directory, char* selected_file, size_t
return 1; // Fall back to manual entry
}
int handle_text_encrypt(void) {
printf("\n=== Text Encrypt ===\n");
// Launch text editor directly
char text_buffer[MAX_INPUT_SIZE];
if (launch_text_editor(NULL, text_buffer, sizeof(text_buffer)) != 0) {
printf("Error: Could not launch text editor\n");
return 1;
}
if (strlen(text_buffer) == 0) {
printf("No text entered - canceling encryption\n");
return 1;
}
// List available pads and get selection
int pad_count = list_available_pads();
if (pad_count == 0) {
printf("No pads available. Generate a pad first.\n");
return 1;
}
printf("\nEnter pad selection (number, checksum, or prefix): ");
char pad_input[MAX_HASH_LENGTH];
if (!fgets(pad_input, sizeof(pad_input), stdin)) {
printf("Error: Failed to read pad selection\n");
return 1;
}
pad_input[strcspn(pad_input, "\n")] = 0;
return encrypt_text(pad_input, text_buffer);
}
int handle_file_encrypt(void) {
printf("\n=== File Encrypt ===\n");
// Launch file manager directly
char input_file[512];
if (launch_file_manager(".", input_file, sizeof(input_file)) != 0) {
printf("Error: Could not launch file manager\n");
return 1;
}
// 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;
}
// List available pads
int pad_count = list_available_pads();
if (pad_count == 0) {
printf("No pads available. Generate a pad first.\n");
return 1;
}
printf("\nEnter pad selection (number, checksum, or prefix): ");
char pad_input[MAX_HASH_LENGTH];
if (!fgets(pad_input, sizeof(pad_input), stdin)) {
printf("Error: Failed to read pad selection\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;
// Generate default output filename
char default_output[1024]; // Increased buffer size to prevent truncation warnings
if (ascii_armor) {
snprintf(default_output, sizeof(default_output), "%s.otp.asc", input_file);
} else {
snprintf(default_output, sizeof(default_output), "%s.otp", input_file);
}
// Use enhanced input function for output filename
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;
}
const char* output_filename = output_file;
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());
printf("%s\n", get_build_info());

View File

@@ -1 +0,0 @@
This is a test file for OTP encryption.

View File

@@ -1 +0,0 @@
This is a test file for OTP encryption.

View File

@@ -1,7 +0,0 @@
-----BEGIN OTP MESSAGE-----
Version: v0.2.15
Pad-ChkSum: 0c8e19fde996e683fdbd348d1052eec168ffe6f67a88bb1278d0d02e9341b87b
Pad-Offset: 210
mMIm7iVtUO6NbXbskMxtydI/A16UXEQUGTcIya/8Dja6PB3EC0MLdw==
-----END OTP MESSAGE-----

Binary file not shown.