Add brainpool curves to ecp_use_kown_dp()
diff --git a/library/ecp.c b/library/ecp.c
index ee7d450..9f60971 100644
--- a/library/ecp.c
+++ b/library/ecp.c
@@ -172,6 +172,7 @@
return;
mpi_free( &grp->P );
+ mpi_free( &grp->A );
mpi_free( &grp->B );
ecp_point_free( &grp->G );
mpi_free( &grp->N );
@@ -262,15 +263,16 @@
}
/*
- * Import an ECP group from ASCII strings
+ * Import an ECP group from ASCII strings, general case (A used)
*/
-int ecp_group_read_string( ecp_group *grp, int radix,
- const char *p, const char *b,
+static int ecp_group_read_string_gen( ecp_group *grp, int radix,
+ const char *p, const char *a, const char *b,
const char *gx, const char *gy, const char *n)
{
int ret;
MPI_CHK( mpi_read_string( &grp->P, radix, p ) );
+ MPI_CHK( mpi_read_string( &grp->A, radix, a ) );
MPI_CHK( mpi_read_string( &grp->B, radix, b ) );
MPI_CHK( ecp_point_read_string( &grp->G, radix, gx, gy ) );
MPI_CHK( mpi_read_string( &grp->N, radix, n ) );
@@ -279,6 +281,23 @@
grp->nbits = mpi_msb( &grp->N );
cleanup:
+ if( ret != 0 )
+ ecp_group_free( grp );
+
+ return( ret );
+}
+
+/*
+ * Import an ECP group from ASCII strings, case A == -3 (A cleared)
+ */
+int ecp_group_read_string( ecp_group *grp, int radix,
+ const char *p, const char *b,
+ const char *gx, const char *gy, const char *n)
+{
+ int ret = ecp_group_read_string_gen( grp, radix, p, "00", b, gx, gy, n );
+
+ mpi_free( &grp->A );
+
return( ret );
}
@@ -761,8 +780,29 @@
SECP521R1_GX, SECP521R1_GY, SECP521R1_N ) );
#endif /* POLARSSL_ECP_DP_SECP521R1_ENABLED */
+#if defined(POLARSSL_ECP_DP_BP256R1_ENABLED)
+ case POLARSSL_ECP_DP_BP256R1:
+ return( ecp_group_read_string_gen( grp, 16,
+ BP256R1_P, BP256R1_A, BP256R1_B,
+ BP256R1_GX, BP256R1_GY, BP256R1_N ) );
+#endif /* POLARSSL_ECP_DP_BP256R1_ENABLED */
+
+#if defined(POLARSSL_ECP_DP_BP384R1_ENABLED)
+ case POLARSSL_ECP_DP_BP384R1:
+ return( ecp_group_read_string_gen( grp, 16,
+ BP384R1_P, BP384R1_A, BP384R1_B,
+ BP384R1_GX, BP384R1_GY, BP384R1_N ) );
+#endif /* POLARSSL_ECP_DP_BP384R1_ENABLED */
+
+#if defined(POLARSSL_ECP_DP_BP512R1_ENABLED)
+ case POLARSSL_ECP_DP_BP512R1:
+ return( ecp_group_read_string_gen( grp, 16,
+ BP512R1_P, BP512R1_A, BP512R1_B,
+ BP512R1_GX, BP512R1_GY, BP512R1_N ) );
+#endif /* POLARSSL_ECP_DP_BP512R1_ENABLED */
+
default:
- grp->id = POLARSSL_ECP_DP_NONE;
+ ecp_group_free( grp );
return( POLARSSL_ERR_ECP_FEATURE_UNAVAILABLE );
}
}
@@ -1016,7 +1056,7 @@
/*
- * Point doubling R = 2 P, Jacobian coordinates (GECC 3.21)
+ * Point doubling R = 2 P, Jacobian coordinates with a == -3 (GECC 3.21)
*/
static int ecp_double_jac( const ecp_group *grp, ecp_point *R,
const ecp_point *P )
@@ -1024,6 +1064,10 @@
int ret;
mpi T1, T2, T3, X, Y, Z;
+ /* We can't handle A != -3 yet */
+ if( grp->A.p != NULL )
+ return( POLARSSL_ERR_ECP_FEATURE_UNAVAILABLE );
+
#if defined(POLARSSL_SELF_TEST)
dbl_count++;
#endif