From 4179e91baf3b7cfb596875bdfc1419ceabd2ad16 Mon Sep 17 00:00:00 2001
From: polaris- <nagatospam@gmail.com>
Date: Sun, 22 Nov 2015 15:57:06 -0500
Subject: [PATCH] Add stub functions for Initialize and GenerateRandomData in
 ssl:C

---
 src/core/hle/service/ssl_c.cpp | 53 ++++++++++++++++++++++++++++++++--
 1 file changed, 51 insertions(+), 2 deletions(-)

diff --git a/src/core/hle/service/ssl_c.cpp b/src/core/hle/service/ssl_c.cpp
index 04ab194e6..cabd18c80 100644
--- a/src/core/hle/service/ssl_c.cpp
+++ b/src/core/hle/service/ssl_c.cpp
@@ -2,6 +2,8 @@
 // Licensed under GPLv2 or any later version
 // Refer to the license.txt file included.
 
+#include <random>
+
 #include "core/hle/hle.h"
 #include "core/hle/service/ssl_c.h"
 
@@ -10,11 +12,58 @@
 
 namespace SSL_C {
 
+// TODO: Implement a proper CSPRNG in the future when actual security is needed
+static std::mt19937 rand_gen;
+
+static void Initialize(Service::Interface* self) {
+    u32* cmd_buff = Kernel::GetCommandBuffer();
+
+    // Seed random number generator when the SSL service is initialized
+    std::random_device rand_device;
+    rand_gen.seed(rand_device());
+
+    // Stub, return success
+    cmd_buff[1] = RESULT_SUCCESS.raw;
+}
+
+static void GenerateRandomData(Service::Interface* self) {
+    u32* cmd_buff = Kernel::GetCommandBuffer();
+
+    u32 size = cmd_buff[1];
+    VAddr address = cmd_buff[3];
+    u8* output_buff = Memory::GetPointer(address);
+
+    // Fill the output buffer with random data.
+    u32 data = 0;
+    u32 i = 0;
+    while (i < size) {
+        if ((i % 4) == 0) {
+            // The random number generator returns 4 bytes worth of data, so generate new random data when i == 0 and when i is divisible by 4
+            data = rand_gen();
+        }
+
+        if (size > 4) {
+            // Use up the entire 4 bytes of the random data for as long as possible
+            *(u32*)(output_buff + i) = data;
+            i += 4;
+        } else if (size == 2) {
+            *(u16*)(output_buff + i) = (u16)(data & 0xffff);
+            i += 2;
+        } else {
+            *(u8*)(output_buff + i) = (u8)(data & 0xff);
+            i++;
+        }
+    }
+
+    // Stub, return success
+    cmd_buff[1] = RESULT_SUCCESS.raw;
+}
+
 const Interface::FunctionInfo FunctionTable[] = {
-    {0x00010002, nullptr,               "Initialize"},
+    {0x00010002, Initialize,            "Initialize"},
     {0x000200C2, nullptr,               "CreateContext"},
     {0x00050082, nullptr,               "AddTrustedRootCA"},
-    {0x00110042, nullptr,               "GenerateRandomData"},
+    {0x00110042, GenerateRandomData,    "GenerateRandomData"},
     {0x00150082, nullptr,               "Read"},
     {0x00170082, nullptr,               "Write"},
 };