fixed key generation, now the ed25519 key is derived from a seed

and the curve25519 key is derived from the ed25519 key. the encrypted
part now contains the ed25519 secret.
This commit is contained in:
TLINDEN
2013-11-10 14:25:36 +01:00
parent 74a66e7456
commit 71d7121c87
17 changed files with 312 additions and 192 deletions

View File

@@ -1,3 +1,10 @@
0.1.4 Changed key format (again), now the main secret
is the ED25519 secret key, which will be encrypted.
Everything else will be derived from that. Thanks
to S.Neives and "CodesInChaos" from the libsodium
mailinglist for clarifying it and helping me to
understand it.
0.1.3 Added signature support using ED25519.
Key format has changed it now contains the ed25519

View File

@@ -1 +1 @@
0.1.3
0.1.4

View File

@@ -45,7 +45,7 @@ typedef unsigned int qbyte; // Quad byte = 32 bits
#define PCP_ME "Pretty Curved Privacy"
#define PCP_KEY_VERSION 0x00000002U
#define PCP_KEY_VERSION 0x00000003U
#define PCP_KEY_PRIMITIVE "CURVE25519-ED25519-SALSA20-POLY1305"
#define PCP_KEY_TYPE_MAINSECRET 0x01

View File

@@ -46,9 +46,10 @@ extern "C" {
PCP private key structure. Most fields are self explanatory.
Some notes:
'encrypted' contains the encrypted secret key. If it's set,
'encrypted' contains the encrypted ed25519 secret key. If it's set,
the field 'secret' which contains the clear secret key will
be zeroed with random values, the first byte will be 0.
be zeroed with random values, the first byte will be 0. Same
for the field 'edsecret'.
'nonce' contains the nonce required to decrypt the encrypted
secret, if set.
@@ -80,8 +81,9 @@ struct _pcp_key_t {
byte public[32];
byte secret[32];
byte edpub[32];
byte edsecret[64];
byte nonce[24];
byte encrypted[48];
byte encrypted[80];
char owner[255];
char mail[255];
char id[17];
@@ -114,6 +116,9 @@ pcp_pubkey_t *pcppubkey_hash;
void pcp_cleanhashes();
pcp_key_t *pcpkey_new ();
void pcp_keypairs(byte *csk, byte *cpk, byte *esk, byte *epk, byte *seed);
void pcp_ed_keypairs(byte *csk, byte *esk);
char *pcppubkey_get_art(pcp_pubkey_t *k);
char *pcpkey_get_art(pcp_key_t *k);

View File

@@ -25,7 +25,7 @@
#define PCP_VERSION_MAJOR 0
#define PCP_VERSION_MINOR 1
#define PCP_VERSION_PATCH 3
#define PCP_VERSION_PATCH 4
#define PCP_MAKE_VERSION(major, minor, patch) \
((major) * 10000 + (minor) * 100 + (patch))

View File

@@ -22,49 +22,49 @@
#include "ed.h"
int pcp_ed_verify(unsigned char *input, size_t inputlen, pcp_sig_t *sig, pcp_pubkey_t *p) {
unsigned char *hash = ucmalloc(crypto_hash_sha256_BYTES + crypto_sign_BYTES); // from sig
unsigned char *check = ucmalloc(crypto_hash_sha256_BYTES); // from file
unsigned char *message = ucmalloc(inputlen);
unsigned char *tmpsig = ucmalloc(inputlen + crypto_sign_BYTES); // from sig
size_t mlen = 0;
if(crypto_sign_open(hash, &mlen, sig->edsig, crypto_hash_sha256_BYTES + crypto_sign_BYTES, p->edpub) != 0) {
memcpy(tmpsig, sig->edsig, crypto_sign_BYTES);
memcpy(&tmpsig[crypto_sign_BYTES], input, inputlen);
if(crypto_sign_open(message, &mlen, tmpsig, inputlen + crypto_sign_BYTES, p->edpub) != 0) {
fatal("Failed to open the signature using the public key 0x%s!\n", p->id);
goto errve1;
}
crypto_hash_sha256(check, input, inputlen);
if(memcmp(check, hash, crypto_hash_sha256_BYTES) != 0) {
fatal("Failed to verify the signature, hashes differ!\n");
if(memcmp(message, input, inputlen) != 0) {
fatal("Failed to verify the signature, signed messages differ!\n");
goto errve1;
}
free(hash);
free(check);
free(tmpsig);
free(message);
return 0;
errve1:
free(hash);
free(check);
free(message);
free(tmpsig);
return 1;
}
pcp_sig_t *pcp_ed_sign(unsigned char *message, size_t messagesize, pcp_key_t *s) {
byte edpub[32] = { 0 };
byte edsec[64] = { 0 };
size_t mlen = messagesize + crypto_sign_BYTES;
unsigned char *tmp = ucmalloc(mlen);
unsigned char *signature = ucmalloc(crypto_sign_BYTES);
crypto_sign_seed_keypair(edpub, edsec, s->secret);
crypto_sign(tmp, &mlen, message, messagesize, s->edsecret);
unsigned char *hash = ucmalloc(crypto_hash_sha256_BYTES);
size_t slen = crypto_hash_sha256_BYTES + crypto_sign_BYTES;
unsigned char *signature = ucmalloc(slen);
crypto_hash_sha256(hash, message, messagesize);
crypto_sign(signature, &slen, hash, crypto_hash_sha256_BYTES, edsec);
memcpy(signature, tmp, crypto_sign_BYTES);
pcp_sig_t *sig = pcp_ed_newsig(signature, s->id);
memset(tmp, 0, mlen);
free(tmp);
return sig;
}

View File

@@ -66,28 +66,54 @@ char *pcp_getkeyid(pcp_key_t *k) {
return id;
}
void pcp_keypairs(byte *csk, byte *cpk, byte *esk, byte *epk, byte *seed) {
// generate ed25519 + curve25519 keypair from random seed
byte tmp[64];
crypto_sign_seed_keypair(epk, esk, seed);
crypto_hash_sha512(tmp, seed, 32);
tmp[0] &= 248;
tmp[31] &= 63;
tmp[31] |= 64;
memcpy(csk, tmp, 32);
crypto_scalarmult_curve25519_base(cpk, csk);
memset(tmp, 0, 64);
}
void pcp_ed_keypairs(byte *csk, byte *esk) {
// re-generate (derive) curve25519 secret from ed25519 secret
// (1st half = seed, 2nd half = pub)
byte tmp[64];
byte seed[32];
memcpy(seed, esk, 32);
crypto_hash_sha512(tmp, seed, 32);
tmp[0] &= 248;
tmp[31] &= 63;
tmp[31] |= 64;
memcpy(csk, tmp, 32);
memset(tmp, 0, 64);
}
pcp_key_t * pcpkey_new () {
byte public[32] = { 0 };
byte secret[32] = { 0 };
byte edpub[32] = { 0 };
byte edsec[64] = { 0 };
byte *seed = urmalloc(32);
// generate curve 25519 keypair
if(crypto_box_keypair (public, secret) != 0) {
fatal("Failed to generate a CURVE25519 keypair!\n");
return NULL;
}
// generate ed25519 keypair from box secret
crypto_sign_seed_keypair(edpub, edsec, secret);
pcp_keypairs(secret, public, edsec, edpub, seed);
// fill in our struct
pcp_key_t *key = urmalloc(sizeof(pcp_key_t));
memcpy (key->public, public, 32);
memcpy (key->secret, secret, 32);
memcpy (key->id, pcp_getkeyid(key), 17);
memcpy (key->edpub, edpub, 32);
memcpy (key->edsecret, edsec, 64);
memcpy (key->id, pcp_getkeyid(key), 17);
key->ctime = (long)time(0);
@@ -114,16 +140,18 @@ pcp_key_t *pcpkey_encrypt(pcp_key_t *key, char *passphrase) {
unsigned char *encrypted;
size_t es;
es = pcp_sodium_mac(&encrypted, key->secret, 32, key->nonce, encryptkey);
es = pcp_sodium_mac(&encrypted, key->edsecret, 64, key->nonce, encryptkey);
memset(encryptkey, 0, 32);
free(encryptkey);
if(es == 48) {
if(es == 80) {
// success
memcpy(key->encrypted, encrypted, 48);
memcpy(key->encrypted, encrypted, 80);
arc4random_buf(key->secret, 32);
arc4random_buf(key->edsecret, 64);
key->secret[0] = 0;
key->edsecret[0] = 0;
}
else {
fatal("failed to encrypt the secret key!\n");
@@ -139,14 +167,18 @@ pcp_key_t *pcpkey_decrypt(pcp_key_t *key, char *passphrase) {
unsigned char *decrypted;
size_t es;
es = pcp_sodium_verify_mac(&decrypted, key->encrypted, 48, key->nonce, encryptkey);
es = pcp_sodium_verify_mac(&decrypted, key->encrypted, 80, key->nonce, encryptkey);
memset(encryptkey, 0, 32);
free(encryptkey);
if(es == 0) {
// success
memcpy(key->secret, decrypted, 32);
byte secret[32] = { 0 };
byte edsec[64] = { 0 };
pcp_ed_keypairs(secret, decrypted);
memcpy(key->secret, secret, 32);
memcpy(key->edsecret, decrypted, 64);
}
else {
fatal("failed to decrypt the secret key (got %d, expected 32)!\n", es);
@@ -264,55 +296,41 @@ pcp_pubkey_t *pubkey2native(pcp_pubkey_t *k) {
pcp_key_t *pcp_derive_pcpkey (pcp_key_t *ours, char *theirs) {
byte edpub[32] = { 0 };
byte edsec[64] = { 0 };
byte public[32] = { 0 };
byte secret[32] = { 0 };
byte *seed = ucmalloc(32);
size_t thlen = strnlen(theirs, 255);
size_t inlen = 32 + thlen;
size_t inlen = 64 + thlen;
unsigned char *both = ucmalloc(inlen);
unsigned char *hash = ucmalloc(crypto_hash_BYTES);
memcpy(both, ours->secret, 32);
memcpy(&both[32], theirs, thlen);
memcpy(both, ours->edsecret, 64);
memcpy(&both[64], theirs, thlen);
if(crypto_hash(hash, both, inlen) != 0) {
if(crypto_hash(seed, both, inlen) != 0) {
fatal("Failed to generate a hash of our pub key and recipient id!\n");
goto errdp1;
}
unsigned char *xor = ucmalloc(crypto_secretbox_KEYBYTES);
unsigned char *secret = ucmalloc(crypto_secretbox_KEYBYTES);
int i;
for(i=0; i<crypto_secretbox_KEYBYTES; ++i) {
xor[i] = hash[i] ^ hash[i + crypto_secretbox_KEYBYTES];
}
xor[0] &= 248;
xor[31] &= 127;
xor[31] |= 64;
memcpy(secret, xor, crypto_secretbox_KEYBYTES);
pcp_keypairs(secret, public, edsec, edpub, seed);
pcp_key_t * tmp = pcpkey_new ();
memcpy(tmp->secret, secret, 32);
// calculate pub from secret
crypto_scalarmult_curve25519_base(tmp->public, tmp->secret);
// generate ed25519 keypair from box secret
crypto_sign_seed_keypair(edpub, edsec, tmp->secret);
memcpy(tmp->edpub, edpub, 32);
memcpy(tmp->edsecret, edsec, 64);
memcpy(tmp->public, public, 32);
memcpy(tmp->owner, ours->owner, 255);
memcpy(tmp->mail, ours->mail, 255);
memcpy(tmp->id, pcp_getkeyid(tmp), 17);
memcpy(tmp->edpub, edpub, 32);
memset(both, 0, inlen);
memset(xor, 0, crypto_secretbox_KEYBYTES);
memset(hash, 0, crypto_hash_BYTES);
memset(seed, 0, 32);
free(both);
free(xor);
free(hash);
free(seed);
return tmp;

View File

@@ -1,3 +1,4 @@
# -*-perl-*-
=head1 PCP1 KEYS
@@ -212,6 +213,8 @@ A secret key is a binary structure with the following format:
+-------------|--------|----------------------------------+
| ED25519 Pub | 32 | ED25519 Public Key Part |
+-------------|--------|----------------------------------+
| ED25519 Sec | 64 | ED25519 Secret Key Unencrypted |
+-------------|--------|----------------------------------+
| Nonce | 24 | Nonce for secret key encryption |
+-------------|--------|----------------------------------+
| Encrypted | 48 | Encrypted Curve25519 Secret Key |
@@ -233,7 +236,7 @@ A secret key is a binary structure with the following format:
Some notes:
The secret key field will be filled with random data if the
The secret key fields will be filled with random data if the
key is encrypted. The first byte of it will be set to 0 in that
case.
@@ -249,6 +252,36 @@ exported key is imported, only the actual Z85 encoded data
will be used. Header lines and lines starting with whitespace
will be ignored. They are only there for convenience.
Key generation works like this:
=over
=item *
Generate a random seed (32 bytes).
=item *
Generate a ED25519 keypair from that seed.
=item *
Take the first 32 bytes of the generated ED25519 secret
and generate a SHA512 hash from it.
=item *
Clamp bytes 0 and 31 which turns it into a Curve25519 secret.
=item *
Do scalar multiplication from that secret to retrieve
the matching public key.
=back
Take a look at the function B<pcp_keypairs()> for details.
=head2 ENCRYPTED OUTPUT FORMAT
Encrypted output will always be Z85 encoded and has the following

View File

@@ -124,7 +124,7 @@
.\" ========================================================================
.\"
.IX Title "PCP1 1"
.TH PCP1 1 "2013-11-09" "PCP 0.1.3" "USER CONTRIBUTED DOCUMENTATION"
.TH PCP1 1 "2013-11-10" "PCP 0.1.4" "USER CONTRIBUTED DOCUMENTATION"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
@@ -298,6 +298,8 @@ to actually decrypt the message.
Oh \- and if you're wondering why I named them Alicia and Bobby:
I was just sick of Alice and Bob. We're running NSA-free, so we're
using other sample names as well.
.PP
# \-*\-perl\-*\-
.SH "PCP1 KEYS"
.IX Header "PCP1 KEYS"
\&\fBpcp1\fR keys are stored in a binary file, called \fBthe vault\fR.
@@ -506,6 +508,8 @@ A secret key is a binary structure with the following format:
\& +\-\-\-\-\-\-\-\-\-\-\-\-\-|\-\-\-\-\-\-\-\-|\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+
\& | ED25519 Pub | 32 | ED25519 Public Key Part |
\& +\-\-\-\-\-\-\-\-\-\-\-\-\-|\-\-\-\-\-\-\-\-|\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+
\& | ED25519 Sec | 64 | ED25519 Secret Key Unencrypted |
\& +\-\-\-\-\-\-\-\-\-\-\-\-\-|\-\-\-\-\-\-\-\-|\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+
\& | Nonce | 24 | Nonce for secret key encryption |
\& +\-\-\-\-\-\-\-\-\-\-\-\-\-|\-\-\-\-\-\-\-\-|\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+
\& | Encrypted | 48 | Encrypted Curve25519 Secret Key |
@@ -528,7 +532,7 @@ A secret key is a binary structure with the following format:
.PP
Some notes:
.PP
The secret key field will be filled with random data if the
The secret key fields will be filled with random data if the
key is encrypted. The first byte of it will be set to 0 in that
case.
.PP
@@ -543,6 +547,22 @@ Exported keys will be encoded in Z85 encoding. When such an
exported key is imported, only the actual Z85 encoded data
will be used. Header lines and lines starting with whitespace
will be ignored. They are only there for convenience.
.PP
Key generation works like this:
.IP "\(bu" 4
Generate a random seed (32 bytes).
.IP "\(bu" 4
Generate a \s-1ED25519\s0 keypair from that seed.
.IP "\(bu" 4
Take the first 32 bytes of the generated \s-1ED25519\s0 secret
and generate a \s-1SHA512\s0 hash from it.
.IP "\(bu" 4
Clamp bytes 0 and 31 which turns it into a Curve25519 secret.
.IP "\(bu" 4
Do scalar multiplication from that secret to retrieve
the matching public key.
.PP
Take a look at the function \fB\f(BIpcp_keypairs()\fB\fR for details.
.SS "\s-1ENCRYPTED\s0 \s-1OUTPUT\s0 \s-1FORMAT\s0"
.IX Subsection "ENCRYPTED OUTPUT FORMAT"
Encrypted output will always be Z85 encoded and has the following

View File

@@ -164,6 +164,7 @@ Oh - and if you're wondering why I named them Alicia and Bobby:
I was just sick of Alice and Bob. We're running NSA-free, so we're
using other sample names as well.
# -*-perl-*-
=head1 PCP1 KEYS
@@ -378,6 +379,8 @@ A secret key is a binary structure with the following format:
+-------------|--------|----------------------------------+
| ED25519 Pub | 32 | ED25519 Public Key Part |
+-------------|--------|----------------------------------+
| ED25519 Sec | 64 | ED25519 Secret Key Unencrypted |
+-------------|--------|----------------------------------+
| Nonce | 24 | Nonce for secret key encryption |
+-------------|--------|----------------------------------+
| Encrypted | 48 | Encrypted Curve25519 Secret Key |
@@ -399,7 +402,7 @@ A secret key is a binary structure with the following format:
Some notes:
The secret key field will be filled with random data if the
The secret key fields will be filled with random data if the
key is encrypted. The first byte of it will be set to 0 in that
case.
@@ -415,6 +418,36 @@ exported key is imported, only the actual Z85 encoded data
will be used. Header lines and lines starting with whitespace
will be ignored. They are only there for convenience.
Key generation works like this:
=over
=item *
Generate a random seed (32 bytes).
=item *
Generate a ED25519 keypair from that seed.
=item *
Take the first 32 bytes of the generated ED25519 secret
and generate a SHA512 hash from it.
=item *
Clamp bytes 0 and 31 which turns it into a Curve25519 secret.
=item *
Do scalar multiplication from that secret to retrieve
the matching public key.
=back
Take a look at the function B<pcp_keypairs()> for details.
=head2 ENCRYPTED OUTPUT FORMAT
Encrypted output will always be Z85 encoded and has the following

View File

@@ -1,36 +1,36 @@
----- BEGIN PCP PUBLIC KEY -----
Generated by: Pretty Curved Privacy Version 0.1.2
Generated by: Pretty Curved Privacy Version 0.1.3
Cipher: CURVE25519-ED25519-SALSA20-POLY1305
Owner: Bart
Mail: bart@local
Key-ID: 0x955C5AF3D4BABB18
Public-Key: 1k2a5(H12:G5bm[.R[Ca^8T[1N%P!9Sqo2M6XGa9wb(Pf
Creation Time: 2013-11-08T12:21:02
Checksum: 05:D9:A2:09:C1:E8:9F:79:ED:85:C2:45:E4:81:E2:C4
BA:91:B5:22:2A:6D:20:4A:F8:82:98:3A:F0:5E:B4:CA
Serial Number: 0xDDE1E3AD
Key-ID: 0x6C0EEA95E11E2533
Public-Key: 1kz.R2FXS+})++h8W3<NvR734vWVtWLxd?GlkoqHf8$$L
Creation Time: 2013-11-10T14:24:46
Checksum: AE:31:87:4F:77:52:B4:B5:1C:9E:DD:F5:94:7B:4A:B1
06:39:8F:10:DA:C0:32:B6:D0:D5:35:69:BE:F5:37:B2
Serial Number: 0x9273DE28
Key Version: 0x00000002
Random Art ID: +----------------+
| |
| |
| |
| o |
| . o |
| . . |
| o.oo |
| o+B*.o |
| |
| . o .|
| o . = |
| . . = o|
| .+o*+|
+----------------+
1k2a5(H12:G5bm[.R[Ca^8T[1N%P!9Sqo2M6XGa9wtpO9d/o}%adp*siueSCw4!g!8J-H*X
1mqSnSCUyc{?u.Bo3EeyH$VMJnEI(Pe5-MYVA[r[CL>[s0MBTQR1(Z?-TFjMV4W%7]:n+bI
^=Wb]NgZX995XE/oe@KICx!ujUrKk9zcOkq&yXkjYHo!x(<.zjH?x:B?qN?AgM[^acU5])f
zz-A4s70B-awtpMnbd<SVs:bCyme#/5zq.Qf%U!e}x)Au[q+3?I0C3K#!G2*W22)OPm9[oW
jF:.yuX8joMN<Gjj1=CvR4aN&%vt{2vaokZRPp#u+D%(3E01uc$EyMVAY?3Qx]^AbHeh3Bp
D0$FoPCxg0{UM5=)2RA8ktEo#^acjG%163^fy0DT+YW/vvQTq0kX$vGvqC}^S.38x{RttX1
U3]N3Z#&=HUSIG*gGm(zfRgEVS%95yujI<W*[NEXE6M3g{Ix[u/5}m8wjIwKwyW8)A>-PDI
^PCvBA1ELu7PS(h:gK-$}cR3D8Ytox94?KlL{-yp?yhUI<8{s6+g8QC31hTp6M9W6wm}@O&
t2OmQ3C@p{[sX%$c).&/u-YdN/wm+N*VM8VanKoonHUqD)$gBANhnzG&A*izju2&#qnS-3O
^1>/(i=Yr:/p)a7GdIx.2YBi{yN-I3@0Y}oaR1B3+D/*e2f]mo6G]%&V&[0!)FrCw8xwp2r
{mp&==Ue!dh8N-Uk$iT#g^TF{lnpC1iSGcW08!i^9SMfu0]q?}TPI$un%A4S5n{i%3TQ6C4
%0Hqoxfb4.Gg^pK0P(DJVVV/6t?<1odt65J=(I:fw}UqFn1jB}hi@pvYr:%r@-j2
1kz.R2FXS+})++h8W3<NvR734vWVtWLxd?GlkoqHfgoXon]}I3NVDk48zBw6q/&L9y{&-<r
Pb^{Uav$]6*=tHBo5LS]j[xHL@$s7Uf[v5D<j>LR3ope+k8<3jYfckF&!vrcyn+==/LNQPp
!/<Z]P^9c^e6k/*M69&fx%bb2l}iLq?)%<tr[i*vgX05kLEFBDvnpo>XgHRQ?p6vsX!+h(r
yl:?7Tcf}^o8P1kjS5i&x.V!7[en?^8d5^YwSj<3nY+Mkt@gON=6^^@QuVQ4SP][scxx?^z
5CG6ZiB<4^rXZOsdA(hOS6$hD%@5Pz&%6}n4+1<p{Y$iu^[:i@LzDjP0jDLv&b*?U2kk+u7
LM$LglW(q}TBofJc%qa-pwKZ?}.Ih]YY}je2uPG$d5fS>vQTq0kX$vGvqC@vk?b^xKBcE.e
[D4QWWjWEk!{A}^}{QI)OA<XW.qx@dH6lh7<6WlmCdQPR&h7ppdCUYep6zdIaKa}UKU!mIh
TQZ&-#B)64.=Kdv]e*)jVE:k^R=6!)tw^b9cn^.>n<%N:ZS+3GaQwEmwRy=%EX&L6l4X2WP
G:u$N*zc@kjSs(sDq4oAv7G0+sB6}alyacoNX=.61BqbFeQkg0^<PFMk>y9ewu8W(Pk@/i6
C@-<Y@UHgL}>:!9XXH%KQ6sN.m[&(cRapHUtpok.CFaEcI@kQhtJ3--[cU+XKB!Pr1Pn!jo
W=w}@pzKx$lOH}$k@*!>f!(9Lh8v2*M&E9^08!r69SMfu0*mSYc<emJ:@X+A>@]LR(/(R4w
Z)G/o=C2W9Pv7hkPcSZXMc#>J{A^N6u6+Z}Eh$L]t2VI)h=$sZe2W{6eFL+T]FC4
------ END PCP PUBLICKEY ------

View File

@@ -1,36 +1,36 @@
----- BEGIN PCP PUBLIC KEY -----
Generated by: Pretty Curved Privacy Version 0.1.2
Generated by: Pretty Curved Privacy Version 0.1.3
Cipher: CURVE25519-ED25519-SALSA20-POLY1305
Owner: Alicia
Mail: alicia@local
Key-ID: 0x244407F39FFA0333
Public-Key: 0$V[6<mc=m[dKuF8s9&RBd#W/(KA/%zRZr./5.1Ef-RgN
Creation Time: 2013-11-08T12:21:02
Checksum: 54:43:8B:3B:C3:65:21:9F:A5:EB:19:24:07:AB:D3:94
55:31:97:EC:0C:09:81:5C:C6:C9:EE:C4:A8:41:25:06
Serial Number: 0x0C8363E0
Key-ID: 0xD5F2E247E527F925
Public-Key: 1dO5d*+#bkj0vJNuNQxo&T}daphtuDw^?27XbA02z2:Lo
Creation Time: 2013-11-10T14:24:46
Checksum: 51:A1:DA:B4:3C:47:6E:4B:58:8A:44:69:53:38:A3:43
1A:C1:C6:A1:64:89:ED:0E:AF:C7:7A:E5:C7:FB:85:EF
Serial Number: 0xF7C8BC9E
Key Version: 0x00000002
Random Art ID: +----------------+
| |
| |
| |
| |
| . . |
| . *. |
| +.B . |
| o.+ + |
| .o . |
| |
| |
| |
| o . = . |
| o . *.= |
| . .o=.. |
+----------------+
0$V[6<mc=m[dKuF8s9&RBd#W/(KA/%zRZr./5.1Eg01WH@(Mc=uV-!$kxB/j+yM?O^EvfwN
R@+wyWB3sJ6Rn]v}/uKwGw=UC5ymsefA3:oG}4RdJ^tzaZ4H=ZK(g&+=K4(y$}52S+AX6dC
8KlJrjE!(=b*w=v63F{d?iz6zdzm)D>fC^ReqE.x^boltZnM&lG{$nzLg+<Q1%tV?n@V6h.
/vl{cxH4m%bVcBD.QL8#kO4vRta(@lJV=!cYjc&rr/a@*ve4=:I5btckwNiyE<qv)OP6]L.
{5Rigem^seRXp>j*9V6KOz!oMpTbZWvu+((u^kOw!r!op(7HzqmM1zdKJ=t5}unHbEB8.1X
cqgBIm3u)<LpZQR)vU+(5=&+XIr4])mz3OQ/4)[jpHiB:vqGT/x<<nyz!0i(0f.*Ix2i<T5
-Tm!<>V+dlI:yGMkn-oD30u299n<msI%q4PVdUu6+(!.*{S.(?*Gi:Yj?9S8m>sVFpg91.*
IWdE>]^h[fvo@Xhva&MYwdct02wrdA[xJn6h]m<CZNDM9v0j=M3?3gqIbGqgEJCJg74NZ96
<tP{A%eJ0)k@BFU98iPd639c$cF=Fphs5V^}q0e6omVTZS^@8CG{($#Un@m&g1+wj@E}[5S
%/S=i4=pQ4[:^IxknCKUQC.>xlmxUiofNKt-osOtoE@*A3CF1z&VnAeu(7d7I>{R>Vu8YRE
xP2X4au{F]g=d3yh+2O-mN/V$gCZ/!WeZgb08!i^9SMfu0T%Y>?#+!4q)TCm:w?gthgI#C*
uAwuou4r<pq5sbrgrIcA*<FgGl!q&da4$6)EKB}RV[u-V9(W1^t(+*airR1i@/lX
1dO5d*+#bkj0vJNuNQxo&T}daphtuDw^?27XbA02zqh<9Otx^7nQ)i?^}@>>O7va7zVWbC]
==4ds.SPlT3HMov}/uKjG(9PFKZ#0bxXY9ikVC1Vj=rJ2x]WB=FVbYKaI$ZqR)W$MFrUgYB
nTZ[eMC!NPQcYtZQpVSfRMBgY>2dZAL?[rMVVKuOj+tF5=bOEpR=<@dV<Qur.h4++rU%i6O
1^s!g0FT^3z>ls=Nvu.GxAEi%cjEK2d*^w=dN:?/!Z{b(bCuB@!U8pDs-[zxTCcjM:9=1VP
2BR@6ZIuv)v!=FH*!vh1Xu82c?UDR]nIrYi-<OD)$AnoSJ(rlqvm^{k=vl!7&:KK+g3i6v0
CrEd$2E>Y{>.9vt](x^P}q(bf&em34)TYgBacIl4oA8n6vqGT/x<<nyz!0i(0oH+e*@g3/-
GE(M[rzo4-{cl9^uI7uH-rIt4jB+/]&AcFa*qn}s-W/AA*h(bI9=:wjjA{N()UPzE755CCa
-qNUY4j?3%yo+-k^<5f<Ta%vcxO?}bX0T&wG89]JaTaFe&njD^(tU5G4N}tpf>$zUOv>G2E
]Ls})!aN47]1tg=>$N)+=4TrMAicEk)bS5ARyrD6[oIwc6:?^^kNMwE[sMAI^k7ZM[P0Ru0
m:})s*:3)=.XTGv22aW-04j?-.evZd%j:gd8n$hQPRstGfr^S+)^2s(?S[AR7.zBP7[>]18
rQ{C3/oEZKhaxt&gbH{Uh8m9WiwJC(aohxw08!r69SMfu0@6^GO=!+-*en&SNdU3QP<ipTQ
er*oE#7r@u34s@tdu+%r6aR+FN5{$JL3ppBGaL^t+0oKC[w#mY[erBP$M1A3&*nc
------ END PCP PUBLICKEY ------

View File

@@ -1,23 +1,25 @@
----- BEGIN PCP SECRET KEY -----
Generated by: Pretty Curved Privacy Version 0.1.2
Generated by: Pretty Curved Privacy Version 0.1.3
Cipher: CURVE25519-ED25519-SALSA20-POLY1305
Key-ID: 0x244407F39FFA0333
Creation Time: 2013-11-08T12:21:02
Serial Number: 0xEA570081
Key-ID: 0xD5F2E247E527F925
Creation Time: 2013-11-10T14:24:46
Serial Number: 0x33E31A89
Key Version: 0x00000002
0$V[6<mc=m[dKuF8s9&RBd#W/(KA/%zRZr./5.1Ef-RtSg<)<u{yX%$(#Iz7))^<5LO]Sb6
XCL*}b>1ZYVtAc@(Mc=uV-!$kxB/j+yM?O^EvfwNR@+wyWB3sJ7{fO:/gev+?A}#&BPP7g7
$M^k-6FzEB?CxJLzJ)lRZZ.L[]-@R2N/(&wr6^z9kK4+6?514qYhJPt)xx>29<eKnCm?x*D
MHv}/uKwGw=UC5ymsefA3:oG}4RdJ^tzaZ4H=ZK(g&+=K4(y$}52S+AX6dC8KlJrjE!(=b*
w=v63F{d?iz6zdzm)D>fC^ReqE.x^boltZnM&lG{$nzLg+<Q1%tV?n@V6h./vl{cxH4m%bV
cBD.QL8#kO4vRta(@lJV=!cYjc&rr/a@*ve4=:I5btckwNiyE<qv)OP6]L.{5Rigem^seRX
p>j*9V6KOz!oMpTbZWvu+((u^kOw!r!op(7HzqmM1zdKJ=t5}unHbEB8.1XcqgBIm3u)<Lp
ZQR)vU+(5=&+XIr4])mz3OQ/4)[jpHiB:vqGT/x<<nyz!0i(0f.*Ix2i<T5-Tm!<>V+dlI:
yGMkn-oD30u299n<msI%q4PVdUu6+(!.*{S.(?*Gi:Yj?9S8m>sVFpg91.*IWdE>]^h[fvo
@Xhva&MYwdct02wrdA[xJn6h]m<CZNDM9v0j=M3?3gqIbGqgEJCJg74NZ96<tP{A%eJ0)k@
BFU98iPd639c$cF=Fphs5V^}q0e6omVTZS^@8CG{($#Un@m&g1+wj@E}[5S%/S=i4=pQ4[:
^IxknCKUQC.>xlmxUiofNKt-osOtoE@*A3CF1z&VnAeu(7d7I>{R>Vu8YRExP2X4au{F]g=
d3yh+2O-mN/V$gCZ/!=hW?A08!i^9SMfu0{S?!FDr3I==W2=NlYWl0seV90000000000004
xD0seV9000000000000000000000h+5x0seV901Ybg0gJN5^/ovF
1dO5d*+#bkj0vJNuNQxo&T}daphtuDw^?27XbA02z2*K-*A51(A!tigjW3i$*o:@bI*[3y^
&B@[FOM6UE+RUqOtx^7nQ)i?^}@>>O7va7zVWbC]==4ds.SPlS@Q4)<?Sr!O$NImB+HLtpR
?2pAiZ*7v$[])kt&-fYY7iEv&/!^))B4m{y#[ZY#09Dp)7cHJf]S8=]O]JHFwkO/a2]f<{G
dVDZCqNP(6hviK9EawqO3m8Q7F!>4%4&u1L@xzbj7P{(F%s/UfO)vn1[Od?-}BbZ$#-)Cs$
/evVI+AxP@x/UJCJ8%!V2/:}u#qAzTO{feeua-B)JLpOd<XiT}Bv}/uKjG(9PFKZ#0bxXY9
ikVC1Vj=rJ2x]WB=FVbYKaI$ZqR)W$MFrUgYBnTZ[eMC!NPQcYtZQpVSfRMBgY>2dZAL?[r
MVVKuOj+tF5=bOEpR=<@dV<Qur.h4++rU%i6O1^s!g0FT^3z>ls=Nvu.GxAEi%cjEK2d*^w
=dN:?/!Z{b(bCuB@!U8pDs-[zxTCcjM:9=1VP2BR@6ZIuv)v!=FH*!vh1Xu82c?UDR]nIrY
i-<OD)$AnoSJ(rlqvm^{k=vl!7&:KK+g3i6v0CrEd$2E>Y{>.9vt](x^P}q(bf&em34)TYg
BacIl4oA8n6vqGT/x<<nyz!0i(0oH+e*@g3/-GE(M[rzo4-{cl9^uI7uH-rIt4jB+/]&AcF
a*qn}s-W/AA*h(bI9=:wjjA{N()UPzE755CCa-qNUY4j?3%yo+-k^<5f<Ta%vcxO?}bX0T&
wG89]JaTaFe&njD^(tU5G4N}tpf>$zUOv>G2E]Ls})!aN47]1tg=>$N)+=4TrMAicEk)bS5
ARyrD6[oIwc6:?^^kNMwE[sMAI^k7ZM[P0Ru0m:})s*:3)=.XTGv22aW-04j?-.evZd%j:g
d8n$hQPRstGfr^S+)^2s(?S[AR7.zBP7[>]18rQ{C3/oEZKhaxt&gbH{Uh8m9WiwJC(e=U>
K08!r69SMfu0Ye<PI2^)3vS:oPml[7E0seV90000000000004Km0seV9000000000000000
0000000W{r0seV901Ybg0h!5]4GDFe
------ END PCP SECRET KEY ------

View File

@@ -1,36 +1,36 @@
----- BEGIN PCP PUBLIC KEY -----
Generated by: Pretty Curved Privacy Version 0.1.2
Generated by: Pretty Curved Privacy Version 0.1.3
Cipher: CURVE25519-ED25519-SALSA20-POLY1305
Owner: Bobby
Mail: bobby@local
Key-ID: 0x26C77B2A1548F4AB
Public-Key: 1o5q3y.SNnO!odQ<U>Y^yOu:0>lJIWQ@*rFJ*QQuwDhYg
Creation Time: 2013-11-08T12:21:02
Checksum: D0:21:AA:87:7E:24:F5:A6:8F:FC:2A:21:14:04:57:99
30:D9:BD:35:D4:AF:F4:20:50:7D:72:DB:6D:6B:6F:21
Serial Number: 0xB4410F61
Key-ID: 0x80F52DB08164A533
Public-Key: 1ibutw@MLx1y%B6nt5N-j1p9RrIJA!5?aMj/NV/DjPCDZ
Creation Time: 2013-11-10T14:24:46
Checksum: 17:D9:B5:1E:2B:B5:1E:9A:EE:01:68:CB:5E:E5:80:F0
49:80:62:61:F4:DB:D4:7F:05:67:92:73:60:63:86:A5
Serial Number: 0xEC29D88E
Key Version: 0x00000002
Random Art ID: +----------------+
| . |
| . . |
| .. . |
|o.. .. |
|.o . o. |
| . ... |
| ... .. |
| .o .. |
| . = . |
| = * |
| o B . |
| = o |
| . |
| |
| |
+----------------+
1o5q3y.SNnO!odQ<U>Y^yOu:0>lJIWQ@*rFJ*QQuw-NU)7*y@CnN%qTNwEsQ8UI0JFzL5N]
:[U5Ya%?E3QO=vvTd$h22]DXl8f6>aEy/#}]4:xH{$1bZv[7@dMPmEr^w$rCwm+{WwmPlHp
y!/SI&//[fhw%2scogf$RsnHNm6*-XlZpR1vg8XIm<mamGE{YfPuSiz}Yyq0UzBRq!JdD%G
kf<)!6xraTlRYybc!l=lIcsYY3C==2<{X2BWGy]NlOi@4DIR8m(/-w*//nS>RSkaTz(DYg7
oG8QKemj%)6k[ic:U8QD]y?CND}xFUzGZ=>8}hBJl4@>^r?^AY#t[5Qn9g##I{XpbF5C2h[
pD$R!=wRs>:JLbed^]$FOZ>N40Awpyu.#%h:sug:@Y(2CvSbZ+C%Dg:v{%fNE?/hR3GG0J*
7cO=UnJR[J18xFS5}AI/GCjw-9mQ)GJFCotP4.!5qxn810i]1i&9WQw#[9]tgB{kuzKIorx
^[xc2zU>X)I&s/tYoEplQ0FJre*M.p![>HZ>YF3CfJ(Prp8m+IQIeJTs(?JI&7@F}c*#61b
12v!ysq}6L-?26>zTbVb@OZG^oXfM&m8dAdl}Qk^i<I5V9VziPt#87PD*twr+W.{8?9^CuM
NZy7H69@rulO]&EKqlOgP7?CzGt{h^L)j1L)2UV[5FM$DealB>]nxtvW!p(@rZY)M#uXcf8
)]C-BF3eM4hBxzZlny?Yh8EoZg^KCdKPkvY08!i^9SMfu0<>l7vfo-E^5H8:rEPW}IWMM)n
9O]:9.h#9eg#3N+Nwg=(FZ!o&vjwh*@-/k:pP+l3Gn(Gar.6q(jT9C=nq*9Ee<lE
1ibutw@MLx1y%B6nt5N-j1p9RrIJA!5?aMj/NV/Dj(4dT!OMC={yChgS9Bm:p*{/RW@&mq4
hPA1/hb&6<3EV[vTd@IEDCn1gh?O*AO]Pp]T[*2/n#SSc:SPVDlb$h(:z6cmqt0DUIc(hU)
IfufJgG1em4]/KdB$SF$R1fu0Uyj:AiYb-ET]kItj[a^i94(:P$G<oU^Ns14-<7Ni@gLn9n
Qlb8//T4AA5jq.nHU:/B]Xo.u:6vP$NZ8:}D?i@%I?M0})0weS1AaFZ&b@7^S9Hy2eSWZG)
U^{1AvdLExP+6MH9HE<de}3Y3DR>Wj!s!h9$7ve^NBsb)415Dj^Z9//]G*z=pA))x+{zp4<
V4R37FSAuNYF@L!50FILb.ikdYR9QjY#[SCLuE6:WvoI8vSbZ+C%Dg:v{%fN-Ev6Bg.s8Se
L&x#naZ8r7R@zd5j2DFn<w$2HY*F}]}Y&Y?GZaVE0TMi=nC!.X{]I6YnIaXBYKIbP(-omT!
(U(Ae*77C7C>^WcqCB(F&2[C8d^lKzsEhXnpTH-s[RUK-b-Z7DKC)rQ@8=w1VnxG$6=^C.h
(U3>LYD!!H<lUK?dzs5rb#wlUknk4gU+ov-whNrEM02u!%@hZtF[eR7{<0CgeDg+SR2-?$e
u7Cy#]:Vhu&{@}siUdO013&:8adw.@ex-R}pXYDj(/D%PG)g[jtyB#?tIM3xtzVnw:1>3s^
+(ZbyD3yO]fH^]Pl{-N!f/y<Oh8v2*k(Z(+08!r69SMfu0{?w*JSQptIgg:z2mt:erb<@UA
=>25y?Q=(YO^sy=Rgk$+#[GxtS&GB/mTh$(@bereI-eo*2pGrbaTSZWR^fTOD5S&
------ END PCP PUBLICKEY ------

View File

@@ -1,23 +1,25 @@
----- BEGIN PCP SECRET KEY -----
Generated by: Pretty Curved Privacy Version 0.1.2
Generated by: Pretty Curved Privacy Version 0.1.3
Cipher: CURVE25519-ED25519-SALSA20-POLY1305
Key-ID: 0x26C77B2A1548F4AB
Creation Time: 2013-11-08T12:21:02
Serial Number: 0x048CC072
Key-ID: 0x80F52DB08164A533
Creation Time: 2013-11-10T14:24:46
Serial Number: 0x9CFF1DC6
Key Version: 0x00000002
1o5q3y.SNnO!odQ<U>Y^yOu:0>lJIWQ@*rFJ*QQuwDkSN1)h.]3aGrN{@#OpkKg+VAzobA3
f7?d[VKYM/Yl<l7*y@CnN%qTNwEsQ8UI0JFzL5N]:[U5Ya%?E3+b.wOe.zsGKUG[<3N9p:C
pDWVcEjzKx7nIPx7tx0}bFZN%SKvUaImjf{23dOo9M@(rb6J7sZG[Z#c01lHJ7FFG#C6=Q8
LVvTd$h22]DXl8f6>aEy/#}]4:xH{$1bZv[7@dMPmEr^w$rCwm+{WwmPlHpy!/SI&//[fhw
%2scogf$RsnHNm6*-XlZpR1vg8XIm<mamGE{YfPuSiz}Yyq0UzBRq!JdD%Gkf<)!6xraTlR
Yybc!l=lIcsYY3C==2<{X2BWGy]NlOi@4DIR8m(/-w*//nS>RSkaTz(DYg7oG8QKemj%)6k
[ic:U8QD]y?CND}xFUzGZ=>8}hBJl4@>^r?^AY#t[5Qn9g##I{XpbF5C2h[pD$R!=wRs>:J
Lbed^]$FOZ>N40Awpyu.#%h:sug:@Y(2CvSbZ+C%Dg:v{%fNE?/hR3GG0J*7cO=UnJR[J18
xFS5}AI/GCjw-9mQ)GJFCotP4.!5qxn810i]1i&9WQw#[9]tgB{kuzKIorx^[xc2zU>X)I&
s/tYoEplQ0FJre*M.p![>HZ>YF3CfJ(Prp8m+IQIeJTs(?JI&7@F}c*#61b12v!ysq}6L-?
26>zTbVb@OZG^oXfM&m8dAdl}Qk^i<I5V9VziPt#87PD*twr+W.{8?9^CuMNZy7H69@rulO
]&EKqlOgP7?CzGt{h^L)j1L)2UV[5FM$DealB>]nxtvW!p(@rZY)M#uXcf8)]C-BF3eM4hB
xzZlny?Yh8EoZg^KCdCk}Qy08!i^9SMfu0TaE$ASP8H!S5r{ZcHPW0seV9004lz0seV9004
JH0seV9000000000000000000000h+hB0seV901Ybg07FFv:n=hu
1ibutw@MLx1y%B6nt5N-j1p9RrIJA!5?aMj/NV/DjPIjyxhLO1q@:+$7?)D][S+0r<Rfgzn
tDEQCEP=9pU^5<!OMC={yChgS9Bm:p*{/RW@&mq4hPA1/hb&6&@FQcZ:}Y25*4WG4uMo@Dn
]ez5rL8ZZ6/eS[wW=)x&z.me!2?&c6XTM-No(PGmt6WOVbJ(??zP*h]I.5&?]n<y(2e()Bv
mb5lgGjmYPtgOAtGHww3s+*V[JNk9Ug$==U%fbp*oxg!By7ESbm(1$=-on44=#n(&e!DKU3
1JeS&$e-8oi}YPZ0gI$f8EO{xKM8j]%oR/#MboJ1(.r=n2&6Iu>vTd@IEDCn1gh?O*AO]Pp
]T[*2/n#SSc:SPVDlb$h(:z6cmqt0DUIc(hU)IfufJgG1em4]/KdB$SF$R1fu0Uyj:AiYb-
ET]kItj[a^i94(:P$G<oU^Ns14-<7Ni@gLn9nQlb8//T4AA5jq.nHU:/B]Xo.u:6vP$NZ8:
}D?i@%I?M0})0weS1AaFZ&b@7^S9Hy2eSWZG)U^{1AvdLExP+6MH9HE<de}3Y3DR>Wj!s!h
9$7ve^NBsb)415Dj^Z9//]G*z=pA))x+{zp4<V4R37FSAuNYF@L!50FILb.ikdYR9QjY#[S
CLuE6:WvoI8vSbZ+C%Dg:v{%fN-Ev6Bg.s8SeL&x#naZ8r7R@zd5j2DFn<w$2HY*F}]}Y&Y
?GZaVE0TMi=nC!.X{]I6YnIaXBYKIbP(-omT!(U(Ae*77C7C>^WcqCB(F&2[C8d^lKzsEhX
npTH-s[RUK-b-Z7DKC)rQ@8=w1VnxG$6=^C.h(U3>LYD!!H<lUK?dzs5rb#wlUknk4gU+ov
-whNrEM02u!%@hZtF[eR7{<0CgeDg+SR2-?$eu7Cy#]:Vhu&{@}siUdO013&:8adw.@ex-R
}pXYDj(/D%PG)g[jtyB#?tIM3xtzVnw:1>3s^+(ZbyD3yO]fH^]Pl{-N!f/y<Oh8v2**Ydr
O08!r69SMfu0?xoh-Sv(D^?4<!>0ldv0seV9004yi0seV9004Wq0seV9000000000000000
0000000X6v0seV901Ybg02=5[JSo4V
------ END PCP SECRET KEY ------

View File

@@ -1,6 +1,6 @@
bartid = 0x955C5AF3D4BABB18
bartserial = 0xDDE1E3AD
idbobby = 0x26C77B2A1548F4AB
idalicia = 0x244407F39FFA0333
bartid = 0x6C0EEA95E11E2533
bartserial = 0x9273DE28
idbobby = 0x80F52DB08164A533
idalicia = 0xD5F2E247E527F925
mailbobby = bobby@local
mailalicia = alicia@local