rpms/deltarpm/devel deltarpm-3.4-sha256.patch, NONE, 1.1 deltarpm.spec, 1.15, 1.16

Jonathan Dieter jdieter at fedoraproject.org
Tue Mar 24 07:35:04 UTC 2009


Author: jdieter

Update of /cvs/extras/rpms/deltarpm/devel
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv6370

Modified Files:
	deltarpm.spec 
Added Files:
	deltarpm-3.4-sha256.patch 
Log Message:
Add support for rpms with sha256 file digests


deltarpm-3.4-sha256.patch:

--- NEW FILE deltarpm-3.4-sha256.patch ---
diff -urb --new-file deltarpm-3.4/applydeltarpm.c deltarpm-3.4.new/applydeltarpm.c
--- deltarpm-3.4/applydeltarpm.c	2009-03-15 19:55:02.367149343 +0200
+++ deltarpm-3.4.new/applydeltarpm.c	2009-03-18 14:22:22.899493311 +0200
@@ -24,6 +24,8 @@
 
 #include "util.h"
 #include "md5.h"
+#include "sha256.h"
+#include "digest.h"
 #include "rpmhead.h"
 #include "cpio.h"
 #include "cfile.h"
@@ -969,30 +971,49 @@
 }
 
 int
-checkprelinked(char *name, unsigned char *hmd5, unsigned int size)
+checkprelinked(char *name, unsigned int digestalgo, unsigned char *hdigest, unsigned int size)
 {
   int fd, l;
   unsigned char buf[4096];
-  MD5_CTX ctx;
-  unsigned char md5[16];
+  void *ctx;
+  unsigned char digest[32];
+  unsigned int digestsize;
+
+  if (digestalgo == 1)
+    {
+      ctx = xmalloc(sizeof(MD5_CTX));
+      digestsize = 16;
+    }
+  else if (digestalgo == 8)
+    {
+      ctx = xmalloc(sizeof(SHA256_ctx));
+      digestsize = 32;
+    }
+  else
+    {
+      fprintf(stderr, "Unknown digest type: %i\n", digestalgo);
+      exit(1);
+    }
 
   nprelink++;
   if ((fd = prelinked_open(name)) < 0)
     {
       perror(name);
+      ctx = xfree(ctx);
       return -1;
     }
-  rpmMD5Init(&ctx);
+  digest_init(ctx, digestalgo);
   while (size && (l = read(fd, buf, sizeof(buf))) > 0)
     {
       if (l > size)
 	l = size;
-      rpmMD5Update(&ctx, buf, l);
+      digest_update(ctx, digestalgo, buf, l);
       size -= l;
     }
   close(fd);
-  rpmMD5Final(md5, &ctx);
-  if (memcmp(md5, hmd5, 16))
+  digest_final(ctx, digestalgo, digest);
+  ctx = xfree(ctx);
+  if (memcmp(digest, hdigest, digestsize))
     {
       fprintf(stderr, "%s: contents have been changed\n", name);
       return -1;
@@ -1001,42 +1022,62 @@
 }
 
 int
-checkfilemd5(char *name, unsigned char *hmd5, unsigned int size)
+checkfiledigest(char *name, unsigned int digestalgo, unsigned char *hdigest, unsigned int size)
 {
   int fd, l;
   unsigned char buf[4096];
-  MD5_CTX ctx;
-  unsigned char md5[16];
+  void *ctx;
+  unsigned char digest[32];
+  unsigned int digestsize;
   struct stat stb;
 
+  if (digestalgo == 1)
+    {
+      ctx = xmalloc(sizeof(MD5_CTX));
+      digestsize = 16;
+    }
+  else if (digestalgo == 8)
+    {
+      ctx = xmalloc(sizeof(SHA256_ctx));
+      digestsize = 32;
+    }
+  else
+    {
+      fprintf(stderr, "Unknown digest type: %i\n", digestalgo);
+      exit(1);
+    }
+
   if ((fd = open(name, O_RDONLY)) < 0 || fstat(fd, &stb))
     {
       perror(name);
+      ctx = xfree(ctx);
       return -1;
     }
-  rpmMD5Init(&ctx);
+  digest_init(ctx, digestalgo);
   if (stb.st_size > size && (l = read(fd, buf, sizeof(buf))) > 0)
     {
       if (is_prelinked(fd, buf, l))
 	{
 	  close(fd);
-	  return checkprelinked(name, hmd5, size);
+          ctx = xfree(ctx);
+          return checkprelinked(name, digestalgo, hdigest, size);
 	}
       if (l > size)
 	l = size;
-      rpmMD5Update(&ctx, buf, l);
+      digest_update(ctx, digestalgo, buf, l);
       size -= l;
     }
   while (size && (l = read(fd, buf, sizeof(buf))) > 0)
     {
       if (l > size)
 	l = size;
-      rpmMD5Update(&ctx, buf, l);
+      digest_update(ctx, digestalgo, buf, l);
       size -= l;
     }
   close(fd);
-  rpmMD5Final(md5, &ctx);
-  if (memcmp(md5, hmd5, 16))
+  digest_final(ctx, digestalgo, digest);
+  ctx = xfree(ctx);
+  if (memcmp(digest, hdigest, digestsize))
     {
       fprintf(stderr, "%s: contents have been changed\n", name);
       return -1;
@@ -1045,7 +1086,7 @@
 }
 
 int
-checkfilesize(char *name, unsigned char *hmd5, unsigned int size)
+checkfilesize(char *name, unsigned int digestalgo, unsigned char *hdigest, unsigned int size)
 {
   struct stat stb;
   unsigned char buf[128];
@@ -1065,7 +1106,7 @@
       if (fd != -1 && (l = read(fd, buf, sizeof(buf))) > 0 && is_prelinked(fd, buf, l))
 	{
 	  close(fd);
-	  return checkprelinked(name, hmd5, size);
+          return checkprelinked(name, digestalgo, hdigest, size);
 	}
       if (fd != -1)
         close(fd);
@@ -1378,8 +1419,8 @@
 	}
       if (!d.h)
 	{
-	  unsigned char *hmd5 = headbin(h, 1004, 16);
-	  if (!hmd5 || memcmp(hmd5, d.seq, 16) != 0)
+          unsigned char *hdigest = headbin(h, 1004, 16);
+          if (!hdigest || memcmp(hdigest, d.seq, 16) != 0)
 	    seqmatches = 0;
 	  if (seqcheck)
 	    {
@@ -1413,7 +1454,7 @@
     }
   if (d.h || seqcheck)
     {
-      int (*checkfunc)(char *, unsigned char *, unsigned int);
+      int (*checkfunc)(char *, unsigned int, unsigned char *, unsigned int);
       if (headtofb(h, &fb))
 	{
 	  fprintf(stderr, "bad header\n");
@@ -1421,7 +1462,7 @@
 	}
       checkfunc = 0;
       if ((checkflags & SEQCHECK_MD5) != 0)
-	checkfunc = checkfilemd5;
+        checkfunc = checkfiledigest;
       else if ((checkflags & SEQCHECK_SIZE) != 0)
 	checkfunc = checkfilesize;
       sdesc = expandseq(d.seq, d.seql, &nsdesc, &fb, checkfunc);
diff -urb --new-file deltarpm-3.4/deltarpm.h deltarpm-3.4.new/deltarpm.h
--- deltarpm-3.4/deltarpm.h	2005-06-13 20:47:38.000000000 +0300
+++ deltarpm-3.4.new/deltarpm.h	2009-03-15 20:24:56.756147799 +0200
@@ -21,8 +21,9 @@
   unsigned int *filemodes;
   unsigned int *filesizes;
   unsigned int *filerdevs;
+  unsigned int *filedigestalgo;
   char **filelinktos;
-  char **filemd5s;
+  char **filedigests;
 };
 
 
@@ -86,7 +87,7 @@
 
 /* from readdeltarpm.c */
 int headtofb(struct rpmhead *h, struct fileblock *fb);
-struct seqdescr *expandseq(unsigned char *seq, int seql, int *nump, struct fileblock *fb, int (*checkfunc)(char *, unsigned char *, unsigned int));
+struct seqdescr *expandseq(unsigned char *seq, int seql, int *nump, struct fileblock *fb, int (*checkfunc)(char *, unsigned int, unsigned char *, unsigned int));
 void readdeltarpm(char *n, struct deltarpm *d, struct cfile **cfp);
 
 /* from writedeltarpm.c */
diff -urb --new-file deltarpm-3.4/digest.c deltarpm-3.4.new/digest.c
--- deltarpm-3.4/digest.c	1970-01-01 02:00:00.000000000 +0200
+++ deltarpm-3.4.new/digest.c	2009-03-18 14:21:43.392509611 +0200
@@ -0,0 +1,74 @@
+/* digest.c
+ *
+ * Copyright (c) 2009 Jonathan Dieter <jdieter at gmail.com>
+ *
+ * This program is licensed under the BSD license, read LICENSE.BSD
+ * for further information
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "md5.h"
+#include "sha256.h"
+
+void
+digest_init(void *cntx, unsigned int digestalgo)
+{
+  if (digestalgo == 1)
+    rpmMD5Init((MD5_CTX*)cntx);
+  else if (digestalgo == 8)
+    SHA256_init((SHA256_ctx*)cntx);
+  else
+    {
+      fprintf(stderr, "Unknown digest type: %i\n", digestalgo);
+      exit(1);
+    }
+}
+
+void
+digest_update(void *cntx, unsigned int digestalgo, unsigned char const *buf, unsigned len)
+{
+  if (digestalgo == 1)
+    rpmMD5Update((MD5_CTX*)cntx, buf, len);
+  else if (digestalgo == 8)
+    SHA256_update((SHA256_ctx*)cntx, buf, len);
+  else
+    {
+      fprintf(stderr, "Unknown digest type: %i\n", digestalgo);
+      exit(1);
+    }
+}
+
+void
+digest_update32(void *cntx, unsigned int digestalgo, unsigned int i)
+{
+  if (digestalgo == 1)
+    rpmMD5Update32((MD5_CTX*)cntx, i);
+  else if (digestalgo == 8)
+    SHA256_update32((SHA256_ctx*)cntx, i);
+  else
+    {
+      fprintf(stderr, "Uknown digest type: %i\n", digestalgo);
+      exit(1);
+    }
+}
+
+void
+digest_final(void *cntx, unsigned int digestalgo, unsigned char *digest)
+{
+  if (digestalgo == 1)
+    rpmMD5Final(digest, (MD5_CTX*)cntx);
+  else if (digestalgo == 8)
+    {
+      SHA256_final((SHA256_ctx*)cntx);
+      SHA256_digest((SHA256_ctx*)cntx, digest);
+    }
+  else
+    {
+      fprintf(stderr, "Uknown digest type: %i\n", digestalgo);
+      exit(1);
+    }
+}
+
+
diff -urb --new-file deltarpm-3.4/digest.h deltarpm-3.4.new/digest.h
--- deltarpm-3.4/digest.h	1970-01-01 02:00:00.000000000 +0200
+++ deltarpm-3.4.new/digest.h	2009-03-15 20:24:56.757150075 +0200
@@ -0,0 +1,13 @@
+/* digest.h
+ *
+ * Copyright (c) 2009 Jonathan Dieter <jdieter at gmail.com>
+ *
+ * This program is licensed under the BSD license, read LICENSE.BSD
+ * for further information
+ */
+
+void digest_init(void *cntx, unsigned int digestalgo);
+void digest_update(void *cntx, unsigned int digestalgo, unsigned char const *buf, unsigned len);
+void digest_update32(void *cntx, unsigned int digestalgo, unsigned int i);
+void digest_final(void *cntx, unsigned int digestalgo, unsigned char *digest);
+ 
diff -urb --new-file deltarpm-3.4/makedeltarpm.c deltarpm-3.4.new/makedeltarpm.c
--- deltarpm-3.4/makedeltarpm.c	2009-03-15 19:54:45.110416239 +0200
+++ deltarpm-3.4.new/makedeltarpm.c	2009-03-15 20:24:56.759163777 +0200
@@ -18,6 +18,8 @@
 
 #include "util.h"
 #include "md5.h"
+#include "sha256.h"
+#include "digest.h"
 #include "rpmhead.h"
 #include "rpml.h"
 #include "cpio.h"
@@ -31,8 +33,8 @@
   char *nevr, *n;
   int cnt, i;
   struct rpmlfile *files;
-  unsigned int *fileflags, *filemodes;
-  char **filelist, **filemd5s;
+  unsigned int *fileflags, *filemodes, *filedigestalgo;
+  char **filelist, **filedigests;
 
   nevr = headtonevr(h);
   if (!nevr)
@@ -45,7 +47,18 @@
       return nevr;
     }
   fileflags = headint32(h, TAG_FILEFLAGS, (int *)0);
-  filemd5s = headstringarray(h, TAG_FILEMD5S, (int *)0);
+  filedigestalgo = headint32(h, TAG_FILEDIGESTALGO, (int *)0);
+  if (filedigestalgo == 0)
+    {
+      filedigestalgo = xmalloc(sizeof(unsigned int));
+      *filedigestalgo = 1;
+    }
+  if(*filedigestalgo != 1 && *filedigestalgo != 8)
+    {
+      fprintf(stderr, "Unknown digest type: %i\n", *filedigestalgo);
+      exit(1);
+    }
+  filedigests = headstringarray(h, TAG_FILEDIGESTS, (int *)0);
   filemodes = headint16(h, TAG_FILEMODES, (int *)0);
   files = xmalloc2(cnt, sizeof(*files));
   for (i = 0; i < cnt; i++)
@@ -57,12 +70,16 @@
       strcpy(files[i].name, n);
       files[i].mode = filemodes[i];
       files[i].fflags = fileflags[i];
-      parsemd5(filemd5s[i], files[i].md5);
+      if(*filedigestalgo == 1)
+        parsemd5(filedigests[i], files[i].digest);
+      else if(*filedigestalgo == 8)
+        parsesha256(filedigests[i], files[i].digest);
     }
   *filesp = files;
   *nfilesp = cnt;
   free(fileflags);
-  free(filemd5s);
+  free(filedigestalgo);
+  free(filedigests);
   free(filemodes);
   free(filelist);
   return nevr;
@@ -195,10 +212,10 @@
 
 
 int
-is_unpatched(char *n, struct rpmlfile *files1, int nfiles1, struct rpmlfile *files2, int nfiles2, char *md5s)
+is_unpatched(char *n, struct rpmlfile *files1, int nfiles1, struct rpmlfile *files2, int nfiles2, char *digests)
 {
   int i;
-  unsigned char md5[16];
+  unsigned char digest[32];
 
   for (i = 0; i < nfiles2; i++)
     if (!strcmp(n, files2[i].name))
@@ -212,8 +229,11 @@
       break;
   if (i == nfiles1)
     return 1;		/* should not happen... */
-  parsemd5(md5s, md5);
-  if (memcmp(md5, files1[i].md5, 16))
+  if (files1[i].digesttype == 1)
+    parsemd5(digests, digest);
+  else if (files1[i].digesttype == 8)
+    parsesha256(digests, digest);
+  if (memcmp(digest, files1[i].digest, files1[i].digestsize))
     return 1;		/* file content may be different */
   return 0;
 }
@@ -436,8 +456,8 @@
   struct rpmhead *h, *sigh;
   char *nevr;
   int filecnt;
-  char **filenames, **filemd5s, **filelinktos;
-  unsigned int *fileflags, *filemodes, *filerdevs, *filesizes, *fileverify, *filecolors;
+  char **filenames, **filedigests, **filelinktos;
+  unsigned int *fileflags, *filemodes, *filerdevs, *filesizes, *fileverify, *filecolors, *filedigestalgo, digestsize;
   int i, fd, l, l2, l3;
   struct cfile *bfd;
   struct cpiophys cph;
@@ -657,6 +677,21 @@
       exit(1);
     }
   nevr = headtonevr(h);
