static int rpm_b64decode(lua_State *L) { const char *str = luaL_checkstring(L, 1); if (str) { void *data = NULL; size_t len = 0; if (rpmBase64Decode(str, &data, &len) == 0) { lua_pushlstring(L, data, len); } else { lua_pushnil(L); } free(data); } return 1; }
/** * Wrap a pubkey in ascii armor for display. * @todo Permit selectable display formats (i.e. binary). * @param td tag data container * @return formatted string */ static char * armorFormat(rpmtd td) { const char * enc; const unsigned char * s; unsigned char * bs = NULL; char *val; size_t ns; int atype; switch (rpmtdType(td)) { case RPM_BIN_TYPE: s = td->data; /* XXX HACK ALERT: element field abused as no. bytes of binary data. */ ns = td->count; atype = PGPARMOR_SIGNATURE; /* XXX check pkt for signature */ break; case RPM_STRING_TYPE: case RPM_STRING_ARRAY_TYPE: enc = rpmtdGetString(td); if (rpmBase64Decode(enc, (void **)&bs, &ns)) return xstrdup(_("(not base64)")); s = bs; atype = PGPARMOR_PUBKEY; /* XXX check pkt for pubkey */ break; case RPM_NULL_TYPE: case RPM_CHAR_TYPE: case RPM_INT8_TYPE: case RPM_INT16_TYPE: case RPM_INT32_TYPE: case RPM_INT64_TYPE: case RPM_I18NSTRING_TYPE: default: return xstrdup(_("(invalid type)")); break; } /* XXX this doesn't use padding directly, assumes enough slop in retval. */ val = pgpArmorWrap(atype, s, ns); if (atype == PGPARMOR_PUBKEY) { free(bs); } return val; }
static rpmRC sepolWritePolicy(const sepol * pol, char **path) { char *tmppath = NULL; FD_t fd = NULL; char *policy = NULL; size_t policylen; rpmRC rc = RPMRC_FAIL; if (rpmBase64Decode(pol->data, (void **) &policy, &policylen) != 0) { rpmlog(RPMLOG_ERR, _("Failed to decode policy for %s\n"), pol->name); goto exit; } fd = rpmMkTempFile(NULL, &tmppath); if (fd == NULL || Ferror(fd)) { rpmlog(RPMLOG_ERR, _("Failed to create temporary file for %s: %s\n"), pol->name, strerror(errno)); goto exit; } if (!Fwrite(policy, sizeof(*policy), policylen, fd)) { rpmlog(RPMLOG_ERR, _("Failed to write %s policy to file %s\n"), pol->name, tmppath); goto exit; } *path = tmppath; rc = RPMRC_OK; exit: if (fd) Fclose(fd); _free(policy); if (rc != RPMRC_OK) _free(tmppath); return rc; }
static int loadKeyringFromDB(rpmts ts) { Header h; rpmdbMatchIterator mi; int nkeys = 0; rpmlog(RPMLOG_DEBUG, "loading keyring from rpmdb\n"); mi = rpmtsInitIterator(ts, RPMDBI_NAME, "gpg-pubkey", 0); while ((h = rpmdbNextIterator(mi)) != NULL) { struct rpmtd_s pubkeys; const char *key; if (!headerGet(h, RPMTAG_PUBKEYS, &pubkeys, HEADERGET_MINMEM)) continue; while ((key = rpmtdNextString(&pubkeys))) { uint8_t *pkt; size_t pktlen; if (rpmBase64Decode(key, (void **) &pkt, &pktlen) == 0) { rpmPubkey key = rpmPubkeyNew(pkt, pktlen); if (rpmKeyringAddKey(ts->keyring, key) == 0) { char *nvr = headerGetAsString(h, RPMTAG_NVR); rpmlog(RPMLOG_DEBUG, "added key %s to keyring\n", nvr); free(nvr); nkeys++; } rpmPubkeyFree(key); free(pkt); } } rpmtdFreeData(&pubkeys); } rpmdbFreeIterator(mi); return nkeys; }