File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / strongswan / src / libstrongswan / crypto / crypto_tester.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) 2009 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_tester crypto_tester
   19:  * @{ @ingroup crypto
   20:  */
   21: 
   22: #ifndef CRYPTO_TESTER_H_
   23: #define CRYPTO_TESTER_H_
   24: 
   25: typedef struct crypto_tester_t crypto_tester_t;
   26: 
   27: #include <crypto/crypto_factory.h>
   28: 
   29: typedef struct crypter_test_vector_t crypter_test_vector_t;
   30: typedef struct aead_test_vector_t aead_test_vector_t;
   31: typedef struct signer_test_vector_t signer_test_vector_t;
   32: typedef struct hasher_test_vector_t hasher_test_vector_t;
   33: typedef struct prf_test_vector_t prf_test_vector_t;
   34: typedef struct xof_test_vector_t xof_test_vector_t;
   35: typedef struct drbg_test_vector_t drbg_test_vector_t;
   36: typedef struct rng_test_vector_t rng_test_vector_t;
   37: typedef struct dh_test_vector_t dh_test_vector_t;
   38: 
   39: struct crypter_test_vector_t {
   40: 	/** encryption algorithm this vector tests */
   41: 	encryption_algorithm_t alg;
   42: 	/** key length to use, in bytes */
   43: 	size_t key_size;
   44: 	/** encryption key of test vector */
   45: 	u_char *key;
   46: 	/** initialization vector, using crypters blocksize bytes */
   47: 	u_char *iv;
   48: 	/** length of plain and cipher text */
   49: 	size_t len;
   50: 	/** plain text */
   51: 	u_char *plain;
   52: 	/** cipher text */
   53: 	u_char *cipher;
   54: };
   55: 
   56: struct aead_test_vector_t {
   57: 	/** encryption algorithm this vector tests */
   58: 	encryption_algorithm_t alg;
   59: 	/** key length to use, in bytes */
   60: 	size_t key_size;
   61: 	/** salt length to use, in bytes */
   62: 	size_t salt_size;
   63: 	/** encryption key of test vector */
   64: 	u_char *key;
   65: 	/** initialization vector, using crypters blocksize bytes */
   66: 	u_char *iv;
   67: 	/** length of associated data */
   68: 	size_t alen;
   69: 	/** associated data */
   70: 	u_char *adata;
   71: 	/** length of plain text */
   72: 	size_t len;
   73: 	/** plain text */
   74: 	u_char *plain;
   75: 	/** cipher text */
   76: 	u_char *cipher;
   77: };
   78: 
   79: struct signer_test_vector_t {
   80: 	/** signer algorithm this test vector tests */
   81: 	integrity_algorithm_t alg;
   82: 	/** key to use, with a length the algorithm expects */
   83: 	u_char *key;
   84: 	/** size of the input data */
   85: 	size_t len;
   86: 	/** input data */
   87: 	u_char *data;
   88: 	/** expected output, with output size of the tested algorithm */
   89: 	u_char *mac;
   90: };
   91: 
   92: struct hasher_test_vector_t {
   93: 	/** hash algorithm this test vector tests */
   94: 	hash_algorithm_t alg;
   95: 	/** length of the input data */
   96: 	size_t len;
   97: 	/** input data */
   98: 	u_char *data;
   99: 	/** expected hash, with hash size of the tested algorithm */
  100: 	u_char *hash;
  101: };
  102: 
  103: struct prf_test_vector_t {
  104: 	/** prf algorithm this test vector tests */
  105: 	pseudo_random_function_t alg;
  106: 	/** is this PRF stateful? */
  107: 	bool stateful;
  108: 	/** key length to use, in bytes */
  109: 	size_t key_size;
  110: 	/** key to use */
  111: 	u_char *key;
  112: 	/** size of the seed data */
  113: 	size_t len;
  114: 	/** seed data */
  115: 	u_char *seed;
  116: 	/** expected output, with block size of the tested algorithm */
  117: 	u_char *out;
  118: };
  119: 
  120: struct xof_test_vector_t {
  121: 	/** xof algorithm this test vector tests */
  122: 	ext_out_function_t alg;
  123: 	/** size of the seed data */
  124: 	size_t len;
  125: 	/** seed data */
  126: 	u_char *seed;
  127: 	/** size of the output */
  128: 	size_t out_len;
  129: 	/** expected output of size*/
  130: 	u_char *out;
  131: };
  132: 
  133: struct drbg_test_vector_t {
  134: 	/** drbg type this test vector tests */
  135: 	drbg_type_t type;
  136: 	/** security strength in bits */
  137: 	uint32_t strength;
  138: 	/** optional personalization string */
  139: 	chunk_t personalization_str;
  140: 	/** entropy_input | nonce | entropy_input_reseed */
  141: 	chunk_t entropy;
  142: 	/** returned output bits */
  143: 	chunk_t out;
  144: };
  145: 
  146: /**
  147:  * Test vector for a RNG.
  148:  *
  149:  * Contains a callback function to analyze the output of a RNG,
  150:  */
  151: struct rng_test_vector_t {
  152: 	/** quality of random data this test vector tests */
  153: 	rng_quality_t quality;
  154: 	/** callback function to test RNG output, returns TRUE if data ok */
  155: 	bool (*test)(void *user, chunk_t data);
  156: 	/** number of bytes the function requests */
  157: 	size_t len;
  158: 	/** user data passed back to the test() function on invocation */
  159: 	void *user;
  160: };
  161: 
  162: struct dh_test_vector_t {
  163: 	/** diffie hellman group to test */
  164: 	diffie_hellman_group_t group;
  165: 	/** private value of alice */
  166: 	u_char *priv_a;
  167: 	/** private value of bob */
  168: 	u_char *priv_b;
  169: 	/** length of private values */
  170: 	size_t priv_len;
  171: 	/** expected public value of alice */
  172: 	u_char *pub_a;
  173: 	/** expected public value of bob */
  174: 	u_char *pub_b;
  175: 	/** size of public values */
  176: 	size_t pub_len;
  177: 	/** expected shared secret */
  178: 	u_char *shared;
  179: 	/** size of shared secret */
  180: 	size_t shared_len;
  181: };
  182: 
  183: /**
  184:  * Cryptographic primitive testing framework.
  185:  */
  186: struct crypto_tester_t {
  187: 
  188: 	/**
  189: 	 * Test a crypter algorithm, optionally using a specified key size.
  190: 	 *
  191: 	 * @param alg			algorithm to test
  192: 	 * @param key_size		key size to test, 0 for default
  193: 	 * @param create		constructor function for the crypter
  194: 	 * @param speed			speed test result, NULL to omit
  195: 	 * @return				TRUE if test passed
  196: 	 */
  197: 	bool (*test_crypter)(crypto_tester_t *this, encryption_algorithm_t alg,
  198: 						 size_t key_size, crypter_constructor_t create,
  199: 						 u_int *speed, const char *plugin_name);
  200: 
  201: 	/**
  202: 	 * Test an aead algorithm, optionally using a specified key size.
  203: 	 *
  204: 	 * @param alg			algorithm to test
  205: 	 * @param key_size		key size to test, 0 for default
  206: 	 * @param salt_size		salt length to test, 0 for default
  207: 	 * @param create		constructor function for the aead transform
  208: 	 * @param speed			speed test result, NULL to omit
  209: 	 * @return				TRUE if test passed
  210: 	 */
  211: 	bool (*test_aead)(crypto_tester_t *this, encryption_algorithm_t alg,
  212: 					  size_t key_size, size_t salt_size,
  213: 					  aead_constructor_t create,
  214: 					  u_int *speed, const char *plugin_name);
  215: 	/**
  216: 	 * Test a signer algorithm.
  217: 	 *
  218: 	 * @param alg			algorithm to test
  219: 	 * @param create		constructor function for the signer
  220: 	 * @param speed			speed test result, NULL to omit
  221: 	 * @return				TRUE if test passed
  222: 	 */
  223: 	bool (*test_signer)(crypto_tester_t *this, integrity_algorithm_t alg,
  224: 						signer_constructor_t create,
  225: 						u_int *speed, const char *plugin_name);
  226: 	/**
  227: 	 * Test a hasher algorithm.
  228: 	 *
  229: 	 * @param alg			algorithm to test
  230: 	 * @param create		constructor function for the hasher
  231: 	 * @param speed			speed test result, NULL to omit
  232: 	 * @return				TRUE if test passed
  233: 	 */
  234: 	bool (*test_hasher)(crypto_tester_t *this, hash_algorithm_t alg,
  235: 						hasher_constructor_t create,
  236: 						u_int *speed, const char *plugin_name);
  237: 	/**
  238: 	 * Test a PRF algorithm.
  239: 	 *
  240: 	 * @param alg			algorithm to test
  241: 	 * @param create		constructor function for the PRF
  242: 	 * @param speed			speed test result, NULL to omit
  243: 	 * @return				TRUE if test passed
  244: 	 */
  245: 	bool (*test_prf)(crypto_tester_t *this, pseudo_random_function_t alg,
  246: 					 prf_constructor_t create,
  247: 					 u_int *speed, const char *plugin_name);
  248: 	/**
  249: 	 * Test an XOF algorithm.
  250: 	 *
  251: 	 * @param alg			algorithm to test
  252: 	 * @param create		constructor function for the XOF
  253: 	 * @param speed			speed test result, NULL to omit
  254: 	 * @return				TRUE if test passed
  255: 	 */
  256: 	bool (*test_xof)(crypto_tester_t *this, ext_out_function_t alg,
  257: 					 xof_constructor_t create,
  258: 					 u_int *speed, const char *plugin_name);
  259: 	/**
  260: 	 * Test a DRBG type.
  261: 	 *
  262: 	 * @param type			DRBG type to test
  263: 	 * @param create		constructor function for the DRBG
  264: 	 * @param speed			speed test result, NULL to omit
  265: 	 * @return				TRUE if test passed
  266: 	 */
  267: 	bool (*test_drbg)(crypto_tester_t *this, drbg_type_t type,
  268: 					  drbg_constructor_t create,
  269: 					  u_int *speed, const char *plugin_name);
  270: 	/**
  271: 	 * Test a RNG implementation.
  272: 	 *
  273: 	 * @param alg			algorithm to test
  274: 	 * @param create		constructor function for the RNG
  275: 	 * @param speed			speed test result, NULL to omit
  276: 	 * @return				TRUE if test passed
  277: 	 */
  278: 	bool (*test_rng)(crypto_tester_t *this, rng_quality_t quality,
  279: 					 rng_constructor_t create,
  280: 					 u_int *speed, const char *plugin_name);
  281: 	/**
  282: 	 * Test a Diffie-Hellman implementation.
  283: 	 *
  284: 	 * @param group			group to test
  285: 	 * @param create		constructor function for the DH backend
  286: 	 * @param speed			speed test result, NULL to omit
  287: 	 * @return				TRUE if test passed
  288: 	 */
  289: 	bool (*test_dh)(crypto_tester_t *this, diffie_hellman_group_t group,
  290: 					dh_constructor_t create,
  291: 					u_int *speed, const char *plugin_name);
  292: 
  293: 	/**
  294: 	 * Add a test vector to test a crypter.
  295: 	 *
  296: 	 * @param vector		pointer to test vector
  297: 	 */
  298: 	void (*add_crypter_vector)(crypto_tester_t *this,
  299: 							   crypter_test_vector_t *vector);
  300: 	/**
  301: 	 * Add a test vector to test an aead transform.
  302: 	 *
  303: 	 * @param vector		pointer to test vector
  304: 	 */
  305: 	void (*add_aead_vector)(crypto_tester_t *this,
  306: 							aead_test_vector_t *vector);
  307: 	/**
  308: 	 * Add a test vector to test a signer.
  309: 	 *
  310: 	 * @param vector		pointer to test vector
  311: 	 */
  312: 	void (*add_signer_vector)(crypto_tester_t *this,
  313: 							  signer_test_vector_t *vector);
  314: 	/**
  315: 	 * Add a test vector to test a hasher.
  316: 	 *
  317: 	 * @param vector		pointer to test vector
  318: 	 */
  319: 	void (*add_hasher_vector)(crypto_tester_t *this,
  320: 							  hasher_test_vector_t *vector);
  321: 	/**
  322: 	 * Add a test vector to test a PRF.
  323: 	 *
  324: 	 * @param vector		pointer to test vector
  325: 	 */
  326: 	void (*add_prf_vector)(crypto_tester_t *this, prf_test_vector_t *vector);
  327: 
  328: 	/**
  329: 	 * Add a test vector to test an XOF.
  330: 	 *
  331: 	 * @param vector		pointer to test vector
  332: 	 */
  333: 	void (*add_xof_vector)(crypto_tester_t *this, xof_test_vector_t *vector);
  334: 
  335: 	/**
  336: 	 * Add a test vector to test a DRBG.
  337: 	 *
  338: 	 * @param vector		pointer to test vector
  339: 	 */
  340: 	void (*add_drbg_vector)(crypto_tester_t *this, drbg_test_vector_t *vector);
  341: 
  342: 	/**
  343: 	 * Add a test vector to test a RNG.
  344: 	 *
  345: 	 * @param vector		pointer to test vector
  346: 	 */
  347: 	void (*add_rng_vector)(crypto_tester_t *this, rng_test_vector_t *vector);
  348: 
  349: 	/**
  350: 	 * Add a test vector to test a Diffie-Hellman backend.
  351: 	 *
  352: 	 * @param vector		pointer to test vector
  353: 	 */
  354: 	void (*add_dh_vector)(crypto_tester_t *this, dh_test_vector_t *vector);
  355: 
  356: 	/**
  357: 	 * Destroy a crypto_tester_t.
  358: 	 */
  359: 	void (*destroy)(crypto_tester_t *this);
  360: };
  361: 
  362: /**
  363:  * Create a crypto_tester instance.
  364:  */
  365: crypto_tester_t *crypto_tester_create();
  366: 
  367: #endif /** CRYPTO_TESTER_H_ @}*/

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