Exemple #1
0
        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);
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        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);
        }
Exemple #4
0
        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;
            }
        }