1 # Copyright (C) 2010, 2011 Nominum, Inc.
3 # Permission to use, copy, modify, and distribute this software and its
4 # documentation for any purpose with or without fee is hereby granted,
5 # provided that the above copyright notice and this permission notice
6 # appear in all copies.
8 # THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
9 # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
11 # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
14 # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
21 class DSBase(dns
.rdata
.Rdata
):
22 """Base class for rdata that is like a DS record
24 @ivar key_tag: the key tag
26 @ivar algorithm: the algorithm
28 @ivar digest_type: the digest type
29 @type digest_type: int
30 @ivar digest: the digest
32 @see: draft-ietf-dnsext-delegation-signer-14.txt"""
34 __slots__
= ['key_tag', 'algorithm', 'digest_type', 'digest']
36 def __init__(self
, rdclass
, rdtype
, key_tag
, algorithm
, digest_type
,
38 super(DSBase
, self
).__init
__(rdclass
, rdtype
)
39 self
.key_tag
= key_tag
40 self
.algorithm
= algorithm
41 self
.digest_type
= digest_type
44 def to_text(self
, origin
=None, relativize
=True, **kw
):
45 return '%d %d %d %s' % (self
.key_tag
, self
.algorithm
,
47 dns
.rdata
._hexify
(self
.digest
,
50 def from_text(cls
, rdclass
, rdtype
, tok
, origin
= None, relativize
= True):
51 key_tag
= tok
.get_uint16()
52 algorithm
= tok
.get_uint8()
53 digest_type
= tok
.get_uint8()
56 t
= tok
.get().unescape()
59 if not t
.is_identifier():
60 raise dns
.exception
.SyntaxError
61 chunks
.append(t
.value
)
62 digest
= ''.join(chunks
)
63 digest
= digest
.decode('hex_codec')
64 return cls(rdclass
, rdtype
, key_tag
, algorithm
, digest_type
,
67 from_text
= classmethod(from_text
)
69 def to_wire(self
, file, compress
= None, origin
= None):
70 header
= struct
.pack("!HBB", self
.key_tag
, self
.algorithm
,
73 file.write(self
.digest
)
75 def from_wire(cls
, rdclass
, rdtype
, wire
, current
, rdlen
, origin
= None):
76 header
= struct
.unpack("!HBB", wire
[current
: current
+ 4])
79 digest
= wire
[current
: current
+ rdlen
].unwrap()
80 return cls(rdclass
, rdtype
, header
[0], header
[1], header
[2], digest
)
82 from_wire
= classmethod(from_wire
)
84 def _cmp(self
, other
):
85 hs
= struct
.pack("!HBB", self
.key_tag
, self
.algorithm
,
87 ho
= struct
.pack("!HBB", other
.key_tag
, other
.algorithm
,
91 v
= cmp(self
.digest
, other
.digest
)