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