diff options
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 Binary files differnew file mode 100644 index 0000000..c484212 --- /dev/null +++ b/gpg/card/dist/card.pdf 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 |