Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 403d013224 | |||
| 82533d96e4 | |||
| 5b619384a1 | |||
| 12b9884572 | |||
| 83b60b5cc2 | |||
| 2d6546ab83 | |||
| c255185084 |
BIN
files/output.otp
Normal file
BIN
files/output.otp
Normal file
Binary file not shown.
1
files/test_decrypt.txt
Normal file
1
files/test_decrypt.txt
Normal file
@@ -0,0 +1 @@
|
||||
Test file content for decryption
|
||||
BIN
files/test_decrypt.txt.otp
Normal file
BIN
files/test_decrypt.txt.otp
Normal file
Binary file not shown.
1
files/test_file.txt
Normal file
1
files/test_file.txt
Normal file
@@ -0,0 +1 @@
|
||||
Hello, this is a test file for encryption!
|
||||
7
files/test_file.txt.otp.asc
Normal file
7
files/test_file.txt.otp.asc
Normal file
@@ -0,0 +1,7 @@
|
||||
-----BEGIN OTP MESSAGE-----
|
||||
Version: v0.2.29
|
||||
Pad-ChkSum: d0d4a489354348b08d8c7b324814d8c50010042e9da47f2c973f32a16a09101b
|
||||
Pad-Offset: 57
|
||||
|
||||
05S8GfS0tFfczNMUz0xrieFGoPSREM4uo5QhFGoBCcOzjfTXTDMt3hRtAQ==
|
||||
-----END OTP MESSAGE-----
|
||||
1
files/test_input.txt
Normal file
1
files/test_input.txt
Normal file
@@ -0,0 +1 @@
|
||||
This is a test file for encryption.
|
||||
101
otp.c
101
otp.c
@@ -40,6 +40,7 @@ static const int base64_decode_table[256] = {
|
||||
#define MAX_HASH_LENGTH 65
|
||||
#define PROGRESS_UPDATE_INTERVAL (64 * 1024 * 1024) // 64MB intervals
|
||||
#define PADS_DIR "pads"
|
||||
#define FILES_DIR "files"
|
||||
#define MAX_ENTROPY_BUFFER 32768 // 32KB entropy buffer
|
||||
|
||||
// Function prototypes
|
||||
@@ -72,7 +73,10 @@ void simple_entropy_mix(unsigned char* urandom_buffer, size_t buffer_size,
|
||||
|
||||
// Directory management
|
||||
int ensure_pads_directory(void);
|
||||
int ensure_files_directory(void);
|
||||
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
|
||||
uint64_t parse_size_string(const char* size_str);
|
||||
@@ -271,7 +275,7 @@ int command_line_mode(int argc, char* argv[]) {
|
||||
}
|
||||
|
||||
void show_main_menu(void) {
|
||||
printf("=== Main Menu ===\n\n");
|
||||
printf("======================== Main Menu ========================\n");
|
||||
printf("\033[4mT\033[0mext encrypt\n");
|
||||
printf("\033[4mF\033[0mile encrypt\n");
|
||||
printf("\033[4mD\033[0mecrypt\n");
|
||||
@@ -461,16 +465,27 @@ int handle_encrypt_menu(void) {
|
||||
|
||||
int ascii_armor = (atoi(format_input) == 2) ? 1 : 0;
|
||||
|
||||
// Ask for custom output filename (optional)
|
||||
printf("\nEnter output filename (or press Enter for default): ");
|
||||
// Generate default output filename with files directory and use enhanced input function
|
||||
char default_output[1024]; // Increased size to prevent truncation warnings
|
||||
char temp_default[1024];
|
||||
|
||||
// Generate base filename with appropriate extension
|
||||
if (ascii_armor) {
|
||||
snprintf(temp_default, sizeof(temp_default), "%s.otp.asc", input_file);
|
||||
} else {
|
||||
snprintf(temp_default, sizeof(temp_default), "%s.otp", input_file);
|
||||
}
|
||||
|
||||
// Apply files directory default path
|
||||
get_default_file_path(temp_default, default_output, sizeof(default_output));
|
||||
|
||||
char output_file[512];
|
||||
if (!fgets(output_file, sizeof(output_file), stdin)) {
|
||||
if (get_filename_with_default("Output filename:", default_output, output_file, sizeof(output_file)) != 0) {
|
||||
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;
|
||||
const char* output_filename = output_file;
|
||||
|
||||
return encrypt_file(pad_input, input_file, output_filename, ascii_armor);
|
||||
}
|
||||
@@ -517,16 +532,36 @@ int handle_decrypt_menu(void) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Ask for custom output filename (optional)
|
||||
printf("\nEnter output filename (or press Enter for default): ");
|
||||
// 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);
|
||||
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 (!fgets(output_file, sizeof(output_file), stdin)) {
|
||||
if (get_filename_with_default("Output filename:", default_output, output_file, sizeof(output_file)) != 0) {
|
||||
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;
|
||||
const char* output_filename = output_file;
|
||||
|
||||
return decrypt_file(input_file, output_filename);
|
||||
}
|
||||
@@ -1544,14 +1579,18 @@ int encrypt_file(const char* pad_identifier, const char* input_file, const char*
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Generate output filename if not specified
|
||||
// Generate output filename if not specified, using files directory
|
||||
char default_output[512];
|
||||
if (output_file == NULL) {
|
||||
char temp_output[512];
|
||||
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 {
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -2208,6 +2247,38 @@ int ensure_pads_directory(void) {
|
||||
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) {
|
||||
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);
|
||||
@@ -2447,7 +2518,7 @@ int get_filename_with_default(const char* prompt, const char* default_path, char
|
||||
}
|
||||
} else if (c >= 32 && c <= 126) {
|
||||
// Printable character
|
||||
if (buffer_len < sizeof(edit_buffer) - 1) {
|
||||
if (buffer_len < (int)sizeof(edit_buffer) - 1) {
|
||||
// Move everything after cursor one position right
|
||||
memmove(&edit_buffer[cursor_pos + 1], &edit_buffer[cursor_pos], buffer_len - cursor_pos + 1);
|
||||
edit_buffer[cursor_pos] = c;
|
||||
|
||||
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