Add keymat_t constructor registration function

Using the register_constructor function enables custom keymat_t
implementations per IKE version. If no constructor is registered the
default behavior is preserved.
This commit is contained in:
Adrian-Ken Rueegsegger
2012-08-20 13:02:47 +02:00
committed by Tobias Brunner
parent 0810286269
commit acf27437cd
2 changed files with 45 additions and 3 deletions
+28 -3
View File
@@ -18,27 +18,33 @@
#include <sa/ikev1/keymat_v1.h> #include <sa/ikev1/keymat_v1.h>
#include <sa/ikev2/keymat_v2.h> #include <sa/ikev2/keymat_v2.h>
static keymat_constructor_t keymat_v1_ctor = NULL, keymat_v2_ctor = NULL;
/** /**
* See header * See header
*/ */
keymat_t *keymat_create(ike_version_t version, bool initiator) keymat_t *keymat_create(ike_version_t version, bool initiator)
{ {
keymat_t *keymat = NULL;
switch (version) switch (version)
{ {
case IKEV1: case IKEV1:
#ifdef USE_IKEV1 #ifdef USE_IKEV1
return &keymat_v1_create(initiator)->keymat; keymat = keymat_v1_ctor ? keymat_v1_ctor(initiator)
: &keymat_v1_create(initiator)->keymat;
#endif #endif
break; break;
case IKEV2: case IKEV2:
#ifdef USE_IKEV2 #ifdef USE_IKEV2
return &keymat_v2_create(initiator)->keymat; keymat = keymat_v2_ctor ? keymat_v2_ctor(initiator)
: &keymat_v2_create(initiator)->keymat;
#endif #endif
break; break;
default: default:
break; break;
} }
return NULL; return keymat;
} }
/** /**
@@ -99,3 +105,22 @@ int keymat_get_keylen_integ(integrity_algorithm_t alg)
} }
return 0; return 0;
} }
/**
* See header.
*/
void keymat_register_constructor(ike_version_t version,
keymat_constructor_t create)
{
switch (version)
{
case IKEV1:
keymat_v1_ctor = create;
break;
case IKEV2:
keymat_v2_ctor = create;
break;
default:
break;
}
}
+17
View File
@@ -31,6 +31,14 @@ typedef struct keymat_t keymat_t;
#include <config/peer_cfg.h> #include <config/peer_cfg.h>
#include <sa/ike_sa_id.h> #include <sa/ike_sa_id.h>
/**
* Constructor function for custom keymat implementations
*
* @param initiator TRUE if the keymat is used as initiator
* @return keymat_t implementation
*/
typedef keymat_t* (*keymat_constructor_t)(bool initiator);
/** /**
* Derivation an management of sensitive keying material. * Derivation an management of sensitive keying material.
*/ */
@@ -110,4 +118,13 @@ int keymat_get_keylen_encr(encryption_algorithm_t alg);
*/ */
int keymat_get_keylen_integ(integrity_algorithm_t alg); int keymat_get_keylen_integ(integrity_algorithm_t alg);
/**
* Register keymat_t constructor for given IKE version.
*
* @param version IKE version of given keymat constructor
* @param create keymat constructor function, NULL to unregister
*/
void keymat_register_constructor(ike_version_t version,
keymat_constructor_t create);
#endif /** KEYMAT_H_ @}*/ #endif /** KEYMAT_H_ @}*/