+  filedigestalgo = headint32(h, TAG_FILEDIGESTALGO, (int *)0);
+  if (filedigestalgo == 0)
+    {
+      filedigestalgo = xmalloc(sizeof(unsigned int));
+      *filedigestalgo = 1;
+    }
+  if (*filedigestalgo == 1)
+    digestsize = 16;
+  else if (*filedigestalgo == 8)
+    digestsize = 32;
+  else
+    {
+      fprintf(stderr, "Unknown digest type: %i\n", *filedigestalgo);
+      exit(1);
+    }
 
   if (alone && rpmonly)
     {
@@ -745,7 +780,7 @@
     }
   filenames = headexpandfilelist(h, &filecnt);
   fileflags = headint32(h, TAG_FILEFLAGS, (int *)0);
-  filemd5s = headstringarray(h, TAG_FILEMD5S, (int *)0);
+  filedigests = headstringarray(h, TAG_FILEDIGESTS, (int *)0);
   filerdevs = headint16(h, TAG_FILERDEVS, (int *)0);
   filesizes = headint32(h, TAG_FILESIZES, (int *)0);
   filemodes = headint16(h, TAG_FILEMODES, (int *)0);
@@ -884,7 +919,7 @@
 	        fprintf(vfp, "skipping %s: pruned\n", np);
 	      skipped_pruned++;
 	    }
