RPM Package Manager, CVS Repository http://rpm5.org/cvs/ ____________________________________________________________________________
Server: rpm5.org Name: Jeff Johnson Root: /v/rpm/cvs Email: j...@rpm5.org Module: rpm Date: 23-Jun-2010 08:51:55 Branch: HEAD Handle: 2010062306515401 Modified files: rpm CHANGES rpm/lib rpmchecksig.c rpm/rpmdb pkgio.c Log: - pgp: retrieve pubkey from package header (if present). Summary: Revision Changes Path 1.3398 +1 -0 rpm/CHANGES 1.238 +25 -0 rpm/lib/rpmchecksig.c 1.118 +17 -2 rpm/rpmdb/pkgio.c ____________________________________________________________________________ patch -p0 <<'@@ .' Index: rpm/CHANGES ============================================================================ $ cvs diff -u -r1.3397 -r1.3398 CHANGES --- rpm/CHANGES 23 Jun 2010 06:47:29 -0000 1.3397 +++ rpm/CHANGES 23 Jun 2010 06:51:54 -0000 1.3398 @@ -1,6 +1,7 @@ 5.3.2 -> 5.4a1: 5.3.1 -> 5.3.2: + - jbj: pgp: retrieve pubkey from package header (if present). - jbj: pgp: add pgpArmorUnwrap to parse a pubkey from a buffer. - jbj: change to last (from first) pubkey in header argv array. - jbj: i18n: update po files (Translation Project). @@ . patch -p0 <<'@@ .' Index: rpm/lib/rpmchecksig.c ============================================================================ $ cvs diff -u -r1.237 -r1.238 rpmchecksig.c --- rpm/lib/rpmchecksig.c 22 May 2010 00:46:18 -0000 1.237 +++ rpm/lib/rpmchecksig.c 23 Jun 2010 06:51:55 -0000 1.238 @@ -921,6 +921,7 @@ HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he)); unsigned char buf[4*BUFSIZ]; ssize_t count; + unsigned ix; rpmRC rc; int xx; @@ -940,6 +941,30 @@ dig->nbytes += headerSizeof(h); + /* Fish out the autosign pubkey (if present). */ + he->tag = RPMTAG_PUBKEYS; + xx = headerGet(h, he, 0); + if (xx && he->p.argv != NULL && he->c > 0) + switch (he->t) { + default: + break; + case RPM_STRING_ARRAY_TYPE: + ix = he->c - 1; /* XXX FIXME: assumes last pubkey */ + dig->pub = _free(dig->pub); + dig->publen = 0; + { rpmiob iob = rpmiobNew(0); + iob = rpmiobAppend(iob, he->p.argv[ix], 0); + xx = pgpArmorUnwrap(iob,(rpmuint8_t **)&dig->pub, &dig->publen); + iob = rpmiobFree(iob); + } + if (xx != PGPARMOR_PUBKEY) { + dig->pub = _free(dig->pub); + dig->publen = 0; + } + break; + } + he->p.ptr = _free(he->p.ptr); + if (headerIsEntry(h, RPMTAG_HEADERIMMUTABLE)) { unsigned char * hmagic = NULL; size_t nmagic = 0; @@ . patch -p0 <<'@@ .' Index: rpm/rpmdb/pkgio.c ============================================================================ $ cvs diff -u -r1.117 -r1.118 pkgio.c --- rpm/rpmdb/pkgio.c 23 Jun 2010 04:55:13 -0000 1.117 +++ rpm/rpmdb/pkgio.c 23 Jun 2010 06:51:55 -0000 1.118 @@ -281,6 +281,21 @@ fprintf(stderr, "\t%s: rpmdb %p[%u]\n", __FUNCTION__, hkp->pkt, hkp->pktlen); } + /* Try autosign package pubkey (if present). */ + if (hkp->pkt == NULL && dig->pub && dig->publen > 0) { + uint8_t keyid[8]; + + xx = pgpPubkeyFingerprint(dig->pub, dig->publen, keyid); + if (!memcmp(sigp->signid, keyid, sizeof(keyid))) { + hkp->pkt = (uint8_t *) dig->pub; dig->pub = NULL; + hkp->pktlen = dig->publen; dig->publen = 0; + pubkeysource = xstrdup("package"); +validate = -1; /* XXX rpmhkpValidate is prerequisite for rpmhkpFindKey */ +if (_rpmhkp_debug) +fprintf(stderr, "\t%s: auto %p[%u]\n", __FUNCTION__, hkp->pkt, hkp->pktlen); + } + } + /* Try keyserver lookup. */ if (hkp->pkt == NULL) { const char * fn = rpmExpand("%{_hkp_keyserver_query}", "0x", @@ -321,10 +336,10 @@ #endif /* Was a matching pubkey found? */ -if (_rpmhkp_debug) -fprintf(stderr, "\t%s: match %p[%u]\n", __FUNCTION__, hkp->pkt, hkp->pktlen); if (hkp->pkt == NULL || hkp->pktlen == 0) goto exit; +if (_rpmhkp_debug) +fprintf(stderr, "\t%s: match %p[%u]\n", __FUNCTION__, hkp->pkt, hkp->pktlen); /* Split the result into packet array. */ hkp->pkts = _free(hkp->pkts); /* XXX memleaks */ @@ . ______________________________________________________________________ RPM Package Manager http://rpm5.org CVS Sources Repository rpm-cvs@rpm5.org