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_uamqp_c/sasl_mechanism.h"
markrad 58:f50b97b08851 9 #include "azure_uamqp_c/amqpalloc.h"
markrad 58:f50b97b08851 10
markrad 58:f50b97b08851 11 typedef struct SASL_MECHANISM_INSTANCE_TAG
markrad 58:f50b97b08851 12 {
markrad 58:f50b97b08851 13 const SASL_MECHANISM_INTERFACE_DESCRIPTION* sasl_mechanism_interface_description;
markrad 58:f50b97b08851 14 CONCRETE_SASL_MECHANISM_HANDLE concrete_sasl_mechanism_handle;
markrad 58:f50b97b08851 15 } SASL_MECHANISM_INSTANCE;
markrad 58:f50b97b08851 16
markrad 58:f50b97b08851 17 SASL_MECHANISM_HANDLE saslmechanism_create(const SASL_MECHANISM_INTERFACE_DESCRIPTION* sasl_mechanism_interface_description, void* sasl_mechanism_create_parameters)
markrad 58:f50b97b08851 18 {
markrad 58:f50b97b08851 19 SASL_MECHANISM_INSTANCE* sasl_mechanism_instance;
markrad 58:f50b97b08851 20
markrad 58:f50b97b08851 21 /* Codes_SRS_SASL_MECHANISM_01_004: [If the argument sasl_mechanism_interface_description is NULL, saslmechanism_create shall return NULL.] */
markrad 58:f50b97b08851 22 if ((sasl_mechanism_interface_description == NULL) ||
markrad 58:f50b97b08851 23 /* Codes_SRS_SASL_MECHANISM_01_005: [If any sasl_mechanism_interface_description member is NULL, sasl_mechanism_create shall fail and return NULL.] */
markrad 58:f50b97b08851 24 (sasl_mechanism_interface_description->concrete_sasl_mechanism_create == NULL) ||
markrad 58:f50b97b08851 25 (sasl_mechanism_interface_description->concrete_sasl_mechanism_destroy == NULL) ||
markrad 58:f50b97b08851 26 (sasl_mechanism_interface_description->concrete_sasl_mechanism_get_init_bytes == NULL) ||
markrad 58:f50b97b08851 27 (sasl_mechanism_interface_description->concrete_sasl_mechanism_get_mechanism_name == NULL))
markrad 58:f50b97b08851 28 {
markrad 58:f50b97b08851 29 sasl_mechanism_instance = NULL;
markrad 58:f50b97b08851 30 }
markrad 58:f50b97b08851 31 else
markrad 58:f50b97b08851 32 {
markrad 58:f50b97b08851 33 sasl_mechanism_instance = (SASL_MECHANISM_INSTANCE*)amqpalloc_malloc(sizeof(SASL_MECHANISM_INSTANCE));
markrad 58:f50b97b08851 34
markrad 58:f50b97b08851 35 if (sasl_mechanism_instance != NULL)
markrad 58:f50b97b08851 36 {
markrad 58:f50b97b08851 37 sasl_mechanism_instance->sasl_mechanism_interface_description = sasl_mechanism_interface_description;
markrad 58:f50b97b08851 38
markrad 58:f50b97b08851 39 /* Codes_SRS_SASL_MECHANISM_01_002: [In order to instantiate the concrete SASL mechanism implementation the function concrete_sasl_mechanism_create from the sasl_mechanism_interface_description shall be called, passing the sasl_mechanism_create_parameters to it.] */
markrad 58:f50b97b08851 40 sasl_mechanism_instance->concrete_sasl_mechanism_handle = sasl_mechanism_instance->sasl_mechanism_interface_description->concrete_sasl_mechanism_create((void*)sasl_mechanism_create_parameters);
markrad 58:f50b97b08851 41 if (sasl_mechanism_instance->concrete_sasl_mechanism_handle == NULL)
markrad 58:f50b97b08851 42 {
markrad 58:f50b97b08851 43 /* Codes_SRS_SASL_MECHANISM_01_003: [If the underlying concrete_sasl_mechanism_create call fails, saslmechanism_create shall return NULL.] */
markrad 58:f50b97b08851 44 amqpalloc_free(sasl_mechanism_instance);
markrad 58:f50b97b08851 45 sasl_mechanism_instance = NULL;
markrad 58:f50b97b08851 46 }
markrad 58:f50b97b08851 47 }
markrad 58:f50b97b08851 48 }
markrad 58:f50b97b08851 49
markrad 58:f50b97b08851 50 /* Codes_SRS_SASL_MECHANISM_01_001: [saslmechanism_create shall return on success a non-NULL handle to a new SASL mechanism interface.] */
markrad 58:f50b97b08851 51 return (SASL_MECHANISM_HANDLE)sasl_mechanism_instance;
markrad 58:f50b97b08851 52 }
markrad 58:f50b97b08851 53
markrad 58:f50b97b08851 54 void saslmechanism_destroy(SASL_MECHANISM_HANDLE sasl_mechanism)
markrad 58:f50b97b08851 55 {
markrad 58:f50b97b08851 56 if (sasl_mechanism != NULL)
markrad 58:f50b97b08851 57 {
markrad 58:f50b97b08851 58 SASL_MECHANISM_INSTANCE* sasl_mechanism_instance = (SASL_MECHANISM_INSTANCE*)sasl_mechanism;
markrad 58:f50b97b08851 59
markrad 58:f50b97b08851 60 /* Codes_SRS_SASL_MECHANISM_01_008: [saslmechanism_destroy shall also call the concrete_sasl_mechanism_destroy function that is member of the sasl_mechanism_interface_description argument passed to saslmechanism_create, while passing as argument to concrete_sasl_mechanism_destroy the result of the underlying concrete SASL mechanism handle.] */
markrad 58:f50b97b08851 61 sasl_mechanism_instance->sasl_mechanism_interface_description->concrete_sasl_mechanism_destroy(sasl_mechanism_instance->concrete_sasl_mechanism_handle);
markrad 58:f50b97b08851 62
markrad 58:f50b97b08851 63 /* Codes_SRS_SASL_MECHANISM_01_007: [saslmechanism_destroy shall free all resources associated with the SASL mechanism handle.] */
markrad 58:f50b97b08851 64 amqpalloc_free(sasl_mechanism_instance);
markrad 58:f50b97b08851 65 }
markrad 58:f50b97b08851 66 }
markrad 58:f50b97b08851 67
markrad 58:f50b97b08851 68 int saslmechanism_get_init_bytes(SASL_MECHANISM_HANDLE sasl_mechanism, SASL_MECHANISM_BYTES* init_bytes)
markrad 58:f50b97b08851 69 {
markrad 58:f50b97b08851 70 int result;
markrad 58:f50b97b08851 71
markrad 58:f50b97b08851 72 /* Codes_SRS_SASL_MECHANISM_01_012: [If the argument sasl_mechanism is NULL, saslmechanism_get_init_bytes shall fail and return a non-zero value.] */
markrad 58:f50b97b08851 73 if (sasl_mechanism == NULL)
markrad 58:f50b97b08851 74 {
markrad 58:f50b97b08851 75 result = __LINE__;
markrad 58:f50b97b08851 76 }
markrad 58:f50b97b08851 77 else
markrad 58:f50b97b08851 78 {
markrad 58:f50b97b08851 79 SASL_MECHANISM_INSTANCE* sasl_mechanism_instance = (SASL_MECHANISM_INSTANCE*)sasl_mechanism;
markrad 58:f50b97b08851 80
markrad 58:f50b97b08851 81 /* Codes_SRS_SASL_MECHANISM_01_010: [saslmechanism_get_init_bytes shall call the specific concrete_sasl_mechanism_get_init_bytes function specified in saslmechanism_create, passing the init_bytes argument to it.] */
markrad 58:f50b97b08851 82 if (sasl_mechanism_instance->sasl_mechanism_interface_description->concrete_sasl_mechanism_get_init_bytes(sasl_mechanism_instance->concrete_sasl_mechanism_handle, init_bytes) != 0)
markrad 58:f50b97b08851 83 {
markrad 58:f50b97b08851 84 /* Codes_SRS_SASL_MECHANISM_01_013: [If the underlying concrete_sasl_mechanism_get_init_bytes fails, saslmechanism_get_init_bytes shall fail and return a non-zero value.] */
markrad 58:f50b97b08851 85 result = __LINE__;
markrad 58:f50b97b08851 86 }
markrad 58:f50b97b08851 87 else
markrad 58:f50b97b08851 88 {
markrad 58:f50b97b08851 89 /* Codes_SRS_SASL_MECHANISM_01_011: [On success, saslmechanism_get_init_bytes shall return 0.] */
markrad 58:f50b97b08851 90 result = 0;
markrad 58:f50b97b08851 91 }
markrad 58:f50b97b08851 92 }
markrad 58:f50b97b08851 93
markrad 58:f50b97b08851 94 return result;
markrad 58:f50b97b08851 95 }
markrad 58:f50b97b08851 96
markrad 58:f50b97b08851 97 const char* saslmechanism_get_mechanism_name(SASL_MECHANISM_HANDLE sasl_mechanism)
markrad 58:f50b97b08851 98 {
markrad 58:f50b97b08851 99 const char* result;
markrad 58:f50b97b08851 100
markrad 58:f50b97b08851 101 /* Codes_SRS_SASL_MECHANISM_01_016: [If the argument sasl_mechanism is NULL, saslmechanism_get_mechanism_name shall fail and return a non-zero value.] */
markrad 58:f50b97b08851 102 if (sasl_mechanism == NULL)
markrad 58:f50b97b08851 103 {
markrad 58:f50b97b08851 104 result = NULL;
markrad 58:f50b97b08851 105 }
markrad 58:f50b97b08851 106 else
markrad 58:f50b97b08851 107 {
markrad 58:f50b97b08851 108 SASL_MECHANISM_INSTANCE* sasl_mechanism_instance = (SASL_MECHANISM_INSTANCE*)sasl_mechanism;
markrad 58:f50b97b08851 109
markrad 58:f50b97b08851 110 /* Codes_SRS_SASL_MECHANISM_01_014: [saslmechanism_get_mechanism_name shall call the specific concrete_sasl_mechanism_get_mechanism_name function specified in saslmechanism_create.] */
markrad 58:f50b97b08851 111 /* Codes_SRS_SASL_MECHANISM_01_015: [On success, saslmechanism_get_mechanism_name shall return a pointer to a string with the mechanism name.] */
markrad 58:f50b97b08851 112 /* Codes_SRS_SASL_MECHANISM_01_017: [If the underlying concrete_sasl_mechanism_get_mechanism_name fails, saslmechanism_get_mechanism_name shall return NULL.] */
markrad 58:f50b97b08851 113 result = sasl_mechanism_instance->sasl_mechanism_interface_description->concrete_sasl_mechanism_get_mechanism_name(sasl_mechanism_instance->concrete_sasl_mechanism_handle);
markrad 58:f50b97b08851 114 }
markrad 58:f50b97b08851 115
markrad 58:f50b97b08851 116 return result;
markrad 58:f50b97b08851 117 }
markrad 58:f50b97b08851 118
markrad 58:f50b97b08851 119 int saslmechanism_challenge(SASL_MECHANISM_HANDLE sasl_mechanism, const SASL_MECHANISM_BYTES* challenge_bytes, SASL_MECHANISM_BYTES* response_bytes)
markrad 58:f50b97b08851 120 {
markrad 58:f50b97b08851 121 int result;
markrad 58:f50b97b08851 122
markrad 58:f50b97b08851 123 /* Codes_SRS_SASL_MECHANISM_01_020: [If the argument sasl_mechanism is NULL, saslmechanism_challenge shall fail and return a non-zero value.] */
markrad 58:f50b97b08851 124 if (sasl_mechanism == NULL)
markrad 58:f50b97b08851 125 {
markrad 58:f50b97b08851 126 result = __LINE__;
markrad 58:f50b97b08851 127 }
markrad 58:f50b97b08851 128 else
markrad 58:f50b97b08851 129 {
markrad 58:f50b97b08851 130 /* Codes_SRS_SASL_MECHANISM_01_018: [saslmechanism_challenge shall call the specific concrete_sasl_mechanism_challenge function specified in saslmechanism_create, while passing the challenge_bytes and response_bytes arguments to it.] */
markrad 58:f50b97b08851 131 if (sasl_mechanism->sasl_mechanism_interface_description->concrete_sasl_mechanism_challenge(sasl_mechanism->concrete_sasl_mechanism_handle, challenge_bytes, response_bytes) != 0)
markrad 58:f50b97b08851 132 {
markrad 58:f50b97b08851 133 /* Codes_SRS_SASL_MECHANISM_01_021: [If the underlying concrete_sasl_mechanism_challenge fails, saslmechanism_challenge shall fail and return a non-zero value.] */
markrad 58:f50b97b08851 134 result = __LINE__;
markrad 58:f50b97b08851 135 }
markrad 58:f50b97b08851 136 else
markrad 58:f50b97b08851 137 {
markrad 58:f50b97b08851 138 /* Codes_SRS_SASL_MECHANISM_01_019: [On success, saslmechanism_challenge shall return 0.] */
markrad 58:f50b97b08851 139 result = 0;
markrad 58:f50b97b08851 140 }
markrad 58:f50b97b08851 141 }
markrad 58:f50b97b08851 142
markrad 58:f50b97b08851 143 return result;
markrad 58:f50b97b08851 144 }