-	  else if (pinfo && S_ISREG(filemodes[i]) && is_unpatched(np, files1, nfiles1, files2, nfiles2, filemd5s[i]))
+          else if (pinfo && S_ISREG(filemodes[i]) && is_unpatched(np, files1, nfiles1, files2, nfiles2, filedigests[i]))
 	    {
 	      if (verbose > 1)
 	        fprintf(vfp, "skipping %s: unpatched but different\n", np);
@@ -1018,9 +1053,12 @@
 		}
 	      if (S_ISREG(filemodes[i]) && lsize)
 		{
-		  unsigned char fmd5[16];
-		  parsemd5(filemd5s[i], fmd5);
-		  rpmMD5Update(&seqmd5, fmd5, 16);
+                  unsigned char fdigest[32];
+                  if (*filedigestalgo == 1)
+                    parsemd5(filedigests[i], fdigest);
+                  else if (*filedigestalgo == 8)
+                    parsesha256(filedigests[i], fdigest);
+                  rpmMD5Update(&seqmd5, fdigest, digestsize);
 		}
 	      addtoseq(i);
 	    }
@@ -1091,7 +1129,7 @@
   rpmMD5Final(seqmd5res, &seqmd5);
 
   fileflags = xfree(fileflags);
-  filemd5s = xfree(filemd5s);
+  filedigests = xfree(filedigests);
   filerdevs = xfree(filerdevs);
   filesizes = xfree(filesizes);
   filemodes = xfree(filemodes);
