X-Git-Url: http://the.earth.li/gitweb/?a=blobdiff_plain;f=keyindex.c;h=f81de957b9e521bdabf98abe050feeb93597d217;hb=28052481c1892cd06a2626a1ecd7221c3814f0e6;hp=2e14e778f2c83a80b1d1f1d9fe90b2ab1377fd9c;hpb=36eef8ab7ec7c90e97f2371d7ca8c80d52fd3e27;p=onak.git
diff --git a/keyindex.c b/keyindex.c
index 2e14e77..f81de95 100644
--- a/keyindex.c
+++ b/keyindex.c
@@ -21,6 +21,7 @@
#include "keyid.h"
#include "keyindex.h"
#include "keystructs.h"
+#include "log.h"
int list_sigs(struct openpgp_packet_list *sigs, bool html)
{
@@ -60,20 +61,29 @@ int list_sigs(struct openpgp_packet_list *sigs, bool html)
return 0;
}
-int list_uids(struct openpgp_signedpacket_list *uids, bool verbose, bool html)
+int list_uids(uint64_t keyid, struct openpgp_signedpacket_list *uids,
+ bool verbose, bool html)
{
char buf[1024];
+ int imgindx = 0;
while (uids != NULL) {
if (uids->packet->tag == 13) {
snprintf(buf, 1023, "%.*s",
(int) uids->packet->length,
uids->packet->data);
- printf("uid %s\n",
+ printf(" %s\n",
(html) ? txt2html(buf) : buf);
} else if (uids->packet->tag == 17) {
- printf("uid "
- "[photo id]\n");
+ printf(" ");
+ if (html) {
+ printf("\n",
+ keyid,
+ imgindx);
+ imgindx++;
+ } else {
+ printf("[photo id]\n");
+ }
}
if (verbose) {
list_sigs(uids->sigs, html);
@@ -114,7 +124,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]);
}
@@ -180,6 +191,7 @@ int key_index(struct openpgp_publickey *keys, bool verbose, bool fingerprint,
int type = 0;
int length = 0;
char buf[1024];
+ uint64_t keyid;
if (html) {
puts("
"); @@ -205,15 +217,16 @@ 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]); } + keyid = (get_keyid(keys) & 0xFFFFFFFF), printf("pub %5d%c/%08X %04d/%02d/%02d ", length, (type == 1) ? 'R' : ((type == 16) ? 'g' : ((type == 17) ? 'D' : '?')), - (uint32_t) (get_keyid(keys) & 0xFFFFFFFF), + (uint32_t) keyid, created->tm_year + 1900, created->tm_mon + 1, created->tm_mday); @@ -223,7 +236,10 @@ 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); } @@ -232,14 +248,18 @@ int key_index(struct openpgp_publickey *keys, bool verbose, bool fingerprint, } curuid = curuid->next; } else { - putchar('\n'); + printf("%s\n", + (keys->revocations == NULL) ? "" : + "*** REVOKED ***"); if (fingerprint) { display_fingerprint(keys); } } - list_uids(curuid, verbose, html); - list_subkeys(keys->subkeys, verbose, html); + list_uids(keyid, curuid, verbose, html); + if (verbose) { + list_subkeys(keys->subkeys, verbose, html); + } keys = keys->next; } @@ -250,3 +270,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: + (void) 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; +}