use a struct to fetch in a pbp key (pbp_pubkey_t) instead of manual parsing

This commit is contained in:
git@daemon.de
2014-01-29 12:53:42 +01:00
parent 68d8f640e6
commit dbdaf38185
4 changed files with 42 additions and 39 deletions

7
TODO
View File

@@ -6,13 +6,10 @@ Bug: pcp_z85_decode() fails if after end marker follows something, even whitespa
key++: normalize id and lc() key++: normalize id and lc()
sym decrypt uses vault, which it shouldn't
allow signing using an alternate secret key, like in pcpdecrypt() allow signing using an alternate secret key, like in pcpdecrypt()
support export/import from/to pbp
malloc() new pointers in functions only if not NULL, e.g. pcp_gennonce() malloc() new pointers in functions only if not NULL, e.g. pcp_gennonce()
generalize file i/0, open+close only in src/, print msg if using stdin or stdout generalize file i/0, open+close only in src/, print msg if using stdin or stdout
put the key import and export stuff into the lib, support from/to file and string

View File

@@ -104,8 +104,20 @@ struct _pcp_pubkey_t {
UT_hash_handle hh; UT_hash_handle hh;
}; };
// the PBP public key format
struct _pbp_pubkey_t {
byte sig[crypto_sign_BYTES];
byte sigpub[crypto_box_PUBLICKEYBYTES];
byte edpub[crypto_sign_PUBLICKEYBYTES];
byte pub[crypto_box_PUBLICKEYBYTES];
char iso_ctime[32];
char iso_expire[32];
char name[1024];
};
typedef struct _pcp_key_t pcp_key_t; typedef struct _pcp_key_t pcp_key_t;
typedef struct _pcp_pubkey_t pcp_pubkey_t; typedef struct _pcp_pubkey_t pcp_pubkey_t;
typedef struct _pbp_pubkey_t pbp_pubkey_t;
#define PCP_RAW_KEYSIZE sizeof(pcp_key_t) - sizeof(UT_hash_handle) #define PCP_RAW_KEYSIZE sizeof(pcp_key_t) - sizeof(UT_hash_handle)
#define PCP_RAW_PUBKEYSIZE sizeof(pcp_pubkey_t) - sizeof(UT_hash_handle) #define PCP_RAW_PUBKEYSIZE sizeof(pcp_pubkey_t) - sizeof(UT_hash_handle)

12
libtool
View File

@@ -2,7 +2,7 @@
# libtool - Provide generalized library-building support services. # libtool - Provide generalized library-building support services.
# Generated automatically by config.status (pcp) 0.2.0 # Generated automatically by config.status (pcp) 0.2.0
# Libtool was configured on host io: # Libtool was configured on host r4:
# NOTE: Changes made to this file will be lost: look at ltmain.sh. # NOTE: Changes made to this file will be lost: look at ltmain.sh.
# #
# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
@@ -66,13 +66,13 @@ PATH_SEPARATOR=":"
# The host system. # The host system.
host_alias= host_alias=
host=amd64-unknown-freebsd9.0 host=amd64-unknown-freebsd9.1
host_os=freebsd9.0 host_os=freebsd9.1
# The build system. # The build system.
build_alias= build_alias=
build=amd64-unknown-freebsd9.0 build=amd64-unknown-freebsd9.1
build_os=freebsd9.0 build_os=freebsd9.1
# A sed program that does not truncate output. # A sed program that does not truncate output.
SED="/usr/bin/sed" SED="/usr/bin/sed"
@@ -164,7 +164,7 @@ lock_old_archive_extraction=no
LTCC="gcc" LTCC="gcc"
# LTCC compiler flags. # LTCC compiler flags.
LTCFLAGS="-I/usr/local/include -I/usr/local/include" LTCFLAGS="-g -O2 -I/usr/local/include"
# Take the output of nm and produce a listing of raw symbols and C names. # Take the output of nm and produce a listing of raw symbols and C names.
global_symbol_pipe="sed -n -e 's/^.*[ ]\\([ABCDGIRSTW][ABCDGIRSTW]*\\)[ ][ ]*\\([_A-Za-z][_A-Za-z0-9]*\\)\$/\\1 \\2 \\2/p' | sed '/ __gnu_lto/d'" global_symbol_pipe="sed -n -e 's/^.*[ ]\\([ABCDGIRSTW][ABCDGIRSTW]*\\)[ ][ ]*\\([_A-Za-z][_A-Za-z0-9]*\\)\$/\\1 \\2 \\2/p' | sed '/ __gnu_lto/d'"

