diff --git a/software/infnoise.c b/software/infnoise.c index 25f5c97..4f99d48 100644 --- a/software/infnoise.c +++ b/software/infnoise.c @@ -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; } diff --git a/software/libinfnoise.c b/software/libinfnoise.c index 282da57..5e7a609 100644 --- a/software/libinfnoise.c +++ b/software/libinfnoise.c @@ -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; } } diff --git a/software/libinfnoise.h b/software/libinfnoise.h index bb882fb..a71076a 100644 --- a/software/libinfnoise.h +++ b/software/libinfnoise.h @@ -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); diff --git a/software/libinfnoise_private.h b/software/libinfnoise_private.h index 0120640..4171127 100644 --- a/software/libinfnoise_private.h +++ b/software/libinfnoise_private.h @@ -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);