*
* Copyright 2002 Project Purple
*
- * $Id: lookup.c,v 1.15 2004/05/27 01:25:37 noodles Exp $
+ * $Id: lookup.c,v 1.16 2004/05/27 21:58:18 noodles Exp $
*/
#include <inttypes.h>
initdb(true);
switch (op) {
case OP_GET:
- logthing(LOGTHING_NOTICE, "Getting keyid %llX",
+ logthing(LOGTHING_NOTICE, "Getting keyid 0x%llX",
keyid);
if (fetch_key(keyid, &publickey, false)) {
puts("<pre>");
packets);
puts("</pre>");
} else {
+ logthing(LOGTHING_NOTICE,
+ "Failed to fetch key.");
puts("Key not found");
}
break;
break;
case OP_PHOTO:
if (fetch_key(keyid, &publickey, false)) {
- struct openpgp_packet *photo = NULL;
- photo = getphoto(publickey, 0);
- if (photo != NULL) {
- fwrite(photo->data+19,
+ unsigned char *photo = NULL;
+ size_t length = 0;
+
+ if (getphoto(publickey, 0, &photo, &length)) {
+ fwrite(photo,
1,
- (photo->length - 19),
+ length,
stdout);
}
free_publickey(publickey);
*
* Copyright 2002 Project Purple
*
- * $Id: onak.c,v 1.20 2004/05/27 01:25:37 noodles Exp $
+ * $Id: onak.c,v 1.21 2004/05/27 21:58:18 noodles Exp $
*/
#include <stdio.h>
puts("Can't get a key on uid text."
" You must supply a keyid.");
} else if (fetch_key(keyid, &keys, false)) {
- struct openpgp_packet *photo = NULL;
- FILE *photof = NULL;
- photo = getphoto(keys, 0);
- if (photo != NULL) {
- photof = fopen("keyphoto.jpg", "w");
- fwrite(photo->data+19,
- 1,
- (photo->length - 19),
- photof);
- fclose(photof);
+ unsigned char *photo = NULL;
+ size_t length = 0;
+
+ if (getphoto(keys, 0, &photo, &length)) {
+ fwrite(photo,
+ 1,
+ length,
+ stdout);
}
free_publickey(keys);
keys = NULL;
*
* Copyright 2004 Project Purple
*
- * $Id: photoid.c,v 1.1 2004/05/27 01:25:37 noodles Exp $
+ * $Id: photoid.c,v 1.2 2004/05/27 21:58:18 noodles Exp $
*/
#include <assert.h>
#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);
+ assert(photo != NULL);
+ 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++;
}
curuid = curuid->next;
}
- return photo;
+ return (*photo != NULL);
}
*
* Copyright 2004 Project Purple
*
- * $Id: photoid.h,v 1.1 2004/05/27 01:25:37 noodles Exp $
+ * $Id: photoid.h,v 1.2 2004/05/27 21:58:18 noodles Exp $
*/
#ifndef __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);
#endif /* __PHOTOID_H__ */