X-Git-Url: https://git.sommitrealweird.co.uk/onak.git/blobdiff_plain/42d43e0ec08e249cecf74ec448cb6405b3c89d84..33cfd5887ea8d05241b5b4749abbf7fdfadb51fe:/photoid.c?ds=inline diff --git a/photoid.c b/photoid.c index 4416e3e..febc3f5 100644 --- a/photoid.c +++ b/photoid.c @@ -1,14 +1,22 @@ /* * photoid.c - Routines for OpenPGP id photos. * - * Jonathan McDowell + * Copyright 2004 Jonathan McDowell * - * Copyright 2004 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. * - * $Id: photoid.c,v 1.1 2004/05/27 01:25:37 noodles Exp $ + * 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 #include #include #include @@ -17,30 +25,62 @@ #include "keyid.h" #include "keyindex.h" #include "keystructs.h" +#include "log.h" +#include "photoid.h" /** * getphoto - returns an OpenPGP packet containing a photo id. * @key: The key to return the photo id from. * @index: The index of the photo to return. + * @photo: The photo data. + * @length: The length of the photo data. * - * This function returns the OpenPGP packet containing a photo id from a - * supplied key. index specifies which photo id should be returned. If - * there's no such photo id NULL is returned. + * This function returns the photo data contained in a supplied key. + * index specifies which photo id should be returned. If there's no such + * photo id NULL is returned. The returned data pointer refers to the key + * data supplied rather than a copy of it. */ -struct openpgp_packet *getphoto(struct openpgp_publickey *key, int index) +int getphoto(struct openpgp_publickey *key, int index, unsigned char **photo, + size_t *length) { struct openpgp_signedpacket_list *curuid = NULL; - struct openpgp_packet *photo = NULL; int i = 0; + int j = 0; - assert(key != NULL); + log_assert(key != NULL); + log_assert(photo != NULL); + log_assert(length != NULL); + *photo = NULL; + curuid = key->uids; i = 0; - while (photo == NULL && curuid != NULL && i <= index) { + while (*photo == NULL && curuid != NULL && i <= index) { if (curuid->packet->tag == 17) { if (i == index) { - photo = curuid->packet; + j = 0; + *length = curuid->packet->data[j++]; + if (*length < 192) { + /* length is correct */ + } else if (*length < 255) { + *length -= 192; + *length <<= 8; + *length += curuid->packet->data[j++]; + *length += 192; + } else { + *length = curuid->packet->data[j++]; + *length <<= 8; + *length += curuid->packet->data[j++]; + *length <<= 8; + *length += curuid->packet->data[j++]; + *length <<= 8; + *length += curuid->packet->data[j++]; + } + logthing(LOGTHING_DEBUG, "Got photo, size %d", + *length); + j++; + *length -= 17; + *photo = &(curuid->packet->data[j+16]); } else { i++; } @@ -48,5 +88,5 @@ struct openpgp_packet *getphoto(struct openpgp_publickey *key, int index) curuid = curuid->next; } - return photo; + return (*photo != NULL); }