]> Git Repo - u-boot.git/blob - cmd/rng.c
Merge patch series "env: mmc: fix use of two separate partitions with proper type...
[u-boot.git] / cmd / rng.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * The 'rng' command prints bytes from the hardware random number generator.
4  *
5  * Copyright (c) 2019, Heinrich Schuchardt <[email protected]>
6  */
7 #include <command.h>
8 #include <dm.h>
9 #include <hexdump.h>
10 #include <malloc.h>
11 #include <rng.h>
12
13 static int do_rng(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
14 {
15         size_t n;
16         u8 buf[64];
17         int devnum;
18         struct udevice *dev;
19         int ret = CMD_RET_SUCCESS, err;
20
21         if (argc == 2 && !strcmp(argv[1], "list")) {
22                 int idx = 0;
23
24                 uclass_foreach_dev_probe(UCLASS_RNG, dev) {
25                         idx++;
26                         printf("RNG #%d - %s\n", dev->seq_, dev->name);
27                 }
28
29                 if (!idx) {
30                         log_err("No RNG device\n");
31                         return CMD_RET_FAILURE;
32                 }
33
34                 return CMD_RET_SUCCESS;
35         }
36
37         switch (argc) {
38         case 1:
39                 devnum = 0;
40                 n = 0x40;
41                 break;
42         case 2:
43                 devnum = hextoul(argv[1], NULL);
44                 n = 0x40;
45                 break;
46         case 3:
47                 devnum = hextoul(argv[1], NULL);
48                 n = hextoul(argv[2], NULL);
49                 break;
50         default:
51                 return CMD_RET_USAGE;
52         }
53
54         if (uclass_get_device_by_seq(UCLASS_RNG, devnum, &dev) || !dev) {
55                 printf("No RNG device\n");
56                 return CMD_RET_FAILURE;
57         }
58
59         if (!n)
60                 return 0;
61
62         n = min(n, sizeof(buf));
63
64         err = dm_rng_read(dev, buf, n);
65         if (err) {
66                 puts(err == -EINTR ? "Abort\n" : "Reading RNG failed\n");
67                 ret = CMD_RET_FAILURE;
68         } else {
69                 print_hex_dump_bytes("", DUMP_PREFIX_OFFSET, buf, n);
70         }
71
72         return ret;
73 }
74
75 U_BOOT_CMD(
76         rng, 3, 0, do_rng,
77         "print bytes from the hardware random number generator",
78         "list         - list all the probed rng devices\n"
79         "rng [dev] [n]    - print n random bytes(max 64) read from dev\n"
80 );
This page took 0.029205 seconds and 4 git commands to generate.