diff -urb --new-file deltarpm-3.4/Makefile deltarpm-3.4.new/Makefile
--- deltarpm-3.4/Makefile	2009-03-15 19:54:45.110416239 +0200
+++ deltarpm-3.4.new/Makefile	2009-03-18 13:54:34.602445762 +0200
@@ -10,9 +10,9 @@
 
 all: makedeltarpm applydeltarpm rpmdumpheader makedeltaiso applydeltaiso combinedeltarpm fragiso
 
-makedeltarpm: makedeltarpm.o writedeltarpm.o md5.o util.o rpml.o rpmhead.o cpio.o delta.o cfile.o $(zlibdir)/libz.a
+makedeltarpm: makedeltarpm.o writedeltarpm.o md5.o sha256.o digest.o util.o rpml.o rpmhead.o cpio.o delta.o cfile.o $(zlibdir)/libz.a
 
-applydeltarpm: applydeltarpm.o readdeltarpm.o md5.o util.o rpmhead.o cpio.o cfile.o prelink.o $(zlibdir)/libz.a
+applydeltarpm: applydeltarpm.o readdeltarpm.o md5.o sha256.o digest.o util.o rpmhead.o cpio.o cfile.o prelink.o $(zlibdir)/libz.a
 
 combinedeltarpm: combinedeltarpm.o md5.o util.o rpmhead.o cfile.o readdeltarpm.o writedeltarpm.o $(zlibdir)/libz.a
 
@@ -53,13 +53,15 @@
 
 .PHONY: clean install
 
-makedeltarpm.o: makedeltarpm.c deltarpm.h util.h md5.h rpmhead.h delta.h cfile.h
-applydeltarpm.o: applydeltarpm.c deltarpm.h util.h md5.h rpmhead.h cpio.h cfile.h prelink.h
+makedeltarpm.o: makedeltarpm.c deltarpm.h util.h md5.h digest.h sha256.h rpmhead.h delta.h cfile.h
+applydeltarpm.o: applydeltarpm.c deltarpm.h util.h md5.h digest.h sha256.h rpmhead.h cpio.h cfile.h prelink.h
 rpmdumpheader.o: rpmdumpheader.c
 makedeltaiso.o: makedeltaiso.c delta.h rpmoffs.h cfile.h md5.h
 applydeltaiso.o: applydeltaiso.c cfile.h md5.h
 combinedeltarpm.o: combinedeltarpm.c cfile.h md5.h rpmhead.h deltarpm.h
 md5.o: md5.c md5.h
+sha256.o: sha256.c sha256.h
+digest.o: digest.c digest.h
 util.o: util.c util.h
 rpml.o: rpml.c rpml.h
 cpio.o: cpio.c cpio.h
@@ -68,6 +70,6 @@
 prelink.o: prelink.c prelink.h
 cfile.o: cfile.c cfile.h
 rpmoffs.o: rpmoffs.c rpmoffs.h
