mbedtls error/verify code decode
[iotivity.git] / resource / csdk / security / include / srmutility.h
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
21 #ifndef IOTVT_SRM_UTILITY_H
22 #define IOTVT_SRM_UTILITY_H
23
24 #include "ocstack.h"
25 #include "experimental/securevirtualresourcetypes.h"
26 #ifdef __cplusplus
27 extern "C"
28 {
29 #endif
30 #include <coap/uri.h>
31 #ifdef __cplusplus
32 }
33 #endif
34
35 #ifdef __cplusplus
36 extern "C" {
37 #endif // __cplusplus
38 typedef struct OicParseQueryIter OicParseQueryIter_t;
39
40 /**
41  * OicRestQueryIter data structure is used for book-keeping
42  * sub-REST query's attribute's and value's, starting location &
43  * length between calls to GetNextQuery(). This struct needs
44  * to be first initialized with ParseQueryIterInit().
45  *
46  */
47 struct OicParseQueryIter
48 {
49     unsigned char * attrPos;    /**< stating location of attribute. */
50     size_t attrLen;             /**< length of the attribute. */
51     unsigned char * valPos;     /**< starting location of value. */
52     size_t valLen;              /**< length of the value. */
53     coap_parse_iterator_t pi;   /**< coap struct for tokenizing the query.*/
54 };
55
56 /**
57  * Macro to verify success of operation.
58  * eg: VERIFY_SUCCESS(TAG, OC_STACK_OK == foo(), ERROR);
59  * @note Invoking function must define "exit:" label for goto functionality to work correctly.
60  */
61 #ifndef VERIFY_SUCCESS
62 #define VERIFY_SUCCESS(tag, op, logLevel) do{ if (!(op)) \
63             {OIC_LOG((logLevel), tag, #op " failed!!"); goto exit; } }while(0)
64 #endif
65
66 /**
67  * Macro to verify a conditional, if fails, log supplied message and goto exit
68  * eg: VERIFY_SUCCESS_OR_LOG_AND_EXIT(TAG, OC_STACK_OK == foo(), ERROR);
69  * @note Invoking function must define "exit:" label for goto functionality to work correctly.
70  */
71 #define VERIFY_OR_LOG_AND_EXIT(tag, op, msg, logLevel) do{ if (!(op)) \
72             {OIC_LOG((logLevel), tag, msg); goto exit; } }while(0)
73
74 /**
75  * Macro to verify expression evaluates to bool true.
76  * eg: VERIFY_TRUE_OR_EXIT(TAG, OC_STACK_OK == foo(), ERROR);
77  * @note Invoking function must define "exit:" label for goto functionality to work correctly.
78  */
79 #ifndef VERIFY_TRUE_OR_EXIT
80 #define VERIFY_TRUE_OR_EXIT(tag, op, logLevel) do{ if (!(op)) \
81             {OIC_LOG_V((logLevel), tag, "%s:" #op "evaluates to false!",__func__); \
82             goto exit; } }while(0)
83 #endif
84
85 /**
86  * Macro to verify success of operation.
87  * eg: VERIFY_SUCCESS_RETURN(TAG, OC_STACK_OK == foo(), ERROR, OC_STACK_ERROR);
88  */
89 #ifndef VERIFY_SUCCESS_RETURN
90 #define VERIFY_SUCCESS_RETURN(tag, op, logLevel, retValue) do { if (!(op)) \
91             {OIC_LOG((logLevel), tag, #op " failed!!"); return retValue;} } while(0)
92 #endif
93
94 /**
95  * Macro to verify argument is not equal to NULL.
96  * eg: VERIFY_NOT_NULL(TAG, ptrData, ERROR);
97  * @note Invoking function must define "exit:" label for goto functionality to work correctly.
98  */
99 #ifndef VERIFY_NOT_NULL
100 #define VERIFY_NOT_NULL(tag, arg, logLevel) do{ if (NULL == (arg)) \
101             { OIC_LOG((logLevel), tag, #arg " is NULL"); goto exit; } }while(0)
102 #endif
103
104 /**
105  * Macro to verify argument is not equal to NULL.
106  * eg: VERIFY_NOT_NULL_RETURN(TAG, ptrData, ERROR, OC_STACK_ERROR);
107  */
108 #ifndef VERIFY_NOT_NULL_RETURN
109 #define VERIFY_NOT_NULL_RETURN(tag, arg, logLevel, retValue) do { if (NULL == (arg)) \
110             { OIC_LOG((logLevel), tag, #arg " is NULL"); return retValue; } } while(0)
111 #endif
112 /**
113  * This method initializes the @ref OicParseQueryIter_t struct.
114  *
115  * @param query is the REST query, to be parsed.
116  * @param parseIter is the @ref OicParseQueryIter_t struct, to be initialized based on the query.
117  */
118 void ParseQueryIterInit(const unsigned char * query, OicParseQueryIter_t * parseIter);
119
120 /**
121  * This method fills the @ref OicParseQueryIter_t struct with next REST query's
122  * attribute's and value's information.
123  *
124  * @param parseIter is the @ref OicParseQueryIter_t struct, has next query's attribute's
125  *  & value's info.
126  *
127  * @return reference to the @ref OicParseQueryIter_t if it has parsed query info, else
128  * NULL if it has no query to parse.
129  */
130 OicParseQueryIter_t * GetNextQuery(OicParseQueryIter_t * parseIter);
131
132 /**
133  * Function to getting string of ownership transfer method
134  *
135  * @param oxmType ownership transfer method
136  *
137  * @return string value of ownership transfer method
138  */
139 const char* GetOxmString(OicSecOxm_t oxmType);
140
141 /**
142  * This method converts UUID to canonical format string.
143  *
144  * @param uuid Device UUID
145  * @param strUuid converted UUID in canonical format
146  * @return OC_STACK_OK for success.
147  *
148  * @note Caller needs to invoke OICFree after done using the return pointer
149  */
150 OCStackResult ConvertUuidToStr(const OicUuid_t* uuid, char** strUuid);
151
152
153 /**
154  * This method converts string UUID to OicUuid_t.
155  *
156  * @param strUuid Device UUID in string format
157  * @param uuid converted UUID in OicUuid_t format
158  * @return OC_STACK_OK for success.
159  *
160  */
161 OCStackResult OC_CALL ConvertStrToUuid(const char* strUuid, OicUuid_t* uuid);
162
163 /**
164  * Is the URI for a Device Configuration Resource as defined
165  * by Security Specification.
166  *
167  * @return true IFF the URI is for a DCR
168  */
169 bool IsDeviceConfigurationResourceUri(const char *uri);
170
171 /**
172  * Is the URI for a Non0Configuration Resource as defined
173  * by Security Specification.
174  *
175  * @return true IFF the URI is for a NCR
176  */
177 bool IsNonConfigurationResourceUri(const char *uri);
178
179 /**
180  * Compares two OicUuid_t structs.
181  *
182  * @return true if the two OicUuid_t structs are equal, else false.
183  */
184 bool UuidCmp(const OicUuid_t *firstId, const OicUuid_t *secondId);
185
186 extern const OicUuid_t THE_NIL_UUID;
187
188 /**
189  * OicUuid_t to Nil UUID {.id={0000000000000000}}
190  *
191  * @return true if the OicUuid_t is the Nil UUID
192  */
193 bool IsNilUuid(const OicUuid_t *uuid);
194
195 #if defined(__WITH_DTLS__) || defined (__WITH_TLS__)
196 /**
197  * API to save the seed value to generate device UUID.
198  * Seed value MUST be unique per device (e.g. MAC address)
199  *
200  * @param seed buffer of seed value.
201  * @param seedSize byte length of seed
202  *
203  * @return ::OC_STACK_OK for Success, otherwise some error value.
204  */
205 OCStackResult OC_CALL SetDeviceIdSeed(const uint8_t* seed, size_t seedSize);
206 #endif
207
208 /**
209  * cbor default init
210  */
211 #ifndef OC_DEFAULT_CBOR_VALUE
212 #   if (__STDC_VERSION__ >= 199901L)
213 #       define OC_DEFAULT_CBOR_VALUE {.parser = NULL, .ptr = NULL, .remaining = 0, .extra = 0, .type = 0, .flags = 0}
214 #   else
215 #       define OC_DEFAULT_CBOR_VALUE {NULL, NULL, 0, 0, 0, 0}
216 #   endif
217 #endif
218
219 #ifndef OC_DEFAULT_CBOR_PARSER
220 #   if (__STDC_VERSION__ >= 199901L)
221 #       define OC_DEFAULT_CBOR_PARSER {.end = NULL, .flags = 0}
222 #   else
223 #       define OC_DEFAULT_CBOR_PARSER {NULL, 0}
224 #   endif
225 #endif
226
227 #ifndef OC_DEFAULT_OICPARSEQUWRYITER
228 #   if (__STDC_VERSION__ >= 199901L)
229 #       define OC_DEFAULT_OICPARSEQUWRYITER \
230         { \
231             .attrPos = NULL,\
232             .attrLen = 0,\
233             .valPos = NULL,\
234             .valLen = 0,\
235             .pi = {.n=0,.separator=NULL,.delim=NULL,.dlen=0,.pos=NULL,.segment_length=0}\
236         }
237 #   else
238 #       define OC_DEFAULT_OICPARSEQUWRYITER { NULL, 0, NULL, 0, {0,NULL,NULL,0,NULL,0}}
239 #   endif
240 #endif
241
242 #ifndef OC_DEFAULT_OICUUID
243 #   if (__STDC_VERSION__ >= 199901L)
244 #   define OC_DEFAULT_OICUUID {.id= { 0 } }
245 #   else
246 #   define OC_DEFAULT_OICUUID {{ 0 }}
247 #   endif
248 #endif
249
250 /**
251  * Is the URI for a Security Virtual Resource as defined
252  * by Security Specification.
253  *
254  * @return true IFF the URI is for a SVR
255  */
256 bool SRMIsSecurityResourceURI(const char* uri);
257
258 /**
259  * Log OicUuid_t structs.
260  */
261 void LogUuid(const OicUuid_t* uuid);
262
263 #ifdef __cplusplus
264 }
265 #endif // __cplusplus
266
267 #endif //IOTVT_SRM_UTILITY_H