Merge pull request #2516 from danielinux/freescale-ltc-spmath

Fixed Freescale LTC crypto module to compile with SP math
This commit is contained in:
toddouska
2019-10-23 15:11:43 -07:00
committed by GitHub
5 changed files with 86 additions and 19 deletions

View File

@ -5543,26 +5543,26 @@ int wc_ecc_verify_hash_ex(mp_int *r, mp_int *s, const byte* hash,
CRYS_ECDSA_VerifyUserContext_t sigCtxTemp; CRYS_ECDSA_VerifyUserContext_t sigCtxTemp;
word32 msgLenInBytes = hashlen; word32 msgLenInBytes = hashlen;
CRYS_ECPKI_HASH_OpMode_t hash_mode; CRYS_ECPKI_HASH_OpMode_t hash_mode;
#elif !defined(WOLFSSL_SP_MATH) #elif !defined(WOLFSSL_SP_MATH) || defined(FREESCALE_LTC_ECC)
int did_init = 0; int did_init = 0;
ecc_point *mG = NULL, *mQ = NULL; ecc_point *mG = NULL, *mQ = NULL;
#ifdef WOLFSSL_SMALL_STACK #ifdef WOLFSSL_SMALL_STACK
mp_int* v = NULL; mp_int* v = NULL;
mp_int* w = NULL; mp_int* w = NULL;
mp_int* u1 = NULL; mp_int* u1 = NULL;
mp_int* u2 = NULL; mp_int* u2 = NULL;
#if !defined(WOLFSSL_ASYNC_CRYPT) || !defined(HAVE_CAVIUM_V) #if !defined(WOLFSSL_ASYNC_CRYPT) || !defined(HAVE_CAVIUM_V)
mp_int* e_lcl = NULL; mp_int* e_lcl = NULL;
#endif #endif
#else /* WOLFSSL_SMALL_STACK */ #else /* WOLFSSL_SMALL_STACK */
mp_int v[1]; mp_int v[1];
mp_int w[1]; mp_int w[1];
mp_int u1[1]; mp_int u1[1];
mp_int u2[1]; mp_int u2[1];
#if !defined(WOLFSSL_ASYNC_CRYPT) || !defined(HAVE_CAVIUM_V) #if !defined(WOLFSSL_ASYNC_CRYPT) || !defined(HAVE_CAVIUM_V)
mp_int e_lcl[1]; mp_int e_lcl[1];
#endif #endif
#endif /* WOLFSSL_SMALL_STACK */ #endif /* WOLFSSL_SMALL_STACK */
mp_int* e; mp_int* e;
DECLARE_CURVE_SPECS(curve, ECC_CURVE_FIELD_COUNT); DECLARE_CURVE_SPECS(curve, ECC_CURVE_FIELD_COUNT);
#endif #endif
@ -5661,7 +5661,7 @@ int wc_ecc_verify_hash_ex(mp_int *r, mp_int *s, const byte* hash,
} }
} }
#ifdef WOLFSSL_SP_MATH #if defined(WOLFSSL_SP_MATH) && !defined(FREESCALE_LTC_ECC)
if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SECP256R1) { if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SECP256R1) {
return sp_ecc_verify_256(hash, hashlen, key->pubkey.x, key->pubkey.y, return sp_ecc_verify_256(hash, hashlen, key->pubkey.x, key->pubkey.y,
key->pubkey.z, r, s, res, key->heap); key->pubkey.z, r, s, res, key->heap);
@ -5669,7 +5669,7 @@ int wc_ecc_verify_hash_ex(mp_int *r, mp_int *s, const byte* hash,
else else
return WC_KEY_SIZE_E; return WC_KEY_SIZE_E;
#else #else
#ifdef WOLFSSL_HAVE_SP_ECC #if defined WOLFSSL_HAVE_SP_ECC && !defined(FREESCALE_LTC_ECC)
#ifndef WOLFSSL_SP_NO_256 #ifndef WOLFSSL_SP_NO_256
#if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC) #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
if (key->asyncDev.marker != WOLFSSL_ASYNC_MARKER_ECC) if (key->asyncDev.marker != WOLFSSL_ASYNC_MARKER_ECC)

View File

@ -52,14 +52,10 @@ int ksdk_port_init(void)
return 0; return 0;
} }
/* LTC TFM */
#if defined(FREESCALE_LTC_TFM)
/* Reverse array in memory (in place) */ /* Reverse array in memory (in place) */
static void ltc_reverse_array(uint8_t *src, size_t src_len) static void ltc_reverse_array(uint8_t *src, size_t src_len)
{ {
int i; unsigned int i;
for (i = 0; i < src_len / 2; i++) { for (i = 0; i < src_len / 2; i++) {
uint8_t tmp; uint8_t tmp;
@ -70,6 +66,8 @@ static void ltc_reverse_array(uint8_t *src, size_t src_len)
} }
} }
#ifndef WOLFSSL_SP_MATH
/* same as mp_to_unsigned_bin() with mp_reverse() skipped */ /* same as mp_to_unsigned_bin() with mp_reverse() skipped */
static int mp_to_unsigned_lsb_bin(mp_int *a, unsigned char *b) static int mp_to_unsigned_lsb_bin(mp_int *a, unsigned char *b)
{ {
@ -88,6 +86,7 @@ static int mp_to_unsigned_lsb_bin(mp_int *a, unsigned char *b)
return res; return res;
} }
#endif
static int ltc_get_lsb_bin_from_mp_int(uint8_t *dst, mp_int *A, uint16_t *psz) static int ltc_get_lsb_bin_from_mp_int(uint8_t *dst, mp_int *A, uint16_t *psz)
{ {
@ -95,12 +94,22 @@ static int ltc_get_lsb_bin_from_mp_int(uint8_t *dst, mp_int *A, uint16_t *psz)
uint16_t sz; uint16_t sz;
sz = mp_unsigned_bin_size(A); sz = mp_unsigned_bin_size(A);
#ifndef WOLFSSL_SP_MATH
res = mp_to_unsigned_lsb_bin(A, dst); /* result is lsbyte at lowest addr as required by LTC */ res = mp_to_unsigned_lsb_bin(A, dst); /* result is lsbyte at lowest addr as required by LTC */
#else
res = mp_to_unsigned_bin(A, dst);
if (res == MP_OKAY) {
ltc_reverse_array(dst, sz);
}
#endif
*psz = sz; *psz = sz;
return res; return res;
} }
/* LTC TFM */
#if defined(FREESCALE_LTC_TFM)
/* these function are used by wolfSSL upper layers (like RSA) */ /* these function are used by wolfSSL upper layers (like RSA) */
/* c = a * b */ /* c = a * b */
@ -113,9 +122,11 @@ int mp_mul(mp_int *A, mp_int *B, mp_int *C)
/* if unsigned mul can fit into LTC PKHA let's use it, otherwise call software mul */ /* if unsigned mul can fit into LTC PKHA let's use it, otherwise call software mul */
if ((szA <= LTC_MAX_INT_BYTES / 2) && (szB <= LTC_MAX_INT_BYTES / 2)) { if ((szA <= LTC_MAX_INT_BYTES / 2) && (szB <= LTC_MAX_INT_BYTES / 2)) {
int neg; int neg = 0;
#ifndef WOLFSSL_SP_MATH
neg = (A->sign == B->sign) ? MP_ZPOS : MP_NEG; neg = (A->sign == B->sign) ? MP_ZPOS : MP_NEG;
#endif
/* unsigned multiply */ /* unsigned multiply */
uint8_t *ptrA = (uint8_t *)XMALLOC(LTC_MAX_INT_BYTES, 0, DYNAMIC_TYPE_BIGINT); uint8_t *ptrA = (uint8_t *)XMALLOC(LTC_MAX_INT_BYTES, 0, DYNAMIC_TYPE_BIGINT);
@ -140,8 +151,10 @@ int mp_mul(mp_int *A, mp_int *B, mp_int *C)
} }
} }
#ifndef WOLFSSL_SP_MATH
/* fix sign */ /* fix sign */
C->sign = neg; C->sign = neg;
#endif
if (ptrA) { if (ptrA) {
XFREE(ptrA, NULL, DYNAMIC_TYPE_BIGINT); XFREE(ptrA, NULL, DYNAMIC_TYPE_BIGINT);
} }
@ -153,7 +166,11 @@ int mp_mul(mp_int *A, mp_int *B, mp_int *C)
} }
} }
else { else {
#ifdef WOLFSSL_SP_MATH
res = sp_mul(A, B, C);
#else
res = wolfcrypt_mp_mul(A, B, C); res = wolfcrypt_mp_mul(A, B, C);
#endif
} }
return res; return res;
} }
@ -169,13 +186,15 @@ int mp_mod(mp_int *a, mp_int *b, mp_int *c)
if ((szA <= LTC_MAX_INT_BYTES) && (szB <= LTC_MAX_INT_BYTES)) if ((szA <= LTC_MAX_INT_BYTES) && (szB <= LTC_MAX_INT_BYTES))
{ {
#endif /* FREESCALE_LTC_TFM_RSA_4096_ENABLE */ #endif /* FREESCALE_LTC_TFM_RSA_4096_ENABLE */
int neg; int neg = 0;
uint8_t *ptrA = (uint8_t *)XMALLOC(LTC_MAX_INT_BYTES, 0, DYNAMIC_TYPE_BIGINT); uint8_t *ptrA = (uint8_t *)XMALLOC(LTC_MAX_INT_BYTES, 0, DYNAMIC_TYPE_BIGINT);
uint8_t *ptrB = (uint8_t *)XMALLOC(LTC_MAX_INT_BYTES, 0, DYNAMIC_TYPE_BIGINT); uint8_t *ptrB = (uint8_t *)XMALLOC(LTC_MAX_INT_BYTES, 0, DYNAMIC_TYPE_BIGINT);
uint8_t *ptrC = (uint8_t *)XMALLOC(LTC_MAX_INT_BYTES, 0, DYNAMIC_TYPE_BIGINT); uint8_t *ptrC = (uint8_t *)XMALLOC(LTC_MAX_INT_BYTES, 0, DYNAMIC_TYPE_BIGINT);
#ifndef WOLFSSL_SP_MATH
/* get sign for the result */ /* get sign for the result */
neg = (a->sign == b->sign) ? MP_ZPOS : MP_NEG; neg = (a->sign == b->sign) ? MP_ZPOS : MP_NEG;
#endif
/* get remainder of unsigned a divided by unsigned b */ /* get remainder of unsigned a divided by unsigned b */
if (ptrA && ptrB && ptrC) { if (ptrA && ptrB && ptrC) {
@ -200,8 +219,10 @@ int mp_mod(mp_int *a, mp_int *b, mp_int *c)
res = MP_MEM; res = MP_MEM;
} }
#ifndef WOLFSSL_SP_MATH
/* fix sign */ /* fix sign */
c->sign = neg; c->sign = neg;
#endif
if (ptrA) { if (ptrA) {
XFREE(ptrA, NULL, DYNAMIC_TYPE_BIGINT); XFREE(ptrA, NULL, DYNAMIC_TYPE_BIGINT);
@ -257,7 +278,9 @@ int mp_invmod(mp_int *a, mp_int *b, mp_int *c)
res = MP_MEM; res = MP_MEM;
} }
#ifndef WOLFSSL_SP_MATH
c->sign = a->sign; c->sign = a->sign;
#endif
if (ptrA) { if (ptrA) {
XFREE(ptrA, NULL, DYNAMIC_TYPE_BIGINT); XFREE(ptrA, NULL, DYNAMIC_TYPE_BIGINT);
} }
@ -297,6 +320,7 @@ int mp_mulmod(mp_int *a, mp_int *b, mp_int *c, mp_int *d)
/* if A or B is negative, subtract abs(A) or abs(B) from modulus to get positive integer representation of the /* if A or B is negative, subtract abs(A) or abs(B) from modulus to get positive integer representation of the
* same number */ * same number */
res = mp_init(&t); res = mp_init(&t);
#ifndef WOLFSSL_SP_MATH
if (a->sign) { if (a->sign) {
if (res == MP_OKAY) if (res == MP_OKAY)
res = mp_add(a, c, &t); res = mp_add(a, c, &t);
@ -309,6 +333,7 @@ int mp_mulmod(mp_int *a, mp_int *b, mp_int *c, mp_int *d)
if (res == MP_OKAY) if (res == MP_OKAY)
res = mp_copy(&t, b); res = mp_copy(&t, b);
} }
#endif
if (res == MP_OKAY && ptrA && ptrB && ptrC && ptrD) { if (res == MP_OKAY && ptrA && ptrB && ptrC && ptrD) {
uint16_t sizeA, sizeB, sizeC, sizeD; uint16_t sizeA, sizeB, sizeC, sizeD;
@ -413,12 +438,14 @@ int mp_exptmod(mp_int *G, mp_int *X, mp_int *P, mp_int *Y)
/* if G is negative, add modulus to convert to positive number for LTC */ /* if G is negative, add modulus to convert to positive number for LTC */
res = mp_init(&t); res = mp_init(&t);
#ifndef WOLFSSL_SP_MATH
if (G->sign) { if (G->sign) {
if (res == MP_OKAY) if (res == MP_OKAY)
res = mp_add(G, P, &t); res = mp_add(G, P, &t);
if (res == MP_OKAY) if (res == MP_OKAY)
res = mp_copy(&t, G); res = mp_copy(&t, G);
} }
#endif
if (res == MP_OKAY && ptrG && ptrX && ptrP) { if (res == MP_OKAY && ptrG && ptrX && ptrP) {
res = ltc_get_lsb_bin_from_mp_int(ptrG, G, &sizeG); res = ltc_get_lsb_bin_from_mp_int(ptrG, G, &sizeG);
@ -731,7 +758,9 @@ int wc_ecc_mulmod_ex(mp_int *k, ecc_point *G, ecc_point *R, mp_int* a,
/* if k is negative, we compute the multiplication with abs(-k) /* if k is negative, we compute the multiplication with abs(-k)
* with result (x, y) and modify the result to (x, -y) * with result (x, y) and modify the result to (x, -y)
*/ */
#ifndef WOLFSSL_SP_MATH
R->y->sign = k->sign; R->y->sign = k->sign;
#endif
} }
if (res == MP_OKAY) if (res == MP_OKAY)
res = mp_set(R->z, 1); res = mp_set(R->z, 1);

View File

@ -52,6 +52,16 @@ WOLFSSL_LOCAL int sp_ModExp_3072(sp_int* base, sp_int* exp, sp_int* mod,
#endif #endif
int sp_get_digit_count(sp_int *a)
{
int ret;
if (!a)
ret = 0;
else
ret = a->used;
return ret;
}
/* Initialize the big number to be zero. /* Initialize the big number to be zero.
* *
* a SP integer. * a SP integer.
@ -388,6 +398,18 @@ int sp_copy(sp_int* a, sp_int* r)
} }
return MP_OKAY; return MP_OKAY;
} }
/* creates "a" then copies b into it */
int sp_init_copy (sp_int * a, sp_int * b)
{
int res;
if ((res = sp_init(a)) == MP_OKAY) {
if((res = sp_copy (b, a)) != MP_OKAY) {
sp_clear(a);
}
}
return res;
}
#endif #endif
/* Set the big number to be the value of the digit. /* Set the big number to be the value of the digit.
@ -561,7 +583,7 @@ int sp_sub(sp_int* a, sp_int* b, sp_int* r)
* n Number of bits to shift. * n Number of bits to shift.
* r SP integer result. * r SP integer result.
*/ */
static void sp_rshb(sp_int* a, int n, sp_int* r) void sp_rshb(sp_int* a, int n, sp_int* r)
{ {
int i; int i;
int j; int j;
@ -704,6 +726,8 @@ static int sp_div(sp_int* a, sp_int* d, sp_int* r, sp_int* rem)
return err; return err;
} }
#ifndef FREESCALE_LTC_TFM
/* Calculate the remainder of dividing a by m: r = a mod m. /* Calculate the remainder of dividing a by m: r = a mod m.
* *
* a SP integer. * a SP integer.
@ -716,6 +740,7 @@ int sp_mod(sp_int* a, sp_int* m, sp_int* r)
return sp_div(a, m, NULL, r); return sp_div(a, m, NULL, r);
} }
#endif #endif
#endif
/* Clear all data in the big number and sets value to zero. /* Clear all data in the big number and sets value to zero.
* *

View File

@ -25,6 +25,8 @@
#include <wolfssl/wolfcrypt/settings.h> #include <wolfssl/wolfcrypt/settings.h>
#ifdef USE_FAST_MATH #ifdef USE_FAST_MATH
#include <wolfssl/wolfcrypt/tfm.h> #include <wolfssl/wolfcrypt/tfm.h>
#elif defined WOLFSSL_SP_MATH
#include <wolfssl/wolfcrypt/sp_int.h>
#else #else
#include <wolfssl/wolfcrypt/integer.h> #include <wolfssl/wolfcrypt/integer.h>
#endif #endif
@ -44,6 +46,10 @@ int ksdk_port_init(void);
int wolfcrypt_mp_mod(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_invmod(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); 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 */ #endif /* FREESCALE_LTC_TFM */
#if defined(FREESCALE_LTC_ECC) #if defined(FREESCALE_LTC_ECC)

View File

@ -187,6 +187,10 @@ MP_API int sp_exptmod(sp_int* b, sp_int* e, sp_int* m, sp_int* r);
MP_API int sp_prime_is_prime(mp_int* a, int t, int* result); MP_API int sp_prime_is_prime(mp_int* a, int t, int* result);
MP_API int sp_prime_is_prime_ex(mp_int* a, int t, int* result, WC_RNG* rng); MP_API int sp_prime_is_prime_ex(mp_int* a, int t, int* result, WC_RNG* rng);
MP_API int sp_exch(sp_int* a, sp_int* b); MP_API int sp_exch(sp_int* a, sp_int* b);
MP_API int sp_get_digit_count(sp_int *a);
MP_API int sp_init_copy (sp_int * a, sp_int * b);
MP_API void sp_rshb(sp_int* a, int n, sp_int* r);
#define MP_OKAY 0 #define MP_OKAY 0
#define MP_NO 0 #define MP_NO 0
@ -249,6 +253,9 @@ MP_API int sp_exch(sp_int* a, sp_int* b);
#define mp_prime_is_prime sp_prime_is_prime #define mp_prime_is_prime sp_prime_is_prime
#define mp_prime_is_prime_ex sp_prime_is_prime_ex #define mp_prime_is_prime_ex sp_prime_is_prime_ex
#define mp_exch sp_exch #define mp_exch sp_exch
#define get_digit_count sp_get_digit_count
#define mp_init_copy sp_init_copy
#define mp_rshb(A,x) sp_rshb(A,x,A)
#endif #endif