Compare commits

...

68 Commits

Author SHA1 Message Date
eb8a5b6565 Version v0.2.87 - Fix default pad preferences to store full file paths instead of relative paths 2025-08-27 07:53:15 -04:00
d0a5628072 Version v0.2.86 - config 2025-08-26 16:29:25 -04:00
5498a2321e Version v0.2.85 - readme.md 2025-08-26 15:54:25 -04:00
fe2eb40ead Readme 2025-08-26 15:52:05 -04:00
0db1988d8f todo 2025-08-21 12:24:39 -04:00
97530c8eb3 Version v0.2.83 - Fixed all remaining buffer size warnings - eliminated all compile warnings 2025-08-14 12:38:02 -04:00
a85c4ed55b Version v0.2.82 - Fixed final buffer size warning in /run/media path handling 2025-08-14 12:37:28 -04:00
a9974c7e87 Version v0.2.81 - Fixed remaining buffer size warnings - increased all preferences buffer sizes to 2048 2025-08-14 12:36:56 -04:00
592d54728b Version v0.2.80 - Fixed compile warnings - increased buffer sizes and added length validation 2025-08-14 12:36:06 -04:00
21b3c4de52 Version v0.2.79 - Fixed decrypt output - added newline and flush to ensure proper output 2025-08-14 12:29:23 -04:00
3a854c3ccf Version v0.2.78 - Fixed base64 data parsing - added fallback for data lines without empty separator 2025-08-14 12:24:34 -04:00
877add0dbf Version v0.2.77 - Added debug statements to decrypt_text_silent function 2025-08-14 12:18:48 -04:00
482687cb68 Version v0.2.76 - Fixed decrypt output - removed extra newline to output only the plaintext 2025-08-14 11:46:40 -04:00
e35d94243e Version v0.2.75 - Fixed decrypt mode to suppress startup messages for clean pipe operations 2025-08-14 11:38:58 -04:00
e88e1b5d3d Version v0.2.74 - Added silent decrypt mode for clean pipe operations 2025-08-14 11:37:26 -04:00
41ef97c43e Version v0.2.73 - Fixed newline formatting - clean output for pipe mode, spaced for interactive 2025-08-14 11:30:51 -04:00
7810e66114 Version v0.2.72 - Clean pipe mode output - suppressed startup messages for seamless piping 2025-08-14 11:28:34 -04:00
b4be05c34d Version v0.2.71 - Enhanced pipe mode to automatically use default pad with ASCII armor output 2025-08-14 11:25:55 -04:00
1cb0ba935d Version v0.2.70 - Added preferences system with default pad support 2025-08-14 10:45:27 -04:00
8c8c873e73 Version v0.2.69 - Fixed stdin pipe mode to use terminal for interactive input 2025-08-14 10:29:32 -04:00
692f65b7f0 Version v0.2.68 - Implemented stdin pipe support for OTP program 2025-08-14 10:28:50 -04:00
1c4200a73a Version v0.2.67 - Enhanced UI - added Q for quit and improved pad generation flow 2025-08-14 10:18:02 -04:00
1c9e2ee527 Version v0.2.66 - Fixed cross-filesystem pad generation with copy fallback for USB drives 2025-08-14 10:05:33 -04:00
8401e14ae0 Version v0.2.65 - Improved USB drive directory display with USB: prefix and proper drive name 2025-08-14 09:43:05 -04:00
0dbd81d1cc Version v0.2.64 - Fixed OTP thumb drive detection logic for /media/[username]/[drive_name] pattern 2025-08-14 09:40:45 -04:00
f979789c11 Version v0.2.63 - Fixed OTP thumb drive detection for /media/[username]/[drive_name] structure 2025-08-14 09:39:38 -04:00
498d7d31c4 Version v0.2.62 - Fixed all buffer size warnings by increasing buffer sizes to 1024 bytes 2025-08-14 09:32:39 -04:00
e58f05619e Version v0.2.59 - Fixed all remaining PADS_DIR references and removed old USB scanning code 2025-08-14 09:15:22 -04:00
992b9349b3 Version v0.2.58 - Completed refactoring to new OTP thumb drive detection approach 2025-08-14 09:14:54 -04:00
1f4a1fb90f Version v0.2.56 - Implemented new OTP thumb drive detection and removed old USB scanning approach 2025-08-14 07:33:40 -04:00
c7fae1ad1d Version v0.2.55 - Increased pad_path and state_path buffer sizes to 4096 bytes to eliminate all compile warnings 2025-08-13 20:48:06 -04:00
37bcb6a6d2 Version v0.2.54 - Final fix for remaining compile warning by increasing user_mount_path buffer to 2048 bytes 2025-08-13 18:14:42 -04:00
9ded0aed44 Version v0.2.53 - Complete fix for all compile warnings - enlarged all buffer sizes consistently 2025-08-13 15:42:43 -04:00
4442837ce8 Version v0.2.52 - Final buffer size adjustments to eliminate all compile warnings 2025-08-13 15:42:18 -04:00
31ee220558 Version v0.2.51 - Fixed all struct buffer sizes to eliminate compile warnings 2025-08-13 15:41:54 -04:00
0a25c13b65 Version v0.2.50 - Fixed compile warnings by increasing buffer sizes for USB path handling 2025-08-13 15:41:29 -04:00
fd9d87c548 Version v0.2.49 - Added USB drive detection for pads with state conflict resolution 2025-08-13 15:12:16 -04:00
c1aa29cd73 Version v0.2.48 - fixed checksum display to show exactly 8 characters with proper prefix highlighting 2025-08-13 14:15:20 -04:00
75e52d48dc Version v0.2.47 - implemented 8-character checksum display and USB-aware directory shortening with smart path compression 2025-08-13 14:14:27 -04:00
28947a53a3 Version v0.2.46 - fixed printf formatting error in pad display function 2025-08-13 14:03:41 -04:00
5a611a9dc0 Version v0.2.45 - implemented consolidated menu system with intelligent prefix-based pad selection 2025-08-13 14:03:13 -04:00
aff8bea0a2 Version v0.2.44 - cleaned up unused code - removed ensure_files_directory, xor_checksum_256, generate_pad, and get_user_choice functions and prototypes 2025-08-13 13:46:52 -04:00
864c0356da Version v0.2.43 - restored smart decrypt functionality with enhanced interactive input and cleaned up old code 2025-08-13 13:43:27 -04:00
35175790e2 Version v0.2.42 - fixed decrypt menu to use proper enhanced interactive input function 2025-08-13 12:06:08 -04:00
04ea4fb848 Version v0.2.41 - More menu 2025-08-13 12:01:50 -04:00
5c61ba7ea8 Version v0.2.40 - Clean up menu 2025-08-13 11:59:29 -04:00
a45b304d22 Version v0.2.39 - added proper spacing to all menu items for better visual appearance 2025-08-13 11:54:16 -04:00
403d013224 Version v0.2.38 - updated command-line file encryption to use files directory by default 2025-08-13 11:47:52 -04:00
82533d96e4 Version v0.2.37 - implemented files directory support with smart default paths for all file operations 2025-08-13 11:46:50 -04:00
5b619384a1 Version v0.2.36 - fixed build warning and corrected encrypt menu output filename generation logic 2025-08-13 11:42:14 -04:00
12b9884572 Version v0.2.34 - Formatting 2025-08-13 11:41:14 -04:00
83b60b5cc2 Version v0.2.33 - implemented enhanced interactive filename editing for decrypt file functionality with smart defaults 2025-08-13 11:37:41 -04:00
2d6546ab83 Version v0.2.32 - implemented enhanced interactive filename editing for decrypt functionality 2025-08-13 11:30:29 -04:00
c255185084 Version v0.2.31 - fixed signed/unsigned comparison warning in enhanced input function 2025-08-13 11:11:08 -04:00
24800d69d5 Version v0.2.30 - implemented advanced interactive filename editing with cursor control and pre-filled text 2025-08-13 11:10:43 -04:00
7e50727163 Version v0.2.29 - implemented enhanced filename input with directory/filename separation 2025-08-13 10:47:08 -04:00
f118c23c60 Version v0.2.28 - fixed format truncation warnings by increasing buffer size 2025-08-13 10:40:45 -04:00
b149175f24 Version v0.2.26 - clean build 2025-08-13 10:35:55 -04:00
206e8042d8 Version v0.2.25 - Added default output filename prompt with pre-filled value for file encryption 2025-08-13 10:31:24 -04:00
2a5249d93c Version v0.2.24 - Added 'q' as additional exit key alongside 'x' 2025-08-13 10:27:37 -04:00
0e02eaee53 Version v0.2.23 - Restructured menu system with streamlined text/file encrypt and smart decrypt 2025-08-13 10:24:50 -04:00
e32eb8b2b1 Version v0.2.22 - Added text editor and file manager integration 2025-08-13 10:08:38 -04:00
0aecae0c5e test files 2025-08-12 19:08:14 -04:00
fa90e0eafd Version v0.2.21 - Implement interactive file encryption and decryption in menu system 2025-08-11 06:03:05 -04:00
2a10d974b2 Version v0.2.20 - Add comprehensive help flag support and fix pad selection to prioritize hex prefix matching over number selection 2025-08-10 15:22:15 -04:00
7e04896394 Version v0.2.19 - Update README to reflect removal of original filename from binary .otp format 2025-08-10 15:17:33 -04:00
0cdf6e7804 Version v0.2.18 - Remove original filename from binary .otp file format - simplify file structure 2025-08-10 15:05:36 -04:00
268758a21b Version v0.2.17 - Fix pad selection logic - allow flexible hex prefix matching instead of restrictive number selection 2025-08-10 14:57:51 -04:00
22 changed files with 11037 additions and 212 deletions

