00001
00002
00003 import lxml.etree
00004
00005
00006
00007 left_right = lxml.etree.RelaxNG(lxml.etree.fromstring('''<?xml version="1.0" encoding="UTF-8"?>
00008 <!--
00009 $Id: left-right-schema.rnc 2511 2009-06-09 20:49:09Z sra $
00010
00011 RelaxNG Schema for RPKI left-right protocol.
00012
00013 libxml2 (including xmllint) only groks the XML syntax of RelaxNG, so
00014 run the compact syntax through trang to get XML syntax.
00015 -->
00016 <grammar ns="http://www.hactrn.net/uris/rpki/left-right-spec/" xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
00017 <!-- Top level PDU -->
00018 <start>
00019 <element name="msg">
00020 <attribute name="version">
00021 <data type="positiveInteger">
00022 <param name="maxInclusive">1</param>
00023 </data>
00024 </attribute>
00025 <choice>
00026 <group>
00027 <attribute name="type">
00028 <value>query</value>
00029 </attribute>
00030 <zeroOrMore>
00031 <ref name="query_elt"/>
00032 </zeroOrMore>
00033 </group>
00034 <group>
00035 <attribute name="type">
00036 <value>reply</value>
00037 </attribute>
00038 <zeroOrMore>
00039 <ref name="reply_elt"/>
00040 </zeroOrMore>
00041 </group>
00042 </choice>
00043 </element>
00044 </start>
00045 <!-- PDUs allowed in a query -->
00046 <define name="query_elt" combine="choice">
00047 <ref name="self_query"/>
00048 </define>
00049 <define name="query_elt" combine="choice">
00050 <ref name="bsc_query"/>
00051 </define>
00052 <define name="query_elt" combine="choice">
00053 <ref name="parent_query"/>
00054 </define>
00055 <define name="query_elt" combine="choice">
00056 <ref name="child_query"/>
00057 </define>
00058 <define name="query_elt" combine="choice">
00059 <ref name="repository_query"/>
00060 </define>
00061 <define name="query_elt" combine="choice">
00062 <ref name="list_roa_requests_query"/>
00063 </define>
00064 <define name="query_elt" combine="choice">
00065 <ref name="list_resources_query"/>
00066 </define>
00067 <!-- PDUs allowed in a reply -->
00068 <define name="reply_elt" combine="choice">
00069 <ref name="self_reply"/>
00070 </define>
00071 <define name="reply_elt" combine="choice">
00072 <ref name="bsc_reply"/>
00073 </define>
00074 <define name="reply_elt" combine="choice">
00075 <ref name="parent_reply"/>
00076 </define>
00077 <define name="reply_elt" combine="choice">
00078 <ref name="child_reply"/>
00079 </define>
00080 <define name="reply_elt" combine="choice">
00081 <ref name="repository_reply"/>
00082 </define>
00083 <define name="reply_elt" combine="choice">
00084 <ref name="list_resources_reply"/>
00085 </define>
00086 <define name="reply_elt" combine="choice">
00087 <ref name="list_roa_requests_reply"/>
00088 </define>
00089 <define name="reply_elt" combine="choice">
00090 <ref name="report_error_reply"/>
00091 </define>
00092 <!-- Tag attributes for bulk operations -->
00093 <define name="tag">
00094 <optional>
00095 <attribute name="tag">
00096 <data type="token">
00097 <param name="maxLength">1024</param>
00098 </data>
00099 </attribute>
00100 </optional>
00101 </define>
00102 <!--
00103 Combinations of action and type attributes used in later definitions.
00104 The same patterns repeat in most of the elements in this protocol.
00105 -->
00106 <define name="ctl_create">
00107 <attribute name="action">
00108 <value>create</value>
00109 </attribute>
00110 <ref name="tag"/>
00111 </define>
00112 <define name="ctl_set">
00113 <attribute name="action">
00114 <value>set</value>
00115 </attribute>
00116 <ref name="tag"/>
00117 </define>
00118 <define name="ctl_get">
00119 <attribute name="action">
00120 <value>get</value>
00121 </attribute>
00122 <ref name="tag"/>
00123 </define>
00124 <define name="ctl_list">
00125 <attribute name="action">
00126 <value>list</value>
00127 </attribute>
00128 <ref name="tag"/>
00129 </define>
00130 <define name="ctl_destroy">
00131 <attribute name="action">
00132 <value>destroy</value>
00133 </attribute>
00134 <ref name="tag"/>
00135 </define>
00136 <!-- Base64 encoded DER stuff -->
00137 <define name="base64">
00138 <data type="base64Binary">
00139 <param name="maxLength">512000</param>
00140 </data>
00141 </define>
00142 <!--
00143 Base definition for all fields that are really just SQL primary indices
00144 sql_id = xsd:nonNegativeInteger
00145 -->
00146 <!--
00147 ...except that fields containing SQL primary indicies don't belong
00148 in this protocol, so they're turninging into handles.
00149 Length restriction is a MySQL implementation issue.
00150 Handles are case-insensitive (because SQL is, among other reasons).
00151 -->
00152 <define name="object_handle">
00153 <data type="string">
00154 <param name="maxLength">255</param>
00155 <param name="pattern">[\-_A-Za-z0-9]*</param>
00156 </data>
00157 </define>
00158 <!-- URIs -->
00159 <define name="uri">
00160 <data type="anyURI">
00161 <param name="maxLength">4096</param>
00162 </data>
00163 </define>
00164 <!-- Name fields imported from up-down protocol -->
00165 <define name="up_down_name">
00166 <data type="token">
00167 <param name="maxLength">1024</param>
00168 </data>
00169 </define>
00170 <!-- Resource lists -->
00171 <define name="asn_list">
00172 <data type="string">
00173 <param name="maxLength">512000</param>
00174 <param name="pattern">[\-,0-9]*</param>
00175 </data>
00176 </define>
00177 <define name="ipv4_list">
00178 <data type="string">
00179 <param name="maxLength">512000</param>
00180 <param name="pattern">[\-,0-9/.]*</param>
00181 </data>
00182 </define>
00183 <define name="ipv6_list">
00184 <data type="string">
00185 <param name="maxLength">512000</param>
00186 <param name="pattern">[\-,0-9/:a-fA-F]*</param>
00187 </data>
00188 </define>
00189 <!-- <self/> element -->
00190 <define name="self_bool">
00191 <optional>
00192 <attribute name="rekey">
00193 <value>yes</value>
00194 </attribute>
00195 </optional>
00196 <optional>
00197 <attribute name="reissue">
00198 <value>yes</value>
00199 </attribute>
00200 </optional>
00201 <optional>
00202 <attribute name="revoke">
00203 <value>yes</value>
00204 </attribute>
00205 </optional>
00206 <optional>
00207 <attribute name="run_now">
00208 <value>yes</value>
00209 </attribute>
00210 </optional>
00211 <optional>
00212 <attribute name="publish_world_now">
00213 <value>yes</value>
00214 </attribute>
00215 </optional>
00216 </define>
00217 <define name="self_payload">
00218 <optional>
00219 <attribute name="use_hsm">
00220 <choice>
00221 <value>yes</value>
00222 <value>no</value>
00223 </choice>
00224 </attribute>
00225 </optional>
00226 <optional>
00227 <attribute name="crl_interval">
00228 <data type="positiveInteger"/>
00229 </attribute>
00230 </optional>
00231 <optional>
00232 <attribute name="regen_margin">
00233 <data type="positiveInteger"/>
00234 </attribute>
00235 </optional>
00236 <optional>
00237 <element name="bpki_cert">
00238 <ref name="base64"/>
00239 </element>
00240 </optional>
00241 <optional>
00242 <element name="bpki_glue">
00243 <ref name="base64"/>
00244 </element>
00245 </optional>
00246 </define>
00247 <define name="self_handle">
00248 <attribute name="self_handle">
00249 <ref name="object_handle"/>
00250 </attribute>
00251 </define>
00252 <define name="self_query" combine="choice">
00253 <element name="self">
00254 <ref name="ctl_create"/>
00255 <ref name="self_handle"/>
00256 <ref name="self_bool"/>
00257 <ref name="self_payload"/>
00258 </element>
00259 </define>
00260 <define name="self_reply" combine="choice">
00261 <element name="self">
00262 <ref name="ctl_create"/>
00263 <ref name="self_handle"/>
00264 </element>
00265 </define>
00266 <define name="self_query" combine="choice">
00267 <element name="self">
00268 <ref name="ctl_set"/>
00269 <ref name="self_handle"/>
00270 <ref name="self_bool"/>
00271 <ref name="self_payload"/>
00272 </element>
00273 </define>
00274 <define name="self_reply" combine="choice">
00275 <element name="self">
00276 <ref name="ctl_set"/>
00277 <ref name="self_handle"/>
00278 </element>
00279 </define>
00280 <define name="self_query" combine="choice">
00281 <element name="self">
00282 <ref name="ctl_get"/>
00283 <ref name="self_handle"/>
00284 </element>
00285 </define>
00286 <define name="self_reply" combine="choice">
00287 <element name="self">
00288 <ref name="ctl_get"/>
00289 <ref name="self_handle"/>
00290 <ref name="self_payload"/>
00291 </element>
00292 </define>
00293 <define name="self_query" combine="choice">
00294 <element name="self">
00295 <ref name="ctl_list"/>
00296 </element>
00297 </define>
00298 <define name="self_reply" combine="choice">
00299 <element name="self">
00300 <ref name="ctl_list"/>
00301 <ref name="self_handle"/>
00302 <ref name="self_payload"/>
00303 </element>
00304 </define>
00305 <define name="self_query" combine="choice">
00306 <element name="self">
00307 <ref name="ctl_destroy"/>
00308 <ref name="self_handle"/>
00309 </element>
00310 </define>
00311 <define name="self_reply" combine="choice">
00312 <element name="self">
00313 <ref name="ctl_destroy"/>
00314 <ref name="self_handle"/>
00315 </element>
00316 </define>
00317 <!-- <bsc/> element. Key parameters hardwired for now. -->
00318 <define name="bsc_bool">
00319 <optional>
00320 <attribute name="generate_keypair">
00321 <value>yes</value>
00322 </attribute>
00323 <optional>
00324 <attribute name="key_type">
00325 <value>rsa</value>
00326 </attribute>
00327 </optional>
00328 <optional>
00329 <attribute name="hash_alg">
00330 <value>sha256</value>
00331 </attribute>
00332 </optional>
00333 <optional>
00334 <attribute name="key_length">
00335 <value>2048</value>
00336 </attribute>
00337 </optional>
00338 </optional>
00339 </define>
00340 <define name="bsc_handle">
00341 <attribute name="bsc_handle">
00342 <ref name="object_handle"/>
00343 </attribute>
00344 </define>
00345 <define name="bsc_payload">
00346 <optional>
00347 <element name="signing_cert">
00348 <ref name="base64"/>
00349 </element>
00350 </optional>
00351 <optional>
00352 <element name="signing_cert_crl">
00353 <ref name="base64"/>
00354 </element>
00355 </optional>
00356 </define>
00357 <define name="bsc_pkcs10">
00358 <optional>
00359 <element name="pkcs10_request">
00360 <ref name="base64"/>
00361 </element>
00362 </optional>
00363 </define>
00364 <define name="bsc_query" combine="choice">
00365 <element name="bsc">
00366 <ref name="ctl_create"/>
00367 <ref name="self_handle"/>
00368 <ref name="bsc_handle"/>
00369 <ref name="bsc_bool"/>
00370 <ref name="bsc_payload"/>
00371 </element>
00372 </define>
00373 <define name="bsc_reply" combine="choice">
00374 <element name="bsc">
00375 <ref name="ctl_create"/>
00376 <ref name="self_handle"/>
00377 <ref name="bsc_handle"/>
00378 <ref name="bsc_pkcs10"/>
00379 </element>
00380 </define>
00381 <define name="bsc_query" combine="choice">
00382 <element name="bsc">
00383 <ref name="ctl_set"/>
00384 <ref name="self_handle"/>
00385 <ref name="bsc_handle"/>
00386 <ref name="bsc_bool"/>
00387 <ref name="bsc_payload"/>
00388 </element>
00389 </define>
00390 <define name="bsc_reply" combine="choice">
00391 <element name="bsc">
00392 <ref name="ctl_set"/>
00393 <ref name="self_handle"/>
00394 <ref name="bsc_handle"/>
00395 <ref name="bsc_pkcs10"/>
00396 </element>
00397 </define>
00398 <define name="bsc_query" combine="choice">
00399 <element name="bsc">
00400 <ref name="ctl_get"/>
00401 <ref name="self_handle"/>
00402 <ref name="bsc_handle"/>
00403 </element>
00404 </define>
00405 <define name="bsc_reply" combine="choice">
00406 <element name="bsc">
00407 <ref name="ctl_get"/>
00408 <ref name="self_handle"/>
00409 <ref name="bsc_handle"/>
00410 <ref name="bsc_payload"/>
00411 <ref name="bsc_pkcs10"/>
00412 </element>
00413 </define>
00414 <define name="bsc_query" combine="choice">
00415 <element name="bsc">
00416 <ref name="ctl_list"/>
00417 <ref name="self_handle"/>
00418 </element>
00419 </define>
00420 <define name="bsc_reply" combine="choice">
00421 <element name="bsc">
00422 <ref name="ctl_list"/>
00423 <ref name="self_handle"/>
00424 <ref name="bsc_handle"/>
00425 <ref name="bsc_payload"/>
00426 <ref name="bsc_pkcs10"/>
00427 </element>
00428 </define>
00429 <define name="bsc_query" combine="choice">
00430 <element name="bsc">
00431 <ref name="ctl_destroy"/>
00432 <ref name="self_handle"/>
00433 <ref name="bsc_handle"/>
00434 </element>
00435 </define>
00436 <define name="bsc_reply" combine="choice">
00437 <element name="bsc">
00438 <ref name="ctl_destroy"/>
00439 <ref name="self_handle"/>
00440 <ref name="bsc_handle"/>
00441 </element>
00442 </define>
00443 <!-- <parent/> element -->
00444 <define name="parent_handle">
00445 <attribute name="parent_handle">
00446 <ref name="object_handle"/>
00447 </attribute>
00448 </define>
00449 <define name="parent_bool">
00450 <optional>
00451 <attribute name="rekey">
00452 <value>yes</value>
00453 </attribute>
00454 </optional>
00455 <optional>
00456 <attribute name="reissue">
00457 <value>yes</value>
00458 </attribute>
00459 </optional>
00460 <optional>
00461 <attribute name="revoke">
00462 <value>yes</value>
00463 </attribute>
00464 </optional>
00465 </define>
00466 <define name="parent_payload">
00467 <optional>
00468 <attribute name="peer_contact_uri">
00469 <ref name="uri"/>
00470 </attribute>
00471 </optional>
00472 <optional>
00473 <attribute name="sia_base">
00474 <ref name="uri"/>
00475 </attribute>
00476 </optional>
00477 <optional>
00478 <ref name="bsc_handle"/>
00479 </optional>
00480 <optional>
00481 <ref name="repository_handle"/>
00482 </optional>
00483 <optional>
00484 <attribute name="sender_name">
00485 <ref name="up_down_name"/>
00486 </attribute>
00487 </optional>
00488 <optional>
00489 <attribute name="recipient_name">
00490 <ref name="up_down_name"/>
00491 </attribute>
00492 </optional>
00493 <optional>
00494 <element name="bpki_cms_cert">
00495 <ref name="base64"/>
00496 </element>
00497 </optional>
00498 <optional>
00499 <element name="bpki_cms_glue">
00500 <ref name="base64"/>
00501 </element>
00502 </optional>
00503 <optional>
00504 <element name="bpki_https_cert">
00505 <ref name="base64"/>
00506 </element>
00507 </optional>
00508 <optional>
00509 <element name="bpki_https_glue">
00510 <ref name="base64"/>
00511 </element>
00512 </optional>
00513 </define>
00514 <define name="parent_query" combine="choice">
00515 <element name="parent">
00516 <ref name="ctl_create"/>
00517 <ref name="self_handle"/>
00518 <ref name="parent_handle"/>
00519 <ref name="parent_bool"/>
00520 <ref name="parent_payload"/>
00521 </element>
00522 </define>
00523 <define name="parent_reply" combine="choice">
00524 <element name="parent">
00525 <ref name="ctl_create"/>
00526 <ref name="self_handle"/>
00527 <ref name="parent_handle"/>
00528 </element>
00529 </define>
00530 <define name="parent_query" combine="choice">
00531 <element name="parent">
00532 <ref name="ctl_set"/>
00533 <ref name="self_handle"/>
00534 <ref name="parent_handle"/>
00535 <ref name="parent_bool"/>
00536 <ref name="parent_payload"/>
00537 </element>
00538 </define>
00539 <define name="parent_reply" combine="choice">
00540 <element name="parent">
00541 <ref name="ctl_set"/>
00542 <ref name="self_handle"/>
00543 <ref name="parent_handle"/>
00544 </element>
00545 </define>
00546 <define name="parent_query" combine="choice">
00547 <element name="parent">
00548 <ref name="ctl_get"/>
00549 <ref name="self_handle"/>
00550 <ref name="parent_handle"/>
00551 </element>
00552 </define>
00553 <define name="parent_reply" combine="choice">
00554 <element name="parent">
00555 <ref name="ctl_get"/>
00556 <ref name="self_handle"/>
00557 <ref name="parent_handle"/>
00558 <ref name="parent_payload"/>
00559 </element>
00560 </define>
00561 <define name="parent_query" combine="choice">
00562 <element name="parent">
00563 <ref name="ctl_list"/>
00564 <ref name="self_handle"/>
00565 </element>
00566 </define>
00567 <define name="parent_reply" combine="choice">
00568 <element name="parent">
00569 <ref name="ctl_list"/>
00570 <ref name="self_handle"/>
00571 <ref name="parent_handle"/>
00572 <ref name="parent_payload"/>
00573 </element>
00574 </define>
00575 <define name="parent_query" combine="choice">
00576 <element name="parent">
00577 <ref name="ctl_destroy"/>
00578 <ref name="self_handle"/>
00579 <ref name="parent_handle"/>
00580 </element>
00581 </define>
00582 <define name="parent_reply" combine="choice">
00583 <element name="parent">
00584 <ref name="ctl_destroy"/>
00585 <ref name="self_handle"/>
00586 <ref name="parent_handle"/>
00587 </element>
00588 </define>
00589 <!-- <child/> element -->
00590 <define name="child_handle">
00591 <attribute name="child_handle">
00592 <ref name="object_handle"/>
00593 </attribute>
00594 </define>
00595 <define name="child_bool">
00596 <optional>
00597 <attribute name="reissue">
00598 <value>yes</value>
00599 </attribute>
00600 </optional>
00601 </define>
00602 <define name="child_payload">
00603 <optional>
00604 <ref name="bsc_handle"/>
00605 </optional>
00606 <optional>
00607 <element name="bpki_cert">
00608 <ref name="base64"/>
00609 </element>
00610 </optional>
00611 <optional>
00612 <element name="bpki_glue">
00613 <ref name="base64"/>
00614 </element>
00615 </optional>
00616 </define>
00617 <define name="child_query" combine="choice">
00618 <element name="child">
00619 <ref name="ctl_create"/>
00620 <ref name="self_handle"/>
00621 <ref name="child_handle"/>
00622 <ref name="child_bool"/>
00623 <ref name="child_payload"/>
00624 </element>
00625 </define>
00626 <define name="child_reply" combine="choice">
00627 <element name="child">
00628 <ref name="ctl_create"/>
00629 <ref name="self_handle"/>
00630 <ref name="child_handle"/>
00631 </element>
00632 </define>
00633 <define name="child_query" combine="choice">
00634 <element name="child">
00635 <ref name="ctl_set"/>
00636 <ref name="self_handle"/>
00637 <ref name="child_handle"/>
00638 <ref name="child_bool"/>
00639 <ref name="child_payload"/>
00640 </element>
00641 </define>
00642 <define name="child_reply" combine="choice">
00643 <element name="child">
00644 <ref name="ctl_set"/>
00645 <ref name="self_handle"/>
00646 <ref name="child_handle"/>
00647 </element>
00648 </define>
00649 <define name="child_query" combine="choice">
00650 <element name="child">
00651 <ref name="ctl_get"/>
00652 <ref name="self_handle"/>
00653 <ref name="child_handle"/>
00654 </element>
00655 </define>
00656 <define name="child_reply" combine="choice">
00657 <element name="child">
00658 <ref name="ctl_get"/>
00659 <ref name="self_handle"/>
00660 <ref name="child_handle"/>
00661 <ref name="child_payload"/>
00662 </element>
00663 </define>
00664 <define name="child_query" combine="choice">
00665 <element name="child">
00666 <ref name="ctl_list"/>
00667 <ref name="self_handle"/>
00668 </element>
00669 </define>
00670 <define name="child_reply" combine="choice">
00671 <element name="child">
00672 <ref name="ctl_list"/>
00673 <ref name="self_handle"/>
00674 <ref name="child_handle"/>
00675 <ref name="child_payload"/>
00676 </element>
00677 </define>
00678 <define name="child_query" combine="choice">
00679 <element name="child">
00680 <ref name="ctl_destroy"/>
00681 <ref name="self_handle"/>
00682 <ref name="child_handle"/>
00683 </element>
00684 </define>
00685 <define name="child_reply" combine="choice">
00686 <element name="child">
00687 <ref name="ctl_destroy"/>
00688 <ref name="self_handle"/>
00689 <ref name="child_handle"/>
00690 </element>
00691 </define>
00692 <!-- <repository/> element -->
00693 <define name="repository_handle">
00694 <attribute name="repository_handle">
00695 <ref name="object_handle"/>
00696 </attribute>
00697 </define>
00698 <define name="repository_payload">
00699 <optional>
00700 <attribute name="peer_contact_uri">
00701 <ref name="uri"/>
00702 </attribute>
00703 </optional>
00704 <optional>
00705 <ref name="bsc_handle"/>
00706 </optional>
00707 <optional>
00708 <element name="bpki_cms_cert">
00709 <ref name="base64"/>
00710 </element>
00711 </optional>
00712 <optional>
00713 <element name="bpki_cms_glue">
00714 <ref name="base64"/>
00715 </element>
00716 </optional>
00717 <optional>
00718 <element name="bpki_https_cert">
00719 <ref name="base64"/>
00720 </element>
00721 </optional>
00722 <optional>
00723 <element name="bpki_https_glue">
00724 <ref name="base64"/>
00725 </element>
00726 </optional>
00727 </define>
00728 <define name="repository_query" combine="choice">
00729 <element name="repository">
00730 <ref name="ctl_create"/>
00731 <ref name="self_handle"/>
00732 <ref name="repository_handle"/>
00733 <ref name="repository_payload"/>
00734 </element>
00735 </define>
00736 <define name="repository_reply" combine="choice">
00737 <element name="repository">
00738 <ref name="ctl_create"/>
00739 <ref name="self_handle"/>
00740 <ref name="repository_handle"/>
00741 </element>
00742 </define>
00743 <define name="repository_query" combine="choice">
00744 <element name="repository">
00745 <ref name="ctl_set"/>
00746 <ref name="self_handle"/>
00747 <ref name="repository_handle"/>
00748 <ref name="repository_payload"/>
00749 </element>
00750 </define>
00751 <define name="repository_reply" combine="choice">
00752 <element name="repository">
00753 <ref name="ctl_set"/>
00754 <ref name="self_handle"/>
00755 <ref name="repository_handle"/>
00756 </element>
00757 </define>
00758 <define name="repository_query" combine="choice">
00759 <element name="repository">
00760 <ref name="ctl_get"/>
00761 <ref name="self_handle"/>
00762 <ref name="repository_handle"/>
00763 </element>
00764 </define>
00765 <define name="repository_reply" combine="choice">
00766 <element name="repository">
00767 <ref name="ctl_get"/>
00768 <ref name="self_handle"/>
00769 <ref name="repository_handle"/>
00770 <ref name="repository_payload"/>
00771 </element>
00772 </define>
00773 <define name="repository_query" combine="choice">
00774 <element name="repository">
00775 <ref name="ctl_list"/>
00776 <ref name="self_handle"/>
00777 </element>
00778 </define>
00779 <define name="repository_reply" combine="choice">
00780 <element name="repository">
00781 <ref name="ctl_list"/>
00782 <ref name="self_handle"/>
00783 <ref name="repository_handle"/>
00784 <ref name="repository_payload"/>
00785 </element>
00786 </define>
00787 <define name="repository_query" combine="choice">
00788 <element name="repository">
00789 <ref name="ctl_destroy"/>
00790 <ref name="self_handle"/>
00791 <ref name="repository_handle"/>
00792 </element>
00793 </define>
00794 <define name="repository_reply" combine="choice">
00795 <element name="repository">
00796 <ref name="ctl_destroy"/>
00797 <ref name="self_handle"/>
00798 <ref name="repository_handle"/>
00799 </element>
00800 </define>
00801 <!-- <list_resources/> element -->
00802 <define name="list_resources_query">
00803 <element name="list_resources">
00804 <ref name="tag"/>
00805 <ref name="self_handle"/>
00806 <ref name="child_handle"/>
00807 </element>
00808 </define>
00809 <define name="list_resources_reply">
00810 <element name="list_resources">
00811 <ref name="tag"/>
00812 <ref name="self_handle"/>
00813 <ref name="child_handle"/>
00814 <attribute name="valid_until">
00815 <data type="dateTime">
00816 <param name="pattern">.*Z</param>
00817 </data>
00818 </attribute>
00819 <optional>
00820 <attribute name="asn">
00821 <ref name="asn_list"/>
00822 </attribute>
00823 </optional>
00824 <optional>
00825 <attribute name="ipv4">
00826 <ref name="ipv4_list"/>
00827 </attribute>
00828 </optional>
00829 <optional>
00830 <attribute name="ipv6">
00831 <ref name="ipv6_list"/>
00832 </attribute>
00833 </optional>
00834 </element>
00835 </define>
00836 <!-- <list_roa_requests/> element -->
00837 <define name="list_roa_requests_query">
00838 <element name="list_roa_requests">
00839 <ref name="tag"/>
00840 <ref name="self_handle"/>
00841 </element>
00842 </define>
00843 <define name="list_roa_requests_reply">
00844 <element name="list_roa_requests">
00845 <ref name="tag"/>
00846 <ref name="self_handle"/>
00847 <attribute name="asn">
00848 <data type="positiveInteger"/>
00849 </attribute>
00850 <optional>
00851 <attribute name="ipv4">
00852 <ref name="ipv4_list"/>
00853 </attribute>
00854 </optional>
00855 <optional>
00856 <attribute name="ipv6">
00857 <ref name="ipv6_list"/>
00858 </attribute>
00859 </optional>
00860 </element>
00861 </define>
00862 <!-- <report_error/> element -->
00863 <define name="error">
00864 <data type="token">
00865 <param name="maxLength">1024</param>
00866 </data>
00867 </define>
00868 <define name="report_error_reply">
00869 <element name="report_error">
00870 <ref name="tag"/>
00871 <optional>
00872 <ref name="self_handle"/>
00873 </optional>
00874 <attribute name="error_code">
00875 <ref name="error"/>
00876 </attribute>
00877 <optional>
00878 <data type="string">
00879 <param name="maxLength">512000</param>
00880 </data>
00881 </optional>
00882 </element>
00883 </define>
00884 </grammar>
00885 <!--
00886 Local Variables:
00887 indent-tabs-mode: nil
00888 End:
00889 -->
00890 '''))
00891
00892
00893
00894 up_down = lxml.etree.RelaxNG(lxml.etree.fromstring('''<?xml version="1.0" encoding="UTF-8"?>
00895 <!--
00896 $Id: up-down-schema.rnc 1798 2008-05-17 08:21:50Z sra $
00897
00898 RelaxNG Scheme for up-down protocol, extracted from APNIC Wiki.
00899
00900 libxml2 (including xmllint) only groks the XML syntax of RelaxNG, so
00901 run the compact syntax through trang to get XML syntax.
00902 -->
00903 <grammar ns="http://www.apnic.net/specs/rescerts/up-down/" xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
00904 <start>
00905 <element name="message">
00906 <attribute name="version">
00907 <data type="positiveInteger">
00908 <param name="maxInclusive">1</param>
00909 </data>
00910 </attribute>
00911 <attribute name="sender">
00912 <data type="token">
00913 <param name="maxLength">1024</param>
00914 </data>
00915 </attribute>
00916 <attribute name="recipient">
00917 <data type="token">
00918 <param name="maxLength">1024</param>
00919 </data>
00920 </attribute>
00921 <ref name="payload"/>
00922 </element>
00923 </start>
00924 <define name="payload" combine="choice">
00925 <attribute name="type">
00926 <value>list</value>
00927 </attribute>
00928 <ref name="list_request"/>
00929 </define>
00930 <define name="payload" combine="choice">
00931 <attribute name="type">
00932 <value>list_response</value>
00933 </attribute>
00934 <ref name="list_response"/>
00935 </define>
00936 <define name="payload" combine="choice">
00937 <attribute name="type">
00938 <value>issue</value>
00939 </attribute>
00940 <ref name="issue_request"/>
00941 </define>
00942 <define name="payload" combine="choice">
00943 <attribute name="type">
00944 <value>issue_response</value>
00945 </attribute>
00946 <ref name="issue_response"/>
00947 </define>
00948 <define name="payload" combine="choice">
00949 <attribute name="type">
00950 <value>revoke</value>
00951 </attribute>
00952 <ref name="revoke_request"/>
00953 </define>
00954 <define name="payload" combine="choice">
00955 <attribute name="type">
00956 <value>revoke_response</value>
00957 </attribute>
00958 <ref name="revoke_response"/>
00959 </define>
00960 <define name="payload" combine="choice">
00961 <attribute name="type">
00962 <value>error_response</value>
00963 </attribute>
00964 <ref name="error_response"/>
00965 </define>
00966 <define name="list_request">
00967 <empty/>
00968 </define>
00969 <define name="list_response">
00970 <zeroOrMore>
00971 <ref name="class"/>
00972 </zeroOrMore>
00973 </define>
00974 <define name="class">
00975 <element name="class">
00976 <attribute name="class_name">
00977 <data type="token">
00978 <param name="maxLength">1024</param>
00979 </data>
00980 </attribute>
00981 <attribute name="cert_url">
00982 <data type="string">
00983 <param name="maxLength">4096</param>
00984 </data>
00985 </attribute>
00986 <attribute name="resource_set_as">
00987 <data type="string">
00988 <param name="maxLength">512000</param>
00989 <param name="pattern">[\-,0-9]*</param>
00990 </data>
00991 </attribute>
00992 <attribute name="resource_set_ipv4">
00993 <data type="string">
00994 <param name="maxLength">512000</param>
00995 <param name="pattern">[\-,/.0-9]*</param>
00996 </data>
00997 </attribute>
00998 <attribute name="resource_set_ipv6">
00999 <data type="string">
01000 <param name="maxLength">512000</param>
01001 <param name="pattern">[\-,/:0-9a-fA-F]*</param>
01002 </data>
01003 </attribute>
01004 <optional>
01005 <attribute name="resource_set_notafter">
01006 <data type="dateTime">
01007 <param name="pattern">.*Z</param>
01008 </data>
01009 </attribute>
01010 </optional>
01011 <optional>
01012 <attribute name="suggested_sia_head">
01013 <data type="anyURI">
01014 <param name="maxLength">1024</param>
01015 <param name="pattern">rsync://.+</param>
01016 </data>
01017 </attribute>
01018 </optional>
01019 <zeroOrMore>
01020 <element name="certificate">
01021 <attribute name="cert_url">
01022 <data type="string">
01023 <param name="maxLength">4096</param>
01024 </data>
01025 </attribute>
01026 <optional>
01027 <attribute name="req_resource_set_as">
01028 <data type="string">
01029 <param name="maxLength">512000</param>
01030 <param name="pattern">[\-,0-9]*</param>
01031 </data>
01032 </attribute>
01033 </optional>
01034 <optional>
01035 <attribute name="req_resource_set_ipv4">
01036 <data type="string">
01037 <param name="maxLength">512000</param>
01038 <param name="pattern">[\-,/.0-9]*</param>
01039 </data>
01040 </attribute>
01041 </optional>
01042 <optional>
01043 <attribute name="req_resource_set_ipv6">
01044 <data type="string">
01045 <param name="maxLength">512000</param>
01046 <param name="pattern">[\-,/:0-9a-fA-F]*</param>
01047 </data>
01048 </attribute>
01049 </optional>
01050 <data type="base64Binary">
01051 <param name="maxLength">512000</param>
01052 </data>
01053 </element>
01054 </zeroOrMore>
01055 <element name="issuer">
01056 <data type="base64Binary">
01057 <param name="maxLength">512000</param>
01058 </data>
01059 </element>
01060 </element>
01061 </define>
01062 <define name="issue_request">
01063 <element name="request">
01064 <attribute name="class_name">
01065 <data type="token">
01066 <param name="maxLength">1024</param>
01067 </data>
01068 </attribute>
01069 <optional>
01070 <attribute name="req_resource_set_as">
01071 <data type="string">
01072 <param name="maxLength">512000</param>
01073 <param name="pattern">[\-,0-9]*</param>
01074 </data>
01075 </attribute>
01076 </optional>
01077 <optional>
01078 <attribute name="req_resource_set_ipv4">
01079 <data type="string">
01080 <param name="maxLength">512000</param>
01081 <param name="pattern">[\-,/.0-9]*</param>
01082 </data>
01083 </attribute>
01084 </optional>
01085 <optional>
01086 <attribute name="req_resource_set_ipv6">
01087 <data type="string">
01088 <param name="maxLength">512000</param>
01089 <param name="pattern">[\-,/:0-9a-fA-F]*</param>
01090 </data>
01091 </attribute>
01092 </optional>
01093 <data type="base64Binary">
01094 <param name="maxLength">512000</param>
01095 </data>
01096 </element>
01097 </define>
01098 <define name="issue_response">
01099 <ref name="class"/>
01100 </define>
01101 <define name="revoke_request">
01102 <ref name="revocation"/>
01103 </define>
01104 <define name="revoke_response">
01105 <ref name="revocation"/>
01106 </define>
01107 <define name="revocation">
01108 <element name="key">
01109 <attribute name="class_name">
01110 <data type="token">
01111 <param name="maxLength">1024</param>
01112 </data>
01113 </attribute>
01114 <attribute name="ski">
01115 <data type="token">
01116 <param name="maxLength">1024</param>
01117 </data>
01118 </attribute>
01119 </element>
01120 </define>
01121 <define name="error_response">
01122 <element name="status">
01123 <data type="positiveInteger">
01124 <param name="maxInclusive">999999999999999</param>
01125 </data>
01126 </element>
01127 <optional>
01128 <element name="description">
01129 <attribute name="xml:lang">
01130 <data type="language"/>
01131 </attribute>
01132 <data type="string">
01133 <param name="maxLength">1024</param>
01134 </data>
01135 </element>
01136 </optional>
01137 </define>
01138 </grammar>
01139 <!--
01140 Local Variables:
01141 indent-tabs-mode: nil
01142 End:
01143 -->
01144 '''))
01145
01146
01147
01148 publication = lxml.etree.RelaxNG(lxml.etree.fromstring('''<?xml version="1.0" encoding="UTF-8"?>
01149 <!--
01150 $Id: publication-schema.rnc 2493 2009-06-04 18:30:40Z sra $
01151
01152 RelaxNG Schema for RPKI publication protocol.
01153
01154 libxml2 (including xmllint) only groks the XML syntax of RelaxNG, so
01155 run the compact syntax through trang to get XML syntax.
01156 -->
01157 <grammar ns="http://www.hactrn.net/uris/rpki/publication-spec/" xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
01158 <!-- Top level PDU -->
01159 <start>
01160 <element name="msg">
01161 <attribute name="version">
01162 <data type="positiveInteger">
01163 <param name="maxInclusive">1</param>
01164 </data>
01165 </attribute>
01166 <choice>
01167 <group>
01168 <attribute name="type">
01169 <value>query</value>
01170 </attribute>
01171 <zeroOrMore>
01172 <ref name="query_elt"/>
01173 </zeroOrMore>
01174 </group>
01175 <group>
01176 <attribute name="type">
01177 <value>reply</value>
01178 </attribute>
01179 <zeroOrMore>
01180 <ref name="reply_elt"/>
01181 </zeroOrMore>
01182 </group>
01183 </choice>
01184 </element>
01185 </start>
01186 <!-- PDUs allowed in a query -->
01187 <define name="query_elt">
01188 <choice>
01189 <ref name="config_query"/>
01190 <ref name="client_query"/>
01191 <ref name="certificate_query"/>
01192 <ref name="crl_query"/>
01193 <ref name="manifest_query"/>
01194 <ref name="roa_query"/>
01195 </choice>
01196 </define>
01197 <!-- PDUs allowed in a reply -->
01198 <define name="reply_elt">
01199 <choice>
01200 <ref name="config_reply"/>
01201 <ref name="client_reply"/>
01202 <ref name="certificate_reply"/>
01203 <ref name="crl_reply"/>
01204 <ref name="manifest_reply"/>
01205 <ref name="roa_reply"/>
01206 <ref name="report_error_reply"/>
01207 </choice>
01208 </define>
01209 <!-- Tag attributes for bulk operations -->
01210 <define name="tag">
01211 <attribute name="tag">
01212 <data type="token">
01213 <param name="maxLength">1024</param>
01214 </data>
01215 </attribute>
01216 </define>
01217 <!-- Base64 encoded DER stuff -->
01218 <define name="base64">
01219 <data type="base64Binary">
01220 <param name="maxLength">512000</param>
01221 </data>
01222 </define>
01223 <!-- Publication URLs -->
01224 <define name="uri_t">
01225 <data type="anyURI">
01226 <param name="maxLength">4096</param>
01227 </data>
01228 </define>
01229 <define name="uri">
01230 <attribute name="uri">
01231 <ref name="uri_t"/>
01232 </attribute>
01233 </define>
01234 <!-- Handles on remote objects (replaces passing raw SQL IDs) -->
01235 <define name="object_handle">
01236 <data type="string">
01237 <param name="maxLength">255</param>
01238 <param name="pattern">[\-_A-Za-z0-9]*</param>
01239 </data>
01240 </define>
01241 <!--
01242 <config/> element (use restricted to repository operator)
01243 config_handle attribute, create, list, and destroy commands omitted deliberately, see code for details
01244 -->
01245 <define name="config_payload">
01246 <optional>
01247 <element name="bpki_crl">
01248 <ref name="base64"/>
01249 </element>
01250 </optional>
01251 </define>
01252 <define name="config_query" combine="choice">
01253 <element name="config">
01254 <attribute name="action">
01255 <value>set</value>
01256 </attribute>
01257 <optional>
01258 <ref name="tag"/>
01259 </optional>
01260 <ref name="config_payload"/>
01261 </element>
01262 </define>
01263 <define name="config_reply" combine="choice">
01264 <element name="config">
01265 <attribute name="action">
01266 <value>set</value>
01267 </attribute>
01268 <optional>
01269 <ref name="tag"/>
01270 </optional>
01271 </element>
01272 </define>
01273 <define name="config_query" combine="choice">
01274 <element name="config">
01275 <attribute name="action">
01276 <value>get</value>
01277 </attribute>
01278 <optional>
01279 <ref name="tag"/>
01280 </optional>
01281 </element>
01282 </define>
01283 <define name="config_reply" combine="choice">
01284 <element name="config">
01285 <attribute name="action">
01286 <value>get</value>
01287 </attribute>
01288 <optional>
01289 <ref name="tag"/>
01290 </optional>
01291 <ref name="config_payload"/>
01292 </element>
01293 </define>
01294 <!-- <client/> element (use restricted to repository operator) -->
01295 <define name="client_handle">
01296 <attribute name="client_handle">
01297 <ref name="object_handle"/>
01298 </attribute>
01299 </define>
01300 <define name="client_payload">
01301 <optional>
01302 <attribute name="base_uri">
01303 <ref name="uri_t"/>
01304 </attribute>
01305 </optional>
01306 <optional>
01307 <element name="bpki_cert">
01308 <ref name="base64"/>
01309 </element>
01310 </optional>
01311 <optional>
01312 <element name="bpki_glue">
01313 <ref name="base64"/>
01314 </element>
01315 </optional>
01316 </define>
01317 <define name="client_query" combine="choice">
01318 <element name="client">
01319 <attribute name="action">
01320 <value>create</value>
01321 </attribute>
01322 <optional>
01323 <ref name="tag"/>
01324 </optional>
01325 <ref name="client_handle"/>
01326 <ref name="client_payload"/>
01327 </element>
01328 </define>
01329 <define name="client_reply" combine="choice">
01330 <element name="client">
01331 <attribute name="action">
01332 <value>create</value>
01333 </attribute>
01334 <optional>
01335 <ref name="tag"/>
01336 </optional>
01337 <ref name="client_handle"/>
01338 </element>
01339 </define>
01340 <define name="client_query" combine="choice">
01341 <element name="client">
01342 <attribute name="action">
01343 <value>set</value>
01344 </attribute>
01345 <optional>
01346 <ref name="tag"/>
01347 </optional>
01348 <ref name="client_handle"/>
01349 <ref name="client_payload"/>
01350 </element>
01351 </define>
01352 <define name="client_reply" combine="choice">
01353 <element name="client">
01354 <attribute name="action">
01355 <value>set</value>
01356 </attribute>
01357 <optional>
01358 <ref name="tag"/>
01359 </optional>
01360 <ref name="client_handle"/>
01361 </element>
01362 </define>
01363 <define name="client_query" combine="choice">
01364 <element name="client">
01365 <attribute name="action">
01366 <value>get</value>
01367 </attribute>
01368 <optional>
01369 <ref name="tag"/>
01370 </optional>
01371 <ref name="client_handle"/>
01372 </element>
01373 </define>
01374 <define name="client_reply" combine="choice">
01375 <element name="client">
01376 <attribute name="action">
01377 <value>get</value>
01378 </attribute>
01379 <optional>
01380 <ref name="tag"/>
01381 </optional>
01382 <ref name="client_handle"/>
01383 <ref name="client_payload"/>
01384 </element>
01385 </define>
01386 <define name="client_query" combine="choice">
01387 <element name="client">
01388 <attribute name="action">
01389 <value>list</value>
01390 </attribute>
01391 <optional>
01392 <ref name="tag"/>
01393 </optional>
01394 </element>
01395 </define>
01396 <define name="client_reply" combine="choice">
01397 <element name="client">
01398 <attribute name="action">
01399 <value>list</value>
01400 </attribute>
01401 <optional>
01402 <ref name="tag"/>
01403 </optional>
01404 <ref name="client_handle"/>
01405 <ref name="client_payload"/>
01406 </element>
01407 </define>
01408 <define name="client_query" combine="choice">
01409 <element name="client">
01410 <attribute name="action">
01411 <value>destroy</value>
01412 </attribute>
01413 <optional>
01414 <ref name="tag"/>
01415 </optional>
01416 <ref name="client_handle"/>
01417 </element>
01418 </define>
01419 <define name="client_reply" combine="choice">
01420 <element name="client">
01421 <attribute name="action">
01422 <value>destroy</value>
01423 </attribute>
01424 <optional>
01425 <ref name="tag"/>
01426 </optional>
01427 <ref name="client_handle"/>
01428 </element>
01429 </define>
01430 <!-- <certificate/> element -->
01431 <define name="certificate_query" combine="choice">
01432 <element name="certificate">
01433 <attribute name="action">
01434 <value>publish</value>
01435 </attribute>
01436 <optional>
01437 <ref name="tag"/>
01438 </optional>
01439 <ref name="uri"/>
01440 <ref name="base64"/>
01441 </element>
01442 </define>
01443 <define name="certificate_reply" combine="choice">
01444 <element name="certificate">
01445 <attribute name="action">
01446 <value>publish</value>
01447 </attribute>
01448 <optional>
01449 <ref name="tag"/>
01450 </optional>
01451 <ref name="uri"/>
01452 </element>
01453 </define>
01454 <define name="certificate_query" combine="choice">
01455 <element name="certificate">
01456 <attribute name="action">
01457 <value>withdraw</value>
01458 </attribute>
01459 <optional>
01460 <ref name="tag"/>
01461 </optional>
01462 <ref name="uri"/>
01463 </element>
01464 </define>
01465 <define name="certificate_reply" combine="choice">
01466 <element name="certificate">
01467 <attribute name="action">
01468 <value>withdraw</value>
01469 </attribute>
01470 <optional>
01471 <ref name="tag"/>
01472 </optional>
01473 <ref name="uri"/>
01474 </element>
01475 </define>
01476 <!-- <crl/> element -->
01477 <define name="crl_query" combine="choice">
01478 <element name="crl">
01479 <attribute name="action">
01480 <value>publish</value>
01481 </attribute>
01482 <optional>
01483 <ref name="tag"/>
01484 </optional>
01485 <ref name="uri"/>
01486 <ref name="base64"/>
01487 </element>
01488 </define>
01489 <define name="crl_reply" combine="choice">
01490 <element name="crl">
01491 <attribute name="action">
01492 <value>publish</value>
01493 </attribute>
01494 <optional>
01495 <ref name="tag"/>
01496 </optional>
01497 <ref name="uri"/>
01498 </element>
01499 </define>
01500 <define name="crl_query" combine="choice">
01501 <element name="crl">
01502 <attribute name="action">
01503 <value>withdraw</value>
01504 </attribute>
01505 <optional>
01506 <ref name="tag"/>
01507 </optional>
01508 <ref name="uri"/>
01509 </element>
01510 </define>
01511 <define name="crl_reply" combine="choice">
01512 <element name="crl">
01513 <attribute name="action">
01514 <value>withdraw</value>
01515 </attribute>
01516 <optional>
01517 <ref name="tag"/>
01518 </optional>
01519 <ref name="uri"/>
01520 </element>
01521 </define>
01522 <!-- <manifest/> element -->
01523 <define name="manifest_query" combine="choice">
01524 <element name="manifest">
01525 <attribute name="action">
01526 <value>publish</value>
01527 </attribute>
01528 <optional>
01529 <ref name="tag"/>
01530 </optional>
01531 <ref name="uri"/>
01532 <ref name="base64"/>
01533 </element>
01534 </define>
01535 <define name="manifest_reply" combine="choice">
01536 <element name="manifest">
01537 <attribute name="action">
01538 <value>publish</value>
01539 </attribute>
01540 <optional>
01541 <ref name="tag"/>
01542 </optional>
01543 <ref name="uri"/>
01544 </element>
01545 </define>
01546 <define name="manifest_query" combine="choice">
01547 <element name="manifest">
01548 <attribute name="action">
01549 <value>withdraw</value>
01550 </attribute>
01551 <optional>
01552 <ref name="tag"/>
01553 </optional>
01554 <ref name="uri"/>
01555 </element>
01556 </define>
01557 <define name="manifest_reply" combine="choice">
01558 <element name="manifest">
01559 <attribute name="action">
01560 <value>withdraw</value>
01561 </attribute>
01562 <optional>
01563 <ref name="tag"/>
01564 </optional>
01565 <ref name="uri"/>
01566 </element>
01567 </define>
01568 <!-- <roa/> element -->
01569 <define name="roa_query" combine="choice">
01570 <element name="roa">
01571 <attribute name="action">
01572 <value>publish</value>
01573 </attribute>
01574 <optional>
01575 <ref name="tag"/>
01576 </optional>
01577 <ref name="uri"/>
01578 <ref name="base64"/>
01579 </element>
01580 </define>
01581 <define name="roa_reply" combine="choice">
01582 <element name="roa">
01583 <attribute name="action">
01584 <value>publish</value>
01585 </attribute>
01586 <optional>
01587 <ref name="tag"/>
01588 </optional>
01589 <ref name="uri"/>
01590 </element>
01591 </define>
01592 <define name="roa_query" combine="choice">
01593 <element name="roa">
01594 <attribute name="action">
01595 <value>withdraw</value>
01596 </attribute>
01597 <optional>
01598 <ref name="tag"/>
01599 </optional>
01600 <ref name="uri"/>
01601 </element>
01602 </define>
01603 <define name="roa_reply" combine="choice">
01604 <element name="roa">
01605 <attribute name="action">
01606 <value>withdraw</value>
01607 </attribute>
01608 <optional>
01609 <ref name="tag"/>
01610 </optional>
01611 <ref name="uri"/>
01612 </element>
01613 </define>
01614 <!-- <report_error/> element -->
01615 <define name="error">
01616 <data type="token">
01617 <param name="maxLength">1024</param>
01618 </data>
01619 </define>
01620 <define name="report_error_reply">
01621 <element name="report_error">
01622 <optional>
01623 <ref name="tag"/>
01624 </optional>
01625 <attribute name="error_code">
01626 <ref name="error"/>
01627 </attribute>
01628 <optional>
01629 <data type="string">
01630 <param name="maxLength">512000</param>
01631 </data>
01632 </optional>
01633 </element>
01634 </define>
01635 </grammar>
01636 <!--
01637 Local Variables:
01638 indent-tabs-mode: nil
01639 End:
01640 -->
01641 '''))
01642