/* * Find the group id associated with an (almost filled) group as generated by * pk_group_from_specified(), or return an error if unknown. */ static int pk_group_id_from_group( const ecp_group *grp, ecp_group_id *grp_id ) { int ret = 0; ecp_group ref; const ecp_group_id *id; ecp_group_init( &ref ); for( id = ecp_grp_id_list(); *id != POLARSSL_ECP_DP_NONE; id++ ) { /* Load the group associated to that id */ ecp_group_free( &ref ); MPI_CHK( ecp_use_known_dp( &ref, *id ) ); /* Compare to the group we were given, starting with easy tests */ if( grp->pbits == ref.pbits && grp->nbits == ref.nbits && shmpi_cmp_shmpi( &grp->P, &ref.P ) == 0 && shmpi_cmp_shmpi( &grp->A, &ref.A ) == 0 && shmpi_cmp_shmpi( &grp->B, &ref.B ) == 0 && shmpi_cmp_shmpi( &grp->N, &ref.N ) == 0 && shmpi_cmp_shmpi( &grp->G.X, &ref.G.X ) == 0 && shmpi_cmp_shmpi( &grp->G.Z, &ref.G.Z ) == 0 && /* For Y we may only know the parity bit, so compare only that */ shmpi_get_bit( &grp->G.Y, 0 ) == shmpi_get_bit( &ref.G.Y, 0 ) ) { break; } } cleanup: ecp_group_free( &ref ); *grp_id = *id; if( ret == 0 && *id == POLARSSL_ECP_DP_NONE ) ret = POLARSSL_ERR_ECP_FEATURE_UNAVAILABLE; return( ret ); }
/* * Free context */ void ecdh_free( ecdh_context *ctx ) { if( ctx == NULL ) return; ecp_group_free( &ctx->grp ); ecp_point_free( &ctx->Q ); ecp_point_free( &ctx->Qp ); ecp_point_free( &ctx->Vi ); ecp_point_free( &ctx->Vf ); mpi_free( &ctx->d ); mpi_free( &ctx->z ); mpi_free( &ctx->_d ); }
/* * Parse a SpecifiedECDomain (SEC 1 C.2) and find the associated group ID */ static int pk_group_id_from_specified( const asn1_buf *params, ecp_group_id *grp_id ) { int ret; ecp_group grp; ecp_group_init( &grp ); if( ( ret = pk_group_from_specified( params, &grp ) ) != 0 ) goto cleanup; ret = pk_group_id_from_group( &grp, grp_id ); cleanup: ecp_group_free( &grp ); return( ret ); }