View File

@@ -0,0 +1,29 @@
When building, use build.sh, not make.
Use it as follows: build.sh -m "useful comment on changes being made"
When making TUI menus, try to use the first leter of the command and the key to press to execute that command. For example, if the command is "Open file" try to use a keypress of "o" upper or lower case to signal to open the file. Use this instead of number keyed menus when possible. In the command, the letter should be underlined that signifies the command.
## Buffer Size Guidelines
### Path Handling
- Always use buffers of size 1024 or PATH_MAX (4096) for file paths
- When concatenating paths with snprintf, ensure buffer is at least 2x the expected maximum input
- Use safer path construction patterns that check lengths before concatenation
### String Formatting Safety
- Before using snprintf with dynamic strings, validate that buffer size >= sum of all input string lengths + format characters + 1
- Use strnlen() to check actual string lengths before formatting
- Consider using asprintf() for dynamic allocation when exact size is unknown
- Add length validation before snprintf calls
### Compiler Warning Prevention
- Always size string buffers generously (minimum 1024 for paths, 512 for general strings)
- Use buffer size calculations: `size >= strlen(str1) + strlen(str2) + format_overhead + 1`
- Add runtime length checks before snprintf operations
- Consider using safer alternatives like strlcpy/strlcat if available
### Code Patterns to Avoid
- Fixed-size buffers (512 bytes) for path operations where inputs could be 255+ bytes each
- Concatenating unchecked strings with snprintf
- Assuming maximum path component sizes without validation

