pki: Cache entered secrets in case they are needed more than once

This commit is contained in:
Tobias Brunner
2014-12-12 13:11:29 +01:00
parent 75dd984e9e
commit ec846f9e52
+23 -2
View File
@@ -1,4 +1,5 @@
/* /*
* Copyright (C) 2012-2014 Tobias Brunner
* Copyright (C) 2009 Martin Willi * Copyright (C) 2009 Martin Willi
* Hochschule fuer Technik Rapperswil * Hochschule fuer Technik Rapperswil
* *
@@ -22,6 +23,7 @@
#include <fcntl.h> #include <fcntl.h>
#include <utils/debug.h> #include <utils/debug.h>
#include <credentials/sets/mem_cred.h>
#include <credentials/sets/callback_cred.h> #include <credentials/sets/callback_cred.h>
/** /**
@@ -240,6 +242,13 @@ void set_file_mode(FILE *stream, cred_encoding_type_t enc)
*/ */
static callback_cred_t *cb_set; static callback_cred_t *cb_set;
/**
* Credential set to cache entered secrets
*/
static mem_cred_t *cb_creds;
static shared_key_type_t prompted;
/** /**
* Callback function to receive credentials * Callback function to receive credentials
*/ */
@@ -248,7 +257,12 @@ static shared_key_t* cb(void *data, shared_key_type_t type,
id_match_t *match_me, id_match_t *match_other) id_match_t *match_me, id_match_t *match_other)
{ {
char buf[64], *label, *secret = NULL; char buf[64], *label, *secret = NULL;
shared_key_t *shared;
if (prompted == type)
{
return NULL;
}
switch (type) switch (type)
{ {
case SHARED_PIN: case SHARED_PIN:
@@ -266,6 +280,7 @@ static shared_key_t* cb(void *data, shared_key_type_t type,
#endif #endif
if (secret && strlen(secret)) if (secret && strlen(secret))
{ {
prompted = type;
if (match_me) if (match_me)
{ {
*match_me = ID_MATCH_PERFECT; *match_me = ID_MATCH_PERFECT;
@@ -274,8 +289,10 @@ static shared_key_t* cb(void *data, shared_key_type_t type,
{ {
*match_other = ID_MATCH_NONE; *match_other = ID_MATCH_NONE;
} }
return shared_key_create(type, shared = shared_key_create(type, chunk_clone(chunk_from_str(secret)));
chunk_clone(chunk_create(secret, strlen(secret)))); /* cache password in case it is required more than once */
cb_creds->add_shared(cb_creds, shared, NULL);
return shared->get_ref(shared);
} }
return NULL; return NULL;
} }
@@ -287,6 +304,8 @@ static void add_callback()
{ {
cb_set = callback_cred_create_shared(cb, NULL); cb_set = callback_cred_create_shared(cb, NULL);
lib->credmgr->add_set(lib->credmgr, &cb_set->set); lib->credmgr->add_set(lib->credmgr, &cb_set->set);
cb_creds = mem_cred_create();
lib->credmgr->add_set(lib->credmgr, &cb_creds->set);
} }
/** /**
@@ -294,6 +313,8 @@ static void add_callback()
*/ */
static void remove_callback() static void remove_callback()
{ {
lib->credmgr->remove_set(lib->credmgr, &cb_creds->set);
cb_creds->destroy(cb_creds);
lib->credmgr->remove_set(lib->credmgr, &cb_set->set); lib->credmgr->remove_set(lib->credmgr, &cb_set->set);
cb_set->destroy(cb_set); cb_set->destroy(cb_set);
} }