diff --git a/include/mbedtls/ecp.h b/include/mbedtls/ecp.h index 43d001ce2..badfe86cf 100644 --- a/include/mbedtls/ecp.h +++ b/include/mbedtls/ecp.h @@ -515,13 +515,14 @@ int mbedtls_ecp_tls_write_group( const mbedtls_ecp_group *grp, size_t *olen, * \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 @@ int mbedtls_ecp_ansi_write_group( const mbedtls_ecp_group *grp, * \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_group( const mbedtls_ecp_group *grp, 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 851d230d8..58bffe4f9 100644 --- a/library/ecp.c +++ b/library/ecp.c @@ -2066,12 +2066,13 @@ cleanup: #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 @@ int mbedtls_ecp_ansi_write_group( const mbedtls_ecp_group *grp, 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 4b8109023..a3cde43c6 100644 --- a/tests/suites/test_suite_ecp.function +++ b/tests/suites/test_suite_ecp.function @@ -420,17 +420,20 @@ void ecp_ansi_write_group( int id, char *hex ) 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 @@ void ecp_ansi_write_point( char *key_file, int format, char *good_hex ) 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: