aboutsummaryrefslogtreecommitdiff
path: root/scripts/rpki
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/rpki')
-rw-r--r--scripts/rpki/left_right.py50
-rw-r--r--scripts/rpki/pkcs10.py35
-rw-r--r--scripts/rpki/x509.py14
3 files changed, 82 insertions, 17 deletions
diff --git a/scripts/rpki/left_right.py b/scripts/rpki/left_right.py
index 05e067c1..985c61b8 100644
--- a/scripts/rpki/left_right.py
+++ b/scripts/rpki/left_right.py
@@ -77,32 +77,32 @@ class data_elt(base_elt, rpki.sql.sql_persistant):
r_pdu.type = "reply"
return r_pdu
- def serve_pre_save_hook(self, pdu):
+ def serve_pre_save_hook(self, q_pdu, r_pdu):
pass
- def serve_post_save_hook(self, pdu):
+ def serve_post_save_hook(self, q_pdu, r_pdu):
pass
def serve_create(self, db, cur, r_msg):
r_pdu = self.make_reply()
- self.serve_pre_save_hook(self)
+ self.serve_pre_save_hook(self, r_pdu)
self.sql_store(db, cur)
setattr(r_pdu, self.sql_template.index, getattr(self, self.sql_template.index))
- self.serve_post_save_hook(self)
+ self.serve_post_save_hook(self, r_pdu)
r_msg.append(r_pdu)
def serve_set(self, db, cur, r_msg):
db_pdu = self.sql_fetch(db, cur, getattr(self, self.sql_template.index))
if db_pdu is not None:
+ r_pdu = self.make_reply()
for a in db_pdu.sql_template.columns[1:]:
v = getattr(self, a)
if v is not None:
setattr(db_pdu, a, v)
db_pdu.sql_dirty = True
- db_pdu.serve_pre_save_hook(self)
+ db_pdu.serve_pre_save_hook(self, r_pdu)
db_pdu.sql_store(db, cur)
- db_pdu.serve_post_save_hook(self)
- r_pdu = self.make_reply()
+ db_pdu.serve_post_save_hook(self, r_pdu)
r_msg.append(r_pdu)
else:
r_msg.append(make_error_report(self))
@@ -187,11 +187,21 @@ class bsc_elt(data_elt):
def sql_delete_hook(self, db, cur):
cur.execute("DELETE FROM bsc_cert WHERE bsc_id = %s", self.bsc_id)
- def serve_pre_save_hook(self, pdu):
- if self is not pdu:
- if pdu.clear_signing_certs:
+ def serve_pre_save_hook(self, q_pdu, r_pdu):
+ if self is not q_pdu:
+ if q_pdu.clear_signing_certs:
self.signing_cert = []
- self.signing_cert.extend(pdu.signing_cert)
+ self.signing_cert.extend(q_pdu.signing_cert)
+ if self.generate_keypair:
+ #
+ # Hard wire 2048-bit RSA with SHA-256 in schema for now.
+ # Assume no HSM for now.
+ #
+ keypair = rpki.x509.RSA_Keypair()
+ keypair.generate(2048)
+ self.private_key_id = keypair.get_DER()
+ self.public_key = keypair.get_public_DER()
+ r_pdu.pkcs10_cert_request = rpki.pkcs10.make_request(keypair)
def startElement(self, stack, name, attrs):
"""Handle <bsc/> element."""
@@ -232,6 +242,10 @@ class parent_elt(data_elt):
peer_ta = None
+ def serve_post_save_hook(self, q_pdu, r_pdu):
+ if self.rekey or self.reissue or self.revoke:
+ raise NotImplementedError
+
def startElement(self, stack, name, attrs):
"""Handle <bsc/> element."""
if name != "peer_ta":
@@ -281,6 +295,10 @@ class child_elt(data_elt):
peer_ta = None
+ def serve_post_save_hook(self, q_pdu, r_pdu):
+ if self.reissue:
+ raise NotImplementedError
+
def startElement(self, stack, name, attrs):
"""Handle <child/> element."""
if name != "peer_ta":
@@ -370,6 +388,10 @@ class route_origin_elt(data_elt):
cur.execute("DELETE FROM route_origin_range WHERE route_origin_id = %s", self.route_origin_id)
cur.execute("DELETE FROM roa WHERE route_origin_id = %s", self.route_origin_id)
+ def serve_post_save_hook(self, q_pdu, r_pdu):
+ if self.suppress_publication:
+ raise NotImplementedError
+
def startElement(self, stack, name, attrs):
"""Handle <route_origin/> element."""
assert name == "route_origin", "Unexpected name %s, stack %s" % (name, stack)
@@ -421,12 +443,16 @@ class self_elt(data_elt):
def sql_delete_hook(self, db, cur):
cur.execute("DELETE FROM self_pref WHERE self_id = %s", self.self_id)
- def serve_pre_save_hook(self, pdu):
+ def serve_pre_save_hook(self, q_pdu, r_pdu):
if self is not pdu:
if pdu.clear_extension_preferences:
self.prefs = []
self.prefs.extend(pdu.prefs)
+ def serve_post_save_hook(self, q_pdu, r_pdu):
+ if self.rekey or self.reissue or self.revoke or self.run_now or self.publish_world_now:
+ raise NotImplementedError
+
def startElement(self, stack, name, attrs):
"""Handle <self/> element."""
if name == "extension_preference":
diff --git a/scripts/rpki/pkcs10.py b/scripts/rpki/pkcs10.py
new file mode 100644
index 00000000..4d6a024a
--- /dev/null
+++ b/scripts/rpki/pkcs10.py
@@ -0,0 +1,35 @@
+# $Id$
+
+import POW, rpki.x509, os, rpki.exceptions, binascii
+
+req_fmt = '''
+[ req ]
+distinguished_name = req_dn
+prompt = no
+
+[ req_dn ]
+CN = %s
+'''
+
+def make_request(keypair):
+
+ digest = POW.Digest(POW.SHA1_DIGEST)
+ digest.update(keypair.get_POW().derWrite(POW.RSA_PUBLIC_KEY))
+ commonName = "0x" + binascii.hexify(digest.digest())
+
+ try:
+ config_filename = "req.tmp.conf"
+ f = open(config_filename, "w")
+ f.write(req_fmt % commonName)
+ f.close()
+
+ i,o = os.popen2(["openssl", "req", "-config", config_filename, "-new", "-key", "/dev/stdin", "-outform", "DER"])
+ i.write(keypair.get_PEM())
+ i.close()
+ pkcs10 = o.read()
+ o.close()
+
+ finally:
+ os.unlink(config_filename)
+
+ return pkcs10
diff --git a/scripts/rpki/x509.py b/scripts/rpki/x509.py
index 3e352baf..56ba8df1 100644
--- a/scripts/rpki/x509.py
+++ b/scripts/rpki/x509.py
@@ -286,10 +286,7 @@ class PKCS10_Request(DER_object):
return self.POWpkix
class RSA_Keypair(DER_object):
- """Class to hold an RSA key pair.
-
- This may need to be split into public and private key classes.
- """
+ """Class to hold an RSA key pair."""
formats = ("DER", "POW", "tlslite")
pem_converter = PEM_converter("RSA PRIVATE KEY")
@@ -299,7 +296,7 @@ class RSA_Keypair(DER_object):
if self.DER:
return self.DER
if self.POW:
- self.DER = self.POW.derWrite()
+ self.DER = self.POW.derWrite(POW.RSA_PRIVATE_KEY)
return self.get_DER()
raise rpki.exceptions.DERObjectConversionError, "No conversion path to DER available"
@@ -314,3 +311,10 @@ class RSA_Keypair(DER_object):
if not self.tlslite:
self.tlslite = tlslite.api.parsePEMKey(self.get_PEM(), private=True)
return self.tlslite
+
+ def generate(self, keylength):
+ self.clear()
+ self.set(POW=POW.Assymetric(POW.RSA_CIPHER, keylength))
+
+ def get_public_DER(self):
+ return self.get_POW().derWrite(POW.RSA_PUBLIC_KEY)