ecp: Add support for hardware implementation of ECP routines

ESP32C2 has a hardware ECC accelerator that supports NIST P-192 and NIST P-256 curves,
which can increase the performance of the point multiplication and point
verification operation.

Provision is also added to fallback to software implementation in
case the curve is not from the supported curves

(cherry picked from commit e46cff44a1c47593aaf85d2e2686a464f8835a11)
This commit is contained in:
Sachin Parekh 2022-01-05 15:23:44 +05:30 committed by Mahavir Jain
parent d0aadd1241
commit 249e637084
No known key found for this signature in database
GPG Key ID: 99324EF4A00734E0

View File

@ -158,6 +158,7 @@ static inline int ecp_drbg_random(void *p_rng,
return mbedtls_hmac_drbg_random(p_rng, output, output_len);
}
#if !defined(MBEDTLS_ECP_MUL_ALT)
/* DRBG context seeding */
static int ecp_drbg_seed(ecp_drbg_context *ctx,
const mbedtls_mpi *secret, size_t secret_len)
@ -184,6 +185,7 @@ cleanup:
return ret;
}
#endif /* MBEDTLS_ECP_MUL_ALT */
#elif defined(MBEDTLS_CTR_DRBG_C)
@ -1366,6 +1368,7 @@ cleanup:
#endif /* !defined(MBEDTLS_ECP_NO_FALLBACK) || !defined(MBEDTLS_ECP_NORMALIZE_JAC_ALT) */
}
#if !defined(MBEDTLS_ECP_MUL_ALT)
/*
* Normalize jacobian coordinates of an array of (pointers to) points,
* using Montgomery's trick to perform only one inversion mod P.
@ -1491,6 +1494,7 @@ cleanup:
return ret;
}
#endif /* MBEDTLS_ECP_MUL_ALT */
/*
* Point doubling R = 2 P, Jacobian coordinates
@ -1688,6 +1692,7 @@ cleanup:
#endif /* !defined(MBEDTLS_ECP_NO_FALLBACK) || !defined(MBEDTLS_ECP_ADD_MIXED_ALT) */
}
#if !defined(MBEDTLS_ECP_MUL_ALT)
/*
* Randomize jacobian coordinates:
* (X, Y, Z) -> (l^2 X, l^3 Y, l Z) for random l
@ -2443,6 +2448,8 @@ cleanup:
return ret;
}
#endif /* MBEDTLS_ECP_MUL_ALT */
#endif /* MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED */
#if defined(MBEDTLS_ECP_MONTGOMERY_ENABLED)
@ -2454,6 +2461,7 @@ cleanup:
* For scalar multiplication, we'll use a Montgomery ladder.
*/
#if !defined(MBEDTLS_ECP_MUL_ALT)
/*
* Normalize Montgomery x/z coordinates: X = X/Z, Z = 1
* Cost: 1M + 1I
@ -2687,15 +2695,24 @@ cleanup:
return ret;
}
#endif /* MBEDTLS_ECP_MUL_ALT */
#endif /* MBEDTLS_ECP_MONTGOMERY_ENABLED */
#if !defined(MBEDTLS_ECP_MUL_ALT)
/*
* Restartable multiplication R = m * P
*/
#if defined(MBEDTLS_ECP_MUL_ALT_SOFT_FALLBACK)
int mbedtls_ecp_mul_restartable_soft( mbedtls_ecp_group *grp, mbedtls_ecp_point *R,
const mbedtls_mpi *m, const mbedtls_ecp_point *P,
int (*f_rng)(void *, unsigned char *, size_t), void *p_rng,
mbedtls_ecp_restart_ctx *rs_ctx )
#else
int mbedtls_ecp_mul_restartable(mbedtls_ecp_group *grp, mbedtls_ecp_point *R,
const mbedtls_mpi *m, const mbedtls_ecp_point *P,
int (*f_rng)(void *, unsigned char *, size_t), void *p_rng,
mbedtls_ecp_restart_ctx *rs_ctx)
#endif
{
int ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
#if defined(MBEDTLS_ECP_INTERNAL_ALT)
@ -2763,6 +2780,7 @@ cleanup:
return ret;
}
#endif /* MBEDTLS_ECP_MUL_ALT */
/*
* Multiplication R = m * P
@ -2778,7 +2796,10 @@ int mbedtls_ecp_mul(mbedtls_ecp_group *grp, mbedtls_ecp_point *R,
return mbedtls_ecp_mul_restartable(grp, R, m, P, f_rng, p_rng, NULL);
}
#if !defined(MBEDTLS_ECP_VERIFY_ALT)
#if defined(MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED)
/*
* Check that an affine point is valid as a public key,
* short weierstrass curves (SEC1 3.2.3.1)
@ -2826,6 +2847,7 @@ cleanup:
return ret;
}
#endif /* MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED */
#endif /* MBEDTLS_ECP_VERIFY_ALT */
#if defined(MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED)
/*
@ -2985,6 +3007,8 @@ int mbedtls_ecp_muladd(mbedtls_ecp_group *grp, mbedtls_ecp_point *R,
}
#endif /* MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED */
#if !defined(MBEDTLS_ECP_VERIFY_ALT)
#if defined(MBEDTLS_ECP_MONTGOMERY_ENABLED)
#if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED)
#define ECP_MPI_INIT(s, n, p) { s, (n), (mbedtls_mpi_uint *) (p) }
@ -3096,11 +3120,19 @@ static int ecp_check_pubkey_mx(const mbedtls_ecp_group *grp, const mbedtls_ecp_p
}
#endif /* MBEDTLS_ECP_MONTGOMERY_ENABLED */
#endif /* MBEDTLS_ECP_VERIFY_ALT */
#if !defined(MBEDTLS_ECP_VERIFY_ALT)
/*
* Check that a point is valid as a public key
*/
#if defined(MBEDTLS_ECP_VERIFY_ALT_SOFT_FALLBACK)
int mbedtls_ecp_check_pubkey_soft( const mbedtls_ecp_group *grp,
const mbedtls_ecp_point *pt )
#else
int mbedtls_ecp_check_pubkey(const mbedtls_ecp_group *grp,
const mbedtls_ecp_point *pt)
#endif
{
ECP_VALIDATE_RET(grp != NULL);
ECP_VALIDATE_RET(pt != NULL);
@ -3122,6 +3154,7 @@ int mbedtls_ecp_check_pubkey(const mbedtls_ecp_group *grp,
#endif
return MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
}
#endif /* MBEDTLS_ECP_VERIFY_ALT */
/*
* Check that an mbedtls_mpi is valid as a private key