res = _pgp_read_public_key(pkt, &pk); if (res < 0) goto err;
/* skip secret key part, if it exists */
res = pgp_skip_packet(pkt); if (res < 0) goto err;
/* is it encryption key */ switch (pk->algo)
{ case PGP_PUB_ELG_ENCRYPT: case PGP_PUB_RSA_ENCRYPT: case PGP_PUB_RSA_ENCRYPT_SIGN:
memcpy(keyid_buf, pk->key_id, 8);
res = 1; break; default:
res = 0;
}
err:
pgp_key_free(pk); return res;
}
staticint
read_pubenc_keyid(PullFilter *pkt, uint8 *keyid_buf)
{
uint8 ver; int res;
GETBYTE(pkt, ver); if (ver != 3) return -1;
res = pullf_read_fixed(pkt, 8, keyid_buf); if (res < 0) return res;
return pgp_skip_packet(pkt);
}
staticconstchar hextbl[] = "0123456789ABCDEF";
staticint
print_key(uint8 *keyid, char *dst)
{ int i; unsigned c;
for (i = 0; i < 8; i++)
{
c = keyid[i];
*dst++ = hextbl[(c >> 4) & 0x0F];
*dst++ = hextbl[c & 0x0F];
}
*dst = 0; return8 * 2;
}
/* *dstshouldhaveroomfor17bytes
*/ int
pgp_get_keyid(MBuf *pgp_data, char *dst)
{ int res;
PullFilter *src;
PullFilter *pkt = NULL; int len;
uint8 tag; int got_pub_key = 0,
got_symenc_key = 0,
got_pubenc_key = 0; int got_data = 0;
uint8 keyid_buf[8]; int got_main_key = 0;
res = pullf_create_mbuf_reader(&src, pgp_data); if (res < 0) return res;
while (1)
{
res = pgp_parse_pkt_hdr(src, &tag, &len, 0); if (res <= 0) break;
res = pgp_create_pkt_reader(&pkt, src, len, res, NULL); if (res < 0) break;
switch (tag)
{ case PGP_PKT_SECRET_KEY: case PGP_PKT_PUBLIC_KEY: /* main key is for signing, so ignore it */ if (!got_main_key)
{
got_main_key = 1;
res = pgp_skip_packet(pkt);
} else
res = PXE_PGP_MULTIPLE_KEYS; break; case PGP_PKT_SECRET_SUBKEY: case PGP_PKT_PUBLIC_SUBKEY:
res = read_pubkey_keyid(pkt, keyid_buf); if (res < 0) break; if (res > 0)
got_pub_key++; break; case PGP_PKT_PUBENCRYPTED_SESSKEY:
got_pubenc_key++;
res = read_pubenc_keyid(pkt, keyid_buf); break; case PGP_PKT_SYMENCRYPTED_DATA: case PGP_PKT_SYMENCRYPTED_DATA_MDC: /* don't skip it, just stop */
got_data = 1; break; case PGP_PKT_SYMENCRYPTED_SESSKEY:
got_symenc_key++; /* fall through */ case PGP_PKT_SIGNATURE: case PGP_PKT_MARKER: case PGP_PKT_TRUST: case PGP_PKT_USER_ID: case PGP_PKT_USER_ATTR: case PGP_PKT_PRIV_61:
res = pgp_skip_packet(pkt); break; default:
res = PXE_PGP_CORRUPT_DATA;
}
if (pkt)
pullf_free(pkt);
pkt = NULL;
if (res < 0 || got_data) break;
}
pullf_free(src); if (pkt)
pullf_free(pkt);
if (res < 0) return res;
/* now check sanity */ if (got_pub_key && got_pubenc_key)
res = PXE_PGP_CORRUPT_DATA;
if (got_pub_key > 1)
res = PXE_PGP_MULTIPLE_KEYS;
if (got_pubenc_key > 1)
res = PXE_PGP_MULTIPLE_KEYS;
/* *ifstillok,lookwhatwegot
*/ if (res >= 0)
{ if (got_pubenc_key || got_pub_key)
{ if (memcmp(keyid_buf, any_key, 8) == 0)
{
memcpy(dst, "ANYKEY", 7);
res = 6;
} else
res = print_key(keyid_buf, dst);
} elseif (got_symenc_key)
{
memcpy(dst, "SYMKEY", 7);
res = 6;
} else
res = PXE_PGP_NO_USABLE_KEY;
}
return res;
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.12 Sekunden
(vorverarbeitet am 2026-08-08)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.