/*
- * Copyright (C) 1997-2000 Thomas Roessler <roessler@guug.de>
+ * Copyright (C) 1997-2001 Thomas Roessler <roessler@does-not-exist.org>
*
* This program is free software; you can redistribute it
* and/or modify it under the terms of the GNU General Public
#endif
+static short dump_signatures = 0;
+
static void pgpring_find_candidates (char *ringfile, const char *hints[], int nhints);
static void pgpring_dump_keyblock (pgp_key_t *p);
char pgppath[_POSIX_PATH_MAX];
char kring[_POSIX_PATH_MAX];
- while ((c = getopt (argc, argv, "25sk:")) != EOF)
+ while ((c = getopt (argc, argv, "25sk:S")) != EOF)
{
switch (c)
{
+ case 'S':
+ {
+ dump_signatures = 1;
+ break;
+ }
+
case 'k':
{
_kring = optarg;
}
}
-static int pgp_parse_pgp2_sig (unsigned char *buff, size_t l, pgp_key_t * p)
+static int pgp_parse_pgp2_sig (unsigned char *buff, size_t l, pgp_key_t * p, pgp_sig_t *s)
{
unsigned char sigtype;
time_t sig_gen_time;
- unsigned long signerid;
+ unsigned long signerid1;
+ unsigned long signerid2;
size_t j;
int i;
for (i = 0; i < 4; i++)
sig_gen_time = (sig_gen_time << 8) + buff[j++];
- j += 4;
- signerid = 0;
+ signerid1 = signerid2 = 0;
+ for (i = 0; i < 4; i++)
+ signerid1 = (signerid1 << 8) + buff[j++];
+
for (i = 0; i < 4; i++)
- signerid = (signerid << 8) + buff[j++];
+ signerid2 = (signerid2 << 8) + buff[j++];
+
if (sigtype == 0x20 || sigtype == 0x28)
p->flags |= KEYFLAG_REVOKED;
+ if (s)
+ {
+ s->sigtype = sigtype;
+ s->sid1 = signerid1;
+ s->sid2 = signerid2;
+ }
+
return 0;
}
-static int pgp_parse_pgp3_sig (unsigned char *buff, size_t l, pgp_key_t * p)
+static int pgp_parse_pgp3_sig (unsigned char *buff, size_t l, pgp_key_t * p, pgp_sig_t *s)
{
unsigned char sigtype;
unsigned char pkalg;
time_t sig_gen_time = -1;
long validity = -1;
long key_validity = -1;
- long signerid = 0;
+ unsigned long signerid1 = 0;
+ unsigned long signerid2 = 0;
size_t ml;
size_t j;
int i;
{
if (skl < 8)
break;
- j += 4;
- signerid = 0;
+ signerid1 = 0;
+ for (i = 0; i < 4; i++)
+ signerid1 = (signerid1 << 8) + buff[j++];
+ signerid2 = 0;
for (i = 0; i < 4; i++)
- signerid = (signerid << 8) + buff[j++];
+ signerid2 = (signerid2 << 8) + buff[j++];
+
break;
}
case 10: /* CMR key */
if (have_critical_spks)
p->flags |= KEYFLAG_CRITICAL;
+ if (s)
+ {
+ s->sigtype = sigtype;
+ s->sid1 = signerid1;
+ s->sid2 = signerid2;
+ }
+
+
return 0;
}
-static int pgp_parse_sig (unsigned char *buff, size_t l, pgp_key_t * p)
+static int pgp_parse_sig (unsigned char *buff, size_t l, pgp_key_t * p, pgp_sig_t *sig)
{
if (!buff || l < 2 || !p)
return -1;
{
case 2:
case 3:
- return pgp_parse_pgp2_sig (buff, l, p);
+ return pgp_parse_pgp2_sig (buff, l, p, sig);
case 4:
- return pgp_parse_pgp3_sig (buff, l, p);
+ return pgp_parse_pgp3_sig (buff, l, p, sig);
default:
return -1;
}
pgp_key_t *p = NULL;
pgp_uid_t *uid = NULL;
pgp_uid_t **addr = NULL;
+ pgp_sig_t **lsig = NULL;
FGETPOS(fp,pos);
case PT_SIG:
{
- pgp_parse_sig (buff, l, p);
+ if (lsig)
+ {
+ pgp_sig_t *signature = safe_calloc (sizeof (pgp_sig_t), 1);
+ *lsig = signature;
+ lsig = &signature->next;
+
+ pgp_parse_sig (buff, l, p, signature);
+ }
break;
}
uid->parent = p;
uid->trust = 0;
addr = &uid->next;
-
+ lsig = &uid->sigs;
+
/* the following tags are generated by
* pgp 2.6.3in.
*/
static void pgpring_dump_keyblock (pgp_key_t *p)
{
pgp_uid_t *uid;
+ pgp_sig_t *sig;
short first;
struct tm *tp;
time_t t;
print_userid (uid->addr);
printf (":\n");
}
+
+ if (dump_signatures)
+ {
+ for (sig = uid->sigs; sig; sig = sig->next)
+ {
+ if (sig->sigtype == 0x10 || sig->sigtype == 0x11 ||
+ sig->sigtype == 0x12 || sig->sigtype == 0x13)
+ printf ("sig::::%08lX%08lX:::::::\n",
+ sig->sid1, sig->sid2);
+
+ }
+ }
}
}
}