Compare commits

...

5 Commits

14 changed files with 90 additions and 36 deletions

BIN
files/out2.otp Normal file

Binary file not shown.

Binary file not shown.

84
otp.c
View File

@@ -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);
@@ -113,7 +117,7 @@ int main(int argc, char* argv[]) {
}
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) {
show_main_menu();
@@ -271,7 +275,9 @@ int command_line_mode(int argc, char* argv[]) {
}
void show_main_menu(void) {
printf("======================== Main Menu ========================\n");
printf("\n\n\n\n======================= Main Menu - OTP %s =======================\n\n", get_version() );
printf(" \033[4mT\033[0mext encrypt\n");
printf(" \033[4mF\033[0mile encrypt\n");
printf(" \033[4mD\033[0mecrypt\n");
@@ -461,14 +467,20 @@ int handle_encrypt_menu(void) {
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[1024]; // Increased size to prevent truncation warnings
char temp_default[1024];
// Generate base filename with appropriate extension
if (ascii_armor) {
snprintf(default_output, sizeof(default_output), "%s.otp.asc", input_file);
snprintf(temp_default, sizeof(temp_default), "%s.otp.asc", input_file);
} else {
snprintf(default_output, sizeof(default_output), "%s.otp", input_file);
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 (get_filename_with_default("Output filename:", default_output, output_file, sizeof(output_file)) != 0) {
printf("Error: Failed to read input\n");
@@ -522,25 +534,29 @@ int handle_decrypt_menu(void) {
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];
strncpy(default_output, input_file, sizeof(default_output) - 1);
default_output[sizeof(default_output) - 1] = '\0';
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(default_output, ".otp.asc")) {
if (strstr(temp_default, ".otp.asc")) {
// 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';
} else if (strstr(default_output, ".otp")) {
} else if (strstr(temp_default, ".otp")) {
// 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';
} else {
// 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];
if (get_filename_with_default("Output filename:", default_output, output_file, sizeof(output_file)) != 0) {
printf("Error: Failed to read input\n");
@@ -1565,14 +1581,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;
}
@@ -2229,6 +2249,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);

1
test_files_dir.txt Normal file
View File

@@ -0,0 +1 @@
Testing updated files directory functionality

1
test_new.txt Normal file
View File

@@ -0,0 +1 @@
Testing files directory functionality

BIN
test_new.txt.otp Normal file

Binary file not shown.