Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 35175790e2 | |||
| 04ea4fb848 | |||
| 5c61ba7ea8 | |||
| a45b304d22 | |||
| 403d013224 | |||
| 82533d96e4 | |||
| 5b619384a1 |
@@ -1 +1 @@
|
|||||||
Hello, this is a test file for encryption!
|
Test file content for decryption
|
||||||
|
|||||||
BIN
files/out2.otp
Normal file
BIN
files/out2.otp
Normal file
Binary file not shown.
BIN
files/test_files_dir.txt.otp
Normal file
BIN
files/test_files_dir.txt.otp
Normal file
Binary file not shown.
137
otp.c
137
otp.c
@@ -40,6 +40,7 @@ static const int base64_decode_table[256] = {
|
|||||||
#define MAX_HASH_LENGTH 65
|
#define MAX_HASH_LENGTH 65
|
||||||
#define PROGRESS_UPDATE_INTERVAL (64 * 1024 * 1024) // 64MB intervals
|
#define PROGRESS_UPDATE_INTERVAL (64 * 1024 * 1024) // 64MB intervals
|
||||||
#define PADS_DIR "pads"
|
#define PADS_DIR "pads"
|
||||||
|
#define FILES_DIR "files"
|
||||||
#define MAX_ENTROPY_BUFFER 32768 // 32KB entropy buffer
|
#define MAX_ENTROPY_BUFFER 32768 // 32KB entropy buffer
|
||||||
|
|
||||||
// Function prototypes
|
// Function prototypes
|
||||||
@@ -72,7 +73,10 @@ void simple_entropy_mix(unsigned char* urandom_buffer, size_t buffer_size,
|
|||||||
|
|
||||||
// Directory management
|
// Directory management
|
||||||
int ensure_pads_directory(void);
|
int ensure_pads_directory(void);
|
||||||
|
int ensure_files_directory(void);
|
||||||
void get_pad_path(const char* chksum, char* pad_path, char* state_path);
|
void get_pad_path(const char* chksum, char* pad_path, char* state_path);
|
||||||
|
const char* get_files_directory(void);
|
||||||
|
void get_default_file_path(const char* filename, char* result_path, size_t result_size);
|
||||||
|
|
||||||
// Utility functions
|
// Utility functions
|
||||||
uint64_t parse_size_string(const char* size_str);
|
uint64_t parse_size_string(const char* size_str);
|
||||||
@@ -113,7 +117,7 @@ int main(int argc, char* argv[]) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int interactive_mode(void) {
|
int interactive_mode(void) {
|
||||||
printf("\n\n\n\n=== OTP Cipher %s ===\n\n", get_version());
|
// printf("\n\n\n\n=== OTP Cipher %s ===\n\n", get_version());
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
show_main_menu();
|
show_main_menu();
|
||||||
@@ -129,7 +133,7 @@ int interactive_mode(void) {
|
|||||||
handle_file_encrypt();
|
handle_file_encrypt();
|
||||||
break;
|
break;
|
||||||
case 'D':
|
case 'D':
|
||||||
handle_smart_decrypt();
|
handle_decrypt_menu();
|
||||||
break;
|
break;
|
||||||
case 'G':
|
case 'G':
|
||||||
handle_generate_menu();
|
handle_generate_menu();
|
||||||
@@ -271,14 +275,16 @@ int command_line_mode(int argc, char* argv[]) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void show_main_menu(void) {
|
void show_main_menu(void) {
|
||||||
printf("======================== Main Menu ========================\n");
|
|
||||||
printf("\033[4mT\033[0mext encrypt\n");
|
printf("\n\n\n\n=========================== Main Menu - OTP %s ===========================\n\n", get_version() );
|
||||||
printf("\033[4mF\033[0mile encrypt\n");
|
|
||||||
printf("\033[4mD\033[0mecrypt\n");
|
printf(" \033[4mT\033[0mext encrypt\n");
|
||||||
printf("\033[4mG\033[0menerate new pad\n");
|
printf(" \033[4mF\033[0mile encrypt\n");
|
||||||
printf("\033[4mL\033[0mist available pads\n");
|
printf(" \033[4mD\033[0mecrypt\n");
|
||||||
printf("\033[4mS\033[0mhow pad information\n");
|
printf(" \033[4mG\033[0menerate new pad\n");
|
||||||
printf("E\033[4mx\033[0mit\n");
|
printf(" \033[4mL\033[0mist available pads\n");
|
||||||
|
printf(" \033[4mS\033[0mhow pad information\n");
|
||||||
|
printf(" E\033[4mx\033[0mit\n");
|
||||||
printf("\nSelect option: ");
|
printf("\nSelect option: ");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -332,8 +338,8 @@ int handle_encrypt_menu(void) {
|
|||||||
|
|
||||||
// Ask user to choose between text and file encryption
|
// Ask user to choose between text and file encryption
|
||||||
printf("\nSelect encryption type:\n");
|
printf("\nSelect encryption type:\n");
|
||||||
printf("1. Text message\n");
|
printf(" 1. Text message\n");
|
||||||
printf("2. File\n");
|
printf(" 2. File\n");
|
||||||
printf("Enter choice (1-2): ");
|
printf("Enter choice (1-2): ");
|
||||||
|
|
||||||
char choice_input[10];
|
char choice_input[10];
|
||||||
@@ -347,9 +353,9 @@ int handle_encrypt_menu(void) {
|
|||||||
if (choice == 1) {
|
if (choice == 1) {
|
||||||
// Text encryption
|
// Text encryption
|
||||||
printf("\nPad selection options:\n");
|
printf("\nPad selection options:\n");
|
||||||
printf("1. Select from numbered list\n");
|
printf(" 1. Select from numbered list\n");
|
||||||
printf("2. Enter checksum/prefix manually\n");
|
printf(" 2. Enter checksum/prefix manually\n");
|
||||||
printf("3. Browse pad files\n");
|
printf(" 3. Browse pad files\n");
|
||||||
printf("Enter choice (1-3): ");
|
printf("Enter choice (1-3): ");
|
||||||
|
|
||||||
char pad_choice[10];
|
char pad_choice[10];
|
||||||
@@ -400,8 +406,8 @@ int handle_encrypt_menu(void) {
|
|||||||
else if (choice == 2) {
|
else if (choice == 2) {
|
||||||
// File encryption
|
// File encryption
|
||||||
printf("\nFile selection options:\n");
|
printf("\nFile selection options:\n");
|
||||||
printf("1. Type file path directly\n");
|
printf(" 1. Type file path directly\n");
|
||||||
printf("2. Use file manager\n");
|
printf(" 2. Use file manager\n");
|
||||||
printf("Enter choice (1-2): ");
|
printf("Enter choice (1-2): ");
|
||||||
|
|
||||||
char file_choice[10];
|
char file_choice[10];
|
||||||
@@ -449,8 +455,8 @@ int handle_encrypt_menu(void) {
|
|||||||
|
|
||||||
// Ask for output format
|
// Ask for output format
|
||||||
printf("\nSelect output format:\n");
|
printf("\nSelect output format:\n");
|
||||||
printf("1. Binary (.otp) - preserves file permissions\n");
|
printf(" 1. Binary (.otp) - preserves file permissions\n");
|
||||||
printf("2. ASCII (.otp.asc) - text-safe format\n");
|
printf(" 2. ASCII (.otp.asc) - text-safe format\n");
|
||||||
printf("Enter choice (1-2): ");
|
printf("Enter choice (1-2): ");
|
||||||
|
|
||||||
char format_input[10];
|
char format_input[10];
|
||||||
@@ -461,21 +467,20 @@ int handle_encrypt_menu(void) {
|
|||||||
|
|
||||||
int ascii_armor = (atoi(format_input) == 2) ? 1 : 0;
|
int ascii_armor = (atoi(format_input) == 2) ? 1 : 0;
|
||||||
|
|
||||||
// Generate default output filename and use enhanced input function
|
// Generate default output filename with files directory and use enhanced input function
|
||||||
char default_output[512];
|
char default_output[1024]; // Increased size to prevent truncation warnings
|
||||||
snprintf(default_output, sizeof(default_output), "%s.decrypted", input_file);
|
char temp_default[1024];
|
||||||
|
|
||||||
// Remove common encrypted extensions to get a better default
|
// Generate base filename with appropriate extension
|
||||||
if (strstr(default_output, ".otp.asc.decrypted")) {
|
if (ascii_armor) {
|
||||||
// Replace .otp.asc.decrypted with original extension or no extension
|
snprintf(temp_default, sizeof(temp_default), "%s.otp.asc", input_file);
|
||||||
char* ext_pos = strstr(default_output, ".otp.asc.decrypted");
|
} else {
|
||||||
*ext_pos = '\0';
|
snprintf(temp_default, sizeof(temp_default), "%s.otp", input_file);
|
||||||
} else if (strstr(default_output, ".otp.decrypted")) {
|
|
||||||
// Replace .otp.decrypted with original extension or no extension
|
|
||||||
char* ext_pos = strstr(default_output, ".otp.decrypted");
|
|
||||||
*ext_pos = '\0';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Apply files directory default path
|
||||||
|
get_default_file_path(temp_default, default_output, sizeof(default_output));
|
||||||
|
|
||||||
char output_file[512];
|
char output_file[512];
|
||||||
if (get_filename_with_default("Output filename:", default_output, output_file, sizeof(output_file)) != 0) {
|
if (get_filename_with_default("Output filename:", default_output, output_file, sizeof(output_file)) != 0) {
|
||||||
printf("Error: Failed to read input\n");
|
printf("Error: Failed to read input\n");
|
||||||
@@ -497,8 +502,8 @@ int handle_decrypt_menu(void) {
|
|||||||
|
|
||||||
// Ask user to choose between text/message and file decryption
|
// Ask user to choose between text/message and file decryption
|
||||||
printf("\nSelect decryption type:\n");
|
printf("\nSelect decryption type:\n");
|
||||||
printf("1. Text message (ASCII armored)\n");
|
printf(" 1. Text message (ASCII armored)\n");
|
||||||
printf("2. File (.otp or .otp.asc)\n");
|
printf(" 2. File (.otp or .otp.asc)\n");
|
||||||
printf("Enter choice (1-2): ");
|
printf("Enter choice (1-2): ");
|
||||||
|
|
||||||
char choice_input[10];
|
char choice_input[10];
|
||||||
@@ -529,25 +534,29 @@ int handle_decrypt_menu(void) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generate smart default output filename and use enhanced input function
|
// Generate smart default output filename with files directory and use enhanced input function
|
||||||
|
char temp_default[512];
|
||||||
char default_output[512];
|
char default_output[512];
|
||||||
strncpy(default_output, input_file, sizeof(default_output) - 1);
|
strncpy(temp_default, input_file, sizeof(temp_default) - 1);
|
||||||
default_output[sizeof(default_output) - 1] = '\0';
|
temp_default[sizeof(temp_default) - 1] = '\0';
|
||||||
|
|
||||||
// Remove common encrypted extensions to get a better default
|
// Remove common encrypted extensions to get a better default
|
||||||
if (strstr(default_output, ".otp.asc")) {
|
if (strstr(temp_default, ".otp.asc")) {
|
||||||
// Replace .otp.asc with original extension or no extension
|
// Replace .otp.asc with original extension or no extension
|
||||||
char* ext_pos = strstr(default_output, ".otp.asc");
|
char* ext_pos = strstr(temp_default, ".otp.asc");
|
||||||
*ext_pos = '\0';
|
*ext_pos = '\0';
|
||||||
} else if (strstr(default_output, ".otp")) {
|
} else if (strstr(temp_default, ".otp")) {
|
||||||
// Replace .otp with original extension or no extension
|
// Replace .otp with original extension or no extension
|
||||||
char* ext_pos = strstr(default_output, ".otp");
|
char* ext_pos = strstr(temp_default, ".otp");
|
||||||
*ext_pos = '\0';
|
*ext_pos = '\0';
|
||||||
} else {
|
} else {
|
||||||
// No recognized encrypted extension, add .decrypted suffix
|
// No recognized encrypted extension, add .decrypted suffix
|
||||||
strncat(default_output, ".decrypted", sizeof(default_output) - strlen(default_output) - 1);
|
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];
|
char output_file[512];
|
||||||
if (get_filename_with_default("Output filename:", default_output, output_file, sizeof(output_file)) != 0) {
|
if (get_filename_with_default("Output filename:", default_output, output_file, sizeof(output_file)) != 0) {
|
||||||
printf("Error: Failed to read input\n");
|
printf("Error: Failed to read input\n");
|
||||||
@@ -1189,8 +1198,8 @@ int encrypt_text(const char* pad_identifier, const char* input_text) {
|
|||||||
} else {
|
} else {
|
||||||
// Get input text from user (interactive mode)
|
// Get input text from user (interactive mode)
|
||||||
printf("\nText input options:\n");
|
printf("\nText input options:\n");
|
||||||
printf("1. Type text directly\n");
|
printf(" 1. Type text directly\n");
|
||||||
printf("2. Use text editor\n");
|
printf(" 2. Use text editor\n");
|
||||||
printf("Enter choice (1-2): ");
|
printf("Enter choice (1-2): ");
|
||||||
|
|
||||||
char input_choice[10];
|
char input_choice[10];
|
||||||
@@ -1572,14 +1581,18 @@ int encrypt_file(const char* pad_identifier, const char* input_file, const char*
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generate output filename if not specified
|
// Generate output filename if not specified, using files directory
|
||||||
char default_output[512];
|
char default_output[512];
|
||||||
if (output_file == NULL) {
|
if (output_file == NULL) {
|
||||||
|
char temp_output[512];
|
||||||
if (ascii_armor) {
|
if (ascii_armor) {
|
||||||
snprintf(default_output, sizeof(default_output), "%s.otp.asc", input_file);
|
snprintf(temp_output, sizeof(temp_output), "%s.otp.asc", input_file);
|
||||||
} else {
|
} else {
|
||||||
snprintf(default_output, sizeof(default_output), "%s.otp", input_file);
|
snprintf(temp_output, sizeof(temp_output), "%s.otp", input_file);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Apply files directory default path
|
||||||
|
get_default_file_path(temp_output, default_output, sizeof(default_output));
|
||||||
output_file = default_output;
|
output_file = default_output;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2236,6 +2249,38 @@ int ensure_pads_directory(void) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ensure_files_directory(void) {
|
||||||
|
struct stat st = {0};
|
||||||
|
if (stat(FILES_DIR, &st) == -1) {
|
||||||
|
if (mkdir(FILES_DIR, 0755) != 0) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* get_files_directory(void) {
|
||||||
|
struct stat st = {0};
|
||||||
|
if (stat(FILES_DIR, &st) == 0 && S_ISDIR(st.st_mode)) {
|
||||||
|
return FILES_DIR;
|
||||||
|
}
|
||||||
|
return "."; // Fall back to current directory
|
||||||
|
}
|
||||||
|
|
||||||
|
void get_default_file_path(const char* filename, char* result_path, size_t result_size) {
|
||||||
|
const char* files_dir = get_files_directory();
|
||||||
|
|
||||||
|
// If filename already has a path (contains '/'), use it as-is
|
||||||
|
if (strchr(filename, '/') != NULL) {
|
||||||
|
strncpy(result_path, filename, result_size - 1);
|
||||||
|
result_path[result_size - 1] = '\0';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Otherwise, prepend the files directory
|
||||||
|
snprintf(result_path, result_size, "%s/%s", files_dir, filename);
|
||||||
|
}
|
||||||
|
|
||||||
void get_pad_path(const char* chksum, char* pad_path, char* state_path) {
|
void get_pad_path(const char* chksum, char* pad_path, char* state_path) {
|
||||||
snprintf(pad_path, MAX_HASH_LENGTH + 20, "%s/%s.pad", PADS_DIR, chksum);
|
snprintf(pad_path, MAX_HASH_LENGTH + 20, "%s/%s.pad", PADS_DIR, chksum);
|
||||||
snprintf(state_path, MAX_HASH_LENGTH + 20, "%s/%s.state", PADS_DIR, chksum);
|
snprintf(state_path, MAX_HASH_LENGTH + 20, "%s/%s.state", PADS_DIR, chksum);
|
||||||
|
|||||||
1
test_files_dir.txt
Normal file
1
test_files_dir.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
Testing updated files directory functionality
|
||||||
1
test_new.txt
Normal file
1
test_new.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
Testing files directory functionality
|
||||||
BIN
test_new.txt.otp
Normal file
BIN
test_new.txt.otp
Normal file
Binary file not shown.
Reference in New Issue
Block a user