/src/strongswan/src/libstrongswan/plugins/plugin_feature.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * Copyright (C) 2016-2019 Andreas Steffen |
3 | | * Copyright (C) 2012-2015 Tobias Brunner |
4 | | * Copyright (C) 2011 Martin Willi |
5 | | * |
6 | | * Copyright (C) secunet Security Networks AG |
7 | | * |
8 | | * This program is free software; you can redistribute it and/or modify it |
9 | | * under the terms of the GNU General Public License as published by the |
10 | | * Free Software Foundation; either version 2 of the License, or (at your |
11 | | * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>. |
12 | | * |
13 | | * This program is distributed in the hope that it will be useful, but |
14 | | * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY |
15 | | * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
16 | | * for more details. |
17 | | */ |
18 | | |
19 | | #define _GNU_SOURCE |
20 | | #include <stdio.h> |
21 | | |
22 | | #include "plugin_feature.h" |
23 | | |
24 | | #include <utils/debug.h> |
25 | | |
26 | | ENUM(plugin_feature_names, FEATURE_NONE, FEATURE_CUSTOM, |
27 | | "NONE", |
28 | | "CRYPTER", |
29 | | "AEAD", |
30 | | "SIGNER", |
31 | | "HASHER", |
32 | | "PRF", |
33 | | "XOF", |
34 | | "KDF", |
35 | | "DRBG", |
36 | | "KE", |
37 | | "RNG", |
38 | | "NONCE_GEN", |
39 | | "PRIVKEY", |
40 | | "PRIVKEY_GEN", |
41 | | "PRIVKEY_SIGN", |
42 | | "PRIVKEY_DECRYPT", |
43 | | "PUBKEY", |
44 | | "PUBKEY_VERIFY", |
45 | | "PUBKEY_ENCRYPT", |
46 | | "CERT_DECODE", |
47 | | "CERT_ENCODE", |
48 | | "CONTAINER_DECODE", |
49 | | "CONTAINER_ENCODE", |
50 | | "EAP_SERVER", |
51 | | "EAP_CLIENT", |
52 | | "XAUTH_SERVER", |
53 | | "XAUTH_CLIENT", |
54 | | "DATABASE", |
55 | | "FETCHER", |
56 | | "RESOLVER", |
57 | | "CUSTOM", |
58 | | ); |
59 | | |
60 | | /** |
61 | | * See header. |
62 | | */ |
63 | | uint32_t plugin_feature_hash(plugin_feature_t *feature) |
64 | 2.36M | { |
65 | 2.36M | chunk_t data = chunk_empty; |
66 | | |
67 | 2.36M | switch (feature->type) |
68 | 2.36M | { |
69 | 0 | case FEATURE_NONE: |
70 | 188k | case FEATURE_RNG: |
71 | 188k | case FEATURE_NONCE_GEN: |
72 | 188k | case FEATURE_DATABASE: |
73 | 188k | case FEATURE_FETCHER: |
74 | 188k | case FEATURE_RESOLVER: |
75 | | /* put these special cases in their (type-specific) buckets */ |
76 | 188k | data = chunk_empty; |
77 | 188k | break; |
78 | 0 | case FEATURE_CRYPTER: |
79 | 0 | data = chunk_from_thing(feature->arg.crypter); |
80 | 0 | break; |
81 | 0 | case FEATURE_AEAD: |
82 | 0 | data = chunk_from_thing(feature->arg.aead); |
83 | 0 | break; |
84 | 0 | case FEATURE_SIGNER: |
85 | 0 | data = chunk_from_thing(feature->arg.signer); |
86 | 0 | break; |
87 | 439k | case FEATURE_HASHER: |
88 | 439k | data = chunk_from_thing(feature->arg.hasher); |
89 | 439k | break; |
90 | 15.6k | case FEATURE_PRF: |
91 | 15.6k | data = chunk_from_thing(feature->arg.prf); |
92 | 15.6k | break; |
93 | 70.5k | case FEATURE_XOF: |
94 | 70.5k | data = chunk_from_thing(feature->arg.xof); |
95 | 70.5k | break; |
96 | 0 | case FEATURE_KDF: |
97 | 0 | data = chunk_from_thing(feature->arg.kdf); |
98 | 0 | break; |
99 | 0 | case FEATURE_DRBG: |
100 | 0 | data = chunk_from_thing(feature->arg.drbg); |
101 | 0 | break; |
102 | 188k | case FEATURE_KE: |
103 | 188k | data = chunk_from_thing(feature->arg.ke); |
104 | 188k | break; |
105 | 250k | case FEATURE_PRIVKEY: |
106 | 250k | data = chunk_from_thing(feature->arg.privkey); |
107 | 250k | break; |
108 | 15.6k | case FEATURE_PRIVKEY_GEN: |
109 | 15.6k | data = chunk_from_thing(feature->arg.privkey_gen); |
110 | 15.6k | break; |
111 | 329k | case FEATURE_PUBKEY: |
112 | 329k | data = chunk_from_thing(feature->arg.pubkey); |
113 | 329k | break; |
114 | 188k | case FEATURE_PRIVKEY_SIGN: |
115 | 188k | data = chunk_from_thing(feature->arg.privkey_sign); |
116 | 188k | break; |
117 | 188k | case FEATURE_PUBKEY_VERIFY: |
118 | 188k | data = chunk_from_thing(feature->arg.pubkey_verify); |
119 | 188k | break; |
120 | 15.6k | case FEATURE_PRIVKEY_DECRYPT: |
121 | 15.6k | data = chunk_from_thing(feature->arg.privkey_decrypt); |
122 | 15.6k | break; |
123 | 15.6k | case FEATURE_PUBKEY_ENCRYPT: |
124 | 15.6k | data = chunk_from_thing(feature->arg.pubkey_encrypt); |
125 | 15.6k | break; |
126 | 313k | case FEATURE_CERT_DECODE: |
127 | 407k | case FEATURE_CERT_ENCODE: |
128 | 407k | data = chunk_from_thing(feature->arg.cert); |
129 | 407k | break; |
130 | 54.8k | case FEATURE_CONTAINER_DECODE: |
131 | 54.8k | case FEATURE_CONTAINER_ENCODE: |
132 | 54.8k | data = chunk_from_thing(feature->arg.container); |
133 | 54.8k | break; |
134 | 0 | case FEATURE_EAP_SERVER: |
135 | 0 | case FEATURE_EAP_PEER: |
136 | 0 | data = chunk_from_thing(feature->arg.eap); |
137 | 0 | break; |
138 | 0 | case FEATURE_CUSTOM: |
139 | 0 | data = chunk_create(feature->arg.custom, |
140 | 0 | strlen(feature->arg.custom)); |
141 | 0 | break; |
142 | 0 | case FEATURE_XAUTH_SERVER: |
143 | 0 | case FEATURE_XAUTH_PEER: |
144 | 0 | data = chunk_create(feature->arg.xauth, |
145 | 0 | strlen(feature->arg.xauth)); |
146 | 0 | break; |
147 | 2.36M | } |
148 | 2.36M | return chunk_hash_inc(chunk_from_thing(feature->type), |
149 | 2.36M | chunk_hash(data)); |
150 | 2.36M | } |
151 | | |
152 | | /** |
153 | | * See header. |
154 | | */ |
155 | | bool plugin_feature_matches(plugin_feature_t *a, plugin_feature_t *b) |
156 | 1.37M | { |
157 | 1.37M | if (a->type == b->type) |
158 | 1.37M | { |
159 | 1.37M | switch (a->type) |
160 | 1.37M | { |
161 | 0 | case FEATURE_NONE: |
162 | 0 | return FALSE; |
163 | 0 | case FEATURE_CRYPTER: |
164 | 0 | return a->arg.crypter.alg == b->arg.crypter.alg && |
165 | 0 | a->arg.crypter.key_size == b->arg.crypter.key_size; |
166 | 0 | case FEATURE_AEAD: |
167 | 0 | return a->arg.aead.alg == b->arg.aead.alg && |
168 | 0 | a->arg.aead.key_size == b->arg.aead.key_size; |
169 | 0 | case FEATURE_SIGNER: |
170 | 0 | return a->arg.signer == b->arg.signer; |
171 | 262k | case FEATURE_HASHER: |
172 | 262k | return a->arg.hasher == b->arg.hasher; |
173 | 7.84k | case FEATURE_PRF: |
174 | 7.84k | return a->arg.prf == b->arg.prf; |
175 | 0 | case FEATURE_XOF: |
176 | 0 | return a->arg.xof == b->arg.xof; |
177 | 0 | case FEATURE_KDF: |
178 | 0 | return a->arg.kdf == b->arg.kdf; |
179 | 0 | case FEATURE_DRBG: |
180 | 0 | return a->arg.drbg == b->arg.drbg; |
181 | 94.1k | case FEATURE_KE: |
182 | 94.1k | return a->arg.ke == b->arg.ke; |
183 | 0 | case FEATURE_RNG: |
184 | 0 | return a->arg.rng_quality <= b->arg.rng_quality; |
185 | 0 | case FEATURE_NONCE_GEN: |
186 | 0 | case FEATURE_RESOLVER: |
187 | 0 | return TRUE; |
188 | 196k | case FEATURE_PRIVKEY: |
189 | 203k | case FEATURE_PRIVKEY_GEN: |
190 | 478k | case FEATURE_PUBKEY: |
191 | 478k | return a->arg.privkey == b->arg.privkey; |
192 | 94.1k | case FEATURE_PRIVKEY_SIGN: |
193 | 188k | case FEATURE_PUBKEY_VERIFY: |
194 | 188k | return a->arg.privkey_sign == b->arg.privkey_sign; |
195 | 7.84k | case FEATURE_PRIVKEY_DECRYPT: |
196 | 15.6k | case FEATURE_PUBKEY_ENCRYPT: |
197 | 15.6k | return a->arg.privkey_decrypt == b->arg.privkey_decrypt; |
198 | 243k | case FEATURE_CERT_DECODE: |
199 | 290k | case FEATURE_CERT_ENCODE: |
200 | 290k | return a->arg.cert == b->arg.cert; |
201 | 39.2k | case FEATURE_CONTAINER_DECODE: |
202 | 39.2k | case FEATURE_CONTAINER_ENCODE: |
203 | 39.2k | return a->arg.container == b->arg.container; |
204 | 0 | case FEATURE_EAP_SERVER: |
205 | 0 | case FEATURE_EAP_PEER: |
206 | 0 | return a->arg.eap.vendor == b->arg.eap.vendor && |
207 | 0 | a->arg.eap.type == b->arg.eap.type; |
208 | 0 | case FEATURE_DATABASE: |
209 | 0 | return a->arg.database == DB_ANY || |
210 | 0 | a->arg.database == b->arg.database; |
211 | 0 | case FEATURE_FETCHER: |
212 | 0 | return a->arg.fetcher == NULL || |
213 | 0 | streq(a->arg.fetcher, b->arg.fetcher); |
214 | 0 | case FEATURE_CUSTOM: |
215 | 0 | return streq(a->arg.custom, b->arg.custom); |
216 | 0 | case FEATURE_XAUTH_SERVER: |
217 | 0 | case FEATURE_XAUTH_PEER: |
218 | 0 | return streq(a->arg.xauth, b->arg.xauth); |
219 | 1.37M | } |
220 | 1.37M | } |
221 | 0 | return FALSE; |
222 | 1.37M | } |
223 | | |
224 | | /** |
225 | | * See header. |
226 | | */ |
227 | | bool plugin_feature_equals(plugin_feature_t *a, plugin_feature_t *b) |
228 | 952k | { |
229 | 952k | if (a->type == b->type) |
230 | 952k | { |
231 | 952k | switch (a->type) |
232 | 952k | { |
233 | 0 | case FEATURE_NONE: |
234 | 0 | case FEATURE_CRYPTER: |
235 | 0 | case FEATURE_AEAD: |
236 | 0 | case FEATURE_SIGNER: |
237 | 113k | case FEATURE_HASHER: |
238 | 121k | case FEATURE_PRF: |
239 | 121k | case FEATURE_XOF: |
240 | 121k | case FEATURE_KDF: |
241 | 121k | case FEATURE_DRBG: |
242 | 215k | case FEATURE_KE: |
243 | 215k | case FEATURE_NONCE_GEN: |
244 | 215k | case FEATURE_RESOLVER: |
245 | 341k | case FEATURE_PRIVKEY: |
246 | 348k | case FEATURE_PRIVKEY_GEN: |
247 | 513k | case FEATURE_PUBKEY: |
248 | 607k | case FEATURE_PRIVKEY_SIGN: |
249 | 701k | case FEATURE_PUBKEY_VERIFY: |
250 | 709k | case FEATURE_PRIVKEY_DECRYPT: |
251 | 717k | case FEATURE_PUBKEY_ENCRYPT: |
252 | 882k | case FEATURE_CERT_DECODE: |
253 | 929k | case FEATURE_CERT_ENCODE: |
254 | 952k | case FEATURE_CONTAINER_DECODE: |
255 | 952k | case FEATURE_CONTAINER_ENCODE: |
256 | 952k | case FEATURE_EAP_SERVER: |
257 | 952k | case FEATURE_EAP_PEER: |
258 | 952k | case FEATURE_CUSTOM: |
259 | 952k | case FEATURE_XAUTH_SERVER: |
260 | 952k | case FEATURE_XAUTH_PEER: |
261 | 952k | return plugin_feature_matches(a, b); |
262 | 0 | case FEATURE_RNG: |
263 | 0 | return a->arg.rng_quality == b->arg.rng_quality; |
264 | 0 | case FEATURE_DATABASE: |
265 | 0 | return a->arg.database == b->arg.database; |
266 | 0 | case FEATURE_FETCHER: |
267 | 0 | if (a->arg.fetcher && b->arg.fetcher) |
268 | 0 | { |
269 | 0 | return streq(a->arg.fetcher, b->arg.fetcher); |
270 | 0 | } |
271 | 0 | return !a->arg.fetcher && !b->arg.fetcher; |
272 | 952k | } |
273 | 952k | } |
274 | 0 | return FALSE; |
275 | 952k | } |
276 | | |
277 | | /** |
278 | | * See header. |
279 | | */ |
280 | | char* plugin_feature_get_string(plugin_feature_t *feature) |
281 | 0 | { |
282 | 0 | char *str = NULL; |
283 | |
|
284 | 0 | if (feature->kind == FEATURE_REGISTER) |
285 | 0 | { |
286 | 0 | return strdup("(register function)"); |
287 | 0 | } |
288 | 0 | switch (feature->type) |
289 | 0 | { |
290 | 0 | case FEATURE_NONE: |
291 | 0 | return strdup("NONE"); |
292 | 0 | case FEATURE_CRYPTER: |
293 | 0 | if (asprintf(&str, "%N:%N-%d", plugin_feature_names, feature->type, |
294 | 0 | encryption_algorithm_names, feature->arg.crypter.alg, |
295 | 0 | feature->arg.crypter.key_size) > 0) |
296 | 0 | { |
297 | 0 | return str; |
298 | 0 | } |
299 | 0 | break; |
300 | 0 | case FEATURE_AEAD: |
301 | 0 | if (asprintf(&str, "%N:%N-%d", plugin_feature_names, feature->type, |
302 | 0 | encryption_algorithm_names, feature->arg.aead.alg, |
303 | 0 | feature->arg.aead.key_size) > 0) |
304 | 0 | { |
305 | 0 | return str; |
306 | 0 | } |
307 | 0 | break; |
308 | 0 | case FEATURE_SIGNER: |
309 | 0 | if (asprintf(&str, "%N:%N", plugin_feature_names, feature->type, |
310 | 0 | integrity_algorithm_names, feature->arg.signer) > 0) |
311 | 0 | { |
312 | 0 | return str; |
313 | 0 | } |
314 | 0 | break; |
315 | 0 | case FEATURE_HASHER: |
316 | 0 | if (asprintf(&str, "%N:%N", plugin_feature_names, feature->type, |
317 | 0 | hash_algorithm_names, feature->arg.hasher) > 0) |
318 | 0 | { |
319 | 0 | return str; |
320 | 0 | } |
321 | 0 | break; |
322 | 0 | case FEATURE_PRF: |
323 | 0 | if (asprintf(&str, "%N:%N", plugin_feature_names, feature->type, |
324 | 0 | pseudo_random_function_names, feature->arg.prf) > 0) |
325 | 0 | { |
326 | 0 | return str; |
327 | 0 | } |
328 | 0 | break; |
329 | 0 | case FEATURE_XOF: |
330 | 0 | if (asprintf(&str, "%N:%N", plugin_feature_names, feature->type, |
331 | 0 | ext_out_function_names, feature->arg.xof) > 0) |
332 | 0 | { |
333 | 0 | return str; |
334 | 0 | } |
335 | 0 | break; |
336 | 0 | case FEATURE_KDF: |
337 | 0 | if (asprintf(&str, "%N:%N", plugin_feature_names, feature->type, |
338 | 0 | key_derivation_function_names, feature->arg.kdf) > 0) |
339 | 0 | { |
340 | 0 | return str; |
341 | 0 | } |
342 | 0 | break; |
343 | 0 | case FEATURE_DRBG: |
344 | 0 | if (asprintf(&str, "%N:%N", plugin_feature_names, feature->type, |
345 | 0 | drbg_type_names, feature->arg.drbg) > 0) |
346 | 0 | { |
347 | 0 | return str; |
348 | 0 | } |
349 | 0 | break; |
350 | 0 | case FEATURE_KE: |
351 | 0 | if (asprintf(&str, "%N:%N", plugin_feature_names, feature->type, |
352 | 0 | key_exchange_method_names, feature->arg.ke) > 0) |
353 | 0 | { |
354 | 0 | return str; |
355 | 0 | } |
356 | 0 | break; |
357 | 0 | case FEATURE_RNG: |
358 | 0 | if (asprintf(&str, "%N:%N", plugin_feature_names, feature->type, |
359 | 0 | rng_quality_names, feature->arg.rng_quality) > 0) |
360 | 0 | { |
361 | 0 | return str; |
362 | 0 | } |
363 | 0 | break; |
364 | 0 | case FEATURE_NONCE_GEN: |
365 | 0 | case FEATURE_RESOLVER: |
366 | 0 | if (asprintf(&str, "%N", plugin_feature_names, feature->type) > 0) |
367 | 0 | { |
368 | 0 | return str; |
369 | 0 | } |
370 | 0 | break; |
371 | 0 | case FEATURE_PRIVKEY: |
372 | 0 | case FEATURE_PRIVKEY_GEN: |
373 | 0 | case FEATURE_PUBKEY: |
374 | 0 | if (asprintf(&str, "%N:%N", plugin_feature_names, feature->type, |
375 | 0 | key_type_names, feature->arg.privkey) > 0) |
376 | 0 | { |
377 | 0 | return str; |
378 | 0 | } |
379 | 0 | break; |
380 | 0 | case FEATURE_PRIVKEY_SIGN: |
381 | 0 | case FEATURE_PUBKEY_VERIFY: |
382 | 0 | if (asprintf(&str, "%N:%N", plugin_feature_names, feature->type, |
383 | 0 | signature_scheme_names, feature->arg.privkey_sign) > 0) |
384 | 0 | { |
385 | 0 | return str; |
386 | 0 | } |
387 | 0 | break; |
388 | 0 | case FEATURE_PRIVKEY_DECRYPT: |
389 | 0 | case FEATURE_PUBKEY_ENCRYPT: |
390 | 0 | if (asprintf(&str, "%N:%N", plugin_feature_names, feature->type, |
391 | 0 | encryption_scheme_names, feature->arg.privkey_decrypt) > 0) |
392 | 0 | { |
393 | 0 | return str; |
394 | 0 | } |
395 | 0 | break; |
396 | 0 | case FEATURE_CERT_DECODE: |
397 | 0 | case FEATURE_CERT_ENCODE: |
398 | 0 | if (asprintf(&str, "%N:%N", plugin_feature_names, feature->type, |
399 | 0 | certificate_type_names, feature->arg.cert) > 0) |
400 | 0 | { |
401 | 0 | return str; |
402 | 0 | } |
403 | 0 | break; |
404 | 0 | case FEATURE_CONTAINER_DECODE: |
405 | 0 | case FEATURE_CONTAINER_ENCODE: |
406 | 0 | if (asprintf(&str, "%N:%N", plugin_feature_names, feature->type, |
407 | 0 | container_type_names, feature->arg.container) > 0) |
408 | 0 | { |
409 | 0 | return str; |
410 | 0 | } |
411 | 0 | break; |
412 | 0 | case FEATURE_EAP_SERVER: |
413 | 0 | case FEATURE_EAP_PEER: |
414 | 0 | if (feature->arg.eap.vendor && |
415 | 0 | asprintf(&str, "%N:%d-%N", plugin_feature_names, feature->type, |
416 | 0 | feature->arg.eap.type, pen_names, feature->arg.eap.vendor) > 0) |
417 | 0 | { |
418 | 0 | return str; |
419 | 0 | } |
420 | 0 | else if (!feature->arg.eap.vendor && |
421 | 0 | asprintf(&str, "%N:%N", plugin_feature_names, feature->type, |
422 | 0 | eap_type_short_names, feature->arg.eap.type) > 0) |
423 | 0 | { |
424 | 0 | return str; |
425 | 0 | } |
426 | 0 | break; |
427 | 0 | case FEATURE_DATABASE: |
428 | 0 | if (asprintf(&str, "%N:%N", plugin_feature_names, feature->type, |
429 | 0 | db_driver_names, feature->arg.database) > 0) |
430 | 0 | { |
431 | 0 | return str; |
432 | 0 | } |
433 | 0 | break; |
434 | 0 | case FEATURE_FETCHER: |
435 | 0 | if (asprintf(&str, "%N:%s", plugin_feature_names, feature->type, |
436 | 0 | feature->arg.fetcher) > 0) |
437 | 0 | { |
438 | 0 | return str; |
439 | 0 | } |
440 | 0 | break; |
441 | 0 | case FEATURE_CUSTOM: |
442 | 0 | if (asprintf(&str, "%N:%s", plugin_feature_names, feature->type, |
443 | 0 | feature->arg.custom) > 0) |
444 | 0 | { |
445 | 0 | return str; |
446 | 0 | } |
447 | 0 | break; |
448 | 0 | case FEATURE_XAUTH_SERVER: |
449 | 0 | case FEATURE_XAUTH_PEER: |
450 | 0 | if (asprintf(&str, "%N:%s", plugin_feature_names, feature->type, |
451 | 0 | feature->arg.xauth) > 0) |
452 | 0 | { |
453 | 0 | return str; |
454 | 0 | } |
455 | 0 | break; |
456 | 0 | } |
457 | 0 | if (!str) |
458 | 0 | { |
459 | 0 | str = strdup("(invalid)"); |
460 | 0 | } |
461 | 0 | return str; |
462 | 0 | } |
463 | | |
464 | | /** |
465 | | * See header. |
466 | | */ |
467 | | bool plugin_feature_load(plugin_t *plugin, plugin_feature_t *feature, |
468 | | plugin_feature_t *reg) |
469 | 192k | { |
470 | 192k | char *name; |
471 | | |
472 | 192k | if (!reg) |
473 | 0 | { /* noting to do for this feature */ |
474 | 0 | return TRUE; |
475 | 0 | } |
476 | 192k | if (reg->kind == FEATURE_CALLBACK) |
477 | 0 | { |
478 | 0 | if (!reg->arg.cb.f || |
479 | 0 | reg->arg.cb.f(plugin, feature, TRUE, reg->arg.cb.data)) |
480 | 0 | { |
481 | 0 | return TRUE; |
482 | 0 | } |
483 | 0 | return FALSE; |
484 | 0 | } |
485 | 192k | name = plugin->get_name(plugin); |
486 | 192k | switch (feature->type) |
487 | 192k | { |
488 | 0 | case FEATURE_NONE: |
489 | 27.4k | case FEATURE_PRIVKEY_SIGN: |
490 | 31.3k | case FEATURE_PRIVKEY_DECRYPT: |
491 | 58.8k | case FEATURE_PUBKEY_VERIFY: |
492 | 58.8k | case FEATURE_PUBKEY_ENCRYPT: |
493 | 58.8k | case FEATURE_EAP_SERVER: |
494 | 58.8k | case FEATURE_EAP_PEER: |
495 | 58.8k | case FEATURE_XAUTH_SERVER: |
496 | 58.8k | case FEATURE_XAUTH_PEER: |
497 | 58.8k | case FEATURE_CUSTOM: |
498 | 58.8k | break; |
499 | 0 | case FEATURE_CRYPTER: |
500 | 0 | lib->crypto->add_crypter(lib->crypto, feature->arg.crypter.alg, |
501 | 0 | feature->arg.crypter.key_size, |
502 | 0 | name, reg->arg.reg.f); |
503 | 0 | break; |
504 | 0 | case FEATURE_AEAD: |
505 | 0 | lib->crypto->add_aead(lib->crypto, feature->arg.aead.alg, |
506 | 0 | feature->arg.aead.key_size, |
507 | 0 | name, reg->arg.reg.f); |
508 | 0 | break; |
509 | 0 | case FEATURE_SIGNER: |
510 | 0 | lib->crypto->add_signer(lib->crypto, feature->arg.signer, |
511 | 0 | name, reg->arg.reg.f); |
512 | 0 | break; |
513 | 19.6k | case FEATURE_HASHER: |
514 | 19.6k | lib->crypto->add_hasher(lib->crypto, feature->arg.hasher, |
515 | 19.6k | name, reg->arg.reg.f); |
516 | 19.6k | break; |
517 | 3.92k | case FEATURE_PRF: |
518 | 3.92k | lib->crypto->add_prf(lib->crypto, feature->arg.prf, |
519 | 3.92k | name, reg->arg.reg.f); |
520 | 3.92k | break; |
521 | 0 | case FEATURE_XOF: |
522 | 0 | lib->crypto->add_xof(lib->crypto, feature->arg.xof, |
523 | 0 | name, reg->arg.reg.f); |
524 | 0 | break; |
525 | 0 | case FEATURE_KDF: |
526 | 0 | lib->crypto->add_kdf(lib->crypto, feature->arg.kdf, |
527 | 0 | name, reg->arg.reg.f); |
528 | 0 | break; |
529 | 0 | case FEATURE_DRBG: |
530 | 0 | lib->crypto->add_drbg(lib->crypto, feature->arg.drbg, |
531 | 0 | name, reg->arg.reg.f); |
532 | 0 | break; |
533 | 0 | case FEATURE_KE: |
534 | 0 | lib->crypto->add_ke(lib->crypto, feature->arg.ke, |
535 | 0 | name, reg->arg.reg.f); |
536 | 0 | break; |
537 | 0 | case FEATURE_RNG: |
538 | 0 | lib->crypto->add_rng(lib->crypto, feature->arg.rng_quality, |
539 | 0 | name, reg->arg.reg.f); |
540 | 0 | break; |
541 | 0 | case FEATURE_NONCE_GEN: |
542 | 0 | lib->crypto->add_nonce_gen(lib->crypto, |
543 | 0 | name, reg->arg.reg.f); |
544 | 0 | break; |
545 | 19.6k | case FEATURE_PRIVKEY: |
546 | 19.6k | case FEATURE_PRIVKEY_GEN: |
547 | 19.6k | lib->creds->add_builder(lib->creds, CRED_PRIVATE_KEY, |
548 | 19.6k | feature->arg.privkey, reg->arg.reg.final, |
549 | 19.6k | name, reg->arg.reg.f); |
550 | 19.6k | break; |
551 | 19.6k | case FEATURE_PUBKEY: |
552 | 19.6k | lib->creds->add_builder(lib->creds, CRED_PUBLIC_KEY, |
553 | 19.6k | feature->arg.pubkey, reg->arg.reg.final, |
554 | 19.6k | name, reg->arg.reg.f); |
555 | 19.6k | break; |
556 | 50.9k | case FEATURE_CERT_DECODE: |
557 | 70.5k | case FEATURE_CERT_ENCODE: |
558 | 70.5k | lib->creds->add_builder(lib->creds, CRED_CERTIFICATE, |
559 | 70.5k | feature->arg.cert, reg->arg.reg.final, |
560 | 70.5k | name, reg->arg.reg.f); |
561 | 70.5k | break; |
562 | 0 | case FEATURE_CONTAINER_DECODE: |
563 | 0 | case FEATURE_CONTAINER_ENCODE: |
564 | 0 | lib->creds->add_builder(lib->creds, CRED_CONTAINER, |
565 | 0 | feature->arg.container, reg->arg.reg.final, |
566 | 0 | name, reg->arg.reg.f); |
567 | 0 | break; |
568 | 0 | case FEATURE_DATABASE: |
569 | 0 | lib->db->add_database(lib->db, reg->arg.reg.f); |
570 | 0 | break; |
571 | 0 | case FEATURE_FETCHER: |
572 | 0 | lib->fetcher->add_fetcher(lib->fetcher, reg->arg.reg.f, |
573 | 0 | feature->arg.fetcher); |
574 | 0 | break; |
575 | 0 | case FEATURE_RESOLVER: |
576 | 0 | lib->resolver->add_resolver(lib->resolver, reg->arg.reg.f); |
577 | 0 | break; |
578 | 192k | } |
579 | 192k | return TRUE; |
580 | 192k | } |
581 | | |
582 | | /** |
583 | | * See header. |
584 | | */ |
585 | | bool plugin_feature_unload(plugin_t *plugin, plugin_feature_t *feature, |
586 | | plugin_feature_t *reg) |
587 | 192k | { |
588 | 192k | if (!reg) |
589 | 0 | { /* noting to do for this feature */ |
590 | 0 | return TRUE; |
591 | 0 | } |
592 | 192k | if (reg->kind == FEATURE_CALLBACK) |
593 | 0 | { |
594 | 0 | if (!reg->arg.cb.f || |
595 | 0 | reg->arg.cb.f(plugin, feature, FALSE, reg->arg.cb.data)) |
596 | 0 | { |
597 | 0 | return TRUE; |
598 | 0 | } |
599 | 0 | return FALSE; |
600 | 0 | } |
601 | 192k | switch (feature->type) |
602 | 192k | { |
603 | 0 | case FEATURE_NONE: |
604 | 27.4k | case FEATURE_PRIVKEY_SIGN: |
605 | 31.3k | case FEATURE_PRIVKEY_DECRYPT: |
606 | 58.8k | case FEATURE_PUBKEY_VERIFY: |
607 | 58.8k | case FEATURE_PUBKEY_ENCRYPT: |
608 | 58.8k | case FEATURE_EAP_SERVER: |
609 | 58.8k | case FEATURE_EAP_PEER: |
610 | 58.8k | case FEATURE_XAUTH_SERVER: |
611 | 58.8k | case FEATURE_XAUTH_PEER: |
612 | 58.8k | case FEATURE_CUSTOM: |
613 | 58.8k | break; |
614 | 0 | case FEATURE_CRYPTER: |
615 | 0 | lib->crypto->remove_crypter(lib->crypto, reg->arg.reg.f); |
616 | 0 | break; |
617 | 0 | case FEATURE_AEAD: |
618 | 0 | lib->crypto->remove_aead(lib->crypto, reg->arg.reg.f); |
619 | 0 | break; |
620 | 0 | case FEATURE_SIGNER: |
621 | 0 | lib->crypto->remove_signer(lib->crypto, reg->arg.reg.f); |
622 | 0 | break; |
623 | 19.6k | case FEATURE_HASHER: |
624 | 19.6k | lib->crypto->remove_hasher(lib->crypto, reg->arg.reg.f); |
625 | 19.6k | break; |
626 | 3.92k | case FEATURE_PRF: |
627 | 3.92k | lib->crypto->remove_prf(lib->crypto, reg->arg.reg.f); |
628 | 3.92k | break; |
629 | 0 | case FEATURE_XOF: |
630 | 0 | lib->crypto->remove_xof(lib->crypto, reg->arg.reg.f); |
631 | 0 | break; |
632 | 0 | case FEATURE_KDF: |
633 | 0 | lib->crypto->remove_kdf(lib->crypto, reg->arg.reg.f); |
634 | 0 | break; |
635 | 0 | case FEATURE_DRBG: |
636 | 0 | lib->crypto->remove_drbg(lib->crypto, reg->arg.reg.f); |
637 | 0 | break; |
638 | 0 | case FEATURE_KE: |
639 | 0 | lib->crypto->remove_ke(lib->crypto, reg->arg.reg.f); |
640 | 0 | break; |
641 | 0 | case FEATURE_RNG: |
642 | 0 | lib->crypto->remove_rng(lib->crypto, reg->arg.reg.f); |
643 | 0 | break; |
644 | 0 | case FEATURE_NONCE_GEN: |
645 | 0 | lib->crypto->remove_nonce_gen(lib->crypto, reg->arg.reg.f); |
646 | 0 | break; |
647 | 19.6k | case FEATURE_PRIVKEY: |
648 | 19.6k | case FEATURE_PRIVKEY_GEN: |
649 | 19.6k | lib->creds->remove_builder(lib->creds, reg->arg.reg.f); |
650 | 19.6k | break; |
651 | 19.6k | case FEATURE_PUBKEY: |
652 | 19.6k | lib->creds->remove_builder(lib->creds, reg->arg.reg.f); |
653 | 19.6k | break; |
654 | 50.9k | case FEATURE_CERT_DECODE: |
655 | 70.5k | case FEATURE_CERT_ENCODE: |
656 | 70.5k | lib->creds->remove_builder(lib->creds, reg->arg.reg.f); |
657 | 70.5k | break; |
658 | 0 | case FEATURE_CONTAINER_DECODE: |
659 | 0 | case FEATURE_CONTAINER_ENCODE: |
660 | 0 | lib->creds->remove_builder(lib->creds, reg->arg.reg.f); |
661 | 0 | break; |
662 | 0 | case FEATURE_DATABASE: |
663 | 0 | lib->db->remove_database(lib->db, reg->arg.reg.f); |
664 | 0 | break; |
665 | 0 | case FEATURE_FETCHER: |
666 | 0 | lib->fetcher->remove_fetcher(lib->fetcher, reg->arg.reg.f); |
667 | 0 | break; |
668 | 0 | case FEATURE_RESOLVER: |
669 | 0 | lib->resolver->remove_resolver(lib->resolver, reg->arg.reg.f); |
670 | 0 | break; |
671 | 192k | } |
672 | 192k | return TRUE; |
673 | 192k | } |