security: publish securevirtualresourcetypes.h
[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
39 typedef struct OicParseQueryIter OicParseQueryIter_t;
40
41 /**
42  * OicRestQueryIter data structure is used for book-keeping
43  * sub-REST query's attribute's and value's, starting location &
44  * length between calls to GetNextQuery(). This struct needs
45  * to be first initialized with ParseQueryIterInit().
46  *
47  */
48 struct OicParseQueryIter
49 {
50     unsigned char * attrPos;    /**< stating location of attribute. */
51     size_t attrLen;             /**< length of the attribute. */
52     unsigned char * valPos;     /**< starting location of value. */
53     size_t valLen;              /**< length of the value. */
54     coap_parse_iterator_t pi;   /**< coap struct for tokenizing the query.*/
55 };
56
57 /**
58  * Macro to verify success of operation.
59  * eg: VERIFY_SUCCESS(TAG, OC_STACK_OK == foo(), ERROR);
60  * @note Invoking function must define "exit:" label for goto functionality to work correctly.
61  */
62 #define VERIFY_SUCCESS(tag, op, logLevel) do{ if (!(op)) \
63             {OIC_LOG((logLevel), tag, #op " failed!!"); goto exit; } }while(0)
64
65 /**
66  * Macro to verify expression evaluates to bool true.
67  * eg: VERIFY_TRUE_OR_EXIT(TAG, OC_STACK_OK == foo(), ERROR);
68  * @note Invoking function must define "exit:" label for goto functionality to work correctly.
69  */
70 #define VERIFY_TRUE_OR_EXIT(tag, op, logLevel) do{ if (!(op)) \
71             {OIC_LOG_V((logLevel), tag, "%s:" #op "evaluates to false!",__func__); \
72             goto exit; } }while(0)
73
74 /**
75  * Macro to verify success of operation.
76  * eg: VERIFY_SUCCESS_RETURN(TAG, OC_STACK_OK == foo(), ERROR, OC_STACK_ERROR);
77  */
78 #define VERIFY_SUCCESS_RETURN(tag, op, logLevel, retValue) do { if (!(op)) \
79             {OIC_LOG((logLevel), tag, #op " failed!!"); return retValue;} } while(0)
80
81 /**
82  * Macro to verify argument is not equal to NULL.
83  * eg: VERIFY_NOT_NULL(TAG, ptrData, ERROR);
84  * @note Invoking function must define "exit:" label for goto functionality to work correctly.
85  */
86 #define VERIFY_NOT_NULL(tag, arg, logLevel) do{ if (NULL == (arg)) \
87             { OIC_LOG((logLevel), tag, #arg " is NULL"); goto exit; } }while(0)
88
89 /**
90  * Macro to verify argument is not equal to NULL.
91  * eg: VERIFY_NOT_NULL_RETURN(TAG, ptrData, ERROR, OC_STACK_ERROR);
92  */
93 #define VERIFY_NOT_NULL_RETURN(tag, arg, logLevel, retValue) do { if (NULL == (arg)) \
94             { OIC_LOG((logLevel), tag, #arg " is NULL"); return retValue; } } while(0)
95
96 /**
97  * This method initializes the @ref OicParseQueryIter_t struct.
98  *
99  * @param query is the REST query, to be parsed.
100  * @param parseIter is the @ref OicParseQueryIter_t struct, to be initialized based on the query.
101  */
102 void ParseQueryIterInit(const unsigned char * query, OicParseQueryIter_t * parseIter);
103
104 /**
105  * This method fills the @ref OicParseQueryIter_t struct with next REST query's
106  * attribute's and value's information.
107  *
108  * @param parseIter is the @ref OicParseQueryIter_t struct, has next query's attribute's
109  *  & value's info.
110  *
111  * @return reference to the @ref OicParseQueryIter_t if it has parsed query info, else
112  * NULL if it has no query to parse.
113  */
114 OicParseQueryIter_t * GetNextQuery(OicParseQueryIter_t * parseIter);
115
116 /**
117  * Function to getting string of ownership transfer method
118  *
119  * @param oxmType ownership transfer method
120  *
121  * @return string value of ownership transfer method
122  */
123 const char* GetOxmString(OicSecOxm_t oxmType);
124
125 /**
126  * This method converts UUID to canonical format string.
127  *
128  * @param uuid Device UUID
129  * @param strUuid converted UUID in canonical format
130  * @return OC_STACK_OK for success.
131  *
132  * @note Caller needs to invoke OICFree after done using the return pointer
133  */
134 OCStackResult ConvertUuidToStr(const OicUuid_t* uuid, char** strUuid);
135
136
137 /**
138  * This method converts string UUID to OicUuid_t.
139  *
140  * @param strUuid Device UUID in string format
141  * @param uuid converted UUID in OicUuid_t format
142  * @return OC_STACK_OK for success.
143  *
144  */
145 OCStackResult OC_CALL ConvertStrToUuid(const char* strUuid, OicUuid_t* uuid);
146
147 /**
148  * Compares two OicUuid_t structs.
149  *
150  * @return true if the two OicUuid_t structs are equal, else false.
151  */
152 bool UuidCmp(const OicUuid_t *firstId, const OicUuid_t *secondId);
153
154 extern const OicUuid_t THE_NIL_UUID;
155
156 /**
157  * OicUuid_t to Nil UUID {.id={0000000000000000}}
158  *
159  * @return true if the OicUuid_t is the Nil UUID
160  */
161 bool IsNilUuid(const OicUuid_t *uuid);
162
163 #if defined(__WITH_DTLS__) || defined (__WITH_TLS__)
164 /**
165  * API to save the seed value to generate device UUID.
166  * Seed value MUST be unique per device (e.g. MAC address)
167  *
168  * @param seed buffer of seed value.
169  * @param seedSize byte length of seed
170  *
171  * @return ::OC_STACK_OK for Success, otherwise some error value.
172  */
173 OCStackResult OC_CALL SetDeviceIdSeed(const uint8_t* seed, size_t seedSize);
174 #endif
175
176 #ifdef __cplusplus
177 }
178 #endif // __cplusplus
179
180 #endif //IOTVT_SRM_UTILITY_H