Difference between revisions of "ACT Services"

From 3dbrew
Jump to navigation Jump to search
(Add more ACT commands)
(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.