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 | SaveData | |
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 | ? | |
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 | UnloadConsoleAccount | |
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 | Does nothing? |
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 | LastAuthenticationResult |
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 | IsCommited |
0x1B | 0x16 | GetAccountInfo | MiiName (NUL-terminated UTF-16 Mii name) |
0x1C | 0x11 | GetAccountInfo | NfsPassword |
0x1D | 0x1 | GetAccountInfo | Bool: if EciVirtualAccount has a value |
0x1E | 0x41 | GetAccountInfo | TimeZoneId (ASCII Time Zone Location) |
0x1F | 0x1 | GetAccountInfo | IsMiiUpdated |
0x20 | 0x1 | GetAccountInfo | IsMailAddressValidated |
0x21 | 0x4C | GetAccountInfo | ? |
0x24 | 0x1 | GetAccountInfo | IsServerAccountDeleted |
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 | Translated 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.