#include "md5.h"
#include "sha.h"
+
/**
* get_keyid - Given a public key returns the keyid.
- * @publickey: The key to calculate the fingerprint for.
+ * @publickey: The key to calculate the id for.
*/
uint64_t get_keyid(struct openpgp_publickey *publickey)
+{
+ return (get_packetid(publickey->publickey));
+}
+
+/**
+ * get_packetid - Given a PGP packet returns the keyid.
+ * @packet: The packet to calculate the id for.
+ */
+uint64_t get_packetid(struct openpgp_packet *packet)
{
SHA1_CONTEXT sha_ctx;
uint64_t keyid = 0;
unsigned char c;
unsigned char *buff = NULL;
- assert(publickey != NULL);
+ assert(packet != NULL);
- switch (publickey->publickey->data[0]) {
+ switch (packet->data[0]) {
case 2:
case 3:
/*
*
* We need to ensure it's an RSA key.
*/
- if (publickey->publickey->data[7] == 1) {
- offset = (publickey->publickey->data[8] << 8) +
- publickey->publickey->data[9];
+ if (packet->data[7] == 1) {
+ offset = (packet->data[8] << 8) +
+ packet->data[9];
offset = ((offset + 7) / 8) + 2;
for (keyid = 0, i = 0; i < 8; i++) {
keyid <<= 8;
- keyid += publickey->publickey->data[offset++];
+ keyid += packet->data[offset++];
}
} else {
fputs("Type 2 or 3 key, but not RSA.\n", stderr);
*/
c = 0x99;
sha1_write(&sha_ctx, &c, sizeof(c));
- c = publickey->publickey->length >> 8;
+ c = packet->length >> 8;
sha1_write(&sha_ctx, &c, sizeof(c));
- c = publickey->publickey->length & 0xFF;
+ c = packet->length & 0xFF;
sha1_write(&sha_ctx, &c, sizeof(c));
- sha1_write(&sha_ctx, publickey->publickey->data,
- publickey->publickey->length);
+ sha1_write(&sha_ctx, packet->data,
+ packet->length);
sha1_final(&sha_ctx);
buff = sha1_read(&sha_ctx);
break;
default:
fprintf(stderr, "Unknown key type: %d\n",
- publickey->publickey->data[0]);
+ packet->data[0]);
}
return keyid;
/**
* get_keyid - Given a public key returns the keyid.
- * @publickey: The key to calculate the fingerprint for.
+ * @publickey: The key to calculate the id for.
*
* This function returns the key id for a given public key.
*/
uint64_t get_keyid(struct openpgp_publickey *publickey);
+/**
+ * get_packetid - Given a PGP packet returns the keyid.
+ * @packet: The packet to calculate the id for.
+ *
+ * This function returns the key id for a given PGP packet.
+ */
+uint64_t get_packetid(struct openpgp_packet *packet);
+
#endif /* __KEYID_H__ */
int list_sigs(struct openpgp_packet_list *sigs, bool html)
{
- int length = 0;
char *uid = NULL;
uint64_t sigid = 0;
return 0;
}
+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:
+ fprintf(stderr, "Unknown key type: %d\n",
+ 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;
+}
+
+
/**
* key_index - List a set of OpenPGP keys.
* @keys: The keys to display.
printf("pub %5d%c/%08X %04d/%02d/%02d ",
length,
- (type == 1) ? 'R' : ((type == 17) ? 'D' : '?'),
+ (type == 1) ? 'R' : ((type == 16) ? 'g' :
+ ((type == 17) ? 'D' : '?')),
(uint32_t) (get_keyid(keys) & 0xFFFFFFFF),
created->tm_year + 1900,
created->tm_mon + 1,
}
list_uids(curuid, verbose, html);
-
- //TODO: List subkeys.
+ list_subkeys(keys->subkeys, verbose, html);
keys = keys->next;
}