From 91d76a2ee4220674436036a64c78271007949ec0 Mon Sep 17 00:00:00 2001 From: apio Date: Fri, 14 Oct 2022 20:14:49 +0200 Subject: [PATCH] Devices: Add a new RandomDevice :) This new device uses the seeded Mersenne PRNG we use in the kernel. This device is not meant for regular userspace use, but more for userspace to seed their own PRNGs from. If the DeviceFS is mounted at /dev, this device can be found at /dev/random. --- apps/src/init.c | 22 ++++++++++++++++- kernel/include/fs/devices/Random.h | 9 +++++++ kernel/src/fs/devices/DeviceFS.cpp | 2 ++ kernel/src/fs/devices/Random.cpp | 38 ++++++++++++++++++++++++++++++ 4 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 kernel/include/fs/devices/Random.h create mode 100644 kernel/src/fs/devices/Random.cpp diff --git a/apps/src/init.c b/apps/src/init.c index 6001373b..f6c1f1c7 100644 --- a/apps/src/init.c +++ b/apps/src/init.c @@ -117,9 +117,29 @@ int main() if (fclose(config) < 0) { perror("fclose"); } + FILE* fp = fopen("/dev/random", "rw"); + if (!fp) + { + perror("fopen"); + return 1; + } + + long int random = 0; + + fread(&random, sizeof(random), 1, fp); + if (ferror(fp)) + { + perror("fread"); + return 1; + } + + fclose(fp); + + printf("\n\nGot random number %ld\n\n", random); + sleep(2); - printf("\n\nPress any key to restart.\n\n"); + printf("Press any key to restart.\n\n"); return 0; } diff --git a/kernel/include/fs/devices/Random.h b/kernel/include/fs/devices/Random.h new file mode 100644 index 00000000..916ba0c4 --- /dev/null +++ b/kernel/include/fs/devices/Random.h @@ -0,0 +1,9 @@ +#pragma once +#include "fs/VFS.h" + +namespace RandomDevice +{ + VFS::Node* create_new(const char* devname); + + ssize_t read(VFS::Node* node, size_t offset, size_t size, char* buffer); +} \ No newline at end of file diff --git a/kernel/src/fs/devices/DeviceFS.cpp b/kernel/src/fs/devices/DeviceFS.cpp index 2557bf4f..e6de7470 100644 --- a/kernel/src/fs/devices/DeviceFS.cpp +++ b/kernel/src/fs/devices/DeviceFS.cpp @@ -1,5 +1,6 @@ #include "fs/devices/DeviceFS.h" #include "fs/devices/Console.h" +#include "fs/devices/Random.h" #include "fs/devices/Serial.h" #include "fs/devices/Version.h" #include "std/stdlib.h" @@ -25,6 +26,7 @@ VFS::Node* DeviceFS::get() devfs_files[devfs_file_count++] = VersionDevice::create_new("version"); devfs_files[devfs_file_count++] = ConsoleDevice::create_new("console"); devfs_files[devfs_file_count++] = SerialDevice::create_new("serial"); + devfs_files[devfs_file_count++] = RandomDevice::create_new("random"); return devfs_root; } diff --git a/kernel/src/fs/devices/Random.cpp b/kernel/src/fs/devices/Random.cpp new file mode 100644 index 00000000..ed309965 --- /dev/null +++ b/kernel/src/fs/devices/Random.cpp @@ -0,0 +1,38 @@ +#include "fs/devices/Random.h" +#include "config.h" +#include "rand/Mersenne.h" +#include "render/TextRenderer.h" +#include "std/stdio.h" +#include "std/stdlib.h" +#include "std/string.h" + +VFS::Node* RandomDevice::create_new(const char* devname) +{ + VFS::Node* dev = new VFS::Node; + dev->read_func = RandomDevice::read; + dev->inode = 0; + dev->length = 0; + dev->type = VFS_DEVICE; + dev->flags = 0; + strncpy(dev->name, devname, sizeof(dev->name)); + return dev; +} + +ssize_t RandomDevice::read(VFS::Node* node, size_t, size_t size, char* buffer) +{ + if (!node) return -1; + size_t nread = size; + while (size >= sizeof(uint64_t)) + { + *(uint64_t*)buffer = Mersenne::get(); + size -= sizeof(uint64_t); + buffer += sizeof(uint64_t); + } + while (size) + { + *buffer = (char)(Mersenne::get() & 0xFF); + size--; + buffer++; + } + return (ssize_t)nread; +} \ No newline at end of file