Use rng to generate local ESP SPIs

This commit is contained in:
Adrian-Ken Rueegsegger
2013-03-19 15:23:48 +01:00
committed by Tobias Brunner
parent 6ed5c3bb1e
commit d0ab667c99
3 changed files with 19 additions and 4 deletions
+1 -1
View File
@@ -28,7 +28,6 @@
#include <hydra.h> #include <hydra.h>
#include <daemon.h> #include <daemon.h>
#include <plugins/kernel_netlink/kernel_netlink_net.h> #include <plugins/kernel_netlink/kernel_netlink_net.h>
#include <library.h> #include <library.h>
#include <utils/backtrace.h> #include <utils/backtrace.h>
#include <threading/thread.h> #include <threading/thread.h>
@@ -288,6 +287,7 @@ int main(int argc, char *argv[])
PLUGIN_PROVIDE(DH, MODP_4096_BIT), PLUGIN_PROVIDE(DH, MODP_4096_BIT),
PLUGIN_CALLBACK(kernel_ipsec_register, tkm_kernel_ipsec_create), PLUGIN_CALLBACK(kernel_ipsec_register, tkm_kernel_ipsec_create),
PLUGIN_PROVIDE(CUSTOM, "kernel-ipsec"), PLUGIN_PROVIDE(CUSTOM, "kernel-ipsec"),
PLUGIN_DEPENDS(RNG, RNG_WEAK),
PLUGIN_CALLBACK(kernel_net_register, kernel_netlink_net_create), PLUGIN_CALLBACK(kernel_net_register, kernel_netlink_net_create),
PLUGIN_PROVIDE(CUSTOM, "kernel-net"), PLUGIN_PROVIDE(CUSTOM, "kernel-net"),
+17 -3
View File
@@ -38,6 +38,11 @@ struct private_tkm_kernel_ipsec_t {
*/ */
tkm_kernel_ipsec_t public; tkm_kernel_ipsec_t public;
/**
* RNG used for SPI generation.
*/
rng_t *rng;
/** /**
* Local CHILD SA SPI. * Local CHILD SA SPI.
*/ */
@@ -50,9 +55,9 @@ METHOD(kernel_ipsec_t, get_spi, status_t,
u_int8_t protocol, u_int32_t reqid, u_int32_t *spi) u_int8_t protocol, u_int32_t reqid, u_int32_t *spi)
{ {
DBG1(DBG_KNL, "getting SPI for reqid {%u}", reqid); DBG1(DBG_KNL, "getting SPI for reqid {%u}", reqid);
/* fake SPI for now */ const bool result = this->rng->get_bytes(this->rng, sizeof(u_int32_t),
*spi = 92726226; (u_int8_t *)spi);
return SUCCESS; return result ? SUCCESS : FAILED;
} }
METHOD(kernel_ipsec_t, get_cpi, status_t, METHOD(kernel_ipsec_t, get_cpi, status_t,
@@ -209,6 +214,7 @@ METHOD(kernel_ipsec_t, enable_udp_decap, bool,
METHOD(kernel_ipsec_t, destroy, void, METHOD(kernel_ipsec_t, destroy, void,
private_tkm_kernel_ipsec_t *this) private_tkm_kernel_ipsec_t *this)
{ {
DESTROY_IF(this->rng);
free(this); free(this);
} }
@@ -238,8 +244,16 @@ tkm_kernel_ipsec_t *tkm_kernel_ipsec_create()
.destroy = _destroy, .destroy = _destroy,
}, },
}, },
.rng = lib->crypto->create_rng(lib->crypto, RNG_WEAK),
.esp_spi_loc = 0, .esp_spi_loc = 0,
); );
if (!this->rng)
{
DBG1(DBG_KNL, "unable to create RNG");
destroy(this);
return NULL;
}
return &this->public; return &this->public;
} }
+1
View File
@@ -43,6 +43,7 @@ START_TEST(test_derive_ike_keys)
PLUGIN_PROVIDE(DH, MODP_4096_BIT), PLUGIN_PROVIDE(DH, MODP_4096_BIT),
PLUGIN_CALLBACK(kernel_ipsec_register, tkm_kernel_ipsec_create), PLUGIN_CALLBACK(kernel_ipsec_register, tkm_kernel_ipsec_create),
PLUGIN_PROVIDE(CUSTOM, "kernel-ipsec"), PLUGIN_PROVIDE(CUSTOM, "kernel-ipsec"),
PLUGIN_DEPENDS(RNG, RNG_WEAK),
PLUGIN_CALLBACK(kernel_net_register, kernel_netlink_net_create), PLUGIN_CALLBACK(kernel_net_register, kernel_netlink_net_create),
PLUGIN_PROVIDE(CUSTOM, "kernel-net"), PLUGIN_PROVIDE(CUSTOM, "kernel-net"),
}; };