Merge pull request #6999 from ivq/ecp_doc
Doc: Add note on special use of A in ecp group structure
This commit is contained in:
commit
91c8372c01
3 changed files with 51 additions and 4 deletions
|
@ -0,0 +1,3 @@
|
||||||
|
Features
|
||||||
|
* The documentation of mbedtls_ecp_group now describes the optimized
|
||||||
|
representation of A for some curves. Fixes #8045.
|
|
@ -197,6 +197,27 @@ mbedtls_ecp_point;
|
||||||
* odd prime as mbedtls_ecp_mul() requires an odd number, and
|
* odd prime as mbedtls_ecp_mul() requires an odd number, and
|
||||||
* mbedtls_ecdsa_sign() requires that it is prime for blinding purposes.
|
* mbedtls_ecdsa_sign() requires that it is prime for blinding purposes.
|
||||||
*
|
*
|
||||||
|
* The default implementation only initializes \p A without setting it to the
|
||||||
|
* authentic value for curves with <code>A = -3</code>(SECP256R1, etc), in which
|
||||||
|
* case you need to load \p A by yourself when using domain parameters directly,
|
||||||
|
* for example:
|
||||||
|
* \code
|
||||||
|
* mbedtls_mpi_init(&A);
|
||||||
|
* mbedtls_ecp_group_init(&grp);
|
||||||
|
* CHECK_RETURN(mbedtls_ecp_group_load(&grp, grp_id));
|
||||||
|
* if (mbedtls_ecp_group_a_is_minus_3(&grp)) {
|
||||||
|
* CHECK_RETURN(mbedtls_mpi_sub_int(&A, &grp.P, 3));
|
||||||
|
* } else {
|
||||||
|
* CHECK_RETURN(mbedtls_mpi_copy(&A, &grp.A));
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* do_something_with_a(&A);
|
||||||
|
*
|
||||||
|
* cleanup:
|
||||||
|
* mbedtls_mpi_free(&A);
|
||||||
|
* mbedtls_ecp_group_free(&grp);
|
||||||
|
* \endcode
|
||||||
|
*
|
||||||
* For Montgomery curves, we do not store \p A, but <code>(A + 2) / 4</code>,
|
* For Montgomery curves, we do not store \p A, but <code>(A + 2) / 4</code>,
|
||||||
* which is the quantity used in the formulas. Additionally, \p nbits is
|
* which is the quantity used in the formulas. Additionally, \p nbits is
|
||||||
* not the size of \p N but the required size for private keys.
|
* not the size of \p N but the required size for private keys.
|
||||||
|
@ -223,8 +244,11 @@ mbedtls_ecp_point;
|
||||||
typedef struct mbedtls_ecp_group {
|
typedef struct mbedtls_ecp_group {
|
||||||
mbedtls_ecp_group_id id; /*!< An internal group identifier. */
|
mbedtls_ecp_group_id id; /*!< An internal group identifier. */
|
||||||
mbedtls_mpi P; /*!< The prime modulus of the base field. */
|
mbedtls_mpi P; /*!< The prime modulus of the base field. */
|
||||||
mbedtls_mpi A; /*!< For Short Weierstrass: \p A in the equation. For
|
mbedtls_mpi A; /*!< For Short Weierstrass: \p A in the equation. Note that
|
||||||
Montgomery curves: <code>(A + 2) / 4</code>. */
|
\p A is not set to the authentic value in some cases.
|
||||||
|
Refer to detailed description of ::mbedtls_ecp_group if
|
||||||
|
using domain parameters in the structure.
|
||||||
|
For Montgomery curves: <code>(A + 2) / 4</code>. */
|
||||||
mbedtls_mpi B; /*!< For Short Weierstrass: \p B in the equation.
|
mbedtls_mpi B; /*!< For Short Weierstrass: \p B in the equation.
|
||||||
For Montgomery curves: unused. */
|
For Montgomery curves: unused. */
|
||||||
mbedtls_ecp_point G; /*!< The generator of the subgroup used. */
|
mbedtls_ecp_point G; /*!< The generator of the subgroup used. */
|
||||||
|
@ -991,6 +1015,26 @@ int mbedtls_ecp_mul_restartable(mbedtls_ecp_group *grp, mbedtls_ecp_point *R,
|
||||||
mbedtls_ecp_restart_ctx *rs_ctx);
|
mbedtls_ecp_restart_ctx *rs_ctx);
|
||||||
|
|
||||||
#if defined(MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED)
|
#if defined(MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED)
|
||||||
|
/**
|
||||||
|
* \brief This function checks if domain parameter A of the curve is
|
||||||
|
* \c -3.
|
||||||
|
*
|
||||||
|
* \note This function is only defined for short Weierstrass curves.
|
||||||
|
* It may not be included in builds without any short
|
||||||
|
* Weierstrass curve.
|
||||||
|
*
|
||||||
|
* \param grp The ECP group to use.
|
||||||
|
* This must be initialized and have group parameters
|
||||||
|
* set, for example through mbedtls_ecp_group_load().
|
||||||
|
*
|
||||||
|
* \return \c 1 if <code>A = -3</code>.
|
||||||
|
* \return \c 0 Otherwise.
|
||||||
|
*/
|
||||||
|
static inline int mbedtls_ecp_group_a_is_minus_3(const mbedtls_ecp_group *grp)
|
||||||
|
{
|
||||||
|
return grp->A.MBEDTLS_PRIVATE(p) == NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief This function performs multiplication and addition of two
|
* \brief This function performs multiplication and addition of two
|
||||||
* points by integers: \p R = \p m * \p P + \p n * \p Q
|
* points by integers: \p R = \p m * \p P + \p n * \p Q
|
||||||
|
|
|
@ -1255,7 +1255,7 @@ static int ecp_sw_rhs(const mbedtls_ecp_group *grp,
|
||||||
MPI_ECP_SQR(rhs, X);
|
MPI_ECP_SQR(rhs, X);
|
||||||
|
|
||||||
/* Special case for A = -3 */
|
/* Special case for A = -3 */
|
||||||
if (grp->A.p == NULL) {
|
if (mbedtls_ecp_group_a_is_minus_3(grp)) {
|
||||||
MPI_ECP_SUB_INT(rhs, rhs, 3);
|
MPI_ECP_SUB_INT(rhs, rhs, 3);
|
||||||
} else {
|
} else {
|
||||||
MPI_ECP_ADD(rhs, rhs, &grp->A);
|
MPI_ECP_ADD(rhs, rhs, &grp->A);
|
||||||
|
@ -1526,7 +1526,7 @@ static int ecp_double_jac(const mbedtls_ecp_group *grp, mbedtls_ecp_point *R,
|
||||||
int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
|
int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
|
||||||
|
|
||||||
/* Special case for A = -3 */
|
/* Special case for A = -3 */
|
||||||
if (grp->A.p == NULL) {
|
if (mbedtls_ecp_group_a_is_minus_3(grp)) {
|
||||||
/* tmp[0] <- M = 3(X + Z^2)(X - Z^2) */
|
/* tmp[0] <- M = 3(X + Z^2)(X - Z^2) */
|
||||||
MPI_ECP_SQR(&tmp[1], &P->Z);
|
MPI_ECP_SQR(&tmp[1], &P->Z);
|
||||||
MPI_ECP_ADD(&tmp[2], &P->X, &tmp[1]);
|
MPI_ECP_ADD(&tmp[2], &P->X, &tmp[1]);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue