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 <string.h>
XinZhangMS 0:f7f1f0d76dd6 6 #include "azure_c_shared_utility/optimize_size.h"
XinZhangMS 0:f7f1f0d76dd6 7 #include "azure_c_shared_utility/gballoc.h"
XinZhangMS 0:f7f1f0d76dd6 8 #include "azure_c_shared_utility/xlogging.h"
XinZhangMS 0:f7f1f0d76dd6 9 #include "azure_uamqp_c/sasl_anonymous.h"
XinZhangMS 0:f7f1f0d76dd6 10
XinZhangMS 0:f7f1f0d76dd6 11 typedef struct SASL_ANONYMOUS_INSTANCE_TAG
XinZhangMS 0:f7f1f0d76dd6 12 {
XinZhangMS 0:f7f1f0d76dd6 13 unsigned char dummy;
XinZhangMS 0:f7f1f0d76dd6 14 } SASL_ANONYMOUS_INSTANCE;
XinZhangMS 0:f7f1f0d76dd6 15
XinZhangMS 0:f7f1f0d76dd6 16 /* Codes_SRS_SASL_ANONYMOUS_01_001: [`saslanonymous_create` shall return on success a non-NULL handle to a new SASL anonymous mechanism.]*/
XinZhangMS 0:f7f1f0d76dd6 17 static CONCRETE_SASL_MECHANISM_HANDLE saslanonymous_create(void* config)
XinZhangMS 0:f7f1f0d76dd6 18 {
XinZhangMS 0:f7f1f0d76dd6 19 CONCRETE_SASL_MECHANISM_HANDLE result;
XinZhangMS 0:f7f1f0d76dd6 20
XinZhangMS 0:f7f1f0d76dd6 21 /* Codes_SRS_SASL_ANONYMOUS_01_003: [Since this is the ANONYMOUS SASL mechanism, `config` shall be ignored.]*/
XinZhangMS 0:f7f1f0d76dd6 22 (void)config;
XinZhangMS 0:f7f1f0d76dd6 23
XinZhangMS 0:f7f1f0d76dd6 24 result = malloc(sizeof(SASL_ANONYMOUS_INSTANCE));
XinZhangMS 0:f7f1f0d76dd6 25 if (result == NULL)
XinZhangMS 0:f7f1f0d76dd6 26 {
XinZhangMS 0:f7f1f0d76dd6 27 /* Codes_SRS_SASL_ANONYMOUS_01_002: [If allocating the memory needed for the SASL anonymous instance fails then `saslanonymous_create` shall return NULL.] */
XinZhangMS 0:f7f1f0d76dd6 28 LogError("Cannot allocate memory for SASL anonymous instance");
XinZhangMS 0:f7f1f0d76dd6 29 }
XinZhangMS 0:f7f1f0d76dd6 30
XinZhangMS 0:f7f1f0d76dd6 31 return result;
XinZhangMS 0:f7f1f0d76dd6 32 }
XinZhangMS 0:f7f1f0d76dd6 33
XinZhangMS 0:f7f1f0d76dd6 34 static void saslanonymous_destroy(CONCRETE_SASL_MECHANISM_HANDLE sasl_mechanism_concrete_handle)
XinZhangMS 0:f7f1f0d76dd6 35 {
XinZhangMS 0:f7f1f0d76dd6 36 /* Codes_SRS_SASL_ANONYMOUS_01_005: [If the argument `concrete_sasl_mechanism` is NULL, `saslanonymous_destroy` shall do nothing.]*/
XinZhangMS 0:f7f1f0d76dd6 37 if (sasl_mechanism_concrete_handle == NULL)
XinZhangMS 0:f7f1f0d76dd6 38 {
XinZhangMS 0:f7f1f0d76dd6 39 LogError("NULL sasl_mechanism_concrete_handle");
XinZhangMS 0:f7f1f0d76dd6 40 }
XinZhangMS 0:f7f1f0d76dd6 41 else
XinZhangMS 0:f7f1f0d76dd6 42 {
XinZhangMS 0:f7f1f0d76dd6 43 /* Codes_SRS_SASL_ANONYMOUS_01_004: [`saslanonymous_destroy` shall free all resources associated with the SASL mechanism.] */
XinZhangMS 0:f7f1f0d76dd6 44 free(sasl_mechanism_concrete_handle);
XinZhangMS 0:f7f1f0d76dd6 45 }
XinZhangMS 0:f7f1f0d76dd6 46 }
XinZhangMS 0:f7f1f0d76dd6 47
XinZhangMS 0:f7f1f0d76dd6 48 static int saslanonymous_get_init_bytes(CONCRETE_SASL_MECHANISM_HANDLE sasl_mechanism_concrete_handle, SASL_MECHANISM_BYTES* init_bytes)
XinZhangMS 0:f7f1f0d76dd6 49 {
XinZhangMS 0:f7f1f0d76dd6 50 int result;
XinZhangMS 0:f7f1f0d76dd6 51
XinZhangMS 0:f7f1f0d76dd6 52 /* Codes_SRS_SASL_ANONYMOUS_01_007: [If any argument is NULL, `saslanonymous_get_init_bytes` shall return a non-zero value.]*/
XinZhangMS 0:f7f1f0d76dd6 53 if ((sasl_mechanism_concrete_handle == NULL) ||
XinZhangMS 0:f7f1f0d76dd6 54 (init_bytes == NULL))
XinZhangMS 0:f7f1f0d76dd6 55 {
XinZhangMS 0:f7f1f0d76dd6 56 LogError("Bad arguments: sasl_mechanism_concrete_handle = %p, init_bytes = %p",
XinZhangMS 0:f7f1f0d76dd6 57 sasl_mechanism_concrete_handle, init_bytes);
XinZhangMS 0:f7f1f0d76dd6 58 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 59 }
XinZhangMS 0:f7f1f0d76dd6 60 else
XinZhangMS 0:f7f1f0d76dd6 61 {
XinZhangMS 0:f7f1f0d76dd6 62 /* Codes_SRS_SASL_ANONYMOUS_01_012: [The bytes field of `init_buffer` shall be set to NULL.] */
XinZhangMS 0:f7f1f0d76dd6 63 init_bytes->bytes = NULL;
XinZhangMS 0:f7f1f0d76dd6 64 /* Codes_SRS_SASL_ANONYMOUS_01_006: [`saslanonymous_get_init_bytes` shall validate the `concrete_sasl_mechanism` argument and set the length of the `init_bytes` argument to be zero.] */
XinZhangMS 0:f7f1f0d76dd6 65 init_bytes->length = 0;
XinZhangMS 0:f7f1f0d76dd6 66
XinZhangMS 0:f7f1f0d76dd6 67 /* Codes_SRS_SASL_ANONYMOUS_01_011: [On success `saslanonymous_get_init_bytes` shall return zero.] */
XinZhangMS 0:f7f1f0d76dd6 68 result = 0;
XinZhangMS 0:f7f1f0d76dd6 69 }
XinZhangMS 0:f7f1f0d76dd6 70
XinZhangMS 0:f7f1f0d76dd6 71 return result;
XinZhangMS 0:f7f1f0d76dd6 72 }
XinZhangMS 0:f7f1f0d76dd6 73
XinZhangMS 0:f7f1f0d76dd6 74 static const char* saslanonymous_get_mechanism_name(CONCRETE_SASL_MECHANISM_HANDLE sasl_mechanism)
XinZhangMS 0:f7f1f0d76dd6 75 {
XinZhangMS 0:f7f1f0d76dd6 76 const char* result;
XinZhangMS 0:f7f1f0d76dd6 77
XinZhangMS 0:f7f1f0d76dd6 78 /* Codes_SRS_SASL_ANONYMOUS_01_009: [If the argument `concrete_sasl_mechanism` is NULL, `saslanonymous_get_mechanism_name` shall return NULL.] */
XinZhangMS 0:f7f1f0d76dd6 79 if (sasl_mechanism == NULL)
XinZhangMS 0:f7f1f0d76dd6 80 {
XinZhangMS 0:f7f1f0d76dd6 81 LogError("NULL sasl_mechanism");
XinZhangMS 0:f7f1f0d76dd6 82 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 83 }
XinZhangMS 0:f7f1f0d76dd6 84 else
XinZhangMS 0:f7f1f0d76dd6 85 {
XinZhangMS 0:f7f1f0d76dd6 86 /* Codes_SRS_SASL_ANONYMOUS_01_008: [`saslanonymous_get_mechanism_name` shall validate the argument `concrete_sasl_mechanism` and on success it shall return a pointer to the string `ANONYMOUS`.] */
XinZhangMS 0:f7f1f0d76dd6 87 result = "ANONYMOUS";
XinZhangMS 0:f7f1f0d76dd6 88 }
XinZhangMS 0:f7f1f0d76dd6 89
XinZhangMS 0:f7f1f0d76dd6 90 return result;
XinZhangMS 0:f7f1f0d76dd6 91 }
XinZhangMS 0:f7f1f0d76dd6 92
XinZhangMS 0:f7f1f0d76dd6 93 static int saslanonymous_challenge(CONCRETE_SASL_MECHANISM_HANDLE concrete_sasl_mechanism, const SASL_MECHANISM_BYTES* challenge_bytes, SASL_MECHANISM_BYTES* response_bytes)
XinZhangMS 0:f7f1f0d76dd6 94 {
XinZhangMS 0:f7f1f0d76dd6 95 int result;
XinZhangMS 0:f7f1f0d76dd6 96
XinZhangMS 0:f7f1f0d76dd6 97 (void)challenge_bytes;
XinZhangMS 0:f7f1f0d76dd6 98
XinZhangMS 0:f7f1f0d76dd6 99 /* Codes_SRS_SASL_ANONYMOUS_01_015: [If the `concrete_sasl_mechanism` or `response_bytes` argument is NULL then `saslanonymous_challenge` shall fail and return a non-zero value.] */
XinZhangMS 0:f7f1f0d76dd6 100 if ((concrete_sasl_mechanism == NULL) ||
XinZhangMS 0:f7f1f0d76dd6 101 (response_bytes == NULL))
XinZhangMS 0:f7f1f0d76dd6 102 {
XinZhangMS 0:f7f1f0d76dd6 103 LogError("Bad arguments: concrete_sasl_mechanism = %p, response_bytes = %p",
XinZhangMS 0:f7f1f0d76dd6 104 concrete_sasl_mechanism, response_bytes);
XinZhangMS 0:f7f1f0d76dd6 105 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 106 }
XinZhangMS 0:f7f1f0d76dd6 107 else
XinZhangMS 0:f7f1f0d76dd6 108 {
XinZhangMS 0:f7f1f0d76dd6 109 /* Codes_SRS_SASL_ANONYMOUS_01_013: [`saslanonymous_challenge` shall set the `buffer` field to NULL and `size` to 0 in the `response_bytes` argument as the ANONYMOUS SASL mechanism does not implement challenge/response.] */
XinZhangMS 0:f7f1f0d76dd6 110 response_bytes->bytes = NULL;
XinZhangMS 0:f7f1f0d76dd6 111 response_bytes->length = 0;
XinZhangMS 0:f7f1f0d76dd6 112
XinZhangMS 0:f7f1f0d76dd6 113 /* Codes_SRS_SASL_ANONYMOUS_01_014: [On success, `saslanonymous_challenge` shall return 0.] */
XinZhangMS 0:f7f1f0d76dd6 114 result = 0;
XinZhangMS 0:f7f1f0d76dd6 115 }
XinZhangMS 0:f7f1f0d76dd6 116
XinZhangMS 0:f7f1f0d76dd6 117 return result;
XinZhangMS 0:f7f1f0d76dd6 118 }
XinZhangMS 0:f7f1f0d76dd6 119
XinZhangMS 0:f7f1f0d76dd6 120 /* Codes_SRS_SASL_ANONYMOUS_01_010: [`saslanonymous_get_interface` shall return a pointer to a `SASL_MECHANISM_INTERFACE_DESCRIPTION` structure that contains pointers to the functions: `saslanonymous_create`, `saslanonymous_destroy`, `saslanonymous_get_init_bytes`, `saslanonymous_get_mechanism_name`, `saslanonymous_challenge`.] */
XinZhangMS 0:f7f1f0d76dd6 121 static const SASL_MECHANISM_INTERFACE_DESCRIPTION saslanonymous_interface =
XinZhangMS 0:f7f1f0d76dd6 122 {
XinZhangMS 0:f7f1f0d76dd6 123 saslanonymous_create,
XinZhangMS 0:f7f1f0d76dd6 124 saslanonymous_destroy,
XinZhangMS 0:f7f1f0d76dd6 125 saslanonymous_get_init_bytes,
XinZhangMS 0:f7f1f0d76dd6 126 saslanonymous_get_mechanism_name,
XinZhangMS 0:f7f1f0d76dd6 127 saslanonymous_challenge
XinZhangMS 0:f7f1f0d76dd6 128 };
XinZhangMS 0:f7f1f0d76dd6 129
XinZhangMS 0:f7f1f0d76dd6 130 const SASL_MECHANISM_INTERFACE_DESCRIPTION* saslanonymous_get_interface(void)
XinZhangMS 0:f7f1f0d76dd6 131 {
XinZhangMS 0:f7f1f0d76dd6 132 return &saslanonymous_interface;
XinZhangMS 0:f7f1f0d76dd6 133 }