From d5ca4ddcba70c11ccfced2f1456c8fec0907cd57 Mon Sep 17 00:00:00 2001 From: Rob Austein Date: Tue, 15 Jun 2010 04:28:57 +0000 Subject: Add translation from resource_set to roa_prefix_set, clean up. svn path=/rpkid/rpki/resource_set.py; revision=3289 --- rpkid/rpki/resource_set.py | 67 +++++++++++++++++++++++++++++++--------------- 1 file changed, 46 insertions(+), 21 deletions(-) diff --git a/rpkid/rpki/resource_set.py b/rpkid/rpki/resource_set.py index d59850b1..49d5750c 100644 --- a/rpkid/rpki/resource_set.py +++ b/rpkid/rpki/resource_set.py @@ -120,41 +120,40 @@ class resource_range_ip(resource_range): def _prefixlen(self): """ Determine whether a resource_range_ip can be expressed as a - prefix. + prefix. Returns prefix length if it can, otherwise raises + MustBePrefix exception. """ mask = self.min ^ self.max if self.min & mask != 0: - return -1 + raise rpki.exceptions.MustBePrefix prefixlen = self.datum_type.bits while mask & 1: prefixlen -= 1 mask >>= 1 if mask: - return -1 - else: - return prefixlen + raise rpki.exceptions.MustBePrefix + return prefixlen def __str__(self): """ Convert a resource_range_ip to string format. """ - prefixlen = self._prefixlen() - if prefixlen < 0: + try: + return str(self.min) + "/" + str(self._prefixlen()) + except rpki.exceptions.MustBePrefix: return str(self.min) + "-" + str(self.max) - else: - return str(self.min) + "/" + str(prefixlen) def to_rfc3779_tuple(self): """ Convert a resource_range_ip to tuple format for RFC 3779 ASN.1 encoding. """ - prefixlen = self._prefixlen() - if prefixlen < 0: + try: + return ("addressPrefix", _long2bs(self.min, self.datum_type.bits, + prefixlen = self._prefixlen())) + except rpki.exceptions.MustBePrefix: return ("addressRange", (_long2bs(self.min, self.datum_type.bits, strip = 0), _long2bs(self.max, self.datum_type.bits, strip = 1))) - else: - return ("addressPrefix", _long2bs(self.min, self.datum_type.bits, prefixlen = prefixlen)) @classmethod def make_prefix(cls, prefix, prefixlen): @@ -469,6 +468,13 @@ class resource_set_ip(resource_set): assert x[0] == "inherit" self.inherit = True + def to_roa_prefix_set(self): + """ + Attempt to convert from a resource set to a ROA prefix set. This + doesn't work in the general case but is sometimes useful anyway. + """ + return self.roa_prefix_set_type([self.roa_prefix_set_type.prefix_type(r.min, r._prefixlen()) for r in self]) + def to_rfc3779_tuple(self): """ Convert IP resource set into tuple format used by RFC 3779 ASN.1 @@ -781,13 +787,6 @@ class roa_prefix_set(list): assert ini is None or ini == "", "Unexpected initializer: %s" % str(ini) self.sort() - # At one point I thought this was a useful check, but given the - # way that ROAs have evolved I suspect I was just confused. - # - if False and __debug__: - for i in xrange(0, len(self) - 1): - assert self[i].max() < self[i+1].min(), "Prefix overlap: %s %s" % (self[i], self[i+1]) - def __str__(self): """Convert a ROA prefix set to string format.""" return ",".join(str(x) for x in self) @@ -862,6 +861,9 @@ class roa_prefix_set_ipv4(roa_prefix_set): resource_set_type = resource_set_ipv4 +# Fix back link from resource_set to roa_prefix +resource_set_ipv4.roa_prefix_set_type = roa_prefix_set_ipv4 + class roa_prefix_set_ipv6(roa_prefix_set): """ Set of IPv6 ROA prefixes. @@ -877,6 +879,9 @@ class roa_prefix_set_ipv6(roa_prefix_set): resource_set_type = resource_set_ipv6 +# Fix back link from resource_set to roa_prefix +resource_set_ipv6.roa_prefix_set_type = roa_prefix_set_ipv6 + # Test suite for set operations. if __name__ == "__main__": @@ -923,7 +928,21 @@ if __name__ == "__main__": print "y: ", r2 print "x>y:", (r1 > r2) print "xy:", (r1 > r2) + print "x