Skip to content

Commit 1d4ac45

Browse files
[Android] Implement remove ICD Client Info (#33843)
* Implement remove ICD Client Info in Android platform * Add store, delete ICDClientinfo method * Restyled by whitespace * Restyled by google-java-format * Restyled by clang-format --------- Co-authored-by: Restyled.io <commits@restyled.io>
1 parent 540c991 commit 1d4ac45

File tree

7 files changed

+171
-0
lines changed

7 files changed

+171
-0
lines changed

examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/provisioning/UnpairDeviceFragment.kt

+14
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,13 @@ import android.view.ViewGroup
88
import androidx.fragment.app.Fragment
99
import androidx.lifecycle.lifecycleScope
1010
import chip.devicecontroller.ChipDeviceController
11+
import chip.devicecontroller.ChipICDClient
1112
import chip.devicecontroller.UnpairDeviceCallback
1213
import com.google.chip.chiptool.ChipClient
1314
import com.google.chip.chiptool.R
1415
import com.google.chip.chiptool.clusterclient.AddressUpdateFragment
1516
import com.google.chip.chiptool.databinding.UnpairDeviceFragmentBinding
17+
import com.google.chip.chiptool.util.DeviceIdUtil
1618
import kotlinx.coroutines.*
1719

1820
class UnpairDeviceFragment : Fragment() {
@@ -63,6 +65,18 @@ class UnpairDeviceFragment : Fragment() {
6365
addressUpdateFragment.deviceId,
6466
ChipUnpairDeviceCallback()
6567
)
68+
69+
// Remove ICD Client info
70+
if (addressUpdateFragment.isICDDevice()) {
71+
ChipICDClient.clearICDClientInfo(deviceController.fabricIndex, addressUpdateFragment.deviceId)
72+
73+
Log.d(TAG, "ICDClientInfo : ${ChipICDClient.getICDClientInfo(deviceController.fabricIndex)}")
74+
}
75+
requireActivity().runOnUiThread {
76+
Log.d(TAG, "remove : ${addressUpdateFragment.deviceId}")
77+
DeviceIdUtil.removeCommissionedNodeId(requireContext(), addressUpdateFragment.deviceId)
78+
addressUpdateFragment.updateDeviceIdSpinner()
79+
}
6680
}
6781

6882
companion object {

src/controller/java/AndroidICDClient.cpp

+102
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,11 @@
2525
#include "AndroidICDClient.h"
2626

2727
#include <app/icd/client/ICDClientInfo.h>
28+
#include <lib/support/JniTypeWrappers.h>
2829

2930
chip::app::DefaultICDClientStorage sICDClientStorage;
31+
static CHIP_ERROR ParseICDClientInfo(JNIEnv * env, jint jFabricIndex, jobject jIcdClientInfo,
32+
chip::app::ICDClientInfo & icdClientInfo);
3033

3134
jobject getICDClientInfo(JNIEnv * env, const char * icdClientInfoSign, jint jFabricIndex)
3235
{
@@ -93,6 +96,105 @@ jobject getICDClientInfo(JNIEnv * env, const char * icdClientInfoSign, jint jFab
9396
return jInfo;
9497
}
9598

99+
CHIP_ERROR StoreICDEntryWithKey(JNIEnv * env, jint jFabricIndex, jobject jicdClientInfo, jbyteArray jKey)
100+
{
101+
CHIP_ERROR err = CHIP_NO_ERROR;
102+
103+
chip::app::ICDClientInfo clientInfo;
104+
chip::JniByteArray jniKey(env, jKey);
105+
106+
err = ParseICDClientInfo(env, jFabricIndex, jicdClientInfo, clientInfo);
107+
VerifyOrReturnValue(err == CHIP_NO_ERROR, err,
108+
ChipLogError(Controller, "Failed to parse ICD Client info: %" CHIP_ERROR_FORMAT, err.Format()));
109+
110+
err = getICDClientStorage()->SetKey(clientInfo, jniKey.byteSpan());
111+
112+
if (err == CHIP_NO_ERROR)
113+
{
114+
err = getICDClientStorage()->StoreEntry(clientInfo);
115+
}
116+
else
117+
{
118+
getICDClientStorage()->RemoveKey(clientInfo);
119+
ChipLogError(Controller, "Failed to persist symmetric key with error: %" CHIP_ERROR_FORMAT, err.Format());
120+
}
121+
122+
return err;
123+
}
124+
125+
CHIP_ERROR RemoveICDEntryWithKey(JNIEnv * env, jint jFabricIndex, jobject jicdClientInfo)
126+
{
127+
CHIP_ERROR err = CHIP_NO_ERROR;
128+
129+
chip::app::ICDClientInfo info;
130+
err = ParseICDClientInfo(env, jFabricIndex, jicdClientInfo, info);
131+
VerifyOrReturnValue(err == CHIP_NO_ERROR, err,
132+
ChipLogError(Controller, "Failed to parse ICD Client info: %" CHIP_ERROR_FORMAT, err.Format()));
133+
134+
getICDClientStorage()->RemoveKey(info);
135+
136+
return err;
137+
}
138+
139+
CHIP_ERROR ClearICDClientInfo(JNIEnv * env, jint jFabricIndex, jlong jNodeId)
140+
{
141+
CHIP_ERROR err = CHIP_NO_ERROR;
142+
143+
chip::ScopedNodeId scopedNodeId(static_cast<chip::NodeId>(jNodeId), static_cast<chip::FabricIndex>(jFabricIndex));
144+
err = getICDClientStorage()->DeleteEntry(scopedNodeId);
145+
if (err != CHIP_NO_ERROR)
146+
{
147+
ChipLogError(Controller, "ClearICDClientInfo error!: %" CHIP_ERROR_FORMAT, err.Format());
148+
}
149+
return err;
150+
}
151+
152+
CHIP_ERROR ParseICDClientInfo(JNIEnv * env, jint jFabricIndex, jobject jIcdClientInfo, chip::app::ICDClientInfo & icdClientInfo)
153+
{
154+
VerifyOrReturnError(jIcdClientInfo != nullptr, CHIP_ERROR_INVALID_ARGUMENT);
155+
156+
jmethodID getPeerNodeIdMethod = nullptr;
157+
jmethodID getStartCounterMethod = nullptr;
158+
jmethodID getOffsetMethod = nullptr;
159+
jmethodID getMonitoredSubjectMethod = nullptr;
160+
jmethodID getIcdAesKeyMethod = nullptr;
161+
jmethodID getIcdHmacKeyMethod = nullptr;
162+
163+
ReturnErrorOnFailure(
164+
chip::JniReferences::GetInstance().FindMethod(env, jIcdClientInfo, "getPeerNodeId", "()J", &getPeerNodeIdMethod));
165+
ReturnErrorOnFailure(
166+
chip::JniReferences::GetInstance().FindMethod(env, jIcdClientInfo, "getStartCounter", "()J", &getStartCounterMethod));
167+
ReturnErrorOnFailure(chip::JniReferences::GetInstance().FindMethod(env, jIcdClientInfo, "getOffset", "()J", &getOffsetMethod));
168+
ReturnErrorOnFailure(chip::JniReferences::GetInstance().FindMethod(env, jIcdClientInfo, "getMonitoredSubject", "()J",
169+
&getMonitoredSubjectMethod));
170+
ReturnErrorOnFailure(
171+
chip::JniReferences::GetInstance().FindMethod(env, jIcdClientInfo, "getIcdAesKey", "()[B", &getIcdAesKeyMethod));
172+
ReturnErrorOnFailure(
173+
chip::JniReferences::GetInstance().FindMethod(env, jIcdClientInfo, "getIcdHmacKey", "()[B", &getIcdHmacKeyMethod));
174+
175+
jlong jPeerNodeId = env->CallLongMethod(jIcdClientInfo, getPeerNodeIdMethod);
176+
jlong jStartCounter = env->CallLongMethod(jIcdClientInfo, getStartCounterMethod);
177+
jlong jOffset = env->CallLongMethod(jIcdClientInfo, getOffsetMethod);
178+
jlong jMonitoredSubject = env->CallLongMethod(jIcdClientInfo, getMonitoredSubjectMethod);
179+
jbyteArray jIcdAesKey = static_cast<jbyteArray>(env->CallObjectMethod(jIcdClientInfo, getIcdAesKeyMethod));
180+
jbyteArray jIcdHmacKey = static_cast<jbyteArray>(env->CallObjectMethod(jIcdClientInfo, getIcdHmacKeyMethod));
181+
182+
chip::ScopedNodeId scopedNodeId(static_cast<chip::NodeId>(jPeerNodeId), static_cast<chip::FabricIndex>(jFabricIndex));
183+
chip::JniByteArray jniIcdAesKey(env, jIcdAesKey);
184+
chip::JniByteArray jniIcdHmacKey(env, jIcdHmacKey);
185+
186+
icdClientInfo.peer_node = scopedNodeId;
187+
icdClientInfo.start_icd_counter = static_cast<uint32_t>(jStartCounter);
188+
icdClientInfo.offset = static_cast<uint32_t>(jOffset);
189+
icdClientInfo.monitored_subject = static_cast<uint64_t>(jMonitoredSubject);
190+
memcpy(icdClientInfo.aes_key_handle.AsMutable<chip::Crypto::Symmetric128BitsKeyByteArray>(), jniIcdAesKey.data(),
191+
sizeof(chip::Crypto::Symmetric128BitsKeyByteArray));
192+
memcpy(icdClientInfo.hmac_key_handle.AsMutable<chip::Crypto::Symmetric128BitsKeyByteArray>(), jniIcdHmacKey.data(),
193+
sizeof(chip::Crypto::Symmetric128BitsKeyByteArray));
194+
195+
return CHIP_NO_ERROR;
196+
}
197+
96198
chip::app::DefaultICDClientStorage * getICDClientStorage()
97199
{
98200
return &sICDClientStorage;

src/controller/java/AndroidICDClient.h

+6
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,10 @@
2929

3030
jobject getICDClientInfo(JNIEnv * env, const char * icdClientInfoSign, jint jFabricIndex);
3131

32+
CHIP_ERROR StoreICDEntryWithKey(JNIEnv * env, jint jFabricIndex, jobject jicdClientInfo, jbyteArray jKey);
33+
34+
CHIP_ERROR RemoveICDEntryWithKey(JNIEnv * env, jint jFabricIndex, jobject jicdClientInfo);
35+
36+
CHIP_ERROR ClearICDClientInfo(JNIEnv * env, jint jFabricIndex, jlong jNodeId);
37+
3238
chip::app::DefaultICDClientStorage * getICDClientStorage();

src/controller/java/CHIPICDClient-JNI.cpp

+18
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,21 @@ JNI_METHOD(jobject, getICDClientInfo)(JNIEnv * env, jobject self, jint jFabricIn
2727

2828
return getICDClientInfo(env, "chip/devicecontroller/ICDClientInfo", jFabricIndex);
2929
}
30+
31+
JNI_METHOD(void, storeICDEntryWithKey)(JNIEnv * env, jobject self, jint jFabricIndex, jobject jicdClientInfo, jbyteArray jKey)
32+
{
33+
chip::DeviceLayer::StackLock lock;
34+
StoreICDEntryWithKey(env, jFabricIndex, jicdClientInfo, jKey);
35+
}
36+
37+
JNI_METHOD(void, removeICDEntryWithKey)(JNIEnv * env, jobject self, jint jFabricIndex, jobject jicdClientInfo)
38+
{
39+
chip::DeviceLayer::StackLock lock;
40+
RemoveICDEntryWithKey(env, jFabricIndex, jicdClientInfo);
41+
}
42+
43+
JNI_METHOD(void, clearICDClientInfo)(JNIEnv * env, jobject self, jint jFabricIndex, jlong jNodeId)
44+
{
45+
chip::DeviceLayer::StackLock lock;
46+
ClearICDClientInfo(env, jFabricIndex, jNodeId);
47+
}

src/controller/java/MatterICDClient-JNI.cpp

+18
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,21 @@ JNI_METHOD(jobject, getICDClientInfo)(JNIEnv * env, jobject self, jint jFabricIn
2727

2828
return getICDClientInfo(env, "matter/controller/ICDClientInfo", jFabricIndex);
2929
}
30+
31+
JNI_METHOD(void, storeICDEntryWithKey)(JNIEnv * env, jobject self, jint jFabricIndex, jobject jicdClientInfo, jbyteArray jKey)
32+
{
33+
chip::DeviceLayer::StackLock lock;
34+
StoreICDEntryWithKey(env, jFabricIndex, jicdClientInfo, jKey);
35+
}
36+
37+
JNI_METHOD(void, removeICDEntryWithKey)(JNIEnv * env, jobject self, jint jFabricIndex, jobject jicdClientInfo)
38+
{
39+
chip::DeviceLayer::StackLock lock;
40+
RemoveICDEntryWithKey(env, jFabricIndex, jicdClientInfo);
41+
}
42+
43+
JNI_METHOD(void, clearICDClientInfo)(JNIEnv * env, jobject self, jint jFabricIndex, jlong jNodeId)
44+
{
45+
chip::DeviceLayer::StackLock lock;
46+
ClearICDClientInfo(env, jFabricIndex, jNodeId);
47+
}

src/controller/java/src/chip/devicecontroller/ChipICDClient.java

+7
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,12 @@ public static boolean isPeerICDClient(int fabricIndex, long deviceId) {
3030
return clientInfo.stream().anyMatch(info -> info.getPeerNodeId() == deviceId);
3131
}
3232

33+
public static native void storeICDEntryWithKey(
34+
int fabricIndex, ICDClientInfo icdClientInfo, byte[] key);
35+
36+
public static native void removeICDEntryWithKey(int fabricIndex, ICDClientInfo icdClientInfo);
37+
38+
public static native void clearICDClientInfo(int fabricIndex, long deviceId);
39+
3340
public static native List<ICDClientInfo> getICDClientInfo(int fabricIndex);
3441
}

src/controller/java/src/matter/controller/MatterICDClientImpl.kt

+6
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,11 @@ object MatterICDClientImpl {
2424
return clientInfo.firstOrNull { it.peerNodeId == deviceId } != null
2525
}
2626

27+
external fun storeICDEntryWithKey(fabricIndex: Int, icdClientInfo: ICDClientInfo, key: ByteArray)
28+
29+
external fun removeICDEntryWithKey(fabricIndex: Int, icdClientInfo: ICDClientInfo)
30+
31+
external fun clearICDClientInfo(fabricIndex: Int, deviceId: Long)
32+
2733
external fun getICDClientInfo(fabricIndex: Int): List<ICDClientInfo>?
2834
}

0 commit comments

Comments
 (0)