7 #define _RPMIOB_INTERNAL
10 #if defined(HAVE_KEYUTILS_H)
22 #define _RPMPGP_INTERNAL
32 #if defined(HAVE_KEYUTILS_H)
37 static int _kuCache = 1;
39 typedef struct _kuItem_s {
47 static struct _kuItem_s kuTable[] = {
48 {
"group", KEY_SPEC_GROUP_KEYRING },
49 {
"process", KEY_SPEC_PROCESS_KEYRING },
50 {
"reqkey_auth", KEY_SPEC_REQKEY_AUTH_KEY },
51 {
"session", KEY_SPEC_SESSION_KEYRING },
52 {
"thread", KEY_SPEC_THREAD_KEYRING },
53 {
"user", KEY_SPEC_USER_KEYRING },
54 {
"user_session", KEY_SPEC_USER_SESSION_KEYRING },
58 static size_t nkuTable =
sizeof(kuTable) /
sizeof(kuTable[0]);
61 kuCmp(
const void * a,
const void *
b)
64 return strcmp(((_kuItem)a)->
name, ((_kuItem)b)->
name);
68 kuValue(
const char *
name)
73 if (name != NULL && *name !=
'\0') {
74 _kuItem tmp = (_kuItem) memset(
alloca(
sizeof(*tmp)), 0,
sizeof(*tmp));
78 k = (_kuItem)bsearch(tmp, kuTable, nkuTable,
sizeof(kuTable[0]), kuCmp);
80 return (k != NULL ? k->val : 0);
90 pw = getpass( prompt ? prompt :
"" );
93 #if defined(HAVE_KEYUTILS_H)
95 const char * _keyutils_keyring
96 =
rpmExpand(
"%{?_keyutils_keyring}", NULL);
100 _keyutils_keyring =
_free(_keyutils_keyring);
104 key_serial_t keyring = (key_serial_t)
_kuKeyring;
105 size_t npw = strlen(pw);
106 (void) add_key(
"user",
"rpm:passwd", pw, npw, keyring);
107 (void) memset(pw, 0, npw);
108 pw = (
char *)
"@u user rpm:passwd";
122 static char * password = NULL;
123 #if defined(HAVE_KEYUTILS_H)
124 const char * foo =
"user rpm:yyyy spoon";
127 key_serial_t dest = 0;
128 key_serial_t
key = 0;
130 if (password != NULL) {
135 assert(av[0] != NULL);
136 assert(av[1] != NULL);
137 assert(av[2] != NULL);
138 key = request_key(av[0], av[1], av[2], dest);
142 xx = keyctl_read_alloc(key, (
void **)&password);
144 if (password == NULL)
145 password = (
char *)
"";
154 char * (*Getpass) (
const char * prompt) =
_GetPass;
162 #if defined(HAVE_KEYUTILS_H)
165 static const char krprefix[] =
"rpm:gpg:pubkey:";
166 key_serial_t keyring = (key_serial_t)
_kuKeyring;
168 char * krn = (
char *)
alloca(strlen(krprefix) +
sizeof(
"12345678"));
172 (void)
snprintf(krfp,
sizeof(krfp),
"%08X",
pgpGrab(sigp->signid+4, 4));
173 krfp[
sizeof(krfp)-1] =
'\0';
177 key = keyctl_search(keyring,
"user", krn, 0);
178 xx = keyctl_read(key, NULL, 0);
181 xx = keyctl_read(key, (
char *)iob->b, iob->blen);
190 if (iob != NULL && iobp != NULL) {
206 #if defined(HAVE_KEYUTILS_H)
209 static const char krprefix[] =
"rpm:gpg:pubkey:";
210 key_serial_t keyring = (key_serial_t)
_kuKeyring;
212 char * krn = (
char *)
alloca(strlen(krprefix) +
sizeof(
"12345678"));
214 (void)
snprintf(krfp,
sizeof(krfp),
"%08X",
pgpGrab(sigp->signid+4, 4));
215 krfp[
sizeof(krfp)-1] =
'\0';
219 (void) add_key(
"user", krn, iob->b, iob->blen, keyring);
231 #if defined(HAVE_KEYUTILS_H)
232 if (passPhrase && !strcmp(passPhrase,
"@u user rpm:passwd")) {
233 key_serial_t keyring = (key_serial_t)
_kuKeyring;
238 key = keyctl_search(keyring,
"user",
"rpm:passwd", 0);
240 xx = keyctl_read_alloc(key, (
void **)&pw);
OpenPGP constants and structures from RFC-2440.
char * xstrdup(const char *str)
struct pgpDigParams_s * pgpDigParams
static unsigned int pgpGrab(const rpmuint8_t *s, size_t nbytes)
Return (native-endian) integer from big-endian representation.
rpmiob rpmiobFree(rpmiob iob)
Destroy a I/O buffer instance.
ARGV_t argvFree(ARGV_t argv)
Destroy an argv array.
char * rpmExpand(const char *arg,...)
Return (malloc'ed) concatenated macro expansion(s).
rpmiob rpmiobNew(size_t len)
Create an I/O buffer.
enum rpmRC_e rpmRC
RPM return codes.
rpmRC rpmkuFindPubkey(pgpDigParams sigp, rpmiob *iobp)
Lookup pubkey in keyutils keyring.
static int snprintf(char *buf, int nb, const char *fmt,...)
const char const bson * key
rpmint32_t _kuKeyring
Keyutils keyring to use.
char * stpcpy(char *dest, const char *src)
static void * _free(const void *p)
Wrapper to free(3), hides const compilation noise, permit NULL, return NULL.
int argvSplit(ARGV_t *argvp, const char *str, const char *seps)
Split a string into an argv array.
char * _GetPass(const char *prompt)
const char * rpmkuPassPhrase(const char *passPhrase)
Return pass phrase from keyutils keyring.
rpmRC rpmkuStorePubkey(pgpDigParams sigp, rpmiob iob)
Store pubkey in keyutils keyring.
char * _RequestPass(const char *prompt)