Compare commits

...

4 Commits

8 changed files with 39 additions and 80 deletions

View File

@@ -1,46 +0,0 @@
# Hardware RNG Implementation Status
## Overview
The OTP cipher application now includes comprehensive hardware Random Number Generator (RNG) device support with automatic detection, device identification, and graceful handling of different device types.
## Supported Devices
### ✅ Fully Supported (TrueRNG Family)
- **TrueRNG Original** (VID: 04d8, PID: f5fe)
- **TrueRNG Pro** (VID: 04d8, PID: 0aa0)
- **TrueRNG Pro V2** (VID: 04d8, PID: ebb5)
These devices work via serial port communication and are fully integrated into the entropy collection system.
### ⚠️ Detected but Not Supported (SwiftRNG Family)
- **SwiftRNG** (VID: 1fc9, PID: 8111)
SwiftRNG devices are detected and identified but cannot be used via serial port communication. They require the official SwiftRNG API with libusb-1.0 integration.
## Implementation Features
### Device Detection
- **Automatic scanning** of `/dev/ttyUSB*` and `/dev/ttyACM*` devices
- **VID/PID identification** via sysfs to distinguish device types
- **Multi-device support** with interactive selection menus
- **Real-time status indicators** showing device availability
### Device Communication
- **Optimized serial port configuration** for each device type
- **Timeout protection** to prevent hanging on unresponsive devices
- **Error handling** with clear diagnostic messages
- **Progress tracking** with speed estimation for large entropy collections
### Integration Points
- **Pad enhancement** via entropy addition to existing pads
- **Interactive menus** for device selection when multiple devices are present
- **Command-line support** for automated workflows
- **Graceful fallback** to other entropy sources when no hardware RNG is available
## Technical Implementation
### Core Functions
- `detect_all_hardware_rng_devices()` - Scans and identifies all connected devices
- `collect_truerng_entropy_from_device()` - Collects entropy from TrueRNG devices

View File

@@ -1,3 +0,0 @@
# TODO
## The pad menu in interactive encrypt mode gives numbers instead of checksum selection

View File

@@ -269,7 +269,6 @@ build_project() {
else else
# Build both architectures # Build both architectures
print_status "Building OTP project for x86_64..." print_status "Building OTP project for x86_64..."
make clean
make CC=gcc ARCH=x86_64 make CC=gcc ARCH=x86_64
if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then
print_success "x86_64 build completed successfully" print_success "x86_64 build completed successfully"
@@ -279,7 +278,8 @@ build_project() {
fi fi
print_status "Building OTP project for ARM64/AArch64..." print_status "Building OTP project for ARM64/AArch64..."
make clean # Clean only object files, not the x86_64 binary
rm -f src/*.o
make CC=aarch64-linux-gnu-gcc ARCH=arm64 make CC=aarch64-linux-gnu-gcc ARCH=arm64
if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then
print_success "ARM64/AArch64 build completed successfully" print_success "ARM64/AArch64 build completed successfully"
@@ -289,6 +289,10 @@ build_project() {
fi fi
fi fi
# Clean up object files after successful build
print_status "Cleaning up object files..."
rm -f src/*.o
# Create Gitea release with binaries # Create Gitea release with binaries
if [ -f "$HOME/.gitea_token" ]; then if [ -f "$HOME/.gitea_token" ]; then
create_gitea_release "$NEW_VERSION" create_gitea_release "$NEW_VERSION"

BIN
debug

Binary file not shown.

View File

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

View File

@@ -1,22 +0,0 @@
#!/bin/bash
echo "Manual OTP Test"
echo "==============="
# Generate a test pad
echo "Generating test pad..."
./otp generate demo 1
echo
# Create a test message file for encryption
echo "Creating test message..."
echo "This is a secret message for testing OTP encryption!" > test_message.txt
# Test encryption interactively
echo "Testing encryption (will prompt for input):"
echo "Please enter: This is a secret message for testing OTP encryption!"
./otp encrypt demo
echo
echo "Files created:"
ls -la demo.*

1
otp Symbolic link
View File

@@ -0,0 +1 @@
./build/otp-x86_64

View File

@@ -89,7 +89,10 @@ 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) {
uint64_t available_bytes = stat.f_bavail * stat.f_frsize; // Use f_bfree (total free blocks) instead of f_bavail (available to non-root)
// This gives the actual free space on the filesystem, which is more accurate
// for removable media and user-owned directories
uint64_t available_bytes = stat.f_bfree * stat.f_frsize;
double available_gb = (double)available_bytes / (1024.0 * 1024.0 * 1024.0); double available_gb = (double)available_bytes / (1024.0 * 1024.0 * 1024.0);
double required_gb = (double)size_bytes / (1024.0 * 1024.0 * 1024.0); double required_gb = (double)size_bytes / (1024.0 * 1024.0 * 1024.0);
@@ -233,19 +236,41 @@ int read_state_offset(const char* pad_chksum, uint64_t* offset) {
const char* pads_dir = get_current_pads_dir(); const char* pads_dir = get_current_pads_dir();
snprintf(state_filename, sizeof(state_filename), "%s/%s.state", pads_dir, pad_chksum); snprintf(state_filename, sizeof(state_filename), "%s/%s.state", pads_dir, pad_chksum);
FILE* state_file = fopen(state_filename, "rb"); FILE* state_file = fopen(state_filename, "r");
if (!state_file) { if (!state_file) {
*offset = 0; *offset = 0;
return 0; return 0;
} }
if (fread(offset, sizeof(uint64_t), 1, state_file) != 1) { // Try to read as text format first (new format)
char line[128];
if (fgets(line, sizeof(line), state_file)) {
// Check if it's text format (starts with "offset=")
if (strncmp(line, "offset=", 7) == 0) {
*offset = strtoull(line + 7, NULL, 10);
fclose(state_file);
return 0;
}
// Not text format, try binary format (legacy)
fclose(state_file);
state_file = fopen(state_filename, "rb");
if (!state_file) {
*offset = 0;
return 0;
}
if (fread(offset, sizeof(uint64_t), 1, state_file) != 1) {
fclose(state_file);
*offset = 0;
return 0;
}
fclose(state_file); fclose(state_file);
*offset = 0;
return 0; return 0;
} }
fclose(state_file); fclose(state_file);
*offset = 0;
return 0; return 0;
} }
@@ -254,12 +279,13 @@ int write_state_offset(const char* pad_chksum, uint64_t offset) {
const char* pads_dir = get_current_pads_dir(); const char* pads_dir = get_current_pads_dir();
snprintf(state_filename, sizeof(state_filename), "%s/%s.state", pads_dir, pad_chksum); snprintf(state_filename, sizeof(state_filename), "%s/%s.state", pads_dir, pad_chksum);
FILE* state_file = fopen(state_filename, "wb"); FILE* state_file = fopen(state_filename, "w");
if (!state_file) { if (!state_file) {
return 1; return 1;
} }
if (fwrite(&offset, sizeof(uint64_t), 1, state_file) != 1) { // Write in text format for human readability
if (fprintf(state_file, "offset=%lu\n", offset) < 0) {
fclose(state_file); fclose(state_file);
return 1; return 1;
} }