aboutsummaryrefslogtreecommitdiffstats
path: root/src/libcharon/sa
diff options
context:
space:
mode:
Diffstat (limited to 'src/libcharon/sa')
-rw-r--r--src/libcharon/sa/keymat.c31
-rw-r--r--src/libcharon/sa/keymat.h17
2 files changed, 45 insertions, 3 deletions
diff --git a/src/libcharon/sa/keymat.c b/src/libcharon/sa/keymat.c
index 7ef0b9f5d..26c305f77 100644
--- a/src/libcharon/sa/keymat.c
+++ b/src/libcharon/sa/keymat.c
@@ -18,27 +18,33 @@
#include <sa/ikev1/keymat_v1.h>
#include <sa/ikev2/keymat_v2.h>
+static keymat_constructor_t keymat_v1_ctor = NULL, keymat_v2_ctor = NULL;
+
/**
* See header
*/
keymat_t *keymat_create(ike_version_t version, bool initiator)
{
+ keymat_t *keymat = NULL;
+
switch (version)
{
case IKEV1:
#ifdef USE_IKEV1
- return &keymat_v1_create(initiator)->keymat;
+ keymat = keymat_v1_ctor ? keymat_v1_ctor(initiator)
+ : &keymat_v1_create(initiator)->keymat;
#endif
break;
case IKEV2:
#ifdef USE_IKEV2
- return &keymat_v2_create(initiator)->keymat;
+ keymat = keymat_v2_ctor ? keymat_v2_ctor(initiator)
+ : &keymat_v2_create(initiator)->keymat;
#endif
break;
default:
break;
}
- return NULL;
+ return keymat;
}
/**
@@ -99,3 +105,22 @@ int keymat_get_keylen_integ(integrity_algorithm_t alg)
}
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;
+ }
+}
diff --git a/src/libcharon/sa/keymat.h b/src/libcharon/sa/keymat.h
index a64be2378..02db5ca58 100644
--- a/src/libcharon/sa/keymat.h
+++ b/src/libcharon/sa/keymat.h
@@ -32,6 +32,14 @@ typedef struct keymat_t keymat_t;
#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.
*/
struct keymat_t {
@@ -110,4 +118,13 @@ int keymat_get_keylen_encr(encryption_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_ @}*/