Add olen parameter to ecp_ansi_write_group and ecp_ansi_write_point
Improve mbedtls_ecp_ansi_write_point
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) */