-readdeltarpm.o: readdeltarpm.c deltarpm.h util.h md5.h rpmhead.h cfile.h
-writedeltarpm.o: readdeltarpm.c deltarpm.h md5.h rpmhead.h cfile.h
+readdeltarpm.o: readdeltarpm.c deltarpm.h util.h md5.h sha256.h digest.h rpmhead.h cfile.h
+writedeltarpm.o: readdeltarpm.c deltarpm.h md5.h sha256.h digest.h rpmhead.h cfile.h
 fragiso.o: fragiso.c util.h md5.h rpmhead.h cfile.h
diff -urb --new-file deltarpm-3.4/readdeltarpm.c deltarpm-3.4.new/readdeltarpm.c
--- deltarpm-3.4/readdeltarpm.c	2005-06-14 16:49:21.000000000 +0300
+++ deltarpm-3.4.new/readdeltarpm.c	2009-03-15 20:31:05.432169439 +0200
@@ -18,6 +18,8 @@
 
 #include "util.h"
 #include "md5.h"
+#include "sha256.h"
+#include "digest.h"
 #include "rpmhead.h"
 #include "cfile.h"
 #include "deltarpm.h"
@@ -32,7 +34,7 @@
 headtofb(struct rpmhead *h, struct fileblock *fb)
 {
   fb->h = h;
-  fb->filelinktos = fb->filemd5s = 0;
+  fb->filelinktos = fb->filedigests = 0;
   fb->filemodes = fb->filesizes = 0;
   fb->filenames = headexpandfilelist(h, &fb->cnt);
   if (!fb->filenames)
@@ -42,9 +44,10 @@
     }
   fb->filemodes = headint16(h, TAG_FILEMODES, (int *)0);
   fb->filesizes = headint32(h, TAG_FILESIZES, (int *)0);
+  fb->filedigestalgo = headint32(h, TAG_FILEDIGESTALGO, (int *)0);
   fb->filerdevs = headint16(h, TAG_FILERDEVS, (int *)0);
   fb->filelinktos = headstringarray(h, TAG_FILELINKTOS, (int *)0);
-  fb->filemd5s = headstringarray(h, TAG_FILEMD5S, (int *)0);
+  fb->filedigests = headstringarray(h, TAG_FILEDIGESTS, (int *)0);
   return 0;
 }
 
@@ -54,7 +57,7 @@
  */
 
 struct seqdescr *
-expandseq(unsigned char *seq, int seql, int *nump, struct fileblock *fb, int (*checkfunc)(char *, unsigned char *, unsigned int))
+expandseq(unsigned char *seq, int seql, int *nump, struct fileblock *fb, int (*checkfunc)(char *, unsigned int, unsigned char *, unsigned int))
 {
   unsigned char *s;
   char *fn;
@@ -65,12 +68,30 @@
   unsigned char seqmd5res[16];
   struct seqdescr *sd;
   drpmuint off;
-  unsigned char fmd5[16];
+  unsigned char fdigest[32];
+  unsigned int *filedigestalgo, digestsize;
+
   int error = 0;
 
   n = num = nib = shi = jump = pos = 0;
   tog = 1;
 
+  filedigestalgo = fb->filedigestalgo;
+  if (filedigestalgo == 0)
+    {
+      filedigestalgo = xmalloc(sizeof(unsigned int));
+      *filedigestalgo = 1;
+    }
+  if (*filedigestalgo == 1)
+    digestsize = 16;
+  else if (*filedigestalgo == 8)
+    digestsize = 32;
+  else
+    {
+      fprintf(stderr, "Unknown digest type: %i\n", *filedigestalgo);
+      exit(1);
+    }
+
   res = xmalloc2(fb->cnt, sizeof(unsigned int));
   seql -= 16;
   for (i = 0, s = seq + 16; i < seql; )
@@ -165,10 +186,13 @@
 	rpmMD5Update(&seqmd5, (unsigned char *)fb->filelinktos[i], strlen(fb->filelinktos[i]) + 1);
       else if (S_ISREG(fb->filemodes[i]) && lsize)
 	{
-	  parsemd5(fb->filemd5s[i], fmd5);
-	  if (checkfunc && checkfunc(fb->filenames[i], fmd5, lsize))
+          if (*filedigestalgo == 1)
+            parsemd5(fb->filedigests[i], fdigest);
+          else if (*filedigestalgo == 8)
+            parsesha256(fb->filedigests[i], fdigest);
+          if (checkfunc && checkfunc(fb->filenames[i], *filedigestalgo, fdigest, lsize))
 	    error = 1;
-	  rpmMD5Update(&seqmd5, fmd5, 16);
+          rpmMD5Update(&seqmd5, fdigest, digestsize);
 	}
       sd[n].off = off;
       off += sd[n].cpiolen + sd[n].datalen;
diff -urb --new-file deltarpm-3.4/rpmhead.h deltarpm-3.4.new/rpmhead.h
--- deltarpm-3.4/rpmhead.h	2009-03-15 19:54:45.110416239 +0200
+++ deltarpm-3.4.new/rpmhead.h	2009-03-15 20:24:56.761164138 +0200
@@ -15,7 +15,7 @@
 #define TAG_FILEMODES   1030
 #define TAG_FILERDEVS   1033
 #define TAG_FILEMTIMES  1034
-#define TAG_FILEMD5S    1035
+#define TAG_FILEDIGESTS 1035
 #define TAG_FILELINKTOS 1036
 #define TAG_FILEFLAGS   1037
 #define TAG_SOURCERPM   1044
@@ -28,6 +28,7 @@
 #define TAG_PAYLOADFORMAT 1124
 #define TAG_PAYLOADCOMPRESSOR 1125
 #define TAG_FILECOLORS  1140
+#define TAG_FILEDIGESTALGO 5011
 
 #define SIGTAG_SIZE     1000
 #define SIGTAG_MD5      1004
diff -urb --new-file deltarpm-3.4/rpml.c deltarpm-3.4.new/rpml.c
--- deltarpm-3.4/rpml.c	2005-02-03 20:41:51.000000000 +0200
+++ deltarpm-3.4.new/rpml.c	2009-03-15 20:24:56.761164138 +0200
@@ -103,14 +103,33 @@
   unsigned int buildtime;
   int patchescnt, filec, i;
   struct rpmlfile *files = 0;
+  struct rpmhead *h;
   int nfiles = 0;
   unsigned int mode, s, ogs;
+  unsigned int *filedigestalgo, digestsize;
 
   if (!nomagic && rpmlget32(fp) != 0x52504d4c)
     {
       fprintf(stderr, "%s: not an rpml file\n", fn);
       exit(1);
     }
+
+  h = readhead(fileno(fp), 0);
+  filedigestalgo = headint32(h, TAG_FILEDIGESTALGO, (int *)0);
+  if (filedigestalgo == 0)
+    {
+      filedigestalgo = xmalloc(sizeof(unsigned int));
+      *filedigestalgo = 1;
+    }
+  if (*filedigestalgo == 1)
+    digestsize = 16;
+  else if (*filedigestalgo == 8)
+    digestsize = 32;
+  else
+    {
+      fprintf(stderr, "Unknown digest type: %i\n", *filedigestalgo);
+      exit(1);
+    }
   name = rpmlgetstr(fp);
   evr = rpmlgetstr(fp);
   nevr = xmalloc(strlen(name) + strlen(evr) + 2);
@@ -135,7 +154,7 @@
 	  strcpy(files[nfiles].name, n);
 	  files[nfiles].mode = S_IFREG;
 	  files[nfiles].fflags = FILE_UNPATCHED;
-	  memset(files[nfiles].md5, 0, 16);
+          memset(files[nfiles].digest, 0, digestsize);
 	  nfiles++;
 	}
     }
