aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Austein <sra@hactrn.net>2012-09-03 00:56:33 +0000
committerRob Austein <sra@hactrn.net>2012-09-03 00:56:33 +0000
commit7a5037f8eb0ebc7077995887966c1798434f0ce1 (patch)
treecd4e9200a8eb1703a83adab9240312bdc933630d
parent553f46eac0803df600455e758f6f73a98283facd (diff)
Switch X501DN to use (new) POW format internally.
svn path=/branches/tk274/; revision=4690
-rw-r--r--rpkid/rpki/oids.py40
-rw-r--r--rpkid/rpki/x509.py31
2 files changed, 59 insertions, 12 deletions
diff --git a/rpkid/rpki/oids.py b/rpkid/rpki/oids.py
index 2b8302aa..35b4453a 100644
--- a/rpkid/rpki/oids.py
+++ b/rpkid/rpki/oids.py
@@ -92,8 +92,7 @@ def safe_name2oid(name):
fields = name.split(".")
if all(field.isdigit() for field in fields):
return tuple(int(field) for field in fields)
- else:
- raise
+ raise
def safe_oid2name(oid):
"""
@@ -104,4 +103,39 @@ def safe_oid2name(oid):
try:
return oid2name[oid]
except KeyError:
- return ".".join(str(field) for field in oid)
+ return oid2dotted(oid)
+
+def oid2dotted(oid):
+ """
+ Convert OID to numeric (dotted decimal) format.
+ """
+
+ return ".".join(str(field) for field in oid)
+
+def dotted2oid(dotted):
+ """
+ Convert dotted decimal format to OID tuple.
+ """
+
+ fields = dotted.split(".")
+ if all(field.isdigit() for field in fields):
+ return tuple(int(field) for field in fields)
+ raise ValueError("%r is not a dotted decimal OID" % dotted)
+
+def safe_name2dotted(name):
+ """
+ Convert name to dotted decimal format.
+ """
+
+ return oid2dotted(safe_name2oid(name))
+
+def safe_dotted2name(dotted):
+ """
+ Convert dotted decimal to name if we know one,
+ otherwise just return dotted.
+ """
+
+ try:
+ return oid2name[dotted2oid(dotted)]
+ except KeyError:
+ return dotted
diff --git a/rpkid/rpki/x509.py b/rpkid/rpki/x509.py
index ecc6ce5a..5854b8e0 100644
--- a/rpkid/rpki/x509.py
+++ b/rpkid/rpki/x509.py
@@ -170,40 +170,53 @@ class X501DN(object):
# phasing out the slow POW.pkix ASN.1 code.
def __str__(self):
- return "".join("/" + "+".join("%s=%s" % (rpki.oids.safe_oid2name(a[0]), a[1][1])
+ return "".join("/" + "+".join("%s=%s" % (rpki.oids.safe_dotted2name(a[0]), a[1])
for a in rdn)
for rdn in self.dn)
def __cmp__(self, other):
return cmp(self.dn, other.dn)
+ def __repr__(self):
+ return rpki.log.log_repr(self, str(self))
+
+ def _debug(self):
+ if False:
+ import traceback
+ bt = traceback.extract_stack(limit = 3)
+ rpki.log.debug("++ %s() at %s:%d from %s:%d]" % (bt[1][2], bt[1][0], bt[1][1], bt[0][0], bt[0][1]))
+ rpki.log.debug("++ %r %r" % (self, self.dn))
+
@classmethod
def from_cn(cls, s):
assert isinstance(s, (str, unicode))
self = cls()
- self.dn = (((rpki.oids.name2oid["commonName"], ("printableString", s)),),)
+ self.dn = (((rpki.oids.safe_name2dotted("commonName"), s),),)
return self
@classmethod
def from_POWpkix(cls, t):
assert isinstance(t, tuple)
self = cls()
- self.dn = t
+ self.dn = tuple(tuple((rpki.oids.oid2dotted(a[0]), a[1][1])
+ for a in rdn)
+ for rdn in t)
return self
def get_POWpkix(self):
- return self.dn
+ return tuple(tuple((rpki.oids.dotted2oid(a[0]), ("printableString", a[1]))
+ for a in rdn)
+ for rdn in self.dn)
@classmethod
def from_POW(cls, t):
- raise NotImplementedError
assert isinstance(t, tuple)
self = cls()
self.dn = t
return self
def get_POW(self):
- raise NotImplementedError("Sorry, I haven't written the conversion to POW format yet")
+ return self.dn
class DER_object(object):
"""
@@ -558,13 +571,13 @@ class X509(DER_object):
"""
Get the issuer of this certificate.
"""
- return X501DN.from_POWpkix(self.get_POWpkix().getIssuer())
+ return X501DN.from_POW(self.get_POW().getIssuer())
def getSubject(self):
"""
Get the subject of this certificate.
"""
- return X501DN.from_POWpkix(self.get_POWpkix().getSubject())
+ return X501DN.from_POW(self.get_POW().getSubject())
def getNotBefore(self):
"""
@@ -1740,7 +1753,7 @@ class CRL(DER_object):
"""
Get issuer value of this CRL.
"""
- return X501DN.from_POWpkix(self.get_POWpkix().getIssuer())
+ return X501DN.from_POW(self.get_POW().getIssuer())
@classmethod
def generate(cls, keypair, issuer, serial, thisUpdate, nextUpdate, revokedCertificates, version = 1, digestType = "sha256WithRSAEncryption"):