X-Git-Url: https://git.sommitrealweird.co.uk/onak.git/blobdiff_plain/8b4052ad6015aa9f54c9c824f28655f230d09d8d..e0dd4d10f385cd19da389ec66622eea8aa66ae59:/decodekey.c diff --git a/decodekey.c b/decodekey.c index efffad7..b4f7ceb 100644 --- a/decodekey.c +++ b/decodekey.c @@ -1,9 +1,20 @@ /* * decodekey.c - Routines to further decode an OpenPGP key. * - * Jonathan McDowell + * Copyright 2002-2008 Jonathan McDowell * - * Copyright 2002 Project Purple + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include @@ -18,17 +29,20 @@ #include "keystructs.h" #include "ll.h" #include "log.h" +#include "openpgp.h" /* * parse_subpackets - Parse the subpackets of a Type 4 signature. * @data: The subpacket data. - * @keyid: A pointer to where we should return the keyid. + * @keyid: A pointer to where we should return the keyid. + * @creationtime: A pointer to where we should return the creation time. * * This function parses the subkey data of a Type 4 signature and fills * in the supplied variables. It also returns the length of the data - * processed. + * processed. If the value of any piece of data is not desired a NULL + * can be passed instead of a pointer to a storage area for that value. */ -int parse_subpackets(unsigned char *data, uint64_t *keyid) +int parse_subpackets(unsigned char *data, uint64_t *keyid, time_t *creation) { int offset = 0; int length = 0; @@ -54,47 +68,60 @@ int parse_subpackets(unsigned char *data, uint64_t *keyid) packetlen = data[offset++]; } switch (data[offset] & 0x7F) { - case 2: + case OPENPGP_SIGSUB_CREATION: /* - * Signature creation time. Might want to output this? + * Signature creation time. */ + if (creation != NULL) { + *creation = data[offset + packetlen - 4]; + *creation <<= 8; + *creation = data[offset + packetlen - 3]; + *creation <<= 8; + *creation = data[offset + packetlen - 2]; + *creation <<= 8; + *creation = data[offset + packetlen - 1]; + } break; - case 3: /* * Signature expiration time. Might want to output this? */ break; - case 16: - *keyid = data[offset+packetlen - 8]; - *keyid <<= 8; - *keyid += data[offset+packetlen - 7]; - *keyid <<= 8; - *keyid += data[offset+packetlen - 6]; - *keyid <<= 8; - *keyid += data[offset+packetlen - 5]; - *keyid <<= 8; - *keyid += data[offset+packetlen - 4]; - *keyid <<= 8; - *keyid += data[offset+packetlen - 3]; - *keyid <<= 8; - *keyid += data[offset+packetlen - 2]; - *keyid <<= 8; - *keyid += data[offset+packetlen - 1]; - break; - case 20: - /* - * Annotation data. - */ - break; - - case 23: - /* - * Key server preferences. Including no-modify. - */ + case OPENPGP_SIGSUB_ISSUER: + if (keyid != NULL) { + *keyid = data[offset+packetlen - 8]; + *keyid <<= 8; + *keyid += data[offset+packetlen - 7]; + *keyid <<= 8; + *keyid += data[offset+packetlen - 6]; + *keyid <<= 8; + *keyid += data[offset+packetlen - 5]; + *keyid <<= 8; + *keyid += data[offset+packetlen - 4]; + *keyid <<= 8; + *keyid += data[offset+packetlen - 3]; + *keyid <<= 8; + *keyid += data[offset+packetlen - 2]; + *keyid <<= 8; + *keyid += data[offset+packetlen - 1]; + } break; - case 25: + case OPENPGP_SIGSUB_EXPIRY: + case OPENPGP_SIGSUB_EXPORTABLE: + case OPENPGP_SIGSUB_TRUSTSIG: + case OPENPGP_SIGSUB_REGEX: + case OPENPGP_SIGSUB_KEYEXPIRY: + case OPENPGP_SIGSUB_PREFSYM: + case OPENPGP_SIGSUB_NOTATION: + case OPENPGP_SIGSUB_PREFHASH: + case OPENPGP_SIGSUB_PREFCOMPRESS: + case OPENPGP_SIGSUB_KEYSERVER: + case OPENPGP_SIGSUB_PRIMARYUID: + case OPENPGP_SIGSUB_POLICYURI: + case OPENPGP_SIGSUB_KEYFLAGS: /* - * Primary UID. + * Various subpacket types we know about, but don't + * currently handle. Some are candidates for being + * supported if we add signature checking support. */ break; default: @@ -138,42 +165,55 @@ struct ll *keysigs(struct ll *curll, } /** - * sig_keyid - Return the keyid for a given OpenPGP signature packet. - * @packet: The signature packet. + * sig_info - Get info on a given OpenPGP signature packet + * @packet: The signature packet + * @keyid: A pointer for where to return the signature keyid + * @creation: A pointer for where to return the signature creation time * - * Returns the keyid for the supplied signature packet. + * Gets any info about a signature packet; parses the subpackets for a v4 + * key or pulls the data directly from v2/3. NULL can be passed for any + * values which aren't cared about. */ -uint64_t sig_keyid(struct openpgp_packet *packet) +void sig_info(struct openpgp_packet *packet, uint64_t *keyid, time_t *creation) { int length = 0; - uint64_t keyid = 0; if (packet != NULL) { - keyid = 0; switch (packet->data[0]) { case 2: case 3: - keyid = packet->data[7]; - keyid <<= 8; - keyid += packet->data[8]; - keyid <<= 8; - keyid += packet->data[9]; - keyid <<= 8; - keyid += packet->data[10]; - keyid <<= 8; - keyid += packet->data[11]; - keyid <<= 8; - keyid += packet->data[12]; - keyid <<= 8; - keyid += packet->data[13]; - keyid <<= 8; - keyid += packet->data[14]; + if (keyid != NULL) { + *keyid = packet->data[7]; + *keyid <<= 8; + *keyid += packet->data[8]; + *keyid <<= 8; + *keyid += packet->data[9]; + *keyid <<= 8; + *keyid += packet->data[10]; + *keyid <<= 8; + *keyid += packet->data[11]; + *keyid <<= 8; + *keyid += packet->data[12]; + *keyid <<= 8; + *keyid += packet->data[13]; + *keyid <<= 8; + *keyid += packet->data[14]; + } + if (creation != NULL) { + *creation = packet->data[3]; + *creation <<= 8; + *creation = packet->data[4]; + *creation <<= 8; + *creation = packet->data[5]; + *creation <<= 8; + *creation = packet->data[6]; + } break; case 4: length = parse_subpackets(&packet->data[4], - &keyid); + keyid, creation); parse_subpackets(&packet->data[length + 4], - &keyid); + keyid, creation); /* * Don't bother to look at the unsigned packets. */ @@ -183,9 +223,25 @@ uint64_t sig_keyid(struct openpgp_packet *packet) } } + return; +} + +/** + * sig_keyid - Return the keyid for a given OpenPGP signature packet. + * @packet: The signature packet. + * + * Returns the keyid for the supplied signature packet. + */ +uint64_t sig_keyid(struct openpgp_packet *packet) +{ + uint64_t keyid = 0; + + sig_info(packet, &keyid, NULL); + return keyid; } + /* * TODO: Abstract out; all our linked lists should be generic and then we can * llsize them. @@ -226,7 +282,7 @@ char **keyuids(struct openpgp_publickey *key, char **primary) curuid = key->uids; while (curuid != NULL) { buf[0] = 0; - if (curuid->packet->tag == 13) { + if (curuid->packet->tag == OPENPGP_PACKET_UID) { snprintf(buf, 1023, "%.*s", (int) curuid->packet->length, curuid->packet->data); @@ -259,13 +315,13 @@ 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); + get_packetid(cursubkey->packet, &subkeys[count++]); cursubkey = cursubkey -> next; } subkeys[count] = 0;