7f8bc98b4883ab398536b2b81734a4af9a56dee4
TrueRNG C Implementation
This is a C equivalent of the Python main.py script for reading data from TrueRNG devices.
Overview
The program reads random data from a TrueRNG device via serial port, counts the number of ones and zeros in the data, and provides flexible output options including multiple formats and size specifications.
Supported Devices
- TrueRNG (PID: 04D8, HID: F5FE)
- TrueRNGpro (PID: 16D0, HID: 0AA0)
- TrueRNGproV2 (PID: 04D8, HID: EBB5)
Requirements
- Linux system with termios support
- GCC compiler
- TrueRNG device connected via USB
- Appropriate permissions to access the serial device (may need root or proper udev rules)
Building
make
Or manually:
gcc -Wall -Wextra -std=c99 -O2 -o truerng main.c
Usage
Basic Usage
./truerng
Command Line Options
./truerng [OPTIONS]
Options:
-n, --bytes <N>- Number of bytes to generate (default: 1048576)- Supports size suffixes: K, MB, GB, TB (case-insensitive)
- Examples:
1024,1K,2.5MB,1GB,512k,1tb
-f, --format <FORMAT>- Output format: binary, hex, base64, decimal- Default: binary when piped, hex in interactive mode
-o, --output <FILE>- Output filename (works with all formats)-q, --quiet- Suppress statistics/progress output-v, --verbose- Show detailed device information-h, --help- Show help message
Size Suffixes
The -n option supports convenient size suffixes (case-insensitive):
- K or KB: Kilobytes (1024 bytes)
- M or MB: Megabytes (1,048,576 bytes)
- G or GB: Gigabytes (1,073,741,824 bytes)
- T or TB: Terabytes (1,099,511,627,776 bytes)
Decimal values are supported: 1.5MB, 2.5GB, etc.
Examples
# Basic usage - interactive mode with hex output
./truerng
# Generate 1KB of data in hex format
./truerng -n 1K -f hex
# Generate 2.5MB and pipe to another program
./truerng -n 2.5MB | xxd
# Save 1GB of binary data to file quietly
./truerng -n 1GB -o random.dat -q
# Generate 512KB as hex and save to file
./truerng -n 512K -f hex -o output.hex
# Generate base64 output with verbose device info
./truerng -n 1MB -f base64 -v
# Backward compatibility - plain numbers still work
./truerng -n 1048576 -f binary
Output Formats
- binary: Raw binary data (default for piped output)
- hex: Hexadecimal representation (default for interactive mode)
- base64: Base64 encoded output
- decimal: Decimal byte values
Modes
The program automatically detects the execution context:
- Interactive mode: Shows progress, statistics, and defaults to hex output
- Piped mode: Optimized for piping, defaults to binary output
- File output: Can be combined with any format using
-ooption
Configuration
You can modify the following constants in main.c:
BLOCKSIZE: Number of bytes to read per block (default: 1024)
Permissions
On Linux, you may need to set proper permissions for the serial device:
sudo chmod 666 /dev/ttyUSB0 # Replace with your device
Or add your user to the dialout group:
sudo usermod -a -G dialout $USER
Differences from Python Version
The C implementation:
- Uses native Linux serial port APIs instead of pyserial
- Implements USB device detection via sysfs
- Uses lookup tables for efficient bit counting
- Provides enhanced command line interface with size suffixes
- Supports multiple output formats (binary, hex, base64, decimal)
- Provides equivalent functionality with better performance
Sample Output
Interactive Mode
TrueRNG - True Random Number Generator
==================================================
TrueRNGproV2 Found
Using port: /dev/ttyACM0
Generating: 1024 bytes
Starting data collection...
1024/1024 Bytes Read at 504.19 Kbytes/s
Results
=======
Total time: 0.02 seconds
Total Ones: 4072
Total Zeros: 4120
Total Bits: 8192
Extra zeros: 48
=======
Piped Mode with Verbose
TrueRNG - True Random Number Generator
Mode: Piped (Verbose)
==================================================
TrueRNGproV2 Found
Using port: /dev/ttyACM0
Generating: 2048 bytes
Starting data collection...
2048/2048 Bytes Read at 462.17 Kbytes/s
Results
=======
Total time: 0.04 seconds
Total Ones: 8144
Total Zeros: 8248
Total Bits: 16392
Extra zeros: 104
=======
Quiet Mode
./truerng -n 1K -o data.bin -q
# No output - data saved silently to data.bin
Help Output
./truerng --help
TrueRNG - True Random Number Generator
Usage: truerng [OPTIONS]
Options:
-n, --bytes <N> Number of bytes to generate (default: 1048576)
Supports suffixes: K, MB, GB, TB (e.g., 1K, 2.5MB, 1GB)
-f, --format <FORMAT> Output format: binary, hex, base64, decimal (default: binary when piped, interactive otherwise)
-o, --output <FILE> Output filename (ignored in piped mode)
-q, --quiet Suppress statistics/progress
-v, --verbose Show detailed device information
-h, --help Show this help message
Examples:
truerng -n 1024 -f hex # Interactive mode with hex output
truerng -n 1K -f hex # Same as above using K suffix
truerng -n 2.5MB | xxd # Piped mode with MB suffix
truerng -n 1GB -o random.dat -q # Save 1GB to file quietly
truerng -n 512K -f hex -o output.hex # Save 512KB as hex to file
Description
Languages
C
85.7%
Python
13.4%
Makefile
0.9%