Example #1
0
 public void GetTtlの確認()
 {
     //setUp
     var sut = new PacketRr(TestUtil.HexStream2Bytes(Str0), 0);
     uint expected = 0x11E86; //733350
     //exercise
     var actual = sut.Ttl;
     //verify
     Assert.That(actual, Is.EqualTo(expected));
 }
Example #2
0
 public void GetTypeの確認()
 {
     //setUp
     var sut = new PacketRr(TestUtil.HexStream2Bytes(Str0), 0);
     var expected = DnsType.Ns;
     //exercise
     var actual = sut.DnsType;
     //verify
     Assert.That(actual, Is.EqualTo(expected));
 }
Example #3
0
 public void GetDLenの確認()
 {
     //setUp
     var sut = new PacketRr(TestUtil.HexStream2Bytes(Str0), 0);
        ushort expected = 6;
     //exercise
     var actual = sut.DLen;
     //verify
     Assert.That(actual, Is.EqualTo(expected));
 }
Example #4
0
 public void GetData確認()
 {
     //setUp
     var sut = new PacketRr(TestUtil.HexStream2Bytes(Str0), 0);
     var expected = new byte[6];
     Buffer.BlockCopy(TestUtil.HexStream2Bytes(Str0), 10, expected, 0, 6);
     //exercise
     var actual = sut.Data;
     //verify
     Assert.That(actual, Is.EqualTo(expected));
 }
Example #5
0
 public void 実パケット生成したオブジェクトとの比較()
 {
     //setUp
     var sut = new RrCname("aaa.com", 0x00000067, "ytimg.l.google.com");
     var rr = new PacketRr(TestUtil.HexStream2Bytes(Str0), 0);
     var expected = (new RrCname("aaa.com", rr.Ttl, rr.Data)).ToString();
     //exercise
     var actual = sut.ToString();
     //verify
     Assert.That(actual, Is.EqualTo(expected));
 }
Example #6
0
 public void 実パケット生成したオブジェクトとの比較()
 {
     //setUp
     var sut = new RrAaaa("orange.kame.net", 0x00015180, new Ip("2001:200:dff:fff1:216:3eff:feb1:44d7"));
     var rr = new PacketRr(TestUtil.HexStream2Bytes(Str0), 0);
     var expected = (new RrAaaa("orange.kame.net", rr.Ttl, rr.Data)).ToString();
     //exercise
     var actual = sut.ToString();
     //verify
     Assert.That(actual, Is.EqualTo(expected));
 }
Example #7
0
 public void 実パケット生成したオブジェクトとの比較()
 {
     //setUp
     var sut = new RrA("aaa.com", 0x00000e10, new Ip("59.106.27.208"));
     var rr = new PacketRr(TestUtil.HexStream2Bytes(Str0), 0);
     var expected = (new RrA("aaa.com", rr.Ttl, rr.Data)).ToString();
     //exercise
     var actual = sut.ToString();
     //verify
     Assert.That(actual, Is.EqualTo(expected));
 }
Example #8
0
 public void 実パケット生成したオブジェクトとの比較()
 {
     //setUp
     RrMx sut = new RrMx("aaa.com", 0x00000289, 30, "alt3.gmail-smtp-in.l.google.com");
     PacketRr rr = new PacketRr(TestUtil.HexStream2Bytes(str0), 0);
     var expected = (new RrMx("aaa.com", rr.Ttl, rr.Data)).ToString();
     //exercise
     var actual = sut.ToString();
     //verify
     Assert.That(actual, Is.EqualTo(expected));
 }
Example #9
0
 public void 実パケット生成したオブジェクトとの比較()
 {
     //setUp
     var sut = new RrPtr("1.0.0.127.in-addr.arpa.", 0x00000e10, "localhost");
     var rr = new PacketRr(TestUtil.HexStream2Bytes(Str0), 0);
     var expected = (new RrPtr("1.0.0.127.in-addr.arpa.", rr.Ttl, rr.Data)).ToString();
     //exercise
     var actual = sut.ToString();
     //verify
     Assert.That(actual, Is.EqualTo(expected));
 }