View File

@@ -1,6 +1,47 @@
# OTP Cipher - One Time Pad Implementation
A secure one-time pad (OTP) cipher implementation in C with automatic versioning system.
## Introduction
A secure one-time pad (OTP) cipher implementation in C.
## Why One-Time Pads
Nostr and much of the web runs on public key cryptography. Public key cryptography is great, but it is vulnerable. Cryptographers know this, and they know what it takes to attack it, so what they do is just make the keys large enough such that the system is resistant to attack given computers as they are today.
There is one type of cryptography, however, that is invulnerable to any type of attack in our universe, and that is known as a one-time pad.
One-time pads rely directly on the laws of physics and what it means for a number to be truly random.
If you take your secret message and mix it with truly random numbers, and don't use those random numbers again, then that message is unbreakable by any computer, no matter how powerful, quantum or not, forever.
In fact, one-time pads are so powerful that if you have data encrypted by a one-time pad located in a distant galaxy, and that data is not kept anywhere else, then by destroying the pad used for encryption in your galaxy, the data is wiped from the universe and can never be recovered.
## Advantages and Limitations
### Limitations
1. The pad must be shared between the parties wanting to use it.
2. The pad must be as long or longer than what you want to encrypt, and it can't be used a second time.
### Modern Advantages
While in the past, pad length might have been a problem, readily available USB drives in the terabytes make size less of a problem for many uses.
We are also becoming very accustomed to YubiKey authenticators in the USB ports of our computers. A small USB drive in our devices can now easily contain a key of greater length than all the text messages we would expect to send over a lifetime.
### Multi-Device Coordination
One of the problems to address is the fact that to use an OTP across several devices means that they have to coordinate to know when they are encrypting new plaintext and where to start in the key. Reusing the same section of the pad, while not necessarily fatal, degrades the encryption from its status as "Information Theoretically Secure".
To address this problem, we can use Nostr to share among devices the place in the pad that was last left off.
### Additional Benefits
One-time pads can be trivially encrypted and decrypted using pencil and paper, making them accessible even without electronic devices.
## Features
@@ -13,15 +54,6 @@ A secure one-time pad (OTP) cipher implementation in C with automatic versioning
- **Multiple Build Options**: Standard and static linking builds
- **Cross-Platform**: Works on Linux and other UNIX-like systems
## Version Information
This project uses an automatic versioning system that:
- Automatically increments the patch version on each build
- Embeds build timestamp, git commit hash, and branch information
- Creates git tags for version tracking
- Generates version header files with detailed build metadata
Current version can be viewed with: `./otp --help` or by running the interactive mode.
## Building
@@ -31,7 +63,7 @@ Current version can be viewed with: `./otp --help` or by running the interactive
- Git (for version tracking)
- Make
**Note: OpenSSL is no longer required! This implementation is now completely self-contained.**
### Build Commands
@@ -164,11 +196,9 @@ Offset | Size | Field | Description
4 | 2 | Version | Format version (currently 1)
6 | 32 | Pad Checksum | Binary pad checksum (32 bytes)
38 | 8 | Pad Offset | Offset in pad file (uint64_t)
46 | 2 | Filename Length | Original filename length (uint16_t)
48 | var | Original Filename | Original filename string
var | 4 | File Mode | Original file permissions (uint32_t)
var | 8 | File Size | Original file size (uint64_t)
var | var | Encrypted Data | XOR-encrypted file contents
46 | 4 | File Mode | Original file permissions (uint32_t)
50 | 8 | File Size | Original file size (uint64_t)
58 | var | Encrypted Data | XOR-encrypted file contents
```
### .otp.asc File Format (ASCII Armored)
@@ -185,7 +215,7 @@ Pad-Offset: <decimal-offset-value>
-----END OTP MESSAGE-----
```
**Note:** ASCII armored files lose original filename and permission metadata.
**Note:** ASCII armored files do not preserve original file permissions metadata.
## Usage Examples

