rpm  5.4.14
Macros | Functions | Variables
signature.c File Reference
#include "system.h"
#include <rpmio.h>
#include <rpmurl.h>
#include <rpmcb.h>
#include <rpmpgp.h>
#include <rpmmacro.h>
#include <rpmhkp.h>
#include <rpmku.h>
#include <rpmtag.h>
#include "rpmdb.h"
#include <pkgio.h>
#include "legacy.h"
#include "signature.h"
#include "debug.h"
Include dependency graph for signature.c:

Go to the source code of this file.

Macros

#define _RPMPGP_INTERNAL
 

Functions

int rpmTempFile (const char *prefix, const char **fnptr, void *fdptr)
 Return file handle for a temporaray file. More...
 
static int makeGPGSignature (const char *file, rpmSigTag *sigTagp, rpmuint8_t **pktp, rpmuint32_t *pktlenp, const char *passPhrase)
 Generate GPG signature(s) for a header+payload file. More...
 
static int makeHDRSignature (Header sigh, const char *file, rpmSigTag sigTag, const char *passPhrase)
 Generate header only signature(s) from a header+payload file. More...
 
int rpmAddSignature (Header sigh, const char *file, rpmSigTag sigTag, const char *passPhrase)
 Generate signature(s) from a header+payload file, save in signature header. More...
 
int rpmCheckPassPhrase (const char *passPhrase)
 Check for valid pass phrase by invoking a helper. More...
 
static const char * rpmSigString (rpmRC res)
 
 if (sig==NULL||dig==NULL||dig->nbytes==0)
 
memcpy & size (size)
 
 if (size!=(rpmuint32_t) dig->nbytes)
 
 sprintf (t," (%u)",(unsigned) dig->nbytes)
 
 assert (dig!=NULL)
 
 assert (md5ctx!=NULL)
 
 assert (sig!=NULL)
 
void rpmswEnter (op, 0) { rpmop op = (rpmop)pgpStatsAccumulator(dig, 10)
 
void rpmDigestFinal (rpmDigestDup(md5ctx),&md5sum,&md5len, 0)
 
void rpmswExit (op, 0)
 
 if (op!=NULL)
 
void pgpHexCvt (t, md5sum, md5len)
 
 assert (shactx!=NULL)
 
void rpmDigestFinal (rpmDigestDup(shactx),&SHA1, NULL, 1)
 
 if (SHA1==NULL||strlen(SHA1)!=strlen((char *) sig)||strcmp(SHA1,(char *) sig))
 
 fprintf (stderr,"--> %s(%p,%p,%p) sig %p sigp %p\n", __FUNCTION__, dig, t, rsactx, sig, sigp)
 
 assert (rsactx!=NULL)
 
 assert (sigp!=NULL)
 
 assert (sigp->pubkey_algo==(rpmuint8_t) PGPPUBKEYALGO_RSA)
 
 assert (pgpGetSigtag(dig)==RPMSIGTAG_RSA)
 
 switch (sigp->version)
 
 if (strcmp(hashname,"UNKNOWN"))
 
 if (sigp->version==(rpmuint8_t) 4)
 
void rpmswExit (op, sigp->hashlen)
 
exit rpmSigString (res))
 
 if (sigp!=NULL)
 
 fprintf (stderr,"--> %s(%p,%p,%p) sig %p sigp %p\n", __FUNCTION__, dig, t, dsactx, sig, sigp)
 
 assert (dsactx!=NULL)
 
 if (strcmp(hashname,"UNKNOWN")&&strcmp(hashname,"SHA1"))
 
 fprintf (stderr,"<-- %s(%p,%p,%p) res %d %s\n", __FUNCTION__, dig, t, dsactx, res, t)
 
rpmRC rpmVerifySignature (void *_dig, char *result)
 Verify a signature from a package. More...
 

Variables

static rpmRC
 Verify header immutable region SHA-1 digest. More...
 
rpmuint32_t size = 0xffffffff
 
t = '\0'
 
 else
 
