Merge pull request #1148 from dgarske/fix_ecc508a

Fixes to `WOLFSSL_ATECC508A` support to allow import/export
This commit is contained in:
toddouska 2017-12-19 07:17:41 -08:00 committed by GitHub
commit d08572164f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 33 additions and 49 deletions

View File

@ -1292,6 +1292,16 @@ int wc_ecc_set_curve(ecc_key* key, int keysize, int curve_id)
return 0;
}
#ifdef ALT_ECC_SIZE
static void alt_fp_init(fp_int* a)
{
a->size = FP_SIZE_ECC;
fp_zero(a);
}
#endif /* ALT_ECC_SIZE */
#ifndef WOLFSSL_ATECC508A
/**
@ -2326,17 +2336,7 @@ int wc_ecc_mulmod(mp_int* k, ecc_point *G, ecc_point *R, mp_int* a,
return wc_ecc_mulmod_ex(k, G, R, a, modulus, map, NULL);
}
#ifdef ALT_ECC_SIZE
static void alt_fp_init(fp_int* a)
{
a->size = FP_SIZE_ECC;
fp_zero(a);
}
#endif /* ALT_ECC_SIZE */
#endif /* !WOLFSSL_ATECC508A */
/**
* use a heap hint when creating new ecc_point
@ -2454,8 +2454,6 @@ int wc_ecc_cmp_point(ecc_point* a, ecc_point *b)
return MP_EQ;
}
#endif /* !WOLFSSL_ATECC508A */
/** Returns whether an ECC idx is valid or not
n The idx number to check
@ -2710,7 +2708,7 @@ int wc_ecc_shared_secret(ecc_key* private_key, ecc_key* public_key, byte* out,
}
#ifdef WOLFSSL_ATECC508A
err = atcatls_ecdh(private_key->slot, public_key->pubkey, out);
err = atcatls_ecdh(private_key->slot, public_key->pubkey_raw, out);
if (err != ATCA_SUCCESS) {
err = BAD_COND_E;
}
@ -3190,10 +3188,16 @@ int wc_ecc_make_key_ex(WC_RNG* rng, int keysize, ecc_key* key, int curve_id)
#endif /* WOLFSSL_ASYNC_CRYPT */
#ifdef WOLFSSL_ATECC508A
key->type = ECC_PRIVATEKEY;
err = atcatls_create_key(key->slot, key->pubkey);
if (err != ATCA_SUCCESS)
err = BAD_COND_E;
key->type = ECC_PRIVATEKEY;
err = atcatls_create_key(key->slot, key->pubkey_raw);
if (err != ATCA_SUCCESS) {
err = BAD_COND_E;
}
/* populate key->pubkey */
err = mp_read_unsigned_bin(key->pubkey.x, key->pubkey_raw, 32);
if (err = MP_OKAY)
err = mp_read_unsigned_bin(key->pubkey.y, key->pubkey_raw + 32, 32);
#else
#ifdef WOLFSSL_HAVE_SP_ECC
@ -4176,7 +4180,7 @@ int wc_ecc_verify_hash_ex(mp_int *r, mp_int *s, const byte* hash,
return err;
}
err = atcatls_verify(hash, sigRS, key->pubkey, (bool*)res);
err = atcatls_verify(hash, sigRS, key->pubkey_raw, (bool*)res);
if (err != ATCA_SUCCESS) {
return BAD_COND_E;
}
@ -4426,6 +4430,11 @@ int wc_ecc_import_point_der(byte* in, word32 inLen, const int curve_idx,
#endif
}
#ifdef WOLFSSL_ATECC508A
/* populate key->pubkey_raw */
XMEMCPY(key->pubkey_raw, (byte*)in+1, PUB_KEY_SIZE);
#endif
/* read data */
if (err == MP_OKAY)
err = mp_read_unsigned_bin(point->x, (byte*)in+1, (inLen-1)>>1);
@ -4587,14 +4596,12 @@ int wc_ecc_export_x963(ecc_key* key, byte* out, word32* outLen)
{
int ret = MP_OKAY;
word32 numlen;
#ifndef WOLFSSL_ATECC508A
#ifdef WOLFSSL_SMALL_STACK
byte* buf;
#else
byte buf[ECC_BUFSIZE];
#endif
word32 pubxlen, pubylen;
#endif /* WOLFSSL_ATECC508A */
/* return length needed only */
if (key != NULL && out == NULL && outLen != NULL) {
@ -4620,12 +4627,6 @@ int wc_ecc_export_x963(ecc_key* key, byte* out, word32* outLen)
return BUFFER_E;
}
#ifdef WOLFSSL_ATECC508A
/* TODO: Implement equiv call to ATECC508A */
ret = BAD_COND_E;
#else
/* verify public key length is less than key size */
pubxlen = mp_unsigned_bin_size(key->pubkey.x);
pubylen = mp_unsigned_bin_size(key->pubkey.y);
@ -4663,7 +4664,6 @@ done:
#ifdef WOLFSSL_SMALL_STACK
XFREE(buf, NULL, DYNAMIC_TYPE_ECC_BUFFER);
#endif
#endif /* WOLFSSL_ATECC508A */
return ret;
}
@ -4994,9 +4994,7 @@ int wc_ecc_import_x963_ex(const byte* in, word32 inLen, ecc_key* key,
int curve_id)
{
int err = MP_OKAY;
#ifndef WOLFSSL_ATECC508A
int compressed = 0;
#endif /* !WOLFSSL_ATECC508A */
if (in == NULL || key == NULL)
return BAD_FUNC_ARG;
@ -5009,12 +5007,6 @@ int wc_ecc_import_x963_ex(const byte* in, word32 inLen, ecc_key* key,
/* make sure required variables are reset */
wc_ecc_reset(key);
#ifdef WOLFSSL_ATECC508A
/* TODO: Implement equiv call to ATECC508A */
err = BAD_COND_E;
#else
/* init key */
#ifdef ALT_ECC_SIZE
key->pubkey.x = (mp_int*)&key->pubkey.xyz[0];
@ -5139,7 +5131,6 @@ int wc_ecc_import_x963_ex(const byte* in, word32 inLen, ecc_key* key,
mp_clear(key->pubkey.z);
mp_clear(&key->k);
}
#endif /* WOLFSSL_ATECC508A */
return err;
}
@ -5253,12 +5244,6 @@ static int wc_ecc_export_raw(ecc_key* key, byte* qx, word32* qxLen,
#endif /* WOLFSSL_ATECC508A */
}
#ifdef WOLFSSL_ATECC508A
/* TODO: Implement equiv call to ATECC508A */
return BAD_COND_E;
#else
/* public x component */
err = mp_to_unsigned_bin(key->pubkey.x, qx +
(numLen - mp_unsigned_bin_size(key->pubkey.x)));
@ -5272,7 +5257,6 @@ static int wc_ecc_export_raw(ecc_key* key, byte* qx, word32* qxLen,
return err;
return 0;
#endif /* WOLFSSL_ATECC508A */
}

View File

@ -285,12 +285,11 @@ struct ecc_key {
const ecc_set_type* dp; /* domain parameters, either points to NIST
curves (idx >= 0) or user supplied */
void* heap; /* heap hint */
#ifdef WOLFSSL_ATECC508A
int slot; /* Key Slot Number (-1 unknown) */
byte pubkey[PUB_KEY_SIZE];
#else
ecc_point pubkey; /* public key */
mp_int k; /* private key */
#ifdef WOLFSSL_ATECC508A
int slot; /* Key Slot Number (-1 unknown) */
byte pubkey_raw[PUB_KEY_SIZE];
#endif
#ifdef WOLFSSL_ASYNC_CRYPT
mp_int* r; /* sign/verify temps */
@ -409,7 +408,6 @@ int wc_ecc_get_curve_id_from_params(int fieldSize,
const byte* Bf, word32 BfSz, const byte* order, word32 orderSz,
const byte* Gx, word32 GxSz, const byte* Gy, word32 GySz, int cofactor);
#ifndef WOLFSSL_ATECC508A
WOLFSSL_API
ecc_point* wc_ecc_new_point(void);
@ -425,6 +423,8 @@ WOLFSSL_API
int wc_ecc_cmp_point(ecc_point* a, ecc_point *b);
WOLFSSL_API
int wc_ecc_point_is_at_infinity(ecc_point *p);
#ifndef WOLFSSL_ATECC508A
WOLFSSL_API
int wc_ecc_mulmod(mp_int* k, ecc_point *G, ecc_point *R,
mp_int* a, mp_int* modulus, int map);