161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt/*
261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * External password backend
361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * Copyright (c) 2012, Jouni Malinen <j@w1.fi>
461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt *
561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * This software may be distributed under the terms of the BSD license.
661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * See README for more details.
761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt */
861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#include "includes.h"
1061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
1161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#include "common.h"
1261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#include "ext_password_i.h"
1361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
1461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
1561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstruct ext_password_test_data {
1661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	char *params;
1761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt};
1861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
1961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
2061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic void * ext_password_test_init(const char *params)
2161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
2261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	struct ext_password_test_data *data;
2361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
2461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	data = os_zalloc(sizeof(*data));
2561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (data == NULL)
2661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		return NULL;
2761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
2861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (params)
2961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		data->params = os_strdup(params);
3061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
3161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return data;
3261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
3361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
3461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
3561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic void ext_password_test_deinit(void *ctx)
3661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
3761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	struct ext_password_test_data *data = ctx;
3861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
39c28170251eb54dbf64a9074a07fee377587425b2Dmitry Shmidt	str_clear_free(data->params);
4061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	os_free(data);
4161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
4261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
4361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
4461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic struct wpabuf * ext_password_test_get(void *ctx, const char *name)
4561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
4661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	struct ext_password_test_data *data = ctx;
4761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	char *pos, *pos2;
4861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	size_t nlen;
4961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
5061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	wpa_printf(MSG_DEBUG, "EXT PW TEST: get(%s)", name);
5161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
5261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	pos = data->params;
5361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (pos == NULL)
5461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		return NULL;
5561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	nlen = os_strlen(name);
5661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
5761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	while (pos && *pos) {
5861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		if (os_strncmp(pos, name, nlen) == 0 && pos[nlen] == '=') {
5961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			struct wpabuf *buf;
6061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			pos += nlen + 1;
6161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			pos2 = pos;
6261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			while (*pos2 != '|' && *pos2 != '\0')
6361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				pos2++;
6461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			buf = ext_password_alloc(pos2 - pos);
6561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			if (buf == NULL)
6661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				return NULL;
6761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			wpabuf_put_data(buf, pos, pos2 - pos);
6861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			wpa_hexdump_ascii_key(MSG_DEBUG, "EXT PW TEST: value",
6961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt					      wpabuf_head(buf),
7061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt					      wpabuf_len(buf));
7161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			return buf;
7261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		}
7361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
7461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		pos = os_strchr(pos + 1, '|');
7561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		if (pos)
7661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			pos++;
7761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	}
7861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
7961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	wpa_printf(MSG_DEBUG, "EXT PW TEST: get(%s) - not found", name);
8061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
8161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return NULL;
8261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
8361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
8461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
8561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtconst struct ext_password_backend ext_password_test = {
8661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	.name = "test",
8761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	.init = ext_password_test_init,
8861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	.deinit = ext_password_test_deinit,
8961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	.get = ext_password_test_get,
9061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt};
91