diff options
Diffstat (limited to 'i2c/sw/trng_extractor_i2c.c')
-rw-r--r-- | i2c/sw/trng_extractor_i2c.c | 64 |
1 files changed, 27 insertions, 37 deletions
diff --git a/i2c/sw/trng_extractor_i2c.c b/i2c/sw/trng_extractor_i2c.c index 7b5b3b2..7b3c2ef 100644 --- a/i2c/sw/trng_extractor_i2c.c +++ b/i2c/sw/trng_extractor_i2c.c @@ -44,7 +44,7 @@ #include "cryptech_memory_map.h" char *usage = -"%s [-a|r|c] [-n #] [-o file] [-I I2C_device] [-A I2C_addr]\n\ +"%s [-a|r|c] [-n #] [-o file]\n\ \n\ -a avalanche entropy\n\ -r rosc entropy\n\ @@ -58,10 +58,18 @@ int debug = 0; /* for dump() */ /* extract one data sample */ static int extract(off_t status_addr, off_t data_addr, uint32_t *data) { +/* In theory, we should wait for "valid" before reading random + * data, but as long as this is running over I2C we're going to be so + * slow that there's no point, and checking would just make us slower. + */ +#define WAIT_FOR_TRNG_VALID 0 + +#if WAIT_FOR_TRNG_VALID if (tc_wait(status_addr, ENTROPY1_STATUS_VALID, NULL) != 0) { fprintf(stderr, "tc_wait failed\n"); return 1; } +#endif if (tc_read(data_addr, (uint8_t *)data, 4) != 0) { fprintf(stderr, "tc_read failed\n"); @@ -81,11 +89,9 @@ int main(int argc, char *argv[]) off_t data_addr = CSPRNG_ADDR_RANDOM; FILE *output = stdout; uint32_t data; - char *dev = I2C_dev; - int addr = I2C_addr; /* parse command line */ - while ((opt = getopt(argc, argv, "h?arcn:o:I:A:")) != -1) { + while ((opt = getopt(argc, argv, "h?arcn:o:")) != -1) { switch (opt) { case 'h': case '?': @@ -104,23 +110,23 @@ int main(int argc, char *argv[]) data_addr = CSPRNG_ADDR_RANDOM; break; case 'n': - num_words = strtoul(optarg, &endptr, 10); - switch (toupper(*endptr)) { - case '\0': - break; - case 'K': - num_words *= 1000; - break; - case 'M': - num_words *= 1000000; - break; - case 'G': - num_words *= 1000000000; - break; - default: - fprintf(stderr, "unsupported -n suffix %s\n", endptr); - return EXIT_FAILURE; - } + num_words = strtoul(optarg, &endptr, 10); + switch (toupper(*endptr)) { + case '\0': + break; + case 'K': + num_words *= 1000; + break; + case 'M': + num_words *= 1000000; + break; + case 'G': + num_words *= 1000000000; + break; + default: + fprintf(stderr, "unsupported -n suffix %s\n", endptr); + return EXIT_FAILURE; + } break; case 'o': output = fopen(optarg, "wb+"); @@ -130,16 +136,6 @@ int main(int argc, char *argv[]) return EXIT_FAILURE; } break; - case 'I': - dev = optarg; - break; - case 'A': - addr = (int)strtol(optarg, NULL, 0); - if ((addr < 0x03) || (addr > 0x77)) { - fprintf(stderr, "addr must be between 0x03 and 0x77\n"); - return 1; - } - break; default: errout: fprintf(stderr, usage, argv[0]); @@ -157,12 +153,6 @@ int main(int argc, char *argv[]) goto errout; } - /* set up I2C */ - if (i2c_open(dev, addr) != 0) { - fprintf(stderr, "I2C setup failed\n"); - return EXIT_FAILURE; - } - /* get the data */ for (i = 0; i < num_words; ++i) { if (extract(status_addr, data_addr, &data) != 0) |