aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Odersky <jodersky@gmail.com>2015-04-22 15:06:49 +0200
committerJakob Odersky <jodersky@gmail.com>2015-04-22 15:24:00 +0200
commitf79ee0e3999dfd04af306aced213f20b7f8e0904 (patch)
treeff9be23960cce44544a90bee37124d0cdcd2f60d
downloadsecurity-f79ee0e3999dfd04af306aced213f20b7f8e0904.tar.gz
security-f79ee0e3999dfd04af306aced213f20b7f8e0904.tar.bz2
security-f79ee0e3999dfd04af306aced213f20b7f8e0904.zip
initial commit
-rw-r--r--README.md15
-rw-r--r--gpg/card/README.md18
-rw-r--r--gpg/card/dist/card.pdfbin0 -> 27829 bytes
-rwxr-xr-xgpg/card/makecard111
-rwxr-xr-xgpg/card/makecard-pdf4
-rw-r--r--gpg/card/multiple.svg1548
-rw-r--r--gpg/card/single.svg129
-rw-r--r--gpg/skeybase/.gitignore9
-rw-r--r--gpg/skeybase/project/Build.scala28
-rw-r--r--gpg/skeybase/project/build.properties1
-rw-r--r--gpg/skeybase/src/main/scala/com/github/jodersky/skeybase/Keybase.scala61
-rw-r--r--gpg/skeybase/src/main/scala/com/github/jodersky/skeybase/Main.scala39
-rw-r--r--gpg/skeybase/src/main/scala/com/github/jodersky/skeybase/openpgp/Backend.scala18
-rw-r--r--gpg/skeybase/src/main/scala/com/github/jodersky/skeybase/openpgp/GnuPG.scala58
-rw-r--r--gpg/skeybase/src/main/scala/com/github/jodersky/skeybase/responses.scala7
-rw-r--r--gpg/skeybase/src/main/scala/com/github/jodersky/skeybase/verification/GitHubVerifier.scala64
-rw-r--r--gpg/skeybase/src/main/scala/com/github/jodersky/skeybase/verification/VerificationException.scala4
-rw-r--r--gpg/skeybase/src/main/scala/com/github/jodersky/skeybase/verification/Verifier.scala109
-rw-r--r--gpg/skeybase/src/main/scala/com/github/jodersky/skeybase/verification/WebsiteFileVerifier.scala39
-rw-r--r--gpg/skeybase/src/main/scala/com/github/jodersky/skeybase/verification/statements.scala6
-rw-r--r--ssl/manual-procedure.txt25
-rw-r--r--ssl/uca/README.md11
-rwxr-xr-xssl/uca/uca78
23 files changed, 2382 insertions, 0 deletions
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..416678a
--- /dev/null
+++ b/README.md
@@ -0,0 +1,15 @@
+# Security Utilities and Instructions
+
+This repository is a collection of programs and instructions for various security and privacy-related software.
+The software contained are not custom implementations of security protocols, they are wrappers for well-established
+tools.
+
+# Outline
+
+## GnuPG
+ - card: create business cards from gpg keys
+ - skeybase: an independent keybase.io client, capable of verifying identity proofs
+
+## SSL
+ - instructions on manually managing keys and certicates
+ - uca: tiny certificate authority \ No newline at end of file
diff --git a/gpg/card/README.md b/gpg/card/README.md
new file mode 100644
index 0000000..137d68d
--- /dev/null
+++ b/gpg/card/README.md
@@ -0,0 +1,18 @@
+# OpenPGP Business Cards
+
+Generate business cards with OpenPGP fingerprints.
+
+## Idea
+Templates are designed as scalable vector graphics with a program such as inkscape.
+Key values in the templates are replaced by values extracted from GnuPG keys.
+
+## Usage
+Run `makecard -h` for a description of available options.
+
+## Example
+See `dist` folder for examples.
+
+## Dependencies
+ - GnuPG
+ - qrencode
+ - *optional* inkscape to convert SVGs to PDFs \ No newline at end of file
diff --git a/gpg/card/dist/card.pdf b/gpg/card/dist/card.pdf
new file mode 100644
index 0000000..c484212
--- /dev/null
+++ b/gpg/card/dist/card.pdf
Binary files differ
diff --git a/gpg/card/makecard b/gpg/card/makecard
new file mode 100755
index 0000000..cf6be0b
--- /dev/null
+++ b/gpg/card/makecard
@@ -0,0 +1,111 @@
+#!/bin/bash
+#
+# Creates an OpenPGP fingerprint business card.
+# This script uses an SVG file as a template and replaces
+# values such as $NAME and $FINGERPRINT with contents extracted
+# from a key.
+#
+# Note that this script uses "gpg --with-colons" to parse key information.
+# Documentation on the returned format can be found in "doc/DETAILS"
+# of the GnuPG distribution.
+
+set -e
+
+# Show help
+print_usage() {
+cat <<- EOF
+makecard - Create business cards with GnuPG
+
+ $0 [-t template] gpgid
+
+Print an SVG business card containing an OpenPGP fingerprint to standard output.
+
+ -t template
+ Use the file <template> as an SVG template for the business card.
+
+ gpgid
+ GnuPG id used on card. This may be anything accepted by gpg, such as an email address, key id or fingerprint.
+
+EOF
+}
+
+# Parameters
+#
+
+# GPG key identity to use
+GPGID=
+
+# Template file in which to replace variables
+TEMPLATE="multiple.svg"
+
+# Process command-line parameters
+while test $# -gt 0; do
+ case "$1" in
+ -h)
+ print_usage
+ exit 0
+ ;;
+ -t)
+ shift
+ if [ $# -gt 0 ]; then
+ TEMPLATE=$1
+ else
+ echo "No template specified. Aborting." 1>&2
+ exit 1
+ fi
+ ;;
+ *)
+ GPGID=$1
+ ;;
+ esac
+ shift
+done
+
+# Parameters processed beyond this point
+if [ -z "$GPGID" ]; then
+ echo "No gpg identity specified. Aborting." 1>&2
+ exit 1
+fi
+if [ ! -e "$TEMPLATE" ]; then
+ echo "Template not found. Aborting." 1>&2
+ exit 1
+fi
+
+
+# Compute number of keys available under given identity
+NUMKEYS=$(gpg --with-colons --list-keys "$GPGID" | awk -F: '/^fpr/{ print $10 }' | wc -l)
+
+# Only one key is supported by this script
+if [ "$NUMKEYS" -eq 0 ]; then
+ echo "No keys found for $GPGID. Aborting." 1>&2
+ exit 1
+fi
+if [ "$NUMKEYS" -gt 1 ]; then
+ echo "More than one key found for $GPGID. Aborting." 1>&2;
+ exit 1
+fi
+
+# Extract name
+USERID=$(gpg --with-colons --list-keys --fingerprint "$GPGID" | awk -F: '/^pub/{ print $10 }')
+NAME=$(echo "$USERID"| awk -F' <' '{ print $1 }')
+
+# Extract fingerprint
+FINGERPRINT=$(gpg --with-colons --list-keys "$GPGID" | awk -F: '/^fpr/{ print $10 }')
+# First 20 characters of fingerprint, separated intp groups of 4
+FP1=$(echo "$FINGERPRINT" | cut -c1-20 | fold -w4 | paste -sd\ -)
+# Second 20 characters of fingerprint, separated intp groups of 4
+FP2=$(echo "$FINGERPRINT" | cut -c21-40 | fold -w4 | paste -sd\ -)
+
+# Data to include in QR code
+# Remove "options=mr" from URL query to get human-readable output
+QRDATA="https://pgp.mit.edu/pks/lookup?op=get&options=mr&search=0x$FINGERPRINT"
+
+# Encode QR code
+QRCODE="data:image/png;base64,$(echo "$QRDATA" | qrencode -t PNG -m 0 -o - | base64)"
+
+# Replace variables in tamplate
+cat "$TEMPLATE" \
+ | sed "s/\$NAME/$NAME/g" \
+ | sed "s/\$FP1/$FP1/g" \
+ | sed "s/\$FP2/$FP2/g" \
+ | awk -v QRCODE="$QRCODE" '{ gsub(/\$QRCODE/, QRCODE); print }' \ No newline at end of file
diff --git a/gpg/card/makecard-pdf b/gpg/card/makecard-pdf
new file mode 100755
index 0000000..9d52c0d
--- /dev/null
+++ b/gpg/card/makecard-pdf
@@ -0,0 +1,4 @@
+#!/bin/bash
+set -e
+
+./makecard "$1" | inkscape --export-area-page --export-pdf=/dev/stdout -f /dev/stdin \ No newline at end of file
diff --git a/gpg/card/multiple.svg b/gpg/card/multiple.svg
new file mode 100644
index 0000000..82828b0
--- /dev/null
+++ b/gpg/card/multiple.svg
@@ -0,0 +1,1548 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="744.09448"
+ height="1052.3622"
+ id="svg2985"
+ version="1.1"
+ inkscape:version="0.48.5 r10040"
+ sodipodi:docname="multiple.svg">
+ <defs
+ id="defs3" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.57049207"
+ inkscape:cx="-54.99575"
+ inkscape:cy="594.68094"
+ inkscape:document-units="mm"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ units="mm"
+ inkscape:window-width="1920"
+ inkscape:window-height="1033"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata2989">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,875.19684)">
+ <image
+ sodipodi:absref="/home/jodersky/gpg/new/$QRCODE"
+ xlink:href="$QRCODE"
+ id="image9784"
+ x="85.039345"
+ y="-8.3872919"
+ width="105.35708"
+ height="105.35726" />
+ <text
+ xml:space="preserve"
+ style="font-size:14.9999876px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ x="282.61539"
+ y="29.264729"
+ id="text2992"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="282.61539"
+ y="29.264729"
+ id="tspan3031"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">$NAME</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:14.9999876px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Monospace;-inkscape-font-specification:Monospace"
+ x="282.61539"
+ y="83.000145"
+ id="text3019"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3021"
+ x="282.61539"
+ y="83.000145"
+ style="font-size:9.99999237px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Monospace;-inkscape-font-specification:Monospace">$FP1</tspan><tspan
+ sodipodi:role="line"
+ x="282.61539"
+ y="95.500137"
+ id="tspan3023"
+ style="font-size:9.99999237px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Monospace;-inkscape-font-specification:Monospace">$FP2</tspan></text>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1.06299126;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 85.923474,126.67492 271.069346,0"
+ id="path3038"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3808"
+ d="m 85.923474,-39.860509 271.069346,0"
+ style="fill:none;stroke:#000000;stroke-width:1.06299126;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <text
+ xml:space="preserve"
+ style="font-size:7.9999938px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ x="198.55431"
+ y="-2.5552897"
+ id="text2993"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan2995"
+ x="198.55431"
+ y="-2.5552897"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans">Name:</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text2997"
+ y="57.028355"
+ x="198.55431"
+ style="font-size:7.9999938px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans"
+ y="57.028355"
+ x="198.55431"
+ id="tspan2999"
+ sodipodi:role="line">OpenPGP Fingerprint</tspan></text>
+ <image
+ sodipodi:absref="/home/jodersky/gpg/new/$QRCODE"
+ xlink:href="$QRCODE"
+ height="105.35726"
+ width="105.35708"
+ y="-8.3872919"
+ x="85.039345"
+ id="image4192" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text4194"
+ y="29.264729"
+ x="282.61539"
+ style="font-size:14.9999876px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans"
+ id="tspan4196"
+ y="29.264729"
+ x="282.61539"
+ sodipodi:role="line">$NAME</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text4198"
+ y="83.000145"
+ x="282.61539"
+ style="font-size:14.9999876px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Monospace;-inkscape-font-specification:Monospace"
+ xml:space="preserve"><tspan
+ style="font-size:9.99999237px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Monospace;-inkscape-font-specification:Monospace"
+ y="83.000145"
+ x="282.61539"
+ id="tspan4200"
+ sodipodi:role="line">$FP1</tspan><tspan
+ style="font-size:9.99999237px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Monospace;-inkscape-font-specification:Monospace"
+ id="tspan4202"
+ y="95.500137"
+ x="282.61539"
+ sodipodi:role="line">$FP2</tspan></text>
+ <path
+ inkscape:connector-curvature="0"
+ id="path4204"
+ d="m 85.923474,126.67492 271.069346,0"
+ style="fill:none;stroke:#000000;stroke-width:1.06299126;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1.06299126;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 85.923474,-39.860509 271.069346,0"
+ id="path4206"
+ inkscape:connector-curvature="0" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text4208"
+ y="-2.5552897"
+ x="198.55431"
+ style="font-size:7.9999938px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans"
+ y="-2.5552897"
+ x="198.55431"
+ id="tspan4210"
+ sodipodi:role="line">Name:</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:7.9999938px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ x="198.55431"
+ y="57.028355"
+ id="text4212"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan4214"
+ x="198.55431"
+ y="57.028355"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans">OpenPGP Fingerprint</tspan></text>
+ <rect
+ style="fill:none;stroke:#999999;stroke-width:0.10629912;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect4602"
+ width="301.1806"
+ height="194.8819"
+ x="70.928642"
+ y="-53.212124" />
+ <image
+ sodipodi:absref="/home/jodersky/gpg/new/$QRCODE"
+ xlink:href="$QRCODE"
+ height="105.35726"
+ width="105.35708"
+ y="-8.3872919"
+ x="386.21994"
+ id="image4604" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text4606"
+ y="29.264729"
+ x="583.7962"
+ style="font-size:14.9999876px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans"
+ id="tspan4608"
+ y="29.264729"
+ x="583.7962"
+ sodipodi:role="line">$NAME</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text4610"
+ y="83.000145"
+ x="583.7962"
+ style="font-size:14.9999876px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Monospace;-inkscape-font-specification:Monospace"
+ xml:space="preserve"><tspan
+ style="font-size:9.99999237px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Monospace;-inkscape-font-specification:Monospace"
+ y="83.000145"
+ x="583.7962"
+ id="tspan4612"
+ sodipodi:role="line">$FP1</tspan><tspan
+ style="font-size:9.99999237px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Monospace;-inkscape-font-specification:Monospace"
+ id="tspan4614"
+ y="95.500137"
+ x="583.7962"
+ sodipodi:role="line">$FP2</tspan></text>
+ <path
+ inkscape:connector-curvature="0"
+ id="path4616"
+ d="m 387.1041,126.67492 271.06934,0"
+ style="fill:none;stroke:#000000;stroke-width:1.06299126;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1.06299126;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 387.1041,-39.860509 271.06934,0"
+ id="path4618"
+ inkscape:connector-curvature="0" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text4620"
+ y="-2.5552897"
+ x="499.73514"
+ style="font-size:7.9999938px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans"
+ y="-2.5552897"
+ x="499.73514"
+ id="tspan4622"
+ sodipodi:role="line">Name:</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:7.9999938px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ x="499.73514"
+ y="57.028355"
+ id="text4624"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan4626"
+ x="499.73514"
+ y="57.028355"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans">OpenPGP Fingerprint</tspan></text>
+ <image
+ sodipodi:absref="/home/jodersky/gpg/new/$QRCODE"
+ xlink:href="$QRCODE"
+ id="image4628"
+ x="386.21994"
+ y="-8.3872919"
+ width="105.35708"
+ height="105.35726" />
+ <text
+ xml:space="preserve"
+ style="font-size:14.9999876px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ x="583.7962"
+ y="29.264729"
+ id="text4630"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="583.7962"
+ y="29.264729"
+ id="tspan4632"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">$NAME</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:14.9999876px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Monospace;-inkscape-font-specification:Monospace"
+ x="583.7962"
+ y="83.000145"
+ id="text4634"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan4636"
+ x="583.7962"
+ y="83.000145"
+ style="font-size:9.99999237px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Monospace;-inkscape-font-specification:Monospace">$FP1</tspan><tspan
+ sodipodi:role="line"
+ x="583.7962"
+ y="95.500137"
+ id="tspan4638"
+ style="font-size:9.99999237px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Monospace;-inkscape-font-specification:Monospace">$FP2</tspan></text>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1.06299126;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 387.1041,126.67492 271.06934,0"
+ id="path4640"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4642"
+ d="m 387.1041,-39.860509 271.06934,0"
+ style="fill:none;stroke:#000000;stroke-width:1.06299126;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <text
+ xml:space="preserve"
+ style="font-size:7.9999938px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ x="499.73514"
+ y="-2.5552897"
+ id="text4644"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan4646"
+ x="499.73514"
+ y="-2.5552897"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans">Name:</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text4648"
+ y="57.028355"
+ x="499.73514"
+ style="font-size:7.9999938px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans"
+ y="57.028355"
+ x="499.73514"
+ id="tspan4650"
+ sodipodi:role="line">OpenPGP Fingerprint</tspan></text>
+ <rect
+ y="-53.212124"
+ x="372.10925"
+ height="194.8819"
+ width="301.1806"
+ id="rect4652"
+ style="fill:none;stroke:#999999;stroke-width:0.10629912;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <image
+ sodipodi:absref="/home/jodersky/gpg/new/$QRCODE"
+ xlink:href="$QRCODE"
+ height="105.35726"
+ width="105.35708"
+ y="-203.26917"
+ x="85.039345"
+ id="image4854" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text4856"
+ y="-165.61699"
+ x="282.61539"
+ style="font-size:14.9999876px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans"
+ id="tspan4858"
+ y="-165.61699"
+ x="282.61539"
+ sodipodi:role="line">$NAME</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text4860"
+ y="-111.88159"
+ x="282.61539"
+ style="font-size:14.9999876px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Monospace;-inkscape-font-specification:Monospace"
+ xml:space="preserve"><tspan
+ style="font-size:9.99999237px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Monospace;-inkscape-font-specification:Monospace"
+ y="-111.88159"
+ x="282.61539"
+ id="tspan4862"
+ sodipodi:role="line">$FP1</tspan><tspan
+ style="font-size:9.99999237px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Monospace;-inkscape-font-specification:Monospace"
+ id="tspan4864"
+ y="-99.381599"
+ x="282.61539"
+ sodipodi:role="line">$FP2</tspan></text>
+ <path
+ inkscape:connector-curvature="0"
+ id="path4866"
+ d="m 85.923474,-68.206971 271.069346,0"
+ style="fill:none;stroke:#000000;stroke-width:1.06299126;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1.06299126;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 85.923474,-234.7424 271.069346,0"
+ id="path4868"
+ inkscape:connector-curvature="0" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text4870"
+ y="-197.43703"
+ x="198.55431"
+ style="font-size:7.9999938px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans"
+ y="-197.43703"
+ x="198.55431"
+ id="tspan4872"
+ sodipodi:role="line">Name:</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:7.9999938px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ x="198.55431"
+ y="-137.85336"
+ id="text4874"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan4876"
+ x="198.55431"
+ y="-137.85336"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans">OpenPGP Fingerprint</tspan></text>
+ <image
+ sodipodi:absref="/home/jodersky/gpg/new/$QRCODE"
+ xlink:href="$QRCODE"
+ id="image4878"
+ x="85.039345"
+ y="-203.26917"
+ width="105.35708"
+ height="105.35726" />
+ <text
+ xml:space="preserve"
+ style="font-size:14.9999876px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ x="282.61539"
+ y="-165.61699"
+ id="text4880"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="282.61539"
+ y="-165.61699"
+ id="tspan4882"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">$NAME</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:14.9999876px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Monospace;-inkscape-font-specification:Monospace"
+ x="282.61539"
+ y="-111.88159"
+ id="text4884"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan4886"
+ x="282.61539"
+ y="-111.88159"
+ style="font-size:9.99999237px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Monospace;-inkscape-font-specification:Monospace">$FP1</tspan><tspan
+ sodipodi:role="line"
+ x="282.61539"
+ y="-99.381599"
+ id="tspan4888"
+ style="font-size:9.99999237px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Monospace;-inkscape-font-specification:Monospace">$FP2</tspan></text>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1.06299126;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 85.923474,-68.206971 271.069346,0"
+ id="path4890"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4892"
+ d="m 85.923474,-234.7424 271.069346,0"
+ style="fill:none;stroke:#000000;stroke-width:1.06299126;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <text
+ xml:space="preserve"
+ style="font-size:7.9999938px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ x="198.55431"
+ y="-197.43703"
+ id="text4894"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan4896"
+ x="198.55431"
+ y="-197.43703"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans">Name:</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text4898"
+ y="-137.85336"
+ x="198.55431"
+ style="font-size:7.9999938px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans"
+ y="-137.85336"
+ x="198.55431"
+ id="tspan4900"
+ sodipodi:role="line">OpenPGP Fingerprint</tspan></text>
+ <rect
+ y="-248.09401"
+ x="70.928642"
+ height="194.8819"
+ width="301.1806"
+ id="rect4902"
+ style="fill:none;stroke:#999999;stroke-width:0.10629912;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <image
+ sodipodi:absref="/home/jodersky/gpg/new/$QRCODE"
+ xlink:href="$QRCODE"
+ id="image4904"
+ x="386.21994"
+ y="-203.26917"
+ width="105.35708"
+ height="105.35726" />
+ <text
+ xml:space="preserve"
+ style="font-size:14.9999876px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ x="583.7962"
+ y="-165.61699"
+ id="text4906"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="583.7962"
+ y="-165.61699"
+ id="tspan4908"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">$NAME</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:14.9999876px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Monospace;-inkscape-font-specification:Monospace"
+ x="583.7962"
+ y="-111.88159"
+ id="text4910"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan4912"
+ x="583.7962"
+ y="-111.88159"
+ style="font-size:9.99999237px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Monospace;-inkscape-font-specification:Monospace">$FP1</tspan><tspan
+ sodipodi:role="line"
+ x="583.7962"
+ y="-99.381599"
+ id="tspan4914"
+ style="font-size:9.99999237px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Monospace;-inkscape-font-specification:Monospace">$FP2</tspan></text>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1.06299126;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 387.1041,-68.206971 271.06934,0"
+ id="path4916"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4918"
+ d="m 387.1041,-234.7424 271.06934,0"
+ style="fill:none;stroke:#000000;stroke-width:1.06299126;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <text
+ xml:space="preserve"
+ style="font-size:7.9999938px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ x="499.73514"
+ y="-197.43703"
+ id="text4920"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan4922"
+ x="499.73514"
+ y="-197.43703"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans">Name:</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text4924"
+ y="-137.85336"
+ x="499.73514"
+ style="font-size:7.9999938px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans"
+ y="-137.85336"
+ x="499.73514"
+ id="tspan4926"
+ sodipodi:role="line">OpenPGP Fingerprint</tspan></text>
+ <image
+ sodipodi:absref="/home/jodersky/gpg/new/$QRCODE"
+ xlink:href="$QRCODE"
+ height="105.35726"
+ width="105.35708"
+ y="-203.26917"
+ x="386.21994"
+ id="image4928" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text4930"
+ y="-165.61699"
+ x="583.7962"
+ style="font-size:14.9999876px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans"
+ id="tspan4932"
+ y="-165.61699"
+ x="583.7962"
+ sodipodi:role="line">$NAME</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text4934"
+ y="-111.88159"
+ x="583.7962"
+ style="font-size:14.9999876px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Monospace;-inkscape-font-specification:Monospace"
+ xml:space="preserve"><tspan
+ style="font-size:9.99999237px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Monospace;-inkscape-font-specification:Monospace"
+ y="-111.88159"
+ x="583.7962"
+ id="tspan4936"
+ sodipodi:role="line">$FP1</tspan><tspan
+ style="font-size:9.99999237px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Monospace;-inkscape-font-specification:Monospace"
+ id="tspan4938"
+ y="-99.381599"
+ x="583.7962"
+ sodipodi:role="line">$FP2</tspan></text>
+ <path
+ inkscape:connector-curvature="0"
+ id="path4940"
+ d="m 387.1041,-68.206971 271.06934,0"
+ style="fill:none;stroke:#000000;stroke-width:1.06299126;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1.06299126;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 387.1041,-234.7424 271.06934,0"
+ id="path4942"
+ inkscape:connector-curvature="0" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text4944"
+ y="-197.43703"
+ x="499.73514"
+ style="font-size:7.9999938px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans"
+ y="-197.43703"
+ x="499.73514"
+ id="tspan4946"
+ sodipodi:role="line">Name:</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:7.9999938px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ x="499.73514"
+ y="-137.85336"
+ id="text4948"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan4950"
+ x="499.73514"
+ y="-137.85336"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans">OpenPGP Fingerprint</tspan></text>
+ <rect
+ style="fill:none;stroke:#999999;stroke-width:0.10629912;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect4952"
+ width="301.1806"
+ height="194.8819"
+ x="372.10925"
+ y="-248.09401" />
+ <image
+ sodipodi:absref="/home/jodersky/gpg/new/$QRCODE"
+ xlink:href="$QRCODE"
+ id="image4954"
+ x="85.039345"
+ y="-398.15106"
+ width="105.35708"
+ height="105.35726" />
+ <text
+ xml:space="preserve"
+ style="font-size:14.9999876px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ x="282.61539"
+ y="-360.49872"
+ id="text4956"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="282.61539"
+ y="-360.49872"
+ id="tspan4958"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">$NAME</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:14.9999876px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Monospace;-inkscape-font-specification:Monospace"
+ x="282.61539"
+ y="-306.76334"
+ id="text4960"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan4962"
+ x="282.61539"
+ y="-306.76334"
+ style="font-size:9.99999237px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Monospace;-inkscape-font-specification:Monospace">$FP1</tspan><tspan
+ sodipodi:role="line"
+ x="282.61539"
+ y="-294.26334"
+ id="tspan4964"
+ style="font-size:9.99999237px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Monospace;-inkscape-font-specification:Monospace">$FP2</tspan></text>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1.06299126;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 85.923474,-263.08885 271.069346,0"
+ id="path4966"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4968"
+ d="m 85.923474,-429.62428 271.069346,0"
+ style="fill:none;stroke:#000000;stroke-width:1.06299126;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <text
+ xml:space="preserve"
+ style="font-size:7.9999938px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ x="198.55431"
+ y="-392.31879"
+ id="text4970"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan4972"
+ x="198.55431"
+ y="-392.31879"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans">Name:</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text4974"
+ y="-332.73511"
+ x="198.55431"
+ style="font-size:7.9999938px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans"
+ y="-332.73511"
+ x="198.55431"
+ id="tspan4976"
+ sodipodi:role="line">OpenPGP Fingerprint</tspan></text>
+ <image
+ sodipodi:absref="/home/jodersky/gpg/new/$QRCODE"
+ xlink:href="$QRCODE"
+ height="105.35726"
+ width="105.35708"
+ y="-398.15106"
+ x="85.039345"
+ id="image4978" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text4980"
+ y="-360.49872"
+ x="282.61539"
+ style="font-size:14.9999876px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans"
+ id="tspan4982"
+ y="-360.49872"
+ x="282.61539"
+ sodipodi:role="line">$NAME</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text4984"
+ y="-306.76334"
+ x="282.61539"
+ style="font-size:14.9999876px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Monospace;-inkscape-font-specification:Monospace"
+ xml:space="preserve"><tspan
+ style="font-size:9.99999237px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Monospace;-inkscape-font-specification:Monospace"
+ y="-306.76334"
+ x="282.61539"
+ id="tspan4986"
+ sodipodi:role="line">$FP1</tspan><tspan
+ style="font-size:9.99999237px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Monospace;-inkscape-font-specification:Monospace"
+ id="tspan4988"
+ y="-294.26334"
+ x="282.61539"
+ sodipodi:role="line">$FP2</tspan></text>
+ <path
+ inkscape:connector-curvature="0"
+ id="path4990"
+ d="m 85.923474,-263.08885 271.069346,0"
+ style="fill:none;stroke:#000000;stroke-width:1.06299126;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1.06299126;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 85.923474,-429.62428 271.069346,0"
+ id="path4992"
+ inkscape:connector-curvature="0" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text4994"
+ y="-392.31879"
+ x="198.55431"
+ style="font-size:7.9999938px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans"
+ y="-392.31879"
+ x="198.55431"
+ id="tspan4996"
+ sodipodi:role="line">Name:</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:7.9999938px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ x="198.55431"
+ y="-332.73511"
+ id="text4998"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5000"
+ x="198.55431"
+ y="-332.73511"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans">OpenPGP Fingerprint</tspan></text>
+ <rect
+ style="fill:none;stroke:#999999;stroke-width:0.10629912;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect5002"
+ width="301.1806"
+ height="194.8819"
+ x="70.928642"
+ y="-442.97592" />
+ <image
+ sodipodi:absref="/home/jodersky/gpg/new/$QRCODE"
+ xlink:href="$QRCODE"
+ height="105.35726"
+ width="105.35708"
+ y="-398.15106"
+ x="386.21994"
+ id="image5004" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5006"
+ y="-360.49872"
+ x="583.7962"
+ style="font-size:14.9999876px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans"
+ id="tspan5008"
+ y="-360.49872"
+ x="583.7962"
+ sodipodi:role="line">$NAME</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text5010"
+ y="-306.76334"
+ x="583.7962"
+ style="font-size:14.9999876px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Monospace;-inkscape-font-specification:Monospace"
+ xml:space="preserve"><tspan
+ style="font-size:9.99999237px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Monospace;-inkscape-font-specification:Monospace"
+ y="-306.76334"
+ x="583.7962"
+ id="tspan5012"
+ sodipodi:role="line">$FP1</tspan><tspan
+ style="font-size:9.99999237px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Monospace;-inkscape-font-specification:Monospace"
+ id="tspan5014"
+ y="-294.26334"
+ x="583.7962"
+ sodipodi:role="line">$FP2</tspan></text>
+ <path
+ inkscape:connector-curvature="0"
+ id="path5016"
+ d="m 387.1041,-263.08885 271.06934,0"
+ style="fill:none;stroke:#000000;stroke-width:1.06299126;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1.06299126;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 387.1041,-429.62428 271.06934,0"
+ id="path5018"
+ inkscape:connector-curvature="0" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5020"
+ y="-392.31879"
+ x="499.73514"
+ style="font-size:7.9999938px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans"
+ y="-392.31879"
+ x="499.73514"
+ id="tspan5022"
+ sodipodi:role="line">Name:</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:7.9999938px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ x="499.73514"
+ y="-332.73511"
+ id="text5024"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5026"
+ x="499.73514"
+ y="-332.73511"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans">OpenPGP Fingerprint</tspan></text>
+ <image
+ sodipodi:absref="/home/jodersky/gpg/new/$QRCODE"
+ xlink:href="$QRCODE"
+ id="image5028"
+ x="386.21994"
+ y="-398.15106"
+ width="105.35708"
+ height="105.35726" />
+ <text
+ xml:space="preserve"
+ style="font-size:14.9999876px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ x="583.7962"
+ y="-360.49872"
+ id="text5030"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="583.7962"
+ y="-360.49872"
+ id="tspan5032"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">$NAME</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:14.9999876px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Monospace;-inkscape-font-specification:Monospace"
+ x="583.7962"
+ y="-306.76334"
+ id="text5034"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5036"
+ x="583.7962"
+ y="-306.76334"
+ style="font-size:9.99999237px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Monospace;-inkscape-font-specification:Monospace">$FP1</tspan><tspan
+ sodipodi:role="line"
+ x="583.7962"
+ y="-294.26334"
+ id="tspan5038"
+ style="font-size:9.99999237px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Monospace;-inkscape-font-specification:Monospace">$FP2</tspan></text>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1.06299126;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 387.1041,-263.08885 271.06934,0"
+ id="path5040"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path5042"
+ d="m 387.1041,-429.62428 271.06934,0"
+ style="fill:none;stroke:#000000;stroke-width:1.06299126;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <text
+ xml:space="preserve"
+ style="font-size:7.9999938px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ x="499.73514"
+ y="-392.31879"
+ id="text5044"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5046"
+ x="499.73514"
+ y="-392.31879"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans">Name:</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text5048"
+ y="-332.73511"
+ x="499.73514"
+ style="font-size:7.9999938px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans"
+ y="-332.73511"
+ x="499.73514"
+ id="tspan5050"
+ sodipodi:role="line">OpenPGP Fingerprint</tspan></text>
+ <rect
+ y="-442.97592"
+ x="372.10925"
+ height="194.8819"
+ width="301.1806"
+ id="rect5052"
+ style="fill:none;stroke:#999999;stroke-width:0.10629912;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <image
+ sodipodi:absref="/home/jodersky/gpg/new/$QRCODE"
+ xlink:href="$QRCODE"
+ height="105.35726"
+ width="105.35708"
+ y="-593.03296"
+ x="85.039345"
+ id="image5054" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5056"
+ y="-555.38049"
+ x="282.61539"
+ style="font-size:14.9999876px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans"
+ id="tspan5058"
+ y="-555.38049"
+ x="282.61539"
+ sodipodi:role="line">$NAME</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text5060"
+ y="-501.64508"
+ x="282.61539"
+ style="font-size:14.9999876px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Monospace;-inkscape-font-specification:Monospace"
+ xml:space="preserve"><tspan
+ style="font-size:9.99999237px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Monospace;-inkscape-font-specification:Monospace"
+ y="-501.64508"
+ x="282.61539"
+ id="tspan5062"
+ sodipodi:role="line">$FP1</tspan><tspan
+ style="font-size:9.99999237px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Monospace;-inkscape-font-specification:Monospace"
+ id="tspan5064"
+ y="-489.14508"
+ x="282.61539"
+ sodipodi:role="line">$FP2</tspan></text>
+ <path
+ inkscape:connector-curvature="0"
+ id="path5066"
+ d="m 85.923474,-457.97073 271.069346,0"
+ style="fill:none;stroke:#000000;stroke-width:1.06299126;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1.06299126;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 85.923474,-624.50616 271.069346,0"
+ id="path5068"
+ inkscape:connector-curvature="0" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5070"
+ y="-587.20056"
+ x="198.55431"
+ style="font-size:7.9999938px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans"
+ y="-587.20056"
+ x="198.55431"
+ id="tspan5072"
+ sodipodi:role="line">Name:</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:7.9999938px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ x="198.55431"
+ y="-527.61682"
+ id="text5074"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5076"
+ x="198.55431"
+ y="-527.61682"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans">OpenPGP Fingerprint</tspan></text>
+ <image
+ sodipodi:absref="/home/jodersky/gpg/new/$QRCODE"
+ xlink:href="$QRCODE"
+ id="image5078"
+ x="85.039345"
+ y="-593.03296"
+ width="105.35708"
+ height="105.35726" />
+ <text
+ xml:space="preserve"
+ style="font-size:14.9999876px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ x="282.61539"
+ y="-555.38049"
+ id="text5080"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="282.61539"
+ y="-555.38049"
+ id="tspan5082"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">$NAME</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:14.9999876px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Monospace;-inkscape-font-specification:Monospace"
+ x="282.61539"
+ y="-501.64508"
+ id="text5084"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5086"
+ x="282.61539"
+ y="-501.64508"
+ style="font-size:9.99999237px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Monospace;-inkscape-font-specification:Monospace">$FP1</tspan><tspan
+ sodipodi:role="line"
+ x="282.61539"
+ y="-489.14508"
+ id="tspan5088"
+ style="font-size:9.99999237px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Monospace;-inkscape-font-specification:Monospace">$FP2</tspan></text>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1.06299126;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 85.923474,-457.97073 271.069346,0"
+ id="path5090"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path5092"
+ d="m 85.923474,-624.50616 271.069346,0"
+ style="fill:none;stroke:#000000;stroke-width:1.06299126;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <text
+ xml:space="preserve"
+ style="font-size:7.9999938px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ x="198.55431"
+ y="-587.20056"
+ id="text5094"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5096"
+ x="198.55431"
+ y="-587.20056"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans">Name:</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text5098"
+ y="-527.61682"
+ x="198.55431"
+ style="font-size:7.9999938px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans"
+ y="-527.61682"
+ x="198.55431"
+ id="tspan5100"
+ sodipodi:role="line">OpenPGP Fingerprint</tspan></text>
+ <rect
+ y="-637.85785"
+ x="70.928642"
+ height="194.8819"
+ width="301.1806"
+ id="rect5102"
+ style="fill:none;stroke:#999999;stroke-width:0.10629912;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <image
+ sodipodi:absref="/home/jodersky/gpg/new/$QRCODE"
+ xlink:href="$QRCODE"
+ id="image5104"
+ x="386.21994"
+ y="-593.03296"
+ width="105.35708"
+ height="105.35726" />
+ <text
+ xml:space="preserve"
+ style="font-size:14.9999876px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ x="583.7962"
+ y="-555.38049"
+ id="text5106"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="583.7962"
+ y="-555.38049"
+ id="tspan5108"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">$NAME</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:14.9999876px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Monospace;-inkscape-font-specification:Monospace"
+ x="583.7962"
+ y="-501.64508"
+ id="text5110"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5112"
+ x="583.7962"
+ y="-501.64508"
+ style="font-size:9.99999237px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Monospace;-inkscape-font-specification:Monospace">$FP1</tspan><tspan
+ sodipodi:role="line"
+ x="583.7962"
+ y="-489.14508"
+ id="tspan5114"
+ style="font-size:9.99999237px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Monospace;-inkscape-font-specification:Monospace">$FP2</tspan></text>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1.06299126;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 387.1041,-457.97073 271.06934,0"
+ id="path5116"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path5118"
+ d="m 387.1041,-624.50616 271.06934,0"
+ style="fill:none;stroke:#000000;stroke-width:1.06299126;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <text
+ xml:space="preserve"
+ style="font-size:7.9999938px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ x="499.73514"
+ y="-587.20056"
+ id="text5120"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5122"
+ x="499.73514"
+ y="-587.20056"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans">Name:</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text5124"
+ y="-527.61682"
+ x="499.73514"
+ style="font-size:7.9999938px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans"
+ y="-527.61682"
+ x="499.73514"
+ id="tspan5126"
+ sodipodi:role="line">OpenPGP Fingerprint</tspan></text>
+ <image
+ sodipodi:absref="/home/jodersky/gpg/new/$QRCODE"
+ xlink:href="$QRCODE"
+ height="105.35726"
+ width="105.35708"
+ y="-593.03296"
+ x="386.21994"
+ id="image5128" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5130"
+ y="-555.38049"
+ x="583.7962"
+ style="font-size:14.9999876px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans"
+ id="tspan5132"
+ y="-555.38049"
+ x="583.7962"
+ sodipodi:role="line">$NAME</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text5134"
+ y="-501.64508"
+ x="583.7962"
+ style="font-size:14.9999876px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Monospace;-inkscape-font-specification:Monospace"
+ xml:space="preserve"><tspan
+ style="font-size:9.99999237px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Monospace;-inkscape-font-specification:Monospace"
+ y="-501.64508"
+ x="583.7962"
+ id="tspan5136"
+ sodipodi:role="line">$FP1</tspan><tspan
+ style="font-size:9.99999237px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Monospace;-inkscape-font-specification:Monospace"
+ id="tspan5138"
+ y="-489.14508"
+ x="583.7962"
+ sodipodi:role="line">$FP2</tspan></text>
+ <path
+ inkscape:connector-curvature="0"
+ id="path5140"
+ d="m 387.1041,-457.97073 271.06934,0"
+ style="fill:none;stroke:#000000;stroke-width:1.06299126;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1.06299126;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 387.1041,-624.50616 271.06934,0"
+ id="path5142"
+ inkscape:connector-curvature="0" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5144"
+ y="-587.20056"
+ x="499.73514"
+ style="font-size:7.9999938px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans"
+ y="-587.20056"
+ x="499.73514"
+ id="tspan5146"
+ sodipodi:role="line">Name:</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:7.9999938px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ x="499.73514"
+ y="-527.61682"
+ id="text5148"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5150"
+ x="499.73514"
+ y="-527.61682"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans">OpenPGP Fingerprint</tspan></text>
+ <rect
+ style="fill:none;stroke:#999999;stroke-width:0.10629912;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect5152"
+ width="301.1806"
+ height="194.8819"
+ x="372.10925"
+ y="-637.85785" />
+ <image
+ sodipodi:absref="/home/jodersky/gpg/new/$QRCODE"
+ xlink:href="$QRCODE"
+ id="image5154"
+ x="85.039345"
+ y="-787.91486"
+ width="105.35708"
+ height="105.35726" />
+ <text
+ xml:space="preserve"
+ style="font-size:14.9999876px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ x="282.61539"
+ y="-750.26227"
+ id="text5156"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="282.61539"
+ y="-750.26227"
+ id="tspan5158"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">$NAME</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:14.9999876px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Monospace;-inkscape-font-specification:Monospace"
+ x="282.61539"
+ y="-696.52679"
+ id="text5160"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5162"
+ x="282.61539"
+ y="-696.52679"
+ style="font-size:9.99999237px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Monospace;-inkscape-font-specification:Monospace">$FP1</tspan><tspan
+ sodipodi:role="line"
+ x="282.61539"
+ y="-684.02679"
+ id="tspan5164"
+ style="font-size:9.99999237px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Monospace;-inkscape-font-specification:Monospace">$FP2</tspan></text>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1.06299126;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 85.923474,-652.8526 271.069346,0"
+ id="path5166"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path5168"
+ d="m 85.923474,-819.38803 271.069346,0"
+ style="fill:none;stroke:#000000;stroke-width:1.06299126;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <text
+ xml:space="preserve"
+ style="font-size:7.9999938px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ x="198.55431"
+ y="-782.08228"
+ id="text5170"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5172"
+ x="198.55431"
+ y="-782.08228"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans">Name:</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text5174"
+ y="-722.4986"
+ x="198.55431"
+ style="font-size:7.9999938px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans"
+ y="-722.4986"
+ x="198.55431"
+ id="tspan5176"
+ sodipodi:role="line">OpenPGP Fingerprint</tspan></text>
+ <image
+ sodipodi:absref="/home/jodersky/gpg/new/$QRCODE"
+ xlink:href="$QRCODE"
+ height="105.35726"
+ width="105.35708"
+ y="-787.91486"
+ x="85.039345"
+ id="image5178" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5180"
+ y="-750.26227"
+ x="282.61539"
+ style="font-size:14.9999876px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans"
+ id="tspan5182"
+ y="-750.26227"
+ x="282.61539"
+ sodipodi:role="line">$NAME</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text5184"
+ y="-696.52679"
+ x="282.61539"
+ style="font-size:14.9999876px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Monospace;-inkscape-font-specification:Monospace"
+ xml:space="preserve"><tspan
+ style="font-size:9.99999237px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Monospace;-inkscape-font-specification:Monospace"
+ y="-696.52679"
+ x="282.61539"
+ id="tspan5186"
+ sodipodi:role="line">$FP1</tspan><tspan
+ style="font-size:9.99999237px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Monospace;-inkscape-font-specification:Monospace"
+ id="tspan5188"
+ y="-684.02679"
+ x="282.61539"
+ sodipodi:role="line">$FP2</tspan></text>
+ <path
+ inkscape:connector-curvature="0"
+ id="path5190"
+ d="m 85.923474,-652.8526 271.069346,0"
+ style="fill:none;stroke:#000000;stroke-width:1.06299126;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1.06299126;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 85.923474,-819.38803 271.069346,0"
+ id="path5192"
+ inkscape:connector-curvature="0" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5194"
+ y="-782.08228"
+ x="198.55431"
+ style="font-size:7.9999938px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans"
+ y="-782.08228"
+ x="198.55431"
+ id="tspan5196"
+ sodipodi:role="line">Name:</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:7.9999938px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ x="198.55431"
+ y="-722.4986"
+ id="text5198"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5200"
+ x="198.55431"
+ y="-722.4986"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans">OpenPGP Fingerprint</tspan></text>
+ <rect
+ style="fill:none;stroke:#999999;stroke-width:0.10629912;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect5202"
+ width="301.1806"
+ height="194.8819"
+ x="70.928642"
+ y="-832.73975" />
+ <image
+ sodipodi:absref="/home/jodersky/gpg/new/$QRCODE"
+ xlink:href="$QRCODE"
+ height="105.35726"
+ width="105.35708"
+ y="-787.91486"
+ x="386.21994"
+ id="image5204" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5206"
+ y="-750.26227"
+ x="583.7962"
+ style="font-size:14.9999876px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans"
+ id="tspan5208"
+ y="-750.26227"
+ x="583.7962"
+ sodipodi:role="line">$NAME</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text5210"
+ y="-696.52679"
+ x="583.7962"
+ style="font-size:14.9999876px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Monospace;-inkscape-font-specification:Monospace"
+ xml:space="preserve"><tspan
+ style="font-size:9.99999237px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Monospace;-inkscape-font-specification:Monospace"
+ y="-696.52679"
+ x="583.7962"
+ id="tspan5212"
+ sodipodi:role="line">$FP1</tspan><tspan
+ style="font-size:9.99999237px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Monospace;-inkscape-font-specification:Monospace"
+ id="tspan5214"
+ y="-684.02679"
+ x="583.7962"
+ sodipodi:role="line">$FP2</tspan></text>
+ <path
+ inkscape:connector-curvature="0"
+ id="path5216"
+ d="m 387.1041,-652.8526 271.06934,0"
+ style="fill:none;stroke:#000000;stroke-width:1.06299126;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1.06299126;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 387.1041,-819.38803 271.06934,0"
+ id="path5218"
+ inkscape:connector-curvature="0" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5220"
+ y="-782.08228"
+ x="499.73514"
+ style="font-size:7.9999938px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans"
+ y="-782.08228"
+ x="499.73514"
+ id="tspan5222"
+ sodipodi:role="line">Name:</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:7.9999938px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ x="499.73514"
+ y="-722.4986"
+ id="text5224"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5226"
+ x="499.73514"
+ y="-722.4986"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans">OpenPGP Fingerprint</tspan></text>
+ <image
+ sodipodi:absref="/home/jodersky/gpg/new/$QRCODE"
+ xlink:href="$QRCODE"
+ id="image5228"
+ x="386.21994"
+ y="-787.91486"
+ width="105.35708"
+ height="105.35726" />
+ <text
+ xml:space="preserve"
+ style="font-size:14.9999876px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ x="583.7962"
+ y="-750.26227"
+ id="text5230"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="583.7962"
+ y="-750.26227"
+ id="tspan5232"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">$NAME</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:14.9999876px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Monospace;-inkscape-font-specification:Monospace"
+ x="583.7962"
+ y="-696.52679"
+ id="text5234"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5236"
+ x="583.7962"
+ y="-696.52679"
+ style="font-size:9.99999237px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Monospace;-inkscape-font-specification:Monospace">$FP1</tspan><tspan
+ sodipodi:role="line"
+ x="583.7962"
+ y="-684.02679"
+ id="tspan5238"
+ style="font-size:9.99999237px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Monospace;-inkscape-font-specification:Monospace">$FP2</tspan></text>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1.06299126;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 387.1041,-652.8526 271.06934,0"
+ id="path5240"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path5242"
+ d="m 387.1041,-819.38803 271.06934,0"
+ style="fill:none;stroke:#000000;stroke-width:1.06299126;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <text
+ xml:space="preserve"
+ style="font-size:7.9999938px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ x="499.73514"
+ y="-782.08228"
+ id="text5244"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5246"
+ x="499.73514"
+ y="-782.08228"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans">Name:</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text5248"
+ y="-722.4986"
+ x="499.73514"
+ style="font-size:7.9999938px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans"
+ y="-722.4986"
+ x="499.73514"
+ id="tspan5250"
+ sodipodi:role="line">OpenPGP Fingerprint</tspan></text>
+ <rect
+ y="-832.73975"
+ x="372.10925"
+ height="194.8819"
+ width="301.1806"
+ id="rect5252"
+ style="fill:none;stroke:#999999;stroke-width:0.10629912;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ </g>
+</svg>
diff --git a/gpg/card/single.svg b/gpg/card/single.svg
new file mode 100644
index 0000000..12f81c9
--- /dev/null
+++ b/gpg/card/single.svg
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="301.18109"
+ height="194.88188"
+ id="svg2985"
+ version="1.1"
+ inkscape:version="0.48.5 r10040"
+ sodipodi:docname="template.svg">
+ <defs
+ id="defs3" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.8284271"
+ inkscape:cx="62.340776"
+ inkscape:cy="83.395922"
+ inkscape:document-units="mm"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ units="mm"
+ inkscape:window-width="1920"
+ inkscape:window-height="1033"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata2989">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,17.716531)">
+ <image
+ sodipodi:absref="/home/jodersky/gpg/new/$QRCODE"
+ xlink:href="$QRCODE"
+ height="105.35726"
+ width="105.35725"
+ y="27.045778"
+ x="14.173228"
+ id="image9784" />
+ <text
+ xml:space="preserve"
+ style="font-size:15px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ x="211.74934"
+ y="64.697853"
+ id="text2992"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="211.74934"
+ y="64.697853"
+ id="tspan3031"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">$NAME</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:15px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Monospace;-inkscape-font-specification:Monospace"
+ x="211.74934"
+ y="118.43331"
+ id="text3019"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3021"
+ x="211.74934"
+ y="118.43331"
+ style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Monospace;-inkscape-font-specification:Monospace">$FP1</tspan><tspan
+ sodipodi:role="line"
+ x="211.74934"
+ y="130.93332"
+ id="tspan3023"
+ style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Monospace;-inkscape-font-specification:Monospace">$FP2</tspan></text>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1.06299213;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 15.057356,162.10799 271.069784,0"
+ id="path3038"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3808"
+ d="m 15.057356,-4.4274384 271.069784,0"
+ style="fill:none;stroke:#000000;stroke-width:1.06299213;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <text
+ xml:space="preserve"
+ style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ x="127.68821"
+ y="32.877808"
+ id="text2993"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan2995"
+ x="127.68821"
+ y="32.877808"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans">Name:</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text2997"
+ y="92.461502"
+ x="127.68821"
+ style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier;-inkscape-font-specification:Courier"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans"
+ y="92.461502"
+ x="127.68821"
+ id="tspan2999"
+ sodipodi:role="line">OpenPGP Fingerprint</tspan></text>
+ </g>
+</svg>
diff --git a/gpg/skeybase/.gitignore b/gpg/skeybase/.gitignore
new file mode 100644
index 0000000..a893ae6
--- /dev/null
+++ b/gpg/skeybase/.gitignore
@@ -0,0 +1,9 @@
+/target/
+/project/target/
+/project/project/
+
+.settings
+.project
+.classpath
+.cache
+*~ \ No newline at end of file
diff --git a/gpg/skeybase/project/Build.scala b/gpg/skeybase/project/Build.scala
new file mode 100644
index 0000000..df7d007
--- /dev/null
+++ b/gpg/skeybase/project/Build.scala
@@ -0,0 +1,28 @@
+import sbt._
+import Keys._
+
+object ApplicationBuild extends Build {
+
+ lazy val commonSettings = Seq(
+ scalaVersion := "2.11.6",
+ scalacOptions ++= Seq("-deprecation", "-feature")
+ )
+
+ lazy val skeybase = (
+ Project("skeybase", file("."))
+ settings(commonSettings: _*)
+ settings(
+ resolvers += "spray repo" at "http://repo.spray.io",
+ libraryDependencies ++= Seq(
+ "io.spray" %% "spray-can" % "1.3.3",
+ "io.spray" %% "spray-httpx" % "1.3.3",
+ "io.spray" %% "spray-client" % "1.3.3",
+ "io.spray" %% "spray-json" % "1.3.1",
+ "com.typesafe.akka" %% "akka-actor" % "2.3.9",
+ "net.sourceforge.htmlcleaner" % "htmlcleaner" % "2.10",
+ "org.apache.commons" % "commons-lang3" % "3.4"
+ )
+ )
+ )
+
+}
diff --git a/gpg/skeybase/project/build.properties b/gpg/skeybase/project/build.properties
new file mode 100644
index 0000000..748703f
--- /dev/null
+++ b/gpg/skeybase/project/build.properties
@@ -0,0 +1 @@
+sbt.version=0.13.7
diff --git a/gpg/skeybase/src/main/scala/com/github/jodersky/skeybase/Keybase.scala b/gpg/skeybase/src/main/scala/com/github/jodersky/skeybase/Keybase.scala
new file mode 100644
index 0000000..bfc246e
--- /dev/null
+++ b/gpg/skeybase/src/main/scala/com/github/jodersky/skeybase/Keybase.scala
@@ -0,0 +1,61 @@
+package com.github.jodersky.skeybase
+
+import scala.concurrent.Future
+
+import akka.actor.ActorSystem
+import spray.client.pipelining.Get
+import spray.client.pipelining.WithTransformerConcatenation
+import spray.client.pipelining.sendReceive
+import spray.client.pipelining.sendReceive$default$3
+import spray.client.pipelining.unmarshal
+import spray.httpx.SprayJsonSupport.sprayJsonUnmarshaller
+import spray.json.DefaultJsonProtocol
+import spray.json.DeserializationException
+import spray.json.JsArray
+import spray.json.JsObject
+import spray.json.JsValue
+import spray.json.RootJsonFormat
+
+object Keybase {
+ def origin = new Keybase("https://keybase.io")
+
+ object JsonProtocol extends DefaultJsonProtocol {
+ implicit val basicsFormat = jsonFormat1(Basics.apply)
+ implicit val proofFormat = jsonFormat(Proof.apply, "nametag", "proof_type", "proof_url")
+
+ implicit object PrimaryKeyFormat extends RootJsonFormat[PublicKey] {
+ def write(key: PublicKey) = throw new NotImplementedError
+ def read(value: JsValue) = value.asJsObject.getFields("primary") match {
+ case Seq(JsObject(data)) => data.get("key_fingerprint") map (f => PublicKey(f.convertTo[String].toUpperCase())) getOrElse {
+ throw new DeserializationException("Fingerprint expected")
+ }
+ case _ => throw new DeserializationException("Primary key expected")
+ }
+ }
+
+ implicit object ProofsFormat extends RootJsonFormat[Seq[Proof]] {
+ def write(proofs: Seq[Proof]) = throw new NotImplementedError
+ def read(value: JsValue) = value.asJsObject.getFields("all") match {
+ case Seq(JsArray(values)) => values.map(_.convertTo[Proof])
+ case _ => throw new DeserializationException("Proofs array expected")
+ }
+ }
+ implicit val userFormat = jsonFormat(User.apply, "basics", "proofs_summary", "public_keys")
+ implicit val lookupFormat = jsonFormat1(LookupResponse.apply)
+ }
+}
+
+class Keybase(host: String) {
+
+ import Keybase.JsonProtocol._
+
+ def lookup(username: String)(implicit system: ActorSystem): Future[User] = {
+ import system.dispatcher
+
+ val lookup = sendReceive ~> unmarshal[LookupResponse]
+ val url = host + "/_/api/1.0/user/lookup.json?usernames=" + username + "&fields=proofs_summary,public_keys"
+
+ lookup(Get(url)).map(_.them.head)
+ }
+
+} \ No newline at end of file
diff --git a/gpg/skeybase/src/main/scala/com/github/jodersky/skeybase/Main.scala b/gpg/skeybase/src/main/scala/com/github/jodersky/skeybase/Main.scala
new file mode 100644
index 0000000..1553b96
--- /dev/null
+++ b/gpg/skeybase/src/main/scala/com/github/jodersky/skeybase/Main.scala
@@ -0,0 +1,39 @@
+package com.github.jodersky.skeybase
+
+import scala.concurrent.Await
+import scala.concurrent.duration._
+import akka.actor.ActorSystem
+import scala.language.implicitConversions
+import scala.util.Success
+import scala.util.Failure
+import openpgp.GnuPG
+import verification.GitHubVerifier
+import verification.VerificationException
+
+object Main {
+
+ def main(args: Array[String]): Unit = {
+ implicit val system = ActorSystem()
+ import system.dispatcher
+
+ val verifier = new GitHubVerifier(new GnuPG())
+
+ val proofs = for (
+ user <- Keybase.origin.lookup("jodersky");
+ github = user.proofs.find(_.proofType == "github").get;
+ verification <- verifier.verify(user.key.fingerprint, github)
+ ) yield {
+ verification
+ }
+
+ proofs onComplete { result =>
+ result match {
+ case Success(proof) => println("done")
+ case Failure(err: VerificationException) => println("Verification exception! Someone may be doing something nasty.")
+ case Failure(err) => err.printStackTrace()
+ }
+ system.shutdown()
+ }
+ }
+
+} \ No newline at end of file
diff --git a/gpg/skeybase/src/main/scala/com/github/jodersky/skeybase/openpgp/Backend.scala b/gpg/skeybase/src/main/scala/com/github/jodersky/skeybase/openpgp/Backend.scala
new file mode 100644
index 0000000..108ee00
--- /dev/null
+++ b/gpg/skeybase/src/main/scala/com/github/jodersky/skeybase/openpgp/Backend.scala
@@ -0,0 +1,18 @@
+package com.github.jodersky.skeybase
+package openpgp
+
+import scala.util.Try
+
+trait Backend {
+
+ /** Imports a key into this backend so that it is available for verification. */
+ def importKey(key: String): Unit
+
+ /**
+ * verifies a signed statement.
+ * @param signed the statement to verify
+ * @param fingerprint the fingerprint of the key that allegedly signed this statement
+ */
+ def verifySignature(signed: String, fingerprint: String): Try[String]
+
+} \ No newline at end of file
diff --git a/gpg/skeybase/src/main/scala/com/github/jodersky/skeybase/openpgp/GnuPG.scala b/gpg/skeybase/src/main/scala/com/github/jodersky/skeybase/openpgp/GnuPG.scala
new file mode 100644
index 0000000..3b2d152
--- /dev/null
+++ b/gpg/skeybase/src/main/scala/com/github/jodersky/skeybase/openpgp/GnuPG.scala
@@ -0,0 +1,58 @@
+package com.github.jodersky.skeybase
+package openpgp
+
+import java.io.File
+import scala.sys.process._
+import java.io.ByteArrayInputStream
+import scala.collection.mutable.ArrayBuffer
+import verification.VerificationException
+import scala.util.Try
+
+class GnuPG(
+ val home: File = new File("."),
+ val command: String = "/usr/bin/gpg")
+ extends Backend {
+
+ import GnuPG._
+
+ private val _gpg = s"${command} --home=${home.getAbsolutePath} --no-default-keyring --keyring=temp.gpg --status-fd=2"
+ private def gpg(args: String) = _gpg + " " + args
+
+ def importKey(key: String) = {
+ val result = (gpg("--import -") #< stream(key)).!
+ result == 0
+ }
+
+ def verifySignature(statement: String, fingerprint: String): Try[String] = Try{
+ val stdout = new StringBuilder
+ val stderr = new ArrayBuffer[String]
+
+ val status = (gpg("-d -") #< stream(statement)) ! ProcessLogger(stdout append _, stderr append _)
+
+ if (status != 0) throw new VerificationException("gpg exited with non-zero exit code")
+
+ /* see doc/DETAILS of GnuPG for more information about structure */
+ def fpr(line: String) = """\[GNUPG:\] VALIDSIG (\S+\s+){9}(\w+)""".r findPrefixMatchOf (line) map { m =>
+ m.group(2)
+ }
+
+ val valid = stderr find (fpr(_) == Some(fingerprint))
+
+ if (valid.isEmpty) {
+ throw new VerificationException("Statement is not signed by the correct key.")
+ } else {
+ stdout.toString()
+ }
+ }
+
+}
+
+object GnuPG {
+
+ private def stream(str: String) = {
+ val bytes = str.getBytes("UTF-8")
+ new ByteArrayInputStream(bytes)
+ }
+
+ val tmp = "~/.skeybase"
+} \ No newline at end of file
diff --git a/gpg/skeybase/src/main/scala/com/github/jodersky/skeybase/responses.scala b/gpg/skeybase/src/main/scala/com/github/jodersky/skeybase/responses.scala
new file mode 100644
index 0000000..79ff9be
--- /dev/null
+++ b/gpg/skeybase/src/main/scala/com/github/jodersky/skeybase/responses.scala
@@ -0,0 +1,7 @@
+package com.github.jodersky.skeybase
+
+case class PublicKey(fingerprint: String)
+case class Proof(nametag: String, proofType: String, proofUrl: String)
+case class Basics(username: String)
+case class LookupResponse(them: Seq[User])
+case class User(basics: Basics, proofs: Seq[Proof], key: PublicKey) \ No newline at end of file
diff --git a/gpg/skeybase/src/main/scala/com/github/jodersky/skeybase/verification/GitHubVerifier.scala b/gpg/skeybase/src/main/scala/com/github/jodersky/skeybase/verification/GitHubVerifier.scala
new file mode 100644
index 0000000..5243b36
--- /dev/null
+++ b/gpg/skeybase/src/main/scala/com/github/jodersky/skeybase/verification/GitHubVerifier.scala
@@ -0,0 +1,64 @@
+package com.github.jodersky.skeybase
+package verification
+
+import scala.concurrent.Future
+
+import Verifier.extractSignedStatement
+import Verifier.finalHost
+import Verifier.verifyStatement
+import Verifier.withRedirects
+import akka.actor.ActorSystem
+import openpgp.Backend
+import spray.client.pipelining.Get
+import spray.client.pipelining.WithTransformerConcatenation
+import spray.client.pipelining.sendReceive
+import spray.client.pipelining.sendReceive$default$3
+import spray.client.pipelining.unmarshal
+import spray.httpx.SprayJsonSupport.sprayJsonUnmarshaller
+import spray.json.DefaultJsonProtocol
+
+object GitHubVerifier {
+ case class GistFile(rawUrl: String)
+ case class Gist(url: String, files: Map[String, GistFile])
+
+ object GitHubProtocol extends DefaultJsonProtocol {
+ implicit val gistFileFormat = jsonFormat(GistFile, "raw_url")
+ implicit val gistFormat = jsonFormat2(Gist)
+ }
+}
+
+class GitHubVerifier(backend: Backend) extends Verifier {
+ import Verifier._
+ import GitHubVerifier._
+ import GitHubVerifier.GitHubProtocol._
+
+ def verify(fingerprint: String, proof: Proof)(implicit sys: ActorSystem) = {
+ import sys.dispatcher
+
+ val urlOfHeadGist = (gists: Seq[Gist]) => {
+ val url = for (
+ gist <- gists.headOption;
+ (_, file) <- gist.files.headOption
+ ) yield {
+ file.rawUrl
+ }
+ url getOrElse {
+ throw new NoSuchElementException("No gist found.")
+ }
+ }
+ val gistPipeline = withRedirects(sendReceive) ~> finalHost("api.github.com").tupled ~> unmarshal[Seq[Gist]] ~> urlOfHeadGist
+ val rawPipeline = sendReceive ~> unmarshal[String]
+
+ for (
+ rawUrl <- gistPipeline(Get("https://api.github.com/users/" + proof.nametag + "/gists"));
+ content <- rawPipeline(Get(rawUrl));
+ signed <- extractSignedStatement(content);
+ clear <- backend.verifySignature(signed, fingerprint);
+ verified <- verifyStatement(clear, "github", proof.nametag)
+ ) yield {
+ proof
+ }
+ }
+
+}
+ \ No newline at end of file
diff --git a/gpg/skeybase/src/main/scala/com/github/jodersky/skeybase/verification/VerificationException.scala b/gpg/skeybase/src/main/scala/com/github/jodersky/skeybase/verification/VerificationException.scala
new file mode 100644
index 0000000..a7c1f78
--- /dev/null
+++ b/gpg/skeybase/src/main/scala/com/github/jodersky/skeybase/verification/VerificationException.scala
@@ -0,0 +1,4 @@
+package com.github.jodersky.skeybase
+package verification
+
+class VerificationException(message: String) extends RuntimeException(message) \ No newline at end of file
diff --git a/gpg/skeybase/src/main/scala/com/github/jodersky/skeybase/verification/Verifier.scala b/gpg/skeybase/src/main/scala/com/github/jodersky/skeybase/verification/Verifier.scala
new file mode 100644
index 0000000..6025fef
--- /dev/null
+++ b/gpg/skeybase/src/main/scala/com/github/jodersky/skeybase/verification/Verifier.scala
@@ -0,0 +1,109 @@
+package com.github.jodersky.skeybase
+package verification
+
+import scala.language.implicitConversions
+
+import scala.concurrent.ExecutionContext
+import scala.concurrent.Future
+import scala.util.Failure
+import scala.util.Success
+import scala.util.Try
+
+import com.github.jodersky.skeybase.Proof
+import com.github.jodersky.skeybase.PublicKey
+
+import akka.actor.ActorSystem
+import spray.http.HttpHeaders.Location
+import spray.http.HttpRequest
+import spray.http.HttpResponse
+import spray.http.Uri
+import spray.json.DefaultJsonProtocol
+import spray.json.JsonParser
+import spray.json.ParserInput.apply
+
+trait Verifier {
+
+ def verify(fingerprint: String, proof: Proof)(implicit sys: ActorSystem): Future[Proof]
+
+}
+
+object Verifier {
+
+ object JsonProtocol extends DefaultJsonProtocol {
+ implicit val serviceFormat = jsonFormat2(Service.apply)
+ implicit val keyFormat = jsonFormat1(PublicKey.apply)
+ implicit val statementBodyFormat = jsonFormat2(StatementBody.apply)
+ implicit val statementFormat = jsonFormat1(Statement.apply)
+ }
+ import JsonProtocol._
+
+ implicit def tryToFuture[A](t: Try[A]): Future[A] = t match {
+ case Success(a) => Future.successful(a)
+ case Failure(e) => Future.failed(e)
+ }
+
+ def withRedirects(
+ sendReceive: HttpRequest => Future[HttpResponse],
+ maxRedirects: Int = 5)(implicit ec: ExecutionContext): HttpRequest => Future[(Uri, HttpResponse)] = { request =>
+
+ def dispatch(request: HttpRequest, redirectsLeft: Int): Future[(Uri, HttpResponse)] = if (redirectsLeft <= 0) {
+ Future.failed(new RuntimeException("Too many redirects."))
+ } else {
+ sendReceive(request).flatMap { response =>
+ if (response.status.value.startsWith("3")) {
+ response.header[Location].map { location =>
+ dispatch(request.copy(uri = location.uri), redirectsLeft - 1)
+ } getOrElse {
+ Future.failed(new RuntimeException("Missing location header in redirect response."))
+ }
+ } else {
+ Future.successful(request.uri, response)
+ }
+ }
+ }
+
+ dispatch(request, maxRedirects)
+ }
+
+ def finalHost(host: String) = (uri: Uri, response: HttpResponse) => {
+ if (uri.authority.host.address != host)
+ throw new VerificationException("Final host is not " + host)
+ else
+ response
+ }
+
+ def extractSignedStatement(content: String): Try[String] = Try {
+ val regex = """(-----BEGIN PGP MESSAGE-----(.|\n)*-----END PGP MESSAGE-----?)""".r
+ regex.findFirstIn(content) getOrElse {
+ throw new VerificationException("No OpenPGP message found.")
+ }
+ }
+
+ def verifyStatement(statement: String, service: String, username: String): Try[String] = Try {
+ val stmt = JsonParser(statement).convertTo[Statement]
+
+ if (stmt.body.service.name != service) throw new VerificationException(
+ "The service specified in the signed statement (" + stmt.body.service.name + ") is not " +
+ "the same as the service under which the statement was found (" + service + ")")
+ else if (stmt.body.service.username != username) throw new VerificationException(
+ "The username specified in the signed statement (" + stmt.body.service.username + ") is not " +
+ "the same as the username under which the statement was found (" + username + ")")
+ else statement
+
+ }
+
+ /*
+ * if (!(uri.path.tail startsWith (Path(proof.nametag)))) {
+ * throw new VerificationException("Final github account does not match the one provided in the proof." + uri.path.head)
+ * }
+
+
+ def extractHtmlId(id: String, html: String): Option[String] = {
+ val cleaner = new HtmlCleaner
+ val root = cleaner.clean(html)
+ root.getElementsByName("div", true).find(_.getAttributeByName("id") == id).map { div =>
+ StringEscapeUtils.unescapeHtml4(div.getText.toString())
+ }
+ }*/
+
+} \ No newline at end of file
diff --git a/gpg/skeybase/src/main/scala/com/github/jodersky/skeybase/verification/WebsiteFileVerifier.scala b/gpg/skeybase/src/main/scala/com/github/jodersky/skeybase/verification/WebsiteFileVerifier.scala
new file mode 100644
index 0000000..04cad1e
--- /dev/null
+++ b/gpg/skeybase/src/main/scala/com/github/jodersky/skeybase/verification/WebsiteFileVerifier.scala
@@ -0,0 +1,39 @@
+package com.github.jodersky.skeybase
+package verification
+
+import scala.concurrent.Future
+
+
+import Verifier.extractSignedStatement
+import Verifier.finalHost
+import Verifier.verifyStatement
+import Verifier.withRedirects
+import akka.actor.ActorSystem
+import openpgp.Backend
+import spray.client.pipelining.Get
+import spray.client.pipelining.WithTransformerConcatenation
+import spray.client.pipelining.sendReceive
+import spray.client.pipelining.sendReceive$default$3
+import spray.client.pipelining.unmarshal
+import spray.httpx.SprayJsonSupport.sprayJsonUnmarshaller
+import spray.json.DefaultJsonProtocol
+
+class WebsiteFileVerifier(backend: Backend) extends Verifier {
+ import Verifier._
+
+ def verify(fingerprint: String, proof: Proof)(implicit sys: ActorSystem) = {
+ import sys.dispatcher
+
+ val pipeline = withRedirects(sendReceive) ~> finalHost(proof.nametag).tupled ~> unmarshal[String]
+ for (
+ content <- pipeline(Get(proof.proofUrl));
+ signed <- extractSignedStatement(content);
+ clear <- backend.verifySignature(signed, fingerprint);
+ verified <- verifyStatement(clear, "github", proof.nametag)
+ ) yield {
+ proof
+ }
+ }
+
+}
+ \ No newline at end of file
diff --git a/gpg/skeybase/src/main/scala/com/github/jodersky/skeybase/verification/statements.scala b/gpg/skeybase/src/main/scala/com/github/jodersky/skeybase/verification/statements.scala
new file mode 100644
index 0000000..cbe896f
--- /dev/null
+++ b/gpg/skeybase/src/main/scala/com/github/jodersky/skeybase/verification/statements.scala
@@ -0,0 +1,6 @@
+package com.github.jodersky.skeybase
+package verification
+
+case class Service(name: String, username: String)
+case class StatementBody(key: PublicKey, service: Service)
+case class Statement(body: StatementBody) \ No newline at end of file
diff --git a/ssl/manual-procedure.txt b/ssl/manual-procedure.txt
new file mode 100644
index 0000000..a0d0c55
--- /dev/null
+++ b/ssl/manual-procedure.txt
@@ -0,0 +1,25 @@
+Root certificate
+================
+
+1) generate private key
+openssl genpkey -algorithm RSA -out root.key.pem -pkeyopt rsa_keygen_bits:4096 -aes-256-cbc
+
+2) create root certificate signing request
+openssl req -new -key root.key.pem -out root.req.pem
+
+3) self-sign root certificate request
+openssl x509 -req -in root.req.pem -extfile openssl.cnf -extensions v3_ca -days 3650 -signkey root.key.pem -out root.cert.pem
+
+
+Server certificate
+==================
+
+1) generate private key, same procedure as root
+
+2) create certificate signing request
+openssl req -new -key server.key.pem -out server.req.pem
+
+3) sign certificate
+openssl x509 -req -in server.req.pem -extfile openssl.cnf -extensions v3_usr -CA root.cert.pem -CAkey root.key.pem -CAcreateserial
+
+
diff --git a/ssl/uca/README.md b/ssl/uca/README.md
new file mode 100644
index 0000000..ac6fceb
--- /dev/null
+++ b/ssl/uca/README.md
@@ -0,0 +1,11 @@
+# uca - The Microscopic Certificate Authority
+Uca (mu-c-a) is a tiny wrapper script around OpenSSL for managing certificates.
+
+## Usage
+1. Setup a new authority: creates a new root certificate and serial counter.
+ ```./uca setup```
+
+2. Issue a new certificate: create a new certificate and sign it with the root certificate.
+ ```./uca issue <name>```
+
+Run `uca` without any options for help. \ No newline at end of file
diff --git a/ssl/uca/uca b/ssl/uca/uca
new file mode 100755
index 0000000..625f684
--- /dev/null
+++ b/ssl/uca/uca
@@ -0,0 +1,78 @@
+#!/bin/bash -e
+
+# configuration variables (change at will)
+CONFIG="/etc/ssl/openssl.cnf"
+CERT_SUFFIX=".cert.pem"
+KEY_SUFFIX=".key.pem"
+REQ_SUFFIX=".req.pem"
+
+# global variables set through parameters
+CA=${CA:-root}
+CA_CERT="${CA}${CERT_SUFFIX}"
+CA_KEY="${CA}${KEY_SUFFIX}"
+CA_SERIAL="${CA}.srl"
+
+# print usage
+print_usage() {
+ cat <<- EOF
+ uca - a certificate authority of micro complexity
+
+ uca setup
+ uca issue cert
+
+ Environment Variables:
+ CA name of certificate authority
+EOF
+}
+
+# generate new certificate authority
+new_ca() {
+ local ca_req="${CA}${REQ_SUFFIX}"
+
+ openssl genpkey -algorithm RSA -out "$CA_KEY" -pkeyopt rsa_keygen_bits:4096 #-aes-256-cbc
+ openssl req -new -key "$CA_KEY" -out "$ca_req"
+ openssl x509 -req -in "$ca_req" -extfile "$CONFIG" -extensions v3_ca -days 3650 -signkey "$CA_KEY" -out "$CA_CERT"
+
+ echo "01" > "$CA_SERIAL"
+
+ rm -f "$reqfile"
+}
+
+# issue new certificate
+# $1 name of new certificate
+issue() {
+ local keyfile="${1}${KEY_SUFFIX}"
+ local reqfile="${1}${REQ_SUFFIX}"
+ local certfile="${1}${CERT_SUFFIX}"
+
+ echo $certfile
+
+ openssl genpkey -algorithm RSA -out "$keyfile" -pkeyopt rsa_keygen_bits:4096
+ openssl req -new -key "$keyfile" -out "$reqfile"
+ openssl x509 -req -in "$reqfile" -extfile "$CONFIG" -extensions usr_cert -CA "$CA_CERT" -CAkey "$CA_KEY" -CAserial "$CA_SERIAL" -out "$certfile"
+
+ rm -f "$reqfile"
+}
+
+
+case "$1" in
+ setup)
+ new_ca
+ exit 0
+ ;;
+
+ issue)
+ if [ -e "$CA_CERT" ] && [ -e "$CA_KEY" ]; then
+ echo $2
+ issue $2
+ exit 0
+ else
+ echo "no root certificate and key found"
+ exit 1
+ fi
+ ;;
+
+ *)
+ print_usage
+ exit 0
+esac \ No newline at end of file