File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / strongswan / src / libstrongswan / crypto / crypto_factory.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Jun 3 09:46:44 2020 UTC (4 years, 2 months ago) by misho
Branches: strongswan, MAIN
CVS tags: v5_9_2p0, v5_8_4p7, HEAD
Strongswan

    1: /*
    2:  * Copyright (C) 2008 Martin Willi
    3:  * Copyright (C) 2016-2019 Andreas Steffen
    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: /**
   18:  * @defgroup crypto_factory crypto_factory
   19:  * @{ @ingroup crypto
   20:  */
   21: 
   22: #ifndef CRYPTO_FACTORY_H_
   23: #define CRYPTO_FACTORY_H_
   24: 
   25: typedef struct crypto_factory_t crypto_factory_t;
   26: 
   27: #include <library.h>
   28: #include <collections/enumerator.h>
   29: #include <crypto/crypters/crypter.h>
   30: #include <crypto/aead.h>
   31: #include <crypto/signers/signer.h>
   32: #include <crypto/hashers/hasher.h>
   33: #include <crypto/prfs/prf.h>
   34: #include <crypto/rngs/rng.h>
   35: #include <crypto/xofs/xof.h>
   36: #include <crypto/drbgs/drbg.h>
   37: #include <crypto/nonce_gen.h>
   38: #include <crypto/diffie_hellman.h>
   39: #include <crypto/transform.h>
   40: 
   41: #define CRYPTO_MAX_ALG_LINE          120   /* characters */
   42: 
   43: /**
   44:  * Constructor function for crypters
   45:  */
   46: typedef crypter_t* (*crypter_constructor_t)(encryption_algorithm_t algo,
   47: 											size_t key_size);
   48: /**
   49:  * Constructor function for aead transforms
   50:  */
   51: typedef aead_t* (*aead_constructor_t)(encryption_algorithm_t algo,
   52: 									  size_t key_size, size_t salt_size);
   53: /**
   54:  * Constructor function for signers
   55:  */
   56: typedef signer_t* (*signer_constructor_t)(integrity_algorithm_t algo);
   57: 
   58: /**
   59:  * Constructor function for hashers
   60:  */
   61: typedef hasher_t* (*hasher_constructor_t)(hash_algorithm_t algo);
   62: 
   63: /**
   64:  * Constructor function for pseudo random functions
   65:  */
   66: typedef prf_t* (*prf_constructor_t)(pseudo_random_function_t algo);
   67: 
   68: /**
   69:  * Constructor function for extended output functions
   70:  */
   71: typedef xof_t* (*xof_constructor_t)(ext_out_function_t algo);
   72: 
   73: /**
   74:  * Constructor function for deterministic random bit generators
   75:  */
   76: typedef drbg_t* (*drbg_constructor_t)(drbg_type_t type, uint32_t strength,
   77: 								rng_t *entropy, chunk_t personalization_str);
   78: 
   79: /**
   80:  * Constructor function for source of randomness
   81:  */
   82: typedef rng_t* (*rng_constructor_t)(rng_quality_t quality);
   83: 
   84: /**
   85:  * Constructor function for nonce generators
   86:  */
   87: typedef nonce_gen_t* (*nonce_gen_constructor_t)();
   88: 
   89: /**
   90:  * Constructor function for diffie hellman
   91:  *
   92:  * The DH constructor accepts additional arguments for:
   93:  * - MODP_CUSTOM: chunk_t generator, chunk_t prime
   94:  */
   95: typedef diffie_hellman_t* (*dh_constructor_t)(diffie_hellman_group_t group, ...);
   96: 
   97: /**
   98:  * Handles crypto modules and creates instances.
   99:  */
  100: struct crypto_factory_t {
  101: 
  102: 	/**
  103: 	 * Create a crypter instance.
  104: 	 *
  105: 	 * @param algo			encryption algorithm
  106: 	 * @param key_size		length of the key in bytes
  107: 	 * @return				crypter_t instance, NULL if not supported
  108: 	 */
  109: 	crypter_t* (*create_crypter)(crypto_factory_t *this,
  110: 								 encryption_algorithm_t algo, size_t key_size);
  111: 
  112: 	/**
  113: 	 * Create a aead instance.
  114: 	 *
  115: 	 * @param algo			encryption algorithm
  116: 	 * @param key_size		length of the key in bytes
  117: 	 * @param salt_size		size of salt, implicit part of the nonce
  118: 	 * @return				aead_t instance, NULL if not supported
  119: 	 */
  120: 	aead_t* (*create_aead)(crypto_factory_t *this,
  121: 						   encryption_algorithm_t algo,
  122: 						   size_t key_size, size_t salt_size);
  123: 
  124: 	/**
  125: 	 * Create a symmetric signer instance.
  126: 	 *
  127: 	 * @param algo			MAC algorithm to use
  128: 	 * @return				signer_t instance, NULL if not supported
  129: 	 */
  130: 	signer_t* (*create_signer)(crypto_factory_t *this,
  131: 							   integrity_algorithm_t algo);
  132: 
  133: 	/**
  134: 	 * Create a hasher instance.
  135: 	 *
  136: 	 * @param algo			hash algorithm
  137: 	 * @return				hasher_t instance, NULL if not supported
  138: 	 */
  139: 	hasher_t* (*create_hasher)(crypto_factory_t *this, hash_algorithm_t algo);
  140: 
  141: 	/**
  142: 	 * Create a pseudo random function instance.
  143: 	 *
  144: 	 * @param algo			PRF algorithm to use
  145: 	 * @return				prf_t instance, NULL if not supported
  146: 	 */
  147: 	prf_t* (*create_prf)(crypto_factory_t *this, pseudo_random_function_t algo);
  148: 
  149: 	/**
  150: 	 * Create an extended output function instance.
  151: 	 *
  152: 	 * @param algo			XOF algorithm to use
  153: 	 * @return				xof_t instance, NULL if not supported
  154: 	 */
  155: 	xof_t* (*create_xof)(crypto_factory_t *this, ext_out_function_t algo);
  156: 
  157: 	/**
  158: 	 * Create a deterministic random bit generator instance.
  159: 	 *
  160: 	 * @param type					DRBG type to use
  161: 	 * @param strength				security strength in bits
  162: 	 * @param entropy				entropy source to be used (adopted)
  163: 	 * @param personalization_str	optional personalization string
  164: 	 * @return						drbg_t instance, NULL if not supported
  165: 	 */
  166: 	drbg_t* (*create_drbg)(crypto_factory_t *this, drbg_type_t type,
  167: 						   uint32_t strength, rng_t *entropy,
  168: 						   chunk_t personalization_str);
  169: 
  170: 	/**
  171: 	 * Create a source of randomness.
  172: 	 *
  173: 	 * @param quality		required randomness quality
  174: 	 * @return				rng_t instance, NULL if no RNG with such a quality
  175: 	 */
  176: 	rng_t* (*create_rng)(crypto_factory_t *this, rng_quality_t quality);
  177: 
  178: 	/**
  179: 	 * Create a nonce generator instance.
  180: 	 *
  181: 	 * @return				nonce_gen_t instance, NULL if not supported
  182: 	 */
  183: 	nonce_gen_t* (*create_nonce_gen)(crypto_factory_t *this);
  184: 
  185: 	/**
  186: 	 * Create a diffie hellman instance.
  187: 	 *
  188: 	 * Additional arguments are passed to the DH constructor.
  189: 	 *
  190: 	 * @param group			diffie hellman group
  191: 	 * @return				diffie_hellman_t instance, NULL if not supported
  192: 	 */
  193: 	diffie_hellman_t* (*create_dh)(crypto_factory_t *this,
  194: 								   diffie_hellman_group_t group, ...);
  195: 
  196: 	/**
  197: 	 * Register a crypter constructor.
  198: 	 *
  199: 	 * @param algo			algorithm to constructor
  200: 	 * @param key size		key size to perform benchmarking for
  201: 	 * @param plugin_name	plugin that registered this algorithm
  202: 	 * @param create		constructor function for that algorithm
  203: 	 * @return				TRUE if registered, FALSE if test vector failed
  204: 	 */
  205: 	bool (*add_crypter)(crypto_factory_t *this, encryption_algorithm_t algo,
  206: 						size_t key_size, const char *plugin_name,
  207: 						crypter_constructor_t create);
  208: 
  209: 	/**
  210: 	 * Unregister a crypter constructor.
  211: 	 *
  212: 	 * @param create		constructor function to unregister
  213: 	 */
  214: 	void (*remove_crypter)(crypto_factory_t *this, crypter_constructor_t create);
  215: 
  216: 	/**
  217: 	 * Unregister a aead constructor.
  218: 	 *
  219: 	 * @param create		constructor function to unregister
  220: 	 */
  221: 	void (*remove_aead)(crypto_factory_t *this, aead_constructor_t create);
  222: 
  223: 	/**
  224: 	 * Register a aead constructor.
  225: 	 *
  226: 	 * @param algo			algorithm to constructor
  227: 	 * @param key size		key size to perform benchmarking for
  228: 	 * @param plugin_name	plugin that registered this algorithm
  229: 	 * @param create		constructor function for that algorithm
  230: 	 * @return				TRUE if registered, FALSE if test vector failed
  231: 	 */
  232: 	bool (*add_aead)(crypto_factory_t *this, encryption_algorithm_t algo,
  233: 					 size_t key_size, const char *plugin_name,
  234: 					 aead_constructor_t create);
  235: 
  236: 	/**
  237: 	 * Register a signer constructor.
  238: 	 *
  239: 	 * @param algo			algorithm to constructor
  240: 	 * @param plugin_name	plugin that registered this algorithm
  241: 	 * @param create		constructor function for that algorithm
  242: 	 * @return				TRUE if registered, FALSE if test vector failed
  243: 	 */
  244: 	bool (*add_signer)(crypto_factory_t *this, integrity_algorithm_t algo,
  245: 					    const char *plugin_name, signer_constructor_t create);
  246: 
  247: 	/**
  248: 	 * Unregister a signer constructor.
  249: 	 *
  250: 	 * @param create		constructor function to unregister
  251: 	 */
  252: 	void (*remove_signer)(crypto_factory_t *this, signer_constructor_t create);
  253: 
  254: 	/**
  255: 	 * Register a hasher constructor.
  256: 	 *
  257: 	 * @param algo			algorithm to constructor
  258: 	 * @param plugin_name	plugin that registered this algorithm
  259: 	 * @param create		constructor function for that algorithm
  260: 	 * @return				TRUE if registered, FALSE if test vector failed
  261: 	 */
  262: 	bool (*add_hasher)(crypto_factory_t *this, hash_algorithm_t algo,
  263: 					   const char *plugin_name, hasher_constructor_t create);
  264: 
  265: 	/**
  266: 	 * Unregister a hasher constructor.
  267: 	 *
  268: 	 * @param create		constructor function to unregister
  269: 	 */
  270: 	void (*remove_hasher)(crypto_factory_t *this, hasher_constructor_t create);
  271: 
  272: 	/**
  273: 	 * Register a prf constructor.
  274: 	 *
  275: 	 * @param algo			algorithm to constructor
  276: 	 * @param plugin_name	plugin that registered this algorithm
  277: 	 * @param create		constructor function for that algorithm
  278: 	 * @return				TRUE if registered, FALSE if test vector failed
  279: 	 */
  280: 	bool (*add_prf)(crypto_factory_t *this, pseudo_random_function_t algo,
  281: 					const char *plugin_name, prf_constructor_t create);
  282: 
  283: 	/**
  284: 	 * Unregister a prf constructor.
  285: 	 *
  286: 	 * @param create		constructor function to unregister
  287: 	 */
  288: 	void (*remove_prf)(crypto_factory_t *this, prf_constructor_t create);
  289: 
  290: 	/**
  291: 	 * Register an xof constructor.
  292: 	 *
  293: 	 * @param algo			algorithm to constructor
  294: 	 * @param plugin_name	plugin that registered this algorithm
  295: 	 * @param create		constructor function for that algorithm
  296: 	 * @return				TRUE if registered, FALSE if test vector failed
  297: 	 */
  298: 	bool (*add_xof)(crypto_factory_t *this, ext_out_function_t algo,
  299: 					const char *plugin_name, xof_constructor_t create);
  300: 
  301: 	/**
  302: 	 * Unregister an xof constructor.
  303: 	 *
  304: 	 * @param create		constructor function to unregister
  305: 	 */
  306: 	void (*remove_xof)(crypto_factory_t *this, xof_constructor_t create);
  307: 
  308: 	/**
  309: 	 * Register a drbg constructor.
  310: 	 *
  311: 	 * @param type			type to constructor
  312: 	 * @param plugin_name	plugin that registered this algorithm
  313: 	 * @param create		constructor function for that algorithm
  314: 	 * @return				TRUE if registered, FALSE if test vector failed
  315: 	 */
  316: 	bool (*add_drbg)(crypto_factory_t *this, drbg_type_t type,
  317: 					 const char *plugin_name, drbg_constructor_t create);
  318: 
  319: 	/**
  320: 	 * Unregister a drbg constructor.
  321: 	 *
  322: 	 * @param create		constructor function to unregister
  323: 	 */
  324: 	void (*remove_drbg)(crypto_factory_t *this, drbg_constructor_t create);
  325: 
  326: 	/**
  327: 	 * Register a source of randomness.
  328: 	 *
  329: 	 * @param quality		quality of randomness this RNG serves
  330: 	 * @param plugin_name	plugin that registered this algorithm
  331: 	 * @param create		constructor function for such a quality
  332: 	 * @return				TRUE if registered, FALSE if test vector failed
  333: 	 */
  334: 	bool (*add_rng)(crypto_factory_t *this, rng_quality_t quality,
  335: 					const char *plugin_name, rng_constructor_t create);
  336: 
  337: 	/**
  338: 	 * Unregister a source of randomness.
  339: 	 *
  340: 	 * @param create		constructor function to unregister
  341: 	 */
  342: 	void (*remove_rng)(crypto_factory_t *this, rng_constructor_t create);
  343: 
  344: 	/**
  345: 	 * Register a nonce generator.
  346: 	 *
  347: 	 * @param plugin_name	plugin that registered this algorithm
  348: 	 * @param create		constructor function for that nonce generator
  349: 	 * @return				TRUE if registered, FALSE if test vector failed
  350: 	 */
  351: 	bool (*add_nonce_gen)(crypto_factory_t *this, const char *plugin_name,
  352: 						  nonce_gen_constructor_t create);
  353: 
  354: 	/**
  355: 	 * Unregister a nonce generator.
  356: 	 *
  357: 	 * @param create		constructor function to unregister
  358: 	 */
  359: 	void (*remove_nonce_gen)(crypto_factory_t *this,
  360: 							 nonce_gen_constructor_t create);
  361: 
  362: 	/**
  363: 	 * Register a diffie hellman constructor.
  364: 	 *
  365: 	 * @param group			dh group to constructor
  366: 	 * @param plugin_name	plugin that registered this algorithm
  367: 	 * @param create		constructor function for that algorithm
  368: 	 * @return				TRUE if registered, FALSE if test vector failed
  369: 	 */
  370: 	bool (*add_dh)(crypto_factory_t *this, diffie_hellman_group_t group,
  371: 				   const char *plugin_name, dh_constructor_t create);
  372: 
  373: 	/**
  374: 	 * Unregister a diffie hellman constructor.
  375: 	 *
  376: 	 * @param create		constructor function to unregister
  377: 	 */
  378: 	void (*remove_dh)(crypto_factory_t *this, dh_constructor_t create);
  379: 
  380: 	/**
  381: 	 * Create an enumerator over all registered crypter algorithms.
  382: 	 *
  383: 	 * @return				enumerator over encryption_algorithm_t, plugin
  384: 	 */
  385: 	enumerator_t* (*create_crypter_enumerator)(crypto_factory_t *this);
  386: 
  387: 	/**
  388: 	 * Create an enumerator over all registered aead algorithms.
  389: 	 *
  390: 	 * @return				enumerator over encryption_algorithm_t, plugin
  391: 	 */
  392: 	enumerator_t* (*create_aead_enumerator)(crypto_factory_t *this);
  393: 
  394: 	/**
  395: 	 * Create an enumerator over all registered signer algorithms.
  396: 	 *
  397: 	 * @return				enumerator over integrity_algorithm_t, plugin
  398: 	 */
  399: 	enumerator_t* (*create_signer_enumerator)(crypto_factory_t *this);
  400: 
  401: 	/**
  402: 	 * Create an enumerator over all registered hasher algorithms.
  403: 	 *
  404: 	 * @return				enumerator over hash_algorithm_t, plugin
  405: 	 */
  406: 	enumerator_t* (*create_hasher_enumerator)(crypto_factory_t *this);
  407: 
  408: 	/**
  409: 	 * Create an enumerator over all registered PRFs.
  410: 	 *
  411: 	 * @return				enumerator over pseudo_random_function_t, plugin
  412: 	 */
  413: 	enumerator_t* (*create_prf_enumerator)(crypto_factory_t *this);
  414: 
  415: 	/**
  416: 	 * Create an enumerator over all registered XOFs.
  417: 	 *
  418: 	 * @return				enumerator over ext_out_function_t, plugin
  419: 	 */
  420: 	enumerator_t* (*create_xof_enumerator)(crypto_factory_t *this);
  421: 
  422: 	/**
  423: 	 * Create an enumerator over all registered DRBGs.
  424: 	 *
  425: 	 * @return				enumerator over drbg_type_t, plugin
  426: 	 */
  427: 	enumerator_t* (*create_drbg_enumerator)(crypto_factory_t *this);
  428: 
  429: 	/**
  430: 	 * Create an enumerator over all registered diffie hellman groups.
  431: 	 *
  432: 	 * @return				enumerator over diffie_hellman_group_t, plugin
  433: 	 */
  434: 	enumerator_t* (*create_dh_enumerator)(crypto_factory_t *this);
  435: 
  436: 	/**
  437: 	 * Create an enumerator over all registered random generators.
  438: 	 *
  439: 	 * @return				enumerator over rng_quality_t, plugin
  440: 	 */
  441: 	enumerator_t* (*create_rng_enumerator)(crypto_factory_t *this);
  442: 
  443: 	/**
  444: 	 * Create an enumerator over all registered nonce generators.
  445: 	 *
  446: 	 * @return				enumerator over plugin
  447: 	 */
  448: 	enumerator_t* (*create_nonce_gen_enumerator)(crypto_factory_t *this);
  449: 
  450: 	/**
  451: 	 * Add a test vector to the crypto factory.
  452: 	 *
  453: 	 * @param type			type of the test vector
  454: 	 * @param vector		pointer to a test vector, defined in crypto_tester.h
  455: 	 */
  456: 	void (*add_test_vector)(crypto_factory_t *this, transform_type_t type,
  457: 							void *vector);
  458: 
  459: 	/**
  460: 	 * Create an enumerator verifying transforms using known test vectors.
  461: 	 *
  462: 	 * The resulting enumerator enumerates over an u_int with the type
  463: 	 * specific transform identifier, the plugin name providing the transform,
  464: 	 * and a boolean value indicating success/failure for the given transform.
  465: 	 *
  466: 	 * @param type			transform type to test
  467: 	 * @return				enumerator over (u_int, char*, bool)
  468: 	 */
  469: 	enumerator_t* (*create_verify_enumerator)(crypto_factory_t *this,
  470: 											  transform_type_t type);
  471: 
  472: 	/**
  473: 	 * Destroy a crypto_factory instance.
  474: 	 */
  475: 	void (*destroy)(crypto_factory_t *this);
  476: };
  477: 
  478: /**
  479:  * Create a crypto_factory instance.
  480:  */
  481: crypto_factory_t *crypto_factory_create();
  482: 
  483: #endif /** CRYPTO_FACTORY_H_ @}*/

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>