From a817a7ccd047117714bb5fd407b44367e0ac4d77 Mon Sep 17 00:00:00 2001 From: SuperMarioDaBom Date: Sun, 16 Jul 2023 21:20:04 -0700 Subject: [PATCH] Merge authentication and secure servers --- globals/globals.go | 10 ++++- globals/password_from_pid.go | 22 +++++++++++ grpc/grpc_server.go | 3 +- grpc/send_user_notification_wiiu.go | 2 +- main.go | 5 ++- nex/authentication.go | 38 +++++++++++++++++++ nex/connect.go | 14 +++---- ..._common_authentication_server_protocols.go | 28 ++++++++++++++ nex/register_nex_protocols.go | 12 +++--- nex/secure-connection/register.go | 6 +-- nex/secure-connection/register_ex.go | 6 +-- nex/{server.go => secure.go} | 26 ++++++------- 12 files changed, 135 insertions(+), 37 deletions(-) create mode 100644 globals/password_from_pid.go create mode 100644 nex/authentication.go create mode 100644 nex/register_common_authentication_server_protocols.go rename nex/{server.go => secure.go} (67%) diff --git a/globals/globals.go b/globals/globals.go index 34bdc91..eb50d70 100644 --- a/globals/globals.go +++ b/globals/globals.go @@ -2,11 +2,19 @@ package globals import ( "github.com/PretendoNetwork/friends-secure/types" + pb "github.com/PretendoNetwork/grpc-go/account" "github.com/PretendoNetwork/nex-go" "github.com/PretendoNetwork/plogger-go" + "google.golang.org/grpc" + "google.golang.org/grpc/metadata" ) var Logger = plogger.NewLogger() -var NEXServer *nex.Server +var KerberosPassword = "password" // * Default password +var AuthenticationServer *nex.Server +var SecureServer *nex.Server var ConnectedUsers map[uint32]*types.ConnectedUser var AESKey []byte +var GRPCAccountClientConnection *grpc.ClientConn +var GRPCAccountClient pb.AccountClient +var GRPCAccountCommonMetadata metadata.MD diff --git a/globals/password_from_pid.go b/globals/password_from_pid.go new file mode 100644 index 0000000..f59823c --- /dev/null +++ b/globals/password_from_pid.go @@ -0,0 +1,22 @@ +package globals + +import ( + "context" + + pb "github.com/PretendoNetwork/grpc-go/account" + "github.com/PretendoNetwork/nex-go" + "github.com/PretendoNetwork/nex-protocols-go/globals" + "google.golang.org/grpc/metadata" +) + +func PasswordFromPID(pid uint32) (string, uint32) { + ctx := metadata.NewOutgoingContext(context.Background(), GRPCAccountCommonMetadata) + + response, err := GRPCAccountClient.GetNEXPassword(ctx, &pb.GetNEXPasswordRequest{Pid: pid}) + if err != nil { + globals.Logger.Error(err.Error()) + return "", nex.Errors.RendezVous.InvalidUsername + } + + return response.Password, 0 +} diff --git a/grpc/grpc_server.go b/grpc/grpc_server.go index a6dc2c5..cf1f0d6 100644 --- a/grpc/grpc_server.go +++ b/grpc/grpc_server.go @@ -3,6 +3,7 @@ package grpc import ( "log" "net" + "os" pb "github.com/PretendoNetwork/grpc-go/friends" "google.golang.org/grpc" @@ -13,7 +14,7 @@ type gRPCFriendsServer struct { } func StartGRPCServer() { - listener, err := net.Listen("tcp", ":50051") + listener, err := net.Listen("tcp", ":"+os.Getenv("PN_FRIENDS_GRPC_SERVER_PORT")) if err != nil { log.Fatalf("failed to listen: %v", err) } diff --git a/grpc/send_user_notification_wiiu.go b/grpc/send_user_notification_wiiu.go index 2fe6c08..cf3547b 100644 --- a/grpc/send_user_notification_wiiu.go +++ b/grpc/send_user_notification_wiiu.go @@ -34,7 +34,7 @@ func (s *gRPCFriendsServer) SendUserNotificationWiiU(ctx context.Context, in *pb requestPacket.AddFlag(nex.FlagNeedsAck) requestPacket.AddFlag(nex.FlagReliable) - globals.NEXServer.Send(requestPacket) + globals.SecureServer.Send(requestPacket) } return &empty.Empty{}, nil diff --git a/main.go b/main.go index c3689c0..508f82e 100644 --- a/main.go +++ b/main.go @@ -10,10 +10,11 @@ import ( var wg sync.WaitGroup func main() { - wg.Add(2) + wg.Add(3) go grpc.StartGRPCServer() - go nex.StartNEXServer() + go nex.StartAuthenticationServer() + go nex.StartSecureServer() wg.Wait() } diff --git a/nex/authentication.go b/nex/authentication.go new file mode 100644 index 0000000..c053c19 --- /dev/null +++ b/nex/authentication.go @@ -0,0 +1,38 @@ +package nex + +import ( + "fmt" + "os" + + "github.com/PretendoNetwork/friends-secure/globals" + "github.com/PretendoNetwork/nex-go" +) + +var serverBuildString string + +func StartAuthenticationServer() { + globals.AuthenticationServer = nex.NewServer() + globals.AuthenticationServer.SetPRUDPVersion(0) + globals.AuthenticationServer.SetPRUDPProtocolMinorVersion(0) // TODO: Figure out what to put here + globals.AuthenticationServer.SetDefaultNEXVersion(&nex.NEXVersion{ + Major: 1, + Minor: 0, // TODO: Figure out what to put here + Patch: 0, + }) + globals.AuthenticationServer.SetKerberosKeySize(16) + globals.AuthenticationServer.SetKerberosPassword(globals.KerberosPassword) + globals.AuthenticationServer.SetAccessKey("ridfebb9") + + globals.AuthenticationServer.On("Data", func(packet *nex.PacketV1) { + request := packet.RMCRequest() + + fmt.Println("==Friends - Auth==") + fmt.Printf("Protocol ID: %#v\n", request.ProtocolID()) + fmt.Printf("Method ID: %#v\n", request.MethodID()) + fmt.Println("===============") + }) + + registerCommonAuthenticationServerProtocols() + + globals.AuthenticationServer.Listen(fmt.Sprintf(":%s", os.Getenv("PN_FRIENDS_AUTHENTICATION_SERVER_PORT"))) +} diff --git a/nex/connect.go b/nex/connect.go index 342528e..d09687c 100644 --- a/nex/connect.go +++ b/nex/connect.go @@ -10,17 +10,17 @@ func connect(packet *nex.PacketV0) { packet.Sender().SetClientConnectionSignature(packet.ConnectionSignature()) payload := packet.Payload() - stream := nex.NewStreamIn(payload, globals.NEXServer) + stream := nex.NewStreamIn(payload, globals.SecureServer) ticketData, _ := stream.ReadBuffer() requestData, _ := stream.ReadBuffer() - serverKey := nex.DeriveKerberosKey(2, []byte(globals.NEXServer.KerberosPassword())) + serverKey := nex.DeriveKerberosKey(2, []byte(globals.SecureServer.KerberosPassword())) // TODO: use random key from auth server ticketDataEncryption, _ := nex.NewKerberosEncryption(serverKey) decryptedTicketData := ticketDataEncryption.Decrypt(ticketData) - ticketDataStream := nex.NewStreamIn(decryptedTicketData, globals.NEXServer) + ticketDataStream := nex.NewStreamIn(decryptedTicketData, globals.SecureServer) _, _ = ticketDataStream.ReadUInt64LE() // expiration time _, _ = ticketDataStream.ReadUInt32LE() // User PID @@ -28,22 +28,22 @@ func connect(packet *nex.PacketV0) { requestDataEncryption, _ := nex.NewKerberosEncryption(sessionKey) decryptedRequestData := requestDataEncryption.Decrypt(requestData) - requestDataStream := nex.NewStreamIn(decryptedRequestData, globals.NEXServer) + requestDataStream := nex.NewStreamIn(decryptedRequestData, globals.SecureServer) userPID, _ := requestDataStream.ReadUInt32LE() // User PID _, _ = requestDataStream.ReadUInt32LE() //CID of secure server station url responseCheck, _ := requestDataStream.ReadUInt32LE() - responseValueStream := nex.NewStreamOut(globals.NEXServer) + responseValueStream := nex.NewStreamOut(globals.SecureServer) responseValueStream.WriteUInt32LE(responseCheck + 1) - responseValueBufferStream := nex.NewStreamOut(globals.NEXServer) + responseValueBufferStream := nex.NewStreamOut(globals.SecureServer) responseValueBufferStream.WriteBuffer(responseValueStream.Bytes()) packet.Sender().UpdateRC4Key(sessionKey) - globals.NEXServer.AcknowledgePacket(packet, responseValueBufferStream.Bytes()) + globals.SecureServer.AcknowledgePacket(packet, responseValueBufferStream.Bytes()) packet.Sender().SetPID(userPID) diff --git a/nex/register_common_authentication_server_protocols.go b/nex/register_common_authentication_server_protocols.go new file mode 100644 index 0000000..3420806 --- /dev/null +++ b/nex/register_common_authentication_server_protocols.go @@ -0,0 +1,28 @@ +package nex + +import ( + "os" + + "github.com/PretendoNetwork/friends-secure/globals" + nex "github.com/PretendoNetwork/nex-go" + ticket_granting "github.com/PretendoNetwork/nex-protocols-common-go/ticket-granting" +) + +func registerCommonAuthenticationServerProtocols() { + ticketGrantingProtocol := ticket_granting.NewCommonTicketGrantingProtocol(globals.AuthenticationServer) + + secureStationURL := nex.NewStationURL("") + secureStationURL.SetScheme("prudps") + secureStationURL.SetAddress(os.Getenv("PN_FRIENDS_SECURE_SERVER_HOST")) + secureStationURL.SetPort(os.Getenv("PN_FRIENDS_SECURE_SERVER_PORT")) + secureStationURL.SetCID("1") + secureStationURL.SetPID("2") + secureStationURL.SetSID("1") + secureStationURL.SetStream("10") + secureStationURL.SetType("2") + + ticketGrantingProtocol.SetSecureStationURL(secureStationURL) + ticketGrantingProtocol.SetBuildName(serverBuildString) + + globals.AuthenticationServer.SetPasswordFromPIDFunction(globals.PasswordFromPID) +} diff --git a/nex/register_nex_protocols.go b/nex/register_nex_protocols.go index 34969fb..a1cce64 100644 --- a/nex/register_nex_protocols.go +++ b/nex/register_nex_protocols.go @@ -7,16 +7,16 @@ import ( nex_friends_wiiu "github.com/PretendoNetwork/friends-secure/nex/friends-wiiu" nex_secure_connection "github.com/PretendoNetwork/friends-secure/nex/secure-connection" account_management "github.com/PretendoNetwork/nex-protocols-go/account-management" - friends_3ds "github.com/PretendoNetwork/nex-protocols-go/friends/3ds" - friends_wiiu "github.com/PretendoNetwork/nex-protocols-go/friends/wiiu" + friends_3ds "github.com/PretendoNetwork/nex-protocols-go/friends-3ds" + friends_wiiu "github.com/PretendoNetwork/nex-protocols-go/friends-wiiu" secure_connection "github.com/PretendoNetwork/nex-protocols-go/secure-connection" ) func registerNEXProtocols() { - secureConnectionProtocol := secure_connection.NewSecureConnectionProtocol(globals.NEXServer) - accountManagementProtocol := account_management.NewAccountManagementProtocol(globals.NEXServer) - friendsWiiUProtocol := friends_wiiu.NewFriendsWiiUProtocol(globals.NEXServer) - friends3DSProtocol := friends_3ds.NewFriends3DSProtocol(globals.NEXServer) + secureConnectionProtocol := secure_connection.NewSecureConnectionProtocol(globals.SecureServer) + accountManagementProtocol := account_management.NewAccountManagementProtocol(globals.SecureServer) + friendsWiiUProtocol := friends_wiiu.NewFriendsWiiUProtocol(globals.SecureServer) + friends3DSProtocol := friends_3ds.NewFriends3DSProtocol(globals.SecureServer) // Account Management protocol handles accountManagementProtocol.NintendoCreateAccount(nex_account_management.NintendoCreateAccount) diff --git a/nex/secure-connection/register.go b/nex/secure-connection/register.go index baf454d..a508c0f 100644 --- a/nex/secure-connection/register.go +++ b/nex/secure-connection/register.go @@ -19,10 +19,10 @@ func Register(err error, client *nex.Client, callID uint32, stationUrls []*nex.S localStationURL := localStation.EncodeToString() - rmcResponseStream := nex.NewStreamOut(globals.NEXServer) + rmcResponseStream := nex.NewStreamOut(globals.SecureServer) rmcResponseStream.WriteUInt32LE(0x10001) // Success - rmcResponseStream.WriteUInt32LE(globals.NEXServer.ConnectionIDCounter().Increment()) + rmcResponseStream.WriteUInt32LE(globals.SecureServer.ConnectionIDCounter().Increment()) rmcResponseStream.WriteString(localStationURL) rmcResponseBody := rmcResponseStream.Bytes() @@ -44,5 +44,5 @@ func Register(err error, client *nex.Client, callID uint32, stationUrls []*nex.S responsePacket.AddFlag(nex.FlagNeedsAck) responsePacket.AddFlag(nex.FlagReliable) - globals.NEXServer.Send(responsePacket) + globals.SecureServer.Send(responsePacket) } diff --git a/nex/secure-connection/register_ex.go b/nex/secure-connection/register_ex.go index e5865bc..23d75d3 100644 --- a/nex/secure-connection/register_ex.go +++ b/nex/secure-connection/register_ex.go @@ -40,10 +40,10 @@ func RegisterEx(err error, client *nex.Client, callID uint32, stationUrls []*nex localStationURL := localStation.EncodeToString() - rmcResponseStream := nex.NewStreamOut(globals.NEXServer) + rmcResponseStream := nex.NewStreamOut(globals.SecureServer) rmcResponseStream.WriteUInt32LE(0x10001) // Success - rmcResponseStream.WriteUInt32LE(globals.NEXServer.ConnectionIDCounter().Increment()) + rmcResponseStream.WriteUInt32LE(globals.SecureServer.ConnectionIDCounter().Increment()) rmcResponseStream.WriteString(localStationURL) rmcResponseBody := rmcResponseStream.Bytes() @@ -65,5 +65,5 @@ func RegisterEx(err error, client *nex.Client, callID uint32, stationUrls []*nex responsePacket.AddFlag(nex.FlagNeedsAck) responsePacket.AddFlag(nex.FlagReliable) - globals.NEXServer.Send(responsePacket) + globals.SecureServer.Send(responsePacket) } diff --git a/nex/server.go b/nex/secure.go similarity index 67% rename from nex/server.go rename to nex/secure.go index 016225b..cb45b8b 100644 --- a/nex/server.go +++ b/nex/secure.go @@ -15,16 +15,16 @@ import ( _ "github.com/PretendoNetwork/nex-protocols-go" ) -func StartNEXServer() { - globals.NEXServer = nex.NewServer() - globals.NEXServer.SetFragmentSize(900) - globals.NEXServer.SetPRUDPVersion(0) - globals.NEXServer.SetKerberosKeySize(16) - globals.NEXServer.SetKerberosPassword(os.Getenv("PN_FRIENDS_CONFIG_KERBEROS_PASSWORD")) - globals.NEXServer.SetPingTimeout(20) // Maybe too long? - globals.NEXServer.SetAccessKey("ridfebb9") +func StartSecureServer() { + globals.SecureServer = nex.NewServer() + globals.SecureServer.SetFragmentSize(900) + globals.SecureServer.SetPRUDPVersion(0) + globals.SecureServer.SetKerberosKeySize(16) + globals.SecureServer.SetKerberosPassword(os.Getenv("PN_FRIENDS_CONFIG_KERBEROS_PASSWORD")) + globals.SecureServer.SetPingTimeout(20) // Maybe too long? + globals.SecureServer.SetAccessKey("ridfebb9") - globals.NEXServer.On("Data", func(packet *nex.PacketV0) { + globals.SecureServer.On("Data", func(packet *nex.PacketV0) { request := packet.RMCRequest() fmt.Println("==Friends - Secure==") @@ -33,7 +33,7 @@ func StartNEXServer() { fmt.Println("====================") }) - globals.NEXServer.On("Kick", func(packet *nex.PacketV0) { + globals.SecureServer.On("Kick", func(packet *nex.PacketV0) { pid := packet.Sender().PID() if globals.ConnectedUsers[pid] == nil { @@ -56,13 +56,13 @@ func StartNEXServer() { fmt.Println("Leaving (Kick)") }) - globals.NEXServer.On("Disconnect", func(packet *nex.PacketV0) { + globals.SecureServer.On("Disconnect", func(packet *nex.PacketV0) { fmt.Println("Leaving (Disconnect)") }) - globals.NEXServer.On("Connect", connect) + globals.SecureServer.On("Connect", connect) registerNEXProtocols() - globals.NEXServer.Listen(":60001") + globals.SecureServer.Listen(":" + os.Getenv("PN_FRIENDS_SECURE_SERVER_PORT")) }