error messages / no (or less?) stderr in lib functions

This commit is contained in:
Manuel Domke
2018-04-19 01:38:28 +02:00
parent 4a14cd7e82
commit 4825a7bcab
4 changed files with 57 additions and 57 deletions

View File

@@ -153,17 +153,20 @@ int main(int argc, char **argv)
struct inm_devlist *device_list;
device_list = malloc(sizeof(struct inm_devlist));
if(!listUSBDevices(&ftdic, &device_list, &message)) {
if(!listUSBDevices(&ftdic, device_list, &message)) {
fputs(message, stderr);
return 1;
}
// debug:
uint8_t i=0;
struct inm_devlist_node *tmp;
for ( tmp = device_list->head; tmp != NULL; tmp=tmp->next) {
if (tmp->device->serial != NULL) {
printf("%s\n", tmp->device->serial);
}
//tmp = tmp->next;
printf("%d\n", i);
i+=1;
}
return 0;
}
@@ -177,7 +180,8 @@ int main(int argc, char **argv)
startDaemon(&opts);
// initialize USB device and health check
if (initInfnoise(&ftdic, opts.serial, opts.debug) != true) {
if (initInfnoise(&ftdic, opts.serial, &message, opts.debug) != true) {
fputs(message, stderr);
return 1; // ERROR (message still goes to stderr)
}
@@ -190,18 +194,17 @@ int main(int argc, char **argv)
uint64_t totalBytesWritten = 0u;
while(true) {
uint64_t prevTotalBytesWritten = totalBytesWritten;
uint64_t bytesWritten = readData1(&ftdic, keccakState, result, opts.noOutput, opts.raw, opts.outputMultiplier, opts.devRandom);
//printf("%d", (uint8_t)opts.noOutput);
if (totalBytesWritten == (unsigned long)-1) {
return 1; // ERROR (message goes to stderr)
}
totalBytesWritten += bytesWritten;
if(opts.debug && (1u << 20u)*(totalBytesWritten/(1u << 20u)) > (1u << 20u)*(prevTotalBytesWritten/(1u << 20u))) {
fprintf(stderr, "Output %lu bytes\n", (unsigned long)totalBytesWritten);
}
uint64_t prevTotalBytesWritten = totalBytesWritten;
uint64_t bytesWritten = readData_private(&ftdic, keccakState, result, &message, opts.noOutput, opts.raw, opts.outputMultiplier, opts.devRandom); // calling libinfnoise's private readData method
if (totalBytesWritten == (unsigned long)-1) {
fputs(message, stderr);
return 1;
}
totalBytesWritten += bytesWritten;
if(opts.debug && (1u << 20u)*(totalBytesWritten/(1u << 20u)) > (1u << 20u)*(prevTotalBytesWritten/(1u << 20u))) {
fprintf(stderr, "Output %lu bytes\n", (unsigned long)totalBytesWritten);
}
}
return 0;
}

View File

