7 #include <netinet/in.h> 12 #define _RPMHKP_INTERNAL 22 #define _RPMEVR_INTERNAL 26 #define alloca_strdup(_s) strcpy(alloca(strlen(_s)+1), (_s)) 58 if (sig == NULL || dig == NULL || sigp == NULL)
61 keyid =
pgpGrab(sigp->signid+4, 4);
85 static int dncmp(
const void * a,
const void * b)
88 const char *
const * first = a;
89 const char *
const * second = b;
90 return strcmp(*first, *second);
102 HE_t he = memset(
alloca(
sizeof(*he)), 0,
sizeof(*he));
105 const char ** dirNames;
106 const char ** baseNames;
107 int32_t * dirIndexes;
129 fileNames = he->
p.
ptr;
134 dirNames =
alloca(
sizeof(*dirNames) * count);
135 baseNames =
alloca(
sizeof(*dirNames) * count);
136 dirIndexes =
alloca(
sizeof(*dirIndexes) * count);
138 if (fileNames[0][0] !=
'/') {
141 dirNames[dirIndex] =
"";
142 for (i = 0; i < count; i++) {
143 dirIndexes[i] = dirIndex;
144 baseNames[i] = fileNames[i];
150 for (i = 0; i < count; i++) {
151 const char ** needle;
156 if (fileNames[i] == NULL)
158 baseName = strrchr(fileNames[i],
'/') + 1;
159 len = baseName - fileNames[i];
161 savechar = *baseName;
165 (needle = bsearch(&fileNames[i], dirNames, dirIndex + 1,
sizeof(dirNames[0]),
dncmp)) == NULL) {
166 char *s =
alloca(len + 1);
167 memcpy(s, fileNames[i], len + 1);
169 dirIndexes[i] = ++dirIndex;
170 dirNames[dirIndex] = s;
172 dirIndexes[i] = needle - dirNames;
175 *baseName = savechar;
176 baseNames[i] = baseName;
185 dirIndexes = he->
p.
ptr;
188 baseNames = he->
p.
ptr;
191 dirNames = he->
p.
ptr;
195 he->
p.
ptr = dirIndexes;
201 he->
p.
ptr = baseNames;
207 he->
p.
ptr = dirNames;
212 fileNames =
_free(fileNames);
223 HE_t he = memset(
alloca(
sizeof(*he)), 0,
sizeof(*he));
224 const char *N, *V, *R;
225 #ifdef RPM_VENDOR_MANDRIVA 234 const char ** provides = NULL;
235 const char ** providesEVR = NULL;
248 nb = 21 + strlen(V) + 1 + strlen(R) + 1;
249 #ifdef RPM_VENDOR_MANDRIVA 253 nb += (gotD ? strlen(D) + 1 : 0);
262 sprintf(p,
"%d:", E);
266 #ifdef RPM_VENDOR_MANDRIVA 284 provides = he->
p.
argv;
285 providesCount = he->
c;
296 providesEVR = he->
p.
argv;
298 for (i = 0; i < providesCount; i++) {
300 static const char * vdummy =
"";
305 he->
p.
argv = &vdummy;
315 he->
p.
ui32p = (
void *) &fdummy;
330 provideFlags = he->
p.
ui32p;
333 if (provides && providesEVR && provideFlags)
334 for (i = 0; i < providesCount; i++) {
335 if (!(provides[i] && providesEVR[i]))
338 !strcmp(N, provides[i]) && !strcmp(pEVR, providesEVR[i])))
347 provides =
_free(provides);
348 providesEVR =
_free(providesEVR);
349 provideFlags =
_free(provideFlags);
366 he->
p.
argv[providesCount] = N;
410 const char * rpmversion = NULL;
411 HE_t he = memset(
alloca(
sizeof(*he)), 0,
sizeof(*he));
415 rpmversion = he->
p.
str;
418 if ((!rpmversion) || rpmversion[0] <
'4') {
423 rpmversion =
_free(rpmversion);
441 const char * msg = NULL;
448 if (hdrp) *hdrp = NULL;
456 {
const char item[] =
"Lead";
473 {
const char item[] =
"Signature";
479 (msg && *msg ? msg :
_(
"read failed\n")));
494 #define _chk(_mask) (she->tag == 0 && !(vsflags & (_mask))) 534 {
const char item[] =
"Header";
546 if (opx > 0 && op != NULL) {
562 if (xx && he->
p.
argv != NULL && he->
c > 0)
568 dig->pub =
_free(dig->pub);
576 dig->pub =
_free(dig->pub);
585 if (she->
p.
ptr == NULL) {
600 xx = rpmhkpLoadSignature(NULL, dig, pp);
601 if (dig->signature.version != 3 && dig->signature.version != 4) {
603 _(
"skipping package %s with unverifiable V%u signature\n"),
604 fn, dig->signature.version);
611 unsigned char * hmagic = NULL;
625 if (hmagic && nmagic > 0) {
627 dig->nbytes += nmagic;
638 xx = rpmhkpLoadSignature(NULL, dig, pp);
639 if (dig->signature.version != 3 && dig->signature.version != 4) {
641 _(
"skipping package %s with unverifiable V%u signature\n"),
642 fn, dig->signature.version);
651 unsigned char * hmagic = NULL;
665 if (hmagic && nmagic > 0) {
667 dig->nbytes += nmagic;
680 while ((count =
Fread(buf,
sizeof(buf[0]),
sizeof(buf), fd)) > 0)
681 dig->nbytes += count;
710 rpmlog(lvl,
"%s: %s\n", fn, buf);
726 if (rc !=
RPMRC_FAIL && h != NULL && hdrp != NULL) {
rpmtime_t rpmswExit(rpmop op, ssize_t rc)
Exit timed operation.
void headerMergeLegacySigs(Header h, const Header sigh)
Translate and merge legacy signature tags into header.
int pgpPktLen(const rpmuint8_t *pkt, size_t pleft, pgpPkt pp)
const void * pgpGetSig(pgpDig dig)
Get signature tag data, i.e.
enum rpmSigTag_e rpmSigTag
struct pgpDigParams_s * pgpDigParams
DIGEST_CTX rpmDigestInit(pgpHashAlgo hashalgo, rpmDigestFlags flags)
Initialize digest.
static unsigned int pgpGrab(const rpmuint8_t *s, size_t nbytes)
Return (native-endian) integer from big-endian representation.
enum pgpHashAlgo_e pgpHashAlgo
9.4.
rpmtime_t rpmswAdd(rpmop to, rpmop from)
Sum statistic counters.
static rpmVSFlags vsflags
rpmop rpmtsOp(rpmts ts, rpmtsOpX opx)
Retrieve operation timestamp from a transaction set.
int pgpSetSig(pgpDig dig, rpmuint32_t sigtag, rpmuint32_t sigtype, const void *sig, rpmuint32_t siglen)
Set signature tag info, i.e.
enum rpmtsOpX_e rpmtsOpX
Indices for timestamps.
rpmiob rpmiobFree(rpmiob iob)
Destroy a I/O buffer instance.
static void rpmlog(int code, const char *fmt,...)
rpmiob rpmiobAppend(rpmiob iob, const char *s, size_t nl)
Append string to I/O buffer.
static void fdInitDigest(FD_t fd, pgpHashAlgo hashalgo, int _flags)
Attach digest to fd.
static void rpm3to4(Header h)
pgpArmor pgpArmorUnwrap(rpmiob iob, rpmuint8_t **pkt, size_t *pktlen)
Parse armored OpenPGP packets from an iob.
static void providePackageNVR(Header h)
static void add_RPMTAG_SOURCERPM(Header h)
static rpmop fdstat_op(FD_t fd, fdOpX opx)
pgpVSFlags pgpDigVSFlags
Disabler bits(s) for signature/digest checking.
void rpmtsCleanDig(rpmts ts)
Free signature verification data.
static void compressFilelist(Header h)
Convert absolute path tag to (dirname,basename,dirindex) tags.
const char * Fstrerror(FD_t fd)
strerror(3) clone.
int rpmDigestUpdate(DIGEST_CTX ctx, const void *data, size_t len)
Update context with next plain text buffer.
static void fdSetDig(FD_t fd, pgpDig dig)
unsigned char rpmuint8_t
Private int typedefs to avoid C99 portability issues.
enum evrFlags_e rpmsenseFlags
pgpDigParams pgpGetSignature(pgpDig dig)
Return OpenPGP signature parameters.
rpmRC rpmReadPackageFile(rpmts ts, FD_t fd, const char *fn, Header *hdrp)
Return package header from file handle, verifying digests/signatures.
rpmuint32_t pgpGetSigtag(pgpDig dig)
Get signature tag.
The FD_t File Handle data structure.
Generate and verify rpm package signatures.
pgpVSFlags rpmVSFlags
Bit(s) to control digest and signature verification.
Header headerFree(Header h)
Dereference a header instance.
rpmRC rpmVerifySignature(void *_dig, char *result)
Verify a signature from a package.
int rpmswEnter(rpmop op, ssize_t rc)
Enter timed operation.
size_t Fread(void *buf, size_t size, size_t nmemb, FD_t fd)
fread(3) clone.
static unsigned int nextkeyid
enum rpmTagType_e rpmTagType
Cumulative statistics for an operation.
rpmiob rpmiobNew(size_t len)
Create an I/O buffer.
Header headerLink(Header h)
Reference a header instance.
enum rpmRC_e rpmRC
RPM return codes.
Methods to handle package elements.
rpmtime_t rpmswSub(rpmop to, rpmop from)
Subtract statistic counters.
char * stpcpy(char *dest, const char *src)
struct rpmts_s * rpmts
The RPM Transaction Set.
static void * _free(const void *p)
Wrapper to free(3), hides const compilation noise, permit NULL, return NULL.
int headerNEVRA(Header h, const char **np, const char **ep, const char **vp, const char **rp, const char **ap)
Return name, epoch, version, release, arch strings from header.
Structures and prototypes used for an "rpmts" transaction set.
static int dncmp(const void *a, const void *b)
static unsigned int nkeyids
static int pgpStashKeyid(pgpDig dig)
Remember current key id.
rpmRC rpmpkgRead(const char *fn, FD_t fd, void *ptr, const char **msg)
Read item from file descriptor.
static void fdStealDigest(FD_t fd, pgpDig dig)
pgpDig rpmtsDig(rpmts ts)
Get OpenPGP packet parameters, i.e.
void * pgpStatsAccumulator(pgpDig dig, int opx)
Return pgpDig container accumulator structure.
static unsigned int nkeyids_max