X-Git-Url: http://the.earth.li/gitweb/?a=blobdiff_plain;f=decodekey.c;h=efffad7d7863a7e310647113801fb21ba545c22f;hb=ec6d9d2d119c9b215103c13bcc5b9b44bd24b997;hp=6a1660467e87ba0ccc7b42566f93c47fd4e902ee;hpb=5913c95f2c7abf4c3cb06e27d384d80fb4c83547;p=onak.git diff --git a/decodekey.c b/decodekey.c index 6a16604..efffad7 100644 --- a/decodekey.c +++ b/decodekey.c @@ -6,7 +6,6 @@ * Copyright 2002 Project Purple */ -#include #include #include #include @@ -18,6 +17,7 @@ #include "keyid.h" #include "keystructs.h" #include "ll.h" +#include "log.h" /* * parse_subpackets - Parse the subpackets of a Type 4 signature. @@ -34,7 +34,7 @@ int parse_subpackets(unsigned char *data, uint64_t *keyid) int length = 0; int packetlen = 0; - assert(data != NULL); + log_assert(data != NULL); length = (data[0] << 8) + data[1] + 2; @@ -53,13 +53,13 @@ int parse_subpackets(unsigned char *data, uint64_t *keyid) packetlen <<= 8; packetlen = data[offset++]; } - switch (data[offset]) { + switch (data[offset] & 0x7F) { case 2: /* * Signature creation time. Might want to output this? */ break; - case 0x83: + case 3: /* * Signature expiration time. Might want to output this? */ @@ -81,6 +81,12 @@ int parse_subpackets(unsigned char *data, uint64_t *keyid) *keyid <<= 8; *keyid += data[offset+packetlen - 1]; break; + case 20: + /* + * Annotation data. + */ + break; + case 23: /* * Key server preferences. Including no-modify. @@ -94,10 +100,14 @@ int parse_subpackets(unsigned char *data, uint64_t *keyid) default: /* * We don't care about unrecognized packets unless bit - * 7 is set in which case we prefer an error than - * ignoring it. + * 7 is set in which case we log a major error. */ - assert(!(data[offset] & 0x80)); + if (data[offset] & 0x80) { + logthing(LOGTHING_CRITICAL, + "Critical subpacket type not parsed: 0x%X", + data[offset]); + } + } offset += packetlen; } @@ -205,6 +215,10 @@ char **keyuids(struct openpgp_publickey *key, char **primary) char buf[1024]; char **uids = NULL; int count = 0; + + if (primary != NULL) { + *primary = NULL; + } if (key != NULL && key->uids != NULL) { uids = malloc((spsize(key->uids) + 1) * sizeof (char *)); @@ -221,13 +235,41 @@ char **keyuids(struct openpgp_publickey *key, char **primary) curuid = curuid -> next; } uids[count] = NULL; - } - /* - * TODO: Parse subpackets for real primary ID (v4 keys) - */ - if (primary != NULL) { - *primary = uids[0]; + + /* + * TODO: Parse subpackets for real primary ID (v4 keys) + */ + if (primary != NULL) { + *primary = uids[0]; + } } return uids; } + +/** + * keysubkeys - Takes a key and returns an array of its subkey keyids. + * @key: The key to get the subkeys of. + * + * keysubkeys takes a public key structure and returns an array of the + * subkey keyids for that key. + */ +uint64_t *keysubkeys(struct openpgp_publickey *key) +{ + struct openpgp_signedpacket_list *cursubkey = NULL; + uint64_t *subkeys = NULL; + int count = 0; + + if (key != NULL && key->subkeys != NULL) { + subkeys = malloc((spsize(key->subkeys) + 1) * + sizeof (uint64_t)); + cursubkey = key->subkeys; + while (cursubkey != NULL) { + subkeys[count++] = get_packetid(cursubkey->packet); + cursubkey = cursubkey -> next; + } + subkeys[count] = 0; + } + + return subkeys; +}