summaryrefslogtreecommitdiff
path: root/cesar/cp
diff options
context:
space:
mode:
Diffstat (limited to 'cesar/cp')
-rw-r--r--cesar/cp/mme.h19
-rw-r--r--cesar/cp/msg/inc/drv_sta_set_key.h23
-rw-r--r--cesar/cp/msg/inc/msg_drv.h42
-rw-r--r--cesar/cp/msg/src/msg_drv.c52
-rw-r--r--cesar/cp/msg/test/src/msg_drv.c112
5 files changed, 244 insertions, 4 deletions
diff --git a/cesar/cp/mme.h b/cesar/cp/mme.h
index 2e125bafeb..6a55514e54 100644
--- a/cesar/cp/mme.h
+++ b/cesar/cp/mme.h
@@ -92,8 +92,8 @@
#define DRV_STA_SET_MAC_ADDR 0xB000
#define DRV_STA_SET_CCO_PREF 0xB004
#define DRV_STA_SET_WAS_CCO 0xB008
-#define DRV_STA_SET_NPW 0xB00C
-#define DRV_STA_SET_DPW 0xB010
+#define DRV_STA_SET_NPW 0xB00C /* TODO to be removed #465*/
+#define DRV_STA_SET_DPW 0xB010 /* TODO to be removed #465*/
#define DRV_STA_SET_SL 0xB014
#define DRV_STA_SET_M_STA_HFID 0xB018
#define DRV_STA_SET_U_STA_HFID 0xB01C
@@ -103,7 +103,10 @@
#define DRV_STA_MAC_STOP 0xB02C
#define DRV_STA_SET_NID 0xB030
#define DRV_STA_SC 0xB034
-#define DRV_CCO_APPOINT 0xB038
+#define DRV_STA_STATUS 0xB03C
+#define DRV_STA_SET_KEY 0xB040
+#define DRV_STA_GET_KEY 0xB044
+#define DRV_STA_SET_DAK 0xB048
#define DRV_MIN 0xB000
#define DRV_MAX 0xBFFF
@@ -277,6 +280,16 @@ enum cp_mmtype_t
DRV_STA_SET_NID_CNF = DRV_STA_SET_NID + CP_MME_CNF,
DRV_STA_SC_REQ = DRV_STA_SC + CP_MME_REQ,
DRV_STA_SC_CNF = DRV_STA_SC + CP_MME_CNF,
+ DRV_STA_STATUS_REQ = DRV_STA_STATUS + CP_MME_REQ,
+ DRV_STA_STATUS_CNF = DRV_STA_STATUS + CP_MME_CNF,
+ DRV_STA_STATUS_IND = DRV_STA_STATUS + CP_MME_IND,
+ DRV_STA_SET_KEY_REQ = DRV_STA_SET_KEY + CP_MME_REQ,
+ DRV_STA_SET_KEY_CNF = DRV_STA_SET_KEY + CP_MME_CNF,
+ DRV_STA_SET_KEY_IND = DRV_STA_SET_KEY + CP_MME_IND,
+ DRV_STA_GET_KEY_REQ = DRV_STA_GET_KEY + CP_MME_REQ,
+ DRV_STA_GET_KEY_CNF = DRV_STA_GET_KEY + CP_MME_CNF,
+ DRV_STA_SET_DAK_REQ = DRV_STA_SET_DAK + CP_MME_REQ,
+ DRV_STA_SET_DAK_CNF = DRV_STA_SET_DAK + CP_MME_CNF,
VS_GET_TONEMAP_REQ = VS_GET_TONEMAP + CP_MME_REQ,
VS_GET_TONEMAP_CNF = VS_GET_TONEMAP + CP_MME_CNF,
diff --git a/cesar/cp/msg/inc/drv_sta_set_key.h b/cesar/cp/msg/inc/drv_sta_set_key.h
new file mode 100644
index 0000000000..fabe292e15
--- /dev/null
+++ b/cesar/cp/msg/inc/drv_sta_set_key.h
@@ -0,0 +1,23 @@
+#ifndef cp_msg_inc_drv_sta_set_key_h
+#define cp_msg_inc_drv_sta_set_key_h
+/* Cesar project {{{
+ *
+ * Copyright (C) 2009 Spidcom
+ *
+ * <<<Licence>>>
+ *
+ * }}} */
+/**
+ * \file cp/msg/inc/drv_sta_set_key.h
+ * \brief types for the DRV_STA_SET_KEY MMEs
+ * \ingroup cp_msg
+ */
+
+enum cp_msg_drv_sta_set_key_type_t
+{
+ CP_MSG_DRV_STA_SET_KEY_TYPE_CHANGE_NID,
+ CP_MSG_DRV_STA_SET_KEY_TYPE_CHANGE_SECURITY_LEVEL,
+ CP_MSG_DRV_STA_SET_KEY_TYPE_NB
+};
+
+#endif /* cp_msg_inc_drv_sta_set_key_h */
diff --git a/cesar/cp/msg/inc/msg_drv.h b/cesar/cp/msg/inc/msg_drv.h
index 6f41c974e6..304f382b01 100644
--- a/cesar/cp/msg/inc/msg_drv.h
+++ b/cesar/cp/msg/inc/msg_drv.h
@@ -13,6 +13,8 @@
* \ingroup cp_msg
*/
+#include "cp/msg/inc/drv_sta_set_key.h"
+
/** Result of a DRV family request. */
enum cp_msg_drv_result_t
{
@@ -173,6 +175,46 @@ bool
cp_msg_drv_sta_sc_req_receive (cp_t *ctx, cp_mme_rx_t *mme, bool *sc_join);
/**
+ * Receive a DRV_STA_SET_KEY.REQ.
+ * \param ctx control plane context.
+ * \param mme MME to handle.
+ * \param nmk the Network Membership Key.
+ * \param type Change type of security data.
+ * \param nid the Network identifier.
+ * \param sl the security level.
+ * \return true on success.
+ *
+ * type:
+ * - 0x00 = change the NID
+ * - 0x01 = change the security level (SL)
+ * - 0x02 - 0xff = reserved
+ *
+ * nid no meaning if type != 0x00
+ * sl no meaning of type != 0x01
+ */
+bool
+cp_msg_drv_sta_set_key_req_receive (cp_t *ctx, cp_mme_rx_t *mme, u8 *nmk,
+ enum cp_msg_drv_sta_set_key_type_t *type,
+ cp_nid_t *nid,
+ cp_security_level_t *sl);
+
+/**
+ * Send a DRV_STA_SET_KEY.CNF.
+ * \param ctx control plane context.
+ * \param peer the peer info.
+ * \param nmk the Network Membership Key.
+ * \param type the key type.
+ * \param nid the Network identifier.
+ * \param sl the security level.
+ */
+void
+cp_msg_drv_sta_set_key_ind_send (cp_t *ctx, cp_mme_peer_t *peer, u8 *nmk,
+ enum cp_msg_drv_sta_set_key_type_t type,
+ cp_nid_t nid,
+ cp_security_level_t sl);
+
+
+/**
* Send a DRV_....CNF, works for any DRV messages.
* \param ctx control plane context
* \param peer peer information
diff --git a/cesar/cp/msg/src/msg_drv.c b/cesar/cp/msg/src/msg_drv.c
index 0aae66fe9b..f88aa62694 100644
--- a/cesar/cp/msg/src/msg_drv.c
+++ b/cesar/cp/msg/src/msg_drv.c
@@ -350,6 +350,58 @@ cp_msg_drv_sta_mac_stop_req_receive (cp_t *ctx, cp_mme_rx_t *mme)
return true;
}
+bool
+cp_msg_drv_sta_set_key_req_receive (cp_t *ctx, cp_mme_rx_t *mme, u8 *nmk,
+ enum cp_msg_drv_sta_set_key_type_t *type,
+ cp_nid_t *nid,
+ cp_security_level_t *sl)
+{
+ dbg_assert (ctx);
+ dbg_assert (mme);
+ dbg_assert (nmk);
+ dbg_assert (type);
+ dbg_assert (nid);
+ dbg_assert (sl);
+
+ if (cp_msg_mme_read_error (ctx, mme))
+ {
+ bitstream_read_buf (&mme->bitstream, nmk, 16);
+ *type = bitstream_read (&mme->bitstream, 8);
+ *nid = bitstream_read_large (&mme->bitstream, 56);
+ *sl = bitstream_read (&mme->bitstream, 8);
+
+ if ((*type >= CP_MSG_DRV_STA_SET_KEY_TYPE_NB)
+ || (*sl >= CP_SECURITY_LEVEL_NB)
+ || (*nid >> CP_NID_SIZE_BITS))
+ return false;
+ return true;
+ }
+ return false;
+}
+
+void
+cp_msg_drv_sta_set_key_ind_send (cp_t *ctx, cp_mme_peer_t *peer, u8 *nmk,
+ enum cp_msg_drv_sta_set_key_type_t type,
+ cp_nid_t nid,
+ cp_security_level_t sl)
+{
+ cp_mme_tx_t *tx;
+
+ dbg_assert (ctx);
+ dbg_assert (peer);
+ dbg_assert (nmk);
+
+ tx = cp_msg_mme_init (ctx, peer, DRV_STA_SET_KEY_IND);
+ dbg_assert (tx);
+
+ bitstream_write_buf (&tx->bitstream, nmk, CP_NMK_SIZE);
+ bitstream_write (&tx->bitstream, type, 8);
+ bitstream_write_large (&tx->bitstream, nid, 56);
+ bitstream_write (&tx->bitstream, sl, 8);
+
+ cp_msg_mme_send (ctx, tx);
+}
+
/**
* Send a DRV_....CNF, works for any DRV messages.
* \param ctx control plane context
diff --git a/cesar/cp/msg/test/src/msg_drv.c b/cesar/cp/msg/test/src/msg_drv.c
index 70f1bb5d40..1c68578f64 100644
--- a/cesar/cp/msg/test/src/msg_drv.c
+++ b/cesar/cp/msg/test/src/msg_drv.c
@@ -22,7 +22,7 @@
#include "cp/cp.h"
#include "cp/inc/context.h"
#include "cp/msg/msg.h"
-
+#include "cp/cl_interf/cl_interf.h"
void
test_case_msg_drv_set_mac_addr (test_t test)
@@ -407,6 +407,115 @@ test_case_sc (test_t test)
test_end;
}
+
+void
+test_case_drv_set_key (test_t test)
+{
+ cp_t cp;
+ u8 buffer [60];
+ cp_mme_rx_t mme;
+ test_case_begin (test, "DRV SET KEY");
+ u8 nmk[CP_NMK_SIZE];
+ enum cp_msg_drv_sta_set_key_type_t type;
+ cp_nid_t nid;
+ cp_security_level_t sl;
+ bool ok;
+
+ mme.p_mme = buffer;
+ mme.length = 60;
+ mme.peer.mac = MAC_TEI_FOREIGN;
+
+ memset (&cp, 0, sizeof (cp_t));
+ cp_msg_init (&cp);
+
+ test_begin (test, "Good one")
+ {
+ /* Write NMK in the buffer. */
+ bitstream_direct_write (buffer, 0, 0x1, 32);
+ bitstream_direct_write (buffer, 32, 0x2, 32);
+ bitstream_direct_write (buffer, 64, 0x3, 32);
+ bitstream_direct_write (buffer, 96, 0x4, 32);
+ /* Type. */
+ bitstream_direct_write (buffer, 128,
+ CP_MSG_DRV_STA_SET_KEY_TYPE_CHANGE_NID,
+ 8);
+ /* NID. */
+ bitstream_direct_write_large (buffer, 136, 0x123456789abcdeull, 56);
+ /* SL no meaning. */
+
+ bitstream_read_init (&mme.bitstream, buffer, 60);
+ ok = cp_msg_drv_sta_set_key_req_receive (&cp, &mme, nmk, &type, &nid,
+ &sl);
+
+ test_fail_unless (ok == true);
+ test_fail_unless (bitstream_direct_read (nmk, 0, 32) == 1);
+ test_fail_unless (bitstream_direct_read (nmk, 32, 32) == 2);
+ test_fail_unless (bitstream_direct_read (nmk, 64, 32) == 3);
+ test_fail_unless (bitstream_direct_read (nmk, 96, 32) == 4);
+ test_fail_unless (type == CP_MSG_DRV_STA_SET_KEY_TYPE_CHANGE_NID);
+ test_fail_unless (nid == 0x123456789abcdeull);
+ }
+ test_end;
+
+ test_begin (test, "Wrong one")
+ {
+ bitstream_direct_write (buffer, 128,
+ CP_MSG_DRV_STA_SET_KEY_TYPE_NB, 8);
+
+ bitstream_read_init (&mme.bitstream, buffer, 60);
+ ok = cp_msg_drv_sta_set_key_req_receive (&cp, &mme, nmk, &type, &nid,
+ &sl);
+
+ test_fail_unless (ok == false);
+ test_fail_unless (type == CP_MSG_DRV_STA_SET_KEY_TYPE_NB);
+
+ bitstream_direct_write (buffer, 128,
+ CP_MSG_DRV_STA_SET_KEY_TYPE_CHANGE_SECURITY_LEVEL,
+ 8);
+
+ bitstream_direct_write (buffer, 192, CP_SECURITY_LEVEL_NB, 8);
+ bitstream_read_init (&mme.bitstream, buffer, 60);
+ ok = cp_msg_drv_sta_set_key_req_receive (&cp, &mme, nmk, &type, &nid,
+ &sl);
+ test_fail_unless (ok == false);
+ test_fail_unless (sl == CP_MSG_DRV_STA_SET_KEY_TYPE_NB);
+ }
+ test_end;
+
+ test_case_begin (test, "SET_KEY.IND");
+
+ test_begin (test, "Good one")
+ {
+ u8 *current_buff;
+ cp_mme_peer_t peer = CP_MME_PEER (0x123456ull, MAC_TEI_FOREIGN);
+ type = CP_MSG_DRV_STA_SET_KEY_TYPE_CHANGE_NID;
+ sl = CP_SECURITY_LEVEL_SC;
+ nid = 0x123456789abcdeull;
+ bitstream_direct_write (nmk, 0, 1, 32);
+ bitstream_direct_write (nmk, 32, 2, 32);
+ bitstream_direct_write (nmk, 64, 3, 32);
+ bitstream_direct_write (nmk, 96, 4, 32);
+
+ cp_msg_drv_sta_set_key_ind_send (&cp, &peer, nmk, type, nid, sl);
+
+ current_buff = cp_cl_interf_get_buffer_tx (&cp);
+ test_fail_unless (bitstream_direct_read (current_buff, 120, 16) ==
+ DRV_STA_SET_KEY_IND);
+ test_fail_unless (bitstream_direct_read (current_buff, 152, 32) == 1);
+ test_fail_unless (bitstream_direct_read (current_buff, 184, 32) == 2);
+ test_fail_unless (bitstream_direct_read (current_buff, 216, 32) == 3);
+ test_fail_unless (bitstream_direct_read (current_buff, 248, 32) == 4);
+ test_fail_unless (bitstream_direct_read (current_buff, 280, 8) ==
+ type);
+ test_fail_unless (bitstream_direct_read_large (current_buff, 288, 56)
+ == nid);
+ test_fail_unless (bitstream_direct_read (current_buff, 344, 8) == sl);
+ }
+ test_end;
+
+ cp_msg_uninit (&cp);
+}
+
int
main (void)
{
@@ -422,6 +531,7 @@ main (void)
test_case_security_level (test);
test_case_msg_drv_nid (test);
test_case_sc (test);
+ test_case_drv_set_key (test);
test_case_begin (test, "Memory allocation");
test_begin (test, "memory leaks")