Example #10
0
        //バイトイメージの取得
        public byte[] GetBytes()
        {
            var buffer = _dnsHeader.GetBytes();

            for (var i = 0; i < 4; i++)
            {
                var a = _ar[i];
                foreach (var o in a)
                {
                    var dataName = (new Compress(buffer, DnsUtil.Str2DnsName(o.Name))).GetData();
                    var data     = o.Data;
                    var dnsType  = o.DnsType;

                    if (i != 0)
                    {
                        //QDでは、data部分は存在しない
                        if (dnsType == DnsType.Ns || dnsType == DnsType.Cname || dnsType == DnsType.Ptr)
                        {
                            data = (new Compress(buffer, o.Data)).GetData(); //圧縮
                        }
                        else if (dnsType == DnsType.Mx)
                        {
                            var preference = Conv.GetUShort(o.Data, 0);
                            var mlServer   = new byte[o.Data.Length - 2];
                            //System.arraycopy(o.Data, 2, mlServer, 0, o.Data.Length - 2);
                            Buffer.BlockCopy(o.Data, 2, mlServer, 0, o.Data.Length - 2);

                            mlServer = (new Compress(buffer, mlServer)).GetData(); //圧縮
                            data     = Bytes.Create(Conv.GetBytes(preference), mlServer);
                        }
                    }
                    //PacketRrは、QD(i==0)の時、data.Length=0となり、内部でisQueryがセットされる
                    var packetRr = new PacketRr(data.Length);
                    try{
                        packetRr.Cls     = 1;
                        packetRr.DnsType = dnsType;
                        packetRr.Ttl     = o.Ttl; //PacketRr.isQueryがセットされているとき、処理なし
                        packetRr.Data    = data;  //PacketRr.isQueryがセットされているとき、処理なし
                    } catch (IOException e) {
                        //設計上の問題
                        Util.RuntimeException(e.Message);
                    }
                    //PacketRr.isQueryがセットされているとき、getBytes()は4バイト(TTL,DLEN,DATAなし)になっている
                    buffer = Bytes.Create(buffer, dataName, packetRr.GetBytes());
                }
            }
            return(buffer);
        }
Example #11
0
        //パケット解釈のためのコンストラクタ
        public PacketDns(byte[] buffer)
        {
            Init();

            //ヘッダの解釈
            _dnsHeader = new PacketDnsHeader(buffer, 0);
            var offset = _dnsHeader.Length();

            // オペコード 0:標準 1:逆 2:サーバ状態
            //var c = (short)(Util.htons(_headerDns.Flags) & 0x7800);
            //var opcode = (ushort)(c >> 11);
            var flags = _dnsHeader.Flags;
            var opcode = flags & 0x7800;

            if (opcode != 0){
                // 標準問い合せ以外は対応していない
                throw new IOException(string.Format("OPCODE not 0 [CPCODE={0}]", opcode));
            }

            //****************************************
            //質問/回答/権限/追加フィールド取得
            //****************************************
            for (var rr = 0; rr < 4; rr++){
                //ushort max = Util.htons(_headerDns.Count[rr]);//対象フィールドのデータ数
                var max = _dnsHeader.GetCount(rr);
                if (rr == 0 && max != 1){
                    //質問エントリーが1でないパケットは処理できません。
                    throw new IOException(string.Format("QD Entry !=0  [count={0}]", max));
                }
                for (var n = 0; n < max; n++){
                    //名前の取得
                    //offsetの移動  名前のサイズが一定ではないので、そのサイズ分だけ進める
                    var u0 = new UnCompress(buffer, offset);
                    offset = u0.OffSet;
                    var name = u0.HostName;

                    //名前以降のリソースレコードを取得
                    var packetRr = new PacketRr(buffer, offset);

                    var dnsType = packetRr.DnsType;
                    if (rr == 0){
                        //質問フィールド[QD]の場合は、TTL, DLEN , DATAは無い
                        _ar[rr].Add(new RrQuery(name, dnsType));
                        //offsetの移動  名前以降の分だけ進める
                        offset += 4;
                        continue;
                    }
                    var ttl = packetRr.Ttl;
                    var dlen = packetRr.DLen;
                    var data = packetRr.Data;

                    //TypeによってはNameが含まれている場合があるが、Nameは圧縮されている可能性があるので、
                    //いったん、string 戻してから、改めてリソース用に組み直したDataを作成する
                    OneRr oneRr = null;
                    if (dnsType == DnsType.A){
                        oneRr = new RrA(name, ttl, data);
                    } else if (dnsType == DnsType.Aaaa){
                        oneRr = new RrAaaa(name, ttl, data);
                    } else if (dnsType == DnsType.Cname || dnsType == DnsType.Ptr || dnsType == DnsType.Ns){
                        var u1 = new UnCompress(buffer, offset + 10);
                        switch (dnsType){
                            case DnsType.Cname:
                                oneRr = new RrCname(name, ttl, u1.HostName);
                                break;
                            case DnsType.Ptr:
                                oneRr = new RrPtr(name, ttl, u1.HostName);
                                break;
                            case DnsType.Ns:
                                oneRr = new RrNs(name, ttl, u1.HostName);
                                break;
                            default:
                                Util.RuntimeException(string.Format("DnsPacket() not implement dnsType={0}", dnsType));
                                break;
                        }
                    } else if (dnsType == DnsType.Mx){
                        var preference = Conv.GetUShort(buffer, offset + 10);
                        var u2 = new UnCompress(buffer, offset + 12);
                        oneRr = new RrMx(name, ttl, preference, u2.HostName);
                    } else if (dnsType == DnsType.Soa){
                        var u3 = new UnCompress(buffer, offset + 10);
                        var u4 = new UnCompress(buffer, u3.OffSet);
                        var p = u4.OffSet;
                        var serial = Conv.GetUInt(buffer, p);
                        p += 4;
                        var refresh = Conv.GetUInt(buffer, p);
                        p += 4;
                        var retry = Conv.GetUInt(buffer, p);
                        p += 4;
                        var expire = Conv.GetUInt(buffer, p);
                        p += 4;
                        var minimum = Conv.GetUInt(buffer, p);
                        oneRr = new RrSoa(name, ttl, u3.HostName, u4.HostName, serial, refresh, retry, expire, minimum);
                    }
                    if (oneRr != null){
                        //A NS MX SOA PTR CNAMEの6種類以外は、処理(追加)しない
                        _ar[rr].Add(oneRr);
                    }
                    offset += 10 + dlen;
                }
                //ヘッダ内のRRレコードのエントリー数を設定する
                _dnsHeader.SetCount(rr, (ushort) _ar[rr].Count);
            }
        }
