diff --git a/nx/include/switch/services/set.h b/nx/include/switch/services/set.h index 2ca1df32..0ba0f920 100644 --- a/nx/include/switch/services/set.h +++ b/nx/include/switch/services/set.h @@ -271,6 +271,36 @@ void setExit(void); /// Gets the Service object for the actual set service session. Service* setGetServiceSession(void); +/// Initialize setcal. +Result setcalInitialize(void); + +/// Exit setcal. +void setcalExit(void); + +/// Gets the Service object for the actual setcal service session. +Service* setcalGetServiceSession(void); + +/// Gets EciDeviceCertificate of size 0x180. +Result setcalGetEciDeviceCertificate(void *certificate, size_t size); + +/// Gets EticketDeviceCertificate of size 0x240. +Result setcalGetEticketDeviceCertificate(void *certificate, size_t size); + +/// Gets SslKey of size 0x134. +Result setcalGetSslKey(void *key, size_t size); + +/// Gets SslCertificate of size 0x804. +Result setcalGetSslCertificate(void *certificate, size_t size); + +/// Gets GameCardKey of size 0x134. +Result setcalGetGameCardKey(void *key, size_t size); + +/// Gets GameCardCertificate of size 0x404. +Result setcalGetGameCardCertificate(void *certificate, size_t size); + +/// Gets EticketDeviceKey of size 0x244. +Result setcalGetEticketDeviceKey(void *key, size_t size); + /// Converts LanguageCode to \ref SetLanguage. Result setMakeLanguage(u64 LanguageCode, SetLanguage *Language); diff --git a/nx/source/services/set.c b/nx/source/services/set.c index 938b9c5f..5eb7d7b0 100644 --- a/nx/source/services/set.c +++ b/nx/source/services/set.c @@ -7,6 +7,7 @@ static Service g_setSrv; static Service g_setsysSrv; +static Service g_setcalSrv; static bool g_setLanguageCodesInitialized; static u64 g_setLanguageCodes[0x40]; @@ -44,6 +45,20 @@ Service* setsysGetServiceSession(void) { return &g_setsysSrv; } +NX_GENERATE_SERVICE_GUARD(setcal); + +Result _setcalInitialize(void) { + return smGetService(&g_setcalSrv, "set:cal"); +} + +void _setcalCleanup(void) { + serviceClose(&g_setcalSrv); +} + +Service* setcalGetServiceSession(void) { + return &g_setcalSrv; +} + static Result _setCmdGetHandle(Service* srv, Handle* handle_out, u32 cmd_id) { return serviceDispatch(srv, cmd_id, .out_handle_attrs = { SfOutHandleAttr_HipcCopy }, @@ -99,6 +114,55 @@ static Result _setCmdInU64NoOut(Service* srv, u64 inval, u32 cmd_id) { return serviceDispatchIn(srv, cmd_id, inval); } +Result setcalGetEciDeviceCertificate(void *certificate, size_t size) { + return serviceDispatch(&g_setcalSrv, 14, + .buffer_attrs = { SfBufferAttr_HipcMapAlias | SfBufferAttr_Out }, + .buffers = { { certificate, size } }, + ); +} + +Result setcalGetEticketDeviceCertificate(void *certificate, size_t size) { + return serviceDispatch(&g_setcalSrv, 15, + .buffer_attrs = { SfBufferAttr_HipcMapAlias | SfBufferAttr_Out }, + .buffers = { { certificate, size } }, + ); +} + +Result setcalGetSslKey(void *key, size_t size) { + return serviceDispatch(&g_setcalSrv, 16, + .buffer_attrs = { SfBufferAttr_HipcMapAlias | SfBufferAttr_Out }, + .buffers = { { key, size } }, + ); +} + +Result setcalGetSslCertificate(void *certificate, size_t size) { + return serviceDispatch(&g_setcalSrv, 17, + .buffer_attrs = { SfBufferAttr_HipcMapAlias | SfBufferAttr_Out }, + .buffers = { { certificate, size } }, + ); +} + +Result setcalGetGameCardKey(void *key, size_t size) { + return serviceDispatch(&g_setcalSrv, 18, + .buffer_attrs = { SfBufferAttr_HipcMapAlias | SfBufferAttr_Out }, + .buffers = { { key, size } }, + ); +} + +Result setcalGetGameCardCertificate(void *certificate, size_t size) { + return serviceDispatch(&g_setcalSrv, 19, + .buffer_attrs = { SfBufferAttr_HipcMapAlias | SfBufferAttr_Out }, + .buffers = { { certificate, size } }, + ); +} + +Result setcalGetEticketDeviceKey(void *key, size_t size) { + return serviceDispatch(&g_setcalSrv, 21, + .buffer_attrs = { SfBufferAttr_HipcMapAlias | SfBufferAttr_Out }, + .buffers = { { key, size } }, + ); +} + static Result setInitializeLanguageCodesCache(void) { if (g_setLanguageCodesInitialized) return 0; Result rc = 0;