aboutsummaryrefslogtreecommitdiff
path: root/presentations
diff options
context:
space:
mode:
Diffstat (limited to 'presentations')
-rw-r--r--presentations/Makefile15
-rw-r--r--presentations/README27
-rw-r--r--presentations/bpki-asymmetric.dot84
-rw-r--r--presentations/bpki-asymmetric.pdfbin0 -> 5811 bytes
-rw-r--r--presentations/bpki-symmetric.dot74
-rw-r--r--presentations/bpki-symmetric.pdfbin0 -> 5392 bytes
-rw-r--r--presentations/bpki.pdfbin0 -> 47594 bytes
-rw-r--r--presentations/bpki.tex80
-rw-r--r--presentations/entity-decompose.pdfbin0 -> 62467 bytes
-rw-r--r--presentations/images/prague-whiteboard-2007-03-21-02-29-14.jpgbin0 -> 343410 bytes
-rw-r--r--presentations/images/prague-whiteboard-2007-03-22-21-50-26.jpgbin0 -> 306385 bytes
-rw-r--r--presentations/images/prague-whiteboard-2007-03-22-23-15-01.jpgbin0 -> 339641 bytes
-rw-r--r--presentations/images/repository-structure.dot42
-rw-r--r--presentations/images/repository-structure.pdfbin0 -> 2828 bytes
-rw-r--r--presentations/images/whiteboard-object-model.dot65
-rw-r--r--presentations/images/whiteboard-object-model.pdfbin0 -> 3259 bytes
-rw-r--r--presentations/presentations/070523.lacnic-pki.pdfbin0 -> 150702 bytes
-rw-r--r--presentations/repository-engine-objects.dot86
-rw-r--r--presentations/repository-engine-objects.pdfbin0 -> 3971 bytes
-rw-r--r--presentations/repository-structure.txt111
-rw-r--r--presentations/sample-irdb-data.sql80
-rw-r--r--presentations/signed-manifests74
-rw-r--r--presentations/up-down-protocol8
23 files changed, 746 insertions, 0 deletions
diff --git a/presentations/Makefile b/presentations/Makefile
new file mode 100644
index 00000000..a568b5e4
--- /dev/null
+++ b/presentations/Makefile
@@ -0,0 +1,15 @@
+# $Id$
+
+all: repository-engine-objects.pdf bpki.pdf
+
+bpki.pdf: bpki-symmetric.pdf bpki-asymmetric.pdf
+
+.SUFFIXES: .pdf .dot .tex
+
+.dot.pdf:
+ dot -Tps2 $< | ps2pdf - $@
+
+.tex.pdf:
+ pdflatex $<
+ pdflatex $<
+ rm -f $*.log $*.aux
diff --git a/presentations/README b/presentations/README
new file mode 100644
index 00000000..26bc0688
--- /dev/null
+++ b/presentations/README
@@ -0,0 +1,27 @@
+$Id$
+
+Ok, there's getting to be enough stuff in this directory to be
+confusing.
+
+README This file
+
+entity-decompose.pdf An overview presentation
+
+images Some old pictures
+
+left-right-protocol Pseudo-code for left-right protocol
+
+left-right-xml XML samples of left-right protocol
+
+presentations More presentations
+
+publication-protocol Pseudo-code for publication protocol
+
+repository-engine-objects.dot Objects in the RPKI engine (PDF)
+repository-engine-objects.pdf Graphviz source for "
+
+repository-structure.txt Old notes on repository structure
+
+signed-manifests ASN.1 for signed manifests
+
+up-down-protocol Pointer to up-down protocol specification
diff --git a/presentations/bpki-asymmetric.dot b/presentations/bpki-asymmetric.dot
new file mode 100644
index 00000000..739cd6ee
--- /dev/null
+++ b/presentations/bpki-asymmetric.dot
@@ -0,0 +1,84 @@
+// $Id$
+//
+// Color code:
+// Black: Hosting entity
+// Blue: Hosted entity
+// Red: Cross-certified peer
+//
+// Shape code:
+// Octagon: TA
+// Diamond: CA
+// Record: EE
+
+digraph bpki_asymmetric {
+ rotate = 90; size = "11,8.5"; splines = true; ratio = fill;
+
+ // Hosting entity
+ node [ color = black, shape = record ];
+ TA [ shape = octagon ];
+ rpkid [ label = "rpkid|{HTTPS server|HTTPS left-right client|CMS left-right}" ];
+ irdbd [ label = "irdbd|{HTTPS left-right server|CMS left-right}" ];
+ irbe [ label = "IRBE|{HTTPS left-right client|CMS left-right}" ];
+
+ // Hosted entities
+ node [ color = blue, fontcolor = blue ];
+ Alice_CA [ shape = diamond ];
+ Ellen_CA [ shape = diamond ];
+
+ // Peers
+ node [ color = red, fontcolor = red, shape = diamond ];
+ Bob_CA;
+ Carol_CA;
+ Dave_CA;
+ Frank_CA;
+ Ginny_CA;
+ Harry_CA;
+
+ // EE certs issued to us by peers
+ node [ color = red, fontcolor = red, shape = record ];
+ Alice_Bob_EE [ label = "Alice-Bob\nBSC EE|{HTTPS up-down client|CMS up-down}" ];
+ Alice_Carol_EE [ label = "Alice-Carol\nBSC EE|{HTTPS up-down client|CMS up-down}" ];
+ Alice_Dave_EE [ label = "Alice-Dave\nBSC EE|{HTTPS up-down client|CMS up-down}" ];
+ Ellen_Frank_EE [ label = "Ellen-Frank\nBSC EE|{HTTPS up-down client|CMS up-down}" ];
+ Ellen_Ginny_EE [ label = "Ellen-Ginny\nBSC EE|{HTTPS up-down client|CMS up-down}" ];
+ Ellen_Harry_EE [ label = "Ellen-Harry\nBSC EE|{HTTPS up-down client|CMS up-down}" ];
+ Bob_EE [ label = "Bob\nEE|{HTTPS up-down|CMS up-down}" ];
+ Carol_EE [ label = "Carol\nEE|{HTTPS up-down|CMS up-down}" ];
+ Dave_EE [ label = "Dave\nEE|{HTTPS up-down|CMS up-down}" ];
+ Frank_EE [ label = "Frank\nEE|{HTTPS up-down|CMS up-down}" ];
+ Ginny_EE [ label = "Ginny\nEE|{HTTPS up-down|CMS up-down}" ];
+ Harry_EE [ label = "Bob\nEE|{HTTPS up-down|CMS up-down}" ];
+
+ edge [ color = black, style = solid ];
+ TA -> Alice_CA;
+ TA -> Ellen_CA;
+
+ edge [ color = black, style = dotted ];
+ TA -> rpkid;
+ TA -> irdbd;
+ TA -> irbe;
+
+ edge [ color = blue, style = solid ];
+ Alice_CA -> Bob_CA;
+ Alice_CA -> Carol_CA;
+ Alice_CA -> Dave_CA;
+ Ellen_CA -> Frank_CA;
+ Ellen_CA -> Ginny_CA;
+ Ellen_CA -> Harry_CA;
+
+ edge [ color = red, style = dotted ];
+ Bob_CA -> Alice_Bob_EE;
+ Carol_CA -> Alice_Carol_EE;
+ Dave_CA -> Alice_Dave_EE;
+ Frank_CA -> Ellen_Frank_EE;
+ Ginny_CA -> Ellen_Ginny_EE;
+ Harry_CA -> Ellen_Harry_EE;
+
+ edge [ color = red, style = solid ];
+ Bob_CA -> Bob_EE;
+ Carol_CA -> Carol_EE;
+ Dave_CA -> Dave_EE;
+ Frank_CA -> Frank_EE;
+ Ginny_CA -> Ginny_EE;
+ Harry_CA -> Harry_EE;
+}
diff --git a/presentations/bpki-asymmetric.pdf b/presentations/bpki-asymmetric.pdf
new file mode 100644
index 00000000..fbd0362d
--- /dev/null
+++ b/presentations/bpki-asymmetric.pdf
Binary files differ
diff --git a/presentations/bpki-symmetric.dot b/presentations/bpki-symmetric.dot
new file mode 100644
index 00000000..48e89483
--- /dev/null
+++ b/presentations/bpki-symmetric.dot
@@ -0,0 +1,74 @@
+// $Id$
+//
+// Color code:
+// Black: Hosting entity
+// Blue: Hosted entity
+// Red: Cross-certified peer
+//
+// Shape code:
+// Octagon: TA
+// Diamond: CA
+// Record: EE
+
+digraph bpki_symmetric {
+ rotate = 90; size = "11,8.5"; splines = true; ratio = fill;
+
+ // Hosting entity
+ node [ color = black, shape = record ];
+ TA [ shape = octagon ];
+ rpkid [ label = "rpkid|{HTTPS server|HTTPS left-right client|CMS left-right}" ];
+ irdbd [ label = "irdbd|{HTTPS left-right server|CMS left-right}" ];
+ irbe [ label = "IRBE|{HTTPS left-right client|CMS left-right}" ];
+
+ // Hosted entities
+ node [ color = blue, fontcolor = blue ];
+ Alice_CA [ shape = diamond ];
+ Alice_EE [ label = "Alice\nBSC EE|{HTTPS up-down client|CMS up-down}" ];
+ Ellen_CA [ shape = diamond ];
+ Ellen_EE [ label = "Ellen\nBSC EE|{HTTPS up-down client|CMS up-down}" ];
+
+ // Peers
+ node [ color = red, fontcolor = red, shape = diamond ];
+ Bob_CA;
+ Carol_CA;
+ Dave_CA;
+ Frank_CA;
+ Ginny_CA;
+ Harry_CA;
+ node [ shape = record ];
+ Bob_EE [ label = "Bob\nEE|{HTTPS up-down|CMS up-down}" ];
+ Carol_EE [ label = "Carol\nEE|{HTTPS up-down|CMS up-down}" ];
+ Dave_EE [ label = "Dave\nEE|{HTTPS up-down|CMS up-down}" ];
+ Frank_EE [ label = "Frank\nEE|{HTTPS up-down|CMS up-down}" ];
+ Ginny_EE [ label = "Ginny\nEE|{HTTPS up-down|CMS up-down}" ];
+ Harry_EE [ label = "Bob\nEE|{HTTPS up-down|CMS up-down}" ];
+
+ edge [ color = black, style = solid ];
+ TA -> Alice_CA;
+ TA -> Ellen_CA;
+
+ edge [ color = black, style = dotted ];
+ TA -> rpkid;
+ TA -> irdbd;
+ TA -> irbe;
+
+ edge [ color = blue, style = solid ];
+ Alice_CA -> Bob_CA;
+ Alice_CA -> Carol_CA;
+ Alice_CA -> Dave_CA;
+ Ellen_CA -> Frank_CA;
+ Ellen_CA -> Ginny_CA;
+ Ellen_CA -> Harry_CA;
+
+ edge [ color = blue, style = dotted ];
+ Alice_CA -> Alice_EE;
+ Ellen_CA -> Ellen_EE;
+
+ edge [ color = red, style = solid ];
+ Bob_CA -> Bob_EE;
+ Carol_CA -> Carol_EE;
+ Dave_CA -> Dave_EE;
+ Frank_CA -> Frank_EE;
+ Ginny_CA -> Ginny_EE;
+ Harry_CA -> Harry_EE;
+}
diff --git a/presentations/bpki-symmetric.pdf b/presentations/bpki-symmetric.pdf
new file mode 100644
index 00000000..9db46451
--- /dev/null
+++ b/presentations/bpki-symmetric.pdf
Binary files differ
diff --git a/presentations/bpki.pdf b/presentations/bpki.pdf
new file mode 100644
index 00000000..979c1380
--- /dev/null
+++ b/presentations/bpki.pdf
Binary files differ
diff --git a/presentations/bpki.tex b/presentations/bpki.tex
new file mode 100644
index 00000000..c07c6534
--- /dev/null
+++ b/presentations/bpki.tex
@@ -0,0 +1,80 @@
+% $Id$
+%
+\documentclass[11pt]{article}
+\usepackage[pdftex]{graphicx}
+\usepackage{palatino}
+\usepackage{color}
+\DeclareGraphicsExtensions{.pdf}
+\setlength{\topmargin}{0in}
+\setlength{\headheight}{0in}
+\setlength{\headsep}{0in}
+\setlength{\oddsidemargin}{0in}
+\setlength{\evensidemargin}{0in}
+\setlength{\textheight}{9in}
+\setlength{\textwidth}{6.5in}
+\setlength{\parskip}{2ex}
+\setlength{\parindent}{0in}
+\hyphenpenalty=5000
+\tolerance=1000
+\hbadness=9999
+\sloppy
+\pagestyle{plain}
+%
+\begin{document}
+
+\section*{Implementation experience with the two BPKI models}
+
+Having recently converted my code base to the single-trust-anchor
+model Russ recommended, I thought it might be useful to share what
+I've learned. This may not apply to all implementations, but it does
+apply to mine, and given what I understand of RIPE's business model,
+it will probably apply to RIPE's implementation as well.
+
+In spite of a strong desire to do so, I was not able to use exactly
+the same BPKI keys and certificates for HTTPS and CMS. The reason for
+this is simple: each hosted entity in my engine has its own BPKI, as
+does the hosting entity, but the HTTPS listener is shared. The only
+ways I know of to avoid this would be to use separate listeners for
+each hosted entity, which scales poorly, or to rely on the TLS
+``Server Name Indication'' extension (RFC 4366 3.1) which is not yet
+widely implemented.
+
+\begin{figure}[hbp]
+\includegraphics[width = 6.5in]{bpki-symmetric}
+\caption{Symmetric BPKI model}
+\label{bpki-symmetric}
+\end{figure}
+
+Figure \ref{bpki-symmetric} shows my engine's view of the BPKI tree in
+the symmetric model. Black objects belong to the hosting entity, blue
+objects belong to the hosted entities, red objects are cross-certified
+objects from peers. The arrows indicate certificate issuance: solid
+arrows are the ones that my own RPKI engine will care about during
+certificate validation, dotted arrows show the origin of EE
+certificates my engine uses to sign things. ``BSC'' stands for
+``business signing context,'' which is a database object in my
+implementation representing the context needed to sign a CMS message
+or TLS session.
+
+Other than the above-mentioned annoyance with the HTTPS server
+certificate, the ``symmetric'' BPKI model worked out pretty much as
+expected here. The certificate tree looks complicated, but the set of
+certificates needed to build a particular validation chain is obvious,
+again excepting the HTTPS server case, where client certificate is the
+first hint that the engine has of the client's identity, so the server
+must be prepared to accept any current client certificate.
+
+\begin{figure}[hbp]
+\includegraphics[width = 6.5in]{bpki-asymmetric}
+\caption{Asymmetric BPKI model}
+\label{bpki-asymmetric}
+\end{figure}
+
+Figure \ref{bpki-asymmetric} shows my engine's view of the BPKI tree
+in the asymmetric model. Note that not much has changed here from the
+symmetric case. As far as I can tell, the asymmetric model is just as
+complex for my engine as the symmetric model; the only real difference
+is that the engine has to keep track of a larger number of BSC EE
+certificates in the asymmetric case.
+
+\end{document}
diff --git a/presentations/entity-decompose.pdf b/presentations/entity-decompose.pdf
new file mode 100644
index 00000000..afde3c27
--- /dev/null
+++ b/presentations/entity-decompose.pdf
Binary files differ
diff --git a/presentations/images/prague-whiteboard-2007-03-21-02-29-14.jpg b/presentations/images/prague-whiteboard-2007-03-21-02-29-14.jpg
new file mode 100644
index 00000000..79c0a807
--- /dev/null
+++ b/presentations/images/prague-whiteboard-2007-03-21-02-29-14.jpg
Binary files differ
diff --git a/presentations/images/prague-whiteboard-2007-03-22-21-50-26.jpg b/presentations/images/prague-whiteboard-2007-03-22-21-50-26.jpg
new file mode 100644
index 00000000..4c3c828d
--- /dev/null
+++ b/presentations/images/prague-whiteboard-2007-03-22-21-50-26.jpg
Binary files differ
diff --git a/presentations/images/prague-whiteboard-2007-03-22-23-15-01.jpg b/presentations/images/prague-whiteboard-2007-03-22-23-15-01.jpg
new file mode 100644
index 00000000..7b973ab0
--- /dev/null
+++ b/presentations/images/prague-whiteboard-2007-03-22-23-15-01.jpg
Binary files differ
diff --git a/presentations/images/repository-structure.dot b/presentations/images/repository-structure.dot
new file mode 100644
index 00000000..7154202d
--- /dev/null
+++ b/presentations/images/repository-structure.dot
@@ -0,0 +1,42 @@
+// $URL$
+// $Id$
+//
+// Pictures to go with repository-structure.txt. First picture is rekeying b with
+// a g(ski)/g(ski)/g(ski).cer model, second is with stable meaningless identifiers.
+
+graph rekeying_ski {
+ rotate=90; size="11,8.5"; splines=true; ratio=fill;
+ node [ shape=box ];
+ a [ color=black, label="rsync://host/foo/g(ski(a)).cer" ]
+ b [ color=red, label="rsync://host/foo/g(ski(a))/g(ski(b)).cer" ]
+ c [ color=red, label="rsync://host/foo/g(ski(a))/g(ski(b))/g(ski(c)).cer" ]
+ d [ color=red, label="rsync://host/foo/g(ski(a))/g(ski(b))/g(ski(c))/g(ski(d)).cer" ]
+ a -- b [ color=red ];
+ b -- c [ color=red ];
+ c -- d [ color=red ];
+ b_ [ color=green, label="rsync://host/foo/g(ski(a))/g(ski(b')).cer" ]
+ c_ [ color=green, label="rsync://host/foo/g(ski(a))/g(ski(b'))/g(ski(c)).cer" ]
+ d_ [ color=green, label="rsync://host/foo/g(ski(a))/g(ski(b'))/g(ski(c))/g(ski(d)).cer" ]
+ a -- b_ [ color=green ];
+ b_ -- c_ [ color=green ];
+ c_ -- d_ [ color=green ];
+}
+
+graph rekeying_gensym {
+ rotate=90; size="11,8.5"; splines=true; ratio=fill;
+ node [ shape=box ];
+ a [ color=black, label="rsync://host/foo/g(ski(a)).cer" ]
+ b [ color=red, label="rsync://host/foo/G001/g(ski(b)).cer" ]
+ c [ color=black, label="rsync://host/foo/G001/G002/g(ski(c)).cer" ]
+ d [ color=black, label="rsync://host/foo/G001/G002/G003/g(ski(d)).cer" ]
+ a -- b [ color=red ];
+ b -- c [ color=red ];
+ c -- d [ color=black ];
+ b_ [ color=green, label="rsync://host/foo/G001/g(ski(b')).cer" ]
+ a -- b_ [ color=green ];
+ b_ -- c [ color=green ];
+}
+
+// Local Variables:
+// compile-command: "dot -Tps2 repository-structure.dot | ps2pdf - repository-structure.pdf"
+// End:
diff --git a/presentations/images/repository-structure.pdf b/presentations/images/repository-structure.pdf
new file mode 100644
index 00000000..0fcc7615
--- /dev/null
+++ b/presentations/images/repository-structure.pdf
Binary files differ
diff --git a/presentations/images/whiteboard-object-model.dot b/presentations/images/whiteboard-object-model.dot
new file mode 100644
index 00000000..3c61f3ab
--- /dev/null
+++ b/presentations/images/whiteboard-object-model.dot
@@ -0,0 +1,65 @@
+// $URL$
+// $Id$
+
+// This is an attempt to capture
+// http://subvert-rpki.hactrn.net/docs/prague-whiteboard-2007-03-22-23:15:01.jpg
+
+// {arrowhead,arrowtail} shapes to use for database object relationships:
+// 1- none
+// m- crow
+// Color code:
+// Blue: visible in left-right protocol
+// Green: created on the fly
+
+// Explanation for many-many mapping beween CA and child objects
+// (courtesy of RobL): Each child is an entity; each CA can have
+// multiple children, and each child can hold certs from multiple CAs.
+
+digraph rpki_engine_objects {
+ rotate=90; size="11,8.5"; splines=true; ratio=fill;
+ node [ shape=record ];
+
+ // Objects visible in left-to-right protocol
+ node [ color=blue ];
+ self [ label="Self|{Preferences}" ];
+ parent [ label="Parent|{URI|TA}" ];
+ repo [ label="Repository|{URI|TA}" ];
+ child [ label="Child|{TA}" ];
+ biz_sign [ label="Business\nSigning Context|{Keypair|CertChain}" ];
+
+ // Objects created on the fly by the RPKI engine
+ node [ color=green ];
+ ca [ label="CA|{CRL #|Last Issued Serial #}" ];
+ child_cert [ label="Child Certificate" ];
+ ee_cert [ label="EE Certificate|{ROA}" ];
+ ca_key_pair [ label="CA Key Pair|{Latest CA Certificate|Latest CRL}" ];
+
+ // One-many mappings
+ edge [ color=blue, arrowtail=none, arrowhead=crow ];
+ biz_sign -> child;
+ biz_sign -> parent;
+ biz_sign -> repo;
+ self -> child;
+ self -> parent;
+ repo -> parent;
+
+ // Many-many mappings
+ edge [ color=green, arrowtail=crow, arrowhead=crow ];
+ ca -> child;
+
+ // One-many mappings
+ edge [ color=green, arrowtail=none, arrowhead=crow ];
+ ca -> ca_key_pair;
+ child -> child_cert;
+ self -> ca;
+ parent -> ca;
+
+ // Weird one-many
+ edge [ color=green, arrowtail=none, arrowhead=crow, style=dashed ];
+ ca_key_pair -> child_cert;
+ ca_key_pair -> ee_cert;
+}
+
+// Local Variables:
+// compile-command: "neato -Tps2 whiteboard-object-model.dot | ps2pdf - whiteboard-object-model.pdf"
+// End:
diff --git a/presentations/images/whiteboard-object-model.pdf b/presentations/images/whiteboard-object-model.pdf
new file mode 100644
index 00000000..9b7da850
--- /dev/null
+++ b/presentations/images/whiteboard-object-model.pdf
Binary files differ
diff --git a/presentations/presentations/070523.lacnic-pki.pdf b/presentations/presentations/070523.lacnic-pki.pdf
new file mode 100644
index 00000000..5ab83fa3
--- /dev/null
+++ b/presentations/presentations/070523.lacnic-pki.pdf
Binary files differ
diff --git a/presentations/repository-engine-objects.dot b/presentations/repository-engine-objects.dot
new file mode 100644
index 00000000..24abc8dd
--- /dev/null
+++ b/presentations/repository-engine-objects.dot
@@ -0,0 +1,86 @@
+// $URL$
+// $Id$
+//
+// {arrowhead,arrowtail} shapes indicate database object relationships:
+// 1- none
+// m- crow
+//
+// Color code:
+// Blue: visible in left-right protocol
+// Green: created on the fly
+
+digraph rpki_engine_objects {
+ rotate=90; size="11,8.5"; splines=true; ratio=fill;
+ node [ shape=record ];
+
+ // Objects visible in left-to-right protocol
+ node [ color=blue ];
+ self [ label="Self|{Preferences}" ];
+ parent [ label="Parent|{URI|TA|SIA Base}" ];
+ repo [ label="Repository|{URI|TA}" ];
+ child [ label="Child|{TA}" ];
+ biz_sign [ label="Business\nSigning Context|{Keypair|CertChain}" ];
+ route_origin [ label="Route\nOrigin|{AS Number}" ];
+
+ // Objects which left-right protocol sees as part of other
+ // objects but which SQL needs to be separate for
+ // normalization.
+
+ addr_set [ label="Address\nPrefix", color=purple ];
+
+ // Objects created on the fly by the RPKI engine
+ node [ color=green ];
+ ca [ label="CA|{Last CRL #|Next CRL Date|Last Issued Serial #|Last Manifest #|Next Manifest Date|SIA URI}" ];
+ ca_detail [ label="CA Detail|{CA Private Key Handle|CA Public Key|Latest CA Certificate|Manifest EE Private Key Handle|Manifest EE Public Key|Latest Manifest EE Certificate|Latest Manifest|Latest CRL}" ];
+
+ // Some question whether these objects need to be in database
+ // per se or are just properties hanging on some other object
+ // like ca or ca_detail. For manifests, we need last serial,
+ // same as for CRL.
+ roa [ label="ROA|{EE Certificate|ROA}" ];
+
+ // This one is a table of everything we have ever issued to
+ // this child, not to be confused with what's -currently-
+ // issued to this child. Some question whether this hangs off
+ // ca or ca_detail, but we -think- hanging off of ca_detail is
+ // correct because certificates are issued by a particular
+ // keypair.
+
+ child_cert [ label="Child CA Certificate" ];
+
+ // One-many mappings
+ edge [ color=blue, arrowtail=none, arrowhead=crow ];
+ self -> biz_sign;
+ biz_sign -> child;
+ biz_sign -> parent;
+ biz_sign -> repo;
+ self -> child;
+ self -> parent;
+ repo -> parent;
+ self -> route_origin;
+
+ route_origin -> addr_set [ color=purple, arrowtail=none, arrowhead=crow ];
+
+ // This is many-many because each child is an entity, each CA
+ // can have multiple children, and each child can hold certs
+ // from multiple CAs (thanks, RobL).
+ //
+ ca -> child [ color=green, arrowtail=crow, arrowhead=crow ];
+
+ // One-many mappings
+ edge [ color=green, arrowtail=none, arrowhead=crow ];
+ ca -> ca_detail;
+ child -> child_cert;
+ parent -> ca;
+ ca_detail -> child_cert;
+ ca_detail -> roa;
+
+ // One-one mapping -- separate object to highlight dynamic nature
+ edge [ color=green, arrowtail=none, arrowhead=none, style=solid ];
+ route_origin -> roa;
+
+}
+
+// Local Variables:
+// compile-command: "dot -Tps2 repository-engine-objects.dot | ps2pdf - repository-engine-objects.pdf"
+// End:
diff --git a/presentations/repository-engine-objects.pdf b/presentations/repository-engine-objects.pdf
new file mode 100644
index 00000000..68c6d2d6
--- /dev/null
+++ b/presentations/repository-engine-objects.pdf
Binary files differ
diff --git a/presentations/repository-structure.txt b/presentations/repository-structure.txt
new file mode 100644
index 00000000..327663b7
--- /dev/null
+++ b/presentations/repository-structure.txt
@@ -0,0 +1,111 @@
+$Id$
+
+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.
+
+
+This note is an attempt to write up the conclusions that several of us
+came to at the RPKI meeting in Prague, March 2007.
+
+We currently have two examples of possible repository structure,
+neither of which is quite what at least some of us think we want yet.
+
+APNIC's hierarchy of directories named by the g(SKI) function applied
+to the public keys has some nice properties: in particular, the
+hierarchical structure (subjects being stored underneath their issuers
+when sharing a repository) has very nice scaling properties with
+rsync. With this structure, a top-down walk such as rcynic uses will
+pick up an entire tree as a side effect of fetching the top-most
+issuer's SIA collection. Combined with a trivial memory cache to let
+rcynic keep track of which URIs it has already fetched, this speeds up
+rcynic's runtime by nearly two orders of magnitude in testing late
+last year. The reason for this turns out to be simple: rsync is a
+reasonably fast protocol, so one rsync connection to fetch an SIA
+collection that hasn't changed takes approximately 500ms on not
+terribly exciting hardware -- but in a system with more than 40,000
+objects, the cumulative total of all those half-second rsync
+connections becomes significant.
+
+There is, however, one problem with the current APNIC structure: the
+g(SKI) naming scheme means that the URIs associated with every
+decendent of a particular node in the tree will change when that
+node's key changes. This means that a key rollover event near the
+root of the tree (eg, when APNIC's own key changes) will require a
+painfully large number of certificates to be reissued. NB: only one
+key is rolling in this scenario, the rest of the certificates are
+being reissued with the same key, and the only reason why they need to
+be reissued at all is that the path has changed.
+
+At the same time, the g(SKI) naming scheme has good properties for
+naming certificates and CRLs, as it means that we can perform "make
+before break" rollovers, leaving the old certificate path in place
+until the new one is fully operational.
+
+So the goal here is to preserve the nice hierarchical structure of
+APNIC's model, and preserve the nice properties of the g(SKI) naming
+for certificates and CRLs, while avoiding the need to reissue every
+desendent after a key rollover. We think that we can do this by using
+static names for the directories and g(SKI)-based names for the files.
+
+This immediately begs the question of what the static names should be.
+Some of us were tempted to make them organization names, but others of
+us felt strongly that they should be completely meaningless, as they
+only need to be unique within a particular parent directory and as we
+really want to avoid all the "identity" issues that we have thus far
+carefully avoided. We did not achieve consensus on this point, but I
+(sra) am firmly in the meaningless name camp on this one.
+
+The upshot of all this is that I expect to be using URIs like:
+
+ rsync://hostname/g0001/g0002/g0003/
+ rsync://hostname/g0001/g0002/g0003/g(ski).cer
+ rsync://hostname/g0001/g0002/g0003/g(ski).crl
+
+where "gNNNN" indicates a generated symbol with no significance other
+than that it is unique enough to avoid collisions. In this particular
+case, the scope in which the symbol must be unique is just the
+directory in which it appears.
+
+We haven't yet discussed how to name ROAs, but since we expect ROAs to
+be tied to particular single-use EE certs, my guess is that a g(SKI)
+name based on the key of the EE cert would be appropriate, so either
+of the following forms would probably work:
+
+ rsync://hostname/g0001/g0002/g0003/g0004/g(ski).roa
+ rsync://hostname/g0001/g0002/g0003/g(ski)/g(ski).roa
+
+The latter violates the rule of only using g(SKI) names for files,
+never for directories, but in this case it'd probably be ok.
+
+This assumes that we're generating a new key for each ROA; if we're
+reusing keys (dunno), we'd need a naming scheme like:
+
+ rsync://hostname/g0001/g0002/g0003/g(ski)/g0004.roa
+
+For those unfamiliar with the notation (borrowed from Lisp): g0001 etc
+are just "gensym" symbols, ie, the output of some function whose sole
+purpose is to generate meaningless symbols.
+
+See images/repository-structure.pdf for an illustration of the problem
+and solution.
+
+There may be compromise-driven rollover cases in which we will need to
+reissue all of the children of a node whose key has been compromised.
+Whether or not this is necessary depends on whether the master copy of
+the authoritative data is safe somewhere else; if it is, and the
+resource certificates are just a signed representation of an
+authoritative database that has not been compromised, reissuing all of
+the descendants may not be necessary, but if the resource certificates
+-are- the database, and one level in it has been compromised, it's
+probably advisable to reissue all the descendants.
diff --git a/presentations/sample-irdb-data.sql b/presentations/sample-irdb-data.sql
new file mode 100644
index 00000000..df24b48f
--- /dev/null
+++ b/presentations/sample-irdb-data.sql
@@ -0,0 +1,80 @@
+-- $Id$
+
+-- 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.
+
+INSERT INTO registrant (IRBE_mapped_id) VALUES ('ARIN');
+INSERT INTO registrant (IRBE_mapped_id) VALUES ('TIER1_ISP1');
+INSERT INTO registrant (IRBE_mapped_id) VALUES ('TIER1_ISP2');
+INSERT INTO registrant (IRBE_mapped_id) VALUES ('JOES_PIZZA');
+
+INSERT INTO resource_class (subject_name, valid_until, registrant_id)
+SELECT 'All ARIN resources', '2099-12-31', registrant_id
+FROM registrant WHERE IRBE_mapped_id = 'ARIN';
+
+INSERT INTO resource_class (subject_name, valid_until, registrant_id)
+SELECT 'Tier 1 ISP foo subject name', '2008-12-31', registrant_id
+FROM registrant WHERE IRBE_mapped_id = 'TIER1_ISP1';
+
+INSERT INTO resource_class (subject_name, valid_until, registrant_id)
+SELECT 'Tier 1 ISP foo subject name', '2009-06-30', registrant_id
+FROM registrant WHERE IRBE_mapped_id = 'TIER1_ISP1';
+
+INSERT INTO resource_class (subject_name, valid_until, registrant_id)
+SELECT 'Tier 1 ISP bar subject name', '2007-07-31', registrant_id
+FROM registrant WHERE IRBE_mapped_id = 'TIER1_ISP2';
+
+INSERT INTO resource_class (subject_name, valid_until, registrant_id)
+SELECT 'arbitrary characters', '2007-12-31', registrant_id
+FROM registrant WHERE IRBE_mapped_id = 'JOES_PIZZA';
+
+INSERT INTO net (start_ip, end_ip, version, resource_class_id)
+SELECT 'DEAD:BEEF:0000:0000:0000:0000:0000:0000', 'DFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF', 6, resource_class_id
+FROM resource_class WHERE subject_name = 'All ARIN resources';
+
+INSERT INTO net (start_ip, end_ip, version, resource_class_id)
+SELECT 'DEAD:BEEF:FACE:0000:0000:0000:0000:0000', 'DEAD:BEEF:FACE:FFFF:FFFF:FFFF:FFFF:FFFF', 6, resource_class_id
+FROM resource_class WHERE subject_name = 'TIER 1 ISP foo subject name' AND valid_until = '2009-06-30';
+
+INSERT INTO net (start_ip, end_ip, version, resource_class_id)
+SELECT 'DEAD:BEEF:FACE:FADE:0000:0000:0000:0000', 'DEAD:BEEF:FACE:FADE:FFFF:FFFF:FFFF:FFFF', 6, resource_class_id
+FROM resource_class WHERE subject_name = 'arbitrary characters' AND valid_until = '2007-12-31';
+
+INSERT INTO net(start_ip, end_ip, version, resource_class_id)
+SELECT '010.000.000.000', '010.255.255.255', 4, resource_class_id
+FROM resource_class WHERE subject_name = 'All ARIN resources';
+
+INSERT INTO net(start_ip, end_ip, version, resource_class_id)
+SELECT '010.128.000.000', '010.191.255.255', 4, resource_class_id
+FROM resource_class WHERE subject_name = 'Tier 1 ISP foo subject name' AND valid_until = '2009-06-30';
+
+INSERT INTO net(start_ip, end_ip, version, resource_class_id)
+SELECT '010.000.000.000', '010.063.255.255', 4, resource_class_id
+FROM resource_class WHERE subject_name = 'Tier 1 ISP foo subject name' AND valid_until = '2009-06-30';
+
+INSERT INTO net(start_ip, end_ip, version, resource_class_id)
+SELECT '010.128.000.000', '010.191.255.255', 4, resource_class_id
+FROM resource_class WHERE subject_name = 'arbitrary characters';
+
+INSERT INTO asn(start_as, end_as, resource_class_id)
+SELECT 12345, 12345, resource_class_id
+FROM resource_class WHERE subject_name = 'Tier 1 ISP foo subject name' AND valid_until = '2009-06-30';
+
+INSERT INTO asn(start_as, end_as, resource_class_id)
+SELECT 23456, 23457, resource_class_id
+FROM resource_class WHERE subject_name = 'Tier 1 ISP foo subject name' AND valid_until = '2009-06-30';
+
+INSERT INTO asn(start_as, end_as, resource_class_id)
+SELECT 34567, 34567, resource_class_id
+FROM resource_class WHERE subject_name = 'Tier 1 ISP foo subject name' AND valid_until = '2008-12-31';
diff --git a/presentations/signed-manifests b/presentations/signed-manifests
new file mode 100644
index 00000000..d1bd3f5e
--- /dev/null
+++ b/presentations/signed-manifests
@@ -0,0 +1,74 @@
+-- $Id$
+
+-- 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.
+
+-- Signed manifests for RPKI repositories. Relying parties use object
+-- (as opposed to channel) security for everything in this design
+-- repository, which is the right thing to do for various reasons but
+-- leaves us open to attacks which intercept the rsync connection and
+-- drop valid objects out of an SIA collection. At present this is
+-- not detectable, so we need a mechanism.
+--
+-- Manifests as described here are modeled on CRLs, because the issues
+-- involved in detecting stale manifests, manifest replays, etc are
+-- similar to those for CRLs. So we want many of the fields that a
+-- CRL has. Syntax differs, though, since RPKI repositories can
+-- contain objects not covered by CRLs (eg, ROAs), and reuse CMS as
+-- the manifest signature format rather than inventing another one.
+--
+-- See RFC 3280 section 5 for CRL layout and extensions.
+--
+-- We're only trying to cover objects in the same SIA collection
+-- (directory) as the manifest. We will probably want to name the
+-- manifest itself with a name derived from the g(ski) of the cert of
+-- which this is the SIA collection. We'll need an EE cert to sign
+-- the manifest; the EE cert should probably just use RFC 3779
+-- inheritance to cover all the resources that its issuer holds. If we
+-- use CMS, we might just want to include the EE cert in the CMS
+-- bag of certs.
+--
+-- Lisp pseudo-code version of my original proposal for what goes
+-- inside the CMS wrapper:
+--
+-- (manifest :version 1
+-- :collection-uri "rsync://foo.example/wombat/"
+-- :this-update timestamp
+-- :next-update timestamp
+-- :manifest-serial 17
+-- :hash-algorithm :sha256
+-- (:name foo.cer :hash aabbccdd...)
+-- (:name bar.cer :hash bbccddee...)
+-- (:name foo.roa :hash ccddeeff...)
+-- (:name baz.crl :hash ddeeff00...)
+-- ...)
+--
+-- Steve Kent came up with something very similar in ASN.1. At this
+-- point I think that Steve and I have converged, so here is Steve's
+-- ASN.1, which, absent new issues, I expect to implement with
+-- OpenSSL's ASN.1 engine.
+
+Manifest ::= SEQUENCE {
+ version [0] INTEGER DEFAULT 0, -- first version is 0
+ manifestNumber INTEGER, -- to identify unscheduled manifest issuance
+ thisUpdate GeneralizedTime, -- this manifest issuance time
+ nextUpdate GeneralizedTime, -- next scheduled manifest issuance time
+ fileHashAlg OBJECT IDENTIFIER, -- algorithm used to generate file content hash values
+ fileList SEQUENCE OF FileAndHash -- list of file name and content hash pairs
+}
+
+FileAndHash ::= SEQUENCE {
+ file IA5String -- file name
+ hash BIT STRING -- hash of file content
+}
diff --git a/presentations/up-down-protocol b/presentations/up-down-protocol
new file mode 100644
index 00000000..4e4aa86c
--- /dev/null
+++ b/presentations/up-down-protocol
@@ -0,0 +1,8 @@
+$Id$
+
+The master copy of the up-down protocol currently lives in a wiki at
+APNIC. A flat text mirror of this document can be found at:
+
+http://subvert-rpki.hactrn.net/wiki-mirror/text/mirin.apnic.net/resourcecerts/wiki/index.php/IR-ISP_Definition
+
+(ie, ../wiki-mirror/text/mirin.apnic.net/resourcecerts/wiki/index.php/IR-ISP_Definition within this repository).