Demo using MBED TLS

Dependencies:   EthernetInterface NTPClient iothub_amqp_transport iothub_client mbed-rtos mbed

Fork of iothub_client_sample_amqp by Azure IoT

Committer:
markrad
Date:
Thu Jan 05 00:20:03 2017 +0000
Revision:
58:f50b97b08851
Sample using MBED TLS

Who changed what in which revision?

UserRevisionLine numberNew contents of line
markrad 58:f50b97b08851 1 // Copyright (c) Microsoft. All rights reserved.
markrad 58:f50b97b08851 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
markrad 58:f50b97b08851 3
markrad 58:f50b97b08851 4 #include <stdlib.h>
markrad 58:f50b97b08851 5 #ifdef _CRTDBG_MAP_ALLOC
markrad 58:f50b97b08851 6 #include <crtdbg.h>
markrad 58:f50b97b08851 7 #endif
markrad 58:f50b97b08851 8 #include "azure_c_shared_utility/gballoc.h"
markrad 58:f50b97b08851 9
markrad 58:f50b97b08851 10 #include "azure_c_shared_utility/map.h"
markrad 58:f50b97b08851 11 #include "azure_c_shared_utility/constmap.h"
markrad 58:f50b97b08851 12 #include "azure_c_shared_utility/xlogging.h"
markrad 58:f50b97b08851 13 #include "azure_c_shared_utility/refcount.h"
markrad 58:f50b97b08851 14
markrad 58:f50b97b08851 15 DEFINE_ENUM_STRINGS(CONSTMAP_RESULT, CONSTMAP_RESULT_VALUES);
markrad 58:f50b97b08851 16
markrad 58:f50b97b08851 17 typedef struct CONSTMAP_HANDLE_DATA_TAG
markrad 58:f50b97b08851 18 {
markrad 58:f50b97b08851 19 MAP_HANDLE map;
markrad 58:f50b97b08851 20 } CONSTMAP_HANDLE_DATA;
markrad 58:f50b97b08851 21
markrad 58:f50b97b08851 22 DEFINE_REFCOUNT_TYPE(CONSTMAP_HANDLE_DATA);
markrad 58:f50b97b08851 23
markrad 58:f50b97b08851 24 #define LOG_CONSTMAP_ERROR(result) LogError("result = %s", ENUM_TO_STRING(CONSTMAP_RESULT, (result)));
markrad 58:f50b97b08851 25
markrad 58:f50b97b08851 26 CONSTMAP_HANDLE ConstMap_Create(MAP_HANDLE sourceMap)
markrad 58:f50b97b08851 27 {
markrad 58:f50b97b08851 28 CONSTMAP_HANDLE_DATA* result = REFCOUNT_TYPE_CREATE(CONSTMAP_HANDLE_DATA);
markrad 58:f50b97b08851 29
markrad 58:f50b97b08851 30 if (result == NULL)
markrad 58:f50b97b08851 31 {
markrad 58:f50b97b08851 32 LOG_CONSTMAP_ERROR(CONSTMAP_INVALIDARG);
markrad 58:f50b97b08851 33 }
markrad 58:f50b97b08851 34 else
markrad 58:f50b97b08851 35 {
markrad 58:f50b97b08851 36 /*Codes_SRS_CONSTMAP_17_048: [ConstMap_Create shall accept any non-NULL MAP_HANDLE as input.]*/
markrad 58:f50b97b08851 37 /*Codes_SRS_CONSTMAP_17_001: [ConstMap_Create shall create an immutable map, populated by the key, value pairs in the source map.]*/
markrad 58:f50b97b08851 38 result->map = Map_Clone(sourceMap);
markrad 58:f50b97b08851 39 if (result->map == NULL)
markrad 58:f50b97b08851 40 {
markrad 58:f50b97b08851 41 free(result);
markrad 58:f50b97b08851 42 /*Codes_SRS_CONSTMAP_17_002: [If during creation there are any errors, then ConstMap_Create shall return NULL.]*/
markrad 58:f50b97b08851 43 result = NULL;
markrad 58:f50b97b08851 44 LOG_CONSTMAP_ERROR(CONSTMAP_ERROR);
markrad 58:f50b97b08851 45 }
markrad 58:f50b97b08851 46
markrad 58:f50b97b08851 47 }
markrad 58:f50b97b08851 48 /*Codes_SRS_CONSTMAP_17_003: [Otherwise, it shall return a non-NULL handle that can be used in subsequent calls.]*/
markrad 58:f50b97b08851 49 return (CONSTMAP_HANDLE)result;
markrad 58:f50b97b08851 50 }
markrad 58:f50b97b08851 51
markrad 58:f50b97b08851 52 void ConstMap_Destroy(CONSTMAP_HANDLE handle)
markrad 58:f50b97b08851 53 {
markrad 58:f50b97b08851 54 /*Codes_SRS_CONSTMAP_17_005: [If parameter handle is NULL then ConstMap_Destroy shall take no action.]*/
markrad 58:f50b97b08851 55 if (handle == NULL)
markrad 58:f50b97b08851 56 {
markrad 58:f50b97b08851 57 LOG_CONSTMAP_ERROR(CONSTMAP_INVALIDARG);
markrad 58:f50b97b08851 58 }
markrad 58:f50b97b08851 59 else
markrad 58:f50b97b08851 60 {
markrad 58:f50b97b08851 61 /*Codes_SRS_CONSTMAP_17_049: [ConstMap_Destroy shall decrement the internal reference count of the immutable map.]*/
markrad 58:f50b97b08851 62 if (DEC_REF(CONSTMAP_HANDLE_DATA, handle) == DEC_RETURN_ZERO)
markrad 58:f50b97b08851 63 {
markrad 58:f50b97b08851 64 /*Codes_SRS_CONSTMAP_17_004: [If the reference count is zero, ConstMap_Destroy shall release all resources associated with the immutable map.]*/
markrad 58:f50b97b08851 65 Map_Destroy(((CONSTMAP_HANDLE_DATA *)handle)->map);
markrad 58:f50b97b08851 66 free(handle);
markrad 58:f50b97b08851 67 }
markrad 58:f50b97b08851 68
markrad 58:f50b97b08851 69 }
markrad 58:f50b97b08851 70 }
markrad 58:f50b97b08851 71
markrad 58:f50b97b08851 72 CONSTMAP_HANDLE ConstMap_Clone(CONSTMAP_HANDLE handle)
markrad 58:f50b97b08851 73 {
markrad 58:f50b97b08851 74 /*Codes_SRS_CONSTMAP_17_038: [ConstMap_Clone returns NULL if parameter handle is NULL.] */
markrad 58:f50b97b08851 75 if (handle == NULL)
markrad 58:f50b97b08851 76 {
markrad 58:f50b97b08851 77 LOG_CONSTMAP_ERROR(CONSTMAP_INVALIDARG);
markrad 58:f50b97b08851 78 }
markrad 58:f50b97b08851 79 else
markrad 58:f50b97b08851 80 {
markrad 58:f50b97b08851 81 /*Codes_SRS_CONSTMAP_17_039: [ConstMap_Clone shall increase the internal reference count of the immutable map indicated by parameter handle]*/
markrad 58:f50b97b08851 82 /*Codes_SRS_CONSTMAP_17_050: [ConstMap_Clone shall return the non-NULL handle. ]*/
markrad 58:f50b97b08851 83 INC_REF(CONSTMAP_HANDLE_DATA, handle);
markrad 58:f50b97b08851 84 }
markrad 58:f50b97b08851 85 return (handle);
markrad 58:f50b97b08851 86 }
markrad 58:f50b97b08851 87
markrad 58:f50b97b08851 88 static CONSTMAP_RESULT ConstMap_ErrorConvert(MAP_RESULT mapResult)
markrad 58:f50b97b08851 89 {
markrad 58:f50b97b08851 90 CONSTMAP_RESULT result;
markrad 58:f50b97b08851 91 switch (mapResult)
markrad 58:f50b97b08851 92 {
markrad 58:f50b97b08851 93 case MAP_OK:
markrad 58:f50b97b08851 94 result = CONSTMAP_OK;
markrad 58:f50b97b08851 95 break;
markrad 58:f50b97b08851 96 case MAP_INVALIDARG:
markrad 58:f50b97b08851 97 result = CONSTMAP_INVALIDARG;
markrad 58:f50b97b08851 98 break;
markrad 58:f50b97b08851 99 case MAP_KEYNOTFOUND:
markrad 58:f50b97b08851 100 result = CONSTMAP_KEYNOTFOUND;
markrad 58:f50b97b08851 101 break;
markrad 58:f50b97b08851 102 default:
markrad 58:f50b97b08851 103 result = CONSTMAP_ERROR;
markrad 58:f50b97b08851 104 break;
markrad 58:f50b97b08851 105 }
markrad 58:f50b97b08851 106 return result;
markrad 58:f50b97b08851 107 }
markrad 58:f50b97b08851 108
markrad 58:f50b97b08851 109 MAP_HANDLE ConstMap_CloneWriteable(CONSTMAP_HANDLE handle)
markrad 58:f50b97b08851 110 {
markrad 58:f50b97b08851 111 MAP_HANDLE result = NULL;
markrad 58:f50b97b08851 112 if (handle == NULL)
markrad 58:f50b97b08851 113 {
markrad 58:f50b97b08851 114 /*Codes_SRS_CONSTMAP_17_051: [ConstMap_CloneWriteable returns NULL if parameter handle is NULL. ]*/
markrad 58:f50b97b08851 115 LOG_CONSTMAP_ERROR(CONSTMAP_INVALIDARG);
markrad 58:f50b97b08851 116 }
markrad 58:f50b97b08851 117 else
markrad 58:f50b97b08851 118 {
markrad 58:f50b97b08851 119 /*Codes_SRS_CONSTMAP_17_052: [ConstMap_CloneWriteable shall create a new, writeable map, populated by the key, value pairs in the parameter defined by handle.]*/
markrad 58:f50b97b08851 120 /*Codes_SRS_CONSTMAP_17_053: [If during cloning, any operation fails, then ConstMap_CloneWriteableap_Clone shall return NULL.]*/
markrad 58:f50b97b08851 121 /*Codes_SRS_CONSTMAP_17_054: [Otherwise, ConstMap_CloneWriteable shall return a non-NULL handle that can be used in subsequent calls.]*/
markrad 58:f50b97b08851 122 result = Map_Clone(((CONSTMAP_HANDLE_DATA *)handle)->map);
markrad 58:f50b97b08851 123 }
markrad 58:f50b97b08851 124 return result;
markrad 58:f50b97b08851 125 }
markrad 58:f50b97b08851 126
markrad 58:f50b97b08851 127 bool ConstMap_ContainsKey(CONSTMAP_HANDLE handle, const char* key )
markrad 58:f50b97b08851 128 {
markrad 58:f50b97b08851 129 bool keyExists = false;
markrad 58:f50b97b08851 130 if (handle == NULL)
markrad 58:f50b97b08851 131 {
markrad 58:f50b97b08851 132 /*Codes_SRS_CONSTMAP_17_024: [If parameter handle or key are NULL then ConstMap_ContainsKey shall return false.]*/
markrad 58:f50b97b08851 133 LOG_CONSTMAP_ERROR(CONSTMAP_INVALIDARG);
markrad 58:f50b97b08851 134 }
markrad 58:f50b97b08851 135 else
markrad 58:f50b97b08851 136 {
markrad 58:f50b97b08851 137 if (key == NULL)
markrad 58:f50b97b08851 138 {
markrad 58:f50b97b08851 139 LOG_CONSTMAP_ERROR(CONSTMAP_INVALIDARG);
markrad 58:f50b97b08851 140 }
markrad 58:f50b97b08851 141 else
markrad 58:f50b97b08851 142 {
markrad 58:f50b97b08851 143 /*Codes_SRS_CONSTMAP_17_025: [Otherwise if a key exists then ConstMap_ContainsKey shall return true.]*/
markrad 58:f50b97b08851 144 MAP_RESULT mapResult = Map_ContainsKey(((CONSTMAP_HANDLE_DATA *)handle)->map, key, &keyExists);
markrad 58:f50b97b08851 145 if (mapResult != MAP_OK)
markrad 58:f50b97b08851 146 {
markrad 58:f50b97b08851 147 /*Codes_SRS_CONSTMAP_17_026: [If a key doesn't exist, then ConstMap_ContainsKey shall return false.]*/
markrad 58:f50b97b08851 148 keyExists = false;
markrad 58:f50b97b08851 149 LOG_CONSTMAP_ERROR(ConstMap_ErrorConvert(mapResult));
markrad 58:f50b97b08851 150 }
markrad 58:f50b97b08851 151 }
markrad 58:f50b97b08851 152 }
markrad 58:f50b97b08851 153 return keyExists;
markrad 58:f50b97b08851 154 }
markrad 58:f50b97b08851 155
markrad 58:f50b97b08851 156 bool ConstMap_ContainsValue(CONSTMAP_HANDLE handle, const char* value)
markrad 58:f50b97b08851 157 {
markrad 58:f50b97b08851 158 bool valueExists = false;
markrad 58:f50b97b08851 159 if (handle == NULL)
markrad 58:f50b97b08851 160 {
markrad 58:f50b97b08851 161 /*Codes_SRS_CONSTMAP_17_027: [If parameter handle or value is NULL then ConstMap_ContainsValue shall return false.]*/
markrad 58:f50b97b08851 162 LOG_CONSTMAP_ERROR(CONSTMAP_INVALIDARG);
markrad 58:f50b97b08851 163 }
markrad 58:f50b97b08851 164 else
markrad 58:f50b97b08851 165 {
markrad 58:f50b97b08851 166 if (value == NULL)
markrad 58:f50b97b08851 167 {
markrad 58:f50b97b08851 168 LOG_CONSTMAP_ERROR(CONSTMAP_INVALIDARG);
markrad 58:f50b97b08851 169 }
markrad 58:f50b97b08851 170 else
markrad 58:f50b97b08851 171 {
markrad 58:f50b97b08851 172 /*Codes_SRS_CONSTMAP_17_028: [Otherwise, if a pair has its value equal to the parameter value, the ConstMap_ContainsValue shall return true.]*/
markrad 58:f50b97b08851 173 MAP_RESULT mapResult = Map_ContainsValue(((CONSTMAP_HANDLE_DATA *)handle)->map, value, &valueExists);
markrad 58:f50b97b08851 174 if (mapResult != MAP_OK)
markrad 58:f50b97b08851 175 {
markrad 58:f50b97b08851 176 /*Codes_SRS_CONSTMAP_17_029: [Otherwise, if such a does not exist, then ConstMap_ContainsValue shall return false.]*/
markrad 58:f50b97b08851 177 LOG_CONSTMAP_ERROR(ConstMap_ErrorConvert(mapResult));
markrad 58:f50b97b08851 178 }
markrad 58:f50b97b08851 179 }
markrad 58:f50b97b08851 180 }
markrad 58:f50b97b08851 181 return valueExists;
markrad 58:f50b97b08851 182 }
markrad 58:f50b97b08851 183
markrad 58:f50b97b08851 184 const char* ConstMap_GetValue(CONSTMAP_HANDLE handle, const char* key)
markrad 58:f50b97b08851 185 {
markrad 58:f50b97b08851 186 const char* value = NULL;
markrad 58:f50b97b08851 187
markrad 58:f50b97b08851 188 if (handle == NULL)
markrad 58:f50b97b08851 189 {
markrad 58:f50b97b08851 190 /*Codes_SRS_CONSTMAP_17_040: [If parameter handle or key is NULL then ConstMap_GetValue returns NULL.]*/
markrad 58:f50b97b08851 191 LOG_CONSTMAP_ERROR(CONSTMAP_INVALIDARG);
markrad 58:f50b97b08851 192 }
markrad 58:f50b97b08851 193 else
markrad 58:f50b97b08851 194 {
markrad 58:f50b97b08851 195 if (key == NULL)
markrad 58:f50b97b08851 196 {
markrad 58:f50b97b08851 197 /*Codes_SRS_CONSTMAP_17_040: [If parameter handle or key is NULL then ConstMap_GetValue returns NULL.]*/
markrad 58:f50b97b08851 198 LOG_CONSTMAP_ERROR(CONSTMAP_INVALIDARG);
markrad 58:f50b97b08851 199 }
markrad 58:f50b97b08851 200 else
markrad 58:f50b97b08851 201 {
markrad 58:f50b97b08851 202 /*Codes_SRS_CONSTMAP_17_041: [If the key is not found, then ConstMap_GetValue returns NULL.]*/
markrad 58:f50b97b08851 203 /*Codes_SRS_CONSTMAP_17_042: [Otherwise, ConstMap_GetValue returns the key's value.]*/
markrad 58:f50b97b08851 204 value = Map_GetValueFromKey(((CONSTMAP_HANDLE_DATA *)handle)->map, key);
markrad 58:f50b97b08851 205 }
markrad 58:f50b97b08851 206 }
markrad 58:f50b97b08851 207 return value;
markrad 58:f50b97b08851 208 }
markrad 58:f50b97b08851 209
markrad 58:f50b97b08851 210 CONSTMAP_RESULT ConstMap_GetInternals(CONSTMAP_HANDLE handle, const char*const** keys, const char*const** values, size_t* count)
markrad 58:f50b97b08851 211 {
markrad 58:f50b97b08851 212 CONSTMAP_RESULT result;
markrad 58:f50b97b08851 213 if (handle == NULL)
markrad 58:f50b97b08851 214 {
markrad 58:f50b97b08851 215 /*Codes_SRS_CONSTMAP_17_046: [If parameter handle, keys, values or count is NULL then ConstMap_GetInternals shall return CONSTMAP_INVALIDARG.]*/
markrad 58:f50b97b08851 216 result = CONSTMAP_INVALIDARG;
markrad 58:f50b97b08851 217 LOG_CONSTMAP_ERROR(result);
markrad 58:f50b97b08851 218 }
markrad 58:f50b97b08851 219 else
markrad 58:f50b97b08851 220 {
markrad 58:f50b97b08851 221 /*Codes_SRS_CONSTMAP_17_043: [ConstMap_GetInternals shall produce in *keys a pointer to an array of const char* having all the keys stored so far by the map.]
markrad 58:f50b97b08851 222 *Codes_SRS_CONSTMAP_17_044: [ConstMap_GetInternals shall produce in *values a pointer to an array of const char* having all the values stored so far by the map.]
markrad 58:f50b97b08851 223 *Codes_SRS_CONSTMAP_17_045: [ ConstMap_GetInternals shall produce in *count the number of stored keys and values.]
markrad 58:f50b97b08851 224 */
markrad 58:f50b97b08851 225 MAP_RESULT mapResult = Map_GetInternals(((CONSTMAP_HANDLE_DATA *)handle)->map, keys, values, count);
markrad 58:f50b97b08851 226 result = ConstMap_ErrorConvert(mapResult);
markrad 58:f50b97b08851 227 }
markrad 58:f50b97b08851 228 return result;
markrad 58:f50b97b08851 229 }