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

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