Add ecdsa_from_keypair()

Also fix bug/limitation in mpi_copy: would segfault if src just initialised
and not set to a value yet. (This case occurs when copying a context which
contains only the public part of the key, eg.)
This commit is contained in:
Manuel Pégourié-Gonnard 2013-08-12 17:02:59 +02:00
parent cc0a9d040d
commit f499993cb2
3 changed files with 30 additions and 0 deletions

View file

@ -142,6 +142,16 @@ int ecdsa_read_signature( ecdsa_context *ctx,
int ecdsa_genkey( ecdsa_context *ctx, ecp_group_id gid, int ecdsa_genkey( ecdsa_context *ctx, ecp_group_id gid,
int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );
/**
* \brief Set an ECDSA context from an EC key pair
*
* \param ctx ECDSA context to set
* \param key EC key to use
*
* \return 0 on success, or a POLARSSL_ERR_ECP code.
*/
int ecdsa_from_keypair( ecdsa_context *ctx, const ecp_keypair *key );
/** /**
* \brief Initialize context * \brief Initialize context
* *

View file

@ -130,6 +130,12 @@ int mpi_copy( mpi *X, const mpi *Y )
if( X == Y ) if( X == Y )
return( 0 ); return( 0 );
if( Y->p == NULL )
{
mpi_free( X );
return( 0 );
}
for( i = Y->n - 1; i > 0; i-- ) for( i = Y->n - 1; i > 0; i-- )
if( Y->p[i] != 0 ) if( Y->p[i] != 0 )
break; break;

View file

@ -283,6 +283,20 @@ int ecdsa_genkey( ecdsa_context *ctx, ecp_group_id gid,
ecp_gen_keypair( &ctx->grp, &ctx->d, &ctx->Q, f_rng, p_rng ) ); ecp_gen_keypair( &ctx->grp, &ctx->d, &ctx->Q, f_rng, p_rng ) );
} }
/*
* Set context from an ecp_keypair
*/
int ecdsa_from_keypair( ecdsa_context *ctx, const ecp_keypair *key )
{
int ret = ecp_group_copy( &ctx->grp, &key->grp ) ||
mpi_copy( &ctx->d, &key->d ) ||
ecp_copy( &ctx->Q, &key->Q );
if( ret != 0 )
ecdsa_free( ctx );
return( ret );
}
/* /*
* Initialize context * Initialize context