ACT Services

From 3dbrew
Revision as of 21:11, 20 January 2025 by TimmSkiller (talk | contribs)
Jump to navigation Jump to search


The ACT module handles NNID accounts. This module behaves very similarly to the Wii U implementation (nn::act)

ACT User Service "act:u"

These commands are used generally by most titles, and are also present in act:a.

Command Header Description
0x00010084 Initialize
0x00020040 GetErrorCode
0x00030000 GetLastResponseResult
0x00040000 Cancel
0x00050082 GetCommonInfo
0x000600C2 GetAccountDataBlock/GetAccountInfo
0x00070082 GetAsyncResult
0x000800C2 GetMiiImage
0x00090180 SetNfsPassword
0x000A0000 SetIsApplicationUpdateRequired
0x000B0042 AcquireEulaList
0x000C0082 AcquireTimeZoneList
0x000D0040 GenerateUuid
0x000E0080 GetUuid
0x000F0140 FindSlotNoByUuid
0x00100000 Save
0x00110080 GetTransferableId
0x00120102 AcquireNexServiceToken
0x00130002 GetNexServiceToken
0x00140382 AcquireIndependentServiceToken
0x00150002 GetIndependentServiceToken
0x00160082 AcquireAccountInfo
0x00170084 AcquireAccountIdByPrincipalId
0x00180044 AcquirePrincipalIdByAccountId
0x00190044 AcquireMii
0x001A0042 AcquireAccountInfoRaw
0x001B0084 AcquireOtherTypePrincipalID (stubbed)
0x001C0342 GetCachedIndependentServiceToken
0x001D0004 InquireMailAddressAvailability
0x001E0082 AcquireEula
0x001F0082 AcquireEulaLanguageList
0x00200382 AcquireIndependentServiceTokenV2
0x00210002 GetIndepdendentServiceTokenV2
0x00220342 GetCachedIndependentServiceTokenV2

ACT Admin Service "act:a"

This service is used mainly by the Nintendo Network ID Settings application accessible in System Settings.

Command Header Description
0x04010080 SwapAccounts
0x04020000 CreateConsoleAccount
0x04030040 CommitConsoleAccount
0x04040080 UnbindServerAccount
0x04050040 DeleteConsoleAccount
0x04060240 LoadConsoleAccount
0x04070000 UnloadConsoleAccount
0x04080080 EnableAccountPasswordCache
0x04090040 SetDefaultAccount
0x040A0040 ReplaceAccountId
0x040B0040 GetSupportContext
0x040C0100 SetHostServerSettings
0x040D00C0 SetDefaultHostServerSettings
0x040E02C0 SetHostServerSettingsStr
0x040F0280 SetDefaultHostServerSettingsStr
0x04100040 SetPersistentIdHead
0x04110040 SetTransferableIdCounter
0x041207C0 UpdateMiiData
0x041300C2 UpdateMiiImage
0x04140182 InquireAccountIdAvailability
0x04150EC4 BindToNewServerAccount
0x041602C4 BindToExistentServerAccount
0x041702C4 InquireBindingToExistentServerAccount
0x04180042 DeleteServerAccount
0x04190042 AcquireAccountToken (stubbed)
0x041A01C2 AcquireAccountTokenEx
0x041B0142 AgreeEula
0x041C0042 SyncAccountInfo
0x041D0080 InvalidateAccountToken
0x041E0182 UpdateAccountPassword
0x041F0042 ReissueAccountPassword
0x04200180 SetAccountPasswordInput
0x04210042 UploadMii
0x04220042 InactivateDeviceAssociation
0x04230082 ValidateMailAddress
0x04240044 SendPostingApprovalMail
0x04250042 SendConfirmationMail
0x04260044 SendConfirmationMailForPin
0x04270084 SendMasterKeyMailForPin
0x04280044 ApproveByCreditCard
0x04290082 SendCoppaCodeMail
0x042A0080 SetIsMiiUpdated
0x042B01C4 ReserveTransfer
0x042C0042 CompleteTransfer
0x042D0042 InactivateAccountDeviceAssociation
0x042E0080 SetNetworkTime
0x042F0084 UpdateAccountInfo
0x04300044 UpdateAccountMailAddress
0x04310042 DeleteDeviceAssociation
0x04320042 DeleteAccountDeviceAssociation
0x04330042 CancelTransfer
0x04340003 ReloadSaveData
0x04350042 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.

UUIDs

The ACT service generates UUIDs for accounts and for the console in general.

All UUIDs generated by the service are RFC9562 Version 1 UUIDs.

UUID Types

Regular UUIDs

These are just standard 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 (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

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.

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.

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

Node Data

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

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 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
Offset Size Description
0x0 0x2 Year
0x2 0x1 Month
0x3 0x1 Day
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
Offset Size Description
0x0 0x4 u32 PersistentID
0x4 0x4 padding
0x8 0x8 u64 TransferableIDBase
0x10 0x60 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
Offset Size Description
0x0 0x2 Year
0x2 0x1 Month
0x3 0x1 Day
0x9C 0x4 u32, PrincipalID
0x12 0x4 GetAccountInfo
Offset Size Description
0x0 0x1 NNAS (Nintendo Network Authentication Server) Type
0x1 0x1 NFS (Nintendo Friend Server) Type Value
0x2 0x1 NFS (Nintendo Friend Server) Number
0x3 0x1 padding (0)
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
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 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
Offset Size Description
0x0 0x21 ASCII NULL-terminated NNAS subdomain
0x21 0x3 NFS (Nintendo Friend Server) Environment
0x29 0x24 GetCommonInfo Server environment of default account
Offset Size Description
0x0 0x21 ASCII NULL-terminated NNAS subdomain
0x21 0x3 NFS (Nintendo Friend Server) Environment
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)

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.