aboutsummaryrefslogtreecommitdiff
path: root/rpkid
diff options
context:
space:
mode:
Diffstat (limited to 'rpkid')
-rw-r--r--rpkid/INSTALLATION81
-rw-r--r--rpkid/OPERATION680
2 files changed, 761 insertions, 0 deletions
diff --git a/rpkid/INSTALLATION b/rpkid/INSTALLATION
new file mode 100644
index 00000000..ffbf49e2
--- /dev/null
+++ b/rpkid/INSTALLATION
@@ -0,0 +1,81 @@
+$Id$ -*- Text -*-
+
+Copyright (C) 2007--2008 American Registry for Internet Numbers ("ARIN")
+
+Permission to use, copy, modify, and distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND ARIN DISCLAIMS ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS. IN NO EVENT SHALL ARIN BE LIABLE FOR ANY SPECIAL, DIRECT,
+INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
+
+
+Preliminary installation instructions for rpkid et al. These are the
+production-side RPKI tools, for Internet Registries (RIRs, LIRs, etc).
+See ../rcynic/README for relying party tools.
+
+rpkid is a set of Python modules supporting generation and maintenance
+of resource certificates. Most of the code is in the scripts/rpki/
+directory. rpkid itself is a relatively small program that calls the
+library modules. There are several other programs that make use of
+the same libraries, as well as a collection of test programs.
+
+At present the package is intended to be run out of its build
+directory. Setting up proper installation in a system area using the
+Python distutils package would likely not be very hard but has not yet
+been done.
+
+Note that initial development of this code has been on FreeBSD, so
+installation will probably be easiest on FreeBSD.
+
+The first step to running the code is to build the OpenSSL and POW
+binaries. At present the OpenSSL code is just a copy of the stock
+OpenSSL 0.9.8g release, compiled with special options to enable the
+RFC 3779 support that ISC wrote under previous contract to ARIN. The
+POW (Python OpenSSL Wrapper) library is an extended copy of the stock
+POW release.
+
+To build these, cd to the top-level directory in the distribution and
+type "make".
+
+ $ cd $top
+ $ make
+
+This should automatically build everything, in the right order,
+including staticly linking the POW extension module with the OpenSSL
+library to provide RFC 3779 support.
+
+Next, see the list of required Python modules in scripts/README. Note
+that the Python code requires Python version 2.5. Install any modules
+that might be missing.
+
+You will also need a MySQL installation. This code was developed
+using MySQL 5.1 and has been tested with MySQL 5.0 and 5.1.
+
+The architecture is intended to support hardware signing modules
+(HSMs), but the code to support them has not been written.
+
+At this point, you should have all the necessary software installed.
+You will probably want to test it. All tests should be run from the
+scripts/ directory.
+
+Some of the tests require MySQL databases to store their data. To set
+up all the databases that the tests will need, run the SQL commands in
+scripts/testbed.sql. The MySQL command line client is usually the
+easiest way to do this, eg:
+
+ $ cd $top/scripts
+ $ mysql -u root -p <testbed.sql
+
+To run the tests, run "make all-tests":
+
+ $ cd $top/scripts
+ $ make all-tests
+
+If nothing explodes, your installation is probably ok. Any Python
+backtraces in the output indicate a problem.
diff --git a/rpkid/OPERATION b/rpkid/OPERATION
new file mode 100644
index 00000000..d41559ef
--- /dev/null
+++ b/rpkid/OPERATION
@@ -0,0 +1,680 @@
+$Id$ -*- Text -*-
+
+Copyright (C) 2007--2008 American Registry for Internet Numbers ("ARIN")
+
+Permission to use, copy, modify, and distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND ARIN DISCLAIMS ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS. IN NO EVENT SHALL ARIN BE LIABLE FOR ANY SPECIAL, DIRECT,
+INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
+
+
+Preliminary operation instructions for rpkid et al. These are the
+production-side RPKI tools, for Internet Registries (RIRs, LIRs, etc).
+See ../rcynic/README for relying party tools.
+
+See INSTALLATION for how to install the software.
+
+At present the package is intended to be run out of the scripts
+directory.
+
+In addition to the library routines in the scripts/rpki/ directory,
+the package includes the following programs:
+
+rpkid.py The main RPKI engine daemon
+
+rootd.py A separate daemon for handling the root of an RPKI
+ certificate tree. This is essentially a stripped down
+ version of rpkid with no SQL database, no left-right
+ protocol implementation, and only the parent side of
+ the up-down protocol. It's separate because the root
+ is a special case in several ways and it was simpler
+ to keep the special cases out of the main daemon.
+
+irdbd.py A sample implementation of an IR database daemon.
+ rpkid calls into this to perform lookups via the
+ left-right protocol.
+
+irbe-cli.py A command-line client for the left-right control
+ protocol.
+
+irbe-setup.py An example of a script to set up the mappings between
+ the IRDB and rpkid's own database, using the
+ left-right control protocol.
+
+cronjob.py A trivial HTTP client used to drive rpkid cron events.
+
+testbed.py A test tool for running a collection of rpkid and irdb
+ instances under common control, driven by a unified
+ test script.
+
+testpoke.py A simple client for the up-down protocol, mostly
+ compatable with APNIC's rpki_poke.pl tool.
+
+Most of these programs take configuration files in a common format
+similar to that used by the OpenSSL command line tool. The test
+programs also take input in YAML format to drive the tests. Runs of
+the testbed.py test tool will generate a fairly complete set
+configuration files which may be useful as examples.
+
+Basic operation consists of creating the appropriate MySQL databases,
+starting rpkid, rootd, and irdbd, using the left-right control
+protocol to set up rpkid's internal state, and setting up a cron job
+to invoke rpkid's cron action at regular intervals. All other
+operations should occur either as a result of cron events or as a
+result of incoming left-right and up-down protocol requests.
+
+Note that the publication protocol isn't fully specified yet, much
+less implmenented. At the moment rpkid just writes its outputs to a
+local directory tree.
+
+Note that the full event-driven model for rpkid hasn't yet been
+implemented. The design is intended to allow an arbitrary number of
+hosted RPKI engines to run in a single rpkid instance, but without the
+event-driven tasking model one has to set up a separate rpkid instance
+for each hosted RPKI engine.
+
+At present the daemon programs all run in foreground, that is, if one
+wants them to run in background one must do so manually, eg, using
+Bourne shell syntax:
+
+ $ python whatever.py &
+ $ echo >whatever.pid "$!"
+
+All of the daemons use syslog. At present they all set LOG_PERROR, so
+all logging also goes to stderr.
+
+----------------------------------------------------------------
+
+rpkid.py:
+
+rpkid is the main RPKI engine daemon. Configuration of rpkid is a two
+step process: a config file to bootstrap rpkid to the point where it
+can speak using the left-right protocol, followed by dynamic
+configuration via the left-right protocol. In production use the
+latter stage would be handled by the IRBE stub; for test and
+develoment purposes it's handled by the irbe-cli.py command line
+interface or by the testbed.py test framework.
+
+rpkid stores dynamic data in an SQL database, which must have been
+created for it, as explained in the installation guide.
+
+The default config file is rpkid.conf, start rpkid with "-c filename"
+to choose a different config file. All options are in the section
+"[rpkid]". Certificates, keys, and trust anchors may be in either DER
+or PEM format.
+
+Config file options:
+
+startup-message: String to log on startup, useful when
+ debugging a collection of rpkid instances at
+ once.
+
+sql-username: Username to hand to MySQL when connecting to
+ rpkid's database.
+
+sql-database: MySQL's database name for rpkid's database.
+
+sql-password: Password to hand to MySQL when connecting to
+ rpkid's database.
+
+cms-ta-irdb: Name of file containing CMS trust anchor to
+ use when authenticating messages from irdbd.
+
+cms-ta-irbe: Name of file containing CMS trust anchor to
+ use when authenticating control messages from
+ IRBE.
+
+cms-key: Name of file containing RSA key to use when
+ signing CMS messages to IRBE or irdbd.
+
+cms-certs: Name(s) of file(s) containing certificate(s)
+ to include in CMS wrapper when signing
+ messages to IRBE or irdbd. You can specify
+ more than one certificate using OpenSSL-style
+ subscripts: cms-certs.0, cms-certs.1, etc.
+
+https-key: Name of file containing RSA key to use, both
+ in the HTTPS server role (for both up-down and
+ left-right protocols) and in the HTTPS client
+ role (left-right protocol only).
+
+https-certs: Name(s) of file(s) containing certificate(s)
+ to use in same contexts where https-key is
+ used. You can specify more than one
+ certificate using OpenSSL-style subscripts:
+ https-certs.0, https-certs.1, etc.
+
+https-ta: Name of file containing trust anchor to use
+ when verifying irdbd's HTTPS server
+ certificate.
+
+irdb-url: Service URL for irdbd. Must be a https:// URL.
+
+https-server-host: Hostname or IP address on which to listen for
+ HTTPS connections. Current default is
+ INADDR_ANY (IPv4 0.0.0.0); this will need to
+ be hacked to support IPv6 for production.
+
+https-server-port: TCP port on which to listen for HTTPS
+ connections.
+
+publication-kludge-base: [TEMPORARY] Local directory under which
+ generated certificates etc should be
+ published. This is a temporary expedient
+ until the publication protocol is defined and
+ implemented. Default is "publication/"
+
+----------------------------------------------------------------
+
+rootd.py:
+
+rootd is a stripped down implmenetation of (only) the server side of
+the up-down protocol. It's a separate program because the root
+certificate of an RPKI certificate tree requires special handling and
+may also require a special handling policy. rootd is a simple
+implementation intended for test use, it's not suitable for use in a
+production system. All configuration comes via the config file.
+
+The default config file is rootd.conf, start rootd with "-c filename"
+to choose a different config file. All options are in the section
+"[rootd]". Certificates, keys, and trust anchors may be in either DER
+or PEM format.
+
+Config file options:
+
+cms-ta: Name of file containing trust anchor to use
+ when verifying CMS up-down queries.
+
+cms-key: Name of file containing RSA key to use when
+ signing CMS up-down replies.
+
+cms-certs: Name(s) of file(s) containing certificate(s)
+ to include in CMS wrapper when signing up-down
+ replies. You can specify more than one
+ certificate using OpenSSL-style subscripts:
+ cms-certs.0, cms-certs.1, etc.
+
+https-key: Name of file containing RSA key to use in the
+ HTTPS server role for the up-down protocol.
+
+https-certs: Name(s) of file(s) containing certificate(s)
+ to use in the HTTPS server role for the
+ up-down protocol. You can specify more than
+ one certificate using OpenSSL-style
+ subscripts: https-certs.0, https-certs.1,
+ etc.
+
+https-server-host: Hostname or IP address on which to listen for
+ HTTPS connections. Default is localhost.
+
+https-server-port: TCP port on which to listen for HTTPS
+ connections.
+
+rpki-key: Name of file containing RSA key to use in
+ signing resource certificates.
+
+rpki-issuer: Name of file containing self-signed root
+ resource certificate corresponding to
+ rpki-key.
+
+rpki-subject-filename: Name of file that rootd should use to save the
+ one and only certificate it issues.
+
+rpki-pkcs10-filename: Name of file that rootd should use when saving
+ a copy of the received PKCS #10 request for a
+ resource certificate. This is only used for
+ debugging. Default is not to save the PKCS
+ #10 request.
+
+----------------------------------------------------------------
+
+irdbd.py:
+
+irdbd is a sample implemntation of the server side of the IRDB
+callback subset of the left-right protocol. In production use this
+service is a function of the IRBE stub; irdbd may be suitable for
+production use in simple cases, but an IR with a complex IRDB may need
+to extend or rewrite irdbd.
+
+irdbd requires a pre-populated database to represent the IR's
+customers. irdbd expects this database to use the SQL schema defined
+in docs/sample-irdb.sql. Once this database has been populated, the
+IRBE stub needs to create the appropriate objects in rpkid's database
+via the control subset of the left-right protocol, and store the
+linkage IDs (foreign keys into rpkid's database, basicly) in the
+IRDB. The irbe-setup.py program shows an example of how to do this.
+
+irdbd's default config file is irdbd.conf, start irdbd with "-c
+filename" to choose a different config file. All options are in the
+section "[irdbd]". Certificates, keys, and trust anchors may be in
+either DER or PEM format.
+
+Config file options:
+
+startup-message: String to log on startup, useful when
+ debugging a collection of irdbd instances at
+ once.
+
+sql-username: Username to hand to MySQL when connecting to
+ irdbd's database.
+
+sql-database: MySQL's database name for irdbd's database.
+
+sql-password: Password to hand to MySQL when connecting to
+ irdbd's database.
+
+cms-ta: Name of file containing CMS trust anchor to
+ use when authenticating messages from rpkid.
+
+cms-key: Name of file containing RSA key to use when
+ signing CMS messages to rpkid.
+
+cms-certs: Name(s) of file(s) containing certificate(s)
+ to include in CMS wrapper when signing
+ messages to rpkid. You can specify more than
+ one certificate using OpenSSL-style
+ subscripts: cms-certs.0, cms-certs.1, etc.
+
+https-key: Name of file containing RSA key to use in the
+ HTTPS server role when listening for
+ connections from rpkid.
+
+https-certs: Name(s) of file(s) containing certificate(s)
+ to use in the HTTPS server role when listening
+ for connections from rpkid. You can specify
+ more than one certificate using OpenSSL-style
+ subscripts: https-certs.0, https-certs.1, etc.
+
+https-url: Service URL for irdbd. Must be a https:// URL.
+
+----------------------------------------------------------------
+
+irbe-cli.py:
+
+irbe-cli is a simple command line client for the control subset of the
+left-right protocol. In production use this functionality would be
+part of the IRBE stub.
+
+Basic configuration of irbe-cli is handled via a config file. The
+specific action or actions to be performed are specified on the
+command line, and map closely to the left-right protocol itself.
+
+At present the user is assumed to be able to read the (XML) left-right
+protocol messages, and with one exception, no attempt is made to
+interpret the responses other than to check for errors. The one
+exception is that, if the --pem_out option is specified on the command
+line, any PKCS #10 requests received from rpkid will be written in PEM
+format to that file; this makes it easier to hand these requests off
+to the business PKI in order to issue signing certs corresponding to
+newly generated business keys.
+
+Usage: irbe-cli.py --config= --help --pem_out=
+
+ parent --action= --type= --tag= --self_id= --parent_id=
+ --bsc_id= --repository_id= --peer_contact_uri=
+ --sia_base= --sender_name= --recipient_name=
+ --cms_ta= --https_ta= --rekey --reissue --revoke
+
+ repository --action= --type= --tag= --self_id= --repository_id=
+ --bsc_id= --peer_contact_uri= --cms_ta= --https_ta=
+
+ self --action= --type= --tag= --self_id= --crl_interval=
+ --extension_preference= --rekey --reissue --revoke
+ --run_now --publish_world_now
+ --clear_extension_preferences
+
+ child --action= --type= --tag= --self_id= --child_id=
+ --bsc_id= --cms_ta= --reissue
+
+ route_origin --action= --type= --tag= --self_id= --route_origin_id=
+ --as_number= --ipv4= --ipv6= --suppress_publication
+
+ bsc --action= --type= --tag= --self_id= --bsc_id=
+ --key_type= --hash_alg= --key_length= --signing_cert=
+ --generate_keypair --clear_signing_certs
+
+Global options (--config, --help, --pem_out) come first, then zero or
+more commands (parent, repository, self, child, route_origin, bsc),
+each followed by its own set of options. The commands map to
+elements in the left-right protocol, and the command-specific options
+map to attributes or subelements for those commands.
+
+--action is one of create, set, get, list, or destroy; exactly one of
+these must be specified for each command.
+
+--type is query or reply; since irbe-cli is a client, query is the
+default.
+
+--tag is an optional arbitrary tag (think IMAP) to simplify matching
+up replies with batched queries.
+
+--*_id options refer to the primary keys of previously created
+objects.
+
+The remaining options are specific to the particular commands, and
+follow directly from the left-right protocol specification.
+
+A trailing "=" in the above option summary indicates that an option
+takes a value, eg, "--action create" or "--action=create". Options
+without a trailing "=" correspond to boolean control attributes.
+
+The default config file for irbe-cli is irbe.conf, start rpkid with
+"-c filename" (or "--config filename") to choose a different config
+file. All options are in the section "[irbe-cli]". Certificates,
+keys, and trust anchors may be in either DER or PEM format.
+
+Config file options:
+
+cms-ta: Name of file containing CMS trust anchor to
+ use when authenticating messages from rpkid.
+
+cms-key: Name of file containing RSA key to use when
+ signing CMS messages to rpkid.
+
+cms-certs: Name(s) of file(s) containing certificate(s)
+ to include in CMS wrapper when signing
+ messages to rpkid. You can specify more than
+ one certificate using OpenSSL-style
+ subscripts: cms-certs.0, cms-certs.1, etc.
+
+https-key: Name of file containing RSA key to use in the
+ HTTPS client role when contacting rpkid.
+
+https-certs: Name(s) of file(s) containing certificate(s)
+ to use in the HTTPS client role when
+ contacting rpkid. You can specify more than
+ one certificate using OpenSSL-style
+ subscripts: https-certs.0, https-certs.1,
+ etc.
+
+https-ta: Name of file containing trust anchor to use
+ when verifying rpkid's HTTPS server
+ certificate.
+
+https-url: Service URL for rpkid. Must be a https:// URL.
+
+----------------------------------------------------------------
+
+irbe-setup.py config file:
+
+The default config file is irbe.conf, start rpkid with "-c filename"
+to choose a different config file. Most options are in the section
+"[irbe-cli]", but a few are in the section "[irdbd]". Certificates,
+keys, and trust anchors may be in either DER or PEM format.
+
+Options in the "[irbe-cli]" section:
+
+cms-ta: Name of file containing CMS trust anchor to
+ use when authenticating messages from rpkid.
+
+cms-key: Name of file containing RSA key to use when
+ signing CMS messages to rpkid.
+
+cms-certs: Name(s) of file(s) containing certificate(s)
+ to include in CMS wrapper when signing
+ messages to rpkid. You can specify more than
+ one certificate using OpenSSL-style
+ subscripts: cms-certs.0, cms-certs.1, etc.
+
+https-key: Name of file containing RSA key to use in the
+ HTTPS client role when contacting rpkid.
+
+https-certs: Name(s) of file(s) containing certificate(s)
+ to use in the HTTPS client role when
+ contacting rpkid. You can specify more than
+ one certificate using OpenSSL-style
+ subscripts: https-certs.0, https-certs.1,
+ etc.
+
+https-ta: Name of file containing trust anchor to use
+ when verifying rpkid's HTTPS server
+ certificate.
+
+https-url: Service URL for rpkid. Must be a https:// URL.
+
+Options in the "[irdbd]" section:
+
+sql-username: Username to hand to MySQL when connecting to
+ irdbd's database.
+
+sql-database: MySQL's database name for irdbd's database.
+
+sql-password: Password to hand to MySQL when connecting to
+ irdbd's database.
+
+----------------------------------------------------------------
+
+cronjob.py:
+
+This is a trivial program to trigger a cron run within rpkid. Once
+rpkid has been converted to the planned event-driven model, this
+function will be handled internally, but for now it has to be
+triggered by an external program. For pseudo-production use one would
+run this program under the system cron daemon. For scripted testing
+it happens to be useful to be able to control when cron cycles occur,
+so at the current stage of code development use of an external trigger
+is a useful feature.
+
+The default config file is cronjob.conf, start cronjob with "-c
+filename" to choose a different config file. All options are in the
+section "[cronjob]". Certificates, keys, and trust anchors may be in
+either DER or PEM format.
+
+Config file options:
+
+https-key: Name of file containing RSA key to use in the
+ HTTPS client role when contacting rpkid.
+
+https-certs: Name(s) of file(s) containing certificate(s)
+ to use in the HTTPS client role when
+ contacting rpkid. You can specify more than
+ one certificate using OpenSSL-style
+ subscripts: https-certs.0, https-certs.1,
+ etc.
+
+https-ta: Name of file containing trust anchor to use
+ when verifying rpkid's HTTPS server
+ certificate.
+
+https-url: Service URL for rpkid. Must be a https:// URL.
+
+----------------------------------------------------------------
+
+testbed.py:
+
+testbed is a test harness to set up and run a collection of rpkid and
+irdbd instances under scripted control. testbed is a very recent
+addition to the toolset and is still evolving rapidly.
+
+Unlike the programs described above, testbed takes two configuration
+files in different languages. The first configuration file uses the
+same syntax as the above configuration files but is completely
+optional. The second configuration file is the test script, which is
+encoded using the YAML serialization language (see
+http://www.yaml.org/ for more information on YAML). The YAML script
+is not optional, as it describes the test layout. testbed is designed
+to support running a fairly wide set of test configurations as canned
+scripts without writing any new control code. The intent is to make
+it possible to write meaningful regression tests.
+
+All of the options in in the first (optional) configuration file are
+just overrides for wired-in default values. In most cases the
+defaults will suffice, and the set of options is still in flux, so
+only a few of the options are described here. The default name for
+this configuration file is testbed.conf, run testbed with "-c
+filename" to change it.
+
+testbed.conf options:
+
+testbed_dir: Working directory into which testbed should write the
+ (many) files it generates. Default is "testbed.dir".
+
+irdb_db_pass: MySQL password for the "irdb" user. Default is
+ "fnord". You may want to override this.
+
+rpki_db_pass: MySQL password for the "rpki" user. Default is
+ "fnord". You may want to override this.
+
+rootd_sia: rsync URI naming a (perhaps fictious) directory to use
+ as the id-ad-caRepository SIA value in the generated
+ root resource certificate. Default is
+ "rsync://wombat.invalid/". You may want to override
+ this if you intend to run an rsync server and test
+ against the generated results using rcynic. This
+ default will likely change if and when testbed learns
+ how to run rcynic itself as part of the test suite.
+
+The second configuration file is named testbed.yaml by default, run
+testbed with "-y filename" to change it. The YAML file contains
+multiple YAML "documents". The first document describes the initial
+test layout and resource allocations, subsequent documents describe
+modifications to the initial allocations and other parameters.
+Resources listed in the initial layout are aggregated automatically,
+so that a node in the resource hierarchy automatically receives the
+resources it needs to issue whatever its children are listed as
+holding. Actions in the subsequent documents are modifications to the
+current resource set, modifications to validity dates or other
+non-resource parameters, or special commands like "sleep". The
+details are still evolving, but here's an example of current usage:
+
+ name: RIR
+ #valid_until: 2008-07-14T12:30:00Z
+ valid_for: 2d
+ sia_base: "rsync://wombat.invalid/"
+ kids:
+ - name: LIR0
+ kids:
+ - name: Alice
+ ipv4: 192.0.2.1-192.0.2.33
+ asn: 64533
+ ---
+ - name: Alice
+ valid_add: 10
+ ---
+ - name: Alice
+ add_as: 33
+ valid_add: 2d
+ # valid_until: 2009-07-14T12:30:00Z
+ ---
+ - name: Alice
+ # valid_until: 2009-04-01T00:00:00Z
+ valid_sub: 2d
+ ---
+ - name: Alice
+ # valid_until: 2009-04-01T00:00:00Z
+ valid_for: 10d
+
+This specifies an initial layout consisting of an RPKI engine named
+"RIR", with one child "LIR0", which in turn has one child "Alice".
+Alice has a set of assigned resources, and all resources in the system
+are initially set to be valid for two days from the time at which the
+test is started. The first subsequent document adds ten seconds to
+the validity interval for Alice's resources and makes no other
+modifications. The second subsequent document grants Alice additional
+resources and adds another two days to the validity interval for
+Alice's resources. The next document subtracts two days from the
+validity interval for Alice's resources. The final document sets the
+validity interval for Alice's resources to ten days.
+
+Operators in subsequent (update) documents:
+
+ add_as, add_v4, add_v6: These add ASN, IPv4, or IPv6
+ resources, respectively.
+
+ sub_as, sub_v4, sub_v6: These subtract resources.
+
+ valid_until: Set an absolute expiration date.
+
+ valid_for: Set a relative expiration date.
+
+ valid_add, valid_sub: Add to or subtract from validity interval.
+
+ sleep [interval]: Sleep for specified interval, or until
+ testbed receives a SIGALRM signal.
+
+Absolute timestamps should be in the form shown (UTC timestamp format
+as used in XML).
+
+Intervals (valid_add, valid_sub, valid_for, sleep) are either
+integers, in which case they're interpreted as seconds, or are a
+string of the form "wD xH yM zS" where w, x, y, and z are integers and
+D, H, M, and S indicate days, hours, minutes, and seconds. In the
+latter case all of the fields are optional, but at least one must be
+specified. For example, "3D4H" means "three days plus four hours".
+
+----------------------------------------------------------------
+
+testpoke.py:
+
+This is a command-line client for the up-down protocol. Unlike all of
+the above programs, testpoke does not accept a config file in
+OpenSSL-compatable format at all. Instead, it is configured
+exclusively by a YAML script. testpoke's design was constrained by a
+desire to have it be compatable with APNIC's rpki_poke.pl tool, so
+that the two tools could use a common configuration language to
+simplify scripted testing. There are minor variations due to slightly
+different feature sets, but YAML files intended for one program will
+usually work with the other.
+
+README for APNIC's tool describing the input language can be found at
+http://mirin.apnic.net/svn/rpki_engine/branches/gary-poker/client/poke/README
+
+testpoke.py takes a simplified command line and uses only one YAML
+input file.
+
+Usage: python testpoke.py [ { -y | --yaml } configfile ]
+ [ { -r | --request } requestname ]
+ [ { -h | --help } ]
+
+Default configuration file is testpoke.yaml, override with --yaml
+option.
+
+The --request option specifies the specific command within the YAML
+file to execute.
+
+Sample configuration file:
+
+ ---
+ # $Id$
+
+ version: 1
+ posturl: https://localhost:4433/up-down/1
+ recipient-id: wombat
+ sender-id: "1"
+
+ cms-cert-file: biz-certs/Frank-EE.cer
+ cms-key-file: biz-certs/Frank-EE.key
+ cms-ca-cert-file: biz-certs/Bob-Root.cer
+ cms-cert-chain-file: [ biz-certs/Frank-CA.cer ]
+
+ ssl-cert-file: biz-certs/Frank-EE.cer
+ ssl-key-file: biz-certs/Frank-EE.key
+ ssl-ca-cert-file: biz-certs/Bob-Root.cer
+
+ requests:
+ list:
+ type: list
+ issue:
+ type: issue
+ class: 1
+ sia: [ "rsync://bandicoot.invalid/some/where/" ]
+ revoke:
+ type: revoke
+ class: 1
+ ski: "CB5K6APY-4KcGAW9jaK_cVPXKX0"
+
+testpoke adds one extension to the language described in APNIC's
+README: the cms-cert-chain-* and ssl-cert-chain-* options, which allow
+one to specify a chain of intermediate certificates to be presented in
+the CMS or TLS protocol. APNIC's initial implementation required
+direct knowledge of the issuing certificate (ie, it supported a
+maximum chain length of one); subsequent APNIC code changes have
+probably relaxed this restriction, and with luck APNIC has copied
+testpoke's syntax to express chains of intermediate certificates.