Split signature and digest generation to separate functions
authorPanu Matilainen <pmatilai@redhat.com>
Wed, 29 Sep 2010 07:48:59 +0000 (10:48 +0300)
committerPanu Matilainen <pmatilai@redhat.com>
Wed, 29 Sep 2010 07:55:38 +0000 (10:55 +0300)
- Similar in spirit to commit 825691afb2a8e2c0b3c6a031950f3c7855dc4c6e,
  these have fairly little in common really.
- Change the function names to force breakage on users (these are exported
  in ABI but not in public headers so "users" are internal uses in
  practise): the automatically generated bits in signature header are
  not signatures, but digests (even size is a checksum of sorts) ...
  and fix the couple of internal uses.

build/pack.c
lib/rpmgensig.c
lib/signature.c
lib/signature.h

index 0b57613..ea49ec6 100644 (file)
@@ -450,8 +450,8 @@ static rpmRC writeRPM(Header *hdrp, unsigned char ** pkgidp, const char *fileNam
        sizetag = RPMSIGTAG_LONGSIZE;
        payloadtag = RPMSIGTAG_LONGARCHIVESIZE;
     }
-    (void) rpmAddSignature(sig, sigtarget, sizetag, NULL);
-    (void) rpmAddSignature(sig, sigtarget, RPMSIGTAG_MD5, NULL);
+    (void) rpmGenDigest(sig, sigtarget, sizetag);
+    (void) rpmGenDigest(sig, sigtarget, RPMSIGTAG_MD5);
 
     if (SHA1) {
        /* XXX can't use rpmtdFromFoo() on RPMSIGTAG_* items */
index 4426164..75cd24f 100644 (file)
@@ -173,13 +173,13 @@ static int replaceSignature(Header sigh, const char *sigtarget,
     deleteSigs(sigh);
 
     /*
-     * rpmAddSignature() internals parse the actual signing result and 
+     * rpmGenSignature() internals parse the actual signing result and 
      * use appropriate DSA/RSA tags regardless of what we pass from here.
      * RPMSIGTAG_GPG is only used to signal its an actual signature
      * and not just a digest we're adding, and says nothing
      * about the actual tags that gets created. 
      */
-    if (rpmAddSignature(sigh, sigtarget, RPMSIGTAG_GPG, passPhrase) == 0) {
+    if (rpmGenSignature(sigh, sigtarget, RPMSIGTAG_GPG, passPhrase) == 0) {
        /* Lets see what we got and whether its the same signature as before */
        rpmSigTag sigtag = headerIsEntry(sigh, RPMSIGTAG_DSA) ?
                                        RPMSIGTAG_DSA : RPMSIGTAG_RSA;
@@ -295,7 +295,7 @@ static int rpmSign(const char *rpm, int deleting, const char *passPhrase)
            int nsigs = sizeof(sigs) / sizeof(rpmSigTag);
            for (int i = 0; i < nsigs; i++) {
                (void) headerDel(sigh, sigs[i]);
-               if (rpmAddSignature(sigh, sigtarget, sigs[i], passPhrase))
+               if (rpmGenDigest(sigh, sigtarget, sigs[i]))
                    goto exit;
            }
        }
index 7aa8f8c..e5142f0 100644 (file)
@@ -500,6 +500,37 @@ exit:
     return ret;
 }
 
+int rpmGenSignature(Header sigh, const char * file, rpmSigTag sigTag,
+               const char * passPhrase)
+{
+    uint8_t * pkt = NULL;
+    size_t pktlen;
+    int ret = -1;      /* assume failure. */
+
+    switch (sigTag) {
+    case RPMSIGTAG_PGP5:       /* XXX legacy */
+    case RPMSIGTAG_PGP:
+    case RPMSIGTAG_GPG: {
+       rpmSigTag hdrtag;
+       if (makeGPGSignature(file, &sigTag, &pkt, &pktlen, passPhrase)
+        || !sighdrPut(sigh, sigTag, RPM_BIN_TYPE, pkt, pktlen))
+           break;
+       /* XXX Piggyback a header-only DSA/RSA signature as well. */
+       hdrtag = (sigTag == RPMSIGTAG_GPG) ?  RPMSIGTAG_DSA : RPMSIGTAG_RSA;
+       ret = makeHDRSignature(sigh, file, hdrtag, passPhrase);
+       } break;
+    case RPMSIGTAG_RSA:
+    case RPMSIGTAG_DSA:
+       ret = makeHDRSignature(sigh, file, sigTag, passPhrase);
+       break;
+    default:
+       break;
+    }
+    free(pkt);
+
+    return ret;
+}
+
 static int makeHDRDigest(Header sigh, const char * file, rpmSigTag sigTag)
 {
     Header h = NULL;
@@ -556,8 +587,7 @@ exit:
     return ret;
 }
 
-int rpmAddSignature(Header sigh, const char * file, rpmSigTag sigTag,
-               const char * passPhrase)
+int rpmGenDigest(Header sigh, const char * file, rpmSigTag sigTag)
 {
     struct stat st;
     uint8_t * pkt = NULL;
@@ -591,21 +621,6 @@ int rpmAddSignature(Header sigh, const char * file, rpmSigTag sigTag,
            break;
        ret = 0;
        break;
-    case RPMSIGTAG_PGP5:       /* XXX legacy */
-    case RPMSIGTAG_PGP:
-    case RPMSIGTAG_GPG: {
-       rpmSigTag hdrtag;
-       if (makeGPGSignature(file, &sigTag, &pkt, &pktlen, passPhrase)
-        || !sighdrPut(sigh, sigTag, RPM_BIN_TYPE, pkt, pktlen))
-           break;
-       /* XXX Piggyback a header-only DSA/RSA signature as well. */
-       hdrtag = (sigTag == RPMSIGTAG_GPG) ?  RPMSIGTAG_DSA : RPMSIGTAG_RSA;
-       ret = makeHDRSignature(sigh, file, hdrtag, passPhrase);
-       } break;
-    case RPMSIGTAG_RSA:
-    case RPMSIGTAG_DSA:
-       ret = makeHDRSignature(sigh, file, sigTag, passPhrase);
-       break;
     case RPMSIGTAG_SHA1:
        ret = makeHDRDigest(sigh, file, sigTag);
        break;
index 3f00245..ebd0392 100644 (file)
@@ -45,6 +45,15 @@ rpmRC rpmReadSignature(FD_t fd, Header *sighp, sigType sig_type, char ** msg);
 int rpmWriteSignature(FD_t fd, Header h);
 
 /** \ingroup signature
+ * Generate digest(s) from a header+payload file, save in signature header.
+ * @param sigh         signature header
+ * @param file         header+payload file name
+ * @param sigTag       type of digest(s) to add
+ * @return             0 on success, -1 on failure
+ */
+int rpmGenDigest(Header sigh, const char * file, rpmSigTag sigTag);
+
+/** \ingroup signature
  * Generate signature(s) from a header+payload file, save in signature header.
  * @param sigh         signature header
  * @param file         header+payload file name
@@ -52,7 +61,7 @@ int rpmWriteSignature(FD_t fd, Header h);
  * @param passPhrase   private key pass phrase
  * @return             0 on success, -1 on failure
  */
-int rpmAddSignature(Header sigh, const char * file,
+int rpmGenSignature(Header sigh, const char * file,
                    rpmSigTag sigTag, const char * passPhrase);
 
 /** \ingroup signature