summaryrefslogtreecommitdiff
path: root/wolfssl/wolfcrypt/port
diff options
context:
space:
mode:
Diffstat (limited to 'wolfssl/wolfcrypt/port')
-rw-r--r--wolfssl/wolfcrypt/port/Espressif/esp32-crypt.h152
-rw-r--r--wolfssl/wolfcrypt/port/Renesas/renesas-tsip-crypt.h153
-rw-r--r--wolfssl/wolfcrypt/port/af_alg/afalg_hash.h50
-rw-r--r--wolfssl/wolfcrypt/port/af_alg/wc_afalg.h53
-rw-r--r--wolfssl/wolfcrypt/port/arm/cryptoCell.h117
-rw-r--r--wolfssl/wolfcrypt/port/atmel/atmel.h134
-rw-r--r--wolfssl/wolfcrypt/port/caam/caam_driver.h187
-rw-r--r--wolfssl/wolfcrypt/port/caam/wolfcaam.h63
-rw-r--r--wolfssl/wolfcrypt/port/caam/wolfcaam_sha.h88
-rw-r--r--wolfssl/wolfcrypt/port/cavium/cavium_nitrox.h0
-rw-r--r--wolfssl/wolfcrypt/port/cavium/cavium_octeon_sync.h31
-rw-r--r--wolfssl/wolfcrypt/port/devcrypto/wc_devcrypto.h53
-rw-r--r--wolfssl/wolfcrypt/port/intel/quickassist.h0
-rw-r--r--wolfssl/wolfcrypt/port/intel/quickassist_mem.h0
-rw-r--r--wolfssl/wolfcrypt/port/intel/quickassist_sync.h53
-rw-r--r--wolfssl/wolfcrypt/port/nrf51.h44
-rw-r--r--wolfssl/wolfcrypt/port/nxp/ksdk_port.h93
-rw-r--r--wolfssl/wolfcrypt/port/pic32/pic32mz-crypt.h224
-rw-r--r--wolfssl/wolfcrypt/port/st/stm32.h142
-rw-r--r--wolfssl/wolfcrypt/port/st/stsafe.h99
-rw-r--r--wolfssl/wolfcrypt/port/ti/ti-ccm.h47
-rw-r--r--wolfssl/wolfcrypt/port/ti/ti-hash.h63
-rw-r--r--wolfssl/wolfcrypt/port/xilinx/xil-sha3.h45
23 files changed, 1891 insertions, 0 deletions
diff --git a/wolfssl/wolfcrypt/port/Espressif/esp32-crypt.h b/wolfssl/wolfcrypt/port/Espressif/esp32-crypt.h
new file mode 100644
index 0000000..0e342db
--- /dev/null
+++ b/wolfssl/wolfcrypt/port/Espressif/esp32-crypt.h
@@ -0,0 +1,152 @@
+/* esp32-crypt.h
+ *
+ * Copyright (C) 2006-2020 wolfSSL Inc.
+ *
+ * This file is part of wolfSSL.
+ *
+ * wolfSSL is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * wolfSSL is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
+ */
+#ifndef __ESP32_CRYPT_H__
+
+#define __ESP32_CRYPT_H__
+
+#include "esp_idf_version.h"
+#include "esp_types.h"
+#include "esp_log.h"
+
+#ifdef WOLFSSL_ESP32WROOM32_CRYPT_DEBUG
+#undef LOG_LOCAL_LEVEL
+#define LOG_LOCAL_LEVEL ESP_LOG_DEBUG
+#else
+#undef LOG_LOCAL_LEVEL
+#define LOG_LOCAL_LEVEL ESP_LOG_ERROR
+#endif
+
+#include <freertos/FreeRTOS.h>
+#include "soc/dport_reg.h"
+#include "soc/hwcrypto_reg.h"
+#include "soc/cpu.h"
+#include "driver/periph_ctrl.h"
+#if ESP_IDF_VERSION_MAJOR >= 4 && ESP_IDF_VERSION_MINOR >= 1
+#include <esp32/rom/ets_sys.h>
+#else
+#include <rom/ets_sys.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int esp_CryptHwMutexInit(wolfSSL_Mutex* mutex);
+int esp_CryptHwMutexLock(wolfSSL_Mutex* mutex, TickType_t xBloxkTime);
+int esp_CryptHwMutexUnLock(wolfSSL_Mutex* mutex);
+
+#ifndef NO_AES
+
+#if ESP_IDF_VERSION_MAJOR >= 4 && ESP_IDF_VERSION_MINOR >= 1
+#include "esp32/rom/aes.h"
+#else
+#include "rom/aes.h"
+#endif
+
+typedef enum tagES32_AES_PROCESS {
+ ESP32_AES_LOCKHW = 1,
+ ESP32_AES_UPDATEKEY_ENCRYPT = 2,
+ ESP32_AES_UPDATEKEY_DECRYPT = 3,
+ ESP32_AES_UNLOCKHW = 4
+} ESP32_AESPROCESS;
+
+struct Aes;
+int wc_esp32AesCbcEncrypt(struct Aes* aes, byte* out, const byte* in, word32 sz);
+int wc_esp32AesCbcDecrypt(struct Aes* aes, byte* out, const byte* in, word32 sz);
+int wc_esp32AesEncrypt(struct Aes *aes, const byte* in, byte* out);
+int wc_esp32AesDecrypt(struct Aes *aes, const byte* in, byte* out);
+
+#endif
+
+#ifdef WOLFSSL_ESP32WROOM32_CRYPT_DEBUG
+
+void wc_esp32TimerStart();
+uint64_t wc_esp32elapsedTime();
+
+#endif /* WOLFSSL_ESP32WROOM32_CRYPT_DEBUG */
+
+#if (!defined(NO_SHA) || !defined(NO_SHA256) || defined(WOLFSSL_SHA384) || \
+ defined(WOLFSSL_SHA512)) && \
+ !defined(NO_WOLFSSL_ESP32WROOM32_CRYPT_HASH)
+
+/* RAW hash function APIs are not implemented with esp32 hardware acceleration*/
+#define WOLFSSL_NO_HASH_RAW
+#if ESP_IDF_VERSION_MAJOR >= 4 && ESP_IDF_VERSION_MINOR >= 1
+#include "esp32/rom/sha.h"
+#else
+#include "rom/sha.h"
+#endif
+
+typedef enum {
+ ESP32_SHA_INIT = 0,
+ ESP32_SHA_HW = 1,
+ ESP32_SHA_SW = 2,
+} ESP32_DOSHA;
+
+typedef struct {
+ byte isfirstblock;
+ /* 0 , 1 hard, 2 soft */
+ byte mode;
+ /* sha_type */
+ enum SHA_TYPE sha_type;
+} WC_ESP32SHA;
+
+int esp_sha_try_hw_lock(WC_ESP32SHA* ctx);
+void esp_sha_hw_unlock( void );
+
+struct wc_Sha;
+int esp_sha_digest_process(struct wc_Sha* sha, byte bockprocess);
+int esp_sha_process(struct wc_Sha* sha, const byte* data);
+
+#ifndef NO_SHA256
+ struct wc_Sha256;
+ int esp_sha256_digest_process(struct wc_Sha256* sha, byte bockprocess);
+ int esp_sha256_process(struct wc_Sha256* sha, const byte* data);
+#endif
+
+#if defined(WOLFSSL_SHA512) || defined(WOLFSSL_SHA384)
+ struct wc_Sha512;
+ int esp_sha512_process(struct wc_Sha512* sha);
+ int esp_sha512_digest_process(struct wc_Sha512* sha, byte blockproc);
+#endif
+
+#endif /* NO_SHA && */
+
+#if !defined(NO_RSA) || defined(HAVE_ECC)
+
+#ifndef ESP_RSA_TIMEOUT
+ #define ESP_RSA_TIMEOUT 0xFFFFF
+#endif
+
+struct fp_int;
+int esp_mp_mul(struct fp_int* X, struct fp_int* Y, struct fp_int* Z);
+int esp_mp_exptmod(struct fp_int* G, struct fp_int* X, word32 Xbits, struct fp_int* P,
+ struct fp_int* Y);
+int esp_mp_mulmod(struct fp_int* X, struct fp_int* Y, struct fp_int* M,
+ struct fp_int* Z);
+
+#endif /* NO_RSA || HAVE_ECC*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __ESP32_CRYPT_H__ */
diff --git a/wolfssl/wolfcrypt/port/Renesas/renesas-tsip-crypt.h b/wolfssl/wolfcrypt/port/Renesas/renesas-tsip-crypt.h
new file mode 100644
index 0000000..2055ee0
--- /dev/null
+++ b/wolfssl/wolfcrypt/port/Renesas/renesas-tsip-crypt.h
@@ -0,0 +1,153 @@
+/* renesas-tsip-crypt.h
+ *
+ * Copyright (C) 2006-2020 wolfSSL Inc.
+ *
+ * This file is part of wolfSSL.
+ *
+ * wolfSSL is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * wolfSSL is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
+ */
+#ifndef __RENESAS_TSIP_CRYPT_H__
+#define __RENESAS_TSIP_CRYPT_H__
+
+#if defined(WOLFSSL_RENESAS_TSIP_IAREWRX)
+ #include "r_bsp/mcu/all/r_rx_compiler.h"
+ #include "r_bsp/platform.h"
+#else
+ #include "platform.h"
+#endif
+
+#include "r_tsip_rx_if.h"
+#include <wolfssl/wolfcrypt/logging.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef enum {
+ tsip_Key_SESSION = 1,
+ tsip_Key_AES128 = 2,
+ tsip_Key_AES256 = 3,
+ tsip_Key_RSA1024 = 4,
+ tsip_Key_RSA2048 = 5,
+ tsip_Key_tls_Rsa2048 = 6,
+ tsip_Key_unknown = -1,
+} wolfssl_TSIP_KEY_IV;
+
+enum {
+ l_TLS_RSA_WITH_AES_128_CBC_SHA = 0x2F,
+ l_TLS_RSA_WITH_AES_128_CBC_SHA256 = 0x3c,
+ l_TLS_RSA_WITH_AES_256_CBC_SHA = 0x35,
+ l_TLS_RSA_WITH_AES_256_CBC_SHA256 = 0x3d,
+};
+
+typedef struct
+{
+ uint8_t *encrypted_session_key;
+ uint8_t *iv;
+ uint8_t *encrypted_user_tls_key;
+ tsip_tls_ca_certification_public_key_index_t user_rsa2048_tls_pubindex;
+} tsip_key_data;
+
+struct WOLFSSL;
+
+int tsip_Open( );
+void tsip_Close( );
+int tsip_hw_lock();
+void tsip_hw_unlock( void );
+int tsip_usable(const struct WOLFSSL *ssl);
+void tsip_inform_sflash_signedcacert(const byte *ps_flash,
+ const byte *psigned_ca_cert, word32 len);
+void tsip_inform_cert_sign(const byte *sign);
+/* set / get key */
+void tsip_inform_user_keys(byte *encrypted_session_key, byte *iv,
+ byte *encrypted_user_tls_key);
+
+byte tsip_rootCAverified( );
+byte tsip_checkCA(word32 cmIdx);
+int tsip_tls_RootCertVerify(const byte *cert , word32 cert_len,
+ word32 key_n_start, word32 key_n_len,
+ word32 key_e_start, word32 key_e_len,
+ word32 cm_row);
+int tsip_tls_CertVerify(const byte *cert, word32 certSz,
+ const byte *signature, word32 sigSz,
+ word32 key_n_start, word32 key_n_len,
+ word32 key_e_start, word32 key_e_len,
+ byte *tsip_encRsaKeyIdx);
+void tsip_inform_key_position(const word32 key_n_start, const word32 key_n_len,
+ const word32 key_e_start, const word32 key_e_len);
+int tsip_generatePremasterSecret(byte *premaster, word32 preSz);
+int tsip_generateEncryptPreMasterSecret(struct WOLFSSL *ssl, byte *out,
+ word32 *outSz);
+int tsip_generateMasterSecret(const byte *pre, const byte *cr,const byte *sr,
+ byte *ms);
+int tsip_generateSeesionKey(struct WOLFSSL *ssl);
+int tsip_Sha256Hmac(const struct WOLFSSL *ssl, const byte *myInner,
+ word32 innerSz, const byte *in, word32 sz, byte *digest,
+ word32 verify);
+int tsip_Sha1Hmac(const struct WOLFSSL *ssl, const byte *myInner,
+ word32 innerSz, const byte *in, word32 sz, byte *digest,
+ word32 verify);
+
+#if (!defined(NO_SHA) || !defined(NO_SHA256)) && \
+ !defined(NO_WOLFSSL_RENESAS_TSIP_CRYPT_HASH)
+
+typedef enum {
+ TSIP_SHA1 = 0,
+ TSIP_SHA256 = 1,
+} TSIP_SHA_TYPE;
+
+typedef struct {
+ byte* msg;
+ void* heap;
+ word32 used;
+ word32 len;
+ word32 sha_type;
+} wolfssl_TSIP_Hash;
+
+/* RAW hash function APIs are not implemented with TSIP */
+#define WOLFSSL_NO_HASH_RAW
+
+typedef wolfssl_TSIP_Hash wc_Sha;
+
+#if !defined(NO_SHA256)
+ typedef wolfssl_TSIP_Hash wc_Sha256;
+#endif
+
+#endif /* NO_SHA */
+
+#if defined(WOLFSSL_RENESAS_TSIP_TLS_AES_CRYPT)
+typedef struct {
+ tsip_aes_key_index_t tsip_keyIdx;
+ word32 keySize;
+} TSIP_AES_CTX;
+
+ struct Aes;
+ int wc_tsip_AesCbcEncrypt(struct Aes* aes, byte* out, const byte* in,
+ word32 sz);
+ int wc_tsip_AesCbcDecrypt(struct Aes* aes, byte* out, const byte* in,
+ word32 sz);
+
+#endif /* WOLFSSL_RENESAS_TSIP_TLS_AES */
+
+#if defined(WOLFSSL_RENESAS_TSIP_CRYPT_DEBUG)
+byte *ret2err(word32 ret);
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __RENESAS_TSIP_CRYPT_H__ */
diff --git a/wolfssl/wolfcrypt/port/af_alg/afalg_hash.h b/wolfssl/wolfcrypt/port/af_alg/afalg_hash.h
new file mode 100644
index 0000000..bd02913
--- /dev/null
+++ b/wolfssl/wolfcrypt/port/af_alg/afalg_hash.h
@@ -0,0 +1,50 @@
+/* afalg_hash.h
+ *
+ * Copyright (C) 2006-2020 wolfSSL Inc.
+ *
+ * This file is part of wolfSSL.
+ *
+ * wolfSSL is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * wolfSSL is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
+ */
+
+
+#ifndef WOLF_CRYPT_AFALG_HASH_H
+#define WOLF_CRYPT_AFALG_HASH_H
+
+#include <wolfssl/wolfcrypt/types.h>
+
+#undef WOLFSSL_NO_HASH_RAW
+#define WOLFSSL_NO_HASH_RAW
+
+typedef struct {
+ byte* msg;
+ void* heap;
+ word32 used;
+ word32 len;
+ int alFd;
+ int rdFd;
+} wolfssl_AFALG_Hash;
+
+
+
+#if !defined(NO_SHA256) && defined(WOLFSSL_AFALG_HASH)
+ typedef wolfssl_AFALG_Hash wc_Sha256;
+#endif
+#if defined(WOLFSSL_SHA3) && defined(WOLFSSL_AFALG_XILINX_SHA3)
+ typedef wolfssl_AFALG_Hash wc_Sha3;
+#endif
+
+#endif /* WOLF_CRYPT_AFALG_HASH_H */
+
diff --git a/wolfssl/wolfcrypt/port/af_alg/wc_afalg.h b/wolfssl/wolfcrypt/port/af_alg/wc_afalg.h
new file mode 100644
index 0000000..d9f5b71
--- /dev/null
+++ b/wolfssl/wolfcrypt/port/af_alg/wc_afalg.h
@@ -0,0 +1,53 @@
+/* wc_afalg.h
+ *
+ * Copyright (C) 2006-2020 wolfSSL Inc.
+ *
+ * This file is part of wolfSSL.
+ *
+ * wolfSSL is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * wolfSSL is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
+ */
+
+
+#ifndef WOLFSSL_AFALG_H
+#define WOLFSSL_AFALG_H
+
+#include <wolfssl/wolfcrypt/types.h>
+
+#include <sys/socket.h>
+#include <linux/if_alg.h>
+#include <linux/socket.h>
+
+#define WC_SOCK_NOTSET -1
+
+/* In some cases these flags are not set in AF_ALG header files.
+ * Documentation provided at kernel.org/doc/html/v4.16/crypto/userspace-if.html
+ * suggests using these values if not set */
+#ifndef AF_ALG
+ #define AF_ALG 38
+#endif
+#ifndef SOL_ALG
+ #define SOL_ALG 279
+#endif
+
+WOLFSSL_LOCAL void wc_Afalg_SockAddr(struct sockaddr_alg* in, const char* type, const char* name);
+WOLFSSL_LOCAL int wc_Afalg_Accept(struct sockaddr_alg* in, int inSz, int sock);
+WOLFSSL_LOCAL int wc_Afalg_Socket(void);
+WOLFSSL_LOCAL int wc_Afalg_CreateRead(int sock, const char* type, const char* name);
+WOLFSSL_LOCAL int wc_Afalg_SetIv(struct cmsghdr* cmsg, byte* iv, word32 ivSz);
+WOLFSSL_LOCAL int wc_Afalg_SetOp(struct cmsghdr* cmsg, int dir);
+WOLFSSL_LOCAL int wc_Afalg_SetAad(struct cmsghdr* cmsg, word32 sz);
+
+#endif /* WOLFSSL_AFALG_H */
+
diff --git a/wolfssl/wolfcrypt/port/arm/cryptoCell.h b/wolfssl/wolfcrypt/port/arm/cryptoCell.h
new file mode 100644
index 0000000..5ca2d8c
--- /dev/null
+++ b/wolfssl/wolfcrypt/port/arm/cryptoCell.h
@@ -0,0 +1,117 @@
+/* cryptoCell.h
+ *
+ * Copyright (C) 2020 wolfSSL Inc.
+ *
+ * This file is part of wolfSSL.
+ *
+ * wolfSSL is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * wolfSSL is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
+ */
+
+#ifndef WOLFSSL_CRYPTOCELL_H
+#define WOLFSSL_CRYPTOCELL_H
+
+#if defined(WOLFSSL_CRYPTOCELL)
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <wolfssl/wolfcrypt/types.h>
+
+#include "sns_silib.h"
+
+#ifndef NO_SHA256
+ #include "crys_hash.h"
+ #include "crys_hash_error.h"
+ /* largest possible input data on CC310 DMA. */
+ #define CC310_MAX_LENGTH_DMA (0xFFFF)
+#endif
+
+#ifndef NO_AES
+ #include "ssi_aes.h"
+
+ typedef struct aes_context_t {
+ SaSiAesUserContext_t user_ctx; /* CC310 AES User context */
+ SaSiAesUserKeyData_t key; /* CC310 AES key structure */
+ SaSiAesEncryptMode_t mode; /* encrypt or decrypt */
+ } aes_context_t;
+ #define CC310_MAX_LENGTH_DMA_AES (0xFFF0)
+#endif /* NO_AES */
+
+#if !defined(WC_NO_RNG)
+ #if defined(WOLFSSL_nRF5x_SDK_15_2)
+
+/* To fix warning. MIN/MAX are defined in tfm.h and Nordic (re)defines them */
+ #undef MIN
+ #undef MAX
+/* includes to use RNG on the nRF52 */
+ #include "nrf_drv_rng.h"
+ #include "nrf_assert.h"
+ #endif
+
+ /*RNG Global variables*/
+ extern CRYS_RND_State_t wc_rndState;
+ extern CRYS_RND_WorkBuff_t wc_rndWorkBuff;
+ extern SaSiRndGenerateVectWorkFunc_t wc_rndGenVectFunc;
+ int cc310_random_generate(byte* output, word32 size);
+#endif
+
+#ifndef NO_RSA
+ #include "crys_rsa_types.h"
+ #include "crys_rnd.h"
+ #include "crys_rsa_schemes.h"
+ #include "crys_rsa_kg.h"
+ #include "crys_rsa_build.h"
+
+ typedef struct rsa_context_t {
+ CRYS_RSAUserPrivKey_t privKey;
+ CRYS_RSAUserPubKey_t pubKey;
+ } rsa_context_t;
+CRYS_RSA_HASH_OpMode_t cc310_hashModeRSA(enum wc_HashType hash_type, int isHashed);
+#endif
+
+#ifdef HAVE_ECC
+ #include "crys_ecpki_kg.h"
+ #include "crys_ecpki_dh.h"
+ #include "crys_ecpki_build.h"
+ #include "crys_ecpki_domain.h"
+ #include "crys_ecpki_ecdsa.h"
+
+ typedef struct ecc_context_t {
+ CRYS_ECPKI_UserPrivKey_t privKey;
+ CRYS_ECPKI_UserPublKey_t pubKey;
+ } ecc_context_t;
+
+CRYS_ECPKI_DomainID_t cc310_mapCurve(int curve_id);
+CRYS_ECPKI_HASH_OpMode_t cc310_hashModeECC(int hash_size);
+#endif /* HAVE_ECC */
+
+#if !defined(NO_CRYPT_BENCHMARK) && defined(WOLFSSL_nRF5x_SDK_15_2)
+ /* includes to use Real-time counter (RTC) on nRF52840 */
+ #include "nrf_gpio.h"
+ #include "nrf_drv_rtc.h"
+ #include "nrf_drv_clock.h"
+ #include "boards.h"
+ #include <stdint.h>
+ #include <stdbool.h>
+#endif /* NO_CRYPT_BENCHMARK && WOLFSSL_nRF5x_SDK_15_2*/
+
+int cc310_Init(void);
+void cc310_Free(void);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* WOLFSSL_CRYPTOCELL */
+#endif /* WOLFSSL_CRYPTOCELL_H */
diff --git a/wolfssl/wolfcrypt/port/atmel/atmel.h b/wolfssl/wolfcrypt/port/atmel/atmel.h
new file mode 100644
index 0000000..7003513
--- /dev/null
+++ b/wolfssl/wolfcrypt/port/atmel/atmel.h
@@ -0,0 +1,134 @@
+/* atmel.h
+ *
+ * Copyright (C) 2006-2020 wolfSSL Inc.
+ *
+ * This file is part of wolfSSL.
+ *
+ * wolfSSL is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * wolfSSL is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
+ */
+
+#ifndef _ATECC508_H_
+#define _ATECC508_H_
+
+#include <stdint.h>
+
+#include <wolfssl/wolfcrypt/settings.h>
+#include <wolfssl/wolfcrypt/error-crypt.h>
+
+#if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC_PKCB)
+ #undef SHA_BLOCK_SIZE
+ #define SHA_BLOCK_SIZE SHA_BLOCK_SIZE_REMAP
+ #include <cryptoauthlib.h>
+ #undef SHA_BLOCK_SIZE
+#endif
+
+/* ATECC508A only supports ECC P-256 */
+#define ATECC_KEY_SIZE (32)
+#define ATECC_PUBKEY_SIZE (ATECC_KEY_SIZE*2) /* X and Y */
+#define ATECC_SIG_SIZE (ATECC_KEY_SIZE*2) /* R and S */
+#ifndef ATECC_MAX_SLOT
+#define ATECC_MAX_SLOT (0x8) /* Only use 0-7 */
+#endif
+#define ATECC_INVALID_SLOT (0xFF)
+
+/* Device Key for signing */
+#ifndef ATECC_SLOT_AUTH_PRIV
+#define ATECC_SLOT_AUTH_PRIV (0x0)
+#endif
+/* Ephemeral key */
+#ifndef ATECC_SLOT_ECDHE_PRIV
+#define ATECC_SLOT_ECDHE_PRIV (0x2)
+#endif
+/* Symmetric encryption key */
+#ifndef ATECC_SLOT_I2C_ENC
+#define ATECC_SLOT_I2C_ENC (0x04)
+#endif
+/* Parent encryption key */
+#ifndef ATECC_SLOT_ENC_PARENT
+#define ATECC_SLOT_ENC_PARENT (0x7)
+#endif
+
+/* ATECC_KEY_SIZE required for ecc.h */
+#include <wolfssl/wolfcrypt/ecc.h>
+
+struct WOLFSSL;
+struct WOLFSSL_CTX;
+struct WOLFSSL_X509_STORE_CTX;
+struct ecc_key;
+
+/* Atmel port functions */
+int atmel_init(void);
+void atmel_finish(void);
+int atmel_get_random_number(uint32_t count, uint8_t* rand_out);
+#ifndef ATMEL_GET_RANDOM_BLOCK_DEFINED
+ int atmel_get_random_block(unsigned char* output, unsigned int sz);
+ #define ATMEL_GET_RANDOM_BLOCK_DEFINED
+#endif
+long atmel_get_curr_time_and_date(long* tm);
+
+#ifdef WOLFSSL_ATECC508A
+
+enum atmelSlotType {
+ ATMEL_SLOT_ANY,
+ ATMEL_SLOT_ENCKEY,
+ ATMEL_SLOT_DEVICE,
+ ATMEL_SLOT_ECDHE,
+ ATMEL_SLOT_ECDHE_ENC,
+};
+
+int atmel_ecc_alloc(int slotType);
+void atmel_ecc_free(int slotId);
+
+typedef int (*atmel_slot_alloc_cb)(int);
+typedef void (*atmel_slot_dealloc_cb)(int);
+int atmel_set_slot_allocator(atmel_slot_alloc_cb alloc,
+ atmel_slot_dealloc_cb dealloc);
+
+int atmel_ecc_translate_err(int status);
+int atmel_get_rev_info(word32* revision);
+void atmel_show_rev_info(void);
+
+/* The macro ATECC_GET_ENC_KEY can be set to override the default
+ encryption key with your own at build-time */
+#ifndef ATECC_GET_ENC_KEY
+ #define ATECC_GET_ENC_KEY(enckey, keysize) atmel_get_enc_key_default((enckey), (keysize))
+#endif
+int atmel_get_enc_key_default(byte* enckey, word16 keysize);
+int atmel_ecc_create_pms(int slotId, const uint8_t* peerKey, uint8_t* pms);
+int atmel_ecc_create_key(int slotId, byte* peerKey);
+int atmel_ecc_sign(int slotId, const byte* message, byte* signature);
+int atmel_ecc_verify(const byte* message, const byte* signature,
+ const byte* pubkey, int* verified);
+
+#endif /* WOLFSSL_ATECC508A */
+
+#ifdef HAVE_PK_CALLBACKS
+ int atcatls_create_key_cb(struct WOLFSSL* ssl, struct ecc_key* key, unsigned int keySz,
+ int ecc_curve, void* ctx);
+ int atcatls_create_pms_cb(struct WOLFSSL* ssl, struct ecc_key* otherKey,
+ unsigned char* pubKeyDer, word32* pubKeySz,
+ unsigned char* out, word32* outlen,
+ int side, void* ctx);
+ int atcatls_sign_certificate_cb(struct WOLFSSL* ssl, const byte* in, unsigned int inSz,
+ byte* out, word32* outSz, const byte* key, unsigned int keySz, void* ctx);
+ int atcatls_verify_signature_cb(struct WOLFSSL* ssl, const byte* sig, unsigned int sigSz,
+ const byte* hash, unsigned int hashSz, const byte* key, unsigned int keySz,
+ int* result, void* ctx);
+
+ int atcatls_set_callbacks(struct WOLFSSL_CTX* ctx);
+ int atcatls_set_callback_ctx(struct WOLFSSL* ssl, void* user_ctx);
+#endif
+
+#endif /* _ATECC508_H_ */
diff --git a/wolfssl/wolfcrypt/port/caam/caam_driver.h b/wolfssl/wolfcrypt/port/caam/caam_driver.h
new file mode 100644
index 0000000..cac1742
--- /dev/null
+++ b/wolfssl/wolfcrypt/port/caam/caam_driver.h
@@ -0,0 +1,187 @@
+/* caam_driver.h
+ *
+ * Copyright (C) 2006-2020 wolfSSL Inc.
+ *
+ * This file is part of wolfSSL.
+ *
+ * wolfSSL is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * wolfSSL is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
+ */
+
+#ifndef CAAM_DRIVER_H
+#define CAAM_DRIVER_H
+
+#define CAAM_BASE 0xf2100000
+
+#define CAAM_PAGE 0xf0100000
+#define CAAM_PAGE_MAX 6
+
+/******************************************************************************
+ Basic Descriptors
+ ****************************************************************************/
+
+/* descriptor commands */
+#define CAAM_KEY 0x00000000
+#define CAAM_LOAD 0x10000000
+#define CAAM_LOAD_CTX 0x10200000
+#define CAAM_IMM 0x00800000
+#define CAAM_FIFO_L 0x20000000
+#define CAAM_FIFO_S 0x60000000
+#define CAAM_FIFO_S_SKEY 0x60260000
+#define CAAM_STORE 0x50000000
+#define CAAM_STORE_CTX 0x50200000
+#define CAAM_MOVE 0x78000000
+#define CAAM_OP 0x80000000
+#define CAAM_SIG 0x90000000
+#define CAAM_JUMP 0xA0000000
+#define CAAM_SEQI 0xF0000000/* SEQ in */
+#define CAAM_SEQO 0xF8000000/* SEQ out */
+#define CAAM_HEAD 0xB0800000
+#define CAAM_NWB 0x00200000
+
+#define CAAM_BLOB_ENCAP 0x07000000
+#define CAAM_BLOB_DECAP 0x06000000
+#define CAAM_OPID_BLOB 0x000D0000
+
+/* algorithms modes and types */
+#define CAAM_CLASS1 0x02000000/* i.e. AES */
+#define CAAM_CLASS2 0x04000000/* i.e. hash algos */
+
+#define CAAM_ENC 0x00000001
+#define CAAM_DEC 0x00000000
+#define CAAM_ALG_INIT 0x00000004
+#define CAAM_ALG_INITF 0x0000000C
+#define CAAM_ALG_UPDATE 0x00000000
+#define CAAM_ALG_FINAL 0x00000008
+
+ /* AES 10h */
+#define CAAM_AESCTR 0x00100000
+#define CAAM_AESCBC 0x00100100
+#define CAAM_AESECB 0x00100200
+#define CAAM_AESCFB 0x00100300
+#define CAAM_AESOFB 0x00100400
+#define CAAM_CMAC 0x00100600
+#define CAAM_AESCCM 0x00100800
+
+ /* HASH 40h */
+#define CAAM_MD5 0x00400000
+#define CAAM_SHA 0x00410000
+#define CAAM_SHA224 0x00420000
+#define CAAM_SHA256 0x00430000
+#define CAAM_SHA384 0x00440000
+#define CAAM_SHA512 0x00450000
+
+ /* HMAC 40h + 10 AAI */
+#define CAAM_HMAC_MD5 0x00400010
+#define CAAM_HMAC_SHA 0x00410010
+#define CAAM_HMAC_SHA224 0x00420010
+#define CAAM_HMAC_SHA256 0x00430010
+#define CAAM_HMAC_SHA384 0x00440010
+#define CAAM_HMAC_SHA512 0x00450010
+
+#define CAAM_MD5_CTXSZ (16 + 8)
+#define CAAM_SHA_CTXSZ (20 + 8)
+#define CAAM_SHA224_CTXSZ (32 + 8)
+#define CAAM_SHA256_CTXSZ (32 + 8)
+#define CAAM_SHA384_CTXSZ (64 + 8)
+#define CAAM_SHA512_CTXSZ (64 + 8)
+
+ /* RNG 50h */
+#define CAAM_RNG 0x00500000
+
+ /* Used to get raw entropy from TRNG */
+#define CAAM_ENTROPY 0x00500001
+
+#define FIFOL_TYPE_MSG 0x00100000
+#define FIFOL_TYPE_AAD 0x00300000
+#define FIFOL_TYPE_FC1 0x00010000
+#define FIFOL_TYPE_LC1 0x00020000
+#define FIFOL_TYPE_LC2 0x00040000
+
+#define FIFOS_TYPE_MSG 0x00300000
+
+/* continue bit set if more output is expected */
+#define CAAM_FIFOS_CONT 0x00800000
+
+#define CAAM_PAGE_SZ 4096
+
+/* RNG Registers */
+#define CAAM_RTMCTL CAAM_BASE + 0X0600
+#define CAAM_RTSDCTL CAAM_BASE + 0X0610
+#define CAAM_RTFRQMIN CAAM_BASE + 0X0618
+#define CAAM_RTFRQMAX CAAM_BASE + 0X061C
+#define CAAM_RDSTA CAAM_BASE + 0X06C0
+#define CAAM_RTSTATUS CAAM_BASE + 0x063C
+
+/* each of the following 11 RTENT registers are an offset of 4 from RTENT0 */
+#define CAAM_RTENT0 CAAM_BASE + 0x0640
+#define CAAM_RTENT11 CAAM_BASE + 0x066C /* Max RTENT register */
+
+/* RNG Masks/Values */
+#ifndef CAAM_ENT_DLY
+ #define CAAM_ENT_DLY 1200 /* @TODO lower value may gain performance */
+#endif
+#define CAAM_PRGM 0x00010000 /* Set RTMCTL to program state */
+#define CAAM_TRNG 0x00000020 /* Set TRNG access */
+#define CAAM_CTLERR 0x00001000
+#define CAAM_ENTVAL 0x00000400 /* checking RTMCTL for entropy ready */
+
+/* Input Job Ring Registers */
+#define CAAM_IRBAR0 CAAM_BASE + 0x1004
+#define CAAM_IRSR0 CAAM_BASE + 0x100C
+#define CAAM_IRJAR0 CAAM_BASE + 0x101C
+
+/* Output Job Ring Registers */
+#define CAAM_ORBAR0 CAAM_BASE + 0x1024
+#define CAAM_ORSR0 CAAM_BASE + 0x102C
+#define CAAM_ORJAR0 CAAM_BASE + 0x103C
+
+
+/* Status Registers */
+#define CAAM_STATUS CAAM_BASE + 0x0FD4
+#define CAAM_VERSION_MS CAAM_BASE + 0x0FE8
+#define CAAM_VERSION_LS CAAM_BASE + 0x0FEC
+#define CAMM_SUPPORT_MS CAAM_BASE + 0x0FF0
+#define CAMM_SUPPORT_LS CAAM_BASE + 0x0FF4
+
+
+#define CAAM_C1DSR_LS CAAM_BASE + 0x8014
+#define CAAM_C1MR CAAM_BASE + 0x8004
+
+
+/* output FIFO is 16 entries deep and each entry has a two 4 byte registers */
+#define CAAM_FIFOO_MS CAAM_BASE + 0x87F0
+#define CAAM_FIFOO_LS CAAM_BASE + 0x87F4
+
+/* input FIFO is 16 entries deep with each entry having two 4 byte registers
+ All data written to it from IP bus should be in big endian format */
+#define CAAM_FIFOI_LS CAAM_BASE + 0x87E0
+
+/* offset of 4 with range 0 .. 13 */
+#define CAAM_CTX1 CAAM_BASE + 0x8100
+#define CAAM_CTRIV CAAM_CTX1 + 8 /* AES-CTR iv is in 2 and 3 */
+#define CAAM_CBCIV CAAM_CTX1 /* AES-CBC iv is in 1 and 2 */
+
+
+/* instantiate RNG and create JDKEK, TDKEK, and TDSK key */
+static unsigned int wc_rng_start[] = {
+ CAAM_HEAD | 0x00000006,
+ CAAM_OP | CAAM_CLASS1 | CAAM_RNG | 0x00000004, /* Instantiate RNG handle 0 with TRNG */
+ CAAM_JUMP | 0x02000001, /* wait for Class1 RNG and jump to next cmd */
+ CAAM_LOAD | 0x00880004, /* Load to clear written register */
+ 0x00000001, /* reset done interrupt */
+ CAAM_OP | CAAM_CLASS1 | CAAM_RNG | 0x00001000 /* Generate secure keys */
+};
+
+#endif /* CAAM_DRIVER_H */
diff --git a/wolfssl/wolfcrypt/port/caam/wolfcaam.h b/wolfssl/wolfcrypt/port/caam/wolfcaam.h
new file mode 100644
index 0000000..8c39605
--- /dev/null
+++ b/wolfssl/wolfcrypt/port/caam/wolfcaam.h
@@ -0,0 +1,63 @@
+/* wolfcaam.h
+ *
+ * Copyright (C) 2006-2020 wolfSSL Inc.
+ *
+ * This file is part of wolfSSL.
+ *
+ * wolfSSL is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * wolfSSL is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
+ */
+
+#ifndef WOLF_CRYPT_CAAM_INIT_H
+#define WOLF_CRYPT_CAAM_INIT_H
+
+#include <wolfssl/wolfcrypt/settings.h>
+
+#if defined(WOLFSSL_IMX6_CAAM) || defined(WOLFSSL_IMX6_CAAM_RNG)
+
+#include <wolfssl/wolfcrypt/types.h>
+
+#if defined(__INTEGRITY) || defined(INTEGRITY)
+ #include <INTEGRITY.h>
+#endif
+
+WOLFSSL_LOCAL int wc_caamInit(void);
+WOLFSSL_LOCAL int wc_caamFree(void);
+WOLFSSL_LOCAL int wc_caamInitRng(void);
+WOLFSSL_LOCAL int wc_caamFreeRng(void);
+
+WOLFSSL_LOCAL word32 wc_caamReadRegister(word32 reg);
+WOLFSSL_LOCAL void wc_caamWriteRegister(word32 reg, word32 value);
+WOLFSSL_LOCAL int wc_caamAddAndWait(Buffer* buf, word32 arg[4], word32 type);
+
+WOLFSSL_API int wc_caamSetResource(IODevice ioDev);
+
+WOLFSSL_API int wc_caamOpenBlob(byte* data, word32 dataSz, byte* out,
+ word32* outSz);
+WOLFSSL_API int wc_caamCreateBlob(byte* data, word32 dataSz, byte* out,
+ word32* outSz);
+
+/* additional size that is added by CAAM when creating a blob */
+#define WC_CAAM_BLOB_SZ 48
+
+#ifndef WC_CAAM_READ
+ #define WC_CAAM_READ(reg) wc_caamReadRegister((reg))
+#endif
+#ifndef WC_CAAM_WRITE
+ #define WC_CAAM_WRITE(reg, x) wc_caamWriteRegister((reg), (x))
+#endif
+
+#endif /* WOLFSSL_IMX6_CAAM */
+
+#endif /* WOLF_CRYPT_CAAM_INIT_H */
diff --git a/wolfssl/wolfcrypt/port/caam/wolfcaam_sha.h b/wolfssl/wolfcrypt/port/caam/wolfcaam_sha.h
new file mode 100644
index 0000000..9f5eaf8
--- /dev/null
+++ b/wolfssl/wolfcrypt/port/caam/wolfcaam_sha.h
@@ -0,0 +1,88 @@
+/* wolfcaam_sha.h
+ *
+ * Copyright (C) 2006-2020 wolfSSL Inc.
+ *
+ * This file is part of wolfSSL.
+ *
+ * wolfSSL is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * wolfSSL is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
+ */
+
+#ifndef WOLF_CRYPT_CAAM_SHA_H
+#define WOLF_CRYPT_CAAM_SHA_H
+
+#include <wolfssl/wolfcrypt/settings.h>
+
+#ifdef WOLFSSL_IMX6_CAAM
+
+#include <wolfssl/wolfcrypt/types.h>
+
+#define WOLFSSL_NO_HASH_RAW
+
+#ifndef WC_CAAM_CTXLEN
+/* last 8 bytes of context is for length */
+#define WC_CAAM_CTXLEN 8
+#endif
+
+#ifndef WC_CAAM_HASH_BLOCK
+/* define sha structures and also get the max possible digest. Start with SHA
+ digest size */
+#define WC_CAAM_HASH_BLOCK 64
+#endif
+
+#ifndef WC_CAAM_MAX_DIGEST
+#define WC_CAAM_MAX_DIGEST 20
+#ifdef WOLFSSL_SHA224
+ #undef WC_CAAM_MAX_DIGEST
+ #define WC_CAAM_MAX_DIGEST 32
+#endif
+
+#ifndef NO_SHA256
+ #undef WC_CAAM_MAX_DIGEST
+ #define WC_CAAM_MAX_DIGEST 32
+#endif
+
+#ifdef WOLFSSL_SHA384
+ #undef WC_CAAM_MAX_DIGEST
+ #define WC_CAAM_MAX_DIGEST 64
+#endif
+
+#ifdef WOLFSSL_SHA512
+ #undef WC_CAAM_MAX_DIGEST
+ #define WC_CAAM_MAX_DIGEST 64
+#endif
+#endif /* WC_CAAM_MAX_DIGEST */
+
+
+typedef struct wc_Sha {
+ word32 ctx[(WC_CAAM_MAX_DIGEST + WC_CAAM_CTXLEN) / sizeof(word32)];
+ word32 buffLen; /* in bytes */
+ word32 buffer[WC_CAAM_HASH_BLOCK / sizeof(word32)];
+} wc_Sha;
+
+#ifndef NO_MD5
+ typedef struct wc_Sha wc_Md5;
+#endif
+
+#ifndef NO_SHA256
+ typedef struct wc_Sha wc_Sha256;
+#endif
+
+#ifdef WOLFSSL_SHA512
+ typedef struct wc_Sha wc_Sha512;
+#endif
+
+#endif /* WOLFSSL_IMX6_CAAM */
+
+#endif /* WOLF_CRYPT_CAAM_SHA_H */
diff --git a/wolfssl/wolfcrypt/port/cavium/cavium_nitrox.h b/wolfssl/wolfcrypt/port/cavium/cavium_nitrox.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/wolfssl/wolfcrypt/port/cavium/cavium_nitrox.h
diff --git a/wolfssl/wolfcrypt/port/cavium/cavium_octeon_sync.h b/wolfssl/wolfcrypt/port/cavium/cavium_octeon_sync.h
new file mode 100644
index 0000000..f7914b8
--- /dev/null
+++ b/wolfssl/wolfcrypt/port/cavium/cavium_octeon_sync.h
@@ -0,0 +1,31 @@
+/* cavium_octeon_sync.h
+ *
+ * Copyright (C) 2006-2020 wolfSSL Inc.
+ *
+ * This file is part of wolfSSL. (formerly known as CyaSSL)
+ *
+ * wolfSSL is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * wolfSSL is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _CAVIUM_OCTEON_SYNC_H_
+#define _CAVIUM_OCTEON_SYNC_H_
+
+#ifdef HAVE_CAVIUM_OCTEON_SYNC
+
+WOLFSSL_API int wc_CryptoCb_InitOcteon(void);
+WOLFSSL_API void wc_CryptoCb_CleanupOcteon(int* id);
+
+#endif /* HAVE_CAVIUM_OCTEON_SYNC */
+#endif /* _CAVIUM_OCTEON_SYNC_H_ */
diff --git a/wolfssl/wolfcrypt/port/devcrypto/wc_devcrypto.h b/wolfssl/wolfcrypt/port/devcrypto/wc_devcrypto.h
new file mode 100644
index 0000000..c8ddbe7
--- /dev/null
+++ b/wolfssl/wolfcrypt/port/devcrypto/wc_devcrypto.h
@@ -0,0 +1,53 @@
+/* wc_devcrypto.h
+ *
+ * Copyright (C) 2006-2020 wolfSSL Inc.
+ *
+ * This file is part of wolfSSL.
+ *
+ * wolfSSL is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * wolfSSL is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
+ */
+
+
+#ifndef WOLFSSL_DEVCRYPTO_H
+#define WOLFSSL_DEVCRYPTO_H
+
+#include <wolfssl/wolfcrypt/types.h>
+
+#ifdef WOLFSSL_DEVCRYPTO
+
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <crypto/cryptodev.h>
+
+typedef struct WC_CRYPTODEV {
+ int cfd;
+ struct session_op sess;
+} WC_CRYPTODEV;
+
+WOLFSSL_LOCAL int wc_DevCryptoCreate(WC_CRYPTODEV* ctx, int type, byte* key, word32 keySz);
+WOLFSSL_LOCAL void wc_DevCryptoFree(WC_CRYPTODEV* ctx);
+WOLFSSL_LOCAL void wc_SetupCrypt(struct crypt_op* crt, WC_CRYPTODEV* dev,
+ byte* src, int srcSz, byte* dst, byte* dig, int flag);
+WOLFSSL_LOCAL void wc_SetupCryptSym(struct crypt_op* crt, WC_CRYPTODEV* dev,
+ byte* src, word32 srcSz, byte* dst, byte* iv, int flag);
+WOLFSSL_LOCAL void wc_SetupCryptAead(struct crypt_auth_op* crt, WC_CRYPTODEV* dev,
+ byte* src, word32 srcSz, byte* dst, byte* iv, word32 ivSz, int flag,
+ byte* authIn, word32 authInSz, byte* authTag, word32 authTagSz);
+
+#endif /* WOLFSSL_DEVCRYPTO */
+#endif /* WOLFSSL_DEVCRYPTO_H */
+
+
diff --git a/wolfssl/wolfcrypt/port/intel/quickassist.h b/wolfssl/wolfcrypt/port/intel/quickassist.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/wolfssl/wolfcrypt/port/intel/quickassist.h
diff --git a/wolfssl/wolfcrypt/port/intel/quickassist_mem.h b/wolfssl/wolfcrypt/port/intel/quickassist_mem.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/wolfssl/wolfcrypt/port/intel/quickassist_mem.h
diff --git a/wolfssl/wolfcrypt/port/intel/quickassist_sync.h b/wolfssl/wolfcrypt/port/intel/quickassist_sync.h
new file mode 100644
index 0000000..8eb9421
--- /dev/null
+++ b/wolfssl/wolfcrypt/port/intel/quickassist_sync.h
@@ -0,0 +1,53 @@
+/* quickassist_sync.h
+ *
+ * Copyright (C) 2006-2020 wolfSSL Inc.
+ *
+ * This file is part of wolfSSL. (formerly known as CyaSSL)
+ *
+ * wolfSSL is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * wolfSSL is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _INTEL_QUICKASSIST_SYNC_H_
+#define _INTEL_QUICKASSIST_SYNC_H_
+
+#ifdef HAVE_INTEL_QA_SYNC
+
+WOLFSSL_API int wc_CryptoCb_InitIntelQa(void);
+WOLFSSL_API void wc_CryptoCb_CleanupIntelQa(int* id);
+
+WOLFSSL_API void* wc_CryptoCb_IntelQaMalloc(size_t size,
+ void* heap, int type
+#ifdef WOLFSSL_DEBUG_MEMORY
+ , const char* func, unsigned int line
+#endif
+);
+
+WOLFSSL_API void wc_CryptoCb_IntelQaFree(void *ptr,
+ void* heap, int type
+#ifdef WOLFSSL_DEBUG_MEMORY
+ , const char* func, unsigned int line
+#endif
+);
+
+WOLFSSL_API void* wc_CryptoCb_IntelQaRealloc(void *ptr,
+ size_t size, void* heap, int type
+#ifdef WOLFSSL_DEBUG_MEMORY
+ , const char* func, unsigned int line
+#endif
+);
+
+#endif /* HAVE_INTEL_QA_SYNC */
+
+#endif /* _INTEL_QUICKASSIST_SYNC_H_ */
diff --git a/wolfssl/wolfcrypt/port/nrf51.h b/wolfssl/wolfcrypt/port/nrf51.h
new file mode 100644
index 0000000..b18b040
--- /dev/null
+++ b/wolfssl/wolfcrypt/port/nrf51.h
@@ -0,0 +1,44 @@
+/* nrf51.h
+ *
+ * Copyright (C) 2006-2020 wolfSSL Inc.
+ *
+ * This file is part of wolfSSL.
+ *
+ * wolfSSL is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * wolfSSL is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
+ */
+
+
+#ifndef WOLFSSL_NRF51_PORT_H
+#define WOLFSSL_NRF51_PORT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <wolfssl/wolfcrypt/types.h>
+
+/* Public Functions */
+int nrf51_random_generate(byte* output, word32 sz);
+
+int nrf51_aes_set_key(const byte* key);
+int nrf51_aes_encrypt(const byte* in, const byte* key, word32 rounds, byte* out);
+
+double current_time(int reset);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* WOLFSSL_NRF51_PORT_H */
diff --git a/wolfssl/wolfcrypt/port/nxp/ksdk_port.h b/wolfssl/wolfcrypt/port/nxp/ksdk_port.h
new file mode 100644
index 0000000..749a3ee
--- /dev/null
+++ b/wolfssl/wolfcrypt/port/nxp/ksdk_port.h
@@ -0,0 +1,93 @@
+/* ksdk_port.h
+ *
+ * Copyright (C) 2006-2020 wolfSSL Inc.
+ *
+ * This file is part of wolfSSL.
+ *
+ * wolfSSL is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * wolfSSL is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
+ */
+
+#ifndef _KSDK_PORT_H_
+#define _KSDK_PORT_H_
+
+#include <wolfssl/wolfcrypt/settings.h>
+#ifdef USE_FAST_MATH
+ #include <wolfssl/wolfcrypt/tfm.h>
+#elif defined WOLFSSL_SP_MATH
+ #include <wolfssl/wolfcrypt/sp_int.h>
+#else
+ #include <wolfssl/wolfcrypt/integer.h>
+#endif
+#include <wolfssl/wolfcrypt/ecc.h>
+#include <wolfssl/wolfcrypt/curve25519.h>
+#include <wolfssl/wolfcrypt/ed25519.h>
+
+
+/* API to init required hardware */
+int ksdk_port_init(void);
+
+/* software algorithm, by wolfcrypt */
+#if defined(FREESCALE_LTC_TFM)
+ int wolfcrypt_mp_mul(mp_int *A, mp_int *B, mp_int *C);
+ int wolfcrypt_mp_mod(mp_int *a, mp_int *b, mp_int *c);
+ int wolfcrypt_mp_mulmod(mp_int *a, mp_int *b, mp_int *c, mp_int *d);
+ int wolfcrypt_mp_mod(mp_int *a, mp_int *b, mp_int *c);
+ int wolfcrypt_mp_invmod(mp_int *a, mp_int *b, mp_int *c);
+ int wolfcrypt_mp_exptmod(mp_int *G, mp_int *X, mp_int *P, mp_int *Y);
+
+ /* Exported mp_mulmod function */
+ int mp_mulmod(mp_int *a, mp_int *b, mp_int *c, mp_int *d);
+
+#endif /* FREESCALE_LTC_TFM */
+
+#if defined(FREESCALE_LTC_ECC)
+ #include "fsl_ltc.h"
+
+ typedef enum _fsl_ltc_ecc_coordinate_system
+ {
+ kLTC_Weierstrass = 0U, /*< Point coordinates on an elliptic curve in Weierstrass form */
+ kLTC_Curve25519 = 1U, /*< Point coordinates on an Curve25519 elliptic curve in Montgomery form */
+ kLTC_Ed25519 = 2U, /*< Point coordinates on an Ed25519 elliptic curve in twisted Edwards form */
+ } fsl_ltc_ecc_coordinate_system_t;
+
+ int wc_ecc_point_add(ecc_point *mG, ecc_point *mQ, ecc_point *mR, mp_int *m);
+
+ #ifdef HAVE_CURVE25519
+ int wc_curve25519(ECPoint *q, byte *n, const ECPoint *p, fsl_ltc_ecc_coordinate_system_t type);
+ const ECPoint *wc_curve25519_GetBasePoint(void);
+ status_t LTC_PKHA_Curve25519ToWeierstrass(const ltc_pkha_ecc_point_t *ltcPointIn, ltc_pkha_ecc_point_t *ltcPointOut);
+ status_t LTC_PKHA_WeierstrassToCurve25519(const ltc_pkha_ecc_point_t *ltcPointIn, ltc_pkha_ecc_point_t *ltcPointOut);
+ status_t LTC_PKHA_Curve25519ComputeY(ltc_pkha_ecc_point_t *ltcPoint);
+ #endif
+
+ #ifdef HAVE_ED25519
+ status_t LTC_PKHA_Ed25519ToWeierstrass(const ltc_pkha_ecc_point_t *ltcPointIn, ltc_pkha_ecc_point_t *ltcPointOut);
+ status_t LTC_PKHA_WeierstrassToEd25519(const ltc_pkha_ecc_point_t *ltcPointIn, ltc_pkha_ecc_point_t *ltcPointOut);
+ status_t LTC_PKHA_Ed25519_PointMul(const ltc_pkha_ecc_point_t *ltcPointIn,
+ const uint8_t *N,
+ size_t sizeN,
+ ltc_pkha_ecc_point_t *ltcPointOut,
+ fsl_ltc_ecc_coordinate_system_t typeOut);
+ const ltc_pkha_ecc_point_t *LTC_PKHA_Ed25519_BasePoint(void);
+ status_t LTC_PKHA_Ed25519_PointDecompress(const uint8_t *pubkey, size_t pubKeySize, ltc_pkha_ecc_point_t *ltcPointOut);
+ status_t LTC_PKHA_sc_reduce(uint8_t *a);
+ status_t LTC_PKHA_sc_muladd(uint8_t *s, const uint8_t *a, const uint8_t *b, const uint8_t *c);
+ status_t LTC_PKHA_SignatureForVerify(uint8_t *rcheck, const unsigned char *a, const unsigned char *b, ed25519_key *key);
+ status_t LTC_PKHA_Ed25519_Compress(const ltc_pkha_ecc_point_t *ltcPointIn, uint8_t *p);
+ #endif
+
+#endif /* FREESCALE_LTC_ECC */
+
+#endif /* _KSDK_PORT_H_ */
diff --git a/wolfssl/wolfcrypt/port/pic32/pic32mz-crypt.h b/wolfssl/wolfcrypt/port/pic32/pic32mz-crypt.h
new file mode 100644
index 0000000..bb288c7
--- /dev/null
+++ b/wolfssl/wolfcrypt/port/pic32/pic32mz-crypt.h
@@ -0,0 +1,224 @@
+/* pic32mz-crypt.h
+ *
+ * Copyright (C) 2006-2020 wolfSSL Inc.
+ *
+ * This file is part of wolfSSL.
+ *
+ * wolfSSL is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * wolfSSL is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
+ */
+
+
+#ifndef PIC32MZ_CRYPT_H
+#define PIC32MZ_CRYPT_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#include <wolfssl/wolfcrypt/settings.h>
+
+#ifdef WOLFSSL_MICROCHIP_PIC32MZ
+
+#ifndef MICROCHIP_PIC32
+ #define MICROCHIP_PIC32
+#endif
+
+/* If algos aren't enabled then turn off */
+#ifdef WOLFSSL_PIC32MZ_HASH
+ #if defined(NO_MD5) && defined(NO_SHA) && defined(NO_SHA256)
+ #undef WOLFSSL_PIC32MZ_HASH
+ #endif
+#endif
+
+#ifdef WOLFSSL_PIC32MZ_CRYPT
+ #if defined(NO_AES) && defined(NO_DES3)
+ #undef WOLFSSL_PIC32MZ_CRYPT
+ #endif
+#endif
+
+/* Enables support for large hashing */
+/* requires exclusive access to crypto hardware done at application layer */
+#define WOLFSSL_PIC32MZ_LARGE_HASH
+
+#include <xc.h>
+#include <sys/endian.h>
+#include <sys/kmem.h>
+
+
+/* PIC32 Crypto Structures */
+typedef struct saCtrl {
+ unsigned int CRYPTOALGO : 4;
+ unsigned int MULTITASK : 3;
+ unsigned int KEYSIZE : 2;
+ unsigned int ENCTYPE : 1;
+ unsigned int ALGO : 7;
+ unsigned int : 3;
+ unsigned int FLAGS : 1;
+ unsigned int FB : 1;
+ unsigned int LOADIV : 1;
+ unsigned int LNC : 1;
+ unsigned int IRFLAG : 1;
+ unsigned int ICVONLY : 1;
+ unsigned int OR_EN : 1;
+ unsigned int NO_RX : 1;
+ unsigned int : 1;
+ unsigned int VERIFY : 1;
+ unsigned int : 2;
+} saCtrl;
+
+typedef struct securityAssociation {
+ saCtrl SA_CTRL;
+ unsigned int SA_AUTHKEY[8];
+ unsigned int SA_ENCKEY[8];
+ unsigned int SA_AUTHIV[8];
+ unsigned int SA_ENCIV[4];
+} securityAssociation;
+
+typedef struct bdCtrl {
+ unsigned int BUFLEN : 16;
+ unsigned int CBD_INT_EN : 1;
+ unsigned int PKT_INT_EN : 1;
+ unsigned int LIFM : 1;
+ unsigned int LAST_BD : 1;
+ unsigned int CRDMA_EN : 1;
+ unsigned int UPD_RES : 1;
+ unsigned int SA_FETCH_EN : 1;
+ unsigned int SEC_CODE : 8;
+ volatile unsigned int DESC_EN : 1;
+} bdCtrl;
+
+typedef struct bufferDescriptor {
+ bdCtrl BD_CTRL;
+ unsigned int SA_ADDR;
+ unsigned int SRCADDR;
+ unsigned int DSTADDR;
+ unsigned int NXTPTR;
+ unsigned int UPDPTR;
+ unsigned int MSGLEN;
+ unsigned int ENCOFF;
+} bufferDescriptor;
+
+
+/* Cache Updates Struct */
+typedef struct hashUpdCache {
+ unsigned char* buf;
+ unsigned int bufLen;
+ unsigned int updLen;
+ int isCopy;
+#ifdef WOLFSSL_PIC32MZ_LARGE_HASH
+ unsigned int finalLen;
+#endif
+} hashUpdCache;
+
+
+/* Direction */
+#define PIC32_ENCRYPTION 0b1
+#define PIC32_DECRYPTION 0b0
+
+/* Algorithm */
+#define PIC32_ALGO_HMAC1 0b01000000
+#define PIC32_ALGO_SHA256 0b00100000
+#define PIC32_ALGO_SHA1 0b00010000
+#define PIC32_ALGO_MD5 0b00001000
+
+#define PIC32_ALGO_AES 0b00000100
+#define PIC32_ALGO_TDES 0b00000010
+#define PIC32_ALGO_DES 0b00000001
+
+/* Crypto Algo */
+/* AES */
+#define PIC32_CRYPTOALGO_AES_GCM 0b1110
+#define PIC32_CRYPTOALGO_RCTR 0b1101
+#define PIC32_CRYPTOALGO_RCBC_MAC 0b1100
+#define PIC32_CRYPTOALGO_ROFB 0b1011
+#define PIC32_CRYPTOALGO_RCFB 0b1010
+#define PIC32_CRYPTOALGO_RCBC 0b1001
+#define PIC32_CRYPTOALGO_RECB 0b1000
+/* Triple-DES */
+#define PIC32_CRYPTOALGO_TOFB 0b0111
+#define PIC32_CRYPTOALGO_TCFB 0b0110
+#define PIC32_CRYPTOALGO_TCBC 0b0101
+#define PIC32_CRYPTOALGO_TECB 0b0100
+/* DES */
+#define PIC32_CRYPTOALGO_OFB 0b0011
+#define PIC32_CRYPTOALGO_CFB 0b0010
+#define PIC32_CRYPTOALGO_CBC 0b0001
+#define PIC32_CRYPTOALGO_ECB 0b0000
+
+/* Key Size */
+#define PIC32_KEYSIZE_256 0b10
+#define PIC32_KEYSIZE_192 0b01
+#define PIC32_KEYSIZE_128 0b00
+
+/* PIC32 Minimum Buffer/Block Sizes */
+#define PIC32_BLOCKSIZE_HASH 64
+#define PIC32_BLOCKSIZE_HMAC PIC32_BLOCKSIZE_HASH
+#define PIC32_BLOCKSIZE_MD5 PIC32_BLOCKSIZE_HASH
+#define PIC32_BLOCKSIZE_SHA1 PIC32_BLOCKSIZE_HASH
+#define PIC32_BLOCKSIZE_SHA256 PIC32_BLOCKSIZE_HASH
+#define PIC32_BLOCKSIZE_AES 16
+#define PIC32_BLOCKSIZE_TDES 24
+#define PIC32_BLOCKSIZE_DES 8
+
+#define PIC32_DIGEST_SIZE 32
+
+
+/* Helper Macros */
+#define PIC32MZ_IF_RAM(addr) (KVA_TO_PA(addr) < 0x1D000000)
+
+/* If EF part then Crypto engine supports swapping output bytes */
+#define PIC32_NO_OUT_SWAP ((__PIC32_FEATURE_SET0 == 'E') && \
+ (__PIC32_FEATURE_SET1 == 'C'))
+
+
+#ifndef NO_AES
+int wc_Pic32AesCrypt(word32 *key, int keyLen, word32 *iv, int ivLen,
+ byte* out, const byte* in, word32 sz,
+ int dir, int algo, int cryptoalgo);
+#endif
+#ifndef NO_DES3
+int wc_Pic32DesCrypt(word32 *key, int keyLen, word32 *iv, int ivLen,
+ byte* out, const byte* in, word32 sz,
+ int dir, int algo, int cryptoalgo);
+#endif
+
+#ifdef WOLFSSL_PIC32MZ_HASH
+#define WOLFSSL_NO_HASH_RAW
+
+int wc_Pic32Hash(const byte* in, int inLen, word32* out, int outLen, int algo);
+int wc_Pic32HashCopy(hashUpdCache* src, hashUpdCache* dst);
+
+#ifndef NO_MD5
+struct wc_Md5;
+void wc_Md5Pic32Free(struct wc_Md5* md5);
+#endif
+#ifndef NO_SHA
+struct wc_Sha;
+void wc_ShaPic32Free(struct wc_Sha* sha);
+#endif
+
+#ifndef NO_SHA256
+struct wc_Sha256;
+void wc_Sha256Pic32Free(struct wc_Sha256* sha256);
+#endif
+#endif /* WOLFSSL_PIC32MZ_HASH */
+
+#endif /* WOLFSSL_MICROCHIP_PIC32MZ */
+
+#ifdef __cplusplus
+ } /* extern "C" */
+#endif
+
+#endif /* PIC32MZ_CRYPT_H */
diff --git a/wolfssl/wolfcrypt/port/st/stm32.h b/wolfssl/wolfcrypt/port/st/stm32.h
new file mode 100644
index 0000000..4b461a1
--- /dev/null
+++ b/wolfssl/wolfcrypt/port/st/stm32.h
@@ -0,0 +1,142 @@
+/* stm32.h
+ *
+ * Copyright (C) 2006-2020 wolfSSL Inc.
+ *
+ * This file is part of wolfSSL.
+ *
+ * wolfSSL is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * wolfSSL is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
+ */
+
+#ifndef _WOLFPORT_STM32_H_
+#define _WOLFPORT_STM32_H_
+
+/* Generic STM32 Hashing and Crypto Functions */
+/* Supports CubeMX HAL or Standard Peripheral Library */
+
+#include <wolfssl/wolfcrypt/settings.h>
+#include <wolfssl/wolfcrypt/types.h>
+
+#if defined(WOLFSSL_STM32_PKA) && defined(HAVE_ECC)
+ #include <wolfssl/wolfcrypt/integer.h>
+ #include <wolfssl/wolfcrypt/ecc.h>
+#endif
+
+#ifdef STM32_HASH
+
+#define WOLFSSL_NO_HASH_RAW
+
+#ifdef HASH_DIGEST
+ /* The HASH_DIGEST register indicates SHA224/SHA256 support */
+ #define STM32_HASH_SHA2
+ #define HASH_CR_SIZE 54
+ #define HASH_MAX_DIGEST 32
+#else
+ #define HASH_CR_SIZE 50
+ #define HASH_MAX_DIGEST 20
+#endif
+
+/* Handle hash differences between CubeMX and StdPeriLib */
+#if !defined(HASH_ALGOMODE_HASH) && defined(HASH_AlgoMode_HASH)
+ #define HASH_ALGOMODE_HASH HASH_AlgoMode_HASH
+#endif
+#if !defined(HASH_DATATYPE_8B) && defined(HASH_DataType_8b)
+ #define HASH_DATATYPE_8B HASH_DataType_8b
+#endif
+
+#ifndef STM32_HASH_TIMEOUT
+ #define STM32_HASH_TIMEOUT 0xFFFF
+#endif
+
+
+/* STM32 register size in bytes */
+#define STM32_HASH_REG_SIZE 4
+
+/* STM32 Hash Context */
+typedef struct {
+ /* Context switching registers */
+ uint32_t HASH_IMR;
+ uint32_t HASH_STR;
+ uint32_t HASH_CR;
+ uint32_t HASH_CSR[HASH_CR_SIZE];
+
+ /* Hash state / buffers */
+ word32 buffer[STM32_HASH_REG_SIZE / sizeof(word32)]; /* partial word buffer */
+ word32 buffLen; /* partial word remain */
+ word32 loLen; /* total update bytes
+ (only lsb 6-bits is used for nbr valid bytes in last word) */
+} STM32_HASH_Context;
+
+
+/* API's */
+void wc_Stm32_Hash_Init(STM32_HASH_Context* stmCtx);
+int wc_Stm32_Hash_Update(STM32_HASH_Context* stmCtx, word32 algo,
+ const byte* data, int len);
+int wc_Stm32_Hash_Final(STM32_HASH_Context* stmCtx, word32 algo,
+ byte* hash, int digestSize);
+
+#endif /* STM32_HASH */
+
+
+#ifdef STM32_CRYPTO
+
+#ifndef NO_AES
+ #if !defined(STM32_CRYPTO_AES_GCM) && (defined(WOLFSSL_STM32F4) || \
+ defined(WOLFSSL_STM32F7) || defined(WOLFSSL_STM32L4))
+ /* Hardware supports AES GCM acceleration */
+ #define STM32_CRYPTO_AES_GCM
+ #endif
+
+ #ifdef WOLFSSL_STM32L4
+ #define STM32_CRYPTO_AES_ONLY /* crypto engine only supports AES */
+ #define CRYP AES
+ #endif
+
+ /* Detect newer CubeMX crypto HAL (HAL_CRYP_Encrypt / HAL_CRYP_Decrypt) */
+ #if !defined(STM32_HAL_V2) && \
+ defined(WOLFSSL_STM32F7) && defined(CRYP_AES_GCM)
+ #define STM32_HAL_V2
+ #endif
+
+ /* The datatype for STM32 CubeMX HAL Crypt calls */
+ #ifdef STM32_HAL_V2
+ #define STM_CRYPT_TYPE uint32_t
+ #else
+ #define STM_CRYPT_TYPE uint8_t
+ #endif
+
+ /* CRYPT_AES_GCM starts the IV with 2 */
+ #define STM32_GCM_IV_START 2
+
+ struct Aes;
+ #ifdef WOLFSSL_STM32_CUBEMX
+ int wc_Stm32_Aes_Init(struct Aes* aes, CRYP_HandleTypeDef* hcryp);
+ #else /* STD_PERI_LIB */
+ int wc_Stm32_Aes_Init(struct Aes* aes, CRYP_InitTypeDef* cryptInit,
+ CRYP_KeyInitTypeDef* keyInit);
+ #endif /* WOLFSSL_STM32_CUBEMX */
+#endif /* !NO_AES */
+
+#endif /* STM32_CRYPTO */
+
+#if defined(WOLFSSL_STM32_PKA) && defined(HAVE_ECC)
+int stm32_ecc_verify_hash_ex(mp_int *r, mp_int *s, const byte* hash,
+ word32 hashlen, int* res, ecc_key* key);
+
+int stm32_ecc_sign_hash_ex(const byte* hash, word32 hashlen, WC_RNG* rng,
+ ecc_key* key, mp_int *r, mp_int *s);
+#endif
+
+
+#endif /* _WOLFPORT_STM32_H_ */
diff --git a/wolfssl/wolfcrypt/port/st/stsafe.h b/wolfssl/wolfcrypt/port/st/stsafe.h
new file mode 100644
index 0000000..3cee446
--- /dev/null
+++ b/wolfssl/wolfcrypt/port/st/stsafe.h
@@ -0,0 +1,99 @@
+/* stsafe.h
+ *
+ * Copyright (C) 2006-2020 wolfSSL Inc.
+ *
+ * This file is part of wolfSSL.
+ *
+ * wolfSSL is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * wolfSSL is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
+ */
+
+#ifndef _WOLFPORT_STSAFE_H_
+#define _WOLFPORT_STSAFE_H_
+
+#include <wolfssl/wolfcrypt/settings.h>
+#include <wolfssl/wolfcrypt/ecc.h>
+#include <wolfssl/wolfcrypt/error-crypt.h>
+
+#ifdef WOLF_CRYPTO_CB
+#include <wolfssl/wolfcrypt/cryptocb.h>
+#endif
+
+#if !defined(WOLFCRYPT_ONLY) && defined(HAVE_PK_CALLBACKS)
+#include <wolfssl/ssl.h>
+#endif
+
+#ifdef WOLFSSL_STSAFEA100
+
+/* The wolf STSAFE interface layer */
+/* Please contact wolfSSL for the STSAFE port files */
+#include "stsafe_interface.h"
+
+#ifndef STSAFE_MAX_KEY_LEN
+ #define STSAFE_MAX_KEY_LEN ((uint32_t)48) /* for up to 384-bit keys */
+#endif
+#ifndef STSAFE_MAX_PUBKEY_RAW_LEN
+ #define STSAFE_MAX_PUBKEY_RAW_LEN ((uint32_t)STSAFE_MAX_KEY_LEN * 2) /* x/y */
+#endif
+#ifndef STSAFE_MAX_SIG_LEN
+ #define STSAFE_MAX_SIG_LEN ((uint32_t)STSAFE_MAX_KEY_LEN * 2) /* r/s */
+#endif
+
+WOLFSSL_API int SSL_STSAFE_LoadDeviceCertificate(byte** pRawCertificate,
+ word32* pRawCertificateLen);
+
+#if !defined(WOLFCRYPT_ONLY) && defined(HAVE_PK_CALLBACKS)
+WOLFSSL_API int SSL_STSAFE_CreateKeyCb(WOLFSSL* ssl, ecc_key* key, word32 keySz,
+ int ecc_curve, void* ctx);
+WOLFSSL_API int SSL_STSAFE_VerifyPeerCertCb(WOLFSSL* ssl,
+ const unsigned char* sig, unsigned int sigSz,
+ const unsigned char* hash, unsigned int hashSz,
+ const unsigned char* keyDer, unsigned int keySz,
+ int* result, void* ctx);
+WOLFSSL_API int SSL_STSAFE_SignCertificateCb(WOLFSSL* ssl,
+ const byte* in, word32 inSz,
+ byte* out, word32* outSz,
+ const byte* key, word32 keySz, void* ctx);
+WOLFSSL_API int SSL_STSAFE_SharedSecretCb(WOLFSSL* ssl,
+ ecc_key* otherKey,
+ unsigned char* pubKeyDer, unsigned int* pubKeySz,
+ unsigned char* out, unsigned int* outlen,
+ int side, void* ctx);
+
+/* Helper API's for setting up callbacks */
+WOLFSSL_API int SSL_STSAFE_SetupPkCallbacks(WOLFSSL_CTX* ctx);
+WOLFSSL_API int SSL_STSAFE_SetupPkCallbackCtx(WOLFSSL* ssl, void* user_ctx);
+#endif /* HAVE_PK_CALLBACKS */
+
+
+#ifdef WOLF_CRYPTO_CB
+
+/* Device ID that's unique and valid (not INVALID_DEVID -2) */
+#define WOLF_STSAFE_DEVID 0x53545341; /* STSA */
+
+typedef struct wolfSTSAFE_CryptoCb_Ctx {
+#ifdef HAVE_ECC
+ ecc_key wolfEccKey;
+#endif
+ int devId;
+} wolfSTSAFE_CryptoCb_Ctx;
+
+WOLFSSL_API int wolfSSL_STSAFE_CryptoDevCb(int devId, wc_CryptoInfo* info,
+ void* ctx);
+
+#endif /* WOLF_CRYPTO_CB */
+
+#endif /* WOLFSSL_STSAFEA100 */
+
+#endif /* _WOLFPORT_STSAFE_H_ */
diff --git a/wolfssl/wolfcrypt/port/ti/ti-ccm.h b/wolfssl/wolfcrypt/port/ti/ti-ccm.h
new file mode 100644
index 0000000..f704d77
--- /dev/null
+++ b/wolfssl/wolfcrypt/port/ti/ti-ccm.h
@@ -0,0 +1,47 @@
+/* port/ti/ti_ccm.c
+ *
+ * Copyright (C) 2006-2020 wolfSSL Inc.
+ *
+ * This file is part of wolfSSL.
+ *
+ * wolfSSL is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * wolfSSL is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
+ */
+
+
+#ifndef WOLF_CRYPT_TI_CCM_H
+#define WOLF_CRYPT_TI_CCM_H
+
+#ifdef HAVE_CONFIG_H
+ #include <config.h>
+#endif
+
+#include <wolfssl/wolfcrypt/settings.h>
+
+#if defined(WOLFSSL_TI_CRYPT) || defined(WOLFSSL_TI_HASH)
+
+int wolfSSL_TI_CCMInit(void) ;
+
+#ifndef SINGLE_THREADED
+void wolfSSL_TI_lockCCM(void) ;
+void wolfSSL_TI_unlockCCM(void) ;
+#else
+#define wolfSSL_TI_lockCCM()
+#define wolfSSL_TI_unlockCCM()
+#endif
+
+#endif
+
+#endif
+
diff --git a/wolfssl/wolfcrypt/port/ti/ti-hash.h b/wolfssl/wolfcrypt/port/ti/ti-hash.h
new file mode 100644
index 0000000..1c21245
--- /dev/null
+++ b/wolfssl/wolfcrypt/port/ti/ti-hash.h
@@ -0,0 +1,63 @@
+/* port/ti/ti-hash.h
+ *
+ * Copyright (C) 2006-2020 wolfSSL Inc.
+ *
+ * This file is part of wolfSSL.
+ *
+ * wolfSSL is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * wolfSSL is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
+ */
+
+
+#ifndef WOLF_CRYPT_TI_HASH_H
+#define WOLF_CRYPT_TI_HASH_H
+
+#include <wolfssl/wolfcrypt/types.h>
+
+#ifndef WOLFSSL_TI_INITBUFF
+ #define WOLFSSL_TI_INITBUFF 64
+#endif
+
+#ifndef WOLFSSL_MAX_HASH_SIZE
+ #define WOLFSSL_MAX_HASH_SIZE 64
+#endif
+
+#define WOLFSSL_NO_HASH_RAW
+
+typedef struct {
+ byte *msg;
+ word32 used;
+ word32 len;
+ byte hash[WOLFSSL_MAX_HASH_SIZE];
+} wolfssl_TI_Hash;
+
+
+#ifndef TI_HASH_TEST
+
+#if !defined(NO_MD5)
+ typedef wolfssl_TI_Hash wc_Md5;
+#endif
+#if !defined(NO_SHA)
+ typedef wolfssl_TI_Hash wc_Sha;
+#endif
+#if !defined(NO_SHA256)
+ typedef wolfssl_TI_Hash wc_Sha256;
+#endif
+#if defined(WOLFSSL_SHA224)
+ typedef wolfssl_TI_Hash wc_Sha224;
+#endif
+
+#endif /* !TI_HASH_TEST */
+
+#endif /* WOLF_CRYPT_TI_HASH_H */
diff --git a/wolfssl/wolfcrypt/port/xilinx/xil-sha3.h b/wolfssl/wolfcrypt/port/xilinx/xil-sha3.h
new file mode 100644
index 0000000..47b4624
--- /dev/null
+++ b/wolfssl/wolfcrypt/port/xilinx/xil-sha3.h
@@ -0,0 +1,45 @@
+/* xil-sha3.h
+ *
+ * Copyright (C) 2006-2020 wolfSSL Inc.
+ *
+ * This file is part of wolfSSL.
+ *
+ * wolfSSL is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * wolfSSL is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
+ */
+
+
+#ifndef WOLF_XIL_CRYPT_SHA3_H
+#define WOLF_XIL_CRYPT_SHA3_H
+
+#ifdef WOLFSSL_SHA3
+#include "xsecure_sha.h"
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Sha3 digest */
+typedef struct Sha3 {
+ XSecure_Sha3 hw;
+ XCsuDma dma;
+} wc_Sha3;
+
+#ifdef __cplusplus
+ } /* extern "C" */
+#endif
+
+#endif /* WOLFSSL_SHA3 */
+#endif /* WOLF_XIL_CRYPT_SHA3_H */
+