Compare commits

...

1 Commits

2 changed files with 133 additions and 10 deletions

Binary file not shown.

131
otp.c
View File

@@ -257,8 +257,8 @@ int command_line_mode(int argc, char* argv[]) {
void show_main_menu(void) { void show_main_menu(void) {
printf("=== Main Menu ===\n"); printf("=== Main Menu ===\n");
printf("\033[4mG\033[0menerate new pad\n"); printf("\033[4mG\033[0menerate new pad\n");
printf("\033[4mE\033[0mncrypt message\n"); printf("\033[4mE\033[0mncrypt data (text/file)\n");
printf("\033[4mD\033[0mecrypt message\n"); printf("\033[4mD\033[0mecrypt data (text/file)\n");
printf("\033[4mL\033[0mist available pads\n"); printf("\033[4mL\033[0mist available pads\n");
printf("\033[4mS\033[0mhow pad information\n"); printf("\033[4mS\033[0mhow pad information\n");
printf("E\033[4mx\033[0mit\n"); printf("E\033[4mx\033[0mit\n");
@@ -305,7 +305,7 @@ int handle_generate_menu(void) {
} }
int handle_encrypt_menu(void) { int handle_encrypt_menu(void) {
printf("\n=== Encrypt Message ===\n"); printf("\n=== Encrypt Data ===\n");
int pad_count = list_available_pads(); int pad_count = list_available_pads();
if (pad_count == 0) { if (pad_count == 0) {
@@ -313,6 +313,22 @@ int handle_encrypt_menu(void) {
return 1; return 1;
} }
// 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;
}
int choice = atoi(choice_input);
if (choice == 1) {
// Text encryption
printf("\nEnter pad selection (number, chksum, or prefix): "); printf("\nEnter pad selection (number, chksum, or prefix): ");
char input[MAX_HASH_LENGTH]; char input[MAX_HASH_LENGTH];
if (!fgets(input, sizeof(input), stdin)) { if (!fgets(input, sizeof(input), stdin)) {
@@ -322,11 +338,118 @@ int handle_encrypt_menu(void) {
input[strcspn(input, "\n")] = 0; input[strcspn(input, "\n")] = 0;
return encrypt_text(input, NULL); // NULL for interactive mode 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) { int handle_decrypt_menu(void) {
printf("\n=== Decrypt Message ===\n"); 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 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) { uint64_t parse_size_string(const char* size_str) {