diff --git a/Include/Aurora/RNG/RNG.hpp b/Include/Aurora/RNG/RNG.hpp index c0a28b0a..1ba30d1d 100644 --- a/Include/Aurora/RNG/RNG.hpp +++ b/Include/Aurora/RNG/RNG.hpp @@ -13,30 +13,37 @@ namespace Aurora::RNG { - AUKN_SYM void ReadSecureRNG(Memory::MemoryViewWrite writeView); - AUKN_SYM void ReadFastRNG (Memory::MemoryViewWrite writeView); - - AUKN_SYM AuString ReadString(AuUInt32 uLength, ERngStringCharacters type = ERngStringCharacters::eAlphaCharacters); - AUKN_SYM void RngString(char *pString, AuUInt32 uLength, ERngStringCharacters type = ERngStringCharacters::eAlphaCharacters); + // May return any length between 1 and uBytes + using RngGetBytesProvider_f = AuUInt32(*)(AuUInt8 *pBuffer, AuUInt32 uBytes); - AUKN_SYM AuUInt8 RngByte(); - AUKN_SYM bool RngBoolean(); - AUKN_SYM AuUInt32 RngU32(); - AUKN_SYM AuUInt32 RngU32Range(AuUInt32 uMin, AuUInt32 uMax); - AUKN_SYM AuUInt64 RngU64(); - AUKN_SYM AuInt32 RngI32Range(AuInt32 iMin, AuInt32 iMax); - AUKN_SYM double RngDecimal(); - AUKN_SYM double RngNumber(double dMin, double dMax); - AUKN_SYM AuUInt32 RngIndex(AuUInt32 uCount /* = max + 1*/); - AUKN_SYM uuids::uuid RngUUID(); - AUKN_SYM AuList RngArrayI32Range(AuUInt32 uCount, AuInt32 iMin, AuInt32 iMax); - AUKN_SYM AuList RngArrayU32Range(AuUInt32 uCount, AuUInt32 uMin, AuUInt32 uMax); - AUKN_SYM AuList RngArrayDoubleRange(AuUInt32 uCount, double dMin, double dMax); - AUKN_SYM AuList RngArrayI32(AuUInt32 uCount); - AUKN_SYM AuList RngArrayU32(AuUInt32 uCount); - AUKN_SYM AuList RngArrayDouble(AuUInt32 uCount); - AUKN_SYM AuList RngArrayDecimals(AuUInt32 uCount); - AUKN_SYM AuList RngArrayUUIDs(AuUInt32 uCount); + AUKN_SYM void SetSecureRNGBackendOverload(RngGetBytesProvider_f pSecureBackend); + AUKN_SYM RngGetBytesProvider_f GetSecureRNGBackendOverload(); + AUKN_SYM RngGetBytesProvider_f GetSecureRNGBackend(); + + AUKN_SYM void ReadSecureRNG(Memory::MemoryViewWrite writeView); + AUKN_SYM void ReadFastRNG (Memory::MemoryViewWrite writeView); + + AUKN_SYM AuString ReadString(AuUInt32 uLength, ERngStringCharacters type = ERngStringCharacters::eAlphaCharacters); + AUKN_SYM void RngString(char *pString, AuUInt32 uLength, ERngStringCharacters type = ERngStringCharacters::eAlphaCharacters); + + AUKN_SYM AuUInt8 RngByte(); + AUKN_SYM bool RngBoolean(); + AUKN_SYM AuUInt32 RngU32(); + AUKN_SYM AuUInt32 RngU32Range(AuUInt32 uMin, AuUInt32 uMax); + AUKN_SYM AuUInt64 RngU64(); + AUKN_SYM AuInt32 RngI32Range(AuInt32 iMin, AuInt32 iMax); + AUKN_SYM double RngDecimal(); + AUKN_SYM double RngNumber(double dMin, double dMax); + AUKN_SYM AuUInt32 RngIndex(AuUInt32 uCount /* = max + 1*/); + AUKN_SYM uuids::uuid RngUUID(); + AUKN_SYM AuList RngArrayI32Range(AuUInt32 uCount, AuInt32 iMin, AuInt32 iMax); + AUKN_SYM AuList RngArrayU32Range(AuUInt32 uCount, AuUInt32 uMin, AuUInt32 uMax); + AUKN_SYM AuList RngArrayDoubleRange(AuUInt32 uCount, double dMin, double dMax); + AUKN_SYM AuList RngArrayI32(AuUInt32 uCount); + AUKN_SYM AuList RngArrayU32(AuUInt32 uCount); + AUKN_SYM AuList RngArrayDouble(AuUInt32 uCount); + AUKN_SYM AuList RngArrayDecimals(AuUInt32 uCount); + AUKN_SYM AuList RngArrayUUIDs(AuUInt32 uCount); // Note: it is conceivable that someone may want the following templates for some cryptographic purpose template diff --git a/Source/RNG/AuRNGEntropy.cpp b/Source/RNG/AuRNGEntropy.cpp index 81ece090..a8bb8a41 100644 --- a/Source/RNG/AuRNGEntropy.cpp +++ b/Source/RNG/AuRNGEntropy.cpp @@ -43,6 +43,8 @@ namespace Aurora::RNG { + static RngGetBytesProvider_f gSecureBackend; + #if defined(AURORA_IS_POSIX_DERIVED) static int gDevURand { -1 }; @@ -232,9 +234,33 @@ namespace Aurora::RNG return uLen; } + AUKN_SYM void SetSecureRNGBackendOverload(RngGetBytesProvider_f pSecureBackend) + { + gSecureBackend = pSecureBackend; + } + + AUKN_SYM RngGetBytesProvider_f GetSecureRNGBackendOverload() + { + return gSecureBackend; + } + + AUKN_SYM RngGetBytesProvider_f GetSecureRNGBackend() + { + return gSecureBackend ? gSecureBackend : RngGetBytes; + } + AuUInt32 RngGetBytes(AuUInt8 *pBuffer, AuUInt32 uBytes) { AuUInt32 x; + + if (gSecureBackend) + { + x = gSecureBackend(pBuffer, uBytes); + if (x != 0) + { + return x; + } + } #if defined(AURORA_IS_MODERNNT_DERIVED) x = RngWin32(pBuffer, uBytes); if (x != 0) @@ -242,6 +268,10 @@ namespace Aurora::RNG return x; } #elif defined(AURORA_IS_POSIX_DERIVED) + #if defined(AURORA_RND_HAS_ARC4) + arc4random_buf(pBuffer, uBytes); + return uBytes; + #endif #if defined(AURORA_IS_LINUX_DERIVED) x = sys_getrandom(pBuffer, uBytes); if (x > 0) @@ -249,10 +279,6 @@ namespace Aurora::RNG return x; } #endif - #if defined(AURORA_RND_HAS_ARC4) - arc4random_buf(pBuffer, uBytes); - return uBytes; - #endif x = RngUnix(pBuffer, uBytes); if (x != 0) {