Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 7a30949ddd | |||
| eb8a5b6565 | |||
| d0a5628072 |
2
TODO.md
2
TODO.md
@@ -22,3 +22,5 @@ Or, better yet, assume the offset is a very large size, and use the pad itself t
|
|||||||
## Setup for multiple USB drives
|
## Setup for multiple USB drives
|
||||||
|
|
||||||
|
|
||||||
|
## Change back in pad menu to exit
|
||||||
|
|
||||||
|
|||||||
256
otp.c
256
otp.c
@@ -244,13 +244,71 @@ int command_line_mode(int argc, char* argv[]) {
|
|||||||
return generate_pad_with_entropy(size, 1, 0); // No keyboard entropy for command line
|
return generate_pad_with_entropy(size, 1, 0); // No keyboard entropy for command line
|
||||||
}
|
}
|
||||||
else if (strcmp(argv[1], "encrypt") == 0 || strcmp(argv[1], "-e") == 0) {
|
else if (strcmp(argv[1], "encrypt") == 0 || strcmp(argv[1], "-e") == 0) {
|
||||||
if (argc < 3 || argc > 4) {
|
if (argc < 2 || argc > 4) {
|
||||||
printf("Usage: %s encrypt|-e <pad_chksum_or_prefix> [text_to_encrypt]\n", argv[0]);
|
printf("Usage: %s encrypt|-e [pad_chksum_or_prefix] [text_to_encrypt]\n", argv[0]);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
// Pass text if provided, otherwise NULL for interactive mode
|
|
||||||
const char* text = (argc == 4) ? argv[3] : NULL;
|
// Check if pad was specified or use default
|
||||||
return encrypt_text(argv[2], text);
|
const char* pad_identifier = NULL;
|
||||||
|
const char* text = NULL;
|
||||||
|
|
||||||
|
if (argc == 2) {
|
||||||
|
// Just -e, use default pad, no text (interactive)
|
||||||
|
pad_identifier = NULL;
|
||||||
|
text = NULL;
|
||||||
|
} else if (argc == 3) {
|
||||||
|
// Could be -e <pad> or -e <text> (using default pad)
|
||||||
|
// Check if default pad is available to determine interpretation
|
||||||
|
char* default_pad = get_default_pad_path();
|
||||||
|
if (default_pad) {
|
||||||
|
// Default pad available, treat argument as text
|
||||||
|
pad_identifier = NULL;
|
||||||
|
text = argv[2];
|
||||||
|
free(default_pad);
|
||||||
|
} else {
|
||||||
|
// No default pad, treat as pad identifier
|
||||||
|
pad_identifier = argv[2];
|
||||||
|
text = NULL;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// argc == 4: -e <pad> <text>
|
||||||
|
pad_identifier = argv[2];
|
||||||
|
text = argv[3];
|
||||||
|
}
|
||||||
|
|
||||||
|
// If pad_identifier is NULL, we need to use default pad
|
||||||
|
if (pad_identifier == NULL) {
|
||||||
|
char* default_pad = get_default_pad_path();
|
||||||
|
if (default_pad) {
|
||||||
|
// Extract checksum from default pad path
|
||||||
|
char* filename = strrchr(default_pad, '/');
|
||||||
|
if (!filename) filename = default_pad;
|
||||||
|
else filename++; // Skip the '/'
|
||||||
|
|
||||||
|
// Extract checksum (remove .pad extension)
|
||||||
|
if (strlen(filename) >= 68 && strstr(filename, ".pad")) {
|
||||||
|
static char default_checksum[65];
|
||||||
|
strncpy(default_checksum, filename, 64);
|
||||||
|
default_checksum[64] = '\0';
|
||||||
|
pad_identifier = default_checksum;
|
||||||
|
}
|
||||||
|
free(default_pad);
|
||||||
|
|
||||||
|
// Call encrypt_text and then comment about using default pad
|
||||||
|
int result = encrypt_text(pad_identifier, text);
|
||||||
|
if (result == 0) {
|
||||||
|
printf("# Used default pad: %.16s...\n", pad_identifier);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
} else {
|
||||||
|
printf("Error: No default pad configured. Specify pad explicitly or configure default pad.\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Explicit pad specified, normal operation
|
||||||
|
return encrypt_text(pad_identifier, text);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (strcmp(argv[1], "decrypt") == 0 || strcmp(argv[1], "-d") == 0) {
|
else if (strcmp(argv[1], "decrypt") == 0 || strcmp(argv[1], "-d") == 0) {
|
||||||
if (argc == 2) {
|
if (argc == 2) {
|
||||||
@@ -817,9 +875,27 @@ int list_available_pads(void) {
|
|||||||
struct dirent* entry;
|
struct dirent* entry;
|
||||||
int count = 0;
|
int count = 0;
|
||||||
|
|
||||||
|
// Get current default pad path for comparison
|
||||||
|
char* current_default = get_default_pad_path();
|
||||||
|
char default_pad_checksum[65] = "";
|
||||||
|
|
||||||
|
if (current_default) {
|
||||||
|
// Extract checksum from default pad path
|
||||||
|
char* filename = strrchr(current_default, '/');
|
||||||
|
if (!filename) filename = current_default;
|
||||||
|
else filename++; // Skip the '/'
|
||||||
|
|
||||||
|
// Extract checksum (remove .pad extension)
|
||||||
|
if (strlen(filename) >= 68 && strstr(filename, ".pad")) {
|
||||||
|
strncpy(default_pad_checksum, filename, 64);
|
||||||
|
default_pad_checksum[64] = '\0';
|
||||||
|
}
|
||||||
|
free(current_default);
|
||||||
|
}
|
||||||
|
|
||||||
printf("\nAvailable pads:\n");
|
printf("\nAvailable pads:\n");
|
||||||
printf("%-4s %-20s %-12s %-12s %-8s\n", "No.", "ChkSum", "Size", "Used", "% Used");
|
printf("%-4s %-7s %-20s %-12s %-12s %-8s\n", "No.", "Default", "ChkSum", "Size", "Used", "% Used");
|
||||||
printf("%-4s %-20s %-12s %-12s %-8s\n", "---", "-------------------", "----------", "----------", "------");
|
printf("%-4s %-7s %-20s %-12s %-12s %-8s\n", "---", "-------", "-------------------", "----------", "----------", "------");
|
||||||
|
|
||||||
while ((entry = readdir(dir)) != NULL) {
|
while ((entry = readdir(dir)) != NULL) {
|
||||||
if (strstr(entry->d_name, ".pad") && strlen(entry->d_name) == 68) {
|
if (strstr(entry->d_name, ".pad") && strlen(entry->d_name) == 68) {
|
||||||
@@ -828,6 +904,10 @@ int list_available_pads(void) {
|
|||||||
strncpy(chksum, entry->d_name, 64);
|
strncpy(chksum, entry->d_name, 64);
|
||||||
chksum[64] = '\0';
|
chksum[64] = '\0';
|
||||||
|
|
||||||
|
// Check if this is the default pad
|
||||||
|
int is_default = (strlen(default_pad_checksum) > 0 &&
|
||||||
|
strncmp(chksum, default_pad_checksum, 64) == 0);
|
||||||
|
|
||||||
// Get pad file size
|
// Get pad file size
|
||||||
char full_path[1024]; // Increased buffer size to accommodate longer paths
|
char full_path[1024]; // Increased buffer size to accommodate longer paths
|
||||||
snprintf(full_path, sizeof(full_path), "%s/%s", current_pads_dir, entry->d_name);
|
snprintf(full_path, sizeof(full_path), "%s/%s", current_pads_dir, entry->d_name);
|
||||||
@@ -865,7 +945,7 @@ int list_available_pads(void) {
|
|||||||
// Calculate percentage
|
// Calculate percentage
|
||||||
double percentage = (double)used_bytes / st.st_size * 100.0;
|
double percentage = (double)used_bytes / st.st_size * 100.0;
|
||||||
|
|
||||||
printf("%-4d %-20.16s %-12s %-12s %.1f%%\n", count, chksum, size_str, used_str, percentage);
|
printf("%-4d %-7s %-20.16s %-12s %-12s %.1f%%\n", count, is_default ? "*" : "", chksum, size_str, used_str, percentage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2627,7 +2707,54 @@ int load_preferences(void) {
|
|||||||
|
|
||||||
FILE* file = fopen(preferences_file, "r");
|
FILE* file = fopen(preferences_file, "r");
|
||||||
if (!file) {
|
if (!file) {
|
||||||
return 0; // No preferences file, use defaults
|
// No preferences file exists - create it and set first pad as default
|
||||||
|
|
||||||
|
// Create .otp directory if it doesn't exist
|
||||||
|
struct stat st = {0};
|
||||||
|
if (stat(preferences_dir, &st) == -1) {
|
||||||
|
if (mkdir(preferences_dir, 0755) != 0) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find the first available pad to set as default
|
||||||
|
DIR* dir = opendir(current_pads_dir);
|
||||||
|
if (dir) {
|
||||||
|
struct dirent* entry;
|
||||||
|
char first_pad_path[1024];
|
||||||
|
int found_pad = 0;
|
||||||
|
|
||||||
|
while ((entry = readdir(dir)) != NULL && !found_pad) {
|
||||||
|
if (strstr(entry->d_name, ".pad") && strlen(entry->d_name) == 68) {
|
||||||
|
// Found a pad file - construct full absolute path
|
||||||
|
char absolute_path[1024];
|
||||||
|
if (current_pads_dir[0] == '/') {
|
||||||
|
// Already absolute path
|
||||||
|
snprintf(first_pad_path, sizeof(first_pad_path), "%s/%s", current_pads_dir, entry->d_name);
|
||||||
|
} else {
|
||||||
|
// Relative path - make it absolute
|
||||||
|
char current_dir[512];
|
||||||
|
if (getcwd(current_dir, sizeof(current_dir))) {
|
||||||
|
snprintf(first_pad_path, sizeof(first_pad_path), "%s/%s/%s", current_dir, current_pads_dir, entry->d_name);
|
||||||
|
} else {
|
||||||
|
// Fallback to relative path
|
||||||
|
snprintf(first_pad_path, sizeof(first_pad_path), "%s/%s", current_pads_dir, entry->d_name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
strncpy(default_pad_path, first_pad_path, sizeof(default_pad_path) - 1);
|
||||||
|
default_pad_path[sizeof(default_pad_path) - 1] = '\0';
|
||||||
|
found_pad = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
closedir(dir);
|
||||||
|
|
||||||
|
// Create the preferences file with the default pad
|
||||||
|
if (found_pad) {
|
||||||
|
save_preferences();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0; // Successfully initialized
|
||||||
}
|
}
|
||||||
|
|
||||||
char line[1024];
|
char line[1024];
|
||||||
@@ -2727,7 +2854,29 @@ char* get_default_pad_path(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int set_default_pad_path(const char* pad_path) {
|
int set_default_pad_path(const char* pad_path) {
|
||||||
return set_preference("default_pad", pad_path);
|
if (!pad_path) {
|
||||||
|
return set_preference("default_pad", NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ensure we store the full absolute path
|
||||||
|
char absolute_path[1024];
|
||||||
|
if (pad_path[0] == '/') {
|
||||||
|
// Already absolute path
|
||||||
|
strncpy(absolute_path, pad_path, sizeof(absolute_path) - 1);
|
||||||
|
absolute_path[sizeof(absolute_path) - 1] = '\0';
|
||||||
|
} else {
|
||||||
|
// Relative path - make it absolute
|
||||||
|
char current_dir[512];
|
||||||
|
if (getcwd(current_dir, sizeof(current_dir))) {
|
||||||
|
snprintf(absolute_path, sizeof(absolute_path), "%s/%s", current_dir, pad_path);
|
||||||
|
} else {
|
||||||
|
// Fallback to using the path as-is if getcwd fails
|
||||||
|
strncpy(absolute_path, pad_path, sizeof(absolute_path) - 1);
|
||||||
|
absolute_path[sizeof(absolute_path) - 1] = '\0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return set_preference("default_pad", absolute_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
// OTP thumb drive detection function implementation
|
// OTP thumb drive detection function implementation
|
||||||
@@ -3501,18 +3650,41 @@ int handle_pads_menu(void) {
|
|||||||
prefixes[i][prefix_lengths[i]] = '\0';
|
prefixes[i][prefix_lengths[i]] = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
// Display pads with minimal prefixes underlined
|
// Display pads with minimal prefixes underlined and default indicator
|
||||||
printf("\nAvailable pads:\n");
|
printf("\nAvailable pads:\n");
|
||||||
printf("%-8s %-12s %-12s %-12s %-8s\n", "ChkSum", "Dir", "Size", "Used", "% Used");
|
printf("%-7s %-8s %-12s %-12s %-12s %-8s\n", "Default", "ChkSum", "Dir", "Size", "Used", "% Used");
|
||||||
printf("%-8s %-12s %-12s %-12s %-8s\n", "--------", "------------", "----------", "----------", "------");
|
printf("%-7s %-8s %-12s %-12s %-12s %-8s\n", "-------", "--------", "------------", "----------", "----------", "------");
|
||||||
|
|
||||||
|
// Get current default pad path for comparison
|
||||||
|
char* current_default = get_default_pad_path();
|
||||||
|
char default_pad_checksum[65] = "";
|
||||||
|
|
||||||
|
if (current_default) {
|
||||||
|
// Extract checksum from default pad path
|
||||||
|
char* filename = strrchr(current_default, '/');
|
||||||
|
if (!filename) filename = current_default;
|
||||||
|
else filename++; // Skip the '/'
|
||||||
|
|
||||||
|
// Extract checksum (remove .pad extension)
|
||||||
|
if (strlen(filename) >= 68 && strstr(filename, ".pad")) {
|
||||||
|
strncpy(default_pad_checksum, filename, 64);
|
||||||
|
default_pad_checksum[64] = '\0';
|
||||||
|
}
|
||||||
|
free(current_default);
|
||||||
|
}
|
||||||
|
|
||||||
for (int i = 0; i < pad_count; i++) {
|
for (int i = 0; i < pad_count; i++) {
|
||||||
|
// Check if this is the default pad
|
||||||
|
int is_default = (strlen(default_pad_checksum) > 0 &&
|
||||||
|
strncmp(pads[i].chksum, default_pad_checksum, 64) == 0);
|
||||||
|
|
||||||
// Display first 8 characters of checksum with prefix underlined
|
// Display first 8 characters of checksum with prefix underlined
|
||||||
char checksum_8char[9];
|
char checksum_8char[9];
|
||||||
strncpy(checksum_8char, pads[i].chksum, 8);
|
strncpy(checksum_8char, pads[i].chksum, 8);
|
||||||
checksum_8char[8] = '\0';
|
checksum_8char[8] = '\0';
|
||||||
|
|
||||||
printf("\033[4m%.*s\033[0m%s %-12s %-12s %-12s %.1f%%\n",
|
printf("%-7s \033[4m%.*s\033[0m%s %-12s %-12s %-12s %.1f%%\n",
|
||||||
|
is_default ? "*" : "", // Default indicator
|
||||||
prefix_lengths[i], checksum_8char, // Underlined prefix
|
prefix_lengths[i], checksum_8char, // Underlined prefix
|
||||||
checksum_8char + prefix_lengths[i], // Rest of 8-char checksum
|
checksum_8char + prefix_lengths[i], // Rest of 8-char checksum
|
||||||
pads[i].location, // Use the stored location info
|
pads[i].location, // Use the stored location info
|
||||||
@@ -3523,6 +3695,7 @@ int handle_pads_menu(void) {
|
|||||||
|
|
||||||
printf("\nActions:\n");
|
printf("\nActions:\n");
|
||||||
printf(" \033[4mG\033[0menerate new pad\n");
|
printf(" \033[4mG\033[0menerate new pad\n");
|
||||||
|
printf(" \033[4mS\033[0met default pad\n");
|
||||||
printf(" \033[4mB\033[0mack to main menu\n");
|
printf(" \033[4mB\033[0mack to main menu\n");
|
||||||
printf("\nSelect pad (by prefix) or action: ");
|
printf("\nSelect pad (by prefix) or action: ");
|
||||||
|
|
||||||
@@ -3541,6 +3714,59 @@ int handle_pads_menu(void) {
|
|||||||
return handle_pads_menu();
|
return handle_pads_menu();
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
|
} else if (toupper(input[0]) == 'S') {
|
||||||
|
// Set default pad
|
||||||
|
printf("\nSelect pad to set as default (by 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;
|
||||||
|
|
||||||
|
// Find matching pad by prefix using the same logic as pad selection
|
||||||
|
int matched_pad = -1;
|
||||||
|
int match_count = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < pad_count; i++) {
|
||||||
|
if (strncmp(pad_input, pads[i].chksum, strlen(pad_input)) == 0) {
|
||||||
|
matched_pad = i;
|
||||||
|
match_count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (match_count == 0) {
|
||||||
|
printf("No pad found matching prefix '%s'\n", pad_input);
|
||||||
|
return handle_pads_menu();
|
||||||
|
} else if (match_count > 1) {
|
||||||
|
printf("Ambiguous prefix. Multiple matches found.\n");
|
||||||
|
return handle_pads_menu();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Construct the full absolute pad path and set as default
|
||||||
|
char new_default_path[1024];
|
||||||
|
if (current_pads_dir[0] == '/') {
|
||||||
|
// Already absolute path
|
||||||
|
snprintf(new_default_path, sizeof(new_default_path), "%s/%s.pad", current_pads_dir, pads[matched_pad].chksum);
|
||||||
|
} else {
|
||||||
|
// Relative path - make it absolute
|
||||||
|
char current_dir[512];
|
||||||
|
if (getcwd(current_dir, sizeof(current_dir))) {
|
||||||
|
snprintf(new_default_path, sizeof(new_default_path), "%s/%s/%s.pad", current_dir, current_pads_dir, pads[matched_pad].chksum);
|
||||||
|
} else {
|
||||||
|
// Fallback to relative path
|
||||||
|
snprintf(new_default_path, sizeof(new_default_path), "%s/%s.pad", current_pads_dir, pads[matched_pad].chksum);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (set_default_pad_path(new_default_path) == 0) {
|
||||||
|
printf("Default pad set to: %.16s...\n", pads[matched_pad].chksum);
|
||||||
|
printf("Full path: %s\n", new_default_path);
|
||||||
|
} else {
|
||||||
|
printf("Error: Failed to update default pad preference\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
return handle_pads_menu();
|
||||||
} else if (toupper(input[0]) == 'B') {
|
} else if (toupper(input[0]) == 'B') {
|
||||||
return 0; // Back to main menu
|
return 0; // Back to main menu
|
||||||
}
|
}
|
||||||
@@ -3725,7 +3951,7 @@ void print_usage(const char* program_name) {
|
|||||||
printf("Usage:\n");
|
printf("Usage:\n");
|
||||||
printf(" %s - Interactive mode\n", program_name);
|
printf(" %s - Interactive mode\n", program_name);
|
||||||
printf(" %s generate|-g <size> - Generate new pad\n", program_name);
|
printf(" %s generate|-g <size> - Generate new pad\n", program_name);
|
||||||
printf(" %s encrypt|-e <pad_checksum_prefix> [text] - Encrypt text\n", program_name);
|
printf(" %s encrypt|-e [pad_checksum_prefix] [text] - Encrypt text\n", program_name);
|
||||||
printf(" %s decrypt|-d [encrypted_message] - Decrypt message\n", program_name);
|
printf(" %s decrypt|-d [encrypted_message] - Decrypt message\n", program_name);
|
||||||
printf(" %s -f <file> <pad_prefix> [-a] [-o <out>] - Encrypt file\n", program_name);
|
printf(" %s -f <file> <pad_prefix> [-a] [-o <out>] - Encrypt file\n", program_name);
|
||||||
printf(" %s list|-l - List available pads\n", program_name);
|
printf(" %s list|-l - List available pads\n", program_name);
|
||||||
|
|||||||
Reference in New Issue
Block a user