From 827c6b6ddffc786ccfc0c954898e5809a3640b51 Mon Sep 17 00:00:00 2001 From: Rambo6Glaz <39063367+EpicUsername12@users.noreply.github.com> Date: Sun, 19 Nov 2023 05:11:06 +0100 Subject: [PATCH] Implement IFSDeviceOperator "ChallengeCardExistence" and "GetGameCardDeviceCertificate" --- nx/include/switch/services/fs.h | 2 ++ nx/source/services/fs.c | 29 +++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/nx/include/switch/services/fs.h b/nx/include/switch/services/fs.h index d1e22cf0..0cc7d60f 100644 --- a/nx/include/switch/services/fs.h +++ b/nx/include/switch/services/fs.h @@ -650,7 +650,9 @@ Result fsDeviceOperatorIsGameCardInserted(FsDeviceOperator* d, bool* out); Result fsDeviceOperatorGetGameCardHandle(FsDeviceOperator* d, FsGameCardHandle* out); Result fsDeviceOperatorGetGameCardUpdatePartitionInfo(FsDeviceOperator* d, const FsGameCardHandle* handle, FsGameCardUpdatePartitionInfo* out); Result fsDeviceOperatorGetGameCardAttribute(FsDeviceOperator* d, const FsGameCardHandle* handle, u8 *out); +Result fsDeviceOperatorGetGameCardDeviceCertificate(FsDeviceOperator* d, const FsGameCardHandle* handle, void* dst, size_t dst_size, s64 size); Result fsDeviceOperatorGetGameCardIdSet(FsDeviceOperator* d, void* dst, size_t dst_size, s64 size); Result fsDeviceOperatorGetGameCardErrorReportInfo(FsDeviceOperator* d, FsGameCardErrorReportInfo* out); Result fsDeviceOperatorGetGameCardDeviceId(FsDeviceOperator* d, void* dst, size_t dst_size, s64 size); +Result fsDeviceOperatorChallengeCardExistence(FsDeviceOperator* d, const FsGameCardHandle* handle, void* dst, size_t dst_size, void* seed, size_t seed_size, void* value, size_t value_size); void fsDeviceOperatorClose(FsDeviceOperator* d); diff --git a/nx/source/services/fs.c b/nx/source/services/fs.c index 946a5a74..f4d5612c 100644 --- a/nx/source/services/fs.c +++ b/nx/source/services/fs.c @@ -1226,6 +1226,17 @@ Result fsDeviceOperatorGetGameCardAttribute(FsDeviceOperator* d, const FsGameCar return _fsObjectDispatchInOut(&d->s, 205, *handle, *out); } +Result fsDeviceOperatorGetGameCardDeviceCertificate(FsDeviceOperator* d, const FsGameCardHandle* handle, void* dst, size_t dst_size, s64 size) { + const struct { + FsGameCardHandle handle; + s64 buffer_size; + } in = { *handle, size }; + + return _fsObjectDispatchIn(&d->s, 206, in, + .buffer_attrs = { SfBufferAttr_HipcMapAlias | SfBufferAttr_Out }, + .buffers = { { dst, dst_size } }); +} + Result fsDeviceOperatorGetGameCardIdSet(FsDeviceOperator* d, void* dst, size_t dst_size, s64 size) { return _fsCmdInSizeOutBuffer(&d->s, dst, dst_size, size, 208); } @@ -1242,6 +1253,24 @@ Result fsDeviceOperatorGetGameCardDeviceId(FsDeviceOperator* d, void* dst, size_ return _fsCmdInSizeOutBuffer(&d->s, dst, dst_size, size, 218); } +Result fsDeviceOperatorChallengeCardExistence(FsDeviceOperator* d, const FsGameCardHandle* handle, void* dst, size_t dst_size, void* seed, size_t seed_size, void* value, size_t value_size) { + if (hosversionBefore(8,0,0)) + return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); + + return _fsObjectDispatchIn(&d->s, 219, *handle, + .buffer_attrs = { + SfBufferAttr_HipcMapAlias | SfBufferAttr_Out, + SfBufferAttr_HipcMapAlias | SfBufferAttr_In, + SfBufferAttr_HipcMapAlias | SfBufferAttr_In, + }, + .buffers = { + { dst, dst_size }, + { seed, seed_size }, + { value, value_size }, + }, + ); +} + void fsDeviceOperatorClose(FsDeviceOperator* d) { _fsObjectClose(&d->s); }