diff --git a/core/io/file_access_encrypted.cpp b/core/io/file_access_encrypted.cpp index f2749157b3d..f3d89a66971 100644 --- a/core/io/file_access_encrypted.cpp +++ b/core/io/file_access_encrypted.cpp @@ -30,9 +30,17 @@ #include "file_access_encrypted.h" -#include "core/crypto/crypto_core.h" #include "core/variant/variant.h" +CryptoCore::RandomGenerator *FileAccessEncrypted::_fae_static_rng = nullptr; + +void FileAccessEncrypted::deinitialize() { + if (_fae_static_rng) { + memdelete(_fae_static_rng); + _fae_static_rng = nullptr; + } +} + Error FileAccessEncrypted::open_and_parse(Ref p_base, const Vector &p_key, Mode p_mode, bool p_with_magic, const Vector &p_iv) { ERR_FAIL_COND_V_MSG(file.is_valid(), ERR_ALREADY_IN_USE, vformat("Can't open file while another file from path '%s' is open.", file->get_path_absolute())); ERR_FAIL_COND_V(p_key.size() != 32, ERR_INVALID_PARAMETER); @@ -48,9 +56,15 @@ Error FileAccessEncrypted::open_and_parse(Ref p_base, const Vectorinit() != OK) { + memdelete(_fae_static_rng); + _fae_static_rng = nullptr; + ERR_FAIL_V_MSG(FAILED, "Failed to initialize random number generator."); + } + } + Error err = _fae_static_rng->get_random_bytes(iv.ptrw(), 16); ERR_FAIL_COND_V(err != OK, err); } else { ERR_FAIL_COND_V(p_iv.size() != 16, ERR_INVALID_PARAMETER); diff --git a/core/io/file_access_encrypted.h b/core/io/file_access_encrypted.h index 570955b7835..a1bc0f09dcf 100644 --- a/core/io/file_access_encrypted.h +++ b/core/io/file_access_encrypted.h @@ -31,6 +31,7 @@ #ifndef FILE_ACCESS_ENCRYPTED_H #define FILE_ACCESS_ENCRYPTED_H +#include "core/crypto/crypto_core.h" #include "core/io/file_access.h" #define ENCRYPTED_HEADER_MAGIC 0x43454447 @@ -57,6 +58,8 @@ private: void _close(); + static CryptoCore::RandomGenerator *_fae_static_rng; + public: Error open_and_parse(Ref p_base, const Vector &p_key, Mode p_mode, bool p_with_magic = true, const Vector &p_iv = Vector()); Error open_and_parse_password(Ref p_base, const String &p_key, Mode p_mode); @@ -97,6 +100,8 @@ public: virtual void close() override; + static void deinitialize(); + FileAccessEncrypted() {} ~FileAccessEncrypted(); }; diff --git a/core/register_core_types.cpp b/core/register_core_types.cpp index 568694bdf4d..d58097920d9 100644 --- a/core/register_core_types.cpp +++ b/core/register_core_types.cpp @@ -45,6 +45,7 @@ #include "core/io/config_file.h" #include "core/io/dir_access.h" #include "core/io/dtls_server.h" +#include "core/io/file_access_encrypted.h" #include "core/io/http_client.h" #include "core/io/image_loader.h" #include "core/io/json.h" @@ -455,5 +456,7 @@ void unregister_core_types() { CoreStringNames::free(); StringName::cleanup(); + FileAccessEncrypted::deinitialize(); + OS::get_singleton()->benchmark_end_measure("Core", "Unregister Types"); }