Annotation of embedaddon/strongswan/src/libstrongswan/plugins/openssl/openssl_plugin.c, revision 1.1.1.2
1.1 misho 1: /*
2: * Copyright (C) 2008-2020 Tobias Brunner
3: * Copyright (C) 2008 Martin Willi
4: * HSR Hochschule fuer Technik Rapperswil
5: *
6: * This program is free software; you can redistribute it and/or modify it
7: * under the terms of the GNU General Public License as published by the
8: * Free Software Foundation; either version 2 of the License, or (at your
9: * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
10: *
11: * This program is distributed in the hope that it will be useful, but
12: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14: * for more details.
15: */
16:
17: #include <library.h>
18: #include <utils/debug.h>
19: #include <threading/thread.h>
20: #include <threading/mutex.h>
21: #include <threading/thread_value.h>
22:
23: #include <openssl/err.h>
24: #include <openssl/evp.h>
25: #include <openssl/conf.h>
26: #include <openssl/rand.h>
27: #include <openssl/crypto.h>
28: #ifndef OPENSSL_NO_ENGINE
29: #include <openssl/engine.h>
30: #endif
31:
32: #include "openssl_plugin.h"
33: #include "openssl_util.h"
34: #include "openssl_crypter.h"
35: #include "openssl_hasher.h"
36: #include "openssl_sha1_prf.h"
37: #include "openssl_diffie_hellman.h"
38: #include "openssl_ec_diffie_hellman.h"
39: #include "openssl_rsa_private_key.h"
40: #include "openssl_rsa_public_key.h"
41: #include "openssl_ec_private_key.h"
42: #include "openssl_ec_public_key.h"
43: #include "openssl_x509.h"
44: #include "openssl_crl.h"
45: #include "openssl_pkcs7.h"
46: #include "openssl_pkcs12.h"
47: #include "openssl_rng.h"
48: #include "openssl_hmac.h"
49: #include "openssl_aead.h"
50: #include "openssl_x_diffie_hellman.h"
51: #include "openssl_ed_public_key.h"
52: #include "openssl_ed_private_key.h"
53: #include "openssl_xof.h"
54:
55: #ifndef FIPS_MODE
56: #define FIPS_MODE 0
57: #endif
58:
59: typedef struct private_openssl_plugin_t private_openssl_plugin_t;
60:
61: /**
62: * private data of openssl_plugin
63: */
64: struct private_openssl_plugin_t {
65:
66: /**
67: * public functions
68: */
69: openssl_plugin_t public;
70: };
71:
72: /**
73: * OpenSSL is thread-safe since 1.1.0
74: */
75: #if OPENSSL_VERSION_NUMBER < 0x10100000L
76:
77: /**
1.1.1.2 ! misho 78: * Array of static mutexes, with CRYPTO_num_locks() mutex
1.1 misho 79: */
80: static mutex_t **mutex = NULL;
81:
82: /**
83: * Locking callback for static locks
84: */
85: static void locking_function(int mode, int type, const char *file, int line)
86: {
87: if (mutex)
88: {
89: if (mode & CRYPTO_LOCK)
90: {
91: mutex[type]->lock(mutex[type]);
92: }
93: else
94: {
95: mutex[type]->unlock(mutex[type]);
96: }
97: }
98: }
99:
100: /**
101: * Implementation of dynlock
102: */
103: struct CRYPTO_dynlock_value {
104: mutex_t *mutex;
105: };
106:
107: /**
108: * Callback to create a dynamic lock
109: */
110: static struct CRYPTO_dynlock_value *create_function(const char *file, int line)
111: {
112: struct CRYPTO_dynlock_value *lock;
113:
114: lock = malloc_thing(struct CRYPTO_dynlock_value);
115: lock->mutex = mutex_create(MUTEX_TYPE_DEFAULT);
116: return lock;
117: }
118:
119: /**
120: * Callback to (un-)lock a dynamic lock
121: */
122: static void lock_function(int mode, struct CRYPTO_dynlock_value *lock,
123: const char *file, int line)
124: {
125: if (mode & CRYPTO_LOCK)
126: {
127: lock->mutex->lock(lock->mutex);
128: }
129: else
130: {
131: lock->mutex->unlock(lock->mutex);
132: }
133: }
134:
135: /**
136: * Callback to destroy a dynamic lock
137: */
138: static void destroy_function(struct CRYPTO_dynlock_value *lock,
139: const char *file, int line)
140: {
141: lock->mutex->destroy(lock->mutex);
142: free(lock);
143: }
144:
145: /**
146: * Thread-local value used to cleanup thread-specific error buffers
147: */
148: static thread_value_t *cleanup;
149:
150: /**
151: * Called when a thread is destroyed. Avoid recursion by setting the thread id
152: * explicitly.
153: */
154: static void cleanup_thread(void *arg)
155: {
156: #if OPENSSL_VERSION_NUMBER >= 0x1000000fL
157: CRYPTO_THREADID tid;
158:
159: CRYPTO_THREADID_set_numeric(&tid, (u_long)(uintptr_t)arg);
160: ERR_remove_thread_state(&tid);
161: #else
162: ERR_remove_state((u_long)(uintptr_t)arg);
163: #endif
164: }
165:
166: /**
167: * Thread-ID callback function
168: */
169: static u_long id_function(void)
170: {
171: u_long id;
172:
173: /* ensure the thread ID is never zero, otherwise OpenSSL might try to
174: * acquire locks recursively */
175: id = 1 + (u_long)thread_current_id();
176:
177: /* cleanup a thread's state later if OpenSSL interacted with it */
178: cleanup->set(cleanup, (void*)(uintptr_t)id);
179: return id;
180: }
181:
182: #if OPENSSL_VERSION_NUMBER >= 0x1000000fL
183: /**
184: * Callback for thread ID
185: */
186: static void threadid_function(CRYPTO_THREADID *threadid)
187: {
188: CRYPTO_THREADID_set_numeric(threadid, id_function());
189: }
190: #endif /* OPENSSL_VERSION_NUMBER */
191:
192: /**
193: * initialize OpenSSL for multi-threaded use
194: */
195: static void threading_init()
196: {
197: int i, num_locks;
198:
199: cleanup = thread_value_create(cleanup_thread);
200:
201: #if OPENSSL_VERSION_NUMBER >= 0x1000000fL
202: CRYPTO_THREADID_set_callback(threadid_function);
203: #else
204: CRYPTO_set_id_callback(id_function);
205: #endif
206:
207: CRYPTO_set_locking_callback(locking_function);
208:
209: CRYPTO_set_dynlock_create_callback(create_function);
210: CRYPTO_set_dynlock_lock_callback(lock_function);
211: CRYPTO_set_dynlock_destroy_callback(destroy_function);
212:
213: num_locks = CRYPTO_num_locks();
214: mutex = malloc(sizeof(mutex_t*) * num_locks);
215: for (i = 0; i < num_locks; i++)
216: {
217: mutex[i] = mutex_create(MUTEX_TYPE_DEFAULT);
218: }
219: }
220:
221: /**
222: * cleanup OpenSSL threading locks
223: */
224: static void threading_cleanup()
225: {
226: int i, num_locks;
227:
228: num_locks = CRYPTO_num_locks();
229: for (i = 0; i < num_locks; i++)
230: {
231: mutex[i]->destroy(mutex[i]);
232: }
233: free(mutex);
234: mutex = NULL;
235:
236: cleanup->destroy(cleanup);
237: }
238:
239: #else /* OPENSSL_VERSION_NUMBER */
240:
241: #define threading_init()
242:
243: #define threading_cleanup()
244:
245: #endif
246:
247: #if OPENSSL_VERSION_NUMBER < 0x1010100fL
248: /**
249: * Seed the OpenSSL RNG, if required
250: * Not necessary anymore with OpenSSL 1.1.1 (maybe wasn't already earlier, but
251: * it's now explicitly mentioned in the documentation).
252: */
253: static bool seed_rng()
254: {
255: rng_t *rng = NULL;
256: char buf[32];
257:
258: while (RAND_status() != 1)
259: {
260: if (!rng)
261: {
262: rng = lib->crypto->create_rng(lib->crypto, RNG_STRONG);
263: if (!rng)
264: {
265: return FALSE;
266: }
267: }
268: if (!rng->get_bytes(rng, sizeof(buf), buf))
269: {
270: rng->destroy(rng);
271: return FALSE;
272: }
273: RAND_seed(buf, sizeof(buf));
274: }
275: DESTROY_IF(rng);
276: return TRUE;
277: }
278: #endif /* OPENSSL_VERSION_NUMBER */
279:
280: /**
281: * Generic key loader
282: */
283: static private_key_t *openssl_private_key_load(key_type_t type, va_list args)
284: {
285: chunk_t blob = chunk_empty;
286: EVP_PKEY *key;
287:
288: while (TRUE)
289: {
290: switch (va_arg(args, builder_part_t))
291: {
292: case BUILD_BLOB_ASN1_DER:
293: blob = va_arg(args, chunk_t);
294: continue;
295: case BUILD_END:
296: break;
297: default:
298: return NULL;
299: }
300: break;
301: }
302:
303: if (blob.ptr)
304: {
305: key = d2i_AutoPrivateKey(NULL, (const u_char**)&blob.ptr, blob.len);
306: if (key)
307: {
308: switch (EVP_PKEY_base_id(key))
309: {
310: #ifndef OPENSSL_NO_RSA
311: case EVP_PKEY_RSA:
312: return openssl_rsa_private_key_create(key, FALSE);
313: #endif
314: #ifndef OPENSSL_NO_ECDSA
315: case EVP_PKEY_EC:
316: return openssl_ec_private_key_create(key, FALSE);
317: #endif
318: #if OPENSSL_VERSION_NUMBER >= 0x1010100fL && !defined(OPENSSL_NO_EC)
319: case EVP_PKEY_ED25519:
320: case EVP_PKEY_ED448:
321: return openssl_ed_private_key_create(key, FALSE);
322: #endif /* OPENSSL_VERSION_NUMBER */
323: default:
324: EVP_PKEY_free(key);
325: break;
326: }
327: }
328: }
329: return NULL;
330: }
331:
332: #ifndef OPENSSL_NO_ENGINE
333: /**
334: * Login to engine with a PIN specified for a keyid
335: */
336: static bool login(ENGINE *engine, chunk_t keyid)
337: {
338: enumerator_t *enumerator;
339: shared_key_t *shared;
340: identification_t *id;
341: chunk_t key;
342: char pin[64];
343: bool found = FALSE, success = FALSE;
344:
345: id = identification_create_from_encoding(ID_KEY_ID, keyid);
346: enumerator = lib->credmgr->create_shared_enumerator(lib->credmgr,
347: SHARED_PIN, id, NULL);
348: while (enumerator->enumerate(enumerator, &shared, NULL, NULL))
349: {
350: found = TRUE;
351: key = shared->get_key(shared);
352: if (snprintf(pin, sizeof(pin),
353: "%.*s", (int)key.len, key.ptr) >= sizeof(pin))
354: {
355: continue;
356: }
357: if (ENGINE_ctrl_cmd_string(engine, "PIN", pin, 0))
358: {
359: success = TRUE;
360: break;
361: }
362: else
363: {
364: DBG1(DBG_CFG, "setting PIN on engine failed");
365: }
366: }
367: enumerator->destroy(enumerator);
368: id->destroy(id);
369: if (!found)
370: {
371: DBG1(DBG_CFG, "no PIN found for %#B", &keyid);
372: }
373: return success;
374: }
375: #endif /* OPENSSL_NO_ENGINE */
376:
377: /**
378: * Load private key via engine
379: */
380: static private_key_t *openssl_private_key_connect(key_type_t type,
381: va_list args)
382: {
383: #ifndef OPENSSL_NO_ENGINE
384: char *engine_id = NULL;
385: char keyname[BUF_LEN];
386: chunk_t keyid = chunk_empty;
387: EVP_PKEY *key;
388: ENGINE *engine;
389: int slot = -1;
390:
391: while (TRUE)
392: {
393: switch (va_arg(args, builder_part_t))
394: {
395: case BUILD_PKCS11_KEYID:
396: keyid = va_arg(args, chunk_t);
397: continue;
398: case BUILD_PKCS11_SLOT:
399: slot = va_arg(args, int);
400: continue;
401: case BUILD_PKCS11_MODULE:
402: engine_id = va_arg(args, char*);
403: continue;
404: case BUILD_END:
405: break;
406: default:
407: return NULL;
408: }
409: break;
410: }
411: if (!keyid.len)
412: {
413: return NULL;
414: }
415:
416: memset(keyname, 0, sizeof(keyname));
417: if (slot != -1)
418: {
419: snprintf(keyname, sizeof(keyname), "%d:", slot);
420: }
421: if (sizeof(keyname) - strlen(keyname) <= keyid.len * 2 + 1)
422: {
423: return NULL;
424: }
425: chunk_to_hex(keyid, keyname + strlen(keyname), FALSE);
426:
427: if (!engine_id)
428: {
429: engine_id = lib->settings->get_str(lib->settings,
430: "%s.plugins.openssl.engine_id", "pkcs11", lib->ns);
431: }
432: engine = ENGINE_by_id(engine_id);
433: if (!engine)
434: {
435: DBG2(DBG_LIB, "engine '%s' is not available", engine_id);
436: return NULL;
437: }
438: if (!ENGINE_init(engine))
439: {
440: DBG1(DBG_LIB, "failed to initialize engine '%s'", engine_id);
441: ENGINE_free(engine);
442: return NULL;
443: }
444: ENGINE_free(engine);
445: if (!login(engine, keyid))
446: {
447: DBG1(DBG_LIB, "login to engine '%s' failed", engine_id);
448: ENGINE_finish(engine);
449: return NULL;
450: }
451: key = ENGINE_load_private_key(engine, keyname, NULL, NULL);
452: ENGINE_finish(engine);
453: if (!key)
454: {
455: DBG1(DBG_LIB, "failed to load private key with ID '%s' from "
456: "engine '%s'", keyname, engine_id);
457: return NULL;
458: }
459:
460: switch (EVP_PKEY_base_id(key))
461: {
462: #ifndef OPENSSL_NO_RSA
463: case EVP_PKEY_RSA:
464: return openssl_rsa_private_key_create(key, TRUE);
465: #endif
466: #ifndef OPENSSL_NO_ECDSA
467: case EVP_PKEY_EC:
468: return openssl_ec_private_key_create(key, TRUE);
469: #endif
470: #if OPENSSL_VERSION_NUMBER >= 0x1010100fL && !defined(OPENSSL_NO_EC)
471: case EVP_PKEY_ED25519:
472: case EVP_PKEY_ED448:
473: return openssl_ed_private_key_create(key, TRUE);
474: #endif /* OPENSSL_VERSION_NUMBER */
475: default:
476: EVP_PKEY_free(key);
477: break;
478: }
479: #endif /* OPENSSL_NO_ENGINE */
480: return NULL;
481: }
482:
483: METHOD(plugin_t, get_name, char*,
484: private_openssl_plugin_t *this)
485: {
486: return "openssl";
487: }
488:
489: METHOD(plugin_t, get_features, int,
490: private_openssl_plugin_t *this, plugin_feature_t *features[])
491: {
492: static plugin_feature_t f[] = {
493: /* we provide OpenSSL threading callbacks */
494: PLUGIN_PROVIDE(CUSTOM, "openssl-threading"),
495: /* crypters */
496: PLUGIN_REGISTER(CRYPTER, openssl_crypter_create),
497: #ifndef OPENSSL_NO_AES
498: PLUGIN_PROVIDE(CRYPTER, ENCR_AES_CBC, 16),
499: PLUGIN_PROVIDE(CRYPTER, ENCR_AES_CBC, 24),
500: PLUGIN_PROVIDE(CRYPTER, ENCR_AES_CBC, 32),
501: PLUGIN_PROVIDE(CRYPTER, ENCR_AES_ECB, 16),
502: PLUGIN_PROVIDE(CRYPTER, ENCR_AES_ECB, 24),
503: PLUGIN_PROVIDE(CRYPTER, ENCR_AES_ECB, 32),
504: #endif
505: #ifndef OPENSSL_NO_CAMELLIA
506: PLUGIN_PROVIDE(CRYPTER, ENCR_CAMELLIA_CBC, 16),
507: PLUGIN_PROVIDE(CRYPTER, ENCR_CAMELLIA_CBC, 24),
508: PLUGIN_PROVIDE(CRYPTER, ENCR_CAMELLIA_CBC, 32),
509: #endif
510: #ifndef OPENSSL_NO_RC5
511: PLUGIN_PROVIDE(CRYPTER, ENCR_RC5, 0),
512: #endif
513: #ifndef OPENSSL_NO_CAST
514: PLUGIN_PROVIDE(CRYPTER, ENCR_CAST, 0),
515: #endif
516: #ifndef OPENSSL_NO_BLOWFISH
517: PLUGIN_PROVIDE(CRYPTER, ENCR_BLOWFISH, 0),
518: #endif
519: #ifndef OPENSSL_NO_IDEA
520: PLUGIN_PROVIDE(CRYPTER, ENCR_IDEA, 16),
521: #endif
522: #ifndef OPENSSL_NO_DES
523: PLUGIN_PROVIDE(CRYPTER, ENCR_3DES, 24),
524: PLUGIN_PROVIDE(CRYPTER, ENCR_DES, 8),
525: PLUGIN_PROVIDE(CRYPTER, ENCR_DES_ECB, 8),
526: #endif
527: PLUGIN_PROVIDE(CRYPTER, ENCR_NULL, 0),
528: /* hashers */
529: PLUGIN_REGISTER(HASHER, openssl_hasher_create),
530: #ifndef OPENSSL_NO_MD2
531: PLUGIN_PROVIDE(HASHER, HASH_MD2),
532: #endif
533: #ifndef OPENSSL_NO_MD4
534: PLUGIN_PROVIDE(HASHER, HASH_MD4),
535: #endif
536: #ifndef OPENSSL_NO_MD5
537: PLUGIN_PROVIDE(HASHER, HASH_MD5),
538: #endif
539: #ifndef OPENSSL_NO_SHA1
540: PLUGIN_PROVIDE(HASHER, HASH_SHA1),
541: #endif
542: #ifndef OPENSSL_NO_SHA256
543: PLUGIN_PROVIDE(HASHER, HASH_SHA224),
544: PLUGIN_PROVIDE(HASHER, HASH_SHA256),
545: #endif
546: #ifndef OPENSSL_NO_SHA512
547: PLUGIN_PROVIDE(HASHER, HASH_SHA384),
548: PLUGIN_PROVIDE(HASHER, HASH_SHA512),
549: #endif
550: /* SHA3/SHAKE was added with OpenSSL 1.1.1, it doesn't seem to be possible to
551: * disable it, defining the checked var prevents registration, though */
552: #if OPENSSL_VERSION_NUMBER >= 0x1010100fL && !defined(OPENSSL_NO_SHA3)
553: PLUGIN_PROVIDE(HASHER, HASH_SHA3_224),
554: PLUGIN_PROVIDE(HASHER, HASH_SHA3_256),
555: PLUGIN_PROVIDE(HASHER, HASH_SHA3_384),
556: PLUGIN_PROVIDE(HASHER, HASH_SHA3_512),
557: #endif
558: #if OPENSSL_VERSION_NUMBER >= 0x1010100fL && !defined(OPENSSL_NO_SHAKE)
559: PLUGIN_REGISTER(XOF, openssl_xof_create),
560: PLUGIN_PROVIDE(XOF, XOF_SHAKE_128),
561: PLUGIN_PROVIDE(XOF, XOF_SHAKE_256),
562: #endif
563: #ifndef OPENSSL_NO_SHA1
564: /* keyed sha1 hasher (aka prf) */
565: PLUGIN_REGISTER(PRF, openssl_sha1_prf_create),
566: PLUGIN_PROVIDE(PRF, PRF_KEYED_SHA1),
567: #endif
568: #ifndef OPENSSL_NO_HMAC
569: PLUGIN_REGISTER(PRF, openssl_hmac_prf_create),
570: #ifndef OPENSSL_NO_MD5
571: PLUGIN_PROVIDE(PRF, PRF_HMAC_MD5),
572: #endif
573: #ifndef OPENSSL_NO_SHA1
574: PLUGIN_PROVIDE(PRF, PRF_HMAC_SHA1),
575: #endif
576: #ifndef OPENSSL_NO_SHA256
577: PLUGIN_PROVIDE(PRF, PRF_HMAC_SHA2_256),
578: #endif
579: #ifndef OPENSSL_NO_SHA512
580: PLUGIN_PROVIDE(PRF, PRF_HMAC_SHA2_384),
581: PLUGIN_PROVIDE(PRF, PRF_HMAC_SHA2_512),
582: #endif
583: PLUGIN_REGISTER(SIGNER, openssl_hmac_signer_create),
584: #ifndef OPENSSL_NO_MD5
585: PLUGIN_PROVIDE(SIGNER, AUTH_HMAC_MD5_96),
586: PLUGIN_PROVIDE(SIGNER, AUTH_HMAC_MD5_128),
587: #endif
588: #ifndef OPENSSL_NO_SHA1
589: PLUGIN_PROVIDE(SIGNER, AUTH_HMAC_SHA1_96),
590: PLUGIN_PROVIDE(SIGNER, AUTH_HMAC_SHA1_128),
591: PLUGIN_PROVIDE(SIGNER, AUTH_HMAC_SHA1_160),
592: #endif
593: #ifndef OPENSSL_NO_SHA256
594: PLUGIN_PROVIDE(SIGNER, AUTH_HMAC_SHA2_256_128),
595: PLUGIN_PROVIDE(SIGNER, AUTH_HMAC_SHA2_256_256),
596: #endif
597: #ifndef OPENSSL_NO_SHA512
598: PLUGIN_PROVIDE(SIGNER, AUTH_HMAC_SHA2_384_192),
599: PLUGIN_PROVIDE(SIGNER, AUTH_HMAC_SHA2_384_384),
600: PLUGIN_PROVIDE(SIGNER, AUTH_HMAC_SHA2_512_256),
601: PLUGIN_PROVIDE(SIGNER, AUTH_HMAC_SHA2_512_512),
602: #endif
603: #endif /* OPENSSL_NO_HMAC */
604: #if (OPENSSL_VERSION_NUMBER >= 0x1000100fL && !defined(OPENSSL_NO_AES)) || \
605: (OPENSSL_VERSION_NUMBER >= 0x1010000fL && !defined(OPENSSL_NO_CHACHA))
606: /* AEAD (AES GCM since 1.0.1, ChaCha20-Poly1305 since 1.1.0) */
607: PLUGIN_REGISTER(AEAD, openssl_aead_create),
608: #ifndef OPENSSL_NO_AES
609: PLUGIN_PROVIDE(AEAD, ENCR_AES_GCM_ICV16, 16),
610: PLUGIN_PROVIDE(AEAD, ENCR_AES_GCM_ICV16, 24),
611: PLUGIN_PROVIDE(AEAD, ENCR_AES_GCM_ICV16, 32),
612: PLUGIN_PROVIDE(AEAD, ENCR_AES_GCM_ICV12, 16),
613: PLUGIN_PROVIDE(AEAD, ENCR_AES_GCM_ICV12, 24),
614: PLUGIN_PROVIDE(AEAD, ENCR_AES_GCM_ICV12, 32),
615: PLUGIN_PROVIDE(AEAD, ENCR_AES_GCM_ICV8, 16),
616: PLUGIN_PROVIDE(AEAD, ENCR_AES_GCM_ICV8, 24),
617: PLUGIN_PROVIDE(AEAD, ENCR_AES_GCM_ICV8, 32),
618: #endif /* OPENSSL_NO_AES */
619: #if OPENSSL_VERSION_NUMBER >= 0x1010000fL && !defined(OPENSSL_NO_CHACHA)
620: PLUGIN_PROVIDE(AEAD, ENCR_CHACHA20_POLY1305, 32),
621: #endif /* OPENSSL_NO_CHACHA */
622: #endif /* OPENSSL_VERSION_NUMBER */
623: #ifndef OPENSSL_NO_ECDH
624: /* EC DH groups */
625: PLUGIN_REGISTER(DH, openssl_ec_diffie_hellman_create),
626: PLUGIN_PROVIDE(DH, ECP_256_BIT),
627: PLUGIN_PROVIDE(DH, ECP_384_BIT),
628: PLUGIN_PROVIDE(DH, ECP_521_BIT),
629: PLUGIN_PROVIDE(DH, ECP_224_BIT),
630: PLUGIN_PROVIDE(DH, ECP_192_BIT),
631: PLUGIN_PROVIDE(DH, ECP_256_BP),
632: PLUGIN_PROVIDE(DH, ECP_384_BP),
633: PLUGIN_PROVIDE(DH, ECP_512_BP),
634: PLUGIN_PROVIDE(DH, ECP_224_BP),
635: #endif /* OPENSSL_NO_ECDH */
636: #ifndef OPENSSL_NO_DH
637: /* MODP DH groups */
638: PLUGIN_REGISTER(DH, openssl_diffie_hellman_create),
639: PLUGIN_PROVIDE(DH, MODP_3072_BIT),
640: PLUGIN_PROVIDE(DH, MODP_4096_BIT),
641: PLUGIN_PROVIDE(DH, MODP_6144_BIT),
642: PLUGIN_PROVIDE(DH, MODP_8192_BIT),
643: PLUGIN_PROVIDE(DH, MODP_2048_BIT),
644: PLUGIN_PROVIDE(DH, MODP_2048_224),
645: PLUGIN_PROVIDE(DH, MODP_2048_256),
646: PLUGIN_PROVIDE(DH, MODP_1536_BIT),
647: PLUGIN_PROVIDE(DH, MODP_1024_BIT),
648: PLUGIN_PROVIDE(DH, MODP_1024_160),
649: PLUGIN_PROVIDE(DH, MODP_768_BIT),
650: PLUGIN_PROVIDE(DH, MODP_CUSTOM),
651: #endif
652: #ifndef OPENSSL_NO_RSA
653: /* RSA private/public key loading */
654: PLUGIN_REGISTER(PRIVKEY, openssl_rsa_private_key_load, TRUE),
655: PLUGIN_PROVIDE(PRIVKEY, KEY_RSA),
656: PLUGIN_REGISTER(PRIVKEY_GEN, openssl_rsa_private_key_gen, FALSE),
657: PLUGIN_PROVIDE(PRIVKEY_GEN, KEY_RSA),
658: PLUGIN_REGISTER(PUBKEY, openssl_rsa_public_key_load, TRUE),
659: PLUGIN_PROVIDE(PUBKEY, KEY_RSA),
660: PLUGIN_REGISTER(PUBKEY, openssl_rsa_public_key_load, TRUE),
661: PLUGIN_PROVIDE(PUBKEY, KEY_ANY),
662: /* signature/encryption schemes */
663: PLUGIN_PROVIDE(PRIVKEY_SIGN, SIGN_RSA_EMSA_PKCS1_NULL),
664: PLUGIN_PROVIDE(PUBKEY_VERIFY, SIGN_RSA_EMSA_PKCS1_NULL),
665: #if OPENSSL_VERSION_NUMBER >= 0x10000000L
666: PLUGIN_PROVIDE(PRIVKEY_SIGN, SIGN_RSA_EMSA_PSS),
667: PLUGIN_PROVIDE(PUBKEY_VERIFY, SIGN_RSA_EMSA_PSS),
668: #endif
669: #ifndef OPENSSL_NO_SHA1
670: PLUGIN_PROVIDE(PRIVKEY_SIGN, SIGN_RSA_EMSA_PKCS1_SHA1),
671: PLUGIN_PROVIDE(PUBKEY_VERIFY, SIGN_RSA_EMSA_PKCS1_SHA1),
672: #endif
673: #ifndef OPENSSL_NO_SHA256
674: PLUGIN_PROVIDE(PRIVKEY_SIGN, SIGN_RSA_EMSA_PKCS1_SHA2_224),
675: PLUGIN_PROVIDE(PRIVKEY_SIGN, SIGN_RSA_EMSA_PKCS1_SHA2_256),
676: PLUGIN_PROVIDE(PUBKEY_VERIFY, SIGN_RSA_EMSA_PKCS1_SHA2_224),
677: PLUGIN_PROVIDE(PUBKEY_VERIFY, SIGN_RSA_EMSA_PKCS1_SHA2_256),
678: #endif
679: #ifndef OPENSSL_NO_SHA512
680: PLUGIN_PROVIDE(PRIVKEY_SIGN, SIGN_RSA_EMSA_PKCS1_SHA2_384),
681: PLUGIN_PROVIDE(PRIVKEY_SIGN, SIGN_RSA_EMSA_PKCS1_SHA2_512),
682: PLUGIN_PROVIDE(PUBKEY_VERIFY, SIGN_RSA_EMSA_PKCS1_SHA2_384),
683: PLUGIN_PROVIDE(PUBKEY_VERIFY, SIGN_RSA_EMSA_PKCS1_SHA2_512),
684: #endif
685: #ifndef OPENSSL_NO_MD5
686: PLUGIN_PROVIDE(PRIVKEY_SIGN, SIGN_RSA_EMSA_PKCS1_MD5),
687: PLUGIN_PROVIDE(PUBKEY_VERIFY, SIGN_RSA_EMSA_PKCS1_MD5),
688: #endif
689: PLUGIN_PROVIDE(PRIVKEY_DECRYPT, ENCRYPT_RSA_PKCS1),
690: PLUGIN_PROVIDE(PUBKEY_ENCRYPT, ENCRYPT_RSA_PKCS1),
691: #endif /* OPENSSL_NO_RSA */
692: /* certificate/CRL loading */
693: PLUGIN_REGISTER(CERT_DECODE, openssl_x509_load, TRUE),
694: PLUGIN_PROVIDE(CERT_DECODE, CERT_X509),
695: PLUGIN_SDEPEND(PUBKEY, KEY_RSA),
696: PLUGIN_SDEPEND(PUBKEY, KEY_ECDSA),
697: PLUGIN_SDEPEND(PUBKEY, KEY_DSA),
698: PLUGIN_REGISTER(CERT_DECODE, openssl_crl_load, TRUE),
699: PLUGIN_PROVIDE(CERT_DECODE, CERT_X509_CRL),
700: #if OPENSSL_VERSION_NUMBER >= 0x0090807fL
701: #ifndef OPENSSL_NO_CMS
702: PLUGIN_REGISTER(CONTAINER_DECODE, openssl_pkcs7_load, TRUE),
703: PLUGIN_PROVIDE(CONTAINER_DECODE, CONTAINER_PKCS7),
704: #endif /* OPENSSL_NO_CMS */
705: #endif /* OPENSSL_VERSION_NUMBER */
706: PLUGIN_REGISTER(CONTAINER_DECODE, openssl_pkcs12_load, TRUE),
707: PLUGIN_PROVIDE(CONTAINER_DECODE, CONTAINER_PKCS12),
708: #ifndef OPENSSL_NO_ECDSA
709: /* EC private/public key loading */
710: PLUGIN_REGISTER(PRIVKEY, openssl_ec_private_key_load, TRUE),
711: PLUGIN_PROVIDE(PRIVKEY, KEY_ECDSA),
712: PLUGIN_REGISTER(PRIVKEY_GEN, openssl_ec_private_key_gen, FALSE),
713: PLUGIN_PROVIDE(PRIVKEY_GEN, KEY_ECDSA),
714: PLUGIN_REGISTER(PUBKEY, openssl_ec_public_key_load, TRUE),
715: PLUGIN_PROVIDE(PUBKEY, KEY_ECDSA),
716: /* signature encryption schemes */
717: PLUGIN_PROVIDE(PRIVKEY_SIGN, SIGN_ECDSA_WITH_NULL),
718: PLUGIN_PROVIDE(PUBKEY_VERIFY, SIGN_ECDSA_WITH_NULL),
719: #ifndef OPENSSL_NO_SHA1
720: PLUGIN_PROVIDE(PRIVKEY_SIGN, SIGN_ECDSA_WITH_SHA1_DER),
721: PLUGIN_PROVIDE(PUBKEY_VERIFY, SIGN_ECDSA_WITH_SHA1_DER),
722: #endif
723: #ifndef OPENSSL_NO_SHA256
724: PLUGIN_PROVIDE(PRIVKEY_SIGN, SIGN_ECDSA_WITH_SHA256_DER),
725: PLUGIN_PROVIDE(PUBKEY_VERIFY, SIGN_ECDSA_WITH_SHA256_DER),
726: PLUGIN_PROVIDE(PRIVKEY_SIGN, SIGN_ECDSA_256),
727: PLUGIN_PROVIDE(PUBKEY_VERIFY, SIGN_ECDSA_256),
728: #endif
729: #ifndef OPENSSL_NO_SHA512
730: PLUGIN_PROVIDE(PRIVKEY_SIGN, SIGN_ECDSA_WITH_SHA384_DER),
731: PLUGIN_PROVIDE(PRIVKEY_SIGN, SIGN_ECDSA_WITH_SHA512_DER),
732: PLUGIN_PROVIDE(PUBKEY_VERIFY, SIGN_ECDSA_WITH_SHA384_DER),
733: PLUGIN_PROVIDE(PUBKEY_VERIFY, SIGN_ECDSA_WITH_SHA512_DER),
734: PLUGIN_PROVIDE(PRIVKEY_SIGN, SIGN_ECDSA_384),
735: PLUGIN_PROVIDE(PRIVKEY_SIGN, SIGN_ECDSA_521),
736: PLUGIN_PROVIDE(PUBKEY_VERIFY, SIGN_ECDSA_384),
737: PLUGIN_PROVIDE(PUBKEY_VERIFY, SIGN_ECDSA_521),
738: #endif
739: #endif /* OPENSSL_NO_ECDSA */
1.1.1.2 ! misho 740: #if OPENSSL_VERSION_NUMBER >= 0x1010100fL && !defined(OPENSSL_NO_ECDH)
1.1 misho 741: PLUGIN_REGISTER(DH, openssl_x_diffie_hellman_create),
742: /* available since 1.1.0a, but we require 1.1.1 features */
743: PLUGIN_PROVIDE(DH, CURVE_25519),
744: /* available since 1.1.1 */
745: PLUGIN_PROVIDE(DH, CURVE_448),
1.1.1.2 ! misho 746: #endif /* OPENSSL_VERSION_NUMBER && !OPENSSL_NO_ECDH */
! 747: #if OPENSSL_VERSION_NUMBER >= 0x1010100fL && !defined(OPENSSL_NO_EC)
1.1 misho 748: /* EdDSA private/public key loading */
749: PLUGIN_REGISTER(PUBKEY, openssl_ed_public_key_load, TRUE),
750: PLUGIN_PROVIDE(PUBKEY, KEY_ED25519),
751: PLUGIN_PROVIDE(PUBKEY, KEY_ED448),
752: PLUGIN_REGISTER(PRIVKEY, openssl_ed_private_key_load, TRUE),
753: PLUGIN_PROVIDE(PRIVKEY, KEY_ED25519),
754: PLUGIN_PROVIDE(PRIVKEY, KEY_ED448),
755: PLUGIN_REGISTER(PRIVKEY_GEN, openssl_ed_private_key_gen, FALSE),
756: PLUGIN_PROVIDE(PRIVKEY_GEN, KEY_ED25519),
757: PLUGIN_PROVIDE(PRIVKEY_GEN, KEY_ED448),
758: PLUGIN_PROVIDE(PRIVKEY_SIGN, SIGN_ED25519),
759: PLUGIN_PROVIDE(PRIVKEY_SIGN, SIGN_ED448),
760: PLUGIN_PROVIDE(PUBKEY_VERIFY, SIGN_ED25519),
761: PLUGIN_PROVIDE(PUBKEY_VERIFY, SIGN_ED448),
762: /* register a pro forma identity hasher, never instantiated */
763: PLUGIN_REGISTER(HASHER, return_null),
764: PLUGIN_PROVIDE(HASHER, HASH_IDENTITY),
765: #endif /* OPENSSL_VERSION_NUMBER && !OPENSSL_NO_EC */
766: /* generic key loader */
767: PLUGIN_REGISTER(PRIVKEY, openssl_private_key_load, TRUE),
768: PLUGIN_PROVIDE(PRIVKEY, KEY_ANY),
769: PLUGIN_REGISTER(PRIVKEY, openssl_private_key_connect, FALSE),
770: PLUGIN_PROVIDE(PRIVKEY, KEY_ANY),
771: PLUGIN_REGISTER(RNG, openssl_rng_create),
772: PLUGIN_PROVIDE(RNG, RNG_STRONG),
773: PLUGIN_PROVIDE(RNG, RNG_WEAK),
774: };
775: *features = f;
776: return countof(f);
777: }
778:
779: METHOD(plugin_t, destroy, void,
780: private_openssl_plugin_t *this)
781: {
782: /* OpenSSL 1.1.0 cleans up itself at exit and while OPENSSL_cleanup() exists we
783: * can't call it as we couldn't re-initialize the library (as required by the
784: * unit tests and the Android app) */
785: #if OPENSSL_VERSION_NUMBER < 0x10100000L
786: #ifndef OPENSSL_IS_BORINGSSL
787: CONF_modules_free();
788: OBJ_cleanup();
789: #endif
790: EVP_cleanup();
791: #ifndef OPENSSL_NO_ENGINE
792: ENGINE_cleanup();
793: #endif /* OPENSSL_NO_ENGINE */
794: CRYPTO_cleanup_all_ex_data();
795: threading_cleanup();
796: ERR_free_strings();
797: #endif /* OPENSSL_VERSION_NUMBER */
798:
799: free(this);
800: }
801:
802: /*
803: * see header file
804: */
805: plugin_t *openssl_plugin_create()
806: {
807: private_openssl_plugin_t *this;
808: int fips_mode;
809:
810: fips_mode = lib->settings->get_int(lib->settings,
811: "%s.plugins.openssl.fips_mode", FIPS_MODE, lib->ns);
812: #ifdef OPENSSL_FIPS
813: if (fips_mode)
814: {
815: if (FIPS_mode() != fips_mode && !FIPS_mode_set(fips_mode))
816: {
817: DBG1(DBG_LIB, "unable to set openssl FIPS mode(%d) from (%d)",
818: fips_mode, FIPS_mode());
819: return NULL;
820: }
821: }
822: #else
823: if (fips_mode)
824: {
825: DBG1(DBG_LIB, "openssl FIPS mode(%d) unavailable", fips_mode);
826: return NULL;
827: }
828: #endif
829:
830: INIT(this,
831: .public = {
832: .plugin = {
833: .get_name = _get_name,
834: .get_features = _get_features,
835: .destroy = _destroy,
836: },
837: },
838: );
839:
840: #if OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER)
841: /* note that we can't call OPENSSL_cleanup() when the plugin is destroyed
842: * as we couldn't initialize the library again afterwards */
843: OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CONFIG |
844: OPENSSL_INIT_ENGINE_ALL_BUILTIN, NULL);
845: #else /* OPENSSL_VERSION_NUMBER */
846: threading_init();
847: #ifndef OPENSSL_IS_BORINGSSL
848: OPENSSL_config(NULL);
849: #endif
850: OpenSSL_add_all_algorithms();
851: #ifndef OPENSSL_NO_ENGINE
852: /* activate support for hardware accelerators */
853: ENGINE_load_builtin_engines();
854: ENGINE_register_all_complete();
855: #endif /* OPENSSL_NO_ENGINE */
856: #endif /* OPENSSL_VERSION_NUMBER */
857:
858: #ifdef OPENSSL_FIPS
859: /* we do this here as it may have been enabled via openssl.conf */
860: fips_mode = FIPS_mode();
861: dbg(DBG_LIB, strpfx(lib->ns, "charon") ? 1 : 2,
862: "openssl FIPS mode(%d) - %sabled ", fips_mode, fips_mode ? "en" : "dis");
863: #endif /* OPENSSL_FIPS */
864:
865: #if OPENSSL_VERSION_NUMBER < 0x1010100fL
866: if (!seed_rng())
867: {
868: DBG1(DBG_CFG, "no RNG found to seed OpenSSL");
869: destroy(this);
870: return NULL;
871: }
872: #endif /* OPENSSL_VERSION_NUMBER */
873:
874: return &this->public.plugin;
875: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>