Add oic/sec/amacl to support SVR types
[platform/upstream/iotivity.git] / resource / csdk / security / src / srmutility.c
1 //******************************************************************
2 //
3 // Copyright 2015 Intel Mobile Communications GmbH All Rights Reserved.
4 //
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
6 //
7 // Licensed under the Apache License, Version 2.0 (the "License");
8 // you may not use this file except in compliance with the License.
9 // You may obtain a copy of the License at
10 //
11 //      http://www.apache.org/licenses/LICENSE-2.0
12 //
13 // Unless required by applicable law or agreed to in writing, software
14 // distributed under the License is distributed on an "AS IS" BASIS,
15 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 // See the License for the specific language governing permissions and
17 // limitations under the License.
18 //
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
20 #define _POSIX_C_SOURCE 200112L
21 #include <string.h>
22
23 #include "srmutility.h"
24 #include "srmresourcestrings.h"
25 #include "logger.h"
26 #include "oic_malloc.h"
27 #include "base64.h"
28
29 #define TAG  PCF("SRM-UTILITY")
30
31 /**
32  * This method initializes the OicParseQueryIter_t struct
33  *
34  *@param query     - REST query, to be parsed
35  *@param parseIter - OicParseQueryIter_t struct, to be initialized
36  *
37  */
38 void ParseQueryIterInit(unsigned char * query, OicParseQueryIter_t * parseIter)
39 {
40     OC_LOG (INFO, TAG, PCF("Initializing coap iterator"));
41     if((NULL == query) || (NULL == parseIter))
42         return;
43
44     parseIter->attrPos = NULL;
45     parseIter->attrLen = 0;
46     parseIter->valPos = NULL;
47     parseIter->valLen = 0;
48     coap_parse_iterator_init(query, strlen((char *)query),
49           (unsigned char *)OIC_SEC_REST_QUERY_SEPARATOR, (unsigned char *) "", 0, &parseIter->pi);
50 }
51
52
53 /**
54  * This method fills the OicParseQueryIter_t struct with next REST query's
55  * attribute's and value's information
56  *
57  *@param parseIter - OicParseQueryIter_t struct, has next query's attribute's & value's info
58  *
59  * @retval
60  *     OicParseQueryIter_t *  - has parsed query info
61  *     NULL                   - has no query to parse
62  */
63 OicParseQueryIter_t * GetNextQuery(OicParseQueryIter_t * parseIter)
64 {
65     OC_LOG (INFO, TAG, PCF("Getting Next Query"));
66     if(NULL == parseIter)
67         return NULL;
68
69     unsigned char * qrySeg = NULL;
70     char * delimPos;
71
72     //Get the next query. Querys are separated by OIC_SEC_REST_QUERY_SEPARATOR
73     qrySeg = coap_parse_next(&parseIter->pi);
74
75     if(qrySeg)
76     {
77         delimPos = strchr((char *)qrySeg, OIC_SEC_REST_QUERY_DELIMETER);
78         if(delimPos)
79         {
80             parseIter->attrPos = parseIter->pi.pos;
81             parseIter->attrLen = (unsigned char *)delimPos - parseIter->pi.pos;
82             parseIter->valPos  = (unsigned char *)delimPos + 1;
83             parseIter->valLen  = &qrySeg[parseIter->pi.segment_length] - parseIter->valPos;
84             return parseIter;
85         }
86     }
87     return NULL;
88 }
89
90
91 // TODO This functionality is replicated in all SVR's and therefore we need
92 // to encapsulate it in a common method. However, this may not be the right
93 // file for this method.
94 OCStackResult AddUuidArray(cJSON* jsonRoot, const char* arrayItem,
95                            size_t *numUuids, OicUuid_t** uuids )
96 {
97     int idxx = 0;
98     cJSON* jsonObj = cJSON_GetObjectItem(jsonRoot, arrayItem);
99     VERIFY_NON_NULL(TAG, jsonObj, ERROR);
100     VERIFY_SUCCESS(TAG, cJSON_Array == jsonObj->type, ERROR);
101
102     *numUuids = cJSON_GetArraySize(jsonObj);
103     VERIFY_SUCCESS(TAG, *numUuids > 0, ERROR);
104     *uuids = (OicUuid_t*)OICCalloc(*numUuids, sizeof(OicUuid_t));
105     VERIFY_NON_NULL(TAG, *uuids, ERROR);
106
107     do
108     {
109         unsigned char base64Buff[sizeof(((OicUuid_t*)0)->id)] = {};
110         uint32_t outLen = 0;
111         B64Result b64Ret = B64_OK;
112
113         cJSON *jsonOwnr = cJSON_GetArrayItem(jsonObj, idxx);
114         VERIFY_NON_NULL(TAG, jsonOwnr, ERROR);
115         VERIFY_SUCCESS(TAG, cJSON_String == jsonOwnr->type, ERROR);
116
117         outLen = 0;
118         b64Ret = b64Decode(jsonOwnr->valuestring, strlen(jsonOwnr->valuestring), base64Buff,
119                 sizeof(base64Buff), &outLen);
120
121         VERIFY_SUCCESS(TAG, (b64Ret == B64_OK && outLen <= sizeof((*uuids)[idxx].id)),
122                 ERROR);
123         memcpy((*uuids)[idxx].id, base64Buff, outLen);
124     } while ( ++idxx < *numUuids);
125
126     return OC_STACK_OK;
127
128 exit:
129     return OC_STACK_ERROR;
130
131 }