Difference between revisions of "ACT Services"
DaniElectra (talk | contribs) m (Add link to ACTU:GetCommonInfo and add more commands) |
TimmSkiller (talk | contribs) (added EulaInfo) |
||
(31 intermediate revisions by 2 users not shown) | |||
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 | + | = ACT User Service "act:u" = |
− | These commands are | + | These commands are used generally by most titles, and are also present in act:a. |
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
− | ! Command Header | + | ! Command Header !! Description |
− | ! | ||
− | ! | ||
|- | |- | ||
− | | 0x00010084 | + | | 0x00010084 || [[ACTU:Initialize|Initialize]] |
− | | | ||
− | | [[ | ||
|- | |- | ||
− | | 0x00020040 | + | | 0x00020040 || [[ACTU:GetErrorCode|GetErrorCode]] |
− | | | ||
− | | [[ | ||
|- | |- | ||
− | | 0x00030000 | + | | 0x00030000 || [[ACTU:GetLastResponseResult|GetLastResponseResult]] |
− | | | ||
− | | | ||
|- | |- | ||
− | | 0x00040000 | + | | 0x00040000 || [[ACTU:Cancel|Cancel]] |
− | | | ||
− | | | ||
|- | |- | ||
− | | 0x00050082 | + | | 0x00050082 || [[ACTU:GetCommonInfo|GetCommonInfo]] |
− | | | ||
− | | [[ACTU:GetCommonInfo|GetCommonInfo]] | ||
|- | |- | ||
− | | 0x000600C2 | + | | 0x000600C2 || [[ACTU:GetAccountDataBlock|GetAccountDataBlock]]/GetAccountInfo |
− | | | ||
− | | [[ACTU:GetAccountDataBlock|GetAccountDataBlock]] | ||
|- | |- | ||
− | | 0x00070082 | + | | 0x00070082 || [[ACTU:GetAsyncResult|GetAsyncResult]] |
− | | | ||
− | | | ||
|- | |- | ||
− | | 0x000800C2 | + | | 0x000800C2 || [[ACTU:GetMiiImage|GetMiiImage]] |
− | | | ||
− | | | ||
|- | |- | ||
− | | 0x00090180 | + | | 0x00090180 || [[ACTU:SetNfsPassword|SetNfsPassword]] |
− | | | ||
− | | SetNfsPassword | ||
|- | |- | ||
− | | | + | | 0x000A0000 || [[ACTU:SetIsApplicationUpdateRequired|SetIsApplicationUpdateRequired]] |
− | | | ||
− | | | ||
|- | |- | ||
− | | 0x000B0042 | + | | 0x000B0042 || [[ACTU:AcquireEulaList|AcquireEulaList]] |
− | | | ||
− | | AcquireEulaList | ||
|- | |- | ||
− | | 0x000C0082 | + | | 0x000C0082 || [[ACTU:AcquireTimeZoneList|AcquireTimeZoneList]] |
− | | | ||
− | | | ||
|- | |- | ||
− | | 0x000D0040 | + | | 0x000D0040 || [[ACTU:GenerateUuid|GenerateUuid]] |
− | | | ||
− | | GenerateUuid | ||
|- | |- | ||
− | | 0x000E0080 | + | | 0x000E0080 || [[ACTU:GetUuid|GetUuid]] |
− | | | ||
− | | | ||
|- | |- | ||
− | | 0x000F0140 | + | | 0x000F0140 || [[ACTU:FindSlotNoByUuid|FindSlotNoByUuid]] |
− | | | ||
− | | FindSlotNoByUuid | ||
|- | |- | ||
− | | 0x00100000 | + | | 0x00100000 || [[ACTU:Save|Save]] |
− | | | ||
− | | | ||
|- | |- | ||
− | | 0x00110080 | + | | 0x00110080 || [[ACTU:GetTransferableId|GetTransferableId]] |
− | | | ||
− | | GetTransferableId | ||
|- | |- | ||
− | | 0x00120102 | + | | 0x00120102 || [[ACTU:AcquireNexServiceToken|AcquireNexServiceToken]] |
− | | | ||
− | | | ||
|- | |- | ||
− | | 0x00130002 | + | | 0x00130002 || [[ACTU:GetNexServiceToken|GetNexServiceToken]] |
− | | | ||
− | | GetNexServiceToken | ||
|- | |- | ||
− | | 0x00140382 | + | | 0x00140382 || [[ACTU:AcquireIndependentServiceToken|AcquireIndependentServiceToken]] |
− | | | ||
− | | | ||
|- | |- | ||
− | | 0x00150002 | + | | 0x00150002 || [[ACTU:GetIndependentServiceToken|GetIndependentServiceToken]] |
− | | | ||
− | | GetIndependentServiceToken | ||
|- | |- | ||
− | | 0x00160082 | + | | 0x00160082 || [[ACTU:AcquireAccountInfo|AcquireAccountInfo]] |
− | | | ||
− | | | ||
|- | |- | ||
− | | 0x00170084 | + | | 0x00170084 || [[ACTU:AcquireAccountIdByPrincipalId|AcquireAccountIdByPrincipalId]] |
− | | | ||
− | | | ||
|- | |- | ||
− | | 0x00180044 | + | | 0x00180044 || [[ACTU:AcquirePrincipalIdByAccountId|AcquirePrincipalIdByAccountId]] |
− | | | ||
− | | | ||
|- | |- | ||
− | | 0x00190044 | + | | 0x00190044 || [[ACTU:AcquireMii|AcquireMii]] |
− | | | ||
− | | AcquireMii | ||
|- | |- | ||
− | | 0x001A0042 | + | | 0x001A0042 || [[ACTU:AcquireAccountInfoRaw|AcquireAccountInfoRaw]] |
− | | | ||
− | | | ||
|- | |- | ||
− | | 0x001B0084 | + | | 0x001B0084 || AcquireOtherTypePrincipalID (stubbed) |
− | | | ||
− | | | ||
|- | |- | ||
− | | 0x001C0342 | + | | 0x001C0342 || [[ACTU:GetCachedIndependentServiceToken|GetCachedIndependentServiceToken]] |
− | | | ||
− | | | ||
|- | |- | ||
− | | 0x001D0004 | + | | 0x001D0004 || [[ACTU:InquireMailAddressAvailability|InquireMailAddressAvailability]] |
− | | | ||
− | | | ||
|- | |- | ||
− | | 0x001E0082 | + | | 0x001E0082 || [[ACTU:AcquireEula|AcquireEula]] |
− | | | ||
− | | AcquireEula | ||
|- | |- | ||
− | | 0x001F0082 | + | | 0x001F0082 || [[ACTU:AcquireEulaLanguageList|AcquireEulaLanguageList]] |
− | | | ||
− | | AcquireEulaLanguageList | ||
|- | |- | ||
+ | | 0x00200382 || [[ACTU:AcquireIndependentServiceTokenV2|AcquireIndependentServiceTokenV2]] | ||
+ | |- | ||
+ | | 0x00210002 || [[ACTU:GetIndependentServiceTokenV2|GetIndepdendentServiceTokenV2]] | ||
+ | |- | ||
+ | | 0x00220342 || [[ACTU:GetCachedIndependentServiceTokenV2|GetCachedIndependentServiceTokenV2]] | ||
|} | |} | ||
− | = ACT | + | = ACT Admin Service "act:a" = |
− | + | ||
+ | This service is used mainly by the Nintendo Network ID Settings application accessible in System Settings. | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
− | ! | + | ! Command Header !! Description |
− | + | |- | |
− | + | | 0x04010080 || [[ACTA:SwapAccounts|SwapAccounts]] | |
+ | |- | ||
+ | | 0x04020000 || [[ACTA:CreateConsoleAccount|CreateConsoleAccount]] | ||
+ | |- | ||
+ | | 0x04030040 || [[ACTA:CommitConsoleAccount|CommitConsoleAccount]] | ||
+ | |- | ||
+ | | 0x04040080 || [[ACTA:UnbindServerAccount|UnbindServerAccount]] | ||
+ | |- | ||
+ | | 0x04050040 || [[ACTA:DeleteConsoleAccount|DeleteConsoleAccount]] | ||
+ | |- | ||
+ | | 0x04060240 || [[ACTA:LoadConsoleAccount|LoadConsoleAccount]] | ||
+ | |- | ||
+ | | 0x04070000 || [[ACTA:UnloadConsoleAccount|UnloadConsoleAccount]] | ||
+ | |- | ||
+ | | 0x04080080 || [[ACTA:EnableAccountPasswordCache|EnableAccountPasswordCache]] | ||
+ | |- | ||
+ | | 0x04090040 || [[ACTA:SetDefaultAccount|SetDefaultAccount]] | ||
+ | |- | ||
+ | | 0x040A0040 || [[ACTA:ReplaceAccountId|ReplaceAccountId]] | ||
+ | |- | ||
+ | | 0x040B0040 || [[ACTA:GetSupportContext|GetSupportContext]] | ||
+ | |- | ||
+ | | 0x040C0100 || [[ACTA:SetHostServerSettings|SetHostServerSettings]] | ||
+ | |- | ||
+ | | 0x040D00C0 || [[ACTA:SetDefaultHostServerSettings|SetDefaultHostServerSettings]] | ||
+ | |- | ||
+ | | 0x040E02C0 || [[ACTA:SetHostServerSettingsStr|SetHostServerSettingsStr]] | ||
+ | |- | ||
+ | | 0x040F0280 || [[ACTA:SetDefaultHostServerSettingsStr|SetDefaultHostServerSettingsStr]] | ||
+ | |- | ||
+ | | 0x04100040 || [[ACTA:SetPersistentIdHead|SetPersistentIdHead]] | ||
+ | |- | ||
+ | | 0x04110040 || [[ACTA:SetTransferableIdCounter|SetTransferableIdCounter]] | ||
+ | |- | ||
+ | | 0x041207C0 || [[ACTA:UpdateMiiData|UpdateMiiData]] | ||
+ | |- | ||
+ | | 0x041300C2 || [[ACTA:UpdateMiiImage|UpdateMiiImage]] | ||
+ | |- | ||
+ | | 0x04140182 || [[ACTA:InquireAccountIdAvailability|InquireAccountIdAvailability]] | ||
+ | |- | ||
+ | | 0x04150EC4 || [[ACTA:BindToNewServerAccount|BindToNewServerAccount]] | ||
+ | |- | ||
+ | | 0x041602C4 || [[ACTA:BindToExistentServerAccount|BindToExistentServerAccount]] | ||
+ | |- | ||
+ | | 0x041702C4 || [[ACTA:InquireBindingToExistentServerAccount|InquireBindingToExistentServerAccount]] | ||
+ | |- | ||
+ | | 0x04180042 || [[ACTA:DeleteServerAccount|DeleteServerAccount]] | ||
+ | |- | ||
+ | | 0x04190042 || AcquireAccountToken (stubbed) | ||
+ | |- | ||
+ | | 0x041A01C2 || [[ACTA:AcquireAccountTokenEx|AcquireAccountTokenEx]] | ||
+ | |- | ||
+ | | 0x041B0142 || [[ACTA:AgreeEula|AgreeEula]] | ||
+ | |- | ||
+ | | 0x041C0042 || [[ACTA:SyncAccountInfo|SyncAccountInfo]] | ||
+ | |- | ||
+ | | 0x041D0080 || [[ACTA:InvalidateAccountToken|InvalidateAccountToken]] | ||
+ | |- | ||
+ | | 0x041E0182 || [[ACTA:UpdateAccountPassword|UpdateAccountPassword]] | ||
+ | |- | ||
+ | | 0x041F0042 || [[ACTA:ReissueAccountPassword|ReissueAccountPassword]] | ||
+ | |- | ||
+ | | 0x04200180 || [[ACTA:SetAccountPasswordInput|SetAccountPasswordInput]] | ||
+ | |- | ||
+ | | 0x04210042 || [[ACTA:UploadMii|UploadMii]] | ||
+ | |- | ||
+ | | 0x04220042 || [[ACTA:InactivateDeviceAssociation|InactivateDeviceAssociation]] | ||
+ | |- | ||
+ | | 0x04230082 || [[ACTA:ValidateMailAddress|ValidateMailAddress]] | ||
+ | |- | ||
+ | | 0x04240044 || [[ACTA:SendPostingApprovalMail|SendPostingApprovalMail]] | ||
+ | |- | ||
+ | | 0x04250042 || [[ACTA:SendConfirmationMail|SendConfirmationMail]] | ||
+ | |- | ||
+ | | 0x04260044 || [[ACTA:SendConfirmationMailForPin|SendConfirmationMailForPin]] | ||
+ | |- | ||
+ | | 0x04270084 || [[ACTA:SendMasterKeyMailForPin|SendMasterKeyMailForPin]] | ||
+ | |- | ||
+ | | 0x04280044 || [[ACTA:ApproveByCreditCard|ApproveByCreditCard]] | ||
+ | |- | ||
+ | | 0x04290082 || [[ACTA:SendCoppaCodeMail|SendCoppaCodeMail]] | ||
+ | |- | ||
+ | | 0x042A0080 || [[ACTA:SetIsMiiUpdated|SetIsMiiUpdated]] | ||
+ | |- | ||
+ | | 0x042B01C4 || [[ACTA:ReserveTransfer|ReserveTransfer]] | ||
+ | |- | ||
+ | | 0x042C0042 || [[ACTA:CompleteTransfer|CompleteTransfer]] | ||
+ | |- | ||
+ | | 0x042D0042 || [[ACTA:InactivateAccountDeviceAssociation|InactivateAccountDeviceAssociation]] | ||
|- | |- | ||
− | | | + | | 0x042E0080 || [[ACTA:SetNetworkTime|SetNetworkTime]] |
− | | | ||
− | | [[ACTA: | ||
|- | |- | ||
− | | | + | | 0x042F0084 || [[ACTA:UpdateAccountInfo|UpdateAccountInfo]] |
− | | | ||
− | | [[ACTA: | ||
|- | |- | ||
− | | | + | | 0x04300044 || [[ACTA:UpdateAccountMailAddress|UpdateAccountMailAddress]] |
− | | | ||
− | | [[ACTA: | ||
|- | |- | ||
− | | | + | | 0x04310042 || [[ACTA:DeleteDeviceAssociation|DeleteDeviceAssociation]] |
− | | | ||
− | | [[ACTA: | ||
|- | |- | ||
− | | | + | | 0x04320042 || [[ACTA:DeleteAccountDeviceAssociation|DeleteAccountDeviceAssociation]] |
− | | | ||
− | | | ||
|- | |- | ||
− | | | + | | 0x04330042 || [[ACTA:CancelTransfer|CancelTransfer]] |
− | | | ||
− | | | ||
|- | |- | ||
− | | | + | | 0x04340003 || [[ACTA:ReloadSaveData|ReloadSaveData]] |
− | | | ||
− | | | ||
|- | |- | ||
− | | | + | | 0x04350042 || [[ACTA:ReserveServerAccountDeletion|ReserveServerAccountDeletion]] |
− | | | ||
− | | | ||
|} | |} | ||
+ | = 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. | ||
+ | |||
+ | = Server Types = | ||
+ | The ACT sysmodule uses two different server types for Nintendo Network accounts. | ||
+ | |||
+ | See below how these types are determined by default. These types can also be overridden using [[ACTA:SetHostServerSettings]], [[ACTA:SetDefaultHostServerSettings]], [[ACTA:SetHostServerSettingsStr]], and [[ACTA:SetDefaultHostServerSettingsStr]]. | ||
− | This is the service used | + | The base URL for the Nintendo Network Account Server (NNAS) is: <code>https://[<prefix>]account.nintendo.net</code>. |
+ | |||
+ | == NNAS (Nintendo Network Authentication Server) Types == | ||
+ | This is used to determine the NNAS subdomain used for the account server. | ||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Value !! Description !! NNAS Subdomain !! Complete NNAS URL | ||
+ | |- | ||
+ | | 0 || Production || (None) || <code><nowiki>https://account.nintendo.net</nowiki></code> | ||
+ | |- | ||
+ | | 1 || Game Development (also the default for debug mode on developer units) || <code style="border: 1px solid black">game-dev.</code> || <code><nowiki>https://game-dev.account.nintendo.net</nowiki></code> | ||
+ | |- | ||
+ | | 2 || System Development || <code style="border: 1px solid black">system-dev.</code> || <code><nowiki>https://system-dev.account.nintendo.net</nowiki></code> | ||
+ | |- | ||
+ | | 3 || Library Development || <code style="border: 1px solid black">library-dev.</code> || <code><nowiki>https://library-dev.account.nintendo.net</nowiki></code> | ||
+ | |- | ||
+ | | 4 || Staging || <code style="border: 1px solid black">staging.</code> || <code><nowiki>https://staging.account.nintendo.net</nowiki></code> | ||
+ | |} | ||
+ | |||
+ | Values beyond 4 are considered invalid. | ||
+ | |||
+ | === Default NNAS Server Types === | ||
+ | By default, ACT uses the letter value from [[FRDU:GetServerTypes]] to determine the correct NNAS subdomain when a Nintendo Network ID is created. | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Value from [[FRDU:GetServerTypes]] !! NNAS Server Type || Corresponding NNAS Subdomain !! Corresponding complete NNAS URL | ||
+ | |- | ||
+ | | 0 (L) || Production (default on retail units) || (None) || <code><nowiki>https://account.nintendo.net</nowiki></code> | ||
+ | |- | ||
+ | | 2 (S) || Staging || <code style="border: 1px solid black">staging.</code> || <code><nowiki>https://staging.account.nintendo.net</nowiki></code> | ||
+ | |- | ||
+ | | 3 (D) || Game Development (also the default for debug mode on developer units) || <code style="border: 1px solid black">game-dev.</code> || <code><nowiki>https://game-dev.account.nintendo.net</nowiki></code> | ||
+ | |- | ||
+ | | 5 (T) || Library Development || <code style="border: 1px solid black">library-dev.</code> || <code><nowiki>https://library-dev.account.nintendo.net</nowiki></code> | ||
+ | |- | ||
+ | | 7 (J) || System Development || <code style="border: 1px solid black">system-dev.</code> || <code><nowiki>https://system-dev.account.nintendo.net</nowiki></code> | ||
+ | |} | ||
+ | |||
+ | == NFS (Nintendo Friend Server) Types == | ||
+ | ACT uses the same [[Friend_Services#Server_Types|Server Types]] as the friends sysmodule as the NfsType. | ||
+ | |||
+ | A small subset of these types are used in [[ACTA:SetHostServerSettings]], [[ACTA:SetDefaultHostServerSettings]], [[ACTA:SetHostServerSettingsStr]], and [[ACTA:SetDefaultHostServerSettingsStr]]: | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Input value used in ACT commands || Corresponding [[Friend_Services#Server_Types|Friends Server Type]] value | ||
+ | |- | ||
+ | | 0 || 0 (L) | ||
+ | |- | ||
+ | | 1 || 3 (D) | ||
+ | |- | ||
+ | | 2 || 2 (S) | ||
+ | |- | ||
+ | | 3 || 5 (T) | ||
+ | |- | ||
+ | | 4 || 7 (J) | ||
+ | |} | ||
+ | |||
+ | === Default NFS Server Types === | ||
+ | By default, ACT uses [[FRDU:GetServerTypes]] to obtain the correct [[Friend_Services#Server_Types|NFS (Nintendo Friend Server) environment]] to create Nintendo Network IDs. | ||
+ | |||
+ | This is necessary to ensure proper online play functionality, because the friends server account is tied to the Nintendo Network ID when one is linked. | ||
+ | |||
+ | = UUIDs = | ||
+ | |||
+ | The ACT service generates UUIDs for accounts and for the console in general. | ||
+ | |||
+ | All UUIDs generated by the service are [https://www.rfc-editor.org/rfc/rfc9562.html#name-uuid-version-1 RFC9562 Version 1 UUIDs]. | ||
+ | |||
+ | == Node Data == | ||
+ | In general, the following 48-bit node data is used. | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset !! Size !! Description | ||
+ | |- | ||
+ | | 0x0 || 0x1 || Always set to 1 | ||
+ | |- | ||
+ | | 0x1 || 0x1 || Always set to 0 (related to parental controls?) | ||
+ | |- | ||
+ | | 0x2 || 0x4 || Byte-Swapped value from [[AM:GetDeviceId]] | ||
+ | |} | ||
+ | |||
+ | == UUID Types == | ||
+ | === Regular UUIDs === | ||
+ | These are just standard [https://www.rfc-editor.org/rfc/rfc9562.html#name-uuid-version-1 RFC9562 Version 1 UUIDs] with the above node data. | ||
+ | |||
+ | === Title-specific UUIDs === | ||
+ | These UUIDs are specific to the title that requested them to be generated, specifically, using the unique ID portion of the title ID of that title. | ||
+ | |||
+ | The following technique is used internally to generate these UUIDs: | ||
+ | |||
+ | - Generate or use an existing regular UUID the with the above mentioned node data (<code>regular_uuid</code>) | ||
+ | |||
+ | - <code>hash = SHA256 ( byte-swapped unique ID (thus, big endian) + 095E273A + 48-bit node data from regular_uuid )</code> | ||
+ | |||
+ | - <code>output_uuid = regular_uuid[0:9] + hash[10] | 0x1 + hash[11:16]</code> | ||
+ | |||
+ | = Independent Service Tokens = | ||
+ | In addition to NEX tokens for gameserver authentication in combination with Nintendo Network, app developers have the ability to use their own independent services. For authenticating with such services through Nintendo Network, the service's client ID is used to request a token from the account server. | ||
+ | |||
+ | == Independent Service Token Versions == | ||
+ | There are two versions of independent service tokens. | ||
+ | |||
+ | === V1 Independent Service Token === | ||
+ | These are more basic, consisting of only a base64 token. These can be requested and cached using [[ACTU:AcquireIndependentServiceToken]], retrieved either immediately after requesting them using [[ACTU:GetIndependentServiceToken]] or from an internal cache using [[ACTU:GetCachedIndependentServiceToken]]. | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset !! Size !! Description | ||
+ | |- | ||
+ | | 0x0 || 0x200 + 1 || base64 NULL-terminated Token | ||
+ | |} | ||
+ | |||
+ | === V2 Independent Service Token === | ||
+ | V2 indpendent service tokens include more fields like an IV, signature, and account server environment compared to V1 tokens. | ||
+ | |||
+ | They can be requested and cached using [[ACTU:AcquireIndependentServiceTokenV2]], retrieved either immediately after requesting them using [[ACTU:GetIndependentServiceTokenV2]] or from an internal cache using [[ACTU:GetCachedIndependentServiceTokenV2]]. | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset !! Size !! Description | ||
+ | |- | ||
+ | | 0x0 || 0x200 + 1 || base64 NULL-terminated Token | ||
+ | |- | ||
+ | | 0x201 || 0x18 + 1 || base64 NULL-terminated IV | ||
+ | |- | ||
+ | | 0x21A || 0x158 + 1 || base64 NULL-terminated Signature | ||
+ | |- | ||
+ | | 0x373 || 0x2 + 1 || ASCII [[Friend_Services#Server_Types|Server Environment]] type and number | ||
+ | |} | ||
+ | |||
+ | = CFLStoreData = | ||
+ | This is the Mii format used in ACT commands. | ||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset !! Size !! Description | ||
+ | |- | ||
+ | | 0x0 || 0x5C || [[Mii#Mii_format|Mii Data]] | ||
+ | |- | ||
+ | | 0x5E || 0x2 || padding | ||
+ | |- | ||
+ | | 0x5C || 0x2 || CRC16 over the above 0x5E bytes (see [[Mii#Checksum|Mii Checksum]] for details on the algorithm) | ||
+ | |} | ||
+ | |||
+ | = 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]] || Difference between server time and device time (in nanoseconds) | ||
+ | |- | ||
+ | | 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 NULL-terminated Nintendo Network ID) | ||
+ | |- | ||
+ | | 0x9 || 0x101 || [[ACTU:AcquireAccountInfo|AcquireAccountInfo]] || Mail address | ||
+ | |- | ||
+ | | 0xA || 0x4 || [[ACTU:GetAccountDataBlock|GetAccountInfo]] || Birthdate | ||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset !! Size !! Description | ||
+ | |- | ||
+ | | 0x0 || 0x2 || Year | ||
+ | |- | ||
+ | | 0x2 || 0x1 || Month | ||
+ | |- | ||
+ | | 0x3 || 0x1 || Day | ||
+ | |} | ||
+ | |- | ||
+ | | 0xB || 0x3 || [[ACTU:GetAccountDataBlock|GetAccountInfo]] || ASCII NULL-terminated Country Name | ||
+ | |- | ||
+ | | 0xC || 0x4 || [[ACTU:GetAccountDataBlock|GetAccountInfo]] || PrincipalId | ||
+ | |- | ||
+ | | 0xE || 0x1 || [[ACTU:GetAccountDataBlock|GetAccountInfo]] || IsPasswordCacheEnabled | ||
+ | |- | ||
+ | | 0xF || 0x1 || [[ACTU:GetAccountDataBlock|GetAccountInfo]] || Does not return anything. | ||
+ | |- | ||
+ | | 0x11 || 0xA0 || [[ACTU:GetAccountDataBlock|GetAccountInfo]] || | ||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset !! Size !! Description | ||
+ | |- | ||
+ | | 0x0 || 0x4 || u32 PersistentID | ||
+ | |- | ||
+ | | 0x4 || 0x4 || padding | ||
+ | |- | ||
+ | | 0x8 || 0x8 || u64 TransferableIDBase | ||
+ | |- | ||
+ | | 0x10 || 0x60 || [[Mii#Mii_format|Mii]] | ||
+ | |- | ||
+ | | 0x70 || (10 + 1) * 2 || 10-character UTF-16 Mii Display Name | ||
+ | |- | ||
+ | | 0x86 || 0x11 || ASCII NULL-terminated NNID Account ID (username) | ||
+ | |- | ||
+ | | 0x97 || 1 || padding | ||
+ | |- | ||
+ | | 0x98 || 0x4 || Birthdate | ||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset !! Size !! Description | ||
+ | |- | ||
+ | | 0x0 || 0x2 || Year | ||
+ | |- | ||
+ | | 0x2 || 0x1 || Month | ||
+ | |- | ||
+ | | 0x3 || 0x1 || Day | ||
+ | |} | ||
+ | |- | ||
+ | | 0x9C || 0x4 || u32, PrincipalID | ||
+ | |} | ||
+ | |- | ||
+ | | 0x12 || 0x4 || [[ACTU:GetAccountDataBlock|GetAccountInfo]] || | ||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset !! Size !! Description | ||
+ | |- | ||
+ | | 0x0 || 0x1 || NNAS (Nintendo Network Authentication Server) Type | ||
+ | |- | ||
+ | | 0x1 || 0x1 || [[Friend_Services#Server_Types|NFS (Nintendo Friend Server) Type Value]] | ||
+ | |- | ||
+ | | 0x2 || 0x1 || [[Friend_Services#Server_Types|NFS (Nintendo Friend Server) Number]] | ||
+ | |- | ||
+ | | 0x3 || 0x1 || padding (0) | ||
+ | |} | ||
+ | |- | ||
+ | | 0x13 || 0x1 || [[ACTU:GetAccountDataBlock|GetAccountInfo]] || Gender | ||
+ | |- | ||
+ | | 0x14 || 0x1 || [[ACTU:GetAccountDataBlock|GetAccountInfo]] || LastAuthenticationResult | ||
+ | |- | ||
+ | | 0x15 || 0x11 || [[ACTU:GetAccountDataBlock|GetAccountInfo]] || AssignedAccountId (ASCII NULL-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]] || 10-character UTF-16 Mii Name (10 characters + NULL termination) | ||
+ | |- | ||
+ | | 0x1C || 0x11 || [[ACTU:GetAccountDataBlock|GetAccountInfo]] || ASCII NULL-termiinated NfsPassword | ||
+ | |- | ||
+ | | 0x1D || 0x1 || [[ACTU:GetAccountDataBlock|GetAccountInfo]] || HasEciVirtualAccount (checks whether 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]] || (Developer units only) Account access token | ||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset !! Size !! Description | ||
+ | |- | ||
+ | | 0x0 || 0x1 || Access token state (0: uninitialized, 1: expired, 2: valid) | ||
+ | |- | ||
+ | | 0x1 || 0x21 || ASCII NULL-terminated access token | ||
+ | |- | ||
+ | | 0x22 || 0x29 || ASCII NULL-terminated refresh token | ||
+ | |} | ||
+ | |- | ||
+ | | 0x24 || 0x1 || [[ACTU:GetAccountDataBlock|GetAccountInfo]] || IsServerAccountDeleted | ||
+ | |- | ||
+ | | 0x25 || 0x101 || [[ACTU:GetAccountDataBlock|GetAccountInfo]] || MiiImageUrl (ASCII NULL-terminated URL to account mii image) | ||
+ | |- | ||
+ | | 0x26 || 0x4 || [[ACTU:GetAccountDataBlock|GetAccountInfo]] || AssignedPrincipalId | ||
+ | |- | ||
+ | | 0x27 || 0x4 || [[ACTU:GetAccountDataBlock|GetAccountInfo]] || Account Access token state, only accessible with account slot = 0xFE: (0: uninitialized, 1: expired, 2: valid) | ||
+ | |- | ||
+ | | 0x28 || 0x24 || [[ACTU:GetAccountDataBlock|GetAccountInfo]] || Account server environment | ||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset !! Size !! Description | ||
+ | |- | ||
+ | | 0x0 || 0x21 || ASCII NULL-terminated NNAS subdomain | ||
+ | |- | ||
+ | | 0x21 || 0x3 || [[Friend_Services#Server_Types|NFS (Nintendo Friend Server) Environment]] | ||
+ | |} | ||
+ | |- | ||
+ | | 0x29 || 0x24 || [[ACTU:GetCommonInfo|GetCommonInfo]] || Server environment of default account | ||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset !! Size !! Description | ||
+ | |- | ||
+ | | 0x0 || 0x21 || ASCII NULL-terminated NNAS subdomain | ||
+ | |- | ||
+ | | 0x21 || 0x3 || [[Friend_Services#Server_Types|NFS (Nintendo Friend Server) Environment]] | ||
+ | |} | ||
+ | |- | ||
+ | | 0x2A || 0x8 || [[ACTU:GetCommonInfo|GetCommonInfo]] || first 8 bytes of <code>SHA256 ( [[AM:GetDeviceId]]() as 4 little endian bytes + 'A2257354' )</code> | ||
+ | |- | ||
+ | | 0x2B || 0x1 || [[ACTU:GetAccountDataBlock|GetAccountInfo]] || FpLocalAccountId (local account ID of [[Friend_Services|friends sysmodule]]) | ||
+ | |- | ||
+ | | 0x2C || 0x2 || [[ACTU:GetAccountDataBlock|GetAccountInfo]] || Age (calculated using server time, not device time) | ||
+ | |- | ||
+ | | 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]]) | ||
+ | |} | ||
+ | |||
+ | = Types = | ||
+ | == Timezone == | ||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset !! Size !! Description | ||
+ | |- | ||
+ | | 0x0 || 0x40 + 1 || ASCII NULL-terminated TimezoneArea (max. 64 characters + NULL termination) | ||
+ | |- | ||
+ | | 0x41 || 0x3 || padding | ||
+ | |- | ||
+ | | 0x44 || 0x40 + 1 || ASCII NULL-terminated TimezoneId (max. 64 characters + NULL termination) | ||
+ | |- | ||
+ | | 0x85 || 0x3 || padding | ||
+ | |- | ||
+ | | 0x88 || 0x8 || s64, UtcOffset in seconds | ||
+ | |} | ||
+ | |||
+ | == EulaInfo == | ||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset !! Size !! Description | ||
+ | |- | ||
+ | | 0x0 || 0x2 + 1 || ASCII NULL-terminated two-letter country code (2 characters + NULL termination) | ||
+ | |- | ||
+ | | 0x3 || 0x2 + 1 || ASCII NULL-terminated two-letter language code (2 characters + NULL termination) | ||
+ | |- | ||
+ | | 0x6 || 0x2 || u16, EULA version | ||
+ | |} | ||
− | =HTTPS Requests= | + | = 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. |
Latest revision as of 22:18, 22 January 2025
The ACT module handles NNID accounts. This module behaves very similarly to the Wii U implementation (nn::act)
ACT User Service "act:u"[edit]
These commands are used generally by most titles, and are also present in act:a.
ACT Admin Service "act:a"[edit]
This service is used mainly by the Nintendo Network ID Settings application accessible in System Settings.
Account slots[edit]
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.
Server Types[edit]
The ACT sysmodule uses two different server types for Nintendo Network accounts.
See below how these types are determined by default. These types can also be overridden using ACTA:SetHostServerSettings, ACTA:SetDefaultHostServerSettings, ACTA:SetHostServerSettingsStr, and ACTA:SetDefaultHostServerSettingsStr.
The base URL for the Nintendo Network Account Server (NNAS) is: https://[<prefix>]account.nintendo.net
.
NNAS (Nintendo Network Authentication Server) Types[edit]
This is used to determine the NNAS subdomain used for the account server.
Value | Description | NNAS Subdomain | Complete NNAS URL |
---|---|---|---|
0 | Production | (None) | https://account.nintendo.net
|
1 | Game Development (also the default for debug mode on developer units) | game-dev. |
https://game-dev.account.nintendo.net
|
2 | System Development | system-dev. |
https://system-dev.account.nintendo.net
|
3 | Library Development | library-dev. |
https://library-dev.account.nintendo.net
|
4 | Staging | staging. |
https://staging.account.nintendo.net
|
Values beyond 4 are considered invalid.
Default NNAS Server Types[edit]
By default, ACT uses the letter value from FRDU:GetServerTypes to determine the correct NNAS subdomain when a Nintendo Network ID is created.
Value from FRDU:GetServerTypes | NNAS Server Type | Corresponding NNAS Subdomain | Corresponding complete NNAS URL |
---|---|---|---|
0 (L) | Production (default on retail units) | (None) | https://account.nintendo.net
|
2 (S) | Staging | staging. |
https://staging.account.nintendo.net
|
3 (D) | Game Development (also the default for debug mode on developer units) | game-dev. |
https://game-dev.account.nintendo.net
|
5 (T) | Library Development | library-dev. |
https://library-dev.account.nintendo.net
|
7 (J) | System Development | system-dev. |
https://system-dev.account.nintendo.net
|
NFS (Nintendo Friend Server) Types[edit]
ACT uses the same Server Types as the friends sysmodule as the NfsType.
A small subset of these types are used in ACTA:SetHostServerSettings, ACTA:SetDefaultHostServerSettings, ACTA:SetHostServerSettingsStr, and ACTA:SetDefaultHostServerSettingsStr:
Input value used in ACT commands | Corresponding Friends Server Type value |
---|---|
0 | 0 (L) |
1 | 3 (D) |
2 | 2 (S) |
3 | 5 (T) |
4 | 7 (J) |
Default NFS Server Types[edit]
By default, ACT uses FRDU:GetServerTypes to obtain the correct NFS (Nintendo Friend Server) environment to create Nintendo Network IDs.
This is necessary to ensure proper online play functionality, because the friends server account is tied to the Nintendo Network ID when one is linked.
UUIDs[edit]
The ACT service generates UUIDs for accounts and for the console in general.
All UUIDs generated by the service are RFC9562 Version 1 UUIDs.
Node Data[edit]
In general, the following 48-bit node data is used.
Offset | Size | Description |
---|---|---|
0x0 | 0x1 | Always set to 1 |
0x1 | 0x1 | Always set to 0 (related to parental controls?) |
0x2 | 0x4 | Byte-Swapped value from AM:GetDeviceId |
UUID Types[edit]
Regular UUIDs[edit]
These are just standard RFC9562 Version 1 UUIDs with the above node data.
Title-specific UUIDs[edit]
These UUIDs are specific to the title that requested them to be generated, specifically, using the unique ID portion of the title ID of that title.
The following technique is used internally to generate these UUIDs:
- Generate or use an existing regular UUID the with the above mentioned node data (regular_uuid
)
- hash = SHA256 ( byte-swapped unique ID (thus, big endian) + 095E273A + 48-bit node data from regular_uuid )
- output_uuid = regular_uuid[0:9] + hash[10] | 0x1 + hash[11:16]
Independent Service Tokens[edit]
In addition to NEX tokens for gameserver authentication in combination with Nintendo Network, app developers have the ability to use their own independent services. For authenticating with such services through Nintendo Network, the service's client ID is used to request a token from the account server.
Independent Service Token Versions[edit]
There are two versions of independent service tokens.
V1 Independent Service Token[edit]
These are more basic, consisting of only a base64 token. These can be requested and cached using ACTU:AcquireIndependentServiceToken, retrieved either immediately after requesting them using ACTU:GetIndependentServiceToken or from an internal cache using ACTU:GetCachedIndependentServiceToken.
Offset | Size | Description |
---|---|---|
0x0 | 0x200 + 1 | base64 NULL-terminated Token |
V2 Independent Service Token[edit]
V2 indpendent service tokens include more fields like an IV, signature, and account server environment compared to V1 tokens.
They can be requested and cached using ACTU:AcquireIndependentServiceTokenV2, retrieved either immediately after requesting them using ACTU:GetIndependentServiceTokenV2 or from an internal cache using ACTU:GetCachedIndependentServiceTokenV2.
Offset | Size | Description |
---|---|---|
0x0 | 0x200 + 1 | base64 NULL-terminated Token |
0x201 | 0x18 + 1 | base64 NULL-terminated IV |
0x21A | 0x158 + 1 | base64 NULL-terminated Signature |
0x373 | 0x2 + 1 | ASCII Server Environment type and number |
CFLStoreData[edit]
This is the Mii format used in ACT commands.
Offset | Size | Description |
---|---|---|
0x0 | 0x5C | Mii Data |
0x5E | 0x2 | padding |
0x5C | 0x2 | CRC16 over the above 0x5E bytes (see Mii Checksum for details on the algorithm) |
DataBlocks[edit]
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 | Difference between server time and device time (in nanoseconds) | ||||||||||||||||||||||||||||||||||||||||||
0x5 | 0x4 | GetAccountInfo | PersistentId | ||||||||||||||||||||||||||||||||||||||||||
0x6 | 0x8 | GetCommonInfo/GetAccountInfo | CommonTransferableIdBase on GetCommonInfo / TransferableIdBase on GetAccountInfo | ||||||||||||||||||||||||||||||||||||||||||
0x7 | 0x60 | GetAccountInfo | MiiData | ||||||||||||||||||||||||||||||||||||||||||
0x8 | 0x11 | GetAccountInfo | AccountId (ASCII NULL-terminated Nintendo Network ID) | ||||||||||||||||||||||||||||||||||||||||||
0x9 | 0x101 | AcquireAccountInfo | Mail address | ||||||||||||||||||||||||||||||||||||||||||
0xA | 0x4 | GetAccountInfo | Birthdate
| ||||||||||||||||||||||||||||||||||||||||||
0xB | 0x3 | GetAccountInfo | ASCII NULL-terminated Country Name | ||||||||||||||||||||||||||||||||||||||||||
0xC | 0x4 | GetAccountInfo | PrincipalId | ||||||||||||||||||||||||||||||||||||||||||
0xE | 0x1 | GetAccountInfo | IsPasswordCacheEnabled | ||||||||||||||||||||||||||||||||||||||||||
0xF | 0x1 | GetAccountInfo | Does not return anything. | ||||||||||||||||||||||||||||||||||||||||||
0x11 | 0xA0 | GetAccountInfo |
| ||||||||||||||||||||||||||||||||||||||||||
0x12 | 0x4 | GetAccountInfo |
| ||||||||||||||||||||||||||||||||||||||||||
0x13 | 0x1 | GetAccountInfo | Gender | ||||||||||||||||||||||||||||||||||||||||||
0x14 | 0x1 | GetAccountInfo | LastAuthenticationResult | ||||||||||||||||||||||||||||||||||||||||||
0x15 | 0x11 | GetAccountInfo | AssignedAccountId (ASCII NULL-terminated Nintendo Network ID) | ||||||||||||||||||||||||||||||||||||||||||
0x16 | 0x1 | GetAccountInfo | ParentalControlSlotNo | ||||||||||||||||||||||||||||||||||||||||||
0x17 | 0x4 | GetAccountInfo | SimpleAddressId (CountryInfo) | ||||||||||||||||||||||||||||||||||||||||||
0x19 | 0x8 | GetAccountInfo | UtcOffset | ||||||||||||||||||||||||||||||||||||||||||
0x1A | 0x1 | GetAccountInfo | IsCommited | ||||||||||||||||||||||||||||||||||||||||||
0x1B | 0x16 | GetAccountInfo | 10-character UTF-16 Mii Name (10 characters + NULL termination) | ||||||||||||||||||||||||||||||||||||||||||
0x1C | 0x11 | GetAccountInfo | ASCII NULL-termiinated NfsPassword | ||||||||||||||||||||||||||||||||||||||||||
0x1D | 0x1 | GetAccountInfo | HasEciVirtualAccount (checks whether EciVirtualAccount has a value) | ||||||||||||||||||||||||||||||||||||||||||
0x1E | 0x41 | GetAccountInfo | TimeZoneId (ASCII Time Zone Location) | ||||||||||||||||||||||||||||||||||||||||||
0x1F | 0x1 | GetAccountInfo | IsMiiUpdated | ||||||||||||||||||||||||||||||||||||||||||
0x20 | 0x1 | GetAccountInfo | IsMailAddressValidated | ||||||||||||||||||||||||||||||||||||||||||
0x21 | 0x4C | GetAccountInfo | (Developer units only) Account access token
| ||||||||||||||||||||||||||||||||||||||||||
0x24 | 0x1 | GetAccountInfo | IsServerAccountDeleted | ||||||||||||||||||||||||||||||||||||||||||
0x25 | 0x101 | GetAccountInfo | MiiImageUrl (ASCII NULL-terminated URL to account mii image) | ||||||||||||||||||||||||||||||||||||||||||
0x26 | 0x4 | GetAccountInfo | AssignedPrincipalId | ||||||||||||||||||||||||||||||||||||||||||
0x27 | 0x4 | GetAccountInfo | Account Access token state, only accessible with account slot = 0xFE: (0: uninitialized, 1: expired, 2: valid) | ||||||||||||||||||||||||||||||||||||||||||
0x28 | 0x24 | GetAccountInfo | Account server environment
| ||||||||||||||||||||||||||||||||||||||||||
0x29 | 0x24 | GetCommonInfo | Server environment of default account
| ||||||||||||||||||||||||||||||||||||||||||
0x2A | 0x8 | GetCommonInfo | first 8 bytes of SHA256 ( AM:GetDeviceId() as 4 little endian bytes + 'A2257354' )
| ||||||||||||||||||||||||||||||||||||||||||
0x2B | 0x1 | GetAccountInfo | FpLocalAccountId (local account ID of friends sysmodule) | ||||||||||||||||||||||||||||||||||||||||||
0x2C | 0x2 | GetAccountInfo | Age (calculated using server time, not device time) | ||||||||||||||||||||||||||||||||||||||||||
0x2D | 0x1 | GetAccountInfo | IsEnabledReceiveAds | ||||||||||||||||||||||||||||||||||||||||||
0x2E | 0x1 | GetAccountInfo | IsOffDeviceAccessEnabled | ||||||||||||||||||||||||||||||||||||||||||
0x2F | 0x4 | GetAccountInfo | Translated SimpleAddressId (CountryInfo) |
Types[edit]
Timezone[edit]
Offset | Size | Description |
---|---|---|
0x0 | 0x40 + 1 | ASCII NULL-terminated TimezoneArea (max. 64 characters + NULL termination) |
0x41 | 0x3 | padding |
0x44 | 0x40 + 1 | ASCII NULL-terminated TimezoneId (max. 64 characters + NULL termination) |
0x85 | 0x3 | padding |
0x88 | 0x8 | s64, UtcOffset in seconds |
EulaInfo[edit]
Offset | Size | Description |
---|---|---|
0x0 | 0x2 + 1 | ASCII NULL-terminated two-letter country code (2 characters + NULL termination) |
0x3 | 0x2 + 1 | ASCII NULL-terminated two-letter language code (2 characters + NULL termination) |
0x6 | 0x2 | u16, EULA version |
HTTPS Requests[edit]
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[edit]
ACT module uses a RootCertChain for all HTTPS requests, the only trusted root CA is default CertID 0x3.
New3DS[edit]
Even though ACT-sysmodule uses ptm:s, it doesn't use CheckNew3DS at all.