diff options
Diffstat (limited to 'platform/linux-generic/odp_random.c')
-rw-r--r-- | platform/linux-generic/odp_random.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/platform/linux-generic/odp_random.c b/platform/linux-generic/odp_random.c new file mode 100644 index 000000000..22894c473 --- /dev/null +++ b/platform/linux-generic/odp_random.c @@ -0,0 +1,54 @@ +/* Copyright (c) 2014-2018, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "config.h" + +#include <odp_posix_extensions.h> +#include <odp_internal.h> +#include <odp/api/random.h> + +#include <openssl/rand.h> + +odp_random_kind_t odp_random_max_kind(void) +{ + return ODP_RANDOM_CRYPTO; +} + +int32_t odp_random_data(uint8_t *buf, uint32_t len, odp_random_kind_t kind) +{ + int rc; + + switch (kind) { + case ODP_RANDOM_BASIC: + case ODP_RANDOM_CRYPTO: + rc = RAND_bytes(buf, len); + return (1 == rc) ? (int)len /*success*/: -1 /*failure*/; + + case ODP_RANDOM_TRUE: + default: + return -1; + } +} + +int32_t odp_random_test_data(uint8_t *buf, uint32_t len, uint64_t *seed) +{ + union { + uint32_t rand_word; + uint8_t rand_byte[4]; + } u; + uint32_t i = 0, j; + uint32_t seed32 = (*seed) & 0xffffffff; + + while (i < len) { + u.rand_word = rand_r(&seed32); + + for (j = 0; j < 4 && i < len; j++, i++) + *buf++ = u.rand_byte[j]; + } + + *seed = seed32; + return len; +} |