malmond / rpms / rpm

Forked from rpms/rpm 4 years ago
Clone

Blame SOURCES/0009-Eliminate-redundant-signature-length-calculation-fun.patch

657fb1
From e6d91a00f0782f7551552d851f38c9ef188f7308 Mon Sep 17 00:00:00 2001
657fb1
From: Panu Matilainen <pmatilai@redhat.com>
657fb1
Date: Tue, 10 Oct 2017 15:04:38 +0300
657fb1
Subject: [PATCH 09/33] Eliminate redundant signature length calculation
657fb1
 function
657fb1
657fb1
The actual signing function knows the length already, we just need to
657fb1
return it and then we can insert it if there was anything at all
657fb1
to sign.
657fb1
---
657fb1
 sign/rpmsignfiles.c | 40 ++++++++++++++--------------------------
657fb1
 1 file changed, 14 insertions(+), 26 deletions(-)
657fb1
657fb1
diff --git a/sign/rpmsignfiles.c b/sign/rpmsignfiles.c
657fb1
index de7a73cfd..9fe6e6d41 100644
657fb1
--- a/sign/rpmsignfiles.c
657fb1
+++ b/sign/rpmsignfiles.c
657fb1
@@ -33,7 +33,7 @@ static const char *hash_algo_name[] = {
657fb1
 #define ARRAY_SIZE(a)  (sizeof(a) / sizeof(a[0]))
657fb1
 
657fb1
 static char *signFile(const char *algo, const uint8_t *fdigest, int diglen,
657fb1
-const char *key, char *keypass)
657fb1
+const char *key, char *keypass, uint32_t *siglenp)
657fb1
 {
657fb1
     char *fsignature;
657fb1
     unsigned char digest[diglen];
657fb1
@@ -56,32 +56,18 @@ const char *key, char *keypass)
657fb1
 	return NULL;
657fb1
     }
657fb1
 
657fb1
+    *siglenp = siglen + 1;
657fb1
     /* convert file signature binary to hex */
657fb1
     fsignature = pgpHexStr(signature, siglen+1);
657fb1
     return fsignature;
657fb1
 }
657fb1
 
657fb1
-static uint32_t signatureLength(const char *algo, int diglen, const char *key,
657fb1
-char *keypass)
657fb1
-{
657fb1
-    unsigned char digest[diglen];
657fb1
-    unsigned char signature[MAX_SIGNATURE_LENGTH];
657fb1
-
657fb1
-    memset(digest, 0, diglen);
657fb1
-    memset(signature, 0, MAX_SIGNATURE_LENGTH);
657fb1
-    signature[0] = '\x03';
657fb1
-
657fb1
-    uint32_t siglen = sign_hash(algo, digest, diglen, key, keypass,
657fb1
-				signature+1);
657fb1
-    return siglen + 1;
657fb1
-}
657fb1
-
657fb1
 rpmRC rpmSignFiles(Header sigh, Header h, const char *key, char *keypass)
657fb1
 {
657fb1
     struct rpmtd_s td;
657fb1
     int algo;
657fb1
     int diglen;
657fb1
-    uint32_t siglen;
657fb1
+    uint32_t siglen = 0;
657fb1
     const char *algoname;
657fb1
     const uint8_t *digest;
657fb1
     char *signature = NULL;
657fb1
@@ -108,14 +94,6 @@ rpmRC rpmSignFiles(Header sigh, Header h, const char *key, char *keypass)
657fb1
 
657fb1
     headerDel(sigh, RPMTAG_FILESIGNATURELENGTH);
657fb1
     headerDel(sigh, RPMTAG_FILESIGNATURES);
657fb1
-    siglen = signatureLength(algoname, diglen, key, keypass);
657fb1
-
657fb1
-    rpmtdReset(&td);
657fb1
-    td.tag = RPMSIGTAG_FILESIGNATURELENGTH;
657fb1
-    td.type = RPM_INT32_TYPE;
657fb1
-    td.data = &siglen;
657fb1
-    td.count = 1;
657fb1
-    headerPut(sigh, &td, HEADERPUT_DEFAULT);
657fb1
 
657fb1
     rpmtdReset(&td);
657fb1
     td.tag = RPMSIGTAG_FILESIGNATURES;
657fb1
@@ -125,7 +103,7 @@ rpmRC rpmSignFiles(Header sigh, Header h, const char *key, char *keypass)
657fb1
 
657fb1
     while (rpmfiNext(fi) >= 0) {
657fb1
 	digest = rpmfiFDigest(fi, NULL, NULL);
657fb1
-	signature = signFile(algoname, digest, diglen, key, keypass);
657fb1
+	signature = signFile(algoname, digest, diglen, key, keypass, &siglen);
657fb1
 	if (!signature) {
657fb1
 	    rpmlog(RPMLOG_ERR, _("signFile failed\n"));
657fb1
 	    goto exit;
657fb1
@@ -137,6 +115,16 @@ rpmRC rpmSignFiles(Header sigh, Header h, const char *key, char *keypass)
657fb1
 	}
657fb1
 	signature = _free(signature);
657fb1
     }
657fb1
+
657fb1
+    if (siglen > 0) {
657fb1
+	rpmtdReset(&td);
657fb1
+	td.tag = RPMSIGTAG_FILESIGNATURELENGTH;
657fb1
+	td.type = RPM_INT32_TYPE;
657fb1
+	td.data = &siglen;
657fb1
+	td.count = 1;
657fb1
+	headerPut(sigh, &td, HEADERPUT_DEFAULT);
657fb1
+    }
657fb1
+
657fb1
     rc = RPMRC_OK;
657fb1
 
657fb1
 exit:
657fb1
-- 
657fb1
2.13.5
657fb1