Xin Zhang / azure-iot-c-sdk-f767zi

Dependents:   samplemqtt

Committer:
XinZhangMS
Date:
Thu Aug 23 06:52:14 2018 +0000
Revision:
0:f7f1f0d76dd6
azure-c-sdk for mbed os supporting NUCLEO_F767ZI

Who changed what in which revision?

UserRevisionLine numberNew contents of line
XinZhangMS 0:f7f1f0d76dd6 1 // Copyright (c) Microsoft. All rights reserved.
XinZhangMS 0:f7f1f0d76dd6 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
XinZhangMS 0:f7f1f0d76dd6 3
XinZhangMS 0:f7f1f0d76dd6 4 #include <stdlib.h>
XinZhangMS 0:f7f1f0d76dd6 5 #include "azure_c_shared_utility/gballoc.h"
XinZhangMS 0:f7f1f0d76dd6 6 #include "azure_c_shared_utility/macro_utils.h"
XinZhangMS 0:f7f1f0d76dd6 7 #include "azure_c_shared_utility/umock_c_prod.h"
XinZhangMS 0:f7f1f0d76dd6 8 #include "azure_c_shared_utility/crt_abstractions.h"
XinZhangMS 0:f7f1f0d76dd6 9 #include "azure_c_shared_utility/agenttime.h"
XinZhangMS 0:f7f1f0d76dd6 10 #include "azure_c_shared_utility/xlogging.h"
XinZhangMS 0:f7f1f0d76dd6 11 #include "azure_c_shared_utility/strings.h"
XinZhangMS 0:f7f1f0d76dd6 12 #include "azure_c_shared_utility/sastoken.h"
XinZhangMS 0:f7f1f0d76dd6 13 #include "azure_c_shared_utility/shared_util_options.h"
XinZhangMS 0:f7f1f0d76dd6 14
XinZhangMS 0:f7f1f0d76dd6 15 #ifdef USE_PROV_MODULE
XinZhangMS 0:f7f1f0d76dd6 16 #include "azure_prov_client/internal/iothub_auth_client.h"
XinZhangMS 0:f7f1f0d76dd6 17 #endif
XinZhangMS 0:f7f1f0d76dd6 18
XinZhangMS 0:f7f1f0d76dd6 19 #include "internal/iothub_client_authorization.h"
XinZhangMS 0:f7f1f0d76dd6 20
XinZhangMS 0:f7f1f0d76dd6 21 #define DEFAULT_SAS_TOKEN_EXPIRY_TIME_SECS 3600
XinZhangMS 0:f7f1f0d76dd6 22 #define INDEFINITE_TIME ((time_t)(-1))
XinZhangMS 0:f7f1f0d76dd6 23
XinZhangMS 0:f7f1f0d76dd6 24 typedef struct IOTHUB_AUTHORIZATION_DATA_TAG
XinZhangMS 0:f7f1f0d76dd6 25 {
XinZhangMS 0:f7f1f0d76dd6 26 char* device_sas_token;
XinZhangMS 0:f7f1f0d76dd6 27 char* device_key;
XinZhangMS 0:f7f1f0d76dd6 28 char* device_id;
XinZhangMS 0:f7f1f0d76dd6 29 char* module_id;
XinZhangMS 0:f7f1f0d76dd6 30 size_t token_expiry_time_sec;
XinZhangMS 0:f7f1f0d76dd6 31 IOTHUB_CREDENTIAL_TYPE cred_type;
XinZhangMS 0:f7f1f0d76dd6 32 #ifdef USE_PROV_MODULE
XinZhangMS 0:f7f1f0d76dd6 33 IOTHUB_SECURITY_HANDLE device_auth_handle;
XinZhangMS 0:f7f1f0d76dd6 34 #endif
XinZhangMS 0:f7f1f0d76dd6 35 } IOTHUB_AUTHORIZATION_DATA;
XinZhangMS 0:f7f1f0d76dd6 36
XinZhangMS 0:f7f1f0d76dd6 37 static int get_seconds_since_epoch(size_t* seconds)
XinZhangMS 0:f7f1f0d76dd6 38 {
XinZhangMS 0:f7f1f0d76dd6 39 int result;
XinZhangMS 0:f7f1f0d76dd6 40 time_t current_time;
XinZhangMS 0:f7f1f0d76dd6 41 if ((current_time = get_time(NULL)) == INDEFINITE_TIME)
XinZhangMS 0:f7f1f0d76dd6 42 {
XinZhangMS 0:f7f1f0d76dd6 43 LogError("Failed getting the current local time (get_time() failed)");
XinZhangMS 0:f7f1f0d76dd6 44 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 45 }
XinZhangMS 0:f7f1f0d76dd6 46 else
XinZhangMS 0:f7f1f0d76dd6 47 {
XinZhangMS 0:f7f1f0d76dd6 48 *seconds = (size_t)get_difftime(current_time, (time_t)0);
XinZhangMS 0:f7f1f0d76dd6 49 result = 0;
XinZhangMS 0:f7f1f0d76dd6 50 }
XinZhangMS 0:f7f1f0d76dd6 51 return result;
XinZhangMS 0:f7f1f0d76dd6 52 }
XinZhangMS 0:f7f1f0d76dd6 53
XinZhangMS 0:f7f1f0d76dd6 54 IOTHUB_AUTHORIZATION_HANDLE IoTHubClient_Auth_Create(const char* device_key, const char* device_id, const char* device_sas_token, const char *module_id)
XinZhangMS 0:f7f1f0d76dd6 55 {
XinZhangMS 0:f7f1f0d76dd6 56 IOTHUB_AUTHORIZATION_DATA* result;
XinZhangMS 0:f7f1f0d76dd6 57 /* Codes_SRS_IoTHub_Authorization_07_001: [if device_id is NULL IoTHubClient_Auth_Create, shall return NULL. ] */
XinZhangMS 0:f7f1f0d76dd6 58 if (device_id == NULL)
XinZhangMS 0:f7f1f0d76dd6 59 {
XinZhangMS 0:f7f1f0d76dd6 60 LogError("Invalid Parameter device_id: %p", device_id);
XinZhangMS 0:f7f1f0d76dd6 61 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 62 }
XinZhangMS 0:f7f1f0d76dd6 63 else
XinZhangMS 0:f7f1f0d76dd6 64 {
XinZhangMS 0:f7f1f0d76dd6 65 /* Codes_SRS_IoTHub_Authorization_07_002: [IoTHubClient_Auth_Create shall allocate a IOTHUB_AUTHORIZATION_HANDLE that is needed for subsequent calls. ] */
XinZhangMS 0:f7f1f0d76dd6 66 result = (IOTHUB_AUTHORIZATION_DATA*)malloc(sizeof(IOTHUB_AUTHORIZATION_DATA) );
XinZhangMS 0:f7f1f0d76dd6 67 if (result == NULL)
XinZhangMS 0:f7f1f0d76dd6 68 {
XinZhangMS 0:f7f1f0d76dd6 69 /* Codes_SRS_IoTHub_Authorization_07_019: [ On error IoTHubClient_Auth_Create shall return NULL. ] */
XinZhangMS 0:f7f1f0d76dd6 70 LogError("Failed allocating IOTHUB_AUTHORIZATION_DATA");
XinZhangMS 0:f7f1f0d76dd6 71 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 72 }
XinZhangMS 0:f7f1f0d76dd6 73 else
XinZhangMS 0:f7f1f0d76dd6 74 {
XinZhangMS 0:f7f1f0d76dd6 75 memset(result, 0, sizeof(IOTHUB_AUTHORIZATION_DATA) );
XinZhangMS 0:f7f1f0d76dd6 76 result->token_expiry_time_sec = DEFAULT_SAS_TOKEN_EXPIRY_TIME_SECS;
XinZhangMS 0:f7f1f0d76dd6 77
XinZhangMS 0:f7f1f0d76dd6 78 if (device_key != NULL && mallocAndStrcpy_s(&result->device_key, device_key) != 0)
XinZhangMS 0:f7f1f0d76dd6 79 {
XinZhangMS 0:f7f1f0d76dd6 80 /* Codes_SRS_IoTHub_Authorization_07_019: [ On error IoTHubClient_Auth_Create shall return NULL. ] */
XinZhangMS 0:f7f1f0d76dd6 81 LogError("Failed allocating device_key");
XinZhangMS 0:f7f1f0d76dd6 82 free(result);
XinZhangMS 0:f7f1f0d76dd6 83 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 84 }
XinZhangMS 0:f7f1f0d76dd6 85 else if (mallocAndStrcpy_s(&result->device_id, device_id) != 0)
XinZhangMS 0:f7f1f0d76dd6 86 {
XinZhangMS 0:f7f1f0d76dd6 87 /* Codes_SRS_IoTHub_Authorization_07_019: [ On error IoTHubClient_Auth_Create shall return NULL. ] */
XinZhangMS 0:f7f1f0d76dd6 88 LogError("Failed allocating device_key");
XinZhangMS 0:f7f1f0d76dd6 89 free(result->device_key);
XinZhangMS 0:f7f1f0d76dd6 90 free(result);
XinZhangMS 0:f7f1f0d76dd6 91 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 92 }
XinZhangMS 0:f7f1f0d76dd6 93 else if (module_id != NULL && mallocAndStrcpy_s(&result->module_id, module_id) != 0)
XinZhangMS 0:f7f1f0d76dd6 94 {
XinZhangMS 0:f7f1f0d76dd6 95 /* Codes_SRS_IoTHub_Authorization_07_019: [ On error IoTHubClient_Auth_Create shall return NULL. ] */
XinZhangMS 0:f7f1f0d76dd6 96 LogError("Failed allocating module_id");
XinZhangMS 0:f7f1f0d76dd6 97 free(result->device_id);
XinZhangMS 0:f7f1f0d76dd6 98 free(result->device_key);
XinZhangMS 0:f7f1f0d76dd6 99 free(result);
XinZhangMS 0:f7f1f0d76dd6 100 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 101 }
XinZhangMS 0:f7f1f0d76dd6 102 else
XinZhangMS 0:f7f1f0d76dd6 103 {
XinZhangMS 0:f7f1f0d76dd6 104 if (device_key != NULL)
XinZhangMS 0:f7f1f0d76dd6 105 {
XinZhangMS 0:f7f1f0d76dd6 106 /* Codes_SRS_IoTHub_Authorization_07_003: [ IoTHubClient_Auth_Create shall set the credential type to IOTHUB_CREDENTIAL_TYPE_DEVICE_KEY if the device_sas_token is NULL. ]*/
XinZhangMS 0:f7f1f0d76dd6 107 result->cred_type = IOTHUB_CREDENTIAL_TYPE_DEVICE_KEY;
XinZhangMS 0:f7f1f0d76dd6 108 }
XinZhangMS 0:f7f1f0d76dd6 109 else if (device_sas_token != NULL)
XinZhangMS 0:f7f1f0d76dd6 110 {
XinZhangMS 0:f7f1f0d76dd6 111 /* Codes_SRS_IoTHub_Authorization_07_020: [ else IoTHubClient_Auth_Create shall set the credential type to IOTHUB_CREDENTIAL_TYPE_SAS_TOKEN. ] */
XinZhangMS 0:f7f1f0d76dd6 112 result->cred_type = IOTHUB_CREDENTIAL_TYPE_SAS_TOKEN;
XinZhangMS 0:f7f1f0d76dd6 113 if (mallocAndStrcpy_s(&result->device_sas_token, device_sas_token) != 0)
XinZhangMS 0:f7f1f0d76dd6 114 {
XinZhangMS 0:f7f1f0d76dd6 115 /* Codes_SRS_IoTHub_Authorization_07_019: [ On error IoTHubClient_Auth_Create shall return NULL. ] */
XinZhangMS 0:f7f1f0d76dd6 116 LogError("Failed allocating device_key");
XinZhangMS 0:f7f1f0d76dd6 117 free(result->device_key);
XinZhangMS 0:f7f1f0d76dd6 118 free(result->device_id);
XinZhangMS 0:f7f1f0d76dd6 119 free(result->module_id);
XinZhangMS 0:f7f1f0d76dd6 120 free(result);
XinZhangMS 0:f7f1f0d76dd6 121 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 122 }
XinZhangMS 0:f7f1f0d76dd6 123 }
XinZhangMS 0:f7f1f0d76dd6 124 else
XinZhangMS 0:f7f1f0d76dd6 125 {
XinZhangMS 0:f7f1f0d76dd6 126 /* Codes_SRS_IoTHub_Authorization_07_024: [ if device_sas_token and device_key are NULL IoTHubClient_Auth_Create shall set the credential type to IOTHUB_CREDENTIAL_TYPE_UNKNOWN. ] */
XinZhangMS 0:f7f1f0d76dd6 127 result->cred_type = IOTHUB_CREDENTIAL_TYPE_UNKNOWN;
XinZhangMS 0:f7f1f0d76dd6 128 }
XinZhangMS 0:f7f1f0d76dd6 129 }
XinZhangMS 0:f7f1f0d76dd6 130 }
XinZhangMS 0:f7f1f0d76dd6 131 }
XinZhangMS 0:f7f1f0d76dd6 132 /* Codes_SRS_IoTHub_Authorization_07_004: [ If successful IoTHubClient_Auth_Create shall return a IOTHUB_AUTHORIZATION_HANDLE value. ] */
XinZhangMS 0:f7f1f0d76dd6 133 return result;
XinZhangMS 0:f7f1f0d76dd6 134 }
XinZhangMS 0:f7f1f0d76dd6 135
XinZhangMS 0:f7f1f0d76dd6 136 IOTHUB_AUTHORIZATION_HANDLE IoTHubClient_Auth_CreateFromDeviceAuth(const char* device_id, const char* module_id)
XinZhangMS 0:f7f1f0d76dd6 137 {
XinZhangMS 0:f7f1f0d76dd6 138 IOTHUB_AUTHORIZATION_DATA* result;
XinZhangMS 0:f7f1f0d76dd6 139 if (device_id == NULL)
XinZhangMS 0:f7f1f0d76dd6 140 {
XinZhangMS 0:f7f1f0d76dd6 141 LogError("Invalid Parameter device_id: %p", device_id);
XinZhangMS 0:f7f1f0d76dd6 142 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 143 }
XinZhangMS 0:f7f1f0d76dd6 144 else
XinZhangMS 0:f7f1f0d76dd6 145 {
XinZhangMS 0:f7f1f0d76dd6 146 #ifdef USE_PROV_MODULE
XinZhangMS 0:f7f1f0d76dd6 147 result = (IOTHUB_AUTHORIZATION_DATA*)malloc(sizeof(IOTHUB_AUTHORIZATION_DATA));
XinZhangMS 0:f7f1f0d76dd6 148 if (result == NULL)
XinZhangMS 0:f7f1f0d76dd6 149 {
XinZhangMS 0:f7f1f0d76dd6 150 LogError("Failed allocating IOTHUB_AUTHORIZATION_DATA");
XinZhangMS 0:f7f1f0d76dd6 151 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 152 }
XinZhangMS 0:f7f1f0d76dd6 153 else
XinZhangMS 0:f7f1f0d76dd6 154 {
XinZhangMS 0:f7f1f0d76dd6 155 memset(result, 0, sizeof(IOTHUB_AUTHORIZATION_DATA));
XinZhangMS 0:f7f1f0d76dd6 156
XinZhangMS 0:f7f1f0d76dd6 157 result->device_auth_handle = iothub_device_auth_create();
XinZhangMS 0:f7f1f0d76dd6 158 if (result->device_auth_handle == NULL)
XinZhangMS 0:f7f1f0d76dd6 159 {
XinZhangMS 0:f7f1f0d76dd6 160 LogError("Failed allocating IOTHUB_AUTHORIZATION_DATA");
XinZhangMS 0:f7f1f0d76dd6 161 free(result);
XinZhangMS 0:f7f1f0d76dd6 162 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 163 }
XinZhangMS 0:f7f1f0d76dd6 164 else if (mallocAndStrcpy_s(&result->device_id, device_id) != 0)
XinZhangMS 0:f7f1f0d76dd6 165 {
XinZhangMS 0:f7f1f0d76dd6 166 LogError("Failed allocating device_id");
XinZhangMS 0:f7f1f0d76dd6 167 iothub_device_auth_destroy(result->device_auth_handle);
XinZhangMS 0:f7f1f0d76dd6 168 free(result);
XinZhangMS 0:f7f1f0d76dd6 169 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 170 }
XinZhangMS 0:f7f1f0d76dd6 171 else if ((module_id != NULL) && (mallocAndStrcpy_s(&result->module_id, module_id) != 0))
XinZhangMS 0:f7f1f0d76dd6 172 {
XinZhangMS 0:f7f1f0d76dd6 173 LogError("Failed allocating module_id");
XinZhangMS 0:f7f1f0d76dd6 174 iothub_device_auth_destroy(result->device_auth_handle);
XinZhangMS 0:f7f1f0d76dd6 175 free(result->device_id);
XinZhangMS 0:f7f1f0d76dd6 176 free(result);
XinZhangMS 0:f7f1f0d76dd6 177 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 178 }
XinZhangMS 0:f7f1f0d76dd6 179 else
XinZhangMS 0:f7f1f0d76dd6 180 {
XinZhangMS 0:f7f1f0d76dd6 181 if (iothub_device_auth_get_type(result->device_auth_handle) == AUTH_TYPE_SAS)
XinZhangMS 0:f7f1f0d76dd6 182 {
XinZhangMS 0:f7f1f0d76dd6 183 result->cred_type = IOTHUB_CREDENTIAL_TYPE_DEVICE_AUTH;
XinZhangMS 0:f7f1f0d76dd6 184 }
XinZhangMS 0:f7f1f0d76dd6 185 else
XinZhangMS 0:f7f1f0d76dd6 186 {
XinZhangMS 0:f7f1f0d76dd6 187 result->cred_type = IOTHUB_CREDENTIAL_TYPE_X509_ECC;
XinZhangMS 0:f7f1f0d76dd6 188 }
XinZhangMS 0:f7f1f0d76dd6 189 }
XinZhangMS 0:f7f1f0d76dd6 190 }
XinZhangMS 0:f7f1f0d76dd6 191 #else
XinZhangMS 0:f7f1f0d76dd6 192 (void)module_id;
XinZhangMS 0:f7f1f0d76dd6 193 LogError("Failed HSM module is not supported");
XinZhangMS 0:f7f1f0d76dd6 194 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 195 #endif
XinZhangMS 0:f7f1f0d76dd6 196 }
XinZhangMS 0:f7f1f0d76dd6 197 return result;
XinZhangMS 0:f7f1f0d76dd6 198 }
XinZhangMS 0:f7f1f0d76dd6 199
XinZhangMS 0:f7f1f0d76dd6 200 void IoTHubClient_Auth_Destroy(IOTHUB_AUTHORIZATION_HANDLE handle)
XinZhangMS 0:f7f1f0d76dd6 201 {
XinZhangMS 0:f7f1f0d76dd6 202 /* Codes_SRS_IoTHub_Authorization_07_005: [ if handle is NULL IoTHubClient_Auth_Destroy shall do nothing. ] */
XinZhangMS 0:f7f1f0d76dd6 203 if (handle != NULL)
XinZhangMS 0:f7f1f0d76dd6 204 {
XinZhangMS 0:f7f1f0d76dd6 205 /* Codes_SRS_IoTHub_Authorization_07_006: [ IoTHubClient_Auth_Destroy shall free all resources associated with the IOTHUB_AUTHORIZATION_HANDLE handle. ] */
XinZhangMS 0:f7f1f0d76dd6 206 #ifdef USE_PROV_MODULE
XinZhangMS 0:f7f1f0d76dd6 207 iothub_device_auth_destroy(handle->device_auth_handle);
XinZhangMS 0:f7f1f0d76dd6 208 #endif
XinZhangMS 0:f7f1f0d76dd6 209 free(handle->device_key);
XinZhangMS 0:f7f1f0d76dd6 210 free(handle->device_id);
XinZhangMS 0:f7f1f0d76dd6 211 free(handle->module_id);
XinZhangMS 0:f7f1f0d76dd6 212 free(handle->device_sas_token);
XinZhangMS 0:f7f1f0d76dd6 213 free(handle);
XinZhangMS 0:f7f1f0d76dd6 214 }
XinZhangMS 0:f7f1f0d76dd6 215 }
XinZhangMS 0:f7f1f0d76dd6 216
XinZhangMS 0:f7f1f0d76dd6 217 IOTHUB_CREDENTIAL_TYPE IoTHubClient_Auth_Set_x509_Type(IOTHUB_AUTHORIZATION_HANDLE handle, bool enable_x509)
XinZhangMS 0:f7f1f0d76dd6 218 {
XinZhangMS 0:f7f1f0d76dd6 219 IOTHUB_CREDENTIAL_TYPE result;
XinZhangMS 0:f7f1f0d76dd6 220 if (handle != NULL)
XinZhangMS 0:f7f1f0d76dd6 221 {
XinZhangMS 0:f7f1f0d76dd6 222 if (enable_x509)
XinZhangMS 0:f7f1f0d76dd6 223 {
XinZhangMS 0:f7f1f0d76dd6 224 result = handle->cred_type = IOTHUB_CREDENTIAL_TYPE_X509;
XinZhangMS 0:f7f1f0d76dd6 225 }
XinZhangMS 0:f7f1f0d76dd6 226 else
XinZhangMS 0:f7f1f0d76dd6 227 {
XinZhangMS 0:f7f1f0d76dd6 228 if (handle->device_sas_token == NULL)
XinZhangMS 0:f7f1f0d76dd6 229 {
XinZhangMS 0:f7f1f0d76dd6 230 result = handle->cred_type = IOTHUB_CREDENTIAL_TYPE_DEVICE_KEY;
XinZhangMS 0:f7f1f0d76dd6 231 }
XinZhangMS 0:f7f1f0d76dd6 232 else if (handle->device_key == NULL)
XinZhangMS 0:f7f1f0d76dd6 233 {
XinZhangMS 0:f7f1f0d76dd6 234 result = handle->cred_type = IOTHUB_CREDENTIAL_TYPE_SAS_TOKEN;
XinZhangMS 0:f7f1f0d76dd6 235 }
XinZhangMS 0:f7f1f0d76dd6 236 else
XinZhangMS 0:f7f1f0d76dd6 237 {
XinZhangMS 0:f7f1f0d76dd6 238 result = handle->cred_type = IOTHUB_CREDENTIAL_TYPE_UNKNOWN;
XinZhangMS 0:f7f1f0d76dd6 239 }
XinZhangMS 0:f7f1f0d76dd6 240 }
XinZhangMS 0:f7f1f0d76dd6 241 }
XinZhangMS 0:f7f1f0d76dd6 242 else
XinZhangMS 0:f7f1f0d76dd6 243 {
XinZhangMS 0:f7f1f0d76dd6 244 result = IOTHUB_CREDENTIAL_TYPE_UNKNOWN;
XinZhangMS 0:f7f1f0d76dd6 245 }
XinZhangMS 0:f7f1f0d76dd6 246 return result;
XinZhangMS 0:f7f1f0d76dd6 247 }
XinZhangMS 0:f7f1f0d76dd6 248
XinZhangMS 0:f7f1f0d76dd6 249 int IoTHubClient_Auth_Set_xio_Certificate(IOTHUB_AUTHORIZATION_HANDLE handle, XIO_HANDLE xio)
XinZhangMS 0:f7f1f0d76dd6 250 {
XinZhangMS 0:f7f1f0d76dd6 251 int result;
XinZhangMS 0:f7f1f0d76dd6 252 if (handle == NULL || xio == NULL)
XinZhangMS 0:f7f1f0d76dd6 253 {
XinZhangMS 0:f7f1f0d76dd6 254 LogError("Invalid Parameter handle: %p xio: %p", handle, xio);
XinZhangMS 0:f7f1f0d76dd6 255 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 256 }
XinZhangMS 0:f7f1f0d76dd6 257 else if (handle->cred_type != IOTHUB_CREDENTIAL_TYPE_X509_ECC)
XinZhangMS 0:f7f1f0d76dd6 258 {
XinZhangMS 0:f7f1f0d76dd6 259 LogError("Invalid credential types for this operation");
XinZhangMS 0:f7f1f0d76dd6 260 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 261 }
XinZhangMS 0:f7f1f0d76dd6 262 else
XinZhangMS 0:f7f1f0d76dd6 263 {
XinZhangMS 0:f7f1f0d76dd6 264 #ifdef USE_PROV_MODULE
XinZhangMS 0:f7f1f0d76dd6 265 CREDENTIAL_RESULT* cred_result = iothub_device_auth_generate_credentials(handle->device_auth_handle, NULL);
XinZhangMS 0:f7f1f0d76dd6 266 if (cred_result == NULL)
XinZhangMS 0:f7f1f0d76dd6 267 {
XinZhangMS 0:f7f1f0d76dd6 268 LogError("Failure generating credentials");
XinZhangMS 0:f7f1f0d76dd6 269 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 270 }
XinZhangMS 0:f7f1f0d76dd6 271 else
XinZhangMS 0:f7f1f0d76dd6 272 {
XinZhangMS 0:f7f1f0d76dd6 273 if (xio_setoption(xio, OPTION_X509_ECC_CERT, cred_result->auth_cred_result.x509_result.x509_cert) != 0)
XinZhangMS 0:f7f1f0d76dd6 274 {
XinZhangMS 0:f7f1f0d76dd6 275 LogError("Failure setting x509 cert on xio");
XinZhangMS 0:f7f1f0d76dd6 276 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 277 }
XinZhangMS 0:f7f1f0d76dd6 278 else if (xio_setoption(xio, OPTION_X509_ECC_KEY, cred_result->auth_cred_result.x509_result.x509_alias_key) != 0)
XinZhangMS 0:f7f1f0d76dd6 279 {
XinZhangMS 0:f7f1f0d76dd6 280 LogError("Failure setting x509 key on xio");
XinZhangMS 0:f7f1f0d76dd6 281 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 282 }
XinZhangMS 0:f7f1f0d76dd6 283 else
XinZhangMS 0:f7f1f0d76dd6 284 {
XinZhangMS 0:f7f1f0d76dd6 285 result = 0;
XinZhangMS 0:f7f1f0d76dd6 286 }
XinZhangMS 0:f7f1f0d76dd6 287 free(cred_result);
XinZhangMS 0:f7f1f0d76dd6 288 }
XinZhangMS 0:f7f1f0d76dd6 289 #else
XinZhangMS 0:f7f1f0d76dd6 290 LogError("Failed HSM module is not supported");
XinZhangMS 0:f7f1f0d76dd6 291 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 292 #endif
XinZhangMS 0:f7f1f0d76dd6 293 }
XinZhangMS 0:f7f1f0d76dd6 294 return result;
XinZhangMS 0:f7f1f0d76dd6 295 }
XinZhangMS 0:f7f1f0d76dd6 296
XinZhangMS 0:f7f1f0d76dd6 297 IOTHUB_CREDENTIAL_TYPE IoTHubClient_Auth_Get_Credential_Type(IOTHUB_AUTHORIZATION_HANDLE handle)
XinZhangMS 0:f7f1f0d76dd6 298 {
XinZhangMS 0:f7f1f0d76dd6 299 IOTHUB_CREDENTIAL_TYPE result;
XinZhangMS 0:f7f1f0d76dd6 300 /* Codes_SRS_IoTHub_Authorization_07_007: [ if handle is NULL IoTHub_Auth_Get_Credential_Type shall return IOTHUB_CREDENTIAL_TYPE_UNKNOWN. ] */
XinZhangMS 0:f7f1f0d76dd6 301 if (handle == NULL)
XinZhangMS 0:f7f1f0d76dd6 302 {
XinZhangMS 0:f7f1f0d76dd6 303 LogError("Invalid Parameter handle: %p", handle);
XinZhangMS 0:f7f1f0d76dd6 304 result = IOTHUB_CREDENTIAL_TYPE_UNKNOWN;
XinZhangMS 0:f7f1f0d76dd6 305 }
XinZhangMS 0:f7f1f0d76dd6 306 else
XinZhangMS 0:f7f1f0d76dd6 307 {
XinZhangMS 0:f7f1f0d76dd6 308 /* Codes_SRS_IoTHub_Authorization_07_008: [ IoTHub_Auth_Get_Credential_Type shall return the credential type that is set upon creation. ] */
XinZhangMS 0:f7f1f0d76dd6 309 result = handle->cred_type;
XinZhangMS 0:f7f1f0d76dd6 310 }
XinZhangMS 0:f7f1f0d76dd6 311 return result;
XinZhangMS 0:f7f1f0d76dd6 312 }
XinZhangMS 0:f7f1f0d76dd6 313
XinZhangMS 0:f7f1f0d76dd6 314 char* IoTHubClient_Auth_Get_SasToken(IOTHUB_AUTHORIZATION_HANDLE handle, const char* scope, size_t expiry_time_relative_seconds, const char* key_name)
XinZhangMS 0:f7f1f0d76dd6 315 {
XinZhangMS 0:f7f1f0d76dd6 316 char* result;
XinZhangMS 0:f7f1f0d76dd6 317 /* Codes_SRS_IoTHub_Authorization_07_009: [ if handle or scope are NULL, IoTHubClient_Auth_Get_SasToken shall return NULL. ] */
XinZhangMS 0:f7f1f0d76dd6 318 if (handle == NULL)
XinZhangMS 0:f7f1f0d76dd6 319 {
XinZhangMS 0:f7f1f0d76dd6 320 LogError("Invalid Parameter handle: %p", handle);
XinZhangMS 0:f7f1f0d76dd6 321 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 322 }
XinZhangMS 0:f7f1f0d76dd6 323 else
XinZhangMS 0:f7f1f0d76dd6 324 {
XinZhangMS 0:f7f1f0d76dd6 325 if (handle->cred_type == IOTHUB_CREDENTIAL_TYPE_DEVICE_AUTH)
XinZhangMS 0:f7f1f0d76dd6 326 {
XinZhangMS 0:f7f1f0d76dd6 327 #ifdef USE_PROV_MODULE
XinZhangMS 0:f7f1f0d76dd6 328 DEVICE_AUTH_CREDENTIAL_INFO dev_auth_cred;
XinZhangMS 0:f7f1f0d76dd6 329 size_t sec_since_epoch;
XinZhangMS 0:f7f1f0d76dd6 330
XinZhangMS 0:f7f1f0d76dd6 331 if (get_seconds_since_epoch(&sec_since_epoch) != 0)
XinZhangMS 0:f7f1f0d76dd6 332 {
XinZhangMS 0:f7f1f0d76dd6 333 LogError("failure getting seconds from epoch");
XinZhangMS 0:f7f1f0d76dd6 334 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 335 }
XinZhangMS 0:f7f1f0d76dd6 336 else
XinZhangMS 0:f7f1f0d76dd6 337 {
XinZhangMS 0:f7f1f0d76dd6 338 memset(&dev_auth_cred, 0, sizeof(DEVICE_AUTH_CREDENTIAL_INFO));
XinZhangMS 0:f7f1f0d76dd6 339 size_t expiry_time = sec_since_epoch+expiry_time_relative_seconds;
XinZhangMS 0:f7f1f0d76dd6 340 dev_auth_cred.sas_info.expiry_seconds = expiry_time;
XinZhangMS 0:f7f1f0d76dd6 341 dev_auth_cred.sas_info.token_scope = scope;
XinZhangMS 0:f7f1f0d76dd6 342 dev_auth_cred.sas_info.key_name = key_name;
XinZhangMS 0:f7f1f0d76dd6 343 dev_auth_cred.dev_auth_type = AUTH_TYPE_SAS;
XinZhangMS 0:f7f1f0d76dd6 344
XinZhangMS 0:f7f1f0d76dd6 345 CREDENTIAL_RESULT* cred_result = iothub_device_auth_generate_credentials(handle->device_auth_handle, &dev_auth_cred);
XinZhangMS 0:f7f1f0d76dd6 346 if (cred_result == NULL)
XinZhangMS 0:f7f1f0d76dd6 347 {
XinZhangMS 0:f7f1f0d76dd6 348 LogError("failure getting credentials from device auth module");
XinZhangMS 0:f7f1f0d76dd6 349 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 350 }
XinZhangMS 0:f7f1f0d76dd6 351 else
XinZhangMS 0:f7f1f0d76dd6 352 {
XinZhangMS 0:f7f1f0d76dd6 353 if (mallocAndStrcpy_s(&result, cred_result->auth_cred_result.sas_result.sas_token) != 0)
XinZhangMS 0:f7f1f0d76dd6 354 {
XinZhangMS 0:f7f1f0d76dd6 355 LogError("failure allocating Sas Token");
XinZhangMS 0:f7f1f0d76dd6 356 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 357 }
XinZhangMS 0:f7f1f0d76dd6 358 free(cred_result);
XinZhangMS 0:f7f1f0d76dd6 359 }
XinZhangMS 0:f7f1f0d76dd6 360 }
XinZhangMS 0:f7f1f0d76dd6 361 #else
XinZhangMS 0:f7f1f0d76dd6 362 LogError("Failed HSM module is not supported");
XinZhangMS 0:f7f1f0d76dd6 363 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 364 #endif
XinZhangMS 0:f7f1f0d76dd6 365 }
XinZhangMS 0:f7f1f0d76dd6 366 else if (handle->cred_type == IOTHUB_CREDENTIAL_TYPE_SAS_TOKEN)
XinZhangMS 0:f7f1f0d76dd6 367 {
XinZhangMS 0:f7f1f0d76dd6 368 /* Codes_SRS_IoTHub_Authorization_07_021: [If the device_sas_token is NOT NULL IoTHubClient_Auth_Get_SasToken shall return a copy of the device_sas_token. ] */
XinZhangMS 0:f7f1f0d76dd6 369 if (handle->device_sas_token != NULL)
XinZhangMS 0:f7f1f0d76dd6 370 {
XinZhangMS 0:f7f1f0d76dd6 371 if (mallocAndStrcpy_s(&result, handle->device_sas_token) != 0)
XinZhangMS 0:f7f1f0d76dd6 372 {
XinZhangMS 0:f7f1f0d76dd6 373 LogError("failure allocating sas token");
XinZhangMS 0:f7f1f0d76dd6 374 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 375 }
XinZhangMS 0:f7f1f0d76dd6 376 }
XinZhangMS 0:f7f1f0d76dd6 377 else
XinZhangMS 0:f7f1f0d76dd6 378 {
XinZhangMS 0:f7f1f0d76dd6 379 LogError("failure device sas token is NULL");
XinZhangMS 0:f7f1f0d76dd6 380 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 381 }
XinZhangMS 0:f7f1f0d76dd6 382 }
XinZhangMS 0:f7f1f0d76dd6 383 else if (handle->cred_type == IOTHUB_CREDENTIAL_TYPE_DEVICE_KEY)
XinZhangMS 0:f7f1f0d76dd6 384 {
XinZhangMS 0:f7f1f0d76dd6 385 /* Codes_SRS_IoTHub_Authorization_07_009: [ if handle or scope are NULL, IoTHubClient_Auth_Get_SasToken shall return NULL. ] */
XinZhangMS 0:f7f1f0d76dd6 386 if (scope == NULL)
XinZhangMS 0:f7f1f0d76dd6 387 {
XinZhangMS 0:f7f1f0d76dd6 388 LogError("Invalid Parameter scope: %p", scope);
XinZhangMS 0:f7f1f0d76dd6 389 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 390 }
XinZhangMS 0:f7f1f0d76dd6 391 else
XinZhangMS 0:f7f1f0d76dd6 392 {
XinZhangMS 0:f7f1f0d76dd6 393 STRING_HANDLE sas_token;
XinZhangMS 0:f7f1f0d76dd6 394 size_t sec_since_epoch;
XinZhangMS 0:f7f1f0d76dd6 395
XinZhangMS 0:f7f1f0d76dd6 396 /* Codes_SRS_IoTHub_Authorization_07_010: [ IoTHubClient_Auth_Get_SasToken` shall construct the expiration time using the expiry_time_relative_seconds added to epoch time. ] */
XinZhangMS 0:f7f1f0d76dd6 397 if (get_seconds_since_epoch(&sec_since_epoch) != 0)
XinZhangMS 0:f7f1f0d76dd6 398 {
XinZhangMS 0:f7f1f0d76dd6 399 /* Codes_SRS_IoTHub_Authorization_07_020: [ If any error is encountered IoTHubClient_Auth_Get_ConnString shall return NULL. ] */
XinZhangMS 0:f7f1f0d76dd6 400 LogError("failure getting seconds from epoch");
XinZhangMS 0:f7f1f0d76dd6 401 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 402 }
XinZhangMS 0:f7f1f0d76dd6 403 else
XinZhangMS 0:f7f1f0d76dd6 404 {
XinZhangMS 0:f7f1f0d76dd6 405 /* Codes_SRS_IoTHub_Authorization_07_011: [ IoTHubClient_Auth_Get_ConnString shall call SASToken_CreateString to construct the sas token. ] */
XinZhangMS 0:f7f1f0d76dd6 406 size_t expiry_time = sec_since_epoch+expiry_time_relative_seconds;
XinZhangMS 0:f7f1f0d76dd6 407 if ( (sas_token = SASToken_CreateString(handle->device_key, scope, key_name, expiry_time)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 408 {
XinZhangMS 0:f7f1f0d76dd6 409 /* Codes_SRS_IoTHub_Authorization_07_020: [ If any error is encountered IoTHubClient_Auth_Get_ConnString shall return NULL. ] */
XinZhangMS 0:f7f1f0d76dd6 410 LogError("Failed creating sas_token");
XinZhangMS 0:f7f1f0d76dd6 411 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 412 }
XinZhangMS 0:f7f1f0d76dd6 413 else
XinZhangMS 0:f7f1f0d76dd6 414 {
XinZhangMS 0:f7f1f0d76dd6 415 /* Codes_SRS_IoTHub_Authorization_07_012: [ On success IoTHubClient_Auth_Get_ConnString shall allocate and return the sas token in a char*. ] */
XinZhangMS 0:f7f1f0d76dd6 416 if (mallocAndStrcpy_s(&result, STRING_c_str(sas_token) ) != 0)
XinZhangMS 0:f7f1f0d76dd6 417 {
XinZhangMS 0:f7f1f0d76dd6 418 /* Codes_SRS_IoTHub_Authorization_07_020: [ If any error is encountered IoTHubClient_Auth_Get_ConnString shall return NULL. ] */
XinZhangMS 0:f7f1f0d76dd6 419 LogError("Failed copying result");
XinZhangMS 0:f7f1f0d76dd6 420 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 421 }
XinZhangMS 0:f7f1f0d76dd6 422 STRING_delete(sas_token);
XinZhangMS 0:f7f1f0d76dd6 423 }
XinZhangMS 0:f7f1f0d76dd6 424 }
XinZhangMS 0:f7f1f0d76dd6 425 }
XinZhangMS 0:f7f1f0d76dd6 426 }
XinZhangMS 0:f7f1f0d76dd6 427 else
XinZhangMS 0:f7f1f0d76dd6 428 {
XinZhangMS 0:f7f1f0d76dd6 429 LogError("Failed getting sas token invalid credential type");
XinZhangMS 0:f7f1f0d76dd6 430 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 431 }
XinZhangMS 0:f7f1f0d76dd6 432 }
XinZhangMS 0:f7f1f0d76dd6 433 return result;
XinZhangMS 0:f7f1f0d76dd6 434 }
XinZhangMS 0:f7f1f0d76dd6 435
XinZhangMS 0:f7f1f0d76dd6 436 const char* IoTHubClient_Auth_Get_DeviceId(IOTHUB_AUTHORIZATION_HANDLE handle)
XinZhangMS 0:f7f1f0d76dd6 437 {
XinZhangMS 0:f7f1f0d76dd6 438 const char* result;
XinZhangMS 0:f7f1f0d76dd6 439 if (handle == NULL)
XinZhangMS 0:f7f1f0d76dd6 440 {
XinZhangMS 0:f7f1f0d76dd6 441 /* Codes_SRS_IoTHub_Authorization_07_013: [ if handle is NULL, IoTHubClient_Auth_Get_DeviceId shall return NULL. ] */
XinZhangMS 0:f7f1f0d76dd6 442 LogError("Invalid Parameter handle: %p", handle);
XinZhangMS 0:f7f1f0d76dd6 443 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 444 }
XinZhangMS 0:f7f1f0d76dd6 445 else
XinZhangMS 0:f7f1f0d76dd6 446 {
XinZhangMS 0:f7f1f0d76dd6 447 /* Codes_SRS_IoTHub_Authorization_07_014: [ IoTHubClient_Auth_Get_DeviceId shall return the device_id specified upon creation. ] */
XinZhangMS 0:f7f1f0d76dd6 448 result = handle->device_id;
XinZhangMS 0:f7f1f0d76dd6 449 }
XinZhangMS 0:f7f1f0d76dd6 450 return result;
XinZhangMS 0:f7f1f0d76dd6 451 }
XinZhangMS 0:f7f1f0d76dd6 452
XinZhangMS 0:f7f1f0d76dd6 453 const char* IoTHubClient_Auth_Get_ModuleId(IOTHUB_AUTHORIZATION_HANDLE handle)
XinZhangMS 0:f7f1f0d76dd6 454 {
XinZhangMS 0:f7f1f0d76dd6 455 const char* result;
XinZhangMS 0:f7f1f0d76dd6 456 if (handle == NULL)
XinZhangMS 0:f7f1f0d76dd6 457 {
XinZhangMS 0:f7f1f0d76dd6 458 /* Codes_SRS_IoTHub_Authorization_31_025: [ if handle is NULL, IoTHubClient_Auth_Get_ModuleId shall return NULL. ] */
XinZhangMS 0:f7f1f0d76dd6 459 LogError("Invalid Parameter handle: %p", handle);
XinZhangMS 0:f7f1f0d76dd6 460 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 461 }
XinZhangMS 0:f7f1f0d76dd6 462 else
XinZhangMS 0:f7f1f0d76dd6 463 {
XinZhangMS 0:f7f1f0d76dd6 464 /* Codes_SRS_IoTHub_Authorization_31_026: [ IoTHubClient_Auth_Get_ModuleId shall return the module_id specified upon creation. ] */
XinZhangMS 0:f7f1f0d76dd6 465 result = handle->module_id;
XinZhangMS 0:f7f1f0d76dd6 466 }
XinZhangMS 0:f7f1f0d76dd6 467 return result;
XinZhangMS 0:f7f1f0d76dd6 468 }
XinZhangMS 0:f7f1f0d76dd6 469
XinZhangMS 0:f7f1f0d76dd6 470 const char* IoTHubClient_Auth_Get_DeviceKey(IOTHUB_AUTHORIZATION_HANDLE handle)
XinZhangMS 0:f7f1f0d76dd6 471 {
XinZhangMS 0:f7f1f0d76dd6 472 const char* result;
XinZhangMS 0:f7f1f0d76dd6 473 if (handle == NULL)
XinZhangMS 0:f7f1f0d76dd6 474 {
XinZhangMS 0:f7f1f0d76dd6 475 /* Codes_SRS_IoTHub_Authorization_07_022: [ if handle is NULL, IoTHubClient_Auth_Get_DeviceKey shall return NULL. ] */
XinZhangMS 0:f7f1f0d76dd6 476 LogError("Invalid Parameter handle: %p", handle);
XinZhangMS 0:f7f1f0d76dd6 477 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 478 }
XinZhangMS 0:f7f1f0d76dd6 479 else
XinZhangMS 0:f7f1f0d76dd6 480 {
XinZhangMS 0:f7f1f0d76dd6 481 /* Codes_SRS_IoTHub_Authorization_07_023: [ IoTHubClient_Auth_Get_DeviceKey shall return the device_key specified upon creation. ] */
XinZhangMS 0:f7f1f0d76dd6 482 result = handle->device_key;
XinZhangMS 0:f7f1f0d76dd6 483 }
XinZhangMS 0:f7f1f0d76dd6 484 return result;
XinZhangMS 0:f7f1f0d76dd6 485 }
XinZhangMS 0:f7f1f0d76dd6 486
XinZhangMS 0:f7f1f0d76dd6 487 SAS_TOKEN_STATUS IoTHubClient_Auth_Is_SasToken_Valid(IOTHUB_AUTHORIZATION_HANDLE handle)
XinZhangMS 0:f7f1f0d76dd6 488 {
XinZhangMS 0:f7f1f0d76dd6 489 SAS_TOKEN_STATUS result;
XinZhangMS 0:f7f1f0d76dd6 490 if (handle == NULL)
XinZhangMS 0:f7f1f0d76dd6 491 {
XinZhangMS 0:f7f1f0d76dd6 492 /* Codes_SRS_IoTHub_Authorization_07_015: [ if handle is NULL, IoTHubClient_Auth_Is_SasToken_Valid shall return false. ] */
XinZhangMS 0:f7f1f0d76dd6 493 LogError("Invalid Parameter handle: %p", handle);
XinZhangMS 0:f7f1f0d76dd6 494 result = SAS_TOKEN_STATUS_FAILED;
XinZhangMS 0:f7f1f0d76dd6 495 }
XinZhangMS 0:f7f1f0d76dd6 496 else
XinZhangMS 0:f7f1f0d76dd6 497 {
XinZhangMS 0:f7f1f0d76dd6 498 if (handle->cred_type == IOTHUB_CREDENTIAL_TYPE_SAS_TOKEN)
XinZhangMS 0:f7f1f0d76dd6 499 {
XinZhangMS 0:f7f1f0d76dd6 500 if (handle->device_sas_token == NULL)
XinZhangMS 0:f7f1f0d76dd6 501 {
XinZhangMS 0:f7f1f0d76dd6 502 /* Codes_SRS_IoTHub_Authorization_07_017: [ If the sas_token is NULL IoTHubClient_Auth_Is_SasToken_Valid shall return false. ] */
XinZhangMS 0:f7f1f0d76dd6 503 LogError("Failure: device_sas_toke is NULL");
XinZhangMS 0:f7f1f0d76dd6 504 result = SAS_TOKEN_STATUS_FAILED;
XinZhangMS 0:f7f1f0d76dd6 505 }
XinZhangMS 0:f7f1f0d76dd6 506 else
XinZhangMS 0:f7f1f0d76dd6 507 {
XinZhangMS 0:f7f1f0d76dd6 508 /* Codes_SRS_IoTHub_Authorization_07_018: [ otherwise IoTHubClient_Auth_Is_SasToken_Valid shall return the value returned by SASToken_Validate. ] */
XinZhangMS 0:f7f1f0d76dd6 509 STRING_HANDLE strSasToken = STRING_construct(handle->device_sas_token);
XinZhangMS 0:f7f1f0d76dd6 510 if (strSasToken != NULL)
XinZhangMS 0:f7f1f0d76dd6 511 {
XinZhangMS 0:f7f1f0d76dd6 512 if (!SASToken_Validate(strSasToken))
XinZhangMS 0:f7f1f0d76dd6 513 {
XinZhangMS 0:f7f1f0d76dd6 514 result = SAS_TOKEN_STATUS_INVALID;
XinZhangMS 0:f7f1f0d76dd6 515 }
XinZhangMS 0:f7f1f0d76dd6 516 else
XinZhangMS 0:f7f1f0d76dd6 517 {
XinZhangMS 0:f7f1f0d76dd6 518 result = SAS_TOKEN_STATUS_VALID;
XinZhangMS 0:f7f1f0d76dd6 519 }
XinZhangMS 0:f7f1f0d76dd6 520 STRING_delete(strSasToken);
XinZhangMS 0:f7f1f0d76dd6 521 }
XinZhangMS 0:f7f1f0d76dd6 522 else
XinZhangMS 0:f7f1f0d76dd6 523 {
XinZhangMS 0:f7f1f0d76dd6 524 LogError("Failure constructing SAS Token");
XinZhangMS 0:f7f1f0d76dd6 525 result = SAS_TOKEN_STATUS_FAILED;
XinZhangMS 0:f7f1f0d76dd6 526 }
XinZhangMS 0:f7f1f0d76dd6 527 }
XinZhangMS 0:f7f1f0d76dd6 528 }
XinZhangMS 0:f7f1f0d76dd6 529 else
XinZhangMS 0:f7f1f0d76dd6 530 {
XinZhangMS 0:f7f1f0d76dd6 531 /* Codes_SRS_IoTHub_Authorization_07_016: [ if credential type is not IOTHUB_CREDENTIAL_TYPE_SAS_TOKEN IoTHubClient_Auth_Is_SasToken_Valid shall return SAS_TOKEN_STATUS_VALID. ] */
XinZhangMS 0:f7f1f0d76dd6 532 result = SAS_TOKEN_STATUS_VALID;
XinZhangMS 0:f7f1f0d76dd6 533 }
XinZhangMS 0:f7f1f0d76dd6 534 }
XinZhangMS 0:f7f1f0d76dd6 535 return result;
XinZhangMS 0:f7f1f0d76dd6 536 }
XinZhangMS 0:f7f1f0d76dd6 537
XinZhangMS 0:f7f1f0d76dd6 538
XinZhangMS 0:f7f1f0d76dd6 539 #ifdef USE_EDGE_MODULES
XinZhangMS 0:f7f1f0d76dd6 540 char* IoTHubClient_Auth_Get_TrustBundle(IOTHUB_AUTHORIZATION_HANDLE handle)
XinZhangMS 0:f7f1f0d76dd6 541 {
XinZhangMS 0:f7f1f0d76dd6 542 char* result;
XinZhangMS 0:f7f1f0d76dd6 543 if (handle == NULL)
XinZhangMS 0:f7f1f0d76dd6 544 {
XinZhangMS 0:f7f1f0d76dd6 545 LogError("Security Handle is NULL");
XinZhangMS 0:f7f1f0d76dd6 546 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 547 }
XinZhangMS 0:f7f1f0d76dd6 548 else
XinZhangMS 0:f7f1f0d76dd6 549 {
XinZhangMS 0:f7f1f0d76dd6 550 result = iothub_device_auth_get_trust_bundle(handle->device_auth_handle);
XinZhangMS 0:f7f1f0d76dd6 551 }
XinZhangMS 0:f7f1f0d76dd6 552 return result;
XinZhangMS 0:f7f1f0d76dd6 553 }
XinZhangMS 0:f7f1f0d76dd6 554 #endif
XinZhangMS 0:f7f1f0d76dd6 555