Add context-using functions for Hello extensions

Also re-order functions in the header so that they appear in the order they're
use, ie free() last.
diff --git a/library/ecjpake.c b/library/ecjpake.c
index 678112c..922be20 100644
--- a/library/ecjpake.c
+++ b/library/ecjpake.c
@@ -437,6 +437,56 @@
     return( ret );
 }
 
+/*
+ * Read the contents of the ClientHello extension
+ */
+int mbedtls_ecjpake_tls_read_client_ext( mbedtls_ecjpake_context *ctx,
+                                         const unsigned char *buf,
+                                         size_t len )
+{
+    return( ecjpake_kkpp_read( ctx->md_info, &ctx->grp, &ctx->grp.G,
+                               &ctx->X1, &ctx->X2, "client",
+                               buf, len ) );
+}
+
+/*
+ * Read the contents of the ServerHello extension
+ */
+int mbedtls_ecjpake_tls_read_server_ext( mbedtls_ecjpake_context *ctx,
+                                         const unsigned char *buf,
+                                         size_t len )
+{
+    return( ecjpake_kkpp_read( ctx->md_info, &ctx->grp, &ctx->grp.G,
+                               &ctx->X3, &ctx->X4, "server",
+                               buf, len ) );
+}
+
+/*
+ * Generate the contents of the ClientHello extension
+ */
+int mbedtls_ecjpake_tls_write_client_ext( mbedtls_ecjpake_context *ctx,
+                            unsigned char *buf, size_t len, size_t *olen,
+                            int (*f_rng)(void *, unsigned char *, size_t),
+                            void *p_rng )
+{
+    return( ecjpake_kkpp_write( ctx->md_info, &ctx->grp, &ctx->grp.G,
+                                &ctx->xa, &ctx->X1, &ctx->xb, &ctx->X2,
+                                "client", buf, len, olen, f_rng, p_rng ) );
+}
+
+/*
+ * Generate the contents of the ServerHello extension
+ */
+int mbedtls_ecjpake_tls_write_server_ext( mbedtls_ecjpake_context *ctx,
+                            unsigned char *buf, size_t len, size_t *olen,
+                            int (*f_rng)(void *, unsigned char *, size_t),
+                            void *p_rng )
+{
+    return( ecjpake_kkpp_write( ctx->md_info, &ctx->grp, &ctx->grp.G,
+                                &ctx->xa, &ctx->X3, &ctx->xb, &ctx->X4,
+                                "server", buf, len, olen, f_rng, p_rng ) );
+}
+
 #if defined(MBEDTLS_SELF_TEST)
 
 #if defined(MBEDTLS_PLATFORM_C)
@@ -522,36 +572,27 @@
 int mbedtls_ecjpake_self_test( int verbose )
 {
     int ret;
-    mbedtls_ecp_group grp;
-    mbedtls_ecp_point Xa, Xb;
-    mbedtls_mpi xa, xb;
-    const mbedtls_md_info_t *md_info;
+    mbedtls_ecjpake_context ctx;
     unsigned char buf[1000];
     size_t len;
 
-    mbedtls_ecp_group_init( &grp );
-    mbedtls_ecp_point_init( &Xa );
-    mbedtls_ecp_point_init( &Xb );
-    mbedtls_mpi_init( &xa );
-    mbedtls_mpi_init( &xb );
+    mbedtls_ecjpake_init( &ctx );
 
     /* Common to all tests */
-    md_info = mbedtls_md_info_from_type( MBEDTLS_MD_SHA256 );
-    MBEDTLS_MPI_CHK( mbedtls_ecp_group_load( &grp, MBEDTLS_ECP_DP_SECP256R1 ) );
+    TEST_ASSERT( mbedtls_ecjpake_setup( &ctx, MBEDTLS_MD_SHA256,
+                                        MBEDTLS_ECP_DP_SECP256R1 ) == 0 );
 
     if( verbose != 0 )
-        mbedtls_printf( "  ECJPAKE test #1 (kkpp read): " );
+        mbedtls_printf( "  ECJPAKE test #1 (client ext read): " );
 
-    TEST_ASSERT( ecjpake_kkpp_read( md_info, &grp, &grp.G,
-                                    &Xa, &Xb, "client",
+    TEST_ASSERT( mbedtls_ecjpake_tls_read_client_ext( &ctx,
                                     ecjpake_test_kkpp,
                             sizeof( ecjpake_test_kkpp ) ) == 0 );
 
     /* Corrupt message */
     memcpy( buf, ecjpake_test_kkpp, sizeof( ecjpake_test_kkpp ) );
     buf[sizeof( ecjpake_test_kkpp ) - 1]--;
-    TEST_ASSERT( ecjpake_kkpp_read( md_info, &grp, &grp.G,
-                                    &Xa, &Xb, "client",
+    TEST_ASSERT( mbedtls_ecjpake_tls_read_client_ext( &ctx,
                                     buf, sizeof( ecjpake_test_kkpp ) )
                     == MBEDTLS_ERR_ECP_VERIFY_FAILED );
 
@@ -559,26 +600,19 @@
         mbedtls_printf( "passed\n" );
 
     if( verbose != 0 )
-        mbedtls_printf( "  ECJPAKE test #2 (kkpp write/read): " );
+        mbedtls_printf( "  ECJPAKE test #2 (client ext write/read): " );
 
-    TEST_ASSERT( ecjpake_kkpp_write( md_info, &grp, &grp.G,
-                                     &xa, &Xa, &xb, &Xb, "client",
+    TEST_ASSERT( mbedtls_ecjpake_tls_write_client_ext( &ctx,
                                      buf, sizeof( buf ), &len,
                                      ecjpake_lgc, NULL ) == 0 );
 
-    TEST_ASSERT( ecjpake_kkpp_read( md_info, &grp, &grp.G,
-                                    &Xa, &Xb, "client",
-                                    buf, len ) == 0 );
+    TEST_ASSERT( mbedtls_ecjpake_tls_read_client_ext( &ctx, buf, len ) == 0 );
 
     if( verbose != 0 )
         mbedtls_printf( "passed\n" );
 
 cleanup:
-    mbedtls_ecp_group_free( &grp );
-    mbedtls_ecp_point_free( &Xa );
-    mbedtls_ecp_point_free( &Xb );
-    mbedtls_mpi_free( &xa );
-    mbedtls_mpi_free( &xb );
+    mbedtls_ecjpake_free( &ctx );
 
     if( ret != 0 )
     {