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 //
markrad 58:f50b97b08851 5 // PUT NO INCLUDES BEFORE HERE
markrad 58:f50b97b08851 6 //
markrad 58:f50b97b08851 7 #include <stdlib.h>
markrad 58:f50b97b08851 8 #ifdef _CRTDBG_MAP_ALLOC
markrad 58:f50b97b08851 9 #include <crtdbg.h>
markrad 58:f50b97b08851 10 #endif
markrad 58:f50b97b08851 11 #include "azure_c_shared_utility/gballoc.h"
markrad 58:f50b97b08851 12
markrad 58:f50b97b08851 13 #include "azure_c_shared_utility/constbuffer.h"
markrad 58:f50b97b08851 14 #include "azure_c_shared_utility/xlogging.h"
markrad 58:f50b97b08851 15 #include "azure_c_shared_utility/refcount.h"
markrad 58:f50b97b08851 16
markrad 58:f50b97b08851 17 typedef struct CONSTBUFFER_HANDLE_DATA_TAG
markrad 58:f50b97b08851 18 {
markrad 58:f50b97b08851 19 CONSTBUFFER alias;
markrad 58:f50b97b08851 20 }CONSTBUFFER_HANDLE_DATA;
markrad 58:f50b97b08851 21
markrad 58:f50b97b08851 22 DEFINE_REFCOUNT_TYPE(CONSTBUFFER_HANDLE_DATA);
markrad 58:f50b97b08851 23
markrad 58:f50b97b08851 24 static CONSTBUFFER_HANDLE CONSTBUFFER_Create_Internal(const unsigned char* source, size_t size)
markrad 58:f50b97b08851 25 {
markrad 58:f50b97b08851 26 CONSTBUFFER_HANDLE_DATA* result;
markrad 58:f50b97b08851 27 /*Codes_SRS_CONSTBUFFER_02_005: [The non-NULL handle returned by CONSTBUFFER_Create shall have its ref count set to "1".]*/
markrad 58:f50b97b08851 28 /*Codes_SRS_CONSTBUFFER_02_010: [The non-NULL handle returned by CONSTBUFFER_CreateFromBuffer shall have its ref count set to "1".]*/
markrad 58:f50b97b08851 29 result = REFCOUNT_TYPE_CREATE(CONSTBUFFER_HANDLE_DATA);
markrad 58:f50b97b08851 30 if (result == NULL)
markrad 58:f50b97b08851 31 {
markrad 58:f50b97b08851 32 /*Codes_SRS_CONSTBUFFER_02_003: [If creating the copy fails then CONSTBUFFER_Create shall return NULL.]*/
markrad 58:f50b97b08851 33 /*Codes_SRS_CONSTBUFFER_02_008: [If copying the content fails, then CONSTBUFFER_CreateFromBuffer shall fail and return NULL.] */
markrad 58:f50b97b08851 34 LogError("unable to malloc");
markrad 58:f50b97b08851 35 /*return as is*/
markrad 58:f50b97b08851 36 }
markrad 58:f50b97b08851 37 else
markrad 58:f50b97b08851 38 {
markrad 58:f50b97b08851 39 /*Codes_SRS_CONSTBUFFER_02_002: [Otherwise, CONSTBUFFER_Create shall create a copy of the memory area pointed to by source having size bytes.]*/
markrad 58:f50b97b08851 40 result->alias.size = size;
markrad 58:f50b97b08851 41 if (size == 0)
markrad 58:f50b97b08851 42 {
markrad 58:f50b97b08851 43 result->alias.buffer = NULL;
markrad 58:f50b97b08851 44 }
markrad 58:f50b97b08851 45 else
markrad 58:f50b97b08851 46 {
markrad 58:f50b97b08851 47 unsigned char* temp = (unsigned char*)malloc(size);
markrad 58:f50b97b08851 48 if (temp == NULL)
markrad 58:f50b97b08851 49 {
markrad 58:f50b97b08851 50 /*Codes_SRS_CONSTBUFFER_02_003: [If creating the copy fails then CONSTBUFFER_Create shall return NULL.]*/
markrad 58:f50b97b08851 51 /*Codes_SRS_CONSTBUFFER_02_008: [If copying the content fails, then CONSTBUFFER_CreateFromBuffer shall fail and return NULL.] */
markrad 58:f50b97b08851 52 LogError("unable to malloc");
markrad 58:f50b97b08851 53 free(result);
markrad 58:f50b97b08851 54 result = NULL;
markrad 58:f50b97b08851 55 }
markrad 58:f50b97b08851 56 else
markrad 58:f50b97b08851 57 {
markrad 58:f50b97b08851 58
markrad 58:f50b97b08851 59 /*Codes_SRS_CONSTBUFFER_02_004: [Otherwise CONSTBUFFER_Create shall return a non-NULL handle.]*/
markrad 58:f50b97b08851 60 /*Codes_SRS_CONSTBUFFER_02_007: [Otherwise, CONSTBUFFER_CreateFromBuffer shall copy the content of buffer.]*/
markrad 58:f50b97b08851 61 /*Codes_SRS_CONSTBUFFER_02_009: [Otherwise, CONSTBUFFER_CreateFromBuffer shall return a non-NULL handle.]*/
markrad 58:f50b97b08851 62 memcpy(temp, source, size);
markrad 58:f50b97b08851 63 result->alias.buffer = temp;
markrad 58:f50b97b08851 64 }
markrad 58:f50b97b08851 65 }
markrad 58:f50b97b08851 66 }
markrad 58:f50b97b08851 67 return (CONSTBUFFER_HANDLE)result;
markrad 58:f50b97b08851 68 }
markrad 58:f50b97b08851 69
markrad 58:f50b97b08851 70 CONSTBUFFER_HANDLE CONSTBUFFER_Create(const unsigned char* source, size_t size)
markrad 58:f50b97b08851 71 {
markrad 58:f50b97b08851 72 CONSTBUFFER_HANDLE_DATA* result;
markrad 58:f50b97b08851 73 /*Codes_SRS_CONSTBUFFER_02_001: [If source is NULL and size is different than 0 then CONSTBUFFER_Create shall fail and return NULL.]*/
markrad 58:f50b97b08851 74 if (
markrad 58:f50b97b08851 75 (source == NULL) &&
markrad 58:f50b97b08851 76 (size != 0)
markrad 58:f50b97b08851 77 )
markrad 58:f50b97b08851 78 {
markrad 58:f50b97b08851 79 LogError("invalid arguments passes to CONSTBUFFER_Create");
markrad 58:f50b97b08851 80 result = NULL;
markrad 58:f50b97b08851 81 }
markrad 58:f50b97b08851 82 else
markrad 58:f50b97b08851 83 {
markrad 58:f50b97b08851 84 result = (CONSTBUFFER_HANDLE_DATA*)CONSTBUFFER_Create_Internal(source, size);
markrad 58:f50b97b08851 85 }
markrad 58:f50b97b08851 86 return (CONSTBUFFER_HANDLE)result;
markrad 58:f50b97b08851 87 }
markrad 58:f50b97b08851 88
markrad 58:f50b97b08851 89 /*this creates a new constbuffer from an existing BUFFER_HANDLE*/
markrad 58:f50b97b08851 90 CONSTBUFFER_HANDLE CONSTBUFFER_CreateFromBuffer(BUFFER_HANDLE buffer)
markrad 58:f50b97b08851 91 {
markrad 58:f50b97b08851 92 CONSTBUFFER_HANDLE_DATA* result;
markrad 58:f50b97b08851 93 /*Codes_SRS_CONSTBUFFER_02_006: [If buffer is NULL then CONSTBUFFER_CreateFromBuffer shall fail and return NULL.]*/
markrad 58:f50b97b08851 94 if (buffer == NULL)
markrad 58:f50b97b08851 95 {
markrad 58:f50b97b08851 96 LogError("invalid arg passed to CONSTBUFFER_CreateFromBuffer");
markrad 58:f50b97b08851 97 result = NULL;
markrad 58:f50b97b08851 98 }
markrad 58:f50b97b08851 99 else
markrad 58:f50b97b08851 100 {
markrad 58:f50b97b08851 101 size_t length = BUFFER_length(buffer);
markrad 58:f50b97b08851 102 unsigned char* rawBuffer = BUFFER_u_char(buffer);
markrad 58:f50b97b08851 103 result = (CONSTBUFFER_HANDLE_DATA*)CONSTBUFFER_Create_Internal(rawBuffer, length);
markrad 58:f50b97b08851 104 }
markrad 58:f50b97b08851 105 return (CONSTBUFFER_HANDLE)result;
markrad 58:f50b97b08851 106 }
markrad 58:f50b97b08851 107
markrad 58:f50b97b08851 108 CONSTBUFFER_HANDLE CONSTBUFFER_Clone(CONSTBUFFER_HANDLE constbufferHandle)
markrad 58:f50b97b08851 109 {
markrad 58:f50b97b08851 110 if (constbufferHandle == NULL)
markrad 58:f50b97b08851 111 {
markrad 58:f50b97b08851 112 /*Codes_SRS_CONSTBUFFER_02_013: [If constbufferHandle is NULL then CONSTBUFFER_Clone shall fail and return NULL.]*/
markrad 58:f50b97b08851 113 LogError("invalid arg");
markrad 58:f50b97b08851 114 }
markrad 58:f50b97b08851 115 else
markrad 58:f50b97b08851 116 {
markrad 58:f50b97b08851 117 /*Codes_SRS_CONSTBUFFER_02_014: [Otherwise, CONSTBUFFER_Clone shall increment the reference count and return constbufferHandle.]*/
markrad 58:f50b97b08851 118 INC_REF(CONSTBUFFER_HANDLE_DATA, constbufferHandle);
markrad 58:f50b97b08851 119 }
markrad 58:f50b97b08851 120 return constbufferHandle;
markrad 58:f50b97b08851 121 }
markrad 58:f50b97b08851 122
markrad 58:f50b97b08851 123 const CONSTBUFFER* CONSTBUFFER_GetContent(CONSTBUFFER_HANDLE constbufferHandle)
markrad 58:f50b97b08851 124 {
markrad 58:f50b97b08851 125 const CONSTBUFFER* result;
markrad 58:f50b97b08851 126 if (constbufferHandle == NULL)
markrad 58:f50b97b08851 127 {
markrad 58:f50b97b08851 128 /*Codes_SRS_CONSTBUFFER_02_011: [If constbufferHandle is NULL then CONSTBUFFER_GetContent shall return NULL.]*/
markrad 58:f50b97b08851 129 result = NULL;
markrad 58:f50b97b08851 130 LogError("invalid arg");
markrad 58:f50b97b08851 131 }
markrad 58:f50b97b08851 132 else
markrad 58:f50b97b08851 133 {
markrad 58:f50b97b08851 134 /*Codes_SRS_CONSTBUFFER_02_012: [Otherwise, CONSTBUFFER_GetContent shall return a const CONSTBUFFER* that matches byte by byte the original bytes used to created the const buffer and has the same length.]*/
markrad 58:f50b97b08851 135 result = &(((CONSTBUFFER_HANDLE_DATA*)constbufferHandle)->alias);
markrad 58:f50b97b08851 136 }
markrad 58:f50b97b08851 137 return result;
markrad 58:f50b97b08851 138 }
markrad 58:f50b97b08851 139
markrad 58:f50b97b08851 140 void CONSTBUFFER_Destroy(CONSTBUFFER_HANDLE constbufferHandle)
markrad 58:f50b97b08851 141 {
markrad 58:f50b97b08851 142 /*Codes_SRS_CONSTBUFFER_02_015: [If constbufferHandle is NULL then CONSTBUFFER_Destroy shall do nothing.]*/
markrad 58:f50b97b08851 143 if (constbufferHandle != NULL)
markrad 58:f50b97b08851 144 {
markrad 58:f50b97b08851 145 /*Codes_SRS_CONSTBUFFER_02_016: [Otherwise, CONSTBUFFER_Destroy shall decrement the refcount on the constbufferHandle handle.]*/
markrad 58:f50b97b08851 146 if (DEC_REF(CONSTBUFFER_HANDLE_DATA, constbufferHandle) == DEC_RETURN_ZERO)
markrad 58:f50b97b08851 147 {
markrad 58:f50b97b08851 148 /*Codes_SRS_CONSTBUFFER_02_017: [If the refcount reaches zero, then CONSTBUFFER_Destroy shall deallocate all resources used by the CONSTBUFFER_HANDLE.]*/
markrad 58:f50b97b08851 149 CONSTBUFFER_HANDLE_DATA* constbufferHandleData = (CONSTBUFFER_HANDLE_DATA*)constbufferHandle;
markrad 58:f50b97b08851 150 free((void*)constbufferHandleData->alias.buffer);
markrad 58:f50b97b08851 151 free(constbufferHandleData);
markrad 58:f50b97b08851 152 }
markrad 58:f50b97b08851 153 }
markrad 58:f50b97b08851 154 }