return str;
}
+/* internal representation of a signature */
struct pgpsig {
int type;
Id hashalgo;
return 0;
}
+/* hash the pubkey/userid data for self-sig verification
+ * hash the final trailer
+ * create a "sigdata" block suitable for a call to solv_pgpverify */
static void
-createsigdata(struct pgpsig *sig, unsigned char *p, int l, unsigned char *pubkey, int pubkeyl, unsigned char *userid, int useridl, void *h)
+pgpsig_makesigdata(struct pgpsig *sig, unsigned char *p, int l, unsigned char *pubkey, int pubkeyl, unsigned char *userid, int useridl, void *h)
{
int type = sig->type;
unsigned char b[6];
}
}
+/* parse the header of a subpacket contained in a signature packet
+ * returns: length of the packet header, 0 if there was an error
+ * *pktlp is set to the packet length, the tag is the first byte.
+ */
static inline int
parsesubpkglength(unsigned char *q, int ql, int *pktlp)
{
return hl;
}
+/* parse a signature packet, initializing the pgpsig struct */
static void
-parsesigpacket(struct pgpsig *sig, unsigned char *p, int l)
+pgpsig_init(struct pgpsig *sig, unsigned char *p, int l)
{
+ memset(sig, 0, sizeof(*sig));
sig->type = -1;
if (p[0] == 3)
{
}
}
+/* parse a pgp packet header
+ * returns: length of the packet header, 0 if there was an error
+ * *tagp and *pktlp is set to the packet tag and the packet length
+ */
static int
parsepkgheader(unsigned char *p, int pl, int *tagp, int *pktlp)
{
}
/* parse the first pubkey (possible creating new packages for the subkeys)
- * returns the number of parsed bytes */
+ * returns the number of parsed bytes.
+ * if flags contains ADD_WITH_SUBKEYS, all subkeys will be added as new
+ * solvables as well */
static int
-parsekeydata(Solvable *s, Repodata *data, unsigned char *p, int pl, int flags)
+parsepubkey(Solvable *s, Repodata *data, unsigned char *p, int pl, int flags)
{
Repo *repo = s->repo;
unsigned char *pstart = p;
}
if (tag == 6 || (tag == 14 && !(flags & ADD_WITH_SUBKEYS)))
break;
+ /* create new solvable for subkey */
s = pool_id2solvable(repo->pool, repo_add_solvable(repo));
}
p += hl;
Id htype;
if (!pubdata)
continue;
- memset(&sig, 0, sizeof(sig));
- parsesigpacket(&sig, p, l);
+ pgpsig_init(&sig, p, l);
if (!sig.haveissuer || !((sig.type >= 0x10 && sig.type <= 0x13) || sig.type == 0x1f))
continue;
if (sig.type >= 0x10 && sig.type <= 0x13 && !userid)
if (htype && sig.mpioff)
{
void *h = solv_chksum_create(htype);
- createsigdata(&sig, p, l, pubkey, pubkeyl, userid, useridl, h);
+ pgpsig_makesigdata(&sig, p, l, pubkey, pubkeyl, userid, useridl, h);
solv_chksum_free(h, 0);
}
if (!memcmp(keyid, sig.issuer, 8))
/* only rpm knows how to do the release calculation, we don't dare
* to recreate all the bugs in libsolv */
static void
-parsekeydata_rpm(Solvable *s, Repodata *data, unsigned char *pkts, int pktsl)
+parsepubkey_rpm(Solvable *s, Repodata *data, unsigned char *pkts, int pktsl)
{
Pool *pool = s->repo->pool;
struct pgpDigParams_s *digpubkey;
#endif /* ENABLE_RPMDB */
+/* parse an ascii armored pubkey
+ * adds multiple pubkeys if ADD_MULTIPLE_PUBKEYS is set */
static int
pubkey2solvable(Pool *pool, Id p, Repodata *data, char *pubkey, int flags)
{
if (tag == 6)
{
setutf8string(data, p, SOLVABLE_DESCRIPTION, pubkey);
- pl = parsekeydata(pool->solvables + p, data, pkts, pktsl, flags);
+ pl = parsepubkey(pool->solvables + p, data, pkts, pktsl, flags);
#ifdef ENABLE_RPMDB
- parsekeydata_rpm(pool->solvables + p, data, pkts, pktsl);
+ parsepubkey_rpm(pool->solvables + p, data, pkts, pktsl);
#endif
if (!pl || !(flags & ADD_MULTIPLE_PUBKEYS))
break;
}
Id
-repo_add_pubkey(Repo *repo, const char *key, int flags)
+repo_add_pubkey(Repo *repo, const char *keyfile, int flags)
{
Pool *pool = repo->pool;
Repodata *data;
data = repo_add_repodata(repo, flags);
buf = 0;
- if ((fp = fopen(flags & REPO_USE_ROOTDIR ? pool_prepend_rootdir_tmp(pool, key) : key, "r")) == 0)
+ if ((fp = fopen(flags & REPO_USE_ROOTDIR ? pool_prepend_rootdir_tmp(pool, keyfile) : keyfile, "r")) == 0)
{
- pool_error(pool, -1, "%s: %s", key, strerror(errno));
+ pool_error(pool, -1, "%s: %s", keyfile, strerror(errno));
return 0;
}
if ((buf = solv_slurp(fp, 0)) == 0)
{
- pool_error(pool, -1, "%s: %s", key, strerror(errno));
+ pool_error(pool, -1, "%s: %s", keyfile, strerror(errno));
fclose(fp);
return 0;
}
{
Id p2;
for (p2 = p; p2 < pool->nsolvables; p2++)
- repodata_set_location(data, p2, 0, 0, key);
+ repodata_set_location(data, p2, 0, 0, keyfile);
}
solv_free(buf);
if (!(flags & REPO_NO_INTERNALIZE))
char *solvversion = pool_tmpjoin(pool, "libsolv-", LIBSOLV_VERSION_STRING, 0);
char *descr = armor(pbuf, pbufl, "-----BEGIN PGP PUBLIC KEY BLOCK-----", "-----END PGP PUBLIC KEY BLOCK-----", solvversion);
setutf8string(data, p, SOLVABLE_DESCRIPTION, descr);
- parsekeydata(pool->solvables + p, data, pbuf, pbufl, flags);
+ parsepubkey(pool->solvables + p, data, pbuf, pbufl, flags);
#ifdef ENABLE_RPMDB
- parsekeydata_rpm(pool->solvables + p, data, pbuf, pbufl);
+ parsepubkey_rpm(pool->solvables + p, data, pbuf, pbufl);
#endif
}
solv_free(sig);
return 0;
}
- memset(&pgpsig, 0, sizeof(pgpsig));
- parsesigpacket(&pgpsig, sig + hl, pktl);
+ pgpsig_init(&pgpsig, sig + hl, pktl);
if (pgpsig.type != 0 || !pgpsig.haveissuer)
{
solv_free(sig);
Id htype;
void *chk2;
- memset(&pgpsig, 0, sizeof(pgpsig));
- parsesigpacket(&pgpsig, sigpkt, sigpktl);
+ pgpsig_init(&pgpsig, sigpkt, sigpktl);
if (pgpsig.type != 0)
return 0;
htype = pgphashalgo2type(pgpsig.hashalgo);
if (!htype || htype != solv_chksum_get_type(chk))
return 0; /* wrong hash type? */
chk2 = solv_chksum_create_clone(chk);
- createsigdata(&pgpsig, sigpkt, sigpktl, 0, 0, 0, 0, chk2);
+ pgpsig_makesigdata(&pgpsig, sigpkt, sigpktl, 0, 0, 0, 0, chk2);
solv_chksum_free(chk2, 0);
if (!pgpsig.sigdata)
return 0;
void *chk2;
Id p;
- parsesigpacket(&pgpsig, ss->sigpkt, ss->sigpktl);
+ pgpsig_init(&pgpsig, ss->sigpkt, ss->sigpktl);
chk2 = solv_chksum_create_clone(chk);
- createsigdata(&pgpsig, ss->sigpkt, ss->sigpktl, 0, 0, 0, 0, chk2);
+ pgpsig_makesigdata(&pgpsig, ss->sigpkt, ss->sigpktl, 0, 0, 0, 0, chk2);
solv_chksum_free(chk2, 0);
if (!pgpsig.sigdata)
return 0;