diff -urb --new-file deltarpm-3.4/applydeltarpm.c deltarpm-3.4b/applydeltarpm.c
--- deltarpm-3.4/applydeltarpm.c 2009-03-26 08:29:23.000000000 +0200
+++ deltarpm-3.4b/applydeltarpm.c 2009-03-26 08:29:43.000000000 +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);
@@ -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.4b/deltarpm.h
--- deltarpm-3.4/deltarpm.h 2005-06-13 20:47:38.000000000 +0300
+++ deltarpm-3.4b/deltarpm.h 2009-03-26 08:29:43.000000000 +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.4b/digest.c
--- deltarpm-3.4/digest.c 1970-01-01 02:00:00.000000000 +0200
+++ deltarpm-3.4b/digest.c 2009-03-26 08:29:43.000000000 +0200
@@ -0,0 +1,74 @@
+/* digest.c
+ *
+ * Copyright (c) 2009 Jonathan Dieter <jdieter@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.4b/digest.h
--- deltarpm-3.4/digest.h 1970-01-01 02:00:00.000000000 +0200
+++ deltarpm-3.4b/digest.h 2009-03-26 08:29:43.000000000 +0200
@@ -0,0 +1,13 @@
+/* digest.h
+ *
+ * Copyright (c) 2009 Jonathan Dieter <jdieter@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.4b/makedeltarpm.c
--- deltarpm-3.4/makedeltarpm.c 2009-03-26 08:29:14.000000000 +0200
+++ deltarpm-3.4b/makedeltarpm.c 2009-03-26 08:29:43.000000000 +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.4b/Makefile
--- deltarpm-3.4/Makefile 2009-03-26 08:29:14.000000000 +0200
+++ deltarpm-3.4b/Makefile 2009-03-26 08:29:43.000000000 +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.4b/readdeltarpm.c
--- deltarpm-3.4/readdeltarpm.c 2005-06-14 16:49:21.000000000 +0300
+++ deltarpm-3.4b/readdeltarpm.c 2009-03-26 08:29:43.000000000 +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.4b/rpmhead.h
--- deltarpm-3.4/rpmhead.h 2009-03-26 08:29:14.000000000 +0200
+++ deltarpm-3.4b/rpmhead.h 2009-03-26 08:29:43.000000000 +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.4b/rpml.c
--- deltarpm-3.4/rpml.c 2005-02-03 20:41:51.000000000 +0200
+++ deltarpm-3.4b/rpml.c 2009-03-26 08:29:43.000000000 +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.4b/rpml.h
--- deltarpm-3.4/rpml.h 2005-02-03 20:41:51.000000000 +0200
+++ deltarpm-3.4b/rpml.h 2009-03-26 08:29:43.000000000 +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.4b/sha256.c
--- deltarpm-3.4/sha256.c 1970-01-01 02:00:00.000000000 +0200
+++ deltarpm-3.4b/sha256.c 2009-03-26 08:29:43.000000000 +0200
@@ -0,0 +1,216 @@
+/*
+ * 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++ )
+ {
+ 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;
+ }
+
+
+ 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.4b/sha256.h
--- deltarpm-3.4/sha256.h 1970-01-01 02:00:00.000000000 +0200
+++ deltarpm-3.4b/sha256.h 2009-03-26 08:29:43.000000000 +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.4b/util.c
--- deltarpm-3.4/util.c 2005-06-13 20:14:32.000000000 +0300
+++ deltarpm-3.4b/util.c 2009-03-26 08:29:44.000000000 +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.4b/util.h
--- deltarpm-3.4/util.h 2005-06-13 20:12:14.000000000 +0300
+++ deltarpm-3.4b/util.h 2009-03-26 08:29:44.000000000 +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);