26
TODO.md Normal file
View File

@@ -0,0 +1,26 @@
# TODO
## Change technique for adding keyboard entropy.
## Some of the processing seems similar, so maybe code could be more compact.
## Command line otp -e should go to default pad, and then comment after the fact that it used the default pad.
## There is the problem of the location of the pad revealing metadata about how many messages have been sent in the past, or at least the size of the messsages.
One solution could be to start the pad at a random location, and then wrap around, so an attacker could never tell the size of the past text sent. This helps. But then you have to store the start location, which you could do within the header of the pad along with the pad?
Or, better yet, assume the offset is a very large size, and use the pad itself to encrypt the offset.
## Take a look at how the file header is being handled.
## We have three different decrypt file functions
## Preferences directory and files look off. Should probably have ~/.otp as the default directory, and then in there we can have otp.conf, pads/
## Setup for multiple USB drives
## Change back in pad menu to exit

BIN
debug Executable file

Binary file not shown.

1
debug.c Normal file
View File

@@ -0,0 +1 @@
int main() { printf("Testing direct filename: %d\n", strncmp("97d9d82b5414a9439102f3811fb90ab1d6368a00d33229a18b306476f9d04f82.pad", "97", 2)); return 0; }

1
files/o2.txt Normal file
View File

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

BIN
files/out2.otp Normal file

Binary file not shown.

BIN
files/output.otp Normal file

Binary file not shown.

1
files/test_decrypt.txt Normal file
View File

@@ -0,0 +1 @@
Test file content for decryption

BIN
files/test_decrypt.txt.otp Normal file

Binary file not shown.

1
files/test_file.txt Normal file
View File

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

View File

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

Binary file not shown.

1
files/test_input.txt Normal file
View File

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

8898
files/toc.txt Executable file

File diff suppressed because it is too large Load Diff

BIN
files/toc.txt.otp Normal file

Binary file not shown.

2141
otp.c

File diff suppressed because it is too large Load Diff

8
otp.code-workspace Normal file
View File

@@ -0,0 +1,8 @@
{
"folders": [
{
"path": "."
}
],
"settings": {}
}

View File

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

Binary file not shown.

View File

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

View File

@@ -1,7 +0,0 @@
-----BEGIN OTP MESSAGE-----
Version: v0.2.15
Pad-ChkSum: 0c8e19fde996e683fdbd348d1052eec168ffe6f67a88bb1278d0d02e9341b87b
Pad-Offset: 210
mMIm7iVtUO6NbXbskMxtydI/A16UXEQUGTcIya/8Dja6PB3EC0MLdw==
-----END OTP MESSAGE-----