Xuyi Wang / wolfSSL

Dependents:   OS

Committer:
sPymbed
Date:
Tue Nov 19 14:32:16 2019 +0000
Revision:
16:048e5e270a58
Parent:
15:117db924cf7c
working ssl

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wolfSSL 15:117db924cf7c 1 /* port.c
wolfSSL 15:117db924cf7c 2 *
wolfSSL 15:117db924cf7c 3 * Copyright (C) 2006-2017 wolfSSL Inc.
wolfSSL 15:117db924cf7c 4 *
wolfSSL 15:117db924cf7c 5 * This file is part of wolfSSL.
wolfSSL 15:117db924cf7c 6 *
wolfSSL 15:117db924cf7c 7 * wolfSSL is free software; you can redistribute it and/or modify
wolfSSL 15:117db924cf7c 8 * it under the terms of the GNU General Public License as published by
wolfSSL 15:117db924cf7c 9 * the Free Software Foundation; either version 2 of the License, or
wolfSSL 15:117db924cf7c 10 * (at your option) any later version.
wolfSSL 15:117db924cf7c 11 *
wolfSSL 15:117db924cf7c 12 * wolfSSL is distributed in the hope that it will be useful,
wolfSSL 15:117db924cf7c 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
wolfSSL 15:117db924cf7c 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
wolfSSL 15:117db924cf7c 15 * GNU General Public License for more details.
wolfSSL 15:117db924cf7c 16 *
wolfSSL 15:117db924cf7c 17 * You should have received a copy of the GNU General Public License
wolfSSL 15:117db924cf7c 18 * along with this program; if not, write to the Free Software
wolfSSL 15:117db924cf7c 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
wolfSSL 15:117db924cf7c 20 */
wolfSSL 15:117db924cf7c 21
wolfSSL 15:117db924cf7c 22
wolfSSL 15:117db924cf7c 23 #ifdef HAVE_CONFIG_H
wolfSSL 15:117db924cf7c 24 #include <config.h>
wolfSSL 15:117db924cf7c 25 #endif
wolfSSL 15:117db924cf7c 26
wolfSSL 15:117db924cf7c 27 #include <wolfssl/wolfcrypt/settings.h>
wolfSSL 15:117db924cf7c 28 #include <wolfssl/wolfcrypt/types.h>
wolfSSL 15:117db924cf7c 29 #include <wolfssl/wolfcrypt/error-crypt.h>
wolfSSL 15:117db924cf7c 30 #include <wolfssl/wolfcrypt/logging.h>
wolfSSL 15:117db924cf7c 31 #include <wolfssl/wolfcrypt/wc_port.h>
wolfSSL 15:117db924cf7c 32 #ifdef HAVE_ECC
wolfSSL 15:117db924cf7c 33 #include <wolfssl/wolfcrypt/ecc.h>
wolfSSL 15:117db924cf7c 34 #endif
wolfSSL 15:117db924cf7c 35 #ifdef WOLFSSL_ASYNC_CRYPT
wolfSSL 15:117db924cf7c 36 #include <wolfssl/wolfcrypt/async.h>
wolfSSL 15:117db924cf7c 37 #endif
wolfSSL 15:117db924cf7c 38
wolfSSL 15:117db924cf7c 39 /* IPP header files for library initialization */
wolfSSL 15:117db924cf7c 40 #ifdef HAVE_FAST_RSA
wolfSSL 15:117db924cf7c 41 #include <ipp.h>
wolfSSL 15:117db924cf7c 42 #include <ippcp.h>
wolfSSL 15:117db924cf7c 43 #endif
wolfSSL 15:117db924cf7c 44
wolfSSL 15:117db924cf7c 45 #ifdef FREESCALE_LTC_TFM
wolfSSL 15:117db924cf7c 46 #include <wolfssl/wolfcrypt/port/nxp/ksdk_port.h>
wolfSSL 15:117db924cf7c 47 #endif
wolfSSL 15:117db924cf7c 48
wolfSSL 15:117db924cf7c 49 #if defined(WOLFSSL_ATMEL) || defined(WOLFSSL_ATECC508A)
wolfSSL 15:117db924cf7c 50 #include <wolfssl/wolfcrypt/port/atmel/atmel.h>
wolfSSL 15:117db924cf7c 51 #endif
wolfSSL 15:117db924cf7c 52
wolfSSL 15:117db924cf7c 53 #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
wolfSSL 15:117db924cf7c 54 #include <wolfssl/openssl/evp.h>
wolfSSL 15:117db924cf7c 55 #endif
wolfSSL 15:117db924cf7c 56
wolfSSL 15:117db924cf7c 57 #if defined(USE_WOLFSSL_MEMORY) && defined(WOLFSSL_TRACK_MEMORY)
wolfSSL 15:117db924cf7c 58 #include <wolfssl/wolfcrypt/memory.h>
wolfSSL 15:117db924cf7c 59 #include <wolfssl/wolfcrypt/mem_track.h>
wolfSSL 15:117db924cf7c 60 #endif
wolfSSL 15:117db924cf7c 61
wolfSSL 15:117db924cf7c 62 #if defined(WOLFSSL_IMX6_CAAM) || defined(WOLFSSL_IMX6_CAAM_RNG) || \
wolfSSL 15:117db924cf7c 63 defined(WOLFSSL_IMX6_CAAM_BLOB)
wolfSSL 15:117db924cf7c 64 #include <wolfssl/wolfcrypt/port/caam/wolfcaam.h>
wolfSSL 15:117db924cf7c 65 #endif
wolfSSL 15:117db924cf7c 66
wolfSSL 15:117db924cf7c 67 #ifdef WOLF_CRYPTO_DEV
wolfSSL 15:117db924cf7c 68 #include <wolfssl/wolfcrypt/cryptodev.h>
wolfSSL 15:117db924cf7c 69 #endif
wolfSSL 15:117db924cf7c 70
wolfSSL 15:117db924cf7c 71 #ifdef _MSC_VER
wolfSSL 15:117db924cf7c 72 /* 4996 warning to use MS extensions e.g., strcpy_s instead of strncpy */
wolfSSL 15:117db924cf7c 73 #pragma warning(disable: 4996)
wolfSSL 15:117db924cf7c 74 #endif
wolfSSL 15:117db924cf7c 75
wolfSSL 15:117db924cf7c 76 /* prevent multiple mutex initializations */
wolfSSL 15:117db924cf7c 77 static volatile int initRefCount = 0;
wolfSSL 15:117db924cf7c 78
wolfSSL 15:117db924cf7c 79 /* Used to initialize state for wolfcrypt
wolfSSL 15:117db924cf7c 80 return 0 on success
wolfSSL 15:117db924cf7c 81 */
wolfSSL 15:117db924cf7c 82 int wolfCrypt_Init(void)
wolfSSL 15:117db924cf7c 83 {
wolfSSL 15:117db924cf7c 84 int ret = 0;
wolfSSL 15:117db924cf7c 85
wolfSSL 15:117db924cf7c 86 if (initRefCount == 0) {
wolfSSL 15:117db924cf7c 87 WOLFSSL_ENTER("wolfCrypt_Init");
wolfSSL 15:117db924cf7c 88
wolfSSL 15:117db924cf7c 89 #ifdef WOLF_CRYPTO_DEV
wolfSSL 15:117db924cf7c 90 wc_CryptoDev_Init();
wolfSSL 15:117db924cf7c 91 #endif
wolfSSL 15:117db924cf7c 92
wolfSSL 15:117db924cf7c 93 #ifdef WOLFSSL_ASYNC_CRYPT
wolfSSL 15:117db924cf7c 94 ret = wolfAsync_HardwareStart();
wolfSSL 15:117db924cf7c 95 if (ret != 0) {
wolfSSL 15:117db924cf7c 96 WOLFSSL_MSG("Async hardware start failed");
wolfSSL 15:117db924cf7c 97 /* don't return failure, allow operation to continue */
wolfSSL 15:117db924cf7c 98 }
wolfSSL 15:117db924cf7c 99 #endif
wolfSSL 15:117db924cf7c 100
wolfSSL 15:117db924cf7c 101 #if defined(WOLFSSL_TRACK_MEMORY) && !defined(WOLFSSL_STATIC_MEMORY)
wolfSSL 15:117db924cf7c 102 ret = InitMemoryTracker();
wolfSSL 15:117db924cf7c 103 if (ret != 0) {
wolfSSL 15:117db924cf7c 104 WOLFSSL_MSG("InitMemoryTracker failed");
wolfSSL 15:117db924cf7c 105 return ret;
wolfSSL 15:117db924cf7c 106 }
wolfSSL 15:117db924cf7c 107 #endif
wolfSSL 15:117db924cf7c 108
wolfSSL 15:117db924cf7c 109 #if WOLFSSL_CRYPT_HW_MUTEX
wolfSSL 15:117db924cf7c 110 /* If crypto hardware mutex protection is enabled, then initialize it */
wolfSSL 15:117db924cf7c 111 ret = wolfSSL_CryptHwMutexInit();
wolfSSL 15:117db924cf7c 112 if (ret != 0) {
wolfSSL 15:117db924cf7c 113 WOLFSSL_MSG("Hw crypt mutex init failed");
wolfSSL 15:117db924cf7c 114 return ret;
wolfSSL 15:117db924cf7c 115 }
wolfSSL 15:117db924cf7c 116 #endif
wolfSSL 15:117db924cf7c 117
wolfSSL 15:117db924cf7c 118 /* if defined have fast RSA then initialize Intel IPP */
wolfSSL 15:117db924cf7c 119 #ifdef HAVE_FAST_RSA
wolfSSL 15:117db924cf7c 120 WOLFSSL_MSG("Attempting to use optimized IPP Library");
wolfSSL 15:117db924cf7c 121 if ((ret = ippInit()) != ippStsNoErr) {
wolfSSL 15:117db924cf7c 122 /* possible to get a CPU feature support status on optimized IPP
wolfSSL 15:117db924cf7c 123 library but still use default library and see competitive speeds */
wolfSSL 15:117db924cf7c 124 WOLFSSL_MSG("Warning when trying to set up optimization");
wolfSSL 15:117db924cf7c 125 WOLFSSL_MSG(ippGetStatusString(ret));
wolfSSL 15:117db924cf7c 126 WOLFSSL_MSG("Using default fast IPP library");
wolfSSL 15:117db924cf7c 127 ret = 0;
wolfSSL 15:117db924cf7c 128 (void)ret; /* suppress not read warning */
wolfSSL 15:117db924cf7c 129 }
wolfSSL 15:117db924cf7c 130 #endif
wolfSSL 15:117db924cf7c 131
wolfSSL 15:117db924cf7c 132 #if defined(FREESCALE_LTC_TFM) || defined(FREESCALE_LTC_ECC)
wolfSSL 15:117db924cf7c 133 ret = ksdk_port_init();
wolfSSL 15:117db924cf7c 134 if (ret != 0) {
wolfSSL 15:117db924cf7c 135 WOLFSSL_MSG("KSDK port init failed");
wolfSSL 15:117db924cf7c 136 return ret;
wolfSSL 15:117db924cf7c 137 }
wolfSSL 15:117db924cf7c 138 #endif
wolfSSL 15:117db924cf7c 139
wolfSSL 15:117db924cf7c 140 #if defined(WOLFSSL_ATMEL) || defined(WOLFSSL_ATECC508A)
wolfSSL 15:117db924cf7c 141 atmel_init();
wolfSSL 15:117db924cf7c 142 #endif
wolfSSL 15:117db924cf7c 143
wolfSSL 15:117db924cf7c 144 #ifdef WOLFSSL_ARMASM
wolfSSL 15:117db924cf7c 145 WOLFSSL_MSG("Using ARM hardware acceleration");
wolfSSL 15:117db924cf7c 146 #endif
wolfSSL 15:117db924cf7c 147
wolfSSL 15:117db924cf7c 148 #if !defined(WOLFCRYPT_ONLY) && \
wolfSSL 15:117db924cf7c 149 ( defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) )
wolfSSL 15:117db924cf7c 150 wolfSSL_EVP_init();
wolfSSL 15:117db924cf7c 151 #endif
wolfSSL 15:117db924cf7c 152
wolfSSL 15:117db924cf7c 153 #if defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE)
wolfSSL 15:117db924cf7c 154 if ((ret = wc_LoggingInit()) != 0) {
wolfSSL 15:117db924cf7c 155 WOLFSSL_MSG("Error creating logging mutex");
wolfSSL 15:117db924cf7c 156 return ret;
wolfSSL 15:117db924cf7c 157 }
wolfSSL 15:117db924cf7c 158 #endif
wolfSSL 15:117db924cf7c 159
wolfSSL 15:117db924cf7c 160 #ifdef HAVE_ECC
wolfSSL 15:117db924cf7c 161 #ifdef ECC_CACHE_CURVE
wolfSSL 15:117db924cf7c 162 if ((ret = wc_ecc_curve_cache_init()) != 0) {
wolfSSL 15:117db924cf7c 163 WOLFSSL_MSG("Error creating curve cache");
wolfSSL 15:117db924cf7c 164 return ret;
wolfSSL 15:117db924cf7c 165 }
wolfSSL 15:117db924cf7c 166 #endif
wolfSSL 15:117db924cf7c 167 #endif
wolfSSL 15:117db924cf7c 168
wolfSSL 15:117db924cf7c 169 #if defined(WOLFSSL_IMX6_CAAM) || defined(WOLFSSL_IMX6_CAAM_RNG) || \
wolfSSL 15:117db924cf7c 170 defined(WOLFSSL_IMX6_CAAM_BLOB)
wolfSSL 15:117db924cf7c 171 if ((ret = wc_caamInit()) != 0) {
wolfSSL 15:117db924cf7c 172 return ret;
wolfSSL 15:117db924cf7c 173 }
wolfSSL 15:117db924cf7c 174 #endif
wolfSSL 15:117db924cf7c 175
wolfSSL 15:117db924cf7c 176 initRefCount = 1;
wolfSSL 15:117db924cf7c 177 }
wolfSSL 15:117db924cf7c 178
wolfSSL 15:117db924cf7c 179 return ret;
wolfSSL 15:117db924cf7c 180 }
wolfSSL 15:117db924cf7c 181
wolfSSL 15:117db924cf7c 182
wolfSSL 15:117db924cf7c 183 /* return success value is the same as wolfCrypt_Init */
wolfSSL 15:117db924cf7c 184 int wolfCrypt_Cleanup(void)
wolfSSL 15:117db924cf7c 185 {
wolfSSL 15:117db924cf7c 186 int ret = 0;
wolfSSL 15:117db924cf7c 187
wolfSSL 15:117db924cf7c 188 if (initRefCount == 1) {
wolfSSL 15:117db924cf7c 189 WOLFSSL_ENTER("wolfCrypt_Cleanup");
wolfSSL 15:117db924cf7c 190
wolfSSL 15:117db924cf7c 191 #ifdef HAVE_ECC
wolfSSL 15:117db924cf7c 192 #ifdef FP_ECC
wolfSSL 15:117db924cf7c 193 wc_ecc_fp_free();
wolfSSL 15:117db924cf7c 194 #endif
wolfSSL 15:117db924cf7c 195 #ifdef ECC_CACHE_CURVE
wolfSSL 15:117db924cf7c 196 wc_ecc_curve_cache_free();
wolfSSL 15:117db924cf7c 197 #endif
wolfSSL 15:117db924cf7c 198 #endif /* HAVE_ECC */
wolfSSL 15:117db924cf7c 199
wolfSSL 15:117db924cf7c 200 #if defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE)
wolfSSL 15:117db924cf7c 201 ret = wc_LoggingCleanup();
wolfSSL 15:117db924cf7c 202 #endif
wolfSSL 15:117db924cf7c 203
wolfSSL 15:117db924cf7c 204 #if defined(WOLFSSL_TRACK_MEMORY) && !defined(WOLFSSL_STATIC_MEMORY)
wolfSSL 15:117db924cf7c 205 ShowMemoryTracker();
wolfSSL 15:117db924cf7c 206 #endif
wolfSSL 15:117db924cf7c 207
wolfSSL 15:117db924cf7c 208 #ifdef WOLFSSL_ASYNC_CRYPT
wolfSSL 15:117db924cf7c 209 wolfAsync_HardwareStop();
wolfSSL 15:117db924cf7c 210 #endif
wolfSSL 15:117db924cf7c 211
wolfSSL 15:117db924cf7c 212 #if defined(WOLFSSL_IMX6_CAAM) || defined(WOLFSSL_IMX6_CAAM_RNG) || \
wolfSSL 15:117db924cf7c 213 defined(WOLFSSL_IMX6_CAAM_BLOB)
wolfSSL 15:117db924cf7c 214 wc_caamFree();
wolfSSL 15:117db924cf7c 215 #endif
wolfSSL 15:117db924cf7c 216
wolfSSL 15:117db924cf7c 217 initRefCount = 0; /* allow re-init */
wolfSSL 15:117db924cf7c 218 }
wolfSSL 15:117db924cf7c 219
wolfSSL 15:117db924cf7c 220 return ret;
wolfSSL 15:117db924cf7c 221 }
wolfSSL 15:117db924cf7c 222
wolfSSL 15:117db924cf7c 223 #if !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR) && \
wolfSSL 15:117db924cf7c 224 !defined(WOLFSSL_NUCLEUS) && !defined(WOLFSSL_NUCLEUS_1_2)
wolfSSL 15:117db924cf7c 225
wolfSSL 15:117db924cf7c 226 /* File Handling Helpers */
wolfSSL 15:117db924cf7c 227 /* returns 0 if file found, -1 if no files or negative error */
wolfSSL 15:117db924cf7c 228 int wc_ReadDirFirst(ReadDirCtx* ctx, const char* path, char** name)
wolfSSL 15:117db924cf7c 229 {
wolfSSL 15:117db924cf7c 230 int ret = -1; /* default to no files found */
wolfSSL 15:117db924cf7c 231
wolfSSL 15:117db924cf7c 232 if (name)
wolfSSL 15:117db924cf7c 233 *name = NULL;
wolfSSL 15:117db924cf7c 234
wolfSSL 15:117db924cf7c 235 if (ctx == NULL || path == NULL) {
wolfSSL 15:117db924cf7c 236 return BAD_FUNC_ARG;
wolfSSL 15:117db924cf7c 237 }
wolfSSL 15:117db924cf7c 238
wolfSSL 15:117db924cf7c 239 XMEMSET(ctx->name, 0, MAX_FILENAME_SZ);
wolfSSL 15:117db924cf7c 240
wolfSSL 15:117db924cf7c 241 #ifdef USE_WINDOWS_API
wolfSSL 15:117db924cf7c 242 XSTRNCPY(ctx->name, path, MAX_FILENAME_SZ - 4);
wolfSSL 15:117db924cf7c 243 XSTRNCAT(ctx->name, "\\*", 3);
wolfSSL 15:117db924cf7c 244
wolfSSL 15:117db924cf7c 245 ctx->hFind = FindFirstFileA(ctx->name, &ctx->FindFileData);
wolfSSL 15:117db924cf7c 246 if (ctx->hFind == INVALID_HANDLE_VALUE) {
wolfSSL 15:117db924cf7c 247 WOLFSSL_MSG("FindFirstFile for path verify locations failed");
wolfSSL 15:117db924cf7c 248 return BAD_PATH_ERROR;
wolfSSL 15:117db924cf7c 249 }
wolfSSL 15:117db924cf7c 250
wolfSSL 15:117db924cf7c 251 do {
wolfSSL 15:117db924cf7c 252 if (ctx->FindFileData.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY) {
wolfSSL 15:117db924cf7c 253 XSTRNCPY(ctx->name, path, MAX_FILENAME_SZ/2 - 3);
wolfSSL 15:117db924cf7c 254 XSTRNCAT(ctx->name, "\\", 2);
wolfSSL 15:117db924cf7c 255 XSTRNCAT(ctx->name, ctx->FindFileData.cFileName, MAX_FILENAME_SZ/2);
wolfSSL 15:117db924cf7c 256 if (name)
wolfSSL 15:117db924cf7c 257 *name = ctx->name;
wolfSSL 15:117db924cf7c 258 return 0;
wolfSSL 15:117db924cf7c 259 }
wolfSSL 15:117db924cf7c 260 } while (FindNextFileA(ctx->hFind, &ctx->FindFileData));
wolfSSL 15:117db924cf7c 261 #else
wolfSSL 15:117db924cf7c 262 ctx->dir = opendir(path);
wolfSSL 15:117db924cf7c 263 if (ctx->dir == NULL) {
wolfSSL 15:117db924cf7c 264 WOLFSSL_MSG("opendir path verify locations failed");
wolfSSL 15:117db924cf7c 265 return BAD_PATH_ERROR;
wolfSSL 15:117db924cf7c 266 }
wolfSSL 15:117db924cf7c 267
wolfSSL 15:117db924cf7c 268 while ((ctx->entry = readdir(ctx->dir)) != NULL) {
wolfSSL 15:117db924cf7c 269 XSTRNCPY(ctx->name, path, MAX_FILENAME_SZ/2 - 2);
wolfSSL 15:117db924cf7c 270 XSTRNCAT(ctx->name, "/", 1);
wolfSSL 15:117db924cf7c 271 XSTRNCAT(ctx->name, ctx->entry->d_name, MAX_FILENAME_SZ/2);
wolfSSL 15:117db924cf7c 272
wolfSSL 15:117db924cf7c 273 if (stat(ctx->name, &ctx->s) != 0) {
wolfSSL 15:117db924cf7c 274 WOLFSSL_MSG("stat on name failed");
wolfSSL 15:117db924cf7c 275 ret = BAD_PATH_ERROR;
wolfSSL 15:117db924cf7c 276 break;
wolfSSL 15:117db924cf7c 277 } else if (S_ISREG(ctx->s.st_mode)) {
wolfSSL 15:117db924cf7c 278 if (name)
wolfSSL 15:117db924cf7c 279 *name = ctx->name;
wolfSSL 15:117db924cf7c 280 return 0;
wolfSSL 15:117db924cf7c 281 }
wolfSSL 15:117db924cf7c 282 }
wolfSSL 15:117db924cf7c 283 #endif
wolfSSL 15:117db924cf7c 284 wc_ReadDirClose(ctx);
wolfSSL 15:117db924cf7c 285
wolfSSL 15:117db924cf7c 286 return ret;
wolfSSL 15:117db924cf7c 287 }
wolfSSL 15:117db924cf7c 288
wolfSSL 15:117db924cf7c 289 /* returns 0 if file found, -1 if no more files */
wolfSSL 15:117db924cf7c 290 int wc_ReadDirNext(ReadDirCtx* ctx, const char* path, char** name)
wolfSSL 15:117db924cf7c 291 {
wolfSSL 15:117db924cf7c 292 int ret = -1; /* default to no file found */
wolfSSL 15:117db924cf7c 293
wolfSSL 15:117db924cf7c 294 if (name)
wolfSSL 15:117db924cf7c 295 *name = NULL;
wolfSSL 15:117db924cf7c 296
wolfSSL 15:117db924cf7c 297 if (ctx == NULL || path == NULL) {
wolfSSL 15:117db924cf7c 298 return BAD_FUNC_ARG;
wolfSSL 15:117db924cf7c 299 }
wolfSSL 15:117db924cf7c 300
wolfSSL 15:117db924cf7c 301 XMEMSET(ctx->name, 0, MAX_FILENAME_SZ);
wolfSSL 15:117db924cf7c 302
wolfSSL 15:117db924cf7c 303 #ifdef USE_WINDOWS_API
wolfSSL 15:117db924cf7c 304 while (FindNextFileA(ctx->hFind, &ctx->FindFileData)) {
wolfSSL 15:117db924cf7c 305 if (ctx->FindFileData.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY) {
wolfSSL 15:117db924cf7c 306 XSTRNCPY(ctx->name, path, MAX_FILENAME_SZ/2 - 3);
wolfSSL 15:117db924cf7c 307 XSTRNCAT(ctx->name, "\\", 2);
wolfSSL 15:117db924cf7c 308 XSTRNCAT(ctx->name, ctx->FindFileData.cFileName, MAX_FILENAME_SZ/2);
wolfSSL 15:117db924cf7c 309 if (name)
wolfSSL 15:117db924cf7c 310 *name = ctx->name;
wolfSSL 15:117db924cf7c 311 return 0;
wolfSSL 15:117db924cf7c 312 }
wolfSSL 15:117db924cf7c 313 }
wolfSSL 15:117db924cf7c 314 #else
wolfSSL 15:117db924cf7c 315 while ((ctx->entry = readdir(ctx->dir)) != NULL) {
wolfSSL 15:117db924cf7c 316 XSTRNCPY(ctx->name, path, MAX_FILENAME_SZ/2 - 2);
wolfSSL 15:117db924cf7c 317 XSTRNCAT(ctx->name, "/", 1);
wolfSSL 15:117db924cf7c 318 XSTRNCAT(ctx->name, ctx->entry->d_name, MAX_FILENAME_SZ/2);
wolfSSL 15:117db924cf7c 319
wolfSSL 15:117db924cf7c 320 if (stat(ctx->name, &ctx->s) != 0) {
wolfSSL 15:117db924cf7c 321 WOLFSSL_MSG("stat on name failed");
wolfSSL 15:117db924cf7c 322 ret = BAD_PATH_ERROR;
wolfSSL 15:117db924cf7c 323 break;
wolfSSL 15:117db924cf7c 324 } else if (S_ISREG(ctx->s.st_mode)) {
wolfSSL 15:117db924cf7c 325 if (name)
wolfSSL 15:117db924cf7c 326 *name = ctx->name;
wolfSSL 15:117db924cf7c 327 return 0;
wolfSSL 15:117db924cf7c 328 }
wolfSSL 15:117db924cf7c 329 }
wolfSSL 15:117db924cf7c 330 #endif
wolfSSL 15:117db924cf7c 331
wolfSSL 15:117db924cf7c 332 wc_ReadDirClose(ctx);
wolfSSL 15:117db924cf7c 333
wolfSSL 15:117db924cf7c 334 return ret;
wolfSSL 15:117db924cf7c 335 }
wolfSSL 15:117db924cf7c 336
wolfSSL 15:117db924cf7c 337 void wc_ReadDirClose(ReadDirCtx* ctx)
wolfSSL 15:117db924cf7c 338 {
wolfSSL 15:117db924cf7c 339 if (ctx == NULL) {
wolfSSL 15:117db924cf7c 340 return;
wolfSSL 15:117db924cf7c 341 }
wolfSSL 15:117db924cf7c 342
wolfSSL 15:117db924cf7c 343 #ifdef USE_WINDOWS_API
wolfSSL 15:117db924cf7c 344 if (ctx->hFind != INVALID_HANDLE_VALUE) {
wolfSSL 15:117db924cf7c 345 FindClose(ctx->hFind);
wolfSSL 15:117db924cf7c 346 ctx->hFind = INVALID_HANDLE_VALUE;
wolfSSL 15:117db924cf7c 347 }
wolfSSL 15:117db924cf7c 348 #else
wolfSSL 15:117db924cf7c 349 if (ctx->dir) {
wolfSSL 15:117db924cf7c 350 closedir(ctx->dir);
wolfSSL 15:117db924cf7c 351 ctx->dir = NULL;
wolfSSL 15:117db924cf7c 352 }
wolfSSL 15:117db924cf7c 353 #endif
wolfSSL 15:117db924cf7c 354 }
wolfSSL 15:117db924cf7c 355
wolfSSL 15:117db924cf7c 356 #endif /* !NO_FILESYSTEM && !NO_WOLFSSL_DIR */
wolfSSL 15:117db924cf7c 357
wolfSSL 15:117db924cf7c 358
wolfSSL 15:117db924cf7c 359 wolfSSL_Mutex* wc_InitAndAllocMutex(void)
wolfSSL 15:117db924cf7c 360 {
wolfSSL 15:117db924cf7c 361 wolfSSL_Mutex* m = (wolfSSL_Mutex*) XMALLOC(sizeof(wolfSSL_Mutex), NULL,
wolfSSL 15:117db924cf7c 362 DYNAMIC_TYPE_MUTEX);
wolfSSL 15:117db924cf7c 363 if (m != NULL) {
wolfSSL 15:117db924cf7c 364 if (wc_InitMutex(m) != 0) {
wolfSSL 15:117db924cf7c 365 WOLFSSL_MSG("Init Mutex failed");
wolfSSL 15:117db924cf7c 366 XFREE(m, NULL, DYNAMIC_TYPE_MUTEX);
wolfSSL 15:117db924cf7c 367 m = NULL;
wolfSSL 15:117db924cf7c 368 }
wolfSSL 15:117db924cf7c 369 }
wolfSSL 15:117db924cf7c 370 else {
wolfSSL 15:117db924cf7c 371 WOLFSSL_MSG("Memory error with Mutex allocation");
wolfSSL 15:117db924cf7c 372 }
wolfSSL 15:117db924cf7c 373
wolfSSL 15:117db924cf7c 374 return m;
wolfSSL 15:117db924cf7c 375 }
wolfSSL 15:117db924cf7c 376
wolfSSL 15:117db924cf7c 377 #ifdef USE_WOLF_STRTOK
wolfSSL 15:117db924cf7c 378 /* String token (delim) search. If str is null use nextp. */
wolfSSL 15:117db924cf7c 379 char* wc_strtok(char *str, const char *delim, char **nextp)
wolfSSL 15:117db924cf7c 380 {
wolfSSL 15:117db924cf7c 381 char* ret;
wolfSSL 15:117db924cf7c 382 int i, j;
wolfSSL 15:117db924cf7c 383
wolfSSL 15:117db924cf7c 384 /* Use next if str is NULL */
wolfSSL 15:117db924cf7c 385 if (str == NULL && nextp)
wolfSSL 15:117db924cf7c 386 str = *nextp;
wolfSSL 15:117db924cf7c 387
wolfSSL 15:117db924cf7c 388 /* verify str input */
wolfSSL 15:117db924cf7c 389 if (str == NULL || *str == '\0')
wolfSSL 15:117db924cf7c 390 return NULL;
wolfSSL 15:117db924cf7c 391
wolfSSL 15:117db924cf7c 392 /* match on entire delim */
wolfSSL 15:117db924cf7c 393 for (i = 0; str[i]; i++) {
wolfSSL 15:117db924cf7c 394 for (j = 0; delim[j]; j++) {
wolfSSL 15:117db924cf7c 395 if (delim[j] == str[i])
wolfSSL 15:117db924cf7c 396 break;
wolfSSL 15:117db924cf7c 397 }
wolfSSL 15:117db924cf7c 398 if (!delim[j])
wolfSSL 15:117db924cf7c 399 break;
wolfSSL 15:117db924cf7c 400 }
wolfSSL 15:117db924cf7c 401 str += i;
wolfSSL 15:117db924cf7c 402 /* if end of string, not found so return NULL */
wolfSSL 15:117db924cf7c 403 if (*str == '\0')
wolfSSL 15:117db924cf7c 404 return NULL;
wolfSSL 15:117db924cf7c 405
wolfSSL 15:117db924cf7c 406 ret = str;
wolfSSL 15:117db924cf7c 407
wolfSSL 15:117db924cf7c 408 /* match on first delim */
wolfSSL 15:117db924cf7c 409 for (i = 0; str[i]; i++) {
wolfSSL 15:117db924cf7c 410 for (j = 0; delim[j]; j++) {
wolfSSL 15:117db924cf7c 411 if (delim[j] == str[i])
wolfSSL 15:117db924cf7c 412 break;
wolfSSL 15:117db924cf7c 413 }
wolfSSL 15:117db924cf7c 414 if (delim[j] == str[i])
wolfSSL 15:117db924cf7c 415 break;
wolfSSL 15:117db924cf7c 416 }
wolfSSL 15:117db924cf7c 417 str += i;
wolfSSL 15:117db924cf7c 418
wolfSSL 15:117db924cf7c 419 /* null terminate found string */
wolfSSL 15:117db924cf7c 420 if (*str)
wolfSSL 15:117db924cf7c 421 *str++ = '\0';
wolfSSL 15:117db924cf7c 422
wolfSSL 15:117db924cf7c 423 /* return pointer to next */
wolfSSL 15:117db924cf7c 424 if (nextp)
wolfSSL 15:117db924cf7c 425 *nextp = str;
wolfSSL 15:117db924cf7c 426
wolfSSL 15:117db924cf7c 427 return ret;
wolfSSL 15:117db924cf7c 428 }
wolfSSL 15:117db924cf7c 429 #endif /* USE_WOLF_STRTOK */
wolfSSL 15:117db924cf7c 430
wolfSSL 15:117db924cf7c 431 #ifdef USE_WOLF_STRSEP
wolfSSL 15:117db924cf7c 432 char* wc_strsep(char **stringp, const char *delim)
wolfSSL 15:117db924cf7c 433 {
wolfSSL 15:117db924cf7c 434 char *s, *tok;
wolfSSL 15:117db924cf7c 435 const char *spanp;
wolfSSL 15:117db924cf7c 436
wolfSSL 15:117db924cf7c 437 /* null check */
wolfSSL 15:117db924cf7c 438 if (stringp == NULL || *stringp == NULL)
wolfSSL 15:117db924cf7c 439 return NULL;
wolfSSL 15:117db924cf7c 440
wolfSSL 15:117db924cf7c 441 s = *stringp;
wolfSSL 15:117db924cf7c 442 for (tok = s; *tok; ++tok) {
wolfSSL 15:117db924cf7c 443 for (spanp = delim; *spanp; ++spanp) {
wolfSSL 15:117db924cf7c 444 /* found delimiter */
wolfSSL 15:117db924cf7c 445 if (*tok == *spanp) {
wolfSSL 15:117db924cf7c 446 *tok = '\0'; /* replace delim with null term */
wolfSSL 15:117db924cf7c 447 *stringp = tok + 1; /* return past delim */
wolfSSL 15:117db924cf7c 448 return s;
wolfSSL 15:117db924cf7c 449 }
wolfSSL 15:117db924cf7c 450 }
wolfSSL 15:117db924cf7c 451 }
wolfSSL 15:117db924cf7c 452
wolfSSL 15:117db924cf7c 453 *stringp = NULL;
wolfSSL 15:117db924cf7c 454 return s;
wolfSSL 15:117db924cf7c 455 }
wolfSSL 15:117db924cf7c 456 #endif /* USE_WOLF_STRSEP */
wolfSSL 15:117db924cf7c 457
wolfSSL 15:117db924cf7c 458 #if WOLFSSL_CRYPT_HW_MUTEX
wolfSSL 15:117db924cf7c 459 /* Mutex for protection of cryptography hardware */
wolfSSL 15:117db924cf7c 460 static wolfSSL_Mutex wcCryptHwMutex;
wolfSSL 15:117db924cf7c 461 static int wcCryptHwMutexInit = 0;
wolfSSL 15:117db924cf7c 462
wolfSSL 15:117db924cf7c 463 int wolfSSL_CryptHwMutexInit(void) {
wolfSSL 15:117db924cf7c 464 int ret = 0;
wolfSSL 15:117db924cf7c 465 if(wcCryptHwMutexInit == 0) {
wolfSSL 15:117db924cf7c 466 ret = wc_InitMutex(&wcCryptHwMutex);
wolfSSL 15:117db924cf7c 467 if(ret == 0) {
wolfSSL 15:117db924cf7c 468 wcCryptHwMutexInit = 1;
wolfSSL 15:117db924cf7c 469 }
wolfSSL 15:117db924cf7c 470 }
wolfSSL 15:117db924cf7c 471 return ret;
wolfSSL 15:117db924cf7c 472 }
wolfSSL 15:117db924cf7c 473
wolfSSL 15:117db924cf7c 474 int wolfSSL_CryptHwMutexLock(void) {
wolfSSL 15:117db924cf7c 475 int ret = BAD_MUTEX_E;
wolfSSL 15:117db924cf7c 476
wolfSSL 15:117db924cf7c 477 /* Make sure HW Mutex has been initialized */
wolfSSL 15:117db924cf7c 478 wolfSSL_CryptHwMutexInit();
wolfSSL 15:117db924cf7c 479
wolfSSL 15:117db924cf7c 480 if(wcCryptHwMutexInit) {
wolfSSL 15:117db924cf7c 481 ret = wc_LockMutex(&wcCryptHwMutex);
wolfSSL 15:117db924cf7c 482 }
wolfSSL 15:117db924cf7c 483 return ret;
wolfSSL 15:117db924cf7c 484 }
wolfSSL 15:117db924cf7c 485
wolfSSL 15:117db924cf7c 486 int wolfSSL_CryptHwMutexUnLock(void) {
wolfSSL 15:117db924cf7c 487 int ret = BAD_MUTEX_E;
wolfSSL 15:117db924cf7c 488
wolfSSL 15:117db924cf7c 489 if(wcCryptHwMutexInit) {
wolfSSL 15:117db924cf7c 490 ret = wc_UnLockMutex(&wcCryptHwMutex);
wolfSSL 15:117db924cf7c 491 }
wolfSSL 15:117db924cf7c 492 return ret;
wolfSSL 15:117db924cf7c 493 }
wolfSSL 15:117db924cf7c 494 #endif /* WOLFSSL_CRYPT_HW_MUTEX */
wolfSSL 15:117db924cf7c 495
wolfSSL 15:117db924cf7c 496
wolfSSL 15:117db924cf7c 497 /* ---------------------------------------------------------------------------*/
wolfSSL 15:117db924cf7c 498 /* Mutex Ports */
wolfSSL 15:117db924cf7c 499 /* ---------------------------------------------------------------------------*/
wolfSSL 15:117db924cf7c 500 #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
wolfSSL 15:117db924cf7c 501 static mutex_cb* compat_mutex_cb = NULL;
wolfSSL 15:117db924cf7c 502
wolfSSL 15:117db924cf7c 503 /* Function that locks or unlocks a mutex based on the flag passed in.
wolfSSL 15:117db924cf7c 504 *
wolfSSL 15:117db924cf7c 505 * flag lock or unlock i.e. CRYPTO_LOCK
wolfSSL 15:117db924cf7c 506 * type the type of lock to unlock or lock
wolfSSL 15:117db924cf7c 507 * file name of the file calling
wolfSSL 15:117db924cf7c 508 * line the line number from file calling
wolfSSL 15:117db924cf7c 509 */
wolfSSL 15:117db924cf7c 510 int wc_LockMutex_ex(int flag, int type, const char* file, int line)
wolfSSL 15:117db924cf7c 511 {
wolfSSL 15:117db924cf7c 512 if (compat_mutex_cb != NULL) {
wolfSSL 15:117db924cf7c 513 compat_mutex_cb(flag, type, file, line);
wolfSSL 15:117db924cf7c 514 return 0;
wolfSSL 15:117db924cf7c 515 }
wolfSSL 15:117db924cf7c 516 else {
wolfSSL 15:117db924cf7c 517 WOLFSSL_MSG("Mutex call back function not set. Call wc_SetMutexCb");
wolfSSL 15:117db924cf7c 518 return BAD_STATE_E;
wolfSSL 15:117db924cf7c 519 }
wolfSSL 15:117db924cf7c 520 }
wolfSSL 15:117db924cf7c 521
wolfSSL 15:117db924cf7c 522
wolfSSL 15:117db924cf7c 523 /* Set the callback function to use for locking/unlocking mutex
wolfSSL 15:117db924cf7c 524 *
wolfSSL 15:117db924cf7c 525 * cb callback function to use
wolfSSL 15:117db924cf7c 526 */
wolfSSL 15:117db924cf7c 527 int wc_SetMutexCb(mutex_cb* cb)
wolfSSL 15:117db924cf7c 528 {
wolfSSL 15:117db924cf7c 529 compat_mutex_cb = cb;
wolfSSL 15:117db924cf7c 530 return 0;
wolfSSL 15:117db924cf7c 531 }
wolfSSL 15:117db924cf7c 532 #endif /* defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) */
wolfSSL 15:117db924cf7c 533 #ifdef SINGLE_THREADED
wolfSSL 15:117db924cf7c 534
wolfSSL 15:117db924cf7c 535 int wc_InitMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 536 {
wolfSSL 15:117db924cf7c 537 (void)m;
wolfSSL 15:117db924cf7c 538 return 0;
wolfSSL 15:117db924cf7c 539 }
wolfSSL 15:117db924cf7c 540
wolfSSL 15:117db924cf7c 541 int wc_FreeMutex(wolfSSL_Mutex *m)
wolfSSL 15:117db924cf7c 542 {
wolfSSL 15:117db924cf7c 543 (void)m;
wolfSSL 15:117db924cf7c 544 return 0;
wolfSSL 15:117db924cf7c 545 }
wolfSSL 15:117db924cf7c 546
wolfSSL 15:117db924cf7c 547
wolfSSL 15:117db924cf7c 548 int wc_LockMutex(wolfSSL_Mutex *m)
wolfSSL 15:117db924cf7c 549 {
wolfSSL 15:117db924cf7c 550 (void)m;
wolfSSL 15:117db924cf7c 551 return 0;
wolfSSL 15:117db924cf7c 552 }
wolfSSL 15:117db924cf7c 553
wolfSSL 15:117db924cf7c 554
wolfSSL 15:117db924cf7c 555 int wc_UnLockMutex(wolfSSL_Mutex *m)
wolfSSL 15:117db924cf7c 556 {
wolfSSL 15:117db924cf7c 557 (void)m;
wolfSSL 15:117db924cf7c 558 return 0;
wolfSSL 15:117db924cf7c 559 }
wolfSSL 15:117db924cf7c 560
wolfSSL 15:117db924cf7c 561 #elif defined(FREERTOS) || defined(FREERTOS_TCP) || \
wolfSSL 15:117db924cf7c 562 defined(FREESCALE_FREE_RTOS)
wolfSSL 15:117db924cf7c 563
wolfSSL 15:117db924cf7c 564 int wc_InitMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 565 {
wolfSSL 15:117db924cf7c 566 int iReturn;
wolfSSL 15:117db924cf7c 567
wolfSSL 15:117db924cf7c 568 *m = ( wolfSSL_Mutex ) xSemaphoreCreateMutex();
wolfSSL 15:117db924cf7c 569 if( *m != NULL )
wolfSSL 15:117db924cf7c 570 iReturn = 0;
wolfSSL 15:117db924cf7c 571 else
wolfSSL 15:117db924cf7c 572 iReturn = BAD_MUTEX_E;
wolfSSL 15:117db924cf7c 573
wolfSSL 15:117db924cf7c 574 return iReturn;
wolfSSL 15:117db924cf7c 575 }
wolfSSL 15:117db924cf7c 576
wolfSSL 15:117db924cf7c 577 int wc_FreeMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 578 {
wolfSSL 15:117db924cf7c 579 vSemaphoreDelete( *m );
wolfSSL 15:117db924cf7c 580 return 0;
wolfSSL 15:117db924cf7c 581 }
wolfSSL 15:117db924cf7c 582
wolfSSL 15:117db924cf7c 583 int wc_LockMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 584 {
wolfSSL 15:117db924cf7c 585 /* Assume an infinite block, or should there be zero block? */
wolfSSL 15:117db924cf7c 586 xSemaphoreTake( *m, portMAX_DELAY );
wolfSSL 15:117db924cf7c 587 return 0;
wolfSSL 15:117db924cf7c 588 }
wolfSSL 15:117db924cf7c 589
wolfSSL 15:117db924cf7c 590 int wc_UnLockMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 591 {
wolfSSL 15:117db924cf7c 592 xSemaphoreGive( *m );
wolfSSL 15:117db924cf7c 593 return 0;
wolfSSL 15:117db924cf7c 594 }
wolfSSL 15:117db924cf7c 595
wolfSSL 15:117db924cf7c 596 #elif defined(WOLFSSL_SAFERTOS)
wolfSSL 15:117db924cf7c 597
wolfSSL 15:117db924cf7c 598 int wc_InitMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 599 {
wolfSSL 15:117db924cf7c 600 vSemaphoreCreateBinary(m->mutexBuffer, m->mutex);
wolfSSL 15:117db924cf7c 601 if (m->mutex == NULL)
wolfSSL 15:117db924cf7c 602 return BAD_MUTEX_E;
wolfSSL 15:117db924cf7c 603
wolfSSL 15:117db924cf7c 604 return 0;
wolfSSL 15:117db924cf7c 605 }
wolfSSL 15:117db924cf7c 606
wolfSSL 15:117db924cf7c 607 int wc_FreeMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 608 {
wolfSSL 15:117db924cf7c 609 (void)m;
wolfSSL 15:117db924cf7c 610 return 0;
wolfSSL 15:117db924cf7c 611 }
wolfSSL 15:117db924cf7c 612
wolfSSL 15:117db924cf7c 613 int wc_LockMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 614 {
wolfSSL 15:117db924cf7c 615 /* Assume an infinite block */
wolfSSL 15:117db924cf7c 616 xSemaphoreTake(m->mutex, portMAX_DELAY);
wolfSSL 15:117db924cf7c 617 return 0;
wolfSSL 15:117db924cf7c 618 }
wolfSSL 15:117db924cf7c 619
wolfSSL 15:117db924cf7c 620 int wc_UnLockMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 621 {
wolfSSL 15:117db924cf7c 622 xSemaphoreGive(m->mutex);
wolfSSL 15:117db924cf7c 623 return 0;
wolfSSL 15:117db924cf7c 624 }
wolfSSL 15:117db924cf7c 625
wolfSSL 15:117db924cf7c 626 #elif defined(USE_WINDOWS_API)
wolfSSL 15:117db924cf7c 627
wolfSSL 15:117db924cf7c 628 int wc_InitMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 629 {
wolfSSL 15:117db924cf7c 630 InitializeCriticalSection(m);
wolfSSL 15:117db924cf7c 631 return 0;
wolfSSL 15:117db924cf7c 632 }
wolfSSL 15:117db924cf7c 633
wolfSSL 15:117db924cf7c 634
wolfSSL 15:117db924cf7c 635 int wc_FreeMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 636 {
wolfSSL 15:117db924cf7c 637 DeleteCriticalSection(m);
wolfSSL 15:117db924cf7c 638 return 0;
wolfSSL 15:117db924cf7c 639 }
wolfSSL 15:117db924cf7c 640
wolfSSL 15:117db924cf7c 641
wolfSSL 15:117db924cf7c 642 int wc_LockMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 643 {
wolfSSL 15:117db924cf7c 644 EnterCriticalSection(m);
wolfSSL 15:117db924cf7c 645 return 0;
wolfSSL 15:117db924cf7c 646 }
wolfSSL 15:117db924cf7c 647
wolfSSL 15:117db924cf7c 648
wolfSSL 15:117db924cf7c 649 int wc_UnLockMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 650 {
wolfSSL 15:117db924cf7c 651 LeaveCriticalSection(m);
wolfSSL 15:117db924cf7c 652 return 0;
wolfSSL 15:117db924cf7c 653 }
wolfSSL 15:117db924cf7c 654
wolfSSL 15:117db924cf7c 655 #elif defined(WOLFSSL_PTHREADS)
wolfSSL 15:117db924cf7c 656
wolfSSL 15:117db924cf7c 657 int wc_InitMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 658 {
wolfSSL 15:117db924cf7c 659 if (pthread_mutex_init(m, 0) == 0)
wolfSSL 15:117db924cf7c 660 return 0;
wolfSSL 15:117db924cf7c 661 else
wolfSSL 15:117db924cf7c 662 return BAD_MUTEX_E;
wolfSSL 15:117db924cf7c 663 }
wolfSSL 15:117db924cf7c 664
wolfSSL 15:117db924cf7c 665
wolfSSL 15:117db924cf7c 666 int wc_FreeMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 667 {
wolfSSL 15:117db924cf7c 668 if (pthread_mutex_destroy(m) == 0)
wolfSSL 15:117db924cf7c 669 return 0;
wolfSSL 15:117db924cf7c 670 else
wolfSSL 15:117db924cf7c 671 return BAD_MUTEX_E;
wolfSSL 15:117db924cf7c 672 }
wolfSSL 15:117db924cf7c 673
wolfSSL 15:117db924cf7c 674
wolfSSL 15:117db924cf7c 675 int wc_LockMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 676 {
wolfSSL 15:117db924cf7c 677 if (pthread_mutex_lock(m) == 0)
wolfSSL 15:117db924cf7c 678 return 0;
wolfSSL 15:117db924cf7c 679 else
wolfSSL 15:117db924cf7c 680 return BAD_MUTEX_E;
wolfSSL 15:117db924cf7c 681 }
wolfSSL 15:117db924cf7c 682
wolfSSL 15:117db924cf7c 683
wolfSSL 15:117db924cf7c 684 int wc_UnLockMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 685 {
wolfSSL 15:117db924cf7c 686 if (pthread_mutex_unlock(m) == 0)
wolfSSL 15:117db924cf7c 687 return 0;
wolfSSL 15:117db924cf7c 688 else
wolfSSL 15:117db924cf7c 689 return BAD_MUTEX_E;
wolfSSL 15:117db924cf7c 690 }
wolfSSL 15:117db924cf7c 691
wolfSSL 15:117db924cf7c 692 #elif defined(THREADX)
wolfSSL 15:117db924cf7c 693
wolfSSL 15:117db924cf7c 694 int wc_InitMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 695 {
wolfSSL 15:117db924cf7c 696 if (tx_mutex_create(m, "wolfSSL Mutex", TX_NO_INHERIT) == 0)
wolfSSL 15:117db924cf7c 697 return 0;
wolfSSL 15:117db924cf7c 698 else
wolfSSL 15:117db924cf7c 699 return BAD_MUTEX_E;
wolfSSL 15:117db924cf7c 700 }
wolfSSL 15:117db924cf7c 701
wolfSSL 15:117db924cf7c 702
wolfSSL 15:117db924cf7c 703 int wc_FreeMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 704 {
wolfSSL 15:117db924cf7c 705 if (tx_mutex_delete(m) == 0)
wolfSSL 15:117db924cf7c 706 return 0;
wolfSSL 15:117db924cf7c 707 else
wolfSSL 15:117db924cf7c 708 return BAD_MUTEX_E;
wolfSSL 15:117db924cf7c 709 }
wolfSSL 15:117db924cf7c 710
wolfSSL 15:117db924cf7c 711
wolfSSL 15:117db924cf7c 712 int wc_LockMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 713 {
wolfSSL 15:117db924cf7c 714 if (tx_mutex_get(m, TX_WAIT_FOREVER) == 0)
wolfSSL 15:117db924cf7c 715 return 0;
wolfSSL 15:117db924cf7c 716 else
wolfSSL 15:117db924cf7c 717 return BAD_MUTEX_E;
wolfSSL 15:117db924cf7c 718 }
wolfSSL 15:117db924cf7c 719
wolfSSL 15:117db924cf7c 720 int wc_UnLockMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 721 {
wolfSSL 15:117db924cf7c 722 if (tx_mutex_put(m) == 0)
wolfSSL 15:117db924cf7c 723 return 0;
wolfSSL 15:117db924cf7c 724 else
wolfSSL 15:117db924cf7c 725 return BAD_MUTEX_E;
wolfSSL 15:117db924cf7c 726 }
wolfSSL 15:117db924cf7c 727
wolfSSL 15:117db924cf7c 728 #elif defined(MICRIUM)
wolfSSL 15:117db924cf7c 729
wolfSSL 15:117db924cf7c 730 int wc_InitMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 731 {
wolfSSL 15:117db924cf7c 732 OS_ERR err;
wolfSSL 15:117db924cf7c 733
wolfSSL 15:117db924cf7c 734 OSMutexCreate(m, "wolfSSL Mutex", &err);
wolfSSL 15:117db924cf7c 735
wolfSSL 15:117db924cf7c 736 if (err == OS_ERR_NONE)
wolfSSL 15:117db924cf7c 737 return 0;
wolfSSL 15:117db924cf7c 738 else
wolfSSL 15:117db924cf7c 739 return BAD_MUTEX_E;
wolfSSL 15:117db924cf7c 740 }
wolfSSL 15:117db924cf7c 741
wolfSSL 15:117db924cf7c 742 int wc_FreeMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 743 {
wolfSSL 15:117db924cf7c 744 #if (OS_CFG_MUTEX_DEL_EN == DEF_ENABLED)
wolfSSL 15:117db924cf7c 745 OS_ERR err;
wolfSSL 15:117db924cf7c 746
wolfSSL 15:117db924cf7c 747 OSMutexDel(m, OS_OPT_DEL_ALWAYS, &err);
wolfSSL 15:117db924cf7c 748
wolfSSL 15:117db924cf7c 749 if (err == OS_ERR_NONE)
wolfSSL 15:117db924cf7c 750 return 0;
wolfSSL 15:117db924cf7c 751 else
wolfSSL 15:117db924cf7c 752 return BAD_MUTEX_E;
wolfSSL 15:117db924cf7c 753 #else
wolfSSL 15:117db924cf7c 754 return 0;
wolfSSL 15:117db924cf7c 755 #endif
wolfSSL 15:117db924cf7c 756 }
wolfSSL 15:117db924cf7c 757
wolfSSL 15:117db924cf7c 758 int wc_LockMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 759 {
wolfSSL 15:117db924cf7c 760 OS_ERR err;
wolfSSL 15:117db924cf7c 761
wolfSSL 15:117db924cf7c 762 OSMutexPend(m, 0, OS_OPT_PEND_BLOCKING, NULL, &err);
wolfSSL 15:117db924cf7c 763
wolfSSL 15:117db924cf7c 764 if (err == OS_ERR_NONE)
wolfSSL 15:117db924cf7c 765 return 0;
wolfSSL 15:117db924cf7c 766 else
wolfSSL 15:117db924cf7c 767 return BAD_MUTEX_E;
wolfSSL 15:117db924cf7c 768 }
wolfSSL 15:117db924cf7c 769
wolfSSL 15:117db924cf7c 770 int wc_UnLockMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 771 {
wolfSSL 15:117db924cf7c 772 OS_ERR err;
wolfSSL 15:117db924cf7c 773
wolfSSL 15:117db924cf7c 774 OSMutexPost(m, OS_OPT_POST_NONE, &err);
wolfSSL 15:117db924cf7c 775
wolfSSL 15:117db924cf7c 776 if (err == OS_ERR_NONE)
wolfSSL 15:117db924cf7c 777 return 0;
wolfSSL 15:117db924cf7c 778 else
wolfSSL 15:117db924cf7c 779 return BAD_MUTEX_E;
wolfSSL 15:117db924cf7c 780 }
wolfSSL 15:117db924cf7c 781
wolfSSL 15:117db924cf7c 782 #elif defined(EBSNET)
wolfSSL 15:117db924cf7c 783
wolfSSL 15:117db924cf7c 784 int wc_InitMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 785 {
wolfSSL 15:117db924cf7c 786 if (rtp_sig_mutex_alloc(m, "wolfSSL Mutex") == -1)
wolfSSL 15:117db924cf7c 787 return BAD_MUTEX_E;
wolfSSL 15:117db924cf7c 788 else
wolfSSL 15:117db924cf7c 789 return 0;
wolfSSL 15:117db924cf7c 790 }
wolfSSL 15:117db924cf7c 791
wolfSSL 15:117db924cf7c 792 int wc_FreeMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 793 {
wolfSSL 15:117db924cf7c 794 rtp_sig_mutex_free(*m);
wolfSSL 15:117db924cf7c 795 return 0;
wolfSSL 15:117db924cf7c 796 }
wolfSSL 15:117db924cf7c 797
wolfSSL 15:117db924cf7c 798 int wc_LockMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 799 {
wolfSSL 15:117db924cf7c 800 if (rtp_sig_mutex_claim_timed(*m, RTIP_INF) == 0)
wolfSSL 15:117db924cf7c 801 return 0;
wolfSSL 15:117db924cf7c 802 else
wolfSSL 15:117db924cf7c 803 return BAD_MUTEX_E;
wolfSSL 15:117db924cf7c 804 }
wolfSSL 15:117db924cf7c 805
wolfSSL 15:117db924cf7c 806 int wc_UnLockMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 807 {
wolfSSL 15:117db924cf7c 808 rtp_sig_mutex_release(*m);
wolfSSL 15:117db924cf7c 809 return 0;
wolfSSL 15:117db924cf7c 810 }
wolfSSL 15:117db924cf7c 811
wolfSSL 15:117db924cf7c 812 #elif defined(FREESCALE_MQX) || defined(FREESCALE_KSDK_MQX)
wolfSSL 15:117db924cf7c 813
wolfSSL 15:117db924cf7c 814 int wc_InitMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 815 {
wolfSSL 15:117db924cf7c 816 if (_mutex_init(m, NULL) == MQX_EOK)
wolfSSL 15:117db924cf7c 817 return 0;
wolfSSL 15:117db924cf7c 818 else
wolfSSL 15:117db924cf7c 819 return BAD_MUTEX_E;
wolfSSL 15:117db924cf7c 820 }
wolfSSL 15:117db924cf7c 821
wolfSSL 15:117db924cf7c 822 int wc_FreeMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 823 {
wolfSSL 15:117db924cf7c 824 if (_mutex_destroy(m) == MQX_EOK)
wolfSSL 15:117db924cf7c 825 return 0;
wolfSSL 15:117db924cf7c 826 else
wolfSSL 15:117db924cf7c 827 return BAD_MUTEX_E;
wolfSSL 15:117db924cf7c 828 }
wolfSSL 15:117db924cf7c 829
wolfSSL 15:117db924cf7c 830 int wc_LockMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 831 {
wolfSSL 15:117db924cf7c 832 if (_mutex_lock(m) == MQX_EOK)
wolfSSL 15:117db924cf7c 833 return 0;
wolfSSL 15:117db924cf7c 834 else
wolfSSL 15:117db924cf7c 835 return BAD_MUTEX_E;
wolfSSL 15:117db924cf7c 836 }
wolfSSL 15:117db924cf7c 837
wolfSSL 15:117db924cf7c 838 int wc_UnLockMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 839 {
wolfSSL 15:117db924cf7c 840 if (_mutex_unlock(m) == MQX_EOK)
wolfSSL 15:117db924cf7c 841 return 0;
wolfSSL 15:117db924cf7c 842 else
wolfSSL 15:117db924cf7c 843 return BAD_MUTEX_E;
wolfSSL 15:117db924cf7c 844 }
wolfSSL 15:117db924cf7c 845
wolfSSL 15:117db924cf7c 846 #elif defined(WOLFSSL_TIRTOS)
wolfSSL 15:117db924cf7c 847 #include <xdc/runtime/Error.h>
wolfSSL 15:117db924cf7c 848
wolfSSL 15:117db924cf7c 849 int wc_InitMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 850 {
wolfSSL 15:117db924cf7c 851 Semaphore_Params params;
wolfSSL 15:117db924cf7c 852 Error_Block eb;
wolfSSL 15:117db924cf7c 853
wolfSSL 15:117db924cf7c 854 Error_init(&eb);
wolfSSL 15:117db924cf7c 855 Semaphore_Params_init(&params);
wolfSSL 15:117db924cf7c 856 params.mode = Semaphore_Mode_BINARY;
wolfSSL 15:117db924cf7c 857
wolfSSL 15:117db924cf7c 858 *m = Semaphore_create(1, &params, &eb);
wolfSSL 15:117db924cf7c 859 if (Error_check(&eb)) {
wolfSSL 15:117db924cf7c 860 Error_raise(&eb, Error_E_generic, "Failed to Create the semaphore.",
wolfSSL 15:117db924cf7c 861 NULL);
wolfSSL 15:117db924cf7c 862 return BAD_MUTEX_E;
wolfSSL 15:117db924cf7c 863 }
wolfSSL 15:117db924cf7c 864 else
wolfSSL 15:117db924cf7c 865 return 0;
wolfSSL 15:117db924cf7c 866 }
wolfSSL 15:117db924cf7c 867
wolfSSL 15:117db924cf7c 868 int wc_FreeMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 869 {
wolfSSL 15:117db924cf7c 870 Semaphore_delete(m);
wolfSSL 15:117db924cf7c 871
wolfSSL 15:117db924cf7c 872 return 0;
wolfSSL 15:117db924cf7c 873 }
wolfSSL 15:117db924cf7c 874
wolfSSL 15:117db924cf7c 875 int wc_LockMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 876 {
wolfSSL 15:117db924cf7c 877 Semaphore_pend(*m, BIOS_WAIT_FOREVER);
wolfSSL 15:117db924cf7c 878
wolfSSL 15:117db924cf7c 879 return 0;
wolfSSL 15:117db924cf7c 880 }
wolfSSL 15:117db924cf7c 881
wolfSSL 15:117db924cf7c 882 int wc_UnLockMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 883 {
wolfSSL 15:117db924cf7c 884 Semaphore_post(*m);
wolfSSL 15:117db924cf7c 885
wolfSSL 15:117db924cf7c 886 return 0;
wolfSSL 15:117db924cf7c 887 }
wolfSSL 15:117db924cf7c 888
wolfSSL 15:117db924cf7c 889 #elif defined(WOLFSSL_uITRON4)
wolfSSL 15:117db924cf7c 890
wolfSSL 15:117db924cf7c 891 int wc_InitMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 892 {
wolfSSL 15:117db924cf7c 893 int iReturn;
wolfSSL 15:117db924cf7c 894 m->sem.sematr = TA_TFIFO;
wolfSSL 15:117db924cf7c 895 m->sem.isemcnt = 1;
wolfSSL 15:117db924cf7c 896 m->sem.maxsem = 1;
wolfSSL 15:117db924cf7c 897 m->sem.name = NULL;
wolfSSL 15:117db924cf7c 898
wolfSSL 15:117db924cf7c 899 m->id = acre_sem(&m->sem);
wolfSSL 15:117db924cf7c 900 if( m->id != E_OK )
wolfSSL 15:117db924cf7c 901 iReturn = 0;
wolfSSL 15:117db924cf7c 902 else
wolfSSL 15:117db924cf7c 903 iReturn = BAD_MUTEX_E;
wolfSSL 15:117db924cf7c 904
wolfSSL 15:117db924cf7c 905 return iReturn;
wolfSSL 15:117db924cf7c 906 }
wolfSSL 15:117db924cf7c 907
wolfSSL 15:117db924cf7c 908 int wc_FreeMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 909 {
wolfSSL 15:117db924cf7c 910 del_sem( m->id );
wolfSSL 15:117db924cf7c 911 return 0;
wolfSSL 15:117db924cf7c 912 }
wolfSSL 15:117db924cf7c 913
wolfSSL 15:117db924cf7c 914 int wc_LockMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 915 {
wolfSSL 15:117db924cf7c 916 wai_sem(m->id);
wolfSSL 15:117db924cf7c 917 return 0;
wolfSSL 15:117db924cf7c 918 }
wolfSSL 15:117db924cf7c 919
wolfSSL 15:117db924cf7c 920 int wc_UnLockMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 921 {
wolfSSL 15:117db924cf7c 922 sig_sem(m->id);
wolfSSL 15:117db924cf7c 923 return 0;
wolfSSL 15:117db924cf7c 924 }
wolfSSL 15:117db924cf7c 925
wolfSSL 15:117db924cf7c 926 /**** uITRON malloc/free ***/
wolfSSL 15:117db924cf7c 927 static ID ID_wolfssl_MPOOL = 0;
wolfSSL 15:117db924cf7c 928 static T_CMPL wolfssl_MPOOL = {TA_TFIFO, 0, NULL, "wolfSSL_MPOOL"};
wolfSSL 15:117db924cf7c 929
wolfSSL 15:117db924cf7c 930 int uITRON4_minit(size_t poolsz) {
wolfSSL 15:117db924cf7c 931 ER ercd;
wolfSSL 15:117db924cf7c 932 wolfssl_MPOOL.mplsz = poolsz;
wolfSSL 15:117db924cf7c 933 ercd = acre_mpl(&wolfssl_MPOOL);
wolfSSL 15:117db924cf7c 934 if (ercd > 0) {
wolfSSL 15:117db924cf7c 935 ID_wolfssl_MPOOL = ercd;
wolfSSL 15:117db924cf7c 936 return 0;
wolfSSL 15:117db924cf7c 937 } else {
wolfSSL 15:117db924cf7c 938 return -1;
wolfSSL 15:117db924cf7c 939 }
wolfSSL 15:117db924cf7c 940 }
wolfSSL 15:117db924cf7c 941
wolfSSL 15:117db924cf7c 942 void *uITRON4_malloc(size_t sz) {
wolfSSL 15:117db924cf7c 943 ER ercd;
wolfSSL 15:117db924cf7c 944 void *p;
wolfSSL 15:117db924cf7c 945 ercd = get_mpl(ID_wolfssl_MPOOL, sz, (VP)&p);
wolfSSL 15:117db924cf7c 946 if (ercd == E_OK) {
wolfSSL 15:117db924cf7c 947 return p;
wolfSSL 15:117db924cf7c 948 } else {
wolfSSL 15:117db924cf7c 949 return 0;
wolfSSL 15:117db924cf7c 950 }
wolfSSL 15:117db924cf7c 951 }
wolfSSL 15:117db924cf7c 952
wolfSSL 15:117db924cf7c 953 void *uITRON4_realloc(void *p, size_t sz) {
wolfSSL 15:117db924cf7c 954 ER ercd;
wolfSSL 15:117db924cf7c 955 void *newp;
wolfSSL 15:117db924cf7c 956 if(p) {
wolfSSL 15:117db924cf7c 957 ercd = get_mpl(ID_wolfssl_MPOOL, sz, (VP)&newp);
wolfSSL 15:117db924cf7c 958 if (ercd == E_OK) {
wolfSSL 15:117db924cf7c 959 XMEMCPY(newp, p, sz);
wolfSSL 15:117db924cf7c 960 ercd = rel_mpl(ID_wolfssl_MPOOL, (VP)p);
wolfSSL 15:117db924cf7c 961 if (ercd == E_OK) {
wolfSSL 15:117db924cf7c 962 return newp;
wolfSSL 15:117db924cf7c 963 }
wolfSSL 15:117db924cf7c 964 }
wolfSSL 15:117db924cf7c 965 }
wolfSSL 15:117db924cf7c 966 return 0;
wolfSSL 15:117db924cf7c 967 }
wolfSSL 15:117db924cf7c 968
wolfSSL 15:117db924cf7c 969 void uITRON4_free(void *p) {
wolfSSL 15:117db924cf7c 970 ER ercd;
wolfSSL 15:117db924cf7c 971 ercd = rel_mpl(ID_wolfssl_MPOOL, (VP)p);
wolfSSL 15:117db924cf7c 972 if (ercd == E_OK) {
wolfSSL 15:117db924cf7c 973 return;
wolfSSL 15:117db924cf7c 974 } else {
wolfSSL 15:117db924cf7c 975 return;
wolfSSL 15:117db924cf7c 976 }
wolfSSL 15:117db924cf7c 977 }
wolfSSL 15:117db924cf7c 978
wolfSSL 15:117db924cf7c 979 #elif defined(WOLFSSL_uTKERNEL2)
wolfSSL 15:117db924cf7c 980
wolfSSL 15:117db924cf7c 981 int wc_InitMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 982 {
wolfSSL 15:117db924cf7c 983 int iReturn;
wolfSSL 15:117db924cf7c 984 m->sem.sematr = TA_TFIFO;
wolfSSL 15:117db924cf7c 985 m->sem.isemcnt = 1;
wolfSSL 15:117db924cf7c 986 m->sem.maxsem = 1;
wolfSSL 15:117db924cf7c 987
wolfSSL 15:117db924cf7c 988 m->id = tk_cre_sem(&m->sem);
wolfSSL 15:117db924cf7c 989 if( m->id != NULL )
wolfSSL 15:117db924cf7c 990 iReturn = 0;
wolfSSL 15:117db924cf7c 991 else
wolfSSL 15:117db924cf7c 992 iReturn = BAD_MUTEX_E;
wolfSSL 15:117db924cf7c 993
wolfSSL 15:117db924cf7c 994 return iReturn;
wolfSSL 15:117db924cf7c 995 }
wolfSSL 15:117db924cf7c 996
wolfSSL 15:117db924cf7c 997 int wc_FreeMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 998 {
wolfSSL 15:117db924cf7c 999 tk_del_sem(m->id);
wolfSSL 15:117db924cf7c 1000 return 0;
wolfSSL 15:117db924cf7c 1001 }
wolfSSL 15:117db924cf7c 1002
wolfSSL 15:117db924cf7c 1003 int wc_LockMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 1004 {
wolfSSL 15:117db924cf7c 1005 tk_wai_sem(m->id, 1, TMO_FEVR);
wolfSSL 15:117db924cf7c 1006 return 0;
wolfSSL 15:117db924cf7c 1007 }
wolfSSL 15:117db924cf7c 1008
wolfSSL 15:117db924cf7c 1009 int wc_UnLockMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 1010 {
wolfSSL 15:117db924cf7c 1011 tk_sig_sem(m->id, 1);
wolfSSL 15:117db924cf7c 1012 return 0;
wolfSSL 15:117db924cf7c 1013 }
wolfSSL 15:117db924cf7c 1014
wolfSSL 15:117db924cf7c 1015 /**** uT-Kernel malloc/free ***/
wolfSSL 15:117db924cf7c 1016 static ID ID_wolfssl_MPOOL = 0;
wolfSSL 15:117db924cf7c 1017 static T_CMPL wolfssl_MPOOL = {
wolfSSL 15:117db924cf7c 1018 NULL, /* Extended information */
wolfSSL 15:117db924cf7c 1019 TA_TFIFO, /* Memory pool attribute */
wolfSSL 15:117db924cf7c 1020 0, /* Size of whole memory pool (byte) */
wolfSSL 15:117db924cf7c 1021 "wolfSSL" /* Object name (max 8-char) */
wolfSSL 15:117db924cf7c 1022 };
wolfSSL 15:117db924cf7c 1023
wolfSSL 15:117db924cf7c 1024 int uTKernel_init_mpool(unsigned int sz) {
wolfSSL 15:117db924cf7c 1025 ER ercd;
wolfSSL 15:117db924cf7c 1026 wolfssl_MPOOL.mplsz = sz;
wolfSSL 15:117db924cf7c 1027 ercd = tk_cre_mpl(&wolfssl_MPOOL);
wolfSSL 15:117db924cf7c 1028 if (ercd > 0) {
wolfSSL 15:117db924cf7c 1029 ID_wolfssl_MPOOL = ercd;
wolfSSL 15:117db924cf7c 1030 return 0;
wolfSSL 15:117db924cf7c 1031 } else {
wolfSSL 15:117db924cf7c 1032 return (int)ercd;
wolfSSL 15:117db924cf7c 1033 }
wolfSSL 15:117db924cf7c 1034 }
wolfSSL 15:117db924cf7c 1035
wolfSSL 15:117db924cf7c 1036 void *uTKernel_malloc(unsigned int sz) {
wolfSSL 15:117db924cf7c 1037 ER ercd;
wolfSSL 15:117db924cf7c 1038 void *p;
wolfSSL 15:117db924cf7c 1039 ercd = tk_get_mpl(ID_wolfssl_MPOOL, sz, (VP)&p, TMO_FEVR);
wolfSSL 15:117db924cf7c 1040 if (ercd == E_OK) {
wolfSSL 15:117db924cf7c 1041 return p;
wolfSSL 15:117db924cf7c 1042 } else {
wolfSSL 15:117db924cf7c 1043 return 0;
wolfSSL 15:117db924cf7c 1044 }
wolfSSL 15:117db924cf7c 1045 }
wolfSSL 15:117db924cf7c 1046
wolfSSL 15:117db924cf7c 1047 void *uTKernel_realloc(void *p, unsigned int sz) {
wolfSSL 15:117db924cf7c 1048 ER ercd;
wolfSSL 15:117db924cf7c 1049 void *newp;
wolfSSL 15:117db924cf7c 1050 if (p) {
wolfSSL 15:117db924cf7c 1051 ercd = tk_get_mpl(ID_wolfssl_MPOOL, sz, (VP)&newp, TMO_FEVR);
wolfSSL 15:117db924cf7c 1052 if (ercd == E_OK) {
wolfSSL 15:117db924cf7c 1053 XMEMCPY(newp, p, sz);
wolfSSL 15:117db924cf7c 1054 ercd = tk_rel_mpl(ID_wolfssl_MPOOL, (VP)p);
wolfSSL 15:117db924cf7c 1055 if (ercd == E_OK) {
wolfSSL 15:117db924cf7c 1056 return newp;
wolfSSL 15:117db924cf7c 1057 }
wolfSSL 15:117db924cf7c 1058 }
wolfSSL 15:117db924cf7c 1059 }
wolfSSL 15:117db924cf7c 1060 return 0;
wolfSSL 15:117db924cf7c 1061 }
wolfSSL 15:117db924cf7c 1062
wolfSSL 15:117db924cf7c 1063 void uTKernel_free(void *p) {
wolfSSL 15:117db924cf7c 1064 ER ercd;
wolfSSL 15:117db924cf7c 1065 ercd = tk_rel_mpl(ID_wolfssl_MPOOL, (VP)p);
wolfSSL 15:117db924cf7c 1066 if (ercd == E_OK) {
wolfSSL 15:117db924cf7c 1067 return;
wolfSSL 15:117db924cf7c 1068 } else {
wolfSSL 15:117db924cf7c 1069 return;
wolfSSL 15:117db924cf7c 1070 }
wolfSSL 15:117db924cf7c 1071 }
wolfSSL 15:117db924cf7c 1072
wolfSSL 15:117db924cf7c 1073 #elif defined (WOLFSSL_FROSTED)
wolfSSL 15:117db924cf7c 1074
wolfSSL 15:117db924cf7c 1075 int wc_InitMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 1076 {
wolfSSL 15:117db924cf7c 1077 *m = mutex_init();
wolfSSL 15:117db924cf7c 1078 if (*m)
wolfSSL 15:117db924cf7c 1079 return 0;
wolfSSL 15:117db924cf7c 1080 else
wolfSSL 15:117db924cf7c 1081 return -1;
wolfSSL 15:117db924cf7c 1082 }
wolfSSL 15:117db924cf7c 1083
wolfSSL 15:117db924cf7c 1084 int wc_FreeMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 1085 {
wolfSSL 15:117db924cf7c 1086 mutex_destroy(*m);
wolfSSL 15:117db924cf7c 1087 return(0);
wolfSSL 15:117db924cf7c 1088 }
wolfSSL 15:117db924cf7c 1089
wolfSSL 15:117db924cf7c 1090 int wc_LockMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 1091 {
wolfSSL 15:117db924cf7c 1092 mutex_lock(*m);
wolfSSL 15:117db924cf7c 1093 return 0;
wolfSSL 15:117db924cf7c 1094 }
wolfSSL 15:117db924cf7c 1095
wolfSSL 15:117db924cf7c 1096 int wc_UnLockMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 1097 {
wolfSSL 15:117db924cf7c 1098 mutex_unlock(*m);
wolfSSL 15:117db924cf7c 1099 return 0;
wolfSSL 15:117db924cf7c 1100 }
wolfSSL 15:117db924cf7c 1101
wolfSSL 15:117db924cf7c 1102 #elif defined(WOLFSSL_CMSIS_RTOS)
wolfSSL 15:117db924cf7c 1103
wolfSSL 15:117db924cf7c 1104 #define CMSIS_NMUTEX 10
wolfSSL 15:117db924cf7c 1105 osMutexDef(wolfSSL_mt0); osMutexDef(wolfSSL_mt1); osMutexDef(wolfSSL_mt2);
wolfSSL 15:117db924cf7c 1106 osMutexDef(wolfSSL_mt3); osMutexDef(wolfSSL_mt4); osMutexDef(wolfSSL_mt5);
wolfSSL 15:117db924cf7c 1107 osMutexDef(wolfSSL_mt6); osMutexDef(wolfSSL_mt7); osMutexDef(wolfSSL_mt8);
wolfSSL 15:117db924cf7c 1108 osMutexDef(wolfSSL_mt9);
wolfSSL 15:117db924cf7c 1109
wolfSSL 15:117db924cf7c 1110 static const osMutexDef_t *CMSIS_mutex[] = { osMutex(wolfSSL_mt0),
wolfSSL 15:117db924cf7c 1111 osMutex(wolfSSL_mt1), osMutex(wolfSSL_mt2), osMutex(wolfSSL_mt3),
wolfSSL 15:117db924cf7c 1112 osMutex(wolfSSL_mt4), osMutex(wolfSSL_mt5), osMutex(wolfSSL_mt6),
wolfSSL 15:117db924cf7c 1113 osMutex(wolfSSL_mt7), osMutex(wolfSSL_mt8), osMutex(wolfSSL_mt9) };
wolfSSL 15:117db924cf7c 1114
wolfSSL 15:117db924cf7c 1115 static osMutexId CMSIS_mutexID[CMSIS_NMUTEX] = {0};
wolfSSL 15:117db924cf7c 1116
wolfSSL 15:117db924cf7c 1117 int wc_InitMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 1118 {
wolfSSL 15:117db924cf7c 1119 int i;
wolfSSL 15:117db924cf7c 1120 for (i=0; i<CMSIS_NMUTEX; i++) {
wolfSSL 15:117db924cf7c 1121 if(CMSIS_mutexID[i] == 0) {
wolfSSL 15:117db924cf7c 1122 CMSIS_mutexID[i] = osMutexCreate(CMSIS_mutex[i]);
wolfSSL 15:117db924cf7c 1123 (*m) = CMSIS_mutexID[i];
wolfSSL 15:117db924cf7c 1124 return 0;
wolfSSL 15:117db924cf7c 1125 }
wolfSSL 15:117db924cf7c 1126 }
wolfSSL 15:117db924cf7c 1127 return -1;
wolfSSL 15:117db924cf7c 1128 }
wolfSSL 15:117db924cf7c 1129
wolfSSL 15:117db924cf7c 1130 int wc_FreeMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 1131 {
wolfSSL 15:117db924cf7c 1132 int i;
wolfSSL 15:117db924cf7c 1133 osMutexDelete (*m);
wolfSSL 15:117db924cf7c 1134 for (i=0; i<CMSIS_NMUTEX; i++) {
wolfSSL 15:117db924cf7c 1135 if(CMSIS_mutexID[i] == (*m)) {
wolfSSL 15:117db924cf7c 1136 CMSIS_mutexID[i] = 0;
wolfSSL 15:117db924cf7c 1137 return(0);
wolfSSL 15:117db924cf7c 1138 }
wolfSSL 15:117db924cf7c 1139 }
wolfSSL 15:117db924cf7c 1140 return(-1);
wolfSSL 15:117db924cf7c 1141 }
wolfSSL 15:117db924cf7c 1142
wolfSSL 15:117db924cf7c 1143 int wc_LockMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 1144 {
wolfSSL 15:117db924cf7c 1145 osMutexWait(*m, osWaitForever);
wolfSSL 15:117db924cf7c 1146 return(0);
wolfSSL 15:117db924cf7c 1147 }
wolfSSL 15:117db924cf7c 1148
wolfSSL 15:117db924cf7c 1149 int wc_UnLockMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 1150 {
wolfSSL 15:117db924cf7c 1151 osMutexRelease (*m);
wolfSSL 15:117db924cf7c 1152 return 0;
wolfSSL 15:117db924cf7c 1153 }
wolfSSL 15:117db924cf7c 1154
wolfSSL 15:117db924cf7c 1155 #elif defined(WOLFSSL_MDK_ARM)
wolfSSL 15:117db924cf7c 1156
wolfSSL 15:117db924cf7c 1157 int wc_InitMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 1158 {
wolfSSL 15:117db924cf7c 1159 os_mut_init (m);
wolfSSL 15:117db924cf7c 1160 return 0;
wolfSSL 15:117db924cf7c 1161 }
wolfSSL 15:117db924cf7c 1162
wolfSSL 15:117db924cf7c 1163 int wc_FreeMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 1164 {
wolfSSL 15:117db924cf7c 1165 return(0);
wolfSSL 15:117db924cf7c 1166 }
wolfSSL 15:117db924cf7c 1167
wolfSSL 15:117db924cf7c 1168 int wc_LockMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 1169 {
wolfSSL 15:117db924cf7c 1170 os_mut_wait (m, 0xffff);
wolfSSL 15:117db924cf7c 1171 return(0);
wolfSSL 15:117db924cf7c 1172 }
wolfSSL 15:117db924cf7c 1173
wolfSSL 15:117db924cf7c 1174 int wc_UnLockMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 1175 {
wolfSSL 15:117db924cf7c 1176 os_mut_release (m);
wolfSSL 15:117db924cf7c 1177 return 0;
wolfSSL 15:117db924cf7c 1178 }
wolfSSL 15:117db924cf7c 1179
wolfSSL 15:117db924cf7c 1180 #elif defined(INTIME_RTOS)
wolfSSL 15:117db924cf7c 1181
wolfSSL 15:117db924cf7c 1182 int wc_InitMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 1183 {
wolfSSL 15:117db924cf7c 1184 int ret = 0;
wolfSSL 15:117db924cf7c 1185
wolfSSL 15:117db924cf7c 1186 if (m == NULL)
wolfSSL 15:117db924cf7c 1187 return BAD_FUNC_ARG;
wolfSSL 15:117db924cf7c 1188
wolfSSL 15:117db924cf7c 1189 *m = CreateRtSemaphore(
wolfSSL 15:117db924cf7c 1190 1, /* initial unit count */
wolfSSL 15:117db924cf7c 1191 1, /* maximum unit count */
wolfSSL 15:117db924cf7c 1192 PRIORITY_QUEUING /* creation flags: FIFO_QUEUING or PRIORITY_QUEUING */
wolfSSL 15:117db924cf7c 1193 );
wolfSSL 15:117db924cf7c 1194 if (*m == BAD_RTHANDLE) {
wolfSSL 15:117db924cf7c 1195 ret = GetLastRtError();
wolfSSL 15:117db924cf7c 1196 if (ret != E_OK)
wolfSSL 15:117db924cf7c 1197 ret = BAD_MUTEX_E;
wolfSSL 15:117db924cf7c 1198 }
wolfSSL 15:117db924cf7c 1199 return ret;
wolfSSL 15:117db924cf7c 1200 }
wolfSSL 15:117db924cf7c 1201
wolfSSL 15:117db924cf7c 1202 int wc_FreeMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 1203 {
wolfSSL 15:117db924cf7c 1204 int ret = 0;
wolfSSL 15:117db924cf7c 1205 BOOLEAN del;
wolfSSL 15:117db924cf7c 1206
wolfSSL 15:117db924cf7c 1207 if (m == NULL)
wolfSSL 15:117db924cf7c 1208 return BAD_FUNC_ARG;
wolfSSL 15:117db924cf7c 1209
wolfSSL 15:117db924cf7c 1210 del = DeleteRtSemaphore(
wolfSSL 15:117db924cf7c 1211 *m /* handle for RT semaphore */
wolfSSL 15:117db924cf7c 1212 );
wolfSSL 15:117db924cf7c 1213 if (del != TRUE)
wolfSSL 15:117db924cf7c 1214 ret = BAD_MUTEX_E;
wolfSSL 15:117db924cf7c 1215
wolfSSL 15:117db924cf7c 1216 return ret;
wolfSSL 15:117db924cf7c 1217 }
wolfSSL 15:117db924cf7c 1218
wolfSSL 15:117db924cf7c 1219 int wc_LockMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 1220 {
wolfSSL 15:117db924cf7c 1221 int ret = 0;
wolfSSL 15:117db924cf7c 1222 DWORD lck;
wolfSSL 15:117db924cf7c 1223
wolfSSL 15:117db924cf7c 1224 if (m == NULL)
wolfSSL 15:117db924cf7c 1225 return BAD_FUNC_ARG;
wolfSSL 15:117db924cf7c 1226
wolfSSL 15:117db924cf7c 1227 lck = WaitForRtSemaphore(
wolfSSL 15:117db924cf7c 1228 *m, /* handle for RT semaphore */
wolfSSL 15:117db924cf7c 1229 1, /* number of units to wait for */
wolfSSL 15:117db924cf7c 1230 WAIT_FOREVER /* number of milliseconds to wait for units */
wolfSSL 15:117db924cf7c 1231 );
wolfSSL 15:117db924cf7c 1232 if (lck == WAIT_FAILED) {
wolfSSL 15:117db924cf7c 1233 ret = GetLastRtError();
wolfSSL 15:117db924cf7c 1234 if (ret != E_OK)
wolfSSL 15:117db924cf7c 1235 ret = BAD_MUTEX_E;
wolfSSL 15:117db924cf7c 1236 }
wolfSSL 15:117db924cf7c 1237 return ret;
wolfSSL 15:117db924cf7c 1238 }
wolfSSL 15:117db924cf7c 1239
wolfSSL 15:117db924cf7c 1240 int wc_UnLockMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 1241 {
wolfSSL 15:117db924cf7c 1242 int ret = 0;
wolfSSL 15:117db924cf7c 1243 BOOLEAN rel;
wolfSSL 15:117db924cf7c 1244
wolfSSL 15:117db924cf7c 1245 if (m == NULL)
wolfSSL 15:117db924cf7c 1246 return BAD_FUNC_ARG;
wolfSSL 15:117db924cf7c 1247
wolfSSL 15:117db924cf7c 1248 rel = ReleaseRtSemaphore(
wolfSSL 15:117db924cf7c 1249 *m, /* handle for RT semaphore */
wolfSSL 15:117db924cf7c 1250 1 /* number of units to release to semaphore */
wolfSSL 15:117db924cf7c 1251 );
wolfSSL 15:117db924cf7c 1252 if (rel != TRUE)
wolfSSL 15:117db924cf7c 1253 ret = BAD_MUTEX_E;
wolfSSL 15:117db924cf7c 1254
wolfSSL 15:117db924cf7c 1255 return ret;
wolfSSL 15:117db924cf7c 1256 }
wolfSSL 15:117db924cf7c 1257
wolfSSL 15:117db924cf7c 1258 #elif defined(WOLFSSL_NUCLEUS_1_2)
wolfSSL 15:117db924cf7c 1259
wolfSSL 15:117db924cf7c 1260 int wc_InitMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 1261 {
wolfSSL 15:117db924cf7c 1262 /* Call the Nucleus function to create the semaphore */
wolfSSL 15:117db924cf7c 1263 if (NU_Create_Semaphore(m, "WOLFSSL_MTX", 1,
wolfSSL 15:117db924cf7c 1264 NU_PRIORITY) == NU_SUCCESS) {
wolfSSL 15:117db924cf7c 1265 return 0;
wolfSSL 15:117db924cf7c 1266 }
wolfSSL 15:117db924cf7c 1267
wolfSSL 15:117db924cf7c 1268 return BAD_MUTEX_E;
wolfSSL 15:117db924cf7c 1269 }
wolfSSL 15:117db924cf7c 1270
wolfSSL 15:117db924cf7c 1271 int wc_FreeMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 1272 {
wolfSSL 15:117db924cf7c 1273 if (NU_Delete_Semaphore(m) == NU_SUCCESS)
wolfSSL 15:117db924cf7c 1274 return 0;
wolfSSL 15:117db924cf7c 1275
wolfSSL 15:117db924cf7c 1276 return BAD_MUTEX_E;
wolfSSL 15:117db924cf7c 1277 }
wolfSSL 15:117db924cf7c 1278
wolfSSL 15:117db924cf7c 1279 int wc_LockMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 1280 {
wolfSSL 15:117db924cf7c 1281 /* passing suspend task option */
wolfSSL 15:117db924cf7c 1282 if (NU_Obtain_Semaphore(m, NU_SUSPEND) == NU_SUCCESS)
wolfSSL 15:117db924cf7c 1283 return 0;
wolfSSL 15:117db924cf7c 1284
wolfSSL 15:117db924cf7c 1285 return BAD_MUTEX_E;
wolfSSL 15:117db924cf7c 1286 }
wolfSSL 15:117db924cf7c 1287
wolfSSL 15:117db924cf7c 1288 int wc_UnLockMutex(wolfSSL_Mutex* m)
wolfSSL 15:117db924cf7c 1289 {
wolfSSL 15:117db924cf7c 1290 if (NU_Release_Semaphore(m) == NU_SUCCESS)
wolfSSL 15:117db924cf7c 1291 return 0;
wolfSSL 15:117db924cf7c 1292
wolfSSL 15:117db924cf7c 1293 return BAD_MUTEX_E;
wolfSSL 15:117db924cf7c 1294 }
wolfSSL 15:117db924cf7c 1295
wolfSSL 15:117db924cf7c 1296 #else
wolfSSL 15:117db924cf7c 1297 #warning No mutex handling defined
wolfSSL 15:117db924cf7c 1298
wolfSSL 15:117db924cf7c 1299 #endif
wolfSSL 15:117db924cf7c 1300
wolfSSL 15:117db924cf7c 1301 #ifndef NO_ASN_TIME
wolfSSL 15:117db924cf7c 1302 #if defined(_WIN32_WCE)
wolfSSL 15:117db924cf7c 1303 time_t windows_time(time_t* timer)
wolfSSL 15:117db924cf7c 1304 {
wolfSSL 15:117db924cf7c 1305 SYSTEMTIME sysTime;
wolfSSL 15:117db924cf7c 1306 FILETIME fTime;
wolfSSL 15:117db924cf7c 1307 ULARGE_INTEGER intTime;
wolfSSL 15:117db924cf7c 1308 time_t localTime;
wolfSSL 15:117db924cf7c 1309
wolfSSL 15:117db924cf7c 1310 if (timer == NULL)
wolfSSL 15:117db924cf7c 1311 timer = &localTime;
wolfSSL 15:117db924cf7c 1312
wolfSSL 15:117db924cf7c 1313 GetSystemTime(&sysTime);
wolfSSL 15:117db924cf7c 1314 SystemTimeToFileTime(&sysTime, &fTime);
wolfSSL 15:117db924cf7c 1315
wolfSSL 15:117db924cf7c 1316 XMEMCPY(&intTime, &fTime, sizeof(FILETIME));
wolfSSL 15:117db924cf7c 1317 /* subtract EPOCH */
wolfSSL 15:117db924cf7c 1318 intTime.QuadPart -= 0x19db1ded53e8000;
wolfSSL 15:117db924cf7c 1319 /* to secs */
wolfSSL 15:117db924cf7c 1320 intTime.QuadPart /= 10000000;
wolfSSL 15:117db924cf7c 1321 *timer = (time_t)intTime.QuadPart;
wolfSSL 15:117db924cf7c 1322
wolfSSL 15:117db924cf7c 1323 return *timer;
wolfSSL 15:117db924cf7c 1324 }
wolfSSL 15:117db924cf7c 1325 #endif /* _WIN32_WCE */
wolfSSL 15:117db924cf7c 1326
wolfSSL 15:117db924cf7c 1327 #if defined(WOLFSSL_GMTIME)
wolfSSL 15:117db924cf7c 1328 struct tm* gmtime(const time_t* timer)
wolfSSL 15:117db924cf7c 1329 {
wolfSSL 15:117db924cf7c 1330 #define YEAR0 1900
wolfSSL 15:117db924cf7c 1331 #define EPOCH_YEAR 1970
wolfSSL 15:117db924cf7c 1332 #define SECS_DAY (24L * 60L * 60L)
wolfSSL 15:117db924cf7c 1333 #define LEAPYEAR(year) (!((year) % 4) && (((year) % 100) || !((year) %400)))
wolfSSL 15:117db924cf7c 1334 #define YEARSIZE(year) (LEAPYEAR(year) ? 366 : 365)
wolfSSL 15:117db924cf7c 1335
wolfSSL 15:117db924cf7c 1336 static const int _ytab[2][12] =
wolfSSL 15:117db924cf7c 1337 {
wolfSSL 15:117db924cf7c 1338 {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
wolfSSL 15:117db924cf7c 1339 {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
wolfSSL 15:117db924cf7c 1340 };
wolfSSL 15:117db924cf7c 1341
wolfSSL 15:117db924cf7c 1342 static struct tm st_time;
wolfSSL 15:117db924cf7c 1343 struct tm* ret = &st_time;
wolfSSL 15:117db924cf7c 1344 time_t secs = *timer;
wolfSSL 15:117db924cf7c 1345 unsigned long dayclock, dayno;
wolfSSL 15:117db924cf7c 1346 int year = EPOCH_YEAR;
wolfSSL 15:117db924cf7c 1347
wolfSSL 15:117db924cf7c 1348 dayclock = (unsigned long)secs % SECS_DAY;
wolfSSL 15:117db924cf7c 1349 dayno = (unsigned long)secs / SECS_DAY;
wolfSSL 15:117db924cf7c 1350
wolfSSL 15:117db924cf7c 1351 ret->tm_sec = (int) dayclock % 60;
wolfSSL 15:117db924cf7c 1352 ret->tm_min = (int)(dayclock % 3600) / 60;
wolfSSL 15:117db924cf7c 1353 ret->tm_hour = (int) dayclock / 3600;
wolfSSL 15:117db924cf7c 1354 ret->tm_wday = (int) (dayno + 4) % 7; /* day 0 a Thursday */
wolfSSL 15:117db924cf7c 1355
wolfSSL 15:117db924cf7c 1356 while(dayno >= (unsigned long)YEARSIZE(year)) {
wolfSSL 15:117db924cf7c 1357 dayno -= YEARSIZE(year);
wolfSSL 15:117db924cf7c 1358 year++;
wolfSSL 15:117db924cf7c 1359 }
wolfSSL 15:117db924cf7c 1360
wolfSSL 15:117db924cf7c 1361 ret->tm_year = year - YEAR0;
wolfSSL 15:117db924cf7c 1362 ret->tm_yday = (int)dayno;
wolfSSL 15:117db924cf7c 1363 ret->tm_mon = 0;
wolfSSL 15:117db924cf7c 1364
wolfSSL 15:117db924cf7c 1365 while(dayno >= (unsigned long)_ytab[LEAPYEAR(year)][ret->tm_mon]) {
wolfSSL 15:117db924cf7c 1366 dayno -= _ytab[LEAPYEAR(year)][ret->tm_mon];
wolfSSL 15:117db924cf7c 1367 ret->tm_mon++;
wolfSSL 15:117db924cf7c 1368 }
wolfSSL 15:117db924cf7c 1369
wolfSSL 15:117db924cf7c 1370 ret->tm_mday = (int)++dayno;
wolfSSL 15:117db924cf7c 1371 ret->tm_isdst = 0;
wolfSSL 15:117db924cf7c 1372
wolfSSL 15:117db924cf7c 1373 return ret;
wolfSSL 15:117db924cf7c 1374 }
wolfSSL 15:117db924cf7c 1375 #endif /* WOLFSSL_GMTIME */
wolfSSL 15:117db924cf7c 1376
wolfSSL 15:117db924cf7c 1377
wolfSSL 15:117db924cf7c 1378 #if defined(HAVE_RTP_SYS)
wolfSSL 15:117db924cf7c 1379 #define YEAR0 1900
wolfSSL 15:117db924cf7c 1380
wolfSSL 15:117db924cf7c 1381 struct tm* rtpsys_gmtime(const time_t* timer) /* has a gmtime() but hangs */
wolfSSL 15:117db924cf7c 1382 {
wolfSSL 15:117db924cf7c 1383 static struct tm st_time;
wolfSSL 15:117db924cf7c 1384 struct tm* ret = &st_time;
wolfSSL 15:117db924cf7c 1385
wolfSSL 15:117db924cf7c 1386 DC_RTC_CALENDAR cal;
wolfSSL 15:117db924cf7c 1387 dc_rtc_time_get(&cal, TRUE);
wolfSSL 15:117db924cf7c 1388
wolfSSL 15:117db924cf7c 1389 ret->tm_year = cal.year - YEAR0; /* gm starts at 1900 */
wolfSSL 15:117db924cf7c 1390 ret->tm_mon = cal.month - 1; /* gm starts at 0 */
wolfSSL 15:117db924cf7c 1391 ret->tm_mday = cal.day;
wolfSSL 15:117db924cf7c 1392 ret->tm_hour = cal.hour;
wolfSSL 15:117db924cf7c 1393 ret->tm_min = cal.minute;
wolfSSL 15:117db924cf7c 1394 ret->tm_sec = cal.second;
wolfSSL 15:117db924cf7c 1395
wolfSSL 15:117db924cf7c 1396 return ret;
wolfSSL 15:117db924cf7c 1397 }
wolfSSL 15:117db924cf7c 1398
wolfSSL 15:117db924cf7c 1399 #endif /* HAVE_RTP_SYS */
wolfSSL 15:117db924cf7c 1400
wolfSSL 15:117db924cf7c 1401
wolfSSL 15:117db924cf7c 1402 #if defined(MICROCHIP_TCPIP_V5) || defined(MICROCHIP_TCPIP)
wolfSSL 15:117db924cf7c 1403
wolfSSL 15:117db924cf7c 1404 /*
wolfSSL 15:117db924cf7c 1405 * time() is just a stub in Microchip libraries. We need our own
wolfSSL 15:117db924cf7c 1406 * implementation. Use SNTP client to get seconds since epoch.
wolfSSL 15:117db924cf7c 1407 */
wolfSSL 15:117db924cf7c 1408 time_t pic32_time(time_t* timer)
wolfSSL 15:117db924cf7c 1409 {
wolfSSL 15:117db924cf7c 1410 #ifdef MICROCHIP_TCPIP_V5
wolfSSL 15:117db924cf7c 1411 DWORD sec = 0;
wolfSSL 15:117db924cf7c 1412 #else
wolfSSL 15:117db924cf7c 1413 uint32_t sec = 0;
wolfSSL 15:117db924cf7c 1414 #endif
wolfSSL 15:117db924cf7c 1415 time_t localTime;
wolfSSL 15:117db924cf7c 1416
wolfSSL 15:117db924cf7c 1417 if (timer == NULL)
wolfSSL 15:117db924cf7c 1418 timer = &localTime;
wolfSSL 15:117db924cf7c 1419
wolfSSL 15:117db924cf7c 1420 #ifdef MICROCHIP_MPLAB_HARMONY
wolfSSL 15:117db924cf7c 1421 sec = TCPIP_SNTP_UTCSecondsGet();
wolfSSL 15:117db924cf7c 1422 #else
wolfSSL 15:117db924cf7c 1423 sec = SNTPGetUTCSeconds();
wolfSSL 15:117db924cf7c 1424 #endif
wolfSSL 15:117db924cf7c 1425 *timer = (time_t) sec;
wolfSSL 15:117db924cf7c 1426
wolfSSL 15:117db924cf7c 1427 return *timer;
wolfSSL 15:117db924cf7c 1428 }
wolfSSL 15:117db924cf7c 1429
wolfSSL 15:117db924cf7c 1430 #endif /* MICROCHIP_TCPIP || MICROCHIP_TCPIP_V5 */
wolfSSL 15:117db924cf7c 1431
wolfSSL 15:117db924cf7c 1432 #if defined(MICRIUM)
wolfSSL 15:117db924cf7c 1433
wolfSSL 15:117db924cf7c 1434 time_t micrium_time(time_t* timer)
wolfSSL 15:117db924cf7c 1435 {
wolfSSL 15:117db924cf7c 1436 CLK_TS_SEC sec;
wolfSSL 15:117db924cf7c 1437
wolfSSL 15:117db924cf7c 1438 Clk_GetTS_Unix(&sec);
wolfSSL 15:117db924cf7c 1439
wolfSSL 15:117db924cf7c 1440 return (time_t) sec;
wolfSSL 15:117db924cf7c 1441 }
wolfSSL 15:117db924cf7c 1442
wolfSSL 15:117db924cf7c 1443 #endif /* MICRIUM */
wolfSSL 15:117db924cf7c 1444
wolfSSL 15:117db924cf7c 1445 #if defined(FREESCALE_MQX) || defined(FREESCALE_KSDK_MQX)
wolfSSL 15:117db924cf7c 1446
wolfSSL 15:117db924cf7c 1447 time_t mqx_time(time_t* timer)
wolfSSL 15:117db924cf7c 1448 {
wolfSSL 15:117db924cf7c 1449 time_t localTime;
wolfSSL 15:117db924cf7c 1450 TIME_STRUCT time_s;
wolfSSL 15:117db924cf7c 1451
wolfSSL 15:117db924cf7c 1452 if (timer == NULL)
wolfSSL 15:117db924cf7c 1453 timer = &localTime;
wolfSSL 15:117db924cf7c 1454
wolfSSL 15:117db924cf7c 1455 _time_get(&time_s);
wolfSSL 15:117db924cf7c 1456 *timer = (time_t) time_s.SECONDS;
wolfSSL 15:117db924cf7c 1457
wolfSSL 15:117db924cf7c 1458 return *timer;
wolfSSL 15:117db924cf7c 1459 }
wolfSSL 15:117db924cf7c 1460
wolfSSL 15:117db924cf7c 1461 #endif /* FREESCALE_MQX || FREESCALE_KSDK_MQX */
wolfSSL 15:117db924cf7c 1462
wolfSSL 15:117db924cf7c 1463
wolfSSL 15:117db924cf7c 1464 #if defined(WOLFSSL_TIRTOS)
wolfSSL 15:117db924cf7c 1465
wolfSSL 15:117db924cf7c 1466 time_t XTIME(time_t * timer)
wolfSSL 15:117db924cf7c 1467 {
wolfSSL 15:117db924cf7c 1468 time_t sec = 0;
wolfSSL 15:117db924cf7c 1469
wolfSSL 15:117db924cf7c 1470 sec = (time_t) Seconds_get();
wolfSSL 15:117db924cf7c 1471
wolfSSL 15:117db924cf7c 1472 if (timer != NULL)
wolfSSL 15:117db924cf7c 1473 *timer = sec;
wolfSSL 15:117db924cf7c 1474
wolfSSL 15:117db924cf7c 1475 return sec;
wolfSSL 15:117db924cf7c 1476 }
wolfSSL 15:117db924cf7c 1477
wolfSSL 15:117db924cf7c 1478 #endif /* WOLFSSL_TIRTOS */
wolfSSL 15:117db924cf7c 1479
wolfSSL 15:117db924cf7c 1480 #if defined(WOLFSSL_XILINX)
wolfSSL 15:117db924cf7c 1481 #include "xrtcpsu.h"
wolfSSL 15:117db924cf7c 1482
wolfSSL 15:117db924cf7c 1483 time_t XTIME(time_t * timer)
wolfSSL 15:117db924cf7c 1484 {
wolfSSL 15:117db924cf7c 1485 time_t sec = 0;
wolfSSL 15:117db924cf7c 1486 XRtcPsu_Config* con;
wolfSSL 15:117db924cf7c 1487 XRtcPsu rtc;
wolfSSL 15:117db924cf7c 1488
wolfSSL 15:117db924cf7c 1489 con = XRtcPsu_LookupConfig(XPAR_XRTCPSU_0_DEVICE_ID);
wolfSSL 15:117db924cf7c 1490 if (con != NULL) {
wolfSSL 15:117db924cf7c 1491 if (XRtcPsu_CfgInitialize(&rtc, con, con->BaseAddr) == XST_SUCCESS) {
wolfSSL 15:117db924cf7c 1492 sec = (time_t)XRtcPsu_GetCurrentTime(&rtc);
wolfSSL 15:117db924cf7c 1493 }
wolfSSL 15:117db924cf7c 1494 else {
wolfSSL 15:117db924cf7c 1495 WOLFSSL_MSG("Unable to initialize RTC");
wolfSSL 15:117db924cf7c 1496 }
wolfSSL 15:117db924cf7c 1497 }
wolfSSL 15:117db924cf7c 1498
wolfSSL 15:117db924cf7c 1499 if (timer != NULL)
wolfSSL 15:117db924cf7c 1500 *timer = sec;
wolfSSL 15:117db924cf7c 1501
wolfSSL 15:117db924cf7c 1502 return sec;
wolfSSL 15:117db924cf7c 1503 }
wolfSSL 15:117db924cf7c 1504
wolfSSL 15:117db924cf7c 1505 #endif /* WOLFSSL_XILINX */
wolfSSL 15:117db924cf7c 1506 #endif /* !NO_ASN_TIME */
wolfSSL 15:117db924cf7c 1507
wolfSSL 15:117db924cf7c 1508 #ifndef WOLFSSL_LEANPSK
wolfSSL 15:117db924cf7c 1509 char* mystrnstr(const char* s1, const char* s2, unsigned int n)
wolfSSL 15:117db924cf7c 1510 {
wolfSSL 15:117db924cf7c 1511 unsigned int s2_len = (unsigned int)XSTRLEN(s2);
wolfSSL 15:117db924cf7c 1512
wolfSSL 15:117db924cf7c 1513 if (s2_len == 0)
wolfSSL 15:117db924cf7c 1514 return (char*)s1;
wolfSSL 15:117db924cf7c 1515
wolfSSL 15:117db924cf7c 1516 while (n >= s2_len && s1[0]) {
wolfSSL 15:117db924cf7c 1517 if (s1[0] == s2[0])
wolfSSL 15:117db924cf7c 1518 if (XMEMCMP(s1, s2, s2_len) == 0)
wolfSSL 15:117db924cf7c 1519 return (char*)s1;
wolfSSL 15:117db924cf7c 1520 s1++;
wolfSSL 15:117db924cf7c 1521 n--;
wolfSSL 15:117db924cf7c 1522 }
wolfSSL 15:117db924cf7c 1523
wolfSSL 15:117db924cf7c 1524 return NULL;
wolfSSL 15:117db924cf7c 1525 }
wolfSSL 15:117db924cf7c 1526 #endif
wolfSSL 15:117db924cf7c 1527
wolfSSL 15:117db924cf7c 1528 /* custom memory wrappers */
wolfSSL 15:117db924cf7c 1529 #ifdef WOLFSSL_NUCLEUS_1_2
wolfSSL 15:117db924cf7c 1530
wolfSSL 15:117db924cf7c 1531 /* system memory pool */
wolfSSL 15:117db924cf7c 1532 extern NU_MEMORY_POOL System_Memory;
wolfSSL 15:117db924cf7c 1533
wolfSSL 15:117db924cf7c 1534 void* nucleus_malloc(unsigned long size, void* heap, int type)
wolfSSL 15:117db924cf7c 1535 {
wolfSSL 15:117db924cf7c 1536 STATUS status;
wolfSSL 15:117db924cf7c 1537 void* stack_ptr;
wolfSSL 15:117db924cf7c 1538
wolfSSL 15:117db924cf7c 1539 status = NU_Allocate_Memory(&System_Memory, &stack_ptr, size,
wolfSSL 15:117db924cf7c 1540 NU_NO_SUSPEND);
wolfSSL 15:117db924cf7c 1541 if (status == NU_SUCCESS) {
wolfSSL 15:117db924cf7c 1542 return 0;
wolfSSL 15:117db924cf7c 1543 } else {
wolfSSL 15:117db924cf7c 1544 return stack_ptr;
wolfSSL 15:117db924cf7c 1545 }
wolfSSL 15:117db924cf7c 1546 }
wolfSSL 15:117db924cf7c 1547
wolfSSL 15:117db924cf7c 1548 void* nucleus_realloc(void* ptr, unsigned long size, void* heap, int type)
wolfSSL 15:117db924cf7c 1549 {
wolfSSL 15:117db924cf7c 1550 STATUS status;
wolfSSL 15:117db924cf7c 1551 DM_HEADER* old_header;
wolfSSL 15:117db924cf7c 1552 word32 old_size, copy_size;
wolfSSL 15:117db924cf7c 1553 void* new_mem;
wolfSSL 15:117db924cf7c 1554
wolfSSL 15:117db924cf7c 1555 /* if ptr is NULL, behave like malloc */
wolfSSL 15:117db924cf7c 1556 new_mem = nucleus_malloc(size, NULL, 0);
wolfSSL 15:117db924cf7c 1557 if (new_mem == 0 || ptr == 0) {
wolfSSL 15:117db924cf7c 1558 return new_mem;
wolfSSL 15:117db924cf7c 1559 }
wolfSSL 15:117db924cf7c 1560
wolfSSL 15:117db924cf7c 1561 /* calculate old memory block size */
wolfSSL 15:117db924cf7c 1562 /* mem pointers stored in block headers (ref dm_defs.h) */
wolfSSL 15:117db924cf7c 1563 old_header = (DM_HEADER*) ((byte*)ptr - DM_OVERHEAD);
wolfSSL 15:117db924cf7c 1564 old_size = (byte*)old_header->dm_next_memory - (byte*)ptr;
wolfSSL 15:117db924cf7c 1565
wolfSSL 15:117db924cf7c 1566 /* copy old to new */
wolfSSL 15:117db924cf7c 1567 if (old_size < size) {
wolfSSL 15:117db924cf7c 1568 copy_size = old_size;
wolfSSL 15:117db924cf7c 1569 } else {
wolfSSL 15:117db924cf7c 1570 copy_size = size;
wolfSSL 15:117db924cf7c 1571 }
wolfSSL 15:117db924cf7c 1572 XMEMCPY(new_mem, ptr, copy_size);
wolfSSL 15:117db924cf7c 1573
wolfSSL 15:117db924cf7c 1574 /* free old */
wolfSSL 15:117db924cf7c 1575 nucleus_free(ptr, NULL, 0);
wolfSSL 15:117db924cf7c 1576
wolfSSL 15:117db924cf7c 1577 return new_mem;
wolfSSL 15:117db924cf7c 1578 }
wolfSSL 15:117db924cf7c 1579
wolfSSL 15:117db924cf7c 1580 void nucleus_free(void* ptr, void* heap, int type)
wolfSSL 15:117db924cf7c 1581 {
wolfSSL 15:117db924cf7c 1582 if (ptr != NULL)
wolfSSL 15:117db924cf7c 1583 NU_Deallocate_Memory(ptr);
wolfSSL 15:117db924cf7c 1584 }
wolfSSL 15:117db924cf7c 1585
wolfSSL 15:117db924cf7c 1586 #endif /* WOLFSSL_NUCLEUS_1_2 */
wolfSSL 15:117db924cf7c 1587
wolfSSL 15:117db924cf7c 1588 #if defined(WOLFSSL_TI_CRYPT) || defined(WOLFSSL_TI_HASH)
wolfSSL 15:117db924cf7c 1589 #include <wolfcrypt/src/port/ti/ti-ccm.c> /* initialize and Mutex for TI Crypt Engine */
wolfSSL 15:117db924cf7c 1590 #include <wolfcrypt/src/port/ti/ti-hash.c> /* md5, sha1, sha224, sha256 */
wolfSSL 15:117db924cf7c 1591 #endif
wolfSSL 15:117db924cf7c 1592