Annotation of embedaddon/strongswan/src/libcharon/plugins/medsrv/medsrv_creds.c, revision 1.1.1.1
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 "medsrv_creds.h"
17:
18: #include <daemon.h>
19: #include <library.h>
20: #include <collections/enumerator.h>
21:
22: typedef struct private_medsrv_creds_t private_medsrv_creds_t;
23:
24: /**
25: * Private data of an medsrv_creds_t object
26: */
27: struct private_medsrv_creds_t {
28:
29: /**
30: * Public part
31: */
32: medsrv_creds_t public;
33:
34: /**
35: * underlying database handle
36: */
37: database_t *db;
38: };
39:
40: /**
41: * enumerator over certificates
42: */
43: typedef struct {
44: /** implements enumerator */
45: enumerator_t public;
46: /** inner SQL enumerator */
47: enumerator_t *inner;
48: /** currently enumerated cert */
49: certificate_t *current;
50: /** type of requested key */
51: key_type_t type;
52: } cert_enumerator_t;
53:
54: METHOD(enumerator_t, cert_enumerator_enumerate, bool,
55: cert_enumerator_t *this, va_list args)
56: {
57: certificate_t *trusted, **cert;
58: public_key_t *public;
59: chunk_t chunk;
60:
61: VA_ARGS_VGET(args, cert);
62:
63: DESTROY_IF(this->current);
64: while (this->inner->enumerate(this->inner, &chunk))
65: {
66: public = lib->creds->create(lib->creds, CRED_PUBLIC_KEY, KEY_ANY,
67: BUILD_BLOB_ASN1_DER, chunk,
68: BUILD_END);
69: if (public)
70: {
71: if (this->type == KEY_ANY || this->type == public->get_type(public))
72: {
73: trusted = lib->creds->create(lib->creds,
74: CRED_CERTIFICATE, CERT_TRUSTED_PUBKEY,
75: BUILD_PUBLIC_KEY, public, BUILD_END);
76: public->destroy(public);
77: if (trusted)
78: {
79: *cert = this->current = trusted;
80: return TRUE;
81: }
82: }
83: else
84: {
85: public->destroy(public);
86: }
87: }
88: }
89: this->current = NULL;
90: return FALSE;
91: }
92:
93: METHOD(enumerator_t, cert_enumerator_destroy, void,
94: cert_enumerator_t *this)
95: {
96: DESTROY_IF(this->current);
97: this->inner->destroy(this->inner);
98: free(this);
99: }
100:
101: METHOD(credential_set_t, create_cert_enumerator, enumerator_t*,
102: private_medsrv_creds_t *this, certificate_type_t cert, key_type_t key,
103: identification_t *id, bool trusted)
104: {
105: cert_enumerator_t *e;
106:
107: if ((cert != CERT_TRUSTED_PUBKEY && cert != CERT_ANY) ||
108: id == NULL || id->get_type(id) != ID_KEY_ID)
109: {
110: return NULL;
111: }
112:
113: INIT(e,
114: .public = {
115: .enumerate = enumerator_enumerate_default,
116: .venumerate = _cert_enumerator_enumerate,
117: .destroy = _cert_enumerator_destroy,
118: },
119: .type = key,
120: .inner = this->db->query(this->db,
121: "SELECT public_key FROM peer WHERE keyid = ?",
122: DB_BLOB, id->get_encoding(id),
123: DB_BLOB),
124: );
125: if (!e->inner)
126: {
127: free(e);
128: return NULL;
129: }
130: return &e->public;
131: }
132:
133: METHOD(medsrv_creds_t, destroy, void,
134: private_medsrv_creds_t *this)
135: {
136: free(this);
137: }
138:
139: /**
140: * Described in header.
141: */
142: medsrv_creds_t *medsrv_creds_create(database_t *db)
143: {
144: private_medsrv_creds_t *this;
145:
146: INIT(this,
147: .public = {
148: .set = {
149: .create_private_enumerator = (void*)return_null,
150: .create_cert_enumerator = _create_cert_enumerator,
151: .create_shared_enumerator = (void*)return_null,
152: .create_cdp_enumerator = (void*)return_null,
153: .cache_cert = (void*)nop,
154: },
155: .destroy = _destroy,
156: },
157: .db = db,
158: );
159:
160: return &this->public;
161: }
162:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>