00001
00014 #include "system.h"
00015 #include "md5.h"
00016 #include "rpmio_internal.h"
00017 #include "debug.h"
00018
00027 static int domd5(const char * fn, unsigned char * digest, int asAscii,
00028 int brokenEndian)
00029
00030 {
00031 int rc;
00032
00033 #ifndef DYING
00034 unsigned char buf[1024];
00035 unsigned char bindigest[16];
00036 FILE * fp;
00037 MD5_CTX ctx;
00038
00039 memset(bindigest, 0, sizeof(bindigest));
00040 fp = fopen(fn, "r");
00041 if (!fp) {
00042 return 1;
00043 }
00044
00045 rpmMD5Init(&ctx, brokenEndian);
00046 while ((rc = fread(buf, sizeof(buf[0]), sizeof(buf), fp)) > 0)
00047 rpmMD5Update(&ctx, buf, rc);
00048 rpmMD5Final(bindigest, &ctx);
00049 if (ferror(fp)) {
00050 (void) fclose(fp);
00051 return 1;
00052 }
00053
00054 if (!asAscii) {
00055 memcpy(digest, bindigest, 16);
00056 } else {
00057 sprintf(digest, "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x"
00058 "%02x%02x%02x%02x%02x",
00059 (unsigned)bindigest[0],
00060 (unsigned)bindigest[1],
00061 (unsigned)bindigest[2],
00062 (unsigned)bindigest[3],
00063 (unsigned)bindigest[4],
00064 (unsigned)bindigest[5],
00065 (unsigned)bindigest[6],
00066 (unsigned)bindigest[7],
00067 (unsigned)bindigest[8],
00068 (unsigned)bindigest[9],
00069 (unsigned)bindigest[10],
00070 (unsigned)bindigest[11],
00071 (unsigned)bindigest[12],
00072 (unsigned)bindigest[13],
00073 (unsigned)bindigest[14],
00074 (unsigned)bindigest[15]);
00075
00076 }
00077 (void) fclose(fp);
00078 rc = 0;
00079 #else
00080 FD_t fd = Fopen(fn, "r.ufdio");
00081 unsigned char buf[BUFSIZ];
00082 unsigned char * md5sum = NULL;
00083 size_t md5len;
00084
00085 if (fd == NULL || Ferror(fd)) {
00086 if (fd)
00087 Fclose(fd);
00088 return 1;
00089 }
00090
00091
00092 fdInitMD5(fd, (brokenEndian ? RPMDIGEST_NATIVE : 0) );
00093
00094 while ((rc = Fread(buf, sizeof(buf[0]), sizeof(buf), fd)) > 0)
00095 ;
00096 fdFiniMD5(fd, (void **)&md5sum, &md5len, 1);
00097
00098 if (Ferror(fd))
00099 rc = 1;
00100 Fclose(fd);
00101
00102 if (!rc)
00103 memcpy(digest, md5sum, md5len);
00104 if (md5sum)
00105 free(md5sum);
00106 #endif
00107
00108 return rc;
00109 }
00110
00111
00112 int mdbinfile(const char *fn, unsigned char *bindigest) {
00113 return domd5(fn, bindigest, 0, 0);
00114 }
00115
00116 int mdbinfileBroken(const char *fn, unsigned char *bindigest) {
00117 return domd5(fn, bindigest, 0, 1);
00118 }
00119
00120 int mdfile(const char *fn, unsigned char *digest) {
00121 return domd5(fn, digest, 1, 0);
00122 }
00123
00124 int mdfileBroken(const char *fn, unsigned char *digest) {
00125 return domd5(fn, digest, 1, 1);
00126 }
00127