@@ -151,7 +170,7 @@
       files[nfiles].name = xmalloc(strlen(n) + 1);
       strcpy(files[nfiles].name, n);
       files[nfiles].fflags = 0;
-      memset(files[nfiles].md5, 0, 16);
+      memset(files[nfiles].digest, 0, digestsize);
       mode = rpmlget16(fp);
       files[nfiles].mode = mode;
       if (mode == 0)	/* hard link chain */
@@ -192,13 +211,14 @@
 	  s |= getc(fp);
 	  if (s)
 	    {
-	      for (s = 0; s < 16; s++)
-		files[nfiles].md5[s] = getc(fp);
+              for (s = 0; s < digestsize; s++)
+                files[nfiles].digest[s] = getc(fp);
 	    }
 	}
       nfiles++;
     }
   *filesp = files;
   *nfilesp = nfiles;
+  filedigestalgo = xfree(filedigestalgo);
   return nevr;
 }
diff -urb --new-file deltarpm-3.4/rpml.h deltarpm-3.4.new/rpml.h
--- deltarpm-3.4/rpml.h	2005-02-03 20:41:51.000000000 +0200
+++ deltarpm-3.4.new/rpml.h	2009-03-15 20:24:56.761164138 +0200
@@ -11,7 +11,9 @@
   char *name;
   unsigned int mode;
   unsigned int fflags;
-  unsigned char md5[16];
+  unsigned char digest[32];
+  unsigned int digestsize;
+  unsigned int digesttype;
 };
 
 extern char *rpmlread(FILE *fp, char *fn, int nomagic, struct rpmlfile **filesp, int *nfilesp);
diff -urb --new-file deltarpm-3.4/sha256.c deltarpm-3.4.new/sha256.c
--- deltarpm-3.4/sha256.c	1970-01-01 02:00:00.000000000 +0200
+++ deltarpm-3.4.new/sha256.c	2009-03-18 14:23:29.984508813 +0200
@@ -0,0 +1,221 @@
+/*
+ * Implementation of SHA-256, based on Adam Back's sha-1 implementation.
+ * This software is in the public domain as per
+ * http://archives.neohapsis.com/archives/crypto/2000-q4/0730.html
+ * Changes by Jonathan Dieter are also in the public domain
+ */
+
+#include "stdlib.h"
+#include "stdio.h"
+#include "string.h"
+#include "sha256.h"
+
+#define min( x, y ) ( ( x ) < ( y ) ? ( x ) : ( y ) )
+
+#define S(x,n) ( ((x)>>(n)) | ((x)<<(32-(n))) )
+#define R(x,n) ( (x)>>(n) )
+
+#define Ch(x,y,z) ( ((x) & (y)) | (~(x) & (z)) )
+#define Maj(x,y,z) ( ( (x) & (y) ) | ( (x) & (z) ) | ( (y) & (z) ) )
+
+#define SIG0(x) ( S(x, 2) ^ S(x,13) ^ S(x,22) )
+#define SIG1(x) ( S(x, 6) ^ S(x,11) ^ S(x,25) )
+#define sig0(x) ( S(x, 7) ^ S(x,18) ^ R(x, 3) )
+#define sig1(x) ( S(x,17) ^ S(x,19) ^ R(x,10) )
+
+static unsigned int K[] = {
+        0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
+        0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
+        0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
+        0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
+        0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
+        0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
+        0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
+        0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
+        0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
+        0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
+        0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
+        0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
+        0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
+        0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
+        0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
+        0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
+};
+
+#define H1 0x6a09e667
+#define H2 0xbb67ae85
+#define H3 0x3c6ef372
+#define H4 0xa54ff53a
+#define H5 0x510e527f
+#define H6 0x9b05688c
+#define H7 0x1f83d9ab
+#define H8 0x5be0cd19
+
+unsigned int H[ 8 ] = { H1, H2, H3, H4, H5, H6, H7, H8 };
+
+/* convert to big endian where needed */
+
+static void convert_to_bigendian( void *data, int len )
+{
+/* test endianness */
+   unsigned int test_value = 0x01;
+   unsigned char *test_as_bytes = (unsigned char*) &test_value;
+   int little_endian = test_as_bytes[ 0 ];
+
+   unsigned int temp;
+   unsigned char *temp_as_bytes = (unsigned char*) &temp;
+   unsigned int *data_as_words = (unsigned int*) data;
+   unsigned char *data_as_bytes;
+   int i;
+
+   if ( little_endian )
+   {
+      len /= 4;
+      for ( i = 0; i < len; i++ )
+      {
+         temp = data_as_words[ i ];
+         data_as_bytes = (unsigned char*) &( data_as_words[ i ] );
+         
+         data_as_bytes[ 0 ] = temp_as_bytes[ 3 ];
+         data_as_bytes[ 1 ] = temp_as_bytes[ 2 ];
+         data_as_bytes[ 2 ] = temp_as_bytes[ 1 ];
+         data_as_bytes[ 3 ] = temp_as_bytes[ 0 ];
+      }
+   }
+
+/* on big endian machines do nothing as the CPU representation
+ *    automatically does the right thing for SHA1 */
+}
+
+void SHA256_init( SHA256_ctx* ctx )
+{
+   memcpy( ctx->H, H, 8 * sizeof( unsigned int ) );
+   ctx->lbits = 0;
+   ctx->hbits = 0;
+   ctx->mlen = 0;
+}
+
+static void SHA256_transform( SHA256_ctx* ctx )
+{
+   int t;
+   unsigned int A = ctx->H[ 0 ];
+   unsigned int B = ctx->H[ 1 ];
+   unsigned int C = ctx->H[ 2 ];
+   unsigned int D = ctx->H[ 3 ];
+   unsigned int E = ctx->H[ 4 ];
+   unsigned int F = ctx->H[ 5 ];
+   unsigned int G = ctx->H[ 6 ];
+   unsigned int H = ctx->H[ 7 ];
+   unsigned int T1, T2;
+   unsigned int W[ 64 ];
+
+   memcpy( W, ctx->M, 64 );
+
+   for ( t = 16; t < 64; t++ )
+   {
+      W[ t ] = sig1(W[t-2]) + W[t-7] + sig0(W[t-15]) + W[t-16];
+   }
+
+   for ( t = 0; t < 64; t++ )
+   {
+printf ("i = %2d ", t);
+printf ("%08x %08x %08x %08x %08x %08x %08x %08x\n", A,B,C,D,E,F,G,H);
+
+          T1 = H + SIG1(E) + Ch(E,F,G) + K[t] + W[t];
+          T2 = SIG0(A) + Maj(A,B,C);
+          H = G;
+          G = F;
+          F = E;
+      E = D + T1;
+      D = C;
+      C = B;
+      B = A;
+      A = T1 + T2;
+   }
+
+printf ("i = %2d ", t);
+printf ("%08x %08x %08x %08x %08x %08x %08x %08x\n", A,B,C,D,E,F,G,H);
+
+   ctx->H[ 0 ] += A;
+   ctx->H[ 1 ] += B;
+   ctx->H[ 2 ] += C;
+   ctx->H[ 3 ] += D;
+   ctx->H[ 4 ] += E;
+   ctx->H[ 5 ] += F;
+   ctx->H[ 6 ] += G;
+   ctx->H[ 7 ] += H;
+}
+
+void SHA256_update( SHA256_ctx* ctx, const unsigned char *data, unsigned int length)
+{
+   unsigned int use;
+   unsigned int low_bits;
+   
+/* convert length to bits and add to the 64 bit word formed by lbits
+ *    and hbits */
+
+   ctx->hbits += length >> 29;
+   low_bits = length << 3;
+   ctx->lbits += low_bits;
+   if ( ctx->lbits < low_bits ) { ctx->hbits++; }
+
+/* deal with first block */
+
+   use = min( 64 - ctx->mlen, length );
+   memcpy( ctx->M + ctx->mlen, data, use );
+   ctx->mlen += use;
+   length -= use;
+   data += use;
+
+   while ( ctx->mlen == 64 )
+   {
+      convert_to_bigendian( (unsigned int*)ctx->M, 64 );
+      SHA256_transform( ctx );
+      use = min( 64, length );
+      memcpy( ctx->M, data, use );
+      ctx->mlen = use;
+      length -= use;
+      data += use; /* was missing */
+   }
+}
+
+void SHA256_final( SHA256_ctx* ctx )
+{
+   if ( ctx->mlen < 56 )
+   {
+      ctx->M[ ctx->mlen ] = 0x80; ctx->mlen++;
+      memset( ctx->M + ctx->mlen, 0x00, 56 - ctx->mlen );
+      convert_to_bigendian( ctx->M, 56 );
+   }
+   else
+   {
+      ctx->M[ ctx->mlen ] = 0x80;
+      ctx->mlen++;
+      memset( ctx->M + ctx->mlen, 0x00, 64 - ctx->mlen );
+      convert_to_bigendian( ctx->M, 64 );
+      SHA256_transform( ctx );
+      memset( ctx->M, 0x00, 56 );
+   }
+
+   memcpy( ctx->M + 56, (void*)(&(ctx->hbits)), 8 );
+   SHA256_transform( ctx );
+}
+
+void SHA256_digest( SHA256_ctx* ctx, unsigned char *digest )
+{
+   if ( digest )
+   {
+      memcpy( digest, ctx->H, 8 * sizeof( unsigned int ) );
+      convert_to_bigendian( digest, 8 * sizeof( unsigned int ) );
+   }
+}
+
+void SHA256_update32( SHA256_ctx* ctx, unsigned int i)
+{
+   unsigned char d[4];
+   d[0] = i >> 24;
+   d[1] = i >> 16;
+   d[2] = i >> 8;
+   d[3] = i;
+   SHA256_update(ctx, d, 4);
+}
diff -urb --new-file deltarpm-3.4/sha256.h deltarpm-3.4.new/sha256.h
--- deltarpm-3.4/sha256.h	1970-01-01 02:00:00.000000000 +0200
+++ deltarpm-3.4.new/sha256.h	2009-03-18 14:23:47.267670780 +0200
@@ -0,0 +1,23 @@
+/*
+ * This software is in the public domain as per
+ * http://archives.neohapsis.com/archives/crypto/2000-q4/0730.html
+ * Changes by Jonathan Dieter are also in the public domain
+ */
+
+#if !defined( _sha256_h )
+#define _sha256_h
+
+typedef struct {
+      unsigned int H[ 8 ];
+      unsigned int hbits, lbits;
+      unsigned char M[ 64 ];
+      unsigned int mlen;
+} SHA256_ctx;
+
+void SHA256_init ( SHA256_ctx *ctx);
+void SHA256_update( SHA256_ctx *ctx, const unsigned char *data, unsigned int length );
+void SHA256_update32( SHA256_ctx *ctx, unsigned int i);
+void SHA256_final ( SHA256_ctx *ctx);
+void SHA256_digest( SHA256_ctx *ctx, unsigned char *digest);
+
+#endif
diff -urb --new-file deltarpm-3.4/util.c deltarpm-3.4.new/util.c
--- deltarpm-3.4/util.c	2005-06-13 20:14:32.000000000 +0300
+++ deltarpm-3.4.new/util.c	2009-03-15 20:24:56.763165826 +0200
@@ -153,3 +153,18 @@
       exit(1);
     }
 }
