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