Commit cf09203f authored by Brickner_cp's avatar Brickner_cp

Calculate KeyTag for DNS resource records DNSKEY and KEY.

parent 4aa021c3
...@@ -82,8 +82,7 @@ namespace PcapDotNet.Core.Test ...@@ -82,8 +82,7 @@ namespace PcapDotNet.Core.Test
[TestMethod] [TestMethod]
public void OpenOfflineMultipleTimesUnicode() public void OpenOfflineMultipleTimesUnicode()
{ {
// TODO: Fix so we can go beyond 509 when using unicode filenames. // TODO: Fix so we can go beyond 509 when using unicode filenames. See http://www.winpcap.org/pipermail/winpcap-bugs/2012-December/001547.html
// See http://www.winpcap.org/pipermail/winpcap-bugs/2012-December/001547.html
TestOpenMultipleTimes(100, @"דמפ.pcap"); TestOpenMultipleTimes(100, @"דמפ.pcap");
} }
......
...@@ -684,7 +684,7 @@ namespace PcapDotNet.Core.Test ...@@ -684,7 +684,7 @@ namespace PcapDotNet.Core.Test
case "dns.key.key_id": case "dns.key.key_id":
dataField.AssertNoFields(); dataField.AssertNoFields();
// TODO: Calculate key tag. dataField.AssertShowDecimal(keyData.KeyTag);
break; break;
case "dns.key.public_key": case "dns.key.public_key":
...@@ -1373,8 +1373,8 @@ namespace PcapDotNet.Core.Test ...@@ -1373,8 +1373,8 @@ namespace PcapDotNet.Core.Test
break; break;
case "dns.dnskey.key_id": case "dns.dnskey.key_id":
// TODO: Calculate key tag.
dataField.AssertNoFields(); dataField.AssertNoFields();
dataField.AssertShowDecimal(dnsKeyData.KeyTag);
break; break;
case "dns.dnskey.public_key": case "dns.dnskey.public_key":
......
...@@ -40,8 +40,11 @@ namespace PcapDotNet.Core.Test ...@@ -40,8 +40,11 @@ namespace PcapDotNet.Core.Test
case "vlan.len": case "vlan.len":
field.AssertShowDecimal((ushort)vLanTaggedFrameDatagram.EtherType); field.AssertShowDecimal((ushort)vLanTaggedFrameDatagram.EtherType);
if (field.Fields().Any())
{
field.AssertNumFields(1); field.AssertNumFields(1);
field.Fields().First().AssertName("_ws.expert"); field.Fields().First().AssertName("_ws.expert");
}
break; break;
case "vlan.trailer": case "vlan.trailer":
......
...@@ -332,6 +332,11 @@ namespace PcapDotNet.Packets ...@@ -332,6 +332,11 @@ namespace PcapDotNet.Packets
return Buffer.ReadIpV6Address(StartOffset + offset, endianity); return Buffer.ReadIpV6Address(StartOffset + offset, endianity);
} }
internal uint Sum16Bits()
{
return Sum16Bits(Buffer, StartOffset, Length);
}
/// <summary> /// <summary>
/// Converts the given 16 bits sum to a checksum. /// Converts the given 16 bits sum to a checksum.
/// Sums the two 16 bits in the 32 bits value and if the result is bigger than a 16 bits value repeat. /// Sums the two 16 bits in the 32 bits value and if the result is bigger than a 16 bits value repeat.
...@@ -339,7 +344,7 @@ namespace PcapDotNet.Packets ...@@ -339,7 +344,7 @@ namespace PcapDotNet.Packets
/// </summary> /// </summary>
/// <param name="sum"></param> /// <param name="sum"></param>
/// <returns></returns> /// <returns></returns>
protected static ushort Sum16BitsToChecksum(uint sum) internal static ushort Sum16BitsToChecksum(uint sum)
{ {
// Take only 16 bits out of the 32 bit sum and add up the carrier. // Take only 16 bits out of the 32 bit sum and add up the carrier.
// if the results overflows - do it again. // if the results overflows - do it again.
......
...@@ -117,6 +117,20 @@ namespace PcapDotNet.Packets.Dns ...@@ -117,6 +117,20 @@ namespace PcapDotNet.Packets.Dns
/// </summary> /// </summary>
public DataSegment PublicKey { get; private set; } public DataSegment PublicKey { get; private set; }
public ushort KeyTag
{
get
{
if (Algorithm == DnsAlgorithm.RsaMd5)
return PublicKey.ReadUShort(PublicKey.Length - 3, Endianity.Big);
ushort flags = BitSequence.Merge((byte)(ZoneKey ? Mask.ZoneKey : 0),
(byte)((Revoke ? Mask.Revoke : 0) | (SecureEntryPoint ? Mask.SecureEntryPoint : 0)));
ushort protocolAndAlgorithm = BitSequence.Merge(Protocol, (byte)Algorithm);
uint sum = (uint)(flags + protocolAndAlgorithm + PublicKey.Sum16Bits());
return (ushort)(sum + (sum >> 16));
}
}
/// <summary> /// <summary>
/// Two DnsResourceDataDnsKey are equal iff their zone key, revoke, secure entry point, protocol, algorithm and public key fields are equal. /// Two DnsResourceDataDnsKey are equal iff their zone key, revoke, secure entry point, protocol, algorithm and public key fields are equal.
/// </summary> /// </summary>
......
...@@ -208,6 +208,23 @@ namespace PcapDotNet.Packets.Dns ...@@ -208,6 +208,23 @@ namespace PcapDotNet.Packets.Dns
/// </summary> /// </summary>
public DataSegment PublicKey { get; private set; } public DataSegment PublicKey { get; private set; }
public ushort KeyTag
{
get
{
if (Algorithm == DnsAlgorithm.RsaMd5)
return PublicKey.ReadUShort(PublicKey.Length - 3, Endianity.Big);
ushort flags = BitSequence.Merge((byte)((AuthenticationProhibited ? Mask.AuthenticationProhibited : 0) |
(ConfidentialityProhibited ? Mask.ConfidentialityProhibited : 0) |
(Experimental ? Mask.Experimental : 0) | (FlagsExtension.HasValue ? Mask.IsFlagsExtension : 0) |
(UserAssociated ? Mask.UserAssociated : 0) | (byte)NameType),
(byte)((IpSec ? Mask.IpSec : 0) | (Email ? Mask.Email : 0) | (byte)Signatory));
ushort protocolAndAlgorithm = BitSequence.Merge((byte)Protocol, (byte)Algorithm);
uint sum = (uint)(flags + protocolAndAlgorithm + (FlagsExtension.HasValue ? FlagsExtension.Value : 0) + PublicKey.Sum16Bits());
return (ushort)(sum + (sum >> 16));
}
}
/// <summary> /// <summary>
/// Two DnsResourceDataKey are equal iff their authentication prohibited, confidentiality prohibited, experimental, user associated, IPSec, email, /// Two DnsResourceDataKey are equal iff their authentication prohibited, confidentiality prohibited, experimental, user associated, IPSec, email,
/// name type, signatory, protocol, algorithm, flags extension and public key fields are equal. /// name type, signatory, protocol, algorithm, flags extension and public key fields are equal.
......
...@@ -347,7 +347,7 @@ namespace PcapDotNet.Packets.IpV4 ...@@ -347,7 +347,7 @@ namespace PcapDotNet.Packets.IpV4
private ushort CalculateHeaderChecksum() private ushort CalculateHeaderChecksum()
{ {
uint sum = Sum16Bits(Buffer, StartOffset, Math.Min(Offset.HeaderChecksum, Length)) + uint sum = Sum16Bits(Buffer, StartOffset, Math.Min(Offset.HeaderChecksum, Length)) +
Sum16Bits(Buffer, StartOffset + Offset.HeaderChecksum + 2, RealHeaderLength - Offset.HeaderChecksum - 2); Sum16Bits(Buffer, StartOffset + Offset.HeaderChecksum + sizeof(ushort), RealHeaderLength - Offset.HeaderChecksum - sizeof(ushort));
return Sum16BitsToChecksum(sum); return Sum16BitsToChecksum(sum);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment