Return to callback_cred.c CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / strongswan / src / libstrongswan / credentials / sets |
1.1 misho 1: /* 2: * Copyright (C) 2010 Martin Willi 3: * Copyright (C) 2010 revosec AG 4: * 5: * This program is free software; you can redistribute it and/or modify it 6: * under the terms of the GNU General Public License as published by the 7: * Free Software Foundation; either version 2 of the License, or (at your 8: * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>. 9: * 10: * This program is distributed in the hope that it will be useful, but 11: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 12: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 13: * for more details. 14: */ 15: 16: #include "callback_cred.h" 17: 18: typedef struct private_callback_cred_t private_callback_cred_t; 19: 20: /** 21: * Private data of an callback_cred_t object. 22: */ 23: struct private_callback_cred_t { 24: 25: /** 26: * Public callback_cred_t interface. 27: */ 28: callback_cred_t public; 29: 30: /** 31: * Callback of this set, for all types, and generic 32: */ 33: union { 34: void *generic; 35: callback_cred_shared_cb_t shared; 36: } cb; 37: 38: /** 39: * Data to pass to callback 40: */ 41: void *data; 42: }; 43: 44: /** 45: * Shared key enumerator on callbacks 46: */ 47: typedef struct { 48: /* implements enumerator_t */ 49: enumerator_t public; 50: /* backref to this */ 51: private_callback_cred_t *this; 52: /* type if requested key */ 53: shared_key_type_t type; 54: /* own identity to match */ 55: identification_t *me; 56: /* other identity to match */ 57: identification_t *other; 58: /* current shared key */ 59: shared_key_t *current; 60: } shared_enumerator_t; 61: 62: METHOD(enumerator_t, shared_enumerate, bool, 63: shared_enumerator_t *this, va_list args) 64: { 65: shared_key_t **out; 66: id_match_t *match_me, *match_other; 67: 68: VA_ARGS_VGET(args, out, match_me, match_other); 69: DESTROY_IF(this->current); 70: this->current = this->this->cb.shared(this->this->data, this->type, 71: this->me, this->other, match_me, match_other); 72: if (this->current) 73: { 74: *out = this->current; 75: return TRUE; 76: } 77: return FALSE; 78: } 79: 80: METHOD(enumerator_t, shared_destroy, void, 81: shared_enumerator_t *this) 82: { 83: DESTROY_IF(this->current); 84: free(this); 85: } 86: 87: METHOD(credential_set_t, create_shared_enumerator, enumerator_t*, 88: private_callback_cred_t *this, shared_key_type_t type, 89: identification_t *me, identification_t *other) 90: { 91: shared_enumerator_t *enumerator; 92: 93: INIT(enumerator, 94: .public = { 95: .enumerate = enumerator_enumerate_default, 96: .venumerate = _shared_enumerate, 97: .destroy = _shared_destroy, 98: }, 99: .this = this, 100: .type = type, 101: .me = me, 102: .other = other, 103: ); 104: return &enumerator->public; 105: } 106: 107: METHOD(callback_cred_t, destroy, void, 108: private_callback_cred_t *this) 109: { 110: free(this); 111: } 112: 113: /** 114: * Create a generic callback credential set 115: */ 116: static private_callback_cred_t* create_generic(void *cb, void *data) 117: { 118: private_callback_cred_t *this; 119: 120: INIT(this, 121: .public = { 122: .set = { 123: .create_shared_enumerator = (void*)return_null, 124: .create_private_enumerator = (void*)return_null, 125: .create_cert_enumerator = (void*)return_null, 126: .create_cdp_enumerator = (void*)return_null, 127: .cache_cert = (void*)nop, 128: }, 129: .destroy = _destroy, 130: }, 131: .cb.generic = cb, 132: .data = data, 133: ); 134: return this; 135: } 136: 137: /** 138: * See header 139: */ 140: callback_cred_t *callback_cred_create_shared(callback_cred_shared_cb_t cb, 141: void *data) 142: { 143: private_callback_cred_t *this = create_generic(cb, data); 144: 145: this->public.set.create_shared_enumerator = _create_shared_enumerator; 146: 147: return &this->public; 148: }