123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- /*
- * 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);
- }
|