diff options
Diffstat (limited to 'rpkid/rpki/resource_set.py')
-rw-r--r-- | rpkid/rpki/resource_set.py | 51 |
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 |