+
+void
+parsesha256(char *s, unsigned char *sha256)
+{
+  if (!*s)
+    {
+      memset(sha256, 0, 32);
+      return;
+    }
+  if (parsehex(s, sha256, 32) != 32)
+    {
+      fprintf(stderr, "parsesha256: bad sha256\n");
+      exit(1);
+    }
+}
diff -urb --new-file deltarpm-3.4/util.h deltarpm-3.4.new/util.h
--- deltarpm-3.4/util.h	2005-06-13 20:12:14.000000000 +0300
+++ deltarpm-3.4.new/util.h	2009-03-15 20:24:56.763165826 +0200
@@ -14,3 +14,4 @@
 extern ssize_t xread(int fd, void *buf, size_t l);
 extern int parsehex(char *s, unsigned char *buf, int len);
 extern void parsemd5(char *s, unsigned char *md5);
+extern void parsesha256(char *s, unsigned char *sha256); 


Index: deltarpm.spec
===================================================================
RCS file: /cvs/extras/rpms/deltarpm/devel/deltarpm.spec,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- deltarpm.spec	6 Mar 2009 21:38:44 -0000	1.15
+++ deltarpm.spec	24 Mar 2009 07:34:34 -0000	1.16
@@ -1,7 +1,7 @@
 Summary: Create deltas between rpms
 Name: deltarpm
 Version: 3.4
-Release: 13%{?dist}
+Release: 14%{?dist}
 License: BSD
 Group: System Environment/Base
 URL: http://www.novell.com/products/linuxpackages/professional/deltarpm.html
@@ -15,6 +15,7 @@
 Patch1: deltarpm-3.4-multilib-include-colored.patch
 Patch2: deltarpm-3.4-prelink-bugfix.patch
 Patch3: deltarpm-3.4-skipmd5.patch
+Patch4: deltarpm-3.4-sha256.patch
 
 %description
 A deltarpm contains the difference between an old
@@ -29,6 +30,7 @@
 %patch1 -p1 -b .multicolor
 %patch2 -p1 -b .prelink
 %patch3 -p1 -b .skipmd5
+%patch4 -p1 -b .sha256
 
 %build
 %{__make} %{?_smp_mflags} CFLAGS="$RPM_OPT_FLAGS" \
@@ -55,8 +57,11 @@
 %{_bindir}/rpmdumpheader
 
 %changelog
+* Tue Mar 24 2009 Jonathan Dieter <jdieter at gmail.com> - 3.4-14
+- Add support for rpms with sha256 file digests
+
 * Fri Mar 06 2009 Jesse Keating <jkeating at redhat.com> - 3.4-13
-- rebuild for new rpm libs
+- Rebuild for new rpm libs
 
 * Tue Feb 24 2009 Fedora Release Engineering <rel-eng at lists.fedoraproject.org> - 3.4-12
 - Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild




More information about the fedora-extras-commits mailing list