--- /dev/null
+#!/usr/bin/env python2
+
+import dns
+import dns.edns
+import dns.flags
+import dns.message
+import dns.query
+
+class CookiesOption(dns.edns.Option):
+ """Implementation of draft-ietf-dnsop-cookies-09.
+ """
+
+ def __init__(self, client, server):
+ super(CookiesOption, self).__init__(10)
+
+ if len(client) != 8:
+ raise Exception('invalid client cookie length')
+
+ if server is not None and len(server) != 0 and (len(server) < 8 or len(server) > 32):
+ raise Exception('invalid server cookie length')
+
+ self.client = client
+ self.server = server
+
+ def to_wire(self, file):
+ """Create EDNS packet as defined in draft-ietf-dnsop-cookies-09."""
+
+ file.write(self.client)
+ if self.server and len(self.server) > 0:
+ file.write(self.server)
+
+ def from_wire(cls, otype, wire, current, olen):
+ """Read EDNS packet as defined in draft-ietf-dnsop-cookies-09.
+
+ Returns:
+ An instance of CookiesOption based on the EDNS packet
+ """
+
+ data = wire[current:current + olen]
+ if len(data) != 8 and (len(data) < 16 or len(data) > 40):
+ raise Exception('Invalid EDNS Cookies option')
+
+ client = data[:8]
+ if len(data) > 8:
+ server = data[8:]
+ else:
+ server = None
+
+ return cls(client, server)
+
+ from_wire = classmethod(from_wire)
+
+ def __repr__(self):
+ return '%s(%s, %s)' % (
+ self.__class__.__name__,
+ self.client,
+ self.server
+ )
+
+ def __eq__(self, other):
+ if not isinstance(other, CookiesOption):
+ return False
+ if self.client != other.client:
+ return False
+ if self.server != other.server:
+ return False
+ return True
+
+ def __ne__(self, other):
+ return not self.__eq__(other)
+
+
+dns.edns._type_to_class[0x000A] = CookiesOption
+