public void DeserializatinTest() { var pq = new BigInteger("2821213750622862821", 10); var resPq = new TResPQ { Nonce = new byte[16], ServerNonce = new byte[16], PqAsBinary = pq.ToByteArrayUnsigned(), ServerPublicKeyFingerprints = new TVector <long>(5611009732197236050) }; _random.NextBytes(resPq.Nonce); _random.NextBytes(resPq.ServerNonce); var response = Step2ClientHelper.GetRequest(resPq, PublicKey, out var newNonce); var buffer = Serializer.Serialize(response); var dataNew = new byte[buffer.ReadableBytes]; buffer.ReadBytes(dataNew); var a = new Step2DhExchange(); var dataOld = a.ToBytes(resPq.Nonce, resPq.ServerNonce, newNonce, new List <byte[]>() { BitConverter.GetBytes(5611009732197236050) }, new Old.MTProto.Crypto.BigInteger("2821213750622862821", 10)); Assert.Equal(dataNew, dataOld); }
public void SimpleTest() { var request = Step1ClientHelper.GetRequest(); var publicKeyFingerPrint = RSAHelper.GetFingerprint(PublicKey); var resPq = Step1ServerHelper.GetResponse(request.Nonce, publicKeyFingerPrint, out var p, out var q, out var serverNonce); var reqDhParams = Step2ClientHelper.GetRequest(resPq, PublicKey, out var newNonceFromClient); var serverDhParams = Step2ServerHelper.GetResponse(reqDhParams, PrivateKey, out var parameters, out var newNonceFromServer); Assert.Equal(newNonceFromClient, newNonceFromServer); var setClientDhParams = Step3ClientHelper.GetRequest((TServerDHParamsOk)serverDhParams, newNonceFromClient, out var clientAgree, out var serverTime); var setClientDhParamsAnswer = Step3ServerHelper.GetResponse(setClientDhParams, newNonceFromClient, parameters, out var serverAgree, out var serverSalt); Assert.Equal(serverAgree.ToByteArray(), clientAgree); }
public void ValidationTest() { var pqData = new byte[] { 35, 85, 96, 197, 87, 11, 113, 253 }; var resPq = new TResPQ { Nonce = new byte[16], ServerNonce = new byte[16], PqAsBinary = pqData, ServerPublicKeyFingerprints = new TVector <long>(5611009732197236050) }; _random.NextBytes(resPq.Nonce); _random.NextBytes(resPq.ServerNonce); var response = Step2ClientHelper.GetRequest(resPq, PublicKey, out var newNonce); var a = new Step2DhExchange(); var bytes = a.ToBytes(resPq.Nonce, resPq.ServerNonce, newNonce, new List <byte[]>() { BitConverter.GetBytes(5611009732197236050) }, new Old.MTProto.Crypto.BigInteger(1, pqData)); var buffer = PooledByteBufferAllocator.Default.Buffer(); buffer.WriteBytes(bytes); var responseOld = (RequestReqDHParams)Serializer.Deserialize(buffer); Assert.Equal(response.PAsBinary, responseOld.PAsBinary); Assert.Equal(response.QAsBinary, responseOld.QAsBinary); Assert.Equal(response.Nonce, responseOld.Nonce); Assert.Equal(response.ServerNonce, responseOld.ServerNonce); Assert.Equal(response.PublicKeyFingerprint, responseOld.PublicKeyFingerprint); var responseInnerData = Decrypt(response, out var responseInnerDataChecksum); var responseOldInnerData = Decrypt(responseOld, out var responseOldInnerDataChecksum); Assert.Equal(responseInnerDataChecksum, responseOldInnerDataChecksum); Assert.Equal(responseInnerData.PqAsBinary, responseOldInnerData.PqAsBinary); Assert.Equal(responseInnerData.PAsBinary, responseOldInnerData.PAsBinary); Assert.Equal(responseInnerData.QAsBinary, responseOldInnerData.QAsBinary); Assert.Equal(responseInnerData.Nonce, responseOldInnerData.Nonce); Assert.Equal(responseInnerData.ServerNonce, responseOldInnerData.ServerNonce); Assert.Equal(responseInnerData.NewNonce, responseOldInnerData.NewNonce); }
protected override void ChannelRead0(IChannelHandlerContext ctx, IObject msg) { switch (msg) { case TResPQ resPq: Guard.That(resPq.Nonce).IsItemsEquals(_nonce); Log.Debug($"#{ClientSettings.ClientSession.SessionId}: TResPQ step complete"); var requestReqDhParams = Step2ClientHelper.GetRequest(resPq, ClientSettings.PublicKey, out _newNonce); ctx.WriteAndFlushAsync(requestReqDhParams); break; case TServerDHParamsOk dhParamsOk: Log.Debug($"#{ClientSettings.ClientSession.SessionId}: TServerDHParamsOk step complete"); var request = Step3ClientHelper.GetRequest(dhParamsOk, _newNonce, out _clientAgree, out var serverTime); ClientSettings.ClientSession.TimeOffset = serverTime - (int)DateTimeOffset.Now.ToUnixTimeSeconds(); SessionWriter.Save(ClientSettings.ClientSession) .ContinueWith(_ => ctx.WriteAndFlushAsync(request)); break; case TDhGenOk dhGenOk: Log.Debug($"#{ClientSettings.ClientSession.SessionId}: TDhGenOk step complete"); ClientSettings.ClientSession.AuthKey = new AuthKey(_clientAgree); ClientSettings.ClientSession.ServerSalt = SaltHelper.ComputeSalt(_newNonce, dhGenOk.ServerNonce); SessionWriter.Save(ClientSettings.ClientSession) .ContinueWith(_ => ctx.FireUserEventTriggered(ESystemNotification.HandshakeComplete)); break; case TServerDHParamsFail _: case TDhGenRetry _: case TDhGenFail _: throw new NotSupportedException(); default: ctx.FireChannelRead(msg); break; } }