/** * Display signature fingerprint and time. * @param td tag data container * @return formatted string */ static char * pgpsigFormat(rpmtd td) { char * val = NULL; if (rpmtdType(td) != RPM_BIN_TYPE) { val = xstrdup(_("(not a blob)")); } else { pgpDigParams sigp = NULL; if (pgpPrtParams(td->data, td->count, PGPTAG_SIGNATURE, &sigp)) { val = xstrdup(_("(not an OpenPGP signature)")); } else { char dbuf[BUFSIZ]; char *keyid = pgpHexStr(sigp->signid, sizeof(sigp->signid)); unsigned int dateint = pgpGrab(sigp->time, sizeof(sigp->time)); time_t date = dateint; struct tm * tms = localtime(&date); unsigned int key_algo = pgpDigParamsAlgo(sigp, PGPVAL_PUBKEYALGO); unsigned int hash_algo = pgpDigParamsAlgo(sigp, PGPVAL_HASHALGO); if (!(tms && strftime(dbuf, sizeof(dbuf), "%c", tms) > 0)) { snprintf(dbuf, sizeof(dbuf), _("Invalid date %u"), dateint); dbuf[sizeof(dbuf)-1] = '\0'; } rasprintf(&val, "%s/%s, %s, Key ID %s", pgpValString(PGPVAL_PUBKEYALGO, key_algo), pgpValString(PGPVAL_HASHALGO, hash_algo), dbuf, keyid); free(keyid); pgpDigParamsFree(sigp); } } return val; }
const char *rpmsinfoDescr(struct rpmsinfo_s *sinfo) { if (sinfo->descr == NULL) { char *t; switch (sinfo->type) { case RPMSIG_DIGEST_TYPE: rasprintf(&sinfo->descr, _("%s%s %s"), rangeName(sinfo->range), pgpValString(PGPVAL_HASHALGO, sinfo->hashalgo), _("digest")); break; case RPMSIG_SIGNATURE_TYPE: t = sinfo->sig ? pgpIdentItem(sinfo->sig) : NULL; rasprintf(&sinfo->descr, _("%s%s"), rangeName(sinfo->range), t ? t : _("signature")); free(t); break; } } return sinfo->descr; }