From ae7045f67efede5eafa5af3279ab1d88c0facec5 Mon Sep 17 00:00:00 2001 From: Fabio Alessandrelli Date: Fri, 14 Jun 2024 02:30:32 +0200 Subject: [PATCH] [Crypto] Expose OS.get_entropy --- core/core_bind.cpp | 9 +++++++++ core/core_bind.h | 1 + doc/classes/OS.xml | 8 ++++++++ 3 files changed, 18 insertions(+) diff --git a/core/core_bind.cpp b/core/core_bind.cpp index d6719e715fcd..a1b7b81111df 100644 --- a/core/core_bind.cpp +++ b/core/core_bind.cpp @@ -194,6 +194,14 @@ void ResourceSaver::_bind_methods() { ////// OS ////// +PackedByteArray OS::get_entropy(int p_bytes) { + PackedByteArray pba; + pba.resize(p_bytes); + Error err = ::OS::get_singleton()->get_entropy(pba.ptrw(), p_bytes); + ERR_FAIL_COND_V(err != OK, PackedByteArray()); + return pba; +} + String OS::get_system_ca_certificates() { return ::OS::get_singleton()->get_system_ca_certificates(); } @@ -577,6 +585,7 @@ String OS::get_unique_id() const { OS *OS::singleton = nullptr; void OS::_bind_methods() { + ClassDB::bind_method(D_METHOD("get_entropy", "size"), &OS::get_entropy); ClassDB::bind_method(D_METHOD("get_system_ca_certificates"), &OS::get_system_ca_certificates); ClassDB::bind_method(D_METHOD("get_connected_midi_inputs"), &OS::get_connected_midi_inputs); ClassDB::bind_method(D_METHOD("open_midi_inputs"), &OS::open_midi_inputs); diff --git a/core/core_bind.h b/core/core_bind.h index 1452368f60e5..b142a2fbbd9c 100644 --- a/core/core_bind.h +++ b/core/core_bind.h @@ -134,6 +134,7 @@ class OS : public Object { RENDERING_DRIVER_D3D12, }; + PackedByteArray get_entropy(int p_bytes); String get_system_ca_certificates(); virtual PackedStringArray get_connected_midi_inputs(); diff --git a/doc/classes/OS.xml b/doc/classes/OS.xml index a3fd15a46d4d..3d048e2f6347 100644 --- a/doc/classes/OS.xml +++ b/doc/classes/OS.xml @@ -262,6 +262,14 @@ [b]Note:[/b] This method is not supported on the Web platform. It returns an empty string. + + + + + Generates a [PackedByteArray] of cryptographically secure random bytes with given [param size]. + [b]Note:[/b] Generating large quantities of bytes using this method can result in locking and entropy of lower quality on most platforms. Using [method Crypto.generate_random_bytes] is preferred in most cases. + +