aboutsummaryrefslogtreecommitdiff
path: root/platform/linux-generic/odp_random.c
diff options
context:
space:
mode:
Diffstat (limited to 'platform/linux-generic/odp_random.c')
-rw-r--r--platform/linux-generic/odp_random.c54
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;
+}