EXT PW: Add framework for supporting external password storage
This new mechanism can be used to make wpa_supplicant using external storage (e.g., key store in the operating system) for passwords, passphrases, and PSKs. This commit is only adding the framework part needed to support this, i.e., no actual configuration parameter can yet use this new mechanism. In addition, only a simple test backend is added to allow developer testing of the functionality. Signed-hostap: Jouni Malinen <j@w1.fi>
This commit is contained in:
parent
2518aad3e8
commit
306ae22556
15 changed files with 374 additions and 2 deletions
116
src/utils/ext_password.c
Normal file
116
src/utils/ext_password.c
Normal file
|
@ -0,0 +1,116 @@
|
|||
/*
|
||||
* External password backend
|
||||
* Copyright (c) 2012, Jouni Malinen <j@w1.fi>
|
||||
*
|
||||
* This software may be distributed under the terms of the BSD license.
|
||||
* See README for more details.
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
|
||||
#ifdef __linux__
|
||||
#include <sys/mman.h>
|
||||
#endif /* __linux__ */
|
||||
|
||||
#include "common.h"
|
||||
#include "ext_password_i.h"
|
||||
|
||||
|
||||
#ifdef CONFIG_EXT_PASSWORD_TEST
|
||||
extern struct ext_password_backend ext_password_test;
|
||||
#endif /* CONFIG_EXT_PASSWORD_TEST */
|
||||
|
||||
static const struct ext_password_backend *backends[] = {
|
||||
#ifdef CONFIG_EXT_PASSWORD_TEST
|
||||
&ext_password_test,
|
||||
#endif /* CONFIG_EXT_PASSWORD_TEST */
|
||||
NULL
|
||||
};
|
||||
|
||||
struct ext_password_data {
|
||||
const struct ext_password_backend *backend;
|
||||
void *priv;
|
||||
};
|
||||
|
||||
|
||||
struct ext_password_data * ext_password_init(const char *backend,
|
||||
const char *params)
|
||||
{
|
||||
struct ext_password_data *data;
|
||||
int i;
|
||||
|
||||
data = os_zalloc(sizeof(*data));
|
||||
if (data == NULL)
|
||||
return NULL;
|
||||
|
||||
for (i = 0; backends[i]; i++) {
|
||||
if (os_strcmp(backends[i]->name, backend) == 0) {
|
||||
data->backend = backends[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!data->backend) {
|
||||
os_free(data);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
data->priv = data->backend->init(params);
|
||||
if (data->priv == NULL) {
|
||||
os_free(data);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
|
||||
void ext_password_deinit(struct ext_password_data *data)
|
||||
{
|
||||
if (data && data->backend && data->priv)
|
||||
data->backend->deinit(data->priv);
|
||||
os_free(data);
|
||||
}
|
||||
|
||||
|
||||
struct wpabuf * ext_password_get(struct ext_password_data *data,
|
||||
const char *name)
|
||||
{
|
||||
if (data == NULL)
|
||||
return NULL;
|
||||
return data->backend->get(data->priv, name);
|
||||
}
|
||||
|
||||
|
||||
struct wpabuf * ext_password_alloc(size_t len)
|
||||
{
|
||||
struct wpabuf *buf;
|
||||
|
||||
buf = wpabuf_alloc(len);
|
||||
if (buf == NULL)
|
||||
return NULL;
|
||||
|
||||
#ifdef __linux__
|
||||
if (mlock(wpabuf_head(buf), wpabuf_len(buf)) < 0) {
|
||||
wpa_printf(MSG_ERROR, "EXT PW: mlock failed: %s",
|
||||
strerror(errno));
|
||||
}
|
||||
#endif /* __linux__ */
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
|
||||
void ext_password_free(struct wpabuf *pw)
|
||||
{
|
||||
if (pw == NULL)
|
||||
return;
|
||||
os_memset(wpabuf_mhead(pw), 0, wpabuf_len(pw));
|
||||
#ifdef __linux__
|
||||
if (munlock(wpabuf_head(pw), wpabuf_len(pw)) < 0) {
|
||||
wpa_printf(MSG_ERROR, "EXT PW: munlock failed: %s",
|
||||
strerror(errno));
|
||||
}
|
||||
#endif /* __linux__ */
|
||||
wpabuf_free(pw);
|
||||
}
|
33
src/utils/ext_password.h
Normal file
33
src/utils/ext_password.h
Normal file
|
@ -0,0 +1,33 @@
|
|||
/*
|
||||
* External password backend
|
||||
* Copyright (c) 2012, Jouni Malinen <j@w1.fi>
|
||||
*
|
||||
* This software may be distributed under the terms of the BSD license.
|
||||
* See README for more details.
|
||||
*/
|
||||
|
||||
#ifndef EXT_PASSWORD_H
|
||||
#define EXT_PASSWORD_H
|
||||
|
||||
struct ext_password_data;
|
||||
|
||||
#ifdef CONFIG_EXT_PASSWORD
|
||||
|
||||
struct ext_password_data * ext_password_init(const char *backend,
|
||||
const char *params);
|
||||
void ext_password_deinit(struct ext_password_data *data);
|
||||
|
||||
struct wpabuf * ext_password_get(struct ext_password_data *data,
|
||||
const char *name);
|
||||
void ext_password_free(struct wpabuf *pw);
|
||||
|
||||
#else /* CONFIG_EXT_PASSWORD */
|
||||
|
||||
#define ext_password_init(b, p) ((void *) 1)
|
||||
#define ext_password_deinit(d) do { } while (0)
|
||||
#define ext_password_get(d, n) (NULL)
|
||||
#define ext_password_free(p) do { } while (0)
|
||||
|
||||
#endif /* CONFIG_EXT_PASSWORD */
|
||||
|
||||
#endif /* EXT_PASSWORD_H */
|
23
src/utils/ext_password_i.h
Normal file
23
src/utils/ext_password_i.h
Normal file
|
@ -0,0 +1,23 @@
|
|||
/*
|
||||
* External password backend - internal definitions
|
||||
* Copyright (c) 2012, Jouni Malinen <j@w1.fi>
|
||||
*
|
||||
* This software may be distributed under the terms of the BSD license.
|
||||
* See README for more details.
|
||||
*/
|
||||
|
||||
#ifndef EXT_PASSWORD_I_H
|
||||
#define EXT_PASSWORD_I_H
|
||||
|
||||
#include "ext_password.h"
|
||||
|
||||
struct ext_password_backend {
|
||||
const char *name;
|
||||
void * (*init)(const char *params);
|
||||
void (*deinit)(void *ctx);
|
||||
struct wpabuf * (*get)(void *ctx, const char *name);
|
||||
};
|
||||
|
||||
struct wpabuf * ext_password_alloc(size_t len);
|
||||
|
||||
#endif /* EXT_PASSWORD_I_H */
|
90
src/utils/ext_password_test.c
Normal file
90
src/utils/ext_password_test.c
Normal file
|
@ -0,0 +1,90 @@
|
|||
/*
|
||||
* External password backend
|
||||
* Copyright (c) 2012, Jouni Malinen <j@w1.fi>
|
||||
*
|
||||
* This software may be distributed under the terms of the BSD license.
|
||||
* See README for more details.
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
|
||||
#include "common.h"
|
||||
#include "ext_password_i.h"
|
||||
|
||||
|
||||
struct ext_password_test_data {
|
||||
char *params;
|
||||
};
|
||||
|
||||
|
||||
static void * ext_password_test_init(const char *params)
|
||||
{
|
||||
struct ext_password_test_data *data;
|
||||
|
||||
data = os_zalloc(sizeof(*data));
|
||||
if (data == NULL)
|
||||
return NULL;
|
||||
|
||||
if (params)
|
||||
data->params = os_strdup(params);
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
|
||||
static void ext_password_test_deinit(void *ctx)
|
||||
{
|
||||
struct ext_password_test_data *data = ctx;
|
||||
|
||||
os_free(data->params);
|
||||
os_free(data);
|
||||
}
|
||||
|
||||
|
||||
static struct wpabuf * ext_password_test_get(void *ctx, const char *name)
|
||||
{
|
||||
struct ext_password_test_data *data = ctx;
|
||||
char *pos, *pos2;
|
||||
size_t nlen;
|
||||
|
||||
wpa_printf(MSG_DEBUG, "EXT PW TEST: get(%s)", name);
|
||||
|
||||
pos = data->params;
|
||||
if (pos == NULL)
|
||||
return NULL;
|
||||
nlen = os_strlen(name);
|
||||
|
||||
while (pos && *pos) {
|
||||
if (os_strncmp(pos, name, nlen) == 0 && pos[nlen] == '=') {
|
||||
struct wpabuf *buf;
|
||||
pos += nlen + 1;
|
||||
pos2 = pos;
|
||||
while (*pos2 != '|' && *pos2 != '\0')
|
||||
pos2++;
|
||||
buf = ext_password_alloc(pos2 - pos);
|
||||
if (buf == NULL)
|
||||
return NULL;
|
||||
wpabuf_put_data(buf, pos, pos2 - pos);
|
||||
wpa_hexdump_ascii_key(MSG_DEBUG, "EXT PW TEST: value",
|
||||
wpabuf_head(buf),
|
||||
wpabuf_len(buf));
|
||||
return buf;
|
||||
}
|
||||
|
||||
pos = os_strchr(pos + 1, '|');
|
||||
if (pos)
|
||||
pos++;
|
||||
}
|
||||
|
||||
wpa_printf(MSG_DEBUG, "EXT PW TEST: get(%s) - not found", name);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
const struct ext_password_backend ext_password_test = {
|
||||
.name = "test",
|
||||
.init = ext_password_test_init,
|
||||
.deinit = ext_password_test_deinit,
|
||||
.get = ext_password_test_get,
|
||||
};
|
Loading…
Add table
Add a link
Reference in a new issue