@@ -130,8 +130,8 @@ uint32_t processBytes(uint8_t *keccakState, uint8_t *bytes, uint8_t *result, uin
} else {
// append data in result array until we have finished squeezing the keccak sponge
// its important to have an result array of the approriate size: outputMultiplier*32
fprintf(stderr, "bytes written: %d\n", bytesWritten);
fprintf(stderr, "bytes to write: %d\n", bytesToWrite);
//fprintf(stderr, "bytes written: %d\n", bytesWritten);
//fprintf(stderr, "bytes to write: %d\n", bytesToWrite);
//memcpy(result + bytesWritten, dataOut, bytesToWrite * sizeof(uint8_t)); //doesn't work
// alternative: loop through dataOut and append array elements to result..
@@ -154,20 +154,20 @@ uint32_t processBytes(uint8_t *keccakState, uint8_t *bytes, uint8_t *result, uin
fprintf(stderr, "bytes written: %d\n", bytesWritten);
return bytesWritten;
}
void add_to_list(struct inm_devlist **list, struct infnoise_device **dev) {
void add_to_list(struct inm_devlist *list, struct infnoise_device **dev) {
struct inm_devlist_node *tmp = malloc(sizeof(struct inm_devlist_node ) );
tmp->device = (*dev);
printf("added serial1: %s\n", (*dev)->serial);
tmp->next = (*list)->head;
tmp->next = list->head;
printf("added serial2: %s\n", tmp->device->serial);
(*list)->head = tmp;
printf("added serial3: %s\n", (*list)->head->device->serial);
list->head = tmp;
printf("added serial3: %s\n", list->head->device->serial);
}
// Return a list of all infinite noise multipliers found.
bool listUSBDevices(struct ftdi_context *ftdic, struct inm_devlist **result, char** message) {
bool listUSBDevices(struct ftdi_context *ftdic, struct inm_devlist *result, char** message) {
ftdi_init(ftdic);
struct ftdi_device_list *devlist;
@@ -211,22 +211,14 @@ bool listUSBDevices(struct ftdi_context *ftdic, struct inm_devlist **result, cha
add_to_list(result, &result_dev);
struct inm_devlist_node *tmp;
for ( tmp = (*result)->head; tmp != NULL; tmp=tmp->next) {
for ( tmp = result->head; tmp != NULL; tmp=tmp->next) {
if (tmp->device->serial != NULL) {
printf("%s\n", tmp->device->serial);
}
//tmp = tmp->next;
}
curdev = curdev->next;
}
struct inm_devlist_node *tmp;
for ( tmp = (*result)->head; tmp != NULL; tmp=tmp->next) {
if (tmp->device->serial != NULL) {
printf("%s\n", tmp->device->serial);
}
//tmp = tmp->next;
}
return true;
}
@@ -307,35 +299,39 @@ bool initializeUSB(struct ftdi_context *ftdic, char **message, char *serial) {
}
uint64_t readRawData(struct ftdi_context *ftdic, uint8_t *result) {
return readData1(ftdic, NULL, result, false, true, 0, false);
uint64_t readRawData(struct ftdi_context *ftdic, uint8_t *result, char **message) {
return readData_private(ftdic, NULL, result, message, false, true, 0, false);
}
uint64_t readData(struct ftdi_context *ftdic, uint8_t *keccakState, uint8_t *result, uint32_t outputMultiplier) {
return readData1(ftdic, keccakState, result, false, false, outputMultiplier, false);
uint64_t readData(struct ftdi_context *ftdic, uint8_t *keccakState, uint8_t *result, char **message, uint32_t outputMultiplier) {
return readData_private(ftdic, keccakState, result, message, false, false, outputMultiplier, false);
}
uint64_t readData1(struct ftdi_context *ftdic, uint8_t *keccakState, uint8_t *result, bool noOutput, bool raw, uint32_t outputMultiplier, bool devRandom) {
// Endless loop: set SW1EN and SW2EN alternately
uint8_t outBuf[BUFLEN];
void prepareOutputBuffer() {
uint32_t i;
uint8_t outBuf[BUFLEN], inBuf[BUFLEN];
// Endless loop: set SW1EN and SW2EN alternately
for(i = 0u; i < BUFLEN; i++) {
// Alternate Ph1 and Ph2
outBuf[i] = i & 1? (1 << SWEN2) : (1 << SWEN1);
}
}
uint64_t readData_private(struct ftdi_context *ftdic, uint8_t *keccakState, uint8_t *result, char **message, bool noOutput, bool raw, uint32_t outputMultiplier, bool devRandom) {
uint8_t inBuf[BUFLEN];
uint64_t totalBytesWritten = 0u;
struct timespec start;
clock_gettime(CLOCK_REALTIME, &start);
// write clock signal
if(ftdi_write_data(ftdic, outBuf, BUFLEN) != BUFLEN) {
fputs("USB write failed\n", stderr);
*message = "USB write failed";
return -1;
}
// and read 512 byte from the internal buffer (in synchronous bitbang mode)
if(ftdi_read_data(ftdic, inBuf, BUFLEN) != BUFLEN) {
fputs("USB read failed\n", stderr);
*message = "USB read failed";
return -1;
}
@@ -354,22 +350,18 @@ uint64_t readData1(struct ftdi_context *ftdic, uint8_t *keccakState, uint8_t *re
return totalBytesWritten;
}
bool initInfnoise(struct ftdi_context *ftdic,char *serial, bool debug) {
//inmWriteEntropyStart(BUFLEN/8u, debug); // todo: create method in libinfnoise.h for this
bool initInfnoise(struct ftdi_context *ftdic,char *serial, char **message, bool debug) {
prepareOutputBuffer();
// initialize health check
if (!inmHealthCheckStart(PREDICTION_BITS, DESIGN_K, debug)) {
fputs("Can't initialize health checker\n", stderr);
*message="Can't initialize health checker";
return false;
}
// initialize USB
char *message;
if(!initializeUSB(ftdic, &message, serial)) {
if(!initializeUSB(ftdic, message, serial)) {
// Sometimes have to do it twice - not sure why
if(!initializeUSB(ftdic, &message, serial)) {
fputs(message, stderr);
if(!initializeUSB(ftdic, message, serial)) {
return false;
}
}

View File

@@ -35,14 +35,12 @@ struct infnoise_device_list {
struct infnoise_device_list * next;
};
bool listUSBDevices(struct ftdi_context *ftdic, struct inm_devlist **result, char **message);
bool listUSBDevices(struct ftdi_context *ftdic, struct inm_devlist *result, char **message);
bool initInfnoise(struct ftdi_context *ftdic, char *serial, bool debug);
bool initInfnoise(struct ftdi_context *ftdic, char *serial, char **message, bool debug);
bool initKeccak(struct ftdi_context *ftdic, char *serial);
uint64_t readRawData(struct ftdi_context *ftdic, uint8_t *result);
uint64_t readRawData(struct ftdi_context *ftdic, uint8_t *result, char **message);
uint64_t readData(struct ftdi_context *ftdic, uint8_t *keccakState, uint8_t *result, uint32_t outputMultiplier);
uint64_t readData1(struct ftdi_context *ftdic, uint8_t *keccakState, uint8_t *result, bool noOutput, bool raw, uint32_t outputMultiplier, bool devRandom);
uint64_t readData(struct ftdi_context *ftdic, uint8_t *keccakState, uint8_t *result, char **message, uint32_t outputMultiplier);

View File

@@ -32,6 +32,8 @@
// 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,5 +55,10 @@ double diffTime(struct timespec *start, struct timespec *end);
uint32_t extractBytes(uint8_t *bytes, uint8_t *inBuf);
void outputBytes(uint8_t *bytes, uint32_t length, uint32_t entropy, bool writeDevRandom);
uint32_t processBytes(uint8_t *keccakState, uint8_t *bytes, uint8_t *result, uint32_t entropy, bool raw,
bool writeDevRandom, uint32_t outputMultiplier, bool noOutput);
bool writeDevRandom, uint32_t outputMultiplier, bool noOutput);
uint64_t readData_private(struct ftdi_context *ftdic, uint8_t *keccakState, uint8_t *result, char **message,
bool noOutput, bool raw, uint32_t outputMultiplier, bool devRandom);
//void add_to_list(struct inm_devlist *list, struct infnoise_device *dev);