uint8_t *data_p;
uint8_t *data_g;
uint8_t *data_Y;
- int i, bits, ret;
+ int i, bits, ret, p_bits;
ssize_t data_size = _data_size;
gnutls_pk_params_init(&session->key.dh_params);
return bits;
}
- if (_gnutls_mpi_get_nbits(session->key.dh_params.params[DH_P]) < (size_t) bits) {
+ p_bits = _gnutls_mpi_get_nbits(session->key.dh_params.params[DH_P]);
+ if (p_bits < bits) {
/* the prime used by the peer is not acceptable
*/
gnutls_assert();
return GNUTLS_E_DH_PRIME_UNACCEPTABLE;
}
+ if (p_bits >= DEFAULT_MAX_VERIFY_BITS) {
+ gnutls_assert();
+ _gnutls_debug_log
+ ("Received a prime of %u bits, limit is %u\n",
+ (unsigned) p_bits,
+ (unsigned) DEFAULT_MAX_VERIFY_BITS);
+ return GNUTLS_E_DH_PRIME_UNACCEPTABLE;
+ }
+
_gnutls_dh_set_group(session, session->key.dh_params.params[DH_G],
session->key.dh_params.params[DH_P]);
_gnutls_dh_set_peer_public(session, session->key.client_Y);