Xuyi Wang / wolfSSL

Dependents:   OS

Committer:
wolfSSL
Date:
Tue Aug 22 10:48:22 2017 +0000
Revision:
13:f67a6c6013ca
wolfSSL3.12.0 with TLS1.3

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wolfSSL 13:f67a6c6013ca 1 /* port.c
wolfSSL 13:f67a6c6013ca 2 *
wolfSSL 13:f67a6c6013ca 3 * Copyright (C) 2006-2016 wolfSSL Inc.
wolfSSL 13:f67a6c6013ca 4 *
wolfSSL 13:f67a6c6013ca 5 * This file is part of wolfSSL.
wolfSSL 13:f67a6c6013ca 6 *
wolfSSL 13:f67a6c6013ca 7 * wolfSSL is free software; you can redistribute it and/or modify
wolfSSL 13:f67a6c6013ca 8 * it under the terms of the GNU General Public License as published by
wolfSSL 13:f67a6c6013ca 9 * the Free Software Foundation; either version 2 of the License, or
wolfSSL 13:f67a6c6013ca 10 * (at your option) any later version.
wolfSSL 13:f67a6c6013ca 11 *
wolfSSL 13:f67a6c6013ca 12 * wolfSSL is distributed in the hope that it will be useful,
wolfSSL 13:f67a6c6013ca 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
wolfSSL 13:f67a6c6013ca 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
wolfSSL 13:f67a6c6013ca 15 * GNU General Public License for more details.
wolfSSL 13:f67a6c6013ca 16 *
wolfSSL 13:f67a6c6013ca 17 * You should have received a copy of the GNU General Public License
wolfSSL 13:f67a6c6013ca 18 * along with this program; if not, write to the Free Software
wolfSSL 13:f67a6c6013ca 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
wolfSSL 13:f67a6c6013ca 20 */
wolfSSL 13:f67a6c6013ca 21
wolfSSL 13:f67a6c6013ca 22
wolfSSL 13:f67a6c6013ca 23 #ifdef HAVE_CONFIG_H
wolfSSL 13:f67a6c6013ca 24 #include <config.h>
wolfSSL 13:f67a6c6013ca 25 #endif
wolfSSL 13:f67a6c6013ca 26
wolfSSL 13:f67a6c6013ca 27 #include <wolfssl/wolfcrypt/settings.h>
wolfSSL 13:f67a6c6013ca 28 #include <wolfssl/wolfcrypt/types.h>
wolfSSL 13:f67a6c6013ca 29 #include <wolfssl/wolfcrypt/error-crypt.h>
wolfSSL 13:f67a6c6013ca 30 #include <wolfssl/wolfcrypt/logging.h>
wolfSSL 13:f67a6c6013ca 31 #include <wolfssl/wolfcrypt/wc_port.h>
wolfSSL 13:f67a6c6013ca 32 #ifdef HAVE_ECC
wolfSSL 13:f67a6c6013ca 33 #include <wolfssl/wolfcrypt/ecc.h>
wolfSSL 13:f67a6c6013ca 34 #endif
wolfSSL 13:f67a6c6013ca 35 #ifdef WOLFSSL_ASYNC_CRYPT
wolfSSL 13:f67a6c6013ca 36 #include <wolfssl/wolfcrypt/async.h>
wolfSSL 13:f67a6c6013ca 37 #endif
wolfSSL 13:f67a6c6013ca 38
wolfSSL 13:f67a6c6013ca 39 /* IPP header files for library initialization */
wolfSSL 13:f67a6c6013ca 40 #ifdef HAVE_FAST_RSA
wolfSSL 13:f67a6c6013ca 41 #include <ipp.h>
wolfSSL 13:f67a6c6013ca 42 #include <ippcp.h>
wolfSSL 13:f67a6c6013ca 43 #endif
wolfSSL 13:f67a6c6013ca 44
wolfSSL 13:f67a6c6013ca 45 #if defined(FREESCALE_LTC_TFM)
wolfSSL 13:f67a6c6013ca 46 #include <wolfssl/wolfcrypt/port/nxp/ksdk_port.h>
wolfSSL 13:f67a6c6013ca 47 #endif
wolfSSL 13:f67a6c6013ca 48
wolfSSL 13:f67a6c6013ca 49 #ifdef WOLFSSL_ATMEL
wolfSSL 13:f67a6c6013ca 50 #include <wolfssl/wolfcrypt/port/atmel/atmel.h>
wolfSSL 13:f67a6c6013ca 51 #endif
wolfSSL 13:f67a6c6013ca 52
wolfSSL 13:f67a6c6013ca 53 #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
wolfSSL 13:f67a6c6013ca 54 #include <wolfssl/openssl/evp.h>
wolfSSL 13:f67a6c6013ca 55 #endif
wolfSSL 13:f67a6c6013ca 56
wolfSSL 13:f67a6c6013ca 57 #if defined(USE_WOLFSSL_MEMORY) && defined(WOLFSSL_TRACK_MEMORY)
wolfSSL 13:f67a6c6013ca 58 #include <wolfssl/wolfcrypt/memory.h>
wolfSSL 13:f67a6c6013ca 59 #include <wolfssl/wolfcrypt/mem_track.h>
wolfSSL 13:f67a6c6013ca 60 #endif
wolfSSL 13:f67a6c6013ca 61
wolfSSL 13:f67a6c6013ca 62 #ifdef _MSC_VER
wolfSSL 13:f67a6c6013ca 63 /* 4996 warning to use MS extensions e.g., strcpy_s instead of strncpy */
wolfSSL 13:f67a6c6013ca 64 #pragma warning(disable: 4996)
wolfSSL 13:f67a6c6013ca 65 #endif
wolfSSL 13:f67a6c6013ca 66
wolfSSL 13:f67a6c6013ca 67 /* prevent multiple mutex initializations */
wolfSSL 13:f67a6c6013ca 68 static volatile int initRefCount = 0;
wolfSSL 13:f67a6c6013ca 69
wolfSSL 13:f67a6c6013ca 70 /* Used to initialize state for wolfcrypt
wolfSSL 13:f67a6c6013ca 71 return 0 on success
wolfSSL 13:f67a6c6013ca 72 */
wolfSSL 13:f67a6c6013ca 73 int wolfCrypt_Init(void)
wolfSSL 13:f67a6c6013ca 74 {
wolfSSL 13:f67a6c6013ca 75 int ret = 0;
wolfSSL 13:f67a6c6013ca 76
wolfSSL 13:f67a6c6013ca 77 if (initRefCount == 0) {
wolfSSL 13:f67a6c6013ca 78 WOLFSSL_ENTER("wolfCrypt_Init");
wolfSSL 13:f67a6c6013ca 79
wolfSSL 13:f67a6c6013ca 80 #ifdef WOLFSSL_ASYNC_CRYPT
wolfSSL 13:f67a6c6013ca 81 ret = wolfAsync_HardwareStart();
wolfSSL 13:f67a6c6013ca 82 if (ret != 0) {
wolfSSL 13:f67a6c6013ca 83 WOLFSSL_MSG("Async hardware start failed");
wolfSSL 13:f67a6c6013ca 84 /* don't return failure, allow operation to continue */
wolfSSL 13:f67a6c6013ca 85 }
wolfSSL 13:f67a6c6013ca 86 #endif
wolfSSL 13:f67a6c6013ca 87
wolfSSL 13:f67a6c6013ca 88 #if defined(WOLFSSL_TRACK_MEMORY) && !defined(WOLFSSL_STATIC_MEMORY)
wolfSSL 13:f67a6c6013ca 89 ret = InitMemoryTracker();
wolfSSL 13:f67a6c6013ca 90 if (ret != 0) {
wolfSSL 13:f67a6c6013ca 91 WOLFSSL_MSG("InitMemoryTracker failed");
wolfSSL 13:f67a6c6013ca 92 return ret;
wolfSSL 13:f67a6c6013ca 93 }
wolfSSL 13:f67a6c6013ca 94 #endif
wolfSSL 13:f67a6c6013ca 95
wolfSSL 13:f67a6c6013ca 96 #if WOLFSSL_CRYPT_HW_MUTEX
wolfSSL 13:f67a6c6013ca 97 /* If crypto hardware mutex protection is enabled, then initialize it */
wolfSSL 13:f67a6c6013ca 98 ret = wolfSSL_CryptHwMutexInit();
wolfSSL 13:f67a6c6013ca 99 if (ret != 0) {
wolfSSL 13:f67a6c6013ca 100 WOLFSSL_MSG("Hw crypt mutex init failed");
wolfSSL 13:f67a6c6013ca 101 return ret;
wolfSSL 13:f67a6c6013ca 102 }
wolfSSL 13:f67a6c6013ca 103 #endif
wolfSSL 13:f67a6c6013ca 104
wolfSSL 13:f67a6c6013ca 105 /* if defined have fast RSA then initialize Intel IPP */
wolfSSL 13:f67a6c6013ca 106 #ifdef HAVE_FAST_RSA
wolfSSL 13:f67a6c6013ca 107 WOLFSSL_MSG("Attempting to use optimized IPP Library");
wolfSSL 13:f67a6c6013ca 108 if ((ret = ippInit()) != ippStsNoErr) {
wolfSSL 13:f67a6c6013ca 109 /* possible to get a CPU feature support status on optimized IPP
wolfSSL 13:f67a6c6013ca 110 library but still use default library and see competitive speeds */
wolfSSL 13:f67a6c6013ca 111 WOLFSSL_MSG("Warning when trying to set up optimization");
wolfSSL 13:f67a6c6013ca 112 WOLFSSL_MSG(ippGetStatusString(ret));
wolfSSL 13:f67a6c6013ca 113 WOLFSSL_MSG("Using default fast IPP library");
wolfSSL 13:f67a6c6013ca 114 ret = 0;
wolfSSL 13:f67a6c6013ca 115 (void)ret; /* suppress not read warning */
wolfSSL 13:f67a6c6013ca 116 }
wolfSSL 13:f67a6c6013ca 117 #endif
wolfSSL 13:f67a6c6013ca 118
wolfSSL 13:f67a6c6013ca 119 #if defined(FREESCALE_LTC_TFM) || defined(FREESCALE_LTC_ECC)
wolfSSL 13:f67a6c6013ca 120 ret = ksdk_port_init();
wolfSSL 13:f67a6c6013ca 121 if (ret != 0) {
wolfSSL 13:f67a6c6013ca 122 WOLFSSL_MSG("KSDK port init failed");
wolfSSL 13:f67a6c6013ca 123 return ret;
wolfSSL 13:f67a6c6013ca 124 }
wolfSSL 13:f67a6c6013ca 125 #endif
wolfSSL 13:f67a6c6013ca 126
wolfSSL 13:f67a6c6013ca 127 #ifdef WOLFSSL_ATMEL
wolfSSL 13:f67a6c6013ca 128 atmel_init();
wolfSSL 13:f67a6c6013ca 129 #endif
wolfSSL 13:f67a6c6013ca 130
wolfSSL 13:f67a6c6013ca 131 #ifdef WOLFSSL_ARMASM
wolfSSL 13:f67a6c6013ca 132 WOLFSSL_MSG("Using ARM hardware acceleration");
wolfSSL 13:f67a6c6013ca 133 #endif
wolfSSL 13:f67a6c6013ca 134
wolfSSL 13:f67a6c6013ca 135 #if !defined(WOLFCRYPT_ONLY) && \
wolfSSL 13:f67a6c6013ca 136 ( defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) )
wolfSSL 13:f67a6c6013ca 137 wolfSSL_EVP_init();
wolfSSL 13:f67a6c6013ca 138 #endif
wolfSSL 13:f67a6c6013ca 139
wolfSSL 13:f67a6c6013ca 140 #if defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE)
wolfSSL 13:f67a6c6013ca 141 if ((ret = wc_LoggingInit()) != 0) {
wolfSSL 13:f67a6c6013ca 142 WOLFSSL_MSG("Error creating logging mutex");
wolfSSL 13:f67a6c6013ca 143 return ret;
wolfSSL 13:f67a6c6013ca 144 }
wolfSSL 13:f67a6c6013ca 145 #endif
wolfSSL 13:f67a6c6013ca 146
wolfSSL 13:f67a6c6013ca 147 #ifdef HAVE_ECC
wolfSSL 13:f67a6c6013ca 148 #ifdef ECC_CACHE_CURVE
wolfSSL 13:f67a6c6013ca 149 if ((ret = wc_ecc_curve_cache_init()) != 0) {
wolfSSL 13:f67a6c6013ca 150 WOLFSSL_MSG("Error creating curve cache");
wolfSSL 13:f67a6c6013ca 151 return ret;
wolfSSL 13:f67a6c6013ca 152 }
wolfSSL 13:f67a6c6013ca 153 #endif
wolfSSL 13:f67a6c6013ca 154 #endif
wolfSSL 13:f67a6c6013ca 155
wolfSSL 13:f67a6c6013ca 156 initRefCount = 1;
wolfSSL 13:f67a6c6013ca 157 }
wolfSSL 13:f67a6c6013ca 158
wolfSSL 13:f67a6c6013ca 159 return ret;
wolfSSL 13:f67a6c6013ca 160 }
wolfSSL 13:f67a6c6013ca 161
wolfSSL 13:f67a6c6013ca 162
wolfSSL 13:f67a6c6013ca 163 /* return success value is the same as wolfCrypt_Init */
wolfSSL 13:f67a6c6013ca 164 int wolfCrypt_Cleanup(void)
wolfSSL 13:f67a6c6013ca 165 {
wolfSSL 13:f67a6c6013ca 166 int ret = 0;
wolfSSL 13:f67a6c6013ca 167
wolfSSL 13:f67a6c6013ca 168 if (initRefCount == 1) {
wolfSSL 13:f67a6c6013ca 169 WOLFSSL_ENTER("wolfCrypt_Cleanup");
wolfSSL 13:f67a6c6013ca 170
wolfSSL 13:f67a6c6013ca 171 #ifdef HAVE_ECC
wolfSSL 13:f67a6c6013ca 172 #ifdef FP_ECC
wolfSSL 13:f67a6c6013ca 173 wc_ecc_fp_free();
wolfSSL 13:f67a6c6013ca 174 #endif
wolfSSL 13:f67a6c6013ca 175 #ifdef ECC_CACHE_CURVE
wolfSSL 13:f67a6c6013ca 176 wc_ecc_curve_cache_free();
wolfSSL 13:f67a6c6013ca 177 #endif
wolfSSL 13:f67a6c6013ca 178 #endif /* HAVE_ECC */
wolfSSL 13:f67a6c6013ca 179
wolfSSL 13:f67a6c6013ca 180 #if defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE)
wolfSSL 13:f67a6c6013ca 181 ret = wc_LoggingCleanup();
wolfSSL 13:f67a6c6013ca 182 #endif
wolfSSL 13:f67a6c6013ca 183
wolfSSL 13:f67a6c6013ca 184 #if defined(WOLFSSL_TRACK_MEMORY) && !defined(WOLFSSL_STATIC_MEMORY)
wolfSSL 13:f67a6c6013ca 185 ShowMemoryTracker();
wolfSSL 13:f67a6c6013ca 186 #endif
wolfSSL 13:f67a6c6013ca 187
wolfSSL 13:f67a6c6013ca 188 #ifdef WOLFSSL_ASYNC_CRYPT
wolfSSL 13:f67a6c6013ca 189 wolfAsync_HardwareStop();
wolfSSL 13:f67a6c6013ca 190 #endif
wolfSSL 13:f67a6c6013ca 191
wolfSSL 13:f67a6c6013ca 192 initRefCount = 0; /* allow re-init */
wolfSSL 13:f67a6c6013ca 193 }
wolfSSL 13:f67a6c6013ca 194
wolfSSL 13:f67a6c6013ca 195 return ret;
wolfSSL 13:f67a6c6013ca 196 }
wolfSSL 13:f67a6c6013ca 197
wolfSSL 13:f67a6c6013ca 198 #if !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
wolfSSL 13:f67a6c6013ca 199
wolfSSL 13:f67a6c6013ca 200 /* File Handling Helpers */
wolfSSL 13:f67a6c6013ca 201 /* returns 0 if file found, -1 if no files or negative error */
wolfSSL 13:f67a6c6013ca 202 int wc_ReadDirFirst(ReadDirCtx* ctx, const char* path, char** name)
wolfSSL 13:f67a6c6013ca 203 {
wolfSSL 13:f67a6c6013ca 204 int ret = -1; /* default to no files found */
wolfSSL 13:f67a6c6013ca 205
wolfSSL 13:f67a6c6013ca 206 if (name)
wolfSSL 13:f67a6c6013ca 207 *name = NULL;
wolfSSL 13:f67a6c6013ca 208
wolfSSL 13:f67a6c6013ca 209 if (ctx == NULL || path == NULL) {
wolfSSL 13:f67a6c6013ca 210 return BAD_FUNC_ARG;
wolfSSL 13:f67a6c6013ca 211 }
wolfSSL 13:f67a6c6013ca 212
wolfSSL 13:f67a6c6013ca 213 XMEMSET(ctx->name, 0, MAX_FILENAME_SZ);
wolfSSL 13:f67a6c6013ca 214
wolfSSL 13:f67a6c6013ca 215 #ifdef USE_WINDOWS_API
wolfSSL 13:f67a6c6013ca 216 XSTRNCPY(ctx->name, path, MAX_FILENAME_SZ - 4);
wolfSSL 13:f67a6c6013ca 217 XSTRNCAT(ctx->name, "\\*", 3);
wolfSSL 13:f67a6c6013ca 218
wolfSSL 13:f67a6c6013ca 219 ctx->hFind = FindFirstFileA(ctx->name, &ctx->FindFileData);
wolfSSL 13:f67a6c6013ca 220 if (ctx->hFind == INVALID_HANDLE_VALUE) {
wolfSSL 13:f67a6c6013ca 221 WOLFSSL_MSG("FindFirstFile for path verify locations failed");
wolfSSL 13:f67a6c6013ca 222 return BAD_PATH_ERROR;
wolfSSL 13:f67a6c6013ca 223 }
wolfSSL 13:f67a6c6013ca 224
wolfSSL 13:f67a6c6013ca 225 do {
wolfSSL 13:f67a6c6013ca 226 if (ctx->FindFileData.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY) {
wolfSSL 13:f67a6c6013ca 227 XSTRNCPY(ctx->name, path, MAX_FILENAME_SZ/2 - 3);
wolfSSL 13:f67a6c6013ca 228 XSTRNCAT(ctx->name, "\\", 2);
wolfSSL 13:f67a6c6013ca 229 XSTRNCAT(ctx->name, ctx->FindFileData.cFileName, MAX_FILENAME_SZ/2);
wolfSSL 13:f67a6c6013ca 230 if (name)
wolfSSL 13:f67a6c6013ca 231 *name = ctx->name;
wolfSSL 13:f67a6c6013ca 232 return 0;
wolfSSL 13:f67a6c6013ca 233 }
wolfSSL 13:f67a6c6013ca 234 } while (FindNextFileA(ctx->hFind, &ctx->FindFileData));
wolfSSL 13:f67a6c6013ca 235 #else
wolfSSL 13:f67a6c6013ca 236 ctx->dir = opendir(path);
wolfSSL 13:f67a6c6013ca 237 if (ctx->dir == NULL) {
wolfSSL 13:f67a6c6013ca 238 WOLFSSL_MSG("opendir path verify locations failed");
wolfSSL 13:f67a6c6013ca 239 return BAD_PATH_ERROR;
wolfSSL 13:f67a6c6013ca 240 }
wolfSSL 13:f67a6c6013ca 241
wolfSSL 13:f67a6c6013ca 242 while ((ctx->entry = readdir(ctx->dir)) != NULL) {
wolfSSL 13:f67a6c6013ca 243 XSTRNCPY(ctx->name, path, MAX_FILENAME_SZ/2 - 2);
wolfSSL 13:f67a6c6013ca 244 XSTRNCAT(ctx->name, "/", 1);
wolfSSL 13:f67a6c6013ca 245 XSTRNCAT(ctx->name, ctx->entry->d_name, MAX_FILENAME_SZ/2);
wolfSSL 13:f67a6c6013ca 246
wolfSSL 13:f67a6c6013ca 247 if (stat(ctx->name, &ctx->s) != 0) {
wolfSSL 13:f67a6c6013ca 248 WOLFSSL_MSG("stat on name failed");
wolfSSL 13:f67a6c6013ca 249 ret = BAD_PATH_ERROR;
wolfSSL 13:f67a6c6013ca 250 break;
wolfSSL 13:f67a6c6013ca 251 } else if (ctx->s.st_mode & S_IFREG) {
wolfSSL 13:f67a6c6013ca 252 if (name)
wolfSSL 13:f67a6c6013ca 253 *name = ctx->name;
wolfSSL 13:f67a6c6013ca 254 return 0;
wolfSSL 13:f67a6c6013ca 255 }
wolfSSL 13:f67a6c6013ca 256 }
wolfSSL 13:f67a6c6013ca 257 #endif
wolfSSL 13:f67a6c6013ca 258 wc_ReadDirClose(ctx);
wolfSSL 13:f67a6c6013ca 259
wolfSSL 13:f67a6c6013ca 260 return ret;
wolfSSL 13:f67a6c6013ca 261 }
wolfSSL 13:f67a6c6013ca 262
wolfSSL 13:f67a6c6013ca 263 /* returns 0 if file found, -1 if no more files */
wolfSSL 13:f67a6c6013ca 264 int wc_ReadDirNext(ReadDirCtx* ctx, const char* path, char** name)
wolfSSL 13:f67a6c6013ca 265 {
wolfSSL 13:f67a6c6013ca 266 int ret = -1; /* default to no file found */
wolfSSL 13:f67a6c6013ca 267
wolfSSL 13:f67a6c6013ca 268 if (name)
wolfSSL 13:f67a6c6013ca 269 *name = NULL;
wolfSSL 13:f67a6c6013ca 270
wolfSSL 13:f67a6c6013ca 271 if (ctx == NULL || path == NULL) {
wolfSSL 13:f67a6c6013ca 272 return BAD_FUNC_ARG;
wolfSSL 13:f67a6c6013ca 273 }
wolfSSL 13:f67a6c6013ca 274
wolfSSL 13:f67a6c6013ca 275 XMEMSET(ctx->name, 0, MAX_FILENAME_SZ);
wolfSSL 13:f67a6c6013ca 276
wolfSSL 13:f67a6c6013ca 277 #ifdef USE_WINDOWS_API
wolfSSL 13:f67a6c6013ca 278 while (FindNextFileA(ctx->hFind, &ctx->FindFileData)) {
wolfSSL 13:f67a6c6013ca 279 if (ctx->FindFileData.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY) {
wolfSSL 13:f67a6c6013ca 280 XSTRNCPY(ctx->name, path, MAX_FILENAME_SZ/2 - 3);
wolfSSL 13:f67a6c6013ca 281 XSTRNCAT(ctx->name, "\\", 2);
wolfSSL 13:f67a6c6013ca 282 XSTRNCAT(ctx->name, ctx->FindFileData.cFileName, MAX_FILENAME_SZ/2);
wolfSSL 13:f67a6c6013ca 283 if (name)
wolfSSL 13:f67a6c6013ca 284 *name = ctx->name;
wolfSSL 13:f67a6c6013ca 285 return 0;
wolfSSL 13:f67a6c6013ca 286 }
wolfSSL 13:f67a6c6013ca 287 }
wolfSSL 13:f67a6c6013ca 288 #else
wolfSSL 13:f67a6c6013ca 289 while ((ctx->entry = readdir(ctx->dir)) != NULL) {
wolfSSL 13:f67a6c6013ca 290 XSTRNCPY(ctx->name, path, MAX_FILENAME_SZ/2 - 2);
wolfSSL 13:f67a6c6013ca 291 XSTRNCAT(ctx->name, "/", 1);
wolfSSL 13:f67a6c6013ca 292 XSTRNCAT(ctx->name, ctx->entry->d_name, MAX_FILENAME_SZ/2);
wolfSSL 13:f67a6c6013ca 293
wolfSSL 13:f67a6c6013ca 294 if (stat(ctx->name, &ctx->s) != 0) {
wolfSSL 13:f67a6c6013ca 295 WOLFSSL_MSG("stat on name failed");
wolfSSL 13:f67a6c6013ca 296 ret = BAD_PATH_ERROR;
wolfSSL 13:f67a6c6013ca 297 break;
wolfSSL 13:f67a6c6013ca 298 } else if (ctx->s.st_mode & S_IFREG) {
wolfSSL 13:f67a6c6013ca 299 if (name)
wolfSSL 13:f67a6c6013ca 300 *name = ctx->name;
wolfSSL 13:f67a6c6013ca 301 return 0;
wolfSSL 13:f67a6c6013ca 302 }
wolfSSL 13:f67a6c6013ca 303 }
wolfSSL 13:f67a6c6013ca 304 #endif
wolfSSL 13:f67a6c6013ca 305
wolfSSL 13:f67a6c6013ca 306 wc_ReadDirClose(ctx);
wolfSSL 13:f67a6c6013ca 307
wolfSSL 13:f67a6c6013ca 308 return ret;
wolfSSL 13:f67a6c6013ca 309 }
wolfSSL 13:f67a6c6013ca 310
wolfSSL 13:f67a6c6013ca 311 void wc_ReadDirClose(ReadDirCtx* ctx)
wolfSSL 13:f67a6c6013ca 312 {
wolfSSL 13:f67a6c6013ca 313 if (ctx == NULL) {
wolfSSL 13:f67a6c6013ca 314 return;
wolfSSL 13:f67a6c6013ca 315 }
wolfSSL 13:f67a6c6013ca 316
wolfSSL 13:f67a6c6013ca 317 #ifdef USE_WINDOWS_API
wolfSSL 13:f67a6c6013ca 318 if (ctx->hFind != INVALID_HANDLE_VALUE) {
wolfSSL 13:f67a6c6013ca 319 FindClose(ctx->hFind);
wolfSSL 13:f67a6c6013ca 320 ctx->hFind = INVALID_HANDLE_VALUE;
wolfSSL 13:f67a6c6013ca 321 }
wolfSSL 13:f67a6c6013ca 322 #else
wolfSSL 13:f67a6c6013ca 323 if (ctx->dir) {
wolfSSL 13:f67a6c6013ca 324 closedir(ctx->dir);
wolfSSL 13:f67a6c6013ca 325 ctx->dir = NULL;
wolfSSL 13:f67a6c6013ca 326 }
wolfSSL 13:f67a6c6013ca 327 #endif
wolfSSL 13:f67a6c6013ca 328 }
wolfSSL 13:f67a6c6013ca 329
wolfSSL 13:f67a6c6013ca 330 #endif /* !NO_FILESYSTEM && !NO_WOLFSSL_DIR */
wolfSSL 13:f67a6c6013ca 331
wolfSSL 13:f67a6c6013ca 332
wolfSSL 13:f67a6c6013ca 333 wolfSSL_Mutex* wc_InitAndAllocMutex(void)
wolfSSL 13:f67a6c6013ca 334 {
wolfSSL 13:f67a6c6013ca 335 wolfSSL_Mutex* m = (wolfSSL_Mutex*) XMALLOC(sizeof(wolfSSL_Mutex), NULL,
wolfSSL 13:f67a6c6013ca 336 DYNAMIC_TYPE_MUTEX);
wolfSSL 13:f67a6c6013ca 337 if (m != NULL) {
wolfSSL 13:f67a6c6013ca 338 if (wc_InitMutex(m) != 0) {
wolfSSL 13:f67a6c6013ca 339 WOLFSSL_MSG("Init Mutex failed");
wolfSSL 13:f67a6c6013ca 340 XFREE(m, NULL, DYNAMIC_TYPE_MUTEX);
wolfSSL 13:f67a6c6013ca 341 m = NULL;
wolfSSL 13:f67a6c6013ca 342 }
wolfSSL 13:f67a6c6013ca 343 }
wolfSSL 13:f67a6c6013ca 344 else {
wolfSSL 13:f67a6c6013ca 345 WOLFSSL_MSG("Memory error with Mutex allocation");
wolfSSL 13:f67a6c6013ca 346 }
wolfSSL 13:f67a6c6013ca 347
wolfSSL 13:f67a6c6013ca 348 return m;
wolfSSL 13:f67a6c6013ca 349 }
wolfSSL 13:f67a6c6013ca 350
wolfSSL 13:f67a6c6013ca 351
wolfSSL 13:f67a6c6013ca 352 #if WOLFSSL_CRYPT_HW_MUTEX
wolfSSL 13:f67a6c6013ca 353 /* Mutex for protection of cryptography hardware */
wolfSSL 13:f67a6c6013ca 354 static wolfSSL_Mutex wcCryptHwMutex;
wolfSSL 13:f67a6c6013ca 355 static int wcCryptHwMutexInit = 0;
wolfSSL 13:f67a6c6013ca 356
wolfSSL 13:f67a6c6013ca 357 int wolfSSL_CryptHwMutexInit(void) {
wolfSSL 13:f67a6c6013ca 358 int ret = 0;
wolfSSL 13:f67a6c6013ca 359 if(wcCryptHwMutexInit == 0) {
wolfSSL 13:f67a6c6013ca 360 ret = wc_InitMutex(&wcCryptHwMutex);
wolfSSL 13:f67a6c6013ca 361 if(ret == 0) {
wolfSSL 13:f67a6c6013ca 362 wcCryptHwMutexInit = 1;
wolfSSL 13:f67a6c6013ca 363 }
wolfSSL 13:f67a6c6013ca 364 }
wolfSSL 13:f67a6c6013ca 365 return ret;
wolfSSL 13:f67a6c6013ca 366 }
wolfSSL 13:f67a6c6013ca 367
wolfSSL 13:f67a6c6013ca 368 int wolfSSL_CryptHwMutexLock(void) {
wolfSSL 13:f67a6c6013ca 369 int ret = BAD_MUTEX_E;
wolfSSL 13:f67a6c6013ca 370
wolfSSL 13:f67a6c6013ca 371 /* Make sure HW Mutex has been initialized */
wolfSSL 13:f67a6c6013ca 372 wolfSSL_CryptHwMutexInit();
wolfSSL 13:f67a6c6013ca 373
wolfSSL 13:f67a6c6013ca 374 if(wcCryptHwMutexInit) {
wolfSSL 13:f67a6c6013ca 375 ret = wc_LockMutex(&wcCryptHwMutex);
wolfSSL 13:f67a6c6013ca 376 }
wolfSSL 13:f67a6c6013ca 377 return ret;
wolfSSL 13:f67a6c6013ca 378 }
wolfSSL 13:f67a6c6013ca 379
wolfSSL 13:f67a6c6013ca 380 int wolfSSL_CryptHwMutexUnLock(void) {
wolfSSL 13:f67a6c6013ca 381 int ret = BAD_MUTEX_E;
wolfSSL 13:f67a6c6013ca 382
wolfSSL 13:f67a6c6013ca 383 if(wcCryptHwMutexInit) {
wolfSSL 13:f67a6c6013ca 384 ret = wc_UnLockMutex(&wcCryptHwMutex);
wolfSSL 13:f67a6c6013ca 385 }
wolfSSL 13:f67a6c6013ca 386 return ret;
wolfSSL 13:f67a6c6013ca 387 }
wolfSSL 13:f67a6c6013ca 388 #endif /* WOLFSSL_CRYPT_HW_MUTEX */
wolfSSL 13:f67a6c6013ca 389
wolfSSL 13:f67a6c6013ca 390
wolfSSL 13:f67a6c6013ca 391 /* ---------------------------------------------------------------------------*/
wolfSSL 13:f67a6c6013ca 392 /* Mutex Ports */
wolfSSL 13:f67a6c6013ca 393 /* ---------------------------------------------------------------------------*/
wolfSSL 13:f67a6c6013ca 394 #ifdef SINGLE_THREADED
wolfSSL 13:f67a6c6013ca 395
wolfSSL 13:f67a6c6013ca 396 int wc_InitMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 397 {
wolfSSL 13:f67a6c6013ca 398 (void)m;
wolfSSL 13:f67a6c6013ca 399 return 0;
wolfSSL 13:f67a6c6013ca 400 }
wolfSSL 13:f67a6c6013ca 401
wolfSSL 13:f67a6c6013ca 402 int wc_FreeMutex(wolfSSL_Mutex *m)
wolfSSL 13:f67a6c6013ca 403 {
wolfSSL 13:f67a6c6013ca 404 (void)m;
wolfSSL 13:f67a6c6013ca 405 return 0;
wolfSSL 13:f67a6c6013ca 406 }
wolfSSL 13:f67a6c6013ca 407
wolfSSL 13:f67a6c6013ca 408
wolfSSL 13:f67a6c6013ca 409 int wc_LockMutex(wolfSSL_Mutex *m)
wolfSSL 13:f67a6c6013ca 410 {
wolfSSL 13:f67a6c6013ca 411 (void)m;
wolfSSL 13:f67a6c6013ca 412 return 0;
wolfSSL 13:f67a6c6013ca 413 }
wolfSSL 13:f67a6c6013ca 414
wolfSSL 13:f67a6c6013ca 415
wolfSSL 13:f67a6c6013ca 416 int wc_UnLockMutex(wolfSSL_Mutex *m)
wolfSSL 13:f67a6c6013ca 417 {
wolfSSL 13:f67a6c6013ca 418 (void)m;
wolfSSL 13:f67a6c6013ca 419 return 0;
wolfSSL 13:f67a6c6013ca 420 }
wolfSSL 13:f67a6c6013ca 421
wolfSSL 13:f67a6c6013ca 422 #elif defined(FREERTOS) || defined(FREERTOS_TCP) || \
wolfSSL 13:f67a6c6013ca 423 defined(FREESCALE_FREE_RTOS)
wolfSSL 13:f67a6c6013ca 424
wolfSSL 13:f67a6c6013ca 425 int wc_InitMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 426 {
wolfSSL 13:f67a6c6013ca 427 int iReturn;
wolfSSL 13:f67a6c6013ca 428
wolfSSL 13:f67a6c6013ca 429 *m = ( wolfSSL_Mutex ) xSemaphoreCreateMutex();
wolfSSL 13:f67a6c6013ca 430 if( *m != NULL )
wolfSSL 13:f67a6c6013ca 431 iReturn = 0;
wolfSSL 13:f67a6c6013ca 432 else
wolfSSL 13:f67a6c6013ca 433 iReturn = BAD_MUTEX_E;
wolfSSL 13:f67a6c6013ca 434
wolfSSL 13:f67a6c6013ca 435 return iReturn;
wolfSSL 13:f67a6c6013ca 436 }
wolfSSL 13:f67a6c6013ca 437
wolfSSL 13:f67a6c6013ca 438 int wc_FreeMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 439 {
wolfSSL 13:f67a6c6013ca 440 vSemaphoreDelete( *m );
wolfSSL 13:f67a6c6013ca 441 return 0;
wolfSSL 13:f67a6c6013ca 442 }
wolfSSL 13:f67a6c6013ca 443
wolfSSL 13:f67a6c6013ca 444 int wc_LockMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 445 {
wolfSSL 13:f67a6c6013ca 446 /* Assume an infinite block, or should there be zero block? */
wolfSSL 13:f67a6c6013ca 447 xSemaphoreTake( *m, portMAX_DELAY );
wolfSSL 13:f67a6c6013ca 448 return 0;
wolfSSL 13:f67a6c6013ca 449 }
wolfSSL 13:f67a6c6013ca 450
wolfSSL 13:f67a6c6013ca 451 int wc_UnLockMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 452 {
wolfSSL 13:f67a6c6013ca 453 xSemaphoreGive( *m );
wolfSSL 13:f67a6c6013ca 454 return 0;
wolfSSL 13:f67a6c6013ca 455 }
wolfSSL 13:f67a6c6013ca 456
wolfSSL 13:f67a6c6013ca 457 #elif defined(WOLFSSL_SAFERTOS)
wolfSSL 13:f67a6c6013ca 458
wolfSSL 13:f67a6c6013ca 459 int wc_InitMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 460 {
wolfSSL 13:f67a6c6013ca 461 vSemaphoreCreateBinary(m->mutexBuffer, m->mutex);
wolfSSL 13:f67a6c6013ca 462 if (m->mutex == NULL)
wolfSSL 13:f67a6c6013ca 463 return BAD_MUTEX_E;
wolfSSL 13:f67a6c6013ca 464
wolfSSL 13:f67a6c6013ca 465 return 0;
wolfSSL 13:f67a6c6013ca 466 }
wolfSSL 13:f67a6c6013ca 467
wolfSSL 13:f67a6c6013ca 468 int wc_FreeMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 469 {
wolfSSL 13:f67a6c6013ca 470 (void)m;
wolfSSL 13:f67a6c6013ca 471 return 0;
wolfSSL 13:f67a6c6013ca 472 }
wolfSSL 13:f67a6c6013ca 473
wolfSSL 13:f67a6c6013ca 474 int wc_LockMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 475 {
wolfSSL 13:f67a6c6013ca 476 /* Assume an infinite block */
wolfSSL 13:f67a6c6013ca 477 xSemaphoreTake(m->mutex, portMAX_DELAY);
wolfSSL 13:f67a6c6013ca 478 return 0;
wolfSSL 13:f67a6c6013ca 479 }
wolfSSL 13:f67a6c6013ca 480
wolfSSL 13:f67a6c6013ca 481 int wc_UnLockMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 482 {
wolfSSL 13:f67a6c6013ca 483 xSemaphoreGive(m->mutex);
wolfSSL 13:f67a6c6013ca 484 return 0;
wolfSSL 13:f67a6c6013ca 485 }
wolfSSL 13:f67a6c6013ca 486
wolfSSL 13:f67a6c6013ca 487 #elif defined(USE_WINDOWS_API)
wolfSSL 13:f67a6c6013ca 488
wolfSSL 13:f67a6c6013ca 489 int wc_InitMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 490 {
wolfSSL 13:f67a6c6013ca 491 InitializeCriticalSection(m);
wolfSSL 13:f67a6c6013ca 492 return 0;
wolfSSL 13:f67a6c6013ca 493 }
wolfSSL 13:f67a6c6013ca 494
wolfSSL 13:f67a6c6013ca 495
wolfSSL 13:f67a6c6013ca 496 int wc_FreeMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 497 {
wolfSSL 13:f67a6c6013ca 498 DeleteCriticalSection(m);
wolfSSL 13:f67a6c6013ca 499 return 0;
wolfSSL 13:f67a6c6013ca 500 }
wolfSSL 13:f67a6c6013ca 501
wolfSSL 13:f67a6c6013ca 502
wolfSSL 13:f67a6c6013ca 503 int wc_LockMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 504 {
wolfSSL 13:f67a6c6013ca 505 EnterCriticalSection(m);
wolfSSL 13:f67a6c6013ca 506 return 0;
wolfSSL 13:f67a6c6013ca 507 }
wolfSSL 13:f67a6c6013ca 508
wolfSSL 13:f67a6c6013ca 509
wolfSSL 13:f67a6c6013ca 510 int wc_UnLockMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 511 {
wolfSSL 13:f67a6c6013ca 512 LeaveCriticalSection(m);
wolfSSL 13:f67a6c6013ca 513 return 0;
wolfSSL 13:f67a6c6013ca 514 }
wolfSSL 13:f67a6c6013ca 515
wolfSSL 13:f67a6c6013ca 516 #elif defined(WOLFSSL_PTHREADS)
wolfSSL 13:f67a6c6013ca 517
wolfSSL 13:f67a6c6013ca 518 int wc_InitMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 519 {
wolfSSL 13:f67a6c6013ca 520 if (pthread_mutex_init(m, 0) == 0)
wolfSSL 13:f67a6c6013ca 521 return 0;
wolfSSL 13:f67a6c6013ca 522 else
wolfSSL 13:f67a6c6013ca 523 return BAD_MUTEX_E;
wolfSSL 13:f67a6c6013ca 524 }
wolfSSL 13:f67a6c6013ca 525
wolfSSL 13:f67a6c6013ca 526
wolfSSL 13:f67a6c6013ca 527 int wc_FreeMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 528 {
wolfSSL 13:f67a6c6013ca 529 if (pthread_mutex_destroy(m) == 0)
wolfSSL 13:f67a6c6013ca 530 return 0;
wolfSSL 13:f67a6c6013ca 531 else
wolfSSL 13:f67a6c6013ca 532 return BAD_MUTEX_E;
wolfSSL 13:f67a6c6013ca 533 }
wolfSSL 13:f67a6c6013ca 534
wolfSSL 13:f67a6c6013ca 535
wolfSSL 13:f67a6c6013ca 536 int wc_LockMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 537 {
wolfSSL 13:f67a6c6013ca 538 if (pthread_mutex_lock(m) == 0)
wolfSSL 13:f67a6c6013ca 539 return 0;
wolfSSL 13:f67a6c6013ca 540 else
wolfSSL 13:f67a6c6013ca 541 return BAD_MUTEX_E;
wolfSSL 13:f67a6c6013ca 542 }
wolfSSL 13:f67a6c6013ca 543
wolfSSL 13:f67a6c6013ca 544
wolfSSL 13:f67a6c6013ca 545 int wc_UnLockMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 546 {
wolfSSL 13:f67a6c6013ca 547 if (pthread_mutex_unlock(m) == 0)
wolfSSL 13:f67a6c6013ca 548 return 0;
wolfSSL 13:f67a6c6013ca 549 else
wolfSSL 13:f67a6c6013ca 550 return BAD_MUTEX_E;
wolfSSL 13:f67a6c6013ca 551 }
wolfSSL 13:f67a6c6013ca 552
wolfSSL 13:f67a6c6013ca 553 #elif defined(THREADX)
wolfSSL 13:f67a6c6013ca 554
wolfSSL 13:f67a6c6013ca 555 int wc_InitMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 556 {
wolfSSL 13:f67a6c6013ca 557 if (tx_mutex_create(m, "wolfSSL Mutex", TX_NO_INHERIT) == 0)
wolfSSL 13:f67a6c6013ca 558 return 0;
wolfSSL 13:f67a6c6013ca 559 else
wolfSSL 13:f67a6c6013ca 560 return BAD_MUTEX_E;
wolfSSL 13:f67a6c6013ca 561 }
wolfSSL 13:f67a6c6013ca 562
wolfSSL 13:f67a6c6013ca 563
wolfSSL 13:f67a6c6013ca 564 int wc_FreeMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 565 {
wolfSSL 13:f67a6c6013ca 566 if (tx_mutex_delete(m) == 0)
wolfSSL 13:f67a6c6013ca 567 return 0;
wolfSSL 13:f67a6c6013ca 568 else
wolfSSL 13:f67a6c6013ca 569 return BAD_MUTEX_E;
wolfSSL 13:f67a6c6013ca 570 }
wolfSSL 13:f67a6c6013ca 571
wolfSSL 13:f67a6c6013ca 572
wolfSSL 13:f67a6c6013ca 573 int wc_LockMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 574 {
wolfSSL 13:f67a6c6013ca 575 if (tx_mutex_get(m, TX_WAIT_FOREVER) == 0)
wolfSSL 13:f67a6c6013ca 576 return 0;
wolfSSL 13:f67a6c6013ca 577 else
wolfSSL 13:f67a6c6013ca 578 return BAD_MUTEX_E;
wolfSSL 13:f67a6c6013ca 579 }
wolfSSL 13:f67a6c6013ca 580
wolfSSL 13:f67a6c6013ca 581 int wc_UnLockMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 582 {
wolfSSL 13:f67a6c6013ca 583 if (tx_mutex_put(m) == 0)
wolfSSL 13:f67a6c6013ca 584 return 0;
wolfSSL 13:f67a6c6013ca 585 else
wolfSSL 13:f67a6c6013ca 586 return BAD_MUTEX_E;
wolfSSL 13:f67a6c6013ca 587 }
wolfSSL 13:f67a6c6013ca 588
wolfSSL 13:f67a6c6013ca 589 #elif defined(MICRIUM)
wolfSSL 13:f67a6c6013ca 590
wolfSSL 13:f67a6c6013ca 591 int wc_InitMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 592 {
wolfSSL 13:f67a6c6013ca 593 #if (NET_SECURE_MGR_CFG_EN == DEF_ENABLED)
wolfSSL 13:f67a6c6013ca 594 if (NetSecure_OS_MutexCreate(m) == 0)
wolfSSL 13:f67a6c6013ca 595 return 0;
wolfSSL 13:f67a6c6013ca 596 else
wolfSSL 13:f67a6c6013ca 597 return BAD_MUTEX_E;
wolfSSL 13:f67a6c6013ca 598 #else
wolfSSL 13:f67a6c6013ca 599 return 0;
wolfSSL 13:f67a6c6013ca 600 #endif
wolfSSL 13:f67a6c6013ca 601 }
wolfSSL 13:f67a6c6013ca 602
wolfSSL 13:f67a6c6013ca 603 int wc_FreeMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 604 {
wolfSSL 13:f67a6c6013ca 605 #if (NET_SECURE_MGR_CFG_EN == DEF_ENABLED)
wolfSSL 13:f67a6c6013ca 606 if (NetSecure_OS_wc_FreeMutex(m) == 0)
wolfSSL 13:f67a6c6013ca 607 return 0;
wolfSSL 13:f67a6c6013ca 608 else
wolfSSL 13:f67a6c6013ca 609 return BAD_MUTEX_E;
wolfSSL 13:f67a6c6013ca 610 #else
wolfSSL 13:f67a6c6013ca 611 return 0;
wolfSSL 13:f67a6c6013ca 612 #endif
wolfSSL 13:f67a6c6013ca 613 }
wolfSSL 13:f67a6c6013ca 614
wolfSSL 13:f67a6c6013ca 615 int wc_LockMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 616 {
wolfSSL 13:f67a6c6013ca 617 #if (NET_SECURE_MGR_CFG_EN == DEF_ENABLED)
wolfSSL 13:f67a6c6013ca 618 if (NetSecure_OS_wc_LockMutex(m) == 0)
wolfSSL 13:f67a6c6013ca 619 return 0;
wolfSSL 13:f67a6c6013ca 620 else
wolfSSL 13:f67a6c6013ca 621 return BAD_MUTEX_E;
wolfSSL 13:f67a6c6013ca 622 #else
wolfSSL 13:f67a6c6013ca 623 return 0;
wolfSSL 13:f67a6c6013ca 624 #endif
wolfSSL 13:f67a6c6013ca 625 }
wolfSSL 13:f67a6c6013ca 626
wolfSSL 13:f67a6c6013ca 627 int wc_UnLockMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 628 {
wolfSSL 13:f67a6c6013ca 629 #if (NET_SECURE_MGR_CFG_EN == DEF_ENABLED)
wolfSSL 13:f67a6c6013ca 630 if (NetSecure_OS_wc_UnLockMutex(m) == 0)
wolfSSL 13:f67a6c6013ca 631 return 0;
wolfSSL 13:f67a6c6013ca 632 else
wolfSSL 13:f67a6c6013ca 633 return BAD_MUTEX_E;
wolfSSL 13:f67a6c6013ca 634 #else
wolfSSL 13:f67a6c6013ca 635 return 0;
wolfSSL 13:f67a6c6013ca 636 #endif
wolfSSL 13:f67a6c6013ca 637
wolfSSL 13:f67a6c6013ca 638 }
wolfSSL 13:f67a6c6013ca 639
wolfSSL 13:f67a6c6013ca 640 #elif defined(EBSNET)
wolfSSL 13:f67a6c6013ca 641
wolfSSL 13:f67a6c6013ca 642 int wc_InitMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 643 {
wolfSSL 13:f67a6c6013ca 644 if (rtp_sig_mutex_alloc(m, "wolfSSL Mutex") == -1)
wolfSSL 13:f67a6c6013ca 645 return BAD_MUTEX_E;
wolfSSL 13:f67a6c6013ca 646 else
wolfSSL 13:f67a6c6013ca 647 return 0;
wolfSSL 13:f67a6c6013ca 648 }
wolfSSL 13:f67a6c6013ca 649
wolfSSL 13:f67a6c6013ca 650 int wc_FreeMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 651 {
wolfSSL 13:f67a6c6013ca 652 rtp_sig_mutex_free(*m);
wolfSSL 13:f67a6c6013ca 653 return 0;
wolfSSL 13:f67a6c6013ca 654 }
wolfSSL 13:f67a6c6013ca 655
wolfSSL 13:f67a6c6013ca 656 int wc_LockMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 657 {
wolfSSL 13:f67a6c6013ca 658 if (rtp_sig_mutex_claim_timed(*m, RTIP_INF) == 0)
wolfSSL 13:f67a6c6013ca 659 return 0;
wolfSSL 13:f67a6c6013ca 660 else
wolfSSL 13:f67a6c6013ca 661 return BAD_MUTEX_E;
wolfSSL 13:f67a6c6013ca 662 }
wolfSSL 13:f67a6c6013ca 663
wolfSSL 13:f67a6c6013ca 664 int wc_UnLockMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 665 {
wolfSSL 13:f67a6c6013ca 666 rtp_sig_mutex_release(*m);
wolfSSL 13:f67a6c6013ca 667 return 0;
wolfSSL 13:f67a6c6013ca 668 }
wolfSSL 13:f67a6c6013ca 669
wolfSSL 13:f67a6c6013ca 670 #elif defined(FREESCALE_MQX) || defined(FREESCALE_KSDK_MQX)
wolfSSL 13:f67a6c6013ca 671
wolfSSL 13:f67a6c6013ca 672 int wc_InitMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 673 {
wolfSSL 13:f67a6c6013ca 674 if (_mutex_init(m, NULL) == MQX_EOK)
wolfSSL 13:f67a6c6013ca 675 return 0;
wolfSSL 13:f67a6c6013ca 676 else
wolfSSL 13:f67a6c6013ca 677 return BAD_MUTEX_E;
wolfSSL 13:f67a6c6013ca 678 }
wolfSSL 13:f67a6c6013ca 679
wolfSSL 13:f67a6c6013ca 680 int wc_FreeMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 681 {
wolfSSL 13:f67a6c6013ca 682 if (_mutex_destroy(m) == MQX_EOK)
wolfSSL 13:f67a6c6013ca 683 return 0;
wolfSSL 13:f67a6c6013ca 684 else
wolfSSL 13:f67a6c6013ca 685 return BAD_MUTEX_E;
wolfSSL 13:f67a6c6013ca 686 }
wolfSSL 13:f67a6c6013ca 687
wolfSSL 13:f67a6c6013ca 688 int wc_LockMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 689 {
wolfSSL 13:f67a6c6013ca 690 if (_mutex_lock(m) == MQX_EOK)
wolfSSL 13:f67a6c6013ca 691 return 0;
wolfSSL 13:f67a6c6013ca 692 else
wolfSSL 13:f67a6c6013ca 693 return BAD_MUTEX_E;
wolfSSL 13:f67a6c6013ca 694 }
wolfSSL 13:f67a6c6013ca 695
wolfSSL 13:f67a6c6013ca 696 int wc_UnLockMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 697 {
wolfSSL 13:f67a6c6013ca 698 if (_mutex_unlock(m) == MQX_EOK)
wolfSSL 13:f67a6c6013ca 699 return 0;
wolfSSL 13:f67a6c6013ca 700 else
wolfSSL 13:f67a6c6013ca 701 return BAD_MUTEX_E;
wolfSSL 13:f67a6c6013ca 702 }
wolfSSL 13:f67a6c6013ca 703
wolfSSL 13:f67a6c6013ca 704 #elif defined(WOLFSSL_TIRTOS)
wolfSSL 13:f67a6c6013ca 705 #include <xdc/runtime/Error.h>
wolfSSL 13:f67a6c6013ca 706
wolfSSL 13:f67a6c6013ca 707 int wc_InitMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 708 {
wolfSSL 13:f67a6c6013ca 709 Semaphore_Params params;
wolfSSL 13:f67a6c6013ca 710 Error_Block eb;
wolfSSL 13:f67a6c6013ca 711
wolfSSL 13:f67a6c6013ca 712 Error_init(&eb);
wolfSSL 13:f67a6c6013ca 713 Semaphore_Params_init(&params);
wolfSSL 13:f67a6c6013ca 714 params.mode = Semaphore_Mode_BINARY;
wolfSSL 13:f67a6c6013ca 715
wolfSSL 13:f67a6c6013ca 716 *m = Semaphore_create(1, &params, &eb);
wolfSSL 13:f67a6c6013ca 717 if (Error_check(&eb)) {
wolfSSL 13:f67a6c6013ca 718 Error_raise(&eb, Error_E_generic, "Failed to Create the semaphore.",
wolfSSL 13:f67a6c6013ca 719 NULL);
wolfSSL 13:f67a6c6013ca 720 return BAD_MUTEX_E;
wolfSSL 13:f67a6c6013ca 721 }
wolfSSL 13:f67a6c6013ca 722 else
wolfSSL 13:f67a6c6013ca 723 return 0;
wolfSSL 13:f67a6c6013ca 724 }
wolfSSL 13:f67a6c6013ca 725
wolfSSL 13:f67a6c6013ca 726 int wc_FreeMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 727 {
wolfSSL 13:f67a6c6013ca 728 Semaphore_delete(m);
wolfSSL 13:f67a6c6013ca 729
wolfSSL 13:f67a6c6013ca 730 return 0;
wolfSSL 13:f67a6c6013ca 731 }
wolfSSL 13:f67a6c6013ca 732
wolfSSL 13:f67a6c6013ca 733 int wc_LockMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 734 {
wolfSSL 13:f67a6c6013ca 735 Semaphore_pend(*m, BIOS_WAIT_FOREVER);
wolfSSL 13:f67a6c6013ca 736
wolfSSL 13:f67a6c6013ca 737 return 0;
wolfSSL 13:f67a6c6013ca 738 }
wolfSSL 13:f67a6c6013ca 739
wolfSSL 13:f67a6c6013ca 740 int wc_UnLockMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 741 {
wolfSSL 13:f67a6c6013ca 742 Semaphore_post(*m);
wolfSSL 13:f67a6c6013ca 743
wolfSSL 13:f67a6c6013ca 744 return 0;
wolfSSL 13:f67a6c6013ca 745 }
wolfSSL 13:f67a6c6013ca 746
wolfSSL 13:f67a6c6013ca 747 #elif defined(WOLFSSL_uITRON4)
wolfSSL 13:f67a6c6013ca 748
wolfSSL 13:f67a6c6013ca 749 int wc_InitMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 750 {
wolfSSL 13:f67a6c6013ca 751 int iReturn;
wolfSSL 13:f67a6c6013ca 752 m->sem.sematr = TA_TFIFO;
wolfSSL 13:f67a6c6013ca 753 m->sem.isemcnt = 1;
wolfSSL 13:f67a6c6013ca 754 m->sem.maxsem = 1;
wolfSSL 13:f67a6c6013ca 755 m->sem.name = NULL;
wolfSSL 13:f67a6c6013ca 756
wolfSSL 13:f67a6c6013ca 757 m->id = acre_sem(&m->sem);
wolfSSL 13:f67a6c6013ca 758 if( m->id != E_OK )
wolfSSL 13:f67a6c6013ca 759 iReturn = 0;
wolfSSL 13:f67a6c6013ca 760 else
wolfSSL 13:f67a6c6013ca 761 iReturn = BAD_MUTEX_E;
wolfSSL 13:f67a6c6013ca 762
wolfSSL 13:f67a6c6013ca 763 return iReturn;
wolfSSL 13:f67a6c6013ca 764 }
wolfSSL 13:f67a6c6013ca 765
wolfSSL 13:f67a6c6013ca 766 int wc_FreeMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 767 {
wolfSSL 13:f67a6c6013ca 768 del_sem( m->id );
wolfSSL 13:f67a6c6013ca 769 return 0;
wolfSSL 13:f67a6c6013ca 770 }
wolfSSL 13:f67a6c6013ca 771
wolfSSL 13:f67a6c6013ca 772 int wc_LockMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 773 {
wolfSSL 13:f67a6c6013ca 774 wai_sem(m->id);
wolfSSL 13:f67a6c6013ca 775 return 0;
wolfSSL 13:f67a6c6013ca 776 }
wolfSSL 13:f67a6c6013ca 777
wolfSSL 13:f67a6c6013ca 778 int wc_UnLockMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 779 {
wolfSSL 13:f67a6c6013ca 780 sig_sem(m->id);
wolfSSL 13:f67a6c6013ca 781 return 0;
wolfSSL 13:f67a6c6013ca 782 }
wolfSSL 13:f67a6c6013ca 783
wolfSSL 13:f67a6c6013ca 784 /**** uITRON malloc/free ***/
wolfSSL 13:f67a6c6013ca 785 static ID ID_wolfssl_MPOOL = 0;
wolfSSL 13:f67a6c6013ca 786 static T_CMPL wolfssl_MPOOL = {TA_TFIFO, 0, NULL, "wolfSSL_MPOOL"};
wolfSSL 13:f67a6c6013ca 787
wolfSSL 13:f67a6c6013ca 788 int uITRON4_minit(size_t poolsz) {
wolfSSL 13:f67a6c6013ca 789 ER ercd;
wolfSSL 13:f67a6c6013ca 790 wolfssl_MPOOL.mplsz = poolsz;
wolfSSL 13:f67a6c6013ca 791 ercd = acre_mpl(&wolfssl_MPOOL);
wolfSSL 13:f67a6c6013ca 792 if (ercd > 0) {
wolfSSL 13:f67a6c6013ca 793 ID_wolfssl_MPOOL = ercd;
wolfSSL 13:f67a6c6013ca 794 return 0;
wolfSSL 13:f67a6c6013ca 795 } else {
wolfSSL 13:f67a6c6013ca 796 return -1;
wolfSSL 13:f67a6c6013ca 797 }
wolfSSL 13:f67a6c6013ca 798 }
wolfSSL 13:f67a6c6013ca 799
wolfSSL 13:f67a6c6013ca 800 void *uITRON4_malloc(size_t sz) {
wolfSSL 13:f67a6c6013ca 801 ER ercd;
wolfSSL 13:f67a6c6013ca 802 void *p;
wolfSSL 13:f67a6c6013ca 803 ercd = get_mpl(ID_wolfssl_MPOOL, sz, (VP)&p);
wolfSSL 13:f67a6c6013ca 804 if (ercd == E_OK) {
wolfSSL 13:f67a6c6013ca 805 return p;
wolfSSL 13:f67a6c6013ca 806 } else {
wolfSSL 13:f67a6c6013ca 807 return 0;
wolfSSL 13:f67a6c6013ca 808 }
wolfSSL 13:f67a6c6013ca 809 }
wolfSSL 13:f67a6c6013ca 810
wolfSSL 13:f67a6c6013ca 811 void *uITRON4_realloc(void *p, size_t sz) {
wolfSSL 13:f67a6c6013ca 812 ER ercd;
wolfSSL 13:f67a6c6013ca 813 void *newp;
wolfSSL 13:f67a6c6013ca 814 if(p) {
wolfSSL 13:f67a6c6013ca 815 ercd = get_mpl(ID_wolfssl_MPOOL, sz, (VP)&newp);
wolfSSL 13:f67a6c6013ca 816 if (ercd == E_OK) {
wolfSSL 13:f67a6c6013ca 817 XMEMCPY(newp, p, sz);
wolfSSL 13:f67a6c6013ca 818 ercd = rel_mpl(ID_wolfssl_MPOOL, (VP)p);
wolfSSL 13:f67a6c6013ca 819 if (ercd == E_OK) {
wolfSSL 13:f67a6c6013ca 820 return newp;
wolfSSL 13:f67a6c6013ca 821 }
wolfSSL 13:f67a6c6013ca 822 }
wolfSSL 13:f67a6c6013ca 823 }
wolfSSL 13:f67a6c6013ca 824 return 0;
wolfSSL 13:f67a6c6013ca 825 }
wolfSSL 13:f67a6c6013ca 826
wolfSSL 13:f67a6c6013ca 827 void uITRON4_free(void *p) {
wolfSSL 13:f67a6c6013ca 828 ER ercd;
wolfSSL 13:f67a6c6013ca 829 ercd = rel_mpl(ID_wolfssl_MPOOL, (VP)p);
wolfSSL 13:f67a6c6013ca 830 if (ercd == E_OK) {
wolfSSL 13:f67a6c6013ca 831 return;
wolfSSL 13:f67a6c6013ca 832 } else {
wolfSSL 13:f67a6c6013ca 833 return;
wolfSSL 13:f67a6c6013ca 834 }
wolfSSL 13:f67a6c6013ca 835 }
wolfSSL 13:f67a6c6013ca 836
wolfSSL 13:f67a6c6013ca 837 #elif defined(WOLFSSL_uTKERNEL2)
wolfSSL 13:f67a6c6013ca 838
wolfSSL 13:f67a6c6013ca 839 int wc_InitMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 840 {
wolfSSL 13:f67a6c6013ca 841 int iReturn;
wolfSSL 13:f67a6c6013ca 842 m->sem.sematr = TA_TFIFO;
wolfSSL 13:f67a6c6013ca 843 m->sem.isemcnt = 1;
wolfSSL 13:f67a6c6013ca 844 m->sem.maxsem = 1;
wolfSSL 13:f67a6c6013ca 845
wolfSSL 13:f67a6c6013ca 846 m->id = tk_cre_sem(&m->sem);
wolfSSL 13:f67a6c6013ca 847 if( m->id != NULL )
wolfSSL 13:f67a6c6013ca 848 iReturn = 0;
wolfSSL 13:f67a6c6013ca 849 else
wolfSSL 13:f67a6c6013ca 850 iReturn = BAD_MUTEX_E;
wolfSSL 13:f67a6c6013ca 851
wolfSSL 13:f67a6c6013ca 852 return iReturn;
wolfSSL 13:f67a6c6013ca 853 }
wolfSSL 13:f67a6c6013ca 854
wolfSSL 13:f67a6c6013ca 855 int wc_FreeMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 856 {
wolfSSL 13:f67a6c6013ca 857 tk_del_sem(m->id);
wolfSSL 13:f67a6c6013ca 858 return 0;
wolfSSL 13:f67a6c6013ca 859 }
wolfSSL 13:f67a6c6013ca 860
wolfSSL 13:f67a6c6013ca 861 int wc_LockMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 862 {
wolfSSL 13:f67a6c6013ca 863 tk_wai_sem(m->id, 1, TMO_FEVR);
wolfSSL 13:f67a6c6013ca 864 return 0;
wolfSSL 13:f67a6c6013ca 865 }
wolfSSL 13:f67a6c6013ca 866
wolfSSL 13:f67a6c6013ca 867 int wc_UnLockMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 868 {
wolfSSL 13:f67a6c6013ca 869 tk_sig_sem(m->id, 1);
wolfSSL 13:f67a6c6013ca 870 return 0;
wolfSSL 13:f67a6c6013ca 871 }
wolfSSL 13:f67a6c6013ca 872
wolfSSL 13:f67a6c6013ca 873 /**** uT-Kernel malloc/free ***/
wolfSSL 13:f67a6c6013ca 874 static ID ID_wolfssl_MPOOL = 0;
wolfSSL 13:f67a6c6013ca 875 static T_CMPL wolfssl_MPOOL = {
wolfSSL 13:f67a6c6013ca 876 NULL, /* Extended information */
wolfSSL 13:f67a6c6013ca 877 TA_TFIFO, /* Memory pool attribute */
wolfSSL 13:f67a6c6013ca 878 0, /* Size of whole memory pool (byte) */
wolfSSL 13:f67a6c6013ca 879 "wolfSSL" /* Object name (max 8-char) */
wolfSSL 13:f67a6c6013ca 880 };
wolfSSL 13:f67a6c6013ca 881
wolfSSL 13:f67a6c6013ca 882 int uTKernel_init_mpool(unsigned int sz) {
wolfSSL 13:f67a6c6013ca 883 ER ercd;
wolfSSL 13:f67a6c6013ca 884 wolfssl_MPOOL.mplsz = sz;
wolfSSL 13:f67a6c6013ca 885 ercd = tk_cre_mpl(&wolfssl_MPOOL);
wolfSSL 13:f67a6c6013ca 886 if (ercd > 0) {
wolfSSL 13:f67a6c6013ca 887 ID_wolfssl_MPOOL = ercd;
wolfSSL 13:f67a6c6013ca 888 return 0;
wolfSSL 13:f67a6c6013ca 889 } else {
wolfSSL 13:f67a6c6013ca 890 return (int)ercd;
wolfSSL 13:f67a6c6013ca 891 }
wolfSSL 13:f67a6c6013ca 892 }
wolfSSL 13:f67a6c6013ca 893
wolfSSL 13:f67a6c6013ca 894 void *uTKernel_malloc(unsigned int sz) {
wolfSSL 13:f67a6c6013ca 895 ER ercd;
wolfSSL 13:f67a6c6013ca 896 void *p;
wolfSSL 13:f67a6c6013ca 897 ercd = tk_get_mpl(ID_wolfssl_MPOOL, sz, (VP)&p, TMO_FEVR);
wolfSSL 13:f67a6c6013ca 898 if (ercd == E_OK) {
wolfSSL 13:f67a6c6013ca 899 return p;
wolfSSL 13:f67a6c6013ca 900 } else {
wolfSSL 13:f67a6c6013ca 901 return 0;
wolfSSL 13:f67a6c6013ca 902 }
wolfSSL 13:f67a6c6013ca 903 }
wolfSSL 13:f67a6c6013ca 904
wolfSSL 13:f67a6c6013ca 905 void *uTKernel_realloc(void *p, unsigned int sz) {
wolfSSL 13:f67a6c6013ca 906 ER ercd;
wolfSSL 13:f67a6c6013ca 907 void *newp;
wolfSSL 13:f67a6c6013ca 908 if (p) {
wolfSSL 13:f67a6c6013ca 909 ercd = tk_get_mpl(ID_wolfssl_MPOOL, sz, (VP)&newp, TMO_FEVR);
wolfSSL 13:f67a6c6013ca 910 if (ercd == E_OK) {
wolfSSL 13:f67a6c6013ca 911 XMEMCPY(newp, p, sz);
wolfSSL 13:f67a6c6013ca 912 ercd = tk_rel_mpl(ID_wolfssl_MPOOL, (VP)p);
wolfSSL 13:f67a6c6013ca 913 if (ercd == E_OK) {
wolfSSL 13:f67a6c6013ca 914 return newp;
wolfSSL 13:f67a6c6013ca 915 }
wolfSSL 13:f67a6c6013ca 916 }
wolfSSL 13:f67a6c6013ca 917 }
wolfSSL 13:f67a6c6013ca 918 return 0;
wolfSSL 13:f67a6c6013ca 919 }
wolfSSL 13:f67a6c6013ca 920
wolfSSL 13:f67a6c6013ca 921 void uTKernel_free(void *p) {
wolfSSL 13:f67a6c6013ca 922 ER ercd;
wolfSSL 13:f67a6c6013ca 923 ercd = tk_rel_mpl(ID_wolfssl_MPOOL, (VP)p);
wolfSSL 13:f67a6c6013ca 924 if (ercd == E_OK) {
wolfSSL 13:f67a6c6013ca 925 return;
wolfSSL 13:f67a6c6013ca 926 } else {
wolfSSL 13:f67a6c6013ca 927 return;
wolfSSL 13:f67a6c6013ca 928 }
wolfSSL 13:f67a6c6013ca 929 }
wolfSSL 13:f67a6c6013ca 930
wolfSSL 13:f67a6c6013ca 931 #elif defined (WOLFSSL_FROSTED)
wolfSSL 13:f67a6c6013ca 932
wolfSSL 13:f67a6c6013ca 933 int wc_InitMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 934 {
wolfSSL 13:f67a6c6013ca 935 *m = mutex_init();
wolfSSL 13:f67a6c6013ca 936 if (*m)
wolfSSL 13:f67a6c6013ca 937 return 0;
wolfSSL 13:f67a6c6013ca 938 else
wolfSSL 13:f67a6c6013ca 939 return -1;
wolfSSL 13:f67a6c6013ca 940 }
wolfSSL 13:f67a6c6013ca 941
wolfSSL 13:f67a6c6013ca 942 int wc_FreeMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 943 {
wolfSSL 13:f67a6c6013ca 944 mutex_destroy(*m);
wolfSSL 13:f67a6c6013ca 945 return(0);
wolfSSL 13:f67a6c6013ca 946 }
wolfSSL 13:f67a6c6013ca 947
wolfSSL 13:f67a6c6013ca 948 int wc_LockMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 949 {
wolfSSL 13:f67a6c6013ca 950 mutex_lock(*m);
wolfSSL 13:f67a6c6013ca 951 return 0;
wolfSSL 13:f67a6c6013ca 952 }
wolfSSL 13:f67a6c6013ca 953
wolfSSL 13:f67a6c6013ca 954 int wc_UnLockMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 955 {
wolfSSL 13:f67a6c6013ca 956 mutex_unlock(*m);
wolfSSL 13:f67a6c6013ca 957 return 0;
wolfSSL 13:f67a6c6013ca 958 }
wolfSSL 13:f67a6c6013ca 959
wolfSSL 13:f67a6c6013ca 960 #elif defined(WOLFSSL_CMSIS_RTOS)
wolfSSL 13:f67a6c6013ca 961
wolfSSL 13:f67a6c6013ca 962 #define CMSIS_NMUTEX 10
wolfSSL 13:f67a6c6013ca 963 osMutexDef(wolfSSL_mt0); osMutexDef(wolfSSL_mt1); osMutexDef(wolfSSL_mt2);
wolfSSL 13:f67a6c6013ca 964 osMutexDef(wolfSSL_mt3); osMutexDef(wolfSSL_mt4); osMutexDef(wolfSSL_mt5);
wolfSSL 13:f67a6c6013ca 965 osMutexDef(wolfSSL_mt6); osMutexDef(wolfSSL_mt7); osMutexDef(wolfSSL_mt8);
wolfSSL 13:f67a6c6013ca 966 osMutexDef(wolfSSL_mt9);
wolfSSL 13:f67a6c6013ca 967
wolfSSL 13:f67a6c6013ca 968 static const osMutexDef_t *CMSIS_mutex[] = { osMutex(wolfSSL_mt0),
wolfSSL 13:f67a6c6013ca 969 osMutex(wolfSSL_mt1), osMutex(wolfSSL_mt2), osMutex(wolfSSL_mt3),
wolfSSL 13:f67a6c6013ca 970 osMutex(wolfSSL_mt4), osMutex(wolfSSL_mt5), osMutex(wolfSSL_mt6),
wolfSSL 13:f67a6c6013ca 971 osMutex(wolfSSL_mt7), osMutex(wolfSSL_mt8), osMutex(wolfSSL_mt9) };
wolfSSL 13:f67a6c6013ca 972
wolfSSL 13:f67a6c6013ca 973 static osMutexId CMSIS_mutexID[CMSIS_NMUTEX] = {0};
wolfSSL 13:f67a6c6013ca 974
wolfSSL 13:f67a6c6013ca 975 int wc_InitMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 976 {
wolfSSL 13:f67a6c6013ca 977 int i;
wolfSSL 13:f67a6c6013ca 978 for (i=0; i<CMSIS_NMUTEX; i++) {
wolfSSL 13:f67a6c6013ca 979 if(CMSIS_mutexID[i] == 0) {
wolfSSL 13:f67a6c6013ca 980 CMSIS_mutexID[i] = osMutexCreate(CMSIS_mutex[i]);
wolfSSL 13:f67a6c6013ca 981 (*m) = CMSIS_mutexID[i];
wolfSSL 13:f67a6c6013ca 982 return 0;
wolfSSL 13:f67a6c6013ca 983 }
wolfSSL 13:f67a6c6013ca 984 }
wolfSSL 13:f67a6c6013ca 985 return -1;
wolfSSL 13:f67a6c6013ca 986 }
wolfSSL 13:f67a6c6013ca 987
wolfSSL 13:f67a6c6013ca 988 int wc_FreeMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 989 {
wolfSSL 13:f67a6c6013ca 990 int i;
wolfSSL 13:f67a6c6013ca 991 osMutexDelete (*m);
wolfSSL 13:f67a6c6013ca 992 for (i=0; i<CMSIS_NMUTEX; i++) {
wolfSSL 13:f67a6c6013ca 993 if(CMSIS_mutexID[i] == (*m)) {
wolfSSL 13:f67a6c6013ca 994 CMSIS_mutexID[i] = 0;
wolfSSL 13:f67a6c6013ca 995 return(0);
wolfSSL 13:f67a6c6013ca 996 }
wolfSSL 13:f67a6c6013ca 997 }
wolfSSL 13:f67a6c6013ca 998 return(-1);
wolfSSL 13:f67a6c6013ca 999 }
wolfSSL 13:f67a6c6013ca 1000
wolfSSL 13:f67a6c6013ca 1001 int wc_LockMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 1002 {
wolfSSL 13:f67a6c6013ca 1003 osMutexWait(*m, osWaitForever);
wolfSSL 13:f67a6c6013ca 1004 return(0);
wolfSSL 13:f67a6c6013ca 1005 }
wolfSSL 13:f67a6c6013ca 1006
wolfSSL 13:f67a6c6013ca 1007 int wc_UnLockMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 1008 {
wolfSSL 13:f67a6c6013ca 1009 osMutexRelease (*m);
wolfSSL 13:f67a6c6013ca 1010 return 0;
wolfSSL 13:f67a6c6013ca 1011 }
wolfSSL 13:f67a6c6013ca 1012
wolfSSL 13:f67a6c6013ca 1013 #elif defined(WOLFSSL_MDK_ARM)
wolfSSL 13:f67a6c6013ca 1014
wolfSSL 13:f67a6c6013ca 1015 int wc_InitMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 1016 {
wolfSSL 13:f67a6c6013ca 1017 os_mut_init (m);
wolfSSL 13:f67a6c6013ca 1018 return 0;
wolfSSL 13:f67a6c6013ca 1019 }
wolfSSL 13:f67a6c6013ca 1020
wolfSSL 13:f67a6c6013ca 1021 int wc_FreeMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 1022 {
wolfSSL 13:f67a6c6013ca 1023 return(0);
wolfSSL 13:f67a6c6013ca 1024 }
wolfSSL 13:f67a6c6013ca 1025
wolfSSL 13:f67a6c6013ca 1026 int wc_LockMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 1027 {
wolfSSL 13:f67a6c6013ca 1028 os_mut_wait (m, 0xffff);
wolfSSL 13:f67a6c6013ca 1029 return(0);
wolfSSL 13:f67a6c6013ca 1030 }
wolfSSL 13:f67a6c6013ca 1031
wolfSSL 13:f67a6c6013ca 1032 int wc_UnLockMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 1033 {
wolfSSL 13:f67a6c6013ca 1034 os_mut_release (m);
wolfSSL 13:f67a6c6013ca 1035 return 0;
wolfSSL 13:f67a6c6013ca 1036 }
wolfSSL 13:f67a6c6013ca 1037
wolfSSL 13:f67a6c6013ca 1038 #elif defined(INTIME_RTOS)
wolfSSL 13:f67a6c6013ca 1039
wolfSSL 13:f67a6c6013ca 1040 int wc_InitMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 1041 {
wolfSSL 13:f67a6c6013ca 1042 int ret = 0;
wolfSSL 13:f67a6c6013ca 1043
wolfSSL 13:f67a6c6013ca 1044 if (m == NULL)
wolfSSL 13:f67a6c6013ca 1045 return BAD_FUNC_ARG;
wolfSSL 13:f67a6c6013ca 1046
wolfSSL 13:f67a6c6013ca 1047 *m = CreateRtSemaphore(
wolfSSL 13:f67a6c6013ca 1048 1, /* initial unit count */
wolfSSL 13:f67a6c6013ca 1049 1, /* maximum unit count */
wolfSSL 13:f67a6c6013ca 1050 PRIORITY_QUEUING /* creation flags: FIFO_QUEUING or PRIORITY_QUEUING */
wolfSSL 13:f67a6c6013ca 1051 );
wolfSSL 13:f67a6c6013ca 1052 if (*m == BAD_RTHANDLE) {
wolfSSL 13:f67a6c6013ca 1053 ret = GetLastRtError();
wolfSSL 13:f67a6c6013ca 1054 if (ret != E_OK)
wolfSSL 13:f67a6c6013ca 1055 ret = BAD_MUTEX_E;
wolfSSL 13:f67a6c6013ca 1056 }
wolfSSL 13:f67a6c6013ca 1057 return ret;
wolfSSL 13:f67a6c6013ca 1058 }
wolfSSL 13:f67a6c6013ca 1059
wolfSSL 13:f67a6c6013ca 1060 int wc_FreeMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 1061 {
wolfSSL 13:f67a6c6013ca 1062 int ret = 0;
wolfSSL 13:f67a6c6013ca 1063 BOOLEAN del;
wolfSSL 13:f67a6c6013ca 1064
wolfSSL 13:f67a6c6013ca 1065 if (m == NULL)
wolfSSL 13:f67a6c6013ca 1066 return BAD_FUNC_ARG;
wolfSSL 13:f67a6c6013ca 1067
wolfSSL 13:f67a6c6013ca 1068 del = DeleteRtSemaphore(
wolfSSL 13:f67a6c6013ca 1069 *m /* handle for RT semaphore */
wolfSSL 13:f67a6c6013ca 1070 );
wolfSSL 13:f67a6c6013ca 1071 if (del != TRUE)
wolfSSL 13:f67a6c6013ca 1072 ret = BAD_MUTEX_E;
wolfSSL 13:f67a6c6013ca 1073
wolfSSL 13:f67a6c6013ca 1074 return ret;
wolfSSL 13:f67a6c6013ca 1075 }
wolfSSL 13:f67a6c6013ca 1076
wolfSSL 13:f67a6c6013ca 1077 int wc_LockMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 1078 {
wolfSSL 13:f67a6c6013ca 1079 int ret = 0;
wolfSSL 13:f67a6c6013ca 1080 DWORD lck;
wolfSSL 13:f67a6c6013ca 1081
wolfSSL 13:f67a6c6013ca 1082 if (m == NULL)
wolfSSL 13:f67a6c6013ca 1083 return BAD_FUNC_ARG;
wolfSSL 13:f67a6c6013ca 1084
wolfSSL 13:f67a6c6013ca 1085 lck = WaitForRtSemaphore(
wolfSSL 13:f67a6c6013ca 1086 *m, /* handle for RT semaphore */
wolfSSL 13:f67a6c6013ca 1087 1, /* number of units to wait for */
wolfSSL 13:f67a6c6013ca 1088 WAIT_FOREVER /* number of milliseconds to wait for units */
wolfSSL 13:f67a6c6013ca 1089 );
wolfSSL 13:f67a6c6013ca 1090 if (lck == WAIT_FAILED) {
wolfSSL 13:f67a6c6013ca 1091 ret = GetLastRtError();
wolfSSL 13:f67a6c6013ca 1092 if (ret != E_OK)
wolfSSL 13:f67a6c6013ca 1093 ret = BAD_MUTEX_E;
wolfSSL 13:f67a6c6013ca 1094 }
wolfSSL 13:f67a6c6013ca 1095 return ret;
wolfSSL 13:f67a6c6013ca 1096 }
wolfSSL 13:f67a6c6013ca 1097
wolfSSL 13:f67a6c6013ca 1098 int wc_UnLockMutex(wolfSSL_Mutex* m)
wolfSSL 13:f67a6c6013ca 1099 {
wolfSSL 13:f67a6c6013ca 1100 int ret = 0;
wolfSSL 13:f67a6c6013ca 1101 BOOLEAN rel;
wolfSSL 13:f67a6c6013ca 1102
wolfSSL 13:f67a6c6013ca 1103 if (m == NULL)
wolfSSL 13:f67a6c6013ca 1104 return BAD_FUNC_ARG;
wolfSSL 13:f67a6c6013ca 1105
wolfSSL 13:f67a6c6013ca 1106 rel = ReleaseRtSemaphore(
wolfSSL 13:f67a6c6013ca 1107 *m, /* handle for RT semaphore */
wolfSSL 13:f67a6c6013ca 1108 1 /* number of units to release to semaphore */
wolfSSL 13:f67a6c6013ca 1109 );
wolfSSL 13:f67a6c6013ca 1110 if (rel != TRUE)
wolfSSL 13:f67a6c6013ca 1111 ret = BAD_MUTEX_E;
wolfSSL 13:f67a6c6013ca 1112
wolfSSL 13:f67a6c6013ca 1113 return ret;
wolfSSL 13:f67a6c6013ca 1114 }
wolfSSL 13:f67a6c6013ca 1115
wolfSSL 13:f67a6c6013ca 1116 #else
wolfSSL 13:f67a6c6013ca 1117 #warning No mutex handling defined
wolfSSL 13:f67a6c6013ca 1118
wolfSSL 13:f67a6c6013ca 1119 #endif
wolfSSL 13:f67a6c6013ca 1120
wolfSSL 13:f67a6c6013ca 1121
wolfSSL 13:f67a6c6013ca 1122 #if defined(WOLFSSL_TI_CRYPT) || defined(WOLFSSL_TI_HASH)
wolfSSL 13:f67a6c6013ca 1123 #include <wolfcrypt/src/port/ti/ti-ccm.c> /* initialize and Mutex for TI Crypt Engine */
wolfSSL 13:f67a6c6013ca 1124 #include <wolfcrypt/src/port/ti/ti-hash.c> /* md5, sha1, sha224, sha256 */
wolfSSL 13:f67a6c6013ca 1125 #endif
wolfSSL 13:f67a6c6013ca 1126