From 19adf1f3bb69ea971a4b6ad6a1d6c71f128cf814 Mon Sep 17 00:00:00 2001
From: Rahix <rahix@rahix.de>
Date: Wed, 21 Aug 2019 22:30:39 +0200
Subject: [PATCH] feat(pycardium): Add os.urandom()

Signed-off-by: Rahix <rahix@rahix.de>
---
 Documentation/pycardium/os.rst |  8 ++++++++
 pycardium/modules/os.c         | 13 +++++++++++++
 pycardium/modules/qstrdefs.h   |  1 +
 3 files changed, 22 insertions(+)

diff --git a/Documentation/pycardium/os.rst b/Documentation/pycardium/os.rst
index 8097bf7f..32558663 100644
--- a/Documentation/pycardium/os.rst
+++ b/Documentation/pycardium/os.rst
@@ -21,6 +21,14 @@ CPython-Like
    :returns: A list of entities (files or subdirectories) in the directory
       ``dir``.
 
+.. py:function:: urandom(n)
+
+   Return ``n`` random bytes.
+
+   :param int n: Number of random bytes to retrieve.
+   :returns: ``bytes()`` object with ``n`` random bytes.
+
+
 Epicardium-Specific
 -------------------
 
diff --git a/pycardium/modules/os.c b/pycardium/modules/os.c
index c017e417..a693420b 100644
--- a/pycardium/modules/os.c
+++ b/pycardium/modules/os.c
@@ -135,6 +135,18 @@ static mp_obj_t mp_os_read_battery()
 }
 static MP_DEFINE_CONST_FUN_OBJ_0(read_battery_obj, mp_os_read_battery);
 
+static mp_obj_t mp_os_urandom(mp_obj_t size_in)
+{
+	size_t size = mp_obj_get_int(size_in);
+	vstr_t vstr;
+
+	vstr_init_len(&vstr, size);
+	epic_trng_read((uint8_t*)vstr.buf, size);
+
+	return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr);
+}
+static MP_DEFINE_CONST_FUN_OBJ_1(urandom_obj, mp_os_urandom);
+
 static const mp_rom_map_elem_t os_module_globals_table[] = {
 	{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_os) },
 	{ MP_ROM_QSTR(MP_QSTR_exit), MP_ROM_PTR(&exit_obj) },
@@ -145,6 +157,7 @@ static const mp_rom_map_elem_t os_module_globals_table[] = {
 	{ MP_ROM_QSTR(MP_QSTR_mkdir), MP_ROM_PTR(&mkdir_obj) },
 	{ MP_ROM_QSTR(MP_QSTR_rename), MP_ROM_PTR(&rename_obj) },
 	{ MP_ROM_QSTR(MP_QSTR_read_battery), MP_ROM_PTR(&read_battery_obj) },
+	{ MP_ROM_QSTR(MP_QSTR_urandom), MP_ROM_PTR(&urandom_obj) },
 };
 
 static MP_DEFINE_CONST_DICT(os_module_globals, os_module_globals_table);
diff --git a/pycardium/modules/qstrdefs.h b/pycardium/modules/qstrdefs.h
index f78afd25..6574d436 100644
--- a/pycardium/modules/qstrdefs.h
+++ b/pycardium/modules/qstrdefs.h
@@ -106,6 +106,7 @@ Q(unlink)
 Q(mkdir)
 Q(rename)
 Q(read_battery)
+Q(urandom)
 
 /* gpio */
 Q(gpio)
-- 
GitLab