RPM Community Forums

Mailing List Message of <rpm-cvs>

[CVS] RPM: rpm/ CHANGES rpm/rpmdb/ pkgio.c signature.c rpm/rpmio/ Make...

From: Jeff Johnson <jbj@rpm5.org>
Date: Tue 05 Aug 2008 - 23:10:30 CEST
Message-Id: <20080805211030.86AB66AAA@rpm5.org>
  RPM Package Manager, CVS Repository
  http://rpm5.org/cvs/
  ____________________________________________________________________________

  Server: rpm5.org                         Name:   Jeff Johnson
  Root:   /v/rpm/cvs                       Email:  jbj@rpm5.org
  Module: rpm                              Date:   05-Aug-2008 23:10:30
  Branch: HEAD                             Handle: 2008080521102901

  Added files:
    rpm/rpmio               rpmku.c rpmku.h
  Modified files:
    rpm                     CHANGES
    rpm/rpmdb               pkgio.c signature.c
    rpm/rpmio               Makefile.am librpmio.vers rpmiotypes.h
  Removed files:
    rpm/rpmio               getpass.c

  Log:
    - jbj: rpmku: create opaque keyutils keyring.

  Summary:
    Revision    Changes     Path
    1.2512      +1  -0      rpm/CHANGES
    1.89        +26 -50     rpm/rpmdb/pkgio.c
    1.54        +20 -51     rpm/rpmdb/signature.c
    1.191       +3  -3      rpm/rpmio/Makefile.am
    1.14        +0  -259    rpm/rpmio/getpass.c
    2.75        +4  -1      rpm/rpmio/librpmio.vers
    1.10        +0  -6      rpm/rpmio/rpmiotypes.h
    2.1         +233 -0     rpm/rpmio/rpmku.c
    2.1         +49 -0      rpm/rpmio/rpmku.h
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/CHANGES
  ============================================================================
  $ cvs diff -u -r1.2511 -r1.2512 CHANGES
  --- rpm/CHANGES	5 Aug 2008 17:18:06 -0000	1.2511
  +++ rpm/CHANGES	5 Aug 2008 21:10:29 -0000	1.2512
  @@ -1,5 +1,6 @@
   
   5.1.0 -> 5.2a0:
  +    - jbj: rpmku: create opaque keyutils keyring.
       - jbj: keyutils: permit configurable keyring.
       - rse: fix building under --with-lzma by providing the necessary 64-bit defines for inclusion of <lzma.h>
       - jbj: QNX: use strtouq() instead of strtoul() in rpmmtree.
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/pkgio.c
  ============================================================================
  $ cvs diff -u -r1.88 -r1.89 pkgio.c
  --- rpm/rpmdb/pkgio.c	5 Aug 2008 17:18:07 -0000	1.88
  +++ rpm/rpmdb/pkgio.c	5 Aug 2008 21:10:29 -0000	1.89
  @@ -11,14 +11,13 @@
   
   #include <netinet/in.h>
   
  -#if defined(HAVE_KEYUTILS_H)
  -#include <keyutils.h>
  -#endif
  -
  +#define	_RPMIOB_INTERNAL
  +#include <rpmiotypes.h>
   #include <rpmio_internal.h>
   #include <rpmcb.h>
   #include <rpmbc.h>		/* XXX beecrypt base64 */
   #include <rpmmacro.h>
  +#include <rpmku.h>
   
   #define	_RPMTAG_INTERNAL
   #include "header_internal.h"
  @@ -162,9 +161,8 @@
       pgpDigParams pubp = pgpGetPubkey(dig);
       rpmRC res = RPMRC_NOKEY;
       const char * pubkeysource = NULL;
  -#if defined(HAVE_KEYUTILS_H)
  +    rpmiob iob = NULL;
       int krcache = 1;	/* XXX assume pubkeys are cached in keyutils keyring. */
  -#endif
       int xx;
   
   assert(dig != NULL);
  @@ -188,38 +186,23 @@
   	memset(ts->pksignid, 0, sizeof(ts->pksignid));
       }
   
  -#if defined(HAVE_KEYUTILS_H)
  -	/* Try keyutils keyring lookup. */
  -    if (krcache && ts->pkpkt == NULL) {
  -	key_serial_t keyring = (key_serial_t) _kuKeyring;
  -	const char * krprefix = "rpm:gpg:pubkey:";
  -	char krfp[32];
  -	char * krn = alloca(strlen(krprefix) + sizeof("12345678"));
  -	long key;
  -
  -	(void) snprintf(krfp, sizeof(krfp), "%08X", pgpGrab(sigp->signid+4, 4));
  -	krfp[sizeof(krfp)-1] = '\0';
  -	*krn = '\0';
  -	(void) stpcpy( stpcpy(krn, krprefix), krfp);
  -
  -/*@-moduncon@*/
  -	key = keyctl_search(keyring, "user", krn, 0);
  -	xx = keyctl_read(key, NULL, 0);
  -	if (xx > 0) {
  -	    ts->pkpktlen = xx;
  -	    ts->pkpkt = NULL;
  -	    xx = keyctl_read_alloc(key, (void **)&ts->pkpkt);
  -	    if (xx > 0) {
  -		pubkeysource = xstrdup(krn);
  -		krcache = 0;	/* XXX don't bother caching. */
  -	    } else {
  -		ts->pkpkt = _free(ts->pkpkt);
  -		ts->pkpktlen = 0;
  -	    }
  +    /* Try keyutils keyring lookup. */
  +    if (ts->pkpkt == NULL) {
  +	iob = NULL;
  +	switch (rpmkuFindPubkey(sigp, &iob)) {
  +	case RPMRC_NOTFOUND:
  +	case RPMRC_FAIL:
  +	case RPMRC_NOTTRUSTED:
  +	case RPMRC_NOKEY:
  +	    break;
  +	case RPMRC_OK:
  +	    pubkeysource = xstrdup("keyutils");
  +	    krcache = 0;	/* XXX don't bother caching. */
  +	    ts->pkpkt = memcpy(xmalloc(iob->blen), iob->b, iob->blen);
  +	    ts->pkpktlen = iob->blen;
  +	    break;
   	}
  -/*@=moduncon@*/
       }
  -#endif
   
       /* Try rpmdb keyring lookup. */
       if (ts->pkpkt == NULL) {
  @@ -323,23 +306,16 @@
   
   	/* XXX Verify any pubkey signatures. */
   
  -#if defined(HAVE_KEYUTILS_H)
   	/* Save the pubkey in the keyutils keyring. */
   	if (krcache) {
  -	    key_serial_t keyring = (key_serial_t) _kuKeyring;
  -	    const char * krprefix = "rpm:gpg:pubkey:";
  -	    char krfp[32];
  -	    char * krn = alloca(strlen(krprefix) + sizeof("12345678"));
  -
  -	    (void) snprintf(krfp, sizeof(krfp), "%08X", pgpGrab(sigp->signid+4, 4));
  -	    krfp[sizeof(krfp)-1] = '\0';
  -	    *krn = '\0';
  -	    (void) stpcpy( stpcpy(krn, krprefix), krfp);
  -/*@-moduncon -noeffectuncon @*/
  -	    (void) add_key("user", krn, ts->pkpkt, ts->pkpktlen, keyring);
  -/*@=moduncon =noeffectuncon @*/
  +	    if (iob == NULL) {
  +		iob = xcalloc(1, sizeof(*iob));
  +		iob->b = memcpy(xmalloc(ts->pkpktlen), ts->pkpkt, ts->pkpktlen);
  +		iob->blen = ts->pkpktlen;
  +		iob->allocated = ts->pkpktlen;
  +	    }
  +	    (void) rpmkuStorePubkey(sigp, iob);
   	}
  -#endif
   
   	/* Pubkey packet looks good, save the signer id. */
   	memcpy(ts->pksignid, pubp->signid, sizeof(ts->pksignid));
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/signature.c
  ============================================================================
  $ cvs diff -u -r1.53 -r1.54 signature.c
  --- rpm/rpmdb/signature.c	5 Aug 2008 17:18:07 -0000	1.53
  +++ rpm/rpmdb/signature.c	5 Aug 2008 21:10:29 -0000	1.54
  @@ -3,22 +3,21 @@
    */
   
   #include "system.h"
  -#if defined(HAVE_KEYUTILS_H)
  -#include <keyutils.h>
  -#endif
   
   #include <rpmio.h>
   #include <rpmurl.h>
   #include <rpmcb.h>	/* XXX rpmIsVerbose() */
   #define	_RPMPGP_INTERNAL
   #include <rpmpgp.h>
  -#include <rpmtag.h>
   #include <rpmmacro.h>	/* XXX for rpmGetPath() */
  -#include "rpmdb.h"
  +#include <rpmku.h>
   
  +#include <rpmtag.h>
  +#include "rpmdb.h"
  +#include <pkgio.h>	/* XXX expects <rpmts.h> */
   #include "legacy.h"	/* XXX for dodogest() */
  -#include <pkgio.h>
   #include "signature.h"
  +
   #include "debug.h"
   
   /*@access FD_t@*/		/* XXX ufdio->read arg1 is void ptr */
  @@ -196,24 +195,12 @@
       delMacro(NULL, "__plaintext_filename");
       delMacro(NULL, "__signature_filename");
   
  -#if defined(HAVE_KEYUTILS_H)
  -    if (passPhrase && !strcmp(passPhrase, "@u user rpm:passwd")) {
  -	key_serial_t keyring = (key_serial_t) _kuKeyring;
  -	long key;
  -	int xx;
  -
  -/*@-moduncon@*/
  -	key = keyctl_search(keyring, "user", "rpm:passwd", 0);
  -	pw = NULL;
  -	if ((xx = keyctl_read_alloc(key, (void **)&pw)) < 0) {
  -	    rpmlog(RPMLOG_ERR, _("Failed %s(%d) key(0x%lx): %s\n"),
  -			"keyctl_read_alloc of key", xx, key, strerror(errno));
  -	    return 1;
  -	}
  -/*@=moduncon@*/
  -    } else
  -#endif
  -	pw = passPhrase;
  +    pw = rpmkuPassPhrase(passPhrase);
  +    if (pw == NULL) {
  +	rpmlog(RPMLOG_ERR, _("Failed rpmkuPassPhrase(passPhrase): %s\n"),
  +			strerror(errno));
  +	return 1;
  +    }
   
       fpipe = fdopen(inpipe[1], "w");
       (void) close(inpipe[0]);
  @@ -221,14 +208,11 @@
   	fprintf(fpipe, "%s\n", (pw ? pw : ""));
   	(void) fclose(fpipe);
       }
  -/*@-mods@*/
  -    if (pw && pw != passPhrase) {
  +
  +    if (pw != NULL) {
   	(void) memset((void *)pw, 0, strlen(pw));
  -/*@-temptrans@*/	/* XXX mixed use in variable */
   	pw = _free(pw);
  -/*@=temptrans@*/
       }
  -/*@=mods@*/
   
       (void) waitpid(pid, &status, 0);
       if (!WIFEXITED(status) || WEXITSTATUS(status)) {
  @@ -540,37 +524,22 @@
   	}
       }
   
  -#if defined(HAVE_KEYUTILS_H)
  -    if (!strcmp(passPhrase, "@u user rpm:passwd")) {
  -	long key;
  -	key_serial_t keyring = (key_serial_t) _kuKeyring;
  -
  -/*@-moduncon@*/
  -	key = keyctl_search(keyring, "user", "rpm:passwd", 0);
  -	pw = NULL;
  -	if ((xx = keyctl_read_alloc(key, (void **)&pw)) < 0) {
  -	    rpmlog(RPMLOG_ERR, _("Failed %s(%d) key(0x%lx): %s\n"),
  -			"keyctl_read_alloc of key", xx, key, strerror(errno));
  -	    return 1;
  -	}
  -/*@=moduncon@*/
  -    } else
  -#endif
  -	pw = passPhrase;
  +    pw = rpmkuPassPhrase(passPhrase);
  +    if (pw == NULL) {
  +	rpmlog(RPMLOG_ERR, _("Failed rpmkuPassPhrase(passPhrase): %s\n"),
  +			strerror(errno));
  +	return 1;
  +    }
   
       xx = close(p[0]);
       xx = (int) write(p[1], pw, strlen(pw));
       xx = (int) write(p[1], "\n", 1);
       xx = close(p[1]);
   
  -/*@-mods@*/
  -    if (pw && pw != passPhrase) {
  +    if (pw != NULL) {
   	(void) memset((void *)pw, 0, strlen(pw));
  -/*@-temptrans@*/	/* XXX mixed use in variable */
   	pw = _free(pw);
  -/*@=temptrans@*/
       }
  -/*@=mods@*/
   
       (void) waitpid(pid, &status, 0);
   
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmio/Makefile.am
  ============================================================================
  $ cvs diff -u -r1.190 -r1.191 Makefile.am
  --- rpm/rpmio/Makefile.am	5 Aug 2008 12:57:07 -0000	1.190
  +++ rpm/rpmio/Makefile.am	5 Aug 2008 21:10:30 -0000	1.191
  @@ -63,7 +63,7 @@
   	md2.h md4.h rmd128.h rmd160.h rmd256.h rmd320.h sha224.h \
   	salsa10.h salsa20.h tiger.h \
   	mire.h poptIO.h rpmbc.h rpmdav.h \
  -	rpmgc.h rpmhash.h rpmhook.h rpmio_internal.h rpmkeyring.h \
  +	rpmgc.h rpmhash.h rpmhook.h rpmio_internal.h rpmkeyring.h rpmku.h \
   	rpmlua.h rpmmg.h rpmnss.h rpmsq.h rpmssl.h \
   	rpmio-stub.h rpmsw.h rpmurl.h rpmuuid.h rpmxar.h \
   	tar.h ugid.h
  @@ -72,12 +72,12 @@
   usrlib_LTLIBRARIES = librpmio.la
   librpmio_la_SOURCES = \
   	ar.c argv.c bzdio.c cpio.c digest.c fnmatch.c fts.c \
  -	getdate.c getpass.c gzdio.c glob.c iosm.c lzdio.c \
  +	getdate.c gzdio.c glob.c iosm.c lzdio.c \
   	macro.c mire.c mount.c poptIO.c \
   	md2.c md4.c rmd128.c rmd160.c rmd256.c rmd320.c sha224.c \
   	salsa10.c salsa20.c tiger.c \
   	rpmbc.c rpmdav.c rpmgc.c rpmhash.c rpmhook.c rpmio.c rpmiob.c rpmio-stub.c \
  -	rpmkeyring.c rpmlog.c rpmlua.c rpmmalloc.c rpmmg.c rpmnss.c rpmpgp.c \
  +	rpmkeyring.c rpmku.c rpmlog.c rpmlua.c rpmmalloc.c rpmmg.c rpmnss.c rpmpgp.c \
   	rpmrpc.c rpmsq.c rpmssl.c rpmsw.c rpmuuid.c rpmxar.c \
   	strcasecmp.c strtolocale.c tar.c url.c ugid.c
   librpmio_la_LDFLAGS = -release $(LT_CURRENT).$(LT_REVISION)
  @@ .
  rm -f rpm/rpmio/getpass.c <<'@@ .'
  Index: rpm/rpmio/getpass.c
  ============================================================================
  [NO CHANGE SUMMARY BECAUSE FILE AS A WHOLE IS JUST REMOVED]
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmio/librpmio.vers
  ============================================================================
  $ cvs diff -u -r2.74 -r2.75 librpmio.vers
  --- rpm/rpmio/librpmio.vers	5 Aug 2008 17:18:07 -0000	2.74
  +++ rpm/rpmio/librpmio.vers	5 Aug 2008 21:10:30 -0000	2.75
  @@ -146,7 +146,6 @@
       iosmStrerror;
       iosmTeardown;
       isCompressed;
  -    _kuKeyring;
       Lchown;
       _Lchown;
       Link;
  @@ -313,6 +312,10 @@
       rpmKeyringLookup;
       rpmKeyringNew;
       rpmKeyringUnlink;
  +    _kuKeyring;
  +    rpmkuFindPubkey;
  +    rpmkuStorePubkey;
  +    rpmkuPassPhrase;
       rpmPubkeyFree;
       rpmPubkeyLink;
       rpmPubkeyNew;
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmio/rpmiotypes.h
  ============================================================================
  $ cvs diff -u -r1.9 -r1.10 rpmiotypes.h
  --- rpm/rpmio/rpmiotypes.h	5 Aug 2008 17:18:07 -0000	1.9
  +++ rpm/rpmio/rpmiotypes.h	5 Aug 2008 21:10:30 -0000	1.10
  @@ -201,12 +201,6 @@
   };
   #endif
   
  -/**
  - * Keyutils keyring to use.
  - */
  -/*@unchecked@*/
  -extern rpmint32_t _kuKeyring;
  -
   #ifdef __cplusplus
   extern "C" {
   #endif
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmio/rpmku.c
  ============================================================================
  $ cvs diff -u -r0 -r2.1 rpmku.c
  --- /dev/null	2008-08-05 23:00:24 +0200
  +++ rpmku.c	2008-08-05 23:10:30 +0200
  @@ -0,0 +1,233 @@
  +/** \ingroup rpmio
  + * \file rpmio/rpmku.c
  + */
  +
  +#include "system.h"
  +
  +#define	_RPMIOB_INTERNAL
  +#include <rpmiotypes.h>
  +#include <rpmio.h>
  +#if defined(HAVE_KEYUTILS_H)
  +#include <rpmmacro.h>
  +#include <argv.h>
  +#include <keyutils.h>
  +#define _RPMPGP_INTERNAL
  +#include <rpmpgp.h>
  +#endif
  +#include <rpmku.h>
  +
  +#include "debug.h"
  +
  +#if defined(HAVE_KEYUTILS_H)
  +/*@unchecked@*/
  +rpmint32_t _kuKeyring;
  +
  +/*@unchecked@*/
  +static int _kuCache = 1;
  +
  +typedef struct _kuItem_s {
  +/*@observer@*/
  +    const char *name;
  +    key_serial_t val;
  +} * _kuItem;
  +
  +/* NB: the following table must be sorted lexically for bsearch(3). */
  +/*@unchecked@*/ /*@observer@*/
  +static struct _kuItem_s kuTable[] = {
  +    { "group",		KEY_SPEC_GROUP_KEYRING },
  +    { "process",	KEY_SPEC_PROCESS_KEYRING },
  +    { "session",	KEY_SPEC_SESSION_KEYRING },
  +    { "thread",		KEY_SPEC_THREAD_KEYRING },
  +    { "user",		KEY_SPEC_USER_KEYRING },
  +    { "user_session",	KEY_SPEC_USER_SESSION_KEYRING },
  +#ifdef	NOTYET	/* XXX is this useful? */
  +  { "???",		KEY_SPEC_REQKEY_AUTH_KEY },
  +#endif
  +};
  +
  +/*@unchecked@*/
  +static size_t nkuTable = sizeof(kuTable) / sizeof(kuTable[0]);
  +
  +static int
  +kuCmp(const void * a, const void * b)
  +	/*@*/
  +{
  +    return strcmp(((_kuItem)a)->name, ((_kuItem)b)->name);
  +}
  +
  +static key_serial_t
  +kuValue(const char * name)
  +	/*@globals fileSystem @*/
  +	/*@modifies fileSystem @*/
  +{
  +    _kuItem k = NULL;
  +
  +    if (name != NULL && *name != '\0') {
  +	_kuItem tmp = memset(alloca(sizeof(*tmp)), 0, sizeof(*tmp));
  +	tmp->name = name;
  +	k = (_kuItem)bsearch(tmp, kuTable, nkuTable, sizeof(kuTable[0]), kuCmp);
  +    }
  +    return (k != NULL ? k->val :  0);
  +}
  +#endif
  +
  +char * _GetPass(const char * prompt)
  +{
  +    char * pw;
  +
  +/*@-unrecog@*/
  +    pw = getpass( prompt ? prompt : "" );
  +/*@=unrecog@*/
  +
  +#if defined(HAVE_KEYUTILS_H)
  +    if (_kuKeyring == 0) {
  +	const char * _keyutils_keyring
  +		= rpmExpand("%{?_keyutils_keyring}", NULL);
  +	_kuKeyring = kuValue(_keyutils_keyring);
  +	if (_kuKeyring == 0)
  +	    _kuKeyring = KEY_SPEC_PROCESS_KEYRING;
  +	_keyutils_keyring = _free(_keyutils_keyring);
  +    }
  +
  +    if (pw && *pw) {
  +	key_serial_t keyring = (key_serial_t) _kuKeyring;
  +	size_t npw = strlen(pw);
  +	(void) add_key("user", "rpm:passwd", pw, npw, keyring);
  +	(void) memset(pw, 0, npw);	/* burn the password */
  +	pw = "@u user rpm:passwd";
  +    }
  +#endif
  +
  +assert(pw != NULL);
  +/*@-observertrans -statictrans@*/
  +    return pw;
  +/*@=observertrans =statictrans@*/
  +}
  +
  +char * _RequestPass(/*@unused@*/ const char * prompt)
  +{
  +/*@only@*/ /*@relnull@*/
  +    static char * password = NULL;
  +#if defined(HAVE_KEYUTILS_H)
  +    const char * foo = "user rpm:yyyy spoon";
  +    ARGV_t av = NULL;
  +    int xx = argvSplit(&av, foo, NULL);
  +    key_serial_t dest = 0;
  +    key_serial_t key = 0;
  +
  +    if (password != NULL) {
  +	free(password);
  +	password = NULL;
  +    }
  +assert(av != NULL);
  +assert(av[0] != NULL);
  +assert(av[1] != NULL);
  +assert(av[2] != NULL);
  +    key = request_key(av[0], av[1], av[2], dest);
  +
  +/*@-nullstate@*/	/* XXX *password may be null. */
  +    xx = keyctl_read_alloc(key, (void *)&password);
  +/*@=nullstate@*/
  +assert(password != NULL);
  +#endif
  +
  +/*@-statictrans@*/
  +    return password;
  +/*@=statictrans@*/
  +}
  +
  +/*@-redecl@*/
  +char * (*Getpass) (const char * prompt) = _GetPass;
  +/*@=redecl@*/
  +
  +rpmRC rpmkuFindPubkey(pgpDigParams sigp, /*@out@*/ rpmiob * iobp)
  +{
  +    if (iobp != NULL)
  +	*iobp = NULL;
  +
  +#if defined(HAVE_KEYUTILS_H)
  +    if (_kuCache) {
  +/*@observer@*/
  +	static const char krprefix[] = "rpm:gpg:pubkey:";
  +	key_serial_t keyring = (key_serial_t) _kuKeyring;
  +	char krfp[32];
  +	char * krn = alloca(strlen(krprefix) + sizeof("12345678"));
  +	long key;
  +	int xx;
  +
  +	(void) snprintf(krfp, sizeof(krfp), "%08X", pgpGrab(sigp->signid+4, 4));
  +	krfp[sizeof(krfp)-1] = '\0';
  +	*krn = '\0';
  +	(void) stpcpy( stpcpy(krn, krprefix), krfp);
  +
  +	key = keyctl_search(keyring, "user", krn, 0);
  +	xx = keyctl_read(key, NULL, 0);
  +	if (xx > 0) {
  +	    rpmiob iob = xcalloc(1, sizeof(*iob));
  +	    iob->allocated = iob->blen = xx;
  +	    xx = keyctl_read_alloc(key, (void **)&iob->b);
  +	    if (xx > 0) {
  +#ifdef	NOTYET
  +		pubkeysource = xstrdup(krn);
  +		_kuCache = 0;	/* XXX don't bother caching. */
  +#endif
  +	    } else
  +		iob = rpmiobFree(iob);
  +
  +	    if (iob != NULL && iobp != NULL) {
  +		*iobp = iob;
  +		return RPMRC_OK;
  +	    } else
  +		return RPMRC_NOTFOUND;
  +	} else
  +	    return RPMRC_NOTFOUND;
  +    } else
  +#endif
  +    return RPMRC_NOTFOUND;
  +}
  +
  +rpmRC rpmkuStorePubkey(pgpDigParams sigp, /*@only@*/ rpmiob iob)
  +{
  +#if defined(HAVE_KEYUTILS_H)
  +    if (_kuCache) {
  +/*@observer@*/
  +	static const char krprefix[] = "rpm:gpg:pubkey:";
  +	key_serial_t keyring = (key_serial_t) _kuKeyring;
  +	char krfp[32];
  +	char * krn = alloca(strlen(krprefix) + sizeof("12345678"));
  +
  +	(void) snprintf(krfp, sizeof(krfp), "%08X", pgpGrab(sigp->signid+4, 4));
  +	krfp[sizeof(krfp)-1] = '\0';
  +	*krn = '\0';
  +	(void) stpcpy( stpcpy(krn, krprefix), krfp);
  +/*@-moduncon -noeffectuncon @*/
  +	(void) add_key("user", krn, iob->b, iob->blen, keyring);
  +/*@=moduncon =noeffectuncon @*/
  +    }
  +#endif
  +    iob = rpmiobFree(iob);
  +    return RPMRC_OK;
  +}
  +
  +const char * rpmkuPassPhrase(const char * passPhrase)
  +{
  +    const char * pw;
  +
  +#if defined(HAVE_KEYUTILS_H)
  +    if (passPhrase && !strcmp(passPhrase, "@u user rpm:passwd")) {
  +	key_serial_t keyring = (key_serial_t) _kuKeyring;
  +	long key;
  +	int xx;
  +
  +/*@-moduncon@*/
  +	key = keyctl_search(keyring, "user", "rpm:passwd", 0);
  +	pw = NULL;
  +	xx = keyctl_read_alloc(key, (void **)&pw);
  +/*@=moduncon@*/
  +	if (xx < 0)
  +	    pw = NULL;
  +    } else
  +#endif
  +	pw = xstrdup(passPhrase);
  +    return pw;
  +}
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmio/rpmku.h
  ============================================================================
  $ cvs diff -u -r0 -r2.1 rpmku.h
  --- /dev/null	2008-08-05 23:00:24 +0200
  +++ rpmku.h	2008-08-05 23:10:30 +0200
  @@ -0,0 +1,49 @@
  +#ifndef _H_RPMKU_
  +#define	_H_RPMKU_
  +
  +/** \ingroup rpmio
  + * \file rpmio/rpmku.h
  + */
  +
  +/**
  + * Keyutils keyring to use.
  + */
  +/*@unchecked@*/
  +extern rpmint32_t _kuKeyring;
  +
  +#ifdef __cplusplus
  +extern "C" {
  +#endif
  +
  +/**
  + * Lookup pubkey in keyutils keyring.
  + * @param sigp		signature packet
  + * @retval *iobp	pubkey I/O buffer
  + * @return		RPMRC_OK on success
  + */
  +rpmRC rpmkuFindPubkey(pgpDigParams sigp, /*@out@*/ rpmiob * iobp)
  +	/*@modifies *iobp @*/;
  +
  +/**
  + * Store pubkey in keyutils keyring.
  + * @param sigp		signature packet
  + * @param iob		pubkey I/O buffer
  + * @return		RPMRC_OK on success
  + */
  +rpmRC rpmkuStorePubkey(pgpDigParams sigp, /*@only@*/ rpmiob iob)
  +	/*@modifies iob @*/;
  +
  +/**
  + * Return pass phrase from keyutils keyring.
  + * @param passPhrase	pass phrase
  + * @return		(malloc'd) pass phrase
  + */
  +/*@null@*/
  +const char * rpmkuPassPhrase(const char * passPhrase)
  +	/*@modifies iob @*/;
  +
  +#ifdef __cplusplus
  +}
  +#endif
  +
  +#endif /* _H_RPMKU_ */
  @@ .
Received on Tue Aug 5 23:10:30 2008
Driven by Jeff Johnson and the RPM project team.
Hosted by OpenPKG and Ralf S. Engelschall.
Powered by FreeBSD and OpenPKG.