not use that except for disabling algorithms that were not
specified.
-int gnutls_set_kx_cred( GNUTLS_STATE state, int kx, void* cred);
+int gnutls_set_kx_cred( GNUTLS_STATE state, int kx, void* cred, int cred_size);
Sets the needed credentials for the specified (in kx) authentication
algorithm. Eg username, password - or public and private keys etc.
The (void* cred) parameter is a structure that depends on the
specified kx algorithm and on the current state (client or server).
+ cred_size is the size of the structure.
In GNUTLS_KX_ANON cred should be NULL.
char *username;
char *password;
SRP_CLIENT_CREDENTIALS *cred =
- _gnutls_get_kx_cred(key, GNUTLS_KX_SRP);
+ _gnutls_get_kx_cred(key, GNUTLS_KX_SRP, NULL);
if (cred == NULL)
return GNUTLS_E_INSUFICIENT_CRED;
char *username;
char *password;
SRP_CLIENT_CREDENTIALS *cred =
- _gnutls_get_kx_cred(key, GNUTLS_KX_SRP);
+ _gnutls_get_kx_cred(key, GNUTLS_KX_SRP, NULL);
if (cred == NULL)
return GNUTLS_E_INSUFICIENT_CRED;
int i;
GNUTLS_SRP_PWD_ENTRY * entry = gnutls_malloc(sizeof(GNUTLS_SRP_PWD_ENTRY));
- cred = _gnutls_get_kx_cred( key, GNUTLS_KX_SRP);
+ cred = _gnutls_get_kx_cred( key, GNUTLS_KX_SRP, NULL);
+ if (cred==NULL) {
+ gnutls_assert();
+ gnutls_free(entry);
+ return NULL;
+ }
fd = fopen( cred->password_file, "r");
if (fd==NULL) {
int _gnutls_srp_send_params( GNUTLS_STATE state, opaque** data) {
/* this function sends the client extension data (username) */
if (state->security_parameters.entity == GNUTLS_CLIENT) {
- SRP_CLIENT_CREDENTIALS* cred = _gnutls_get_kx_cred( state->gnutls_key, GNUTLS_KX_SRP);
+ SRP_CLIENT_CREDENTIALS* cred = _gnutls_get_kx_cred( state->gnutls_key, GNUTLS_KX_SRP, NULL);
(*data) = NULL;
ccred = state->gnutls_key->cred;
while(ccred!=NULL) {
ncred = ccred->next;
+ if (ccred->credentials!=NULL) gnutls_free(ccred->credentials);
if (ccred!=NULL) gnutls_free(ccred);
ccred = ncred;
}
* This creates a linked list of the form:
* { algorithm, credentials, pointer to next }
*/
-int gnutls_set_kx_cred( GNUTLS_STATE state, int kx, void* cred) {
+int gnutls_set_kx_cred( GNUTLS_STATE state, int kx, void* cred, int cred_size) {
AUTH_CRED * ccred, *pcred;
int exists=0;
state->gnutls_key->cred = gnutls_malloc(sizeof(AUTH_CRED));
if (state->gnutls_key->cred == NULL) return GNUTLS_E_MEMORY_ERROR;
- state->gnutls_key->cred->credentials = cred;
+ /* copy credentials localy */
+ state->gnutls_key->cred->credentials = gnutls_malloc(cred_size);
+ memcpy( state->gnutls_key->cred->credentials, cred, cred_size);
+
state->gnutls_key->cred->next = NULL;
state->gnutls_key->cred->algorithm = kx;
} else {
if (pcred->next == NULL) return GNUTLS_E_MEMORY_ERROR;
ccred = pcred->next;
- ccred->credentials = cred;
+
+ /* copy credentials localy */
+ ccred->credentials = gnutls_malloc(cred_size);
+ memcpy( ccred->credentials, cred, cred_size);
+
ccred->next = NULL;
ccred->algorithm = kx;
} else { /* modify existing entry */
- ccred->credentials = cred;
+ gnutls_free(ccred->credentials);
+ ccred->credentials = gnutls_malloc(cred_size);
+ memcpy( ccred->credentials, cred, cred_size);
}
}
* This returns an pointer to the linked list. Don't
* free that!!!
*/
-void *_gnutls_get_kx_cred( GNUTLS_KEY key, int kx) {
+void *_gnutls_get_kx_cred( GNUTLS_KEY key, int kx, int *err) {
AUTH_CRED * ccred;
ccred = key->cred;
}
ccred = ccred->next;
}
- if (ccred==NULL) return NULL;
+ if (ccred==NULL) {
+ if (err!=NULL) *err=-1;
+ return NULL;
+ }
+ if (err!=NULL) *err=0;
return ccred->credentials;
}
int gnutls_clear_creds( GNUTLS_STATE state);
-int gnutls_set_kx_cred( GNUTLS_STATE state, int kx, void* cred);
-void *_gnutls_get_kx_cred( GNUTLS_KEY key, int kx);
+int gnutls_set_kx_cred( GNUTLS_STATE state, int kx, void* cred, int cred_size);
+void *_gnutls_get_kx_cred( GNUTLS_KEY key, int kx, int* err);
time_t cur_time;
char* rand;
int len = datalen;
+ int err;
if (state->security_parameters.entity == GNUTLS_CLIENT) {
if (datalen < 38) {
/* check if the credentials (username, public key etc. are ok - actually check if they exist)
*/
- if ( _gnutls_get_kx_cred( state->gnutls_key, _gnutls_cipher_suite_get_kx_algo( state->gnutls_internals.current_cipher_suite)) == NULL) {
+ if ( _gnutls_get_kx_cred( state->gnutls_key, _gnutls_cipher_suite_get_kx_algo( state->gnutls_internals.current_cipher_suite), &err) == NULL && err!=0) {
gnutls_assert();
return GNUTLS_E_INSUFICIENT_CRED;
}
/* check if the credentials (username, public key etc. are ok)
*/
- if ( _gnutls_get_kx_cred( state->gnutls_key, _gnutls_cipher_suite_get_kx_algo( state->gnutls_internals.current_cipher_suite)) == NULL) {
+ if ( _gnutls_get_kx_cred( state->gnutls_key, _gnutls_cipher_suite_get_kx_algo( state->gnutls_internals.current_cipher_suite), &err) == NULL && err!=0) {
gnutls_assert();
return GNUTLS_E_INSUFICIENT_CRED;
}