Add function parsing a TLS ECParameters record
diff --git a/library/ecp.c b/library/ecp.c
index b8b0dfc..0a27df2 100644
--- a/library/ecp.c
+++ b/library/ecp.c
@@ -29,6 +29,7 @@
* SEC1 http://www.secg.org/index.php?action=secg,docs_secg
* GECC = Guide to Elliptic Curve Cryptography - Hankerson, Menezes, Vanstone
* FIPS 186-3 http://csrc.nist.gov/publications/fips/fips186-3/fips_186-3.pdf
+ * RFC 4492 for the related TLS structures and constants
*/
#include "polarssl/config.h"
@@ -493,7 +494,7 @@
/*
* Set a group using well-known domain parameters
*/
-int ecp_use_known_dp( ecp_group *grp, size_t index )
+int ecp_use_known_dp( ecp_group *grp, uint16_t index )
{
switch( index )
{
@@ -525,7 +526,33 @@
SECP521R1_GX, SECP521R1_GY, SECP521R1_N ) );
}
- return( POLARSSL_ERR_ECP_GENERIC );
+ return( POLARSSL_ERR_ECP_BAD_INPUT_DATA );
+}
+
+/*
+ * Set a group from an ECParameters record (RFC 4492)
+ */
+int ecp_tls_read_group( ecp_group *grp, const unsigned char *buf, size_t len )
+{
+ uint16_t namedcurve;
+
+ /*
+ * We expect at least three bytes (see below)
+ */
+ if( len < 3 )
+ return( POLARSSL_ERR_ECP_BAD_INPUT_DATA );
+
+ /*
+ * First byte is curve_type; only named_curve is handled
+ */
+ if( *buf++ != POLARSSL_ECP_TLS_NAMED_CURVE )
+ return( POLARSSL_ERR_ECP_BAD_INPUT_DATA );
+
+ /*
+ * Next two bytes are the namedcurve
+ */
+ namedcurve = 256 * buf[0] + buf[1];
+ return ecp_use_known_dp( grp, namedcurve );
}
/*