mirror of
https://github.com/wolfSSL/wolfssl.git
synced 2026-07-05 11:50:52 +02:00
Merge pull request #10278 from twcook86/lpc55s69_crypto
Add wolfCrypt support for lpc55s69 hw crypto
This commit is contained in:
@@ -862,6 +862,15 @@ WOLFSSL_NO_TICKET_EXPIRE
|
||||
WOLFSSL_NO_TRUSTED_CERTS_VERIFY
|
||||
WOLFSSL_NO_WORD64_OPS
|
||||
WOLFSSL_NO_XOR_OPS
|
||||
WOLFSSL_NXP_LPC55S6X
|
||||
WOLFSSL_NXP_CASPER
|
||||
WOLFSSL_NXP_CASPER_ECC_MULMOD
|
||||
WOLFSSL_NXP_CASPER_ECC_MUL2ADD
|
||||
WOLFSSL_NXP_CASPER_RSA_PUB_EXPTMOD
|
||||
WOLFSSL_NXP_HASHCRYPT
|
||||
WOLFSSL_NXP_HASHCRYPT_AES
|
||||
WOLFSSL_NXP_HASHCRYPT_SHA
|
||||
WOLFSSL_NXP_RNG_1
|
||||
WOLFSSL_NRF51_AES
|
||||
WOLFSSL_OLDTLS_AEAD_CIPHERSUITES
|
||||
WOLFSSL_OLD_SET_CURVES_LIST
|
||||
|
||||
+26
-3
@@ -140,6 +140,10 @@ block cipher mechanism that uses n-bit binary string parameter key with 128-bits
|
||||
#include <wolfssl/wolfcrypt/cryptocb.h>
|
||||
#endif
|
||||
|
||||
#ifdef WOLFSSL_NXP_HASHCRYPT_AES
|
||||
#include <wolfssl/wolfcrypt/port/nxp/hashcrypt_port.h>
|
||||
#endif
|
||||
|
||||
#ifdef WOLFSSL_SECO_CAAM
|
||||
#include <wolfssl/wolfcrypt/port/caam/wolfcaam.h>
|
||||
#endif
|
||||
@@ -5103,7 +5107,8 @@ static void AesSetKey_C(Aes* aes, const byte* key, word32 keySz, int dir)
|
||||
|
||||
#if defined(WOLF_CRYPTO_CB) || (defined(WOLFSSL_DEVCRYPTO) && \
|
||||
(defined(WOLFSSL_DEVCRYPTO_AES) || defined(WOLFSSL_DEVCRYPTO_CBC))) || \
|
||||
(defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_AES))
|
||||
(defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_AES)) || \
|
||||
defined(WOLFSSL_NXP_HASHCRYPT_AES)
|
||||
#ifdef WOLF_CRYPTO_CB
|
||||
if (aes->devId != INVALID_DEVID)
|
||||
#endif
|
||||
@@ -6477,6 +6482,9 @@ int wc_AesSetIV(Aes* aes, const byte* iv)
|
||||
#elif defined(WOLFSSL_DEVCRYPTO_CBC)
|
||||
/* implemented in wolfcrypt/src/port/devcrypt/devcrypto_aes.c */
|
||||
|
||||
#elif defined(WOLFSSL_NXP_HASHCRYPT_AES)
|
||||
/* implemented in wolfcrypt/src/port/nxp/hashcrypt_port.c */
|
||||
|
||||
#elif defined(WOLFSSL_SILABS_SE_ACCEL)
|
||||
/* implemented in wolfcrypt/src/port/silabs/silabs_aes.c */
|
||||
|
||||
@@ -7144,7 +7152,11 @@ int wc_AesCbcEncrypt(Aes* aes, byte* out, const byte* in, word32 sz)
|
||||
#define NEED_AES_CTR_SOFT
|
||||
|
||||
#elif defined(WOLFSSL_HAVE_PSA) && !defined(WOLFSSL_PSA_NO_AES)
|
||||
/* implemented in wolfcrypt/src/port/psa/psa_aes.c */
|
||||
/* implemented in wolfcrypt/src/port/psa/psa_aes.c */
|
||||
|
||||
#elif defined(WOLFSSL_NXP_HASHCRYPT_AES)
|
||||
/* implemented in wolfcrypt/src/port/nxp/hashcrypt_port.c */
|
||||
|
||||
#else
|
||||
|
||||
/* Use software based AES counter */
|
||||
@@ -13939,6 +13951,9 @@ int wc_AesGetKeySize(Aes* aes, word32* keySize)
|
||||
#elif defined(WOLFSSL_RISCV_ASM)
|
||||
/* implemented in wolfcrypt/src/port/riscv/riscv-64-aes.c */
|
||||
|
||||
#elif defined(WOLFSSL_NXP_HASHCRYPT_AES)
|
||||
/* implemented in wolfcrypt/src/port/nxp/hashcrypt_port.c */
|
||||
|
||||
#elif defined(WOLFSSL_SILABS_SE_ACCEL)
|
||||
/* implemented in wolfcrypt/src/port/silabs/silabs_aes.c */
|
||||
|
||||
@@ -14234,7 +14249,10 @@ int wc_AesEcbDecrypt(Aes* aes, byte* out, const byte* in, word32 sz)
|
||||
|
||||
#if defined(WOLFSSL_AES_CFB)
|
||||
|
||||
#if defined(WOLFSSL_PSOC6_CRYPTO)
|
||||
#if defined(WOLFSSL_NXP_HASHCRYPT_AES)
|
||||
/* implemented in wolfcrypt/src/port/nxp/hashcrypt_port.c */
|
||||
|
||||
#elif defined(WOLFSSL_PSOC6_CRYPTO)
|
||||
|
||||
int wc_AesCfbEncrypt(Aes* aes, byte* out, const byte* in, word32 sz)
|
||||
{
|
||||
@@ -14683,6 +14701,10 @@ int wc_AesCfb8Decrypt(Aes* aes, byte* out, const byte* in, word32 sz)
|
||||
#endif /* WOLFSSL_AES_CFB */
|
||||
|
||||
#ifdef WOLFSSL_AES_OFB
|
||||
#ifdef WOLFSSL_NXP_HASHCRYPT_AES
|
||||
/* implemented in wolfcrypt/src/port/nxp/hashcrypt_port.c */
|
||||
|
||||
#else /* software */
|
||||
/* OFB AES mode
|
||||
*
|
||||
* aes structure holding key to use for encryption
|
||||
@@ -14785,6 +14807,7 @@ int wc_AesOfbDecrypt(Aes* aes, byte* out, const byte* in, word32 sz)
|
||||
return AesOfbCrypt_C(aes, out, in, sz);
|
||||
}
|
||||
#endif /* HAVE_AES_DECRYPT */
|
||||
#endif /* software */
|
||||
#endif /* WOLFSSL_AES_OFB */
|
||||
|
||||
|
||||
|
||||
@@ -71,6 +71,8 @@ EXTRA_DIST += wolfcrypt/src/port/ti/ti-aes.c \
|
||||
wolfcrypt/src/port/nxp/dcp_port.c \
|
||||
wolfcrypt/src/port/nxp/se050_port.c \
|
||||
wolfcrypt/src/port/nxp/README.md \
|
||||
wolfcrypt/src/port/nxp/casper_port.c \
|
||||
wolfcrypt/src/port/nxp/hashcrypt_port.c \
|
||||
wolfcrypt/src/port/atmel/README.md \
|
||||
wolfcrypt/src/port/xilinx/xil-sha3.c \
|
||||
wolfcrypt/src/port/xilinx/xil-aesgcm.c \
|
||||
|
||||
@@ -1,6 +1,47 @@
|
||||
# wolfSSL NXP Hardware Acceleration Ports
|
||||
|
||||
wolfSSL supports hardware acceleration on NXP DCP, LTC (KSDK), and SE050.
|
||||
wolfSSL supports hardware acceleration on NXP DCP, LTC (KSDK), LPC55S69, and SE050.
|
||||
|
||||
## NXP LPC55S69
|
||||
|
||||
The LPC55S69 is a general purpose edge computing device, with dual ARM
|
||||
Cortex-M33 cores running up to 150 MHz, 640/320 KB internal flash/ram,
|
||||
TrustZone-M, a DSP accelerator, and extensive cryptographic acceleration.
|
||||
|
||||
wolfSSL supports the following hardware acceleration on the LPC55S69:
|
||||
- TRNG
|
||||
- HashCrypt (Hash/AES Crypto Engine)
|
||||
- AES (128, 192, 256) encrypt/decrypt
|
||||
- AES-CBC, AES-ECB, AES-CTR, AES-OFB, AES-CFB
|
||||
- SHA-1, SHA-256
|
||||
- CASPER (Asymmetric Crypto Accelerator)
|
||||
- RSA verify/encrypt/decrypt (up to 4096-bit, public key only)
|
||||
|
||||
### LPC55S69 Hardware Acceleration Caveats
|
||||
|
||||
The following caveats should be noted about the LPC55S69 hardware acceleration:
|
||||
- AES-CTR mode fails when the counter wraps from all FF's to 0. User should
|
||||
ensure this never happens, by properly managing the iv/counter in use.
|
||||
- AES-CFB and AES-OFB only support full 16-byte blocks and multiples thereof.
|
||||
Encrypt/Decrypt requests of other sizes will fail.
|
||||
- RSA acceleration is only supported for public keys. Private key operations
|
||||
will use a fully software implementation.
|
||||
- When the HashCrypt engine is in use for SHA-1 or SHA-256, it must not be
|
||||
interrupted with another hash request or an AES request. The hash must be
|
||||
completed before another operation is requested.
|
||||
|
||||
### wolfSSL LPC55S69 Hardware Acceleration Enable
|
||||
|
||||
To enable only the TRNG, define the following symbol:
|
||||
|
||||
**`WOLFSSL_NXP_RNG_1`**
|
||||
|
||||
To enable all LPC55S69 hardware acceleration, including the TRNG,
|
||||
define the following symbol:
|
||||
|
||||
**`WOLFSSL_NXP_LPC55S6X`**
|
||||
|
||||
NOTE: Both can be defined with no problem.
|
||||
|
||||
## NXP SE050
|
||||
|
||||
@@ -10,3 +51,4 @@ see [README_SE050.md](./README_SE050.md).
|
||||
## Support
|
||||
|
||||
For questions please email support@wolfssl.com
|
||||
|
||||
|
||||
@@ -0,0 +1,249 @@
|
||||
/* casper_port.c
|
||||
*
|
||||
* Copyright (C) 2006-2026 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 3 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
|
||||
*/
|
||||
|
||||
#include <wolfssl/wolfcrypt/libwolfssl_sources.h>
|
||||
|
||||
#ifdef WOLFSSL_NXP_CASPER
|
||||
|
||||
#if defined(WOLFSSL_CRYPT_HW_MUTEX) && WOLFSSL_CRYPT_HW_MUTEX > 0
|
||||
#error WOLFSSL_CRYPT_HW_MUTEX=1 not supported yet
|
||||
#endif
|
||||
|
||||
#include <wolfssl/wolfcrypt/error-crypt.h>
|
||||
#include <wolfssl/wolfcrypt/port/nxp/casper_port.h>
|
||||
#include "fsl_casper.h"
|
||||
|
||||
int wc_casper_init(void)
|
||||
{
|
||||
CASPER_Init(CASPER);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if !defined(NO_RSA) && defined(WOLFSSL_NXP_CASPER_RSA_PUB_EXPTMOD)
|
||||
|
||||
#define CASPER_MAX_BUF_SZ 512
|
||||
static uint8_t key_buf[CASPER_MAX_BUF_SZ];
|
||||
static uint8_t sig_buf[CASPER_MAX_BUF_SZ];
|
||||
static uint8_t out_buf[CASPER_MAX_BUF_SZ];
|
||||
|
||||
int casper_rsa_public_exptmod(
|
||||
const byte* in, word32 inLen, byte* out, word32* outLen, RsaKey* key
|
||||
)
|
||||
{
|
||||
int res;
|
||||
int sig_sz = inLen;
|
||||
int key_sz = mp_unsigned_bin_size(&key->n);
|
||||
word32 exp = 0;
|
||||
|
||||
if (inLen > CASPER_MAX_BUF_SZ || *outLen > CASPER_MAX_BUF_SZ)
|
||||
return BAD_FUNC_ARG;
|
||||
|
||||
/* casper requires little endian format for inputs/outputs */
|
||||
XMEMCPY(sig_buf, in, sig_sz);
|
||||
mp_reverse(sig_buf, sig_sz);
|
||||
|
||||
if ((res = mp_to_unsigned_bin(&key->n, key_buf)) != MP_OKAY)
|
||||
return res;
|
||||
mp_reverse(key_buf, key_sz);
|
||||
|
||||
if ((res = mp_to_unsigned_bin(&key->e, (uint8_t *)&exp)) != MP_OKAY)
|
||||
return res;
|
||||
|
||||
CASPER_ModExp(CASPER, (void *)sig_buf, (void *)key_buf,
|
||||
key_sz / sizeof(uint32_t), exp, out_buf);
|
||||
|
||||
mp_reverse(out_buf, sig_sz);
|
||||
XMEMCPY(out, out_buf, sig_sz);
|
||||
|
||||
*outLen = inLen;
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif /* !NO_RSA && WOLFSSL_NXP_CASPER_RSA_PUB_EXPTMOD */
|
||||
|
||||
|
||||
/* 32 for 256 bits, 48 for 384 bits and 72 for 521 bits... */
|
||||
#define CASPER_MAX_ECC_SIZE_BYTES (72)
|
||||
|
||||
#if defined(HAVE_ECC) && defined(WOLFSSL_NXP_CASPER_ECC_MULMOD)
|
||||
/* calculates R = m*P[X, Y] */
|
||||
int casper_ecc_mulmod(
|
||||
const mp_int *m, ecc_point *P, ecc_point *R, int curve_id
|
||||
)
|
||||
{
|
||||
uint32_t M[CASPER_MAX_ECC_SIZE_BYTES / sizeof(uint32_t)] = { 0 };
|
||||
uint32_t X[CASPER_MAX_ECC_SIZE_BYTES / sizeof(uint32_t)] = { 0 };
|
||||
uint32_t Y[CASPER_MAX_ECC_SIZE_BYTES / sizeof(uint32_t)] = { 0 };
|
||||
int size;
|
||||
|
||||
if (!m || !P || !R)
|
||||
return BAD_FUNC_ARG;
|
||||
|
||||
if (curve_id == ECC_SECP256R1)
|
||||
{
|
||||
size = 32;
|
||||
CASPER_ecc_init(kCASPER_ECC_P256);
|
||||
}
|
||||
else if (curve_id == ECC_SECP384R1)
|
||||
{
|
||||
size = 48;
|
||||
CASPER_ecc_init(kCASPER_ECC_P384);
|
||||
}
|
||||
else if (curve_id == ECC_SECP521R1)
|
||||
{
|
||||
size = 66;
|
||||
CASPER_ecc_init(kCASPER_ECC_P521);
|
||||
}
|
||||
else
|
||||
return BAD_FUNC_ARG;
|
||||
|
||||
/* scalar */
|
||||
if (mp_to_unsigned_bin(m, (unsigned char *)&M[0]) != MP_OKAY)
|
||||
return MP_TO_E;
|
||||
mp_reverse((unsigned char *)&M[0], size);
|
||||
|
||||
/* point */
|
||||
if (mp_to_unsigned_bin(P->x, (unsigned char *)&X[0]) != MP_OKAY)
|
||||
return MP_TO_E;
|
||||
mp_reverse((unsigned char *)&X[0], size);
|
||||
if (mp_to_unsigned_bin(P->y, (unsigned char *)&Y[0]) != MP_OKAY)
|
||||
return MP_TO_E;
|
||||
mp_reverse((unsigned char *)&Y[0], size);
|
||||
|
||||
if (curve_id == ECC_SECP256R1)
|
||||
{
|
||||
CASPER_ECC_SECP256R1_Mul(CASPER, X, Y, X, Y, (void *)M);
|
||||
}
|
||||
else if (curve_id == ECC_SECP384R1)
|
||||
{
|
||||
CASPER_ECC_SECP384R1_Mul(CASPER, X, Y, X, Y, (void *)M);
|
||||
}
|
||||
else if (curve_id == ECC_SECP521R1)
|
||||
{
|
||||
CASPER_ECC_SECP521R1_Mul(CASPER, X, Y, X, Y, (void *)M);
|
||||
}
|
||||
|
||||
/* result */
|
||||
mp_reverse((unsigned char *)&X[0], size);
|
||||
if (mp_read_unsigned_bin(R->x, (unsigned char *)&X[0], size) != MP_OKAY)
|
||||
return MP_READ_E;
|
||||
mp_reverse((unsigned char *)&Y[0], size);
|
||||
if (mp_read_unsigned_bin(R->y, (unsigned char *)&Y[0], size) != MP_OKAY)
|
||||
return MP_READ_E;
|
||||
mp_set(R->z, 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif /* HAVE_ECC && WOLFSSL_NXP_CASPER_ECC_MULMOD */
|
||||
|
||||
#if defined(HAVE_ECC) && defined(WOLFSSL_NXP_CASPER_ECC_MUL2ADD)
|
||||
/* calculates R = m*P[X, Y] + n*Q[X, Y] */
|
||||
int casper_ecc_mul2add(
|
||||
const mp_int *m, ecc_point *P, const mp_int *n, ecc_point *Q,
|
||||
ecc_point *R, int curve_id
|
||||
)
|
||||
{
|
||||
uint32_t M[CASPER_MAX_ECC_SIZE_BYTES / sizeof(uint32_t)] = { 0 };
|
||||
uint32_t X1[CASPER_MAX_ECC_SIZE_BYTES / sizeof(uint32_t)] = { 0 };
|
||||
uint32_t Y1[CASPER_MAX_ECC_SIZE_BYTES / sizeof(uint32_t)] = { 0 };
|
||||
uint32_t N[CASPER_MAX_ECC_SIZE_BYTES / sizeof(uint32_t)] = { 0 };
|
||||
uint32_t X2[CASPER_MAX_ECC_SIZE_BYTES / sizeof(uint32_t)] = { 0 };
|
||||
uint32_t Y2[CASPER_MAX_ECC_SIZE_BYTES / sizeof(uint32_t)] = { 0 };
|
||||
int size;
|
||||
|
||||
if (!m || !P || !n || !Q || !R)
|
||||
return BAD_FUNC_ARG;
|
||||
|
||||
if (curve_id == ECC_SECP256R1)
|
||||
{
|
||||
size = 32;
|
||||
CASPER_ecc_init(kCASPER_ECC_P256);
|
||||
}
|
||||
else if (curve_id == ECC_SECP384R1)
|
||||
{
|
||||
size = 48;
|
||||
CASPER_ecc_init(kCASPER_ECC_P384);
|
||||
}
|
||||
else if (curve_id == ECC_SECP521R1)
|
||||
{
|
||||
size = 66;
|
||||
CASPER_ecc_init(kCASPER_ECC_P521);
|
||||
}
|
||||
else
|
||||
return BAD_FUNC_ARG;
|
||||
|
||||
/* first scalar */
|
||||
if (mp_to_unsigned_bin(m, (unsigned char *)&M[0]) != MP_OKAY)
|
||||
return MP_TO_E;
|
||||
mp_reverse((unsigned char *)&M[0], size);
|
||||
|
||||
/* first point */
|
||||
if (mp_to_unsigned_bin(P->x, (unsigned char *)&X1[0]) != MP_OKAY)
|
||||
return MP_TO_E;
|
||||
mp_reverse((unsigned char *)&X1[0], size);
|
||||
if (mp_to_unsigned_bin(P->y, (unsigned char *)&Y1[0]) != MP_OKAY)
|
||||
return MP_TO_E;
|
||||
mp_reverse((unsigned char *)&Y1[0], size);
|
||||
|
||||
/* second scalar */
|
||||
if (mp_to_unsigned_bin(n, (unsigned char *)&N[0]) != MP_OKAY)
|
||||
return MP_TO_E;
|
||||
mp_reverse((unsigned char *)&N[0], size);
|
||||
|
||||
/* second point */
|
||||
if (mp_to_unsigned_bin(Q->x, (unsigned char *)&X2[0]) != MP_OKAY)
|
||||
return MP_TO_E;
|
||||
mp_reverse((unsigned char *)&X2[0], size);
|
||||
if (mp_to_unsigned_bin(Q->y, (unsigned char *)&Y2[0]) != MP_OKAY)
|
||||
return MP_TO_E;
|
||||
mp_reverse((unsigned char *)&Y2[0], size);
|
||||
|
||||
if (curve_id == ECC_SECP256R1)
|
||||
{
|
||||
CASPER_ECC_SECP256R1_MulAdd(CASPER, &X1[0], &Y1[0], &X1[0], &Y1[0],
|
||||
(void *)M, &X2[0], &Y2[0], (void *)N);
|
||||
}
|
||||
else if (curve_id == ECC_SECP384R1)
|
||||
{
|
||||
CASPER_ECC_SECP384R1_MulAdd(CASPER, &X1[0], &Y1[0], &X1[0], &Y1[0],
|
||||
(void *)M, &X2[0], &Y2[0], (void *)N);
|
||||
}
|
||||
else if (curve_id == ECC_SECP521R1)
|
||||
{
|
||||
CASPER_ECC_SECP521R1_MulAdd(CASPER, &X1[0], &Y1[0], &X1[0], &Y1[0],
|
||||
(void *)M, &X2[0], &Y2[0], (void *)N);
|
||||
}
|
||||
|
||||
/* result */
|
||||
mp_reverse((unsigned char *)&X1[0], size);
|
||||
if (mp_read_unsigned_bin(R->x, (unsigned char *)&X1[0], size) != MP_OKAY)
|
||||
return MP_READ_E;
|
||||
mp_reverse((unsigned char *)&Y1[0], size);
|
||||
if (mp_read_unsigned_bin(R->y, (unsigned char *)&Y1[0], size) != MP_OKAY)
|
||||
return MP_READ_E;
|
||||
mp_set(R->z, 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif /* HAVE_ECC && WOLFSSL_NXP_CASPER_ECC_MUL2ADD */
|
||||
|
||||
#endif /* WOLFSSL_NXP_CASPER */
|
||||
@@ -0,0 +1,393 @@
|
||||
/* hashcrypt_port.c
|
||||
*
|
||||
* Copyright (C) 2006-2026 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 3 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
|
||||
*/
|
||||
|
||||
#include <wolfssl/wolfcrypt/libwolfssl_sources.h>
|
||||
|
||||
#ifdef WOLFSSL_NXP_HASHCRYPT
|
||||
|
||||
#if defined(WOLFSSL_CRYPT_HW_MUTEX) && WOLFSSL_CRYPT_HW_MUTEX > 0
|
||||
#error WOLFSSL_CRYPT_HW_MUTEX=1 not supported yet
|
||||
#endif
|
||||
|
||||
#include <wolfssl/wolfcrypt/aes.h>
|
||||
#include <wolfssl/wolfcrypt/sha.h>
|
||||
#include <wolfssl/wolfcrypt/sha256.h>
|
||||
#include <wolfssl/wolfcrypt/error-crypt.h>
|
||||
#include "fsl_hashcrypt.h"
|
||||
|
||||
#if (!defined(NO_SHA) || !defined(NO_SHA256)) && \
|
||||
defined(WOLFSSL_NXP_HASHCRYPT_SHA)
|
||||
static hashcrypt_hash_ctx_t hash_ctx;
|
||||
static int finish_called;
|
||||
#endif
|
||||
|
||||
#if !defined(NO_AES) && defined(WOLFSSL_NXP_HASHCRYPT_AES)
|
||||
hashcrypt_handle_t aes_handle;
|
||||
#endif
|
||||
|
||||
int wc_hashcrypt_init(void)
|
||||
{
|
||||
#if ((!defined(NO_SHA) || !defined(NO_SHA256)) && \
|
||||
defined(WOLFSSL_NXP_HASHCRYPT_SHA)) || \
|
||||
(!defined(NO_AES) && defined(WOLFSSL_NXP_HASHCRYPT_AES))
|
||||
HASHCRYPT_Init(HASHCRYPT);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if !defined(NO_SHA256) && defined(WOLFSSL_NXP_HASHCRYPT_SHA)
|
||||
int wc_InitSha256_ex(wc_Sha256* sha256, void* heap, int devId)
|
||||
{
|
||||
(void)heap;
|
||||
(void)devId;
|
||||
|
||||
if (sha256 == NULL)
|
||||
return BAD_FUNC_ARG;
|
||||
|
||||
XMEMSET(sha256, 0, sizeof(wc_Sha256));
|
||||
if (HASHCRYPT_SHA_Init(HASHCRYPT, &hash_ctx, kHASHCRYPT_Sha256)
|
||||
!= kStatus_Success)
|
||||
return WC_HW_E;
|
||||
|
||||
finish_called = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int wc_Sha256Update(wc_Sha256* sha256, const byte* data, word32 len)
|
||||
{
|
||||
if (sha256 == NULL || (data == NULL && len != 0))
|
||||
return BAD_FUNC_ARG;
|
||||
|
||||
if (finish_called)
|
||||
{
|
||||
HASHCRYPT_SHA_Init(HASHCRYPT, &hash_ctx, kHASHCRYPT_Sha256);
|
||||
finish_called = 0;
|
||||
}
|
||||
if (HASHCRYPT_SHA_Update(HASHCRYPT, &hash_ctx, data, len)
|
||||
!= kStatus_Success)
|
||||
return WC_HW_E;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int wc_Sha256Final(wc_Sha256* sha256, byte* hash)
|
||||
{
|
||||
size_t outlen = WC_SHA256_DIGEST_SIZE;
|
||||
static byte previous_sha256_hash[WC_SHA256_DIGEST_SIZE];
|
||||
|
||||
if (sha256 == NULL || hash == NULL)
|
||||
return BAD_FUNC_ARG;
|
||||
|
||||
if (finish_called)
|
||||
{
|
||||
memcpy(hash, previous_sha256_hash, WC_SHA256_DIGEST_SIZE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (
|
||||
HASHCRYPT_SHA_Finish(HASHCRYPT, &hash_ctx, hash, &outlen)
|
||||
!= kStatus_Success
|
||||
|| outlen != WC_SHA256_DIGEST_SIZE
|
||||
)
|
||||
{
|
||||
return WC_HW_E;
|
||||
}
|
||||
memcpy(previous_sha256_hash, hash, WC_SHA256_DIGEST_SIZE);
|
||||
finish_called = 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif /* !defined(NO_SHA256) && defined(WOLFSSL_NXP_HASHCRYPT_SHA) */
|
||||
|
||||
|
||||
#if !defined(NO_SHA) && defined(WOLFSSL_NXP_HASHCRYPT_SHA)
|
||||
int wc_InitSha_ex(wc_Sha* sha, void* heap, int devId)
|
||||
{
|
||||
(void)heap;
|
||||
(void)devId;
|
||||
|
||||
if (sha == NULL)
|
||||
return BAD_FUNC_ARG;
|
||||
|
||||
XMEMSET(sha, 0, sizeof(wc_Sha));
|
||||
if (HASHCRYPT_SHA_Init(HASHCRYPT, &hash_ctx, kHASHCRYPT_Sha1)
|
||||
!= kStatus_Success)
|
||||
return WC_HW_E;
|
||||
|
||||
finish_called = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int wc_ShaUpdate(wc_Sha* sha, const byte* data, word32 len)
|
||||
{
|
||||
if (sha == NULL || (data == NULL && len != 0))
|
||||
return BAD_FUNC_ARG;
|
||||
|
||||
if (finish_called)
|
||||
{
|
||||
HASHCRYPT_SHA_Init(HASHCRYPT, &hash_ctx, kHASHCRYPT_Sha1);
|
||||
finish_called = 0;
|
||||
}
|
||||
if (HASHCRYPT_SHA_Update(HASHCRYPT, &hash_ctx, data, len)
|
||||
!= kStatus_Success)
|
||||
return WC_HW_E;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int wc_ShaFinal(wc_Sha* sha, byte* hash)
|
||||
{
|
||||
size_t outlen = WC_SHA_DIGEST_SIZE;
|
||||
static byte previous_sha_hash[WC_SHA_DIGEST_SIZE];
|
||||
|
||||
if (sha == NULL || hash == NULL)
|
||||
return BAD_FUNC_ARG;
|
||||
|
||||
if (finish_called)
|
||||
{
|
||||
memcpy(hash, previous_sha_hash, WC_SHA_DIGEST_SIZE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (
|
||||
HASHCRYPT_SHA_Finish(HASHCRYPT, &hash_ctx, hash, &outlen)
|
||||
!= kStatus_Success
|
||||
|| outlen != WC_SHA_DIGEST_SIZE
|
||||
)
|
||||
{
|
||||
return WC_HW_E;
|
||||
}
|
||||
memcpy(previous_sha_hash, hash, WC_SHA_DIGEST_SIZE);
|
||||
finish_called = 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif /* !defined(NO_SHA) && defined(WOLFSSL_NXP_HASHCRYPT_SHA) */
|
||||
|
||||
|
||||
#if !defined(NO_AES) && defined(WOLFSSL_NXP_HASHCRYPT_AES)
|
||||
static int _hashcrypt_set_key(Aes* aes)
|
||||
{
|
||||
aes_handle.keyType = kHASHCRYPT_UserKey;
|
||||
|
||||
if (aes->keylen == 128/8)
|
||||
aes_handle.keySize = kHASHCRYPT_Aes128;
|
||||
else if (aes->keylen == 192/8)
|
||||
aes_handle.keySize = kHASHCRYPT_Aes192;
|
||||
else if (aes->keylen == 256/8)
|
||||
aes_handle.keySize = kHASHCRYPT_Aes256;
|
||||
else
|
||||
return BAD_FUNC_ARG;
|
||||
|
||||
if (HASHCRYPT_AES_SetKey(
|
||||
HASHCRYPT, &aes_handle, (const uint8_t *)aes->devKey, aes->keylen
|
||||
) != kStatus_Success
|
||||
)
|
||||
return WC_HW_E;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef HAVE_AES_ECB
|
||||
int wc_AesEcbEncrypt(Aes* aes, byte* out, const byte* in, word32 sz)
|
||||
{
|
||||
int ret = _hashcrypt_set_key(aes);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (HASHCRYPT_AES_EncryptEcb(HASHCRYPT, &aes_handle, in, out, sz)
|
||||
!= kStatus_Success)
|
||||
return WC_HW_E;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef HAVE_AES_DECRYPT
|
||||
int wc_AesEcbDecrypt(Aes* aes, byte* out, const byte* in, word32 sz)
|
||||
{
|
||||
int ret = _hashcrypt_set_key(aes);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (HASHCRYPT_AES_DecryptEcb(HASHCRYPT, &aes_handle, in, out, sz)
|
||||
!= kStatus_Success)
|
||||
return WC_HW_E;
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
#endif /* HAVE_AES_ECB */
|
||||
|
||||
#ifdef HAVE_AES_CBC
|
||||
int wc_AesCbcEncrypt(Aes* aes, byte* out, const byte* in, word32 sz)
|
||||
{
|
||||
int ret = _hashcrypt_set_key(aes);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (HASHCRYPT_AES_EncryptCbc(
|
||||
HASHCRYPT, &aes_handle, in, out, sz, (const uint8_t *)aes->reg)
|
||||
!= kStatus_Success)
|
||||
return WC_HW_E;
|
||||
|
||||
XMEMCPY(aes->reg, out + sz - 16, 16);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef HAVE_AES_DECRYPT
|
||||
int wc_AesCbcDecrypt(Aes* aes, byte* out, const byte* in, word32 sz)
|
||||
{
|
||||
int ret;
|
||||
byte tmp_iv[16];
|
||||
|
||||
ret = _hashcrypt_set_key(aes);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
XMEMCPY(tmp_iv, in + sz - 16, 16);
|
||||
|
||||
if (HASHCRYPT_AES_DecryptCbc(
|
||||
HASHCRYPT, &aes_handle, in, out, sz, (const uint8_t *)aes->reg)
|
||||
!= kStatus_Success)
|
||||
return WC_HW_E;
|
||||
|
||||
XMEMCPY(aes->reg, tmp_iv, 16);
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
#endif /* HAVE_AES_CBC */
|
||||
|
||||
#ifdef WOLFSSL_AES_OFB
|
||||
int wc_AesOfbEncrypt(Aes* aes, byte* out, const byte* in, word32 sz)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = _hashcrypt_set_key(aes);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (HASHCRYPT_AES_CryptOfb(
|
||||
HASHCRYPT, &aes_handle, in, out, sz, (const uint8_t *)aes->reg)
|
||||
!= kStatus_Success)
|
||||
return WC_HW_E;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef HAVE_AES_DECRYPT
|
||||
int wc_AesOfbDecrypt(Aes* aes, byte* out, const byte* in, word32 sz)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = _hashcrypt_set_key(aes);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (HASHCRYPT_AES_CryptOfb(
|
||||
HASHCRYPT, &aes_handle, in, out, sz, (const uint8_t *)aes->reg)
|
||||
!= kStatus_Success)
|
||||
return WC_HW_E;
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
#endif /* WOLFSSL_AES_OFB */
|
||||
|
||||
#ifdef WOLFSSL_AES_CFB
|
||||
int wc_AesCfbEncrypt(Aes* aes, byte* out, const byte* in, word32 sz)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = _hashcrypt_set_key(aes);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (HASHCRYPT_AES_EncryptCfb(
|
||||
HASHCRYPT, &aes_handle, in, out, sz, (const uint8_t *)aes->reg)
|
||||
!= kStatus_Success)
|
||||
return WC_HW_E;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef HAVE_AES_DECRYPT
|
||||
int wc_AesCfbDecrypt(Aes* aes, byte* out, const byte* in, word32 sz)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = _hashcrypt_set_key(aes);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (HASHCRYPT_AES_DecryptCfb(
|
||||
HASHCRYPT, &aes_handle, in, out, sz, (const uint8_t *)aes->reg)
|
||||
!= kStatus_Success)
|
||||
return WC_HW_E;
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
#endif /* WOLFSSL_AES_CFB */
|
||||
|
||||
#ifdef WOLFSSL_AES_COUNTER
|
||||
int wc_AesCtrEncrypt(Aes* aes, byte* out, const byte* in, word32 sz)
|
||||
{
|
||||
int ret;
|
||||
byte* tmp;
|
||||
|
||||
if (aes == NULL || out == NULL || in == NULL) {
|
||||
return BAD_FUNC_ARG;
|
||||
}
|
||||
|
||||
/* consume any unused bytes left in aes->tmp */
|
||||
tmp = (byte*)aes->tmp + WC_AES_BLOCK_SIZE - aes->left;
|
||||
while (aes->left && sz) {
|
||||
*(out++) = *(in++) ^ *(tmp++);
|
||||
aes->left--;
|
||||
sz--;
|
||||
}
|
||||
|
||||
if (sz) {
|
||||
ret = _hashcrypt_set_key(aes);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (HASHCRYPT_AES_CryptCtr(
|
||||
HASHCRYPT, &aes_handle, in, out, sz, (byte *)aes->reg,
|
||||
(byte *)aes->tmp, (word32 *)&aes->left)
|
||||
!= kStatus_Success)
|
||||
return WC_HW_E;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif /* WOLFSSL_AES_COUNTER */
|
||||
|
||||
#endif /* !defined(NO_AES) && defined(WOLFSSL_NXP_HASHCRYPT_AES) */
|
||||
|
||||
#endif /* WOLFSSL_NXP_HASHCRYPT */
|
||||
@@ -5151,6 +5151,22 @@ int wc_GenerateSeed(OS_Seed* os, byte* output, word32 sz)
|
||||
return ret;
|
||||
}
|
||||
|
||||
#elif defined(WOLFSSL_NXP_RNG_1)
|
||||
#include "fsl_rng.h"
|
||||
|
||||
int wc_GenerateSeed(OS_Seed* os, byte* output, word32 sz) {
|
||||
(void)os;
|
||||
|
||||
if (output == NULL) {
|
||||
return BUFFER_E;
|
||||
}
|
||||
|
||||
if (RNG_GetRandomData(RNG, output, sz) != kStatus_Success)
|
||||
return RNG_FAILURE_E;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#elif defined(DOLPHIN_EMULATOR) || defined (WOLFSSL_NDS)
|
||||
|
||||
int wc_GenerateSeed(OS_Seed* os, byte* output, word32 sz)
|
||||
|
||||
@@ -56,6 +56,9 @@ RSA keys can be used to encrypt, decrypt, sign and verify data.
|
||||
#ifdef WOLFSSL_HAVE_SP_RSA
|
||||
#include <wolfssl/wolfcrypt/sp.h>
|
||||
#endif
|
||||
#if defined(WOLFSSL_NXP_CASPER_RSA_PUB_EXPTMOD)
|
||||
#include <wolfssl/wolfcrypt/port/nxp/casper_port.h>
|
||||
#endif
|
||||
|
||||
#if defined(WOLFSSL_USE_SAVE_VECTOR_REGISTERS) && !defined(WOLFSSL_SP_ASM)
|
||||
/* force off unneeded vector register save/restore. */
|
||||
@@ -2671,6 +2674,7 @@ static int wc_RsaFunctionSync(const byte* in, word32 inLen, byte* out,
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#else
|
||||
#ifndef WOLF_CRYPTO_CB_ONLY_RSA
|
||||
#ifdef WOLFSSL_HAVE_SP_RSA
|
||||
@@ -3087,6 +3091,15 @@ static int wc_RsaFunctionSync(const byte* in, word32 inLen, byte* out,
|
||||
return MP_VAL;
|
||||
}
|
||||
|
||||
#if defined(WOLFSSL_NXP_CASPER_RSA_PUB_EXPTMOD)
|
||||
if (type == RSA_PUBLIC_DECRYPT || type == RSA_PUBLIC_ENCRYPT) {
|
||||
ret = casper_rsa_public_exptmod(in, inLen, out, outLen, key);
|
||||
if (ret == 0)
|
||||
return MP_OKAY;
|
||||
/* else fall through for software fallback */
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef WOLFSSL_HAVE_SP_RSA
|
||||
ret = RsaFunction_SP(in, inLen, out, outLen, type, key, rng);
|
||||
if (ret != WC_NO_ERR_TRACE(WC_KEY_SIZE_E))
|
||||
|
||||
@@ -368,6 +368,9 @@
|
||||
#include <wolfssl/wolfcrypt/port/nxp/dcp_port.h>
|
||||
/* implemented in wolfcrypt/src/port/nxp/dcp_port.c */
|
||||
|
||||
#elif defined(WOLFSSL_NXP_HASHCRYPT_SHA)
|
||||
/* implemented in wolfcrypt/src/port/nxp/hashcrypt_port.c */
|
||||
|
||||
#elif defined(WOLFSSL_SILABS_SE_ACCEL)
|
||||
|
||||
/* implemented in wolfcrypt/src/port/silabs/silabs_hash.c */
|
||||
|
||||
@@ -222,6 +222,7 @@ on the specific device platform.
|
||||
!defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY)) || \
|
||||
defined(NO_WOLFSSL_RENESAS_TSIP_CRYPT_HASH)) && \
|
||||
!defined(PSOC6_HASH_SHA2) && !defined(WOLFSSL_IMXRT_DCP) && !defined(WOLFSSL_SILABS_SE_ACCEL) && \
|
||||
!defined(WOLFSSL_NXP_HASHCRYPT_SHA) && \
|
||||
!defined(WOLFSSL_KCAPI_HASH) && !defined(WOLFSSL_SE050_HASH) && \
|
||||
((!defined(WOLFSSL_RENESAS_SCEPROTECT) && \
|
||||
!defined(WOLFSSL_RENESAS_RSIP)) \
|
||||
@@ -1068,6 +1069,9 @@ static int InitSha256(wc_Sha256* sha256)
|
||||
#include <wolfssl/wolfcrypt/port/nxp/dcp_port.h>
|
||||
/* implemented in wolfcrypt/src/port/nxp/dcp_port.c */
|
||||
|
||||
#elif defined(WOLFSSL_NXP_HASHCRYPT_SHA)
|
||||
/* implemented in wolfcrypt/src/port/nxp/hashcrypt_port.c */
|
||||
|
||||
#elif defined(WOLFSSL_SILABS_SE_ACCEL)
|
||||
/* implemented in wolfcrypt/src/port/silabs/silabs_hash.c */
|
||||
|
||||
|
||||
@@ -182,6 +182,13 @@ Threading/Mutex options:
|
||||
#include <wolfssl/wolfcrypt/port/nxp/dcp_port.h>
|
||||
#endif
|
||||
|
||||
#ifdef WOLFSSL_NXP_CASPER
|
||||
#include <wolfssl/wolfcrypt/port/nxp/casper_port.h>
|
||||
#endif
|
||||
#ifdef WOLFSSL_NXP_HASHCRYPT
|
||||
#include <wolfssl/wolfcrypt/port/nxp/hashcrypt_port.h>
|
||||
#endif
|
||||
|
||||
#ifdef WOLF_CRYPTO_CB
|
||||
#include <wolfssl/wolfcrypt/cryptocb.h>
|
||||
#endif
|
||||
@@ -534,6 +541,17 @@ int wolfCrypt_Init(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef WOLFSSL_NXP_CASPER
|
||||
if ((ret = wc_casper_init()) != 0) {
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
#ifdef WOLFSSL_NXP_HASHCRYPT
|
||||
if ((ret = wc_hashcrypt_init()) != 0) {
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(WOLFSSL_DSP) && !defined(WOLFSSL_DSP_BUILD)
|
||||
if ((ret = wolfSSL_InitHandle()) != 0) {
|
||||
return ret;
|
||||
|
||||
+23
-1
@@ -2841,7 +2841,7 @@ options: [-s max_relative_stack_bytes] [-m max_relative_heap_memory_bytes]\n\
|
||||
if ( (ret = aesofb_test()) != 0)
|
||||
TEST_FAIL("AES-OFB test failed!\n", ret);
|
||||
else
|
||||
TEST_PASS("AES-OFB test passed!\n");
|
||||
TEST_PASS("AES-OFB test passed!\n");
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_AESGCM
|
||||
@@ -4935,12 +4935,14 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t sha_test(void)
|
||||
ret = wc_InitSha_ex(&sha, HEAP_HINT, devId);
|
||||
if (ret != 0)
|
||||
ERROR_OUT(WC_TEST_RET_ENC_EC(ret), exit);
|
||||
#ifndef NO_WOLFSSL_SHA256_INTERLEAVE
|
||||
ret = wc_InitSha_ex(&shaCopy, HEAP_HINT, devId);
|
||||
if (ret != 0)
|
||||
ERROR_OUT(WC_TEST_RET_ENC_EC(ret), exit);
|
||||
ret = wc_ShaUpdate(&shaCopy, (byte*)b.input, (word32)b.inLen);
|
||||
if (ret != 0)
|
||||
ERROR_OUT(WC_TEST_RET_ENC_EC(ret), exit);
|
||||
#endif
|
||||
ret = wc_ShaUpdate(&sha, (byte*)a.input, (word32)a.inLen);
|
||||
if (ret != 0)
|
||||
ERROR_OUT(WC_TEST_RET_ENC_EC(ret), exit);
|
||||
@@ -5650,12 +5652,14 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t sha256_test(void)
|
||||
ret = wc_InitSha256_ex(&sha, HEAP_HINT, devId);
|
||||
if (ret != 0)
|
||||
ERROR_OUT(WC_TEST_RET_ENC_EC(ret), exit);
|
||||
#ifndef NO_WOLFSSL_SHA256_INTERLEAVE
|
||||
ret = wc_InitSha256_ex(&shaCopy, HEAP_HINT, devId);
|
||||
if (ret != 0)
|
||||
ERROR_OUT(WC_TEST_RET_ENC_EC(ret), exit);
|
||||
ret = wc_Sha256Update(&shaCopy, (byte*)b.input, (word32)b.inLen);
|
||||
if (ret != 0)
|
||||
ERROR_OUT(WC_TEST_RET_ENC_EC(ret), exit);
|
||||
#endif
|
||||
ret = wc_Sha256Update(&sha, (byte*)a.input, (word32)a.inLen);
|
||||
if (ret != 0)
|
||||
ERROR_OUT(WC_TEST_RET_ENC_EC(ret), exit);
|
||||
@@ -12082,9 +12086,11 @@ EVP_TEST_END:
|
||||
if (ret != 0)
|
||||
ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out);
|
||||
|
||||
#ifndef WOLFSSL_NXP_HASHCRYPT_AES
|
||||
if (XMEMCMP(cipher + WC_AES_BLOCK_SIZE, cipher1 + WC_AES_BLOCK_SIZE,
|
||||
WC_AES_BLOCK_SIZE))
|
||||
ERROR_OUT(WC_TEST_RET_ENC_NC, out);
|
||||
#endif /* !WOLFSSL_NXP_HASHCRYPT_AES */
|
||||
|
||||
#ifdef HAVE_AES_DECRYPT
|
||||
ret = wc_AesOfbDecrypt(dec, plain, cipher1, WC_AES_BLOCK_SIZE);
|
||||
@@ -12099,9 +12105,11 @@ EVP_TEST_END:
|
||||
if (ret != 0)
|
||||
ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out);
|
||||
|
||||
#ifndef WOLFSSL_NXP_HASHCRYPT_AES
|
||||
if (XMEMCMP(plain + WC_AES_BLOCK_SIZE, plain1 + WC_AES_BLOCK_SIZE,
|
||||
WC_AES_BLOCK_SIZE))
|
||||
ERROR_OUT(WC_TEST_RET_ENC_NC, out);
|
||||
#endif /* !WOLFSSL_NXP_HASHCRYPT_AES */
|
||||
#endif /* HAVE_AES_DECRYPT */
|
||||
|
||||
/* multiple blocks at once */
|
||||
@@ -12183,8 +12191,10 @@ EVP_TEST_END:
|
||||
if (ret != 0)
|
||||
ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out);
|
||||
|
||||
#ifndef WOLFSSL_NXP_HASHCRYPT_AES
|
||||
if (XMEMCMP(cipher + 3, cipher1 + 3, WC_AES_BLOCK_SIZE))
|
||||
ERROR_OUT(WC_TEST_RET_ENC_NC, out);
|
||||
#endif /* !WOLFSSL_NXP_HASHCRYPT_AES */
|
||||
|
||||
#ifdef HAVE_AES_DECRYPT
|
||||
ret = wc_AesOfbDecrypt(dec, plain, cipher1, 6);
|
||||
@@ -12198,8 +12208,10 @@ EVP_TEST_END:
|
||||
if (ret != 0)
|
||||
ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out);
|
||||
|
||||
#ifndef WOLFSSL_NXP_HASHCRYPT_AES
|
||||
if (XMEMCMP(plain + 6, plain1 + 6, WC_AES_BLOCK_SIZE))
|
||||
ERROR_OUT(WC_TEST_RET_ENC_NC, out);
|
||||
#endif /* !WOLFSSL_NXP_HASHCRYPT_AES */
|
||||
#endif /* HAVE_AES_DECRYPT */
|
||||
#endif /* WOLFSSL_AES_256 */
|
||||
|
||||
@@ -12401,6 +12413,7 @@ EVP_TEST_END:
|
||||
ERROR_OUT(WC_TEST_RET_ENC_NC, out);
|
||||
|
||||
/* test restarting encryption process */
|
||||
#ifndef WOLFSSL_NXP_HASHCRYPT_AES
|
||||
ret = wc_AesCfbEncrypt(enc, cipher + (WC_AES_BLOCK_SIZE * 2),
|
||||
msg1 + (WC_AES_BLOCK_SIZE * 2), WC_AES_BLOCK_SIZE);
|
||||
if (ret != 0)
|
||||
@@ -12418,6 +12431,7 @@ EVP_TEST_END:
|
||||
if (XMEMCMP(plain, msg1, WC_AES_BLOCK_SIZE * 3))
|
||||
ERROR_OUT(WC_TEST_RET_ENC_NC, out);
|
||||
#endif /* HAVE_AES_DECRYPT */
|
||||
#endif /* !WOLFSSL_NXP_HASHCRYPT_AES */
|
||||
#endif /* WOLFSSL_AES_128 */
|
||||
|
||||
#ifdef WOLFSSL_AES_192
|
||||
@@ -12479,6 +12493,7 @@ EVP_TEST_END:
|
||||
ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out);
|
||||
#endif
|
||||
|
||||
#ifndef WOLFSSL_NXP_HASHCRYPT_AES
|
||||
/* test with data left overs, magic lengths are checking near edges */
|
||||
XMEMSET(cipher, 0, sizeof(cipher));
|
||||
ret = wc_AesCfbEncrypt(enc, cipher, msg3, 4);
|
||||
@@ -12530,6 +12545,7 @@ EVP_TEST_END:
|
||||
if (XMEMCMP(plain, msg3, WC_AES_BLOCK_SIZE * 4))
|
||||
ERROR_OUT(WC_TEST_RET_ENC_NC, out);
|
||||
#endif /* HAVE_AES_DECRYPT */
|
||||
#endif /* !WOLFSSL_NXP_HASHCRYPT_AES */
|
||||
#endif /* WOLFSSL_AES_256 */
|
||||
|
||||
out:
|
||||
@@ -15987,11 +16003,13 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t aes_ctr_test(void)
|
||||
/* and an additional 9 bytes to reuse tmp left buffer */
|
||||
{ NULL, 0, NULL, ctrPlain, (int)sizeof(oddCipher), oddCipher },
|
||||
/* Counter wrapping */
|
||||
#ifndef WOLFSSL_NXP_HASHCRYPT_AES
|
||||
{ ctr128Key, (int)sizeof(ctr128Key), ctrIvWrap128,
|
||||
ctrPlain, (int)sizeof(ctr128Wrap128Cipher), ctr128Wrap128Cipher },
|
||||
{ ctr128Key, (int)sizeof(ctr128Key), ctrIvWrap128,
|
||||
ctrPlain, (int)sizeof(ctr128Wrap128CipherLong),
|
||||
ctr128Wrap128CipherLong },
|
||||
#endif /* !WOLFSSL_NXP_HASHCRYPT_AES */
|
||||
#if defined(WOLFSSL_ARMASM) || defined(WOLFSSL_RISCV_ASM)
|
||||
{ ctr128Key, (int)sizeof(ctr128Key), ctrIvWrap128_2,
|
||||
ctrPlain, (int)sizeof(ctr128Wrap128_2CipherLong),
|
||||
@@ -16029,11 +16047,13 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t aes_ctr_test(void)
|
||||
{ ctr192Key, (int)sizeof(ctr192Key), ctrIv,
|
||||
ctrPlain, (int)sizeof(oddCipher), ctr192Cipher },
|
||||
/* Counter wrapping */
|
||||
#ifndef WOLFSSL_NXP_HASHCRYPT_AES
|
||||
{ ctr192Key, (int)sizeof(ctr192Key), ctrIvWrap128,
|
||||
ctrPlain, (int)sizeof(ctr192Wrap128Cipher), ctr192Wrap128Cipher },
|
||||
{ ctr192Key, (int)sizeof(ctr192Key), ctrIvWrap128,
|
||||
ctrPlain, (int)sizeof(ctr192Wrap128CipherLong),
|
||||
ctr192Wrap128CipherLong },
|
||||
#endif /* !WOLFSSL_NXP_HASHCRYPT_AES */
|
||||
#if defined(WOLFSSL_ARMASM) || defined(WOLFSSL_RISCV_ASM)
|
||||
{ ctr192Key, (int)sizeof(ctr192Key), ctrIvWrap128_2,
|
||||
ctrPlain, (int)sizeof(ctr192Wrap128_2CipherLong),
|
||||
@@ -16071,11 +16091,13 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t aes_ctr_test(void)
|
||||
{ ctr256Key, (int)sizeof(ctr256Key), ctrIv,
|
||||
ctrPlain, (int)sizeof(oddCipher), ctr256Cipher },
|
||||
/* Counter wrapping */
|
||||
#ifndef WOLFSSL_NXP_HASHCRYPT_AES
|
||||
{ ctr256Key, (int)sizeof(ctr256Key), ctrIvWrap128,
|
||||
ctrPlain, (int)sizeof(ctr256Wrap128Cipher), ctr256Wrap128Cipher },
|
||||
{ ctr256Key, (int)sizeof(ctr256Key), ctrIvWrap128,
|
||||
ctrPlain, (int)sizeof(ctr256Wrap128CipherLong),
|
||||
ctr256Wrap128CipherLong },
|
||||
#endif /* !WOLFSSL_NXP_HASHCRYPT_AES */
|
||||
#if defined(WOLFSSL_ARMASM) || defined(WOLFSSL_RISCV_ASM)
|
||||
{ ctr256Key, (int)sizeof(ctr256Key), ctrIvWrap128_2,
|
||||
ctrPlain, (int)sizeof(ctr256Wrap128_2CipherLong),
|
||||
|
||||
@@ -386,7 +386,7 @@ struct Aes {
|
||||
#if defined(WOLF_CRYPTO_CB) || (defined(WOLFSSL_DEVCRYPTO) && \
|
||||
(defined(WOLFSSL_DEVCRYPTO_AES) || defined(WOLFSSL_DEVCRYPTO_CBC))) || \
|
||||
(defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_AES)) || \
|
||||
defined(WOLFSSL_KCAPI_AES)
|
||||
defined(WOLFSSL_KCAPI_AES) || defined(WOLFSSL_NXP_HASHCRYPT_AES)
|
||||
word32 devKey[AES_MAX_KEY_SIZE/WOLFSSL_BIT_SIZE/sizeof(word32)]; /* raw key */
|
||||
#ifdef HAVE_CAVIUM_OCTEON_SYNC
|
||||
int keySet;
|
||||
|
||||
@@ -95,6 +95,8 @@ noinst_HEADERS+= \
|
||||
wolfssl/wolfcrypt/port/nrf51.h \
|
||||
wolfssl/wolfcrypt/port/nxp/ksdk_port.h \
|
||||
wolfssl/wolfcrypt/port/nxp/dcp_port.h \
|
||||
wolfssl/wolfcrypt/port/nxp/casper_port.h \
|
||||
wolfssl/wolfcrypt/port/nxp/hashcrypt_port.h \
|
||||
wolfssl/wolfcrypt/port/xilinx/xil-sha3.h \
|
||||
wolfssl/wolfcrypt/port/xilinx/xil-versal-glue.h \
|
||||
wolfssl/wolfcrypt/port/xilinx/xil-versal-trng.h \
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
/* casper_port.h
|
||||
*
|
||||
* Copyright (C) 2006-2026 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 3 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 _CASPER_PORT_H_
|
||||
#define _CASPER_PORT_H_
|
||||
|
||||
#include <wolfssl/wolfcrypt/settings.h>
|
||||
|
||||
int wc_casper_init(void);
|
||||
|
||||
#if !defined(NO_RSA) && defined(WOLFSSL_NXP_CASPER_RSA_PUB_EXPTMOD)
|
||||
#include <wolfssl/wolfcrypt/rsa.h>
|
||||
|
||||
int casper_rsa_public_exptmod(
|
||||
const byte* in, word32 inLen, byte* out, word32* outLen, RsaKey* key
|
||||
);
|
||||
#endif /* !NO_RSA && WOLFSSL_NXP_CASPER_RSA_PUB_EXPTMOD */
|
||||
|
||||
|
||||
#if defined(HAVE_ECC)
|
||||
#include <wolfssl/wolfcrypt/ecc.h>
|
||||
|
||||
#ifdef WOLFSSL_NXP_CASPER_ECC_MULMOD
|
||||
int casper_ecc_mulmod(
|
||||
const mp_int *m, ecc_point *P, ecc_point *R, int curve_id
|
||||
);
|
||||
#endif /* WOLFSSL_NXP_CASPER_ECC_MULMOD */
|
||||
|
||||
#ifdef WOLFSSL_NXP_CASPER_ECC_MUL2ADD
|
||||
int casper_ecc_mul2add(
|
||||
const mp_int *m, ecc_point *P, const mp_int *n, ecc_point *Q,
|
||||
ecc_point *R, int curve_id
|
||||
);
|
||||
#endif /* WOLFSSL_NXP_CASPER_ECC_MUL2ADD */
|
||||
#endif /* HAVE_ECC */
|
||||
|
||||
#endif /* _CASPER_PORT_H_ */
|
||||
@@ -0,0 +1,26 @@
|
||||
/* hashcrypt_port.h
|
||||
*
|
||||
* Copyright (C) 2006-2026 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 3 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 _HASHCRYPT_PORT_H_
|
||||
#define _HASHCRYPT_PORT_H_
|
||||
|
||||
int wc_hashcrypt_init(void);
|
||||
|
||||
#endif /* _HASHCRYPT_PORT_H_ */
|
||||
@@ -2132,6 +2132,17 @@ extern void uITRON4_free(void *p) ;
|
||||
#endif
|
||||
#endif /* FREESCALE_USE_LTC */
|
||||
|
||||
#ifdef WOLFSSL_NXP_LPC55S6X
|
||||
#undef WOLFSSL_NXP_RNG_1
|
||||
#define WOLFSSL_NXP_RNG_1
|
||||
#define WOLFSSL_NXP_HASHCRYPT
|
||||
#define WOLFSSL_NXP_HASHCRYPT_AES
|
||||
#define WOLFSSL_NXP_HASHCRYPT_SHA
|
||||
#define WOLFSSL_NXP_CASPER
|
||||
#define WOLFSSL_NXP_CASPER_RSA_PUB_EXPTMOD
|
||||
#define NO_WOLFSSL_SHA256_INTERLEAVE
|
||||
#endif
|
||||
|
||||
#ifdef FREESCALE_LTC_TFM_RSA_4096_ENABLE
|
||||
#undef USE_CERT_BUFFERS_4096
|
||||
#define USE_CERT_BUFFERS_4096
|
||||
|
||||
Reference in New Issue
Block a user