Example #12
0
        //バイトイメージの取得
        public byte[] GetBytes()
        {
            var buffer = _dnsHeader.GetBytes();
            for (var i = 0; i < 4; i++){
                var a = _ar[i];
                foreach (var o in a){

                    var dataName = (new Compress(buffer, DnsUtil.Str2DnsName(o.Name))).GetData();
                    var data = o.Data;
                    var dnsType = o.DnsType;

                    if (i != 0){
                        //QDでは、data部分は存在しない
                        if (dnsType == DnsType.Ns || dnsType == DnsType.Cname || dnsType == DnsType.Ptr){
                            data = (new Compress(buffer, o.Data)).GetData(); //圧縮
                        } else if (dnsType == DnsType.Mx){
                            var preference = Conv.GetUShort(o.Data, 0);
                            var mlServer = new byte[o.Data.Length - 2];
                            //System.arraycopy(o.Data, 2, mlServer, 0, o.Data.Length - 2);
                            Buffer.BlockCopy(o.Data, 2, mlServer, 0, o.Data.Length - 2);

                            mlServer = (new Compress(buffer, mlServer)).GetData(); //圧縮
                            data = Bytes.Create(Conv.GetBytes(preference), mlServer);
                        }
                    }
                    //PacketRrは、QD(i==0)の時、data.Length=0となり、内部でisQueryがセットされる
                    var packetRr = new PacketRr(data.Length);
                    try{
                        packetRr.Cls = 1;
                        packetRr.DnsType = dnsType;
                        packetRr.Ttl = o.Ttl; //PacketRr.isQueryがセットされているとき、処理なし
                        packetRr.Data = data; //PacketRr.isQueryがセットされているとき、処理なし

                    } catch (IOException e){
                        //設計上の問題
                        Util.RuntimeException(e.Message);
                    }
                    //PacketRr.isQueryがセットされているとき、getBytes()は4バイト(TTL,DLEN,DATAなし)になっている
                    buffer = Bytes.Create(buffer, dataName, packetRr.GetBytes());
                }
            }
            return buffer;
        }
Example #13
0
        public void SetTypeの確認()
        {
            //setUp
            var sut = new PacketRr(0);
            const DnsType expected = DnsType.Mx;
            sut.DnsType = expected;

            //exercise
            var actual = sut.DnsType;
            //verify
            Assert.That(actual, Is.EqualTo(expected));
        }
Example #14
0
        public void SetClsの確認()
        {
            //setUp
            var sut = new PacketRr(0);

            ushort expected = 0x0002;
            sut.Cls = expected;

            //exercise
            var actual = sut.Cls;
            //verify
            Assert.That(actual, Is.EqualTo(expected));
        }
