[IOT-1947][IOT-2761][IOT-3228] Rm PEM/DER convert
[iotivity.git] / resource / csdk / security / include / internal / credresource.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_CREDR_H
22 #define IOTVT_SRM_CREDR_H
23
24 #include "cainterface.h"
25 #include "experimental/securevirtualresourcetypes.h"
26 #include "octypes.h"
27 #include "rolesresource.h"
28 #include <cbor.h>
29
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
33
34 typedef enum{
35     CRED_CREDS = 0,
36     CRED_ROWNERUUID,
37 #ifdef MULTIPLE_OWNER
38     CRED_EOWNERID,
39 #endif
40     CRED_CREDID,
41     CRED_SUBJECTUUID,
42     CRED_ROLEID,
43     CRED_CREDTYPE,
44     CRED_CREDUSAGE,
45     CRED_PUBLICDATA,
46     CRED_PRIVATEDATA,
47     CRED_OPTIONALDATA,
48     CRED_PERIOD,
49     CRED_CRMS,
50     CRED_PROPERTY_COUNT
51 } CredProperty_t;
52
53 /**
54  * Initialize credential resource by loading data from persistent storage.
55  *
56  * @return ::OC_STACK_OK, if initialization is successful, else ::OC_STACK_ERROR if
57  * initialization fails.
58  */
59 OCStackResult InitCredResource(void);
60
61 /**
62  * Perform cleanup for credential resources.
63  *
64  * @return ::OC_STACK_OK, if no errors. ::OC_STACK_ERROR, if stack process error.
65  * ::OC_STACK_NO_RESOURCE, if resource not found.
66  * ::OC_STACK_INVALID_PARAM, if invalid param.
67  */
68 OCStackResult DeInitCredResource(void);
69
70 /**
71  * Log current server cred resource
72  */
73 void LogCurrrentCredResource(void);
74
75 /**
76  * This method is used by tinydtls/SRM to retrieve credential for given subject.
77  *
78  * @param subjectId for which credential is required.
79  *
80  * @return reference to @ref OicSecCred_t, if credential is found, else NULL, if credential
81  * not found.
82  */
83 OicSecCred_t* GetCredResourceData(const OicUuid_t* subjectId);
84
85 /**
86  * This method is used by SRM to retrieve credential entry for given credId.
87  *
88  * @note Caller needs to release this memory by calling DeleteCredList().
89  *
90  * @param credId for which credential is required.
91  *
92  * @return reference to @ref OicSecCred_t, if credential is found, else NULL, if credential
93  * not found.
94  */
95 OicSecCred_t* GetCredEntryByCredId(const uint16_t credId);
96
97 /**
98  * This function converts credential data into CBOR format, including only the
99  * Properties marked "true" in the propertiesToInclude array.
100  * Caller needs to invoke 'OICFree' when done using returned string.
101  *
102  * @param credS is the pointer to instance of OicSecCred_t structure.
103  * @param rownerId resource owner's UUID (set NULL for get value from global rowner)
104  * @param cborPayload is the CBOR converted value.
105  * @param cborSize is the size of the CBOR.
106  * @param secureFlag shows fill or not private key.
107  * @param propertiesToInclude Array of bools, size "CRED_PROPERTY_COUNT",
108  * where "true" indicates the corresponding property should be
109  * included in the CBOR representation that is created.
110  * @return ::OC_STACK_OK if conversion is successful, else ::OC_STACK_ERROR if unsuccessful.
111  */
112
113 OCStackResult CredToCBORPayloadPartial(const OicSecCred_t *credS, const OicUuid_t *rownerId, uint8_t **cborPayload,
114                                 size_t *cborSize, int secureFlag, const bool *propertiesToInclude);
115
116 /**
117  * Converts CRED into the cbor payload, including all Properties for a
118  * full representation.
119  *
120  * @param credS is the pointer to instance of OicSecCred_t structure.
121  * @param cborPayload is the CBOR converted value.
122  * @param cborSize is the size of the CBOR.
123  * @param secureFlag shows fill or not private key.
124  *
125  * @return ::OC_STACK_OK for Success, otherwise some error value.
126  */
127
128 OCStackResult CredToCBORPayload(const OicSecCred_t *credS, uint8_t **cborPayload,
129                                 size_t *cborSize, int secureFlag);
130
131 OCStackResult CredToCBORPayloadWithRowner(const OicSecCred_t *credS, const OicUuid_t *rownerId, uint8_t **cborPayload,
132                                 size_t *cborSize, int secureFlag);
133
134 #ifdef MULTIPLE_OWNER
135 /**
136  * Function to check the credential access of SubOwner
137  *
138  * @param[in] uuid SubOwner's UUID
139  * @param[in] cborPayload CBOR payload of credential
140  * @param[in] size Byte length of cborPayload
141  *
142  * @return ::true for valid access, otherwise invalid access
143  */
144 bool IsValidCredentialAccessForSubOwner(const OicUuid_t* uuid, const uint8_t *cborPayload, size_t size);
145 #endif //MULTIPLE_OWNER
146
147 /**
148  * This function generates the bin credential data.
149  *
150  * @param subject pointer to subject of this credential.
151  * @param credType credential type.
152  * @param publicData public data such as public key.
153  * @param privateData private data such as private key.
154  * @param eownerID Entry owner's UUID.
155  *
156  * @return pointer to instance of @ref OicSecCred_t if successful. else NULL in case of error.
157
158  */
159 OicSecCred_t * GenerateCredential(const OicUuid_t* subject, OicSecCredType_t credType,
160                      const OicSecKey_t * publicData, const OicSecKey_t * privateData,
161                      const OicUuid_t * eownerID);
162
163 /**
164  * This function adds the new cred to the credential list.
165  *
166  * @param cred is the pointer to new credential.
167  *
168  * @return ::OC_STACK_OK, cred not NULL and persistent storage gets updated.
169  * ::OC_STACK_ERROR, cred is NULL or fails to update persistent storage.
170  */
171 OCStackResult AddCredential(OicSecCred_t * cred);
172
173 /**
174  * Function to remove credentials from the SVR DB for the given subject UUID.
175  * If multiple credentials exist for the UUID, they will all be removed.
176  *
177  * @param subject is the Credential Subject to be deleted.
178  *
179  * @return ::OC_STACK_RESOURCE_DELETED if credentials were removed, or
180  * if there are no credentials with the given UUID.  An error is returned if
181  * removing credentials failed.
182  */
183 OCStackResult RemoveCredential(const OicUuid_t *subject);
184
185 /**
186  * Function to remove the credential from SVR DB.
187  *
188  * @param credId is the Credential ID to be deleted.
189  *
190  * @return ::OC_STACK_OK for success, or errorcode otherwise.
191  */
192 OCStackResult RemoveCredentialByCredId(uint16_t credId);
193
194 #if defined(__WITH_DTLS__) || defined(__WITH_TLS__)
195 /**
196  * This internal callback is used by lower stack (i.e. CA layer) to
197  * retrieve PSK credentials from RI security layer.
198  *
199  * @param type of PSK data required by CA layer during DTLS handshake.
200  * @param desc Additional request information.
201  * @param desc_len is the actual length of desc.
202  * @param result  is must be filled with the requested information.
203  * @param result_length is the maximum size of @p result.
204  *
205  * @return The number of bytes written to @p result or a value
206  *         less than zero on error.
207  */
208 int32_t GetDtlsPskCredentials( CADtlsPskCredType_t type,
209               const unsigned char *desc, size_t desc_len,
210               unsigned char *result, size_t result_length);
211
212 /*
213  * This internal callback is used to retrieve UUIDs from CRED 
214  * entries that have matching publicData.
215  *
216  * @param ctx context holding UUID list
217  * @param p pointer to the DER-encoded certificate
218  * @param len length of the DER-encoded certificate
219  */
220
221 void GetIdentityHandler(UuidContext_t* ctx, unsigned char* p, size_t len);
222
223 /**
224  * Add temporal PSK to PIN based OxM.
225  *
226  * @param tmpSubject is the UUID of target device
227  * @param credType is the type of credential to be added
228  * @param pin is the numeric characters
229  * @param pinSize is the length of 'pin'
230  * @param rownerID Resource owner's UUID
231  * @param tmpCredSubject is the generated credential's subject.
232  *
233  * @return ::OC_STACK_OK for success or else errorcode.
234  */
235 OCStackResult AddTmpPskWithPIN(const OicUuid_t* tmpSubject, OicSecCredType_t credType,
236                             const char * pin, size_t pinSize,
237                             const OicUuid_t * rownerID,
238                             OicUuid_t* tmpCredSubject);
239
240 #endif // __WITH_DTLS__ or __WITH_TLS__
241
242 /**
243  * Function to getting credential list
244  *
245  * @return instance of @ref OicSecCred_t
246  */
247 const OicSecCred_t* GetCredList(void);
248
249 /**
250  * Function to deallocate allocated memory to OicSecCred_t.
251  *
252  * @param cred pointer to cred type.
253  *
254  */
255 void DeleteCredList(OicSecCred_t* cred);
256
257 /**
258  * Internal function to update resource owner
259  *
260  * @param newROwner new owner
261  *
262  * @retval ::OC_STACK_OK for Success, otherwise some error value
263  */
264 OCStackResult SetCredRownerId(const OicUuid_t* newROwner);
265
266 /**
267  * Gets the OicUuid_t value for the rownerid of the cred resource.
268  *
269  * @param rowneruuid a pointer to be assigned to the rowneruuid property
270  * @return ::OC_STACK_OK if rowneruuid is assigned correctly, else ::OC_STACK_ERROR.
271  */
272 OCStackResult GetCredRownerId(OicUuid_t *rowneruuid);
273
274 #if defined(__WITH_TLS__) || defined(__WITH_DTLS__)
275 /**
276  * Used by role certificate validator to get CA certificates as PEM
277  *
278  * @param[out] crt certificates to be filled.
279  * @param[in] usage credential usage string.
280  */
281 void GetCaCert(ByteArrayLL_t * crt, const char * usage);
282
283 /**
284  * Get a list of all role certificates. Used when asserting roles.
285  *
286  * @param[out] roleCerts list of role certificates
287  * @return When ::OC_STACK_OK is returned, a list of certificates (roleCerts)
288  *         that must be freed with FreeRoleCertChainList. roleCerts can still
289  *         be NULL in this case, if no role certs are installed. On error, an
290  *         error value is returned and roleCerts is NULL.
291  */
292 OCStackResult GetAllRoleCerts(RoleCertChain_t** roleCerts);
293
294 /**
295  * Used by mbedTLS to retrieve own certificate chain
296  *
297  * @param[out] crt certificate chain to be filled.
298  * @param[in] usage credential usage string.
299  */
300 void GetOwnCert(ByteArrayLL_t * crt, const char * usage);
301 /**
302  * Used by mbedTLS to retrieve own private key
303  *
304  * @param[out] key key to be filled.
305  * @param[in] usage credential usage string.
306  */
307 void GetDerKey(ByteArray_t * key, const char * usage);
308 /**
309  * Used by mbedTLS to retrieve own primary cert private key
310  *
311  * @param[out] key key to be filled.
312  */
313 void GetPrimaryCertKey(ByteArray_t * key);
314 /**
315  * Used by CA to retrieve credential types
316  *
317  * @param[out] list list of suites to be filled.
318  * @param[in] usage credential usage string.
319  * @param[in] device uuid.
320  */
321 void InitCipherSuiteListInternal(bool *list, const char * usage, const char* deviceId);
322 #endif // __WITH_TLS__
323
324 // Helpers shared by cred and roles resources
325 CborError SerializeEncodingToCbor(CborEncoder *rootMap, const char *tag, const OicSecKey_t *value);
326 CborError SerializeSecOptToCbor(CborEncoder *rootMap, const char *tag, const OicSecOpt_t *value);
327 CborError DeserializeEncodingFromCbor(CborValue *rootMap, OicSecKey_t *value);
328 CborError DeserializeSecOptFromCbor(CborValue *rootMap, OicSecOpt_t *value);
329 bool IsSameSecOpt(const OicSecOpt_t* sk1, const OicSecOpt_t* sk2);
330 bool IsSameSecKey(const OicSecKey_t* sk1, const OicSecKey_t* sk2);
331 /**
332  * Delete OicSecCred_t
333  *
334  * @param[in] cred the pointer to credential usage.
335  */
336 void FreeCred(OicSecCred_t *cred);
337
338 #ifdef __cplusplus
339 }
340 #endif
341
342 /*
343  * Check cred rowner uuid
344  */
345 bool IsCredRowneruuidTheNilUuid();
346
347 #endif //IOTVT_SRM_CREDR_H