From 5310f1a9007ff0f1688cc974407e446448f06c5a Mon Sep 17 00:00:00 2001 From: infinicore Date: Fri, 22 Jul 2016 06:24:18 +0000 Subject: [PATCH] Add support for ps:ps#GenerateRandomBytes. --- libctru/include/3ds/services/ps.h | 7 +++++++ libctru/source/services/ps.c | 15 +++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/libctru/include/3ds/services/ps.h b/libctru/include/3ds/services/ps.h index 398e7fd..4d17fee 100644 --- a/libctru/include/3ds/services/ps.h +++ b/libctru/include/3ds/services/ps.h @@ -74,3 +74,10 @@ Result PS_GetLocalFriendCodeSeed(u64* seed); * @param device_id Pointer to write the device ID to. */ Result PS_GetDeviceId(u32* device_id); + +/** + * @brief Generates cryptographically secure random bytes. + * @param out Pointer to the buffer to write the bytes to. + * @param len Number of bytes to write. + */ +Result PS_GenerateRandomBytes(void* out, size_t len); diff --git a/libctru/source/services/ps.c b/libctru/source/services/ps.c index f866ac8..ab8520e 100644 --- a/libctru/source/services/ps.c +++ b/libctru/source/services/ps.c @@ -103,3 +103,18 @@ Result PS_GetDeviceId(u32* device_id) return (Result)cmdbuf[1]; } + +Result PS_GenerateRandomBytes(void* out, size_t len) +{ + Result ret = 0; + u32 *cmdbuf = getThreadCommandBuffer(); + + cmdbuf[0] = IPC_MakeHeader(0xD,1,2); // 0xD0042 + cmdbuf[1] = len; + cmdbuf[2] = IPC_Desc_Buffer(len, IPC_BUFFER_W); + cmdbuf[3] = (u32)out; + + if(R_FAILED(ret = svcSendSyncRequest(psHandle)))return ret; + + return (Result)cmdbuf[1]; +}