aboutsummaryrefslogtreecommitdiff
path: root/rpkid/rpki/resource_set.py
diff options
context:
space:
mode:
Diffstat (limited to 'rpkid/rpki/resource_set.py')
-rw-r--r--rpkid/rpki/resource_set.py51
1 files changed, 33 insertions, 18 deletions
diff --git a/rpkid/rpki/resource_set.py b/rpkid/rpki/resource_set.py
index 40eb4610..f435c9fb 100644
--- a/rpkid/rpki/resource_set.py
+++ b/rpkid/rpki/resource_set.py
@@ -25,7 +25,7 @@ We also provide some basic set operations (union, intersection, etc).
"""
import re
-import rpki.ipaddrs, rpki.oids
+import rpki.ipaddrs, rpki.oids, rpki.exceptions
inherit_token = "<inherit>"
@@ -65,8 +65,8 @@ class resource_range_as(resource_range):
else:
return str(self.min) + "-" + str(self.max)
- def to_tuple(self):
- """Convert a resource_range_as to tuple format for ASN.1 encoding."""
+ def to_rfc3779_tuple(self):
+ """Convert a resource_range_as to tuple format for RFC 3779 ASN.1 encoding."""
if self.min == self.max:
return ("id", self.min)
else:
@@ -101,8 +101,8 @@ class resource_range_ip(resource_range):
else:
return str(self.min) + "/" + str(prefixlen)
- def to_tuple(self):
- """Convert a resource_range_ip to tuple format for ASN.1 encoding."""
+ 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:
return ("addressRange", (_long2bs(self.min, self.datum_type.bits, strip = 0),
@@ -110,6 +110,13 @@ class resource_range_ip(resource_range):
else:
return ("addressPrefix", _long2bs(self.min, self.datum_type.bits, prefixlen = prefixlen))
+ def to_roa_tuple(self):
+ """Convert a resource_range_ip to tuple format for ROA ASN.1 encoding."""
+ prefixlen = self._prefixlen()
+ if prefixlen < 0:
+ raise rpki.exceptions.MustBePrefix, "%s cannot be expressed as a prefix" % str(self)
+ return _long2bs(self.min, self.datum_type.bits, prefixlen = prefixlen)
+
class resource_range_ipv4(resource_range_ip):
"""Range of IPv4 addresses."""
@@ -152,7 +159,7 @@ class resource_set(list):
elif isinstance(ini, str) and len(ini):
self.extend(map(self.parse_str, ini.split(",")))
elif isinstance(ini, tuple):
- self.parse_tuple(ini)
+ self.parse_rfc3779_tuple(ini)
elif isinstance(ini, list):
self.extend(ini)
else:
@@ -292,8 +299,8 @@ class resource_set_as(resource_set):
else:
return resource_range_as(long(x), long(x))
- def parse_tuple(self, x):
- """Parse AS resource sets from intermediate form generated by ASN.1 decoder."""
+ def parse_rfc3779_tuple(self, x):
+ """Parse AS resource from tuple format generated by RFC 3779 ASN.1 decoder."""
if x[0] == "asIdsOrRanges":
for aor in x[1]:
if aor[0] == "range":
@@ -307,10 +314,10 @@ class resource_set_as(resource_set):
assert x[0] == "inherit"
self.inherit = True
- def to_tuple(self):
- """Encode AS resource set into intermediate form used by ASN.1 encoder."""
+ def to_rfc3779_tuple(self):
+ """Convert AS resource set into tuple format used for RFC 3779 ASN.1 encoding."""
if self:
- return ("asIdsOrRanges", tuple(a.to_tuple() for a in self))
+ return ("asIdsOrRanges", tuple(a.to_rfc3779_tuple() for a in self))
elif self.inherit:
return ("inherit", "")
else:
@@ -337,8 +344,8 @@ class resource_set_ip(resource_set):
return self.range_type(min, max)
raise RuntimeError, 'Bad IP resource "%s"' % (x)
- def parse_tuple(self, x):
- """Parse IP address resource sets from intermediate form generated by ASN.1 decoder."""
+ def parse_rfc3779_tuple(self, x):
+ """Parse IP address resource sets from tuple format generated by RFC 3779 ASN.1 decoder."""
if x[0] == "addressesOrRanges":
for aor in x[1]:
if aor[0] == "addressRange":
@@ -355,15 +362,23 @@ class resource_set_ip(resource_set):
assert x[0] == "inherit"
self.inherit = True
- def to_tuple(self):
- """Encode IP resource set into intermediate form used by ASN.1 encoder."""
+ def to_rfc3779_tuple(self):
+ """Convert IP resource set into tuple format used by RFC 3779 ASN.1 encoder."""
if self:
- return (self.afi, ("addressesOrRanges", tuple(a.to_tuple() for a in self)))
+ return (self.afi, ("addressesOrRanges", tuple(a.to_rfc3779_tuple() for a in self)))
elif self.inherit:
return (self.afi, ("inherit", ""))
else:
return None
+ def to_roa_tuple(self):
+ """Convert IP resource set into tuple format used by ROA ASN.1 encoder.
+ This is a variation on the format used in RFC 3779."""
+ if self:
+ return (self.afi, tuple(a.to_roa_tuple() for a in self))
+ else:
+ return None
+
class resource_set_ipv4(resource_set_ip):
"""IPv4 address resource set."""
@@ -423,8 +438,8 @@ class resource_bag(object):
not other.v6.issubset(self.v6)
@classmethod
- def from_asn1_tuples(cls, exts):
- """Build a resource_bag from intermediate form returned by ASN.1 decoder."""
+ def from_rfc3779_tuples(cls, exts):
+ """Build a resource_bag from intermediate form generated by RFC 3779 ASN.1 decoder."""
as = None
v4 = None
v6 = None