1 /*
2  * Copyright (C) 2015-2018 Alibaba Group Holding Limited
3  */
4 
5 #include "alcs_coap.h"
6 
7 #ifndef __ALCS_API_H__
8 #define __ALCS_API_H__
9 
10 #define SESSIONID_LEN           8
11 #define SESSIONKEY_MAXLEN       30
12 
13 #define ALCS_ERR_AUTH_BASE      (COAP_ERROR_BASE | 100)
14 #define ALCS_ERR_AUTH_AUTHING   (ALCS_ERR_AUTH_BASE | 1)
15 #define ALCS_ERR_AUTH_NOCTLKEY  (ALCS_ERR_AUTH_BASE | 2)
16 #define ALCS_ERR_AUTH_UNAUTH    (ALCS_ERR_AUTH_BASE | 3)
17 #define ALCS_ERR_ENCRYPT_FAILED (ALCS_ERR_AUTH_BASE | 5)
18 
19 typedef enum {
20     ALCS_AUTH_OK = 200,
21     ALCS_AUTH_REVOCATE = 501,
22     ALCS_AUTH_UNMATCHPREFIX,
23     ALCS_AUTH_INVALIDPARAM,
24     ALCS_AUTH_AUTHLISTEMPTY,
25     ALCS_AUTH_VERNOTSUPPORT,
26     ALCS_AUTH_ILLEGALSIGN,
27     ALCS_HEART_FAILAUTH,
28 } Auth_Result_Code;
29 
30 #include "iotx_alcs_config.h"
31 
32 typedef struct {
33     int code;
34     char *msg; /* MUST call coap_free to free memory */
35 } ResponseMsg;
36 
37 #ifdef __cplusplus
38 extern "C" {
39 #endif /* __cplusplus */
40 
41 /*
42 typedef struct
43 {
44     ResponseMsg msg;
45     char sessionId [SESSIONID_LEN];
46     char sessionKey[SESSIONKEY_MAXLEN];
47     NetworkAddr addr;
48 } AuthResult;
49 */
50 
51 typedef void (*AuthHandler)(CoAPContext *context, NetworkAddr *addr,
52                             void *user_data, ResponseMsg *result);
53 typedef struct {
54     char *productKey;
55     char *deviceName;
56     char *accessKey;
57     char *accessToken;
58     void *user_data;
59     AuthHandler handler;
60 } AuthParam;
61 
62 typedef struct {
63     NetworkAddr addr;
64     char *pk;
65     char *dn;
66 } AlcsDeviceKey;
67 
68 /*  初始化认证模块
69  *  context:   为当前设备生成的CoAPContext对象指针
70  *  productKey:当前设备的productKey,可以为空
71  *  deviceName: 当前设备的deviceName,可以为空
72  *  role: 1 --client
73  *        2 --server
74  *        3 --client&server
75  */
76 int alcs_auth_init(CoAPContext *context, const char *productKey,
77                    const char *deviceName, char role);
78 void alcs_auth_subdev_init(CoAPContext *ctx, const char *productKey,
79                            const char *deviceName);
80 void alcs_auth_deinit(void);
81 
82 bool alcs_is_auth(CoAPContext *ctx, AlcsDeviceKey *devKey);
83 int alcs_sendmsg_secure(CoAPContext *ctx, AlcsDeviceKey *devKey,
84                         CoAPMessage *message, char observe,
85                         CoAPSendMsgHandler handler);
86 int alcs_sendrsp_secure(CoAPContext *ctx, AlcsDeviceKey *devKey,
87                         CoAPMessage *message, char observe,
88                         unsigned short msgid, CoAPLenString *token);
89 
90 #ifdef ALCS_CLIENT_ENABLED
91 /*  身份认证--  直接传入accesskey&accesstoken
92  *  context:   当前设备生成的CoAPContext对象指针
93  *  addr:      待连设备地址
94  *  auth_param:包含待连设备的信息和回调接口
95  */
96 void alcs_auth_has_key(CoAPContext *ctx, NetworkAddr *addr,
97                        AuthParam *auth_param);
98 
99 /*  身份认证--通过productkey&devicename在缓存的accesskey列表中查找合适accesskey
100  *  此函数需要和alcs_add_client_key 配合使用
101  *  若不知道准确的accessKey,认证前client会和server协商合适的accessKey
102  *
103  *  context:   为当前设备生成的CoAPContext对象指针
104  *  addr:      待连设备地址
105  *  productKey:待连设备的productKey
106  *  deviceName:待连设备的deviceName
107  *  handler:   结果回调接口
108  */
109 void alcs_auth_nego_key(CoAPContext *ctx, AlcsDeviceKey *devKey,
110                         AuthHandler handler);
111 /*
112  *
113  *
114  */
115 int alcs_add_client_key(CoAPContext *context, const char *accesskey,
116                         const char *accesstoken, const char *productKey,
117                         const char *deviceName);
118 int alcs_remove_client_key(CoAPContext *context, const char *key,
119                            char isfullkey);
120 /*
121  *
122  *
123  */
124 bool alcs_device_online(CoAPContext *context, AlcsDeviceKey *devKey);
125 
126 #endif
127 
128 #ifdef ALCS_SERVER_ENABLED
129 typedef enum {
130     LOCALDEFAULT,
131     LOCALSETUP,
132     FROMCLOUDSVR
133 } ServerKeyPriority;
134 
135 int alcs_add_svr_key(CoAPContext *context, const char *keyprefix,
136                      const char *secret, ServerKeyPriority priority);
137 int alcs_remove_svr_key(CoAPContext *context, const char *keyprefix);
138 /*  设置吊销列表*
139  *  context:   为当前设备生成的CoAPContext对象指针
140  *  seqlist:   吊销列表字符串,每个被吊销设备占用三字节
141  */
142 int alcs_set_revocation(CoAPContext *context, const char *seqlist);
143 #endif
144 
145 int alcs_add_ctl_group(CoAPContext *context, const char *groupid,
146                        const char *accesskey, const char *accesstoken);
147 int alcs_remove_ctl_group(CoAPContext *context, const char *groupid);
148 
149 int alcs_add_svr_group(CoAPContext *context, const char *groupid,
150                        const char *keyprefix, const char *secret);
151 int alcs_remove_svr_group(CoAPContext *context, const char *groupid);
152 
153 #ifdef __cplusplus
154 }
155 #endif /* __cplusplus */
156 
157 #endif
158