* Jonathan McDowell <noodles@earth.li>
*
* Copyright 2002 Project Purple
- *
- * $Id: decodekey.c,v 1.2 2003/06/04 20:57:07 noodles Exp $
*/
-#include <assert.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include "keyid.h"
#include "keystructs.h"
#include "ll.h"
+#include "log.h"
/*
* parse_subpackets - Parse the subpackets of a Type 4 signature.
int length = 0;
int packetlen = 0;
- assert(data != NULL);
+ log_assert(data != NULL);
length = (data[0] << 8) + data[1] + 2;
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?
*/
*keyid <<= 8;
*keyid += data[offset+packetlen - 1];
break;
+ case 20:
+ /*
+ * Annotation data.
+ */
+ break;
+
case 23:
/*
* Key server preferences. Including no-modify.
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;
}
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 *));
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;
+}