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
XinZhangMS 0:f7f1f0d76dd6 6 #include "azure_c_shared_utility/gballoc.h"
XinZhangMS 0:f7f1f0d76dd6 7 #include "azure_c_shared_utility/tlsio_options.h"
XinZhangMS 0:f7f1f0d76dd6 8 #include "azure_c_shared_utility/shared_util_options.h"
XinZhangMS 0:f7f1f0d76dd6 9 #include "azure_c_shared_utility/xlogging.h"
XinZhangMS 0:f7f1f0d76dd6 10 #include "azure_c_shared_utility/crt_abstractions.h"
XinZhangMS 0:f7f1f0d76dd6 11
XinZhangMS 0:f7f1f0d76dd6 12
XinZhangMS 0:f7f1f0d76dd6 13 // Initialize the TLSIO_OPTIONS struct
XinZhangMS 0:f7f1f0d76dd6 14 void tlsio_options_initialize(TLSIO_OPTIONS* options, int supported_options)
XinZhangMS 0:f7f1f0d76dd6 15 {
XinZhangMS 0:f7f1f0d76dd6 16 // Using static function rules, so 'options' is not checked for NULL
XinZhangMS 0:f7f1f0d76dd6 17 //
XinZhangMS 0:f7f1f0d76dd6 18 // The supported_options value does not need validation because undefined bits are
XinZhangMS 0:f7f1f0d76dd6 19 // ignored, while any valid missing bits result in an "option not supported" error
XinZhangMS 0:f7f1f0d76dd6 20 // that will show up in unit testing.
XinZhangMS 0:f7f1f0d76dd6 21 options->supported_options = supported_options;
XinZhangMS 0:f7f1f0d76dd6 22 options->trusted_certs = NULL;
XinZhangMS 0:f7f1f0d76dd6 23 options->x509_type = TLSIO_OPTIONS_x509_TYPE_UNSPECIFIED;
XinZhangMS 0:f7f1f0d76dd6 24 options->x509_cert = NULL;
XinZhangMS 0:f7f1f0d76dd6 25 options->x509_key = NULL;
XinZhangMS 0:f7f1f0d76dd6 26 }
XinZhangMS 0:f7f1f0d76dd6 27
XinZhangMS 0:f7f1f0d76dd6 28 static int set_and_validate_x509_type(TLSIO_OPTIONS* options, TLSIO_OPTIONS_x509_TYPE x509_type)
XinZhangMS 0:f7f1f0d76dd6 29 {
XinZhangMS 0:f7f1f0d76dd6 30 int result;
XinZhangMS 0:f7f1f0d76dd6 31 if ((options->supported_options & x509_type) == 0)
XinZhangMS 0:f7f1f0d76dd6 32 {
XinZhangMS 0:f7f1f0d76dd6 33 // This case also rejects the nonsensical TLSIO_OPTIONS_x509_TYPE_UNSPECIFIED
XinZhangMS 0:f7f1f0d76dd6 34 LogError("Unsupported x509 type: %d", x509_type);
XinZhangMS 0:f7f1f0d76dd6 35 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 36 }
XinZhangMS 0:f7f1f0d76dd6 37 else if (options->x509_type == TLSIO_OPTIONS_x509_TYPE_UNSPECIFIED)
XinZhangMS 0:f7f1f0d76dd6 38 {
XinZhangMS 0:f7f1f0d76dd6 39 // Initial type setting
XinZhangMS 0:f7f1f0d76dd6 40 options->x509_type = x509_type;
XinZhangMS 0:f7f1f0d76dd6 41 result = 0;
XinZhangMS 0:f7f1f0d76dd6 42 }
XinZhangMS 0:f7f1f0d76dd6 43 else if (options->x509_type != x509_type)
XinZhangMS 0:f7f1f0d76dd6 44 {
XinZhangMS 0:f7f1f0d76dd6 45 LogError("Supplied x509 type conflicts with previously set x509");
XinZhangMS 0:f7f1f0d76dd6 46 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 47 }
XinZhangMS 0:f7f1f0d76dd6 48 else
XinZhangMS 0:f7f1f0d76dd6 49 {
XinZhangMS 0:f7f1f0d76dd6 50 // The types match okay
XinZhangMS 0:f7f1f0d76dd6 51 result = 0;
XinZhangMS 0:f7f1f0d76dd6 52 }
XinZhangMS 0:f7f1f0d76dd6 53
XinZhangMS 0:f7f1f0d76dd6 54 return result;
XinZhangMS 0:f7f1f0d76dd6 55 }
XinZhangMS 0:f7f1f0d76dd6 56
XinZhangMS 0:f7f1f0d76dd6 57 void tlsio_options_release_resources(TLSIO_OPTIONS* options)
XinZhangMS 0:f7f1f0d76dd6 58 {
XinZhangMS 0:f7f1f0d76dd6 59 if (options != NULL)
XinZhangMS 0:f7f1f0d76dd6 60 {
XinZhangMS 0:f7f1f0d76dd6 61 free((void*)options->trusted_certs);
XinZhangMS 0:f7f1f0d76dd6 62 free((void*)options->x509_cert);
XinZhangMS 0:f7f1f0d76dd6 63 free((void*)options->x509_key);
XinZhangMS 0:f7f1f0d76dd6 64 }
XinZhangMS 0:f7f1f0d76dd6 65 else
XinZhangMS 0:f7f1f0d76dd6 66 {
XinZhangMS 0:f7f1f0d76dd6 67 LogError("NULL options");
XinZhangMS 0:f7f1f0d76dd6 68 }
XinZhangMS 0:f7f1f0d76dd6 69 }
XinZhangMS 0:f7f1f0d76dd6 70
XinZhangMS 0:f7f1f0d76dd6 71 static bool is_supported_string_option(const char* name)
XinZhangMS 0:f7f1f0d76dd6 72 {
XinZhangMS 0:f7f1f0d76dd6 73 return
XinZhangMS 0:f7f1f0d76dd6 74 (strcmp(name, OPTION_TRUSTED_CERT) == 0) ||
XinZhangMS 0:f7f1f0d76dd6 75 (strcmp(name, OPTION_OPENSSL_CIPHER_SUITE) == 0) ||
XinZhangMS 0:f7f1f0d76dd6 76 (strcmp(name, SU_OPTION_X509_CERT) == 0) ||
XinZhangMS 0:f7f1f0d76dd6 77 (strcmp(name, SU_OPTION_X509_PRIVATE_KEY) == 0) ||
XinZhangMS 0:f7f1f0d76dd6 78 (strcmp(name, OPTION_X509_ECC_CERT) == 0) ||
XinZhangMS 0:f7f1f0d76dd6 79 (strcmp(name, OPTION_X509_ECC_KEY) == 0);
XinZhangMS 0:f7f1f0d76dd6 80 }
XinZhangMS 0:f7f1f0d76dd6 81
XinZhangMS 0:f7f1f0d76dd6 82 TLSIO_OPTIONS_RESULT tlsio_options_destroy_option(const char* name, const void* value)
XinZhangMS 0:f7f1f0d76dd6 83 {
XinZhangMS 0:f7f1f0d76dd6 84 TLSIO_OPTIONS_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 85 if (name == NULL || value == NULL)
XinZhangMS 0:f7f1f0d76dd6 86 {
XinZhangMS 0:f7f1f0d76dd6 87 LogError("NULL parameter: name: %p, value: %p", name, value);
XinZhangMS 0:f7f1f0d76dd6 88 result = TLSIO_OPTIONS_RESULT_ERROR;
XinZhangMS 0:f7f1f0d76dd6 89 }
XinZhangMS 0:f7f1f0d76dd6 90 else if (is_supported_string_option(name))
XinZhangMS 0:f7f1f0d76dd6 91 {
XinZhangMS 0:f7f1f0d76dd6 92 free((void*)value);
XinZhangMS 0:f7f1f0d76dd6 93 result = TLSIO_OPTIONS_RESULT_SUCCESS;
XinZhangMS 0:f7f1f0d76dd6 94 }
XinZhangMS 0:f7f1f0d76dd6 95 else
XinZhangMS 0:f7f1f0d76dd6 96 {
XinZhangMS 0:f7f1f0d76dd6 97 result = TLSIO_OPTIONS_RESULT_NOT_HANDLED;
XinZhangMS 0:f7f1f0d76dd6 98 }
XinZhangMS 0:f7f1f0d76dd6 99 return result;
XinZhangMS 0:f7f1f0d76dd6 100 }
XinZhangMS 0:f7f1f0d76dd6 101
XinZhangMS 0:f7f1f0d76dd6 102 TLSIO_OPTIONS_RESULT tlsio_options_clone_option(const char* name, const void* value, void** out_value)
XinZhangMS 0:f7f1f0d76dd6 103 {
XinZhangMS 0:f7f1f0d76dd6 104 TLSIO_OPTIONS_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 105
XinZhangMS 0:f7f1f0d76dd6 106 if (name == NULL || value == NULL || out_value == NULL)
XinZhangMS 0:f7f1f0d76dd6 107 {
XinZhangMS 0:f7f1f0d76dd6 108 LogError("NULL parameter: name: %p, value: %p, out_value: %p",
XinZhangMS 0:f7f1f0d76dd6 109 name, value, out_value);
XinZhangMS 0:f7f1f0d76dd6 110 result = TLSIO_OPTIONS_RESULT_ERROR;
XinZhangMS 0:f7f1f0d76dd6 111 }
XinZhangMS 0:f7f1f0d76dd6 112 else if (is_supported_string_option(name))
XinZhangMS 0:f7f1f0d76dd6 113 {
XinZhangMS 0:f7f1f0d76dd6 114 *out_value = NULL;
XinZhangMS 0:f7f1f0d76dd6 115 if (mallocAndStrcpy_s((char**)out_value, value) != 0)
XinZhangMS 0:f7f1f0d76dd6 116 {
XinZhangMS 0:f7f1f0d76dd6 117 LogError("unable to mallocAndStrcpy_s option value");
XinZhangMS 0:f7f1f0d76dd6 118 result = TLSIO_OPTIONS_RESULT_ERROR;
XinZhangMS 0:f7f1f0d76dd6 119 }
XinZhangMS 0:f7f1f0d76dd6 120 else
XinZhangMS 0:f7f1f0d76dd6 121 {
XinZhangMS 0:f7f1f0d76dd6 122 result = TLSIO_OPTIONS_RESULT_SUCCESS;
XinZhangMS 0:f7f1f0d76dd6 123 }
XinZhangMS 0:f7f1f0d76dd6 124 }
XinZhangMS 0:f7f1f0d76dd6 125 else
XinZhangMS 0:f7f1f0d76dd6 126 {
XinZhangMS 0:f7f1f0d76dd6 127 result = TLSIO_OPTIONS_RESULT_NOT_HANDLED;
XinZhangMS 0:f7f1f0d76dd6 128 }
XinZhangMS 0:f7f1f0d76dd6 129 return result;
XinZhangMS 0:f7f1f0d76dd6 130 }
XinZhangMS 0:f7f1f0d76dd6 131
XinZhangMS 0:f7f1f0d76dd6 132 TLSIO_OPTIONS_RESULT tlsio_options_set(TLSIO_OPTIONS* options,
XinZhangMS 0:f7f1f0d76dd6 133 const char* optionName, const void* value)
XinZhangMS 0:f7f1f0d76dd6 134 {
XinZhangMS 0:f7f1f0d76dd6 135 TLSIO_OPTIONS_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 136 char* copied_value = NULL;
XinZhangMS 0:f7f1f0d76dd6 137
XinZhangMS 0:f7f1f0d76dd6 138 if (options == NULL || optionName == NULL || value == NULL)
XinZhangMS 0:f7f1f0d76dd6 139 {
XinZhangMS 0:f7f1f0d76dd6 140 LogError("NULL parameter: options: %p, optionName: %p, value: %p",
XinZhangMS 0:f7f1f0d76dd6 141 options, optionName, value);
XinZhangMS 0:f7f1f0d76dd6 142 result = TLSIO_OPTIONS_RESULT_ERROR;
XinZhangMS 0:f7f1f0d76dd6 143 }
XinZhangMS 0:f7f1f0d76dd6 144 else if (!is_supported_string_option(optionName))
XinZhangMS 0:f7f1f0d76dd6 145 {
XinZhangMS 0:f7f1f0d76dd6 146 result = TLSIO_OPTIONS_RESULT_NOT_HANDLED;
XinZhangMS 0:f7f1f0d76dd6 147 }
XinZhangMS 0:f7f1f0d76dd6 148 else if(mallocAndStrcpy_s(&copied_value, value) != 0)
XinZhangMS 0:f7f1f0d76dd6 149 {
XinZhangMS 0:f7f1f0d76dd6 150 LogError("unable to mallocAndStrcpy_s option value");
XinZhangMS 0:f7f1f0d76dd6 151 result = TLSIO_OPTIONS_RESULT_ERROR;
XinZhangMS 0:f7f1f0d76dd6 152 }
XinZhangMS 0:f7f1f0d76dd6 153 else if (strcmp(OPTION_TRUSTED_CERT, optionName) == 0)
XinZhangMS 0:f7f1f0d76dd6 154 {
XinZhangMS 0:f7f1f0d76dd6 155 if ((options->supported_options & TLSIO_OPTION_BIT_TRUSTED_CERTS) == 0)
XinZhangMS 0:f7f1f0d76dd6 156 {
XinZhangMS 0:f7f1f0d76dd6 157 LogError("Trusted certs option not supported");
XinZhangMS 0:f7f1f0d76dd6 158 result = TLSIO_OPTIONS_RESULT_ERROR;
XinZhangMS 0:f7f1f0d76dd6 159 }
XinZhangMS 0:f7f1f0d76dd6 160 else if (options->trusted_certs != NULL)
XinZhangMS 0:f7f1f0d76dd6 161 {
XinZhangMS 0:f7f1f0d76dd6 162 LogError("unable to set trusted cert option more than once");
XinZhangMS 0:f7f1f0d76dd6 163 result = TLSIO_OPTIONS_RESULT_ERROR;
XinZhangMS 0:f7f1f0d76dd6 164 }
XinZhangMS 0:f7f1f0d76dd6 165 else
XinZhangMS 0:f7f1f0d76dd6 166 {
XinZhangMS 0:f7f1f0d76dd6 167 options->trusted_certs = copied_value;
XinZhangMS 0:f7f1f0d76dd6 168 result = TLSIO_OPTIONS_RESULT_SUCCESS;
XinZhangMS 0:f7f1f0d76dd6 169 }
XinZhangMS 0:f7f1f0d76dd6 170 }
XinZhangMS 0:f7f1f0d76dd6 171 else if (strcmp(SU_OPTION_X509_CERT, optionName) == 0 || strcmp(OPTION_X509_ECC_CERT, optionName) == 0)
XinZhangMS 0:f7f1f0d76dd6 172 {
XinZhangMS 0:f7f1f0d76dd6 173 TLSIO_OPTIONS_x509_TYPE this_type = (strcmp(SU_OPTION_X509_CERT, optionName) == 0) ? TLSIO_OPTIONS_x509_TYPE_RSA : TLSIO_OPTIONS_x509_TYPE_ECC;
XinZhangMS 0:f7f1f0d76dd6 174 if (options->x509_cert != NULL)
XinZhangMS 0:f7f1f0d76dd6 175 {
XinZhangMS 0:f7f1f0d76dd6 176 LogError("unable to set x509 cert more than once");
XinZhangMS 0:f7f1f0d76dd6 177 result = TLSIO_OPTIONS_RESULT_ERROR;
XinZhangMS 0:f7f1f0d76dd6 178 }
XinZhangMS 0:f7f1f0d76dd6 179 else if (set_and_validate_x509_type(options, this_type) != 0)
XinZhangMS 0:f7f1f0d76dd6 180 {
XinZhangMS 0:f7f1f0d76dd6 181 // Error logged by helper
XinZhangMS 0:f7f1f0d76dd6 182 result = TLSIO_OPTIONS_RESULT_ERROR;
XinZhangMS 0:f7f1f0d76dd6 183 }
XinZhangMS 0:f7f1f0d76dd6 184 else
XinZhangMS 0:f7f1f0d76dd6 185 {
XinZhangMS 0:f7f1f0d76dd6 186 options->x509_cert = copied_value;
XinZhangMS 0:f7f1f0d76dd6 187 result = TLSIO_OPTIONS_RESULT_SUCCESS;
XinZhangMS 0:f7f1f0d76dd6 188 }
XinZhangMS 0:f7f1f0d76dd6 189 }
XinZhangMS 0:f7f1f0d76dd6 190 else if (strcmp(SU_OPTION_X509_PRIVATE_KEY, optionName) == 0 || strcmp(OPTION_X509_ECC_KEY, optionName) == 0)
XinZhangMS 0:f7f1f0d76dd6 191 {
XinZhangMS 0:f7f1f0d76dd6 192 TLSIO_OPTIONS_x509_TYPE this_type = (strcmp(SU_OPTION_X509_PRIVATE_KEY, optionName) == 0) ? TLSIO_OPTIONS_x509_TYPE_RSA : TLSIO_OPTIONS_x509_TYPE_ECC;
XinZhangMS 0:f7f1f0d76dd6 193 if (options->x509_key != NULL)
XinZhangMS 0:f7f1f0d76dd6 194 {
XinZhangMS 0:f7f1f0d76dd6 195 LogError("unable to set x509 key more than once");
XinZhangMS 0:f7f1f0d76dd6 196 result = TLSIO_OPTIONS_RESULT_ERROR;
XinZhangMS 0:f7f1f0d76dd6 197 }
XinZhangMS 0:f7f1f0d76dd6 198 else if (set_and_validate_x509_type(options, this_type) != 0)
XinZhangMS 0:f7f1f0d76dd6 199 {
XinZhangMS 0:f7f1f0d76dd6 200 // Error logged by helper
XinZhangMS 0:f7f1f0d76dd6 201 result = TLSIO_OPTIONS_RESULT_ERROR;
XinZhangMS 0:f7f1f0d76dd6 202 }
XinZhangMS 0:f7f1f0d76dd6 203 else
XinZhangMS 0:f7f1f0d76dd6 204 {
XinZhangMS 0:f7f1f0d76dd6 205 options->x509_key = copied_value;
XinZhangMS 0:f7f1f0d76dd6 206 result = TLSIO_OPTIONS_RESULT_SUCCESS;
XinZhangMS 0:f7f1f0d76dd6 207 }
XinZhangMS 0:f7f1f0d76dd6 208 }
XinZhangMS 0:f7f1f0d76dd6 209 else
XinZhangMS 0:f7f1f0d76dd6 210 {
XinZhangMS 0:f7f1f0d76dd6 211 // This is logically impossible due to earlier tests, so just quiet the compiler
XinZhangMS 0:f7f1f0d76dd6 212 result = TLSIO_OPTIONS_RESULT_ERROR;
XinZhangMS 0:f7f1f0d76dd6 213 }
XinZhangMS 0:f7f1f0d76dd6 214
XinZhangMS 0:f7f1f0d76dd6 215 if (result != TLSIO_OPTIONS_RESULT_SUCCESS)
XinZhangMS 0:f7f1f0d76dd6 216 {
XinZhangMS 0:f7f1f0d76dd6 217 free(copied_value);
XinZhangMS 0:f7f1f0d76dd6 218 }
XinZhangMS 0:f7f1f0d76dd6 219
XinZhangMS 0:f7f1f0d76dd6 220 return result;
XinZhangMS 0:f7f1f0d76dd6 221 }
XinZhangMS 0:f7f1f0d76dd6 222
XinZhangMS 0:f7f1f0d76dd6 223 // A helper that works if the tlsio does not use any extra options
XinZhangMS 0:f7f1f0d76dd6 224 static void* local_clone_option(const char* name, const void* value)
XinZhangMS 0:f7f1f0d76dd6 225 {
XinZhangMS 0:f7f1f0d76dd6 226 void* result = NULL;
XinZhangMS 0:f7f1f0d76dd6 227 if (tlsio_options_clone_option(name, value, &result) != TLSIO_OPTIONS_RESULT_SUCCESS)
XinZhangMS 0:f7f1f0d76dd6 228 {
XinZhangMS 0:f7f1f0d76dd6 229 LogError("Unexpected local_clone_option failure");
XinZhangMS 0:f7f1f0d76dd6 230 }
XinZhangMS 0:f7f1f0d76dd6 231 return result;
XinZhangMS 0:f7f1f0d76dd6 232 }
XinZhangMS 0:f7f1f0d76dd6 233
XinZhangMS 0:f7f1f0d76dd6 234 // A helper that works if the tlsio does not use any extra options
XinZhangMS 0:f7f1f0d76dd6 235 void local_destroy_option(const char* name, const void* value)
XinZhangMS 0:f7f1f0d76dd6 236 {
XinZhangMS 0:f7f1f0d76dd6 237 if (tlsio_options_destroy_option(name, value) != TLSIO_OPTIONS_RESULT_SUCCESS)
XinZhangMS 0:f7f1f0d76dd6 238 {
XinZhangMS 0:f7f1f0d76dd6 239 LogError("Unexpected local_destroy_option failure");
XinZhangMS 0:f7f1f0d76dd6 240 }
XinZhangMS 0:f7f1f0d76dd6 241 }
XinZhangMS 0:f7f1f0d76dd6 242
XinZhangMS 0:f7f1f0d76dd6 243 OPTIONHANDLER_HANDLE tlsio_options_retrieve_options(TLSIO_OPTIONS* options, pfSetOption setOption)
XinZhangMS 0:f7f1f0d76dd6 244 {
XinZhangMS 0:f7f1f0d76dd6 245 return tlsio_options_retrieve_options_ex(options, local_clone_option, local_destroy_option, setOption);
XinZhangMS 0:f7f1f0d76dd6 246 }
XinZhangMS 0:f7f1f0d76dd6 247
XinZhangMS 0:f7f1f0d76dd6 248
XinZhangMS 0:f7f1f0d76dd6 249 OPTIONHANDLER_HANDLE tlsio_options_retrieve_options_ex(TLSIO_OPTIONS* options,
XinZhangMS 0:f7f1f0d76dd6 250 pfCloneOption cloneOption, pfDestroyOption destroyOption, pfSetOption setOption)
XinZhangMS 0:f7f1f0d76dd6 251 {
XinZhangMS 0:f7f1f0d76dd6 252 OPTIONHANDLER_HANDLE result;
XinZhangMS 0:f7f1f0d76dd6 253 if (options == NULL || cloneOption == NULL || destroyOption == NULL || setOption == NULL)
XinZhangMS 0:f7f1f0d76dd6 254 {
XinZhangMS 0:f7f1f0d76dd6 255 LogError("Null parameter in options: %p, cloneOption: %p, destroyOption: %p, setOption: %p",
XinZhangMS 0:f7f1f0d76dd6 256 options, cloneOption, destroyOption, setOption);
XinZhangMS 0:f7f1f0d76dd6 257 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 258 }
XinZhangMS 0:f7f1f0d76dd6 259 else
XinZhangMS 0:f7f1f0d76dd6 260 {
XinZhangMS 0:f7f1f0d76dd6 261 result = OptionHandler_Create(cloneOption, destroyOption, setOption);
XinZhangMS 0:f7f1f0d76dd6 262 if (result == NULL)
XinZhangMS 0:f7f1f0d76dd6 263 {
XinZhangMS 0:f7f1f0d76dd6 264 LogError("OptionHandler_Create failed");
XinZhangMS 0:f7f1f0d76dd6 265 /*return as is*/
XinZhangMS 0:f7f1f0d76dd6 266 }
XinZhangMS 0:f7f1f0d76dd6 267 else if (
XinZhangMS 0:f7f1f0d76dd6 268 (options->trusted_certs != NULL) &&
XinZhangMS 0:f7f1f0d76dd6 269 (OptionHandler_AddOption(result, OPTION_TRUSTED_CERT, options->trusted_certs) != OPTIONHANDLER_OK)
XinZhangMS 0:f7f1f0d76dd6 270 )
XinZhangMS 0:f7f1f0d76dd6 271 {
XinZhangMS 0:f7f1f0d76dd6 272 LogError("unable to save TrustedCerts option");
XinZhangMS 0:f7f1f0d76dd6 273 OptionHandler_Destroy(result);
XinZhangMS 0:f7f1f0d76dd6 274 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 275 }
XinZhangMS 0:f7f1f0d76dd6 276 else if (options->x509_type != TLSIO_OPTIONS_x509_TYPE_UNSPECIFIED)
XinZhangMS 0:f7f1f0d76dd6 277 {
XinZhangMS 0:f7f1f0d76dd6 278 const char* x509_cert_option;
XinZhangMS 0:f7f1f0d76dd6 279 const char* x509_key_option;
XinZhangMS 0:f7f1f0d76dd6 280 if (options->x509_type == TLSIO_OPTIONS_x509_TYPE_ECC)
XinZhangMS 0:f7f1f0d76dd6 281 {
XinZhangMS 0:f7f1f0d76dd6 282 x509_cert_option = OPTION_X509_ECC_CERT;
XinZhangMS 0:f7f1f0d76dd6 283 x509_key_option = OPTION_X509_ECC_KEY;
XinZhangMS 0:f7f1f0d76dd6 284 }
XinZhangMS 0:f7f1f0d76dd6 285 else
XinZhangMS 0:f7f1f0d76dd6 286 {
XinZhangMS 0:f7f1f0d76dd6 287 x509_cert_option = SU_OPTION_X509_CERT;
XinZhangMS 0:f7f1f0d76dd6 288 x509_key_option = SU_OPTION_X509_PRIVATE_KEY;
XinZhangMS 0:f7f1f0d76dd6 289 }
XinZhangMS 0:f7f1f0d76dd6 290 if (
XinZhangMS 0:f7f1f0d76dd6 291 (options->x509_cert != NULL) &&
XinZhangMS 0:f7f1f0d76dd6 292 (OptionHandler_AddOption(result, x509_cert_option, options->x509_cert) != OPTIONHANDLER_OK)
XinZhangMS 0:f7f1f0d76dd6 293 )
XinZhangMS 0:f7f1f0d76dd6 294 {
XinZhangMS 0:f7f1f0d76dd6 295 LogError("unable to save x509 cert option");
XinZhangMS 0:f7f1f0d76dd6 296 OptionHandler_Destroy(result);
XinZhangMS 0:f7f1f0d76dd6 297 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 298 }
XinZhangMS 0:f7f1f0d76dd6 299 else if (
XinZhangMS 0:f7f1f0d76dd6 300 (options->x509_key != NULL) &&
XinZhangMS 0:f7f1f0d76dd6 301 (OptionHandler_AddOption(result, x509_key_option, options->x509_key) != OPTIONHANDLER_OK)
XinZhangMS 0:f7f1f0d76dd6 302 )
XinZhangMS 0:f7f1f0d76dd6 303 {
XinZhangMS 0:f7f1f0d76dd6 304 LogError("unable to save x509 key option");
XinZhangMS 0:f7f1f0d76dd6 305 OptionHandler_Destroy(result);
XinZhangMS 0:f7f1f0d76dd6 306 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 307 }
XinZhangMS 0:f7f1f0d76dd6 308 }
XinZhangMS 0:f7f1f0d76dd6 309 }
XinZhangMS 0:f7f1f0d76dd6 310
XinZhangMS 0:f7f1f0d76dd6 311 return result;
XinZhangMS 0:f7f1f0d76dd6 312 }
XinZhangMS 0:f7f1f0d76dd6 313