return OC_STACK_OK;\r
}\r
\r
-\r
- OCStackResult InProcClientWrapper::FindDirectPairingDevices(\r
- unsigned short waittime,\r
- GetDirectPairedCallback& callback)\r
- {\r
- OC_UNUSED(waittime);\r
- OC_UNUSED(callback);\r
- return OC_STACK_OK;\r
- }\r
-\r
- OCStackResult InProcClientWrapper::GetDirectPairedDevices(GetDirectPairedCallback& callback)\r
- {\r
- OC_UNUSED(callback);\r
- return OC_STACK_OK;\r
- }\r
-\r
- OCStackResult InProcClientWrapper::DoDirectPairing(\r
- std::shared_ptr<OCDirectPairing> peer,\r
- const OCPrm_t& pmSel,\r
- const std::string& pinNumber,\r
- DirectPairingCallback& callback)\r
- {\r
- OC_UNUSED(peer);\r
- OC_UNUSED(pmSel);\r
- OC_UNUSED(pinNumber);\r
- OC_UNUSED(callback);\r
- return OC_STACK_OK;\r
- }\r
-\r
#ifdef WITH_CLOUD\r
OCStackResult InProcClientWrapper::SubscribeDevicePresence(\r
OCDoHandle* handle,\r
typedef OCEntityHandlerResult (*OCDeviceEntityHandler)
(OCEntityHandlerFlag flag, OCEntityHandlerRequest * entityHandlerRequest, char* uri, void* callbackParam);
-//#ifdef DIRECT_PAIRING
-/**
- * Callback function definition of direct-pairing
- *
- * @param[OUT] ctx - user context returned in the callback.
- * @param[OUT] peer - pairing device info.
- * @param[OUT] result - It's returned with 'OC_STACK_XXX'. It will return 'OC_STACK_OK'
- * if D2D pairing is success without error
- */
-typedef void (*OCDirectPairingCB)(void *ctx, OCDPDev_t *peer, OCStackResult result);
-//#endif // DIRECT_PAIRING
#if defined(__WITH_DTLS__) || defined(__WITH_TLS__)
/**
* Callback function definition for Change in TrustCertChain
OCSRM_SRC + 'pstatresource.c',
OCSRM_SRC + 'doxmresource.c',
OCSRM_SRC + 'credresource.c',
- OCSRM_SRC + 'pconfresource.c',
- OCSRM_SRC + 'dpairingresource.c',
OCSRM_SRC + 'policyengine.c',
OCSRM_SRC + 'psinterface.c',
OCSRM_SRC + 'srmresourcestrings.c',
OCSRM_SRC + 'srmutility.c',
OCSRM_SRC + 'iotvticalendar.c',
OCSRM_SRC + 'base64.c',
- OCSRM_SRC + 'directpairing.c',
OCSRM_SRC + 'deviceonboardingstate.c'
]
typedef struct OicSecPdAcl OicSecPdAcl_t;
-typedef struct OicSecPconf OicSecPconf_t;
-
-typedef struct OicSecDpairing OicSecDpairing_t;
-
#define DP_PIN_LENGTH 8 // temporary length
/**
OicSecPdAcl_t *next;
};
-/**
- * @brief /oic/sec/pconf (Pairing Configuration) data type
- */
-struct OicSecPconf
-{
- // <Attribute ID>:<Read/Write>:<Multiple/Single>:<Mandatory?>:<Type>
- bool edp; // 0:W:S:M:Boolean
- OicSecPrm_t *prm; // 1:R:M:N:UINT16
- size_t prmLen; // the number of elts in Prm
- OicDpPin_t pin; // 2:R:S:Y:String
- OicSecPdAcl_t *pdacls; // 3:R:M:Y:oic.sec.pdacltype
- OicUuid_t *pddevs; // 4:R:M:Y:oic.uuid
- size_t pddevLen; // the number of elts in pddev
- OicUuid_t deviceID; // 5:R:S:Y:oic.uuid
- OicUuid_t rownerID; // 6:R:S:Y:oic.uuid
-};
-
-/**
- * @brief /oic/sec/dpairing (Device Pairing) data type
- */
-struct OicSecDpairing
-{
- // <Attribute ID>:<Read/Write>:<Multiple/Single>:<Mandatory?>:<Type>
- OicSecPrm_t spm; // 0:R/W:S:Y:UINT16
- OicUuid_t pdeviceID; // 1:R:S:Y:oic.uuid
- OicUuid_t rownerID; // 2:R:S:Y:oic.uuid
-};
-
#define SPEC_MAX_VER_LEN (sizeof("core.x.x.x") + 1) // Spec Version length.
/**
* @def GET_ACL_VER(specVer)
+++ /dev/null
-/* *****************************************************************\r
- *\r
- * Copyright 2016 Samsung Electronics All Rights Reserved.\r
- *\r
- *\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- *\r
- * *****************************************************************/\r
-\r
-#ifndef _DIRECT_PAIRING_H_\r
-#define _DIRECT_PAIRING_H_\r
-\r
-#include <stdbool.h>\r
-#include "ocstack.h"\r
-#include "pmtypes.h"\r
-#include "experimental/securevirtualresourcetypes.h"\r
-\r
-#ifdef __cplusplus\r
-extern "C"\r
-{\r
-#endif\r
-\r
-/**\r
- * Discover direct-pairing devices in the same IP subnet.\r
- *\r
- * @param[in] waittime Timeout in seconds.\r
- *\r
- * @return OC_STACK_OK on success otherwise error.\r
- */\r
-OCStackResult DPDeviceDiscovery(unsigned short waittime);\r
-\r
-/**\r
- * Start direct-pairing processes.\r
- *\r
- * @param[in] ctx user context passed back with resultCallback.\r
- * @param[in] peer target device to establish direct-pairing.\r
- * @param[in] pmSel selected pairing method.\r
- * @param[in] pinNumber secret value for dtls connection.\r
- * @param[in] resultCallback result event callback.\r
- *\r
- * @return OC_STACK_OK on success otherwise error.\r
- */\r
-OCStackResult DPDirectPairing(void *ctx, OCDirectPairingDev_t* peer, OicSecPrm_t pmSel,\r
- char *pinNumber, OCDirectPairingResultCB resultCallback);\r
-\r
-/**\r
- * This function returns discovered devices list in direct-pairing discovery\r
- * Caller must NOT free returned constant pointer\r
- *\r
- * @return OCDirectPairingDev_t pointer on success otherwise NULL.\r
- */\r
-const OCDirectPairingDev_t* DPGetDiscoveredDevices();\r
-\r
-/**\r
- * This function returns paired devices list until now\r
- * Caller must NOT free returned constant pointer\r
- *\r
- * @return OCDirectPairingDev_t pointer on success otherwise NULL.\r
- */\r
-const OCDirectPairingDev_t* DPGetPairedDevices();\r
-\r
-/**\r
- * This function delete both discovered devices and paired devices list\r
- *\r
- */\r
-void DPDeleteLists();\r
-\r
-#ifdef __cplusplus\r
-}\r
-#endif\r
-#endif //_DIRECT_PAIRING_H_\r
-\r
+++ /dev/null
-/* *****************************************************************\r
- *\r
- * Copyright 2016 Samsung Electronics All Rights Reserved.\r
- *\r
- *\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- *\r
- * *****************************************************************/\r
-\r
-#ifndef IOTVT_SRM_DPAIRING_H\r
-#define IOTVT_SRM_DPAIRING_H\r
-\r
-#include "octypes.h"\r
-\r
-#ifdef __cplusplus\r
-extern "C" {\r
-#endif\r
-\r
-/**\r
- * Initialize DPAIRING resource by loading data from persistent storage.\r
- *\r
- * @retval OC_STACK_OK for Success, otherwise some error value\r
- */\r
-OCStackResult InitDpairingResource();\r
-\r
-/**\r
- * Perform cleanup for DPAIRING resources.\r
- *\r
- * @retval OC_STACK_OK for Success, otherwise some error value\r
- */\r
-OCStackResult DeInitDpairingResource();\r
-\r
-/**\r
- * This method converts CBOR DPAIRING into binary DPAIRING.\r
- * The CBOR DPAIRING can be from persistent database or\r
- * or received as POST request.\r
- *\r
- * @param cborPayload pconf data in cbor format.\r
- * @param size size of the cbor payload\r
- * @param secDpair binary Dpairing resource\r
- * @return OC_STACK_OK for Success, otherwise some error value.\r
- *\r
- * @note Caller needs to invoke OICFree after done\r
- * using the return pointer\r
- */\r
-OCStackResult CBORPayloadToDpair(const uint8_t *cborPayload, size_t size,\r
- OicSecDpairing_t **secDpair);\r
-\r
-/**\r
- * This method converts DPAIRING data into CBOR format.\r
- *\r
- * @param dpair Pointer to OicSecDpairing_t.\r
- * @param payload CBOR format converted from binary dpairing\r
- * @param size Size of the coverted payload\r
- * @return OC_STACK_OK for Success, otherwise some error value.\r
- *\r
- * @note Caller needs to invoke OICFree after done\r
- * using the return pointer\r
- */\r
-OCStackResult DpairingToCBORPayload(const OicSecDpairing_t *dpair, uint8_t **payload, size_t *size);\r
-\r
-/** This function deallocates the memory for OicSecPconf_t .\r
- *\r
- * @param[in] dpair Pointer to OicSecDpairing_t.\r
- */\r
-void DeleteDpairingBinData(OicSecDpairing_t* dpair);\r
-\r
-#if defined(__WITH_DTLS__) || defined(__WITH_TLS__)\r
-/**\r
- * Function to save PairingPSK.\r
- *\r
- * @param[in] endpoint current endpoint.\r
- * @param[in] peerDevID peer device indentitiy.\r
- * @param[in] isPairingServer indicate if it generates PairingPSK for server or client.\r
- *\r
- * @return OC_STACK_OK on success\r
- */\r
-OCStackResult SavePairingPSK(OCDevAddr *endpoint,\r
- OicUuid_t *peerDevID, OicUuid_t *owner, bool isPairingServer);\r
-#endif // __WITH_DTLS__ or __WITH_TLS__\r
-\r
-/**\r
- * Gets the OicUuid_t value for the rownerid of the Dpairing resource.\r
- *\r
- * @param rowneruuid a pointer to be assigned to the rowneruuid property\r
- * @return ::OC_STACK_OK if rowneruuid is assigned correctly, else ::OC_STACK_ERROR.\r
- */\r
-OCStackResult GetDpairingRownerId(OicUuid_t *rowneruuid);\r
-\r
-/**\r
- * Internal function to update resource owner\r
- *\r
- * @param newROwner new owner\r
- *\r
- * @retval ::OC_STACK_OK for Success, otherwise some error value\r
- */\r
-OCStackResult SetDpairingRownerId(const OicUuid_t* newROwner);\r
-\r
-#ifdef __cplusplus\r
-}\r
-#endif\r
-\r
-#endif //IOTVT_SRM_DPAIRING_H\r
-\r
-\r
-\r
-\r
+++ /dev/null
-/* *****************************************************************\r
- *\r
- * Copyright 2016 Samsung Electronics All Rights Reserved.\r
- *\r
- *\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- *\r
- * *****************************************************************/\r
-\r
-#ifndef IOTVT_SRM_PCONF_H\r
-#define IOTVT_SRM_PCONF_H\r
-\r
-#include "octypes.h"\r
-\r
-#ifdef __cplusplus\r
-extern "C" {\r
-#endif\r
-\r
-/**\r
- * Initialize PCONF resource by loading data from persistent storage.\r
- *\r
- * @retval OC_STACK_OK for Success, otherwise some error value\r
- */\r
-OCStackResult InitPconfResource();\r
-\r
-/**\r
- * Perform cleanup for PCONF resources.\r
- *\r
- * @retval OC_STACK_OK for Success, otherwise some error value\r
- */\r
-OCStackResult DeInitPconfResource();\r
-\r
-/**\r
- * This method is used by SRM to retrieve PCONF resource data.\r
- *\r
- * @retval reference to @ref OicSecPconf_t, binary format of Pconf resource data\r
- */\r
-const OicSecPconf_t* GetPconfResourceData();\r
-\r
-/**\r
- * This method converts CBOR PCONF into binary PCONF.\r
- * The JSON PCONF can be from persistent database or\r
- * or received as PUT request.\r
- *\r
- * @param cborPayload pconf data in cbor format.\r
- * @param size cbor payload size\r
- * @param secPconf converted pconf\r
- * @return OC_STACK_OK for success.\r
- *\r
- * @note Caller needs to invoke OCFree after done\r
- * using the return pointer\r
- */\r
-OCStackResult CBORPayloadToPconf(const uint8_t *cborPayload, size_t size, OicSecPconf_t **secPconf);\r
-\r
-/**\r
- * This method converts PCONF data into CBOR format.\r
- * Caller needs to invoke 'free' when finished done using\r
- * return string\r
- *\r
- * @param pconf Pointer to OicSecPconf_t.\r
- * @param payload pconf converted in cbor format\r
- * @param size size of the converted payload\r
- * @return OC_STACK_OK for success.\r
- *\r
- * @note Caller needs to invoke OCFree after done\r
- * using the return pointer\r
- */\r
-OCStackResult PconfToCBORPayload(const OicSecPconf_t *pconf,uint8_t **payload,size_t *size);\r
-\r
-/**\r
- * This method might be used to add a paired device id after direct-pairing process complete.\r
- *\r
- * @param pdeviceId ID of the paired device.\r
- *\r
- * @retval OC_STACK_OK for Success, otherwise some error value\r
- */\r
-OCStackResult AddPairedDevice(OicUuid_t *pdeviceId);\r
-\r
-/**\r
- * This method might be used by PolicyEngine to retrieve PDACL for a Subject.\r
- *\r
- * @param subjectId ID of the subject for which PDACL is required.\r
- * @param savePtr is used internally by @ref GetACLResourceData to maintain index between\r
- * successive calls for same subjectId.\r
- *\r
- * @retval reference to @ref OicSecPdAcl_t if PDACL is found, else NULL\r
- */\r
-const OicSecPdAcl_t* GetPdAclData(const OicUuid_t* subjectId, OicSecPdAcl_t **savePtr);\r
-\r
-/**\r
- * This method return whether device is paired or not.\r
- *\r
- * @param pdeviceId Target device ID to find in paired list.\r
- * @retval ture if device is already paired, else false\r
- */\r
-bool IsPairedDevice(const OicUuid_t* pdeviceId);\r
-\r
-/** This function deallocates the memory for OicSecPconf_t .\r
- *\r
- * @param[in] pconf Pointer to OicSecPconf_t.\r
- */\r
-void DeletePconfBinData(OicSecPconf_t* pconf);\r
-\r
-/**\r
- * This function frees OicSecPdAcl_t object's fields and object itself.\r
- */\r
-void FreePdAclList(OicSecPdAcl_t* pdacls);\r
-\r
-/**\r
- * Internal function to update resource owner\r
- *\r
- * @param newROwner new owner\r
- *\r
- * @retval ::OC_STACK_OK for Success, otherwise some error value\r
- */\r
-OCStackResult SetPconfRownerId(const OicUuid_t* newROwner);\r
-\r
-/**\r
- * Gets the OicUuid_t value for the rownerid of the pconf resource.\r
- *\r
- * @param rowneruuid a pointer to be assigned to the rowneruuid property\r
- * @return ::OC_STACK_OK if rowneruuid is assigned correctly, else ::OC_STACK_ERROR.\r
- */\r
-OCStackResult GetPconfRownerId(OicUuid_t *rowneruuid);\r
-\r
-#ifdef __cplusplus\r
-}\r
-#endif\r
-\r
-#endif //IOTVT_SRM_PCONF_H\r
-\r
-\r
-\r
extern const char * OIC_RSRC_SVC_URI;
extern const char * OIC_JSON_SVC_NAME;
-//PCONF
-extern const char * OIC_RSRC_TYPE_SEC_PCONF;
-extern const char * OIC_RSRC_PCONF_URI;
-extern const char * OIC_JSON_PCONF_NAME;
-
-//DPAIRING
-extern const char * OIC_RSRC_TYPE_SEC_DPAIRING;
-extern const char * OIC_RSRC_DPAIRING_URI;
-extern const char * OIC_JSON_DPAIRING_NAME;
-
//version
extern const char * OIC_RSRC_TYPE_SEC_VER;
extern const char * OIC_RSRC_VER_URI;
void SRPRemoveTrustCertChainNotifier(void);
#endif // __WITH_DTLS__ || __WITH_TLS__
-/**
- * API to send Direct-Pairing Configuration to a device.
- *
- * @param[in] ctx Application context to be returned in result callback.
- * @param[in] selectedDeviceInfo Selected target device.
- * @param[in] pconf PCONF pointer.
- * @param[in] resultCallback callback provided by API user, callback will be called when
- * provisioning request recieves a response from resource server.
- * @return OC_STACK_OK in case of success and other value otherwise.
- */
-OCStackResult SRPProvisionDirectPairing(void *ctx, const OCProvisionDev_t *selectedDeviceInfo,
- OicSecPconf_t *pconf, OCProvisionResultCB resultCallback);
-
-/**
- * API to send Direct-Pairing Configuration to a device.
- *
- * @param[in] selectedDeviceInfo Selected target device.
- * @param[in] pconf PCONF pointer.
- * @param[in] resultCallback callback provided by API user, callback will be called when
- * provisioning request recieves a response from resource server.
- * @return OC_STACK_OK in case of success and other value otherwise.
- */
-OCStackResult SRPProvisionDirectPairing(void *ctx, const OCProvisionDev_t *selectedDeviceInfo,
- OicSecPconf_t *pconf, OCProvisionResultCB resultCallback);
/**
* API to provision credential to devices.
OCProvisionResultCB resultCallback, uint32_t credId);
/**
- * this function sends Direct-Pairing Configuration to a device.
- *
- * @param[in] ctx Application context returned in the result callback.
- * @param[in] selectedDeviceInfo Selected target device.
- * @param[in] pconf PCONF pointer.
- * @param[in] resultCallback callback provided by API user, callback will be called when provisioning
- request recieves a response from resource server.
- * @return OC_STACK_OK in case of success and other value otherwise.
- */
-OCStackResult OC_CALL OCProvisionDirectPairing(void* ctx, const OCProvisionDev_t *selectedDeviceInfo, OicSecPconf_t *pconf,
- OCProvisionResultCB resultCallback);
-
-/**
* API to provision credential to devices.
*
* @param[in] ctx Application context returned in the result callback.
*/
void OC_CALL OCDeleteACLList(OicSecAcl_t* pAcl);
-/**
- * This function deletes PDACL data.
- *
- * @param pPdAcl Pointer to OicSecPdAcl_t structure.
- */
-void OC_CALL OCDeletePdAclList(OicSecPdAcl_t* pPdAcl);
-
#if defined(__WITH_DTLS__) || defined(__WITH_TLS__)
/**
* this function sends CRL information to resource.
}OCProvisionDev_t;
/**
- * Device Information of discoverd direct pairing device(s).
- */
-typedef struct OCDirectPairingDev
-{
- OCDevAddr endpoint;
- OCConnectivityType connType;
- uint16_t securePort;
- bool edp;
- OicSecPrm_t *prm;
- size_t prmLen;
- OicUuid_t deviceID;
- OicUuid_t rowner;
- struct OCDirectPairingDev *next;
-} OCDirectPairingDev_t;
-
-/**
* Result information for each target device.
*/
typedef struct OCPMResult{
*/
typedef void (*OCGetRolesResultCB)(void* ctx, size_t nOfRes, OCPMGetRolesResult_t *arr, bool hasError);
-/**
- * Callback function definition of direct-pairing
- *
- * @param[in] ctx - User context which will be returned wth callback
- * @param[in] peer - pairing device info.
- * @param[in] result - It's returned with 'OC_STACK_XXX'. It will return 'OC_STACK_OK'
- * if D2D pairing is success without error
- */
-typedef void (*OCDirectPairingResultCB)(void *ctx, OCDirectPairingDev_t *peer, OCStackResult result);
-
-
#ifdef __cplusplus
}
#endif
#define _30_PROVIS_PAIR_DEVS_ 30
#define _31_PROVIS_CRED_ 31
#define _32_PROVIS_ACL_ 32
-#define _33_PROVIS_DP_ 33
-#define _34_CHECK_LINK_STATUS_ 34
-#define _35_SAVE_ACL_ 35
-#define _36_PROVIS_CERT_ 36
+#define _33_CHECK_LINK_STATUS_ 33
+#define _34_SAVE_ACL_ 34
+#define _35_PROVIS_CERT_ 35
#define _40_UNLINK_PAIR_DEVS_ 40
#define _50_REMOVE_SELEC_DEV_ 50
#define _51_REMOVE_DEV_WITH_UUID_ 51
// function declaration(s) for calling them before implementing
static OicSecAcl_t* createAcl(const int);
static OicSecAcl_t* createSimpleAcl(const OicUuid_t uuid);
-static OicSecPdAcl_t* createPdAcl(const int);
static OCProvisionDev_t* getDevInst(const OCProvisionDev_t*, const int);
static int printDevList(const OCProvisionDev_t*);
static size_t printUuidList(const OCUuidList_t*);
g_doneCB = true;
}
-static void provisionDPCB(void* ctx, int nOfRes, OCProvisionResult_t* arr, bool hasError)
-{
- if(!hasError)
- {
- OIC_LOG_V(INFO, TAG, "Provision Direct-Pairing SUCCEEDED - ctx: %s", (char*) ctx);
- }
- else
- {
- OIC_LOG_V(ERROR, TAG, "Provision Direct-Pairing FAILED - ctx: %s", (char*) ctx);
- printResultList((const OCProvisionResult_t*) arr, nOfRes);
- }
- g_doneCB = true;
-}
-
static void unlinkDevicesCB(void* ctx, size_t nOfRes, OCProvisionResult_t* arr, bool hasError)
{
if(!hasError)
return -1;
}
-static int provisionDirectPairing(void)
-{
- // check |own_list| for provisioning direct-pairing
- if(!g_own_list || 1>g_own_cnt)
- {
- printf(" > Owned Device List, to Provision ACL, is Empty\n");
- printf(" > Please Register Unowned Devices first, with [20] Menu\n");
- return 0; // normal case
- }
-
- // select device for provisioning direct-pairing
- int dev_num = 0;
- for( ; ; )
- {
- printf(" > Enter Device Number, for Provisioning Direct-Pairing: ");
- for(int ret=0; 1!=ret; )
- {
- ret = scanf("%d", &dev_num);
- for( ; 0x20<=getchar(); ); // for removing overflow garbages
- // '0x20<=code' is character region
- }
- if(0<dev_num && g_own_cnt>=dev_num)
- {
- break;
- }
- printf(" Entered Wrong Number. Please Enter Again\n");
- }
-
- // create Direct-Pairing Configuration(PIN, PDACL) for selected device
- // TODO: default acl -> input from user !
- OicSecPconf_t pconf;
- memset(&pconf, 0, sizeof(OicSecPconf_t));
-
- // set enable dp
- pconf.edp = true;
-
- // set default supported PRM types
- pconf.prmLen = sizeof(SUPPORTED_PRMS)/sizeof(OicSecPrm_t);
- pconf.prm = (OicSecPrm_t *)OICCalloc(pconf.prmLen, sizeof(OicSecPrm_t));
- if(pconf.prm)
- {
- for (size_t i=0; i<pconf.prmLen; i++)
- {
- pconf.prm[i] = SUPPORTED_PRMS[i];
- }
- }
- else
- {
- OIC_LOG(ERROR, TAG, "create prm error return");
- goto PVDP_ERROR;
- }
-
- // set default pin
- const char DP_DEFAULT_PIN[] = "00000000";
- memcpy(pconf.pin.val, DP_DEFAULT_PIN, DP_PIN_LENGTH);
-
- // set default pdacl
- pconf.pdacls = createPdAcl(dev_num);
- if(!pconf.pdacls)
- {
- OIC_LOG(ERROR, TAG, "createPdAcl error return");
- goto PVDP_ERROR;
- }
-
- // call |OCProvisionDirectPairing| API
- // calling this API with callback actually acts like blocking
- // for error checking, the return value saved and printed
- g_doneCB = false;
- printf(" Atempt Direct-Pairing Provisioning (PIN : [%s])..\n", (char*)pconf.pin.val);
- OCStackResult rst = OCProvisionDirectPairing((void*) g_ctx,
- getDevInst((const OCProvisionDev_t*) g_own_list, dev_num),
- &pconf, (OCProvisionResultCB)provisionDPCB);
- if(OC_STACK_OK != rst)
- {
- OIC_LOG_V(ERROR, TAG, "OCProvisionDirectPairing API error: %d", rst);
- if (OC_STACK_UNAUTHORIZED_REQ == rst)
- {
- OIC_LOG(ERROR, TAG, "Target Server NOT Support Direct-Pairing !!! (DPC == false)");
- }
- goto PVDP_ERROR;
- }
- if(waitCallbackRet()) // input |g_doneCB| flag implicitly
- {
- OIC_LOG(ERROR, TAG, "OCProvisionCredentials callback error");
- goto PVDP_ERROR;
- }
- OCDeletePdAclList(pconf.pdacls);
-
- // display the PCONF-provisioned result
- printf(" > SUCCESS to provision Direct-Pairing !!\n");
-
- return 0;
-
-PVDP_ERROR:
- OCDeletePdAclList(pconf.pdacls); // after here |acl| points nothing
- return -1;
-}
-
static int checkLinkedStatus(void)
{
// check |own_list| for checking selected link status on PRVN DB
return acl;
}
-static OicSecPdAcl_t* createPdAcl(const int dev_num)
-{
- if(0>=dev_num || g_own_cnt<dev_num)
- {
- OIC_LOG(ERROR, TAG, "createAcl invalid parameters");
- return NULL; // not need to 'goto' |ERROR| before allocating |acl|
- }
-
- // allocate memory for |pdacl| struct
- printf(" **** Create PDACL for the Selected Device[%d]\n", dev_num);
- OicSecPdAcl_t* pdAcl = (OicSecPdAcl_t*) OICCalloc(1, sizeof(OicSecPdAcl_t));
- if(!pdAcl)
- {
- OIC_LOG(ERROR, TAG, "createAcl: OICCalloc error return");
- return NULL; // not need to 'goto' |ERROR| before allocating |acl|
- }
-
-
- // number of resources
- char rsrc_in[][ACL_RESRC_MAX_LEN+1] = {"*", "/rsrc/*"};
- pdAcl->resourcesLen = 1;
-
- // resource
- size_t num = pdAcl->resourcesLen;
- pdAcl->resources = (char**) OICCalloc(num, sizeof(char*));
- if(!pdAcl->resources)
- {
- OIC_LOG(ERROR, TAG, "createPdAcl: OICCalloc error return");
- goto CRPDACL_ERROR;
- }
- for (size_t i = 0; num > i; ++i)
- {
- size_t len = strlen(rsrc_in[i]) + 1; // '1' for null termination
- char* rsrc = (char*) OICCalloc(len, sizeof(char));
- if(!rsrc)
- {
- OIC_LOG(ERROR, TAG, "createPdAcl: OICCalloc error return");
- goto CRPDACL_ERROR;
- }
- OICStrcpy(rsrc, len, rsrc_in[i]);
- pdAcl->resources[i] = rsrc; // after here, |rsrc| points nothing
- }
-
- // permission
- pdAcl->permission = PERMISSION_FULL_CONTROL;
-
- return pdAcl;
-
-CRPDACL_ERROR:
- OCDeletePdAclList(pdAcl);
- return NULL;
-}
-
static OCProvisionDev_t* getDevInst(const OCProvisionDev_t* dev_lst, const int dev_num)
{
if(!dev_lst || 0>=dev_num)
printf("** 30. Provision/Link Pairwise Things\n");
printf("** 31. Provision Credentials for Pairwise Things\n");
printf("** 32. Provision the Selected Access Control List(ACL)\n");
- printf("** 33. Provision Direct-Pairing Configuration\n");
- printf("** 34. Check Linked Status of the Selected Device on PRVN DB\n");
- printf("** 35. Save the Selected Access Control List(ACL) into local SVR DB\n");
- printf("** 36. Provision certificate credential\n\n");
+ printf("** 33. Check Linked Status of the Selected Device on PRVN DB\n");
+ printf("** 34. Save the Selected Access Control List(ACL) into local SVR DB\n");
+ printf("** 35. Provision certificate credential\n\n");
printf("** [D] UNLINK PAIRWISE THINGS\n");
OIC_LOG(ERROR, TAG, "_32_PROVIS_ACL_: error");
}
break;
- case _33_PROVIS_DP_:
- if(provisionDirectPairing())
- {
- OIC_LOG(ERROR, TAG, "_33_PROVIS_DP_: error");
- }
- break;
- case _34_CHECK_LINK_STATUS_:
+ case _33_CHECK_LINK_STATUS_:
if(checkLinkedStatus())
{
OIC_LOG(ERROR, TAG, "_34_CHECK_LINK_STATUS_: error");
}
break;
- case _35_SAVE_ACL_:
+ case _34_SAVE_ACL_:
if(saveAcl())
{
OIC_LOG(ERROR, TAG, "_35_SAVE_ACL_: error");
}
break;
- case _36_PROVIS_CERT_:
+ case _35_PROVIS_CERT_:
if (provisionCert())
{
OIC_LOG(ERROR, TAG, "_36_PROVIS_CERT_: error");
#include "credresource.h"
#include "utlist.h"
#include "aclresource.h" //Note: SRM internal header
-#include "pconfresource.h"
#include "psinterface.h"
#define TAG "OIC_OCPMAPI"
}
#endif
-/**
- * this function sends Direct-Pairing Configuration to a device.
- *
- * @param[in] ctx Application context would be returned in result callback.
- * @param[in] selectedDeviceInfo Selected target device.
- * @param[in] pconf PCONF pointer.
- * @param[in] resultCallback callback provided by API user, callback will be called when provisioning
- request recieves a response from resource server.
- * @return OC_STACK_OK in case of success and other value otherwise.
- */
-OCStackResult OC_CALL OCProvisionDirectPairing(void* ctx, const OCProvisionDev_t *selectedDeviceInfo, OicSecPconf_t *pconf,
- OCProvisionResultCB resultCallback)
-{
- return SRPProvisionDirectPairing(ctx, selectedDeviceInfo, pconf, resultCallback);
-}
-
#ifdef MULTIPLE_OWNER
static void AddPreconfPinOxMCB(void* ctx, size_t nOfRes, OCProvisionResult_t *arr, bool hasError)
{
DeleteACLList(pAcl);
}
-/**
- * This function deletes PDACL data.
- *
- * @param pPdAcl Pointer to OicSecPdAcl_t structure.
- */
-void OC_CALL OCDeletePdAclList(OicSecPdAcl_t* pPdAcl)
-{
- FreePdAclList(pPdAcl);
-}
-
#ifdef MULTIPLE_OWNER
/**
* API to update 'doxm.mom' to resource server.
#include "csrresource.h"
#include "rolesresource.h"
#include "doxmresource.h"
-#include "pconfresource.h"
#include "credentialgenerator.h"
#include "cainterface.h"
#include "oic_string.h"
size_t numOfResults; /**< Number of results in result array.**/
};
-/**
- * Structure to carry PCONF provision API data to callback.
- */
-typedef struct PconfData PconfData_t;
-struct PconfData
-{
- void *ctx; /**< Pointer to user context.**/
- const OCProvisionDev_t *deviceInfo; /**< Pointer to PMDevInfo_t.**/
- OCProvisionResultCB resultCallback; /**< Pointer to result callback.**/
- OCProvisionResult_t *resArr; /**< Result array.**/
- int numOfResults; /**< Number of results in result array.**/
-};
-
// Enum type index for unlink callback.
typedef enum {
IDX_FIRST_DEVICE_RES = 0, // index for resulf of the first device
return res;
}
-/**
- * Internal Function to store results in result array during Direct-Pairing provisioning.
- */
-static void registerResultForDirectPairingProvisioning(PconfData_t *pconfData,
- OCStackResult stackresult)
-{
- OIC_LOG_V(INFO, TAG, "Inside registerResultForDirectPairingProvisioning "
- "pconfData->numOfResults is %d", pconfData->numOfResults);
- memcpy(pconfData->resArr[(pconfData->numOfResults)].deviceId.id,
- pconfData->deviceInfo->doxm->deviceID.id, UUID_LENGTH);
- pconfData->resArr[(pconfData->numOfResults)].res = stackresult;
- ++(pconfData->numOfResults);
-}
-
-/**
- * Callback handler of SRPProvisionDirectPairing.
- *
- * @param[in] ctx ctx value passed to callback from calling function.
- * @param[in] UNUSED handle to an invocation
- * @param[in] clientResponse Response from queries to remote servers.
- * @return OC_STACK_DELETE_TRANSACTION to delete the transaction
- * and OC_STACK_KEEP_TRANSACTION to keep it.
- */
-static OCStackApplicationResult SRPProvisionDirectPairingCB(void *ctx, OCDoHandle UNUSED,
- OCClientResponse *clientResponse)
-{
- OIC_LOG_V(INFO, TAG, "Inside SRPProvisionDirectPairingCB.");
- (void)UNUSED;
- VERIFY_NOT_NULL_RETURN(TAG, ctx, ERROR, OC_STACK_DELETE_TRANSACTION);
- PconfData_t *pconfData = (PconfData_t*)ctx;
- OCProvisionResultCB resultCallback = pconfData->resultCallback;
-
- if (clientResponse)
- {
- if(OC_STACK_RESOURCE_CHANGED == clientResponse->result)
- {
- registerResultForDirectPairingProvisioning(pconfData, OC_STACK_OK);
- ((OCProvisionResultCB)(resultCallback))(pconfData->ctx, pconfData->numOfResults,
- pconfData->resArr,
- false);
- OICFree(pconfData->resArr);
- OICFree(pconfData);
- return OC_STACK_DELETE_TRANSACTION;
- }
- }
- registerResultForDirectPairingProvisioning(pconfData, OC_STACK_ERROR);
- ((OCProvisionResultCB)(resultCallback))(pconfData->ctx, pconfData->numOfResults,
- pconfData->resArr,
- true);
- OIC_LOG_V(ERROR, TAG, "SRPProvisionDirectPairingCB received Null clientResponse");
- OICFree(pconfData->resArr);
- OICFree(pconfData);
- return OC_STACK_DELETE_TRANSACTION;
-}
-
-OCStackResult SRPProvisionDirectPairing(void *ctx, const OCProvisionDev_t *selectedDeviceInfo,
- OicSecPconf_t *pconf, OCProvisionResultCB resultCallback)
-{
- VERIFY_NOT_NULL_RETURN(TAG, selectedDeviceInfo, ERROR, OC_STACK_INVALID_PARAM);
- VERIFY_NOT_NULL_RETURN(TAG, pconf, ERROR, OC_STACK_INVALID_PARAM);
- VERIFY_NOT_NULL_RETURN(TAG, resultCallback, ERROR, OC_STACK_INVALID_CALLBACK);
-
- // check direct-pairing capability
- if (true != selectedDeviceInfo->doxm->dpc)
- {
- OIC_LOG(ERROR, TAG, "Resouce server does not have Direct-Pairing Capability ");
- return OC_STACK_UNAUTHORIZED_REQ;
- }
-
- OicUuid_t provTooldeviceID = {.id={0}};
- if (OC_STACK_OK != GetDoxmDeviceID(&provTooldeviceID))
- {
- OIC_LOG(ERROR, TAG, "Error while retrieving provisioning tool's device ID");
- return OC_STACK_ERROR;
- }
- memcpy(&pconf->rownerID, &provTooldeviceID, sizeof(OicUuid_t));
-
- OCSecurityPayload* secPayload = (OCSecurityPayload*)OICCalloc(1, sizeof(OCSecurityPayload));
- if(!secPayload)
- {
- OIC_LOG(ERROR, TAG, "Failed to allocate memory");
- return OC_STACK_NO_MEMORY;
- }
- secPayload->base.type = PAYLOAD_TYPE_SECURITY;
-
- if (OC_STACK_OK != PconfToCBORPayload(pconf, &(secPayload->securityData),
- &(secPayload->payloadSize)))
- {
- OCPayloadDestroy((OCPayload*)secPayload);
- OIC_LOG(ERROR, TAG, "Failed to PconfToCborPayload");
- return OC_STACK_NO_MEMORY;
- }
- OIC_LOG(DEBUG, TAG, "Created payload for pconf set");
- OIC_LOG_BUFFER(DEBUG, TAG, secPayload->securityData, secPayload->payloadSize);
-
- char query[MAX_URI_LENGTH + MAX_QUERY_LENGTH] = {0};
- if(!PMGenerateQuery(true,
- selectedDeviceInfo->endpoint.addr,
- selectedDeviceInfo->securePort,
- selectedDeviceInfo->connType,
- query, sizeof(query), OIC_RSRC_PCONF_URI))
- {
- OIC_LOG(ERROR, TAG, "SRPProvisionDirectPairing : Failed to generate query");
- return OC_STACK_ERROR;
- }
- OIC_LOG_V(DEBUG, TAG, "Query=%s", query);
-
- OCCallbackData cbData = {.context=NULL, .cb=NULL, .cd=NULL};
- cbData.cb = &SRPProvisionDirectPairingCB;
- PconfData_t *pconfData = (PconfData_t *) OICCalloc(1, sizeof(PconfData_t));
- if (NULL == pconfData)
- {
- OCPayloadDestroy((OCPayload*)secPayload);
- OIC_LOG(ERROR, TAG, "Unable to allocate memory");
- return OC_STACK_NO_MEMORY;
- }
- pconfData->deviceInfo = selectedDeviceInfo;
- pconfData->resultCallback = resultCallback;
- pconfData->numOfResults=0;
- pconfData->ctx = ctx;
- // call to provision PCONF to device1.
- int noOfRiCalls = 1;
- pconfData->resArr = (OCProvisionResult_t*)OICCalloc(noOfRiCalls, sizeof(OCProvisionResult_t));
- if (NULL == pconfData->resArr)
- {
- OICFree(pconfData);
- OCPayloadDestroy((OCPayload*)secPayload);
- OIC_LOG(ERROR, TAG, "Unable to allocate memory");
- return OC_STACK_NO_MEMORY;
- }
- cbData.context = (void *)pconfData;
- cbData.cd = NULL;
- OCMethod method = OC_REST_POST;
- OCDoHandle handle = NULL;
- OIC_LOG(DEBUG, TAG, "Sending PCONF info to resource server");
- OCStackResult ret = OCDoResource(&handle, method, query,
- &selectedDeviceInfo->endpoint, (OCPayload*)secPayload,
- selectedDeviceInfo->connType, OC_HIGH_QOS, &cbData, NULL, 0);
- if (OC_STACK_OK != ret)
- {
- OICFree(pconfData->resArr);
- OICFree(pconfData);
- }
- VERIFY_SUCCESS_RETURN(TAG, (OC_STACK_OK == ret), ERROR, OC_STACK_ERROR);
- return OC_STACK_OK;
-}
-
static void DeleteUnlinkData_t(UnlinkData_t *unlinkData)
{
if (unlinkData)
EXPECT_EQ(1, 1);
}
-TEST(OCDeletePdAclListTest, NullPdACLList)
-{
- OCDeletePdAclList(NULL);
- EXPECT_EQ(1, 1);
-}
-
TEST(OCDeleteDiscoveredDevicesTest, NullProvisionDevList)
{
OCDeleteDiscoveredDevices(NULL);
static OCProvisionDev_t pDev2;
static OicSecCredType_t credType = SYMMETRIC_PAIR_WISE_KEY;
static OCProvisionDev_t selectedDeviceInfo;
-static OicSecPconf_t pconf;
static OicSecOxm_t oicSecDoxmJustWorks = OIC_JUST_WORKS;
static OicSecOxm_t oicSecDoxmRandomPin = OIC_RANDOM_DEVICE_PIN;
static unsigned short timeout = 60;
EXPECT_EQ(OC_STACK_INVALID_PARAM, SRPRemoveDevice(NULL, 0, &dev1, NULL));
}
-TEST(SRPProvisionDirectPairingTest, NullselectedDeviceInfo)
-{
- EXPECT_EQ(OC_STACK_INVALID_PARAM, SRPProvisionDirectPairing(NULL, NULL, &pconf, &provisioningCB));
-}
-
-TEST(SRPProvisionDirectPairingTest, Nullpconf)
-{
- EXPECT_EQ(OC_STACK_INVALID_PARAM, SRPProvisionDirectPairing(NULL, &selectedDeviceInfo, NULL, &provisioningCB));
-}
-
-TEST(SRPProvisionDirectPairingTest, Nullcallback)
-{
- EXPECT_EQ(OC_STACK_INVALID_CALLBACK, SRPProvisionDirectPairing(NULL, &selectedDeviceInfo, &pconf, NULL));
-}
-
const char *SECURE_RESOURCE_PROVIDER_TEST_FILE_NAME = "secureresourceprovider.dat";
OCPersistentStorage ps = { NULL, NULL, NULL, NULL, NULL};
+++ /dev/null
-/* *****************************************************************
- *
- * Copyright 2016 Samsung Electronics All Rights Reserved.
- *
- *
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * *****************************************************************/
-#ifndef _POSIX_C_SOURCE
-#define _POSIX_C_SOURCE 200112L
-#endif
-#include "iotivity_config.h"
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#ifdef HAVE_TIME_H
-#include <time.h>
-#endif
-#ifdef HAVE_SYS_TIME_H
-#include <sys/time.h>
-#endif
-#ifdef HAVE_STRING_H
-#include <string.h>
-#endif
-
-#include "ocstack.h"
-#include "oic_malloc.h"
-#include "oic_string.h"
-#include "logger.h"
-#include "utlist.h"
-#include "ocpayload.h"
-#include "payload_logging.h"
-#include "cainterface.h"
-#include "directpairing.h"
-#include "srmresourcestrings.h" //@note: SRM's internal header
-#include "doxmresource.h" //@note: SRM's internal header
-#include "pconfresource.h" //@note: SRM's internal header
-#include "dpairingresource.h" //@note: SRM's internal header
-#include "credresource.h"
-#include "pmtypes.h"
-#include "pmutility.h"
-#include "srmutility.h"
-#include "ocstackinternal.h"
-#if defined(__WITH_DTLS__) || defined (__WITH_TLS__)
-#include <mbedtls/ssl_ciphersuites.h>
-#endif
-
-#define TAG ("OIC_DP")
-static const uint16_t CBOR_SIZE = 1024;
-
-/**
- * Structure to carry direct-pairing API data to callback.
- */
-typedef struct DPairData
-{
- OCDirectPairingDev_t *peer; /**< Pointer to pairing target info.**/
- char pin[DP_PIN_LENGTH]; /**< PIN **/
- OCDirectPairingResultCB resultCallback; /**< Pointer to result callback.**/
- void *userCtx; /** < user context to pass in callback **/
-} DPairData_t;
-
-static OCDirectPairingDev_t *g_dp_paired = NULL;
-static OCDirectPairingDev_t *g_dp_discover = NULL;
-static DPairData_t *g_dp_proceed_ctx = NULL;
-
-
-/**
- * Function to search node in linked list that matches given IP and port.
- *
- * @param[in] pList List of OCProvisionDev_t.
- * @param[in] addr address of target device.
- * @param[in] port port of remote server.
- *
- * @return pointer of OCProvisionDev_t if exist, otherwise NULL
- */
-OCDirectPairingDev_t* getDev(OCDirectPairingDev_t **ppList, const char* addr, const uint16_t port)
-{
- if(NULL == addr)
- {
- OIC_LOG_V(ERROR, TAG, "Invalid Input parameters in [%s]\n", __FUNCTION__);
- return NULL;
- }
-
- OCDirectPairingDev_t *ptr = NULL;
- LL_FOREACH(*ppList, ptr)
- {
- if( strcmp(ptr->endpoint.addr, addr) == 0 && port == ptr->endpoint.port)
- {
- return ptr;
- }
- }
-
- return NULL;
-}
-
-
-
-/**
- * Add device information to list.
- *
- * @param[in] pList List of OCProvisionDev_t.
- * @param[in] addr address of target device.
- * @param[in] port port of remote server.
- * @param[in] adapter adapter type of endpoint.
- * @param[in] doxm pointer to doxm instance.
- * @param[in] connType connectivity type of endpoint
- *
- * @return OC_STACK_OK for success and errorcode otherwise.
- */
-OCStackResult addDev(OCDirectPairingDev_t **ppList, OCDevAddr *endpoint,
- OCConnectivityType conn, OicSecPconf_t *pconf)
-{
- if(NULL == endpoint || NULL == pconf)
- {
- OIC_LOG_V(ERROR, TAG, "Invalid Input parameters in [%s]\n", __FUNCTION__);
- return OC_STACK_INVALID_PARAM;
- }
-
- OCDirectPairingDev_t *ptr = getDev(ppList, endpoint->addr, endpoint->port);
- if(!ptr)
- {
- ptr = (OCDirectPairingDev_t *)OICCalloc(1, sizeof (OCDirectPairingDev_t));
- if (NULL == ptr)
- {
- OIC_LOG(ERROR, TAG, "Error while allocating memory for linkedlist node !!");
- return OC_STACK_NO_MEMORY;
- }
-
- memcpy(&ptr->endpoint, endpoint, sizeof(OCDevAddr));
- ptr->connType = conn;
- ptr->securePort = DEFAULT_SECURE_PORT;
- ptr->edp = pconf->edp;
- ptr->prm = pconf->prm;
- pconf->prm = NULL; // to prevent free
- ptr->prmLen = pconf->prmLen;
- memcpy(&ptr->deviceID, &pconf->deviceID, sizeof(OicUuid_t));
- memcpy(&ptr->rowner, &pconf->rownerID, sizeof(OicUuid_t));
- ptr->next = NULL;
-
- LL_PREPEND(*ppList, ptr);
- OIC_LOG(INFO, TAG, "device added !");
- }
-
- return OC_STACK_OK;
-}
-
-
-/**
- * Add device information to list.
- *
- * @param[in] ppList List of OCProvisionDev_t.
- * @param[in] pDev target device.
- *
- * @return OC_STACK_OK for success and errorcode otherwise.
- */
-OCStackResult addDev2(OCDirectPairingDev_t **ppList, OCDirectPairingDev_t *pDev)
-{
- if(NULL == pDev)
- {
- OIC_LOG_V(ERROR, TAG, "Invalid Input parameters in [%s]\n", __FUNCTION__);
- return OC_STACK_INVALID_PARAM;
- }
-
- OCDirectPairingDev_t *ptr = getDev(ppList, pDev->endpoint.addr, pDev->endpoint.port);
- if(!ptr)
- {
- ptr = (OCDirectPairingDev_t *)OICCalloc(1, sizeof (OCDirectPairingDev_t));
- if (NULL == ptr)
- {
- OIC_LOG(ERROR, TAG, "Error while allocating memory for linkedlist node !!");
- return OC_STACK_NO_MEMORY;
- }
-
- memcpy(&ptr->endpoint, &pDev->endpoint, sizeof(OCDevAddr));
- ptr->connType = pDev->connType;
- ptr->securePort = pDev->securePort;
- ptr->edp = pDev->edp;
- ptr->prmLen = pDev->prmLen;
- ptr->prm = (OicSecPrm_t*)OICCalloc(ptr->prmLen, sizeof (OicSecPrm_t));
- if (NULL == ptr->prm)
- {
- OIC_LOG(ERROR, TAG, "Error while allocating memory for prm !!");
- return OC_STACK_NO_MEMORY;
- }
- memcpy(ptr->prm, pDev->prm, sizeof(OicSecPrm_t)*ptr->prmLen);
- memcpy(&ptr->deviceID, &pDev->deviceID, sizeof(OicUuid_t));
- memcpy(&ptr->rowner, &pDev->rowner, sizeof(OicUuid_t));
- ptr->next = NULL;
-
- LL_PREPEND(*ppList, ptr);
- OIC_LOG(INFO, TAG, "device added !");
- }
-
- return OC_STACK_OK;
-}
-
-
-
-/**
- * This function deletes list of provision target devices
- *
- * @param[in] pDevicesList List of OCProvisionDev_t.
- */
-void delList(OCDirectPairingDev_t *pList)
-{
- if(pList)
- {
- OCDirectPairingDev_t *del = NULL, *tmp = NULL;
- LL_FOREACH_SAFE(pList, del, tmp)
- {
- LL_DELETE(pList, del);
- if (del && del->prm)
- {
- OICFree(del->prm);
- }
- }
- }
-}
-
-bool DPGenerateQuery(bool isSecure,
- const char* address, const uint16_t port,
- const OCConnectivityType connType,
- char* buffer, size_t bufferSize, const char* uri)
-{
- if(!address || !buffer || !uri)
- {
- OIC_LOG(ERROR, TAG, "DPGenerateQuery : Invalid parameters.");
- return false;
- }
-
- static char QPREFIX_COAP[] = "coap://";
- static char QPREFIX_COAPS[] = "coaps://";
- static char QPREFIX_COAP_TCP[] = "coap+tcp://";
- static char QPREFIX_COAPS_TCP[] = "coaps+tcp://";
-
- int snRet = 0;
- char* prefix = (isSecure == true) ? QPREFIX_COAPS : QPREFIX_COAP;
-
- switch(connType & CT_MASK_ADAPTER)
- {
-// @todo: Remove this ifdef. On Arduino, CT_ADAPTER_TCP resolves to the same value
-// as CT_ADAPTER_IP, resulting in a compiler error.
-#ifdef WITH_TCP
-#ifndef WITH_ARDUINO
- case CT_ADAPTER_TCP:
- prefix = (isSecure == true) ? QPREFIX_COAPS_TCP : QPREFIX_COAP_TCP;
- // intentional fall through don't add break
-#endif
-#endif
- case CT_ADAPTER_IP:
- switch(connType & CT_MASK_FLAGS & ~CT_FLAG_SECURE)
- {
- case CT_IP_USE_V4:
- snRet = snprintf(buffer, bufferSize, "%s%s:%d%s",
- prefix, address, port, uri);
- break;
- case CT_IP_USE_V6:
- {
- char addressEncoded[CA_MAX_URI_LENGTH] = {0};
-
- OCStackResult result = OCEncodeAddressForRFC6874(addressEncoded,
- sizeof(addressEncoded),
- address);
- if (OC_STACK_OK != result)
- {
- OIC_LOG_V(ERROR, TAG, "DPGenerateQuery : encoding error %d\n", result);
- return false;
- }
-
- snRet = snprintf(buffer, bufferSize, "%s[%s]:%d%s",
- prefix, addressEncoded, port, uri);
- break;
- }
- default:
- OIC_LOG(ERROR, TAG, "Unknown address format.");
- return false;
- }
- // snprintf return value check
- if (snRet < 0)
- {
- OIC_LOG_V(ERROR, TAG, "DPGenerateQuery : Error (snprintf) %d\n", snRet);
- return false;
- }
- else if ((size_t)snRet >= bufferSize)
- {
- OIC_LOG_V(ERROR, TAG, "DPGenerateQuery : Truncated (snprintf) %d\n", snRet);
- return false;
- }
-
- break;
-#ifndef WITH_ARDUINO
- // TODO: We need to verify tinyDTLS in below cases
- case CT_ADAPTER_GATT_BTLE:
- case CT_ADAPTER_RFCOMM_BTEDR:
- OIC_LOG(ERROR, TAG, "Not supported connectivity adapter.");
- return false;
-#endif
- default:
- OIC_LOG(ERROR, TAG, "Unknown connectivity adapter.");
- return false;
- }
-
- return true;
-}
-
-const OCDirectPairingDev_t* DPGetDiscoveredDevices()
-{
- return g_dp_discover;
-}
-
-const OCDirectPairingDev_t* DPGetPairedDevices()
-{
- return g_dp_paired;
-}
-
-void DPDeleteLists()
-{
- delList(g_dp_discover);
- delList(g_dp_paired);
-}
-
-/**
- * Callback handler of FinalizeDirectPairing.
- *
- * @param[in] ctx ctx value passed to callback from calling function.
- * @param[in] UNUSED handle to an invocation
- * @param[in] clientResponse Response from queries to remote servers.
- * @return OC_STACK_DELETE_TRANSACTION to delete the transaction
- * and OC_STACK_KEEP_TRANSACTION to keep it.
- */
-static OCStackApplicationResult DirectPairingFinalizeHandler(void *ctx, OCDoHandle UNUSED,
- OCClientResponse *clientResponse)
-{
- OIC_LOG(INFO, TAG, "IN DirectPairingFinalizeHandler()");
- (void)UNUSED;
- if(NULL == ctx)
- {
- OIC_LOG(ERROR, TAG, "Context is Null");
- return OC_STACK_DELETE_TRANSACTION;
- }
-
- OCStackResult res;
- DPairData_t *dpairData = (DPairData_t*)ctx;
- OCDirectPairingDev_t *peer = dpairData->peer;
- OCDirectPairingResultCB resultCallback = dpairData->resultCallback;
-
- if (clientResponse)
- {
- if(OC_STACK_RESOURCE_CHANGED == clientResponse->result)
- {
- // result
- OIC_LOG(INFO, TAG, "DirectPairingFinalizeHandler : success PUT"
- " request to /oic/sec/dpairing");
-
- CAEndpoint_t endpoint;
- memset(&endpoint, 0x00, sizeof(CAEndpoint_t));
- OICStrcpy(endpoint.addr, MAX_ADDR_STR_SIZE_CA, peer->endpoint.addr);
- endpoint.addr[MAX_ADDR_STR_SIZE_CA - 1] = '\0';
- endpoint.port = peer->securePort;
-
- OicUuid_t ptDeviceID = {.id={0}};
- if (OC_STACK_OK != GetDoxmDeviceID(&ptDeviceID))
- {
- OIC_LOG(ERROR, TAG, "Error while retrieving provisioning tool's device ID");
- resultCallback(dpairData->userCtx, peer, OC_STACK_ERROR);
- return OC_STACK_DELETE_TRANSACTION;
- }
-
-#if defined(__WITH_DTLS__) || defined(__WITH_TLS__)
- res = SavePairingPSK((OCDevAddr*)&endpoint, &peer->deviceID, &ptDeviceID, false);
- if(OC_STACK_OK != res)
- {
- OIC_LOG(ERROR, TAG, "Failed to PairingPSK generation");
- resultCallback(dpairData->userCtx, peer, res);
- return OC_STACK_DELETE_TRANSACTION;
- }
-
- // close temporary sesion
- CAResult_t caResult = CAcloseSslSession((const CAEndpoint_t*)&endpoint);
- if(CA_STATUS_OK != caResult)
- {
- OIC_LOG(INFO, TAG, "Fail to close temporary dtls session");
- }
-#endif // __WITH_DTLS__ or __WITH_TLS__
-
- OIC_LOG(INFO, TAG, "Direct-Papring was successfully completed.");
-
- // update paired list
- OCDirectPairingDev_t *dev = getDev(&g_dp_discover, peer->endpoint.addr,
- peer->endpoint.port);
- res = addDev2(&g_dp_paired, dev);
- if (OC_STACK_OK != res)
- {
- OIC_LOG(ERROR, TAG, "Error while adding a device to paired list.");
- }
-
- resultCallback(dpairData->userCtx, peer, OC_STACK_OK);
-
- return OC_STACK_DELETE_TRANSACTION;
- }
- else
- {
- OIC_LOG(INFO, TAG, "Direct-Papring received error response.");
- }
- }
- else
- {
- OIC_LOG(ERROR, TAG, "DirectPairingFinalizeHandler received Null clientResponse");
- }
-
- resultCallback(dpairData->userCtx, peer, OC_STACK_ERROR);
- OICFree(dpairData);
- return OC_STACK_DELETE_TRANSACTION;
-}
-
-/**
- * Finalize direct-pairing .
- *
- * @param[in] peer target device to establish direct-pairing.
- * @param[in] resultCallback result event callback.
- *
- * @return OC_STACK_OK on success otherwise error.
- */
-OCStackResult FinalizeDirectPairing(void *ctx, OCDirectPairingDev_t* peer,
- OCDirectPairingResultCB resultCallback)
-{
- if(NULL == peer)
- {
- return OC_STACK_INVALID_PARAM;
- }
-
- OicUuid_t deviceID = {.id={0}};
- if (OC_STACK_OK != GetDoxmDeviceID(&deviceID))
- {
- OIC_LOG(ERROR, TAG, "Error while retrieving device ID");
- return OC_STACK_ERROR;
- }
-
- OicSecDpairing_t dpair;
- memset(&dpair, 0, sizeof(OicSecDpairing_t));
- dpair.spm = (OicSecPrm_t)PRM_NOT_ALLOWED;
- memcpy(&dpair.pdeviceID, &deviceID, sizeof(OicUuid_t));
-
- OCSecurityPayload* secPayload = (OCSecurityPayload*)OICCalloc(1, sizeof(OCSecurityPayload));
- if(!secPayload)
- {
- OIC_LOG(ERROR, TAG, "Failed to memory allocation");
- return OC_STACK_NO_MEMORY;
- }
- secPayload->base.type = PAYLOAD_TYPE_SECURITY;
-
- OCStackResult ret = DpairingToCBORPayload(&dpair, &(secPayload->securityData),
- &(secPayload->payloadSize));
-
- if(OC_STACK_OK != ret)
- {
- OICFree(secPayload);
- OIC_LOG(ERROR, TAG, "Failed to DpairingToCBORPayload");
- return OC_STACK_NO_MEMORY;
- }
- OIC_LOG(DEBUG, TAG, "DPARING CBOR data:");
- OIC_LOG_BUFFER(DEBUG, TAG, secPayload->securityData, secPayload->payloadSize);
-
- char query[MAX_URI_LENGTH + MAX_QUERY_LENGTH] = {0};
- if(!DPGenerateQuery(true,
- peer->endpoint.addr,
- peer->securePort,
- peer->connType,
- query, sizeof(query), OIC_RSRC_DPAIRING_URI))
- {
- OIC_LOG(ERROR, TAG, "DPDirectPairing : Failed to generate query");
- return OC_STACK_ERROR;
- }
- OIC_LOG_V(DEBUG, TAG, "Query=%s", query);
-
- DPairData_t *dpairData = (DPairData_t *) OICCalloc(1, sizeof(DPairData_t));
- if (dpairData == NULL)
- {
- OICFree(secPayload->securityData);
- OICFree(secPayload);
- OIC_LOG(ERROR, TAG, "Unable to allocate memory");
- return OC_STACK_NO_MEMORY;
- }
- dpairData->peer = peer;
- dpairData->resultCallback = resultCallback;
- dpairData->userCtx = ctx;
-
- OCCallbackData cbData;
- memset(&cbData, 0, sizeof(cbData));
- cbData.cb = DirectPairingFinalizeHandler;
- cbData.context = (void*)dpairData;
- cbData.cd = NULL;
-
- OCMethod method = OC_REST_PUT;
- OCDoHandle handle = NULL;
- OIC_LOG(DEBUG, TAG, "Sending DPAIRNG setting to resource server");
- ret = OCDoResource(&handle, method, query,
- &peer->endpoint, (OCPayload*)secPayload,
- peer->connType, OC_LOW_QOS, &cbData, NULL, 0);
- if(OC_STACK_OK != ret)
- {
- OIC_LOG(ERROR, TAG, "error in OCDoResource");
- return OC_STACK_ERROR;
- }
-
- return OC_STACK_OK;
- }
-
-/**
- * Function to handle the handshake result in Direct-Pairing.
- * This function will be invoked after DTLS handshake
- * @param endPoint [IN] The remote endpoint.
- * @param errorInfo [IN] Error information from the endpoint.
- * @return NONE
- */
-CAResult_t DirectPairingDTLSHandshakeCB(const CAEndpoint_t *endpoint, const CAErrorInfo_t *info)
-{
- OIC_LOG(INFO, TAG, "IN DirectPairingDTLSHandshakeCB");
- CAResult_t result = CA_STATUS_OK;
-
- if(g_dp_proceed_ctx && g_dp_proceed_ctx->peer && endpoint && info)
- {
- OIC_LOG_V(INFO, TAG, "Received status from remote device(%s:%d) : %d",
- endpoint->addr, endpoint->port, info->result);
-
- OCDirectPairingDev_t *peer = g_dp_proceed_ctx->peer;
- OCDirectPairingResultCB resultCallback = g_dp_proceed_ctx->resultCallback;
- OCStackResult res;
-
- //Make sure the address matches.
- if(strncmp(peer->endpoint.addr, endpoint->addr, sizeof(endpoint->addr)) == 0 &&
- peer->securePort == endpoint->port)
- {
- //In case of success, send next coaps request.
- if(CA_STATUS_OK == info->result)
- {
- OIC_LOG(INFO, TAG, "Now, finalize Direct-Pairing procedure.");
-
- res = FinalizeDirectPairing(g_dp_proceed_ctx->userCtx, peer, resultCallback);
- if(OC_STACK_OK != res)
- {
- OIC_LOG(ERROR, TAG, "Failed to finalize direct-pairing");
- result = CA_HANDLE_ERROR_OTHER_MODULE;
- }
- }
- else if(CA_DTLS_AUTHENTICATION_FAILURE == info->result)
- {
- OIC_LOG(INFO, TAG, "DirectPairingDTLSHandshakeCB - Authentication failed");
- result = CA_HANDLE_ERROR_OTHER_MODULE;
- }
-
-#if defined(__WITH_DTLS__) || defined(__WITH_TLS__)
- CAregisterSslHandshakeCallback(NULL);
-#endif // __WITH_DTLS__ or __WITH_TLS__
- res = RemoveCredential(&peer->deviceID);
- if(OC_STACK_RESOURCE_DELETED != res)
- {
- OIC_LOG_V(ERROR, TAG, "Failed to remove temporal PSK : %d", res);
- }
-
- OICFree(g_dp_proceed_ctx);
- g_dp_proceed_ctx = NULL;
- }
- else
- {
- OIC_LOG(INFO, TAG, "DirectPairingDTLSHandshakeCB - Not matched to peer address");
- }
- }
-
- OIC_LOG(INFO, TAG, "OUT DirectPairingDTLSHandshakeCB");
- return result;
-}
-
-/**
- * Callback handler of DPDirectPairing.
- *
- * @param[in] ctx ctx value passed to callback from calling function.
- * @param[in] UNUSED handle to an invocation
- * @param[in] clientResponse Response from queries to remote servers.
- * @return OC_STACK_DELETE_TRANSACTION to delete the transaction
- * and OC_STACK_KEEP_TRANSACTION to keep it.
- */
-static OCStackApplicationResult DirectPairingHandler(void *ctx, OCDoHandle UNUSED,
- OCClientResponse *clientResponse)
-{
- OIC_LOG(INFO, TAG, "IN DirectPairingHandler.");
- (void)UNUSED;
- if(NULL == ctx)
- {
- OIC_LOG(ERROR, TAG, "Context is Null");
- return OC_STACK_DELETE_TRANSACTION;
- }
-
- OCStackResult res = OC_STACK_ERROR;
- DPairData_t *dpairData = (DPairData_t*)ctx;
- OCDirectPairingResultCB resultCallback = (OCDirectPairingResultCB)dpairData->resultCallback;
- OicUuid_t subjectId = {.id={0}};
-
- if (clientResponse)
- {
- if(OC_STACK_RESOURCE_CHANGED == clientResponse->result)
- {
- // result
- OIC_LOG(INFO, TAG, "DirectPairingHandler : success POST request to /oic/sec/dpairing");
-
-#if defined(__WITH_DTLS__) || defined(__WITH_TLS__)
- // Add temporary psk
- res = AddTmpPskWithPIN(&dpairData->peer->deviceID,
- SYMMETRIC_PAIR_WISE_KEY,
- (char*)dpairData->pin, DP_PIN_LENGTH,
- &dpairData->peer->rowner, &subjectId);
- VERIFY_SUCCESS(TAG, OC_STACK_OK == res, ERROR);
-
-
- // Start to establish a secure channel with Pin-based PSK cipher suite
- CAResult_t caresult;
-
- caresult = CAEnableAnonECDHCipherSuite(false);
- VERIFY_SUCCESS(TAG, CA_STATUS_OK == caresult, ERROR);
-
- caresult = CASelectCipherSuite(MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256, CA_ADAPTER_IP);
- VERIFY_SUCCESS(TAG, CA_STATUS_OK == caresult, ERROR);
-
- //Register proceeding peer info. & DTLS event handler to catch the dtls event while handshake
- g_dp_proceed_ctx = dpairData;
- res = CAregisterSslHandshakeCallback(DirectPairingDTLSHandshakeCB);
- VERIFY_SUCCESS(TAG, CA_STATUS_OK == caresult, ERROR);
-
- // initiate dtls
- CAEndpoint_t endpoint;
- CopyDevAddrToEndpoint(&dpairData->peer->endpoint, &endpoint);
- endpoint.port = dpairData->peer->securePort;
- OIC_LOG_V(INFO, TAG, "Initiate DTLS handshake to %s(%d)", endpoint.addr,
- endpoint.port);
- caresult = CAInitiateHandshake(&endpoint);
- VERIFY_SUCCESS(TAG, CA_STATUS_OK == caresult, ERROR);
-#endif // __WITH_DTLS__ or __WITH_TLS__
-
- res = OC_STACK_OK;
- }
- else
- {
- // result
- OIC_LOG(INFO, TAG, "DirectPairingHandler : fail POST request to /oic/sec/dpairing");
- }
- }
- else
- {
- OIC_LOG(ERROR, TAG, "DirectPairingHandler received Null clientResponse");
- }
-
-#if defined(__WITH_DTLS__) || defined(__WITH_TLS__)
-exit:
-#endif // __WITH_DTLS__ or __WITH_TLS__
-
- if (OC_STACK_OK != res)
- {
- if (0 < strlen((const char*)subjectId.id))
- {
- RemoveCredential(&dpairData->peer->deviceID);
- OICFree(dpairData);
- g_dp_proceed_ctx = NULL;
- OIC_LOG_V(INFO, TAG, "OUT DirectPairingHandler.");
- return OC_STACK_DELETE_TRANSACTION;
- }
-
- resultCallback(dpairData->userCtx, dpairData->peer, res);
- }
- OIC_LOG(INFO, TAG, "OUT DirectPairingHandler.");
- return OC_STACK_DELETE_TRANSACTION;
-}
-
-/**
- * Start direct-pairing .
- *
- * @param[in] peer target device to establish direct-pairing.
- * @param[in] pmSel selected pairing method.
- * @param[in] pinNumber secret value for dtls connection.
- *
- * @return OC_STACK_OK on success otherwise error.
- */
-OCStackResult DPDirectPairing(void *ctx, OCDirectPairingDev_t* peer, OicSecPrm_t pmSel,
- char *pinNumber, OCDirectPairingResultCB resultCallback)
-{
- if(NULL == peer || NULL == pinNumber)
- {
- return OC_STACK_INVALID_PARAM;
- }
-
- OicUuid_t deviceID = {.id={0}};
- if (OC_STACK_OK != GetDoxmDeviceID(&deviceID))
- {
- OIC_LOG(ERROR, TAG, "Error while retrieving device ID");
- return OC_STACK_ERROR;
- }
-
- OicSecDpairing_t dpair;
- memset(&dpair, 0, sizeof(OicSecDpairing_t));
- dpair.spm = pmSel;
- memcpy(&dpair.pdeviceID, &deviceID, sizeof(OicUuid_t));
-
- OCSecurityPayload* secPayload = (OCSecurityPayload*)OICCalloc(1, sizeof(OCSecurityPayload));
- if(!secPayload)
- {
- OIC_LOG(ERROR, TAG, "Failed to memory allocation");
- return OC_STACK_NO_MEMORY;
- }
- secPayload->base.type = PAYLOAD_TYPE_SECURITY;
-
- OCStackResult ret = DpairingToCBORPayload(&dpair, &(secPayload->securityData),
- &(secPayload->payloadSize));
-
- if(OC_STACK_OK != ret)
- {
- OICFree(secPayload);
- OIC_LOG(ERROR, TAG, "Failed to DpairingToCBORPayload");
- return OC_STACK_NO_MEMORY;
- }
- OIC_LOG(DEBUG, TAG, "DPARING CBOR data:");
- OIC_LOG_BUFFER(DEBUG, TAG, secPayload->securityData, secPayload->payloadSize);
-
- char query[MAX_URI_LENGTH + MAX_QUERY_LENGTH] = {0};
- if(!DPGenerateQuery(false,
- peer->endpoint.addr,
- peer->endpoint.port,
- //peer->securePort,
- peer->connType,
- query, sizeof(query), OIC_RSRC_DPAIRING_URI))
- {
- OIC_LOG(ERROR, TAG, "DPDirectPairing : Failed to generate query");
- return OC_STACK_ERROR;
- }
- OIC_LOG_V(DEBUG, TAG, "Query=%s", query);
-
- DPairData_t *dpairData = (DPairData_t *) OICCalloc(1, sizeof(DPairData_t));
- if (dpairData == NULL)
- {
- OICFree(secPayload->securityData);
- OICFree(secPayload);
- OIC_LOG(ERROR, TAG, "Unable to allocate memory");
- return OC_STACK_NO_MEMORY;
- }
- dpairData->peer = peer;
- memcpy(dpairData->pin, pinNumber, DP_PIN_LENGTH);
- dpairData->resultCallback = resultCallback;
- dpairData->userCtx = ctx;
-
- OCCallbackData cbData;
- memset(&cbData, 0, sizeof(cbData));
- cbData.cb = DirectPairingHandler;
- cbData.context = (void*)dpairData;
- cbData.cd = NULL;
-
- OCMethod method = OC_REST_POST;
- OCDoHandle handle = NULL;
- OIC_LOG(DEBUG, TAG, "Sending DPAIRNG setting to resource server");
- ret = OCDoResource(&handle, method, query,
- &peer->endpoint, (OCPayload*)secPayload,
- peer->connType, OC_LOW_QOS, &cbData, NULL, 0);
- if(OC_STACK_OK != ret)
- {
- OIC_LOG(ERROR, TAG, "error in OCDoResource");
- return OC_STACK_ERROR;
- }
-
- return OC_STACK_OK;
-
- }
-
-/**
- * Callback handler for getting secure port information using /oic/res discovery.
- *
- * @param[in] ctx user context
- * @param[in] handle Handle for response
- * @param[in] clientResponse Response information(It will contain payload)
- *
- * @return OC_STACK_KEEP_TRANSACTION to keep transaction and
- * OC_STACK_DELETE_TRANSACTION to delete it.
- */
-static OCStackApplicationResult DirectPairingPortDiscoveryHandler(void *ctx, OCDoHandle UNUSED,
- OCClientResponse *clientResponse)
-{
- OIC_LOG(INFO, TAG, "Callback Context for Direct-Pairing Secure Port DISCOVER "
- "query recvd successfully");
-
- (void)ctx;
- (void)UNUSED;
- if (clientResponse)
- {
- if (NULL == clientResponse->payload)
- {
- OIC_LOG(INFO, TAG, "Skiping Null payload");
- }
- else
- {
- if (PAYLOAD_TYPE_DISCOVERY != clientResponse->payload->type)
- {
- OIC_LOG(INFO, TAG, "Wrong payload type");
- return OC_STACK_DELETE_TRANSACTION;
- }
-
- uint16_t securePort = 0;
- OCResourcePayload* resPayload = ((OCDiscoveryPayload*)clientResponse->payload)->resources;
- OIC_LOG_PAYLOAD(INFO, clientResponse->payload);
-
- if (resPayload && resPayload->secure)
- {
- securePort = resPayload->port;
- }
- else
- {
- OIC_LOG(INFO, TAG, "Can not find secure port information.");
- return OC_STACK_DELETE_TRANSACTION;
- }
-
- OCDirectPairingDev_t *ptr = getDev(&g_dp_discover,
- clientResponse->devAddr.addr, clientResponse->devAddr.port);
- if(!ptr)
- {
- OIC_LOG(ERROR, TAG, "Can not find device information in the discovery device list");
- return OC_STACK_DELETE_TRANSACTION;
- }
- ptr->securePort = securePort;
-
- OIC_LOG(INFO, TAG, "Exiting DirectPairingPortDiscoveryHandler.");
- }
-
- return OC_STACK_DELETE_TRANSACTION;
- }
- else
- {
- OIC_LOG(INFO, TAG, "Skiping Null response");
- }
- return OC_STACK_DELETE_TRANSACTION;
-}
-
-/**
- * Callback handler for DPDeviceDiscovery API.
- *
- * @param[in] ctx User context
- * @param[in] handle Handler for response
- * @param[in] clientResponse Response information (It will contain payload)
- * @return OC_STACK_KEEP_TRANSACTION to keep transaction and
- * OC_STACK_DELETE_TRANSACTION to delete it.
- */
-static OCStackApplicationResult DirectPairingDiscoveryHandler(void* ctx, OCDoHandle UNUSED,
- OCClientResponse * clientResponse)
-{
- OIC_LOG(INFO, TAG, "Callback Context for Direct-Pairing DISCOVER query recvd successfully");
-
- (void)ctx;
- (void)UNUSED;
- if (clientResponse)
- {
- OIC_LOG_V(INFO, TAG, "StackResult: %d", clientResponse->result);
- OIC_LOG_V(INFO, TAG,
- "Device =============> Discovered @ %s:%d",
- clientResponse->devAddr.addr,
- clientResponse->devAddr.port);
-
- if (NULL == clientResponse->payload)
- {
- OIC_LOG(INFO, TAG, "Skiping Null payload");
- return OC_STACK_KEEP_TRANSACTION;
- }
- if (OC_STACK_OK != clientResponse->result)
- {
- OIC_LOG(INFO, TAG, "Error in response");
- return OC_STACK_KEEP_TRANSACTION;
- }
-
- OIC_LOG_PAYLOAD(INFO, clientResponse->payload);
- OicSecPconf_t *pconf = NULL;
-
- OCStackResult res = CBORPayloadToPconf(
- ((OCSecurityPayload*)clientResponse->payload)->securityData,
- CBOR_SIZE,&pconf);
- if (OC_STACK_OK != res )
- {
- OIC_LOG(INFO, TAG, "Ignoring malformed CBOR");
- return OC_STACK_KEEP_TRANSACTION;
- }
- else
- {
- if(pconf->edp)
- {
- OCDevAddr endpoint;
- memcpy(&endpoint, &clientResponse->devAddr, sizeof(OCDevAddr));
-
- res = addDev(&g_dp_discover, &endpoint, clientResponse->connType, pconf);
- DeletePconfBinData(pconf);
- if (OC_STACK_OK != res)
- {
- OIC_LOG(ERROR, TAG, "Error while adding data to linkedlist.");
- return OC_STACK_KEEP_TRANSACTION;
- }
-
- char rsrc_uri[MAX_URI_LENGTH+1] = {0};
- int wr_len = snprintf(rsrc_uri, sizeof(rsrc_uri), "%s?%s=%s",
- OC_RSRVD_WELL_KNOWN_URI, OC_RSRVD_RESOURCE_TYPE, OIC_RSRC_TYPE_SEC_DPAIRING);
- if(wr_len <= 0 || (size_t)wr_len >= sizeof(rsrc_uri))
- {
- OIC_LOG(ERROR, TAG, "rsrc_uri_string_print failed");
- return OC_STACK_KEEP_TRANSACTION;
- }
-
- //Try to the unicast discovery to getting secure port
- char query[MAX_URI_LENGTH+MAX_QUERY_LENGTH+1] = {0};
- if(!DPGenerateQuery(false,
- clientResponse->devAddr.addr, clientResponse->devAddr.port,
- clientResponse->connType,
- query, sizeof(query), rsrc_uri))
- {
- OIC_LOG(ERROR, TAG, "DirectPairingDiscoveryHandler : Failed to generate query");
- return OC_STACK_KEEP_TRANSACTION;
- }
- OIC_LOG_V(DEBUG, TAG, "Query=%s", query);
-
- OCCallbackData cbData;
- cbData.cb = &DirectPairingPortDiscoveryHandler;
- cbData.context = NULL;
- cbData.cd = NULL;
- res = OCDoResource(NULL, OC_REST_DISCOVER, query, 0, 0,
- clientResponse->connType, OC_LOW_QOS, &cbData, NULL, 0);
- if(OC_STACK_OK != res)
- {
- OIC_LOG(ERROR, TAG, "Failed to Secure Port Discovery");
- return OC_STACK_KEEP_TRANSACTION;
- }
- else
- {
- OIC_LOG_V(INFO, TAG, "OCDoResource with [%s] Success", query);
- }
- }
- return OC_STACK_KEEP_TRANSACTION;
- }
- }
- else
- {
- OIC_LOG(INFO, TAG, "Skiping Null response");
- }
-
- return OC_STACK_DELETE_TRANSACTION;
-}
-#ifndef WITH_ARDUINO
-/**
- * Discover direct-pairing devices in the same IP subnet. .
- *
- * @param[in] waittime Timeout in seconds.
- *
- * @return OC_STACK_OK on success otherwise error.
- */
-OCStackResult DPDeviceDiscovery(unsigned short waittime)
-{
- OIC_LOG(DEBUG, TAG, "IN DPDeviceDiscovery");
-
- if (g_dp_discover)
- {
- delList(g_dp_discover);
- g_dp_discover = NULL;
- }
-
- OCStackResult ret;
-
- const char DP_DISCOVERY_QUERY[] = "/oic/sec/pconf";
-
- OCCallbackData cbData;
- cbData.cb = DirectPairingDiscoveryHandler;
- cbData.context = NULL;
- cbData.cd = NULL;
-
- /* Start a DP discovery query*/
- OIC_LOG_V(INFO, TAG, "Initiating Direct-Pairing Discovery : %s\n", DP_DISCOVERY_QUERY);
- OCDoHandle handle = NULL;
- ret = OCDoResource(&handle, OC_REST_DISCOVER, DP_DISCOVERY_QUERY, 0, 0, CT_DEFAULT,
- OC_LOW_QOS, &cbData, NULL, 0);
- if (ret != OC_STACK_OK)
- {
- OIC_LOG(ERROR, TAG, "OCStack resource error");
- return ret;
- }
-
- // wait..
-
- int clock_res = -1;
-#if defined(_MSC_VER)
- time_t startTime = 0;
- clock_res = (time(&startTime) == -1);
-#else
- struct timespec startTime = {.tv_sec=0, .tv_nsec=0};
-#if defined(__ANDROID__) || _POSIX_TIMERS > 0
- clock_res = clock_gettime(CLOCK_MONOTONIC, &startTime);
-#endif
-#endif
- if (0 != clock_res)
- {
- OIC_LOG(ERROR, TAG, "clock error");
- if(OC_STACK_OK != OCCancel(handle, OC_LOW_QOS, NULL, 0))
- {
- OIC_LOG(ERROR, TAG, "Failed to remove registered callback");
- }
- return OC_STACK_ERROR;
- }
-
- while (1)
- {
-#if defined(_MSC_VER)
- time_t currTime = 0;
- clock_res = (time(&currTime) == -1);
-#else
- struct timespec currTime = {.tv_sec=0, .tv_nsec=0};
-#if defined(__ANDROID__) || _POSIX_TIMERS > 0
- clock_res = clock_gettime(CLOCK_MONOTONIC, &currTime);
-#endif
-#endif
- if (0 != clock_res)
- {
- OIC_LOG(ERROR, TAG, "clock error");
- ret = OC_STACK_ERROR;
- break;
- }
-#if defined(_MSC_VER)
- time_t elapsed = currTime - startTime;
-#else
- time_t elapsed = (currTime.tv_sec - startTime.tv_sec);
-#endif
- if (elapsed > waittime)
- {
- break;
- }
- else
- {
- struct timespec timeout = {.tv_sec=0, .tv_nsec=100000000L};
- OCProcess();
- nanosleep(&timeout, NULL);
- }
- }
-
- // Waiting for each response.
- ret = OCCancel(handle, OC_LOW_QOS, NULL, 0);
- if (OC_STACK_OK != ret)
- {
- OIC_LOG(ERROR, TAG, "Failed to remove registered callback");
- }
- OIC_LOG(DEBUG, TAG, "OUT DPDeviceDiscovery");
- return ret;
-}
-#endif
#include "deviceonboardingstate.h"
#include "aclresource.h"
#include "amaclresource.h"
-#include "pconfresource.h"
-#include "dpairingresource.h"
#include "psinterface.h"
#include "srmresourcestrings.h"
#include "credresource.h"
OIC_LOG_V(ERROR, TAG, "%s: set pstat RownerId", __func__);
return 1;
}
- ownerRes = SetDpairingRownerId(&gDoxm->owner);
- if (OC_STACK_OK != ownerRes && OC_STACK_NO_RESOURCE != ownerRes)
- {
- OIC_LOG_V(ERROR, TAG, "%s: set dpairing RownerId", __func__);
- return 1;
- }
- ownerRes = SetPconfRownerId(&gDoxm->owner);
- if (OC_STACK_OK != ownerRes && OC_STACK_NO_RESOURCE != ownerRes)
- {
- OIC_LOG_V(ERROR, TAG, "%s: set pconf RownerId", __func__);
- return 1;
- }
-
return 0;
}
+++ /dev/null
-/* *****************************************************************
- *
- * Copyright 2016 Samsung Electronics All Rights Reserved.
- *
- *
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * *****************************************************************/
-
-#include "iotivity_config.h"
-#include <stdlib.h>
-#include <string.h>
-#include "ocstack.h"
-#include "logger.h"
-#include "oic_malloc.h"
-#include "oic_string.h"
-#include "base64.h"
-#include "resourcemanager.h"
-#include "dpairingresource.h"
-#include "psinterface.h"
-#include "utlist.h"
-#include "srmresourcestrings.h"
-#include "cainterface.h"
-#include "doxmresource.h"
-#include "pconfresource.h"
-#include "credresource.h"
-#include "aclresource.h"
-#include "srmutility.h"
-#include "ocserverrequest.h"
-#include "ocpayload.h"
-#include "ocpayloadcbor.h"
-#include "payload_logging.h"
-#if defined(__WITH_DTLS__) || defined (__WITH_TLS__)
-#include <mbedtls/ssl_ciphersuites.h>
-#endif
-
-#ifdef HAVE_STRINGS_H
-#include <strings.h>
-#endif
-
-#define TAG "OIC_SRM_DPAIRING"
-
-/** Default cbor payload size. This value is increased in case of CborErrorOutOfMemory.
- * The value of payload size is increased until reaching belox max cbor size. */
-static const uint16_t CBOR_SIZE = 1024;
-
-/** Max cbor size payload. */
-static const uint16_t CBOR_MAX_SIZE = 4400;
-
-/** DOXM Map size - Number of mandatory items. */
-static const uint8_t DPAIR_MAP_SIZE = 3;
-
-static OicSecDpairing_t *gDpair = NULL;
-static OCResourceHandle gDpairHandle = NULL;
-static OicSecDpairing_t gDefaultDpair =
-{
- PRM_NOT_ALLOWED, /* OicSecPrm_t spm */
- {.id = {0}}, /* OicUuid_t pdeviceID */
- {.id = {0}}, /* OicUuid_t rowner */
-};
-
-void DeleteDpairingBinData(OicSecDpairing_t* dpair)
-{
- if (dpair)
- {
- //Clean dpairing itself
- OICFree(dpair);
- }
-}
-
-/**
- * Get the default value.
- * @retval the gDefaultDpair pointer;
- */
-static OicSecDpairing_t* GetDpairingDefault()
-{
- OIC_LOG (DEBUG, TAG, "GetDpairingDefault");
-
- return &gDefaultDpair;
-}
-
-/**
- * This method is used by SRM to retrieve Dpairing resource data..
- */
-void SetDpairingResourceOwner(OicUuid_t *rowner)
-{
- OIC_LOG (DEBUG, TAG, "SetDpairingResourceOwner");
- if (gDpair)
- {
- memcpy(&gDpair->rownerID, rowner, sizeof(OicUuid_t));
- }
-}
-
-#if defined(__WITH_DTLS__) || defined(__WITH_TLS__)
-/**
- * Function to save PairingPSK.
- *
- * @param[in] endpoint current endpoint.
- * @param[in] peerDevID peer device indentitiy.
- * @param[in] isPairingServer indicate if it generates PairingPSK for server or client.
- *
- * @return OC_STACK_OK on success
- */
-OCStackResult SavePairingPSK(OCDevAddr *endpoint,
- OicUuid_t *peerDevID, OicUuid_t *owner, bool isPairingServer)
-{
- OIC_LOG(DEBUG, TAG, "IN SavePairingPSK");
-
- if(NULL == endpoint || NULL == peerDevID || NULL == owner)
- {
- OIC_LOG_V(ERROR, TAG, "Invalid Input parameters in [%s]\n", __FUNCTION__);
- return OC_STACK_INVALID_PARAM;
- }
-
- OCStackResult res = OC_STACK_ERROR;
-
- OicUuid_t ptDeviceID = {.id={0}};
- if (OC_STACK_OK != GetDoxmDeviceID(&ptDeviceID))
- {
- OIC_LOG(ERROR, TAG, "Error while retrieving provisioning tool's device ID");
- return res;
- }
-
- uint8_t pairingPSK[OWNER_PSK_LENGTH_128] = {0};
- OicSecKey_t pairingKey;
- memset(&pairingKey, 0, sizeof(pairingKey));
- pairingKey.data = pairingPSK;
- pairingKey.len = OWNER_PSK_LENGTH_128;
- pairingKey.encoding = OIC_ENCODING_RAW;
-
- //Generating PairingPSK using OwnerPSK scheme
- CAResult_t pskRet = CAGenerateOwnerPSK((const CAEndpoint_t *)endpoint,
- (uint8_t *)OIC_RSRC_TYPE_SEC_DPAIRING,
- strlen(OIC_RSRC_TYPE_SEC_DPAIRING),
- (isPairingServer ? ptDeviceID.id : peerDevID->id), sizeof(OicUuid_t), // server
- (isPairingServer ? peerDevID->id : ptDeviceID.id), sizeof(OicUuid_t), // client
- pairingPSK, OWNER_PSK_LENGTH_128);
-
- if (CA_STATUS_OK == pskRet)
- {
- OIC_LOG(DEBUG, TAG, "pairingPSK dump:\n");
- OIC_LOG_BUFFER(DEBUG, TAG, pairingPSK, OWNER_PSK_LENGTH_128);
- //Generating new credential for direct-pairing client
-
- OicSecCred_t *cred = GenerateCredential(peerDevID,
- SYMMETRIC_PAIR_WISE_KEY, NULL,
- &pairingKey, owner, NULL);
- OICClearMemory(pairingPSK, sizeof(pairingPSK));
- VERIFY_NOT_NULL(TAG, cred, ERROR);
-
- res = AddCredential(cred);
- if(res != OC_STACK_OK)
- {
- DeleteCredList(cred);
- return res;
- }
- }
- else
- {
- OIC_LOG(ERROR, TAG, "CAGenerateOwnerPSK failed");
- }
-
- OIC_LOG(DEBUG, TAG, "OUT SavePairingPSK");
-exit:
- return res;
-}
-#endif // __WITH_DTLS__ or __WITH_TLS__
-
-OCStackResult DpairingToCBORPayload(const OicSecDpairing_t *dpair, uint8_t **payload, size_t *size)
-{
- if (NULL == dpair || NULL == payload || NULL != *payload || NULL == size)
- {
- return OC_STACK_INVALID_PARAM;
- }
-
- size_t cborLen = *size;
- if (0 == cborLen)
- {
- cborLen = CBOR_SIZE;
- }
-
- *payload = NULL;
- *size = 0;
-
- OCStackResult ret = OC_STACK_ERROR;
-
- CborEncoder encoder;
- CborEncoder dpairMap;
-
- int64_t cborEncoderResult = CborNoError;
- uint8_t mapSize = DPAIR_MAP_SIZE;
-
- uint8_t *outPayload = (uint8_t *)OICCalloc(1, cborLen);
- VERIFY_NOT_NULL_RETURN(TAG, outPayload, ERROR, OC_STACK_ERROR);
-
- cbor_encoder_init(&encoder, outPayload, cborLen, 0);
-
- cborEncoderResult = cbor_encoder_create_map(&encoder, &dpairMap, mapSize);
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed Creating DPAIRING Map");
-
- //spm -- Mandatory
- cborEncoderResult = cbor_encode_text_string(&dpairMap, OIC_JSON_SPM_NAME,
- strlen(OIC_JSON_SPM_NAME));
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed Adding SPM name tag");
- cborEncoderResult = cbor_encode_int(&dpairMap, dpair->spm);
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed Adding SPM value");
-
- //PDEVICEID -- Mandatory
- cborEncoderResult = cbor_encode_text_string(&dpairMap, OIC_JSON_PDEVICE_ID_NAME,
- strlen(OIC_JSON_PDEVICE_ID_NAME));
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed Adding PDeviceID tag");
- {
- char *deviceId = NULL;
- ret = ConvertUuidToStr(&dpair->pdeviceID, &deviceId);
- VERIFY_SUCCESS(TAG, ret == OC_STACK_OK, ERROR);
- cborEncoderResult = cbor_encode_text_string(&dpairMap, deviceId, strlen(deviceId));
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to encode PDeviceID value");
- OICFree(deviceId);
- }
-
- //ROWNER -- Mandatory
- {
- char *rowner = NULL;
- cborEncoderResult = cbor_encode_text_string(&dpairMap, OIC_JSON_ROWNERID_NAME,
- strlen(OIC_JSON_ROWNERID_NAME));
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed Adding ROWNER tag");
- ret = ConvertUuidToStr(&dpair->rownerID, &rowner);
- VERIFY_SUCCESS(TAG, ret == OC_STACK_OK, ERROR);
- cborEncoderResult = cbor_encode_text_string(&dpairMap, rowner, strlen(rowner));
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed Adding Rowner ID value");
- OICFree(rowner);
- }
-
- cborEncoderResult = cbor_encoder_close_container(&encoder, &dpairMap);
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to close dpairMap");
-
- if (CborNoError == cborEncoderResult)
- {
- *size = cbor_encoder_get_buffer_size(&encoder, outPayload);
- *payload = outPayload;
- ret = OC_STACK_OK;
- }
-
-exit:
- if ((CborErrorOutOfMemory == cborEncoderResult) && (cborLen < CBOR_MAX_SIZE))
- {
- // reallocate and try again!
- OICFree(outPayload);
- outPayload = NULL;
- // Since the allocated initial memory failed, double the memory.
- cborLen += cbor_encoder_get_buffer_size(&encoder, encoder.end);
- cborEncoderResult = CborNoError;
- ret = DpairingToCBORPayload(dpair, payload, &cborLen);
- *size = cborLen;
- }
-
- if ((CborNoError != cborEncoderResult) || (OC_STACK_OK != ret))
- {
- OICFree(outPayload);
- outPayload = NULL;
- *payload = NULL;
- *size = 0;
- ret = OC_STACK_ERROR;
- }
-
- return ret;
-}
-
-OCStackResult CBORPayloadToDpair(const uint8_t *cborPayload, size_t size,
- OicSecDpairing_t **secDpair)
-{
- if (NULL == cborPayload || NULL == secDpair || NULL != *secDpair || 0 == size)
- {
- return OC_STACK_INVALID_PARAM;
- }
-
- OCStackResult ret = OC_STACK_ERROR;
- *secDpair = NULL;
-
- CborValue dpairCbor = { .parser = NULL };
- CborParser parser = { .end = NULL };
- CborError cborFindResult = CborNoError;
-
- cbor_parser_init(cborPayload, size, 0, &parser, &dpairCbor);
- CborValue dpairMap = { .parser = NULL };
- OicSecDpairing_t *dpair = NULL;
- cborFindResult = cbor_value_enter_container(&dpairCbor, &dpairMap);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed Entering DPairing Map");
-
- dpair = (OicSecDpairing_t *)OICCalloc(1, sizeof(*dpair));
- VERIFY_NOT_NULL(TAG, dpair, ERROR);
-
- while (cbor_value_is_valid(&dpairMap) && cbor_value_is_text_string(&dpairMap))
- {
- char *name = NULL;
- size_t len = 0;
- CborType type = CborInvalidType;
- cborFindResult = cbor_value_dup_text_string(&dpairMap, &name, &len, NULL);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed Finding tag name");
- cborFindResult = cbor_value_advance(&dpairMap);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed Advancing a value in DPair map");
-
- type = cbor_value_get_type(&dpairMap);
- if (0 == strcmp(OIC_JSON_SPM_NAME, name) && cbor_value_is_integer(&dpairMap))
- {
- int spm;
-
- cborFindResult = cbor_value_get_int(&dpairMap, &spm);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed Finding SPM Value");
- dpair->spm = (OicSecPrm_t)spm;
- }
-
- if (0 == strcmp(OIC_JSON_PDEVICE_ID_NAME, name))
- {
- char *id = NULL;
- cborFindResult = cbor_value_dup_text_string(&dpairMap, &id, &len, NULL);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed Finding PDeviceID value");
- ret = ConvertStrToUuid(id, &dpair->pdeviceID);
- VERIFY_SUCCESS(TAG, ret == OC_STACK_OK, ERROR);
- OICFree(id);
- }
-
- if (0 == strcmp(OIC_JSON_ROWNERID_NAME, name))
- {
- char *id = NULL;
- cborFindResult = cbor_value_dup_text_string(&dpairMap, &id, &len, NULL);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed Finding RownerID value");
- ret = ConvertStrToUuid(id, &dpair->rownerID);
- VERIFY_SUCCESS(TAG, ret == OC_STACK_OK, ERROR);
- OICFree(id);
- }
-
- if (CborMapType != type && cbor_value_is_valid(&dpairMap))
- {
- cborFindResult = cbor_value_advance(&dpairMap);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed Advancing the Dpair Map");
- }
- OICFree(name);
- }
-
- *secDpair = dpair;
- ret = OC_STACK_OK;
-
-exit:
- if (CborNoError != cborFindResult)
- {
- OIC_LOG (ERROR, TAG, "CBORPayloadToDoxm failed");
- DeleteDpairingBinData(dpair);
- dpair = NULL;
- *secDpair = NULL;
- ret = OC_STACK_ERROR;
- }
- return ret;
-}
-/**
- * Function to handle the handshake result in Direct-Pairing.
- * This function will be invoked after DTLS handshake
- * @param endPoint [IN] The remote endpoint.
- * @param errorInfo [IN] Error information from the endpoint.
- * @return NONE
- */
-CAResult_t DPairingDTLSHandshakeCB(const CAEndpoint_t *endpoint, const CAErrorInfo_t *info)
-{
- OIC_LOG(INFO, TAG, "IN DPairingDTLSHandshakeCB");
-
- if(gDpair && endpoint && info)
- {
- OIC_LOG_V(INFO, TAG, "Received status from remote device(%s:%d) : %d",
- endpoint->addr, endpoint->port, info->result);
-
- if(CA_STATUS_OK == info->result)
- {
- OIC_LOG(INFO, TAG, "DPairingDTLSHandshakeCB - Connection success.");
- }
- else if(CA_DTLS_AUTHENTICATION_FAILURE == info->result)
- {
- OIC_LOG(INFO, TAG, "DPairingDTLSHandshakeCB - Authentication failed");
-
- }
-
-#if defined(__WITH_DTLS__) || defined(__WITH_TLS__)
- CAregisterSslHandshakeCallback(NULL);
-#endif // __WITH_DTLS__ or __WITH_TLS__
-
- // delete temporary key
- RemoveCredential(&gDpair->pdeviceID);
- }
-
- OIC_LOG(INFO, TAG, "OUT DPairingDTLSHandshakeCB");
- return CA_STATUS_OK;
-}
-
-static OCEntityHandlerResult HandleDpairingPostRequest (const OCEntityHandlerRequest * ehRequest)
-{
- OIC_LOG (DEBUG, TAG, "Dpairing EntityHandle processing POST request");
- OCEntityHandlerResult ehRet = OC_EH_ERROR;
- OicSecDpairing_t* newDpair = NULL;
- OCStackResult res = OC_STACK_OK;
-
- const OicSecPconf_t *pconf = GetPconfResourceData();
- if (true == pconf->edp)
- {
- uint8_t *payload = ((OCSecurityPayload*)ehRequest->payload)->securityData;
- size_t size = ((OCSecurityPayload*)ehRequest->payload)->payloadSize;
- if (payload)
- {
- res = CBORPayloadToDpair(payload, size, &newDpair);
- }
- }
- else
- {
- OIC_LOG (DEBUG, TAG, "EDP == false : Direct-Pairing Disabled");
- ehRet = OC_EH_ERROR;
- }
-
- if (OC_STACK_OK == res && newDpair && false == IsPairedDevice(&newDpair->pdeviceID))
- {
- // Check if valid Post request
- bool prmMached = false;
- for (size_t i=0; i<pconf->prmLen; i++)
- {
- if (newDpair->spm == pconf->prm[i])
- {
- prmMached = true;
- break;
- }
- }
- OIC_LOG_V(DEBUG, TAG, "Parsed spm is %s", prmMached ? "valid" :
- "invalid, send error response");
-
- // Update local Dpairing with new Dpairing & prepare dtls session
- if (prmMached && '\0' != (char)newDpair->pdeviceID.id[0])
- {
- if(!gDpair)
- {
- gDpair = GetDpairingDefault();
- }
- gDpair->spm = newDpair->spm;
- memcpy(&gDpair->pdeviceID, &newDpair->pdeviceID, sizeof(OicUuid_t));
- memcpy(&gDpair->rownerID, &pconf->rownerID, sizeof(OicUuid_t));
-
-#if defined(__WITH_DTLS__) || defined(__WITH_TLS__)
- // Add temporary psk
- OCStackResult result;
- OicUuid_t subjectId = {.id={0}};
- result = AddTmpPskWithPIN(&gDpair->pdeviceID,
- SYMMETRIC_PAIR_WISE_KEY,
- (char*)pconf->pin.val, DP_PIN_LENGTH,
- &gDpair->rownerID, &subjectId);
- if(result != OC_STACK_OK ||
- memcmp(&gDpair->pdeviceID, &subjectId, sizeof(OicUuid_t)))
- {
- OIC_LOG_V(ERROR, TAG, "Failed to save the temporal PSK : %d", result);
- goto exit;
- }
-
- // Prepare to establish a secure channel with Pin-based PSK cipher suite
- if (CA_STATUS_OK != CAEnableAnonECDHCipherSuite(false) ||
- CA_STATUS_OK != CASelectCipherSuite(MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256, CA_ADAPTER_IP))
- {
- OIC_LOG_V(ERROR, TAG, "Failed to select TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA_256");
- goto exit;
- }
-
- if(CA_STATUS_OK != CAregisterSslHandshakeCallback(DPairingDTLSHandshakeCB))
- {
- OIC_LOG(WARNING, TAG, "DirectPairingHandler : Failed to register"
- " DTLS handshake callback.");
- goto exit;
- }
-#endif // __WITH_DTLS__ or __WITH_TLS__
-
- // should be lock /oic/sec/dpairing resource if Direct-Pairing starts normally ?
- OIC_LOG (DEBUG, TAG, "/oic/sec/dpairing resource created");
-
- ehRet = OC_EH_RESOURCE_CREATED;
- }
- else
- {
- OIC_LOG(ERROR, TAG, "Error in request check");
- }
- }
-
-
-#if defined(__WITH_DTLS__) || defined(__WITH_TLS__)
-exit:
-#endif // __WITH_DTLS__ or __WITH_TLS__
-
- // Send payload to request originator
- if(OC_STACK_OK != SendSRMResponse(ehRequest, ehRet, NULL, 0))
- {
- ehRet = OC_EH_ERROR;
- OIC_LOG (ERROR, TAG, "SendSRMResponse failed in HandleDpairingPostRequest");
- }
-
- if (OC_EH_ERROR == ehRet && gDpair)
- {
- RemoveCredential(&gDpair->pdeviceID);
- gDpair = NULL;
- }
-
- DeleteDpairingBinData(newDpair);
- OIC_LOG_V (DEBUG, TAG, "%s RetVal %d", __func__ , ehRet);
- return ehRet;
-}
-
-static OCEntityHandlerResult HandleDpairingPutRequest (const OCEntityHandlerRequest * ehRequest)
-{
- OIC_LOG (DEBUG, TAG, "Dpairing EntityHandle processing PUT request (Comfirmation)");
-
- OCEntityHandlerResult ehRet = OC_EH_ERROR;
- OicSecDpairing_t* newDpair = NULL;
- OCStackResult res = OC_STACK_OK;
-
- const OicSecPconf_t *pconf = GetPconfResourceData();
- if (true == pconf->edp)
- {
- uint8_t *payload = ((OCSecurityPayload*)ehRequest->payload)->securityData;
- size_t size = ((OCSecurityPayload*)ehRequest->payload)->payloadSize;
- if (payload)
- {
- res = CBORPayloadToDpair(payload, size, &newDpair);
- }
- }
- else
- {
- OIC_LOG (DEBUG, TAG, "EDP == false : Direct-Pairing Disabled");
- ehRet = OC_EH_ERROR;
- }
-
-
- if ((OC_STACK_OK == res) && gDpair && newDpair)
- {
- OIC_LOG(DEBUG, TAG, "Received direct-pairing finalization request");
-
- // Check if valid Put request
- VERIFY_SUCCESS(TAG, PRM_NOT_ALLOWED == newDpair->spm, ERROR);
-
- const OicSecPconf_t *secPconf = GetPconfResourceData();
- VERIFY_NOT_NULL(TAG, secPconf, ERROR);
-
-#if defined(__WITH_DTLS__) || defined(__WITH_TLS__)
- OCServerRequest * request = (OCServerRequest *)ehRequest->requestHandle;
- VERIFY_SUCCESS(TAG, (request->devAddr.flags | OC_FLAG_SECURE), ERROR);
-
- //Generate new credential
- OIC_LOG_V(INFO, TAG, "SavePairingPSK for %s(%d)", request->devAddr.addr,
- request->devAddr.port);
- OCStackResult result = SavePairingPSK(&request->devAddr, &newDpair->pdeviceID,
- (OicUuid_t *)&secPconf->rownerID, true);
- VERIFY_SUCCESS(TAG, OC_STACK_OK == result, ERROR);
-#endif // __WITH_DTLS__ or __WITH_TLS__
-
- //Generate new acl
- OicSecPdAcl_t *pdAcl;
- LL_FOREACH(secPconf->pdacls, pdAcl)
- {
- OicSecAcl_t* acl = (OicSecAcl_t*)OICCalloc(1, sizeof(OicSecAcl_t));
- VERIFY_NOT_NULL(TAG, acl, ERROR);
-
- OicSecAce_t* ace = (OicSecAce_t*)OICCalloc(1, sizeof(OicSecAce_t));
- VERIFY_NOT_NULL(TAG, ace, ERROR);
-
- LL_APPEND(acl->aces, ace);
-
- ace->subjectType = OicSecAceUuidSubject;
- memcpy(&ace->subjectuuid, &gDpair->pdeviceID, sizeof(OicUuid_t));
-
- for(size_t i = 0; i < pdAcl->resourcesLen; i++)
- {
- OicSecRsrc_t* rsrc = (OicSecRsrc_t*)OICCalloc(1, sizeof(OicSecRsrc_t));
- VERIFY_NOT_NULL(TAG, rsrc, ERROR);
- LL_APPEND(ace->resources, rsrc);
-
- //href
- rsrc->href = OICStrdup(pdAcl->resources[i]);
-
- // TODO: Append 'if' and 'rt' as workaround
- // if
- rsrc->interfaceLen = 1;
- rsrc->interfaces = (char**)OICCalloc(rsrc->interfaceLen, sizeof(char));
- VERIFY_NOT_NULL(TAG, (rsrc->interfaces), ERROR);
- rsrc->interfaces[0] = OICStrdup(OC_RSRVD_INTERFACE_DEFAULT);
- VERIFY_NOT_NULL(TAG, (rsrc->interfaces[0]), ERROR);
-
- //rt
- rsrc->typeLen = 1;
- rsrc->types = (char**)OICCalloc(rsrc->typeLen, sizeof(char));
- VERIFY_NOT_NULL(TAG, (rsrc->types), ERROR);
- rsrc->types[0] = OICStrdup("oic.core");
- VERIFY_NOT_NULL(TAG, (rsrc->types[0]), ERROR);
- }
-
- ace->permission = pdAcl->permission;
-
- //Copy the validity
- if(pdAcl->periods || pdAcl->recurrences)
- {
- OicSecValidity_t* validity = (OicSecValidity_t*)OICCalloc(1, sizeof(OicSecValidity_t));
- VERIFY_NOT_NULL(TAG, validity, ERROR);
-
- if(pdAcl->periods && pdAcl->periods[0])
- {
- validity->period = OICStrdup(pdAcl->periods[0]);
- VERIFY_NOT_NULL(TAG, (validity->period), ERROR);
- }
-
- if(pdAcl->recurrences && 0 < pdAcl->prdRecrLen)
- {
- validity->recurrenceLen = pdAcl->prdRecrLen;
- validity->recurrences = (char**)OICMalloc(sizeof(char*) * pdAcl->prdRecrLen);
- VERIFY_NOT_NULL(TAG, (validity->recurrences), ERROR);
-
- for(size_t i = 0; i < pdAcl->prdRecrLen; i++)
- {
- validity->recurrences[i] = OICStrdup(pdAcl->recurrences[i]);
- VERIFY_NOT_NULL(TAG, (validity->recurrences[i]), ERROR);
- }
- }
-
- LL_APPEND(ace->validities, validity);
- }
-
- size_t size = 0;
- uint8_t *payload = NULL;
- // TODO IOT-2052 update to /acl2
- if (OC_STACK_OK == AclToCBORPayload(acl, OIC_SEC_ACL_V1, &payload, &size))
- {
- AppendACL(payload, size);
- OICFree(payload);
- }
- DeleteACLList(acl);
- }
-
- //update pconf device list
- AddPairedDevice(&newDpair->pdeviceID);
-
- //Initialize dpairing resource
- gDpair = NULL;
-
- OIC_LOG (DEBUG, TAG, "/oic/sec/dpairing resource updated,"
- "direct-pairing finalization success");
- ehRet = OC_EH_OK;
- }
-
-exit:
-
- //Send payload to request originator
- if(OC_STACK_OK != SendSRMResponse(ehRequest, ehRet, NULL, 0))
- {
- ehRet = OC_EH_ERROR;
- OIC_LOG (ERROR, TAG, "SendSRMResponse failed in HandleDpairingPutRequest");
- }
-
- DeleteDpairingBinData(newDpair);
- OIC_LOG_V (DEBUG, TAG, "%s RetVal %d", __func__ , ehRet);
- return ehRet;
-}
-/*
- * This internal method is the entity handler for Dpairing resources and
- * will handle REST request (GET/POST) for them.
- */
-OCEntityHandlerResult DpairingEntityHandler (OCEntityHandlerFlag flag,
- OCEntityHandlerRequest * ehRequest,
- void* callbackParameter)
-{
- OIC_LOG(DEBUG, TAG, "Received request DpairingEntityHandler");
- (void)callbackParameter;
- OCEntityHandlerResult ehRet = OC_EH_ERROR;
-
- if (!ehRequest)
- {
- return ehRet;
- }
-
- if (flag & OC_REQUEST_FLAG)
- {
- OIC_LOG (DEBUG, TAG, "Flag includes OC_REQUEST_FLAG");
- switch (ehRequest->method)
- {
- case OC_REST_GET:
- break;
-
- case OC_REST_POST:
- ehRet = HandleDpairingPostRequest(ehRequest);
- break;
-
- case OC_REST_PUT:
- ehRet = HandleDpairingPutRequest(ehRequest);
- break;
-
- case OC_REST_DELETE:
- break;
-
- default:
- ehRet = OC_EH_ERROR;
- SendSRMResponse(ehRequest, ehRet, NULL, 0);
- }
- }
-
- return ehRet;
-}
-
-/*
- * This internal method is used to create '/oic/sec/dpairing' resource.
- */
-OCStackResult CreateDpairingResource()
-{
- OCStackResult ret;
-
- ret = OCCreateResource(&gDpairHandle,
- OIC_RSRC_TYPE_SEC_DPAIRING,
- OC_RSRVD_INTERFACE_DEFAULT,
- OIC_RSRC_DPAIRING_URI,
- DpairingEntityHandler,
- NULL,
- OC_SECURE | OC_EXPLICIT_DISCOVERABLE);
-
- if (OC_STACK_OK != ret)
- {
- OIC_LOG (ERROR, TAG, "Unable to instantiate Dpairing resource");
- DeInitDpairingResource();
- }
- return ret;
-}
-
-/**
- * Initialize Dpairing resource by loading data from persistent storage.
- *
- * @retval OC_STACK_OK for Success, otherwise some error value
- */
-OCStackResult InitDpairingResource()
-{
- OCStackResult ret = OC_STACK_ERROR;
-
- // Instantiate 'oic.sec.dpairing'
- ret = CreateDpairingResource();
- if (OC_STACK_OK != ret)
- {
- DeInitDpairingResource();
- }
- return ret;
-}
-
-/**
- * Perform cleanup for Dpairing resources.
- *
- * @return
- * OC_STACK_OK - no error
- * OC_STACK_ERROR - stack process error
- *
- */
-OCStackResult DeInitDpairingResource()
-{
- OCStackResult ret = OCDeleteResource(gDpairHandle);
- gDpair = NULL;
-
- if(OC_STACK_OK == ret)
- {
- return OC_STACK_OK;
- }
- else
- {
- return OC_STACK_ERROR;
- }
-}
-
-OCStackResult SetDpairingRownerId(const OicUuid_t* newROwner)
-{
- OCStackResult ret = OC_STACK_ERROR;
- uint8_t *cborPayload = NULL;
- size_t size = 0;
- OicUuid_t prevId = {.id={0}};
-
- if(NULL == newROwner)
- {
- ret = OC_STACK_INVALID_PARAM;
- }
- if(NULL == gDpair)
- {
- ret = OC_STACK_NO_RESOURCE;
- }
-
- if(newROwner && gDpair)
- {
- memcpy(prevId.id, gDpair->rownerID.id, sizeof(prevId.id));
- memcpy(gDpair->rownerID.id, newROwner->id, sizeof(newROwner->id));
-
- ret = DpairingToCBORPayload(gDpair, &cborPayload, &size);
- VERIFY_SUCCESS(TAG, OC_STACK_OK == ret, ERROR);
-
- ret = UpdateSecureResourceInPS(OIC_JSON_DPAIRING_NAME, cborPayload, size);
- VERIFY_SUCCESS(TAG, OC_STACK_OK == ret, ERROR);
-
- OICFree(cborPayload);
- }
-
- return ret;
-
-exit:
- OICFree(cborPayload);
- memcpy(gDpair->rownerID.id, prevId.id, sizeof(prevId.id));
- return ret;
-}
-
-OCStackResult GetDpairingRownerId(OicUuid_t *rowneruuid)
-{
- OCStackResult retVal = OC_STACK_ERROR;
- if (gDpair)
- {
- *rowneruuid = gDpair->rownerID;
- retVal = OC_STACK_OK;
- }
- return retVal;
-}
+++ /dev/null
-/* *****************************************************************
- *
- * Copyright 2016 Samsung Electronics All Rights Reserved.
- *
- *
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * *****************************************************************/
-
-#include "iotivity_config.h"
-#include <stdlib.h>
-#include <string.h>
-#include "ocstack.h"
-#include "logger.h"
-#include "oic_malloc.h"
-#include "oic_string.h"
-#include "base64.h"
-#include "ocpayload.h"
-#include "ocpayloadcbor.h"
-#include "payload_logging.h"
-#include "resourcemanager.h"
-#include "pconfresource.h"
-#include "psinterface.h"
-#include "utlist.h"
-#include "srmresourcestrings.h"
-#include "doxmresource.h"
-#include "srmutility.h"
-#include "ocserverrequest.h"
-#include "psinterface.h"
-#include "security_internals.h"
-#ifdef HAVE_STRINGS_H
-#include <strings.h>
-#endif
-
-#define TAG "OIC_SRM_PCONF"
-
-static const uint16_t CBOR_SIZE = 1024;
-static const uint64_t CBOR_MAX_SIZE = 4400;
-static const uint8_t PCONF_MAP_SIZE = 4;
-static const uint8_t PCONF_RESOURCE_MAP_SIZE = 4;
-
-static OicSecPconf_t *gPconf = NULL;
-static OCResourceHandle gPconfHandle = NULL;
-static OicSecPconf_t gDefaultPconf =
-{
- false, /* bool edp */
- NULL, /* OicSecPrm *prm */
- 0, /* size_t prmLen */
- {.val = {0}}, /* OicDpPin_t pin */
- NULL, /* OicSecPdAcl_t *pdacls */
- NULL, /* OicUuid_t *pddevs */
- 0, /* size_t pddevLen */
- {.id = {0}}, /* OicUuid_t deviceID */
- {.id = {0}}, /* OicUuid_t rowner */
-};
-
-/**
- * This function frees OicSecPdAcl_t object's fields and object itself.
- */
-void FreePdAclList(OicSecPdAcl_t* pdacls)
-{
- if (pdacls)
- {
- size_t i = 0;
-
- //Clean pdacl objecs
- OicSecPdAcl_t *aclTmp1 = NULL;
- OicSecPdAcl_t *aclTmp2 = NULL;
- LL_FOREACH_SAFE(pdacls, aclTmp1, aclTmp2)
- {
- LL_DELETE(pdacls, aclTmp1);
-
- // Clean Resources
- for (i = 0; i < aclTmp1->resourcesLen; i++)
- {
- OICFree(aclTmp1->resources[i]);
- }
- OICFree(aclTmp1->resources);
-
- //Clean Period
- if(aclTmp1->periods)
- {
- for(i = 0; i < aclTmp1->prdRecrLen; i++)
- {
- OICFree(aclTmp1->periods[i]);
- }
- OICFree(aclTmp1->periods);
- }
-
- //Clean Recurrence
- if(aclTmp1->recurrences)
- {
- for(i = 0; i < aclTmp1->prdRecrLen; i++)
- {
- OICFree(aclTmp1->recurrences[i]);
- }
- OICFree(aclTmp1->recurrences);
- }
- }
-
- //Clean pconf itself
- OICFree(pdacls);
- }
-}
-
-void DeletePconfBinData(OicSecPconf_t* pconf)
-{
- if (pconf)
- {
- //Clean prm
- OICFree(pconf->prm);
-
- //Clean pdacl
- if (pconf->pdacls)
- {
- FreePdAclList(pconf->pdacls);
- }
-
- //Clean pddev
- OICFree(pconf->pddevs);
-
- //Clean pconf itself
- OICFree(pconf);
- }
-}
-
-static size_t OicPdAclSize(const OicSecPdAcl_t *pdAcl)
-{
- if (!pdAcl)
- {
- return 0;
- }
-
- OicSecPdAcl_t *tmp = (OicSecPdAcl_t *)pdAcl;
- size_t size = 0;
- while (tmp)
- {
- size++;
- tmp = tmp->next;
- }
- return size;
-}
-
-OCStackResult PconfToCBORPayload(const OicSecPconf_t *pconf,uint8_t **payload,size_t *size)
-{
- if (NULL == pconf || NULL == payload || NULL != *payload || NULL == size)
- {
- return OC_STACK_INVALID_PARAM;
- }
- size_t cborLen = *size;
- if(0 == cborLen)
- {
- cborLen = CBOR_SIZE;
- }
- *payload = NULL;
-
- OCStackResult ret = OC_STACK_ERROR;
- CborEncoder encoder;
- CborEncoder pconfMap;
-
- int64_t cborEncoderResult = CborNoError;
- uint8_t mapSize = PCONF_MAP_SIZE;
-
- if (pconf->prmLen > 0)
- {
- mapSize++;
- }
- if (pconf->pdacls)
- {
- mapSize++;
- }
- if (pconf->pddevs)
- {
- mapSize++;
- }
-
- uint8_t *outPayload = (uint8_t *)OICCalloc(1, cborLen);
- VERIFY_NOT_NULL_RETURN(TAG, outPayload, ERROR, OC_STACK_ERROR);
-
- cbor_encoder_init(&encoder, outPayload, cborLen, 0);
- cborEncoderResult = cbor_encoder_create_map(&encoder, &pconfMap, mapSize);
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed Creating Pconf Map.");
-
- //edp -- Mandatory
- cborEncoderResult = cbor_encode_text_string(&pconfMap, OIC_JSON_EDP_NAME,
- strlen(OIC_JSON_EDP_NAME));
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed Encode EDP String.");
- cborEncoderResult = cbor_encode_boolean(&pconfMap, pconf->edp);
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed Convert PconfEDP value");
-
- //PRM type -- Not Mandatory
- if(pconf->prmLen > 0)
- {
- CborEncoder prm;
- cborEncoderResult = cbor_encode_text_string(&pconfMap, OIC_JSON_PRM_NAME,
- strlen(OIC_JSON_PRM_NAME));
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed Convert Pconf PRM NAME");
- cborEncoderResult = cbor_encoder_create_array(&pconfMap, &prm, pconf->prmLen);
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed Convert Pconf PRM value");
-
- for (size_t i = 0; i < pconf->prmLen; i++)
- {
- cborEncoderResult = cbor_encode_int(&prm, pconf->prm[i]);
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed Convert Pconf PRM Array");
- }
- cborEncoderResult = cbor_encoder_close_container(&pconfMap, &prm);
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to close encode array");
- }
-
- //PIN -- Mandatory
- cborEncoderResult = cbor_encode_text_string(&pconfMap, OIC_JSON_PIN_NAME,
- strlen(OIC_JSON_PIN_NAME));
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to create OIC_JSON_PIN_NAME");
- cborEncoderResult = cbor_encode_byte_string(&pconfMap, pconf->pin.val, sizeof(pconf->pin.val));
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to convert pin value");
-
- //PDACL -- Mandatory
- if (pconf->pdacls)
- {
- OicSecPdAcl_t *pdacl = pconf->pdacls;
- CborEncoder pdAclArray;
- cborEncoderResult = cbor_encode_text_string(&pconfMap, OIC_JSON_PDACL_NAME,
- strlen(OIC_JSON_PDACL_NAME));
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to create OIC_JSON_PDACL_NAME");
- cborEncoderResult = cbor_encoder_create_array(&pconfMap, &pdAclArray,
- OicPdAclSize(pconf->pdacls));
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to creeate _pdacl array");
-
- while(pdacl)
- {
- CborEncoder pdAclMap;
- // PDACL Map size - Number of mandatory items
- uint8_t aclMapSize = 2;
-
- if (pdacl->prdRecrLen)
- {
- ++aclMapSize;
- }
- if (pdacl->recurrences)
- {
- ++aclMapSize;
- }
-
- cborEncoderResult = cbor_encoder_create_map(&pdAclArray, &pdAclMap, aclMapSize);
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to creeate _pdacl array");
-
- // Resources -- Mandatory
- cborEncoderResult = cbor_encode_text_string(&pdAclMap, OIC_JSON_RESOURCES_NAME,
- strlen(OIC_JSON_RESOURCES_NAME));
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to encode resource result");
-
- CborEncoder resources;
- cborEncoderResult = cbor_encoder_create_array(&pdAclMap, &resources,
- pdacl->resourcesLen);
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to create resource array");
-
- for (size_t i = 0; i < pdacl->resourcesLen; i++)
- {
- CborEncoder rMap;
- cborEncoderResult = cbor_encoder_create_map(&resources, &rMap,
- PCONF_RESOURCE_MAP_SIZE);
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed Addding Resource Map.");
-
- cborEncoderResult = cbor_encode_text_string(&rMap, OIC_JSON_HREF_NAME,
- strlen(OIC_JSON_HREF_NAME));
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed Addding HREF Name Tag.");
- cborEncoderResult = cbor_encode_text_string(&rMap, pdacl->resources[i],
- strlen(pdacl->resources[i]));
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed Addding HREF Value in Map.");
-
- cborEncoderResult = cbor_encode_text_string(&rMap, OIC_JSON_REL_NAME,
- strlen(OIC_JSON_REL_NAME));
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed Addding REL Name Tag.");
-
- // TODO : Need to assign real value of REL
- cborEncoderResult = cbor_encode_text_string(&rMap, OIC_JSON_EMPTY_STRING,
- strlen(OIC_JSON_EMPTY_STRING));
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed Addding REL Value.");
-
- cborEncoderResult = cbor_encode_text_string(&rMap, OIC_JSON_RT_NAME,
- strlen(OIC_JSON_RT_NAME));
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed Addding RT Name Tag.");
-
- // TODO : Need to assign real value of RT
- cborEncoderResult = cbor_encode_text_string(&rMap, OIC_JSON_EMPTY_STRING,
- strlen(OIC_JSON_EMPTY_STRING));
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed Addding RT Value.");
-
- cborEncoderResult = cbor_encode_text_string(&rMap, OIC_JSON_IF_NAME,
- strlen(OIC_JSON_IF_NAME));
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed Addding IF Name Tag.");
-
- // TODO : Need to assign real value of IF
- cborEncoderResult = cbor_encode_text_string(&rMap, OIC_JSON_EMPTY_STRING,
- strlen(OIC_JSON_EMPTY_STRING));
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed Addding IF Value.");
-
- cborEncoderResult = cbor_encoder_close_container(&resources, &rMap);
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed Closing Resource Map.");
- }
-
- cborEncoderResult = cbor_encoder_close_container(&pdAclMap, &resources);
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to close resource array");
-
- // Permissions -- Mandatory
- cborEncoderResult = cbor_encode_text_string(&pdAclMap, OIC_JSON_PERMISSION_NAME,
- strlen(OIC_JSON_PERMISSION_NAME));
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to create permition string");
- cborEncoderResult = cbor_encode_int(&pdAclMap, pdacl->permission);
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to encode permition calue");
-
- // Period -- Not Mandatory
- if (pdacl->periods)
- {
- CborEncoder period;
- cborEncoderResult = cbor_encode_text_string(&pdAclMap, OIC_JSON_PERIODS_NAME,
- strlen(OIC_JSON_PERIODS_NAME));
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to encode period value");
- cborEncoderResult = cbor_encoder_create_array(&pdAclMap, &period,
- pdacl->prdRecrLen);
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to create array");
-
- for (size_t i = 0; i < pdacl->prdRecrLen; i++)
- {
- cborEncoderResult = cbor_encode_text_string(&period, pdacl->periods[i],
- strlen(pdacl->periods[i]));
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to encode period");
- }
- cborEncoderResult = cbor_encoder_close_container(&pdAclMap, &period);
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult,"Failed to close period array");
- }
-
- // Period -- Not Mandatory
- if(0 != pdacl->prdRecrLen && pdacl->recurrences)
- {
- CborEncoder recurrences;
- cborEncoderResult = cbor_encode_text_string(&pdAclMap, OIC_JSON_RECURRENCES_NAME,
- strlen(OIC_JSON_RECURRENCES_NAME));
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult,"Failed to encode recurrences");
- cborEncoderResult = cbor_encoder_create_array(&pdAclMap, &recurrences,
- pdacl->prdRecrLen);
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to create rec array");
-
- for (size_t i = 0; i < pdacl->prdRecrLen; i++)
- {
- cborEncoderResult = cbor_encode_text_string(&recurrences,
- pdacl->recurrences[i], strlen(pdacl->recurrences[i]));
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to encode recurrences");
- }
- cborEncoderResult = cbor_encoder_close_container(&pdAclMap, &recurrences);
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to close rec array");
- }
- cborEncoderResult = cbor_encoder_close_container(&pdAclArray, &pdAclMap);
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to close acl map");
-
- pdacl = pdacl->next;
- }
- //clsoe the array
- cborEncoderResult = cbor_encoder_close_container(&pconfMap, &pdAclArray);
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to close acl array");
- }
-
- //PDDev -- Mandatory
- //There may not be paired devices if it did not pairing before
- if (pconf->pddevs && 0 < pconf->pddevLen)
- {
- CborEncoder pddev;
- cborEncoderResult = cbor_encode_text_string(&pconfMap, OIC_JSON_PDDEV_LIST_NAME,
- strlen(OIC_JSON_PDDEV_LIST_NAME));
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to encode pddev");
- cborEncoderResult = cbor_encoder_create_array(&pconfMap, &pddev, pconf->pddevLen);
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to create array");
-
- for (size_t i = 0; i < pconf->pddevLen; i++)
- {
- char *pddevId = NULL;
- ret = ConvertUuidToStr(&pconf->pddevs[i], &pddevId);
- VERIFY_SUCCESS(TAG, ret == OC_STACK_OK, ERROR);
- cborEncoderResult = cbor_encode_text_string(&pddev, pddevId, strlen(pddevId));
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed Addding pddev Id Value.");
- OICFree(pddevId);
- }
- cborEncoderResult = cbor_encoder_close_container(&pconfMap, &pddev);
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to close pddev array");
- }
-
- //DeviceId -- Mandatory
- //There may not be devicd id if caller is provisoning tool
- cborEncoderResult = cbor_encode_text_string(&pconfMap, OIC_JSON_DEVICE_ID_NAME,
- strlen(OIC_JSON_DEVICE_ID_NAME));
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to encode device id");
- {
- char *deviceId = NULL;
- ret = ConvertUuidToStr(&pconf->deviceID, &deviceId);
- VERIFY_SUCCESS(TAG, ret == OC_STACK_OK, ERROR);
- cborEncoderResult = cbor_encode_text_string(&pconfMap, deviceId, strlen(deviceId));
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to encode deviceID value");
- OICFree(deviceId);
- }
-
- //ROwner -- Mandatory
- {
- char *rowner = NULL;
- cborEncoderResult = cbor_encode_text_string(&pconfMap, OIC_JSON_ROWNERID_NAME,
- strlen(OIC_JSON_ROWNERID_NAME));
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to encode rowner string");
- ret = ConvertUuidToStr(&pconf->rownerID, &rowner);
- VERIFY_SUCCESS(TAG, ret == OC_STACK_OK, ERROR);
- cborEncoderResult = cbor_encode_text_string(&pconfMap, rowner, strlen(rowner));
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to encode rwoner value");
- OICFree(rowner);
- }
-
- cborEncoderResult = cbor_encoder_close_container(&encoder, &pconfMap);
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to close pconfMap");
-
- *size = cbor_encoder_get_buffer_size(&encoder, outPayload);
- *payload = outPayload;
- ret = OC_STACK_OK;
-exit:
- if ((CborErrorOutOfMemory == cborEncoderResult) && (cborLen < CBOR_MAX_SIZE))
- {
- // reallocate and try again!
- OICFree(outPayload);
- // Since the allocated initial memory failed, double the memory.
- cborLen += cbor_encoder_get_buffer_size(&encoder, encoder.end);
- cborEncoderResult = CborNoError;
- ret = PconfToCBORPayload(pconf, payload, &cborLen);
- *size = cborLen;
- }
- if ((CborNoError != cborEncoderResult) || (OC_STACK_OK != ret))
- {
- OICFree(outPayload);
- outPayload = NULL;
- *payload = NULL;
- *size = 0;
- ret = OC_STACK_ERROR;
- }
- return ret;
-}
-
-OCStackResult CBORPayloadToPconf(const uint8_t *cborPayload, size_t size, OicSecPconf_t **secPconf)
-{
- if (NULL == cborPayload || NULL == secPconf || NULL != *secPconf || 0 == size)
- {
- return OC_STACK_INVALID_PARAM;
- }
- OCStackResult ret = OC_STACK_ERROR;
- *secPconf = NULL;
- CborValue pconfCbor = { .parser = NULL };
- CborParser parser = { .end = NULL };
- CborError cborFindResult = CborNoError;
-
- cbor_parser_init(cborPayload, size, 0, &parser, &pconfCbor);
- CborValue pconfMap = { .parser = NULL } ;
- OicSecPconf_t *pconf = NULL;
- cborFindResult = cbor_value_enter_container(&pconfCbor, &pconfMap);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed to enter map");
- pconf = (OicSecPconf_t *)OICCalloc(1, sizeof(*pconf));
- VERIFY_NOT_NULL(TAG, pconf, ERROR);
- while (cbor_value_is_valid(&pconfMap))
- {
- char *name = NULL;
- size_t len = 0;
- CborType type = cbor_value_get_type(&pconfMap);
- if (type == CborTextStringType && cbor_value_is_text_string(&pconfMap))
- {
- cborFindResult = cbor_value_dup_text_string(&pconfMap, &name, &len, NULL);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed to get value");
- cborFindResult = cbor_value_advance(&pconfMap);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed to advance value");
- }
-
- if (name)
- {
- //EDP -- Mandatory
- if(0 == strcmp(OIC_JSON_EDP_NAME, name) && cbor_value_is_boolean(&pconfMap))
- {
- cborFindResult = cbor_value_get_boolean(&pconfMap, &pconf->edp);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed to get value");
- }
- if (0 == strcmp(OIC_JSON_PRM_NAME, name))
- {
- int i = 0;
- CborValue prm = { .parser = NULL };
- cborFindResult = cbor_value_get_array_length(&pconfMap, &pconf->prmLen);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed to get length");
- VERIFY_SUCCESS(TAG, pconf->prmLen != 0, ERROR);
-
- pconf->prm = (OicSecPrm_t *)OICCalloc(pconf->prmLen, sizeof(OicSecPrm_t));
- VERIFY_NOT_NULL(TAG, pconf->prm, ERROR);
- cborFindResult = cbor_value_enter_container(&pconfMap, &prm);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed to eneter array");
-
- while (cbor_value_is_valid(&prm) && cbor_value_is_integer(&prm))
- {
- int prm_val;
-
- cborFindResult = cbor_value_get_int(&prm, &prm_val);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed to get value");
- pconf->prm[i++] = (OicSecPrm_t)prm_val;
- cborFindResult = cbor_value_advance(&prm);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed to advance value");
- }
- }
- //PIN -- Mandatory
- if (0 == strcmp(OIC_JSON_PIN_NAME, name) && cbor_value_is_byte_string(&pconfMap))
- {
- uint8_t *pin = NULL;
- cborFindResult = cbor_value_dup_byte_string(&pconfMap, &pin, &len, NULL);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed to get value");
- if (sizeof(pconf->pin.val) < len)
- {
- OIC_LOG (ERROR, TAG, "PIN length is too long");
- goto exit;
- }
- memcpy(pconf->pin.val, pin, len);
- OICFree(pin);
- }
-
- //PDACL -- Mandatory
- if (0 == strcmp(OIC_JSON_PDACL_NAME, name))
- {
- CborValue pdAclArray = { .parser = NULL};
- OicSecPdAcl_t *headPdacl = NULL;
-
- cborFindResult = cbor_value_enter_container(&pconfMap, &pdAclArray);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed to enter");
-
- while (cbor_value_is_valid(&pdAclArray))
- {
- CborValue pdAclMap = { .parser = NULL };
- OicSecPdAcl_t *pdacl = (OicSecPdAcl_t *) OICCalloc(1, sizeof(OicSecPdAcl_t));
- VERIFY_NOT_NULL(TAG, pdacl, ERROR);
-
- cborFindResult = cbor_value_enter_container(&pdAclArray, &pdAclMap);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed to enter");
-
- while (cbor_value_is_valid(&pdAclMap))
- {
- char* pdAclMapName = NULL;
- size_t tempLen = 0;
- CborType pdAclMapType = cbor_value_get_type(&pdAclMap);
- if ((pdAclMapType == CborTextStringType) && cbor_value_is_text_string(&pdAclMap))
- {
- cborFindResult = cbor_value_dup_text_string(&pdAclMap, &pdAclMapName,
- &tempLen, NULL);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed to get text");
- cborFindResult = cbor_value_advance(&pdAclMap);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed to advance value");
- }
- if (pdAclMapName)
- {
- // Resources -- Mandatory
- if (strcmp(pdAclMapName, OIC_JSON_RESOURCES_NAME) == 0 && cbor_value_is_array(&pdAclMap))
- {
- int i = 0;
- CborValue resources = { .parser = NULL };
- cborFindResult = cbor_value_get_array_length(&pdAclMap,
- &pdacl->resourcesLen);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed to get length");
- cborFindResult = cbor_value_enter_container(&pdAclMap, &resources);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed to enter");
- pdacl->resources = (char **) OICCalloc(pdacl->resourcesLen,
- sizeof(char*));
- VERIFY_NOT_NULL(TAG, pdacl->resources, ERROR);
-
- while (cbor_value_is_valid(&resources))
- {
- CborValue rMap = { .parser = NULL };
- cborFindResult = cbor_value_enter_container(&resources, &rMap);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed Entering Resource Map");
-
- while(cbor_value_is_valid(&rMap) && cbor_value_is_text_string(&rMap))
- {
- char *rMapName = NULL;
- size_t rMapNameLen = 0;
- cborFindResult = cbor_value_dup_text_string(&rMap, &rMapName, &rMapNameLen, NULL);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed Finding RMap Data Name Tag.");
- cborFindResult = cbor_value_advance(&rMap);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed Finding RMap Data Value.");
-
- // "href"
- if (0 == strcmp(OIC_JSON_HREF_NAME, rMapName))
- {
- // TODO : Need to check data structure of OicSecPdAcl_t based on RAML spec.
- cborFindResult = cbor_value_dup_text_string(&rMap, &pdacl->resources[i++], &tempLen, NULL);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed Finding Href Value.");
- }
-
- // "rel"
- if (0 == strcmp(OIC_JSON_REL_NAME, rMapName))
- {
- // TODO : Need to check data structure of OicSecPdAcl_t and assign based on RAML spec.
- char *relData = NULL;
- cborFindResult = cbor_value_dup_text_string(&rMap, &relData, &len, NULL);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed Finding REL Value.");
- OICFree(relData);
- }
-
- // "rt"
- if (0 == strcmp(OIC_JSON_RT_NAME, rMapName))
- {
- // TODO : Need to check data structure of OicSecPdAcl_t and assign based on RAML spec.
- char *rtData = NULL;
- cborFindResult = cbor_value_dup_text_string(&rMap, &rtData, &tempLen, NULL);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed Finding RT Value.");
- OICFree(rtData);
- }
-
- // "if"
- if (0 == strcmp(OIC_JSON_IF_NAME, rMapName))
- {
- // TODO : Need to check data structure of OicSecPdAcl_t and assign based on RAML spec.
- char *ifData = NULL;
- cborFindResult = cbor_value_dup_text_string(&rMap, &ifData, &tempLen, NULL);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed Finding IF Value.");
- OICFree(ifData);
- }
-
- if (cbor_value_is_valid(&rMap))
- {
- cborFindResult = cbor_value_advance(&rMap);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed Advancing Rlist Map.");
- }
- OICFree(rMapName);
- }
-
- if (cbor_value_is_valid(&resources))
- {
- cborFindResult = cbor_value_advance(&resources);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed to advance");
- }
- }
- }
-
- // Permissions -- Mandatory
- if (strcmp(pdAclMapName, OIC_JSON_PERMISSION_NAME) == 0 && cbor_value_is_unsigned_integer(&pdAclMap))
- {
- uint64_t permission = 0;
- cborFindResult = cbor_value_get_uint64(&pdAclMap, &permission);
- pdacl->permission = (uint16_t)permission;
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed to get value");
- }
-
- // Period -- Not mandatory
- if (strcmp(pdAclMapName, OIC_JSON_PERIODS_NAME) == 0 && cbor_value_is_array(&pdAclMap))
- {
- int i = 0;
- CborValue period = { .parser = NULL };
- cborFindResult = cbor_value_get_array_length(&pdAclMap,
- &pdacl->prdRecrLen);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed to get length");
- cborFindResult = cbor_value_enter_container(&pdAclMap, &period);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed to enter");
- pdacl->periods = (char **) OICCalloc(pdacl->prdRecrLen, sizeof(char*));
- VERIFY_NOT_NULL(TAG, pdacl->periods, ERROR);
-
- while (cbor_value_is_text_string(&period) && cbor_value_is_text_string(&period))
- {
- cborFindResult = cbor_value_dup_text_string(&period,
- &pdacl->periods[i++], &tempLen, NULL);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed to get text");
- cborFindResult = cbor_value_advance(&period);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed to advance");
- pdacl->prdRecrLen++;
- }
- }
-
- // Recurrence -- Not mandatory
- if (strcmp(pdAclMapName, OIC_JSON_RECURRENCES_NAME) == 0 && cbor_value_is_array(&pdAclMap))
- {
- int i = 0;
- CborValue recurrences = { .parser = NULL };
- cborFindResult = cbor_value_get_array_length(&pdAclMap, &pdacl->prdRecrLen);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed to get length");
- cborFindResult = cbor_value_enter_container(&pdAclMap, &recurrences);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed to enter");
- pdacl->recurrences = (char **) OICCalloc(pdacl->prdRecrLen, sizeof(char*));
- VERIFY_NOT_NULL(TAG, pdacl->recurrences, ERROR);
-
- while (cbor_value_is_text_string(&recurrences) && cbor_value_is_text_string(&recurrences))
- {
- cborFindResult = cbor_value_dup_text_string(&recurrences,
- &pdacl->recurrences[i++], &tempLen, NULL);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed to get value");
- cborFindResult = cbor_value_advance(&recurrences);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed to advance");
- }
- }
- if (pdAclMapType != CborMapType && cbor_value_is_valid(&pdAclMap))
- {
- cborFindResult = cbor_value_advance(&pdAclMap);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed to advance");
- }
- }
- if (cbor_value_is_valid(&pdAclArray))
- {
- cborFindResult = cbor_value_advance(&pdAclArray);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed to advance");
- }
- OICFree(pdAclMapName);
- pdAclMapName = NULL;
- }
- pdacl->next = NULL;
- if (headPdacl == NULL)
- {
- headPdacl = pdacl;
- }
- else
- {
- OicSecPdAcl_t *temp = headPdacl;
- while (temp->next)
- {
- temp = temp->next;
- }
- temp->next = pdacl;
- }
- }
- pconf->pdacls = headPdacl;
- }
-
- //PDDev -- Mandatory
- if (strcmp(name, OIC_JSON_PDDEV_LIST_NAME) == 0 && cbor_value_is_array(&pconfMap))
- {
- int i = 0;
- CborValue pddevs = { .parser = NULL };
- cborFindResult = cbor_value_get_array_length(&pconfMap, &pconf->pddevLen);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed to get length");
- cborFindResult = cbor_value_enter_container(&pconfMap, &pddevs);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed to enter");
-
- pconf->pddevs = (OicUuid_t *)OICMalloc(pconf->pddevLen * sizeof(OicUuid_t));
- VERIFY_NOT_NULL(TAG, pconf->pddevs, ERROR);
- while (cbor_value_is_valid(&pddevs) && cbor_value_is_text_string(&pddevs))
- {
- char *pddev = NULL;
- cborFindResult = cbor_value_dup_text_string(&pddevs, &pddev, &len, NULL);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed to get value");
- cborFindResult = cbor_value_advance(&pddevs);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed to advance");
- ret = ConvertStrToUuid(pddev, &pconf->pddevs[i++]);
- VERIFY_SUCCESS(TAG, ret == OC_STACK_OK, ERROR);
- OICFree(pddev);
- }
- }
-
- //Mandatory - Device Id
- if (0 == strcmp(OIC_JSON_DEVICE_ID_NAME, name) && cbor_value_is_text_string(&pconfMap))
- {
- char *deviceId = NULL;
- cborFindResult = cbor_value_dup_text_string(&pconfMap, &deviceId, &len, NULL);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed to get deviceID");
- ret = ConvertStrToUuid(deviceId, &pconf->deviceID);
- VERIFY_SUCCESS(TAG, ret == OC_STACK_OK, ERROR);
- OICFree(deviceId);
- }
-
- // ROwner -- Mandatory
- if (0 == strcmp(OIC_JSON_ROWNERID_NAME, name) && cbor_value_is_text_string(&pconfMap))
- {
- char *rowner = NULL;
- cborFindResult = cbor_value_dup_text_string(&pconfMap, &rowner, &len, NULL);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed to get rowner");
- ret = ConvertStrToUuid(rowner, &pconf->rownerID);
- VERIFY_SUCCESS(TAG, ret == OC_STACK_OK, ERROR);
- OICFree(rowner);
- }
- }
- if (CborMapType != type && cbor_value_is_valid(&pconfMap))
- {
- cborFindResult = cbor_value_advance(&pconfMap);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed to advance");
- }
- OICFree(name);
- name = NULL;
- }
- *secPconf=pconf;
- ret = OC_STACK_OK;
-exit:
- if (CborNoError != cborFindResult)
- {
- OIC_LOG (ERROR, TAG, "CBORPayloadToPconf failed");
- DeletePconfBinData(pconf);
- pconf = NULL;
- *secPconf = NULL;
- ret = OC_STACK_ERROR;
- }
- return ret;
-}
-
-static bool UpdatePersistentStorage(const OicSecPconf_t * pconf)
-{
- bool ret = false;
-
- // Convert PCONF data into Cborpayload for update to persistent storage
- uint8_t *payload = NULL;
- size_t size = 0;
- if (OC_STACK_OK == PconfToCBORPayload(pconf, &payload, &size) && NULL !=payload)
- {
- if (OC_STACK_OK == UpdateSecureResourceInPS(OIC_JSON_PCONF_NAME, payload, size))
- {
- ret = true;
- }
- OICFree(payload);
- }
- return ret;
-}
-
-static OCEntityHandlerResult HandlePconfGetRequest (const OCEntityHandlerRequest * ehRequest)
-{
- uint8_t* payload = NULL;
- size_t size = 0;
- const OicSecDoxm_t *m_doxm = NULL;
- OCEntityHandlerResult ehRet = OC_EH_OK;
-
- OicSecPconf_t pconf;
- memset(&pconf, 0, sizeof(OicSecPconf_t));
-
- OIC_LOG (DEBUG, TAG, "Pconf EntityHandle processing GET request");
-
- m_doxm = GetDoxmResourceData();
- if (NULL == m_doxm)
- {
- OIC_LOG (DEBUG, TAG, "Doxm resource Data is NULL");
- }
-
- if ((m_doxm) && (true == m_doxm->dpc))
- {
- //Making response elements for Get request
- if( (true == gPconf->edp) &&
- (gPconf->prm && 0 < gPconf->prmLen) &&
- (0 < strlen((const char*)gPconf->deviceID.id)) &&
- (0 < strlen((const char*)gPconf->rownerID.id)))
- {
- pconf.edp = true;
- pconf.prm = gPconf->prm;
- pconf.prmLen = gPconf->prmLen;
- memcpy(&pconf.deviceID, &gPconf->deviceID, sizeof(OicUuid_t));
- memcpy(&pconf.rownerID, &gPconf->rownerID, sizeof(OicUuid_t));
- OIC_LOG (DEBUG, TAG, "PCONF - direct pairing enabled");
- }
- else if (false == gPconf->edp)
- {
- pconf.edp = false;
- memcpy(&pconf.rownerID, &gPconf->rownerID, sizeof(OicUuid_t));
- OIC_LOG (DEBUG, TAG, "PCONF - direct pairing disable");
- }
- else
- {
- ehRet= OC_EH_ERROR;
- OIC_LOG (DEBUG, TAG, "PCONF - error");
- }
- }
- else
- {
- OIC_LOG (DEBUG, TAG, "DPC == false : Direct-Pairing Disabled");
- }
-
-
- if (OC_STACK_OK != PconfToCBORPayload(gPconf, &payload, &size))
- {
- ehRet = OC_EH_ERROR;
- }
-
- if(OC_EH_OK == ehRet)
- {
- ehRet = (payload ? OC_EH_OK : OC_EH_ERROR);
- }
- else
- {
- OICFree(payload);
- payload = NULL;
- size = 0;
- }
-
- // Send response payload to request originator
- if (OC_STACK_OK != SendSRMResponse(ehRequest, ehRet, payload, size))
- {
- ehRet = OC_EH_ERROR;
- OIC_LOG(ERROR, TAG, "SendSRMResponse failed in HandlePconfGetRequest");
- }
- OIC_LOG_V(DEBUG, TAG, "%s RetVal %d", __func__, ehRet);
-
- OICFree(payload);
- return ehRet;
-}
-
-static OCEntityHandlerResult HandlePconfPostRequest (const OCEntityHandlerRequest * ehRequest)
-{
- OCEntityHandlerResult ehRet = OC_EH_OK;
- OCStackResult res=OC_STACK_OK;
- OicSecPconf_t* newPconf = NULL;
-
- if (NULL != GetDoxmResourceData() && true == GetDoxmResourceData()->dpc)
- {
- // Convert CBOR PCONF data into binary. This will also validate the PCONF data received.
- uint8_t *payload = ((OCSecurityPayload *) ehRequest->payload)->securityData;
- size_t size = ((OCSecurityPayload *) ehRequest->payload)->payloadSize;
-
- if(payload){
- res = CBORPayloadToPconf(payload, size, &newPconf);
- }
- }
- else
- {
- OIC_LOG (DEBUG, TAG, "DPC == false : Direct-Pairing Disabled");
- ehRet = OC_EH_ERROR;
- }
-
- if (newPconf && res == OC_STACK_OK)
- {
- // Check if valid Post request
- if ((true == newPconf->edp) && (0 < newPconf->prmLen) &&
- DP_PIN_LENGTH == sizeof(newPconf->pin.val))
- {
- OicSecPrm_t *oldPrm = gPconf->prm;
- OicSecPdAcl_t *oldPdacl = gPconf->pdacls;
-
- // Update local PCONF with new PCONF
- gPconf->edp = true;
- memcpy(&gPconf->pin, &newPconf->pin, sizeof(OicDpPin_t));
- gPconf->prm = newPconf->prm;
- gPconf->prmLen = newPconf->prmLen;
- gPconf->pdacls = newPconf->pdacls;
- memcpy(&gPconf->rownerID, &newPconf->rownerID, sizeof(OicUuid_t));
-
- // to delete old value(prm, pdacl)
- newPconf->prm = oldPrm;
- newPconf->pdacls = oldPdacl;
- }
- else if (false == newPconf->edp)
- {
- gPconf->edp = false;
- }
- else
- {
- ehRet = OC_EH_ERROR;
- }
-
- // Update storage
- if(OC_EH_ERROR != ehRet && true == UpdatePersistentStorage(gPconf))
- {
- ehRet = OC_EH_CHANGED;
- }
-
- DeletePconfBinData(newPconf);
- }
- else
- {
- ehRet = OC_EH_ERROR;
- }
-
- // Send payload to request originator
- if (OC_STACK_OK != SendSRMResponse(ehRequest, ehRet, NULL, 0))
- {
- ehRet = OC_EH_ERROR;
- OIC_LOG(ERROR, TAG, "SendSRMResponse failed in HandlePconfPostRequest");
- }
-
- OIC_LOG_V (DEBUG, TAG, "%s RetVal %d", __func__ , ehRet);
- return ehRet;
-}
-
-/*
- * This internal method is the entity handler for PCONF resources and
- * will handle REST request (POST) for them.
- */
-OCEntityHandlerResult PconfEntityHandler (OCEntityHandlerFlag flag,
- OCEntityHandlerRequest * ehRequest,
- void* callbackParameter)
-{
- OIC_LOG(DEBUG, TAG, "Received request PconfEntityHandler");
- (void)callbackParameter;
- OCEntityHandlerResult ehRet = OC_EH_ERROR;
-
- if (!ehRequest)
- {
- return ehRet;
- }
-
- if (flag & OC_REQUEST_FLAG)
- {
- OIC_LOG (DEBUG, TAG, "Flag includes OC_REQUEST_FLAG");
- switch (ehRequest->method)
- {
- case OC_REST_GET:
- ehRet = HandlePconfGetRequest(ehRequest);
- break;
-
- case OC_REST_POST:
- ehRet = HandlePconfPostRequest(ehRequest);
- break;
-
- case OC_REST_DELETE:
- break;
-
- default:
- ehRet = OC_EH_ERROR;
- SendSRMResponse(ehRequest, ehRet, NULL, 0);
- }
- }
-
- return ehRet;
-}
-
-/*
- * This internal method is used to create '/oic/sec/pconf' resource.
- */
-OCStackResult CreatePconfResource()
-{
- OCStackResult ret;
-
- ret = OCCreateResource(&gPconfHandle,
- OIC_RSRC_TYPE_SEC_PCONF,
- OC_RSRVD_INTERFACE_DEFAULT,
- OIC_RSRC_PCONF_URI,
- PconfEntityHandler,
- NULL,
- OC_SECURE | OC_EXPLICIT_DISCOVERABLE);
-
- if (OC_STACK_OK != ret)
- {
- OIC_LOG (ERROR, TAG, "Unable to instantiate PCONF resource");
- DeInitPconfResource();
- }
- return ret;
-}
-
-/**
- * Get the default value.
- * @retval the gDefaultPconf pointer;
- */
-static OicSecPconf_t* GetPconfDefault()
-{
- OIC_LOG (DEBUG, TAG, "GetPconfDefault");
-
- return &gDefaultPconf;
-}
-
-/**
- * This method is used by SRM to retrieve PCONF resource data..
- *
- * @retval reference to @ref OicSecPconf_t, binary format of Pconf resource data
- */
-const OicSecPconf_t* GetPconfResourceData()
-{
- return gPconf;
-}
-
-/**
- * Initialize PCONF resource by loading data from persistent storage.
- *
- * @retval OC_STACK_OK for Success, otherwise some error value
- */
-OCStackResult InitPconfResource()
-{
- OCStackResult ret = OC_STACK_ERROR;
-
- uint8_t *data = NULL;
- size_t size = 0;
-
- ret = GetSecureVirtualDatabaseFromPS(OIC_JSON_PCONF_NAME, &data, &size);
- // If database read failed
- if (ret != OC_STACK_OK)
- {
- OIC_LOG(DEBUG, TAG, "ReadSVDataFromPS failed");
- }
- if (data)
- {
- CBORPayloadToPconf(data, size, &gPconf);
- }
-
- if (!data || !gPconf)
- {
- gPconf = GetPconfDefault();
-
- // Device id from doxm
- OicUuid_t deviceId = {.id = {0}};
- ret = GetDoxmDeviceID(&deviceId);
- VERIFY_SUCCESS(TAG, OC_STACK_OK == ret, ERROR);
- memcpy(&gPconf->deviceID, &deviceId, sizeof(OicUuid_t));
- }
- VERIFY_NOT_NULL(TAG, gPconf, ERROR);
-
- // Instantiate 'oic.sec.pconf'
- ret = CreatePconfResource();
-
-exit:
- if (OC_STACK_OK != ret)
- {
- DeInitPconfResource();
- }
- OICFree(data);
- return ret;
-}
-
-/**
- * Perform cleanup for PCONF resources.
- *
- * @return
- * OC_STACK_OK - no error
- * OC_STACK_ERROR - stack process error
- *
- */
-OCStackResult DeInitPconfResource()
-{
- OCStackResult ret = OCDeleteResource(gPconfHandle);
- if(gPconf!= &gDefaultPconf)
- {
- DeletePconfBinData(gPconf);
- }
- gPconf = NULL;
-
- if(OC_STACK_OK == ret)
- {
- return OC_STACK_OK;
- }
- else
- {
- return OC_STACK_ERROR;
- }
-}
-
-/**
- * This method might be used to add a paired device id after direct-pairing process complete.
- *
- * @param pdeviceId ID of the paired device.
- *
- * @retval OC_STACK_OK for Success, otherwise some error value
- */
-OCStackResult AddPairedDevice(OicUuid_t *pdeviceId)
-{
- if (!gPconf || !pdeviceId)
- {
- return OC_STACK_INVALID_PARAM;
- }
-
-
- OicUuid_t *prevList = gPconf->pddevs;
- gPconf->pddevs = (OicUuid_t *)OICCalloc(gPconf->pddevLen+1, sizeof(OicUuid_t));
- if(!gPconf->pddevs)
- {
- return OC_STACK_NO_MEMORY;
- }
- for (size_t i=0; i<gPconf->pddevLen; i++)
- {
- memcpy(&gPconf->pddevs[i], &prevList[i], sizeof(OicUuid_t));
- }
-
- // add new paired device id
- memcpy(&gPconf->pddevs[gPconf->pddevLen], pdeviceId, sizeof(OicUuid_t));
- gPconf->pddevLen++;
-
- // Update storage
- if(true != UpdatePersistentStorage(gPconf))
- {
- OIC_LOG (ERROR, TAG, "Fail to update pconf resource");
- return OC_STACK_ERROR;
- }
-
- OIC_LOG (ERROR, TAG, "Add paired device success");
- return OC_STACK_OK;
-}
-
-/**
- * This method might be used by PolicyEngine to retrieve PDACL for a Subject.
- *
- * @param subjectId ID of the subject for which PDACL is required.
- * @param savePtr is used internally by @ref GetACLResourceData to maintain index between
- * successive calls for same subjectId.
- *
- * @retval reference to @ref OicSecPdAcl_t if PDACL is found, else NULL
- */
-const OicSecPdAcl_t* GetPdAclData(const OicUuid_t* subjectId, OicSecPdAcl_t **savePtr)
-{
- OicSecPdAcl_t *pdacl = NULL;
-
- if ( NULL == subjectId)
- {
- return NULL;
- }
-
- /*
- * savePtr MUST point to NULL if this is the 'first' call to retrieve PDACL for
- * subjectID.
- */
- if (NULL == *savePtr)
- {
- pdacl = gPconf->pdacls;
-
- // Find if 'subjectID' is in paired device list.
- for(size_t i=0; i<gPconf->pddevLen; i++)
- {
- if (memcmp(&(gPconf->pddevs[i]), subjectId, sizeof(OicUuid_t)) == 0)
- {
- *savePtr = pdacl;
- return pdacl;
- }
- }
- }
- else
- {
- OicSecPdAcl_t *temp = NULL;
-
- /*
- * If this is a 'successive' call, search for location pointed by
- * savePtr and assign 'begin' to the next PDACL after it in the linked
- * list and start searching from there.
- */
- LL_FOREACH(gPconf->pdacls, temp)
- {
- if (temp == *savePtr)
- {
- pdacl = temp->next;
- *savePtr = pdacl;
- return pdacl;
- }
- }
- }
-
- // Cleanup in case no PDACL is found
- *savePtr = NULL;
- return NULL;
-}
-
-/**
- * This method return whether device is paired or not.
- *
- * @param pdeviceId Target device ID to find in paired list.
- * @retval ture if device is already paired, else false
- */
-bool IsPairedDevice(const OicUuid_t* pdeviceId)
-{
- // Find if 'pdeviceId' is in paired device list.
- for(size_t i=0; i<gPconf->pddevLen; i++)
- {
- if (memcmp(&(gPconf->pddevs[i]), pdeviceId, sizeof(OicUuid_t)) == 0)
- {
- return true;
- }
- }
- return false;
-}
-
-OCStackResult SetPconfRownerId(const OicUuid_t* newROwner)
-{
- OCStackResult ret = OC_STACK_ERROR;
- uint8_t *cborPayload = NULL;
- size_t size = 0;
- OicUuid_t prevId = {.id={0}};
-
- if(NULL == newROwner)
- {
- ret = OC_STACK_INVALID_PARAM;
- }
- if(NULL == gPconf)
- {
- ret = OC_STACK_NO_RESOURCE;
- }
-
- if(newROwner && gPconf)
- {
- memcpy(prevId.id, gPconf->rownerID.id, sizeof(prevId.id));
- memcpy(gPconf->rownerID.id, newROwner->id, sizeof(newROwner->id));
-
- ret = PconfToCBORPayload(gPconf, &cborPayload, &size);
- VERIFY_SUCCESS(TAG, OC_STACK_OK == ret, ERROR);
-
- ret = UpdateSecureResourceInPS(OIC_JSON_PCONF_NAME, cborPayload, size);
- VERIFY_SUCCESS(TAG, OC_STACK_OK == ret, ERROR);
-
- OICFree(cborPayload);
- }
-
- return ret;
-
-exit:
- OICFree(cborPayload);
- memcpy(gPconf->rownerID.id, prevId.id, sizeof(prevId.id));
- return ret;
-}
-
-OCStackResult GetPconfRownerId(OicUuid_t *rowneruuid)
-{
- OCStackResult retVal = OC_STACK_ERROR;
- if (gPconf)
- {
- *rowneruuid = gPconf->rownerID;
- retVal = OC_STACK_OK;
- }
- return retVal;
-}
#include "doxmresource.h"
#include "iotvticalendar.h"
#include "pstatresource.h"
-#include "dpairingresource.h"
-#include "pconfresource.h"
#include "amaclresource.h"
#include "credresource.h"
#include "rolesresource.h"
GetCredRownerId,
NULL, // crl doesn't have rowneruuid.
GetDoxmRownerId,
- GetDpairingRownerId,
- GetPconfRownerId,
+ NULL, //Direct Pairing has been removed
+ NULL, //GetPconfRownerId,
GetPstatRownerId,
NULL, // sacl is not implemented yet.
NULL, // svc has been removed from the OCF 1.0 Security spec.
uint8_t *doxmCbor = NULL;
uint8_t *amaclCbor = NULL;
uint8_t *credCbor = NULL;
- uint8_t *pconfCbor = NULL;
uint8_t *resetPfCbor = NULL;
uint8_t *crlCbor = NULL;
uint8_t *dpCbor = NULL;
size_t doxmCborLen = 0;
size_t amaclCborLen = 0;
size_t credCborLen = 0;
- size_t pconfCborLen = 0;
size_t resetPfCborLen = 0;
size_t crlCborLen = 0;
size_t dpCborLen = 0;
cborFindResult = cbor_value_dup_byte_string(&curVal, &credCbor, &credCborLen, NULL);
VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed Finding CRED Name Value.");
}
- cborFindResult = cbor_value_map_find_value(&cbor, OIC_JSON_PCONF_NAME, &curVal);
- if ((CborNoError == cborFindResult) && cbor_value_is_byte_string(&curVal))
- {
- cborFindResult = cbor_value_dup_byte_string(&curVal, &pconfCbor, &pconfCborLen, NULL);
- VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed Finding PCONF Name Value.");
- }
cborFindResult = cbor_value_map_find_value(&cbor, OIC_JSON_RESET_PF_NAME, &curVal);
if ((CborNoError == cborFindResult) && cbor_value_is_byte_string(&curVal))
{
if (PS_DATABASE_SECURITY == database)
{
allocSize = aclCborLen + pstatCborLen + doxmCborLen + amaclCborLen
- + credCborLen + pconfCborLen + resetPfCborLen + crlCborLen
+ + credCborLen + /* pconfCborLen + */ resetPfCborLen + crlCborLen
+ size + CBOR_ENCODING_SIZE_ADDITION;
}
else
cborEncoderResult |= cbor_encode_byte_string(&resource, credCbor, credCborLen);
VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed Adding Cred Value.");
}
- if (strcmp(OIC_JSON_PCONF_NAME, resourceName) && pconfCborLen)
- {
- cborEncoderResult |= cbor_encode_text_string(&resource, OIC_JSON_PCONF_NAME, strlen(OIC_JSON_PCONF_NAME));
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed Adding Pconf Name.");
- cborEncoderResult |= cbor_encode_byte_string(&resource, pconfCbor, pconfCborLen);
- VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed Adding Pconf Value.");
- }
if (strcmp(OIC_JSON_RESET_PF_NAME, resourceName) && resetPfCborLen)
{
cborEncoderResult |= cbor_encode_text_string(&resource, OIC_JSON_RESET_PF_NAME, strlen(OIC_JSON_RESET_PF_NAME));
OICFree(doxmCbor);
OICFree(amaclCbor);
OICFree(credCbor);
- OICFree(pconfCbor);
OICFree(resetPfCbor);
OICFree(crlCbor);
OICFree(dpCbor);
#include "utlist.h"
#include "psinterface.h"
-//#ifdef DIRECT_PAIRING
-#include "pconfresource.h"
-#include "dpairingresource.h"
-//#endif // DIRECT_PAIRING
#define TAG "OIC_SRM_RM"
ret = InitAmaclResource();
}
#endif // AMACL_RESOURCE_IMPLEMENTATION_COMPLETE
-//#ifdef DIRECT_PAIRING
- if(OC_STACK_OK == ret)
- {
- ret = InitPconfResource();
- }
- if(OC_STACK_OK == ret)
- {
- ret = InitDpairingResource();
- }
-//#endif // DIRECT_PAIRING
if(OC_STACK_OK != ret)
{
//TODO: Update the default behavior if one of the SVR fails
DeInitRolesResource();
#endif // __WITH_DTLS__ || __WITH_TLS__
DeInitAmaclResource();
-//#ifdef DIRECT_PAIRING
- DeInitPconfResource();
- DeInitDpairingResource();
-//#endif // DIRECT_PAIRING
OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
OIC_RSRC_ACL2_URI,
OIC_RSRC_DOXM_URI,
OIC_RSRC_PSTAT_URI,
- OIC_RSRC_PCONF_URI,
- OIC_RSRC_DPAIRING_URI,
OIC_RSRC_VER_URI,
OIC_RSRC_ROLES_URI,
OC_RSRVD_PROV_CRL_URL
}
}
- svrLen = strlen(OIC_RSRC_DPAIRING_URI);
- if (uriLen == svrLen)
- {
- if (0 == strncmp(uri, OIC_RSRC_DPAIRING_URI, svrLen))
- {
- return OIC_R_DPAIRING_TYPE;
- }
- }
-
- svrLen = strlen(OIC_RSRC_PCONF_URI);
- if (uriLen == svrLen)
- {
- if (0 == strncmp(uri, OIC_RSRC_PCONF_URI, svrLen))
- {
- return OIC_R_PCONF_TYPE;
- }
- }
-
svrLen = strlen(OIC_RSRC_PSTAT_URI);
if (uriLen == svrLen)
{
const char * OIC_RSRC_SVC_URI = "/oic/sec/svc";
const char * OIC_JSON_SVC_NAME = "svc";
-//pconf
-const char * OIC_RSRC_TYPE_SEC_PCONF = "oic.r.pconf";
-const char * OIC_RSRC_PCONF_URI = "/oic/sec/pconf";
-const char * OIC_JSON_PCONF_NAME = "pconf";
-
-//dpairing
-const char * OIC_RSRC_TYPE_SEC_DPAIRING = "oic.r.dpairing";
-const char * OIC_RSRC_DPAIRING_URI = "/oic/sec/dpairing";
-const char * OIC_JSON_DPAIRING_NAME = "dpairing";
-
//version
const char * OIC_RSRC_TYPE_SEC_VER = "oic.r.ver";
const char * OIC_RSRC_VER_URI = "/oic/sec/ver";
'base64tests.cpp',
'pbkdf2tests.cpp',
'srmtestcommon.cpp',
- 'directpairingtest.cpp',
'crlresourcetest.cpp'
])
+++ /dev/null
-//******************************************************************
-//
-// Copyright 2016 Samsung Electronics All Rights Reserved.
-//
-//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-
-#include <gtest/gtest.h>
-#include "directpairing.h"
-
-using namespace std;
-
-#define TAG "DIRECTPAIRING-UT"
-
-static OCDirectPairingDev_t peer;
-static OicSecPrm_t pmSel;
-static char pinNumber;
-
-static void ResultCB(void *UNUSED1, OCDirectPairingDev_t *UNUSED2, OCStackResult UNUSED3)
-{
- //dummy callback
- (void) UNUSED1;
- (void) UNUSED2;
- (void) UNUSED3;
-}
-
-TEST(DPDirectPairingTest, NullPeer)
-{
- EXPECT_EQ(OC_STACK_INVALID_PARAM, DPDirectPairing(NULL, NULL, pmSel, &pinNumber, &ResultCB));
-}
-
-TEST(DPDirectPairingTest, NullPinNumber)
-{
- EXPECT_EQ(OC_STACK_INVALID_PARAM, DPDirectPairing(NULL, &peer, pmSel, NULL, &ResultCB));
-}
-
*/
OCStackResult OC_CALL OCDoResponse(OCEntityHandlerResponse *response);
-//#ifdef DIRECT_PAIRING
-/**
- * The function is responsible for discovery of direct-pairing device is current subnet. It will list
- * all the device in subnet which support direct-pairing.
- * Caller must NOT free returned constant pointer
- *
- * @param[in] waittime Timeout in seconds, value till which function will listen to responses from
- * client before returning the list of devices.
- * @return OCDirectPairingDev_t pointer in case of success and NULL otherwise.
- */
-const OCDPDev_t* OC_CALL OCDiscoverDirectPairingDevices(unsigned short waittime);
-
-/**
- * The function is responsible for return of paired device list via direct-pairing. It will list
- * all the device which is previousely paired with client.
- * Caller must NOT free returned constant pointer
- *
- * @return OCDirectPairingDev_t pointer in case of success and NULL otherwise.
- */
-const OCDPDev_t* OC_CALL OCGetDirectPairedDevices();
-
-/**
- * The function is responsible for establishment of direct-pairing. It will proceed mode negotiation
- * and connect PIN based dtls session.
- *
- * @param[in] ctx user context passed back with resultCallback.
- * @param[in] peer Target device to establish direct-pairing.
- * @param[in] pmSel Selected mode of pairing.
- * @param[in] pinNumber PIN number for authentication, pin lenght is defined DP_PIN_LENGTH(8).
- * @param[in] resultCallback Callback fucntion to event status of process.
- * @return OTM_SUCCESS in case of success and other value otherwise.
- */
-OCStackResult OC_CALL OCDoDirectPairing(void *ctx, OCDPDev_t* peer, OCPrm_t pmSel, char *pinNumber,
- OCDirectPairingCB resultCallback);
-//#endif // DIRECT_PAIRING
-
/**
* This function sets uri being used for proxy.
*
OCDeleteResource
OCDiagnosticPayloadCreate
OCDiagnosticPayloadDestroy
-OCDiscoverDirectPairingDevices
OCDiscoveryEndpointDestroy
OCDiscoveryPayloadAddResource
OCDiscoveryPayloadAddNewResource
OCDiscoveryPayloadGetResource
OCDiscoveryPayloadGetResourceCount
OCDiscoveryResourceDestroy
-OCDoDirectPairing
OCDoResource
OCDoResponse
OCDoRequest
OCFreeOCStringLL
OCGetDeviceId
OCGetDeviceOwnedState
-OCGetDirectPairedDevices
OCGetHeaderOption
OCGetIpv6AddrScope
OCGetNumberOfResources
OCConvertDerCSRToPem
OCDeleteACLList
OCDeleteDiscoveredDevices
-OCDeletePdAclList
OCDeleteRoleCertificateByCredId
OCDeleteUuidList
OCDiscoverOwnedDevices
OCSaveACL
OCProvisionCertificate
OCProvisionCredentials
-OCProvisionDirectPairing
OCProvisionPairwiseDevices
OCProvisionSymmetricRoleCredentials
OCProvisionTrustCertChain
ocamsservice = samples_env.Program(
'ocamsservice', ['common.cpp', 'ocamsservice.cpp'])
ocsamples = [ocserverbasicops, occlientbasicops, ocamsservice]
-if samples_env.get('SECURED') == '1':
- occlientdirectpairing = samples_env.Program(
- 'occlientdirectpairing', 'occlientdirectpairing.cpp')
- ocsamples.append(occlientdirectpairing)
Alias("samples", ocsamples)
samples_env.AppendTarget('samples')
"install",
samples_env.Install(sec_samples_build_dir,
sec_samples_src_dir + 'oic_amss_db.json'))
-if samples_env.get('SECURED') == '1':
- samples_env.Alias(
- "install",
- samples_env.Install(
- sec_samples_build_dir,
- sec_samples_src_dir + 'oic_svr_db_client_directpairing.json'))
- samples_env.Alias(
- "install",
- samples_env.Install(
- sec_samples_build_dir,
- sec_samples_src_dir + 'oic_svr_db_client_directpairing.dat'))
samples_env.Alias(
"install",
+++ /dev/null
-//******************************************************************\r
-//\r
-// Copyright 2014 Intel Mobile Communications GmbH All Rights Reserved.\r
-//\r
-//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
-//\r
-// Licensed under the Apache License, Version 2.0 (the "License");\r
-// you may not use this file except in compliance with the License.\r
-// You may obtain a copy of the License at\r
-//\r
-// http://www.apache.org/licenses/LICENSE-2.0\r
-//\r
-// Unless required by applicable law or agreed to in writing, software\r
-// distributed under the License is distributed on an "AS IS" BASIS,\r
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-// See the License for the specific language governing permissions and\r
-// limitations under the License.\r
-//\r
-//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
-\r
-#include "iotivity_config.h"\r
-#include <stdio.h>\r
-#include <stdlib.h>\r
-#include <string.h>\r
-#include <signal.h>\r
-#ifdef HAVE_UNISTD_H\r
-#include <unistd.h>\r
-#endif\r
-#ifdef HAVE_PTHREAD_H\r
-#include <pthread.h>\r
-#endif\r
-#include <iostream>\r
-#include <sstream>\r
-#if defined(HAVE_WINDOWS_H)\r
-#include <windows.h>\r
-/** @todo stop-gap for naming issue. Windows.h does not like us to use ERROR */\r
-#ifdef ERROR\r
-#undef ERROR\r
-#endif\r
-#endif // defined(HAVE_WINDOWS_H)\r
-#include "ocstack.h"\r
-#include "logger.h"\r
-#include "ocpayload.h"\r
-#include "payload_logging.h"\r
-#include "oic_malloc.h"\r
-#include "oic_string.h"\r
-#include "utlist.h"\r
-\r
-#define TAG "occlient-directpairing"\r
-\r
-#define BOLD_BEGIN "\033[1m"\r
-#define RED_BEGIN "\033[1;31m"\r
-#define GREEN_BEGIN "\033[1;92m"\r
-#define COLOR_END "\033[0m"\r
-#define MAX_LINE (1024)\r
-#define DP_DISCOVERY_TIMEOUT 3 // 3 sec\r
-#define DP_PIN_LENGTH 8 // 8 digit\r
-\r
-static char DISCOVERY_QUERY[] = "%s/oic/res";\r
-\r
-//Secure Virtual Resource database for Iotivity Client application\r
-//It contains Client's Identity and the PSK credentials\r
-//of other devices which the client trusts\r
-static char CRED_FILE[] = "oic_svr_db_client_directpairing.dat";\r
-\r
-static const OCDPDev_t *discoveredDevs = NULL;\r
-static const OCDPDev_t *pairedDevs = NULL;\r
-\r
-int gQuitFlag = 0;\r
-\r
-//-----------------------------------------------------------------------------\r
-// Function prototype\r
-//-----------------------------------------------------------------------------\r
-\r
-\r
-\r
-\r
-//-----------------------------------------------------------------------------\r
-// Function body\r
-//-----------------------------------------------------------------------------\r
-\r
-/* SIGINT handler: set gQuitFlag to 1 for graceful termination */\r
-void handleSigInt(int signum)\r
-{\r
- if (signum == SIGINT)\r
- {\r
- gQuitFlag = 1;\r
- }\r
-}\r
-\r
-const char *readline(const char *in, const char *defaultStr)\r
-{\r
- static char rbuffer[MAX_LINE] = {0,};\r
- char *cptr, *p;\r
-\r
- size_t in_len = strlen(in);\r
- for (size_t i=0; i<in_len; i++)\r
- {\r
- fprintf(stdout, "%c", in[i]);\r
- }\r
-\r
- if (NULL != (cptr = fgets(rbuffer, MAX_LINE, stdin)))\r
- {\r
- /* kill preceding whitespace but leave \n so we're guaranteed to have something */\r
- /*while(*cptr == ' ' || *cptr == '\t')\r
- {\r
- cptr++;\r
- }*/\r
-\r
- if ( (p = strchr(cptr, '\n')) != NULL )\r
- {\r
- *p = '\0';\r
- }\r
-\r
- if (strlen(cptr)==0 && defaultStr)\r
- {\r
- return defaultStr;\r
- }\r
- return cptr;\r
- }\r
- else\r
- {\r
- return 0;\r
- }\r
-}\r
-\r
-const char *getResult(OCStackResult result) {\r
- switch (result) {\r
- case OC_STACK_OK:\r
- return "OC_STACK_OK";\r
- case OC_STACK_RESOURCE_CREATED:\r
- return "OC_STACK_RESOURCE_CREATED";\r
- case OC_STACK_RESOURCE_DELETED:\r
- return "OC_STACK_RESOURCE_DELETED";\r
- case OC_STACK_INVALID_URI:\r
- return "OC_STACK_INVALID_URI";\r
- case OC_STACK_INVALID_QUERY:\r
- return "OC_STACK_INVALID_QUERY";\r
- case OC_STACK_INVALID_IP:\r
- return "OC_STACK_INVALID_IP";\r
- case OC_STACK_INVALID_PORT:\r
- return "OC_STACK_INVALID_PORT";\r
- case OC_STACK_INVALID_CALLBACK:\r
- return "OC_STACK_INVALID_CALLBACK";\r
- case OC_STACK_INVALID_METHOD:\r
- return "OC_STACK_INVALID_METHOD";\r
- case OC_STACK_NO_MEMORY:\r
- return "OC_STACK_NO_MEMORY";\r
- case OC_STACK_COMM_ERROR:\r
- return "OC_STACK_COMM_ERROR";\r
- case OC_STACK_INVALID_PARAM:\r
- return "OC_STACK_INVALID_PARAM";\r
- case OC_STACK_NOTIMPL:\r
- return "OC_STACK_NOTIMPL";\r
- case OC_STACK_NO_RESOURCE:\r
- return "OC_STACK_NO_RESOURCE";\r
- case OC_STACK_RESOURCE_ERROR:\r
- return "OC_STACK_RESOURCE_ERROR";\r
- case OC_STACK_SLOW_RESOURCE:\r
- return "OC_STACK_SLOW_RESOURCE";\r
- case OC_STACK_NO_OBSERVERS:\r
- return "OC_STACK_NO_OBSERVERS";\r
- #ifdef WITH_PRESENCE\r
- case OC_STACK_PRESENCE_STOPPED:\r
- return "OC_STACK_PRESENCE_STOPPED";\r
- #endif\r
- case OC_STACK_ERROR:\r
- return "OC_STACK_ERROR";\r
- default:\r
- return "UNKNOWN";\r
- }\r
-}\r
-\r
-OCDPDev_t* getDev(const OCDPDev_t* pList, const uint32_t dev_num)\r
-{\r
- if(NULL == pList)\r
- {\r
- printf(" Device List is Empty..\n");\r
- return NULL;\r
- }\r
-\r
- OCDPDev_t* lst = (OCDPDev_t*)pList;\r
- for(size_t i=0; lst; )\r
- {\r
- if(dev_num == ++i)\r
- {\r
- return lst;\r
- }\r
- lst = lst->next;\r
- }\r
-\r
- return NULL; // in here |lst| is always |NULL|\r
-}\r
-\r
-int printList(const OCDPDev_t* pList)\r
-{\r
- if(!pList)\r
- {\r
- printf(" Device List is Empty..\n\n");\r
- return 0;\r
- }\r
-\r
- const OCDPDev_t* lst = pList;\r
- int lst_cnt = 0;\r
- for( ; lst; )\r
- {\r
- printf(" [%d] ", ++lst_cnt);\r
- for(int i=0; i<UUID_IDENTITY_SIZE; i++)\r
- {\r
- fprintf(stdout, "%c", (char)lst->deviceID.id[i]);\r
- }\r
- printf("\n");\r
- lst = lst->next;\r
- }\r
- printf("\n");\r
-\r
- return lst_cnt;\r
-}\r
-\r
-bool printPairingMethod(const OCDPDev_t* pDev)\r
-{\r
- printf("\n * List of supported pairing method\n");\r
-\r
- if(!pDev || false == pDev->edp)\r
- {\r
- printf(" Invalid device or Not support direct-pairing..\n\n");\r
- return false;\r
- }\r
-\r
- if(!pDev->prm || 0 == pDev->prmLen)\r
- {\r
- printf(" Not exist any support method..\n\n");\r
- return false;\r
- }\r
-\r
- bool bAvailable = true;\r
- for (size_t i = 0; i < pDev->prmLen; i++)\r
- {\r
- printf(" [%" PRIuPTR "] ", i + 1);\r
- switch (pDev->prm[i])\r
- {\r
- case DP_PRE_CONFIGURED:\r
- printf("Pre-Configured PIN");\r
- break;\r
- case DP_RANDOM_PIN:\r
- printf("Random PIN");\r
- break;\r
- default:\r
- printf("NOT Allowed (%d)", pDev->prm[i]);\r
- bAvailable = false;\r
- break;\r
- }\r
- printf("\n");\r
- }\r
- printf("\n");\r
-\r
- return bAvailable;\r
-}\r
-\r
-// This is a function called back when a device is discovered\r
-OCStackApplicationResult discoveryReqCB(void*, OCDoHandle,\r
- OCClientResponse * clientResponse)\r
-{\r
- OIC_LOG(INFO, TAG, "Callback Context for DISCOVER query recvd successfully");\r
-\r
- if (clientResponse)\r
- {\r
- OIC_LOG_V(INFO, TAG, "StackResult: %s", getResult(clientResponse->result));\r
- OIC_LOG_V(INFO, TAG,\r
- "Device =============> Discovered @ %s:%d",\r
- clientResponse->devAddr.addr,\r
- clientResponse->devAddr.port);\r
-\r
- if (clientResponse->result == OC_STACK_OK)\r
- {\r
- OIC_LOG_PAYLOAD(INFO, clientResponse->payload);\r
- }\r
- }\r
-\r
- return OC_STACK_DELETE_TRANSACTION;\r
-\r
-}\r
-\r
-// This is a function called back when direct-pairing status is changed\r
-void pairingReqCB(void *ctx, OCDPDev_t* peer, OCStackResult result)\r
-{\r
- OIC_LOG(INFO, TAG, "Callback Context for Direct-Pairing establishment\n");\r
-\r
- (void) ctx;\r
- if (OC_STACK_OK == result)\r
- {\r
- OIC_LOG_V(INFO, TAG,\r
- "Direct-Pairing SUCCESS =============> Target @ %s:%d\n",\r
- peer->endpoint.addr,\r
- peer->endpoint.port);\r
- }\r
- else\r
- {\r
- OIC_LOG(ERROR, TAG, "Direct-Pairing FAILED..\n");\r
- }\r
-}\r
-\r
-OCStackApplicationResult getReqCB(void * ctx, OCDoHandle handle, OCClientResponse *clientResponse)\r
-{\r
- OIC_LOG(INFO, TAG, "Callback Context for GET query recvd successfully");\r
-\r
- (void)ctx;\r
- (void)handle;\r
- if (clientResponse)\r
- {\r
- OIC_LOG_V(INFO, TAG, "StackResult: %s", getResult(clientResponse->result));\r
- OIC_LOG_V(INFO, TAG, "SEQUENCE NUMBER: %d", clientResponse->sequenceNumber);\r
- OIC_LOG_PAYLOAD(INFO, clientResponse->payload);\r
- if ((OCSecurityPayload*)clientResponse->payload)\r
- {\r
- OIC_LOG(INFO, TAG, PCF("=============> Get Response"));\r
- }\r
- }\r
- return OC_STACK_DELETE_TRANSACTION;\r
-}\r
-\r
-int DeviceDiscovery()\r
-{\r
- OCStackResult ret;\r
- OCCallbackData cbData;\r
- char queryUri[200];\r
- char ipaddr[100] = { '\0' };\r
-\r
- snprintf(queryUri, sizeof (queryUri), DISCOVERY_QUERY, ipaddr);\r
-\r
- cbData.cb = discoveryReqCB;\r
- cbData.context = NULL;\r
- cbData.cd = NULL;\r
-\r
- /* Start a discovery query*/\r
- OIC_LOG_V(INFO, TAG, "Resource Discovery : %s\n", queryUri);\r
-\r
- ret = OCDoRequest(NULL, OC_REST_DISCOVER, queryUri, 0, 0, CT_DEFAULT,\r
- OC_LOW_QOS, &cbData, NULL, 0);\r
- if (ret != OC_STACK_OK)\r
- {\r
- OIC_LOG(ERROR, TAG, "OCStack resource error");\r
- }\r
- return ret;\r
-}\r
-\r
-OCStackResult DirectPairingDiscovery()\r
-{\r
- // initiate direct pairing discovery\r
- OIC_LOG(INFO, TAG, " Discovering Only Owned Devices on Network..");\r
- discoveredDevs = OCDiscoverDirectPairingDevices(DP_DISCOVERY_TIMEOUT);\r
- if(NULL == discoveredDevs)\r
- {\r
- OIC_LOG(ERROR, TAG, "OCDiscoverDirectPairingDevices API error");\r
- return OC_STACK_ERROR;\r
- }\r
-\r
- // display the discovered unowned list\r
- printf(" > Discovered Direct-Pairing Support Devices\n");\r
- printList(discoveredDevs);\r
-\r
- return OC_STACK_OK;\r
-}\r
-\r
-OCStackResult DoDirectPairing(OCDPDev_t* peer, OCPrm_t pmSel, char *pinNumber)\r
-{\r
- if (NULL == peer || NULL == pinNumber)\r
- {\r
- OIC_LOG(ERROR, TAG, "invalid parameter");\r
- return OC_STACK_INVALID_PARAM;\r
- }\r
-\r
- // start direct pairing\r
- OIC_LOG(INFO, TAG, " Start Direct Pairing..");\r
- if(OC_STACK_OK != OCDoDirectPairing(NULL, peer, pmSel, pinNumber, pairingReqCB))\r
- {\r
- OIC_LOG(ERROR, TAG, "OCDoDirectPairing API error");\r
- return OC_STACK_ERROR;\r
- }\r
-\r
- return OC_STACK_OK;\r
-}\r
-\r
-OCStackResult SendGetRequest(OCDPDev_t* peer)\r
-{\r
- OIC_LOG(INFO, TAG, "Send Get REQ to Led server");\r
-\r
- char szQueryUri[] = "/a/led";\r
- OCDoHandle handle;\r
- OCCallbackData cbData;\r
- OCDevAddr endpoint;\r
- OCStackResult ret;\r
-\r
- memcpy(&endpoint, &peer->endpoint, sizeof(OCDevAddr));\r
- endpoint.port = peer->securePort;\r
- endpoint.flags = (OCTransportFlags)(endpoint.flags | OC_SECURE);\r
-\r
- cbData.cb = getReqCB;\r
- cbData.context = NULL;\r
- cbData.cd = NULL;\r
-\r
- OIC_LOG(INFO, TAG, "Request to /a/light ");\r
- ret = OCDoRequest(&handle, OC_REST_GET, szQueryUri,\r
- &endpoint, NULL, peer->connType, OC_LOW_QOS, &cbData, NULL, 0);\r
- if (ret != OC_STACK_OK)\r
- {\r
- OIC_LOG_V(ERROR, TAG, "OCDoResource returns error %d with method %d", ret, OC_REST_GET);\r
- }\r
-\r
- return ret;\r
-}\r
-\r
-FILE* client_fopen(const char *path, const char *mode)\r
-{\r
- if (0 == strcmp(path, OC_SECURITY_DB_DAT_FILE_NAME))\r
- {\r
- return fopen(CRED_FILE, mode);\r
- }\r
- else\r
- {\r
- return fopen(path, mode);\r
- }\r
-}\r
-\r
-void *CLInterface(void *data)\r
-{\r
- printf(RED_BEGIN "#Ready to operation ('h' for help)#\n" COLOR_END);\r
-\r
- (void)data;\r
- OCStackResult ret;\r
- char query[MAX_LINE] = {0};\r
- const char prompt[] = BOLD_BEGIN "IoTivity-DP#" COLOR_END" ";\r
- const char* helpmsg[6] = {\r
- GREEN_BEGIN "# h (or help) : show help message" COLOR_END,\r
- GREEN_BEGIN "# dd (DP device discovery) : discover Direct-Pairing devices" COLOR_END,\r
- GREEN_BEGIN "# dp (start Direct-Pairing) : negotiate DP method & start Direct-Pairing" COLOR_END,\r
- GREEN_BEGIN "# sd (send data) : send data to device" COLOR_END,\r
- GREEN_BEGIN "# ll (list all device) : list all discovered/paired devices" COLOR_END,\r
- GREEN_BEGIN "# q (quit) : quit test" COLOR_END,\r
- };\r
-\r
- for (size_t i=0; i<(sizeof(helpmsg)/sizeof(char*)); i++)\r
- {\r
- fprintf(stderr, "%s\n", helpmsg[i]);\r
- }\r
- printf("\n");\r
-\r
- // cli\r
- for (;;)\r
- {\r
- const char *input = readline(prompt, NULL);\r
- if (!input) {\r
- continue;\r
- }\r
-\r
- strncpy(query, input, MAX_LINE);\r
- if (!strlen(query))\r
- {\r
- continue;\r
- }\r
- else if (!strcmp(query, "h") || !strcmp(query, "help"))\r
- {\r
- for (size_t i=0; i<(sizeof(helpmsg)/sizeof(char*)); i++)\r
- {\r
- fprintf(stderr, "%s\n", helpmsg[i]);\r
- }\r
- continue;\r
- }\r
- else\r
- {\r
- if (!strcmp(query, "dd"))\r
- {\r
- OIC_LOG(INFO, TAG, "- Direct-Pairing device discovery -");\r
-\r
- ret = DirectPairingDiscovery();\r
- if (OC_STACK_OK != ret)\r
- {\r
- OIC_LOG(ERROR, TAG, "Error in DirectPairingDiscovery()");\r
- }\r
- }\r
- else if (!strcmp(query, "dp"))\r
- {\r
- OIC_LOG(INFO, TAG, "- Negotiate DP method & Start Direct-Pairing -");\r
-\r
- printf("\n * List of discovered device\n");\r
- printList(discoveredDevs);\r
-\r
- // target peer\r
- OCDPDev_t *peer = NULL;\r
- long peerIdx;\r
- input = readline(" > Enter Peer Device Number to initiate Direct-Pairing: ", NULL);\r
- if (!input || !strlen(input))\r
- {\r
- continue;\r
- }\r
- char *ptr;\r
- peerIdx = strtol(input, &ptr, 10);\r
-\r
- peer = getDev(discoveredDevs, (uint32_t)peerIdx);\r
- if (NULL == peer)\r
- {\r
- OIC_LOG(ERROR, TAG, "Not found the peer in discovered list");\r
- continue;\r
- }\r
-\r
- // get pairing method\r
- long pmIdx;\r
- OCPrm_t pmSel = DP_NOT_ALLOWED;\r
- if (false == printPairingMethod(peer))\r
- {\r
- OIC_LOG(ERROR, TAG, "Target does not support the Direct-Pairing");\r
- continue;\r
- }\r
- input = readline(" > Enter pairing method: ", NULL);\r
- if (!input || !strlen(input))\r
- {\r
- continue;\r
- }\r
- pmIdx = strtol(input, &ptr, 10);\r
- printf("\n");\r
- if (0 >= pmIdx || peer->prmLen+1 < (size_t)pmIdx)\r
- {\r
- OIC_LOG(ERROR, TAG, "Invalid mode selection");\r
- continue;\r
- }\r
- pmSel = peer->prm[pmIdx-1];\r
-\r
- // get PIN\r
- char pinNumber[DP_PIN_LENGTH+1];\r
- input = readline(" > Enter PIN Number for authentication (ex - '00000000' [8 digit] ): ", NULL);\r
- if (!input || DP_PIN_LENGTH != strlen(input))\r
- {\r
- OIC_LOG(ERROR, TAG, "Invalid PIN");\r
- continue;\r
- }\r
- sscanf(input, "%8s", pinNumber);\r
- printf("\n");\r
-\r
- ret = DoDirectPairing(peer, pmSel, pinNumber);\r
- if (OC_STACK_OK != ret)\r
- {\r
- OIC_LOG(ERROR, TAG, "Error in DoDirectPairing()");\r
- }\r
- }\r
- else if (!strcmp(query, "sd"))\r
- {\r
- OIC_LOG(INFO, TAG, "- Send data(GET Request) to device(led server) -");\r
-\r
- //pairedDevs = OCGetDirectPairedDevices();\r
- //printList(pairedDevs);\r
- printList(discoveredDevs);\r
-\r
- // target peer\r
- OCDPDev_t *peer = NULL;\r
- long peerIdx;\r
- input = readline(" > Enter Peer Device Number to initiate Direct-Pairing: ", NULL);\r
- if (!input || !strlen(input))\r
- {\r
- continue;\r
- }\r
- char *ptr;\r
- peerIdx = strtol(input, &ptr, 10);\r
-\r
- //peer = getDev(pairedDevs, peerIdx);\r
- peer = getDev(discoveredDevs, (uint32_t)peerIdx);\r
- if (NULL == peer)\r
- {\r
- OIC_LOG(ERROR, TAG, "Not found the peer in discovered list");\r
- continue;\r
- }\r
-\r
- // send Get Req\r
- ret = SendGetRequest(peer);\r
- if (OC_STACK_OK != ret)\r
- {\r
- OIC_LOG(ERROR, TAG, "Error in SendGetRequest()");\r
- }\r
- }\r
- else if (!strcmp(query, "ll"))\r
- {\r
- OIC_LOG(INFO, TAG, "- List all discovered and paired devices) -");\r
-\r
- printf(" > List of discovered devices\n");\r
- printList(discoveredDevs);\r
- printf("\n");\r
-\r
- printf(" > List of paired devices\n");\r
- pairedDevs = OCGetDirectPairedDevices();\r
- printList(pairedDevs);\r
- printf("\n");\r
- }\r
- else if (!strcmp(query, "q"))\r
- {\r
- printf("QUIT\n");\r
- gQuitFlag = 1;\r
- break;\r
- }\r
- }\r
- }\r
-\r
- return 0;\r
-}\r
-\r
-int main(void)\r
-{\r
- struct timespec timeout;\r
-\r
- // Initialize Persistent Storage for SVR database\r
- OCPersistentStorage ps = { client_fopen, fread, fwrite, fclose, unlink };\r
- OCRegisterPersistentStorageHandler(&ps);\r
-\r
- /* Initialize OCStack*/\r
- if (OCInit(NULL, 0, OC_CLIENT_SERVER) != OC_STACK_OK)\r
- {\r
- OIC_LOG(ERROR, TAG, "OCStack init error");\r
- return 0;\r
- }\r
-\r
-// DeviceDiscovery();\r
-\r
- timeout.tv_sec = 0;\r
- timeout.tv_nsec = 100000000L;\r
-\r
- // Break from loop with Ctrl+C\r
- OIC_LOG(INFO, TAG, "Entering occlient main loop...");\r
- signal(SIGINT, handleSigInt);\r
-\r
- // CLI\r
- int thr_id;\r
- pthread_t p_thread;\r
- thr_id = pthread_create(&p_thread, NULL, CLInterface, (void *)NULL);\r
- if (thr_id < 0)\r
- {\r
- OIC_LOG(ERROR, TAG, "create CLI Thread error");\r
- return 0;\r
- }\r
-\r
- // loop\r
- while (!gQuitFlag)\r
- {\r
- if (OCProcess() != OC_STACK_OK)\r
- {\r
- OIC_LOG(ERROR, TAG, "OCStack process error");\r
- return 0;\r
- }\r
-\r
-#if defined(_WIN32)\r
- Sleep(100);\r
-#else\r
- nanosleep(&timeout, NULL);\r
-#endif // defined(_WIN32)\r
-\r
- }\r
- OIC_LOG(INFO, TAG, "Exiting occlient main loop...");\r
-\r
- if (OCStop() != OC_STACK_OK)\r
- {\r
- OIC_LOG(ERROR, TAG, "OCStack stop error");\r
- }\r
-\r
- return 0;\r
-}\r
#include "oickeepalive.h"
#endif
-//#ifdef DIRECT_PAIRING
-#include "directpairing.h"
-//#endif
-
#ifdef HAVE_ARDUINO_TIME_H
#include "Time.h"
#endif
return result;
}
-//#ifdef DIRECT_PAIRING
-const OCDPDev_t* OC_CALL OCDiscoverDirectPairingDevices(unsigned short waittime)
-{
- OIC_LOG(INFO, TAG, "Start OCDiscoverDirectPairingDevices");
- if(OC_STACK_OK != DPDeviceDiscovery(waittime))
- {
- OIC_LOG(ERROR, TAG, "Fail to discover Direct-Pairing device");
- return NULL;
- }
-
- return (const OCDPDev_t*)DPGetDiscoveredDevices();
-}
-
-const OCDPDev_t* OC_CALL OCGetDirectPairedDevices()
-{
- return (const OCDPDev_t*)DPGetPairedDevices();
-}
-
-OCStackResult OC_CALL OCDoDirectPairing(void *ctx, OCDPDev_t* peer, OCPrm_t pmSel, char *pinNumber,
- OCDirectPairingCB resultCallback)
-{
- OIC_LOG(INFO, TAG, "Start OCDoDirectPairing");
- if(NULL == peer || NULL == pinNumber)
- {
- OIC_LOG(ERROR, TAG, "Invalid parameters");
- return OC_STACK_INVALID_PARAM;
- }
- if (NULL == resultCallback)
- {
- OIC_LOG(ERROR, TAG, "Invalid callback");
- return OC_STACK_INVALID_CALLBACK;
- }
-
- return DPDirectPairing(ctx, (OCDirectPairingDev_t*)peer, (OicSecPrm_t)pmSel,
- pinNumber, (OCDirectPairingResultCB)resultCallback);
-}
-//#endif // DIRECT_PAIRING
-
//-----------------------------------------------------------------------------
// Private internal function definitions
//-----------------------------------------------------------------------------
return OC_STACK_KEEP_TRANSACTION;
}
-static void resultCallback(void *UNUSED1, OCDPDev_t *UNUSED2, OCStackResult UNUSED3)
-{
- (void) (UNUSED1);
- (void) (UNUSED2);
- (void) (UNUSED3);
-}
-
extern "C" OCStackApplicationResult discoveryCallback(void* ctx,
OCDoHandle /*handle*/, OCClientResponse * clientResponse)
{
}
#endif
-TEST(OCDoDirectPairingTests, Nullpeer)
-{
- EXPECT_EQ(OC_STACK_INVALID_PARAM,OCDoDirectPairing(NULL, NULL, pmSel, &pinNumber, &resultCallback));
-}
-
-TEST(OCDoDirectPairingTests, NullCallback)
-{
- EXPECT_EQ(OC_STACK_INVALID_CALLBACK,OCDoDirectPairing(NULL, &peer, pmSel, &pinNumber, NULL));
-}
-
-TEST(OCDoDirectPairingTests, NullpinNumber)
-{
- EXPECT_EQ(OC_STACK_INVALID_PARAM,OCDoDirectPairing(NULL, &peer, pmSel, NULL, &resultCallback));
-}
-
TEST(StackResource, MultipleResourcesDiscovery)
{
itst::DeadmanTimer killSwitch(SHORT_TEST_TIMEOUT);
example_names = [
'simpleserver', 'simpleclient',
'simpleclientserver',
- 'directpairingclient',
'devicediscoveryserver', 'devicediscoveryclient',
'simpleserverHQ', 'simpleclientHQ',
]
light_introspection_json = examples_env.Install(examples_env.get('BUILD_DIR') + '/resource/examples/',
examples_env.get('SRC_DIR') + '/resource/examples/' + 'light_introspection.json')
-directpairingdat = examples_env.Install(examples_env.get('BUILD_DIR') + '/resource/examples/',
- examples_env.get('SRC_DIR') + '/resource/examples/' + 'oic_svr_db_client_directpairing.dat')
-
-examples += [clientjson, serverjson, directpairingdat]
+examples += [clientjson, serverjson]
if target_os in ['msys_nt', 'windows']:
winUIClient = examples_env.Program('winUIClient', ['winuiclientgui.cpp', 'winuiclient.cpp'])
+++ /dev/null
-/* *****************************************************************
- *
- * Copyright 2016 Samsung Electronics All Rights Reserved.
- *
- *
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * *****************************************************************/
-
-#include <stdio.h>
-#include <string.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <string>
-#include <map>
-#include <cstdlib>
-#include <mutex>
-#include <condition_variable>
-
-#include "logger.h"
-#include "oic_malloc.h"
-#include "oic_string.h"
-#include "OCPlatform.h"
-#include "OCApi.h"
-
-#define MAX_PERMISSION_LENGTH (5)
-#define CREATE (1)
-#define READ (2)
-#define UPDATE (4)
-#define DELETE (8)
-#define NOTIFY (16)
-#define DASH '-'
-#define PREDEFINED_TIMEOUT (10)
-#define MAX_OWNED_DEVICE (10)
-#define TAG "provisioningclient"
-
-#define JSON_DB_PATH "./oic_svr_db_client.json"
-#define DAT_DB_PATH "./oic_svr_db_client.dat"
-#define DEV_STATUS_ON "DEV_STATUS_ON"
-#define DEV_STATUS_OFF "DEV_STATUS_OFF"
-
-#define DP_DISCOVERY_TIMEOUT 4
-#define DP_PIN_LENGTH 8
-
-#define BOLD_BEGIN "\033[1m"
-#define RED_BEGIN "\033[1;31m"
-#define GREEN_BEGIN "\033[1;92m"
-#define COLOR_END "\033[0m"
-
-using namespace OC;
-
-static int ask = 1;
-static PairedDevices discoveredDeviceList, pairedDeviceList;
-
-static FILE* client_open(const char* path, const char* mode)
-{
- if (0 == strcmp(path, OC_SECURITY_DB_DAT_FILE_NAME))
- {
- return fopen(DAT_DB_PATH, mode);
- }
- else
- {
- return fopen(path, mode);
- }
-}
-
-
-static void printMenu()
-{
- std::cout << GREEN_BEGIN "Choose an option:" COLOR_END<<std::endl;
- std::cout << GREEN_BEGIN "# 1 (DP device discovery) : discover Direct-Pairing devices"
- COLOR_END<<std::endl;
- std::cout << GREEN_BEGIN "# 2 (start Direct-Pairing) : negotiate DP method & start Direct-Pairin"
- COLOR_END<<std::endl;
- std::cout << GREEN_BEGIN "# 3 (list all device) : list all discovered/paired devices"
- COLOR_END<<std::endl;
- std::cout << GREEN_BEGIN "# 4 (send data) : send data to device" COLOR_END<<std::endl;
- std::cout << GREEN_BEGIN "# 9 (quit) : quit test " COLOR_END<<std::endl;
-}
-
-static void printPrompt()
-{
- std::cout << BOLD_BEGIN "IoTivity-DP#" COLOR_END" ";
-}
-
-static void printDevices(PairedDevices& list)
-{
- for (size_t i = 0; i < list.size(); i++)
- {
- std::cout << "["<< i+1 << "]" << " ID: " << list[i]->getDeviceID() << std::endl;
- }
-}
-
-static void findCallback(PairedDevices discoveredDevList)
-{
-
- if (0 == discoveredDevList.size())
- {
- std::cout<< "No Direct-pairing Support device Found" << std::endl;
- }
- else
- {
- std::cout << "Discovered Direct-Pairing Support Device"<< std::endl;
- discoveredDeviceList = discoveredDevList;
- printDevices(discoveredDevList);
- }
-
- printMenu();
- printPrompt();
- fflush(NULL);
-}
-
-static bool printPairingMethod(int choice)
-{
- if (NULL == discoveredDeviceList[choice])// || false == discoveredDeviceList[choice]->edp)
- {
- std::cout<< "Invalid device or Not support direct-pairing..\n\n" << std::endl;
- return false;
- }
-
- auto prms = discoveredDeviceList[choice]->getPairingMethods();
- if (0 == prms.size())
- {
- std::cout << "Not exist any support method..\n\n" << std::endl;
- return false;
- }
-
- bool ret = true;
- std::cout << "\n* List of supported pairing methods *" << std::endl;
-
- for (unsigned int i = 0; i < prms.size(); i++)
- {
- std::cout<< "[" << i+1 << "]";
- switch (prms[i])
- {
- case DP_PRE_CONFIGURED:
- std::cout<<"Pre-Configured PIN"<<std::endl;;
- break;
- case DP_RANDOM_PIN:
- std::cout<<"Random PIN"<<std::endl;;
- break;
- default:
- std::cout<<"NOT Allowed ("<< prms[i]<<")"<<std::endl;
- ret = false;
- break;
- }
- std::cout<<std::endl;
- }
-
- return ret;
-}
-
-static void resultCallback(std::shared_ptr<OCDirectPairing> ptr, OCStackResult result)
-{
-
- if (OC_STACK_OK == result)
- {
- std::cout << " Direct-Pairing SUCCESS" << std::endl;
- std::cout << "Taget Add info:" << ptr->getHost() << std::endl;
- }
- else {
- std::cout <<" Direct-Pairing FAILED" << std::endl;
- }
-
- printMenu();
- printPrompt();
- fflush(NULL);
-}
-
-static void pairedDevListCB(PairedDevices pairedDevList)
-{
-
- if (0 == pairedDevList.size())
- {
- std::cout << "No Paired Devcie Found" << std::endl;
- }
- else
- {
- pairedDeviceList = pairedDevList;
- printDevices(pairedDevList);
- }
-
- printMenu();
- printPrompt();
- fflush(NULL);
-}
-
-static void getCallback(const HeaderOptions& headerOptions, const OCRepresentation& rep, const int eCode)
-{
- (void)(headerOptions);
- try
- {
- if (OC_STACK_OK == eCode)
- {
- std::cout << "Callback Context for GET query recvd successfully" << std::endl;
- std::cout << "Resource URI: " << rep.getUri() << std::endl;
-
- bool state = false;
- int power = 0;
- rep.getValue("state", state);
- rep.getValue("power", power);
-
- std::cout << "\tstate: " << state << std::endl;
- std::cout << "\tpower: " << power << std::endl;
- }
- else
- {
- std::cout << "getCallback Response error: " << eCode << std::endl;
- }
- }
- catch(std::exception& e)
- {
- std::cout << "Exception: " << e.what() << " in onGet" << std::endl;
- }
-}
-
-static bool InputPIN(std::string& pin)
-{
- std::cout <<" > Enter PIN Number for authentication (ex - '00000000' [8 digit] ):" ;
-
- std::cin >> pin;
-
- if (pin.size() != DP_PIN_LENGTH)
- {
- std::cout<<"Invalid PIN"<<std::endl;
- return false;
- }
-
- return true;
-}
-
-int main(void)
-{
- OCPersistentStorage ps {client_open, fread, fwrite, fclose, unlink };
-
- // Create PlatformConfig object
- PlatformConfig cfg {
- OC::ServiceType::InProc,
- OC::ModeType::Both,
- &ps
- };
-
- OCPlatform::Configure(cfg);
-
- try
- {
- OC_VERIFY(OCPlatform::start() == OC_STACK_OK);
-
- unsigned int choice;
- for (int out = 0; !out;)
- {
- if (ask)
- {
- printMenu();
- printPrompt();
- fflush(NULL);
- }
- std::cin >> choice;
-
- switch(choice) {
- case 1:
- {
- OCStackResult result = OC::OCPlatform::findDirectPairingDevices(
- DP_DISCOVERY_TIMEOUT, findCallback);
-
- if (OC_STACK_NO_RESOURCE == result)
- {
- std::cout << "!! No Direct-Pairing Support Device found"<<std::endl;
- break;
- }
-
- if (OC_STACK_OK != result)
- {
- std::cout << "!!Error - findDirectPairingDevices failed."<<std::endl;
- }
- ask = 0;
- break;
- }
- case 2:
- {
- unsigned int pMethodIDx = 0;
- std::string pin("");
-
- std::cout << "- Negotiate DP method & Start Direct-Pairing - ";
- std::cout << "* List of discovered device" << std::endl;
- printDevices(discoveredDeviceList);
- std::cout << " > Enter Peer Device Number to initiate Direct-Pairing:" << std::endl;
- printPrompt();
- std::cin >> choice;
- if (choice < 1 || choice > discoveredDeviceList.size())
- {
- std::cout << "!!Device Number is incorrect, Try Again" << std::endl;
- break;
- }
- OCPrm_t pmSel = DP_NOT_ALLOWED;
- choice--;
- if (false == printPairingMethod(choice))
- {
- std::cout << "Target does not support the Direct-Pairing" << std::endl;
- break;
- }
-
- std::cout << " > Enter pairing method: "<< std::endl;
- printPrompt();
- std::cin >> pMethodIDx;
- auto prms = discoveredDeviceList[choice]->getPairingMethods();
- if (0 == pMethodIDx || prms.size() < pMethodIDx)
- {
- std::cout <<"Invalid mode selection" << std::endl;
- break;
- }
-
- pmSel = prms[pMethodIDx - 1];
- if (false == InputPIN(pin))
- {
- break;
- }
-
- OCStackResult result = OC::OCPlatform::doDirectPairing(discoveredDeviceList[choice], pmSel, pin, resultCallback);
-
- if (OC_STACK_OK != result)
- {
- std::cout << "!!Error - doDirectPairing failed." << std::endl;
- }
- ask = 0;
- break;
- }
- case 3:
- {
- std::cout << "- List all discovered and paired devices) -";
- std::cout << " > List of discovered devices" << std::endl;
- printDevices(discoveredDeviceList);
- std::cout << std::endl;
-
- std::cout << " > List of paired devices" << std::endl;
- OCStackResult result = OC::OCPlatform::getDirectPairedDevices(pairedDevListCB);
- printDevices(pairedDeviceList);
- std::cout << std::endl;
-
- if (OC_STACK_NO_RESOURCE == result)
- {
- std::cout << "!! No Paired device found"<<std::endl;
- break;
- }
- if (OC_STACK_OK != result)
- {
- std::cout << "!!Error - getDirectPairedDevices failed."<<std::endl;
- }
- break;
- }
- case 4:
- {
- std::cout << "- Send data(GET Request) to device(led server) -" << std::endl;
- printDevices(pairedDeviceList);
- pairedDeviceList = discoveredDeviceList;
- printMenu();
- std::cout << "Enter device number to GET data: ";
- std::cin >> choice;
- choice--;
-
- std::vector<std::string> ledTypes = {"core.led"};
- std::vector<std::string> ifaces = {DEFAULT_INTERFACE};
-
- OCConnectivityType ct = pairedDeviceList[choice]->getConnType();
-
- std::cout << "\n\n HOST address is : " << pairedDeviceList[choice]->getHost() << "\n\n";
- OCResource::Ptr led = OC::OCPlatform::constructResourceObject(
- pairedDeviceList[choice]->getHost(),
- "/a/led", ct, false, ledTypes, ifaces);
-
- if(!led)
- {
- std::cout << "Error: Led Object construction returned null" << std::endl;
- break;
- }
- OCStackResult res = led->get(QueryParamsMap(), getCallback);
-
- if (OC_STACK_OK != res)
- {
- std::cout << "Error: get Failed for Led" << std::endl;
- }
- break;
- }
- case 9:
- {
- out = 1;
- break;
- }
- default:
- {
- std::cout << GREEN_BEGIN "Wrong Option : Try Again" COLOR_END << std::endl;
- printMenu();
- printPrompt();
- break;
- }
- }
- }
-
- OC_VERIFY(OCPlatform::stop() == OC_STACK_OK);
- }
- catch(OCException& e)
- {
- oclog() << "Exception in main: "<< e.what();
- }
-
- return 0;
-}
virtual OCStackResult GetDefaultQos(QualityOfService& qos) = 0;
- virtual OCStackResult FindDirectPairingDevices(unsigned short waittime,
- GetDirectPairedCallback& callback) = 0;
-
- virtual OCStackResult GetDirectPairedDevices(GetDirectPairedCallback& callback) = 0;
-
- virtual OCStackResult DoDirectPairing(std::shared_ptr< OCDirectPairing > peer,
- const OCPrm_t& pmSel, const std::string& pinNumber,
- DirectPairingCallback& resultCallback) = 0;
-
#ifdef WITH_MQ
virtual OCStackResult ListenForMQTopic(
const OCDevAddr& devAddr,
ObserveContext(ObserveCallback cb) : callback(cb){}
};
- struct DirectPairingContext
- {
- DirectPairingCallback callback;
- DirectPairingContext(DirectPairingCallback cb) : callback(cb){}
-
- };
-
#ifdef WITH_MQ
struct MQTopicContext
{
OCStackResult GetDefaultQos(QualityOfService& QoS);
- virtual OCStackResult FindDirectPairingDevices(unsigned short waittime,
- GetDirectPairedCallback& callback);
-
- virtual OCStackResult GetDirectPairedDevices(GetDirectPairedCallback& callback);
-
- virtual OCStackResult DoDirectPairing(std::shared_ptr<OCDirectPairing> peer, const OCPrm_t& pmSel,
- const std::string& pinNumber, DirectPairingCallback& resultCallback);
-
#ifdef WITH_MQ
virtual OCStackResult ListenForMQTopic(
const OCDevAddr& devAddr,
OCPayload* assembleSetResourcePayload(const OCRepresentation& attributes);
OCHeaderOption* assembleHeaderOptions(OCHeaderOption options[],
const HeaderOptions& headerOptions);
- void convert(const OCDPDev_t *list, PairedDevices& dpList);
std::thread m_listeningThread;
bool m_threadRun;
std::weak_ptr<std::recursive_mutex> m_csdkLock;
class OCResource;
class OCResourceRequest;
class OCResourceResponse;
- class OCDirectPairing;
} // namespace OC
namespace OC
const std::string GROUP_INTERFACE = "oic.mi.grp";
//Typedef for list direct paired devices
- typedef std::vector<std::shared_ptr<OCDirectPairing>> PairedDevices;
typedef std::function<void(std::shared_ptr<OCResource>)> FindCallback;
typedef std::function<void(const HeaderOptions&,
const OCRepresentation&, const int, const int)> ObserveCallback;
- typedef std::function<void(std::shared_ptr<OCDirectPairing>, OCStackResult)> DirectPairingCallback;
-
- typedef std::function<void(const PairedDevices&)> GetDirectPairedCallback;
-
typedef std::function<void(const int, const std::string&,
std::shared_ptr<OCResource>)> MQTopicCallback;
} // namespace OC
+++ /dev/null
-//******************************************************************
-//
-// Copyright 2016 Samsung Electronics All Rights Reserved.
-//
-//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-
-#ifndef OC_DIRECT_PAIRING_H_
-#define OC_DIRECT_PAIRING_H_
-#include <OCApi.h>
-
-namespace OC
-{
- class OCDirectPairing
- {
- public:
- OCDirectPairing(OCDPDev_t *ptr);
- /**
- * Function to get the host address of direct pairing device.
- *
- * @return Returns host address in the format
- * <coaps>:IP:securePort
- */
- std::string getHost();
-
- /**
- * Function to get the device ID of the direct pairing device.
- *
- * @return Returns device ID (UUID)
- */
- std::string getDeviceID();
-
- /**
- * Function to get the pairing methods supported by direct pairing device.
- *
- * @return Returns vector of pairing methods supported.
- * DP_NOT_ALLOWED
- * DP_PRE_CONFIGURED
- * DP_RANDOM_PIN
- */
- std::vector<OCPrm_t> getPairingMethods();
-
- /**
- * Function to get the connectivity Type.
- *
- * @return Returns connectivity Type
- */
- OCConnectivityType getConnType();
-
- OCDPDev_t* getDev();
-
- private:
- OCDPDev_t *m_devPtr;
- };
-}
-#endif //OC_DIRECT_PAIRING_H_
*/
OCStackResult sendResponse(const std::shared_ptr<OCResourceResponse> pResponse);
- /**
- * Find all the Direct Pairing capable devices.
- *
- * @param waittime timeoutbefore the callback is called
- * @param callback function to callback with discovered devices after timeout
- *
- * @return Returns ::OC_STACK_OK if success
- */
- OCStackResult findDirectPairingDevices(unsigned short waittime,
- GetDirectPairedCallback callback);
-
- /**
- * Get all the Direct paired devices.
- *
- * @param callback function to callback with the list of paired devices
- *
- * @return Returns ::OC_STACK_OK if success
- */
- OCStackResult getDirectPairedDevices(GetDirectPairedCallback callback);
-
- /**
- * Perform the Direct Pairing with the selected peer device
- *
- * @param peer device to direct pair with
- * @param pmSel Selected pairing method
- * @param pinNumber pin to validate peer & perform the direct pairing
- * @param resultCallback callback function that will get the result of the operation
- *
- * @return Returns ::OC_STACK_OK if success
- */
- OCStackResult doDirectPairing(std::shared_ptr<OCDirectPairing> peer, OCPrm_t pmSel,
- const std::string& pinNumber,
- DirectPairingCallback resultCallback);
#ifdef WITH_CLOUD
/**
* Create an account manager object that can be used for doing request to account server.
#include "OCResourceRequest.h"
#include "OCResourceResponse.h"
#include "OCRepresentation.h"
-#include "OCDirectPairing.h"
#ifdef WITH_CLOUD
#include "OCAccountManager.h"
OCStackResult sendResponse(const std::shared_ptr<OCResourceResponse> pResponse);
std::weak_ptr<std::recursive_mutex> csdkLock();
- OCStackResult findDirectPairingDevices(unsigned short waittime,
- GetDirectPairedCallback callback);
-
- OCStackResult getDirectPairedDevices(GetDirectPairedCallback callback);
-
- OCStackResult doDirectPairing(std::shared_ptr<OCDirectPairing> peer, OCPrm_t pmSel,
- const std::string& pinNumber,
- DirectPairingCallback resultCallback);
#ifdef WITH_CLOUD
OCAccountManager::Ptr constructAccountManagerObject(const std::string& host,
OCConnectivityType connectivityType);
OCStackResult removeDevice(unsigned short waitTimeForOwnedDeviceDiscovery,
ResultCallBack resultCallback);
- /**
- * API to provision DirectPairing to devices.
- *
- * @param pconf pointer to PCONF (Pairing Configuration).
- * @param resultCallback Callback will be called when provisioning request receives
- * a response from first resource server.
- * @return ::OC_STACK_OK in case of success and other value otherwise.
- */
- OCStackResult provisionDirectPairing(const OicSecPconf_t *pconf,
- ResultCallBack resultCallback);
-
#if defined(__WITH_DTLS__) || defined(__WITH_TLS__)
/**
* API to provision cert.
virtual OCStackResult GetDefaultQos(QualityOfService& /*QoS*/)
{return OC_STACK_NOTIMPL;}
- virtual OCStackResult FindDirectPairingDevices(unsigned short /*waittime*/,
- GetDirectPairedCallback& /*callback*/)
- {return OC_STACK_NOTIMPL;}
-
- virtual OCStackResult GetDirectPairedDevices(GetDirectPairedCallback& /*callback*/)
- {return OC_STACK_NOTIMPL;}
-
- virtual OCStackResult DoDirectPairing(std::shared_ptr<OCDirectPairing> /*peer*/,
- const OCPrm_t& /*pmSel*/,
- const std::string& /*pinNumber*/, DirectPairingCallback& /*resultCallback*/)
- {return OC_STACK_NOTIMPL;}
-
#ifdef WITH_MQ
virtual OCStackResult ListenForMQTopic(const OCDevAddr& /*devAddr*/,
const std::string& /*resourceUri*/,
DeviceList_t pUnownedDevList, pOwnedDevList, pMOTEnabledDeviceList;
static int transferDevIdx, ask = 1;
-static OicSecPconf_t g_pconf;
static uint16_t g_credId = 0;
static FILE* client_open(const char *path, const char *mode)
std::cout << " 9. Remove Device using UUID"<<std::endl;
std::cout << " 10. Get Linked Devices"<<std::endl;
std::cout << " 11. Get Device Status"<<std::endl;
- std::cout << " 12. Provision Direct-Pairing Configuration"<<std::endl;
#if defined(__WITH_DTLS__) || defined(__WITH_TLS__)
- std::cout << " 13. Save the Trust Cert. Chain into Cred of SVR"<<std::endl;
- std::cout << " 14. Provision the Trust Cert. Chain"<<std::endl;
- std::cout << " 15. Read trust cert chain"<<std::endl;
+ std::cout << " 12. Save the Trust Cert. Chain into Cred of SVR"<<std::endl;
+ std::cout << " 13. Provision the Trust Cert. Chain"<<std::endl;
+ std::cout << " 14. Read trust cert chain"<<std::endl;
#endif // __WITH_DTLS__ || __WITH_TLS__
#ifdef MULTIPLE_OWNER
- std::cout << " 16. Change Multiple Ownership Transfer Mode"<<std::endl;
- std::cout << " 17. Select OxM method for Multiple Ownership Transfer"<<std::endl;
- std::cout << " 18. Multiple Ownership Transfer Enabled Devices Discovery"<<std::endl;
- std::cout << " 19. Provision pre configure PIN for Multiple Ownership Transfer Mode"<<std::endl;
- std::cout << " 20. Add pre configure PIN for Multiple Ownership Transfer Mode"<<std::endl;
+ std::cout << " 15. Change Multiple Ownership Transfer Mode"<<std::endl;
+ std::cout << " 16. Select OxM method for Multiple Ownership Transfer"<<std::endl;
+ std::cout << " 17. Multiple Ownership Transfer Enabled Devices Discovery"<<std::endl;
+ std::cout << " 18. Provision pre configure PIN for Multiple Ownership Transfer Mode"<<std::endl;
+ std::cout << " 19. Add pre configure PIN for Multiple Ownership Transfer Mode"<<std::endl;
#endif
- std::cout << " 21. Configure SVRdb as Self-OwnerShip"<<std::endl;
+ std::cout << " 20. Configure SVRdb as Self-OwnerShip"<<std::endl;
std::cout << " 99. Exit loop"<<std::endl;
}
return 0;
}
-static void deletePconf()
-{
- OICFree(g_pconf.prm);
- //free pdacl
- OicSecPdAcl_t* acl = g_pconf.pdacls;
- if (acl)
- {
- /* Clean Resources */
- for (unsigned int i = 0; i < (acl)->resourcesLen; i++)
- {
- OICFree((acl)->resources[i]);
- }
- OICFree((acl)->resources);
-
- /* Clean ACL node itself */
- /* Required only if acl was created in heap */
- OICFree((acl));
- }
- memset(&g_pconf, 0, sizeof(OicSecPconf_t));
-}
-
static OicSecPdAcl_t* InputPdACL()
{
int ret;
return acl;
}
-void provisionDirectPairingCB(PMResultList_t *result, int hasError)
-{
- if (hasError)
- {
- std::cout << "Error in provisioning operation!"<<std::endl;
- }
- else
- {
- std::cout<< "\nReceived provisioning results: Direct Pairing is successful ";
- for (unsigned int i = 0; i < result->size(); i++)
- {
- std::cout << "Result is = " << result->at(i).res <<" for device ";
- printUuid(result->at(i).deviceId);
- }
-
- delete result;
- }
- deletePconf();
- printMenu();
- ask = 1;
-}
-
-static void provisionDP(int dev_num)
-{
- OCStackResult rst;
- std::string pin("");
-
- // set enable dp
- g_pconf.edp = true;
-
- // set default supported PRM types
- g_pconf.prmLen = sizeof(SUPPORTED_PRMS)/sizeof(OicSecPrm_t);
- g_pconf.prm = (OicSecPrm_t *)OICCalloc(g_pconf.prmLen, sizeof(OicSecPrm_t));
- if(g_pconf.prm)
- {
- for (size_t i=0; i < g_pconf.prmLen; i++)
- {
- g_pconf.prm[i] = SUPPORTED_PRMS[i];
- }
- }
- else
- {
- OIC_LOG(ERROR, TAG, "create prm error return");
- goto PVDP_ERROR;
- }
-
- std::cout << "Enter PIN to be configured: ";
- while (1)
- {
- std::cin >> pin;
- if (pin.length() == DP_PIN_LENGTH)
- {
- break;
- }
- else
- {
- std::cout << "PIN length should be 8, Enter again: ";
- }
- }
-
- memcpy(g_pconf.pin.val, pin.c_str(), DP_PIN_LENGTH);
-
- // set default pdacl
-
- g_pconf.pdacls = InputPdACL();
- if(!g_pconf.pdacls)
- {
- OIC_LOG(ERROR, TAG, "InputPdACL error return");
- goto PVDP_ERROR;
- }
-
- // call |OCProvisionDirectPairing| API actually
- // calling this API with callback actually acts like blocking
- // for error checking, the return value saved and printed
- rst = pOwnedDevList[dev_num-1]->provisionDirectPairing(&g_pconf, provisionDirectPairingCB);
- if(OC_STACK_OK != rst)
- {
- OIC_LOG_V(ERROR, TAG, "OCProvisionDirectPairing API error: %d", rst);
- if (OC_STACK_UNAUTHORIZED_REQ == rst)
- {
- OIC_LOG(ERROR, TAG, "Target Server NOT Support Direct-Pairing !!! (DPC == false)");
- }
- goto PVDP_ERROR;
- }
- return;
-
-PVDP_ERROR:
- deletePconf(); // after here |acl| points nothing
- ask = 1;
-}
-
OCStackResult displayMutualVerifNumCB(uint8_t mutualVerifNum[MUTUAL_VERIF_NUM_LEN])
{
OC_UNUSED(mutualVerifNum);
break;
}
- case 12:
- {
- unsigned int devNum;
-
- if (!pOwnedDevList.size())
- {
- std::cout <<"There are no Owned devices yet,"
- " may need to discover"<<std::endl;
- break;
- }
-
- for (unsigned int i = 0; i < pOwnedDevList.size(); i++ )
- {
- std::cout << i+1 << ": "<< pOwnedDevList[i]->getDeviceID() <<" From IP:";
- std::cout << pOwnedDevList[i]->getDevAddr() <<std::endl;
- }
-
- std::cout <<"Select device number: "<<std::endl;
- std::cin >> devNum;
- if (devNum > pOwnedDevList.size())
- {
- std::cout <<"Invalid device number"<<std::endl;
- break;
- }
-
- ask = 0;
- provisionDP(devNum);
-
- break;
- }
#if defined(__WITH_DTLS__) || defined(__WITH_TLS__)
- case 13:
+ case 12:
{
std::cout<< "registering cert chain change notifier"<<std::endl;
OCSecure::registerTrustCertChangeNotifier(certChainCallBack);
OCSecure::removeTrustCertChangeNotifier();
break;
}
- case 14:
+ case 13:
{
int index;
}
break;
}
- case 15:
+ case 14:
{
if (0==g_credId)
{
}
#endif //__WITH_DTLS__ || __WITH_TLS__
#ifdef MULTIPLE_OWNER
- case 16:
+ case 15:
{
if (!pOwnedDevList.size() && !pMOTEnabledDeviceList.size())
{
}
break;
}
- case 17:
+ case 16:
{
if (!pMOTEnabledDeviceList.size())
{
}
break;
}
- case 18:
+ case 17:
{
pMOTEnabledDeviceList.clear();
std::cout << "Started MOT Enabled device discovery..." <<std::endl;
}
break;
}
- case 19:
+ case 18:
{
if (!pMOTEnabledDeviceList.size())
{
}
break;
}
- case 20:
+ case 19:
{
if (!pMOTEnabledDeviceList.size())
{
break;
}
#endif //MULTIPLE_OWNER
- case 21:
+ case 20:
{
OCStackResult result;
result = OCSecure::configSelfOwnership();
return result;
}
- OCStackResult OCSecureResource::provisionDirectPairing( const OicSecPconf_t* pconf,
- ResultCallBack resultCallback)
- {
- if (!pconf)
- {
- oclog() <<"PCONF can't be null";
- return OC_STACK_INVALID_PARAM;
- }
- if (!resultCallback)
- {
- oclog() <<"result callback can not be null";
- return OC_STACK_INVALID_CALLBACK;
- }
-
- OCStackResult result;
- auto cLock = m_csdkLock.lock();
-
- if (cLock)
- {
- ProvisionContext* context = new ProvisionContext(resultCallback);
-
- std::lock_guard<std::recursive_mutex> lock(*cLock);
- result = OCProvisionDirectPairing(static_cast<void*>(context),
- devPtr, const_cast<OicSecPconf_t*>(pconf),
- &OCSecureResource::callbackWrapper);
- }
- else
- {
- oclog() <<"Mutex not found";
- result = OC_STACK_ERROR;
- }
- return result;
- }
-
#if defined(__WITH_DTLS__) || defined(__WITH_TLS__)
OCStackResult OCSecureResource::provisionTrustCertChain(OicSecCredType_t type, uint16_t credId,
ResultCallBack resultCallback)
OICFree(acl2);
}
- TEST(ProvisionDirectPairingTest, ProvisionDirectPairingTestNullPconf)
- {
- OCSecureResource device;
- EXPECT_EQ(OC_STACK_INVALID_PARAM, device.provisionDirectPairing(nullptr, resultCallback));
- }
-
- TEST(ProvisionDirectPairingTest, ProvisionDirectPairingTestNullCallback)
- {
- OCSecureResource device;
- OicSecPconf_t *pconf = (OicSecPconf_t *)OICCalloc(1,sizeof(OicSecPconf_t));
- EXPECT_EQ(OC_STACK_INVALID_CALLBACK, device.provisionDirectPairing(pconf, nullptr));
- OICFree(pconf);
- }
-
- TEST(ProvisionDirectPairingTest, ProvisionDirectPairingTestNullCallbackNUllPconf)
- {
- OCSecureResource device;
- EXPECT_EQ(OC_STACK_INVALID_PARAM, device.provisionDirectPairing(nullptr, nullptr));
- }
#if defined(__WITH_DTLS__) || defined(__WITH_TLS__)
TEST(setDeviceIdSeed, NullParam)
{
return options;
}
- std::shared_ptr<OCDirectPairing> cloneDevice(const OCDPDev_t* dev)
- {
- if (!dev)
- {
- return nullptr;
- }
-
- OCDPDev_t* result = new OCDPDev_t(*dev);
- result->prm = new OCPrm_t[dev->prmLen];
- memcpy(result->prm, dev->prm, sizeof(OCPrm_t)*dev->prmLen);
- return std::shared_ptr<OCDirectPairing>(new OCDirectPairing(result));
- }
-
- void InProcClientWrapper::convert(const OCDPDev_t *list, PairedDevices& dpList)
- {
- while(list)
- {
- dpList.push_back(cloneDevice(list));
- list = list->next;
- }
- }
-
- OCStackResult InProcClientWrapper::FindDirectPairingDevices(unsigned short waittime,
- GetDirectPairedCallback& callback)
- {
- if (!callback || 0 == waittime)
- {
- return OC_STACK_INVALID_PARAM;
- }
-
- OCStackResult result = OC_STACK_ERROR;
- const OCDPDev_t *list = nullptr;
- PairedDevices dpDeviceList;
-
- auto cLock = m_csdkLock.lock();
-
- if (cLock)
- {
- std::lock_guard<std::recursive_mutex> lock(*cLock);
-
- list = OCDiscoverDirectPairingDevices(waittime);
- if (NULL == list)
- {
- result = OC_STACK_NO_RESOURCE;
- oclog() << "findDirectPairingDevices(): No device found for direct pairing"
- << std::flush;
- }
- else {
- OIC_LOG_V(DEBUG, TAG, "%s: call response callback", __func__);
- convert(list, dpDeviceList);
- std::thread exec(callback, dpDeviceList);
- exec.detach();
- result = OC_STACK_OK;
- }
- }
- else
- {
- result = OC_STACK_ERROR;
- }
-
- return result;
- }
-
- OCStackResult InProcClientWrapper::GetDirectPairedDevices(GetDirectPairedCallback& callback)
- {
- if (!callback)
- {
- return OC_STACK_INVALID_PARAM;
- }
-
- OCStackResult result = OC_STACK_ERROR;
- const OCDPDev_t *list = nullptr;
- PairedDevices dpDeviceList;
-
- auto cLock = m_csdkLock.lock();
-
- if (cLock)
- {
- std::lock_guard<std::recursive_mutex> lock(*cLock);
-
- list = OCGetDirectPairedDevices();
- if (NULL == list)
- {
- result = OC_STACK_NO_RESOURCE;
- OIC_LOG_V(DEBUG, TAG, "%s: No device found for direct pairing", __func__);
- }
- else {
- OIC_LOG_V(DEBUG, TAG, "%s: call response callback", __func__);
- convert(list, dpDeviceList);
- std::thread exec(callback, dpDeviceList);
- exec.detach();
- result = OC_STACK_OK;
- }
- }
- else
- {
- result = OC_STACK_ERROR;
- }
-
- return result;
- }
-
- void directPairingCallback(void *ctx, OCDPDev_t *peer,
- OCStackResult result)
- {
-
- ClientCallbackContext::DirectPairingContext* context =
- static_cast<ClientCallbackContext::DirectPairingContext*>(ctx);
-
- OIC_LOG_V(DEBUG, TAG, "%s: call response callback", __func__);
- std::thread exec(context->callback, cloneDevice(peer), result);
- exec.detach();
- }
-
- OCStackResult InProcClientWrapper::DoDirectPairing(std::shared_ptr<OCDirectPairing> peer,
- const OCPrm_t& pmSel, const std::string& pinNumber, DirectPairingCallback& callback)
- {
- if (!peer || !callback)
- {
- oclog() << "Invalid parameters" << std::flush;
- return OC_STACK_INVALID_PARAM;
- }
-
- OCStackResult result = OC_STACK_ERROR;
- ClientCallbackContext::DirectPairingContext* context =
- new ClientCallbackContext::DirectPairingContext(callback);
-
- auto cLock = m_csdkLock.lock();
- if (cLock)
- {
- std::lock_guard<std::recursive_mutex> lock(*cLock);
- result = OCDoDirectPairing(static_cast<void*>(context), peer->getDev(),
- pmSel, const_cast<char*>(pinNumber.c_str()), directPairingCallback);
- delete context;
- }
- else
- {
- delete context;
- result = OC_STACK_ERROR;
- }
- return result;
- }
}
+++ /dev/null
-//******************************************************************
-//
-// Copyright 2016 Samsung Electronics All Rights Reserved.
-//
-//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-
-#include "OCDirectPairing.h"
-#include <iomanip>
-
-namespace OC
-{
- static const char COAP[] = "coap://";
- static const char COAPS[] = "coaps://";
- static const int UUID_LENGTH = (128/8); //UUID length
-
- OCDirectPairing::OCDirectPairing(OCDPDev_t *ptr):m_devPtr(ptr)
- {
- }
-
- std::string OCDirectPairing::getHost()
- {
- bool ipv6 = false;
- std::ostringstream host("");
- if (m_devPtr->connType & CT_IP_USE_V6)
- {
- ipv6 = true;
- }
-
- host << COAPS << (ipv6?"[":"") << m_devPtr->endpoint.addr;
- host << (ipv6?"]:":":") << m_devPtr->securePort;
-
- return host.str();
- }
-
- std::string OCDirectPairing::getDeviceID()
- {
- std::ostringstream deviceId("");
-
- for (int i = 0; i < UUID_LENGTH; i++)
- {
- if (i == 4 || i == 6 || i == 8 || i == 10)
- {
- deviceId << '-';
- }
- deviceId << std::hex << std::setfill('0') << std::setw(2) << static_cast<unsigned>(m_devPtr->deviceID.id[i]);
- }
-
- return deviceId.str();
- }
-
- std::vector<OCPrm_t> OCDirectPairing::getPairingMethods()
- {
- std::vector<OCPrm_t> prms;
-
- for (size_t i = 0; i < m_devPtr->prmLen; i++)
- {
- prms.push_back(m_devPtr->prm[i]);
- }
- return prms;
- }
-
- OCConnectivityType OCDirectPairing::getConnType()
- {
- return m_devPtr->connType;
- }
-
- OCDPDev_t* OCDirectPairing::getDev()
- {
- return m_devPtr;
- }
-}
return OCPlatform_impl::Instance().sendResponse(pResponse);
}
- OCStackResult findDirectPairingDevices(unsigned short waittime,
- GetDirectPairedCallback directPairingHandler)
- {
- return OCPlatform_impl::Instance().findDirectPairingDevices(waittime,
- directPairingHandler);
- }
-
- OCStackResult getDirectPairedDevices(GetDirectPairedCallback directPairingHandler)
- {
- return OCPlatform_impl::Instance().getDirectPairedDevices(directPairingHandler);
- }
-
- OCStackResult doDirectPairing(std::shared_ptr<OCDirectPairing> peer, OCPrm_t pmSel,
- const std::string& pinNumber,
- DirectPairingCallback resultCallback)
- {
- return OCPlatform_impl::Instance().doDirectPairing(peer, pmSel,
- pinNumber, resultCallback);
- }
#ifdef WITH_CLOUD
OCAccountManager::Ptr constructAccountManagerObject(const std::string& host,
OCConnectivityType connectivityType)
return m_csdkLock;
}
- OCStackResult OCPlatform_impl::findDirectPairingDevices(unsigned short waittime,
- GetDirectPairedCallback directPairingHandler)
- {
- return checked_guard(m_client, &IClientWrapper::FindDirectPairingDevices,
- waittime, directPairingHandler);
-
- }
-
- OCStackResult OCPlatform_impl::getDirectPairedDevices(
- GetDirectPairedCallback directPairingHandler)
- {
-
- return checked_guard(m_client, &IClientWrapper::GetDirectPairedDevices,
- directPairingHandler);
- }
-
- OCStackResult OCPlatform_impl::doDirectPairing(std::shared_ptr<OCDirectPairing> peer,
- OCPrm_t pmSel,
- const std::string& pinNumber,
- DirectPairingCallback resultCallback)
- {
- return checked_guard(m_client, &IClientWrapper::DoDirectPairing,
- peer, pmSel, pinNumber, resultCallback);
- }
#ifdef WITH_CLOUD
OCAccountManager::Ptr OCPlatform_impl::constructAccountManagerObject(const std::string& host,
OCConnectivityType connectivityType)
# Source files and Targets
######################################################################
oclib_src = [
- 'OCPlatform.cpp',
- 'OCPlatform_impl.cpp',
- 'OCResource.cpp',
- 'OCUtilities.cpp',
- 'OCException.cpp',
- 'OCRepresentation.cpp',
- 'InProcServerWrapper.cpp',
- 'InProcClientWrapper.cpp',
- 'OCResourceRequest.cpp',
- 'CAManager.cpp',
- 'OCDirectPairing.cpp'
-]
+ 'OCPlatform.cpp',
+ 'OCPlatform_impl.cpp',
+ 'OCResource.cpp',
+ 'OCUtilities.cpp',
+ 'OCException.cpp',
+ 'OCRepresentation.cpp',
+ 'InProcServerWrapper.cpp',
+ 'InProcClientWrapper.cpp',
+ 'OCResourceRequest.cpp',
+ 'CAManager.cpp',
+ ]
if with_cloud:
oclib_src = oclib_src + ['OCAccountManager.cpp']
oclib_env.UserInstallTargetHeader(
header_dir + 'OCUtilities.h', 'resource', 'OCUtilities.h')
-oclib_env.UserInstallTargetHeader(
- header_dir + 'CAManager.h', 'resource', 'CAManager.h')
-oclib_env.UserInstallTargetHeader(
- header_dir + 'OCDirectPairing.h', 'resource', 'OCDirectPairing.h')
+oclib_env.UserInstallTargetHeader(header_dir + 'CAManager.h', 'resource', 'CAManager.h')
if with_cloud:
oclib_env.UserInstallTargetHeader(
}
#endif
- void directPairHandler(std::shared_ptr<OCDirectPairing> /*dev*/, OCStackResult /*res*/)
- {
- }
-
- void pairedHandler(const PairedDevices& /*list*/)
- {
- }
-
//Helper methods
void DeleteStringLL(OCStringLL* ll)
{
EXPECT_EQ(OC_STACK_OK, OCPlatform::unsubscribePresence(presenceHandle));
}
#endif
-
- TEST(FindDirectPairingTest, FindDirectPairingNullCallback)
- {
- Framework framework;
- ASSERT_TRUE(OC_STACK_OK == framework.start());
- EXPECT_ANY_THROW(OCPlatform::findDirectPairingDevices(1, nullptr));
- }
-
- TEST(FindDirectPairingTest, FindDirectPairingZeroTimeout)
- {
- Framework framework;
- ASSERT_TRUE(OC_STACK_OK == framework.start());
- EXPECT_ANY_THROW(OCPlatform::findDirectPairingDevices(0, &pairedHandler));
- }
-
- TEST(GetDirectPairedTest, GetDirectPairedNullCallback)
- {
- Framework framework;
- ASSERT_TRUE(OC_STACK_OK == framework.start());
- EXPECT_ANY_THROW(OCPlatform::getDirectPairedDevices(nullptr));
- }
-
- TEST(DoDirectPairingTest, DoDirectPairingNullCallback)
- {
- Framework framework;
- ASSERT_TRUE(OC_STACK_OK == framework.start());
-
- OCDPDev_t peer;
- OCPrm_t pmSel = DP_PRE_CONFIGURED;
- std::string pin("");
- std::shared_ptr<OCDirectPairing> s_dp(new OCDirectPairing(&peer));
- EXPECT_ANY_THROW(OCPlatform::doDirectPairing(s_dp, pmSel, pin, nullptr));
- }
-
- TEST(DoDirectPairingTest, DoDirectPairingNullPeer)
- {
- Framework framework;
- ASSERT_TRUE(OC_STACK_OK == framework.start());
-
- OCDPDev_t peer;
- OCPrm_t pmSel = DP_PRE_CONFIGURED;
- std::string pin("");
- std::shared_ptr<OCDirectPairing> s_dp(new OCDirectPairing(&peer));
- EXPECT_ANY_THROW(OCPlatform::doDirectPairing(nullptr, pmSel, pin, &directPairHandler));
- }
-
- TEST(DoDirectPairingTest, DoDirectPairingNullPeerNullCallback)
- {
- Framework framework;
- ASSERT_TRUE(OC_STACK_OK == framework.start());
-
- OCDPDev_t peer;
- OCPrm_t pmSel = DP_PRE_CONFIGURED;
- std::string pin("");
- std::shared_ptr<OCDirectPairing> s_dp(new OCDirectPairing(&peer));
- EXPECT_ANY_THROW(OCPlatform::doDirectPairing(nullptr, pmSel, pin, nullptr));
- }
}