const unsigned char * rpmfiMD5(rpmfi fi)
{
- unsigned char * MD5 = NULL;
+ const unsigned char *digest;
+ pgpHashAlgo algo = 0;
+
+ digest = rpmfiDigest(fi, &algo, NULL);
+ return (algo == PGPHASHALGO_MD5) ? digest : NULL;
+}
+
+const unsigned char * rpmfiDigest(rpmfi fi, pgpHashAlgo *algo, size_t *len)
+{
+ const unsigned char *digest = NULL;
if (fi != NULL && fi->i >= 0 && fi->i < fi->fc) {
+ size_t diglen = rpmDigestLength(fi->digestalgo);
if (fi->digests != NULL)
- MD5 = fi->digests + (16 * fi->i);
+ digest = fi->digests + (diglen * fi->i);
+ if (len)
+ *len = diglen;
+ if (algo)
+ *algo = fi->digestalgo;
}
- return MD5;
+ return digest;
}
const char * rpmfiFLink(rpmfi fi)
xx = hge(h, RPMTAG_FILELINKTOS, NULL, (rpm_data_t *) &fi->flinks, NULL);
xx = hge(h, RPMTAG_FILELANGS, NULL, (rpm_data_t *) &fi->flangs, NULL);
+ /* digest algorithm hardwired to MD5 for now */
+ fi->digestalgo = PGPHASHALGO_MD5;
fi->fdigests = NULL;
xx = hge(h, RPMTAG_FILEMD5S, NULL, (rpm_data_t *) &fi->fdigests, NULL);
#include <rpm/rpmtypes.h>
#include <rpm/rpmvf.h>
+#include <rpm/rpmpgp.h>
#ifdef __cplusplus
extern "C" {
rpmfileState rpmfiFState(rpmfi fi);
/** \ingroup rpmfi
+ * Return current file (binary) digest of file info set.
+ * @param fi file info set
+ * @retval algo digest hash algoritm used (pass NULL to ignore)
+ * @retval diglen digest hash length (pass NULL to ignore)
+ * @return current file digest, NULL on invalid
+ */
+const unsigned char * rpmfiDigest(rpmfi fi, pgpHashAlgo *algo, size_t *diglen);
+
+/** \ingroup rpmfi
* Return current file (binary) md5 digest from file info set.
* @param fi file info set
* @return current file md5 digest, NULL on invalid
const char ** odnl; /*!< Original dirname(s) (from header) */
int32_t * odil; /*!< Original dirindex(s) (from header) */
+ pgpHashAlgo digestalgo; /*!< File checksum algorithm */
unsigned char * digests; /*!< File checksums in binary. */
char * pretrans;