+int list_subkeys(struct openpgp_signedpacket_list *subkeys, bool verbose,
+ bool html)
+{
+ struct tm *created = NULL;
+ time_t created_time = 0;
+ int type = 0;
+ int length = 0;
+
+ while (subkeys != NULL) {
+ if (subkeys->packet->tag == 14) {
+
+ created_time = (subkeys->packet->data[1] << 24) +
+ (subkeys->packet->data[2] << 16) +
+ (subkeys->packet->data[3] << 8) +
+ subkeys->packet->data[4];
+ created = gmtime(&created_time);
+
+ switch (subkeys->packet->data[0]) {
+ case 2:
+ case 3:
+ type = subkeys->packet->data[7];
+ length = (subkeys->packet->data[8] << 8) +
+ subkeys->packet->data[9];
+ break;
+ case 4:
+ type = subkeys->packet->data[5];
+ length = (subkeys->packet->data[6] << 8) +
+ subkeys->packet->data[7];
+ break;
+ default:
+ logthing(LOGTHING_ERROR,
+ "Unknown key type: %d",
+ subkeys->packet->data[0]);
+ }
+
+ printf("sub %5d%c/%08X %04d/%02d/%02d\n",
+ length,
+ (type == 1) ? 'R' : ((type == 16) ? 'g' :
+ ((type == 17) ? 'D' : '?')),
+ (uint32_t) (get_packetid(subkeys->packet) &
+ 0xFFFFFFFF),
+ created->tm_year + 1900,
+ created->tm_mon + 1,
+ created->tm_mday);
+
+ }
+ if (verbose) {
+ list_sigs(subkeys->sigs, html);
+ }
+ subkeys = subkeys->next;
+ }
+
+ 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;
+}
+