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/optimize_size.h"
XinZhangMS 0:f7f1f0d76dd6 6 #include "azure_c_shared_utility/gballoc.h"
XinZhangMS 0:f7f1f0d76dd6 7 #include "azure_c_shared_utility/xlogging.h"
XinZhangMS 0:f7f1f0d76dd6 8 #include "azure_uamqp_c/sasl_mechanism.h"
XinZhangMS 0:f7f1f0d76dd6 9
XinZhangMS 0:f7f1f0d76dd6 10 typedef struct SASL_MECHANISM_INSTANCE_TAG
XinZhangMS 0:f7f1f0d76dd6 11 {
XinZhangMS 0:f7f1f0d76dd6 12 const SASL_MECHANISM_INTERFACE_DESCRIPTION* sasl_mechanism_interface_description;
XinZhangMS 0:f7f1f0d76dd6 13 CONCRETE_SASL_MECHANISM_HANDLE concrete_sasl_mechanism_handle;
XinZhangMS 0:f7f1f0d76dd6 14 } SASL_MECHANISM_INSTANCE;
XinZhangMS 0:f7f1f0d76dd6 15
XinZhangMS 0:f7f1f0d76dd6 16 SASL_MECHANISM_HANDLE saslmechanism_create(const SASL_MECHANISM_INTERFACE_DESCRIPTION* sasl_mechanism_interface_description, void* sasl_mechanism_create_parameters)
XinZhangMS 0:f7f1f0d76dd6 17 {
XinZhangMS 0:f7f1f0d76dd6 18 SASL_MECHANISM_HANDLE result;
XinZhangMS 0:f7f1f0d76dd6 19
XinZhangMS 0:f7f1f0d76dd6 20 /* Codes_SRS_SASL_MECHANISM_01_004: [If the argument `sasl_mechanism_interface_description` is NULL, `saslmechanism_create` shall return NULL.] */
XinZhangMS 0:f7f1f0d76dd6 21 if (sasl_mechanism_interface_description == NULL)
XinZhangMS 0:f7f1f0d76dd6 22 {
XinZhangMS 0:f7f1f0d76dd6 23 LogError("NULL sasl_mechanism_interface_description");
XinZhangMS 0:f7f1f0d76dd6 24 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 25 }
XinZhangMS 0:f7f1f0d76dd6 26 /* Codes_SRS_SASL_MECHANISM_01_005: [If any `sasl_mechanism_interface_description` member is NULL, `saslmechanism_create` shall fail and return NULL.] */
XinZhangMS 0:f7f1f0d76dd6 27 else if ((sasl_mechanism_interface_description->concrete_sasl_mechanism_create == NULL) ||
XinZhangMS 0:f7f1f0d76dd6 28 (sasl_mechanism_interface_description->concrete_sasl_mechanism_destroy == NULL) ||
XinZhangMS 0:f7f1f0d76dd6 29 (sasl_mechanism_interface_description->concrete_sasl_mechanism_get_init_bytes == NULL) ||
XinZhangMS 0:f7f1f0d76dd6 30 (sasl_mechanism_interface_description->concrete_sasl_mechanism_get_mechanism_name == NULL))
XinZhangMS 0:f7f1f0d76dd6 31 {
XinZhangMS 0:f7f1f0d76dd6 32 LogError("Bad interface, concrete_sasl_mechanism_create = %p, concrete_sasl_mechanism_destroy = %p, concrete_sasl_mechanism_get_init_bytes = %p, concrete_sasl_mechanism_get_mechanism_name = %p",
XinZhangMS 0:f7f1f0d76dd6 33 sasl_mechanism_interface_description->concrete_sasl_mechanism_create,
XinZhangMS 0:f7f1f0d76dd6 34 sasl_mechanism_interface_description->concrete_sasl_mechanism_destroy,
XinZhangMS 0:f7f1f0d76dd6 35 sasl_mechanism_interface_description->concrete_sasl_mechanism_get_init_bytes,
XinZhangMS 0:f7f1f0d76dd6 36 sasl_mechanism_interface_description->concrete_sasl_mechanism_get_mechanism_name);
XinZhangMS 0:f7f1f0d76dd6 37 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 38 }
XinZhangMS 0:f7f1f0d76dd6 39 else
XinZhangMS 0:f7f1f0d76dd6 40 {
XinZhangMS 0:f7f1f0d76dd6 41 result = (SASL_MECHANISM_HANDLE)malloc(sizeof(SASL_MECHANISM_INSTANCE));
XinZhangMS 0:f7f1f0d76dd6 42 if (result == NULL)
XinZhangMS 0:f7f1f0d76dd6 43 {
XinZhangMS 0:f7f1f0d76dd6 44 /* Codes_SRS_SASL_MECHANISM_01_006: [If allocating the memory needed for the SASL mechanism interface fails then `saslmechanism_create` shall fail and return NULL.] */
XinZhangMS 0:f7f1f0d76dd6 45 LogError("Could not allocate memory for SASL mechanism");
XinZhangMS 0:f7f1f0d76dd6 46 }
XinZhangMS 0:f7f1f0d76dd6 47 else
XinZhangMS 0:f7f1f0d76dd6 48 {
XinZhangMS 0:f7f1f0d76dd6 49 result->sasl_mechanism_interface_description = sasl_mechanism_interface_description;
XinZhangMS 0:f7f1f0d76dd6 50
XinZhangMS 0:f7f1f0d76dd6 51 /* 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.] */
XinZhangMS 0:f7f1f0d76dd6 52 result->concrete_sasl_mechanism_handle = result->sasl_mechanism_interface_description->concrete_sasl_mechanism_create((void*)sasl_mechanism_create_parameters);
XinZhangMS 0:f7f1f0d76dd6 53 if (result->concrete_sasl_mechanism_handle == NULL)
XinZhangMS 0:f7f1f0d76dd6 54 {
XinZhangMS 0:f7f1f0d76dd6 55 /* Codes_SRS_SASL_MECHANISM_01_003: [If the underlying `concrete_sasl_mechanism_create` call fails, `saslmechanism_create` shall return NULL.] */
XinZhangMS 0:f7f1f0d76dd6 56 LogError("concrete_sasl_mechanism_create failed");
XinZhangMS 0:f7f1f0d76dd6 57 free(result);
XinZhangMS 0:f7f1f0d76dd6 58 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 59 }
XinZhangMS 0:f7f1f0d76dd6 60 }
XinZhangMS 0:f7f1f0d76dd6 61 }
XinZhangMS 0:f7f1f0d76dd6 62
XinZhangMS 0:f7f1f0d76dd6 63 /* Codes_SRS_SASL_MECHANISM_01_001: [`saslmechanism_create` shall return on success a non-NULL handle to a new SASL mechanism interface.] */
XinZhangMS 0:f7f1f0d76dd6 64 return result;
XinZhangMS 0:f7f1f0d76dd6 65 }
XinZhangMS 0:f7f1f0d76dd6 66
XinZhangMS 0:f7f1f0d76dd6 67 void saslmechanism_destroy(SASL_MECHANISM_HANDLE sasl_mechanism)
XinZhangMS 0:f7f1f0d76dd6 68 {
XinZhangMS 0:f7f1f0d76dd6 69 if (sasl_mechanism == NULL)
XinZhangMS 0:f7f1f0d76dd6 70 {
XinZhangMS 0:f7f1f0d76dd6 71 /* Codes_SRS_SASL_MECHANISM_01_009: [If the argument `sasl_mechanism` is NULL, `saslmechanism_destroy` shall do nothing.] */
XinZhangMS 0:f7f1f0d76dd6 72 LogError("NULL sasl_mechanism");
XinZhangMS 0:f7f1f0d76dd6 73 }
XinZhangMS 0:f7f1f0d76dd6 74 else
XinZhangMS 0:f7f1f0d76dd6 75 {
XinZhangMS 0:f7f1f0d76dd6 76 /* 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.] */
XinZhangMS 0:f7f1f0d76dd6 77 sasl_mechanism->sasl_mechanism_interface_description->concrete_sasl_mechanism_destroy(sasl_mechanism->concrete_sasl_mechanism_handle);
XinZhangMS 0:f7f1f0d76dd6 78
XinZhangMS 0:f7f1f0d76dd6 79 /* Codes_SRS_SASL_MECHANISM_01_007: [`saslmechanism_destroy` shall free all resources associated with the SASL mechanism handle.] */
XinZhangMS 0:f7f1f0d76dd6 80 free(sasl_mechanism);
XinZhangMS 0:f7f1f0d76dd6 81 }
XinZhangMS 0:f7f1f0d76dd6 82 }
XinZhangMS 0:f7f1f0d76dd6 83
XinZhangMS 0:f7f1f0d76dd6 84 int saslmechanism_get_init_bytes(SASL_MECHANISM_HANDLE sasl_mechanism, SASL_MECHANISM_BYTES* init_bytes)
XinZhangMS 0:f7f1f0d76dd6 85 {
XinZhangMS 0:f7f1f0d76dd6 86 int result;
XinZhangMS 0:f7f1f0d76dd6 87
XinZhangMS 0:f7f1f0d76dd6 88 /* 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.] */
XinZhangMS 0:f7f1f0d76dd6 89 if (sasl_mechanism == NULL)
XinZhangMS 0:f7f1f0d76dd6 90 {
XinZhangMS 0:f7f1f0d76dd6 91 LogError("NULL sasl_mechanism");
XinZhangMS 0:f7f1f0d76dd6 92 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 93 }
XinZhangMS 0:f7f1f0d76dd6 94 else
XinZhangMS 0:f7f1f0d76dd6 95 {
XinZhangMS 0:f7f1f0d76dd6 96 /* 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.] */
XinZhangMS 0:f7f1f0d76dd6 97 if (sasl_mechanism->sasl_mechanism_interface_description->concrete_sasl_mechanism_get_init_bytes(sasl_mechanism->concrete_sasl_mechanism_handle, init_bytes) != 0)
XinZhangMS 0:f7f1f0d76dd6 98 {
XinZhangMS 0:f7f1f0d76dd6 99 /* 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.] */
XinZhangMS 0:f7f1f0d76dd6 100 LogError("concrete_sasl_mechanism_get_init_bytes failed");
XinZhangMS 0:f7f1f0d76dd6 101 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 102 }
XinZhangMS 0:f7f1f0d76dd6 103 else
XinZhangMS 0:f7f1f0d76dd6 104 {
XinZhangMS 0:f7f1f0d76dd6 105 /* Codes_SRS_SASL_MECHANISM_01_011: [On success, `saslmechanism_get_init_bytes` shall return 0.] */
XinZhangMS 0:f7f1f0d76dd6 106 result = 0;
XinZhangMS 0:f7f1f0d76dd6 107 }
XinZhangMS 0:f7f1f0d76dd6 108 }
XinZhangMS 0:f7f1f0d76dd6 109
XinZhangMS 0:f7f1f0d76dd6 110 return result;
XinZhangMS 0:f7f1f0d76dd6 111 }
XinZhangMS 0:f7f1f0d76dd6 112
XinZhangMS 0:f7f1f0d76dd6 113 const char* saslmechanism_get_mechanism_name(SASL_MECHANISM_HANDLE sasl_mechanism)
XinZhangMS 0:f7f1f0d76dd6 114 {
XinZhangMS 0:f7f1f0d76dd6 115 const char* result;
XinZhangMS 0:f7f1f0d76dd6 116
XinZhangMS 0:f7f1f0d76dd6 117 /* 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.] */
XinZhangMS 0:f7f1f0d76dd6 118 if (sasl_mechanism == NULL)
XinZhangMS 0:f7f1f0d76dd6 119 {
XinZhangMS 0:f7f1f0d76dd6 120 LogError("NULL sasl_mechanism");
XinZhangMS 0:f7f1f0d76dd6 121 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 122 }
XinZhangMS 0:f7f1f0d76dd6 123 else
XinZhangMS 0:f7f1f0d76dd6 124 {
XinZhangMS 0:f7f1f0d76dd6 125 /* 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`.] */
XinZhangMS 0:f7f1f0d76dd6 126 /* Codes_SRS_SASL_MECHANISM_01_015: [On success, `saslmechanism_get_mechanism_name` shall return a pointer to a string with the mechanism name.] */
XinZhangMS 0:f7f1f0d76dd6 127 /* Codes_SRS_SASL_MECHANISM_01_017: [If the underlying `concrete_sasl_mechanism_get_mechanism_name` fails, `saslmechanism_get_mechanism_name` shall return NULL.] */
XinZhangMS 0:f7f1f0d76dd6 128 result = sasl_mechanism->sasl_mechanism_interface_description->concrete_sasl_mechanism_get_mechanism_name(sasl_mechanism->concrete_sasl_mechanism_handle);
XinZhangMS 0:f7f1f0d76dd6 129 if (result == NULL)
XinZhangMS 0:f7f1f0d76dd6 130 {
XinZhangMS 0:f7f1f0d76dd6 131 LogError("concrete_sasl_mechanism_get_mechanism_name failed");
XinZhangMS 0:f7f1f0d76dd6 132 }
XinZhangMS 0:f7f1f0d76dd6 133 }
XinZhangMS 0:f7f1f0d76dd6 134
XinZhangMS 0:f7f1f0d76dd6 135 return result;
XinZhangMS 0:f7f1f0d76dd6 136 }
XinZhangMS 0:f7f1f0d76dd6 137
XinZhangMS 0:f7f1f0d76dd6 138 int saslmechanism_challenge(SASL_MECHANISM_HANDLE sasl_mechanism, const SASL_MECHANISM_BYTES* challenge_bytes, SASL_MECHANISM_BYTES* response_bytes)
XinZhangMS 0:f7f1f0d76dd6 139 {
XinZhangMS 0:f7f1f0d76dd6 140 int result;
XinZhangMS 0:f7f1f0d76dd6 141
XinZhangMS 0:f7f1f0d76dd6 142 /* Codes_SRS_SASL_MECHANISM_01_020: [If the argument `sasl_mechanism` is NULL, `saslmechanism_challenge` shall fail and return a non-zero value.] */
XinZhangMS 0:f7f1f0d76dd6 143 if (sasl_mechanism == NULL)
XinZhangMS 0:f7f1f0d76dd6 144 {
XinZhangMS 0:f7f1f0d76dd6 145 LogError("NULL sasl_mechanism");
XinZhangMS 0:f7f1f0d76dd6 146 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 147 }
XinZhangMS 0:f7f1f0d76dd6 148 else
XinZhangMS 0:f7f1f0d76dd6 149 {
XinZhangMS 0:f7f1f0d76dd6 150 /* 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.] */
XinZhangMS 0:f7f1f0d76dd6 151 if (sasl_mechanism->sasl_mechanism_interface_description->concrete_sasl_mechanism_challenge(sasl_mechanism->concrete_sasl_mechanism_handle, challenge_bytes, response_bytes) != 0)
XinZhangMS 0:f7f1f0d76dd6 152 {
XinZhangMS 0:f7f1f0d76dd6 153 /* Codes_SRS_SASL_MECHANISM_01_021: [If the underlying `concrete_sasl_mechanism_challenge` fails, `saslmechanism_challenge` shall fail and return a non-zero value.] */
XinZhangMS 0:f7f1f0d76dd6 154 LogError("concrete_sasl_mechanism_challenge failed");
XinZhangMS 0:f7f1f0d76dd6 155 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 156 }
XinZhangMS 0:f7f1f0d76dd6 157 else
XinZhangMS 0:f7f1f0d76dd6 158 {
XinZhangMS 0:f7f1f0d76dd6 159 /* Codes_SRS_SASL_MECHANISM_01_019: [On success, `saslmechanism_challenge` shall return 0.] */
XinZhangMS 0:f7f1f0d76dd6 160 result = 0;
XinZhangMS 0:f7f1f0d76dd6 161 }
XinZhangMS 0:f7f1f0d76dd6 162 }
XinZhangMS 0:f7f1f0d76dd6 163
XinZhangMS 0:f7f1f0d76dd6 164 return result;
XinZhangMS 0:f7f1f0d76dd6 165 }