X-Git-Url: http://the.earth.li/gitweb/?a=blobdiff_plain;f=keyindex.c;h=464a7baaecd76d1eacbbb7726d2264851b265229;hb=4843efc642ddcfe524bb6ba37b01154e57489ff7;hp=5911cac81736ae53f9b66bca1348ff59edda6b74;hpb=5913c95f2c7abf4c3cb06e27d384d80fb4c83547;p=onak.git diff --git a/keyindex.c b/keyindex.c index 5911cac..464a7ba 100644 --- a/keyindex.c +++ b/keyindex.c @@ -4,6 +4,8 @@ * Jonathan McDowell * * Copyright 2002 Project Purple + * + * $Id: keyindex.c,v 1.12 2003/06/08 21:11:01 noodles Exp $ */ #include @@ -21,6 +23,7 @@ #include "keyid.h" #include "keyindex.h" #include "keystructs.h" +#include "log.h" int list_sigs(struct openpgp_packet_list *sigs, bool html) { @@ -114,7 +117,8 @@ int list_subkeys(struct openpgp_signedpacket_list *subkeys, bool verbose, subkeys->packet->data[7]; break; default: - fprintf(stderr, "Unknown key type: %d\n", + logthing(LOGTHING_ERROR, + "Unknown key type: %d", subkeys->packet->data[0]); } @@ -138,6 +142,29 @@ int list_subkeys(struct openpgp_signedpacket_list *subkeys, bool verbose, return 0; } +void display_fingerprint(struct openpgp_publickey *key) +{ + int i = 0; + size_t length = 0; + unsigned char fp[20]; + + get_fingerprint(key->publickey, fp, &length); + printf(" Key fingerprint ="); + for (i = 0; i < length; i++) { + if ((length == 16) || + (i % 2 == 0)) { + printf(" "); + } + printf("%02X", fp[i]); + if ((i * 2) == length) { + printf(" "); + } + } + printf("\n"); + + return; +} + /** * key_index - List a set of OpenPGP keys. * @keys: The keys to display. @@ -182,7 +209,7 @@ int key_index(struct openpgp_publickey *keys, bool verbose, bool fingerprint, keys->publickey->data[7]; break; default: - fprintf(stderr, "Unknown key type: %d\n", + logthing(LOGTHING_ERROR, "Unknown key type: %d", keys->publickey->data[0]); } @@ -200,13 +227,24 @@ int key_index(struct openpgp_publickey *keys, bool verbose, bool fingerprint, snprintf(buf, 1023, "%.*s", (int) curuid->packet->length, curuid->packet->data); - printf("%s\n", (html) ? txt2html(buf) : buf); + printf("%s%s\n", + (html) ? txt2html(buf) : buf, + (keys->revocations == NULL) ? "" : + " *** REVOKED ***"); + if (fingerprint) { + display_fingerprint(keys); + } if (verbose) { list_sigs(curuid->sigs, html); } curuid = curuid->next; } else { - putchar('\n'); + printf("%s\n", + (keys->revocations == NULL) ? "" : + "*** REVOKED ***"); + if (fingerprint) { + display_fingerprint(keys); + } } list_uids(curuid, verbose, html); @@ -221,3 +259,72 @@ int key_index(struct openpgp_publickey *keys, bool verbose, bool fingerprint, return 0; } + +/** + * mrkey_index - List a set of OpenPGP keys in the MRHKP format. + * @keys: The keys to display. + * + * This function takes a list of OpenPGP public keys and displays a + * machine readable list of them. + */ +int mrkey_index(struct openpgp_publickey *keys) +{ + struct openpgp_signedpacket_list *curuid = NULL; + time_t created_time = 0; + int type = 0; + int length = 0; + int i = 0; + size_t fplength = 0; + unsigned char fp[20]; + + while (keys != NULL) { + created_time = (keys->publickey->data[1] << 24) + + (keys->publickey->data[2] << 16) + + (keys->publickey->data[3] << 8) + + keys->publickey->data[4]; + + printf("pub:"); + + switch (keys->publickey->data[0]) { + case 2: + case 3: + printf("%016llX", get_keyid(keys)); + type = keys->publickey->data[7]; + length = (keys->publickey->data[8] << 8) + + keys->publickey->data[9]; + break; + case 4: + get_fingerprint(keys->publickey, fp, &fplength); + + for (i = 0; i < fplength; i++) { + printf("%02X", fp[i]); + } + + type = keys->publickey->data[5]; + length = (keys->publickey->data[6] << 8) + + keys->publickey->data[7]; + break; + default: + logthing(LOGTHING_ERROR, "Unknown key type: %d", + keys->publickey->data[0]); + } + + printf(":%d:%d:%ld::%s\n", + type, + length, + created_time, + (keys->revocations == NULL) ? "" : "r"); + + for (curuid = keys->uids; curuid != NULL; + curuid = curuid->next) { + + if (curuid->packet->tag == 13) { + printf("uid:%.*s\n", + (int) curuid->packet->length, + curuid->packet->data); + } + } + keys = keys->next; + } + return 0; +}