Asynchronous User Confirm
[platform/upstream/iotivity.git] / resource / csdk / security / include / securevirtualresourcetypes.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 /**
22  * Data type definitions for all oic.sec.* types defined in the
23  * OIC Security Specification.
24  *
25  * Note that throughout, ptrs are used rather than arrays.  There
26  * are two primary reasons for this:
27  * 1) The Spec defines many structures with optional fields, so pre-
28  *    allocating these would be wasteful.
29  * 2) There are in many cases arrays of Strings or arrays of Structs,
30  *    which could not be defined as variable length arrays (e.g. array[])
31  *    without breaking from the structure order and definition in the Spec.
32  *
33  * The primary drawback to this decision is that marshalling functions
34  * will have to be written by hand to marshal these structures (e.g. to/from
35  * Persistent Storage, or across memory boundaries).
36  *
37  * TODO reconcile against latest OIC Security Spec to ensure all fields correct.
38  * (Last checked against v0.95)
39  */
40
41 #ifndef OC_SECURITY_RESOURCE_TYPES_H
42 #define OC_SECURITY_RESOURCE_TYPES_H
43
44 #include "iotivity_config.h"
45
46 #include <stdint.h> // for uint8_t typedef
47 #include <stdbool.h>
48 #if defined(__WITH_DTLS__) || defined(__WITH_TLS__)
49 #include "byte_array.h"
50 #endif /* __WITH_DTLS__  or __WITH_TLS__*/
51
52 #ifdef __cplusplus
53 extern "C" {
54 #endif
55
56 /**
57  * Values used to create bit-maskable enums for single-value response with
58  * embedded code.
59  */
60 #define ACCESS_GRANTED_DEF            (1 << 0)
61 #define ACCESS_DENIED_DEF             (1 << 1)
62 #define INSUFFICIENT_PERMISSION_DEF   (1 << 2)
63 #define SUBJECT_NOT_FOUND_DEF         (1 << 3)
64 #define RESOURCE_NOT_FOUND_DEF        (1 << 4)
65 #define POLICY_ENGINE_ERROR_DEF       (1 << 5)
66 #define INVALID_PERIOD_DEF            (1 << 6)
67 #define ACCESS_WAITING_DEF            (1 << 7)
68 #define AMS_SERVICE_DEF               (1 << 8)
69 #define REASON_MASK_DEF               (INSUFFICIENT_PERMISSION_DEF | \
70                                        INVALID_PERIOD_DEF | \
71                                        SUBJECT_NOT_FOUND_DEF | \
72                                        RESOURCE_NOT_FOUND_DEF | \
73                                        POLICY_ENGINE_ERROR_DEF)
74
75
76 /**
77  * Access policy in least significant bits (from Spec):
78  * 1st lsb:  C (Create)
79  * 2nd lsb:  R (Read, Observe, Discover)
80  * 3rd lsb:  U (Write, Update)
81  * 4th lsb:  D (Delete)
82  * 5th lsb:  N (Notify)
83  */
84 #define PERMISSION_CREATE       (1 << 0)
85 #define PERMISSION_READ         (1 << 1)
86 #define PERMISSION_WRITE        (1 << 2)
87 #define PERMISSION_DELETE       (1 << 3)
88 #define PERMISSION_NOTIFY       (1 << 4)
89 #define PERMISSION_FULL_CONTROL (PERMISSION_CREATE | \
90                                  PERMISSION_READ | \
91                                  PERMISSION_WRITE | \
92                                  PERMISSION_DELETE | \
93                                  PERMISSION_NOTIFY)
94
95 /**
96  * @brief   Response type for all Action requests from CA layer;
97  *          may include a reason code.
98  *
99  * To extract codes use GetReasonCode function on SRMAccessResponse:
100  *
101  * SRMAccessResponse_t response = SRMRequestHandler(obj, info);
102  * if(SRM_TRUE == IsAccessGranted(response)) {
103  *     SRMAccessResponseReasonCode_t reason = GetReasonCode(response);
104  *     switch(reason) {
105  *         case INSUFFICIENT_PERMISSION:
106  *         ...etc.
107  *     }
108  * }
109  */
110 typedef enum
111 {
112     ACCESS_GRANTED = ACCESS_GRANTED_DEF,
113     ACCESS_DENIED = ACCESS_DENIED_DEF,
114     ACCESS_DENIED_INVALID_PERIOD = ACCESS_DENIED_DEF
115         | INVALID_PERIOD_DEF,
116     ACCESS_DENIED_INSUFFICIENT_PERMISSION = ACCESS_DENIED_DEF
117         | INSUFFICIENT_PERMISSION_DEF,
118     ACCESS_DENIED_SUBJECT_NOT_FOUND = ACCESS_DENIED_DEF
119         | SUBJECT_NOT_FOUND_DEF,
120     ACCESS_DENIED_RESOURCE_NOT_FOUND = ACCESS_DENIED_DEF
121         | RESOURCE_NOT_FOUND_DEF,
122     ACCESS_DENIED_POLICY_ENGINE_ERROR = ACCESS_DENIED_DEF
123         | POLICY_ENGINE_ERROR_DEF,
124     ACCESS_WAITING_FOR_AMS = ACCESS_WAITING_DEF
125         | AMS_SERVICE_DEF,
126     ACCESS_DENIED_AMS_SERVICE_ERROR = ACCESS_DENIED
127         | AMS_SERVICE_DEF
128 } SRMAccessResponse_t;
129
130 /**
131  * Reason code for SRMAccessResponse.
132  */
133 typedef enum
134 {
135     NO_REASON_GIVEN = 0,
136     INSUFFICIENT_PERMISSION = INSUFFICIENT_PERMISSION_DEF,
137     SUBJECT_NOT_FOUND = SUBJECT_NOT_FOUND_DEF,
138     RESOURCE_NOT_FOUND = RESOURCE_NOT_FOUND_DEF,
139 } SRMAccessResponseReasonCode_t;
140
141 /**
142  * Extract Reason Code from Access Response.
143  */
144 INLINE_API SRMAccessResponseReasonCode_t GetReasonCode(
145     SRMAccessResponse_t response)
146 {
147     SRMAccessResponseReasonCode_t reason =
148         (SRMAccessResponseReasonCode_t)(response & REASON_MASK_DEF);
149     return reason;
150 }
151
152 /**
153  * Returns 'true' iff request should be passed on to RI layer.
154  */
155 INLINE_API bool IsAccessGranted(SRMAccessResponse_t response)
156 {
157     if(ACCESS_GRANTED == (response & ACCESS_GRANTED))
158     {
159         return true;
160     }
161     else
162     {
163         return false;
164     }
165 }
166
167 typedef struct OicSecRsrc OicSecRsrc_t;
168
169 typedef struct OicSecValidity OicSecValidity_t;
170
171 typedef struct OicSecAce OicSecAce_t;
172
173 typedef struct OicSecAcl OicSecAcl_t;
174
175 typedef struct OicSecAmacl OicSecAmacl_t;
176
177 typedef struct OicSecCred OicSecCred_t;
178
179 /**
180  * Aid for assigning/testing vals with OicSecCredType_t.
181  * Example:
182  *  OicSecCredType_t ct = PIN_PASSWORD | ASYMMETRIC_KEY;
183  *  if((ct & PIN_PASSWORD) == PIN_PASSWORD)
184  *  {
185  *      // ct contains PIN_PASSWORD flag.
186  *  }
187  */
188 typedef enum OSCTBitmask
189 {
190     NO_SECURITY_MODE                = 0x0,
191     SYMMETRIC_PAIR_WISE_KEY         = (0x1 << 0),
192     SYMMETRIC_GROUP_KEY             = (0x1 << 1),
193     ASYMMETRIC_KEY                  = (0x1 << 2),
194     SIGNED_ASYMMETRIC_KEY           = (0x1 << 3),
195     PIN_PASSWORD                    = (0x1 << 4),
196     ASYMMETRIC_ENCRYPTION_KEY       = (0x1 << 5),
197 } OSCTBitmask_t;
198
199 /**
200  * /oic/sec/credtype (Credential Type) data type.
201  * Derived from OIC Security Spec /oic/sec/cred; see Spec for details.
202  *              0:  no security mode
203  *              1:  symmetric pair-wise key
204  *              2:  symmetric group key
205  *              4:  asymmetric key
206  *              8:  signed asymmetric key (aka certificate)
207  *              16: PIN /password
208  */
209 typedef OSCTBitmask_t OicSecCredType_t;
210
211 typedef struct OicSecDoxm OicSecDoxm_t;
212
213 typedef enum OicSecDpm
214 {
215     NORMAL                          = 0x0,
216     RESET                           = (0x1 << 0),
217     TAKE_OWNER                      = (0x1 << 1),
218     BOOTSTRAP_SERVICE               = (0x1 << 2),
219     SECURITY_MANAGEMENT_SERVICES    = (0x1 << 3),
220     PROVISION_CREDENTIALS           = (0x1 << 4),
221     PROVISION_ACLS                  = (0x1 << 5),
222 #ifdef MULTIPLE_OWNER
223     TAKE_SUB_OWNER                  = (0x1 << 6),
224 #endif
225     // << 7 THROUGH 15 RESERVED
226 } OicSecDpm_t;
227
228 // These types are taken from the Security Spec v1.1.12 /pstat resource definition
229 // Note that per the latest spec, there is NO definition for Multiple Service Client Directed
230 // provisioning mode, so that enum value has been removed.
231 typedef enum OicSecDpom
232 {
233     MULTIPLE_SERVICE_SERVER_DRIVEN    = (0x1 << 0),
234     SINGLE_SERVICE_SERVER_DRIVEN      = (0x1 << 1),
235     SINGLE_SERVICE_CLIENT_DRIVEN      = (0x1 << 2),
236 } OicSecDpom_t;
237
238 //TODO: Need more clarification on deviceIDFormat field type.
239 #if 0
240 typedef enum
241 {
242     URN = 0x0
243 }OicSecDvcIdFrmt_t;
244 #endif
245
246 typedef enum
247 {
248     OIC_R_ACL_TYPE = 0,
249     OIC_R_AMACL_TYPE,
250     OIC_R_CRED_TYPE,
251     OIC_R_CRL_TYPE,
252     OIC_R_DOXM_TYPE,
253     OIC_R_DPAIRING_TYPE,
254     OIC_R_PCONF_TYPE,
255     OIC_R_PSTAT_TYPE,
256     OIC_R_SACL_TYPE,
257     OIC_SEC_SVR_TYPE_COUNT, //define the value to number of SVR
258     NOT_A_SVR_RESOURCE = 99
259 }OicSecSvrType_t;
260
261 typedef enum
262 {
263     OIC_JUST_WORKS                          = 0x0,
264     OIC_RANDOM_DEVICE_PIN                   = 0x1,
265     OIC_MANUFACTURER_CERTIFICATE            = 0x2,
266     OIC_DECENTRALIZED_PUBLIC_KEY            = 0x3,
267     OIC_OXM_COUNT,
268 #ifdef MULTIPLE_OWNER
269     OIC_PRECONFIG_PIN                       = 0xFF00,
270 #endif //MULTIPLE_OWNER
271     OIC_MV_JUST_WORKS                       = 0xFF01,
272     OIC_CON_MFG_CERT                        = 0xFF02,
273     OIC_RAW_PUB_KEY                         = 0xFF03,
274 }OicSecOxm_t;
275
276 typedef enum
277 {
278     OIC_ENCODING_UNKNOW = 0,
279     OIC_ENCODING_RAW = 1,
280     OIC_ENCODING_BASE64 = 2,
281     OIC_ENCODING_PEM = 3,
282     OIC_ENCODING_DER = 4
283 }OicEncodingType_t;
284
285 #ifdef MULTIPLE_OWNER
286 typedef enum
287 {
288     MOT_STATUS_READY = 0,
289     MOT_STATUS_IN_PROGRESS = 1,
290     MOT_STATUS_DONE = 2,
291 }MotStatus_t;
292 #endif //MULTIPLE_OWNER
293
294 /*
295  * oic.sec.mom type definition
296  * TODO: This type will be included to OIC Security Spec.
297  * 0 : Disable multiple owner
298  * 1 : Enable multiple owner (Always on)
299  * 2 : Timely multiple owner enable
300  */
301 typedef enum
302 {
303     OIC_MULTIPLE_OWNER_DISABLE = 0,
304     OIC_MULTIPLE_OWNER_ENABLE = 1,
305     OIC_MULTIPLE_OWNER_TIMELY_ENABLE = 2,
306     OIC_NUMBER_OF_MOM_TYPE = 3
307 }OicSecMomType_t;
308
309 typedef struct OicSecKey OicSecKey_t;
310
311 typedef struct OicSecOpt OicSecOpt_t;
312
313 typedef struct OicSecPstat OicSecPstat_t;
314
315 typedef struct OicSecRole OicSecRole_t;
316
317 typedef struct OicSecSacl OicSecSacl_t;
318
319 typedef char *OicUrn_t; //TODO is URN type defined elsewhere?
320
321 typedef struct OicUuid OicUuid_t; //TODO is UUID type defined elsewhere?
322
323 #ifdef MULTIPLE_OWNER
324 typedef struct OicSecSubOwner OicSecSubOwner_t;
325 typedef struct OicSecMom OicSecMom_t;
326 #endif //MULTIPLE_OWNER
327
328
329 #if defined(__WITH_DTLS__) || defined(__WITH_TLS__)
330 typedef struct OicSecCrl OicSecCrl_t;
331 typedef ByteArray_t OicSecCert_t;
332 #else
333 typedef void OicSecCert_t;
334 #endif /* __WITH_DTLS__ or __WITH_TLS__*/
335
336 /**
337  * /oic/uuid (Universal Unique Identifier) data type.
338  */
339 #define UUID_LENGTH 128/8 // 128-bit GUID length
340 //TODO: Confirm the length and type of ROLEID.
341 #define ROLEID_LENGTH 128/8 // 128-bit ROLEID length
342 #define OWNER_PSK_LENGTH_128 128/8 //byte size of 128-bit key size
343 #define OWNER_PSK_LENGTH_256 256/8 //byte size of 256-bit key size
344
345 struct OicUuid
346 {
347     // <Attribute ID>:<Read/Write>:<Multiple/Single>:<Mandatory?>:<Type>
348     //TODO fill in unless this is defined elsewhere?
349     uint8_t             id[UUID_LENGTH];
350 };
351
352 /**
353  * /oic/sec/jwk (JSON Web Key) data type.
354  * See JSON Web Key (JWK)  draft-ietf-jose-json-web-key-41
355  */
356 #define JWK_LENGTH 256/8 // 256 bit key length
357 struct OicSecKey
358 {
359     uint8_t                *data;
360     size_t                  len;
361
362     // TODO: This field added as workaround. Will be replaced soon.
363     OicEncodingType_t encoding;
364
365 };
366
367 struct OicSecOpt
368 {
369     uint8_t                *data;
370     size_t                  len;
371
372     OicEncodingType_t encoding;
373     bool                revstat;
374 };
375
376 struct OicSecRsrc
377 {
378     char *href; // 0:R:S:Y:String
379     char *rel; // 1:R:S:N:String
380     char** types; // 2:R:S:N:String Array
381     size_t typeLen; // the number of elts in types
382     char** interfaces; // 3:R:S:N:String Array
383     size_t interfaceLen; // the number of elts in interfaces
384     OicSecRsrc_t *next;
385 };
386
387 struct OicSecValidity
388 {
389     char* period; // 0:R:S:Y:String
390     char** recurrences; // 1:R:M:Y:Array of String
391     size_t recurrenceLen; // the number of elts in recurrence
392     OicSecValidity_t *next;
393 };
394
395 struct OicSecAce
396 {
397     // <Attribute ID>:<Read/Write>:<Multiple/Single>:<Mandatory?>:<Type>
398     OicUuid_t subjectuuid;              // 0:R:S:Y:uuid
399     OicSecRsrc_t *resources;            // 1:R:M:Y:Resource
400     uint16_t permission;                // 2:R:S:Y:UINT16
401     OicSecValidity_t *validities;       // 3:R:M:N:Time-interval
402 #ifdef MULTIPLE_OWNER
403     OicUuid_t* eownerID;                //4:R:S:N:oic.uuid
404 #endif
405     OicSecAce_t *next;
406 };
407
408 /**
409  * /oic/sec/acl (Access Control List) data type.
410  * Derived from OIC Security Spec; see Spec for details.
411  */
412 struct OicSecAcl
413 {
414     // <Attribute ID>:<Read/Write>:<Multiple/Single>:<Mandatory?>:<Type>
415     OicUuid_t           rownerID;        // 0:R:S:Y:oic.uuid
416     OicSecAce_t         *aces; // 1:R:M:N:ACE
417 };
418
419 /**
420  * /oic/sec/amacl (Access Manager Service Accesss Control List) data type.
421  * Derived from OIC Security Spec; see Spec for details.
422  */
423 struct OicSecAmacl
424 {
425     // <Attribute ID>:<Read/Write>:<Multiple/Single>:<Mandatory?>:<Type>
426     size_t              resourcesLen;   // the number of elts in Resources
427     char                **resources;    // 0:R:M:Y:String
428     size_t              amssLen;        // the number of elts in Amss
429     OicUuid_t           *amss;          // 1:R:M:Y:acl
430     OicUuid_t           rownerID;        // 2:R:S:Y:oic.uuid
431     OicSecAmacl_t         *next;
432 };
433
434 /**
435  * /oic/sec/cred (Credential) data type.
436  * Derived from OIC Security Spec; see Spec for details.
437  */
438 struct OicSecCred
439 {
440     // <Attribute ID>:<Read/Write>:<Multiple/Single>:<Mandatory?>:<Type>
441     uint16_t            credId;         // 0:R:S:Y:UINT16
442     OicUuid_t           subject;        // 1:R:S:Y:oic.uuid
443     //Note: Need further clarification on roleID data type
444     //NOTE: Need further clarification on roleId datatype.
445     //size_t              roleIdsLen;     // the number of elts in RoleIds
446     //OicSecRole_t        *roleIds;       // 2:R:M:N:oic.sec.role
447     OicSecCredType_t    credType;       // 3:R:S:Y:oic.sec.credtype
448 #if defined(__WITH_DTLS__) || defined(__WITH_TLS__)
449     OicSecKey_t         publicData;     // own cerificate chain
450     char            *credUsage;            // 4:R:S:N:String
451     OicSecOpt_t        optionalData;   // CA's cerificate chain
452 #endif /* __WITH_DTLS__  or __WITH_TLS__*/
453     OicSecKey_t         privateData;    // 6:R:S:N:oic.sec.key
454     char                *period;        // 7:R:S:N:String
455     OicUuid_t           rownerID;       // 8:R:S:Y:oic.uuid
456 #ifdef MULTIPLE_OWNER
457     OicUuid_t           *eownerID;      //9:R:S:N:oic.uuid
458 #endif //MULTIPLE_OWNER
459     OicSecCred_t        *next;
460 };
461
462 #ifdef MULTIPLE_OWNER
463 struct OicSecSubOwner {
464     OicUuid_t uuid;
465     MotStatus_t status;
466     OicSecSubOwner_t* next;
467 };
468
469 struct OicSecMom{
470     OicSecMomType_t mode;
471 };
472 #endif //MULTIPLE_OWNER
473
474 /**
475  * /oic/sec/doxm (Device Owner Transfer Methods) data type
476  * Derived from OIC Security Spec; see Spec for details.
477  */
478 struct OicSecDoxm
479 {
480     // <Attribute ID>:<Read/Write>:<Multiple/Single>:<Mandatory?>:<Type>
481     OicUrn_t            *oxmType;       // 0:R:M:N:URN
482     size_t              oxmTypeLen;     // the number of elts in OxmType
483     OicSecOxm_t         *oxm;           // 1:R:M:N:UINT16
484     size_t              oxmLen;         // the number of elts in Oxm
485     OicSecOxm_t         oxmSel;         // 2:R/W:S:Y:UINT16
486     OicSecCredType_t    sct;            // 3:R:S:Y:oic.sec.credtype
487     bool                owned;          // 4:R:S:Y:Boolean
488     //TODO: Need more clarification on deviceIDFormat field type.
489     //OicSecDvcIdFrmt_t   deviceIDFormat; // 5:R:S:Y:UINT8
490     OicUuid_t           deviceID;       // 6:R:S:Y:oic.uuid
491     bool                dpc;            // 7:R:S:Y:Boolean
492     OicUuid_t           owner;          // 8:R:S:Y:oic.uuid
493 #ifdef MULTIPLE_OWNER
494     OicSecSubOwner_t* subOwners;        //9:R/W:M:N:oic.uuid
495     OicSecMom_t *mom;                   //10:R/W:S:N:oic.sec.mom
496 #endif //MULTIPLE_OWNER
497     OicUuid_t           rownerID;       // 11:R:S:Y:oic.uuid
498 };
499
500 /**
501  * /oic/sec/pstat (Provisioning Status) data type.
502  */
503 struct OicSecPstat
504 {
505     // <Attribute ID>:<Read/Write>:<Multiple/Single>:<Mandatory?>:<Type>
506     bool                isOp;           // 0:R:S:Y:Boolean
507     OicSecDpm_t         cm;             // 1:R:S:Y:oic.sec.dpm
508     OicSecDpm_t         tm;             // 2:RW:S:Y:oic.sec.dpm
509     OicUuid_t           deviceID;       // 3:R:S:Y:oic.uuid
510     OicSecDpom_t        om;             // 4:RW:M:Y:oic.sec.dpom
511     size_t              smLen;          // the number of elts in Sm
512     OicSecDpom_t        *sm;            // 5:R:M:Y:oic.sec.dpom
513     uint16_t            commitHash;     // 6:R:S:Y:oic.sec.sha256
514     OicUuid_t           rownerID;       // 7:R:S:Y:oic.uuid
515 };
516
517 /**
518  * /oic/sec/role (Role) data type.
519  * Derived from OIC Security Spec; see Spec for details.
520  */
521 struct OicSecRole
522 {
523     // <Attribute ID>:<Read/Write>:<Multiple/Single>:<Mandatory?>:<Type>
524     //TODO fill in with Role definition
525     uint8_t             id[ROLEID_LENGTH];
526 };
527
528 /**
529  * /oic/sec/sacl (Signed Access Control List) data type.
530  * Derived from OIC Security Spec; see Spec for details.
531  */
532 struct OicSecSacl
533 {
534     // <Attribute ID>:<Read/Write>:<Multiple/Single>:<Mandatory?>:<Type>
535     //TODO fill in from OIC Security Spec
536 #if defined(_MSC_VER)
537     uint8_t unused; // VS doesn't like empty structs
538 #endif
539 };
540
541 #if defined(__WITH_DTLS__) ||  defined(__WITH_TLS__)
542 struct OicSecCrl
543 {
544     uint16_t CrlId;
545     ByteArray_t ThisUpdate;
546     OicSecKey_t CrlData;
547 };
548 #endif /* __WITH_DTLS__ or __WITH_TLS__ */
549
550 /**
551  * @brief   direct pairing data type
552  */
553 typedef struct OicPin OicDpPin_t;
554
555 typedef struct OicSecPdAcl OicSecPdAcl_t;
556
557 typedef struct OicSecPconf OicSecPconf_t;
558
559 typedef struct OicSecDpairing OicSecDpairing_t;
560
561 #define DP_PIN_LENGTH 8 // temporary length
562
563 /**
564  * @brief   /oic/sec/prmtype (Pairing Method Type) data type.
565  *              0:  not allowed
566  *              1:  pre-configured pin
567  *              2:  random pin
568  */
569 typedef enum PRMBitmask
570 {
571     PRM_NOT_ALLOWED             = 0x0,
572     PRM_PRE_CONFIGURED        = (0x1 << 0),
573     PRM_RANDOM_PIN               = (0x1 << 1),
574 } PRMBitmask_t;
575
576 typedef PRMBitmask_t OicSecPrm_t;
577
578
579 struct OicPin
580 {
581     uint8_t             val[DP_PIN_LENGTH];
582 };
583
584 /**
585  * @brief   oic.sec.dpacltype (Device Pairing Access Control List) data type.
586  */
587 struct OicSecPdAcl
588 {
589     // <Attribute ID>:<Read/Write>:<Multiple/Single>:<Mandatory?>:<Type>
590     char                  **resources;        // 0:R:M:Y:String
591     size_t                resourcesLen;      // the number of elts in Resources
592     uint16_t             permission;        // 1:R:S:Y:UINT16
593     char                  **periods;            // 2:R:M*:N:String (<--M*; see Spec)
594     char                  **recurrences;    // 3:R:M:N:String
595     size_t                prdRecrLen;         // the number of elts in Periods/Recurrences
596     OicSecPdAcl_t    *next;
597 };
598
599 /**
600  * @brief   /oic/sec/pconf (Pairing Configuration) data type
601  */
602 struct OicSecPconf
603 {
604     // <Attribute ID>:<Read/Write>:<Multiple/Single>:<Mandatory?>:<Type>
605     bool                  edp;                // 0:W:S:M:Boolean
606     OicSecPrm_t      *prm;              // 1:R:M:N:UINT16
607     size_t                prmLen;          // the number of elts in Prm
608     OicDpPin_t          pin;               // 2:R:S:Y:String
609     OicSecPdAcl_t    *pdacls;         // 3:R:M:Y:oic.sec.pdacltype
610     OicUuid_t           *pddevs;        // 4:R:M:Y:oic.uuid
611     size_t                 pddevLen;     // the number of elts in pddev
612     OicUuid_t           deviceID;       // 5:R:S:Y:oic.uuid
613     OicUuid_t           rownerID;          // 6:R:S:Y:oic.uuid
614 };
615
616 /**
617  * @brief   /oic/sec/dpairing (Device Pairing) data type
618  */
619 struct OicSecDpairing
620 {
621     // <Attribute ID>:<Read/Write>:<Multiple/Single>:<Mandatory?>:<Type>
622     OicSecPrm_t      spm;               // 0:R/W:S:Y:UINT16
623     OicUuid_t           pdeviceID;     // 1:R:S:Y:oic.uuid
624     OicUuid_t           rownerID;          // 2:R:S:Y:oic.uuid
625 };
626
627 #define OIC_SEC_MAX_VER_LEN 16 // Security Version length. i.e., 00.00.000 + reserved space
628
629 /**
630  * @brief   security version data type
631  */
632 typedef struct OicSecVer OicSecVer_t;
633
634 /**
635  * @brief   /oic/sec/ver (Security Version) data type
636  */
637 struct OicSecVer
638 {
639     // <Attribute ID>:<Read/Write>:<Multiple/Single>:<Mandatory?>:<Type>
640     char              secv[OIC_SEC_MAX_VER_LEN];          // 0:R:S:Y:String
641     OicUuid_t       deviceID;     // 1:R:S:Y:oic.uuid
642 };
643
644 #ifdef __cplusplus
645 }
646 #endif
647
648 #endif //OC_SECURITY_RESOURCE_TYPES_H