View File

@@ -376,33 +376,31 @@ int pcp_importsecret (vault_t *vault, FILE *in) {
int pcp_importpublic (vault_t *vault, FILE *in, int pbpcompat) { int pcp_importpublic (vault_t *vault, FILE *in, int pbpcompat) {
pcp_pubkey_t *pub = NULL; pcp_pubkey_t *pub = NULL;
if(pbpcompat == 1) { if(pbpcompat == 1) {
size_t bufsize = 1024; char *date = NULL;
unsigned char in_buf[bufsize]; char *parts = NULL;
int pnum;
pbp_pubkey_t *b = ucmalloc(sizeof(pbp_pubkey_t));
pub = ucmalloc(sizeof(pcp_pubkey_t)); pub = ucmalloc(sizeof(pcp_pubkey_t));
char *date = ucmalloc(19);
char *tmp = ucmalloc(1024);
bufsize = fread(&in_buf, 1, crypto_sign_BYTES, in); // fetch the key from the file
if(fread(b, 1, sizeof(pbp_pubkey_t), in) < sizeof(pbp_pubkey_t) - 1024) {
fatal("PBP key seems to be too small, maybe it's not a PBP key\n");
goto errimp1;
}
fread(&in_buf, 1, crypto_box_PUBLICKEYBYTES, in); // ignored currently // parse the date
fread(pub->edpub, 1, crypto_sign_PUBLICKEYBYTES, in); date = ucmalloc(19);
fread(pub->pub, 1, crypto_box_PUBLICKEYBYTES, in); memcpy(date, b->iso_ctime, 18);
fread(date, 1, 19, in);
date[19] = '\0'; date[19] = '\0';
fread(&in_buf, 1, 44, in); // ignore validity date
bufsize = fread(tmp, 1, 1024, in);
tmp[bufsize] = '\0';
struct tm c; struct tm c;
if(strptime(date, "%Y-%m-%dT%H:%M:%S", &c) == NULL) { if(strptime(date, "%Y-%m-%dT%H:%M:%S", &c) == NULL) {
fatal("Failed to parse creation time in PBP public key file (<%s>)\n", date); fatal("Failed to parse creation time in PBP public key file (<%s>)\n", date);
goto errimp1; goto errimp1;
} }
char *parts = strtok (tmp, "<>"); // parse the name
int pnum = 0; parts = strtok (b->name, "<>");
pnum = 0;
while (parts != NULL) { while (parts != NULL) {
if(pnum == 0) if(pnum == 0)
memcpy(pub->owner, parts, strlen(parts)); memcpy(pub->owner, parts, strlen(parts));
@@ -413,27 +411,23 @@ int pcp_importpublic (vault_t *vault, FILE *in, int pbpcompat) {
} }
free(parts); free(parts);
if(sscanf(tmp, "%s|%s", pub->owner, pub->mail) == 0) { // fill in the fields
if(sscanf(tmp, "%s", pub->owner) == 0) {
fatal("Failed to parse owner in PBP public key file\n");
goto errimp1;
}
}
pub->ctime = (long)mktime(&c); pub->ctime = (long)mktime(&c);
pub->type = PCP_KEY_TYPE_PUBLIC; pub->type = PCP_KEY_TYPE_PUBLIC;
pub->version = PCP_KEY_VERSION; pub->version = PCP_KEY_VERSION;
pub->serial = arc4random(); pub->serial = arc4random();
memcpy(pub->id, pcp_getpubkeyid(pub), 17); memcpy(pub->id, pcp_getpubkeyid(pub), 17);
memcpy(pub->pub, b->pub, crypto_box_PUBLICKEYBYTES);
memcpy(pub->edpub, b->edpub, crypto_sign_PUBLICKEYBYTES);
free(b);
free(date); free(date);
free(tmp);
goto kimp; goto kimp;
errimp1: errimp1:
free(date); free(date);
free(tmp);
free(pub); free(pub);
free(b);
return 1; return 1;
} }
else { else {