Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 4bd0c5aa42 | |||
| dffae799aa | |||
| ed9fb759db | |||
| 2c7f16ce51 | |||
| 6251aa5be8 |
@@ -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
|
|
||||||
3
TODO.md
3
TODO.md
@@ -1,3 +0,0 @@
|
|||||||
# TODO
|
|
||||||
|
|
||||||
## The pad menu in interactive encrypt mode gives numbers instead of checksum selection
|
|
||||||
8
build.sh
8
build.sh
@@ -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"
|
||||||
|
|||||||
1
debug.c
1
debug.c
@@ -1 +0,0 @@
|
|||||||
int main() { printf("Testing direct filename: %d\n", strncmp("97d9d82b5414a9439102f3811fb90ab1d6368a00d33229a18b306476f9d04f82.pad", "97", 2)); return 0; }
|
|
||||||
@@ -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.*
|
|
||||||
@@ -5,7 +5,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include "otp.h"
|
#include "main.h"
|
||||||
|
|
||||||
#define PROGRESS_UPDATE_INTERVAL (64 * 1024 * 1024) // 64MB intervals
|
#define PROGRESS_UPDATE_INTERVAL (64 * 1024 * 1024) // 64MB intervals
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include "nostr_chacha20.h"
|
#include "nostr_chacha20.h"
|
||||||
#include "otp.h"
|
#include "main.h"
|
||||||
|
|
||||||
|
|
||||||
// In-place pad entropy addition using Chacha20 or direct XOR
|
// In-place pad entropy addition using Chacha20 or direct XOR
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
#include <termios.h>
|
#include <termios.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include "otp.h"
|
#include "main.h"
|
||||||
|
|
||||||
int main(int argc, char* argv[]) {
|
int main(int argc, char* argv[]) {
|
||||||
// Initialize terminal dimensions first
|
// Initialize terminal dimensions first
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
#ifndef OTP_H
|
#ifndef MAIN_H
|
||||||
#define OTP_H
|
#define MAIN_H
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// OTP CIPHER - FUNCTION PROTOTYPES HEADER
|
// OTP CIPHER - MAIN HEADER FILE
|
||||||
// One Time Pad Implementation v0.2.109
|
// One Time Pad Implementation v0.2.109
|
||||||
//
|
//
|
||||||
// This header file contains all function prototypes extracted from otp.c
|
// This header file contains all function prototypes and type definitions
|
||||||
// Organized by functional categories for better maintainability
|
// for the OTP Cipher project
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -335,4 +335,4 @@ char* select_pad_interactive(const char* title, const char* prompt, pad_filter_t
|
|||||||
// Help and usage display
|
// Help and usage display
|
||||||
void print_usage(const char* program_name);
|
void print_usage(const char* program_name);
|
||||||
|
|
||||||
#endif // OTP_H
|
#endif // MAIN_H
|
||||||
35
src/otp.c
35
src/otp.c
@@ -1,35 +0,0 @@
|
|||||||
#define _POSIX_C_SOURCE 200809L
|
|
||||||
#define _DEFAULT_SOURCE
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <sys/statvfs.h>
|
|
||||||
#include <sys/ioctl.h>
|
|
||||||
#include <dirent.h>
|
|
||||||
#include <time.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <termios.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include "nostr_chacha20.h"
|
|
||||||
#include "otp.h"
|
|
||||||
|
|
||||||
|
|
||||||
#define MAX_INPUT_SIZE 4096
|
|
||||||
#define MAX_LINE_LENGTH 1024
|
|
||||||
#define MAX_HASH_LENGTH 65
|
|
||||||
#define PROGRESS_UPDATE_INTERVAL (64 * 1024 * 1024) // 64MB intervals
|
|
||||||
#define DEFAULT_PADS_DIR "pads"
|
|
||||||
#define FILES_DIR "files"
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
// GLOBAL VARIABLES
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
char current_pads_dir[512] = DEFAULT_PADS_DIR;
|
|
||||||
40
src/pads.c
40
src/pads.c
@@ -16,7 +16,7 @@
|
|||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include "otp.h"
|
#include "main.h"
|
||||||
|
|
||||||
|
|
||||||
// Extracted pad management functions from otp.c
|
// Extracted pad management functions from otp.c
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "otp.h"
|
#include "main.h"
|
||||||
|
|
||||||
// Global state variables
|
// Global state variables
|
||||||
static char current_pads_dir[512] = DEFAULT_PADS_DIR;
|
static char current_pads_dir[512] = DEFAULT_PADS_DIR;
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include "nostr_chacha20.h"
|
#include "nostr_chacha20.h"
|
||||||
#include "otp.h"
|
#include "main.h"
|
||||||
|
|
||||||
// Basic TrueRNG entropy collection function
|
// Basic TrueRNG entropy collection function
|
||||||
int collect_truerng_entropy(unsigned char* entropy_buffer, size_t target_bytes, size_t* collected_bytes, int display_progress) {
|
int collect_truerng_entropy(unsigned char* entropy_buffer, size_t target_bytes, size_t* collected_bytes, int display_progress) {
|
||||||
|
|||||||
2
src/ui.c
2
src/ui.c
@@ -15,7 +15,7 @@
|
|||||||
#include <termios.h>
|
#include <termios.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include "otp.h"
|
#include "main.h"
|
||||||
|
|
||||||
// Initialize terminal dimensions
|
// Initialize terminal dimensions
|
||||||
void init_terminal_dimensions(void) {
|
void init_terminal_dimensions(void) {
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
#include <termios.h>
|
#include <termios.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include "otp.h"
|
#include "main.h"
|
||||||
|
|
||||||
// Global variables for preferences
|
// Global variables for preferences
|
||||||
static char default_pad_path[1024] = "";
|
static char default_pad_path[1024] = "";
|
||||||
|
|||||||
Reference in New Issue
Block a user