diff --git a/IDE/ROWLEY-CROSSWORKS-ARM/README.md b/IDE/ROWLEY-CROSSWORKS-ARM/README.md
index 4a652d7eb..dc0b032b2 100644
--- a/IDE/ROWLEY-CROSSWORKS-ARM/README.md
+++ b/IDE/ROWLEY-CROSSWORKS-ARM/README.md
@@ -27,20 +27,23 @@ Also the "Target Processor" in each of the projects ("Project Properties" -> "Ta
## Hardware Crypto Acceleration
-To enable Freescale MMCAU:
+To enable NXP/Freescale MMCAU:
1. [Download the MMCAU library](http://www.freescale.com/products/arm-processors/kinetis-cortex-m/k-series/k7x-glcd-mcus/crypto-acceleration-unit-cau-and-mmcau-software-library:CAUAP).
2. Copy the `lib_mmcau.a` and `cau_api.h` files into the project.
-3. Enable the `FREESCALE_MMCAU` define in `user_settings.h` and make sure its value is `1`.
+3. Define `USE_NXP_MMCAU` to enable in `user_settings.h`.
4. Add the `lib_mmcau.a` file to `Source Files` in the application project.
+5. Open the wolfssl_ltc.hzp CrossWorks project
+6. Build and run
-To enable the NXP LTC:
+To enable the NXP/Freescale MMCAU and/or LTC:
1. [Download the NXP KSDK 2.0](https://nxp.flexnetoperations.com/control/frse/download?agree=Accept&element=7353807)
2. Copy the following folders into IDE/ROWLEY-CROSSWORKS-ARM: drivers, mmcau_2.0.0 and CMSIS.
3. Copy the following files into IDE/ROWLEY-CROSSWORKS-ARM: clock_config.c, clock_config.h, fsl_debug_console.c, fsl_debug_console.h, fsl_device_registers.h, system_MK82F25615.c, system_MK82F25615.h, MK82F25615.h and MK82F25615_features.h.
-4. Open the wolfssl_ltc.hzp CrossWorks project
-5. Build and run
+4. Define `USE_NXP_LTX` to enable in `user_settings.h`.
+5. Open the wolfssl_ltc.hzp CrossWorks project
+6. Build and run
# Project Files
diff --git a/IDE/ROWLEY-CROSSWORKS-ARM/benchmark_main.c b/IDE/ROWLEY-CROSSWORKS-ARM/benchmark_main.c
index cdeda8570..196ceb69b 100644
--- a/IDE/ROWLEY-CROSSWORKS-ARM/benchmark_main.c
+++ b/IDE/ROWLEY-CROSSWORKS-ARM/benchmark_main.c
@@ -54,7 +54,7 @@ void main(void)
/*
SAMPLE OUTPUT: Freescale K64 running at 96MHz with no MMCAU:
-Benchmark Test 1:
+Benchmark Test 0:
AES 25 kB took 0.073 seconds, 0.334 MB/s
ARC4 25 kB took 0.033 seconds, 0.740 MB/s
RABBIT 25 kB took 0.027 seconds, 0.904 MB/s
@@ -66,10 +66,10 @@ RSA 1024 encryption took 91.000 milliseconds, avg over 1 iterations
RSA 1024 decryption took 573.000 milliseconds, avg over 1 iterations
DH 1024 key generation 253.000 milliseconds, avg over 1 iterations
DH 1024 key agreement 311.000 milliseconds, avg over 1 iterations
-Benchmark Test 1: Return code 0
+Benchmark Test 0: Return code 0
SAMPLE OUTPUT: Freescale K64 running at 96MHz with MMCAU enabled:
-Benchmark Test 1:
+Benchmark Test 0:
AES 25 kB took 0.019 seconds, 1.285 MB/s
ARC4 25 kB took 0.033 seconds, 0.740 MB/s
RABBIT 25 kB took 0.028 seconds, 0.872 MB/s
@@ -81,5 +81,72 @@ RSA 1024 encryption took 89.000 milliseconds, avg over 1 iterations
RSA 1024 decryption took 573.000 milliseconds, avg over 1 iterations
DH 1024 key generation 250.000 milliseconds, avg over 1 iterations
DH 1024 key agreement 308.000 milliseconds, avg over 1 iterations
-Benchmark Test 1: Return code 0
+Benchmark Test 0: Return code 0
+
+
+SAMPLE OUTPUT: NXP K82 running at 150Mhz w/MMCAU and LTC
+Benchmark Test 0:
+RNG 25 kB took 0.026 seconds, 0.939 MB/s
+AES enc 25 kB took 0.002 seconds, 12.207 MB/s
+AES dec 25 kB took 0.002 seconds, 12.207 MB/s
+AES-GCM 25 kB took 0.002 seconds, 12.207 MB/s
+AES-CTR 25 kB took 0.003 seconds, 8.138 MB/s
+AES-CCM 25 kB took 0.004 seconds, 6.104 MB/s
+CHACHA 25 kB took 0.008 seconds, 3.052 MB/s
+CHA-POLY 25 kB took 0.013 seconds, 1.878 MB/s
+
+POLY1305 25 kB took 0.003 seconds, 8.138 MB/s
+SHA 25 kB took 0.006 seconds, 4.069 MB/s
+SHA-256 25 kB took 0.009 seconds, 2.713 MB/s
+SHA-384 25 kB took 0.032 seconds, 0.763 MB/s
+SHA-512 25 kB took 0.035 seconds, 0.698 MB/s
+
+RSA 2048 public 12.000 milliseconds, avg over 1 iterations
+RSA 2048 private 135.000 milliseconds, avg over 1 iterations
+
+ECC 256 key generation 17.400 milliseconds, avg over 5 iterations
+EC-DHE key agreement 15.200 milliseconds, avg over 5 iterations
+EC-DSA sign time 20.200 milliseconds, avg over 5 iterations
+EC-DSA verify time 33.000 milliseconds, avg over 5 iterations
+
+CURVE25519 256 key generation 14.400 milliseconds, avg over 5 iterations
+CURVE25519 key agreement 14.400 milliseconds, avg over 5 iterations
+
+ED25519 key generation 14.800 milliseconds, avg over 5 iterations
+ED25519 sign time 16.800 milliseconds, avg over 5 iterations
+ED25519 verify time 30.400 milliseconds, avg over 5 iterations
+Benchmark Test 0: Return code 0
+
+SAMPLE OUTPUT: NXP K82 running at 150Mhz software only
+Benchmark Test 0:
+RNG 25 kB took 0.026 seconds, 0.939 MB/s
+AES enc 25 kB took 0.002 seconds, 12.207 MB/s
+AES dec 25 kB took 0.002 seconds, 12.207 MB/s
+AES-GCM 25 kB took 0.002 seconds, 12.207 MB/s
+AES-CTR 25 kB took 0.002 seconds, 12.207 MB/s
+AES-CCM 25 kB took 0.004 seconds, 6.104 MB/s
+CHACHA 25 kB took 0.009 seconds, 2.713 MB/s
+CHA-POLY 25 kB took 0.013 seconds, 1.878 MB/s
+
+POLY1305 25 kB took 0.003 seconds, 8.138 MB/s
+SHA 25 kB took 0.006 seconds, 4.069 MB/s
+SHA-256 25 kB took 0.008 seconds, 3.052 MB/s
+SHA-384 25 kB took 0.033 seconds, 0.740 MB/s
+SHA-512 25 kB took 0.034 seconds, 0.718 MB/s
+
+RSA 2048 public 11.000 milliseconds, avg over 1 iterations
+RSA 2048 private 135.000 milliseconds, avg over 1 iterations
+
+ECC 256 key generation 17.400 milliseconds, avg over 5 iterations
+EC-DHE key agreement 15.000 milliseconds, avg over 5 iterations
+EC-DSA sign time 20.400 milliseconds, avg over 5 iterations
+EC-DSA verify time 33.200 milliseconds, avg over 5 iterations
+
+CURVE25519 256 key generation 14.600 milliseconds, avg over 5 iterations
+CURVE25519 key agreement 14.400 milliseconds, avg over 5 iterations
+
+ED25519 key generation 15.000 milliseconds, avg over 5 iterations
+ED25519 sign time 16.800 milliseconds, avg over 5 iterations
+ED25519 verify time 30.400 milliseconds, avg over 5 iterations
+Benchmark Test 0: Return code 0
*/
diff --git a/IDE/ROWLEY-CROSSWORKS-ARM/test_main.c b/IDE/ROWLEY-CROSSWORKS-ARM/test_main.c
index aad67b819..af58769ed 100644
--- a/IDE/ROWLEY-CROSSWORKS-ARM/test_main.c
+++ b/IDE/ROWLEY-CROSSWORKS-ARM/test_main.c
@@ -54,24 +54,26 @@ void main(void)
/* SAMPLE OUTPUT:
-Crypt Test 1:
-MD5 test passed!
-MD4 test passed!
+Crypt Test 0:
SHA test passed!
SHA-256 test passed!
-HMAC-MD5 test passed!
+SHA-384 test passed!
+SHA-512 test passed!
HMAC-SHA test passed!
HMAC-SHA256 test passed!
-ARC4 test passed!
-HC-128 test passed!
-Rabbit test passed!
-DES test passed!
-DES3 test passed!
+HMAC-SHA384 test passed!
+HMAC-SHA512 test passed!
+GMAC test passed!
+Chacha test passed!
+POLY1305 test passed!
+ChaCha20-Poly1305 AEAD test passed!
AES test passed!
+AES-GCM test passed!
+AES-CCM test passed!
RANDOM test passed!
RSA test passed!
-DH test passed!
-DSA test passed!
-PWDBASED test passed!
-Crypt Test 1: Return code 0
+ECC test passed!
+CURVE25519 test passed!
+ED25519 test passed!
+Crypt Test 0: Return code 0
*/
diff --git a/IDE/ROWLEY-CROSSWORKS-ARM/user_settings.h b/IDE/ROWLEY-CROSSWORKS-ARM/user_settings.h
index 048de56d5..c88a3c069 100644
--- a/IDE/ROWLEY-CROSSWORKS-ARM/user_settings.h
+++ b/IDE/ROWLEY-CROSSWORKS-ARM/user_settings.h
@@ -56,7 +56,9 @@ extern "C" {
#define HAVE_ECC224
#undef NO_ECC256
#define HAVE_ECC384
- #define HAVE_ECC521
+ #ifndef USE_NXP_LTC /* NXP LTC HW supports up to 512 */
+ #define HAVE_ECC521
+ #endif
/* Fixed point cache (speeds repeated operations against same private key) */
#undef FP_ECC
@@ -72,7 +74,9 @@ extern "C" {
/* Optional ECC calculation method */
/* Note: doubles heap usage, but slightly faster */
#undef ECC_SHAMIR
- #define ECC_SHAMIR
+ #ifndef USE_NXP_LTC /* Don't enable Shamir code for HW ECC */
+ #define ECC_SHAMIR
+ #endif
/* Reduces heap usage, but slower */
#undef ECC_TIMING_RESISTANT
@@ -83,16 +87,22 @@ extern "C" {
#undef ALT_ECC_SIZE
#define ALT_ECC_SIZE
- /* optionally override the default max ecc bits */
- #undef FP_MAX_BITS_ECC
- //#define FP_MAX_BITS_ECC 512
-
/* Enable TFM optimizations for ECC */
- #define TFM_ECC192
- #define TFM_ECC224
- #define TFM_ECC256
- #define TFM_ECC384
- #define TFM_ECC521
+ #if defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)
+ #define TFM_ECC192
+ #endif
+ #if defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)
+ #define TFM_ECC224
+ #endif
+ #if !defined(NO_ECC256) || defined(HAVE_ALL_CURVES)
+ #define TFM_ECC256
+ #endif
+ #if defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)
+ #define TFM_ECC384
+ #endif
+ #if defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)
+ #define TFM_ECC521
+ #endif
#endif
#endif
@@ -195,21 +205,21 @@ extern "C" {
/* ------------------------------------------------------------------------- */
/* HW Crypto Acceleration */
/* ------------------------------------------------------------------------- */
-// See README.md for instructions
-#if 0
- #define FREESCALE_MMCAU 1
+#if 1
+ /* NXP MMCAU / LTC Support (See README.md for instructions) */
+ #if defined(USE_NXP_MMCAU) || defined(USE_NXP_LTC)
+ #define FSL_HW_CRYPTO_MANUAL_SELECTION
+ #ifdef USE_NXP_MMCAU
+ #define FREESCALE_USE_MMCAU
+ #endif
+ #ifdef USE_NXP_LTC
+ #define FREESCALE_USE_LTC
+ #define LTC_MAX_ECC_BITS (512)
+ #define LTC_MAX_INT_BYTES (256)
+ #endif
+ #endif
#endif
-/* NXP LTC Support (See README.md for instructions) */
-#if 0
- #define FSL_HW_CRYPTO_MANUAL_SELECTION
- #define FREESCALE_USE_MMCAU
- #define FREESCALE_USE_LTC
- #define LTC_MAX_ECC_BITS (512)
- #define LTC_MAX_INT_BYTES (256)
-#endif
-
-
/* ------------------------------------------------------------------------- */
/* Benchmark / Test */
/* ------------------------------------------------------------------------- */
diff --git a/IDE/ROWLEY-CROSSWORKS-ARM/wolfssl_ltc.hzp b/IDE/ROWLEY-CROSSWORKS-ARM/wolfssl_ltc.hzp
index ecaf7adbd..c66890231 100644
--- a/IDE/ROWLEY-CROSSWORKS-ARM/wolfssl_ltc.hzp
+++ b/IDE/ROWLEY-CROSSWORKS-ARM/wolfssl_ltc.hzp
@@ -4,7 +4,7 @@
@@ -322,7 +322,7 @@
arm_simulator_memory_simulation_parameter="MK82FN256xxx15;0x40000;0x0;0x0;0x40000;4"
arm_target_loader_applicable_loaders="Flash"
arm_target_loader_default_loader="Flash"
- c_preprocessor_definitions="WOLFSSL_ROWLEY_ARM;WOLFSSL_USER_SETTINGS"
+ c_preprocessor_definitions="WOLFSSL_ROWLEY_ARM;WOLFSSL_USER_SETTINGS;USE_NXP_LTC;USE_NXP_MMCAU"
c_user_include_directories=".;./drivers;./mmcau_2.0.0;./CMSIS/Include;../;../../;$(TargetsDir);$(TargetsDir)/Kinetis;$(TargetsDir)/Kinetis/CMSIS;$(TargetsDir)/Kinetis/CMSIS/include;$(TargetsDir)/CMSIS_3/CMSIS/include"
debug_register_definition_file="$(TargetsDir)/Kinetis/MK82F25615_Peripherals.xml"
linker_memory_map_file="$(TargetsDir)/Kinetis/MK82FN256xxx15_MemoryMap.xml"
@@ -377,7 +377,7 @@
arm_simulator_memory_simulation_parameter="MK82FN256xxx15;0x40000;0x0;0x0;0x40000;4"
arm_target_loader_applicable_loaders="Flash"
arm_target_loader_default_loader="Flash"
- c_preprocessor_definitions="WOLFSSL_ROWLEY_ARM;WOLFSSL_USER_SETTINGS"
+ c_preprocessor_definitions="WOLFSSL_ROWLEY_ARM;WOLFSSL_USER_SETTINGS;USE_NXP_LTC;USE_NXP_MMCAU"
c_user_include_directories=".;./drivers;./mmcau_2.0.0;./CMSIS/Include;../;../../;$(TargetsDir);$(TargetsDir)/Kinetis;$(TargetsDir)/Kinetis/CMSIS;$(TargetsDir)/Kinetis/CMSIS/include;$(TargetsDir)/CMSIS_3/CMSIS/include"
debug_register_definition_file="$(TargetsDir)/Kinetis/MK82F25615_Peripherals.xml"
linker_memory_map_file="$(TargetsDir)/Kinetis/MK82FN256xxx15_MemoryMap.xml"
diff --git a/wolfcrypt/src/ecc.c b/wolfcrypt/src/ecc.c
index fbb488d26..4e53d8938 100644
--- a/wolfcrypt/src/ecc.c
+++ b/wolfcrypt/src/ecc.c
@@ -3380,11 +3380,11 @@ int wc_ecc_verify_hash_ex(mp_int *r, mp_int *s, const byte* hash,
#ifdef FREESCALE_LTC_ECC
/* use PKHA to compute u1*mG + u2*mQ */
if (err == MP_OKAY)
- err = wc_ecc_mulmod_ex(&u1, mG, mG, &m, 0, NULL);
+ err = wc_ecc_mulmod_ex(&u1, mG, mG, &a, &modulus, 0, NULL);
if (err == MP_OKAY)
- err = wc_ecc_mulmod_ex(&u2, mQ, mQ, &m, 0, NULL);
+ err = wc_ecc_mulmod_ex(&u2, mQ, mQ, &a, &modulus, 0, NULL);
if (err == MP_OKAY)
- err = wc_ecc_point_add(mG, mQ, mG, &m);
+ err = wc_ecc_point_add(mG, mQ, mG, &modulus);
#else /* FREESCALE_LTC_ECC */
#ifndef ECC_SHAMIR
{
diff --git a/wolfcrypt/src/port/nxp/ksdk_port.c b/wolfcrypt/src/port/nxp/ksdk_port.c
index c347d0244..613d34103 100755
--- a/wolfcrypt/src/port/nxp/ksdk_port.c
+++ b/wolfcrypt/src/port/nxp/ksdk_port.c
@@ -435,12 +435,14 @@ int _fp_exptmod(fp_int *G, fp_int *X, fp_int *P, fp_int *Y)
}
#ifndef NO_RSA
-int wc_RsaFunction(const byte *in, word32 inLen, byte *out, word32 *outLen, int type, RsaKey *key)
+int wc_RsaFunction(const byte *in, word32 inLen, byte *out, word32 *outLen, int type, RsaKey *key, WC_RNG* rng)
{
mp_int tmp;
int ret = 0;
word32 keyLen, len;
+ (void)rng;
+
if (mp_init(&tmp) != MP_OKAY)
return MP_INIT_E;
@@ -788,8 +790,8 @@ static int ltc_get_ecc_specs(const uint8_t **modulus, const uint8_t **r2modn,
(1==map, 0 == leave in projective)
return MP_OKAY on success
*/
-int wc_ecc_mulmod_ex(mp_int *k, ecc_point *G, ecc_point *R, mp_int *modulus,
- int map, void* heap)
+int wc_ecc_mulmod_ex(mp_int *k, ecc_point *G, ecc_point *R, mp_int* a,
+ mp_int *modulus, int map, void* heap)
{
ltc_pkha_ecc_point_t B;
uint8_t size;
@@ -798,6 +800,8 @@ int wc_ecc_mulmod_ex(mp_int *k, ecc_point *G, ecc_point *R, mp_int *modulus,
bool point_of_infinity;
status_t status;
+ (void)a;
+
uint8_t Gxbin[LTC_MAX_ECC_BITS / 8];
uint8_t Gybin[LTC_MAX_ECC_BITS / 8];
uint8_t kbin[LTC_MAX_INT_BYTES];
diff --git a/wolfssl/wolfcrypt/port/nxp/ksdk_port.h b/wolfssl/wolfcrypt/port/nxp/ksdk_port.h
index 72908885b..d6acdd764 100755
--- a/wolfssl/wolfcrypt/port/nxp/ksdk_port.h
+++ b/wolfssl/wolfcrypt/port/nxp/ksdk_port.h
@@ -43,7 +43,7 @@ int ksdk_port_init(void);
int _fp_exptmod(fp_int *G, fp_int *X, fp_int *P, fp_int *Y);
#ifndef NO_RSA
#include
- int wc_RsaFunction(const byte *in, word32 inLen, byte *out, word32 *outLen, int type, RsaKey *key);
+ int wc_RsaFunction(const byte* in, word32 inLen, byte* out, word32* outLen, int type, RsaKey* key, WC_RNG* rng);
#endif
#endif /* FREESCALE_LTC_TFM */