diff options
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/PLAN | 14 | ||||
-rwxr-xr-x | scripts/encode-test.pl (renamed from scripts/xml-parse-test.pl) | 0 | ||||
-rwxr-xr-x | scripts/encode-test.py | 161 | ||||
-rwxr-xr-x | scripts/xml-parse-test.py | 188 |
4 files changed, 349 insertions, 14 deletions
diff --git a/scripts/PLAN b/scripts/PLAN index ad9a60e0..13f9de93 100644 --- a/scripts/PLAN +++ b/scripts/PLAN @@ -27,17 +27,3 @@ Rough plan for initial prototype RE. 3) Whack (2) into something that does this over minimal HTTP. 4) [to be continued...] - - - -More fun with RelaxNG: - -The current schema is not very tight. See RelaxNG reference for how -to tighten it up if we think that'd be useful. RelaxNG supports -regexps, among other things: - - xsd:decimal {pattern = "1|1\.5"} - -RelaxNG (and XML Schema) regular expressions ("patterns") are -implicitly anchored, you need to prefix (and suffix?) with ".*" if you -want to match only part of the field. diff --git a/scripts/xml-parse-test.pl b/scripts/encode-test.pl index ae82435e..ae82435e 100755 --- a/scripts/xml-parse-test.pl +++ b/scripts/encode-test.pl diff --git a/scripts/encode-test.py b/scripts/encode-test.py new file mode 100755 index 00000000..08f78d82 --- /dev/null +++ b/scripts/encode-test.py @@ -0,0 +1,161 @@ +# $Id$ + +import os + +def run(func, arg, *cmd): + i, o = func(cmd) + i.write(arg) + i.close() + value = o.read() + o.close() + return value + +def encode(xml, cer, key): + return run(os.popen2, xml, "openssl", "smime", "-sign", "-nodetach", "-outform", "PEM", "-signer", cer, "-inkey", key) + +def decode(cms, dir): + return run(os.popen2, cms, "openssl", "smime", "-verify", "-inform", "PEM", "-CApath", dir) + +def relaxng(xml, rng): + return run(os.popen4, xml, "xmllint", "--noout", "--relaxng", rng, "-") + +def main(): + dir = "biz-certs" + cer = "biz-certs/Alice-EE.cer" + key = "biz-certs/Alice-EE.key" + rng = "up-down-medium-schema.rng" + + for x in xml: + print x + e = encode(x, cer, key) + print e + d = decode(e, dir) + print d + v = relaxng(d, rng) + print v + print "=====\n" + +# Ugly inline stuff here for initial testing + +xml = [ +'''<?xml version="1.0" encoding="UTF-8"?> +<message xmlns="http://www.apnic.net/specs/rescerts/up-down/" + version="1" + sender="sender name" + recipient="recipient name" + msg_ref="42" + type="error_response"> + <status>2001</status> + <last_msg_processed>17</last_msg_processed> + <description xml:lang="en-US">[Readable text]</description> +</message> +''', +'''<?xml version="1.0" encoding="UTF-8"?> +<message xmlns="http://www.apnic.net/specs/rescerts/up-down/" + version="1" + sender="sender name" + recipient="recipient name" + msg_ref="42" type="issue"> + <request class_name="class name" + req_resource_set_as="" + req_resource_set_ipv4="10.0.0.44/32" + req_resource_set_ipv6="dead:beef::/32"> + deadbeef + </request> +</message> +''', +'''<?xml version="1.0" encoding="UTF-8"?> +<message xmlns="http://www.apnic.net/specs/rescerts/up-down/" + version="1" + sender="sender name" + recipient="recipient name" + msg_ref="1" + type="issue_response"> + <class class_name="class name" + cert_url="url" + cert_ski="g(ski)" + resource_set_as="22,42,44444-5555555" + resource_set_ipv4="10.0.0.44-10.3.0.44,10.6.0.2/32" + resource_set_ipv6="dead:beef::/128"> + <certificate cert_url="url" + cert_ski="g(ski)" + cert_aki="g(aki)" + cert_serial="1" + resource_set_as="14-17" + resource_set_ipv4="128.224.1.136/22" + resource_set_ipv6="0:0::/22" + req_resource_set_as="" + req_resource_set_ipv4="10.0.0.77/16,127.0.0.1/8" + req_resource_set_ipv6="dead:beef::/16" + status="match"> + deadbeef + </certificate> + <issuer>deadbeef</issuer> + </class> +</message> +''', +'''<?xml version="1.0" encoding="UTF-8"?> +<message xmlns="http://www.apnic.net/specs/rescerts/up-down/" + version="1" + sender="sender name" + recipient="recipient name" + msg_ref="42" + type="list"/> +''', +'''<?xml version="1.0" encoding="UTF-8"?> +<message xmlns="http://www.apnic.net/specs/rescerts/up-down/" + version="1" + sender="sender name" + recipient="recipient name" + msg_ref="42" + type="list_response"> + <class class_name="class name" + cert_url="url" + cert_ski="g(ski)" + resource_set_as="1,2,4,6,16-32" + resource_set_ipv4="128.224.1.1-128.22.4.32" + resource_set_ipv6="" + suggested_sia_head="rsync://wombat.example/fnord/"> + <certificate cert_url="url" + cert_ski="g(ski)" + cert_aki="g(aki)" + cert_serial="1" + resource_set_as="" + resource_set_ipv4="" + resource_set_ipv6="" + req_resource_set_as="" + req_resource_set_ipv4="" + req_resource_set_ipv6="" + status="match"> + deadbeef + </certificate> + <!-- Repeated for each current certificate naming the client as subject --> + <issuer>deadbeef</issuer> + </class> +</message> +''', +'''<?xml version="1.0" encoding="UTF-8"?> +<message xmlns="http://www.apnic.net/specs/rescerts/up-down/" + version="1" + sender="sender name" + recipient="recipient name" + msg_ref="42" + type="revoke"> + <key class_name="class name" + ski="g(ski)"/> +</message> +''', +'''<?xml version="1.0" encoding="UTF-8"?> +<message xmlns="http://www.apnic.net/specs/rescerts/up-down/" + version="1" + sender="sender name" + recipient="recipient name" + msg_ref="42" + type="revoke_response"> + <key class_name="class name" + ski="g(ski)"/> +</message> +''' +] + +main() diff --git a/scripts/xml-parse-test.py b/scripts/xml-parse-test.py new file mode 100755 index 00000000..2c2a82b9 --- /dev/null +++ b/scripts/xml-parse-test.py @@ -0,0 +1,188 @@ +# $Id$ + +import os + +def run(func, arg, *cmd): + i, o = func(cmd) + i.write(arg) + i.close() + value = o.read() + o.close() + return value + +def relaxng(xml, rng): + return run(os.popen4, xml, "xmllint", "--noout", "--relaxng", rng, "-") + +class rpki_updown_msg(object): + def toXml(self): + return ('''<?xml version="1.0" encoding="UTF-8"?> + <message xmlns="http://www.apnic.net/specs/rescerts/up-down/" + version="1" + sender="%s" + recipient="%s" + msg_ref="%d" + type="%s">\n''' % (self.sender, self.recipient, self.msg_ref, self.type) + ) + self.innerToXml() + '</message>\n' + +class rpki_updown_err(rpki_updown_msg): + def innerToXml(self): + return '<status>%d</status>\n' % self.status + +class rpki_updown_list(rpki_updown_msg): + def innerToXml(self): + return "" + +class rpki_updown_list_response(rpki_updown_msg): + def innerToXml(self): + pass + +class rpki_updown_issue(rpki_updown_msg): + def __init__(self): + self.req_as = None + self_req_ipv4 = None + self.req_ipv6 = None + def innerToXml(self): + xml = ' <request class_name="%s"' % self.class_name + if self.req_as != None: + xml += '\n req_resource_set_as="%s"' % self.req_as.toXml() + if self.req_ipv4 != None: + xml += '\n req_resource_set_ipv4="%s"' % self.req_ipv4.toXml() + if self.req_ipv6 != None: + xml += '\n req_resource_set_ipv6="%s"' % self.req_ipv6.toXml() + return xml + self.pkcs10.toXml() + ' </request>\n' + +class rpki_issue_response(rpki_updown_msg): + pass + + + +def main(): + for x in xml: + print x + print relaxng(x, "up-down-medium-schema.rng") + print "=====\n" + +# Ugly inline stuff here for initial testing + +xml = [ +'''<?xml version="1.0" encoding="UTF-8"?> +<message xmlns="http://www.apnic.net/specs/rescerts/up-down/" + version="1" + sender="sender name" + recipient="recipient name" + msg_ref="42" + type="error_response"> + <status>2001</status> + <last_msg_processed>17</last_msg_processed> + <description xml:lang="en-US">[Readable text]</description> +</message> +''', +'''<?xml version="1.0" encoding="UTF-8"?> +<message xmlns="http://www.apnic.net/specs/rescerts/up-down/" + version="1" + sender="sender name" + recipient="recipient name" + msg_ref="42" type="issue"> + <request class_name="class name" + req_resource_set_as="" + req_resource_set_ipv4="10.0.0.44/32" + req_resource_set_ipv6="dead:beef::/32"> + deadbeef + </request> +</message> +''', +'''<?xml version="1.0" encoding="UTF-8"?> +<message xmlns="http://www.apnic.net/specs/rescerts/up-down/" + version="1" + sender="sender name" + recipient="recipient name" + msg_ref="1" + type="issue_response"> + <class class_name="class name" + cert_url="url" + cert_ski="g(ski)" + resource_set_as="22,42,44444-5555555" + resource_set_ipv4="10.0.0.44-10.3.0.44,10.6.0.2/32" + resource_set_ipv6="dead:beef::/128"> + <certificate cert_url="url" + cert_ski="g(ski)" + cert_aki="g(aki)" + cert_serial="1" + resource_set_as="14-17" + resource_set_ipv4="128.224.1.136/22" + resource_set_ipv6="0:0::/22" + req_resource_set_as="" + req_resource_set_ipv4="10.0.0.77/16,127.0.0.1/8" + req_resource_set_ipv6="dead:beef::/16" + status="match"> + deadbeef + </certificate> + <issuer>deadbeef</issuer> + </class> +</message> +''', +'''<?xml version="1.0" encoding="UTF-8"?> +<message xmlns="http://www.apnic.net/specs/rescerts/up-down/" + version="1" + sender="sender name" + recipient="recipient name" + msg_ref="42" + type="list"/> +''', +'''<?xml version="1.0" encoding="UTF-8"?> +<message xmlns="http://www.apnic.net/specs/rescerts/up-down/" + version="1" + sender="sender name" + recipient="recipient name" + msg_ref="42" + type="list_response"> + <class class_name="class name" + cert_url="url" + cert_ski="g(ski)" + resource_set_as="1,2,4,6,16-32" + resource_set_ipv4="128.224.1.1-128.22.4.32" + resource_set_ipv6="" + suggested_sia_head="rsync://wombat.example/fnord/"> + <certificate cert_url="url" + cert_ski="g(ski)" + cert_aki="g(aki)" + cert_serial="1" + resource_set_as="" + resource_set_ipv4="" + resource_set_ipv6="" + req_resource_set_as="" + req_resource_set_ipv4="" + req_resource_set_ipv6="" + status="match"> + deadbeef + </certificate> + <!-- Repeated for each current certificate naming the client as subject --> + <issuer>deadbeef</issuer> + </class> +</message> +''', +'''<?xml version="1.0" encoding="UTF-8"?> +<message xmlns="http://www.apnic.net/specs/rescerts/up-down/" + version="1" + sender="sender name" + recipient="recipient name" + msg_ref="42" + type="revoke"> + <key class_name="class name" + ski="g(ski)"/> +</message> +''', +'''<?xml version="1.0" encoding="UTF-8"?> +<message xmlns="http://www.apnic.net/specs/rescerts/up-down/" + version="1" + sender="sender name" + recipient="recipient name" + msg_ref="42" + type="revoke_response"> + <key class_name="class name" + ski="g(ski)"/> +</message> +''' +] + +main() |