[Help-gnutls] Problem with anonymous authentication

Alexei Boyarchenko trener at hotbox.ru
Tue Jun 8 12:59:46 CEST 2004


> This shouldn't have happened. Could you trace where this happens?

Sorry for my bad English again!!!!

I think i've found a bug! (maybe i am right maybe not :) )
Version: gnutls-1.0.9


Look!

if after initialisation we have:

&anon_serv_cred = 0x0053a754  
and at that adress  we have 0x00935610 -- adress of anon_serv_cred
    
anon_serv_cred  = 0x00935610  
and at that adress  we have 0x00935420 -- adress of global_dh_params
                            0x00000000 -- NULL !!!!!!!!!!

global_dh_params       = 0x00935420
and at that adress  we have 0x00935420 -- not NULL! adress of 
global_dh_params->params[0]  
                            0x00952620 -- not NULL! adress of 
global_dh_params->params[1]


when we call function check_server_params in gnutls_handshake.c

.......
 else if ( cred_type == GNUTLS_CRD_ANON) {
		anon_cred =                               
		    _gnutls_get_cred(session->key, cred_type, NULL); //!!!!!
	
		if (anon_cred != NULL) {
			dh_params = anon_cred->dh_params; //!!
		}
	} else return 0; /* no need for params */


	/* If the key exchange method needs RSA or DH params,
	 * but they are not set then remove it.
	 */
	if (_gnutls_kx_needs_rsa_params( kx) != 0) {
		/* needs rsa params. */
		if (_gnutls_get_rsa_params( rsa_params)==NULL)
			return 1;
	}
	
	if (_gnutls_kx_needs_dh_params( kx) != 0) {
		/* needs DH params. */
		if (_gnutls_get_dh_params( dh_params)==NULL)
			return 1;
	}
.....
we get anon_cred = &anon_serv_cred = 0x0053a754 
and at that adress we have 0x00935610 adress of anon_serv_cred (but not 
global_dh_params!!!)
so when we do 	
		if (anon_cred != NULL) {
			dh_params = anon_cred->dh_params; //!!
		}
dh_params = 0x00935610  but this is adress of anon_serv_cred  and not adress
of global_dh_params !!!!

And we get dh_params = anon_serv_cred  = 0x00935610
at that adress we have   0x00935420 -- adress of global_dh_params
                         0x00000000 --  NULL !!!!!!!!!!

So we get _gnutls_get_dh_params( dh_params)==NULL   !!!!!!!!!



I changed this code in this way:

void** MyTmp;
.....
 else if ( cred_type == GNUTLS_CRD_ANON) {
		MyTmp =
		    _gnutls_get_cred(session->key, cred_type, NULL);
	
		if (MyTmp != NULL) {
			anon_cred =  *MyTmp;
			dh_params = anon_cred->dh_params;
		}
	} else return 0; /* no need for params */


	/* If the key exchange method needs RSA or DH params,
	 * but they are not set then remove it.
	 */
	if (_gnutls_kx_needs_rsa_params( kx) != 0) {
		/* needs rsa params. */
		if (_gnutls_get_rsa_params( rsa_params)==NULL)
			return 1;
	}
	
	if (_gnutls_kx_needs_dh_params( kx) != 0) {
		/* needs DH params. */
		if (_gnutls_get_dh_params( dh_params)==NULL)
			return 1;
	}
......

and it works fine!!!

Also i had to correct function gen_anon_server_kx in anon_auth.c :
....
	gnutls_dh_params dh_params;
	const gnutls_anon_server_credentials cred;
	void** MyTmp;
	
	MyTmp = _gnutls_get_cred(session->key, GNUTLS_CRD_ANON, NULL);
	if (MyTmp == NULL) {
		gnutls_assert();
		return GNUTLS_E_INSUFFICIENT_CREDENTIALS;
	}

	cred = *MyTmp;
	dh_params = _gnutls_anon_get_dh_params( cred, session);
....

And eventually I recieved completely   working server with anonymous 
authentication.






More information about the Gnutls-help mailing list