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 18: |
Line 18: |
| | 0x00020040 | | | 0x00020040 |
| | | | | |
− | | GetErrorCode | + | | [[ACT:GetErrorCode|GetErrorCode]] |
| + | |- |
| + | | 0x00030000 |
| + | | |
| + | | GetLastResponseCode |
| + | |- |
| + | | 0x00040000 |
| + | | |
| + | | ? |
| + | |- |
| + | | 0x00050082 |
| + | | |
| + | | [[ACTU:GetCommonInfo|GetCommonInfo]] |
| |- | | |- |
| | 0x000600C2 | | | 0x000600C2 |
| | | | | |
− | | [[ACTU:GetAccountDataBlock|GetAccountDataBlock]] | + | | [[ACTU:GetAccountDataBlock|GetAccountDataBlock]]/GetAccountInfo |
| + | |- |
| + | | 0x00070082 |
| + | | |
| + | | GetResultAsync |
| + | |- |
| + | | 0x000800C2 |
| + | | |
| + | | GetMiiImageData |
| + | |- |
| + | | 0x00090180 |
| + | | |
| + | | SetNfsPassword |
| + | |- |
| + | | 0x000A0040? |
| + | | |
| + | | ? |
| |- | | |- |
| | 0x000B0042 | | | 0x000B0042 |
| | | | | |
| | AcquireEulaList | | | AcquireEulaList |
| + | |- |
| + | | 0x000C0082 |
| + | | |
| + | | AcquireTimeZoneList |
| |- | | |- |
| | 0x000D0040 | | | 0x000D0040 |
| | | | | |
| | GenerateUuid | | | 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 |
| + | |- |
| + | | 0x00200382 |
| + | | |
| + | | ? |
| + | |- |
| + | | 0x00210002 |
| + | | |
| + | | ? |
| + | |- |
| + | | 0x00220342 |
| + | | |
| + | | ? |
| + | |- |
| |} | | |} |
| | | |
Line 41: |
Line 158: |
| ! Available since system-version | | ! Available since system-version |
| ! Description | | ! Description |
| + | |- |
| + | | 0x04010080 |
| + | | |
| + | | ? |
| + | |- |
| + | | 0x04020000 |
| + | | |
| + | | [[ACTA:CreateConsoleAccount|CreateConsoleAccount]] |
| + | |- |
| + | | 0x04030040 |
| + | | |
| + | | CommitConsoleAccount |
| + | |- |
| + | | 0x04040080 |
| + | | |
| + | | [[ACTA:UnbindServerAccount|UnbindServerAccount]] |
| + | |- |
| + | | 0x04050040 |
| + | | |
| + | | DeleteConsoleAccount |
| + | |- |
| + | | 0x04060240 |
| + | | |
| + | | ? |
| + | |- |
| + | | 0x04070000 |
| + | | |
| + | | ? |
| + | |- |
| + | | 0x04080080 |
| + | | |
| + | | EnableAccountPasswordCache |
| + | |- |
| + | | 0x04090040 |
| + | | |
| + | | [[ACTA:SetDefaultAccount|SetDefaultAccount]] |
| + | |- |
| + | | 0x040A0040 |
| + | | |
| + | | ReplaceAccountId |
| + | |- |
| + | | 0x040B0040 |
| + | | |
| + | | GetSupportContext |
| + | |- |
| + | | 0x040C0100 |
| + | | |
| + | | ? |
| + | |- |
| + | | 0x040D00C0 |
| + | | |
| + | | ? |
| + | |- |
| + | | 0x040E02C0 |
| + | | |
| + | | ? |
| + | |- |
| + | | 0x040F0280 |
| + | | |
| + | | ? |
| + | |- |
| + | | 0x04100040 |
| + | | |
| + | | ? |
| + | |- |
| + | | 0x04110040 |
| + | | |
| + | | ? |
| + | |- |
| + | | 0x041207C0 |
| + | | |
| + | | [[ACTA:UpdateMii|UpdateMii]] |
| |- | | |- |
| | 0x041300C2 | | | 0x041300C2 |
| | | | | |
| | UpdateMiiImage | | | UpdateMiiImage |
| + | |- |
| + | | 0x04140182 |
| + | | |
| + | | InquireAccountIdAvailability |
| + | |- |
| + | | 0x04150EC4 |
| + | | |
| + | | BindToNewServerAccount |
| + | |- |
| + | | 0x041602C4 |
| + | | |
| + | | BindToExistentServerAccount |
| + | |- |
| + | | 0x041702C4 |
| + | | |
| + | | InquireBindingToExistentServerAccount |
| + | |- |
| + | | 0x04180042 |
| + | | |
| + | | ? |
| + | |- |
| + | | 0x04190042 |
| + | | |
| + | | ? |
| + | |- |
| + | | 0x041A01C2 |
| + | | |
| + | | AcquireAccountTokenEx |
| |- | | |- |
| | 0x041B0142 | | | 0x041B0142 |
| | | | | |
| | AgreeEula | | | AgreeEula |
| + | |- |
| + | | 0x041C0042 |
| + | | |
| + | | SyncAccountInfo |
| + | |- |
| + | | 0x041D0080 |
| + | | |
| + | | ? |
| + | |- |
| + | | 0x041E0182 |
| + | | |
| + | | UpdateAccountPassword |
| + | |- |
| + | | 0x041F0042 |
| + | | |
| + | | ReissueAccountPassword |
| + | |- |
| + | | 0x04200180 |
| + | | |
| + | | SetAccountPasswordInput |
| |- | | |- |
| | 0x04210042 | | | 0x04210042 |
| | | | | |
| | UploadMii | | | UploadMii |
| + | |- |
| + | | 0x04220042 |
| + | | |
| + | | ? |
| |- | | |- |
| | 0x04230082 | | | 0x04230082 |
| | | | | |
| | ValidateMailAddress | | | 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 |
| |} | | |} |
| | | |
Line 62: |
Line 375: |
| 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]] |
| + | | Does nothing? |
| + | |- |
| + | | 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]] |
| + | | LastAuthenticationResult |
| + | |- |
| + | | 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]] |
| + | | IsCommited |
| + | |- |
| + | | 0x1B |
| + | | 0x16 |
| + | | [[ACTU:GetAccountDataBlock|GetAccountInfo]] |
| + | | MiiName (NUL-terminated UTF-16 Mii name) |
| + | |- |
| + | | 0x1C |
| + | | 0x11 |
| + | | [[ACTU:GetAccountDataBlock|GetAccountInfo]] |
| + | | NfsPassword |
| + | |- |
| + | | 0x1D |
| + | | 0x1 |
| + | | [[ACTU:GetAccountDataBlock|GetAccountInfo]] |
| + | | Bool: if EciVirtualAccount has a value |
| + | |- |
| + | | 0x1E |
| + | | 0x41 |
| + | | [[ACTU:GetAccountDataBlock|GetAccountInfo]] |
| + | | TimeZoneId (ASCII Time Zone Location) |
| + | |- |
| + | | 0x1F |
| + | | 0x1 |
| + | | [[ACTU:GetAccountDataBlock|GetAccountInfo]] |
| + | | IsMiiUpdated |
| + | |- |
| + | | 0x20 |
| + | | 0x1 |
| + | | [[ACTU:GetAccountDataBlock|GetAccountInfo]] |
| + | | IsMailAddressValidated |
| + | |- |
| + | | 0x21 |
| + | | 0x4C |
| + | | [[ACTU:GetAccountDataBlock|GetAccountInfo]] |
| + | | ? |
| + | |- |
| + | | 0x24 |
| + | | 0x1 |
| + | | [[ACTU:GetAccountDataBlock|GetAccountInfo]] |
| + | | IsServerAccountDeleted |
| + | |- |
| + | | 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]] |
| + | | [[Cfg:TranslateCountryInfo|Translated]] 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. |