1 /* 2 * External password backend 3 * Copyright (c) 2012, Jouni Malinen <j@w1.fi> 4 * 5 * This software may be distributed under the terms of the BSD license. 6 * See README for more details. 7 */ 8 9 #include "includes.h" 10 11 #ifdef __linux__ 12 #include <sys/mman.h> 13 #endif /* __linux__ */ 14 15 #include "common.h" 16 #include "ext_password_i.h" 17 18 19 static const struct ext_password_backend *backends[] = { 20 #ifdef CONFIG_EXT_PASSWORD_TEST 21 &ext_password_test, 22 #endif /* CONFIG_EXT_PASSWORD_TEST */ 23 NULL 24 }; 25 26 struct ext_password_data { 27 const struct ext_password_backend *backend; 28 void *priv; 29 }; 30 31 32 struct ext_password_data * ext_password_init(const char *backend, 33 const char *params) 34 { 35 struct ext_password_data *data; 36 int i; 37 38 data = os_zalloc(sizeof(*data)); 39 if (data == NULL) 40 return NULL; 41 42 for (i = 0; backends[i]; i++) { 43 if (os_strcmp(backends[i]->name, backend) == 0) { 44 data->backend = backends[i]; 45 break; 46 } 47 } 48 49 if (!data->backend) { 50 os_free(data); 51 return NULL; 52 } 53 54 data->priv = data->backend->init(params); 55 if (data->priv == NULL) { 56 os_free(data); 57 return NULL; 58 } 59 60 return data; 61 } 62 63 64 void ext_password_deinit(struct ext_password_data *data) 65 { 66 if (data && data->backend && data->priv) 67 data->backend->deinit(data->priv); 68 os_free(data); 69 } 70 71 72 struct wpabuf * ext_password_get(struct ext_password_data *data, 73 const char *name) 74 { 75 if (data == NULL) 76 return NULL; 77 return data->backend->get(data->priv, name); 78 } 79 80 81 struct wpabuf * ext_password_alloc(size_t len) 82 { 83 struct wpabuf *buf; 84 85 buf = wpabuf_alloc(len); 86 if (buf == NULL) 87 return NULL; 88 89 #ifdef __linux__ 90 if (mlock(wpabuf_head(buf), wpabuf_len(buf)) < 0) { 91 wpa_printf(MSG_ERROR, "EXT PW: mlock failed: %s", 92 strerror(errno)); 93 } 94 #endif /* __linux__ */ 95 96 return buf; 97 } 98 99 100 void ext_password_free(struct wpabuf *pw) 101 { 102 if (pw == NULL) 103 return; 104 os_memset(wpabuf_mhead(pw), 0, wpabuf_len(pw)); 105 #ifdef __linux__ 106 if (munlock(wpabuf_head(pw), wpabuf_len(pw)) < 0) { 107 wpa_printf(MSG_ERROR, "EXT PW: munlock failed: %s", 108 strerror(errno)); 109 } 110 #endif /* __linux__ */ 111 wpabuf_free(pw); 112 } 113