instroduce infnoise_context struct

This commit is contained in:
Manuel Domke
2018-07-24 09:50:26 +02:00
parent f0b407b9c5
commit 7b1f6a7965
5 changed files with 58 additions and 47 deletions

View File

@@ -95,7 +95,8 @@ bool outputBytes(uint8_t *bytes, uint32_t length, uint32_t entropy, bool writeDe
}
int main(int argc, char **argv) {
struct ftdi_context ftdic;
//struct ftdi_context ftdic;
struct infnoise_context context;
struct opt_struct opts;
int ch;
bool multiplierAssigned = false;
@@ -224,7 +225,7 @@ int main(int argc, char **argv) {
char *message = "no data?";
bool errorFlag = false;
if (opts.listDevices) {
if (!listUSBDevices(&ftdic, &message)) {
if (!listUSBDevices(&message)) {
fputs(message, stderr);
return 1;
}
@@ -254,9 +255,10 @@ int main(int argc, char **argv) {
// Optionally run in the background and optionally write a PID-file
startDaemon(&opts);
// initialize USB device, health check and Keccak state (see libinfnoise)
if (!initInfnoise(&ftdic, opts.serial, &message, !opts.raw, opts.debug)) {
fprintf(stderr, "Error: %s\n", message);
if (!initInfnoise(&context, opts.serial, !opts.raw, opts.debug)) {
fprintf(stderr, "Error: %s\n", context.message);
return 1; // ERROR
}
@@ -276,9 +278,9 @@ int main(int argc, char **argv) {
uint64_t prevTotalBytesWritten = totalBytesWritten;
if (opts.raw) {
totalBytesWritten += readRawData(&ftdic, result, &message, &errorFlag);
totalBytesWritten += readRawData(&context, result);
} else {
totalBytesWritten += readData(&ftdic, result, &message, &errorFlag, opts.outputMultiplier);
totalBytesWritten += readData(&context, result, opts.outputMultiplier);
}
if (errorFlag) {
@@ -287,7 +289,8 @@ int main(int argc, char **argv) {
}
if (!opts.noOutput) { // TODO: pass entropy, so we know how much to write to /dev/random. For testing, use 64 instead of 0.
outputBytes(result, totalBytesWritten - prevTotalBytesWritten, 0, opts.devRandom, &message);
//(next step: use entropyBytes from context struct)
outputBytes(result, totalBytesWritten - prevTotalBytesWritten, 0, opts.devRandom, &message);
}
if (opts.debug && (1u << 20u)*(totalBytesWritten / (1u << 20u)) > (1u << 20u)*(prevTotalBytesWritten / (1u << 20u))) {

View File

@@ -24,6 +24,7 @@ struct opt_struct {
char *serial; // Name of selected device
};
void inmWriteEntropyStart(uint32_t bufLen, bool debug);
void inmWriteEntropyToPool(uint8_t *bytes, uint32_t length, uint32_t entropy);
void inmWaitForPoolToHaveRoom(void);

View File

@@ -16,7 +16,6 @@
#include <sys/types.h>
#include <ftdi.h>
#include "libinfnoise_private.h"
#include "libinfnoise.h"
#include "KeccakF-1600-interface.h"
#if defined(__OpenBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(__FreeBSD__)
@@ -25,19 +24,19 @@
uint8_t keccakState[KeccakPermutationSizeInBytes];
bool initInfnoise(struct ftdi_context *ftdic, char *serial, char **message, bool keccak, bool debug) {
bool initInfnoise(struct infnoise_context *context, char *serial, bool keccak, bool debug) {
prepareOutputBuffer();
// initialize health check
if (!inmHealthCheckStart(PREDICTION_BITS, DESIGN_K, debug)) {
*message = "Can't initialize health checker";
context->message = "Can't initialize health checker";
return false;
}
// initialize USB
if (!initializeUSB(ftdic, message, serial)) {
if (!initializeUSB(&context->ftdic, &context->message, serial)) {
// Sometimes have to do it twice - not sure why
if (!initializeUSB(ftdic, message, serial)) {
if (!initializeUSB(&context->ftdic, &context->message, serial)) {
return false;
}
}
@@ -51,14 +50,14 @@ bool initInfnoise(struct ftdi_context *ftdic, char *serial, char **message, bool
// let healthcheck collect some data
uint32_t maxWarmupRounds = 500;
uint32_t warmupRounds = 0;
bool errorFlag = false;
//bool errorFlag = false;
while (!inmHealthCheckOkToUseData()) {
readRawData(ftdic, NULL, message, &errorFlag);
readRawData(context, NULL);
warmupRounds++;
}
if (warmupRounds > maxWarmupRounds) {
*message = "Unable to collect enough entropy to initialize health checker.";
context->message = "Unable to collect enough entropy to initialize health checker.";
return false;
}
return true;
@@ -201,8 +200,10 @@ bool isSuperUser(void) {
// Return a list of all infinite noise multipliers found.
bool listUSBDevices(struct ftdi_context *ftdic, char** message) {
ftdi_init(ftdic);
bool listUSBDevices(char** message) {
struct ftdi_context ftdic;
ftdi_init(&ftdic);
struct ftdi_device_list *devlist;
struct ftdi_device_list *curdev;
@@ -210,7 +211,7 @@ bool listUSBDevices(struct ftdi_context *ftdic, char** message) {
int i = 0;
// search devices
int rc = ftdi_usb_find_all(ftdic, &devlist, INFNOISE_VENDOR_ID, INFNOISE_PRODUCT_ID);
int rc = ftdi_usb_find_all(&ftdic, &devlist, INFNOISE_VENDOR_ID, INFNOISE_PRODUCT_ID);
if (rc < 0) {
if (!isSuperUser()) {
@@ -222,7 +223,7 @@ bool listUSBDevices(struct ftdi_context *ftdic, char** message) {
for (curdev = devlist; curdev != NULL; i++) {
//printf("Device: %d, ", i);
rc = ftdi_usb_get_strings(ftdic, curdev->dev, manufacturer, 128, description, 128, serial, 128);
rc = ftdi_usb_get_strings(&ftdic, curdev->dev, manufacturer, 128, description, 128, serial, 128);
if (rc < 0) {
if (!isSuperUser()) {
*message = "Can't find Infinite Noise Multiplier. Try running as super user?";
@@ -242,7 +243,7 @@ bool listUSBDevices(struct ftdi_context *ftdic, char** message) {
// Initialize the Infinite Noise Multiplier USB interface.
bool initializeUSB(struct ftdi_context *ftdic, char **message, char *serial) {
bool initializeUSB(struct ftdi_context *ftdic, char **message,char *serial) {
ftdi_init(ftdic);
struct ftdi_device_list *devlist;
@@ -322,21 +323,21 @@ bool initializeUSB(struct ftdi_context *ftdic, char **message, char *serial) {
return true;
}
uint32_t readRawData(struct ftdi_context *ftdic, uint8_t *result, char **message, bool *errorFlag) {
uint32_t readRawData(struct infnoise_context *context, uint8_t *result) {
uint8_t inBuf[BUFLEN];
struct timespec start;
clock_gettime(CLOCK_REALTIME, &start);
// write clock signal
if (ftdi_write_data(ftdic, outBuf, BUFLEN) != BUFLEN) {
*message = "USB write failed";
*errorFlag = true;
if (ftdi_write_data(&context->ftdic, outBuf, BUFLEN) != BUFLEN) {
context->message = "USB write failed";
context->errorFlag = true;
}
// and read 512 byte from the internal buffer (in synchronous bitbang mode)
if (ftdi_read_data(ftdic, inBuf, BUFLEN) != BUFLEN) {
*message = "USB read failed";
*errorFlag = true;
if (ftdi_read_data(&context->ftdic, inBuf, BUFLEN) != BUFLEN) {
context->message = "USB read failed";
context->errorFlag = true;
}
struct timespec end;
@@ -344,32 +345,32 @@ uint32_t readRawData(struct ftdi_context *ftdic, uint8_t *result, char **message
uint32_t us = diffTime(&start, &end);
if (us <= MAX_MICROSEC_FOR_SAMPLES) {
uint8_t bytes[BUFLEN / 8u];
uint32_t entropy = extractBytes(bytes, inBuf, message, errorFlag);
uint32_t entropy = extractBytes(bytes, inBuf, &context->message, &context->errorFlag);
// call health check and process bytes if OK
if (inmHealthCheckOkToUseData() && inmEntropyOnTarget(entropy, BUFLEN)) {
uint32_t byteswritten = processBytes(bytes, result, entropy, true, 0, message, errorFlag);
uint32_t byteswritten = processBytes(bytes, result, entropy, true, 0, &context->message, &context->errorFlag);
return byteswritten;
}
}
return 0;
}
uint32_t readData(struct ftdi_context *ftdic, uint8_t *result, char **message, bool *errorFlag, uint32_t outputMultiplier) {
uint32_t readData(struct infnoise_context *context, uint8_t *result, uint32_t outputMultiplier) {
uint8_t inBuf[BUFLEN];
struct timespec start;
clock_gettime(CLOCK_REALTIME, &start);
// write clock signal
if (ftdi_write_data(ftdic, outBuf, BUFLEN) != BUFLEN) {
*message = "USB write failed";
*errorFlag = true;
if (ftdi_write_data(&context->ftdic, outBuf, BUFLEN) != BUFLEN) {
context->message = "USB write failed";
context->errorFlag = true;
}
// and read 512 byte from the internal buffer (in synchronous bitbang mode)
if (ftdi_read_data(ftdic, inBuf, BUFLEN) != BUFLEN) {
*message = "USB read failed";
*errorFlag = true;
if (ftdi_read_data(&context->ftdic, inBuf, BUFLEN) != BUFLEN) {
context->message = "USB read failed";
context->errorFlag = true;
}
struct timespec end;
@@ -377,11 +378,11 @@ uint32_t readData(struct ftdi_context *ftdic, uint8_t *result, char **message, b
uint32_t us = diffTime(&start, &end);
if (us <= MAX_MICROSEC_FOR_SAMPLES) {
uint8_t bytes[BUFLEN / 8u];
uint32_t entropy = extractBytes(bytes, inBuf, message, errorFlag);
uint32_t entropy = extractBytes(bytes, inBuf, &context->message, &context->errorFlag);
// call health check and process bytes if OK
if (inmHealthCheckOkToUseData() && inmEntropyOnTarget(entropy, BUFLEN)) {
uint32_t byteswritten = processBytes(bytes, result, entropy, false, outputMultiplier, message, errorFlag);
uint32_t byteswritten = processBytes(bytes, result, entropy, false, outputMultiplier, &context->message, &context->errorFlag);
return byteswritten;
}
}

View File

@@ -13,10 +13,18 @@
// We also write this in one go to the Keccak sponge, which is at most 1600 bits
#define BUFLEN 512u
bool listUSBDevices(struct ftdi_context *ftdic, char **message);
struct infnoise_context {
struct ftdi_context ftdic;
uint32_t entropyBytes;
char *message;
bool errorFlag;
//uint8_t keccakState[KeccakPermutationSizeInBytes];
} ;
bool initInfnoise(struct ftdi_context *ftdic, char *serial, char **message, bool keccak, bool debug);
bool listUSBDevices(char** message);
uint32_t readRawData(struct ftdi_context *ftdic, uint8_t *result, char **message, bool *errorFlag);
bool initInfnoise(struct infnoise_context *context, char *serial, bool keccak, bool debug);
uint32_t readData(struct ftdi_context *ftdic, uint8_t *result, char **message, bool *errorFlag, uint32_t outputMultiplier);
uint32_t readRawData(struct infnoise_context *context, uint8_t *result);
uint32_t readData(struct infnoise_context *context, uint8_t *result, uint32_t outputMultiplier);

View File

@@ -8,7 +8,7 @@
#endif
#include <ftdi.h>
#include <time.h>
#include "libinfnoise.h"
#define INFNOISE_VENDOR_ID 0x0403
#define INFNOISE_PRODUCT_ID 0x6015
@@ -37,8 +37,6 @@
// All data bus bits of the FT240X are outputs, except COMP1 and COMP2
#define MASK (0xffu & ~(1u << COMP1) & ~(1u << COMP2))
bool inmHealthCheckStart(uint8_t N, double K, bool debug);
void inmHealthCheckStop(void);
bool inmHealthCheckAddBit(bool evenBit, bool oddBit, bool even);
@@ -53,7 +51,7 @@ void inmDumpStats(void);
extern double inmK, inmExpectedEntropyPerBit;
bool initializeUSB(struct ftdi_context *ftdic, char **message, char *serial);
bool initializeUSB(struct ftdi_context *ftdic, char **message,char *serial);
void prepareOutputBuffer();
struct timespec;
@@ -65,4 +63,4 @@ bool outputBytes(uint8_t *bytes, uint32_t length, uint32_t entropy, bool writeDe
uint32_t processBytes(uint8_t *bytes, uint8_t *result, uint32_t entropy, bool raw,
uint32_t outputMultiplier, char **message, bool *errorFlag);
uint32_t readData_private(struct ftdi_context *ftdic, uint8_t *result, char **message, bool *errorFlag, bool noOutput, bool raw, uint32_t outputMultiplier, bool devRandom);
//uint32_t readData_private(struct infnoise_context *context, uint8_t *result, char **message, bool *errorFlag, bool noOutput, bool raw, uint32_t outputMultiplier, bool devRandom);