diff --git a/nx/include/switch/services/fs.h b/nx/include/switch/services/fs.h index d1e22cf0d..0cc7d60f7 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 946a5a742..f4d5612c1 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); }