Compare commits

..

3 Commits

8 changed files with 164 additions and 74 deletions

View File

@@ -2,7 +2,7 @@
## Introduction ## Introduction
A secure one-time pad (OTP) cipher implementation in C. A secure one-time pad (OTP) cipher implementation in C99.
## Why One-Time Pads ## Why One-Time Pads
@@ -58,20 +58,19 @@ One-time pads can be trivially encrypted and decrypted using pencil and paper, m
### Download Pre-Built Binaries ### Download Pre-Built Binaries
**[Download Current Linux x86](https://git.laantungir.net/laantungir/otp/releases/download/v0.3.32/otp-v0.3.32-linux-x86_64)** **[Download Current Linux x86](https://git.laantungir.net/laantungir/otp/releases/download/v0.3.35/otp-v0.3.35-linux-x86_64)**
**[Download Current Raspberry Pi 64](https://git.laantungir.net/laantungir/otp/releases/download/v0.3.32/otp-v0.3.32-linux-arm64)** **[Download Current Raspberry Pi 64](https://git.laantungir.net/laantungir/otp/releases/download/v0.3.35/otp-v0.3.35-linux-arm64)**
After downloading: After downloading:
```bash ```bash
# Make executable and rename for convenience # Rename for convenience, then make executable
chmod +x otp-v0.3.32-linux-x86_64 mv otp-v0.3.35-linux-x86_64 otp
mv otp-v0.3.32-linux-x86_64 otp chmod +x otp
# Run it # Run it
./otp ./otp
``` ```
### First Steps ### First Steps
1. **Generate your first pad:** 1. **Generate your first pad:**
@@ -93,11 +92,6 @@ mv otp-v0.3.32-linux-x86_64 otp
## Building from Source ## Building from Source
### Prerequisites ### Prerequisites
@@ -437,6 +431,28 @@ No. ChkSum (first 16 chars) Size Used % Used
# Select "S" for show pad info, enter checksum or prefix # Select "S" for show pad info, enter checksum or prefix
``` ```
## Important Notes
### Size Units: Decimal (SI) vs Binary (IEC)
**This program uses decimal (SI) units for all size specifications**, matching the behavior of most system tools like `ls -lh`, `df -h`, and file managers:
- **1 KB** = 1,000 bytes (not 1,024)
- **1 MB** = 1,000,000 bytes (not 1,048,576)
- **1 GB** = 1,000,000,000 bytes (not 1,073,741,824)
- **1 TB** = 1,000,000,000,000 bytes (not 1,099,511,627,776)
**Why decimal units?**
- Consistency with system tools (`ls`, `df`, file managers)
- Matches storage device marketing (a "1TB" USB drive has ~1,000,000,000,000 bytes)
- Avoids confusion when comparing sizes across different tools
- Industry standard for storage devices and file systems
**Example:** When you request a 100GB pad, the program creates exactly 100,000,000,000 bytes, which will display as "100GB" in `ls -lh` and your file manager.
**Note:** Some technical tools may use binary units (GiB, MiB) where 1 GiB = 1,024³ bytes. This program intentionally uses decimal units for user-friendliness and consistency with common tools.
## License ## License
This project includes automatic versioning system based on the Generic Automatic Version Increment System. This project includes automatic versioning system based on the Generic Automatic Version Increment System.

View File

@@ -169,9 +169,12 @@ update_source_version() {
After downloading: After downloading:
\`\`\`bash \`\`\`bash
# Make executable and run # Rename for convenience, then make executable
chmod +x otp-${NEW_VERSION}-linux-x86_64 mv otp-${NEW_VERSION}-linux-x86_64 otp
./otp-${NEW_VERSION}-linux-x86_64 chmod +x otp
# Run it
./otp
\`\`\`" \`\`\`"
# Use awk to replace the section between "### Download Pre-Built Binaries" and "### First Steps" # Use awk to replace the section between "### Download Pre-Built Binaries" and "### First Steps"

View File

@@ -82,7 +82,7 @@ int add_entropy_direct_xor(const char* pad_chksum, const unsigned char* entropy_
if (display_progress) { if (display_progress) {
printf("Adding entropy to pad using direct XOR...\n"); printf("Adding entropy to pad using direct XOR...\n");
printf("Pad size: %.2f GB (%lu bytes)\n", (double)pad_size / (1024.0*1024.0*1024.0), pad_size); printf("Pad size: %.2f GB (%lu bytes)\n", (double)pad_size / (1000.0*1000.0*1000.0), pad_size);
printf("Entropy size: %zu bytes\n", entropy_size); printf("Entropy size: %zu bytes\n", entropy_size);
} }
@@ -212,7 +212,7 @@ int add_entropy_chacha20(const char* pad_chksum, const unsigned char* entropy_da
if (display_progress) { if (display_progress) {
printf("Adding entropy to pad using Chacha20...\n"); printf("Adding entropy to pad using Chacha20...\n");
printf("Pad size: %.2f GB (%lu bytes)\n", (double)pad_size / (1024.0*1024.0*1024.0), pad_size); printf("Pad size: %.2f GB (%lu bytes)\n", (double)pad_size / (1000.0*1000.0*1000.0), pad_size);
} }
// Process pad in chunks // Process pad in chunks
@@ -593,8 +593,8 @@ int add_file_entropy_streaming(const char* pad_chksum, const char* file_path, si
if (display_progress) { if (display_progress) {
printf("Adding entropy to pad using streaming direct XOR...\n"); printf("Adding entropy to pad using streaming direct XOR...\n");
printf("Pad size: %.2f GB (%lu bytes)\n", (double)pad_size / (1024.0*1024.0*1024.0), pad_size); printf("Pad size: %.2f GB (%lu bytes)\n", (double)pad_size / (1000.0*1000.0*1000.0), pad_size);
printf("Entropy file: %.2f GB (%zu bytes)\n", (double)file_size / (1024.0*1024.0*1024.0), file_size); printf("Entropy file: %.2f GB (%zu bytes)\n", (double)file_size / (1000.0*1000.0*1000.0), file_size);
} }
// Process in chunks // Process in chunks

View File

@@ -23,7 +23,7 @@
#include <ctype.h> #include <ctype.h>
// Version - Updated automatically by build.sh // Version - Updated automatically by build.sh
#define OTP_VERSION "v0.3.32" #define OTP_VERSION "v0.3.35"
// Constants // Constants
#define MAX_INPUT_SIZE 4096 #define MAX_INPUT_SIZE 4096

View File

@@ -43,9 +43,9 @@ int show_pad_info(const char* chksum) {
printf("ChkSum: %s\n", chksum); printf("ChkSum: %s\n", chksum);
printf("File: %s\n", pad_filename); printf("File: %s\n", pad_filename);
double size_gb = (double)st.st_size / (1024.0 * 1024.0 * 1024.0); double size_gb = (double)st.st_size / (1000.0 * 1000.0 * 1000.0);
double used_gb = (double)used_bytes / (1024.0 * 1024.0 * 1024.0); double used_gb = (double)used_bytes / (1000.0 * 1000.0 * 1000.0);
double remaining_gb = (double)(st.st_size - used_bytes) / (1024.0 * 1024.0 * 1024.0); double remaining_gb = (double)(st.st_size - used_bytes) / (1000.0 * 1000.0 * 1000.0);
printf("Total size: %.2f GB (%lu bytes)\n", size_gb, st.st_size); printf("Total size: %.2f GB (%lu bytes)\n", size_gb, st.st_size);
printf("Used: %.2f GB (%lu bytes)\n", used_gb, used_bytes); printf("Used: %.2f GB (%lu bytes)\n", used_gb, used_bytes);
@@ -89,18 +89,18 @@ int generate_pad(uint64_t size_bytes, int display_progress) {
const char* pads_dir = get_current_pads_dir(); const char* pads_dir = get_current_pads_dir();
struct statvfs stat; struct statvfs stat;
if (statvfs(pads_dir, &stat) == 0) { if (statvfs(pads_dir, &stat) == 0) {
// Use f_bfree (total free blocks) instead of f_bavail (available to non-root) // Use f_bavail (available to non-root users) for accurate space reporting
// This gives the actual free space on the filesystem, which is more accurate // This accounts for filesystem reserved space (e.g., 5% on ext4)
// for removable media and user-owned directories uint64_t available_bytes = stat.f_bavail * stat.f_frsize;
uint64_t available_bytes = stat.f_bfree * stat.f_frsize; double available_gb = (double)available_bytes / (1000.0 * 1000.0 * 1000.0);
double available_gb = (double)available_bytes / (1024.0 * 1024.0 * 1024.0); double required_gb = (double)size_bytes / (1000.0 * 1000.0 * 1000.0);
double required_gb = (double)size_bytes / (1024.0 * 1024.0 * 1024.0);
if (available_bytes < size_bytes) { if (available_bytes < size_bytes) {
printf("\n⚠ WARNING: Insufficient disk space!\n"); printf("\n⚠ WARNING: Insufficient disk space!\n");
printf(" Required: %.2f GB\n", required_gb); printf(" Required: %.2f GB (%lu bytes)\n", required_gb, size_bytes);
printf(" Available: %.2f GB\n", available_gb); printf(" Available: %.2f GB (%lu bytes)\n", available_gb, available_bytes);
printf(" Shortfall: %.2f GB\n", required_gb - available_gb); printf(" Shortfall: %.2f GB\n", required_gb - available_gb);
printf(" Location: %s\n", pads_dir);
printf("\nContinue anyway? (y/N): "); printf("\nContinue anyway? (y/N): ");
char response[10]; char response[10];
@@ -129,11 +129,54 @@ int generate_pad(uint64_t size_bytes, int display_progress) {
FILE* pad_file = fopen(temp_filename, "wb"); FILE* pad_file = fopen(temp_filename, "wb");
if (!pad_file) { if (!pad_file) {
printf("Error: Cannot create temporary pad file %s\n", temp_filename); printf("Error: Cannot create temporary pad file '%s': %s (errno %d)\n",
temp_filename, strerror(errno), errno);
fclose(urandom); fclose(urandom);
return 1; return 1;
} }
// Preallocate full file size using posix_fallocate for guaranteed space reservation
// This actually allocates disk blocks (unlike ftruncate which creates sparse files)
int fd = fileno(pad_file);
double size_gb = (double)size_bytes / (1000.0 * 1000.0 * 1000.0);
if (display_progress) {
printf("Allocating %.2f GB on disk...\n", size_gb);
}
int alloc_result = posix_fallocate(fd, 0, (off_t)size_bytes);
if (alloc_result != 0) {
printf("Error: Failed to allocate %.2f GB temp file: %s (errno %d)\n",
size_gb, strerror(alloc_result), alloc_result);
printf(" Temp file: %s\n", temp_filename);
printf(" Location: %s\n", pads_dir);
if (alloc_result == ENOSPC) {
printf(" Cause: No space left on device\n");
printf(" This means the actual available space is less than reported\n");
} else if (alloc_result == EOPNOTSUPP) {
printf(" Cause: Filesystem doesn't support posix_fallocate\n");
printf(" Falling back to ftruncate (sparse file)...\n");
if (ftruncate(fd, (off_t)size_bytes) != 0) {
printf(" Fallback failed: %s\n", strerror(errno));
fclose(pad_file);
fclose(urandom);
unlink(temp_filename);
return 1;
}
} else {
printf(" Possible causes: quota limits, filesystem restrictions\n");
fclose(pad_file);
fclose(urandom);
unlink(temp_filename);
return 1;
}
}
if (display_progress && alloc_result == 0) {
printf("✓ Allocated %.2f GB on disk (guaranteed space)\n", size_gb);
}
unsigned char buffer[64 * 1024]; // 64KB buffer unsigned char buffer[64 * 1024]; // 64KB buffer
uint64_t bytes_written = 0; uint64_t bytes_written = 0;
time_t start_time = time(NULL); time_t start_time = time(NULL);
@@ -149,7 +192,8 @@ int generate_pad(uint64_t size_bytes, int display_progress) {
} }
if (fread(buffer, 1, (size_t)chunk_size, urandom) != (size_t)chunk_size) { if (fread(buffer, 1, (size_t)chunk_size, urandom) != (size_t)chunk_size) {
printf("Error: Failed to read from /dev/urandom\n"); printf("Error: Failed to read %lu bytes from /dev/urandom at position %lu: %s (errno %d)\n",
chunk_size, bytes_written, strerror(errno), errno);
fclose(urandom); fclose(urandom);
fclose(pad_file); fclose(pad_file);
unlink(temp_filename); unlink(temp_filename);
@@ -157,7 +201,11 @@ int generate_pad(uint64_t size_bytes, int display_progress) {
} }
if (fwrite(buffer, 1, (size_t)chunk_size, pad_file) != (size_t)chunk_size) { if (fwrite(buffer, 1, (size_t)chunk_size, pad_file) != (size_t)chunk_size) {
printf("Error: Failed to write to pad file\n"); printf("Error: fwrite failed for %lu bytes at position %lu/%lu (%.1f%%): %s (errno %d)\n",
chunk_size, bytes_written, size_bytes,
(double)bytes_written / size_bytes * 100.0, strerror(errno), errno);
printf(" Temp file: %s\n", temp_filename);
printf(" Disk space was checked - possible causes: fragmentation, I/O timeout, quota\n");
fclose(urandom); fclose(urandom);
fclose(pad_file); fclose(pad_file);
unlink(temp_filename); unlink(temp_filename);
@@ -216,8 +264,10 @@ int generate_pad(uint64_t size_bytes, int display_progress) {
return 1; return 1;
} }
double size_gb = (double)size_bytes / (1024.0 * 1024.0 * 1024.0); if (display_progress) {
printf("Generated pad: %s (%.2f GB)\n", pad_path, size_gb); double final_size_gb = (double)size_bytes / (1000.0 * 1000.0 * 1000.0);
printf("Generated pad: %s (%.2f GB)\n", pad_path, final_size_gb);
}
printf("Pad checksum: %s\n", chksum_hex); printf("Pad checksum: %s\n", chksum_hex);
printf("State file: %s\n", state_path); printf("State file: %s\n", state_path);
printf("Pad file set to read-only\n"); printf("Pad file set to read-only\n");
@@ -384,25 +434,25 @@ char* select_pad_interactive(const char* title, const char* prompt, pad_filter_t
} }
// Format total size // Format total size
if (st.st_size < 1024) { if (st.st_size < 1000) {
snprintf(pads[pad_count].size_str, sizeof(pads[pad_count].size_str), "%luB", st.st_size); snprintf(pads[pad_count].size_str, sizeof(pads[pad_count].size_str), "%luB", st.st_size);
} else if (st.st_size < 1024 * 1024) { } else if (st.st_size < 1000 * 1000) {
snprintf(pads[pad_count].size_str, sizeof(pads[pad_count].size_str), "%.1fKB", (double)st.st_size / 1024.0); snprintf(pads[pad_count].size_str, sizeof(pads[pad_count].size_str), "%.1fKB", (double)st.st_size / 1000.0);
} else if (st.st_size < 1024 * 1024 * 1024) { } else if (st.st_size < 1000 * 1000 * 1000) {
snprintf(pads[pad_count].size_str, sizeof(pads[pad_count].size_str), "%.1fMB", (double)st.st_size / (1024.0 * 1024.0)); snprintf(pads[pad_count].size_str, sizeof(pads[pad_count].size_str), "%.1fMB", (double)st.st_size / (1000.0 * 1000.0));
} else { } else {
snprintf(pads[pad_count].size_str, sizeof(pads[pad_count].size_str), "%.2fGB", (double)st.st_size / (1024.0 * 1024.0 * 1024.0)); snprintf(pads[pad_count].size_str, sizeof(pads[pad_count].size_str), "%.2fGB", (double)st.st_size / (1000.0 * 1000.0 * 1000.0));
} }
// Format used size // Format used size
if (used_bytes < 1024) { if (used_bytes < 1000) {
snprintf(pads[pad_count].used_str, sizeof(pads[pad_count].used_str), "%luB", used_bytes); snprintf(pads[pad_count].used_str, sizeof(pads[pad_count].used_str), "%luB", used_bytes);
} else if (used_bytes < 1024 * 1024) { } else if (used_bytes < 1000 * 1000) {
snprintf(pads[pad_count].used_str, sizeof(pads[pad_count].used_str), "%.1fKB", (double)used_bytes / 1024.0); snprintf(pads[pad_count].used_str, sizeof(pads[pad_count].used_str), "%.1fKB", (double)used_bytes / 1000.0);
} else if (used_bytes < 1024 * 1024 * 1024) { } else if (used_bytes < 1000 * 1000 * 1000) {
snprintf(pads[pad_count].used_str, sizeof(pads[pad_count].used_str), "%.1fMB", (double)used_bytes / (1024.0 * 1024.0)); snprintf(pads[pad_count].used_str, sizeof(pads[pad_count].used_str), "%.1fMB", (double)used_bytes / (1000.0 * 1000.0));
} else { } else {
snprintf(pads[pad_count].used_str, sizeof(pads[pad_count].used_str), "%.2fGB", (double)used_bytes / (1024.0 * 1024.0 * 1024.0)); snprintf(pads[pad_count].used_str, sizeof(pads[pad_count].used_str), "%.2fGB", (double)used_bytes / (1000.0 * 1000.0 * 1000.0));
} }
// Calculate percentage // Calculate percentage
@@ -584,6 +634,27 @@ int handle_pads_menu(void) {
// Get list of pads from current directory // Get list of pads from current directory
const char* pads_dir = get_current_pads_dir(); const char* pads_dir = get_current_pads_dir();
// Display directory and space information
printf("Pads Directory: %s\n", pads_dir);
// Get filesystem space information
struct statvfs vfs_stat;
if (statvfs(pads_dir, &vfs_stat) == 0) {
uint64_t total_bytes = vfs_stat.f_blocks * vfs_stat.f_frsize;
uint64_t available_bytes = vfs_stat.f_bavail * vfs_stat.f_frsize;
uint64_t used_bytes = total_bytes - (vfs_stat.f_bfree * vfs_stat.f_frsize);
double total_gb = (double)total_bytes / (1000.0 * 1000.0 * 1000.0);
double available_gb = (double)available_bytes / (1000.0 * 1000.0 * 1000.0);
double used_gb = (double)used_bytes / (1000.0 * 1000.0 * 1000.0);
double used_percent = (double)used_bytes / total_bytes * 100.0;
printf("Drive Space: %.2f GB total, %.2f GB used (%.1f%%), %.2f GB available\n",
total_gb, used_gb, used_percent, available_gb);
}
printf("\n");
DIR* dir = opendir(pads_dir); DIR* dir = opendir(pads_dir);
if (!dir) { if (!dir) {
printf("Error: Cannot open pads directory %s\n", pads_dir); printf("Error: Cannot open pads directory %s\n", pads_dir);
@@ -619,25 +690,25 @@ int handle_pads_menu(void) {
read_state_offset(pads[pad_count].chksum, &used_bytes); read_state_offset(pads[pad_count].chksum, &used_bytes);
// Format total size // Format total size
if (st.st_size < 1024) { if (st.st_size < 1000) {
snprintf(pads[pad_count].size_str, sizeof(pads[pad_count].size_str), "%luB", st.st_size); snprintf(pads[pad_count].size_str, sizeof(pads[pad_count].size_str), "%luB", st.st_size);
} else if (st.st_size < 1024 * 1024) { } else if (st.st_size < 1000 * 1000) {
snprintf(pads[pad_count].size_str, sizeof(pads[pad_count].size_str), "%.1fKB", (double)st.st_size / 1024.0); snprintf(pads[pad_count].size_str, sizeof(pads[pad_count].size_str), "%.1fKB", (double)st.st_size / 1000.0);
} else if (st.st_size < 1024 * 1024 * 1024) { } else if (st.st_size < 1000 * 1000 * 1000) {
snprintf(pads[pad_count].size_str, sizeof(pads[pad_count].size_str), "%.1fMB", (double)st.st_size / (1024.0 * 1024.0)); snprintf(pads[pad_count].size_str, sizeof(pads[pad_count].size_str), "%.1fMB", (double)st.st_size / (1000.0 * 1000.0));
} else { } else {
snprintf(pads[pad_count].size_str, sizeof(pads[pad_count].size_str), "%.2fGB", (double)st.st_size / (1024.0 * 1024.0 * 1024.0)); snprintf(pads[pad_count].size_str, sizeof(pads[pad_count].size_str), "%.2fGB", (double)st.st_size / (1000.0 * 1000.0 * 1000.0));
} }
// Format used size // Format used size
if (used_bytes < 1024) { if (used_bytes < 1000) {
snprintf(pads[pad_count].used_str, sizeof(pads[pad_count].used_str), "%luB", used_bytes); snprintf(pads[pad_count].used_str, sizeof(pads[pad_count].used_str), "%luB", used_bytes);
} else if (used_bytes < 1024 * 1024) { } else if (used_bytes < 1000 * 1000) {
snprintf(pads[pad_count].used_str, sizeof(pads[pad_count].used_str), "%.1fKB", (double)used_bytes / 1024.0); snprintf(pads[pad_count].used_str, sizeof(pads[pad_count].used_str), "%.1fKB", (double)used_bytes / 1000.0);
} else if (used_bytes < 1024 * 1024 * 1024) { } else if (used_bytes < 1000 * 1000 * 1000) {
snprintf(pads[pad_count].used_str, sizeof(pads[pad_count].used_str), "%.1fMB", (double)used_bytes / (1024.0 * 1024.0)); snprintf(pads[pad_count].used_str, sizeof(pads[pad_count].used_str), "%.1fMB", (double)used_bytes / (1000.0 * 1000.0));
} else { } else {
snprintf(pads[pad_count].used_str, sizeof(pads[pad_count].used_str), "%.2fGB", (double)used_bytes / (1024.0 * 1024.0 * 1024.0)); snprintf(pads[pad_count].used_str, sizeof(pads[pad_count].used_str), "%.2fGB", (double)used_bytes / (1000.0 * 1000.0 * 1000.0));
} }
// Calculate percentage // Calculate percentage
@@ -949,9 +1020,9 @@ int handle_verify_pad(const char* chksum) {
printf("ChkSum: %s\n", chksum); printf("ChkSum: %s\n", chksum);
printf("File: %s\n", pad_filename); printf("File: %s\n", pad_filename);
double size_gb = (double)st.st_size / (1024.0 * 1024.0 * 1024.0); double size_gb = (double)st.st_size / (1000.0 * 1000.0 * 1000.0);
double used_gb = (double)used_bytes / (1024.0 * 1024.0 * 1024.0); double used_gb = (double)used_bytes / (1000.0 * 1000.0 * 1000.0);
double remaining_gb = (double)(st.st_size - used_bytes) / (1024.0 * 1024.0 * 1024.0); double remaining_gb = (double)(st.st_size - used_bytes) / (1000.0 * 1000.0 * 1000.0);
printf("Total size: %.2f GB (%lu bytes)\n", size_gb, st.st_size); printf("Total size: %.2f GB (%lu bytes)\n", size_gb, st.st_size);
printf("Used: %.2f GB (%lu bytes)\n", used_gb, used_bytes); printf("Used: %.2f GB (%lu bytes)\n", used_gb, used_bytes);
@@ -1017,7 +1088,7 @@ int handle_delete_pad(const char* chksum) {
uint64_t used_bytes; uint64_t used_bytes;
read_state_offset(chksum, &used_bytes); read_state_offset(chksum, &used_bytes);
double size_gb = (double)st.st_size / (1024.0 * 1024.0 * 1024.0); double size_gb = (double)st.st_size / (1000.0 * 1000.0 * 1000.0);
printf("\nPad to delete:\n"); printf("\nPad to delete:\n");
printf("Checksum: %s\n", chksum); printf("Checksum: %s\n", chksum);
printf("Size: %.2f GB\n", size_gb); printf("Size: %.2f GB\n", size_gb);
@@ -1205,7 +1276,7 @@ int handle_add_entropy_to_pad(const char* pad_chksum) {
target_bytes = (size_t)pad_stat.st_size; target_bytes = (size_t)pad_stat.st_size;
printf("\nHardware RNG selected - will enhance entire pad with hardware entropy\n"); printf("\nHardware RNG selected - will enhance entire pad with hardware entropy\n");
printf("Pad size: %.2f GB (%zu bytes)\n", printf("Pad size: %.2f GB (%zu bytes)\n",
(double)target_bytes / (1024.0 * 1024.0 * 1024.0), target_bytes); (double)target_bytes / (1000.0 * 1000.0 * 1000.0), target_bytes);
} else if (entropy_source == ENTROPY_SOURCE_FILE) { } else if (entropy_source == ENTROPY_SOURCE_FILE) {
// Special handling for file entropy - ask for file path first // Special handling for file entropy - ask for file path first
char file_path[512]; char file_path[512];
@@ -1227,7 +1298,7 @@ int handle_add_entropy_to_pad(const char* pad_chksum) {
printf("\nFile vs Pad Size Analysis:\n"); printf("\nFile vs Pad Size Analysis:\n");
printf(" Entropy file: %zu bytes\n", file_size); printf(" Entropy file: %zu bytes\n", file_size);
printf(" Target pad: %.2f GB (%lu bytes)\n", printf(" Target pad: %.2f GB (%lu bytes)\n",
(double)pad_size / (1024.0 * 1024.0 * 1024.0), pad_size); (double)pad_size / (1000.0 * 1000.0 * 1000.0), pad_size);
// Smart method selection based on file size vs pad size // Smart method selection based on file size vs pad size
if (file_size >= pad_size) { if (file_size >= pad_size) {
@@ -1411,10 +1482,10 @@ int handle_add_entropy_to_pad(const char* pad_chksum) {
printf("✓ Device test successful!\n"); printf("✓ Device test successful!\n");
printf(" Test collected: %zu bytes in %.1f seconds\n", test_collected, test_time); printf(" Test collected: %zu bytes in %.1f seconds\n", test_collected, test_time);
printf(" Speed: %.1f KB/s (%.1f MB/s)\n", bytes_per_second / 1024.0, bytes_per_second / (1024.0 * 1024.0)); printf(" Speed: %.1f KB/s (%.1f MB/s)\n", bytes_per_second / 1000.0, bytes_per_second / (1000.0 * 1000.0));
printf("\nPad enhancement estimate:\n"); printf("\nPad enhancement estimate:\n");
printf(" Pad size: %.2f GB (%zu bytes)\n", (double)target_bytes / (1024.0 * 1024.0 * 1024.0), target_bytes); printf(" Pad size: %.2f GB (%zu bytes)\n", (double)target_bytes / (1000.0 * 1000.0 * 1000.0), target_bytes);
if (estimated_hours >= 1.0) { if (estimated_hours >= 1.0) {
printf(" Estimated time: %.1f hours\n", estimated_hours); printf(" Estimated time: %.1f hours\n", estimated_hours);

View File

@@ -153,7 +153,7 @@ int collect_truerng_entropy_streaming_from_device(const hardware_rng_device_t* d
if (display_progress) { if (display_progress) {
printf("Streaming entropy from %s to pad...\n", device->friendly_name); printf("Streaming entropy from %s to pad...\n", device->friendly_name);
printf("Pad size: %.2f GB (%lu bytes)\n", (double)pad_size / (1024.0*1024.0*1024.0), pad_size); printf("Pad size: %.2f GB (%lu bytes)\n", (double)pad_size / (1000.0*1000.0*1000.0), pad_size);
printf("Enhancing entire pad with hardware entropy\n"); printf("Enhancing entire pad with hardware entropy\n");
} }

View File

@@ -152,7 +152,7 @@ int handle_generate_menu(void) {
return 1; return 1;
} }
double size_gb = (double)size / (1024.0 * 1024.0 * 1024.0); double size_gb = (double)size / (1000.0 * 1000.0 * 1000.0);
printf("Generating %.2f GB pad...\n", size_gb); printf("Generating %.2f GB pad...\n", size_gb);
printf("Note: Use 'Add entropy' in Pads menu to enhance randomness after creation.\n"); printf("Note: Use 'Add entropy' in Pads menu to enhance randomness after creation.\n");

View File

@@ -519,13 +519,13 @@ uint64_t parse_size_string(const char* size_str) {
} }
if (strcmp(unit, "K") == 0 || strcmp(unit, "KB") == 0) { if (strcmp(unit, "K") == 0 || strcmp(unit, "KB") == 0) {
multiplier = 1024ULL; multiplier = 1000ULL;
} else if (strcmp(unit, "M") == 0 || strcmp(unit, "MB") == 0) { } else if (strcmp(unit, "M") == 0 || strcmp(unit, "MB") == 0) {
multiplier = 1024ULL * 1024ULL; multiplier = 1000ULL * 1000ULL;
} else if (strcmp(unit, "G") == 0 || strcmp(unit, "GB") == 0) { } else if (strcmp(unit, "G") == 0 || strcmp(unit, "GB") == 0) {
multiplier = 1024ULL * 1024ULL * 1024ULL; multiplier = 1000ULL * 1000ULL * 1000ULL;
} else if (strcmp(unit, "T") == 0 || strcmp(unit, "TB") == 0) { } else if (strcmp(unit, "T") == 0 || strcmp(unit, "TB") == 0) {
multiplier = 1024ULL * 1024ULL * 1024ULL * 1024ULL; multiplier = 1000ULL * 1000ULL * 1000ULL * 1000ULL;
} else { } else {
return 0; // Invalid unit return 0; // Invalid unit
} }