2 * //******************************************************************
4 * // Copyright 2015 Samsung Electronics All Rights Reserved.
6 * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
8 * // Licensed under the Apache License, Version 2.0 (the "License");
9 * // you may not use this file except in compliance with the License.
10 * // You may obtain a copy of the License at
12 * // http://www.apache.org/licenses/LICENSE-2.0
14 * // Unless required by applicable law or agreed to in writing, software
15 * // distributed under the License is distributed on an "AS IS" BASIS,
16 * // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * // See the License for the specific language governing permissions and
18 * // limitations under the License.
20 * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
23 #include "JniOcSecureResource.h"
24 #include "JniSecureUtils.h"
25 #include "aclresource.h"
26 #include "oic_malloc.h"
27 #include "oic_string.h"
28 namespace PH = std::placeholders;
30 JniOcSecureResource::JniOcSecureResource(std::shared_ptr<OCSecureResource> device)
31 : m_sharedSecureResource(device)
34 JniOcSecureResource::~JniOcSecureResource()
36 LOGD("~JniOcSecureResource()");
37 m_sharedSecureResource = nullptr;
40 std::string JniOcSecureResource::getIpAddr()
42 return m_sharedSecureResource->getDevAddr();
45 std::string JniOcSecureResource::getDeviceID()
47 return m_sharedSecureResource->getDeviceID();
50 int JniOcSecureResource::getDeviceStatus()
52 return m_sharedSecureResource->getDeviceStatus();
55 bool JniOcSecureResource::getOwnedStatus()
57 return m_sharedSecureResource->getOwnedStatus();
60 OCSecureResource* JniOcSecureResource::getDevicePtr()
62 return m_sharedSecureResource.get();
65 JniOcSecureResource* JniOcSecureResource::getJniOcSecureResourcePtr(JNIEnv *env, jobject thiz)
67 JniOcSecureResource *secureResource = GetHandle<JniOcSecureResource>(env, thiz);
68 if (env->ExceptionCheck())
70 LOGE("Failed to get native handle from OcSecureResource");
74 ThrowOcException(JNI_NO_NATIVE_POINTER, "");
76 return secureResource;
79 JniProvisionResultListner* JniOcSecureResource::AddProvisionResultListener(JNIEnv* env,
82 JniProvisionResultListner *resultListener = NULL;
85 for (auto it = resultMap.begin(); it != resultMap.end(); ++it)
87 if (env->IsSameObject(jListener, it->first))
89 auto refPair = it->second;
90 resultListener = refPair.first;
93 resultMap.insert(*it);
94 LOGD("Provision resultListener: ref. count incremented");
100 resultListener = new JniProvisionResultListner(env, jListener,
101 RemoveCallback(std::bind(&JniOcSecureResource::RemoveProvisionResultListener,
102 this, PH::_1, PH::_2)));
103 jobject jgListener = env->NewGlobalRef(jListener);
105 resultMap.insert(std::pair < jobject, std::pair < JniProvisionResultListner*,
106 int >> (jgListener, std::pair<JniProvisionResultListner*, int>(resultListener, 1)));
107 LOGD("Provision resultListener: new listener");
109 resultMapLock.unlock();
110 return resultListener;
113 void JniOcSecureResource::RemoveProvisionResultListener(JNIEnv* env, jobject jListener)
115 resultMapLock.lock();
117 for (auto it = resultMap.begin(); it != resultMap.end(); ++it)
119 if (env->IsSameObject(jListener, it->first))
121 auto refPair = it->second;
122 if (refPair.second > 1)
125 it->second = refPair;
126 resultMap.insert(*it);
127 LOGI("Provision resultListener: ref. count decremented");
131 env->DeleteGlobalRef(it->first);
132 JniProvisionResultListner* listener = refPair.first;
135 LOGI("Provision resultListener removed");
140 resultMapLock.unlock();
143 OCStackResult JniOcSecureResource::doOwnershipTransfer(JNIEnv* env, jobject jListener)
145 JniProvisionResultListner *resultListener = AddProvisionResultListener(env, jListener);
147 ResultCallBack resultCallback = [resultListener](PMResultList_t *result, int hasError)
149 resultListener->ProvisionResultCallback(result, hasError, ListenerFunc::OWNERSHIPTRANSFER);
152 return m_sharedSecureResource->doOwnershipTransfer(resultCallback);
155 OCStackResult JniOcSecureResource::getLinkedDevices(JNIEnv *env, UuidList_t &uuidList)
157 return m_sharedSecureResource->getLinkedDevices(uuidList);
160 OCStackResult JniOcSecureResource::removeDevice(JNIEnv* env, jint timeout, jobject jListener)
162 JniProvisionResultListner *resultListener = AddProvisionResultListener(env, jListener);
164 ResultCallBack resultCallback = [resultListener](PMResultList_t *result, int hasError)
166 resultListener->ProvisionResultCallback(result, hasError, ListenerFunc::REMOVEDEVICE);
169 return m_sharedSecureResource->removeDevice((int)timeout, resultCallback);
172 OCStackResult JniOcSecureResource::unlinkDevices(JNIEnv* env, jobject _device2, jobject jListener)
174 JniProvisionResultListner *resultListener = AddProvisionResultListener(env, jListener);
176 ResultCallBack resultCallback = [resultListener](PMResultList_t *result, int hasError)
178 resultListener->ProvisionResultCallback(result, hasError, ListenerFunc::UNLINKDEVICES);
181 JniOcSecureResource *device2 = JniOcSecureResource::getJniOcSecureResourcePtr(env, _device2);
184 return OC_STACK_ERROR;
187 return m_sharedSecureResource->unlinkDevices(*device2->getDevicePtr(), resultCallback);
190 OCStackResult JniOcSecureResource::provisionCredentials(JNIEnv* env, jint type, jint keySize,
191 jobject _device2, jobject jListener)
193 JniProvisionResultListner *resultListener = AddProvisionResultListener(env, jListener);
195 ResultCallBack resultCallback = [resultListener](PMResultList_t *result, int hasError)
197 resultListener->ProvisionResultCallback(result, hasError, ListenerFunc::PROVISIONCREDENTIALS);
200 JniOcSecureResource *device2 = JniOcSecureResource::getJniOcSecureResourcePtr(env, _device2);
203 return OC_STACK_ERROR;
206 Credential cred((OicSecCredType_t)type, keySize);
208 return m_sharedSecureResource->provisionCredentials(cred, *device2->getDevicePtr(),
212 OCStackResult JniOcSecureResource::provisionACL(JNIEnv* env, jobject _acl, jobject jListener)
215 JniProvisionResultListner *resultListener = AddProvisionResultListener(env, jListener);
216 OicSecAcl_t *acl = (OicSecAcl_t*)OICCalloc(1, sizeof(OicSecAcl_t));
220 return OC_STACK_NO_MEMORY;
223 if (OC_STACK_OK != JniSecureUtils::convertJavaACLToOCAcl(env, _acl, acl))
226 return OC_STACK_ERROR;
229 ResultCallBack resultCallback = [acl, resultListener](PMResultList_t *result, int hasError)
232 resultListener->ProvisionResultCallback(result, hasError, ListenerFunc::PROVISIONACL);
234 ret = m_sharedSecureResource->provisionACL(acl, resultCallback);
236 if (ret != OC_STACK_OK)
243 OCStackResult JniOcSecureResource::provisionDirectPairing(JNIEnv* env, jobjectArray jpdacls,
244 jobject jListener, std::string pin, std::vector<int> prms, int edp)
247 JniProvisionResultListner *resultListener = AddProvisionResultListener(env, jListener);
249 jsize len = env->GetArrayLength(jpdacls);
251 OicSecPconf_t *pconf = nullptr;
252 OicSecPdAcl_t *head = nullptr;
254 for (jsize i = 0; i < len; ++i)
256 OicSecPdAcl_t *pdacl = new OicSecPdAcl_t;
259 return OC_STACK_NO_MEMORY;
262 memset(pdacl, 0, sizeof(OicSecPdAcl_t));
263 pdacl->next = nullptr;
265 jobject jpdacl = env->GetObjectArrayElement(jpdacls, i);
267 if (OC_STACK_OK != JniSecureUtils::convertJavaPdACLToOCAcl(env, jpdacl, pdacl))
270 return OC_STACK_ERROR;
277 pconf = new OicSecPconf_t;
278 memset(pconf, 0, sizeof(OicSecPconf_t));
280 pconf->prmLen = prms.size();
281 pconf->prm = new OicSecPrm_t[pconf->prmLen];
284 for (int i = 0 ; i < prms.size(); i++)
285 pconf->prm[i] = (OicSecPrm_t)prms[i];
287 memcpy(pconf->pin.val, pin.c_str(), DP_PIN_LENGTH);
288 pconf->pdacls = head;
290 ResultCallBack resultCallback = [head, resultListener, pconf, prms]
291 (PMResultList_t *result, int hasError)
293 OicSecPdAcl_t *tmp1, *tmp2;
304 resultListener->ProvisionResultCallback(result, hasError, ListenerFunc::PROVISIONDIRECTPAIRING);
307 ret = m_sharedSecureResource->provisionDirectPairing(pconf, resultCallback);
309 if (ret != OC_STACK_OK)
311 OicSecPdAcl_t *tmp1, *tmp2;
326 OCStackResult JniOcSecureResource::provisionPairwiseDevices(JNIEnv* env, jint type, jint keySize,
327 jobject _acl1, jobject _device2, jobject _acl2, jobject jListener)
332 return OC_STACK_INVALID_CALLBACK;
334 JniProvisionResultListner *resultListener = AddProvisionResultListener(env, jListener);
335 JniOcSecureResource *device2 = JniOcSecureResource::getJniOcSecureResourcePtr(env, _device2);
338 return OC_STACK_ERROR;
341 Credential cred((OicSecCredType_t)type, keySize);
343 OicSecAcl_t *acl1 = nullptr;
344 OicSecAcl_t *acl2 = nullptr;
348 acl1 = (OicSecAcl_t*)OICCalloc(1, sizeof(OicSecAcl_t));
351 return OC_STACK_NO_MEMORY;
354 if (OC_STACK_OK != JniSecureUtils::convertJavaACLToOCAcl(env, _acl1, acl1))
357 return OC_STACK_ERROR;
363 acl2 = (OicSecAcl_t*)OICCalloc(1, sizeof(OicSecAcl_t));
367 return OC_STACK_NO_MEMORY;
370 if (OC_STACK_OK != JniSecureUtils::convertJavaACLToOCAcl(env, _acl2, acl2))
373 return OC_STACK_ERROR;
377 ResultCallBack resultCallback = [acl1, acl2, resultListener](PMResultList_t *result,
382 resultListener->ProvisionResultCallback(result, hasError,
383 ListenerFunc::PROVISIONPAIRWISEDEVICES);
387 ret = m_sharedSecureResource->provisionPairwiseDevices(cred, acl1,
388 *device2->getDevicePtr(), acl2, resultCallback);
389 if (ret != OC_STACK_OK)
398 * Class: org_iotivity_base_OcSecureResource
399 * Method: doOwnershipTransfer
400 * Signature: (Lorg/iotivity/base/OcSecureResource/doOwnershipTransferListener;)V
402 JNIEXPORT void JNICALL Java_org_iotivity_base_OcSecureResource_doOwnershipTransfer
403 (JNIEnv *env, jobject thiz, jobject jListener)
405 LOGD("OcSecureResource_doOwnershipTransfer");
408 ThrowOcException(OC_STACK_INVALID_CALLBACK, "provisionResultListener cannot be null");
412 JniOcSecureResource *secureResource = JniOcSecureResource::getJniOcSecureResourcePtr(env, thiz);
415 ThrowOcException(OC_STACK_ERROR, "getJniOcSecureResourcePtr failed");
421 OCStackResult result = secureResource->doOwnershipTransfer(env, jListener);
422 if (OC_STACK_OK != result)
424 ThrowOcException(result, "OcSecureResource_doOwnershipTransfer");
428 catch (OCException& e)
430 LOGE("%s", e.reason().c_str());
431 ThrowOcException(e.code(), e.reason().c_str());
436 * Class: org_iotivity_base_OcSecureResource
437 * Method: removeDevice
438 * Signature: (ILorg/iotivity/base/OcSecureResource/removeDevice;)V
440 JNIEXPORT void JNICALL Java_org_iotivity_base_OcSecureResource_removeDevice
441 (JNIEnv *env, jobject thiz, jint timeout, jobject jListener)
443 LOGD("OcSecureResource_removeDevice");
446 ThrowOcException(OC_STACK_INVALID_PARAM, "Timeout value cannot be negative");
452 ThrowOcException(OC_STACK_INVALID_CALLBACK, "provisionResultListener cannot be null");
456 JniOcSecureResource *secureResource = JniOcSecureResource::getJniOcSecureResourcePtr(env, thiz);
459 ThrowOcException(OC_STACK_ERROR, "getJniOcSecureResourcePtr failed");
465 OCStackResult result = secureResource->removeDevice(env, timeout, jListener);
466 if (OC_STACK_OK != result)
468 ThrowOcException(result, "OcSecureResource_removeDevice");
472 catch (OCException& e)
474 LOGE("%s", e.reason().c_str());
475 ThrowOcException(e.code(), e.reason().c_str());
480 * Class: org_iotivity_base_OcSecureResource
481 * Method: unlinkDevices
482 * Signature: (Lorg/iotivity/base/OcSecureResource/unlinkDevices;)V
484 JNIEXPORT void JNICALL Java_org_iotivity_base_OcSecureResource_unlinkDevices
485 (JNIEnv *env, jobject thiz, jobject device2, jobject jListener)
487 LOGD("OcSecureResource_unlinkDevices");
490 ThrowOcException(OC_STACK_INVALID_CALLBACK, "provisionResultListener cannot be null");
495 ThrowOcException(OC_STACK_INVALID_PARAM, "device2 cannot be null");
499 JniOcSecureResource *secureResource = JniOcSecureResource::getJniOcSecureResourcePtr(env, thiz);
502 ThrowOcException(OC_STACK_ERROR, "getJniOcSecureResourcePtr failed");
508 OCStackResult result = secureResource->unlinkDevices(env, device2, jListener);
509 if (OC_STACK_OK != result)
511 ThrowOcException(result, "OcSecureResource_unlinkDevices");
515 catch (OCException& e)
517 LOGE("%s", e.reason().c_str());
518 ThrowOcException(e.code(), e.reason().c_str());
523 * Class: org_iotivity_base_OcSecureResource
524 * Method: provisionCredentials1
525 * Signature: (Lorg/iotivity/base/OcSecureResource/provisionCredentials;)V
527 JNIEXPORT void JNICALL Java_org_iotivity_base_OcSecureResource_provisionCredentials1
528 (JNIEnv *env, jobject thiz, jint type, jint keySize, jobject device2, jobject jListener)
530 LOGD("OcSecureResource_provisionCredentials");
533 ThrowOcException(OC_STACK_INVALID_CALLBACK, "provisionResultListener cannot be null");
538 ThrowOcException(OC_STACK_INVALID_PARAM, "device2 cannot be null");
542 JniOcSecureResource *secureResource = JniOcSecureResource::getJniOcSecureResourcePtr(env, thiz);
545 ThrowOcException(OC_STACK_ERROR, "getJniOcSecureResourcePtr failed");
551 OCStackResult result = secureResource->provisionCredentials(env, type, keySize, device2,
553 if (OC_STACK_OK != result)
555 ThrowOcException(result, "OcSecureResource_provisionCredentials");
559 catch (OCException& e)
561 LOGE("%s", e.reason().c_str());
562 ThrowOcException(e.code(), e.reason().c_str());
567 * Class: org_iotivity_base_OcSecureResource
568 * Method: provisionACL
569 * Signature: (Lorg/iotivity/base/OcSecureResource/provisionACL;)V
571 JNIEXPORT void JNICALL Java_org_iotivity_base_OcSecureResource_provisionACL
572 (JNIEnv *env, jobject thiz, jobject acl, jobject jListener)
574 LOGD("OcSecureResource_provisionACL");
577 ThrowOcException(OC_STACK_INVALID_CALLBACK, "provisionResultListener cannot be null");
582 ThrowOcException(OC_STACK_INVALID_PARAM, "acl cannot be null");
586 JniOcSecureResource *secureResource = JniOcSecureResource::getJniOcSecureResourcePtr(env, thiz);
589 ThrowOcException(OC_STACK_ERROR, "getJniOcSecureResourcePtr failed");
595 OCStackResult result = secureResource->provisionACL(env, acl, jListener);
596 if (OC_STACK_OK != result)
598 ThrowOcException(result, "OcSecureResource_provisionACL");
602 catch (OCException& e)
604 LOGE("%s", e.reason().c_str());
605 ThrowOcException(e.code(), e.reason().c_str());
610 * Class: org_iotivity_base_OcSecureResource
611 * Method: provisionPairwiseDevices1
612 * Signature: (Lorg/iotivity/base/OcSecureResource/provisionPairwiseDevices;)V
614 JNIEXPORT void JNICALL Java_org_iotivity_base_OcSecureResource_provisionPairwiseDevices1
615 (JNIEnv *env, jobject thiz, jint type, jint keySize, jobject acl1, jobject device2,
616 jobject acl2, jobject jListener)
618 LOGD("OcSecureResource_provisionPairwiseDevices");
621 ThrowOcException(OC_STACK_INVALID_CALLBACK, "Invalid Callback");
626 ThrowOcException(OC_STACK_INVALID_PARAM, "device2 cannot be null");
630 JniOcSecureResource *secureResource = JniOcSecureResource::getJniOcSecureResourcePtr(env, thiz);
633 ThrowOcException(OC_STACK_ERROR, "getJniOcSecureResourcePtr failed");
639 OCStackResult result = secureResource->provisionPairwiseDevices(env, type, keySize,
640 acl1, device2, acl2, jListener);
641 if (OC_STACK_OK != result)
643 ThrowOcException(result, "OcSecureResource_provisionPairwiseDevices");
647 catch (OCException& e)
649 LOGE("%s", e.reason().c_str());
650 ThrowOcException(e.code(), e.reason().c_str());
655 * Class: org_iotivity_base_OcSecureResource
656 * Method: provisionDirectPairing
657 * Signature: (Ljava/lang/String;[Lorg/iotivity/base/OicSecPdAcl;ILorg/iotivity/base/OcSecureResource/ProvisionDirectPairingListener;I)V
659 JNIEXPORT void JNICALL Java_org_iotivity_base_OcSecureResource_provisionDirectPairing
660 (JNIEnv *env, jobject thiz, jstring jpin, jobjectArray pdacls, jintArray jprmType,
661 jint jedp, jobject jListener)
663 LOGD("OcSecureResource_provisionDirectPairing");
666 ThrowOcException(OC_STACK_INVALID_CALLBACK, "Invalid Callback");
669 if (!pdacls || !jpin || ! jprmType)
671 ThrowOcException(OC_STACK_INVALID_PARAM, "Invalid Parameters");
674 std::string pin = env->GetStringUTFChars(jpin, nullptr);
676 JniOcSecureResource *secureResource = JniOcSecureResource::getJniOcSecureResourcePtr(env, thiz);
679 ThrowOcException(OC_STACK_ERROR, "getJniOcSecureResourcePtr failed");
683 const jsize len = env->GetArrayLength(jprmType);
684 jint* ints = env->GetIntArrayElements(jprmType, nullptr);
685 std::vector<int> value;
686 for (jsize i = 0; i < len; ++i)
688 value.push_back(static_cast<int>(ints[i]));
690 env->ReleaseIntArrayElements(jprmType, ints, JNI_ABORT);
694 OCStackResult result = secureResource->provisionDirectPairing(env, pdacls, jListener,
695 pin, value, static_cast<int>(jedp));
696 if (OC_STACK_OK != result)
698 ThrowOcException(result, "OcSecureResource_provisionDirectPairing");
702 catch (OCException& e)
704 LOGE("%s", e.reason().c_str());
705 ThrowOcException(e.code(), e.reason().c_str());
710 * Class: org_iotivity_base_OcSecureResource
711 * Method: getLinkedDevices
712 * Signature: ()Ljava/util/List;
714 JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcSecureResource_getLinkedDevices
715 (JNIEnv *env, jobject thiz)
717 LOGD("OcSecureResource_getLinkedDevices");
720 JniOcSecureResource *secureResource = JniOcSecureResource::getJniOcSecureResourcePtr(env, thiz);
723 ThrowOcException(OC_STACK_ERROR, "getJniOcSecureResourcePtr failed");
729 OCStackResult result = secureResource->getLinkedDevices(env, uuidList);
730 if (OC_STACK_OK != result)
732 ThrowOcException(result, "OcSecureResource_getLinkedDevices");
735 return JniSecureUtils::convertUUIDVectorToJavaStrList(env, uuidList);
737 catch (OCException& e)
739 LOGE("%s", e.reason().c_str());
740 ThrowOcException(e.code(), e.reason().c_str());
746 * Class: org_iotivity_base_OcSecureResource
748 * Signature: ()Ljava/lang/String;
750 JNIEXPORT jstring JNICALL Java_org_iotivity_base_OcSecureResource_getIpAddr
751 (JNIEnv *env, jobject thiz)
753 LOGD("OcSecureResource_getIpAddr");
754 JniOcSecureResource *secureResource = JniOcSecureResource::getJniOcSecureResourcePtr(env, thiz);
757 LOGD("getJniOcSecureResourcePtr failed");
761 return env->NewStringUTF(secureResource->getIpAddr().c_str());
765 * Class: org_iotivity_base_OcSecureResource
766 * Method: getDeviceID
767 * Signature: ()Ljava/lang/String;
769 JNIEXPORT jstring JNICALL Java_org_iotivity_base_OcSecureResource_getDeviceID
770 (JNIEnv *env , jobject thiz)
772 LOGD("OcSecureResource_getDeviceID");
773 JniOcSecureResource *secureResource = JniOcSecureResource::getJniOcSecureResourcePtr(env, thiz);
776 LOGD("getJniOcSecureResourcePtr failed");
780 return env->NewStringUTF(secureResource->getDeviceID().c_str());
784 * Class: org_iotivity_base_OcSecureResource
785 * Method: deviceStatus
788 JNIEXPORT jint JNICALL Java_org_iotivity_base_OcSecureResource_deviceStatus
789 (JNIEnv *env, jobject thiz)
791 LOGD("OcSecureResource_deviceStatus");
792 JniOcSecureResource *secureResource = JniOcSecureResource::getJniOcSecureResourcePtr(env, thiz);
795 LOGD("getJniOcSecureResourcePtr failed");
799 return secureResource->getDeviceStatus();
803 * Class: org_iotivity_base_OcSecureResource
804 * Method: ownedStatus
807 JNIEXPORT jint JNICALL Java_org_iotivity_base_OcSecureResource_ownedStatus
808 (JNIEnv *env, jobject thiz)
810 LOGD("OcSecureResource_ownedStatus");
811 JniOcSecureResource *secureResource = JniOcSecureResource::getJniOcSecureResourcePtr(env, thiz);
814 LOGD("getJniOcSecureResourcePtr failed");
818 return secureResource->getOwnedStatus();
822 * Class: org_iotivity_base_OcSecureResource
826 JNIEXPORT void JNICALL Java_org_iotivity_base_OcSecureResource_dispose
827 (JNIEnv *env, jobject thiz)
829 LOGD("OcSecureResource_dispose");
830 JniOcSecureResource *secureResource = JniOcSecureResource::getJniOcSecureResourcePtr(env, thiz);
831 delete secureResource;