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.