diff --git a/otp.c b/otp.c index 5a56b19..6f2ee64 100644 --- a/otp.c +++ b/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 } else if (strcmp(argv[1], "encrypt") == 0 || strcmp(argv[1], "-e") == 0) { - if (argc < 3 || argc > 4) { - printf("Usage: %s encrypt|-e [text_to_encrypt]\n", argv[0]); + if (argc < 2 || argc > 4) { + printf("Usage: %s encrypt|-e [pad_chksum_or_prefix] [text_to_encrypt]\n", argv[0]); return 1; } - // Pass text if provided, otherwise NULL for interactive mode - const char* text = (argc == 4) ? argv[3] : NULL; - return encrypt_text(argv[2], text); + + // Check if pad was specified or use default + 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 or -e (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_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) { if (argc == 2) { @@ -3893,7 +3951,7 @@ void print_usage(const char* program_name) { printf("Usage:\n"); printf(" %s - Interactive mode\n", program_name); printf(" %s generate|-g - Generate new pad\n", program_name); - printf(" %s encrypt|-e [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 -f [-a] [-o ] - Encrypt file\n", program_name); printf(" %s list|-l - List available pads\n", program_name);