exit __pad0__
 
rpmuint32_t siglen = pgpGetSiglen(dig)
 
rpmuint8_tmd5sum = NULL
 
size_t md5len = 0
 
exit __pad1__
 
const char * SHA1 = NULL
 
exit __pad2__
 
pgpDigParams sigp = pgpGetSignature(dig)
 
int xx = rpmDigestUpdate(ctx, sigp->hash, sigp->hashlen)
 
DIGEST_CTX ctx = rpmDigestDup(rsactx)
 
goto exit
 
exit __pad3__
 
exit __pad4__
 
Class: Rpmts
rpmRC res = RPMRC_OK
 

Macro Definition Documentation

#define _RPMPGP_INTERNAL

Definition at line 10 of file signature.c.

Function Documentation

assert ( dig!  = NULL)
assert ( md5ctx!  = NULL)
assert ( sig!  = NULL)
assert ( shactx!  = NULL)
assert ( rsactx!  = NULL)
assert ( sigp!  = NULL)
assert ( sigp->  pubkey_algo = =(rpmuint8_tPGPPUBKEYALGO_RSA)
assert ( pgpGetSigtag(dig = =RPMSIGTAG_RSA)
assert ( dsactx!  = NULL)
fprintf ( stderr  ,
"--> %s(%p,%p,%p) sig %p sigp %p\n ,
__FUNCTION__  ,
dig  ,
t  ,
rsactx  ,
sig  ,
sigp   
)

Referenced by _rpmsqlDebugDump(), _rpmtsCheck(), _rpmtsRun(), Access(), argerror(), argvPrint(), arHeaderRead(), arHeaderWrite(), arRead(), arTrailerWrite(), arWrite(), cacheStashLatest(), cacheWalkPathFilter(), Chdir(), checkResponse(), Chflags(), Chmod(), Chown(), Chroot(), cpioHeaderRead(), cpioHeaderWrite(), cpioRead(), cpioTrailerWrite(), cpioWrite(), db3associate(), db3associate_foreign(), dbg_keyval(), dbg_scp(), dbiMireKeys(), dbiOpen(), dbiTagsInit(), doUntar(), escapedChar(), Fadvise(), Fallocate(), Fchflags(), Fchmod(), Fchown(), fdFgets(), fdFini(), Fdopen(), fdstat_print(), fdWritable(), Fopen(), for(), formatValue(), fsmSetup(), fsmTeardown(), Fstat(), ftpCommand(), ftpLstat(), ftpOpendir(), ftpReadlink(), ftpReq(), ftpStat(), Fts_children(), Fts_close(), Fts_open(), Fts_read(), Fts_set(), ftsCachePrint(), Glob(), Globfree(), headerCheck(), headerGet(), headerMap(), headerReload(), headerScrub(), headerSprintf(), httpReq(), httpResp(), if(), Init_rpmds(), Init_rpmfi(), Init_rpmhdr(), Init_rpmmc(), Init_rpmmi(), Init_rpmps(), Init_rpmte(), Init_rpmts(), iosmSetup(), iosmTeardown(), Lchflags(), Lchmod(), Lchown(), Link(), Lseek(), Lstat(), Lutimes(), main(), makeGPGSignature(), mireClean(), mireRegcomp(), mireRegexec(), mireSetLocale(), Mkdir(), Mkfifo(), Mknod(), mtree_error(), Open(), parseExpression(), parseFormat(), pgpMpiSet(), pgpPrtComment(), pgpPrtHex(), pgpPrtInt(), pgpPrtKey(), pgpPrtNL(), pgpPrtPubkeyParams(), pgpPrtSeckeyParams(), pgpPrtSig(), pgpPrtSigParams(), pgpPrtStr(), pgpPrtSubType(), pgpPrtUserID(), pgpPrtVal(), printHash(), printVersion(), rdLead(), rdSignature(), Readlink(), Realpath(), Rename(), Rmdir(), rpmcliAllArgCallback(), rpmdbAdd(), rpmdbClose(), rpmdbe_event_notify(), rpmdbMireApply(), rpmdbNew(), rpmdcArgCallback(), rpmdcCalcFile(), rpmdcCWalk(), rpmdcFiniFile(), rpmdcInitFile(), rpmdcParseCoreutils(), rpmdcParseZeroInstall(), rpmdcPrintFile(), rpmdepPrint(), rpmDisplayQueryTags(), rpmds_alloc(), rpmds_BT_get(), rpmds_BT_set(), rpmds_Color_get(), rpmds_Color_set(), rpmds_Count_get(), rpmds_debug_get(), rpmds_debug_set(), rpmds_DNEVR_get(), rpmds_EVR_get(), rpmds_Flags_get(), rpmds_free(), rpmds_init(), rpmds_Ix_get(), rpmds_Ix_set(), rpmds_N_get(), rpmds_new(), rpmds_NoPromote_get(), rpmds_NoPromote_set(), rpmds_Type_get(), rpmdsELF(), rpmdsLdconfig(), rpmdsMergePRCO(), rpmdsNew(), rpmdsNext(), rpmdsPipe(), rpmdsPrint(), rpmdsPrintResults(), rpmdsSysinfoFile(), rpmDumpMacroTable(), rpmfcMergePR(), rpmfcPrint(), rpmfi_alloc(), rpmfi_BN_get(), rpmfi_DC_get(), rpmfi_debug_get(), rpmfi_debug_set(), rpmfi_DN_get(), rpmfi_DX_get(), rpmfi_DX_set(), rpmfi_FC_get(), rpmfi_FClass_get(), rpmfi_FColor_get(), rpmfi_FDigest_get(), rpmfi_FFlags_get(), rpmfi_FGroup_get(), rpmfi_FLink_get(), rpmfi_FMode_get(), rpmfi_FMtime_get(), rpmfi_FN_get(), rpmfi_FRdev_get(), rpmfi_free(), rpmfi_FSize_get(), rpmfi_FState_get(), rpmfi_FUser_get(), rpmfi_FX_get(), rpmfi_FX_set(), rpmfi_init(), rpmfi_new(), rpmfi_VFlags_get(), rpmfiNew(), rpmfiNext(), rpmfiNextD(), rpmfiOpendir(), rpmfiStat(), rpmfts_debug(), rpmfts_print(), rpmGenPath(), rpmgiInitFilter(), rpmgiNext(), rpmGlob(), rpmhdr__get(), rpmhdr_debug_get(), rpmhdr_debug_set(), rpmhdr_ds(), rpmhdr_fi(), rpmhdr_free(), rpmhdr_getorigin(), rpmhdr_new(), rpmhdr_setorigin(), rpmhdr_sprintf(), rpmhdrLoadTag(), rpmhookArgsParse(), rpmInstallSource(), rpmioAccess(), rpmioAllArgCallback(), rpmiobAppend(), rpmiobBuf(), rpmiobEmpty(), rpmiobFini(), rpmiobLen(), rpmiobNew(), rpmiobRTrim(), rpmiobStr(), rpmioFreePoolItem(), rpmioInit(), rpmioLinkPoolItem(), rpmioUnlinkPoolItem(), rpmlogPrint(), rpmmc_add(), rpmmc_alloc(), rpmmc_debug_get(), rpmmc_debug_set(), rpmmc_del(), rpmmc_expand(), rpmmc_list(), rpmmc_wrap(), rpmmgBuffer(), rpmmgFile(), rpmmi_debug_get(), rpmmi_free(), rpmmi_new(), rpmmiAddPattern(), rpmmiBNTag(), rpmmiCount(), rpmmiGet(), rpmmiGrow(), rpmmiGrowBasename(), rpmmiInit(), rpmmiInstance(), rpmmiNext(), rpmmiPrune(), rpmmiSort(), rpmnsProbeSignature(), rpmperlRun(), rpmps_alloc(), rpmps_debug_get(), rpmps_debug_set(), rpmps_free(), rpmps_getattro(), rpmps_init(), rpmps_length_get(), rpmps_new(), rpmps_print(), rpmps_push(), rpmps_setattro(), rpmpsPrint(), rpmpythonNew(), rpmpythonRun(), rpmpythonRunFile(), rpmrbLoadFile(), rpmReadHeader(), rpmrepoDoPkgMetadata(), rpmrepoError(), rpmrepoProgress(), rpmrepoReadHeader(), rpmReSign(), rpmrubyRun(), rpmShowProgress(), rpmShowRC(), rpmsqFork(), rpmsqInsert(), rpmsqlRun(), rpmsqRemove(), rpmsquirrelRun(), rpmsquirrelRunFile(), rpmsqWait(), rpmsqWaitUnregister(), rpmswPrint(), rpmsxEnabled(), rpmsxExec(), rpmsxGetfilecon(), rpmsxLgetfilecon(), rpmsxLsetfilecon(), rpmsxMatch(), rpmsxSetfilecon(), rpmtclRun(), rpmtclRunFile(), rpmte_alloc(), rpmte_debug_get(), rpmte_debug_set(), rpmte_free(), rpmteChain(), rpmts_alloc(), rpmts_dealloc(), rpmts_debug_get(), rpmts_debug_set(), rpmts_free(), rpmts_new(), rpmts_rootdir_get(), rpmts_rootdir_set(), rpmts_vsflags_get(), rpmts_vsflags_set(), rpmtsCallback(), rpmtsFindPubkey(), rpmtsLoadNVRA(), rpmtsOpenSDB(), rpmtsPrintStat(), rpmtsSolve(), rpmVerifySignature(), rpmWriteHeader(), rpmxarNew(), rpmxarNext(), rpmxarPath(), rpmxarPull(), rpmxarPush(), rpmxarStat(), rpmxarSwapBuf(), sql_step(), Stat(), strdup_iconv_check(), switch(), Symlink(), tarHeaderRead(), tarHeaderReadName(), tarHeaderWrite(), tarHeaderWriteBlock(), tarHeaderWriteName(), tarRead(), tarTrailerWrite(), tarWrite(), tcpConnect(), ufdOpen(), ufdRead(), ufdWrite(), Unlink(), urlFind(), urlFini(), urlFreeCache(), urlGetFile(), Utime(), Utimes(), vmefail(), while(), wrLead(), wrSignature(), and xarRead().

fprintf ( stderr  ,
"--> %s(%p,%p,%p) sig %p sigp %p\n ,
__FUNCTION__  ,
dig  ,
t  ,
dsactx  ,
sig  ,
sigp   
)
fprintf ( stderr  )
if ( sig  = NULL || dig == NULL || dig->nbytes == 0)

Definition at line 590 of file signature.c.

References exit, RPMRC_NOKEY, rpmSigString(), and stpcpy().

if ( size!  = (rpmuint32_tdig->nbytes)

Definition at line 598 of file signature.c.

References RPMRC_FAIL, rpmSigString(), sprintf(), and stpcpy().

if ( op!  = NULL)

Definition at line 643 of file signature.c.

if ( SHA1  = NULL || strlen(SHA1) != strlen((char *)sig) || strcmp(SHA1, (char *)sig))

Definition at line 709 of file signature.c.

References RPMRC_FAIL, rpmSigString(), and stpcpy().

if ( strcmp(hashname,"UNKNOWN")  )

Definition at line 777 of file signature.c.

References stpcpy().

if ( sigp->  version = = (rpmuint8_t) 4)

Definition at line 791 of file signature.c.

References rpmDigestUpdate().

if ( sigp!  = NULL)

Definition at line 826 of file signature.c.

References pgpHexCvt(), stpcpy(), and void.

if ( strcmp(hashname,"UNKNOWN")&&strcmp(hashname,"SHA1")  )

Definition at line 879 of file signature.c.

References stpcpy().

static int makeGPGSignature ( const char *  file,
rpmSigTag sigTagp,
rpmuint8_t **  pktp,
rpmuint32_t pktlenp,
const char *  passPhrase 
)
static

Generate GPG signature(s) for a header+payload file.

Parameters
fileheader+payload file name
Return values
*sigTagpsignature tag
*pktpsignature packet(s)
*pktlenpsignature packet(s) length
Parameters
passPhraseprivate key pass phrase
Returns
0 on success, 1 on failure

Definition at line 148 of file signature.c.

References _, _free(), addMacro(), alloca(), assert(), av, D_, delMacro(), dig, environ, errno, EXIT_FAILURE, Fclose(), fd, Ferror(), Fopen(), fprintf(), Fread(), int, memset(), NULL, pgpDigFree(), pgpDigNew(), pgpGetSignature(), pgpPrtPkts(), PGPPUBKEYALGO_DSA, PGPPUBKEYALGO_RSA, pid, rc, rpmExpand(), rpmkuPassPhrase(), rpmlog(), RPMLOG_DEBUG, RPMLOG_ERR, RPMSIGTAG_DSA, RPMSIGTAG_MD5, RPMSIGTAG_RSA, RPMSIGTAG_SHA1, RPMSIGTAG_SIZE, RPMVSF_DEFAULT, setenv(), sigp, Stat(), status, stpcpy(), Unlink(), unsetenv(), unsigned, void, and xmalloc.

Referenced by makeHDRSignature().

static int makeHDRSignature ( Header  sigh,
const char *  file,
rpmSigTag  sigTag,
const char *  passPhrase 
)
static

Generate header only signature(s) from a header+payload file.

Parameters
sighsignature header
fileheader+payload file name
sigTagtype of signature(s) to add
passPhraseprivate key pass phrase
Returns
0 on success, -1 on failure

Definition at line 299 of file signature.c.

References _free(), alloca(), assert(), _HE_s::c, ctx, exit, Fclose(), fd, Ferror(), fn, Fopen(), h, headerFree, headerGet(), headerGetMagic(), headerIsEntry(), headerPut(), makeGPGSignature(), memset(), msg, NULL, _HE_s::p, PGPHASHALGO_SHA1, pkt, pktlen, rpmDataType_u::ptr, rc, ret, RPM_BIN_TYPE, RPM_STRING_TYPE, RPMDIGEST_NONE, rpmDigestFinal(), rpmDigestInit(), rpmDigestUpdate(), rpmlog(), RPMLOG_ERR, rpmpkgRead(), rpmpkgWrite(), RPMRC_OK, RPMSIGTAG_DSA, RPMSIGTAG_GPG, RPMSIGTAG_MD5, RPMSIGTAG_PGP, RPMSIGTAG_PGP5, RPMSIGTAG_SHA1, RPMSIGTAG_SIZE, RPMTAG_HEADERIMMUTABLE, rpmTempFile(), SHA1, rpmDataType_u::str, _HE_s::t, _HE_s::tag, Unlink(), void, and xx.

Referenced by rpmAddSignature().

void pgpHexCvt ( t  ,
md5sum  ,
md5len   
)

Referenced by if(), pgpHexStr(), pgpMpiHex(), and pgpMpiStr().

int rpmCheckPassPhrase ( const char *  passPhrase)

Check for valid pass phrase by invoking a helper.

Parameters
passPhrasepass phrase
Returns
0 on valid, 1 on invalid

Definition at line 489 of file signature.c.

References _, _free(), av, environ, errno, fdno, int, memset(), NULL, p, pid, rc, rpmExpand(), rpmIsVerbose, rpmkuPassPhrase(), rpmlog(), RPMLOG_ERR, setenv(), status, unsetenv(), void, and xx.

Referenced by main().

void rpmDigestFinal ( rpmDigestDup(md5ctx)  ,
md5sum,
md5len,
 
)
void rpmDigestFinal ( rpmDigestDup(shactx)  ,
SHA1,
NULL  ,
 
)
static const char* rpmSigString ( rpmRC  res)
static

Definition at line 564 of file signature.c.

References RPMRC_FAIL, RPMRC_NOKEY, RPMRC_NOTFOUND, RPMRC_NOTTRUSTED, and RPMRC_OK.

Referenced by if().

exit rpmSigString ( res  )
void rpmswEnter ( op  ,
 
) { rpmop op = (rpmop)pgpStatsAccumulator(dig, 10)
void rpmswExit ( op  ,
 
)
void rpmswExit ( op  ,
sigp->  hashlen 
)
int rpmTempFile ( const char *  prefix,
const char **  fnptr,
void fdptr 
)

Return file handle for a temporaray file.

A unique temporaray file path will be generated using rpmGenPath(prefix, "%{_tmppath}/", "rpm-tmp.XXXXX") where "XXXXXX" is filled in using rand(3). The file is opened, and the link count and (dev,ino) location are verified after opening. The file name and the open file handle are returned.

Parameters
prefixleading part of temp file path
Return values
*fnptrtemp file name (or NULL)
*fdptrtemp file handle
Returns
0 on success

Definition at line 30 of file signature.c.

References _, _free(), errno, errxit, Fclose(), fd, Ferror(), Fileno(), Fopen(), NULL, rpmGenPath(), rpmioMkpath(), rpmlog(), RPMLOG_ERR, S_ISLNK, sprintf(), unsigned, URL_IS_DASH, URL_IS_FTP, URL_IS_HKP, URL_IS_HTTP, URL_IS_HTTPS, URL_IS_MONGO, URL_IS_PATH, URL_IS_UNKNOWN, urlPath(), and void.

Referenced by makeHDRSignature(), manageFile(), runScript(), and writeRPM().

memcpy& size ( size  )
sprintf ( t  ,
" (%u)"  ,
(unsigned) dig->  nbytes 
)
switch ( sigp->  version)

Definition at line 769 of file signature.c.

Variable Documentation

exit __pad0__

Definition at line 609 of file signature.c.

exit __pad1__

Definition at line 663 of file signature.c.

exit __pad2__

Definition at line 728 of file signature.c.

exit __pad3__

Definition at line 825 of file signature.c.

exit __pad4__

Definition at line 927 of file signature.c.

DIGEST_CTX ctx = rpmDigestDup(rsactx)
else
Initial value:
{
rpmRC res
Definition: signature.c:584

Definition at line 602 of file signature.c.

goto exit

Definition at line 813 of file signature.c.

size_t md5len = 0

Definition at line 621 of file signature.c.

rpmuint8_t* md5sum = NULL

Definition at line 620 of file signature.c.

rpmRC
static
Initial value:
{
const void * sig = pgpGetSig(dig)
const void * pgpGetSig(pgpDig dig)
Get signature tag data, i.e.
Definition: rpmpgp.c:1246
pgpDig dig
Definition: rpmts-py.c:979

Verify header immutable region SHA-1 digest.

Verify DSA signature.

Verify RSA signature.

Parameters
digcontainer
Return values
tverbose success/failure text
Parameters
shactxSHA-1 digest context
Returns
RPMRC_OK on success
Parameters
digcontainer
Return values
tverbose success/failure text
Parameters
rsactxRSA digest context
Returns
RPMRC_OK on success
Parameters
digcontainer
Return values
tverbose success/failure text
Parameters
dsactxDSA digest context
Returns
RPMRC_OK on success

Definition at line 582 of file signature.c.

const char* SHA1 = NULL

Definition at line 684 of file signature.c.

Referenced by makeHDRSignature(), rpmcliImportPubkey(), and writeRPM().

Definition at line 618 of file signature.c.

Referenced by headerCheck(), and pgpSetSig().

rpmuint32_t size = 0xffffffff
t = '\0'

Definition at line 587 of file signature.c.

xx = rpmDigestUpdate(ctx, sigp->hash, sigp->hashlen)

Definition at line 750 of file signature.c.