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. |