Return to ocsp_response_wrapper.c CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / strongswan / src / libstrongswan / credentials / sets |
1.1 misho 1: /* 2: * Copyright (C) 2008 Martin Willi 3: * HSR Hochschule fuer Technik Rapperswil 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 "ocsp_response_wrapper.h" 17: 18: typedef struct private_ocsp_response_wrapper_t private_ocsp_response_wrapper_t; 19: 20: /** 21: * private data of ocsp_response_wrapper 22: */ 23: struct private_ocsp_response_wrapper_t { 24: 25: /** 26: * public functions 27: */ 28: ocsp_response_wrapper_t public; 29: 30: /** 31: * wrapped OCSP response 32: */ 33: ocsp_response_t *response; 34: }; 35: 36: /** 37: * enumerator for ocsp_response_wrapper_t.create_cert_enumerator() 38: */ 39: typedef struct { 40: /** implements enumerator_t */ 41: enumerator_t public; 42: /** enumerator over ocsp response */ 43: enumerator_t *inner; 44: /** type of cert */ 45: certificate_type_t cert; 46: /** type of key */ 47: key_type_t key; 48: /** filtering identity */ 49: identification_t *id; 50: } wrapper_enumerator_t; 51: 52: METHOD(enumerator_t, enumerate, bool, 53: wrapper_enumerator_t *this, va_list args) 54: { 55: certificate_t *current, **cert; 56: public_key_t *public; 57: 58: 59: VA_ARGS_VGET(args, cert); 60: 61: while (this->inner->enumerate(this->inner, ¤t)) 62: { 63: if (this->cert != CERT_ANY && this->cert != current->get_type(current)) 64: { /* CERT type requested, but does not match */ 65: continue; 66: } 67: public = current->get_public_key(current); 68: if (this->key != KEY_ANY && !public) 69: { /* key type requested, but no public key */ 70: DESTROY_IF(public); 71: continue; 72: } 73: if (this->key != KEY_ANY && public && this->key != public->get_type(public)) 74: { /* key type requested, but public key has another type */ 75: DESTROY_IF(public); 76: continue; 77: } 78: DESTROY_IF(public); 79: if (this->id && !current->has_subject(current, this->id)) 80: { /* subject requested, but does not match */ 81: continue; 82: } 83: *cert = current; 84: return TRUE; 85: } 86: return FALSE; 87: } 88: 89: METHOD(enumerator_t, enumerator_destroy, void, 90: wrapper_enumerator_t *this) 91: { 92: this->inner->destroy(this->inner); 93: free(this); 94: } 95: 96: METHOD(credential_set_t, create_enumerator, enumerator_t*, 97: private_ocsp_response_wrapper_t *this,certificate_type_t cert, 98: key_type_t key, identification_t *id, bool trusted) 99: { 100: wrapper_enumerator_t *enumerator; 101: 102: if (trusted) 103: { 104: return NULL; 105: } 106: 107: INIT(enumerator, 108: .public = { 109: .enumerate = enumerator_enumerate_default, 110: .venumerate = _enumerate, 111: .destroy = _enumerator_destroy, 112: }, 113: .cert = cert, 114: .key = key, 115: .id = id, 116: .inner = this->response->create_cert_enumerator(this->response), 117: ); 118: return &enumerator->public; 119: } 120: 121: METHOD(ocsp_response_wrapper_t, destroy, void, 122: private_ocsp_response_wrapper_t *this) 123: { 124: free(this); 125: } 126: 127: /* 128: * see header file 129: */ 130: ocsp_response_wrapper_t *ocsp_response_wrapper_create(ocsp_response_t *response) 131: { 132: private_ocsp_response_wrapper_t *this; 133: 134: INIT(this, 135: .public = { 136: .set = { 137: .create_cert_enumerator = _create_enumerator, 138: .create_private_enumerator = (void*)return_null, 139: .create_shared_enumerator = (void*)return_null, 140: .create_cdp_enumerator = (void*)return_null, 141: .cache_cert = (void*)nop, 142: }, 143: .destroy = _destroy, 144: }, 145: .response = response, 146: ); 147: 148: return &this->public; 149: }