aboutsummaryrefslogtreecommitdiff
path: root/eim/sw
diff options
context:
space:
mode:
Diffstat (limited to 'eim/sw')
-rw-r--r--eim/sw/trng_extractor_eim.c40
1 files changed, 26 insertions, 14 deletions
diff --git a/eim/sw/trng_extractor_eim.c b/eim/sw/trng_extractor_eim.c
index e023c79..18fc1d6 100644
--- a/eim/sw/trng_extractor_eim.c
+++ b/eim/sw/trng_extractor_eim.c
@@ -38,6 +38,7 @@
#include <stdlib.h>
#include <unistd.h>
#include <stdint.h>
+#include <ctype.h>
#include "tc_eim.h"
#include "cryptech_memory_map.h"
@@ -47,8 +48,8 @@ char *usage =
\n\
-a avalanche entropy\n\
-r rosc entropy\n\
--c csprng\n\
--n number of 4-byte samples (defaults to 10)\n\
+-c csprng (default data source)\n\
+-n number of 4-byte samples (scale with K, M, or G suffix)\n\
-o output file (defaults to stdout)\n\
";
@@ -73,10 +74,13 @@ static int extract(off_t status_addr, off_t data_addr, uint32_t *data)
/* main */
int main(int argc, char *argv[])
{
- int i, opt, num_words = 10;
- uint32_t data;
- off_t status_addr = 0, data_addr = 0;
+ int i, opt;
+ unsigned long num_words = 1;
+ char *endptr;
+ off_t status_addr = CSPRNG_ADDR_STATUS;
+ off_t data_addr = CSPRNG_ADDR_RANDOM;
FILE *output = stdout;
+ uint32_t data;
/* parse command line */
while ((opt = getopt(argc, argv, "h?arcn:o:")) != -1) {
@@ -98,11 +102,23 @@ int main(int argc, char *argv[])
data_addr = CSPRNG_ADDR_RANDOM;
break;
case 'n':
- num_words = atoi(optarg);
- if (num_words <= 0) {
- fprintf(stderr, "-n requires a positive integer argument\n");
- 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+");
@@ -128,10 +144,6 @@ int main(int argc, char *argv[])
fprintf(stderr, "\n");
goto errout;
}
- if (status_addr == 0) {
- fprintf(stderr, "%s: a data source must be specified\n", argv[0]);
- goto errout;
- }
/* set up EIM */
if (eim_setup() != 0) {