TLSharp.Core.MTProto.Crypto.AuthKey.CalcNewNonceHash C# (CSharp) Method

CalcNewNonceHash() public method

public CalcNewNonceHash ( byte newNonce, int number ) : byte[]
newNonce byte
number int
return byte[]
        public byte[] CalcNewNonceHash(byte[] newNonce, int number)
        {
            using (MemoryStream buffer = new MemoryStream(100))
            {
                using (BinaryWriter bufferWriter = new BinaryWriter(buffer))
                {
                    bufferWriter.Write(newNonce);
                    bufferWriter.Write((byte)number);
                    bufferWriter.Write(auxHash);
                    using (SHA1 sha1 = new SHA1Managed())
                    {
                        byte[] hash = sha1.ComputeHash(buffer.GetBuffer(), 0, (int)buffer.Position);
                        byte[] newNonceHash = new byte[16];
                        Array.Copy(hash, 4, newNonceHash, 0, 16);
                        return newNonceHash;
                    }
                }
            }
        }

Usage Example

Exemplo n.º 1
0
        public Step3_Response FromBytes(byte[] response)
        {
            using (MemoryStream responseStream = new MemoryStream(response))
            {
                using (BinaryReader responseReader = new BinaryReader(responseStream))
                {
                    uint code = responseReader.ReadUInt32();
                    if (code == 0x3bcbf734)
                    { // dh_gen_ok
                      //logger.debug("dh_gen_ok");

                        byte[] nonceFromServer = responseReader.ReadBytes(16);
                        // TODO
                        /*
                        if (!nonceFromServer.SequenceEqual(nonce))
                        {
                            logger.error("invalid nonce");
                            return null;
                        }
                        */

                        byte[] serverNonceFromServer = responseReader.ReadBytes(16);

                        // TODO:

                        /*
                        if (!serverNonceFromServer.SequenceEqual(serverNonce))
                        {
                            logger.error("invalid server nonce");
                            return null;
                        }
                        */

                        byte[] newNonceHash1 = responseReader.ReadBytes(16);
                        //logger.debug("new nonce hash 1: {0}", BitConverter.ToString(newNonceHash1));

                        AuthKey authKey = new AuthKey(_gab);

                        byte[] newNonceHashCalculated = authKey.CalcNewNonceHash(newNonce, 1);

                        if (!newNonceHash1.SequenceEqual(newNonceHashCalculated))
                        {
                            throw new InvalidOperationException("invalid new nonce hash");
                        }

                        //logger.info("generated new auth key: {0}", gab);
                        //logger.info("saving time offset: {0}", timeOffset);
                        //TelegramSession.Instance.TimeOffset = timeOffset;

                        return new Step3_Response()
                        {
                            AuthKey = authKey,
                            TimeOffset = timeOffset
                        };
                    }
                    else if (code == 0x46dc1fb9)
                    { // dh_gen_retry
                        throw new NotImplementedException("dh_gen_retry");

                    }
                    else if (code == 0xa69dae02)
                    {
                        // dh_gen_fail
                        throw new NotImplementedException("dh_gen_fail");
                    }
                    else
                    {
                        throw new InvalidOperationException($"dh_gen unknown: {code}");
                    }
                }
            }
        }