Add olen parameter to ecp_ansi_write_group and ecp_ansi_write_point

Improve mbedtls_ecp_ansi_write_point
diff --git a/include/mbedtls/ecp.h b/include/mbedtls/ecp.h
index 43d001c..badfe86 100644
--- a/include/mbedtls/ecp.h
+++ b/include/mbedtls/ecp.h
@@ -515,13 +515,14 @@
  * \param grp       ECP group used
  * \param buf       Buffer to write to
  * \param size      Buffer size
- *
- * \return          Number of bytes written to \c buf,
+ * \param olen      Number of bytes written to \c buf
+ * \return          0 on success
  *                  or \c MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL
  *                  or \c MBEDTLS_ERR_OID_NOT_FOUND
  */
 int mbedtls_ecp_ansi_write_group( const mbedtls_ecp_group *grp,
-                                  unsigned char *p, size_t size );
+                                  unsigned char *p, size_t size,
+                                  size_t *olen );
 
 /**
  * \brief           Export a point in ANSI X9.62/RFC5480 ECPoint
@@ -533,8 +534,9 @@
  * \param format    Point format, should be a MBEDTLS_ECP_PF_XXX macro
  * \param p         Buffer to write to
  * \param size      Buffer size
+ * \param olen      Number of bytes written to \c buf
  *
- * \return          Number of bytes written to \c buf,
+ * \return          0 on success
  *                  or \c MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL
  *                  or \c MBEDTLS_ERR_ECP_BAD_INPUT_DATA
  *                  or \c MBEDTLS_ERR_ASN1_BUF_TOO_SMALL
@@ -542,7 +544,7 @@
 int mbedtls_ecp_ansi_write_point( const mbedtls_ecp_keypair *ec,
                                   int format,
                                   unsigned char *p,
-                                  size_t size );
+                                  size_t size, size_t *olen );
 #endif /* defined(MBEDTLS_ASN1_WRITE_C) && defined(MBEDTLS_OID_C) */
 
 /**
diff --git a/library/ecp.c b/library/ecp.c
index 851d230..58bffe4 100644
--- a/library/ecp.c
+++ b/library/ecp.c
@@ -2066,12 +2066,13 @@
 #include "mbedtls/oid.h"
 int mbedtls_ecp_ansi_write_group( const mbedtls_ecp_group *grp,
                                   unsigned char *p,
-                                  size_t size )
+                                  size_t size, size_t *olen )
 {
     const char *oid;
     unsigned char *q;
     size_t oid_length;
     int ret;
+
     ret = mbedtls_oid_get_oid_by_ec_grp( grp->id, &oid, &oid_length );
     if( ret != 0 )
         return( ret );
@@ -2079,36 +2080,38 @@
     if( size < 2 + oid_length )
         return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL );
     q = p + 2 + oid_length;
-    return( mbedtls_asn1_write_oid( &q, p, oid, oid_length ) );
+    *olen = mbedtls_asn1_write_oid( &q, p, oid, oid_length );
+    return ( 0 );
 }
 
 int mbedtls_ecp_ansi_write_point( const mbedtls_ecp_keypair *ec,
                                   int format,
                                   unsigned char *p,
-                                  size_t size )
+                                  size_t size, size_t *olen )
 {
     unsigned char *q;
-    size_t length;
-    size_t tl_size = 3; /* room for the OCTET_STRING tag and length */
+    size_t tl_max_size = 3; /* room for the OCTET_STRING tag and length */
     int ret;
-    if( size < tl_size )
+
+    if( size < tl_max_size )
         return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL );
-    q = p + tl_size;
+
+    q = p + tl_max_size;
     ret = mbedtls_ecp_point_write_binary( &ec->grp, &ec->Q,
                                           format,
-                                          &length, q, size - 3 );
+                                          olen, q, size - tl_max_size );
     if( ret < 0 )
         return( ret );
-    ret = mbedtls_asn1_write_len( &q, p, length );
+    ret = mbedtls_asn1_write_len( &q, p, *olen );
     if( ret < 0 )
         return( ret );
     ret = mbedtls_asn1_write_tag( &q, p, MBEDTLS_ASN1_OCTET_STRING );
     if( ret < 0 )
         return( ret );
-    length += tl_size - ( q - p );
+    *olen += tl_max_size - ( q - p );
     if( q != p )
-        memmove( p, q, length );
-    return( length );
+        memmove( p, q, *olen );
+    return( 0 );
 }
 #endif /* defined(MBEDTLS_ASN1_WRITE_C) && defined(MBEDTLS_OID_C) */
 
diff --git a/tests/suites/test_suite_ecp.function b/tests/suites/test_suite_ecp.function
index 4b81090..a3cde43 100644
--- a/tests/suites/test_suite_ecp.function
+++ b/tests/suites/test_suite_ecp.function
@@ -420,17 +420,20 @@
     unsigned char good[MBEDTLS_OID_EC_GRP_MAX_SIZE];
     unsigned char tested[MBEDTLS_OID_EC_GRP_MAX_SIZE];
     size_t good_len = unhexify( good, hex );
+    size_t received_len = 0;
     int ret = 0;
     mbedtls_ecp_group_init( &grp );
     TEST_ASSERT( mbedtls_ecp_group_load( &grp, id ) == 0 );
 
     /* Positive test */
-    ret = mbedtls_ecp_ansi_write_group( &grp, tested, sizeof( tested ) );
-    TEST_ASSERT( ret >= 0 && good_len == (unsigned) ret );
+    ret = mbedtls_ecp_ansi_write_group( &grp, tested, sizeof( tested ),
+										&received_len );
+    TEST_ASSERT( ret == 0 && good_len == (unsigned) received_len );
     TEST_ASSERT( memcmp( good, tested, good_len ) == 0 );
 
     /* Buffer too small */
-    TEST_ASSERT( mbedtls_ecp_ansi_write_group( &grp, tested, good_len - 1 ) ==
+    TEST_ASSERT( mbedtls_ecp_ansi_write_group( &grp, tested, good_len - 1,
+    										   &received_len ) ==
                  MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL );
 
 exit:
@@ -444,20 +447,23 @@
     unsigned char good_buf[1000];
     unsigned char tested_buf[1000];
     size_t good_len = unhexify( good_buf, good_hex );
+    size_t received_len = 0;
     mbedtls_pk_context pk;
-    int ret = 0;
+    int ret = -1;
     mbedtls_pk_init( &pk );
     TEST_ASSERT( mbedtls_pk_parse_public_keyfile( &pk, key_file ) == 0 );
 
     /* Positive test */
     ret = mbedtls_ecp_ansi_write_point( mbedtls_pk_ec( pk ), format,
-                                        tested_buf, sizeof( tested_buf ) );
-    TEST_ASSERT( ret >= 0 && good_len == (unsigned) ret );
+                                        tested_buf, sizeof( tested_buf ), 
+                                        &received_len );
+    TEST_ASSERT( ret == 0 && good_len == (unsigned) received_len );
     TEST_ASSERT( memcmp( good_buf, tested_buf, good_len ) == 0 );
 
     /* Buffer too small */
     TEST_ASSERT( mbedtls_ecp_ansi_write_point( mbedtls_pk_ec( pk ), format,
-                                               tested_buf, good_len - 1 ) ==
+                                               tested_buf, good_len - 1, 
+                                               &received_len ) ==
                  MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL );
 
 exit: