forked from wolfSSL/wolfssl
Merge pull request #791 from dgarske/fix_ecc_test_curve_idx
Fix wc_ecc_export_point_der to use curve_id
This commit is contained in:
@ -1102,12 +1102,8 @@ static int wc_ecc_curve_load(const ecc_set_type* dp, ecc_curve_spec** pCurve,
|
|||||||
return BAD_FUNC_ARG;
|
return BAD_FUNC_ARG;
|
||||||
|
|
||||||
#ifdef ECC_CACHE_CURVE
|
#ifdef ECC_CACHE_CURVE
|
||||||
/* find ecc_set index based on curve_id */
|
x = wc_ecc_get_curve_idx(dp->id);
|
||||||
for (x = 0; ecc_sets[x].size != 0; x++) {
|
if (x == ECC_CURVE_INVALID)
|
||||||
if (dp->id == ecc_sets[x].id)
|
|
||||||
break; /* found index */
|
|
||||||
}
|
|
||||||
if (ecc_sets[x].size == 0)
|
|
||||||
return ECC_BAD_ARG_E;
|
return ECC_BAD_ARG_E;
|
||||||
|
|
||||||
/* make sure cache has been allocated */
|
/* make sure cache has been allocated */
|
||||||
@ -1195,6 +1191,7 @@ void wc_ecc_curve_cache_free(void)
|
|||||||
|
|
||||||
#endif /* WOLFSSL_ATECC508A */
|
#endif /* WOLFSSL_ATECC508A */
|
||||||
|
|
||||||
|
|
||||||
/* Retrieve the curve name for the ECC curve id.
|
/* Retrieve the curve name for the ECC curve id.
|
||||||
*
|
*
|
||||||
* curve_id The id of the curve.
|
* curve_id The id of the curve.
|
||||||
@ -1202,14 +1199,10 @@ void wc_ecc_curve_cache_free(void)
|
|||||||
*/
|
*/
|
||||||
const char* wc_ecc_get_name(int curve_id)
|
const char* wc_ecc_get_name(int curve_id)
|
||||||
{
|
{
|
||||||
int x;
|
int curve_idx = wc_ecc_get_curve_idx(curve_id);
|
||||||
|
if (curve_idx == ECC_CURVE_INVALID)
|
||||||
for (x = 0; ecc_sets[x].size != 0; x++) {
|
return NULL;
|
||||||
if (curve_id == ecc_sets[x].id)
|
return ecc_sets[curve_idx].name;
|
||||||
return ecc_sets[x].name;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int wc_ecc_set_curve(ecc_key* key, int keysize, int curve_id)
|
static int wc_ecc_set_curve(ecc_key* key, int keysize, int curve_id)
|
||||||
@ -2468,52 +2461,38 @@ int wc_ecc_is_valid_idx(int n)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int wc_ecc_get_curve_idx(int curve_id)
|
||||||
/*
|
|
||||||
* Returns the curve name that corresponds to an ecc_curve_id identifier
|
|
||||||
*
|
|
||||||
* id curve id, from ecc_curve_id enum in ecc.h
|
|
||||||
* return const char* representing curve name, from ecc_sets[] on success,
|
|
||||||
* otherwise NULL if id not found.
|
|
||||||
*/
|
|
||||||
const char* wc_ecc_get_curve_name_from_id(int id)
|
|
||||||
{
|
{
|
||||||
int i;
|
int curve_idx;
|
||||||
|
for (curve_idx = 0; ecc_sets[curve_idx].size != 0; curve_idx++) {
|
||||||
for (i = 0; ecc_sets[i].size != 0; i++) {
|
if (curve_id == ecc_sets[curve_idx].id)
|
||||||
if (id == ecc_sets[i].id)
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (ecc_sets[curve_idx].size == 0) {
|
||||||
if (ecc_sets[i].size == 0) {
|
return ECC_CURVE_INVALID;
|
||||||
WOLFSSL_MSG("ecc_set curve not found");
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
return curve_idx;
|
||||||
return ecc_sets[i].name;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int wc_ecc_get_curve_id(int curve_idx)
|
||||||
|
{
|
||||||
|
if (wc_ecc_is_valid_idx(curve_idx)) {
|
||||||
|
return ecc_sets[curve_idx].id;
|
||||||
|
}
|
||||||
|
return ECC_CURVE_INVALID;
|
||||||
|
}
|
||||||
|
|
||||||
/* Returns the curve size that corresponds to a given ecc_curve_id identifier
|
/* Returns the curve size that corresponds to a given ecc_curve_id identifier
|
||||||
*
|
*
|
||||||
* id curve id, from ecc_curve_id enum in ecc.h
|
* id curve id, from ecc_curve_id enum in ecc.h
|
||||||
* return curve size, from ecc_sets[] on success, negative on error
|
* return curve size, from ecc_sets[] on success, negative on error
|
||||||
*/
|
*/
|
||||||
int wc_ecc_get_curve_size_from_id(int id)
|
int wc_ecc_get_curve_size_from_id(int curve_id)
|
||||||
{
|
{
|
||||||
int i;
|
int curve_idx = wc_ecc_get_curve_idx(curve_id);
|
||||||
|
if (curve_idx == ECC_CURVE_INVALID)
|
||||||
for (i = 0; ecc_sets[i].size != 0; i++) {
|
|
||||||
if (id == ecc_sets[i].id)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ecc_sets[i].size == 0) {
|
|
||||||
WOLFSSL_MSG("ecc_set curve not found");
|
|
||||||
return ECC_BAD_ARG_E;
|
return ECC_BAD_ARG_E;
|
||||||
}
|
return ecc_sets[curve_idx].size;
|
||||||
|
|
||||||
return ecc_sets[i].size;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -10069,6 +10069,11 @@ static int ecc_point_test(void)
|
|||||||
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||||
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||||
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 };
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 };
|
||||||
|
int curve_idx = wc_ecc_get_curve_idx(ECC_SECP256R1);
|
||||||
|
|
||||||
|
/* if curve P256 is not enabled then test should not fail */
|
||||||
|
if (curve_idx == ECC_CURVE_INVALID)
|
||||||
|
return 0;
|
||||||
|
|
||||||
outLen = sizeof(out);
|
outLen = sizeof(out);
|
||||||
point = wc_ecc_new_point();
|
point = wc_ecc_new_point();
|
||||||
@ -10082,17 +10087,17 @@ static int ecc_point_test(void)
|
|||||||
|
|
||||||
/* Parameter Validation testing. */
|
/* Parameter Validation testing. */
|
||||||
wc_ecc_del_point(NULL);
|
wc_ecc_del_point(NULL);
|
||||||
ret = wc_ecc_import_point_der(NULL, sizeof(der), 6, point);
|
ret = wc_ecc_import_point_der(NULL, sizeof(der), curve_idx, point);
|
||||||
if (ret != ECC_BAD_ARG_E) {
|
if (ret != ECC_BAD_ARG_E) {
|
||||||
ret = -1037;
|
ret = -1037;
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
ret = wc_ecc_import_point_der(der, sizeof(der), -1, point);
|
ret = wc_ecc_import_point_der(der, sizeof(der), ECC_CURVE_INVALID, point);
|
||||||
if (ret != ECC_BAD_ARG_E) {
|
if (ret != ECC_BAD_ARG_E) {
|
||||||
ret = -1038;
|
ret = -1038;
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
ret = wc_ecc_import_point_der(der, sizeof(der), 6, NULL);
|
ret = wc_ecc_import_point_der(der, sizeof(der), curve_idx, NULL);
|
||||||
if (ret != ECC_BAD_ARG_E) {
|
if (ret != ECC_BAD_ARG_E) {
|
||||||
ret = -1039;
|
ret = -1039;
|
||||||
goto done;
|
goto done;
|
||||||
@ -10102,23 +10107,23 @@ static int ecc_point_test(void)
|
|||||||
ret = -1040;
|
ret = -1040;
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
ret = wc_ecc_export_point_der(6, NULL, out, &outLen);
|
ret = wc_ecc_export_point_der(curve_idx, NULL, out, &outLen);
|
||||||
if (ret != ECC_BAD_ARG_E) {
|
if (ret != ECC_BAD_ARG_E) {
|
||||||
ret = -1041;
|
ret = -1041;
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
ret = wc_ecc_export_point_der(6, point, NULL, &outLen);
|
ret = wc_ecc_export_point_der(curve_idx, point, NULL, &outLen);
|
||||||
if (ret != LENGTH_ONLY_E || outLen != sizeof(out)) {
|
if (ret != LENGTH_ONLY_E || outLen != sizeof(out)) {
|
||||||
ret = -1043;
|
ret = -1042;
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
ret = wc_ecc_export_point_der(6, point, out, NULL);
|
ret = wc_ecc_export_point_der(curve_idx, point, out, NULL);
|
||||||
if (ret != ECC_BAD_ARG_E) {
|
if (ret != ECC_BAD_ARG_E) {
|
||||||
ret = -1043;
|
ret = -1043;
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
outLen = 0;
|
outLen = 0;
|
||||||
ret = wc_ecc_export_point_der(6, point, out, &outLen);
|
ret = wc_ecc_export_point_der(curve_idx, point, out, &outLen);
|
||||||
if (ret != BUFFER_E) {
|
if (ret != BUFFER_E) {
|
||||||
ret = -1044;
|
ret = -1044;
|
||||||
goto done;
|
goto done;
|
||||||
@ -10155,14 +10160,14 @@ static int ecc_point_test(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Use API. */
|
/* Use API. */
|
||||||
ret = wc_ecc_import_point_der(der, sizeof(der), 6, point);
|
ret = wc_ecc_import_point_der(der, sizeof(der), curve_idx, point);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
ret = -1051;
|
ret = -1051;
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
outLen = sizeof(out);
|
outLen = sizeof(out);
|
||||||
ret = wc_ecc_export_point_der(6, point, out, &outLen);
|
ret = wc_ecc_export_point_der(curve_idx, point, out, &outLen);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
ret = -1052;
|
ret = -1052;
|
||||||
goto done;
|
goto done;
|
||||||
@ -10187,7 +10192,7 @@ static int ecc_point_test(void)
|
|||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = wc_ecc_import_point_der(altDer, sizeof(altDer), 6, point2);
|
ret = wc_ecc_import_point_der(altDer, sizeof(altDer), curve_idx, point2);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
ret = -1057;
|
ret = -1057;
|
||||||
goto done;
|
goto done;
|
||||||
@ -10200,13 +10205,13 @@ static int ecc_point_test(void)
|
|||||||
|
|
||||||
#ifdef HAVE_COMP_KEY
|
#ifdef HAVE_COMP_KEY
|
||||||
/* TODO: Doesn't work. */
|
/* TODO: Doesn't work. */
|
||||||
ret = wc_ecc_import_point_der(derComp0, sizeof(der), 6, point);
|
ret = wc_ecc_import_point_der(derComp0, sizeof(der), curve_idx, point);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
ret = -1059;
|
ret = -1059;
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = wc_ecc_import_point_der(derComp1, sizeof(der), 6, point);
|
ret = wc_ecc_import_point_der(derComp1, sizeof(der), curve_idx, point);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
ret = -1060;
|
ret = -1060;
|
||||||
goto done;
|
goto done;
|
||||||
|
@ -110,7 +110,8 @@ enum {
|
|||||||
|
|
||||||
/* Curve Types */
|
/* Curve Types */
|
||||||
typedef enum ecc_curve_id {
|
typedef enum ecc_curve_id {
|
||||||
ECC_CURVE_DEF, /* NIST or SECP */
|
ECC_CURVE_INVALID = -1,
|
||||||
|
ECC_CURVE_DEF = 0, /* NIST or SECP */
|
||||||
|
|
||||||
/* NIST Prime Curves */
|
/* NIST Prime Curves */
|
||||||
ECC_SECP192R1,
|
ECC_SECP192R1,
|
||||||
@ -343,7 +344,10 @@ void wc_ecc_fp_free(void);
|
|||||||
WOLFSSL_API
|
WOLFSSL_API
|
||||||
int wc_ecc_is_valid_idx(int n);
|
int wc_ecc_is_valid_idx(int n);
|
||||||
WOLFSSL_API
|
WOLFSSL_API
|
||||||
const char* wc_ecc_get_curve_name_from_id(int curve_id);
|
int wc_ecc_get_curve_idx(int curve_id);
|
||||||
|
WOLFSSL_API
|
||||||
|
int wc_ecc_get_curve_id(int curve_idx);
|
||||||
|
#define wc_ecc_get_curve_name_from_id wc_ecc_get_name
|
||||||
WOLFSSL_API
|
WOLFSSL_API
|
||||||
int wc_ecc_get_curve_size_from_id(int curve_id);
|
int wc_ecc_get_curve_size_from_id(int curve_id);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user