RPM Community Forums

Mailing List Message of <rpm-cvs>

[CVS] RPM: rpm/lib/ tpgp.c

From: Jeff Johnson <jbj@rpm5.org>
Date: Fri 28 Dec 2007 - 23:43:48 CET
Message-Id: <20071228224348.8914834845C@rpm5.org>
  RPM Package Manager, CVS Repository
  http://rpm5.org/cvs/
  ____________________________________________________________________________

  Server: rpm5.org                         Name:   Jeff Johnson
  Root:   /v/rpm/cvs                       Email:  jbj@rpm5.org
  Module: rpm                              Date:   28-Dec-2007 23:43:48
  Branch: HEAD                             Handle: 2007122822434800

  Modified files:
    rpm/lib                 tpgp.c

  Log:
    - jbj: slurp the plaintext instead of hotwiring. Simplify the mess.

  Summary:
    Revision    Changes     Path
    2.6         +47 -22     rpm/lib/tpgp.c
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/lib/tpgp.c
  ============================================================================
  $ cvs diff -u -r2.5 -r2.6 tpgp.c
  --- rpm/lib/tpgp.c	28 Dec 2007 22:02:51 -0000	2.5
  +++ rpm/lib/tpgp.c	28 Dec 2007 22:43:48 -0000	2.6
  @@ -29,14 +29,10 @@
   int rpmCheckPgpSignatureOnFile(const char * fn, const char * sigfn,
   		const char * pubfn, const char * pubfingerprint)
   {
  -    static const char * plaintext = "This is the plaintext\n";
  -    pgpDig dig;
  +    pgpDig dig = pgpDigNew(0);
       pgpDigParams sigp;
  -    const char * _fn = NULL;
  -    const char * _sigfn = NULL;
       const unsigned char * sigpkt = NULL;
       size_t sigpktlen = 0;
  -    const char * _pubfn = NULL;
       const unsigned char * pubpkt = NULL;
       size_t pubpktlen = 0;
       DIGEST_CTX ctx = NULL;
  @@ -47,25 +43,41 @@
   if (_debug)
   fprintf(stderr, "==> check(%s, %s, %s, %s)\n", fn, sigfn, pubfn, pubfingerprint);
   
  -    dig = pgpDigNew(0);
  -
  -    _fn = rpmExpand(fn, NULL);
  -
  -    _sigfn = rpmExpand(sigfn, NULL);
  -    xx = pgpReadPkts(_sigfn, &sigpkt, &sigpktlen);
  -    if (xx != PGPARMOR_SIGNATURE) {
  +    /* Load the signature. Use sigfn if specified, otherwise clearsign. */
  +    if (sigfn != NULL) {
  +	const char * _sigfn = rpmExpand(sigfn, NULL);
  +	xx = pgpReadPkts(_sigfn, &sigpkt, &sigpktlen);
  +	if (xx != PGPARMOR_SIGNATURE) {
   fprintf(stderr, "==> pgpReadPkts(%s) SIG %p[%u] ret %d\n", _sigfn, sigpkt, sigpktlen, xx);
  -	goto exit;
  +	    _sigfn = _free(_sigfn);
  +	    goto exit;
  +	}
  +	_sigfn = _free(_sigfn);
  +    } else {
       }
       xx = pgpPrtPkts((uint8_t *)sigpkt, sigpktlen, dig, printing);
  +    if (xx) {
  +fprintf(stderr, "==> pgpPrtPkts SIG %p[%u] ret %d\n", sigpkt, sigpktlen, xx);
  +	goto exit;
  +    }
   
  -    _pubfn = rpmExpand(pubfn, NULL);
  -    xx = pgpReadPkts(_pubfn, &pubpkt, &pubpktlen);
  -    if (xx != PGPARMOR_PUBKEY) {
  +    /* Load the pubkey. Use pubfn if specified, otherwise rpmdb keyring. */
  +    if (pubfn != NULL) {
  +	const char * _pubfn = rpmExpand(pubfn, NULL);
  +	xx = pgpReadPkts(_pubfn, &pubpkt, &pubpktlen);
  +	if (xx != PGPARMOR_PUBKEY) {
   fprintf(stderr, "==> pgpReadPkts(%s) PUB %p[%u] ret %d\n", _pubfn, pubpkt, pubpktlen, xx);
  -	goto exit;
  +	    _pubfn = _free(_pubfn);
  +	    goto exit;
  +	}
  +	_pubfn = _free(_pubfn);
  +    } else {
       }
       xx = pgpPrtPkts((uint8_t *)pubpkt, pubpktlen, dig, printing);
  +    if (xx) {
  +fprintf(stderr, "==> pgpPrtPkts PUB %p[%u] ret %d\n", pubpkt, pubpktlen, xx);
  +	goto exit;
  +    }
   
       sigp = pgpGetSignature(dig);
   
  @@ -74,9 +86,24 @@
   	goto exit;
       }
   
  +    /* Compute the message digest. */
       ctx = rpmDigestInit(sigp->hash_algo, RPMDIGEST_NONE);
   
  -    xx = rpmDigestUpdate(ctx, plaintext, strlen(plaintext));
  +    {	const char * _fn = rpmExpand(fn, NULL);
  +	const char * b = NULL;
  +	size_t blen = 0;
  +	int _rc = rpmioSlurp(_fn, &b, &blen);
  +
  +	if (!(_rc == 0 && b != NULL && blen > 0)) {
  +fprintf(stderr, "==> rpmioSlurp(%s) MSG %p[%u] ret %d\n", _fn, b, blen, _rc);
  +	    b = _free(b);
  +	    _fn = _free(_fn);
  +	    goto exit;
  +	}
  +	_fn = _free(_fn);
  +	xx = rpmDigestUpdate(ctx, b, blen);
  +	b = _free(b);
  +    }
   
       if (sigp->hash != NULL)
   	xx = rpmDigestUpdate(ctx, sigp->hash, sigp->hashlen);
  @@ -90,6 +117,7 @@
   	xx = rpmDigestUpdate(ctx, trailer, sizeof(trailer));
       }
   
  +    /* Load the message digest. */
       switch(sigp->pubkey_algo) {
       default:
   	xx = 1;
  @@ -106,6 +134,7 @@
   	goto exit;
       }
   
  +    /* Verify the signature. */
       switch(sigp->pubkey_algo) {
       default:
   	rc = 0;
  @@ -120,11 +149,7 @@
   
   exit:
       pubpkt = _free(pubpkt);
  -    _pubfn = _free(_pubfn);
       sigpkt = _free(sigpkt);
  -    _sigfn = _free(_sigfn);
  -    _fn = _free(_fn);
  -
       dig = pgpDigFree(dig);
   
   if (_debug)
  @@ .
Received on Fri Dec 28 23:43:48 2007
Driven by Jeff Johnson and the RPM project team.
Hosted by OpenPKG and Ralf S. Engelschall.
Powered by FreeBSD and OpenPKG.