Annotation of embedaddon/strongswan/src/libstrongswan/plugins/wolfssl/wolfssl_plugin.c, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (C) 2019 Sean Parkinson, wolfSSL Inc.
3: *
4: * Permission is hereby granted, free of charge, to any person obtaining a copy
5: * of this software and associated documentation files (the "Software"), to deal
6: * in the Software without restriction, including without limitation the rights
7: * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8: * copies of the Software, and to permit persons to whom the Software is
9: * furnished to do so, subject to the following conditions:
10: *
11: * The above copyright notice and this permission notice shall be included in
12: * all copies or substantial portions of the Software.
13: *
14: * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15: * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16: * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17: * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18: * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19: * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20: * THE SOFTWARE.
21: */
22:
23: #include <library.h>
24: #include <utils/debug.h>
25:
26: #include "wolfssl_common.h"
27: #include "wolfssl_plugin.h"
28: #include "wolfssl_aead.h"
29: #include "wolfssl_crypter.h"
30: #include "wolfssl_diffie_hellman.h"
31: #include "wolfssl_ec_diffie_hellman.h"
32: #include "wolfssl_ec_private_key.h"
33: #include "wolfssl_ec_public_key.h"
34: #include "wolfssl_ed_private_key.h"
35: #include "wolfssl_ed_public_key.h"
36: #include "wolfssl_hasher.h"
37: #include "wolfssl_hmac.h"
38: #include "wolfssl_rsa_private_key.h"
39: #include "wolfssl_rsa_public_key.h"
40: #include "wolfssl_rng.h"
41: #include "wolfssl_sha1_prf.h"
42: #include "wolfssl_x_diffie_hellman.h"
43:
44: #ifndef FIPS_MODE
45: #define FIPS_MODE 0
46: #endif
47:
48: typedef struct private_wolfssl_plugin_t private_wolfssl_plugin_t;
49:
50: /**
51: * Private data of wolfssl_plugin
52: */
53: struct private_wolfssl_plugin_t {
54:
55: /**
56: * Public interface
57: */
58: wolfssl_plugin_t public;
59: };
60:
61: METHOD(plugin_t, get_name, char*,
62: private_wolfssl_plugin_t *this)
63: {
64: return "wolfssl";
65: }
66:
67: METHOD(plugin_t, get_features, int,
68: private_wolfssl_plugin_t *this, plugin_feature_t *features[])
69: {
70: static plugin_feature_t f[] = {
71: /* crypters */
72: PLUGIN_REGISTER(CRYPTER, wolfssl_crypter_create),
73: #if !defined(NO_AES) && !defined(NO_AES_CTR)
74: PLUGIN_PROVIDE(CRYPTER, ENCR_AES_CTR, 16),
75: PLUGIN_PROVIDE(CRYPTER, ENCR_AES_CTR, 24),
76: PLUGIN_PROVIDE(CRYPTER, ENCR_AES_CTR, 32),
77: #endif
78: #if !defined(NO_AES) && !defined(NO_AES_CBC)
79: PLUGIN_PROVIDE(CRYPTER, ENCR_AES_CBC, 16),
80: PLUGIN_PROVIDE(CRYPTER, ENCR_AES_CBC, 24),
81: PLUGIN_PROVIDE(CRYPTER, ENCR_AES_CBC, 32),
82: #endif
83: #ifdef HAVE_CAMELLIA
84: PLUGIN_PROVIDE(CRYPTER, ENCR_CAMELLIA_CBC, 16),
85: PLUGIN_PROVIDE(CRYPTER, ENCR_CAMELLIA_CBC, 24),
86: PLUGIN_PROVIDE(CRYPTER, ENCR_CAMELLIA_CBC, 32),
87: #endif
88: #ifndef NO_DES3
89: PLUGIN_PROVIDE(CRYPTER, ENCR_3DES, 24),
90: PLUGIN_PROVIDE(CRYPTER, ENCR_DES, 8),
91: #ifdef WOLFSSL_DES_ECB
92: PLUGIN_PROVIDE(CRYPTER, ENCR_DES_ECB, 8),
93: #endif
94: #endif
95: PLUGIN_PROVIDE(CRYPTER, ENCR_NULL, 0),
96: /* hashers */
97: PLUGIN_REGISTER(HASHER, wolfssl_hasher_create),
98: #ifndef NO_MD5
99: PLUGIN_PROVIDE(HASHER, HASH_MD5),
100: #endif
101: #ifndef NO_SHA
102: PLUGIN_PROVIDE(HASHER, HASH_SHA1),
103: #endif
104: #ifdef WOLFSSL_SHA224
105: PLUGIN_PROVIDE(HASHER, HASH_SHA224),
106: #endif
107: #ifndef NO_SHA256
108: PLUGIN_PROVIDE(HASHER, HASH_SHA256),
109: #endif
110: #ifdef WOLFSSL_SHA384
111: PLUGIN_PROVIDE(HASHER, HASH_SHA384),
112: #endif
113: #ifdef WOLFSSL_SHA512
114: PLUGIN_PROVIDE(HASHER, HASH_SHA512),
115: #endif
116: #ifndef NO_SHA
117: /* keyed sha1 hasher (aka prf) */
118: PLUGIN_REGISTER(PRF, wolfssl_sha1_prf_create),
119: PLUGIN_PROVIDE(PRF, PRF_KEYED_SHA1),
120: #endif
121: #ifndef NO_HMAC
122: PLUGIN_REGISTER(PRF, wolfssl_hmac_prf_create),
123: #ifndef NO_MD5
124: PLUGIN_PROVIDE(PRF, PRF_HMAC_MD5),
125: #endif
126: #ifndef NO_SHA
127: PLUGIN_PROVIDE(PRF, PRF_HMAC_SHA1),
128: #endif
129: #ifndef NO_SHA256
130: PLUGIN_PROVIDE(PRF, PRF_HMAC_SHA2_256),
131: #endif
132: #ifdef WOLFSSL_SHA384
133: PLUGIN_PROVIDE(PRF, PRF_HMAC_SHA2_384),
134: #endif
135: #ifdef WOLFSSL_SHA512
136: PLUGIN_PROVIDE(PRF, PRF_HMAC_SHA2_512),
137: #endif
138: PLUGIN_REGISTER(SIGNER, wolfssl_hmac_signer_create),
139: #ifndef NO_MD5
140: PLUGIN_PROVIDE(SIGNER, AUTH_HMAC_MD5_96),
141: PLUGIN_PROVIDE(SIGNER, AUTH_HMAC_MD5_128),
142: #endif
143: #ifndef NO_SHA
144: PLUGIN_PROVIDE(SIGNER, AUTH_HMAC_SHA1_96),
145: PLUGIN_PROVIDE(SIGNER, AUTH_HMAC_SHA1_128),
146: PLUGIN_PROVIDE(SIGNER, AUTH_HMAC_SHA1_160),
147: #endif
148: #ifndef NO_SHA256
149: PLUGIN_PROVIDE(SIGNER, AUTH_HMAC_SHA2_256_128),
150: PLUGIN_PROVIDE(SIGNER, AUTH_HMAC_SHA2_256_256),
151: #endif
152: #ifdef WOLFSSL_SHA384
153: PLUGIN_PROVIDE(SIGNER, AUTH_HMAC_SHA2_384_192),
154: PLUGIN_PROVIDE(SIGNER, AUTH_HMAC_SHA2_384_384),
155: #endif
156: #ifdef WOLFSSL_SHA512
157: PLUGIN_PROVIDE(SIGNER, AUTH_HMAC_SHA2_512_256),
158: PLUGIN_PROVIDE(SIGNER, AUTH_HMAC_SHA2_512_512),
159: #endif
160: #endif /* NO_HMAC */
161: #if (!defined(NO_AES) && (defined(HAVE_AESGCM) || defined(HAVE_AESCCM))) || \
162: (defined(HAVE_CHACHA) && defined(HAVE_POLY1305))
163: PLUGIN_REGISTER(AEAD, wolfssl_aead_create),
164: #if !defined(NO_AES) && defined(HAVE_AESGCM)
165: PLUGIN_PROVIDE(AEAD, ENCR_AES_GCM_ICV16, 16),
166: PLUGIN_PROVIDE(AEAD, ENCR_AES_GCM_ICV16, 24),
167: PLUGIN_PROVIDE(AEAD, ENCR_AES_GCM_ICV16, 32),
168: #if WOLFSSL_MIN_AUTH_TAG_SZ <= 12
169: PLUGIN_PROVIDE(AEAD, ENCR_AES_GCM_ICV12, 16),
170: PLUGIN_PROVIDE(AEAD, ENCR_AES_GCM_ICV12, 24),
171: PLUGIN_PROVIDE(AEAD, ENCR_AES_GCM_ICV12, 32),
172: #endif
173: #if WOLFSSL_MIN_AUTH_TAG_SZ <= 8
174: PLUGIN_PROVIDE(AEAD, ENCR_AES_GCM_ICV8, 16),
175: PLUGIN_PROVIDE(AEAD, ENCR_AES_GCM_ICV8, 24),
176: PLUGIN_PROVIDE(AEAD, ENCR_AES_GCM_ICV8, 32),
177: #endif
178: #endif /* !NO_AES && HAVE_AESGCM */
179: #if !defined(NO_AES) && defined(HAVE_AESCCM)
180: PLUGIN_PROVIDE(AEAD, ENCR_AES_CCM_ICV16, 16),
181: PLUGIN_PROVIDE(AEAD, ENCR_AES_CCM_ICV16, 24),
182: PLUGIN_PROVIDE(AEAD, ENCR_AES_CCM_ICV16, 32),
183: PLUGIN_PROVIDE(AEAD, ENCR_AES_CCM_ICV12, 16),
184: PLUGIN_PROVIDE(AEAD, ENCR_AES_CCM_ICV12, 24),
185: PLUGIN_PROVIDE(AEAD, ENCR_AES_CCM_ICV12, 32),
186: PLUGIN_PROVIDE(AEAD, ENCR_AES_CCM_ICV8, 16),
187: PLUGIN_PROVIDE(AEAD, ENCR_AES_CCM_ICV8, 24),
188: PLUGIN_PROVIDE(AEAD, ENCR_AES_CCM_ICV8, 32),
189: #endif /* !NO_AES && HAVE_AESCCM */
190: #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
191: PLUGIN_PROVIDE(AEAD, ENCR_CHACHA20_POLY1305, 32),
192: #endif /* HAVE_CHACHA && HAVE_POLY1305 */
193: #endif
194: #ifdef HAVE_ECC_DHE
195: /* EC DH groups */
196: PLUGIN_REGISTER(DH, wolfssl_ec_diffie_hellman_create),
197: #if !defined(NO_ECC256) || defined(HAVE_ALL_CURVES)
198: PLUGIN_PROVIDE(DH, ECP_256_BIT),
199: #endif
200: #if defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)
201: PLUGIN_PROVIDE(DH, ECP_384_BIT),
202: #endif
203: #if defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)
204: PLUGIN_PROVIDE(DH, ECP_521_BIT),
205: #endif
206: #if defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)
207: PLUGIN_PROVIDE(DH, ECP_224_BIT),
208: #endif
209: #if defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)
210: PLUGIN_PROVIDE(DH, ECP_192_BIT),
211: #endif
212: #ifdef HAVE_BRAINPOOL
213: #if !define(NO_ECC256) || defined(HAVE_ALL_CURVES)
214: PLUGIN_PROVIDE(DH, ECP_256_BP),
215: #endif
216: #if defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)
217: PLUGIN_PROVIDE(DH, ECP_384_BP),
218: #endif
219: #if defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)
220: PLUGIN_PROVIDE(DH, ECP_512_BP),
221: #endif
222: #if defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)
223: PLUGIN_PROVIDE(DH, ECP_224_BP),
224: #endif
225: #endif
226: #endif /* HAVE_ECC_DHE */
227: #ifndef NO_DH
228: /* MODP DH groups */
229: PLUGIN_REGISTER(DH, wolfssl_diffie_hellman_create),
230: #if !defined(USE_FAST_MATH) || FP_MAX_BITS >= (3072 * 2)
231: PLUGIN_PROVIDE(DH, MODP_3072_BIT),
232: #endif
233: #if !defined(USE_FAST_MATH) || FP_MAX_BITS >= (4096 * 2)
234: PLUGIN_PROVIDE(DH, MODP_4096_BIT),
235: #endif
236: #if !defined(USE_FAST_MATH) || FP_MAX_BITS >= (6144 * 2)
237: PLUGIN_PROVIDE(DH, MODP_6144_BIT),
238: #endif
239: #if !defined(USE_FAST_MATH) || FP_MAX_BITS >= (8192 * 2)
240: PLUGIN_PROVIDE(DH, MODP_8192_BIT),
241: #endif
242: #if !defined(USE_FAST_MATH) || FP_MAX_BITS >= (2048 * 2)
243: PLUGIN_PROVIDE(DH, MODP_2048_BIT),
244: PLUGIN_PROVIDE(DH, MODP_2048_224),
245: PLUGIN_PROVIDE(DH, MODP_2048_256),
246: #endif
247: #if !defined(USE_FAST_MATH) || FP_MAX_BITS >= (1536 * 2)
248: PLUGIN_PROVIDE(DH, MODP_1536_BIT),
249: #endif
250: #if !defined(USE_FAST_MATH) || FP_MAX_BITS >= (1024 * 2)
251: PLUGIN_PROVIDE(DH, MODP_1024_BIT),
252: PLUGIN_PROVIDE(DH, MODP_1024_160),
253: #endif
254: #if !defined(USE_FAST_MATH) || FP_MAX_BITS >= (768 * 2)
255: PLUGIN_PROVIDE(DH, MODP_768_BIT),
256: #endif
257: PLUGIN_PROVIDE(DH, MODP_CUSTOM),
258: #endif /* NO_DH */
259: #ifndef NO_RSA
260: /* RSA private/public key loading */
261: PLUGIN_REGISTER(PRIVKEY, wolfssl_rsa_private_key_load, TRUE),
262: PLUGIN_PROVIDE(PRIVKEY, KEY_RSA),
263: PLUGIN_PROVIDE(PRIVKEY, KEY_ANY),
264: PLUGIN_REGISTER(PUBKEY, wolfssl_rsa_public_key_load, TRUE),
265: PLUGIN_PROVIDE(PUBKEY, KEY_RSA),
266: #ifdef WOLFSSL_KEY_GEN
267: PLUGIN_REGISTER(PRIVKEY_GEN, wolfssl_rsa_private_key_gen, FALSE),
268: PLUGIN_PROVIDE(PRIVKEY_GEN, KEY_RSA),
269: #endif
270: /* signature/encryption schemes */
271: PLUGIN_PROVIDE(PRIVKEY_SIGN, SIGN_RSA_EMSA_PKCS1_NULL),
272: PLUGIN_PROVIDE(PUBKEY_VERIFY, SIGN_RSA_EMSA_PKCS1_NULL),
273: #ifdef WC_RSA_PSS
274: PLUGIN_PROVIDE(PRIVKEY_SIGN, SIGN_RSA_EMSA_PSS),
275: PLUGIN_PROVIDE(PUBKEY_VERIFY, SIGN_RSA_EMSA_PSS),
276: #endif
277: #ifndef NO_SHA
278: PLUGIN_PROVIDE(PRIVKEY_SIGN, SIGN_RSA_EMSA_PKCS1_SHA1),
279: PLUGIN_PROVIDE(PUBKEY_VERIFY, SIGN_RSA_EMSA_PKCS1_SHA1),
280: #endif
281: #ifdef WOLFSSL_SHA224
282: PLUGIN_PROVIDE(PRIVKEY_SIGN, SIGN_RSA_EMSA_PKCS1_SHA2_224),
283: PLUGIN_PROVIDE(PUBKEY_VERIFY, SIGN_RSA_EMSA_PKCS1_SHA2_224),
284: #endif
285: #ifndef NO_SHA256
286: PLUGIN_PROVIDE(PRIVKEY_SIGN, SIGN_RSA_EMSA_PKCS1_SHA2_256),
287: PLUGIN_PROVIDE(PUBKEY_VERIFY, SIGN_RSA_EMSA_PKCS1_SHA2_256),
288: #endif
289: #ifdef WOLFSSL_SHA384
290: PLUGIN_PROVIDE(PRIVKEY_SIGN, SIGN_RSA_EMSA_PKCS1_SHA2_384),
291: PLUGIN_PROVIDE(PUBKEY_VERIFY, SIGN_RSA_EMSA_PKCS1_SHA2_384),
292: #endif
293: #ifdef WOLFSSL_SHA512
294: PLUGIN_PROVIDE(PRIVKEY_SIGN, SIGN_RSA_EMSA_PKCS1_SHA2_512),
295: PLUGIN_PROVIDE(PUBKEY_VERIFY, SIGN_RSA_EMSA_PKCS1_SHA2_512),
296: #endif
297: #ifndef NO_MD5
298: PLUGIN_PROVIDE(PRIVKEY_SIGN, SIGN_RSA_EMSA_PKCS1_MD5),
299: PLUGIN_PROVIDE(PUBKEY_VERIFY, SIGN_RSA_EMSA_PKCS1_MD5),
300: #endif
301: PLUGIN_PROVIDE(PRIVKEY_DECRYPT, ENCRYPT_RSA_PKCS1),
302: PLUGIN_PROVIDE(PUBKEY_ENCRYPT, ENCRYPT_RSA_PKCS1),
303: #ifndef WC_NO_RSA_OAEP
304: #ifndef NO_SHA
305: PLUGIN_PROVIDE(PUBKEY_ENCRYPT, ENCRYPT_RSA_OAEP_SHA1),
306: PLUGIN_PROVIDE(PRIVKEY_DECRYPT, ENCRYPT_RSA_OAEP_SHA1),
307: #endif
308: #ifdef WOLFSSL_SHA224
309: PLUGIN_PROVIDE(PUBKEY_ENCRYPT, ENCRYPT_RSA_OAEP_SHA224),
310: PLUGIN_PROVIDE(PRIVKEY_DECRYPT, ENCRYPT_RSA_OAEP_SHA224),
311: #endif
312: #ifndef NO_SHA256
313: PLUGIN_PROVIDE(PUBKEY_ENCRYPT, ENCRYPT_RSA_OAEP_SHA256),
314: PLUGIN_PROVIDE(PRIVKEY_DECRYPT, ENCRYPT_RSA_OAEP_SHA256),
315: #endif
316: #ifdef WOLFSSL_SHA384
317: PLUGIN_PROVIDE(PUBKEY_ENCRYPT, ENCRYPT_RSA_OAEP_SHA384),
318: PLUGIN_PROVIDE(PRIVKEY_DECRYPT, ENCRYPT_RSA_OAEP_SHA384),
319: #endif
320: #ifdef WOLFSSL_SHA512
321: PLUGIN_PROVIDE(PUBKEY_ENCRYPT, ENCRYPT_RSA_OAEP_SHA512),
322: PLUGIN_PROVIDE(PRIVKEY_DECRYPT, ENCRYPT_RSA_OAEP_SHA512),
323: #endif
324: #endif /* !WC_NO_RSA_OAEP */
325: #endif /* !NO_RSA */
326: #ifdef HAVE_ECC
327: #ifdef HAVE_ECC_KEY_IMPORT
328: /* EC private/public key loading */
329: PLUGIN_REGISTER(PRIVKEY, wolfssl_ec_private_key_load, TRUE),
330: PLUGIN_PROVIDE(PRIVKEY, KEY_ECDSA),
331: PLUGIN_PROVIDE(PRIVKEY, KEY_ANY),
332: #endif
333: #ifdef HAVE_ECC_DHE
334: PLUGIN_REGISTER(PRIVKEY_GEN, wolfssl_ec_private_key_gen, FALSE),
335: PLUGIN_PROVIDE(PRIVKEY_GEN, KEY_ECDSA),
336: #endif
337: #ifdef HAVE_ECC_KEY_IMPORT
338: PLUGIN_REGISTER(PUBKEY, wolfssl_ec_public_key_load, TRUE),
339: PLUGIN_PROVIDE(PUBKEY, KEY_ECDSA),
340: #endif
341: #ifdef HAVE_ECC_SIGN
342: /* signature encryption schemes */
343: PLUGIN_PROVIDE(PRIVKEY_SIGN, SIGN_ECDSA_WITH_NULL),
344: #ifndef NO_SHA
345: PLUGIN_PROVIDE(PRIVKEY_SIGN, SIGN_ECDSA_WITH_SHA1_DER),
346: #endif
347: #ifndef NO_SHA256
348: PLUGIN_PROVIDE(PRIVKEY_SIGN, SIGN_ECDSA_WITH_SHA256_DER),
349: PLUGIN_PROVIDE(PRIVKEY_SIGN, SIGN_ECDSA_256),
350: #endif
351: #ifdef WOLFSSL_SHA384
352: PLUGIN_PROVIDE(PRIVKEY_SIGN, SIGN_ECDSA_WITH_SHA384_DER),
353: PLUGIN_PROVIDE(PRIVKEY_SIGN, SIGN_ECDSA_384),
354: #endif
355: #ifdef WOLFSSL_SHA512
356: PLUGIN_PROVIDE(PRIVKEY_SIGN, SIGN_ECDSA_WITH_SHA512_DER),
357: PLUGIN_PROVIDE(PRIVKEY_SIGN, SIGN_ECDSA_521),
358: #endif
359: #endif /* HAVE_ECC_SIGN */
360: #ifdef HAVE_ECC_VERIFY
361: /* signature encryption schemes */
362: PLUGIN_PROVIDE(PUBKEY_VERIFY, SIGN_ECDSA_WITH_NULL),
363: #ifndef NO_SHA
364: PLUGIN_PROVIDE(PUBKEY_VERIFY, SIGN_ECDSA_WITH_SHA1_DER),
365: #endif
366: #ifndef NO_SHA256
367: PLUGIN_PROVIDE(PUBKEY_VERIFY, SIGN_ECDSA_WITH_SHA256_DER),
368: PLUGIN_PROVIDE(PUBKEY_VERIFY, SIGN_ECDSA_256),
369: #endif
370: #ifdef WOLFSSL_SHA384
371: PLUGIN_PROVIDE(PUBKEY_VERIFY, SIGN_ECDSA_WITH_SHA384_DER),
372: PLUGIN_PROVIDE(PUBKEY_VERIFY, SIGN_ECDSA_384),
373: #endif
374: #ifdef WOLFSSL_SHA512
375: PLUGIN_PROVIDE(PUBKEY_VERIFY, SIGN_ECDSA_WITH_SHA512_DER),
376: PLUGIN_PROVIDE(PUBKEY_VERIFY, SIGN_ECDSA_521),
377: #endif
378: #endif /* HAVE_ECC_VERIFY */
379: #endif /* HAVE_ECC */
380: #ifdef HAVE_CURVE25519
381: PLUGIN_REGISTER(DH, wolfssl_x_diffie_hellman_create),
382: PLUGIN_PROVIDE(DH, CURVE_25519),
383: #endif
384: #ifdef HAVE_ED25519
385: /* EdDSA private/public key loading */
386: PLUGIN_REGISTER(PUBKEY, wolfssl_ed_public_key_load, TRUE),
387: PLUGIN_PROVIDE(PUBKEY, KEY_ED25519),
388: PLUGIN_REGISTER(PRIVKEY, wolfssl_ed_private_key_load, TRUE),
389: PLUGIN_PROVIDE(PRIVKEY, KEY_ED25519),
390: PLUGIN_REGISTER(PRIVKEY_GEN, wolfssl_ed_private_key_gen, FALSE),
391: PLUGIN_PROVIDE(PRIVKEY_GEN, KEY_ED25519),
392: #ifdef HAVE_ED25519_SIGN
393: PLUGIN_PROVIDE(PRIVKEY_SIGN, SIGN_ED25519),
394: #endif
395: #ifdef HAVE_ED25519_VERIFY
396: PLUGIN_PROVIDE(PUBKEY_VERIFY, SIGN_ED25519),
397: #endif
398: /* register a pro forma identity hasher, never instantiated */
399: PLUGIN_REGISTER(HASHER, return_null),
400: PLUGIN_PROVIDE(HASHER, HASH_IDENTITY),
401: #endif /* HAVE_ED25519 */
402: #ifndef WC_NO_RNG
403: /* generic key loader */
404: PLUGIN_REGISTER(RNG, wolfssl_rng_create),
405: PLUGIN_PROVIDE(RNG, RNG_STRONG),
406: PLUGIN_PROVIDE(RNG, RNG_WEAK),
407: #endif
408: };
409: *features = f;
410: return countof(f);
411: }
412:
413: METHOD(plugin_t, destroy, void,
414: private_wolfssl_plugin_t *this)
415: {
416: #ifndef WC_NO_RNG
417: wolfssl_rng_global_final();
418: #endif
419: wolfSSL_Cleanup();
420:
421: free(this);
422: }
423:
424: /*
425: * Described in header
426: */
427: plugin_t *wolfssl_plugin_create()
428: {
429: private_wolfssl_plugin_t *this;
430: bool fips_mode;
431:
432: fips_mode = lib->settings->get_bool(lib->settings,
433: "%s.plugins.wolfssl.fips_mode", FALSE, lib->ns);
434: #ifdef HAVE_FIPS
435: if (fips_mode)
436: {
437: int ret = wolfCrypt_GetStatus_fips();
438: if (ret != 0)
439: {
440: DBG1(DBG_LIB, "wolfssl FIPS mode unavailable (%d)", ret);
441: return NULL;
442: }
443: }
444: #else
445: if (fips_mode)
446: {
447: DBG1(DBG_LIB, "wolfssl FIPS mode unavailable");
448: return NULL;
449: }
450: #endif
451:
452: wolfSSL_Init();
453: #ifndef WC_NO_RNG
454: if (!wolfssl_rng_global_init())
455: {
456: return NULL;
457: }
458: #endif
459:
460: INIT(this,
461: .public = {
462: .plugin = {
463: .get_name = _get_name,
464: .get_features = _get_features,
465: .destroy = _destroy,
466: },
467: },
468: );
469:
470: return &this->public.plugin;
471: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>