mirror of
https://github.com/yuzu-emu/mbedtls.git
synced 2025-05-30 01:27:15 +00:00
Add olen parameter to ecp_ansi_write_group and ecp_ansi_write_point
Improve mbedtls_ecp_ansi_write_point
This commit is contained in:
parent
a2c406286a
commit
dc3111e6d9
|
@ -515,13 +515,14 @@ int mbedtls_ecp_tls_write_group( const mbedtls_ecp_group *grp, size_t *olen,
|
||||||
* \param grp ECP group used
|
* \param grp ECP group used
|
||||||
* \param buf Buffer to write to
|
* \param buf Buffer to write to
|
||||||
* \param size Buffer size
|
* \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_BUFFER_TOO_SMALL
|
||||||
* or \c MBEDTLS_ERR_OID_NOT_FOUND
|
* or \c MBEDTLS_ERR_OID_NOT_FOUND
|
||||||
*/
|
*/
|
||||||
int mbedtls_ecp_ansi_write_group( const mbedtls_ecp_group *grp,
|
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
|
* \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 format Point format, should be a MBEDTLS_ECP_PF_XXX macro
|
||||||
* \param p Buffer to write to
|
* \param p Buffer to write to
|
||||||
* \param size Buffer size
|
* \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_BUFFER_TOO_SMALL
|
||||||
* or \c MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
* or \c MBEDTLS_ERR_ECP_BAD_INPUT_DATA
|
||||||
* or \c MBEDTLS_ERR_ASN1_BUF_TOO_SMALL
|
* 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 mbedtls_ecp_ansi_write_point( const mbedtls_ecp_keypair *ec,
|
||||||
int format,
|
int format,
|
||||||
unsigned char *p,
|
unsigned char *p,
|
||||||
size_t size );
|
size_t size, size_t *olen );
|
||||||
#endif /* defined(MBEDTLS_ASN1_WRITE_C) && defined(MBEDTLS_OID_C) */
|
#endif /* defined(MBEDTLS_ASN1_WRITE_C) && defined(MBEDTLS_OID_C) */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -2066,12 +2066,13 @@ cleanup:
|
||||||
#include "mbedtls/oid.h"
|
#include "mbedtls/oid.h"
|
||||||
int mbedtls_ecp_ansi_write_group( const mbedtls_ecp_group *grp,
|
int mbedtls_ecp_ansi_write_group( const mbedtls_ecp_group *grp,
|
||||||
unsigned char *p,
|
unsigned char *p,
|
||||||
size_t size )
|
size_t size, size_t *olen )
|
||||||
{
|
{
|
||||||
const char *oid;
|
const char *oid;
|
||||||
unsigned char *q;
|
unsigned char *q;
|
||||||
size_t oid_length;
|
size_t oid_length;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = mbedtls_oid_get_oid_by_ec_grp( grp->id, &oid, &oid_length );
|
ret = mbedtls_oid_get_oid_by_ec_grp( grp->id, &oid, &oid_length );
|
||||||
if( ret != 0 )
|
if( ret != 0 )
|
||||||
return( ret );
|
return( ret );
|
||||||
|
@ -2079,36 +2080,38 @@ int mbedtls_ecp_ansi_write_group( const mbedtls_ecp_group *grp,
|
||||||
if( size < 2 + oid_length )
|
if( size < 2 + oid_length )
|
||||||
return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL );
|
return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL );
|
||||||
q = p + 2 + oid_length;
|
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 mbedtls_ecp_ansi_write_point( const mbedtls_ecp_keypair *ec,
|
||||||
int format,
|
int format,
|
||||||
unsigned char *p,
|
unsigned char *p,
|
||||||
size_t size )
|
size_t size, size_t *olen )
|
||||||
{
|
{
|
||||||
unsigned char *q;
|
unsigned char *q;
|
||||||
size_t length;
|
size_t tl_max_size = 3; /* room for the OCTET_STRING tag and length */
|
||||||
size_t tl_size = 3; /* room for the OCTET_STRING tag and length */
|
|
||||||
int ret;
|
int ret;
|
||||||
if( size < tl_size )
|
|
||||||
|
if( size < tl_max_size )
|
||||||
return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL );
|
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,
|
ret = mbedtls_ecp_point_write_binary( &ec->grp, &ec->Q,
|
||||||
format,
|
format,
|
||||||
&length, q, size - 3 );
|
olen, q, size - tl_max_size );
|
||||||
if( ret < 0 )
|
if( ret < 0 )
|
||||||
return( ret );
|
return( ret );
|
||||||
ret = mbedtls_asn1_write_len( &q, p, length );
|
ret = mbedtls_asn1_write_len( &q, p, *olen );
|
||||||
if( ret < 0 )
|
if( ret < 0 )
|
||||||
return( ret );
|
return( ret );
|
||||||
ret = mbedtls_asn1_write_tag( &q, p, MBEDTLS_ASN1_OCTET_STRING );
|
ret = mbedtls_asn1_write_tag( &q, p, MBEDTLS_ASN1_OCTET_STRING );
|
||||||
if( ret < 0 )
|
if( ret < 0 )
|
||||||
return( ret );
|
return( ret );
|
||||||
length += tl_size - ( q - p );
|
*olen += tl_max_size - ( q - p );
|
||||||
if( q != p )
|
if( q != p )
|
||||||
memmove( p, q, length );
|
memmove( p, q, *olen );
|
||||||
return( length );
|
return( 0 );
|
||||||
}
|
}
|
||||||
#endif /* defined(MBEDTLS_ASN1_WRITE_C) && defined(MBEDTLS_OID_C) */
|
#endif /* defined(MBEDTLS_ASN1_WRITE_C) && defined(MBEDTLS_OID_C) */
|
||||||
|
|
||||||
|
|
|
@ -420,17 +420,20 @@ void ecp_ansi_write_group( int id, char *hex )
|
||||||
unsigned char good[MBEDTLS_OID_EC_GRP_MAX_SIZE];
|
unsigned char good[MBEDTLS_OID_EC_GRP_MAX_SIZE];
|
||||||
unsigned char tested[MBEDTLS_OID_EC_GRP_MAX_SIZE];
|
unsigned char tested[MBEDTLS_OID_EC_GRP_MAX_SIZE];
|
||||||
size_t good_len = unhexify( good, hex );
|
size_t good_len = unhexify( good, hex );
|
||||||
|
size_t received_len = 0;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
mbedtls_ecp_group_init( &grp );
|
mbedtls_ecp_group_init( &grp );
|
||||||
TEST_ASSERT( mbedtls_ecp_group_load( &grp, id ) == 0 );
|
TEST_ASSERT( mbedtls_ecp_group_load( &grp, id ) == 0 );
|
||||||
|
|
||||||
/* Positive test */
|
/* Positive test */
|
||||||
ret = mbedtls_ecp_ansi_write_group( &grp, tested, sizeof( tested ) );
|
ret = mbedtls_ecp_ansi_write_group( &grp, tested, sizeof( tested ),
|
||||||
TEST_ASSERT( ret >= 0 && good_len == (unsigned) ret );
|
&received_len );
|
||||||
|
TEST_ASSERT( ret == 0 && good_len == (unsigned) received_len );
|
||||||
TEST_ASSERT( memcmp( good, tested, good_len ) == 0 );
|
TEST_ASSERT( memcmp( good, tested, good_len ) == 0 );
|
||||||
|
|
||||||
/* Buffer too small */
|
/* 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 );
|
MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL );
|
||||||
|
|
||||||
exit:
|
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 good_buf[1000];
|
||||||
unsigned char tested_buf[1000];
|
unsigned char tested_buf[1000];
|
||||||
size_t good_len = unhexify( good_buf, good_hex );
|
size_t good_len = unhexify( good_buf, good_hex );
|
||||||
|
size_t received_len = 0;
|
||||||
mbedtls_pk_context pk;
|
mbedtls_pk_context pk;
|
||||||
int ret = 0;
|
int ret = -1;
|
||||||
mbedtls_pk_init( &pk );
|
mbedtls_pk_init( &pk );
|
||||||
TEST_ASSERT( mbedtls_pk_parse_public_keyfile( &pk, key_file ) == 0 );
|
TEST_ASSERT( mbedtls_pk_parse_public_keyfile( &pk, key_file ) == 0 );
|
||||||
|
|
||||||
/* Positive test */
|
/* Positive test */
|
||||||
ret = mbedtls_ecp_ansi_write_point( mbedtls_pk_ec( pk ), format,
|
ret = mbedtls_ecp_ansi_write_point( mbedtls_pk_ec( pk ), format,
|
||||||
tested_buf, sizeof( tested_buf ) );
|
tested_buf, sizeof( tested_buf ),
|
||||||
TEST_ASSERT( ret >= 0 && good_len == (unsigned) ret );
|
&received_len );
|
||||||
|
TEST_ASSERT( ret == 0 && good_len == (unsigned) received_len );
|
||||||
TEST_ASSERT( memcmp( good_buf, tested_buf, good_len ) == 0 );
|
TEST_ASSERT( memcmp( good_buf, tested_buf, good_len ) == 0 );
|
||||||
|
|
||||||
/* Buffer too small */
|
/* Buffer too small */
|
||||||
TEST_ASSERT( mbedtls_ecp_ansi_write_point( mbedtls_pk_ec( pk ), format,
|
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 );
|
MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL );
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
|
|
Loading…
Reference in a new issue