diff --git a/Documentation/pycardium/trng.rst b/Documentation/pycardium/trng.rst
new file mode 100644
index 0000000000000000000000000000000000000000..60283089723ff23bab79ef46b6964ffa0821c361
--- /dev/null
+++ b/Documentation/pycardium/trng.rst
@@ -0,0 +1,11 @@
+.. py:module:: trng
+
+``trng`` - True Random Number Generator
+=======================================
+
+.. py:function:: trng.getrandombytes(n)
+
+   Returns a bytearray of random bytes from the TRNG.
+
+   :param int n:  Amount of bytes to return.
+
diff --git a/pycardium/meson.build b/pycardium/meson.build
index 40fabde700ce03eff4d117b7e5e87c024b5f35f5..eb99562bba8351e6e873eb5d7645c1b0d114ad2a 100644
--- a/pycardium/meson.build
+++ b/pycardium/meson.build
@@ -11,6 +11,7 @@ modsrc = files(
   'modules/os.c',
   'modules/personal_state.c',
   'modules/sys_display.c',
+  'modules/trng.c',
   'modules/utime.c',
   'modules/vibra.c',
 )
diff --git a/pycardium/modules/qstrdefs.h b/pycardium/modules/qstrdefs.h
index f78afd25ed5aba9b38ef3b29d845ef5d573e47a6..57913108c6ff810eafb745ec802254d22aa5bebb 100644
--- a/pycardium/modules/qstrdefs.h
+++ b/pycardium/modules/qstrdefs.h
@@ -54,6 +54,10 @@ Q(set_unix_time)
 Q(vibra)
 Q(vibrate)
 
+/* trng */
+Q(trng)
+Q(getrandbytes)
+
 Q(set_callback)
 Q(enable_callback)
 Q(disable_callback)
diff --git a/pycardium/modules/trng.c b/pycardium/modules/trng.c
new file mode 100644
index 0000000000000000000000000000000000000000..036c5320ee7729edd322e9799832ee12e408ee49
--- /dev/null
+++ b/pycardium/modules/trng.c
@@ -0,0 +1,31 @@
+#include "epicardium.h"
+
+#include "py/builtin.h"
+#include "py/obj.h"
+#include "py/runtime.h"
+
+static mp_obj_t mp_trng_getrandbytes(mp_obj_t n)
+{
+	size_t amount = mp_obj_get_int(n);
+	uint8_t randbytes[amount];
+	epic_trng_read(randbytes, amount);
+	return mp_obj_new_bytearray_by_ref(amount, randbytes);
+}
+static MP_DEFINE_CONST_FUN_OBJ_1(trng_getrandbytes_obj, mp_trng_getrandbytes);
+
+static const mp_rom_map_elem_t trng_module_globals_table[] = {
+	{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_trng) },
+	{ MP_ROM_QSTR(MP_QSTR_getrandbytes),
+	  MP_ROM_PTR(&trng_getrandbytes_obj) },
+};
+static MP_DEFINE_CONST_DICT(trng_module_globals, trng_module_globals_table);
+
+// Define module object.
+const mp_obj_module_t trng_module = {
+	.base    = { &mp_type_module },
+	.globals = (mp_obj_dict_t *)&trng_module_globals,
+};
+
+/* Register the module to make it available in Python */
+/* clang-format off */
+MP_REGISTER_MODULE(MP_QSTR_trng, trng_module, MODULE_TRNG_ENABLED);
diff --git a/pycardium/mpconfigport.h b/pycardium/mpconfigport.h
index a1c88a7476f0b63111a4e6049aaac33f32b7fa0c..1fdaa0f487a02b1946d7d4cef4f2771ba5f6f956 100644
--- a/pycardium/mpconfigport.h
+++ b/pycardium/mpconfigport.h
@@ -55,6 +55,7 @@ int mp_hal_trng_read_int(void);
 #define MODULE_PERSONAL_STATE_ENABLED       (1)
 #define MODULE_UTIME_ENABLED                (1)
 #define MODULE_VIBRA_ENABLED                (1)
+#define MODULE_TRNG_ENABLED                 (1)
 
 /*
  * This port is intended to be 32-bit, but unfortunately, int32_t for