Skip to content

Commit 71ea875

Browse files
SeppoTakalorlubos
authored andcommitted
net: lwm2m_client_utils: Clear sec_tag content when overwriting
When writing new content to security tag, clear existing information first, that might cause problems. For example, when writing PSK, delete all certificates. When writing certificates, delete all PSK data. Signed-off-by: Seppo Takalo <[email protected]>
1 parent 6b28fe6 commit 71ea875

File tree

4 files changed

+34
-1
lines changed

4 files changed

+34
-1
lines changed

subsys/net/lib/lwm2m_client_utils/lwm2m/lwm2m_security.c

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,11 +128,30 @@ static int write_credential_type(int sec_obj_inst, int sec_tag, int res_id,
128128
return 0;
129129
}
130130

131+
static void delete_credential_if_exist(int sec_tag, enum modem_key_mgmt_cred_type type)
132+
{
133+
bool exist = false;
134+
int ret;
135+
136+
ret = modem_key_mgmt_exists(sec_tag, type, &exist);
137+
if (exist) {
138+
ret = modem_key_mgmt_delete(sec_tag, type);
139+
LOG_DBG("Deleted sec_tag %d, type %d", sec_tag, type);
140+
}
141+
if (ret < 0) {
142+
LOG_ERR("Failed to delete credential %d", ret);
143+
}
144+
}
145+
131146
static int write_sec_obj_to_sec_tag(int sec_obj_inst, int sec_tag, int mode)
132147
{
133148
int ret;
134149

135150
if (mode == SEC_MODE_PSK) {
151+
delete_credential_if_exist(sec_tag, MODEM_KEY_MGMT_CRED_TYPE_CA_CHAIN);
152+
delete_credential_if_exist(sec_tag, MODEM_KEY_MGMT_CRED_TYPE_PUBLIC_CERT);
153+
delete_credential_if_exist(sec_tag, MODEM_KEY_MGMT_CRED_TYPE_PRIVATE_CERT);
154+
136155
ret = write_credential_type(sec_obj_inst, sec_tag, SECURITY_CLIENT_PK_ID,
137156
MODEM_KEY_MGMT_CRED_TYPE_IDENTITY);
138157
if (ret) {
@@ -145,6 +164,9 @@ static int write_sec_obj_to_sec_tag(int sec_obj_inst, int sec_tag, int mode)
145164
goto out;
146165
}
147166
} else if (mode == SEC_MODE_CERTIFICATE) {
167+
delete_credential_if_exist(sec_tag, MODEM_KEY_MGMT_CRED_TYPE_PSK);
168+
delete_credential_if_exist(sec_tag, MODEM_KEY_MGMT_CRED_TYPE_IDENTITY);
169+
148170
/* Don't fail if we already have a given data in the modem and we did not receive
149171
* that as part of bootstrap. It might have been written as part of EST process.
150172
*/

tests/subsys/net/lib/lwm2m_client_utils/src/security.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -502,11 +502,19 @@ ZTEST(lwm2m_client_utils_security, test_load_credentials_PSK)
502502
modem_key_mgmt_write_fake.custom_fake = write_to_modem;
503503
modem_key_mgmt_exists_fake.custom_fake = modem_key_mgmt_exists_custom_fake;
504504
ctx.bootstrap_mode = false;
505+
keys_exist = true;
505506

506507
rc = ctx.load_credentials(&ctx);
507508
zassert_equal(rc, 0, "wrong return value");
508-
zassert_equal(modem_key_mgmt_exists_fake.call_count, 5, "Did not check existing (%d)",
509+
zassert_equal(modem_key_mgmt_exists_fake.call_count, 8, "Did not check existing (%d)",
509510
modem_key_mgmt_exists_fake.call_count);
511+
zassert_equal(modem_key_mgmt_delete_fake.call_count, 3, "Did not remove old keys");
512+
zassert_equal(modem_key_mgmt_delete_fake.arg1_history[0], MODEM_KEY_MGMT_CRED_TYPE_CA_CHAIN,
513+
"");
514+
zassert_equal(modem_key_mgmt_delete_fake.arg1_history[1],
515+
MODEM_KEY_MGMT_CRED_TYPE_PUBLIC_CERT, "");
516+
zassert_equal(modem_key_mgmt_delete_fake.arg1_history[2],
517+
MODEM_KEY_MGMT_CRED_TYPE_PRIVATE_CERT, "");
510518
zassert_equal(modem_key_mgmt_write_fake.call_count, 2, "Did not write PSK");
511519
zassert_equal(lte_lc_func_mode_set_fake.call_count, 1, "Did not set mode");
512520
zassert_equal(lte_lc_func_mode_set_fake.arg0_val, LTE_LC_FUNC_MODE_OFFLINE,

tests/subsys/net/lib/lwm2m_client_utils/src/stubs.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ DEFINE_FAKE_VALUE_FUNC(int, modem_key_mgmt_exists, nrf_sec_tag_t, enum modem_key
5656
bool *);
5757
DEFINE_FAKE_VALUE_FUNC(int, modem_key_mgmt_write, nrf_sec_tag_t, enum modem_key_mgmt_cred_type,
5858
const void *, size_t);
59+
DEFINE_FAKE_VALUE_FUNC(int, modem_key_mgmt_delete, nrf_sec_tag_t, enum modem_key_mgmt_cred_type);
5960
DEFINE_FAKE_VALUE_FUNC(int, lte_lc_func_mode_set, enum lte_lc_func_mode);
6061
DEFINE_FAKE_VALUE_FUNC(int, lte_lc_connect);
6162
DEFINE_FAKE_VALUE_FUNC(int, lte_lc_offline);

tests/subsys/net/lib/lwm2m_client_utils/src/stubs.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ DECLARE_FAKE_VALUE_FUNC(int, modem_key_mgmt_exists, nrf_sec_tag_t, enum modem_ke
5050
bool *);
5151
DECLARE_FAKE_VALUE_FUNC(int, modem_key_mgmt_write, nrf_sec_tag_t, enum modem_key_mgmt_cred_type,
5252
const void *, size_t);
53+
DECLARE_FAKE_VALUE_FUNC(int, modem_key_mgmt_delete, nrf_sec_tag_t, enum modem_key_mgmt_cred_type);
5354
DECLARE_FAKE_VALUE_FUNC(int, lte_lc_func_mode_set, enum lte_lc_func_mode);
5455
DECLARE_FAKE_VALUE_FUNC(int, lte_lc_connect);
5556
DECLARE_FAKE_VALUE_FUNC(int, lte_lc_offline);
@@ -140,6 +141,7 @@ DECLARE_FAKE_VOID_FUNC(boot_write_img_confirmed);
140141
FUNC(lwm2m_rd_client_update) \
141142
FUNC(modem_key_mgmt_exists) \
142143
FUNC(modem_key_mgmt_write) \
144+
FUNC(modem_key_mgmt_delete) \
143145
FUNC(modem_info_init) \
144146
FUNC(modem_info_params_init) \
145147
FUNC(modem_info_params_get) \

0 commit comments

Comments
 (0)