The basics of rpmku have congealed and verify/sign seems functional.

I'm almost certain to break everything pretty soon with keyring
integration. I'll try to wire up a reliable "make check" to catch
regressions before that happens.

73 de Jeff

On Aug 5, 2008, at 5:10 PM, Jeff Johnson wrote:

  RPM Package Manager, CVS Repository
  http://rpm5.org/cvs/
______________________________________________________________________ ______

  Server: rpm5.org                         Name:   Jeff Johnson
  Root:   /v/rpm/cvs                       Email:  [EMAIL PROTECTED]
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);
  -
  -/[EMAIL PROTECTED]@*/
  -     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;
        }
  -/[EMAIL PROTECTED]@*/
       }
  -#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);
  -/[EMAIL PROTECTED] -noeffectuncon @*/
  -         (void) add_key("user", krn, ts->pkpkt, ts->pkpktlen, keyring);
  -/[EMAIL PROTECTED] =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"

   /[EMAIL PROTECTED] [EMAIL PROTECTED]/                /* 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;
  -
  -/[EMAIL PROTECTED]@*/
  -     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;
  -     }
  -/[EMAIL PROTECTED]@*/
  -    } 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);
       }
  -/[EMAIL PROTECTED]@*/
  -    if (pw && pw != passPhrase) {
  +
  +    if (pw != NULL) {
        (void) memset((void *)pw, 0, strlen(pw));
  -/[EMAIL PROTECTED]@*/        /* XXX mixed use in variable */
        pw = _free(pw);
  -/[EMAIL PROTECTED]@*/
       }
  -/[EMAIL PROTECTED]@*/

       (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;
  -
  -/[EMAIL PROTECTED]@*/
  -     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;
  -     }
  -/[EMAIL PROTECTED]@*/
  -    } 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]);

  -/[EMAIL PROTECTED]@*/
  -    if (pw && pw != passPhrase) {
  +    if (pw != NULL) {
        (void) memset((void *)pw, 0, strlen(pw));
  -/[EMAIL PROTECTED]@*/        /* XXX mixed use in variable */
        pw = _free(pw);
  -/[EMAIL PROTECTED]@*/
       }
  -/[EMAIL PROTECTED]@*/

       (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.
  - */
  -/[EMAIL PROTECTED]@*/
  -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)
  +/[EMAIL PROTECTED]@*/
  +rpmint32_t _kuKeyring;
  +
  +/[EMAIL PROTECTED]@*/
  +static int _kuCache = 1;
  +
  +typedef struct _kuItem_s {
  +/[EMAIL PROTECTED]@*/
  +    const char *name;
  +    key_serial_t val;
  +} * _kuItem;
  +
+/* NB: the following table must be sorted lexically for bsearch (3). */
  +/[EMAIL PROTECTED]@*/ /[EMAIL PROTECTED]@*/
  +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
  +};
  +
  +/[EMAIL PROTECTED]@*/
  +static size_t nkuTable = sizeof(kuTable) / sizeof(kuTable[0]);
  +
  +static int
  +kuCmp(const void * a, const void * b)
  +     /[EMAIL PROTECTED]/
  +{
  +    return strcmp(((_kuItem)a)->name, ((_kuItem)b)->name);
  +}
  +
  +static key_serial_t
  +kuValue(const char * name)
  +     /[EMAIL PROTECTED] fileSystem @*/
  +     /[EMAIL PROTECTED] 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;
  +
  +/[EMAIL PROTECTED]@*/
  +    pw = getpass( prompt ? prompt : "" );
  +/[EMAIL PROTECTED]@*/
  +
  +#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);
  +/[EMAIL PROTECTED] [EMAIL PROTECTED]/
  +    return pw;
  +/[EMAIL PROTECTED] [EMAIL PROTECTED]/
  +}
  +
  +char * _RequestPass(/[EMAIL PROTECTED]@*/ const char * prompt)
  +{
  +/[EMAIL PROTECTED]@*/ /[EMAIL PROTECTED]@*/
  +    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);
  +
  +/[EMAIL PROTECTED]@*/        /* XXX *password may be null. */
  +    xx = keyctl_read_alloc(key, (void *)&password);
  +/[EMAIL PROTECTED]@*/
  +assert(password != NULL);
  +#endif
  +
  +/[EMAIL PROTECTED]@*/
  +    return password;
  +/[EMAIL PROTECTED]@*/
  +}
  +
  +/[EMAIL PROTECTED]@*/
  +char * (*Getpass) (const char * prompt) = _GetPass;
  +/[EMAIL PROTECTED]@*/
  +
  +rpmRC rpmkuFindPubkey(pgpDigParams sigp, /[EMAIL PROTECTED]@*/ rpmiob * iobp)
  +{
  +    if (iobp != NULL)
  +     *iobp = NULL;
  +
  +#if defined(HAVE_KEYUTILS_H)
  +    if (_kuCache) {
  +/[EMAIL PROTECTED]@*/
  +     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, /[EMAIL PROTECTED]@*/ rpmiob iob)
  +{
  +#if defined(HAVE_KEYUTILS_H)
  +    if (_kuCache) {
  +/[EMAIL PROTECTED]@*/
  +     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);
  +/[EMAIL PROTECTED] -noeffectuncon @*/
  +     (void) add_key("user", krn, iob->b, iob->blen, keyring);
  +/[EMAIL PROTECTED] =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;
  +
  +/[EMAIL PROTECTED]@*/
  +     key = keyctl_search(keyring, "user", "rpm:passwd", 0);
  +     pw = NULL;
  +     xx = keyctl_read_alloc(key, (void **)&pw);
  +/[EMAIL PROTECTED]@*/
  +     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.
  + */
  +/[EMAIL PROTECTED]@*/
  +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, /[EMAIL PROTECTED]@*/ rpmiob * iobp)
  +     /[EMAIL PROTECTED] *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, /[EMAIL PROTECTED]@*/ rpmiob iob)
  +     /[EMAIL PROTECTED] iob @*/;
  +
  +/**
  + * Return pass phrase from keyutils keyring.
  + * @param passPhrase pass phrase
  + * @return           (malloc'd) pass phrase
  + */
  +/[EMAIL PROTECTED]@*/
  +const char * rpmkuPassPhrase(const char * passPhrase)
  +     /[EMAIL PROTECTED] iob @*/;
  +
  +#ifdef __cplusplus
  +}
  +#endif
  +
  +#endif /* _H_RPMKU_ */
  @@ .
______________________________________________________________________
RPM Package Manager                                    http://rpm5.org
CVS Sources Repository                                [EMAIL PROTECTED]

______________________________________________________________________
RPM Package Manager                                    http://rpm5.org
Developer Communication List                        rpm-devel@rpm5.org

Reply via email to