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)); }
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)); }
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)); }
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)); }
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)); }
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)); }
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)); }
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)); }
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)); }
//バイトイメージの取得 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); }
//パケット解釈のためのコンストラクタ 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); } }
//バイトイメージの取得 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; }
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)); }
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)); }
//パケット解釈のためのコンストラクタ 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); } }