On Fri, Jul 13, 2012 at 10:43 AM, Adam Portier <[email protected]> wrote:

> Hello. I am learning Python and specifically dnspython in order to write
> my own DNSSEC domain validator. I have run into an issue calculating the
> key tag value from a DNSKEY response. I was directed to RFC 4034 from a
> script I found on the web for an example in C for how to calculate the key
> tag from a wire representation of the record. I tried implementing the
> method myself and I am getting very different results than what are
> returned by drill or dnsviz.net. I am sure I am doing this wrong. Could
> someone assist me with a code snippet that takes a DNSKEY object and
> determines the key tag to be matched up against a corresponding DS record?
>
>
def key_tag(rdata):
    '''Return the key_tag for the given DNSKEY rdata,
    as specified in RFC 4034.'''

    if rdata.algorithm == 1:
        return struct.unpack('!H', rdata.key[-3:-1])[0]

    key_str = struct.pack('!HBB', rdata.flags, rdata.protocol,
rdata.algorithm) + rdata.key

    ac = 0
    for i in range(len(key_str)):
        b, = struct.unpack('B',key_str[i])
        if i & 1:
            ac += b
        else:
            ac += (b << 8)

    ac += (ac >> 16) & 0xffff
    return ac & 0xffff
_______________________________________________
dnspython-users mailing list
[email protected]
http://howl.play-bow.org/mailman/listinfo/dnspython-users

Reply via email to