Difference between revisions of "ACT Services"
DaniElectra (talk | contribs) (Add more ACT commands) |
DaniElectra (talk | contribs) (Move data blocks to main page of ACT) |
||
Line 1: | Line 1: | ||
[[Category:Services]] | [[Category:Services]] | ||
− | The ACT module handles NNID accounts. | + | The ACT module handles NNID accounts. This module behaves very similarly to the [https://github.com/devkitPro/wut/blob/master/cafe/nn_act.def Wii U] implementation (nn::act) |
= ACT service "act:u" = | = ACT service "act:u" = | ||
Line 363: | Line 363: | ||
This is the service used by regular applications. | This is the service used by regular applications. | ||
− | =HTTPS Requests= | + | = Account slots = |
+ | |||
+ | Like the friends sysmodule, the ACT module supports multiple accounts internally, although this functionality is not exposed to the users. Unlike the Wii U which supports up to 12 accounts, the 3DS only has 8 account slots. | ||
+ | |||
+ | Some commands require require the account slot as an argument, which is 1-indexed. The value for using the current loaded account is 0xFE. | ||
+ | |||
+ | = DataBlocks = | ||
+ | |||
+ | Data blocks can be accessed from specific commands depending on the data that is requested. These follow a similar order to the Wii U [https://github.com/decaf-emu/decaf-emu/blob/master/src/libdecaf/src/nn/act/nn_act_enum.h ACTInfoTypes]. | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! BlkID | ||
+ | ! Size | ||
+ | ! Command needed | ||
+ | ! Description | ||
+ | |- | ||
+ | | 0x1 | ||
+ | | 0x1 | ||
+ | | [[ACTU:GetCommonInfo|GetCommonInfo]] | ||
+ | | Number of accounts | ||
+ | |- | ||
+ | | 0x2 | ||
+ | | 0x1 | ||
+ | | [[ACTU:GetCommonInfo|GetCommonInfo]] | ||
+ | | Current account slot | ||
+ | |- | ||
+ | | 0x3 | ||
+ | | 0x1 | ||
+ | | [[ACTU:GetCommonInfo|GetCommonInfo]] | ||
+ | | Default account slot | ||
+ | |- | ||
+ | | 0x4 | ||
+ | | 0x8 | ||
+ | | [[ACTU:GetCommonInfo|GetCommonInfo]] | ||
+ | | ? | ||
+ | |- | ||
+ | | 0x5 | ||
+ | | 0x4 | ||
+ | | [[ACTU:GetAccountDataBlock|GetAccountInfo]] | ||
+ | | PersistentId | ||
+ | |- | ||
+ | | 0x6 | ||
+ | | 0x8 | ||
+ | | [[ACTU:GetCommonInfo|GetCommonInfo]]/[[ACTU:GetAccountDataBlock|GetAccountInfo]] | ||
+ | | CommonTransferableIdBase on GetCommonInfo / TransferableIdBase on GetAccountInfo | ||
+ | |- | ||
+ | | 0x7 | ||
+ | | 0x60 | ||
+ | | [[ACTU:GetAccountDataBlock|GetAccountInfo]] | ||
+ | | [[Mii#Mii_format|MiiData]] | ||
+ | |- | ||
+ | | 0x8 | ||
+ | | 0x11 | ||
+ | | [[ACTU:GetAccountDataBlock|GetAccountInfo]] | ||
+ | | AccountId (ASCII NUL-terminated Nintendo Network ID) | ||
+ | |- | ||
+ | | 0x9 | ||
+ | | 0x101 | ||
+ | | AcquireAccountInfo | ||
+ | | Mail address | ||
+ | |- | ||
+ | | 0xA | ||
+ | | 0x4 | ||
+ | | [[ACTU:GetAccountDataBlock|GetAccountInfo]] | ||
+ | | Birthday {u16 year; u8 month; u8 day;} | ||
+ | |- | ||
+ | | 0xB | ||
+ | | 0x3 | ||
+ | | [[ACTU:GetAccountDataBlock|GetAccountInfo]] | ||
+ | | ASCII NUL-terminated Country Name | ||
+ | |- | ||
+ | | 0xC | ||
+ | | 0x4 | ||
+ | | [[ACTU:GetAccountDataBlock|GetAccountInfo]] | ||
+ | | PrincipalId | ||
+ | |- | ||
+ | | 0xE | ||
+ | | 0x1 | ||
+ | | [[ACTU:GetAccountDataBlock|GetAccountInfo]] | ||
+ | | IsPasswordCacheEnabled | ||
+ | |- | ||
+ | | 0xF | ||
+ | | 0x1 | ||
+ | | [[ACTU:GetAccountDataBlock|GetAccountInfo]] | ||
+ | | ? | ||
+ | |- | ||
+ | | 0x11 | ||
+ | | 0xA0 | ||
+ | | [[ACTU:GetAccountDataBlock|GetAccountInfo]] | ||
+ | | struct{u32 PersistentID; u32 padding; u64 TransferableIDBase; u8[0x60] MiiData; char16_t[0xB] MachinUserName?; char[0x11] AccountID; u8 padding; struct{u16 year; u8 month; u8 day;}Birthday; u32 PrincipalID;} | ||
+ | |- | ||
+ | | 0x12 | ||
+ | | 0x4 | ||
+ | | [[ACTU:GetAccountDataBlock|GetAccountInfo]] | ||
+ | | ? | ||
+ | |- | ||
+ | | 0x13 | ||
+ | | 0x1 | ||
+ | | [[ACTU:GetAccountDataBlock|GetAccountInfo]] | ||
+ | | Gender | ||
+ | |- | ||
+ | | 0x14 | ||
+ | | 0x1 | ||
+ | | [[ACTU:GetAccountDataBlock|GetAccountInfo]] | ||
+ | | ? | ||
+ | |- | ||
+ | | 0x15 | ||
+ | | 0x11 | ||
+ | | [[ACTU:GetAccountDataBlock|GetAccountInfo]] | ||
+ | | AssignedAccountId (ASCII NUL-terminated Nintendo Network ID) | ||
+ | |- | ||
+ | | 0x16 | ||
+ | | 0x1 | ||
+ | | [[ACTU:GetAccountDataBlock|GetAccountInfo]] | ||
+ | | ParentalControlSlotNo | ||
+ | |- | ||
+ | | 0x17 | ||
+ | | 0x4 | ||
+ | | [[ACTU:GetAccountDataBlock|GetAccountInfo]] | ||
+ | | SimpleAddressId? ([[Config_Savegame#CountryInfo|CountryInfo]]) | ||
+ | |- | ||
+ | | 0x19 | ||
+ | | 0x8 | ||
+ | | [[ACTU:GetAccountDataBlock|GetAccountInfo]] | ||
+ | | UtcOffset | ||
+ | |- | ||
+ | | 0x1A | ||
+ | | 0x1 | ||
+ | | [[ACTU:GetAccountDataBlock|GetAccountInfo]] | ||
+ | | ? | ||
+ | |- | ||
+ | | 0x1B | ||
+ | | 0x16 | ||
+ | | [[ACTU:GetAccountDataBlock|GetAccountInfo]] | ||
+ | | MiiName (NUL-terminated UTF-16 Mii name) | ||
+ | |- | ||
+ | | 0x1C | ||
+ | | 0x11 | ||
+ | | [[ACTU:GetAccountDataBlock|GetAccountInfo]] | ||
+ | | AccountId? (ASCII NUL-terminated Nintendo Network ID) | ||
+ | |- | ||
+ | | 0x1D | ||
+ | | 0x1 | ||
+ | | [[ACTU:GetAccountDataBlock|GetAccountInfo]] | ||
+ | | ? | ||
+ | |- | ||
+ | | 0x1E | ||
+ | | 0x41 | ||
+ | | [[ACTU:GetAccountDataBlock|GetAccountInfo]] | ||
+ | | TimeZoneId (ASCII Time Zone Location) | ||
+ | |- | ||
+ | | 0x1F | ||
+ | | 0x1 | ||
+ | | [[ACTU:GetAccountDataBlock|GetAccountInfo]] | ||
+ | | ? | ||
+ | |- | ||
+ | | 0x20 | ||
+ | | 0x1 | ||
+ | | [[ACTU:GetAccountDataBlock|GetAccountInfo]] | ||
+ | | IsMailAddressValidated | ||
+ | |- | ||
+ | | 0x21 | ||
+ | | 0x4C | ||
+ | | [[ACTU:GetAccountDataBlock|GetAccountInfo]] | ||
+ | | ? | ||
+ | |- | ||
+ | | 0x24 | ||
+ | | 0x1 | ||
+ | | [[ACTU:GetAccountDataBlock|GetAccountInfo]] | ||
+ | | ? | ||
+ | |- | ||
+ | | 0x25 | ||
+ | | 0x101 | ||
+ | | [[ACTU:GetAccountDataBlock|GetAccountInfo]] | ||
+ | | MiiImageUrl (ASCII NUL-terminated URL to account mii image) | ||
+ | |- | ||
+ | | 0x26 | ||
+ | | 0x4 | ||
+ | | [[ACTU:GetAccountDataBlock|GetAccountInfo]] | ||
+ | | AssignedPrincipalId | ||
+ | |- | ||
+ | | 0x27 | ||
+ | | 0x4 | ||
+ | | [[ACTU:GetAccountDataBlock|GetAccountInfo]] | ||
+ | | ? (Only accessible with param[1] = 0xFE) | ||
+ | |- | ||
+ | | 0x28 | ||
+ | | 0x24 | ||
+ | | [[ACTU:GetAccountDataBlock|GetAccountInfo]] | ||
+ | | struct{char[0x21] NnasSubDomain?; char[0x3] NnasNfsEnv;} | ||
+ | |- | ||
+ | | 0x29 | ||
+ | | 0x24 | ||
+ | | [[ACTU:GetCommonInfo|GetCommonInfo]] | ||
+ | | struct{char[0x21] DefaultNnasSubDomain?; char[0x3] DefaultNnasNfsEnv;} | ||
+ | |- | ||
+ | | 0x2A | ||
+ | | 0x8 | ||
+ | | [[ACTU:GetCommonInfo|GetCommonInfo]] | ||
+ | | ? | ||
+ | |- | ||
+ | | 0x2B | ||
+ | | 0x1 | ||
+ | | [[ACTU:GetAccountDataBlock|GetAccountInfo]] | ||
+ | | FpLocalAccountId | ||
+ | |- | ||
+ | | 0x2C | ||
+ | | 0x2 | ||
+ | | [[ACTU:GetAccountDataBlock|GetAccountInfo]] | ||
+ | | Age | ||
+ | |- | ||
+ | | 0x2D | ||
+ | | 0x1 | ||
+ | | [[ACTU:GetAccountDataBlock|GetAccountInfo]] | ||
+ | | IsEnabledReceiveAds | ||
+ | |- | ||
+ | | 0x2E | ||
+ | | 0x1 | ||
+ | | [[ACTU:GetAccountDataBlock|GetAccountInfo]] | ||
+ | | IsOffDeviceAccessEnabled | ||
+ | |- | ||
+ | | 0x2F | ||
+ | | 0x4 | ||
+ | | [[ACTU:GetAccountDataBlock|GetAccountInfo]] | ||
+ | | SimpleAddressId ([[Config_Savegame#CountryInfo|CountryInfo]]) | ||
+ | |} | ||
+ | |||
+ | = HTTPS Requests = | ||
With each request, ACT-sysmodule specifies request-header "X-Nintendo-Device-Model". This is the only *dedicated* request-header that's contains anything Old3DS/New3DS specific. This was implemented with [[9.0.0-20|9.0.0-X]], and presumably [[8.1.0-0_New3DS]]. The value is from a string initialized during ACT-sysmodule startup. The value-string is the [[Cfg:GetSystemModel|codename]] string for all 5 of the model values from [[Cfg:GetSystemModel]]. When the output from GetSystemModel is >=5(switch statement default case), it runs this: "len = snprintf(outstr, outmaxsize, "3DS-%u", model);" | With each request, ACT-sysmodule specifies request-header "X-Nintendo-Device-Model". This is the only *dedicated* request-header that's contains anything Old3DS/New3DS specific. This was implemented with [[9.0.0-20|9.0.0-X]], and presumably [[8.1.0-0_New3DS]]. The value is from a string initialized during ACT-sysmodule startup. The value-string is the [[Cfg:GetSystemModel|codename]] string for all 5 of the model values from [[Cfg:GetSystemModel]]. When the output from GetSystemModel is >=5(switch statement default case), it runs this: "len = snprintf(outstr, outmaxsize, "3DS-%u", model);" | ||
− | ==Trusted Root CAs== | + | == Trusted Root CAs == |
ACT module uses a [[HTTP_Services|RootCertChain]] for all HTTPS requests, the only trusted root CA is [[SSLC:RootCertChainAddDefaultCert|default]] CertID 0x3. | ACT module uses a [[HTTP_Services|RootCertChain]] for all HTTPS requests, the only trusted root CA is [[SSLC:RootCertChainAddDefaultCert|default]] CertID 0x3. | ||
− | =New3DS= | + | = New3DS = |
Even though ACT-sysmodule uses [[PTM_Services|ptm:s]], it doesn't use CheckNew3DS at all. | Even though ACT-sysmodule uses [[PTM_Services|ptm:s]], it doesn't use CheckNew3DS at all. |
Revision as of 23:17, 14 October 2023
The ACT module handles NNID accounts. This module behaves very similarly to the Wii U implementation (nn::act)
ACT service "act:u"
These commands are common to both act:u and act:a
Command Header | Available since system-version | Description |
---|---|---|
0x00010084 | Initialize | |
0x00020040 | GetErrorCode | |
0x00030000 | GetLastResponseCode | |
0x00040000 | ? | |
0x00050082 | GetCommonInfo | |
0x000600C2 | GetAccountDataBlock/GetAccountInfo | |
0x00070082 | GetResultAsync | |
0x000800C2 | GetMiiImageData | |
0x00090180 | SetNfsPassword | |
0x000A0040? | ? | |
0x000B0042 | AcquireEulaList | |
0x000C0082 | AcquireTimeZoneList | |
0x000D0040 | GenerateUuid | |
0x000E0080 | ? | |
0x000F0140 | FindSlotNoByUuid | |
0x00100000 | ? | |
0x00110080 | GetTransferableId | |
0x00120102 | AcquireNexServiceToken | |
0x00130002 | GetNexServiceToken | |
0x00140382 | AcquireIndependentServiceToken | |
0x00150002 | GetIndependentServiceToken | |
0x00160082 | AcquireAccountInfo | |
0x00170084 | AcquireAccountIdByPrincipalId | |
0x00180044 | AcquirePrincipalIdByAccountId | |
0x00190044 | AcquireMii | |
0x001A0042 | AcquireAccountInfoEx | |
0x001B0084 | AcquireOtherTypePrincipalID? | |
0x001C0342 | ? | |
0x001D0004 | InquireMailAddress | |
0x001E0082 | AcquireEula | |
0x001F0082 | AcquireEulaLanguageList |
ACT service "act:a"
These commands are exclusive to act:a
Command Header | Available since system-version | Description |
---|---|---|
0x04010080 | ? | |
0x04020000 | CreateConsoleAccount | |
0x04030040 | CommitConsoleAccount | |
0x04040080 | UnbindServerAccount | |
0x04050040 | DeleteConsoleAccount | |
0x04060240 | ? | |
0x04070000 | ? | |
0x04080080 | EnableAccountPasswordCache | |
0x04090040 | SetDefaultAccount | |
0x040A0040 | ReplaceAccountId | |
0x040B0040 | GetSupportContext | |
0x040C0100 | ? | |
0x040D00C0 | ? | |
0x040E02C0 | ? | |
0x040F0280 | ? | |
0x04100040 | ? | |
0x04110040 | ? | |
0x041207C0 | UpdateMii | |
0x041300C2 | UpdateMiiImage | |
0x04140182 | InquireAccountIdAvailability | |
0x04150EC4 | BindToNewServerAccount | |
0x041602C4 | BindToExistentServerAccount | |
0x041702C4 | InquireBindingToExistentServerAccount | |
0x04180042 | ? | |
0x04190042 | ? | |
0x041A01C2 | AcquireAccountTokenEx | |
0x041B0142 | AgreeEula | |
0x041C0042 | SyncAccountInfo | |
0x041D0080 | ? | |
0x041E0182 | UpdateAccountPassword | |
0x041F0042 | ReissueAccountPassword | |
0x04200180 | SetAccountPasswordInput | |
0x04210042 | UploadMii | |
0x04220042 | ? | |
0x04230082 | ValidateMailAddress | |
0x04240044 | ? | |
0x04250042 | SendConfirmationMail | |
0x04260044 | ? | |
0x04270084 | ? | |
0x04280044 | ApproveByCreditCard | |
0x04290082 | SendCoppaCodeMail | |
0x042A0080 | ? | |
0x042B01C4 | ? | |
0x042C0042 | ? | |
0x042D0042 | ? | |
0x042E0080 | ? | |
0x042F0084 | UpdateAccountInfoEx | |
0x04300044 | UpdateAccountMailAddress | |
0x04310042 | ? | |
0x04320042 | ? | |
0x04330042 | ? | |
0x04340003 | ? | |
0x04350042 | DeleteServerAccount |
This is the service used by regular applications.
Account slots
Like the friends sysmodule, the ACT module supports multiple accounts internally, although this functionality is not exposed to the users. Unlike the Wii U which supports up to 12 accounts, the 3DS only has 8 account slots.
Some commands require require the account slot as an argument, which is 1-indexed. The value for using the current loaded account is 0xFE.
DataBlocks
Data blocks can be accessed from specific commands depending on the data that is requested. These follow a similar order to the Wii U ACTInfoTypes.
BlkID | Size | Command needed | Description |
---|---|---|---|
0x1 | 0x1 | GetCommonInfo | Number of accounts |
0x2 | 0x1 | GetCommonInfo | Current account slot |
0x3 | 0x1 | GetCommonInfo | Default account slot |
0x4 | 0x8 | GetCommonInfo | ? |
0x5 | 0x4 | GetAccountInfo | PersistentId |
0x6 | 0x8 | GetCommonInfo/GetAccountInfo | CommonTransferableIdBase on GetCommonInfo / TransferableIdBase on GetAccountInfo |
0x7 | 0x60 | GetAccountInfo | MiiData |
0x8 | 0x11 | GetAccountInfo | AccountId (ASCII NUL-terminated Nintendo Network ID) |
0x9 | 0x101 | AcquireAccountInfo | Mail address |
0xA | 0x4 | GetAccountInfo | Birthday {u16 year; u8 month; u8 day;} |
0xB | 0x3 | GetAccountInfo | ASCII NUL-terminated Country Name |
0xC | 0x4 | GetAccountInfo | PrincipalId |
0xE | 0x1 | GetAccountInfo | IsPasswordCacheEnabled |
0xF | 0x1 | GetAccountInfo | ? |
0x11 | 0xA0 | GetAccountInfo | struct{u32 PersistentID; u32 padding; u64 TransferableIDBase; u8[0x60] MiiData; char16_t[0xB] MachinUserName?; char[0x11] AccountID; u8 padding; struct{u16 year; u8 month; u8 day;}Birthday; u32 PrincipalID;} |
0x12 | 0x4 | GetAccountInfo | ? |
0x13 | 0x1 | GetAccountInfo | Gender |
0x14 | 0x1 | GetAccountInfo | ? |
0x15 | 0x11 | GetAccountInfo | AssignedAccountId (ASCII NUL-terminated Nintendo Network ID) |
0x16 | 0x1 | GetAccountInfo | ParentalControlSlotNo |
0x17 | 0x4 | GetAccountInfo | SimpleAddressId? (CountryInfo) |
0x19 | 0x8 | GetAccountInfo | UtcOffset |
0x1A | 0x1 | GetAccountInfo | ? |
0x1B | 0x16 | GetAccountInfo | MiiName (NUL-terminated UTF-16 Mii name) |
0x1C | 0x11 | GetAccountInfo | AccountId? (ASCII NUL-terminated Nintendo Network ID) |
0x1D | 0x1 | GetAccountInfo | ? |
0x1E | 0x41 | GetAccountInfo | TimeZoneId (ASCII Time Zone Location) |
0x1F | 0x1 | GetAccountInfo | ? |
0x20 | 0x1 | GetAccountInfo | IsMailAddressValidated |
0x21 | 0x4C | GetAccountInfo | ? |
0x24 | 0x1 | GetAccountInfo | ? |
0x25 | 0x101 | GetAccountInfo | MiiImageUrl (ASCII NUL-terminated URL to account mii image) |
0x26 | 0x4 | GetAccountInfo | AssignedPrincipalId |
0x27 | 0x4 | GetAccountInfo | ? (Only accessible with param[1] = 0xFE) |
0x28 | 0x24 | GetAccountInfo | struct{char[0x21] NnasSubDomain?; char[0x3] NnasNfsEnv;} |
0x29 | 0x24 | GetCommonInfo | struct{char[0x21] DefaultNnasSubDomain?; char[0x3] DefaultNnasNfsEnv;} |
0x2A | 0x8 | GetCommonInfo | ? |
0x2B | 0x1 | GetAccountInfo | FpLocalAccountId |
0x2C | 0x2 | GetAccountInfo | Age |
0x2D | 0x1 | GetAccountInfo | IsEnabledReceiveAds |
0x2E | 0x1 | GetAccountInfo | IsOffDeviceAccessEnabled |
0x2F | 0x4 | GetAccountInfo | SimpleAddressId (CountryInfo) |
HTTPS Requests
With each request, ACT-sysmodule specifies request-header "X-Nintendo-Device-Model". This is the only *dedicated* request-header that's contains anything Old3DS/New3DS specific. This was implemented with 9.0.0-X, and presumably 8.1.0-0_New3DS. The value is from a string initialized during ACT-sysmodule startup. The value-string is the codename string for all 5 of the model values from Cfg:GetSystemModel. When the output from GetSystemModel is >=5(switch statement default case), it runs this: "len = snprintf(outstr, outmaxsize, "3DS-%u", model);"
Trusted Root CAs
ACT module uses a RootCertChain for all HTTPS requests, the only trusted root CA is default CertID 0x3.
New3DS
Even though ACT-sysmodule uses ptm:s, it doesn't use CheckNew3DS at all.