#include "il2cpp-config.h" #include "il2cpp-api.h" #include "vm/Array.h" #include "os/Cryptography.h" #include "utils/Memory.h" #include "icalls/mscorlib/System.Security.Cryptography/RNGCryptoServiceProvider.h" namespace il2cpp { namespace icalls { namespace mscorlib { namespace System { namespace Security { namespace Cryptography { void RNGCryptoServiceProvider::RngClose(intptr_t provider) { os::Cryptography::ReleaseCryptographyProvider(reinterpret_cast(provider)); } intptr_t RNGCryptoServiceProvider::RngGetBytes(intptr_t provider, Il2CppArray *data) { uint32_t len = il2cpp_array_length(data); unsigned char* buf = il2cpp_array_addr(data, unsigned char, 0); if (!os::Cryptography::FillBufferWithRandomBytes(reinterpret_cast(provider), len, buf)) { os::Cryptography::ReleaseCryptographyProvider(reinterpret_cast(provider)); provider = RngInitialize(NULL); if (!os::Cryptography::FillBufferWithRandomBytes(reinterpret_cast(provider), len, buf)) { os::Cryptography::ReleaseCryptographyProvider(reinterpret_cast(provider)); return 0; } } return provider; } intptr_t RNGCryptoServiceProvider::RngInitialize(Il2CppArray *seed) { void* provider = os::Cryptography::GetCryptographyProvider(); if ((provider != 0) && seed) { uint32_t len = il2cpp_array_length(seed); unsigned char *buf = il2cpp_array_addr(seed, unsigned char, 0); unsigned char* data = (unsigned char*)IL2CPP_MALLOC(len); if (data) { memcpy(data, buf, len); os::Cryptography::FillBufferWithRandomBytes(provider, len, data); memset(data, 0, len); IL2CPP_FREE(data); } } return reinterpret_cast(provider); } bool RNGCryptoServiceProvider::RngOpen() { return os::Cryptography::OpenCryptographyProvider(); } } /* namespace Cryptography */ } /* namespace Security */ } /* namespace System */ } /* namespace mscorlib */ } /* namespace icalls */ } /* namespace il2cpp */