From 051bbb6e1498531fb0aa5663afedfea3196bc463 Mon Sep 17 00:00:00 2001 From: ANR2ME Date: Fri, 7 Aug 2020 20:09:14 +0700 Subject: [PATCH] Added 1 new NID of OpenPSID Service, also added Init & Shutdown function --- Core/HLE/HLETables.cpp | 1 + Core/HLE/sceKernel.cpp | 3 ++ Core/HLE/sceOpenPSID.cpp | 71 ++++++++++++++++++++++++++++++---------- Core/HLE/sceOpenPSID.h | 16 +++++++-- 4 files changed, 72 insertions(+), 19 deletions(-) diff --git a/Core/HLE/HLETables.cpp b/Core/HLE/HLETables.cpp index 4c5ed553aa..c6c7f4a6bf 100644 --- a/Core/HLE/HLETables.cpp +++ b/Core/HLE/HLETables.cpp @@ -304,6 +304,7 @@ void RegisterAllModules() { Register_sceUsbMic(); Register_sceOpenPSID_driver(); Register_semaphore(); + Register_sceDdrdb(); // add new modules here. } diff --git a/Core/HLE/sceKernel.cpp b/Core/HLE/sceKernel.cpp index 971a9c728b..6e8d1902f3 100644 --- a/Core/HLE/sceKernel.cpp +++ b/Core/HLE/sceKernel.cpp @@ -85,6 +85,7 @@ #include "sceHeap.h" #include "sceDmac.h" #include "sceMp4.h" +#include "sceOpenPSID.h" #include "../Util/PPGeDraw.h" @@ -150,6 +151,7 @@ void __KernelInit() __UsbGpsInit(); __UsbCamInit(); __UsbMicInit(); + __OpenPSIDInit(); SaveState::Init(); // Must be after IO, as it may create a directory Reporting::Init(); @@ -173,6 +175,7 @@ void __KernelShutdown() hleCurrentThreadName = NULL; kernelObjects.Clear(); + __OpenPSIDShutdown(); __UsbCamShutdown(); __UsbMicShutdown(); __UsbGpsShutdown(); diff --git a/Core/HLE/sceOpenPSID.cpp b/Core/HLE/sceOpenPSID.cpp index d20e349307..86e35bc4fe 100644 --- a/Core/HLE/sceOpenPSID.cpp +++ b/Core/HLE/sceOpenPSID.cpp @@ -18,44 +18,69 @@ #include "Core/HLE/HLE.h" #include "Core/HLE/FunctionWrappers.h" #include "Core/HLE/sceOpenPSID.h" -#include "Core/MemMap.h" +#include "Core/MemMapHelpers.h" #include -u8 dummyOpenPSID[16] = { 0x10, 0x02, 0xA3, 0x44, 0x13, 0xF5, 0x93, 0xB0, 0xCC, 0x6E, 0xD1, 0x32, 0x27, 0x85, 0x0F, 0x9D }; +SceOpenPSID dummyOpenPSID = { 0x10, 0x02, 0xA3, 0x44, 0x13, 0xF5, 0x93, 0xB0, 0xCC, 0x6E, 0xD1, 0x32, 0x27, 0x85, 0x0F, 0x9D }; + +void __OpenPSIDInit() { + // Making sure the ID is unique + getLocalMac((SceNetEtherAddr*)&dummyOpenPSID); + return; +} + +void __OpenPSIDShutdown() { + + return; +} static int sceOpenPSIDGetOpenPSID(u32 OpenPSIDPtr) { - WARN_LOG(HLE, "UNTESTED sceOpenPSIDGetOpenPSID(%d)", OpenPSIDPtr); - getLocalMac((SceNetEtherAddr*)&dummyOpenPSID); + WARN_LOG(HLE, "UNTESTED %s(%08x)", __FUNCTION__, OpenPSIDPtr); if (Memory::IsValidAddress(OpenPSIDPtr)) { - for (int i = 0; i < 16; i++) - { - Memory::Write_U8(dummyOpenPSID[i], OpenPSIDPtr+i); - } + Memory::WriteStruct(OpenPSIDPtr, &dummyOpenPSID); } return 0; } -static int sceOpenPSID_driver_0x19D579F0(u32 OpenPSIDPtr,u32 unknown) +static int sceOpenPSIDGetPSID(u32 OpenPSIDPtr,u32 unknown) { - WARN_LOG(HLE, "UNTESTED sceOpenPSID_driver_0x19D579F0(%d,%d)", OpenPSIDPtr,unknown); - getLocalMac((SceNetEtherAddr*)&dummyOpenPSID); + WARN_LOG(HLE, "UNTESTED %s(%08x, %08x)", __FUNCTION__, OpenPSIDPtr, unknown); if (Memory::IsValidAddress(OpenPSIDPtr)) { - for (int i = 0; i < 16; i++) - { - Memory::Write_U8(dummyOpenPSID[i], OpenPSIDPtr + i); - } + Memory::WriteStruct(OpenPSIDPtr, &dummyOpenPSID); } return 0; } +/* +Verify if the provided signature is valid for the specified data. The public key +is provided by the system software. + +Note: + The ECDSA algorithm is used to verify a signature. + +Parameters: + pData Pointer to data the signature has to be verified for. Data length: KIRK_ECDSA_SRC_DATA_LEN. + pSig Pointer to the signature to verify. Signature length: KIRK_ECDSA_SIG_LEN. + +Returns: + 0 on success, otherwise < 0. +*/ +static s32 sceDdrdb_F013F8BF(u32 pDataPtr, u32 pSigPtr) { + ERROR_LOG(HLE, "UNIMPL %s(%08x, %08x)", __FUNCTION__, pDataPtr, pSigPtr); + + return 0; +} + + + const HLEFunction sceOpenPSID[] = { - {0XC69BEBCE, &WrapI_U, "sceOpenPSIDGetOpenPSID", 'i', "x"}, + {0XC69BEBCE, &WrapI_U, "sceOpenPSIDGetOpenPSID", 'i', "x" }, }; void Register_sceOpenPSID() @@ -63,12 +88,24 @@ void Register_sceOpenPSID() RegisterModule("sceOpenPSID", ARRAY_SIZE(sceOpenPSID), sceOpenPSID); } +// According to https://playstationdev.wiki/pspprxlibraries/5.00/kd/openpsid.xml +// sceOpenPSID_driver library seems to contains a duplicate of sceOpenPSIDGetOpenPSID just like sceOpenPSID library, is this allowed here? const HLEFunction sceOpenPSID_driver[] = { - {0x19D579F0, &WrapI_UU, "sceOpenPSID_driver_0x19D579F0", 'i', "xx" }, + {0x19D579F0, &WrapI_UU, "sceOpenPSIDGetPSID", 'i', "xx" }, + {0XC69BEBCE, &WrapI_U, "sceOpenPSIDGetOpenPSID", 'i', "x" }, }; void Register_sceOpenPSID_driver() { RegisterModule("sceOpenPSID_driver", ARRAY_SIZE(sceOpenPSID_driver), sceOpenPSID_driver); } +const HLEFunction sceDdrdb[] = +{ + {0xF013F8BF, &WrapI_UU, "sceDdrdb_F013F8BF", 'i', "xx" }, +}; + +void Register_sceDdrdb() +{ + RegisterModule("sceDdrdb", ARRAY_SIZE(sceDdrdb), sceDdrdb); +} diff --git a/Core/HLE/sceOpenPSID.h b/Core/HLE/sceOpenPSID.h index 24855ef4a4..8dd37418a0 100644 --- a/Core/HLE/sceOpenPSID.h +++ b/Core/HLE/sceOpenPSID.h @@ -17,7 +17,19 @@ #pragma once -void __sceOpenPSIDInit(); +#define PSP_DNAS_USER_DATA_MAX_LEN 2048 +#define PSP_OPENPSID_SIZE 16 + +typedef struct SceOpenPSID { + u8 data[PSP_OPENPSID_SIZE]; +} SceOpenPSID; + +void __OpenPSIDInit(); +void __OpenPSIDShutdown(); void Register_sceOpenPSID(); -void Register_sceOpenPSID_driver(); \ No newline at end of file +void Register_sceOpenPSID_driver(); +void Register_sceDdrdb(); + +static int sceOpenPSIDGetOpenPSID(u32 OpenPSIDPtr); +static int sceOpenPSIDGetPSID(u32 OpenPSIDPtr, u32 unknown);