aboutsummaryrefslogtreecommitdiff
path: root/rpki/rootd.py
diff options
context:
space:
mode:
Diffstat (limited to 'rpki/rootd.py')
-rw-r--r--rpki/rootd.py73
1 files changed, 39 insertions, 34 deletions
diff --git a/rpki/rootd.py b/rpki/rootd.py
index 4ded1081..b6e351ac 100644
--- a/rpki/rootd.py
+++ b/rpki/rootd.py
@@ -39,6 +39,8 @@ import rpki.sundial
import rpki.log
import rpki.daemonize
+from lxml.etree import Element, SubElement
+
logger = logging.getLogger(__name__)
rootd = None
@@ -66,7 +68,8 @@ class revoke_pdu(rpki.up_down.revoke_pdu):
raise rpki.exceptions.NotInDatabase
logger.debug("Revoking certificate %s", self.ski)
now = rpki.sundial.now()
- pubd_msg = rpki.publication.msg.query()
+ pubd_msg = Element(rpki.publication.tag_msg, nsmap = rpki.publication.nsmap,
+ type = "query", version = rpki.publication.version)
rootd.revoke_subject_cert(now)
rootd.del_subject_cert()
rootd.del_subject_pkcs10()
@@ -196,11 +199,12 @@ class main(object):
notBefore = now,
notAfter = notAfter)
self.set_subject_cert(subject_cert)
- pubd_msg = rpki.publication.msg.query()
- pubd_msg.append(rpki.publication.publish_elt.make_pdu(
- uri = self.rpki_subject_cert_uri,
- hash = hash,
- der = subject_cert.get_DER()))
+ pubd_msg = Element(rpki.publication.tag_msg, nsmap = rpki.publication.nsmap,
+ type = "query", version = rpki.publication.version)
+ pdu = SubElement(pubd_msg, rpki.publication.tag_publish, uri = self.rpki_subject_cert_uri)
+ pdu.text = subject_cert.get_Base64()
+ if hash is not None:
+ pdu.set("hash", hash)
self.generate_crl_and_manifest(now, pubd_msg)
return subject_cert, pubd_msg
@@ -222,10 +226,10 @@ class main(object):
logger.debug("Writing CRL %s", self.rpki_root_crl_file)
with open(self.rpki_root_crl_file, "wb") as f:
f.write(crl.get_DER())
- pubd_msg.append(rpki.publication.publish_elt.make_pdu(
- uri = self.rpki_root_crl_uri,
- hash = hash,
- der = crl.get_DER()))
+ pdu = SubElement(pubd_msg, rpki.publication.tag_publish, uri = self.rpki_root_crl_uri)
+ pdu.text = crl.get_Base64()
+ if hash is not None:
+ pdu.set("hash", hash)
manifest_content = [(os.path.basename(self.rpki_root_crl_uri), crl)]
if subject_cert is not None:
manifest_content.append((os.path.basename(self.rpki_subject_cert_uri), subject_cert))
@@ -253,16 +257,16 @@ class main(object):
logger.debug("Writing manifest %s", self.rpki_root_manifest_file)
with open(self.rpki_root_manifest_file, "wb") as f:
f.write(manifest.get_DER())
- pubd_msg.append(rpki.publication.publish_elt.make_pdu(
- uri = self.rpki_root_manifest_uri,
- hash = hash,
- der = manifest.get_DER()))
+ pdu = SubElement(pubd_msg, rpki.publication.tag_publish, uri = self.rpki_root_manifest_uri)
+ pdu.text = manifest.get_Base64()
+ if hash is not None:
+ pdu.set("hash", hash)
hash = rpki.x509.sha256(self.rpki_root_cert.get_DER()).encode("hex")
if hash != self.rpki_root_cert_hash:
- pubd_msg.append(rpki.publication.publish_elt.make_pdu(
- uri = self.rpki_root_cert_uri,
- hash = self.rpki_root_cert_hash,
- der = self.rpki_root_cert.get_DER()))
+ pdu = SubElement(pubd_msg, rpki.publication.tag_publish, uri = self.rpki_root_cert_uri)
+ pdu.text = self.rpki_root_cert.get_Base64()
+ if self.rpki_root_cert_hash is not None:
+ pdu.set("hash", self.rpki_root_cert_hash)
self.rpki_root_cert_hash = hash
@@ -302,45 +306,46 @@ class main(object):
def done(r_msg):
if len(q_msg) != len(r_msg):
- raise rpki.exceptions.BadPublicationReply("Wrong number of response PDUs from pubd: sent %r, got %r" % (q_msg, r_msg))
+ raise rpki.exceptions.BadPublicationReply("Wrong number of response PDUs from pubd: sent %s, got %s" % (len(q_msg), len(r_msg)))
callback()
def fix_hashes(r_msg):
- published_hash = dict((r_pdu.uri, r_pdu.hash) for r_pdu in r_msg)
+ published_hash = dict((r_pdu.get("uri"), r_pdu.get("hash")) for r_pdu in r_msg)
for q_pdu in q_msg:
- if q_pdu.hash is None and published_hash.get(q_pdu.uri) is not None:
- logger.debug("Updating hash of %r to %s from previously published data", q_pdu, published_hash[q_pdu.uri])
- q_pdu.hash = published_hash[q_pdu.uri]
+ if q_pdu.get("hash") is None and published_hash.get(q_pdu.get("uri")) is not None:
+ logger.debug("Updating hash of %s to %s from previously published data", q_pdu.get("uri"), published_hash[q_pdu.get("uri")])
+ q_pdu.set("hash", published_hash[q_pdu.get("uri")])
self.call_pubd(done, errback, q_msg)
- if not q_msg:
+ assert q_msg is None or len(q_msg) > 0
+
+ if q_msg is None:
callback()
- elif all(q_pdu.hash is not None for q_pdu in q_msg):
+ elif all(q_pdu.get("hash") is not None for q_pdu in q_msg):
self.call_pubd(done, errback, q_msg)
else:
logger.debug("Some publication PDUs are missing hashes, checking...")
- self.call_pubd(fix_hashes, errback, rpki.publication.msg.query(rpki.publication.list_elt()))
+ list_msg = Element(rpki.publication.tag_msg, nsmap = rpki.publication.nsmap,
+ type = "query", version = rpki.publication.version)
+ SubElement(list_msg, rpki.publication.tag_list)
+ self.call_pubd(fix_hashes, errback, list_msg)
def call_pubd(self, callback, errback, q_msg):
try:
- if not q_msg:
- return callback(())
-
for q_pdu in q_msg:
- logger.info("Sending %r to pubd", q_pdu)
+ logger.info("Sending %s to pubd", q_pdu.get("uri"))
- q_der = rpki.publication.cms_msg().wrap(q_msg, self.rootd_bpki_key, self.rootd_bpki_cert, self.rootd_bpki_crl)
+ q_der = rpki.publication.cms_msg_no_sax().wrap(q_msg, self.rootd_bpki_key, self.rootd_bpki_cert, self.rootd_bpki_crl)
def done(r_der):
try:
logger.debug("Received response from pubd")
- r_cms = rpki.publication.cms_msg(DER = r_der)
+ r_cms = rpki.publication.cms_msg_no_sax(DER = r_der)
r_msg = r_cms.unwrap((self.bpki_ta, self.pubd_bpki_cert))
self.pubd_cms_timestamp = r_cms.check_replay(self.pubd_cms_timestamp, self.pubd_contact_uri)
- for r_pdu in r_msg:
- r_pdu.raise_if_error()
+ rpki.publication.raise_if_error(r_msg)
callback(r_msg)
except (rpki.async.ExitNow, SystemExit):
raise