From: Michael Schroeder Date: Tue, 29 Oct 2013 09:55:30 +0000 (+0100) Subject: refactor a bit, add some comments X-Git-Tag: 0.6.4~165 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=391a5ad0e658de3c0316d4ed9145af70504bf276;p=thirdparty%2Flibsolv.git refactor a bit, add some comments --- diff --git a/ext/repo_pubkey.c b/ext/repo_pubkey.c index 6b8afa17..12d2990c 100644 --- a/ext/repo_pubkey.c +++ b/ext/repo_pubkey.c @@ -234,6 +234,7 @@ armor(unsigned char *pkt, int pktl, const char *startstr, const char *endstr, co return str; } +/* internal representation of a signature */ struct pgpsig { int type; Id hashalgo; @@ -259,8 +260,11 @@ pgphashalgo2type(int algo) 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]; @@ -318,6 +322,10 @@ createsigdata(struct pgpsig *sig, unsigned char *p, int l, unsigned char *pubkey } } +/* 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) { @@ -349,9 +357,11 @@ 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) { @@ -424,6 +434,10 @@ parsesigpacket(struct pgpsig *sig, unsigned char *p, int l) } } +/* 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) { @@ -478,9 +492,11 @@ 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; @@ -538,6 +554,7 @@ parsekeydata(Solvable *s, Repodata *data, unsigned char *p, int pl, int flags) } 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; @@ -623,8 +640,7 @@ parsekeydata(Solvable *s, Repodata *data, unsigned char *p, int pl, int flags) 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) @@ -633,7 +649,7 @@ parsekeydata(Solvable *s, Repodata *data, unsigned char *p, int pl, int flags) 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)) @@ -717,7 +733,7 @@ struct pgpDig_s { /* 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; @@ -760,6 +776,8 @@ parsekeydata_rpm(Solvable *s, Repodata *data, unsigned char *pkts, int pktsl) #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) { @@ -778,9 +796,9 @@ 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; @@ -889,7 +907,7 @@ solv_slurp(FILE *fp, int *lenp) } 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; @@ -899,14 +917,14 @@ repo_add_pubkey(Repo *repo, const char *key, int flags) 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; } @@ -922,7 +940,7 @@ repo_add_pubkey(Repo *repo, const char *key, int flags) { 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)) @@ -957,9 +975,9 @@ add_one_pubkey(Pool *pool, Repo *repo, Repodata *data, unsigned char *pbuf, int 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 } @@ -1097,8 +1115,7 @@ solvsig_create(FILE *fp) 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); @@ -1132,15 +1149,14 @@ solv_verify_sig(const unsigned char *pubdata, int pubdatal, unsigned char *sigpk 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; @@ -1185,9 +1201,9 @@ solvsig_verify(Solvsig *ss, Repo *repo, void *chk) 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; diff --git a/ext/repo_pubkey.h b/ext/repo_pubkey.h index 98063526..a3f2befe 100644 --- a/ext/repo_pubkey.h +++ b/ext/repo_pubkey.h @@ -13,7 +13,7 @@ #define ADD_WITH_KEYSIGNATURES (1 << 11) extern int repo_add_rpmdb_pubkeys(Repo *repo, int flags); -extern Id repo_add_pubkey(Repo *repo, const char *key, int flags); +extern Id repo_add_pubkey(Repo *repo, const char *keyfile, int flags); extern int repo_add_keyring(Repo *repo, FILE *fp, int flags); extern int repo_add_keydir(Repo *repo, const char *keydir, int flags, const char *suffix);