7 #include <netinet/in.h>
12 #define _RPMHKP_INTERNAL
24 #define alloca_strdup(_s) strcpy(alloca(strlen(_s)+1), (_s))
56 if (sig == NULL || dig == NULL || sigp == NULL)
59 keyid =
pgpGrab(sigp->signid+4, 4);
87 unsigned char * hmagic = NULL;
99 if (hmagic && nmagic > 0) {
101 dig->nbytes += nmagic;
104 dig->nbytes += he->
c;
127 const char * msg = NULL;
134 if (hdrp) *hdrp = NULL;
142 {
const char item[] =
"Lead";
159 {
const char item[] =
"Signature";
165 (msg && *msg ? msg :
_(
"read failed\n")));
180 #define _chk(_mask) (she->tag == 0 && !(vsflags & (_mask)))
223 {
const char item[] =
"Header";
235 if (opx > 0 && op != NULL) {
251 if (xx && he->
p.
argv != NULL && he->
c > 0)
257 dig->pub =
_free(dig->pub);
265 dig->pub =
_free(dig->pub);
274 if (she->
p.
ptr == NULL) {
290 if (dig->signature.version != 3 && dig->signature.version != 4) {
292 _(
"skipping package %s with unverifiable V%u signature\n"),
293 fn, dig->signature.version);
297 xx =
hBlobDigest(h, dig, dig->signature.hash_algo, &dig->hrsa);
303 if (dig->signature.version != 3 && dig->signature.version != 4) {
305 _(
"skipping package %s with unverifiable V%u signature\n"),
306 fn, dig->signature.version);
310 xx =
hBlobDigest(h, dig, dig->signature.hash_algo, &dig->hdsa);
312 case RPMSIGTAG_ECDSA:
316 if (dig->signature.version != 3 && dig->signature.version != 4) {
318 _(
"skipping package %s with unverifiable V%u signature\n"),
319 fn, dig->signature.version);
323 xx =
hBlobDigest(h, dig, dig->signature.hash_algo, &dig->hecdsa);
333 while ((count =
Fread(buf,
sizeof(buf[0]),
sizeof(buf), fd)) > 0)
334 dig->nbytes += count;
363 rpmlog(lvl,
"%s: %s\n", fn, buf);
379 if (rc !=
RPMRC_FAIL && h != NULL && hdrp != NULL) {
405 case RPMSIGTAG_ECDSA:
rpmtime_t rpmswExit(rpmop op, ssize_t rc)
Exit timed operation.
const char bson_timestamp_t * ts
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 context.
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.
pgpArmor pgpArmorUnwrap(rpmiob iob, rpmuint8_t **pkt, size_t *pktlen)
Parse armored OpenPGP packets from an iob.
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.
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.
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.
const char const bson const bson * op
size_t Fread(void *buf, size_t size, size_t nmemb, FD_t fd)
fread(3) clone.
static unsigned int nextkeyid
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.
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.
Structures and prototypes used for an "rpmts" transaction set.
static unsigned int nkeyids
static int pgpStashKeyid(pgpDig dig)
Remember current key id.
static int hBlobDigest(Header h, pgpDig dig, pgpHashAlgo hash_algo, DIGEST_CTX *ctxp)
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
int rpmhkpLoadSignature(rpmhkp hkp, pgpDig dig, pgpPkt pp)