/// <summary> /// Sends a message to Steam /// </summary> /// <param name="message">The message to send</param> /// <returns>An awaitable task</returns> protected internal async Task SendAsync(NetworkMessage message) { if (message == null) { throw new ArgumentNullException(nameof(message)); } await NetLog.VerboseAsync($"Sending {(message.Protobuf ? "protobuf" : "struct")} message with type {message.MessageType}"); await SendAsync(message.WithClientInfo(_steamId, _sessionId).Serialize()).ConfigureAwait(false); }
private async Task ProcessEncryptRequest(NetworkMessage message) { ChannelEncryptRequest encryptRequest = message.Deserialize <ChannelEncryptRequest>(); await NetLog.VerboseAsync($"Encrypting channel on protocol version {encryptRequest.ProtocolVersion} in universe {encryptRequest.Universe}").ConfigureAwait(false); byte[] challange = encryptRequest.Challenge.All(b => b == 0) ? encryptRequest.Challenge : null; // check if all the values were made 0 by the marshal byte[] publicKey = UniverseUtils.GetPublicKey(encryptRequest.Universe); if (publicKey == null) { await NetLog.ErrorAsync($"Cannot find public key for universe {encryptRequest.Universe}").ConfigureAwait(false); throw new InvalidOperationException($"Public key does not exist for universe {encryptRequest.Universe}"); } byte[] tempSessionKey = CryptoUtils.GenerateBytes(32); byte[] encryptedHandshake = null; using (RsaCrypto rsa = new RsaCrypto(publicKey)) { if (challange != null) { byte[] handshakeToEncrypt = new byte[tempSessionKey.Length + challange.Length]; Array.Copy(tempSessionKey, handshakeToEncrypt, tempSessionKey.Length); Array.Copy(challange, 0, handshakeToEncrypt, tempSessionKey.Length, challange.Length); encryptedHandshake = rsa.Encrypt(handshakeToEncrypt); } else { encryptedHandshake = rsa.Encrypt(tempSessionKey); } } Encryption = challange != null ? (IEncryptor) new HmacEncryptor(tempSessionKey) : new SimpleEncryptor(tempSessionKey); var encryptResponse = NetworkMessage.CreateMessage(MessageType.ChannelEncryptResponse, new ChannelEncryptResponse { KeySize = 128, KeyHash = CryptoUtils.CrcHash(encryptedHandshake), EncryptedHandshake = encryptedHandshake, ProtocolVersion = 1, }); await SendAsync(encryptResponse).ConfigureAwait(false); }