Use rng to generate local ESP SPIs
This commit is contained in:
committed by
Tobias Brunner
parent
6ed5c3bb1e
commit
d0ab667c99
@@ -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"),
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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"),
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user