diff --git a/include/pcp/key.h b/include/pcp/key.h
index ec0f83b..4fe0ac7 100644
--- a/include/pcp/key.h
+++ b/include/pcp/key.h
@@ -1,7 +1,7 @@
/*
This file is part of Pretty Curved Privacy (pcp1).
- Copyright (C) 2013 T.Linden.
+ Copyright (C) 2014 T.v.Dein.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -16,7 +16,7 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see .
- You can contact me by mail: .
+ You can contact me by mail: .
*/
@@ -137,6 +137,81 @@ typedef struct _pcp_rec_t pcp_rec_t;
#define PCP_RAW_KEYSIZE sizeof(pcp_key_t) - sizeof(UT_hash_handle)
#define PCP_RAW_PUBKEYSIZE sizeof(pcp_pubkey_t) - sizeof(UT_hash_handle)
+
+
+
+
+
+/* RFC4880 alike public key export with some simplifications:
+
+ In sig subpackets we're using fixed sized fields instead
+ of the mess they use in rfc4880. Sorry. We use only these types:
+
+ 2 = Signature Creation Time (4 byte)
+ 3 = Signature Expiration Time (4 byte)
+ 9 = Key Expiration Time (4 bytes)
+ 20 = Notation Data (4 byte flags, N bytes name+value)
+ 27 = Key Flags (1 byte, use 0x02, 0x08 and 0x80
+
+ The actual signature field doesn't contain the 1st 16 bits
+ of the hash, since crypto_sign() created signatures consist
+ of the hash+signature anyway.
+
+ So, a full pubkey export looks like this
+
+ version
+ ctime
+ cipher
+ 3 x raw keys \
+ sigheader > calc hash from this
+ sigsubs (header+data) /
+ hash
+ signature
+
+ We use big-endian always.
+
+ http://tools.ietf.org/html/rfc4880#section-5.2.3
+
+ */
+struct _pcp_rfc_pubkey_header_t {
+ uint8_t version;
+ uint32_t ctime;
+ uint8_t cipher;
+};
+
+struct _pcp_rfc_pubkey_0x21_t {
+ byte sig_ed25519_pub[crypto_sign_PUBLICKEYBYTES];
+ byte ed25519_pub[crypto_sign_PUBLICKEYBYTES];
+ byte curve25519_pub[crypto_box_PUBLICKEYBYTES];
+};
+
+struct _pcp_rfc_pubkey_sigheader_0x21_t {
+ uint8_t version;
+ uint8_t type; /* 0x1F only, self signed */
+ uint8_t pkcipher;
+ uint8_t hashcipher;
+ uint16_t numsubs;
+};
+
+struct _pcp_rfc_pubkey_sigsub_0x21_t {
+ uint32_t size;
+ uint8_t type;
+};
+
+struct _pcp_rfc_pubkey_sig_0x21_t {
+ byte signature[crypto_generichash_BYTES_MAX + crypto_sign_BYTES];
+};
+
+typedef struct _pcp_rfc_pubkey_header_t rfc_pub_h;
+typedef struct _pcp_rfc_pubkey_0x21_t rfc_pub_k;
+typedef struct _pcp_rfc_pubkey_sigheader_0x21_t rfc_pub_sig_h;
+typedef struct _pcp_rfc_pubkey_sigsub_0x21_t rfc_pub_sig_s;
+typedef struct _pcp_rfc_pubkey_sig_0x21_t rfc_pub_sig;
+
+
+
+
+
void pcp_cleanhashes();
pcp_key_t *pcpkey_new ();