From ba57a3d8c0c26b3792b2daa191a6e76fa546a25d Mon Sep 17 00:00:00 2001 From: zhongtao Date: Sat, 25 Nov 2023 22:25:03 +1400 Subject: [PATCH 163/181] use RAND_bytes to replace /dev/urandom Signed-off-by: zhongtao --- src/utils/cutils/utils.c | 25 +++++++++---------------- src/utils/cutils/utils.h | 2 ++ 2 files changed, 11 insertions(+), 16 deletions(-) diff --git a/src/utils/cutils/utils.c b/src/utils/cutils/utils.c index a994731d..46a478b6 100644 --- a/src/utils/cutils/utils.c +++ b/src/utils/cutils/utils.c @@ -37,6 +37,7 @@ #include // IWYU pragma: keep #include #include +#include #include "isula_libutils/log.h" #include "isula_libutils/json_common.h" @@ -1274,37 +1275,29 @@ void util_usleep_nointerupt(unsigned long usec) int util_generate_random_str(char *id, size_t len) { - int fd = -1; - int num = 0; +#define MAX_RANDOM_BYTES_LEN 100 size_t i; - const int m = 256; + unsigned char random_bytes[MAX_RANDOM_BYTES_LEN] = { 0 }; + len = len / 2; - if (id == NULL) { + if (id == NULL || len > MAX_RANDOM_BYTES_LEN) { + ERROR("Invalid id or len"); return -1; } - len = len / 2; - fd = open("/dev/urandom", O_RDONLY); - if (fd == -1) { - ERROR("Failed to open /dev/urandom"); + if (RAND_bytes((unsigned char *)random_bytes, len) != 1) { + ERROR("Failed to get random bytes by RAND_bytes"); return -1; } for (i = 0; i < len; i++) { int nret; - if (util_read_nointr(fd, &num, sizeof(int)) < 0) { - ERROR("Failed to read urandom value"); - close(fd); - return -1; - } - unsigned char rs = (unsigned char)(num % m); + unsigned char rs = random_bytes[i]; nret = snprintf((id + i * 2), ((len - i) * 2 + 1), "%02x", (unsigned int)rs); if (nret < 0 || (size_t)nret >= ((len - i) * 2 + 1)) { ERROR("Failed to snprintf random string"); - close(fd); return -1; } } - close(fd); id[i * 2] = '\0'; return 0; } diff --git a/src/utils/cutils/utils.h b/src/utils/cutils/utils.h index bb510062..5a1592fd 100644 --- a/src/utils/cutils/utils.h +++ b/src/utils/cutils/utils.h @@ -375,6 +375,8 @@ int util_input_noecho(char *buf, size_t maxlen); void util_usleep_nointerupt(unsigned long usec); +// id : random string, notice: the length of id needs to be len + 1 +// len : the length of the random string that needs to be generated, notice: len needs to be an even number int util_generate_random_str(char *id, size_t len); int util_check_inherited_exclude_fds(bool closeall, int *fds_to_ignore, size_t len_fds); -- 2.42.0