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