summaryrefslogtreecommitdiff
path: root/lib/gnutls_auth.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gnutls_auth.c')
-rw-r--r--lib/gnutls_auth.c359
1 files changed, 191 insertions, 168 deletions
diff --git a/lib/gnutls_auth.c b/lib/gnutls_auth.c
index a383ff1eaa..1819a6ab76 100644
--- a/lib/gnutls_auth.c
+++ b/lib/gnutls_auth.c
@@ -41,17 +41,18 @@
* Clears all the credentials previously set in this session.
*
**/
-void gnutls_credentials_clear( gnutls_session session) {
- if (session->key && session->key->cred) { /* beginning of the list */
- auth_cred_st * ccred, *ncred;
- ccred = session->key->cred;
- while(ccred!=NULL) {
- ncred = ccred->next;
- gnutls_free(ccred);
- ccred = ncred;
- }
- session->key->cred = NULL;
+void gnutls_credentials_clear(gnutls_session session)
+{
+ if (session->key && session->key->cred) { /* beginning of the list */
+ auth_cred_st *ccred, *ncred;
+ ccred = session->key->cred;
+ while (ccred != NULL) {
+ ncred = ccred->next;
+ gnutls_free(ccred);
+ ccred = ncred;
}
+ session->key->cred = NULL;
+ }
}
/*
@@ -83,51 +84,55 @@ void gnutls_credentials_clear( gnutls_session session) {
* For GNUTLS_CRD_CERTIFICATE cred should be gnutls_certificate_credentials.
*
**/
-int gnutls_credentials_set( gnutls_session session, gnutls_credentials_type type, void* cred) {
- auth_cred_st * ccred=NULL, *pcred=NULL;
- int exists=0;
-
- if (session->key->cred==NULL) { /* beginning of the list */
-
- session->key->cred = gnutls_malloc(sizeof(auth_cred_st));
- if (session->key->cred == NULL) return GNUTLS_E_MEMORY_ERROR;
-
- /* copy credentials locally */
- session->key->cred->credentials = cred;
-
- session->key->cred->next = NULL;
- session->key->cred->algorithm = type;
- } else {
- ccred = session->key->cred;
- while(ccred!=NULL) {
- if (ccred->algorithm==type) {
- exists=1;
- break;
- }
- pcred = ccred;
- ccred = ccred->next;
- }
- /* After this, pcred is not null.
- */
-
- if (exists==0) { /* new entry */
- pcred->next = gnutls_malloc(sizeof(auth_cred_st));
- if (pcred->next == NULL) return GNUTLS_E_MEMORY_ERROR;
-
- ccred = pcred->next;
-
- /* copy credentials locally */
- ccred->credentials = cred;
-
- ccred->next = NULL;
- ccred->algorithm = type;
- } else { /* modify existing entry */
- gnutls_free(ccred->credentials);
- ccred->credentials = cred;
- }
+int gnutls_credentials_set(gnutls_session session,
+ gnutls_credentials_type type, void *cred)
+{
+ auth_cred_st *ccred = NULL, *pcred = NULL;
+ int exists = 0;
+
+ if (session->key->cred == NULL) { /* beginning of the list */
+
+ session->key->cred = gnutls_malloc(sizeof(auth_cred_st));
+ if (session->key->cred == NULL)
+ return GNUTLS_E_MEMORY_ERROR;
+
+ /* copy credentials locally */
+ session->key->cred->credentials = cred;
+
+ session->key->cred->next = NULL;
+ session->key->cred->algorithm = type;
+ } else {
+ ccred = session->key->cred;
+ while (ccred != NULL) {
+ if (ccred->algorithm == type) {
+ exists = 1;
+ break;
+ }
+ pcred = ccred;
+ ccred = ccred->next;
}
+ /* After this, pcred is not null.
+ */
+
+ if (exists == 0) { /* new entry */
+ pcred->next = gnutls_malloc(sizeof(auth_cred_st));
+ if (pcred->next == NULL)
+ return GNUTLS_E_MEMORY_ERROR;
+
+ ccred = pcred->next;
+
+ /* copy credentials locally */
+ ccred->credentials = cred;
- return 0;
+ ccred->next = NULL;
+ ccred->algorithm = type;
+ } else { /* modify existing entry */
+ gnutls_free(ccred->credentials);
+ ccred->credentials = cred;
+ }
+ }
+
+ return 0;
}
/**
@@ -141,16 +146,18 @@ int gnutls_credentials_set( gnutls_session session, gnutls_credentials_type type
* Eg. for CERTIFICATE ciphersuites (key exchange algorithms: KX_RSA, KX_DHE_RSA),
* the same function are to be used to access the authentication data.
**/
-gnutls_credentials_type gnutls_auth_get_type( gnutls_session session)
+gnutls_credentials_type gnutls_auth_get_type(gnutls_session session)
{
/* This is not the credentials we must set, but the authentication data
* we get by the peer, so it should be reversed.
*/
-int server = session->security_parameters.entity==GNUTLS_SERVER?0:1;
+ int server =
+ session->security_parameters.entity == GNUTLS_SERVER ? 0 : 1;
- return _gnutls_map_kx_get_cred(
- _gnutls_cipher_suite_get_kx_algo(
- &session->security_parameters.current_cipher_suite), server);
+ return
+ _gnutls_map_kx_get_cred(_gnutls_cipher_suite_get_kx_algo
+ (&session->security_parameters.
+ current_cipher_suite), server);
}
/**
@@ -162,11 +169,12 @@ int server = session->security_parameters.entity==GNUTLS_SERVER?0:1;
* to access authentication data.
*
**/
-gnutls_credentials_type gnutls_auth_server_get_type( gnutls_session session)
+gnutls_credentials_type gnutls_auth_server_get_type(gnutls_session session)
{
- return _gnutls_map_kx_get_cred(
- _gnutls_cipher_suite_get_kx_algo(
- &session->security_parameters.current_cipher_suite), 1);
+ return
+ _gnutls_map_kx_get_cred(_gnutls_cipher_suite_get_kx_algo
+ (&session->security_parameters.
+ current_cipher_suite), 1);
}
/**
@@ -178,11 +186,12 @@ gnutls_credentials_type gnutls_auth_server_get_type( gnutls_session session)
* to access authentication data.
*
**/
-gnutls_credentials_type gnutls_auth_client_get_type( gnutls_session session)
+gnutls_credentials_type gnutls_auth_client_get_type(gnutls_session session)
{
- return _gnutls_map_kx_get_cred(
- _gnutls_cipher_suite_get_kx_algo(
- &session->security_parameters.current_cipher_suite), 0);
+ return
+ _gnutls_map_kx_get_cred(_gnutls_cipher_suite_get_kx_algo
+ (&session->security_parameters.
+ current_cipher_suite), 0);
}
@@ -190,35 +199,43 @@ gnutls_credentials_type gnutls_auth_client_get_type( gnutls_session session)
* This returns a pointer to the linked list. Don't
* free that!!!
*/
-const void *_gnutls_get_kx_cred( gnutls_session session, gnutls_kx_algorithm algo, int *err)
+const void *_gnutls_get_kx_cred(gnutls_session session,
+ gnutls_kx_algorithm algo, int *err)
{
-int server = session->security_parameters.entity==GNUTLS_SERVER?1:0;
+ int server =
+ session->security_parameters.entity == GNUTLS_SERVER ? 1 : 0;
- return _gnutls_get_cred( session->key, _gnutls_map_kx_get_cred(algo, server), err);
+ return _gnutls_get_cred(session->key,
+ _gnutls_map_kx_get_cred(algo, server), err);
}
-const void *_gnutls_get_cred( gnutls_key_st key, gnutls_credentials_type type, int *err) {
- const void *retval = NULL;
- int _err = -1;
- auth_cred_st * ccred;
+const void *_gnutls_get_cred(gnutls_key_st key,
+ gnutls_credentials_type type, int *err)
+{
+ const void *retval = NULL;
+ int _err = -1;
+ auth_cred_st *ccred;
- if (key == NULL) goto out;
+ if (key == NULL)
+ goto out;
- ccred = key->cred;
- while(ccred!=NULL) {
- if (ccred->algorithm==type) {
- break;
- }
- ccred = ccred->next;
+ ccred = key->cred;
+ while (ccred != NULL) {
+ if (ccred->algorithm == type) {
+ break;
}
- if (ccred==NULL) goto out;
+ ccred = ccred->next;
+ }
+ if (ccred == NULL)
+ goto out;
- _err = 0;
- retval = ccred->credentials;
+ _err = 0;
+ retval = ccred->credentials;
- out:
- if (err!=NULL) *err=_err;
- return retval;
+ out:
+ if (err != NULL)
+ *err = _err;
+ return retval;
}
/*-
@@ -234,8 +251,9 @@ const void *_gnutls_get_cred( gnutls_key_st key, gnutls_credentials_type type, i
* In case of GNUTLS_CRD_CERTIFICATE returns a type of &cert_auth_info_t;
* In case of GNUTLS_CRD_SRP returns a type of &srp_(server/client)_auth_info_t;
-*/
-void* _gnutls_get_auth_info( gnutls_session session) {
- return session->key->auth_info;
+void *_gnutls_get_auth_info(gnutls_session session)
+{
+ return session->key->auth_info;
}
/*-
@@ -246,43 +264,44 @@ void* _gnutls_get_auth_info( gnutls_session session) {
* null. It must be called since some structures contain malloced
* elements.
-*/
-void _gnutls_free_auth_info( gnutls_session session) {
- if (session==NULL || session->key==NULL) {
- gnutls_assert();
- return;
- }
-
- switch ( session->key->auth_info_type) {
- case GNUTLS_CRD_SRP:
- case GNUTLS_CRD_ANON:
-
- break;
- case GNUTLS_CRD_CERTIFICATE: {
- unsigned int i;
- cert_auth_info_t info =
- _gnutls_get_auth_info(session);
-
- if (info==NULL) break;
- for (i=0;i<info->ncerts;i++) {
- _gnutls_free_datum( &info->raw_certificate_list[i]);
- }
-
- gnutls_free( info->raw_certificate_list);
- info->raw_certificate_list = NULL;
- info->ncerts = 0;
- }
+void _gnutls_free_auth_info(gnutls_session session)
+{
+ if (session == NULL || session->key == NULL) {
+ gnutls_assert();
+ return;
+ }
+
+ switch (session->key->auth_info_type) {
+ case GNUTLS_CRD_SRP:
+ case GNUTLS_CRD_ANON:
+ break;
+ case GNUTLS_CRD_CERTIFICATE:{
+ unsigned int i;
+ cert_auth_info_t info = _gnutls_get_auth_info(session);
+ if (info == NULL)
break;
- default:
- return;
+ for (i = 0; i < info->ncerts; i++) {
+ _gnutls_free_datum(&info->raw_certificate_list[i]);
+ }
+ gnutls_free(info->raw_certificate_list);
+ info->raw_certificate_list = NULL;
+ info->ncerts = 0;
}
- gnutls_free( session->key->auth_info);
- session->key->auth_info = NULL;
- session->key->auth_info_size = 0;
- session->key->auth_info_type = 0;
+
+ break;
+ default:
+ return;
+
+ }
+
+ gnutls_free(session->key->auth_info);
+ session->key->auth_info = NULL;
+ session->key->auth_info_size = 0;
+ session->key->auth_info_type = 0;
}
@@ -291,65 +310,69 @@ void _gnutls_free_auth_info( gnutls_session session) {
* If allow change is !=0 then this will allow changing the auth
* info structure to a different type.
*/
-int _gnutls_auth_info_set( gnutls_session session,
- gnutls_credentials_type type, int size, int allow_change)
+int _gnutls_auth_info_set(gnutls_session session,
+ gnutls_credentials_type type, int size,
+ int allow_change)
{
- if ( session->key->auth_info == NULL) {
- session->key->auth_info = gnutls_calloc( 1, size);
+ if (session->key->auth_info == NULL) {
+ session->key->auth_info = gnutls_calloc(1, size);
+ if (session->key->auth_info == NULL) {
+ gnutls_assert();
+ return GNUTLS_E_MEMORY_ERROR;
+ }
+ session->key->auth_info_type = type;
+ session->key->auth_info_size = size;
+ } else {
+ if (allow_change == 0) {
+ /* If the credentials for the current authentication scheme,
+ * are not the one we want to set, then it's an error.
+ * This may happen if a rehandshake is performed an the
+ * ciphersuite which is negotiated has different authentication
+ * schema.
+ */
+ if (gnutls_auth_get_type(session) !=
+ session->key->auth_info_type) {
+ gnutls_assert();
+ return GNUTLS_E_INVALID_REQUEST;
+ }
+ } else {
+ /* The new behaviour: Here we reallocate the auth info structure
+ * in order to be able to negotiate different authentication
+ * types. Ie. perform an auth_anon and then authenticate again using a
+ * certificate (in order to prevent revealing the certificate's contents,
+ * to passive eavesdropers.
+ */
+ if (gnutls_auth_get_type(session) !=
+ session->key->auth_info_type) {
+ session->key->auth_info =
+ gnutls_realloc_fast(session->key->auth_info, size);
if (session->key->auth_info == NULL) {
- gnutls_assert();
- return GNUTLS_E_MEMORY_ERROR;
+ gnutls_assert();
+ return GNUTLS_E_MEMORY_ERROR;
}
+ memset(session->key->auth_info, 0, size);
session->key->auth_info_type = type;
session->key->auth_info_size = size;
- } else {
- if (allow_change==0) {
- /* If the credentials for the current authentication scheme,
- * are not the one we want to set, then it's an error.
- * This may happen if a rehandshake is performed an the
- * ciphersuite which is negotiated has different authentication
- * schema.
- */
- if ( gnutls_auth_get_type( session) != session->key->auth_info_type) {
- gnutls_assert();
- return GNUTLS_E_INVALID_REQUEST;
- }
- } else {
- /* The new behaviour: Here we reallocate the auth info structure
- * in order to be able to negotiate different authentication
- * types. Ie. perform an auth_anon and then authenticate again using a
- * certificate (in order to prevent revealing the certificate's contents,
- * to passive eavesdropers.
- */
- if ( gnutls_auth_get_type( session) != session->key->auth_info_type) {
- session->key->auth_info = gnutls_realloc_fast(
- session->key->auth_info, size);
- if (session->key->auth_info == NULL) {
- gnutls_assert();
- return GNUTLS_E_MEMORY_ERROR;
- }
- memset( session->key->auth_info, 0, size);
- session->key->auth_info_type = type;
- session->key->auth_info_size = size;
- }
- }
+ }
}
- return 0;
+ }
+ return 0;
}
/* this function will copy an mpi_t key to
* opaque data.
*/
-int _gnutls_generate_session_key(gnutls_key_st key) {
-size_t tmp;
+int _gnutls_generate_session_key(gnutls_key_st key)
+{
+ size_t tmp;
- _gnutls_mpi_print( NULL, &tmp, key->KEY);
- key->key.data = gnutls_secure_malloc( tmp);
- if ( key->key.data==NULL) {
- return GNUTLS_E_MEMORY_ERROR;
- }
- _gnutls_mpi_print( key->key.data, &tmp, key->KEY);
-
- key->key.size = tmp;
- return 0;
+ _gnutls_mpi_print(NULL, &tmp, key->KEY);
+ key->key.data = gnutls_secure_malloc(tmp);
+ if (key->key.data == NULL) {
+ return GNUTLS_E_MEMORY_ERROR;
+ }
+ _gnutls_mpi_print(key->key.data, &tmp, key->KEY);
+
+ key->key.size = tmp;
+ return 0;
}