From 825691afb2a8e2c0b3c6a031950f3c7855dc4c6e Mon Sep 17 00:00:00 2001 From: Panu Matilainen Date: Wed, 29 Sep 2010 10:29:18 +0300 Subject: [PATCH] Split internal header signature and digest generation to separate functions - These have fairly little in common in reality: one is always automatically created on package generation, the other is optional extra step requiring passphrases and all sorts of other things. - The switch-cases are now fairly hysterical but leaving them for later spring-clean to keep changes minimal for this step. - No functional changes (supposedly ;) --- lib/signature.c | 72 ++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 46 insertions(+), 26 deletions(-) diff --git a/lib/signature.c b/lib/signature.c index c82d229..7aa8f8c 100644 --- a/lib/signature.c +++ b/lib/signature.c @@ -461,6 +461,49 @@ static int makeHDRSignature(Header sigh, const char * file, rpmSigTag sigTag, uint8_t * pkt = NULL; size_t pktlen; char * fn = NULL; + int ret = -1; /* assume failure. */ + + switch (sigTag) { + case RPMSIGTAG_DSA: + case RPMSIGTAG_RSA: + fd = Fopen(file, "r.fdio"); + if (fd == NULL || Ferror(fd)) + goto exit; + h = headerRead(fd, HEADER_MAGIC_YES); + if (h == NULL) + goto exit; + (void) Fclose(fd); + fd = rpmMkTempFile(NULL, &fn); + if (fd == NULL || Ferror(fd)) + goto exit; + if (headerWrite(fd, h, HEADER_MAGIC_YES)) + goto exit; + (void) Fclose(fd); fd = NULL; + if (makeGPGSignature(fn, &sigTag, &pkt, &pktlen, passPhrase) + || !sighdrPut(sigh, sigTag, RPM_BIN_TYPE, pkt, pktlen)) + goto exit; + ret = 0; + break; + default: + goto exit; + break; + } + +exit: + if (fn) { + (void) unlink(fn); + free(fn); + } + free(pkt); + h = headerFree(h); + if (fd != NULL) (void) Fclose(fd); + return ret; +} + +static int makeHDRDigest(Header sigh, const char * file, rpmSigTag sigTag) +{ + Header h = NULL; + FD_t fd = NULL; char * SHA1 = NULL; int ret = -1; /* assume failure. */ @@ -501,37 +544,12 @@ static int makeHDRSignature(Header sigh, const char * file, rpmSigTag sigTag, goto exit; ret = 0; break; - case RPMSIGTAG_DSA: - case RPMSIGTAG_RSA: - fd = Fopen(file, "r.fdio"); - if (fd == NULL || Ferror(fd)) - goto exit; - h = headerRead(fd, HEADER_MAGIC_YES); - if (h == NULL) - goto exit; - (void) Fclose(fd); - fd = rpmMkTempFile(NULL, &fn); - if (fd == NULL || Ferror(fd)) - goto exit; - if (headerWrite(fd, h, HEADER_MAGIC_YES)) - goto exit; - (void) Fclose(fd); fd = NULL; - if (makeGPGSignature(fn, &sigTag, &pkt, &pktlen, passPhrase) - || !sighdrPut(sigh, sigTag, RPM_BIN_TYPE, pkt, pktlen)) - goto exit; - ret = 0; - break; default: goto exit; break; } exit: - if (fn) { - (void) unlink(fn); - free(fn); - } - free(pkt); free(SHA1); h = headerFree(h); if (fd != NULL) (void) Fclose(fd); @@ -586,9 +604,11 @@ int rpmAddSignature(Header sigh, const char * file, rpmSigTag sigTag, } break; case RPMSIGTAG_RSA: case RPMSIGTAG_DSA: - case RPMSIGTAG_SHA1: ret = makeHDRSignature(sigh, file, sigTag, passPhrase); break; + case RPMSIGTAG_SHA1: + ret = makeHDRDigest(sigh, file, sigTag); + break; default: break; } -- 2.7.4