Example #15
0
        //パケット解釈のためのコンストラクタ
        public PacketDns(byte[] buffer)
        {
            Init();

            //ヘッダの解釈
            _dnsHeader = new PacketDnsHeader(buffer, 0);
            var offset = _dnsHeader.Length();

            // オペコード 0:標準 1:逆 2:サーバ状態
            //var c = (short)(Util.htons(_headerDns.Flags) & 0x7800);
            //var opcode = (ushort)(c >> 11);
            var flags  = _dnsHeader.Flags;
            var opcode = flags & 0x7800;

            if (opcode != 0)
            {
                // 標準問い合せ以外は対応していない
                throw new IOException(string.Format("OPCODE not 0 [CPCODE={0}]", opcode));
            }

            //****************************************
            //質問/回答/権限/追加フィールド取得
            //****************************************
            for (var rr = 0; rr < 4; rr++)
            {
                //ushort max = Util.htons(_headerDns.Count[rr]);//対象フィールドのデータ数
                var max = _dnsHeader.GetCount(rr);
                if (rr == 0 && max != 1)
                {
                    //質問エントリーが1でないパケットは処理できません。
                    throw new IOException(string.Format("QD Entry !=0  [count={0}]", max));
                }
                for (var n = 0; n < max; n++)
                {
                    //名前の取得
                    //offsetの移動  名前のサイズが一定ではないので、そのサイズ分だけ進める
                    var u0 = new UnCompress(buffer, offset);
                    offset = u0.OffSet;
                    var name = u0.HostName;

                    //名前以降のリソースレコードを取得
                    var packetRr = new PacketRr(buffer, offset);

                    var dnsType = packetRr.DnsType;
                    if (rr == 0)
                    {
                        //質問フィールド[QD]の場合は、TTL, DLEN , DATAは無い
                        _ar[rr].Add(new RrQuery(name, dnsType));
                        //offsetの移動  名前以降の分だけ進める
                        offset += 4;
                        continue;
                    }
                    var ttl  = packetRr.Ttl;
                    var dlen = packetRr.DLen;
                    var data = packetRr.Data;

                    //TypeによってはNameが含まれている場合があるが、Nameは圧縮されている可能性があるので、
                    //いったん、string 戻してから、改めてリソース用に組み直したDataを作成する
                    OneRr oneRr = null;
                    if (dnsType == DnsType.A)
                    {
                        oneRr = new RrA(name, ttl, data);
                    }
                    else if (dnsType == DnsType.Aaaa)
                    {
                        oneRr = new RrAaaa(name, ttl, data);
                    }
                    else if (dnsType == DnsType.Cname || dnsType == DnsType.Ptr || dnsType == DnsType.Ns)
                    {
                        var u1 = new UnCompress(buffer, offset + 10);
                        switch (dnsType)
                        {
                        case DnsType.Cname:
                            oneRr = new RrCname(name, ttl, u1.HostName);
                            break;

                        case DnsType.Ptr:
                            oneRr = new RrPtr(name, ttl, u1.HostName);
                            break;

                        case DnsType.Ns:
                            oneRr = new RrNs(name, ttl, u1.HostName);
                            break;

                        default:
                            Util.RuntimeException(string.Format("DnsPacket() not implement dnsType={0}", dnsType));
                            break;
                        }
                    }
                    else if (dnsType == DnsType.Mx)
                    {
                        var preference = Conv.GetUShort(buffer, offset + 10);
                        var u2         = new UnCompress(buffer, offset + 12);
                        oneRr = new RrMx(name, ttl, preference, u2.HostName);
                    }
                    else if (dnsType == DnsType.Soa)
                    {
                        var u3     = new UnCompress(buffer, offset + 10);
                        var u4     = new UnCompress(buffer, u3.OffSet);
                        var p      = u4.OffSet;
                        var serial = Conv.GetUInt(buffer, p);
                        p += 4;
                        var refresh = Conv.GetUInt(buffer, p);
                        p += 4;
                        var retry = Conv.GetUInt(buffer, p);
                        p += 4;
                        var expire = Conv.GetUInt(buffer, p);
                        p += 4;
                        var minimum = Conv.GetUInt(buffer, p);
                        oneRr = new RrSoa(name, ttl, u3.HostName, u4.HostName, serial, refresh, retry, expire, minimum);
                    }
                    if (oneRr != null)
                    {
                        //A NS MX SOA PTR CNAMEの6種類以外は、処理(追加)しない
                        _ar[rr].Add(oneRr);
                    }
                    offset += 10 + dlen;
                }
                //ヘッダ内のRRレコードのエントリー数を設定する
                _dnsHeader.SetCount(rr, (ushort)_ar[rr].Count);
            }
        }