コード例 #1
0
ファイル: SimpleSniffer.cs プロジェクト: smeoow/Naive
        public void ServerData(object sender, BytesSegment bs)
        {
            if (serverDone || bs.Len == 0)
            {
                return;
            }
            serverDone = true;
            if (sBuf != null)
            {
                bs.CopyTo(sBuf, 0, bs.Len, sProg);
                sProg += bs.Len;
                if (sProg < sBuf.Length)
                {
                    goto CONTINUE_READ;
                }
                else
                {
                    bs = new BytesSegment(sBuf, 0, sProg);
                }
            }
            if (Tls.Version != 0)
            {
                var hello = new TlsStream.ServerHello();
                try {
                    TlsStream.ParseServerHelloRecord(bs, ref hello, out var size);
                    if (size > bs.Len)
                    {
                        if (sBuf != null)
                        {
                            throw new Exception("sBuf != null");
                        }
                        sBuf = new byte[size];
                        bs.CopyTo(sBuf);
                        sProg = bs.Len;
                        goto CONTINUE_READ;
                    }
                } catch (Exception e) {
                    if (hello.Version != 0)
                    {
                        TlsError = true;
                        Logging.exception(e, Logging.Level.Warning, "parsing tls server hello from " + sender);
                    }
                }
                Tls.Version = Math.Min(Tls.Version, hello.Version);
                Tls.Alpn    = hello.Alpn;
            }
            sBuf = null;
            return;

CONTINUE_READ:
            serverDone = false;
            return;
        }