/* Add Decoded CRL, 0 on success */ static int AddCRL(WOLFSSL_CRL* crl, DecodedCRL* dcrl) { CRL_Entry* crle; WOLFSSL_ENTER("AddCRL"); crle = (CRL_Entry*)XMALLOC(sizeof(CRL_Entry), crl->heap, DYNAMIC_TYPE_CRL_ENTRY); if (crle == NULL) { WOLFSSL_MSG("alloc CRL Entry failed"); return -1; } if (InitCRL_Entry(crle, dcrl) < 0) { WOLFSSL_MSG("Init CRL Entry failed"); XFREE(crle, crl->heap, DYNAMIC_TYPE_CRL_ENTRY); return -1; } if (LockMutex(&crl->crlLock) != 0) { WOLFSSL_MSG("LockMutex failed"); FreeCRL_Entry(crle, crl->heap); XFREE(crle, crl->heap, DYNAMIC_TYPE_CRL_ENTRY); return BAD_MUTEX_E; } crle->next = crl->crlList; crl->crlList = crle; UnLockMutex(&crl->crlLock); return 0; }
int wc_Sha384Hash(const byte* data, word32 len, byte* hash) { int ret = 0; #ifdef WOLFSSL_SMALL_STACK Sha384* sha384; #else Sha384 sha384[1]; #endif #ifdef WOLFSSL_SMALL_STACK sha384 = (Sha384*)XMALLOC(sizeof(Sha384), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (sha384 == NULL) return MEMORY_E; #endif if ((ret = wc_InitSha384(sha384)) != 0) { WOLFSSL_MSG("InitSha384 failed"); } else if ((ret = wc_Sha384Update(sha384, data, len)) != 0) { WOLFSSL_MSG("Sha384Update failed"); } else if ((ret = wc_Sha384Final(sha384, hash)) != 0) { WOLFSSL_MSG("Sha384Final failed"); } #ifdef WOLFSSL_SMALL_STACK XFREE(sha384, NULL, DYNAMIC_TYPE_TMP_BUFFER); #endif return ret; }
static void HmacCaviumUpdate(Hmac* hmac, const byte* msg, word32 length) { word16 add = (word16)length; word32 total; byte* tmp; if (length > WOLFSSL_MAX_16BIT) { WOLFSSL_MSG("Too big msg for cavium hmac"); return; } if (hmac->innerHashKeyed == 0) { /* starting new */ hmac->dataLen = 0; hmac->innerHashKeyed = 1; } total = add + hmac->dataLen; if (total > WOLFSSL_MAX_16BIT) { WOLFSSL_MSG("Too big msg for cavium hmac"); return; } tmp = XMALLOC(hmac->dataLen + add, NULL,DYNAMIC_TYPE_CAVIUM_TMP); if (tmp == NULL) { WOLFSSL_MSG("Out of memory for cavium update"); return; } if (hmac->dataLen) XMEMCPY(tmp, hmac->data, hmac->dataLen); XMEMCPY(tmp + hmac->dataLen, msg, add); hmac->dataLen += add; XFREE(hmac->data, NULL, DYNAMIC_TYPE_CAVIUM_TMP); hmac->data = tmp; }
/* Free all CRL resources */ void FreeCRL(WOLFSSL_CRL* crl, int dynamic) { CRL_Entry* tmp = crl->crlList; WOLFSSL_ENTER("FreeCRL"); if (crl->monitors[0].path) XFREE(crl->monitors[0].path, crl->heap, DYNAMIC_TYPE_CRL_MONITOR); if (crl->monitors[1].path) XFREE(crl->monitors[1].path, crl->heap, DYNAMIC_TYPE_CRL_MONITOR); while(tmp) { CRL_Entry* next = tmp->next; FreeCRL_Entry(tmp, crl->heap); XFREE(tmp, crl->heap, DYNAMIC_TYPE_CRL_ENTRY); tmp = next; } #ifdef HAVE_CRL_MONITOR if (crl->tid != 0) { WOLFSSL_MSG("stopping monitor thread"); if (StopMonitor(crl->mfd) == 0) pthread_join(crl->tid, NULL); else { WOLFSSL_MSG("stop monitor failed"); } } pthread_cond_destroy(&crl->cond); #endif FreeMutex(&crl->crlLock); if (dynamic) /* free self */ XFREE(crl, crl->heap, DYNAMIC_TYPE_CRL); }
/* Used to initialize state for wolfcrypt return 0 on success */ int wolfCrypt_Init() { int ret = 0; if (initRefCount == 0) { #if WOLFSSL_CRYPT_HW_MUTEX /* If crypto hardware mutex protection is enabled, then initialize it */ wolfSSL_CryptHwMutexInit(); #endif /* if defined have fast RSA then initialize Intel IPP */ #ifdef HAVE_FAST_RSA WOLFSSL_MSG("Attempting to use optimized IPP Library"); if ((ret = ippInit()) != ippStsNoErr) { /* possible to get a CPU feature support status on optimized IPP library but still use default library and see competitive speeds */ WOLFSSL_MSG("Warning when trying to set up optimization"); WOLFSSL_MSG(ippGetStatusString(ret)); WOLFSSL_MSG("Using default fast IPP library"); ret = 0; } #endif #ifdef WOLFSSL_ARMASM WOLFSSL_MSG("Using ARM hardware acceleration"); #endif initRefCount = 1; } return ret; }
/* Initialize CRL members */ int InitCRL(WOLFSSL_CRL* crl, WOLFSSL_CERT_MANAGER* cm) { WOLFSSL_ENTER("InitCRL"); crl->heap = cm->heap; crl->cm = cm; crl->crlList = NULL; crl->monitors[0].path = NULL; crl->monitors[1].path = NULL; #ifdef HAVE_CRL_MONITOR crl->tid = 0; crl->mfd = -1; /* mfd for bsd is kqueue fd, eventfd for linux */ crl->setup = 0; /* thread setup done predicate */ if (pthread_cond_init(&crl->cond, 0) != 0) { WOLFSSL_MSG("Pthread condition init failed"); return BAD_COND_E; } #endif if (InitMutex(&crl->crlLock) != 0) { WOLFSSL_MSG("Init Mutex failed"); return BAD_MUTEX_E; } return 0; }
int wc_Sha512Hash(const byte* data, word32 len, byte* hash) { int ret = 0; #ifdef WOLFSSL_SMALL_STACK Sha512* sha512; #else Sha512 sha512[1]; #endif #ifdef WOLFSSL_SMALL_STACK sha512 = (Sha512*)XMALLOC(sizeof(Sha512), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (sha512 == NULL) return MEMORY_E; #endif if ((ret = wc_InitSha512(sha512)) != 0) { WOLFSSL_MSG("InitSha512 failed"); } else if ((ret = wc_Sha512Update(sha512, data, len)) != 0) { WOLFSSL_MSG("Sha512Update failed"); } else if ((ret = wc_Sha512Final(sha512, hash)) != 0) { WOLFSSL_MSG("Sha512Final failed"); } #ifdef WOLFSSL_SMALL_STACK XFREE(sha512, NULL, DYNAMIC_TYPE_TMP_BUFFER); #endif return ret; }
int wc_Sha256Hash(const byte* data, word32 len, byte* hash) { int ret = 0; #ifdef WOLFSSL_SMALL_STACK Sha256* sha256; #else Sha256 sha256[1]; #endif #ifdef WOLFSSL_SMALL_STACK sha256 = (Sha256*)XMALLOC(sizeof(Sha256), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (sha256 == NULL) return MEMORY_E; #endif if ((ret = wc_InitSha256(sha256)) != 0) { WOLFSSL_MSG("InitSha256 failed"); } else if ((ret = wc_Sha256Update(sha256, data, len)) != 0) { WOLFSSL_MSG("Sha256Update failed"); } else if ((ret = wc_Sha256Final(sha256, hash)) != 0) { WOLFSSL_MSG("Sha256Final failed"); } #ifdef WOLFSSL_SMALL_STACK XFREE(sha256, NULL, DYNAMIC_TYPE_TMP_BUFFER); #endif return ret; }
/* returns 0 if file found, -1 if no files or negative error */ int wc_ReadDirFirst(ReadDirCtx* ctx, const char* path, char** name) { int ret = -1; /* default to no files found */ if (name) *name = NULL; if (ctx == NULL || path == NULL) { return BAD_FUNC_ARG; } XMEMSET(ctx->name, 0, MAX_FILENAME_SZ); #ifdef USE_WINDOWS_API XSTRNCPY(ctx->name, path, MAX_FILENAME_SZ - 4); XSTRNCAT(ctx->name, "\\*", 3); ctx->hFind = FindFirstFileA(ctx->name, &ctx->FindFileData); if (ctx->hFind == INVALID_HANDLE_VALUE) { WOLFSSL_MSG("FindFirstFile for path verify locations failed"); return BAD_PATH_ERROR; } do { if (ctx->FindFileData.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY) { XSTRNCPY(ctx->name, path, MAX_FILENAME_SZ/2 - 3); XSTRNCAT(ctx->name, "\\", 2); XSTRNCAT(ctx->name, ctx->FindFileData.cFileName, MAX_FILENAME_SZ/2); if (name) *name = ctx->name; return 0; } } while (FindNextFileA(ctx->hFind, &ctx->FindFileData)); #else ctx->dir = opendir(path); if (ctx->dir == NULL) { WOLFSSL_MSG("opendir path verify locations failed"); return BAD_PATH_ERROR; } while ((ctx->entry = readdir(ctx->dir)) != NULL) { XSTRNCPY(ctx->name, path, MAX_FILENAME_SZ/2 - 2); XSTRNCAT(ctx->name, "/", 1); XSTRNCAT(ctx->name, ctx->entry->d_name, MAX_FILENAME_SZ/2); if (stat(ctx->name, &ctx->s) != 0) { WOLFSSL_MSG("stat on name failed"); ret = BAD_PATH_ERROR; break; } else if (ctx->s.st_mode & S_IFREG) { if (name) *name = ctx->name; return 0; } } #endif wc_ReadDirClose(ctx); return ret; }
/* set the peer information in human readable form (ip, port, family) * default function assumes BSD sockets * can be overriden with wolfSSL_CTX_SetIOSetPeer */ int EmbedSetPeer(WOLFSSL* ssl, char* ip, int ipSz, unsigned short port, int fam) { int ret; SOCKADDR_S addr; /* sanity checks on arguments */ if (ssl == NULL || ip == NULL || ipSz < 0 || ipSz > DTLS_EXPORT_IP) { return BAD_FUNC_ARG; } addr.ss_family = fam; switch (addr.ss_family) { case WOLFSSL_IP4: if (XINET_PTON(addr.ss_family, ip, &(((SOCKADDR_IN*)&addr)->sin_addr)) <= 0) { WOLFSSL_MSG("XINET_PTON error"); return SOCKET_ERROR_E; } ((SOCKADDR_IN*)&addr)->sin_port = XHTONS(port); /* peer sa is free'd in SSL_ResourceFree */ if ((ret = wolfSSL_dtls_set_peer(ssl, (SOCKADDR_IN*)&addr, sizeof(SOCKADDR_IN)))!= SSL_SUCCESS) { WOLFSSL_MSG("Import DTLS peer info error"); return ret; } break; case WOLFSSL_IP6: if (XINET_PTON(addr.ss_family, ip, &(((SOCKADDR_IN6*)&addr)->sin6_addr)) <= 0) { WOLFSSL_MSG("XINET_PTON error"); return SOCKET_ERROR_E; } ((SOCKADDR_IN6*)&addr)->sin6_port = XHTONS(port); /* peer sa is free'd in SSL_ResourceFree */ if ((ret = wolfSSL_dtls_set_peer(ssl, (SOCKADDR_IN6*)&addr, sizeof(SOCKADDR_IN6)))!= SSL_SUCCESS) { WOLFSSL_MSG("Import DTLS peer info error"); return ret; } break; default: WOLFSSL_MSG("Unknown address family"); return BUFFER_E; } return SSL_SUCCESS; }
/* The NetX receive callback * return : bytes read, or error */ int NetX_Receive(WOLFSSL *ssl, char *buf, int sz, void *ctx) { NetX_Ctx* nxCtx = (NetX_Ctx*)ctx; ULONG left; ULONG total; ULONG copied = 0; UINT status; if (nxCtx == NULL || nxCtx->nxSocket == NULL) { WOLFSSL_MSG("NetX Recv NULL parameters"); return WOLFSSL_CBIO_ERR_GENERAL; } if (nxCtx->nxPacket == NULL) { status = nx_tcp_socket_receive(nxCtx->nxSocket, &nxCtx->nxPacket, nxCtx->nxWait); if (status != NX_SUCCESS) { WOLFSSL_MSG("NetX Recv receive error"); return WOLFSSL_CBIO_ERR_GENERAL; } } if (nxCtx->nxPacket) { status = nx_packet_length_get(nxCtx->nxPacket, &total); if (status != NX_SUCCESS) { WOLFSSL_MSG("NetX Recv length get error"); return WOLFSSL_CBIO_ERR_GENERAL; } left = total - nxCtx->nxOffset; status = nx_packet_data_extract_offset(nxCtx->nxPacket, nxCtx->nxOffset, buf, sz, &copied); if (status != NX_SUCCESS) { WOLFSSL_MSG("NetX Recv data extract offset error"); return WOLFSSL_CBIO_ERR_GENERAL; } nxCtx->nxOffset += copied; if (copied == left) { WOLFSSL_MSG("NetX Recv Drained packet"); nx_packet_release(nxCtx->nxPacket); nxCtx->nxPacket = NULL; nxCtx->nxOffset = 0; } } return copied; }
/* get the peer information in human readable form (ip, port, family) * default function assumes BSD sockets * can be overriden with wolfSSL_CTX_SetIOGetPeer */ int EmbedGetPeer(WOLFSSL* ssl, char* ip, int* ipSz, unsigned short* port, int* fam) { SOCKADDR_S peer; word32 peerSz; int ret; if (ssl == NULL || ip == NULL || ipSz == NULL || port == NULL || fam == NULL) { return BAD_FUNC_ARG; } /* get peer information stored in ssl struct */ peerSz = sizeof(SOCKADDR_S); if ((ret = wolfSSL_dtls_get_peer(ssl, (void*)&peer, &peerSz)) != SSL_SUCCESS) { return ret; } /* extract family, ip, and port */ *fam = ((SOCKADDR_S*)&peer)->ss_family; switch (*fam) { case WOLFSSL_IP4: if (XINET_NTOP(*fam, &(((SOCKADDR_IN*)&peer)->sin_addr), ip, *ipSz) == NULL) { WOLFSSL_MSG("XINET_NTOP error"); return SOCKET_ERROR_E; } *port = XNTOHS(((SOCKADDR_IN*)&peer)->sin_port); break; case WOLFSSL_IP6: if (XINET_NTOP(*fam, &(((SOCKADDR_IN6*)&peer)->sin6_addr), ip, *ipSz) == NULL) { WOLFSSL_MSG("XINET_NTOP error"); return SOCKET_ERROR_E; } *port = XNTOHS(((SOCKADDR_IN6*)&peer)->sin6_port); break; default: WOLFSSL_MSG("Unknown family type"); return SOCKET_ERROR_E; } ip[*ipSz - 1] = '\0'; /* make sure has terminator */ *ipSz = (word16)XSTRLEN(ip); return SSL_SUCCESS; }
/* peek at an error node * * idx : if -1 then the most recent node is looked at, otherwise search * through queue for node at the given index * file : pointer to internal file string * reason : pointer to internal error reason * line : line number that error happened at * * Returns a negative value in error case, on success returns the nodes error * value which is positve (absolute value) */ int wc_PeekErrorNode(int idx, const char **file, const char **reason, int *line) { struct wc_error_queue* err; if (wc_LockMutex(&debug_mutex) != 0) { WOLFSSL_MSG("Lock debug mutex failed"); return BAD_MUTEX_E; } if (idx < 0) { err = wc_last_node; if (err == NULL) { WOLFSSL_MSG("No Errors in queue"); wc_UnLockMutex(&debug_mutex); return BAD_STATE_E; } } else { int i; err = (struct wc_error_queue*)wc_errors; for (i = 0; i < idx; i++) { if (err == NULL) { WOLFSSL_MSG("Error node not found. Bad index?"); wc_UnLockMutex(&debug_mutex); return BAD_FUNC_ARG; } err = err->next; } } if (file != NULL) { *file = err->file; } if (reason != NULL) { *reason = err->error; } if (line != NULL) { *line = err->line; } wc_UnLockMutex(&debug_mutex); return err->value; }
static int _InitSha(wc_Sha* sha, void* heap, int devId, word32 digestSz, word32 type) { Buffer buf[1]; word32 arg[4]; int ret; (void)heap; (void)devId; if (sha == NULL) { return BAD_FUNC_ARG; } XMEMSET(sha, 0, sizeof(Sha)); /* Set buffer for context */ buf[0].BufferType = DataBuffer | LastBuffer; buf[0].TheAddress = (Address)sha->ctx; buf[0].Length = digestSz + WC_CAAM_CTXLEN; buf[0].Transferred = 0; arg[0] = CAAM_ALG_INIT; arg[1] = digestSz + WC_CAAM_CTXLEN; if ((ret = wc_caamAddAndWait(buf, arg, type)) != 0) { WOLFSSL_MSG("Error with CAAM SHA init"); return ret; } return 0; }
static int _ShaFinal(wc_Sha* sha, byte* out, word32 digestSz, word32 type) { Buffer buf[2]; word32 arg[4]; int ret; if (sha == NULL || out == NULL) { return BAD_FUNC_ARG; } /* Set buffer for context */ buf[0].BufferType = DataBuffer; buf[0].TheAddress = (Address)sha->ctx; buf[0].Length = digestSz + WC_CAAM_CTXLEN; buf[0].Transferred = 0; /* add any potential left overs */ buf[1].BufferType = DataBuffer | LastBuffer; buf[1].TheAddress = (Address)sha->buffer; buf[1].Length = sha->buffLen; buf[1].Transferred = 0; arg[0] = CAAM_ALG_FINAL; arg[1] = digestSz + WC_CAAM_CTXLEN; if ((ret = wc_caamAddAndWait(buf, arg, type)) != 0) { WOLFSSL_MSG("Error with CAAM SHA init"); return ret; } return 0; }
static int hashHash(const byte* data, word32 len, byte* hash, word32 algo, word32 hsize) { int ret = 0; #ifdef WOLFSSL_SMALL_STACK wolfssl_TI_Hash* hash_desc; #else wolfssl_TI_Hash hash_desc[1]; #endif #ifdef WOLFSSL_SMALL_STACK hash_desc = (wolfssl_TI_Hash*)XMALLOC(sizeof(wolfssl_TI_Hash), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (hash_desc == NULL) return MEMORY_E; #endif if ((ret = hashInit(hash_desc)) != 0) { WOLFSSL_MSG("Hash Init failed"); } else { hashUpdate(hash_desc, data, len); hashFinal(hash_desc, hash, algo, hsize); } #ifdef WOLFSSL_SMALL_STACK XFREE(hash_desc, NULL, DYNAMIC_TYPE_TMP_BUFFER); #endif return ret; }
void wc_PKCS12_free(WC_PKCS12* pkcs12) { void* heap; /* if null pointer is passed in do nothing */ if (pkcs12 == NULL) { WOLFSSL_MSG("Trying to free null WC_PKCS12 object"); return; } heap = pkcs12->heap; if (pkcs12->safe != NULL) { freeSafe(pkcs12->safe, heap); } /* free mac data */ if (pkcs12->signData != NULL) { if (pkcs12->signData->digest != NULL) { XFREE(pkcs12->signData->digest, heap, DYNAMIC_TYPE_PKCS); } if (pkcs12->signData->salt != NULL) { XFREE(pkcs12->signData->salt, heap, DYNAMIC_TYPE_PKCS); } XFREE(pkcs12->signData, heap, DYNAMIC_TYPE_PKCS); } XFREE(pkcs12, NULL, DYNAMIC_TYPE_PKCS); pkcs12 = NULL; (void)heap; }
/*** This is the parent task entry ***/ void main_task (void) { #ifdef WOLFSSL_KEIL_TCP_NET init_TcpNet (); os_tsk_create (tcp_tick, 2); os_tsk_create (tcp_poll, 1); #endif #ifdef WOLFSSL_MDK_SHELL #ifdef HAVE_KEIL_RTX os_tsk_create_user(shell_main, 1, Shell_stack, SHELL_STACKSIZE) ; #else shell_main() ; #endif #else /************************************/ /*** USER APPLICATION HERE ***/ /************************************/ printf("USER LOGIC STARTED\n") ; #endif #ifdef HAVE_KEIL_RTX WOLFSSL_MSG("Terminating tcp_main\n") ; os_tsk_delete_self (); #endif }
/* The DTLS Generate Cookie callback * return : number of bytes copied into buf, or error */ int EmbedGenerateCookie(WOLFSSL* ssl, byte *buf, int sz, void *ctx) { int sd = ssl->wfd; struct sockaddr_storage peer; XSOCKLENT peerSz = sizeof(peer); byte digest[SHA_DIGEST_SIZE]; int ret = 0; (void)ctx; XMEMSET(&peer, 0, sizeof(peer)); if (getpeername(sd, (struct sockaddr*)&peer, &peerSz) != 0) { WOLFSSL_MSG("getpeername failed in EmbedGenerateCookie"); return GEN_COOKIE_E; } ret = wc_ShaHash((byte*)&peer, peerSz, digest); if (ret != 0) return ret; if (sz > SHA_DIGEST_SIZE) sz = SHA_DIGEST_SIZE; XMEMCPY(buf, digest, sz); return sz; }
/* The DTLS Generate Cookie callback * return : number of bytes copied into buf, or error */ int EmbedGenerateCookie(WOLFSSL* ssl, byte *buf, int sz, void *ctx) { WOLFSSL_DTLS_CTX* dtlsCtx = (WOLFSSL_DTLS_CTX*)ctx; struct sockaddr_storage peer; XSOCKLENT peerSz = sizeof(peer); byte digest[SHA_DIGEST_SIZE]; int ret = 0; (void)ssl; if (dtlsCtx == NULL || dtlsCtx->peer.sz == 0 || dtlsCtx->peer.sa == NULL) { WOLFSSL_MSG("Peer address was not set for this session"); return GEN_COOKIE_E; } /* Use peer's address as cookie. */ XMEMSET(&peer, 0, sizeof(peer)); XMEMCPY(&peer, dtlsCtx->peer.sa, dtlsCtx->peer.sz); ret = wc_ShaHash((byte*)&peer, peerSz, digest); if (ret != 0) { return ret; } if (sz > SHA_DIGEST_SIZE) { sz = SHA_DIGEST_SIZE; } XMEMCPY(buf, digest, sz); return sz; }
int wc_ShaHash(const byte* data, word32 len, byte* hash) { int ret = 0; #ifdef WOLFSSL_SMALL_STACK Sha* sha; #else Sha sha[1]; #endif #ifdef WOLFSSL_SMALL_STACK sha = (Sha*)XMALLOC(sizeof(Sha), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (sha == NULL) return MEMORY_E; #endif if ((ret = wc_InitSha(sha)) != 0) { WOLFSSL_MSG("wc_InitSha failed"); } else { wc_ShaUpdate(sha, data, len); wc_ShaFinal(sha, hash); } #ifdef WOLFSSL_SMALL_STACK XFREE(sha, NULL, DYNAMIC_TYPE_TMP_BUFFER); #endif return ret; }
/* Removes the error node at the specified index. * idx : if -1 then the most recent node is looked at, otherwise search * through queue for node at the given index */ void wc_RemoveErrorNode(int idx) { struct wc_error_queue* current; if (wc_LockMutex(&debug_mutex) != 0) { WOLFSSL_MSG("Lock debug mutex failed"); return; } if (idx == -1) current = wc_last_node; else { current = (struct wc_error_queue*)wc_errors; for (; current != NULL && idx > 0; idx--) current = current->next; } if (current != NULL) { if (current->prev != NULL) current->prev->next = current->next; if (wc_last_node == current) wc_last_node = current->prev; if (wc_errors == current) wc_errors = current->next; XFREE(current, current->heap, DYNAMIC_TYPE_LOG); } wc_UnLockMutex(&debug_mutex); }
/** * \brief Generate random number to be used for hash. */ int atmel_get_random_number(uint32_t count, uint8_t* rand_out) { int ret = 0; #ifdef WOLFSSL_ATECC508A uint8_t i = 0; uint32_t copy_count = 0; uint8_t rng_buffer[RANDOM_NUM_SIZE]; if (rand_out == NULL) { return -1; } while(i < count) { ret = atcatls_random(rng_buffer); if (ret != 0) { WOLFSSL_MSG("Failed to create random number!"); return -1; } copy_count = (count - i > RANDOM_NUM_SIZE) ? RANDOM_NUM_SIZE : count - i; XMEMCPY(&rand_out[i], rng_buffer, copy_count); i += copy_count; } atcab_printbin_label((const uint8_t*)"\r\nRandom Number", rand_out, count); #else // TODO: Use on-board TRNG #endif return ret; }
/* empties out the error queue into the file */ void wc_ERR_print_errors_fp(FILE* fp) { WOLFSSL_ENTER("wc_ERR_print_errors_fp"); if (wc_LockMutex(&debug_mutex) != 0) { WOLFSSL_MSG("Lock debug mutex failed"); } else { /* free all nodes from error queue and print them to file */ { struct wc_error_queue* current; struct wc_error_queue* next; current = (struct wc_error_queue*)wc_errors; while (current != NULL) { next = current->next; fprintf(fp, "%s\n", current->error); XFREE(current, current->heap, DYNAMIC_TYPE_LOG); current = next; } /* set global pointers to match having been freed */ wc_errors = NULL; wc_last_node = NULL; } wc_UnLockMutex(&debug_mutex); } }
wolfSSL_Mutex* wc_InitAndAllocMutex(void) { wolfSSL_Mutex* m = (wolfSSL_Mutex*) XMALLOC(sizeof(wolfSSL_Mutex), NULL, DYNAMIC_TYPE_MUTEX); if (m != NULL) { if (wc_InitMutex(m) != 0) { WOLFSSL_MSG("Init Mutex failed"); XFREE(m, NULL, DYNAMIC_TYPE_MUTEX); m = NULL; } } else { WOLFSSL_MSG("Memory error with Mutex allocation"); } return m; }
static int StartMonitorCRL(WOLFSSL_CRL* crl) { (void)crl; WOLFSSL_ENTER("StartMonitorCRL"); WOLFSSL_MSG("Not compiled in"); return NOT_COMPILED_IN; }
/* Start Monitoring the CRL path(s) in a thread */ static int StartMonitorCRL(WOLFSSL_CRL* crl) { int ret = SSL_SUCCESS; WOLFSSL_ENTER("StartMonitorCRL"); if (crl == NULL) return BAD_FUNC_ARG; if (crl->tid != 0) { WOLFSSL_MSG("Monitor thread already running"); return ret; /* that's ok, someone already started */ } if (pthread_create(&crl->tid, NULL, DoMonitor, crl) != 0) { WOLFSSL_MSG("Thread creation error"); return THREAD_CREATE_E; } /* wait for setup to complete */ if (LockMutex(&crl->crlLock) != 0) { WOLFSSL_MSG("LockMutex crlLock error"); return BAD_MUTEX_E; } while (crl->setup == 0) { if (pthread_cond_wait(&crl->cond, &crl->crlLock) != 0) { ret = BAD_COND_E; break; } } if (crl->setup < 0) ret = crl->setup; /* store setup error */ UnLockMutex(&crl->crlLock); if (ret < 0) { WOLFSSL_MSG("DoMonitor setup failure"); crl->tid = 0; /* thread already done */ } return ret; }
__task void tcp_poll (void) { WOLFSSL_MSG("TCP polling started.\n") ; while (1) { main_TcpNet (); #if defined (HAVE_KEIL_RTX) os_tsk_pass (); #endif } }
int wc_SetLoggingHeap(void* h) { if (wc_LockMutex(&debug_mutex) != 0) { WOLFSSL_MSG("Lock debug mutex failed"); return BAD_MUTEX_E; } wc_error_heap = h; wc_UnLockMutex(&debug_mutex); return 0; }
/* Internal function that is called by wolfCrypt_Init() */ int wc_LoggingInit(void) { if (wc_InitMutex(&debug_mutex) != 0) { WOLFSSL_MSG("Bad Init Mutex"); return BAD_MUTEX_E; } wc_errors = NULL; wc_last_node = NULL; return 0; }