Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion wolfcrypt/src/port/nxp/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,15 @@ ensure this never happens, by properly managing the iv/counter in use.
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.
completed before another operation is requested. Only one SHA stream exists
at a time, so `NO_WOLFSSL_SHA256_INTERLEAVE` is set and a `wc_Sha256Update()`
after a `wc_Sha256GetHash()` restarts the stream.
- SHA-224 is unavailable when HashCrypt SHA is enabled.
- Hardware access is serialized with the wolfCrypt crypto HW mutex, enabled
automatically. A threaded build setting `WOLFSSL_CRYPT_HW_MUTEX` to 0 is
rejected at compile time; use `SINGLE_THREADED` instead. Being a software
mutex it does not arbitrate between the two cores -- do not drive either
accelerator from both.

### wolfSSL LPC55S69 Hardware Acceleration Enable

Expand Down
131 changes: 91 additions & 40 deletions wolfcrypt/src/port/nxp/casper_port.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,16 +23,17 @@

#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)
{
int ret;

if ((ret = wolfSSL_HwPkMutexInit()) != 0)
return ret;

CASPER_Init(CASPER);

return 0;
Expand Down Expand Up @@ -63,19 +64,22 @@ int casper_rsa_public_exptmod(
if (exp_sz <= 0 || exp_sz > (int)sizeof(exp_buf))
return BAD_FUNC_ARG;

if ((res = wolfSSL_HwPkMutexLock()) != 0)
return res;

/* 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;
goto unlock;
mp_reverse(key_buf, key_sz);

XMEMSET(exp_buf, 0, sizeof(exp_buf));
if ((res = mp_to_unsigned_bin(&key->e,
exp_buf + sizeof(exp_buf) - exp_sz))
!= MP_OKAY)
return res;
goto unlock;
exp = ((uint32_t)exp_buf[0] << 24) | ((uint32_t)exp_buf[1] << 16) |
((uint32_t)exp_buf[2] << 8) | ((uint32_t)exp_buf[3]);

Expand All @@ -86,8 +90,12 @@ int casper_rsa_public_exptmod(
XMEMCPY(out, out_buf, sig_sz);

*outLen = inLen;
res = 0;

return 0;
unlock:
wolfSSL_HwPkMutexUnLock();

return res;
}
#endif /* !NO_RSA && WOLFSSL_NXP_CASPER_RSA_PUB_EXPTMOD */

Expand All @@ -105,64 +113,81 @@ int casper_ecc_mulmod(
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;
int ret;

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;

if ((ret = wolfSSL_HwPkMutexLock()) != 0)
return ret;

/* scalar */
if (mp_to_unsigned_bin(m, (unsigned char *)&M[0]) != MP_OKAY)
return MP_TO_E;
{
ret = MP_TO_E;
goto unlock;
}
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;
{
ret = MP_TO_E;
goto unlock;
}
mp_reverse((unsigned char *)&X[0], size);
if (mp_to_unsigned_bin(P->y, (unsigned char *)&Y[0]) != MP_OKAY)
return MP_TO_E;
{
ret = MP_TO_E;
goto unlock;
}
mp_reverse((unsigned char *)&Y[0], size);

if (curve_id == ECC_SECP256R1)
{
CASPER_ecc_init(kCASPER_ECC_P256);
CASPER_ECC_SECP256R1_Mul(CASPER, X, Y, X, Y, (void *)M);
}
else if (curve_id == ECC_SECP384R1)
{
CASPER_ecc_init(kCASPER_ECC_P384);
CASPER_ECC_SECP384R1_Mul(CASPER, X, Y, X, Y, (void *)M);
}
else if (curve_id == ECC_SECP521R1)
{
CASPER_ecc_init(kCASPER_ECC_P521);
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;
{
ret = MP_READ_E;
goto unlock;
}
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;
{
ret = MP_READ_E;
goto unlock;
}
mp_set(R->z, 1);
ret = 0;

return 0;
unlock:
wolfSSL_HwPkMutexUnLock();

return ret;
}
#endif /* HAVE_ECC && WOLFSSL_NXP_CASPER_ECC_MULMOD */

Expand All @@ -180,80 +205,106 @@ int casper_ecc_mul2add(
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;
int ret;

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;

if ((ret = wolfSSL_HwPkMutexLock()) != 0)
return ret;

/* first scalar */
if (mp_to_unsigned_bin(m, (unsigned char *)&M[0]) != MP_OKAY)
return MP_TO_E;
{
ret = MP_TO_E;
goto unlock;
}
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;
{
ret = MP_TO_E;
goto unlock;
}
mp_reverse((unsigned char *)&X1[0], size);
if (mp_to_unsigned_bin(P->y, (unsigned char *)&Y1[0]) != MP_OKAY)
return MP_TO_E;
{
ret = MP_TO_E;
goto unlock;
}
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;
{
ret = MP_TO_E;
goto unlock;
}
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;
{
ret = MP_TO_E;
goto unlock;
}
mp_reverse((unsigned char *)&X2[0], size);
if (mp_to_unsigned_bin(Q->y, (unsigned char *)&Y2[0]) != MP_OKAY)
return MP_TO_E;
{
ret = MP_TO_E;
goto unlock;
}
mp_reverse((unsigned char *)&Y2[0], size);

if (curve_id == ECC_SECP256R1)
{
CASPER_ecc_init(kCASPER_ECC_P256);
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_init(kCASPER_ECC_P384);
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_init(kCASPER_ECC_P521);
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;
{
ret = MP_READ_E;
goto unlock;
}
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;
{
ret = MP_READ_E;
goto unlock;
}
mp_set(R->z, 1);
ret = 0;

return 0;
unlock:
wolfSSL_HwPkMutexUnLock();

return ret;
}
#endif /* HAVE_ECC && WOLFSSL_NXP_CASPER_ECC_MUL2ADD */

Expand Down
Loading
Loading