forked from wolfSSL/wolfssl
New API
Add `wc_ecc_import_point_der_ex` for correct importing DER ECC point and keep `wc_ecc_import_point_der` old functionality
This commit is contained in:
15
src/ssl.c
15
src/ssl.c
@@ -36609,11 +36609,26 @@ int wolfSSL_ECPoint_d2i(unsigned char *in, unsigned int len,
|
|||||||
return WOLFSSL_FAILURE;
|
return WOLFSSL_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef HAVE_SELFTEST
|
||||||
|
if (wc_ecc_import_point_der_ex(in, len, group->curve_idx,
|
||||||
|
(ecc_point*)p->internal, 0) != MP_OKAY) {
|
||||||
|
WOLFSSL_MSG("wc_ecc_import_point_der_ex failed");
|
||||||
|
return WOLFSSL_FAILURE;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
/* ECC_POINT_UNCOMP is not defined CAVP self test so use magic number */
|
||||||
|
if (in[0] == 0x04) {
|
||||||
if (wc_ecc_import_point_der(in, len, group->curve_idx,
|
if (wc_ecc_import_point_der(in, len, group->curve_idx,
|
||||||
(ecc_point*)p->internal) != MP_OKAY) {
|
(ecc_point*)p->internal) != MP_OKAY) {
|
||||||
WOLFSSL_MSG("wc_ecc_import_point_der failed");
|
WOLFSSL_MSG("wc_ecc_import_point_der failed");
|
||||||
return WOLFSSL_FAILURE;
|
return WOLFSSL_FAILURE;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
WOLFSSL_MSG("Only uncompressed points supported with HAVE_SELFTEST");
|
||||||
|
return WOLFSSL_FAILURE;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Set new external point */
|
/* Set new external point */
|
||||||
if (SetECPointExternal(p) != WOLFSSL_SUCCESS) {
|
if (SetECPointExternal(p) != WOLFSSL_SUCCESS) {
|
||||||
|
@@ -6284,9 +6284,10 @@ int wc_ecc_verify_hash_ex(mp_int *r, mp_int *s, const byte* hash,
|
|||||||
#endif /* HAVE_ECC_VERIFY */
|
#endif /* HAVE_ECC_VERIFY */
|
||||||
|
|
||||||
#ifdef HAVE_ECC_KEY_IMPORT
|
#ifdef HAVE_ECC_KEY_IMPORT
|
||||||
/* import point from der */
|
/* import point from der
|
||||||
int wc_ecc_import_point_der(byte* in, word32 inLen, const int curve_idx,
|
* if shortKeySize != 0 then keysize is always (inLen-1)>>1 */
|
||||||
ecc_point* point)
|
int wc_ecc_import_point_der_ex(byte* in, word32 inLen, const int curve_idx,
|
||||||
|
ecc_point* point, char shortKeySize)
|
||||||
{
|
{
|
||||||
int err = 0;
|
int err = 0;
|
||||||
#ifdef HAVE_COMP_KEY
|
#ifdef HAVE_COMP_KEY
|
||||||
@@ -6337,8 +6338,9 @@ int wc_ecc_import_point_der(byte* in, word32 inLen, const int curve_idx,
|
|||||||
inLen -= 1;
|
inLen -= 1;
|
||||||
in += 1;
|
in += 1;
|
||||||
|
|
||||||
/* calculate key size based on inLen / 2 if uncompressed */
|
/* calculate key size based on inLen / 2 if uncompressed or shortKeySize
|
||||||
keysize = compressed ? inLen : inLen>>1;
|
* is true */
|
||||||
|
keysize = compressed && !shortKeySize ? inLen : inLen>>1;
|
||||||
|
|
||||||
/* read data */
|
/* read data */
|
||||||
if (err == MP_OKAY)
|
if (err == MP_OKAY)
|
||||||
@@ -6441,6 +6443,13 @@ int wc_ecc_import_point_der(byte* in, word32 inLen, const int curve_idx,
|
|||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* function for backwards compatiblity with previous implementations */
|
||||||
|
int wc_ecc_import_point_der(byte* in, word32 inLen, const int curve_idx,
|
||||||
|
ecc_point* point)
|
||||||
|
{
|
||||||
|
return wc_ecc_import_point_der_ex(in, inLen, curve_idx, point, 1);
|
||||||
|
}
|
||||||
#endif /* HAVE_ECC_KEY_IMPORT */
|
#endif /* HAVE_ECC_KEY_IMPORT */
|
||||||
|
|
||||||
#ifdef HAVE_ECC_KEY_EXPORT
|
#ifdef HAVE_ECC_KEY_EXPORT
|
||||||
|
@@ -19106,17 +19106,41 @@ static int ecc_point_test(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_COMP_KEY
|
#ifdef HAVE_COMP_KEY
|
||||||
ret = wc_ecc_import_point_der(derComp0, sizeof(derComp0), curve_idx, point3);
|
ret = wc_ecc_import_point_der(derComp0, sizeof(derComp0)*2-1, curve_idx, point3);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
ret = -9726;
|
ret = -9726;
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = wc_ecc_import_point_der(derComp1, sizeof(derComp1), curve_idx, point4);
|
ret = wc_ecc_import_point_der_ex(derComp0, sizeof(derComp0), curve_idx, point4, 0);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
ret = -9727;
|
ret = -9727;
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ret = wc_ecc_cmp_point(point3, point4);
|
||||||
|
if (ret != MP_EQ) {
|
||||||
|
ret = -9728;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = wc_ecc_import_point_der(derComp1, sizeof(derComp1)*2-1, curve_idx, point3);
|
||||||
|
if (ret != 0) {
|
||||||
|
ret = -9729;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = wc_ecc_import_point_der_ex(derComp1, sizeof(derComp1), curve_idx, point4, 0);
|
||||||
|
if (ret != 0) {
|
||||||
|
ret = -9730;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = wc_ecc_cmp_point(point3, point4);
|
||||||
|
if (ret != MP_EQ) {
|
||||||
|
ret = -9731;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
done:
|
done:
|
||||||
|
@@ -649,6 +649,9 @@ int wc_ecc_export_point_der_compressed(const int curve_idx, ecc_point* point,
|
|||||||
|
|
||||||
#ifdef HAVE_ECC_KEY_IMPORT
|
#ifdef HAVE_ECC_KEY_IMPORT
|
||||||
WOLFSSL_API
|
WOLFSSL_API
|
||||||
|
int wc_ecc_import_point_der_ex(byte* in, word32 inLen, const int curve_idx,
|
||||||
|
ecc_point* point, char shortKeySize);
|
||||||
|
WOLFSSL_API
|
||||||
int wc_ecc_import_point_der(byte* in, word32 inLen, const int curve_idx,
|
int wc_ecc_import_point_der(byte* in, word32 inLen, const int curve_idx,
|
||||||
ecc_point* point);
|
ecc_point* point);
|
||||||
#endif /* HAVE_ECC_KEY_IMPORT */
|
#endif /* HAVE_ECC_KEY_IMPORT */
|
||||||
|
Reference in New Issue
Block a user