(view as text)
diff --git a/Source/Core/Core/IPC_HLE/WII_IPC_HLE_Device_net_ssl.cpp b/Source/Core/Core/IPC_HLE/WII_IPC_HLE_Device_net_ssl.cpp
index f25972b..ea48b79 100644
--- a/Source/Core/Core/IPC_HLE/WII_IPC_HLE_Device_net_ssl.cpp
+++ b/Source/Core/Core/IPC_HLE/WII_IPC_HLE_Device_net_ssl.cpp
@@ -148,7 +148,21 @@ bool CWII_IPC_HLE_Device_net_ssl::IOCtlV(u32 _CommandAddress)
}
entropy_init(&_SSL[sslID].entropy);
- ssl_set_rng(&_SSL[sslID].ctx, entropy_func, &_SSL[sslID].entropy);
+ const char* pers = "dolphin-emu";
+ ret = ctr_drbg_init(&_SSL[sslID].ctr_drbg, entropy_func,
+ &_SSL[sslID].entropy,
+ (const unsigned char*)pers,
+ strlen(pers));
+ if(ret)
+ {
+ ssl_free(&_SSL[sslID].ctx);
+ // Cleanup possibly dirty ctx
+ memset(&_SSL[sslID].ctx, 0, sizeof(ssl_context));
+ entropy_free(&_SSL[sslID].entropy);
+ goto _SSL_NEW_ERROR;
+ }
+
+ ssl_set_rng(&_SSL[sslID].ctx, ctr_drbg_random, &_SSL[sslID].ctr_drbg);
// For some reason we can't use TLSv1.2, v1.1 and below are fine!
ssl_set_max_version(&_SSL[sslID].ctx, SSL_MAJOR_VERSION_3, SSL_MINOR_VERSION_2);
@@ -191,9 +205,11 @@ _SSL_NEW_ERROR:
ssl_session_free(&_SSL[sslID].session);
ssl_free(&_SSL[sslID].ctx);
+ entropy_free(&_SSL[sslID].entropy);
+
x509_crt_free(&_SSL[sslID].cacert);
x509_crt_free(&_SSL[sslID].clicert);
-
+
memset(&_SSL[sslID].ctx, 0, sizeof(ssl_context));
memset(&_SSL[sslID].session, 0, sizeof(ssl_session));
memset(&_SSL[sslID].entropy, 0, sizeof(entropy_context));
diff --git a/Source/Core/Core/IPC_HLE/WII_IPC_HLE_Device_net_ssl.h b/Source/Core/Core/IPC_HLE/WII_IPC_HLE_Device_net_ssl.h
index 145a49e..af05da1 100644
--- a/Source/Core/Core/IPC_HLE/WII_IPC_HLE_Device_net_ssl.h
+++ b/Source/Core/Core/IPC_HLE/WII_IPC_HLE_Device_net_ssl.h
@@ -3,7 +3,8 @@
// Refer to the license.txt file included.
#pragma once
-
+#define DEBUG_SSL
+#include <polarssl/ctr_drbg.h>
#include <polarssl/entropy.h>
#include <polarssl/net.h>
#include <polarssl/ssl.h>
@@ -58,6 +59,7 @@ typedef struct
ssl_context ctx;
ssl_session session;
entropy_context entropy;
+ ctr_drbg_context ctr_drbg;
x509_crt cacert;
x509_crt clicert;
pk_context pk;