- disable expensive header+payload verifies in default config.

- adjust digest/signature stats to count #pkgs and bytes.

CVS patchset: 7465
CVS date: 2004/10/15 00:14:29
This commit is contained in:
jbj 2004-10-15 00:14:29 +00:00
parent 44b6c33422
commit d57bc03f65
6 changed files with 68 additions and 23 deletions

View File

@ -16,6 +16,8 @@
- python: permit rpm.fi() analogue to hdr.fiFromHeader() creator.
- silently add default %defattr(-,root,root) for all packages.
- fix: don't set handler if SIG_IGN is already set (#134474).
- disable expensive header+payload verifies in default config.
- adjust digest/signature stats to count #pkgs and bytes.
4.3.1 -> 4.3.2:
- use /etc/selinux/targeted/contexts/files/file_contexts for now.

View File

@ -749,9 +749,10 @@ rpmRC rpmReadPackageFile(rpmts ts, FD_t fd, const char * fn, Header * hdrp)
int_32 sigtype;
const void * sig;
int_32 siglen;
rpmtsOpX opx;
size_t nb;
Header h = NULL;
const char * msg;
int hmagic;
rpmVSFlags vsflags;
rpmRC rc = RPMRC_FAIL; /* assume failure */
int xx;
@ -819,42 +820,60 @@ rpmRC rpmReadPackageFile(rpmts ts, FD_t fd, const char * fn, Header * hdrp)
#define _chk(_mask) (sigtag == 0 && !(vsflags & (_mask)))
/* Figger the most effective available signature. */
/*
* Figger the most effective available signature.
* Prefer signatures over digests, then header-only over header+payload.
* DSA will be preferred over RSA if both exist because tested first.
* Note that NEEDPAYLOAD prevents header+payload signatures and digests.
*/
sigtag = 0;
opx = 0;
vsflags = rpmtsVSFlags(ts);
#ifdef DYING
if (_chk(RPMVSF_NODSAHEADER) && headerIsEntry(sigh, RPMSIGTAG_DSA))
if (_chk(RPMVSF_NODSAHEADER) && headerIsEntry(sigh, RPMSIGTAG_DSA)) {
sigtag = RPMSIGTAG_DSA;
if (_chk(RPMVSF_NORSAHEADER) && headerIsEntry(sigh, RPMSIGTAG_RSA))
} else
if (_chk(RPMVSF_NORSAHEADER) && headerIsEntry(sigh, RPMSIGTAG_RSA)) {
sigtag = RPMSIGTAG_RSA;
#endif
} else
if (_chk(RPMVSF_NODSA|RPMVSF_NEEDPAYLOAD) &&
headerIsEntry(sigh, RPMSIGTAG_GPG))
{
sigtag = RPMSIGTAG_GPG;
fdInitDigest(fd, PGPHASHALGO_SHA1, 0);
}
opx = RPMTS_OP_SIGNATURE;
} else
if (_chk(RPMVSF_NORSA|RPMVSF_NEEDPAYLOAD) &&
headerIsEntry(sigh, RPMSIGTAG_PGP))
{
sigtag = RPMSIGTAG_PGP;
fdInitDigest(fd, PGPHASHALGO_MD5, 0);
}
#ifdef DYING
if (_chk(RPMVSF_NOSHA1HEADER) && headerIsEntry(sigh, RPMSIGTAG_SHA1))
opx = RPMTS_OP_SIGNATURE;
} else
if (_chk(RPMVSF_NOSHA1HEADER) && headerIsEntry(sigh, RPMSIGTAG_SHA1)) {
sigtag = RPMSIGTAG_SHA1;
#endif
} else
if (_chk(RPMVSF_NOMD5|RPMVSF_NEEDPAYLOAD) &&
headerIsEntry(sigh, RPMSIGTAG_MD5))
{
sigtag = RPMSIGTAG_MD5;
fdInitDigest(fd, PGPHASHALGO_MD5, 0);
opx = RPMTS_OP_DIGEST;
}
/* Read the metadata, computing digest(s) on the fly. */
h = NULL;
msg = NULL;
/* XXX stats will include header i/o and setup overhead. */
/* XXX repackaged packages have appended tags, legacy dig/sig check fails */
if (opx > 0)
(void) rpmswEnter(rpmtsOp(ts, opx), 0);
nb = -fd->stats->ops[FDSTAT_READ].bytes;
rc = rpmReadHeader(ts, fd, &h, &msg);
nb += fd->stats->ops[FDSTAT_READ].bytes;
if (opx > 0)
(void) rpmswExit(rpmtsOp(ts, opx), nb);
if (rc != RPMRC_OK || h == NULL) {
rpmError(RPMERR_FREAD, _("%s: headerRead failed: %s"), fn,
(msg && *msg ? msg : "\n"));
@ -863,7 +882,7 @@ rpmRC rpmReadPackageFile(rpmts ts, FD_t fd, const char * fn, Header * hdrp)
}
msg = _free(msg);
/* Any signatures to check? */
/* Any digests or signatures to check? */
if (sigtag == 0) {
rc = RPMRC_OK;
goto exit;
@ -894,7 +913,7 @@ rpmRC rpmReadPackageFile(rpmts ts, FD_t fd, const char * fn, Header * hdrp)
rpmMessage(RPMMESS_WARNING,
_("only V3 signatures can be verified, skipping V%u signature\n"),
dig->signature.version);
rc = RPMRC_OK;
rc = RPMRC_OK; /* XXX return header w/o verify */
goto exit;
}
{ void * uh = NULL;
@ -903,11 +922,14 @@ rpmRC rpmReadPackageFile(rpmts ts, FD_t fd, const char * fn, Header * hdrp)
if (!headerGetEntry(h, RPMTAG_HEADERIMMUTABLE, &uht, &uh, &uhc))
break;
(void) rpmswEnter(rpmtsOp(ts, RPMTS_OP_DIGEST), 0);
dig->md5ctx = rpmDigestInit(PGPHASHALGO_MD5, RPMDIGEST_NONE);
(void) rpmDigestUpdate(dig->md5ctx, header_magic, sizeof(header_magic));
dig->nbytes += sizeof(header_magic);
(void) rpmDigestUpdate(dig->md5ctx, uh, uhc);
dig->nbytes += uhc;
(void) rpmswExit(rpmtsOp(ts, RPMTS_OP_DIGEST), dig->nbytes);
rpmtsOp(ts, RPMTS_OP_DIGEST)->count--; /* XXX one too many */
uh = headerFreeData(uh, uht);
} break;
case RPMSIGTAG_DSA:
@ -918,7 +940,7 @@ rpmRC rpmReadPackageFile(rpmts ts, FD_t fd, const char * fn, Header * hdrp)
rpmMessage(RPMMESS_WARNING,
_("only V3 signatures can be verified, skipping V%u signature\n"),
dig->signature.version);
rc = RPMRC_OK;
rc = RPMRC_OK; /* XXX return header w/o verify */
goto exit;
}
/*@fallthrough@*/
@ -929,42 +951,46 @@ rpmRC rpmReadPackageFile(rpmts ts, FD_t fd, const char * fn, Header * hdrp)
if (!headerGetEntry(h, RPMTAG_HEADERIMMUTABLE, &uht, &uh, &uhc))
break;
(void) rpmswEnter(rpmtsOp(ts, RPMTS_OP_DIGEST), 0);
dig->hdrsha1ctx = rpmDigestInit(PGPHASHALGO_SHA1, RPMDIGEST_NONE);
(void) rpmDigestUpdate(dig->hdrsha1ctx, header_magic, sizeof(header_magic));
dig->nbytes += sizeof(header_magic);
(void) rpmDigestUpdate(dig->hdrsha1ctx, uh, uhc);
dig->nbytes += uhc;
(void) rpmswExit(rpmtsOp(ts, RPMTS_OP_DIGEST), dig->nbytes);
if (sigtag == RPMSIGTAG_SHA1)
rpmtsOp(ts, RPMTS_OP_DIGEST)->count--; /* XXX one too many */
uh = headerFreeData(uh, uht);
} break;
case RPMSIGTAG_GPG:
case RPMSIGTAG_PGP5: /* XXX legacy */
case RPMSIGTAG_PGP:
/* Parse the parameters from the OpenPGP packets that will be needed. */
xx = pgpPrtPkts(sig, siglen, dig,
(_print_pkts & rpmIsDebug()));
xx = pgpPrtPkts(sig, siglen, dig, (_print_pkts & rpmIsDebug()));
/* XXX only V3 signatures for now. */
if (dig->signature.version != 3) {
rpmMessage(RPMMESS_WARNING,
_("only V3 signatures can be verified, skipping V%u signature\n"),
dig->signature.version);
rc = RPMRC_OK;
rc = RPMRC_OK; /* XXX return header w/o verify */
goto exit;
}
/*@fallthrough@*/
case RPMSIGTAG_MD5:
/* Legacy signatures need the compressed payload in the digest too. */
hmagic = ((l->major >= 3) ? HEADER_MAGIC_YES : HEADER_MAGIC_NO);
dig->nbytes += headerSizeof(h, hmagic);
(void) rpmswEnter(rpmtsOp(ts, RPMTS_OP_DIGEST), 0);
while ((count = Fread(buf, sizeof(buf[0]), sizeof(buf), fd)) > 0)
dig->nbytes += count;
(void) rpmswExit(rpmtsOp(ts, RPMTS_OP_DIGEST), dig->nbytes);
rpmtsOp(ts, RPMTS_OP_DIGEST)->count--; /* XXX one too many */
dig->nbytes += nb; /* XXX include size of header blob. */
if (count < 0) {
rpmError(RPMERR_FREAD, _("%s: Fread failed: %s\n"),
fn, Fstrerror(fd));
rc = RPMRC_FAIL;
goto exit;
}
dig->nbytes += count;
/* XXX Steal the digest-in-progress from the file handle. */
for (i = fd->ndigests - 1; i >= 0; i--) {

View File

@ -1025,6 +1025,7 @@ verifyMD5Signature(const rpmts ts, /*@out@*/ char * t,
(void) rpmDigestFinal(rpmDigestDup(md5ctx),
(void **)&md5sum, &md5len, 0);
(void) rpmswExit(rpmtsOp(ts, RPMTS_OP_DIGEST), 0);
rpmtsOp(ts, RPMTS_OP_DIGEST)->count--; /* XXX one too many */
if (md5len != siglen || memcmp(md5sum, sig, md5len)) {
res = RPMRC_FAIL;
@ -1187,6 +1188,7 @@ verifyPGPSignature(rpmts ts, /*@out@*/ char * t,
xx = rpmDigestFinal(ctx, (void **)&dig->md5, &dig->md5len, 1);
(void) rpmswExit(rpmtsOp(ts, RPMTS_OP_DIGEST), sigp->hashlen);
rpmtsOp(ts, RPMTS_OP_DIGEST)->count--; /* XXX one too many */
/* Compare leading 16 bits of digest for quick check. */
s = dig->md5;
@ -1312,6 +1314,7 @@ verifyGPGSignature(rpmts ts, /*@out@*/ char * t,
#endif
xx = rpmDigestFinal(ctx, (void **)&dig->sha1, &dig->sha1len, 1);
(void) rpmswExit(rpmtsOp(ts, RPMTS_OP_DIGEST), sigp->hashlen);
rpmtsOp(ts, RPMTS_OP_DIGEST)->count--; /* XXX one too many */
mpnzero(&dig->hm); (void) mpnsethex(&dig->hm, dig->sha1);

View File

@ -65,6 +65,7 @@ main(int argc, char *const argv[])
{
poptContext optCon;
rpmts ts = NULL;
rpmVSFlags vsflags;
rpmgi gi = NULL;
const char ** av;
const char * arg;
@ -79,6 +80,19 @@ main(int argc, char *const argv[])
ftsOpts = (FTS_COMFOLLOW | FTS_LOGICAL | FTS_NOSTAT);
ts = rpmtsCreate();
vsflags = rpmExpandNumeric("%{?_vsflags_query}");
if (rpmcliQueryFlags & VERIFY_DIGEST)
vsflags |= _RPMVSF_NODIGESTS;
if (rpmcliQueryFlags & VERIFY_SIGNATURE)
vsflags |= _RPMVSF_NOSIGNATURES;
if (rpmcliQueryFlags & VERIFY_HDRCHK)
vsflags |= RPMVSF_NOHDRCHK;
(void) rpmtsSetVSFlags(ts, vsflags);
{ int_32 tid = (int_32) time(NULL);
(void) rpmtsSetTid(ts, tid);
}
av = poptGetArgs(optCon);
gi = rpmgiNew(ts, gitag, av, ftsOpts);
(void) rpmgiSetQueryFormat(gi, queryFormat);

View File

@ -1,7 +1,7 @@
#/*! \page config_macros Default configuration: @RPMCONFIGDIR@/macros
# \verbatim
#
# $Id: macros.in,v 1.152 2004/10/09 20:22:01 jbj Exp $
# $Id: macros.in,v 1.153 2004/10/15 00:14:29 jbj Exp $
#
# This is a global RPM configuration file. All changes made here will
# be lost when the rpm package is upgraded. Any per-system configuration
@ -727,7 +727,7 @@ print (t)\
# Note: the %_vsflags_erase applies to --upgrade/--freshen modes as
# well as --erase.
#
%__vsflags 0
%__vsflags 0xf0000
%_vsflags_build %{__vsflags}
%_vsflags_erase %{__vsflags}
%_vsflags_install %{__vsflags}

View File

@ -24,7 +24,7 @@ example_LDFLAGS = -L. -lz
minigzip_SOURCES = minigzip.c
minigzip_LDFLAGS = -L. -lz
BUILT_SOURCES = Doxyfile zlib.lcd
BUILT_SOURCES = # Doxyfile zlib.lcd
zlib.lcd: Makefile.am ${libz_la_SOURCES} ${noinst_HEADERS}
-lclint ${DEFS} ${INCLUDES} ${libz_la_SOURCES} -dump $@ 2>/dev/null