Annotation of embedaddon/strongswan/src/libcharon/plugins/uci/uci_creds.c, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (C) 2008 Thomas Kallenberg
! 3: * Copyright (C) 2008 Martin Willi
! 4: * Copyright (C) 2008 Tobias Brunner
! 5: * HSR Hochschule fuer Technik Rapperswil
! 6: *
! 7: * This program is free software; you can redistribute it and/or modify it
! 8: * under the terms of the GNU General Public License as published by the
! 9: * Free Software Foundation; either version 2 of the License, or (at your
! 10: * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
! 11: *
! 12: * This program is distributed in the hope that it will be useful, but
! 13: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
! 14: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
! 15: * for more details.
! 16: */
! 17:
! 18: #include "uci_creds.h"
! 19:
! 20: #include <daemon.h>
! 21: #include <credentials/keys/shared_key.h>
! 22: #include <utils/identification.h>
! 23:
! 24: typedef struct private_uci_creds_t private_uci_creds_t;
! 25:
! 26: /**
! 27: * Private data of an uci_creds_t object
! 28: */
! 29: struct private_uci_creds_t {
! 30: /**
! 31: * Public part
! 32: */
! 33: uci_creds_t public;
! 34:
! 35: /**
! 36: * UCI parser context
! 37: */
! 38: uci_parser_t *parser;
! 39: };
! 40:
! 41: typedef struct {
! 42: /** implements enumerator */
! 43: enumerator_t public;
! 44: /** inner UCI enumerator */
! 45: enumerator_t *inner;
! 46: /** currently enumerated shared shared */
! 47: shared_key_t *current;
! 48: /** local ID to match */
! 49: identification_t *me;
! 50: /** remote ID to match */
! 51: identification_t *other;
! 52: } shared_enumerator_t;
! 53:
! 54: METHOD(enumerator_t, shared_enumerator_enumerate, bool,
! 55: shared_enumerator_t *this, va_list args)
! 56: {
! 57: shared_key_t **key;
! 58: id_match_t *me, *other;
! 59: char *local_id, *remote_id, *psk;
! 60: identification_t *local, *remote;
! 61:
! 62: VA_ARGS_VGET(args, key, me, other);
! 63:
! 64: while (TRUE)
! 65: {
! 66: /* defaults */
! 67: local_id = "%any";
! 68: remote_id = "%any";
! 69: psk = NULL;
! 70:
! 71: if (!this->inner->enumerate(this->inner, NULL,
! 72: &local_id, &remote_id, &psk))
! 73: {
! 74: return FALSE;
! 75: }
! 76: if (psk == NULL)
! 77: {
! 78: continue;
! 79: }
! 80: if (me)
! 81: {
! 82: local = identification_create_from_string(local_id);
! 83: *me = this->me ? this->me->matches(this->me, local)
! 84: : ID_MATCH_ANY;
! 85: local->destroy(local);
! 86: if (!*me)
! 87: {
! 88: continue;
! 89: }
! 90: }
! 91: if (other)
! 92: {
! 93: remote = identification_create_from_string(remote_id);
! 94: *other = this->other ? this->other->matches(this->other, remote)
! 95: : ID_MATCH_ANY;
! 96: remote->destroy(remote);
! 97: if (!*other)
! 98: {
! 99: continue;
! 100: }
! 101: }
! 102: break;
! 103: }
! 104: DESTROY_IF(this->current);
! 105: this->current = shared_key_create(SHARED_IKE,
! 106: chunk_clone(chunk_create(psk, strlen(psk))));
! 107: *key = this->current;
! 108: return TRUE;
! 109: }
! 110:
! 111: METHOD(enumerator_t, shared_enumerator_destroy, void,
! 112: shared_enumerator_t *this)
! 113: {
! 114: this->inner->destroy(this->inner);
! 115: DESTROY_IF(this->current);
! 116: free(this);
! 117: }
! 118:
! 119: METHOD(credential_set_t, create_shared_enumerator, enumerator_t*,
! 120: private_uci_creds_t *this, shared_key_type_t type,
! 121: identification_t *me, identification_t *other)
! 122: {
! 123: shared_enumerator_t *e;
! 124:
! 125: if (type != SHARED_IKE)
! 126: {
! 127: return NULL;
! 128: }
! 129:
! 130: INIT(e,
! 131: .public = {
! 132: .enumerate = enumerator_enumerate_default,
! 133: .venumerate = _shared_enumerator_enumerate,
! 134: .destroy = _shared_enumerator_destroy,
! 135: },
! 136: .me = me,
! 137: .other = other,
! 138: .inner = this->parser->create_section_enumerator(this->parser,
! 139: "local_id", "remote_id", "psk", NULL),
! 140: );
! 141: if (!e->inner)
! 142: {
! 143: free(e);
! 144: return NULL;
! 145: }
! 146: return &e->public;
! 147: }
! 148:
! 149: METHOD(uci_creds_t, destroy, void,
! 150: private_uci_creds_t *this)
! 151: {
! 152: free(this);
! 153: }
! 154:
! 155: uci_creds_t *uci_creds_create(uci_parser_t *parser)
! 156: {
! 157: private_uci_creds_t *this;
! 158:
! 159: INIT(this,
! 160: .public = {
! 161: .credential_set = {
! 162: .create_shared_enumerator = _create_shared_enumerator,
! 163: .create_private_enumerator = (void*)return_null,
! 164: .create_cert_enumerator = (void*)return_null,
! 165: .create_cdp_enumerator = (void*)return_null,
! 166: .cache_cert = (void*)nop,
! 167: },
! 168: .destroy = _destroy,
! 169: },
! 170: );
! 171:
! 172: this->parser = parser;
! 173:
! 174: return &this->public;
! 175: }
! 176:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>