Difference between revisions of "Friend Services"

From 3dbrew
Jump to navigation Jump to search
(Add information about ApproachContexts)
Line 507: Line 507:
 
|}
 
|}
  
 +
=Approach Contexts=
 +
The approach context (in the form of an [[Friend_Services#Encrypted_ApproachContext_Payload|encrypted payload]]) of the console can be retrieved using [[FRDU:GetMyApproachContext]].
 +
 +
[[Friend_Services#Encrypted_ApproachContext_Payload|Encrypted payloads]] can be decrypted using [[FRDU:DecryptApproachContext]].
 +
 +
It is possible to add a friend using an [[Friend_Services#Encrypted_ApproachContext_Payload|encrypted payload]] using [[FRDA:AddFriendWithApproach]].
 +
 +
==ApproachContext==
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset !! Size !! Description
 +
|-
 +
| 0x0 || 0x48 || [[Friend_Services#Friend_Profile|Friend Profile]] of the console that created this approach context
 +
|-
 +
| 0x48 || 0x1 || bool, Has Mii
 +
|-
 +
| 0x49 || 0x1 || bool, Profanity Flag
 +
|-
 +
| 0x4A || 0x1 || u8, [[Mii#Mii_format|Mii Character Set]]
 +
|-
 +
| 0x4B || 0x70 || [[Friend_Services#Mii_Data|Friend Mii Data]] wrapped using [[APT:Wrap]]
 +
|-
 +
| 0xBB || 0x16 || 10-Character UTF-16 Screen Name (10 characters + null termination)
 +
|-
 +
| 0xD1 || 0x10F || unused
 +
|}
 +
 +
==Encrypted ApproachContext Payload==
 +
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset !! Size !! Description
 +
|-
 +
| 0x0 || 0x1 || (u8) unknown, initialized to 1 internally, set to 1 when the PS encryption command succeeds, otherwise 0. Must be 1 when decrypting, otherwise error 0xE0E0C4E9 is returned
 +
|-
 +
| 0x1 || 0x1 || (u8) unknown, always set to 0
 +
|-
 +
| 0x2 || 0x1 || (u8) unknown, initialized to 2 internally, always set to either 1 when the PS encryption command succeeds, or otherwise 0. Must be 1 when decrypting, otherwise error 0xE0E0C4E9 is returned
 +
|-
 +
| 0x3 || 0x1 || (u8) unknown, always set to 0
 +
|-
 +
| 0x4 || 0x4 || u32, Principal ID (part of nonce)
 +
|-
 +
| 0x8 || 0x8 || u64, Friend Code (part of nonce)
 +
|-
 +
| 0x10 || 0x1E0 || [[Friend_Services#ApproachContext|ApproachContext]]
 +
|-
 +
| 0x1F0 || 0x10 || AES-CCM MAC over the encrypted payload at 0x10 thru 0x1F0
 +
|}
  
  

Revision as of 21:41, 16 December 2024

Friend Service "frd:u"

Command Header Description
0x00010000 HasLoggedIn
0x00020000 IsOnline
0x00030002 Login
0x00040000 Logout
0x00050000 GetMyFriendKey
0x00060000 GetMyPreference
0x00070000 GetMyProfile
0x00080000 GetMyPresence
0x00090000 GetMyScreenName
0x000A0000 GetMyMii
0x000B0000 GetMyLocalAccountId
0x000C0000 GetMyPlayingGame
0x000D0000 GetMyFavoriteGame
0x000E0000 GetMyNcPrincipalId
0x000F0000 GetMyComment
0x00100040 GetMyPassword
0x00110080 GetFriendKeyList
0x00120042 GetFriendPresence
0x00130142 GetFriendScreenName
0x00140044 GetFriendMii
0x00150042 GetFriendProfile
0x00160042 GetFriendRelationship
0x00170042 GetFriendAttributeFlags
0x00180044 GetFriendPlayingGame
0x00190042 GetFriendFavoriteGame
0x001A00C4 GetFriendInfo
0x001B0080 IsIncludedInFriendList
0x001C0042 UnscrambleLocalFriendCode
0x001D0002 UpdateGameModeDescription
0x001E02C2 UpdateMyPresence
0x001F0042 SendInvitation
0x00200002 AttachToEventNotification
0x00210040 SetNotificationMask
0x00220040 GetEventNotification
0x00230000 GetLastResponseResult
0x00240040 PrincipalIdToFriendCode
0x00250080 FriendCodeToPrincipalId
0x00260080 IsValidFriendCode
0x00270040 ResultToErrorCode
0x00280244 RequestGameAuthentication
0x00290000 GetGameAuthenticationData
0x002A0204 RequestServiceLocator
0x002B0000 GetServiceLocatorData
0x002C0002 DetectNatProperties
0x002D0000 GetNatProperties
0x002E0000 GetServerTimeDifference
0x002F0040 AllowHalfAwake
0x00300000 GetServerTypes
0x00310082 GetFriendComment
0x00320042 SetClientSdkVersion
0x00330000 GetMyApproachContext
0x00340046 AddFriendWithApproach
0x00350082 DecryptApproachContext
0x00360000 GetExtendedNatProperties

"frd:n"

Command Header Description
0x00010000 GetHandleOfNdmStatusChangedEvent
0x00020000 Resume
0x00030040 SuspendAsync
0x00040000 QueryStatus

"frd:a"

This contains a similar (probably the same) command handler from 0x0001.... to 0x002F.... as them in frd:u. In addition, it also contains

Command Header Description
0x04010100 CreateLocalAccount
0x04020040 ?
0x04030040 SetLocalAccountId
0x04040000 ?
0x04050000 Used in creating the user Mii. No cmdbuff parameters.
0x04060042 AddFriendOnline
0x04070D80 AddFriendOffline
0x040802C0 ?
0x04090100 RemoveFriend
0x040A0100 UpdatePlayingGame
0x040B00C0 UpdatePreferences
0x040C0800 UpdateMii
0x040D0100 UpdateFavoriteGame
0x040E0040 UpdateNcPrincipalId
0x040F... UpdateComment
0x04100000 ?

HTTPS Requests

Trusted RootCAs

No RootCertChain(s) are used. For the nasc site, friends-module uses HTTPC:AddDefaultCert with the following certIDs: 0x1, 0x2, and 0x3.

Types

FriendKey

Offset Size Description
0x0 0x4 Principal ID
0x4 0x4 padding
0x8 0x8 Friend Code

GameKey

Offset Size Description
0x0 0x8 u64, Title ID
0x8 0x2 u16, Title Version
0xA 0x6 Unused padding.

Presence

Offset Size Description
0x0 0x4 u32 JoinAvailabilityFlag
0x4 0x4 u32 MatchmakeSystemType
0x8 0x4 u32 JoinGameID
0xC 0x4 u32 JoinGameMode
0x10 0x4 u32 OwnerPrincipalID
0x14 0x4 u32 JoinGroupID
0x18 0x14 u8 ApplicationArg[20]

Mii Data

Offset Size Description
0x0 0x1 bool, ProfanityFlag
0x1 0x1 Mii character set
0x2 0x1 bool, DirtyFlag
0x3 0x1 padding
0x4 0x5C Mii data

Profile

Offset Size Description
0x0 0x1 u8, Region
0x1 0x1 u8, Country
0x2 0x1 u8, Area
0x3 0x1 u8, Language
0x4 0x1 u8, Platform, always 2 (PLATFORM_CTR)
0x5 0x3 padding

FriendProfile

Offset Size Description
0x0 0x8 Profile
0x8 0x10 GameKey of favorite game
0x18 0x4 u32, NcPrincipalID
0x1C 0x22 16-Character UTF-16 Personal Message (16 characters + null termination)
0x3E 0x2 padding
0x40 0x8 NEX Timestamp when this friend was last seen online

FriendInfo

Offset Size Description
0x0 0x10 FriendKey of this friend
0x10 0x8 NEX Timestamp when this friend was added to the friends list
0x18 0x1 The relationship with this friend
0x19 0x7 padding
0x20 0x48 FriendProfile of this friend
0x68 0x16 10-Character UTF-16 Screen Name (10 characters + null termination)
0x7E 0x1 u8, Mii character set
0x7F 0x1 padding
0x80 0x60 This friend's Mii


GameAuthenticationData

Offset Size Description
0x0 0x4 NASC Login Result
0x4 0x4 HTTP Status Code
0x8 0x20 Server Address (string)
0x28 0x2 Server Port
0x2A 0x6 padding
0x30 0x100 Token for game server authentication (string)
0x130 0x8 NEX Timestamp for server time

ServiceLocatorData

Offset Size Description
0x0 0x4 NASC Login Result
0x4 0x4 HTTP Status Code
0x8 0x80 Service Host (string)
0x88 0x100 Service Token (string)
0x188 0x1 statusdata from NASC response
0x189 0x7 padding
0x190 0x8 NEX Timestamp for server time

Approach Contexts

The approach context (in the form of an encrypted payload) of the console can be retrieved using FRDU:GetMyApproachContext.

Encrypted payloads can be decrypted using FRDU:DecryptApproachContext.

It is possible to add a friend using an encrypted payload using FRDA:AddFriendWithApproach.

ApproachContext

Offset Size Description
0x0 0x48 Friend Profile of the console that created this approach context
0x48 0x1 bool, Has Mii
0x49 0x1 bool, Profanity Flag
0x4A 0x1 u8, Mii Character Set
0x4B 0x70 Friend Mii Data wrapped using APT:Wrap
0xBB 0x16 10-Character UTF-16 Screen Name (10 characters + null termination)
0xD1 0x10F unused

Encrypted ApproachContext Payload

Offset Size Description
0x0 0x1 (u8) unknown, initialized to 1 internally, set to 1 when the PS encryption command succeeds, otherwise 0. Must be 1 when decrypting, otherwise error 0xE0E0C4E9 is returned
0x1 0x1 (u8) unknown, always set to 0
0x2 0x1 (u8) unknown, initialized to 2 internally, always set to either 1 when the PS encryption command succeeds, or otherwise 0. Must be 1 when decrypting, otherwise error 0xE0E0C4E9 is returned
0x3 0x1 (u8) unknown, always set to 0
0x4 0x4 u32, Principal ID (part of nonce)
0x8 0x8 u64, Friend Code (part of nonce)
0x10 0x1E0 ApproachContext
0x1F0 0x10 AES-CCM MAC over the encrypted payload at 0x10 thru 0x1F0


Notification Events

The friends module exposes a "Notification Events" system that allows client sessions to be notified of various related events.

A client sets its per-session notification event signaling handle using FRDU:AttachToEventNotification.

The client can then customize for which Notification Event Types it shall receive notifications using FRDU:SetNotificationMask.

Once the handle has been signaled by the friends module, the client can use FRDU:GetEventNotification to receive the notifications.

Notification Event Types

Value Description
1 The console went online.
2 The console went offline.
3 A friend is now present (went online).
5 A friend changed their Mii.
6 A friend changed their Profile.
7 A friend is no longer present (went offline).
8 A friend has added you back as a friend (if you had added them before as a "provisionally registered" friend).
9 A friend sent you a **joinable** game invitation(?) (only signaled when the console's JoinGameID matches that of the friend).
146 A friend changed their favorite game.
147 A friend changed their personal message.
149 A friend sent you an invitation. (signaled regardless of whether the console's JoinGameID matches that of the friend)

EventNotification

Offset Size Description
0x0 0x1 u8, Event Type
0x1 0x7 padding
0x8 0x10 FriendKey of the friend who caused this notification to be sent

Relationship Types

Every valid entry in the internal friends list contains a relationship field.

Value Description
0 The target has been added locally and on the server, but is only "provisionally registered." The target has not added you as a friend.
1 The target has been added locally and on the server and is fully registered: the target has also added you as a friend.
2 No relationship between you and the target has been found: neither you nor the target have added each other.
3 The relationship has been deleted: the target has deleted your friend card.
4 The target has been added locally: you were not online when you added the target. (presumably only happens when the "Local" method of adding a friend is used. When the system connects to the internet, a background task runs to register this relationship on the friends server.)

Attribute Flags

Flag Description
0x1 Unknown (something like "target ever registered you"?), set when relationship type is 1, 3 or 4
0x2 Unknown, set only when relationship type is 1

NASC Result

Value Description
001 Success.
101 Game server is under maintenance.
102 Device is banned.
107 Invalid product code.
109 Invalid/missing request parameter.
110 Game server is no longer available.
112 Invalid SVC.
119 Invalid FPD version.
120 Invalid title version.
121 Invalid device certificate.
122 Invalid PID HMAC.
123 ROM ID is banned.
125 Invalid Game ID.
127 Invalid key hash.


Server Types

The server type is stored internally as a combination of two values, the first value represents the server type letter and the second value is the number that follows it. For example, the production server type is "L1", so the first value is 0 and the second value is 1.

Official servers only support the letters L, C, S, D, I, T, J or U.

Value Server Type Letter
0 L
1 C
2 S
3 D
4 I
5 T
6 U (fallback to default value)
7 J
8 X
9 A
10 B
11 C
12 D
13 E
14 F
15 G
16 H
17 I
18 J
19 K
20 L
21 M
22 N
23 O
24 P
25 Q
>=26 U