Compare commits

...

4 Commits

6 changed files with 198 additions and 26 deletions

1
decrypted.bin Normal file
View File

@@ -0,0 +1 @@
Hello, this is a test file for encryption!

215
otp.c
View File

@@ -461,16 +461,28 @@ int handle_encrypt_menu(void) {
int ascii_armor = (atoi(format_input) == 2) ? 1 : 0; int ascii_armor = (atoi(format_input) == 2) ? 1 : 0;
// Ask for custom output filename (optional) // Generate default output filename and use enhanced input function
printf("\nEnter output filename (or press Enter for default): "); char default_output[512];
snprintf(default_output, sizeof(default_output), "%s.decrypted", input_file);
// Remove common encrypted extensions to get a better default
if (strstr(default_output, ".otp.asc.decrypted")) {
// Replace .otp.asc.decrypted with original extension or no extension
char* ext_pos = strstr(default_output, ".otp.asc.decrypted");
*ext_pos = '\0';
} 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';
}
char output_file[512]; 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"); printf("Error: Failed to read input\n");
return 1; 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); return encrypt_file(pad_input, input_file, output_filename, ascii_armor);
} }
@@ -517,16 +529,32 @@ int handle_decrypt_menu(void) {
return 1; return 1;
} }
// Ask for custom output filename (optional) // Generate smart default output filename and use enhanced input function
printf("\nEnter output filename (or press Enter for default): "); char default_output[512];
strncpy(default_output, input_file, sizeof(default_output) - 1);
default_output[sizeof(default_output) - 1] = '\0';
// Remove common encrypted extensions to get a better default
if (strstr(default_output, ".otp.asc")) {
// Replace .otp.asc with original extension or no extension
char* ext_pos = strstr(default_output, ".otp.asc");
*ext_pos = '\0';
} else if (strstr(default_output, ".otp")) {
// Replace .otp with original extension or no extension
char* ext_pos = strstr(default_output, ".otp");
*ext_pos = '\0';
} else {
// No recognized encrypted extension, add .decrypted suffix
strncat(default_output, ".decrypted", sizeof(default_output) - strlen(default_output) - 1);
}
char output_file[512]; 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"); printf("Error: Failed to read input\n");
return 1; 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); return decrypt_file(input_file, output_filename);
} }
@@ -2300,7 +2328,7 @@ void simple_entropy_mix(unsigned char* urandom_buffer, size_t buffer_size,
} }
} }
// Enhanced input function for filename with directory separation // Enhanced input function with editable pre-filled text
int get_filename_with_default(const char* prompt, const char* default_path, char* result, size_t result_size) { int get_filename_with_default(const char* prompt, const char* default_path, char* result, size_t result_size) {
// Find the last directory separator // Find the last directory separator
char* last_slash = strrchr(default_path, '/'); char* last_slash = strrchr(default_path, '/');
@@ -2324,33 +2352,168 @@ int get_filename_with_default(const char* prompt, const char* default_path, char
filename[sizeof(filename) - 1] = '\0'; filename[sizeof(filename) - 1] = '\0';
} }
// Display the enhanced prompt with directory and filename separated by colon // Setup terminal for raw input
printf("\n%s\n%s: %s", prompt, directory, filename); struct termios orig_termios;
if (tcgetattr(STDIN_FILENO, &orig_termios) != 0) {
// Fallback to simple input if terminal control fails
printf("\n%s\n%s: ", prompt, directory);
fflush(stdout);
char input_buffer[512];
if (!fgets(input_buffer, sizeof(input_buffer), stdin)) {
return 1;
}
input_buffer[strcspn(input_buffer, "\n")] = 0;
if (strlen(input_buffer) == 0) {
strncpy(result, default_path, result_size - 1);
} else {
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;
}
// Set up raw terminal mode
struct termios raw_termios = orig_termios;
raw_termios.c_lflag &= ~(ECHO | ICANON);
raw_termios.c_cc[VMIN] = 1;
raw_termios.c_cc[VTIME] = 0;
if (tcsetattr(STDIN_FILENO, TCSANOW, &raw_termios) != 0) {
// Fallback if terminal setup fails
printf("\n%s\n%s: ", prompt, directory);
fflush(stdout);
char input_buffer[512];
if (!fgets(input_buffer, sizeof(input_buffer), stdin)) {
return 1;
}
input_buffer[strcspn(input_buffer, "\n")] = 0;
if (strlen(input_buffer) == 0) {
strncpy(result, default_path, result_size - 1);
} else {
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;
}
// Display prompt and directory
printf("\n%s\n%s", prompt, directory);
fflush(stdout); fflush(stdout);
char input_buffer[512]; // Initialize editing buffer with default filename
if (!fgets(input_buffer, sizeof(input_buffer), stdin)) { char edit_buffer[512];
return 1; // Error reading input strncpy(edit_buffer, filename, sizeof(edit_buffer) - 1);
edit_buffer[sizeof(edit_buffer) - 1] = '\0';
int cursor_pos = strlen(edit_buffer);
int buffer_len = cursor_pos;
// Display initial filename
printf("%s", edit_buffer);
fflush(stdout);
// Main editing loop
int c;
while ((c = getchar()) != EOF) {
if (c == '\n' || c == '\r') {
// Enter key - accept input
break;
} else if (c == 127 || c == 8) {
// Backspace/Delete
if (cursor_pos > 0) {
// Move everything after cursor one position left
memmove(&edit_buffer[cursor_pos - 1], &edit_buffer[cursor_pos], buffer_len - cursor_pos + 1);
cursor_pos--;
buffer_len--;
// Redraw line: move cursor to start of filename area, clear to end, redraw buffer
printf("\r%s\033[K%s", directory, edit_buffer);
// Position cursor correctly
if (cursor_pos < buffer_len) {
printf("\033[%dD", buffer_len - cursor_pos);
}
fflush(stdout);
}
} else if (c == 27) {
// Escape sequence (arrow keys, etc.)
int c1 = getchar();
int c2 = getchar();
if (c1 == '[') {
if (c2 == 'C' && cursor_pos < buffer_len) {
// Right arrow
cursor_pos++;
printf("\033[1C");
fflush(stdout);
} else if (c2 == 'D' && cursor_pos > 0) {
// Left arrow
cursor_pos--;
printf("\033[1D");
fflush(stdout);
} else if (c2 == 'H') {
// Home key
printf("\033[%dD", cursor_pos);
cursor_pos = 0;
fflush(stdout);
} else if (c2 == 'F') {
// End key
printf("\033[%dC", buffer_len - cursor_pos);
cursor_pos = buffer_len;
fflush(stdout);
}
}
} else if (c >= 32 && c <= 126) {
// Printable character
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;
cursor_pos++;
buffer_len++;
// Redraw from cursor position
printf("%c", c);
if (cursor_pos < buffer_len) {
// Print remaining characters and move cursor back
printf("%s\033[%dD", &edit_buffer[cursor_pos], buffer_len - cursor_pos);
}
fflush(stdout);
}
}
// Ignore other control characters
} }
// Remove newline // Restore terminal
input_buffer[strcspn(input_buffer, "\n")] = 0; tcsetattr(STDIN_FILENO, TCSANOW, &orig_termios);
printf("\n");
// If user just pressed Enter, use the default filename // Construct final result
if (strlen(input_buffer) == 0) { if (buffer_len == 0) {
// Empty input, use default
strncpy(result, default_path, result_size - 1); strncpy(result, default_path, result_size - 1);
result[result_size - 1] = '\0';
} else { } else {
// Combine directory with user input // Combine directory with edited filename
edit_buffer[buffer_len] = '\0';
if (strlen(directory) > 0) { if (strlen(directory) > 0) {
snprintf(result, result_size, "%s%s", directory, input_buffer); snprintf(result, result_size, "%s%s", directory, edit_buffer);
} else { } else {
strncpy(result, input_buffer, result_size - 1); strncpy(result, edit_buffer, result_size - 1);
result[result_size - 1] = '\0';
} }
} }
result[result_size - 1] = '\0';
return 0; // Success return 0;
} }
// Editor and file manager implementations // Editor and file manager implementations

BIN
output.otp Normal file

Binary file not shown.

7
test_file.txt.otp.asc Normal file
View File

@@ -0,0 +1,7 @@
-----BEGIN OTP MESSAGE-----
Version: v0.2.29
Pad-ChkSum: d0d4a489354348b08d8c7b324814d8c50010042e9da47f2c973f32a16a09101b
Pad-Offset: 57
05S8GfS0tFfczNMUz0xrieFGoPSREM4uo5QhFGoBCcOzjfTXTDMt3hRtAQ==
-----END OTP MESSAGE-----

1
test_input.txt Normal file
View File

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

BIN
toc.txt.otp Normal file

Binary file not shown.