Add write_client_params
diff --git a/library/ecjpake.c b/library/ecjpake.c
index a12bac0..dffab22 100644
--- a/library/ecjpake.c
+++ b/library/ecjpake.c
@@ -686,6 +686,62 @@
     return( ret );
 }
 
+/*
+ * Generate and write ClientECJPAKEParams (7.4.2.6)
+ */
+int mbedtls_ecjpake_tls_write_client_params( mbedtls_ecjpake_context *ctx,
+                            unsigned char *buf, size_t len, size_t *olen,
+                            int (*f_rng)(void *, unsigned char *, size_t),
+                            void *p_rng )
+{
+    int ret;
+    mbedtls_ecp_point GA, Xc;
+    mbedtls_mpi xc;
+    unsigned char *p = buf;
+    const unsigned char *end = buf + len;
+    size_t ec_len;
+
+    if( end < p )
+        return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL );
+
+    mbedtls_ecp_point_init( &GA );
+    mbedtls_ecp_point_init( &Xc );
+    mbedtls_mpi_init( &xc );
+
+    /*
+     * First generate private/public key pair (7.4.2.6.1)
+     *
+     * GA = X1 + X3 + X4
+     * xc = x2 * s mod n
+     * Xc = xc * GA
+     */
+    MBEDTLS_MPI_CHK( ecjpake_ecp_add3( &ctx->grp, &GA,
+                                       &ctx->X1, &ctx->X3, &ctx->X4 ) );
+    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &xc, &ctx->xb, &ctx->s ) );
+    MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &xc, &xc, &ctx->grp.N ) );
+    MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &ctx->grp, &Xc, &xc, &GA, f_rng, p_rng ) );
+
+    /*
+     * Now write things out
+     */
+    MBEDTLS_MPI_CHK( mbedtls_ecp_tls_write_point( &ctx->grp, &Xc,
+                     MBEDTLS_ECP_PF_UNCOMPRESSED, &ec_len, p, end - p ) );
+    p += ec_len;
+
+    MBEDTLS_MPI_CHK( ecjpake_zkp_write( ctx->md_info, &ctx->grp,
+                                        &GA, &xc, &Xc, "client",
+                                        &p, end, f_rng, p_rng ) );
+
+    *olen = p - buf;
+
+cleanup:
+    mbedtls_ecp_point_free( &GA );
+    mbedtls_ecp_point_free( &Xc );
+    mbedtls_mpi_free( &xc );
+
+    return( ret );
+}
+
 #if defined(MBEDTLS_SELF_TEST)
 
 #if defined(MBEDTLS_PLATFORM_C)
@@ -907,6 +963,11 @@
 
     TEST_ASSERT( mbedtls_ecjpake_tls_read_server_params( &cli, buf, len ) == 0 );
 
+    TEST_ASSERT( mbedtls_ecjpake_tls_write_client_params( &cli,
+                 buf, sizeof( buf ), &len, ecjpake_lgc, NULL ) == 0 );
+
+    TEST_ASSERT( mbedtls_ecjpake_tls_read_client_params( &srv, buf, len ) == 0 );
+
     if( verbose != 0 )
         mbedtls_printf( "passed\n" );