Annotation of embedaddon/strongswan/src/libstrongswan/crypto/crypto_tester.h, revision 1.1.1.1

1.1       misho       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>